diff -Nru gmic-2.4.5/cmake/FindCImg.cmake gmic-2.9.2/cmake/FindCImg.cmake --- gmic-2.4.5/cmake/FindCImg.cmake 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/cmake/FindCImg.cmake 2020-09-03 11:37:02.000000000 +0000 @@ -0,0 +1,175 @@ +set(HEADER_URL "https://github.com/dtschump/CImg/raw/master/CImg.h") +set(HEADER_DIR ${CMAKE_SOURCE_DIR}/src) +set(HEADER_NAME CImg.h) +set(HEADER_PATH ${HEADER_DIR}/${HEADER_NAME}) + +# CImg.h header +if(NOT EXISTS ${HEADER_PATH}) + file(DOWNLOAD ${HEADER_URL} ${HEADER_PATH} STATUS download_status) + + list(GET download_status 0 status_code) + if(NOT ${status_code} EQUAL 0) + message(FATAL_ERROR "Missing ${HEADER_NAME} and unable to obtain it. Please download it from ${HEADER_URL} and save it to src/ directory.") + endif() +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(CImg + REQUIRED_VARS HEADER_PATH +) + +# Build options +option(ENABLE_CURL "Add support for curl" ON) +option(ENABLE_X "Add support for X11" ON) +option(ENABLE_XSHM "Add support for X11 Xshm extension" OFF) +option(ENABLE_FFMPEG "Add support for FFMpeg" ON) +option(ENABLE_FFTW "Add support for FFTW" ON) +option(ENABLE_GRAPHICSMAGICK "Add support for GrahicsMagick" ON) +option(ENABLE_JPEG "Add support for handling images in Jpeg format" ON) +option(ENABLE_OPENCV "Add support for OpenCV" ON) +option(ENABLE_OPENEXR "Add support for handling images in EXR format" ON) +option(ENABLE_OPENMP "Add support for parallel processing" ON) +option(ENABLE_PNG "Add support for handling images in PNG format" ON) +option(ENABLE_TIFF "Add support for handling images in Tiff format" ON) +option(ENABLE_ZLIB "Add support for data compression via Zlib" ON) + +set(COMPILE_FLAGS) +set(LINK_FLAGS) +set(CLI_COMPILE_FLAGS) +set(EXTRA_LIBRARY_TARGETS) + +## Add dependencies + +# OpenMP support +if(ENABLE_OPENMP) + find_package(OpenMP) + if(OpenMP_FOUND) + list(APPEND COMPILE_FLAGS "cimg_use_openmp") + list(APPEND EXTRA_LIBRARY_TARGETS OpenMP::OpenMP_CXX) + endif() +endif() + +# Zlib support +if(ENABLE_ZLIB) + find_package(ZLIB) + + if(ZLIB_FOUND) + list(APPEND COMPILE_FLAGS "cimg_use_zlib") + list(APPEND EXTRA_LIBRARY_TARGETS ZLIB::ZLIB) + endif() +endif() + +# Curl support +if(ENABLE_CURL) + find_package(CURL) + + if(CURL_FOUND) + list(APPEND COMPILE_FLAGS "cimg_use_curl") + list(APPEND EXTRA_LIBRARY_TARGETS CURL::libcurl) + endif() +endif() + +# X11 support +if(ENABLE_X) + find_package(X11) + + if(X11_FOUND) + list(APPEND COMPILE_FLAGS "cimg_display=1" "cimg_appname=\"gmic\"") + list(APPEND EXTRA_LIBRARY_TARGETS X11::X11) + else() + list(APPEND COMPILE_FLAGS "cimg_display=0" "cimg_appname=\"gmic\"") + endif() + + if(ENABLE_XSHM AND X11_XShm_FOUND) + list(APPEND COMPILE_FLAGS "cimg_use_xshm") + list(APPEND EXTRA_LIBRARY_TARGETS X11::Xext) + endif() +endif() + +if(ENABLE_FFTW) + find_package(Fftw) + + if(Fftw_FOUND) + list(APPEND COMPILE_FLAGS "cimg_use_fftw3") + list(APPEND EXTRA_LIBRARY_TARGETS Fftw::Fftw) + + if(TARGET Fftw::Threads) + list(APPEND EXTRA_LIBRARY_TARGETS Fftw::Threads) + else() + list(APPEND COMPILE_FLAGS "cimg_use_fftw3_singlethread") + endif() + endif() +endif() + +if(ENABLE_OPENCV) + find_package(OpenCV) + + if(OPENCV_FOUND) + list(APPEND CLI_COMPILE_FLAGS "cimg_use_opencv") + list(APPEND EXTRA_LIBRARY_TARGETS OpenCV::OpenCV) + endif() +endif() + +if(ENABLE_GRAPHICSMAGICK) + find_package(GraphicsMagick) + + if(GraphicsMagick_FOUND) + list(APPEND CLI_COMPILE_FLAGS "cimg_use_magick") + list(APPEND EXTRA_LIBRARY_TARGETS GraphicsMagick::GraphicsMagick++) + endif() +endif() + +if(ENABLE_TIFF) + find_package(TIFF) + + if(TIFF_FOUND) + list(APPEND CLI_COMPILE_FLAGS "cimg_use_tiff") + list(APPEND EXTRA_LIBRARY_TARGETS TIFF::TIFF) + endif() +endif() + +if(ENABLE_PNG) + find_package(PNG) + + if(PNG_FOUND) + list(APPEND CLI_COMPILE_FLAGS "cimg_use_png") + list(APPEND EXTRA_LIBRARY_TARGETS PNG::PNG) + endif() +endif() + +if(ENABLE_JPEG) + find_package(JPEG) + + if(JPEG_FOUND) + list(APPEND CLI_COMPILE_FLAGS "cimg_use_jpeg") + list(APPEND EXTRA_LIBRARY_TARGETS JPEG::JPEG) + endif() +endif() + +if(ENABLE_OPENEXR) + find_package(OpenEXR) + + if(OpenEXR_FOUND) + list(APPEND CLI_COMPILE_FLAGS "cimg_use_openexr") + list(APPEND EXTRA_LIBRARY_TARGETS OpenEXR::OpenEXR) + endif() +endif() + +if(MINGW) + list(APPEND COMPILE_FLAGS "-Wl,--stack,16777216") +endif() + +find_package(Threads) +if(Threads_FOUND) + list(APPEND EXTRA_LIBRARY_TARGETS Threads::Threads) +endif() + + +# Library definition + +add_library(CImg::CImg INTERFACE IMPORTED) + +target_compile_definitions(CImg::CImg INTERFACE ${COMPILE_FLAGS} ${CLI_COMPILE_FLAGS}) +target_link_options(CImg::CImg INTERFACE ${LINK_FLAGS}) +target_link_libraries(CImg::CImg INTERFACE ${EXTRA_LIBRARY_TARGETS}) +target_include_directories(CImg::CImg INTERFACE ${HEADER_DIR}) diff -Nru gmic-2.4.5/cmake/FindFftw.cmake gmic-2.9.2/cmake/FindFftw.cmake --- gmic-2.4.5/cmake/FindFftw.cmake 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/cmake/FindFftw.cmake 2020-09-03 11:37:02.000000000 +0000 @@ -0,0 +1,22 @@ +find_package(PkgConfig) + +pkg_check_modules(FFTW3 fftw3>=3.0) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Fftw + REQUIRED_VARS FFTW3_LIBRARIES +) + +add_library(Fftw::Fftw INTERFACE IMPORTED) +set_target_properties(Fftw::Fftw PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${FFTW3_INCLUDE_DIRS}" + INTERFACE_LINK_LIBRARIES "${FFTW3_LIBRARIES}" +) + +find_library(FFTW3_THREADS_LIB fftw3_threads PATHS ${FFTW3_LIBRARY_DIRS}) +if(NOT FFTW3_THREADS_LIB STREQUAL "FFTW3_THREADS_LIB-NOTFOUND") + add_library(Fftw::Threads INTERFACE IMPORTED) + set_target_properties(Fftw::Threads PROPERTIES + INTERFACE_LINK_LIBRARIES "-lfftw3_threads" + ) +endif() diff -Nru gmic-2.4.5/cmake/FindGMicStdlib.cmake gmic-2.9.2/cmake/FindGMicStdlib.cmake --- gmic-2.4.5/cmake/FindGMicStdlib.cmake 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/cmake/FindGMicStdlib.cmake 2020-09-03 11:37:02.000000000 +0000 @@ -0,0 +1,25 @@ +set(HEADER_URL "https://gmic.eu/gmic_stdlib.h") +set(HEADER_DIR ${CMAKE_SOURCE_DIR}/src) +set(HEADER_NAME gmic_stdlib.h) +set(HEADER_PATH ${HEADER_DIR}/${HEADER_NAME}) + +# gmic_stdlib.h header +if(NOT EXISTS ${HEADER_PATH}) + file(DOWNLOAD ${HEADER_URL} ${HEADER_PATH} STATUS download_status) + + list(GET download_status 0 status_code) + if(NOT ${status_code} EQUAL 0) + message(FATAL_ERROR "Missing ${HEADER_NAME} and unable to obtain it. Please download it from ${HEADER_URL} and save it to src/ directory.") + endif() +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(GMicStdlib + REQUIRED_VARS HEADER_PATH +) + +add_library(GMicStdlib::Stdlib INTERFACE IMPORTED) + +set_target_properties(GMicStdlib::Stdlib PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${HEADER_DIR}" +) diff -Nru gmic-2.4.5/cmake/FindGraphicsMagick.cmake gmic-2.9.2/cmake/FindGraphicsMagick.cmake --- gmic-2.4.5/cmake/FindGraphicsMagick.cmake 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/cmake/FindGraphicsMagick.cmake 2020-09-03 11:37:02.000000000 +0000 @@ -0,0 +1,14 @@ +find_package(PkgConfig) + +pkg_check_modules(GRAPHICSMAGICK GraphicsMagick++) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(GraphicsMagick + REQUIRED_VARS GRAPHICSMAGICK_LIBRARIES +) + +add_library(GraphicsMagick::GraphicsMagick++ INTERFACE IMPORTED) +set_target_properties(GraphicsMagick::GraphicsMagick++ PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${GRAPHICSMAGICK_INCLUDE_DIRS}" + INTERFACE_LINK_LIBRARIES "${GRAPHICSMAGICK_LIBRARIES}" +) diff -Nru gmic-2.4.5/cmake/FindOpenCV.cmake gmic-2.9.2/cmake/FindOpenCV.cmake --- gmic-2.4.5/cmake/FindOpenCV.cmake 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/cmake/FindOpenCV.cmake 2020-09-03 11:37:02.000000000 +0000 @@ -0,0 +1,28 @@ +# The CMake modules shipped with OpenCV do not contain targets. +find_package(PkgConfig) + +pkg_check_modules(OPENCV opencv4) + +if(NOT OPENCV_FOUND) + pkg_check_modules(OPENCV opencv) +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(OpenCV + REQUIRED_VARS OPENCV_LIBRARIES +) + +# OpenCV 4 can contain broken path in .pc file so we need to filter it. +# https://github.com/opencv/opencv/pull/17377 +set(OPENCV_VALID_INCLUDE_DIRS) +foreach(dir ${OPENCV_INCLUDE_DIRS}) + if(EXISTS ${dir}) + list(APPEND OPENCV_VALID_INCLUDE_DIRS ${dir}) + endif() +endforeach() + +add_library(OpenCV::OpenCV INTERFACE IMPORTED) +set_target_properties(OpenCV::OpenCV PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${OPENCV_VALID_INCLUDE_DIRS}" + INTERFACE_LINK_LIBRARIES "${OPENCV_LIBRARIES}" +) diff -Nru gmic-2.4.5/cmake/FindOpenEXR.cmake gmic-2.9.2/cmake/FindOpenEXR.cmake --- gmic-2.4.5/cmake/FindOpenEXR.cmake 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/cmake/FindOpenEXR.cmake 2020-09-03 11:37:02.000000000 +0000 @@ -0,0 +1,14 @@ +find_package(PkgConfig) + +pkg_check_modules(OPENEXR OpenEXR) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(OpenEXR + REQUIRED_VARS OPENEXR_LIBRARIES +) + +add_library(OpenEXR::OpenEXR INTERFACE IMPORTED) +set_target_properties(OpenEXR::OpenEXR PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${OPENEXR_INCLUDE_DIRS}" + INTERFACE_LINK_LIBRARIES "${OPENEXR_LIBRARIES}" +) diff -Nru gmic-2.4.5/CMakeLists.txt gmic-2.9.2/CMakeLists.txt --- gmic-2.4.5/CMakeLists.txt 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/CMakeLists.txt 2020-09-03 11:37:02.000000000 +0000 @@ -20,17 +20,17 @@ # # CeCILL-C # The CeCILL-C license is close to the GNU LGPL. -# ( http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html ) +# ( http://cecill.info/licences/Licence_CeCILL-C_V1-en.html ) # # or CeCILL v2.1 # The CeCILL license is compatible with the GNU GPL. -# ( http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html ) +# ( http://cecill.info/licences/Licence_CeCILL_V2.1-en.html ) # # This software is governed either by the CeCILL or the CeCILL-C license # under French law and abiding by the rules of distribution of free software. # You can use, modify and or redistribute the software under the terms of # the CeCILL or CeCILL-C licenses as circulated by CEA, CNRS and INRIA -# at the following URL: "http://www.cecill.info". +# at the following URL: "http://cecill.info". # # As a counterpart to the access to the source code and rights to copy, # modify and redistribute granted by the license, users are provided only @@ -53,8 +53,7 @@ # knowledge of the CeCILL and CeCILL-C licenses and that you accept its terms. # -cmake_minimum_required(VERSION 3.9) -cmake_policy(SET CMP0046 OLD) +cmake_minimum_required(VERSION 3.14.0) if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) message("Build directory is equal to source directory. Binaries will be put in the src directory.") @@ -71,37 +70,30 @@ project(gmic CXX C) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + find_package(PkgConfig) include(FeatureSummary) include(GNUInstallDirs) +find_package(CImg REQUIRED) +find_package(GMicStdlib REQUIRED) + # options controlling the build process option(BUILD_LIB "Build the GMIC shared library" ON) option(BUILD_LIB_STATIC "Build the GMIC static library" ON) option(BUILD_CLI "Build the CLI interface" ON) -option(BUILD_PLUGIN "Build the GIMP plug-in" OFF) option(BUILD_MAN "Build the manpage" ON) option(BUILD_BASH_COMPLETION "Build Bash completion" ON) option(CUSTOM_CFLAGS "Override default compiler optimization flags" OFF) -option(ENABLE_X "Add support for X11" ON) -option(ENABLE_FFMPEG "Add support for FFMpeg" ON) -option(ENABLE_FFTW "Add support for FFTW" ON) -option(ENABLE_GRAPHICSMAGICK "Add support for GrahicsMagick" ON) -option(ENABLE_JPEG "Add support for handling images in Jpeg format" ON) -option(ENABLE_OPENCV "Add support for OpenCV" ON) -option(ENABLE_OPENEXR "Add support for handling images in EXR format" ON) -option(ENABLE_OPENMP "Add support for parallel processing" ON) -option(ENABLE_PNG "Add support for handling images in PNG format" ON) -option(ENABLE_TIFF "Add support for handling images in Tiff format" ON) -option(ENABLE_ZLIB "Add support for data compression via Zlib" ON) option(ENABLE_DYNAMIC_LINKING "Dynamically link the binaries to the GMIC shared library" OFF) +option(ENABLE_LTO "Enable -flto (Link Time Optimizer) on gcc and clang" OFF) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release) endif() # compile flags -set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/modules) set(CMAKE_POSITION_INDEPENDENT_CODE True) set(COMPILE_FLAGS "-Dgmic_build -Dcimg_use_vt100 -Dgmic_is_parallel -Dcimg_use_abort") @@ -115,119 +107,18 @@ set(COMPILE_FLAGS "${COMPILE_FLAGS} -Dgmic_prerelease=\"${PRERELEASE_TAG}\"") endif() -set(EXTRA_LIBRARIES) -set(CLI_COMPILE_FLAGS) - -# OpenMP support -if(ENABLE_OPENMP) - if(NOT APPLE) - set(COMPILE_FLAGS "${COMPILE_FLAGS} -fopenmp -Dcimg_use_openmp") - list(APPEND EXTRA_LIBRARIES "-lgomp") - endif() -endif() - -# Zlib support -if(ENABLE_ZLIB) - find_package(ZLIB) -endif() -if(ZLIB_FOUND) - set(COMPILE_FLAGS "${COMPILE_FLAGS} -Dcimg_use_zlib") - include_directories(${ZLIB_INCLUDE_DIRS}) - link_directories(${ZLIB_LIBRARY_DIRS}) -endif() - -#X11 support -if(ENABLE_X) - find_package(X11) -endif() -if(X11_FOUND) - set(COMPILE_FLAGS "${COMPILE_FLAGS} -Dcimg_display=1 -Dcimg_appname=\\\"gmic\\\"") - include_directories(${X11_INCLUDE_DIR}) - include_directories(${X11_INCLUDE_DIRS}) - link_directories(${X11_LIBRARY_DIR}) - link_directories(${X11_LIBRARY_DIRS}) -else() - set(COMPILE_FLAGS "${COMPILE_FLAGS} -Dcimg_display=0 -Dcimg_appname=\\\"gmic\\\"") -endif() -message( "X11_INCLUDE_DIR: " ${X11_INCLUDE_DIR} ) -message( "X11_INCLUDE_DIRs: " ${X11_INCLUDE_DIRs} ) -message( "X11_LIBRARY_DIR: " ${X11_LIBRARY_DIR} ) -message( "X11_LIBRARY_DIRS: " ${X11_LIBRARY_DIRS} ) -if(X11_XShm_FOUND) - set(COMPILE_FLAGS "${COMPILE_FLAGS} -Dcimg_use_xshm") -endif() - -if(ENABLE_FFTW) - pkg_check_modules(FFTW3 fftw3>=3.0) -endif() -if(FFTW3_FOUND) - set(COMPILE_FLAGS "${COMPILE_FLAGS} -Dcimg_use_fftw3") - include_directories(${FFTW3_INCLUDE_DIRS}) - link_directories(${FFTW3_LIBRARY_DIRS}) - - find_library(FFTW3_THREADS_LIB fftw3_threads PATHS ${FFTW3_LIBRARY_DIRS}) - if(FFTW3_THREADS_LIB STREQUAL "FFTW3_THREADS_LIB-NOTFOUND") - set(COMPILE_FLAGS "${COMPILE_FLAGS} -Dcimg_use_fftw3_singlethread") +if (ENABLE_LTO) + # https://stackoverflow.com/a/47370726/160386 + include(CheckIPOSupported) + check_ipo_supported(RESULT supported OUTPUT error) + if(supported) + message(STATUS "IPO / LTO enabled") + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) else() - list(APPEND EXTRA_LIBRARIES "-lfftw3_threads") + message(STATUS "IPO / LTO not supported: <${error}>") endif() endif() -if(ENABLE_OPENCV) - pkg_check_modules(OPENCV opencv) -endif() -if(OPENCV_FOUND) - set(CLI_COMPILE_FLAGS "${CLI_COMPILE_FLAGS} -Dcimg_use_opencv") - include_directories(${OPENCV_INCLUDE_DIRS}) - link_directories(${OPENCV_LIBRARY_DIRS}) -endif() - -if(ENABLE_GRAPHICSMAGICK) - pkg_check_modules(GRAPHICSMAGICK GraphicsMagick++) -endif() -if(GRAPHICSMAGICK_FOUND) - set(CLI_COMPILE_FLAGS "${CLI_COMPILE_FLAGS} -Dcimg_use_magick") - include_directories(${GRAPHICSMAGICK_INCLUDE_DIRS}) - link_directories(${GRAPHICSMAGICK_LIBRARY_DIRS}) -endif() - -if(ENABLE_TIFF) - find_package(TIFF) -endif() -if(TIFF_FOUND) - set(CLI_COMPILE_FLAGS "${CLI_COMPILE_FLAGS} -Dcimg_use_tiff") - include_directories(${TIFF_INCLUDE_DIRS}) - link_directories(${TIFF_LIBRARY_DIRS}) -endif() - -if(ENABLE_PNG) - find_package(PNG) -endif() -if(PNG_FOUND) - set(CLI_COMPILE_FLAGS "${CLI_COMPILE_FLAGS} -Dcimg_use_png") - include_directories(${PNG_INCLUDE_DIRS}) - link_directories(${PNG_LIBRARY_DIRS}) -endif() - -if(ENABLE_JPEG) - find_package(JPEG) -endif() -if(JPEG_FOUND) - set(CLI_COMPILE_FLAGS "${CLI_COMPILE_FLAGS} -Dcimg_use_jpeg") - include_directories(${JPEG_INCLUDE_DIRS}) - link_directories(${JPEG_LIBRARY_DIRS}) -endif() - -if(ENABLE_OPENEXR) - pkg_check_modules(OPENEXR OpenEXR) -endif() -if(OPENEXR_FOUND) - set(CLI_COMPILE_FLAGS "${CLI_COMPILE_FLAGS} -Dcimg_use_openexr") - include_directories(${OPENEXR_INCLUDE_DIRS}) - link_directories(${OPENEXR_LIBRARY_DIRS}) -endif() - - if(ENABLE_DYNAMIC_LINKING) if(NOT BUILD_LIB) message(FATAL_ERROR "ENABLE_DYNAMIC_LINKING needs BUILD_LIB") @@ -235,20 +126,6 @@ set(CMAKE_SKIP_RPATH TRUE) endif() -# CImg.h header -if(NOT EXISTS ${CMAKE_SOURCE_DIR}/src/CImg.h) - file(DOWNLOAD https://framagit.org/dtschump/CImg/raw/master/CImg.h ${CMAKE_SOURCE_DIR}/src/CImg.h) - execute_process(COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_SOURCE_DIR}/src/CImg.h) -endif() - -# gmic_stdlib.h header -if(NOT EXISTS ${CMAKE_SOURCE_DIR}/src/gmic_stdlib.h) - file(DOWNLOAD https://gmic.eu/gmic_stdlib.h ${CMAKE_SOURCE_DIR}/src/gmic_stdlib.h) - execute_process(COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_SOURCE_DIR}/src/gmic_stdlib.h) -endif() - -add_custom_target(gmic_extra_headers DEPENDS src/CImg.h src/gmic_stdlib.h) - set(CMAKE_CXX_FLAGS_DEBUG "-g -ansi -Wall -Wextra -pedantic -Dcimg_verbosity=3 ${COMPILE_FLAGS}") set(CMAKE_CXX_FLAGS_RELEASE "${COMPILE_FLAGS}") set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-g ${COMPILE_FLAGS}") @@ -260,36 +137,19 @@ endif() # source files -set(CLI_Includes src/gmic.h) set(CLI_Sources src/gmic.cpp) -if(MINGW) - list(APPEND EXTRA_LIBRARIES "-Wl,--stack,16777216") -else() - list(APPEND EXTRA_LIBRARIES "-lpthread") -endif() - - if(BUILD_LIB) - add_library(libgmic SHARED ${CLI_Includes} ${CLI_Sources}) - add_dependencies(libgmic gmic_extra_headers) - set_target_properties(libgmic PROPERTIES COMPILE_FLAGS "${CLI_COMPILE_FLAGS}") + add_library(libgmic SHARED ${CLI_Sources}) set_target_properties(libgmic PROPERTIES SOVERSION "1" OUTPUT_NAME "gmic") - if(NOT APPLE) - #the following is automatic unless NO_SONAME is set - #set_target_properties(libgmic PROPERTIES LINK_FLAGS "-Wl,-soname,libgmic.so.1") - endif() target_link_libraries(libgmic - ${X11_LIBRARIES} - ${TIFF_LIBRARIES} - ${PNG_LIBRARIES} - ${JPEG_LIBRARIES} - ${GRAPHICSMAGICK_LIBRARIES} - ${OPENEXR_LIBRARIES} - ${OPENCV_LIBRARIES} - ${ZLIB_LIBRARIES} - ${FFTW3_LIBRARIES} - ${EXTRA_LIBRARIES} + CImg::CImg + GMicStdlib::Stdlib + ) + target_include_directories(libgmic + PUBLIC + $ + $ ) install(TARGETS libgmic EXPORT GmicTargets @@ -303,21 +163,16 @@ if(BUILD_LIB_STATIC) - add_library(libgmicstatic STATIC ${CLI_Includes} ${CLI_Sources}) - add_dependencies(libgmicstatic gmic_extra_headers) - set_target_properties(libgmicstatic PROPERTIES COMPILE_FLAGS "${CLI_COMPILE_FLAGS}") + add_library(libgmicstatic STATIC ${CLI_Sources}) set_target_properties(libgmicstatic PROPERTIES OUTPUT_NAME "gmic") target_link_libraries(libgmicstatic - ${X11_LIBRARIES} - ${TIFF_LIBRARIES} - ${PNG_LIBRARIES} - ${JPEG_LIBRARIES} - ${GRAPHICSMAGICK_LIBRARIES} - ${OPENEXR_LIBRARIES} - ${OPENCV_LIBRARIES} - ${ZLIB_LIBRARIES} - ${FFTW3_LIBRARIES} - ${EXTRA_LIBRARIES} + CImg::CImg + GMicStdlib::Stdlib + ) + target_include_directories(libgmicstatic + PUBLIC + $ + $ ) install(TARGETS libgmicstatic EXPORT GmicTargets ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}") @@ -326,31 +181,13 @@ if(BUILD_CLI) + add_executable(gmic src/gmic_cli.cpp) if(ENABLE_DYNAMIC_LINKING) - add_executable(gmic ${CLI_Includes} src/gmic_cli.cpp) - add_dependencies(gmic gmic_extra_headers) - add_dependencies(gmic libgmic) - target_link_libraries(gmic - "libgmic" - ) + target_link_libraries(gmic libgmic) else() - add_executable(gmic ${CLI_Includes} ${CLI_Sources} src/gmic_cli.cpp) - add_dependencies(gmic gmic_extra_headers) - target_link_libraries(gmic - ${X11_LIBRARIES} - ${TIFF_LIBRARIES} - ${PNG_LIBRARIES} - ${JPEG_LIBRARIES} - ${GRAPHICSMAGICK_LIBRARIES} - ${OPENEXR_LIBRARIES} - ${OPENCV_LIBRARIES} - ${ZLIB_LIBRARIES} - ${FFTW3_LIBRARIES} - ${EXTRA_LIBRARIES} - ) + target_link_libraries(gmic libgmicstatic) endif() - set_target_properties(gmic PROPERTIES COMPILE_FLAGS "${CLI_COMPILE_FLAGS}") install(TARGETS gmic RUNTIME DESTINATION bin LIBRARY DESTINATION lib) endif() @@ -359,7 +196,7 @@ add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/man/gmic.1 DEPENDS gmic - COMMAND LD_LIBRARY_PATH=${GMIC_BINARIES_PATH} ${GMIC_BINARIES_PATH}/gmic -v - ${CMAKE_SOURCE_DIR}/src/gmic_stdlib.gmic raw:${CMAKE_SOURCE_DIR}/src/gmic_stdlib.gmic,uchar -__help man 2> ${CMAKE_BINARY_DIR}/man/gmic.1 + COMMAND LD_LIBRARY_PATH=${GMIC_BINARIES_PATH} ${GMIC_BINARIES_PATH}/gmic -v - ${CMAKE_SOURCE_DIR}/src/gmic_stdlib.gmic raw:${CMAKE_SOURCE_DIR}/src/gmic_stdlib.gmic,uchar -__help man > ${CMAKE_BINARY_DIR}/man/gmic.1 ) add_custom_target(man ALL DEPENDS ${CMAKE_BINARY_DIR}/man/gmic.1) install(FILES ${CMAKE_BINARY_DIR}/man/gmic.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1/) @@ -370,9 +207,13 @@ add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/resources/gmic_bashcompletion.sh DEPENDS gmic - COMMAND LD_LIBRARY_PATH=${GMIC_BINARIES_PATH} ${GMIC_BINARIES_PATH}/gmic -v - ${CMAKE_SOURCE_DIR}/src/gmic_stdlib.gmic raw:${CMAKE_SOURCE_DIR}/src/gmic_stdlib.gmic,uchar -document_gmic bash 2> ${CMAKE_BINARY_DIR}/resources/gmic_bashcompletion.sh + COMMAND LD_LIBRARY_PATH=${GMIC_BINARIES_PATH} ${GMIC_BINARIES_PATH}/gmic -v - ${CMAKE_SOURCE_DIR}/src/gmic_stdlib.gmic raw:${CMAKE_SOURCE_DIR}/src/gmic_stdlib.gmic,uchar -document_gmic bash > ${CMAKE_BINARY_DIR}/resources/gmic_bashcompletion.sh ) add_custom_target(bashcompletion ALL DEPENDS ${CMAKE_BINARY_DIR}/resources/gmic_bashcompletion.sh) + install(FILES ${CMAKE_BINARY_DIR}/resources/gmic_bashcompletion.sh + DESTINATION ${CMAKE_INSTALL_DATADIR}/bash-completion/completions + RENAME gmic + ) endif() include(CMakePackageConfigHelpers) diff -Nru gmic-2.4.5/COPYING gmic-2.9.2/COPYING --- gmic-2.4.5/COPYING 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/COPYING 2020-09-03 11:37:02.000000000 +0000 @@ -73,7 +73,7 @@ the economic rights decides to submit the use thereof to its provisions. Frequently asked questions can be found on the official website of the -CeCILL licenses family (http://www.cecill.info/index.en.html) for any +CeCILL licenses family (http://cecill.info/index.en.html) for any necessary clarification. diff -Nru gmic-2.4.5/debian/changelog gmic-2.9.2/debian/changelog --- gmic-2.4.5/debian/changelog 2020-10-05 17:51:16.000000000 +0000 +++ gmic-2.9.2/debian/changelog 2020-11-02 10:44:15.000000000 +0000 @@ -1,29 +1,46 @@ -gmic (2.4.5-1.1build2) groovy; urgency=medium +gmic (1:2.9.2-0groovy1) groovy; urgency=medium - * Rebuild against new libopenexr25. + * Upstream release + * Zart should be re-enabled - -- Gianfranco Costamagna Mon, 05 Oct 2020 19:51:16 +0200 + -- Thorsten Stettin Mon, 02 Nov 2020 11:45:00 +0100 -gmic (2.4.5-1.1build1) groovy; urgency=medium +gmic (1:2.9.2-0focal1) focal; urgency=medium - * No change rebuild against new ilmbase ABI. + * Upstream release + * Zart should be re-enabled - -- Dimitri John Ledkov Thu, 27 Aug 2020 23:39:30 +0100 + -- pandajim (key for lives deb) Thu, 14 Feb 2020 17:45:37 +0100 -gmic (2.4.5-1.1) unstable; urgency=low +gmic (1:2.8.0+om~pre1-0ubu19.10.1.5~ppa) eoan; urgency=high - [ Ying-Chun Liu (PaulLiu) ] - * Non-maintainer upload. + * Development release - [ Peter Michael Green ] - * Make package build with opencv 4 (Closes: #922582) - + Bump libopencv-dev build-dependency as I am not attempting to retain - compatibility with older opencv versions, someone who knows the - buildsystem better can do that if they wish. - + Change pkg-config file for opencv from "opencv" to "opencv4". - + Change/add a bunch of #include statements. + -- Thorsten Stettin Sun, 10 Nov 2019 06:48:37 +0100 - -- Ying-Chun Liu (PaulLiu) Tue, 12 Nov 2019 07:25:35 +0000 +gmic (1:2.7.5+om-ubu19.10.1.1~ppa) eoan; urgency=high + + * Upstream release + + -- Thorsten Stettin Mon, 28 Oct 2019 11:08:37 +0100 + +gmic (1:2.7.4+om-ubu19.04.1.1~ppa) disco; urgency=high + + * Upstream release + + -- Thorsten Stettin Thu, 24 Oct 2019 15:30:37 +0200 + +gmic (1:2.7.2+om-ubu19.10.1.3~ppa) eoan; urgency=high + + * Upstream release + + -- Thorsten Stettin Thu, 24 Oct 2019 15:20:37 +0200 + +gmic (2.6.1+om-ubu18.04.1~ppa) bionic; urgency=high + + * Upstream release + + -- Otto Meier Tue, 30 Apr 2019 12:05:37 +0200 gmic (2.4.5-1) unstable; urgency=medium diff -Nru gmic-2.4.5/debian/control gmic-2.9.2/debian/control --- gmic-2.4.5/debian/control 2020-08-27 22:39:30.000000000 +0000 +++ gmic-2.9.2/debian/control 2020-02-14 16:45:37.000000000 +0000 @@ -1,13 +1,14 @@ Source: gmic Section: graphics Priority: optional -Maintainer: Ubuntu Developers +Maintainer: Thorsten Stettin XSBC-Original-Maintainer: Bernd Zeimetz Build-Depends: debhelper (>= 11), dpkg-dev (>= 1.16.0), libgimp2.0-dev (>= 2.4), libx11-dev, libxrandr-dev, libfftw3-dev | fftw3-dev, - libopencv-dev (>=4), + libopencv-dev, + libopencv-core-dev, libopenexr-dev, qt5-qmake, qtbase5-dev, @@ -18,7 +19,7 @@ libcurl4-openssl-dev, libgraphicsmagick++1-dev, bash-completion, - cmake (>= 3.12~) + cmake (>= 3.9) Standards-Version: 3.9.4 Homepage: http://gmic.sourceforge.net/ Vcs-Git: https://salsa.debian.org/debian/gmic.git @@ -49,7 +50,7 @@ providing several different user interfaces to convert/manipulate/filter/visualize generic image datasets, from 1d scalar signals to 3d+t sequences of multi-spectral volumetric images. - . + . This package contains ZArt, a program whose purpose is to demonstrate the possibilities of the G'MIC image processing language by offering the choice of several manipulations on a video stream acquired from a diff -Nru gmic-2.4.5/debian/control.bla gmic-2.9.2/debian/control.bla --- gmic-2.4.5/debian/control.bla 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/debian/control.bla 2020-02-13 21:36:02.000000000 +0000 @@ -0,0 +1,111 @@ +Source: gmic +Section: graphics +Priority: optional +Maintainer: Thorsten Stettin +XSBC-Original-Maintainer: Bernd Zeimetz +Build-Depends: debhelper (>= 11), + dpkg-dev (>= 1.16.0), + libgimp2.0-dev (>= 2.4), + libx11-dev, libxrandr-dev, libfftw3-dev | fftw3-dev, + libopencv-dev, + libopenexr-dev, + qt5-qmake, + qtbase5-dev, + qttools5-dev-tools, + qttools5-dev, + qtbase5-dev-tools, + libilmbase-dev, + libcurl4-openssl-dev, + libgraphicsmagick++1-dev, + bash-completion, + cmake (>= 3.9) +Standards-Version: 3.9.4 +Homepage: http://gmic.sourceforge.net/ +Vcs-Git: https://salsa.debian.org/debian/gmic.git +Vcs-Browser: https://salsa.debian.org/debian/gmic + +Package: gmic +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, libgmic1 (= ${binary:Version}) +Suggests: gimp-gmic, gmic-zart +Multi-Arch: foreign +Description: GREYC's Magic for Image Computing + G'MIC is an open and full-featured framework for image processing, + providing several different user interfaces to + convert/manipulate/filter/visualize generic image datasets, from 1d + scalar signals to 3d+t sequences of multi-spectral volumetric images. + . + This package contains the stand-alone gmic binary. + +#Package: gmic-zart +#Architecture: any +#Depends: ${shlibs:Depends}, ${misc:Depends}, libgmic1 (= ${binary:Version}) +#Suggests: gmic +#Replaces: gmic (<< 1.5.1.6+dfsg-3~) +#Breaks: gmic (<< 1.5.1.6+dfsg-3~) +#Multi-Arch: foreign +#Description: GREYC's Magic for Image Computing - ZArt +# G'MIC is an open and full-featured framework for image processing, +# providing several different user interfaces to +# convert/manipulate/filter/visualize generic image datasets, from 1d +# scalar signals to 3d+t sequences of multi-spectral volumetric images. + . +# This package contains ZArt, a program whose purpose is to demonstrate +# the possibilities of the G'MIC image processing language by offering +# the choice of several manipulations on a video stream acquired from a +# webcam. In other words, ZArt is a GUI for G'MIC real-time manipulations +# on the output of a webcam. + +Package: gimp-gmic +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, gimp (>= 2.6), libgmic1 (= ${binary:Version}) +Suggests: gmic +Enhances: gimp +Multi-Arch: foreign +Description: GREYC's Magic for Image Computing - GIMP Plugin + G'MIC is an open and full-featured framework for image processing, + providing several different user interfaces to + convert/manipulate/filter/visualize generic image datasets, from 1d + scalar signals to 3d+t sequences of multi-spectral volumetric images. + . + This package contains the GIMP plugin. + +Package: krita-gmic +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends}, libgmic1 (= ${binary:Version}) +Suggests: krita +Enhances: krita +Multi-Arch: foreign +Description: GREYC's Magic for Image Computing - Helper Tool for Krita + G'MIC is an open and full-featured framework for image processing, + providing several different user interfaces to + convert/manipulate/filter/visualize generic image datasets, from 1d + scalar signals to 3d+t sequences of multi-spectral volumetric images. + . + This package contains the helper tool for the QMic plugin of Krita. + +Package: libgmic1 +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Pre-Depends: ${misc:Pre-Depends} +Multi-Arch: same +Section: libs +Description: GREYC's Magic for Image Computing - shared library + G'MIC is an open and full-featured framework for image processing, + providing several different user interfaces to + convert/manipulate/filter/visualize generic image datasets, from 1d + scalar signals to 3d+t sequences of multi-spectral volumetric images. + . + This package contains the shared library. + +Package: libgmic-dev +Architecture: any +Section: libdevel +Depends: ${misc:Depends}, libgmic1 (= ${binary:Version}) +Description: GREYC's Magic for Image Computing - development files + G'MIC is an open and full-featured framework for image processing, + providing several different user interfaces to + convert/manipulate/filter/visualize generic image datasets, from 1d + scalar signals to 3d+t sequences of multi-spectral volumetric images. + . + This package contains the development files for libgmic. diff -Nru gmic-2.4.5/debian/.gitlab-ci.yml gmic-2.9.2/debian/.gitlab-ci.yml --- gmic-2.4.5/debian/.gitlab-ci.yml 2019-11-12 07:25:35.000000000 +0000 +++ gmic-2.9.2/debian/.gitlab-ci.yml 2020-02-13 21:36:02.000000000 +0000 @@ -1,6 +1,11 @@ -include: - - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml - - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml +image: registry.salsa.debian.org/salsa-ci-team/ci-image-git-buildpackage:latest -variables: - RELEASE: 'unstable' +pages: + stage: deploy + artifacts: + paths: + - public + script: + - gitlab-ci-git-buildpackage + - gitlab-ci-lintian + - gitlab-ci-aptly diff -Nru gmic-2.4.5/debian/patches/drop_zart.patch gmic-2.9.2/debian/patches/drop_zart.patch --- gmic-2.4.5/debian/patches/drop_zart.patch 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/debian/patches/drop_zart.patch 2020-02-13 21:36:02.000000000 +0000 @@ -0,0 +1,37 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gmic (1:2.7.5+om-ubu18.04.1.3~ppa) bionic; urgency=high + . + * Upstream release + * drop gmic-zart due to build errors +Author: Thorsten Stettin + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-10-28 + +--- gmic-2.7.5+om.orig/src/Makefile ++++ gmic-2.7.5+om/src/Makefile +@@ -332,7 +332,7 @@ else + endif + endif + @echo "**" +- $(MAKE) cli lib gimp krita gmic_qt libc zart ++ $(MAKE) cli lib gimp krita gmic_qt libc + + native: + $(MAKE) "CFLAGS+=$(GMIC_CLI_CFLAGS) -Ofast -march=native" "LIBS+=$(GMIC_CLI_LIBS)" cli diff -Nru gmic-2.4.5/debian/patches/gmic-qt-CMakeLists.txt.patch gmic-2.9.2/debian/patches/gmic-qt-CMakeLists.txt.patch --- gmic-2.4.5/debian/patches/gmic-qt-CMakeLists.txt.patch 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/debian/patches/gmic-qt-CMakeLists.txt.patch 2020-02-13 21:36:02.000000000 +0000 @@ -0,0 +1,56 @@ +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gmic (2.7.0+om-ubu19.04.1~ppa) disco; urgency=high + . + * Upstream release +Author: Otto Meier + +--- +The information above should follow the Patch Tagging Guidelines, please +checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here +are templates for supplementary fields that you might want to add: + +Origin: , +Bug: +Bug-Debian: https://bugs.debian.org/ +Bug-Ubuntu: https://launchpad.net/bugs/ +Forwarded: +Reviewed-By: +Last-Update: 2019-08-27 + +--- gmic-2.7.0+om.orig/gmic-qt/CMakeLists.txt ++++ gmic-2.7.0+om/gmic-qt/CMakeLists.txt +@@ -231,6 +231,10 @@ if (WIN32) + ) + endif() + ++if (NOT WIN32) ++ set(gmic_qt_LIBRARIES ${gmic_qt_LIBRARIES} fftw3_threads) ++endif() ++ + if (NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Release") + endif() +@@ -278,7 +282,7 @@ set (gmic_qt_SRCS + src/FilterParameters/ChoiceParameter.h + src/FilterParameters/ColorParameter.h + src/FilterParameters/ConstParameter.h +- src/FilterParameters/CustomDoubleSpinbox.h ++ src/FilterParameters/CustomDoubleSpinBox.h + src/FilterParameters/FileParameter.h + src/FilterParameters/FilterParametersWidget.h + src/FilterParameters/FloatParameter.h +@@ -350,7 +354,7 @@ set (gmic_qt_SRCS + src/FilterParameters/ChoiceParameter.cpp + src/FilterParameters/ColorParameter.cpp + src/FilterParameters/ConstParameter.cpp +- src/FilterParameters/CustomDoubleSpinbox.cpp ++ src/FilterParameters/CustomDoubleSpinBox.cpp + src/FilterParameters/FileParameter.cpp + src/FilterParameters/FilterParametersWidget.cpp + src/FilterParameters/FloatParameter.cpp diff -Nru gmic-2.4.5/debian/patches/opencv4.patch gmic-2.9.2/debian/patches/opencv4.patch --- gmic-2.4.5/debian/patches/opencv4.patch 2019-11-12 07:25:35.000000000 +0000 +++ gmic-2.9.2/debian/patches/opencv4.patch 2020-02-14 07:13:21.000000000 +0000 @@ -1,10 +1,14 @@ -Description: Attempt at opencv 4 support. - + Bump libopencv-dev build-dependency as I am not attempting to retain - compatibility with older opencv versions, someone who knows the - buildsystem better can do that if they wish. - + Change pkg-config file for opencv from "opencv" to "opencv4". - + Change/add a bunch of #include statements -Author: Peter Michael Green +Description: + TODO: Put a short summary on the line above and replace this paragraph + with a longer explanation of this change. Complete the meta-information + with other relevant fields (see below for details). To make it easier, the + information below has been extracted from the changelog. Adjust it or drop + it. + . + gmic (1:2.8.4+om-0ubu18.04.1.5~ppa) bionic; urgency=high + . + * Upstream release +Author: Thorsten Stettin --- The information above should follow the Patch Tagging Guidelines, please @@ -17,161 +21,16 @@ Bug-Ubuntu: https://launchpad.net/bugs/ Forwarded: Reviewed-By: -Last-Update: 2019-11-12 +Last-Update: 2020-02-14 -Index: gmic-2.4.5/CMakeLists.txt -=================================================================== ---- gmic-2.4.5.orig/CMakeLists.txt -+++ gmic-2.4.5/CMakeLists.txt -@@ -174,7 +174,7 @@ if(FFTW3_FOUND) +--- gmic-2.8.4+om.orig/CMakeLists.txt ++++ gmic-2.8.4+om/CMakeLists.txt +@@ -184,7 +184,7 @@ if(FFTW3_FOUND) endif() if(ENABLE_OPENCV) - pkg_check_modules(OPENCV opencv) -+ pkg_check_modules(OPENCV opencv4) ++ pkg_check_modules(OPENCV opencv4>=4.2.0) endif() if(OPENCV_FOUND) set(CLI_COMPILE_FLAGS "${CLI_COMPILE_FLAGS} -Dcimg_use_opencv") -Index: gmic-2.4.5/src/Makefile -=================================================================== ---- gmic-2.4.5.orig/src/Makefile -+++ gmic-2.4.5/src/Makefile -@@ -283,8 +283,8 @@ CURL_LIBS = $(shell pkg-config --libs li - - # Enable native support of webcams and video streaming, using the OpenCV library. - # (https://opencv.org/) --OPENCV_CFLAGS = -Dcimg_use_opencv $(shell pkg-config opencv --cflags || echo -I/usr/include/opencv) -I/usr/include/opencv --OPENCV_LIBS = $(shell pkg-config opencv --libs || echo -lopencv_core -lopencv_highgui) -+OPENCV_CFLAGS = -Dcimg_use_opencv $(shell pkg-config opencv4 --cflags || echo -I/usr/include/opencv) -I/usr/include/opencv -+OPENCV_LIBS = $(shell pkg-config opencv4 --libs || echo -lopencv_core -lopencv_highgui) - - # Enable support of most classical image file formats, using the GraphicsMagick++ library. - # (http://www.graphicsmagick.org/Magick++/) -Index: gmic-2.4.5/zart/zart.pro -=================================================================== ---- gmic-2.4.5.orig/zart/zart.pro -+++ gmic-2.4.5/zart/zart.pro -@@ -19,7 +19,7 @@ greaterThan(QT_MAJOR_VERSION, 4): CONFIG - CONFIG += warn_on - QT_CONFIG -= no-pkg-config - CONFIG += link_pkgconfig --PKGCONFIG += opencv fftw3 zlib -+PKGCONFIG += opencv4 fftw3 zlib - # LIBS += -lfftw3_threads - DEFINES += cimg_use_fftw3 cimg_use_zlib - -Index: gmic-2.4.5/src/CImg.h -=================================================================== ---- gmic-2.4.5.orig/src/CImg.h -+++ gmic-2.4.5/src/CImg.h -@@ -410,8 +410,9 @@ - #define _cimg_redefine_False - #endif - #include --#include "cv.h" --#include "highgui.h" -+//#include "cv.h" -+//#include "highgui.h" -+#include "opencv2/videoio/videoio_c.h" - #endif - - // Configure LibPNG support. -Index: gmic-2.4.5/zart/include/ImageConverter.h -=================================================================== ---- gmic-2.4.5.orig/zart/include/ImageConverter.h -+++ gmic-2.4.5/zart/include/ImageConverter.h -@@ -50,7 +50,7 @@ - #include - #include - #else --#include -+#include - #endif - - #include -Index: gmic-2.4.5/zart/include/ImageSource.h -=================================================================== ---- gmic-2.4.5.orig/zart/include/ImageSource.h -+++ gmic-2.4.5/zart/include/ImageSource.h -@@ -49,10 +49,10 @@ - - #if defined(HAS_OPENCV2_HEADERS) || defined(OPENCV2_HEADERS) - #include --#include -+#include - #else --#include --#include -+#include -+#include - #endif - - #include -Index: gmic-2.4.5/zart/include/StillImageSource.h -=================================================================== ---- gmic-2.4.5.orig/zart/include/StillImageSource.h -+++ gmic-2.4.5/zart/include/StillImageSource.h -@@ -50,10 +50,10 @@ - - #if defined(HAS_OPENCV2_HEADERS) || defined(OPENCV2_HEADERS) - #include --#include -+#include - #else --#include --#include -+#include -+#include - #endif - #include - #include "ImageSource.h" -Index: gmic-2.4.5/zart/include/VideoFileSource.h -=================================================================== ---- gmic-2.4.5.orig/zart/include/VideoFileSource.h -+++ gmic-2.4.5/zart/include/VideoFileSource.h -@@ -49,10 +49,10 @@ - - #if defined(HAS_OPENCV2_HEADERS) || defined(OPENCV2_HEADERS) - #include --#include -+#include - #else --#include --#include -+#include -+#include - #endif - #include - #include "ImageSource.h" -Index: gmic-2.4.5/zart/include/WebcamSource.h -=================================================================== ---- gmic-2.4.5.orig/zart/include/WebcamSource.h -+++ gmic-2.4.5/zart/include/WebcamSource.h -@@ -50,10 +50,10 @@ - - #if defined(HAS_OPENCV2_HEADERS) || defined(OPENCV2_HEADERS) - #include --#include -+#include - #else --#include --#include -+#include -+#include - #endif - #include - #include -Index: gmic-2.4.5/zart/src/ImageConverter.cpp -=================================================================== ---- gmic-2.4.5.orig/zart/src/ImageConverter.cpp -+++ gmic-2.4.5/zart/src/ImageConverter.cpp -@@ -51,6 +51,9 @@ - #include - #include - #include "Common.h" -+#include -+#include -+ - IplImage * ImageConverter::_image = 0; - - void ImageConverter::convert(const IplImage * in, QImage * out) diff -Nru gmic-2.4.5/debian/patches/series gmic-2.9.2/debian/patches/series --- gmic-2.4.5/debian/patches/series 2019-11-12 07:25:35.000000000 +0000 +++ gmic-2.9.2/debian/patches/series 2020-02-14 09:29:50.000000000 +0000 @@ -1 +1,3 @@ -opencv4.patch +#gmic-qt-CMakeLists.txt.patch +#drop_zart.patch +#opencv4.patch diff -Nru gmic-2.4.5/debian/rules gmic-2.9.2/debian/rules --- gmic-2.4.5/debian/rules 2019-11-12 07:25:35.000000000 +0000 +++ gmic-2.9.2/debian/rules 2020-02-14 06:59:07.000000000 +0000 @@ -5,7 +5,7 @@ GMIC_QT_FLAGS = -DCMAKE_BUILD_TYPE=Release -DGMIC_PATH=../src -DENABLE_DYNAMIC_LINKING=ON -DGMIC_LIB_PATH=../build-gmic override_dh_auto_configure: - dh_auto_configure -Bbuild-gmic -- -DCMAKE_BUILD_TYPE=Release -DBUILD_LIB_STATIC=OFF -DENABLE_DYNAMIC_LINKING=ON + dh_auto_configure -Bbuild-gmic -- -DCMAKE_BUILD_TYPE=Release -DBUILD_LIB_STATIC=OFF -DENABLE_DYNAMIC_LINKING=ON -DBUILD_LIB_STATIC=OFF dh_auto_configure -Dgmic-qt -Bbuild-gmic-qt -- $(GMIC_QT_FLAGS) dh_auto_configure -Dgmic-qt -Bbuild-gmic-krita -- $(GMIC_QT_FLAGS) -DGMIC_QT_HOST=krita dh_auto_configure -Dzart -Bzart -- GMIC_PATH=../src GMIC_LIB_PATH=../build-gmic GMIC_DYNAMIC_LINKING=on @@ -19,13 +19,13 @@ override_dh_auto_install: dh_auto_install -Bbuild-gmic mkdir -p $(CURDIR)/debian/tmp/usr/bin - cp zart/zart $(CURDIR)/debian/tmp/usr/bin/zart + cp $(CURDIR)/zart/zart $(CURDIR)/debian/tmp/usr/bin/zart mkdir -p $(CURDIR)/debian/tmp/etc/bash_completion.d/ - cp resources/gmic_bashcompletion.sh $(CURDIR)/debian/tmp/etc/bash_completion.d/gmic - mkdir -p $(CURDIR)/debian/tmp/usr/lib/gimp/2.0/plug-ins - cp resources/gmic_film_cluts.gmz $(CURDIR)/debian/tmp/usr/lib/gimp/2.0/plug-ins - cp build-gmic-qt/gmic_gimp_qt $(CURDIR)/debian/tmp/usr/lib/gimp/2.0/plug-ins/gmic_gimp - cp build-gmic-krita/gmic_krita_qt $(CURDIR)/debian/tmp/usr/bin + cp $(CURDIR)/resources/gmic_bashcompletion.sh $(CURDIR)/debian/tmp/etc/bash_completion.d/gmic + mkdir -p $(CURDIR)/debian/tmp/usr/lib/gimp/2.0/plug-ins/gmic-gimp-qt + cp $(CURDIR)/build-gmic-qt/gmic_gimp_qt $(CURDIR)/debian/tmp/usr/lib/gimp/2.0/plug-ins/gmic-gimp-qt/gmic-gimp-qt + cp $(CURDIR)/resources/gmic_cluts.gmz $(CURDIR)/debian/tmp/usr/lib/gimp/2.0/plug-ins/gmic-gimp-qt + cp $(CURDIR)/build-gmic-krita/gmic_krita_qt $(CURDIR)/debian/tmp/usr/bin override_dh_auto_clean: dh_auto_clean -Bbuild-gmic diff -Nru gmic-2.4.5/gmic-qt/cmake/modules/FindFFTW3.cmake gmic-2.9.2/gmic-qt/cmake/modules/FindFFTW3.cmake --- gmic-2.4.5/gmic-qt/cmake/modules/FindFFTW3.cmake 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/cmake/modules/FindFFTW3.cmake 2020-09-03 11:37:05.000000000 +0000 @@ -1,59 +1,81 @@ - # - Try to find the Fftw3 Library +# - Try to find the Fftw3 Libraries +# # Once done this will define # -# FFTW3_FOUND - system has fftw3 +# FFTW3_FOUND - system has fftw3 # FFTW3_INCLUDE_DIRS - the fftw3 include directories -# FFTW3_LIBRARIES - the libraries needed to use fftw3 +# FFTW3_LIBRARIES - the libraries needed to use fftw3 +# # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # + if (NOT WIN32) -include(LibFindMacros) -libfind_pkg_check_modules(FFTW3_PKGCONF fftw3>=3.2) -find_path(FFTW3_INCLUDE_DIR - NAMES fftw3.h - HINTS ${FFTW3_PKGCONF_INCLUDE_DIRS} ${FFTW3_PKGCONF_INCLUDEDIR} - PATH_SUFFIXES fftw3 -) - -find_library(FFTW3_LIBRARY - NAMES fftw3 - HINTS ${FFTW3_PKGCONF_LIBRARY_DIRS} ${FFTW3_PKGCONF_LIBDIR} -) - -set(FFTW3_PROCESS_LIBS FFTW3_LIBRARY) -set(FFTW3_PROCESS_INCLUDES FFTW3_INCLUDE_DIR) -libfind_process(FFTW3) + include(LibFindMacros) + libfind_pkg_check_modules(FFTW3_PKGCONF fftw3>=3.2) -if(FFTW3_FOUND) - message(STATUS "FFTW Found Version: " ${FFTW_VERSION}) -endif() + find_path(FFTW3_INCLUDE_DIR + NAMES fftw3.h + HINTS ${FFTW3_PKGCONF_INCLUDE_DIRS} ${FFTW3_PKGCONF_INCLUDEDIR} + PATH_SUFFIXES fftw3 + ) + + find_library(FFTW3_LIBRARY_CORE + NAMES fftw3 + HINTS ${FFTW3_PKGCONF_LIBRARY_DIRS} ${FFTW3_PKGCONF_LIBDIR} + ) + + set(FFTW3_CORE_PROCESS_INCLUDES FFTW3_INCLUDE_DIR) + set(FFTW3_CORE_PROCESS_LIBS FFTW3_LIBRARY_CORE) + libfind_process(FFTW3_CORE) + + if(FFTW3_CORE_FOUND) + message(STATUS "FFTW core Found Libraries: " ${FFTW3_CORE_LIBRARIES}) + endif() + + find_library(FFTW3_LIBRARY_THREADS + NAMES fftw3_threads + HINTS ${FFTW3_PKGCONF_LIBRARY_DIRS} ${FFTW3_PKGCONF_LIBDIR} + ) + + set(FFTW3_THREADS_PROCESS_INCLUDES FFTW3_INCLUDE_DIR) + set(FFTW3_THREADS_PROCESS_LIBS FFTW3_LIBRARY_THREADS) + libfind_process(FFTW3_THREADS) + + if(FFTW3_THREADS_FOUND) + message(STATUS "FFTW threads Found Libraries: " ${FFTW3_THREADS_LIBRARIES}) + endif() + + if(FFTW3_CORE_FOUND AND FFTW3_THREADS_FOUND) + set(FFTW3_FOUND true) + set(FFTW3_LIBRARIES ${FFTW3_CORE_LIBRARIES} ${FFTW3_THREADS_LIBRARIES}) + endif() else() -# TODO: Maybe use fftw3/FFTW3Config.cmake? - -find_path(FFTW3_INCLUDE_DIR - NAMES fftw3.h -) - + # TODO: Maybe use fftw3/FFTW3Config.cmake? -find_library( - FFTW3_LIBRARY - NAMES libfftw3 libfftw3-3 libfftw3f-3 libfftw3l-3 - DOC "Libraries to link against for FFT Support") + find_path(FFTW3_INCLUDE_DIR + NAMES fftw3.h + ) + + find_library( + FFTW3_LIBRARY + NAMES libfftw3 libfftw3-3 libfftw3f-3 libfftw3l-3 + DOC "Libraries to link against for FFT Support") + + if (FFTW3_LIBRARY) + set(FFTW3_LIBRARY_DIR ${FFTW3_LIBRARY}) + endif() + + set (FFTW3_LIBRARIES ${FFTW3_LIBRARY}) + + if(FFTW3_INCLUDE_DIR AND FFTW3_LIBRARY_DIR) + set (FFTW3_FOUND true) + message(STATUS "Correctly found FFTW3") + else() + message(STATUS "Could not find FFTW3") + endif() -if (FFTW3_LIBRARY) - set(FFTW3_LIBRARY_DIR ${FFTW3_LIBRARY}) -endif() - -set (FFTW3_LIBRARIES ${FFTW3_LIBRARY}) - -if(FFTW3_INCLUDE_DIR AND FFTW3_LIBRARY_DIR) - set (FFTW3_FOUND true) - message(STATUS "Correctly found FFTW3") -else() - message(STATUS "Could not find FFTW3") -endif() endif() diff -Nru gmic-2.4.5/gmic-qt/CMakeLists.txt gmic-2.9.2/gmic-qt/CMakeLists.txt --- gmic-2.4.5/gmic-qt/CMakeLists.txt 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/CMakeLists.txt 2020-09-03 11:37:05.000000000 +0000 @@ -13,8 +13,15 @@ set(CMAKE_AUTOUIC OFF) set(CMAKE_AUTORCC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(EXTRA_LIBRARIES) -set (GMIC_QT_HOST "gimp" CACHE STRING "Define for which host qmic-qt will be built: gimp, krita or none.") +if (NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Release") +endif() + +message("Build type is " ${CMAKE_BUILD_TYPE}) + +set (GMIC_QT_HOST "gimp" CACHE STRING "Define for which host qmic-qt will be built: gimp, krita, none, paintdotnet, or digikam.") if (${GMIC_QT_HOST} STREQUAL "none") message("Building standalone version.") else() @@ -30,8 +37,24 @@ message("G'MIC path: " ${GMIC_PATH}) option(ENABLE_DYNAMIC_LINKING "Dynamically link the binaries to the GMIC shared library" OFF) +option(ENABLE_CURL "Add support for curl" ON) set (GMIC_LIB_PATH "${GMIC_PATH}" CACHE STRING "Define the path to the GMIC shared library") +option(ENABLE_ASAN "Enable -fsanitize=address (if debug build)" ON) +option(ENABLE_FFTW3 "Enable FFTW3 library support" ON) + +option(ENABLE_LTO "Enable -flto (Link Time Optimizer) on gcc and clang" ON) + +if (WIN32) + message("LTO is disabled (windows platform)") + set(ENABLE_LTO OFF) +endif() + +if (CMAKE_BUILD_TYPE STREQUAL "Debug") + set(ENABLE_LTO OFF) +endif() + + # # Look for G'MIC repository # @@ -84,14 +107,11 @@ endif() - - - option(PRERELEASE "Set to ON makes this a prelease build") if (${PRERELEASE}) string(TIMESTAMP PRERELEASE_DATE %y%m%d) message("Prelease date is " ${PRERELEASE_DATE}) - add_definitions(-Dgmic_prelease=${PRERELEASE_DATE}) + add_definitions(-Dgmic_prerelease="${PRERELEASE_DATE}") endif() option(DRMINGW "Set to ON enables the drmingw debugger.") @@ -100,7 +120,6 @@ endif() - # Required packages # @@ -143,16 +162,23 @@ # find_package(FFTW3 REQUIRED) add_definitions(-Dcimg_use_fftw3 ) -add_definitions(-Dcimg_use_fftw3_singlethread ) include_directories(${FFTW3_INCLUDE_DIR}) +find_library(FFTW3_THREADS_LIB fftw3_threads PATHS ${FFTW3_LIBRARY_DIRS}) +if(FFTW3_THREADS_LIB STREQUAL "FFTW3_THREADS_LIB-NOTFOUND") + add_definitions(-Dcimg_use_fftw3_singlethread) +else() + list(APPEND EXTRA_LIBRARIES ${FFTW3_LIBRARIES}) +endif() # # CURL # -find_package(CURL) -if (CURL_FOUND) - add_definitions(-Dcimg_use_curl) - include_directories(SYSTEM ${CURL_INCLUDE_DIRS} ) +if(ENABLE_CURL) + find_package(CURL) + if (CURL_FOUND) + add_definitions(-Dcimg_use_curl) + include_directories(SYSTEM ${CURL_INCLUDE_DIRS} ) + endif() endif() # @@ -167,11 +193,20 @@ if (CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.8.3 AND OPENMP_FOUND) message("G'Mic: using OpenMP") - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") add_definitions(-Dcimg_use_openmp) add_definitions(-fopenmp) endif() +# +# LTO option +# + +if (ENABLE_LTO AND (CMAKE_COMPILER_IS_GNUCC OR (CMAKE_CSS_COMPILER_IS STREQUAL "Clang"))) + message("Link Time Optimizer enabled") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -flto") +endif() # # add all defines @@ -185,13 +220,16 @@ ${PNG_LIBRARIES} ${FFTW3_LIBRARIES} ${ZLIB_LIBRARIES} + ${EXTRA_LIBRARIES} ) -if (CURL_FOUND) - set(gmic_qt_LIBRARIES - ${gmic_qt_LIBRARIES} - ${CURL_LIBRARIES} - ) +if(ENABLE_CURL) + if (CURL_FOUND) + set(gmic_qt_LIBRARIES + ${gmic_qt_LIBRARIES} + ${CURL_LIBRARIES} + ) + endif() endif() add_definitions(-Dgmic_build) @@ -231,26 +269,25 @@ ) endif() -if (NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "Release") -endif() - SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) SET(CMAKE_INSTALL_RPATH "$ORIGIN/") if (CMAKE_BUILD_TYPE STREQUAL "Debug") - message("Debug build") add_definitions(-D_GMIC_QT_DEBUG_) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address") + if(ENABLE_ASAN) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address") + endif(ENABLE_ASAN) elseif (CMAKE_BUILD_TYPE STREQUAL "Release") - message("Release build") add_definitions(-DQT_NO_DEBUG_OUTPUT) string(REPLACE "-O2" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") string(REPLACE "-O3" "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Ofast") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -s") + if (WIN32) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -mwindows") + endif() elseif (CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") - message("Release build with debug info") add_definitions(-DQT_NO_DEBUG_OUTPUT) string(REPLACE "-O2" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") string(REPLACE "-O3" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") @@ -274,6 +311,7 @@ src/FilterParameters/ChoiceParameter.h src/FilterParameters/ColorParameter.h src/FilterParameters/ConstParameter.h + src/FilterParameters/CustomDoubleSpinBox.h src/FilterParameters/FileParameter.h src/FilterParameters/FilterParametersWidget.h src/FilterParameters/FloatParameter.h @@ -311,7 +349,6 @@ src/Logger.h src/MainWindow.h src/ParametersCache.h - src/PreviewMode.h src/TimeLogger.h src/Updater.h src/Utils.h @@ -345,6 +382,7 @@ src/FilterParameters/ChoiceParameter.cpp src/FilterParameters/ColorParameter.cpp src/FilterParameters/ConstParameter.cpp + src/FilterParameters/CustomDoubleSpinBox.cpp src/FilterParameters/FileParameter.cpp src/FilterParameters/FilterParametersWidget.cpp src/FilterParameters/FloatParameter.cpp @@ -381,7 +419,6 @@ src/Logger.cpp src/MainWindow.cpp src/ParametersCache.cpp - src/PreviewMode.cpp src/TimeLogger.cpp src/Updater.cpp src/Utils.cpp @@ -459,7 +496,7 @@ ${gmic_translation_files} ) -install(FILES ${gmic_qt_QM} DESTINATION ${CMAKE_SOURCE_DIR}/translations) +# install(FILES ${gmic_qt_QM} DESTINATION ${CMAKE_SOURCE_DIR}/translations) set(gmic_qt_QRC gmic_qt.qrc @@ -470,10 +507,11 @@ execute_process(COMMAND gimptool-2.0 --libs-noui OUTPUT_VARIABLE GIMP2_LIBRARIES OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(COMMAND gimptool-2.0 --cflags-noui OUTPUT_VARIABLE GIMP2_INCLUDE_DIRS OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND pkg-config gimp-2.0 --define-variable=prefix=${CMAKE_INSTALL_PREFIX} --variable gimplibdir OUTPUT_VARIABLE GIMP2_PKGLIBDIR OUTPUT_STRIP_TRAILING_WHITESPACE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GIMP2_INCLUDE_DIRS}") set (gmic_qt_SRCS ${gmic_qt_SRCS} src/Host/Gimp/host_gimp.cpp) - add_definitions(-DGMIC_HOST=gimp_qt -DGIMP_DISABLE_DEPRECATED) + add_definitions(-DGMIC_HOST=gimp -DGIMP_DISABLE_DEPRECATED) add_executable(gmic_gimp_qt ${gmic_qt_SRCS} ${gmic_qt_QRC} ${qmic_qt_QM}) target_link_libraries( gmic_gimp_qt @@ -481,6 +519,7 @@ ${GIMP2_LIBRARIES} ${gmic_qt_LIBRARIES} ) + install(TARGETS gmic_gimp_qt RUNTIME DESTINATION "${GIMP2_PKGLIBDIR}/plug-ins") elseif (${GMIC_QT_HOST} STREQUAL "krita") @@ -492,6 +531,7 @@ PRIVATE ${gmic_qt_LIBRARIES} ) + install(TARGETS gmic_krita_qt RUNTIME DESTINATION bin) elseif (${GMIC_QT_HOST} STREQUAL "none") @@ -499,6 +539,7 @@ add_definitions(-DGMIC_HOST=standalone) add_executable(gmic_qt ${gmic_qt_SRCS} ${gmic_qt_QRC} ${qmic_qt_QM}) target_link_libraries(gmic_qt PRIVATE ${gmic_qt_LIBRARIES}) + install(TARGETS gmic_qt RUNTIME DESTINATION bin) elseif (${GMIC_QT_HOST} STREQUAL "paintdotnet") @@ -511,8 +552,77 @@ ${gmic_qt_LIBRARIES} ) +elseif (${GMIC_QT_HOST} STREQUAL "digikam") + + include(GNUInstallDirs) + + find_package(DigikamCore CONFIG REQUIRED) + + set_package_properties(DigikamCore PROPERTIES + URL "http://www.digikam.org" + DESCRIPTION "digiKam core library" + ) + + # --- Manage C++ exception rules ------- + + string(REPLACE " -DQT_NO_EXCEPTIONS " " " CMAKE_CXX_FLAGS " ${CMAKE_CXX_FLAGS} ") + string(REPLACE " -fno-exceptions " " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + string(STRIP "${CMAKE_CXX_FLAGS}" CMAKE_CXX_FLAGS) + + if (MSVC) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -EHsc") + elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel") + if (WIN32) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -EHsc") + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions") + endif() + elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions") + elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions") + endif() + + string(STRIP "${CMAKE_CXX_FLAGS}" ${CMAKE_CXX_FLAGS}) + + # --- + + include_directories($/digikam) + + set (gmic_qt_SRCS ${gmic_qt_SRCS} src/Host/digiKam/host_digikam.cpp src/Host/digiKam/gmicqttoolplugin.cpp) + add_definitions(-DGMIC_HOST=digikam) + add_library(Editor_GmicQt_Plugin + MODULE ${gmic_qt_SRCS} ${gmic_qt_QRC} ${qmic_qt_QM}) + + set_target_properties(Editor_GmicQt_Plugin PROPERTIES PREFIX "") + + target_link_libraries(Editor_GmicQt_Plugin + PRIVATE + ${gmic_qt_LIBRARIES} + Digikam::digikamcore) + + # --- Install rules --------------------------------- + + get_target_property(QT_QMAKE_EXECUTABLE ${Qt5Core_QMAKE_EXECUTABLE} IMPORTED_LOCATION) + + if(NOT QT_QMAKE_EXECUTABLE) + message(FATAL_ERROR "qmake is not found.") + endif() + + # execute the command "qmake -query QT_INSTALL_PLUGINS" to get the path of plugins dir. + execute_process(COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_PLUGINS + OUTPUT_VARIABLE QT_PLUGINS_DIR + OUTPUT_STRIP_TRAILING_WHITESPACE) + + if(NOT QT_PLUGINS_DIR) + message(FATAL_ERROR "Qt5 plugin directory cannot be detected.") + endif() + + install(TARGETS Editor_GmicQt_Plugin + DESTINATION ${QT_PLUGINS_DIR}/digikam/editor) + else() - message(FATAL_ERROR "GMIC_QT_HOST is not defined as gimp, krita, none or paintdotnet") + message(FATAL_ERROR "GMIC_QT_HOST is not defined as gimp, krita, none, paintdotnet, or digikam") endif() feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) diff -Nru gmic-2.4.5/gmic-qt/gmic_qt.desktop gmic-2.9.2/gmic-qt/gmic_qt.desktop --- gmic-2.4.5/gmic-qt/gmic_qt.desktop 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/gmic-qt/gmic_qt.desktop 2020-09-03 11:37:05.000000000 +0000 @@ -0,0 +1,12 @@ +[Desktop Entry] +Version=1.0 +Type=Application +Name=G'MIC-Qt +Terminal=false +Comment=Apply G'MIC filters to images +Comment[fr]=Appliquer des filtres G'MIC à des images +TryExec=gmic_qt +Exec=gmic_qt %F +Icon=gmic_qt +Categories=Graphics; +MimeType=image/jpeg;image/png;image/bmp;image/gif;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/svg; diff -Nru gmic-2.4.5/gmic-qt/gmic_qt.pro gmic-2.9.2/gmic-qt/gmic_qt.pro --- gmic-2.4.5/gmic-qt/gmic_qt.pro 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/gmic_qt.pro 2020-09-03 11:37:05.000000000 +0000 @@ -16,6 +16,9 @@ # Possible values are "gcc" or "clang" !defined(COMPILER,var) { COMPILER = gcc } +# Possible values are "on" or "off" +!defined(LTO,var) { LTO=on } + # # # @@ -32,6 +35,8 @@ !greaterThan(QT_MINOR_VERSION, 1):error("You need Qt 5.2 or greater to build this program.") } +DEFINES += QT_DEPRECATED_WARNINGS + # # Check that pkg-config is installed (qmake error messages are misleading, if not) # @@ -124,8 +129,6 @@ error("Version numbers of files 'gmic.h' (" $$GMIC_VERSION ") and 'CImg.h' (" $$CIMG_VERSION ") mismatch") } - - !isEmpty(PRERELEASE) { message( Prerelease date is $$PRERELEASE ) DEFINES += gmic_prerelease="\\\"$$PRERELEASE\\\"" @@ -217,6 +220,17 @@ QMAKE_LFLAGS_RELEASE += -fopenmp=libomp } +win32:equals(LTO,"on") { + message("Link Time Optimizer disabled (windows platform)") + LTO = off +} + +!win32:CONFIG(release, debug|release):gcc|clang:equals(LTO,"on") { + message("Link Time Optimizer enabled") + QMAKE_CXXFLAGS_RELEASE += -flto + QMAKE_LFLAGS_RELEASE += -flto +} + DEFINES += gmic_gui gmic_build gmic_is_parallel cimg_use_abort INCLUDEPATH += $$PWD $$PWD/src $$GMIC_PATH @@ -237,6 +251,7 @@ src/FilterParameters/ChoiceParameter.h \ src/FilterParameters/ColorParameter.h \ src/FilterParameters/ConstParameter.h \ + src/FilterParameters/CustomDoubleSpinBox.h \ src/FilterParameters/FileParameter.h \ src/FilterParameters/FilterParametersWidget.h \ src/FilterParameters/FloatParameter.h \ @@ -274,7 +289,6 @@ src/Logger.h \ src/MainWindow.h \ src/ParametersCache.h \ - src/PreviewMode.h \ src/TimeLogger.h \ src/Updater.h \ src/Utils.h \ @@ -310,6 +324,7 @@ src/FilterParameters/ChoiceParameter.cpp \ src/FilterParameters/ColorParameter.cpp \ src/FilterParameters/ConstParameter.cpp \ + src/FilterParameters/CustomDoubleSpinBox.cpp \ src/FilterParameters/FileParameter.cpp \ src/FilterParameters/FilterParametersWidget.cpp \ src/FilterParameters/FloatParameter.cpp \ @@ -346,7 +361,6 @@ src/Logger.cpp \ src/MainWindow.cpp \ src/ParametersCache.cpp \ - src/PreviewMode.cpp \ src/TimeLogger.cpp \ src/Updater.cpp \ src/Utils.cpp \ @@ -404,6 +418,7 @@ translations/pl.ts \ translations/pt.ts \ translations/ru.ts \ +translations/sv.ts \ translations/ua.ts \ translations/ja.ts \ translations/zh.ts \ @@ -411,7 +426,7 @@ # PRE_TARGETDEPS += -QMAKE_CXXFLAGS_RELEASE += -Ofast -s # -O3 -s +QMAKE_CXXFLAGS_RELEASE += -Ofast # -O3 -s QMAKE_LFLAGS_RELEASE += -s QMAKE_CXXFLAGS_DEBUG += -Dcimg_verbosity=3 @@ -425,8 +440,8 @@ CONFIG(debug, debug|release) { message(Debug build) DEFINES += _GMIC_QT_DEBUG_ - QMAKE_CXXFLAGS_DEBUG += -fsanitize=address - QMAKE_LFLAGS_DEBUG += -fsanitize=address +# QMAKE_CXXFLAGS_DEBUG += -fsanitize=address +# QMAKE_LFLAGS_DEBUG += -fsanitize=address } UI_DIR = .ui Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/gmic-qt/icons/application/16-gmic_qt.png and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/gmic-qt/icons/application/16-gmic_qt.png differ Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/gmic-qt/icons/application/32-gmic_qt.png and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/gmic-qt/icons/application/32-gmic_qt.png differ Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/gmic-qt/icons/application/48-gmic_qt.png and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/gmic-qt/icons/application/48-gmic_qt.png differ Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/gmic-qt/icons/application/64-gmic_qt.png and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/gmic-qt/icons/application/64-gmic_qt.png differ diff -Nru gmic-2.4.5/gmic-qt/icons/application/gmic_qt.svg gmic-2.9.2/gmic-qt/icons/application/gmic_qt.svg --- gmic-2.4.5/gmic-qt/icons/application/gmic_qt.svg 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/gmic-qt/icons/application/gmic_qt.svg 2020-09-03 11:37:05.000000000 +0000 @@ -0,0 +1,992 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + diff -Nru gmic-2.4.5/gmic-qt/README.md gmic-2.9.2/gmic-qt/README.md --- gmic-2.4.5/gmic-qt/README.md 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/README.md 2020-09-03 11:37:05.000000000 +0000 @@ -4,24 +4,27 @@ ### Purpose G'MIC-Qt is a versatile front-end to the image processing framework - [G'MIC](http://gmic.eu). It is in fact a plugin for - [GIMP](http://gimp.org) and [Krita](https://krita.org), as well as a standalone application. + [G'MIC](https://gmic.eu). It is in fact a plugin for + [GIMP](http://gimp.org), [Krita](https://krita.org), [Paint.NET](https://www.getpaint.net/), + and [digiKam](https://www.digikam.org) as well as a standalone application. ### Authors - * Sbastien Fourey - * David Tschumperl (G'MIC lib & original GTK-based plugin) + * Sébastien Fourey + * David Tschumperlé (G'MIC lib & original GTK-based plugin) -### Contributor +### Contributors * Boudewijn Rempt (Krita compatibility layer, work in progress) + * Nicholas Hayes (Paint.NET compatibility layer, work in progress) + * Gilles Caulier (digiKam compatibility layer) ### Translators * Jan Helebrant (Czech translation) * Frank Tegtmeyer (German translation) * chroma_ghost & bazza/pixls.us (Spanish translation) - * Sbastien Fourey (French translation) + * Sébastien Fourey (French translation) * Duddy Hadiwido (Indonesian translation) * Francesco Riosa (Italian translation) * iarga / pixls.us (Dutch translation) @@ -34,9 +37,9 @@ ### Official (pre-release) binary packages - * Available at [gmic.eu](http://gmic.eu) + * Available at [gmic.eu](https://gmic.eu) -### Tavis CI last build status +### Travis CI last build status * Master branch (Linux) [![Build Status](https://api.travis-ci.org/c-koi/gmic-qt.svg?branch=master)](https://travis-ci.org/c-koi/gmic-qt) * Devel branch (Linux) [![Build Status](https://api.travis-ci.org/c-koi/gmic-qt.svg?branch=devel)](https://travis-ci.org/c-koi/gmic-qt) @@ -58,6 +61,8 @@ make ``` +NOTE: digikam plugin do not support qmake, use Cmake instead. + #### CMake cmake works on all platforms. The first part is the same and requires make and wget to be available. If you don't have all dependencies, cmake will warn you which ones are missing. Note that the minimum cmake version is 3.1. @@ -77,6 +82,6 @@ ``` ```sh -cmake .. [-DGMIC_QT_HOST=none|gimp|krita|paintdotnet] [-DGMIC_PATH=/path/to/gmic] [-DCMAKE_BUILD_TYPE=[Debug|Release|RelwithDebInfo] +cmake .. [-DGMIC_QT_HOST=none|gimp|krita|paintdotnet|digikam] [-DGMIC_PATH=/path/to/gmic] [-DCMAKE_BUILD_TYPE=[Debug|Release|RelwithDebInfo] make ``` diff -Nru gmic-2.4.5/gmic-qt/src/ClickableLabel.h gmic-2.9.2/gmic-qt/src/ClickableLabel.h --- gmic-2.4.5/gmic-qt/src/ClickableLabel.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/ClickableLabel.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_CLICKABLELABEL_H -#define _GMIC_QT_CLICKABLELABEL_H +#ifndef GMIC_QT_CLICKABLELABEL_H +#define GMIC_QT_CLICKABLELABEL_H #include @@ -32,10 +32,10 @@ class ClickableLabel : public QLabel { Q_OBJECT public: - ClickableLabel(QWidget * parent = 0); + ClickableLabel(QWidget * parent = nullptr); void mousePressEvent(QMouseEvent * e); signals: void clicked(); }; -#endif // _GMIC_QT_CLICKABLELABEL_H +#endif // GMIC_QT_CLICKABLELABEL_H diff -Nru gmic-2.4.5/gmic-qt/src/Common.h gmic-2.9.2/gmic-qt/src/Common.h --- gmic-2.4.5/gmic-qt/src/Common.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Common.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_COMMON_H_ -#define _GMIC_QT_COMMON_H_ +#ifndef GMIC_QT_COMMON_H +#define GMIC_QT_COMMON_H #include #include "TimeLogger.h" @@ -32,7 +32,7 @@ #define ENTERING qWarning() << "[" << __PRETTY_FUNCTION__ << "] <>" #define LEAVING qWarning() << "[" << __PRETTY_FUNCTION__ << "] <>" #define TRACE qWarning() << "[" << __PRETTY_FUNCTION__ << "]" -#define TSHOW(V) qWarning() << "[" << __PRETTY_FUNCTION__ << "]" << #V << "=" << (V) +#define TSHOW(V) qWarning() << "[" << __PRETTY_FUNCTION__ << __LINE__ << "]" << #V << "=" << (V) #define SHOW(V) qWarning() << #V << "=" << (V) #else #define ENTERING while (false) @@ -58,4 +58,6 @@ std::cout << "" #endif -#endif // _GMIC_QT_COMMON_H +#define QT_VERSION_GTE(MAJOR, MINOR) (((QT_VERSION_MAJOR == MAJOR) && (QT_VERSION_MINOR >= MINOR)) || (QT_VERSION_MAJOR > MAJOR)) + +#endif // GMIC_QT_COMMON_H diff -Nru gmic-2.4.5/gmic-qt/src/CroppedActiveLayerProxy.h gmic-2.9.2/gmic-qt/src/CroppedActiveLayerProxy.h --- gmic-2.4.5/gmic-qt/src/CroppedActiveLayerProxy.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/CroppedActiveLayerProxy.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_CROPPEDACTIVELAYERPROXY_H_ -#define _GMIC_QT_CROPPEDACTIVELAYERPROXY_H_ +#ifndef GMIC_QT_CROPPEDACTIVELAYERPROXY_H +#define GMIC_QT_CROPPEDACTIVELAYERPROXY_H #include #include @@ -52,4 +52,4 @@ static double _height; }; -#endif // _GMIC_QT_CROPPEDACTIVELAYERPROXY_H_ +#endif // GMIC_QT_CROPPEDACTIVELAYERPROXY_H diff -Nru gmic-2.4.5/gmic-qt/src/CroppedImageListProxy.h gmic-2.9.2/gmic-qt/src/CroppedImageListProxy.h --- gmic-2.4.5/gmic-qt/src/CroppedImageListProxy.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/CroppedImageListProxy.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_CROPPEDIMAGELISTPROXY_H_ -#define _GMIC_QT_CROPPEDIMAGELISTPROXY_H_ +#ifndef GMIC_QT_CROPPEDIMAGELISTPROXY_H +#define GMIC_QT_CROPPEDIMAGELISTPROXY_H #include #include "gmic_qt.h" @@ -53,4 +53,4 @@ static double _zoom; }; -#endif // _GMIC_QT_CROPPEDIMAGELISTPROXY_H_ +#endif // GMIC_QT_CROPPEDIMAGELISTPROXY_H diff -Nru gmic-2.4.5/gmic-qt/src/DialogSettings.cpp gmic-2.9.2/gmic-qt/src/DialogSettings.cpp --- gmic-2.4.5/gmic-qt/src/DialogSettings.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/DialogSettings.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -28,6 +28,7 @@ #include #include "Common.h" #include "Globals.h" +#include "Host/host.h" #include "IconLoader.h" #include "Logger.h" #include "Updater.h" @@ -81,7 +82,6 @@ } ui->outputMessages->setToolTip(tr("Output messages")); - QString dummy3(tr("Output messages...")); ui->outputMessages->addItem(tr("Quiet (default)"), GmicQt::Quiet); ui->outputMessages->addItem(tr("Verbose (layer name)"), GmicQt::VerboseLayerName); ui->outputMessages->addItem(tr("Verbose (console)"), GmicQt::VerboseConsole); @@ -97,11 +97,11 @@ } } - ui->sbPreviewTimeout->setRange(1, 360); + ui->sbPreviewTimeout->setRange(0, 999); ui->rbLeftPreview->setChecked(_previewPosition == MainWindow::PreviewOnLeft); ui->rbRightPreview->setChecked(_previewPosition == MainWindow::PreviewOnRight); - const bool savedDarkTheme = QSettings().value(DARK_THEME_KEY, false).toBool(); + const bool savedDarkTheme = QSettings().value(DARK_THEME_KEY, GmicQt::DarkThemeIsDefault).toBool(); ui->rbDarkTheme->setChecked(savedDarkTheme); ui->rbDefaultTheme->setChecked(!savedDarkTheme); ui->cbNativeColorDialogs->setChecked(_nativeColorDialogs); @@ -168,7 +168,7 @@ } else { _previewPosition = MainWindow::PreviewOnRight; } - _darkThemeEnabled = settings.value(DARK_THEME_KEY, false).toBool(); + _darkThemeEnabled = settings.value(DARK_THEME_KEY, GmicQt::DarkThemeIsDefault).toBool(); _languageCode = settings.value("Config/LanguageCode", QString()).toString(); _nativeColorDialogs = settings.value("Config/NativeColorDialogs", false).toBool(); _updatePeriodicity = settings.value(INTERNET_UPDATE_PERIODICITY_KEY, INTERNET_DEFAULT_PERIODICITY).toInt(); diff -Nru gmic-2.4.5/gmic-qt/src/DialogSettings.h gmic-2.9.2/gmic-qt/src/DialogSettings.h --- gmic-2.4.5/gmic-qt/src/DialogSettings.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/DialogSettings.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_DIALOGSETTINGS_H_ -#define _GMIC_QT_DIALOGSETTINGS_H_ +#ifndef GMIC_QT_DIALOGSETTINGS_H +#define GMIC_QT_DIALOGSETTINGS_H #include #include @@ -52,7 +52,7 @@ Q_OBJECT public: - explicit DialogSettings(QWidget * parent = 0); + explicit DialogSettings(QWidget * parent = nullptr); ~DialogSettings(); static MainWindow::PreviewPosition previewPosition(); static bool logosAreVisible(); @@ -102,4 +102,4 @@ static bool _notifyFailedStartupUpdate; }; -#endif // _GMIC_QT_DIALOGSETTINGS_H_ +#endif // GMIC_QT_DIALOGSETTINGS_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/AbstractParameter.cpp gmic-2.9.2/gmic-qt/src/FilterParameters/AbstractParameter.cpp --- gmic-2.4.5/gmic-qt/src/FilterParameters/AbstractParameter.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/AbstractParameter.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -24,6 +24,7 @@ */ #include "FilterParameters/AbstractParameter.h" #include +#include #include #include "Common.h" #include "FilterParameters/BoolParameter.h" @@ -40,16 +41,22 @@ #include "FilterParameters/PointParameter.h" #include "FilterParameters/SeparatorParameter.h" #include "FilterParameters/TextParameter.h" +#include "Logger.h" -AbstractParameter::AbstractParameter(QObject * parent, bool actualParameter) : QObject(parent), _actualParameter(actualParameter), _update(true) {} +const QStringList AbstractParameter::NoValueParameters = {"link", "note", "separator"}; -AbstractParameter::~AbstractParameter() {} - -bool AbstractParameter::isVisible() const +AbstractParameter::AbstractParameter(QObject * parent, bool actualParameter) : QObject(parent), _actualParameter(actualParameter) { - return true; + _update = true; + _defaultVisibilityState = VisibleParameter; + _visibilityState = VisibleParameter; + _visibilityPropagation = PropagateNone; + _row = -1; + _grid = nullptr; } +AbstractParameter::~AbstractParameter() {} + bool AbstractParameter::isActualParameter() const { return _actualParameter; @@ -76,39 +83,40 @@ AbstractParameter * AbstractParameter::createFromText(const char * text, int & length, QString & error, QWidget * parent) { - AbstractParameter * result = 0; + AbstractParameter * result = nullptr; QString line = text; error.clear(); +#define IS_OF_TYPE(ptype) (QRegExp("^[^=]*\\s*=\\s*_?" ptype, Qt::CaseInsensitive).indexIn(line) == 0) + #define PREFIX "^[^=]*\\s*=\\s*_?" - if (QRegExp(PREFIX "int", Qt::CaseInsensitive).indexIn(line) == 0) { + if (IS_OF_TYPE("int")) { result = new IntParameter(parent); - } else if (QRegExp(PREFIX "float", Qt::CaseInsensitive).indexIn(line) == 0) { + } else if (IS_OF_TYPE("float")) { result = new FloatParameter(parent); - } else if (QRegExp(PREFIX "bool", Qt::CaseInsensitive).indexIn(line) == 0) { + } else if (IS_OF_TYPE("bool")) { result = new BoolParameter(parent); - } else if (QRegExp(PREFIX "choice", Qt::CaseInsensitive).indexIn(line) == 0) { + } else if (IS_OF_TYPE("choice")) { result = new ChoiceParameter(parent); - } else if (QRegExp(PREFIX "color", Qt::CaseInsensitive).indexIn(line) == 0) { + } else if (IS_OF_TYPE("color")) { result = new ColorParameter(parent); - } else if (QRegExp(PREFIX "separator", Qt::CaseInsensitive).indexIn(line) == 0) { + } else if (IS_OF_TYPE("separator")) { result = new SeparatorParameter(parent); - } else if (QRegExp(PREFIX "note", Qt::CaseInsensitive).indexIn(line) == 0) { + } else if (IS_OF_TYPE("note")) { result = new NoteParameter(parent); - } else if (QRegExp(PREFIX "file", Qt::CaseInsensitive).indexIn(line) == 0 || QRegExp(PREFIX "filein", Qt::CaseInsensitive).indexIn(line) == 0 || - QRegExp(PREFIX "fileout", Qt::CaseInsensitive).indexIn(line) == 0) { + } else if (IS_OF_TYPE("file") || IS_OF_TYPE("filein") || IS_OF_TYPE("fileout")) { result = new FileParameter(parent); - } else if (QRegExp(PREFIX "folder", Qt::CaseInsensitive).indexIn(line) == 0) { + } else if (IS_OF_TYPE("folder")) { result = new FolderParameter(parent); - } else if (QRegExp(PREFIX "text", Qt::CaseInsensitive).indexIn(line) == 0) { + } else if (IS_OF_TYPE("text")) { result = new TextParameter(parent); - } else if (QRegExp(PREFIX "link", Qt::CaseInsensitive).indexIn(line) == 0) { + } else if (IS_OF_TYPE("link")) { result = new LinkParameter(parent); - } else if (QRegExp(PREFIX "value", Qt::CaseInsensitive).indexIn(line) == 0) { + } else if (IS_OF_TYPE("value")) { result = new ConstParameter(parent); - } else if (QRegExp(PREFIX "button", Qt::CaseInsensitive).indexIn(line) == 0) { + } else if (IS_OF_TYPE("button")) { result = new ButtonParameter(parent); - } else if (QRegExp(PREFIX "point", Qt::CaseInsensitive).indexIn(line) == 0) { + } else if (IS_OF_TYPE("point")) { result = new PointParameter(parent); } if (result) { @@ -140,32 +148,118 @@ return result; } +AbstractParameter::VisibilityState AbstractParameter::defaultVisibilityState() const +{ + return _defaultVisibilityState; +} + +void AbstractParameter::setVisibilityState(AbstractParameter::VisibilityState state) +{ + if (state == UnspecifiedVisibilityState) { + setVisibilityState(defaultVisibilityState()); + return; + } + _visibilityState = state; + if (!_grid || _row == -1) { + return; + } + for (int col = 0; col < 5; ++col) { + QLayoutItem * item = _grid->itemAtPosition(_row, col); + if (item) { + auto widget = item->widget(); + switch (state & 3) { + case VisibleParameter: + widget->setEnabled(true); + widget->show(); + break; + case DisabledParameter: + widget->setEnabled(false); + widget->show(); + break; + case HiddenParameter: + widget->hide(); + break; + case UnspecifiedVisibilityState: + // Taken care above (if) + break; + } + } + } +} + +AbstractParameter::VisibilityState AbstractParameter::visibilityState() const +{ + return _visibilityState; +} + +AbstractParameter::VisibilityPropagation AbstractParameter::visibilityPropagation() const +{ + return _visibilityPropagation; +} + QStringList AbstractParameter::parseText(const QString & type, const char * text, int & length) { QStringList result; const QString str = text; result << str.left(str.indexOf("=")).trimmed(); +#ifdef _GMIC_QT_DEBUG_ + _debugName = result.back(); +#endif QRegExp re(QString("^[^=]*\\s*=\\s*(_?)%1\\s*(.)").arg(type), Qt::CaseInsensitive); re.indexIn(str); - int prefixLength = re.matchedLength(); + const int prefixLength = re.cap(0).toUtf8().size(); if (re.cap(1) == "_") { _update = false; } QString open = re.cap(2); - const char * end = 0; - if (open == "(") { - end = strstr(text + prefixLength, ")"); - } else if (open == "{") { - end = strstr(text + prefixLength, "}"); - } else if (open == "[") { - end = strstr(text + prefixLength, "]"); + const char * end = nullptr; + const char * closing = (open == "(") ? ")" : (open == "{") ? "}" : (open == "[") ? "]" : nullptr; + if (!closing) { + Logger::error(QString("Parse error in %1 parameter (invalid opening character '%2').").arg(type).arg(open)); + length = 1 + prefixLength; + return QStringList(); + } + end = strstr(text + prefixLength, closing); + if (!end) { + Logger::error(QString("Parse error in %1 parameter (cannot find closing '%2').").arg(type).arg(closing)); + length = 1 + prefixLength; + return QStringList(); } - QString values = str.mid(prefixLength, -1).left(end - (text + prefixLength)).trimmed(); + + // QString values = str.mid(prefixLength, -1).left(end - (text + prefixLength)).trimmed(); + QString values = QString::fromUtf8(text + prefixLength, end - (text + prefixLength)).trimmed(); length = 1 + end - text; - while (text[length] && (text[length] == ',' || str[length].isSpace())) { + + if (text[length] == '_' && text[length + 1] >= '0' && text[length + 1] <= '2') { + _defaultVisibilityState = static_cast(text[length + 1] - '0'); + _visibilityPropagation = PropagateNone; + switch (text[length + 2]) { + case '-': + _visibilityPropagation = PropagateUp; + length += 3; + break; + case '+': + _visibilityPropagation = PropagateDown; + length += 3; + break; + case '*': + _visibilityPropagation = PropagateUpDown; + length += 3; + break; + default: + length += 2; + break; + } + if (NoValueParameters.contains(type)) { + Logger::warning(QString("Warning: %1 parameter should not define visibility. Ignored.").arg(result.first())); + _defaultVisibilityState = AbstractParameter::VisibleParameter; + _visibilityPropagation = PropagateNone; + } + } + while (text[length] && (text[length] == ',' || QChar(text[length]).isSpace())) { ++length; } result << values; diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/AbstractParameter.h gmic-2.9.2/gmic-qt/src/FilterParameters/AbstractParameter.h --- gmic-2.4.5/gmic-qt/src/FilterParameters/AbstractParameter.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/AbstractParameter.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,11 +22,14 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_ABSTRACTPARAMETER_H_ -#define _GMIC_QT_ABSTRACTPARAMETER_H_ +#ifndef GMIC_QT_ABSTRACTPARAMETER_H +#define GMIC_QT_ABSTRACTPARAMETER_H #include +#include + class KeypointList; +class QGridLayout; class AbstractParameter : public QObject { Q_OBJECT @@ -34,9 +37,8 @@ public: AbstractParameter(QObject * parent, bool actualParameter); virtual ~AbstractParameter(); - virtual bool isVisible() const; bool isActualParameter() const; - virtual void addTo(QWidget *, int row) = 0; + virtual bool addTo(QWidget *, int row) = 0; virtual QString textValue() const = 0; virtual QString unquotedTextValue() const; virtual bool isQuoted() const; @@ -49,6 +51,29 @@ static AbstractParameter * createFromText(const char * text, int & length, QString & error, QWidget * parent = nullptr); virtual bool initFromText(const char * text, int & textLength) = 0; + + enum VisibilityState + { + UnspecifiedVisibilityState = -1, + HiddenParameter = 0, + DisabledParameter = 1, + VisibleParameter = 2, + }; + enum VisibilityPropagation + { + PropagateNone = 0, + PropagateUp = 1, + PropagateDown = 2, + PropagateUpDown = 3 + }; + + static const QStringList NoValueParameters; + + virtual VisibilityState defaultVisibilityState() const; + virtual void setVisibilityState(VisibilityState state); + VisibilityState visibilityState() const; + VisibilityPropagation visibilityPropagation() const; + signals: void valueChanged(); @@ -57,9 +82,17 @@ bool matchType(const QString & type, const char * text) const; void notifyIfRelevant(); const bool _actualParameter; + VisibilityState _defaultVisibilityState; + QGridLayout * _grid; + int _row; +#ifdef _GMIC_QT_DEBUG_ + QString _debugName; +#endif private: bool _update; + VisibilityState _visibilityState; + VisibilityPropagation _visibilityPropagation; }; -#endif // _GMIC_QT_ABSTRACTPARAMETER_H_ +#endif // GMIC_QT_ABSTRACTPARAMETER_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/BoolParameter.cpp gmic-2.9.2/gmic-qt/src/FilterParameters/BoolParameter.cpp --- gmic-2.4.5/gmic-qt/src/FilterParameters/BoolParameter.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/BoolParameter.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -41,12 +41,11 @@ delete _label; } -void BoolParameter::addTo(QWidget * widget, int row) +bool BoolParameter::addTo(QWidget * widget, int row) { - auto grid = dynamic_cast(widget->layout()); - if (!grid) { - return; - } + _grid = dynamic_cast(widget->layout()); + Q_ASSERT_X(_grid, __PRETTY_FUNCTION__, "No grid layout in widget"); + _row = row; delete _checkBox; delete _label; _checkBox = new QCheckBox(_name, widget); @@ -57,8 +56,9 @@ p.setColor(QPalette::Base, DialogSettings::CheckBoxBaseColor); _checkBox->setPalette(p); } - grid->addWidget(_checkBox, row, 0, 1, 3); + _grid->addWidget(_checkBox, row, 0, 1, 3); connectCheckBox(); + return true; } QString BoolParameter::textValue() const @@ -107,6 +107,9 @@ bool BoolParameter::initFromText(const char * text, int & textLength) { QList list = parseText("bool", text, textLength); + if (list.isEmpty()) { + return false; + } _name = HtmlTranslator::html2txt(list[0]); _value = _default = (list[1].startsWith("true") || list[1].startsWith("1")); return true; diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/BoolParameter.h gmic-2.9.2/gmic-qt/src/FilterParameters/BoolParameter.h --- gmic-2.4.5/gmic-qt/src/FilterParameters/BoolParameter.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/BoolParameter.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_BOOLPARAMETER_H_ -#define _GMIC_QT_BOOLPARAMETER_H_ +#ifndef GMIC_QT_BOOLPARAMETER_H +#define GMIC_QT_BOOLPARAMETER_H #include #include "AbstractParameter.h" @@ -34,8 +34,8 @@ Q_OBJECT public: BoolParameter(QObject * parent = nullptr); - ~BoolParameter(); - void addTo(QWidget *, int row) override; + ~BoolParameter() override; + bool addTo(QWidget *, int row) override; QString textValue() const override; void setValue(const QString & value) override; void reset() override; @@ -54,4 +54,4 @@ bool _connected; }; -#endif // _GMIC_QT_BOOLPARAMETER_H_ +#endif // GMIC_QT_BOOLPARAMETER_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/ButtonParameter.cpp gmic-2.9.2/gmic-qt/src/FilterParameters/ButtonParameter.cpp --- gmic-2.4.5/gmic-qt/src/FilterParameters/ButtonParameter.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/ButtonParameter.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -38,17 +38,17 @@ delete _pushButton; } -void ButtonParameter::addTo(QWidget * widget, int row) +bool ButtonParameter::addTo(QWidget * widget, int row) { - auto grid = dynamic_cast(widget->layout()); - if (!grid) { - return; - } + _grid = dynamic_cast(widget->layout()); + Q_ASSERT_X(_grid, __PRETTY_FUNCTION__, "No grid layout in widget"); + _row = row; delete _pushButton; _pushButton = new QPushButton(_text, widget); _pushButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); - grid->addWidget(_pushButton, row, 0, 1, 3, _alignment); + _grid->addWidget(_pushButton, row, 0, 1, 3, _alignment); connect(_pushButton, SIGNAL(clicked(bool)), this, SLOT(onPushButtonClicked(bool))); + return true; } QString ButtonParameter::textValue() const @@ -77,6 +77,9 @@ bool ButtonParameter::initFromText(const char * text, int & textLength) { QList list = parseText("button", text, textLength); + if (list.isEmpty()) { + return false; + } _text = HtmlTranslator::html2txt(list[0]); QString & alignment = list[1]; if (alignment.isEmpty()) { diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/ButtonParameter.h gmic-2.9.2/gmic-qt/src/FilterParameters/ButtonParameter.h --- gmic-2.4.5/gmic-qt/src/FilterParameters/ButtonParameter.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/ButtonParameter.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_BUTTONPARAMETER_H_ -#define _GMIC_QT_BUTTONPARAMETER_H_ +#ifndef GMIC_QT_BUTTONPARAMETER_H +#define GMIC_QT_BUTTONPARAMETER_H #include #include @@ -37,8 +37,8 @@ Q_OBJECT public: ButtonParameter(QObject * parent = nullptr); - ~ButtonParameter(); - void addTo(QWidget *, int row) override; + ~ButtonParameter() override; + bool addTo(QWidget *, int row) override; QString textValue() const override; void setValue(const QString &) override; void clear() override; @@ -54,4 +54,4 @@ Qt::AlignmentFlag _alignment; }; -#endif // _GMIC_QT_BUTTONPARAMETER_H_ +#endif // GMIC_QT_BUTTONPARAMETER_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/ChoiceParameter.cpp gmic-2.9.2/gmic-qt/src/FilterParameters/ChoiceParameter.cpp --- gmic-2.4.5/gmic-qt/src/FilterParameters/ChoiceParameter.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/ChoiceParameter.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -38,12 +38,11 @@ delete _label; } -void ChoiceParameter::addTo(QWidget * widget, int row) +bool ChoiceParameter::addTo(QWidget * widget, int row) { - auto grid = dynamic_cast(widget->layout()); - if (!grid) { - return; - } + _grid = dynamic_cast(widget->layout()); + Q_ASSERT_X(_grid, __PRETTY_FUNCTION__, "No grid layout in widget"); + _row = row; delete _comboBox; delete _label; @@ -51,9 +50,10 @@ _comboBox->addItems(_choices); _comboBox->setCurrentIndex(_value); - grid->addWidget(_label = new QLabel(_name, widget), row, 0, 1, 1); - grid->addWidget(_comboBox, row, 1, 1, 2); + _grid->addWidget(_label = new QLabel(_name, widget), row, 0, 1, 1); + _grid->addWidget(_comboBox, row, 1, 1, 2); connectComboBox(); + return true; } QString ChoiceParameter::textValue() const @@ -82,6 +82,9 @@ bool ChoiceParameter::initFromText(const char * text, int & textLength) { QStringList list = parseText("choice", text, textLength); + if (list.isEmpty()) { + return false; + } _name = HtmlTranslator::html2txt(list[0]); _choices = list[1].split(QChar(',')); bool ok; diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/ChoiceParameter.h gmic-2.9.2/gmic-qt/src/FilterParameters/ChoiceParameter.h --- gmic-2.4.5/gmic-qt/src/FilterParameters/ChoiceParameter.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/ChoiceParameter.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_CHOICEPARAMETER_H_ -#define _GMIC_QT_CHOICEPARAMETER_H_ +#ifndef GMIC_QT_CHOICEPARAMETER_H +#define GMIC_QT_CHOICEPARAMETER_H #include #include @@ -35,8 +35,8 @@ Q_OBJECT public: ChoiceParameter(QObject * parent = nullptr); - ~ChoiceParameter(); - void addTo(QWidget *, int row) override; + ~ChoiceParameter() override; + bool addTo(QWidget *, int row) override; QString textValue() const override; void setValue(const QString &) override; void reset() override; @@ -56,4 +56,4 @@ bool _connected; }; -#endif // _GMIC_QT_CHOICEPARAMETER_H_ +#endif // GMIC_QT_CHOICEPARAMETER_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/ColorParameter.cpp gmic-2.9.2/gmic-qt/src/FilterParameters/ColorParameter.cpp --- gmic-2.4.5/gmic-qt/src/FilterParameters/ColorParameter.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/ColorParameter.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -47,12 +47,11 @@ delete _dialog; } -void ColorParameter::addTo(QWidget * widget, int row) +bool ColorParameter::addTo(QWidget * widget, int row) { - auto grid = dynamic_cast(widget->layout()); - if (!grid) { - return; - } + _grid = dynamic_cast(widget->layout()); + Q_ASSERT_X(_grid, __PRETTY_FUNCTION__, "No grid layout in widget"); + _row = row; delete _button; delete _label; @@ -68,9 +67,10 @@ updateButtonColor(); - grid->addWidget(_label = new QLabel(_name, widget), row, 0, 1, 1); - grid->addWidget(_button, row, 1, 1, 1); + _grid->addWidget(_label = new QLabel(_name, widget), row, 0, 1, 1); + _grid->addWidget(_button, row, 1, 1, 1); connect(_button, SIGNAL(clicked()), this, SLOT(onButtonPressed())); + return true; } QString ColorParameter::textValue() const @@ -108,7 +108,27 @@ bool ColorParameter::initFromText(const char * text, int & textLength) { QList list = parseText("color", text, textLength); + if (list.isEmpty()) { + return false; + } _name = HtmlTranslator::html2txt(list[0]); + + // color(#e9cc00) and color(#e9cc00ff) + const QString trimmed = list[1].trimmed(); + QRegExp colorRE("#[0-9a-fA-F]{6,8}"); + if (colorRE.exactMatch(trimmed)) { + _default = QColor(trimmed.left(7)); + if (trimmed.length() == 9) { + _alphaChannel = true; + _default.setAlpha(trimmed.right(2).toInt(nullptr, 16)); + } else { + _alphaChannel = false; + } + _value = _default; + return true; + } + + // color(120,100,10) and color(120,100,10,128) QList channels = list[1].split(","); const int n = channels.size(); bool okR = true, okG = true, okB = true, okA = true; diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/ColorParameter.h gmic-2.9.2/gmic-qt/src/FilterParameters/ColorParameter.h --- gmic-2.4.5/gmic-qt/src/FilterParameters/ColorParameter.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/ColorParameter.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_COLORPARAMETER_H_ -#define _GMIC_QT_COLORPARAMETER_H_ +#ifndef GMIC_QT_COLORPARAMETER_H +#define GMIC_QT_COLORPARAMETER_H #include #include @@ -39,8 +39,8 @@ Q_OBJECT public: ColorParameter(QObject * parent = nullptr); - ~ColorParameter(); - void addTo(QWidget *, int row) override; + ~ColorParameter() override; + bool addTo(QWidget *, int row) override; QString textValue() const override; void setValue(const QString & value) override; void reset() override; @@ -60,4 +60,4 @@ QColorDialog * _dialog; }; -#endif // _GMIC_QT_COLORPARAMETER_H_ +#endif // GMIC_QT_COLORPARAMETER_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/ConstParameter.cpp gmic-2.9.2/gmic-qt/src/FilterParameters/ConstParameter.cpp --- gmic-2.4.5/gmic-qt/src/FilterParameters/ConstParameter.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/ConstParameter.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -32,13 +32,11 @@ ConstParameter::~ConstParameter() = default; -bool ConstParameter::isVisible() const +bool ConstParameter::addTo(QWidget *, int) { return false; } -void ConstParameter::addTo(QWidget *, int) {} - QString ConstParameter::textValue() const { return _value; @@ -57,6 +55,9 @@ bool ConstParameter::initFromText(const char * text, int & textLength) { QStringList list = parseText("value", text, textLength); + if (list.isEmpty()) { + return false; + } _name = HtmlTranslator::html2txt(list[0]); _value = _default = list[1]; return true; diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/ConstParameter.h gmic-2.9.2/gmic-qt/src/FilterParameters/ConstParameter.h --- gmic-2.4.5/gmic-qt/src/FilterParameters/ConstParameter.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/ConstParameter.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_CONSTPARAMETER_H_ -#define _GMIC_QT_CONSTPARAMETER_H_ +#ifndef GMIC_QT_CONSTPARAMETER_H +#define GMIC_QT_CONSTPARAMETER_H #include "AbstractParameter.h" class QLabel; @@ -32,9 +32,8 @@ Q_OBJECT public: ConstParameter(QObject * parent = nullptr); - ~ConstParameter(); - bool isVisible() const override; - void addTo(QWidget *, int row) override; + ~ConstParameter() override; + bool addTo(QWidget *, int row) override; QString textValue() const override; void setValue(const QString & value) override; void reset() override; @@ -46,4 +45,4 @@ QString _value; }; -#endif // _GMIC_QT_CONSTPARAMETER_H_ +#endif // GMIC_QT_CONSTPARAMETER_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/CustomDoubleSpinBox.cpp gmic-2.9.2/gmic-qt/src/FilterParameters/CustomDoubleSpinBox.cpp --- gmic-2.4.5/gmic-qt/src/FilterParameters/CustomDoubleSpinBox.cpp 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/CustomDoubleSpinBox.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -0,0 +1,89 @@ +/** -*- mode: c++ ; c-basic-offset: 2 -*- + * + * @file CustomDoubleSpinBox.h + * + * Copyright 2017 Sebastien Fourey + * + * This file is part of G'MIC-Qt, a generic plug-in for raster graphics + * editors, offering hundreds of filters thanks to the underlying G'MIC + * image processing framework. + * + * gmic_qt 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. + * + * gmic_qt is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with gmic_qt. If not, see . + * + */ +#include "FilterParameters/CustomDoubleSpinBox.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include "Common.h" + +CustomDoubleSpinBox::CustomDoubleSpinBox(QWidget * parent, float min, float max) : QDoubleSpinBox(parent) +{ + setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + const int decimals = std::max(2, MAX_DIGITS - std::max(integerPartDigitCount(min), integerPartDigitCount(max))); + setDecimals(decimals); + setRange(min, max); + + QDoubleSpinBox * dummy = new QDoubleSpinBox(this); + dummy->hide(); + dummy->setRange(min, max); + dummy->setDecimals(decimals); + _sizeHint = dummy->sizeHint(); + _minimumSizeHint = dummy->minimumSizeHint(); + delete dummy; +} + +CustomDoubleSpinBox::~CustomDoubleSpinBox() {} + +QString CustomDoubleSpinBox::textFromValue(double value) const +{ + QString text = QString::number(value, 'g', MAX_DIGITS); + if (text.contains('e') || text.contains('E')) { + text = QString::number(value, 'f', decimals()); + const QChar DecimalPoint = QLocale().decimalPoint(); + if (text.contains(DecimalPoint)) { + while (text.endsWith(QChar('0'))) { + text.chop(1); + } + if (text.endsWith(DecimalPoint)) { + text.chop(1); + } + } + } + return text; +} + +QSize CustomDoubleSpinBox::sizeHint() const +{ + return _sizeHint; +} + +QSize CustomDoubleSpinBox::minimumSizeHint() const +{ + return _minimumSizeHint; +} + +int CustomDoubleSpinBox::integerPartDigitCount(float value) +{ + QString text = QString::number(static_cast(value), 'f', 0); + if (text[0] == QChar('-')) { + text.remove(0, 1); + } + return text.length(); +} diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/CustomDoubleSpinBox.h gmic-2.9.2/gmic-qt/src/FilterParameters/CustomDoubleSpinBox.h --- gmic-2.4.5/gmic-qt/src/FilterParameters/CustomDoubleSpinBox.h 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/CustomDoubleSpinBox.h 2020-09-03 11:37:05.000000000 +0000 @@ -0,0 +1,51 @@ +/** -*- mode: c++ ; c-basic-offset: 2 -*- + * + * @file CustomDoubleSpinBox.h + * + * Copyright 2017 Sebastien Fourey + * + * This file is part of G'MIC-Qt, a generic plug-in for raster graphics + * editors, offering hundreds of filters thanks to the underlying G'MIC + * image processing framework. + * + * gmic_qt 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. + * + * gmic_qt is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with gmic_qt. If not, see . + * + */ +#ifndef GMIC_QT_CUSTOMDOUBLESPINBOX_H +#define GMIC_QT_CUSTOMDOUBLESPINBOX_H + +#include +#include +class QShowEvent; +class QResizeEvent; + +class CustomDoubleSpinBox : public QDoubleSpinBox { + Q_OBJECT +public: + CustomDoubleSpinBox(QWidget * parent, float min, float max); + ~CustomDoubleSpinBox() override; + QString textFromValue(double value) const override; + +protected: + QSize sizeHint() const override; + QSize minimumSizeHint() const override; + +private: + QSize _sizeHint; + QSize _minimumSizeHint; + static const int MAX_DIGITS = 5; + static int integerPartDigitCount(float value); +}; + +#endif // GMIC_QT_CUSTOMDOUBLESPINBOX_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/FileParameter.cpp gmic-2.9.2/gmic-qt/src/FilterParameters/FileParameter.cpp --- gmic-2.4.5/gmic-qt/src/FilterParameters/FileParameter.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/FileParameter.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -45,12 +45,11 @@ delete _button; } -void FileParameter::addTo(QWidget * widget, int row) +bool FileParameter::addTo(QWidget * widget, int row) { - auto grid = dynamic_cast(widget->layout()); - if (!grid) { - return; - } + _grid = dynamic_cast(widget->layout()); + Q_ASSERT_X(_grid, __PRETTY_FUNCTION__, "No grid layout in widget"); + _row = row; delete _label; delete _button; @@ -64,9 +63,10 @@ } _button = new QPushButton(buttonText, widget); _button->setIcon(LOAD_ICON("document-open")); - grid->addWidget(_label = new QLabel(_name, widget), row, 0, 1, 1); - grid->addWidget(_button, row, 1, 1, 2); + _grid->addWidget(_label = new QLabel(_name, widget), row, 0, 1, 1); + _grid->addWidget(_button, row, 1, 1, 2); connect(_button, SIGNAL(clicked()), this, SLOT(onButtonPressed())); + return true; } QString FileParameter::textValue() const @@ -111,6 +111,9 @@ list = parseText("file", text, textLength); _dialogMode = InputOutputMode; } + if (list.isEmpty()) { + return false; + } _name = HtmlTranslator::html2txt(list[0]); QRegExp re("^\".*\"$"); if (re.exactMatch(list[1])) { diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/FileParameter.h gmic-2.9.2/gmic-qt/src/FilterParameters/FileParameter.h --- gmic-2.4.5/gmic-qt/src/FilterParameters/FileParameter.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/FileParameter.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_FILEPARAMETER_H_ -#define _GMIC_QT_FILEPARAMETER_H_ +#ifndef GMIC_QT_FILEPARAMETER_H +#define GMIC_QT_FILEPARAMETER_H #include #include "AbstractParameter.h" @@ -34,8 +34,8 @@ Q_OBJECT public: FileParameter(QObject * parent = nullptr); - ~FileParameter(); - void addTo(QWidget *, int row) override; + ~FileParameter() override; + bool addTo(QWidget *, int row) override; QString textValue() const override; QString unquotedTextValue() const override; void setValue(const QString & value) override; @@ -60,4 +60,4 @@ DialogMode _dialogMode; }; -#endif // _GMIC_QT_FILEPARAMETER_H_ +#endif // GMIC_QT_FILEPARAMETER_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/FilterParametersWidget.cpp gmic-2.9.2/gmic-qt/src/FilterParameters/FilterParametersWidget.cpp --- gmic-2.4.5/gmic-qt/src/FilterParameters/FilterParametersWidget.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/FilterParametersWidget.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -1,6 +1,6 @@ /** -*- mode: c++ ; c-basic-offset: 2 -*- * - * @file FilterParamsWidget.cpp + * @file FilterParametersWidget.cpp * * Copyright 2017 Sebastien Fourey * @@ -44,16 +44,17 @@ _hasKeypoints = false; } -bool FilterParametersWidget::build(const QString & name, const QString & hash, const QString & parameters, const QList & values) +bool FilterParametersWidget::build(const QString & name, const QString & hash, const QString & parameters, const QList & values, const QList & visibilityStates) { _filterName = name; _filterHash = hash; + hide(); clear(); delete layout(); auto grid = new QGridLayout(this); grid->setRowStretch(1, 2); - QByteArray rawText = parameters.toLatin1(); + QByteArray rawText = parameters.toUtf8(); const char * cstr = rawText.constData(); int length; @@ -103,14 +104,20 @@ QVector::iterator it = _presetParameters.begin(); while (it != _presetParameters.end()) { AbstractParameter * parameter = *it; - if (parameter->isVisible()) { - parameter->addTo(this, row++); - grid->setRowStretch(row - 1, 0); + if (parameter->addTo(this, row)) { + grid->setRowStretch(row, 0); + ++row; } connect(parameter, SIGNAL(valueChanged()), this, SLOT(updateValueString())); ++it; } + if (visibilityStates.isEmpty()) { + applyDefaultVisibilityStates(); + } else { + setVisibilityStates(visibilityStates); + } + // Retrieve a dummy keypoint list KeypointList keypoints; it = _presetParameters.begin(); @@ -150,17 +157,22 @@ grid->addWidget(_labelNoParams, 0, 0, 4, 3); } updateValueString(false); + show(); return error.isEmpty(); } -void FilterParametersWidget::setNoFilter() +void FilterParametersWidget::setNoFilter(const QString & message) { clear(); delete layout(); auto grid = new QGridLayout(this); grid->setRowStretch(1, 2); - _labelNoParams = new QLabel(tr("Select a filter"), this); + if (message.isEmpty()) { + _labelNoParams = new QLabel(tr("Select a filter"), this); + } else { + _labelNoParams = new QLabel(QString("%1").arg(message), this); + } _labelNoParams->setAlignment(Qt::AlignHCenter | Qt::AlignCenter); grid->addWidget(_labelNoParams, 0, 0, 4, 3); @@ -191,18 +203,95 @@ void FilterParametersWidget::setValues(const QStringList & list, bool notify) { - if (list.isEmpty() || _actualParametersCount != list.size()) { + if (list.isEmpty()) { return; } - int j = 0; + if (_actualParametersCount != list.size()) { + TRACE << "Wrong number of values" << list << "expecting" << _actualParametersCount; + return; + } + auto itValue = list.begin(); for (AbstractParameter * param : _presetParameters) { if (param->isActualParameter()) { - param->setValue(list[j++]); + param->setValue(*itValue++); } } updateValueString(notify); } +void FilterParametersWidget::setVisibilityStates(const QList & states) +{ + if (states.isEmpty()) { + return; + } + if (_actualParametersCount != states.size()) { + TRACE << "Wrong number of states" << states << "expecting" << _actualParametersCount; + return; + } + + // Fill a table of new states for all parameters, including no-value ones + QVector newVisibilityStates(_presetParameters.size(), AbstractParameter::UnspecifiedVisibilityState); + { + auto itState = states.begin(); + for (int n = 0; n < _presetParameters.size(); ++n) { + AbstractParameter * parameter = _presetParameters[n]; + if (parameter->isActualParameter()) { + newVisibilityStates[n] = static_cast(*itState); + ++itState; + } + } + } + // Propagate if necessary + for (int n = 0; n < _presetParameters.size(); ++n) { + AbstractParameter * parameter = _presetParameters[n]; + if (parameter->isActualParameter()) { + AbstractParameter::VisibilityState state = newVisibilityStates[n]; + if (state == AbstractParameter::UnspecifiedVisibilityState) { + state = parameter->defaultVisibilityState(); + } + if (parameter->visibilityPropagation() == AbstractParameter::PropagateUp || parameter->visibilityPropagation() == AbstractParameter::PropagateUpDown) { + int i = n - 1; + while ((i >= 0) && !_presetParameters[i]->isActualParameter()) { + newVisibilityStates[i++] = state; + } + } + if (parameter->visibilityPropagation() == AbstractParameter::PropagateDown || parameter->visibilityPropagation() == AbstractParameter::PropagateUpDown) { + int i = n + 1; + while ((i < _presetParameters.size()) && !_presetParameters[i]->isActualParameter()) { + newVisibilityStates[i++] = state; + } + } + } + } + + for (int n = 0; n < _presetParameters.size(); ++n) { + AbstractParameter * const parameter = _presetParameters[n]; + parameter->setVisibilityState(newVisibilityStates[n]); + } +} + +QList FilterParametersWidget::visibilityStates() +{ + QList states; + for (const AbstractParameter * const param : _presetParameters) { + if (param->isActualParameter()) { + states.push_back(param->visibilityState()); + } + } + return states; +} + +QList FilterParametersWidget::defaultVisibilityStates() +{ + QList states; + for (AbstractParameter * param : _presetParameters) { + if (param->isActualParameter()) { + states.push_back(param->defaultVisibilityState()); + } + } + return states; +} + void FilterParametersWidget::reset(bool notify) { for (AbstractParameter * param : _presetParameters) { @@ -210,6 +299,7 @@ param->reset(); } } + applyDefaultVisibilityStates(); updateValueString(notify); } @@ -266,6 +356,11 @@ _paddingWidget = nullptr; } +void FilterParametersWidget::applyDefaultVisibilityStates() +{ + setVisibilityStates(defaultVisibilityStates()); // Will propagate +} + void FilterParametersWidget::clearButtonParameters() { for (AbstractParameter * param : _presetParameters) { diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/FilterParametersWidget.h gmic-2.9.2/gmic-qt/src/FilterParameters/FilterParametersWidget.h --- gmic-2.4.5/gmic-qt/src/FilterParameters/FilterParametersWidget.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/FilterParametersWidget.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,10 +22,11 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_FILTERPARAMSWIDGET_H_ -#define _GMIC_QT_FILTERPARAMSWIDGET_H_ +#ifndef GMIC_QT_FILTERPARAMSWIDGET_H +#define GMIC_QT_FILTERPARAMSWIDGET_H #include +#include #include #include #include @@ -40,12 +41,17 @@ public: FilterParametersWidget(QWidget * parent = nullptr); - bool build(const QString & name, const QString & hash, const QString & parameters, const QList & values); - void setNoFilter(); + bool build(const QString & name, const QString & hash, const QString & parameters, const QList & values, const QList & visibilityStates); + void setNoFilter(const QString & message = QString()); virtual ~FilterParametersWidget(); const QString & valueString() const; QStringList valueStringList() const; void setValues(const QStringList &, bool notify); + void setVisibilityStates(const QList & states); + QList visibilityStates(); + QList defaultVisibilityStates(); + + void applyDefaultVisibilityStates(); void reset(bool notify); QString filterName() const; int actualParametersCount() const; @@ -77,4 +83,4 @@ QString _quotedParameters; }; -#endif // _GMIC_QT_FILTERPARAMSWIDGET_H_ +#endif // GMIC_QT_FILTERPARAMSWIDGET_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/FloatParameter.cpp gmic-2.9.2/gmic-qt/src/FilterParameters/FloatParameter.cpp --- gmic-2.4.5/gmic-qt/src/FilterParameters/FloatParameter.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/FloatParameter.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -24,7 +24,6 @@ */ #include "FilterParameters/FloatParameter.h" #include -#include #include #include #include @@ -34,6 +33,7 @@ #include #include #include "DialogSettings.h" +#include "FilterParameters/CustomDoubleSpinBox.h" #include "Globals.h" #include "HtmlTranslator.h" @@ -50,34 +50,34 @@ delete _label; } -void FloatParameter::addTo(QWidget * widget, int row) +bool FloatParameter::addTo(QWidget * widget, int row) { - auto grid = dynamic_cast(widget->layout()); - if (!grid) { - return; - } + _grid = dynamic_cast(widget->layout()); + Q_ASSERT_X(_grid, __PRETTY_FUNCTION__, "No grid layout in widget"); + _row = row; delete _spinBox; delete _slider; delete _label; _slider = new QSlider(Qt::Horizontal, widget); _slider->setMinimumWidth(SLIDER_MIN_WIDTH); - _slider->setRange(0, 1000); - _slider->setValue(static_cast(1000 * (_value - _min) / (_max - _min))); + _slider->setRange(0, SLIDER_MAX_RANGE); + _slider->setValue(static_cast(SLIDER_MAX_RANGE * (_value - _min) / (_max - _min))); if (DialogSettings::darkThemeEnabled()) { QPalette p = _slider->palette(); p.setColor(QPalette::Button, QColor(100, 100, 100)); p.setColor(QPalette::Highlight, QColor(130, 130, 130)); _slider->setPalette(p); } - _spinBox = new QDoubleSpinBox(widget); - _spinBox->setRange(_min, _max); + + _spinBox = new CustomDoubleSpinBox(widget, _min, _max); + _spinBox->setSingleStep((_max - _min) / 100.0f); _spinBox->setValue(_value); - _spinBox->setDecimals(2); - _spinBox->setSingleStep((_max - _min) / 100.0); - grid->addWidget(_label = new QLabel(_name, widget), row, 0, 1, 1); - grid->addWidget(_slider, row, 1, 1, 1); - grid->addWidget(_spinBox, row, 2, 1, 1); + _grid->addWidget(_label = new QLabel(_name, widget), row, 0, 1, 1); + _grid->addWidget(_slider, row, 1, 1, 1); + _grid->addWidget(_spinBox, row, 2, 1, 1); + connectSliderSpinBox(); + return true; } QString FloatParameter::textValue() const @@ -94,7 +94,7 @@ _value = value.toFloat(); if (_slider) { disconnectSliderSpinBox(); - _slider->setValue(static_cast(1000 * (_value - _min) / (_max - _min))); + _slider->setValue(static_cast(SLIDER_MAX_RANGE * (_value - _min) / (_max - _min))); _spinBox->setValue(_value); connectSliderSpinBox(); } @@ -104,7 +104,7 @@ { disconnectSliderSpinBox(); _value = _default; - _slider->setValue(static_cast(1000 * (_value - _min) / (_max - _min))); + _slider->setValue(static_cast(SLIDER_MAX_RANGE * (_value - _min) / (_max - _min))); _spinBox->setValue(_default); connectSliderSpinBox(); } @@ -113,6 +113,9 @@ { textLength = 0; QList list = parseText("float", text, textLength); + if (list.isEmpty()) { + return false; + } _name = HtmlTranslator::html2txt(list[0]); QList values = list[1].split(QChar(',')); if (values.size() != 3) { @@ -135,7 +138,7 @@ void FloatParameter::onSliderMoved(int value) { - float fValue = _min + (value / 1000.0) * (_max - _min); + const float fValue = _min + (value / static_cast(SLIDER_MAX_RANGE)) * (_max - _min); if (fValue != _value) { _spinBox->setValue(_value = fValue); } @@ -143,7 +146,7 @@ void FloatParameter::onSliderValueChanged(int value) { - float fValue = _min + (value / 1000.0) * (_max - _min); + float fValue = _min + (value / static_cast(SLIDER_MAX_RANGE)) * (_max - _min); if (fValue != _value) { _spinBox->setValue(_value = fValue); } @@ -153,7 +156,7 @@ { _value = x; disconnectSliderSpinBox(); - _slider->setValue(static_cast(1000 * (_value - _min) / (_max - _min))); + _slider->setValue(static_cast(SLIDER_MAX_RANGE * (_value - _min) / (_max - _min))); connectSliderSpinBox(); if (_timerId) { killTimer(_timerId); diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/FloatParameter.h gmic-2.9.2/gmic-qt/src/FilterParameters/FloatParameter.h --- gmic-2.4.5/gmic-qt/src/FilterParameters/FloatParameter.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/FloatParameter.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,12 +22,12 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_FLOATPARAMETER_H_ -#define _GMIC_QT_FLOATPARAMETER_H_ +#ifndef GMIC_QT_FLOATPARAMETER_H +#define GMIC_QT_FLOATPARAMETER_H #include #include "AbstractParameter.h" -class QDoubleSpinBox; +class CustomDoubleSpinBox; class QSlider; class QLabel; @@ -35,8 +35,8 @@ Q_OBJECT public: FloatParameter(QObject * parent = nullptr); - ~FloatParameter(); - void addTo(QWidget *, int row) override; + ~FloatParameter() override; + bool addTo(QWidget *, int row) override; QString textValue() const override; void setValue(const QString & value) override; void reset() override; @@ -59,10 +59,11 @@ float _value; QLabel * _label; QSlider * _slider; - QDoubleSpinBox * _spinBox; + CustomDoubleSpinBox * _spinBox; int _timerId; static const int UPDATE_DELAY = 300; + static const int SLIDER_MAX_RANGE = 1000; bool _connected; }; -#endif // _GMIC_QT_FLOATPARAMETER_H_ +#endif // GMIC_QT_FLOATPARAMETER_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/FolderParameter.cpp gmic-2.9.2/gmic-qt/src/FilterParameters/FolderParameter.cpp --- gmic-2.4.5/gmic-qt/src/FilterParameters/FolderParameter.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/FolderParameter.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -45,20 +45,21 @@ delete _button; } -void FolderParameter::addTo(QWidget * widget, int row) +bool FolderParameter::addTo(QWidget * widget, int row) { - auto grid = dynamic_cast(widget->layout()); - if (!grid) - return; + _grid = dynamic_cast(widget->layout()); + Q_ASSERT_X(_grid, __PRETTY_FUNCTION__, "No grid layout in widget"); + _row = row; delete _label; delete _button; _button = new QPushButton(widget); _button->setIcon(LOAD_ICON("folder")); - grid->addWidget(_label = new QLabel(_name, widget), row, 0, 1, 1); - grid->addWidget(_button, row, 1, 1, 2); + _grid->addWidget(_label = new QLabel(_name, widget), row, 0, 1, 1); + _grid->addWidget(_button, row, 1, 1, 2); setValue(_value); connect(_button, SIGNAL(clicked()), this, SLOT(onButtonPressed())); + return true; } QString FolderParameter::textValue() const @@ -96,6 +97,9 @@ bool FolderParameter::initFromText(const char * text, int & textLength) { QList list = parseText("folder", text, textLength); + if (list.isEmpty()) { + return false; + } _name = HtmlTranslator::html2txt(list[0]); QRegExp re("^\".*\"$"); if (re.exactMatch(list[1])) { diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/FolderParameter.h gmic-2.9.2/gmic-qt/src/FilterParameters/FolderParameter.h --- gmic-2.4.5/gmic-qt/src/FilterParameters/FolderParameter.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/FolderParameter.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_FOLDERPARAMETER_H_ -#define _GMIC_QT_FOLDERPARAMETER_H_ +#ifndef GMIC_QT_FOLDERPARAMETER_H +#define GMIC_QT_FOLDERPARAMETER_H #include #include "AbstractParameter.h" @@ -34,8 +34,8 @@ Q_OBJECT public: FolderParameter(QObject * parent = nullptr); - ~FolderParameter(); - void addTo(QWidget *, int row) override; + ~FolderParameter() override; + bool addTo(QWidget *, int row) override; QString textValue() const override; QString unquotedTextValue() const override; void setValue(const QString & value) override; @@ -53,4 +53,4 @@ QPushButton * _button; }; -#endif // _GMIC_QT_FOLDERPARAMETER_H_ +#endif // GMIC_QT_FOLDERPARAMETER_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/IntParameter.cpp gmic-2.9.2/gmic-qt/src/FilterParameters/IntParameter.cpp --- gmic-2.4.5/gmic-qt/src/FilterParameters/IntParameter.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/IntParameter.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -47,12 +47,11 @@ delete _label; } -void IntParameter::addTo(QWidget * widget, int row) +bool IntParameter::addTo(QWidget * widget, int row) { - auto grid = dynamic_cast(widget->layout()); - if (!grid) { - return; - } + _grid = dynamic_cast(widget->layout()); + Q_ASSERT_X(_grid, __PRETTY_FUNCTION__, "No grid layout in widget"); + _row = row; delete _spinBox; delete _slider; delete _label; @@ -60,6 +59,15 @@ _slider->setMinimumWidth(SLIDER_MIN_WIDTH); _slider->setRange(_min, _max); _slider->setValue(_value); + + const int delta = 1 + _max - _min; + if (delta < 20) { + _slider->setPageStep(1); + } else { + const int fact = delta < 100 ? 10 : delta < 1000 ? 100 : delta < 10000 ? 1000 : 10000; + _slider->setPageStep(fact * (delta / fact) / 10); + } + _spinBox = new QSpinBox(widget); _spinBox->setRange(_min, _max); _spinBox->setValue(_value); @@ -69,10 +77,11 @@ p.setColor(QPalette::Highlight, QColor(130, 130, 130)); _slider->setPalette(p); } - grid->addWidget(_label = new QLabel(_name, widget), row, 0, 1, 1); - grid->addWidget(_slider, row, 1, 1, 1); - grid->addWidget(_spinBox, row, 2, 1, 1); + _grid->addWidget(_label = new QLabel(_name, widget), row, 0, 1, 1); + _grid->addWidget(_slider, row, 1, 1, 1); + _grid->addWidget(_spinBox, row, 2, 1, 1); connectSliderSpinBox(); + return true; } QString IntParameter::textValue() const @@ -103,6 +112,9 @@ bool IntParameter::initFromText(const char * text, int & textLength) { QList list = parseText("int", text, textLength); + if (list.isEmpty()) { + return false; + } _name = HtmlTranslator::html2txt(list[0]); QList values = list[1].split(QChar(',')); if (values.size() != 3) { diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/IntParameter.h gmic-2.9.2/gmic-qt/src/FilterParameters/IntParameter.h --- gmic-2.4.5/gmic-qt/src/FilterParameters/IntParameter.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/IntParameter.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_INTPARAMETER_H_ -#define _GMIC_QT_INTPARAMETER_H_ +#ifndef GMIC_QT_INTPARAMETER_H +#define GMIC_QT_INTPARAMETER_H #include #include "AbstractParameter.h" @@ -35,8 +35,8 @@ Q_OBJECT public: IntParameter(QObject * parent = nullptr); - ~IntParameter(); - void addTo(QWidget *, int row) override; + ~IntParameter() override; + bool addTo(QWidget *, int row) override; QString textValue() const override; void setValue(const QString & value) override; void reset() override; @@ -65,4 +65,4 @@ bool _connected; }; -#endif // _GMIC_QT_INTPARAMETER_H_ +#endif // GMIC_QT_INTPARAMETER_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/LinkParameter.cpp gmic-2.9.2/gmic-qt/src/FilterParameters/LinkParameter.cpp --- gmic-2.4.5/gmic-qt/src/FilterParameters/LinkParameter.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/LinkParameter.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -39,24 +39,24 @@ delete _label; } -void LinkParameter::addTo(QWidget * widget, int row) +bool LinkParameter::addTo(QWidget * widget, int row) { - auto grid = dynamic_cast(widget->layout()); - if (!grid) { - return; - } + _grid = dynamic_cast(widget->layout()); + Q_ASSERT_X(_grid, __PRETTY_FUNCTION__, "No grid layout in widget"); + _row = row; delete _label; _label = new QLabel(QString("%1").arg(_text).arg(_url), widget); _label->setAlignment(_alignment); _label->setTextFormat(Qt::RichText); _label->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); connect(_label, SIGNAL(linkActivated(QString)), this, SLOT(onLinkActivated(QString))); - grid->addWidget(_label, row, 0, 1, 3); + _grid->addWidget(_label, row, 0, 1, 3); + return true; } QString LinkParameter::textValue() const { - return QString::null; + return QString(); } void LinkParameter::setValue(const QString &) {} @@ -66,6 +66,9 @@ bool LinkParameter::initFromText(const char * text, int & textLength) { QList list = parseText("link", text, textLength); + if (list.isEmpty()) { + return false; + } QList values = list[1].split(QChar(',')); if (values.size() == 3) { diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/LinkParameter.h gmic-2.9.2/gmic-qt/src/FilterParameters/LinkParameter.h --- gmic-2.4.5/gmic-qt/src/FilterParameters/LinkParameter.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/LinkParameter.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_LINKPARAMETER_H_ -#define _GMIC_QT_LINKPARAMETER_H_ +#ifndef GMIC_QT_LINKPARAMETER_H +#define GMIC_QT_LINKPARAMETER_H #include #include "AbstractParameter.h" @@ -33,8 +33,8 @@ Q_OBJECT public: LinkParameter(QObject * parent = nullptr); - ~LinkParameter(); - void addTo(QWidget *, int row) override; + ~LinkParameter() override; + bool addTo(QWidget *, int row) override; QString textValue() const override; void setValue(const QString & value) override; void reset() override; @@ -49,4 +49,4 @@ Qt::AlignmentFlag _alignment; }; -#endif // _GMIC_QT_LINKPARAMETER_H_ +#endif // GMIC_QT_LINKPARAMETER_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/MultilineTextParameterWidget.h gmic-2.9.2/gmic-qt/src/FilterParameters/MultilineTextParameterWidget.h --- gmic-2.4.5/gmic-qt/src/FilterParameters/MultilineTextParameterWidget.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/MultilineTextParameterWidget.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_MULTILINETEXTPARAMETERWIDGET_H_ -#define _GMIC_QT_MULTILINETEXTPARAMETERWIDGET_H_ +#ifndef GMIC_QT_MULTILINETEXTPARAMETERWIDGET_H +#define GMIC_QT_MULTILINETEXTPARAMETERWIDGET_H #include @@ -36,7 +36,7 @@ Q_OBJECT public: explicit MultilineTextParameterWidget(const QString & name, const QString & value, QWidget * parent = nullptr); - ~MultilineTextParameterWidget(); + ~MultilineTextParameterWidget() override; QString text() const; void setText(const QString & text); signals: @@ -51,4 +51,4 @@ Ui::MultilineTextParameterWidget * ui; }; -#endif // _GMIC_QT_MULTILINETEXTPARAMETERWIDGET_H +#endif // GMIC_QT_MULTILINETEXTPARAMETERWIDGET_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/NoteParameter.cpp gmic-2.9.2/gmic-qt/src/FilterParameters/NoteParameter.cpp --- gmic-2.4.5/gmic-qt/src/FilterParameters/NoteParameter.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/NoteParameter.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -39,24 +39,24 @@ delete _label; } -void NoteParameter::addTo(QWidget * widget, int row) +bool NoteParameter::addTo(QWidget * widget, int row) { - auto grid = dynamic_cast(widget->layout()); - if (!grid) { - return; - } + _grid = dynamic_cast(widget->layout()); + Q_ASSERT_X(_grid, __PRETTY_FUNCTION__, "No grid layout in widget"); + _row = row; delete _label; _label = new QLabel(_text, widget); _label->setTextFormat(Qt::RichText); _label->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); _label->setWordWrap(true); connect(_label, SIGNAL(linkActivated(QString)), this, SLOT(onLinkActivated(QString))); - grid->addWidget(_label, row, 0, 1, 3); + _grid->addWidget(_label, row, 0, 1, 3); + return true; } QString NoteParameter::textValue() const { - return QString::null; + return QString(); } void NoteParameter::setValue(const QString &) {} @@ -66,6 +66,9 @@ bool NoteParameter::initFromText(const char * text, int & textLength) { QList list = parseText("note", text, textLength); + if (list.isEmpty()) { + return false; + } _text = list[1].trimmed().remove(QRegExp("^\"")).remove(QRegExp("\"$")).replace(QString("\\\""), "\""); _text.replace(QString("\\n"), "
"); diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/NoteParameter.h gmic-2.9.2/gmic-qt/src/FilterParameters/NoteParameter.h --- gmic-2.4.5/gmic-qt/src/FilterParameters/NoteParameter.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/NoteParameter.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_NOTEPARAMETER_H_ -#define _GMIC_QT_NOTEPARAMETER_H_ +#ifndef GMIC_QT_NOTEPARAMETER_H +#define GMIC_QT_NOTEPARAMETER_H #include "AbstractParameter.h" class QLabel; @@ -32,8 +32,8 @@ Q_OBJECT public: NoteParameter(QObject * parent = nullptr); - ~NoteParameter(); - void addTo(QWidget *, int row) override; + ~NoteParameter() override; + bool addTo(QWidget *, int row) override; QString textValue() const override; void setValue(const QString & value) override; void reset() override; @@ -46,4 +46,4 @@ QString _text; }; -#endif // _GMIC_QT_NOTEPARAMETER_H_ +#endif // GMIC_QT_NOTEPARAMETER_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/PointParameter.cpp gmic-2.9.2/gmic-qt/src/FilterParameters/PointParameter.cpp --- gmic-2.4.5/gmic-qt/src/FilterParameters/PointParameter.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/PointParameter.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -60,7 +60,6 @@ _connected = false; _defaultRemovedStatus = false; _radius = KeypointList::Keypoint::DefaultRadius; - _visible = true; _keepOpacityWhenSelected = false; _removed = false; setRemoved(false); @@ -72,20 +71,11 @@ delete _rowCell; } -bool PointParameter::isVisible() const +bool PointParameter::addTo(QWidget * widget, int row) { - return _visible; -} - -void PointParameter::addTo(QWidget * widget, int row) -{ - if (!_visible) { - return; - } - auto grid = dynamic_cast(widget->layout()); - if (!grid) { - return; - } + _grid = dynamic_cast(widget->layout()); + Q_ASSERT_X(_grid, __PRETTY_FUNCTION__, "No grid layout in widget"); + _row = row; delete _label; delete _rowCell; @@ -121,8 +111,8 @@ _spinBoxY->setRange(-200.0, 300.0); _spinBoxX->setValue(_position.x()); _spinBoxY->setValue(_position.y()); - grid->addWidget(_label = new QLabel(_name, widget), row, 0, 1, 1); - grid->addWidget(_rowCell, row, 1, 1, 2); + _grid->addWidget(_label = new QLabel(_name, widget), row, 0, 1, 1); + _grid->addWidget(_rowCell, row, 1, 1, 2); #ifdef _GMIC_QT_DEBUG_ _label->setToolTip(QString("Burst: %1").arg(_burst ? "on" : "off")); @@ -130,6 +120,7 @@ setRemoved(_removed); connectSpinboxes(); + return true; } void PointParameter::addToKeypointList(KeypointList & list) const @@ -183,21 +174,35 @@ } _removed = (_removable && xNaN && yNaN); - if (_spinBoxX) { - disconnectSpinboxes(); - if (_removeButton) { - setRemoved(_removed); - _removeButton->setChecked(_removed); - } - if (!_removed) { - _spinBoxX->setValue(_position.x()); - _spinBoxY->setValue(_position.y()); - } - connectSpinboxes(); - } + updateView(); + } +} + +void PointParameter::setVisibilityState(AbstractParameter::VisibilityState state) +{ + AbstractParameter::setVisibilityState(state); + if (state & VisibleParameter) { + updateView(); } } +void PointParameter::updateView() +{ + if (not _spinBoxX) { + return; + } + disconnectSpinboxes(); + if (_removeButton) { + setRemoved(_removed); + _removeButton->setChecked(_removed); + } + if (!_removed) { + _spinBoxX->setValue(_position.x()); + _spinBoxY->setValue(_position.y()); + } + connectSpinboxes(); +} + void PointParameter::reset() { _position = _defaultPosition; @@ -216,6 +221,9 @@ bool PointParameter::initFromText(const char * text, int & textLength) { QList list = parseText("point", text, textLength); + if (list.isEmpty()) { + return false; + } _name = HtmlTranslator::html2txt(list[0]); QList params = list[1].split(","); @@ -228,11 +236,10 @@ _burst = false; _removable = false; _radius = KeypointList::Keypoint::DefaultRadius; - _visible = true; _keepOpacityWhenSelected = false; - float x = 50.0; - float y = 50.0; + float x = 50.0f; + float y = 50.0f; _removed = false; bool xNaN = true; bool yNaN = true; @@ -259,8 +266,8 @@ } } - _defaultPosition.setX(x); - _defaultPosition.setY(y); + _defaultPosition.setX(static_cast(x)); + _defaultPosition.setY(static_cast(y)); _removed = _defaultRemovedStatus = (xNaN || yNaN); if (params.size() >= 3) { @@ -334,21 +341,15 @@ if (params.size() >= 9) { QString s = params[8].trimmed(); - float radius; if (s.endsWith("%")) { s.chop(1); - radius = -s.toFloat(&ok); + _radius = -s.toFloat(&ok); } else { - radius = s.toFloat(&ok); + _radius = s.toFloat(&ok); } if (!ok) { return false; } - _radius = static_cast(radius); - } - - if ((params.size() >= 10) && (params[9].trimmed() == "0")) { - _visible = false; } _position = _defaultPosition; diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/PointParameter.h gmic-2.9.2/gmic-qt/src/FilterParameters/PointParameter.h --- gmic-2.4.5/gmic-qt/src/FilterParameters/PointParameter.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/PointParameter.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_POINTPARAMETER_H_ -#define _GMIC_QT_POINTPARAMETER_H_ +#ifndef GMIC_QT_POINTPARAMETER_H +#define GMIC_QT_POINTPARAMETER_H #include #include @@ -42,9 +42,8 @@ Q_OBJECT public: PointParameter(QObject * parent = nullptr); - ~PointParameter(); - bool isVisible() const override; - void addTo(QWidget *, int row) override; + ~PointParameter() override; + bool addTo(QWidget *, int row) override; void addToKeypointList(KeypointList &) const override; void extractPositionFromKeypointList(KeypointList &) override; QString textValue() const override; @@ -55,6 +54,8 @@ static void resetDefaultColorIndex(); + void setVisibilityState(AbstractParameter::VisibilityState state) override; + public slots: void enableNotifications(bool); @@ -67,6 +68,7 @@ void connectSpinboxes(); void disconnectSpinboxes(); void pickColorFromDefaultColormap(); + void updateView(); QString _name; QPointF _defaultPosition; bool _defaultRemovedStatus; @@ -74,8 +76,7 @@ QColor _color; bool _removable; bool _burst; - int _radius; - bool _visible; + float _radius; bool _keepOpacityWhenSelected; QLabel * _label; @@ -93,4 +94,4 @@ static unsigned long _randomSeed; }; -#endif // _GMIC_QT_POINTPARAMETER_H_ +#endif // GMIC_QT_POINTPARAMETER_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/SeparatorParameter.cpp gmic-2.9.2/gmic-qt/src/FilterParameters/SeparatorParameter.cpp --- gmic-2.4.5/gmic-qt/src/FilterParameters/SeparatorParameter.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/SeparatorParameter.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -36,12 +36,11 @@ delete _frame; } -void SeparatorParameter::addTo(QWidget * widget, int row) +bool SeparatorParameter::addTo(QWidget * widget, int row) { - auto grid = dynamic_cast(widget->layout()); - if (!grid) { - return; - } + _grid = dynamic_cast(widget->layout()); + Q_ASSERT_X(_grid, __PRETTY_FUNCTION__, "No grid layout in widget"); + _row = row; delete _frame; _frame = new QFrame(widget); QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); @@ -54,12 +53,13 @@ if (DialogSettings::darkThemeEnabled()) { _frame->setStyleSheet("QFrame{ border-top: 0px none #a0a0a0; border-bottom: 2px solid rgb(160,160,160);}"); } - grid->addWidget(_frame, row, 0, 1, 3); + _grid->addWidget(_frame, row, 0, 1, 3); + return true; } QString SeparatorParameter::textValue() const { - return QString::null; + return QString(); } void SeparatorParameter::setValue(const QString &) {} diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/SeparatorParameter.h gmic-2.9.2/gmic-qt/src/FilterParameters/SeparatorParameter.h --- gmic-2.4.5/gmic-qt/src/FilterParameters/SeparatorParameter.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/SeparatorParameter.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_SEPARATORPARAMETER_H_ -#define _GMIC_QT_SEPARATORPARAMETER_H_ +#ifndef GMIC_QT_SEPARATORPARAMETER_H +#define GMIC_QT_SEPARATORPARAMETER_H #include "AbstractParameter.h" class QFrame; @@ -32,8 +32,8 @@ Q_OBJECT public: SeparatorParameter(QObject * parent = nullptr); - ~SeparatorParameter(); - void addTo(QWidget *, int row) override; + ~SeparatorParameter() override; + bool addTo(QWidget *, int row) override; QString textValue() const override; void setValue(const QString & value) override; void reset() override; @@ -43,4 +43,4 @@ QFrame * _frame; }; -#endif // _GMIC_QT_SEPARATORPARAMETER_H_ +#endif // GMIC_QT_SEPARATORPARAMETER_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/TextParameter.cpp gmic-2.9.2/gmic-qt/src/FilterParameters/TextParameter.cpp --- gmic-2.4.5/gmic-qt/src/FilterParameters/TextParameter.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/TextParameter.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -49,12 +49,11 @@ delete _label; } -void TextParameter::addTo(QWidget * widget, int row) +bool TextParameter::addTo(QWidget * widget, int row) { - auto grid = dynamic_cast(widget->layout()); - if (!grid) { - return; - } + _grid = dynamic_cast(widget->layout()); + Q_ASSERT_X(_grid, __PRETTY_FUNCTION__, "No grid layout in widget"); + _row = row; delete _label; delete _lineEdit; delete _textEdit; @@ -62,17 +61,18 @@ _label = nullptr; _lineEdit = nullptr; _textEdit = new MultilineTextParameterWidget(_name, _value, widget); - grid->addWidget(_textEdit, row, 0, 1, 3); + _grid->addWidget(_textEdit, row, 0, 1, 3); } else { - grid->addWidget(_label = new QLabel(_name, widget), row, 0, 1, 1); + _grid->addWidget(_label = new QLabel(_name, widget), row, 0, 1, 1); _lineEdit = new QLineEdit(_value, widget); _textEdit = nullptr; - grid->addWidget(_lineEdit, row, 1, 1, 2); + _grid->addWidget(_lineEdit, row, 1, 1, 2); #if QT_VERSION >= 0x050200 _updateAction = _lineEdit->addAction(LOAD_ICON("view-refresh"), QLineEdit::TrailingPosition); #endif } connectEditor(); + return true; } QString TextParameter::textValue() const @@ -114,6 +114,9 @@ bool TextParameter::initFromText(const char * text, int & textLength) { QStringList list = parseText("text", text, textLength); + if (list.isEmpty()) { + return false; + } _name = HtmlTranslator::html2txt(list[0]); QString value = list[1]; _multiline = false; diff -Nru gmic-2.4.5/gmic-qt/src/FilterParameters/TextParameter.h gmic-2.9.2/gmic-qt/src/FilterParameters/TextParameter.h --- gmic-2.4.5/gmic-qt/src/FilterParameters/TextParameter.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterParameters/TextParameter.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_TEXTPARAMETER_H_ -#define _GMIC_QT_TEXTPARAMETER_H_ +#ifndef GMIC_QT_TEXTPARAMETER_H +#define GMIC_QT_TEXTPARAMETER_H #include #include "AbstractParameter.h" @@ -38,8 +38,8 @@ Q_OBJECT public: TextParameter(QObject * parent = nullptr); - ~TextParameter(); - void addTo(QWidget *, int row) override; + ~TextParameter() override; + bool addTo(QWidget *, int row) override; QString textValue() const override; QString unquotedTextValue() const override; void setValue(const QString & value) override; @@ -64,4 +64,4 @@ bool _connected; }; -#endif // _GMIC_QT_TEXTPARAMETER_H_ +#endif // GMIC_QT_TEXTPARAMETER_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterSelector/FavesModel.cpp gmic-2.9.2/gmic-qt/src/FilterSelector/FavesModel.cpp --- gmic-2.4.5/gmic-qt/src/FilterSelector/FavesModel.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSelector/FavesModel.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -71,12 +71,12 @@ return _faves.size(); } -FavesModel::const_iterator FavesModel::findFaveFromHash(const QString & hash) +FavesModel::const_iterator FavesModel::findFaveFromHash(const QString & hash) const { return {_faves.find(hash)}; } -const FavesModel::Fave & FavesModel::getFaveFromHash(const QString & hash) +const FavesModel::Fave & FavesModel::getFaveFromHash(const QString & hash) const { Q_ASSERT_X(_faves.contains(hash), "getFaveFromHash", "Hash not found"); return _faves.find(hash).value(); @@ -150,6 +150,12 @@ return *this; } +FavesModel::Fave & FavesModel::Fave::setDefaultVisibilities(const QList & defaultVisibilities) +{ + _defaultVisibilityStates = defaultVisibilities; + return *this; +} + FavesModel::Fave & FavesModel::Fave::build() { QCryptographicHash hash(QCryptographicHash::Md5); @@ -168,46 +174,51 @@ return *this; } -QString FavesModel::Fave::name() const +const QString & FavesModel::Fave::name() const { return _name; } -QString FavesModel::Fave::plainText() const +const QString & FavesModel::Fave::plainText() const { return _plainText; } -QString FavesModel::Fave::originalName() const +const QString & FavesModel::Fave::originalName() const { return _originalName; } -QString FavesModel::Fave::originalHash() const +const QString & FavesModel::Fave::originalHash() const { return _originalHash; } -QString FavesModel::Fave::command() const +const QString & FavesModel::Fave::command() const { return _command; } -QString FavesModel::Fave::previewCommand() const +const QString & FavesModel::Fave::previewCommand() const { return _previewCommand; } -QString FavesModel::Fave::hash() const +const QString & FavesModel::Fave::hash() const { return _hash; } -QList FavesModel::Fave::defaultValues() const +const QList & FavesModel::Fave::defaultValues() const { return _defaultValues; } +const QList & FavesModel::Fave::defaultVisibilityStates() const +{ + return _defaultVisibilityStates; +} + QString FavesModel::Fave::toString() const { return QString("(name='%1', command='%2', previewCommand='%3'," diff -Nru gmic-2.4.5/gmic-qt/src/FilterSelector/FavesModel.h gmic-2.9.2/gmic-qt/src/FilterSelector/FavesModel.h --- gmic-2.4.5/gmic-qt/src/FilterSelector/FavesModel.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSelector/FavesModel.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_FAVESMODEL_H_ -#define _GMIC_QT_FAVESMODEL_H_ +#ifndef GMIC_QT_FAVESMODEL_H +#define GMIC_QT_FAVESMODEL_H #include #include #include @@ -39,16 +39,18 @@ Fave & setPreviewCommand(const QString & command); Fave & setOriginalHash(const QString & hash); Fave & setDefaultValues(const QList & defaultValues); + Fave & setDefaultVisibilities(const QList & defaultVisibilityStates); Fave & build(); - QString name() const; - QString plainText() const; - QString originalName() const; - QString originalHash() const; - QString command() const; - QString previewCommand() const; - QString hash() const; - QList defaultValues() const; + const QString & name() const; + const QString & plainText() const; + const QString & originalName() const; + const QString & originalHash() const; + const QString & command() const; + const QString & previewCommand() const; + const QString & hash() const; + const QList & defaultValues() const; + const QList & defaultVisibilityStates() const; QString toString() const; bool matchKeywords(const QList & keywords) const; @@ -61,6 +63,7 @@ QString _hash; QString _originalHash; QList _defaultValues; + QList _defaultVisibilityStates; }; class const_iterator { @@ -89,8 +92,8 @@ bool contains(const QString & hash) const; void flush() const; size_t faveCount() const; - const_iterator findFaveFromHash(const QString &); - const Fave & getFaveFromHash(const QString & hash); + const_iterator findFaveFromHash(const QString &) const; + const Fave & getFaveFromHash(const QString & hash) const; QString uniqueName(const QString & name, const QString & faveHashToIgnore); static const size_t NoIndex; @@ -120,4 +123,4 @@ { return FavesModel::const_iterator(_faves.end()); } -#endif // _GMIC_QT_FAVESMODEL_H_ +#endif // GMIC_QT_FAVESMODEL_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterSelector/FavesModelReader.cpp gmic-2.9.2/gmic-qt/src/FilterSelector/FavesModelReader.cpp --- gmic-2.4.5/gmic-qt/src/FilterSelector/FavesModelReader.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSelector/FavesModelReader.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -36,12 +36,11 @@ #include #include "Common.h" #include "FilterSelector/FavesModel.h" +#include "Logger.h" #include "Utils.h" #include "gmic.h" -FavesModelReader::FavesModelReader(FavesModel & model) : _model(model) -{ -} +FavesModelReader::FavesModelReader(FavesModel & model) : _model(model) {} bool FavesModelReader::gmicGTKFaveFileAvailable() { @@ -62,6 +61,12 @@ defaultParameters.push_back(value.toString()); } fave.setDefaultValues(defaultParameters); + QList defaultVisibilities; + array = object.value("defaultVisibilities").toArray(); + for (const QJsonValueRef & value : array) { + defaultVisibilities.push_back(value.toInt()); + } + fave.setDefaultVisibilities(defaultVisibilities); fave.build(); return fave; } @@ -95,12 +100,12 @@ fave.build(); _model.addFave(fave); } else { - std::cerr << "[gmic-qt] Error: Import failed for fave at gimp_faves:" << lineNumber << "\n"; + Logger::error(QString("Import failed for fave at %1:%2").arg(file.fileName()).arg(lineNumber)); } ++lineNumber; } } else { - qWarning() << "[gmic-qt] Error: Import failed. Cannot open" << filename; + Logger::error("Import failed. Cannot open " + filename); } } @@ -120,11 +125,11 @@ _model.addFave(jsonObjectToFave(value.toObject())); } } else { - qWarning() << "[gmic-qt] Error loading faves (parse error) : " << jsonFilename; - qWarning() << "[gmic-qt]" << parseError.errorString(); + Logger::error("Cannot load faves (parse error) : " + jsonFilename); + Logger::error(parseError.errorString()); } } else { - qWarning() << "[gmic-qt] Error: Faves loading failed: Cannot open" << jsonFilename; + Logger::log("Faves loading failed: Cannot open " + jsonFilename); } return; } @@ -144,7 +149,8 @@ for (QString & str : list) { str.replace(QChar(gmic_lbrace), QString("{")); str.replace(QChar(gmic_rbrace), QString("}")); - str.replace(QChar(gmic_newline), QString("\n")); + // (29 == gmic_newline) until gmic version 2.7.1 + str.replace(QChar(29), QString("\n")); } if (list.size() >= 4) { FavesModel::Fave fave; @@ -160,13 +166,13 @@ fave.build(); _model.addFave(fave); } else { - std::cerr << "[gmic-qt] Error: Loading failed for fave at gmic_qt_faves:" << lineNumber << "\n"; + Logger::log(QString("Loading failed for fave at %1:%2").arg(file.fileName()).arg(lineNumber)); } } ++lineNumber; } } else { - qWarning() << "[gmic-qt] Error: Loading failed. Cannot open" << filename; + Logger::error("Fave loading failed. Cannot open " + filename); } } } diff -Nru gmic-2.4.5/gmic-qt/src/FilterSelector/FavesModelReader.h gmic-2.9.2/gmic-qt/src/FilterSelector/FavesModelReader.h --- gmic-2.4.5/gmic-qt/src/FilterSelector/FavesModelReader.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSelector/FavesModelReader.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_FAVESMODELREADER_H_ -#define _GMIC_QT_FAVESMODELREADER_H_ +#ifndef GMIC_QT_FAVESMODELREADER_H +#define GMIC_QT_FAVESMODELREADER_H #include #include "FilterSelector/FavesModel.h" @@ -42,4 +42,4 @@ FavesModel & _model; }; -#endif // _GMIC_QT_FAVESMODELREADER_H_ +#endif // GMIC_QT_FAVESMODELREADER_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterSelector/FavesModelWriter.cpp gmic-2.9.2/gmic-qt/src/FilterSelector/FavesModelWriter.cpp --- gmic-2.4.5/gmic-qt/src/FilterSelector/FavesModelWriter.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSelector/FavesModelWriter.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -30,11 +30,10 @@ #include #include #include +#include "Logger.h" #include "Utils.h" -FavesModelWriter::FavesModelWriter(const FavesModel & model) : _model(model) -{ -} +FavesModelWriter::FavesModelWriter(const FavesModel & model) : _model(model) {} FavesModelWriter::~FavesModelWriter() = default; @@ -63,7 +62,7 @@ QFile::remove(obsoleteFilename + ".bak"); } } else { - std::cerr << "[gmic_qt] Error: cannot open/create file " << jsonFilename.toStdString() << std::endl; + Logger::error("Cannot open/create file " + jsonFilename); } } @@ -74,10 +73,15 @@ object["originalName"] = fave.originalName(); object["command"] = fave.command(); object["preview"] = fave.previewCommand(); - QJsonArray array; + QJsonArray params; for (const QString & str : fave.defaultValues()) { - array.push_back(str); + params.push_back(str); + } + object["defaultParameters"] = params; + QJsonArray visibilities; + for (const int & visibility : fave.defaultVisibilityStates()) { + visibilities.push_back(visibility); } - object["defaultParameters"] = array; + object["defaultVisibilities"] = visibilities; return object; } diff -Nru gmic-2.4.5/gmic-qt/src/FilterSelector/FavesModelWriter.h gmic-2.9.2/gmic-qt/src/FilterSelector/FavesModelWriter.h --- gmic-2.4.5/gmic-qt/src/FilterSelector/FavesModelWriter.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSelector/FavesModelWriter.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_FAVESMODELWRITER_H_ -#define _GMIC_QT_FAVESMODELWRITER_H_ +#ifndef GMIC_QT_FAVESMODELWRITER_H +#define GMIC_QT_FAVESMODELWRITER_H #include #include "FilterSelector/FavesModel.h" @@ -39,4 +39,4 @@ static QJsonObject faveToJsonObject(const FavesModel::Fave & fave); const FavesModel & _model; }; -#endif // _GMIC_QT_FAVESMODELWRITER_H_ +#endif // GMIC_QT_FAVESMODELWRITER_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersModel.cpp gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersModel.cpp --- gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersModel.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersModel.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -159,6 +159,12 @@ return *this; } +FiltersModel::Filter & FiltersModel::Filter::setDefaultInputMode(GmicQt::InputMode mode) +{ + _defaultInputMode = mode; + return *this; +} + FiltersModel::Filter & FiltersModel::Filter::build() { // @@ -234,6 +240,11 @@ return _isWarning; } +GmicQt::InputMode FiltersModel::Filter::defaultInputMode() const +{ + return _defaultInputMode; +} + bool FiltersModel::Filter::matchKeywords(const QList & keywords) const { QList::const_iterator itKeyword = keywords.cbegin(); diff -Nru gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersModel.h gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersModel.h --- gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersModel.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersModel.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,13 +22,14 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_FILTERSMODEL_H_ -#define _GMIC_QT_FILTERSMODEL_H_ +#ifndef GMIC_QT_FILTERSMODEL_H +#define GMIC_QT_FILTERSMODEL_H #include #include #include #include #include +#include "gmic_qt.h" class FiltersModel { public: @@ -43,6 +44,7 @@ Filter & setAccurateIfZoomed(bool accurate); Filter & setPath(const QList & path); Filter & setWarningFlag(bool flag); + Filter & setDefaultInputMode(GmicQt::InputMode); Filter & build(); QString name() const; @@ -56,6 +58,7 @@ float previewFactor() const; bool isAccurateIfZoomed() const; bool isWarning() const; + GmicQt::InputMode defaultInputMode() const; bool matchKeywords(const QList & keywords) const; bool matchFullPath(const QList & path) const; @@ -67,6 +70,7 @@ QList _plainPath; QString _command; QString _previewCommand; + GmicQt::InputMode _defaultInputMode; QString _parameters; float _previewFactor; bool _isAccurateIfZoomed; @@ -112,4 +116,4 @@ QMap _hash2filter; }; -#endif // _GMIC_QT_FILTERSMODEL_H_ +#endif // GMIC_QT_FILTERSMODEL_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersModelReader.cpp gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersModelReader.cpp --- gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersModelReader.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersModelReader.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -46,7 +46,7 @@ { TIMING; QBuffer stdlib(&stdlibArray); - stdlib.open(QBuffer::ReadOnly); + stdlib.open(QBuffer::ReadOnly | QBuffer::Text); QList filterPath; QString language = LanguageSelectionWidget::configuredTranslator(); @@ -54,28 +54,29 @@ language = "void"; } - // Use _en locale if not localization for the language is found. - if (!stdlibArray.startsWith(QString("#@gui_%1").arg(language).toLocal8Bit()) && !stdlibArray.contains(QString("\n#@gui_%1").arg(language).toLocal8Bit())) { + // Use _en locale if no localization for the language is found. + QByteArray localePrefix = QString("#@gui_%1").arg(language).toLocal8Bit(); + if (!textIsPrecededBySpacesInSomeLineOfArray(localePrefix, stdlibArray)) { language = "en"; } QString buffer = readBufferLine(stdlib); QString line; - QRegExp folderRegexpNoLanguage("^#@gui[ ][^:]+$"); - QRegExp folderRegexpLanguage(QString("^#@gui_%1[ ][^:]+$").arg(language)); + QRegExp folderRegexpNoLanguage("^\\s*#@gui[ ][^:]+$"); + QRegExp folderRegexpLanguage(QString("^\\s*#@gui_%1[ ][^:]+$").arg(language)); - QRegExp filterRegexpNoLanguage("^#@gui[ ][^:]+[ ]*:.*"); - QRegExp filterRegexpLanguage(QString("^#@gui_%1[ ][^:]+[ ]*:.*").arg(language)); - - QRegExp hideCommandRegExp(QString("^#@gui_%1[ ]+hide\\((.*)\\)").arg(language)); + QRegExp filterRegexpNoLanguage("^\\s*#@gui[ ][^:]+[ ]*:.*"); + QRegExp filterRegexpLanguage(QString("^\\s*#@gui_%1[ ][^:]+[ ]*:.*").arg(language)); + QRegExp hideCommandRegExp(QString("^\\s*#@gui_%1[ ]+hide\\((.*)\\)").arg(language)); + QRegExp guiComment("^\\s*#@gui"); QVector hiddenPaths; const QChar WarningPrefix('!'); do { line = buffer.trimmed(); - if (line.startsWith("#@gui")) { + if (guiComment.indexIn(line) == 0) { if (hideCommandRegExp.exactMatch(line)) { QString path = hideCommandRegExp.cap(1); hiddenPaths.push_back(path); @@ -85,7 +86,7 @@ // A folder // QString folderName = line; - folderName.replace(QRegExp("^#@gui[_a-zA-Z]{0,3}[ ]"), ""); + folderName.replace(QRegExp("^\\s*#@gui[_a-zA-Z]{0,3}[ ]"), ""); while (folderName.startsWith("_") && !filterPath.isEmpty()) { folderName.remove(0, 1); @@ -104,18 +105,25 @@ // QString filterName = line; filterName.replace(QRegExp("[ ]*:.*$"), ""); - filterName.replace(QRegExp("^#@gui[_a-zA-Z]{0,3}[ ]"), ""); - + filterName.replace(QRegExp("^\\s*#@gui[_a-zA-Z]{0,3}[ ]"), ""); const bool warning = filterName.startsWith(WarningPrefix); if (warning) { filterName.remove(0, 1); } QString filterCommands = line; - filterCommands.replace(QRegExp("^#@gui[_a-zA-Z]{0,3}[ ][^:]+[ ]*:[ ]*"), ""); + filterCommands.replace(QRegExp("^\\s*#@gui[_a-zA-Z]{0,3}[ ][^:]+[ ]*:[ ]*"), ""); - QList commands = filterCommands.split(","); + // Extract default input mode + GmicQt::InputMode defaultInputMode = GmicQt::UnspecifiedInputMode; + QRegExp reInputMode("\\s*:\\s*([xX.*+vViI-])\\s*$"); + if (reInputMode.indexIn(filterCommands) != -1) { + QString mode = reInputMode.cap(1); + filterCommands.remove(reInputMode); + defaultInputMode = symbolToInputMode(mode); + } + QList commands = filterCommands.split(","); QString filterCommand = commands[0].trimmed(); if (commands.isEmpty()) { commands.push_back("_none_"); @@ -145,24 +153,30 @@ // filterItem->setWarningFlag(warning); QString start = line; + start.replace(QRegExp("^\\s*"), ""); start.replace(QRegExp(" .*"), " :"); + QRegExp startRegexp(QString("^\\s*%1").arg(start)); // Read parameters QString parameters; do { buffer = readBufferLine(stdlib); - if (buffer.startsWith(start)) { + if (startRegexp.indexIn(buffer) == 0) { QString parameterLine = buffer; - parameterLine.replace(QRegExp("^#@gui[_a-zA-Z]{0,3}[ ]*:[ ]*"), ""); + parameterLine.replace(QRegExp("^\\s*#@gui[_a-zA-Z]{0,3}[ ]*:[ ]*"), ""); parameters += parameterLine; } - } while ((buffer.startsWith(start) || buffer.startsWith("#") || (buffer.trimmed().isEmpty() && !stdlib.atEnd())) && !folderRegexpNoLanguage.exactMatch(buffer) && - !folderRegexpLanguage.exactMatch(buffer) && !filterRegexpNoLanguage.exactMatch(buffer) && !filterRegexpLanguage.exactMatch(buffer)); + } while (!stdlib.atEnd() // + && !folderRegexpNoLanguage.exactMatch(buffer) // + && !folderRegexpLanguage.exactMatch(buffer) // + && !filterRegexpNoLanguage.exactMatch(buffer) // + && !filterRegexpLanguage.exactMatch(buffer)); FiltersModel::Filter filter; filter.setName(filterName); filter.setCommand(filterCommand); filter.setPreviewCommand(filterPreviewCommand); + filter.setDefaultInputMode(defaultInputMode); filter.setPreviewFactor(previewFactor); filter.setAccurateIfZoomed(accurateIfZoomed); filter.setParameters(parameters); @@ -184,21 +198,96 @@ QList pathList = path.split("/", QString::SkipEmptyParts); _model.removePath(pathList); if (_model.filterCount() == count) { - Logger::log(QString("[%1]./warning/ While hidding filter, name or path not found: \"%2\"\n").arg(GmicQt::pluginCodeName()).arg(path)); + Logger::warning(QString("While hiding filter, name or path not found: \"%1\"").arg(path)); } } TIMING; } +bool FiltersModelReader::textIsPrecededBySpacesInSomeLineOfArray(const QByteArray & text, const QByteArray & array) +{ + if (text.isEmpty()) { + return false; + } + int from = 0; + int position; + const char * data = array.constData(); + while ((position = array.indexOf(text, from)) != -1) { + int index = position - 1; + while ((index >= 0) && (data[index] != '\n') && (data[index] <= ' ')) { + --index; + } + if ((index < 0) || (data[index] == '\n')) { + return true; + } + from = position + 1; + } + return false; +} + +GmicQt::InputMode FiltersModelReader::symbolToInputMode(const QString & str) +{ + if (str.length() != 1) { + Logger::warning(QString("'%1' is not recognized as a default input mode (should be a single symbol/letter)").arg(str)); + return GmicQt::UnspecifiedInputMode; + } + switch (str.toLocal8Bit()[0]) { + case 'x': + case 'X': + return GmicQt::NoInput; + case '.': + return GmicQt::Active; + case '*': + return GmicQt::All; + case '-': + return GmicQt::ActiveAndAbove; + case '+': + return GmicQt::ActiveAndBelow; + case 'V': + case 'v': + return GmicQt::AllVisible; + case 'I': + case 'i': + return GmicQt::AllInvisible; + default: + Logger::warning(QString("'%1' is not recognized as a default input mode").arg(str)); + return GmicQt::UnspecifiedInputMode; + } +} + QString FiltersModelReader::readBufferLine(QBuffer & buffer) { - // QBuffer::readline(max_size) may be very slow, in debug mode, when max_size is too big (e.g. 1MB). - // We read large lines in multiple calls. + // QBuffer::readline(max_size) may be very slow, in debug mode, when max_size + // is too big (e.g. 1MB). We read large lines in multiple calls. QString result; QString text; + QRegExp commentStart("^\\s*#"); do { text = buffer.readLine(1024); result.append(text); } while (!text.isEmpty() && !text.endsWith("\n")); + + // Merge comment lines ending with '\' + if (commentStart.indexIn(result) == 0) { + while (result.endsWith("\\\n")) { + QString nextLinePeek = buffer.peek(1024); + if (commentStart.indexIn(nextLinePeek) == -1) { + return result; + } + const QString nextCommentPrefix = commentStart.cap(0); + result.chop(2); + QString nextLine; + do { + text = buffer.readLine(1024); + nextLine.append(text); + } while (!text.isEmpty() && !text.endsWith("\n")); + int ignoreCount = nextCommentPrefix.length(); + const int limit = nextLine.length() - nextLine.endsWith("\n"); + while (ignoreCount < limit && nextLine[ignoreCount] <= ' ') { + ++ignoreCount; + } + result.append(nextLine.rightRef(nextLine.length() - ignoreCount)); + } + } return result; } diff -Nru gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersModelReader.h gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersModelReader.h --- gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersModelReader.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersModelReader.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_FILTERSMODELREADER_H_ -#define _GMIC_QT_FILTERSMODELREADER_H_ +#ifndef GMIC_QT_FILTERSMODELREADER_H +#define GMIC_QT_FILTERSMODELREADER_H #include #include "FilterSelector/FiltersModel.h" @@ -38,6 +38,8 @@ private: FiltersModel & _model; static QString readBufferLine(QBuffer &); + static bool textIsPrecededBySpacesInSomeLineOfArray(const QByteArray & text, const QByteArray & array); + static GmicQt::InputMode symbolToInputMode(const QString & str); }; -#endif // _GMIC_QT_FILTERSMODELREADER_H_ +#endif // GMIC_QT_FILTERSMODELREADER_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersPresenter.cpp gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersPresenter.cpp --- gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersPresenter.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersPresenter.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -140,12 +140,12 @@ newFave.setOriginalHash(itFilter->hash()); newFave.setOriginalName(itFilter->name()); _favesModel.addFave(newFave); - QString message = QString("\n[%1]./information/ Fave '%2' has been relinked to filter '%3'\n").arg(GmicQt::pluginCodeName()).arg(fave.name()).arg(itFilter->name()); - Logger::log(message); + QString message = QString("Fave '%1' has been relinked to filter '%2'").arg(fave.name()).arg(itFilter->name()); + Logger::log(message, "information", true); someFavesHaveBeenRelinked = true; } else { - QString message = QString("\n[%1]./warning/ Could not associate Fave '%2' to an existing filter\n").arg(GmicQt::pluginCodeName()).arg(fave.name()); - Logger::log(message); + QString message = QString("Could not associate Fave '%1' to an existing filter").arg(fave.name()); + Logger::warning(message, true); } } ++itFormerFave; @@ -167,14 +167,14 @@ favesModelWriter.writeFaves(); } -void FiltersPresenter::addSelectedFilterAsNewFave(const QList & defaultValues, GmicQt::InputOutputState inOutState) +void FiltersPresenter::addSelectedFilterAsNewFave(const QList & defaultValues, const QList & visibilityStates, GmicQt::InputOutputState inOutState) { if (_currentFilter.hash.isEmpty() || (!_filtersModel.contains(_currentFilter.hash) && !_favesModel.contains(_currentFilter.hash))) { return; } - FavesModel::Fave fave; fave.setDefaultValues(defaultValues); + fave.setDefaultVisibilities(visibilityStates); if (_filtersModel.contains(_currentFilter.hash)) { const FiltersModel::Filter & filter = _filtersModel.getFilterFromHash(_currentFilter.hash); @@ -199,7 +199,8 @@ FiltersVisibilityMap::setVisibility(fave.hash(), true); _favesModel.addFave(fave); ParametersCache::setValues(fave.hash(), defaultValues); - ParametersCache::setInputOutputState(fave.hash(), inOutState); + ParametersCache::setVisibilityStates(fave.hash(), visibilityStates); + ParametersCache::setInputOutputState(fave.hash(), inOutState, _currentFilter.defaultInputMode); _filtersView->addFave(fave.name(), fave.hash()); _filtersView->sortFaves(); _filtersView->selectFave(fave.hash()); @@ -214,6 +215,7 @@ _filtersView->preserveExpandedFolders(); } QList keywords = text.split(QChar(' '), QString::SkipEmptyParts); + rebuildFilterViewWithSelection(keywords); if (text.isEmpty()) { _filtersView->restoreExpandedFolders(); @@ -259,9 +261,7 @@ void FiltersPresenter::setInvalidFilter() { - _currentFilter.clear(); - _currentFilter.command = "skip"; - _currentFilter.previewCommand = "skip"; + _currentFilter.setInvalid(); } bool FiltersPresenter::isInvalidFilter() const @@ -295,6 +295,11 @@ _filtersView->collapseAll(); } +const QString & FiltersPresenter::errorMessage() const +{ + return _errorMessage; +} + void FiltersPresenter::removeSelectedFave() { QString hash = _filtersView->selectedFilterHash(); @@ -311,6 +316,13 @@ Q_ASSERT_X(_favesModel.contains(hash), "onFaveRenamed()", "Hash not found"); FavesModel::Fave fave = _favesModel.getFaveFromHash(hash); _favesModel.removeFave(hash); + + GmicQt::InputMode defaultInputMode = GmicQt::UnspecifiedInputMode; + if (_filtersModel.contains(fave.originalHash())) { + const FiltersModel::Filter & originalFilter = _filtersModel.getFilterFromHash(fave.originalHash()); + defaultInputMode = originalFilter.defaultInputMode(); + } + QString newName = name; if (newName.isEmpty()) { if (_filtersModel.contains(fave.originalHash())) { @@ -322,16 +334,17 @@ } else { newName = _favesModel.uniqueName(newName, QString()); } - fave.setName(newName); fave.build(); // Move parameters QList values = ParametersCache::getValues(hash); + QList visibilityStates = ParametersCache::getVisibilityStates(hash); GmicQt::InputOutputState inOutState = ParametersCache::getInputOutputState(hash); ParametersCache::remove(hash); ParametersCache::setValues(fave.hash(), values); - ParametersCache::setInputOutputState(fave.hash(), inOutState); + ParametersCache::setVisibilityStates(fave.hash(), visibilityStates); + ParametersCache::setInputOutputState(fave.hash(), inOutState, defaultInputMode); _favesModel.addFave(fave); _filtersView->updateFaveItem(hash, fave.hash(), fave.name()); @@ -366,8 +379,21 @@ onFilterChanged(_filtersView->selectedFilterHash()); } +bool FiltersPresenter::danglingFaveIsSelected() const +{ + if (!_filtersView->aFaveIsSelected()) { + return false; + } + QString hash = _filtersView->selectedFilterHash(); + if (_favesModel.contains(hash)) { + return not _filtersModel.contains(_favesModel.getFaveFromHash(hash).originalHash()); + } + return false; +} + void FiltersPresenter::setCurrentFilter(const QString & hash) { + _errorMessage.clear(); if (hash.isEmpty()) { _currentFilter.clear(); } else if (_favesModel.contains(hash)) { @@ -377,6 +403,8 @@ const FiltersModel::Filter & filter = _filtersModel.getFilterFromHash(originalHash); _currentFilter.command = fave.command(); _currentFilter.defaultParameterValues = fave.defaultValues(); + _currentFilter.defaultVisibilityStates = fave.defaultVisibilityStates(); + _currentFilter.defaultInputMode = filter.defaultInputMode(); _currentFilter.hash = hash; _currentFilter.isAFave = true; _currentFilter.name = fave.name(); @@ -385,11 +413,16 @@ _currentFilter.previewCommand = fave.previewCommand(); _currentFilter.isAccurateIfZoomed = filter.isAccurateIfZoomed(); _currentFilter.previewFactor = filter.previewFactor(); + } else { + setInvalidFilter(); + _errorMessage = tr("Cannot find this fave's original filter\n"); } } else if (_filtersModel.contains(hash)) { const FiltersModel::Filter & filter = _filtersModel.getFilterFromHash(hash); _currentFilter.command = filter.command(); _currentFilter.defaultParameterValues = ParametersCache::getValues(hash); + _currentFilter.defaultVisibilityStates = ParametersCache::getVisibilityStates(hash); + _currentFilter.defaultInputMode = filter.defaultInputMode(); _currentFilter.hash = hash; _currentFilter.isAFave = false; _currentFilter.name = filter.name(); @@ -413,6 +446,7 @@ hash.clear(); plainTextName.clear(); previewFactor = GmicQt::PreviewFactorAny; + defaultInputMode = GmicQt::UnspecifiedInputMode; isAFave = false; } diff -Nru gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersPresenter.h gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersPresenter.h --- gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersPresenter.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersPresenter.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,13 +22,14 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_FILTERSPRESENTER_H_ -#define _GMIC_QT_FILTERSPRESENTER_H_ +#ifndef GMIC_QT_FILTERSPRESENTER_H +#define GMIC_QT_FILTERSPRESENTER_H #include #include "FilterSelector/FavesModel.h" #include "FilterSelector/FiltersModel.h" #include "FilterSelector/FiltersView/FiltersView.h" #include "InputOutputState.h" +#include "gmic_qt.h" class QSettings; @@ -42,6 +43,8 @@ QString previewCommand; QString parameters; QList defaultParameterValues; + QList defaultVisibilityStates; + GmicQt::InputMode defaultInputMode; QString hash; bool isAccurateIfZoomed; float previewFactor; @@ -65,10 +68,12 @@ void readFaves(); bool allFavesAreValid() const; + bool danglingFaveIsSelected() const; + /** * @brief restoreFaveHashLinksRelease236 * Starting with release 240 of gmic, filter name capitalization has been normalized. - * For exemple : "Add grain" became "Add Grain" + * For example : "Add grain" became "Add Grain" * As a consequence, links between faves and filters based on hashes (computed in part * from the name) were broken. * This method tries to restore the links in the case when 4 faves or more are broken. @@ -76,7 +81,7 @@ void restoreFaveHashLinksAfterCaseChange(); void importGmicGTKFaves(); void saveFaves(); - void addSelectedFilterAsNewFave(const QList & defaultValues, GmicQt::InputOutputState inOutState); + void addSelectedFilterAsNewFave(const QList & defaultValues, const QList & visibilityStates, GmicQt::InputOutputState inOutState); void applySearchCriterion(const QString & text); void selectFilterFromHash(QString hash, bool notify); @@ -95,6 +100,8 @@ void expandAll(); void collapseAll(); + const QString & errorMessage() const; + signals: void filterSelectionChanged(); void faveAdditionRequested(QString); @@ -116,6 +123,7 @@ FavesModel _favesModel; FiltersView * _filtersView; Filter _currentFilter; + QString _errorMessage; }; -#endif // _GMIC_QT_FILTERSPRESENTER_H_ +#endif // GMIC_QT_FILTERSPRESENTER_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersView/FiltersView.cpp gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersView/FiltersView.cpp --- gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersView/FiltersView.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersView/FiltersView.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -93,7 +93,11 @@ QString title = QString("_%1_").arg(headerItem->text()); QFont font; QFontMetrics fm(font); +#if QT_VERSION_GTE(5,11) + int w = fm.horizontalAdvance(title); +#else int w = fm.width(title); +#endif ui->treeView->setColumnWidth(0, ui->treeView->width() - 2 * w); ui->treeView->setColumnWidth(1, w); } @@ -262,6 +266,12 @@ return item ? item->hash() : QString(); } +bool FiltersView::aFaveIsSelected() const +{ + FilterTreeItem * item = selectedItem(); + return item && item->isFave(); +} + void FiltersView::preserveExpandedFolders() { if (ui->treeView->model() == &_emptyModel) { @@ -273,7 +283,7 @@ void FiltersView::restoreExpandedFolders() { - expandFolders(_expandedFolderPaths, _model.invisibleRootItem()); + expandFolders(_expandedFolderPaths); } void FiltersView::loadSettings(const QSettings &) diff -Nru gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersView/FiltersView.h gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersView/FiltersView.h --- gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersView/FiltersView.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersView/FiltersView.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_FILTERSVIEW_H_ -#define _GMIC_QT_FILTERSVIEW_H_ +#ifndef GMIC_QT_FILTERSVIEW_H +#define GMIC_QT_FILTERSVIEW_H #include #include @@ -64,6 +64,7 @@ void setHeader(const QString & header); FilterTreeItem * selectedItem() const; QString selectedFilterHash() const; + bool aFaveIsSelected() const; void preserveExpandedFolders(); void restoreExpandedFolders(); @@ -129,4 +130,4 @@ QMenu * _filterContextMenu; }; -#endif // _GMIC_QT_FILTERSVIEW_H_ +#endif // GMIC_QT_FILTERSVIEW_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersView/FilterTreeAbstractItem.h gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersView/FilterTreeAbstractItem.h --- gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersView/FilterTreeAbstractItem.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersView/FilterTreeAbstractItem.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_FILTERTREEABSTRACTITEM_H_ -#define _GMIC_QT_FILTERTREEABSTRACTITEM_H_ +#ifndef GMIC_QT_FILTERTREEABSTRACTITEM_H +#define GMIC_QT_FILTERTREEABSTRACTITEM_H #include #include @@ -48,4 +48,4 @@ bool _isWarning; }; -#endif // _GMIC_QT_FILTERTREEABSTRACTITEM_H_ +#endif // GMIC_QT_FILTERTREEABSTRACTITEM_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersView/FilterTreeFolder.h gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersView/FilterTreeFolder.h --- gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersView/FilterTreeFolder.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersView/FilterTreeFolder.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_FILTERTREEFOLDER_H_ -#define _GMIC_QT_FILTERTREEFOLDER_H_ +#ifndef GMIC_QT_FILTERTREEFOLDER_H +#define GMIC_QT_FILTERTREEFOLDER_H #include #include #include "FilterSelector/FiltersView/FilterTreeAbstractItem.h" @@ -42,4 +42,4 @@ bool _isFaveFolder; }; -#endif // _GMIC_QT_FILTERTREEFOLDER_H_ +#endif // GMIC_QT_FILTERTREEFOLDER_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersView/FilterTreeItemDelegate.h gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersView/FilterTreeItemDelegate.h --- gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersView/FilterTreeItemDelegate.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersView/FilterTreeItemDelegate.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_FILTERTREEITEMDELEGATE_H_ -#define _GMIC_QT_FILTERTREEITEMDELEGATE_H_ +#ifndef GMIC_QT_FILTERTREEITEMDELEGATE_H +#define GMIC_QT_FILTERTREEITEMDELEGATE_H #include @@ -36,4 +36,4 @@ QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const; }; -#endif // _GMIC_QT_FILTERTREEITEMDELEGATE_H_ +#endif // GMIC_QT_FILTERTREEITEMDELEGATE_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersView/FilterTreeItem.h gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersView/FilterTreeItem.h --- gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersView/FilterTreeItem.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersView/FilterTreeItem.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_FILTERTREEITEM_H_ -#define _GMIC_QT_FILTERTREEITEM_H_ +#ifndef GMIC_QT_FILTERTREEITEM_H +#define GMIC_QT_FILTERTREEITEM_H #include #include #include "FilterSelector/FiltersView/FilterTreeAbstractItem.h" @@ -45,4 +45,4 @@ bool _isWarning; }; -#endif // _GMIC_QT_FILTERTREEITEM_H_ +#endif // GMIC_QT_FILTERTREEITEM_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersView/TreeView.h gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersView/TreeView.h --- gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersView/TreeView.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersView/TreeView.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_TREEVIEW_H_ -#define _GMIC_QT_TREEVIEW_H_ +#ifndef GMIC_QT_TREEVIEW_H +#define GMIC_QT_TREEVIEW_H #include #include @@ -33,7 +33,7 @@ class TreeView : public QTreeView { Q_OBJECT public: - TreeView(QWidget * parent = 0); + TreeView(QWidget * parent = nullptr); ~TreeView(); void keyPressEvent(QKeyEvent * event) override; signals: @@ -42,4 +42,4 @@ private: }; -#endif // _GMIC_QT_TREEVIEW_H_ +#endif // GMIC_QT_TREEVIEW_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersVisibilityMap.cpp gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersVisibilityMap.cpp --- gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersVisibilityMap.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersVisibilityMap.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -30,6 +30,7 @@ #include #include "Common.h" #include "Globals.h" +#include "Logger.h" #include "Utils.h" #include "gmic_qt.h" @@ -71,7 +72,7 @@ _hiddenFilters.insert(hash); } } else { - qWarning() << "[gmic-qt] Error: reading" << file.fileName(); + Logger::error("Cannot read visibility file (" + file.fileName() + ")"); } } } @@ -95,6 +96,6 @@ file.write(qCompress(data)); file.close(); } else { - qWarning() << "[gmic-qt] Error: Cannot write" << path; + Logger::error("Cannot write " + path); } } diff -Nru gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersVisibilityMap.h gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersVisibilityMap.h --- gmic-2.4.5/gmic-qt/src/FilterSelector/FiltersVisibilityMap.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSelector/FiltersVisibilityMap.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_FILTERSVISIBILITYMAP_H_ -#define _GMIC_QT_FILTERSVISIBILITYMAP_H_ +#ifndef GMIC_QT_FILTERSVISIBILITYMAP_H +#define GMIC_QT_FILTERSVISIBILITYMAP_H #include @@ -40,4 +40,4 @@ FiltersVisibilityMap() = delete; }; -#endif // _GMIC_QT_FILTERSVISIBILITYMAP_H_ +#endif // GMIC_QT_FILTERSVISIBILITYMAP_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterSyncRunner.cpp gmic-2.9.2/gmic-qt/src/FilterSyncRunner.cpp --- gmic-2.4.5/gmic-qt/src/FilterSyncRunner.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSyncRunner.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -26,6 +26,7 @@ #include #include #include +#include "FilterThread.h" #include "GmicStdlib.h" #include "ImageConverter.h" #include "Logger.h" @@ -87,15 +88,12 @@ QStringList FilterSyncRunner::gmicStatus() const { - if (!_gmicStatus.startsWith(QChar(24)) || !_gmicStatus.endsWith(QChar(25))) { - return QStringList(); - } - QList list = _gmicStatus.split(QString("%1%2").arg(QChar(25)).arg(QChar(24))); - if (!list.isEmpty()) { - list[0].remove(0, 1); - list.back().chop(1); - } - return list; + return FilterThread::status2StringList(_gmicStatus); +} + +QList FilterSyncRunner::parametersVisibilityStates() const +{ + return FilterThread::status2Visibilities(_gmicStatus); } QString FilterSyncRunner::errorMessage() const @@ -125,7 +123,9 @@ QString FilterSyncRunner::fullCommand() const { - return QString("%1 %2").arg(_command).arg(_arguments); + QString result = _command; + GmicQt::appendWithSpace(result, _arguments); + return result; } void FilterSyncRunner::setLogSuffix(const QString & text) @@ -145,13 +145,14 @@ QString fullCommandLine; try { fullCommandLine = QString::fromLocal8Bit(GmicQt::commandFromOutputMessageMode(_messageMode)); - fullCommandLine += QString(" %1 %2").arg(_command).arg(_arguments); + GmicQt::appendWithSpace(fullCommandLine, _command); + GmicQt::appendWithSpace(fullCommandLine, _arguments); _gmicAbort = false; _gmicProgress = -1; if (_messageMode > GmicQt::Quiet) { - Logger::log(QString("\n[%1]%2 %3\n").arg(GmicQt::pluginCodeName()).arg(_logSuffix).arg(fullCommandLine)); + Logger::log(fullCommandLine, _logSuffix, true); } - gmic gmicInstance(_environment.isEmpty() ? nullptr : QString("v - %1").arg(_environment).toLocal8Bit().constData(), GmicStdLib::Array.constData(), true); + gmic gmicInstance(_environment.isEmpty() ? nullptr : QString("%1").arg(_environment).toLocal8Bit().constData(), GmicStdLib::Array.constData(), true); gmicInstance.set_variable("_host", GmicQt::HostApplicationShortname, '='); gmicInstance.set_variable("_tk", "qt", '='); gmicInstance.run(fullCommandLine.toLocal8Bit().constData(), *_images, *_imageNames, &_gmicProgress, &_gmicAbort); @@ -162,7 +163,7 @@ const char * message = e.what(); _errorMessage = message; if (_messageMode > GmicQt::Quiet) { - Logger::log(QString("\n[%1]./error/ When running command '%2', this error occured:\n%3\n").arg(GmicQt::pluginCodeName()).arg(fullCommandLine).arg(message)); + Logger::error(QString("When running command '%1', this error occurred:\n%2").arg(fullCommandLine).arg(message), true); } _failed = true; } diff -Nru gmic-2.4.5/gmic-qt/src/FilterSyncRunner.h gmic-2.9.2/gmic-qt/src/FilterSyncRunner.h --- gmic-2.4.5/gmic-qt/src/FilterSyncRunner.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterSyncRunner.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_FILTERSYNCRUNNER_H_ -#define _GMIC_QT_FILTERSYNCRUNNER_H_ +#ifndef GMIC_QT_FILTERSYNCRUNNER_H +#define GMIC_QT_FILTERSYNCRUNNER_H #include #include @@ -53,6 +53,7 @@ const cimg_library::CImgList & images() const; const cimg_library::CImgList & imageNames() const; QStringList gmicStatus() const; + QList parametersVisibilityStates() const; QString errorMessage() const; bool failed() const; bool aborted() const; @@ -79,4 +80,4 @@ GmicQt::OutputMessageMode _messageMode; }; -#endif // _GMIC_QT_FILTERSYNCRUNNER_H_ +#endif // GMIC_QT_FILTERSYNCRUNNER_H diff -Nru gmic-2.4.5/gmic-qt/src/FilterThread.cpp gmic-2.9.2/gmic-qt/src/FilterThread.cpp --- gmic-2.4.5/gmic-qt/src/FilterThread.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterThread.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -25,6 +25,7 @@ #include "FilterThread.h" #include #include +#include "FilterParameters/AbstractParameter.h" #include "GmicStdlib.h" #include "ImageConverter.h" #include "Logger.h" @@ -81,15 +82,20 @@ return *_imageNames; } -QStringList FilterThread::gmicStatus() const +QStringList FilterThread::status2StringList(const QString & status) { - if (!_gmicStatus.startsWith(QChar(24)) || !_gmicStatus.endsWith(QChar(25))) { + // Check if status matches something like "{...}{...}_1{...}_0" + QRegExp statusRegExp(QString("^") + QChar(gmic_lbrace) + "(.*)" + QChar(gmic_rbrace) + QString("(_[012][+*-]?)?$")); + QRegExp statusSeparatorRegExp(QChar(gmic_rbrace) + QString("(_[012][+*-]?)?") + QChar(gmic_lbrace)); + if (status.isEmpty()) { + return QStringList(); + } + if (statusRegExp.indexIn(status) == -1) { + // TRACE << "Warning: Incorrect status syntax " << status; return QStringList(); } - QList list = _gmicStatus.split(QString("%1%2").arg(QChar(25)).arg(QChar(24))); + QList list = statusRegExp.cap(1).split(statusSeparatorRegExp); if (!list.isEmpty()) { - list[0].remove(0, 1); - list.back().chop(1); QList::iterator it = list.begin(); while (it != list.end()) { QByteArray array = it->toLocal8Bit(); @@ -100,6 +106,52 @@ return list; } +QList FilterThread::status2Visibilities(const QString & status) +{ + if (status.isEmpty()) { + return QList(); + } + // Check if status matches something like "{...}{...}_1{...}_0" + QRegExp statusRegExp(QString("^") + QChar(gmic_lbrace) + "(.*)" + QChar(gmic_rbrace) + QString("(_[012])?$")); + if (!status.isEmpty() && statusRegExp.indexIn(status) == -1) { + // TRACE << "Incorrect status syntax " << status; + return QList(); + } + QByteArray ba = status.toLocal8Bit(); + const char * pc = ba.constData(); + const char * limit = pc + ba.size(); + + QList result; + while (pc < limit) { + if (*pc == gmic_rbrace) { + if ((pc < limit - 2) && pc[1] == '_' && pc[2] >= '0' && pc[2] <= '2' && (!pc[3] || pc[3] == gmic_lbrace)) { + auto visibilityState = static_cast(pc[2] - '0'); + result.push_back(visibilityState); + pc += 3; + } else if (!pc[1] || (pc[1] == gmic_lbrace)) { + result.push_back(AbstractParameter::UnspecifiedVisibilityState); + ++pc; + } else { + // TRACE << "Ignoring status" << qPrintable(status); + return QList(); + } + } else { + ++pc; + } + } + return result; +} + +QStringList FilterThread::gmicStatus() const +{ + return status2StringList(_gmicStatus); +} + +QList FilterThread::parametersVisibilityStates() const +{ + return status2Visibilities(_gmicStatus); +} + QString FilterThread::errorMessage() const { return _errorMessage; @@ -132,7 +184,9 @@ QString FilterThread::fullCommand() const { - return QString("%1 %2").arg(_command).arg(_arguments); + QString result = _command; + GmicQt::appendWithSpace(result, _arguments); + return result; } void FilterThread::setLogSuffix(const QString & text) @@ -153,13 +207,14 @@ QString fullCommandLine; try { fullCommandLine = QString::fromLocal8Bit(GmicQt::commandFromOutputMessageMode(_messageMode)); - fullCommandLine += QString(" %1 %2").arg(_command).arg(_arguments); + GmicQt::appendWithSpace(fullCommandLine, _command); + GmicQt::appendWithSpace(fullCommandLine, _arguments); _gmicAbort = false; _gmicProgress = -1; if (_messageMode > GmicQt::Quiet) { - Logger::log(QString("\n[%1]%2 %3\n").arg(GmicQt::pluginCodeName()).arg(_logSuffix).arg(fullCommandLine)); + Logger::log(fullCommandLine, _logSuffix, true); } - gmic gmicInstance(_environment.isEmpty() ? nullptr : QString("v - %1").arg(_environment).toLocal8Bit().constData(), GmicStdLib::Array.constData(), true); + gmic gmicInstance(_environment.isEmpty() ? nullptr : QString("%1").arg(_environment).toLocal8Bit().constData(), GmicStdLib::Array.constData(), true); gmicInstance.set_variable("_host", GmicQt::HostApplicationShortname, '='); gmicInstance.set_variable("_tk", "qt", '='); gmicInstance.run(fullCommandLine.toLocal8Bit().constData(), *_images, *_imageNames, &_gmicProgress, &_gmicAbort); @@ -170,7 +225,7 @@ const char * message = e.what(); _errorMessage = message; if (_messageMode > GmicQt::Quiet) { - Logger::log(QString("\n[%1]./error/ When running command '%2', this error occured:\n%3\n").arg(GmicQt::pluginCodeName()).arg(fullCommandLine).arg(message)); + Logger::error(QString("When running command '%1', this error occurred:\n%2").arg(fullCommandLine).arg(message), true); } _failed = true; } diff -Nru gmic-2.4.5/gmic-qt/src/FilterThread.h gmic-2.9.2/gmic-qt/src/FilterThread.h --- gmic-2.4.5/gmic-qt/src/FilterThread.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/FilterThread.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT__FILTERTHREAD_H_ -#define _GMIC_QT__FILTERTHREAD_H_ +#ifndef GMIC_QT__FILTERTHREAD_H +#define GMIC_QT__FILTERTHREAD_H #include #include @@ -52,6 +52,7 @@ const cimg_library::CImgList & images() const; const cimg_library::CImgList & imageNames() const; QStringList gmicStatus() const; + QList parametersVisibilityStates() const; QString errorMessage() const; bool failed() const; bool aborted() const; @@ -61,6 +62,9 @@ QString fullCommand() const; void setLogSuffix(const QString & text); + static QStringList status2StringList(const QString &); + static QList status2Visibilities(const QString &); + public slots: void abortGmic(); @@ -87,4 +91,4 @@ QTime _startTime; }; -#endif // _GMIC_QT__FILTERTHREAD_H_ +#endif // GMIC_QT__FILTERTHREAD_H diff -Nru gmic-2.4.5/gmic-qt/src/Globals.h gmic-2.9.2/gmic-qt/src/Globals.h --- gmic-2.4.5/gmic-qt/src/Globals.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Globals.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_GLOBALS_H_ -#define _GMIC_QT_GLOBALS_H_ +#ifndef GMIC_QT_GLOBALS_H +#define GMIC_QT_GLOBALS_H #define GMIC_QT_ORGANISATION_NAME "GREYC" #define GMIC_QT_ORGANISATION_DOMAIN "greyc.fr" @@ -56,4 +56,4 @@ #define KEYPOINTS_INTERACTIVE_MIDDLE_DELAY_MS ((KEYPOINTS_INTERACTIVE_LOWER_DELAY_MS + KEYPOINTS_INTERACTIVE_UPPER_DELAY_MS) / 2) #define KEYPOINTS_INTERACTIVE_AVERAGING_COUNT 6 -#endif // _GMIC_QT_GLOBALS_H_ +#endif // GMIC_QT_GLOBALS_H diff -Nru gmic-2.4.5/gmic-qt/src/GmicProcessor.cpp gmic-2.9.2/gmic-qt/src/GmicProcessor.cpp --- gmic-2.4.5/gmic-qt/src/GmicProcessor.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/GmicProcessor.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -54,6 +54,7 @@ _previewRandomSeed = cimg_library::cimg::_rand(); _lastAppliedCommandInOutState = GmicQt::InputOutputState::Unspecified; _filterExecutionTime.start(); + _completeFullImageProcessingCount = 0; } void GmicProcessor::init() @@ -93,7 +94,7 @@ FilterSyncRunner runner(this, _filterContext.filterName, _filterContext.filterCommand, _filterContext.filterArguments, env, _filterContext.outputMessageMode); runner.swapImages(*_gmicImages); runner.setImageNames(imageNames); - runner.setLogSuffix("./preview/"); + runner.setLogSuffix("preview"); cimg_library::cimg::srand(); _previewRandomSeed = cimg_library::cimg::_rand(); _filterExecutionTime.restart(); @@ -104,7 +105,7 @@ _filterThread = new FilterThread(this, _filterContext.filterName, _filterContext.filterCommand, _filterContext.filterArguments, env, _filterContext.outputMessageMode); _filterThread->swapImages(*_gmicImages); _filterThread->setImageNames(imageNames); - _filterThread->setLogSuffix("./preview/"); + _filterThread->setLogSuffix("preview"); connect(_filterThread, SIGNAL(finished()), this, SLOT(onPreviewThreadFinished()), Qt::QueuedConnection); cimg_library::cimg::srand(); _previewRandomSeed = cimg_library::cimg::_rand(); @@ -119,7 +120,7 @@ _filterThread = new FilterThread(this, _filterContext.filterName, _filterContext.filterCommand, _filterContext.filterArguments, env, _filterContext.outputMessageMode); _filterThread->swapImages(*_gmicImages); _filterThread->setImageNames(imageNames); - _filterThread->setLogSuffix("./apply/"); + _filterThread->setLogSuffix("apply"); connect(_filterThread, SIGNAL(finished()), this, SLOT(onApplyThreadFinished()), Qt::QueuedConnection); cimg_library::cimg::srand(_previewRandomSeed); _filterThread->start(); @@ -197,6 +198,11 @@ _gmicStatusQuotedParameters = v; } +int GmicProcessor::completedFullImageProcessingCount() const +{ + return _completeFullImageProcessingCount; +} + void GmicProcessor::cancel() { abortCurrentFilterThread(); @@ -248,6 +254,7 @@ } if (_filterThread->failed()) { _gmicStatus.clear(); + _parametersVisibilityStates.clear(); _gmicImages->assign(); QString message = _filterThread->errorMessage(); _filterThread->deleteLater(); @@ -257,6 +264,7 @@ return; } _gmicStatus = _filterThread->gmicStatus(); + _parametersVisibilityStates = _filterThread->parametersVisibilityStates(); _gmicImages->assign(); _filterThread->swapImages(*_gmicImages); for (unsigned int i = 0; i < _gmicImages->size(); ++i) { @@ -278,6 +286,7 @@ return; } _gmicStatus = _filterThread->gmicStatus(); + _parametersVisibilityStates = _filterThread->parametersVisibilityStates(); hideWaitingCursor(); if (_filterThread->failed()) { @@ -297,14 +306,15 @@ QString label = QString("[G'MIC] %1: %2").arg(_filterThread->name()).arg(_filterThread->fullCommand()); gmic_qt_output_images(*_gmicImages, _filterThread->imageNames(), _filterContext.inputOutputState.outputMode, label.toLocal8Bit().constData()); } else { - gmic_qt_output_images(*_gmicImages, _filterThread->imageNames(), _filterContext.inputOutputState.outputMode, 0); + gmic_qt_output_images(*_gmicImages, _filterThread->imageNames(), _filterContext.inputOutputState.outputMode, nullptr); } + _completeFullImageProcessingCount += 1; LayersExtentProxy::clear(); CroppedActiveLayerProxy::clear(); CroppedImageListProxy::clear(); _filterThread->deleteLater(); _filterThread = nullptr; - _lastAppliedCommandGmicStatus = _gmicStatus; + _lastAppliedCommandGmicStatus = _gmicStatus; // TODO : save visibility states? emit fullImageProcessingDone(); } } @@ -382,6 +392,7 @@ return; } _gmicStatus = runner.gmicStatus(); + _parametersVisibilityStates = runner.parametersVisibilityStates(); _gmicImages->assign(); runner.swapImages(*_gmicImages); for (unsigned int i = 0; i < _gmicImages->size(); ++i) { @@ -391,3 +402,8 @@ hideWaitingCursor(); emit previewImageAvailable(); } + +const QList & GmicProcessor::parametersVisibilityStates() const +{ + return _parametersVisibilityStates; +} diff -Nru gmic-2.4.5/gmic-qt/src/GmicProcessor.h gmic-2.9.2/gmic-qt/src/GmicProcessor.h --- gmic-2.4.5/gmic-qt/src/GmicProcessor.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/GmicProcessor.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_GMICPROCESSOR_H_ -#define _GMIC_QT_GMICPROCESSOR_H_ +#ifndef GMIC_QT_GMICPROCESSOR_H +#define GMIC_QT_GMICPROCESSOR_H #include #include @@ -36,7 +36,6 @@ #include #include #include "InputOutputState.h" -#include "PreviewMode.h" #include "gmic_qt.h" class FilterThread; class FilterSyncRunner; @@ -92,6 +91,7 @@ const cimg_library::CImg & previewImage() const; const QStringList & gmicStatus() const; + const QList & parametersVisibilityStates() const; void saveSettings(QSettings & settings); ~GmicProcessor(); @@ -106,6 +106,8 @@ void setGmicStatusQuotedParameters(const QString & v); + int completedFullImageProcessingCount() const; + public slots: void cancel(); @@ -113,7 +115,7 @@ void previewCommandFailed(QString errorMessage); void fullImageProcessingFailed(QString errorMessage); void previewImageAvailable(); - void fullImageProcessingDone(); // TODO : Use for exemple to close the window + void fullImageProcessingDone(); // TODO : Use for example to close the window void noMoreUnfinishedJobs(); void aboutToSendImagesToHost(); @@ -137,6 +139,7 @@ unsigned int _previewRandomSeed; QStringList _gmicStatus; + QList _parametersVisibilityStates; QTimer _waitingCursorTimer; static const int WAITING_CURSOR_DELAY = 200; @@ -149,6 +152,7 @@ GmicQt::InputOutputState _lastAppliedCommandInOutState; QTime _filterExecutionTime; std::deque _lastFilterPreviewExecutionDurations; + int _completeFullImageProcessingCount; }; -#endif // _GMIC_QT_GMICPROCESSOR_H_ +#endif // GMIC_QT_GMICPROCESSOR_H diff -Nru gmic-2.4.5/gmic-qt/src/gmic_qt.cpp gmic-2.9.2/gmic-qt/src/gmic_qt.cpp --- gmic-2.4.5/gmic-qt/src/gmic_qt.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/gmic_qt.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -40,6 +40,7 @@ #include "Logger.h" #include "MainWindow.h" #include "Updater.h" +#include "Widgets/InOutPanel.h" #include "Widgets/LanguageSelectionWidget.h" #include "Widgets/ProgressInfoWindow.h" #include "gmic.h" @@ -51,10 +52,10 @@ namespace GmicQt { -const InputMode DefaultInputMode = Active; -const OutputMode DefaultOutputMode = InPlace; +InputMode DefaultInputMode = Active; +OutputMode DefaultOutputMode = InPlace; +PreviewMode DefaultPreviewMode = FirstOutput; const OutputMessageMode DefaultOutputMessageMode = Quiet; - const QString & gmicVersionString() { static QString value = QString("%1.%2.%3").arg(gmic_version / 100).arg((gmic_version / 10) % 10).arg(gmic_version % 10); @@ -62,6 +63,11 @@ } } // namespace GmicQt +namespace +{ +bool pluginProcessingValidAndAccepted = false; +} + int launchPlugin() { TIMING; @@ -132,7 +138,9 @@ mainWindow.show(); } TIMING; - return QApplication::exec(); + int status = QApplication::exec(); + pluginProcessingValidAndAccepted = mainWindow.isAccepted(); + return status; } int launchPluginHeadlessUsingLastParameters() @@ -164,10 +172,13 @@ HeadlessProcessor processor; ProgressInfoWindow progressWindow(&processor); if (processor.command().isEmpty()) { + pluginProcessingValidAndAccepted = false; return 0; } processor.startProcessing(); - return QApplication::exec(); + int status = QApplication::exec(); + pluginProcessingValidAndAccepted = processor.processingCompletedProperly(); + return status; } int launchPluginHeadless(const char * command, GmicQt::InputMode input, GmicQt::OutputMode output) @@ -194,5 +205,27 @@ idle.setSingleShot(true); QObject::connect(&idle, SIGNAL(timeout()), &headlessProcessor, SLOT(startProcessing())); idle.start(); - return QCoreApplication::exec(); + int status = QCoreApplication::exec(); + pluginProcessingValidAndAccepted = headlessProcessor.processingCompletedProperly(); + return status; +} + +void disableOutputMode(GmicQt::OutputMode mode) +{ + InOutPanel::disableOutputMode(mode); +} + +void disableInputMode(GmicQt::InputMode mode) +{ + InOutPanel::disableInputMode(mode); +} + +void disablePreviewMode(GmicQt::PreviewMode mode) +{ + InOutPanel::disablePreviewMode(mode); +} + +bool pluginDialogWasAccepted() +{ + return pluginProcessingValidAndAccepted; } diff -Nru gmic-2.4.5/gmic-qt/src/gmic_qt.h gmic-2.9.2/gmic-qt/src/gmic_qt.h --- gmic-2.4.5/gmic-qt/src/gmic_qt.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/gmic_qt.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_GMIC_QT_H_ -#define _GMIC_QT_GMIC_QT_H_ +#ifndef GMIC_QT_GMIC_QT_H +#define GMIC_QT_GMIC_QT_H #ifndef gmic_pixel_type #define gmic_pixel_type float @@ -44,14 +44,14 @@ All, ActiveAndBelow, ActiveAndAbove, - AllVisibles, - AllInvisibles, - AllVisiblesDesc, - AllInvisiblesDesc, - AllDesc, + AllVisible, + AllInvisible, + AllVisiblesDesc_UNUSED, /* Removed since 2.8.2 */ + AllInvisiblesDesc_UNUSED, /* Removed since 2.8.2 */ + AllDesc_UNUSED, /* Removed since 2.8.2 */ UnspecifiedInputMode = 100 }; -extern const InputMode DefaultInputMode; +extern InputMode DefaultInputMode; enum OutputMode { @@ -61,7 +61,21 @@ NewImage, UnspecifiedOutputMode = 100 }; -extern const OutputMode DefaultOutputMode; +extern OutputMode DefaultOutputMode; + +enum PreviewMode +{ + FirstOutput, + SecondOutput, + ThirdOutput, + FourthOutput, + First2SecondOutput, + First2ThirdOutput, + First2FourthOutput, + AllOutputs, + UnspecifiedPreviewMode = 100 +}; +extern PreviewMode DefaultPreviewMode; enum OutputMessageMode { @@ -86,4 +100,15 @@ int launchPluginHeadless(const char * command, GmicQt::InputMode input, GmicQt::OutputMode output); -#endif // _GMIC_QT_GMIC_QT_H_ +bool pluginDialogWasAccepted(); + +// The following functions should be called before launching the plugin. +// Caution: at least one mode per category must remain available! + +void disableInputMode(GmicQt::InputMode mode); + +void disableOutputMode(GmicQt::OutputMode mode); + +void disablePreviewMode(GmicQt::PreviewMode mode); + +#endif // GMIC_QT_GMIC_QT_H diff -Nru gmic-2.4.5/gmic-qt/src/GmicStdlib.h gmic-2.9.2/gmic-qt/src/GmicStdlib.h --- gmic-2.4.5/gmic-qt/src/GmicStdlib.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/GmicStdlib.h 2020-09-03 11:37:05.000000000 +0000 @@ -1,6 +1,6 @@ /** -*- mode: c++ ; c-basic-offset: 2 -*- * - * @file GmicStdLib.h + * @file GmicStdlib.h * * Copyright 2017 Sebastien Fourey * @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_GMICSTDLIB_H_ -#define _GMIC_QT_GMICSTDLIB_H_ +#ifndef GMIC_QT_GMICSTDLIB_H +#define GMIC_QT_GMICSTDLIB_H #include @@ -34,4 +34,4 @@ static QByteArray Array; }; -#endif // _GMIC_QT_GMICSTDLIB_H_ +#endif // GMIC_QT_GMICSTDLIB_H diff -Nru gmic-2.4.5/gmic-qt/src/HeadlessProcessor.cpp gmic-2.9.2/gmic-qt/src/HeadlessProcessor.cpp --- gmic-2.4.5/gmic-qt/src/HeadlessProcessor.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/HeadlessProcessor.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -62,6 +62,7 @@ connect(&_timer, SIGNAL(timeout()), this, SLOT(onTimeout())); _hasProgressWindow = false; ParametersCache::load(true); + _processingCompletedProperly = false; } /** @@ -113,7 +114,7 @@ _filterThread = new FilterThread(this, _filterName, _lastCommand, _lastArguments, _lastEnvironment, _outputMessageMode); _filterThread->swapImages(*_gmicImages); _filterThread->setImageNames(imageNames); - + _processingCompletedProperly = false; connect(_filterThread, SIGNAL(finished()), this, SLOT(onProcessingFinished())); _timer.start(); _filterThread->start(); @@ -134,6 +135,11 @@ _hasProgressWindow = value; } +bool HeadlessProcessor::processingCompletedProperly() +{ + return _processingCompletedProperly; +} + void HeadlessProcessor::onTimeout() { if (!_filterThread) { @@ -183,7 +189,9 @@ gmic_list images = _filterThread->images(); if (!_filterThread->aborted()) { gmic_qt_output_images(images, _filterThread->imageNames(), _outputMode, - (_outputMessageMode == GmicQt::VerboseLayerName) ? QString("[G'MIC] %1: %2").arg(_filterThread->name()).arg(_filterThread->fullCommand()).toLocal8Bit().constData() : nullptr); + (_outputMessageMode == GmicQt::VerboseLayerName) ? QString("[G'MIC] %1: %2").arg(_filterThread->name()).arg(_filterThread->fullCommand()).toLocal8Bit().constData() + : nullptr); + _processingCompletedProperly = true; } } _filterThread->deleteLater(); diff -Nru gmic-2.4.5/gmic-qt/src/HeadlessProcessor.h gmic-2.9.2/gmic-qt/src/HeadlessProcessor.h --- gmic-2.4.5/gmic-qt/src/HeadlessProcessor.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/HeadlessProcessor.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_HEADLESSPROCESSOR_H_ -#define _GMIC_QT_HEADLESSPROCESSOR_H_ +#ifndef GMIC_QT_HEADLESSPROCESSOR_H +#define GMIC_QT_HEADLESSPROCESSOR_H #include #include @@ -54,12 +54,13 @@ * * @param parent */ - explicit HeadlessProcessor(QObject * parent = 0); + explicit HeadlessProcessor(QObject * parent = nullptr); ~HeadlessProcessor(); QString command() const; QString filterName() const; void setProgressWindowFlag(bool); + bool processingCompletedProperly(); public slots: void startProcessing(); @@ -85,6 +86,7 @@ bool _hasProgressWindow; QTimer _singleShotTimer; QString _gmicStatusQuotedParameters; + bool _processingCompletedProperly; }; -#endif // _GMIC_QT_HEADLESSPROCESSOR_H_ +#endif // GMIC_QT_HEADLESSPROCESSOR_H diff -Nru gmic-2.4.5/gmic-qt/src/Host/digiKam/gmicqttoolplugin.cpp gmic-2.9.2/gmic-qt/src/Host/digiKam/gmicqttoolplugin.cpp --- gmic-2.4.5/gmic-qt/src/Host/digiKam/gmicqttoolplugin.cpp 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Host/digiKam/gmicqttoolplugin.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -0,0 +1,164 @@ +/* +* This file is part of G'MIC-Qt, a generic plug-in for raster graphics +* editors, offering hundreds of filters thanks to the underlying G'MIC +* image processing framework. +* +* Copyright (C) 2019 Gilles Caulier +* +* Description: digiKam image editor plugin for GmicQt. +* +* G'MIC-Qt 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. +* +* G'MIC-Qt is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +*/ + +#include "gmicqttoolplugin.h" + +// Qt includes + +#include +#include +#include +#include +#include + +// Local includes + +#include "MainWindow.h" +#include "Widgets/LanguageSelectionWidget.h" +#include "DialogSettings.h" +#include "gmic_qt.h" + +namespace DigikamEditorGmicQtPlugin +{ + +GmicQtToolPlugin::GmicQtToolPlugin(QObject* const parent) + : DPluginEditor(parent) +{ +} + +GmicQtToolPlugin::~GmicQtToolPlugin() +{ +} + +QString GmicQtToolPlugin::name() const +{ + return QString::fromUtf8("GmicQt"); +} + +QString GmicQtToolPlugin::iid() const +{ + return QLatin1String(DPLUGIN_IID); +} + +QIcon GmicQtToolPlugin::icon() const +{ + return QIcon(":resources/gmic_hat.png"); +} + +QString GmicQtToolPlugin::description() const +{ + return tr("A tool for G'MIC-Qt"); +} + +QString GmicQtToolPlugin::details() const +{ + return tr("

This Image Editor tool for G'MIC-Qt.

" + "

G'MIC-Qt is a versatile front-end to the image processing framework G'MIC

" + "

G'MIC is a full-featured open-source framework for image processing. " + "It provides several user interfaces to convert / manipulate / filter / " + "visualize generic image datasets, ranging from 1D scalar signals to 3D+t sequences " + "of multi-spectral volumetric images, hence including 2D color images.

" + "

More details: https://gmic.eu/

"); +} + +QList GmicQtToolPlugin::authors() const +{ + return QList() + << DPluginAuthor(QString::fromUtf8("Gilles Caulier"), + QString::fromUtf8("caulier dot gilles at gmail dot com"), + QString::fromUtf8("(C) 2019")) + << DPluginAuthor(QString::fromUtf8("Sébastien Fourey"), + QString::fromUtf8("Sebastien dot Fourey at ensicaen dot fr"), + QString::fromUtf8("(C) 2017-2019"), + QString::fromUtf8("G'MIC plugin")) + << DPluginAuthor(QString::fromUtf8("David Tschumperlé"), + QString::fromUtf8("David dot Tschumperle at ensicaen dot fr"), + QString::fromUtf8("(C) 2008-2017"), + QString::fromUtf8("G'MIC core")) + ; +} + +void GmicQtToolPlugin::setup(QObject* const parent) +{ + DPluginAction* const ac = new DPluginAction(parent); + ac->setIcon(icon()); + ac->setText(tr("G'MIC-Qt...")); + ac->setObjectName(QLatin1String("editorwindow_gmicqt")); + ac->setActionCategory(DPluginAction::EditorEnhance); + + connect(ac, SIGNAL(triggered(bool)), + this, SLOT(slotGmicQt())); + + addAction(ac); +} + +void GmicQtToolPlugin::slotGmicQt() +{ + DialogSettings::loadSettings(GmicQt::GuiApplication); + + // Translate according to current locale or configured language + QString lang = LanguageSelectionWidget::configuredTranslator(); + + if (!lang.isEmpty() && (lang != "en")) + { + auto translator = new QTranslator(qApp); + translator->load(QString(":/translations/%1.qm").arg(lang)); + QApplication::installTranslator(translator); + } + + disableInputMode(GmicQt::NoInput); + // disableInputMode(GmicQt::Active); + disableInputMode(GmicQt::All); + disableInputMode(GmicQt::ActiveAndBelow); + disableInputMode(GmicQt::ActiveAndAbove); + disableInputMode(GmicQt::AllVisible); + disableInputMode(GmicQt::AllInvisible); + + // disableOutputMode(GmicQt::InPlace); + disableOutputMode(GmicQt::NewImage); + disableOutputMode(GmicQt::NewLayers); + disableOutputMode(GmicQt::NewActiveLayers); + + QPointer mainWindow = new MainWindow(0); + // We want a non modal dialog here. + mainWindow->setWindowFlags(Qt::Tool | Qt::Dialog); + mainWindow->setWindowModality(Qt::ApplicationModal); + + if (QSettings().value("Config/MainWindowMaximized", false).toBool()) + { + mainWindow->showMaximized(); + } + else + { + mainWindow->show(); + } + + // Wait than main widget is closed. + QEventLoop loop; + connect(mainWindow, SIGNAL(destroyed()), + &loop, SLOT(quit())); + loop.exec(); +} + +} // namespace DigikamEditorGmicQtPlugin diff -Nru gmic-2.4.5/gmic-qt/src/Host/digiKam/gmicqttoolplugin.h gmic-2.9.2/gmic-qt/src/Host/digiKam/gmicqttoolplugin.h --- gmic-2.4.5/gmic-qt/src/Host/digiKam/gmicqttoolplugin.h 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Host/digiKam/gmicqttoolplugin.h 2020-09-03 11:37:05.000000000 +0000 @@ -0,0 +1,66 @@ +/* +* This file is part of G'MIC-Qt, a generic plug-in for raster graphics +* editors, offering hundreds of filters thanks to the underlying G'MIC +* image processing framework. +* +* Copyright (C) 2019 Gilles Caulier +* +* Description: digiKam image editor plugin for GmicQt. +* +* G'MIC-Qt 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. +* +* G'MIC-Qt is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +*/ + +#ifndef GMICQT_TOOL_PLUGIN_H +#define GMICQT_TOOL_PLUGIN_H + +// Local includes + +#include "dplugineditor.h" + +#define DPLUGIN_IID "org.kde.digikam.plugin.editor.GmicQt" + +using namespace Digikam; + +namespace DigikamEditorGmicQtPlugin +{ + +class GmicQtToolPlugin : public DPluginEditor +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID DPLUGIN_IID) + Q_INTERFACES(Digikam::DPluginEditor) + +public: + + explicit GmicQtToolPlugin(QObject* const parent = nullptr); + ~GmicQtToolPlugin(); + + QString name() const override; + QString iid() const override; + QIcon icon() const override; + QString details() const override; + QString description() const override; + QList authors() const override; + + void setup(QObject* const) override; + +private Q_SLOTS: + + void slotGmicQt(); +}; + +} // namespace DigikamEditorGmicQtPlugin + +#endif // GMICQT_TOOL_PLUGIN_H diff -Nru gmic-2.4.5/gmic-qt/src/Host/digiKam/host_digikam.cpp gmic-2.9.2/gmic-qt/src/Host/digiKam/host_digikam.cpp --- gmic-2.4.5/gmic-qt/src/Host/digiKam/host_digikam.cpp 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Host/digiKam/host_digikam.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -0,0 +1,375 @@ +/* +* This file is part of G'MIC-Qt, a generic plug-in for raster graphics +* editors, offering hundreds of filters thanks to the underlying G'MIC +* image processing framework. +* +* Copyright (C) 2019 Gilles Caulier +* +* Description: digiKam image editor plugin for GmicQt. +* +* G'MIC-Qt 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. +* +* G'MIC-Qt is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +*/ + +// Qt includes + +#include +#include +#include +#include + +// Local includes + +#include "Common.h" +#include "Host/host.h" +#include "gmic.h" + +// digiKam includes + +#include "imageiface.h" + +using namespace Digikam; + +namespace GmicQt +{ + const QString HostApplicationName = QString("digiKam"); + const char* HostApplicationShortname = GMIC_QT_XSTRINGIFY(GMIC_HOST); + const bool DarkThemeIsDefault = false; +} + +// Helper method for DImg to CImg container conversions + +namespace +{ + +inline unsigned char float2uchar_bounded(const float& in) +{ + return (in < 0.0f) ? 0 : ((in > 255.0f) ? 255 : static_cast(in)); +} + +inline unsigned short float2ushort_bounded(const float& in) +{ + return (in < 0.0f) ? 0 : ((in > 65535.0f) ? 65535 : static_cast(in)); +} + +void convertCImgtoDImg(const cimg_library::CImg& in, DImg& out, bool sixteenBit) +{ + Q_ASSERT_X(in.spectrum() <= 4, "ImageConverter::convert()", QString("bad input spectrum (%1)").arg(in.spectrum()).toLatin1()); + + bool alpha = (in.spectrum() == 4 || in.spectrum() == 2); + out = DImg(in.width(), in.height(), sixteenBit, alpha); + + if (in.spectrum() == 4) // RGB + Alpha + { + qDebug() << "GMicQt: convert CImg to DImg: RGB+Alpha image" << "(" << (sixteenBit+1) * 8 << "bits)"; + + const float* srcR = in.data(0, 0, 0, 0); + const float* srcG = in.data(0, 0, 0, 1); + const float* srcB = in.data(0, 0, 0, 2); + const float* srcA = in.data(0, 0, 0, 3); + int height = out.height(); + + for (int y = 0 ; y < height ; ++y) + { + int n = in.width(); + + if (sixteenBit) + { + unsigned short* dst = (unsigned short*)out.scanLine(y); + + while (n--) + { + dst[2] = float2ushort_bounded(*srcR++); + dst[1] = float2ushort_bounded(*srcG++); + dst[0] = float2ushort_bounded(*srcB++); + dst[3] = float2ushort_bounded(*srcA++); + dst += 4; + } + } + else + { + unsigned char* dst = out.scanLine(y); + + while (n--) + { + dst[2] = float2uchar_bounded(*srcR++); + dst[1] = float2uchar_bounded(*srcG++); + dst[0] = float2uchar_bounded(*srcB++); + dst[3] = float2uchar_bounded(*srcA++); + dst += 4; + } + } + } + } + else if (in.spectrum() == 3) // RGB + { + qDebug() << "GMicQt: convert CImg to DImg: RGB image" << "(" << (sixteenBit+1) * 8 << "bits)"; + + const float* srcR = in.data(0, 0, 0, 0); + const float* srcG = in.data(0, 0, 0, 1); + const float* srcB = in.data(0, 0, 0, 2); + int height = out.height(); + + for (int y = 0 ; y < height ; ++y) + { + int n = in.width(); + + if (sixteenBit) + { + unsigned short* dst = (unsigned short*)out.scanLine(y); + + while (n--) + { + dst[2] = float2ushort_bounded(*srcR++); + dst[1] = float2ushort_bounded(*srcG++); + dst[0] = float2ushort_bounded(*srcB++); + dst[3] = 0; + dst += 4; + } + } + else + { + unsigned char* dst = out.scanLine(y); + + while (n--) + { + dst[2] = float2uchar_bounded(*srcR++); + dst[1] = float2uchar_bounded(*srcG++); + dst[0] = float2uchar_bounded(*srcB++); + dst[3] = 0; + dst += 4; + } + } + } + } + else if (in.spectrum() == 2) // Gray levels + Alpha + { + qDebug() << "GMicQt: convert CImg to DImg: Gray+Alpha image" << "(" << (sixteenBit+1) * 8 << "bits)"; + const float* src = in.data(0, 0, 0, 0); + const float* srcA = in.data(0, 0, 0, 1); + int height = out.height(); + + for (int y = 0 ; y < height ; ++y) + { + int n = in.width(); + + if (sixteenBit) + { + unsigned short* dst = (unsigned short*)out.scanLine(y); + + while (n--) + { + dst[0] = dst[1] = dst[2] = float2ushort_bounded(*src++); + dst[3] = float2ushort_bounded(*srcA++); + dst += 4; + } + } + else + { + unsigned char* dst = out.scanLine(y); + + while (n--) + { + dst[0] = dst[1] = dst[2] = float2uchar_bounded(*src++); + dst[3] = float2uchar_bounded(*srcA++); + dst += 4; + } + } + } + } + else // Gray levels + { + qDebug() << "GMicQt: convert CImg to DImg: Gray image" << "(" << (sixteenBit+1) * 8 << "bits)"; + + const float* src = in.data(0, 0, 0, 0); + int height = out.height(); + + for (int y = 0 ; y < height ; ++y) + { + int n = in.width(); + + if (sixteenBit) + { + unsigned short* dst = (unsigned short*)out.scanLine(y); + + while (n--) + { + dst[0] = dst[1] = dst[2] = float2ushort_bounded(*src++); + dst[3] = 0; + dst += 4; + } + } + else + { + unsigned char* dst = out.scanLine(y); + + while (n--) + { + dst[0] = dst[1] = dst[2] = float2uchar_bounded(*src++); + dst[3] = 0; + dst += 4; + } + } + } + } +} + +void convertDImgtoCImg(const DImg& in, cimg_library::CImg& out) +{ + const int w = in.width(); + const int h = in.height(); + out.assign(w, h, 1, 4); + + float* dstR = out.data(0, 0, 0, 0); + float* dstG = out.data(0, 0, 0, 1); + float* dstB = out.data(0, 0, 0, 2); + float* dstA = out.data(0, 0, 0, 3); + + qDebug() << "GMicQt: convert DImg to CImg:" << (in.sixteenBit()+1) * 8 << "bits image"; + + for (int y = 0 ; y < h ; ++y) + { + if (in.sixteenBit()) + { + const unsigned short* src = (unsigned short*)in.scanLine(y); + int n = in.width(); + + while (n--) + { + *dstB++ = static_cast(src[0] / 255.0); + *dstG++ = static_cast(src[1] / 255.0); + *dstR++ = static_cast(src[2] / 255.0); + *dstA++ = static_cast(src[3] / 255.0); + src += 4; + } + } + else + { + const unsigned char* src = in.scanLine(y); + int n = in.width(); + + while (n--) + { + *dstB++ = static_cast(src[0]); + *dstG++ = static_cast(src[1]); + *dstR++ = static_cast(src[2]); + *dstA++ = static_cast(src[3]); + src += 4; + } + } + } +} + +} // namespace + +// --- GMic-Qt plugin functions ---------------------- + +void gmic_qt_get_image_size(int* width, + int* height) +{ + qDebug() << "Calling gmic_qt_get_image_size()"; + + ImageIface iface; + QSize size = iface.originalSize(); + + *width = size.width(); + *height = size.height(); +} + +void gmic_qt_get_layers_extent(int* width, + int* height, + GmicQt::InputMode mode) +{ + qDebug() << "Calling gmic_qt_get_layers_extent() : InputMode=" << mode; + + gmic_qt_get_image_size(width, height); + + qDebug() << "W=" << *width; + qDebug() << "H=" << *height; +} + +void gmic_qt_get_cropped_images(gmic_list& images, + gmic_list& imageNames, + double x, + double y, + double width, + double height, + GmicQt::InputMode mode) +{ + qDebug() << "Calling gmic_qt_get_cropped_images()"; + + if (mode == GmicQt::NoInput) + { + images.assign(); + imageNames.assign(); + return; + } + + ImageIface iface; + DImg* const input_image = iface.original(); + + const bool entireImage = (x < 0) && (y < 0) && (width < 0) && (height < 0); + + if (entireImage) + { + x = 0.0; + y = 0.0; + width = 1.0; + height = 1.0; + } + + images.assign(1); + imageNames.assign(1); + + QString name = QString("pos(0,0),name(%1)").arg("Image Editor Canvas"); + QByteArray ba = name.toUtf8(); + gmic_image::string(ba.constData()).move_to(imageNames[0]); + + const int ix = static_cast(entireImage ? 0 : std::floor(x * input_image->width())); + const int iy = static_cast(entireImage ? 0 : std::floor(y * input_image->height())); + const int iw = entireImage ? input_image->width() : std::min(static_cast(input_image->width() - ix), static_cast(1 + std::ceil(width * input_image->width()))); + const int ih = entireImage ? input_image->height() : std::min(static_cast(input_image->height() - iy), static_cast(1 + std::ceil(height * input_image->height()))); + + convertDImgtoCImg(input_image->copy(ix, iy, iw, ih), images[0]); +} + +void gmic_qt_output_images(gmic_list& images, + const gmic_list& imageNames, + GmicQt::OutputMode mode, + const char* verboseLayersLabel) +{ + qDebug() << "Calling gmic_qt_output_images()"; + + if (images.size() > 0) + { + ImageIface iface; + DImg dest; + convertCImgtoDImg(images[0], dest, iface.originalSixteenBit()); + FilterAction action(QLatin1String("GMic-Qt"), 1); + iface.setOriginal(QLatin1String("GMic-Qt"), action, dest); + } +} + +void gmic_qt_apply_color_profile(cimg_library::CImg& images) +{ + qDebug() << "Calling gmic_qt_apply_color_profile()"; + + Q_UNUSED(images); +} + +void gmic_qt_show_message(const char* message) +{ + qDebug() << "Calling gmic_qt_show_message()"; + qDebug() << "GMic-Qt:" << message; +} diff -Nru gmic-2.4.5/gmic-qt/src/Host/Gimp/host_gimp.cpp gmic-2.9.2/gmic-qt/src/Host/Gimp/host_gimp.cpp --- gmic-2.4.5/gmic-qt/src/Host/Gimp/host_gimp.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Host/Gimp/host_gimp.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -42,6 +42,8 @@ * of the GTK version of the gmic plug-in for GIMP by David Tschumperl\'e. */ +#define GIMP_VERSION_LTE(MAJOR, MINOR) (GIMP_MAJOR_VERSION < MAJOR) || ((GIMP_MAJOR_VERSION == MAJOR) && (GIMP_MINOR_VERSION <= MINOR)) + #define _gimp_image_get_item_position gimp_image_get_item_position #if (GIMP_MAJOR_VERSION == 2) && (GIMP_MINOR_VERSION <= 7) && (GIMP_MICRO_VERSION <= 14) @@ -54,6 +56,12 @@ { const QString HostApplicationName = QString("GIMP %1.%2").arg(GIMP_MAJOR_VERSION).arg(GIMP_MINOR_VERSION); const char * HostApplicationShortname = GMIC_QT_XSTRINGIFY(GMIC_HOST); +#if GIMP_VERSION_LTE(2, 8) +const bool DarkThemeIsDefault = false; +#else +const bool DarkThemeIsDefault = true; +#endif + } // namespace GmicQt namespace @@ -273,7 +281,7 @@ void gmic_qt_apply_color_profile(cimg_library::CImg & image) { -#if (GIMP_MAJOR_VERSION < 2) || ((GIMP_MAJOR_VERSION == 2) && (GIMP_MINOR_VERSION <= 8)) +#if GIMP_VERSION_LTE(2, 8) unused(image); // SWAP RED<->GREEN CHANNELS : FOR TESTING PURPOSE ONLY! // cimg_forXY(image,x,y) { @@ -316,7 +324,7 @@ const int * endLayers = begLayers + layersCount; int activeLayerID = gimp_image_get_active_layer(gmic_qt_gimp_image_id); - // Buil list of input layers IDs + // Build list of input layers IDs std::vector layers; switch (mode) { case GmicQt::NoInput: @@ -327,7 +335,6 @@ } break; case GmicQt::All: - case GmicQt::AllDesc: layers.assign(begLayers, endLayers); break; case GmicQt::ActiveAndBelow: @@ -348,11 +355,9 @@ layers.push_back(activeLayerID); } break; - case GmicQt::AllVisibles: - case GmicQt::AllVisiblesDesc: - case GmicQt::AllInvisibles: - case GmicQt::AllInvisiblesDesc: { - bool visibility = (mode == GmicQt::AllVisibles || mode == GmicQt::AllVisiblesDesc); + case GmicQt::AllVisible: + case GmicQt::AllInvisible: { + bool visibility = (mode == GmicQt::AllVisible); for (int i = 0; i < layersCount; ++i) { if (_gimp_item_get_visible(begLayers[i]) == visibility) { layers.push_back(begLayers[i]); @@ -413,7 +418,7 @@ height = 1.0; } - // Buil list of input layers IDs + // Build list of input layers IDs inputLayers.clear(); switch (mode) { case GmicQt::NoInput: @@ -424,11 +429,7 @@ } break; case GmicQt::All: - case GmicQt::AllDesc: inputLayers.assign(layers, end_layers); - if (mode == GmicQt::AllDesc) { - std::reverse(inputLayers.begin(), inputLayers.end()); - } break; case GmicQt::ActiveAndBelow: if ((active_layer_id >= 0) && !gimp_item_is_group(active_layer_id)) { @@ -448,19 +449,14 @@ inputLayers.push_back(active_layer_id); } break; - case GmicQt::AllVisibles: - case GmicQt::AllVisiblesDesc: - case GmicQt::AllInvisibles: - case GmicQt::AllInvisiblesDesc: { - bool visibility = (mode == GmicQt::AllVisibles || mode == GmicQt::AllVisiblesDesc); + case GmicQt::AllVisible: + case GmicQt::AllInvisible: { + bool visibility = (mode == GmicQt::AllVisible); for (int i = 0; i < layersCount; ++i) { if (_gimp_item_get_visible(layers[i]) == visibility) { inputLayers.push_back(layers[i]); } } - if (mode == GmicQt::AllVisiblesDesc || mode == GmicQt::AllInvisiblesDesc) { - std::reverse(inputLayers.begin(), inputLayers.end()); - } } break; default: break; @@ -527,7 +523,7 @@ QString name = QString("mode(%1),opacity(%2),pos(%3,%4),name(%5)").arg(blendingMode2String(blendMode)).arg(opacity).arg(xPos).arg(yPos).arg(noParenthesisName); QByteArray ba = name.toUtf8(); gmic_image::string(ba.constData()).move_to(imageNames[l]); -#if (GIMP_MAJOR_VERSION < 2) || ((GIMP_MAJOR_VERSION == 2) && (GIMP_MINOR_VERSION <= 8)) +#if GIMP_VERSION_LTE(2, 8) GimpDrawable * drawable = gimp_drawable_get(inputLayers[l]); GimpPixelRgn region; gimp_pixel_rgn_init(®ion, drawable, ix, iy, iw, ih, false, false); @@ -622,14 +618,10 @@ gimp_drawable_offsets(inputLayers[p], &layer_posx, &layer_posy); cimg_library::CImg::string(gimp_item_get_name(inputLayers[p])).move_to(layer_name); get_output_layer_props(imageNames[p], layer_blendmode, layer_opacity, layer_posx, layer_posy, layer_name); - if (is_selection) { - layer_posx = 0; - layer_posy = 0; - } cimg_library::CImg & img = images[p]; GmicQt::calibrate_image(img, inputLayerDimensions(p, 3), false); if (gimp_drawable_mask_intersect(inputLayers[p], &rgn_x, &rgn_y, &rgn_width, &rgn_height)) { -#if (GIMP_MAJOR_VERSION < 2) || ((GIMP_MAJOR_VERSION == 2) && (GIMP_MINOR_VERSION <= 8)) +#if GIMP_VERSION_LTE(2, 8) GimpDrawable * drawable = gimp_drawable_get(inputLayers[p]); GimpPixelRgn region; gimp_pixel_rgn_init(®ion, drawable, rgn_x, rgn_y, rgn_width, rgn_height, true, true); @@ -652,8 +644,15 @@ #endif gimp_layer_set_mode(inputLayers[p], layer_blendmode); gimp_layer_set_opacity(inputLayers[p], layer_opacity); - gimp_layer_set_offsets(inputLayers[p], layer_posx, layer_posy); - + if (!is_selection) { + gimp_layer_set_offsets(inputLayers[p], layer_posx, layer_posy); + } else { +#if GIMP_VERSION_LTE(2, 8) + gimp_layer_translate(inputLayers[p], 0, 0); +#else + gimp_item_transform_translate(inputLayers[p], 0, 0); +#endif + } if (verboseLayersLabel) { // Verbose (layer name) gimp_item_set_name(inputLayers[p], verboseLayersLabel); } else if (layer_name) { @@ -707,7 +706,7 @@ } gimp_image_insert_layer(gmic_qt_gimp_image_id, layer_id, -1, layer_pos + p); -#if (GIMP_MAJOR_VERSION < 2) || ((GIMP_MAJOR_VERSION == 2) && (GIMP_MINOR_VERSION <= 8)) +#if GIMP_VERSION_LTE(2, 8) GimpDrawable * drawable = gimp_drawable_get(layer_id); GimpPixelRgn region; gimp_pixel_rgn_init(®ion, drawable, 0, 0, drawable->width, drawable->height, true, true); @@ -785,7 +784,7 @@ } gimp_image_insert_layer(gmic_qt_gimp_image_id, layer_id, -1, p); -#if (GIMP_MAJOR_VERSION < 2) || ((GIMP_MAJOR_VERSION == 2) && (GIMP_MINOR_VERSION <= 8)) +#if GIMP_VERSION_LTE(2, 8) GimpDrawable * drawable = gimp_drawable_get(layer_id); GimpPixelRgn region; gimp_pixel_rgn_init(®ion, drawable, 0, 0, drawable->width, drawable->height, true, true); @@ -826,7 +825,7 @@ const unsigned int max_width = (unsigned int)bottom_right.x; const unsigned int max_height = (unsigned int)bottom_right.y; if (active_layer_id >= 0) { -#if (GIMP_MAJOR_VERSION < 2) || ((GIMP_MAJOR_VERSION == 2) && (GIMP_MINOR_VERSION <= 8)) +#if GIMP_VERSION_LTE(2, 8) const int nimage_id = gimp_image_new(max_width, max_height, max_spectrum <= 2 ? GIMP_GRAY : GIMP_RGB); #else const int nimage_id = gimp_image_new_with_precision(max_width, max_height, max_spectrum <= 2 ? GIMP_GRAY : GIMP_RGB, gimp_image_get_precision(gmic_qt_gimp_image_id)); @@ -863,7 +862,7 @@ } gimp_image_insert_layer(nimage_id, layer_id, -1, p); -#if (GIMP_MAJOR_VERSION < 2) || ((GIMP_MAJOR_VERSION == 2) && (GIMP_MINOR_VERSION <= 8)) +#if GIMP_VERSION_LTE(2, 8) GimpDrawable * drawable = gimp_drawable_get(layer_id); GimpPixelRgn region; gimp_pixel_rgn_init(®ion, drawable, 0, 0, drawable->width, drawable->height, true, true); @@ -909,7 +908,6 @@ *nreturn_vals = 1; return_values[0].type = GIMP_PDB_STATUS; int run_mode = (GimpRunMode)param[0].data.d_int32; - GimpPDBStatusType status = GIMP_PDB_SUCCESS; switch (run_mode) { case GIMP_RUN_INTERACTIVE: gmic_qt_gimp_image_id = param[1].data.d_drawable; @@ -924,7 +922,7 @@ launchPluginHeadless(param[5].data.d_string, (GmicQt::InputMode)(param[3].data.d_int32 + GmicQt::NoInput), GmicQt::OutputMode(param[4].data.d_int32 + GmicQt::InPlace)); break; } - return_values[0].data.d_status = status; + return_values[0].data.d_status = pluginDialogWasAccepted() ? GIMP_PDB_SUCCESS : GIMP_PDB_CANCEL; } void gmic_qt_query() @@ -934,8 +932,7 @@ {GIMP_PDB_DRAWABLE, (gchar *)"drawable", (gchar *)"Input drawable (unused)"}, {GIMP_PDB_INT32, (gchar *)"input", (gchar *)"Input layers mode, when non-interactive" - " (0=none, 1=active, 2=all, 3=active & below, 4=active & above, 5=all visibles, 6=all invisibles," - " 7=all visibles (decr.), 8=all invisibles (decr.), 9=all (decr.))"}, + " (0=none, 1=active, 2=all, 3=active & below, 4=active & above, 5=all visibles, 6=all invisibles)"}, {GIMP_PDB_INT32, (gchar *)"output", (gchar *)"Output mode, when non-interactive " "(0=in place,1=new layers,2=new active layers,3=new image)"}, @@ -957,10 +954,10 @@ G_N_ELEMENTS(args), // nparams 0, // nreturn_vals args, // params - 0); // return_vals + nullptr); // return_vals gimp_plugin_menu_register(name, "/Filters"); } -GimpPlugInInfo PLUG_IN_INFO = {0, 0, gmic_qt_query, gmic_qt_run}; +GimpPlugInInfo PLUG_IN_INFO = {nullptr, nullptr, gmic_qt_query, gmic_qt_run}; MAIN() diff -Nru gmic-2.4.5/gmic-qt/src/Host/host.h gmic-2.9.2/gmic-qt/src/Host/host.h --- gmic-2.4.5/gmic-qt/src/Host/host.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Host/host.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_HOST_H_ -#define _GMIC_QT_HOST_H_ +#ifndef GMIC_QT_HOST_H +#define GMIC_QT_HOST_H #include #include "gmic_qt.h" @@ -31,13 +31,14 @@ { template struct CImg; template struct CImgList; -} +} // namespace cimg_library namespace GmicQt { extern const QString HostApplicationName; extern const char * HostApplicationShortname; -} +extern const bool DarkThemeIsDefault; +} // namespace GmicQt /** * @brief gmic_qt_get_image_size @@ -79,11 +80,11 @@ /** * @brief Send a list of new image layers to the host application according to - * an output mode (\see gmic_qt.cpp) + * an output mode (\see gmic_qt.h) * * @param images List of layers to be sent to the host application. May be modified. * @param imageNames Layers labels - * @param mode Output mode (\see gmic_qt.cpp) + * @param mode Output mode (\see gmic_qt.h) * @param verboseLayersLabel Name used for all layers in VerboseLayerName mode, otherwise null. */ void gmic_qt_output_images(cimg_library::CImgList & images, const cimg_library::CImgList & imageNames, GmicQt::OutputMode mode, const char * verboseLayersLabel = nullptr); @@ -91,7 +92,7 @@ /** * @brief Apply a color profile to a given image * - * @param image[in,out] An image + * @param [in,out] images An image */ void gmic_qt_apply_color_profile(cimg_library::CImg & images); @@ -105,4 +106,4 @@ */ void gmic_qt_show_message(const char * message); -#endif // _GMIC_QT_HOST_H_ +#endif // GMIC_QT_HOST_H diff -Nru gmic-2.4.5/gmic-qt/src/Host/Krita/host_krita.cpp gmic-2.9.2/gmic-qt/src/Host/Krita/host_krita.cpp --- gmic-2.4.5/gmic-qt/src/Host/Krita/host_krita.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Host/Krita/host_krita.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -60,6 +60,7 @@ namespace GmicQt { const QString HostApplicationName = QString("Krita"); const char *HostApplicationShortname = GMIC_QT_XSTRINGIFY(GMIC_HOST); +const bool DarkThemeIsDefault = true; } static QString socketKey = "gmic-krita"; @@ -200,7 +201,7 @@ } if (m.isAttached()) { if (!m.lock()) { - qWarning() << "\tgmic-qt: Could not lock memeory segment" << m.error() << m.errorString(); + qWarning() << "\tgmic-qt: Could not lock memory segment" << m.error() << m.errorString(); } //qDebug() << "Memory segment" << key << m.size() << m.constData() << m.data(); @@ -211,10 +212,10 @@ gimg.move_to(images[i]); if (!m.unlock()) { - qWarning() << "\tgmic-qt: Could not unlock memeory segment" << m.error() << m.errorString(); + qWarning() << "\tgmic-qt: Could not unlock memory segment" << m.error() << m.errorString(); } if (!m.detach()) { - qWarning() << "\tgmic-qt: Could not detach from memeory segment" << m.error() << m.errorString(); + qWarning() << "\tgmic-qt: Could not detach from memory segment" << m.error() << m.errorString(); } } else { @@ -346,6 +347,19 @@ #endif } + disableInputMode(GmicQt::NoInput); + // disableInputMode(GmicQt::Active); + // disableInputMode(GmicQt::All); + // disableInputMode(GmicQt::ActiveAndBelow); + // disableInputMode(GmicQt::ActiveAndAbove); + disableInputMode(GmicQt::AllVisible); + disableInputMode(GmicQt::AllInvisible); + + // disableOutputMode(GmicQt::InPlace); + disableOutputMode(GmicQt::NewImage); + disableOutputMode(GmicQt::NewLayers); + disableOutputMode(GmicQt::NewActiveLayers); + qWarning() << "gmic-qt: socket Key:" << socketKey; int r = 0; if (headless) { diff -Nru gmic-2.4.5/gmic-qt/src/Host/None/host_none.cpp gmic-2.9.2/gmic-qt/src/Host/None/host_none.cpp --- gmic-2.4.5/gmic-qt/src/Host/None/host_none.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Host/None/host_none.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -42,21 +42,7 @@ #include "gmic.h" #ifdef _GMIC_QT_DEBUG_ -//#define DEFAULT_IMAGE "local/img_3820.png" -//#define DEFAULT_IMAGE "local/Untitled.png" -//#define DEFAULT_IMAGE "local/space-shuttle.png" -//#define DEFAULT_IMAGE "local/space-shuttle-transp.png" -//#define DEFAULT_IMAGE "local/bug.jpg" -//#define DEFAULT_IMAGE "local/bug2.jpg" -//#define DEFAULT_IMAGE "local/crop_inktober.jpg" -#define DEFAULT_IMAGE "local/lena.png" -//#define DEFAULT_IMAGE "local/lena_border.png" -//#define DEFAULT_IMAGE "local/transp.png" -//#define DEFAULT_IMAGE "local/small_lena.png" -//#define DEFAULT_IMAGE "local/ken.jpg" -//#define DEFAULT_IMAGE "local/ferrari.jpg" -//#define DEFAULT_IMAGE "local/audio-speakers.png" -//#define DEFAULT_IMAGE "local/audio-speakers-top.png" +#define DEFAULT_IMAGE "local/default.png" #endif #define STRINGIFY(X) #X @@ -107,6 +93,7 @@ { const QString HostApplicationName; const char * HostApplicationShortname = XSTRINGIFY(GMIC_HOST); +const bool DarkThemeIsDefault = false; } // namespace GmicQt void gmic_qt_get_image_size(int * width, int * height) @@ -213,6 +200,29 @@ filename = DEFAULT_IMAGE; } #endif + + disableInputMode(GmicQt::NoInput); + // disableInputMode(GmicQt::Active); + disableInputMode(GmicQt::All); + disableInputMode(GmicQt::ActiveAndBelow); + disableInputMode(GmicQt::ActiveAndAbove); + disableInputMode(GmicQt::AllVisible); + disableInputMode(GmicQt::AllInvisible); + + // disableOutputMode(GmicQt::InPlace); + disableOutputMode(GmicQt::NewImage); + disableOutputMode(GmicQt::NewLayers); + disableOutputMode(GmicQt::NewActiveLayers); + + // disablePreviewMode(GmicQt::FirstOutput); + disablePreviewMode(GmicQt::SecondOutput); + disablePreviewMode(GmicQt::ThirdOutput); + disablePreviewMode(GmicQt::FourthOutput); + disablePreviewMode(GmicQt::First2SecondOutput); + disablePreviewMode(GmicQt::First2ThirdOutput); + disablePreviewMode(GmicQt::First2FourthOutput); + disablePreviewMode(GmicQt::AllOutputs); + if (filename.isEmpty()) { return launchPlugin(); } diff -Nru gmic-2.4.5/gmic-qt/src/Host/None/ImageDialog.h gmic-2.9.2/gmic-qt/src/Host/None/ImageDialog.h --- gmic-2.4.5/gmic-qt/src/Host/None/ImageDialog.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Host/None/ImageDialog.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_IMAGE_DIALOG_H -#define _GMIC_QT_IMAGE_DIALOG_H +#ifndef GMIC_QT_IMAGE_DIALOG_H +#define GMIC_QT_IMAGE_DIALOG_H #include #include #include diff -Nru gmic-2.4.5/gmic-qt/src/Host/PaintDotNet/host_paintdotnet.cpp gmic-2.9.2/gmic-qt/src/Host/PaintDotNet/host_paintdotnet.cpp --- gmic-2.4.5/gmic-qt/src/Host/PaintDotNet/host_paintdotnet.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Host/PaintDotNet/host_paintdotnet.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -3,7 +3,7 @@ * editors, offering hundreds of filters thanks to the underlying G'MIC * image processing framework. * -* Copyright (C) 2018 Nicholas Hayes +* Copyright (C) 2018, 2019, 2020 Nicholas Hayes * * G'MIC-Qt is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,172 +19,610 @@ * along with this program. If not, see . * */ - -#include +#include #include -#include +#include +#include +#include +#include #include +#include +#include +#include #include "Common.h" #include "Host/host.h" -#include "ImageConverter.h" +#include "MainWindow.h" #include "gmic_qt.h" #include "gmic.h" +#include + +struct KernelHandleCloser +{ + void operator()(void* pointer) + { + if (pointer) + { + CloseHandle(pointer); + } + } +}; + +struct MappedFileViewCloser +{ + void operator()(void* pointer) + { + if (pointer) + { + UnmapViewOfFile(pointer); + } + } +}; + +typedef std::unique_ptr ScopedFileMapping; +typedef std::unique_ptr ScopedFileMappingView; namespace host_paintdotnet { - QVector layerImages; - - QString outputImagePath; + QString pipeName; + std::vector sharedMemory; } namespace GmicQt { - const QString HostApplicationName = QString("Paint.NET"); - const char * HostApplicationShortname = GMIC_QT_XSTRINGIFY(GMIC_HOST); + const QString HostApplicationName = QString("Paint.NET"); + const char * HostApplicationShortname = GMIC_QT_XSTRINGIFY(GMIC_HOST); + const bool DarkThemeIsDefault = false; } -void gmic_qt_get_layers_extent(int * width, int * height, GmicQt::InputMode) +namespace { - // Paint.NET layers are all the same size. - const QImage firstLayer = host_paintdotnet::layerImages.at(0); - - *width = firstLayer.width(); - *height = firstLayer.height(); + class ScopedCreateFile : public std::unique_ptr + { + public: + ScopedCreateFile(HANDLE handle) : std::unique_ptr(handle == INVALID_HANDLE_VALUE ? nullptr : handle) + { + } + }; + + BOOL ReadFileBlocking(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPOVERLAPPED lpOverlapped) + { + BYTE* bufferStart = static_cast(lpBuffer); + DWORD totalBytesRead = 0; + do + { + if (!ReadFile(hFile, bufferStart + totalBytesRead, nNumberOfBytesToRead - totalBytesRead, nullptr, lpOverlapped)) + { + DWORD error = GetLastError(); + switch (error) + { + case ERROR_SUCCESS: + case ERROR_IO_PENDING: + break; + default: + return FALSE; + } + } + + DWORD bytesRead = 0; + + if (GetOverlappedResult(hFile, lpOverlapped, &bytesRead, TRUE)) + { + ResetEvent(lpOverlapped->hEvent); + } + else + { + return FALSE; + } + + totalBytesRead += bytesRead; + } while (totalBytesRead < nNumberOfBytesToRead); + + return TRUE; + } + + BOOL WriteFileBlocking(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPOVERLAPPED lpOverlapped) + { + const BYTE* bufferStart = static_cast(lpBuffer); + DWORD totalBytesWritten = 0; + do + { + if (!WriteFile(hFile, bufferStart + totalBytesWritten, nNumberOfBytesToWrite - totalBytesWritten, nullptr, lpOverlapped)) + { + DWORD error = GetLastError(); + switch (error) + { + case ERROR_SUCCESS: + case ERROR_IO_PENDING: + break; + default: + return FALSE; + } + } + + DWORD bytesWritten = 0; + + if (GetOverlappedResult(hFile, lpOverlapped, &bytesWritten, TRUE)) + { + ResetEvent(lpOverlapped->hEvent); + } + else + { + return FALSE; + } + + totalBytesWritten += bytesWritten; + } while (totalBytesWritten < nNumberOfBytesToWrite); + + return TRUE; + } + + QByteArray SendMessageSynchronously(QByteArray message) + { + QByteArray reply; + + ScopedCreateFile handle(CreateFileW(reinterpret_cast(host_paintdotnet::pipeName.utf16()), + GENERIC_READ | GENERIC_WRITE, + 0, + nullptr, + OPEN_EXISTING, + FILE_FLAG_OVERLAPPED, + nullptr)); + + if (!handle) + { + qWarning() << "Could not open the Paint.NET pipe handle. GetLastError=" << GetLastError(); + + return reply; + } + + OVERLAPPED overlapped = {}; + overlapped.hEvent = CreateEventW(nullptr, TRUE, FALSE, nullptr); + + if (!overlapped.hEvent) + { + qWarning() << "Could not create the overlapped.hEvent handle. GetLastError=" << GetLastError(); + + return reply; + } + + // Write the message. + + const int messageLength = message.length(); + + if (!WriteFileBlocking(handle.get(), &messageLength, sizeof(int), &overlapped)) + { + qWarning() << "WriteFileBlocking(1) failed GetLastError=" << GetLastError(); + + CloseHandle(overlapped.hEvent); + + return reply; + } + + if (!WriteFileBlocking(handle.get(), message.data(), static_cast(messageLength), &overlapped)) + { + qWarning() << "WriteFileBlocking(2) failed GetLastError=" << GetLastError(); + + CloseHandle(overlapped.hEvent); + + return reply; + } + + // Read the reply. + + int bytesRemaining = 0; + + if (!ReadFileBlocking(handle.get(), &bytesRemaining, sizeof(int), &overlapped)) + { + qWarning() << "ReadFileBlocking(1) failed GetLastError=" << GetLastError(); + + CloseHandle(overlapped.hEvent); + + return reply; + } + + if (bytesRemaining > 0) + { + reply.resize(bytesRemaining); + + if (!ReadFileBlocking(handle.get(), reply.data(), static_cast(bytesRemaining), &overlapped)) + { + qWarning() << "ReadFileBlocking(2) failed GetLastError=" << GetLastError(); + + CloseHandle(overlapped.hEvent); + + return reply; + } + } + + // Send a message to Paint.NET that all data has been read. + + static const char done[] = "done"; + constexpr DWORD doneLength = sizeof(done) / sizeof(done[0]); + + WriteFileBlocking(handle.get(), done, doneLength, &overlapped); + + CloseHandle(overlapped.hEvent); + + return reply; + } + + inline quint8 Float2Uint8Clamped(const float& value) + { + return value < 0.0f ? 0 : value > 255.0f ? 255 : static_cast(value); + } +} + +void gmic_qt_get_layers_extent(int * width, int * height, GmicQt::InputMode mode) +{ + if (mode == GmicQt::NoInput) + { + *width = 0; + *height = 0; + return; + } + + QString getMaxLayerSizeCommand = QString("command=gmic_qt_get_max_layer_size\nmode=%1\n").arg(mode); + + QString reply = QString::fromUtf8(SendMessageSynchronously(getMaxLayerSizeCommand.toUtf8())); + + if (reply.length() > 0) + { + QStringList items = reply.split(',', QString::SkipEmptyParts); + + if (items.length() == 2) + { + *width = items[0].toInt(); + *height = items[1].toInt(); + } + } } void gmic_qt_get_cropped_images(gmic_list & images, gmic_list & imageNames, double x, double y, double width, double height, GmicQt::InputMode mode) { - if (mode == GmicQt::NoInput) - { - images.assign(); - imageNames.assign(); - return; - } - - const bool entireImage = x < 0 && y < 0 && width < 0 && height < 0; - if (entireImage) - { - x = 0.0; - y = 0.0; - width = 1.0; - height = 1.0; - } + if (mode == GmicQt::NoInput) + { + images.assign(); + imageNames.assign(); + return; + } + + const bool entireImage = x < 0 && y < 0 && width < 0 && height < 0; + if (entireImage) + { + x = 0.0; + y = 0.0; + width = 1.0; + height = 1.0; + } + + QString getImagesCommand = QString("command=gmic_qt_get_cropped_images\nmode=%1\ncroprect=%2,%3,%4,%5\n").arg(mode).arg(x).arg(y).arg(width).arg(height); + + QString reply = QString::fromUtf8(SendMessageSynchronously(getImagesCommand.toUtf8())); + + QStringList layers = reply.split('\n', QString::SkipEmptyParts); + + const int layerCount = layers.length(); + + images.assign(layerCount); + imageNames.assign(layerCount); + + for (int i = 0; i < layerCount; ++i) + { + QString layerName = QString("layer%1").arg(i); + QByteArray layerNameBytes = layerName.toUtf8(); + gmic_image::string(layerNameBytes.constData()).move_to(imageNames[i]); + } + + for (int i = 0; i < layerCount; ++i) + { + QStringList layerData = layers[i].split(',', QString::SkipEmptyParts); + if (layerData.length() != 4) + { + return; + } + + LPCWSTR fileMappingName = reinterpret_cast(layerData[0].utf16()); + const qint32 width = layerData[1].toInt(); + const qint32 height = layerData[2].toInt(); + const qint32 stride = layerData[3].toInt(); + + ScopedFileMapping fileMappingObject(OpenFileMappingW(FILE_MAP_READ, FALSE, fileMappingName)); + + if (fileMappingObject) + { + const size_t imageDataSize = static_cast(stride) * static_cast(height); + + ScopedFileMappingView mappedData(MapViewOfFile(fileMappingObject.get(), FILE_MAP_READ, 0, 0, imageDataSize)); + + if (mappedData) + { + const quint8* scan0 = static_cast(mappedData.get()); + cimg_library::CImg& dest = images[i]; + + dest.assign(width, height, 1, 4); + float* dstR = dest.data(0, 0, 0, 0); + float* dstG = dest.data(0, 0, 0, 1); + float* dstB = dest.data(0, 0, 0, 2); + float* dstA = dest.data(0, 0, 0, 3); + + for (qint32 y = 0; y < height; ++y) + { + const quint8* src = scan0 + (y * stride); + + for (qint32 x = 0; x < width; ++x) + { + *dstB++ = static_cast(src[0]); + *dstG++ = static_cast(src[1]); + *dstR++ = static_cast(src[2]); + *dstA++ = static_cast(src[3]); + + src += 4; + } + } + } + else + { + qWarning() << "MapViewOfFile failed GetLastError=" << GetLastError(); + return; + } + } + else + { + qWarning() << "OpenFileMappingW failed GetLastError=" << GetLastError(); + return; + } + } - const int layerCount = host_paintdotnet::layerImages.count(); - - images.assign(layerCount); - imageNames.assign(layerCount); - - for (int i = 0; i < layerCount; i++) - { - QString layerName = QString("pos(0,0),name(layer%1)").arg(i); - QByteArray layerNameBytes = layerName.toUtf8(); - gmic_image::string(layerNameBytes.constData()).move_to(imageNames[i]); - } - - int imageWidth; - int imageHeight; - gmic_qt_get_layers_extent(&imageWidth, &imageHeight, mode); - - const int ix = entireImage ? 0 : static_cast(std::floor(x * imageWidth)); - const int iy = entireImage ? 0 : static_cast(std::floor(y * imageHeight)); - const int iw = entireImage ? imageWidth : std::min(imageWidth - ix, static_cast(1 + std::ceil(width * imageWidth))); - const int ih = entireImage ? imageHeight : std::min(imageHeight - iy, static_cast(1 + std::ceil(height * imageHeight))); - - for (int i = 0; i < layerCount; i++) - { - ImageConverter::convert(host_paintdotnet::layerImages.at(i).copy(ix, iy, iw, ih), images[i]); - } + SendMessageSynchronously("command=gmic_qt_release_shared_memory"); } void gmic_qt_output_images(gmic_list & images, const gmic_list & imageNames, GmicQt::OutputMode mode, const char * verboseLayersLabel) { - unused(imageNames); - unused(mode); - unused(verboseLayersLabel); - - if (images.size() > 0) - { - QImage outputImage; + unused(imageNames); + unused(verboseLayersLabel); - ImageConverter::convert(images[0], outputImage); + if (images.size() > 0) + { + for (size_t i = 0; i < host_paintdotnet::sharedMemory.size(); ++i) + { + host_paintdotnet::sharedMemory[i].reset(); + } + host_paintdotnet::sharedMemory.clear(); + + QString outputImagesCommand = QString("command=gmic_qt_output_images\nmode=%1\n").arg(mode); + + QString mappingName = QString("pdn_%1").arg(QUuid::createUuid().toString(QUuid::StringFormat::WithoutBraces)); + + + const cimg_library::CImg& out = images[0]; + + const int width = out.width(); + const int height = out.height(); + + const qint64 imageSizeInBytes = static_cast(width) * static_cast(height) * 4; + + const DWORD capacityHigh = static_cast((imageSizeInBytes >> 32) & 0xFFFFFFFF); + const DWORD capacityLow = static_cast(imageSizeInBytes & 0x00000000FFFFFFFF); + + ScopedFileMapping fileMappingObject(CreateFileMappingW(INVALID_HANDLE_VALUE, + nullptr, + PAGE_READWRITE, + capacityHigh, + capacityLow, + reinterpret_cast(mappingName.utf16()))); + if (fileMappingObject) + { + ScopedFileMappingView mappedData(MapViewOfFile(fileMappingObject.get(), FILE_MAP_ALL_ACCESS, 0, 0, static_cast(imageSizeInBytes))); + + if (mappedData) + { + quint8* scan0 = static_cast(mappedData.get()); + const int stride = width * 4; + + if (out.spectrum() == 3) + { + const float* srcR = out.data(0, 0, 0, 0); + const float* srcG = out.data(0, 0, 0, 1); + const float* srcB = out.data(0, 0, 0, 2); + + for (int y = 0; y < height; ++y) + { + quint8* dst = scan0 + (y * stride); + + for (int x = 0; x < width; ++x) + { + dst[0] = Float2Uint8Clamped(*srcB++); + dst[1] = Float2Uint8Clamped(*srcG++); + dst[2] = Float2Uint8Clamped(*srcR++); + dst[3] = 255; + + dst += 4; + } + } + } + else if (out.spectrum() == 4) + { + const float* srcR = out.data(0, 0, 0, 0); + const float* srcG = out.data(0, 0, 0, 1); + const float* srcB = out.data(0, 0, 0, 2); + const float* srcA = out.data(0, 0, 0, 3); + + for (int y = 0; y < height; ++y) + { + quint8* dst = scan0 + (y * stride); + + for (int x = 0; x < width; ++x) + { + dst[0] = Float2Uint8Clamped(*srcB++); + dst[1] = Float2Uint8Clamped(*srcG++); + dst[2] = Float2Uint8Clamped(*srcR++); + dst[3] = Float2Uint8Clamped(*srcA++); + + dst += 4; + } + } + } + else if (out.spectrum() == 2) + { + const float* srcGray = out.data(0, 0, 0, 0); + const float* srcAlpha = out.data(0, 0, 0, 1); + + for (int y = 0; y < height; ++y) + { + quint8* dst = scan0 + (y * stride); + + for (int x = 0; x < width; ++x) + { + dst[0] = dst[1] = dst[2] = Float2Uint8Clamped(*srcGray++); + dst[3] = Float2Uint8Clamped(*srcAlpha++); + + dst += 4; + } + } + } + else if (out.spectrum() == 1) + { + const float* srcGray = out.data(0, 0, 0, 0); + + for (int y = 0; y < height; ++y) + { + quint8* dst = scan0 + (y * stride); + + for (int x = 0; x < width; ++x) + { + dst[0] = dst[1] = dst[2] = Float2Uint8Clamped(*srcGray++); + dst[3] = 255; + + dst += 4; + } + } + } + else + { + qWarning() << "The image must have between 1 and 4 channels. Actual value=" << out.spectrum(); + return; + } + + // Manually release the mapped data to ensue it is committed before the parent file mapping handle + // is moved into the host_paintdotnet::sharedMemory vector (which invalidates the previous handle). + + mappedData.reset(); + + outputImagesCommand += "layer=" + mappingName + "," + + QString::number(width) + "," + + QString::number(height) + "," + + QString::number(stride) + "\n"; + + + host_paintdotnet::sharedMemory.push_back(std::move(fileMappingObject)); + } + else + { + qWarning() << "MapViewOfFile failed GetLastError=" << GetLastError(); + return; + } + } + else + { + qWarning() << "CreateFileMappingW failed GetLastError=" << GetLastError(); + return; + } - outputImage.save(host_paintdotnet::outputImagePath); - } + SendMessageSynchronously(outputImagesCommand.toUtf8()); + } } void gmic_qt_apply_color_profile(cimg_library::CImg & images) { - unused(images); + unused(images); } void gmic_qt_show_message(const char * message) { - unused(message); + unused(message); } int main(int argc, char *argv[]) { - QString firstLayerImagePath; - QString secondLayerImagePath; - bool useLastParameters = false; - - if (argc >= 4) - { - firstLayerImagePath = argv[1]; - secondLayerImagePath = argv[2]; - host_paintdotnet::outputImagePath = argv[3]; - if (argc == 5) - { - useLastParameters = strcmp(argv[4], "reapply") == 0; - } - } - else - { - std::cerr << "Usage: gmic_paintdotnet_qt first_image second_image output_image\n"; - return 1; - } - - if (firstLayerImagePath.isEmpty()) - { - std::cerr << "Input filename is an empty string.\n"; - return 1; - } - - if (host_paintdotnet::outputImagePath.isEmpty()) - { - std::cerr << "Output filename is an empty string.\n"; - return 1; - } - - QImage firstLayer(firstLayerImagePath); + bool useLastParameters = false; + + if (argc >= 3 && strcmp(argv[1], ".PDN") == 0) + { + host_paintdotnet::pipeName = argv[2]; + if (argc == 4) + { + useLastParameters = strcmp(argv[3], "reapply") == 0; + } + } + else + { + return 1; + } + + if (host_paintdotnet::pipeName.isEmpty()) + { + return 2; + } + + // Check that the layer data length is within the limit for the size_t type on 32-bit builds. + // This prevents an overflow when calculating the total image size if the image is larger than 4GB. +#if defined(_M_IX86) || defined(__i386__) + quint64 maxDataLength = 0; + + QString message = QString("command=gmic_qt_get_max_layer_data_length"); + QDataStream stream(SendMessageSynchronously(message.toUtf8())); + stream.setByteOrder(QDataStream::ByteOrder::LittleEndian); + stream >> maxDataLength; + + if (maxDataLength > std::numeric_limits::max()) + { + return 3; + } +#endif + + int exitCode = 0; + + disableInputMode(GmicQt::NoInput); + // disableInputMode(GmicQt::Active); + // disableInputMode(GmicQt::All); + disableInputMode(GmicQt::ActiveAndBelow); + disableInputMode(GmicQt::ActiveAndAbove); + disableInputMode(GmicQt::AllVisible); + disableInputMode(GmicQt::AllInvisible); + + // disableOutputMode(GmicQt::InPlace); + disableOutputMode(GmicQt::NewImage); + disableOutputMode(GmicQt::NewLayers); + disableOutputMode(GmicQt::NewActiveLayers); - if (!firstLayer.isNull()) - { - host_paintdotnet::layerImages.append(firstLayer.convertToFormat(QImage::Format_ARGB32)); - - // Paint.NET can optionally pass a second image for the filters that require two layers. - - if (!secondLayerImagePath.isEmpty()) - { - QImage secondLayer(secondLayerImagePath); - - if (!secondLayer.isNull()) - { - host_paintdotnet::layerImages.append(secondLayer.convertToFormat(QImage::Format_ARGB32)); - } - } - - if (useLastParameters) - { - return launchPluginHeadlessUsingLastParameters(); - } - else - { - return launchPlugin(); - } - } + // disablePreviewMode(GmicQt::FirstOutput); + disablePreviewMode(GmicQt::SecondOutput); + disablePreviewMode(GmicQt::ThirdOutput); + disablePreviewMode(GmicQt::FourthOutput); + disablePreviewMode(GmicQt::First2SecondOutput); + disablePreviewMode(GmicQt::First2ThirdOutput); + disablePreviewMode(GmicQt::First2FourthOutput); + disablePreviewMode(GmicQt::AllOutputs); + + if (useLastParameters) + { + exitCode = launchPluginHeadlessUsingLastParameters(); + } + else + { + exitCode = launchPlugin(); + } + + for (size_t i = 0; i < host_paintdotnet::sharedMemory.size(); ++i) + { + host_paintdotnet::sharedMemory[i].reset(); + } + host_paintdotnet::sharedMemory.clear(); + + if (!pluginDialogWasAccepted()) + { + exitCode = 4; + } - std::cerr << "Unable to load the input image" << firstLayerImagePath.toLocal8Bit().constData() << "\n"; - return 1; + return exitCode; } diff -Nru gmic-2.4.5/gmic-qt/src/HtmlTranslator.h gmic-2.9.2/gmic-qt/src/HtmlTranslator.h --- gmic-2.4.5/gmic-qt/src/HtmlTranslator.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/HtmlTranslator.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_HTMLTRANSLATOR_H_ -#define _GMIC_QT_HTMLTRANSLATOR_H_ +#ifndef GMIC_QT_HTMLTRANSLATOR_H +#define GMIC_QT_HTMLTRANSLATOR_H #include #include @@ -38,4 +38,4 @@ static QTextDocument _document; }; -#endif // _GMIC_QT_HTMLTRANSLATOR_H_ +#endif // GMIC_QT_HTMLTRANSLATOR_H diff -Nru gmic-2.4.5/gmic-qt/src/IconLoader.h gmic-2.9.2/gmic-qt/src/IconLoader.h --- gmic-2.4.5/gmic-qt/src/IconLoader.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/IconLoader.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_ICONLOADER_H_ -#define _GMIC_QT_ICONLOADER_H_ +#ifndef GMIC_QT_ICONLOADER_H +#define GMIC_QT_ICONLOADER_H #include #include @@ -42,4 +42,4 @@ static QPixmap darkerPixmap(const QPixmap & pixmap); }; -#endif // _GMIC_QT_ICONLOADER_H_ +#endif // GMIC_QT_ICONLOADER_H diff -Nru gmic-2.4.5/gmic-qt/src/ImageConverter.h gmic-2.9.2/gmic-qt/src/ImageConverter.h --- gmic-2.4.5/gmic-qt/src/ImageConverter.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/ImageConverter.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_IMAGECONVERTER_H_ -#define _GMIC_QT_IMAGECONVERTER_H_ +#ifndef GMIC_QT_IMAGECONVERTER_H +#define GMIC_QT_IMAGECONVERTER_H class QImage; namespace cimg_library @@ -40,4 +40,4 @@ ImageConverter() = delete; }; -#endif // _GMIC_QT_IMAGECONVERTER_H_ +#endif // GMIC_QT_IMAGECONVERTER_H diff -Nru gmic-2.4.5/gmic-qt/src/ImageTools.cpp gmic-2.9.2/gmic-qt/src/ImageTools.cpp --- gmic-2.4.5/gmic-qt/src/ImageTools.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/ImageTools.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -92,7 +92,7 @@ if (preview_input_images.size() > 1) { try { cimg_library::CImgList preview_images_names; - gmic("v - gui_preview", preview_input_images, preview_images_names, GmicStdLib::Array.constData(), true); + gmic("gui_preview", preview_input_images, preview_images_names, GmicStdLib::Array.constData(), true); if (preview_input_images.size() >= 1) { result.swap(preview_input_images.front()); return; diff -Nru gmic-2.4.5/gmic-qt/src/ImageTools.h gmic-2.9.2/gmic-qt/src/ImageTools.h --- gmic-2.4.5/gmic-qt/src/ImageTools.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/ImageTools.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,17 +22,17 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_IMAGETOOLS_H -#define _GMIC_QT_IMAGETOOLS_H +#ifndef GMIC_QT_IMAGETOOLS_H +#define GMIC_QT_IMAGETOOLS_H #include "Common.h" -#include "PreviewMode.h" +#include "gmic_qt.h" namespace cimg_library { template struct CImg; template struct CImgList; -} +} // namespace cimg_library namespace GmicQt { @@ -40,8 +40,8 @@ template void calibrate_image(cimg_library::CImg & img, const int spectrum, const bool is_preview); void buildPreviewImage(const cimg_library::CImgList & images, cimg_library::CImg & result, GmicQt::PreviewMode previewMode, int previewWidth, int previewHeight); -} +} // namespace GmicQt template bool hasAlphaChannel(const cimg_library::CImg & image); -#endif // _GMIC_QT_IMAGETOOLS_H +#endif // GMIC_QT_IMAGETOOLS_H diff -Nru gmic-2.4.5/gmic-qt/src/InputOutputState.cpp gmic-2.9.2/gmic-qt/src/InputOutputState.cpp --- gmic-2.4.5/gmic-qt/src/InputOutputState.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/InputOutputState.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -26,6 +26,22 @@ #include "InputOutputState.h" #include +namespace +{ +void filterObsoleteInputModes(GmicQt::InputMode & mode) +{ + switch (mode) { + case GmicQt::AllDesc_UNUSED: + case GmicQt::AllVisiblesDesc_UNUSED: + case GmicQt::AllInvisiblesDesc_UNUSED: + mode = GmicQt::UnspecifiedInputMode; + break; + default: + break; + } +} +} // namespace + namespace GmicQt { @@ -54,7 +70,7 @@ void InputOutputState::toJSONObject(QJsonObject & object) const { object = QJsonObject(); - if (inputMode != DefaultInputMode) { + if (inputMode != UnspecifiedInputMode) { object.insert("InputLayers", inputMode); } if (outputMode != DefaultOutputMode) { @@ -69,6 +85,7 @@ { GmicQt::InputOutputState state; state.inputMode = static_cast(object.value("InputLayers").toInt(UnspecifiedInputMode)); + filterObsoleteInputModes(state.inputMode); state.outputMode = static_cast(object.value("OutputMode").toInt(UnspecifiedOutputMode)); state.previewMode = static_cast(object.value("PreviewMode").toInt(UnspecifiedPreviewMode)); return state; diff -Nru gmic-2.4.5/gmic-qt/src/InputOutputState.h gmic-2.9.2/gmic-qt/src/InputOutputState.h --- gmic-2.4.5/gmic-qt/src/InputOutputState.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/InputOutputState.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,10 +22,9 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_INPUTOUTPUTSTATE_H_ -#define _GMIC_QT_INPUTOUTPUTSTATE_H_ +#ifndef GMIC_QT_INPUTOUTPUTSTATE_H +#define GMIC_QT_INPUTOUTPUTSTATE_H -#include "PreviewMode.h" #include "gmic_qt.h" class QJsonObject; @@ -49,4 +48,4 @@ }; } // namespace GmicQt -#endif // _GMIC_QT_INPUTOUTPUTSTATE_H_ +#endif // GMIC_QT_INPUTOUTPUTSTATE_H diff -Nru gmic-2.4.5/gmic-qt/src/KeypointList.cpp gmic-2.9.2/gmic-qt/src/KeypointList.cpp --- gmic-2.4.5/gmic-qt/src/KeypointList.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/KeypointList.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -27,6 +27,8 @@ #include #include +const float KeypointList::Keypoint::DefaultRadius = 6.0f; + KeypointList::KeypointList() = default; void KeypointList::add(const KeypointList::Keypoint & keypoint) @@ -47,7 +49,7 @@ QPointF KeypointList::position(int n) const { const Keypoint & kp = _keypoints[n]; - return {kp.x, kp.y}; + return {static_cast(kp.x), static_cast(kp.y)}; } QColor KeypointList::color(int n) const diff -Nru gmic-2.4.5/gmic-qt/src/KeypointList.h gmic-2.9.2/gmic-qt/src/KeypointList.h --- gmic-2.4.5/gmic-qt/src/KeypointList.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/KeypointList.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,14 +22,16 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_KEYPOINTLIST_H_ -#define _GMIC_QT_KEYPOINTLIST_H_ +#ifndef GMIC_QT_KEYPOINTLIST_H +#define GMIC_QT_KEYPOINTLIST_H #include +#include #include #include #include #include +#include "Common.h" class KeypointList { public: @@ -49,7 +51,7 @@ Keypoint & setNaN(); inline void setPosition(float x, float y); inline void setPosition(const QPointF & p); - static const int DefaultRadius = 6; + static const float DefaultRadius; inline int actualRadiusFromPreviewSize(const QSize & size) const; }; @@ -104,10 +106,10 @@ int KeypointList::Keypoint::actualRadiusFromPreviewSize(const QSize & size) const { if (radius >= 0) { - return radius; + return static_cast(radius); } else { - return std::round(-radius * (std::sqrt(size.width() * size.width() + size.height() * size.height())) / 100.0); + return std::max(2, static_cast(std::round(-static_cast(radius) * (std::sqrt(size.width() * size.width() + size.height() * size.height())) / 100.0))); } } -#endif // _GMIC_QT_KEYPOINTLIST_H_ +#endif // GMIC_QT_KEYPOINTLIST_H diff -Nru gmic-2.4.5/gmic-qt/src/LayersExtentProxy.cpp gmic-2.9.2/gmic-qt/src/LayersExtentProxy.cpp --- gmic-2.4.5/gmic-qt/src/LayersExtentProxy.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/LayersExtentProxy.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -1,6 +1,6 @@ /** -*- mode: c++ ; c-basic-offset: 2 -*- * - * @file LayersExtendsProxy.cpp + * @file LayersExtentProxy.cpp * * Copyright 2017 Sebastien Fourey * diff -Nru gmic-2.4.5/gmic-qt/src/LayersExtentProxy.h gmic-2.9.2/gmic-qt/src/LayersExtentProxy.h --- gmic-2.4.5/gmic-qt/src/LayersExtentProxy.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/LayersExtentProxy.h 2020-09-03 11:37:05.000000000 +0000 @@ -1,6 +1,6 @@ /** -*- mode: c++ ; c-basic-offset: 2 -*- * - * @file LayersExtendsProxy.h + * @file LayersExtentProxy.h * * Copyright 2017 Sebastien Fourey * @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_LAYERS_EXTENT_PROXY_H_ -#define _GMIC_QT_LAYERS_EXTENT_PROXY_H_ +#ifndef GMIC_QT_LAYERS_EXTENT_PROXY_H +#define GMIC_QT_LAYERS_EXTENT_PROXY_H #include #include "gmic_qt.h" @@ -40,4 +40,4 @@ static GmicQt::InputMode _inputMode; }; -#endif // _GMIC_QT_LAYERS_EXTENT_PROXY_H_ +#endif // GMIC_QT_LAYERS_EXTENT_PROXY_H diff -Nru gmic-2.4.5/gmic-qt/src/Logger.cpp gmic-2.9.2/gmic-qt/src/Logger.cpp --- gmic-2.4.5/gmic-qt/src/Logger.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Logger.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -23,7 +23,10 @@ * */ #include "Logger.h" +#include #include +#include +#include "Common.h" #include "Utils.h" #include "gmic_qt.h" #include "gmic.h" @@ -71,8 +74,42 @@ setMode(mode); } -void Logger::log(const QString & message) +void Logger::log(const QString & message, bool space) { - std::fprintf(cimg_library::cimg::output(), "%s", message.toLocal8Bit().constData()); + log(message, QString(), space); +} + +void Logger::log(const QString & message, const QString & hint, bool space) +{ + QString text = message; + while (!text.isEmpty() && text[text.size() - 1].isSpace()) { + text.chop(1); + } + QStringList lines = text.split("\n", QString::KeepEmptyParts); + + QString prefix = QString("[%1]").arg(GmicQt::pluginCodeName()); + prefix += hint.isEmpty() ? " " : QString("./%1/ ").arg(hint); + + if (space) { + std::fprintf(cimg_library::cimg::output(), "\n"); + } + for (const QString & line : lines) { + std::fprintf(cimg_library::cimg::output(), "%s\n", (prefix + line).toLocal8Bit().constData()); + } std::fflush(cimg_library::cimg::output()); } + +void Logger::error(const QString & message, bool space) +{ + log(message, "error", space); +} + +void Logger::warning(const QString & message, bool space) +{ + log(message, "warning", space); +} + +void Logger::note(const QString & message, bool space) +{ + log(message, "note", space); +} diff -Nru gmic-2.4.5/gmic-qt/src/Logger.h gmic-2.9.2/gmic-qt/src/Logger.h --- gmic-2.4.5/gmic-qt/src/Logger.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Logger.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_LOGGER_H_ -#define _GMIC_QT_LOGGER_H_ +#ifndef GMIC_QT_LOGGER_H +#define GMIC_QT_LOGGER_H #include #include "gmic_qt.h" @@ -42,7 +42,11 @@ static void setMode(const GmicQt::OutputMessageMode mode); static void clear(); static void close(); - static void log(const QString & message); + static void log(const QString & message, const QString & hint, bool space = false); + static void error(const QString & message, bool space = false); + static void warning(const QString & message, bool space = false); + static void note(const QString & message, bool space = false); + static void log(const QString & message, bool space = false); Logger() = delete; private: @@ -50,4 +54,4 @@ static Mode _currentMode; }; -#endif // _GMIC_QT_LOGGER_H_ +#endif // GMIC_QT_LOGGER_H diff -Nru gmic-2.4.5/gmic-qt/src/MainWindow.cpp gmic-2.9.2/gmic-qt/src/MainWindow.cpp --- gmic-2.4.5/gmic-qt/src/MainWindow.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/MainWindow.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -26,11 +26,12 @@ #include #include #include -#include #include +#include #include #include #include +#include #include #include #include @@ -38,6 +39,8 @@ #include #include #include "Common.h" +#include "CroppedActiveLayerProxy.h" +#include "CroppedImageListProxy.h" #include "DialogSettings.h" #include "FilterSelector/FavesModelReader.h" #include "FilterSelector/FiltersPresenter.h" @@ -53,6 +56,8 @@ #include "ui_mainwindow.h" #include "gmic.h" +bool MainWindow::_isAccepted = false; + // // TODO : Handle window maximization properly (Windows as well as some Linux desktops) // @@ -92,11 +97,11 @@ ui->tbExpandCollapse->setToolTip(tr("Expand/Collapse all")); - ui->logosLabel->setToolTip(tr("G'MIC (http://gmic.eu)
" - "GREYC (http://www.greyc.fr)
" - "CNRS (http://www.cnrs.fr)
" - "Normandy University (http://www.unicaen.fr)
" - "Ensicaen (http://www.ensicaen.fr)")); + ui->logosLabel->setToolTip(tr("G'MIC (https://gmic.eu)
" + "GREYC (https://www.greyc.fr)
" + "CNRS (https://www.cnrs.fr)
" + "Normandy University (https://www.unicaen.fr)
" + "Ensicaen (https://www.ensicaen.fr)")); ui->logosLabel->setPixmap(QPixmap(":resources/logos.png")); ui->tbSelectionMode->setToolTip(tr("Selection mode")); @@ -146,6 +151,11 @@ ui->verticalSplitter->setStretchFactor(0, 5); ui->verticalSplitter->setStretchFactor(0, 1); + if (!ui->inOutSelector->hasActiveControls()) { + ui->vSplitterLine->hide(); + ui->inOutSelector->hide(); + } + QPalette p = QGuiApplication::palette(); DialogSettings::UnselectedFilterTextColor = p.color(QPalette::Disabled, QPalette::WindowText); @@ -166,10 +176,13 @@ connect(escAction, SIGNAL(triggered(bool)), this, SLOT(onEscapeKeyPressed())); addAction(escAction); + CroppedImageListProxy::clear(); + CroppedActiveLayerProxy::clear(); LayersExtentProxy::clear(); QSize layersExtent = LayersExtentProxy::getExtent(ui->inOutSelector->inputMode()); ui->previewWidget->setFullImageSize(layersExtent); _lastPreviewKeypointBurstUpdateTime = 0; + _isAccepted = false; TIMING; makeConnections(); @@ -219,7 +232,7 @@ p.setColor(QPalette::Text, QColor(255, 255, 255)); p.setColor(QPalette::ButtonText, QColor(255, 255, 255)); p.setColor(QPalette::WindowText, QColor(255, 255, 255)); - QColor linkColor(100, 100, 100); + QColor linkColor(130, 130, 150); linkColor = linkColor.lighter(); p.setColor(QPalette::Link, linkColor); p.setColor(QPalette::LinkVisited, linkColor); @@ -254,7 +267,6 @@ "QGroupBox { border: 1px solid #808080; margin-top: 4ex; } " "QFileDialog QAbstractItemView { background: #505050; } " "QComboBox:editable { background: #505050; } " - "QComboBox::disabled { background: rgb(40,40,40); } " "QProgressBar { background: #505050; }"; qApp->setStyleSheet(css); ui->inOutSelector->setDarkTheme(); @@ -292,7 +304,7 @@ buildFiltersTree(); ui->tbUpdateFilters->setEnabled(true); if (!_filtersPresenter->currentFilter().hash.isEmpty()) { - ui->previewWidget->sendUpdateRequest(); + ui->previewWidget->sendUpdateRequest(); // FIXME : Select filter } } @@ -475,7 +487,7 @@ connect(_filtersPresenter, SIGNAL(filterSelectionChanged()), this, SLOT(onFilterSelectionChanged())); connect(ui->pbOk, SIGNAL(clicked(bool)), this, SLOT(onOkClicked())); - connect(ui->pbCancel, SIGNAL(clicked(bool)), this, SLOT(onCloseClicked())); + connect(ui->pbCancel, SIGNAL(clicked(bool)), this, SLOT(onCancelClicked())); connect(ui->pbApply, SIGNAL(clicked(bool)), this, SLOT(onApplyClicked())); connect(ui->tbResetParameters, SIGNAL(clicked(bool)), this, SLOT(onReset())); @@ -561,7 +573,14 @@ void MainWindow::onPreviewKeypointsEvent(unsigned int flags, unsigned long time) { if (flags & PreviewWidget::KeypointMouseReleaseEvent) { - ui->filterParams->setKeypoints(ui->previewWidget->keypoints(), true); + if (flags & PreviewWidget::KeypointBurstEvent) { + // Notify the filter twice (synchronously) so that it can guess that the button has been released + ui->filterParams->setKeypoints(ui->previewWidget->keypoints(), false); + onPreviewUpdateRequested(true); + onPreviewUpdateRequested(true); + } else { + ui->filterParams->setKeypoints(ui->previewWidget->keypoints(), true); + } _lastPreviewKeypointBurstUpdateTime = 0; } else { ui->filterParams->setKeypoints(ui->previewWidget->keypoints(), false); @@ -581,6 +600,7 @@ void MainWindow::onPreviewImageAvailable() { ui->filterParams->setValues(_processor.gmicStatus(), false); + ui->filterParams->setVisibilityStates(_processor.parametersVisibilityStates()); // Make sure keypoint positions are synchronized with gmic status if (ui->filterParams->hasKeypoints()) { ui->previewWidget->setKeypoints(ui->filterParams->keypoints()); @@ -611,6 +631,11 @@ ui->previewWidget->sendUpdateRequest(); } +bool MainWindow::isAccepted() +{ + return _isAccepted; +} + void MainWindow::processImage() { // Abort any already running thread @@ -678,7 +703,9 @@ enableWidgetList(true); ui->previewWidget->update(); ui->filterParams->setValues(_processor.gmicStatus(), false); + ui->filterParams->setVisibilityStates(_processor.parametersVisibilityStates()); if ((_pendingActionAfterCurrentProcessing == OkAction || _pendingActionAfterCurrentProcessing == CloseAction)) { + _isAccepted = (_pendingActionAfterCurrentProcessing == OkAction); close(); } else { // Extent cache has been cleared by the GmicProcessor @@ -716,17 +743,20 @@ void MainWindow::onOkClicked() { if (_filtersPresenter->currentFilter().isNoApplyFilter()) { + _isAccepted = _processor.completedFullImageProcessingCount(); close(); + return; } if (_okButtonShouldApply) { _pendingActionAfterCurrentProcessing = OkAction; processImage(); } else { + _isAccepted = _processor.completedFullImageProcessingCount(); close(); } } -void MainWindow::onCloseClicked() +void MainWindow::onCancelClicked() { TIMING; if (_processor.isProcessing() && confirmAbortProcessingOnCloseRequest()) { @@ -762,6 +792,7 @@ void MainWindow::onReset() { if (!_filtersPresenter->currentFilter().hash.isEmpty() && _filtersPresenter->currentFilter().isAFave) { + ui->filterParams->setVisibilityStates(_filtersPresenter->currentFilter().defaultVisibilityStates); ui->filterParams->setValues(_filtersPresenter->currentFilter().defaultParameterValues, true); return; } @@ -788,9 +819,10 @@ void MainWindow::saveCurrentParameters() { QString hash = ui->filterParams->filterHash(); - if (!hash.isEmpty() && (hash == ui->filterParams->filterHash())) { + if (!hash.isEmpty()) { ParametersCache::setValues(hash, ui->filterParams->valueStringList()); - ParametersCache::setInputOutputState(hash, ui->inOutSelector->state()); + ParametersCache::setVisibilityStates(hash, ui->filterParams->visibilityStates()); + ParametersCache::setInputOutputState(hash, ui->inOutSelector->state(), _filtersPresenter->currentFilter().defaultInputMode); } } @@ -871,14 +903,16 @@ setGeometry(r); move(position); } else { - QDesktopWidget desktop; - QRect screenSize = desktop.availableGeometry(); - screenSize.setWidth(static_cast(screenSize.width() * 0.66)); - screenSize.setHeight(static_cast(screenSize.height() * 0.66)); - screenSize.moveCenter(desktop.availableGeometry().center()); - setGeometry(screenSize); - int w = screenSize.width(); - ui->splitter->setSizes(QList() << static_cast(w * 0.4) << static_cast(w * 0.2) << static_cast(w * 0.4)); + QList screens = QGuiApplication::screens(); + if (!screens.isEmpty()) { + QRect screenSize = screens.front()->geometry(); + screenSize.setWidth(static_cast(screenSize.width() * 0.66)); + screenSize.setHeight(static_cast(screenSize.height() * 0.66)); + screenSize.moveCenter(screens.front()->geometry().center()); + setGeometry(screenSize); + int w = screenSize.width(); + ui->splitter->setSizes(QList() << static_cast(w * 0.4) << static_cast(w * 0.2) << static_cast(w * 0.4)); + } } } @@ -991,7 +1025,11 @@ if (savedValues.isEmpty() && filter.isAFave) { savedValues = filter.defaultParameterValues; } - if (!ui->filterParams->build(filter.name, filter.hash, filter.parameters, savedValues)) { + QList savedVisibilityStates = ParametersCache::getVisibilityStates(filter.hash); + if (savedVisibilityStates.isEmpty() && filter.isAFave) { + savedVisibilityStates = filter.defaultVisibilityStates; + } + if (!ui->filterParams->build(filter.name, filter.hash, filter.parameters, savedValues, savedVisibilityStates)) { _filtersPresenter->setInvalidFilter(); ui->previewWidget->setKeypoints(KeypointList()); } else { @@ -999,8 +1037,22 @@ } ui->filterName->setText(QString("%1").arg(filter.name)); ui->inOutSelector->enable(); - ui->inOutSelector->show(); - ui->inOutSelector->setState(ParametersCache::getInputOutputState(filter.hash), false); + if (ui->inOutSelector->hasActiveControls()) { + ui->inOutSelector->show(); + } else { + ui->inOutSelector->hide(); + } + + GmicQt::InputOutputState inOutState = ParametersCache::getInputOutputState(filter.hash); + if (inOutState.inputMode == GmicQt::UnspecifiedInputMode) { + if ((filter.defaultInputMode != GmicQt::UnspecifiedInputMode)) { + inOutState.inputMode = filter.defaultInputMode; + } else { + inOutState.inputMode = GmicQt::DefaultInputMode; + } + } + ui->inOutSelector->setState(inOutState, false); + ui->previewWidget->updateFullImageSizeIfDifferent(LayersExtentProxy::getExtent(ui->inOutSelector->inputMode())); ui->filterName->setVisible(true); ui->tbAddFave->setEnabled(true); @@ -1015,7 +1067,7 @@ void MainWindow::setNoFilter() { - ui->filterParams->setNoFilter(); + ui->filterParams->setNoFilter(_filtersPresenter->errorMessage()); ui->previewWidget->disableRightClick(); ui->previewWidget->setKeypoints(KeypointList()); ui->inOutSelector->hide(); @@ -1025,20 +1077,18 @@ ui->tbResetParameters->setVisible(false); ui->zoomLevelSelector->showWarning(false); _okButtonShouldApply = false; - - ui->tbRemoveFave->setEnabled(false); + ui->tbRemoveFave->setEnabled(_filtersPresenter->danglingFaveIsSelected()); ui->tbRenameFave->setEnabled(false); } void MainWindow::showEvent(QShowEvent * event) { TIMING; - static bool first = true; event->accept(); - if (!first) { + if (_showEventReceived) { return; } - first = false; + _showEventReceived = true; adjustVerticalSplitter(); if (_newSession) { Logger::clear(); @@ -1093,7 +1143,7 @@ return; } saveCurrentParameters(); - _filtersPresenter->addSelectedFilterAsNewFave(ui->filterParams->valueStringList(), ui->inOutSelector->state()); + _filtersPresenter->addSelectedFilterAsNewFave(ui->filterParams->valueStringList(), ui->filterParams->visibilityStates(), ui->inOutSelector->state()); } void MainWindow::onRemoveFave() { diff -Nru gmic-2.4.5/gmic-qt/src/MainWindow.h gmic-2.9.2/gmic-qt/src/MainWindow.h --- gmic-2.4.5/gmic-qt/src/MainWindow.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/MainWindow.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_MAINWINDOW_H_ -#define _GMIC_QT_MAINWINDOW_H_ +#ifndef GMIC_QT_MAINWINDOW_H +#define GMIC_QT_MAINWINDOW_H #include #include @@ -63,8 +63,8 @@ PreviewOnRight }; - explicit MainWindow(QWidget * parent = 0); - ~MainWindow(); + explicit MainWindow(QWidget * parent = nullptr); + ~MainWindow() override; void updateFiltersFromSources(int ageLimit, bool useNetwork); void setDarkTheme(); @@ -79,7 +79,7 @@ void expandOrCollapseFolders(); void search(const QString &); void onOkClicked(); - void onCloseClicked(); + void onCancelClicked(); void onProgressionWidgetCancelClicked(); void onReset(); void onPreviewZoomReset(); @@ -100,6 +100,7 @@ void onPreviewImageAvailable(); void onPreviewError(const QString & message); void onParametersChanged(); + static bool isAccepted(); protected: void timerEvent(QTimerEvent *) override; @@ -147,9 +148,9 @@ }; Ui::MainWindow * ui; - ProcessingAction _pendingActionAfterCurrentProcessing; PreviewPosition _previewPosition = PreviewOnRight; + bool _showEventReceived = false; bool _okButtonShouldApply = false; QIcon _expandIcon; QIcon _collapseIcon; @@ -162,6 +163,7 @@ FiltersPresenter * _filtersPresenter; GmicProcessor _processor; ulong _lastPreviewKeypointBurstUpdateTime; + static bool _isAccepted; }; -#endif // _GMIC_QT_MAINWINDOW_H_ +#endif // GMIC_QT_MAINWINDOW_H diff -Nru gmic-2.4.5/gmic-qt/src/OverrideCursor.h gmic-2.9.2/gmic-qt/src/OverrideCursor.h --- gmic-2.4.5/gmic-qt/src/OverrideCursor.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/OverrideCursor.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_OVERRIDECURSOR_H_ -#define _GMIC_QT_OVERRIDECURSOR_H_ +#ifndef GMIC_QT_OVERRIDECURSOR_H +#define GMIC_QT_OVERRIDECURSOR_H class OverrideCursor { public: @@ -40,4 +40,4 @@ static bool _pointingHand; }; -#endif // _GMIC_QT_OVERRIDECURSOR_H_ +#endif // GMIC_QT_OVERRIDECURSOR_H diff -Nru gmic-2.4.5/gmic-qt/src/ParametersCache.cpp gmic-2.9.2/gmic-qt/src/ParametersCache.cpp --- gmic-2.4.5/gmic-qt/src/ParametersCache.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/ParametersCache.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -31,18 +31,22 @@ #include #include #include +#include "Common.h" #include "Globals.h" +#include "Logger.h" #include "Utils.h" #include "gmic.h" QHash> ParametersCache::_parametersCache; QHash ParametersCache::_inOutPanelStates; +QHash> ParametersCache::_visibilityStates; void ParametersCache::load(bool loadFiltersParameters) { // Load JSON file _parametersCache.clear(); _inOutPanelStates.clear(); + _visibilityStates.clear(); QString jsonFilename = QString("%1%2").arg(GmicQt::path_rc(true), PARAMETERS_CACHE_FILENAME); QFile jsonFile(jsonFilename); @@ -50,13 +54,23 @@ return; } if (jsonFile.open(QFile::ReadOnly)) { +#ifdef _GMIC_QT_DEBUG_ + QJsonDocument jsonDoc; + QByteArray allFile = jsonFile.readAll(); + if (allFile.startsWith("{\n")) { + jsonDoc = QJsonDocument::fromJson(allFile); + } else { + jsonDoc = QJsonDocument::fromBinaryData(qUncompress(allFile)); + } +#else QJsonDocument jsonDoc = QJsonDocument::fromBinaryData(qUncompress(jsonFile.readAll())); +#endif if (jsonDoc.isNull()) { - std::cerr << "[gmic-qt] Warning: cannot parse " << jsonFilename.toStdString() << std::endl; - std::cerr << "[gmic-qt] Last filters parameters are lost!\n"; + Logger::warning(QString("Cannot parse ") + jsonFilename); + Logger::warning("Last filters parameters are lost!"); } else { if (!jsonDoc.isObject()) { - std::cerr << "[gmic-qt] Error: JSON file format is not correct (" << jsonFilename.toStdString() << ")\n"; + Logger::error(QString("JSON file format is not correct (") + jsonFilename + ")"); } else { QJsonObject documentObject = jsonDoc.object(); QJsonObject::iterator itFilter = documentObject.begin(); @@ -74,6 +88,15 @@ } _parametersCache[hash] = values; } + QJsonValue visibilityStates = filterObject.value("visibility_states"); + if (!visibilityStates.isUndefined()) { + QJsonArray array = visibilityStates.toArray(); + QList values; + for (const QJsonValueRef & v : array) { + values.push_back(v.toInt()); + } + _visibilityStates[hash] = values; + } } QJsonValue state = filterObject.value("in_out_state"); // Retrieve Input/Output state @@ -86,8 +109,8 @@ } } } else { - std::cerr << "[gmic-qt] Error: Cannot read " << jsonFilename.toStdString() << std::endl; - std::cerr << "[gmic-qt] Parameters cannot be restored.\n"; + Logger::error("Cannot read " + jsonFilename); + Logger::error("Parameters cannot be restored"); } } @@ -110,13 +133,18 @@ // "OutputMode": 100, // "PreviewMode": 100 // } + // "visibility_states": [ + // 0, + // 1, + // 2, + // 0 + // ] // } // } QJsonObject documentObject; // Add Input/Output states - QHash::iterator itState = _inOutPanelStates.begin(); while (itState != _inOutPanelStates.end()) { QJsonObject filterObject; @@ -147,6 +175,26 @@ ++itParams; } + // Add visibility states + + QHash>::iterator itVisibilities = _visibilityStates.begin(); + while (itVisibilities != _visibilityStates.end()) { + QJsonObject filterObject; + QJsonObject::iterator entry = documentObject.find(itVisibilities.key()); + if (entry != documentObject.end()) { + filterObject = entry.value().toObject(); + } + // Add the parameters list + QJsonArray array; + QList states = itVisibilities.value(); + for (const int & state : states) { + array.push_back(state); + } + filterObject.insert("visibility_states", array); + documentObject.insert(itVisibilities.key(), filterObject); + ++itVisibilities; + } + QJsonDocument jsonDoc(documentObject); QString jsonFilename = QString("%1%2").arg(GmicQt::path_rc(true), PARAMETERS_CACHE_FILENAME); QFile jsonFile(jsonFilename); @@ -156,7 +204,11 @@ QFile::copy(jsonFilename, bakFilename); } if (jsonFile.open(QFile::WriteOnly | QFile::Truncate)) { +#ifdef _GMIC_QT_DEBUG_ + qint64 count = jsonFile.write(jsonDoc.toJson()); +#else qint64 count = jsonFile.write(qCompress(jsonDoc.toBinaryData())); +#endif // jsonFile.write(jsonDoc.toJson()); // jsonFile.write(qCompress(jsonDoc.toBinaryData())); jsonFile.close(); @@ -169,8 +221,8 @@ QFile::remove(path + "gmic_qt_parameters_json.dat"); } } else { - std::cerr << "[gmic-qt] Error: Cannot write " << jsonFilename.toStdString() << std::endl; - std::cerr << "[gmic-qt] Parameters cannot be saved.\n"; + Logger::error("Cannot write " + jsonFilename); + Logger::error("Parameters cannot be saved"); } } @@ -181,12 +233,25 @@ QList ParametersCache::getValues(const QString & hash) { - if (_parametersCache.count(hash)) { + if (_parametersCache.contains(hash)) { return _parametersCache[hash]; } return QList(); } +void ParametersCache::setVisibilityStates(const QString & hash, const QList & states) +{ + _visibilityStates[hash] = states; +} + +QList ParametersCache::getVisibilityStates(const QString & hash) +{ + if (_visibilityStates.contains(hash)) { + return _visibilityStates[hash]; + } + return QList(); +} + void ParametersCache::remove(const QString & hash) { _parametersCache.remove(hash); @@ -198,12 +263,13 @@ if (_inOutPanelStates.contains(hash)) { return _inOutPanelStates[hash]; } - return GmicQt::InputOutputState::Default; + return GmicQt::InputOutputState(GmicQt::UnspecifiedInputMode, GmicQt::DefaultOutputMode, GmicQt::DefaultPreviewMode); } -void ParametersCache::setInputOutputState(const QString & hash, const GmicQt::InputOutputState & state) +void ParametersCache::setInputOutputState(const QString & hash, const GmicQt::InputOutputState & state, const GmicQt::InputMode defaultInputMode) { - if (state.isDefault()) { + if ((state == GmicQt::InputOutputState(defaultInputMode, GmicQt::DefaultOutputMode, GmicQt::DefaultPreviewMode)) // + || (state == GmicQt::InputOutputState(GmicQt::UnspecifiedInputMode, GmicQt::DefaultOutputMode, GmicQt::DefaultPreviewMode))) { _inOutPanelStates.remove(hash); return; } diff -Nru gmic-2.4.5/gmic-qt/src/ParametersCache.h gmic-2.9.2/gmic-qt/src/ParametersCache.h --- gmic-2.4.5/gmic-qt/src/ParametersCache.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/ParametersCache.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_PARAMETERSCACHE_H -#define _GMIC_QT_PARAMETERSCACHE_H +#ifndef GMIC_QT_PARAMETERSCACHE_H +#define GMIC_QT_PARAMETERSCACHE_H #include #include @@ -36,16 +36,19 @@ static void save(); static void setValues(const QString & hash, const QList & values); static QList getValues(const QString & hash); + static void setVisibilityStates(const QString & hash, const QList & states); + static QList getVisibilityStates(const QString & hash); static void remove(const QString & hash); static GmicQt::InputOutputState getInputOutputState(const QString & hash); - static void setInputOutputState(const QString & hash, const GmicQt::InputOutputState &); + static void setInputOutputState(const QString & hash, const GmicQt::InputOutputState & state, const GmicQt::InputMode defaultInputMode); static void cleanup(const QSet & hashesToKeep); private: static QHash> _parametersCache; static QHash _inOutPanelStates; + static QHash> _visibilityStates; }; -#endif // _GMIC_QT_PARAMETERSCACHE_H +#endif // GMIC_QT_PARAMETERSCACHE_H diff -Nru gmic-2.4.5/gmic-qt/src/PreviewMode.cpp gmic-2.9.2/gmic-qt/src/PreviewMode.cpp --- gmic-2.4.5/gmic-qt/src/PreviewMode.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/PreviewMode.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -/** -*- mode: c++ ; c-basic-offset: 2 -*- - * - * @file PreviewMode.cpp - * - * Copyright 2017 Sebastien Fourey - * - * This file is part of G'MIC-Qt, a generic plug-in for raster graphics - * editors, offering hundreds of filters thanks to the underlying G'MIC - * image processing framework. - * - * gmic_qt 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. - * - * gmic_qt is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with gmic_qt. If not, see . - * - */ - -#include "PreviewMode.h" - -namespace GmicQt -{ -const PreviewMode DefaultPreviewMode = FirstOutput; -} diff -Nru gmic-2.4.5/gmic-qt/src/PreviewMode.h gmic-2.9.2/gmic-qt/src/PreviewMode.h --- gmic-2.4.5/gmic-qt/src/PreviewMode.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/PreviewMode.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -/** -*- mode: c++ ; c-basic-offset: 2 -*- - * - * @file PreviewMode.h - * - * Copyright 2017 Sebastien Fourey - * - * This file is part of G'MIC-Qt, a generic plug-in for raster graphics - * editors, offering hundreds of filters thanks to the underlying G'MIC - * image processing framework. - * - * gmic_qt 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. - * - * gmic_qt is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with gmic_qt. If not, see . - * - */ -#ifndef _GMIC_QT_PREVIEWMODE_H_ -#define _GMIC_QT_PREVIEWMODE_H_ - -namespace GmicQt -{ -enum PreviewMode -{ - FirstOutput, - SecondOutput, - ThirdOutput, - FourthOutput, - First2SecondOutput, - First2ThirdOutput, - First2FourthOutput, - AllOutputs, - UnspecifiedPreviewMode = 100 -}; -extern const PreviewMode DefaultPreviewMode; -} - -#endif // _GMIC_QT_PREVIEWMODE_H_ diff -Nru gmic-2.4.5/gmic-qt/src/TimeLogger.h gmic-2.9.2/gmic-qt/src/TimeLogger.h --- gmic-2.4.5/gmic-qt/src/TimeLogger.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/TimeLogger.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_TIMELOGGER_H_ -#define _GMIC_QT_TIMELOGGER_H_ +#ifndef GMIC_QT_TIMELOGGER_H +#define GMIC_QT_TIMELOGGER_H #include #include @@ -42,4 +42,4 @@ static std::unique_ptr _instance; }; -#endif // _GMIC_QT_TIMELOGGER_H_ +#endif // GMIC_QT_TIMELOGGER_H diff -Nru gmic-2.4.5/gmic-qt/src/Updater.cpp gmic-2.9.2/gmic-qt/src/Updater.cpp --- gmic-2.4.5/gmic-qt/src/Updater.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Updater.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -58,13 +58,9 @@ _sources.clear(); _sourceIsStdLib.clear(); // Build sources map - QString prefix; - if (_outputMessageMode >= GmicQt::DebugConsole) { - prefix = "debug "; - } else if (_outputMessageMode >= GmicQt::VerboseLayerName) { - prefix = "v -99 "; - } else { - prefix = "v - "; + QString prefix = GmicQt::commandFromOutputMessageMode(_outputMessageMode); + if (!prefix.isEmpty()) { + prefix.push_back(QChar(' ')); } cimg_library::CImgList gptSources; cimg_library::CImgList names; @@ -233,11 +229,11 @@ d << error; str = str.trimmed(); _errorMessages << QString(tr("Error downloading %1
Error %2: %3")).arg(reply->request().url().toString()).arg(static_cast(error)).arg(str); - Logger::log("\n******* Update Error ******\n"); - Logger::log(QString("Error: %1\n").arg(reply->errorString())); - Logger::log("******* Full replay contents ******\n"); - Logger::log(reply->readAll()); - Logger::log(QString("\n******** HTTP Status: %1\n").arg(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt())); + Logger::error("Update failed"); + Logger::note(QString("Error string: %1").arg(reply->errorString())); + Logger::note("******* Full reply contents ******\n"); + Logger::note(reply->readAll()); + Logger::note(QString("******** HTTP Status: %1").arg(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt())); } _pendingReplies.remove(reply); if (_pendingReplies.isEmpty()) { @@ -252,7 +248,7 @@ reply->deleteLater(); } -void Updater::notifyAllDowloadsOK() +void Updater::notifyAllDownloadsOK() { _errorMessages.clear(); emit updateIsDone(UpdateSuccessful); diff -Nru gmic-2.4.5/gmic-qt/src/Updater.h gmic-2.9.2/gmic-qt/src/Updater.h --- gmic-2.4.5/gmic-qt/src/Updater.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Updater.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_UPDATER_H_ -#define _GMIC_QT_UPDATER_H_ +#ifndef GMIC_QT_UPDATER_H +#define GMIC_QT_UPDATER_H #include #include @@ -63,8 +63,8 @@ * older than the given age limit (in hours). To force download * of all the sources, set the age limit to zero. * - * @param ageLimit Delay bewteen 2 network updates in hours - * @param timeout in seconds before aborting dowloads + * @param ageLimit Delay between 2 network updates in hours + * @param timeout in seconds before aborting downloads * @param useNetwork Enable internet access */ void startUpdate(int ageLimit, int timeout, bool useNetwork); @@ -85,7 +85,7 @@ public slots: void onNetworkReplyFinished(QNetworkReply *); - void notifyAllDowloadsOK(); + void notifyAllDownloadsOK(); void cancelAllPendingDownloads(); void onUpdateNotNecessary(); @@ -110,4 +110,4 @@ bool _someNetworkUpdatesAchieved; }; -#endif // _GMIC_QT_UPDATER_H_ +#endif // GMIC_QT_UPDATER_H diff -Nru gmic-2.4.5/gmic-qt/src/Utils.cpp gmic-2.9.2/gmic-qt/src/Utils.cpp --- gmic-2.4.5/gmic-qt/src/Utils.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Utils.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -113,20 +113,21 @@ const char * commandFromOutputMessageMode(OutputMessageMode mode) { - static const char commands[][6] = {"v -", "v -99", "v 0", "debug"}; - if (mode == GmicQt::Quiet) { - return static_cast(commands[0]); + switch (mode) { + case Quiet: + case VerboseLayerName: + case VerboseConsole: + case VerboseLogFile: + case UnspecifiedOutputMessageMode: + return ""; + case VeryVerboseConsole: + case VeryVerboseLogFile: + return "v 3"; + case DebugConsole: + case DebugLogFile: + return "debug"; } - if (mode >= GmicQt::VerboseLayerName && mode <= GmicQt::VerboseLogFile) { - return static_cast(commands[1]); - } - if (mode == GmicQt::VeryVerboseConsole || mode == GmicQt::VeryVerboseLogFile) { - return static_cast(commands[2]); - } - if (mode == GmicQt::DebugConsole || mode == GmicQt::DebugLogFile) { - return static_cast(commands[3]); - } - return static_cast(commands[0]); + return ""; } void downcaseCommandTitle(QString & title) @@ -169,4 +170,14 @@ title[0] = title[0].toUpper(); } +void appendWithSpace(QString & str, const QString & other) +{ + if (str.isEmpty() || other.isEmpty()) { + str += other; + return; + } + str += QChar(' '); + str += other; +} + } // namespace GmicQt diff -Nru gmic-2.4.5/gmic-qt/src/Utils.h gmic-2.9.2/gmic-qt/src/Utils.h --- gmic-2.4.5/gmic-qt/src/Utils.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Utils.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_UTILS_H_ -#define _GMIC_QT_UTILS_H_ +#ifndef GMIC_QT_UTILS_H +#define GMIC_QT_UTILS_H #include "gmic_qt.h" class QString; @@ -36,6 +36,7 @@ const QString & pluginCodeName(); const char * commandFromOutputMessageMode(OutputMessageMode mode); void downcaseCommandTitle(QString & title); +void appendWithSpace(QString & str, const QString & other); } // namespace GmicQt -#endif // _GMIC_QT_UTILS_H_ +#endif // GMIC_QT_UTILS_H diff -Nru gmic-2.4.5/gmic-qt/src/Widgets/InOutPanel.cpp gmic-2.9.2/gmic-qt/src/Widgets/InOutPanel.cpp --- gmic-2.4.5/gmic-qt/src/Widgets/InOutPanel.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Widgets/InOutPanel.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -31,6 +31,33 @@ #include "IconLoader.h" #include "ui_inoutpanel.h" +QList InOutPanel::_enabledInputModes = { + GmicQt::NoInput, // + GmicQt::Active, // + GmicQt::All, // + GmicQt::ActiveAndBelow, // + GmicQt::ActiveAndAbove, // + GmicQt::AllVisible, // + GmicQt::AllInvisible, +}; + +QList InOutPanel::_enabledOutputModes = { + GmicQt::InPlace, + GmicQt::NewLayers, + GmicQt::NewActiveLayers, + GmicQt::NewImage, +}; + +QList InOutPanel::_enabledPreviewModes = { // + GmicQt::FirstOutput, // + GmicQt::SecondOutput, // + GmicQt::ThirdOutput, // + GmicQt::FourthOutput, // + GmicQt::First2SecondOutput, // + GmicQt::First2ThirdOutput, // + GmicQt::First2FourthOutput, // + GmicQt::AllOutputs}; + /* * InOutPanel methods */ @@ -43,32 +70,69 @@ ui->tbReset->setIcon(LOAD_ICON("view-refresh")); ui->inputLayers->setToolTip(tr("Input layers")); - ui->inputLayers->addItem(tr("None"), GmicQt::NoInput); - ui->inputLayers->addItem(tr("Active (default)"), GmicQt::Active); - ui->inputLayers->addItem(tr("All"), GmicQt::All); - ui->inputLayers->addItem(tr("Active and below"), GmicQt::ActiveAndBelow); - ui->inputLayers->addItem(tr("Active and above"), GmicQt::ActiveAndAbove); - ui->inputLayers->addItem(tr("All visible"), GmicQt::AllVisibles); - ui->inputLayers->addItem(tr("All invisible"), GmicQt::AllInvisibles); - ui->inputLayers->addItem(tr("All visible (decr.)"), GmicQt::AllVisiblesDesc); - ui->inputLayers->addItem(tr("All invisible (decr.)"), GmicQt::AllInvisiblesDesc); - ui->inputLayers->addItem(tr("All (decr.)"), GmicQt::AllDesc); + +#define ADD_INPUT_IF_ENABLED(MODE, TEXT) \ + if (_enabledInputModes.contains(MODE)) \ + ui->inputLayers->addItem(tr(TEXT), MODE) + + ADD_INPUT_IF_ENABLED(GmicQt::NoInput, "None"); + ADD_INPUT_IF_ENABLED(GmicQt::Active, "Active (default)"); + ADD_INPUT_IF_ENABLED(GmicQt::All, "All"); + ADD_INPUT_IF_ENABLED(GmicQt::ActiveAndBelow, "Active and below"); + ADD_INPUT_IF_ENABLED(GmicQt::ActiveAndAbove, "Active and above"); + ADD_INPUT_IF_ENABLED(GmicQt::AllVisible, "All visible"); + ADD_INPUT_IF_ENABLED(GmicQt::AllInvisible, "All invisible"); + // "decr." input mode have been removed (since 2.8.2) + // ui->inputLayers->addItem(tr("All visible (decr.)"), GmicQt::AllVisiblesDesc); + // ui->inputLayers->addItem(tr("All invisible (decr.)"), GmicQt::AllInvisiblesDesc); + // ui->inputLayers->addItem(tr("All (decr.)"), GmicQt::AllDesc); + + if (ui->inputLayers->count() == 1) { + ui->labelInputLayers->hide(); + ui->inputLayers->hide(); + } ui->outputMode->setToolTip(tr("Output mode")); - ui->outputMode->addItem(tr("In place (default)"), GmicQt::InPlace); - ui->outputMode->addItem(tr("New layer(s)"), GmicQt::NewLayers); - ui->outputMode->addItem(tr("New active layer(s)"), GmicQt::NewActiveLayers); - ui->outputMode->addItem(tr("New image"), GmicQt::NewImage); + +#define ADD_OUTPUT_IF_ENABLED(MODE, TEXT) \ + if (_enabledOutputModes.contains(MODE)) \ + ui->outputMode->addItem(tr(TEXT), MODE) + + ADD_OUTPUT_IF_ENABLED(GmicQt::InPlace, "In place (default)"); + ADD_OUTPUT_IF_ENABLED(GmicQt::NewLayers, "New layer(s)"); + ADD_OUTPUT_IF_ENABLED(GmicQt::NewActiveLayers, "New active layer(s)"); + ADD_OUTPUT_IF_ENABLED(GmicQt::NewImage, "New image"); + + if (ui->outputMode->count() == 1) { + ui->labelOutputMode->hide(); + ui->outputMode->hide(); + } ui->previewMode->setToolTip(tr("Preview mode")); - ui->previewMode->addItem(tr("1st output (default)"), GmicQt::FirstOutput); - ui->previewMode->addItem(tr("2nd output"), GmicQt::SecondOutput); - ui->previewMode->addItem(tr("3rd output"), GmicQt::ThirdOutput); - ui->previewMode->addItem(tr("4th output"), GmicQt::FourthOutput); - ui->previewMode->addItem(tr("1st -> 2nd output"), GmicQt::First2SecondOutput); - ui->previewMode->addItem(tr("1st -> 3rd output"), GmicQt::First2ThirdOutput); - ui->previewMode->addItem(tr("1st -> 4th output"), GmicQt::First2FourthOutput); - ui->previewMode->addItem(tr("All outputs"), GmicQt::AllOutputs); + +#define ADD_PREVIEW_IF_ENABLED(MODE, TEXT) \ + if (_enabledPreviewModes.contains(MODE)) \ + ui->previewMode->addItem(tr(TEXT), MODE) + + ADD_PREVIEW_IF_ENABLED(GmicQt::FirstOutput, "1st output (default)"); + ADD_PREVIEW_IF_ENABLED(GmicQt::SecondOutput, "2nd output"); + ADD_PREVIEW_IF_ENABLED(GmicQt::ThirdOutput, "3rd output"); + ADD_PREVIEW_IF_ENABLED(GmicQt::FourthOutput, "4th output"); + ADD_PREVIEW_IF_ENABLED(GmicQt::First2SecondOutput, "1st -> 2nd output"); + ADD_PREVIEW_IF_ENABLED(GmicQt::First2ThirdOutput, "1st -> 3rd output"); + ADD_PREVIEW_IF_ENABLED(GmicQt::First2FourthOutput, "1st -> 4th output"); + ADD_PREVIEW_IF_ENABLED(GmicQt::AllOutputs, "All outputs"); + + if (ui->previewMode->count() == 1) { + ui->labelPreviewMode->hide(); + ui->previewMode->hide(); + } + + setDefaultInputMode(); + setDefaultOutputMode(); + setDefaultPreviewMode(); + setTopLabel(); + updateLayoutIfUniqueRow(); connect(ui->inputLayers, SIGNAL(currentIndexChanged(int)), this, SLOT(onInputModeSelected(int))); connect(ui->outputMode, SIGNAL(currentIndexChanged(int)), this, SLOT(onOutputModeSelected(int))); @@ -152,6 +216,90 @@ ui->tbReset->setIcon(LOAD_ICON("view-refresh")); } +void InOutPanel::setDefaultInputMode() +{ + if (_enabledInputModes.contains(GmicQt::DefaultInputMode)) { + return; + } + for (int m = GmicQt::Active; m <= GmicQt::AllInvisible; ++m) { + auto mode = static_cast(m); + if (_enabledInputModes.contains(mode)) { + GmicQt::DefaultInputMode = mode; + return; + } + } + Q_ASSERT_X(_enabledInputModes.contains(GmicQt::NoInput), __FUNCTION__, "No input mode left by host settings. Default mode cannot be determined."); + GmicQt::DefaultInputMode = GmicQt::NoInput; +} + +void InOutPanel::setDefaultOutputMode() +{ + if (_enabledOutputModes.contains(GmicQt::DefaultOutputMode)) { + return; + } + Q_ASSERT_X(!_enabledOutputModes.isEmpty(), __FUNCTION__, "No output mode left by host settings. Default mode cannot be determined."); + for (int m = GmicQt::InPlace; m <= GmicQt::NewImage; ++m) { + auto mode = static_cast(m); + if (_enabledOutputModes.contains(mode)) { + GmicQt::DefaultOutputMode = mode; + return; + } + } +} + +void InOutPanel::setDefaultPreviewMode() +{ + if (_enabledPreviewModes.contains(GmicQt::DefaultPreviewMode)) { + return; + } + Q_ASSERT_X(!_enabledPreviewModes.isEmpty(), __FUNCTION__, "No preview mode left by host settings. Default mode cannot be determined."); + for (int m = GmicQt::FirstOutput; m <= GmicQt::AllOutputs; ++m) { + auto mode = static_cast(m); + if (_enabledPreviewModes.contains(mode)) { + GmicQt::DefaultPreviewMode = mode; + return; + } + } +} + +void InOutPanel::setTopLabel() +{ + const bool input = ui->inputLayers->count() > 1; + const bool output = ui->outputMode->count() > 1; + const bool preview = ui->previewMode->count() > 1; + if (input && output) { + ui->topLabel->setText(tr("Input / Output")); + } else if (input) { + ui->topLabel->setText(preview ? tr("Input / Preview") : tr("Input")); + } else if (output) { + ui->topLabel->setText(preview ? tr("Output / Preview") : tr("Output")); + } else if (preview) { + ui->topLabel->setText("Preview"); + } +} + +void InOutPanel::updateLayoutIfUniqueRow() +{ + const bool input = ui->inputLayers->count() > 1; + const bool output = ui->outputMode->count() > 1; + const bool preview = ui->previewMode->count() > 1; + if ((input + output + preview) > 1) { + return; + } + if (input) { + ui->topLabel->setText(ui->labelInputLayers->text()); + ui->horizontalLayout->insertWidget(1, ui->inputLayers); + } else if (output) { + ui->topLabel->setText(ui->labelOutputMode->text()); + ui->horizontalLayout->insertWidget(1, ui->outputMode); + } else if (preview) { + ui->topLabel->setText(ui->labelPreviewMode->text()); + ui->horizontalLayout->insertWidget(1, ui->previewMode); + } + ui->topLabel->setStyleSheet("QLabel { font-weight: normal }"); + ui->scrollArea->hide(); +} + void InOutPanel::disableNotifications() { _notifyValueChange = false; @@ -163,7 +311,7 @@ } /* - * InOutPanel::Sate methods + * InOutPanel::state methods */ GmicQt::InputOutputState InOutPanel::state() const @@ -207,3 +355,26 @@ { setEnabled(true); } + +void InOutPanel::disableInputMode(GmicQt::InputMode mode) +{ + _enabledInputModes.removeOne(mode); +} + +void InOutPanel::disableOutputMode(GmicQt::OutputMode mode) +{ + _enabledOutputModes.removeOne(mode); +} + +void InOutPanel::disablePreviewMode(GmicQt::PreviewMode mode) +{ + _enabledPreviewModes.removeOne(mode); +} + +bool InOutPanel::hasActiveControls() +{ + const bool input = ui->inputLayers->count() > 1; + const bool output = ui->outputMode->count() > 1; + const bool preview = ui->previewMode->count() > 1; + return input || output || preview; +} diff -Nru gmic-2.4.5/gmic-qt/src/Widgets/InOutPanel.h gmic-2.9.2/gmic-qt/src/Widgets/InOutPanel.h --- gmic-2.4.5/gmic-qt/src/Widgets/InOutPanel.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Widgets/InOutPanel.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_INOUTPANEL_H -#define _GMIC_QT_INOUTPANEL_H +#ifndef GMIC_QT_INOUTPANEL_H +#define GMIC_QT_INOUTPANEL_H #include #include "Host/host.h" @@ -43,7 +43,7 @@ Q_OBJECT public: - explicit InOutPanel(QWidget * parent = 0); + explicit InOutPanel(QWidget * parent = nullptr); ~InOutPanel(); public: @@ -66,6 +66,12 @@ void disable(); void enable(); + static void disableInputMode(GmicQt::InputMode mode); + static void disableOutputMode(GmicQt::OutputMode mode); + static void disablePreviewMode(GmicQt::PreviewMode mode); + + bool hasActiveControls(); + signals: void inputModeChanged(GmicQt::InputMode); void previewModeChanged(GmicQt::PreviewMode); @@ -78,9 +84,17 @@ void setDarkTheme(); private: + void setDefaultInputMode(); + void setDefaultOutputMode(); + void setDefaultPreviewMode(); + void setTopLabel(); + void updateLayoutIfUniqueRow(); bool _notifyValueChange; Ui::InOutPanel * ui; static const int NoSelection = -1; + static QList _enabledInputModes; + static QList _enabledOutputModes; + static QList _enabledPreviewModes; }; -#endif // _GMIC_QT_INOUTPANEL_H +#endif // GMIC_QT_INOUTPANEL_H diff -Nru gmic-2.4.5/gmic-qt/src/Widgets/LanguageSelectionWidget.cpp gmic-2.9.2/gmic-qt/src/Widgets/LanguageSelectionWidget.cpp --- gmic-2.4.5/gmic-qt/src/Widgets/LanguageSelectionWidget.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Widgets/LanguageSelectionWidget.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -73,6 +73,7 @@ result["pl"] = QString::fromUtf8("J\xc4\x99zyk polski"); result["pt"] = QString::fromUtf8("Portugu\xc3\xaas"); result["ru"] = QString::fromUtf8("\xd0\xa0\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9"); + result["sv"] = QString::fromUtf8("Svenska"); result["ua"] = QString::fromUtf8("\xd0\xa3\xd0\xba\xd1\x80\xd0\xb0\xd1\x97\xd0\xbd\xd1\x81\xd1\x8c\xd0\xba\xd0\xb0"); result["zh"] = QString::fromUtf8("\xe7\xae\x80\xe5\x8c\x96\xe5\xad\x97"); result["zh_tw"] = QString::fromUtf8("\xe6\xad\xa3\xe9\xab\x94\xe5\xad\x97\x2f\xe7\xb9\x81\xe9\xab\x94\xe5\xad\x97"); diff -Nru gmic-2.4.5/gmic-qt/src/Widgets/LanguageSelectionWidget.h gmic-2.9.2/gmic-qt/src/Widgets/LanguageSelectionWidget.h --- gmic-2.4.5/gmic-qt/src/Widgets/LanguageSelectionWidget.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Widgets/LanguageSelectionWidget.h 2020-09-03 11:37:05.000000000 +0000 @@ -37,7 +37,7 @@ class LanguageSelectionWidget : public QWidget { Q_OBJECT public: - explicit LanguageSelectionWidget(QWidget * parent = 0); + explicit LanguageSelectionWidget(QWidget * parent = nullptr); ~LanguageSelectionWidget(); QString selectedLanguageCode(); diff -Nru gmic-2.4.5/gmic-qt/src/Widgets/PreviewWidget.cpp gmic-2.9.2/gmic-qt/src/Widgets/PreviewWidget.cpp --- gmic-2.4.5/gmic-qt/src/Widgets/PreviewWidget.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Widgets/PreviewWidget.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -166,13 +166,22 @@ { if (_fullImageSize.isNull()) { _originalImageSize = QSize(0, 0); - _originaImageScaledSize = QSize(0, 0); + _originalImageScaledSize = QSize(0, 0); _imagePosition = rect(); return; } _originalImageSize = originalImageCropSize(); + + if (isAtFullZoom()) { + double correctZoomFactor = std::min(width() / (double)_originalImageSize.width(), height() / (double)_originalImageSize.height()); + if (correctZoomFactor != _currentZoomFactor) { + _currentZoomFactor = correctZoomFactor; + emit zoomChanged(_currentZoomFactor); + } + } + if (_currentZoomFactor > 1.0) { - _originaImageScaledSize = _originalImageSize; + _originalImageScaledSize = _originalImageSize; QSize imageSize(std::round(_originalImageSize.width() * _currentZoomFactor), std::round(_originalImageSize.height() * _currentZoomFactor)); int left, top; if (imageSize.height() > height()) { @@ -187,11 +196,11 @@ } _imagePosition = QRect(QPoint(left, top), imageSize); } else { - _originaImageScaledSize = QSize(static_cast(std::round(_originalImageSize.width() * _currentZoomFactor)), - static_cast(std::round(_originalImageSize.height() * _currentZoomFactor))); - _imagePosition = QRect(QPoint(std::max(0, (width() - _originaImageScaledSize.width()) / 2), - std::max(0, (height() - _originaImageScaledSize.height()) / 2)), - _originaImageScaledSize); + _originalImageScaledSize = QSize(static_cast(std::round(_originalImageSize.width() * _currentZoomFactor)), // + static_cast(std::round(_originalImageSize.height() * _currentZoomFactor))); + _imagePosition = QRect(QPoint(std::max(0, (width() - _originalImageScaledSize.width()) / 2), // + std::max(0, (height() - _originalImageScaledSize.height()) / 2)), + _originalImageScaledSize); } } @@ -242,7 +251,7 @@ QRect visibleRect = rect() & _imagePosition; KeypointList::reverse_iterator it = _keypoints.rbegin(); - int index = _keypoints.size() - 1; + int index = static_cast(_keypoints.size() - 1); while (it != _keypoints.rend()) { if (!it->isNaN()) { const KeypointList::Keypoint & kp = *it; @@ -294,7 +303,7 @@ QPoint PreviewWidget::keypointToPointInWidget(const KeypointList::Keypoint & kp) const { return QPoint(static_cast(std::round(_imagePosition.left() + (_imagePosition.width() - 1) * (kp.x / 100.0f))), - static_cast(std::round(_imagePosition.top() + (_imagePosition.height() - 1) * (kp.y / 100.0f)))); + static_cast(std::round(_imagePosition.top() + (_imagePosition.height() - 1) * (kp.y / 100.0f)))); } QPoint PreviewWidget::keypointToVisiblePointInWidget(const KeypointList::Keypoint & kp) const @@ -341,16 +350,16 @@ * then the image should fit the widget size. */ const QSize previewImageSize(_image->width(), _image->height()); - if ((previewImageSize != _originaImageScaledSize) || (isAtFullZoom() && _currentZoomFactor > 1.0)) { + if ((previewImageSize != _originalImageScaledSize) || (isAtFullZoom() && _currentZoomFactor > 1.0)) { QSize imageSize; - if (previewImageSize != _originaImageScaledSize) { + if (previewImageSize != _originalImageScaledSize) { imageSize = previewImageSize.scaled(width(), height(), Qt::KeepAspectRatio); } else { - imageSize = QSize(static_cast(std::round(_originalImageSize.width() * _currentZoomFactor)), - static_cast(std::round(_originalImageSize.height() * _currentZoomFactor))); + imageSize = QSize(static_cast(std::round(_originalImageSize.width() * _currentZoomFactor)), // + static_cast(std::round(_originalImageSize.height() * _currentZoomFactor))); } _imagePosition = QRect(QPoint(std::max(0, (width() - imageSize.width()) / 2), std::max(0, (height() - imageSize.height()) / 2)), imageSize); - _originaImageScaledSize = QSize(-1, -1); // Make sure next preview update will not consider originaImageScaledSize + _originalImageScaledSize = QSize(-1, -1); // Make sure next preview update will not consider originaImageScaledSize } /* * Otherwise : Preview size == Original scaled size and image position is therefore unchanged @@ -530,9 +539,6 @@ void PreviewWidget::mouseReleaseEvent(QMouseEvent * e) { if (e->button() == Qt::LeftButton || e->button() == Qt::MiddleButton) { - // if (QApplication::overrideCursor() && (QApplication::overrideCursor()->shape() == Qt::CrossCursor)) { - // QApplication::restoreOverrideCursor(); - // } if (!isAtFullZoom() && _mousePosition != QPoint(-1, -1)) { QPoint move = _mousePosition - e->pos(); onMouseTranslationInImage(move); @@ -544,7 +550,8 @@ KeypointList::Keypoint & kp = _keypoints[_movedKeypointIndex]; kp.setPosition(p); _movedKeypointIndex = -1; - emit keypointPositionsChanged(KeypointMouseReleaseEvent, e->timestamp()); + const unsigned char flags = KeypointMouseReleaseEvent | (kp.burst ? KeypointBurstEvent : 0); + emit keypointPositionsChanged(flags, e->timestamp()); } e->accept(); return; @@ -779,9 +786,9 @@ return 1.0; } if (_previewFactor == GmicQt::PreviewFactorFullImage) { - return std::min(width() / (double)_fullImageSize.width(), height() / (double)_fullImageSize.height()); + return std::min(width() / static_cast(_fullImageSize.width()), height() / static_cast(_fullImageSize.height())); } - if (_previewFactor > 1.0) { + if (_previewFactor > 1.0f) { return _previewFactor * std::min(width() / (double)_fullImageSize.width(), height() / (double)_fullImageSize.height()); } return 1.0; // We suppose GmicQt::PreviewFactorActualSize @@ -796,7 +803,7 @@ { const double dx = p1.x() - p2.x(); const double dy = p1.y() - p2.y(); - return (int)std::round(std::sqrt(dx * dx + dy * dy)); + return static_cast(std::round(std::sqrt(dx * dx + dy * dy))); } void PreviewWidget::setPreviewFactor(float filterFactor, bool reset) @@ -811,6 +818,9 @@ if ((_previewFactor == GmicQt::PreviewFactorFullImage) || ((_previewFactor == GmicQt::PreviewFactorAny) && reset)) { _currentZoomFactor = std::min(width() / (double)_fullImageSize.width(), height() / (double)_fullImageSize.height()); _visibleRect = PreviewRect::Full; + if (reset) { + saveVisibleCenter(); + } } else if ((_previewFactor == GmicQt::PreviewFactorAny) && !reset) { updateVisibleRect(); _visibleRect.moveCenter(_savedVisibleCenter); @@ -819,6 +829,7 @@ updateVisibleRect(); if (reset) { _visibleRect.moveToCenter(); + saveVisibleCenter(); } else { _visibleRect.moveCenter(_savedVisibleCenter); } diff -Nru gmic-2.4.5/gmic-qt/src/Widgets/PreviewWidget.h gmic-2.9.2/gmic-qt/src/Widgets/PreviewWidget.h --- gmic-2.4.5/gmic-qt/src/Widgets/PreviewWidget.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Widgets/PreviewWidget.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,14 +22,16 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_PREVIEWWIDGET_H_ -#define _GMIC_QT_PREVIEWWIDGET_H_ +#ifndef GMIC_QT_PREVIEWWIDGET_H +#define GMIC_QT_PREVIEWWIDGET_H #include #include #include #include +#include #include +#include #include #include #include @@ -47,8 +49,8 @@ Q_OBJECT public: - explicit PreviewWidget(QWidget * parent = 0); - ~PreviewWidget(); + explicit PreviewWidget(QWidget * parent = nullptr); + ~PreviewWidget() override; void setFullImageSize(const QSize &); void updateFullImageSizeIfDifferent(const QSize &); void normalizedVisibleRect(double & x, double & y, double & width, double & height) const; @@ -145,8 +147,8 @@ ZoomConstraint _zoomConstraint; /* - * (0) for a 1:1 preview - * (1) for previewing the whole image + * (0) for a 1:1 preview (GmicQt::PreviewFactorActualSize) + * (1) for previewing the whole image (GmicQt::PreviewFactorFullImage) * (2) for 1/2 image * GmigQt::PreviewFactorAny */ @@ -159,6 +161,7 @@ bool isValid() const; bool operator!=(const PreviewPoint &) const; bool operator==(const PreviewPoint &) const; + QPointF toPointF() const { return QPointF((qreal)x, (qreal)y); } }; struct PreviewRect { @@ -173,6 +176,7 @@ PreviewPoint topLeft() const; void moveCenter(const PreviewPoint & p); void moveToCenter(); + QRectF toRectF() const { return QRectF((qreal)x, (qreal)y, (qreal)w, (qreal)h); } static const PreviewRect Full; }; @@ -189,7 +193,7 @@ QPixmap _transparentBackground; bool _paintOriginalImage; QSize _originalImageSize; - QSize _originaImageScaledSize; + QSize _originalImageScaledSize; bool _rightClickEnabled; QString _errorMessage; QString _overlayMessage; @@ -200,4 +204,4 @@ unsigned long _keypointTimestamp; }; -#endif // _GMIC_QT_PREVIEWWIDGET_H_ +#endif // GMIC_QT_PREVIEWWIDGET_H diff -Nru gmic-2.4.5/gmic-qt/src/Widgets/ProgressInfoWidget.cpp gmic-2.9.2/gmic-qt/src/Widgets/ProgressInfoWidget.cpp --- gmic-2.4.5/gmic-qt/src/Widgets/ProgressInfoWidget.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Widgets/ProgressInfoWidget.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -23,8 +23,9 @@ * */ #include "Widgets/ProgressInfoWidget.h" -#include #include +#include +#include #include "DialogSettings.h" #include "GmicProcessor.h" #include "IconLoader.h" @@ -50,8 +51,11 @@ connect(ui->tbCancel, SIGNAL(clicked(bool)), this, SLOT(onCancelClicked())); if (!parent) { QRect position = frameGeometry(); - position.moveCenter(QDesktopWidget().availableGeometry().center()); - move(position.topLeft()); + QList screens = QGuiApplication::screens(); + if (!screens.isEmpty()) { + position.moveCenter(screens.front()->geometry().center()); + move(position.topLeft()); + } } _showingTimer.setSingleShot(true); diff -Nru gmic-2.4.5/gmic-qt/src/Widgets/ProgressInfoWidget.h gmic-2.9.2/gmic-qt/src/Widgets/ProgressInfoWidget.h --- gmic-2.4.5/gmic-qt/src/Widgets/ProgressInfoWidget.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Widgets/ProgressInfoWidget.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_PROGRESSINFOWIDGET_H_ -#define _GMIC_QT_PROGRESSINFOWIDGET_H_ +#ifndef GMIC_QT_PROGRESSINFOWIDGET_H +#define GMIC_QT_PROGRESSINFOWIDGET_H #include #include @@ -37,7 +37,7 @@ Q_OBJECT public: - explicit ProgressInfoWidget(QWidget * parent = 0); + explicit ProgressInfoWidget(QWidget * parent = nullptr); ~ProgressInfoWidget(); enum Mode @@ -75,4 +75,4 @@ static const int AnimationStep = 10; }; -#endif // _GMIC_QT_PROGRESSINFOWIDGET_H_ +#endif // GMIC_QT_PROGRESSINFOWIDGET_H diff -Nru gmic-2.4.5/gmic-qt/src/Widgets/ProgressInfoWindow.cpp gmic-2.9.2/gmic-qt/src/Widgets/ProgressInfoWindow.cpp --- gmic-2.4.5/gmic-qt/src/Widgets/ProgressInfoWindow.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Widgets/ProgressInfoWindow.cpp 2020-09-03 11:37:05.000000000 +0000 @@ -25,8 +25,9 @@ #include "ProgressInfoWindow.h" #include #include -#include +#include #include +#include #include #include #include "Common.h" @@ -55,7 +56,7 @@ connect(processor, SIGNAL(done(QString)), this, SLOT(onProcessingFinished(QString))); _isShown = false; - if (QSettings().value(DARK_THEME_KEY, false).toBool()) { + if (DialogSettings::darkThemeEnabled()) { setDarkTheme(); } } @@ -68,8 +69,11 @@ void ProgressInfoWindow::showEvent(QShowEvent *) { QRect position = frameGeometry(); - position.moveCenter(QDesktopWidget().availableGeometry().center()); - move(position.topLeft()); + QList screens = QGuiApplication::screens(); + if (!screens.isEmpty()) { + position.moveCenter(screens.front()->geometry().center()); + move(position.topLeft()); + } _isShown = true; } diff -Nru gmic-2.4.5/gmic-qt/src/Widgets/ProgressInfoWindow.h gmic-2.9.2/gmic-qt/src/Widgets/ProgressInfoWindow.h --- gmic-2.4.5/gmic-qt/src/Widgets/ProgressInfoWindow.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Widgets/ProgressInfoWindow.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_PROGRESSINFOWINDOW_H_ -#define _GMIC_QT_PROGRESSINFOWINDOW_H_ +#ifndef GMIC_QT_PROGRESSINFOWINDOW_H +#define GMIC_QT_PROGRESSINFOWINDOW_H #include #include @@ -67,4 +67,4 @@ HeadlessProcessor * _processor; }; -#endif // _GMIC_QT_PROGRESSINFOWINDOW_H_ +#endif // GMIC_QT_PROGRESSINFOWINDOW_H diff -Nru gmic-2.4.5/gmic-qt/src/Widgets/SearchFieldWidget.h gmic-2.9.2/gmic-qt/src/Widgets/SearchFieldWidget.h --- gmic-2.4.5/gmic-qt/src/Widgets/SearchFieldWidget.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Widgets/SearchFieldWidget.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_SEARCHFIELDWIDGET_H_ -#define _GMIC_QT_SEARCHFIELDWIDGET_H_ +#ifndef GMIC_QT_SEARCHFIELDWIDGET_H +#define GMIC_QT_SEARCHFIELDWIDGET_H #include #include @@ -39,7 +39,7 @@ class SearchFieldWidget : public QWidget { Q_OBJECT public: - explicit SearchFieldWidget(QWidget * parent = 0); + explicit SearchFieldWidget(QWidget * parent = nullptr); ~SearchFieldWidget(); QString text() const; public slots: @@ -62,4 +62,4 @@ #endif }; -#endif // _GMIC_QT_SEARCHFIELDWIDGET_H_ +#endif // GMIC_QT_SEARCHFIELDWIDGET_H diff -Nru gmic-2.4.5/gmic-qt/src/Widgets/ZoomLevelSelector.h gmic-2.9.2/gmic-qt/src/Widgets/ZoomLevelSelector.h --- gmic-2.4.5/gmic-qt/src/Widgets/ZoomLevelSelector.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/Widgets/ZoomLevelSelector.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_ZOOMLEVELSELECTOR_H -#define _GMIC_QT_ZOOMLEVELSELECTOR_H +#ifndef GMIC_QT_ZOOMLEVELSELECTOR_H +#define GMIC_QT_ZOOMLEVELSELECTOR_H #include #include @@ -41,7 +41,7 @@ Q_OBJECT public: - explicit ZoomLevelSelector(QWidget * parent = 0); + explicit ZoomLevelSelector(QWidget * parent = nullptr); ~ZoomLevelSelector(); void setZoomConstraint(const ZoomConstraint & constraint); @@ -81,4 +81,4 @@ QDoubleValidator * _doubleValidator; }; -#endif // _GMIC_QT_ZOOMLEVELSELECTOR_H +#endif // GMIC_QT_ZOOMLEVELSELECTOR_H diff -Nru gmic-2.4.5/gmic-qt/src/ZoomConstraint.h gmic-2.9.2/gmic-qt/src/ZoomConstraint.h --- gmic-2.4.5/gmic-qt/src/ZoomConstraint.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/src/ZoomConstraint.h 2020-09-03 11:37:05.000000000 +0000 @@ -22,8 +22,8 @@ * along with gmic_qt. If not, see . * */ -#ifndef _GMIC_QT_ZOOMCONSTRAINT_H_ -#define _GMIC_QT_ZOOMCONSTRAINT_H_ +#ifndef GMIC_QT_ZOOMCONSTRAINT_H +#define GMIC_QT_ZOOMCONSTRAINT_H struct ZoomConstraint { enum Constraint @@ -47,4 +47,4 @@ Constraint _value; }; -#endif // _GMIC_QT_ZOOMCONSTRAINT_H_ +#endif // GMIC_QT_ZOOMCONSTRAINT_H diff -Nru gmic-2.4.5/gmic-qt/translations/authors/sv.txt gmic-2.9.2/gmic-qt/translations/authors/sv.txt --- gmic-2.4.5/gmic-qt/translations/authors/sv.txt 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/gmic-qt/translations/authors/sv.txt 2020-09-03 11:37:05.000000000 +0000 @@ -0,0 +1 @@ + Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/gmic-qt/translations/cs.qm and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/gmic-qt/translations/cs.qm differ diff -Nru gmic-2.4.5/gmic-qt/translations/cs.ts gmic-2.9.2/gmic-qt/translations/cs.ts --- gmic-2.4.5/gmic-qt/translations/cs.ts 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/translations/cs.ts 2020-09-03 11:37:05.000000000 +0000 @@ -7,7 +7,7 @@ ColorParameter - + Select color Vyberte barvu @@ -20,173 +20,193 @@ Dialog - + Internet updates Online aktualizace - + Update now Aktualizovat nyní - + Layout Rozvržení - + + Interface + + + + Preview on the &left Náhled &vlevo - + Pre&view on right side Náhled &vpravo - + Theme Téma - + &Default &Výchozí - + Dar&k &Tmavé - + <i>(Restart needed)</I> <i>(vyžaduje restart)</i> - + Language - - + + Always enable preview zooming + + + + + <html><head/><body><p><span style=" font-style:italic;">(Warning: preview may be inaccurate<br/>if checked.)</span></p></body></html> + + + + + Other + + + + + Output messages Výstupní zprávy - + Dialogs Dialogy - + Use native color dialog Použít nativní dialog barev - + Preview Náhled - + Timeout (seconds) - + Show institution logos - + + Notify when scheduled update fails + + + + &Ok &Ok - + Settings Nastavení - + Never Nikdy - + Daily Denně - + Weekly Týdně - + Every 2 weeks Každé 2 týdny - + Monthly Měsíčně - + At launch (debug) Při startu (ladění) - - Output messages... - Výstupní zprávy... - - - + Quiet (default) Tichý (výchozí) - + Verbose (layer name) Upovídaný (název vrstvy) - + Verbose (console) Upovídaný (konzole) - + Verbose (log file) Upovídaný (soubor záznamů) - + Very verbose (console) Velmi upovídaný (konzole) - + Very verbose (log file) Velmi upovídaný (soubor záznamů) - + Debug (console) Ladění (konzole) - + Debug (log file) Ladění (soubor záznamů) - + Check to use Native/OS color dialog, uncheck to use Qt's Zaškrtněte pro použití nativního/OS dialogu barev, odškrtněte pro použití Qt dialogu @@ -194,9 +214,9 @@ FileParameter - - - + + + Select a file Vyberte soubor @@ -204,18 +224,18 @@ FilterParametersWidget - - + + <i>Select a filter</i> <i>Vyberte filtr</i> - + <i>No parameters</i> <i>Žádné parametry</i> - + Error parsing filter parameters @@ -223,6 +243,15 @@ + FiltersPresenter + + + Cannot find this fave's original filter + + + + + FiltersView @@ -236,7 +265,7 @@ - + Remove fave Odstranit oblíbený @@ -251,7 +280,7 @@ Přidat oblíbený - + Do you really want to remove the following fave? %1 @@ -262,7 +291,7 @@ FolderParameter - + Select a folder Vyberte složku @@ -293,135 +322,115 @@ - - + + Input layers Vstupní vrstvy - + None Žádné - + Active (default) Aktivní (výchozí) - + All Vše - + Active and below Aktivní a níže - + Active and above Aktivní a výše - + All visible Všechny viditelné - + All invisible Všechny neviditelné - - All visible (decr.) - Všechny viditelné (sestup.) - - - - All invisible (decr.) - Všechny neviditelné (sestup.) - - - - All (decr.) - Všechny (sestup.) - - - - + + Output mode Režim výstupu - + In place (default) V místě (výchozí) - + New layer(s) Nová vrstva(y) - + New active layer(s) Nová aktivní vrstva(y) - + New image Nový obrázek - - Output messages - Výstupní zprávy - - - - + + Preview mode Režim náhledu - + 1st output (default) 1. výstup (výchozí) - + 2nd output 2. výstup - + 3rd output 3. výstup - + 4th output 4. výstup - + 1st -> 2nd output 1. -> 2. výstup - + 1st -> 3rd output 1. -> 3. výstup - + 1st -> 4th output 1. -> 4. výstup - + All outputs Všechny výstupy @@ -452,179 +461,164 @@ GMIC - + <html><head/><body><p>Download filter definitions from remote sources</p></body></html> <html><head/><body><p>Stáhnout definice filtrů ze vzdálených zdrojů</p></body></html> - + Internet Internet - + Selection mode - + TextLabel - + ... - - <html><head/><body><p>Enable/disable preview<br/>(right click on preview image for instant swaping)</p></body></html> - <html><head/><body><p>Zapnout/vypnout náhled<br/>(klik pravým tlačítkem myši na náhled pro přepnutí)</p></body></html> + + <html><head/><body><p>Enable/disable preview<br/>(Ctrl+P)<br/>(right click on preview image for instant swapping)</p></body></html> + - + Preview Náhled - + Settings... Nastavení... - + &Cancel &Storno - + &Fullscreen &Celá obrazovka - + &Apply &Použít - + &OK &Ok - - Zoom in - - - - - Zoom out - - - - - Reset zoom - - - - - Warning: Preview may be inaccurate (zoom factor has been modified) - - - - + Add fave Přidat oblíbený - + Reset parameters to default values - + Update filters (Ctrl+R / F5) Aktualizovat filtry (Ctrl+R / F5) - + Rename fave Přejmenovat oblíbený - + Remove fave Odstranit oblíbený - + Expand/Collapse all Rozbalit/Sbalit vše - - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Normandy University (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Normandy University (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) + + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandy University (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandy University (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) - + Update completed Aktualizace dokončena - - - + + + Filter definitions have been updated. Definice filtrů byly aktualizovány. - + No download was needed. - + + Filters update could not be achieved + + + + The update could not be achieved<br>because of the following errors:<br> Aktualizace nemohla být provedena<br/>kvůli následujícím chybám:<br/> - + Update error Chyba aktualizace - + Error Chyba - + Waiting for cancelled jobs... - + Import faves Importovat oblíbené - + Do you want to import faves from file below?<br/>%1 Chcete importovat oblíbené ze souboru níže?<br/>%1 - + Don't ask again Znovu už se neptat - + Confirmation Potvrzení - + A gmic command is running.<br>Do you really want to close the plugin? Gmic příkaz stále běží.<br>Opravdu chcete zavřít plugin? @@ -656,7 +650,7 @@ - + Abort Zrušit @@ -666,23 +660,23 @@ TextLabel - + G'MIC-Qt Plug-in progression - + Updating filters... - - + + [Processing %1 | %2] [Zpracování %1 | %2] - + [Processing %1] [Zpracování %1] @@ -706,17 +700,17 @@ Storno - + %1 seconds %1 sekund - + [Processing %1 | %2] [Zpracování %1 | %2] - + [Processing %1] [Zpracování %1] @@ -724,27 +718,27 @@ QObject - + Select an image to open... Vyberte obrázek k otevření... - + PNG & JPG files (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) Soubory PNG & JPG (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) - + Error Chyba - + Could not open file. - + Default image @@ -767,12 +761,12 @@ Frame - + Search Hledat - + Search in filters list (%1) Hledat v seznamu filtrů (%1) @@ -780,32 +774,32 @@ Updater - + Could not read/decompress %1 Nemohu přečíst/dekomprimovat %1 - + Error downloading %1 (empty file?) Chyba stahování %1 (prázdný soubor?) - + Error creating file %1 Chyba vytváření souboru %1 - + Error writing file %1 Chyba zapisování souboru %1 - - Error downloading %1 - Chyba stahování %1 + + Error downloading %1<br/>Error %2: %3 + - + Download timeout: %1 Stahování zrušeno (časový limit překročen): %1 @@ -813,9 +807,29 @@ ZoomLevelSelector - + Form GMIC + + + Zoom in + + + + + Zoom out + + + + + Reset zoom + + + + + Warning: Preview may be inaccurate (zoom factor has been modified) + + Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/gmic-qt/translations/de.qm and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/gmic-qt/translations/de.qm differ diff -Nru gmic-2.4.5/gmic-qt/translations/de.ts gmic-2.9.2/gmic-qt/translations/de.ts --- gmic-2.4.5/gmic-qt/translations/de.ts 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/translations/de.ts 2020-09-03 11:37:05.000000000 +0000 @@ -7,7 +7,7 @@ ColorParameter - + Select color Farb-Auswahl @@ -21,174 +21,194 @@ Einstellungen - + Internet updates Aktualisierungen über Internet - + Update now Jetzt aktualisieren - + Layout Anordnung - + + Interface + + + + Preview on the &left Vorschau auf &linker Seite - + Pre&view on right side Vorschau auf &rechter Seite - + Theme Thema - + &Default &Standard - + Dar&k &Dunkel - + <i>(Restart needed)</I> <i>(Neustart erforderlich)</i> - + Language - - + + Always enable preview zooming + + + + + <html><head/><body><p><span style=" font-style:italic;">(Warning: preview may be inaccurate<br/>if checked.)</span></p></body></html> + + + + + Other + + + + + Output messages Ausgabe der Meldungen - + Dialogs not sure about the use Einstellungen - + Use native color dialog System-Farbwähler verwenden - + Preview Vorschau - + Timeout (seconds) - + Show institution logos - + + Notify when scheduled update fails + + + + &Ok &Ok - + Settings Einstellungen - + Never Niemals - + Daily Täglich - + Weekly Wöchentlich - + Every 2 weeks Alle zwei Wochen - + Monthly Monatlich - + At launch (debug) Beim Starten (Debug) - - Output messages... - Ausgabe der Meldungen... - - - + Quiet (default) Keine Ausgabe (Standard) - + Verbose (layer name) Ausführlich als Ebenen-Name - + Verbose (console) Ausführlich (Konsole) - + Verbose (log file) Ausführlich (Log-Datei) - + Very verbose (console) Sehr ausführlich (Konsole) - + Very verbose (log file) Sehr ausführlich (Log-Datei) - + Debug (console) Debuggen (Konsole) - + Debug (log file) Debuggen (Log-Datei) - + Check to use Native/OS color dialog, uncheck to use Qt's Auswählen, um System-Farbwähler zu nutzen, aus für Qt-Farbwähler @@ -196,9 +216,9 @@ FileParameter - - - + + + Select a file Datei auswählen @@ -206,18 +226,18 @@ FilterParametersWidget - - + + <i>Select a filter</i> <i>Filter auswählen</i> - + <i>No parameters</i> <i>Keine Parameter anzugeben</i> - + Error parsing filter parameters @@ -225,6 +245,15 @@ + FiltersPresenter + + + Cannot find this fave's original filter + + + + + FiltersView @@ -238,7 +267,7 @@ - + Remove fave Kein Favorit mehr @@ -253,7 +282,7 @@ Als Favorit merken - + Do you really want to remove the following fave? %1 @@ -264,7 +293,7 @@ FolderParameter - + Select a folder Ordner wählen @@ -296,135 +325,115 @@ ... - - + + Input layers Ursprungs-Ebenen - + None Keine - + Active (default) Aktive (Standard) - + All Alle - + Active and below Aktive und darunter liegende - + Active and above Aktive und darüber liegende - + All visible Alle sichtbaren - + All invisible Alle nicht sichtbaren - - All visible (decr.) - Alle sichtbaren (umgekehrte Reihenfolge) - - - - All invisible (decr.) - Alle unsichtbaren (umgekehrte Reichenfolge) - - - - All (decr.) - Alle (umgekehrte Reihenfolge) - - - - + + Output mode Ziel - + In place (default) Ebene ersetzen (Standard) - + New layer(s) Neue Ebene(n) - + New active layer(s) Neue aktive Ebene(n) - + New image Neues Bild - - Output messages - Ausgabe der Meldungen - - - - + + Preview mode Vorschau-Modus - + 1st output (default) Erste Ausgabe (Standard) - + 2nd output Zweite Ausgabe - + 3rd output Dritte Ausgabe - + 4th output Vierte Ausgabe - + 1st -> 2nd output Erste bis zweite Ausgabe - + 1st -> 3rd output Erste bis dritte Ausgabe - + 1st -> 4th output Erste bis vierte Ausgabe - + All outputs Alle Ausgaben @@ -455,180 +464,165 @@ GMIC - + <html><head/><body><p>Download filter definitions from remote sources</p></body></html> <html><head/><body><p>Filter-Definitionen von externen Quellen laden</p></body></html> - + Internet Internet - + Selection mode - + TextLabel why empty? TextLabel - + ... ... - - <html><head/><body><p>Enable/disable preview<br/>(right click on preview image for instant swaping)</p></body></html> - <html><head/><body><p>Vorschau ein/aus<br/>(Bildwechsel durch Rechtsklick auf Vorschau)</p></body></html> + + <html><head/><body><p>Enable/disable preview<br/>(Ctrl+P)<br/>(right click on preview image for instant swapping)</p></body></html> + - + Preview Vorschau - + Settings... Einstellungen... - + &Cancel &Abbruch - + &Fullscreen &Vollbild - + &Apply &Anwenden - + &OK &Ok - - Zoom in - - - - - Zoom out - - - - - Reset zoom - - - - - Warning: Preview may be inaccurate (zoom factor has been modified) - - - - + Add fave Als Favorit merken - + Reset parameters to default values - + Update filters (Ctrl+R / F5) Filter aktualisieren (Ctrl+R / F5) - + Rename fave Favorit umbenennen - + Remove fave Kein Favorit mehr - + Expand/Collapse all Alles aufklappen/einklappen - - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Normandy University (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Normandie Université (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) + + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandy University (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandie Université (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) - + Update completed Aktualisierung ist durchgeführt - - - + + + Filter definitions have been updated. Die Filter-Definitionen wurden aktualisiert. - + No download was needed. - + + Filters update could not be achieved + + + + The update could not be achieved<br>because of the following errors:<br> Wegen der folgenden Fehler konnte<br/>die Aktualisierung nicht durchgeführt werden:<br/> - + Update error Fehler bei der Aktualisierung - + Error Fehler - + Waiting for cancelled jobs... - + Import faves Favoriten importieren - + Do you want to import faves from file below?<br/>%1 Möchten Sie Favoriten aus dieser Datei importieren?<br/>%1 - + Don't ask again Nicht mehr fragen - + Confirmation Bestätigung - + A gmic command is running.<br>Do you really want to close the plugin? Ein GMIC-Kommando ist aktiv.<br>Wollen Sie das Plugin wirklich schließen? @@ -660,7 +654,7 @@ - + Abort Abbrechen @@ -670,23 +664,23 @@ TextLabel - + G'MIC-Qt Plug-in progression - + Updating filters... - - + + [Processing %1 | %2] [Berechne %1 | %2] - + [Processing %1] [Berechne %1] @@ -710,17 +704,17 @@ Abbrechen - + %1 seconds %1 Sekunden - + [Processing %1 | %2] |Berechne %1 | %2] - + [Processing %1] |Berechne %1] @@ -728,27 +722,27 @@ QObject - + Select an image to open... Bild zum Laden auswählen... - + PNG & JPG files (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) PNG- & JPG-Dateien (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) - + Error Fehler - + Could not open file. - + Default image @@ -771,12 +765,12 @@ Frame - + Search Suchen - + Search in filters list (%1) In Filter-Liste suchen (%1) @@ -784,32 +778,32 @@ Updater - + Could not read/decompress %1 %1 ist nicht lesbar oder kann nicht entpackt werden - + Error downloading %1 (empty file?) Fehler beim Laden von %1 (Leere Datei?) - + Error creating file %1 Fehler beim Erzeugen der Datei %1 - + Error writing file %1 Fehler beim Schreiben der Datei %1 - - Error downloading %1 - Fehler beim Herunterladen der Datei %1 + + Error downloading %1<br/>Error %2: %3 + - + Download timeout: %1 Zeitüberschreitung beim Herunterladen : %1 @@ -817,9 +811,29 @@ ZoomLevelSelector - + Form GMIC + + + Zoom in + + + + + Zoom out + + + + + Reset zoom + + + + + Warning: Preview may be inaccurate (zoom factor has been modified) + + Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/gmic-qt/translations/es.qm and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/gmic-qt/translations/es.qm differ diff -Nru gmic-2.4.5/gmic-qt/translations/es.ts gmic-2.9.2/gmic-qt/translations/es.ts --- gmic-2.4.5/gmic-qt/translations/es.ts 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/translations/es.ts 2020-09-03 11:37:05.000000000 +0000 @@ -7,7 +7,7 @@ ColorParameter - + Select color Seleccionar color @@ -20,173 +20,193 @@ Diálogo - + Internet updates Actualizaciones de internet - + Update now Actualizar ahora - + Layout Disposición - + + Interface + + + + Preview on the &left Previsualizar a la &izquierda - + Pre&view on right side Previsualizar a la &derecha - + Theme Tema - + &Default &Valor predeterminado - + Dar&k &Oscuro - + <i>(Restart needed)</I> <i>(Reinicio necesario)</i> - + Language - - + + Always enable preview zooming + + + + + <html><head/><body><p><span style=" font-style:italic;">(Warning: preview may be inaccurate<br/>if checked.)</span></p></body></html> + + + + + Other + + + + + Output messages Mensages de salida - + Dialogs Diálogos - + Use native color dialog Usar color nativo en los diálogos - + Preview Previsualización - + Timeout (seconds) - + Show institution logos - + + Notify when scheduled update fails + + + + &Ok &Aceptar - + Settings Parámetros - + Never Nunca - + Daily Diariamente - + Weekly Semanalmente - + Every 2 weeks Cada 2 semanas - + Monthly Mensualmente - + At launch (debug) Al iniciar (depurar) - - Output messages... - Mensages de salida... - - - + Quiet (default) Silencioso (por defecto) - + Verbose (layer name) Modo verborraico (nombre de capa) - + Verbose (console) Modo verborraico (consola) - + Verbose (log file) Modo verborraico (archivo de registro) - + Very verbose (console) Modo muy verborraico (consola) - + Very verbose (log file) Modo muy verborraico (archivo de registro) - + Debug (console) Depurar errores (consola) - + Debug (log file) Depurar errores (archivo de registro) - + Check to use Native/OS color dialog, uncheck to use Qt's Seleccionar para usar el diálogo de color nativo/SO, deseleccionar para usar el de Qt @@ -194,9 +214,9 @@ FileParameter - - - + + + Select a file Seleccionar un archivo @@ -204,18 +224,18 @@ FilterParametersWidget - - + + <i>Select a filter</i> <i>Seleccionar un filtro</i> - + <i>No parameters</i> <i>Sin parámetros</i> - + Error parsing filter parameters @@ -223,6 +243,15 @@ + FiltersPresenter + + + Cannot find this fave's original filter + + + + + FiltersView @@ -236,7 +265,7 @@ - + Remove fave Eliminar un favorito @@ -251,7 +280,7 @@ Adicionar un favorito - + Do you really want to remove the following fave? %1 @@ -262,7 +291,7 @@ FolderParameter - + Select a folder Seleccionar una carpeta @@ -293,135 +322,115 @@ ... - - + + Input layers Capas de entrada - + None Ninguna - + Active (default) Activa (por defecto) - + All Todas - + Active and below Activa e inferiores - + Active and above Activa y superiores - + All visible Todas las visibles - + All invisible Todas las invisibles - - All visible (decr.) - Todas las visibles (decrec.) - - - - All invisible (decr.) - Todas las invisibles (decrec.) - - - - All (decr.) - Todas (decrec.) - - - - + + Output mode Modo de salida - + In place (default) In situ (por defecto) - + New layer(s) Nueva(s) capa(s) - + New active layer(s) Nueva(s) capa(s) activa(s) - + New image Nueva imagen - - Output messages - Mensages de salida - - - - + + Preview mode Modo previsualización - + 1st output (default) 1a salida (por defecto) - + 2nd output 2a salida - + 3rd output 3ra salida - + 4th output 4ta salida - + 1st -> 2nd output 1a -> 2a salidas - + 1st -> 3rd output 1ra -> 3ra salidas - + 1st -> 4th output 1ra -> 4ra salidas - + All outputs Todas las salidas @@ -452,179 +461,164 @@ GMIC - + <html><head/><body><p>Download filter definitions from remote sources</p></body></html> <html><head/><body><p>Descargar las definiciones del filtro de fuentes remotas</p></body></html> - + Internet Internet - + Selection mode - + TextLabel Etiqueta de Texto - + ... ... - - <html><head/><body><p>Enable/disable preview<br/>(right click on preview image for instant swaping)</p></body></html> - <html><head/><body><p>Activar/desactivar previsualización<br/>(haz clic derecho en la imagen previsulizada para intercambio instantáneo)</p></body></html> + + <html><head/><body><p>Enable/disable preview<br/>(Ctrl+P)<br/>(right click on preview image for instant swapping)</p></body></html> + - + Preview Previsualización - + Settings... Parámetros... - + &Cancel &Cancelar - + &Fullscreen &Pantalla completa - + &Apply &Aplicar - + &OK &Aceptar - - Zoom in - - - - - Zoom out - - - - - Reset zoom - - - - - Warning: Preview may be inaccurate (zoom factor has been modified) - - - - + Add fave Adicionar un favorito - + Reset parameters to default values - + Update filters (Ctrl+R / F5) Actualizar filtros (Ctrl+R / F5) - + Rename fave Renombrar un favorito - + Remove fave Eliminar un favorito - + Expand/Collapse all Expandir/Colapsar todos - - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Normandy University (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Universidad de Normandía (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) + + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandy University (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Universidad de Normandía (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) - + Update completed Actualización completa - - - + + + Filter definitions have been updated. Las definiciones de filtros han sido actualizadas. - + No download was needed. - + + Filters update could not be achieved + + + + The update could not be achieved<br>because of the following errors:<br> La actualización no ha sido posible<br> debido a los siguientes errores :<br/> - + Update error Error en la actualización - + Error Error - + Waiting for cancelled jobs... - + Import faves Importar favoritos - + Do you want to import faves from file below?<br/>%1 ¿Quieres importar favoritos del archivo de abajo?<br/>%1 - + Don't ask again No volver a preguntar - + Confirmation Confirmar - + A gmic command is running.<br>Do you really want to close the plugin? Se está ejecutando un comando de gmic.'exécution.<br>¿Seguro que quieres cerrar el plugin? @@ -656,7 +650,7 @@ - + Abort Abortar @@ -666,23 +660,23 @@ Etiqueta de texto - + G'MIC-Qt Plug-in progression - + Updating filters... - - + + [Processing %1 | %2] [Procesando %1 | %2] - + [Processing %1] [Procesando %1] @@ -706,17 +700,17 @@ Cancelar - + %1 seconds %1 segundos - + [Processing %1 | %2] [Procesando %1 | %2] - + [Processing %1] [Procesando %1] @@ -724,27 +718,27 @@ QObject - + Select an image to open... Seleccionar una imagen para abrir... - + PNG & JPG files (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) Archivos PNG & JPG (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) - + Error Error - + Could not open file. - + Default image @@ -767,12 +761,12 @@ Marco - + Search Buscar - + Search in filters list (%1) Buscar en la lista de filtros (%1) @@ -780,32 +774,32 @@ Updater - + Could not read/decompress %1 Impossible de leer/descomprimir %1 - + Error downloading %1 (empty file?) Error al descargar %1 (archivo vacío?) - + Error creating file %1 Error en la creación del archivo %1 - + Error writing file %1 Error al escribir el archivo %1 - - Error downloading %1 - Error al descargar %1 + + Error downloading %1<br/>Error %2: %3 + - + Download timeout: %1 Descarga anulada (tiempo límite) : %1 @@ -813,9 +807,29 @@ ZoomLevelSelector - + Form GMIC + + + Zoom in + + + + + Zoom out + + + + + Reset zoom + + + + + Warning: Preview may be inaccurate (zoom factor has been modified) + + Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/gmic-qt/translations/fr.qm and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/gmic-qt/translations/fr.qm differ diff -Nru gmic-2.4.5/gmic-qt/translations/fr.ts gmic-2.9.2/gmic-qt/translations/fr.ts --- gmic-2.4.5/gmic-qt/translations/fr.ts 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/translations/fr.ts 2020-09-03 11:37:05.000000000 +0000 @@ -7,7 +7,7 @@ ColorParameter - + Select color Sélectionnez une couleur @@ -20,173 +20,193 @@ Paramètres - + Internet updates Mises à jour internet - + Update now Mettre à jour maintenant - + Layout Disposition - + + Interface + + + + Preview on the &left Prévisualisation à &gauche - + Pre&view on right side Prévisualisation à &droite - + Theme Thème - + &Default &Défaut - + Dar&k &Sombre - + <i>(Restart needed)</I> <i>(Changement effectif<br/>au prochain lancement.)</i> - + Language Langue - - + + Always enable preview zooming + + + + + <html><head/><body><p><span style=" font-style:italic;">(Warning: preview may be inaccurate<br/>if checked.)</span></p></body></html> + + + + + Other + + + + + Output messages Messages de sortie - + Dialogs Dialogues - + Use native color dialog Dialogues de choix de couleur natifs - + Preview Aperçu - + Timeout (seconds) Délai max. (secondes) - + Show institution logos Afficher les logos institutionnels - + + Notify when scheduled update fails + + + + &Ok &Ok - + Settings Paramètres - + Never Jamais - + Daily Journalière - + Weekly Hebdomadaire - + Every 2 weeks Toutes les deux semaines - + Monthly Mensuelle - + At launch (debug) À chaque lancement (débugage) - - Output messages... - Messages de sortie... - - - + Quiet (default) Aucun message (défaut) - + Verbose (layer name) Mode verbeux (nom de calque) - + Verbose (console) Mode verbeux (console) - + Verbose (log file) Mode verbeux (fichier de log) - + Very verbose (console) Mode très verbeux (console) - + Very verbose (log file) Mode très verbeux (fichier de log) - + Debug (console) Mode débogage (console) - + Debug (log file) Mode débogage (fichier de log) - + Check to use Native/OS color dialog, uncheck to use Qt's Cocher pour utiliser les dialogues natifs, décocher pour utiliser les dialogues Qt @@ -194,9 +214,9 @@ FileParameter - - - + + + Select a file Sélectionnez un fichier @@ -204,18 +224,18 @@ FilterParametersWidget - - + + <i>Select a filter</i> <i>Sélectionnez un filtre</i> - + <i>No parameters</i> <i>Aucun paramètre</i> - + Error parsing filter parameters @@ -225,6 +245,15 @@ + FiltersPresenter + + + Cannot find this fave's original filter + + + + + FiltersView @@ -238,7 +267,7 @@ - + Remove fave Supprimer un favori @@ -253,7 +282,7 @@ Ajouter un favori - + Do you really want to remove the following fave? %1 @@ -266,7 +295,7 @@ FolderParameter - + Select a folder Sélectionnez un dossier @@ -297,135 +326,115 @@ ... - - + + Input layers Calques en entrée - + None Aucun - + Active (default) Actif (défaut) - + All Tous - + Active and below Actif et en dessous - + Active and above Actif et au dessus - + All visible Tous les calques visibles - + All invisible Tous les calques invisibles - - All visible (decr.) - Tous les calques visibles (décr.) - - - - All invisible (decr.) - Tous les calques invisibles (décr.) - - - - All (decr.) - Tous (décr.) - - - - + + Output mode Mode de sortie - + In place (default) Sur place (défaut) - + New layer(s) Nouveau(x) calque(s) - + New active layer(s) Nouveau(x) calque(s) actif(s) - + New image Nouvelle image - - Output messages - Messages de sortie - - - - + + Preview mode Mode d'aperçu - + 1st output (default) 1ère image (défaut) - + 2nd output 2ème image - + 3rd output 3ème image - + 4th output 4ème image - + 1st -> 2nd output 1ère -> 2ème image - + 1st -> 3rd output 1ère -> 3ème image - + 1st -> 4th output 1ère -> 4ème image - + All outputs Toutes les images @@ -456,179 +465,164 @@ GMIC - + <html><head/><body><p>Download filter definitions from remote sources</p></body></html> <html><head/><body><p>Télécharger les définitions de filtres depuis les sources distantes</p></body></html> - + Internet Internet - + Selection mode Mode sélection - + TextLabel - + ... ... - - <html><head/><body><p>Enable/disable preview<br/>(right click on preview image for instant swaping)</p></body></html> - <html><head/><body><p>Activer/désactiver l'aperçu<br/>(clic droit sur l'aperçu pour alterner)</p></body></html> + + <html><head/><body><p>Enable/disable preview<br/>(Ctrl+P)<br/>(right click on preview image for instant swapping)</p></body></html> + - + Preview Aperçu - + Settings... Paramètres... - + &Cancel &Annuler - + &Fullscreen &Plein écran - + &Apply &Appliquer - + &OK &Ok - - Zoom in - Zoom avant - - - - Zoom out - Zoom arrière - - - - Reset zoom - Zoom par défaut - - - - Warning: Preview may be inaccurate (zoom factor has been modified) - Attention : l'aperçu peut être erroné (le facteur de zoom a été modifié) - - - + Add fave Ajouter un favori - + Reset parameters to default values Réinitialiser les paramètres du filtre - + Update filters (Ctrl+R / F5) Mettre à jour les filtres (Ctrl+R / F5) - + Rename fave Renommer un favori - + Remove fave Supprimer un favori - + Expand/Collapse all Déplier/Réduire tout - - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Normandy University (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Normandie Université (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) + + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandy University (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandie Université (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) - + Update completed Mise à jour réussie - - - + + + Filter definitions have been updated. Les définitions de filtres ont été mises à jour. - + No download was needed. Aucun téléchargement n'était requis. - + + Filters update could not be achieved + + + + The update could not be achieved<br>because of the following errors:<br> La mise à jour n'a pas réussi en raison<br/>des erreurs suivantes :<br/> - + Update error Erreurs lors de la mise à jour - + Error Erreur - + Waiting for cancelled jobs... En attente des traitements annulés... - + Import faves Importer les favoris - + Do you want to import faves from file below?<br/>%1 Voulez-vous importer les favoris du fichier ci-dessous ?<br/>%1 - + Don't ask again Ne plus me demander - + Confirmation Confirmation - + A gmic command is running.<br>Do you really want to close the plugin? Une commande gmic est en cours d'exécution.<br>Voulez-vous vraiment fermer le plugin ? @@ -660,7 +654,7 @@ - + Abort Annuler @@ -670,23 +664,23 @@ TextLabel - + G'MIC-Qt Plug-in progression Progression du greffon G'MIC-Qt - + Updating filters... Mise à jour des filtres... - - + + [Processing %1 | %2] [Traitement en cours %1 | %2] - + [Processing %1] [Traitement en cours %1] @@ -710,17 +704,17 @@ Cancel - + %1 seconds %1 secondes - + [Processing %1 | %2] |Traitement en cours %1 | %2] - + [Processing %1] |Traitement en cours %1] @@ -728,27 +722,27 @@ QObject - + Select an image to open... Sélectionnez une image à ouvrir... - + PNG & JPG files (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) Fichiers PNG & JPG (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) - + Error Erreur - + Could not open file. Impossible d'ouvrir le fichier. - + Default image Image par défaut @@ -771,12 +765,12 @@ Frame - + Search Rechercher - + Search in filters list (%1) Rechercher dans la liste des filtres (%1) @@ -784,32 +778,32 @@ Updater - + Could not read/decompress %1 Impossible de lire/décompresser %1 - + Error downloading %1 (empty file?) Erreur de téléchargement de %1 (fichier vide ?) - + Error creating file %1 Erreur de création du fichier %1 - + Error writing file %1 Erreur d'écriture du fichier %1 - - Error downloading %1 - Erreur lors du téléchargement de %1 + + Error downloading %1<br/>Error %2: %3 + - + Download timeout: %1 Téléchargement annulé (hors délai) : %1 @@ -817,9 +811,29 @@ ZoomLevelSelector - + Form GMIC + + + Zoom in + Zoom avant + + + + Zoom out + Zoom arrière + + + + Reset zoom + Zoom par défaut + + + + Warning: Preview may be inaccurate (zoom factor has been modified) + Attention : l'aperçu peut être erroné (le facteur de zoom a été modifié) + Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/gmic-qt/translations/id.qm and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/gmic-qt/translations/id.qm differ diff -Nru gmic-2.4.5/gmic-qt/translations/id.ts gmic-2.9.2/gmic-qt/translations/id.ts --- gmic-2.4.5/gmic-qt/translations/id.ts 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/translations/id.ts 2020-09-03 11:37:05.000000000 +0000 @@ -7,7 +7,7 @@ ColorParameter - + Select color Pilih warna @@ -20,173 +20,193 @@ Dialog - + Internet updates Pembaruan internet - + Update now Perbarui sekarang - + Layout Tata letak - + + Interface + + + + Preview on the &left Tinjauan di &kiri - + Pre&view on right side Tinjauan di &kanan - + Theme Tema - + &Default &Setelan standar - + Dar&k &Gelap - + <i>(Restart needed)</I> <i>(Restart diperlukan)</i> - + Language - - + + Always enable preview zooming + + + + + <html><head/><body><p><span style=" font-style:italic;">(Warning: preview may be inaccurate<br/>if checked.)</span></p></body></html> + + + + + Other + + + + + Output messages Pesan-pesan keluaran - + Dialogs Dialog-dialog - + Use native color dialog Gunakan dialog warna native - + Preview Tinjauan - + Timeout (seconds) - + Show institution logos - + + Notify when scheduled update fails + + + + &Ok &Ok - + Settings Setelan - + Never Tidak pernah - + Daily Harian - + Weekly Mingguan - + Every 2 weeks Tiap 2 minggu - + Monthly Bulanan - + At launch (debug) Pada pembukaan (debug) - - Output messages... - Pesan-pesan keluaran... - - - + Quiet (default) Sunyi (setelan standar) - + Verbose (layer name) Verbose (nama lapisan) - + Verbose (console) Verbose (konsol) - + Verbose (log file) Verbose (berkas laporan) - + Very verbose (console) Very verbose (konsol) - + Very verbose (log file) Very verbose (berkas laporan) - + Debug (console) Debug (konsol) - + Debug (log file) Debug (berkas laporan) - + Check to use Native/OS color dialog, uncheck to use Qt's Centang untuk gunakan warna native, Tidak centang untuk gunakan Qt @@ -194,9 +214,9 @@ FileParameter - - - + + + Select a file Pilih berkas @@ -204,18 +224,18 @@ FilterParametersWidget - - + + <i>Select a filter</i> <i>Pilih filter</i> - + <i>No parameters</i> <i>Tak ada parameter</i> - + Error parsing filter parameters @@ -223,6 +243,15 @@ + FiltersPresenter + + + Cannot find this fave's original filter + + + + + FiltersView @@ -236,7 +265,7 @@ - + Remove fave Hapus favorit @@ -251,7 +280,7 @@ Tambah favorit - + Do you really want to remove the following fave? %1 @@ -262,7 +291,7 @@ FolderParameter - + Select a folder Pilih folder @@ -293,135 +322,115 @@ ... - - + + Input layers Lapisan masukan - + None Tidak ada - + Active (default) Aktif (setelan standar) - + All Semua - + Active and below Aktif dan bawah - + Active and above Aktif dan atas - + All visible Semua terlihat - + All invisible Semua tak terlihat - - All visible (decr.) - Semua terlihat (mengecil) - - - - All invisible (decr.) - Semua tak terlihat (mengecil) - - - - All (decr.) - Semua (mengecil) - - - - + + Output mode Modus keluaran - + In place (default) Pada tempatnya (setelan standar) - + New layer(s) Lapisan(-lapisan) baru - + New active layer(s) Lapisan(-lapisan) aktif baru - + New image Citra baru - - Output messages - Pesan-pesan keluaran - - - - + + Preview mode Modus tinjauan - + 1st output (default) Keluaran pertama (setelan standar) - + 2nd output Keluaran ketiga {2c?} - + 1st -> 2nd output Keluaran pertama -> ketiga {1s?} {2c?} - + 3rd output Keluaran ketiga - + 4th output Keluaran keempat - + 1st -> 3rd output Keluaran pertama -> ketiga - + 1st -> 4th output Keluaran pertama -> keempat - + All outputs Semua keluaran @@ -452,179 +461,164 @@ GMIC - + <html><head/><body><p>Download filter definitions from remote sources</p></body></html> <html><head/><body><p>Scaricare le definizioni dei filtri da remoto</p></body></html> - + Internet Internet - + Selection mode - + TextLabel LabelTeks - + ... ... - - <html><head/><body><p>Enable/disable preview<br/>(right click on preview image for instant swaping)</p></body></html> - <html><head/><body><p>Abilitare/disabilitare anteprima<br/>(click destro per alternare)</p></body></html> + + <html><head/><body><p>Enable/disable preview<br/>(Ctrl+P)<br/>(right click on preview image for instant swapping)</p></body></html> + - + Preview Tinjauan - + Settings... Pengaturan... - + &Cancel &Batalkan - + &Fullscreen &Layar penuh - + &Apply &Terapkan - + &OK &Ok - - Zoom in - - - - - Zoom out - - - - - Reset zoom - - - - - Warning: Preview may be inaccurate (zoom factor has been modified) - - - - + Add fave Tambah favorit - + Reset parameters to default values - + Update filters (Ctrl+R / F5) Perbarui filter (Ctrl+R / F5) - + Rename fave Namai ulang favorit - + Remove fave Hapus favorit - + Expand/Collapse all Expand/Collapse semua - - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Normandy University (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Normandie Université (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) + + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandy University (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandie Université (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) - + Update completed Pembaruan selesai - - - + + + Filter definitions have been updated. Definisi filter telah diperbarui. - + No download was needed. - + + Filters update could not be achieved + + + + The update could not be achieved<br>because of the following errors:<br> Pembaruan gagal<br/>karena error berikut:<br/> - + Update error Error pada pembaruan - + Error Error - + Waiting for cancelled jobs... - + Import faves Impor favorit - + Do you want to import faves from file below?<br/>%1 Apa anda ingin mengimpor favorit dari berkas dibawah?<br/>%1 - + Don't ask again Jangan tanya lagi - + Confirmation Konfirmasi - + A gmic command is running.<br>Do you really want to close the plugin? Perintah gmic tengah berjalan.<br>Apa anda benar ingin menutup plugin? @@ -656,7 +650,7 @@ - + Abort Hentikan @@ -666,23 +660,23 @@ LabelTeks - + G'MIC-Qt Plug-in progression - + Updating filters... - - + + [Processing %1 | %2] [Memproses %1 | %2] - + [Processing %1] [Memproses %1] @@ -706,17 +700,17 @@ Batalkan - + %1 seconds %1 detik - + [Processing %1 | %2] [Memproses %1 | %2] - + [Processing %1] [Memproses %1] @@ -724,27 +718,27 @@ QObject - + Select an image to open... Pilih citra untuk dibuka... - + PNG & JPG files (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) Files PNG & JPG (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) - + Error Error - + Could not open file. - + Default image @@ -767,12 +761,12 @@ Bingkai - + Search Cari - + Search in filters list (%1) Cari di daftar filter (%1) @@ -780,32 +774,32 @@ Updater - + Could not read/decompress %1 Tak terbaca/dekompresi %1 - + Error downloading %1 (empty file?) Error download %1 (berkas kosong?) - + Error creating file %1 Error membuat berkas %1 - + Error writing file %1 Error menulis berkas %1 - - Error downloading %1 - Error mengunduh %1 + + Error downloading %1<br/>Error %2: %3 + - + Download timeout: %1 Unduhan menunggu: %1 @@ -813,9 +807,29 @@ ZoomLevelSelector - + Form GMIC + + + Zoom in + + + + + Zoom out + + + + + Reset zoom + + + + + Warning: Preview may be inaccurate (zoom factor has been modified) + + Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/gmic-qt/translations/it.qm and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/gmic-qt/translations/it.qm differ diff -Nru gmic-2.4.5/gmic-qt/translations/it.ts gmic-2.9.2/gmic-qt/translations/it.ts --- gmic-2.4.5/gmic-qt/translations/it.ts 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/translations/it.ts 2020-09-03 11:37:05.000000000 +0000 @@ -7,7 +7,7 @@ ColorParameter - + Select color Selezionare un colore @@ -20,173 +20,193 @@ Parametri - + Internet updates Aggiornamento da internet - + Update now Aggiorna - + Layout Disposizione - + + Interface + + + + Preview on the &left Anteprima a &sinistra - + Pre&view on right side Anteprima a &destra - + Theme Tema - + &Default &Predefinito - + Dar&k &Scuro - + <i>(Restart needed)</I> <i>(Modifica effettiva<br/>al prossimo riavvio.)</i> - + Language - - + + Always enable preview zooming + + + + + <html><head/><body><p><span style=" font-style:italic;">(Warning: preview may be inaccurate<br/>if checked.)</span></p></body></html> + + + + + Other + + + + + Output messages Messaggi in uscita - + Dialogs Dialoghi - + Use native color dialog Finestra selezione colori nativi - + Preview Anteprima - + Timeout (seconds) - + Show institution logos - + + Notify when scheduled update fails + + + + &Ok &Ok - + Settings Parametri - + Never Mai - + Daily Giornaliero - + Weekly Settimanale - + Every 2 weeks Bisettimanale - + Monthly Mensile - + At launch (debug) All'avvio (debug) - - Output messages... - Messaggi in uscita... - - - + Quiet (default) Silenzioso (defaut) - + Verbose (layer name) Modalità verbosa (nome del livello) - + Verbose (console) Modalità verbosa (console) - + Verbose (log file) Modalità verbosa (file di log) - + Very verbose (console) Molto verboso (console) - + Very verbose (log file) Molto verboso (fichier de log) - + Debug (console) Molto verboso (console) - + Debug (log file) Molto verboso (fichier de log) - + Check to use Native/OS color dialog, uncheck to use Qt's Selezionare per utilizzare i colori nativi, deselezionare per utilizzare Qt @@ -194,9 +214,9 @@ FileParameter - - - + + + Select a file Selezionare un file @@ -204,18 +224,18 @@ FilterParametersWidget - - + + <i>Select a filter</i> <i>Selezionare un filtro</i> - + <i>No parameters</i> <i>Nessun parametro</i> - + Error parsing filter parameters @@ -223,6 +243,15 @@ + FiltersPresenter + + + Cannot find this fave's original filter + + + + + FiltersView @@ -236,7 +265,7 @@ - + Remove fave Elimina favorito @@ -251,7 +280,7 @@ Aggiungi ai favoriti - + Do you really want to remove the following fave? %1 @@ -262,7 +291,7 @@ FolderParameter - + Select a folder Selezionare una cartella @@ -293,135 +322,115 @@ ... - - + + Input layers Livelli in ingresso - + None Nessuno - + Active (default) Attivo (predefinito) - + All Tutti - + Active and below Attivo e sottostanti - + Active and above Attivo e soprastanti - + All visible Tutti i visibili - + All invisible Tutti gli invisibili - - All visible (decr.) - Tutti i visibili (decr.) - - - - All invisible (decr.) - Tutti gli invisibili (decr) - - - - All (decr.) - Tutti (decr.) - - - - + + Output mode Modalità di uscita - + In place (default) in loco (defaut) - + New layer(s) Nuovo(x) livello(s) - + New active layer(s) Nuovo(x) livello(s) attivo(s) - + New image Nuova immagine - - Output messages - Messaggi in uscita - - - - + + Preview mode Modalità anteprima - + 1st output (default) 1^ immagine (predefinito) - + 2nd output 3^ immagine {2c?} - + 1st -> 2nd output 1^ -> 3^ immagine {1s?} {2c?} - + 3rd output 3^ immagine - + 4th output 4^ immagine - + 1st -> 3rd output 1^ -> 3^ immagine - + 1st -> 4th output 1^ -> 4^ immagine - + All outputs Tutte le immagini @@ -452,179 +461,164 @@ GMIC - + <html><head/><body><p>Download filter definitions from remote sources</p></body></html> <html><head/><body><p>Scaricare le definizioni dei filtri da remoto</p></body></html> - + Internet Internet - + Selection mode - + TextLabel - + ... ... - - <html><head/><body><p>Enable/disable preview<br/>(right click on preview image for instant swaping)</p></body></html> - <html><head/><body><p>Abilitare/disabilitare anteprima<br/>(click destro per alternare)</p></body></html> + + <html><head/><body><p>Enable/disable preview<br/>(Ctrl+P)<br/>(right click on preview image for instant swapping)</p></body></html> + - + Preview Anteprima - + Settings... Parametri... - + &Cancel &Annulla - + &Fullscreen &Tutto schermo - + &Apply &Applica - + &OK &Ok - - Zoom in - - - - - Zoom out - - - - - Reset zoom - - - - - Warning: Preview may be inaccurate (zoom factor has been modified) - - - - + Add fave Aggiungi ai favoriti - + Reset parameters to default values - + Update filters (Ctrl+R / F5) Aggiorna filtri (Ctrl+R / F5) - + Rename fave Rinomina favorito - + Remove fave Elimina favorito - + Expand/Collapse all Espandi/Collassa tutto - - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Normandy University (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Normandie Université (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) + + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandy University (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandie Université (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) - + Update completed Aggiornamento completato - - - + + + Filter definitions have been updated. Le definizioni dei filtri sono state aggiornate. - + No download was needed. - + + Filters update could not be achieved + + + + The update could not be achieved<br>because of the following errors:<br> L'aggiornamento non è stato possibile<br/>a causa dei seguenti errori :<br/> - + Update error Errori durante l'aggiornamento - + Error Errore - + Waiting for cancelled jobs... - + Import faves Importa favoriti - + Do you want to import faves from file below?<br/>%1 Vuoi davvero importare i favoriti dal file sottostante?<br/>%1 - + Don't ask again Non richiedere nuovamente - + Confirmation Conferma - + A gmic command is running.<br>Do you really want to close the plugin? Un comando gmic è in esecuzione.<br>Vuoi davvero chiudere il plugin? @@ -656,7 +650,7 @@ - + Abort Annullare @@ -666,23 +660,23 @@ TextLabel - + G'MIC-Qt Plug-in progression - + Updating filters... - - + + [Processing %1 | %2] [Esecuzione in corso %1 | %2] - + [Processing %1] [Esecuzione in corso %1] @@ -706,17 +700,17 @@ Cancel - + %1 seconds %1 secondi - + [Processing %1 | %2] |Esecuzione in corso %1 | %2] - + [Processing %1] |Esecuzione in corso %1] @@ -724,27 +718,27 @@ QObject - + Select an image to open... Selezionare un'immagine da aprire... - + PNG & JPG files (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) Files PNG & JPG (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) - + Error Errore - + Could not open file. - + Default image @@ -767,12 +761,12 @@ Frame - + Search Ricerca - + Search in filters list (%1) Ricerca nella finestra dei filtri (%1) @@ -780,32 +774,32 @@ Updater - + Could not read/decompress %1 Impossibile leggere/decomprimere %1 - + Error downloading %1 (empty file?) Errore di scaricamento %1 (File vuoto ?) - + Error creating file %1 Errore di creazione file %1 - + Error writing file %1 Errore scrittura file %1 - - Error downloading %1 - Errore scaricamento file %1 + + Error downloading %1<br/>Error %2: %3 + - + Download timeout: %1 Tempo scaduto: %1 @@ -813,9 +807,29 @@ ZoomLevelSelector - + Form GMIC + + + Zoom in + + + + + Zoom out + + + + + Reset zoom + + + + + Warning: Preview may be inaccurate (zoom factor has been modified) + + Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/gmic-qt/translations/ja.qm and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/gmic-qt/translations/ja.qm differ diff -Nru gmic-2.4.5/gmic-qt/translations/ja.ts gmic-2.9.2/gmic-qt/translations/ja.ts --- gmic-2.4.5/gmic-qt/translations/ja.ts 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/translations/ja.ts 2020-09-03 11:37:05.000000000 +0000 @@ -7,7 +7,7 @@ ColorParameter - + Select color 色を選択 @@ -20,173 +20,193 @@ ダイアログ - + Internet updates インターネット更新 - + Update now 今すぐ更新 - + Layout レイアウト - + + Interface + + + + Preview on the &left 左側にプレビューを表示(&L) - + Pre&view on right side 右側にプレビューを表示(&V) - + Theme テーマ - + &Default デフォルト(&D) - + Dar&k 暗い色(&K) - + <i>(Restart needed)</I> <i>(再起動が必要です)</i> - + Language - - + + Always enable preview zooming + + + + + <html><head/><body><p><span style=" font-style:italic;">(Warning: preview may be inaccurate<br/>if checked.)</span></p></body></html> + + + + + Other + + + + + Output messages 出力メッセージ - + Dialogs ダイアログ - + Use native color dialog ネイティブな色選択ダイアログを使用 - + Preview プレビュー - + Timeout (seconds) - + Show institution logos - + + Notify when scheduled update fails + + + + &Ok OK(&O) - + Settings 設定 - + Never 行わない - + Daily 毎日 - + Weekly 毎週 - + Every 2 weeks 隔週 - + Monthly 毎月 - + At launch (debug) 起動時 (デバッグ用) - - Output messages... - 出力メッセージ... - - - + Quiet (default) なし (デフォルト) - + Verbose (layer name) 詳細 (レイヤー名) - + Verbose (console) 詳細 (コンソール) - + Verbose (log file) 詳細 (ログファイル) - + Very verbose (console) 非常に詳細 (コンソール) - + Very verbose (log file) 非常に詳細 (ログファイル) - + Debug (console) デバッグ (コンソール) - + Debug (log file) デバッグ (ログファイル) - + Check to use Native/OS color dialog, uncheck to use Qt's チェックすると、システムに標準搭載された色選択ダイアログを使用します。チェックを外すと、Qt の色選択ダイアログを使用します @@ -194,9 +214,9 @@ FileParameter - - - + + + Select a file ファイルを選択 @@ -204,18 +224,18 @@ FilterParametersWidget - - + + <i>Select a filter</i> <i>フィルタを選択</i> - + <i>No parameters</i> <i>パラメータなし</i> - + Error parsing filter parameters @@ -223,6 +243,15 @@ + FiltersPresenter + + + Cannot find this fave's original filter + + + + + FiltersView @@ -236,7 +265,7 @@ - + Remove fave お気に入りから削除 @@ -251,7 +280,7 @@ お気に入りに追加 - + Do you really want to remove the following fave? %1 @@ -262,7 +291,7 @@ FolderParameter - + Select a folder フォルダを選択 @@ -293,135 +322,115 @@ ... - - + + Input layers 入力レイヤー - + None なし - + Active (default) アクティブなレイヤー (デフォルト) - + All すべて - + Active and below アクティブなレイヤーとその下のレイヤー - + Active and above アクティブなレイヤーとその上のレイヤー - + All visible すべての可視レイヤー - + All invisible すべての不可視レイヤー - - All visible (decr.) - - - - - All invisible (decr.) - - - - - All (decr.) - - - - - + + Output mode 出力モード - + In place (default) 現在のレイヤー (デフォルト) - + New layer(s) 新規レイヤー - + New active layer(s) 新規アクティブレイヤー - + New image 新規画像 - - Output messages - 出力メッセージ - - - - + + Preview mode プレビューモード - + 1st output (default) - + 2nd output - + 3rd output - + 4th output - + 1st -> 2nd output - + 1st -> 3rd output - + 1st -> 4th output - + All outputs @@ -452,179 +461,164 @@ GMIC - + <html><head/><body><p>Download filter definitions from remote sources</p></body></html> <html><head/><body><p>Télécharger les définitions de filtres depuis les sources distantes</p></body></html> - + Internet インターネット - + Selection mode 選択モード - + TextLabel - + ... ... - - <html><head/><body><p>Enable/disable preview<br/>(right click on preview image for instant swaping)</p></body></html> - <html><head/><body><p>Activer/désactiver l'aperçu<br/>(clic droit sur l'aperçu pour alterner)</p></body></html> + + <html><head/><body><p>Enable/disable preview<br/>(Ctrl+P)<br/>(right click on preview image for instant swapping)</p></body></html> + - + Preview プレビュー - + Settings... 設定... - + &Cancel キャンセル(&C) - + &Fullscreen フルスクリーン(&F) - + &Apply 適用(&A) - + &OK OK(&O) - - Zoom in - ズームイン - - - - Zoom out - ズームアウト - - - - Reset zoom - 拡大率をリセット - - - - Warning: Preview may be inaccurate (zoom factor has been modified) - 警告: プレビューは実際の処理結果と異なる場合があります (拡大率が変更されています) - - - + Add fave お気に入りに追加 - + Reset parameters to default values パラメータの値を初期化 - + Update filters (Ctrl+R / F5) フィルタを更新 - + Rename fave お気に入りの名前を変更 - + Remove fave お気に入りから削除 - + Expand/Collapse all すべて展開/すべて畳む - - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Normandy University (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>フランス国立科学研究センター (http://www.cnrs.fr)<br/>カーン・ノルマンディー大学 (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) + + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandy University (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>フランス国立科学研究センター (https://www.cnrs.fr)<br/>カーン・ノルマンディー大学 (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) - + Update completed 更新が完了しました - - - + + + Filter definitions have been updated. フィルタ定義の更新が完了しました。 - + No download was needed. - + + Filters update could not be achieved + + + + The update could not be achieved<br>because of the following errors:<br> 以下のエラーにより<br/>更新に失敗しました:<br/> - + Update error 更新エラー - + Error エラー - + Waiting for cancelled jobs... - + Import faves お気に入りをインポート - + Do you want to import faves from file below?<br/>%1 以下のファイルからお気に入りをインポートしますか?<br/>%1 - + Don't ask again 次回から確認しない - + Confirmation 確認 - + A gmic command is running.<br>Do you really want to close the plugin? G'MIC コマンドが実行中です。<br>本当にプラグインを終了しますか? @@ -656,7 +650,7 @@ - + Abort 中止 @@ -666,23 +660,23 @@ TextLabel - + G'MIC-Qt Plug-in progression - + Updating filters... - - + + [Processing %1 | %2] [実行中: %1 | %2] - + [Processing %1] [実行中: %1] @@ -706,17 +700,17 @@ キャンセル - + %1 seconds %1 秒 - + [Processing %1 | %2] |実行中: %1 | %2] - + [Processing %1] |実行中: %1] @@ -724,27 +718,27 @@ QObject - + Select an image to open... 開く画像を選択... - + PNG & JPG files (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) PNG および JPG ファイル (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) - + Error エラー - + Could not open file. - + Default image @@ -767,12 +761,12 @@ フレーム - + Search 検索 - + Search in filters list (%1) フィルタ一覧を検索 (%1) @@ -780,32 +774,32 @@ Updater - + Could not read/decompress %1 %1 を読み込み・展開できませんでした - + Error downloading %1 (empty file?) %1 のダウンロード中にエラーが発生しました (空ファイル?) - + Error creating file %1 ファイル %1 の作成時にエラーが発生しました - + Error writing file %1 ファイル %1 の書き込み中にエラーが発生しました - - Error downloading %1 - %1 のダウンロード中にエラーが発生しました + + Error downloading %1<br/>Error %2: %3 + - + Download timeout: %1 ダウンロード中にタイムアウト: %1 @@ -813,9 +807,29 @@ ZoomLevelSelector - + Form フォーム + + + Zoom in + ズームイン + + + + Zoom out + ズームアウト + + + + Reset zoom + 拡大率をリセット + + + + Warning: Preview may be inaccurate (zoom factor has been modified) + 警告: プレビューは実際の処理結果と異なる場合があります (拡大率が変更されています) + Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/gmic-qt/translations/nl.qm and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/gmic-qt/translations/nl.qm differ diff -Nru gmic-2.4.5/gmic-qt/translations/nl.ts gmic-2.9.2/gmic-qt/translations/nl.ts --- gmic-2.4.5/gmic-qt/translations/nl.ts 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/translations/nl.ts 2020-09-03 11:37:05.000000000 +0000 @@ -7,7 +7,7 @@ ColorParameter - + Select color Selecteer een kleur @@ -20,173 +20,193 @@ Instellingen - + Internet updates - + Update now Nu updaten - + Layout Lay-out - + + Interface + + + + Preview on the &left Preview aan &linkerzijde - + Pre&view on right side Preview aan &rechterzijde - + Theme Thema - + &Default &standaard - + Dar&k &Donker - + <i>(Restart needed)</I> <i>(Opnieuw opstarten nodig)</i> - + Language - - + + Always enable preview zooming + + + + + <html><head/><body><p><span style=" font-style:italic;">(Warning: preview may be inaccurate<br/>if checked.)</span></p></body></html> + + + + + Other + + + + + Output messages Uitvoer berichten - + Dialogs Dialoogvenster - + Use native color dialog Gebruik standaard kleur in dialoogvenster - + Preview - + Timeout (seconds) - + Show institution logos - + + Notify when scheduled update fails + + + + &Ok &Ok - + Settings Instellingen - + Never Nooit - + Daily Dagelijks - + Weekly Weekelijks - + Every 2 weeks Elke twee weken - + Monthly Maandelijks - + At launch (debug) Bij opstarten (debug) - - Output messages... - Uitvoer berichten... - - - + Quiet (default) Geen bericht (standaard) - + Verbose (layer name) Uitgebreid (laag-naam) - + Verbose (console) Uitgebreid (console) - + Verbose (log file) Uitgebreid (logbestand) - + Very verbose (console) Zeer uitgebreid (console) - + Very verbose (log file) Zeer uitgebreid (logbestand) - + Debug (console) Debug (console) - + Debug (log file) Debug (logbestand) - + Check to use Native/OS color dialog, uncheck to use Qt's Aan voor standaard OS-kleur omgeving, Uit voor QT-kleur @@ -194,9 +214,9 @@ FileParameter - - - + + + Select a file Selecteer een bestand @@ -204,18 +224,18 @@ FilterParametersWidget - - + + <i>Select a filter</i> <i>Selecteer een filter</i> - + <i>No parameters</i> <i>Geen parameters</i> - + Error parsing filter parameters @@ -223,6 +243,15 @@ + FiltersPresenter + + + Cannot find this fave's original filter + + + + + FiltersView @@ -236,7 +265,7 @@ - + Remove fave Verwijder favoriet @@ -251,7 +280,7 @@ Voeg favoriet toe - + Do you really want to remove the following fave? %1 @@ -262,7 +291,7 @@ FolderParameter - + Select a folder Selecteer een map @@ -293,135 +322,115 @@ - - + + Input layers Invoer lagen - + None Geen - + Active (default) Actief (standaard) - + All Alle - + Active and below Actief en daaronder - + Active and above Actief en daarboven - + All visible Alle zichtbare lagen - + All invisible Alle onzichtbare lagen - - All visible (decr.) - Alle zichtbare lagen (dalend) - - - - All invisible (decr.) - Alle onzichtbare lagen (dalend) - - - - All (decr.) - Alle (dalend) - - - - + + Output mode Uitvoer-modus - + In place (default) In plaats van (standaard) - + New layer(s) Nieuwe laag/lagen - + New active layer(s) Nieuwe actieve laag/lagen - + New image Nieuwe afbeelding - - Output messages - Uitvoer berichten - - - - + + Preview mode Preview-modus - + 1st output (default) 1ste afbeelding (standaard) - + 2nd output 2de afbeelding - + 3rd output 3de afbeelding - + 4th output 4de afbeelding - + 1st -> 2nd output 1ste -> 2de afbeelding - + 1st -> 3rd output 1ste -> 3de afbeelding - + 1st -> 4th output 1ste -> 4de afbeelding - + All outputs Alle afbeeldingen @@ -452,179 +461,164 @@ GMIC - + <html><head/><body><p>Download filter definitions from remote sources</p></body></html> <html><head/><body><p>Download filter-definities van afzonderlijke bronnen</p></body></html> - + Internet Internet - + Selection mode - + TextLabel - + ... - - <html><head/><body><p>Enable/disable preview<br/>(right click on preview image for instant swaping)</p></body></html> - <html><head/><body><p>Inschakelen/uitschakelen preview l'aperçu<br/>(rechtermuisklik in preview-vak voor omwisselen)</p></body></html> + + <html><head/><body><p>Enable/disable preview<br/>(Ctrl+P)<br/>(right click on preview image for instant swapping)</p></body></html> + - + Preview - + Settings... Instellingen... - + &Cancel &Annuleer - + &Fullscreen &Schermvullend - + &Apply &Toepassen - + &OK - - Zoom in - - - - - Zoom out - - - - - Reset zoom - - - - - Warning: Preview may be inaccurate (zoom factor has been modified) - - - - + Add fave Voeg favoriet toe - + Reset parameters to default values - + Update filters (Ctrl+R / F5) - + Rename fave Hernoem een favoriet - + Remove fave Verwijder favoriet - + Expand/Collapse all Alles Uitbreiden/Samenvouwen - - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Normandy University (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Normandie Universiteit (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) + + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandy University (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandie Universiteit (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) - + Update completed Update voltooid - - - + + + Filter definitions have been updated. De filter-definities zijn bijgewerkt. - + No download was needed. - + + Filters update could not be achieved + + + + The update could not be achieved<br>because of the following errors:<br> De update is mislukt<br/>vanwege de volgende fouten:<br/> - + Update error Update fout - + Error Fout - + Waiting for cancelled jobs... - + Import faves Importeer favorieten - + Do you want to import faves from file below?<br/>%1 Wilt u favorieten importeren van het bestand hieronder?<br/>%1 - + Don't ask again Niet opnieuw vragen - + Confirmation Bevestiging - + A gmic command is running.<br>Do you really want to close the plugin? GMIC voert momenteel een commando uit.<br>Wilt u echt afbreken? @@ -656,7 +650,7 @@ - + Abort Annuleer @@ -666,23 +660,23 @@ TextLabel - + G'MIC-Qt Plug-in progression - + Updating filters... - - + + [Processing %1 | %2] [Verwerken %1 | %2] - + [Processing %1] [Verwerken %1] @@ -706,17 +700,17 @@ Annuleren - + %1 seconds %1 seconden - + [Processing %1 | %2] |Verwerken %1 | %2] - + [Processing %1] |Verwerken %1] @@ -724,27 +718,27 @@ QObject - + Select an image to open... Selecteer een afbeelding om te openen... - + PNG & JPG files (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) PNG & JPG bestanden (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) - + Error Fout - + Could not open file. - + Default image @@ -767,12 +761,12 @@ Frame - + Search Zoek - + Search in filters list (%1) Zoek in lijst met filters (%1) @@ -780,32 +774,32 @@ Updater - + Could not read/decompress %1 Niet leesbaar/uitpakbaar %1 - + Error downloading %1 (empty file?) Downloadfout %1 (fichier vide ?) - + Error creating file %1 Kan bestand niet maken %1 - + Error writing file %1 Kan bestand niet schrijven %1 - - Error downloading %1 - Downloadfout %1 + + Error downloading %1<br/>Error %2: %3 + - + Download timeout: %1 @@ -813,9 +807,29 @@ ZoomLevelSelector - + Form GMIC + + + Zoom in + + + + + Zoom out + + + + + Reset zoom + + + + + Warning: Preview may be inaccurate (zoom factor has been modified) + + Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/gmic-qt/translations/pl.qm and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/gmic-qt/translations/pl.qm differ diff -Nru gmic-2.4.5/gmic-qt/translations/pl.ts gmic-2.9.2/gmic-qt/translations/pl.ts --- gmic-2.4.5/gmic-qt/translations/pl.ts 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/translations/pl.ts 2020-09-03 11:37:05.000000000 +0000 @@ -7,7 +7,7 @@ ColorParameter - + Select color Wybór koloru @@ -20,173 +20,193 @@ Okno dialogowe - + Internet updates Aktualizacje z Internetu - + Update now Uaktualnij teraz - + Layout Układ - + + Interface + + + + Preview on the &left Podgląd &po lewej stronie - + Pre&view on right side Podgląd &po prawej stronie - + Theme Wygląd - + &Default &Domyślnie - + Dar&k &Ciemny - + <i>(Restart needed)</I> <i>(Wymaga zrestartowania)</i> - + Language - - + + Always enable preview zooming + + + + + <html><head/><body><p><span style=" font-style:italic;">(Warning: preview may be inaccurate<br/>if checked.)</span></p></body></html> + + + + + Other + + + + + Output messages Komunikat wyjścia - + Dialogs Okna dialogowe - + Use native color dialog Użyć kolorów systemowych - + Preview Podgląd - + Timeout (seconds) - + Show institution logos - + + Notify when scheduled update fails + + + + &Ok &Ok - + Settings Ustawienia - + Never Nigdy - + Daily Codziennie - + Weekly Cotygodniowo - + Every 2 weeks Co 2 tygodnie - + Monthly Miesięcznie - + At launch (debug) Przy starcie (debugowanie) - - Output messages... - Komunikat wyjścia... - - - + Quiet (default) Brak (domyślnie) - + Verbose (layer name) Ogólny (z nazwą warstwy) - + Verbose (console) Ogólny (konsola) - + Verbose (log file) Ogólny (plik log) - + Very verbose (console) Dokładny (konsola) - + Very verbose (log file) Dokładny (plik log) - + Debug (console) Debugowanie (konsola) - + Debug (log file) Debugowanie (plik log) - + Check to use Native/OS color dialog, uncheck to use Qt's Zaznacz aby używać natywny/systemowy zestaw kolorów, wyłącz dla QT @@ -194,9 +214,9 @@ FileParameter - - - + + + Select a file Wybierz plik @@ -204,18 +224,18 @@ FilterParametersWidget - - + + <i>Select a filter</i> <i>Wybierz filtr</i> - + <i>No parameters</i> <i>Brak parametrów</i> - + Error parsing filter parameters @@ -223,6 +243,15 @@ + FiltersPresenter + + + Cannot find this fave's original filter + + + + + FiltersView @@ -236,7 +265,7 @@ - + Remove fave Usuń z ulubionych @@ -251,7 +280,7 @@ Dodaj do ulubionych - + Do you really want to remove the following fave? %1 @@ -262,7 +291,7 @@ FolderParameter - + Select a folder Wybierz katalog @@ -293,135 +322,115 @@ - - + + Input layers Wartstwy wejściowe - + None Brak - + Active (default) Aktywna (domyślnie) - + All Wszystkie - + Active and below Aktywna i poniżej - + Active and above Aktywna i powyżej - + All visible Wszystkie widoczne - + All invisible Wszystkie niewidoczne - - All visible (decr.) - Wszystkie widoczne (kolejność malejąca) - - - - All invisible (decr.) - Wszystkie niewidoczne (kolejność malejąca) - - - - All (decr.) - Wszystkie (kolejność malejąca) - - - - + + Output mode Tryb wyjścia - + In place (default) Na miejscu (domyślnie) - + New layer(s) Nowa(e) warstwa(y) - + New active layer(s) Nowa(e) aktywna(e) warstwa(y) - + New image Nowy obraz - - Output messages - Komunikat wyjścia - - - - + + Preview mode Tryb podglądu - + 1st output (default) 1 wyjście (domyślnie) - + 2nd output 2 wyjście - + 3rd output 3 wyjście - + 4th output 4 wyjście - + 1st -> 2nd output od 1 do 2 wyjść - + 1st -> 3rd output od 1 do 3 wyjść - + 1st -> 4th output od 1 do 4 wyjść - + All outputs Wszystkie wyjścia @@ -452,179 +461,164 @@ GMIC - + <html><head/><body><p>Download filter definitions from remote sources</p></body></html> <html><head/><body><p>Uaktualnienie filtrów przez internet</p></body></html> - + Internet Internet - + Selection mode - + TextLabel - + ... - - <html><head/><body><p>Enable/disable preview<br/>(right click on preview image for instant swaping)</p></body></html> - <html><head/><body><p>Włącz/wyłącz podgląd<br/>(prawym przyciskiem na podgląd dla szybkiej zmiany)</p></body></html> + + <html><head/><body><p>Enable/disable preview<br/>(Ctrl+P)<br/>(right click on preview image for instant swapping)</p></body></html> + - + Preview Podgląd - + Settings... Okna dialogowe... - + &Cancel &Anuluj - + &Fullscreen &Pełny ekran - + &Apply &Zastosuj - + &OK &Ok - - Zoom in - - - - - Zoom out - - - - - Reset zoom - - - - - Warning: Preview may be inaccurate (zoom factor has been modified) - - - - + Add fave Dodaj do ulubionych - + Reset parameters to default values - + Update filters (Ctrl+R / F5) Uaktualnienie filtrów - + Rename fave Zmiana nazwy ulubionego - + Remove fave Usuń z ulubionych - + Expand/Collapse all Rozwiń/zwiń wszystko - - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Normandy University (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Uniwerstytet Normandii (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) + + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandy University (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Uniwerstytet Normandii (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) - + Update completed Aktualizacja ukończona - - - + + + Filter definitions have been updated. Filtry zaktualizowane. - + No download was needed. - + + Filters update could not be achieved + + + + The update could not be achieved<br>because of the following errors:<br> Aktualizacja nie powiodła się<br/>z następujących powodów:<br/> - + Update error Błąd aktualizacji - + Error Wystąpił błąd - + Waiting for cancelled jobs... - + Import faves Importuj ulubione - + Do you want to import faves from file below?<br/>%1 Czy chcesz importować ulubione z pliku poniżej?<br/>%1 - + Don't ask again Nie pytaj ponownie - + Confirmation Potwierdż - + A gmic command is running.<br>Do you really want to close the plugin? Polecenie gmic jest uruchomione.<br>Czy naprawdę chcesz zamknąć wtyczkę? @@ -656,7 +650,7 @@ - + Abort Anuluj @@ -666,23 +660,23 @@ TextLabel - + G'MIC-Qt Plug-in progression - + Updating filters... - - + + [Processing %1 | %2] [Przetwarzanie %1 | %2] - + [Processing %1] [Przetwarzanie %1] @@ -706,17 +700,17 @@ Anuluj - + %1 seconds %1 sekund - + [Processing %1 | %2] [Przetwarzanie %1 | %2] - + [Processing %1] [Przetwarzanie %1] @@ -724,27 +718,27 @@ QObject - + Select an image to open... Wybierz obraz... - + PNG & JPG files (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) PNG- i JPG- pliki (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) - + Error Wystąpił błąd - + Could not open file. - + Default image @@ -767,12 +761,12 @@ Ramka - + Search Wyszukiwanie - + Search in filters list (%1) Szukaj w liście filtrów (%1) @@ -780,32 +774,32 @@ Updater - + Could not read/decompress %1 Błąd odczytu/dekompresji %1 - + Error downloading %1 (empty file?) Błąd pobierania %1 (Pusty plik?) - + Error creating file %1 Błąd tworzenia pliku %1 - + Error writing file %1 Błąd zapisu pliku %1 - - Error downloading %1 - Błąd pobierania %1 + + Error downloading %1<br/>Error %2: %3 + - + Download timeout: %1 Limit czasu pobierania: %1 @@ -813,9 +807,29 @@ ZoomLevelSelector - + Form GMIC + + + Zoom in + + + + + Zoom out + + + + + Reset zoom + + + + + Warning: Preview may be inaccurate (zoom factor has been modified) + + Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/gmic-qt/translations/pt.qm and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/gmic-qt/translations/pt.qm differ diff -Nru gmic-2.4.5/gmic-qt/translations/pt.ts gmic-2.9.2/gmic-qt/translations/pt.ts --- gmic-2.4.5/gmic-qt/translations/pt.ts 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/translations/pt.ts 2020-09-03 11:37:05.000000000 +0000 @@ -7,7 +7,7 @@ ColorParameter - + Select color Escolher cor @@ -20,173 +20,193 @@ Diálogo - + Internet updates Atualições de internet - + Update now Atualizar agora - + Layout Traçado - + + Interface + + + + Preview on the &left Pré-visualização à &esquerda - + Pre&view on right side Pré-visualização à &direita - + Theme - + &Default &Valor padrão - + Dar&k &Escuro - + <i>(Restart needed)</I> <i>(Reinício necessário)</i> - + Language - - + + Always enable preview zooming + + + + + <html><head/><body><p><span style=" font-style:italic;">(Warning: preview may be inaccurate<br/>if checked.)</span></p></body></html> + + + + + Other + + + + + Output messages Mensagens de saída - + Dialogs Diálogos - + Use native color dialog Usar cor nativa nos diálogos - + Preview Previsualização - + Timeout (seconds) - + Show institution logos - + + Notify when scheduled update fails + + + + &Ok &Ok - + Settings Parâmetros - + Never Nunca - + Daily Diariamente - + Weekly Semanal - + Every 2 weeks Cada 2 semanas - + Monthly Mensal - + At launch (debug) Ao iniciar (depurar erros) - - Output messages... - Mensagens de saída... - - - + Quiet (default) Silêncioso (padrão) - + Verbose (layer name) Modo verboso (nome da camada) - + Verbose (console) Modo verboso (consola) - + Verbose (log file) Modo verboso (ficheiro de registro) - + Very verbose (console) Modo muito verboso (consola) - + Very verbose (log file) Modo muito verboso (ficheiro de registro) - + Debug (console) Depurar erros (consola) - + Debug (log file) Depurar erros (ficheiro de registro) - + Check to use Native/OS color dialog, uncheck to use Qt's Selecionar para usar o diálogo de cor nativa / SO, deselecionar para usar o do Qt @@ -194,9 +214,9 @@ FileParameter - - - + + + Select a file Selecionar um ficheiro @@ -204,18 +224,18 @@ FilterParametersWidget - - + + <i>Select a filter</i> <i>Selecionar um filtro</i> - + <i>No parameters</i> <i>Sem parâmetros</i> - + Error parsing filter parameters @@ -223,6 +243,15 @@ + FiltersPresenter + + + Cannot find this fave's original filter + + + + + FiltersView @@ -236,7 +265,7 @@ - + Remove fave Remover um favorito @@ -251,7 +280,7 @@ Acrescentando um favorito - + Do you really want to remove the following fave? %1 @@ -262,7 +291,7 @@ FolderParameter - + Select a folder Selecionar unma pasta @@ -293,135 +322,115 @@ - - + + Input layers Camadas de entrada - + None Nenhuma - + Active (default) Ativa (padrão) - + All Todas - + Active and below Ativa e abaixo - + Active and above Ativa e acima - + All visible Todas as visíveis - + All invisible Todas as invisíveis - - All visible (decr.) - Todas as visíveis (decresc.) - - - - All invisible (decr.) - Todas as invisíveis (decresc.) - - - - All (decr.) - Todas (decresc.) - - - - + + Output mode Modo de saída - + In place (default) No sitio (padrão) - + New layer(s) Nova(s) camada(s) - + New active layer(s) Nova(s) camada(s) ativa(s) - + New image Nova imagem - - Output messages - Mensagens de saída - - - - + + Preview mode Modo pre-visualização - + 1st output (default) 1a saída (padrão) - + 2nd output 2a saída - + 3rd output 3a saída - + 4th output 4a saída - + 1st -> 2nd output 1a -> 2a saídas - + 1st -> 3rd output 1a -> 3a saída - + 1st -> 4th output 1a -> 4a saída - + All outputs Todas as saídas @@ -452,179 +461,164 @@ GMIC - + <html><head/><body><p>Download filter definitions from remote sources</p></body></html> <html><head/><body><p>Descaregar as definições do filtro a partir de fontes remotas</p></body></html> - + Internet Internet - + Selection mode - + TextLabel Rótulo de texto - + ... - - <html><head/><body><p>Enable/disable preview<br/>(right click on preview image for instant swaping)</p></body></html> - <html><head/><body><p>Ativar/desativar pre-visualização<br/>(faz clic direito na imagem pre-visulizada para a troca instantânea)</p></body></html> + + <html><head/><body><p>Enable/disable preview<br/>(Ctrl+P)<br/>(right click on preview image for instant swapping)</p></body></html> + - + Preview Previsualização - + Settings... Configuração... - + &Cancel &Cancelar - + &Fullscreen &Tela cheia - + &Apply &Aplicar - + &OK &Ok - - Zoom in - - - - - Zoom out - - - - - Reset zoom - - - - - Warning: Preview may be inaccurate (zoom factor has been modified) - - - - + Add fave Acrescentando um favorito - + Reset parameters to default values - + Update filters (Ctrl+R / F5) Atualizar filtros - + Rename fave Renomear um favorito - + Remove fave Remover um favorito - + Expand/Collapse all Expandir/Encolher todos - - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Normandy University (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Universidad da Normandia (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) + + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandy University (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Universidad da Normandia (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) - + Update completed Atualização concluída - - - + + + Filter definitions have been updated. As definições dos filtros foram atualizados. - + No download was needed. - + + Filters update could not be achieved + + + + The update could not be achieved<br>because of the following errors:<br> A actualização não foi possível<br>devido aos seguintes erros:<br/> - + Update error Erro na actualização - + Error Erro - + Waiting for cancelled jobs... - + Import faves Importar favoritos - + Do you want to import faves from file below?<br/>%1 Deseja importar favoritos do arquivo abaixo?<br/>%1 - + Don't ask again No volvar a perguntar - + Confirmation Confirmar - + A gmic command is running.<br>Do you really want to close the plugin? Um comando do gmic está sendo executado.'exécution.<br>Desejas realmente fechar o plug-in? @@ -656,7 +650,7 @@ - + Abort Abortar @@ -666,23 +660,23 @@ Rótulo de texto - + G'MIC-Qt Plug-in progression - + Updating filters... - - + + [Processing %1 | %2] [Em processamento %1 | %2] - + [Processing %1] [Em processamento %1] @@ -706,17 +700,17 @@ Cancelar - + %1 seconds %1 segundos - + [Processing %1 | %2] [Em processamento %1 | %2] - + [Processing %1] [Em processamento %1] @@ -724,27 +718,27 @@ QObject - + Select an image to open... Selecionar imagem à abrir... - + PNG & JPG files (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) Ficheiros PNG & JPG (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) - + Error Erro - + Could not open file. - + Default image @@ -767,12 +761,12 @@ Moldura - + Search Procurar - + Search in filters list (%1) Procurar na lista de filtros (%1) @@ -780,32 +774,32 @@ Updater - + Could not read/decompress %1 Impossível ler / descomprimir %1 - + Error downloading %1 (empty file?) Erro ao descarregar %1 (ficheiro vazio?) - + Error creating file %1 Erro na criação do ficheiro %1 - + Error writing file %1 Erro ao gravar o ficheiro %1 - - Error downloading %1 - Erro na descarga %1 + + Error downloading %1<br/>Error %2: %3 + - + Download timeout: %1 Descarga anulada (tempo limite) : %1 @@ -813,9 +807,29 @@ ZoomLevelSelector - + Form GMIC + + + Zoom in + + + + + Zoom out + + + + + Reset zoom + + + + + Warning: Preview may be inaccurate (zoom factor has been modified) + + Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/gmic-qt/translations/ru.qm and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/gmic-qt/translations/ru.qm differ diff -Nru gmic-2.4.5/gmic-qt/translations/ru.ts gmic-2.9.2/gmic-qt/translations/ru.ts --- gmic-2.4.5/gmic-qt/translations/ru.ts 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/translations/ru.ts 2020-09-03 11:37:05.000000000 +0000 @@ -7,7 +7,7 @@ ColorParameter - + Select color Выбрать цвет @@ -20,173 +20,193 @@ Диалоговое окно - + Internet updates Обновления из Интернета - + Update now Обновить сейчас - + Layout Расположение элементов - + + Interface + + + + Preview on the &left Предпросмотр &слева - + Pre&view on right side Предпросмотр &справа - + Theme Тема - + &Default &По умолчанию - + Dar&k &Тёмная - + <i>(Restart needed)</I> <i>(Требуется перезапуск)</i> - + Language - - + + Always enable preview zooming + + + + + <html><head/><body><p><span style=" font-style:italic;">(Warning: preview may be inaccurate<br/>if checked.)</span></p></body></html> + + + + + Other + + + + + Output messages Сообщения о выводе - + Dialogs Диалоговые окна - + Use native color dialog Использовать родной цвет - + Preview Предпросмотр - + Timeout (seconds) - + Show institution logos - + + Notify when scheduled update fails + + + + &Ok &Ok - + Settings Настройки - + Never Никогда - + Daily Ежедневно - + Weekly Еженедельно - + Every 2 weeks Каждые 2 недели - + Monthly Ежемесячно - + At launch (debug) При запуске (debug) - - Output messages... - Сообщения о выводе... - - - + Quiet (default) Тихий (по умолчанию) - + Verbose (layer name) Подробный (с названием слоя) - + Verbose (console) Подробный (консоль) - + Verbose (log file) Подробный (файл журнала) - + Very verbose (console) Очень подробный (консоль) - + Very verbose (log file) Очень подробный (файл журнала) - + Debug (console) Отладка (консоль) - + Debug (log file) Отладка (файл журнала) - + Check to use Native/OS color dialog, uncheck to use Qt's Вкл. для родных/ОС настроек цвета диалогового окна, Выкл. для QT @@ -194,9 +214,9 @@ FileParameter - - - + + + Select a file Выбрать файл @@ -204,18 +224,18 @@ FilterParametersWidget - - + + <i>Select a filter</i> <i>Выбрать фильтр</i> - + <i>No parameters</i> <i>Параметры отсутствуют</i> - + Error parsing filter parameters @@ -223,6 +243,15 @@ + FiltersPresenter + + + Cannot find this fave's original filter + + + + + FiltersView @@ -236,7 +265,7 @@ - + Remove fave Удалить из избранного @@ -251,7 +280,7 @@ Добавить в избранное - + Do you really want to remove the following fave? %1 @@ -262,7 +291,7 @@ FolderParameter - + Select a folder Выбрать папку @@ -293,135 +322,115 @@ - - + + Input layers Вводные слои - + None Нет - + Active (default) Активный (по умолчанию) - + All Все - + Active and below Активный и ниже - + Active and above Активный и выше - + All visible Все видимые - + All invisible Все невидимые - - All visible (decr.) - Все видимые (по убыванию) - - - - All invisible (decr.) - Все невидимые (по убыванию) - - - - All (decr.) - Все (по убыванию) - - - - + + Output mode Режим вывода - + In place (default) Там же (по умолчанию) - + New layer(s) Новый слой(слои) - + New active layer(s) Новый активный слой(слои) - + New image Новое изображение - - Output messages - Сообщения о выводе - - - - + + Preview mode Режим предпросмотра - + 1st output (default) 1й вывод (по умолчанию) - + 2nd output 2й вывод - + 3rd output 3й вывод - + 4th output 4й вывод - + 1st -> 2nd output с 1 до 2 вывод - + 1st -> 3rd output с 1 до 3 вывод - + 1st -> 4th output с 1 по 4 вывод - + All outputs Все выводы @@ -452,179 +461,164 @@ GMIC - + <html><head/><body><p>Download filter definitions from remote sources</p></body></html> <html><head/><body><p>Скачать определения фильтров с отдалённого ресурса</p></body></html> - + Internet Internet - + Selection mode - + TextLabel - + ... - - <html><head/><body><p>Enable/disable preview<br/>(right click on preview image for instant swaping)</p></body></html> - <html><head/><body><p>Включить/выключить предпросмотр<br/>(правая клавиша на предпросмотр для быстрой смены)</p></body></html> + + <html><head/><body><p>Enable/disable preview<br/>(Ctrl+P)<br/>(right click on preview image for instant swapping)</p></body></html> + - + Preview Предпросмотр - + Settings... Настройки... - + &Cancel &Отмена - + &Fullscreen &Полный экран - + &Apply &Применить - + &OK &Ok - - Zoom in - - - - - Zoom out - - - - - Reset zoom - - - - - Warning: Preview may be inaccurate (zoom factor has been modified) - - - - + Add fave Добавить в избранное - + Reset parameters to default values - + Update filters (Ctrl+R / F5) Обновить фильтры - + Rename fave Переименовать избранный - + Remove fave Удалить из избранного - + Expand/Collapse all Свернуть/развернуть всё - - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Normandy University (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Университет Нормандии (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) + + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandy University (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Университет Нормандии (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) - + Update completed Обновление завершено - - - + + + Filter definitions have been updated. Определения фильтров обновлены. - + No download was needed. - + + Filters update could not be achieved + + + + The update could not be achieved<br>because of the following errors:<br> Не удалось обновить<br/>по следующим причинам:<br/> - + Update error Ошибка обновления - + Error Ошибка - + Waiting for cancelled jobs... - + Import faves Импорт избранного - + Do you want to import faves from file below?<br/>%1 Вы хотите импортировать избранные из следующего файла?<br/>%1 - + Don't ask again Больше не спрашивать - + Confirmation Подтвердить - + A gmic command is running.<br>Do you really want to close the plugin? Обрабатывается команда gmic.<br>Вы действительно хотите закрыть плагин? @@ -656,7 +650,7 @@ - + Abort Отмена @@ -666,23 +660,23 @@ TextLabel - + G'MIC-Qt Plug-in progression - + Updating filters... - - + + [Processing %1 | %2] [Обработано %1 | %2] - + [Processing %1] [Обработано %1] @@ -706,17 +700,17 @@ Отмена - + %1 seconds %1 секунд - + [Processing %1 | %2] [Обработано %1 | %2] - + [Processing %1] [Обработано %1] @@ -724,27 +718,27 @@ QObject - + Select an image to open... Выберите изображение... - + PNG & JPG files (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) PNG- и JPG- файлы (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) - + Error Ошибка - + Could not open file. - + Default image @@ -767,12 +761,12 @@ Frame - + Search Поиск - + Search in filters list (%1) Ищу в списке фильтиров (%1) @@ -780,32 +774,32 @@ Updater - + Could not read/decompress %1 Ошибка чтения/распаковки %1 - + Error downloading %1 (empty file?) Ошибка скачивания %1 (Пустой файл?) - + Error creating file %1 Ошибка создания файла %1 - + Error writing file %1 Ошибка записи файла %1 - - Error downloading %1 - Ошибка скачивания %1 + + Error downloading %1<br/>Error %2: %3 + - + Download timeout: %1 Тайм-аут загрузки: %1 @@ -813,9 +807,29 @@ ZoomLevelSelector - + Form GMIC + + + Zoom in + + + + + Zoom out + + + + + Reset zoom + + + + + Warning: Preview may be inaccurate (zoom factor has been modified) + + Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/gmic-qt/translations/sv.qm and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/gmic-qt/translations/sv.qm differ diff -Nru gmic-2.4.5/gmic-qt/translations/sv.ts gmic-2.9.2/gmic-qt/translations/sv.ts --- gmic-2.4.5/gmic-qt/translations/sv.ts 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/gmic-qt/translations/sv.ts 2020-09-03 11:37:05.000000000 +0000 @@ -0,0 +1,837 @@ + + + + + + + + ColorParameter + + + Select color + Välj färg + + + + DialogSettings + + + Dialog + parametrar + + + + Preview on the &left + + + + + Pre&view on right side + + + + + &Default + + + + + Dar&k + + + + + <html><head/><body><p><span style=" font-style:italic;">(Warning: preview may be inaccurate<br/>if checked.)</span></p></body></html> + + + + + Internet updates + Internetuppdateringar + + + + Update now + Uppdatera nu + + + + Layout + Layout + + + + Interface + Gränssnitt + + + + Theme + Tema + + + + <i>(Restart needed)</I> + <i>(Omstart behövs)</I> + + + + Language + Språk + + + + Always enable preview zooming + Aktivera alltid förhandsgranskning + + + + Other + Övrig + + + + + Output messages + Utdata meddelande + + + + Dialogs + Dialog + + + + Use native color dialog + Använd inbyggd färgdialog + + + + Preview + Förhandsvisning + + + + Timeout (seconds) + Timeout (sekunder) + + + + Show institution logos + Visa institutionens logotyper + + + + Notify when scheduled update fails + Meddela när den schemalagda uppdateringen misslyckas + + + + &Ok + &Ok + + + + Settings + Inställningar + + + + Never + Aldrig + + + + Daily + ​Dagligen + + + + Weekly + Varje vecka + + + + Every 2 weeks + Varannan vecka + + + + Monthly + Månadsvis + + + + At launch (debug) + Vid start (felsök) + + + + Quiet (default) + Tyst (standard) + + + + Verbose (layer name) + Verbose (lagernamn) + + + + Verbose (console) + Verbosa (konsol) + + + + Verbose (log file) + Verbose (loggfil) + + + + Very verbose (console) + Väldigt verbose (konsol) + + + + Very verbose (log file) + Väldigt verbose (loggfil) + + + + Debug (console) + Felsök (konsol) + + + + Debug (log file) + Felsök (loggfil) + + + + Check to use Native/OS color dialog, uncheck to use Qt's + Markera för att använda Native / OS-färgdialogen, avmarkera för att använda Qt + + + + FileParameter + + + + + Select a file + Välj en fil + + + + FilterParametersWidget + + + + <i>Select a filter</i> + <i>Välj ett filter</i> + + + + <i>No parameters</i> + <i>Inga parametrar</i> + + + + Error parsing filter parameters + + + + + + + FiltersPresenter + + + Cannot find this fave's original filter + + + + + + FiltersView + + + Form + Form + + + + Rename fave + Byt namn på fave + + + + + Remove fave + Ta bort fave + + + + Clone fave + Klona fave + + + + Add fave + Lägg till fave + + + + Do you really want to remove the following fave? + +%1 + + Vill du verkligen ta bort följande fave? + +%1 + + + + FolderParameter + + + Select a folder + Välj en mapp + + + + HeadlessProgressDialog + + + Dialog + Dialog + + + + Cancel + Avbryt + + + + InOutPanel + + + Input / Output + Indata / Utdata + + + + ... + ... + + + + + Input layers + Mata in lager + + + + None + Ingen + + + + Active (default) + Aktiv (standard) + + + + All + Allt + + + + Active and below + Aktiv och nedan + + + + Active and above + Aktiv och ovan + + + + All visible + Alla synliga + + + + All invisible + Alla osynliga + + + + + Output mode + Utdata-läge + + + + In place (default) + På plats (standard) + + + + New layer(s) + Nya lager + + + + New active layer(s) + Ny aktivt lager + + + + New image + New image + + + + + Preview mode + Förhandsgranskningsläge + + + + 1st output (default) + 1:a utdata (standard) + + + + 2nd output + 2:a utdata + + + + 3rd output + 2:e utdata + + + + 4th output + 4:e utdata + + + + 1st -> 2nd output + 1:a一 -> 2:a utdata + + + + 1st -> 3rd output + 1:a一 -> 3:e utdata + + + + 1st -> 4th output + 1:a一 -> 4:e utdata + + + + All outputs + All utdata + + + + LanguageSelectionWidget + + + Form + Form + + + + <i>(Restart needed)</i> + <i>(Omstart behövs)</I> + + + + System default (%1) + Systemstandard + + + + MainWindow + + + Form + Form + + + + <html><head/><body><p>Download filter definitions from remote sources</p></body></html> + <html><head/><body><p>Ladda ner filterdefinitioner från fjärrkällor</p></body></html> + + + + Internet + Internet + + + + ... + ... + + + + <html><head/><body><p>Enable/disable preview<br/>(Ctrl+P)<br/>(right click on preview image for instant swapping)</p></body></html> + ><html><head/><body><p>Enable/disable preview<br/>(Ctrl+P)<br/>(högerklicka på förhandsgranskningsbild för omedelbar byte)</p></body></html> + + + + Preview + Preview + + + + Settings... + inställningar... + + + + TextLabel + Textetikett + + + + &Cancel + &Avbryt + + + + &Fullscreen + &Fullskärm + + + + &Apply + &Tillämpa + + + + &OK + &OK + + + + Add fave + Lägg till fave + + + + Reset parameters to default values + Återställ parametrarna till standardvärden + + + + Update filters (Ctrl+R / F5) + Uppdatera filter (Ctrl+R / F5) + + + + Rename fave + Byt namn på fave + + + + Remove fave + Ta bort fave + + + + Expand/Collapse all + Expandera/Dölj alla + + + + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandy University (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandy University (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) + + + + Selection mode + Valläge + + + + Update completed + Uppdateringen slutförd + + + + + + Filter definitions have been updated. + Filterdefinitioner har uppdaterats. + + + + No download was needed. + Inga nerladdningar behövs. + + + + Filters update could not be achieved + Filteruppdatering kunde inte utföras + + + + The update could not be achieved<br>because of the following errors:<br> + Uppdateringen kunde inte uppnås<br/>på grund av följande fel:<br/> + + + + Update error + Uppdateringsfel + + + + Error + Fel + + + + Waiting for cancelled jobs... + Väntar på avbrutet arbete... + + + + Import faves + Importera faves + + + + Do you want to import faves from file below?<br/>%1 + Vill du importera faves från filen nedan?<br/>%1 + + + + Don't ask again + Fråga inte igen + + + + Confirmation + Bekräfta + + + + A gmic command is running.<br>Do you really want to close the plugin? + Ett g'mic-kommando körs.<br>Vill du verkligen stänga plugin-programmet? + + + + MultilineTextParameterWidget + + + Form + Form + + + + Update + Updatera + + + + Ctrl+Return + Ctrl+Enter + + + + ProgressInfoWidget + + + Form + Form + + + + + Abort + Avbryt + + + + TextLabel + Textetikett + + + + G'MIC-Qt Plug-in progression + G'MIC-Qt Plug-in progression + + + + Updating filters... + Uppdaterar filter ... + + + + + [Processing %1 | %2] + [Bearbetar %1 | %2] + + + + [Processing %1] + [Bearbetar %1] + + + + ProgressInfoWindow + + + MainWindow + Huvudfönster + + + + + TextLabel + Textetikett + + + + Cancel + Avbryt + + + + %1 seconds + %1 sekunder + + + + [Processing %1 | %2] + [Bearbetar %1 | %2] + + + + [Processing %1] + [Bearbetar %1] + + + + QObject + + + Visible + Synlig + + + + Available filters (%1) + Tillgängliga filter (%1) + + + + Select an image to open... + Välj en bild som ska öppnas... + + + + PNG & JPG files (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) + PNG & JPG filer (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) + + + + Error + Fel + + + + Could not open file. + Kunde inte öppna filen. + + + + Default image + Standardbild + + + + SearchFieldWidget + + + Frame + Frame + + + + Search + Sök + + + + Search in filters list (%1) + Sök i filterlistan (%1) + + + + Updater + + + Error downloading %1 (empty file?) + Fel vid nedladdning av %1 (tom fil?) + + + + Could not read/decompress %1 + Kunde inte läsa/dekomprimera %1 + + + + Error creating file %1 + Fel vid skapande av fil %1 + + + + Error writing file %1 + Fel vid skrivning av fil %1 + + + + Error downloading %1<br/>Error %2: %3 + Fel vid nedladdning %1<br/>Fel %2: %3 + + + + Download timeout: %1 + Ladda ner timeout: %1 + + + + ZoomLevelSelector + + + Form + Form + + + + Zoom in + Zooma in + + + + Zoom out + Zoom ut + + + + Reset zoom + Återställ zoomning + + + + Warning: Preview may be inaccurate (zoom factor has been modified) + Varning: Förhandsgranskningen kan vara felaktig (zoomfaktorn har ändrats) + + + Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/gmic-qt/translations/ua.qm and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/gmic-qt/translations/ua.qm differ diff -Nru gmic-2.4.5/gmic-qt/translations/ua.ts gmic-2.9.2/gmic-qt/translations/ua.ts --- gmic-2.4.5/gmic-qt/translations/ua.ts 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/translations/ua.ts 2020-09-03 11:37:05.000000000 +0000 @@ -7,7 +7,7 @@ ColorParameter - + Select color Обрати колір @@ -20,173 +20,193 @@ Діалогове вікно - + Internet updates Оновлення через інтернет - + Update now Оновити - + Layout Розміщення - + + Interface + + + + Preview on the &left Попередній перегляд &зліва - + Pre&view on right side Попередній перегляд &справа - + Theme Тема - + &Default &Стандартний - + Dar&k &Темна тема - + <i>(Restart needed)</I> <i>(Необхідне перезавантаження.)</I> - + Language - - + + Always enable preview zooming + + + + + <html><head/><body><p><span style=" font-style:italic;">(Warning: preview may be inaccurate<br/>if checked.)</span></p></body></html> + + + + + Other + + + + + Output messages Повідомлення - + Dialogs Діалогові вікна - + Use native color dialog Використовувати власні кольори діалогових вікон - + Preview Попередній перегляд - + Timeout (seconds) - + Show institution logos - + + Notify when scheduled update fails + + + + &Ok &Ok - + Settings Настройки - + Never Ніколи - + Daily Щодня - + Weekly Щотижня - + Every 2 weeks Кожні 2 тижні - + Monthly Щомісяця - + At launch (debug) При запуску (налагодження) - - Output messages... - Повідомлення... - - - + Quiet (default) Не виводити повідомлення (стандартний) - + Verbose (layer name) Докладний режим (ім'я шару) - + Verbose (console) Докладний режим (консоль) - + Verbose (log file) Докладний режим (лог) - + Very verbose (console) Дуже докладний режим (консоль) - + Very verbose (log file) Дуже докладний режим (лог) - + Debug (console) Налагодження (консоль) - + Debug (log file) Налагодження (лог) - + Check to use Native/OS color dialog, uncheck to use Qt's Поставте прапорець, щоб використовувати кольори діалогових вікон Native/OS, або зніміть прапорець, щоб використовувати кольори Qt @@ -194,9 +214,9 @@ FileParameter - - - + + + Select a file Виберіть файл @@ -204,18 +224,18 @@ FilterParametersWidget - - + + <i>Select a filter</i> <i>Виберіть фільтр</i> - + <i>No parameters</i> <i>Немає параметрів</i> - + Error parsing filter parameters @@ -223,6 +243,15 @@ + FiltersPresenter + + + Cannot find this fave's original filter + + + + + FiltersView @@ -236,7 +265,7 @@ - + Remove fave Перейменувати уподобання @@ -251,7 +280,7 @@ Додати до вподобань - + Do you really want to remove the following fave? %1 @@ -262,7 +291,7 @@ FolderParameter - + Select a folder Виберіть папку @@ -293,135 +322,115 @@ - - + + Input layers Вхідні шари - + None Немає - + Active (default) Активний (стандартний) - + All Все - + Active and below Активний і нижче - + Active and above Активний і вище - + All visible Всі видимі шари - + All invisible Всі невидимі шари - - All visible (decr.) - Всі видимі шари (зменш.) - - - - All invisible (decr.) - Всі видимі шари (зменш.) - - - - All (decr.) - Всі(зменш.) - - - - + + Output mode Режим виводу - + In place (default) Замість (стандартний) - + New layer(s) Новий(і)) шар(и) - + New active layer(s) Новий(і) активний(і) шар(и) - + New image Нове зображення - - Output messages - Повідомлення - - - - + + Preview mode Режим попереднього перегляду - + 1st output (default) 1-й результат (стандартний) - + 2nd output 2-й результат - + 3rd output 3-й результат - + 4th output 4-й результат - + 1st -> 2nd output 1-й -> 2-й результат - + 1st -> 3rd output 1-й -> 3-й результат - + 1st -> 4th output 1-й -> 4-й результат - + All outputs Усі результати @@ -452,179 +461,164 @@ Форма - + <html><head/><body><p>Download filter definitions from remote sources</p></body></html> <html><head/><body><p>Завантажити оновлення бази визначень фільтрів</p></body></html> - + Internet Інтернет - + Selection mode - + TextLabel Текстовий Підпис - + ... - - <html><head/><body><p>Enable/disable preview<br/>(right click on preview image for instant swaping)</p></body></html> - <html><head/><body><p>Увімкнути/вимкнути попередній перегляд<br/>(клацніть правою кнопкою на попередньому перегляді зображення щоб миттєво переключитись)</p></body></html> + + <html><head/><body><p>Enable/disable preview<br/>(Ctrl+P)<br/>(right click on preview image for instant swapping)</p></body></html> + - + Preview Попередній перегляд - + Settings... Настройки... - + &Cancel &Скасувати - + &Fullscreen &Повноекранний режим - + &Apply &Застосовувати - + &OK &Ok - - Zoom in - - - - - Zoom out - - - - - Reset zoom - - - - - Warning: Preview may be inaccurate (zoom factor has been modified) - - - - + Add fave Додати до вподобань - + Reset parameters to default values - + Update filters (Ctrl+R / F5) Оновити фільтри - + Rename fave Перейменувати уподобання - + Remove fave Перейменувати уподобання - + Expand/Collapse all Розгорнути / згорнути - - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Normandy University (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Normandie Université (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) + + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandy University (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandie Université (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) - + Update completed Оновлення завершено - - - + + + Filter definitions have been updated. Визначення фільтрiв були оновлені. - + No download was needed. - + + Filters update could not be achieved + + + + The update could not be achieved<br>because of the following errors:<br> Оновлення не може бути завершене<br>бо сталися наступні помилки:<br> - + Update error Помилка оновлення - + Error Помилка - + Waiting for cancelled jobs... - + Import faves Імпорт вподобань - + Do you want to import faves from file below?<br/>%1 Бажаєте імпортувати вподобання з наступного файлу нижче?<br/>%1 - + Don't ask again Не запитувати знов - + Confirmation Підтвердження - + A gmic command is running.<br>Do you really want to close the plugin? Команда gmic виконується.<br>Ви дійсно бажаєте закрити програму? @@ -656,7 +650,7 @@ - + Abort Перервати @@ -666,23 +660,23 @@ ТекстовийПідпис - + G'MIC-Qt Plug-in progression - + Updating filters... - - + + [Processing %1 | %2] [Обробка %1 | %2] - + [Processing %1] [Обробка %1] @@ -706,17 +700,17 @@ Скасувати - + %1 seconds %1 секунд - + [Processing %1 | %2] [Обробка %1 | %2] - + [Processing %1] [Обробка %1] @@ -724,27 +718,27 @@ QObject - + Select an image to open... Вибрати зображення... - + PNG & JPG files (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) PNG & JPG файли (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) - + Error Помилка - + Could not open file. - + Default image @@ -767,12 +761,12 @@ Рамка - + Search Пошук - + Search in filters list (%1) Пошук у списку фільтрів (%1) @@ -780,32 +774,32 @@ Updater - + Could not read/decompress %1 Неможливо прочитати/розпакувати %1 - + Error downloading %1 (empty file?) Помилка під час завантаження файлу %1 (пустий файл ?) - + Error creating file %1 Помилка під час створення файлу %1 - + Error writing file %1 Помилка під час записування файлу %1 - - Error downloading %1 - >Помилка під час завантаження файлу %1 + + Error downloading %1<br/>Error %2: %3 + - + Download timeout: %1 Інтервал завантаження: %1 @@ -813,9 +807,29 @@ ZoomLevelSelector - + Form Форма + + + Zoom in + + + + + Zoom out + + + + + Reset zoom + + + + + Warning: Preview may be inaccurate (zoom factor has been modified) + + Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/gmic-qt/translations/zh.qm and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/gmic-qt/translations/zh.qm differ diff -Nru gmic-2.4.5/gmic-qt/translations/zh.ts gmic-2.9.2/gmic-qt/translations/zh.ts --- gmic-2.4.5/gmic-qt/translations/zh.ts 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/translations/zh.ts 2020-09-03 11:37:05.000000000 +0000 @@ -7,7 +7,7 @@ ColorParameter - + Select color 选择颜色 @@ -20,173 +20,193 @@ 对话框 - + Internet updates 因特网更新 - + Update now 立即更新 - + Layout 布局 - + + Interface + + + + Preview on the &left 在左边预览(&L) - + Pre&view on right side 在右边预览(&V) - + Theme 主题 - + &Default 默认(&D) - + Dar&k 暗色(&K) - + <i>(Restart needed)</I> <i>(必须重启)</I> - + Language - - + + Always enable preview zooming + + + + + <html><head/><body><p><span style=" font-style:italic;">(Warning: preview may be inaccurate<br/>if checked.)</span></p></body></html> + + + + + Other + + + + + Output messages 输出信息 - + Dialogs 对话框 - + Use native color dialog 使用原生颜色对话框 - + Preview 预览 - + Timeout (seconds) - + Show institution logos - + + Notify when scheduled update fails + + + + &Ok 确定(&O) - + Settings 设置 - + Never 从不 - + Daily 每日 - + Weekly 每周 - + Every 2 weeks 每隔两周 - + Monthly 每月 - + At launch (debug) 启动时 (调试) - - Output messages... - 输出信息... - - - + Quiet (default) 静默 (默认) - + Verbose (layer name) 冗长 (层名) - + Verbose (console) 冗长 (控制台) - + Verbose (log file) 冗长 (日志文件) - + Very verbose (console) 很冗长 (控制台) - + Very verbose (log file) 很冗长 (日志文件) - + Debug (console) 调试 (控制台) - + Debug (log file) 调试 (日志文件) - + Check to use Native/OS color dialog, uncheck to use Qt's 选择以便使用原生/系统颜色对话框,取消选择以便使用 Qt @@ -194,9 +214,9 @@ FileParameter - - - + + + Select a file 选择一个文件 @@ -204,18 +224,18 @@ FilterParametersWidget - - + + <i>Select a filter</i> <i>选择一个滤镜</i> - + <i>No parameters</i> <i>无参数</i> - + Error parsing filter parameters @@ -223,6 +243,15 @@ + FiltersPresenter + + + Cannot find this fave's original filter + + + + + FiltersView @@ -236,7 +265,7 @@ - + Remove fave 移除收藏 @@ -251,7 +280,7 @@ 添加收藏 - + Do you really want to remove the following fave? %1 @@ -262,7 +291,7 @@ FolderParameter - + Select a folder 选择一个文件夹 @@ -293,135 +322,115 @@ - - + + Input layers 输入层 - + None - + Active (default) 活动 (默认) - + All 全部 - + Active and below 活动及其下面 - + Active and above 活动及其上面 - + All visible 全部可见 - + All invisible 全部不可见 - - All visible (decr.) - 全部可见 (decr.) - - - - All invisible (decr.) - 全部不可见 (decr.) - - - - All (decr.) - 全部 (decr.) - - - - + + Output mode 输出模式 - + In place (default) 就地 (默认) - + New layer(s) 新建层 - + New active layer(s) 新建活动层 - + New image 新建图像 - - Output messages - 输出信息 - - - - + + Preview mode 预览模式 - + 1st output (default) 第一个输出 (默认) - + 2nd output 第二个输出 - + 3rd output 第三个输出 - + 4th output 第四个输出 - + 1st -> 2nd output 第一 -> 第二个输出 - + 1st -> 3rd output 第一 -> 第三个输出 - + 1st -> 4th output 第一 -> 第四个输出 - + All outputs 全部输出 @@ -452,179 +461,164 @@ GMIC - + <html><head/><body><p>Download filter definitions from remote sources</p></body></html> <html><head/><body><p>从远端来源下载滤镜定义</p></body></html> - + Internet 因特网 - + Selection mode - + TextLabel - + ... - - <html><head/><body><p>Enable/disable preview<br/>(right click on preview image for instant swaping)</p></body></html> - <html><head/><body><p>启用/禁用预览<br/>(在预览图上右击立即交换)</p></body></html> + + <html><head/><body><p>Enable/disable preview<br/>(Ctrl+P)<br/>(right click on preview image for instant swapping)</p></body></html> + - + Preview 预览 - + Settings... 设置... - + &Cancel 取消(&C) - + &Fullscreen 全屏(&F) - + &Apply 应用(&A) - + &OK 确定(&O) - - Zoom in - - - - - Zoom out - - - - - Reset zoom - - - - - Warning: Preview may be inaccurate (zoom factor has been modified) - - - - + Add fave 添加收藏 - + Reset parameters to default values - + Update filters (Ctrl+R / F5) 更新滤镜 - + Rename fave 重命名收藏 - + Remove fave 移除收藏 - + Expand/Collapse all 全部展开/折叠 - - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Normandy University (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>诺曼底大学 (http://www.unicaen.fr)<br/>法国国立卡昂高等工程师学院 (http://www.ensicaen.fr) + + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandy University (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>诺曼底大学 (https://www.unicaen.fr)<br/>法国国立卡昂高等工程师学院 (https://www.ensicaen.fr) - + Update completed 更新完成 - - - + + + Filter definitions have been updated. 滤镜定义已更新。 - + No download was needed. - + + Filters update could not be achieved + + + + The update could not be achieved<br>because of the following errors:<br> 这次更新由于以下错误<br/>不能完成:<br/> - + Update error 更新错误 - + Error 错误 - + Waiting for cancelled jobs... - + Import faves 导入收藏 - + Do you want to import faves from file below?<br/>%1 你要从下面文件导入收藏吗?<br/>%1 - + Don't ask again 别再问 - + Confirmation 确认 - + A gmic command is running.<br>Do you really want to close the plugin? gmic 命令正在运行。<br>你真的想要关闭插件吗? @@ -656,7 +650,7 @@ - + Abort 中止 @@ -666,23 +660,23 @@ TextLabel - + G'MIC-Qt Plug-in progression - + Updating filters... - - + + [Processing %1 | %2] [进度 %1 | %2] - + [Processing %1] [进度 %1] @@ -706,17 +700,17 @@ 取消 - + %1 seconds %1 秒 - + [Processing %1 | %2] [进度 %1 | %2] - + [Processing %1] [进度 %1] @@ -724,27 +718,27 @@ QObject - + Select an image to open... 选择一幅图片打开... - + PNG & JPG files (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) PNG & JPG 文件 (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) - + Error 错误 - + Could not open file. - + Default image @@ -767,12 +761,12 @@ Frame - + Search 搜索 - + Search in filters list (%1) 在滤镜列表中搜索 (%1) @@ -780,32 +774,32 @@ Updater - + Could not read/decompress %1 无法读取/解压缩 %1 - + Error downloading %1 (empty file?) 下载错误 %1 (空文件?) - + Error creating file %1 创建文件错误 %1 - + Error writing file %1 写入文件错误 %1 - - Error downloading %1 - 下载错误 %1 + + Error downloading %1<br/>Error %2: %3 + - + Download timeout: %1 下载超时: %1 @@ -813,9 +807,29 @@ ZoomLevelSelector - + Form GMIC + + + Zoom in + + + + + Zoom out + + + + + Reset zoom + + + + + Warning: Preview may be inaccurate (zoom factor has been modified) + + Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/gmic-qt/translations/zh_tw.qm and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/gmic-qt/translations/zh_tw.qm differ diff -Nru gmic-2.4.5/gmic-qt/translations/zh_tw.ts gmic-2.9.2/gmic-qt/translations/zh_tw.ts --- gmic-2.4.5/gmic-qt/translations/zh_tw.ts 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/translations/zh_tw.ts 2020-09-03 11:37:05.000000000 +0000 @@ -7,7 +7,7 @@ ColorParameter - + Select color 選取顏色 @@ -20,173 +20,193 @@ 對話框 - + Internet updates 網絡更新 - + Update now 立刻更新 - + Layout 佈局 - + + Interface + + + + Preview on the &left 在左邊預覽 (&L) - + Pre&view on right side 在右邊預覽 (&V) - + Theme 主題 - + &Default 預設 (&D) - + Dar&k 暗色 (&K) - + <i>(Restart needed)</I> <i>(需要重開)</I> - + Language - - + + Always enable preview zooming + + + + + <html><head/><body><p><span style=" font-style:italic;">(Warning: preview may be inaccurate<br/>if checked.)</span></p></body></html> + + + + + Other + + + + + Output messages 輸出信息 - + Dialogs 對話 - + Use native color dialog 改用原生色彩對話框 - + Preview 預覽 - + Timeout (seconds) - + Show institution logos - + + Notify when scheduled update fails + + + + &Ok 確定 (&O) - + Settings 設定 - + Never 永不 - + Daily ​每天 - + Weekly 每週 - + Every 2 weeks 每兩週 - + Monthly 每月 - + At launch (debug) 啟動時 (debug) - - Output messages... - 輸出信息... - - - + Quiet (default) 簡單 (預設) - + Verbose (layer name) 繁複 (圖層名稱) - + Verbose (console) 繁複 (控制台) - + Verbose (log file) 繁複 (log 檔案) - + Very verbose (console) 超繁複 (控制台) - + Very verbose (log file) 超繁複 (log 檔案) - + Debug (console) Debug (控制台) - + Debug (log file) Debug (log 檔案) - + Check to use Native/OS color dialog, uncheck to use Qt's 勾選以使用原生色彩對話框,不選以使用Qt @@ -194,9 +214,9 @@ FileParameter - - - + + + Select a file 選取檔案 @@ -204,18 +224,18 @@ FilterParametersWidget - - + + <i>Select a filter</i> <i>選擇濾鏡</i> - + <i>No parameters</i> <i>沒有參數</i> - + Error parsing filter parameters @@ -223,6 +243,15 @@ + FiltersPresenter + + + Cannot find this fave's original filter + + + + + FiltersView @@ -236,7 +265,7 @@ - + Remove fave 從最愛移除 @@ -251,7 +280,7 @@ 加到最愛列 - + Do you really want to remove the following fave? %1 @@ -262,7 +291,7 @@ FolderParameter - + Select a folder 選取資料夾 @@ -293,135 +322,115 @@ ... - - + + Input layers 輸入圖層 - + None - + Active (default) 啟用中 (預設) - + All 全部 - + Active and below 啟用中和以下的 - + Active and above 啟用中和以上的 - + All visible 全部可見 - + All invisible 全部隱藏 - - All visible (decr.) - 全部可見 (decr.) - - - - All invisible (decr.) - 全部隱藏 (decr.) - - - - All (decr.) - 全部 (decr.) - - - - + + Output mode 輸出模式 - + In place (default) - + New layer(s) 新增圖層 - + New active layer(s) 新增圖層 - + New image 新增圖片 - - Output messages - 輸出信息 - - - - + + Preview mode 預覽模式 - + 1st output (default) 第一輸出 (預設) - + 2nd output 第二輸出 - + 3rd output 第三輸出 - + 4th output 第四輸出 - + 1st -> 2nd output 第一 -> 第二輸出 - + 1st -> 3rd output 第一 -> 第三輸出 - + 1st -> 4th output 第一 -> 第四輸出 - + All outputs 全部輸出 @@ -452,179 +461,164 @@ GMIC - + <html><head/><body><p>Download filter definitions from remote sources</p></body></html> <html><head/><body><p>從遠端下載濾鏡定義</p></body></html> - + Internet 互聯網 - + ... ... - - <html><head/><body><p>Enable/disable preview<br/>(right click on preview image for instant swaping)</p></body></html> - <html><head/><body><p>啟用/停用預覽<br/>(在預覽圖片按右鍵以快速轉換)</p></body></html> + + <html><head/><body><p>Enable/disable preview<br/>(Ctrl+P)<br/>(right click on preview image for instant swapping)</p></body></html> + - + Preview 預覽 - + Settings... 設定... - + TextLabel TextLabel - + &Cancel 取消 (&C) - + &Fullscreen 全螢幕 (&F) - + &Apply 應用 (&A) - + &OK 確定 (&O) - - Zoom in - 放大 - - - - Zoom out - 縮小 - - - - Reset zoom - 重設縮放比例 - - - - Warning: Preview may be inaccurate (zoom factor has been modified) - 警告:預覽可能不準確 (縮放比例已修改) - - - + Add fave 加到最愛列 - + Reset parameters to default values 重設參數成預設值 - + Update filters (Ctrl+R / F5) 更新濾鏡 - + Rename fave 重新命名最愛列 - + Remove fave 從最愛移除 - + Expand/Collapse all 全部展開/折疊 - - G'MIC (http://gmic.eu)<br/>GREYC (http://www.greyc.fr)<br/>CNRS (http://www.cnrs.fr)<br/>Normandy University (http://www.unicaen.fr)<br/>Ensicaen (http://www.ensicaen.fr) + + G'MIC (https://gmic.eu)<br/>GREYC (https://www.greyc.fr)<br/>CNRS (https://www.cnrs.fr)<br/>Normandy University (https://www.unicaen.fr)<br/>Ensicaen (https://www.ensicaen.fr) - + Selection mode 選取模式 - + Update completed 更新完成 - - - + + + Filter definitions have been updated. 濾鏡定義已更新。 - + No download was needed. - + + Filters update could not be achieved + + + + The update could not be achieved<br>because of the following errors:<br> 這次更新由於以下错誤<br/>未能完成:<br/> - + Update error 更新出錯 - + Error 出錯 - + Waiting for cancelled jobs... - + Import faves 導入最愛列 - + Do you want to import faves from file below?<br/>%1 你要從以下文件導入最愛列嗎?<br/>%1 - + Don't ask again 不要再問 - + Confirmation 確認 - + A gmic command is running.<br>Do you really want to close the plugin? gmic 命令正在運行。<br>你確定要關閉插件嗎? @@ -656,7 +650,7 @@ - + Abort 中斷 @@ -666,23 +660,23 @@ TextLabel - + G'MIC-Qt Plug-in progression G'MIC-Qt 插件正在處理 - + Updating filters... - - + + [Processing %1 | %2] [處理中 %1 | %2] - + [Processing %1] [處理中 %1] @@ -706,17 +700,17 @@ 取消 - + %1 seconds %1 秒 - + [Processing %1 | %2] [處理中 %1 | %2] - + [Processing %1] [處理中 %1] @@ -734,27 +728,27 @@ 可用的濾鏡(%1) - + Select an image to open... 開啟圖片... - + PNG & JPG files (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) PNG & JPG 檔案 (*.png *.jpeg *.jpg *.PNG *.JPEG *.JPG) - + Error 出錯 - + Could not open file. - + Default image @@ -767,12 +761,12 @@ Frame - + Search 搜尋 - + Search in filters list (%1) 篩選搜尋(%1) @@ -780,32 +774,32 @@ Updater - + Error downloading %1 (empty file?) 下載出錯 %1 (空白檔案?) - + Could not read/decompress %1 不能讀取/解壓縮 %1 - + Error creating file %1 建立檔案時出錯 %1 - + Error writing file %1 寫入檔案出錯 %1 - - Error downloading %1 - 下載出錯%1 + + Error downloading %1<br/>Error %2: %3 + - + Download timeout: %1 下載超時:%1 @@ -813,9 +807,29 @@ ZoomLevelSelector - + Form GMIC + + + Zoom in + 放大 + + + + Zoom out + 縮小 + + + + Reset zoom + 重設縮放比例 + + + + Warning: Preview may be inaccurate (zoom factor has been modified) + 警告:預覽可能不準確 (縮放比例已修改) + diff -Nru gmic-2.4.5/gmic-qt/translations.qrc gmic-2.9.2/gmic-qt/translations.qrc --- gmic-2.4.5/gmic-qt/translations.qrc 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/translations.qrc 2020-09-03 11:37:05.000000000 +0000 @@ -14,5 +14,6 @@ translations/pl.qm translations/pt.qm translations/ja.qm + translations/sv.qm diff -Nru gmic-2.4.5/gmic-qt/ui/inoutpanel.ui gmic-2.9.2/gmic-qt/ui/inoutpanel.ui --- gmic-2.4.5/gmic-qt/ui/inoutpanel.ui 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/ui/inoutpanel.ui 2020-09-03 11:37:05.000000000 +0000 @@ -91,7 +91,7 @@ - + 0 @@ -114,7 +114,7 @@ - + 0 @@ -127,7 +127,7 @@ - + 0 diff -Nru gmic-2.4.5/gmic-qt/ui/mainwindow.ui gmic-2.9.2/gmic-qt/ui/mainwindow.ui --- gmic-2.4.5/gmic-qt/ui/mainwindow.ui 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/gmic-qt/ui/mainwindow.ui 2020-09-03 11:37:05.000000000 +0000 @@ -192,7 +192,7 @@ 6 - + 0 @@ -261,8 +261,8 @@ 0 0 - 179 - 472 + 180 + 470 @@ -376,7 +376,7 @@ - <html><head/><body><p>Enable/disable preview<br/>(Ctrl+P)<br/>(right click on preview image for instant swaping)</p></body></html> + <html><head/><body><p>Enable/disable preview<br/>(Ctrl+P)<br/>(right click on preview image for instant swapping)</p></body></html> Preview Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/man/gmic.1.gz and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/man/gmic.1.gz differ diff -Nru gmic-2.4.5/README gmic-2.9.2/README --- gmic-2.4.5/README 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/README 2020-09-03 11:37:05.000000000 +0000 @@ -12,16 +12,16 @@ ( https://gmic.eu ) - 2.4.5 + 2.9.2 -------------------------------------------------------------------------------- # In a nutshell #--------------- - G'MIC is a full-featured open-source framework for image processing, distributed + G'MIC is a full-featured open-source framework for digital image processing, distributed under the CeCILL free software licenses (LGPL-like and/or GPL-compatible). It - provides several user interfaces to convert / manipulate / filter / visualize + provides several user interfaces to convert / process / visualize generic image datasets, ranging from 1D scalar signals to 3D+t sequences of multi-spectral volumetric images, hence including 2D color images. @@ -37,10 +37,10 @@ much efforts (a C API is available as well). [ 3 - 'G'MIC-Qt', a plug-in to bring G'MIC capabilities to the image retouching and - painting software GIMP and Krita. More than 500 filters are already available, - sorted by category (Artistic, Black & white, Colors, Contours, Deformations, - Degradations, Details, Film emulation, Frames, Layers, Light & shadows, Patterns, - Rendering, Repair, Sequences, etc.). + painting software GIMP, Krita and Paint.NET. More than 500 filters are already + available, sorted by category (Artistic, Black & white, Colors, Contours, + Deformations, Degradations, Details, Film emulation, Frames, Layers, + Light & shadows, Patterns, Rendering, Repair, Sequences, etc.). 4 - G'MIC Online, a web service to allow users applying image processing algorithms on their images, directly from a web browser. @@ -67,7 +67,7 @@ A complete list of contributors is available on the project web page: - https://gmic.eu + https://gmic.eu # Institution #------------- @@ -81,7 +81,7 @@ The C++ source code of G'MIC is distributed partly under the CeCILL-C v.1.0 (LGPL-like) and CeCILL v.2.1 (GPL-compatible) licenses (see file 'COPYING'). - These licenses ( http://www.cecill.info/index.en.html ) have been + These licenses ( http://cecill.info/index.en.html ) have been created under the supervision of the three biggest research institutions on computer sciences in France: @@ -89,20 +89,30 @@ - CEA ( http://www.cea.fr/ ) - INRIA ( http://www.inria.fr/ ) -# More information online -#------------------------- +# Give Us Support ! +#------------------ - - Home page : https://gmic.eu - - G'MIC Online Service : https://gmicol.greyc.fr + If you appreciate what we do on G'MIC, please consider supporting us ! + We collaborate with "Association LILA (Libre comme l'Art)", a French + non-profit organization which collects donations to help developing the + G'MIC project. + Visit the donation page : libreart.info/en/projects/gmic - - Google+ group: https://plus.google.com/117441237982283011318/posts - - Pixls.us forum: https://discuss.pixls.us/c/software/gmic - - Flickr forum: http://www.flickr.com/groups/gmic/discuss - - GimpChat forum: http://gimpchat.com/viewforum.php?f=28 +# More information online +#------------------------- + - Home page: https://gmic.eu + - Download page: https://gmic.eu/download.shtml - Tutorial page: https://gmic.eu/tutorial - Reference documentation: https://gmic.eu/reference.shtml - - G'MIC wiki: https://github.com/dtschump/gmic-community/wiki + - G'MIC Online: https://gmicol.greyc.fr + + - Discussion forum: https://discuss.pixls.us/c/software/gmic + - Reddit: https://www.reddit.com/r/gmic/ + - Twitter: https://twitter.com/gmic_eu + - Framasphere: https://framasphere.org/u/gmic + - GimpChat forum: http://gimpchat.com/viewforum.php?f=28 + - IRC: #pixls.us on Freenode. -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- \ No newline at end of file diff -Nru gmic-2.4.5/resources/gmic_bashcompletion.sh gmic-2.9.2/resources/gmic_bashcompletion.sh --- gmic-2.4.5/resources/gmic_bashcompletion.sh 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/resources/gmic_bashcompletion.sh 2020-09-03 11:37:02.000000000 +0000 @@ -10,11 +10,14 @@ _gmic() { local cur prev opts coms - _init_completion || return - COMPREPLY=() - cur="${COMP_WORDS[COMP_CWORD]}" - prev="${COMP_WORDS[COMP_CWORD-1]}" - coms=" debug h help version camera clut m command cursor d display d0 display0 d3d display3d da display_array dfft display_fft dg display_graph dh display_histogram display_parametric dp display_parallel dp0 display_parallel0 display_polar dq display_quiver drgba display_rgba dt display_tensors dw display_warp document_gmic e echo echo_file echo_stdout function1d gmicky gmicky_deevad gmicky_mahvin gmicky_wilber i input input_cube ig input_glob input_gpl o output output_cube output_ggr on outputn op outputp ow outputw ox outputx pass plot p print rainbow_lut roddy screen select serialize shape_circle shape_cupid shape_diamond shape_fern shape_gear shape_heart shape_polygon shape_snowflake shape_star sh shared sp sample srand string testimage2d uncommand uniform_distribution unserialize up update v verbose wait warn w window k keep mv move nm name rm remove remove_duplicates remove_empty rv reverse sort_list sort_str abs acos acosh + add & and argmax argmin asin asinh atan atan2 atanh << bsl >> bsr cos cosh / div div_complex == eq exp >= ge > gt <= le < lt log log10 log2 max m/ mdiv min % mod m* mmul * mul mul_channels mul_complex != neq | or ^ pow rol ror sign sin sinc sinh sqr sqrt - sub tan tanh xor apply_curve apply_gamma balance_gamma cast complex2polar compress_clut compress_rle cumulate c cut decompress_clut decompress_rle discard eigen2tensor endian equalize f fill index ir inrange map map_clut mix_channels negate noise noise_poissondisk normp norm n normalize normalize_sum not orientation oneminus otsu polar2complex quantize quantize_area rand replace replace_inf replace_nan replace_seq replace_str round roundify = set set_vector_covariance threshold unrepeat vector2tensor adjust_colors ac apply_channels autoindex bayer2rgb cmy2rgb cmyk2rgb colorblind colormap compose_channels direction2rgb ditheredbw fc fill_color gradient2rgb hcy2rgb : hsi2rgb hsi82rgb hsl2rgb hsl82rgb hsv2rgb hsv82rgb int2rgb lab2lch lab2rgb lab2srgb lab82srgb lab2xyz lab82rgb lch2lab lch2rgb lch82rgb luminance mix_rgb pseudogray replace_color retinex rgb2bayer rgb2cmy rgb2cmyk rgb2hcy rgb2hsi rgb2hsi8 rgb2hsl rgb2hsl8 rgb2hsv rgb2hsv8 rgb2lab rgb2lab8 rgb2lch rgb2lch8 rgb2luv rgb2int rgb2srgb rgb2xyz rgb2xyz8 rgb2yiq rgb2yiq8 rgb2ycbcr rgb2yuv rgb2yuv8 remove_opacity select_color sepia solarize split_colors split_opacity srgb2lab srgb2lab8 srgb2rgb to_a to_color to_colormode to_gray to_graya to_pseudogray to_rgb to_rgba transfer_histogram transfer_rgb xyz2lab xyz2rgb xyz82rgb ycbcr2rgb yiq2rgb yiq82rgb yuv2rgb yuv82rgb a append append_tiles apply_scales autocrop autocrop_components autocrop_seq channels columns z crop diagonal elevate expand_x expand_xy expand_xyz expand_y expand_z extract_region montage mirror permute r resize resize_mn resize_pow2 rr2d resize_ratio2d r2dx resize2dx r2dy resize2dy r3dx resize3dx r3dy resize3dy r3dz resize3dz rotate rotate_tileable rows scale2x scale3x scale_dcci2x seamcarve shift shrink_x shrink_xy shrink_xyz shrink_y shrink_z slices sort s split split_tiles undistort y unroll upscale_smart warp warp_patch bandpass bilateral b blur blur_angular blur_bloom blur_linear blur_radial blur_selective blur_x blur_xy blur_xyz blur_y blur_z boxfilter bump2normal compose_freq convolve convolve_fft correlate cross_correlation curvature dct deblur deblur_goldmeinel deblur_richardsonlucy deconvolve_fft deinterlace denoise denoise_haar denoise_patchpca deriche dilate dilate_circ dilate_oct dilate_threshold divergence dog diffusiontensors edges erode erode_circ erode_oct erode_threshold fft g gradient gradient_norm gradient_orientation guided haar heat_flow hessian idct iee ifft ihaar ilaplacian inn inpaint inpaint_diffusion inpaint_flow inpaint_holes inpaint_morpho inpaint_matchpatch kuwahara laplacian lic map_tones map_tones_fast meancurvature_flow median nlmeans nlmeans_core normalize_local normalized_cross_correlation peronamalik_flow phase_correlation pde_flow periodize_poisson red_eye remove_hotpixels remove_pixels rolling_guidance sharpen smooth split_freq solve_poisson split_details structuretensors solidify syntexturize syntexturize_matchpatch tv_flow unsharp unsharp_octave vanvliet voronoi watermark_fourier watershed area area_fg at_line at_quadrangle barycenter delaunay detect_skin displacement distance fftpolar histogram histogram_nd histogram_cumul histogram_pointwise hough ifftpolar isophotes label label_fg max_patch min_patch minimal_path mse patches matchpatch plot2value pointcloud psnr segment_watershed shape2bump skeleton slic ssd_patch thinning tones topographic_map tsp variance_patch arrow axes ball chessboard cie1931 circle close_binary ellipse flood gaussian graph grid j image line linethick mandelbrot marble maze maze_mask j3d object3d pack_sprites piechart plasma point polka_dots polygon quiver rectangle rorschach sierpinski spiralbw spline tetraedron_shade t text to text_outline triangle_shade truchet turbulence yinyang dijkstra eigen invert solve svd transpose trisolve +3d add3d animate3d apply_camera3d apply_matrix3d array3d arrow3d axes3d box3d c3d center3d circle3d circles3d col3d color3d colorcube3d cone3d cubes3d cup3d cylinder3d delaunay3d distribution3d /3d div3d db3d double3d elevation3d empty3d extrude3d f3d focale3d gaussians3d gmic3d gyroid3d histogram3d image6cube3d imageblocks3d imagecube3d imageplane3d imagepyramid3d imagerubik3d imagesphere3d isoline3d isosurface3d label3d label_points3d lathe3d l3d light3d line3d lissajous3d m3d mode3d md3d moded3d *3d mul3d n3d normalize3d o3d opacity3d parametric3d pca_patch3d plane3d point3d pointcloud3d pose3d p3d primitives3d projections3d pyramid3d quadrangle3d random3d rv3d reverse3d r3d rotate3d rotation3d sierpinski3d size3d skeleton3d snapshot3d sl3d specl3d ss3d specs3d sphere3d spherical3d spline3d s3d split3d sprite3d sprites3d star3d streamline3d -3d sub3d superformula3d tensors3d text_pointcloud3d text3d t3d texturize3d torus3d triangle3d volume3d weird3d ap apply_parallel apc apply_parallel_channels apo apply_parallel_overlap at apply_tiles apply_timeout check check3d continue break do done elif else fi endif endl endlocal error eval x exec for if l local mutex noarg onfail parallel progress q quit repeat return rprogress run skip u status while array array_fade array_mirror array_random frame frame_blur frame_cube frame_fuzzy frame_painting frame_pattern frame_round frame_seamless frame_x frame_xy frame_xyz frame_y img2ascii imagegrid imagegrid_hexagonal imagegrid_triangular linearize_tiles map_sprites pack puzzle quadratize_tiles rotate_tiles shift_tiles taquin tunnel boxfitting brushify cartoon color_ellipses cubism draw_whirl drawing drop_shadow ellipsionism fire_edges fractalize glow halftone hardsketchbw hearts houghsketchbw lightrays light_relief linify mosaic old_photo pencilbw pixelsort polaroid polygonize poster_edges poster_hope rodilius stained_glass stars sketchbw sponge stencil stencilbw tetris warhol weave whirls deform euclidean2polar equirectangular2nadirzenith fisheye flower kaleidoscope map_sphere nadirzenith2equirectangular polar2euclidean raindrops ripple rotoidoscope spherize symmetrize transform_polar twirl warp_perspective water wave wind zoom cracks light_patch noise_hurl pixelize scanlines shade_stripes shadow_patch spread stripes_y texturize_canvas texturize_paper vignette watermark_visible blend blend_edges blend_fade blend_median blend_seamless fade_diamond fade_linear fade_radial fade_x fade_y fade_z sub_alpha animate apply_camera apply_files apply_video average_files average_video fade_files fade_video files2video median_files median_video morph morph_files morph_video register_nonrigid register_rigid transition transition3d video2files alert arg arg2var autocrop_coords base642img base642uchar basename bin bin2dec dec dec2str dec2bin dec2hex dec2oct fact fibonacci file_mv file_rand file_rm filename files fitratio_wh fitscreen fontchart fps gcd hex hex2dec hex2img hex2str img2hex img2str img2text img82hex hex2img8 is_3d is_ext is_image_arg is_pattern is_percent is_videofilename is_windows math_lib mad max_w max_h max_d max_s max_wh max_whd max_whds med median_color min_w min_h min_d min_s min_wh min_whd min_whds normalize_filename oct oct2dec padint path_gimp path_tmp reset RGB RGBA std_noise str str2hex strcontains strlen strreplace strlowercase strvar strver tic toc uchar2base64 img2base64 average_colors covariance_colors demo x_2048 x_blobs x_bouncing x_color_curves x_colorize x_connect4 x_fire x_fireworks x_fisheye x_fourier x_grab_color x_hanoi x_histogram x_hough x_jawbreaker x_landscape x_life x_light x_mandelbrot x_mask_color x_metaballs3d x_minesweeper x_minimal_path x_pacman x_paint x_plasma x_quantize_rgb x_reflection3d x_rubber3d x_segment x_select_color x_select_function1d x_select_palette x_shadebobs x_spline x_starfield3d x_tetris x_tictactoe x_waves x_whirl " + if type -t _init_completion >/dev/null; then + _init_completion -n = || return + else + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + prev="${COMP_WORDS[COMP_CWORD-1]}" + fi + coms=" debug h help version camera clut m command cursor d display d0 display0 d2d display2d d3d display3d da display_array dfft display_fft dg display_graph dh display_histogram display_parametric dp display_parallel dp0 display_parallel0 display_polar dq display_quiver drgba display_rgba dt display_tensors dw display_warp document_gmic e echo echo_file echo_stdout function1d i input input_565 input_cube input_flo ig input_glob input_gpl it input_text network o output output_565 output_cube output_flo output_ggr ot output_text on outputn op outputp ow outputw ox outputx pass plot p print screen select serialize shape_circle shape_cupid shape_diamond shape_dragon shape_fern shape_gear shape_heart shape_polygon shape_snowflake shape_star sh shared sp sample srand store testimage2d um uncommand uniform_distribution unserialize up update parse_gui v verbose wait warn w window k keep mv move nm name rm remove remove_duplicates remove_empty rmn remove_named rv reverse sort_list sort_str abs acos acosh + add & and argmax argmaxabs argmin argminabs asin asinh atan atan2 atanh << bsl >> bsr cos cosh / div div_complex == eq exp >= ge > gt <= le < lt log log10 log2 max maxabs m/ mdiv med min minabs % mod m* mmul * mul mul_channels mul_complex != neq | or ^ pow rol ror sign sin sinc sinh sqr sqrt - sub tan tanh xor apply_curve apply_gamma balance_gamma cast complex2polar compress_clut compress_rle cumulate c cut decompress_clut decompress_clut_rbf decompress_clut_pde decompress_rle discard eigen2tensor endian equalize f fill index ir inrange map mix_channels negate noise noise_perlin noise_poissondisk normp norm n normalize normalize_sum not orientation oneminus otsu polar2complex quantize quantize_area rand replace replace_inf replace_nan replace_seq replace_str round roundify = set threshold vector2tensor adjust_colors ac apply_channels autoindex bayer2rgb deltaE cmy2rgb cmyk2rgb colorblind colormap compose_channels direction2rgb ditheredbw fc fill_color gradient2rgb hcy2rgb hsi2rgb hsi82rgb hsl2rgb hsl82rgb hsv2rgb hsv82rgb int2rgb jzazbz2rgb jzazbz2xyz lab2lch lab2rgb lab2srgb lab82srgb lab2xyz lab82rgb lch2lab lch2rgb lch82rgb luminance lightness lut_contrast map_clut mix_rgb palette pseudogray replace_color retinex rgb2bayer rgb2cmy rgb2cmyk rgb2hcy rgb2hsi rgb2hsi8 rgb2hsl rgb2hsl8 rgb2hsv rgb2hsv8 rgb2int rgb2jzazbz rgb2lab rgb2lab8 rgb2lch rgb2lch8 rgb2luv rgb2ryb rgb2srgb rgb2xyz rgb2xyz8 rgb2yiq rgb2yiq8 rgb2ycbcr rgb2yuv rgb2yuv8 remove_opacity ryb2rgb select_color sepia solarize split_colors split_opacity srgb2lab srgb2lab8 srgb2rgb to_a to_color to_colormode to_gray to_graya to_pseudogray to_rgb to_rgba transfer_histogram transfer_pca transfer_rgb xyz2jzazbz xyz2lab xyz2rgb xyz82rgb ycbcr2rgb yiq2rgb yiq82rgb yuv2rgb yuv82rgb a append append_tiles apply_scales autocrop autocrop_components autocrop_seq channels columns z crop diagonal elevate expand_x expand_xy expand_xyz expand_y expand_z extract extract_region montage mirror permute r resize resize_mn resize_pow2 rr2d resize_ratio2d r2dx resize2dx r2dy resize2dy r3dx resize3dx r3dy resize3dy r3dz resize3dz rotate rotate_tileable rows scale2x scale3x scale_dcci2x seamcarve shift shrink_x shrink_xy shrink_xyz shrink_y shrink_z slices sort s split split_tiles undistort y unroll upscale_smart warp warp_patch bandpass bilateral b blur blur_angular blur_bloom blur_linear blur_radial blur_selective blur_x blur_xy blur_xyz blur_y blur_z boxfilter bump2normal compose_freq convolve convolve_fft correlate cross_correlation curvature dct deblur deblur_goldmeinel deblur_richardsonlucy deconvolve_fft deinterlace denoise denoise_haar denoise_patchpca deriche dilate dilate_circ dilate_oct dilate_threshold divergence dog diffusiontensors edges erode erode_circ erode_oct erode_threshold fft g gradient gradient_norm gradient_orientation guided haar heat_flow hessian idct iee ifft ihaar ilaplacian inn inpaint inpaint_pde inpaint_flow inpaint_holes inpaint_morpho inpaint_matchpatch kuwahara laplacian lic map_tones map_tones_fast meancurvature_flow median nlmeans nlmeans_core normalize_local normalized_cross_correlation percentile peronamalik_flow phase_correlation pde_flow periodize_poisson rbf red_eye remove_hotpixels remove_pixels rolling_guidance sharpen smooth split_freq solve_poisson split_details structuretensors solidify syntexturize syntexturize_matchpatch tv_flow unsharp unsharp_octave vanvliet voronoi watermark_fourier watershed area area_fg at_line at_quadrangle barycenter delaunay detect_skin displacement distance fftpolar histogram histogram_nd histogram_cumul histogram_pointwise hough ifftpolar isophotes label label_fg max_patch min_patch minimal_path mse patches matchpatch plot2value pointcloud psnr segment_watershed shape2bump skeleton slic ssd_patch thinning tones topographic_map tsp variance_patch arrow axes ball chessboard cie1931 circle close_binary ellipse flood gaussian graph grid j image line linethick mandelbrot marble maze maze_mask newton_fractal j3d object3d pack_sprites piechart plasma point polka_dots polygon quiver rectangle rorschach sierpinski spiralbw spline tetraedron_shade t text to text_outline triangle_shade truchet turbulence yinyang dijkstra eigen invert orthogonalize mproj solve svd transpose trisolve +3d add3d animate3d apply_camera3d apply_matrix3d array3d arrow3d axes3d boundingbox3d box3d c3d center3d circle3d circles3d col3d color3d colorcube3d cone3d cubes3d cup3d cylinder3d delaunay3d distribution3d /3d div3d db3d double3d elevation3d empty3d extrude3d f3d focale3d gaussians3d gmic3d gyroid3d histogram3d image6cube3d imageblocks3d imagecube3d imageplane3d imagepyramid3d imagerubik3d imagesphere3d isoline3d isosurface3d label3d label_points3d lathe3d l3d light3d line3d lissajous3d m3d mode3d md3d moded3d *3d mul3d n3d normalize3d o3d opacity3d parametric3d pca_patch3d plane3d point3d pointcloud3d pose3d p3d primitives3d projections3d pyramid3d quadrangle3d random3d rv3d reverse3d r3d rotate3d rotation3d sierpinski3d size3d skeleton3d snapshot3d sl3d specl3d ss3d specs3d sphere3d spherical3d spline3d s3d split3d sprite3d sprites3d star3d streamline3d -3d sub3d superformula3d tensors3d text_pointcloud3d text3d t3d texturize3d torus3d triangle3d volume3d weird3d ap apply_parallel apc apply_parallel_channels apo apply_parallel_overlap at apply_tiles apply_timeout check check3d check_display continue break do done elif else fi endl endlocal error eval x exec for if l local mutex noarg onfail parallel progress q quit repeat return rprogress run skip u status while array array_fade array_mirror array_random frame frame_blur frame_cube frame_fuzzy frame_painting frame_pattern frame_round frame_seamless frame_x frame_xy frame_xyz frame_y img2ascii imagegrid imagegrid_hexagonal imagegrid_triangular linearize_tiles map_sprites pack puzzle quadratize_tiles rotate_tiles shift_tiles taquin tunnel boxfitting brushify cartoon color_ellipses cubism draw_whirl drawing drop_shadow ellipsionism fire_edges fractalize glow halftone hardsketchbw hearts houghsketchbw lightrays light_relief linify mosaic old_photo pencilbw pixelsort polaroid polygonize poster_edges poster_hope rodilius sketchbw sponge stained_glass stars stencil stencilbw stylize tetris warhol weave whirls deform euclidean2polar equirectangular2nadirzenith fisheye flower kaleidoscope map_sphere nadirzenith2equirectangular polar2euclidean raindrops ripple rotoidoscope spherize symmetrize transform_polar twirl warp_perspective water wave wind zoom cracks light_patch noise_hurl pixelize scanlines shade_stripes shadow_patch spread stripes_y texturize_canvas texturize_paper vignette watermark_visible blend blend_edges blend_fade blend_median blend_seamless fade_diamond fade_linear fade_radial fade_x fade_y fade_z sub_alpha animate apply_camera apply_files apply_video average_files average_video fade_files fade_video files2video median_files median_video morph morph_files morph_video register_nonrigid register_rigid transition transition3d video2files nn_new_input nn_new_fullyconnected nn_propagate_batch nn_propagate nn_backpropagate_batch nn_backpropagate nn_update nn_output nn_serialize nn_unserialize nn_input alert arg arg2var autocrop_coords average_colors base642img base642uchar basename bin bin2dec covariance_colors dec dec2str dec2bin dec2hex dec2oct fact fibonacci file_mv file_rand file_rm filename files fitratio_wh fitscreen fontchart fps gcd hex hex2dec hex2img hex2str img2base64 img2hex img2str img2text img82hex hex2img8 is_3d is_change is_half is_ext is_image_arg is_pattern is_percent is_variable_name Returns 1 if specified argument can be considered as a variable name, 0 otherwise. is_videofilename is_macos is_windows math_lib mad max_w max_h max_d max_s max_wh max_whd max_whds median_color min_w min_h min_d min_s min_wh min_whd min_whds nmd named normalize_filename oct oct2dec padint path_cache path_gimp path_tmp remove_copymark reset RGB RGBA std_noise str str2hex strcapitalize strcontains strlen strreplace strlowercase struppercase strvar strver tic toc to_clutname uchar2base64 demos x_2048 x_blobs x_bouncing x_color_curves x_colorize x_connect4 xz x_crop x_cut x_fire x_fireworks x_fisheye x_fourier x_grab_color x_hanoi x_histogram x_hough x_jawbreaker x_landscape x_life x_light x_mandelbrot x_mask_color x_metaballs3d x_minesweeper x_minimal_path x_morph x_pacman x_paint x_plasma x_quantize_rgb x_reflection3d x_rubber3d x_segment x_select_color x_select_function1d x_select_palette x_shadebobs x_spline x_starfield3d x_tetris x_threshold x_tictactoe x_warp x_waves x_whirl oneliner_sierpinski_carpet oneliner_sierpinski_triangle oneliner_lightspeed " opts=$(echo "$coms" | sed "s: \([^ ]\+\): \1 -\1 \+\1 --\1:g") case "${prev}" in @@ -23,9 +26,9 @@ "camera" | "-camera" | "--camera" | "+camera") COMPREPLY=( $(compgen -W "_camera_index>=0,_nb_frames>0,_skip_frames>=0,_capture_width>=0,_capture_height>=0 >") ); return 0;; "clut" | "-clut" | "--clut" | "+clut") - COMPREPLY=( $(compgen -W ""clut_name",_resolution>0 >") ); return 0;; + COMPREPLY=( $(compgen -W "\"clut_name\",_resolution>0,_cut_and_round={_0=no_|_1=yes_} >") ); return 0;; "command" | "-command" | "--command" | "+command") - COMPREPLY=( $(compgen -W "_add_debug_info={_0_|_1_},{_filename_|_http[s]://URL_|_"string"_} >") ); return 0;; + COMPREPLY=( $(compgen -W "_add_debug_info={_0_|_1_},{_filename_|_http[s]://URL_|_\"string\"_} >") ); return 0;; "cursor" | "-cursor" | "--cursor" | "+cursor") COMPREPLY=( $(compgen -W "_mode_=_{_0=hide_|_1=show_} >") ); return 0;; "display" | "-display" | "--display" | "+display") @@ -60,8 +63,10 @@ COMPREPLY=( $(compgen -W "message >") ); return 0;; "function1d" | "-function1d" | "--function1d" | "+function1d") COMPREPLY=( $(compgen -W "0<=smoothness<=1,x0>=0,y0,x1>=0,y1,...,xn>=0,yn >") ); return 0;; + "network" | "-network" | "--network" | "+network") + COMPREPLY=( $(compgen -W "mode={_-1=disabled_|_0=enabled_w/o_timeout_|_>0=enabled_w/_specified_timeout_in_seconds_} >") ); return 0;; "pass" | "-pass" | "--pass" | "+pass") - COMPREPLY=( $(compgen -W "_shared_state={_0=non-shared_(copy)_|_1=shared_|_2=adaptive_} >") ); return 0;; + COMPREPLY=( $(compgen -W "_shared_state={_-1=status_only_|_0=non-shared_(copy)_|_1=shared_|_2=adaptive_} >") ); return 0;; "plot" | "-plot" | "--plot" | "+plot") COMPREPLY=( $(compgen -W "_plot_type,_vertex_type,_xmin,_xmax,_ymin,_ymax,_exit_on_anykey={_0_|_1_} \'formula\',_resolution>=0,_plot_type,_vertex_type,_xmin,xmax,_ymin,_ymax,_exit_on_anykey={_0_|_1_}") ); return 0;; "screen" | "-screen" | "--screen" | "+screen") @@ -76,6 +81,8 @@ COMPREPLY=( $(compgen -W "_size>=0 >") ); return 0;; "shape_diamond" | "-shape_diamond" | "--shape_diamond" | "+shape_diamond") COMPREPLY=( $(compgen -W "_size>=0 >") ); return 0;; + "shape_dragon" | "-shape_dragon" | "--shape_dragon" | "+shape_dragon") + COMPREPLY=( $(compgen -W "_size>=0,_recursion_level>=0,_angle >") ); return 0;; "shape_fern" | "-shape_fern" | "--shape_fern" | "+shape_fern") COMPREPLY=( $(compgen -W "_size>=0,_density[%]>=0,_angle,0<=_opacity<=1,_type={_0=Asplenium_adiantum-nigrum_|_1=Thelypteridaceae_} >") ); return 0;; "shape_gear" | "-shape_gear" | "--shape_gear" | "+shape_gear") @@ -89,19 +96,21 @@ "shape_star" | "-shape_star" | "--shape_star" | "+shape_star") COMPREPLY=( $(compgen -W "_size>=0,_nb_branches>0,0<=_thickness<=1 >") ); return 0;; "shared" | "-shared" | "--shared" | "+shared") - COMPREPLY=( $(compgen -W "x0[%],x1[%],y[%],z[%],v[%] y0[%],y1[%],z[%],v[%] z0[%],z1[%],v[%] v0[%],v1[%] v0[%] (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "x0[%],x1[%],y[%],z[%],c[%] y0[%],y1[%],z[%],c[%] z0[%],z1[%],c[%] c0[%],c1[%] c0[%] (no_arg)") ); return 0;; "sample" | "-sample" | "--sample" | "+sample") - COMPREPLY=( $(compgen -W "_name1={_?_|_apples_|_barbara_|_boats_|_bottles_|_butterfly_|_cameraman_|_car_|_cat_|_cliff_|_david_|_dog_|_duck_|_eagle_|_elephant_|_earth_|_flower_|_fruits_|_greece_|_gummy_|_house_|_inside_|_landscape_|_leaf_|_lena_|_leno_|_lion_|_mandrill_|_monalisa_|_monkey_|_parrots_|_pencils_|_peppers_|_rooster_|_rose_|_square_|_teddy_|_tiger_|_wall_|_waterfall_|_zelda_},_name2,...,_nameN,_width={_>=0_|_0_(auto)_},_height_=_{_>=0_|_0_(auto)_} (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "_name1={_?_|_apples_|_balloons_|_barbara_|_boats_|_bottles_|_butterfly_|_cameraman_|_car_|_cat_|_cliff_|_chick_|_colorful_|_david_|_dog_|_duck_|_eagle_|_elephant_|_earth_|_flower_|_fruits_|_gmicky_|_gmicky_mahvin_|_gmicky_wilber_|_greece_|_gummy_|_house_|_inside_|_landscape_|_leaf_|_lena_|_leno_|_lion_|_mandrill_|_monalisa_|_monkey_|_parrots_|_pencils_|_peppers_|_portrait0_|_portrait1_|_portrait2_|_portrait3_|_portrait4_|_portrait5_|_portrait6_|_portrait7_|_portrait8_|_portrait9_|_roddy_|_rooster_|_rose_|_square_|_swan_|_teddy_|_tiger_|_tulips_|_wall_|_waterfall_|_zelda_},_name2,...,_nameN,_width={_>=0_|_0_(auto)_},_height_=_{_>=0_|_0_(auto)_} (no_arg)") ); return 0;; "srand" | "-srand" | "--srand" | "+srand") COMPREPLY=( $(compgen -W "value (no_arg)") ); return 0;; - "string" | "-string" | "--string" | "+string") - COMPREPLY=( $(compgen -W ""string" >") ); return 0;; + "store" | "-store" | "--store" | "+store") + COMPREPLY=( $(compgen -W "_is_compressed={_0_|_1_},variable_name1,_variable_name2,... >") ); return 0;; "testimage2d" | "-testimage2d" | "--testimage2d" | "+testimage2d") COMPREPLY=( $(compgen -W "_width>0,_height>0,_spectrum>0 >") ); return 0;; "uncommand" | "-uncommand" | "--uncommand" | "+uncommand") COMPREPLY=( $(compgen -W "command_name[,_command_name2,...] *") ); return 0;; "uniform_distribution" | "-uniform_distribution" | "--uniform_distribution" | "+uniform_distribution") COMPREPLY=( $(compgen -W "nb_levels>=1,spectrum>=1 >") ); return 0;; + "parse_gui" | "-parse_gui" | "--parse_gui" | "+parse_gui") + COMPREPLY=( $(compgen -W "_filter_name,_outputmode >") ); return 0;; "verbose" | "-verbose" | "--verbose" | "+verbose") COMPREPLY=( $(compgen -W "level {_+_|_-_}") ); return 0;; "wait" | "-wait" | "--wait" | "+wait") @@ -113,7 +122,9 @@ "move" | "-move" | "--move" | "+move") COMPREPLY=( $(compgen -W "position[%] >") ); return 0;; "name" | "-name" | "--name" | "+name") - COMPREPLY=( $(compgen -W ""name1","name2",... >") ); return 0;; + COMPREPLY=( $(compgen -W "\"name1\",\"name2\",... >") ); return 0;; + "remove_named" | "-remove_named" | "--remove_named" | "+remove_named") + COMPREPLY=( $(compgen -W "\"name1\",\"name2\",... >") ); return 0;; "sort_list" | "-sort_list" | "--sort_list" | "+sort_list") COMPREPLY=( $(compgen -W "_ordering={_+_|_-_},_criterion >") ); return 0;; "add" | "-add" | "--add" | "+add") @@ -142,10 +153,14 @@ COMPREPLY=( $(compgen -W "value[%] [image] \'formula\' (no_arg)") ); return 0;; "max" | "-max" | "--max" | "+max") COMPREPLY=( $(compgen -W "value[%] [image] \'formula\' (no_arg)") ); return 0;; + "maxabs" | "-maxabs" | "--maxabs" | "+maxabs") + COMPREPLY=( $(compgen -W "value[%] [image] \'formula\' (no_arg)") ); return 0;; "mdiv" | "-mdiv" | "--mdiv" | "+mdiv") COMPREPLY=( $(compgen -W "value[%] [image] \'formula\' (no_arg)") ); return 0;; "min" | "-min" | "--min" | "+min") COMPREPLY=( $(compgen -W "value[%] [image] \'formula\' (no_arg)") ); return 0;; + "minabs" | "-minabs" | "--minabs" | "+minabs") + COMPREPLY=( $(compgen -W "value[%] [image] \'formula\' (no_arg)") ); return 0;; "mod" | "-mod" | "--mod" | "+mod") COMPREPLY=( $(compgen -W "value[%] [image] \'formula\' (no_arg)") ); return 0;; "mmul" | "-mmul" | "--mmul" | "+mmul") @@ -179,15 +194,19 @@ "cast" | "-cast" | "--cast" | "+cast") COMPREPLY=( $(compgen -W "datatype_source,datatype_target >") ); return 0;; "compress_clut" | "-compress_clut" | "--compress_clut" | "+compress_clut") - COMPREPLY=( $(compgen -W "_max_nbpoints>=1,_max_error>=0,_avg_error>=0 >") ); return 0;; + COMPREPLY=( $(compgen -W "_max_error>0,_avg_error>0,_max_nbpoints>=8_|_0_(unlimited),_error_metric={_0=L2-norm_|_1=deltaE_1976_|_2=deltaE_2000_},_reconstruction_colorspace={_0=srgb_|_1=rgb_|_2=lab_},_try_rbf_first={_0_|_1_} >") ); return 0;; "compress_rle" | "-compress_rle" | "--compress_rle" | "+compress_rle") COMPREPLY=( $(compgen -W "_is_binary_data={_0_|_1_},_maximum_sequence_length>=0 >") ); return 0;; "cumulate" | "-cumulate" | "--cumulate" | "+cumulate") COMPREPLY=( $(compgen -W "{_x_|_y_|_z_|_c_}...{_x_|_y_|_z_|_c_} (no_arg)") ); return 0;; "cut" | "-cut" | "--cut" | "+cut") - COMPREPLY=( $(compgen -W "{_value0[%]_|_[image0]_},{_value1[%]_|_[image1]_} [image] (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "{_value0[%]_|_[image0]_},{_value1[%]_|_[image1]_} [image]") ); return 0;; "decompress_clut" | "-decompress_clut" | "--decompress_clut" | "+decompress_clut") - COMPREPLY=( $(compgen -W "_width>0,_height>0,_depth>0 >") ); return 0;; + COMPREPLY=( $(compgen -W "_width>0,_height>0,_depth>0,_reconstruction_colorspace={_0=srgb_|_1=rgb_|_2=lab_} >") ); return 0;; + "decompress_clut_rbf" | "-decompress_clut_rbf" | "--decompress_clut_rbf" | "+decompress_clut_rbf") + COMPREPLY=( $(compgen -W "_width>0,_height>0,_depth>0,_reconstruction_colorspace={_0=srgb_|_1=rgb_|_2=lab_} >") ); return 0;; + "decompress_clut_pde" | "-decompress_clut_pde" | "--decompress_clut_pde" | "+decompress_clut_pde") + COMPREPLY=( $(compgen -W "_width>0,_height>0,_depth>0,_reconstruction_colorspace={_0=srgb_|_1=rgb_|_2=lab_} >") ); return 0;; "discard" | "-discard" | "--discard" | "+discard") COMPREPLY=( $(compgen -W "_value1,_value2,... {_x_|_y_|_z_|_c}...{_x_|_y_|_z_|_c},_value1,_value2,... (no_arg)") ); return 0;; "endian" | "-endian" | "--endian" | "+endian") @@ -197,29 +216,29 @@ "fill" | "-fill" | "--fill" | "+fill") COMPREPLY=( $(compgen -W "value1,_value2,... [image] \'formula\'") ); return 0;; "index" | "-index" | "--index" | "+index") - COMPREPLY=( $(compgen -W "{_[palette]_|_predefined_palette_},0<=_dithering<=1,_map_palette={_0_|_1_} >") ); return 0;; + COMPREPLY=( $(compgen -W "{_[palette]_|_palette_name_},0<=_dithering<=1,_map_palette={_0_|_1_} >") ); return 0;; "inrange" | "-inrange" | "--inrange" | "+inrange") - COMPREPLY=( $(compgen -W "min[%],max[%] >") ); return 0;; + COMPREPLY=( $(compgen -W "min[%],max[%],_include_boundaries={_0=no_|_1=yes_} >") ); return 0;; "map" | "-map" | "--map" | "+map") - COMPREPLY=( $(compgen -W "[palette],_boundary_conditions predefined_palette,_boundary_conditions") ); return 0;; - "map_clut" | "-map_clut" | "--map_clut" | "+map_clut") - COMPREPLY=( $(compgen -W "[clut]_|_"clut_name" >") ); return 0;; + COMPREPLY=( $(compgen -W "[palette],_boundary_conditions palette_name,_boundary_conditions") ); return 0;; "mix_channels" | "-mix_channels" | "--mix_channels" | "+mix_channels") - COMPREPLY=( $(compgen -W "(a00,...,aMN) >") ); return 0;; + COMPREPLY=( $(compgen -W "(a00,...,aMN) [matrix]") ); return 0;; "negate" | "-negate" | "--negate" | "+negate") COMPREPLY=( $(compgen -W "base_value (no_arg)") ); return 0;; "noise" | "-noise" | "--noise" | "+noise") COMPREPLY=( $(compgen -W "std_deviation>=0[%],_noise_type >") ); return 0;; + "noise_perlin" | "-noise_perlin" | "--noise_perlin" | "+noise_perlin") + COMPREPLY=( $(compgen -W "_scale_x[%]>0,_scale_y[%]>0,_scale_z[%]>0,_seed_x,_seed_y,_seed_z >") ); return 0;; "noise_poissondisk" | "-noise_poissondisk" | "--noise_poissondisk" | "+noise_poissondisk") COMPREPLY=( $(compgen -W "_radius[%]>0,_max_sample_attempts>0 >") ); return 0;; "normp" | "-normp" | "--normp" | "+normp") COMPREPLY=( $(compgen -W "p>=0 >") ); return 0;; "normalize" | "-normalize" | "--normalize" | "+normalize") - COMPREPLY=( $(compgen -W "{_value0[%]_|_[image0]_},{_value1[%]_|_[image1]_} [image]") ); return 0;; + COMPREPLY=( $(compgen -W "{_value0[%]_|_[image0]_},{_value1[%]_|_[image1]_},_constant_case_ratio [image]") ); return 0;; "otsu" | "-otsu" | "--otsu" | "+otsu") COMPREPLY=( $(compgen -W "_nb_levels>0 >") ); return 0;; "quantize" | "-quantize" | "--quantize" | "+quantize") - COMPREPLY=( $(compgen -W "nb_levels>=1,_keep_values={_0_|_1_},_is_uniform={_0_|_1_} >") ); return 0;; + COMPREPLY=( $(compgen -W "nb_levels>=1,_keep_values={_0_|_1_},_quantization_type={_-1=median-cut_|_0=k-means_|_1=uniform_} >") ); return 0;; "quantize_area" | "-quantize_area" | "--quantize_area" | "+quantize_area") COMPREPLY=( $(compgen -W "_min_area>0 >") ); return 0;; "rand" | "-rand" | "--rand" | "+rand") @@ -231,51 +250,59 @@ "replace_nan" | "-replace_nan" | "--replace_nan" | "+replace_nan") COMPREPLY=( $(compgen -W "_expression >") ); return 0;; "replace_seq" | "-replace_seq" | "--replace_seq" | "+replace_seq") - COMPREPLY=( $(compgen -W ""search_seq","replace_seq" >") ); return 0;; + COMPREPLY=( $(compgen -W "\"search_seq\",\"replace_seq\" >") ); return 0;; "replace_str" | "-replace_str" | "--replace_str" | "+replace_str") - COMPREPLY=( $(compgen -W ""search_str","replace_str" >") ); return 0;; + COMPREPLY=( $(compgen -W "\"search_str\",\"replace_str\" >") ); return 0;; "round" | "-round" | "--round" | "+round") COMPREPLY=( $(compgen -W "rounding_value>=0,_rounding_type (no_arg)") ); return 0;; "roundify" | "-roundify" | "--roundify" | "+roundify") COMPREPLY=( $(compgen -W "gamma>=0 >") ); return 0;; "set" | "-set" | "--set" | "+set") COMPREPLY=( $(compgen -W "value,_x[%],_y[%],_z[%],_c[%] >") ); return 0;; - "set_vector_covariance" | "-set_vector_covariance" | "--set_vector_covariance" | "+set_vector_covariance") - COMPREPLY=( $(compgen -W "coef1,coef2,...,coefN >") ); return 0;; "threshold" | "-threshold" | "--threshold" | "+threshold") - COMPREPLY=( $(compgen -W "value[%],_is_soft={_0_|_1_} (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "value[%],_is_soft={_0_|_1_}_: >") ); return 0;; "adjust_colors" | "-adjust_colors" | "--adjust_colors" | "+adjust_colors") COMPREPLY=( $(compgen -W "-100<=_brightness<=100,-100<=_contrast<=100,-100<=_gamma<=100,-100<=_hue_shift<=100,-100<=_saturation<=100,_value_min,_value_max >") ); return 0;; "apply_channels" | "-apply_channels" | "--apply_channels" | "+apply_channels") - COMPREPLY=( $(compgen -W ""command",color_channels,_value_action={_0=none_|_1=cut_|_2=normalize_} >") ); return 0;; + COMPREPLY=( $(compgen -W "\"command\",color_channels,_value_action={_0=none_|_1=cut_|_2=normalize_} >") ); return 0;; "autoindex" | "-autoindex" | "--autoindex" | "+autoindex") COMPREPLY=( $(compgen -W "nb_colors>0,0<=_dithering<=1,_method={_0=median-cut_|_1=k-means_} >") ); return 0;; "bayer2rgb" | "-bayer2rgb" | "--bayer2rgb" | "+bayer2rgb") COMPREPLY=( $(compgen -W "_GM_smoothness,_RB_smoothness1,_RB_smoothness2 >") ); return 0;; + "deltaE" | "-deltaE" | "--deltaE" | "+deltaE") + COMPREPLY=( $(compgen -W "[image],_metric={_0=deltaE_1976_|_1=deltaE_2000_},\"_to_Lab_command\" >") ); return 0;; "colorblind" | "-colorblind" | "--colorblind" | "+colorblind") COMPREPLY=( $(compgen -W "type={_0=protanopia_|_1=protanomaly_|_2=deuteranopia_|_3=deuteranomaly_|_4=tritanopia_|_5=tritanomaly_|_6=achromatopsia_|_7=achromatomaly_} >") ); return 0;; "colormap" | "-colormap" | "--colormap" | "+colormap") - COMPREPLY=( $(compgen -W "nb_levels>=0,_method={_0=median-cut_|_1=k-means_},_sort_vectors={_0_|_1_} >") ); return 0;; + COMPREPLY=( $(compgen -W "nb_levels>=0,_method={_0=median-cut_|_1=k-means_},_sort_vectors >") ); return 0;; "fill_color" | "-fill_color" | "--fill_color" | "+fill_color") COMPREPLY=( $(compgen -W "col1,...,colN >") ); return 0;; "gradient2rgb" | "-gradient2rgb" | "--gradient2rgb" | "+gradient2rgb") COMPREPLY=( $(compgen -W "_is_orientation={_0_|_1_} >") ); return 0;; + "jzazbz2rgb" | "-jzazbz2rgb" | "--jzazbz2rgb" | "+jzazbz2rgb") + COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_|_2=E_} (no_arg)") ); return 0;; "lab2rgb" | "-lab2rgb" | "--lab2rgb" | "+lab2rgb") - COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_} (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_|_2=E_} (no_arg)") ); return 0;; "lab2srgb" | "-lab2srgb" | "--lab2srgb" | "+lab2srgb") - COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_} (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_|_2=E_} (no_arg)") ); return 0;; "lab82srgb" | "-lab82srgb" | "--lab82srgb" | "+lab82srgb") - COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_} (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_|_2=E_} (no_arg)") ); return 0;; "lab2xyz" | "-lab2xyz" | "--lab2xyz" | "+lab2xyz") - COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_} (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_|_2=E_} (no_arg)") ); return 0;; "lab82rgb" | "-lab82rgb" | "--lab82rgb" | "+lab82rgb") - COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_} (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_|_2=E_} (no_arg)") ); return 0;; "lch2rgb" | "-lch2rgb" | "--lch2rgb" | "+lch2rgb") - COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_} (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_|_2=E_} (no_arg)") ); return 0;; "lch82rgb" | "-lch82rgb" | "--lch82rgb" | "+lch82rgb") - COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_} (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_|_2=E_} (no_arg)") ); return 0;; + "lut_contrast" | "-lut_contrast" | "--lut_contrast" | "+lut_contrast") + COMPREPLY=( $(compgen -W "_nb_colors>1,_min_rgb_value >") ); return 0;; + "map_clut" | "-map_clut" | "--map_clut" | "+map_clut") + COMPREPLY=( $(compgen -W "[clut]_|_\"clut_name\" >") ); return 0;; "mix_rgb" | "-mix_rgb" | "--mix_rgb" | "+mix_rgb") COMPREPLY=( $(compgen -W "a11,a12,a13,a21,a22,a23,a31,a32,a33 >") ); return 0;; + "palette" | "-palette" | "--palette" | "+palette") + COMPREPLY=( $(compgen -W "palette_name_|_palette_number >") ); return 0;; "pseudogray" | "-pseudogray" | "--pseudogray" | "+pseudogray") COMPREPLY=( $(compgen -W "_max_increment>=0,_JND_threshold>=0,_bits_depth>0 >") ); return 0;; "replace_color" | "-replace_color" | "--replace_color" | "+replace_color") @@ -284,46 +311,50 @@ COMPREPLY=( $(compgen -W "_value_offset>0,_colorspace={_hsi_|_hsv_|_lab_|_lrgb_|_rgb_|_ycbcr_},0<=_min_cut<=100,0<=_max_cut<=100,_sigma_low>0,_sigma_mid>0,_sigma_high>0 >") ); return 0;; "rgb2bayer" | "-rgb2bayer" | "--rgb2bayer" | "+rgb2bayer") COMPREPLY=( $(compgen -W "_start_pattern=0,_color_grid=0 >") ); return 0;; + "rgb2jzazbz" | "-rgb2jzazbz" | "--rgb2jzazbz" | "+rgb2jzazbz") + COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_|_2=E_} (no_arg)") ); return 0;; "rgb2lab" | "-rgb2lab" | "--rgb2lab" | "+rgb2lab") - COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_} (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_|_2=E_} (no_arg)") ); return 0;; "rgb2lab8" | "-rgb2lab8" | "--rgb2lab8" | "+rgb2lab8") - COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_} (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_|_2=E_} (no_arg)") ); return 0;; "rgb2lch" | "-rgb2lch" | "--rgb2lch" | "+rgb2lch") - COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_} (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_|_2=E_} (no_arg)") ); return 0;; "rgb2lch8" | "-rgb2lch8" | "--rgb2lch8" | "+rgb2lch8") - COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_} (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_|_2=E_} (no_arg)") ); return 0;; "rgb2xyz" | "-rgb2xyz" | "--rgb2xyz" | "+rgb2xyz") - COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_} (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_|_2=E_} (no_arg)") ); return 0;; "rgb2xyz8" | "-rgb2xyz8" | "--rgb2xyz8" | "+rgb2xyz8") - COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_} (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_|_2=E_} (no_arg)") ); return 0;; "select_color" | "-select_color" | "--select_color" | "+select_color") COMPREPLY=( $(compgen -W "tolerance[%]>=0,col1,...,colN >") ); return 0;; "split_colors" | "-split_colors" | "--split_colors" | "+split_colors") COMPREPLY=( $(compgen -W "_tolerance>=0,_max_nb_outputs>0,_min_area>0 >") ); return 0;; "srgb2lab" | "-srgb2lab" | "--srgb2lab" | "+srgb2lab") - COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_} (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_|_2=E_} (no_arg)") ); return 0;; "srgb2lab8" | "-srgb2lab8" | "--srgb2lab8" | "+srgb2lab8") - COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_} (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_|_2=E_} (no_arg)") ); return 0;; "to_colormode" | "-to_colormode" | "--to_colormode" | "+to_colormode") COMPREPLY=( $(compgen -W "mode={_0=adaptive_|_1=G_|_2=GA_|_3=RGB_|_4=RGBA_} >") ); return 0;; "to_pseudogray" | "-to_pseudogray" | "--to_pseudogray" | "+to_pseudogray") COMPREPLY=( $(compgen -W "_max_step>=0,_is_perceptual_constraint={_0_|_1_},_bits_depth>0 >") ); return 0;; "transfer_histogram" | "-transfer_histogram" | "--transfer_histogram" | "+transfer_histogram") COMPREPLY=( $(compgen -W "[reference_image],_nb_levels>0,_color_channels >") ); return 0;; + "transfer_pca" | "-transfer_pca" | "--transfer_pca" | "+transfer_pca") + COMPREPLY=( $(compgen -W "[reference_image],_color_channels >") ); return 0;; "transfer_rgb" | "-transfer_rgb" | "--transfer_rgb" | "+transfer_rgb") COMPREPLY=( $(compgen -W "[target],_gamma>=0,_regularization>=0,_luminosity_constraints>=0,_rgb_resolution>=0,_is_constraints={_0_|_1_} >") ); return 0;; "xyz2lab" | "-xyz2lab" | "--xyz2lab" | "+xyz2lab") - COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_} (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_|_2=E_} (no_arg)") ); return 0;; "xyz2rgb" | "-xyz2rgb" | "--xyz2rgb" | "+xyz2rgb") - COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_} (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_|_2=E_} (no_arg)") ); return 0;; "xyz82rgb" | "-xyz82rgb" | "--xyz82rgb" | "+xyz82rgb") - COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_} (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "illuminant={_0=D50_|_1=D65_|_2=E_} (no_arg)") ); return 0;; "append" | "-append" | "--append" | "+append") COMPREPLY=( $(compgen -W "[image],axis,_centering axis,_centering") ); return 0;; "append_tiles" | "-append_tiles" | "--append_tiles" | "+append_tiles") COMPREPLY=( $(compgen -W "_M>=0,_N>=0,0<=_centering_x<=1,0<=_centering_y<=1 >") ); return 0;; "apply_scales" | "-apply_scales" | "--apply_scales" | "+apply_scales") - COMPREPLY=( $(compgen -W ""command",number_of_scales>0,_min_scale[%]>=0,_max_scale[%]>=0,_scale_gamma>0,_interpolation >") ); return 0;; + COMPREPLY=( $(compgen -W "\"command\",number_of_scales>0,_min_scale[%]>=0,_max_scale[%]>=0,_scale_gamma>0,_interpolation >") ); return 0;; "autocrop" | "-autocrop" | "--autocrop" | "+autocrop") COMPREPLY=( $(compgen -W "value1,value2,... (no_arg)") ); return 0;; "autocrop_components" | "-autocrop_components" | "--autocrop_components" | "+autocrop_components") @@ -335,7 +366,7 @@ "columns" | "-columns" | "--columns" | "+columns") COMPREPLY=( $(compgen -W "{_[image0]_|_x0[%]_},_{_[image1]_|_x1[%]_} >") ); return 0;; "crop" | "-crop" | "--crop" | "+crop") - COMPREPLY=( $(compgen -W "x0[%],x1[%],_boundary_conditions x0[%],y0[%],x1[%],y1[%],_boundary_conditions x0[%],y0[%],z0[%],x1[%],y1[%],z1[%],_boundary_conditions x0[%],y0[%],z0[%],c0[%],x1[%],y1[%],z1[%],c1[%],_boundary_conditions (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "x0[%],x1[%],_boundary_conditions x0[%],y0[%],x1[%],y1[%],_boundary_conditions x0[%],y0[%],z0[%],x1[%],y1[%],z1[%],_boundary_conditions x0[%],y0[%],z0[%],c0[%],x1[%],y1[%],z1[%],c1[%],_boundary_conditions") ); return 0;; "elevate" | "-elevate" | "--elevate" | "+elevate") COMPREPLY=( $(compgen -W "_depth,_is_plain={_0_|_1_},_is_colored={_0_|_1_} >") ); return 0;; "expand_x" | "-expand_x" | "--expand_x" | "+expand_x") @@ -348,16 +379,18 @@ COMPREPLY=( $(compgen -W "size_y>=0,_boundary_conditions={_0=dirichlet_|_1=neumann_|_2=periodic_|_3=mirror_} >") ); return 0;; "expand_z" | "-expand_z" | "--expand_z" | "+expand_z") COMPREPLY=( $(compgen -W "size_z>=0,_boundary_conditions={_0=dirichlet_|_1=neumann_|_2=periodic_|_3=mirror_} >") ); return 0;; + "extract" | "-extract" | "--extract" | "+extract") + COMPREPLY=( $(compgen -W "\"condition\",_output_type={_0=xyzc-coordinates_|_1=xyz-coordinates_|_2=scalar-values_|_3=vector-values_} >") ); return 0;; "extract_region" | "-extract_region" | "--extract_region" | "+extract_region") COMPREPLY=( $(compgen -W "[label_image],_extract_xyz_coordinates={_0_|_1_},_label_1,...,_label_M >") ); return 0;; "montage" | "-montage" | "--montage" | "+montage") - COMPREPLY=( $(compgen -W ""_layout_code",_montage_mode={_0<=centering<=1_|_2<=scale+2<=3_},_output_mode={_0=single_layer_|_1=multiple_layers_},"_processing_command" >") ); return 0;; + COMPREPLY=( $(compgen -W "\"_layout_code\",_montage_mode={_0<=centering<=1_|_2<=scale+2<=3_},_output_mode={_0=single_layer_|_1=multiple_layers_},\"_processing_command\" >") ); return 0;; "mirror" | "-mirror" | "--mirror" | "+mirror") COMPREPLY=( $(compgen -W "{_x_|_y_|_z_}...{_x_|_y_|_z_} >") ); return 0;; "permute" | "-permute" | "--permute" | "+permute") COMPREPLY=( $(compgen -W "permutation_string >") ); return 0;; "resize" | "-resize" | "--resize" | "+resize") - COMPREPLY=( $(compgen -W "[image],_interpolation,_boundary_conditions,_ax,_ay,_az,_ac {[image_w]_|_width>0[%]},_{[image_h]_|_height>0[%]},_{[image_d]_|_depth>0[%]},_{[image_s]_|_spectrum>0[%]},_interpolation,_boundary_conditions,_ax,_ay,_az,_ac (no_arg)") ); return 0;; + COMPREPLY=( $(compgen -W "[image],_interpolation,_boundary_conditions,_ax,_ay,_az,_ac {[image_w]_|_width>0[%]},_{[image_h]_|_height>0[%]},_{[image_d]_|_depth>0[%]},_{[image_s]_|_spectrum>0[%]},_interpolation,_boundary_conditions,_ax,_ay,_az,_ac") ); return 0;; "resize_mn" | "-resize_mn" | "--resize_mn" | "+resize_mn") COMPREPLY=( $(compgen -W "width[%]>=0,_height[%]>=0,_depth[%]>=0,_B_value,_C_value >") ); return 0;; "resize_pow2" | "-resize_pow2" | "--resize_pow2" | "+resize_pow2") @@ -443,11 +476,11 @@ "boxfilter" | "-boxfilter" | "--boxfilter" | "+boxfilter") COMPREPLY=( $(compgen -W "size>=0[%],_order,_boundary_conditions,_nb_iter>=0 axes,size>=0[%],_order,_boundary_conditions,_nb_iter>=0") ); return 0;; "convolve" | "-convolve" | "--convolve" | "+convolve") - COMPREPLY=( $(compgen -W "[mask],_boundary_conditions,_is_normalized={_0_|_1_} >") ); return 0;; + COMPREPLY=( $(compgen -W "[mask],_boundary_conditions,_is_normalized={_0_|_1_},_channel_mode,_xcenter,_ycenter,_zcenter,_xstart,_ystart,_zstart,_xend,_yend,_zend,_xstride,_ystride,_zstride,_xdilation,_ydilation,_zdilation >") ); return 0;; "convolve_fft" | "-convolve_fft" | "--convolve_fft" | "+convolve_fft") COMPREPLY=( $(compgen -W "[mask] >") ); return 0;; "correlate" | "-correlate" | "--correlate" | "+correlate") - COMPREPLY=( $(compgen -W "[mask],_boundary_conditions,_is_normalized={_0_|_1_} >") ); return 0;; + COMPREPLY=( $(compgen -W "[mask],_boundary_conditions,_is_normalized={_0_|_1_},_channel_mode,_xcenter,_ycenter,_zcenter,_xstart,_ystart,_zstart,_xend,_yend,_zend,_xstride,_ystride,_zstride,_xdilation,_ydilation,_zdilation >") ); return 0;; "cross_correlation" | "-cross_correlation" | "--cross_correlation" | "+cross_correlation") COMPREPLY=( $(compgen -W "[mask] >") ); return 0;; "dct" | "-dct" | "--dct" | "+dct") @@ -455,7 +488,7 @@ "deblur" | "-deblur" | "--deblur" | "+deblur") COMPREPLY=( $(compgen -W "amplitude[%]>=0,_nb_iter>=0,_dt>=0,_regul>=0,_regul_type={_0=Tikhonov_|_1=meancurv._|_2=TV_} >") ); return 0;; "deblur_goldmeinel" | "-deblur_goldmeinel" | "--deblur_goldmeinel" | "+deblur_goldmeinel") - COMPREPLY=( $(compgen -W "sigma>=0,__nb_iter>=0,__acceleration>=0,__kernel_type={_0=quasi-gaussian_(faster)_|_1=gaussian_}. >") ); return 0;; + COMPREPLY=( $(compgen -W "sigma>=0,_nb_iter>=0,_acceleration>=0,_kernel_type={_0=quasi-gaussian_(faster)_|_1=gaussian_}. >") ); return 0;; "deblur_richardsonlucy" | "-deblur_richardsonlucy" | "--deblur_richardsonlucy" | "+deblur_richardsonlucy") COMPREPLY=( $(compgen -W "sigma>=0,_nb_iter>=0,__kernel_type={_0=quasi-gaussian_(faster)_|_1=gaussian_}. >") ); return 0;; "deconvolve_fft" | "-deconvolve_fft" | "--deconvolve_fft" | "+deconvolve_fft") @@ -463,7 +496,7 @@ "deinterlace" | "-deinterlace" | "--deinterlace" | "+deinterlace") COMPREPLY=( $(compgen -W "_method={_0_|_1_} >") ); return 0;; "denoise" | "-denoise" | "--denoise" | "+denoise") - COMPREPLY=( $(compgen -W "std_deviation_s>=0,_std_deviation_p>=0,_patch_size>0,_lookup_size>0,_smoothness,_fast_approx={_0_|_1_} >") ); return 0;; + COMPREPLY=( $(compgen -W "[guide],std_deviation_s[%]>=0,_std_deviation_r[%]>=0,_patch_size>0,_lookup_size>0,_smoothness,_fast_approx={_0_|_1_} std_deviation_s[%]>=0,_std_deviation_r[%]>=0,_patch_size>0,_lookup_size>0,_smoothness,_fast_approx={_0_|_1_}") ); return 0;; "denoise_haar" | "-denoise_haar" | "--denoise_haar" | "+denoise_haar") COMPREPLY=( $(compgen -W "_threshold>=0,_nb_scales>=0,_cycle_spinning>0 >") ); return 0;; "denoise_patchpca" | "-denoise_patchpca" | "--denoise_patchpca" | "+denoise_patchpca") @@ -516,7 +549,7 @@ COMPREPLY=( $(compgen -W "{_nb_iterations>0_|_0_},_time_step>0,_[initial_estimate] >") ); return 0;; "inpaint" | "-inpaint" | "--inpaint" | "+inpaint") COMPREPLY=( $(compgen -W "[mask] [mask],0,_fast_method [mask],_patch_size>=1,_lookup_size>=1,_lookup_factor>=0,_lookup_increment!=0,_blend_size>=0,0<=_blend_threshold<=1,_blend_decay>=0,_blend_scales>=1,_is_blend_outer={_0_|_1_}") ); return 0;; - "inpaint_diffusion" | "-inpaint_diffusion" | "--inpaint_diffusion" | "+inpaint_diffusion") + "inpaint_pde" | "-inpaint_pde" | "--inpaint_pde" | "+inpaint_pde") COMPREPLY=( $(compgen -W "[mask],_nb_scales[%]>=0,_diffusion_type={_0=isotropic_|_1=delaunay-guided_|_2=edge-guided_|_3=mask-guided_},_diffusion_iter>=0 >") ); return 0;; "inpaint_flow" | "-inpaint_flow" | "--inpaint_flow" | "+inpaint_flow") COMPREPLY=( $(compgen -W "[mask],_nb_global_iter>=0,_nb_local_iter>=0,_dt>0,_alpha>=0,_sigma>=0 >") ); return 0;; @@ -546,12 +579,16 @@ COMPREPLY=( $(compgen -W "_amplitude>=0,_radius>0,_n_smooth>=0[%],_a_smooth>=0[%],_is_cut={_0_|_1_},_min=0,_max=255 >") ); return 0;; "normalized_cross_correlation" | "-normalized_cross_correlation" | "--normalized_cross_correlation" | "+normalized_cross_correlation") COMPREPLY=( $(compgen -W "[mask] >") ); return 0;; + "percentile" | "-percentile" | "--percentile" | "+percentile") + COMPREPLY=( $(compgen -W "[mask],0<=_min_percentile[%]<=100,0<=_max_percentile[%]<=100. >") ); return 0;; "peronamalik_flow" | "-peronamalik_flow" | "--peronamalik_flow" | "+peronamalik_flow") COMPREPLY=( $(compgen -W "K_factor>0,_nb_iter>=0,_dt,_keep_sequence={_0_|_1_} >") ); return 0;; "phase_correlation" | "-phase_correlation" | "--phase_correlation" | "+phase_correlation") COMPREPLY=( $(compgen -W "[destination] >") ); return 0;; "pde_flow" | "-pde_flow" | "--pde_flow" | "+pde_flow") COMPREPLY=( $(compgen -W "_nb_iter>=0,_dt,_velocity_command,_keep_sequence={_0_|_1_} >") ); return 0;; + "rbf" | "-rbf" | "--rbf" | "+rbf") + COMPREPLY=( $(compgen -W "dx,_x0,_x1,_phi(r) dx,dy,_x0,_y0,_x1,_y1,_phi(r) dx,dy,dz,x0,y0,z0,x1,y1,z1,phi(r)") ); return 0;; "red_eye" | "-red_eye" | "--red_eye" | "+red_eye") COMPREPLY=( $(compgen -W "0<=_threshold<=100,_smoothness>=0,0<=attenuation<=1 >") ); return 0;; "remove_hotpixels" | "-remove_hotpixels" | "--remove_hotpixels" | "+remove_hotpixels") @@ -563,11 +600,11 @@ "sharpen" | "-sharpen" | "--sharpen" | "+sharpen") COMPREPLY=( $(compgen -W "amplitude>=0 amplitude>=0,edge>=0,_alpha,_sigma") ); return 0;; "smooth" | "-smooth" | "--smooth" | "+smooth") - COMPREPLY=( $(compgen -W "amplitude[%]>=0,_sharpness>=0,0<=_anisotropy<=1,_alpha[%],_sigma[%],_dl>0,_da>0,_precision>0,interpolation,_fast_approx={_0_|_1_} nb_iterations>=0,_sharpness>=0,_anisotropy,_alpha,_sigma,_dt>0,0 [tensor_field],_amplitude>=0,_dl>0,_da>0,_precision>0,_interpolation,_fast_approx={_0_|_1_} [tensor_field],_nb_iters>=0,_dt>0,0") ); return 0;; + COMPREPLY=( $(compgen -W "amplitude[%]>=0,_sharpness>=0,0<=_anisotropy<=1,_alpha[%],_sigma[%],_dl>0,_da>0,_precision>0,_interpolation,_fast_approx={_0_|_1_} nb_iterations>=0,_sharpness>=0,_anisotropy,_alpha,_sigma,_dt>0,0 [tensor_field],_amplitude>=0,_dl>0,_da>0,_precision>0,_interpolation,_fast_approx={_0_|_1_} [tensor_field],_nb_iters>=0,_dt>0,0") ); return 0;; "split_freq" | "-split_freq" | "--split_freq" | "+split_freq") COMPREPLY=( $(compgen -W "smoothness>0[%] >") ); return 0;; "solve_poisson" | "-solve_poisson" | "--solve_poisson" | "+solve_poisson") - COMPREPLY=( $(compgen -W ""laplacian_command",_nb_iterations>=0,_time_step>0,_nb_scales>=0 >") ); return 0;; + COMPREPLY=( $(compgen -W "\"laplacian_command\",_nb_iterations>=0,_time_step>0,_nb_scales>=0 >") ); return 0;; "split_details" | "-split_details" | "--split_details" | "+split_details") COMPREPLY=( $(compgen -W "_nb_scales>0,_base_scale[%]>=0,_detail_scale[%]>=0 >") ); return 0;; "structuretensors" | "-structuretensors" | "--structuretensors" | "+structuretensors") @@ -617,7 +654,7 @@ "isophotes" | "-isophotes" | "--isophotes" | "+isophotes") COMPREPLY=( $(compgen -W "_nb_levels>0 >") ); return 0;; "label" | "-label" | "--label" | "+label") - COMPREPLY=( $(compgen -W "_tolerance>=0,is_high_connectivity={_0_|_1_} >") ); return 0;; + COMPREPLY=( $(compgen -W "_tolerance>=0,is_high_connectivity={_0_|_1_},_is_L2_norm={_0_|_1_} >") ); return 0;; "label_fg" | "-label_fg" | "--label_fg" | "+label_fg") COMPREPLY=( $(compgen -W "tolerance>=0,is_high_connectivity={_0_|_1_} >") ); return 0;; "max_patch" | "-max_patch" | "--max_patch" | "+max_patch") @@ -629,7 +666,7 @@ "patches" | "-patches" | "--patches" | "+patches") COMPREPLY=( $(compgen -W "patch_width>0,patch_height>0,patch_depth>0,x0,y0,z0,_x1,_y1,_z1,...,_xN,_yN,_zN >") ); return 0;; "matchpatch" | "-matchpatch" | "--matchpatch" | "+matchpatch") - COMPREPLY=( $(compgen -W "[patch_image],patch_width>=1,_patch_height>=1,_patch_depth>=1,_nb_iterations>=0,_nb_randoms>=0,_occ_penalization,_output_score={_0_|_1_},_[guide] >") ); return 0;; + COMPREPLY=( $(compgen -W "[patch_image],patch_width>=1,_patch_height>=1,_patch_depth>=1,_nb_iterations>=0,_nb_randoms>=0,_patch_penalization,_output_score={_0_|_1_},_[guide] >") ); return 0;; "pointcloud" | "-pointcloud" | "--pointcloud" | "+pointcloud") COMPREPLY=( $(compgen -W "_type_=_{_-X=-X-opacity_|_0=binary_|_1=cumulative_|_2=label_|_3=retrieve_coordinates_},_width,_height>0,_depth>0 >") ); return 0;; "psnr" | "-psnr" | "--psnr" | "+psnr") @@ -677,7 +714,7 @@ "grid" | "-grid" | "--grid" | "+grid") COMPREPLY=( $(compgen -W "size_x[%]>=0,size_y[%]>=0,_offset_x[%],_offset_y[%],_opacity,_pattern,_color1,... >") ); return 0;; "image" | "-image" | "--image" | "+image") - COMPREPLY=( $(compgen -W "[sprite],_x[%],_y[%],_z[%],_c[%],_opacity,_[sprite_mask],_max_opacity_mask >") ); return 0;; + COMPREPLY=( $(compgen -W "[sprite],_x[%|~],_y[%|~],_z[%|~],_c[%|~],_opacity,_[opacity_mask],_max_opacity_mask >") ); return 0;; "line" | "-line" | "--line" | "+line") COMPREPLY=( $(compgen -W "x0[%],y0[%],x1[%],y1[%],_opacity,_pattern,_color1,... >") ); return 0;; "linethick" | "-linethick" | "--linethick" | "+linethick") @@ -690,12 +727,14 @@ COMPREPLY=( $(compgen -W "_width>0,_height>0,_cell_size>0 >") ); return 0;; "maze_mask" | "-maze_mask" | "--maze_mask" | "+maze_mask") COMPREPLY=( $(compgen -W "_cellsize>0 >") ); return 0;; + "newton_fractal" | "-newton_fractal" | "--newton_fractal" | "+newton_fractal") + COMPREPLY=( $(compgen -W "z0r,z0i,z1r,z1i,_angle,0<=_descent_method<=2,_iteration_max>=0,_convergence_precision>0,_expr_p(z),_expr_dp(z),_expr_d2p(z) >") ); return 0;; "object3d" | "-object3d" | "--object3d" | "+object3d") COMPREPLY=( $(compgen -W "[object3d],_x[%],_y[%],_z,_opacity,_rendering_mode,_is_double_sided={_0_|_1_},_is_zbuffer={_0_|_1_},_focale,_light_x,_light_y,_light_z,_specular_lightness,_specular_shininess >") ); return 0;; "pack_sprites" | "-pack_sprites" | "--pack_sprites" | "+pack_sprites") COMPREPLY=( $(compgen -W "_nb_scales>=0,0<=_min_scale<=100,_allow_rotation={_0=0_deg._|_1=180_deg._|_2=90_deg._|_3=any_},_spacing,_precision>=0,max_iterations>=0 >") ); return 0;; "piechart" | "-piechart" | "--piechart" | "+piechart") - COMPREPLY=( $(compgen -W "label_height>=0,label_R,label_G,label_B,"label1",value1,R1,G1,B1,...,"labelN",valueN,RN,GN,BN >") ); return 0;; + COMPREPLY=( $(compgen -W "label_height>=0,label_R,label_G,label_B,\"label1\",value1,R1,G1,B1,...,\"labelN\",valueN,RN,GN,BN >") ); return 0;; "plasma" | "-plasma" | "--plasma" | "+plasma") COMPREPLY=( $(compgen -W "_alpha,_beta,_scale>=0 >") ); return 0;; "point" | "-point" | "--point" | "+point") @@ -712,14 +751,16 @@ COMPREPLY=( $(compgen -W "\'smoothness[%]>=0\',\'mirroring={_0=none_|_1=x_|_2=y_|_3=xy_} >") ); return 0;; "sierpinski" | "-sierpinski" | "--sierpinski" | "+sierpinski") COMPREPLY=( $(compgen -W "recursion_level>=0 >") ); return 0;; + "spiralbw" | "-spiralbw" | "--spiralbw" | "+spiralbw") + COMPREPLY=( $(compgen -W "width>0,_height>0,_is_2dcoords={_0_|_1_} >") ); return 0;; "spline" | "-spline" | "--spline" | "+spline") COMPREPLY=( $(compgen -W "x0[%],y0[%],u0[%],v0[%],x1[%],y1[%],u1[%],v1[%],_opacity,_color1,... >") ); return 0;; "tetraedron_shade" | "-tetraedron_shade" | "--tetraedron_shade" | "+tetraedron_shade") COMPREPLY=( $(compgen -W "x0,y0,z0,x1,y1,z1,x2,y2,z2,x3,y3,z3,R0,G0,B0,...,R1,G1,B1,...,R2,G2,B2,...,R3,G3,B3,... >") ); return 0;; "text" | "-text" | "--text" | "+text") - COMPREPLY=( $(compgen -W "text,_x[%],_y[%],_font_height[%]>=0,_opacity,_color1,... >") ); return 0;; + COMPREPLY=( $(compgen -W "text,_x[%|~],_y[%|~],_font_height[%]>=0,_opacity,_color1,... >") ); return 0;; "text_outline" | "-text_outline" | "--text_outline" | "+text_outline") - COMPREPLY=( $(compgen -W "text,_x[%],_y[%],_font_height[%]>0,_outline>=0,_opacity,_color1,... >") ); return 0;; + COMPREPLY=( $(compgen -W "text,_x[%|~],_y[%|~],_font_height[%]>0,_outline>=0,_opacity,_color1,... >") ); return 0;; "triangle_shade" | "-triangle_shade" | "--triangle_shade" | "+triangle_shade") COMPREPLY=( $(compgen -W "x0,y0,x1,y1,x2,y2,R0,G0,B0,...,R1,G1,B1,...,R2,G2,B2,... >") ); return 0;; "truchet" | "-truchet" | "--truchet" | "+truchet") @@ -728,6 +769,12 @@ COMPREPLY=( $(compgen -W "_radius>0,_octaves={1,2,3...,12},_alpha>0,_difference={-10,10},_mode={0,1,2,3} >") ); return 0;; "dijkstra" | "-dijkstra" | "--dijkstra" | "+dijkstra") COMPREPLY=( $(compgen -W "starting_node>=0,ending_node>=0 >") ); return 0;; + "invert" | "-invert" | "--invert" | "+invert") + COMPREPLY=( $(compgen -W "solver={_0=SVD_|_1=LU_} >") ); return 0;; + "orthogonalize" | "-orthogonalize" | "--orthogonalize" | "+orthogonalize") + COMPREPLY=( $(compgen -W "_mode_=_{_0=orthogonalize_|_1=orthonormalize_} >") ); return 0;; + "mproj" | "-mproj" | "--mproj" | "+mproj") + COMPREPLY=( $(compgen -W "[dictionnary],_method,_max_iter={_0=auto_|_>0_},_max_residual>=0 >") ); return 0;; "solve" | "-solve" | "--solve" | "+solve") COMPREPLY=( $(compgen -W "[image] >") ); return 0;; "trisolve" | "-trisolve" | "--trisolve" | "+trisolve") @@ -745,13 +792,13 @@ "arrow3d" | "-arrow3d" | "--arrow3d" | "+arrow3d") COMPREPLY=( $(compgen -W "x0,y0,z0,x1,y1,z1,_radius[%]>=0,_head_length[%]>=0,_head_radius[%]>=0 >") ); return 0;; "axes3d" | "-axes3d" | "--axes3d" | "+axes3d") - COMPREPLY=( $(compgen -W "_size_x,_size_y,_size_z,_font_size>0,_label_x,_label_y,_label_z >") ); return 0;; + COMPREPLY=( $(compgen -W "_size_x,_size_y,_size_z,_font_size>0,_label_x,_label_y,_label_z,_is_origin={_0=no_|_1=yes_} >") ); return 0;; "box3d" | "-box3d" | "--box3d" | "+box3d") COMPREPLY=( $(compgen -W "_size_x,_size_y,_size_z >") ); return 0;; "circle3d" | "-circle3d" | "--circle3d" | "+circle3d") COMPREPLY=( $(compgen -W "_x0,_y0,_z0,_radius>=0 >") ); return 0;; "circles3d" | "-circles3d" | "--circles3d" | "+circles3d") - COMPREPLY=( $(compgen -W "_radius>=0,_is_filled={_0_|_1_} >") ); return 0;; + COMPREPLY=( $(compgen -W "_radius>=0,_is_wireframe={_0_|_1_} >") ); return 0;; "color3d" | "-color3d" | "--color3d" | "+color3d") COMPREPLY=( $(compgen -W "R,_G,_B,_opacity >") ); return 0;; "cone3d" | "-cone3d" | "--cone3d" | "+cone3d") @@ -787,7 +834,7 @@ "isosurface3d" | "-isosurface3d" | "--isosurface3d" | "+isosurface3d") COMPREPLY=( $(compgen -W "isovalue[%] \'formula\',value,_x0,_y0,_z0,_x1,_y1,_z1,_size_x>0[%],_size_y>0[%],_size_z>0[%]") ); return 0;; "label3d" | "-label3d" | "--label3d" | "+label3d") - COMPREPLY=( $(compgen -W ""text",font_height>=0,_opacity,_color1,... >") ); return 0;; + COMPREPLY=( $(compgen -W "\"text\",font_height>=0,_opacity,_color1,... >") ); return 0;; "label_points3d" | "-label_points3d" | "--label_points3d" | "+label_points3d") COMPREPLY=( $(compgen -W "_label_size>0,_opacity >") ); return 0;; "lathe3d" | "-lathe3d" | "--lathe3d" | "+lathe3d") @@ -861,7 +908,7 @@ "tensors3d" | "-tensors3d" | "--tensors3d" | "+tensors3d") COMPREPLY=( $(compgen -W "_radius_factor>=0,_shape={_0=box_|_>=N=ellipsoid_},_radius_min>=0 >") ); return 0;; "text_pointcloud3d" | "-text_pointcloud3d" | "--text_pointcloud3d" | "+text_pointcloud3d") - COMPREPLY=( $(compgen -W "_"text1",_"text2",_smoothness >") ); return 0;; + COMPREPLY=( $(compgen -W "_\"text1\",_\"text2\",_smoothness >") ); return 0;; "text3d" | "-text3d" | "--text3d" | "+text3d") COMPREPLY=( $(compgen -W "text,_font_height>0,_depth>0,_smoothness >") ); return 0;; "texturize3d" | "-texturize3d" | "--texturize3d" | "+texturize3d") @@ -873,49 +920,49 @@ "weird3d" | "-weird3d" | "--weird3d" | "+weird3d") COMPREPLY=( $(compgen -W "_resolution>0 >") ); return 0;; "apply_parallel" | "-apply_parallel" | "--apply_parallel" | "+apply_parallel") - COMPREPLY=( $(compgen -W ""command" >") ); return 0;; + COMPREPLY=( $(compgen -W "\"command\" >") ); return 0;; "apply_parallel_channels" | "-apply_parallel_channels" | "--apply_parallel_channels" | "+apply_parallel_channels") - COMPREPLY=( $(compgen -W ""command" >") ); return 0;; + COMPREPLY=( $(compgen -W "\"command\" >") ); return 0;; "apply_parallel_overlap" | "-apply_parallel_overlap" | "--apply_parallel_overlap" | "+apply_parallel_overlap") - COMPREPLY=( $(compgen -W ""command",overlap[%],nb_threads={_0=auto_|_1_|_2_|_4_|_8_|_16_} >") ); return 0;; + COMPREPLY=( $(compgen -W "\"command\",overlap[%],nb_threads={_0=auto_|_1_|_2_|_4_|_8_|_16_} >") ); return 0;; "apply_tiles" | "-apply_tiles" | "--apply_tiles" | "+apply_tiles") - COMPREPLY=( $(compgen -W ""command",_bloc_width[%]>0,_bloc_height[%]>0,_bloc_depth[%]>0,_overlap_width[%]>=0,_overlap_height[%]>=0,_overlap_depth[%]>=0,_boundary_conditions={_0=dirichlet_|_1=neumann_|_2=periodic_|_3=mirror_} >") ); return 0;; + COMPREPLY=( $(compgen -W "\"command\",_tile_width[%]>0,_tile_height[%]>0,_tile_depth[%]>0,_overlap_width[%]>=0,_overlap_height[%]>=0,_overlap_depth[%]>=0,_boundary_conditions={_0=dirichlet_|_1=neumann_|_2=periodic_|_3=mirror_} >") ); return 0;; "apply_timeout" | "-apply_timeout" | "--apply_timeout" | "+apply_timeout") - COMPREPLY=( $(compgen -W ""command",_timeout={_0=no_timeout_|_>0=with_specified_timeout_(in_seconds)_} >") ); return 0;; + COMPREPLY=( $(compgen -W "\"command\",_timeout={_0=no_timeout_|_>0=with_specified_timeout_(in_seconds)_} >") ); return 0;; "check" | "-check" | "--check" | "+check") - COMPREPLY=( $(compgen -W "expression >") ); return 0;; + COMPREPLY=( $(compgen -W "condition >") ); return 0;; "check3d" | "-check3d" | "--check3d" | "+check3d") COMPREPLY=( $(compgen -W "_is_full_check={_0_|_1_} >") ); return 0;; "elif" | "-elif" | "--elif" | "+elif") - COMPREPLY=( $(compgen -W "boolean filename") ); return 0;; + COMPREPLY=( $(compgen -W "condition >") ); return 0;; "error" | "-error" | "--error" | "+error") COMPREPLY=( $(compgen -W "message >") ); return 0;; "eval" | "-eval" | "--eval" | "+eval") COMPREPLY=( $(compgen -W "expression >") ); return 0;; "exec" | "-exec" | "--exec" | "+exec") - COMPREPLY=( $(compgen -W "_is_verbose={_0_|_1_},"command" >") ); return 0;; + COMPREPLY=( $(compgen -W "_is_verbose={_0_|_1_},\"command\" >") ); return 0;; "for" | "-for" | "--for" | "+for") COMPREPLY=( $(compgen -W "condition >") ); return 0;; "if" | "-if" | "--if" | "+if") - COMPREPLY=( $(compgen -W "boolean filename") ); return 0;; + COMPREPLY=( $(compgen -W "condition >") ); return 0;; "mutex" | "-mutex" | "--mutex" | "+mutex") - COMPREPLY=( $(compgen -W "indice,_action={_0=unlock_|_1=lock_} >") ); return 0;; + COMPREPLY=( $(compgen -W "index,_action={_0=unlock_|_1=lock_} >") ); return 0;; "parallel" | "-parallel" | "--parallel" | "+parallel") - COMPREPLY=( $(compgen -W "_wait_threads,"command1","command2",... >") ); return 0;; + COMPREPLY=( $(compgen -W "_wait_threads,\"command1\",\"command2\",... >") ); return 0;; "progress" | "-progress" | "--progress" | "+progress") COMPREPLY=( $(compgen -W "0<=value<=100 -1") ); return 0;; "repeat" | "-repeat" | "--repeat" | "+repeat") COMPREPLY=( $(compgen -W "nb_iterations,_variable_name >") ); return 0;; "rprogress" | "-rprogress" | "--rprogress" | "+rprogress") - COMPREPLY=( $(compgen -W "0<=value<=100_|_-1_|_"command",0<=value_min<=100,0<=value_max<=100 >") ); return 0;; + COMPREPLY=( $(compgen -W "0<=value<=100_|_-1_|_\"command\",0<=value_min<=100,0<=value_max<=100 >") ); return 0;; "run" | "-run" | "--run" | "+run") - COMPREPLY=( $(compgen -W ""G\'MIC_pipeline" >") ); return 0;; + COMPREPLY=( $(compgen -W "\"G\'MIC_pipeline\" >") ); return 0;; "skip" | "-skip" | "--skip" | "+skip") COMPREPLY=( $(compgen -W "item >") ); return 0;; "status" | "-status" | "--status" | "+status") COMPREPLY=( $(compgen -W "status_string >") ); return 0;; "while" | "-while" | "--while" | "+while") - COMPREPLY=( $(compgen -W "boolean filename") ); return 0;; + COMPREPLY=( $(compgen -W "condition >") ); return 0;; "array" | "-array" | "--array" | "+array") COMPREPLY=( $(compgen -W "M>0,_N>0,_expand_type={_0=min_|_1=max_|_2=all_} >") ); return 0;; "array_fade" | "-array_fade" | "--array_fade" | "+array_fade") @@ -1007,7 +1054,7 @@ "lightrays" | "-lightrays" | "--lightrays" | "+lightrays") COMPREPLY=( $(compgen -W "100<=_density<=0,_center_x[%],_center_y[%],_ray_length>=0,_ray_attenuation>=0 >") ); return 0;; "light_relief" | "-light_relief" | "--light_relief" | "+light_relief") - COMPREPLY=( $(compgen -W "_ambient_light,_specular_lightness,_specular_size,_light_smoothness,_darkness,_xl,_yl,_zl,_zscale,_opacity_is_heightmap={_0_|_1_} >") ); return 0;; + COMPREPLY=( $(compgen -W "_ambient_light,_specular_lightness,_specular_size,_darkness,_light_smoothness,_xl,_yl,_zl,_zscale,_opacity_is_heightmap={_0_|_1_} >") ); return 0;; "linify" | "-linify" | "--linify" | "+linify") COMPREPLY=( $(compgen -W "0<=_density<=100,_spreading>=0,_resolution[%]>0,_line_opacity>=0,_line_precision>0,_mode={_0=subtractive_|_1=additive_} >") ); return 0;; "mosaic" | "-mosaic" | "--mosaic" | "+mosaic") @@ -1026,18 +1073,20 @@ COMPREPLY=( $(compgen -W "_smoothness>=0 >") ); return 0;; "rodilius" | "-rodilius" | "--rodilius" | "+rodilius") COMPREPLY=( $(compgen -W "0<=_amplitude<=100,_0<=thickness<=100,_sharpness>=0,_nb_orientations>0,_offset,_color_mode={_0=darker_|_1=brighter_} >") ); return 0;; - "stained_glass" | "-stained_glass" | "--stained_glass" | "+stained_glass") - COMPREPLY=( $(compgen -W "_edges[%]>=0,_shading>=0,_is_thin_separators={_0_|_1_} >") ); return 0;; - "stars" | "-stars" | "--stars" | "+stars") - COMPREPLY=( $(compgen -W "_density[%]>=0,_depth>=0,_size>0,_nb_branches>=1,0<=_thickness<=1,_smoothness[%]>=0,_R,_G,_B,_opacity >") ); return 0;; "sketchbw" | "-sketchbw" | "--sketchbw" | "+sketchbw") COMPREPLY=( $(compgen -W "_nb_angles>0,_start_angle,_angle_range>=0,_length>=0,_threshold>=0,_opacity,_bgfactor>=0,_density>0,_sharpness>=0,_anisotropy>=0,_smoothness>=0,_coherence>=0,_is_boost={_0_|_1_},_is_curved={_0_|_1_} >") ); return 0;; "sponge" | "-sponge" | "--sponge" | "+sponge") COMPREPLY=( $(compgen -W "_size>0 >") ); return 0;; + "stained_glass" | "-stained_glass" | "--stained_glass" | "+stained_glass") + COMPREPLY=( $(compgen -W "_edges[%]>=0,_shading>=0,_is_thin_separators={_0_|_1_} >") ); return 0;; + "stars" | "-stars" | "--stars" | "+stars") + COMPREPLY=( $(compgen -W "_density[%]>=0,_depth>=0,_size>0,_nb_branches>=1,0<=_thickness<=1,_smoothness[%]>=0,_R,_G,_B,_opacity >") ); return 0;; "stencil" | "-stencil" | "--stencil" | "+stencil") COMPREPLY=( $(compgen -W "_radius[%]>=0,_smoothness>=0,_iterations>=0 >") ); return 0;; "stencilbw" | "-stencilbw" | "--stencilbw" | "+stencilbw") COMPREPLY=( $(compgen -W "_edges>=0,_smoothness>=0 >") ); return 0;; + "stylize" | "-stylize" | "--stylize" | "+stylize") + COMPREPLY=( $(compgen -W "[style_image],_fidelity_finest,_fidelity_coarsest,_fidelity_smoothness_finest>=0,_fidelity_smoothnes_coarsest>=0,0<=_fidelity_chroma<=1,_init_type,_init_resolution>=0,init_max_gradient>=0,_patchsize_analysis>0,_patchsize_synthesis>0,_patchsize_synthesis_final>0,_nb_matches_finest>=0,_nb_matches_coarsest>=0,_penalize_repetitions>=0,_matching_precision>=0,_scale_factor>1,_skip_finest_scales>=0,\"image_matching_command\" >") ); return 0;; "tetris" | "-tetris" | "--tetris" | "+tetris") COMPREPLY=( $(compgen -W "_scale>0 >") ); return 0;; "warhol" | "-warhol" | "--warhol" | "+warhol") @@ -1071,7 +1120,7 @@ "symmetrize" | "-symmetrize" | "--symmetrize" | "+symmetrize") COMPREPLY=( $(compgen -W "_x[%],_y[%],_angle,_boundary_conditions={_0=dirichlet_|_1=neumann_|_2=periodic_|_3=mirror_},_is_antisymmetry={_0_|_1_},_swap_sides={_0_|_1_} >") ); return 0;; "transform_polar" | "-transform_polar" | "--transform_polar" | "+transform_polar") - COMPREPLY=( $(compgen -W ""expr_radius",_"expr_angle",_center_x[%],_center_y[%],_boundary_conditions={_0=dirichlet_|_1=neumann_} >") ); return 0;; + COMPREPLY=( $(compgen -W "\"expr_radius\",_\"expr_angle\",_center_x[%],_center_y[%],_boundary_conditions={_0=dirichlet_|_1=neumann_} >") ); return 0;; "twirl" | "-twirl" | "--twirl" | "+twirl") COMPREPLY=( $(compgen -W "_amplitude,_center_x[%],_center_y[%],_boundary_conditions={_0=dirichlet_|_1=neumann_|_2=periodic_|_3=mirror_} >") ); return 0;; "warp_perspective" | "-warp_perspective" | "--warp_perspective" | "+warp_perspective") @@ -1131,31 +1180,31 @@ "sub_alpha" | "-sub_alpha" | "--sub_alpha" | "+sub_alpha") COMPREPLY=( $(compgen -W "[base_image],_opacity_gain>=1 >") ); return 0;; "animate" | "-animate" | "--animate" | "+animate") - COMPREPLY=( $(compgen -W "filter_name,"param1_start,...,paramN_start","param1_end,...,paramN_end",nb_frames>=0,_output_frames={_0_|_1_},_output_filename delay>0,_back_and_forth={_0_|_1_}") ); return 0;; + COMPREPLY=( $(compgen -W "filter_name,\"param1_start,...,paramN_start\",\"param1_end,...,paramN_end\",nb_frames>=0,_output_frames={_0_|_1_},_output_filename delay>0,_back_and_forth={_0_|_1_}") ); return 0;; "apply_camera" | "-apply_camera" | "--apply_camera" | "+apply_camera") - COMPREPLY=( $(compgen -W "_"command",_camera_index>=0,_skip_frames>=0,_output_filename >") ); return 0;; + COMPREPLY=( $(compgen -W "_\"command\",_camera_index>=0,_skip_frames>=0,_output_filename >") ); return 0;; "apply_files" | "-apply_files" | "--apply_files" | "+apply_files") - COMPREPLY=( $(compgen -W ""filename_pattern",_"command",_first_frame>=0,_last_frame={_>=0_|_-1=last_},_frame_step>=1,_output_filename >") ); return 0;; + COMPREPLY=( $(compgen -W "\"filename_pattern\",_\"command\",_first_frame>=0,_last_frame={_>=0_|_-1=last_},_frame_step>=1,_output_filename >") ); return 0;; "apply_video" | "-apply_video" | "--apply_video" | "+apply_video") - COMPREPLY=( $(compgen -W "video_filename,_"command",_first_frame>=0,_last_frame={_>=0_|_-1=last_},_frame_step>=1,_output_filename >") ); return 0;; + COMPREPLY=( $(compgen -W "video_filename,_\"command\",_first_frame>=0,_last_frame={_>=0_|_-1=last_},_frame_step>=1,_output_filename >") ); return 0;; "average_files" | "-average_files" | "--average_files" | "+average_files") - COMPREPLY=( $(compgen -W ""filename_pattern",_first_frame>=0,_last_frame={_>=0_|_-1=last_},_frame_step>=1,_output_filename >") ); return 0;; + COMPREPLY=( $(compgen -W "\"filename_pattern\",_first_frame>=0,_last_frame={_>=0_|_-1=last_},_frame_step>=1,_output_filename >") ); return 0;; "average_video" | "-average_video" | "--average_video" | "+average_video") COMPREPLY=( $(compgen -W "video_filename,_first_frame>=0,_last_frame={_>=0_|_-1=last_},_frame_step>=1,_output_filename >") ); return 0;; "fade_files" | "-fade_files" | "--fade_files" | "+fade_files") - COMPREPLY=( $(compgen -W ""filename_pattern",_nb_inner_frames>0,_first_frame>=0,_last_frame={_>=0_|_-1=last_},_frame_step>=1,_output_filename >") ); return 0;; + COMPREPLY=( $(compgen -W "\"filename_pattern\",_nb_inner_frames>0,_first_frame>=0,_last_frame={_>=0_|_-1=last_},_frame_step>=1,_output_filename >") ); return 0;; "fade_video" | "-fade_video" | "--fade_video" | "+fade_video") COMPREPLY=( $(compgen -W "video_filename,_nb_inner_frames>0,_first_frame>=0,_last_frame={_>=0_|_-1=last_},_frame_step>=1,_output_filename >") ); return 0;; "files2video" | "-files2video" | "--files2video" | "+files2video") - COMPREPLY=( $(compgen -W ""filename_pattern",_output_filename,_fps>0,_codec >") ); return 0;; + COMPREPLY=( $(compgen -W "\"filename_pattern\",_output_filename,_fps>0,_codec >") ); return 0;; "median_files" | "-median_files" | "--median_files" | "+median_files") - COMPREPLY=( $(compgen -W ""filename_pattern",_first_frame>=0,_last_frame={_>=0_|_-1=last_},_frame_step>=1,_frame_rows[%]>=1,_is_fast_approximation={_0_|_1_} >") ); return 0;; + COMPREPLY=( $(compgen -W "\"filename_pattern\",_first_frame>=0,_last_frame={_>=0_|_-1=last_},_frame_step>=1,_frame_rows[%]>=1,_is_fast_approximation={_0_|_1_} >") ); return 0;; "median_video" | "-median_video" | "--median_video" | "+median_video") COMPREPLY=( $(compgen -W "video_filename,_first_frame>=0,_last_frame={_>=0_|_-1=last_},_frame_step>=1,_frame_rows[%]>=1,_is_fast_approximation={_0_|_1_} >") ); return 0;; "morph" | "-morph" | "--morph" | "+morph") COMPREPLY=( $(compgen -W "nb_inner_frames>=1,_smoothness>=0,_precision>=0 >") ); return 0;; "morph_files" | "-morph_files" | "--morph_files" | "+morph_files") - COMPREPLY=( $(compgen -W ""filename_pattern",_nb_inner_frames>0,_smoothness>=0,_precision>=0,_first_frame>=0,_last_frame={_>=0_|_-1=last_},_frame_step>=1,_output_filename >") ); return 0;; + COMPREPLY=( $(compgen -W "\"filename_pattern\",_nb_inner_frames>0,_smoothness>=0,_precision>=0,_first_frame>=0,_last_frame={_>=0_|_-1=last_},_frame_step>=1,_output_filename >") ); return 0;; "morph_video" | "-morph_video" | "--morph_video" | "+morph_video") COMPREPLY=( $(compgen -W "video_filename,_nb_inner_frames>0,_smoothness>=0,_precision>=0,_first_frame>=0,_last_frame={_>=0_|_-1=last_},_frame_step>=1,_output_filename >") ); return 0;; "register_nonrigid" | "-register_nonrigid" | "--register_nonrigid" | "+register_nonrigid") @@ -1168,6 +1217,26 @@ COMPREPLY=( $(compgen -W "_nb_frames>=2,_nb_xtiles>0,_nb_ytiles>0,_axis_x,_axis_y,_axis_z,_is_antialias={_0_|_1_} >") ); return 0;; "video2files" | "-video2files" | "--video2files" | "+video2files") COMPREPLY=( $(compgen -W "input_filename,_output_filename,_first_frame>=0,_last_frame={_>=0_|_-1=last_},_frame_step>=1 >") ); return 0;; + "nn_new_input" | "-nn_new_input" | "--nn_new_input" | "+nn_new_input") + COMPREPLY=( $(compgen -W "module_name,width,_height,_spectrum >") ); return 0;; + "nn_new_fullyconnected" | "-nn_new_fullyconnected" | "--nn_new_fullyconnected" | "+nn_new_fullyconnected") + COMPREPLY=( $(compgen -W "module_name,previous_module_name,nb_neurons,activation_function >") ); return 0;; + "nn_propagate_batch" | "-nn_propagate_batch" | "--nn_propagate_batch" | "+nn_propagate_batch") + COMPREPLY=( $(compgen -W "module_name,[inputs_zstacked] >") ); return 0;; + "nn_propagate" | "-nn_propagate" | "--nn_propagate" | "+nn_propagate") + COMPREPLY=( $(compgen -W "module_name >") ); return 0;; + "nn_backpropagate_batch" | "-nn_backpropagate_batch" | "--nn_backpropagate_batch" | "+nn_backpropagate_batch") + COMPREPLY=( $(compgen -W "module_name,[inputs_zstacked],[expected_outputs_zstacked],_insert_network_outputs={_0_|_1_},_loss_function >") ); return 0;; + "nn_backpropagate" | "-nn_backpropagate" | "--nn_backpropagate" | "+nn_backpropagate") + COMPREPLY=( $(compgen -W "module_name,[expected_output],_loss_function >") ); return 0;; + "nn_update" | "-nn_update" | "--nn_update" | "+nn_update") + COMPREPLY=( $(compgen -W "module_name,epsilon >") ); return 0;; + "nn_output" | "-nn_output" | "--nn_output" | "+nn_output") + COMPREPLY=( $(compgen -W "module_name,filename >") ); return 0;; + "nn_serialize" | "-nn_serialize" | "--nn_serialize" | "+nn_serialize") + COMPREPLY=( $(compgen -W "module_name,_is_compressed={_0_|_1_} >") ); return 0;; + "nn_input" | "-nn_input" | "--nn_input" | "+nn_input") + COMPREPLY=( $(compgen -W "\"filename\" >") ); return 0;; "alert" | "-alert" | "--alert" | "+alert") COMPREPLY=( $(compgen -W "_title,_message,_label_button1,_label_button2,... >") ); return 0;; "arg" | "-arg" | "--arg" | "+arg") @@ -1177,15 +1246,17 @@ "autocrop_coords" | "-autocrop_coords" | "--autocrop_coords" | "+autocrop_coords") COMPREPLY=( $(compgen -W "value1,value2,..._|_auto >") ); return 0;; "base642img" | "-base642img" | "--base642img" | "+base642img") - COMPREPLY=( $(compgen -W ""base64_string" >") ); return 0;; + COMPREPLY=( $(compgen -W "\"base64_string\" >") ); return 0;; "base642uchar" | "-base642uchar" | "--base642uchar" | "+base642uchar") - COMPREPLY=( $(compgen -W ""base64_string" >") ); return 0;; + COMPREPLY=( $(compgen -W "\"base64_string\" >") ); return 0;; "basename" | "-basename" | "--basename" | "+basename") COMPREPLY=( $(compgen -W "file_path,_variable_name_for_folder >") ); return 0;; "bin" | "-bin" | "--bin" | "+bin") COMPREPLY=( $(compgen -W "binary_int1,... >") ); return 0;; "bin2dec" | "-bin2dec" | "--bin2dec" | "+bin2dec") COMPREPLY=( $(compgen -W "binary_int1,... >") ); return 0;; + "covariance_colors" | "-covariance_colors" | "--covariance_colors" | "+covariance_colors") + COMPREPLY=( $(compgen -W "_avg_outvarname >") ); return 0;; "dec" | "-dec" | "--dec" | "+dec") COMPREPLY=( $(compgen -W "decimal_int1,... >") ); return 0;; "dec2str" | "-dec2str" | "--dec2str" | "+dec2str") @@ -1211,7 +1282,7 @@ "fitratio_wh" | "-fitratio_wh" | "--fitratio_wh" | "+fitratio_wh") COMPREPLY=( $(compgen -W "min_width,min_height,ratio_wh >") ); return 0;; "fitscreen" | "-fitscreen" | "--fitscreen" | "+fitscreen") - COMPREPLY=( $(compgen -W "width,height,_depth,_minimal_size[%],_maximal_size[%] >") ); return 0;; + COMPREPLY=( $(compgen -W "width,height,_depth,_minimal_size[%],_maximal_size[%] [image],_minimal_size[%],_maximal_size[%]") ); return 0;; "gcd" | "-gcd" | "--gcd" | "+gcd") COMPREPLY=( $(compgen -W "a,b >") ); return 0;; "hex" | "-hex" | "--hex" | "+hex") @@ -1219,11 +1290,15 @@ "hex2dec" | "-hex2dec" | "--hex2dec" | "+hex2dec") COMPREPLY=( $(compgen -W "hexadecimal_int1,... >") ); return 0;; "hex2img" | "-hex2img" | "--hex2img" | "+hex2img") - COMPREPLY=( $(compgen -W ""hexadecimal_string" >") ); return 0;; + COMPREPLY=( $(compgen -W "\"hexadecimal_string\" >") ); return 0;; "hex2str" | "-hex2str" | "--hex2str" | "+hex2str") COMPREPLY=( $(compgen -W "hexadecimal_string >") ); return 0;; + "img2base64" | "-img2base64" | "--img2base64" | "+img2base64") + COMPREPLY=( $(compgen -W "_encoding={_0=base64_|_1=base64url_},_store_names={_0_|_1_} >") ); return 0;; "img2text" | "-img2text" | "--img2text" | "+img2text") COMPREPLY=( $(compgen -W "_line_separator >") ); return 0;; + "is_change" | "-is_change" | "--is_change" | "+is_change") + COMPREPLY=( $(compgen -W "_value={_0=false_|_1=true_} >") ); return 0;; "is_ext" | "-is_ext" | "--is_ext" | "+is_ext") COMPREPLY=( $(compgen -W "filename,_extension >") ); return 0;; "is_image_arg" | "-is_image_arg" | "--is_image_arg" | "+is_image_arg") @@ -1232,6 +1307,10 @@ COMPREPLY=( $(compgen -W "string >") ); return 0;; "is_percent" | "-is_percent" | "--is_percent" | "+is_percent") COMPREPLY=( $(compgen -W "string >") ); return 0;; + "is_variable_name" | "-is_variable_name" | "--is_variable_name" | "+is_variable_name") + COMPREPLY=( $(compgen -W "\"str\" >") ); return 0;; + "named" | "-named" | "--named" | "+named") + COMPREPLY=( $(compgen -W "_mode,\"name1\",\"name2\",... >") ); return 0;; "normalize_filename" | "-normalize_filename" | "--normalize_filename" | "+normalize_filename") COMPREPLY=( $(compgen -W "filename >") ); return 0;; "oct" | "-oct" | "--oct" | "+oct") @@ -1240,10 +1319,14 @@ COMPREPLY=( $(compgen -W "octal_int1,... >") ); return 0;; "padint" | "-padint" | "--padint" | "+padint") COMPREPLY=( $(compgen -W "number,_size>0 >") ); return 0;; + "remove_copymark" | "-remove_copymark" | "--remove_copymark" | "+remove_copymark") + COMPREPLY=( $(compgen -W "\"image_name\" >") ); return 0;; "str" | "-str" | "--str" | "+str") COMPREPLY=( $(compgen -W "string >") ); return 0;; "str2hex" | "-str2hex" | "--str2hex" | "+str2hex") COMPREPLY=( $(compgen -W "string >") ); return 0;; + "strcapitalize" | "-strcapitalize" | "--strcapitalize" | "+strcapitalize") + COMPREPLY=( $(compgen -W "string >") ); return 0;; "strcontains" | "-strcontains" | "--strcontains" | "+strcontains") COMPREPLY=( $(compgen -W "string1,string2 >") ); return 0;; "strlen" | "-strlen" | "--strlen" | "+strlen") @@ -1252,17 +1335,17 @@ COMPREPLY=( $(compgen -W "string,search,replace >") ); return 0;; "strlowercase" | "-strlowercase" | "--strlowercase" | "+strlowercase") COMPREPLY=( $(compgen -W "string >") ); return 0;; + "struppercase" | "-struppercase" | "--struppercase" | "+struppercase") + COMPREPLY=( $(compgen -W "string >") ); return 0;; "strvar" | "-strvar" | "--strvar" | "+strvar") COMPREPLY=( $(compgen -W "string >") ); return 0;; "strver" | "-strver" | "--strver" | "+strver") COMPREPLY=( $(compgen -W "_version >") ); return 0;; + "to_clutname" | "-to_clutname" | "--to_clutname" | "+to_clutname") + COMPREPLY=( $(compgen -W "\"string\" >") ); return 0;; "uchar2base64" | "-uchar2base64" | "--uchar2base64" | "+uchar2base64") COMPREPLY=( $(compgen -W "_encoding={_0=base64_|_1=base64url_} >") ); return 0;; - "img2base64" | "-img2base64" | "--img2base64" | "+img2base64") - COMPREPLY=( $(compgen -W "_encoding={_0=base64_|_1=base64url_} >") ); return 0;; - "covariance_colors" | "-covariance_colors" | "--covariance_colors" | "+covariance_colors") - COMPREPLY=( $(compgen -W "_avg_outvarname >") ); return 0;; - "demo" | "-demo" | "--demo" | "+demo") + "demos" | "-demos" | "--demos" | "+demos") COMPREPLY=( $(compgen -W "_run_in_parallel={_0=no_|_1=yes_|_2=auto_} >") ); return 0;; "x_color_curves" | "-x_color_curves" | "--x_color_curves" | "+x_color_curves") COMPREPLY=( $(compgen -W "_colorspace={_rgb_|_cmy_|_cmyk_|_hsi_|_hsl_|_hsv_|_lab_|_lch_|_ycbcr_|_last_} >") ); return 0;; @@ -1278,6 +1361,8 @@ COMPREPLY=( $(compgen -W "_colorspace={_all_|_rgb_|_lrgb_|_ycbcr_|_lab_|_lch_|_hsv_|_hsi_|_hsl_|_cmy_|_cmyk_|_yiq_},_spatial_tolerance>=0,_color_tolerance>=0 >") ); return 0;; "x_minesweeper" | "-x_minesweeper" | "--x_minesweeper" | "+x_minesweeper") COMPREPLY=( $(compgen -W "8<=_width=<20,8<=_height<=20 >") ); return 0;; + "x_morph" | "-x_morph" | "--x_morph" | "+x_morph") + COMPREPLY=( $(compgen -W "_nb_frames>=2,_preview_fidelity={_0=coarsest_|_1=coarse_|_2=normal_|_3=fine_|_4=finest_} >") ); return 0;; "x_quantize_rgb" | "-x_quantize_rgb" | "--x_quantize_rgb" | "+x_quantize_rgb") COMPREPLY=( $(compgen -W "_nbcolors>=2 >") ); return 0;; "x_segment" | "-x_segment" | "--x_segment" | "+x_segment") @@ -1288,10 +1373,12 @@ COMPREPLY=( $(compgen -W "_variable_name,_background_curve_R,_background_curve_G,_background_curve_B >") ); return 0;; "x_select_palette" | "-x_select_palette" | "--x_select_palette" | "+x_select_palette") COMPREPLY=( $(compgen -W "_variable_name,_number_of_columns={_0=auto_|_>0_} >") ); return 0;; + "x_warp" | "-x_warp" | "--x_warp" | "+x_warp") + COMPREPLY=( $(compgen -W "_nb_keypoints_xgrid>=2,_nb_keypoints_ygrid>=2,_nb_keypoints_contours>=0,_preview_fidelity={_0=coarsest_|_1=coarse_|_2=normal_|_3=fine_|_4=finest_},_[background_image],0<=_background_opacity<=1 >") ); return 0;; "x_whirl" | "-x_whirl" | "--x_whirl" | "+x_whirl") COMPREPLY=( $(compgen -W "_opacity>=0 >") ); return 0;; "h" | "-h" | "--h" | "+h") COMPREPLY=( $(compgen -W "$coms" -- "$cur") ); return 0;; - "m" | "-m" | "--m" | "+m") COMPREPLY=( $(compgen -W "_add_debug_info={_0_|_1_},{_filename_|_http[s]://URL_|_"string"_} >") ); return 0;; + "m" | "-m" | "--m" | "+m") COMPREPLY=( $(compgen -W "_add_debug_info={_0_|_1_},{_filename_|_http[s]://URL_|_\"string\"_} >") ); return 0;; "d" | "-d" | "--d" | "+d") COMPREPLY=( $(compgen -W "_X[%]>=0,_Y[%]>=0,_Z[%]>=0,_exit_on_anykey={_0_|_1_} >") ); return 0;; "d3d" | "-d3d" | "--d3d" | "+d3d") COMPREPLY=( $(compgen -W "_[background_image],_exit_on_anykey={_0_|_1_} _exit_on_anykey={_0_|_1_}") ); return 0;; "da" | "-da" | "--da" | "+da") COMPREPLY=( $(compgen -W "_width>0,_height>0 >") ); return 0;; @@ -1303,15 +1390,17 @@ "dw" | "-dw" | "--dw" | "+dw") COMPREPLY=( $(compgen -W "_cell_size>0 >") ); return 0;; "e" | "-e" | "--e" | "+e") COMPREPLY=( $(compgen -W "message >") ); return 0;; "ig" | "-ig" | "--ig" | "+ig") COMPREPLY=( $(compgen -W "pattern >") ); return 0;; - "on" | "-on" | "--on" | "+on") COMPREPLY=( $(compgen -W "filename >") ); return 0;; + "on" | "-on" | "--on" | "+on") COMPREPLY=( $(compgen -W "filename,_index >") ); return 0;; "op" | "-op" | "--op" | "+op") COMPREPLY=( $(compgen -W "prefix >") ); return 0;; "ox" | "-ox" | "--ox" | "+ox") COMPREPLY=( $(compgen -W "extension1,_extension2,_...,_extensionN,_output_at_same_location={_0_|_1_} >") ); return 0;; - "sh" | "-sh" | "--sh" | "+sh") COMPREPLY=( $(compgen -W "x0[%],x1[%],y[%],z[%],v[%] y0[%],y1[%],z[%],v[%] z0[%],z1[%],v[%] v0[%],v1[%] v0[%] (no_arg)") ); return 0;; - "sp" | "-sp" | "--sp" | "+sp") COMPREPLY=( $(compgen -W "_name1={_?_|_apples_|_barbara_|_boats_|_bottles_|_butterfly_|_cameraman_|_car_|_cat_|_cliff_|_david_|_dog_|_duck_|_eagle_|_elephant_|_earth_|_flower_|_fruits_|_greece_|_gummy_|_house_|_inside_|_landscape_|_leaf_|_lena_|_leno_|_lion_|_mandrill_|_monalisa_|_monkey_|_parrots_|_pencils_|_peppers_|_rooster_|_rose_|_square_|_teddy_|_tiger_|_wall_|_waterfall_|_zelda_},_name2,...,_nameN,_width={_>=0_|_0_(auto)_},_height_=_{_>=0_|_0_(auto)_} (no_arg)") ); return 0;; + "sh" | "-sh" | "--sh" | "+sh") COMPREPLY=( $(compgen -W "x0[%],x1[%],y[%],z[%],c[%] y0[%],y1[%],z[%],c[%] z0[%],z1[%],c[%] c0[%],c1[%] c0[%] (no_arg)") ); return 0;; + "sp" | "-sp" | "--sp" | "+sp") COMPREPLY=( $(compgen -W "_name1={_?_|_apples_|_balloons_|_barbara_|_boats_|_bottles_|_butterfly_|_cameraman_|_car_|_cat_|_cliff_|_chick_|_colorful_|_david_|_dog_|_duck_|_eagle_|_elephant_|_earth_|_flower_|_fruits_|_gmicky_|_gmicky_mahvin_|_gmicky_wilber_|_greece_|_gummy_|_house_|_inside_|_landscape_|_leaf_|_lena_|_leno_|_lion_|_mandrill_|_monalisa_|_monkey_|_parrots_|_pencils_|_peppers_|_portrait0_|_portrait1_|_portrait2_|_portrait3_|_portrait4_|_portrait5_|_portrait6_|_portrait7_|_portrait8_|_portrait9_|_roddy_|_rooster_|_rose_|_square_|_swan_|_teddy_|_tiger_|_tulips_|_wall_|_waterfall_|_zelda_},_name2,...,_nameN,_width={_>=0_|_0_(auto)_},_height_=_{_>=0_|_0_(auto)_} (no_arg)") ); return 0;; + "um" | "-um" | "--um" | "+um") COMPREPLY=( $(compgen -W "command_name[,_command_name2,...] *") ); return 0;; "v" | "-v" | "--v" | "+v") COMPREPLY=( $(compgen -W "level {_+_|_-_}") ); return 0;; "w" | "-w" | "--w" | "+w") COMPREPLY=( $(compgen -W "_width[%]>=-1,_height[%]>=-1,_normalization,_fullscreen,_pos_x[%],_pos_y[%],_title >") ); return 0;; "mv" | "-mv" | "--mv" | "+mv") COMPREPLY=( $(compgen -W "position[%] >") ); return 0;; - "nm" | "-nm" | "--nm" | "+nm") COMPREPLY=( $(compgen -W ""name1","name2",... >") ); return 0;; + "nm" | "-nm" | "--nm" | "+nm") COMPREPLY=( $(compgen -W "\"name1\",\"name2\",... >") ); return 0;; + "rmn" | "-rmn" | "--rmn" | "+rmn") COMPREPLY=( $(compgen -W "\"name1\",\"name2\",... >") ); return 0;; "+" | "-+" | "--+" | "++") COMPREPLY=( $(compgen -W "value[%] [image] \'formula\' (no_arg)") ); return 0;; "&" | "-&" | "--&" | "+&") COMPREPLY=( $(compgen -W "value[%] [image] \'formula\' (no_arg)") ); return 0;; "<<" | "-<<" | "--<<" | "+<<") COMPREPLY=( $(compgen -W "value[%] [image] \'formula\' (no_arg)") ); return 0;; @@ -1330,16 +1419,16 @@ "|" | "-|" | "--|" | "+|") COMPREPLY=( $(compgen -W "value[%] [image] \'formula\' (no_arg)") ); return 0;; "^" | "-^" | "--^" | "+^") COMPREPLY=( $(compgen -W "value[%] [image] \'formula\' (no_arg)") ); return 0;; "-" | "--" | "---" | "+-") COMPREPLY=( $(compgen -W "value[%] [image] \'formula\' (no_arg)") ); return 0;; - "c" | "-c" | "--c" | "+c") COMPREPLY=( $(compgen -W "{_value0[%]_|_[image0]_},{_value1[%]_|_[image1]_} [image] (no_arg)") ); return 0;; + "c" | "-c" | "--c" | "+c") COMPREPLY=( $(compgen -W "{_value0[%]_|_[image0]_},{_value1[%]_|_[image1]_} [image]") ); return 0;; "f" | "-f" | "--f" | "+f") COMPREPLY=( $(compgen -W "value1,_value2,... [image] \'formula\'") ); return 0;; - "ir" | "-ir" | "--ir" | "+ir") COMPREPLY=( $(compgen -W "min[%],max[%] >") ); return 0;; - "n" | "-n" | "--n" | "+n") COMPREPLY=( $(compgen -W "{_value0[%]_|_[image0]_},{_value1[%]_|_[image1]_} [image]") ); return 0;; + "ir" | "-ir" | "--ir" | "+ir") COMPREPLY=( $(compgen -W "min[%],max[%],_include_boundaries={_0=no_|_1=yes_} >") ); return 0;; + "n" | "-n" | "--n" | "+n") COMPREPLY=( $(compgen -W "{_value0[%]_|_[image0]_},{_value1[%]_|_[image1]_},_constant_case_ratio [image]") ); return 0;; "=" | "-=" | "--=" | "+=") COMPREPLY=( $(compgen -W "value,_x[%],_y[%],_z[%],_c[%] >") ); return 0;; - "ac" | "-ac" | "--ac" | "+ac") COMPREPLY=( $(compgen -W ""command",color_channels,_value_action={_0=none_|_1=cut_|_2=normalize_} >") ); return 0;; + "ac" | "-ac" | "--ac" | "+ac") COMPREPLY=( $(compgen -W "\"command\",color_channels,_value_action={_0=none_|_1=cut_|_2=normalize_} >") ); return 0;; "fc" | "-fc" | "--fc" | "+fc") COMPREPLY=( $(compgen -W "col1,...,colN >") ); return 0;; "a" | "-a" | "--a" | "+a") COMPREPLY=( $(compgen -W "[image],axis,_centering axis,_centering") ); return 0;; - "z" | "-z" | "--z" | "+z") COMPREPLY=( $(compgen -W "x0[%],x1[%],_boundary_conditions x0[%],y0[%],x1[%],y1[%],_boundary_conditions x0[%],y0[%],z0[%],x1[%],y1[%],z1[%],_boundary_conditions x0[%],y0[%],z0[%],c0[%],x1[%],y1[%],z1[%],c1[%],_boundary_conditions (no_arg)") ); return 0;; - "r" | "-r" | "--r" | "+r") COMPREPLY=( $(compgen -W "[image],_interpolation,_boundary_conditions,_ax,_ay,_az,_ac {[image_w]_|_width>0[%]},_{[image_h]_|_height>0[%]},_{[image_d]_|_depth>0[%]},_{[image_s]_|_spectrum>0[%]},_interpolation,_boundary_conditions,_ax,_ay,_az,_ac (no_arg)") ); return 0;; + "z" | "-z" | "--z" | "+z") COMPREPLY=( $(compgen -W "x0[%],x1[%],_boundary_conditions x0[%],y0[%],x1[%],y1[%],_boundary_conditions x0[%],y0[%],z0[%],x1[%],y1[%],z1[%],_boundary_conditions x0[%],y0[%],z0[%],c0[%],x1[%],y1[%],z1[%],c1[%],_boundary_conditions") ); return 0;; + "r" | "-r" | "--r" | "+r") COMPREPLY=( $(compgen -W "[image],_interpolation,_boundary_conditions,_ax,_ay,_az,_ac {[image_w]_|_width>0[%]},_{[image_h]_|_height>0[%]},_{[image_d]_|_depth>0[%]},_{[image_s]_|_spectrum>0[%]},_interpolation,_boundary_conditions,_ax,_ay,_az,_ac") ); return 0;; "rr2d" | "-rr2d" | "--rr2d" | "+rr2d") COMPREPLY=( $(compgen -W "width>0,height>0,_mode={_0=inside_|_1=outside_|_2=padded_},0=<_interpolation<=6 >") ); return 0;; "r2dx" | "-r2dx" | "--r2dx" | "+r2dx") COMPREPLY=( $(compgen -W "width[%]>0,_interpolation,_boundary_conditions,_ax,_ay,_az,_ac >") ); return 0;; "r2dy" | "-r2dy" | "--r2dy" | "+r2dy") COMPREPLY=( $(compgen -W "height[%]>=0,_interpolation,_boundary_conditions,_ax,_ay,_az,_ac >") ); return 0;; @@ -1350,10 +1439,10 @@ "y" | "-y" | "--y" | "+y") COMPREPLY=( $(compgen -W "_axis={_x_|_y_|_z_|_c_} >") ); return 0;; "b" | "-b" | "--b" | "+b") COMPREPLY=( $(compgen -W "std_deviation>=0[%],_boundary_conditions,_kernel axes,std_deviation>=0[%],_boundary_conditions,_kernel") ); return 0;; "g" | "-g" | "--g" | "+g") COMPREPLY=( $(compgen -W "{_x_|_y_|_z_}...{_x_|_y_|_z_},_scheme (no_arg)") ); return 0;; - "j" | "-j" | "--j" | "+j") COMPREPLY=( $(compgen -W "[sprite],_x[%],_y[%],_z[%],_c[%],_opacity,_[sprite_mask],_max_opacity_mask >") ); return 0;; + "j" | "-j" | "--j" | "+j") COMPREPLY=( $(compgen -W "[sprite],_x[%|~],_y[%|~],_z[%|~],_c[%|~],_opacity,_[opacity_mask],_max_opacity_mask >") ); return 0;; "j3d" | "-j3d" | "--j3d" | "+j3d") COMPREPLY=( $(compgen -W "[object3d],_x[%],_y[%],_z,_opacity,_rendering_mode,_is_double_sided={_0_|_1_},_is_zbuffer={_0_|_1_},_focale,_light_x,_light_y,_light_z,_specular_lightness,_specular_shininess >") ); return 0;; - "t" | "-t" | "--t" | "+t") COMPREPLY=( $(compgen -W "text,_x[%],_y[%],_font_height[%]>=0,_opacity,_color1,... >") ); return 0;; - "to" | "-to" | "--to" | "+to") COMPREPLY=( $(compgen -W "text,_x[%],_y[%],_font_height[%]>0,_outline>=0,_opacity,_color1,... >") ); return 0;; + "t" | "-t" | "--t" | "+t") COMPREPLY=( $(compgen -W "text,_x[%|~],_y[%|~],_font_height[%]>=0,_opacity,_color1,... >") ); return 0;; + "to" | "-to" | "--to" | "+to") COMPREPLY=( $(compgen -W "text,_x[%|~],_y[%|~],_font_height[%]>0,_outline>=0,_opacity,_color1,... >") ); return 0;; "+3d" | "-+3d" | "--+3d" | "++3d") COMPREPLY=( $(compgen -W "tx,_ty,_tz [object3d] (no_arg)") ); return 0;; "col3d" | "-col3d" | "--col3d" | "+col3d") COMPREPLY=( $(compgen -W "R,_G,_B,_opacity >") ); return 0;; "/3d" | "-/3d" | "--/3d" | "+/3d") COMPREPLY=( $(compgen -W "factor factor_x,factor_y,_factor_z") ); return 0;; @@ -1371,16 +1460,22 @@ "s3d" | "-s3d" | "--s3d" | "+s3d") COMPREPLY=( $(compgen -W "_keep_shared_data={_0_|_1_} >") ); return 0;; "-3d" | "--3d" | "---3d" | "+-3d") COMPREPLY=( $(compgen -W "tx,_ty,_tz >") ); return 0;; "t3d" | "-t3d" | "--t3d" | "+t3d") COMPREPLY=( $(compgen -W "[ind_texture],_[ind_coords] >") ); return 0;; - "ap" | "-ap" | "--ap" | "+ap") COMPREPLY=( $(compgen -W ""command" >") ); return 0;; - "apc" | "-apc" | "--apc" | "+apc") COMPREPLY=( $(compgen -W ""command" >") ); return 0;; - "apo" | "-apo" | "--apo" | "+apo") COMPREPLY=( $(compgen -W ""command",overlap[%],nb_threads={_0=auto_|_1_|_2_|_4_|_8_|_16_} >") ); return 0;; - "at" | "-at" | "--at" | "+at") COMPREPLY=( $(compgen -W ""command",_bloc_width[%]>0,_bloc_height[%]>0,_bloc_depth[%]>0,_overlap_width[%]>=0,_overlap_height[%]>=0,_overlap_depth[%]>=0,_boundary_conditions={_0=dirichlet_|_1=neumann_|_2=periodic_|_3=mirror_} >") ); return 0;; - "x" | "-x" | "--x" | "+x") COMPREPLY=( $(compgen -W "_is_verbose={_0_|_1_},"command" >") ); return 0;; + "ap" | "-ap" | "--ap" | "+ap") COMPREPLY=( $(compgen -W "\"command\" >") ); return 0;; + "apc" | "-apc" | "--apc" | "+apc") COMPREPLY=( $(compgen -W "\"command\" >") ); return 0;; + "apo" | "-apo" | "--apo" | "+apo") COMPREPLY=( $(compgen -W "\"command\",overlap[%],nb_threads={_0=auto_|_1_|_2_|_4_|_8_|_16_} >") ); return 0;; + "at" | "-at" | "--at" | "+at") COMPREPLY=( $(compgen -W "\"command\",_tile_width[%]>0,_tile_height[%]>0,_tile_depth[%]>0,_overlap_width[%]>=0,_overlap_height[%]>=0,_overlap_depth[%]>=0,_boundary_conditions={_0=dirichlet_|_1=neumann_|_2=periodic_|_3=mirror_} >") ); return 0;; + "x" | "-x" | "--x" | "+x") COMPREPLY=( $(compgen -W "_is_verbose={_0_|_1_},\"command\" >") ); return 0;; "u" | "-u" | "--u" | "+u") COMPREPLY=( $(compgen -W "status_string >") ); return 0;; "frame" | "-frame" | "--frame" | "+frame") COMPREPLY=( $(compgen -W "size_x[%],_size_y[%],_col1,...,_colN >") ); return 0;; + "nmd" | "-nmd" | "--nmd" | "+nmd") COMPREPLY=( $(compgen -W "_mode,\"name1\",\"name2\",... >") ); return 0;; esac COMPREPLY=( $(compgen -W "$opts" -- "$cur") ) - _filedir + if type -t _filedir >/dev/null; then + _filedir + else + comptopt -o filenames 2>/dev/null + COMPREPLY=( $(compgen -f -- ${cur}) ) + fi } complete -F _gmic -o filenames gmic \ No newline at end of file Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/resources/gmic_cluts.gmz and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/resources/gmic_cluts.gmz differ Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/resources/gmic_film_cluts.gmz and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/resources/gmic_film_cluts.gmz differ diff -Nru gmic-2.4.5/resources/samples/bbq_intro2016.gmic gmic-2.9.2/resources/samples/bbq_intro2016.gmic --- gmic-2.4.5/resources/samples/bbq_intro2016.gmic 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/resources/samples/bbq_intro2016.gmic 2020-09-03 11:37:02.000000000 +0000 @@ -0,0 +1,751 @@ +#!/usr/bin/env gmic +# File : bbq_intro.gmic +# ( G'MIC commands file ) +# +# Description : Source code of the Arkham BBQ Party 2016 - Invitation intro. +# This source file has been written in less than 3 days, and +# is not intended to use optimized tricks of course :) +# +# Copyright : David Tschumperle +# ( https://tschumperle.users.greyc.fr/ ) +# +# License : CeCILL-C v1.0 +# ( http://cecill.info/licences/Licence_CeCILL-C_V1-en.html ) +# +# This software is governed by the CeCILL-C license under French law and +# abiding by the rules of distribution of free software. You can use, +# modify and/ or redistribute the software under the terms of the CeCILL-C +# license as circulated by CEA, CNRS and INRIA at the following URL +# "http://cecill.info". +# +# As a counterpart to the access to the source code and rights to copy, +# modify and redistribute granted by the license, users are provided only +# with a limited warranty and the software's author, the holder of the +# economic rights, and the successive licensors have only limited +# liability. +# +# In this respect, the user's attention is drawn to the risks associated +# with loading, using, modifying and/or developing or reproducing the +# software by the user in light of its specific status of free software, +# that may mean that it is complicated to manipulate, and that also +# therefore means that it is reserved for developers and experienced +# professionals having in-depth computer knowledge. Users are therefore +# encouraged to load and test the software's suitability as regards their +# requirements in conditions enabling the security of their systems and/or +# data to be ensured and, more generally, to use and operate it in the +# same conditions as regards security. +# +# The fact that you are presently reading this means that you have had +# knowledge of the CeCILL-C license and that you accept its terms. +# + +# Entry point when run from CLI: +v 1 go 0 + +# Main function +go : skip ${1=0} + v - + _output_video=$1 + if $1 + v + e[] "\n > Run 'BBQ Intro 2016' demo, by ARKHAM (video output mode)." v - + _go $1 + else + if isfile(['${-path_tmp}/bbq_intro2016.mp3']) else l[] + v + e[] "\n > Retrieve music from the G'MIC server..." v - + i raw:https://gmic.eu/bbq_intro2016.mp3,uchar o raw:${-path_tmp}/bbq_intro2016.mp3,uchar + v + e[] " > ... done!" v - + onfail + v + e[] " > ... failed!" v - + endl fi + v + e[] "\n > Run 'BBQ Intro 2016' demo, by ARKHAM (live mode)." v - + rm + parallel "x \"cvlc "${-path_tmp}"bbq_intro2016.mp3\"","_go $""1" + fi + +_go : + v - + w 640,400,0,"BBQ Party 2016 - Intro (Arkham)" + bbq_intro_notice + bbq_intro_intro + bbq_intro1 + bbq_intro2 + bbq_intro3 + bbq_intro4 + bbq_intro5 + bbq_intro6 + bbq_intro7 + bbq_intro8 + bbq_intro_final + if $1 o[] "bbq_intro2016.avi",25,mp4v,0 fi + v + + +outvideo : + +l + if $_output_video + 0 t. "Arkham",0,0,14,1,1 expand_xy. 1,0 f. 'if(x<0.45*w,i,1-i)' frame. 1,1,1 + -*. 255 to_rgb. + j.. .,{{-2,w}-w-2},2,0,0,0.25 rm. + r 400%,400%,1,3 + frame 2,2,128 frame 20,20,64 + w. + o "bbq_intro2016.avi",25,mp4v,1 + else + w. wait 40 + fi + if !{*} v + quit fi + rm endl + +# Notice. +#--------- +bbq_intro_notice : + 0 t. \ +"The intro you are about to watch:"\n\n\ +" - Fits in a 320x200 screen"\n\ +" (eq. to. Atari ST lowres)."\n\ +" - ...But uses more than 16 colors :)."\n\ +" - Uses our own 3D routines (no OpenGL)."\n\ +" - Has a source code of less than 750 loc."\n\ +" - Is open-source."\n\ +" - Has been written in the G'MIC"\n\ +" script language."\n\n\ +" [ More info at https://gmic.eu ]"\n\ +,0,0,15,1,255 + 320,200 j. ..,{(w-{-2,w})/2},{(h-{-2,h})/2} rm.. + to_rgb. + repeat 220 + if $><150 +f. 'y<1.8*$>' b. y,12% -*. .. + elif $>>170 +*. {max(0,1-($>-170)/20)} + else . fi + outvideo. rm. + done + rm + +# Title page. +#------------ +bbq_intro_intro : + l[] + ({'ARKHAM'}) s x + x=0 N=$! repeat $N 0 t. {$>,t},0,0,48,1,1 x$>=$x y$>=0 z$>={-3200-150*$>} x={$x+w+8} done k[50%--1] + expand_xy 6,0 dilate_circ 5 b 0.5 expand_z 1,0 isosurface3d 10% -*3d 1,1,5 rv3d + repeat $N col3d[$>] ${-RGB} done + endl + 0 t. "invites you to",0,0,48,1,1 r2dy. 18 +f. 255 to_rgb. + random3d 2500 col3d. 255 -*3d. 320,200,1000 --3d. 160,100 + l3d 0,0,-600 + t=0 + do + 320,200,1,3 + + # Starfield. + l.. s3d + r[2] 3,{2,h/3},1,1,-1 s[2] x -%[4] 1000 + +/[4] 1000 -*. -1 n. 0,2 c. 0,1 sqr. j.. . rm. + a[2-4] x + y a y + endl + j3d. ..,50%,50%,-600,1,0,0,0,240 --3d.. 0,0,{min(12,$t/10-10)} + + # Torus. + torus3d 100,30 col3d. 255,64,255 + +col3d. 64,64,255 r3d. 1,0,0,-90 -+3d. 65,0,0 + -+3d[-2,-1] c3d. + r3d. 1,1,0,{-6*$t} r3d. 0,0,1,{2*$t} + j3d.. .,{($t-200)*2}%,50%,0,0.25,3,0,0 rm. + + # Letters. + repeat $N + +r3d[$>] 1,{$>%4},1,{-${z$>}/2} + j3d.. .,{50+${x$>}},{60+${y$>}},${z$>},1,4,0,0 rm. + z$>={tl=280+6*$<;if($t}+20),-20*($t-tl))} + done + + # Presents. + if $t<280 op={max(0,min(1,($t-200)/20))} + else op={max(0,1-($t-280)/20)} + fi + j. ...,{(w-{-3,w})/2},120,0,0,$op,[-4] + + -*. {if($t<330,min(1,$t/30),max(0,1-($t-330)/30))} # Fade from/to black. + outvideo. + rm. + t={$t+1} + while $t<370 + rm + +# Fire effect +#------------- +bbq_intro1 : + + # Init image data. + s=" The BBQ\nParty 2016" + i[0] 100,32 + i[1] (0,255,255,255,255^0,0,255,255,255^0,0,0,128,255) r[1] 256,1,1,3,3 + i[2] (0,0,0;0,0,0;1,1,1;0,1,0) -*[2] 0.21 + text3d $s,33,3,1 + mv. 3 c3d[3] n3d[3] -*3d[3] 320 col3d[3] 255,205,130 db3d 0 f3d 300 + 100,100 rand. 0,255 ellipse. 50%,50%,5,5,0,1,300 b. 10 + sharpen. 1000 shrink_xy. 1 n. 0,255 to_rgb. light3d . rm. + + # Start animation loop. + angle=0 t=0 + do + correlate[0] [2] # Apply fire effect. + {0,w},1 rand. 128,256 j[0] .,0,{{0,h}-1} rm. # Add new random values at the bottom line. + +r[0] 400,200,1,1,3 map. [1] # Map fire palette + + y={max(55,200-$t)} + +r3d[3] 0,1,0,{-$angle} j3d.. .,50%,$y%,50,0.8,5,0,0 # Draw 3d object. + + -*3d. 0.25,0.16,1 j3d[0] .,50%,$y%,50,0.1,3,0,0 + rm. + angle={$angle+3} # Update 3d angle. + + r. 320,200,1,3,2 + ratio={100-2*($t-300)} + ratio={max(2/w,min($ratio,100))} + r. $ratio%,$ratio%,1,3,1 + + -*. {if($t<330,min(1,$t/30),max(0,1-($t-330)/30))} # Fade from/to black. + + r. 320,200,1,3 + + outvideo. + rm. + t={$t+1} + while $t<370 + rm + + +# Shade bobs. +#------------- +bbq_intro2 : + reset v - + t=100 + + # Start animation loop. + _t=0 + do + t={$t+0.025} + if $t>pi # Reset motions variables if necessary. + rx={u(-1,1)} ry={u(-1,1)} rz={u(-1,1)} rt={u(-1,1)} rcx={u(-0.6*0.6)} t=0 + N={120+round(u(80))} R={(2+round(u(10)))*min({*,w},{*,h})/300} + if $obj3d rm[colormap,img,obj3d] fi + {10+round(u(12))},1,1,3 noise[0] 255,2 r[0] 256,1,1,3,3 -*[0] 255 shift[0] 1 nm. colormap + (67.5;73.5;109.5;103.5;51.5;100.5;{2*$N};$N) 3,{2*$N},1,1,0 + 1,$N,1,1,5 2,$N,1,1,'y+x*$N' a[-2--1] x -z. 0,5 + 4,$N,1,1,1 y[-3--1] a[-4--1] y nm. obj3d + {{*,w}/2},{{*,h}/2} nm. img + fi + + # Compute bobs coordinates. + r={$ry+$rx*cos(6*$rz*$t)+(1-$rx)*sin(6*$rt*$t)} + (0;{30*$ry*($N-1)}) ($t;{2*pi*($N-1)/$N+$t}) r[-2,-1] 1,$N,1,1,3 + -+.. {360*sin($rz*$t)} -*.. {pi/180} + +sin[-2,-1] cos[-4,-3] -*[-4,-2] $r -*[-3,-1] $rcx -+[-4,-3] -+[-2,-1] + -*.. {{*,w}/4} -*. {{*,h}/4} a[-2,-1] x + ++. $R -.. $R a[-2,-1] y -z. 0,2 y. j[obj3d] .,0,8 rm. + + # Draw bobs, map colors and display. + j3d[img] [obj3d],50%,50%,0,-1,2,0,0 + -&[img] 255 +map[img] [colormap] + if $_t<100 -*. {min(1,$_t/30)} fi + + plane3d 320,26,1,1 ++3d. 0,25,0 + d={max(0,1.6*(545-$_t))} + --3d.. $d,0,0 -+3d. $d,0,0 + -+3d[-2,-1] + ++3d. 0,50,0 ++3d[-2,-1] 0,100,0 + -+3d[-4--1] col3d. 0 --3d. 160,100,0 + r3d. 0,0,1,{-$_t} + j3d.. .,50%,50%,-320,1,2,0,0 rm. + + if !($_t%2) outvideo. fi + rm. + _t={$_t+1} + while $_t<550 + rm + +# Landscape. +#----------- +bbq_intro3 : + W=150 H=350 + + # Generate global map + colors. + 900,900 plasma. 1,1,6 b. 0.07% n. 0,255 nm. map + +g. -*. 0.5 -+[-2,-1] n. 0,1 -^. 2 n. -150,330 + equalize[map] 256 n[map] -400,160 c[map] 0,100% # Add water. + (0,102,51;149,175,124;102,42,0;255,255,255) permute. yzcx srgb2rgb. r. 256,1,1,3,3 rgb2srgb. +n[map] 0,255 map. .. rm.. + -+. .. rm.. c. 0,255 nm. colors # Colors. + + # Pre-compute some images used on each frame. + $W,$H,1,1,'x' y. x nm. x # Increasing x. + $W,$H,1,1,'1+x+y*w' y. x nm. offsets # Offsets (+1). + $W,$H,1,1,'0.5*y' nm. gmap Mgmap={iM} # Z-increment for altitude map. + $W,$H,1,3 fc. 60,80,135 nm. ccolors # Color for the horizon. + $W,$H,1,1,'(y/$H)^2' nm. mcolors # Mask for the horizon. + $W,400,1,1,'b=h-1-$Mgmap;if(y>=b,256+(y-b)*255/(h-1-b),y*255/b)' round. # Background. + (96^16^128) (0^200^255) a[-2,-1] x r. 256,1,1,3,3 + (0^32^0) (0^64^128) a[-2,-1] x r. 256,1,1,3,3 + a[-2,-1] x map.. . rm. + nm. background + quadrangle3d[] -0.45,0,0,0.45,0,0,0.55,1,0,-0.55,1,0 -*3d. {$W/2},{$H/2} nm. viewrange3d # View range. + (64^16^0) r. $W nm. groundcolor # Ground color. + + _t=0 + do + dt={$_t/20} + + # Get part of the map to display. + t={$dt*0.03} + xm={map,w/2+(w-$H/2)/2*cos(3.1*$t)} + ym={map,h/2+(h-$H/2)/2*sin(2.8*$t)} + u={map,(w-$H/2)*cos(2.5*$t)} + v={map,(h-$H/2)*sin(9.7*$t)} + a={atan2($v,$u)*180/pi} + +r3d[viewrange3d] 0,0,1,{-$a} y. x + ({$xm+i[8]},{$xm+i[11]};{$xm+i[17]},{$xm+i[14]}^{$ym+i[9]},{$ym+i[12]};{$ym+i[18]},{$ym+i[15]}) rm.. + r. $W,$H,1,2,3 +warp[map,colors] .,0,1,0 rm... + nm.. lmap nm. lcolors + + # Add color shading and altitude to local maps. + +!=[lmap] 0 nm. ground + -+[lmap] [gmap] + j[lcolors] [ccolors],0,0,0,0,1,[mcolors] + j[lcolors] [groundcolor] + +round[lmap] f. '>m=abs(j(0,-1));if(i>m,i,-m)' nm. y0 # Compute visible top points. + +shift. 0,1 abs. -+. 1 nm. y1 # Compute visible bottom points. + -*[y0,y1] [ground] rm[ground] + r[lcolors,y0,y1] {$W*$H},1,1,100%,-1 + + # Keep only visible primitives. + +>[y0] 0 -*. [offsets] discard. 0 y. + if h # There is something to display (ground). + -. 1 +warp[x] .,0,0,0 nm. lx + warp[lcolors,y0,y1] ..,0,0,0 rm.. + + # Generate 3d object. + N={h} ({'CImg3d'},{2*$N},$N) + +a[lx] [y0],x rm[y0] +a[lx] [y1],x rm[lx,y1] a[-2,-1] y -z. 0,2 + 1,$N,1,1,2 +f. y ++. $N a[-3--1] x + mv[lcolors] $! permute. cyzx + 1,$N,1,1,1 + y[-5--1] y a[-5--1] y -*3d. -1,-1 + +j3d[background] .,{background,w-1},{background,h},0,1,1,0,0,0 rm[-3,-2] + + else # Case of nothing to display (only water). + rm[-5--1] [background] + fi + + r. {*,w},{*,h},1,3 + r. 320,200,1,3,2 + + op={if($_t<130,($_t-100)/20,1-($_t-130)/10)} + op={max(0,min(1,$op))} + text_outline. "Code : Tchoom",10,10,24,1,$op,255 + + op={if($_t<230,($_t-200)/20,1-($_t-230)/10)} + op={max(0,min(1,$op))} + text_outline. "Music : Kane Wood",120,20,24,1,$op,255 + + op={if($_t<330,($_t-300)/20,1-($_t-330)/10)} + op={max(0,min(1,$op))} + text_outline. "Moral support : Faxe",10,20,24,1,$op,255 + + b. {if($_t<440,max(0,(30-$_t*0.7)),$_t-440)} + + -*. {if($_t<460,min(1,$_t/40),max(0,1-($_t-460)/30))} # Fade from/to black. + outvideo. + rm. + _t={$_t+1} + while $_t<500 + rm + + +# Bouncing balls. +#----------------- +bbq_intro4 : + reset v - + 520,320,1,3 plasma 1,1,9 n 0,220 + N=12 + repeat $N + ball[] {round(u(32,80))},${-RGB} + t$>={u(200)} x$>={0,u(10,w-10)} h$>={u(150,300)} vx$>={if(u<0.5,1,-1)*u(1,8)} + done + mv[0] $! + (0;0.7;1) r. {-2,w},70,1,1,3 + + _t=0 + do + [$N] + repeat $N + bw={$>,w} bh={$>,h} + y={${h$>}*abs(cos(${t$>}*pi/60))-$bh/2} + dt=1 + if $y<0 d={-$y} y=0 bh={$bh-$d} bw={$bw+$d} dt={max(0.2,1-($d/$bh)^2)} else dt=1 fi + if ${x$>}+$bw/2>w + d={${x$>}+$bw/2-w} bw={$bw-$d} bh={$bh+0.5*$d} + if ${x$>}+$bw/4>w vx$>={-${vx$>}} fi + fi + if ${x$>}-$bw/2<0 + d={$bw/2-${x$>}} bw={$bw-$d} bh={$bh+0.5*$d} + if ${x$>}-$bw/4<0 vx$>={-${vx$>}} fi + fi + +r[$>] $bw,$bh,1,4,3 s. c,-3 + j... ..,{max(0,min({$N,w-$bw},${x$>}-$bw/2))},{{$N,h}-{h}-$y-70},0,0,1,.,255 rm[-2,-1] + t$>={${t$>}+$dt} + x$>={${x$>}+$dt*${vx$>}} + done + + +rows. {h-2*70},{h-1-70} mirror. y -*. [{$N+1}] + j.. .,0,{-2,h-71},0,0,0.5 rm. + r. 320,200,1,3,2 + + if $_t<90 + box3d. 30 c3d. col3d. 255 r3d. 1,0,1,{-5*$_t} j3d.. .,{40+$_t}%,50%,{-650+4*$_t},1,3,0,0 rm. + -*. {min(1,$_t/10)} + fi + if $_t>430 l. + s y,8 s={$_t-430} + repeat $! shift[$>] {if($>%2,1,-1)*2*$s}%,0,0,0,0 done + a y + water $s + endl fi + + if !($_t%2) outvideo. fi + rm. + _t={$_t+1} + while $_t<500 + rm + +# Plasma scroll +#--------------- +bbq_intro5 : + + # Init plasma backgrounds. + N=8 + repeat $N + 320,200,1,3 rand. 0,255 plasma. 1,0,7 n. 0,255 + amp={u(-40,40)} freq={round(u(2,6))} dir$>={if(u<0.5,-1,1)*round(u(1,2))} + 100%,100%,1,1,'$amp*cos(y*2*pi*$freq/h)' + done + + {w+2},100%,1,1,'x' 100%,100%,1,1,'Y=(y-80+15*cos(x/30)+10*sin(x/22));if(Y<0||Y>=50,-1,Y)' a[-2,-1] c + 0 t. "** Greetings to all Amstrad CPC / Atari ST / Amiga fans worldwide ! **",0,0,50,1,255 + b. 0.5 n. 0,255 + M={w} + + # Start animation loop. + t=0 tt={-1.5*{0,w}} _t=0 + do + dt={$t/20} + tic=$dt + + # Render interpolated background between two successive plasmas. + a={int($t)} a2={2*$a} a21={$a2+1} + b={($a+1)%$N} b2={2*$b} b21={$b2+1} + +warp[$a2] [$a21],1,0,2 + +warp[$b2] [$b21],1,0,2 + j.. .,0,0,0,0,{$t-$a} rm. + + shift[$a21] 0,${dir$a},0,0,2 # Animate plasma background. + shift[$b21] 0,${dir$b},0,0,2 + if int($t+0.005)>int($t) dir$a={if(u<0.5,-1,1)*round(u(1,3))} fi + t={($t+max(0.005,($dt-$tic))%$N)} + + # Render text scrolling. + +z.. $tt,{$tt+w-1+2} + warp. [-4],0,0,0 + r. 100%,100%,1,3 + +*. -1 -+. 255 + j... .,0,0,0,0,1,..,255 rm. + j.. .,-2,-2,0,0,1,.,255 rm. + tt={$tt+5} # Animate scrolling. + + # Display rendered frame. + r. 320,200,1,3,2 + if $_t<100 -*. {min(1,$_t/100)} fi + if $_t>850 -*. {max(0,1-($_t-850)/40)} fi + + outvideo. + rm. + _t={$_t+2} + while $_t<900 + rm + +# 3D Metaballs +#--------------- +bbq_intro6 : + 100,100 noise. 100,1 plasma. 1,0,10 r. 512,320,1,3 n. 0,1 b. 4,0 n. 0,255 + mix_channels. (0.7,0,0;0,0.9,0;0,0,1.2) c. 0,255 l3d + 0 + 24,24,24,1,'X=x-w/2;Y=y-h/2;Z=z-d/2;exp(-(X*X+Y*Y+Z*Z)/100)' + 72,72,72 M=8 mode=3 + repeat $M fx$>={g} fy$>={g} fz$>={g} done + t=0 + do + dt={$t/20} + repeat $M + x$>={w/2+0.5*(w-{2,w}-4)*cos(${fx$>}*2.2*$dt)} + y$>={h/2+0.5*(h-{2,h}-4)*sin(${fy$>}*2.2*$dt)} + z$>={d/2+0.5*(d-{2,d}-4)*sin(${fz$>}*2.2*$dt)} + done + f[3] 0 repeat $M j[3] [2],{${x$>}-{2,w/2}},{${y$>}-{2,h/2}},{${z$>}-{2,d/2}},0,-1 done + +r[3] 24,24,24,1,2 isosurface3d. 0.4 --3d. 12,12,12 -*3d. 13 rv3d. + r3d. 1,2,1,{-50*$dt} + N={i[7]} (255,255,150;200,96,164;50,150,230) r. 3,$N,1,1,3 y. j.. .,0,{{-2,h}-4*$N} # Do some color tweaks. + if !$mode circles3d.. 4 fi + if !{1,w} + 0 t. "Flat-Shading\nRules The\nWorld!",5,185,43,0.5,255,255,255 b. 0.7 n. 0,255 + +dilate. 3 +j[0] ..,5,3,0,0,0.75,.,255 mv. 1 rm[2,-2,-1] + fi + +j3d[1] ..,50%,50%,0,1,{if(!$mode,3,$mode)},0,0,300,0,0,-500,0.1,1.5 + r. 320,200,1,3,2 + + if $t<100 -*. {min(1,$t/15)} fi + if $t>400 + rotate. {(($t-400)/3)^2},0,0,{50+($t-400)}%,{50-($t-400)/3}% + -*. {max(0,1-($t-400)/50)} + fi + + outvideo. + rm[-3--1] + t={$t+1} + while $t<470 + rm + +# Rotozoom + Bump light. +#----------------------- +bbq_intro7 : + + # Create warping and color images. + 0 t. "Demomakers\n Forever !",0,0,80,1,255 expand_xy. 15,0 b. 3 + . n.. 0,1 r.. 100%,100%,1,3 + sh.. 0,0 -*. 120 rm. + sh.. 1,1 -*. 70 rm. + sh.. 0,50%,0,2 -*. 120 rm. + 25%,25%,1,1 rand. -20,20 smooth. 10,0,1,1,4 r. ..,3 b. 3 n. -100,100 + -+[-2,-1] g. xy a[-2,-1] c n. -150,150 + cursor[0] 0 + + # Create a large light image. + light=70 + 640,640 gaussian. $light n. 0,255 + t=0 + + # Start animation. + _t=0 + do + + # Manage light position and intensity. + X={round((w-{-2,w}*(1+cos(2*$t)))/2)} + Y={round((h-{-2,h}*(1+sin(2.5*$t)))/2)} + t={$t+0.02} + + # Render lightened image. + +z. $X,$Y,{$X+{-2,w}-1},{$Y+{-2,h}-1} + warp. ...,1,0,1 + r. 100%,100%,1,3 -+. [-4] c. 0,255 + r. 320,200,1,3,2 + + if $_t<100 -*. {min(1,$_t/100)} fi + if $_t>450 -*. {max(0,1-($_t-450)/20)} fi + + zoom={1.6+1.2*sin($_t/20)} + if $_t>450 zoom={$zoom/(1+0.3*($_t-450))} fi + f. " + begin(R = rot(-(180+1.7*"$_t"))/"$zoom"; C=[(50+"$_t"/5)*w/100,0.5*h]); + I((R*([x,y]-=C))+=C,0,2)" + outvideo. + rm. + _t={$_t+1} + while $_t<500 + rm + +# Image waves. +#-------------- +bbq_intro8 : + if !$! l[] # Generate fractal image + 200,200 x={-1.06-u*0.1} y={-0.26-u*0.1} + mandelbrot $x,$y,{$x+0.1},{$y+0.1},256 + 16,1,1,3,u r. 256,1,1,3,3 shift. 1 + map[0] . rm. r2dx 100 + +mirror y +mirror x -+ n 0,255 + endl else k[0] r[0] 100,100,1,3,2 fi + i[0] (20;80;0^20;80;0^20;80;0) r[0] 400,300,1,3,3 water[0] 100,2 + w={w} elevation3d. 0 rv3d. + sh. 8,{7+3*i[6]},0,0 r. 3,{h/3},1,1,-1 + (0,1,0;1,0,1;0,1,0) -/. 2 + ball[] 20,200,255,128,1,0.7,3.5 + 0 $w,$w . + l3d {$w/2},-200,-1000 sl3d 0.4 ss3d 0.8 f3d 500 time0=3 + t=0 + do + dt={$t/20} + +convolve. [3],1 -. ... rm... b. 0.8 -. {ia} # Update height map. + r. 1,{$w*$w},1,1,-1 j[2] .,2,0 r. $w,$w,1,1,-1 # Set 3d object coordinates. + [1] + if {5,h} +l[5] rows 0,2 + nb={w} + i[0] ({'CImg3d'}) i[1] ($nb,$nb) transpose[2] + (1,0;1,{$nb-1}) r. 2,$nb,1,1,3 round. + 1,{4*$nb},1,1,1 y a y + endl [4] sprites3d.. .,1 rm. -+3d[-2,-1] fi + --3d. {$w/2},{$w/2} -*3d. {0,0.9*max(w,h)/$w} # Center and scale 3d object. + r3d. 0,0,1,{if({*,b}&2,{*,x}*360/{*,w},$dt*30)} r3d. 1,0,0,120 # Get rotated 3d object. + +j3d[0] .,50%,65%,30,1,3,0,0 + r2dy. 190 frame. 1,1,255 drop_shadow. 3,3 + r. 320,200,1,4,0,0,0.5,0.5 i.. 100%,100%,1,1,200 blend[-2,-1] alpha + + if $t>400 + -. 200 rotate. {$t-400},1,0,{50-2*($t-400)}%,50% -+. 200 + fi + + 0 t. "Arkham",0,0,24,1,1 rotate. -90 100%,100%,1,3,0 j... .,2,{-3,max(5,h-7*$t)},0,0,1,.. rm[-2,-1] + 0 t. "BBQ Party - 2016",0,0,24,1,1 rotate. 90 100%,100%,1,3,0 fc. 128,32,16 j... .,292,{-3,min(h-180,7*$t-200)},0,0,1,.. rm[-2,-1] + + if $t>400 -*. {max(0,1-($t-400)/40)} fi + if $t<100 -*. {min(1,$t/40)} fi + to_rgb. + + outvideo. + + rm[-2,-1] + if ($dt-$time0)>0.3 ({u*$w};{u*$w};70;0) a[5,-1] x time0={$dt-u} fi # Insert new ball. + if {5,h} l[5,-1] # Manage ball motion and collision. + sh[0] 2,2,0,0 sh[0] 3,3,0,0 -.. . -+. 0.2 rm[-2,-1] + s[0] x repeat $!-1 coords={$<,@0-1} if {$<,@2}2620 -*. {max(0,1-($t-2620)/30)} fi # Fade out. + + if !($t%2) outvideo. fi + rm. + + xb={($xb+3)&255} + xl={($xl-3)&255} + anim={$anim+2} + r3d[-2,-1] {sin(0.5*$dt)},{cos($dt)},1,-1 + r3d... -1,0.3,0.8,-1 + t={$t+1} + while $t<2700 + rm + +# Local Variables: +# mode: sh +# End: +# +# (End of G'MIC custom commands) diff -Nru gmic-2.4.5/resources/samples/distortion.gmic gmic-2.9.2/resources/samples/distortion.gmic --- gmic-2.4.5/resources/samples/distortion.gmic 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/resources/samples/distortion.gmic 2020-09-03 11:37:02.000000000 +0000 @@ -0,0 +1,22 @@ +#!/usr/bin/env gmic +# File : distortion.gmic +# Author : David Tschumperle + +# Entry point when run from CLI: +go nm Distortion e[] "" animate 50 + +# Main function +go : + v 0 + nbf=50 + sample cat + repeat $nbf + e[] "\r > Frame "{$>+1}/$nbf + +f[0] "const boundary = 3; + const interpolation = 1; + j( w/16*cos(2*pi*"$>/$nbf" + 0.5*sin(y/50)), + h/16*sin(2*pi*"$>/$nbf" + 0.5*cos(x/30)))" + done + remove[0] + +# End of file. diff -Nru gmic-2.4.5/resources/samples/heart.gmic gmic-2.9.2/resources/samples/heart.gmic --- gmic-2.4.5/resources/samples/heart.gmic 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/resources/samples/heart.gmic 2020-09-03 11:37:02.000000000 +0000 @@ -0,0 +1,23 @@ +#!/home/dtschump/work/src/gmic/src/gmic +#!/usr/bin/env gmic +# File : heart.gmic +# Author : David Tschumperle + +# Entrypoint when run from CLI: +go nm Heart e[] "" animate 60 + +# Main function +go : + chromeball64x64 255,20,0 resize2dx[-1] 48 + split c,-3 + 600,500,1,3,"(y*[0,20,100]+(h-y)*[200,100,200])/h" .x9 + eval " + S = crop(#0); + A = crop(#1); + for (t = -pi; f = 0, t<3*pi, t+=0.02, + draw(#2+f,S,[268-15*[16*(sin(t)^3),13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t)+5],0,0],48,48,1,3,1,A,255); + f = (f+1)%10; + )" + remove[0,1] + +# End of file. \ No newline at end of file diff -Nru gmic-2.4.5/resources/samples/hello_world.gmic gmic-2.9.2/resources/samples/hello_world.gmic --- gmic-2.4.5/resources/samples/hello_world.gmic 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/resources/samples/hello_world.gmic 2020-09-03 11:37:02.000000000 +0000 @@ -0,0 +1,116 @@ +#!/usr/bin/env gmic +# +# File : hello_world.gmic +# ( G'MIC command file ) +# +# Description : Hello world example written as a G'MIC script. +# ( https://gmic.eu ) +# +# Copyright : David Tschumperle +# ( https://tschumperle.users.greyc.fr/ ) +# +# License : CeCILL-C v1.0 +# ( http://cecill.info/licences/Licence_CeCILL-C_V1-en.html ) +# +# This software is governed by the CeCILL-C license under French law and +# abiding by the rules of distribution of free software. You can use, +# modify and/ or redistribute the software under the terms of the CeCILL-C +# license as circulated by CEA, CNRS and INRIA at the following URL +# "http://cecill.info". +# +# As a counterpart to the access to the source code and rights to copy, +# modify and redistribute granted by the license, users are provided only +# with a limited warranty and the software's author, the holder of the +# economic rights, and the successive licensors have only limited +# liability. +# +# In this respect, the user's attention is drawn to the risks associated +# with loading, using, modifying and/or developing or reproducing the +# software by the user in light of its specific status of free software, +# that may mean that it is complicated to manipulate, and that also +# therefore means that it is reserved for developers and experienced +# professionals having in-depth computer knowledge. Users are therefore +# encouraged to load and test the software's suitability as regards their +# requirements in conditions enabling the security of their systems and/or +# data to be ensured and, more generally, to use and operate it in the +# same conditions as regards security. +# +# The fact that you are presently reading this means that you have had +# knowledge of the CeCILL-C license and that you accept its terms. +# + +# Entrypoint when run from CLI: +go + +# Main function +go : + verbose - # Make console output silent + local[] # Start a new empty environment + + # Create a 480x300 color background image. + 480,300,1,3," + y<0.75*h? + (a = y/h/0.75; [32*a,96*a,165*a] ): + (a = (y - 0.75*h)/0.25/h; [255*a,128*a,0] )" # Specify formula to create color gradient + text. "Try mouse buttons... Keys ESC or Q to quit",5,{h-18},13,1,255 # Add small notice at the bottom + nm. background + + # Create text sprites (normal and mirrored versions). + 0 text. " Hello\nWorld !",0,0,54,1,128,255,64,1 nm. text_color # RGBA text sprite + split. c,-3 dilate. 5 name. text_mask # Divide into two images : RGB (text_color) and dilated A (text_mask) + +mirror. y name. text_mask_shadow # Get mirrored version of the text mask for the shadow + 100%,100%,1,3 nm. text_color_shadow # RGB sprite for shadow sprite (with default color: black) + + # Initialize motion variables. + x={(w#$background-w)/2} # Position 'x' is initially at the middle of the background + y={(h#$background-h)/2} # Position 'y' is initially at the middle of the background + vy=0 vx=0 # Define x and y velocities + ax=0 ay=0 # Define x and y accelerations + + # Start animation loop. + do + +image[background] [text_color],$x,$y,0,0,1,[text_mask] # Draw text in background and returns it as a new image + y_shadow={1.5*h-$y-h#$text_color_shadow} # Compute the location for drawing the shadow + image. [text_color_shadow],$x,$y_shadow,0,0,0.3,[text_mask_shadow] # Draw shadow of the text sprite as well + window. -1,-1,0,"Hello World Demo" # Update window content with created frame + remove. # Remove the animation frame + + # Manage sprite motion and collisions. + x+=$vx vx+=$ax # Compute new x-position and x-velocity + y+=$vy vy+={0.5+$ay} # Compute new y-position and y-velocity (add 0.5 for the gravity!) + + if $x<=0" || "$x+w#$text_color>=w#$background # Detect collision with left and right borders + x={max(0,min($x,w#$background-w#$text_color))} # Constrain the x-coordinates to stay inside image + vx={-$vx} # Revert the x-velocity + fi + if $y+h#$text_color>0.75*h#$background # Detect collision with the ground + vy=-12 # Set new y-velocity (for bouncing) + fi + + ax*=0.5 ay*=0.5 # Decrease motion acceleration + + # Manage mouse events + if {*,b}&1 # Left mouse button -> Set new random accelerations + vx=0 vy=0 + ax={u(-5,5)} ay={u(-5,5)} + fi + if {*,-b}&2 # Right mouse button -> Change sprite color + repeat {text_color,s} + shared[text_color] $> # Color is changed by random normalizations of all color channels independently + normalize. 0,{u(64,255)} + remove. + done + fi + + wait[0] 20 # Wait a little bit to slow down animation (20ms) + while !{*,ESC}" && "!{*,Q}" && "{*} # Continue until keys 'ESC' or 'Q' have been pressed and window stays opened + + remove # Remove all images used for the demo + endlocal # End local environment (is empty at this point) + verbose + # Go back to previous level of verbosity + +# Local Variables: +# mode: sh +# End: +# +# (End of G'MIC custom commands) diff -Nru gmic-2.4.5/resources/samples/landscape.gmic gmic-2.9.2/resources/samples/landscape.gmic --- gmic-2.4.5/resources/samples/landscape.gmic 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/resources/samples/landscape.gmic 2020-09-03 11:37:02.000000000 +0000 @@ -0,0 +1,42 @@ +#!/usr/bin/env gmic +# File : landscape.gmic +# Author : David Tschumperle + +# Entrypoint when run from CLI: +go nm Landscape e[] "" animate 60 + +# Main function +go : + v 0 + srand 512 + + # Generate elevation map [0] and texture [1] + input 512,480 plasma[-1] 1,1,5 resize[-1] 100%,400%,1,1,0,2 blur[-1] 3 cut[-1] 40%,inf normalize[-1] 0,255 + input (0,102,51;149,175,124;102,42,0;255,255,255) permute[-1] yzcx srgb2rgb[-1] resize[-1] 256,1,1,3,3 rgb2srgb[-1] + point[-1] 0,0,0,1,64,100,200 +map[-2] [-1] rm[-2] normalize[0] 0,40 + + # Generate background image [2]. + input 1,4,1,3,"y==0?[50,0,100]:y==1?[219,140,15]:y==2?[140,18,15]:[100,0,0]" resize[-1] 400,300,1,3,3 + + # Generate frames + nbf=50 + repeat $nbf,f + e[] "\r > Frame "{$f+1}/$nbf + y={h#0/4*(1+$f/$nbf)} + ang={6*sin(2*pi*$f/$nbf)} + +rows[0,1] $y,{$y+h#0/3-1} w,h={[w,h]} + rotate[-2,-1] $ang,1,0,50%,50% + + +fill[-2] 'y/h' cut[-1] 5%,50% normalize[-1] 0,1 + input 100%,100%,1,3,'[219,140,15]/3' image[-3] [-1],0,0,0,0,1,[-2] remove[-2,-1] + + elevation3d[-1] [-2] remove[-2] reverse3d[-1] + -3d[-1] {$w/2},0,0 r3d[-1] 1,0,0,90 +3d[-1] 0,50,0 *3d[-1] {-2,4*w/$w} + +object3d[2] [-1],50%,35%,-250,1,5,0,1,300,0,-1000,-2200,0.3,0.5 remove[-2] + done + remove[0-2] + + # Quantize all frames in 256 colors with the same colormap, to avoid .gif flickering. + +colormap[50%] 256 index[^-1] [-1],0,1 remove[-1] + +# End of file. diff -Nru gmic-2.4.5/resources/samples/lissajous.gmic gmic-2.9.2/resources/samples/lissajous.gmic --- gmic-2.4.5/resources/samples/lissajous.gmic 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/resources/samples/lissajous.gmic 2020-09-03 11:37:02.000000000 +0000 @@ -0,0 +1,27 @@ +#!/usr/bin/env gmic +# File : lissajous.gmic +# Author : David Tschumperle + +# Entrypoint when run from CLI: +go nm Lissajous e[] "" animate 60 + +# Main function +go : + v 0 + 300,1,1,3,u(255) tsp , # Generate random smooth colormap + repeat 60 + e[] "\r > Frame "{$>+1}/60 + (0^0^0;64) resize. 300,300,1,3,3 # Generate background image + eval " + const dt = "$>"*0.005; + for (t = b = 0, t<3*pi, t+=0.05, # Draw balls + x = w/2 + 4*w/9*cos((3.2+3*dt)*(t + dt)); + y = h/2 + 4*h/9*sin((2.1-2*dt)*(t + dt)); + ellipse(x,y,8,8,0,0.4,I[#0,b++]); + ellipse(x+3,y-3,2,2,0,0.4,255); + ); + " + wait 20 + done rm[0] + +# End of file. diff -Nru gmic-2.4.5/resources/samples/mandelbrot.gmic gmic-2.9.2/resources/samples/mandelbrot.gmic --- gmic-2.4.5/resources/samples/mandelbrot.gmic 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/resources/samples/mandelbrot.gmic 2020-09-03 11:37:02.000000000 +0000 @@ -0,0 +1,42 @@ +#!/usr/bin/env gmic +# File : mandelbrot.gmic +# Author : David Tschumperle + +# Entrypoint when run from CLI: +go nm "Mandelbrot" e[] "" animate 60 + +# Main function +go : + v 0 + + # Create colormap. + srand 0 + input 256,1,1,3,u(255) + tsp. , + point. 0 + + # Generate frame. + target=-0.77175402641296387,0.10690001025795937 + zoom=1e-2 + nbf=100 + repeat $nbf,f + e[] "\r > Frame "$f"/"$nbf + input 512,512 + mandelbrot. {"C = ["$target"]; z = "$zoom"; [C - z, C + z ]"},16384 + map. [0] rotate. {180*cos(pi*$f/$nbf)},2,0,50%,50% + cut. 0,255 + resize. 256,192,1,3,0,0,0.5,0.5 + zoom*=0.93 + done + remove[0] + + # Make frames loop, using temporal fading. + append z + +slices. 0,10% + input 100%,100%,100%,1,'z/d' + image[0] ..,0,0,{d#0-d#2},0,1,. + slices[0] {d#2},100% + keep[0] + split z + +# End of file. diff -Nru gmic-2.4.5/resources/samples/pacman.gmic gmic-2.9.2/resources/samples/pacman.gmic --- gmic-2.4.5/resources/samples/pacman.gmic 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/resources/samples/pacman.gmic 2020-09-03 11:37:02.000000000 +0000 @@ -0,0 +1,37 @@ +#!/usr/bin/env gmic +# File : pacman.gmic +# Author : David Tschumperle + +# Entrypoint when run from CLI: +go nm Pacman e[] "" animate 60 + +# Main function +go : + v 0 + + # Create background image = [0]. + 500,300,1,3 + line 0,8%,100%,8%,1,1 + line 0,92%,100%,92%,1,1 + blur y,5%,1 * '[64,32,255]' normalize 0,255 + + # Create image of pellets = [1]. + shape_circle 30 + resize[-1] 300%,100%,1,1,0,0,0.5 W={w} + resize[-1] [-2],100%,1,1,0,2 + + # Create colormap = [2]. + (0,0,0;255,255,255;255,255,0) permute. yzcx + + nbf=20 + repeat $nbf,f + e[] "\r > Frame "{$f+1}/$nbf + [0],[0] circle[-1] 30%,50%,15%,1,2 + y={h/2-2*h*($f<$nbf/2?$f:$nbf-$f)/$nbf} + polygon[-1] 3,30%,50%,100%,$y,100%,{h-$y} + +fill[-1] 0 image[-1] [1],{w/10+2*$W*(1-$f/$nbf)},{(h-h#1)/2} + max[-2,-1] map[-1] [2] max[-1] [0] + done + remove[0-2] + +# End of file. diff -Nru gmic-2.4.5/resources/samples/rotozoom.gmic gmic-2.9.2/resources/samples/rotozoom.gmic --- gmic-2.4.5/resources/samples/rotozoom.gmic 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/resources/samples/rotozoom.gmic 2020-09-03 11:37:02.000000000 +0000 @@ -0,0 +1,33 @@ +#!/usr/bin/env gmic +# File : rotozoom.gmic +# Author : David Tschumperle + +# Entrypoint when run from CLI: +go r2dx 200%,1 nm Rotozoom e[] "" animate 70 + +# Main function +go : + v 0 + nbf=70 + sp colorful + + repeat $nbf + e[] "\r > Frame "{1+$>}"/"$nbf + 240,240,1,3," + const boundary = 2; + const interpolation = 1; + const t = "$>/$nbf"; + const pit2 = 2*pi*t; + + dx = 4*w#0*t; + dy = 3*h#0*t; + zoom = 0.35 + 0.3*sin(pit2); + angle = pit2*180/pi; + rot = rot(angle)/zoom; + + P = [ w#0,h#0 ]/2 + [ dx,dy ] + rot*[ x - w/2,y -h/2 ]; + i(#0,P)" + done + rm[0] + +# End of file. diff -Nru gmic-2.4.5/resources/samples/scrolling.gmic gmic-2.9.2/resources/samples/scrolling.gmic --- gmic-2.4.5/resources/samples/scrolling.gmic 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/resources/samples/scrolling.gmic 2020-09-03 11:37:02.000000000 +0000 @@ -0,0 +1,44 @@ +#!/usr/bin/env gmic +# File : scrolling.gmic +# Author : David Tschumperle + +# Entrypoint when run from CLI: +go nm Scrolling e[] "" animate 50 + +# Main function +go : + v 0 + srand 32 + + # Define rendering sizes. + wf,hf=512,384 + wr,hr={round(1.5*[$wf,$hf])} + + # Generate image [0] = line of text. + input 0 text "G'MIC rocks ! ",0,0,48,1,1 wt,ht={[w,h]} resize {2.5*$wr},100%,1,1,0,2 + + # Generate image [1] = color gradient. + input {10*ceil($hr/$ht)},1,1,3,u(64,255) tsp[-1] , transpose[-1] resize[-1] $wr,$hr,1,3,3 + + # Generate image [2] = 3d cube (3d object). + box3d {$wr/3} color3d[-1] 255,32,200 center3d[-1] + + # Generate animation frames. + nbf=50 + repeat $nbf,f + e[] "\r > Frame "{$f+1}/$nbf + input $wr,$hr,1,1 + repeat ceil($hr/$ht) + image[-1] [0],{w/5*cos($>/3+2*pi*$f/$nbf)-$wt*(1+$f/$nbf)},{$>*$ht} + done + +mul[1,-1] remove[-2] + rotate[-1] 25,1,0 + resize[-1] $wf,$hf,1,100%,0,0,0.5,0.5 + +fill[-1] 0 + +rotate3d[2] 1,-1,0,{180*$f/$nbf} rotate3d[-1] 0,1,0,{360*$f/$nbf} rotate3d[-1] 1,2,3,-60 + object3d[-2] [-1],50%,50%,100,1,3,0,0 + remove[-1] div[-1] 1.6 max[-2,-1] + done + keep[3--1] + +# End of file. diff -Nru gmic-2.4.5/resources/samples/template.gmic gmic-2.9.2/resources/samples/template.gmic --- gmic-2.4.5/resources/samples/template.gmic 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/resources/samples/template.gmic 2020-09-03 11:37:02.000000000 +0000 @@ -0,0 +1,269 @@ +#@gmic +#-------------------------------------------------------------------- +# +# This file illustrates how to set up a correct G'MIC filter source +# (e.g. to be included in 'gmic-community/include/' afterwards). +# +# It contains toy filters in various categories to show how things are +# working. This should be a good basis for creating your own filters +# for the G'MIC plug-in. +# +#--------------------------------------------------------------------- +# ^ Remove this header when creating your G'MIC filter source ! ^ +# ^ But keep the first line '#@gmic' (mandatory), it identifies the file +# as a G'MIC filter source ^ + +#---------------------------------------------------------------------- +# +# File : john_doe.gmic <-- Put your name as the filename. +# ( G'MIC commands file ) +# +# Description : A template file for creating new G'MIC filters. +# +# Copyright : John Doe (jd) +# ( http://en.wikipedia.org/wiki/John_Doe/ ) +# +# License : CeCILL v2.0 +# ( http://cecill.info/licences/Licence_CeCILL_V2-en.html ) +# +# This software is governed by the CeCILL license under French law and +# abiding by the rules of distribution of free software. You can use, +# modify and/ or redistribute the software under the terms of the CeCILL +# license as circulated by CEA, CNRS and INRIA at the following URL +# "http://cecill.info". +# +# As a counterpart to the access to the source code and rights to copy, +# modify and redistribute granted by the license, users are provided only +# with a limited warranty and the software's author, the holder of the +# economic rights, and the successive licensors have only limited +# liability. +# +# In this respect, the user's attention is drawn to the risks associated +# with loading, using, modifying and/or developing or reproducing the +# software by the user in light of its specific status of free software, +# that may mean that it is complicated to manipulate, and that also +# therefore means that it is reserved for developers and experienced +# professionals having in-depth computer knowledge. Users are therefore +# encouraged to load and test the software's suitability as regards their +# requirements in conditions enabling the security of their systems and/or +# data to be ensured and, more generally, to use and operate it in the +# same conditions as regards security. +# +# The fact that you are presently reading this means that you have had +# knowledge of the CeCILL license and that you accept its terms. +# +#------------------------------------------------------------------------------ +# ^ This is a regular header. Of course you can change the License with a more +# or less restrictive rules (non-commercial for instance). + +#------ Syntax rules for a G'MIC command file : +# +#*** General syntax : +# +# - Each line starting with 'command_name :' starts a new definition of the G'MIC custom command 'command_name'. +# - Each line starting with '#' is a comment line. +# - Any other line is considered as the continuation of a previously started G'MIC custom command. +# +#*** Specific rules for the command-line interface 'gmic': +# +# - A comment line starting with '#@cli' will be parsed by 'gmic' to display help for +# G'MIC custom commands (when invoked with option 'h'). More precisely : +# +# _ '#@cli :: subsection' defines a new command subsection in the displayed help. +# _ '#@cli command_name : arguments_format1 : arguments_format2 : ... : (qualifier)' +# starts a new command description. +# _ '#@cli : description' add a new description line to the current command description. +# +#*** Specific rules for the universal plug-in : +# +# - A comment line starting with '#@gui' will be parsed by the plug-in to define the filters tree. +# - A comment line starting with '#@gui_xx' will define a filter only for a specific language 'xx' +# (e.g. 'en','fr'...). +# - A comment line starting with '#@gui_xx hide(/Filter or folder name)' will hide the existing +# filter of folder for the locale 'xx'. +# - More precisely, the syntax of a '#@gui' comment line is : +# +# '#@gui Folder name' +# +# or +# +# '#@gui Command name : command, preview_command (zoom_factor)[+] [: default_input_mode] +# '#@gui : parameter1 = typedef(arguments1...), parameter2 = typedef(arguments2...)' +# '#@gui : parameter3 = typedef(arguments3...), +# +# where : +# +# 'command' is the G'MIC command name called to process the image. +# +# 'preview_command' is the G'MIC command name called to process the preview. +# +# Note that you can optionally specify a float-valued factor>=0 between parentheses at the end of +# the 'preview_command' to force the default zoom factor used by the preview for this filter. +# Use (0) for a 1:1 preview, (1) for previewing the whole image, (2) for 1/2 image and so on... +# You can also put an additional '+' sign after the parenthesis to specify the rendered preview +# is still accurate for different zoom factors. +# +# 'default_input_mode' set the default input mode for that filter. It can be +# { x=none | .=active (default) | *=all | +=active & below | -=active & above | v=all visible | i=all invisible } +# +# 'parameter = typedef' tells about the names, types and default values of the filter parameters. +# +# 'typedef' can be : +# +# _ 'bool(default_value={ 0 | 1 | false | true })': +# Add a boolean parameter (0 or 1) (as a checkbutton). +# +# _ 'button(_alignment)': +# Add a boolean parameter (0 or 1) (as a button). +# +# _ 'choice(_default_index,Choice0,..,ChoiceN)': +# Add a integer parameter (as a combobox). +# +# _ 'color(R,_G,_B,_A)': +# Add R,G,B[,A] parameters (as a colorchooser). +# +# _ 'point(_X,_Y,_removable={ -1 | 0 | 1 },_burst={ 0 | 1 },_R,_G,_B,_[-]A,_radius[%])': +# Add X,Y parameters (as a moveable point over the preview). +# +# _ 'value(value)': +# Add a pre-defined value parameter (not displayed). +# +# _ 'file[_in,_out](_default_filename)': +# Add a filename parameter (as a filechooser). +# +# _ 'float(default_value,min_value,max_value)': +# Add a float-valued parameter (as a float slider). +# +# _ 'folder(_default_foldername)': +# Add a foldername parameter (as a folderchooser). +# +# _ 'int(default_value,min_value,max_value)': +# Add a integer parameter (as an integer slider). +# +# _ 'link(_alignment,_label,URL)': +# Display a URL (do not add a parameter). +# +# _ 'note(_label)': +# Display a label (do not add a parameter). +# +# _ 'text(_is_multiline={ 0 | 1 },_default text)': +# Add a single or multi-line text parameter (as a text entry). +# +# _ 'separator()': +# Display an horizontal separator (do not add a parameter). +# +# Type separators '()' can be replaced by '[]' or '{}' if necessary (for instance if parentheses are required in +# an argument of the typedef, e.g in a text). You can also replace 'typedef' by '_typedef' to tell the plug-in not +# to update the image preview when the corresponding parameter is modified. +# After the closing separator, you may specify a 'visibility state' character for the parameter, which can be +# { _0=Hidden | _1=Grayed-out | _2=Visible (default) }, opt. followed by a propagation character that tells +# if this visibility state must be propagated to neighboring non-valued interface widgets +# (s.a. separator(), link() or note()). +# This propagation character can be: +# { '+'=propagate forward | '-'=propagate backward | '*'=propagate in both directions }. +# +# Use '_none_' as a special command or preview_command to tell the plug-in that the entry requires no G'MIC call. +# +# A G'MIC command can set new values for each filter parameter, through the status (see command 'status'). +# To do so, the returned status must follow the syntax : +# '{params1}{params2}{..}{paramsN}' where N must be exactly equal to the number of parameters +# for the current filter. Optionnally, you can append to each {param} its visibility state suffix ( e.g: {param}_1 ). +# +# A G'MIC command can also specify the output blending mode, the opacity and the position of each of the output image +# (i.e. layer in the plug-in). To do so, set the image name to something like: +# 'mode(grainmerge),opacity(50),pos(30,50),name(name)'. +# +# - Blending mode name should be the same as the argument of the 'blend' command. +# - Opacity is a float number in [0,100]. +# - X and Y positions are integers. +# - 'name' is the layer name. +# +#----------------------------------------------------------------------------------------------------------------------- + +# The filters below will go the the 'Testing / John Doe' category. This is a good 'standard' location +# for placing new filters that are still in testing mode. +# Once considered as stable, such filters can be moved to one of the existing (considered as 'stable') category +# (e.g. 'Artistics' or 'Details', or moved in a brand new category if no one corresponds to the topic of the filters. + +#------------------------------------ +#@gui Testing +#@gui John Doe +#------------------------------------ + +#@gui About : _none_, jd_about +#@gui : note = note{" +#@gui : ( John Doe's Filter Set for G'MIC)\n\nis proposed to you by"} +#@gui : note = link("John Doe","http://en.wikipedia.org/wiki/John_Doe/") +#@gui : note = link{"( Affiliation )","http://www.affiliation_url.org"} +#@gui : note = note{"\n"} +#@gui : sep = separator() +#@gui : note = note{" +#@gui : The source code of this set of filters is available at :"} +#@gui : note = link("http://www.filters_url.org/template.gmic") +#@gui : "} +#@gui : sep = separator() +jd_about : + fx_logo "John Doe's Filters" + +# ^ Please prefix all your G'MIC commands with your initials, so it reduce possible name conflicts with commands defined in other sources ! + +#@gui Toy filter : jd_toyfilter, jd_toyfilter_preview(0) +#@gui : Smoothness = float(0,0,10) +#@gui : Mirror = choice("X","Y","XY") +#@gui : sep = separator(), Preview type = choice("Full","Forward horizontal","Forward vertical","Backward horizontal","Backward vertical","Duplicate top","Duplicate left","Duplicate bottom","Duplicate right","Duplicate horizontal","Duplicate vertical","Checkered","Checkered inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) +#@gui : sep = separator(), note = note("Author : First_name Last_name. Latest update: 12/29/2010.") +jd_toyfilter : + blur $1 + if $2==0 mirror x + elif $2==1 mirror y + else mirror xy + endif + +jd_toyfilter_preview : + gui_split_preview "jd_toyfilter ${1--2}",${-3--1} + +#@gui __ +# ^ The line above allows to goes 2 levels up, so exit the 'Testing / John Doe' folders. +# Now, the parser considers you are located in the root path of the filter tree. +#---------------------------------------------------------------------------------------- + + +# The filters below will go the the 'Various' folder. +# Put filters in regular locations only when you are sure that everything is working well, +# as many users will possibly experience your filter ! + +#------------------------------------ +#@gui Various +#------------------------------------ +#@gui Extr'artistic : jd_xtrartistic, jd_xtrartistic_preview(1) +#@gui : Smoothness = float(10,0,30) +#@gui : Sharpness = float(100,0,500) +#@gui : sep = separator(), Preview type = choice("Full","Forward horizontal","Forward vertical","Backward horizontal","Backward vertical","Duplicate top","Duplicate left","Duplicate bottom","Duplicate right","Duplicate horizontal","Duplicate vertical","Checkered","Checkered inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) +#@gui : sep = separator(), note = note("Author : First_name Last_name. Latest update: 12/29/2010.") +jd_xtrartistic : + blur $1 sharpen {100*$2} + +jd_xtrartistic_preview : + gui_split_preview "jd_xtrartistic ${1--2}",${-3--1} + +#@gui _ +# ^ The line above allows to goes 1 level up, so exit the 'Various' folder. +# Now, the parser considers you are located in the root path of the filter tree. +# .... You get the idea .... + +# A last important note : to be able to test your external filter source, copy it as +# '$HOME/.gmic' (for Unix-like OS) or '%APPDATA/gmic' (for Windows-like OS). It +# will be considered as 'local' filter source by the plug-in. Once everything is working +# fine, you may want to submit your G'MIC filter source to the 'gmic-community' repository +# (with a pull-request): +# +# https://github.com/dtschump/gmic-community/ +# +# Thanks for your participation. + + +# Local Variables: +# mode: sh +# End: +# +# (End of G'MIC custom commands) diff -Nru gmic-2.4.5/resources/samples/torus3d.gmic gmic-2.9.2/resources/samples/torus3d.gmic --- gmic-2.4.5/resources/samples/torus3d.gmic 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/resources/samples/torus3d.gmic 2020-09-03 11:37:02.000000000 +0000 @@ -0,0 +1,38 @@ +#!/usr/bin/env gmic +# File : torus3d.gmic +# Author : David Tschumperle + +# Entry point when run from CLI: +go nm "Torus 3D" e[] "" animate 60 + +# Main function +go : + v 0 + + # Create 3d textured double-torus object. + srand 16 + repeat 2 + torus3d 70,20 100,100,1,3 + plasma[-1] 1,1,3 normalize[-1] 0,255 equalize[-1] 256 # Generate plasma texture + +fill_color[-1] ${-RGB} image[-2] [-1],0,0,0,0,0.6 # Tint it a little bit with a random color + texturize3d[-3] [-2] + remove[-2,-1] + done + rotate3d[-1] 1,0,0,90 +3d[-1] 80,0,0 # Shift and merge torii + +3d center3d rotate3d 1,0,0,30 *3d 2 + + # Create background image. + 600,600,1,3 plasma[-1] 1,1 normalize[-1] 0,255 *[-1] '[0.2,0.3,0.7]' + + # Generate animation frames. + repeat 45 + e[] "\r > Frame "{$>+1}/45 + +water[1] 100 + object3d[-1] [0],50%,50%,0,1,5,0 + rotate3d[0] 1,2,3,8 + done + + remove[0,1] # Remove 3d object + background + r2dx 50% # Anti-alias frames + +# End of file. diff -Nru gmic-2.4.5/src/CImg.h gmic-2.9.2/src/CImg.h --- gmic-2.4.5/src/CImg.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/src/CImg.h 2020-09-03 11:37:05.000000000 +0000 @@ -3,11 +3,11 @@ # File : CImg.h # ( C++ header file ) # - # Description : The C++ Template Image Processing Toolkit. + # Description : C++ Template Image Processing Toolkit. # This file is the main component of the CImg Library project. # ( http://cimg.eu ) # - # Project manager : David Tschumperle. + # Project manager : David Tschumperlé # ( http://tschumperle.users.greyc.fr/ ) # # A complete list of contributors is available in file 'README.txt' @@ -18,17 +18,17 @@ # # CeCILL-C # The CeCILL-C license is close to the GNU LGPL. - # ( http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html ) + # ( http://cecill.info/licences/Licence_CeCILL-C_V1-en.html ) # # or CeCILL v2.1 # The CeCILL license is compatible with the GNU GPL. - # ( http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html ) + # ( http://cecill.info/licences/Licence_CeCILL_V2.1-en.html ) # # This software is governed either by the CeCILL or the CeCILL-C license # under French law and abiding by the rules of distribution of free software. # You can use, modify and or redistribute the software under the terms of # the CeCILL or CeCILL-C licenses as circulated by CEA, CNRS and INRIA - # at the following URL: "http://www.cecill.info". + # at the following URL: "http://cecill.info". # # As a counterpart to the access to the source code and rights to copy, # modify and redistribute granted by the license, users are provided only @@ -54,7 +54,7 @@ // Set version number of the library. #ifndef cimg_version -#define cimg_version 245 +#define cimg_version 292 /*----------------------------------------------------------- # @@ -186,6 +186,7 @@ #include #include #include +enum {FALSE_WIN = 0}; #endif // Look for C++11 features. @@ -281,22 +282,25 @@ #error (should be { 0=quiet | 1=console | 2=dialog | 3=console+warnings | 4=dialog+warnings }). #endif -// Configure display framework. +// Configure OpenMP support. +// (http://www.openmp.org) // -// Define 'cimg_display' to: '0' to disable display capabilities. -// '1' to use the X-Window framework (X11). -// '2' to use the Microsoft GDI32 framework. -#ifndef cimg_display -#if cimg_OS==0 -#define cimg_display 0 -#elif cimg_OS==1 -#define cimg_display 1 -#elif cimg_OS==2 -#define cimg_display 2 +// Define 'cimg_use_openmp' to enable OpenMP support (requires OpenMP 3.0+). +// +// OpenMP directives are used in many CImg functions to get +// advantages of multi-core CPUs. +#if !defined(cimg_use_openmp) +#ifdef _OPENMP +#define cimg_use_openmp 1 +#else +#define cimg_use_openmp 0 #endif -#elif !(cimg_display==0 || cimg_display==1 || cimg_display==2) -#error CImg Library: Configuration variable 'cimg_display' is badly defined. -#error (should be { 0=none | 1=X-Window (X11) | 2=Microsoft GDI32 }). +#endif +#if cimg_use_openmp!=0 +#include +#define cimg_pragma_openmp(p) cimg_pragma(omp p) +#else +#define cimg_pragma_openmp(p) #endif // Configure the 'abort' signal handler (does nothing by default). @@ -305,50 +309,50 @@ // // where 'is_abort' is a boolean variable defined somewhere in your code and reachable in the method. // 'cimg_abort_test2' does the same but is called more often (in inner loops). -#if defined(cimg_abort_test) && defined(cimg_use_openmp) +#if defined(cimg_abort_test) && cimg_use_openmp!=0 // Define abort macros to be used with OpenMP. -#ifndef _cimg_abort_init_omp -#define _cimg_abort_init_omp bool _cimg_abort_go_omp = true; cimg::unused(_cimg_abort_go_omp) +#ifndef _cimg_abort_init_openmp +#define _cimg_abort_init_openmp bool _cimg_abort_go_openmp = true; cimg::unused(_cimg_abort_go_openmp) #endif -#ifndef _cimg_abort_try_omp -#define _cimg_abort_try_omp if (_cimg_abort_go_omp) try +#ifndef _cimg_abort_try_openmp +#define _cimg_abort_try_openmp if (_cimg_abort_go_openmp) try #endif -#ifndef _cimg_abort_catch_omp -#define _cimg_abort_catch_omp catch (CImgAbortException&) { cimg_pragma(omp atomic) _cimg_abort_go_omp&=false; } +#ifndef _cimg_abort_catch_openmp +#define _cimg_abort_catch_openmp catch (CImgAbortException&) { cimg_pragma(omp atomic) _cimg_abort_go_openmp&=false; } #endif -#ifdef cimg_abort_test2 -#ifndef _cimg_abort_try_omp2 -#define _cimg_abort_try_omp2 _cimg_abort_try_omp +#ifndef _cimg_abort_catch_fill_openmp +#define _cimg_abort_catch_fill_openmp \ + catch (CImgException& e) { cimg_pragma(omp critical(abort)) CImg::string(e._message).move_to(is_error); \ + cimg_pragma(omp atomic) _cimg_abort_go_openmp&=false; } #endif -#ifndef _cimg_abort_catch_omp2 -#define _cimg_abort_catch_omp2 _cimg_abort_catch_omp +#ifdef cimg_abort_test2 +#ifndef _cimg_abort_try_openmp2 +#define _cimg_abort_try_openmp2 _cimg_abort_try_openmp #endif -#ifndef _cimg_abort_catch_fill_omp -#define _cimg_abort_catch_fill_omp \ - catch (CImgException& e) { cimg_pragma(omp critical(abort)) CImg::string(e._message).move_to(is_error); \ - cimg_pragma(omp atomic) _cimg_abort_go_omp&=false; } +#ifndef _cimg_abort_catch_openmp2 +#define _cimg_abort_catch_openmp2 _cimg_abort_catch_openmp #endif #endif #endif -#ifndef _cimg_abort_init_omp -#define _cimg_abort_init_omp +#ifndef _cimg_abort_init_openmp +#define _cimg_abort_init_openmp #endif -#ifndef _cimg_abort_try_omp -#define _cimg_abort_try_omp +#ifndef _cimg_abort_try_openmp +#define _cimg_abort_try_openmp #endif -#ifndef _cimg_abort_catch_omp -#define _cimg_abort_catch_omp +#ifndef _cimg_abort_catch_openmp +#define _cimg_abort_catch_openmp #endif -#ifndef _cimg_abort_try_omp2 -#define _cimg_abort_try_omp2 +#ifndef _cimg_abort_try_openmp2 +#define _cimg_abort_try_openmp2 #endif -#ifndef _cimg_abort_catch_omp2 -#define _cimg_abort_catch_omp2 +#ifndef _cimg_abort_catch_openmp2 +#define _cimg_abort_catch_openmp2 #endif -#ifndef _cimg_abort_catch_fill_omp -#define _cimg_abort_catch_fill_omp +#ifndef _cimg_abort_catch_fill_openmp +#define _cimg_abort_catch_fill_openmp #endif #ifndef cimg_abort_init #define cimg_abort_init @@ -360,6 +364,24 @@ #define cimg_abort_test2 #endif +// Configure display framework. +// +// Define 'cimg_display' to: '0' to disable display capabilities. +// '1' to use the X-Window framework (X11). +// '2' to use the Microsoft GDI32 framework. +#ifndef cimg_display +#if cimg_OS==0 +#define cimg_display 0 +#elif cimg_OS==1 +#define cimg_display 1 +#elif cimg_OS==2 +#define cimg_display 2 +#endif +#elif !(cimg_display==0 || cimg_display==1 || cimg_display==2) +#error CImg Library: Configuration variable 'cimg_display' is badly defined. +#error (should be { 0=none | 1=X-Window (X11) | 2=Microsoft GDI32 }). +#endif + // Include display-specific headers. #if cimg_display==1 #include @@ -379,20 +401,6 @@ #define cimg_appname "CImg" #endif -// Configure OpenMP support. -// (http://www.openmp.org) -// -// Define 'cimg_use_openmp' to enable OpenMP support (requires OpenMP 3.0+). -// -// OpenMP directives are used in many CImg functions to get -// advantages of multi-core CPUs. -#ifdef cimg_use_openmp -#include -#define cimg_pragma_openmp(p) cimg_pragma(omp p) -#else -#define cimg_pragma_openmp(p) -#endif - // Configure OpenCV support. // (http://opencv.willowgarage.com/wiki/) // @@ -409,9 +417,23 @@ #undef False #define _cimg_redefine_False #endif +#ifdef Status +#undef Status +#define _cimg_redefine_Status +#endif #include -#include "cv.h" -#include "highgui.h" +#include +#if CV_MAJOR_VERSION>=3 +#define _cimg_fourcc cv::VideoWriter::fourcc +#define _cimg_cap_prop_frame_width cv::VideoCaptureProperties::CAP_PROP_FRAME_WIDTH +#define _cimg_cap_prop_frame_height cv::VideoCaptureProperties::CAP_PROP_FRAME_HEIGHT +#define _cimg_cap_prop_frame_count cv::VideoCaptureProperties::CAP_PROP_FRAME_COUNT +#else +#define _cimg_fourcc CV_FOURCC +#define _cimg_cap_prop_frame_width CV_CAP_PROP_FRAME_WIDTH +#define _cimg_cap_prop_frame_height CV_CAP_PROP_FRAME_HEIGHT +#define _cimg_cap_prop_frame_count CV_CAP_PROP_FRAME_COUNT +#endif #endif // Configure LibPNG support. @@ -540,11 +562,20 @@ // OpenEXR library may be used to get a native support of '.exr' files. // (see methods 'CImg::{load,save}_exr()'). #ifdef cimg_use_openexr +#if __GNUC__>=5 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated" +#pragma GCC diagnostic ignored "-Wdeprecated-copy" +#pragma GCC diagnostic ignored "-Wshadow" +#endif #include "ImfRgbaFile.h" #include "ImfInputFile.h" #include "ImfChannelList.h" #include "ImfMatrixAttribute.h" #include "ImfArray.h" +#if __GNUC__>=5 +#pragma GCC diagnostic pop +#endif #endif // Configure TinyEXR support. @@ -628,7 +659,7 @@ // Macros to define program usage, and retrieve command line arguments. #define cimg_usage(usage) cimg_library_suffixed::cimg::option((char*)0,argc,argv,(char*)0,usage,false) #define cimg_help(str) cimg_library_suffixed::cimg::option((char*)0,argc,argv,str,(char*)0) -#define cimg_option(name,defaut,usage) cimg_library_suffixed::cimg::option(name,argc,argv,defaut,usage) +#define cimg_option(name,_default,usage) cimg_library_suffixed::cimg::option(name,argc,argv,_default,usage) // Macros to define and manipulate local neighborhoods. #define CImg_2x2(I,T) T I[4]; \ @@ -697,6 +728,55 @@ I##pcn = I##ccn = I##ncn = \ I##pnn = I##cnn = I##nnn = 0 +#define cimg_def2x2(img,x,y) \ + int _n1##x = x<(img).width() - 1?x + 1:(img).width() - 1, \ + _n1##y = y<(img).height() - 1?y + 1:(img).height() - 1 + +#define cimg_def3x3(img,x,y) \ + cimg_def2x2(img,x,y); \ + int _p1##x = x>1?x - 1:0, \ + _p1##y = y>1?y - 1:0 + +#define cimg_def4x4(img,x,y) \ + cimg_def3x3(img,x,y); \ + int _n2##x = x<(img).width() - 2?x + 2:(img).width() - 1, \ + _n2##y = y<(img).height() - 2?y + 2:(img).height() - 1 + +#define cimg_def5x5(img,x,y) \ + cimg_def4x4(img,x,y); \ + int _p2##x = x>2?x - 2:0, \ + _p2##y = y>2?y - 2:0 + +#define cimg_def6x6(img,x,y) \ + cimg_def5x5(img,x,y); \ + int _n3##x = x<(img).width() - 3?x + 3:(img).width() - 1, \ + _n3##y = y<(img).height() - 3?y + 3:(img).height() - 1 + +#define cimg_def7x7(img,x,y) \ + cimg_def6x6(img,x,y); \ + int _p3##x = x>3?x - 3:0, \ + _p3##y = y>3?y - 3:0 + +#define cimg_def8x8(img,x,y) \ + cimg_def7x7(img,x,y); \ + int _n4##x = x<(img).width() - 4?x + 4:(img).width() - 1, \ + _n4##y = y<(img).height() - 4?y + 4:(img).height() - 1 + +#define cimg_def9x9(img,x,y) \ + cimg_def8x8(img,x,y); \ + int _p4##x = x>4?x - 4:0, \ + _p4##y = y>4?y - 4:0 + +#define cimg_def2x2x2(img,x,y,z) \ + cimg_def2x2(img,x,y); \ + int _n1##z = z<(img).depth() - 1?z + 1:(img).depth() - 1 + +#define cimg_def3x3x3(img,x,y,z) \ + cimg_def2x2x2(img,x,y,z); \ + int _p1##x = x>1?x - 1:0, \ + _p1##y = y>1?y - 1:0, \ + _p1##z = z>1?z - 1:0 + #define cimg_get2x2(img,x,y,z,c,I,T) \ I[0] = (T)(img)(x,y,z,c), I[1] = (T)(img)(_n1##x,y,z,c), I[2] = (T)(img)(x,_n1##y,z,c), \ I[3] = (T)(img)(_n1##x,_n1##y,z,c) @@ -2190,7 +2270,7 @@ /** This namespace is defined to avoid functions and class names collisions that could happen with the inclusion of other C++ header files. - Anyway, it should not happen often and you should reasonnably start most of your + Anyway, it should not happen often and you should reasonably start most of your \CImg-based programs with \code #include "CImg.h" @@ -2207,12 +2287,12 @@ struct CImgException; // Declare cimg:: namespace. - // This is an uncomplete namespace definition here. It only contains some + // This is an incomplete namespace definition here. It only contains some // necessary stuff to ensure a correct declaration order of the classes and functions // defined afterwards. namespace cimg { - // Define Ascii sequences for colored terminal output. + // Define character sequences for colored terminal output. #ifdef cimg_use_vt100 static const char t_normal[] = { 0x1b, '[', '0', ';', '0', ';', '0', 'm', 0 }; static const char t_black[] = { 0x1b, '[', '0', ';', '3', '0', ';', '5', '9', 'm', 0 }; @@ -2390,16 +2470,17 @@ #endif // Display a simple dialog box, and wait for the user's response. - inline int dialog(const char *const title, const char *const msg, const char *const button1_label="OK", - const char *const button2_label=0, const char *const button3_label=0, - const char *const button4_label=0, const char *const button5_label=0, - const char *const button6_label=0, const bool centering=false); + inline int dialog(const char *const title, const char *const msg, + const char *const button1_label="OK", const char *const button2_label=0, + const char *const button3_label=0, const char *const button4_label=0, + const char *const button5_label=0, const char *const button6_label=0, + const bool centering=false); // Evaluate math expression. inline double eval(const char *const expression, const double x=0, const double y=0, const double z=0, const double c=0); - } + } // namespace cimg { ... /*--------------------------------------- # @@ -2434,7 +2515,7 @@ const float value = img.at(0); // Try to read first pixel value (does not exist) \endcode - - \b CImgIOException: Thrown when an error occured when trying to load or save image files. + - \b CImgIOException: Thrown when an error occurred when trying to load or save image files. This happens when trying to read files that do not exist or with invalid formats. For instance, the following example throws a \c CImgIOException: \code @@ -2508,7 +2589,7 @@ } //! Return a C-string containing the error message associated to the thrown exception. const char *what() const throw() { return _message; } - }; + }; // struct CImgException { ... // The CImgAbortException class is used to throw an exception when // a computationally-intensive function has been aborted by an external signal. @@ -2532,37 +2613,37 @@ } //! Return a C-string containing the error message associated to the thrown exception. const char *what() const throw() { return _message; } - }; + }; // struct CImgAbortException { ... // The CImgArgumentException class is used to throw an exception related // to invalid arguments encountered in a library function call. struct CImgArgumentException : public CImgException { CImgArgumentException(const char *const format, ...) { _cimg_exception_err("CImgArgumentException",true); } - }; + }; // struct CImgArgumentException { ... // The CImgDisplayException class is used to throw an exception related // to display problems encountered in a library function call. struct CImgDisplayException : public CImgException { CImgDisplayException(const char *const format, ...) { _cimg_exception_err("CImgDisplayException",false); } - }; + }; // struct CImgDisplayException { ... // The CImgInstanceException class is used to throw an exception related // to an invalid instance encountered in a library function call. struct CImgInstanceException : public CImgException { CImgInstanceException(const char *const format, ...) { _cimg_exception_err("CImgInstanceException",true); } - }; + }; // struct CImgInstanceException { ... // The CImgIOException class is used to throw an exception related // to input/output file problems encountered in a library function call. struct CImgIOException : public CImgException { CImgIOException(const char *const format, ...) { _cimg_exception_err("CImgIOException",true); } - }; + }; // struct CImgIOException { ... // The CImgWarningException class is used to throw an exception for warnings // encountered in a library function call. struct CImgWarningException : public CImgException { CImgWarningException(const char *const format, ...) { _cimg_exception_err("CImgWarningException",false); } - }; + }; // struct CImgWarningException { ... /*------------------------------------- # @@ -2593,6 +2674,7 @@ static bool is_float() { return false; } static bool is_inf(const T) { return false; } static bool is_nan(const T) { return false; } + static bool is_finite(const T) { return true; } static T min() { return ~max(); } static T max() { return (T)1<<(8*sizeof(T) - 1); } static T inf() { return max(); } @@ -2607,6 +2689,7 @@ static bool is_float() { return false; } static bool is_inf(const bool) { return false; } static bool is_nan(const bool) { return false; } + static bool is_finite(const bool) { return true; } static bool min() { return false; } static bool max() { return true; } static bool inf() { return max(); } @@ -2622,6 +2705,7 @@ static bool is_float() { return false; } static bool is_inf(const unsigned char) { return false; } static bool is_nan(const unsigned char) { return false; } + static bool is_finite(const unsigned char) { return true; } static unsigned char min() { return 0; } static unsigned char max() { return (unsigned char)-1; } static unsigned char inf() { return max(); } @@ -2638,6 +2722,7 @@ static bool is_float() { return false; } static bool is_inf(const char) { return false; } static bool is_nan(const char) { return false; } + static bool is_finite(const char) { return true; } static char min() { return 0; } static char max() { return (char)-1; } static char inf() { return max(); } @@ -2653,6 +2738,7 @@ static bool is_float() { return false; } static bool is_inf(const char) { return false; } static bool is_nan(const char) { return false; } + static bool is_finite(const char) { return true; } static char min() { return ~max(); } static char max() { return (char)((unsigned char)-1>>1); } static char inf() { return max(); } @@ -2668,6 +2754,7 @@ static bool is_float() { return false; } static bool is_inf(const signed char) { return false; } static bool is_nan(const signed char) { return false; } + static bool is_finite(const signed char) { return true; } static signed char min() { return ~max(); } static signed char max() { return (signed char)((unsigned char)-1>>1); } static signed char inf() { return max(); } @@ -2683,6 +2770,7 @@ static bool is_float() { return false; } static bool is_inf(const unsigned short) { return false; } static bool is_nan(const unsigned short) { return false; } + static bool is_finite(const unsigned short) { return true; } static unsigned short min() { return 0; } static unsigned short max() { return (unsigned short)-1; } static unsigned short inf() { return max(); } @@ -2698,6 +2786,7 @@ static bool is_float() { return false; } static bool is_inf(const short) { return false; } static bool is_nan(const short) { return false; } + static bool is_finite(const short) { return true; } static short min() { return ~max(); } static short max() { return (short)((unsigned short)-1>>1); } static short inf() { return max(); } @@ -2712,6 +2801,7 @@ static bool is_float() { return false; } static bool is_inf(const unsigned int) { return false; } static bool is_nan(const unsigned int) { return false; } + static bool is_finite(const unsigned int) { return true; } static unsigned int min() { return 0; } static unsigned int max() { return (unsigned int)-1; } static unsigned int inf() { return max(); } @@ -2727,6 +2817,7 @@ static bool is_float() { return false; } static bool is_inf(const int) { return false; } static bool is_nan(const int) { return false; } + static bool is_finite(const int) { return true; } static int min() { return ~max(); } static int max() { return (int)((unsigned int)-1>>1); } static int inf() { return max(); } @@ -2741,6 +2832,7 @@ static bool is_float() { return false; } static bool is_inf(const cimg_uint64) { return false; } static bool is_nan(const cimg_uint64) { return false; } + static bool is_finite(const cimg_uint64) { return true; } static cimg_uint64 min() { return 0; } static cimg_uint64 max() { return (cimg_uint64)-1; } static cimg_uint64 inf() { return max(); } @@ -2756,6 +2848,7 @@ static bool is_float() { return false; } static bool is_inf(const cimg_int64) { return false; } static bool is_nan(const cimg_int64) { return false; } + static bool is_finite(const cimg_int64) { return true; } static cimg_int64 min() { return ~max(); } static cimg_int64 max() { return (cimg_int64)((cimg_uint64)-1>>1); } static cimg_int64 inf() { return max(); } @@ -2789,6 +2882,13 @@ return !(val==val); #endif } + static bool is_finite(const double val) { +#ifdef isfinite + return (bool)isfinite(val); +#else + return !is_nan(val) && !is_inf(val); +#endif + } static double min() { return -DBL_MAX; } static double max() { return DBL_MAX; } static double inf() { @@ -2833,6 +2933,13 @@ return !(val==val); #endif } + static bool is_finite(const float val) { +#ifdef isfinite + return (bool)isfinite(val); +#else + return !is_nan(val) && !is_inf(val); +#endif + } static float min() { return -FLT_MAX; } static float max() { return FLT_MAX; } static float inf() { return (float)cimg::type::inf(); } @@ -2861,6 +2968,13 @@ return !(val==val); #endif } + static bool is_finite(const long double val) { +#ifdef isfinite + return (bool)isfinite(val); +#else + return !is_nan(val) && !is_inf(val); +#endif + } static long double min() { return -LDBL_MAX; } static long double max() { return LDBL_MAX; } static long double inf() { return max()*max(); } @@ -2890,6 +3004,13 @@ } return cimg::type::is_nan((float)val); } + static bool is_finite(const half val) { +#ifdef isfinite + return (bool)isfinite(val); +#else + return !is_nan(val) && !is_inf(val); +#endif + } static half min() { return (half)-65504; } static half max() { return (half)65504; } static half inf() { return max()*max(); } @@ -2982,6 +3103,7 @@ template<> struct superset { typedef double type; }; template<> struct superset { typedef double type; }; template<> struct superset { typedef double type; }; + #ifdef cimg_use_half template<> struct superset { typedef float type; }; template<> struct superset { typedef float type; }; @@ -3005,12 +3127,13 @@ #define _cimg_Tt typename cimg::superset::type #define _cimg_Tfloat typename cimg::superset::type +#define _cimg_tfloat typename cimg::superset::type #define _cimg_Ttfloat typename cimg::superset2::type #define _cimg_Ttdouble typename cimg::superset2::type // Define variables used internally by CImg. #if cimg_display==1 - struct X11_info { + struct X11_static { unsigned int nb_wins; pthread_t *events_thread; pthread_cond_t wait_event; @@ -3021,13 +3144,14 @@ bool is_blue_first; bool is_shm_enabled; bool byte_order; + #ifdef cimg_use_xrandr XRRScreenSize *resolutions; Rotation curr_rotation; unsigned int curr_resolution; unsigned int nb_resolutions; #endif - X11_info():nb_wins(0),events_thread(0),display(0), + X11_static():nb_wins(0),events_thread(0),display(0), nb_bits(0),is_blue_first(false),is_shm_enabled(false),byte_order(false) { #ifdef __FreeBSD__ XInitThreads(); @@ -3035,6 +3159,7 @@ wins = new CImgDisplay*[1024]; pthread_mutex_init(&wait_event_mutex,0); pthread_cond_init(&wait_event,0); + #ifdef cimg_use_xrandr resolutions = 0; curr_rotation = 0; @@ -3042,7 +3167,7 @@ #endif } - ~X11_info() { + ~X11_static() { delete[] wins; /* if (events_thread) { @@ -3055,65 +3180,75 @@ pthread_mutex_destroy(&wait_event_mutex); */ } - }; + }; // struct X11_static { ... #if defined(cimg_module) - X11_info& X11_attr(); + X11_static& X11_attr(); #elif defined(cimg_main) - X11_info& X11_attr() { static X11_info val; return val; } + X11_static& X11_attr() { static X11_static val; return val; } #else - inline X11_info& X11_attr() { static X11_info val; return val; } + inline X11_static& X11_attr() { static X11_static val; return val; } #endif #elif cimg_display==2 - struct Win32_info { + struct Win32_static { HANDLE wait_event; - Win32_info() { wait_event = CreateEvent(0,FALSE,FALSE,0); } - }; + Win32_static() { wait_event = CreateEvent(0,FALSE_WIN,FALSE_WIN,0); } + }; // struct Win32_static { ... #if defined(cimg_module) - Win32_info& Win32_attr(); + Win32_static& Win32_attr(); #elif defined(cimg_main) - Win32_info& Win32_attr() { static Win32_info val; return val; } + Win32_static& Win32_attr() { static Win32_static val; return val; } #else - inline Win32_info& Win32_attr() { static Win32_info val; return val; } + inline Win32_static& Win32_attr() { static Win32_static val; return val; } #endif #endif #define cimg_lock_display() cimg::mutex(15) #define cimg_unlock_display() cimg::mutex(15,0) - struct Mutex_info { -#ifdef _PTHREAD_H + struct Mutex_static { +#if cimg_OS==1 && (defined(cimg_use_pthread) || cimg_display==1) pthread_mutex_t mutex[32]; - Mutex_info() { for (unsigned int i = 0; i<32; ++i) pthread_mutex_init(&mutex[i],0); } + Mutex_static() { for (unsigned int i = 0; i<32; ++i) pthread_mutex_init(&mutex[i],0); } void lock(const unsigned int n) { pthread_mutex_lock(&mutex[n]); } void unlock(const unsigned int n) { pthread_mutex_unlock(&mutex[n]); } int trylock(const unsigned int n) { return pthread_mutex_trylock(&mutex[n]); } #elif cimg_OS==2 HANDLE mutex[32]; - Mutex_info() { for (unsigned int i = 0; i<32; ++i) mutex[i] = CreateMutex(0,FALSE,0); } + Mutex_static() { for (unsigned int i = 0; i<32; ++i) mutex[i] = CreateMutex(0,FALSE_WIN,0); } void lock(const unsigned int n) { WaitForSingleObject(mutex[n],INFINITE); } void unlock(const unsigned int n) { ReleaseMutex(mutex[n]); } int trylock(const unsigned int) { return 0; } #else - Mutex_info() {} + Mutex_static() {} void lock(const unsigned int) {} void unlock(const unsigned int) {} int trylock(const unsigned int) { return 0; } #endif - }; + }; // struct Mutex_static { ... #if defined(cimg_module) - Mutex_info& Mutex_attr(); + Mutex_static& Mutex_attr(); #elif defined(cimg_main) - Mutex_info& Mutex_attr() { static Mutex_info val; return val; } + Mutex_static& Mutex_attr() { static Mutex_static val; return val; } #else - inline Mutex_info& Mutex_attr() { static Mutex_info val; return val; } + inline Mutex_static& Mutex_attr() { static Mutex_static val; return val; } #endif #if defined(cimg_use_magick) - static struct Magick_info { - Magick_info() { + struct Magick_static { + Magick_static() { Magick::InitializeMagick(""); } - } _Magick_info; + }; // struct Magick_static { ... + static Magick_static _Magick_static; +#endif + +#if defined(cimg_use_fftw3) && !defined(cimg_use_fftw3_singlethread) + struct FFTW3_static { + FFTW3_static() { + fftw_init_threads(); + } + }; // struct FFTW3_static { ... + static FFTW3_static _FFTW3_static; #endif #if cimg_display==1 @@ -3393,57 +3528,57 @@ const double PI = 3.14159265358979323846; //!< Value of the mathematical constant PI - // Define a 12x13 binary font (small sans). + // Define a 10x13 binary font (small sans). static const char *const data_font_small[] = { " UwlwnwoyuwHwlwmwcwlwnw[xuwowlwmwoyuwRwlwnxcw Mw (wnwnwuwpwuypwuwoy" "ZwnwmwuwowuwmwnwnwuwowuwfwuxnwnwmwuwpwuypwuwZwnwnwtwpwtwow'y Hw cwnw >{ jw %xdxZwdw_wexfwYwkw 7yowoyFx=w " "ry qw %wuw !xnwkwnwoyuwfwuw[wkwnwcwowrwpwdwuwoxuwpwkwnwoyuwRwkwnwbwpwNyoyoyoyoy;wdwnxpxtxowG|!ydwnwuwowtwow" "pxswqxlwnxnxmwDwoyoxnyoymwp{oyq{pyoy>ypwqwpwp{oyqzo{q{pzrwrwowlwqwswpwnwqwsxswpypzoyqzozq}swrwrwqwtwswswtxsxswq" - "ws}qwbwnydwew_wfwdwkwmwowkw(w0wmwmwGwtwdxQw swuwnwo{q{pynwp|rwtwtwqydwcwcwcwmwmxgwqwpwnzpwuwpzoyRzoyoyexnynwdz" - "\\xnxgxrwsxrwsyswowmwmwmwmwmwmwo}ryp{q{q{q{nwmwnwmwozqxswpyoyoyoyoyeyuwswrwrwrwrwrwrwrwrwqwrwmwtwnwmwnwuwpwuypwu" - "woyZwmwnwuwowuwmwqwkwuwowuwoxnwuxowmwnwuwpwuypwuwZwmwnwuwowuwnwowmwtw\\wuwuwqwswqwswqwswqwswEwqwtweypzr~qyIw rw" - "swewnwuwowuwozswtwuwqwtwmwnwlwowuwuwowOxpxuxqwuwowswqwswoxpwlwjwqwswqwsw>1; // set sign bit to 0 + return ((u)<<2)>>2; // set sign & exponent bit to 0 } inline float uint2float(const unsigned int u) { if (u<(1U<<19)) return (float)u; // Consider safe storage of unsigned int as floats until 19bits (i.e 524287) float f; - const unsigned int v = u|(1U<<(8*sizeof(unsigned int)-1)); // set sign bit to 1 + const unsigned int v = u|(3U<<(8*sizeof(unsigned int)-2)); // set sign & exponent bit to 1 // use memcpy instead of simple assignment to avoid undesired optimizations by C++-compiler. std::memcpy(&f,&v,sizeof(float)); return f; @@ -5736,28 +5871,31 @@ /** \note The timer does not necessarily starts from \c 0. **/ - inline cimg_ulong time() { + inline cimg_uint64 time() { #if cimg_OS==1 struct timeval st_time; gettimeofday(&st_time,0); - return (cimg_ulong)(st_time.tv_usec/1000 + st_time.tv_sec*1000); + return (cimg_uint64)st_time.tv_sec*1000 + (cimg_uint64)st_time.tv_usec/1000; #elif cimg_OS==2 - SYSTEMTIME st_time; - GetLocalTime(&st_time); - return (cimg_ulong)(st_time.wMilliseconds + 1000*(st_time.wSecond + 60*(st_time.wMinute + 60*st_time.wHour))); + ULARGE_INTEGER ul; + FILETIME ft; + GetSystemTimeAsFileTime(&ft); + ul.LowPart = ft.dwLowDateTime; + ul.HighPart = ft.dwHighDateTime; + return (cimg_uint64)ul.QuadPart/10000; #else return 0; #endif } // Implement a tic/toc mechanism to display elapsed time of algorithms. - inline cimg_ulong tictoc(const bool is_tic); + inline cimg_uint64 tictoc(const bool is_tic); //! Start tic/toc timer for time measurement between code instructions. /** \return Current value of the timer (same value as time()). **/ - inline cimg_ulong tic() { + inline cimg_uint64 tic() { return cimg::tictoc(true); } @@ -5765,14 +5903,14 @@ /** \return Time elapsed (in ms) since last call to tic(). **/ - inline cimg_ulong toc() { + inline cimg_uint64 toc() { return cimg::tictoc(false); } //! Sleep for a given numbers of milliseconds. /** \param milliseconds Number of milliseconds to wait for. - \note This function frees the CPU ressources during the sleeping time. + \note This function frees the CPU resources during the sleeping time. It can be used to temporize your program properly, without wasting CPU time. **/ inline void sleep(const unsigned int milliseconds) { @@ -5788,10 +5926,10 @@ #endif } - inline unsigned int wait(const unsigned int milliseconds, cimg_ulong *const p_timer) { + inline unsigned int wait(const unsigned int milliseconds, cimg_uint64 *const p_timer) { if (!*p_timer) *p_timer = cimg::time(); - const cimg_ulong current_time = cimg::time(); - if (current_time>=*p_timer + milliseconds) { *p_timer = current_time; return 0; } + const cimg_uint64 current_time = cimg::time(); + if (current_time<*p_timer || current_time>=*p_timer + milliseconds) { *p_timer = current_time; return 0; } const unsigned int time_diff = (unsigned int)(*p_timer + milliseconds - current_time); *p_timer = current_time + time_diff; cimg::sleep(time_diff); @@ -5805,20 +5943,20 @@ \note Same as sleep() with a waiting time computed with regard to the last call of wait(). It may be used to temporize your program properly, without wasting CPU time. **/ - inline cimg_long wait(const unsigned int milliseconds) { + inline unsigned int wait(const unsigned int milliseconds) { cimg::mutex(3); - static cimg_ulong timer = cimg::time(); + static cimg_uint64 timer = cimg::time(); cimg::mutex(3,0); return cimg::wait(milliseconds,&timer); } // Custom random number generator (allow re-entrance). - inline cimg_ulong& rng() { // Used as a shared global number for rng - static cimg_ulong rng = 0xB16B00B5U; + inline cimg_uint64& rng() { // Used as a shared global number for rng + static cimg_uint64 rng = 0xB16B00B5U; return rng; } - inline unsigned int _rand(cimg_ulong *const p_rng) { + inline unsigned int _rand(cimg_uint64 *const p_rng) { *p_rng = *p_rng*1103515245 + 12345U; return (unsigned int)*p_rng; } @@ -5830,11 +5968,11 @@ return res; } - inline void srand(cimg_ulong *const p_rng) { + inline void srand(cimg_uint64 *const p_rng) { #if cimg_OS==1 - *p_rng = cimg::time() + (cimg_ulong)getpid(); + *p_rng = cimg::time() + (cimg_uint64)getpid(); #elif cimg_OS==2 - *p_rng = cimg::time() + (cimg_ulong)_getpid(); + *p_rng = cimg::time() + (cimg_uint64)_getpid(); #endif } @@ -5844,13 +5982,13 @@ cimg::mutex(4,0); } - inline void srand(const cimg_ulong seed) { + inline void srand(const cimg_uint64 seed) { cimg::mutex(4); cimg::rng() = seed; cimg::mutex(4,0); } - inline double rand(const double val_min, const double val_max, cimg_ulong *const p_rng) { + inline double rand(const double val_min, const double val_max, cimg_uint64 *const p_rng) { const double val = cimg::_rand(p_rng)/(double)~0U; return val_min + (val_max - val_min)*val; } @@ -5862,7 +6000,7 @@ return res; } - inline double rand(const double val_max, cimg_ulong *const p_rng) { + inline double rand(const double val_max, cimg_uint64 *const p_rng) { const double val = cimg::_rand(p_rng)/(double)~0U; return val_max*val; } @@ -5874,7 +6012,7 @@ return res; } - inline double grand(cimg_ulong *const p_rng) { + inline double grand(cimg_uint64 *const p_rng) { double x1, w; do { const double x2 = cimg::rand(-1,1,p_rng); @@ -5891,7 +6029,7 @@ return res; } - inline unsigned int prand(const double z, cimg_ulong *const p_rng) { + inline unsigned int prand(const double z, cimg_uint64 *const p_rng) { if (z<=1.e-10) return 0; if (z>100) return (unsigned int)((std::sqrt(z) * cimg::grand(p_rng)) + z); unsigned int k = 0; @@ -5910,7 +6048,7 @@ //! Cut (i.e. clamp) value in specified interval. template inline T cut(const T& val, const t& val_min, const t& val_max) { - return valval_max?(T)val_max:val; + return val<=val_min?(T)val_min:val>=val_max?(T)val_max:val; } //! Bitwise-rotate value on the left. @@ -6070,6 +6208,17 @@ return std::min(std::min(a,b),std::min(c,d)); } + //! Return the minabs between two values. + template + inline t minabs(const t& a, const t& b) { + return std::abs(b) + inline t minabs(const t& a, const t& b, const t& abs_b) { + return abs_b inline t max(const t& a, const t& b, const t& c) { @@ -6082,16 +6231,27 @@ return std::max(std::max(a,b),std::max(c,d)); } + //! Return the maxabs between two values. + template + inline t maxabs(const t& a, const t& b) { + return std::abs(b)>std::abs(a)?b:a; + } + + template + inline t maxabs(const t& a, const t& b, const t& abs_b) { + return abs_b>std::abs(a)?b:a; + } + //! Return the sign of a value. template inline T sign(const T& x) { - return (T)(x<0?-1:x>0); + return (T)(cimg::type::is_nan(x)?0:x<0?-1:x>0); } //! Return the nearest power of 2 higher than given value. template - inline cimg_ulong nearest_pow2(const T& x) { - cimg_ulong i = 1; + inline cimg_uint64 nearest_pow2(const T& x) { + cimg_uint64 i = 1; while (x>i) i<<=1; return i; } @@ -6105,7 +6265,9 @@ template inline T mod(const T& x, const T& m) { const double dx = (double)x, dm = (double)m; - return (T)(dx - dm * std::floor(dx / dm)); + if (!cimg::type::is_finite(dm)) return x; + if (cimg::type::is_finite(dx)) return (T)(dx - dm * std::floor(dx / dm)); + return (T)0; } inline int mod(const bool x, const bool m) { return m?(x?1:0):0; @@ -6155,6 +6317,11 @@ return (T)std::floor((_cimg_Tfloat)x + 0.5f); } + template + inline int uiround(const T x) { + return cimg::type::is_float()?(int)(x + 0.5f):(int)x; + } + //! Return rounded value. /** \param x Value to be rounded. @@ -6605,8 +6772,8 @@ if (n<94) { // precise up to n = 78, less precise for n>78 up to n = 93, overflows for n>93 cimg_uint64 - fn1 = (cimg_uint64)1304969544928657ULL, - fn2 = (cimg_uint64)806515533049393ULL, + fn1 = ((cimg_uint64)303836)<<32 | 3861581201UL, // 1304969544928657ULL (avoid C++98 warning with ULL) + fn2 = ((cimg_uint64)187781)<<32 | 2279239217UL, // 806515533049393ULL fn = 0; for (int i = 75; i<=n; ++i) { fn = fn1 + fn2; fn2 = fn1; fn1 = fn; } return (double)fn; @@ -6620,7 +6787,7 @@ return b; } - //! Convert Ascii character to lower case. + //! Convert character to lower case. inline char lowercase(const char x) { return (char)((x<'A'||x>'Z')?x:x - 'A' + 'a'); } @@ -6633,7 +6800,7 @@ if (str) for (char *ptr = str; *ptr; ++ptr) *ptr = lowercase(*ptr); } - //! Convert Ascii character to upper case. + //! Convert character to upper case. inline char uppercase(const char x) { return (char)((x<'a'||x>'z')?x:x - 'a' + 'A'); } @@ -6649,7 +6816,7 @@ //! Return \c true if input character is blank (space, tab, or non-printable character). inline bool is_blank(const char c) { - return c>=0 && c<=' '; + return c>=0 && (unsigned char)c<=' '; } //! Read value in a C-string. @@ -6793,14 +6960,15 @@ } } - //! Replace escape sequences in C-strings by their binary Ascii values. + //! Replace escape sequences in C-strings by character values. /** \param[in,out] str C-string to work with (modified at output). **/ inline void strunescape(char *const str) { #define cimg_strunescape(ci,co) case ci : *nd = co; ++ns; break; - unsigned int val = 0; - for (char *ns = str, *nd = str; *ns || (bool)(*nd=0); ++nd) if (*ns=='\\') switch (*(++ns)) { + + unsigned char val = 0; + for (char *ns = str, *nd = str; *ns || (bool)(*nd = 0); ++nd) if (*ns=='\\') switch (*(++ns)) { cimg_strunescape('a','\a'); cimg_strunescape('b','\b'); cimg_strunescape('e',0x1B); @@ -6813,16 +6981,89 @@ cimg_strunescape('\'','\''); cimg_strunescape('\"','\"'); cimg_strunescape('\?','\?'); - case 0 : *nd = 0; break; case '0' : case '1' : case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : - cimg_sscanf(ns,"%o",&val); while (*ns>='0' && *ns<='7') ++ns; - *nd = (char)val; break; - case 'x' : - cimg_sscanf(++ns,"%x",&val); - while ((*ns>='0' && *ns<='9') || (*ns>='a' && *ns<='f') || (*ns>='A' && *ns<='F')) ++ns; - *nd = (char)val; break; - default : *nd = *(ns++); - } else *nd = *(ns++); + val = *(ns++) - '0'; + if (*ns>='0' && *ns<='7') (val<<=3)|=*(ns++) - '0'; + if (*ns>='0' && *ns<='7') (val<<=3)|=*(ns++) - '0'; + *nd = (char)val; + break; + case 'x' : { + char c = lowercase(*(++ns)); + if ((c>='0' && c<='9') || (c>='a' && c<='f')) { + val = (c<='9'?c - '0':c - 'a' + 10); + c = lowercase(*(++ns)); + if ((c>='0' && c<='9') || (c>='a' && c<='f')) { + (val<<=4)|=(c<='9'?c - '0':c - 'a' + 10); + ++ns; + } + *nd = val; + } else *nd = c; + } break; + case 'u' : { // UTF-8 BMP + char c1, c2, c3, c4; + if ((((c1 = lowercase(ns[1]))>='0' && c1<='9') || (c1>='a' && c1<='f')) && + (((c2 = lowercase(ns[2]))>='0' && c2<='9') || (c2>='a' && c2<='f')) && + (((c3 = lowercase(ns[3]))>='0' && c3<='9') || (c3>='a' && c3<='f')) && + (((c4 = lowercase(ns[4]))>='0' && c4<='9') || (c4>='a' && c4<='f'))) { + c1 = (c1<='9'?c1 - '0':c1 - 'a' + 10); + c2 = (c2<='9'?c2 - '0':c2 - 'a' + 10); + c3 = (c3<='9'?c3 - '0':c3 - 'a' + 10); + c4 = (c4<='9'?c4 - '0':c4 - 'a' + 10); + const unsigned int ival = + ((unsigned int)c1<<12) | ((unsigned int)c2<<8) | ((unsigned int)c3<<4) | c4; + if (ival<=0x007f) *nd = (char)ival; + else if (ival<=0x07ff) { + *(nd++) = (char)((ival>>6)|0xc0); + *nd = (char)((ival&0x3f)|0x80); + } else { + *(nd++) = (char)((ival>>12)|0xe0); + *(nd++) = (char)(((ival>>6)&0x3f)|0x80); + *nd = (char)((ival&0x3f)|0x80); + } + ns+=5; + } else *nd = *(ns++); + } break; + case 'U' : { // UTF-8 astral planes + char c1, c2, c3, c4, c5, c6, c7, c8; + if ((((c1 = lowercase(ns[1]))>='0' && c1<='9') || (c1>='a' && c1<='f')) && + (((c2 = lowercase(ns[2]))>='0' && c2<='9') || (c2>='a' && c2<='f')) && + (((c3 = lowercase(ns[3]))>='0' && c3<='9') || (c3>='a' && c3<='f')) && + (((c4 = lowercase(ns[4]))>='0' && c4<='9') || (c4>='a' && c4<='f')) && + (((c5 = lowercase(ns[5]))>='0' && c5<='9') || (c5>='a' && c5<='f')) && + (((c6 = lowercase(ns[6]))>='0' && c6<='9') || (c6>='a' && c6<='f')) && + (((c7 = lowercase(ns[7]))>='0' && c7<='9') || (c7>='a' && c7<='f')) && + (((c8 = lowercase(ns[8]))>='0' && c8<='9') || (c8>='a' && c8<='f'))) { + c1 = (c1<='9'?c1 - '0':c1 - 'a' + 10); + c2 = (c2<='9'?c2 - '0':c2 - 'a' + 10); + c3 = (c3<='9'?c3 - '0':c3 - 'a' + 10); + c4 = (c4<='9'?c4 - '0':c4 - 'a' + 10); + c5 = (c5<='9'?c5 - '0':c5 - 'a' + 10); + c6 = (c6<='9'?c6 - '0':c6 - 'a' + 10); + c7 = (c7<='9'?c7 - '0':c7 - 'a' + 10); + c8 = (c8<='9'?c8 - '0':c8 - 'a' + 10); + const unsigned int ival = + ((unsigned int)c1<<28) | ((unsigned int)c2<<24) | ((unsigned int)c3<<20) | ((unsigned int)c4<<16) | + ((unsigned int)c5<<12) | ((unsigned int)c6<<8) | ((unsigned int)c7<<4) | (unsigned int)c8; + if (ival<=0x007f) *nd = (char)ival; + else if (ival<=0x07ff) { + *(nd++) = (char)((ival>>6)|0xc0); + *nd = (char)((ival&0x3f)|0x80); + } else if (ival<=0xffff) { + *(nd++) = (char)((ival>>12)|0xe0); + *(nd++) = (char)(((ival>>6)&0x3f)|0x80); + *nd = (char)((ival&0x3f)|0x80); + } else { + *(nd++) = (char)((ival>>18)|0xf0); + *(nd++) = (char)(((ival>>12)&0x3f)|0x80); + *(nd++) = (char)(((ival>>6)&0x3f)|0x80); + *nd = (char)((ival&0x3f)|0x80); + } + ns+=9; + } else *nd = *(ns++); + } break; + default : if (*ns) *nd = *(ns++); + } + else *nd = *(ns++); } // Return a temporary string describing the size of a memory buffer. @@ -6956,6 +7197,11 @@ #endif } + // Get the file or directory attributes with support for UTF-8 paths (Windows only). +#if cimg_OS==2 + inline DWORD win_getfileattributes(const char *const path); +#endif + //! Check if a path is a directory. /** \param path Specified path to test. @@ -6966,8 +7212,8 @@ struct stat st_buf; return (!stat(path,&st_buf) && S_ISDIR(st_buf.st_mode)); #elif cimg_OS==2 - const unsigned int res = (unsigned int)GetFileAttributesA(path); - return res==INVALID_FILE_ATTRIBUTES?false:(res&16); + const DWORD res = win_getfileattributes(path); + return res!=INVALID_FILE_ATTRIBUTES && (res&FILE_ATTRIBUTE_DIRECTORY); #else return false; #endif @@ -6979,10 +7225,15 @@ **/ inline bool is_file(const char *const path) { if (!path || !*path) return false; +#if cimg_OS==2 + const DWORD res = cimg::win_getfileattributes(path); + return res!=INVALID_FILE_ATTRIBUTES && !(res&FILE_ATTRIBUTE_DIRECTORY); +#else std::FILE *const file = cimg::std_fopen(path,"rb"); if (!file) return false; cimg::fclose(file); return !is_directory(path); +#endif } //! Get file size. @@ -7004,7 +7255,7 @@ \param path Specified path to get attributes from. \param[in,out] attr Type of requested time attributes. Can be { 0=year | 1=month | 2=day | 3=day of week | 4=hour | 5=minute | 6=second } - Replaced by read attributes after return (or -1 if an error occured). + Replaced by read attributes after return (or -1 if an error occurred). \param nb_attr Number of attributes to read/write. \return Latest read attribute. **/ @@ -7051,7 +7302,7 @@ \param path Specified path to get attributes from. \param attr Type of requested time attributes. Can be { 0=year | 1=month | 2=day | 3=day of week | 4=hour | 5=minute | 6=second } - \return Specified attribute or -1 if an error occured. + \return Specified attribute or -1 if an error occurred. **/ inline int fdate(const char *const path, unsigned int attr) { int out = (int)attr; @@ -7061,8 +7312,9 @@ //! Get current local time (multiple-attributes version). /** \param[in,out] attr Type of requested time attributes. - Can be { 0=year | 1=month | 2=day | 3=day of week | 4=hour | 5=minute | 6=second } - Replaced by read attributes after return (or -1 if an error occured). + Can be { 0=year | 1=month | 2=day | 3=day of week | 4=hour | 5=minute | 6=second | + 7=millisecond } + Replaced by read attributes after return (or -1 if an error occurred). \param nb_attr Number of attributes to read/write. \return Latest read attribute. **/ @@ -7074,19 +7326,29 @@ SYSTEMTIME st; GetLocalTime(&st); for (unsigned int i = 0; itm_year + 1900:attr[i]==1?st->tm_mon + 1:attr[i]==2?st->tm_mday: - attr[i]==3?st->tm_wday:attr[i]==4?st->tm_hour:attr[i]==5?st->tm_min: - attr[i]==6?st->tm_sec:-1); + res = (int)(attr[i]==0?st->tm_year + 1900: + attr[i]==1?st->tm_mon + 1: + attr[i]==2?st->tm_mday: + attr[i]==3?st->tm_wday: + attr[i]==4?st->tm_hour: + attr[i]==5?st->tm_min: + attr[i]==6?st->tm_sec: + attr[i]==7?_st.tv_usec/1000:-1); attr[i] = (T)res; } #endif @@ -7097,8 +7359,9 @@ //! Get current local time (single-attribute version). /** \param attr Type of requested time attribute. - Can be { 0=year | 1=month | 2=day | 3=day of week | 4=hour | 5=minute | 6=second } - \return Specified attribute or -1 if an error occured. + Can be { 0=year | 1=month | 2=day | 3=day of week | 4=hour | 5=minute | 6=second | + 7=millisecond } + \return Specified attribute or -1 if an error occurred. **/ inline int date(unsigned int attr) { int out = (int)attr; @@ -7145,29 +7408,20 @@ filename and body must not overlap! **/ inline const char *split_filename(const char *const filename, char *const body=0) { - if (!filename) { if (body) *body = 0; return 0; } - const char *p = 0; for (const char *np = filename; np>=filename && (p=np); np = std::strchr(np,'.') + 1) {} - if (p==filename) { + if (!filename) { if (body) *body = 0; return ""; } + const char * p = std::strrchr(filename,'.'); + if (!p || std::strchr(p,'/') || std::strchr(p,'\\')) { // No extension. if (body) std::strcpy(body,filename); return filename + std::strlen(filename); } - const unsigned int l = (unsigned int)(p - filename - 1); + const unsigned int l = (unsigned int)(p - filename); if (body) { if (l) std::memcpy(body,filename,l); body[l] = 0; } - return p; + return p + 1; } - //! Generate a numbered version of a filename. + // Generate a numbered version of a filename. inline char* number_filename(const char *const filename, const int number, - const unsigned int digits, char *const str) { - if (!filename) { if (str) *str = 0; return 0; } - char *const format = new char[1024], *const body = new char[1024]; - const char *const ext = cimg::split_filename(filename,body); - if (*ext) cimg_snprintf(format,1024,"%%s_%%.%ud.%%s",digits); - else cimg_snprintf(format,1024,"%%s_%%.%ud",digits); - cimg_sprintf(str,format,body,number,ext); - delete[] format; delete[] body; - return str; - } + const unsigned int digits, char *const str); //! Read data from file. /** @@ -7240,6 +7494,17 @@ // Try to guess format from an image file. inline const char *ftype(std::FILE *const file, const char *const filename); + // Get or set load from network mode (can be { 0=disabled | 1=enabled }). + inline bool& network_mode(const bool value, const bool is_set) { + static bool mode = true; + if (is_set) { cimg::mutex(0); mode = value; cimg::mutex(0,0); } + return mode; + } + + inline bool& network_mode() { + return network_mode(false,false); + } + // Load file from network as a local temporary file. inline char *load_network(const char *const url, char *const filename_local, const unsigned int timeout=0, const bool try_fallback=false, @@ -7247,7 +7512,7 @@ //! Return options specified on the command line. inline const char* option(const char *const name, const int argc, const char *const *const argv, - const char *const defaut, const char *const usage, const bool reset_static) { + const char *const _default, const char *const usage, const bool reset_static) { static bool first = true, visu = false; if (reset_static) { first = true; return 0; } const char *res = 0; @@ -7263,14 +7528,14 @@ std::fprintf(cimg::output(),": %s",usage); std::fprintf(cimg::output()," (%s, %s)\n\n",cimg_date,cimg_time); } - if (defaut) std::fprintf(cimg::output(),"%s\n",defaut); + if (_default) std::fprintf(cimg::output(),"%s\n",_default); } if (name) { if (argc>0) { int k = 0; while (k Operating System: %s%-13s%s %s('cimg_OS'=%d)%s\n", cimg::t_bold, - cimg_OS==1?"Unix":(cimg_OS==2?"Windows":"Unknow"), + cimg_OS==1?"Unix":(cimg_OS==2?"Windows":"Unknown"), cimg::t_normal,cimg::t_green, cimg_OS, cimg::t_normal); @@ -7418,7 +7683,7 @@ #endif std::fprintf(cimg::output()," > Using OpenMP: %s%-13s%s %s('cimg_use_openmp' %s)%s\n", cimg::t_bold, -#ifdef cimg_use_openmp +#if cimg_use_openmp!=0 "Yes",cimg::t_normal,cimg::t_green,"defined", #else "No",cimg::t_normal,cimg::t_green,"undefined", @@ -7564,14 +7829,13 @@ } inline void sgels(char & TRANS, int &M, int &N, int &NRHS, float* lapA, int &LDA, - float* lapB, int &LDB, float* WORK, int &LWORK, int &INFO){ + float* lapB, int &LDB, float* WORK, int &LWORK, int &INFO) { sgels_(&TRANS, &M, &N, &NRHS, lapA, &LDA, lapB, &LDB, WORK, &LWORK, &INFO); } #endif - // End of the 'cimg' namespace - } + } // namespace cimg { ... /*------------------------------------------------ # @@ -7582,7 +7846,7 @@ # -------------------------------------------------*/ -#define _cimg_create_ext_operators(typ) \ +#define _cimg_create_operator(typ) \ template \ inline CImg::type> operator+(const typ val, const CImg& img) { \ return img + val; \ @@ -7621,19 +7885,19 @@ return img != val; \ } - _cimg_create_ext_operators(bool) - _cimg_create_ext_operators(unsigned char) - _cimg_create_ext_operators(char) - _cimg_create_ext_operators(signed char) - _cimg_create_ext_operators(unsigned short) - _cimg_create_ext_operators(short) - _cimg_create_ext_operators(unsigned int) - _cimg_create_ext_operators(int) - _cimg_create_ext_operators(cimg_uint64) - _cimg_create_ext_operators(cimg_int64) - _cimg_create_ext_operators(float) - _cimg_create_ext_operators(double) - _cimg_create_ext_operators(long double) + _cimg_create_operator(bool) + _cimg_create_operator(unsigned char) + _cimg_create_operator(char) + _cimg_create_operator(signed char) + _cimg_create_operator(unsigned short) + _cimg_create_operator(short) + _cimg_create_operator(unsigned int) + _cimg_create_operator(int) + _cimg_create_operator(cimg_uint64) + _cimg_create_operator(cimg_int64) + _cimg_create_operator(float) + _cimg_create_operator(double) + _cimg_create_operator(long double) template inline CImg<_cimg_Tfloat> operator+(const char *const expression, const CImg& img) { @@ -7686,42 +7950,42 @@ } template - inline CImg<_cimg_Tfloat> invert(const CImg& instance) { - return instance.get_invert(); + inline CImg<_cimg_Tfloat> invert(const CImg& instance, const bool use_LU=true) { + return instance.get_invert(use_LU); } template - inline CImg<_cimg_Tfloat> pseudoinvert(const CImg& instance) { - return instance.get_pseudoinvert(); + inline CImg<_cimg_Tfloat> pseudoinvert(const CImg& instance, const bool use_LU=false) { + return instance.get_pseudoinvert(use_LU); } -#define _cimg_create_ext_pointwise_function(name) \ +#define _cimg_create_pointwise_function(name) \ template \ inline CImg<_cimg_Tfloat> name(const CImg& instance) { \ return instance.get_##name(); \ } - _cimg_create_ext_pointwise_function(sqr) - _cimg_create_ext_pointwise_function(sqrt) - _cimg_create_ext_pointwise_function(exp) - _cimg_create_ext_pointwise_function(log) - _cimg_create_ext_pointwise_function(log2) - _cimg_create_ext_pointwise_function(log10) - _cimg_create_ext_pointwise_function(abs) - _cimg_create_ext_pointwise_function(sign) - _cimg_create_ext_pointwise_function(cos) - _cimg_create_ext_pointwise_function(sin) - _cimg_create_ext_pointwise_function(sinc) - _cimg_create_ext_pointwise_function(tan) - _cimg_create_ext_pointwise_function(acos) - _cimg_create_ext_pointwise_function(asin) - _cimg_create_ext_pointwise_function(atan) - _cimg_create_ext_pointwise_function(cosh) - _cimg_create_ext_pointwise_function(sinh) - _cimg_create_ext_pointwise_function(tanh) - _cimg_create_ext_pointwise_function(acosh) - _cimg_create_ext_pointwise_function(asinh) - _cimg_create_ext_pointwise_function(atanh) + _cimg_create_pointwise_function(sqr) + _cimg_create_pointwise_function(sqrt) + _cimg_create_pointwise_function(exp) + _cimg_create_pointwise_function(log) + _cimg_create_pointwise_function(log2) + _cimg_create_pointwise_function(log10) + _cimg_create_pointwise_function(abs) + _cimg_create_pointwise_function(sign) + _cimg_create_pointwise_function(cos) + _cimg_create_pointwise_function(sin) + _cimg_create_pointwise_function(sinc) + _cimg_create_pointwise_function(tan) + _cimg_create_pointwise_function(acos) + _cimg_create_pointwise_function(asin) + _cimg_create_pointwise_function(atan) + _cimg_create_pointwise_function(cosh) + _cimg_create_pointwise_function(sinh) + _cimg_create_pointwise_function(tanh) + _cimg_create_pointwise_function(acosh) + _cimg_create_pointwise_function(asinh) + _cimg_create_pointwise_function(atanh) /*----------------------------------- # @@ -7733,7 +7997,7 @@ CImgDisplay methods rely on a low-level graphic library to perform: it can be either \b X-Window (X11, for Unix-based systems) or \b GDI32 (for Windows-based systems). If both libraries are missing, CImgDisplay will not be able to display images on screen, and will enter - a minimal mode where warning messages will be outputed each time the program is trying to call one of the + a minimal mode where warning messages will be outputted each time the program is trying to call one of the CImgDisplay method. The configuration variable \c cimg_display tells about the graphic library used. @@ -7746,7 +8010,7 @@ Remember to link your program against \b X11 or \b GDI32 libraries if you use CImgDisplay. **/ struct CImgDisplay { - cimg_ulong _timer, _fps_frames, _fps_timer; + cimg_uint64 _timer, _fps_frames, _fps_timer; unsigned int _width, _height, _normalization; float _fps_fps, _min, _max; bool _is_fullscreen; @@ -7837,7 +8101,8 @@ _title(0), _window_width(0),_window_height(0),_button(0), _keys(new unsigned int[128]),_released_keys(new unsigned int[128]), - _window_x(0),_window_y(0),_mouse_x(-1),_mouse_y(-1),_wheel(0), + _window_x(cimg::type::min()),_window_y(cimg::type::min()), + _mouse_x(-1),_mouse_y(-1),_wheel(0), _is_closed(true),_is_resized(false),_is_moved(false),_is_event(false) { assign(); } @@ -7861,7 +8126,8 @@ _title(0), _window_width(0),_window_height(0),_button(0), _keys(new unsigned int[128]),_released_keys(new unsigned int[128]), - _window_x(0),_window_y(0),_mouse_x(-1),_mouse_y(-1),_wheel(0), + _window_x(cimg::type::min()),_window_y(cimg::type::min()), + _mouse_x(-1),_mouse_y(-1),_wheel(0), _is_closed(true),_is_resized(false),_is_moved(false),_is_event(false) { assign(width,height,title,normalization,is_fullscreen,is_closed); } @@ -7885,7 +8151,8 @@ _title(0), _window_width(0),_window_height(0),_button(0), _keys(new unsigned int[128]),_released_keys(new unsigned int[128]), - _window_x(0),_window_y(0),_mouse_x(-1),_mouse_y(-1),_wheel(0), + _window_x(cimg::type::min()),_window_y(cimg::type::min()), + _mouse_x(-1),_mouse_y(-1),_wheel(0), _is_closed(true),_is_resized(false),_is_moved(false),_is_event(false) { assign(img,title,normalization,is_fullscreen,is_closed); } @@ -7909,7 +8176,8 @@ _title(0), _window_width(0),_window_height(0),_button(0), _keys(new unsigned int[128]),_released_keys(new unsigned int[128]), - _window_x(0),_window_y(0),_mouse_x(-1),_mouse_y(-1),_wheel(0), + _window_x(cimg::type::min()),_window_y(cimg::type::min()), + _mouse_x(-1),_mouse_y(-1),_wheel(0), _is_closed(true),_is_resized(false),_is_moved(false),_is_event(false) { assign(list,title,normalization,is_fullscreen,is_closed); } @@ -7926,7 +8194,8 @@ _title(0), _window_width(0),_window_height(0),_button(0), _keys(new unsigned int[128]),_released_keys(new unsigned int[128]), - _window_x(0),_window_y(0),_mouse_x(-1),_mouse_y(-1),_wheel(0), + _window_x(cimg::type::min()),_window_y(cimg::type::min()), + _mouse_x(-1),_mouse_y(-1),_wheel(0), _is_closed(true),_is_resized(false),_is_moved(false),_is_event(false) { assign(disp); } @@ -8017,8 +8286,8 @@ return _empty; } -#define cimg_fitscreen(dx,dy,dz) CImgDisplay::_fitscreen(dx,dy,dz,256,-85,false), \ - CImgDisplay::_fitscreen(dx,dy,dz,256,-85,true) +#define cimg_fitscreen(dx,dy,dz) CImgDisplay::_fitscreen(dx,dy,dz,-25,-85,false), \ + CImgDisplay::_fitscreen(dx,dy,dz,-25,-85,true) static unsigned int _fitscreen(const unsigned int dx, const unsigned int dy, const unsigned int dz, const int dmin, const int dmax, const bool return_y) { const int @@ -8121,7 +8390,7 @@ return _is_moved; } - //! Return \c true if any event has occured on the associated window, \c false otherwise. + //! Return \c true if any event has occurred on the associated window, \c false otherwise. /** **/ bool is_event() const { @@ -8502,7 +8771,7 @@ - The returned value can be positive or negative depending on whether the mouse wheel has been scrolled forward or backward. - Scrolling the wheel forward add \c 1 to the wheel value. - - Scrolling the wheel backward substract \c 1 to the wheel value. + - Scrolling the wheel backward subtract \c 1 to the wheel value. - The returned value cumulates the number of forward of backward scrolls since the creation of the display, or since the last reset of the wheel value (using set_wheel()). It is strongly recommended to quickly reset the wheel counter when an action has been performed regarding the current wheel value. @@ -8527,7 +8796,7 @@ //! Return one entry from the pressed keys history. /** - \param pos Indice to read from the pressed keys history (indice \c 0 corresponds to latest entry). + \param pos Index to read from the pressed keys history (index \c 0 corresponds to latest entry). \return Keycode of a pressed key or \c 0 for a released key. \note - Each CImgDisplay stores a history of the pressed keys in a buffer of size \c 128. When a new key is pressed, @@ -8544,7 +8813,7 @@ //! Return one entry from the released keys history. /** - \param pos Indice to read from the released keys history (indice \c 0 corresponds to latest entry). + \param pos Index to read from the released keys history (index \c 0 corresponds to latest entry). \return Keycode of a released key or \c 0 for a pressed key. \note - Each CImgDisplay stores a history of the released keys in a buffer of size \c 128. When a new key is released, @@ -8605,7 +8874,7 @@ **/ float frames_per_second() { if (!_fps_timer) _fps_timer = cimg::time(); - const float delta = (cimg::time() - _fps_timer)/1000.f; + const float delta = (float)((cimg::time() - _fps_timer)/1000.f); ++_fps_frames; if (delta>=1) { _fps_fps = _fps_frames/delta; @@ -8615,6 +8884,22 @@ return _fps_fps; } + // Move current display window so that its content stays inside the current screen. + CImgDisplay& move_inside_screen() { + if (is_empty()) return *this; + const int + x0 = window_x(), + y0 = window_y(), + x1 = x0 + window_width() - 1, + y1 = y0 + window_height() - 1, + sw = CImgDisplay::screen_width(), + sh = CImgDisplay::screen_height(); + if (x0<0 || y0<0 || x1>=sw || y1>=sh) + move(std::max(0,std::min(x0,sw - x1 + x0)), + std::max(0,std::min(y0,sh - y1 + y0))); + return *this; + } + //@} //--------------------------------------- // @@ -9050,7 +9335,7 @@ return *this; } - //! Wait for any user event occuring on the current display. + //! Wait for any user event occurring on the current display. CImgDisplay& wait() { wait(*this); return *this; @@ -9066,34 +9351,34 @@ return *this; } - //! Wait for any event occuring on the display \c disp1. + //! Wait for any event occurring on the display \c disp1. static void wait(CImgDisplay& disp1) { disp1._is_event = false; while (!disp1._is_closed && !disp1._is_event) wait_all(); } - //! Wait for any event occuring either on the display \c disp1 or \c disp2. + //! Wait for any event occurring either on the display \c disp1 or \c disp2. static void wait(CImgDisplay& disp1, CImgDisplay& disp2) { disp1._is_event = disp2._is_event = false; while ((!disp1._is_closed || !disp2._is_closed) && !disp1._is_event && !disp2._is_event) wait_all(); } - //! Wait for any event occuring either on the display \c disp1, \c disp2 or \c disp3. + //! Wait for any event occurring either on the display \c disp1, \c disp2 or \c disp3. static void wait(CImgDisplay& disp1, CImgDisplay& disp2, CImgDisplay& disp3) { disp1._is_event = disp2._is_event = disp3._is_event = false; while ((!disp1._is_closed || !disp2._is_closed || !disp3._is_closed) && !disp1._is_event && !disp2._is_event && !disp3._is_event) wait_all(); } - //! Wait for any event occuring either on the display \c disp1, \c disp2, \c disp3 or \c disp4. + //! Wait for any event occurring either on the display \c disp1, \c disp2, \c disp3 or \c disp4. static void wait(CImgDisplay& disp1, CImgDisplay& disp2, CImgDisplay& disp3, CImgDisplay& disp4) { disp1._is_event = disp2._is_event = disp3._is_event = disp4._is_event = false; while ((!disp1._is_closed || !disp2._is_closed || !disp3._is_closed || !disp4._is_closed) && !disp1._is_event && !disp2._is_event && !disp3._is_event && !disp4._is_event) wait_all(); } - //! Wait for any event occuring either on the display \c disp1, \c disp2, \c disp3, \c disp4 or \c disp5. + //! Wait for any event occurring either on the display \c disp1, \c disp2, \c disp3, \c disp4 or \c disp5. static void wait(CImgDisplay& disp1, CImgDisplay& disp2, CImgDisplay& disp3, CImgDisplay& disp4, CImgDisplay& disp5) { disp1._is_event = disp2._is_event = disp3._is_event = disp4._is_event = disp5._is_event = false; @@ -9102,7 +9387,7 @@ wait_all(); } - //! Wait for any event occuring either on the display \c disp1, \c disp2, \c disp3, \c disp4, ... \c disp6. + //! Wait for any event occurring either on the display \c disp1, \c disp2, \c disp3, \c disp4, ... \c disp6. static void wait(CImgDisplay& disp1, CImgDisplay& disp2, CImgDisplay& disp3, CImgDisplay& disp4, CImgDisplay& disp5, CImgDisplay& disp6) { disp1._is_event = disp2._is_event = disp3._is_event = disp4._is_event = disp5._is_event = @@ -9113,7 +9398,7 @@ !disp6._is_event) wait_all(); } - //! Wait for any event occuring either on the display \c disp1, \c disp2, \c disp3, \c disp4, ... \c disp7. + //! Wait for any event occurring either on the display \c disp1, \c disp2, \c disp3, \c disp4, ... \c disp7. static void wait(CImgDisplay& disp1, CImgDisplay& disp2, CImgDisplay& disp3, CImgDisplay& disp4, CImgDisplay& disp5, CImgDisplay& disp6, CImgDisplay& disp7) { disp1._is_event = disp2._is_event = disp3._is_event = disp4._is_event = disp5._is_event = @@ -9124,7 +9409,7 @@ !disp6._is_event && !disp7._is_event) wait_all(); } - //! Wait for any event occuring either on the display \c disp1, \c disp2, \c disp3, \c disp4, ... \c disp8. + //! Wait for any event occurring either on the display \c disp1, \c disp2, \c disp3, \c disp4, ... \c disp8. static void wait(CImgDisplay& disp1, CImgDisplay& disp2, CImgDisplay& disp3, CImgDisplay& disp4, CImgDisplay& disp5, CImgDisplay& disp6, CImgDisplay& disp7, CImgDisplay& disp8) { disp1._is_event = disp2._is_event = disp3._is_event = disp4._is_event = disp5._is_event = @@ -9135,7 +9420,7 @@ !disp6._is_event && !disp7._is_event && !disp8._is_event) wait_all(); } - //! Wait for any event occuring either on the display \c disp1, \c disp2, \c disp3, \c disp4, ... \c disp9. + //! Wait for any event occurring either on the display \c disp1, \c disp2, \c disp3, \c disp4, ... \c disp9. static void wait(CImgDisplay& disp1, CImgDisplay& disp2, CImgDisplay& disp3, CImgDisplay& disp4, CImgDisplay& disp5, CImgDisplay& disp6, CImgDisplay& disp7, CImgDisplay& disp8, CImgDisplay& disp9) { disp1._is_event = disp2._is_event = disp3._is_event = disp4._is_event = disp5._is_event = @@ -9146,7 +9431,7 @@ !disp6._is_event && !disp7._is_event && !disp8._is_event && !disp9._is_event) wait_all(); } - //! Wait for any event occuring either on the display \c disp1, \c disp2, \c disp3, \c disp4, ... \c disp10. + //! Wait for any event occurring either on the display \c disp1, \c disp2, \c disp3, \c disp4, ... \c disp10. static void wait(CImgDisplay& disp1, CImgDisplay& disp2, CImgDisplay& disp3, CImgDisplay& disp4, CImgDisplay& disp5, CImgDisplay& disp6, CImgDisplay& disp7, CImgDisplay& disp8, CImgDisplay& disp9, CImgDisplay& disp10) { @@ -9161,7 +9446,7 @@ #if cimg_display==0 - //! Wait for any window event occuring in any opened CImgDisplay. + //! Wait for any window event occurring in any opened CImgDisplay. static void wait_all() { return _no_display_exception(); } @@ -9225,6 +9510,7 @@ Colormap _colormap; XImage *_image; void *_data; + #ifdef cimg_use_xshm XShmSegmentInfo *_shminfo; #endif @@ -9239,6 +9525,7 @@ res = DisplayWidth(_dpy,DefaultScreen(_dpy)); XCloseDisplay(_dpy); } else { + #ifdef cimg_use_xrandr if (cimg::X11_attr().resolutions && cimg::X11_attr().curr_resolution) res = cimg::X11_attr().resolutions[cimg::X11_attr().curr_resolution].width; @@ -9260,6 +9547,7 @@ res = DisplayHeight(_dpy,DefaultScreen(_dpy)); XCloseDisplay(_dpy); } else { + #ifdef cimg_use_xrandr if (cimg::X11_attr().resolutions && cimg::X11_attr().curr_resolution) res = cimg::X11_attr().resolutions[cimg::X11_attr().curr_resolution].height; @@ -9301,7 +9589,9 @@ pthread_cond_broadcast(&cimg::X11_attr().wait_event); } if (nx!=_window_x || ny!=_window_y) { - _window_x = nx; _window_y = ny; _is_moved = _is_event = true; + _window_x = nx; + _window_y = ny; + _is_moved = _is_event = true; pthread_cond_broadcast(&cimg::X11_attr().wait_event); } } break; @@ -9310,8 +9600,10 @@ _paint(false); if (_is_fullscreen) { XWindowAttributes attr; - XGetWindowAttributes(dpy,_window,&attr); - while (attr.map_state!=IsViewable) XSync(dpy,0); + do { + XGetWindowAttributes(dpy,_window,&attr); + if (attr.map_state!=IsViewable) { XSync(dpy,0); cimg::sleep(10); } + } while (attr.map_state!=IsViewable); XSetInputFocus(dpy,_window,RevertToParent,CurrentTime); } } break; @@ -9400,7 +9692,7 @@ return 0; } - void _set_colormap(Colormap& _colormap, const unsigned int dim) { + void _set_colormap(Colormap& cmap, const unsigned int dim) { XColor *const colormap = new XColor[256]; switch (dim) { case 1 : { // colormap for greyscale images @@ -9431,7 +9723,7 @@ } } } - XStoreColors(cimg::X11_attr().display,_colormap,colormap,256); + XStoreColors(cimg::X11_attr().display,cmap,colormap,256); delete[] colormap; } @@ -9474,6 +9766,7 @@ XSendEvent(dpy,_window,0,0,&event); } else { // Repaint directly (may be called from the expose event) GC gc = DefaultGC(dpy,DefaultScreen(dpy)); + #ifdef cimg_use_xshm if (_shminfo) XShmPutImage(dpy,_window,gc,_image,0,0,0,0,_width,_height,1); else XPutImage(dpy,_window,gc,_image,0,0,0,0,_width,_height); @@ -9584,38 +9877,30 @@ const unsigned int sx = screen_width(), sy = screen_height(); if (sx==_width && sy==_height) return; - XSetWindowAttributes winattr; - winattr.override_redirect = 1; + XSetWindowAttributes attr_set; + + attr_set.background_pixel = XBlackPixel(dpy,XDefaultScreen(dpy)); + attr_set.override_redirect = 1; _background_window = XCreateWindow(dpy,DefaultRootWindow(dpy),0,0,sx,sy,0,0, - InputOutput,CopyFromParent,CWOverrideRedirect,&winattr); - const cimg_ulong buf_size = (cimg_ulong)sx*sy*(cimg::X11_attr().nb_bits==8?1: - (cimg::X11_attr().nb_bits==16?2:4)); - void *background_data = std::malloc(buf_size); - std::memset(background_data,0,buf_size); - XImage *background_image = XCreateImage(dpy,DefaultVisual(dpy,DefaultScreen(dpy)),cimg::X11_attr().nb_bits, - ZPixmap,0,(char*)background_data,sx,sy,8,0); + InputOutput,CopyFromParent,CWBackPixel | CWOverrideRedirect,&attr_set); XEvent event; XSelectInput(dpy,_background_window,StructureNotifyMask); XMapRaised(dpy,_background_window); do XWindowEvent(dpy,_background_window,StructureNotifyMask,&event); while (event.type!=MapNotify); - GC gc = DefaultGC(dpy,DefaultScreen(dpy)); -#ifdef cimg_use_xshm - if (_shminfo) XShmPutImage(dpy,_background_window,gc,background_image,0,0,0,0,sx,sy,0); - else XPutImage(dpy,_background_window,gc,background_image,0,0,0,0,sx,sy); -#else - XPutImage(dpy,_background_window,gc,background_image,0,0,0,0,sx,sy); -#endif + XWindowAttributes attr; - XGetWindowAttributes(dpy,_background_window,&attr); - while (attr.map_state!=IsViewable) XSync(dpy,0); - XDestroyImage(background_image); + do { + XGetWindowAttributes(dpy,_background_window,&attr); + if (attr.map_state!=IsViewable) { XSync(dpy,0); cimg::sleep(10); } + } while (attr.map_state!=IsViewable); } void _desinit_fullscreen() { if (!_is_fullscreen) return; Display *const dpy = cimg::X11_attr().display; XUngrabKeyboard(dpy,CurrentTime); + #ifdef cimg_use_xrandr if (cimg::X11_attr().resolutions && cimg::X11_attr().curr_resolution) { XRRScreenConfiguration *config = XRRGetScreenInfo(dpy,DefaultRootWindow(dpy)); @@ -9685,7 +9970,7 @@ _height = std::min(dimh,(unsigned int)screen_height()); _normalization = normalization_type<4?normalization_type:3; _is_fullscreen = fullscreen_flag; - _window_x = _window_y = 0; + _window_x = _window_y = cimg::type::min(); _is_closed = closed_flag; _title = tmp_title; flush(); @@ -9694,10 +9979,10 @@ if (_is_fullscreen) { if (!_is_closed) _init_fullscreen(); const unsigned int sx = screen_width(), sy = screen_height(); - XSetWindowAttributes winattr; - winattr.override_redirect = 1; + XSetWindowAttributes attr_set; + attr_set.override_redirect = 1; _window = XCreateWindow(dpy,DefaultRootWindow(dpy),(sx - _width)/2,(sy - _height)/2,_width,_height,0,0, - InputOutput,CopyFromParent,CWOverrideRedirect,&winattr); + InputOutput,CopyFromParent,CWOverrideRedirect,&attr_set); } else _window = XCreateSimpleWindow(dpy,DefaultRootWindow(dpy),0,0,_width,_height,0,0L,0L); @@ -9768,7 +10053,7 @@ if (_is_fullscreen) XGrabKeyboard(dpy,_window,1,GrabModeAsync,GrabModeAsync,CurrentTime); cimg::X11_attr().wins[cimg::X11_attr().nb_wins++]=this; - if (!_is_closed) _map_window(); else { _window_x = _window_y = cimg::type::min(); } + if (!_is_closed) _map_window(); else _window_x = _window_y = cimg::type::min(); cimg_unlock_display(); cimg::mutex(14,0); } @@ -9786,28 +10071,28 @@ // Destroy window, image, colormap and title. if (_is_fullscreen && !_is_closed) _desinit_fullscreen(); - XDestroyWindow(dpy,_window); - _window = 0; + + #ifdef cimg_use_xshm if (_shminfo) { XShmDetach(dpy,_shminfo); - XDestroyImage(_image); shmdt(_shminfo->shmaddr); shmctl(_shminfo->shmid,IPC_RMID,0); delete _shminfo; _shminfo = 0; - } else + } #endif - XDestroyImage(_image); - _data = 0; _image = 0; + + XDestroyImage(_image); if (cimg::X11_attr().nb_bits==8) XFreeColormap(dpy,_colormap); - _colormap = 0; + XDestroyWindow(dpy,_window); XSync(dpy,0); + _window = 0; _colormap = 0; _data = 0; _image = 0; // Reset display variables. delete[] _title; _width = _height = _normalization = _window_width = _window_height = 0; - _window_x = _window_y = 0; + _window_x = _window_y = cimg::type::min(); _is_fullscreen = false; _is_closed = true; _min = _max = 0; @@ -9920,9 +10205,9 @@ CImgDisplay& show() { if (is_empty() || !_is_closed) return *this; cimg_lock_display(); + _is_closed = false; if (_is_fullscreen) _init_fullscreen(); _map_window(); - _is_closed = false; cimg_unlock_display(); return paint(); } @@ -9933,7 +10218,7 @@ cimg_lock_display(); if (_is_fullscreen) _desinit_fullscreen(); XUnmapWindow(dpy,_window); - _window_x = _window_y = -1; + _window_x = _window_y = cimg::type::min(); _is_closed = true; cimg_unlock_display(); return *this; @@ -9941,12 +10226,13 @@ CImgDisplay& move(const int posx, const int posy) { if (is_empty()) return *this; + show(); if (_window_x!=posx || _window_y!=posy) { - show(); Display *const dpy = cimg::X11_attr().display; cimg_lock_display(); XMoveWindow(dpy,_window,posx,posy); - _window_x = posx; _window_y = posy; + _window_x = posx; + _window_y = posy; cimg_unlock_display(); } _is_moved = false; @@ -10568,7 +10854,7 @@ switch (msg) { case WM_CLOSE : disp->_mouse_x = disp->_mouse_y = -1; - disp->_window_x = disp->_window_y = 0; + disp->_window_x = disp->_window_y = cimg::type::min(); disp->set_button().set_key(0).set_key(0,false)._is_closed = true; ReleaseMutex(disp->_mutex); ShowWindow(disp->_window,SW_HIDE); @@ -10603,7 +10889,7 @@ case WM_PAINT : disp->paint(); cimg_lock_display(); - if (disp->_is_cursor_visible) while (ShowCursor(TRUE)<0); else while (ShowCursor(FALSE)>=0); + if (disp->_is_cursor_visible) while (ShowCursor(TRUE)<0); else while (ShowCursor(FALSE_WIN)>=0); cimg_unlock_display(); break; case WM_ERASEBKGND : @@ -10635,7 +10921,7 @@ disp->_is_event = true; SetEvent(cimg::Win32_attr().wait_event); cimg_lock_display(); - if (disp->_is_cursor_visible) while (ShowCursor(TRUE)<0); else while (ShowCursor(FALSE)>=0); + if (disp->_is_cursor_visible) while (ShowCursor(TRUE)<0); else while (ShowCursor(FALSE_WIN)>=0); cimg_unlock_display(); } break; case WM_MOUSELEAVE : { @@ -10699,16 +10985,26 @@ AdjustWindowRect(&rect,WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,false); const int border1 = (int)((rect.right - rect.left + 1 - disp->_width)/2), - border2 = (int)(rect.bottom - rect.top + 1 - disp->_height - border1); + border2 = (int)(rect.bottom - rect.top + 1 - disp->_height - border1), + ww = disp->_width + 2*border1, + wh = disp->_height + border1 + border2, + sw = CImgDisplay::screen_width(), + sh = CImgDisplay::screen_height(); + int + wx = (int)cimg::round(cimg::rand(0,sw - ww -1)), + wy = (int)cimg::round(cimg::rand(64,sh - wh - 65)); + if (wx + ww>=sw) wx = sw - ww; + if (wy + wh>=sh) wy = sh - wh; + if (wx<0) wx = 0; + if (wy<0) wy = 0; disp->_window = CreateWindowA("MDICLIENT",title?title:" ", - WS_OVERLAPPEDWINDOW | (disp->_is_closed?0:WS_VISIBLE), CW_USEDEFAULT,CW_USEDEFAULT, - disp->_width + 2*border1, disp->_height + border1 + border2, - 0,0,0,&(disp->_ccs)); + WS_OVERLAPPEDWINDOW | (disp->_is_closed?0:WS_VISIBLE), + wx,wy,ww,wh,0,0,0,&(disp->_ccs)); if (!disp->_is_closed) { GetWindowRect(disp->_window,&rect); - disp->_window_x = rect.left + border1; - disp->_window_y = rect.top + border2; - } else disp->_window_x = disp->_window_y = 0; + disp->_window_x = rect.left; + disp->_window_y = rect.top; + } else disp->_window_x = disp->_window_y = cimg::type::min(); } else { // Fullscreen window const unsigned int sx = (unsigned int)screen_width(), @@ -10738,17 +11034,14 @@ } CImgDisplay& _update_window_pos() { - if (_is_closed) _window_x = _window_y = -1; + if (_is_closed) _window_x = _window_y = cimg::type::min(); else { RECT rect; rect.left = rect.top = 0; rect.right = (LONG)_width - 1; rect.bottom = (LONG)_height - 1; AdjustWindowRect(&rect,WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,false); - const int - border1 = (int)((rect.right - rect.left + 1 - _width)/2), - border2 = (int)(rect.bottom - rect.top + 1 - _height - border1); GetWindowRect(_window,&rect); - _window_x = rect.left + border1; - _window_y = rect.top + border2; + _window_x = rect.left; + _window_y = rect.top; } return *this; } @@ -10811,7 +11104,7 @@ _height = std::min(dimh,(unsigned int)screen_height()); _normalization = normalization_type<4?normalization_type:3; _is_fullscreen = fullscreen_flag; - _window_x = _window_y = 0; + _window_x = _window_y = cimg::type::min(); _is_closed = closed_flag; _is_cursor_visible = true; _is_mouse_tracked = false; @@ -10823,8 +11116,8 @@ void *const arg = (void*)(new void*[2]); ((void**)arg)[0] = (void*)this; ((void**)arg)[1] = (void*)_title; - _mutex = CreateMutex(0,FALSE,0); - _is_created = CreateEvent(0,FALSE,FALSE,0); + _mutex = CreateMutex(0,FALSE_WIN,0); + _is_created = CreateEvent(0,FALSE_WIN,FALSE_WIN,0); _thread = CreateThread(0,0,_events_thread,arg,0,0); WaitForSingleObject(_is_created,INFINITE); return *this; @@ -10840,7 +11133,7 @@ _title = 0; if (_is_fullscreen) _desinit_fullscreen(); _width = _height = _normalization = _window_width = _window_height = 0; - _window_x = _window_y = 0; + _window_x = _window_y = cimg::type::min(); _is_fullscreen = false; _is_closed = true; _min = _max = 0; @@ -10959,26 +11252,18 @@ _is_closed = true; if (_is_fullscreen) _desinit_fullscreen(); ShowWindow(_window,SW_HIDE); - _window_x = _window_y = 0; + _window_x = _window_y = cimg::type::min(); return *this; } CImgDisplay& move(const int posx, const int posy) { if (is_empty()) return *this; if (_window_x!=posx || _window_y!=posy) { - if (!_is_fullscreen) { - RECT rect; - rect.left = rect.top = 0; rect.right = (LONG)_window_width - 1; rect.bottom = (LONG)_window_height - 1; - AdjustWindowRect(&rect,WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,false); - const int - border1 = (int)((rect.right - rect.left + 1 -_width)/2), - border2 = (int)(rect.bottom - rect.top + 1 - _height - border1); - SetWindowPos(_window,0,posx - border1,posy - border2,0,0,SWP_NOSIZE | SWP_NOZORDER); - } else SetWindowPos(_window,0,posx,posy,0,0,SWP_NOSIZE | SWP_NOZORDER); + SetWindowPos(_window,0,posx,posy,0,0,SWP_NOSIZE | SWP_NOZORDER); _window_x = posx; _window_y = posy; - show(); } + show(); _is_moved = false; return *this; } @@ -10997,9 +11282,11 @@ CImgDisplay& set_mouse(const int posx, const int posy) { if (is_empty() || _is_closed || posx<0 || posy<0) return *this; - _update_window_pos(); - const int res = (int)SetCursorPos(_window_x + posx,_window_y + posy); - if (res) { _mouse_x = posx; _mouse_y = posy; } + if (!_is_closed) { + _update_window_pos(); + const int res = (int)SetCursorPos(_window_x + posx,_window_y + posy); + if (res) { _mouse_x = posx; _mouse_y = posy; } + } return *this; } @@ -11090,7 +11377,10 @@ } else { if (_normalization==3) { if (cimg::type::is_float()) _min = (float)img.min_max(_max); - else { _min = (float)cimg::type::min(); _max = (float)cimg::type::max(); } + else { + _min = (float)cimg::type::min(); + _max = (float)cimg::type::max(); + } } else if ((_min>_max) || _normalization==1) _min = (float)img.min_max(_max); const float delta = _max - _min, mm = 255/(delta?delta:1.f); switch (img._spectrum) { @@ -11204,7 +11494,7 @@ #endif //@} - }; + }; // struct CImgDisplay { ... /* #-------------------------------------- @@ -11675,7 +11965,7 @@ } template - CImg & operator=(std::initializer_list values) { + CImg& operator=(std::initializer_list values) { _cimg_constructor_cpp11(siz>values.size()); return *this; } @@ -11835,6 +12125,60 @@ } else { _width = _height = _depth = _spectrum = 0; _is_shared = false; _data = 0; } } + //! Construct image from memory buffer with specified size and pixel ordering scheme. + template + CImg(const t *const values, const unsigned int size_x, const unsigned int size_y, + const unsigned int size_z, const unsigned int size_c, + const char *const axes_order):_data(0),_is_shared(false) { + const size_t siz = (size_t)size_x*size_y*size_z*size_c; + if (values && siz) { + unsigned char s_code[4] = { 0,1,2,3 }, n_code[4] = { 0 }; + for (unsigned int l = 0; axes_order[l]; ++l) { + int c = cimg::lowercase(axes_order[l]); + if (l>=4 || (c!='x' && c!='y' && c!='z' && c!='c')) { *s_code = 4; break; } + else { ++n_code[c%=4]; s_code[l] = c; } + } + if (*axes_order && *s_code<4 && *n_code<=1 && n_code[1]<=1 && n_code[2]<=1 && n_code[3]<=1) { + const unsigned int code = (s_code[0]<<12) | (s_code[1]<<8) | (s_code[2]<<4) | (s_code[3]); + int s0 = 0, s1 = 0, s2 = 0, s3 = 0; + const char *inv_order = 0; + switch (code) { + case 0x0123 : inv_order = "xyzc"; s0 = size_x; s1 = size_y; s2 = size_z; s3 = size_c; break; // xyzc + case 0x0132 : inv_order = "xyzc"; s0 = size_x; s1 = size_y; s2 = size_c; s3 = size_z; break; // xycz + case 0x0213 : inv_order = "xzyc"; s0 = size_x; s1 = size_z; s2 = size_y; s3 = size_c; break; // xzyc + case 0x0231 : inv_order = "xcyz"; s0 = size_x; s1 = size_z; s2 = size_c; s3 = size_y; break; // xzcy + case 0x0312 : inv_order = "xzcy"; s0 = size_x; s1 = size_c; s2 = size_y; s3 = size_z; break; // xcyz + case 0x0321 : inv_order = "xczy"; s0 = size_x; s1 = size_c; s2 = size_z; s3 = size_y; break; // xczy + case 0x1023 : inv_order = "yxzc"; s0 = size_y; s1 = size_x; s2 = size_z; s3 = size_c; break; // yxzc + case 0x1032 : inv_order = "yxcz"; s0 = size_y; s1 = size_x; s2 = size_c; s3 = size_z; break; // yxcz + case 0x1203 : inv_order = "zxyc"; s0 = size_y; s1 = size_z; s2 = size_x; s3 = size_c; break; // yzxc + case 0x1230 : inv_order = "cxyz"; s0 = size_y; s1 = size_z; s2 = size_c; s3 = size_x; break; // yzcx + case 0x1302 : inv_order = "zxcy"; s0 = size_y; s1 = size_c; s2 = size_x; s3 = size_z; break; // ycxz + case 0x1320 : inv_order = "cxzy"; s0 = size_y; s1 = size_c; s2 = size_z; s3 = size_x; break; // yczx + case 0x2013 : inv_order = "yzxc"; s0 = size_z; s1 = size_x; s2 = size_y; s3 = size_c; break; // zxyc + case 0x2031 : inv_order = "ycxz"; s0 = size_z; s1 = size_x; s2 = size_c; s3 = size_y; break; // zxcy + case 0x2103 : inv_order = "zyxc"; s0 = size_z; s1 = size_y; s2 = size_x; s3 = size_c; break; // zyxc + case 0x2130 : inv_order = "cyxz"; s0 = size_z; s1 = size_y; s2 = size_c; s3 = size_x; break; // zycx + case 0x2301 : inv_order = "zcxy"; s0 = size_z; s1 = size_c; s2 = size_x; s3 = size_y; break; // zcxy + case 0x2310 : inv_order = "czxy"; s0 = size_z; s1 = size_c; s2 = size_y; s3 = size_x; break; // zcyx + case 0x3012 : inv_order = "yzcx"; s0 = size_c; s1 = size_x; s2 = size_y; s3 = size_z; break; // cxyz + case 0x3021 : inv_order = "yczx"; s0 = size_c; s1 = size_x; s2 = size_z; s3 = size_y; break; // cxzy + case 0x3102 : inv_order = "zycx"; s0 = size_c; s1 = size_y; s2 = size_x; s3 = size_z; break; // cyxz + case 0x3120 : inv_order = "cyzx"; s0 = size_c; s1 = size_y; s2 = size_z; s3 = size_x; break; // cyzx + case 0x3201 : inv_order = "zcyx"; s0 = size_c; s1 = size_z; s2 = size_x; s3 = size_y; break; // czxy + case 0x3210 : inv_order = "czyx"; s0 = size_c; s1 = size_z; s2 = size_y; s3 = size_x; break; // czyx + } + CImg(values,s0,s1,s2,s3,true).get_permute_axes(inv_order).move_to(*this); + } else { + _width = _height = _depth = _spectrum = 0; _data = 0; + throw CImgArgumentException(_cimg_instance + "CImg(): Invalid specified axes order '%s'.", + cimg_instance, + axes_order); + } + } else { _width = _height = _depth = _spectrum = 0; _is_shared = false; _data = 0; } + } + //! Construct image from reading an image file. /** Construct a new image instance with pixels of type \c T, and initialize pixel values with the data read from @@ -11843,7 +12187,7 @@ \note - Similar to CImg(unsigned int,unsigned int,unsigned int,unsigned int), but it reads the image dimensions and pixel values from the specified image file. - - The recognition of the image file format by %CImg higly depends on the tools installed on your system + - The recognition of the image file format by %CImg higlhy depends on the tools installed on your system and on the external libraries you used to link your code against. - Considered pixel type \c T should better fit the file format specification, or data loss may occur during file load (e.g. constructing a \c CImg from a float-valued image file). @@ -12041,6 +12385,7 @@ CImg(CImg&& img):_width(0),_height(0),_depth(0),_spectrum(0),_is_shared(false),_data(0) { swap(img); } + CImg& operator=(CImg&& img) { if (_is_shared) return assign(img); return img.swap(*this); @@ -12069,7 +12414,7 @@ if (siz!=curr_siz) { if (_is_shared) throw CImgArgumentException(_cimg_instance - "assign(): Invalid assignement request of shared instance from specified " + "assign(): Invalid assignment request of shared instance from specified " "image (%u,%u,%u,%u).", cimg_instance, size_x,size_y,size_z,size_c); @@ -12205,6 +12550,14 @@ return *this; } + //! Construct image from memory buffer with specified size and pixel ordering scheme. + template + CImg& assign(const t *const values, const unsigned int size_x, const unsigned int size_y, + const unsigned int size_z, const unsigned int size_c, + const char *const axes_order) { + CImg(values,size_x,size_y,size_z,size_c,axes_order).move_to(*this); + } + //! Construct image from reading an image file \inplace. /** In-place version of the constructor CImg(const char*). @@ -12331,7 +12684,7 @@ \param list Destination list. \param pos Position of the newly inserted image in the list. \note - - When optional parameter \c pos is ommited, the image instance is transfered as a new + - When optional parameter \c pos is omitted, the image instance is transferred as a new image at the end of the specified \c list. - It is convenient to sequentially insert new images into image lists, with no additional copies of memory buffer. @@ -12415,7 +12768,7 @@ \warning - There is \e no boundary checking done in this operator, to make it as fast as possible. You \e must take care of out-of-bounds access by yourself, if necessary. - For debuging purposes, you may want to define macro \c 'cimg_verbosity'>=3 to enable additional boundary + For debugging purposes, you may want to define macro \c 'cimg_verbosity'>=3 to enable additional boundary checking operations in this operator. In that case, warning messages will be printed on the error output when accessing out-of-bounds pixels. \par Example @@ -12528,9 +12881,9 @@ } #endif - //! Implicitely cast an image into a \c T*. + //! Implicitly cast an image into a \c T*. /** - Implicitely cast a \c CImg instance into a \c T* or \c const \c T* pointer, whether the image instance + Implicitly cast a \c CImg instance into a \c T* or \c const \c T* pointer, whether the image instance is \e const or not. The returned pointer points on the first value of the image pixel buffer. \note - It simply returns the pointer data() to the pixel buffer. @@ -12554,7 +12907,7 @@ return _data; } - //! Implicitely cast an image into a \c T* \const. + //! Implicitly cast an image into a \c T* \const. operator const T*() const { return _data; } @@ -12589,7 +12942,7 @@ replace the image instance. The image size is modified if necessary. \par Example \code - CImg img1(100,100), img2(img1), img3(img1); // Declare 3 scalar images 100x100 with unitialized values + CImg img1(100,100), img2(img1), img3(img1); // Declare 3 scalar images 100x100 with uninitialized values img1 = "0,50,100,150,200,250,200,150,100,50"; // Set pixel values of 'img1' from a value sequence img2 = "10*((x*y)%25)"; // Set pixel values of 'img2' from a formula img3 = "reference.jpg"; // Set pixel values of 'img3' from a file (image size is modified) @@ -12781,9 +13134,9 @@ return CImg<_cimg_Tt>(*this,false)+=img; } - //! In-place substraction operator. + //! In-place subtraction operator. /** - Similar to operator+=(const t), except that it performs a substraction instead of an addition. + Similar to operator+=(const t), except that it performs a subtraction instead of an addition. **/ template CImg& operator-=(const t value) { @@ -12792,17 +13145,17 @@ return *this; } - //! In-place substraction operator. + //! In-place subtraction operator. /** - Similar to operator+=(const char*), except that it performs a substraction instead of an addition. + Similar to operator+=(const char*), except that it performs a subtraction instead of an addition. **/ CImg& operator-=(const char *const expression) { return *this-=(+*this)._fill(expression,true,1,0,0,"operator-=",this); } - //! In-place substraction operator. + //! In-place subtraction operator. /** - Similar to operator+=(const CImg&), except that it performs a substraction instead of an addition. + Similar to operator+=(const CImg&), except that it performs a subtraction instead of an addition. **/ template CImg& operator-=(const CImg& img) { @@ -12856,7 +13209,7 @@ return CImg(_width,_height,_depth,_spectrum,(T)0)-=*this; } - //! Substraction operator. + //! Subtraction operator. /** Similar to operator-=(const t), except that it returns a new image instance instead of operating in-place. The pixel type of the returned image may be a superset of the initial pixel type \c T, if necessary. @@ -12866,7 +13219,7 @@ return CImg<_cimg_Tt>(*this,false)-=value; } - //! Substraction operator. + //! Subtraction operator. /** Similar to operator-=(const char*), except that it returns a new image instance instead of operating in-place. The pixel type of the returned image may be a superset of the initial pixel type \c T, if necessary. @@ -12875,7 +13228,7 @@ return CImg(*this,false)-=expression; } - //! Substraction operator. + //! Subtraction operator. /** Similar to operator-=(const CImg&), except that it returns a new image instance instead of operating in-place. The pixel type of the returned image may be a superset of the initial pixel type \c T, if necessary. @@ -12957,7 +13310,7 @@ if (_width!=img._height || _depth!=1 || _spectrum!=1) throw CImgArgumentException(_cimg_instance "operator*(): Invalid multiplication of instance by specified " - "matrix (%u,%u,%u,%u,%p)", + "matrix (%u,%u,%u,%u,%p).", cimg_instance, img._width,img._height,img._depth,img._spectrum,img._data); CImg res(img._width,_height); @@ -12981,6 +13334,7 @@ return res; default : { Ttdouble val = 0; + cimg_pragma_openmp(parallel for reduction(+:val) cimg_openmp_if_size(size(),4096)) cimg_forX(*this,i) val+=(Ttdouble)_data[i]*img[i]; res[0] = val; return res; @@ -13073,49 +13427,55 @@ return res; } else switch (_width) { // Square_matrix * Matrix case 2 : { // 2x2_matrix * Matrix - const t *ps0 = img.data(), *ps1 = img.data(0,1); - Tt *pd0 = res.data(), *pd1 = res.data(0,1); + const t *const ps0 = img.data(), *const ps1 = img.data(0,1); + Tt *const pd0 = res.data(), *const pd1 = res.data(0,1); const Ttdouble a0 = (Ttdouble)_data[0], a1 = (Ttdouble)_data[1], a2 = (Ttdouble)_data[2], a3 = (Ttdouble)_data[3]; + cimg_pragma_openmp(parallel for cimg_openmp_if_size(img.width(),4096)) cimg_forX(img,i) { - const Ttdouble x = (Ttdouble)*(ps0++), y = (Ttdouble)*(ps1++); - *(pd0++) = (Tt)(a0*x + a1*y); - *(pd1++) = (Tt)(a2*x + a3*y); + const Ttdouble x = (Ttdouble)ps0[i], y = (Ttdouble)ps1[i]; + pd0[i] = (Tt)(a0*x + a1*y); + pd1[i] = (Tt)(a2*x + a3*y); } return res; } case 3 : { // 3x3_matrix * Matrix - const t *ps0 = img.data(), *ps1 = img.data(0,1), *ps2 = img.data(0,2); - Tt *pd0 = res.data(), *pd1 = res.data(0,1), *pd2 = res.data(0,2); + const t *const ps0 = img.data(), *const ps1 = img.data(0,1), *const ps2 = img.data(0,2); + Tt *const pd0 = res.data(), *const pd1 = res.data(0,1), *const pd2 = res.data(0,2); const Ttdouble a0 = (Ttdouble)_data[0], a1 = (Ttdouble)_data[1], a2 = (Ttdouble)_data[2], a3 = (Ttdouble)_data[3], a4 = (Ttdouble)_data[4], a5 = (Ttdouble)_data[5], a6 = (Ttdouble)_data[6], a7 = (Ttdouble)_data[7], a8 = (Ttdouble)_data[8]; + cimg_pragma_openmp(parallel for cimg_openmp_if_size(img.width(),1024)) cimg_forX(img,i) { - const Ttdouble x = (Ttdouble)*(ps0++), y = (Ttdouble)*(ps1++), z = (Ttdouble)*(ps2++); - *(pd0++) = (Tt)(a0*x + a1*y + a2*z); - *(pd1++) = (Tt)(a3*x + a4*y + a5*z); - *(pd2++) = (Tt)(a6*x + a7*y + a8*z); + const Ttdouble x = (Ttdouble)ps0[i], y = (Ttdouble)ps1[i], z = (Ttdouble)ps2[i]; + pd0[i] = (Tt)(a0*x + a1*y + a2*z); + pd1[i] = (Tt)(a3*x + a4*y + a5*z); + pd2[i] = (Tt)(a6*x + a7*y + a8*z); } return res; } case 4 : { // 4x4_matrix * Matrix - const t *ps0 = img.data(), *ps1 = img.data(0,1), *ps2 = img.data(0,2), *ps3 = img.data(0,3); - Tt *pd0 = res.data(), *pd1 = res.data(0,1), *pd2 = res.data(0,2), *pd3 = res.data(0,3); + const t + *const ps0 = img.data(), *const ps1 = img.data(0,1), + *const ps2 = img.data(0,2), *const ps3 = img.data(0,3); + Tt + *const pd0 = res.data(), *const pd1 = res.data(0,1), + *const pd2 = res.data(0,2), *const pd3 = res.data(0,3); const Ttdouble a0 = (Ttdouble)_data[0], a1 = (Ttdouble)_data[1], a2 = (Ttdouble)_data[2], a3 = (Ttdouble)_data[3], a4 = (Ttdouble)_data[4], a5 = (Ttdouble)_data[5], a6 = (Ttdouble)_data[6], a7 = (Ttdouble)_data[7], a8 = (Ttdouble)_data[8], a9 = (Ttdouble)_data[9], a10 = (Ttdouble)_data[10], a11 = (Ttdouble)_data[11], a12 = (Ttdouble)_data[12], a13 = (Ttdouble)_data[13], a14 = (Ttdouble)_data[14], a15 = (Ttdouble)_data[15]; - cimg_forX(img,col) { - const Ttdouble x = (Ttdouble)*(ps0++), y = (Ttdouble)*(ps1++), z = (Ttdouble)*(ps2++), - c = (Ttdouble)*(ps3++); - *(pd0++) = (Tt)(a0*x + a1*y + a2*z + a3*c); - *(pd1++) = (Tt)(a4*x + a5*y + a6*z + a7*c); - *(pd2++) = (Tt)(a8*x + a9*y + a10*z + a11*c); - *(pd3++) = (Tt)(a12*x + a13*y + a14*z + a15*c); + cimg_pragma_openmp(parallel for cimg_openmp_if_size(img.width(),512)) + cimg_forX(img,i) { + const Ttdouble x = (Ttdouble)ps0[i], y = (Ttdouble)ps1[i], z = (Ttdouble)ps2[i], c = (Ttdouble)ps3[i]; + pd0[i] = (Tt)(a0*x + a1*y + a2*z + a3*c); + pd1[i] = (Tt)(a4*x + a5*y + a6*z + a7*c); + pd2[i] = (Tt)(a8*x + a9*y + a10*z + a11*c); + pd3[i] = (Tt)(a12*x + a13*y + a14*z + a15*c); } return res; } @@ -13123,17 +13483,21 @@ } // Fallback to generic version. -#ifdef cimg_use_openmp +#if cimg_use_openmp!=0 cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) cimg_openmp_if(size()>(cimg_openmp_sizefactor)*1024 && img.size()>(cimg_openmp_sizefactor)*1024)) cimg_forXY(res,i,j) { - Ttdouble value = 0; cimg_forX(*this,k) value+=(*this)(k,j)*img(i,k); res(i,j) = (Tt)value; + Ttdouble value = 0; + cimg_forX(*this,k) value+=(*this)(k,j)*img(i,k); + res(i,j) = (Tt)value; } #else Tt *ptrd = res._data; cimg_forXY(res,i,j) { - Ttdouble value = 0; cimg_forX(*this,k) value+=(*this)(k,j)*img(i,k); *(ptrd++) = (Tt)value; + Ttdouble value = 0; + cimg_forX(*this,k) value+=(*this)(k,j)*img(i,k); + *(ptrd++) = (Tt)value; } #endif return res; @@ -13643,8 +14007,8 @@ //! Test if two images have the same size and values. /** - Return \c true if the image instance and the input image \c img have the same dimensions and pixel values, - and \c false otherwise. + Return \c true if the image instance and the input image \c img have the same pixel values, + even if the dimensions of the two images do not match. It returns \c false otherwise. \param img Input image to compare with. \note - The pixel buffer pointers data() of the two compared images do not have to be the same for operator==() @@ -13755,7 +14119,7 @@ //! Split image along specified axis. /** - Return a new list of images (\c CImgList instance) containing the splitted components + Return a new list of images (\c CImgList instance) containing the split components of the instance image along the specified axis. \param axis Splitting axis (can be '\c x','\c y','\c z' or '\c c') \note @@ -14378,6 +14742,30 @@ return Ic + dx*(In - Ic); } + //! Return pixel value, using linear interpolation and periodic boundary conditions for the X-coordinate. + Tfloat linear_atX_p(const float fx, const int y=0, const int z=0, const int c=0) const { + if (is_empty()) + throw CImgInstanceException(_cimg_instance + "linear_atX_p(): Empty instance.", + cimg_instance); + + return _linear_atX_p(fx,y,z,c); + } + + Tfloat _linear_atX_p(const float fx, const int y=0, const int z=0, const int c=0) const { + const float + nfx = cimg::mod(fx,_width - 0.5f); + const unsigned int + x = (unsigned int)nfx; + const float + dx = nfx - x; + const unsigned int + nx = cimg::mod(x + 1,_width); + const Tfloat + Ic = (Tfloat)(*this)(x,y,z,c), In = (Tfloat)(*this)(nx,y,z,c); + return Ic + dx*(In - Ic); + } + //! Return pixel value, using linear interpolation and Dirichlet boundary conditions for the X and Y-coordinates. /** Similar to linear_atX(float,int,int,int,const T) const, except that the linear interpolation and the @@ -14393,7 +14781,7 @@ const Tfloat Icc = (Tfloat)atXY(x,y,z,c,out_value), Inc = (Tfloat)atXY(nx,y,z,c,out_value), Icn = (Tfloat)atXY(x,ny,z,c,out_value), Inn = (Tfloat)atXY(nx,ny,z,c,out_value); - return Icc + dx*(Inc - Icc + dy*(Icc + Inn - Icn - Inc)) + dy*(Icn - Icc); + return Icc + (Inc - Icc + (Icc + Inn - Icn - Inc)*dy)*dx + (Icn - Icc)*dy; } //! Return pixel value, using linear interpolation and Neumann boundary conditions for the X and Y-coordinates. @@ -14429,7 +14817,36 @@ const Tfloat Icc = (Tfloat)(*this)(x,y,z,c), Inc = (Tfloat)(*this)(nx,y,z,c), Icn = (Tfloat)(*this)(x,ny,z,c), Inn = (Tfloat)(*this)(nx,ny,z,c); - return Icc + dx*(Inc - Icc + dy*(Icc + Inn - Icn - Inc)) + dy*(Icn - Icc); + return Icc + (Inc - Icc + (Icc + Inn - Icn - Inc)*dy)*dx + (Icn - Icc)*dy; + } + + //! Return pixel value, using linear interpolation and periodic boundary conditions for the X and Y-coordinates. + Tfloat linear_atXY_p(const float fx, const float fy, const int z=0, const int c=0) const { + if (is_empty()) + throw CImgInstanceException(_cimg_instance + "linear_atXY_p(): Empty instance.", + cimg_instance); + + return _linear_atXY_p(fx,fy,z,c); + } + + Tfloat _linear_atXY_p(const float fx, const float fy, const int z=0, const int c=0) const { + const float + nfx = cimg::mod(fx,_width - 0.5f), + nfy = cimg::mod(fy,_height - 0.5f); + const unsigned int + x = (unsigned int)nfx, + y = (unsigned int)nfy; + const float + dx = nfx - x, + dy = nfy - y; + const unsigned int + nx = cimg::mod(x + 1,_width), + ny = cimg::mod(y + 1,_height); + const Tfloat + Icc = (Tfloat)(*this)(x,y,z,c), Inc = (Tfloat)(*this)(nx,y,z,c), + Icn = (Tfloat)(*this)(x,ny,z,c), Inn = (Tfloat)(*this)(nx,ny,z,c); + return Icc + (Inc - Icc + (Icc + Inn - Icn - Inc)*dy)*dx + (Icn - Icc)*dy; } //! Return pixel value, using linear interpolation and Dirichlet boundary conditions for the X,Y and Z-coordinates. @@ -14452,13 +14869,13 @@ Iccn = (Tfloat)atXYZ(x,y,nz,c,out_value), Incn = (Tfloat)atXYZ(nx,y,nz,c,out_value), Icnn = (Tfloat)atXYZ(x,ny,nz,c,out_value), Innn = (Tfloat)atXYZ(nx,ny,nz,c,out_value); return Iccc + - dx*(Incc - Iccc + - dy*(Iccc + Innc - Icnc - Incc + - dz*(Iccn + Innn + Icnc + Incc - Icnn - Incn - Iccc - Innc)) + - dz*(Iccc + Incn - Iccn - Incc)) + - dy*(Icnc - Iccc + - dz*(Iccc + Icnn - Iccn - Icnc)) + - dz*(Iccn - Iccc); + (Incc - Iccc + + (Iccc + Innc - Icnc - Incc + + (Iccn + Innn + Icnc + Incc - Icnn - Incn - Iccc - Innc)*dz)*dy + + (Iccc + Incn - Iccn - Incc)*dz)*dx + + (Icnc - Iccc + + (Iccc + Icnn - Iccn - Icnc)*dz)*dy + + (Iccn - Iccc)*dz; } //! Return pixel value, using linear interpolation and Neumann boundary conditions for the X,Y and Z-coordinates. @@ -14501,13 +14918,55 @@ Iccn = (Tfloat)(*this)(x,y,nz,c), Incn = (Tfloat)(*this)(nx,y,nz,c), Icnn = (Tfloat)(*this)(x,ny,nz,c), Innn = (Tfloat)(*this)(nx,ny,nz,c); return Iccc + - dx*(Incc - Iccc + - dy*(Iccc + Innc - Icnc - Incc + - dz*(Iccn + Innn + Icnc + Incc - Icnn - Incn - Iccc - Innc)) + - dz*(Iccc + Incn - Iccn - Incc)) + - dy*(Icnc - Iccc + - dz*(Iccc + Icnn - Iccn - Icnc)) + - dz*(Iccn - Iccc); + (Incc - Iccc + + (Iccc + Innc - Icnc - Incc + + (Iccn + Innn + Icnc + Incc - Icnn - Incn - Iccc - Innc)*dz)*dy + + (Iccc + Incn - Iccn - Incc)*dz)*dx + + (Icnc - Iccc + + (Iccc + Icnn - Iccn - Icnc)*dz)*dy + + (Iccn - Iccc)*dz; + } + + //! Return pixel value, using linear interpolation and periodic boundary conditions for the X,Y and Z-coordinates. + Tfloat linear_atXYZ_p(const float fx, const float fy=0, const float fz=0, const int c=0) const { + if (is_empty()) + throw CImgInstanceException(_cimg_instance + "linear_atXYZ_p(): Empty instance.", + cimg_instance); + + return _linear_atXYZ_p(fx,fy,fz,c); + } + + Tfloat _linear_atXYZ_p(const float fx, const float fy=0, const float fz=0, const int c=0) const { + const float + nfx = cimg::mod(fx,_width - 0.5f), + nfy = cimg::mod(fy,_height - 0.5f), + nfz = cimg::mod(fz,_depth - 0.5f); + const unsigned int + x = (unsigned int)nfx, + y = (unsigned int)nfy, + z = (unsigned int)nfz; + const float + dx = nfx - x, + dy = nfy - y, + dz = nfz - z; + const unsigned int + nx = cimg::mod(x + 1,_width), + ny = cimg::mod(y + 1,_height), + nz = cimg::mod(z + 1,_depth); + const Tfloat + Iccc = (Tfloat)(*this)(x,y,z,c), Incc = (Tfloat)(*this)(nx,y,z,c), + Icnc = (Tfloat)(*this)(x,ny,z,c), Innc = (Tfloat)(*this)(nx,ny,z,c), + Iccn = (Tfloat)(*this)(x,y,nz,c), Incn = (Tfloat)(*this)(nx,y,nz,c), + Icnn = (Tfloat)(*this)(x,ny,nz,c), Innn = (Tfloat)(*this)(nx,ny,nz,c); + return Iccc + + (Incc - Iccc + + (Iccc + Innc - Icnc - Incc + + (Iccn + Innn + Icnc + Incc - Icnn - Incn - Iccc - Innc)*dz)*dy + + (Iccc + Incn - Iccn - Incc)*dz)*dx + + (Icnc - Iccc + + (Iccc + Icnn - Iccn - Icnc)*dz)*dy + + (Iccn - Iccc)*dz; } //! Return pixel value, using linear interpolation and Dirichlet boundary conditions for all X,Y,Z,C-coordinates. @@ -14620,6 +15079,65 @@ dc*(Icccn - Icccc); } + //! Return pixel value, using linear interpolation and periodic boundary conditions for all X,Y,Z and C-coordinates. + Tfloat linear_atXYZC_p(const float fx, const float fy=0, const float fz=0, const float fc=0) const { + if (is_empty()) + throw CImgInstanceException(_cimg_instance + "linear_atXYZC_p(): Empty instance.", + cimg_instance); + + return _linear_atXYZC_p(fx,fy,fz,fc); + } + + Tfloat _linear_atXYZC_p(const float fx, const float fy=0, const float fz=0, const float fc=0) const { + const float + nfx = cimg::mod(fx,_width - 0.5f), + nfy = cimg::mod(fy,_height - 0.5f), + nfz = cimg::mod(fz,_depth - 0.5f), + nfc = cimg::mod(fc,_spectrum - 0.5f); + const unsigned int + x = (unsigned int)nfx, + y = (unsigned int)nfy, + z = (unsigned int)nfz, + c = (unsigned int)nfc; + const float + dx = nfx - x, + dy = nfy - y, + dz = nfz - z, + dc = nfc - c; + const unsigned int + nx = cimg::mod(x + 1,_width), + ny = cimg::mod(y + 1,_height), + nz = cimg::mod(z + 1,_depth), + nc = cimg::mod(c + 1,_spectrum); + const Tfloat + Icccc = (Tfloat)(*this)(x,y,z,c), Inccc = (Tfloat)(*this)(nx,y,z,c), + Icncc = (Tfloat)(*this)(x,ny,z,c), Inncc = (Tfloat)(*this)(nx,ny,z,c), + Iccnc = (Tfloat)(*this)(x,y,nz,c), Incnc = (Tfloat)(*this)(nx,y,nz,c), + Icnnc = (Tfloat)(*this)(x,ny,nz,c), Innnc = (Tfloat)(*this)(nx,ny,nz,c), + Icccn = (Tfloat)(*this)(x,y,z,nc), Inccn = (Tfloat)(*this)(nx,y,z,nc), + Icncn = (Tfloat)(*this)(x,ny,z,nc), Inncn = (Tfloat)(*this)(nx,ny,z,nc), + Iccnn = (Tfloat)(*this)(x,y,nz,nc), Incnn = (Tfloat)(*this)(nx,y,nz,nc), + Icnnn = (Tfloat)(*this)(x,ny,nz,nc), Innnn = (Tfloat)(*this)(nx,ny,nz,nc); + return Icccc + + dx*(Inccc - Icccc + + dy*(Icccc + Inncc - Icncc - Inccc + + dz*(Iccnc + Innnc + Icncc + Inccc - Icnnc - Incnc - Icccc - Inncc + + dc*(Iccnn + Innnn + Icncn + Inccn + Icnnc + Incnc + Icccc + Inncc - + Icnnn - Incnn - Icccn - Inncn - Iccnc - Innnc - Icncc - Inccc)) + + dc*(Icccn + Inncn + Icncc + Inccc - Icncn - Inccn - Icccc - Inncc)) + + dz*(Icccc + Incnc - Iccnc - Inccc + + dc*(Icccn + Incnn + Iccnc + Inccc - Iccnn - Inccn - Icccc - Incnc)) + + dc*(Icccc + Inccn - Inccc - Icccn)) + + dy*(Icncc - Icccc + + dz*(Icccc + Icnnc - Iccnc - Icncc + + dc*(Icccn + Icnnn + Iccnc + Icncc - Iccnn - Icncn - Icccc - Icnnc)) + + dc*(Icccc + Icncn - Icncc - Icccn)) + + dz*(Iccnc - Icccc + + dc*(Icccc + Iccnn - Iccnc - Icccn)) + + dc*(Icccn - Icccc); + } + //! Return pixel value, using cubic interpolation and Dirichlet boundary conditions for the X-coordinate. /** Return a cubicly-interpolated pixel value of the image instance located at (\c fx,\c y,\c z,\c c), @@ -14653,7 +15171,7 @@ Similar to cubic_atX(float,int,int,int,const T) const, except that the return value is clamped to stay in the min/max range of the datatype \c T. **/ - T cubic_cut_atX(const float fx, const int y, const int z, const int c, const T& out_value) const { + T cubic_atX_c(const float fx, const int y, const int z, const int c, const T& out_value) const { return cimg::type::cut(cubic_atX(fx,y,z,c,out_value)); } @@ -14702,14 +15220,46 @@ Similar to cubic_atX(float,int,int,int) const, except that the return value is clamped to stay in the min/max range of the datatype \c T. **/ - T cubic_cut_atX(const float fx, const int y, const int z, const int c) const { + T cubic_atX_c(const float fx, const int y, const int z, const int c) const { return cimg::type::cut(cubic_atX(fx,y,z,c)); } - T _cubic_cut_atX(const float fx, const int y, const int z, const int c) const { + T _cubic_atX_c(const float fx, const int y, const int z, const int c) const { return cimg::type::cut(_cubic_atX(fx,y,z,c)); } + //! Return pixel value, using cubic interpolation and periodic boundary conditions for the X-coordinate. + Tfloat cubic_atX_p(const float fx, const int y=0, const int z=0, const int c=0) const { + if (is_empty()) + throw CImgInstanceException(_cimg_instance + "cubic_atX_p(): Empty instance.", + cimg_instance); + return _cubic_atX_p(fx,y,z,c); + } + + Tfloat _cubic_atX_p(const float fx, const int y=0, const int z=0, const int c=0) const { + const float + nfx = cimg::type::is_nan(fx)?0:cimg::mod(fx,_width - 0.5f); + const int + x = (int)nfx; + const float + dx = nfx - x; + const int + px = cimg::mod(x - 1,width()), nx = cimg::mod(x + 1,width()), ax = cimg::mod(x + 2,width()); + const Tfloat + Ip = (Tfloat)(*this)(px,y,z,c), Ic = (Tfloat)(*this)(x,y,z,c), + In = (Tfloat)(*this)(nx,y,z,c), Ia = (Tfloat)(*this)(ax,y,z,c); + return Ic + 0.5f*(dx*(-Ip + In) + dx*dx*(2*Ip - 5*Ic + 4*In - Ia) + dx*dx*dx*(-Ip + 3*Ic - 3*In + Ia)); + } + + T cubic_atX_pc(const float fx, const int y, const int z, const int c) const { + return cimg::type::cut(cubic_atX_p(fx,y,z,c)); + } + + T _cubic_atX_pc(const float fx, const int y, const int z, const int c) const { + return cimg::type::cut(_cubic_atX_p(fx,y,z,c)); + } + //! Return pixel value, using cubic interpolation and Dirichlet boundary conditions for the X and Y-coordinates. /** Similar to cubic_atX(float,int,int,int,const T) const, except that the cubic interpolation and boundary checking @@ -14741,7 +15291,7 @@ Similar to cubic_atXY(float,float,int,int,const T) const, except that the return value is clamped to stay in the min/max range of the datatype \c T. **/ - T cubic_cut_atXY(const float fx, const float fy, const int z, const int c, const T& out_value) const { + T cubic_atXY_c(const float fx, const float fy, const int z, const int c, const T& out_value) const { return cimg::type::cut(cubic_atXY(fx,fy,z,c,out_value)); } @@ -14791,14 +15341,56 @@ Similar to cubic_atXY(float,float,int,int) const, except that the return value is clamped to stay in the min/max range of the datatype \c T. **/ - T cubic_cut_atXY(const float fx, const float fy, const int z, const int c) const { + T cubic_atXY_c(const float fx, const float fy, const int z, const int c) const { return cimg::type::cut(cubic_atXY(fx,fy,z,c)); } - T _cubic_cut_atXY(const float fx, const float fy, const int z, const int c) const { + T _cubic_atXY_c(const float fx, const float fy, const int z, const int c) const { return cimg::type::cut(_cubic_atXY(fx,fy,z,c)); } + //! Return pixel value, using cubic interpolation and periodic boundary conditions for the X and Y-coordinates. + Tfloat cubic_atXY_p(const float fx, const float fy, const int z=0, const int c=0) const { + if (is_empty()) + throw CImgInstanceException(_cimg_instance + "cubic_atXY_p(): Empty instance.", + cimg_instance); + return _cubic_atXY_p(fx,fy,z,c); + } + + Tfloat _cubic_atXY_p(const float fx, const float fy, const int z=0, const int c=0) const { + const float + nfx = cimg::type::is_nan(fx)?0:cimg::mod(fx,_width - 0.5f), + nfy = cimg::type::is_nan(fy)?0:cimg::mod(fy,_height - 0.5f); + const int x = (int)nfx, y = (int)nfy; + const float dx = nfx - x, dy = nfy - y; + const int + px = cimg::mod(x - 1,width()), nx = cimg::mod(x + 1,width()), ax = cimg::mod(x + 2,width()), + py = cimg::mod(y - 1,height()), ny = cimg::mod(y + 1,height()), ay = cimg::mod(y + 2,height()); + const Tfloat + Ipp = (Tfloat)(*this)(px,py,z,c), Icp = (Tfloat)(*this)(x,py,z,c), Inp = (Tfloat)(*this)(nx,py,z,c), + Iap = (Tfloat)(*this)(ax,py,z,c), + Ip = Icp + 0.5f*(dx*(-Ipp + Inp) + dx*dx*(2*Ipp - 5*Icp + 4*Inp - Iap) + dx*dx*dx*(-Ipp + 3*Icp - 3*Inp + Iap)), + Ipc = (Tfloat)(*this)(px,y,z,c), Icc = (Tfloat)(*this)(x, y,z,c), Inc = (Tfloat)(*this)(nx,y,z,c), + Iac = (Tfloat)(*this)(ax,y,z,c), + Ic = Icc + 0.5f*(dx*(-Ipc + Inc) + dx*dx*(2*Ipc - 5*Icc + 4*Inc - Iac) + dx*dx*dx*(-Ipc + 3*Icc - 3*Inc + Iac)), + Ipn = (Tfloat)(*this)(px,ny,z,c), Icn = (Tfloat)(*this)(x,ny,z,c), Inn = (Tfloat)(*this)(nx,ny,z,c), + Ian = (Tfloat)(*this)(ax,ny,z,c), + In = Icn + 0.5f*(dx*(-Ipn + Inn) + dx*dx*(2*Ipn - 5*Icn + 4*Inn - Ian) + dx*dx*dx*(-Ipn + 3*Icn - 3*Inn + Ian)), + Ipa = (Tfloat)(*this)(px,ay,z,c), Ica = (Tfloat)(*this)(x,ay,z,c), Ina = (Tfloat)(*this)(nx,ay,z,c), + Iaa = (Tfloat)(*this)(ax,ay,z,c), + Ia = Ica + 0.5f*(dx*(-Ipa + Ina) + dx*dx*(2*Ipa - 5*Ica + 4*Ina - Iaa) + dx*dx*dx*(-Ipa + 3*Ica - 3*Ina + Iaa)); + return Ic + 0.5f*(dy*(-Ip + In) + dy*dy*(2*Ip - 5*Ic + 4*In - Ia) + dy*dy*dy*(-Ip + 3*Ic - 3*In + Ia)); + } + + T cubic_atXY_pc(const float fx, const float fy, const int z, const int c) const { + return cimg::type::cut(cubic_atXY_p(fx,fy,z,c)); + } + + T _cubic_atXY_pc(const float fx, const float fy, const int z, const int c) const { + return cimg::type::cut(_cubic_atXY_p(fx,fy,z,c)); + } + //! Return pixel value, using cubic interpolation and Dirichlet boundary conditions for the X,Y and Z-coordinates. /** Similar to cubic_atX(float,int,int,int,const T) const, except that the cubic interpolation and boundary checking @@ -14891,7 +15483,7 @@ Similar to cubic_atXYZ(float,float,float,int,const T) const, except that the return value is clamped to stay in the min/max range of the datatype \c T. **/ - T cubic_cut_atXYZ(const float fx, const float fy, const float fz, const int c, const T& out_value) const { + T cubic_atXYZ_c(const float fx, const float fy, const float fz, const int c, const T& out_value) const { return cimg::type::cut(cubic_atXYZ(fx,fy,fz,c,out_value)); } @@ -15003,14 +15595,125 @@ Similar to cubic_atXYZ(float,float,float,int) const, except that the return value is clamped to stay in the min/max range of the datatype \c T. **/ - T cubic_cut_atXYZ(const float fx, const float fy, const float fz, const int c) const { + T cubic_atXYZ_c(const float fx, const float fy, const float fz, const int c) const { return cimg::type::cut(cubic_atXYZ(fx,fy,fz,c)); } - T _cubic_cut_atXYZ(const float fx, const float fy, const float fz, const int c) const { + T _cubic_atXYZ_c(const float fx, const float fy, const float fz, const int c) const { return cimg::type::cut(_cubic_atXYZ(fx,fy,fz,c)); } + //! Return pixel value, using cubic interpolation and Neumann boundary conditions for the X,Y and Z-coordinates. + /** + Similar to cubic_atX(float,int,int,int) const, except that the cubic interpolation and boundary checking + are achieved both for X,Y and Z-coordinates. + \note + - If you know your image instance is \e not empty, you may rather use the slightly faster method + \c _cubic_atXYZ(float,float,float,int). + **/ + Tfloat cubic_atXYZ_p(const float fx, const float fy, const float fz, const int c=0) const { + if (is_empty()) + throw CImgInstanceException(_cimg_instance + "cubic_atXYZ_p(): Empty instance.", + cimg_instance); + return _cubic_atXYZ_p(fx,fy,fz,c); + } + + Tfloat _cubic_atXYZ_p(const float fx, const float fy, const float fz, const int c=0) const { + const float + nfx = cimg::type::is_nan(fx)?0:cimg::mod(fx,_width - 0.5f), + nfy = cimg::type::is_nan(fy)?0:cimg::mod(fy,_height - 0.5f), + nfz = cimg::type::is_nan(fz)?0:cimg::mod(fz,_depth - 0.5f); + const int x = (int)nfx, y = (int)nfy, z = (int)nfz; + const float dx = nfx - x, dy = nfy - y, dz = nfz - z; + const int + px = cimg::mod(x - 1,width()), nx = cimg::mod(x + 1,width()), ax = cimg::mod(x + 2,width()), + py = cimg::mod(y - 1,height()), ny = cimg::mod(y + 1,height()), ay = cimg::mod(y + 2,height()), + pz = cimg::mod(z - 1,depth()), nz = cimg::mod(z + 1,depth()), az = cimg::mod(z + 2,depth()); + const Tfloat + Ippp = (Tfloat)(*this)(px,py,pz,c), Icpp = (Tfloat)(*this)(x,py,pz,c), + Inpp = (Tfloat)(*this)(nx,py,pz,c), Iapp = (Tfloat)(*this)(ax,py,pz,c), + Ipp = Icpp + 0.5f*(dx*(-Ippp + Inpp) + dx*dx*(2*Ippp - 5*Icpp + 4*Inpp - Iapp) + + dx*dx*dx*(-Ippp + 3*Icpp - 3*Inpp + Iapp)), + Ipcp = (Tfloat)(*this)(px,y,pz,c), Iccp = (Tfloat)(*this)(x, y,pz,c), + Incp = (Tfloat)(*this)(nx,y,pz,c), Iacp = (Tfloat)(*this)(ax,y,pz,c), + Icp = Iccp + 0.5f*(dx*(-Ipcp + Incp) + dx*dx*(2*Ipcp - 5*Iccp + 4*Incp - Iacp) + + dx*dx*dx*(-Ipcp + 3*Iccp - 3*Incp + Iacp)), + Ipnp = (Tfloat)(*this)(px,ny,pz,c), Icnp = (Tfloat)(*this)(x,ny,pz,c), + Innp = (Tfloat)(*this)(nx,ny,pz,c), Ianp = (Tfloat)(*this)(ax,ny,pz,c), + Inp = Icnp + 0.5f*(dx*(-Ipnp + Innp) + dx*dx*(2*Ipnp - 5*Icnp + 4*Innp - Ianp) + + dx*dx*dx*(-Ipnp + 3*Icnp - 3*Innp + Ianp)), + Ipap = (Tfloat)(*this)(px,ay,pz,c), Icap = (Tfloat)(*this)(x,ay,pz,c), + Inap = (Tfloat)(*this)(nx,ay,pz,c), Iaap = (Tfloat)(*this)(ax,ay,pz,c), + Iap = Icap + 0.5f*(dx*(-Ipap + Inap) + dx*dx*(2*Ipap - 5*Icap + 4*Inap - Iaap) + + dx*dx*dx*(-Ipap + 3*Icap - 3*Inap + Iaap)), + Ip = Icp + 0.5f*(dy*(-Ipp + Inp) + dy*dy*(2*Ipp - 5*Icp + 4*Inp - Iap) + + dy*dy*dy*(-Ipp + 3*Icp - 3*Inp + Iap)), + Ippc = (Tfloat)(*this)(px,py,z,c), Icpc = (Tfloat)(*this)(x,py,z,c), + Inpc = (Tfloat)(*this)(nx,py,z,c), Iapc = (Tfloat)(*this)(ax,py,z,c), + Ipc = Icpc + 0.5f*(dx*(-Ippc + Inpc) + dx*dx*(2*Ippc - 5*Icpc + 4*Inpc - Iapc) + + dx*dx*dx*(-Ippc + 3*Icpc - 3*Inpc + Iapc)), + Ipcc = (Tfloat)(*this)(px,y,z,c), Iccc = (Tfloat)(*this)(x, y,z,c), + Incc = (Tfloat)(*this)(nx,y,z,c), Iacc = (Tfloat)(*this)(ax,y,z,c), + Icc = Iccc + 0.5f*(dx*(-Ipcc + Incc) + dx*dx*(2*Ipcc - 5*Iccc + 4*Incc - Iacc) + + dx*dx*dx*(-Ipcc + 3*Iccc - 3*Incc + Iacc)), + Ipnc = (Tfloat)(*this)(px,ny,z,c), Icnc = (Tfloat)(*this)(x,ny,z,c), + Innc = (Tfloat)(*this)(nx,ny,z,c), Ianc = (Tfloat)(*this)(ax,ny,z,c), + Inc = Icnc + 0.5f*(dx*(-Ipnc + Innc) + dx*dx*(2*Ipnc - 5*Icnc + 4*Innc - Ianc) + + dx*dx*dx*(-Ipnc + 3*Icnc - 3*Innc + Ianc)), + Ipac = (Tfloat)(*this)(px,ay,z,c), Icac = (Tfloat)(*this)(x,ay,z,c), + Inac = (Tfloat)(*this)(nx,ay,z,c), Iaac = (Tfloat)(*this)(ax,ay,z,c), + Iac = Icac + 0.5f*(dx*(-Ipac + Inac) + dx*dx*(2*Ipac - 5*Icac + 4*Inac - Iaac) + + dx*dx*dx*(-Ipac + 3*Icac - 3*Inac + Iaac)), + Ic = Icc + 0.5f*(dy*(-Ipc + Inc) + dy*dy*(2*Ipc - 5*Icc + 4*Inc - Iac) + + dy*dy*dy*(-Ipc + 3*Icc - 3*Inc + Iac)), + Ippn = (Tfloat)(*this)(px,py,nz,c), Icpn = (Tfloat)(*this)(x,py,nz,c), + Inpn = (Tfloat)(*this)(nx,py,nz,c), Iapn = (Tfloat)(*this)(ax,py,nz,c), + Ipn = Icpn + 0.5f*(dx*(-Ippn + Inpn) + dx*dx*(2*Ippn - 5*Icpn + 4*Inpn - Iapn) + + dx*dx*dx*(-Ippn + 3*Icpn - 3*Inpn + Iapn)), + Ipcn = (Tfloat)(*this)(px,y,nz,c), Iccn = (Tfloat)(*this)(x, y,nz,c), + Incn = (Tfloat)(*this)(nx,y,nz,c), Iacn = (Tfloat)(*this)(ax,y,nz,c), + Icn = Iccn + 0.5f*(dx*(-Ipcn + Incn) + dx*dx*(2*Ipcn - 5*Iccn + 4*Incn - Iacn) + + dx*dx*dx*(-Ipcn + 3*Iccn - 3*Incn + Iacn)), + Ipnn = (Tfloat)(*this)(px,ny,nz,c), Icnn = (Tfloat)(*this)(x,ny,nz,c), + Innn = (Tfloat)(*this)(nx,ny,nz,c), Iann = (Tfloat)(*this)(ax,ny,nz,c), + Inn = Icnn + 0.5f*(dx*(-Ipnn + Innn) + dx*dx*(2*Ipnn - 5*Icnn + 4*Innn - Iann) + + dx*dx*dx*(-Ipnn + 3*Icnn - 3*Innn + Iann)), + Ipan = (Tfloat)(*this)(px,ay,nz,c), Ican = (Tfloat)(*this)(x,ay,nz,c), + Inan = (Tfloat)(*this)(nx,ay,nz,c), Iaan = (Tfloat)(*this)(ax,ay,nz,c), + Ian = Ican + 0.5f*(dx*(-Ipan + Inan) + dx*dx*(2*Ipan - 5*Ican + 4*Inan - Iaan) + + dx*dx*dx*(-Ipan + 3*Ican - 3*Inan + Iaan)), + In = Icn + 0.5f*(dy*(-Ipn + Inn) + dy*dy*(2*Ipn - 5*Icn + 4*Inn - Ian) + + dy*dy*dy*(-Ipn + 3*Icn - 3*Inn + Ian)), + Ippa = (Tfloat)(*this)(px,py,az,c), Icpa = (Tfloat)(*this)(x,py,az,c), + Inpa = (Tfloat)(*this)(nx,py,az,c), Iapa = (Tfloat)(*this)(ax,py,az,c), + Ipa = Icpa + 0.5f*(dx*(-Ippa + Inpa) + dx*dx*(2*Ippa - 5*Icpa + 4*Inpa - Iapa) + + dx*dx*dx*(-Ippa + 3*Icpa - 3*Inpa + Iapa)), + Ipca = (Tfloat)(*this)(px,y,az,c), Icca = (Tfloat)(*this)(x, y,az,c), + Inca = (Tfloat)(*this)(nx,y,az,c), Iaca = (Tfloat)(*this)(ax,y,az,c), + Ica = Icca + 0.5f*(dx*(-Ipca + Inca) + dx*dx*(2*Ipca - 5*Icca + 4*Inca - Iaca) + + dx*dx*dx*(-Ipca + 3*Icca - 3*Inca + Iaca)), + Ipna = (Tfloat)(*this)(px,ny,az,c), Icna = (Tfloat)(*this)(x,ny,az,c), + Inna = (Tfloat)(*this)(nx,ny,az,c), Iana = (Tfloat)(*this)(ax,ny,az,c), + Ina = Icna + 0.5f*(dx*(-Ipna + Inna) + dx*dx*(2*Ipna - 5*Icna + 4*Inna - Iana) + + dx*dx*dx*(-Ipna + 3*Icna - 3*Inna + Iana)), + Ipaa = (Tfloat)(*this)(px,ay,az,c), Icaa = (Tfloat)(*this)(x,ay,az,c), + Inaa = (Tfloat)(*this)(nx,ay,az,c), Iaaa = (Tfloat)(*this)(ax,ay,az,c), + Iaa = Icaa + 0.5f*(dx*(-Ipaa + Inaa) + dx*dx*(2*Ipaa - 5*Icaa + 4*Inaa - Iaaa) + + dx*dx*dx*(-Ipaa + 3*Icaa - 3*Inaa + Iaaa)), + Ia = Ica + 0.5f*(dy*(-Ipa + Ina) + dy*dy*(2*Ipa - 5*Ica + 4*Ina - Iaa) + + dy*dy*dy*(-Ipa + 3*Ica - 3*Ina + Iaa)); + return Ic + 0.5f*(dz*(-Ip + In) + dz*dz*(2*Ip - 5*Ic + 4*In - Ia) + dz*dz*dz*(-Ip + 3*Ic - 3*In + Ia)); + } + + T cubic_atXYZ_pc(const float fx, const float fy, const float fz, const int c) const { + return cimg::type::cut(cubic_atXYZ_p(fx,fy,fz,c)); + } + + T _cubic_atXYZ_pc(const float fx, const float fy, const float fz, const int c) const { + return cimg::type::cut(_cubic_atXYZ_p(fx,fy,fz,c)); + } + //! Set pixel value, using linear interpolation for the X-coordinates. /** Set pixel value at specified coordinates (\c fx,\c y,\c z,\c c) in the image instance, in a way that @@ -15153,7 +15856,7 @@ of the image instance (written in base 10), separated by specified \c separator character. \param separator A \c char character which specifies the separator between values in the returned C-string. \param max_size Maximum size of the returned image (or \c 0 if no limits are set). - \param format For float/double-values, tell the printf format used to generate the Ascii representation + \param format For float/double-values, tell the printf format used to generate the text representation of the numbers (or \c 0 for default representation). \note - The returned image is never empty. @@ -15681,7 +16384,7 @@ const unsigned int i0 = (unsigned int)primitive(0); if (i0>=_width) { if (error_message) cimg_sprintf(error_message, - "3D object (%u,%u) refers to invalid vertex indice %u in " + "3D object (%u,%u) refers to invalid vertex index %u in " "point primitive [%u]", _width,primitives._width,i0,l); return false; @@ -15856,7 +16559,7 @@ const unsigned int i0 = cimg::float2uint((float)*(ptrs++)); if (i0>=nb_points) { if (error_message) cimg_sprintf(error_message, - "CImg3d (%u,%u) refers to invalid vertex indice %u in point primitive [%u]", + "CImg3d (%u,%u) refers to invalid vertex index %u in point primitive [%u]", nb_points,nb_primitives,i0,p); return false; } @@ -15948,7 +16651,7 @@ if (!h && !s) { if (w>=c) { if (error_message) cimg_sprintf(error_message, - "CImg3d (%u,%u) refers to invalid shared sprite/texture indice %u " + "CImg3d (%u,%u) refers to invalid shared sprite/texture index %u " "for primitive [%u]", nb_points,nb_primitives,w,c); return false; @@ -15980,7 +16683,7 @@ if (!h && !s) { if (w>=o) { if (error_message) cimg_sprintf(error_message, - "CImg3d (%u,%u) refers to invalid shared opacity indice %u " + "CImg3d (%u,%u) refers to invalid shared opacity index %u " "for primitive [%u]", nb_points,nb_primitives,w,o); return false; @@ -16019,8 +16722,9 @@ // Define the math formula parser/compiler and expression evaluator. struct _cimg_math_parser { CImg mem; - CImg memtype; - CImgList _code, &code, code_begin, code_end; + CImg memtype, memmerge; + CImgList _code, &code, code_begin, code_end, + _code_begin_t, &code_begin_t, _code_end_t, &code_end_t; CImg opcode; const CImg *p_code_end, *p_code; const CImg *const p_break; @@ -16032,7 +16736,7 @@ CImgList& listout; CImg _img_stats, &img_stats, constcache_vals; - CImgList _list_stats, &list_stats, _list_median, &list_median; + CImgList _list_stats, &list_stats, _list_median, &list_median, _list_norm, &list_norm; CImg mem_img_stats, constcache_inds; CImg level, variable_pos, reserved_label; @@ -16040,10 +16744,11 @@ CImgList macro_body_is_string; char *user_macro; - unsigned int mempos, mem_img_median, debug_indent, result_dim, break_type, constcache_size; - bool is_parallelizable, is_fill, need_input_copy; + unsigned int mempos, mem_img_median, mem_img_norm, mem_img_index, debug_indent, result_dim, break_type, + constcache_size; + bool is_parallelizable, is_end_code, is_fill, need_input_copy; double *result; - ulongT rng; + cimg_uint64 rng; const char *const calling_function, *s_op, *ss_op; typedef double (*mp_func)(_cimg_math_parser&); @@ -16053,10 +16758,11 @@ #define _cimg_mp_is_variable(arg) (memtype[arg]==-1) // Is scalar variable? #define _cimg_mp_is_vector(arg) (memtype[arg]>1) // Is vector? #define _cimg_mp_size(arg) (_cimg_mp_is_scalar(arg)?0U:(unsigned int)memtype[arg] - 1) // Size (0=scalar, N>0=vectorN) -#define _cimg_mp_calling_function calling_function_s()._data +#define _cimg_mp_calling_function s_calling_function()._data #define _cimg_mp_op(s) s_op = s; ss_op = ss #define _cimg_mp_check_type(arg,n_arg,mode,N) check_type(arg,n_arg,mode,N,ss,se,saved_char) #define _cimg_mp_check_constant(arg,n_arg,mode) check_constant(arg,n_arg,mode,ss,se,saved_char) +#define _cimg_mp_check_constant_index(arg) check_constant_index(arg,ss,se,saved_char) #define _cimg_mp_check_matrix_square(arg,n_arg) check_matrix_square(arg,n_arg,ss,se,saved_char) #define _cimg_mp_check_list(is_out) check_list(is_out,ss,se,saved_char) #define _cimg_mp_defunc(mp) (*(mp_func)(*(mp).opcode))(mp) @@ -16076,6 +16782,11 @@ #define _cimg_mp_vector2_vs(op,i1,i2) _cimg_mp_return(vector2_vs(op,i1,i2)) #define _cimg_mp_vector2_vv(op,i1,i2) _cimg_mp_return(vector2_vv(op,i1,i2)) #define _cimg_mp_vector3_vss(op,i1,i2,i3) _cimg_mp_return(vector3_vss(op,i1,i2,i3)) +#define _cimg_mp_strerr \ + *se = saved_char; \ + for (s0 = ss; s0>expr._data && *s0!=';'; --s0) {} \ + if (*s0==';') ++s0; while (cimg::is_blank(*s0)) ++s0; \ + cimg::strellipsize(s0,64) // Constructors / Destructors. ~_cimg_math_parser() { @@ -16086,14 +16797,16 @@ const CImg& img_input=CImg::const_empty(), CImg *const img_output=0, const CImgList *const list_inputs=0, CImgList *const list_outputs=0, const bool _is_fill=false): - code(_code),p_break((CImg*)0 - 2), + code(_code),code_begin_t(_code_begin_t),code_end_t(_code_end_t), + p_break((CImg*)(cimg_ulong)-2), imgin(img_input),listin(list_inputs?*list_inputs:CImgList::const_empty()), imgout(img_output?*img_output:CImg::empty()),listout(list_outputs?*list_outputs:CImgList::empty()), - img_stats(_img_stats),list_stats(_list_stats),list_median(_list_median),user_macro(0), - mem_img_median(~0U),debug_indent(0),result_dim(0),break_type(0),constcache_size(0), - is_parallelizable(true),is_fill(_is_fill),need_input_copy(false), + img_stats(_img_stats),list_stats(_list_stats),list_median(_list_median),list_norm(_list_norm),user_macro(0), + mem_img_median(~0U),mem_img_norm(~0U),mem_img_index(~0U),debug_indent(0),result_dim(0),break_type(0), + constcache_size(0),is_parallelizable(true),is_fill(_is_fill),need_input_copy(false), rng((cimg::_rand(),cimg::rng())),calling_function(funcname?funcname:"cimg_math_parser") { -#ifdef cimg_use_openmp + +#if cimg_use_openmp!=0 rng+=omp_get_thread_num(); #endif if (!expression || !*expression) @@ -16118,8 +16831,9 @@ level = get_level(expr); // Init constant values. -#define _cimg_mp_interpolation (reserved_label[29]!=~0U?reserved_label[29]:0) -#define _cimg_mp_boundary (reserved_label[30]!=~0U?reserved_label[30]:0) +#define _cimg_mp_interpolation (reserved_label[30]!=~0U?reserved_label[30]:0) +#define _cimg_mp_boundary (reserved_label[31]!=~0U?reserved_label[31]:0) +#define _cimg_mp_slot_t 17 #define _cimg_mp_slot_nan 29 #define _cimg_mp_slot_x 30 #define _cimg_mp_slot_y 31 @@ -16130,7 +16844,7 @@ for (unsigned int i = 0; i<=10; ++i) mem[i] = (double)i; // mem[0-10] = 0...10 for (unsigned int i = 1; i<=5; ++i) mem[i + 10] = -(double)i; // mem[11-15] = -1...-5 mem[16] = 0.5; - mem[17] = 0; // thread_id + mem[_cimg_mp_slot_t] = 0; // thread_id mem[18] = (double)imgin._width; // w mem[19] = (double)imgin._height; // h mem[20] = (double)imgin._depth; // d @@ -16149,25 +16863,25 @@ // 1 = compile-time constant | N>1 = constant ptr to vector[N-1] }. memtype.assign(mem._width,1,1,1,0); for (unsigned int i = 0; i<_cimg_mp_slot_x; ++i) memtype[i] = 1; - memtype[17] = 0; - memtype[_cimg_mp_slot_x] = memtype[_cimg_mp_slot_y] = memtype[_cimg_mp_slot_z] = memtype[_cimg_mp_slot_c] = -2; + memtype[_cimg_mp_slot_t] = memtype[_cimg_mp_slot_x] = memtype[_cimg_mp_slot_y] = + memtype[_cimg_mp_slot_z] = memtype[_cimg_mp_slot_c] = -2; mempos = _cimg_mp_slot_c + 1; variable_pos.assign(8); reserved_label.assign(128,1,1,1,~0U); - // reserved_label[4-28] are used to store these two-char variables: + // reserved_label[0-31] are used to store the memory index of these variables: // [0] = wh, [1] = whd, [2] = whds, [3] = pi, [4] = im, [5] = iM, [6] = ia, [7] = iv, - // [8] = is, [9] = ip, [10] = ic, [11] = xm, [12] = ym, [13] = zm, [14] = cm, [15] = xM, - // [16] = yM, [17] = zM, [18]=cM, [19]=i0...[28]=i9, [29] = interpolation, [30] = boundary + // [8] = is, [9] = ip, [10] = ic, [11] = in, [12] = xm, [13] = ym, [14] = zm, [15] = cm, [16] = xM, + // [17] = yM, [18] = zM, [19] = cM, [20] = i0...[29] = i9, [30] = interpolation, [31] = boundary - // Compile expression into a serie of opcodes. + // Compile expression into a sequence of opcodes. s_op = ""; ss_op = expr._data; const unsigned int ind_result = compile(expr._data,expr._data + expr._width - 1,0,0,false); if (!_cimg_mp_is_constant(ind_result)) { if (_cimg_mp_is_vector(ind_result)) CImg(&mem[ind_result] + 1,_cimg_mp_size(ind_result),1,1,1,true). fill(cimg::type::nan()); - else mem[ind_result] = cimg::type::nan(); + else if (ind_result!=_cimg_mp_slot_t) mem[ind_result] = cimg::type::nan(); } // Free resources used for compiling expression and prepare evaluation. @@ -16199,91 +16913,34 @@ } _cimg_math_parser(): - code(_code),p_code_end(0),p_break((CImg*)0 - 2), + code(_code),code_begin_t(_code_begin_t),code_end_t(_code_end_t), + p_code_end(0),p_break((CImg*)(cimg_ulong)-2), imgin(CImg::const_empty()),listin(CImgList::const_empty()), imgout(CImg::empty()),listout(CImgList::empty()), - img_stats(_img_stats),list_stats(_list_stats),list_median(_list_median),debug_indent(0), - result_dim(0),break_type(0),constcache_size(0),is_parallelizable(true),is_fill(false),need_input_copy(false), - rng(0),calling_function(0) { + img_stats(_img_stats),list_stats(_list_stats),list_median(_list_median),list_norm(_list_norm),debug_indent(0), + result_dim(0),break_type(0),constcache_size(0),is_parallelizable(true),is_fill(false), + need_input_copy(false),rng(0),calling_function(0) { mem.assign(1 + _cimg_mp_slot_c,1,1,1,0); // Allow to skip 'is_empty?' test in operator()() result = mem._data; } _cimg_math_parser(const _cimg_math_parser& mp): - mem(mp.mem),code(mp.code),p_code_end(mp.p_code_end),p_break(mp.p_break), - imgin(mp.imgin),listin(mp.listin),imgout(mp.imgout),listout(mp.listout),img_stats(mp.img_stats), - list_stats(mp.list_stats),list_median(mp.list_median),debug_indent(0),result_dim(mp.result_dim), - break_type(0),constcache_size(0),is_parallelizable(mp.is_parallelizable),is_fill(mp.is_fill), - need_input_copy(mp.need_input_copy), result(mem._data + (mp.result - mp.mem._data)), - rng((cimg::_rand(),cimg::rng())),calling_function(0) { -#ifdef cimg_use_openmp - mem[17] = omp_get_thread_num(); + mem(mp.mem),code(mp.code),code_begin_t(mp.code_begin_t),code_end_t(mp.code_end_t), + p_code_end(mp.p_code_end),p_break(mp.p_break), + imgin(mp.imgin),listin(mp.listin),imgout(mp.imgout),listout(mp.listout), + img_stats(mp.img_stats),list_stats(mp.list_stats),list_median(mp.list_median),list_norm(mp.list_norm), + debug_indent(0),result_dim(mp.result_dim),break_type(0),constcache_size(0), + is_parallelizable(mp.is_parallelizable),is_fill(mp.is_fill),need_input_copy(mp.need_input_copy), + result(mem._data + (mp.result - mp.mem._data)),rng((cimg::_rand(),cimg::rng())),calling_function(0) { + +#if cimg_use_openmp!=0 + mem[_cimg_mp_slot_t] = omp_get_thread_num(); rng+=omp_get_thread_num(); #endif opcode.assign(); opcode._is_shared = true; } - // Count parentheses/brackets level of each character of the expression. - CImg get_level(CImg& expr) const { - bool is_escaped = false, next_is_escaped = false; - unsigned int mode = 0, next_mode = 0; // { 0=normal | 1=char-string | 2=vector-string - CImg res(expr._width - 1); - unsigned int *pd = res._data; - int level = 0; - for (const char *ps = expr._data; *ps && level>=0; ++ps) { - if (!is_escaped && !next_is_escaped && *ps=='\\') next_is_escaped = true; - if (!is_escaped && *ps=='\'') { // Non-escaped character - if (!mode && ps>expr._data && *(ps - 1)=='[') next_mode = mode = 2; // Start vector-string - else if (mode==2 && *(ps + 1)==']') next_mode = !mode; // End vector-string - else if (mode<2) next_mode = mode?(mode = 0):1; // Start/end char-string - } - *(pd++) = (unsigned int)(mode>=1 || is_escaped?level + (mode==1): - *ps=='(' || *ps=='['?level++: - *ps==')' || *ps==']'?--level: - level); - mode = next_mode; - is_escaped = next_is_escaped; - next_is_escaped = false; - } - if (mode) { - cimg::strellipsize(expr,64); - throw CImgArgumentException("[" cimg_appname "_math_parser] " - "CImg<%s>::%s: Unterminated string literal, in expression '%s'.", - pixel_type(),_cimg_mp_calling_function, - expr._data); - } - if (level) { - cimg::strellipsize(expr,64); - throw CImgArgumentException("[" cimg_appname "_math_parser] " - "CImg<%s>::%s: Unbalanced parentheses/brackets, in expression '%s'.", - pixel_type(),_cimg_mp_calling_function, - expr._data); - } - return res; - } - - // Tell for each character of an expression if it is inside a string or not. - CImg is_inside_string(CImg& expr) const { - bool is_escaped = false, next_is_escaped = false; - unsigned int mode = 0, next_mode = 0; // { 0=normal | 1=char-string | 2=vector-string - CImg res = CImg::string(expr); - bool *pd = res._data; - for (const char *ps = expr._data; *ps; ++ps) { - if (!next_is_escaped && *ps=='\\') next_is_escaped = true; - if (!is_escaped && *ps=='\'') { // Non-escaped character - if (!mode && ps>expr._data && *(ps - 1)=='[') next_mode = mode = 2; // Start vector-string - else if (mode==2 && *(ps + 1)==']') next_mode = !mode; // End vector-string - else if (mode<2) next_mode = mode?(mode = 0):1; // Start/end char-string - } - *(pd++) = mode>=1 || is_escaped; - mode = next_mode; - is_escaped = next_is_escaped; - next_is_escaped = false; - } - return res; - } - // Compilation procedure. unsigned int compile(char *ss, char *se, const unsigned int depth, unsigned int *const p_ref, const bool is_single) { @@ -16297,7 +16954,7 @@ (ss - 4)>expr._data?ss - 4:expr._data, se<&expr.back()?"...":""); } - char c1, c2, c3, c4; + char c1, c2; // Simplify expression when possible. do { @@ -16322,6 +16979,7 @@ ss_op + std::strlen(ss_op)<&expr.back()?"...":""); } + static const size_t siz_ref = 7*sizeof(unsigned int); const char *const previous_s_op = s_op, *const previous_ss_op = ss_op; const unsigned int depth1 = depth + 1; unsigned int pos, p1, p2, p3, arg1, arg2, arg3, arg4, arg5, arg6; @@ -16358,59 +17016,71 @@ int nb = 0; s = ss + (*ss=='+' || *ss=='-'?1:0); if (*s=='i' || *s=='I' || *s=='n' || *s=='N') { // Particular cases : +/-NaN and +/-Inf - is_sth = !(*ss=='-'); + is_sth = *ss=='-'; if (!cimg::strcasecmp(s,"inf")) { val = cimg::type::inf(); nb = 1; } else if (!cimg::strcasecmp(s,"nan")) { val = cimg::type::nan(); nb = 1; } - if (nb==1 && !is_sth) val = -val; + if (nb==1 && is_sth) val = -val; + } else if (*s=='0' && (s[1]=='x' || s[1]=='X')) { // Hexadecimal number + is_sth = *ss=='-'; + if (cimg_sscanf(s + 2,"%x%c",&arg1,&sep)==1) { + nb = 1; + val = (double)arg1; + if (is_sth) val = -val; + } } if (!nb) nb = cimg_sscanf(ss,"%lf%c%c",&val,&(sep=0),&(end=0)); if (nb==1) _cimg_mp_constant(val); if (nb==2 && sep=='%') _cimg_mp_constant(val/100); if (ss1==se) switch (*ss) { // One-char reserved variable - case 'c' : _cimg_mp_return(reserved_label['c']!=~0U?reserved_label['c']:_cimg_mp_slot_c); - case 'd' : _cimg_mp_return(reserved_label['d']!=~0U?reserved_label['d']:20); - case 'e' : _cimg_mp_return(reserved_label['e']!=~0U?reserved_label['e']:27); - case 'h' : _cimg_mp_return(reserved_label['h']!=~0U?reserved_label['h']:19); - case 'l' : _cimg_mp_return(reserved_label['l']!=~0U?reserved_label['l']:26); - case 'r' : _cimg_mp_return(reserved_label['r']!=~0U?reserved_label['r']:22); - case 's' : _cimg_mp_return(reserved_label['s']!=~0U?reserved_label['s']:21); - case 't' : _cimg_mp_return(reserved_label['t']!=~0U?reserved_label['t']:17); - case 'w' : _cimg_mp_return(reserved_label['w']!=~0U?reserved_label['w']:18); - case 'x' : _cimg_mp_return(reserved_label['x']!=~0U?reserved_label['x']:_cimg_mp_slot_x); - case 'y' : _cimg_mp_return(reserved_label['y']!=~0U?reserved_label['y']:_cimg_mp_slot_y); - case 'z' : _cimg_mp_return(reserved_label['z']!=~0U?reserved_label['z']:_cimg_mp_slot_z); + case 'c' : _cimg_mp_return(reserved_label[(int)'c']!=~0U?reserved_label[(int)'c']:_cimg_mp_slot_c); + case 'd' : _cimg_mp_return(reserved_label[(int)'d']!=~0U?reserved_label[(int)'d']:20); + case 'e' : _cimg_mp_return(reserved_label[(int)'e']!=~0U?reserved_label[(int)'e']:27); + case 'h' : _cimg_mp_return(reserved_label[(int)'h']!=~0U?reserved_label[(int)'h']:19); + case 'k' : + if (reserved_label[(int)'k']!=~0U) _cimg_mp_return(reserved_label[(int)'k']); + pos = get_mem_img_index(); + if (pos!=~0U) _cimg_mp_return(pos); + _cimg_mp_return_nan(); + case 'l' : _cimg_mp_return(reserved_label[(int)'l']!=~0U?reserved_label[(int)'l']:26); + case 'r' : _cimg_mp_return(reserved_label[(int)'r']!=~0U?reserved_label[(int)'r']:22); + case 's' : _cimg_mp_return(reserved_label[(int)'s']!=~0U?reserved_label[(int)'s']:21); + case 't' : _cimg_mp_return(reserved_label[(int)'t']!=~0U?reserved_label[(int)'t']:_cimg_mp_slot_t); + case 'w' : _cimg_mp_return(reserved_label[(int)'w']!=~0U?reserved_label[(int)'w']:18); + case 'x' : _cimg_mp_return(reserved_label[(int)'x']!=~0U?reserved_label[(int)'x']:_cimg_mp_slot_x); + case 'y' : _cimg_mp_return(reserved_label[(int)'y']!=~0U?reserved_label[(int)'y']:_cimg_mp_slot_y); + case 'z' : _cimg_mp_return(reserved_label[(int)'z']!=~0U?reserved_label[(int)'z']:_cimg_mp_slot_z); case 'u' : - if (reserved_label['u']!=~0U) _cimg_mp_return(reserved_label['u']); + if (reserved_label[(int)'u']!=~0U) _cimg_mp_return(reserved_label[(int)'u']); _cimg_mp_scalar2(mp_u,0,1); case 'g' : - if (reserved_label['g']!=~0U) _cimg_mp_return(reserved_label['g']); + if (reserved_label[(int)'g']!=~0U) _cimg_mp_return(reserved_label[(int)'g']); _cimg_mp_scalar0(mp_g); case 'i' : - if (reserved_label['i']!=~0U) _cimg_mp_return(reserved_label['i']); + if (reserved_label[(int)'i']!=~0U) _cimg_mp_return(reserved_label[(int)'i']); _cimg_mp_scalar0(mp_i); case 'I' : _cimg_mp_op("Variable 'I'"); - if (reserved_label['I']!=~0U) _cimg_mp_return(reserved_label['I']); + if (reserved_label[(int)'I']!=~0U) _cimg_mp_return(reserved_label[(int)'I']); if (!imgin._spectrum) _cimg_mp_return(0); need_input_copy = true; pos = vector(imgin._spectrum); CImg::vector((ulongT)mp_Joff,pos,0,0,imgin._spectrum).move_to(code); _cimg_mp_return(pos); case 'R' : - if (reserved_label['R']!=~0U) _cimg_mp_return(reserved_label['R']); + if (reserved_label[(int)'R']!=~0U) _cimg_mp_return(reserved_label[(int)'R']); need_input_copy = true; _cimg_mp_scalar6(mp_ixyzc,_cimg_mp_slot_x,_cimg_mp_slot_y,_cimg_mp_slot_z,0,0,0); case 'G' : - if (reserved_label['G']!=~0U) _cimg_mp_return(reserved_label['G']); + if (reserved_label[(int)'G']!=~0U) _cimg_mp_return(reserved_label[(int)'G']); need_input_copy = true; _cimg_mp_scalar6(mp_ixyzc,_cimg_mp_slot_x,_cimg_mp_slot_y,_cimg_mp_slot_z,1,0,0); case 'B' : - if (reserved_label['B']!=~0U) _cimg_mp_return(reserved_label['B']); + if (reserved_label[(int)'B']!=~0U) _cimg_mp_return(reserved_label[(int)'B']); need_input_copy = true; _cimg_mp_scalar6(mp_ixyzc,_cimg_mp_slot_x,_cimg_mp_slot_y,_cimg_mp_slot_z,2,0,0); case 'A' : - if (reserved_label['A']!=~0U) _cimg_mp_return(reserved_label['A']); + if (reserved_label[(int)'A']!=~0U) _cimg_mp_return(reserved_label[(int)'A']); need_input_copy = true; _cimg_mp_scalar6(mp_ixyzc,_cimg_mp_slot_x,_cimg_mp_slot_y,_cimg_mp_slot_z,3,0,0); } @@ -16422,10 +17092,10 @@ _cimg_mp_return(reserved_label[3]!=~0U?reserved_label[3]:28); if (*ss=='i') { if (*ss1>='0' && *ss1<='9') { // i0...i9 - pos = 19 + *ss1 - '0'; + pos = 20 + *ss1 - '0'; if (reserved_label[pos]!=~0U) _cimg_mp_return(reserved_label[pos]); need_input_copy = true; - _cimg_mp_scalar6(mp_ixyzc,_cimg_mp_slot_x,_cimg_mp_slot_y,_cimg_mp_slot_z,pos - 19,0,0); + _cimg_mp_scalar6(mp_ixyzc,_cimg_mp_slot_x,_cimg_mp_slot_y,_cimg_mp_slot_z,pos - 20,0,0); } switch (*ss1) { case 'm' : arg1 = 4; arg2 = 0; break; // im @@ -16439,19 +17109,23 @@ if (mem_img_median==~0U) mem_img_median = imgin?constant(imgin.median()):0; _cimg_mp_return(mem_img_median); break; + case 'n' : // in + if (reserved_label[11]!=~0U) _cimg_mp_return(reserved_label[11]); + if (mem_img_norm==~0U) mem_img_norm = imgin?constant(imgin.magnitude()):0; + _cimg_mp_return(mem_img_norm); } } else if (*ss1=='m') switch (*ss) { - case 'x' : arg1 = 11; arg2 = 4; break; // xm - case 'y' : arg1 = 12; arg2 = 5; break; // ym - case 'z' : arg1 = 13; arg2 = 6; break; // zm - case 'c' : arg1 = 14; arg2 = 7; break; // cm + case 'x' : arg1 = 12; arg2 = 4; break; // xm + case 'y' : arg1 = 13; arg2 = 5; break; // ym + case 'z' : arg1 = 14; arg2 = 6; break; // zm + case 'c' : arg1 = 15; arg2 = 7; break; // cm } else if (*ss1=='M') switch (*ss) { - case 'x' : arg1 = 15; arg2 = 8; break; // xM - case 'y' : arg1 = 16; arg2 = 9; break; // yM - case 'z' : arg1 = 17; arg2 = 10; break; // zM - case 'c' : arg1 = 18; arg2 = 11; break; // cM + case 'x' : arg1 = 16; arg2 = 8; break; // xM + case 'y' : arg1 = 17; arg2 = 9; break; // yM + case 'z' : arg1 = 18; arg2 = 10; break; // zM + case 'c' : arg1 = 19; arg2 = 11; break; // cM } if (arg1!=~0U) { if (reserved_label[arg1]!=~0U) _cimg_mp_return(reserved_label[arg1]); @@ -16474,17 +17148,17 @@ is_sth = false; for (s0 = ss, s = ss1; s2 && (*ss=='i' || *ss=='j' || *ss=='I' || *ss=='J') && (*ss1=='(' || *ss1=='[') && - (reserved_label[*ss]==~0U || *ss1=='(' || !_cimg_mp_is_vector(reserved_label[*ss]))) { + (reserved_label[(int)*ss]==~0U || *ss1=='(' || !_cimg_mp_is_vector(reserved_label[(int)*ss]))) { is_relative = *ss=='j' || *ss=='J'; if (*ss1=='[' && *ve1==']') { // i/j/I/J[_#ind,offset] = value @@ -16515,16 +17189,16 @@ arg1 = compile(s0,ve1,depth1,0,is_single); // Offset _cimg_mp_check_type(arg1,0,1,0); arg2 = compile(s + 1,se,depth1,0,is_single); // Value to assign + _cimg_mp_check_type(arg2,2,*ss>='i'?1:3,0); if (_cimg_mp_is_vector(arg2)) { - p2 = ~0U; // 'p2' must be the dimension of the vector-valued operand if any - if (p1==~0U) p2 = imgin._spectrum; - else if (_cimg_mp_is_constant(p1)) { + if (p1!=~0U) { + _cimg_mp_check_constant_index(p1); p3 = (unsigned int)cimg::mod((int)mem[p1],listin.width()); p2 = listin[p3]._spectrum; - } + } else p2 = imgin._spectrum; if (!p2) _cimg_mp_return(0); + _cimg_mp_check_type(arg2,2,2,p2); } else p2 = 0; - _cimg_mp_check_type(arg2,2,*ss>='i'?1:3,p2); if (p_ref) { *p_ref = _cimg_mp_is_vector(arg2)?4:2; @@ -16534,11 +17208,9 @@ if (_cimg_mp_is_vector(arg2)) set_variable_vector(arg2); // Prevent from being used in further optimization else if (_cimg_mp_is_comp(arg2)) memtype[arg2] = -2; - if (p1!=~0U && _cimg_mp_is_comp(p1)) memtype[p1] = -2; if (_cimg_mp_is_comp(arg1)) memtype[arg1] = -2; } - if (p1!=~0U) { if (!listout) _cimg_mp_return(arg2); if (*ss>='i') @@ -16577,6 +17249,7 @@ arg3 = is_relative?0U:(unsigned int)_cimg_mp_slot_z; arg4 = is_relative?0U:(unsigned int)_cimg_mp_slot_c; arg5 = compile(s + 1,se,depth1,0,is_single); // Value to assign + _cimg_mp_check_type(arg5,2,*ss>='i'?1:3,0); if (s0='i'?1:3,p2); + if (p_ref) { *p_ref = _cimg_mp_is_vector(arg5)?5:3; @@ -16674,7 +17347,7 @@ cimglist_for(variable_def,i) if (!std::strcmp(variable_name,variable_def[i])) { arg1 = variable_pos[i]; break; } - } else arg1 = reserved_label[*variable_name]; // Single-char variable + } else arg1 = reserved_label[(int)*variable_name]; // Single-char variable if (arg1==~0U) compile(ss,s0 - 1,depth1,0,is_single); // Variable does not exist -> error else { // Variable already exists if (_cimg_mp_is_scalar(arg1)) compile(ss,s,depth1,0,is_single); // Variable is not a vector -> error @@ -16696,8 +17369,7 @@ if (_cimg_mp_is_comp(arg3)) memtype[arg3] = -2; // Prevent from being used in further optimization if (_cimg_mp_is_comp(arg2)) memtype[arg2] = -2; } - CImg::vector((ulongT)mp_vector_set_off,arg3,arg1,(ulongT)_cimg_mp_size(arg1), - arg2,arg3). + CImg::vector((ulongT)mp_vector_set_off,arg3,arg1,(ulongT)_cimg_mp_size(arg1),arg2). move_to(code); _cimg_mp_return(arg3); } @@ -16721,19 +17393,17 @@ ++s; while (*s && cimg::is_blank(*s)) ++s; CImg(s,(unsigned int)(se - s + 1)).move_to(macro_body,0); - p1 = 1; // Indice of current parsed argument + p1 = 1; // Index of current parsed argument for (s = s0 + 1; s<=s1; ++p1, s = ns + 1) { // Parse function arguments if (p1>24) { - *se = saved_char; + _cimg_mp_strerr; cimg::strellipsize(variable_name,64); - s0 = ss - 4>expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); throw CImgArgumentException("[" cimg_appname "_math_parser] " "CImg<%s>::%s: %s: Too much specified arguments (>24) in macro " "definition '%s()', in expression '%s%s%s'.", pixel_type(),_cimg_mp_calling_function,s_op, variable_name._data, - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); } while (*s && cimg::is_blank(*s)) ++s; if (*s==')' && p1==1) break; // Function has no arguments @@ -16746,17 +17416,15 @@ s3 = ns; // End of the argument name while (*ns && cimg::is_blank(*ns)) ++ns; if (!is_sth || s2==s3 || (*ns!=',' && ns!=s1)) { - *se = saved_char; + _cimg_mp_strerr; cimg::strellipsize(variable_name,64); - s0 = ss - 4>expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); throw CImgArgumentException("[" cimg_appname "_math_parser] " "CImg<%s>::%s: %s: %s name specified for argument %u when defining " "macro '%s()', in expression '%s%s%s'.", pixel_type(),_cimg_mp_calling_function,s_op, is_sth?"Empty":"Invalid",p1, variable_name._data, - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); } if (ns==s1 || *ns==',') { // New argument found *s3 = 0; @@ -16818,70 +17486,23 @@ // Assign variable (direct). if (is_sth) { - arg3 = variable_name[1]?~0U:*variable_name; // One-char variable - if (variable_name[1] && !variable_name[2]) { // Two-chars variable - c1 = variable_name[0]; - c2 = variable_name[1]; - if (c1=='w' && c2=='h') arg3 = 0; // wh - else if (c1=='p' && c2=='i') arg3 = 3; // pi - else if (c1=='i') { - if (c2>='0' && c2<='9') arg3 = 19 + c2 - '0'; // i0...i9 - else if (c2=='m') arg3 = 4; // im - else if (c2=='M') arg3 = 5; // iM - else if (c2=='a') arg3 = 6; // ia - else if (c2=='v') arg3 = 7; // iv - else if (c2=='s') arg3 = 8; // is - else if (c2=='p') arg3 = 9; // ip - else if (c2=='c') arg3 = 10; // ic - } else if (c2=='m') { - if (c1=='x') arg3 = 11; // xm - else if (c1=='y') arg3 = 12; // ym - else if (c1=='z') arg3 = 13; // zm - else if (c1=='c') arg3 = 14; // cm - } else if (c2=='M') { - if (c1=='x') arg3 = 15; // xM - else if (c1=='y') arg3 = 16; // yM - else if (c1=='z') arg3 = 17; // zM - else if (c1=='c') arg3 = 18; // cM - } - } else if (variable_name[1] && variable_name[2] && !variable_name[3]) { // Three-chars variable - c1 = variable_name[0]; - c2 = variable_name[1]; - c3 = variable_name[2]; - if (c1=='w' && c2=='h' && c3=='d') arg3 = 1; // whd - } else if (variable_name[1] && variable_name[2] && variable_name[3] && - !variable_name[4]) { // Four-chars variable - c1 = variable_name[0]; - c2 = variable_name[1]; - c3 = variable_name[2]; - c4 = variable_name[3]; - if (c1=='w' && c2=='h' && c3=='d' && c4=='s') arg3 = 2; // whds - } else if (!std::strcmp(variable_name,"interpolation")) arg3 = 29; // interpolation - else if (!std::strcmp(variable_name,"boundary")) arg3 = 30; // boundary - - arg1 = ~0U; - arg2 = compile(s + 1,se,depth1,0,is_single); - if (is_const) _cimg_mp_check_constant(arg2,2,0); - - if (arg3!=~0U) // One-char variable, or variable in reserved_labels - arg1 = reserved_label[arg3]; - else // Multi-char variable name : check for existing variable with same name - cimglist_for(variable_def,i) - if (!std::strcmp(variable_name,variable_def[i])) { arg1 = variable_pos[i]; break; } + get_variable_pos(variable_name,arg1,arg2); + arg3 = compile(s + 1,se,depth1,0,is_single); + if (is_const) _cimg_mp_check_constant(arg3,2,0); + arg1 = arg2!=~0U?reserved_label[arg2]:arg1!=~0U?variable_pos[arg1]:~0U; if (arg1==~0U) { // Create new variable - if (_cimg_mp_is_vector(arg2)) { // Vector variable - arg1 = is_comp_vector(arg2)?arg2:vector_copy(arg2); - set_variable_vector(arg1); + if (_cimg_mp_is_vector(arg3)) { // Vector variable + arg1 = is_comp_vector(arg3)?arg3:vector_copy(arg3); + set_variable_vector(arg1); // Prevent from being used in further optimization } else { // Scalar variable - if (is_const) arg1 = arg2; + if (is_const) arg1 = arg3; else { - arg1 = _cimg_mp_is_comp(arg2)?arg2:scalar1(mp_copy,arg2); + arg1 = _cimg_mp_is_comp(arg3)?arg3:scalar1(mp_copy,arg3); memtype[arg1] = -1; } } - - if (arg3!=~0U) reserved_label[arg3] = arg1; + if (arg2!=~0U) reserved_label[arg2] = arg1; else { if (variable_def._width>=variable_pos._width) variable_pos.resize(-200,1,1,1,0); variable_pos[variable_def._width] = arg1; @@ -16890,10 +17511,8 @@ } else { // Variable already exists -> assign a new value if (is_const || _cimg_mp_is_constant(arg1)) { - *se = saved_char; + _cimg_mp_strerr; cimg::strellipsize(variable_name,64); - s0 = ss - 4>expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); throw CImgArgumentException("[" cimg_appname "_math_parser] " "CImg<%s>::%s: %s: Invalid assignment of %sconst variable '%s'%s, " "in expression '%s%s%s'.", @@ -16901,18 +17520,18 @@ _cimg_mp_is_constant(arg1)?"already-defined ":"non-", variable_name._data, !_cimg_mp_is_constant(arg1) && is_const?" as a new const variable":"", - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); } - _cimg_mp_check_type(arg2,2,_cimg_mp_is_vector(arg1)?3:1,_cimg_mp_size(arg1)); + _cimg_mp_check_type(arg3,2,_cimg_mp_is_vector(arg1)?3:1,_cimg_mp_size(arg1)); if (_cimg_mp_is_vector(arg1)) { // Vector - if (_cimg_mp_is_vector(arg2)) // From vector - CImg::vector((ulongT)mp_vector_copy,arg1,arg2,(ulongT)_cimg_mp_size(arg1)). + if (_cimg_mp_is_vector(arg3)) // From vector + CImg::vector((ulongT)mp_vector_copy,arg1,arg3,(ulongT)_cimg_mp_size(arg1)). move_to(code); else // From scalar - CImg::vector((ulongT)mp_vector_init,arg1,1,(ulongT)_cimg_mp_size(arg1),arg2). + CImg::vector((ulongT)mp_vector_init,arg1,1,(ulongT)_cimg_mp_size(arg1),arg3). move_to(code); } else // Scalar - CImg::vector((ulongT)mp_copy,arg1,arg2).move_to(code); + CImg::vector((ulongT)mp_copy,arg1,arg3).move_to(code); } _cimg_mp_return(arg1); } @@ -16931,8 +17550,8 @@ _cimg_mp_check_type(arg2,2,1,0); arg3 = ref[1]; // Vector slot arg4 = ref[2]; // Index - if (p_ref) std::memcpy(p_ref,ref,ref._width*sizeof(unsigned int)); - CImg::vector((ulongT)mp_vector_set_off,arg2,arg3,(ulongT)_cimg_mp_size(arg3),arg4,arg2). + if (p_ref) std::memcpy(p_ref,ref,siz_ref); + CImg::vector((ulongT)mp_vector_set_off,arg2,arg3,(ulongT)_cimg_mp_size(arg3),arg4). move_to(code); _cimg_mp_return(arg2); } @@ -16943,7 +17562,7 @@ p1 = ref[1]; // Index is_relative = (bool)ref[2]; arg3 = ref[3]; // Offset - if (p_ref) std::memcpy(p_ref,ref,ref._width*sizeof(unsigned int)); + if (p_ref) std::memcpy(p_ref,ref,siz_ref); if (p1!=~0U) { if (!listout) _cimg_mp_return(arg2); CImg::vector((ulongT)(is_relative?mp_list_set_joff:mp_list_set_ioff), @@ -16965,7 +17584,7 @@ arg4 = ref[4]; // Y arg5 = ref[5]; // Z arg6 = ref[6]; // C - if (p_ref) std::memcpy(p_ref,ref,ref._width*sizeof(unsigned int)); + if (p_ref) std::memcpy(p_ref,ref,siz_ref); if (p1!=~0U) { if (!listout) _cimg_mp_return(arg2); CImg::vector((ulongT)(is_relative?mp_list_set_jxyzc:mp_list_set_ixyzc), @@ -16984,15 +17603,18 @@ p1 = ref[1]; // Index is_relative = (bool)ref[2]; arg3 = ref[3]; // Offset - if (p_ref) std::memcpy(p_ref,ref,ref._width*sizeof(unsigned int)); + if (p_ref) std::memcpy(p_ref,ref,siz_ref); if (p1!=~0U) { if (!listout) _cimg_mp_return(arg2); if (_cimg_mp_is_scalar(arg2)) CImg::vector((ulongT)(is_relative?mp_list_set_Joff_s:mp_list_set_Ioff_s), - arg2,p1,arg3).move_to(code); - else + arg2,p1,arg3).move_to(code); + else { + _cimg_mp_check_constant_index(p1); CImg::vector((ulongT)(is_relative?mp_list_set_Joff_v:mp_list_set_Ioff_v), - arg2,p1,arg3,_cimg_mp_size(arg2)).move_to(code); + arg2,p1,arg3,_cimg_mp_size(arg2)).move_to(code); + } + } else { if (!imgout) _cimg_mp_return(arg2); if (_cimg_mp_is_scalar(arg2)) @@ -17013,15 +17635,18 @@ arg3 = ref[3]; // X arg4 = ref[4]; // Y arg5 = ref[5]; // Z - if (p_ref) std::memcpy(p_ref,ref,ref._width*sizeof(unsigned int)); + if (p_ref) std::memcpy(p_ref,ref,siz_ref); if (p1!=~0U) { if (!listout) _cimg_mp_return(arg2); if (_cimg_mp_is_scalar(arg2)) CImg::vector((ulongT)(is_relative?mp_list_set_Jxyz_s:mp_list_set_Ixyz_s), arg2,p1,arg3,arg4,arg5).move_to(code); - else + else { + _cimg_mp_check_constant_index(p1); CImg::vector((ulongT)(is_relative?mp_list_set_Jxyz_v:mp_list_set_Ixyz_v), - arg2,p1,arg3,arg4,arg5,_cimg_mp_size(arg2)).move_to(code); + arg2,p1,arg3,arg4,arg5,_cimg_mp_size(arg2)).move_to(code); + } + } else { if (!imgout) _cimg_mp_return(arg2); if (_cimg_mp_is_scalar(arg2)) @@ -17053,17 +17678,15 @@ } // No assignment expressions match -> error - *se = saved_char; + _cimg_mp_strerr; cimg::strellipsize(variable_name,64); - s0 = ss - 4>expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); throw CImgArgumentException("[" cimg_appname "_math_parser] " "CImg<%s>::%s: %s: Invalid %slvalue '%s', " "in expression '%s%s%s'.", pixel_type(),_cimg_mp_calling_function,s_op, arg1!=~0U && _cimg_mp_is_constant(arg1)?"const ":"", variable_name._data, - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); } // Apply unary/binary/ternary operators. The operator precedences should be the same as in C++. @@ -17097,21 +17720,21 @@ } } - // Write computed value back in image if necessary. if (*ref==4) { // Image value (vector): I/J[_#ind,off] **= value if (!is_single) is_parallelizable = false; p1 = ref[1]; // Index is_relative = (bool)ref[2]; arg3 = ref[3]; // Offset - if (p_ref) std::memcpy(p_ref,ref,ref._width*sizeof(unsigned int)); + if (p_ref) std::memcpy(p_ref,ref,siz_ref); if (p1!=~0U) { if (!listout) _cimg_mp_return(arg1); + _cimg_mp_check_constant_index(p1); CImg::vector((ulongT)(is_relative?mp_list_set_Joff_v:mp_list_set_Ioff_v), arg1,p1,arg3,_cimg_mp_size(arg1)).move_to(code); } else { if (!imgout) _cimg_mp_return(arg1); CImg::vector((ulongT)(is_relative?mp_set_Joff_v:mp_set_Ioff_v), - arg1,arg3,_cimg_mp_size(arg1)).move_to(code); + arg1,arg3,_cimg_mp_size(arg1)).move_to(code); } } else if (*ref==5) { // Image value (vector): I/J(_#ind,_x,_y,_z,_c) **= value @@ -17121,9 +17744,10 @@ arg3 = ref[3]; // X arg4 = ref[4]; // Y arg5 = ref[5]; // Z - if (p_ref) std::memcpy(p_ref,ref,ref._width*sizeof(unsigned int)); + if (p_ref) std::memcpy(p_ref,ref,siz_ref); if (p1!=~0U) { if (!listout) _cimg_mp_return(arg1); + _cimg_mp_check_constant_index(p1); CImg::vector((ulongT)(is_relative?mp_list_set_Jxyz_v:mp_list_set_Ixyz_v), arg1,p1,arg3,arg4,arg5,_cimg_mp_size(arg1)).move_to(code); } else { @@ -17173,9 +17797,9 @@ _cimg_mp_check_type(arg2,2,1,0); arg3 = ref[1]; // Vector slot arg4 = ref[2]; // Index - if (p_ref) std::memcpy(p_ref,ref,ref._width*sizeof(unsigned int)); + if (p_ref) std::memcpy(p_ref,ref,siz_ref); CImg::vector((ulongT)op,arg1,arg2).move_to(code); - CImg::vector((ulongT)mp_vector_set_off,arg1,arg3,(ulongT)_cimg_mp_size(arg3),arg4,arg1). + CImg::vector((ulongT)mp_vector_set_off,arg1,arg3,(ulongT)_cimg_mp_size(arg3),arg4). move_to(code); _cimg_mp_return(arg1); } @@ -17186,7 +17810,7 @@ p1 = ref[1]; // Index is_relative = (bool)ref[2]; arg3 = ref[3]; // Offset - if (p_ref) std::memcpy(p_ref,ref,ref._width*sizeof(unsigned int)); + if (p_ref) std::memcpy(p_ref,ref,siz_ref); CImg::vector((ulongT)op,arg1,arg2).move_to(code); if (p1!=~0U) { if (!listout) _cimg_mp_return(arg1); @@ -17209,7 +17833,7 @@ arg4 = ref[4]; // Y arg5 = ref[5]; // Z arg6 = ref[6]; // C - if (p_ref) std::memcpy(p_ref,ref,ref._width*sizeof(unsigned int)); + if (p_ref) std::memcpy(p_ref,ref,siz_ref); CImg::vector((ulongT)op,arg1,arg2).move_to(code); if (p1!=~0U) { if (!listout) _cimg_mp_return(arg1); @@ -17229,7 +17853,7 @@ p1 = ref[1]; // Index is_relative = (bool)ref[2]; arg3 = ref[3]; // Offset - if (p_ref) std::memcpy(p_ref,ref,ref._width*sizeof(unsigned int)); + if (p_ref) std::memcpy(p_ref,ref,siz_ref); if (_cimg_mp_is_scalar(arg2)) self_vector_s(arg1,op,arg2); else self_vector_v(arg1,op,arg2); if (p1!=~0U) { if (!listout) _cimg_mp_return(arg1); @@ -17251,7 +17875,7 @@ arg3 = ref[3]; // X arg4 = ref[4]; // Y arg5 = ref[5]; // Z - if (p_ref) std::memcpy(p_ref,ref,ref._width*sizeof(unsigned int)); + if (p_ref) std::memcpy(p_ref,ref,siz_ref); if (_cimg_mp_is_scalar(arg2)) self_vector_s(arg1,op,arg2); else self_vector_v(arg1,op,arg2); if (p1!=~0U) { if (!listout) _cimg_mp_return(arg1); @@ -17280,16 +17904,15 @@ variable_name.assign(ss,(unsigned int)(s - ss)).back() = 0; cimg::strpare(variable_name,false,true); - *se = saved_char; - s0 = ss - 4>expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); + _cimg_mp_strerr; + cimg::strellipsize(variable_name,64); throw CImgArgumentException("[" cimg_appname "_math_parser] " "CImg<%s>::%s: %s: Invalid %slvalue '%s', " "in expression '%s%s%s'.", pixel_type(),_cimg_mp_calling_function,s_op, _cimg_mp_is_constant(arg1)?"const ":"", variable_name._data, - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); } for (s = ss1; s::vector((ulongT)mp_vector_neq,pos,arg1,p1,arg2,p2,11,1).move_to(code); + _cimg_mp_return(pos); } if (_cimg_mp_is_constant(arg1) && _cimg_mp_is_constant(arg2)) _cimg_mp_constant(mem[arg1]!=mem[arg2]); _cimg_mp_scalar2(mp_neq,arg1,arg2); @@ -17414,7 +18039,9 @@ p2 = _cimg_mp_size(arg2); if (p1 || p2) { if (p1 && p2 && p1!=p2) _cimg_mp_return(0); - _cimg_mp_scalar6(mp_vector_eq,arg1,p1,arg2,p2,11,1); + pos = scalar(); + CImg::vector((ulongT)mp_vector_eq,pos,arg1,p1,arg2,p2,11,1).move_to(code); + _cimg_mp_return(pos); } if (_cimg_mp_is_constant(arg1) && _cimg_mp_is_constant(arg2)) _cimg_mp_constant(mem[arg1]==mem[arg2]); _cimg_mp_scalar2(mp_eq,arg1,arg2); @@ -17463,7 +18090,7 @@ } for (s = se2, ns = se1, ps = se3; s>ss; --s, --ns, --ps) - if (*s=='>' && *ns!='>' && *ps!='>' && level[s - expr._data]==clevel) { // Greather than ('>') + if (*s=='>' && *ns!='>' && *ps!='>' && level[s - expr._data]==clevel) { // Greater than ('>') _cimg_mp_op("Operator '>'"); arg1 = compile(ss,s,depth1,0,is_single); arg2 = compile(s + 1,se,depth1,0,is_single); @@ -17635,7 +18262,7 @@ arg1 = compile(ss,s,depth1,0,is_single); arg2 = compile(s + 1,se,depth1,0,is_single); p2 = _cimg_mp_size(arg2); - if (p2>0 && _cimg_mp_size(arg1)==p2*p2) { // Particular case of matrix multiplication + if (p2>0 && (ulongT)_cimg_mp_size(arg1)==(ulongT)p2*p2) { // Particular case of matrix multiplication pos = vector(p2); CImg::vector((ulongT)mp_matrix_mul,pos,arg1,arg2,p2,p2,1).move_to(code); _cimg_mp_return(pos); @@ -17807,7 +18434,7 @@ else arg1 = scalar1(mp_copy,arg1); } - if (is_sth) pos = arg1; // Determine return indice, depending on pre/post action + if (is_sth) pos = arg1; // Determine return index, depending on pre/post action else { if (_cimg_mp_is_vector(arg1)) pos = vector_copy(arg1); else pos = scalar1(mp_copy,arg1); @@ -17818,7 +18445,7 @@ arg4 = ref[2]; // Index if (is_sth && p_ref) std::memcpy(p_ref,ref,ref._width*sizeof(unsigned int)); CImg::vector((ulongT)op,arg1,1).move_to(code); - CImg::vector((ulongT)mp_vector_set_off,arg1,arg3,(ulongT)_cimg_mp_size(arg3),arg4,arg1). + CImg::vector((ulongT)mp_vector_set_off,arg1,arg3,(ulongT)_cimg_mp_size(arg3),arg4). move_to(code); _cimg_mp_return(pos); } @@ -17918,30 +18545,34 @@ else variable_name.assign(ss,(unsigned int)(se1 - ss)); variable_name.back() = 0; cimg::strpare(variable_name,false,true); - *se = saved_char; + _cimg_mp_strerr; cimg::strellipsize(variable_name,64); - s0 = ss - 4>expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); throw CImgArgumentException("[" cimg_appname "_math_parser] " "CImg<%s>::%s: %s: Invalid %slvalue '%s', " "in expression '%s%s%s'.", pixel_type(),_cimg_mp_calling_function,s_op, _cimg_mp_is_constant(arg1)?"const ":"", variable_name._data, - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); } - // Array-like access to vectors and image values 'i/j/I/J[_#ind,offset,_boundary]' and 'vector[offset]'. - if (*se1==']' && *ss!='[') { + // Array-like access to vectors and image values 'i/j/I/J[_#ind,offset,_boundary]' and 'vector[offset]'. + if (*se1==']') { _cimg_mp_op("Value accessor '[]'"); + + // Find opening bracket for the offset. + s0 = se1; while (s0>ss && (*s0!='[' || level[s0 - expr._data]!=clevel)) --s0; + if (s0>ss) { s1 = s0; do { --s1; } while (cimg::is_blank(*s1)); cimg::swap(*s0,*++s1); } + is_sth=s0>ss && *(s0-1)==']'; // Particular case s.a. '..[..][..]' ? is_relative = *ss=='j' || *ss=='J'; - s0 = s1 = std::strchr(ss,'['); if (s0) { do { --s1; } while (cimg::is_blank(*s1)); cimg::swap(*s0,*++s1); } - if ((*ss=='I' || *ss=='J') && *ss1=='[' && - (reserved_label[*ss]==~0U || !_cimg_mp_is_vector(reserved_label[*ss]))) { // Image value as a vector + if (!is_sth && (*ss=='I' || *ss=='J') && *ss1=='[' && + (reserved_label[(int)*ss]==~0U || + !_cimg_mp_is_vector(reserved_label[(int)*ss]))) { // Image value as a vector if (*ss2=='#') { // Index specified s0 = ss3; while (s0ss && (*s0!='[' || level[s0 - expr._data]!=clevel)) --s0; - if (s0>ss) { // Vector value + if (s0>ss) { // Vector element arg1 = compile(ss,s0,depth1,0,is_single); if (_cimg_mp_is_scalar(arg1)) { variable_name.assign(ss,(unsigned int)(s0 - ss + 1)).back() = 0; - *se = saved_char; + _cimg_mp_strerr; cimg::strellipsize(variable_name,64); - s0 = ss - 4>expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); throw CImgArgumentException("[" cimg_appname "_math_parser] " "CImg<%s>::%s: %s: Array brackets used on non-vector variable '%s', " "in expression '%s%s%s'.", pixel_type(),_cimg_mp_calling_function,s_op, variable_name._data, - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); } s1 = s0 + 1; while (s1 sub-vector extraction + if (s1 sub-vector extraction p1 = _cimg_mp_size(arg1); - arg2 = compile(++s0,s1,depth1,0,is_single); // Starting indice - arg3 = compile(++s1,se1,depth1,0,is_single); // Length + arg2 = compile(++s0,s1,depth1,0,is_single); // Starting index + s0 = ++s1; while (s0::vector((ulongT)mp_vector_crop,pos,arg1,p1,arg2,arg3).move_to(code); + CImg::vector((ulongT)mp_vector_crop,pos,arg1,p1,arg2,arg3,arg4).move_to(code); _cimg_mp_return(pos); } @@ -18045,10 +18676,8 @@ nb = (int)mem[arg2]; if (nb>=0 && nb<(int)_cimg_mp_size(arg1)) _cimg_mp_return(arg1 + 1 + nb); variable_name.assign(ss,(unsigned int)(s0 - ss)).back() = 0; - *se = saved_char; + _cimg_mp_strerr; cimg::strellipsize(variable_name,64); - s0 = ss - 4>expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); throw CImgArgumentException("[" cimg_appname "_math_parser] " "CImg<%s>::%s: Out-of-bounds reference '%s[%d]' " "(vector '%s' has dimension %u), " @@ -18056,7 +18685,7 @@ pixel_type(),_cimg_mp_calling_function, variable_name._data,nb, variable_name._data,_cimg_mp_size(arg1), - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); } if (p_ref) { *p_ref = 1; @@ -18082,6 +18711,7 @@ if (*ss2=='#') { // Index specified s0 = ss3; while (s0::vector((ulongT)mp_cats,0,0,0).move_to(l_opcode); - arg1 = 0; - for (s = ss5; s::vector(arg1,_cimg_mp_size(arg1)).move_to(l_opcode); - s = ns; - } - _cimg_mp_check_constant(arg1,1,3); // Last argument = output vector size - l_opcode.remove(); - (l_opcode>'y').move_to(opcode); - p1 = (unsigned int)mem[arg1]; - pos = vector(p1); - opcode[1] = pos; - opcode[2] = p1; - opcode[3] = opcode._height; - opcode.move_to(code); - _cimg_mp_return(pos); - } - if (!std::strncmp(ss,"cbrt(",5)) { // Cubic root _cimg_mp_op("Function 'cbrt()'"); arg1 = compile(ss5,se1,depth1,0,is_single); @@ -18462,7 +19077,61 @@ _cimg_mp_return(pos); } - if (!std::strncmp(ss,"continue(",9)) { // Complex absolute value + if (!std::strncmp(ss,"ccos(",5)) { // Complex cosine + _cimg_mp_op("Function 'ccos()'"); + arg1 = compile(ss5,se1,depth1,0,is_single); + _cimg_mp_check_type(arg1,0,2,2); + pos = vector(2); + CImg::vector((ulongT)mp_complex_cos,pos,arg1).move_to(code); + _cimg_mp_return(pos); + } + + if (!std::strncmp(ss,"csin(",5)) { // Complex sine + _cimg_mp_op("Function 'csin()'"); + arg1 = compile(ss5,se1,depth1,0,is_single); + _cimg_mp_check_type(arg1,0,2,2); + pos = vector(2); + CImg::vector((ulongT)mp_complex_sin,pos,arg1).move_to(code); + _cimg_mp_return(pos); + } + + if (!std::strncmp(ss,"ctan(",5)) { // Complex tangent + _cimg_mp_op("Function 'ctan()'"); + arg1 = compile(ss5,se1,depth1,0,is_single); + _cimg_mp_check_type(arg1,0,2,2); + pos = vector(2); + CImg::vector((ulongT)mp_complex_tan,pos,arg1).move_to(code); + _cimg_mp_return(pos); + } + + if (!std::strncmp(ss,"ccosh(",6)) { // Complex hyperbolic cosine + _cimg_mp_op("Function 'ccosh()'"); + arg1 = compile(ss6,se1,depth1,0,is_single); + _cimg_mp_check_type(arg1,0,2,2); + pos = vector(2); + CImg::vector((ulongT)mp_complex_cosh,pos,arg1).move_to(code); + _cimg_mp_return(pos); + } + + if (!std::strncmp(ss,"csinh(",6)) { // Complex hyperbolic sine + _cimg_mp_op("Function 'csinh()'"); + arg1 = compile(ss6,se1,depth1,0,is_single); + _cimg_mp_check_type(arg1,0,2,2); + pos = vector(2); + CImg::vector((ulongT)mp_complex_sinh,pos,arg1).move_to(code); + _cimg_mp_return(pos); + } + + if (!std::strncmp(ss,"ctanh(",6)) { // Complex hyperbolic tangent + _cimg_mp_op("Function 'ctanh()'"); + arg1 = compile(ss6,se1,depth1,0,is_single); + _cimg_mp_check_type(arg1,0,2,2); + pos = vector(2); + CImg::vector((ulongT)mp_complex_tanh,pos,arg1).move_to(code); + _cimg_mp_return(pos); + } + + if (!std::strncmp(ss,"continue(",9)) { // Continue loop if (pexpr[se2 - expr._data]=='(') { // no arguments? CImg::vector((ulongT)mp_continue,_cimg_mp_slot_nan).move_to(code); _cimg_mp_return_nan(); @@ -18604,14 +19273,12 @@ arg1 = arg2 + (is_sth?2:5); break; default : // Error -> too much arguments - *se = saved_char; - s0 = ss - 4>expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); + _cimg_mp_strerr; throw CImgArgumentException("[" cimg_appname "_math_parser] " "CImg<%s>::%s: %s: Too much arguments specified, " "in expression '%s%s%s'.", pixel_type(),_cimg_mp_calling_function,s_op, - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); } _cimg_mp_check_type((unsigned int)*opcode,arg2 + 1,1,0); @@ -18638,20 +19305,19 @@ if (opcode[4]==(ulongT)~0U || opcode[5]==(ulongT)~0U || opcode[6]==(ulongT)~0U || opcode[7]==(ulongT)~0U) { + p2 = 0; if (p1!=~0U) { _cimg_mp_check_constant(p1,1,1); - p1 = (unsigned int)cimg::mod((int)mem[p1],listin.width()); + p2 = (unsigned int)cimg::mod((int)mem[p1],listin.width()); } - const CImg &img = p1!=~0U?listin[p1]:imgin; + const CImg &img = p1!=~0U?listin[p2]:imgin; if (!img) { - *se = saved_char; - s0 = ss - 4>expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); + _cimg_mp_strerr; throw CImgArgumentException("[" cimg_appname "_math_parser] " "CImg<%s>::%s: %s: Cannot crop empty image when " "some xyzc-coordinates are unspecified, in expression '%s%s%s'.", pixel_type(),_cimg_mp_calling_function,s_op, - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); } if (opcode[4]==(ulongT)~0U) opcode[4] = (ulongT)img._width; if (opcode[5]==(ulongT)~0U) opcode[5] = (ulongT)img._height; @@ -18698,6 +19364,136 @@ } _cimg_mp_scalar3(mp_cut,arg1,arg2,arg3); } + + if (!std::strncmp(ss,"convolve(",9) || !std::strncmp(ss,"correlate(",10)) { // Convolve & Correlate + is_sth = *ss2=='n'; // is_convolve? + _cimg_mp_op(is_sth?"Function 'convolve()'":"Function 'correlate()'"); + op = is_sth?mp_convolve:mp_correlate; + const ulongT default_params[] = { (ulongT)op,0, // [0]=function, [1]=result vector + 0,0,0,0,0, // [2]=A, [3]=wA, [4]=hA, [5]=dA, [6]=sA + 0,0,0,0,0, // [7]=M, [8]=wM, [9]=hM, [10]=dM, [11]=sM + 1,0,1, // [12]=boundary_conditions, [13]=is_normalized, [14]=chan._mode + 11,11,11, // [15]=xcenter, [16]=ycenter, [17]=zcenter (default value:-1) + 0,0,0, // [18]=xstart, [19]=ystart, [20]=zstart + 11,11,11, // [21]=xend, [22]=yend, [23]=zend (default value: -1) + 1,1,1, // [24]=xstride, [25]=ystride, [26]=zstride + 1,1,1 }; // [27]=xdilation, [28]=ydilation, [29]=zdilation + + l_opcode.assign(); // Don't use 'opcode': it could be modified by further calls to 'compile()'! + CImg(default_params,1,sizeof(default_params)/sizeof(ulongT)).move_to(l_opcode); + + arg1 = 2; + for (s = std::strchr(ss,'(') + 1; s=opcode._height) { + _cimg_mp_strerr; + throw CImgArgumentException("[" cimg_appname "_math_parser] " + "CImg<%s>::%s: %s: %s arguments provided, in expression '%s%s%s'.", + pixel_type(),_cimg_mp_calling_function,s_op, + arg1<12?"Not enough":"Too much", + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); + } + _cimg_mp_check_type(opcode[2],1,2,0); // A + _cimg_mp_check_constant(opcode[3],2,3); // wA + _cimg_mp_check_constant(opcode[4],3,3); // hA + _cimg_mp_check_constant(opcode[5],4,3); // dA + _cimg_mp_check_constant(opcode[6],5,3); // sA + _cimg_mp_check_type(opcode[7],6,2,0); // M + _cimg_mp_check_constant(opcode[8],7,3); // wM + _cimg_mp_check_constant(opcode[9],8,3); // hM + _cimg_mp_check_constant(opcode[10],9,3); // dM + _cimg_mp_check_constant(opcode[11],10,3); // sM + _cimg_mp_check_type(opcode[12],11,1,0); // boundary_conditions + _cimg_mp_check_type(opcode[13],12,1,0); // is_normalized + _cimg_mp_check_constant(opcode[14],13,1); // channel_mode + _cimg_mp_check_type(opcode[15],14,1,0); // xcenter + _cimg_mp_check_type(opcode[16],15,1,0); // ycenter + _cimg_mp_check_type(opcode[17],16,1,0); // zcenter + _cimg_mp_check_constant(opcode[18],17,1); // xstart + _cimg_mp_check_constant(opcode[19],18,1); // ystart + _cimg_mp_check_constant(opcode[20],19,1); // zstart + _cimg_mp_check_constant(opcode[21],20,1); // xend + _cimg_mp_check_constant(opcode[22],21,1); // yend + _cimg_mp_check_constant(opcode[23],22,1); // zend + _cimg_mp_check_constant(opcode[24],23,3); // xstride + _cimg_mp_check_constant(opcode[25],24,3); // ystride + _cimg_mp_check_constant(opcode[26],25,3); // zstride + _cimg_mp_check_type(opcode[27],26,1,0); // xdilation + _cimg_mp_check_type(opcode[28],27,1,0); // ydilation + _cimg_mp_check_type(opcode[29],28,1,0); // zdilation + + const unsigned int + wA = (unsigned int)mem[opcode[3]], + hA = (unsigned int)mem[opcode[4]], + dA = (unsigned int)mem[opcode[5]], + sA = (unsigned int)mem[opcode[6]], + wM = (unsigned int)mem[opcode[8]], + hM = (unsigned int)mem[opcode[9]], + dM = (unsigned int)mem[opcode[10]], + sM = (unsigned int)mem[opcode[11]], + channel_mode = (unsigned int)mem[opcode[14]], + xstart = std::min((unsigned int)mem[opcode[18]],wA - 1), + ystart = std::min((unsigned int)mem[opcode[19]],hA - 1), + zstart = std::min((unsigned int)mem[opcode[20]],dA - 1), + xend = std::min((unsigned int)mem[opcode[21]],wA - 1), + yend = std::min((unsigned int)mem[opcode[22]],hA - 1), + zend = std::min((unsigned int)mem[opcode[23]],dA - 1); + + if (xstart>xend || ystart>yend || zstart>zend) { + _cimg_mp_strerr; + throw CImgArgumentException("[" cimg_appname "_math_parser] " + "CImg<%s>::%s: %s: Invalid xyz-start/end arguments " + "(start = (%u,%u,%u), end = (%u,%u,%u)), in expression '%s%s%s'.", + pixel_type(),_cimg_mp_calling_function,s_op, + xstart,ystart,zstart,xend,yend,zend, + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); + } + + const float + xstride = (float)mem[opcode[24]], + ystride = (float)mem[opcode[25]], + zstride = (float)mem[opcode[26]]; + + if (xstride<=0 || ystride<=0 || zstride<=0) { + _cimg_mp_strerr; + throw CImgArgumentException("[" cimg_appname "_math_parser] " + "CImg<%s>::%s: %s: Invalid stride arguments (%g,%g,%g), " + "in expression '%s%s%s'.", + pixel_type(),_cimg_mp_calling_function,s_op, + xstride,ystride,zstride, + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); + } + + arg2 = 1 + (unsigned int)std::floor((xend - xstart)/xstride); + arg3 = 1 + (unsigned int)std::floor((yend - ystart)/ystride); + arg4 = 1 + (unsigned int)std::floor((zend + zstart)/zstride); + arg5 = channel_mode==0?sM:channel_mode==1?std::max(sA,sM):sA*sM; + + opcode[1] = pos = vector(arg2*arg3*arg4*arg5); + opcode[3] = (ulongT)wA; + opcode[4] = (ulongT)hA; + opcode[5] = (ulongT)dA; + opcode[6] = (ulongT)sA; + opcode[8] = (ulongT)wM; + opcode[9] = (ulongT)hM; + opcode[10] = (ulongT)dM; + opcode[11] = (ulongT)sM; + opcode[14] = (ulongT)channel_mode; + opcode[18] = (ulongT)xstart; + opcode[19] = (ulongT)ystart; + opcode[20] = (ulongT)zstart; + opcode[21] = (ulongT)xend; + opcode[22] = (ulongT)yend; + opcode[23] = (ulongT)zend; + opcode.move_to(code); + _cimg_mp_return(pos); + } break; case 'd' : @@ -18716,19 +19512,12 @@ _cimg_mp_op("Function 'date()'"); s1 = ss5; while (s1::string(s1,true,true).unroll('y'),true); - cimg::strpare(variable_name,false,true); - ((CImg::vector((ulongT)mp_date,pos,0,arg1,_cimg_mp_size(pos)),variable_name)>'y'). - move_to(opcode); - *se1 = ')'; - } else - CImg::vector((ulongT)mp_date,pos,0,arg1,_cimg_mp_size(pos)).move_to(opcode); - opcode[2] = opcode._height; - opcode.move_to(code); + CImg::vector((ulongT)mp_date,pos,_cimg_mp_size(pos), + arg1,arg1==~0U?~0U:_cimg_mp_size(arg1), + arg2,arg2==~0U?~0U:_cimg_mp_size(arg2)).move_to(code); _cimg_mp_return(pos); } @@ -18915,7 +19704,7 @@ } } - l_opcode.assign(); // Don't use 'opcode': it can be modified by further calls to 'compile()'! + l_opcode.assign(); // Don't use 'opcode': it could be modified by further calls to 'compile()'! CImg::vector((ulongT)mp_draw,arg1,(ulongT)_cimg_mp_size(arg1),p1,arg2,arg3,arg4,arg5, 0,0,0,0,1,(ulongT)~0U,0,1).move_to(l_opcode); @@ -18997,14 +19786,6 @@ _cimg_mp_return(pos); } - if (!std::strncmp(ss,"end(",4)) { // End - _cimg_mp_op("Function 'end()'"); - code.swap(code_end); - compile(ss4,se1,depth1,p_ref,true); - code.swap(code_end); - _cimg_mp_return_nan(); - } - if (!std::strncmp(ss,"ellipse(",8)) { // Ellipse/circle drawing if (!is_single) is_parallelizable = false; _cimg_mp_op("Function 'ellipse()'"); @@ -19032,26 +19813,6 @@ _cimg_mp_return_nan(); } - if (!std::strncmp(ss,"ext(",4)) { // Extern - _cimg_mp_op("Function 'ext()'"); - if (!is_single) is_parallelizable = false; - CImg::vector((ulongT)mp_ext,0,0).move_to(l_opcode); - pos = 1; - for (s = ss4; s::vector(arg1,_cimg_mp_size(arg1)).move_to(l_opcode); - s = ns; - } - (l_opcode>'y').move_to(opcode); - pos = scalar(); - opcode[1] = pos; - opcode[2] = opcode._height; - opcode.move_to(code); - _cimg_mp_return(pos); - } - if (!std::strncmp(ss,"exp(",4)) { // Exponential _cimg_mp_op("Function 'exp()'"); arg1 = compile(ss4,se1,depth1,0,is_single); @@ -19069,9 +19830,35 @@ CImg::vector((ulongT)mp_eye,pos,p1).move_to(code); _cimg_mp_return(pos); } + + if (!std::strncmp(ss,"end(",4)) { // End + _cimg_mp_op("Function 'end()'"); + code.swap(code_end); + compile(ss4,se1,depth1,p_ref,true); + code.swap(code_end); + is_end_code = true; + _cimg_mp_return_nan(); + } + + if (!std::strncmp(ss,"end_t(",6)) { // End thread + _cimg_mp_op("Function 'end_t()'"); + code.swap(code_end_t); + compile(ss6,se1,depth1,p_ref,true); + code.swap(code_end_t); + is_end_code = true; + _cimg_mp_return_nan(); + } break; case 'f' : + if (!std::strncmp(ss,"f2ui(",5)) { // Special float->uint conversion + _cimg_mp_op("Function 'f2ui()'"); + arg1 = compile(ss5,se1,depth1,0,is_single); + if (_cimg_mp_is_vector(arg1)) _cimg_mp_vector1_v(mp_f2ui,arg1); + if (_cimg_mp_is_constant(arg1)) _cimg_mp_constant((double)cimg::float2uint((float)mem[arg1])); + _cimg_mp_scalar1(mp_f2ui,arg1); + } + if (!std::strncmp(ss,"fact(",5)) { // Factorial _cimg_mp_op("Function 'fact()'"); arg1 = compile(ss5,se1,depth1,0,is_single); @@ -19107,8 +19894,8 @@ s1 = ++s0; while (s11) _cimg_mp_scalar5(mp_list_find_seq,p1,arg2,_cimg_mp_size(arg2),arg3,arg4); - _cimg_mp_scalar4(mp_list_find,p1,arg2,arg3,arg4); + _cimg_mp_scalar4(mp_list_find,p1,arg2 + (_cimg_mp_size(arg2)?1:0),arg3,arg4); } - if (_cimg_mp_is_vector(arg2)) + if (_cimg_mp_size(arg2)>1) _cimg_mp_scalar6(mp_find_seq,arg1,_cimg_mp_size(arg1),arg2,_cimg_mp_size(arg2),arg3,arg4); - _cimg_mp_scalar5(mp_find,arg1,_cimg_mp_size(arg1),arg2,arg3,arg4); + _cimg_mp_scalar5(mp_find,arg1,_cimg_mp_size(arg1),arg2 + (_cimg_mp_size(arg2)?1:0),arg3,arg4); } if (*ss1=='o' && *ss2=='r' && *ss3=='(') { // For loop @@ -19166,14 +19953,10 @@ if (!std::strncmp(ss,"fsize(",6)) { // File size _cimg_mp_op("Function 'fsize()'"); - *se1 = 0; - variable_name.assign(CImg::string(ss6,true,true).unroll('y'),true); - cimg::strpare(variable_name,false,true); + arg1 = compile(ss6,se1,depth1,0,is_single); + _cimg_mp_check_type(arg1,1,2,0); pos = scalar(); - ((CImg::vector((ulongT)mp_fsize,pos,0),variable_name)>'y').move_to(opcode); - *se1 = ')'; - opcode[2] = opcode._height; - opcode.move_to(code); + CImg::vector((ulongT)mp_fsize,pos,arg1,(ulongT)_cimg_mp_size(arg1)).move_to(code); _cimg_mp_return(pos); } break; @@ -19238,6 +20021,28 @@ _cimg_mp_return(pos); } + if (*ss1=='c' && *ss2=='(') { // Image median + _cimg_mp_op("Function 'ic()'"); + if (*ss3=='#') { // Index specified + p1 = compile(ss4,se1,depth1,0,is_single); + _cimg_mp_check_list(false); + } else { if (ss3!=se1) break; p1 = ~0U; } + pos = scalar(); + CImg::vector((ulongT)mp_image_median,pos,p1).move_to(code); + _cimg_mp_return(pos); + } + + if (*ss1=='n' && *ss2=='(') { // Image norm + _cimg_mp_op("Function 'in()'"); + if (*ss3=='#') { // Index specified + p1 = compile(ss4,se1,depth1,0,is_single); + _cimg_mp_check_list(false); + } else { if (ss3!=se1) break; p1 = ~0U; } + pos = scalar(); + CImg::vector((ulongT)mp_image_norm,pos,p1).move_to(code); + _cimg_mp_return(pos); + } + if (*ss1=='f' && *ss2=='(') { // If..then[..else.] _cimg_mp_op("Function 'if()'"); s1 = ss3; while (s1val2) cimg::swap(val1,val2); + is_sth = mem[arg4]?(val>=val1 && val<=val2):(val>val1 && val::vector((ulongT)mp_inrange,pos,arg5,arg1,p1,arg2,p2,arg3,p3,arg4).move_to(code); + _cimg_mp_return(pos); + } + + if (!std::strncmp(ss,"int(",4)) { // Integer cast _cimg_mp_op("Function 'int()'"); arg1 = compile(ss4,se1,depth1,0,is_single); @@ -19269,14 +20109,17 @@ _cimg_mp_scalar1(mp_int,arg1); } - if (!std::strncmp(ss,"inv(",4)) { // Matrix/scalar inversion - _cimg_mp_op("Function 'inv()'"); - arg1 = compile(ss4,se1,depth1,0,is_single); + if (!std::strncmp(ss,"invert(",7)) { // Matrix/scalar inversion + _cimg_mp_op("Function 'invert()'"); + s1 = ss7; while (s1::vector((ulongT)mp_matrix_inv,pos,arg1,p1).move_to(code); + CImg::vector((ulongT)mp_matrix_invert,pos,arg1,p1,arg2).move_to(code); _cimg_mp_return(pos); } if (_cimg_mp_is_constant(arg1)) _cimg_mp_constant(1/mem[arg1]); @@ -19288,7 +20131,8 @@ if (!std::strncmp(ss,"isbool(",7)) { // Is boolean? _cimg_mp_op("Function 'isbool()'"); if (ss7==se1) _cimg_mp_return(0); - arg1 = compile(ss7,se1,depth1,0,is_single); + try { arg1 = compile(ss7,se1,depth1,0,is_single); } + catch(CImgException&) { _cimg_mp_return(0); } if (_cimg_mp_is_vector(arg1)) _cimg_mp_vector1_v(mp_isbool,arg1); if (_cimg_mp_is_constant(arg1)) _cimg_mp_return(mem[arg1]==0. || mem[arg1]==1.); _cimg_mp_scalar1(mp_isbool,arg1); @@ -19296,18 +20140,20 @@ if (!std::strncmp(ss,"isdir(",6)) { // Is directory? _cimg_mp_op("Function 'isdir()'"); - *se1 = 0; - is_sth = cimg::is_directory(ss6); - *se1 = ')'; - _cimg_mp_return(is_sth?1U:0U); + arg1 = compile(ss6,se1,depth1,0,is_single); + if (_cimg_mp_is_scalar(arg1)) _cimg_mp_return(0); + pos = scalar(); + CImg::vector((ulongT)mp_isdir,pos,arg1,(ulongT)_cimg_mp_size(arg1)).move_to(code); + _cimg_mp_return(pos); } if (!std::strncmp(ss,"isfile(",7)) { // Is file? _cimg_mp_op("Function 'isfile()'"); - *se1 = 0; - is_sth = cimg::is_file(ss7); - *se1 = ')'; - _cimg_mp_return(is_sth?1U:0U); + arg1 = compile(ss7,se1,depth1,0,is_single); + if (_cimg_mp_is_scalar(arg1)) _cimg_mp_return(0); + pos = scalar(); + CImg::vector((ulongT)mp_isfile,pos,arg1,(ulongT)_cimg_mp_size(arg1)).move_to(code); + _cimg_mp_return(pos); } if (!std::strncmp(ss,"isin(",5)) { // Is in sequence/vector? @@ -19344,9 +20190,10 @@ if (!std::strncmp(ss,"isint(",6)) { // Is integer? _cimg_mp_op("Function 'isint()'"); if (ss6==se1) _cimg_mp_return(0); - arg1 = compile(ss6,se1,depth1,0,is_single); + try { arg1 = compile(ss6,se1,depth1,0,is_single); } + catch(CImgException&) { _cimg_mp_return(0); } if (_cimg_mp_is_vector(arg1)) _cimg_mp_vector1_v(mp_isint,arg1); - if (_cimg_mp_is_constant(arg1)) _cimg_mp_return((unsigned int)(cimg::mod(mem[arg1],1.)==0)); + if (_cimg_mp_is_constant(arg1)) _cimg_mp_return((unsigned int)((double)(longT)mem[arg1]==mem[arg1])); _cimg_mp_scalar1(mp_isint,arg1); } @@ -19359,13 +20206,20 @@ _cimg_mp_scalar1(mp_isnan,arg1); } - if (!std::strncmp(ss,"isval(",6)) { // Is value? - _cimg_mp_op("Function 'isval()'"); + if (!std::strncmp(ss,"isnum(",6)) { // Is number? + _cimg_mp_op("Function 'isnum()'"); val = 0; if (cimg_sscanf(ss6,"%lf%c%c",&val,&sep,&end)==2 && sep==')') _cimg_mp_return(1); _cimg_mp_return(0); } + if (!std::strncmp(ss,"isexpr(",7)) { // Is valid expression? + _cimg_mp_op("Function 'isexpr()'"); + if (ss7==se1) _cimg_mp_return(0); + try { arg1 = compile(ss7,se1,depth1,0,is_single); } + catch (CImgException&) { _cimg_mp_return(0); } + _cimg_mp_return(1); + } } break; @@ -19376,6 +20230,33 @@ _cimg_mp_scalar0(mp_list_l); } + if (!std::strncmp(ss,"lerp(",5)) { // Linear interpolation + _cimg_mp_op("Function 'lerp()'"); + s1 = ss5; while (s1::vector((ulongT)mp_vector_lerp,pos,p1,arg1,arg2,arg3).move_to(code); + _cimg_mp_return(pos); + } + if (!std::strncmp(ss,"log(",4)) { // Natural logarithm _cimg_mp_op("Function 'log()'"); arg1 = compile(ss4,se1,depth1,0,is_single); @@ -19426,24 +20307,155 @@ arg5 = p2/p3; arg4 = p1/arg5; if (arg4*arg5!=p1 || arg5*p3!=p2) { - *se = saved_char; - s0 = ss - 4>expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); + _cimg_mp_strerr; throw CImgArgumentException("[" cimg_appname "_math_parser] " "CImg<%s>::%s: %s: Types of first and second arguments ('%s' and '%s') " "do not match with third argument 'nb_colsB=%u', " "in expression '%s%s%s'.", pixel_type(),_cimg_mp_calling_function,s_op, s_type(arg1)._data,s_type(arg2)._data,p3, - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); } pos = vector(arg4*p3); CImg::vector((ulongT)mp_matrix_mul,pos,arg1,arg2,arg4,arg5,p3).move_to(code); _cimg_mp_return(pos); } + + if (!std::strncmp(ss,"mproj(",6)) { // Project matrix onto dictionnary + _cimg_mp_op("Function 'mproj()'"); + s1 = ss6; while (s1::%s: %s: Type of first argument ('%s') " + "do not match with second argument 'nb_colsS=%u', " + "in expression '%s%s%s'.", + pixel_type(),_cimg_mp_calling_function,s_op, + s_type(arg1)._data,wS, + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); + } + if (wD*hD!=p2) { + _cimg_mp_strerr; + throw CImgArgumentException("[" cimg_appname "_math_parser] " + "CImg<%s>::%s: %s: Type of third argument ('%s') " + "do not match with fourth argument 'nb_colsD=%u', " + "in expression '%s%s%s'.", + pixel_type(),_cimg_mp_calling_function,s_op, + s_type(arg3)._data,wD, + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); + } + if (hS!=hD) { + _cimg_mp_strerr; + throw CImgArgumentException("[" cimg_appname "_math_parser] " + "CImg<%s>::%s: %s: Type of first argument ('%s') " + "do not match with third argument ('%s'), " + "in expression '%s%s%s'.", + pixel_type(),_cimg_mp_calling_function,s_op, + s_type(arg1)._data,s_type(arg3)._data, + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); + } + pos = vector(wS*wD); + CImg::vector((ulongT)mp_mproj,pos,arg1,wS,hS,arg3,wD,arg5,arg6,p3).move_to(code); + _cimg_mp_return(pos); + } + + if (!std::strncmp(ss,"merge(",6)) { // Merge inter-thread variables + _cimg_mp_op("Function 'merge()'"); + s1 = ss6; while (s1::%s: %s: Merge has already been requested before " + "for specified variable " + "in expression '%s%s%s'.", + pixel_type(),_cimg_mp_calling_function,s_op, + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); + } + if (arg1==~0U) { + _cimg_mp_strerr; + throw CImgArgumentException("[" cimg_appname "_math_parser] " + "CImg<%s>::%s: %s: Invalid specified operator " + "(should be one of '=,+,-,*,/,min,max'), " + "in expression '%s%s%s'.", + pixel_type(),_cimg_mp_calling_function,s_op, + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); + } + memmerge.resize(3,memmerge._height + 1,1,1,0,0); + memmerge(0,memmerge._height - 1) = (int)pos; + memmerge(1,memmerge._height - 1) = (int)_cimg_mp_size(pos); + memmerge(2,memmerge._height - 1) = (int)arg1; + _cimg_mp_return(pos); + } break; case 'n' : +#ifdef cimg_mp_func_name + if (!std::strncmp(ss,"name(",5)) { // Get image name as a string vector + _cimg_mp_op("Function 'name()'"); + if (*ss5=='#') { // Index specified + s0 = ss6; while (s0::vector((ulongT)mp_name,pos,p1,arg1).move_to(code); + _cimg_mp_return(pos); + } +#endif + if (!std::strncmp(ss,"narg(",5)) { // Number of arguments _cimg_mp_op("Function 'narg()'"); if (ss5>=se1) _cimg_mp_return(0); @@ -19576,35 +20588,77 @@ } } - if (!std::strncmp(ss,"pseudoinv(",10)) { // Matrix/scalar pseudo-inversion - _cimg_mp_op("Function 'pseudoinv()'"); - s1 = ss + 10; while (s1expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); + _cimg_mp_strerr; throw CImgArgumentException("[" cimg_appname "_math_parser] " "CImg<%s>::%s: %s: Type of first argument ('%s') " "does not match with second argument 'nb_colsA=%u', " "in expression '%s%s%s'.", pixel_type(),_cimg_mp_calling_function,s_op, s_type(arg1)._data,p2, - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); } pos = vector(p1); - CImg::vector((ulongT)mp_matrix_pseudoinv,pos,arg1,p2,p3).move_to(code); + CImg::vector((ulongT)mp_matrix_pseudoinvert,pos,arg1,p2,p3,arg3).move_to(code); _cimg_mp_return(pos); } break; case 'r' : + if (!std::strncmp(ss,"ref(",4)) { // Variable declaration + _cimg_mp_op("Function 'ref()'"); + s1 = ss4; while (s1=se1 || !*s1) compile(s1,s1,depth1,0,is_single); // Will throw missing argument error + arg3 = compile(ss4,s1++,depth1,p_ref,is_single); + *se1 = 0; + is_sth = true; + if (*s1>='0' && *s1<='9') is_sth = false; + else for (ns = s1; *ns; ++ns) if (!is_varchar(*ns)) { is_sth = false; break; } + if (!is_sth) { + variable_name.assign(s1,(unsigned int)(se1 + 1 - s1)).back() = 0; + cimg::strellipsize(variable_name,64); + *se1 = ')'; + _cimg_mp_strerr; + throw CImgArgumentException("[" cimg_appname "_math_parser] " + "CImg<%s>::%s: %s: Invalid specified variable name '%s', " + "in expression '%s%s%s'.", + pixel_type(),_cimg_mp_calling_function,s_op, + variable_name._data, + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); + + } + get_variable_pos(s1,arg1,arg2); + if (arg2!=~0U) reserved_label[arg2] = arg3; + else if (arg1!=~0U) variable_pos[arg1] = arg3; + else { // New variable + if (variable_def._width>=variable_pos._width) variable_pos.resize(-200,1,1,1,0); + variable_pos[variable_def._width] = arg3; + CImg::string(s1).move_to(variable_def); + } + if (_cimg_mp_is_vector(arg3)) + set_variable_vector(arg3); // Prevent from being used in further optimization + else if (_cimg_mp_is_comp(arg3)) memtype[arg3] = -1; + *se1 = ')'; + _cimg_mp_return(arg3); + } + if (!std::strncmp(ss,"resize(",7)) { // Vector or image resize _cimg_mp_op("Function 'resize()'"); if (*ss7!='#') { // Vector @@ -19647,14 +20701,12 @@ ++pos; } if (pos<1 || pos>10) { - *se = saved_char; - s0 = ss - 4>expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); + _cimg_mp_strerr; throw CImgArgumentException("[" cimg_appname "_math_parser] " "CImg<%s>::%s: %s: %s arguments, in expression '%s%s%s'.", pixel_type(),_cimg_mp_calling_function,s_op, pos<1?"Missing":"Too much", - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); } l_opcode[0].move_to(code); _cimg_mp_return_nan(); @@ -19739,6 +20791,28 @@ _cimg_mp_constant(cimg::round(mem[arg1],mem[arg2],(int)mem[arg3])); _cimg_mp_scalar3(mp_round,arg1,arg2,arg3); } + +#ifdef cimg_mp_func_run + if (!std::strncmp(ss,"run(",4)) { // Run external command + _cimg_mp_op("Function 'run()'"); + if (!is_single) is_parallelizable = false; + CImg::vector((ulongT)mp_run,0,0).move_to(l_opcode); + pos = 1; + for (s = ss4; s::vector(arg1,_cimg_mp_size(arg1)).move_to(l_opcode); + s = ns; + } + (l_opcode>'y').move_to(opcode); + pos = scalar(); + opcode[1] = pos; + opcode[2] = opcode._height; + opcode.move_to(code); + _cimg_mp_return(pos); + } +#endif break; case 's' : @@ -19772,6 +20846,30 @@ _cimg_mp_scalar6(mp_vector_eq,arg1,p1,arg2,p2,arg3,arg4); } +#ifdef cimg_mp_func_setname + if (!std::strncmp(ss,"setname(",8)) { // Set image name from a string vector + _cimg_mp_op("Function 'setname()'"); + if (*ss8=='#') { // Index specified + s0 = ss8 + 1; while (s0::vector((ulongT)mp_setname,_cimg_mp_slot_nan,0,p1).move_to(l_opcode); + for (s = s0; s::vector(arg1,_cimg_mp_size(arg1)).move_to(l_opcode); + s = ns; + } + (l_opcode>'y').move_to(opcode); + opcode[2] = opcode._height; + opcode.move_to(code); + _cimg_mp_return_nan(); + } +#endif + if (!std::strncmp(ss,"shift(",6)) { // Shift vector _cimg_mp_op("Function 'shift()'"); s1 = ss6; while (s1expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); + _cimg_mp_strerr; throw CImgArgumentException("[" cimg_appname "_math_parser] " "CImg<%s>::%s: %s: Types of first and second arguments ('%s' and '%s') " "do not match with third argument 'nb_colsB=%u', " "in expression '%s%s%s'.", pixel_type(),_cimg_mp_calling_function,s_op, s_type(arg1)._data,s_type(arg2)._data,p3, - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); } pos = vector(arg4*p3); CImg::vector((ulongT)mp_solve,pos,arg1,arg2,arg4,arg5,p3).move_to(code); @@ -19878,15 +20974,13 @@ arg3 = (unsigned int)mem[arg3]; p1 = _cimg_mp_size(arg1); if (p1%arg3) { - *se = saved_char; - s0 = ss - 4>expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); + _cimg_mp_strerr; throw CImgArgumentException("[" cimg_appname "_math_parser] " "CImg<%s>::%s: %s: Invalid specified chunk size (%u) for first argument " "('%s'), in expression '%s%s%s'.", pixel_type(),_cimg_mp_calling_function,s_op, arg3,s_type(arg1)._data, - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); } pos = vector(p1); CImg::vector((ulongT)mp_sort,pos,arg1,p1,arg2,arg3).move_to(code); @@ -19944,6 +21038,67 @@ _cimg_mp_return(pos); } +#ifdef cimg_mp_func_store + if (!std::strncmp(ss,"store(",6)) { // Store vector to variable + _cimg_mp_op("Function 'store()'"); + s1 = ss6; while (s1p3) { + _cimg_mp_strerr; + throw CImgArgumentException("[" cimg_appname "_math_parser] " + "CImg<%s>::%s: %s: Specified dimensions (%u,%u,%u,%u) " + "are too large for vector size (%u), " + "in expression '%s%s%s'.", + pixel_type(),_cimg_mp_calling_function,s_op, + varg3,varg4,varg5,varg6,p3, + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); + } + } + CImg::vector((ulongT)mp_store,_cimg_mp_slot_nan,arg1,p1,arg2,p2, + arg3,arg4,arg5,arg6,pos).move_to(code); + _cimg_mp_return_nan(); + } +#endif + if (!std::strncmp(ss,"stov(",5)) { // String to double _cimg_mp_op("Function 'stov()'"); s1 = ss5; while (s1::vector((ulongT)mp_stov,pos,arg1,p1,arg2,arg3).move_to(code); + _cimg_mp_return(pos); + } + + if (!std::strncmp(ss,"string(",7)) { // Construct string from list of arguments + _cimg_mp_op("Function 'string()'"); + CImg::vector((ulongT)mp_string,0,0,0).move_to(l_opcode); + + if (*ss7=='#') { // Output vector size specified, with '#' + s0 = ss8; while (s0::vector(arg2,p2).move_to(l_opcode); + s = ns; + } + if (arg1==~0U) arg1 = p1; + pos = vector(arg1,0); + (l_opcode>'y').move_to(opcode); + opcode[1] = pos; + opcode[2] = arg1; + opcode[3] = opcode._height; + opcode.move_to(code); + _cimg_mp_return(pos); } if (!std::strncmp(ss,"svd(",4)) { // Matrix SVD @@ -19971,21 +21164,149 @@ p2 = (unsigned int)mem[arg2]; p3 = p1/p2; if (p3*p2!=p1) { - *se = saved_char; - s0 = ss - 4>expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); + _cimg_mp_strerr; throw CImgArgumentException("[" cimg_appname "_math_parser] " "CImg<%s>::%s: %s: Type of first argument ('%s') " "does not match with second argument 'nb_colsA=%u', " "in expression '%s%s%s'.", pixel_type(),_cimg_mp_calling_function,s_op, s_type(arg1)._data,p2, - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); } pos = vector(p1 + p2 + p2*p2); CImg::vector((ulongT)mp_matrix_svd,pos,arg1,p2,p3).move_to(code); _cimg_mp_return(pos); } + + if (!std::strncmp(ss,"swap(",5)) { // Swap values + _cimg_mp_op("Function 'swap()'"); + s1 = ss5; while (s1::%s: %s: %s argument cannot be a constant, " + "in expression '%s%s%s'.", + pixel_type(),_cimg_mp_calling_function,s_op, + _cimg_mp_is_constant(arg1)?"First":"Second", + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); + } + CImg::vector((ulongT)mp_swap,arg1,arg2,p1).move_to(code); + + // Write back values of linked arg1 and arg2. + const unsigned int *_ref = ref; + is_sth = true; // Is first argument? + do { + switch (*_ref) { + case 1 : // arg1: V[k] + arg3 = _ref[1]; // Vector slot + arg4 = _ref[2]; // Index + CImg::vector((ulongT)mp_vector_set_off,arg1,arg3,(ulongT)_cimg_mp_size(arg3),arg4). + move_to(code); + break; + case 2 : // arg1: i/j[_#ind,off] + if (!is_single) is_parallelizable = false; + p1 = _ref[1]; // Index + is_relative = (bool)_ref[2]; + arg3 = _ref[3]; // Offset + if (p1!=~0U) { + if (listout) + CImg::vector((ulongT)(is_relative?mp_list_set_joff:mp_list_set_ioff), + arg1,p1,arg3).move_to(code); + } else { + if (imgout) + CImg::vector((ulongT)(is_relative?mp_set_joff:mp_set_ioff), + arg1,arg3).move_to(code); + } + break; + case 3 : // arg1: i/j(_#ind,_x,_y,_z,_c) + if (!is_single) is_parallelizable = false; + p1 = _ref[1]; // Index + is_relative = (bool)_ref[2]; + arg3 = _ref[3]; // X + arg4 = _ref[4]; // Y + arg5 = _ref[5]; // Z + arg6 = _ref[6]; // C + if (p1!=~0U) { + if (listout) + CImg::vector((ulongT)(is_relative?mp_list_set_jxyzc:mp_list_set_ixyzc), + arg1,p1,arg3,arg4,arg5,arg6).move_to(code); + } else { + if (imgout) + CImg::vector((ulongT)(is_relative?mp_set_jxyzc:mp_set_ixyzc), + arg1,arg3,arg4,arg5,arg6).move_to(code); + } + break; + case 4: // arg1: I/J[_#ind,off] + if (!is_single) is_parallelizable = false; + p1 = _ref[1]; // Index + is_relative = (bool)_ref[2]; + arg3 = _ref[3]; // Offset + if (p1!=~0U) { + if (listout) { + if (_cimg_mp_is_scalar(arg1)) + CImg::vector((ulongT)(is_relative?mp_list_set_Joff_s:mp_list_set_Ioff_s), + arg1,p1,arg3).move_to(code); + else { + _cimg_mp_check_constant_index(p1); + CImg::vector((ulongT)(is_relative?mp_list_set_Joff_v:mp_list_set_Ioff_v), + arg1,p1,arg3,_cimg_mp_size(arg1)).move_to(code); + } + } + } else { + if (imgout) { + if (_cimg_mp_is_scalar(arg1)) + CImg::vector((ulongT)(is_relative?mp_set_Joff_s:mp_set_Ioff_s), + arg1,arg3).move_to(code); + else + CImg::vector((ulongT)(is_relative?mp_set_Joff_v:mp_set_Ioff_v), + arg1,arg3,_cimg_mp_size(arg1)).move_to(code); + } + } + break; + case 5 : // arg1: I/J(_#ind,_x,_y,_z,_c) + if (!is_single) is_parallelizable = false; + p1 = _ref[1]; // Index + is_relative = (bool)_ref[2]; + arg3 = _ref[3]; // X + arg4 = _ref[4]; // Y + arg5 = _ref[5]; // Z + if (p1!=~0U) { + if (listout) { + if (_cimg_mp_is_scalar(arg1)) + CImg::vector((ulongT)(is_relative?mp_list_set_Jxyz_s:mp_list_set_Ixyz_s), + arg1,p1,arg3,arg4,arg5).move_to(code); + else { + _cimg_mp_check_constant_index(p1); + CImg::vector((ulongT)(is_relative?mp_list_set_Jxyz_v:mp_list_set_Ixyz_v), + arg1,p1,arg3,arg4,arg5,_cimg_mp_size(arg1)).move_to(code); + } + } + } else { + if (imgout) { + if (_cimg_mp_is_scalar(arg1)) + CImg::vector((ulongT)(is_relative?mp_set_Jxyz_s:mp_set_Ixyz_s), + arg1,arg3,arg4,arg5).move_to(code); + else + CImg::vector((ulongT)(is_relative?mp_set_Jxyz_v:mp_set_Ixyz_v), + arg1,arg3,arg4,arg5,_cimg_mp_size(arg1)).move_to(code); + } + } + break; + } + + _ref+=7; + arg1 = arg2; + is_sth = !is_sth; + } while (!is_sth); + + if (p_ref) std::memcpy(p_ref,ref,siz_ref); + _cimg_mp_return(arg1); + } break; case 't' : @@ -20013,10 +21334,10 @@ _cimg_mp_scalar2(mp_trace,arg1,p1); } - if (!std::strncmp(ss,"transp(",7)) { // Matrix transpose - _cimg_mp_op("Function 'transp()'"); - s1 = ss7; while (s1expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); + _cimg_mp_strerr; throw CImgArgumentException("[" cimg_appname "_math_parser] " "CImg<%s>::%s: %s: Size of first argument ('%s') does not match " "second argument 'nb_cols=%u', in expression '%s%s%s'.", pixel_type(),_cimg_mp_calling_function,s_op, s_type(arg1)._data,p2, - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); } pos = vector(p3*p2); CImg::vector((ulongT)mp_transp,pos,arg1,p2,p3).move_to(code); @@ -20054,55 +21373,31 @@ _cimg_mp_scalar2(mp_u,arg1,arg2); } + if (!std::strncmp(ss,"ui2f(",5)) { // Special uint->float conversion + _cimg_mp_op("Function 'ui2f()'"); + arg1 = compile(ss5,se1,depth1,0,is_single); + if (_cimg_mp_is_vector(arg1)) _cimg_mp_vector1_v(mp_ui2f,arg1); + if (_cimg_mp_is_constant(arg1)) _cimg_mp_constant((double)cimg::uint2float((unsigned int)mem[arg1])); + _cimg_mp_scalar1(mp_ui2f,arg1); + } + if (!std::strncmp(ss,"unref(",6)) { // Un-reference variable _cimg_mp_op("Function 'unref()'"); - arg1 = ~0U; + arg1=~0U; for (s0 = ss6; s0ss6 && *s0==',') ++s0; s1 = s0; while (s1s0) { *s1 = 0; - arg2 = arg3 = ~0U; - if (s0[0]=='w' && s0[1]=='h' && !s0[2]) arg1 = reserved_label[arg3 = 0]; - else if (s0[0]=='w' && s0[1]=='h' && s0[2]=='d' && !s0[3]) arg1 = reserved_label[arg3 = 1]; - else if (s0[0]=='w' && s0[1]=='h' && s0[2]=='d' && s0[3]=='s' && !s0[4]) - arg1 = reserved_label[arg3 = 2]; - else if (s0[0]=='p' && s0[1]=='i' && !s0[2]) arg1 = reserved_label[arg3 = 3]; - else if (s0[0]=='i' && s0[1]=='m' && !s0[2]) arg1 = reserved_label[arg3 = 4]; - else if (s0[0]=='i' && s0[1]=='M' && !s0[2]) arg1 = reserved_label[arg3 = 5]; - else if (s0[0]=='i' && s0[1]=='a' && !s0[2]) arg1 = reserved_label[arg3 = 6]; - else if (s0[0]=='i' && s0[1]=='v' && !s0[2]) arg1 = reserved_label[arg3 = 7]; - else if (s0[0]=='i' && s0[1]=='s' && !s0[2]) arg1 = reserved_label[arg3 = 8]; - else if (s0[0]=='i' && s0[1]=='p' && !s0[2]) arg1 = reserved_label[arg3 = 9]; - else if (s0[0]=='i' && s0[1]=='c' && !s0[2]) arg1 = reserved_label[arg3 = 10]; - else if (s0[0]=='x' && s0[1]=='m' && !s0[2]) arg1 = reserved_label[arg3 = 11]; - else if (s0[0]=='y' && s0[1]=='m' && !s0[2]) arg1 = reserved_label[arg3 = 12]; - else if (s0[0]=='z' && s0[1]=='m' && !s0[2]) arg1 = reserved_label[arg3 = 13]; - else if (s0[0]=='c' && s0[1]=='m' && !s0[2]) arg1 = reserved_label[arg3 = 14]; - else if (s0[0]=='x' && s0[1]=='M' && !s0[2]) arg1 = reserved_label[arg3 = 15]; - else if (s0[0]=='y' && s0[1]=='M' && !s0[2]) arg1 = reserved_label[arg3 = 16]; - else if (s0[0]=='z' && s0[1]=='M' && !s0[2]) arg1 = reserved_label[arg3 = 17]; - else if (s0[0]=='c' && s0[1]=='M' && !s0[2]) arg1 = reserved_label[arg3 = 18]; - else if (s0[0]=='i' && s0[1]>='0' && s0[1]<='9' && !s0[2]) - arg1 = reserved_label[arg3 = 19 + s0[1] - '0']; - else if (!std::strcmp(s0,"interpolation")) arg1 = reserved_label[arg3 = 29]; - else if (!std::strcmp(s0,"boundary")) arg1 = reserved_label[arg3 = 30]; - else if (s0[1]) { // Multi-char variable - cimglist_for(variable_def,i) if (!std::strcmp(s0,variable_def[i])) { - arg1 = variable_pos[i]; arg2 = i; break; - } - } else arg1 = reserved_label[arg3 = *s0]; // Single-char variable - - if (arg1!=~0U) { - if (arg2==~0U) { if (arg3!=~0U) reserved_label[arg3] = ~0U; } - else { - variable_def.remove(arg2); - if (arg2::vector((ulongT)op,0,0,0).move_to(l_opcode); + p1 = ~0U; + p3 = 1; + for (s = std::strchr(ss,'(') + 1; s::vector(arg2,p2).move_to(l_opcode); + s = ns; + ++p3; + } + (l_opcode>'y').move_to(opcode); + if (p1==~0U) { pos = scalar(); p1 = 0; } else pos = vector(p1); + opcode[1] = pos; + opcode[2] = p1; + opcode[3] = opcode._height; + opcode.move_to(code); + _cimg_mp_return(pos); + } + if (!std::strncmp(ss,"vtos(",5)) { // Double(s) to string _cimg_mp_op("Function 'vtos()'"); s1 = ss5; while (s1 _expr = macro_body[l]; // Expression to be substituted - p1 = 1; // Indice of current parsed argument + p1 = 1; // Index of current parsed argument for (s = s0 + 1; s<=se1; ++p1, s = ns + 1) { // Parse function arguments while (*s && cimg::is_blank(*s)) ++s; if (*s==')' && p1==1) break; // Function has no arguments @@ -20373,10 +21745,8 @@ arg1 = 0; cimglist_for(macro_def,l) if (!std::strcmp(macro_def[l],variable_name)) sig_nargs[arg1++] = (unsigned int)macro_def[l].back(); - *se = saved_char; + _cimg_mp_strerr; cimg::strellipsize(variable_name,64); - s0 = ss - 4>expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); if (sig_nargs._width>1) { sig_nargs.sort(); arg1 = sig_nargs.back(); @@ -20387,7 +21757,7 @@ "in expression '%s%s%s'.", pixel_type(),_cimg_mp_calling_function,variable_name._data, p1,sig_nargs.value_string()._data,arg1, - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); } else throw CImgArgumentException("[" cimg_appname "_math_parser] " "CImg<%s>::%s: Function '%s()': Number of specified arguments (%u) " @@ -20395,7 +21765,7 @@ "in expression '%s%s%s'.", pixel_type(),_cimg_mp_calling_function,variable_name._data, p1,*sig_nargs,*sig_nargs!=1?"s":"", - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); } } } // if (se1==')') @@ -20414,17 +21784,15 @@ } if (!arg1) _cimg_mp_return(0); // Empty string -> 0 if (*ss=='_') { - if (arg1==1) _cimg_mp_constant(*variable_name); - *se = saved_char; + if (arg1==1) _cimg_mp_constant((unsigned char)*variable_name); + _cimg_mp_strerr; cimg::strellipsize(variable_name,64); - s0 = ss - 4>expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); throw CImgArgumentException("[" cimg_appname "_math_parser] " - "CImg<%s>::%s: %s: Literal %s contains more than one character, " + "CImg<%s>::%s: %s: Literal %s contains more than one byte, " "in expression '%s%s%s'.", pixel_type(),_cimg_mp_calling_function,s_op, ss1, - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); } pos = vector(arg1); CImg::vector((ulongT)mp_string_init,pos,arg1).move_to(l_opcode); @@ -20540,6 +21908,12 @@ arg2 = ~0U; if (*ss=='i') { + if (*ss1>='0' && *ss1<='9') { // i0#ind...i9#ind + if (!listin) _cimg_mp_return(0); + _cimg_mp_scalar7(mp_list_ixyzc,arg1,_cimg_mp_slot_x,_cimg_mp_slot_y,_cimg_mp_slot_z,*ss1 - '0', + 0,_cimg_mp_boundary); + } + if (*ss1=='c') { // ic#ind if (!listin) _cimg_mp_return(0); if (_cimg_mp_is_constant(arg1)) { @@ -20549,11 +21923,17 @@ } _cimg_mp_scalar1(mp_list_median,arg1); } - if (*ss1>='0' && *ss1<='9') { // i0#ind...i9#ind + + if (*ss1=='n') { // in#ind if (!listin) _cimg_mp_return(0); - _cimg_mp_scalar7(mp_list_ixyzc,arg1,_cimg_mp_slot_x,_cimg_mp_slot_y,_cimg_mp_slot_z,*ss1 - '0', - 0,_cimg_mp_boundary); + if (_cimg_mp_is_constant(arg1)) { + if (!list_norm) list_norm.assign(listin._width); + if (!list_norm[p1]) CImg::vector(listin[p1].magnitude()).move_to(list_norm[p1]); + _cimg_mp_constant(*list_norm[p1]); + } + _cimg_mp_scalar1(mp_list_norm,arg1); } + switch (*ss1) { case 'm' : arg2 = 0; break; // im#ind case 'M' : arg2 = 1; break; // iM#ind @@ -20603,37 +21983,36 @@ if (!std::strcmp(ss,"boundary")) _cimg_mp_return(_cimg_mp_boundary); // boundary // No known item found, assuming this is an already initialized variable. - variable_name.assign(ss,(unsigned int)(se - ss + 1)).back() = 0; - if (variable_name[1]) { // Multi-char variable - cimglist_for(variable_def,i) if (!std::strcmp(variable_name,variable_def[i])) - _cimg_mp_return(variable_pos[i]); - } else if (reserved_label[*variable_name]!=~0U) // Single-char variable - _cimg_mp_return(reserved_label[*variable_name]); - - // Reached an unknown item -> error. - is_sth = true; // is_valid_variable_name + variable_name.assign(ss,(unsigned int)(se + 1 - ss)).back() = 0; + is_sth = true; // is_valid_variable_name? if (*variable_name>='0' && *variable_name<='9') is_sth = false; - else for (ns = variable_name._data; *ns; ++ns) + else for (ns = variable_name; *ns; ++ns) if (!is_varchar(*ns)) { is_sth = false; break; } + if (is_sth) { + if (variable_name[1]) { // Multi-char variable + cimglist_for(variable_def,i) if (!std::strcmp(variable_name,variable_def[i])) + _cimg_mp_return(variable_pos[i]); + } else if (reserved_label[(int)*variable_name]!=~0U) // Single-char variable + _cimg_mp_return(reserved_label[(int)*variable_name]); + } - *se = saved_char; + // Reached an unknown item -> error. c1 = *se1; + _cimg_mp_strerr; cimg::strellipsize(variable_name,64); - s0 = ss - 4>expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); if (is_sth) throw CImgArgumentException("[" cimg_appname "_math_parser] " "CImg<%s>::%s: Undefined variable '%s' in expression '%s%s%s'.", pixel_type(),_cimg_mp_calling_function, variable_name._data, - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); s1 = std::strchr(ss,'('); s_op = s1 && c1==')'?"function call":"item"; throw CImgArgumentException("[" cimg_appname "_math_parser] " "CImg<%s>::%s: Unrecognized %s '%s' in expression '%s%s%s'.", pixel_type(),_cimg_mp_calling_function, s_op,variable_name._data, - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); } // Evaluation procedure. @@ -20663,9 +22042,44 @@ } else *output = (t)*result; } - // Evaluation procedure for the end() blocks. + // Evaluation procedure for begin_t() bloc. + void begin_t() { + if (!code_begin_t) return; + if (imgin) { + mem[_cimg_mp_slot_x] = imgin._width - 1.; + mem[_cimg_mp_slot_y] = imgin._height - 1.; + mem[_cimg_mp_slot_z] = imgin._depth - 1.; + mem[_cimg_mp_slot_c] = imgin._spectrum - 1.; + } else mem[_cimg_mp_slot_x] = mem[_cimg_mp_slot_y] = mem[_cimg_mp_slot_z] = mem[_cimg_mp_slot_c] = 0; + p_code_end = code_begin_t.end(); + for (p_code = code_begin_t; p_code_data; + const ulongT target = opcode[1]; + mem[target] = _cimg_mp_defunc(*this); + } + p_code_end = code.end(); + } + + // Evaluation procedure for end_t() bloc. + void end_t() { + if (!code_end_t) return; + if (imgin) { + mem[_cimg_mp_slot_x] = imgin._width - 1.; + mem[_cimg_mp_slot_y] = imgin._height - 1.; + mem[_cimg_mp_slot_z] = imgin._depth - 1.; + mem[_cimg_mp_slot_c] = imgin._spectrum - 1.; + } else mem[_cimg_mp_slot_x] = mem[_cimg_mp_slot_y] = mem[_cimg_mp_slot_z] = mem[_cimg_mp_slot_c] = 0; + p_code_end = code_end_t.end(); + for (p_code = code_end_t; p_code_data; + const ulongT target = opcode[1]; + mem[target] = _cimg_mp_defunc(*this); + } + } + + // Evaluation procedure the end() bloc. void end() { - if (code_end.is_empty()) return; + if (!code_end) return; if (imgin) { mem[_cimg_mp_slot_x] = imgin._width - 1.; mem[_cimg_mp_slot_y] = imgin._height - 1.; @@ -20680,24 +22094,344 @@ } } - // Return type of a memory element as a string. - CImg s_type(const unsigned int arg) const { - CImg res; - if (_cimg_mp_is_vector(arg)) { // Vector - CImg::string("vectorXXXXXXXXXXXXXXXX").move_to(res); - cimg_sprintf(res._data + 6,"%u",_cimg_mp_size(arg)); - } else CImg::string("scalar").move_to(res); - return res; + // Merge inter-thread variables. + // (argument 'mp' is the master instance). + void merge(_cimg_math_parser& mp) { + if (&mp==this) return; + cimg_rofY(mp.memmerge,k) { + const unsigned int + pos = (unsigned int)mp.memmerge(0,k), + siz = (unsigned int)mp.memmerge(1,k), + iop = (unsigned int)mp.memmerge(2,k); + if (!siz) switch (iop) { // Scalar value + case 0 : mp.mem[pos] = mem[pos]; break; // Assignment + case 1 : mp.mem[pos]+=mem[pos]; break; // Operator+ + case 2 : mp.mem[pos]-=mem[pos]; break; // Operator- + case 3 : mp.mem[pos]*=mem[pos]; break; // Operator* + case 4 : mp.mem[pos]/=mem[pos]; break; // Operator/ + case 5 : mp.mem[pos] = std::min(mp.mem[pos],mem[pos]); break; // Operator 'min' + case 6 : mp.mem[pos] = std::max(mp.mem[pos],mem[pos]); break; // Operator 'max' + } else switch (iop) { // Vector value + case 0 : + CImg(&mp.mem[pos + 1],siz,1,1,1,true) = CImg(&mem[pos + 1],siz,1,1,1,true); + break; + case 1 : + CImg(&mp.mem[pos + 1],siz,1,1,1,true)+=CImg(&mem[pos + 1],siz,1,1,1,true); + break; + case 2 : + CImg(&mp.mem[pos + 1],siz,1,1,1,true)-=CImg(&mem[pos + 1],siz,1,1,1,true); + break; + case 3 : + CImg(&mp.mem[pos + 1],siz,1,1,1,true)*=CImg(&mem[pos + 1],siz,1,1,1,true); + break; + case 4 : + CImg(&mp.mem[pos + 1],siz,1,1,1,true)/=CImg(&mem[pos + 1],siz,1,1,1,true); + break; + case 5 : + CImg(&mp.mem[pos + 1],siz,1,1,1,true).min(CImg(&mem[pos + 1],siz,1,1,1,true)); + break; + case 6 : + CImg(&mp.mem[pos + 1],siz,1,1,1,true).max(CImg(&mem[pos + 1],siz,1,1,1,true)); + break; + } + } } - // Insert constant value in memory. - unsigned int constant(const double val) { + // Return specified argument number as a string. + static const char *s_argth(const unsigned int n_arg) { + const char + *_s_arg[] = { "", "First", "Second", "Third", "Fourth", "Fifth", "Sixth", "Seventh", "Eighth","Ninth", + "10th", "11th", "12th", "13th", "14th", "15th", "16th", "17th", "18th", "19th", + "20th", "21st", "22nd", "23rd", "24th", "25th", "26th", "27th", "28th", "One of the" }; + return _s_arg[n_arg::is_nan(val)) return _cimg_mp_slot_nan; - if (val==(double)(int)val) { - if (val>=0 && val<=10) return (unsigned int)val; - if (val<0 && val>=-5) return (unsigned int)(10 - val); + // Return a string that defines the calling function + the user-defined function scope. + CImg s_calling_function() const { + CImg res; + const unsigned int + l1 = calling_function?(unsigned int)std::strlen(calling_function):0U, + l2 = user_macro?(unsigned int)std::strlen(user_macro):0U; + if (l2) { + res.assign(l1 + l2 + 48); + cimg_snprintf(res,res._width,"%s(): When substituting function '%s()'",calling_function,user_macro); + } else { + res.assign(l1 + l2 + 4); + cimg_snprintf(res,res._width,"%s()",calling_function); + } + return res; + } + + // Return type of a memory element as a string. + CImg s_type(const unsigned int arg) const { + CImg res; + if (_cimg_mp_is_vector(arg)) { // Vector + CImg::string("vectorXXXXXXXXXXXXXXXX").move_to(res); + cimg_sprintf(res._data + 6,"%u",_cimg_mp_size(arg)); + } else CImg::string("scalar").move_to(res); + return res; + } + + // Count parentheses/brackets level of each character of the expression. + CImg get_level(CImg& _expr) const { + bool is_escaped = false, next_is_escaped = false; + unsigned int mode = 0, next_mode = 0; // { 0=normal | 1=char-string | 2=vector-string + CImg res(_expr._width - 1); + unsigned int *pd = res._data; + int _level = 0; + for (const char *ps = _expr._data; *ps && _level>=0; ++ps) { + if (!is_escaped && !next_is_escaped && *ps=='\\') next_is_escaped = true; + if (!is_escaped && *ps=='\'') { // Non-escaped character + if (!mode && ps>_expr._data && *(ps - 1)=='[') next_mode = mode = 2; // Start vector-string + else if (mode==2 && *(ps + 1)==']') next_mode = !mode; // End vector-string + else if (mode<2) next_mode = mode?(mode = 0):1; // Start/end char-string + } + *(pd++) = (unsigned int)(mode>=1 || is_escaped?_level + (mode==1): + *ps=='(' || *ps=='['?_level++: + *ps==')' || *ps==']'?--_level: + _level); + mode = next_mode; + is_escaped = next_is_escaped; + next_is_escaped = false; + } + if (mode) { + cimg::strellipsize(_expr,64); + throw CImgArgumentException("[" cimg_appname "_math_parser] " + "CImg<%s>::%s: Unterminated string literal, in expression '%s'.", + pixel_type(),_cimg_mp_calling_function, + _expr._data); + } + if (_level) { + cimg::strellipsize(_expr,64); + throw CImgArgumentException("[" cimg_appname "_math_parser] " + "CImg<%s>::%s: Unbalanced parentheses/brackets, in expression '%s'.", + pixel_type(),_cimg_mp_calling_function, + _expr._data); + } + return res; + } + + // Find and return index of current image 'imgin' within image list 'listin'. + unsigned int get_mem_img_index() { + if (mem_img_index==~0U) { + if (&imgout>listout.data() && &imgout='0' && c2<='9') rp = 20 + c2 - '0'; // i0...i9 + else if (c2=='m') rp = 4; // im + else if (c2=='M') rp = 5; // iM + else if (c2=='a') rp = 6; // ia + else if (c2=='v') rp = 7; // iv + else if (c2=='s') rp = 8; // is + else if (c2=='p') rp = 9; // ip + else if (c2=='c') rp = 10; // ic + } else if (c2=='m') { + if (c1=='x') rp = 12; // xm + else if (c1=='y') rp = 13; // ym + else if (c1=='z') rp = 14; // zm + else if (c1=='c') rp = 15; // cm + } else if (c2=='M') { + if (c1=='x') rp = 16; // xM + else if (c1=='y') rp = 17; // yM + else if (c1=='z') rp = 18; // zM + else if (c1=='c') rp = 19; // cM + } + } else if (variable_name[1] && variable_name[2] && !variable_name[3]) { // Three-chars variable + c1 = variable_name[0]; + c2 = variable_name[1]; + c3 = variable_name[2]; + if (c1=='w' && c2=='h' && c3=='d') rp = 1; // whd + } else if (variable_name[1] && variable_name[2] && variable_name[3] && + !variable_name[4]) { // Four-chars variable + c1 = variable_name[0]; + c2 = variable_name[1]; + c3 = variable_name[2]; + c4 = variable_name[3]; + if (c1=='w' && c2=='h' && c3=='d' && c4=='s') rp = 2; // whds + } else if (!std::strcmp(variable_name,"interpolation")) rp = 30; // interpolation + else if (!std::strcmp(variable_name,"boundary")) rp = 31; // boundary + + if (rp!=~0U) { rpos = rp; return; } // One of the reserved labels + + // Multi-char variable name : check for existing variable with same name + cimglist_for(variable_def,i) + if (!std::strcmp(variable_name,variable_def[i])) { pos = i; break; } + } + + // Tell for each character of an expression if it is inside a string or not. + CImg is_inside_string(CImg& _expr) const { + bool is_escaped = false, next_is_escaped = false; + unsigned int mode = 0, next_mode = 0; // { 0=normal | 1=char-string | 2=vector-string + CImg res = CImg::string(_expr); + bool *pd = res._data; + for (const char *ps = _expr._data; *ps; ++ps) { + if (!next_is_escaped && *ps=='\\') next_is_escaped = true; + if (!is_escaped && *ps=='\'') { // Non-escaped character + if (!mode && ps>_expr._data && *(ps - 1)=='[') next_mode = mode = 2; // Start vector-string + else if (mode==2 && *(ps + 1)==']') next_mode = !mode; // End vector-string + else if (mode<2) next_mode = mode?(mode = 0):1; // Start/end char-string + } + *(pd++) = mode>=1 || is_escaped; + mode = next_mode; + is_escaped = next_is_escaped; + next_is_escaped = false; + } + return res; + } + + // Return true if specified argument can be a part of an allowed variable name. + bool is_varchar(const char c) const { + return (c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9') || c=='_'; + } + + // Return true if all values of a vector are computation values. + bool is_comp_vector(const unsigned int arg) const { + unsigned int siz = _cimg_mp_size(arg); + if (siz>8) return false; + const int *ptr = memtype.data(arg + 1); + bool is_tmp = true; + while (siz-->0) if (*(ptr++)) { is_tmp = false; break; } + return is_tmp; + } + + // Check if a memory slot is a positive integer constant scalar value. + // 'mode' can be: + // { 0=constant | 1=integer constant | 2=positive integer constant | 3=strictly-positive integer constant } + void check_constant(const unsigned int arg, const unsigned int n_arg, + const unsigned int mode, + char *const ss, char *const se, const char saved_char) { + _cimg_mp_check_type(arg,n_arg,1,0); + if (!(_cimg_mp_is_constant(arg) && + (!mode || (double)(int)mem[arg]==mem[arg]) && + (mode<2 || mem[arg]>=(mode==3)))) { + const char *const s_arg = s_argth(n_arg); + char *s0; _cimg_mp_strerr; + throw CImgArgumentException("[" cimg_appname "_math_parser] " + "CImg<%s>::%s: %s%s %s%s (of type '%s') is not a%s constant, " + "in expression '%s%s%s'.", + pixel_type(),_cimg_mp_calling_function,s_op,*s_op?":":"", + s_arg,*s_arg?" argument":" Argument",s_type(arg)._data, + !mode?"":mode==1?"n integer": + mode==2?" positive integer":" strictly positive integer", + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); + } + } + + // Check if an image index is a constant value. + void check_constant_index(const unsigned int arg, + char *const ss, char *const se, const char saved_char) { + if (arg!=~0U && !_cimg_mp_is_constant(arg)) { + char *s0; _cimg_mp_strerr; + throw CImgArgumentException("[" cimg_appname "_math_parser] " + "CImg<%s>::%s: %s%s Specified image index is not a constant, " + "in expression '%s%s%s'.", + pixel_type(),_cimg_mp_calling_function,s_op,*s_op?":":"", + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); + } + } + + // Check a matrix is square. + void check_matrix_square(const unsigned int arg, const unsigned int n_arg, + char *const ss, char *const se, const char saved_char) { + _cimg_mp_check_type(arg,n_arg,2,0); + const unsigned int + siz = _cimg_mp_size(arg), + n = (unsigned int)cimg::round(std::sqrt((float)siz)); + if (n*n!=siz) { + const char *s_arg; + if (*s_op!='F') s_arg = !n_arg?"":n_arg==1?"Left-hand":"Right-hand"; + else s_arg = !n_arg?"":n_arg==1?"First":n_arg==2?"Second":n_arg==3?"Third":"One"; + char *s0; _cimg_mp_strerr; + throw CImgArgumentException("[" cimg_appname "_math_parser] " + "CImg<%s>::%s: %s%s %s%s (of type '%s') " + "cannot be considered as a square matrix, in expression '%s%s%s'.", + pixel_type(),_cimg_mp_calling_function,s_op,*s_op?":":"", + s_arg,*s_op=='F'?(*s_arg?" argument":" Argument"):(*s_arg?" operand":" Operand"), + s_type(arg)._data, + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); + } + } + + // Check type compatibility for one argument. + // Bits of 'mode' tells what types are allowed: + // { 1 = scalar | 2 = vectorN }. + // If 'N' is not zero, it also restricts the vectors to be of size N only. + void check_type(const unsigned int arg, const unsigned int n_arg, + const unsigned int mode, const unsigned int N, + char *const ss, char *const se, const char saved_char) { + const bool + is_scalar = _cimg_mp_is_scalar(arg), + is_vector = _cimg_mp_is_vector(arg) && (!N || _cimg_mp_size(arg)==N); + bool cond = false; + if (mode&1) cond|=is_scalar; + if (mode&2) cond|=is_vector; + if (!cond) { + const char *s_arg; + if (*s_op!='F') s_arg = !n_arg?"":n_arg==1?"Left-hand":"Right-hand"; + else s_arg = s_argth(n_arg); + CImg sb_type(32); + if (mode==1) cimg_snprintf(sb_type,sb_type._width,"'scalar'"); + else if (mode==2) { + if (N) cimg_snprintf(sb_type,sb_type._width,"'vector%u'",N); + else cimg_snprintf(sb_type,sb_type._width,"'vector'"); + } else { + if (N) cimg_snprintf(sb_type,sb_type._width,"'scalar' or 'vector%u'",N); + else cimg_snprintf(sb_type,sb_type._width,"'scalar' or 'vector'"); + } + char *s0; _cimg_mp_strerr; + throw CImgArgumentException("[" cimg_appname "_math_parser] " + "CImg<%s>::%s: %s%s %s%s has invalid type '%s' (should be %s), " + "in expression '%s%s%s'.", + pixel_type(),_cimg_mp_calling_function,s_op,*s_op?":":"", + s_arg,*s_op=='F'?(*s_arg?" argument":" Argument"):(*s_arg?" operand":" Operand"), + s_type(arg)._data,sb_type._data, + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); + } + } + + // Check that listin or listout are not empty. + void check_list(const bool is_out, + char *const ss, char *const se, const char saved_char) { + if ((!is_out && !listin) || (is_out && !listout)) { + char *s0; _cimg_mp_strerr; + throw CImgArgumentException("[" cimg_appname "_math_parser] " + "CImg<%s>::%s: %s%s Invalid call with an empty image list, " + "in expression '%s%s%s'.", + pixel_type(),_cimg_mp_calling_function,s_op,*s_op?":":"", + s0>expr._data?"...":"",s0,se<&expr.back()?"...":""); + } + } + + // Insert constant value in memory. + unsigned int constant(const double val) { + + // Search for built-in constant. + if (cimg::type::is_nan(val)) return _cimg_mp_slot_nan; + if (val==(double)(int)val) { + if (val>=0 && val<=10) return (unsigned int)val; + if (val<0 && val>=-5) return (unsigned int)(10 - val); } if (val==0.5) return 16; @@ -20753,12 +22487,49 @@ return pos; } - // Insert code instructions for processing scalars. - unsigned int scalar() { // Insert new scalar in memory + // Insert new scalar in memory. + unsigned int scalar() { if (mempos>=mem._width) { mem.resize(-200,1,1,1,0); memtype.resize(mem._width,1,1,1,0); } return mempos++; } + // Insert new vector of specified size in memory. + unsigned int vector(const unsigned int siz) { + if (mempos + siz>=mem._width) { + mem.resize(2*mem._width + siz,1,1,1,0); + memtype.resize(mem._width,1,1,1,0); + } + const unsigned int pos = mempos++; + mem[pos] = cimg::type::nan(); + memtype[pos] = siz + 1; + mempos+=siz; + return pos; + } + + // Insert new initialized vector. + unsigned int vector(const unsigned int siz, const double value) { + const unsigned int pos = vector(siz); + double *ptr = &mem[pos] + 1; + for (unsigned int i = 0; i::vector((ulongT)mp_vector_copy,pos,arg,siz).move_to(code); + return pos; + } + + // Set variable status to all values of a vector. + void set_variable_vector(const unsigned int arg) { + unsigned int siz = _cimg_mp_size(arg); + int *ptr = memtype.data(arg + 1); + while (siz-->0) *(ptr++) = -1; + } + unsigned int scalar0(const mp_func op) { const unsigned int pos = scalar(); CImg::vector((ulongT)op,pos).move_to(code); @@ -20845,70 +22616,6 @@ return pos; } - // Return a string that defines the calling function + the user-defined function scope. - CImg calling_function_s() const { - CImg res; - const unsigned int - l1 = calling_function?(unsigned int)std::strlen(calling_function):0U, - l2 = user_macro?(unsigned int)std::strlen(user_macro):0U; - if (l2) { - res.assign(l1 + l2 + 48); - cimg_snprintf(res,res._width,"%s(): When substituting function '%s()'",calling_function,user_macro); - } else { - res.assign(l1 + l2 + 4); - cimg_snprintf(res,res._width,"%s()",calling_function); - } - return res; - } - - // Return true if specified argument can be a part of an allowed variable name. - bool is_varchar(const char c) const { - return (c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9') || c=='_'; - } - - // Insert code instructions for processing vectors. - bool is_comp_vector(const unsigned int arg) const { - unsigned int siz = _cimg_mp_size(arg); - if (siz>8) return false; - const int *ptr = memtype.data(arg + 1); - bool is_tmp = true; - while (siz-->0) if (*(ptr++)) { is_tmp = false; break; } - return is_tmp; - } - - void set_variable_vector(const unsigned int arg) { - unsigned int siz = _cimg_mp_size(arg); - int *ptr = memtype.data(arg + 1); - while (siz-->0) *(ptr++) = -1; - } - - unsigned int vector(const unsigned int siz) { // Insert new vector of specified size in memory - if (mempos + siz>=mem._width) { - mem.resize(2*mem._width + siz,1,1,1,0); - memtype.resize(mem._width,1,1,1,0); - } - const unsigned int pos = mempos++; - mem[pos] = cimg::type::nan(); - memtype[pos] = siz + 1; - mempos+=siz; - return pos; - } - - unsigned int vector(const unsigned int siz, const double value) { // Insert new initialized vector - const unsigned int pos = vector(siz); - double *ptr = &mem[pos] + 1; - for (unsigned int i = 0; i::vector((ulongT)mp_vector_copy,pos,arg,siz).move_to(code); - return pos; - } - void self_vector_s(const unsigned int pos, const mp_func op, const unsigned int arg1) { const unsigned int siz = _cimg_mp_size(pos); if (siz>24) CImg::vector((ulongT)mp_self_map_vector_s,pos,siz,(ulongT)op,arg1).move_to(code); @@ -20995,113 +22702,6 @@ return pos; } - // Check if a memory slot is a positive integer constant scalar value. - // 'mode' can be: - // { 0=constant | 1=integer constant | 2=positive integer constant | 3=strictly-positive integer constant } - void check_constant(const unsigned int arg, const unsigned int n_arg, - const unsigned int mode, - char *const ss, char *const se, const char saved_char) { - _cimg_mp_check_type(arg,n_arg,1,0); - if (!(_cimg_mp_is_constant(arg) && - (!mode || (double)(int)mem[arg]==mem[arg]) && - (mode<2 || mem[arg]>=(mode==3)))) { - const char *s_arg = !n_arg?"":n_arg==1?"First ":n_arg==2?"Second ":n_arg==3?"Third ": - n_arg==4?"Fourth ":n_arg==5?"Fifth ":n_arg==6?"Sixth ":n_arg==7?"Seventh ":n_arg==8?"Eighth ": - n_arg==9?"Ninth ":"One of the "; - *se = saved_char; - char *const s0 = ss - 4>expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); - throw CImgArgumentException("[" cimg_appname "_math_parser] " - "CImg<%s>::%s: %s%s %s%s (of type '%s') is not a%s constant, " - "in expression '%s%s%s'.", - pixel_type(),_cimg_mp_calling_function,s_op,*s_op?":":"", - s_arg,*s_arg?"argument":"Argument",s_type(arg)._data, - !mode?"":mode==1?"n integer": - mode==2?" positive integer":" strictly positive integer", - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); - } - } - - // Check a matrix is square. - void check_matrix_square(const unsigned int arg, const unsigned int n_arg, - char *const ss, char *const se, const char saved_char) { - _cimg_mp_check_type(arg,n_arg,2,0); - const unsigned int - siz = _cimg_mp_size(arg), - n = (unsigned int)cimg::round(std::sqrt((float)siz)); - if (n*n!=siz) { - const char *s_arg; - if (*s_op!='F') s_arg = !n_arg?"":n_arg==1?"Left-hand ":"Right-hand "; - else s_arg = !n_arg?"":n_arg==1?"First ":n_arg==2?"Second ":n_arg==3?"Third ":"One "; - *se = saved_char; - char *const s0 = ss - 4>expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); - throw CImgArgumentException("[" cimg_appname "_math_parser] " - "CImg<%s>::%s: %s%s %s%s (of type '%s') " - "cannot be considered as a square matrix, in expression '%s%s%s'.", - pixel_type(),_cimg_mp_calling_function,s_op,*s_op?":":"", - s_arg,*s_op=='F'?(*s_arg?"argument":"Argument"):(*s_arg?"operand":"Operand"), - s_type(arg)._data, - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); - } - } - - // Check type compatibility for one argument. - // Bits of 'mode' tells what types are allowed: - // { 1 = scalar | 2 = vectorN }. - // If 'N' is not zero, it also restricts the vectors to be of size N only. - void check_type(const unsigned int arg, const unsigned int n_arg, - const unsigned int mode, const unsigned int N, - char *const ss, char *const se, const char saved_char) { - const bool - is_scalar = _cimg_mp_is_scalar(arg), - is_vector = _cimg_mp_is_vector(arg) && (!N || _cimg_mp_size(arg)==N); - bool cond = false; - if (mode&1) cond|=is_scalar; - if (mode&2) cond|=is_vector; - if (!cond) { - const char *s_arg; - if (*s_op!='F') s_arg = !n_arg?"":n_arg==1?"Left-hand ":"Right-hand "; - else s_arg = !n_arg?"":n_arg==1?"First ":n_arg==2?"Second ":n_arg==3?"Third ": - n_arg==4?"Fourth ":n_arg==5?"Fifth ":n_arg==6?"Sixth ":n_arg==7?"Seventh ":n_arg==8?"Eighth": - n_arg==9?"Ninth":"One of the "; - CImg sb_type(32); - if (mode==1) cimg_snprintf(sb_type,sb_type._width,"'scalar'"); - else if (mode==2) { - if (N) cimg_snprintf(sb_type,sb_type._width,"'vector%u'",N); - else cimg_snprintf(sb_type,sb_type._width,"'vector'"); - } else { - if (N) cimg_snprintf(sb_type,sb_type._width,"'scalar' or 'vector%u'",N); - else cimg_snprintf(sb_type,sb_type._width,"'scalar' or 'vector'"); - } - *se = saved_char; - char *const s0 = ss - 4>expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); - throw CImgArgumentException("[" cimg_appname "_math_parser] " - "CImg<%s>::%s: %s%s %s%s has invalid type '%s' (should be %s), " - "in expression '%s%s%s'.", - pixel_type(),_cimg_mp_calling_function,s_op,*s_op?":":"", - s_arg,*s_op=='F'?(*s_arg?"argument":"Argument"):(*s_arg?"operand":"Operand"), - s_type(arg)._data,sb_type._data, - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); - } - } - - // Check that listin or listout are not empty. - void check_list(const bool is_out, - char *const ss, char *const se, const char saved_char) { - if ((!is_out && !listin) || (is_out && !listout)) { - *se = saved_char; - char *const s0 = ss - 4>expr._data?ss - 4:expr._data; - cimg::strellipsize(s0,64); - throw CImgArgumentException("[" cimg_appname "_math_parser] " - "CImg<%s>::%s: %s%s Invalid call with an empty image list, " - "in expression '%s%s%s'.", - pixel_type(),_cimg_mp_calling_function,s_op,*s_op?":":"", - s0!=expr._data?"...":"",s0,se<&expr.back()?"...":""); - } - } - // Evaluation functions, known by the parser. // Defining these functions 'static' ensures that sizeof(mp_func)==sizeof(ulongT), // so we can store pointers to them directly in the opcode vectors. @@ -21153,7 +22753,7 @@ const unsigned int i_end = (unsigned int)mp.opcode[2]; const double val = mp_kth(mp); for (unsigned int i = 4; iabsval) { val = _val; absval = _absval; argval = i - 3; } + } + return (double)argval; + } + static double mp_asin(_cimg_math_parser& mp) { return std::asin(_mp_arg(2)); } @@ -21239,27 +22861,30 @@ return cimg::type::nan(); } - static double mp_cats(_cimg_math_parser& mp) { - const double *ptrd = &_mp_arg(1) + 1; - const unsigned int - sizd = (unsigned int)mp.opcode[2], - nb_args = (unsigned int)(mp.opcode[3] - 4)/2; +#ifdef cimg_mp_func_run + static double mp_run(_cimg_math_parser& mp) { + const unsigned int nb_args = (unsigned int)(mp.opcode[2] - 3)/2; CImgList _str; + CImg it; for (unsigned int n = 0; n string + const double *ptr = &_mp_arg(3 + 2*n) + 1; unsigned int l = 0; - while (l(ptrs,l,1,1,1,true).move_to(_str); - } else CImg::vector((char)_mp_arg(4 + 2*n)).move_to(_str); // Scalar argument + while (l(ptr,l,1,1,1,true).move_to(_str); + } else { // Scalar argument -> number + it.assign(24); + cimg_snprintf(it,it._width,"%.17g",_mp_arg(3 + 2*n)); + CImg::string(it,false,true).move_to(_str); + } } CImg(1,1,1,1,0).move_to(_str); - const CImg str = _str>'x'; - const unsigned int l = std::min(str._width,sizd); - CImg(ptrd,l,1,1,1,true) = str.get_shared_points(0,l - 1); + CImg str = _str>'x'; + cimg_mp_func_run(str._data); return cimg::type::nan(); } +#endif static double mp_cbrt(_cimg_math_parser& mp) { return cimg::cbrt(_mp_arg(2)); @@ -21391,12 +23016,123 @@ return cimg::type::nan(); } + static double mp_complex_cos(_cimg_math_parser& mp) { + double *ptrd = &_mp_arg(1) + 1; + const double *ptrs = &_mp_arg(2) + 1, r = *(ptrs++), i = *(ptrs); + *(ptrd++) = std::cos(r)*std::cosh(i); + *(ptrd++) = -std::sin(r)*std::sinh(i); + return cimg::type::nan(); + } + + static double mp_complex_sin(_cimg_math_parser& mp) { + double *ptrd = &_mp_arg(1) + 1; + const double *ptrs = &_mp_arg(2) + 1, r = *(ptrs++), i = *(ptrs); + *(ptrd++) = std::sin(r)*std::cosh(i); + *(ptrd++) = std::cos(r)*std::sinh(i); + return cimg::type::nan(); + } + + static double mp_complex_tan(_cimg_math_parser& mp) { + double *ptrd = &_mp_arg(1) + 1; + const double *ptrs = &_mp_arg(2) + 1, r = *(ptrs++), i = *(ptrs), + denom = std::cos(2*r) + std::cosh(2*i); + *(ptrd++) = std::sin(2*r)/denom; + *(ptrd++) = std::sinh(2*i)/denom; + return cimg::type::nan(); + } + + static double mp_complex_cosh(_cimg_math_parser& mp) { + double *ptrd = &_mp_arg(1) + 1; + const double *ptrs = &_mp_arg(2) + 1, r = *(ptrs++), i = *(ptrs); + *(ptrd++) = std::cosh(r)*std::cos(i); + *(ptrd++) = std::sinh(r)*std::sin(i); + return cimg::type::nan(); + } + + static double mp_complex_sinh(_cimg_math_parser& mp) { + double *ptrd = &_mp_arg(1) + 1; + const double *ptrs = &_mp_arg(2) + 1, r = *(ptrs++), i = *(ptrs); + *(ptrd++) = std::sinh(r)*std::cos(i); + *(ptrd++) = std::cosh(r)*std::sin(i); + return cimg::type::nan(); + } + + static double mp_complex_tanh(_cimg_math_parser& mp) { + double *ptrd = &_mp_arg(1) + 1; + const double *ptrs = &_mp_arg(2) + 1, r = *(ptrs++), i = *(ptrs), + denom = std::cosh(2*r) + std::cos(2*i); + *(ptrd++) = std::sinh(2*r)/denom; + *(ptrd++) = std::sin(2*i)/denom; + return cimg::type::nan(); + } + static double mp_continue(_cimg_math_parser& mp) { mp.break_type = 2; mp.p_code = mp.p_break - 1; return cimg::type::nan(); } + static double mp_convolve(_cimg_math_parser &mp) { + return _mp_correlate(mp,true); + } + + static double mp_correlate(_cimg_math_parser &mp) { + return _mp_correlate(mp,false); + } + + static double _mp_correlate(_cimg_math_parser &mp, bool is_convolve) { + double *ptrd = &_mp_arg(1) + 1; + const double *const ptrA = &_mp_arg(2) + 1, *const ptrM = &_mp_arg(7) + 1; + const unsigned int + wA = (unsigned int)mp.opcode[3], + hA = (unsigned int)mp.opcode[4], + dA = (unsigned int)mp.opcode[5], + sA = (unsigned int)mp.opcode[6], + wM = (unsigned int)mp.opcode[8], + hM = (unsigned int)mp.opcode[9], + dM = (unsigned int)mp.opcode[10], + sM = (unsigned int)mp.opcode[11], + boundary_conditions = (unsigned int)_mp_arg(12), + channel_mode = (unsigned int)mp.opcode[14], + xcenter = (unsigned int)_mp_arg(15), + ycenter = (unsigned int)_mp_arg(16), + zcenter = (unsigned int)_mp_arg(17), + xstart = (unsigned int)mp.opcode[18], + ystart = (unsigned int)mp.opcode[19], + zstart = (unsigned int)mp.opcode[20], + xend = (unsigned int)mp.opcode[21], + yend = (unsigned int)mp.opcode[22], + zend = (unsigned int)mp.opcode[23]; + const bool + is_normalized = (bool)_mp_arg(13); + const float + xstride = (float)_mp_arg(24), + ystride = (float)_mp_arg(25), + zstride = (float)_mp_arg(26), + xdilation = (float)_mp_arg(27), + ydilation = (float)_mp_arg(28), + zdilation = (float)_mp_arg(29); + CImg res; + if (is_convolve) res = CImg(ptrA,wA,hA,dA,sA,true). + get_convolve(CImg(ptrM,wM,hM,dM,sM,true), + boundary_conditions,is_normalized,channel_mode, + xcenter,ycenter,zcenter, + xstart,ystart,zstart, + xend,yend,zend, + xstride,ystride,zstride, + xdilation,ydilation,zdilation); + else res = CImg(ptrA,wA,hA,dA,sA,true). + get_correlate(CImg(ptrM,wM,hM,dM,sM,true), + boundary_conditions,is_normalized,channel_mode, + xcenter,ycenter,zcenter, + xstart,ystart,zstart, + xend,yend,zend, + xstride,ystride,zstride, + xdilation,ydilation,zdilation); + CImg(ptrd,res._width,res._height,res._depth,res._spectrum,true) = res; + return cimg::type::nan(); + } + static double mp_cos(_cimg_math_parser& mp) { return std::cos(_mp_arg(2)); } @@ -21406,7 +23142,7 @@ } static double mp_critical(_cimg_math_parser& mp) { - const double res = _mp_arg(1); + const ulongT g_target = mp.opcode[1]; cimg_pragma_openmp(critical(mp_critical)) { for (const CImg *const p_end = ++mp.p_code + mp.opcode[2]; @@ -21417,7 +23153,7 @@ } } --mp.p_code; - return res; + return mp.mem[g_target]; } static double mp_crop(_cimg_math_parser& mp) { @@ -21456,31 +23192,42 @@ static double mp_date(_cimg_math_parser& mp) { const unsigned int - _arg = (unsigned int)mp.opcode[3], - _siz = (unsigned int)mp.opcode[4], - siz = _siz?_siz:1; - const double *const arg_in = _arg==~0U?0:&_mp_arg(3) + (_siz?1:0); - double *const arg_out = &_mp_arg(1) + (_siz?1:0); - if (arg_in) std::memcpy(arg_out,arg_in,siz*sizeof(double)); - else for (unsigned int i = 0; i filename(mp.opcode[2] - 5); - if (filename) { - const ulongT *ptrs = mp.opcode._data + 5; - cimg_for(filename,ptrd,char) *ptrd = (char)*(ptrs++); - cimg::fdate(filename,arg_out,siz); - } else cimg::date(arg_out,siz); - return _siz?cimg::type::nan():*arg_out; + if (!ptr_arg2) { // No filename specified + if (!siz_arg1) return cimg::date((unsigned int)*ptr_arg1); + if (siz_arg1==~0U) for (unsigned int k = 0; k::nan(); + } + + // Filename specified. + CImg ss(siz_arg2 + 1); + cimg_forX(ss,i) ss[i] = (char)ptr_arg2[i]; + ss.back() = 0; + if (!siz_arg1) return cimg::fdate(ss,(unsigned int)*ptr_arg1); + for (unsigned int k = 0; k::nan(); } static double mp_debug(_cimg_math_parser& mp) { CImg expr(mp.opcode[2] - 4); - const ulongT *ptrs = mp.opcode._data + 4; - cimg_for(expr,ptrd,char) *ptrd = (char)*(ptrs++); + { + const ulongT *ptrs = mp.opcode._data + 4; + cimg_for(expr,ptrd,char) *ptrd = (char)*(ptrs++); + } cimg::strellipsize(expr); const ulongT g_target = mp.opcode[1]; -#ifndef cimg_use_openmp +#if cimg_use_openmp==0 const unsigned int n_thread = 0; #else const unsigned int n_thread = omp_get_thread_num(); @@ -21495,7 +23242,7 @@ std::fflush(cimg::output()); mp.debug_indent+=3; } - const CImg *const p_end = (++mp.p_code) + mp.opcode[3]; + const CImg *const p_end = ++mp.p_code + mp.opcode[3]; CImg _op; for ( ; mp.p_code &op = *mp.p_code; @@ -21512,7 +23259,7 @@ { std::fprintf(cimg::output(), "\n[" cimg_appname "_math_parser] %p[thread #%u]:%*c" - "Opcode %p = [ %p,%s ] -> mem[%u] = %g", + "Opcode %p = [ %p,%s ] -> mem[%u] = %.17g", (void*)&mp,n_thread,mp.debug_indent,' ', (void*)mp.opcode._data,(void*)*mp.opcode,_op.value_string().data(), (unsigned int)target,mp.mem[target]); @@ -21524,7 +23271,7 @@ mp.debug_indent-=3; std::fprintf(cimg::output(), "\n[" cimg_appname "_math_parser] %p[thread #%u]:%*c" - "End debugging expression '%s' -> mem[%u] = %g (memsize: %u)", + "End debugging expression '%s' -> mem[%u] = %.17g (memsize: %u)", (void*)&mp,n_thread,mp.debug_indent,' ', expr._data,(unsigned int)g_target,mp.mem[g_target],mp.mem._width); std::fflush(cimg::output()); @@ -21633,7 +23380,6 @@ static double mp_draw(_cimg_math_parser& mp) { const int x = (int)_mp_arg(4), y = (int)_mp_arg(5), z = (int)_mp_arg(6), c = (int)_mp_arg(7); unsigned int ind = (unsigned int)mp.opcode[3]; - if (ind!=~0U) ind = (unsigned int)cimg::mod((int)_mp_arg(3),mp.listin.width()); CImg &img = ind==~0U?mp.imgout:mp.listout[ind]; unsigned int @@ -21682,7 +23428,7 @@ while (l(ptr,l,1,1,1,true).move_to(_str); } else { // Scalar argument -> number - it.assign(256); + it.assign(24); cimg_snprintf(it,it._width,"%.17g",_mp_arg(3 + 2*n)); CImg::string(it,false,true).move_to(_str); } @@ -21699,9 +23445,9 @@ if (ind!=~0U) ind = (unsigned int)cimg::mod((int)_mp_arg(3),mp.listin.width()); CImg &img = ind==~0U?mp.imgout:mp.listout[ind]; CImg color(img._spectrum,1,1,1,0); - bool is_invalid_arguments = false; - unsigned int i = 4; + bool is_invalid_arguments = false, is_outlined = false; float r1 = 0, r2 = 0, angle = 0, opacity = 1; + unsigned int i = 4, pattern = ~0U; int x0 = 0, y0 = 0; if (i>=i_end) is_invalid_arguments = true; else { @@ -21719,6 +23465,11 @@ angle = (float)_mp_arg(i++); if (i args(i_end - 4); cimg_forX(args,k) args[k] = _mp_arg(4 + k); if (ind==~0U) @@ -21750,31 +23503,6 @@ return (double)(_mp_arg(2)==_mp_arg(3)); } - static double mp_ext(_cimg_math_parser& mp) { - const unsigned int nb_args = (unsigned int)(mp.opcode[2] - 3)/2; - CImgList _str; - CImg it; - for (unsigned int n = 0; n string - const double *ptr = &_mp_arg(3 + 2*n) + 1; - unsigned int l = 0; - while (l(ptr,l,1,1,1,true).move_to(_str); - } else { // Scalar argument -> number - it.assign(256); - cimg_snprintf(it,it._width,"%.17g",_mp_arg(3 + 2*n)); - CImg::string(it,false,true).move_to(_str); - } - } - CImg(1,1,1,1,0).move_to(_str); - CImg str = _str>'x'; -#ifdef cimg_mp_ext_function - cimg_mp_ext_function(str); -#endif - return cimg::type::nan(); - } - static double mp_exp(_cimg_math_parser& mp) { return std::exp(_mp_arg(2)); } @@ -21786,6 +23514,10 @@ return cimg::type::nan(); } + static double mp_f2ui(_cimg_math_parser& mp) { + return (double)cimg::float2uint((float)_mp_arg(2)); + } + static double mp_factorial(_cimg_math_parser& mp) { return cimg::factorial((int)_mp_arg(2)); } @@ -21795,9 +23527,9 @@ } static double mp_find(_cimg_math_parser& mp) { - const bool is_forward = (bool)_mp_arg(5); + const int _step = (int)_mp_arg(6), step = _step?_step:-1; const ulongT siz = (ulongT)mp.opcode[3]; - longT ind = (longT)(mp.opcode[6]!=_cimg_mp_slot_nan?_mp_arg(6):is_forward?0:siz - 1); + longT ind = (longT)(mp.opcode[5]!=_cimg_mp_slot_nan?_mp_arg(5):step>0?0:siz - 1); if (ind<0 || ind>=(longT)siz) return -1.; const double *const ptrb = &_mp_arg(2) + 1, @@ -21806,22 +23538,22 @@ *ptr = ptrb + ind; // Forward search - if (is_forward) { - while (ptr0) { + while (ptr=ptre?-1.:(double)(ptr - ptrb); } // Backward search. - while (ptr>=ptrb && *ptr!=val) --ptr; + while (ptr>=ptrb && *ptr!=val) ptr+=step; return ptr0?0:siz1 - 1); if (ind<0 || ind>=(longT)siz1) return -1.; const double *const ptr1b = &_mp_arg(2) + 1, @@ -21833,25 +23565,25 @@ *p2 = 0; // Forward search. - if (is_forward) { + if (step>0) { do { - while (ptr1=ptr1e) return -1.; p1 = ptr1 + 1; p2 = ptr2b + 1; while (p1=ptr1b && *ptr1!=*ptr2b) --ptr1; + while (ptr1>=ptr1b && *ptr1!=*ptr2b) ptr1+=step; if (ptr1=ptr1b); + } while (p2=ptr1b); return p2 filename(mp.opcode._data + 3,mp.opcode[2] - 3); - return (double)cimg::fsize(filename); + const double *ptrs = &_mp_arg(2) + 1; + const ulongT siz = (ulongT)mp.opcode[3]; + CImg ss(siz + 1); + cimg_forX(ss,i) ss[i] = (char)ptrs[i]; + ss.back() = 0; + return (double)cimg::fsize(ss); } static double mp_g(_cimg_math_parser& mp) { @@ -21935,6 +23671,20 @@ return cimg::gcd((long)_mp_arg(2),(long)_mp_arg(3)); } +#ifdef cimg_mp_func_name + static double mp_name(_cimg_math_parser& mp) { + double *const ptr = &_mp_arg(1) + 1; + const unsigned int siz = (unsigned int)mp.opcode[3]; + unsigned int ind = (unsigned int)mp.opcode[2]; + if (ind==~0U) std::memset(ptr,0,siz*sizeof(double)); + else { + ind = (unsigned int)cimg::mod((int)_mp_arg(2),mp.listin.width()); + cimg_mp_func_name(ind,ptr,siz); + } + return cimg::type::nan(); + } +#endif + static double mp_gt(_cimg_math_parser& mp) { return (double)(_mp_arg(2)>_mp_arg(3)); } @@ -22006,6 +23756,13 @@ return (double)img.median(); } + static double mp_image_norm(_cimg_math_parser& mp) { + unsigned int ind = (unsigned int)mp.opcode[2]; + if (ind!=~0U) ind = (unsigned int)cimg::mod((int)_mp_arg(2),mp.listin.width()); + const CImg &img = ind==~0U?mp.imgout:mp.listout[ind]; + return (double)img.magnitude(); + } + static double mp_image_print(_cimg_math_parser& mp) { const unsigned int ind = (unsigned int)cimg::mod((int)_mp_arg(2),mp.listout.width()); cimg::mutex(6); @@ -22118,6 +23875,41 @@ return _mp_arg(2) + 1; } + static double mp_inrange(_cimg_math_parser& mp) { + const unsigned int sizd = (unsigned int)mp.opcode[2]; + const bool include_boundaries = (bool)_mp_arg(9); + if (!sizd) { // Scalar result + const double val = _mp_arg(3); + double m = _mp_arg(5), M = _mp_arg(7); + if (m>M) cimg::swap(m,M); + return include_boundaries?(val>=m && val<=M):(val>m && valM) cimg::swap(m,M); + ptrd[k] = (double)(include_boundaries?(val>=m && val<=M):(val>m && val::nan(); + } + static double mp_int(_cimg_math_parser& mp) { return (double)(longT)_mp_arg(2); } @@ -22150,6 +23942,15 @@ return (double)(val==0. || val==1.); } + static double mp_isdir(_cimg_math_parser& mp) { + const double *ptrs = &_mp_arg(2) + 1; + const ulongT siz = (ulongT)mp.opcode[3]; + CImg ss(siz + 1); + cimg_forX(ss,i) ss[i] = (char)ptrs[i]; + ss.back() = 0; + return (double)cimg::is_directory(ss); + } + static double mp_isin(_cimg_math_parser& mp) { const unsigned int i_end = (unsigned int)mp.opcode[2]; const double val = _mp_arg(3); @@ -22163,7 +23964,16 @@ } static double mp_isint(_cimg_math_parser& mp) { - return (double)(cimg::mod(_mp_arg(2),1.)==0); + return (double)((double)(longT)_mp_arg(2)==_mp_arg(2)); + } + + static double mp_isfile(_cimg_math_parser& mp) { + const double *ptrs = &_mp_arg(2) + 1; + const ulongT siz = (ulongT)mp.opcode[3]; + CImg ss(siz + 1); + cimg_forX(ss,i) ss[i] = (char)ptrs[i]; + ss.back() = 0; + return (double)cimg::is_file(ss); } static double mp_isnan(_cimg_math_parser& mp) { @@ -22178,7 +23988,53 @@ const double x = _mp_arg(2), y = _mp_arg(3), z = _mp_arg(4), c = _mp_arg(5); - if (interpolation==0) switch (boundary_conditions) { // Nearest neighbor interpolation + switch (interpolation) { + case 2 : // Cubic interpolation + switch (boundary_conditions) { + case 3 : { // Mirror + const float + w2 = 2.f*img.width(), h2 = 2.f*img.height(), d2 = 2.f*img.depth(), s2 = 2.f*img.spectrum(), + mx = cimg::mod((float)x,w2), my = cimg::mod((float)y,h2), + mz = cimg::mod((float)z,d2), mc = cimg::mod((float)c,s2); + return (double)img._cubic_atXYZ(mx=img._spectrum?img._spectrum - 1:c)); + default : // Dirichlet + if (c<0 || c>=img._spectrum) return (T)0; + return (double)img.cubic_atXYZ((float)x,(float)y,(float)z,(int)c,(T)0); + } + case 1 : // Linear interpolation + switch (boundary_conditions) { + case 3 : { // Mirror + const float + w2 = 2.f*img.width(), h2 = 2.f*img.height(), d2 = 2.f*img.depth(), s2 = 2.f*img.spectrum(), + mx = cimg::mod((float)x,w2), my = cimg::mod((float)y,h2), + mz = cimg::mod((float)z,d2), mc = cimg::mod((float)c,s2); + return (double)img._linear_atXYZ(mx=img._spectrum?img._spectrum - 1:c)); + default : // Dirichlet + if (c<0 || c>=img._spectrum) return (T)0; + return (double)img.linear_atXYZ((float)x,(float)y,(float)z,(int)c,(T)0); + } + default : // Nearest neighbor interpolation + switch (boundary_conditions) { case 3 : { // Mirror const int w2 = 2*img.width(), h2 = 2*img.height(), d2 = 2*img.depth(), s2 = 2*img.spectrum(), @@ -22190,35 +24046,16 @@ mc=img._spectrum?img._spectrum - 1:c)); + default : // Dirichlet + if (c<0 || c>=img._spectrum) return (T)0; + return (double)img.cubic_atXYZ((float)x,(float)y,(float)z,(int)c,(T)0); + } + case 1 : // Linear interpolation + switch (boundary_conditions) { + case 3 : { // Mirror + const float + w2 = 2.f*img.width(), h2 = 2.f*img.height(), d2 = 2.f*img.depth(), s2 = 2.f*img.spectrum(), + mx = cimg::mod((float)x,w2), my = cimg::mod((float)y,h2), + mz = cimg::mod((float)z,d2), mc = cimg::mod((float)c,s2); + return (double)img._linear_atXYZ(mx=img._spectrum?img._spectrum - 1:c)); + default : // Dirichlet + if (c<0 || c>=img._spectrum) return (T)0; + return (double)img.linear_atXYZ((float)x,(float)y,(float)z,(int)c,(T)0); + } + default : // Nearest neighbor interpolation + switch (boundary_conditions) { case 3 : { // Mirror const int w2 = 2*img.width(), h2 = 2*img.height(), d2 = 2*img.depth(), s2 = 2*img.spectrum(), @@ -22269,35 +24152,16 @@ mc vals(i_end - 4); double *p = vals.data(); for (unsigned int i = 4; i &img = mp.listin[indi]; - const bool is_forward = (bool)_mp_arg(4); + const int _step = (int)_mp_arg(5), step = _step?_step:-1; const ulongT siz = (ulongT)img.size(); - longT ind = (longT)(mp.opcode[5]!=_cimg_mp_slot_nan?_mp_arg(5):is_forward?0:siz - 1); + longT ind = (longT)(mp.opcode[4]!=_cimg_mp_slot_nan?_mp_arg(4):step>0?0:siz - 1); if (ind<0 || ind>=(longT)siz) return -1.; const T *const ptrb = img.data(), @@ -22343,13 +24212,13 @@ const double val = _mp_arg(3); // Forward search - if (is_forward) { - while (ptr0) { + while (ptr=ptre?-1.:(double)(ptr - ptrb); } // Backward search. - while (ptr>=ptrb && (double)*ptr!=val) --ptr; + while (ptr>=ptrb && (double)*ptr!=val) ptr+=step; return ptr &img = mp.listin[indi]; - const bool is_forward = (bool)_mp_arg(5); + const int _step = (bool)_mp_arg(6), step = _step?_step:-1; const ulongT siz1 = (ulongT)img.size(), siz2 = (ulongT)mp.opcode[4]; - longT ind = (longT)(mp.opcode[6]!=_cimg_mp_slot_nan?_mp_arg(6):is_forward?0:siz1 - 1); + longT ind = (longT)(mp.opcode[5]!=_cimg_mp_slot_nan?_mp_arg(5):step>0?0:siz1 - 1); if (ind<0 || ind>=(longT)siz1) return -1.; const T *const ptr1b = img.data(), @@ -22374,25 +24243,25 @@ *p2 = 0; // Forward search. - if (is_forward) { + if (step>0) { do { - while (ptr1=ptr1e) return -1.; p1 = ptr1 + 1; p2 = ptr2b + 1; while (p1=ptr1b && *ptr1!=*ptr2b) --ptr1; + while (ptr1>=ptr1b && *ptr1!=*ptr2b) ptr1+=step; if (ptr1=ptr1b); + } while (p2=ptr1b); return p2=img._spectrum?img._spectrum - 1:c)); + default : // Dirichlet + if (c<0 || c>=img._spectrum) return (T)0; + return (double)img.cubic_atXYZ((float)x,(float)y,(float)z,(int)c,(T)0); + } + case 1 : // Linear interpolation + switch (boundary_conditions) { + case 3 : { // Mirror + const float + w2 = 2.f*img.width(), h2 = 2.f*img.height(), d2 = 2.f*img.depth(), s2 = 2.f*img.spectrum(), + mx = cimg::mod((float)x,w2), my = cimg::mod((float)y,h2), + mz = cimg::mod((float)z,d2), mc = cimg::mod((float)c,s2); + return (double)img._linear_atXYZ(mx=img._spectrum?img._spectrum - 1:c)); + default : // Dirichlet + if (c<0 || c>=img._spectrum) return (T)0; + return (double)img.linear_atXYZ((float)x,(float)y,(float)z,(int)c,(T)0); + } + default : // Nearest neighbor interpolation + switch (boundary_conditions) { case 3 : { // Mirror const int w2 = 2*img.width(), h2 = 2*img.height(), d2 = 2*img.depth(), s2 = 2*img.spectrum(), @@ -22451,35 +24366,16 @@ mc=img._spectrum?img._spectrum - 1:c)); + default : // Dirichlet + if (c<0 || c>=img._spectrum) return (T)0; + return (double)img.cubic_atXYZ((float)x,(float)y,(float)z,(int)c,(T)0); + } + case 1 : // Linear interpolation + switch (boundary_conditions) { + case 3 : { // Mirror + const float + w2 = 2.f*img.width(), h2 = 2.f*img.height(), d2 = 2.f*img.depth(), s2 = 2.f*img.spectrum(), + mx = cimg::mod((float)x,w2), my = cimg::mod((float)y,h2), + mz = cimg::mod((float)z,d2), mc = cimg::mod((float)c,s2); + return (double)img._linear_atXYZ(mx=img._spectrum?img._spectrum - 1:c)); + default : // Dirichlet + if (c<0 || c>=img._spectrum) return (T)0; + return (double)img.linear_atXYZ((float)x,(float)y,(float)z,(int)c,(T)0); + } + default : // Nearest neighbor interpolation + switch (boundary_conditions) { case 3 : { // Mirror const int w2 = 2*img.width(), h2 = 2*img.height(), d2 = 2*img.depth(), s2 = 2*img.spectrum(), @@ -22532,35 +24474,16 @@ mc::vector(mp.listin[ind].magnitude()).move_to(mp.list_norm[ind]); + return *mp.list_norm[ind]; + } + static double mp_list_set_ioff(_cimg_math_parser& mp) { const unsigned int ind = (unsigned int)cimg::mod((int)_mp_arg(2),mp.listin.width()); CImg &img = mp.listout[ind]; @@ -22844,7 +24774,49 @@ const double x = _mp_arg(3), y = _mp_arg(4), z = _mp_arg(5); const ulongT whd = (ulongT)img._width*img._height*img._depth; const T *ptrs; - if (interpolation==0) switch (boundary_conditions) { // Nearest neighbor interpolation + switch (interpolation) { + case 2 : // Cubic interpolation + switch (boundary_conditions) { + case 3 : { // Mirror + const float + w2 = 2.f*img.width(), h2 = 2.f*img.height(), d2 = 2.f*img.depth(), + mx = cimg::mod((float)x,w2), my = cimg::mod((float)y,h2), mz = cimg::mod((float)z,d2), + cx = mx::nan(); } @@ -22952,7 +24903,49 @@ x = ox + _mp_arg(3), y = oy + _mp_arg(4), z = oz + _mp_arg(5); const ulongT whd = (ulongT)img._width*img._height*img._depth; const T *ptrs; - if (interpolation==0) switch (boundary_conditions) { // Nearest neighbor interpolation + switch (interpolation) { + case 2 : // Cubic interpolation + switch (boundary_conditions) { + case 3 : { // Mirror + const float + w2 = 2.f*img.width(), h2 = 2.f*img.height(), d2 = 2.f*img.depth(), + mx = cimg::mod((float)x,w2), my = cimg::mod((float)y,h2), mz = cimg::mod((float)z,d2), + cx = mx::nan(); } @@ -23073,11 +25045,12 @@ return cimg::type::nan(); } - static double mp_matrix_inv(_cimg_math_parser& mp) { - double *ptrd = &_mp_arg(1) + 1; - const double *ptr1 = &_mp_arg(2) + 1; + static double mp_matrix_invert(_cimg_math_parser& mp) { + double *const ptrd = &_mp_arg(1) + 1; + const double *const ptr1 = &_mp_arg(2) + 1; const unsigned int k = (unsigned int)mp.opcode[3]; - CImg(ptrd,k,k,1,1,true) = CImg(ptr1,k,k,1,1,true).get_invert(); + const bool use_LU = (bool)_mp_arg(4); + CImg(ptrd,k,k,1,1,true) = CImg(ptr1,k,k,1,1,true).get_invert(use_LU); return cimg::type::nan(); } @@ -23094,13 +25067,14 @@ return cimg::type::nan(); } - static double mp_matrix_pseudoinv(_cimg_math_parser& mp) { + static double mp_matrix_pseudoinvert(_cimg_math_parser& mp) { double *ptrd = &_mp_arg(1) + 1; const double *ptr1 = &_mp_arg(2) + 1; const unsigned int k = (unsigned int)mp.opcode[3], l = (unsigned int)mp.opcode[4]; - CImg(ptrd,l,k,1,1,true) = CImg(ptr1,k,l,1,1,true).get_pseudoinvert(); + const bool use_LU = (bool)_mp_arg(5); + CImg(ptrd,l,k,1,1,true) = CImg(ptr1,k,l,1,1,true).get_pseudoinvert(use_LU); return cimg::type::nan(); } @@ -23125,6 +25099,16 @@ return val; } + static double mp_maxabs(_cimg_math_parser& mp) { + const unsigned int i_end = (unsigned int)mp.opcode[2]; + double val = _mp_arg(3), absval = cimg::abs(val); + for (unsigned int i = 4; iabsval) { val = _val; absval = _absval; } + } + return val; + } + static double* _mp_memcopy_double(_cimg_math_parser& mp, const unsigned int ind, const ulongT *const p_ref, const longT siz, const long inc) { const longT @@ -23140,9 +25124,11 @@ } static float* _mp_memcopy_float(_cimg_math_parser& mp, const ulongT *const p_ref, - const longT siz, const long inc) { + const longT siz, const long inc, const bool is_out) { const unsigned ind = (unsigned int)p_ref[1]; - const CImg &img = ind==~0U?mp.imgin:mp.listin[cimg::mod((int)mp.mem[ind],mp.listin.width())]; + const CImg &img = is_out? + (ind==~0U?mp.imgout:mp.listout[cimg::mod((int)mp.mem[ind],mp.listout.width())]): + (ind==~0U?mp.imgin:mp.listin[cimg::mod((int)mp.mem[ind],mp.listin.width())]); const bool is_relative = (bool)p_ref[2]; int ox, oy, oz, oc; longT off = 0; @@ -23202,17 +25188,17 @@ } } else if (is_doubled && !is_doubles) { // (double*) <- (float*) double *ptrd = _mp_memcopy_double(mp,(unsigned int)mp.opcode[2],&mp.opcode[8],siz,inc_d); - const float *ptrs = _mp_memcopy_float(mp,&mp.opcode[15],siz,inc_s); + const float *ptrs = _mp_memcopy_float(mp,&mp.opcode[15],siz,inc_s,false); if (_opacity>=1) while (siz-->0) { *ptrd = *ptrs; ptrd+=inc_d; ptrs+=inc_s; } else while (siz-->0) { *ptrd = omopacity**ptrd + _opacity**ptrs; ptrd+=inc_d; ptrs+=inc_s; } } else if (!is_doubled && is_doubles) { // (float*) <- (double*) - float *ptrd = _mp_memcopy_float(mp,&mp.opcode[8],siz,inc_d); + float *ptrd = _mp_memcopy_float(mp,&mp.opcode[8],siz,inc_d,true); const double *ptrs = _mp_memcopy_double(mp,(unsigned int)mp.opcode[3],&mp.opcode[15],siz,inc_s); if (_opacity>=1) while (siz-->0) { *ptrd = (float)*ptrs; ptrd+=inc_d; ptrs+=inc_s; } else while (siz-->0) { *ptrd = (float)(omopacity**ptrd + opacity**ptrs); ptrd+=inc_d; ptrs+=inc_s; } } else { // (float*) <- (float*) - float *ptrd = _mp_memcopy_float(mp,&mp.opcode[8],siz,inc_d); - const float *ptrs = _mp_memcopy_float(mp,&mp.opcode[15],siz,inc_s); + float *ptrd = _mp_memcopy_float(mp,&mp.opcode[8],siz,inc_d,true); + const float *ptrs = _mp_memcopy_float(mp,&mp.opcode[15],siz,inc_s,false); if (inc_d==1 && inc_s==1 && _opacity>=1) { if (ptrs + siz - 1ptrd + siz - 1) std::memcpy(ptrd,ptrs,siz*sizeof(float)); else std::memmove(ptrd,ptrs,siz*sizeof(float)); @@ -23240,6 +25226,16 @@ return val; } + static double mp_minabs(_cimg_math_parser& mp) { + const unsigned int i_end = (unsigned int)mp.opcode[2]; + double val = _mp_arg(3), absval = cimg::abs(val); + for (unsigned int i = 4; i(ptrd,wS,wD,1,1,true) = CImg(ptrS,wS,hS,1,1,false). + project_matrix(CImg(ptrD,wD,hS,1,1,true),method,max_iter,max_residual); + return cimg::type::nan(); + } + static double mp_mul(_cimg_math_parser& mp) { return _mp_arg(2)*_mp_arg(3); } @@ -23349,23 +25365,26 @@ unsigned int ind = (unsigned int)mp.opcode[3]; if (ind!=~0U) ind = (unsigned int)cimg::mod((int)_mp_arg(3),mp.listin.width()); CImg &img = ind==~0U?mp.imgout:mp.listout[ind]; - bool is_invalid_arguments = i_end<=4; + bool is_invalid_arguments = i_end<=4, is_outlined = false; if (!is_invalid_arguments) { - const int nbv = (int)_mp_arg(4); - if (nbv<=0) is_invalid_arguments = true; + int nbv = (int)_mp_arg(4); + if (!nbv) is_invalid_arguments = true; else { + if (nbv<0) { nbv = -nbv; is_outlined = true; } CImg points(nbv,2,1,1,0); CImg color(img._spectrum,1,1,1,0); float opacity = 1; - unsigned int i = 5; + unsigned int i = 5, pattern=~0U; cimg_foroff(points,k) if (i expr(mp.opcode[2] - 4); + CImg _expr(mp.opcode[2] - 4); const ulongT *ptrs = mp.opcode._data + 4; - cimg_for(expr,ptrd,char) *ptrd = (char)*(ptrs++); - cimg::strellipsize(expr); + cimg_for(_expr,ptrd,char) *ptrd = (char)*(ptrs++); + cimg::strellipsize(_expr); cimg::mutex(6); if (print_char) - std::fprintf(cimg::output(),"\n[" cimg_appname "_math_parser] %s = %g = '%c'",expr._data,val,(int)val); + std::fprintf(cimg::output(),"\n[" cimg_appname "_math_parser] %s = %.17g = '%c'", + _expr._data,val,(int)val); else - std::fprintf(cimg::output(),"\n[" cimg_appname "_math_parser] %s = %g",expr._data,val); + std::fprintf(cimg::output(),"\n[" cimg_appname "_math_parser] %s = %.17g", + _expr._data,val); std::fflush(cimg::output()); cimg::mutex(6,0); } @@ -23723,6 +25744,35 @@ return cimg::type::nan(); } +#ifdef cimg_mp_func_setname + static double mp_setname(_cimg_math_parser& mp) { + unsigned int ind = (unsigned int)mp.opcode[3]; + if (ind!=~0U) { + ind = (unsigned int)cimg::mod((int)_mp_arg(3),mp.listin.width()); + const unsigned int nb_args = (unsigned int)(mp.opcode[2] - 3)/2; + CImgList _str; + CImg it; + for (unsigned int n = 0; n string + const double *ptr = &_mp_arg(4 + 2*n) + 1; + unsigned int l = 0; + while (l(ptr,l,1,1,1,true).move_to(_str); + } else { // Scalar argument -> number + it.assign(24); + cimg_snprintf(it,it._width,"%.17g",_mp_arg(4 + 2*n)); + CImg::string(it,false,true).move_to(_str); + } + } + CImg(1,1,1,1,0).move_to(_str); + const CImg str = _str>'x'; + cimg_mp_func_setname(ind,str); + } + return cimg::type::nan(); + } +#endif + static double mp_shift(_cimg_math_parser& mp) { double *const ptrd = &_mp_arg(1) + 1; const double *const ptrs = &_mp_arg(2) + 1; @@ -23759,7 +25809,7 @@ k = (unsigned int)mp.opcode[4], l = (unsigned int)mp.opcode[5], m = (unsigned int)mp.opcode[6]; - CImg(ptrd,m,k,1,1,true) = CImg(ptr2,m,l,1,1,true).get_solve(CImg(ptr1,k,l,1,1,true)); + CImg(ptrd,m,k,1,1,true) = CImg(ptr2,m,l,1,1,false).solve(CImg(ptr1,k,l,1,1,true)); return cimg::type::nan(); } @@ -23784,13 +25834,14 @@ } static double mp_srand(_cimg_math_parser& mp) { - mp.rng = (ulongT)_mp_arg(2); + mp.rng = (cimg_uint64)_mp_arg(2); return cimg::type::nan(); } static double mp_srand0(_cimg_math_parser& mp) { cimg::srand(&mp.rng); -#ifdef cimg_use_openmp + +#if cimg_use_openmp!=0 mp.rng+=omp_get_thread_num(); #endif return cimg::type::nan(); @@ -23805,7 +25856,7 @@ } static double mp_string_init(_cimg_math_parser& mp) { - const char *ptrs = (char*)&mp.opcode[3]; + const unsigned char *ptrs = (unsigned char*)&mp.opcode[3]; unsigned int ptrd = (unsigned int)mp.opcode[1] + 1, siz = (unsigned int)mp.opcode[2]; @@ -23813,6 +25864,43 @@ return cimg::type::nan(); } +#ifdef cimg_mp_func_store + static double mp_store(_cimg_math_parser& mp) { + const double + *ptr1 = &_mp_arg(2), + *ptr2 = &_mp_arg(4) + 1; + const unsigned int + siz1 = (unsigned int)mp.opcode[3], + siz2 = (unsigned int)mp.opcode[5], + sizM = std::max(siz1,1U); + const int + w = (int)_mp_arg(6), + h = (int)_mp_arg(7), + d = (int)_mp_arg(8), + s = (int)_mp_arg(9); + + const bool is_compressed = (bool)_mp_arg(10); + if (w<0 || h<0 || d<0 || s<0) + throw CImgArgumentException("[" cimg_appname "_math_parser] CImg<%s>: Function 'store()': " + "Specified image dimensions (%d,%d,%d,%d) are invalid.", + cimg::type::string(),w,h,d,s); + if ((unsigned int)w*h*d*s>sizM) + throw CImgArgumentException("[" cimg_appname "_math_parser] CImg<%s>: Function 'store()': " + "Specified image dimensions (%d,%d,%d,%d) are too large for vector size (%u).", + cimg::type::string(),w,h,d,s,sizM); + CImg ss(siz2 + 1); + cimg_for_inX(ss,0,ss.width() - 1,i) ss[i] = (char)ptr2[i]; + ss.back() = 0; + + CImg img; + if (siz1) cimg_mp_func_store(ptr1 + 1, + (unsigned int)w,(unsigned int)h,(unsigned int)d,(unsigned int)s, + is_compressed,ss._data); + else cimg_mp_func_store(ptr1,1,1,1,1,is_compressed,ss._data); + return cimg::type::nan(); + } +#endif + static double mp_stov(_cimg_math_parser& mp) { const double *ptrs = &_mp_arg(2); const ulongT siz = (ulongT)mp.opcode[3]; @@ -23823,26 +25911,62 @@ if (!siz) return *ptrs>='0' && *ptrs<='9'?*ptrs - '0':val; CImg ss(siz + 1 - ind); + ptrs+=1 + ind; + cimg_forX(ss,i) ss[i] = (char)ptrs[i]; + ss.back() = 0; + + const char *s = ss._data; + while (*s && *s<=32) ++s; + const bool is_negative = *s=='-'; + if (is_negative || *s=='+') ++s; + int err = 0; char sep; - ptrs+=1 + ind; cimg_forX(ss,i) ss[i] = (char)*(ptrs++); ss.back() = 0; - int err = cimg_sscanf(ss,"%lf%c",&val,&sep); + if (*s=='0' && (s[1]=='x' || s[1]=='X') && s[2]>32) { // Hexadecimal number + unsigned int ival; + err = cimg_sscanf(s + 2,"%x%c",&ival,&sep); + if (err>0) val = (double)ival; + } else if (*s>32) { // Decimal number + err = cimg_sscanf(s,"%lf%c",&val,&sep); #if cimg_OS==2 - // Check for +/-NaN and +/-inf as Microsoft's sscanf() version is not able - // to read those particular values. - if (!err && (*ss=='+' || *ss=='-' || *ss=='i' || *ss=='I' || *ss=='n' || *ss=='N')) { - bool is_positive = true; - const char *s = ss; - if (*s=='+') ++s; else if (*s=='-') { ++s; is_positive = false; } - if (!cimg::strcasecmp(s,"inf")) { val = cimg::type::inf(); err = 1; } - else if (!cimg::strcasecmp(s,"nan")) { val = cimg::type::nan(); err = 1; } - if (err==1 && !is_positive) val = -val; - } + // Check for +/-NaN and +/-inf as Microsoft's sscanf() version is not able + // to read those particular values. + if (!err && (*s=='i' || *s=='I' || *s=='n' || *s=='N')) { + if (!cimg::strncasecmp(s,"inf",3)) { val = cimg::type::inf(); err = 1 + (s[3]!=0); } + else if (!cimg::strncasecmp(s,"nan",3)) { val = cimg::type::nan(); err = 1 + (s[3]!=0); } + } #endif - if (is_strict && err!=1) return cimg::type::nan(); + } + if (err<=0 || (is_strict && err!=1)) return cimg::type::nan(); + if (is_negative) val = -val; return val; } + static double mp_string(_cimg_math_parser& mp) { + double *const ptrd = &_mp_arg(1) + 1; + const unsigned int nb_args = (unsigned int)(mp.opcode[3] - 3)/2; + CImgList _str; + CImg it; + for (unsigned int n = 0; n string + const double *ptr = &_mp_arg(4 + 2*n) + 1; + unsigned int l = 0; + while (l(ptr,l,1,1,1,true).move_to(_str); + } else { // Scalar argument -> number + it.assign(24); + cimg_snprintf(it,it._width,"%.17g",_mp_arg(4 + 2*n)); + CImg::string(it,false,true).move_to(_str); + } + } + const CImg str = _str>'x'; + const unsigned int sizd = std::min(str._width,(unsigned int)mp.opcode[2]); + std::memset(ptrd,0,mp.opcode[2]*sizeof(double)); + for (unsigned int k = 0; k::nan(); + } + static double mp_sub(_cimg_math_parser& mp) { return _mp_arg(2) - _mp_arg(3); } @@ -23854,6 +25978,18 @@ return val; } + static double mp_swap(_cimg_math_parser& mp) { + const unsigned int siz = (unsigned int)mp.opcode[3]; + if (!siz) { // Scalar + double &arg1 = _mp_arg(1), &arg2 = _mp_arg(2); + cimg::swap(arg1,arg2); + } else { // Vector + double *const ptr1 = &_mp_arg(1) + 1, *const ptr2 = &_mp_arg(2) + 1; + for (unsigned int k = 0; klength) + sublength = (longT)mp.opcode[5], + step = (longT)_mp_arg(6); + if (start<0 || start + step*(sublength-1)>=length) throw CImgArgumentException("[" cimg_appname "_math_parser] CImg<%s>: Value accessor '[]': " "Out-of-bounds sub-vector request " - "(length: %ld, start: %ld, sub-length: %ld).", - mp.imgin.pixel_type(),length,start,sublength); - std::memcpy(ptrd,ptrs + start,sublength*sizeof(double)); + "(length: %ld, start: %ld, sub-length: %ld, step: %ld).", + mp.imgin.pixel_type(),length,start,sublength,step); + ptrs+=start; + if (step==1) std::memcpy(ptrd,ptrs,sublength*sizeof(double)); + else for (longT k = 0; k::nan(); } @@ -23990,6 +26133,17 @@ return cimg::lowercase(_mp_arg(2))==cimg::lowercase(_mp_arg(4)); } + static double mp_vector_lerp(_cimg_math_parser& mp) { + unsigned int siz = (unsigned int)mp.opcode[2]; + double *ptrd = &_mp_arg(1) + 1; + const double + *ptrs1 = &_mp_arg(3) + 1, + *ptrs2 = &_mp_arg(4) + 1, + t = _mp_arg(5); + for (unsigned int k = 0; k::nan(); + } + static double mp_vector_off(_cimg_math_parser& mp) { const unsigned int ptr = (unsigned int)mp.opcode[2] + 1, @@ -24081,23 +26235,23 @@ const bool print_string = (bool)mp.opcode[4]; cimg_pragma_openmp(critical(mp_vector_print)) { - CImg expr(mp.opcode[2] - 5); + CImg _expr(mp.opcode[2] - 5); const ulongT *ptrs = mp.opcode._data + 5; - cimg_for(expr,ptrd,char) *ptrd = (char)*(ptrs++); - cimg::strellipsize(expr); + cimg_for(_expr,ptrd,char) *ptrd = (char)*(ptrs++); + cimg::strellipsize(_expr); unsigned int ptr = (unsigned int)mp.opcode[1] + 1, siz0 = (unsigned int)mp.opcode[3], siz = siz0; cimg::mutex(6); - std::fprintf(cimg::output(),"\n[" cimg_appname "_math_parser] %s = [ ",expr._data); + std::fprintf(cimg::output(),"\n[" cimg_appname "_math_parser] %s = [ ",_expr._data); unsigned int count = 0; while (siz-->0) { if (count>=64 && siz>=64) { std::fprintf(cimg::output(),"...,"); ptr = (unsigned int)mp.opcode[1] + 1 + siz0 - 64; siz = 64; - } else std::fprintf(cimg::output(),"%g%s",mp.mem[ptr++],siz?",":""); + } else std::fprintf(cimg::output(),"%.17g%s",mp.mem[ptr++],siz?",":""); ++count; } if (print_string) { @@ -24145,8 +26299,92 @@ ptr = (unsigned int)mp.opcode[2] + 1, siz = (unsigned int)mp.opcode[3]; const int off = (int)_mp_arg(4); - if (off>=0 && off<(int)siz) mp.mem[ptr + off] = _mp_arg(5); - return _mp_arg(5); + if (off>=0 && off<(int)siz) mp.mem[ptr + off] = _mp_arg(1); + return _mp_arg(1); + } + +#define _cimg_mp_vfunc(func) \ + const longT sizd = (longT)mp.opcode[2];\ + const unsigned int nbargs = (unsigned int)(mp.opcode[3] - 4)/2; \ + double *const ptrd = &_mp_arg(1) + (sizd?1:0); \ + cimg_pragma_openmp(parallel cimg_openmp_if_size(sizd,256)) \ + { CImg vec(nbargs); double res; \ + cimg_pragma_openmp(for) for (longT k = sizd?sizd - 1:0; k>=0; --k) { \ + cimg_forX(vec,n) vec[n] = *(&_mp_arg(4 + 2*n) + (k+1)*(mp.opcode[4 + 2*n + 1]?1:0)); \ + func; ptrd[k] = res; \ + }} \ + return sizd?cimg::type::nan():*ptrd; + + static double _mp_vargkth(CImg& vec) { + const double val = (+vec).get_shared_points(1,vec.width() - 1). + kth_smallest((ulongT)cimg::cut((longT)*vec - 1,(longT)0,(longT)vec.width() - 2)); + cimg_for_inX(vec,1,vec.width()-1,ind) if (vec[ind]==val) return ind - 1.; + return 1.; + } + + static double mp_vargkth(_cimg_math_parser& mp) { + _cimg_mp_vfunc(res = _mp_vargkth(vec)); + } + + static double mp_vargmax(_cimg_math_parser& mp) { + _cimg_mp_vfunc(res = (double)(&vec.max() - vec.data())); + } + + static double mp_vargmaxabs(_cimg_math_parser& mp) { + _cimg_mp_vfunc(res = (double)(&vec.maxabs() - vec.data())); + } + + static double mp_vargmin(_cimg_math_parser& mp) { + _cimg_mp_vfunc(res = (double)(&vec.min() - vec.data())); + } + + static double mp_vargminabs(_cimg_math_parser& mp) { + _cimg_mp_vfunc(res = (double)(&vec.minabs() - vec.data())); + } + + static double mp_vavg(_cimg_math_parser& mp) { + _cimg_mp_vfunc(res = vec.mean()); + } + + static double mp_vkth(_cimg_math_parser& mp) { + _cimg_mp_vfunc(res = vec.get_shared_points(1,vec.width() - 1). + kth_smallest((ulongT)cimg::cut((longT)*vec - 1,(longT)0,(longT)vec.width() - 2))); + } + + static double mp_vmax(_cimg_math_parser& mp) { + _cimg_mp_vfunc(res = vec.max()); + } + + static double mp_vmaxabs(_cimg_math_parser& mp) { + _cimg_mp_vfunc(res = vec.maxabs()); + } + + static double mp_vmedian(_cimg_math_parser& mp) { + _cimg_mp_vfunc(res = vec.median()); + } + + static double mp_vmin(_cimg_math_parser& mp) { + _cimg_mp_vfunc(res = vec.min()); + } + + static double mp_vminabs(_cimg_math_parser& mp) { + _cimg_mp_vfunc(res = vec.minabs()); + } + + static double mp_vprod(_cimg_math_parser& mp) { + _cimg_mp_vfunc(res = vec.product()); + } + + static double mp_vstd(_cimg_math_parser& mp) { + _cimg_mp_vfunc(res = std::sqrt(vec.get_stats()[3])); + } + + static double mp_vsum(_cimg_math_parser& mp) { + _cimg_mp_vfunc(res = vec.sum()); + } + + static double mp_vvar(_cimg_math_parser& mp) { + _cimg_mp_vfunc(res = vec.get_stats()[3]); } static double mp_vtos(_cimg_math_parser& mp) { @@ -24154,6 +26392,7 @@ const unsigned int sizd = (unsigned int)mp.opcode[2], sizs = (unsigned int)mp.opcode[4]; + std::memset(ptrd,0,sizd*sizeof(double)); const int nb_digits = (int)_mp_arg(5); CImg format(8); switch (nb_digits) { @@ -24172,7 +26411,7 @@ const unsigned int l = std::min(sizd,(unsigned int)std::strlen(str) + 1); CImg(ptrd,l,1,1,1,true) = str.get_shared_points(0,l - 1); return cimg::type::nan(); - } + } static double mp_while(_cimg_math_parser& mp) { const ulongT @@ -24261,7 +26500,49 @@ const double x = _mp_arg(2), y = _mp_arg(3), z = _mp_arg(4); const ulongT whd = (ulongT)img._width*img._height*img._depth; const T *ptrs; - if (interpolation==0) switch (boundary_conditions) { // Nearest neighbor interpolation + switch (interpolation) { + case 2 : // Cubic interpolation + switch (boundary_conditions) { + case 3 : { // Mirror + const float + w2 = 2.f*img.width(), h2 = 2.f*img.height(), d2 = 2.f*img.depth(), + mx = cimg::mod((float)x,w2), my = cimg::mod((float)y,h2), mz = cimg::mod((float)z,d2), + cx = mx::nan(); } @@ -24369,7 +26629,49 @@ x = ox + _mp_arg(2), y = oy + _mp_arg(3), z = oz + _mp_arg(4); const ulongT whd = (ulongT)img._width*img._height*img._depth; const T *ptrs; - if (interpolation==0) switch (boundary_conditions) { // Nearest neighbor interpolation + switch (interpolation) { + case 2 : // Cubic interpolation + switch (boundary_conditions) { + case 3 : { // Mirror + const float + w2 = 2.f*img.width(), h2 = 2.f*img.height(), d2 = 2.f*img.depth(), + mx = cimg::mod((float)x,w2), my = cimg::mod((float)y,h2), mz = cimg::mod((float)z,d2), + cx = mx::nan(); } @@ -25053,6 +27334,124 @@ return CImg(*this,false).max(expression); } + //! Pointwise minabs operator between instance image and a value. + /** + \param val Value used as the reference argument of the minabs operator. + \note Replace each pixel value \f$I_{(x,y,z,c)}\f$ of the image instance by + \f$\mathrm{minabs}(I_{(x,y,z,c)},\mathrm{val})\f$. + **/ + CImg& minabs(const T& value) { + if (is_empty()) return *this; + const T absvalue = cimg::abs(value); + cimg_openmp_for(*this,cimg::minabs(*ptr,value,absvalue),65536); + return *this; + } + + //! Pointwise minabs operator between instance image and a value \newinstance. + CImg get_minabs(const T& value) const { + return (+*this).minabs(value); + } + + //! Pointwise minabs operator between two images. + /** + \param img Image used as the reference argument of the minabs operator. + \note Replace each pixel value \f$I_{(x,y,z,c)}\f$ of the image instance by + \f$\mathrm{minabs}(I_{(x,y,z,c)},\mathrm{img}_{(x,y,z,c)})\f$. + **/ + template + CImg& minabs(const CImg& img) { + const ulongT siz = size(), isiz = img.size(); + if (siz && isiz) { + if (is_overlapped(img)) return minabs(+img); + T *ptrd = _data, *const ptre = _data + siz; + if (siz>isiz) for (ulongT n = siz/isiz; n; --n) + for (const t *ptrs = img._data, *ptrs_end = ptrs + isiz; ptrs + CImg<_cimg_Tt> get_minabs(const CImg& img) const { + return CImg<_cimg_Tt>(*this,false).minabs(img); + } + + //! Pointwise minabs operator between an image and an expression. + /** + \param expression Math formula as a C-string. + \note Replace each pixel value \f$I_{(x,y,z,c)}\f$ of the image instance by + \f$\mathrm{minabs}(I_{(x,y,z,c)},\mathrm{expr}_{(x,y,z,c)})\f$. + **/ + CImg& minabs(const char *const expression) { + return minabs((+*this)._fill(expression,true,1,0,0,"minabs",this)); + } + + //! Pointwise minabs operator between an image and an expression \newinstance. + CImg get_minabs(const char *const expression) const { + return CImg(*this,false).minabs(expression); + } + + //! Pointwise maxabs operator between instance image and a value. + /** + \param val Value used as the reference argument of the maxabs operator. + \note Replace each pixel value \f$I_{(x,y,z,c)}\f$ of the image instance by + \f$\mathrm{maxabs}(I_{(x,y,z,c)},\mathrm{val})\f$. + **/ + CImg& maxabs(const T& value) { + if (is_empty()) return *this; + const T absvalue = cimg::abs(value); + cimg_openmp_for(*this,cimg::maxabs(*ptr,value,absvalue),65536); + return *this; + } + + //! Pointwise maxabs operator between instance image and a value \newinstance. + CImg get_maxabs(const T& value) const { + return (+*this).maxabs(value); + } + + //! Pointwise maxabs operator between two images. + /** + \param img Image used as the reference argument of the maxabs operator. + \note Replace each pixel value \f$I_{(x,y,z,c)}\f$ of the image instance by + \f$\mathrm{maxabs}(I_{(x,y,z,c)},\mathrm{img}_{(x,y,z,c)})\f$. + **/ + template + CImg& maxabs(const CImg& img) { + const ulongT siz = size(), isiz = img.size(); + if (siz && isiz) { + if (is_overlapped(img)) return maxabs(+img); + T *ptrd = _data, *const ptre = _data + siz; + if (siz>isiz) for (ulongT n = siz/isiz; n; --n) + for (const t *ptrs = img._data, *ptrs_end = ptrs + isiz; ptrs + CImg<_cimg_Tt> get_maxabs(const CImg& img) const { + return CImg<_cimg_Tt>(*this,false).maxabs(img); + } + + //! Pointwise maxabs operator between an image and an expression. + /** + \param expression Math formula as a C-string. + \note Replace each pixel value \f$I_{(x,y,z,c)}\f$ of the image instance by + \f$\mathrm{maxabs}(I_{(x,y,z,c)},\mathrm{expr}_{(x,y,z,c)})\f$. + **/ + CImg& maxabs(const char *const expression) { + return maxabs((+*this)._fill(expression,true,1,0,0,"maxabs",this)); + } + + //! Pointwise maxabs operator between an image and an expression \newinstance. + CImg get_maxabs(const char *const expression) const { + return CImg(*this,false).maxabs(expression); + } + //! Return a reference to the minimum pixel value. /** **/ @@ -25079,6 +27478,38 @@ return *ptr_min; } + //! Return a reference to the minium pixel value in absolute value. + /** + **/ + T& minabs() { + if (is_empty()) + throw CImgInstanceException(_cimg_instance + "minabs(): Empty instance.", + cimg_instance); + T *ptr_minabs = _data; + T minabs_value = *ptr_minabs; + cimg_for(*this,ptrs,T) { + const T ma = cimg::abs(*ptrs); + if (mamaxabs_value) { maxabs_value = ma; ptr_maxabs = ptrs; } + } + return *ptr_maxabs; + } + + //! Return a reference to the maximum pixel value in absolute value \const. + const T& maxabs() const { + if (is_empty()) + throw CImgInstanceException(_cimg_instance + "maxabs(): Empty instance.", + cimg_instance); + const T *ptr_maxabs = _data; + T maxabs_value = *ptr_maxabs; + cimg_for(*this,ptrs,T) { + const T ma = cimg::abs(*ptrs); + if (ma>maxabs_value) { maxabs_value = ma; ptr_maxabs = ptrs; } + } + return *ptr_maxabs; + } + //! Return a reference to the minimum pixel value as well as the maximum pixel value. /** \param[out] max_val Maximum pixel value. @@ -25185,13 +27648,14 @@ //! Return the kth smallest pixel value. /** - \param k Rank of the search smallest element. + \param k Rank of the smallest element searched. **/ T kth_smallest(const ulongT k) const { if (is_empty()) throw CImgInstanceException(_cimg_instance "kth_smallest(): Empty instance.", cimg_instance); + if (k>=size()) return max(); CImg arr(*this,false); ulongT l = 0, ir = size() - 1; for ( ; ; ) { @@ -25348,7 +27812,7 @@ /** \param variance_method Method used to compute the variance (see variance(const unsigned int) const). \note Because of structures such as edges in images it is - recommanded to use a robust variance estimation. The variance of the + recommended to use a robust variance estimation. The variance of the noise is estimated by computing the variance of the Laplacian \f$(\Delta I)^2 \f$ scaled by a factor \f$c\f$ insuring \f$ c E[(\Delta I)^2]= \sigma^2\f$ where \f$\sigma\f$ is the noise variance. @@ -25472,21 +27936,55 @@ return _eval(0,expression,x,y,z,c,list_inputs,list_outputs); } + + // Fast function to evaluate simple common expressions (return 'true' in case of success). + template + bool __eval(const char *const expression, t &res) const { + if (!expression || !*expression) { res = (t)0; return true; } + const char c = *expression; + bool is_success = false; + char c1, end; + double val; + if (c>='0' && c<='9') { // Possible value + if (!expression[1]) { // Single digit + res = (t)(c - '0'); + is_success = true; + } else if (std::sscanf(expression,"%lf%c",&val,&end)==1) { // Single value + res = (t)val; + is_success = true; + } + } else if ((c=='+' || c=='-' || c=='!') && // +Value, -Value or !Value + (c1=expression[1])>='0' && c1<='0') { + if (!expression[2]) { // [+-!] + Single digit + const int ival = c1 - '0'; + res = (t)(c=='+'?ival:c=='-'?-ival:!ival); + is_success = true; + } else if (std::sscanf(expression + 1,"%lf%c",&val,&end)==1) { // [+-!] Single value + res = (t)(c=='+'?val:c=='-'?-val:(double)!val); + is_success = true; + } + } else if (!expression[1]) switch (*expression) { // Other common single-char expressions + case 'w' : res = (t)_width; is_success = true; break; + case 'h' : res = (t)_height; is_success = true; break; + case 'd' : res = (t)_depth; is_success = true; break; + case 's' : res = (t)_spectrum; is_success = true; break; + case 'r' : res = (t)_is_shared; is_success = true; break; + } + return is_success; + } + double _eval(CImg *const img_output, const char *const expression, const double x, const double y, const double z, const double c, const CImgList *const list_inputs, CImgList *const list_outputs) const { if (!expression || !*expression) return 0; - if (!expression[1]) switch (*expression) { // Single-char optimization - case 'w' : return (double)_width; - case 'h' : return (double)_height; - case 'd' : return (double)_depth; - case 's' : return (double)_spectrum; - case 'r' : return (double)_is_shared; - } + double _val = 0; + if (__eval(expression,_val)) return _val; _cimg_math_parser mp(expression + (*expression=='>' || *expression=='<' || *expression=='*' || *expression==':'),"eval", *this,img_output,list_inputs,list_outputs,false); + mp.begin_t(); const double val = mp(x,y,z,c); + mp.end_t(); mp.end(); return val; } @@ -25522,19 +28020,16 @@ void _eval(CImg& output, CImg *const img_output, const char *const expression, const double x, const double y, const double z, const double c, const CImgList *const list_inputs, CImgList *const list_outputs) const { - if (!expression || !*expression) { output.assign(1); *output = 0; } - if (!expression[1]) switch (*expression) { // Single-char optimization - case 'w' : output.assign(1); *output = (t)_width; break; - case 'h' : output.assign(1); *output = (t)_height; break; - case 'd' : output.assign(1); *output = (t)_depth; break; - case 's' : output.assign(1); *output = (t)_spectrum; break; - case 'r' : output.assign(1); *output = (t)_is_shared; break; - } + if (!expression || !*expression) { output.assign(1); *output = 0; return; } + double _val = 0; + if (__eval(expression,_val)) { output.assign(1); *output = _val; return; } _cimg_math_parser mp(expression + (*expression=='>' || *expression=='<' || *expression=='*' || *expression==':'),"eval", *this,img_output,list_inputs,list_outputs,false); output.assign(1,std::max(1U,mp.result_dim)); + mp.begin_t(); mp(x,y,z,c,output._data); + mp.end_t(); mp.end(); } @@ -25564,34 +28059,43 @@ CImg res(1,xyzc.size()/4); if (!expression || !*expression) return res.fill(0); _cimg_math_parser mp(expression,"eval",*this,output,list_inputs,list_outputs,false); -#ifdef cimg_use_openmp + +#if cimg_use_openmp!=0 + unsigned int tid = 0; cimg_pragma_openmp(parallel if (res._height>=512)) { - _cimg_math_parser - _mp = omp_get_thread_num()?mp:_cimg_math_parser(), - &lmp = omp_get_thread_num()?_mp:mp; + _cimg_math_parser *_mp = 0; + cimg_pragma_openmp(critical(_eval)) { _mp = !tid?&mp:new _cimg_math_parser(mp); ++tid; } + _cimg_math_parser &lmp = *_mp; + cimg_pragma_openmp(barrier) + lmp.begin_t(); cimg_pragma_openmp(for) - for (unsigned int i = 0; i[min, max, mean, variance, xmin, ymin, zmin, cmin, xmax, ymax, zmax, cmax, sum, product]. @@ -25671,10 +28175,12 @@ cimg_for(*this,ptrs,T) { const double val = (double)cimg::abs(*ptrs); if (val>res) res = val; } } break; case 1 : { - cimg_for(*this,ptrs,T) res+=(double)cimg::abs(*ptrs); + cimg_pragma_openmp(parallel for reduction(+:res) cimg_openmp_if_size(size(),8192)) + cimg_rof(*this,ptrs,T) res+=(double)cimg::abs(*ptrs); } break; default : { - cimg_for(*this,ptrs,T) res+=(double)cimg::sqr(*ptrs); + cimg_pragma_openmp(parallel for reduction(+:res) cimg_openmp_if_size(size(),8192)) + cimg_rof(*this,ptrs,T) res+=(double)cimg::sqr(*ptrs); res = (double)std::sqrt(res); } } @@ -25731,17 +28237,9 @@ **/ template double dot(const CImg& img) const { - if (is_empty()) - throw CImgInstanceException(_cimg_instance - "dot(): Empty instance.", - cimg_instance); - if (!img) - throw CImgArgumentException(_cimg_instance - "dot(): Empty specified image.", - cimg_instance); - const ulongT nb = std::min(size(),img.size()); double res = 0; + cimg_pragma_openmp(parallel for reduction(+:res) cimg_openmp_if_size(nb,8192)) for (ulongT off = 0; off& vector() { - return unroll('y'); - } - - //! Unroll pixel values along axis \c y \newinstance. - CImg get_vector() const { - return get_unroll('y'); - } - - //! Resize image to become a scalar square matrix. - /** - **/ - CImg& matrix() { - const ulongT siz = size(); - switch (siz) { - case 1 : break; - case 4 : _width = _height = 2; break; - case 9 : _width = _height = 3; break; - case 16 : _width = _height = 4; break; - case 25 : _width = _height = 5; break; - case 36 : _width = _height = 6; break; - case 49 : _width = _height = 7; break; - case 64 : _width = _height = 8; break; - case 81 : _width = _height = 9; break; - case 100 : _width = _height = 10; break; - default : { - ulongT i = 11, i2 = i*i; - while (i2 get_matrix() const { - return (+*this).matrix(); - } - - //! Resize image to become a symmetric tensor. - /** - **/ - CImg& tensor() { - return get_tensor().move_to(*this); - } - - //! Resize image to become a symmetric tensor \newinstance. - CImg get_tensor() const { - CImg res; - const ulongT siz = size(); - switch (siz) { - case 1 : break; - case 3 : - res.assign(2,2); - res(0,0) = (*this)(0); - res(1,0) = res(0,1) = (*this)(1); - res(1,1) = (*this)(2); - break; - case 6 : - res.assign(3,3); - res(0,0) = (*this)(0); - res(1,0) = res(0,1) = (*this)(1); - res(2,0) = res(0,2) = (*this)(2); - res(1,1) = (*this)(3); - res(2,1) = res(1,2) = (*this)(4); - res(2,2) = (*this)(5); - break; - default : - throw CImgInstanceException(_cimg_instance - "tensor(): Invalid instance size (does not define a 1x1, 2x2 or 3x3 tensor).", - cimg_instance); - } - return res; - } - //! Resize image to become a diagonal matrix. /** \note Transform the image as a diagonal matrix so that each of its initial value becomes a diagonal coefficient. @@ -26045,29 +28460,6 @@ throw CImgInstanceException(_cimg_instance "invert(): Instance is not a square matrix.", cimg_instance); -#ifdef cimg_use_lapack - int INFO = (int)use_LU, N = _width, LWORK = 4*N, *const IPIV = new int[N]; - Tfloat - *const lapA = new Tfloat[N*N], - *const WORK = new Tfloat[LWORK]; - cimg_forXY(*this,k,l) lapA[k*N + l] = (Tfloat)((*this)(k,l)); - cimg::getrf(N,lapA,IPIV,INFO); - if (INFO) - cimg::warn(_cimg_instance - "invert(): LAPACK function dgetrf_() returned error code %d.", - cimg_instance, - INFO); - else { - cimg::getri(N,lapA,IPIV,WORK,LWORK,INFO); - if (INFO) - cimg::warn(_cimg_instance - "invert(): LAPACK function dgetri_() returned error code %d.", - cimg_instance, - INFO); - } - if (!INFO) cimg_forXY(*this,k,l) (*this)(k,l) = (T)(lapA[k*N + l]); else fill(0); - delete[] IPIV; delete[] lapA; delete[] WORK; -#else const double dete = _width>3?-1.:det(); if (dete!=0. && _width==2) { const double @@ -26084,26 +28476,44 @@ _data[3] = (T)((h*c - i*b)/dete), _data[4] = (T)((i*a - c*g)/dete), _data[5] = (T)((g*b - a*h)/dete); _data[6] = (T)((b*f - e*c)/dete), _data[7] = (T)((d*c - a*f)/dete), _data[8] = (T)((a*e - d*b)/dete); } else { - if (use_LU) { // LU-based inverse computation - CImg A(*this,false), indx, col(1,_width); + +#ifdef cimg_use_lapack + int INFO = (int)use_LU, N = _width, LWORK = 4*N, *const IPIV = new int[N]; + Tfloat + *const lapA = new Tfloat[N*N], + *const WORK = new Tfloat[LWORK]; + cimg_forXY(*this,k,l) lapA[k*N + l] = (Tfloat)((*this)(k,l)); + cimg::getrf(N,lapA,IPIV,INFO); + if (INFO) + cimg::warn(_cimg_instance + "invert(): LAPACK function dgetrf_() returned error code %d.", + cimg_instance, + INFO); + else { + cimg::getri(N,lapA,IPIV,WORK,LWORK,INFO); + if (INFO) + cimg::warn(_cimg_instance + "invert(): LAPACK function dgetri_() returned error code %d.", + cimg_instance, + INFO); + } + if (!INFO) cimg_forXY(*this,k,l) (*this)(k,l) = (T)(lapA[k*N + l]); else fill(0); + delete[] IPIV; delete[] lapA; delete[] WORK; +#else + if (use_LU) { // LU-based + CImg A(*this,false), indx; bool d; A._LU(indx,d); + cimg_pragma_openmp(parallel for cimg_openmp_if_size(_width*_height,16*16)) cimg_forX(*this,j) { - col.fill(0); + CImg col(1,_width,1,1,0); col(j) = 1; col._solve(A,indx); cimg_forX(*this,i) (*this)(j,i) = (T)col(i); } - } else { // SVD-based inverse computation - CImg U(_width,_width), S(1,_width), V(_width,_width); - SVD(U,S,V,false); - U.transpose(); - cimg_forY(S,k) if (S[k]!=0) S[k]=1/S[k]; - S.diagonal(); - *this = V*S*U; - } - } + } else pseudoinvert(false); // SVD-based #endif + } return *this; } @@ -26115,17 +28525,33 @@ //! Compute the Moore-Penrose pseudo-inverse of the instance image, viewed as a matrix. /** **/ - CImg& pseudoinvert() { - return get_pseudoinvert().move_to(*this); + CImg& pseudoinvert(const bool use_LU=false) { + return get_pseudoinvert(use_LU).move_to(*this); } //! Compute the Moore-Penrose pseudo-inverse of the instance image, viewed as a matrix \newinstance. - CImg get_pseudoinvert() const { + CImg get_pseudoinvert(const bool use_LU=false) const { + + // LU-based method. + if (use_LU) { + CImg AtA(width(),width()); + cimg_pragma_openmp(parallel for cimg_openmp_if_size(_width*_height,128*128)) + cimg_forY(AtA,i) + for (int j = 0; j<=i; ++j) { + double res = 0; + cimg_forY(*this,k) res+=(*this)(i,k)*(*this)(j,k); + AtA(j,i) = AtA(i,j) = (Tfloat)res; + } + AtA.invert(true); + return AtA*get_transpose(); + } + + // SVD-based method. CImg U, S, V; - SVD(U,S,V); - const Tfloat tolerance = (sizeof(Tfloat)<=4?5.96e-8f:1.11e-16f)*std::max(_width,_height)*S.max(); + SVD(U,S,V,false); + const Tfloat epsilon = (sizeof(Tfloat)<=4?5.96e-8f:1.11e-16f)*std::max(_width,_height)*S.max(); cimg_forX(V,x) { - const Tfloat s = S(x), invs = s>tolerance?1/s:0; + const Tfloat s = S(x), invs = s>epsilon?1/s:0; cimg_forY(V,y) V(x,y)*=invs; } return V*U.transpose(); @@ -26134,10 +28560,13 @@ //! Solve a system of linear equations. /** \param A Matrix of the linear system. - \note Solve \c AX=B where \c B=*this. + \param use_LU In case of non square system (least-square solution), + choose between SVD-based (\c false) or LU-based (\c true) method. + LU method is faster for large matrices, but numerically less stable. + \note Solve \c AX = B where \c B=*this. **/ template - CImg& solve(const CImg& A) { + CImg& solve(const CImg& A, const bool use_LU=false) { if (_depth!=1 || _spectrum!=1 || _height!=A._height || A._depth!=1 || A._spectrum!=1) throw CImgArgumentException(_cimg_instance "solve(): Instance and specified matrix (%u,%u,%u,%u,%p) have " @@ -26145,12 +28574,37 @@ cimg_instance, A._width,A._height,A._depth,A._spectrum,A._data); typedef _cimg_Ttfloat Ttfloat; - if (A._width==A._height) { // Classical linear system - if (_width!=1) { - CImg res(_width,A._width); - cimg_forX(*this,i) res.draw_image(i,get_column(i).solve(A)); - return res.move_to(*this); - } + + if (A.size()==1) return (*this)/=A[0]; + if (A._width==2 && A._height==2 && _height==2) { // 2x2 linear system + const double a = (double)A[0], b = (double)A[1], c = (double)A[2], d = (double)A[3], + fa = std::fabs(a), fb = std::fabs(b), fc = std::fabs(c), fd = std::fabs(d), + det = a*d - b*c, fM = cimg::max(fa,fb,fc,fd); + if (fM==fa) + cimg_pragma_openmp(parallel for cimg_openmp_if(_width>=256)) + cimg_forX(*this,k) { + const double u = (double)(*this)(k,0), v = (double)(*this)(k,1), y = (a*v - c*u)/det; + (*this)(k,0) = (T)((u - b*y)/a); (*this)(k,1) = (T)y; + } else if (fM==fc) + cimg_pragma_openmp(parallel for cimg_openmp_if(_width>=256)) + cimg_forX(*this,k) { + const double u = (double)(*this)(k,0), v = (double)(*this)(k,1), y = (a*v - c*u)/det; + (*this)(k,0) = (T)((v - d*y)/c); (*this)(k,1) = (T)y; + } else if (fM==fb) + cimg_pragma_openmp(parallel for cimg_openmp_if(_width>=256)) + cimg_forX(*this,k) { + const double u = (double)(*this)(k,0), v = (double)(*this)(k,1), x = (d*u - b*v)/det; + (*this)(k,0) = (T)x; (*this)(k,1) = (T)((u - a*x)/b); + } else + cimg_pragma_openmp(parallel for cimg_openmp_if(_width>=256)) + cimg_forX(*this,k) { + const double u = (double)(*this)(k,0), v = (double)(*this)(k,1), x = (d*u - b*v)/det; + (*this)(k,0) = (T)x; (*this)(k,1) = (T)((v - c*x)/d); + } + return *this; + } + + if (A._width==A._height) { // Square linear system #ifdef cimg_use_lapack char TRANS = 'N'; int INFO, N = _height, LWORK = 4*N, *const IPIV = new int[N]; @@ -26159,38 +28613,38 @@ *const lapB = new Ttfloat[N], *const WORK = new Ttfloat[LWORK]; cimg_forXY(A,k,l) lapA[k*N + l] = (Ttfloat)(A(k,l)); - cimg_forY(*this,i) lapB[i] = (Ttfloat)((*this)(i)); - cimg::getrf(N,lapA,IPIV,INFO); - if (INFO) - cimg::warn(_cimg_instance - "solve(): LAPACK library function dgetrf_() returned error code %d.", - cimg_instance, - INFO); - - if (!INFO) { - cimg::getrs(TRANS,N,lapA,IPIV,lapB,INFO); + cimg_forX(*this,i) { + cimg_forY(*this,j) lapB[j] = (Ttfloat)((*this)(i,j)); + cimg::getrf(N,lapA,IPIV,INFO); if (INFO) cimg::warn(_cimg_instance - "solve(): LAPACK library function dgetrs_() returned error code %d.", + "solve(): LAPACK library function dgetrf_() returned error code %d.", cimg_instance, INFO); + else { + cimg::getrs(TRANS,N,lapA,IPIV,lapB,INFO); + if (INFO) + cimg::warn(_cimg_instance + "solve(): LAPACK library function dgetrs_() returned error code %d.", + cimg_instance, + INFO); + } + if (!INFO) cimg_forY(*this,j) (*this)(i,j) = (T)(lapB[j]); else cimg_forY(*this,j) (*this)(i,j) = (T)0; } - if (!INFO) cimg_forY(*this,i) (*this)(i) = (T)(lapB[i]); else fill(0); delete[] IPIV; delete[] lapA; delete[] lapB; delete[] WORK; #else CImg lu(A,false); CImg indx; bool d; lu._LU(indx,d); - _solve(lu,indx); + CImg res(_width,A._width); + cimg_pragma_openmp(parallel for cimg_openmp_if_size(_width*_height,16)) + cimg_forX(*this,i) res.draw_image(i,get_column(i)._solve(lu,indx)); + res.move_to(*this); #endif } else { // Least-square solution for non-square systems + #ifdef cimg_use_lapack - if (_width!=1) { - CImg res(_width,A._width); - cimg_forX(*this,i) res.draw_image(i,get_column(i).solve(A)); - return res.move_to(*this); - } char TRANS = 'N'; int INFO, N = A._width, M = A._height, LWORK = -1, LDA = M, LDB = M, NRHS = _width; Ttfloat WORK_QUERY; @@ -26209,13 +28663,11 @@ cimg_instance, INFO); assign(NRHS, N); - if (!INFO) - cimg_forXY(*this,k,l) (*this)(k,l) = (T)lapB[k*M + l]; - else - assign(A.get_pseudoinvert()*(*this)); + if (!INFO) cimg_forXY(*this,k,l) (*this)(k,l) = (T)lapB[k*M + l]; + else (A.get_pseudoinvert(use_LU)*(*this)).move_to(*this); delete[] lapA; delete[] lapB; delete[] WORK; #else - assign(A.get_pseudoinvert()*(*this)); + (A.get_pseudoinvert(use_LU)*(*this)).move_to(*this); #endif } return *this; @@ -26223,19 +28675,20 @@ //! Solve a system of linear equations \newinstance. template - CImg<_cimg_Ttfloat> get_solve(const CImg& A) const { - return CImg<_cimg_Ttfloat>(*this,false).solve(A); + CImg<_cimg_Ttfloat> get_solve(const CImg& A, const bool use_LU=false) const { + typedef _cimg_Ttfloat Ttfloat; + return CImg(*this,false).solve(A,use_LU); } template CImg& _solve(const CImg& A, const CImg& indx) { typedef _cimg_Ttfloat Ttfloat; - const int N = (int)size(); + const int N = height(); int ii = -1; Ttfloat sum; for (int i = 0; i=0) for (int j = ii; j<=i - 1; ++j) sum-=A(j,i)*(*this)(j); else if (sum!=0) ii = i; @@ -26305,11 +28758,9 @@ case 2 : { const double a = (*this)[0], b = (*this)[1], c = (*this)[2], d = (*this)[3], e = a + d; double f = e*e - 4*(a*d - b*c); - if (f<0) - cimg::warn(_cimg_instance - "eigen(): Complex eigenvalues found.", - cimg_instance); - + if (f<0) cimg::warn(_cimg_instance + "eigen(): Complex eigenvalues found.", + cimg_instance); f = std::sqrt(f); const double l1 = 0.5*(e - f), @@ -26349,71 +28800,78 @@ **/ template const CImg& symmetric_eigen(CImg& val, CImg& vec) const { - if (is_empty()) { val.assign(); vec.assign(); } - else { -#ifdef cimg_use_lapack - char JOB = 'V', UPLO = 'U'; - int N = _width, LWORK = 4*N, INFO; - Tfloat - *const lapA = new Tfloat[N*N], - *const lapW = new Tfloat[N], - *const WORK = new Tfloat[LWORK]; - cimg_forXY(*this,k,l) lapA[k*N + l] = (Tfloat)((*this)(k,l)); - cimg::syev(JOB,UPLO,N,lapA,lapW,WORK,LWORK,INFO); - if (INFO) - cimg::warn(_cimg_instance - "symmetric_eigen(): LAPACK library function dsyev_() returned error code %d.", - cimg_instance, - INFO); + if (is_empty()) { val.assign(); vec.assign(); return *this; } + if (_width!=_height || _depth>1 || _spectrum>1) + throw CImgInstanceException(_cimg_instance + "eigen(): Instance is not a square matrix.", + cimg_instance); + val.assign(1,_width); + vec.assign(_width,_width); - val.assign(1,N); - vec.assign(N,N); - if (!INFO) { - cimg_forY(val,i) val(i) = (T)lapW[N - 1 -i]; - cimg_forXY(vec,k,l) vec(k,l) = (T)(lapA[(N - 1 - k)*N + l]); - } else { val.fill(0); vec.fill(0); } - delete[] lapA; delete[] lapW; delete[] WORK; -#else - if (_width!=_height || _depth>1 || _spectrum>1) - throw CImgInstanceException(_cimg_instance - "eigen(): Instance is not a square matrix.", - cimg_instance); + if (_width==1) { val[0] = cimg::abs((*this)[0]); vec[0] = 1; return *this; } + if (_width==2) { + const double + a = (*this)[0], b = (*this)[1], c = (*this)[2], d = (*this)[3], + e = a + d, f = std::sqrt(std::max(e*e - 4*(a*d - b*c),0.0)), + l1 = 0.5*(e - f), l2 = 0.5*(e + f), + n = std::sqrt(cimg::sqr(l2 - a) + b*b); + val[0] = (t)l2; + val[1] = (t)l1; + if (n>0) { vec[0] = (t)(b/n); vec[2] = (t)((l2 - a)/n); } else { vec[0] = 1; vec[2] = 0; } + vec[1] = -vec[2]; + vec[3] = vec[0]; + return *this; + } - val.assign(1,_width); - if (vec._data) vec.assign(_width,_width); - if (_width<3) { - eigen(val,vec); - if (_width==2) { vec[1] = -vec[2]; vec[3] = vec[0]; } // Force orthogonality for 2x2 matrices - return *this; - } - CImg V(_width,_width); - Tfloat M = 0, m = (Tfloat)min_max(M), maxabs = cimg::max((Tfloat)1,cimg::abs(m),cimg::abs(M)); - (CImg(*this,false)/=maxabs).SVD(vec,val,V,false); - if (maxabs!=1) val*=maxabs; - - bool is_ambiguous = false; - float eig = 0; - cimg_forY(val,p) { // check for ambiguous cases - if (val[p]>eig) eig = (float)val[p]; - t scal = 0; - cimg_forY(vec,y) scal+=vec(p,y)*V(p,y); - if (cimg::abs(scal)<0.9f) is_ambiguous = true; - if (scal<0) val[p] = -val[p]; - } - if (is_ambiguous) { - ++(eig*=2); - SVD(vec,val,V,false,40,eig); - val-=eig; - } - CImg permutations; // sort eigenvalues in decreasing order - CImg tmp(_width); - val.sort(permutations,false); - cimg_forY(vec,k) { - cimg_forY(permutations,y) tmp(y) = vec(permutations(y),k); - std::memcpy(vec.data(0,k),tmp._data,sizeof(t)*_width); - } -#endif +#ifdef cimg_use_lapack + char JOB = 'V', UPLO = 'U'; + int N = _width, LWORK = 4*N, INFO; + Tfloat + *const lapA = new Tfloat[N*N], + *const lapW = new Tfloat[N], + *const WORK = new Tfloat[LWORK]; + cimg_forXY(*this,k,l) lapA[k*N + l] = (Tfloat)((*this)(k,l)); + cimg::syev(JOB,UPLO,N,lapA,lapW,WORK,LWORK,INFO); + if (INFO) + cimg::warn(_cimg_instance + "symmetric_eigen(): LAPACK library function dsyev_() returned error code %d.", + cimg_instance, + INFO); + if (!INFO) { + cimg_forY(val,i) val(i) = (T)lapW[N - 1 -i]; + cimg_forXY(vec,k,l) vec(k,l) = (T)(lapA[(N - 1 - k)*N + l]); + } else { val.fill(0); vec.fill(0); } + delete[] lapA; delete[] lapW; delete[] WORK; + +#else + CImg V(_width,_width); + Tfloat M = 0, m = (Tfloat)min_max(M), maxabs = cimg::max((Tfloat)1,cimg::abs(m),cimg::abs(M)); + (CImg(*this,false)/=maxabs).SVD(vec,val,V,false); + if (maxabs!=1) val*=maxabs; + + bool is_ambiguous = false; + float eig = 0; + cimg_forY(val,p) { // Check for ambiguous cases + if (val[p]>eig) eig = (float)val[p]; + t scal = 0; + cimg_forY(vec,y) scal+=vec(p,y)*V(p,y); + if (cimg::abs(scal)<0.9f) is_ambiguous = true; + if (scal<0) val[p] = -val[p]; + } + if (is_ambiguous) { + ++(eig*=2); + SVD(vec,val,V,false,40,eig); + val-=eig; + } + + CImg permutations; // Sort eigenvalues in decreasing order + CImg tmp(_width); + val.sort(permutations,false); + cimg_forY(vec,k) { + cimg_forY(permutations,y) tmp(y) = vec(permutations(y),k); + std::memcpy(vec.data(0,k),tmp._data,sizeof(t)*_width); } +#endif return *this; } @@ -26584,6 +29042,9 @@ template const CImg& SVD(CImg& U, CImg& S, CImg& V, const bool sorting=true, const unsigned int max_iteration=40, const float lambda=0) const { + typedef _cimg_Ttfloat Ttfloat; + const Ttfloat epsilon = (Ttfloat)1e-25; + if (is_empty()) { U.assign(); S.assign(); V.assign(); } else { U = *this; @@ -26594,16 +29055,24 @@ if (S.size()<_width) S.assign(1,_width); if (V._width<_width || V._height<_height) V.assign(_width,_width); CImg rv1(_width); - t anorm = 0, c, f, g = 0, h, s, scale = 0; - int l = 0, nm = 0; + Ttfloat anorm = 0, c, f, g = 0, h, s, scale = 0; + int l = 0; cimg_forX(U,i) { - l = i + 1; rv1[i] = scale*g; g = s = scale = 0; + l = i + 1; + rv1[i] = scale*g; + g = s = scale = 0; if (i=0?-1:1)*std::sqrt(s)); h=f*g-s; U(i,i) = f-g; + for (int k = i; k=0?-1:1)*std::sqrt(s)); + h = f*g - s; + U(i,i) = f - g; for (int j = l; j=0?-1:1)*std::sqrt(s)); h = f*g-s; U(l,i) = f-g; - for (int k = l; k=0?-1:1)*std::sqrt(s)); + h = f*g - s; + U(l,i) = f - g; + for (int k = l; k=0; --i) { - if (i=0; --i) { - l = i + 1; g = S[i]; + l = i + 1; + g = S[i]; for (int j = l; j=0; --k) { + int nm = 0; for (unsigned int its = 0; its=1; --l) { @@ -26672,12 +29152,23 @@ if ((cimg::abs(S[nm]) + anorm)==anorm) break; } if (flag) { - c = 0; s = 1; + c = 0; + s = 1; for (int i = l; i<=k; ++i) { - f = s*rv1[i]; rv1[i] = c*rv1[i]; + f = s*rv1[i]; + rv1[i] = c*rv1[i]; if ((cimg::abs(f) + anorm)==anorm) break; - g = S[i]; h = cimg::_hypot(f,g); S[i] = h; h = 1/h; c = g*h; s = -f*h; - cimg_forY(U,j) { const t y = U(nm,j), z = U(i,j); U(nm,j) = y*c + z*s; U(i,j) = z*c - y*s; } + g = S[i]; + h = cimg::_hypot(f,g); + S[i] = h; + h = 1/h; + c = g*h; + s = -f*h; + cimg_forY(U,j) { + const t y = U(nm,j), z = U(i,j); + U(nm,j) = y*c + z*s; + U(i,j) = z*c - y*s; + } } } @@ -26685,25 +29176,48 @@ if (l==k) { if (z<0) { S[k] = -z; cimg_forX(U,j) V(k,j) = -V(k,j); } break; } nm = k - 1; t x = S[l], y = S[nm]; - g = rv1[nm]; h = rv1[k]; - f = ((y - z)*(y + z)+(g - h)*(g + h))/std::max((t)1e-25,2*h*y); - g = cimg::_hypot(f,(t)1); - f = ((x - z)*(x + z)+h*((y/(f + (f>=0?g:-g))) - h))/std::max((t)1e-25,x); + g = rv1[nm]; + h = rv1[k]; + f = ((y - z)*(y + z) + (g - h)*(g + h))/std::max(epsilon,(Ttfloat)2*h*y); + g = cimg::_hypot(f,(Ttfloat)1); + f = ((x - z)*(x + z) + h*((y/(f + (f>=0?g:-g))) - h))/std::max(epsilon,(Ttfloat)x); c = s = 1; for (int j = l; j<=nm; ++j) { const int i = j + 1; - g = rv1[i]; h = s*g; g = c*g; - t y = S[i]; - t z = cimg::_hypot(f,h); - rv1[j] = z; c = f/std::max((t)1e-25,z); s = h/std::max((t)1e-25,z); - f = x*c + g*s; g = g*c - x*s; h = y*s; y*=c; - cimg_forX(U,jj) { const t x = V(j,jj), z = V(i,jj); V(j,jj) = x*c + z*s; V(i,jj) = z*c - x*s; } - z = cimg::_hypot(f,h); S[j] = z; - if (z) { z = 1/std::max((t)1e-25,z); c = f*z; s = h*z; } - f = c*g + s*y; x = c*y - s*g; - cimg_forY(U,jj) { const t y = U(j,jj); z = U(i,jj); U(j,jj) = y*c + z*s; U(i,jj) = z*c - y*s; } - } - rv1[l] = 0; rv1[k]=f; S[k]=x; + g = rv1[i]; + h = s*g; + g = c*g; + t y1 = S[i], z1 = cimg::_hypot(f,h); + rv1[j] = z1; + c = f/std::max(epsilon,(Ttfloat)z1); + s = h/std::max(epsilon,(Ttfloat)z1); + f = x*c + g*s; + g = g*c - x*s; + h = y1*s; + y1*=c; + cimg_forX(U,jj) { + const t x2 = V(j,jj), z2 = V(i,jj); + V(j,jj) = x2*c + z2*s; + V(i,jj) = z2*c - x2*s; + } + z1 = cimg::_hypot(f,h); + S[j] = z1; + if (z1) { + z1 = 1/std::max(epsilon,(Ttfloat)z1); + c = f*z1; + s = h*z1; + } + f = c*g + s*y1; + x = c*y1 - s*g; + cimg_forY(U,jj) { + const t y2 = U(j,jj), z2 = U(i,jj); + U(j,jj) = y2*c + z2*s; + U(i,jj) = z2*c - y2*s; + } + } + rv1[l] = 0; + rv1[k] = f; + S[k] = x; } } @@ -26744,32 +29258,37 @@ CImg vv(N); indx.assign(N); d = true; + + bool return0 = false; + cimg_pragma_openmp(parallel for cimg_openmp_if(_width*_height>=512)) cimg_forX(*this,i) { Tfloat vmax = 0; cimg_forX(*this,j) { const Tfloat tmp = cimg::abs((*this)(j,i)); if (tmp>vmax) vmax = tmp; } - if (vmax==0) { indx.fill(0); return fill(0); } - vv[i] = 1/vmax; + if (vmax==0) return0 = true; else vv[i] = 1/vmax; } + if (return0) { indx.fill(0); return fill(0); } + cimg_forX(*this,j) { for (int i = 0; i=vmax) { vmax=tmp; imax=i; } + if (tmp>=vmax) { vmax = tmp; imax = i; } } if (j!=imax) { cimg_forX(*this,k) cimg::swap((*this)(k,imax),(*this)(k,j)); - d =!d; + d = !d; vv[imax] = vv[j]; } indx[j] = (t)imax; @@ -26779,17 +29298,161 @@ for (int i = j + 1; i=3 = orthogonal matching pursuit where an orthogonal projection step is performed + every 'method-2' iterations. + \param max_iter Sets the max number of iterations processed for each signal. + If set to '0' (default), 'max_iter' is set to the number of dictionnary columns. + (only meaningful for matching pursuit and its variants). + \param max_residual Gives a stopping criterion on signal reconstruction accuracy. + (only meaningful for matching pursuit and its variants). + \return A matrix W whose columns correspond to the sparse weights of associated to each input matrix column. + Thus, the matrix product D*W is an approximation of the input matrix. + **/ + template + CImg& project_matrix(const CImg& dictionnary, const unsigned int method=0, + const unsigned int max_iter=0, const double max_residual=1e-6) { + return get_project_matrix(dictionnary,method,max_iter,max_residual).move_to(*this); + } + + template + CImg get_project_matrix(const CImg& dictionnary, const unsigned int method=0, + const unsigned int max_iter=0, const double max_residual=1e-6) const { + if (_depth!=1 || _spectrum!=1) + throw CImgInstanceException(_cimg_instance + "project_matrix(): Instance image is not a matrix.", + cimg_instance); + if (dictionnary._height!=_height || dictionnary._depth!=1 || dictionnary._spectrum!=1) + throw CImgArgumentException(_cimg_instance + "project_matrix(): Specified dictionnary (%u,%u,%u,%u) has an invalid size.", + cimg_instance, + dictionnary._width,dictionnary._height,dictionnary._depth,dictionnary._spectrum); + + if (!method) return get_solve(dictionnary,true); + CImg W(_width,dictionnary._width,1,1,0); + + // Compute dictionnary norm and normalize it. + CImg D(dictionnary,false), Dnorm(D._width); + cimg_pragma_openmp(parallel for cimg_openmp_if(_width>=2 && _width*_height>=32)) + cimg_forX(Dnorm,d) { + Tfloat norm = 0; + cimg_forY(D,y) norm+=cimg::sqr(D(d,y)); + Dnorm[d] = std::max((Tfloat)1e-8,std::sqrt(norm)); + } + cimg_forXY(D,d,y) D(d,y)/=Dnorm[d]; + + // Matching pursuit. + const unsigned int proj_step = method<3?1:method - 2; + bool is_orthoproj = false; + + cimg_pragma_openmp(parallel for cimg_openmp_if(_width>=2 && _width*_height>=32)) + cimg_forX(*this,x) { + CImg S = get_column(x); + const CImg S0 = method<2?CImg():S; + Tfloat residual = S.magnitude()/S._height; + const unsigned int nmax = max_iter?max_iter:D._width; + + for (unsigned int n = 0; nmax_residual; ++n) { + + // Find best matching column in D. + int dmax = 0; + Tfloat absdotmax = 0, dotmax = 0; + cimg_pragma_openmp(parallel for cimg_openmp_if(D._width>=2 && D._width*D._height>=32)) + cimg_forX(D,d) { + Tfloat _dot = 0; + cimg_forY(D,y) _dot+=S[y]*D(d,y); + Tfloat absdot = cimg::abs(_dot); + cimg_pragma_openmp(critical(get_project_matrix)) { + if (absdot>absdotmax) { + absdotmax = absdot; + dotmax = _dot; + dmax = d; + } + } + } + + if (!n || method<3 || n%proj_step) { + // Matching Pursuit: Subtract component to signal. + W(x,dmax)+=dotmax; + residual = 0; + cimg_forY(S,y) { + S[y]-=dotmax*D(dmax,y); + residual+=cimg::sqr(S[y]); + } + residual = std::sqrt(residual)/S._height; + is_orthoproj = false; + + } else { + // Orthogonal Matching Pursuit: Orthogonal projection step. + W(x,dmax) = 1; // Used as a marker only. + unsigned int nbW = 0; + cimg_forY(W,d) if (W(x,d)) ++nbW; + CImg sD(nbW,D._height); + CImg inds(nbW); + int sd = 0; + cimg_forY(W,d) if (W(x,d)) { + cimg_forY(sD,y) sD(sd,y) = D(d,y); + inds[sd++] = d; + } + S0.get_solve(sD,true).move_to(sD); // sD is now a one-column vector of weights + + // Recompute residual signal. + S = S0; + cimg_forY(sD,k) { + const Tfloat weight = sD[k]; + const unsigned int ind = inds[k]; + W(x,ind) = weight; + cimg_forY(S,y) S[y]-=weight*D(ind,y); + } + residual = S.magnitude()/S._height; + is_orthoproj = true; + } + } + + // Perform last orthoprojection step if needed. + if (method>=2 && !is_orthoproj) { + unsigned int nbW = 0; + cimg_forY(W,d) if (W(x,d)) ++nbW; + if (nbW) { // Avoid degenerated case where 0 coefs are used + CImg sD(nbW,D._height); + CImg inds(nbW); + int sd = 0; + cimg_forY(W,d) if (W(x,d)) { + cimg_forY(sD,y) sD(sd,y) = D(d,y); + inds[sd++] = d; + } + S0.get_solve(sD,true).move_to(sD); + cimg_forY(sD,k) W(x,inds[k]) = sD[k]; + } + } + } + + // Normalize resulting coefficients according to initial (non-normalized) dictionnary. + cimg_forXY(W,x,y) W(x,y)/=Dnorm[y]; + return W; + } + //! Compute minimal path in a graph, using the Dijkstra algorithm. /** \param distance An object having operator()(unsigned int i, unsigned int j) which returns distance between two nodes (i,j). \param nb_nodes Number of graph nodes. - \param starting_node Indice of the starting node. - \param ending_node Indice of the ending node (set to ~0U to ignore ending node). - \param previous_node Array that gives the previous node indice in the path to the starting node + \param starting_node Index of the starting node. + \param ending_node Index of the ending node (set to ~0U to ignore ending node). + \param previous_node Array that gives the previous node index in the path to the starting node (optional parameter). \return Array of distances of each node to the starting node. **/ @@ -26798,7 +29461,7 @@ const unsigned int starting_node, const unsigned int ending_node, CImg& previous_node) { if (starting_node>=nb_nodes) - throw CImgArgumentException("CImg<%s>::dijkstra(): Specified indice of starting node %u is higher " + throw CImgArgumentException("CImg<%s>::dijkstra(): Specified index of starting node %u is higher " "than number of nodes %u.", pixel_type(),starting_node,nb_nodes); CImg dist(1,nb_nodes,1,1,cimg::type::max()); @@ -26856,9 +29519,9 @@ //! Return minimal path in a graph, using the Dijkstra algorithm. /** - \param starting_node Indice of the starting node. - \param ending_node Indice of the ending node. - \param previous_node Array that gives the previous node indice in the path to the starting node + \param starting_node Index of the starting node. + \param ending_node Index of the ending node. + \param previous_node Array that gives the previous node index in the path to the starting node (optional parameter). \return Array of distances of each node to the starting node. \note image instance corresponds to the adjacency matrix of the graph. @@ -26878,29 +29541,185 @@ "dijkstra(): Instance is not a graph adjacency matrix.", cimg_instance); - return dijkstra(*this,_width,starting_node,ending_node,previous_node); + return dijkstra(*this,_width,starting_node,ending_node,previous_node); + } + + //! Return minimal path in a graph, using the Dijkstra algorithm. + CImg& dijkstra(const unsigned int starting_node, const unsigned int ending_node=~0U) { + return get_dijkstra(starting_node,ending_node).move_to(*this); + } + + //! Return minimal path in a graph, using the Dijkstra algorithm \newinstance. + CImg get_dijkstra(const unsigned int starting_node, const unsigned int ending_node=~0U) const { + CImg foo; + return get_dijkstra(starting_node,ending_node,foo); + } + + //! Return an image containing the character codes of specified string. + /** + \param str input C-string to encode as an image. + \param is_last_zero Tells if the ending \c '0' character appear in the resulting image. + \param is_shared Return result that shares its buffer with \p str. + **/ + static CImg string(const char *const str, const bool is_last_zero=true, const bool is_shared=false) { + if (!str) return CImg(); + return CImg(str,(unsigned int)std::strlen(str) + (is_last_zero?1:0),1,1,1,is_shared); + } + + //! Return a \c 1x1 image containing specified value. + /** + \param a0 First vector value. + **/ + static CImg row_vector(const T& a0) { + return vector(a0); + } + + //! Return a \c 2x1 image containing specified values. + /** + \param a0 First vector value. + \param a1 Second vector value. + **/ + static CImg row_vector(const T& a0, const T& a1) { + CImg r(2,1); + r[0] = a0; r[1] = a1; + return r; + } + + //! Return a \c 3x1 image containing specified values. + /** + \param a0 First vector value. + \param a1 Second vector value. + \param a2 Third vector value. + **/ + static CImg row_vector(const T& a0, const T& a1, const T& a2) { + CImg r(3,1); + r[0] = a0; r[1] = a1; r[2] = a2; + return r; + } + + //! Return a \c 4x1 image containing specified values. + /** + \param a0 First vector value. + \param a1 Second vector value. + \param a2 Third vector value. + \param a3 Fourth vector value. + **/ + static CImg row_vector(const T& a0, const T& a1, const T& a2, const T& a3) { + CImg r(4,1); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; + return r; + } + + //! Return a \c 5x1 image containing specified values. + static CImg row_vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4) { + CImg r(5,1); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; + return r; + } + + //! Return a \c 6x1 image containing specified values. + static CImg row_vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, const T& a5) { + CImg r(6,1); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; + return r; + } + + //! Return a \c 7x1 image containing specified values. + static CImg row_vector(const T& a0, const T& a1, const T& a2, const T& a3, + const T& a4, const T& a5, const T& a6) { + CImg r(7,1); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; r[6] = a6; + return r; + } + + //! Return a \c 8x1 image containing specified values. + static CImg row_vector(const T& a0, const T& a1, const T& a2, const T& a3, + const T& a4, const T& a5, const T& a6, const T& a7) { + CImg r(8,1); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; r[6] = a6; r[7] = a7; + return r; + } + + //! Return a \c 9x1 image containing specified values. + static CImg row_vector(const T& a0, const T& a1, const T& a2, const T& a3, + const T& a4, const T& a5, const T& a6, const T& a7, + const T& a8) { + CImg r(9,1); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; r[6] = a6; r[7] = a7; r[8] = a8; + return r; + } + + //! Return a \c 10x1 image containing specified values. + static CImg row_vector(const T& a0, const T& a1, const T& a2, const T& a3, + const T& a4, const T& a5, const T& a6, const T& a7, + const T& a8, const T& a9) { + CImg r(10,1); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; r[6] = a6; r[7] = a7; r[8] = a8; r[9] = a9; + return r; + } + + //! Return a \c 11x1 image containing specified values. + static CImg row_vector(const T& a0, const T& a1, const T& a2, const T& a3, + const T& a4, const T& a5, const T& a6, const T& a7, + const T& a8, const T& a9, const T& a10) { + CImg r(11,1); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; r[6] = a6; r[7] = a7; r[8] = a8; r[9] = a9; + r[10] = a10; + return r; + } + + //! Return a \c 12x1 image containing specified values. + static CImg row_vector(const T& a0, const T& a1, const T& a2, const T& a3, + const T& a4, const T& a5, const T& a6, const T& a7, + const T& a8, const T& a9, const T& a10, const T& a11) { + CImg r(12,1); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; r[6] = a6; r[7] = a7; r[8] = a8; r[9] = a9; + r[10] = a10; r[11] = a11; + return r; } - //! Return minimal path in a graph, using the Dijkstra algorithm. - CImg& dijkstra(const unsigned int starting_node, const unsigned int ending_node=~0U) { - return get_dijkstra(starting_node,ending_node).move_to(*this); + //! Return a \c 13x1 image containing specified values. + static CImg row_vector(const T& a0, const T& a1, const T& a2, const T& a3, + const T& a4, const T& a5, const T& a6, const T& a7, + const T& a8, const T& a9, const T& a10, const T& a11, + const T& a12) { + CImg r(13,1); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; r[6] = a6; r[7] = a7; r[8] = a8; r[9] = a9; + r[10] = a10; r[11] = a11; r[12] = a12; + return r; } - //! Return minimal path in a graph, using the Dijkstra algorithm \newinstance. - CImg get_dijkstra(const unsigned int starting_node, const unsigned int ending_node=~0U) const { - CImg foo; - return get_dijkstra(starting_node,ending_node,foo); + //! Return a \c 14x1 image containing specified values. + static CImg row_vector(const T& a0, const T& a1, const T& a2, const T& a3, + const T& a4, const T& a5, const T& a6, const T& a7, + const T& a8, const T& a9, const T& a10, const T& a11, + const T& a12, const T& a13) { + CImg r(14,1); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; r[6] = a6; r[7] = a7; r[8] = a8; r[9] = a9; + r[10] = a10; r[11] = a11; r[12] = a12; r[13] = a13; + return r; } - //! Return an image containing the Ascii codes of the specified string. - /** - \param str input C-string to encode as an image. - \param is_last_zero Tells if the ending \c '0' character appear in the resulting image. - \param is_shared Return result that shares its buffer with \p str. - **/ - static CImg string(const char *const str, const bool is_last_zero=true, const bool is_shared=false) { - if (!str) return CImg(); - return CImg(str,(unsigned int)std::strlen(str) + (is_last_zero?1:0),1,1,1,is_shared); + //! Return a \c 15x1 image containing specified values. + static CImg row_vector(const T& a0, const T& a1, const T& a2, const T& a3, + const T& a4, const T& a5, const T& a6, const T& a7, + const T& a8, const T& a9, const T& a10, const T& a11, + const T& a12, const T& a13, const T& a14) { + CImg r(15,1); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; r[6] = a6; r[7] = a7; r[8] = a8; r[9] = a9; + r[10] = a10; r[11] = a11; r[12] = a12; r[13] = a13; r[14] = a14; + return r; + } + + //! Return a \c 16x1 image containing specified values. + static CImg row_vector(const T& a0, const T& a1, const T& a2, const T& a3, + const T& a4, const T& a5, const T& a6, const T& a7, + const T& a8, const T& a9, const T& a10, const T& a11, + const T& a12, const T& a13, const T& a14, const T& a15) { + CImg r(16,1); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; r[6] = a6; r[7] = a7; r[8] = a8; r[9] = a9; + r[10] = a10; r[11] = a11; r[12] = a12; r[13] = a13; r[14] = a14; r[15] = a15; + return r; } //! Return a \c 1x1 image containing specified value. @@ -26919,8 +29738,8 @@ \param a1 Second vector value. **/ static CImg vector(const T& a0, const T& a1) { - CImg r(1,2); T *ptr = r._data; - *(ptr++) = a0; *(ptr++) = a1; + CImg r(1,2); + r[0] = a0; r[1] = a1; return r; } @@ -26931,8 +29750,8 @@ \param a2 Third vector value. **/ static CImg vector(const T& a0, const T& a1, const T& a2) { - CImg r(1,3); T *ptr = r._data; - *(ptr++) = a0; *(ptr++) = a1; *(ptr++) = a2; + CImg r(1,3); + r[0] = a0; r[1] = a1; r[2] = a2; return r; } @@ -26944,40 +29763,38 @@ \param a3 Fourth vector value. **/ static CImg vector(const T& a0, const T& a1, const T& a2, const T& a3) { - CImg r(1,4); T *ptr = r._data; - *(ptr++) = a0; *(ptr++) = a1; *(ptr++) = a2; *(ptr++) = a3; + CImg r(1,4); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; return r; } //! Return a \c 1x5 image containing specified values. static CImg vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4) { - CImg r(1,5); T *ptr = r._data; - *(ptr++) = a0; *(ptr++) = a1; *(ptr++) = a2; *(ptr++) = a3; *(ptr++) = a4; + CImg r(1,5); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; return r; } //! Return a \c 1x6 image containing specified values. static CImg vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, const T& a5) { - CImg r(1,6); T *ptr = r._data; - *(ptr++) = a0; *(ptr++) = a1; *(ptr++) = a2; *(ptr++) = a3; *(ptr++) = a4; *(ptr++) = a5; + CImg r(1,6); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; return r; } //! Return a \c 1x7 image containing specified values. static CImg vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, const T& a5, const T& a6) { - CImg r(1,7); T *ptr = r._data; - *(ptr++) = a0; *(ptr++) = a1; *(ptr++) = a2; *(ptr++) = a3; - *(ptr++) = a4; *(ptr++) = a5; *(ptr++) = a6; + CImg r(1,7); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; r[6] = a6; return r; } //! Return a \c 1x8 image containing specified values. static CImg vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, const T& a5, const T& a6, const T& a7) { - CImg r(1,8); T *ptr = r._data; - *(ptr++) = a0; *(ptr++) = a1; *(ptr++) = a2; *(ptr++) = a3; - *(ptr++) = a4; *(ptr++) = a5; *(ptr++) = a6; *(ptr++) = a7; + CImg r(1,8); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; r[6] = a6; r[7] = a7; return r; } @@ -26985,10 +29802,8 @@ static CImg vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, const T& a5, const T& a6, const T& a7, const T& a8) { - CImg r(1,9); T *ptr = r._data; - *(ptr++) = a0; *(ptr++) = a1; *(ptr++) = a2; *(ptr++) = a3; - *(ptr++) = a4; *(ptr++) = a5; *(ptr++) = a6; *(ptr++) = a7; - *(ptr++) = a8; + CImg r(1,9); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; r[6] = a6; r[7] = a7; r[8] = a8; return r; } @@ -26996,10 +29811,8 @@ static CImg vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, const T& a5, const T& a6, const T& a7, const T& a8, const T& a9) { - CImg r(1,10); T *ptr = r._data; - *(ptr++) = a0; *(ptr++) = a1; *(ptr++) = a2; *(ptr++) = a3; - *(ptr++) = a4; *(ptr++) = a5; *(ptr++) = a6; *(ptr++) = a7; - *(ptr++) = a8; *(ptr++) = a9; + CImg r(1,10); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; r[6] = a6; r[7] = a7; r[8] = a8; r[9] = a9; return r; } @@ -27007,10 +29820,9 @@ static CImg vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, const T& a5, const T& a6, const T& a7, const T& a8, const T& a9, const T& a10) { - CImg r(1,11); T *ptr = r._data; - *(ptr++) = a0; *(ptr++) = a1; *(ptr++) = a2; *(ptr++) = a3; - *(ptr++) = a4; *(ptr++) = a5; *(ptr++) = a6; *(ptr++) = a7; - *(ptr++) = a8; *(ptr++) = a9; *(ptr++) = a10; + CImg r(1,11); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; r[6] = a6; r[7] = a7; r[8] = a8; r[9] = a9; + r[10] = a10; return r; } @@ -27018,10 +29830,9 @@ static CImg vector(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, const T& a5, const T& a6, const T& a7, const T& a8, const T& a9, const T& a10, const T& a11) { - CImg r(1,12); T *ptr = r._data; - *(ptr++) = a0; *(ptr++) = a1; *(ptr++) = a2; *(ptr++) = a3; - *(ptr++) = a4; *(ptr++) = a5; *(ptr++) = a6; *(ptr++) = a7; - *(ptr++) = a8; *(ptr++) = a9; *(ptr++) = a10; *(ptr++) = a11; + CImg r(1,12); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; r[6] = a6; r[7] = a7; r[8] = a8; r[9] = a9; + r[10] = a10; r[11] = a11; return r; } @@ -27030,11 +29841,9 @@ const T& a4, const T& a5, const T& a6, const T& a7, const T& a8, const T& a9, const T& a10, const T& a11, const T& a12) { - CImg r(1,13); T *ptr = r._data; - *(ptr++) = a0; *(ptr++) = a1; *(ptr++) = a2; *(ptr++) = a3; - *(ptr++) = a4; *(ptr++) = a5; *(ptr++) = a6; *(ptr++) = a7; - *(ptr++) = a8; *(ptr++) = a9; *(ptr++) = a10; *(ptr++) = a11; - *(ptr++) = a12; + CImg r(1,13); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; r[6] = a6; r[7] = a7; r[8] = a8; r[9] = a9; + r[10] = a10; r[11] = a11; r[12] = a12; return r; } @@ -27043,11 +29852,9 @@ const T& a4, const T& a5, const T& a6, const T& a7, const T& a8, const T& a9, const T& a10, const T& a11, const T& a12, const T& a13) { - CImg r(1,14); T *ptr = r._data; - *(ptr++) = a0; *(ptr++) = a1; *(ptr++) = a2; *(ptr++) = a3; - *(ptr++) = a4; *(ptr++) = a5; *(ptr++) = a6; *(ptr++) = a7; - *(ptr++) = a8; *(ptr++) = a9; *(ptr++) = a10; *(ptr++) = a11; - *(ptr++) = a12; *(ptr++) = a13; + CImg r(1,14); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; r[6] = a6; r[7] = a7; r[8] = a8; r[9] = a9; + r[10] = a10; r[11] = a11; r[12] = a12; r[13] = a13; return r; } @@ -27056,11 +29863,9 @@ const T& a4, const T& a5, const T& a6, const T& a7, const T& a8, const T& a9, const T& a10, const T& a11, const T& a12, const T& a13, const T& a14) { - CImg r(1,15); T *ptr = r._data; - *(ptr++) = a0; *(ptr++) = a1; *(ptr++) = a2; *(ptr++) = a3; - *(ptr++) = a4; *(ptr++) = a5; *(ptr++) = a6; *(ptr++) = a7; - *(ptr++) = a8; *(ptr++) = a9; *(ptr++) = a10; *(ptr++) = a11; - *(ptr++) = a12; *(ptr++) = a13; *(ptr++) = a14; + CImg r(1,15); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; r[6] = a6; r[7] = a7; r[8] = a8; r[9] = a9; + r[10] = a10; r[11] = a11; r[12] = a12; r[13] = a13; r[14] = a14; return r; } @@ -27069,11 +29874,9 @@ const T& a4, const T& a5, const T& a6, const T& a7, const T& a8, const T& a9, const T& a10, const T& a11, const T& a12, const T& a13, const T& a14, const T& a15) { - CImg r(1,16); T *ptr = r._data; - *(ptr++) = a0; *(ptr++) = a1; *(ptr++) = a2; *(ptr++) = a3; - *(ptr++) = a4; *(ptr++) = a5; *(ptr++) = a6; *(ptr++) = a7; - *(ptr++) = a8; *(ptr++) = a9; *(ptr++) = a10; *(ptr++) = a11; - *(ptr++) = a12; *(ptr++) = a13; *(ptr++) = a14; *(ptr++) = a15; + CImg r(1,16); + r[0] = a0; r[1] = a1; r[2] = a2; r[3] = a3; r[4] = a4; r[5] = a5; r[6] = a6; r[7] = a7; r[8] = a8; r[9] = a9; + r[10] = a10; r[11] = a11; r[12] = a12; r[13] = a13; r[14] = a14; r[15] = a15; return r; } @@ -27111,7 +29914,7 @@ \param a5 Sixth matrix value. \param a6 Seventh matrix value. \param a7 Eighth matrix value. - \param a8 Nineth matrix value. + \param a8 Ninth matrix value. **/ static CImg matrix(const T& a0, const T& a1, const T& a2, const T& a3, const T& a4, const T& a5, @@ -27715,7 +30518,7 @@ } // 'formula_mode' = { 0 = does not allow formula | 1 = allow formula | - // 2 = allow formula but do not fill image values }. + // 2 = allow formula and do not fill image values }. CImg& _fill(const char *const expression, const bool repeat_values, const unsigned int formula_mode, const CImgList *const list_inputs, CImgList *const list_outputs, const char *const calling_function, const CImg *provides_copy) { @@ -27733,12 +30536,12 @@ char sep; const int err = cimg_sscanf(expression,"%lf %c",&value,&sep); if (err==1 || (err==2 && sep==',')) { - if (err==1) return fill((T)value); + if (err==1) { if (formula_mode==2) return *this; return fill((T)value); } else is_value_sequence = true; } // Try to fill values according to a formula. - _cimg_abort_init_omp; + _cimg_abort_init_openmp; if (!is_value_sequence) try { CImg base = provides_copy?provides_copy->get_shared():get_shared(); _cimg_math_parser mp(expression + (*expression=='>' || *expression=='<' || @@ -27748,11 +30551,22 @@ mp.need_input_copy) base.assign().assign(*this,false); // Needs input copy + // Determine 2nd largest image dimension (used as axis for inner loop in parallelized evaluation). + unsigned int M; + if (mp.result_dim) { + M = cimg::max(_width,_height,_depth); + M = M==_width?std::max(_height,_depth):M==_height?std::max(_width,_depth):std::max(_width,_height); + } else { + M = cimg::max(_width,_height,_depth,_spectrum); + M = M==_width?cimg::max(_height,_depth,_spectrum): + M==_height?cimg::max(_width,_depth,_spectrum): + M==_depth?cimg::max(_width,_height,_spectrum):cimg::max(_width,_height,_depth); + } + bool do_in_parallel = false; -#ifdef cimg_use_openmp +#if cimg_use_openmp!=0 cimg_openmp_if(*expression=='*' || *expression==':' || - (mp.is_parallelizable && _width>=(cimg_openmp_sizefactor)*320 && - _height*_depth*_spectrum>=2)) + (mp.is_parallelizable && M>=(cimg_openmp_sizefactor)*320 && size()/M>=2)) do_in_parallel = true; #endif if (mp.result_dim) { // Vector-valued expression @@ -27761,6 +30575,7 @@ T *ptrd = *expression=='<'?_data + _width*_height*_depth - 1:_data; if (*expression=='<') { CImg res(1,mp.result_dim); + mp.begin_t(); cimg_rofYZ(*this,y,z) { cimg_abort_test; if (formula_mode==2) cimg_rofX(*this,x) mp(x,y,z,0); @@ -27770,8 +30585,11 @@ T *_ptrd = ptrd--; for (unsigned int n = N; n>0; --n) { *_ptrd = (T)(*ptrs++); _ptrd+=whd; } } } + mp.end_t(); + } else if (*expression=='>' || !do_in_parallel) { CImg res(1,mp.result_dim); + mp.begin_t(); cimg_forYZ(*this,y,z) { cimg_abort_test; if (formula_mode==2) cimg_forX(*this,x) mp(x,y,z,0); @@ -27781,28 +30599,47 @@ T *_ptrd = ptrd++; for (unsigned int n = N; n>0; --n) { *_ptrd = (T)(*ptrs++); _ptrd+=whd; } } } - } else { -#ifdef cimg_use_openmp + mp.end_t(); + + } else { + +#if cimg_use_openmp!=0 + unsigned int tid = 0; cimg_pragma_openmp(parallel) { - _cimg_math_parser - _mp = omp_get_thread_num()?mp:_cimg_math_parser(), - &lmp = omp_get_thread_num()?_mp:mp; + _cimg_math_parser *_mp = 0; + cimg_pragma_openmp(critical(_fill)) { _mp = !tid?&mp:new _cimg_math_parser(mp); ++tid; } + _cimg_math_parser &lmp = *_mp; lmp.is_fill = true; - cimg_pragma_openmp(for cimg_openmp_collapse(2)) - cimg_forYZ(*this,y,z) _cimg_abort_try_omp { - cimg_abort_test; - if (formula_mode==2) cimg_forX(*this,x) lmp(x,y,z,0); - else { - CImg res(1,lmp.result_dim); - T *ptrd = data(0,y,z,0); - cimg_forX(*this,x) { - lmp(x,y,z,0,res._data); - const double *ptrs = res._data; - T *_ptrd = ptrd++; for (unsigned int n = N; n>0; --n) { *_ptrd = (T)(*ptrs++); _ptrd+=whd; } - } - } - } _cimg_abort_catch_omp _cimg_abort_catch_fill_omp + cimg_pragma_openmp(barrier) + lmp.begin_t(); + +#define _cimg_fill_openmp_vector(_YZ,_y,_z,_X,_x,_sx,_sy,_sz,_off) \ + cimg_pragma_openmp(for cimg_openmp_collapse(2)) \ + cimg_for##_YZ(*this,_y,_z) _cimg_abort_try_openmp { \ + cimg_abort_test; \ + if (formula_mode==2) cimg_for##_X(*this,_x) lmp(x,y,z,0); \ + else { \ + CImg res(1,lmp.result_dim); \ + T *__ptrd = data(_sx,_sy,_sz,0); \ + const ulongT off = (ulongT)_off; \ + cimg_for##_X(*this,_x) { \ + lmp(x,y,z,0,res._data); \ + const double *ptrs = res._data; \ + T *_ptrd = __ptrd; \ + for (unsigned int n = N; n>0; --n) { *_ptrd = (T)(*ptrs++); _ptrd+=whd; } \ + __ptrd+=off; \ + } \ + } \ + } _cimg_abort_catch_openmp _cimg_abort_catch_fill_openmp + + if (M==_width) { _cimg_fill_openmp_vector(YZ,y,z,X,x,0,y,z,1) } + else if (M==_height) { _cimg_fill_openmp_vector(XZ,x,z,Y,y,x,0,z,_width) } + else { _cimg_fill_openmp_vector(XY,x,y,Z,z,x,y,0,_width*_height) } + + lmp.end_t(); + cimg_pragma_openmp(barrier) cimg_pragma_openmp(critical) { lmp.merge(mp); } + if (&lmp!=&mp) delete &lmp; } #endif } @@ -27810,28 +30647,50 @@ } else { // Scalar-valued expression T *ptrd = *expression=='<'?end() - 1:_data; if (*expression=='<') { + mp.begin_t(); if (formula_mode==2) cimg_rofYZC(*this,y,z,c) { cimg_abort_test; cimg_rofX(*this,x) mp(x,y,z,c); } else cimg_rofYZC(*this,y,z,c) { cimg_abort_test; cimg_rofX(*this,x) *(ptrd--) = (T)mp(x,y,z,c); } + mp.end_t(); + } else if (*expression=='>' || !do_in_parallel) { + mp.begin_t(); if (formula_mode==2) cimg_forYZC(*this,y,z,c) { cimg_abort_test; cimg_forX(*this,x) mp(x,y,z,c); } else cimg_forYZC(*this,y,z,c) { cimg_abort_test; cimg_forX(*this,x) *(ptrd++) = (T)mp(x,y,z,c); } + mp.end_t(); + } else { -#ifdef cimg_use_openmp + +#if cimg_use_openmp!=0 + unsigned int tid = 0; cimg_pragma_openmp(parallel) { - _cimg_math_parser - _mp = omp_get_thread_num()?mp:_cimg_math_parser(), - &lmp = omp_get_thread_num()?_mp:mp; + _cimg_math_parser *_mp = 0; + cimg_pragma_openmp(critical(_fill)) { _mp = !tid?&mp:new _cimg_math_parser(mp); ++tid; } + _cimg_math_parser &lmp = *_mp; lmp.is_fill = true; - cimg_pragma_openmp(for cimg_openmp_collapse(3)) - cimg_forYZC(*this,y,z,c) _cimg_abort_try_omp { - cimg_abort_test; - if (formula_mode==2) cimg_forX(*this,x) lmp(x,y,z,c); - else { - T *ptrd = data(0,y,z,c); - cimg_forX(*this,x) *ptrd++ = (T)lmp(x,y,z,c); - } - } _cimg_abort_catch_omp _cimg_abort_catch_fill_omp + cimg_pragma_openmp(barrier) + lmp.begin_t(); + +#define _cimg_fill_openmp_scalar(_YZC,_y,_z,_c,_X,_x,_sx,_sy,_sz,_sc,_off) \ + cimg_pragma_openmp(for cimg_openmp_collapse(3)) \ + cimg_for##_YZC(*this,_y,_z,_c) _cimg_abort_try_openmp { \ + cimg_abort_test; \ + if (formula_mode==2) cimg_for##_X(*this,_x) lmp(x,y,z,c); \ + else { \ + T *_ptrd = data(_sx,_sy,_sz,_sc); \ + const ulongT off = (ulongT)_off; \ + cimg_for##_X(*this,_x) { *_ptrd = (T)lmp(x,y,z,c); _ptrd+=off; } \ + } \ + } _cimg_abort_catch_openmp _cimg_abort_catch_fill_openmp + + if (M==_width) { _cimg_fill_openmp_scalar(YZC,y,z,c,X,x,0,y,z,c,1) } + else if (M==_height) { _cimg_fill_openmp_scalar(XZC,x,z,c,Y,y,x,0,z,c,_width) } + else if (M==_depth) { _cimg_fill_openmp_scalar(XYC,x,y,c,Z,z,x,y,0,c,_width*_height) } + else { _cimg_fill_openmp_scalar(XYZ,x,y,z,C,c,x,y,z,0,_width*_height*_depth) } + + lmp.end_t(); + cimg_pragma_openmp(barrier) cimg_pragma_openmp(critical) { lmp.merge(mp); } + if (&lmp!=&mp) delete &lmp; } #endif } @@ -27997,8 +30856,8 @@ template CImg get_discard(const CImg& values, const char axis=0) const { - CImg res; if (!values) return +*this; + CImg res; if (is_empty()) return res; const ulongT vsiz = values.size(); const char _axis = cimg::lowercase(axis); @@ -28052,17 +30911,27 @@ res.resize(-100,-100,-100,k,0); } break; default : { + const ulongT siz = size(); + const char uaxis = (ulongT)_width==siz?'x':(ulongT)_depth==siz?'z':(ulongT)_spectrum==siz?'c':'y'; res.unroll('y'); - cimg_foroff(*this,i) { - if ((*this)[i]!=(T)values[j]) { - if (j) --i; - std::memcpy(res._data + k,_data + i0,(i - i0 + 1)*sizeof(T)); - k+=i - i0 + 1; i0 = (int)i + 1; j = 0; - } else { ++j; if (j>=vsiz) { j = 0; i0 = (int)i + 1; }} + if (vsiz==1) { // Optimized version for a single discard value + const T val = (T)values[0]; + cimg_foroff(*this,i) { + const T _val = (T)_data[i]; + if (_val!=val) res[k++] = _val; + } + } else { // Generic version + cimg_foroff(*this,i) { + if ((*this)[i]!=(T)values[j]) { + if (j) --i; + std::memcpy(res._data + k,_data + i0,(i - i0 + 1)*sizeof(T)); + k+=i - i0 + 1; i0 = (int)i + 1; j = 0; + } else { ++j; if (j>=vsiz) { j = 0; i0 = (int)i + 1; }} + } + if ((ulongT)i0& rand(const T& val_min, const T& val_max) { const float delta = (float)val_max - (float)val_min + (cimg::type::is_float()?0:1); if (cimg::type::is_float()) cimg_pragma_openmp(parallel cimg_openmp_if_size(size(),524288)) { - ulongT rng = (cimg::_rand(),cimg::rng()); -#ifdef cimg_use_openmp + cimg_uint64 rng = (cimg::_rand(),cimg::rng()); + +#if cimg_use_openmp!=0 rng+=omp_get_thread_num(); #endif cimg_pragma_openmp(for) cimg_rofoff(*this,off) _data[off] = (T)(val_min + delta*cimg::rand(1,&rng)); cimg::srand(rng); } else cimg_pragma_openmp(parallel cimg_openmp_if_size(size(),524288)) { - ulongT rng = (cimg::_rand(),cimg::rng()); -#ifdef cimg_use_openmp + cimg_uint64 rng = (cimg::_rand(),cimg::rng()); + +#if cimg_use_openmp!=0 rng+=omp_get_thread_num(); #endif cimg_pragma_openmp(for) @@ -28204,8 +31080,9 @@ switch (noise_type) { case 0 : { // Gaussian noise cimg_pragma_openmp(parallel cimg_openmp_if_size(size(),131072)) { - ulongT rng = (cimg::_rand(),cimg::rng()); -#ifdef cimg_use_openmp + cimg_uint64 rng = (cimg::_rand(),cimg::rng()); + +#if cimg_use_openmp!=0 rng+=omp_get_thread_num(); #endif cimg_pragma_openmp(for) @@ -28220,8 +31097,9 @@ } break; case 1 : { // Uniform noise cimg_pragma_openmp(parallel cimg_openmp_if_size(size(),131072)) { - ulongT rng = (cimg::_rand(),cimg::rng()); -#ifdef cimg_use_openmp + cimg_uint64 rng = (cimg::_rand(),cimg::rng()); + +#if cimg_use_openmp!=0 rng+=omp_get_thread_num(); #endif cimg_pragma_openmp(for) @@ -28241,8 +31119,9 @@ else { m = (Tfloat)cimg::type::min(); M = (Tfloat)cimg::type::max(); } } cimg_pragma_openmp(parallel cimg_openmp_if_size(size(),131072)) { - ulongT rng = (cimg::_rand(),cimg::rng()); -#ifdef cimg_use_openmp + cimg_uint64 rng = (cimg::_rand(),cimg::rng()); + +#if cimg_use_openmp!=0 rng+=omp_get_thread_num(); #endif cimg_pragma_openmp(for) @@ -28252,8 +31131,9 @@ } break; case 3 : { // Poisson Noise cimg_pragma_openmp(parallel cimg_openmp_if_size(size(),131072)) { - ulongT rng = (cimg::_rand(),cimg::rng()); -#ifdef cimg_use_openmp + cimg_uint64 rng = (cimg::_rand(),cimg::rng()); + +#if cimg_use_openmp!=0 rng+=omp_get_thread_num(); #endif cimg_pragma_openmp(for) @@ -28264,8 +31144,9 @@ case 4 : { // Rice noise const Tfloat sqrt2 = (Tfloat)std::sqrt(2.); cimg_pragma_openmp(parallel cimg_openmp_if_size(size(),131072)) { - ulongT rng = (cimg::_rand(),cimg::rng()); -#ifdef cimg_use_openmp + cimg_uint64 rng = (cimg::_rand(),cimg::rng()); + +#if cimg_use_openmp!=0 rng+=omp_get_thread_num(); #endif cimg_pragma_openmp(for) @@ -28301,6 +31182,9 @@ /** \param min_value Minimum desired value of the resulting image. \param max_value Maximum desired value of the resulting image. + \param constant_case_ratio In case of instance image having a constant value, tell what ratio + of [min_value,max_value] is used to fill the normalized image + (=0 for min_value, =1 for max_value, =0.5 for (min_value + max_value)/2). \par Example \code const CImg img("reference.jpg"), res = img.get_normalize(160,220); @@ -28308,19 +31192,24 @@ \endcode \image html ref_normalize2.jpg **/ - CImg& normalize(const T& min_value, const T& max_value) { + CImg& normalize(const T& min_value, const T& max_value, + const float constant_case_ratio=0) { if (is_empty()) return *this; const T a = min_value get_normalize(const T& min_value, const T& max_value) const { - return CImg(*this,false).normalize((Tfloat)min_value,(Tfloat)max_value); + CImg get_normalize(const T& min_value, const T& max_value, + const float ratio_if_constant_image=0) const { + return CImg(*this,false).normalize((Tfloat)min_value,(Tfloat)max_value,ratio_if_constant_image); } //! Normalize multi-valued pixels of the image instance, with respect to their L2-norm. @@ -28571,7 +31460,7 @@ \param max_value Maximum pixel value considered for the histogram computation. All pixel values higher than \p max_value will not be counted. \note - - The histogram H of an image I is the 1D function where H(x) counts the number of occurences of the value x + - The histogram H of an image I is the 1D function where H(x) counts the number of occurrences of the value x in the image I. - The resulting histogram is always defined in 1D. Histograms of multi-valued images are not multi-dimensional. \par Example @@ -28696,8 +31585,8 @@ whd = (ulongT)_width*_height*_depth, pwhd = (ulongT)colormap._width*colormap._height*colormap._depth; CImg res(_width,_height,_depth,map_indexes?_spectrum:1); - tuint *ptrd = res._data; if (dithering>0) { // Dithered versions + tuint *ptrd = res._data; const float ndithering = cimg::cut(dithering,0,1)/16; Tfloat valm = 0, valM = (Tfloat)max_min(valm); if (valm==valM && valm>=0 && valM<=255) { valm = 0; valM = 255; } @@ -28934,7 +31823,7 @@ //! Map predefined colormap on the scalar (indexed) image instance. /** \param colormap Multi-valued colormap used for mapping the indexes. - \param boundary_conditions The border condition type { 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }. + \param boundary_conditions Boundary conditions. Can be { 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }. \par Example \code const CImg img("reference.jpg"), @@ -28953,142 +31842,194 @@ //! Map predefined colormap on the scalar (indexed) image instance \newinstance. template CImg get_map(const CImg& colormap, const unsigned int boundary_conditions=0) const { - if (_spectrum!=1 && colormap._spectrum!=1) - throw CImgArgumentException(_cimg_instance - "map(): Instance and specified colormap (%u,%u,%u,%u,%p) " - "have incompatible dimensions.", - cimg_instance, - colormap._width,colormap._height,colormap._depth,colormap._spectrum,colormap._data); - const ulongT - whd = (ulongT)_width*_height*_depth, + whd = (ulongT)_width*_height*_depth, siz = size(), cwhd = (ulongT)colormap._width*colormap._height*colormap._depth, cwhd2 = 2*cwhd; - CImg res(_width,_height,_depth,colormap._spectrum==1?_spectrum:colormap._spectrum); + CImg res(_width,_height,_depth,_spectrum*colormap._spectrum); switch (colormap._spectrum) { case 1 : { // Optimized for scalars - const T *ptrs = _data; switch (boundary_conditions) { case 3 : // Mirror - cimg_for(res,ptrd,t) { - const ulongT ind = ((ulongT)*(ptrs++))%cwhd2; - *ptrd = colormap[ind& label(const bool is_high_connectivity=false, const Tfloat tolerance=0) { - return get_label(is_high_connectivity,tolerance).move_to(*this); + CImg& label(const bool is_high_connectivity=false, const Tfloat tolerance=0, + const bool is_L2_norm=true) { + if (is_empty()) return *this; + return get_label(is_high_connectivity,tolerance,is_L2_norm).move_to(*this); } //! Label connected components \newinstance. - CImg get_label(const bool is_high_connectivity=false, - const Tfloat tolerance=0) const { + CImg get_label(const bool is_high_connectivity=false, const Tfloat tolerance=0, + const bool is_L2_norm=true) const { if (is_empty()) return CImg(); // Create neighborhood tables. @@ -29139,23 +32083,27 @@ dx[nb] = 1; dy[nb] = 1; dz[nb++] = 1; } } - return _label(nb,dx,dy,dz,tolerance); + return _label(nb,dx,dy,dz,tolerance,is_L2_norm); } //! Label connected components \overloading. /** \param connectivity_mask Mask of the neighboring pixels. \param tolerance Tolerance used to determine if two neighboring pixels belong to the same region. + \param is_L2_norm If true, tolerance is compared against L2 difference, otherwise L1 is used. **/ template - CImg& label(const CImg& connectivity_mask, const Tfloat tolerance=0) { - return get_label(connectivity_mask,tolerance).move_to(*this); + CImg& label(const CImg& connectivity_mask, const Tfloat tolerance=0, + const bool is_L2_norm=true) { + if (is_empty()) return *this; + return get_label(connectivity_mask,tolerance,is_L2_norm).move_to(*this); } //! Label connected components \newinstance. template - CImg get_label(const CImg& connectivity_mask, - const Tfloat tolerance=0) const { + CImg get_label(const CImg& connectivity_mask, const Tfloat tolerance=0, + const bool is_L2_norm=true) const { + if (is_empty()) return CImg(); int nb = 0; cimg_for(connectivity_mask,ptr,t) if (*ptr) ++nb; CImg dx(nb,1,1,1,0), dy(nb,1,1,1,0), dz(nb,1,1,1,0); @@ -29164,67 +32112,110 @@ connectivity_mask(x,y,z)) { dx[nb] = x; dy[nb] = y; dz[nb++] = z; } - return _label(nb,dx,dy,dz,tolerance); + return _label(nb,dx,dy,dz,tolerance,is_L2_norm); } CImg _label(const unsigned int nb, const int *const dx, const int *const dy, const int *const dz, - const Tfloat tolerance) const { - CImg res(_width,_height,_depth,_spectrum); - cimg_forC(*this,c) { - CImg _res = res.get_shared_channel(c); + const Tfloat tolerance, const bool is_L2_norm) const { + CImg res(_width,_height,_depth); + const Tfloat _tolerance = _spectrum>1 && is_L2_norm?cimg::sqr(tolerance):tolerance; + + // Init label numbers. + ulongT *ptr = res.data(); + cimg_foroff(res,p) *(ptr++) = p; + + // For each neighbour-direction, label. + for (unsigned int n = 0; n& lines_LUT256() { static const unsigned char pal[] = { - 217,62,88,75,1,237,240,12,56,160,165,116,1,1,204,2,15,248,148,185,133,141,46,246,222,116,16,5,207,226, - 17,114,247,1,214,53,238,0,95,55,233,235,109,0,17,54,33,0,90,30,3,0,94,27,19,0,68,212,166,130,0,15,7,119, - 238,2,246,198,0,3,16,10,13,2,25,28,12,6,2,99,18,141,30,4,3,140,12,4,30,233,7,10,0,136,35,160,168,184,20, - 233,0,1,242,83,90,56,180,44,41,0,6,19,207,5,31,214,4,35,153,180,75,21,76,16,202,218,22,17,2,136,71,74, - 81,251,244,148,222,17,0,234,24,0,200,16,239,15,225,102,230,186,58,230,110,12,0,7,129,249,22,241,37,219, - 1,3,254,210,3,212,113,131,197,162,123,252,90,96,209,60,0,17,0,180,249,12,112,165,43,27,229,77,40,195,12, - 87,1,210,148,47,80,5,9,1,137,2,40,57,205,244,40,8,252,98,0,40,43,206,31,187,0,180,1,69,70,227,131,108,0, - 223,94,228,35,248,243,4,16,0,34,24,2,9,35,73,91,12,199,51,1,249,12,103,131,20,224,2,70,32, - 233,1,165,3,8,154,246,233,196,5,0,6,183,227,247,195,208,36,0,0,226,160,210,198,69,153,210,1,23,8,192,2,4, - 137,1,0,52,2,249,241,129,0,0,234,7,238,71,7,32,15,157,157,252,158,2,250,6,13,30,11,162,0,199,21,11,27,224, - 4,157,20,181,111,187,218,3,0,11,158,230,196,34,223,22,248,135,254,210,157,219,0,117,239,3,255,4,227,5,247, - 11,4,3,188,111,11,105,195,2,0,14,1,21,219,192,0,183,191,113,241,1,12,17,248,0,48,7,19,1,254,212,0,239,246, - 0,23,0,250,165,194,194,17,3,253,0,24,6,0,141,167,221,24,212,2,235,243,0,0,205,1,251,133,204,28,4,6,1,10, - 141,21,74,12,236,254,228,19,1,0,214,1,186,13,13,6,13,16,27,209,6,216,11,207,251,59,32,9,155,23,19,235,143, - 116,6,213,6,75,159,23,6,0,228,4,10,245,249,1,7,44,234,4,102,174,0,19,239,103,16,15,18,8,214,22,4,47,244, - 255,8,0,251,173,1,212,252,250,251,252,6,0,29,29,222,233,246,5,149,0,182,180,13,151,0,203,183,0,35,149,0, - 235,246,254,78,9,17,203,73,11,195,0,3,5,44,0,0,237,5,106,6,130,16,214,20,168,247,168,4,207,11,5,1,232,251, - 129,210,116,231,217,223,214,27,45,38,4,177,186,249,7,215,172,16,214,27,249,230,236,2,34,216,217,0,175,30, - 243,225,244,182,20,212,2,226,21,255,20,0,2,13,62,13,191,14,76,64,20,121,4,118,0,216,1,147,0,2,210,1,215, - 95,210,236,225,184,46,0,248,24,11,1,9,141,250,243,9,221,233,160,11,147,2,55,8,23,12,253,9,0,54,0,231,6,3, - 141,8,2,246,9,180,5,11,8,227,8,43,110,242,1,130,5,97,36,10,6,219,86,133,11,108,6,1,5,244,67,19,28,0,174, - 154,16,127,149,252,188,196,196,228,244,9,249,0,0,0,37,170,32,250,0,73,255,23,3,224,234,38,195,198,0,255,87, - 33,221,174,31,3,0,189,228,6,153,14,144,14,108,197,0,9,206,245,254,3,16,253,178,248,0,95,125,8,0,3,168,21, - 23,168,19,50,240,244,185,0,1,144,10,168,31,82,1,13 }; + 0,255,255,0,0,28,125,125,235,210,186,182,36,0,125,255, + 53,32,255,210,89,186,65,45,125,210,210,97,130,194,0,125, + 206,53,190,89,255,146,20,190,154,73,255,36,130,215,0,138, + 101,210,61,194,206,0,77,45,255,154,174,0,190,239,89,125, + 16,36,158,223,117,0,97,69,223,255,40,239,0,0,255,0, + 97,170,93,255,138,40,117,210,0,170,53,158,186,255,0,121, + 227,121,186,40,20,190,89,255,77,57,130,142,255,73,186,85, + 210,8,32,166,243,130,210,40,255,45,61,142,223,49,121,255, + 20,162,158,73,89,255,53,138,210,190,57,235,36,73,255,49, + 210,0,210,85,57,97,255,121,85,174,40,255,162,178,0,121, + 166,125,53,146,166,255,97,121,65,89,235,231,12,170,36,190, + 85,255,166,97,198,77,20,146,109,166,255,28,40,202,121,81, + 247,0,210,255,49,0,65,255,36,166,93,77,255,85,251,0, + 170,178,0,182,255,0,162,16,154,142,162,223,223,0,0,81, + 215,4,215,162,215,125,77,206,121,36,125,231,101,16,255,121, + 0,57,190,215,65,125,89,142,255,101,73,53,146,223,125,125, + 0,255,0,255,0,206,93,138,49,255,0,202,154,85,45,219, + 251,53,0,255,40,130,219,158,16,117,186,130,202,49,65,239, + 89,202,49,28,247,134,150,0,255,117,202,4,215,81,186,57, + 202,89,73,210,40,93,45,251,206,28,223,142,40,134,162,125, + 32,247,97,170,0,255,57,134,73,247,162,0,251,40,142,142, + 8,166,206,81,154,194,93,89,125,243,28,109,227,0,190,65, + 194,186,0,255,53,45,109,186,186,0,255,130,49,170,69,210, + 154,0,109,227,45,255,125,105,81,81,255,0,219,134,170,85, + 146,28,170,89,223,97,8,210,255,158,49,40,125,174,174,125, + 0,227,166,28,219,130,0,93,239,0,85,255,81,178,125,49, + 89,255,53,206,73,113,146,255,0,150,36,219,162,0,210,125, + 69,134,255,85,40,89,235,49,215,121,0,206,36,223,174,69, + 40,182,178,130,69,45,255,210,85,77,215,0,231,146,0,194, + 125,174,0,255,40,89,121,206,57,0,206,170,231,150,81,0, + 125,255,4,174,4,190,121,255,4,166,109,130,49,239,170,93, + 16,174,210,0,255,16,105,158,93,255,0,125,0,255,158,85, + 0,255,0,0,255,170,166,61,121,28,198,215,45,243,61,97, + 255,53,81,130,109,255,8,117,235,121,40,178,174,0,182,49, + 162,121,255,69,206,0,219,125,0,101,255,239,121,32,210,130, + 36,231,32,125,81,142,215,158,4,178,255,0,40,251,125,125, + 219,89,130,0,166,255,24,65,194,125,255,125,77,125,93,125, + 202,24,138,174,178,32,255,85,194,40,85,36,174,174,125,210, + 85,255,53,16,93,206,40,130,170,202,93,255,0,24,117,255, + 97,113,105,81,255,186,194,57,69,206,57,53,223,190,4,255, + 85,97,130,255,85,0,125,223,85,219,0,215,146,77,40,239, + 89,36,142,154,227,0,255,85,162,0,162,0,235,178,45,166, + 0,247,255,20,69,210,89,142,53,255,40,146,166,255,69,0, + 174,154,142,130,162,0,215,255,0,89,40,255,166,61,146,69, + 162,40,255,32,121,255,117,178,0,186,206,0,57,215,215,81, + 158,77,166,210,77,89,210,0,24,202,150,186,0,255,20,97, + 57,170,235,251,16,73,142,251,93,0,202,0,255,121,219,4, + 73,219,8,162,206,16,219,93,117,0,255,8,130,174,223,45 }; static const CImg colormap(pal,1,256,1,3,false); return colormap; } @@ -29461,17 +32476,16 @@ R = (Tfloat)p1[N], G = (Tfloat)p2[N], B = (Tfloat)p3[N], - theta = (Tfloat)(std::acos(0.5f*((R - G) + (R - B))/ - std::sqrt(cimg::sqr(R - G) + (R - B)*(G - B)))*180/cimg::PI), m = cimg::min(R,G,B), - sum = R + G + B; - Tfloat H = 0, S = 0, I = 0; - if (theta>0) H = B<=G?theta:360 - theta; - if (sum>0) S = 1 - 3*m/sum; - I = sum/(3*255); - p1[N] = (T)cimg::cut(H,0,360); - p2[N] = (T)cimg::cut(S,0,1); - p3[N] = (T)cimg::cut(I,0,1); + M = cimg::max(R,G,B), + C = M - m, + sum = R + G + B, + H = 60*(C==0?0:M==R?cimg::mod((G - B)/C,(Tfloat)6):M==G?(B - R)/C + 2:(R - G)/C + 4), + S = sum<=0?0:1 - 3*m/sum, + I = sum/(3*255); + p1[N] = (T)H; + p2[N] = (T)S; + p3[N] = (T)I; } return *this; } @@ -29492,30 +32506,26 @@ const longT whd = (longT)width()*height()*depth(); cimg_pragma_openmp(parallel for cimg_openmp_if_size(whd,256)) for (longT N = 0; N=6) H-=6; - H*=60; - S = 2*L<=1?(M - m)/(M + m):(M - m)/(2*255 - M - m); - } - p1[N] = (T)cimg::cut(H,0,360); - p2[N] = (T)cimg::cut(S,0,1); - p3[N] = (T)cimg::cut(L,0,1); + C = M - m, + H = 60*(C==0?0:M==R?cimg::mod((G - B)/C,(Tfloat)6):M==G?(B - R)/C + 2:(R - G)/C + 4), + L = 0.5f*(m + M)/255, + S = L==1 || L==0?0:C/(1 - cimg::abs(2*L - 1))/255; + p1[N] = (T)H; + p2[N] = (T)S; + p3[N] = (T)L; } return *this; } @@ -29577,24 +32580,24 @@ cimg_pragma_openmp(parallel for cimg_openmp_if_size(whd,256)) for (longT N = 0; N1?tr - 1:(Tfloat)tr, - ntg = tg<0?tg + 1:tg>1?tg - 1:(Tfloat)tg, - ntb = tb<0?tb + 1:tb>1?tb - 1:(Tfloat)tb, - R = 6*ntr<1?p + (q - p)*6*ntr:2*ntr<1?q:3*ntr<2?p + (q - p)*6*(2.f/3 - ntr):p, - G = 6*ntg<1?p + (q - p)*6*ntg:2*ntg<1?q:3*ntg<2?p + (q - p)*6*(2.f/3 - ntg):p, - B = 6*ntb<1?p + (q - p)*6*ntb:2*ntb<1?q:3*ntb<2?p + (q - p)*6*(2.f/3 - ntb):p; - p1[N] = (T)cimg::cut(255*R,0,255); - p2[N] = (T)cimg::cut(255*G,0,255); - p3[N] = (T)cimg::cut(255*B,0,255); + C = (1 - cimg::abs(2*L - 1))*S, + X = C*(1 - cimg::abs(cimg::mod(H,(Tfloat)2) - 1)), + m = L - C/2; + Tfloat R, G, B; + switch ((int)H) { + case 0 : R = C; G = X; B = 0; break; + case 1 : R = X; G = C; B = 0; break; + case 2 : R = 0; G = C; B = X; break; + case 3 : R = 0; G = X; B = C; break; + case 4 : R = X; G = 0; B = C; break; + default : R = C; G = 0; B = X; + } + p1[N] = (T)((R + m)*255); + p2[N] = (T)((G + m)*255); + p3[N] = (T)((B + m)*255); } return *this; } @@ -29619,21 +32622,13 @@ R = (Tfloat)p1[N], G = (Tfloat)p2[N], B = (Tfloat)p3[N], - m = cimg::min(R,G,B), - M = cimg::max(R,G,B); - Tfloat H = 0, S = 0; - if (M!=m) { - const Tfloat - f = R==m?G - B:G==m?B - R:R - G, - i = R==m?3:G==m?5:1; - H = i - f/(M - m); - if (H>=6) H-=6; - H*=60; - S = (M - m)/M; - } - p1[N] = (T)cimg::cut(H,0,360); - p2[N] = (T)cimg::cut(S,0,1); - p3[N] = (T)cimg::cut(M/255,0,1); + M = cimg::max(R,G,B), + C = M - cimg::min(R,G,B), + H = 60*(C==0?0:M==R?cimg::mod((G-B)/C,(Tfloat)6):M==G?(B - R)/C + 2:(R - G)/C + 4), + S = M<=0?0:C/M; + p1[N] = (T)H; + p2[N] = (T)S; + p3[N] = (T)(M/255); } return *this; } @@ -29655,31 +32650,24 @@ cimg_pragma_openmp(parallel for cimg_openmp_if_size(whd,256)) for (longT N = 0; N& shift(const int delta_x, const int delta_y=0, const int delta_z=0, const int delta_c=0, const unsigned int boundary_conditions=0) { @@ -31636,31 +34648,31 @@ //! Permute axes order. /** - \param order Axes permutations, as a C-string of 4 characters. + \param axes_order Axes permutations, as a C-string of 4 characters. This function permutes image content regarding the specified axes permutation. **/ - CImg& permute_axes(const char *const order) { - return get_permute_axes(order).move_to(*this); + CImg& permute_axes(const char *const axes_order) { + return get_permute_axes(axes_order).move_to(*this); } //! Permute axes order \newinstance. - CImg get_permute_axes(const char *const order) const { + CImg get_permute_axes(const char *const axes_order) const { const T foo = (T)0; - return _permute_axes(order,foo); + return _permute_axes(axes_order,foo); } template - CImg _permute_axes(const char *const order, const t&) const { - if (is_empty() || !order) return CImg(*this,false); + CImg _permute_axes(const char *const axes_order, const t&) const { + if (is_empty() || !axes_order) return CImg(*this,false); CImg res; const T* ptrs = _data; unsigned char s_code[4] = { 0,1,2,3 }, n_code[4] = { 0 }; - for (unsigned int l = 0; order[l]; ++l) { - int c = cimg::lowercase(order[l]); - if (c!='x' && c!='y' && c!='z' && c!='c') { *s_code = 4; break; } + for (unsigned int l = 0; axes_order[l]; ++l) { + int c = cimg::lowercase(axes_order[l]); + if (l>=4 || (c!='x' && c!='y' && c!='z' && c!='c')) { *s_code = 4; break; } else { ++n_code[c%=4]; s_code[l] = c; } } - if (*order && *s_code<4 && *n_code<=1 && n_code[1]<=1 && n_code[2]<=1 && n_code[3]<=1) { + if (*axes_order && *s_code<4 && *n_code<=1 && n_code[1]<=1 && n_code[2]<=1 && n_code[3]<=1) { const unsigned int code = (s_code[0]<<12) | (s_code[1]<<8) | (s_code[2]<<4) | (s_code[3]); ulongT wh, whd; switch (code) { @@ -31864,9 +34876,9 @@ } if (!res) throw CImgArgumentException(_cimg_instance - "permute_axes(): Invalid specified permutation '%s'.", + "permute_axes(): Invalid specified axes order '%s'.", cimg_instance, - order); + axes_order); return res; } @@ -31880,7 +34892,7 @@ case 'x' : _width = siz; _height = _depth = _spectrum = 1; break; case 'y' : _height = siz; _width = _depth = _spectrum = 1; break; case 'z' : _depth = siz; _width = _height = _spectrum = 1; break; - default : _spectrum = siz; _width = _height = _depth = 1; + case 'c' : _spectrum = siz; _width = _height = _depth = 1; break; } return *this; } @@ -31989,7 +35001,7 @@ const float xc = x - rw2, yc = y - rh2, mx = cimg::mod(w2 + xc*ca + yc*sa,ww), my = cimg::mod(h2 - xc*sa + yc*ca,hh); - res(x,y,z,c) = _cubic_cut_atXY(mx{ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }. **/ template - CImg& warp(const CImg& warp, const unsigned int mode=0, + CImg& warp(const CImg& p_warp, const unsigned int mode=0, const unsigned int interpolation=1, const unsigned int boundary_conditions=0) { - return get_warp(warp,mode,interpolation,boundary_conditions).move_to(*this); + return get_warp(p_warp,mode,interpolation,boundary_conditions).move_to(*this); } //! Warp image content by a warping field \newinstance template - CImg get_warp(const CImg& warp, const unsigned int mode=0, + CImg get_warp(const CImg& p_warp, const unsigned int mode=0, const unsigned int interpolation=1, const unsigned int boundary_conditions=0) const { - if (is_empty() || !warp) return *this; - if (mode && !is_sameXYZ(warp)) + if (is_empty() || !p_warp) return *this; + if (mode && !is_sameXYZ(p_warp)) throw CImgArgumentException(_cimg_instance "warp(): Instance and specified relative warping field (%u,%u,%u,%u,%p) " "have different XYZ dimensions.", cimg_instance, - warp._width,warp._height,warp._depth,warp._spectrum,warp._data); + p_warp._width,p_warp._height,p_warp._depth,p_warp._spectrum,p_warp._data); - CImg res(warp._width,warp._height,warp._depth,_spectrum); + CImg res(p_warp._width,p_warp._height,p_warp._depth,_spectrum); - if (warp._spectrum==1) { // 1D warping + if (p_warp._spectrum==1) { // 1D warping if (mode>=3) { // Forward-relative warp res.fill((T)0); if (interpolation>=1) // Linear interpolation cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if_size(res.size(),4096)) cimg_forYZC(res,y,z,c) { - const t *ptrs0 = warp.data(0,y,z); const T *ptrs = data(0,y,z,c); + const t *ptrs0 = p_warp.data(0,y,z); const T *ptrs = data(0,y,z,c); cimg_forX(res,x) res.set_linear_atX(*(ptrs++),x + (float)*(ptrs0++),y,z,c); } else // Nearest-neighbor interpolation cimg_forYZC(res,y,z,c) { - const t *ptrs0 = warp.data(0,y,z); const T *ptrs = data(0,y,z,c); + const t *ptrs0 = p_warp.data(0,y,z); const T *ptrs = data(0,y,z,c); cimg_forX(res,x) { const int X = x + (int)cimg::round(*(ptrs0++)); if (X>=0 && X=1) // Linear interpolation cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if_size(res.size(),4096)) cimg_forYZC(res,y,z,c) { - const t *ptrs0 = warp.data(0,y,z); const T *ptrs = data(0,y,z,c); + const t *ptrs0 = p_warp.data(0,y,z); const T *ptrs = data(0,y,z,c); cimg_forX(res,x) res.set_linear_atX(*(ptrs++),(float)*(ptrs0++),y,z,c); } else // Nearest-neighbor interpolation cimg_forYZC(res,y,z,c) { - const t *ptrs0 = warp.data(0,y,z); const T *ptrs = data(0,y,z,c); + const t *ptrs0 = p_warp.data(0,y,z); const T *ptrs = data(0,y,z,c); cimg_forX(res,x) { const int X = (int)cimg::round(*(ptrs0++)); if (X>=0 && X=3) { // Forward-relative warp res.fill((T)0); if (interpolation>=1) // Linear interpolation cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if_size(res.size(),4096)) cimg_forYZC(res,y,z,c) { - const t *ptrs0 = warp.data(0,y,z,0), *ptrs1 = warp.data(0,y,z,1); const T *ptrs = data(0,y,z,c); + const t *ptrs0 = p_warp.data(0,y,z,0), *ptrs1 = p_warp.data(0,y,z,1); const T *ptrs = data(0,y,z,c); cimg_forX(res,x) res.set_linear_atXY(*(ptrs++),x + (float)*(ptrs0++),y + (float)*(ptrs1++),z,c); } else // Nearest-neighbor interpolation cimg_forYZC(res,y,z,c) { - const t *ptrs0 = warp.data(0,y,z,0), *ptrs1 = warp.data(0,y,z,1); const T *ptrs = data(0,y,z,c); + const t *ptrs0 = p_warp.data(0,y,z,0), *ptrs1 = p_warp.data(0,y,z,1); const T *ptrs = data(0,y,z,c); cimg_forX(res,x) { const int X = x + (int)cimg::round(*(ptrs0++)), Y = y + (int)cimg::round(*(ptrs1++)); if (X>=0 && X=0 && Y=1) // Linear interpolation cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if_size(res.size(),4096)) cimg_forYZC(res,y,z,c) { - const t *ptrs0 = warp.data(0,y,z,0), *ptrs1 = warp.data(0,y,z,1); const T *ptrs = data(0,y,z,c); + const t *ptrs0 = p_warp.data(0,y,z,0), *ptrs1 = p_warp.data(0,y,z,1); const T *ptrs = data(0,y,z,c); cimg_forX(res,x) res.set_linear_atXY(*(ptrs++),(float)*(ptrs0++),(float)*(ptrs1++),z,c); } else // Nearest-neighbor interpolation cimg_forYZC(res,y,z,c) { - const t *ptrs0 = warp.data(0,y,z,0), *ptrs1 = warp.data(0,y,z,1); const T *ptrs = data(0,y,z,c); + const t *ptrs0 = p_warp.data(0,y,z,0), *ptrs1 = p_warp.data(0,y,z,1); const T *ptrs = data(0,y,z,c); cimg_forX(res,x) { const int X = (int)cimg::round(*(ptrs0++)), Y = (int)cimg::round(*(ptrs1++)); if (X>=0 && X=0 && Y=1) // Linear interpolation cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if_size(res.size(),4096)) cimg_forYZC(res,y,z,c) { - const t *ptrs0 = warp.data(0,y,z,0), *ptrs1 = warp.data(0,y,z,1), *ptrs2 = warp.data(0,y,z,2); + const t *ptrs0 = p_warp.data(0,y,z,0), *ptrs1 = p_warp.data(0,y,z,1), *ptrs2 = p_warp.data(0,y,z,2); const T *ptrs = data(0,y,z,c); cimg_forX(res,x) res.set_linear_atXYZ(*(ptrs++),x + (float)*(ptrs0++),y + (float)*(ptrs1++), z + (float)*(ptrs2++),c); } else // Nearest-neighbor interpolation cimg_forYZC(res,y,z,c) { - const t *ptrs0 = warp.data(0,y,z,0), *ptrs1 = warp.data(0,y,z,1), *ptrs2 = warp.data(0,y,z,2); + const t *ptrs0 = p_warp.data(0,y,z,0), *ptrs1 = p_warp.data(0,y,z,1), *ptrs2 = p_warp.data(0,y,z,2); const T *ptrs = data(0,y,z,c); cimg_forX(res,x) { const int @@ -32885,13 +35895,13 @@ if (interpolation>=1) // Linear interpolation cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if_size(res.size(),4096)) cimg_forYZC(res,y,z,c) { - const t *ptrs0 = warp.data(0,y,z,0), *ptrs1 = warp.data(0,y,z,1), *ptrs2 = warp.data(0,y,z,2); + const t *ptrs0 = p_warp.data(0,y,z,0), *ptrs1 = p_warp.data(0,y,z,1), *ptrs2 = p_warp.data(0,y,z,2); const T *ptrs = data(0,y,z,c); cimg_forX(res,x) res.set_linear_atXYZ(*(ptrs++),(float)*(ptrs0++),(float)*(ptrs1++),(float)*(ptrs2++),c); } else // Nearest-neighbor interpolation cimg_forYZC(res,y,z,c) { - const t *ptrs0 = warp.data(0,y,z,0), *ptrs1 = warp.data(0,y,z,1), *ptrs2 = warp.data(0,y,z,2); + const t *ptrs0 = p_warp.data(0,y,z,0), *ptrs1 = p_warp.data(0,y,z,1), *ptrs2 = p_warp.data(0,y,z,2); const T *ptrs = data(0,y,z,c); cimg_forX(res,x) { const int @@ -32908,45 +35918,44 @@ const float w2 = 2.f*width(), h2 = 2.f*height(), d2 = 2.f*depth(); cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if_size(res.size(),4096)) cimg_forYZC(res,y,z,c) { - const t *ptrs0 = warp.data(0,y,z,0), *ptrs1 = warp.data(0,y,z,1), *ptrs2 = warp.data(0,y,z,2); + const t *ptrs0 = p_warp.data(0,y,z,0), *ptrs1 = p_warp.data(0,y,z,1), *ptrs2 = p_warp.data(0,y,z,2); T *ptrd = res.data(0,y,z,c); cimg_forX(res,x) { const float mx = cimg::mod(x - (float)*(ptrs0++),w2), my = cimg::mod(y - (float)*(ptrs1++),h2), mz = cimg::mod(z - (float)*(ptrs2++),d2); - *(ptrd++) = _cubic_cut_atXYZ(mx=0 && nx1=0 && ny1=0 && nz1=0 && nc1 res(1U + nx1 - nx0,1U + ny1 - ny0,1U + nz1 - nz0,1U + nc1 - nc0); if (nx0<0 || nx1>=width() || ny0<0 || ny1>=height() || nz0<0 || nz1>=depth() || nc0<0 || nc1>=spectrum()) - switch (boundary_conditions) { + switch (_boundary_conditions) { case 3 : { // Mirror const int w2 = 2*width(), h2 = 2*height(), d2 = 2*depth(), s2 = 2*spectrum(); cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if(_width>=(cimg_openmp_sizefactor)*16 && @@ -33405,16 +36423,6 @@ return (+*this).autocrop(color,axes); } - //! Autocrop image region, regarding the specified background color \overloading. - template CImg& autocrop(const CImg& color, const char *const axes="zyx") { - return get_autocrop(color,axes).move_to(*this); - } - - //! Autocrop image region, regarding the specified background color \newinstance. - template CImg get_autocrop(const CImg& color, const char *const axes="zyx") const { - return get_autocrop(color._data,axes); - } - CImg _autocrop(const T& value, const char axis) const { CImg res; switch (cimg::lowercase(axis)) { @@ -33694,7 +36702,7 @@ } } break; default : { // Fourth order interpolation - cimg_forX(coordinates,x) { + cimg_forX(coordinates,k) { *(ptr_x++) = X; *(ptr_y++) = Y; *(ptr_z++) = Z; float u0 = (float)(dl2*func(X,Y,Z,0)), @@ -34051,11 +37059,11 @@ //! Split image into a list along specified axis. /** \param axis Splitting axis. Can be { 'x' | 'y' | 'z' | 'c' }. - \param nb Number of splitted parts. + \param nb Number of split parts. \note - - If \c nb==0, instance image is splitted into blocs of egal values along the specified axis. - - If \c nb<=0, instance image is splitted into blocs of -\c nb pixel wide. - - If \c nb>0, instance image is splitted into \c nb blocs. + - If \c nb==0, instance image is split into blocs of egal values along the specified axis. + - If \c nb<=0, instance image is split into blocs of -\c nb pixel wide. + - If \c nb>0, instance image is split into \c nb blocs. **/ CImgList get_split(const char axis, const int nb=-1) const { CImgList res; @@ -34197,10 +37205,12 @@ /** \param values Splitting value sequence. \param axis Axis along which the splitting is performed. Can be '0' to ignore axis. - \param keep_values Tells if the splitting sequence must be kept in the splitted blocs. + \param keep_values Tells if the splitting sequence must be kept in the split blocs. **/ template CImgList get_split(const CImg& values, const char axis=0, const bool keep_values=true) const { + typedef _cimg_Tt Tt; + CImgList res; if (is_empty()) return res; const ulongT vsiz = values.size(); @@ -34247,13 +37257,18 @@ } break; default : { const ulongT siz = size(); + const char uaxis = (ulongT)_width==siz?'x':(ulongT)_depth==siz?'z':(ulongT)_spectrum==siz?'c':'y'; ulongT i0 = 0, i = 0; do { while (ii0) { if (keep_values) CImg(_data + i0,1,(unsigned int)(i - i0)).move_to(res); i0 = i; } + if (i>i0) { + if (keep_values) CImg(_data + i0,1,(unsigned int)(i - i0)).move_to(res); + i0 = i; + } while (ii0) { CImg(_data + i0,1,(unsigned int)(i - i0)).move_to(res); i0 = i; } } while (i=vsiz) j = 0; } + while (i<_width && (Tt)(*this)(i)==(Tt)values[j]) { ++i; if (++j>=vsiz) j = 0; } i-=j; if (i>i1) { if (i1>i0) get_columns(i0,i1 - 1).move_to(res); @@ -34278,9 +37293,9 @@ case 'y' : { unsigned int i0 = 0, i1 = 0, i = 0; do { - if ((*this)(0,i)==*values) { + if ((Tt)(*this)(0,i)==(Tt)*values) { i1 = i; j = 0; - while (i<_height && (*this)(0,i)==values[j]) { ++i; if (++j>=vsiz) j = 0; } + while (i<_height && (Tt)(*this)(0,i)==(Tt)values[j]) { ++i; if (++j>=vsiz) j = 0; } i-=j; if (i>i1) { if (i1>i0) get_rows(i0,i1 - 1).move_to(res); @@ -34294,9 +37309,9 @@ case 'z' : { unsigned int i0 = 0, i1 = 0, i = 0; do { - if ((*this)(0,0,i)==*values) { + if ((Tt)(*this)(0,0,i)==(Tt)*values) { i1 = i; j = 0; - while (i<_depth && (*this)(0,0,i)==values[j]) { ++i; if (++j>=vsiz) j = 0; } + while (i<_depth && (Tt)(*this)(0,0,i)==(Tt)values[j]) { ++i; if (++j>=vsiz) j = 0; } i-=j; if (i>i1) { if (i1>i0) get_slices(i0,i1 - 1).move_to(res); @@ -34310,9 +37325,9 @@ case 'c' : { unsigned int i0 = 0, i1 = 0, i = 0; do { - if ((*this)(0,0,0,i)==*values) { + if ((Tt)(*this)(0,0,0,i)==(Tt)*values) { i1 = i; j = 0; - while (i<_spectrum && (*this)(0,0,0,i)==values[j]) { ++i; if (++j>=vsiz) j = 0; } + while (i<_spectrum && (Tt)(*this)(0,0,0,i)==(Tt)values[j]) { ++i; if (++j>=vsiz) j = 0; } i-=j; if (i>i1) { if (i1>i0) get_channels(i0,i1 - 1).move_to(res); @@ -34324,12 +37339,13 @@ if (i0<_spectrum) get_channels(i0,spectrum() - 1).move_to(res); } break; default : { - ulongT i0 = 0, i1 = 0, i = 0; const ulongT siz = size(); + const char uaxis = (ulongT)_width==siz?'x':(ulongT)_depth==siz?'z':(ulongT)_spectrum==siz?'c':'y'; + ulongT i0 = 0, i1 = 0, i = 0; do { - if ((*this)[i]==*values) { + if ((Tt)(*this)[i]==(Tt)*values) { i1 = i; j = 0; - while (i=vsiz) j = 0; } + while (i=vsiz) j = 0; } i-=j; if (i>i1) { if (i1>i0) CImg(_data + i0,1,(unsigned int)(i1 - i0)).move_to(res); @@ -34339,6 +37355,7 @@ } else ++i; } while (i(_data + i0,1,(unsigned int)(siz - i0)).move_to(res); + if (uaxis!='y') cimglist_for(res,l) res[l].unroll(uaxis); } break; } } @@ -34390,436 +37407,529 @@ //! Correlate image by a kernel. /** \param kernel = the correlation kernel. - \param boundary_conditions boundary conditions can be (false=dirichlet, true=neumann) + \param boundary_conditions Boundary condition. Can be { 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }. \param is_normalized = enable local normalization. + \param channel mode Channel processing mode. Can be { 0=sum inputs | 1=one-for-one | 2=expand } + \param xcenter X-coordinate of the kernel center (~0U means 'centered'). + \param xstart Starting X-coordinate of the instance image. + \param xend Ending X-coordinate of the instance image. + \param xstride Stride along the X-axis. + \param xdilation Dilation along the X-axis. + \param ycenter Y-coordinate of the kernel center (~0U means 'centered'). + \param ystart Starting Y-coordinate of the instance image. + \param yend Ending Y-coordinate of the instance image. + \param ystride Stride along the Y-axis. + \param ydilation Dilation along the Y-axis. + \param zcenter Z-coordinate of the kernel center (~0U means 'centered'). + \param zstart Starting Z-coordinate of the instance image. + \param zend Ending Z-coordinate of the instance image. + \param zstride Stride along the Z-axis. + \param zdilation Dilation along the Z-axis. \note - The correlation of the image instance \p *this by the kernel \p kernel is defined to be: - res(x,y,z) = sum_{i,j,k} (*this)(x + i,y + j,z + k)*kernel(i,j,k). + res(x,y,z) = sum_{i,j,k} (*this)(\alpha_x\;x + \beta_x\;(i - c_x),\alpha_y\;y + \beta_y\;(j - + c_y),\alpha_z\;z + \beta_z\;(k - c_z))*kernel(i,j,k). **/ template - CImg& correlate(const CImg& kernel, const bool boundary_conditions=true, - const bool is_normalized=false) { + CImg& correlate(const CImg& kernel, const unsigned int boundary_conditions=1, + const bool is_normalized=false, const unsigned int channel_mode=1, + const unsigned int xcenter=~0U, const unsigned int ycenter=~0U, const unsigned int zcenter=~0U, + const unsigned int xstart=0, const unsigned int ystart=0, const unsigned zstart=0, + const unsigned int xend=~0U, const unsigned int yend=~0U, const unsigned int zend=~0U, + const float xstride=1, const float ystride=1, const float zstride=1, + const float xdilation=1, const float ydilation=1, const float zdilation=1) { if (is_empty() || !kernel) return *this; - return get_correlate(kernel,boundary_conditions,is_normalized).move_to(*this); + return get_correlate(kernel,boundary_conditions,is_normalized,channel_mode, + xcenter,ycenter,zcenter,xstart,ystart,zstart,xend,yend,zend, + xstride,ystride,zstride,xdilation,ydilation,zdilation).move_to(*this); } template - CImg<_cimg_Ttfloat> get_correlate(const CImg& kernel, const bool boundary_conditions=true, - const bool is_normalized=false) const { - return _correlate(kernel,boundary_conditions,is_normalized,false); + CImg<_cimg_Ttfloat> get_correlate(const CImg& kernel, const unsigned int boundary_conditions=1, + const bool is_normalized=false, const unsigned int channel_mode=1, + const unsigned int xcenter=~0U, const unsigned int ycenter=~0U, + const unsigned int zcenter=~0U, + const unsigned int xstart=0, const unsigned int ystart=0, const unsigned zstart=0, + const unsigned int xend=~0U, const unsigned int yend=~0U, + const unsigned int zend=~0U, + const float xstride=1, const float ystride=1, const float zstride=1, + const float xdilation=1, const float ydilation=1, const float zdilation=1) const { + return _correlate(kernel,boundary_conditions,is_normalized,channel_mode, + xcenter,ycenter,zcenter,xstart,ystart,zstart,xend,yend,zend, + xstride,ystride,zstride,xdilation,ydilation,zdilation,false); } //! Correlate image by a kernel \newinstance. template - CImg<_cimg_Ttfloat> _correlate(const CImg& kernel, const bool boundary_conditions, - const bool is_normalized, const bool is_convolution) const { + CImg<_cimg_Ttfloat> _correlate(const CImg& kernel, const unsigned int boundary_conditions, + const bool is_normalized, const unsigned int channel_mode, + const unsigned int xcenter, const unsigned int ycenter, const unsigned int zcenter, + const unsigned int xstart, const unsigned int ystart, const unsigned zstart, + const unsigned int xend, const unsigned int yend, const unsigned int zend, + const float xstride, const float ystride, const float zstride, + const float xdilation, const float ydilation, const float zdilation, + const bool is_convolve) const { if (is_empty() || !kernel) return *this; typedef _cimg_Ttfloat Ttfloat; CImg res; - const ulongT - res_whd = (ulongT)_width*_height*_depth, - res_size = res_whd*std::max(_spectrum,kernel._spectrum); - const bool - is_inner_parallel = _width*_height*_depth>=(cimg_openmp_sizefactor)*32768, - is_outer_parallel = res_size>=(cimg_openmp_sizefactor)*32768; - _cimg_abort_init_omp; + _cimg_abort_init_openmp; cimg_abort_init; - if (kernel._width==kernel._height && - ((kernel._depth==1 && kernel._width<=6) || (kernel._depth==kernel._width && kernel._width<=3))) { + if (xstart>xend || ystart>yend || zstart>zend) + throw CImgArgumentException(_cimg_instance + "%s(): Invalid xyz-start/end arguments (start = (%u,%u,%u), end = (%u,%u,%u)).", + cimg_instance, + is_convolve?"convolve":"correlate", + xstart,ystart,zstart,xend,yend,zend); + if (xstride<=0 || ystride<=0 || zstride<=0) + throw CImgArgumentException(_cimg_instance + "%s(): Invalid stride arguments (%g,%g,%g).", + cimg_instance, + is_convolve?"convolve":"correlate", + xstride,ystride,zstride); + const int + _xstart = (int)std::min(xstart,_width - 1), + _ystart = (int)std::min(ystart,_height - 1), + _zstart = (int)std::min(zstart,_depth - 1), + _xend = (int)std::min(xend,_width - 1), + _yend = (int)std::min(yend,_height - 1), + _zend = (int)std::min(zend,_depth - 1), + nwidth = 1 + (int)std::floor((_xend - _xstart)/xstride), + nheight = 1 + (int)std::floor((_yend - _ystart)/ystride), + ndepth = 1 + (int)std::floor((_zend + _zstart)/zstride), + _xstride = (int)cimg::round(xstride), + _ystride = (int)cimg::round(ystride), + _zstride = (int)cimg::round(zstride); + + const ulongT + res_whd = (ulongT)nwidth*nheight*ndepth, + res_size = res_whd*res._spectrum; + const bool + is_inner_parallel = res_whd>=(cimg_openmp_sizefactor)*32768, + is_outer_parallel = res_size>=(cimg_openmp_sizefactor)*32768; + cimg::unused(is_inner_parallel,is_outer_parallel); + + int + _xcenter = xcenter==~0U?kernel.width()/2 - 1 + (kernel.width()%2):(int)std::min(xcenter,kernel._width - 1), + _ycenter = ycenter==~0U?kernel.height()/2 - 1 + (kernel.height()%2):(int)std::min(ycenter,kernel._height - 1), + _zcenter = zcenter==~0U?kernel.depth()/2 - 1 + (kernel.depth()%2):(int)std::min(zcenter,kernel._depth - 1), + _xdilation = (int)cimg::round(xdilation), + _ydilation = (int)cimg::round(ydilation), + _zdilation = (int)cimg::round(zdilation); + + const bool is_int_stride_dilation = + xstride==_xstride && ystride==_ystride && zstride==_zstride && + xdilation==_xdilation && ydilation==_ydilation && zdilation==_zdilation; + + CImg _kernel; + if (is_convolve) { // If convolution, go back to correlation + _kernel = CImg(kernel._data,kernel.size()/kernel._spectrum,1,1,kernel._spectrum,true). + get_mirror('x').resize(kernel,-1); + _xcenter = kernel.width() - 1 - _xcenter; + _ycenter = kernel.height() - 1 - _ycenter; + _zcenter = kernel.depth() - 1 - _zcenter; + } else _kernel = kernel.get_shared(); + + if (_kernel._width==_kernel._height && _kernel._width>1 && _kernel._height>1 && + ((_kernel._depth==1 && _kernel._width<=5) || (_kernel._depth==_kernel._width && _kernel._width<=3)) && + boundary_conditions<=1 && channel_mode && + _xcenter==_kernel.width()/2 - 1 + (_kernel.width()%2) && + _ycenter==_kernel.height()/2 - 1 + (_kernel.height()%2) && + _zcenter==_kernel.depth()/2 - 1 + (_kernel.depth()%2) && + is_int_stride_dilation && _xdilation>=0 && _ydilation>=0 && _zdilation>=0) { + + // Optimized versions for centered 2x2, 3x3, 4x4, 5x5, 2x2x2 and 3x3x3 kernels. + const int dw = 1 - (_kernel.width()%2), dh = 1 - (_kernel.height()%2), dd = 1 - (_kernel.depth()%2); + if (dw || dh || dd) // Force kernel size to be odd + _kernel.get_resize(_kernel.width() + dw,_kernel.height() + dh,_kernel.depth() + dd,_kernel.spectrum(), + 0,0,1,1,1).move_to(_kernel.assign()); - // Special optimization done for 2x2, 3x3, 4x4, 5x5, 6x6, 2x2x2 and 3x3x3 kernel. - if (!boundary_conditions && res_whd<=3000*3000) { // Dirichlet boundaries - // For relatively small images, adding a zero border then use optimized NxN convolution loops is faster. - res = (kernel._depth==1?get_crop(-1,-1,_width,_height):get_crop(-1,-1,-1,_width,_height,_depth)). - _correlate(kernel,true,is_normalized,is_convolution); - if (kernel._depth==1) res.crop(1,1,res._width - 2,res._height - 2); - else res.crop(1,1,1,res._width - 2,res._height - 2,res._depth - 2); + if (!boundary_conditions) { // Dirichlet -> Add a 1px zero border, then use _correlate() with Neumann + const int + dx = _kernel._width==1?0:1, + dy = _kernel._height==1?0:1, + dz = _kernel._depth==1?0:1; + return get_crop(-dx,-dy,-dz,width() - 1 + dx,height() - 1 + dy,depth() - 1 + dz). + _correlate(_kernel,true,is_normalized,channel_mode,_xcenter,_ycenter,_zcenter, + _xstart + dx,_ystart + dy,_zstart + dz,_xend + dx,_yend + dy,_zend + dz, + xstride,ystride,zstride,xdilation,ydilation,zdilation,false); } else { // Neumann boundaries - res.assign(_width,_height,_depth,std::max(_spectrum,kernel._spectrum)); - cimg::unused(is_inner_parallel,is_outer_parallel); - CImg _kernel; - if (is_convolution) { // Add empty column/row/slice to shift kernel center in case of convolution - const int dw = !(kernel.width()%2), dh = !(kernel.height()%2), dd = !(kernel.depth()%2); - if (dw || dh || dd) - kernel.get_resize(kernel.width() + dw,kernel.height() + dh,kernel.depth() + dd,-100,0,0). - move_to(_kernel); - } - if (!_kernel) _kernel = kernel.get_shared(); + res.assign(nwidth,nheight,ndepth,std::max(_spectrum,_kernel._spectrum)); switch (_kernel._depth) { - case 3 : { - cimg_pragma_openmp(parallel for cimg_openmp_if(is_outer_parallel)) - cimg_forC(res,c) { - cimg_abort_test; - const CImg img = get_shared_channel(c%_spectrum); - const CImg K = _kernel.get_shared_channel(c%kernel._spectrum); - CImg I(27); - Ttfloat *ptrd = res.data(0,0,0,c); - if (is_normalized) { - const Ttfloat _M = (Ttfloat)K.magnitude(2), M = _M*_M; - cimg_for3x3x3(img,x,y,z,0,I,T) { - const Ttfloat N = M*(I[ 0]*I[ 0] + I[ 1]*I[ 1] + I[ 2]*I[ 2] + - I[ 3]*I[ 3] + I[ 4]*I[ 4] + I[ 5]*I[ 5] + - I[ 6]*I[ 6] + I[ 7]*I[ 7] + I[ 8]*I[ 8] + - I[ 9]*I[ 9] + I[10]*I[10] + I[11]*I[11] + - I[12]*I[12] + I[13]*I[13] + I[14]*I[14] + - I[15]*I[15] + I[16]*I[16] + I[17]*I[17] + - I[18]*I[18] + I[19]*I[19] + I[20]*I[20] + - I[21]*I[21] + I[22]*I[22] + I[23]*I[23] + - I[24]*I[24] + I[25]*I[25] + I[26]*I[26]); - *(ptrd++) = (Ttfloat)(N?(I[ 0]*K[ 0] + I[ 1]*K[ 1] + I[ 2]*K[ 2] + - I[ 3]*K[ 3] + I[ 4]*K[ 4] + I[ 5]*K[ 5] + - I[ 6]*K[ 6] + I[ 7]*K[ 7] + I[ 8]*K[ 8] + - I[ 9]*K[ 9] + I[10]*K[10] + I[11]*K[11] + - I[12]*K[12] + I[13]*K[13] + I[14]*K[14] + - I[15]*K[15] + I[16]*K[16] + I[17]*K[17] + - I[18]*K[18] + I[19]*K[19] + I[20]*K[20] + - I[21]*K[21] + I[22]*K[22] + I[23]*K[23] + - I[24]*K[24] + I[25]*K[25] + I[26]*K[26])/std::sqrt(N):0); - } - } else cimg_for3x3x3(img,x,y,z,0,I,T) - *(ptrd++) = (Ttfloat)(I[ 0]*K[ 0] + I[ 1]*K[ 1] + I[ 2]*K[ 2] + - I[ 3]*K[ 3] + I[ 4]*K[ 4] + I[ 5]*K[ 5] + - I[ 6]*K[ 6] + I[ 7]*K[ 7] + I[ 8]*K[ 8] + - I[ 9]*K[ 9] + I[10]*K[10] + I[11]*K[11] + - I[12]*K[12] + I[13]*K[13] + I[14]*K[14] + - I[15]*K[15] + I[16]*K[16] + I[17]*K[17] + - I[18]*K[18] + I[19]*K[19] + I[20]*K[20] + - I[21]*K[21] + I[22]*K[22] + I[23]*K[23] + - I[24]*K[24] + I[25]*K[25] + I[26]*K[26]); - } - } break; - case 2 : { - cimg_pragma_openmp(parallel for cimg_openmp_if(is_outer_parallel)) - cimg_forC(res,c) { + case 3 : { // 3x3x3 centered kernel + cimg_forC(res,c) { cimg_abort_test; - const CImg img = get_shared_channel(c%_spectrum); + const CImg I = get_shared_channel(c%_spectrum); const CImg K = _kernel.get_shared_channel(c%kernel._spectrum); - CImg I(8); - Ttfloat *ptrd = res.data(0,0,0,c); + const int w1 = I.width() - 1, h1 = I.height() - 1, d1 = I.depth() - 1; + CImg _res = res.get_shared_channel(c); if (is_normalized) { - const Ttfloat _M = (Ttfloat)K.magnitude(2), M = _M*_M; - cimg_for2x2x2(img,x,y,z,0,I,T) { - const Ttfloat N = M*(I[0]*I[0] + I[1]*I[1] + - I[2]*I[2] + I[3]*I[3] + - I[4]*I[4] + I[5]*I[5] + - I[6]*I[6] + I[7]*I[7]); - *(ptrd++) = (Ttfloat)(N?(I[0]*K[0] + I[1]*K[1] + - I[2]*K[2] + I[3]*K[3] + - I[4]*K[4] + I[5]*K[5] + - I[6]*K[6] + I[7]*K[7])/std::sqrt(N):0); - } - } else cimg_for2x2x2(img,x,y,z,0,I,T) - *(ptrd++) = (Ttfloat)(I[0]*K[0] + I[1]*K[1] + - I[2]*K[2] + I[3]*K[3] + - I[4]*K[4] + I[5]*K[5] + - I[6]*K[6] + I[7]*K[7]); + const Ttfloat M = (Ttfloat)K.magnitude(2), M2 = M*M; + cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if_size(_res.size(),16384)) + cimg_forXYZ(res,X,Y,Z) { + const int + x = _xstart + _xstride*X, y = _ystart + _ystride*Y, z = _zstart + _zstride*Z, + px = x - _xdilation>0?x - _xdilation:0, nx = x + _xdilation0?y - _ydilation:0, ny = y + _ydilation0?z - _zdilation:0, nz = z + _zdilation0?x - _xdilation:0, nx = x + _xdilation0?y - _ydilation:0, ny = y + _ydilation0?z - _zdilation:0, nz = z + _zdilation img = get_shared_channel(c%_spectrum); - const CImg K = _kernel.get_shared_channel(c%kernel._spectrum); - CImg I(36); - Ttfloat *ptrd = res.data(0,0,0,c); - if (is_normalized) { - const Ttfloat _M = (Ttfloat)K.magnitude(2), M = _M*_M; - cimg_forZ(img,z) cimg_for6x6(img,x,y,z,0,I,T) { - const Ttfloat N = M*(I[ 0]*I[ 0] + I[ 1]*I[ 1] + I[ 2]*I[ 2] + I[ 3]*I[ 3] + I[ 4]*I[ 4] + - I[ 5]*I[ 5] + I[ 6]*I[ 6] + I[ 7]*I[ 7] + I[ 8]*I[ 8] + I[ 9]*I[ 9] + - I[10]*I[10] + I[11]*I[11] + I[12]*I[12] + I[13]*I[13] + I[14]*I[14] + - I[15]*I[15] + I[16]*I[16] + I[17]*I[17] + I[18]*I[18] + I[19]*I[19] + - I[20]*I[20] + I[21]*I[21] + I[22]*I[22] + I[23]*I[23] + I[24]*I[24] + - I[25]*I[25] + I[26]*I[26] + I[27]*I[27] + I[28]*I[28] + I[29]*I[29] + - I[30]*I[30] + I[31]*I[31] + I[32]*I[32] + I[33]*I[33] + I[34]*I[34] + - I[35]*I[35]); - *(ptrd++) = (Ttfloat)(N?(I[ 0]*K[ 0] + I[ 1]*K[ 1] + I[ 2]*K[ 2] + I[ 3]*K[ 3] + - I[ 4]*K[ 4] + I[ 5]*K[ 5] + I[ 6]*K[ 6] + I[ 7]*K[ 7] + - I[ 8]*K[ 8] + I[ 9]*K[ 9] + I[10]*K[10] + I[11]*K[11] + - I[12]*K[12] + I[13]*K[13] + I[14]*K[14] + I[15]*K[15] + - I[16]*K[16] + I[17]*K[17] + I[18]*K[18] + I[19]*K[19] + - I[20]*K[20] + I[21]*K[21] + I[22]*K[22] + I[23]*K[23] + - I[24]*K[24] + I[25]*K[25] + I[26]*K[26] + I[27]*K[27] + - I[28]*K[28] + I[29]*K[29] + I[30]*K[30] + I[31]*K[31] + - I[32]*K[32] + I[33]*K[33] + I[34]*K[34] + I[35]*K[35])/ - std::sqrt(N):0); - } - } else cimg_forZ(img,z) cimg_for6x6(img,x,y,z,0,I,T) - *(ptrd++) = (Ttfloat)(I[ 0]*K[ 0] + I[ 1]*K[ 1] + I[ 2]*K[ 2] + I[ 3]*K[ 3] + - I[ 4]*K[ 4] + I[ 5]*K[ 5] + I[ 6]*K[ 6] + I[ 7]*K[ 7] + - I[ 8]*K[ 8] + I[ 9]*K[ 9] + I[10]*K[10] + I[11]*K[11] + - I[12]*K[12] + I[13]*K[13] + I[14]*K[14] + I[15]*K[15] + - I[16]*K[16] + I[17]*K[17] + I[18]*K[18] + I[19]*K[19] + - I[20]*K[20] + I[21]*K[21] + I[22]*K[22] + I[23]*K[23] + - I[24]*K[24] + I[25]*K[25] + I[26]*K[26] + I[27]*K[27] + - I[28]*K[28] + I[29]*K[29] + I[30]*K[30] + I[31]*K[31] + - I[32]*K[32] + I[33]*K[33] + I[34]*K[34] + I[35]*K[35]); - } - } break; - case 5 : { - cimg_pragma_openmp(parallel for cimg_openmp_if(is_outer_parallel)) - cimg_forC(res,c) { + case 5 : { // 5x5 centered kernel + cimg_forC(res,c) { cimg_abort_test; - const CImg img = get_shared_channel(c%_spectrum); + const CImg I = get_shared_channel(c%_spectrum); const CImg K = _kernel.get_shared_channel(c%kernel._spectrum); - CImg I(25); - Ttfloat *ptrd = res.data(0,0,0,c); + const int w1 = I.width() - 1, h1 = I.height() - 1; + CImg _res = res.get_shared_channel(c); if (is_normalized) { - const Ttfloat _M = (Ttfloat)K.magnitude(2), M = _M*_M; - cimg_forZ(img,z) cimg_for5x5(img,x,y,z,0,I,T) { - const Ttfloat N = M*(I[ 0]*I[ 0] + I[ 1]*I[ 1] + I[ 2]*I[ 2] + I[ 3]*I[ 3] + I[ 4]*I[ 4] + - I[ 5]*I[ 5] + I[ 6]*I[ 6] + I[ 7]*I[ 7] + I[ 8]*I[ 8] + I[ 9]*I[ 9] + - I[10]*I[10] + I[11]*I[11] + I[12]*I[12] + I[13]*I[13] + I[14]*I[14] + - I[15]*I[15] + I[16]*I[16] + I[17]*I[17] + I[18]*I[18] + I[19]*I[19] + - I[20]*I[20] + I[21]*I[21] + I[22]*I[22] + I[23]*I[23] + I[24]*I[24]); - *(ptrd++) = (Ttfloat)(N?(I[ 0]*K[ 0] + I[ 1]*K[ 1] + I[ 2]*K[ 2] + I[ 3]*K[ 3] + - I[ 4]*K[ 4] + I[ 5]*K[ 5] + I[ 6]*K[ 6] + I[ 7]*K[ 7] + - I[ 8]*K[ 8] + I[ 9]*K[ 9] + I[10]*K[10] + I[11]*K[11] + - I[12]*K[12] + I[13]*K[13] + I[14]*K[14] + I[15]*K[15] + - I[16]*K[16] + I[17]*K[17] + I[18]*K[18] + I[19]*K[19] + - I[20]*K[20] + I[21]*K[21] + I[22]*K[22] + I[23]*K[23] + - I[24]*K[24])/std::sqrt(N):0); + const Ttfloat M = (Ttfloat)K.magnitude(2), M2 = M*M; + cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if_size(_res.size(),16384)) + cimg_forXYZ(res,X,Y,z) { + const int + x = _xstart + _xstride*X, y = _ystart + _ystride*Y, + px = x - _xdilation>0?x - _xdilation:0, bx = px - _xdilation>0?px - _xdilation:0, + nx = x + _xdilation0?y - _ydilation:0, by = py - _ydilation>0?py - _ydilation:0, + ny = y + _ydilation img = get_shared_channel(c%_spectrum); - const CImg K = _kernel.get_shared_channel(c%kernel._spectrum); - CImg I(16); - Ttfloat *ptrd = res.data(0,0,0,c); - if (is_normalized) { - const Ttfloat _M = (Ttfloat)K.magnitude(2), M = _M*_M; - cimg_forZ(img,z) cimg_for4x4(img,x,y,z,0,I,T) { - const Ttfloat N = M*(I[ 0]*I[ 0] + I[ 1]*I[ 1] + I[ 2]*I[ 2] + I[ 3]*I[ 3] + - I[ 4]*I[ 4] + I[ 5]*I[ 5] + I[ 6]*I[ 6] + I[ 7]*I[ 7] + - I[ 8]*I[ 8] + I[ 9]*I[ 9] + I[10]*I[10] + I[11]*I[11] + - I[12]*I[12] + I[13]*I[13] + I[14]*I[14] + I[15]*I[15]); - *(ptrd++) = (Ttfloat)(N?(I[ 0]*K[ 0] + I[ 1]*K[ 1] + I[ 2]*K[ 2] + I[ 3]*K[ 3] + - I[ 4]*K[ 4] + I[ 5]*K[ 5] + I[ 6]*K[ 6] + I[ 7]*K[ 7] + - I[ 8]*K[ 8] + I[ 9]*K[ 9] + I[10]*K[10] + I[11]*K[11] + - I[12]*K[12] + I[13]*K[13] + I[14]*K[14] + I[15]*K[15])/ - std::sqrt(N):0); + } else { + cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) cimg_openmp_if_size(_res.size(),16384)) + cimg_forXYZ(res,X,Y,z) { + const int + x = _xstart + _xstride*X, y = _ystart + _ystride*Y, + px = x - _xdilation>0?x - _xdilation:0, bx = px - _xdilation>0?px - _xdilation:0, + nx = x + _xdilation0?y - _ydilation:0, by = py - _ydilation>0?py - _ydilation:0, + ny = y + _ydilation img = get_shared_channel(c%_spectrum); + const CImg I = get_shared_channel(c%_spectrum); const CImg K = _kernel.get_shared_channel(c%kernel._spectrum); - CImg I(9); - Ttfloat *ptrd = res.data(0,0,0,c); + CImg _res = res.get_shared_channel(c); + const int w1 = I.width() - 1, h1 = I.height() - 1; if (is_normalized) { - const Ttfloat _M = (Ttfloat)K.magnitude(2), M = _M*_M; - cimg_forZ(img,z) cimg_for3x3(img,x,y,z,0,I,T) { - const Ttfloat N = M*(I[0]*I[0] + I[1]*I[1] + I[2]*I[2] + - I[3]*I[3] + I[4]*I[4] + I[5]*I[5] + - I[6]*I[6] + I[7]*I[7] + I[8]*I[8]); - *(ptrd++) = (Ttfloat)(N?(I[0]*K[0] + I[1]*K[1] + I[2]*K[2] + - I[3]*K[3] + I[4]*K[4] + I[5]*K[5] + - I[6]*K[6] + I[7]*K[7] + I[8]*K[8])/std::sqrt(N):0); + const Ttfloat M = (Ttfloat)K.magnitude(2), M2 = M*M; + cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if_size(_res.size(),16384)) + cimg_forXYZ(res,X,Y,z) { + const int + x = _xstart + _xstride*X, y = _ystart + _ystride*Y, + px = x - _xdilation>0?x - _xdilation:0, nx = x + _xdilation0?y - _ydilation:0, ny = y + _ydilation img = get_shared_channel(c%_spectrum); - const CImg K = _kernel.get_shared_channel(c%kernel._spectrum); - CImg I(4); - Ttfloat *ptrd = res.data(0,0,0,c); - if (is_normalized) { - const Ttfloat _M = (Ttfloat)K.magnitude(2), M = _M*_M; - cimg_forZ(img,z) cimg_for2x2(img,x,y,z,0,I,T) { - const Ttfloat N = M*(I[0]*I[0] + I[1]*I[1] + - I[2]*I[2] + I[3]*I[3]); - *(ptrd++) = (Ttfloat)(N?(I[0]*K[0] + I[1]*K[1] + - I[2]*K[2] + I[3]*K[3])/std::sqrt(N):0); + } else { + cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) cimg_openmp_if_size(_res.size(),16384)) + cimg_forXYZ(res,X,Y,z) { + const int + x = _xstart + _xstride*X, y = _ystart + _ystride*Y, + px = x - _xdilation>0?x - _xdilation:0, nx = x + _xdilation0?y - _ydilation:0, ny = y + _ydilation img = get_shared_channel(c%_spectrum); - const CImg K = _kernel.get_shared_channel(c%kernel._spectrum); - res.get_shared_channel(c).assign(img)*=K[0]; - } - break; } } } - } + } else if (_kernel._width==1 && _kernel._height==1 && _kernel._depth==1 && + xstride==1 && ystride==1 && ystride==1) { - if (!res) { // Generic version for other kernels and boundary conditions - res.assign(_width,_height,_depth,std::max(_spectrum,kernel._spectrum)); - int - mx2 = kernel.width()/2, my2 = kernel.height()/2, mz2 = kernel.depth()/2, - mx1 = kernel.width() - mx2 - 1, my1 = kernel.height() - my2 - 1, mz1 = kernel.depth() - mz2 - 1; - if (is_convolution) cimg::swap(mx1,mx2,my1,my2,mz1,mz2); // Shift kernel center in case of convolution - const int - mxe = width() - mx2, mye = height() - my2, mze = depth() - mz2; - cimg_pragma_openmp(parallel for cimg_openmp_if(!is_inner_parallel && is_outer_parallel)) - cimg_forC(res,c) _cimg_abort_try_omp { - cimg_abort_test; - const CImg img = get_shared_channel(c%_spectrum); - const CImg K = kernel.get_shared_channel(c%kernel._spectrum); - if (is_normalized) { // Normalized correlation - const Ttfloat _M = (Ttfloat)K.magnitude(2), M = _M*_M; + // Special optimization for 1x1 kernel. + res = get_crop(_xstart,_ystart,_zstart,_xend,_yend,_zend); + switch (channel_mode) { + case 0 : { // Sum input channels + CImg res0 = res.get_shared_channel(0); + for (int c = 1; c K = _kernel.get_shared_channel(kc%_kernel._spectrum); + int w2 = 0, h2 = 0, d2 = 0; + Ttfloat M = 0, M2 = 0; + if (is_normalized) { M = (Ttfloat)K.magnitude(2); M2 = M*M; } + if (boundary_conditions>=3) { w2 = 2*width(); h2 = 2*height(); d2 = 2*depth(); } + res.fill(0); cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if(is_inner_parallel)) - for (int z = mz1; z=mye || z=mze)?++x:((x=mxe)?++x:(x=mxe))) { - Ttfloat val = 0, N = 0; - for (int zm = -mz1; zm<=mz2; ++zm) - for (int ym = -my1; ym<=my2; ++ym) - for (int xm = -mx1; xm<=mx2; ++xm) { - const Ttfloat _val = (Ttfloat)img._atXYZ(x + xm,y + ym,z + zm); - val+=_val*K(mx1 + xm,my1 + ym,mz1 + zm); - N+=_val*_val; - } - N*=M; - res(x,y,z,c) = (Ttfloat)(N?val/std::sqrt(N):0); + cimg_forXYZC(res,x,y,z,c) { + Ttfloat _val, val = 0, N = 0; + + if (is_int_stride_dilation) + cimg_forXYZ(_kernel,p,q,r) { + const int + ix = (int)xstart + _xstride*x + _xdilation*(p - _xcenter), + iy = (int)ystart + _ystride*y + _ydilation*(q - _ycenter), + iz = (int)zstart + _zstride*z + _zdilation*(r - _zcenter); + switch (boundary_conditions) { + case 0 : _val = atXYZ(ix,iy,iz,c,0); break; // Dirichlet + case 1 : _val = _atXYZ(ix,iy,iz,c); break; // Neumann + case 2 : _val = (*this)(cimg::mod(ix,width()),cimg::mod(iy,height()), // Periodic + cimg::mod(iz,depth()),c); break; + default : { // Mirror + const int mx = cimg::mod(ix,w2), my = cimg::mod(iy,h2), mz = cimg::mod(iz,d2); + _val = (*this)(mx=mye || z=mze)?++x:((x=mxe)?++x:(x=mxe))) { - Ttfloat val = 0, N = 0; - for (int zm = -mz1; zm<=mz2; ++zm) - for (int ym = -my1; ym<=my2; ++ym) - for (int xm = -mx1; xm<=mx2; ++xm) { - const Ttfloat _val = (Ttfloat)img.atXYZ(x + xm,y + ym,z + zm,0,(T)0); - val+=_val*K(mx1 + xm,my1 + ym,mz1 + zm); - N+=_val*_val; - } - N*=M; - res(x,y,z,c) = (Ttfloat)(N?val/std::sqrt(N):0); + else + cimg_forXYZ(_kernel,p,q,r) { + const float + ix = xstart + xstride*x + xdilation*(p - _xcenter), + iy = ystart + ystride*y + ydilation*(q - _ycenter), + iz = zstart + zstride*z + zdilation*(r - _zcenter); + switch (boundary_conditions) { + case 0 : _val = linear_atXYZ(ix,iy,iz,c,0); break; // Dirichlet + case 1 : _val = _linear_atXYZ(ix,iy,iz,c); break; // Neumann + case 2 : _val = _linear_atXYZ_p(ix,iy,iz,c); break; // Periodic + default : { // Mirror + const int mx = cimg::mod(ix,w2), my = cimg::mod(iy,h2), mz = cimg::mod(iz,d2); + _val = linear_atXYZ(mx I = get_shared_channel(c%_spectrum); + const CImg K = _kernel.get_shared_channel(channel_mode==1?c%_kernel._spectrum:c/_spectrum); + int w2 = 0, h2 = 0, d2 = 0; + Ttfloat M = 0, M2 = 0; + if (is_normalized) { M = (Ttfloat)K.magnitude(2); M2 = M*M; } + if (boundary_conditions>=3) { w2 = 2*I.width(); h2 = 2*I.height(); d2 = 2*I.depth(); } cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if(is_inner_parallel)) - for (int z = mz1; z=mye || z=mze)?++x:((x=mxe)?++x:(x=mxe))) { - Ttfloat val = 0; - for (int zm = -mz1; zm<=mz2; ++zm) - for (int ym = -my1; ym<=my2; ++ym) - for (int xm = -mx1; xm<=mx2; ++xm) - val+=img._atXYZ(x + xm,y + ym,z + zm)*K(mx1 + xm,my1 + ym,mz1 + zm); - res(x,y,z,c) = (Ttfloat)val; + cimg_forXYZ(res,x,y,z) { + Ttfloat _val, val = 0, N = 0; + + if (is_int_stride_dilation) + cimg_forXYZ(_kernel,p,q,r) { + const int + ix = (int)xstart + _xstride*x + _xdilation*(p - _xcenter), + iy = (int)ystart + _ystride*y + _ydilation*(q - _ycenter), + iz = (int)zstart + _zstride*z + _zdilation*(r - _zcenter); + switch (boundary_conditions) { + case 0 : _val = I.atXYZ(ix,iy,iz,0,0); break; // Dirichlet + case 1 : _val = I._atXYZ(ix,iy,iz); break; // Neumann + case 2 : _val = I(cimg::mod(ix,I.width()),cimg::mod(iy,I.height()), // Periodic + cimg::mod(iz,I.depth())); break; + default : { // Mirror + const int mx = cimg::mod(ix,w2), my = cimg::mod(iy,h2), mz = cimg::mod(iz,d2); + _val = I(mx=mye || z=mze)?++x:((x=mxe)?++x:(x=mxe))) { - Ttfloat val = 0; - for (int zm = -mz1; zm<=mz2; ++zm) - for (int ym = -my1; ym<=my2; ++ym) - for (int xm = -mx1; xm<=mx2; ++xm) - val+=img.atXYZ(x + xm,y + ym,z + zm,0,(T)0)*K(mx1 + xm,my1 + ym,mz1 + zm); - res(x,y,z,c) = (Ttfloat)val; + else + cimg_forXYZ(_kernel,p,q,r) { + const float + ix = xstart + xstride*x + xdilation*(p - _xcenter), + iy = ystart + ystride*y + ydilation*(q - _ycenter), + iz = zstart + zstride*z + zdilation*(r - _zcenter); + switch (boundary_conditions) { + case 0 : _val = I.linear_atXYZ(ix,iy,iz,0,0); break; // Dirichlet + case 1 : _val = I._linear_atXYZ(ix,iy,iz); break; // Neumann + case 2 : _val = I._linear_atXYZ_p(ix,iy,iz); break; // Periodic + default : { // Mirror + const int mx = cimg::mod(ix,w2), my = cimg::mod(iy,h2), mz = cimg::mod(iz,d2); + _val = I.linear_atXYZ(mx - CImg& convolve(const CImg& kernel, const bool boundary_conditions=true, const bool is_normalized=false) { + \param channel mode Channel processing mode. Can be { 0=sum inputs | 1=one-for-one | 2=expand } + \param xcenter X-coordinate of the kernel center (~0U means 'centered'). + \param xstart Starting X-coordinate of the instance image. + \param xend Ending X-coordinate of the instance image. + \param xstride Stride along the X-axis. + \param xdilation Dilation along the X-axis. + \param ycenter Y-coordinate of the kernel center (~0U means 'centered'). + \param ystart Starting Y-coordinate of the instance image. + \param yend Ending Y-coordinate of the instance image. + \param ystride Stride along the Y-axis. + \param ydilation Dilation along the Y-axis. + \param zcenter Z-coordinate of the kernel center (~0U means 'centered'). + \param zstart Starting Z-coordinate of the instance image. + \param zend Ending Z-coordinate of the instance image. + \param zstride Stride along the Z-axis. + \param zdilation Dilation along the Z-axis. + \note + - The convolution of the image instance \p *this by the kernel \p kernel is defined to be: + res(x,y,z) = sum_{i,j,k} (*this)(\alpha_x\;x - \beta_x\;(i - c_x),\alpha_y\;y + - \beta_y\;(j - c_y),\alpha_z\;z - \beta_z\;(k - c_z))*kernel(i,j,k). + **/ + template + CImg& convolve(const CImg& kernel, const unsigned int boundary_conditions=1, + const bool is_normalized=false, const unsigned int channel_mode=1, + const unsigned int xcenter=~0U, const unsigned int ycenter=~0U, const unsigned int zcenter=~0U, + const unsigned int xstart=0, const unsigned int ystart=0, const unsigned zstart=0, + const unsigned int xend=~0U, const unsigned int yend=~0U, const unsigned int zend=~0U, + const float xstride=1, const float ystride=1, const float zstride=1, + const float xdilation=1, const float ydilation=1, const float zdilation=1) { if (is_empty() || !kernel) return *this; - return get_convolve(kernel,boundary_conditions,is_normalized).move_to(*this); + return get_convolve(kernel,boundary_conditions,is_normalized,channel_mode, + xcenter,ycenter,zcenter,xstart,ystart,zstart,xend,yend,zend, + xstride,ystride,zstride,xdilation,ydilation,zdilation).move_to(*this); } //! Convolve image by a kernel \newinstance. template - CImg<_cimg_Ttfloat> get_convolve(const CImg& kernel, const bool boundary_conditions=true, - const bool is_normalized=false) const { - return _correlate(CImg(kernel._data,kernel.size()/kernel._spectrum,1,1,kernel._spectrum,true). - get_mirror('x').resize(kernel,-1),boundary_conditions,is_normalized,true); + CImg<_cimg_Ttfloat> get_convolve(const CImg& kernel, const unsigned int boundary_conditions=1, + const bool is_normalized=false, const unsigned int channel_mode=1, + const unsigned int xcenter=~0U, const unsigned int ycenter=~0U, + const unsigned int zcenter=~0U, + const unsigned int xstart=0, const unsigned int ystart=0, const unsigned zstart=0, + const unsigned int xend=~0U, const unsigned int yend=~0U, + const unsigned int zend=~0U, + const float xstride=1, const float ystride=1, const float zstride=1, + const float xdilation=1, const float ydilation=1, const float zdilation=1) const { + return _correlate(kernel,boundary_conditions,is_normalized,channel_mode, + xcenter,ycenter,zcenter,xstart,ystart,zstart,xend,yend,zend, + xstride,ystride,zstride,xdilation,ydilation,zdilation,true); } //! Cumulate image values, optionally along specified axis. @@ -34924,10 +38034,10 @@ is_inner_parallel = _width*_height*_depth>=(cimg_openmp_sizefactor)*32768, is_outer_parallel = res.size()>=(cimg_openmp_sizefactor)*32768; cimg::unused(is_inner_parallel,is_outer_parallel); - _cimg_abort_init_omp; + _cimg_abort_init_openmp; cimg_abort_init; cimg_pragma_openmp(parallel for cimg_openmp_if(!is_inner_parallel && is_outer_parallel)) - cimg_forC(res,c) _cimg_abort_try_omp { + cimg_forC(res,c) _cimg_abort_try_openmp { cimg_abort_test; const CImg img = get_shared_channel(c%_spectrum); const CImg K = kernel.get_shared_channel(c%kernel._spectrum); @@ -34935,7 +38045,7 @@ cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if(is_inner_parallel)) for (int z = mz1; z::max(); for (int zm = -mz1; zm<=mz2; ++zm) @@ -34946,10 +38056,10 @@ if (cval=mye || z=mze)?++x:((x=mxe)?++x:(x=mxe))) { Tt min_val = cimg::type::max(); @@ -34962,10 +38072,10 @@ } res(x,y,z,c) = min_val; } - } _cimg_abort_catch_omp2 + } _cimg_abort_catch_openmp2 else cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) cimg_openmp_if(is_inner_parallel)) - cimg_forYZ(res,y,z) _cimg_abort_try_omp2 { + cimg_forYZ(res,y,z) _cimg_abort_try_openmp2 { cimg_abort_test2; for (int x = 0; x=mye || z=mze)?++x:((x=mxe)?++x:(x=mxe))) { Tt min_val = cimg::type::max(); @@ -34978,13 +38088,13 @@ } res(x,y,z,c) = min_val; } - } _cimg_abort_catch_omp2 + } _cimg_abort_catch_openmp2 } else { // Binary erosion cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if(is_inner_parallel)) for (int z = mz1; z::max(); for (int zm = -mz1; zm<=mz2; ++zm) @@ -34995,10 +38105,10 @@ if (cval=mye || z=mze)?++x:((x=mxe)?++x:(x=mxe))) { Tt min_val = cimg::type::max(); @@ -35006,15 +38116,15 @@ for (int ym = -my1; ym<=my2; ++ym) for (int xm = -mx1; xm<=mx2; ++xm) if (K(mx1 + xm,my1 + ym,mz1 + zm)) { - const T cval = (Tt)img._atXYZ(x + xm,y + ym,z + zm); + const Tt cval = (Tt)img._atXYZ(x + xm,y + ym,z + zm); if (cval=mye || z=mze)?++x:((x=mxe)?++x:(x=mxe))) { Tt min_val = cimg::type::max(); @@ -35022,14 +38132,14 @@ for (int ym = -my1; ym<=my2; ++ym) for (int xm = -mx1; xm<=mx2; ++xm) if (K(mx1 + xm,my1 + ym,mz1 + zm)) { - const T cval = (Tt)img.atXYZ(x + xm,y + ym,z + zm,0,(T)0); + const Tt cval = (Tt)img.atXYZ(x + xm,y + ym,z + zm,0,(T)0); if (cval=ptrse) { - T *pd = data(0,y,z,c); cur = std::min(cur,*ptrse); cimg_forX(buf,x) { *pd = cur; pd+=off; } + T *pd = data(0,y,z,c); cur = std::min(cur,*ptrse); cimg_forX(buf,k) { *pd = cur; pd+=off; } } else { for (int p = s1; p>0 && ptrd<=ptrde; --p) { const T val = *ptrs; if (ptrs=ptrse) { - T *pd = data(x,0,z,c); cur = std::min(cur,*ptrse); cimg_forX(buf,x) { *pd = cur; pd+=off; } + T *pd = data(x,0,z,c); cur = std::min(cur,*ptrse); cimg_forX(buf,k) { *pd = cur; pd+=off; } } else { for (int p = s1; p>0 && ptrd<=ptrde; --p) { const T val = *ptrs; if (ptrs=ptrse) { - T *pd = data(x,y,0,c); cur = std::min(cur,*ptrse); cimg_forX(buf,x) { *pd = cur; pd+=off; } + T *pd = data(x,y,0,c); cur = std::min(cur,*ptrse); cimg_forX(buf,k) { *pd = cur; pd+=off; } } else { for (int p = s1; p>0 && ptrd<=ptrde; --p) { const T val = *ptrs; if (ptrs=(cimg_openmp_sizefactor)*32768, is_outer_parallel = res.size()>=(cimg_openmp_sizefactor)*32768; cimg::unused(is_inner_parallel,is_outer_parallel); - _cimg_abort_init_omp; + _cimg_abort_init_openmp; cimg_abort_init; cimg_pragma_openmp(parallel for cimg_openmp_if(!is_inner_parallel && is_outer_parallel)) - cimg_forC(res,c) _cimg_abort_try_omp { + cimg_forC(res,c) _cimg_abort_try_openmp { cimg_abort_test; const CImg img = get_shared_channel(c%_spectrum); const CImg K = kernel.get_shared_channel(c%kernel._spectrum); @@ -35225,7 +38335,7 @@ cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if(is_inner_parallel)) for (int z = mz1; z::min(); for (int zm = -mz1; zm<=mz2; ++zm) @@ -35236,10 +38346,10 @@ if (cval>max_val) max_val = cval; } res(x,y,z,c) = max_val; - } _cimg_abort_catch_omp2 + } _cimg_abort_catch_openmp2 if (boundary_conditions) cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) cimg_openmp_if(is_inner_parallel)) - cimg_forYZ(res,y,z) _cimg_abort_try_omp2 { + cimg_forYZ(res,y,z) _cimg_abort_try_openmp2 { cimg_abort_test2; for (int x = 0; x=mye || z=mze)?++x:((x=mxe)?++x:(x=mxe))) { Tt max_val = cimg::type::min(); @@ -35252,10 +38362,10 @@ } res(x,y,z,c) = max_val; } - } _cimg_abort_catch_omp2 + } _cimg_abort_catch_openmp2 else cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) cimg_openmp_if(is_inner_parallel)) - cimg_forYZ(*this,y,z) _cimg_abort_try_omp2 { + cimg_forYZ(*this,y,z) _cimg_abort_try_openmp2 { cimg_abort_test2; for (int x = 0; x=mye || z=mze)?++x:((x=mxe)?++x:(x=mxe))) { Tt max_val = cimg::type::min(); @@ -35268,12 +38378,12 @@ } res(x,y,z,c) = max_val; } - } _cimg_abort_catch_omp2 + } _cimg_abort_catch_openmp2 } else { // Binary dilation cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if(is_inner_parallel)) for (int z = mz1; z::min(); for (int zm = -mz1; zm<=mz2; ++zm) @@ -35284,10 +38394,10 @@ if (cval>max_val) max_val = cval; } res(x,y,z,c) = max_val; - } _cimg_abort_catch_omp2 + } _cimg_abort_catch_openmp2 if (boundary_conditions) cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) cimg_openmp_if(is_inner_parallel)) - cimg_forYZ(res,y,z) _cimg_abort_try_omp2 { + cimg_forYZ(res,y,z) _cimg_abort_try_openmp2 { cimg_abort_test2; for (int x = 0; x=mye || z=mze)?++x:((x=mxe)?++x:(x=mxe))) { Tt max_val = cimg::type::min(); @@ -35295,15 +38405,15 @@ for (int ym = -my1; ym<=my2; ++ym) for (int xm = -mx1; xm<=mx2; ++xm) if (K(mx2 - xm,my2 - ym,mz2 - zm)) { - const T cval = (Tt)img._atXYZ(x + xm,y + ym,z + zm); + const Tt cval = (Tt)img._atXYZ(x + xm,y + ym,z + zm); if (cval>max_val) max_val = cval; } res(x,y,z,c) = max_val; } - } _cimg_abort_catch_omp2 + } _cimg_abort_catch_openmp2 else cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) cimg_openmp_if(is_inner_parallel)) - cimg_forYZ(res,y,z) _cimg_abort_try_omp2 { + cimg_forYZ(res,y,z) _cimg_abort_try_openmp2 { cimg_abort_test2; for (int x = 0; x=mye || z=mze)?++x:((x=mxe)?++x:(x=mxe))) { Tt max_val = cimg::type::min(); @@ -35311,14 +38421,14 @@ for (int ym = -my1; ym<=my2; ++ym) for (int xm = -mx1; xm<=mx2; ++xm) if (K(mx2 - xm,my2 - ym,mz2 - zm)) { - const T cval = (Tt)img.atXYZ(x + xm,y + ym,z + zm,0,(T)0); + const Tt cval = (Tt)img.atXYZ(x + xm,y + ym,z + zm,0,(T)0); if (cval>max_val) max_val = cval; } res(x,y,z,c) = max_val; } - } _cimg_abort_catch_omp2 + } _cimg_abort_catch_openmp2 } - } _cimg_abort_catch_omp + } _cimg_abort_catch_openmp cimg_abort_test; return res; } @@ -35344,7 +38454,7 @@ } *(ptrd++) = cur; if (ptrs>=ptrse) { - T *pd = data(0,y,z,c); cur = std::max(cur,*ptrse); cimg_forX(buf,x) { *pd = cur; pd+=off; } + T *pd = data(0,y,z,c); cur = std::max(cur,*ptrse); cimg_forX(buf,k) { *pd = cur; pd+=off; } } else { for (int p = s1; p>0 && ptrd<=ptrde; --p) { const T val = *ptrs; if (ptrs=cur) { cur = val; is_first = false; } @@ -35386,7 +38496,7 @@ } *(ptrd++) = cur; if (ptrs>=ptrse) { - T *pd = data(x,0,z,c); cur = std::max(cur,*ptrse); cimg_forX(buf,x) { *pd = cur; pd+=off; } + T *pd = data(x,0,z,c); cur = std::max(cur,*ptrse); cimg_forX(buf,k) { *pd = cur; pd+=off; } } else { for (int p = s1; p>0 && ptrd<=ptrde; --p) { const T val = *ptrs; if (ptrs=cur) { cur = val; is_first = false; } @@ -35428,7 +38538,7 @@ } *(ptrd++) = cur; if (ptrs>=ptrse) { - T *pd = data(x,y,0,c); cur = std::max(cur,*ptrse); cimg_forX(buf,x) { *pd = cur; pd+=off; } + T *pd = data(x,y,0,c); cur = std::max(cur,*ptrse); cimg_forX(buf,k) { *pd = cur; pd+=off; } } else { for (int p = s1; p>0 && ptrd<=ptrde; --p) { const T val = *ptrs; if (ptrs=cur) { cur = val; is_first = false; } @@ -35494,7 +38604,7 @@ if ((*this)(X,Y,Z)) { \ ns = labels(X,Y,Z) - 1; xs = seeds(ns,0); ys = seeds(ns,1); zs = seeds(ns,2); \ d = cimg::sqr((float)x - xs) + cimg::sqr((float)y - ys) + cimg::sqr((float)z - zs); \ - if (d::inf(); - T label = (T)0; + T nlabel = (T)0; _cimg_watershed_propagate(is_px,px,y,z); _cimg_watershed_propagate(is_nx,nx,y,z); _cimg_watershed_propagate(is_py,x,py,z); @@ -35616,7 +38726,7 @@ _cimg_watershed_propagate(is_nx && is_ny && is_nz,nx,ny,nz); } } - (*this)(x,y,z) = label; + (*this)(x,y,z) = nlabel; labels(x,y,z) = ++nmin; } return *this; @@ -35640,7 +38750,7 @@ (*this)(siz - 1,1) = (T)x; (*this)(siz - 1,2) = (T)y; (*this)(siz - 1,3) = (T)z; - for (unsigned int pos = siz - 1, par = 0; pos && value>(*this)(par=(pos + 1)/2 - 1,0); pos = par) { + for (unsigned int pos = siz - 1, par = 0; pos && value>(tv)(*this)(par=(pos + 1)/2 - 1,0); pos = par) { cimg::swap((*this)(pos,0),(*this)(par,0)); cimg::swap((*this)(pos,1),(*this)(par,1)); cimg::swap((*this)(pos,2),(*this)(par,2)); @@ -35655,31 +38765,18 @@ (*this)(0,2) = (*this)(siz,2); (*this)(0,3) = (*this)(siz,3); const float value = (*this)(0,0); - for (unsigned int pos = 0, left = 0, right = 0; - ((right=2*(pos + 1),(left=right - 1))(*this)(right,0)) { - cimg::swap((*this)(pos,0),(*this)(left,0)); - cimg::swap((*this)(pos,1),(*this)(left,1)); - cimg::swap((*this)(pos,2),(*this)(left,2)); - cimg::swap((*this)(pos,3),(*this)(left,3)); - pos = left; - } else { - cimg::swap((*this)(pos,0),(*this)(right,0)); - cimg::swap((*this)(pos,1),(*this)(right,1)); - cimg::swap((*this)(pos,2),(*this)(right,2)); - cimg::swap((*this)(pos,3),(*this)(right,3)); - pos = right; - } - } else { - cimg::swap((*this)(pos,0),(*this)(left,0)); - cimg::swap((*this)(pos,1),(*this)(left,1)); - cimg::swap((*this)(pos,2),(*this)(left,2)); - cimg::swap((*this)(pos,3),(*this)(left,3)); - pos = left; - } - } + unsigned int pos = 0, swap = 0; + do { + const unsigned int left = 2*pos + 1, right = left + 1; + if (right(*this)(right,0)?left:right; + else if (left& deriche(const float sigma, const unsigned int order=0, const char axis='x', const bool boundary_conditions=true) { #define _cimg_deriche_apply \ - CImg Y(N); \ - Tfloat *ptrY = Y._data, yb = 0, yp = 0; \ + CImg Y(N); \ + double *ptrY = Y._data, yb = 0, yp = 0; \ T xp = (T)0; \ - if (boundary_conditions) { xp = *ptrX; yb = yp = (Tfloat)(coefp*xp); } \ + if (boundary_conditions) { xp = *ptrX; yb = yp = (double)(coefp*xp); } \ for (int m = 0; m=0; --n) { \ const T xc = *(ptrX-=off); \ - const Tfloat yc = (Tfloat)(a2*xn + a3*xa - b1*yn - b2*ya); \ + const double yc = (double)(a2*xn + a3*xa - b1*yn - b2*ya); \ xa = xn; xn = xc; ya = yn; yn = yc; \ *ptrX = (T)(*(--ptrY)+yc); \ } const char naxis = cimg::lowercase(axis); - const float nsigma = sigma>=0?sigma:-sigma*(naxis=='x'?_width:naxis=='y'?_height:naxis=='z'?_depth:_spectrum)/100; + const double nsigma = sigma>=0?sigma:-sigma*(naxis=='x'?_width: + naxis=='y'?_height: + naxis=='z'?_depth:_spectrum)/100; if (is_empty() || (nsigma<0.1f && !order)) return *this; - const float + const double nnsigma = nsigma<0.1f?0.1f:nsigma, alpha = 1.695f/nnsigma, - ema = (float)std::exp(-alpha), - ema2 = (float)std::exp(-2*alpha), + ema = std::exp(-alpha), + ema2 = std::exp(-2*alpha), b1 = -2*ema, b2 = ema2; - float a0 = 0, a1 = 0, a2 = 0, a3 = 0, coefp = 0, coefn = 0; + double a0 = 0, a1 = 0, a2 = 0, a3 = 0, coefp = 0, coefn = 0; switch (order) { case 0 : { - const float k = (1-ema)*(1-ema)/(1 + 2*alpha*ema-ema2); + const double k = (1-ema)*(1-ema)/(1 + 2*alpha*ema-ema2); a0 = k; a1 = k*(alpha - 1)*ema; a2 = k*(alpha + 1)*ema; a3 = -k*ema2; } break; case 1 : { - const float k = -(1-ema)*(1-ema)*(1-ema)/(2*(ema + 1)*ema); + const double k = -(1-ema)*(1-ema)*(1-ema)/(2*(ema + 1)*ema); a0 = a3 = 0; a1 = k*ema; a2 = -a1; } break; case 2 : { - const float - ea = (float)std::exp(-alpha), + const double + ea = std::exp(-alpha), k = -(ema2 - 1)/(2*alpha*ema), kn = (-2*(-1 + 3*ea - 3*ea*ea + ea*ea*ea)/(3*ea + 1 + 3*ea*ea + ea*ea*ea)); a0 = kn; @@ -35800,7 +38899,7 @@ \param filter the coefficient of the filter in the following order [n,n - 1,n - 2,n - 3]. \param N size of the data \param off the offset between two data point - \param order the order of the filter 0 (smoothing), 1st derivtive, 2nd derivative, 3rd derivative + \param order the order of the filter 0 (smoothing), 1st derivative, 2nd derivative, 3rd derivative \param boundary_conditions Boundary conditions. Can be { 0=dirichlet | 1=neumann }. \note Boundary condition using B. Triggs method (IEEE trans on Sig Proc 2005). */ @@ -35828,7 +38927,7 @@ if (!pass) { for (int k = 1; k<4; ++k) val[k] = (boundary_conditions?*data/sumsq:0); } else { - // apply Triggs boundary conditions + // Apply Triggs boundary conditions const double uplus = iplus/(1. - a1 - a2 - a3), vplus = uplus/(1. - a1 - a2 - a3), unp = val[1] - uplus, unp1 = val[2] - uplus, unp2 = val[3] - uplus; @@ -35857,7 +38956,7 @@ for (int k = 0; k<3; ++k) x[k] = (boundary_conditions?*data:(T)0); for (int k = 0; k<4; ++k) val[k] = 0; } else { - // apply Triggs boundary conditions + // Apply Triggs boundary conditions const double unp = val[1], unp1 = val[2], unp2 = val[3]; val[0] = (M[0] * unp + M[1] * unp1 + M[2] * unp2) * sum; @@ -35890,7 +38989,7 @@ for (int k = 0; k<3; ++k) x[k] = (boundary_conditions?*data:(T)0); for (int k = 0; k<4; ++k) val[k] = 0; } else { - // apply Triggs boundary conditions + // Apply Triggs boundary conditions const double unp = val[1], unp1 = val[2], unp2 = val[3]; val[0] = (M[0] * unp + M[1] * unp1 + M[2] * unp2) * sum; @@ -35919,7 +39018,7 @@ for (int k = 0; k<3; ++k) x[k] = (boundary_conditions?*data:(T)0); for (int k = 0; k<4; ++k) val[k] = 0; } else { - // apply Triggs boundary conditions + // Apply Triggs boundary conditions const double unp = val[1], unp1 = val[2], unp2 = val[3]; val[0] = (M[0] * unp + M[1] * unp1 + M[2] * unp2) * sum; @@ -36098,7 +39197,7 @@ unsigned int iamplitude = cimg::round(namplitude); const bool is_3d = (G._spectrum==6); T val_min, val_max = max_min(val_min); - _cimg_abort_init_omp; + _cimg_abort_init_openmp; cimg_abort_init; if (da<=0) { // Iterated oriented Laplacians @@ -36177,7 +39276,7 @@ cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) cimg_openmp_if(_width>=(cimg_openmp_sizefactor)*256 && _height*_depth>=2) firstprivate(val)) - cimg_forYZ(*this,y,z) _cimg_abort_try_omp2 { + cimg_forYZ(*this,y,z) _cimg_abort_try_openmp2 { cimg_abort_test2; cimg_forX(*this,x) { val.fill(0); @@ -36249,7 +39348,7 @@ if (S>0) cimg_forC(res,c) { *ptrd+=val[c]/S; ptrd+=whd; } else cimg_forC(res,c) { *ptrd+=(Tfloat)((*this)(x,y,z,c)); ptrd+=whd; } } - } _cimg_abort_catch_omp2 + } _cimg_abort_catch_openmp2 } } } else { // 2D LIC algorithm @@ -36273,7 +39372,7 @@ cimg_abort_test; cimg_pragma_openmp(parallel for cimg_openmp_if(_width>=(cimg_openmp_sizefactor)*256 && _height>=2) firstprivate(val)) - cimg_forY(*this,y) _cimg_abort_try_omp2 { + cimg_forY(*this,y) _cimg_abort_try_openmp2 { cimg_abort_test2; cimg_forX(*this,x) { val.fill(0); @@ -36339,13 +39438,13 @@ if (S>0) cimg_forC(res,c) { *ptrd+=val[c]/S; ptrd+=whd; } else cimg_forC(res,c) { *ptrd+=(Tfloat)((*this)(x,y,0,c)); ptrd+=whd; } } - } _cimg_abort_catch_omp2 + } _cimg_abort_catch_openmp2 } } const Tfloat *ptrs = res._data; cimg_for(*this,ptrd,T) { - const Tfloat val = *(ptrs++)/N; - *ptrd = valval_max?val_max:(T)val); + const Tfloat _val = *(ptrs++)/N; + *ptrd = _valval_max?val_max:(T)_val); } } cimg_abort_test; @@ -36433,7 +39532,7 @@ _sigma_x = sigma_x>=0?sigma_x:-sigma_x*_width/100, _sigma_y = sigma_y>=0?sigma_y:-sigma_y*_height/100, _sigma_z = sigma_z>=0?sigma_z:-sigma_z*_depth/100, - _sigma_r = sigma_r>=0?sigma_r:-sigma_r*(edge_max - edge_min)/100, + _sigma_r = sigma_r>=0?sigma_r:-sigma_r*edge_delta/100, _sampling_x = sampling_x?sampling_x:std::max(_sigma_x,1.f), _sampling_y = sampling_y?sampling_y:std::max(_sigma_y,1.f), _sampling_z = sampling_z?sampling_z:std::max(_sigma_z,1.f), @@ -36559,7 +39658,7 @@ \param N size of the data \param boxsize Size of the box filter (can be subpixel). \param off the offset between two data point - \param order the order of the filter 0 (smoothing), 1st derivtive and 2nd derivative. + \param order the order of the filter 0 (smoothing), 1st derivative and 2nd derivative. \param boundary_conditions Boundary conditions. Can be { 0=dirichlet | 1=neumann }. */ static void _cimg_blur_box_apply(T *ptr, const float boxsize, const int N, const ulongT off, @@ -36779,116 +39878,159 @@ //! Blur image using patch-based space. /** + \param guide Image used to model the smoothing weights. \param sigma_s Amount of blur along the XYZ-axes. - \param sigma_p Amount of blur along the value axis. + \param sigma_r Amount of blur along the value axis. \param patch_size Size of the patches. \param lookup_size Size of the window to search similar patches. \param smoothness Smoothness for the patch comparison. \param is_fast_approx Tells if a fast approximation of the gaussian function is used or not. **/ - CImg& blur_patch(const float sigma_s, const float sigma_p, const unsigned int patch_size=3, + template + CImg& blur_patch(const CImg& guide, + const float sigma_s, const float sigma_r, const unsigned int patch_size=3, const unsigned int lookup_size=4, const float smoothness=0, const bool is_fast_approx=true) { if (is_empty() || !patch_size || !lookup_size) return *this; - return get_blur_patch(sigma_s,sigma_p,patch_size,lookup_size,smoothness,is_fast_approx).move_to(*this); + return get_blur_patch(guide,sigma_s,sigma_r,patch_size,lookup_size,smoothness,is_fast_approx).move_to(*this); } //! Blur image using patch-based space \newinstance. - CImg get_blur_patch(const float sigma_s, const float sigma_p, const unsigned int patch_size=3, + template + CImg get_blur_patch(const CImg& guide, + const float sigma_s, const float sigma_r, const unsigned int patch_size=3, const unsigned int lookup_size=4, const float smoothness=0, const bool is_fast_approx=true) const { -#define _cimg_blur_patch3d_fast(N) \ - cimg_for##N##XYZ(res,x,y,z) { \ - T *pP = P._data; cimg_forC(res,c) { cimg_get##N##x##N##x##N(img,x,y,z,c,pP,T); pP+=N3; } \ +#define _cimg_blur_patch3d_fast(N) { \ + cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) \ + cimg_openmp_if(res._width>=(cimg_openmp_sizefactor)*32 && res._height*res._depth>=4) \ + firstprivate(P,Q)) \ + cimg_forXYZ(res,x,y,z) _cimg_abort_try_openmp { \ + cimg_abort_test; \ + cimg_def##N##x##N##x##N(res,x,y,z); \ + tfloat *pP = P._data; cimg_forC(_guide,c) { cimg_get##N##x##N##x##N(_guide,x,y,z,c,pP,tfloat); pP+=N3; } \ const int x0 = x - rsize1, y0 = y - rsize1, z0 = z - rsize1, \ - x1 = x + rsize2, y1 = y + rsize2, z1 = z + rsize2; \ - float sum_weights = 0; \ + x1 = x + rsize2, y1 = y + rsize2, z1 = z + rsize2; \ + tfloat sum_weights = 0; \ cimg_for_in##N##XYZ(res,x0,y0,z0,x1,y1,z1,p,q,r) \ - if (cimg::abs((Tfloat)img(x,y,z,0) - (Tfloat)img(p,q,r,0))3?0.f:1.f; \ + const tfloat dx = (tfloat)p - x, dy = (tfloat)q - y, dz = (tfloat)r - z, \ + alldist = distance2 + (dx*dx + dy*dy + dz*dz)/sigma_s2, weight = alldist>3?0:1; \ sum_weights+=weight; \ - cimg_forC(res,c) res(x,y,z,c)+=weight*(*this)(p,q,r,c); \ + cimg_forC(res,c) res(x,y,z,c)+=(Tfloat)weight*(*this)(p,q,r,c); \ } \ - if (sum_weights>0) cimg_forC(res,c) res(x,y,z,c)/=sum_weights; \ + if (sum_weights>1e-10) cimg_forC(res,c) res(x,y,z,c)/=(Tfloat)sum_weights; \ else cimg_forC(res,c) res(x,y,z,c) = (Tfloat)((*this)(x,y,z,c)); \ - } + } _cimg_abort_catch_openmp } -#define _cimg_blur_patch3d(N) \ - cimg_for##N##XYZ(res,x,y,z) { \ - T *pP = P._data; cimg_forC(res,c) { cimg_get##N##x##N##x##N(img,x,y,z,c,pP,T); pP+=N3; } \ +#define _cimg_blur_patch3d(N) { \ + cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) \ + cimg_openmp_if(res._width>=(cimg_openmp_sizefactor)*32 && res._height*res._depth>=4) \ + firstprivate(P,Q)) \ + cimg_forXYZ(res,x,y,z) _cimg_abort_try_openmp { \ + cimg_abort_test; \ + cimg_def##N##x##N##x##N(res,x,y,z); \ + tfloat *pP = P._data; cimg_forC(_guide,c) { cimg_get##N##x##N##x##N(_guide,x,y,z,c,pP,tfloat); pP+=N3; } \ const int x0 = x - rsize1, y0 = y - rsize1, z0 = z - rsize1, \ - x1 = x + rsize2, y1 = y + rsize2, z1 = z + rsize2; \ - float sum_weights = 0, weight_max = 0; \ + x1 = x + rsize2, y1 = y + rsize2, z1 = z + rsize2; \ + tfloat sum_weights = 0, weight_max = 0; \ cimg_for_in##N##XYZ(res,x0,y0,z0,x1,y1,z1,p,q,r) if (p!=x || q!=y || r!=z) { \ - T *pQ = Q._data; cimg_forC(res,c) { cimg_get##N##x##N##x##N(img,p,q,r,c,pQ,T); pQ+=N3; } \ - float distance2 = 0; \ - pQ = Q._data; cimg_for(P,pP,T) { const float dI = (float)*pP - (float)*(pQ++); distance2+=dI*dI; } \ + tfloat *pQ = Q._data; cimg_forC(_guide,c) { cimg_get##N##x##N##x##N(_guide,p,q,r,c,pQ,tfloat); pQ+=N3; } \ + tfloat distance2 = 0; \ + pQ = Q._data; cimg_for(P,_pP,tfloat) { const tfloat dI = *_pP - *(pQ++); distance2+=dI*dI; } \ distance2/=Pnorm; \ - const float dx = (float)p - x, dy = (float)q - y, dz = (float)r - z, \ - alldist = distance2 + (dx*dx + dy*dy + dz*dz)/sigma_s2, weight = (float)std::exp(-alldist); \ + const tfloat dx = (tfloat)p - x, dy = (tfloat)q - y, dz = (tfloat)r - z, \ + alldist = distance2 + (dx*dx + dy*dy + dz*dz)/sigma_s2, weight = std::exp(-alldist); \ if (weight>weight_max) weight_max = weight; \ sum_weights+=weight; \ - cimg_forC(res,c) res(x,y,z,c)+=weight*(*this)(p,q,r,c); \ + cimg_forC(res,c) res(x,y,z,c)+=(Tfloat)weight*(*this)(p,q,r,c); \ } \ - sum_weights+=weight_max; cimg_forC(res,c) res(x,y,z,c)+=weight_max*(*this)(x,y,z,c); \ - if (sum_weights>0) cimg_forC(res,c) res(x,y,z,c)/=sum_weights; \ + sum_weights+=weight_max; cimg_forC(res,c) res(x,y,z,c)+=(Tfloat)weight_max*(*this)(x,y,z,c); \ + if (sum_weights>1e-10) cimg_forC(res,c) res(x,y,z,c)/=(Tfloat)sum_weights; \ else cimg_forC(res,c) res(x,y,z,c) = (Tfloat)((*this)(x,y,z,c)); \ - } + } _cimg_abort_catch_openmp } -#define _cimg_blur_patch2d_fast(N) \ - cimg_for##N##XY(res,x,y) { \ - T *pP = P._data; cimg_forC(res,c) { cimg_get##N##x##N(img,x,y,0,c,pP,T); pP+=N2; } \ +#define _cimg_blur_patch2d_fast(N) { \ + cimg_pragma_openmp(parallel for cimg_openmp_if(res._width>=(cimg_openmp_sizefactor)*32 && res._height>=4) \ + firstprivate(P,Q)) \ + cimg_forXY(res,x,y) _cimg_abort_try_openmp { \ + cimg_abort_test; \ + cimg_def##N##x##N(res,x,y); \ + tfloat *pP = P._data; cimg_forC(_guide,c) { cimg_get##N##x##N(_guide,x,y,0,c,pP,tfloat); pP+=N2; } \ const int x0 = x - rsize1, y0 = y - rsize1, x1 = x + rsize2, y1 = y + rsize2; \ - float sum_weights = 0; \ + tfloat sum_weights = 0; \ cimg_for_in##N##XY(res,x0,y0,x1,y1,p,q) \ - if (cimg::abs((Tfloat)img(x,y,0,0) - (Tfloat)img(p,q,0,0))3?0.f:1.f; \ + const tfloat dx = (tfloat)p - x, dy = (tfloat)q - y, \ + alldist = distance2 + (dx*dx+dy*dy)/sigma_s2, weight = alldist>3?0:1; \ sum_weights+=weight; \ - cimg_forC(res,c) res(x,y,c)+=weight*(*this)(p,q,c); \ + cimg_forC(res,c) res(x,y,c)+=(Tfloat)weight*(*this)(p,q,c); \ } \ - if (sum_weights>0) cimg_forC(res,c) res(x,y,c)/=sum_weights; \ + if (sum_weights>1e-10) cimg_forC(res,c) res(x,y,c)/=(Tfloat)sum_weights; \ else cimg_forC(res,c) res(x,y,c) = (Tfloat)((*this)(x,y,c)); \ - } + } _cimg_abort_catch_openmp } -#define _cimg_blur_patch2d(N) \ - cimg_for##N##XY(res,x,y) { \ - T *pP = P._data; cimg_forC(res,c) { cimg_get##N##x##N(img,x,y,0,c,pP,T); pP+=N2; } \ +#define _cimg_blur_patch2d(N) { \ + cimg_pragma_openmp(parallel for cimg_openmp_if(res._width>=(cimg_openmp_sizefactor)*32 && res._height>=4) \ + firstprivate(P,Q)) \ + cimg_forXY(res,x,y) _cimg_abort_try_openmp { \ + cimg_abort_test; \ + cimg_def##N##x##N(res,x,y); \ + tfloat *pP = P._data; cimg_forC(_guide,c) { cimg_get##N##x##N(_guide,x,y,0,c,pP,tfloat); pP+=N2; } \ const int x0 = x - rsize1, y0 = y - rsize1, x1 = x + rsize2, y1 = y + rsize2; \ - float sum_weights = 0, weight_max = 0; \ + tfloat sum_weights = 0, weight_max = 0; \ cimg_for_in##N##XY(res,x0,y0,x1,y1,p,q) if (p!=x || q!=y) { \ - T *pQ = Q._data; cimg_forC(res,c) { cimg_get##N##x##N(img,p,q,0,c,pQ,T); pQ+=N2; } \ - float distance2 = 0; \ - pQ = Q._data; cimg_for(P,pP,T) { const float dI = (float)*pP - (float)*(pQ++); distance2+=dI*dI; } \ + tfloat *pQ = Q._data; cimg_forC(_guide,c) { cimg_get##N##x##N(_guide,p,q,0,c,pQ,tfloat); pQ+=N2; } \ + tfloat distance2 = 0; \ + pQ = Q._data; cimg_for(P,_pP,tfloat) { const tfloat dI = *_pP - *(pQ++); distance2+=dI*dI; } \ distance2/=Pnorm; \ - const float dx = (float)p - x, dy = (float)q - y, \ - alldist = distance2 + (dx*dx+dy*dy)/sigma_s2, weight = (float)std::exp(-alldist); \ + const tfloat dx = (tfloat)p - x, dy = (tfloat)q - y, \ + alldist = distance2 + (dx*dx+dy*dy)/sigma_s2, weight = std::exp(-alldist); \ if (weight>weight_max) weight_max = weight; \ sum_weights+=weight; \ - cimg_forC(res,c) res(x,y,c)+=weight*(*this)(p,q,c); \ + cimg_forC(res,c) res(x,y,c)+=(Tfloat)weight*(*this)(p,q,c); \ } \ - sum_weights+=weight_max; cimg_forC(res,c) res(x,y,c)+=weight_max*(*this)(x,y,c); \ - if (sum_weights>0) cimg_forC(res,c) res(x,y,c)/=sum_weights; \ + sum_weights+=weight_max; cimg_forC(res,c) res(x,y,c)+=(Tfloat)weight_max*(*this)(x,y,c); \ + if (sum_weights>1e-10) cimg_forC(res,c) res(x,y,c)/=(Tfloat)sum_weights; \ else cimg_forC(res,c) res(x,y,c) = (Tfloat)((*this)(x,y,c)); \ - } + } _cimg_abort_catch_openmp } + typedef _cimg_tfloat tfloat; + if (!is_sameXYZ(guide)) + throw CImgArgumentException(_cimg_instance + "blur_patch(): Invalid size for specified guide image (%u,%u,%u,%u,%p).", + cimg_instance, + guide._width,guide._height,guide._depth,guide._spectrum,guide._data); if (is_empty() || !patch_size || !lookup_size) return +*this; + Tfloat val_min, val_max = (Tfloat)max_min(val_min); + _cimg_abort_init_openmp; + cimg_abort_init; + CImg res(_width,_height,_depth,_spectrum,0); - const CImg _img = smoothness>0?get_blur(smoothness):CImg(),&img = smoothness>0?_img:*this; - CImg P(patch_size*patch_size*_spectrum), Q(P); + const CImg + __guide = guide?CImg(guide,cimg::type::string()==cimg::type::string()): + CImg(*this,cimg::type::string()==cimg::type::string()), + _guide = smoothness>0?__guide.get_blur(smoothness):__guide.get_shared(); + CImg P(_guide._spectrum*patch_size*patch_size*(_depth>1?patch_size:1)), Q(P); + + t guide_min = (t)0, guide_max = (t)0; + if (sigma_r<0) guide_max = guide.max_min(guide_min); const float - nsigma_s = sigma_s>=0?sigma_s:-sigma_s*cimg::max(_width,_height,_depth)/100, - sigma_s2 = nsigma_s*nsigma_s, sigma_p2 = sigma_p*sigma_p, sigma_p3 = 3*sigma_p, - Pnorm = P.size()*sigma_p2; + guide_delta = (float)(guide_max - guide_min), + _sigma_s = sigma_s>=0?sigma_s:-sigma_s*cimg::max(_width,_height,_depth)/100, + _sigma_r = sigma_r>=0?sigma_r:-sigma_r*guide_delta/100, + sigma_s2 = _sigma_s*_sigma_s, + sigma_r2 = _sigma_r*_sigma_r, + sigma_r3 = 3*_sigma_r, + Pnorm = P.size()*sigma_r2; const int rsize2 = (int)lookup_size/2, rsize1 = (int)lookup_size - rsize2 - 1; const unsigned int N2 = patch_size*patch_size, N3 = N2*patch_size; cimg::unused(N2,N3); @@ -36897,49 +40039,54 @@ case 3 : if (is_fast_approx) _cimg_blur_patch3d_fast(3) else _cimg_blur_patch3d(3) break; default : { const int psize2 = (int)patch_size/2, psize1 = (int)patch_size - psize2 - 1; - if (is_fast_approx) + if (is_fast_approx) { cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) cimg_openmp_if(res._width>=(cimg_openmp_sizefactor)*32 && res._height*res._depth>=4) - private(P,Q)) - cimg_forXYZ(res,x,y,z) { // Fast - P = img.get_crop(x - psize1,y - psize1,z - psize1,x + psize2,y + psize2,z + psize2,true); + firstprivate(P,Q)) + cimg_forXYZ(res,x,y,z) _cimg_abort_try_openmp { // Fast + cimg_abort_test; + P = _guide.get_crop(x - psize1,y - psize1,z - psize1,x + psize2,y + psize2,z + psize2,true); const int x0 = x - rsize1, y0 = y - rsize1, z0 = z - rsize1, x1 = x + rsize2, y1 = y + rsize2, z1 = z + rsize2; - float sum_weights = 0; + tfloat sum_weights = 0; cimg_for_inXYZ(res,x0,y0,z0,x1,y1,z1,p,q,r) - if (cimg::abs((Tfloat)img(x,y,z,0) - (Tfloat)img(p,q,r,0))3?0.f:1.f; + if (cimg::abs(_guide(x,y,z,0) - _guide(p,q,r,0))3?0:1; sum_weights+=weight; - cimg_forC(res,c) res(x,y,z,c)+=weight*(*this)(p,q,r,c); + cimg_forC(res,c) res(x,y,z,c)+=(Tfloat)weight*(*this)(p,q,r,c); } - if (sum_weights>0) cimg_forC(res,c) res(x,y,z,c)/=sum_weights; + if (sum_weights>1e-10) cimg_forC(res,c) res(x,y,z,c)/=(Tfloat)sum_weights; else cimg_forC(res,c) res(x,y,z,c) = (Tfloat)((*this)(x,y,z,c)); - } else + } _cimg_abort_catch_openmp + } else { cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) - if (res._width>=32 && res._height*res._depth>=4) firstprivate(P,Q)) - cimg_forXYZ(res,x,y,z) { // Exact - P = img.get_crop(x - psize1,y - psize1,z - psize1,x + psize2,y + psize2,z + psize2,true); + cimg_openmp_if(res._width>=(cimg_openmp_sizefactor)*32 && res._height*res._depth>=4) + firstprivate(P,Q)) + cimg_forXYZ(res,x,y,z) _cimg_abort_try_openmp { // Exact + cimg_abort_test; + P = _guide.get_crop(x - psize1,y - psize1,z - psize1,x + psize2,y + psize2,z + psize2,true); const int x0 = x - rsize1, y0 = y - rsize1, z0 = z - rsize1, - x1 = x + rsize2, y1 = y + rsize2, z1 = z + rsize2; - float sum_weights = 0, weight_max = 0; + x1 = x + rsize2, y1 = y + rsize2, z1 = z + rsize2; + tfloat sum_weights = 0, weight_max = 0; cimg_for_inXYZ(res,x0,y0,z0,x1,y1,z1,p,q,r) if (p!=x || q!=y || r!=z) { - (Q = img.get_crop(p - psize1,q - psize1,r - psize1,p + psize2,q + psize2,r + psize2,true))-=P; - const float - dx = (float)x - p, dy = (float)y - q, dz = (float)z - r, - distance2 = (float)(Q.pow(2).sum()/Pnorm + (dx*dx + dy*dy + dz*dz)/sigma_s2), - weight = (float)std::exp(-distance2); + (Q = _guide.get_crop(p - psize1,q - psize1,r - psize1,p + psize2,q + psize2,r + psize2,true))-=P; + const tfloat + dx = (tfloat)x - p, dy = (tfloat)y - q, dz = (tfloat)z - r, + distance2 = (tfloat)(Q.pow(2).sum()/Pnorm + (dx*dx + dy*dy + dz*dz)/sigma_s2), + weight = std::exp(-distance2); if (weight>weight_max) weight_max = weight; sum_weights+=weight; - cimg_forC(res,c) res(x,y,z,c)+=weight*(*this)(p,q,r,c); + cimg_forC(res,c) res(x,y,z,c)+=(Tfloat)weight*(*this)(p,q,r,c); } - sum_weights+=weight_max; cimg_forC(res,c) res(x,y,z,c)+=weight_max*(*this)(x,y,z,c); - if (sum_weights>0) cimg_forC(res,c) res(x,y,z,c)/=sum_weights; + sum_weights+=weight_max; cimg_forC(res,c) res(x,y,z,c)+=(Tfloat)weight_max*(*this)(x,y,z,c); + if (sum_weights>1e-10) cimg_forC(res,c) res(x,y,z,c)/=(Tfloat)sum_weights; else cimg_forC(res,c) res(x,y,z,c) = (Tfloat)((*this)(x,y,z,c)); - } + } _cimg_abort_catch_openmp + } } } else switch (patch_size) { // 2D case 2 : if (is_fast_approx) _cimg_blur_patch2d_fast(2) else _cimg_blur_patch2d(2) break; @@ -36952,49 +40099,66 @@ case 9 : if (is_fast_approx) _cimg_blur_patch2d_fast(9) else _cimg_blur_patch2d(9) break; default : { // Fast const int psize2 = (int)patch_size/2, psize1 = (int)patch_size - psize2 - 1; - if (is_fast_approx) + if (is_fast_approx) { cimg_pragma_openmp(parallel for cimg_openmp_if(res._width>=(cimg_openmp_sizefactor)*32 && res._height>=4) firstprivate(P,Q)) - cimg_forXY(res,x,y) { // Fast - P = img.get_crop(x - psize1,y - psize1,x + psize2,y + psize2,true); + cimg_forXY(res,x,y) _cimg_abort_try_openmp { // Fast + cimg_abort_test; + P = _guide.get_crop(x - psize1,y - psize1,x + psize2,y + psize2,true); const int x0 = x - rsize1, y0 = y - rsize1, x1 = x + rsize2, y1 = y + rsize2; - float sum_weights = 0; + tfloat sum_weights = 0; cimg_for_inXY(res,x0,y0,x1,y1,p,q) - if ((Tfloat)cimg::abs(img(x,y,0) - (Tfloat)img(p,q,0))3?0.f:1.f; + if (cimg::abs(_guide(x,y,0) - _guide(p,q,0))3?0:1; sum_weights+=weight; - cimg_forC(res,c) res(x,y,c)+=weight*(*this)(p,q,c); + cimg_forC(res,c) res(x,y,c)+=(Tfloat)weight*(*this)(p,q,c); } - if (sum_weights>0) cimg_forC(res,c) res(x,y,c)/=sum_weights; + if (sum_weights>1e-10) cimg_forC(res,c) res(x,y,c)/=(Tfloat)sum_weights; else cimg_forC(res,c) res(x,y,c) = (Tfloat)((*this)(x,y,c)); - } else + } _cimg_abort_catch_openmp + } else { cimg_pragma_openmp(parallel for cimg_openmp_if(res._width>=(cimg_openmp_sizefactor)*32 && res._height>=4) firstprivate(P,Q)) - cimg_forXY(res,x,y) { // Exact - P = img.get_crop(x - psize1,y - psize1,x + psize2,y + psize2,true); + cimg_forXY(res,x,y) _cimg_abort_try_openmp { // Exact + cimg_abort_test; + P = _guide.get_crop(x - psize1,y - psize1,x + psize2,y + psize2,true); const int x0 = x - rsize1, y0 = y - rsize1, x1 = x + rsize2, y1 = y + rsize2; - float sum_weights = 0, weight_max = 0; + tfloat sum_weights = 0, weight_max = 0; cimg_for_inXY(res,x0,y0,x1,y1,p,q) if (p!=x || q!=y) { - (Q = img.get_crop(p - psize1,q - psize1,p + psize2,q + psize2,true))-=P; - const float - dx = (float)x - p, dy = (float)y - q, - distance2 = (float)(Q.pow(2).sum()/Pnorm + (dx*dx + dy*dy)/sigma_s2), - weight = (float)std::exp(-distance2); + (Q = _guide.get_crop(p - psize1,q - psize1,p + psize2,q + psize2,true))-=P; + const tfloat + dx = (tfloat)x - p, dy = (tfloat)y - q, + distance2 = (tfloat)(Q.pow(2).sum()/Pnorm + (dx*dx + dy*dy)/sigma_s2), + weight = std::exp(-distance2); if (weight>weight_max) weight_max = weight; sum_weights+=weight; - cimg_forC(res,c) res(x,y,c)+=weight*(*this)(p,q,c); + cimg_forC(res,c) res(x,y,c)+=(Tfloat)weight*(*this)(p,q,c); } - sum_weights+=weight_max; cimg_forC(res,c) res(x,y,c)+=weight_max*(*this)(x,y,c); - if (sum_weights>0) cimg_forC(res,c) res(x,y,c)/=sum_weights; - else cimg_forC(res,c) res(x,y,0,c) = (Tfloat)((*this)(x,y,c)); - } + sum_weights+=weight_max; cimg_forC(res,c) res(x,y,c)+=(Tfloat)weight_max*(*this)(x,y,c); + if (sum_weights>1e-10) cimg_forC(res,c) res(x,y,c)/=(Tfloat)sum_weights; + else cimg_forC(res,c) res(x,y,c) = (Tfloat)((*this)(x,y,c)); + } _cimg_abort_catch_openmp + } } } - return res; + return res.cut(val_min,val_max); + } + + //! Blur image using patch-based space \simplification. + CImg& blur_patch(const float sigma_s, const float sigma_r, const unsigned int patch_size=3, + const unsigned int lookup_size=4, const float smoothness=0, const bool is_fast_approx=true) { + return blur_patch(*this,sigma_s,sigma_r,patch_size,lookup_size,smoothness,is_fast_approx); + } + + //! Blur image using patch-based space \simplification \newinstance. + CImg get_blur_patch(const float sigma_s, const float sigma_r, const unsigned int patch_size=3, + const unsigned int lookup_size=4, const float smoothness=0, + const bool is_fast_approx=true) const { + return get_blur_patch(*this,sigma_s,sigma_r,patch_size,lookup_size,smoothness,is_fast_approx); } //! Blur image with the median filter. @@ -37026,9 +40190,9 @@ const Tfloat val0 = (Tfloat)(*this)(x,y,z,c); CImg values(n*n*n); unsigned int nb_values = 0; - T *ptrd = values.data(); + T *_ptrd = values.data(); cimg_for_inXYZ(*this,nx0,ny0,nz0,nx1,ny1,nz1,p,q,r) - if (cimg::abs((*this)(p,q,r,c) - val0)<=threshold) { *(ptrd++) = (*this)(p,q,r,c); ++nb_values; } + if (cimg::abs((*this)(p,q,r,c) - val0)<=threshold) { *(_ptrd++) = (*this)(p,q,r,c); ++nb_values; } res(x,y,z,c) = nb_values?values.get_shared_points(0,nb_values - 1).median():(*this)(x,y,z,c); } else @@ -37053,9 +40217,9 @@ const Tfloat val0 = (Tfloat)(*this)(x,y,c); CImg values(n*n); unsigned int nb_values = 0; - T *ptrd = values.data(); + T *_ptrd = values.data(); cimg_for_inXY(*this,nx0,ny0,nx1,ny1,p,q) - if (cimg::abs((*this)(p,q,c) - val0)<=threshold) { *(ptrd++) = (*this)(p,q,c); ++nb_values; } + if (cimg::abs((*this)(p,q,c) - val0)<=threshold) { *(_ptrd++) = (*this)(p,q,c); ++nb_values; } res(x,y,c) = nb_values?values.get_shared_points(0,nb_values - 1).median():(*this)(x,y,c); } else { @@ -37193,6 +40357,8 @@ _veloc_max[c] = veloc_max; } } else // Inverse diffusion + cimg_pragma_openmp(parallel for cimg_openmp_if(_width*_height*_depth>=(cimg_openmp_sizefactor)*512 && + _spectrum>=2)) cimg_forC(*this,c) { Tfloat *ptrd = velocity.data(0,0,0,c), veloc_max = 0; CImg_3x3x3(I,Tfloat); @@ -37247,324 +40413,243 @@ _veloc_max[c] = veloc_max; } } else // Inverse diffusion - cimg_forC(*this,c) { - Tfloat *ptrd = velocity.data(0,0,0,c), veloc_max = 0; - CImg_3x3(I,Tfloat); - cimg_for3x3(*this,x,y,0,c,I,Tfloat) { - const Tfloat veloc = -Ipc - Inc - Icp - Icn + 4*Icc; - *(ptrd++) = veloc; - if (veloc>veloc_max) veloc_max = veloc; else if (-veloc>veloc_max) veloc_max = -veloc; - } - _veloc_max[c] = veloc_max; - } - } - const Tfloat veloc_max = _veloc_max.max(); - if (veloc_max<=0) return *this; - return ((velocity*=amplitude/veloc_max)+=*this).cut(val_min,val_max).move_to(*this); - } - - //! Sharpen image \newinstance. - CImg get_sharpen(const float amplitude, const bool sharpen_type=false, const float edge=1, - const float alpha=0, const float sigma=0) const { - return (+*this).sharpen(amplitude,sharpen_type,edge,alpha,sigma); - } - - //! Return image gradient. - /** - \param axes Axes considered for the gradient computation, as a C-string (e.g "xy"). - \param scheme = Numerical scheme used for the gradient computation: - - -1 = Backward finite differences - - 0 = Centered finite differences - - 1 = Forward finite differences - - 2 = Using Sobel kernels - - 3 = Using rotation invariant kernels - - 4 = Using Deriche recusrsive filter. - - 5 = Using Van Vliet recusrsive filter. - **/ - CImgList get_gradient(const char *const axes=0, const int scheme=3) const { - CImgList grad(2,_width,_height,_depth,_spectrum); - bool is_3d = false; - if (axes) { - for (unsigned int a = 0; axes[a]; ++a) { - const char axis = cimg::lowercase(axes[a]); - switch (axis) { - case 'x' : case 'y' : break; - case 'z' : is_3d = true; break; - default : - throw CImgArgumentException(_cimg_instance - "get_gradient(): Invalid specified axis '%c'.", - cimg_instance, - axis); - } - } - } else is_3d = (_depth>1); - if (is_3d) { - CImg(_width,_height,_depth,_spectrum).move_to(grad); - switch (scheme) { // 3D - case -1 : { // Backward finite differences - cimg_pragma_openmp(parallel for cimg_openmp_if(_width*_height*_depth>=(cimg_openmp_sizefactor)*1048576 && - _spectrum>=2)) - cimg_forC(*this,c) { - const ulongT off = (ulongT)c*_width*_height*_depth; - Tfloat *ptrd0 = grad[0]._data + off, *ptrd1 = grad[1]._data + off, *ptrd2 = grad[2]._data + off; - CImg_3x3x3(I,Tfloat); - cimg_for3x3x3(*this,x,y,z,c,I,Tfloat) { - *(ptrd0++) = Iccc - Ipcc; - *(ptrd1++) = Iccc - Icpc; - *(ptrd2++) = Iccc - Iccp; - } - } - } break; - case 1 : { // Forward finite differences - cimg_pragma_openmp(parallel for cimg_openmp_if(_width*_height*_depth>=(cimg_openmp_sizefactor)*1048576 && - _spectrum>=2)) - cimg_forC(*this,c) { - const ulongT off = (ulongT)c*_width*_height*_depth; - Tfloat *ptrd0 = grad[0]._data + off, *ptrd1 = grad[1]._data + off, *ptrd2 = grad[2]._data + off; - CImg_2x2x2(I,Tfloat); - cimg_for2x2x2(*this,x,y,z,c,I,Tfloat) { - *(ptrd0++) = Incc - Iccc; - *(ptrd1++) = Icnc - Iccc; - *(ptrd2++) = Iccn - Iccc; - } - } - } break; - case 4 : { // Deriche filter with low standard variation - grad[0] = get_deriche(0,1,'x'); - grad[1] = get_deriche(0,1,'y'); - grad[2] = get_deriche(0,1,'z'); - } break; - case 5 : { // Van Vliet filter with low standard variation - grad[0] = get_vanvliet(0,1,'x'); - grad[1] = get_vanvliet(0,1,'y'); - grad[2] = get_vanvliet(0,1,'z'); - } break; - default : { // Central finite differences - cimg_pragma_openmp(parallel for cimg_openmp_if(_width*_height*_depth>=(cimg_openmp_sizefactor)*1048576 && - _spectrum>=2)) - cimg_forC(*this,c) { - const ulongT off = (ulongT)c*_width*_height*_depth; - Tfloat *ptrd0 = grad[0]._data + off, *ptrd1 = grad[1]._data + off, *ptrd2 = grad[2]._data + off; - CImg_3x3x3(I,Tfloat); - cimg_for3x3x3(*this,x,y,z,c,I,Tfloat) { - *(ptrd0++) = (Incc - Ipcc)/2; - *(ptrd1++) = (Icnc - Icpc)/2; - *(ptrd2++) = (Iccn - Iccp)/2; - } - } - } - } - } else switch (scheme) { // 2D - case -1 : { // Backward finite differences - cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) - cimg_openmp_if(_width*_height>=(cimg_openmp_sizefactor)*1048576 && _depth*_spectrum>=2)) - cimg_forZC(*this,z,c) { - const ulongT off = (ulongT)c*_width*_height*_depth + z*_width*_height; - Tfloat *ptrd0 = grad[0]._data + off, *ptrd1 = grad[1]._data + off; - CImg_3x3(I,Tfloat); - cimg_for3x3(*this,x,y,z,c,I,Tfloat) { - *(ptrd0++) = Icc - Ipc; - *(ptrd1++) = Icc - Icp; - } - } - } break; - case 1 : { // Forward finite differences - cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) - cimg_openmp_if(_width*_height>=(cimg_openmp_sizefactor)*1048576 && _depth*_spectrum>=2)) - cimg_forZC(*this,z,c) { - const ulongT off = (ulongT)c*_width*_height*_depth + z*_width*_height; - Tfloat *ptrd0 = grad[0]._data + off, *ptrd1 = grad[1]._data + off; - CImg_2x2(I,Tfloat); - cimg_for2x2(*this,x,y,z,c,I,Tfloat) { - *(ptrd0++) = Inc - Icc; - *(ptrd1++) = Icn - Icc; - } - } - } break; - case 2 : { // Sobel scheme - cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) - cimg_openmp_if(_width*_height>=(cimg_openmp_sizefactor)*1048576 && _depth*_spectrum>=2)) - cimg_forZC(*this,z,c) { - const ulongT off = (ulongT)c*_width*_height*_depth + z*_width*_height; - Tfloat *ptrd0 = grad[0]._data + off, *ptrd1 = grad[1]._data + off; - CImg_3x3(I,Tfloat); - cimg_for3x3(*this,x,y,z,c,I,Tfloat) { - *(ptrd0++) = -Ipp - 2*Ipc - Ipn + Inp + 2*Inc + Inn; - *(ptrd1++) = -Ipp - 2*Icp - Inp + Ipn + 2*Icn + Inn; - } - } - } break; - case 3 : { // Rotation invariant kernel - cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) - cimg_openmp_if(_width*_height>=(cimg_openmp_sizefactor)*1048576 && _depth*_spectrum>=2)) - cimg_forZC(*this,z,c) { - const ulongT off = (ulongT)c*_width*_height*_depth + z*_width*_height; - Tfloat *ptrd0 = grad[0]._data + off, *ptrd1 = grad[1]._data + off; - CImg_3x3(I,Tfloat); - const Tfloat a = (Tfloat)(0.25f*(2 - std::sqrt(2.f))), b = (Tfloat)(0.5f*(std::sqrt(2.f) - 1)); - cimg_for3x3(*this,x,y,z,c,I,Tfloat) { - *(ptrd0++) = -a*Ipp - b*Ipc - a*Ipn + a*Inp + b*Inc + a*Inn; - *(ptrd1++) = -a*Ipp - b*Icp - a*Inp + a*Ipn + b*Icn + a*Inn; - } - } - } break; - case 4 : { // Van Vliet filter with low standard variation - grad[0] = get_deriche(0,1,'x'); - grad[1] = get_deriche(0,1,'y'); - } break; - case 5 : { // Deriche filter with low standard variation - grad[0] = get_vanvliet(0,1,'x'); - grad[1] = get_vanvliet(0,1,'y'); - } break; - default : { // Central finite differences - cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) - cimg_openmp_if(_width*_height>=(cimg_openmp_sizefactor)*1048576 && _depth*_spectrum>=2)) - cimg_forZC(*this,z,c) { - const ulongT off = (ulongT)c*_width*_height*_depth + z*_width*_height; - Tfloat *ptrd0 = grad[0]._data + off, *ptrd1 = grad[1]._data + off; - CImg_3x3(I,Tfloat); - cimg_for3x3(*this,x,y,z,c,I,Tfloat) { - *(ptrd0++) = (Inc - Ipc)/2; - *(ptrd1++) = (Icn - Icp)/2; + cimg_pragma_openmp(parallel for cimg_openmp_if(_width*_height>=(cimg_openmp_sizefactor)*512 && + _spectrum>=2)) + cimg_forC(*this,c) { + Tfloat *ptrd = velocity.data(0,0,0,c), veloc_max = 0; + CImg_3x3(I,Tfloat); + cimg_for3x3(*this,x,y,0,c,I,Tfloat) { + const Tfloat veloc = -Ipc - Inc - Icp - Icn + 4*Icc; + *(ptrd++) = veloc; + if (veloc>veloc_max) veloc_max = veloc; else if (-veloc>veloc_max) veloc_max = -veloc; + } + _veloc_max[c] = veloc_max; } - } - } - } - if (!axes) return grad; - CImgList res; - for (unsigned int l = 0; axes[l]; ++l) { - const char axis = cimg::lowercase(axes[l]); - switch (axis) { - case 'x' : res.insert(grad[0]); break; - case 'y' : res.insert(grad[1]); break; - case 'z' : res.insert(grad[2]); break; - } } - grad.assign(); - return res; + const Tfloat veloc_max = _veloc_max.max(); + if (veloc_max<=0) return *this; + return ((velocity*=amplitude/veloc_max)+=*this).cut(val_min,val_max).move_to(*this); } - //! Return image hessian. + //! Sharpen image \newinstance. + CImg get_sharpen(const float amplitude, const bool sharpen_type=false, const float edge=1, + const float alpha=0, const float sigma=0) const { + return (+*this).sharpen(amplitude,sharpen_type,edge,alpha,sigma); + } + + //! Return image gradient. /** - \param axes Axes considered for the hessian computation, as a C-string (e.g "xy"). + \param axes Axes considered for the gradient computation, as a C-string (e.g "xy"). + \param scheme = Numerical scheme used for the gradient computation: + - -1 = Backward finite differences + - 0 = Centered finite differences (default) + - 1 = Forward finite differences + - 2 = Using Sobel kernels + - 3 = Using rotation invariant kernels + - 4 = Using Deriche recursive filter. + - 5 = Using Van Vliet recursive filter. **/ - CImgList get_hessian(const char *const axes=0) const { + CImgList get_gradient(const char *const axes=0, const int scheme=0) const { CImgList res; - const char *naxes = axes, *const def_axes2d = "xxxyyy", *const def_axes3d = "xxxyxzyyyzzz"; - if (!axes) naxes = _depth>1?def_axes3d:def_axes2d; - const unsigned int lmax = (unsigned int)std::strlen(naxes); - if (lmax%2) - throw CImgArgumentException(_cimg_instance - "get_hessian(): Invalid specified axes '%s'.", - cimg_instance, - naxes); + char __axes[4] = { 0 }; + const char *_axes = axes?axes:__axes; + if (!axes) { + unsigned int k = 0; + if (_width>1) __axes[k++] = 'x'; + if (_height>1) __axes[k++] = 'y'; + if (_depth>1) __axes[k++] = 'z'; + } - res.assign(lmax/2,_width,_height,_depth,_spectrum); - if (!cimg::strcasecmp(naxes,def_axes3d)) { // 3D + CImg grad; + while (*_axes) { + const char axis = cimg::lowercase(*(_axes++)); + if (axis!='x' && axis!='y' && axis!='z') + throw CImgArgumentException(_cimg_instance + "get_gradient(): Invalid specified axes '%s'.", + cimg_instance, + axes); + const longT off = axis=='x'?1:axis=='y'?_width:_width*_height; + if ((axis=='x' && _width==1) || (axis=='y' && _height==1) || (axis=='z' && _depth==1)) { + grad.assign(_width,_height,_depth,_spectrum,0).move_to(res); + continue; + } - cimg_pragma_openmp(parallel for cimg_openmp_if(_width*_height*_depth>=(cimg_openmp_sizefactor)*1048576 && - _spectrum>=2)) - cimg_forC(*this,c) { - const ulongT off = (ulongT)c*_width*_height*_depth; - Tfloat - *ptrd0 = res[0]._data + off, *ptrd1 = res[1]._data + off, *ptrd2 = res[2]._data + off, - *ptrd3 = res[3]._data + off, *ptrd4 = res[4]._data + off, *ptrd5 = res[5]._data + off; - CImg_3x3x3(I,Tfloat); - cimg_for3x3x3(*this,x,y,z,c,I,Tfloat) { - *(ptrd0++) = Ipcc + Incc - 2*Iccc; // Ixx - *(ptrd1++) = (Ippc + Innc - Ipnc - Inpc)/4; // Ixy - *(ptrd2++) = (Ipcp + Incn - Ipcn - Incp)/4; // Ixz - *(ptrd3++) = Icpc + Icnc - 2*Iccc; // Iyy - *(ptrd4++) = (Icpp + Icnn - Icpn - Icnp)/4; // Iyz - *(ptrd5++) = Iccn + Iccp - 2*Iccc; // Izz + const int _scheme = axis=='z' && (scheme==2 || scheme==3)?0:scheme; + switch (_scheme) { + case -1 : { // Backward finite differences + grad.assign(_width,_height,_depth,_spectrum); + cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if_size(size(),16384)) + cimg_forXYZC(*this,x,y,z,c) { + const ulongT pos = offset(x,y,z,c); + if ((axis=='x' && !x) || (axis=='y' && !y) || (axis=='z' && !z)) + grad[pos] = 0; + else + grad[pos] = (Tfloat)_data[pos] - _data[pos - off]; } - } - } else if (!cimg::strcasecmp(naxes,def_axes2d)) { // 2D - cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) - cimg_openmp_if(_width*_height>=(cimg_openmp_sizefactor)*1048576 && _depth*_spectrum>=2)) - cimg_forZC(*this,z,c) { - const ulongT off = (ulongT)c*_width*_height*_depth + z*_width*_height; - Tfloat *ptrd0 = res[0]._data + off, *ptrd1 = res[1]._data + off, *ptrd2 = res[2]._data + off; - CImg_3x3(I,Tfloat); - cimg_for3x3(*this,x,y,z,c,I,Tfloat) { - *(ptrd0++) = Ipc + Inc - 2*Icc; // Ixx - *(ptrd1++) = (Ipp + Inn - Ipn - Inp)/4; // Ixy - *(ptrd2++) = Icp + Icn - 2*Icc; // Iyy + grad.move_to(res); + } break; + case 1 : { // Forward finite differences + grad.assign(_width,_height,_depth,_spectrum); + cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if_size(size(),16384)) + cimg_forXYZC(*this,x,y,z,c) { + const ulongT pos = offset(x,y,z,c); + if ((axis=='x' && x==width() - 1) || (axis=='y' && y==height() - 1) || (axis=='z' && z==depth() - 1)) + grad[pos] = 0; + else + grad[pos] = (Tfloat)_data[pos + off] - _data[pos]; } - } - } else for (unsigned int l = 0; laxis2) cimg::swap(axis1,axis2); - bool valid_axis = false; - if (axis1=='x' && axis2=='x') { // Ixx - valid_axis = true; + grad.move_to(res); + } break; + case 2 : { // Sobel scheme + grad.assign(_width,_height,_depth,_spectrum); + if (axis=='x') // X-axis cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) - cimg_openmp_if(_width*_height>=(cimg_openmp_sizefactor)*1048576 && _depth*_spectrum>=2)) + cimg_openmp_if(_width*_height>=(cimg_openmp_sizefactor)*16384 && + _depth*_spectrum>=2)) cimg_forZC(*this,z,c) { - Tfloat *ptrd = res[l2].data(0,0,z,c); CImg_3x3(I,Tfloat); - cimg_for3x3(*this,x,y,z,c,I,Tfloat) *(ptrd++) = Ipc + Inc - 2*Icc; + cimg_for3x3(*this,x,y,z,c,I,Tfloat) grad(x,y,z,c) = - Ipp + Inp - 2*Ipc + 2*Inc - Ipn + Inn; } - } - else if (axis1=='x' && axis2=='y') { // Ixy - valid_axis = true; + else // Y-axis cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) - cimg_openmp_if(_width*_height>=(cimg_openmp_sizefactor)*1048576 && + cimg_openmp_if(_width*_height>=(cimg_openmp_sizefactor)*16384 && _depth*_spectrum>=2)) cimg_forZC(*this,z,c) { - Tfloat *ptrd = res[l2].data(0,0,z,c); CImg_3x3(I,Tfloat); - cimg_for3x3(*this,x,y,z,c,I,Tfloat) *(ptrd++) = (Ipp + Inn - Ipn - Inp)/4; + cimg_for3x3(*this,x,y,z,c,I,Tfloat) grad(x,y,z,c) = - Ipp - 2*Icp - Inp + Ipn + 2*Icn + Inn; } - } - else if (axis1=='x' && axis2=='z') { // Ixz - valid_axis = true; - cimg_pragma_openmp(parallel for cimg_openmp_if(_width*_height*_depth>=(cimg_openmp_sizefactor)*1048576 && - _spectrum>=2)) - cimg_forC(*this,c) { - Tfloat *ptrd = res[l2].data(0,0,0,c); - CImg_3x3x3(I,Tfloat); - cimg_for3x3x3(*this,x,y,z,c,I,Tfloat) *(ptrd++) = (Ipcp + Incn - Ipcn - Incp)/4; + grad.move_to(res); + } break; + case 3 : { // Rotation invariant scheme + const Tfloat a = (Tfloat)(0.25f*(2 - std::sqrt(2.f))), b = (Tfloat)(0.5f*(std::sqrt(2.f) - 1)); + grad.assign(_width,_height,_depth,_spectrum); + if (axis=='x') // X-axis + cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) + cimg_openmp_if(_width*_height>=(cimg_openmp_sizefactor)*16384 && + _depth*_spectrum>=2)) + cimg_forZC(*this,z,c) { + CImg_3x3(I,Tfloat); + cimg_for3x3(*this,x,y,z,c,I,Tfloat) grad(x,y,z,c) = -a*Ipp - b*Ipc - a*Ipn + a*Inp + b*Inc + a*Inn; } - } - else if (axis1=='y' && axis2=='y') { // Iyy - valid_axis = true; + else // Y-axis cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) - cimg_openmp_if(_width*_height>=(cimg_openmp_sizefactor)*1048576 && + cimg_openmp_if(_width*_height>=(cimg_openmp_sizefactor)*16384 && _depth*_spectrum>=2)) cimg_forZC(*this,z,c) { - Tfloat *ptrd = res[l2].data(0,0,z,c); CImg_3x3(I,Tfloat); - cimg_for3x3(*this,x,y,z,c,I,Tfloat) *(ptrd++) = Icp + Icn - 2*Icc; + cimg_for3x3(*this,x,y,z,c,I,Tfloat) grad(x,y,z,c) = -a*Ipp - b*Icp - a*Inp + a*Ipn + b*Icn + a*Inn; } + grad.move_to(res); + } break; + case 4 : // Deriche filter + get_deriche(0,1,axis).move_to(res); + break; + case 5 : // Van Vliet filter + get_vanvliet(0,1,axis).move_to(res); + break; + default : { // Central finite differences + grad.assign(_width,_height,_depth,_spectrum); + cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if_size(size(),16384)) + cimg_forXYZC(*this,x,y,z,c) { + const ulongT pos = offset(x,y,z,c); + if ((axis=='x' && !x) || (axis=='y' && !y) || (axis=='z' && !z)) + grad[pos] = ((Tfloat)_data[pos + off] - _data[pos])/2; + else if ((axis=='x' && x==width() - 1) || (axis=='y' && y==height() - 1) || (axis=='z' && z==depth() - 1)) + grad[pos] = ((Tfloat)_data[pos] - _data[pos - off])/2; + else + grad[pos] = ((Tfloat)_data[pos + off] - _data[pos - off])/2; } - else if (axis1=='y' && axis2=='z') { // Iyz - valid_axis = true; - cimg_pragma_openmp(parallel for cimg_openmp_if(_width*_height*_depth>=(cimg_openmp_sizefactor)*1048576 && - _spectrum>=2)) - cimg_forC(*this,c) { - Tfloat *ptrd = res[l2].data(0,0,0,c); - CImg_3x3x3(I,Tfloat); - cimg_for3x3x3(*this,x,y,z,c,I,Tfloat) *(ptrd++) = (Icpp + Icnn - Icpn - Icnp)/4; - } + grad.move_to(res); + } break; + } + } + return res; + } + + //! Return image hessian. + /** + \param axes Axes considered for the hessian computation, as a C-string (e.g "xy"). + **/ + CImgList get_hessian(const char *const axes=0) const { + CImgList res; + char __axes[12] = { 0 }; + const char *_axes = axes?axes:__axes; + if (!axes) { + unsigned int k = 0; + if (_width>1) { __axes[k++] = 'x'; __axes[k++] = 'x'; } + if (_width>1 && _height>1) { __axes[k++] = 'x'; __axes[k++] = 'y'; } + if (_width>1 && _depth>1) { __axes[k++] = 'x'; __axes[k++] = 'z'; } + if (_height>1) { __axes[k++] = 'y'; __axes[k++] = 'y'; } + if (_height>1 && _depth>1) { __axes[k++] = 'y'; __axes[k++] = 'z'; } + if (_depth>1) { __axes[k++] = 'z'; __axes[k++] = 'z'; } + } + const unsigned int len = (unsigned int)std::strlen(_axes); + if (len%2) + throw CImgArgumentException(_cimg_instance + "get_hessian(): Invalid specified axes '%s'.", + cimg_instance, + axes); + CImg hess; + for (unsigned int k = 0; k=(cimg_openmp_sizefactor)*1048576 && - _spectrum>=2)) - cimg_forC(*this,c) { - Tfloat *ptrd = res[l2].data(0,0,0,c); - CImg_3x3x3(I,Tfloat); - cimg_for3x3x3(*this,x,y,z,c,I,Tfloat) *(ptrd++) = Iccn + Iccp - 2*Iccc; - } + else if (axis1=='x' && axis2=='y') // Ixy + cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) + cimg_openmp_if(_width*_height>=(cimg_openmp_sizefactor)*16384 && + _depth*_spectrum>=2)) + cimg_forZC(*this,z,c) { + CImg_3x3(I,Tfloat); + cimg_for3x3(*this,x,y,z,c,I,Tfloat) hess(x,y,z,c) = (Inn + Ipp - Inp - Ipn)/4; } - else if (!valid_axis) - throw CImgArgumentException(_cimg_instance - "get_hessian(): Invalid specified axes '%s'.", - cimg_instance, - naxes); - } + else if (axis1=='x' && axis2=='z') // Ixz + cimg_pragma_openmp(parallel for cimg_openmp_if(_width*_height*_depth>=(cimg_openmp_sizefactor)*16384 && + _spectrum>=2)) + cimg_forC(*this,c) { + CImg_3x3x3(I,Tfloat); + cimg_for3x3x3(*this,x,y,z,c,I,Tfloat) hess(x,y,z,c) = (Incn + Ipcp - Incp - Ipcn)/4; + } + else // Iyz + cimg_pragma_openmp(parallel for cimg_openmp_if(_width*_height*_depth>=(cimg_openmp_sizefactor)*16384 && + _spectrum>=2)) + cimg_forC(*this,c) { + CImg_3x3x3(I,Tfloat); + cimg_for3x3x3(*this,x,y,z,c,I,Tfloat) hess(x,y,z,c) = (Icnn + Icpp - Icnp - Icpn)/4; + } + hess.move_to(res); + } return res; } @@ -37909,10 +40994,10 @@ } _energy+=delta_I*delta_I + smoothness*_energy_regul; } - if (V) cimg_forXYZ(V,x,y,z) if (V(x,y,z,3)) { // Apply constraints - U(x,y,z,0) = V(x,y,z,0)/factor; - U(x,y,z,1) = V(x,y,z,1)/factor; - U(x,y,z,2) = V(x,y,z,2)/factor; + if (V) cimg_forXYZ(V,_x,_y,_z) if (V(_x,_y,_z,3)) { // Apply constraints + U(_x,_y,_z,0) = V(_x,_y,_z,0)/factor; + U(_x,_y,_z,1) = V(_x,_y,_z,1)/factor; + U(_x,_y,_z,2) = V(_x,_y,_z,2)/factor; } } else { // Anisotropic regularization const float nsmoothness = -smoothness; @@ -37976,10 +41061,10 @@ } _energy+=delta_I*delta_I + nsmoothness*_energy_regul; } - if (V) cimg_forXYZ(V,x,y,z) if (V(x,y,z,3)) { // Apply constraints - U(x,y,z,0) = V(x,y,z,0)/factor; - U(x,y,z,1) = V(x,y,z,1)/factor; - U(x,y,z,2) = V(x,y,z,2)/factor; + if (V) cimg_forXYZ(V,_x,_y,_z) if (V(_x,_y,_z,3)) { // Apply constraints + U(_x,_y,_z,0) = V(_x,_y,_z,0)/factor; + U(_x,_y,_z,1) = V(_x,_y,_z,1)/factor; + U(_x,_y,_z,2) = V(_x,_y,_z,2)/factor; } } } @@ -38019,9 +41104,9 @@ } _energy+=delta_I*delta_I + smoothness*_energy_regul; } - if (V) cimg_forX(V,x) if (V(x,y,2)) { // Apply constraints - U(x,y,0) = V(x,y,0)/factor; - U(x,y,1) = V(x,y,1)/factor; + if (V) cimg_forXY(V,_x,_y) if (V(_x,_y,2)) { // Apply constraints + U(_x,_y,0) = V(_x,_y,0)/factor; + U(_x,_y,1) = V(_x,_y,1)/factor; } } else { // Anisotropic regularization const float nsmoothness = -smoothness; @@ -38067,9 +41152,9 @@ } _energy+=delta_I*delta_I + nsmoothness*_energy_regul; } - if (V) cimg_forX(V,x) if (V(x,y,2)) { // Apply constraints - U(x,y,0) = V(x,y,0)/factor; - U(x,y,1) = V(x,y,1)/factor; + if (V) cimg_forXY(V,_x,_y) if (V(_x,_y,2)) { // Apply constraints + U(_x,_y,0) = V(_x,_y,0)/factor; + U(_x,_y,1) = V(_x,_y,1)/factor; } } } @@ -38091,7 +41176,8 @@ \param patch_depth Depth of the patch used for matching. \param nb_iterations Number of patch-match iterations. \param nb_randoms Number of randomization attempts (per pixel). - \param occ_penalization Penalization factor in score related patch occurences. + \param patch_penalization Penalization factor in score related patch occurrences. + if negative, also tells that identity result is not avoided. \param guide Image used as the initial correspondence estimate for the algorithm. 'guide' may have a last channel with boolean values (0=false | other=true) that tells for each pixel if its correspondence vector is constrained to its initial value (constraint mask). @@ -38104,11 +41190,11 @@ const unsigned int patch_depth, const unsigned int nb_iterations, const unsigned int nb_randoms, - const float occ_penalization, + const float patch_penalization, const CImg &guide, CImg &matching_score) { return get_matchpatch(patch_image,patch_width,patch_height,patch_depth, - nb_iterations,nb_randoms,occ_penalization,guide,matching_score).move_to(*this); + nb_iterations,nb_randoms,patch_penalization,guide,matching_score).move_to(*this); } //! Compute correspondence map between two images, using the patch-match algorithm \newinstance. @@ -38119,11 +41205,11 @@ const unsigned int patch_depth, const unsigned int nb_iterations, const unsigned int nb_randoms, - const float occ_penalization, + const float patch_penalization, const CImg &guide, CImg &matching_score) const { return _matchpatch(patch_image,patch_width,patch_height,patch_depth, - nb_iterations,nb_randoms,occ_penalization, + nb_iterations,nb_randoms,patch_penalization, guide,true,matching_score); } @@ -38135,10 +41221,10 @@ const unsigned int patch_depth, const unsigned int nb_iterations=5, const unsigned int nb_randoms=5, - const float occ_penalization=0, + const float patch_penalization=0, const CImg &guide=CImg::const_empty()) { return get_matchpatch(patch_image,patch_width,patch_height,patch_depth, - nb_iterations,nb_randoms,occ_penalization,guide).move_to(*this); + nb_iterations,nb_randoms,patch_penalization,guide).move_to(*this); } //! Compute correspondence map between two images, using the patch-match algorithm \overloading. @@ -38149,10 +41235,11 @@ const unsigned int patch_depth, const unsigned int nb_iterations=5, const unsigned int nb_randoms=5, - const float occ_penalization=0, + const float patch_penalization=0, const CImg &guide=CImg::const_empty()) const { + CImg matching_score; return _matchpatch(patch_image,patch_width,patch_height,patch_depth, - nb_iterations,nb_randoms,guide,occ_penalization,false,CImg::empty()); + nb_iterations,nb_randoms,patch_penalization,guide,false,matching_score); } template @@ -38162,7 +41249,7 @@ const unsigned int patch_depth, const unsigned int nb_iterations, const unsigned int nb_randoms, - const float occ_penalization, + const float patch_penalization, const CImg &guide, const bool is_matching_score, CImg &matching_score) const { @@ -38200,29 +41287,13 @@ patch_image._width,patch_image._height,patch_image._depth,patch_image._spectrum, patch_image._data); - CImg map(_width,_height,_depth,patch_image._depth>1?3:2); + CImg a_map(_width,_height,_depth,patch_image._depth>1?3:2); CImg is_updated(_width,_height,_depth,1,3); CImg score(_width,_height,_depth); - CImg occ, loop_order; - ulongT rng = (cimg::_rand(),cimg::rng()); - if (occ_penalization!=0) { - occ.assign(patch_image._width,patch_image._height,patch_image._depth,1,0); - loop_order.assign(_width,_height,_depth,_depth>1?3:2); - cimg_forXYZ(loop_order,x,y,z) { - loop_order(x,y,z,0) = x; - loop_order(x,y,z,1) = y; - if (loop_order._spectrum>2) loop_order(x,y,z,2) = z; - } - cimg_forXYZ(loop_order,x,y,z) { // Randomize loop order in case of constraints on patch occurence - const unsigned int - X = (unsigned int)cimg::round(cimg::rand(loop_order._width - 1.,&rng)), - Y = (unsigned int)cimg::round(cimg::rand(loop_order._height - 1.,&rng)), - Z = loop_order._depth>1?(unsigned int)cimg::round(cimg::rand(loop_order._depth - 1.,&rng)):0U; - cimg::swap(loop_order(x,y,z,0),loop_order(X,Y,Z,0)); - cimg::swap(loop_order(x,y,z,1),loop_order(X,Y,Z,1)); - if (loop_order._spectrum>2) cimg::swap(loop_order(x,y,z,2),loop_order(X,Y,Z,2)); - } - } + CImg occ; + const float _patch_penalization = cimg::abs(patch_penalization); + const bool allow_identity = patch_penalization>=0; + if (_patch_penalization!=0) occ.assign(patch_image._width,patch_image._height,patch_image._depth,1,0); const int psizew = (int)patch_width, psizew1 = psizew/2, psizew2 = psizew - psizew1 - 1, psizeh = (int)patch_height, psizeh1 = psizeh/2, psizeh2 = psizeh - psizeh1 - 1, @@ -38253,16 +41324,16 @@ u = cimg::cut((int)guide(x,y,z,0),cx1,patch_image.width() - 1 - cx2), v = cimg::cut((int)guide(x,y,z,1),cy1,patch_image.height() - 1 - cy2), w = cimg::cut((int)guide(x,y,z,2),cz1,patch_image.depth() - 1 - cz2); - map(x,y,z,0) = u; - map(x,y,z,1) = v; - map(x,y,z,2) = w; + a_map(x,y,z,0) = u; + a_map(x,y,z,1) = v; + a_map(x,y,z,2) = w; score(x,y,z) = _matchpatch(in_this,in_patch,occ,patch_width,patch_height,patch_depth,_spectrum, x - cx1,y - cy1,z - cz1, u - cx1,v - cy1,w - cz1, - u,v,w,0,cimg::type::inf()); + u,v,w,0,allow_identity,cimg::type::inf()); } else cimg_pragma_openmp(parallel cimg_openmp_if_size(_width,64)) { - ulongT rng = (cimg::_rand(),cimg::rng()); -#ifdef cimg_use_openmp + cimg_uint64 rng = (cimg::_rand(),cimg::rng()); +#if cimg_use_openmp!=0 rng+=omp_get_thread_num(); #endif cimg_pragma_openmp(for cimg_openmp_collapse(2)) @@ -38274,13 +41345,13 @@ u = (int)cimg::round(cimg::rand(cx1,patch_image.width() - 1 - cx2,&rng)), v = (int)cimg::round(cimg::rand(cy1,patch_image.height() - 1 - cy2,&rng)), w = (int)cimg::round(cimg::rand(cz1,patch_image.depth() - 1 - cz2,&rng)); - map(x,y,z,0) = u; - map(x,y,z,1) = v; - map(x,y,z,2) = w; + a_map(x,y,z,0) = u; + a_map(x,y,z,1) = v; + a_map(x,y,z,2) = w; score(x,y,z) = _matchpatch(in_this,in_patch,occ,patch_width,patch_height,patch_depth,_spectrum, x - cx1,y - cy1,z - cz1, u - cx1,v - cy1,w - cz1, - u,v,w,0,cimg::type::inf()); + u,v,w,0,allow_identity,cimg::type::inf()); } cimg::srand(rng); } @@ -38289,29 +41360,22 @@ cimg_abort_init; for (unsigned int iter = 0; iter=(cimg_openmp_sizefactor)*64 && iter2) z = loop_order(_x,_y,_z,2); else z = _z; - } else { x = _x; y = _y; z = _z; } - + x = is_backward?width() - 1 - X:X, + y = is_backward?height() - 1 - Y:Y, + z = is_backward?depth() - 1 - Z:Z; if (score(x,y,z)<=1e-5 || (constraint && guide(x,y,z,constraint)!=0)) continue; const int cx1 = x<=psizew1?x:(x0 && (is_updated(x - 1,y,z)&cmask)) { // Compare with left neighbor - u = map(x - 1,y,z,0); - v = map(x - 1,y,z,1); - w = map(x - 1,y,z,2); + u = a_map(x - 1,y,z,0); + v = a_map(x - 1,y,z,1); + w = a_map(x - 1,y,z,2); if (u>=cx1 - 1 && u=cy1 && v=cz1 && w0 && (is_updated(x,y - 1,z)&cmask)) { // Compare with up neighbor - u = map(x,y - 1,z,0); - v = map(x,y - 1,z,1); - w = map(x,y - 1,z,2); + u = a_map(x,y - 1,z,0); + v = a_map(x,y - 1,z,1); + w = a_map(x,y - 1,z,2); if (u>=cx1 && u=cy1 - 1 && v=cz1 && w0 && (is_updated(x,y,z - 1)&cmask)) { // Compare with backward neighbor - u = map(x,y,z - 1,0); - v = map(x,y,z - 1,1); - w = map(x,y,z - 1,2); + u = a_map(x,y,z - 1,0); + v = a_map(x,y,z - 1,1); + w = a_map(x,y,z - 1,2); if (u>=cx1 && u=cy1 && v=cz1 - 1 && w=cx1 + 1 && u=cy1 && v=cz1 && w=cx1 && u=cy1 + 1 && v=cz1 && w=cx1 && u=cy1 && v=cz1 + 1 && w::inf()); + u,v,0,allow_identity,cimg::type::inf()); } else cimg_pragma_openmp(parallel cimg_openmp_if_size(_width,64)) { - ulongT rng = (cimg::_rand(),cimg::rng()); -#ifdef cimg_use_openmp + cimg_uint64 rng = (cimg::_rand(),cimg::rng()); + +#if cimg_use_openmp!=0 rng+=omp_get_thread_num(); #endif cimg_pragma_openmp(for) @@ -38467,11 +41534,11 @@ cy1 = y<=psizeh1?y:(y::inf()); + u,v,0,allow_identity,cimg::type::inf()); } cimg::srand(rng); } @@ -38480,27 +41547,21 @@ cimg_abort_init; for (unsigned int iter = 0; iter=(cimg_openmp_sizefactor)*64 && iter0 && (is_updated(x - 1,y)&cmask)) { // Compare with left neighbor - u = map(x - 1,y,0); - v = map(x - 1,y,1); + u = a_map(x - 1,y,0); + v = a_map(x - 1,y,1); if (u>=cx1 - 1 && u=cy1 && v0 && (is_updated(x,y - 1)&cmask)) { // Compare with up neighbor - u = map(x,y - 1,0); - v = map(x,y - 1,1); + u = a_map(x,y - 1,0); + v = a_map(x,y - 1,1); if (u>=cx1 && u=cy1 - 1 && v=cx1 + 1 && u=cy1 && v=cx1 && u=cy1 + 1 && v::inf(); const T *p1 = img1.data(x1*psizec,y1,z1), *p2 = img2.data(x2*psizec,y2,z2); const unsigned int psizewc = psizew*psizec; const ulongT @@ -38618,7 +41685,8 @@ } p1+=offy1; p2+=offy2; } - return occ_penalization==0?ssd:cimg::sqr(std::sqrt(ssd) + occ_penalization*occ(xc,yc,zc)); + return patch_penalization==0?ssd:cimg::sqr(std::sqrt(ssd) + + patch_penalization*psizewc*psizeh*psized*occ(xc,yc,zc)/100); } static float _matchpatch(const CImg& img1, const CImg& img2, const CImg& occ, @@ -38626,8 +41694,11 @@ const int x1, const int y1, const int x2, const int y2, const int xc, const int yc, - const float occ_penalization, + const float patch_penalization, + const bool allow_identity, const float max_score) { // 2D version + if (!allow_identity && cimg::hypot((float)x1-x2,(float)y1-y2)::inf(); const T *p1 = img1.data(x1*psizec,y1), *p2 = img2.data(x2*psizec,y2); const unsigned int psizewc = psizew*psizec; const ulongT @@ -38640,7 +41711,8 @@ if (ssd>max_score) return max_score; p1+=offx1; p2+=offx2; } - return occ_penalization==0?ssd:cimg::sqr(std::sqrt(ssd) + occ_penalization*occ(xc,yc)); + return patch_penalization==0?ssd:cimg::sqr(std::sqrt(ssd) + + patch_penalization*psizewc*psizeh*occ(xc,yc)/100); } //! Compute Euclidean distance function to a specified value. @@ -38726,13 +41798,13 @@ #define cimg_is_gcc49x (__GNUC__==4 && __GNUC_MINOR__==9) const ulongT wh = (ulongT)_width*_height; -#if defined(cimg_use_openmp) && !cimg_is_gcc49x +#if cimg_use_openmp!=0 && !cimg_is_gcc49x cimg_pragma_openmp(parallel for cimg_openmp_if(_spectrum>=2)) #endif cimg_forC(*this,c) { CImg g(_width), dt(_width), s(_width), t(_width); CImg img = get_shared_channel(c); -#if defined(cimg_use_openmp) && !cimg_is_gcc49x +#if cimg_use_openmp!=0 && !cimg_is_gcc49x cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) cimg_openmp_if(_width>=(cimg_openmp_sizefactor)*512 && _height*_depth>=16) firstprivate(g,dt,s,t)) @@ -38744,7 +41816,7 @@ } if (_height>1) { g.assign(_height); dt.assign(_height); s.assign(_height); t.assign(_height); -#if defined(cimg_use_openmp) && !cimg_is_gcc49x +#if cimg_use_openmp!=0 && !cimg_is_gcc49x cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) cimg_openmp_if(_height>=(cimg_openmp_sizefactor)*512 && _width*_depth>=16) firstprivate(g,dt,s,t)) @@ -38757,7 +41829,7 @@ } if (_depth>1) { g.assign(_depth); dt.assign(_depth); s.assign(_depth); t.assign(_depth); -#if defined(cimg_use_openmp) && !cimg_is_gcc49x +#if cimg_use_openmp!=0 && !cimg_is_gcc49x cimg_pragma_openmp(parallel for cimg_openmp_collapse(2) cimg_openmp_if(_depth>=(cimg_openmp_sizefactor)*512 && _width*_height>=16) firstprivate(g,dt,s,t)) @@ -39178,7 +42250,7 @@ state(x,y,z) = 0; if (++siz>=_width) { if (!is_empty()) resize(_width*2,4,1,1,0); else assign(64,4); } (*this)(siz - 1,0) = (T)value; (*this)(siz - 1,1) = (T)x; (*this)(siz - 1,2) = (T)y; (*this)(siz - 1,3) = (T)z; - for (unsigned int pos = siz - 1, par = 0; pos && value>(*this)(par=(pos + 1)/2 - 1,0); pos = par) { + for (unsigned int pos = siz - 1, par = 0; pos && value>(t)(*this)(par=(pos + 1)/2 - 1,0); pos = par) { cimg::swap((*this)(pos,0),(*this)(par,0)); cimg::swap((*this)(pos,1),(*this)(par,1)); cimg::swap((*this)(pos,2),(*this)(par,2)); cimg::swap((*this)(pos,3),(*this)(par,3)); } @@ -39501,21 +42573,21 @@ //! Compute 1D Fast Fourier Transform, along a specified axis. /** \param axis Axis along which the FFT is computed. - \param is_invert Tells if the forward (\c false) or inverse (\c true) FFT is computed. + \param is_inverse Tells if the forward (\c false) or inverse (\c true) FFT is computed. **/ - CImgList get_FFT(const char axis, const bool is_invert=false) const { + CImgList get_FFT(const char axis, const bool is_inverse=false) const { CImgList res(*this,CImg()); - CImg::FFT(res[0],res[1],axis,is_invert); + CImg::FFT(res[0],res[1],axis,is_inverse); return res; } - //! Compute n-d Fast Fourier Transform. + //! Compute n-D Fast Fourier Transform. /* - \param is_invert Tells if the forward (\c false) or inverse (\c true) FFT is computed. + \param is_inverse Tells if the forward (\c false) or inverse (\c true) FFT is computed. **/ - CImgList get_FFT(const bool is_invert=false) const { + CImgList get_FFT(const bool is_inverse=false) const { CImgList res(*this,CImg()); - CImg::FFT(res[0],res[1],is_invert); + CImg::FFT(res[0],res[1],is_inverse); return res; } @@ -39524,13 +42596,13 @@ \param[in,out] real Real part of the pixel values. \param[in,out] imag Imaginary part of the pixel values. \param axis Axis along which the FFT is computed. - \param is_invert Tells if the forward (\c false) or inverse (\c true) FFT is computed. + \param is_inverse Tells if the forward (\c false) or inverse (\c true) FFT is computed. **/ - static void FFT(CImg& real, CImg& imag, const char axis, const bool is_invert=false) { + static void FFT(CImg& real, CImg& imag, const char axis, const bool is_inverse=false, + const unsigned int nb_threads=0) { if (!real) throw CImgInstanceException("CImg<%s>::FFT(): Specified real part is empty.", pixel_type()); - if (!imag) imag.assign(real._width,real._height,real._depth,real._spectrum,(T)0); if (!real.is_sameXYZC(imag)) throw CImgInstanceException("CImg<%s>::FFT(): Specified real part (%u,%u,%u,%u,%p) and " @@ -39538,85 +42610,118 @@ pixel_type(), real._width,real._height,real._depth,real._spectrum,real._data, imag._width,imag._height,imag._depth,imag._spectrum,imag._data); -#ifdef cimg_use_fftw3 - cimg::mutex(12); - fftw_complex *data_in; - fftw_plan data_plan; - - switch (cimg::lowercase(axis)) { - case 'x' : { // Fourier along X, using FFTW library - data_in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*real._width); - if (!data_in) throw CImgInstanceException("CImgList<%s>::FFT(): Failed to allocate memory (%s) " - "for computing FFT of image (%u,%u,%u,%u) along the X-axis.", - pixel_type(), - cimg::strbuffersize(sizeof(fftw_complex)*real._width), - real._width,real._height,real._depth,real._spectrum); - - data_plan = fftw_plan_dft_1d(real._width,data_in,data_in,is_invert?FFTW_BACKWARD:FFTW_FORWARD,FFTW_ESTIMATE); - cimg_forYZC(real,y,z,c) { - T *ptrr = real.data(0,y,z,c), *ptri = imag.data(0,y,z,c); - double *ptrd = (double*)data_in; - cimg_forX(real,x) { *(ptrd++) = (double)*(ptrr++); *(ptrd++) = (double)*(ptri++); } - fftw_execute(data_plan); - const unsigned int fact = real._width; - if (is_invert) cimg_forX(real,x) { *(--ptri) = (T)(*(--ptrd)/fact); *(--ptrr) = (T)(*(--ptrd)/fact); } - else cimg_forX(real,x) { *(--ptri) = (T)*(--ptrd); *(--ptrr) = (T)*(--ptrd); } - } - } break; - case 'y' : { // Fourier along Y, using FFTW library - data_in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * real._height); - if (!data_in) throw CImgInstanceException("CImgList<%s>::FFT(): Failed to allocate memory (%s) " - "for computing FFT of image (%u,%u,%u,%u) along the Y-axis.", - pixel_type(), - cimg::strbuffersize(sizeof(fftw_complex)*real._height), - real._width,real._height,real._depth,real._spectrum); - - data_plan = fftw_plan_dft_1d(real._height,data_in,data_in,is_invert?FFTW_BACKWARD:FFTW_FORWARD,FFTW_ESTIMATE); - const unsigned int off = real._width; - cimg_forXZC(real,x,z,c) { - T *ptrr = real.data(x,0,z,c), *ptri = imag.data(x,0,z,c); - double *ptrd = (double*)data_in; - cimg_forY(real,y) { *(ptrd++) = (double)*ptrr; *(ptrd++) = (double)*ptri; ptrr+=off; ptri+=off; } - fftw_execute(data_plan); - const unsigned int fact = real._height; - if (is_invert) - cimg_forY(real,y) { ptrr-=off; ptri-=off; *ptri = (T)(*(--ptrd)/fact); *ptrr = (T)(*(--ptrd)/fact); } - else cimg_forY(real,y) { ptrr-=off; ptri-=off; *ptri = (T)*(--ptrd); *ptrr = (T)*(--ptrd); } - } - } break; - case 'z' : { // Fourier along Z, using FFTW library - data_in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * real._depth); - if (!data_in) throw CImgInstanceException("CImgList<%s>::FFT(): Failed to allocate memory (%s) " - "for computing FFT of image (%u,%u,%u,%u) along the Z-axis.", - pixel_type(), - cimg::strbuffersize(sizeof(fftw_complex)*real._depth), - real._width,real._height,real._depth,real._spectrum); - - data_plan = fftw_plan_dft_1d(real._depth,data_in,data_in,is_invert?FFTW_BACKWARD:FFTW_FORWARD,FFTW_ESTIMATE); - const ulongT off = (ulongT)real._width*real._height; - cimg_forXYC(real,x,y,c) { - T *ptrr = real.data(x,y,0,c), *ptri = imag.data(x,y,0,c); - double *ptrd = (double*)data_in; - cimg_forZ(real,z) { *(ptrd++) = (double)*ptrr; *(ptrd++) = (double)*ptri; ptrr+=off; ptri+=off; } - fftw_execute(data_plan); - const unsigned int fact = real._depth; - if (is_invert) - cimg_forZ(real,z) { ptrr-=off; ptri-=off; *ptri = (T)(*(--ptrd)/fact); *ptrr = (T)(*(--ptrd)/fact); } - else cimg_forZ(real,z) { ptrr-=off; ptri-=off; *ptri = (T)*(--ptrd); *ptrr = (T)*(--ptrd); } - } - } break; - default : + const char _axis = cimg::lowercase(axis); + if (_axis!='x' && _axis!='y' && _axis!='z') throw CImgArgumentException("CImgList<%s>::FFT(): Invalid specified axis '%c' for real and imaginary parts " "(%u,%u,%u,%u) " "(should be { x | y | z }).", pixel_type(),axis, real._width,real._height,real._depth,real._spectrum); + cimg::unused(nb_threads); +#ifdef cimg_use_fftw3 + cimg::mutex(12); +#ifndef cimg_use_fftw3_singlethread + fftw_plan_with_nthreads(nb_threads?nb_threads:cimg::nb_cpus()); +#endif + fftw_complex *data_in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*real._width*real._height*real._depth); + if (!data_in) + throw CImgInstanceException("CImgList<%s>::FFT(): Failed to allocate memory (%s) " + "for computing FFT of image (%u,%u,%u,%u) along the X-axis.", + pixel_type(), + cimg::strbuffersize(sizeof(fftw_complex)*real._width*real._height*real._depth), + real._width,real._height,real._depth,real._spectrum); + double *const ptrf = (double*)data_in; + fftw_plan data_plan = + _axis=='x'?fftw_plan_many_dft(1,(int*)&real._width,real.height()*real.depth(), + data_in,0,1,real.width(), + data_in,0,1,real.width(), + is_inverse?FFTW_BACKWARD:FFTW_FORWARD,FFTW_ESTIMATE): + _axis=='y'?fftw_plan_many_dft(1,(int*)&real._height,real.width()*real.depth(), + data_in,0,1,real.height(), + data_in,0,1,real.height(), + is_inverse?FFTW_BACKWARD:FFTW_FORWARD,FFTW_ESTIMATE): + fftw_plan_many_dft(1,(int*)&real._depth,real.width()*real.height(), + data_in,0,1,real.depth(), + data_in,0,1,real.depth(), + is_inverse?FFTW_BACKWARD:FFTW_FORWARD,FFTW_ESTIMATE); + cimg_forC(real,c) { + CImg realc = real.get_shared_channel(c), imagc = imag.get_shared_channel(c); + switch (_axis) { + case 'x' : + cimg_pragma_openmp(parallel for cimg_openmp_if_size(real.width()*real.height()*real.depth(),125000)) + cimg_forXYZ(realc,x,y,z) { + const ulongT + i = realc.offset(x,y,z), + j = 2*(x + (ulongT)y*realc._width + (ulongT)z*realc._width*realc._height); + ptrf[j] = (double)realc[i]; + ptrf[j + 1] = (double)imagc[i]; + } + break; + case 'y' : + cimg_pragma_openmp(parallel for cimg_openmp_if_size(real.width()*real.height()*real.depth(),125000)) + cimg_forXYZ(realc,x,y,z) { + const ulongT + i = realc.offset(x,y,z), + j = 2*(y + (ulongT)x*realc._height + (ulongT)z*realc._width*realc._height); + ptrf[j] = (double)realc[i]; + ptrf[j + 1] = (double)imagc[i]; + } + break; + default : + cimg_pragma_openmp(parallel for cimg_openmp_if_size(real.width()*real.height()*real.depth(),125000)) + cimg_forXYZ(realc,x,y,z) { + const ulongT + i = realc.offset(x,y,z), + j = 2*(z + (ulongT)x*realc._depth + (ulongT)y*realc._width*realc._depth); + ptrf[j] = (double)realc[i]; + ptrf[j + 1] = (double)imagc[i]; + } + } + + fftw_execute(data_plan); + + const double a = is_inverse?1.0/(_axis=='x'?real.width():_axis=='y'?real.height():real.depth()):1.0; + switch (_axis) { + case 'x' : + cimg_pragma_openmp(parallel for cimg_openmp_if_size(real.width()*real.height()*real.depth(),125000)) + cimg_forXYZ(realc,x,y,z) { + const ulongT + i = 2*(x + (ulongT)y*realc._width + (ulongT)z*realc._width*realc._height), + j = realc.offset(x,y,z); + realc[j] = (T)(a*ptrf[i]); + imagc[j] = (T)(a*ptrf[i + 1]); + } + break; + case 'y' : + cimg_pragma_openmp(parallel for cimg_openmp_if_size(real.width()*real.height()*real.depth(),125000)) + cimg_forXYZ(realc,x,y,z) { + const ulongT + i = 2*(y + (ulongT)x*realc._height + (ulongT)z*realc._width*realc._height), + j = realc.offset(x,y,z); + realc[j] = (T)(a*ptrf[i]); + imagc[j] = (T)(a*ptrf[i + 1]); + } + break; + default : + cimg_pragma_openmp(parallel for cimg_openmp_if_size(real.width()*real.height()*real.depth(),125000)) + cimg_forXYZ(realc,x,y,z) { + const ulongT + i = 2*(z + (ulongT)x*realc._depth + (ulongT)y*realc._width*realc._depth), + j = realc.offset(x,y,z); + realc[j] = (T)(a*ptrf[i]); + imagc[j] = (T)(a*ptrf[i + 1]); + } + } } + fftw_destroy_plan(data_plan); fftw_free(data_in); +#ifndef cimg_use_fftw3_singlethread + fftw_cleanup_threads(); +#endif cimg::mutex(12,0); #else - switch (cimg::lowercase(axis)) { + switch (_axis) { case 'x' : { // Fourier along X, using built-in functions const unsigned int N = real._width, N2 = N>>1; if (((N - 1)&N) && N!=1) @@ -39642,7 +42747,7 @@ for (unsigned int i = 0; i>1; @@ -39688,7 +42793,7 @@ for (unsigned int i = 0; i>1; if (((N - 1)&N) && N!=1) throw CImgInstanceException("CImgList<%s>::FFT(): Specified real and imaginary parts (%u,%u,%u,%u) " @@ -39734,7 +42839,7 @@ for (unsigned int i = 0; i::FFT(): Invalid specified axis '%c' for real and imaginary parts " - "(%u,%u,%u,%u) " - "(should be { x | y | z }).", - pixel_type(),axis, - real._width,real._height,real._depth,real._spectrum); } #endif } - //! Compute n-d Fast Fourier Transform. + //! Compute n-D Fast Fourier Transform. /** \param[in,out] real Real part of the pixel values. \param[in,out] imag Imaginary part of the pixel values. - \param is_invert Tells if the forward (\c false) or inverse (\c true) FFT is computed. + \param is_inverse Tells if the forward (\c false) or inverse (\c true) FFT is computed. \param nb_threads Number of parallel threads used for the computation. Use \c 0 to set this to the number of available cpus. **/ - static void FFT(CImg& real, CImg& imag, const bool is_invert=false, const unsigned int nb_threads=0) { + static void FFT(CImg& real, CImg& imag, const bool is_inverse=false, + const unsigned int nb_threads=0) { if (!real) throw CImgInstanceException("CImgList<%s>::FFT(): Empty specified real part.", pixel_type()); - if (!imag) imag.assign(real._width,real._height,real._depth,real._spectrum,(T)0); if (!real.is_sameXYZC(imag)) throw CImgInstanceException("CImgList<%s>::FFT(): Specified real part (%u,%u,%u,%u,%p) and " @@ -39785,51 +42884,40 @@ pixel_type(), real._width,real._height,real._depth,real._spectrum,real._data, imag._width,imag._height,imag._depth,imag._spectrum,imag._data); - + cimg::unused(nb_threads); #ifdef cimg_use_fftw3 cimg::mutex(12); #ifndef cimg_use_fftw3_singlethread - const unsigned int _nb_threads = nb_threads?nb_threads:cimg::nb_cpus(); - static int fftw_st = fftw_init_threads(); - cimg::unused(fftw_st); - fftw_plan_with_nthreads(_nb_threads); -#else - cimg::unused(nb_threads); + fftw_plan_with_nthreads(nb_threads?nb_threads:cimg::nb_cpus()); #endif fftw_complex *data_in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*real._width*real._height*real._depth); - if (!data_in) throw CImgInstanceException("CImgList<%s>::FFT(): Failed to allocate memory (%s) " - "for computing FFT of image (%u,%u,%u,%u).", - pixel_type(), - cimg::strbuffersize(sizeof(fftw_complex)*real._width* - real._height*real._depth*real._spectrum), - real._width,real._height,real._depth,real._spectrum); - - fftw_plan data_plan; - const ulongT w = (ulongT)real._width, wh = w*real._height, whd = wh*real._depth; - data_plan = fftw_plan_dft_3d(real._width,real._height,real._depth,data_in,data_in, - is_invert?FFTW_BACKWARD:FFTW_FORWARD,FFTW_ESTIMATE); + if (!data_in) + throw CImgInstanceException("CImgList<%s>::FFT(): Failed to allocate memory (%s) " + "for computing FFT of image (%u,%u,%u,%u).", + pixel_type(), + cimg::strbuffersize(sizeof(fftw_complex)*real._width* + real._height*real._depth*real._spectrum), + real._width,real._height,real._depth,real._spectrum); + double *const ptrf = (double*)data_in; + fftw_plan data_plan = + real._depth>1?fftw_plan_dft_3d(real._depth,real._height,real._width,data_in,data_in, + is_inverse?FFTW_BACKWARD:FFTW_FORWARD,FFTW_ESTIMATE): + real._height>1?fftw_plan_dft_2d(real._height,real._width,data_in,data_in, + is_inverse?FFTW_BACKWARD:FFTW_FORWARD,FFTW_ESTIMATE): + fftw_plan_dft_1d(real._width,data_in,data_in, + is_inverse?FFTW_BACKWARD:FFTW_FORWARD,FFTW_ESTIMATE); cimg_forC(real,c) { - T *ptrr = real.data(0,0,0,c), *ptri = imag.data(0,0,0,c); - double *ptrd = (double*)data_in; - for (unsigned int x = 0; x realc = real.get_shared_channel(c), imagc = imag.get_shared_channel(c); + cimg_pragma_openmp(parallel for cimg_openmp_if_size(real.width()*real.height()*real.depth(),125000)) + cimg_rofoff(realc,i) { const ulongT i2 = 2*i; ptrf[i2] = (double)realc[i]; ptrf[i2 + 1] = (double)imagc[i]; } fftw_execute(data_plan); - ptrd = (double*)data_in; - ptrr = real.data(0,0,0,c); - ptri = imag.data(0,0,0,c); - if (!is_invert) for (unsigned int x = 0; x1) FFT(real,imag,'z',is_invert); - if (real._height>1) FFT(real,imag,'y',is_invert); - if (real._width>1) FFT(real,imag,'x',is_invert); + if (real._depth>1) FFT(real,imag,'z',is_inverse); + if (real._height>1) FFT(real,imag,'y',is_inverse); + if (real._width>1) FFT(real,imag,'x',is_inverse); #endif } @@ -39852,6 +42939,28 @@ //@{ //------------------------------------- + //! Rotate 3D object's vertices. + /** + \param x X-coordinate of the rotation axis, or first quaternion coordinate. + \param y Y-coordinate of the rotation axis, or second quaternion coordinate. + \param z Z-coordinate of the rotation axis, or second quaternion coordinate. + \param w Angle of the rotation axis (in degree), or fourth quaternion coordinate. + \param is_quaternion Tell is the four arguments denotes a set { axis + angle } or a quaternion (x,y,z,w). + **/ + CImg& rotate_object3d(const float x, const float y, const float z, const float w, + const bool is_quaternion=false) { + return get_rotate_object3d(x,y,z,w,is_quaternion).move_to(*this); + } + + CImg get_rotate_object3d(const float x, const float y, const float z, const float w, + const bool is_quaternion=false) const { + if (_height!=3 || _depth>1 || _spectrum>1) + throw CImgInstanceException(_cimg_instance + "rotate_object3d(): Instance is not a set of 3D vertices.", + cimg_instance); + return CImg::rotation_matrix(x,y,z,w,is_quaternion)**this; + } + //! Shift 3D object's vertices. /** \param tx X-coordinate of the 3D displacement vector. @@ -40202,108 +43311,35 @@ return vertices; } - //! Generate an isosurface of the image instance as a 3D object. - /** - \param[out] primitives The returned list of the 3D object primitives - (template type \e tf should be at least \e unsigned \e int). - \param isovalue The returned list of the 3D object colors. - \param size_x Number of subdivisions along the X-axis. - \param size_y Number of subdisivions along the Y-axis. - \param size_z Number of subdisivions along the Z-axis. - \return The N vertices (xi,yi,zi) of the 3D object as a Nx3 CImg image (0<=i<=N - 1). - \par Example - \code - const CImg img = CImg("reference.jpg").resize(-100,-100,20); - CImgList faces3d; - const CImg points3d = img.get_isosurface3d(faces3d,100); - CImg().display_object3d("Isosurface3d",points3d,faces3d,colors3d); - \endcode - \image html ref_isosurface3d.jpg - **/ - template - CImg get_isosurface3d(CImgList& primitives, const float isovalue, - const int size_x=-100, const int size_y=-100, const int size_z=-100) const { - if (_spectrum>1) - throw CImgInstanceException(_cimg_instance - "get_isosurface3d(): Instance is not a scalar image.", - cimg_instance); - primitives.assign(); - if (is_empty()) return *this; - CImg vertices; - if ((size_x==-100 && size_y==-100 && size_z==-100) || (size_x==width() && size_y==height() && size_z==depth())) { - const _functor3d_int func(*this); - vertices = isosurface3d(primitives,func,isovalue,0,0,0,width() - 1.f,height() - 1.f,depth() - 1.f, - width(),height(),depth()); - } else { - const _functor3d_float func(*this); - vertices = isosurface3d(primitives,func,isovalue,0,0,0,width() - 1.f,height() - 1.f,depth() - 1.f, - size_x,size_y,size_z); - } - return vertices; - } - - //! Compute 3D elevation of a function as a 3D object. + //! Compute isolines of a function, as a 3D object. /** \param[out] primitives Primitives data of the resulting 3D object. - \param func Elevation function. Is of type float (*func)(const float x,const float y). + \param func Elevation functor. Must have operator()(x,y) defined. + \param isovalue Isovalue to extract from function. \param x0 X-coordinate of the starting point. \param y0 Y-coordinate of the starting point. \param x1 X-coordinate of the ending point. \param y1 Y-coordinate of the ending point. \param size_x Resolution of the function along the X-axis. \param size_y Resolution of the function along the Y-axis. - **/ + \note Use the marching squares algorithm for extracting the isolines. + **/ template - static CImg elevation3d(CImgList& primitives, const tfunc& func, - const float x0, const float y0, const float x1, const float y1, - const int size_x=256, const int size_y=256) { - const float - nx0 = x0=0?size_x:(nx1-nx0)*-size_x/100), - nsize_x = _nsize_x?_nsize_x:1, nsize_x1 = nsize_x - 1, - _nsize_y = (unsigned int)(size_y>=0?size_y:(ny1-ny0)*-size_y/100), - nsize_y = _nsize_y?_nsize_y:1, nsize_y1 = nsize_y - 1; - if (nsize_x<2 || nsize_y<2) - throw CImgArgumentException("CImg<%s>::elevation3d(): Invalid specified size (%d,%d).", - pixel_type(), - nsize_x,nsize_y); - - CImg vertices(nsize_x*nsize_y,3); - floatT *ptr_x = vertices.data(0,0), *ptr_y = vertices.data(0,1), *ptr_z = vertices.data(0,2); - for (unsigned int y = 0; y - static CImg elevation3d(CImgList& primitives, const char *const expression, - const float x0, const float y0, const float x1, const float y1, - const int size_x=256, const int size_y=256) { - const _functor2d_expr func(expression); - return elevation3d(primitives,func,x0,y0,x1,y1,size_x,size_y); + static CImg isoline3d(CImgList& primitives, const tfunc& func, const float isovalue, + const float x0, const float y0, const float x1, const float y1, + const int size_x=256, const int size_y=256) { + CImgList vertices; + primitives.assign(); + typename CImg::_functor_isoline3d add_vertex(vertices); + typename CImg::_functor_isoline3d add_segment(primitives); + isoline3d(add_vertex,add_segment,func,isovalue,x0,y0,x1,y1,size_x,size_y); + return vertices>'x'; } - //! Compute 0-isolines of a function, as a 3D object. + //! Compute isolines of a function, as a 3D object. /** - \param[out] primitives Primitives data of the resulting 3D object. + \param[out] add_vertex : Functor with operator()(x,y,z) defined for adding new vertex. + \param[out] add_segment : Functor with operator()(i,j) defined for adding new segment. \param func Elevation function. Is of type float (*func)(const float x,const float y). \param isovalue Isovalue to extract from function. \param x0 X-coordinate of the starting point. @@ -40314,10 +43350,10 @@ \param size_y Resolution of the function along the Y-axis. \note Use the marching squares algorithm for extracting the isolines. **/ - template - static CImg isoline3d(CImgList& primitives, const tfunc& func, const float isovalue, - const float x0, const float y0, const float x1, const float y1, - const int size_x=256, const int size_y=256) { + template + static void isoline3d(tv& add_vertex, tf& add_segment, const tfunc& func, const float isovalue, + const float x0, const float y0, const float x1, const float y1, + const int size_x, const int size_y) { static const unsigned int edges[16] = { 0x0, 0x9, 0x3, 0xa, 0x6, 0xf, 0x5, 0xc, 0xc, 0x5, 0xf, 0x6, 0xa, 0x3, 0x9, 0x0 }; static const int segments[16][4] = { { -1,-1,-1,-1 }, { 0,3,-1,-1 }, { 0,1,-1,-1 }, { 1,3,-1,-1 }, @@ -40331,13 +43367,13 @@ ny = _ny?_ny:1, nxm1 = nx - 1, nym1 = ny - 1; - primitives.assign(); - if (!nxm1 || !nym1) return CImg(); + + if (!nxm1 || !nym1) return; const float dx = (x1 - x0)/nxm1, dy = (y1 - y0)/nym1; - CImgList vertices; CImg indices1(nx,1,1,2,-1), indices2(nx,1,1,2); CImg values1(nx), values2(nx); float X = x0, Y = y0, nX = X + dx, nY = Y + dy; + int nb_vertices = 0; // Fill first line with values cimg_forX(values1,x) { values1(x) = (float)func(X,Y); X+=dx; } @@ -40346,6 +43382,7 @@ for (unsigned int yi = 0, nyi = 1; yi::vector(Xi,Y,0).move_to(vertices); + indices1(xi,0) = nb_vertices++; + add_vertex(Xi,Y,0.0f); } if ((edge&2) && indices1(nxi,1)<0) { const float Yi = Y + (isovalue-val1)*dy/(val2-val1); - indices1(nxi,1) = vertices.width(); - CImg::vector(nX,Yi,0).move_to(vertices); + indices1(nxi,1) = nb_vertices++; + add_vertex(nX,Yi,0.0f); } if ((edge&4) && indices2(xi,0)<0) { const float Xi = X + (isovalue-val3)*dx/(val2-val3); - indices2(xi,0) = vertices.width(); - CImg::vector(Xi,nY,0).move_to(vertices); + indices2(xi,0) = nb_vertices++; + add_vertex(Xi,nY,0.0f); } if ((edge&8) && indices1(xi,1)<0) { const float Yi = Y + (isovalue-val0)*dy/(val3-val0); - indices1(xi,1) = vertices.width(); - CImg::vector(X,Yi,0).move_to(vertices); + indices1(xi,1) = nb_vertices++; + add_vertex(X,Yi,0.0f); } // Create segments for (const int *segment = segments[configuration]; *segment!=-1; ) { const unsigned int p0 = (unsigned int)*(segment++), p1 = (unsigned int)*(segment++); - const tf - i0 = (tf)(_isoline3d_indice(p0,indices1,indices2,xi,nxi)), - i1 = (tf)(_isoline3d_indice(p1,indices1,indices2,xi,nxi)); - CImg::vector(i0,i1).move_to(primitives); + const int + i0 = _isoline3d_index(p0,indices1,indices2,xi,nxi), + i1 = _isoline3d_index(p1,indices1,indices2,xi,nxi); + add_segment(i0,i1); } } } values1.swap(values2); indices1.swap(indices2); } - return vertices>'x'; } //! Compute isolines of a function, as a 3D object \overloading. @@ -40408,7 +43444,7 @@ } template - static int _isoline3d_indice(const unsigned int edge, const CImg& indices1, const CImg& indices2, + static int _isoline3d_index(const unsigned int edge, const CImg& indices1, const CImg& indices2, const unsigned int x, const unsigned int nx) { switch (edge) { case 0 : return (int)indices1(x,0); @@ -40419,6 +43455,46 @@ return 0; } + //! Generate an isosurface of the image instance as a 3D object. + /** + \param[out] primitives The returned list of the 3D object primitives + (template type \e tf should be at least \e unsigned \e int). + \param isovalue The returned list of the 3D object colors. + \param size_x Number of subdivisions along the X-axis. + \param size_y Number of subdisivions along the Y-axis. + \param size_z Number of subdisivions along the Z-axis. + \return The N vertices (xi,yi,zi) of the 3D object as a Nx3 CImg image (0<=i<=N - 1). + \par Example + \code + const CImg img = CImg("reference.jpg").resize(-100,-100,20); + CImgList faces3d; + const CImg points3d = img.get_isosurface3d(faces3d,100); + CImg().display_object3d("Isosurface3d",points3d,faces3d,colors3d); + \endcode + \image html ref_isosurface3d.jpg + **/ + template + CImg get_isosurface3d(CImgList& primitives, const float isovalue, + const int size_x=-100, const int size_y=-100, const int size_z=-100) const { + if (_spectrum>1) + throw CImgInstanceException(_cimg_instance + "get_isosurface3d(): Instance is not a scalar image.", + cimg_instance); + primitives.assign(); + if (is_empty()) return *this; + CImg vertices; + if ((size_x==-100 && size_y==-100 && size_z==-100) || (size_x==width() && size_y==height() && size_z==depth())) { + const _functor3d_int func(*this); + vertices = isosurface3d(primitives,func,isovalue,0,0,0,width() - 1.f,height() - 1.f,depth() - 1.f, + width(),height(),depth()); + } else { + const _functor3d_float func(*this); + vertices = isosurface3d(primitives,func,isovalue,0,0,0,width() - 1.f,height() - 1.f,depth() - 1.f, + size_x,size_y,size_z); + } + return vertices; + } + //! Compute isosurface of a function, as a 3D object. /** \param[out] primitives Primitives data of the resulting 3D object. @@ -40440,6 +43516,36 @@ const float x0, const float y0, const float z0, const float x1, const float y1, const float z1, const int size_x=32, const int size_y=32, const int size_z=32) { + CImgList vertices; + primitives.assign(); + typename CImg::_functor_isosurface3d add_vertex(vertices); + typename CImg::_functor_isosurface3d add_triangle(primitives); + isosurface3d(add_vertex,add_triangle,func,isovalue,x0,y0,z0,x1,y1,z1,size_x,size_y,size_z); + return vertices>'x'; + } + + //! Compute isosurface of a function, as a 3D object. + /** + \param[out] add_vertex : Functor with operator()(x,y,z) defined for adding new vertex. + \param[out] add_triangle : Functor with operator()(i,j) defined for adding new segment. + \param func Implicit function. Is of type float (*func)(const float x, const float y, const float z). + \param isovalue Isovalue to extract. + \param x0 X-coordinate of the starting point. + \param y0 Y-coordinate of the starting point. + \param z0 Z-coordinate of the starting point. + \param x1 X-coordinate of the ending point. + \param y1 Y-coordinate of the ending point. + \param z1 Z-coordinate of the ending point. + \param size_x Resolution of the elevation function along the X-axis. + \param size_y Resolution of the elevation function along the Y-axis. + \param size_z Resolution of the elevation function along the Z-axis. + \note Use the marching cubes algorithm for extracting the isosurface. + **/ + template + static void isosurface3d(tv& add_vertex, tf& add_triangle, const tfunc& func, const float isovalue, + const float x0, const float y0, const float z0, + const float x1, const float y1, const float z1, + const int size_x, const int size_y, const int size_z) { static const unsigned int edges[256] = { 0x000, 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c, 0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00, 0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c, 0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90, @@ -40728,13 +43834,12 @@ nxm1 = nx - 1, nym1 = ny - 1, nzm1 = nz - 1; - primitives.assign(); - if (!nxm1 || !nym1 || !nzm1) return CImg(); + if (!nxm1 || !nym1 || !nzm1) return; const float dx = (x1 - x0)/nxm1, dy = (y1 - y0)/nym1, dz = (z1 - z0)/nzm1; - CImgList vertices; CImg indices1(nx,ny,1,3,-1), indices2(indices1); CImg values1(nx,ny), values2(nx,ny); float X = 0, Y = 0, Z = 0, nX = 0, nY = 0, nZ = 0; + int nb_vertices = 0; // Fill the first plane with function values Y = y0; @@ -40749,8 +43854,12 @@ for (unsigned int zi = 0; zi::vector(Xi,Y,Z).move_to(vertices); + indices1(xi,yi,0) = nb_vertices++; + add_vertex(Xi,Y,Z); } if ((edge&2) && indices1(nxi,yi,1)<0) { const float Yi = Y + (isovalue-val1)*dy/(val2-val1); - indices1(nxi,yi,1) = vertices.width(); - CImg::vector(nX,Yi,Z).move_to(vertices); + indices1(nxi,yi,1) = nb_vertices++; + add_vertex(nX,Yi,Z); } if ((edge&4) && indices1(xi,nyi,0)<0) { const float Xi = X + (isovalue-val3)*dx/(val2-val3); - indices1(xi,nyi,0) = vertices.width(); - CImg::vector(Xi,nY,Z).move_to(vertices); + indices1(xi,nyi,0) = nb_vertices++; + add_vertex(Xi,nY,Z); } if ((edge&8) && indices1(xi,yi,1)<0) { const float Yi = Y + (isovalue-val0)*dy/(val3-val0); - indices1(xi,yi,1) = vertices.width(); - CImg::vector(X,Yi,Z).move_to(vertices); + indices1(xi,yi,1) = nb_vertices++; + add_vertex(X,Yi,Z); } if ((edge&16) && indices2(xi,yi,0)<0) { const float Xi = X + (isovalue-val4)*dx/(val5-val4); - indices2(xi,yi,0) = vertices.width(); - CImg::vector(Xi,Y,nZ).move_to(vertices); + indices2(xi,yi,0) = nb_vertices++; + add_vertex(Xi,Y,nZ); } if ((edge&32) && indices2(nxi,yi,1)<0) { const float Yi = Y + (isovalue-val5)*dy/(val6-val5); - indices2(nxi,yi,1) = vertices.width(); - CImg::vector(nX,Yi,nZ).move_to(vertices); + indices2(nxi,yi,1) = nb_vertices++; + add_vertex(nX,Yi,nZ); } if ((edge&64) && indices2(xi,nyi,0)<0) { const float Xi = X + (isovalue-val7)*dx/(val6-val7); - indices2(xi,nyi,0) = vertices.width(); - CImg::vector(Xi,nY,nZ).move_to(vertices); + indices2(xi,nyi,0) = nb_vertices++; + add_vertex(Xi,nY,nZ); } if ((edge&128) && indices2(xi,yi,1)<0) { const float Yi = Y + (isovalue-val4)*dy/(val7-val4); - indices2(xi,yi,1) = vertices.width(); - CImg::vector(X,Yi,nZ).move_to(vertices); + indices2(xi,yi,1) = nb_vertices++; + add_vertex(X,Yi,nZ); } if ((edge&256) && indices1(xi,yi,2)<0) { const float Zi = Z+ (isovalue-val0)*dz/(val4-val0); - indices1(xi,yi,2) = vertices.width(); - CImg::vector(X,Y,Zi).move_to(vertices); + indices1(xi,yi,2) = nb_vertices++; + add_vertex(X,Y,Zi); } if ((edge&512) && indices1(nxi,yi,2)<0) { const float Zi = Z + (isovalue-val1)*dz/(val5-val1); - indices1(nxi,yi,2) = vertices.width(); - CImg::vector(nX,Y,Zi).move_to(vertices); + indices1(nxi,yi,2) = nb_vertices++; + add_vertex(nX,Y,Zi); } if ((edge&1024) && indices1(nxi,nyi,2)<0) { const float Zi = Z + (isovalue-val2)*dz/(val6-val2); - indices1(nxi,nyi,2) = vertices.width(); - CImg::vector(nX,nY,Zi).move_to(vertices); + indices1(nxi,nyi,2) = nb_vertices++; + add_vertex(nX,nY,Zi); } if ((edge&2048) && indices1(xi,nyi,2)<0) { const float Zi = Z + (isovalue-val3)*dz/(val7-val3); - indices1(xi,nyi,2) = vertices.width(); - CImg::vector(X,nY,Zi).move_to(vertices); + indices1(xi,nyi,2) = nb_vertices++; + add_vertex(X,nY,Zi); } // Create triangles @@ -40838,11 +43947,11 @@ p0 = (unsigned int)*(triangle++), p1 = (unsigned int)*(triangle++), p2 = (unsigned int)*(triangle++); - const tf - i0 = (tf)(_isosurface3d_indice(p0,indices1,indices2,xi,yi,nxi,nyi)), - i1 = (tf)(_isosurface3d_indice(p1,indices1,indices2,xi,yi,nxi,nyi)), - i2 = (tf)(_isosurface3d_indice(p2,indices1,indices2,xi,yi,nxi,nyi)); - CImg::vector(i0,i2,i1).move_to(primitives); + const int + i0 = _isosurface3d_index(p0,indices1,indices2,xi,yi,nxi,nyi), + i1 = _isosurface3d_index(p1,indices1,indices2,xi,yi,nxi,nyi), + i2 = _isosurface3d_index(p2,indices1,indices2,xi,yi,nxi,nyi); + add_triangle(i0,i2,i1); } } } @@ -40850,7 +43959,6 @@ cimg::swap(values1,values2); cimg::swap(indices1,indices2); } - return vertices>'x'; } //! Compute isosurface of a function, as a 3D object \overloading. @@ -40864,7 +43972,7 @@ } template - static int _isosurface3d_indice(const unsigned int edge, const CImg& indices1, const CImg& indices2, + static int _isosurface3d_index(const unsigned int edge, const CImg& indices1, const CImg& indices2, const unsigned int x, const unsigned int y, const unsigned int nx, const unsigned int ny) { switch (edge) { @@ -40947,6 +44055,81 @@ } }; + struct _functor_isoline3d { + CImgList& list; + _functor_isoline3d(CImgList& _list):list(_list) {} + template + void operator()(const t x, const t y, const t z) { CImg::vector((T)x,(T)y,(T)z).move_to(list); } + template + void operator()(const t i, const t j) { CImg::vector((T)i,(T)j).move_to(list); } + }; + + struct _functor_isosurface3d { + CImgList& list; + _functor_isosurface3d(CImgList& _list):list(_list) {} + template + void operator()(const t x, const t y, const t z) { CImg::vector((T)x,(T)y,(T)z).move_to(list); } + }; + + //! Compute 3D elevation of a function as a 3D object. + /** + \param[out] primitives Primitives data of the resulting 3D object. + \param func Elevation function. Is of type float (*func)(const float x,const float y). + \param x0 X-coordinate of the starting point. + \param y0 Y-coordinate of the starting point. + \param x1 X-coordinate of the ending point. + \param y1 Y-coordinate of the ending point. + \param size_x Resolution of the function along the X-axis. + \param size_y Resolution of the function along the Y-axis. + **/ + template + static CImg elevation3d(CImgList& primitives, const tfunc& func, + const float x0, const float y0, const float x1, const float y1, + const int size_x=256, const int size_y=256) { + const float + nx0 = x0=0?size_x:(nx1-nx0)*-size_x/100), + nsize_x = _nsize_x?_nsize_x:1, nsize_x1 = nsize_x - 1, + _nsize_y = (unsigned int)(size_y>=0?size_y:(ny1-ny0)*-size_y/100), + nsize_y = _nsize_y?_nsize_y:1, nsize_y1 = nsize_y - 1; + if (nsize_x<2 || nsize_y<2) + throw CImgArgumentException("CImg<%s>::elevation3d(): Invalid specified size (%d,%d).", + pixel_type(), + nsize_x,nsize_y); + + CImg vertices(nsize_x*nsize_y,3); + floatT *ptr_x = vertices.data(0,0), *ptr_y = vertices.data(0,1), *ptr_z = vertices.data(0,2); + for (unsigned int y = 0; y + static CImg elevation3d(CImgList& primitives, const char *const expression, + const float x0, const float y0, const float x1, const float y1, + const int size_x=256, const int size_y=256) { + const _functor2d_expr func(expression); + return elevation3d(primitives,func,x0,y0,x1,y1,size_x,size_y); + } + //! Generate a 3D box object. /** \param[out] primitives The returned list of the 3D object primitives @@ -41502,12 +44685,14 @@ //@{ //--------------------------- -#define cimg_init_scanline(color,opacity) \ +#define cimg_init_scanline(opacity) \ + static const T _sc_maxval = (T)std::min(cimg::type::max(),(T)cimg::type::max()); \ const float _sc_nopacity = cimg::abs((float)opacity), _sc_copacity = 1 - std::max((float)opacity,0.f); \ - const ulongT _sc_whd = (ulongT)_width*_height*_depth + const ulongT _sc_whd = (ulongT)_width*_height*_depth; \ + cimg::unused(_sc_maxval); #define cimg_draw_scanline(x0,x1,y,color,opacity,brightness) \ - _draw_scanline(x0,x1,y,color,opacity,brightness,_sc_nopacity,_sc_copacity,_sc_whd) + _draw_scanline(x0,x1,y,color,opacity,brightness,_sc_nopacity,_sc_copacity,_sc_whd,_sc_maxval) // [internal] The following _draw_scanline() routines are *non user-friendly functions*, // used only for internal purpose. @@ -41516,8 +44701,7 @@ CImg& _draw_scanline(const int x0, const int x1, const int y, const tc *const color, const float opacity, const float brightness, - const float nopacity, const float copacity, const ulongT whd) { - static const T maxval = (T)std::min(cimg::type::max(),(T)cimg::type::max()); + const float nopacity, const float copacity, const ulongT whd, const T _sc_maxval) { const int nx0 = x0>0?x0:0, nx1 = x1=0) { const tc *col = color; @@ -41546,11 +44730,11 @@ } } else { // Brightness>1 if (sizeof(T)!=1) cimg_forC(*this,c) { - const T val = (T)((2-brightness)**(col++) + (brightness - 1)*maxval); + const T val = (T)((2-brightness)**(col++) + (brightness - 1)*_sc_maxval); for (int x = dx; x>=0; --x) *(ptrd++) = val; ptrd+=off; } else cimg_forC(*this,c) { - const T val = (T)((2-brightness)**(col++) + (brightness - 1)*maxval); + const T val = (T)((2-brightness)**(col++) + (brightness - 1)*_sc_maxval); std::memset(ptrd,(int)val,dx + 1); ptrd+=whd; } @@ -41570,7 +44754,7 @@ } } else { // Brightness>1 cimg_forC(*this,c) { - const Tfloat val = ((2-brightness)**(col++) + (brightness - 1)*maxval)*nopacity; + const Tfloat val = ((2-brightness)**(col++) + (brightness - 1)*_sc_maxval)*nopacity; for (int x = dx; x>=0; --x) { *ptrd = (T)(val + *ptrd*copacity); ++ptrd; } ptrd+=off; } @@ -41669,74 +44853,45 @@ \endcode **/ template - CImg& draw_line(const int x0, const int y0, - const int x1, const int y1, + CImg& draw_line(int x0, int y0, + int x1, int y1, const tc *const color, const float opacity=1, const unsigned int pattern=~0U, const bool init_hatch=true) { - if (is_empty()) return *this; - if (!color) - throw CImgArgumentException(_cimg_instance - "draw_line(): Specified color is (null).", - cimg_instance); + if (is_empty() || !opacity || !pattern || + std::min(y0,y1)>=height() || std::max(y0,y1)<0 || + std::min(x0,x1)>=width() || std::max(x0,x1)<0) return *this; + + int + w1 = width() - 1, h1 = height() - 1, + dx01 = x1 - x0, dy01 = y1 - y0; + + const bool is_horizontal = cimg::abs(dx01)>cimg::abs(dy01); + if (is_horizontal) cimg::swap(x0,y0,x1,y1,w1,h1,dx01,dy01); + if (pattern==~0U && y0>y1) { + cimg::swap(x0,x1,y0,y1); + dx01*=-1; dy01*=-1; + } + static unsigned int hatch = ~0U - (~0U>>1); if (init_hatch) hatch = ~0U - (~0U>>1); - const bool xdir = x0=width()) return *this; - if (xleft<0) { yleft-=(int)((float)xleft*((float)yright - yleft)/((float)xright - xleft)); xleft = 0; } - if (xright>=width()) { - yright-=(int)(((float)xright - width())*((float)yright - yleft)/((float)xright - xleft)); - xright = width() - 1; - } - if (ydown<0 || yup>=height()) return *this; - if (yup<0) { xup-=(int)((float)yup*((float)xdown - xup)/((float)ydown - yup)); yup = 0; } - if (ydown>=height()) { - xdown-=(int)(((float)ydown - height())*((float)xdown - xup)/((float)ydown - yup)); - ydown = height() - 1; - } - T *ptrd0 = data(nx0,ny0); - int dx = xright - xleft, dy = ydown - yup; - const bool steep = dy>dx; - if (steep) cimg::swap(nx0,ny0,nx1,ny1,dx,dy); - const longT - offx = (longT)(nx0=1) { - if (~pattern) for (int error = dx>>1, x = 0; x<=dx; ++x) { - if (pattern&hatch) { - T *ptrd = ptrd0; const tc* col = color; - cimg_forC(*this,c) { *ptrd = (T)*(col++); ptrd+=wh; } - } - hatch>>=1; if (!hatch) hatch = ~0U - (~0U>>1); - ptrd0+=offx; - if ((error-=dy)<0) { ptrd0+=offy; error+=dx; } - } else for (int error = dx>>1, x = 0; x<=dx; ++x) { - T *ptrd = ptrd0; const tc* col = color; cimg_forC(*this,c) { *ptrd = (T)*(col++); ptrd+=wh; } - ptrd0+=offx; - if ((error-=dy)<0) { ptrd0+=offy; error+=dx; } - } - } else { - const float nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f); - if (~pattern) for (int error = dx>>1, x = 0; x<=dx; ++x) { - if (pattern&hatch) { - T *ptrd = ptrd0; const tc* col = color; - cimg_forC(*this,c) { *ptrd = (T)(nopacity**(col++) + *ptrd*copacity); ptrd+=wh; } - } - hatch>>=1; if (!hatch) hatch = ~0U - (~0U>>1); - ptrd0+=offx; - if ((error-=dy)<0) { ptrd0+=offy; error+=dx; } - } else for (int error = dx>>1, x = 0; x<=dx; ++x) { - T *ptrd = ptrd0; const tc* col = color; - cimg_forC(*this,c) { *ptrd = (T)(nopacity**(col++) + *ptrd*copacity); ptrd+=wh; } - ptrd0+=offx; - if ((error-=dy)<0) { ptrd0+=offy; error+=dx; } + cimg_init_scanline(opacity); + const int + step = y0<=y1?1:-1,hdy01 = dy01*cimg::sign(dx01)/2, + cy0 = cimg::cut(y0,0,h1), cy1 = cimg::cut(y1,0,h1) + step; + dy01+=dy01?0:1; + + for (int y = cy0; y!=cy1; y+=step) { + const int + yy0 = y - y0, + x = x0 + (dx01*yy0 + hdy01)/dy01; + if (x>=0 && x<=w1 && pattern&hatch) { + T *const ptrd = is_horizontal?data(y,x):data(x,y); + cimg_forC(*this,c) { + const T val = color[c]; + ptrd[c*_sc_whd] = opacity>=1?val:(T)(val*_sc_nopacity + ptrd[c*_sc_whd]*_sc_copacity); + } } + if (!(hatch>>=1)) hatch = ~0U - (~0U>>1); } return *this; } @@ -41757,12 +44912,11 @@ **/ template CImg& draw_line(CImg& zbuffer, - const int x0, const int y0, const float z0, - const int x1, const int y1, const float z1, + int x0, int y0, const float z0, + int x1, int y1, const float z1, const tc *const color, const float opacity=1, const unsigned int pattern=~0U, const bool init_hatch=true) { - typedef typename cimg::superset::type tzfloat; - if (is_empty() || z0<=0 || z1<=0) return *this; + if (is_empty() || z0<=0 || z1<=0 || !opacity || !pattern) return *this; if (!color) throw CImgArgumentException(_cimg_instance "draw_line(): Specified color is (null).", @@ -41773,192 +44927,47 @@ "different dimensions.", cimg_instance, zbuffer._width,zbuffer._height,zbuffer._depth,zbuffer._spectrum,zbuffer._data); - static unsigned int hatch = ~0U - (~0U>>1); - if (init_hatch) hatch = ~0U - (~0U>>1); - const bool xdir = x0=height() || std::max(y0,y1)<0 || std::min(x0,x1)>=width() || std::max(x0,x1)<0) return *this; + + float iz0 = 1/z0, iz1 = 1/z1; int - nx0 = x0, nx1 = x1, ny0 = y0, ny1 = y1, - &xleft = xdir?nx0:nx1, &yleft = xdir?ny0:ny1, - &xright = xdir?nx1:nx0, &yright = xdir?ny1:ny0, - &xup = ydir?nx0:nx1, &yup = ydir?ny0:ny1, - &xdown = ydir?nx1:nx0, &ydown = ydir?ny1:ny0; - tzfloat - Z0 = 1/(tzfloat)z0, Z1 = 1/(tzfloat)z1, nz0 = Z0, nz1 = Z1, dz = Z1 - Z0, - &zleft = xdir?nz0:nz1, - &zright = xdir?nz1:nz0, - &zup = ydir?nz0:nz1, - &zdown = ydir?nz1:nz0; - if (xright<0 || xleft>=width()) return *this; - if (xleft<0) { - const float D = (float)xright - xleft; - yleft-=(int)((float)xleft*((float)yright - yleft)/D); - zleft-=(tzfloat)xleft*(zright - zleft)/D; - xleft = 0; - } - if (xright>=width()) { - const float d = (float)xright - width(), D = (float)xright - xleft; - yright-=(int)(d*((float)yright - yleft)/D); - zright-=(tzfloat)d*(zright - zleft)/D; - xright = width() - 1; - } - if (ydown<0 || yup>=height()) return *this; - if (yup<0) { - const float D = (float)ydown - yup; - xup-=(int)((float)yup*((float)xdown - xup)/D); - zup-=(tzfloat)yup*(zdown - zup)/D; - yup = 0; - } - if (ydown>=height()) { - const float d = (float)ydown - height(), D = (float)ydown - yup; - xdown-=(int)(d*((float)xdown - xup)/D); - zdown-=(tzfloat)d*(zdown - zup)/D; - ydown = height() - 1; - } - T *ptrd0 = data(nx0,ny0); - tz *ptrz = zbuffer.data(nx0,ny0); - int dx = xright - xleft, dy = ydown - yup; - const bool steep = dy>dx; - if (steep) cimg::swap(nx0,ny0,nx1,ny1,dx,dy); - const longT - offx = (longT)(nx00?dx:1); - if (opacity>=1) { - if (~pattern) for (int error = dx>>1, x = 0; x<=dx; ++x) { - const tzfloat z = Z0 + x*dz/ndx; - if (z>=(tzfloat)*ptrz && pattern&hatch) { - *ptrz = (tz)z; - T *ptrd = ptrd0; const tc *col = color; - cimg_forC(*this,c) { *ptrd = (T)*(col++); ptrd+=wh; } - } - hatch>>=1; if (!hatch) hatch = ~0U - (~0U>>1); - ptrd0+=offx; ptrz+=offx; - if ((error-=dy)<0) { ptrd0+=offy; ptrz+=offy; error+=dx; } - } else for (int error = dx>>1, x = 0; x<=dx; ++x) { - const tzfloat z = Z0 + x*dz/ndx; - if (z>=(tzfloat)*ptrz) { - *ptrz = (tz)z; - T *ptrd = ptrd0; const tc *col = color; - cimg_forC(*this,c) { *ptrd = (T)*(col++); ptrd+=wh; } - } - ptrd0+=offx; ptrz+=offx; - if ((error-=dy)<0) { ptrd0+=offy; ptrz+=offy; error+=dx; } - } - } else { - const float nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f); - if (~pattern) for (int error = dx>>1, x = 0; x<=dx; ++x) { - const tzfloat z = Z0 + x*dz/ndx; - if (z>=(tzfloat)*ptrz && pattern&hatch) { - *ptrz = (tz)z; - T *ptrd = ptrd0; const tc *col = color; - cimg_forC(*this,c) { *ptrd = (T)(nopacity**(col++) + *ptrd*copacity); ptrd+=wh; } - } - hatch>>=1; if (!hatch) hatch = ~0U - (~0U>>1); - ptrd0+=offx; ptrz+=offx; - if ((error-=dy)<0) { ptrd0+=offy; ptrz+=offy; error+=dx; } - } else for (int error = dx>>1, x = 0; x<=dx; ++x) { - const tzfloat z = Z0 + x*dz/ndx; - if (z>=(tzfloat)*ptrz) { - *ptrz = (tz)z; - T *ptrd = ptrd0; const tc *col = color; - cimg_forC(*this,c) { *ptrd = (T)(nopacity**(col++) + *ptrd*copacity); ptrd+=wh; } - } - ptrd0+=offx; ptrz+=offx; - if ((error-=dy)<0) { ptrd0+=offy; ptrz+=offy; error+=dx; } - } + w1 = width() - 1, h1 = height() - 1, + dx01 = x1 - x0, dy01 = y1 - y0; + float diz01 = iz1 - iz0; + + const bool is_horizontal = cimg::abs(dx01)>cimg::abs(dy01); + if (is_horizontal) cimg::swap(x0,y0,x1,y1,w1,h1,dx01,dy01); + if (pattern==~0U && y0>y1) { + cimg::swap(x0,x1,y0,y1,iz0,iz1); + dx01*=-1; dy01*=-1; diz01*=-1; } - return *this; - } - //! Draw a 3D line. - /** - \param x0 X-coordinate of the starting point. - \param y0 Y-coordinate of the starting point. - \param z0 Z-coordinate of the starting point - \param x1 X-coordinate of the ending point. - \param y1 Y-coordinate of the ending point. - \param z1 Z-coordinate of the ending point. - \param color Pointer to \c spectrum() consecutive values of type \c T, defining the drawing color. - \param opacity Drawing opacity. - \param pattern An integer whose bits describe the line pattern. - \param init_hatch Tells if a reinitialization of the hash state must be done. - **/ - template - CImg& draw_line(const int x0, const int y0, const int z0, - const int x1, const int y1, const int z1, - const tc *const color, const float opacity=1, - const unsigned int pattern=~0U, const bool init_hatch=true) { - if (is_empty()) return *this; - if (!color) - throw CImgArgumentException(_cimg_instance - "draw_line(): Specified color is (null).", - cimg_instance); static unsigned int hatch = ~0U - (~0U>>1); if (init_hatch) hatch = ~0U - (~0U>>1); - int nx0 = x0, ny0 = y0, nz0 = z0, nx1 = x1, ny1 = y1, nz1 = z1; - if (nx0>nx1) cimg::swap(nx0,nx1,ny0,ny1,nz0,nz1); - if (nx1<0 || nx0>=width()) return *this; - if (nx0<0) { - const float D = 1.f + nx1 - nx0; - ny0-=(int)((float)nx0*(1.f + ny1 - ny0)/D); - nz0-=(int)((float)nx0*(1.f + nz1 - nz0)/D); - nx0 = 0; - } - if (nx1>=width()) { - const float d = (float)nx1 - width(), D = 1.f + nx1 - nx0; - ny1+=(int)(d*(1.f + ny0 - ny1)/D); - nz1+=(int)(d*(1.f + nz0 - nz1)/D); - nx1 = width() - 1; - } - if (ny0>ny1) cimg::swap(nx0,nx1,ny0,ny1,nz0,nz1); - if (ny1<0 || ny0>=height()) return *this; - if (ny0<0) { - const float D = 1.f + ny1 - ny0; - nx0-=(int)((float)ny0*(1.f + nx1 - nx0)/D); - nz0-=(int)((float)ny0*(1.f + nz1 - nz0)/D); - ny0 = 0; - } - if (ny1>=height()) { - const float d = (float)ny1 - height(), D = 1.f + ny1 - ny0; - nx1+=(int)(d*(1.f + nx0 - nx1)/D); - nz1+=(int)(d*(1.f + nz0 - nz1)/D); - ny1 = height() - 1; - } - if (nz0>nz1) cimg::swap(nx0,nx1,ny0,ny1,nz0,nz1); - if (nz1<0 || nz0>=depth()) return *this; - if (nz0<0) { - const float D = 1.f + nz1 - nz0; - nx0-=(int)((float)nz0*(1.f + nx1 - nx0)/D); - ny0-=(int)((float)nz0*(1.f + ny1 - ny0)/D); - nz0 = 0; - } - if (nz1>=depth()) { - const float d = (float)nz1 - depth(), D = 1.f + nz1 - nz0; - nx1+=(int)(d*(1.f + nx0 - nx1)/D); - ny1+=(int)(d*(1.f + ny0 - ny1)/D); - nz1 = depth() - 1; - } - const unsigned int dmax = (unsigned int)cimg::max(cimg::abs(nx1 - nx0),cimg::abs(ny1 - ny0),nz1 - nz0); - const ulongT whd = (ulongT)_width*_height*_depth; - const float px = (nx1 - nx0)/(float)dmax, py = (ny1 - ny0)/(float)dmax, pz = (nz1 - nz0)/(float)dmax; - float x = (float)nx0, y = (float)ny0, z = (float)nz0; - if (opacity>=1) for (unsigned int t = 0; t<=dmax; ++t) { - if (!(~pattern) || (~pattern && pattern&hatch)) { - T* ptrd = data((unsigned int)x,(unsigned int)y,(unsigned int)z); - const tc *col = color; cimg_forC(*this,c) { *ptrd = (T)*(col++); ptrd+=whd; } - } - x+=px; y+=py; z+=pz; if (pattern) { hatch>>=1; if (!hatch) hatch = ~0U - (~0U>>1); } - } else { - const float nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f); - for (unsigned int t = 0; t<=dmax; ++t) { - if (!(~pattern) || (~pattern && pattern&hatch)) { - T* ptrd = data((unsigned int)x,(unsigned int)y,(unsigned int)z); - const tc *col = color; cimg_forC(*this,c) { *ptrd = (T)(*(col++)*nopacity + *ptrd*copacity); ptrd+=whd; } + cimg_init_scanline(opacity); + + const int + step = y0<=y1?1:-1, hdy01 = dy01*cimg::sign(dx01)/2, + cy0 = cimg::cut(y0,0,h1), cy1 = cimg::cut(y1,0,h1) + step; + dy01+=dy01?0:1; + + for (int y = cy0; y!=cy1; y+=step) { + const int + yy0 = y - y0, + x = x0 + (dx01*yy0 + hdy01)/dy01; + const float iz = iz0 + diz01*yy0/dy01; + tz *const ptrz = is_horizontal?zbuffer.data(y,x):zbuffer.data(x,y); + + if (x>=0 && x<=w1 && pattern&hatch && iz>=*ptrz) { + *ptrz = (tz)iz; + T *const ptrd = is_horizontal?data(y,x):data(x,y); + cimg_forC(*this,c) { + const T val = color[c]; + ptrd[c*_sc_whd] = opacity>=1?val:(T)(val*_sc_nopacity + ptrd[c*_sc_whd]*_sc_copacity); } - x+=px; y+=py; z+=pz; if (pattern) { hatch>>=1; if (!hatch) hatch = ~0U - (~0U>>1); } } + if (!(hatch>>=1)) hatch = ~0U - (~0U>>1); } return *this; } @@ -41987,112 +44996,63 @@ \endcode **/ template - CImg& draw_line(const int x0, const int y0, - const int x1, const int y1, + CImg& draw_line(int x0, int y0, + int x1, int y1, const CImg& texture, - const int tx0, const int ty0, - const int tx1, const int ty1, + int tx0, int ty0, + int tx1, int ty1, const float opacity=1, const unsigned int pattern=~0U, const bool init_hatch=true) { - if (is_empty()) return *this; + + if (is_empty() || !opacity || !pattern) return *this; if (texture._depth>1 || texture._spectrum<_spectrum) throw CImgArgumentException(_cimg_instance "draw_line(): Invalid specified texture (%u,%u,%u,%u,%p).", cimg_instance, texture._width,texture._height,texture._depth,texture._spectrum,texture._data); if (is_overlapped(texture)) return draw_line(x0,y0,x1,y1,+texture,tx0,ty0,tx1,ty1,opacity,pattern,init_hatch); + + if (std::min(y0,y1)>=height() || std::max(y0,y1)<0 || std::min(x0,x1)>=width() || std::max(x0,x1)<0) return *this; + + int + w1 = width() - 1, h1 = height() - 1, + dx01 = x1 - x0, dy01 = y1 - y0; + int + dtx01 = tx1 - tx0, dty01 = ty1 - ty0; + + const bool is_horizontal = cimg::abs(dx01)>cimg::abs(dy01); + if (is_horizontal) cimg::swap(x0,y0,x1,y1,w1,h1,dx01,dy01); + if (pattern==~0U && y0>y1) { + cimg::swap(x0,x1,y0,y1,tx0,tx1,ty0,ty1); + dx01*=-1; dy01*=-1; dtx01*=-1; dty01*=-1; + } + + const ulongT twhd = (ulongT)texture._width*texture._height*texture._depth; static unsigned int hatch = ~0U - (~0U>>1); if (init_hatch) hatch = ~0U - (~0U>>1); - const bool xdir = x0=width()) return *this; - if (xleft<0) { - const float D = (float)xright - xleft; - yleft-=(int)((float)xleft*((float)yright - yleft)/D); - txleft-=(int)((float)xleft*((float)txright - txleft)/D); - tyleft-=(int)((float)xleft*((float)tyright - tyleft)/D); - xleft = 0; - } - if (xright>=width()) { - const float d = (float)xright - width(), D = (float)xright - xleft; - yright-=(int)(d*((float)yright - yleft)/D); - txright-=(int)(d*((float)txright - txleft)/D); - tyright-=(int)(d*((float)tyright - tyleft)/D); - xright = width() - 1; - } - if (ydown<0 || yup>=height()) return *this; - if (yup<0) { - const float D = (float)ydown - yup; - xup-=(int)((float)yup*((float)xdown - xup)/D); - txup-=(int)((float)yup*((float)txdown - txup)/D); - tyup-=(int)((float)yup*((float)tydown - tyup)/D); - yup = 0; - } - if (ydown>=height()) { - const float d = (float)ydown - height(), D = (float)ydown - yup; - xdown-=(int)(d*((float)xdown - xup)/D); - txdown-=(int)(d*((float)txdown - txup)/D); - tydown-=(int)(d*((float)tydown - tyup)/D); - ydown = height() - 1; - } - T *ptrd0 = data(nx0,ny0); - int dx = xright - xleft, dy = ydown - yup; - const bool steep = dy>dx; - if (steep) cimg::swap(nx0,ny0,nx1,ny1,dx,dy); - const longT - offx = (longT)(nx00?dx:1); - const ulongT - whd = (ulongT)_width*_height*_depth, - twh = (ulongT)texture._width*texture._height; + cimg_init_scanline(opacity); - if (opacity>=1) { - if (~pattern) for (int error = dx>>1, x = 0; x<=dx; ++x) { - if (pattern&hatch) { - T *ptrd = ptrd0; - const int tx = tx0 + x*dtx/ndx, ty = ty0 + x*dty/ndx; - const tc *col = &texture._atXY(tx,ty); - cimg_forC(*this,c) { *ptrd = (T)*col; ptrd+=whd; col+=twh; } - } - hatch>>=1; if (!hatch) hatch = ~0U - (~0U>>1); - ptrd0+=offx; - if ((error-=dy)<0) { ptrd0+=offy; error+=dx; } - } else for (int error = dx>>1, x = 0; x<=dx; ++x) { - T *ptrd = ptrd0; - const int tx = tx0 + x*dtx/ndx, ty = ty0 + x*dty/ndx; - const tc *col = &texture._atXY(tx,ty); - cimg_forC(*this,c) { *ptrd = (T)*col; ptrd+=whd; col+=twh; } - ptrd0+=offx; - if ((error-=dy)<0) { ptrd0+=offy; error+=dx; } - } - } else { - const float nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f); - if (~pattern) for (int error = dx>>1, x = 0; x<=dx; ++x) { - T *ptrd = ptrd0; - if (pattern&hatch) { - const int tx = tx0 + x*dtx/ndx, ty = ty0 + x*dty/ndx; - const tc *col = &texture._atXY(tx,ty); - cimg_forC(*this,c) { *ptrd = (T)(nopacity**col + *ptrd*copacity); ptrd+=whd; col+=twh; } - } - hatch>>=1; if (!hatch) hatch = ~0U - (~0U>>1); - ptrd0+=offx; - if ((error-=dy)<0) { ptrd0+=offy; error+=dx; } - } else for (int error = dx>>1, x = 0; x<=dx; ++x) { - T *ptrd = ptrd0; - const int tx = tx0 + x*dtx/ndx, ty = ty0 + x*dty/ndx; - const tc *col = &texture._atXY(tx,ty); - cimg_forC(*this,c) { *ptrd = (T)(nopacity**col + *ptrd*copacity); ptrd+=whd; col+=twh; } - ptrd0+=offx; - if ((error-=dy)<0) { ptrd0+=offy; error+=dx; } + const int + step = y0<=y1?1:-1, hdy01 = dy01*cimg::sign(dx01)/2, + hdy01tx = dy01*cimg::sign(dtx01)/2, hdy01ty = dy01*cimg::sign(dty01)/2, + cy0 = cimg::cut(y0,0,h1), cy1 = cimg::cut(y1,0,h1) + step; + dy01+=dy01?0:1; + + for (int y = cy0; y!=cy1; y+=step) { + const int + yy0 = y - y0, + x = x0 + (dx01*yy0 + hdy01)/dy01, + tx = tx0 + (dtx01*yy0 + hdy01tx)/dy01, + ty = ty0 + (dty01*yy0 + hdy01ty)/dy01; + if (x>=0 && x<=w1 && pattern&hatch) { + T *const ptrd = is_horizontal?data(y,x):data(x,y); + const tc *const color = &texture._atXY(tx,ty); + cimg_forC(*this,c) { + const T val = color[c*twhd]; + ptrd[c*_sc_whd] = (T)(opacity>=1?val:val*_sc_nopacity + ptrd[c*_sc_whd]*_sc_copacity); + } } + if (!(hatch>>=1)) hatch = ~0U - (~0U>>1); } return *this; } @@ -42115,14 +45075,14 @@ \param init_hatch Tells if the hash variable must be reinitialized. **/ template - CImg& draw_line(const int x0, const int y0, const float z0, - const int x1, const int y1, const float z1, + CImg& draw_line(int x0, int y0, const float z0, + int x1, int y1, const float z1, const CImg& texture, const int tx0, const int ty0, const int tx1, const int ty1, const float opacity=1, const unsigned int pattern=~0U, const bool init_hatch=true) { - if (is_empty() && z0<=0 && z1<=0) return *this; + if (is_empty() || z0<=0 || z1<=0 || !opacity || !pattern) return *this; if (texture._depth>1 || texture._spectrum<_spectrum) throw CImgArgumentException(_cimg_instance "draw_line(): Invalid specified texture (%u,%u,%u,%u,%p).", @@ -42130,110 +45090,56 @@ texture._width,texture._height,texture._depth,texture._spectrum,texture._data); if (is_overlapped(texture)) return draw_line(x0,y0,z0,x1,y1,z1,+texture,tx0,ty0,tx1,ty1,opacity,pattern,init_hatch); - static unsigned int hatch = ~0U - (~0U>>1); - if (init_hatch) hatch = ~0U - (~0U>>1); - const bool xdir = x0=height() || std::max(y0,y1)<0 || std::min(x0,x1)>=width() || std::max(x0,x1)<0) return *this; + + float iz0 = 1/z0, iz1 = 1/z1; int - nx0 = x0, nx1 = x1, ny0 = y0, ny1 = y1, - &xleft = xdir?nx0:nx1, &yleft = xdir?ny0:ny1, - &xright = xdir?nx1:nx0, &yright = xdir?ny1:ny0, - &xup = ydir?nx0:nx1, &yup = ydir?ny0:ny1, - &xdown = ydir?nx1:nx0, &ydown = ydir?ny1:ny0; + w1 = width() - 1, h1 = height() - 1, + dx01 = x1 - x0, dy01 = y1 - y0; float - Tx0 = tx0/z0, Tx1 = tx1/z1, - Ty0 = ty0/z0, Ty1 = ty1/z1, - Z0 = 1/z0, Z1 = 1/z1, - dz = Z1 - Z0, dtx = Tx1 - Tx0, dty = Ty1 - Ty0, - tnx0 = Tx0, tnx1 = Tx1, tny0 = Ty0, tny1 = Ty1, nz0 = Z0, nz1 = Z1, - &zleft = xdir?nz0:nz1, &txleft = xdir?tnx0:tnx1, &tyleft = xdir?tny0:tny1, - &zright = xdir?nz1:nz0, &txright = xdir?tnx1:tnx0, &tyright = xdir?tny1:tny0, - &zup = ydir?nz0:nz1, &txup = ydir?tnx0:tnx1, &tyup = ydir?tny0:tny1, - &zdown = ydir?nz1:nz0, &txdown = ydir?tnx1:tnx0, &tydown = ydir?tny1:tny0; - if (xright<0 || xleft>=width()) return *this; - if (xleft<0) { - const float D = (float)xright - xleft; - yleft-=(int)((float)xleft*((float)yright - yleft)/D); - zleft-=(float)xleft*(zright - zleft)/D; - txleft-=(float)xleft*(txright - txleft)/D; - tyleft-=(float)xleft*(tyright - tyleft)/D; - xleft = 0; - } - if (xright>=width()) { - const float d = (float)xright - width(), D = (float)xright - xleft; - yright-=(int)(d*((float)yright - yleft)/D); - zright-=d*(zright - zleft)/D; - txright-=d*(txright - txleft)/D; - tyright-=d*(tyright - tyleft)/D; - xright = width() - 1; - } - if (ydown<0 || yup>=height()) return *this; - if (yup<0) { - const float D = (float)ydown - yup; - xup-=(int)((float)yup*((float)xdown - xup)/D); - zup-=(float)yup*(zdown - zup)/D; - txup-=(float)yup*(txdown - txup)/D; - tyup-=(float)yup*(tydown - tyup)/D; - yup = 0; - } - if (ydown>=height()) { - const float d = (float)ydown - height(), D = (float)ydown - yup; - xdown-=(int)(d*((float)xdown - xup)/D); - zdown-=d*(zdown - zup)/D; - txdown-=d*(txdown - txup)/D; - tydown-=d*(tydown - tyup)/D; - ydown = height() - 1; - } - T *ptrd0 = data(nx0,ny0); - int dx = xright - xleft, dy = ydown - yup; - const bool steep = dy>dx; - if (steep) cimg::swap(nx0,ny0,nx1,ny1,dx,dy); - const longT - offx = (longT)(nx00?dx:1); - const ulongT - whd = (ulongT)_width*_height*_depth, - twh = (ulongT)texture._width*texture._height; + diz01 = iz1 - iz0, + txz0 = tx0*iz0, txz1 = tx1*iz1, + tyz0 = ty0*iz0, tyz1 = ty1*iz1, + dtxz01 = txz1 - txz0, dtyz01 = tyz1 - tyz0; + + const bool is_horizontal = cimg::abs(dx01)>cimg::abs(dy01); + if (is_horizontal) cimg::swap(x0,y0,x1,y1,w1,h1,dx01,dy01); + if (pattern==~0U && y0>y1) { + cimg::swap(x0,x1,y0,y1,iz0,iz1,txz0,txz1,tyz0,tyz1); + dx01*=-1; dy01*=-1; diz01*=-1; dtxz01*=-1; dtyz01*=-1; + } - if (opacity>=1) { - if (~pattern) for (int error = dx>>1, x = 0; x<=dx; ++x) { - if (pattern&hatch) { - const float z = Z0 + x*dz/ndx, tx = Tx0 + x*dtx/ndx, ty = Ty0 + x*dty/ndx; - const tc *col = &texture._atXY((int)(tx/z),(int)(ty/z)); - T *ptrd = ptrd0; - cimg_forC(*this,c) { *ptrd = (T)*col; ptrd+=whd; col+=twh; } - } - hatch>>=1; if (!hatch) hatch = ~0U - (~0U>>1); - ptrd0+=offx; - if ((error-=dy)<0) { ptrd0+=offy; error+=dx; } - } else for (int error = dx>>1, x = 0; x<=dx; ++x) { - const float z = Z0 + x*dz/ndx, tx = Tx0 + x*dtx/ndx, ty = Ty0 + x*dty/ndx; - const tc *col = &texture._atXY((int)(tx/z),(int)(ty/z)); - T *ptrd = ptrd0; - cimg_forC(*this,c) { *ptrd = (T)*col; ptrd+=whd; col+=twh; } - ptrd0+=offx; - if ((error-=dy)<0) { ptrd0+=offy; error+=dx; } - } - } else { - const float nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f); - if (~pattern) for (int error = dx>>1, x = 0; x<=dx; ++x) { - if (pattern&hatch) { - const float z = Z0 + x*dz/ndx, tx = Tx0 + x*dtx/ndx, ty = Ty0 + x*dty/ndx; - const tc *col = &texture._atXY((int)(tx/z),(int)(ty/z)); - T *ptrd = ptrd0; - cimg_forC(*this,c) { *ptrd = (T)(nopacity**col + *ptrd*copacity); ptrd+=whd; col+=twh; } - } - hatch>>=1; if (!hatch) hatch = ~0U - (~0U>>1); - ptrd0+=offx; - if ((error-=dy)<0) { ptrd0+=offy; error+=dx; } - } else for (int error = dx>>1, x = 0; x<=dx; ++x) { - const float z = Z0 + x*dz/ndx, tx = Tx0 + x*dtx/ndx, ty = Ty0 + x*dty/ndx; - const tc *col = &texture._atXY((int)(tx/z),(int)(ty/z)); - T *ptrd = ptrd0; - cimg_forC(*this,c) { *ptrd = (T)(nopacity**col + *ptrd*copacity); ptrd+=whd; col+=twh; } - ptrd0+=offx; - if ((error-=dy)<0) { ptrd0+=offy; error+=dx; } + const ulongT twhd = (ulongT)texture._width*texture._height*texture._depth; + static unsigned int hatch = ~0U - (~0U>>1); + if (init_hatch) hatch = ~0U - (~0U>>1); + cimg_init_scanline(opacity); + + const int + step = y0<=y1?1:-1, hdy01 = dy01*cimg::sign(dx01)/2, + cy0 = cimg::cut(y0,0,h1), cy1 = cimg::cut(y1,0,h1) + step; + dy01+=dy01?0:1; + + for (int y = cy0; y!=cy1; y+=step) { + const int + yy0 = y - y0, + x = x0 + (dx01*yy0 + hdy01)/dy01; + const float + iz = iz0 + diz01*yy0/dy01, + txz = txz0 + dtxz01*yy0/dy01, + tyz = tyz0 + dtyz01*yy0/dy01; + if (x>=0 && x<=w1 && pattern&hatch) { + const int + tx = (int)cimg::round(txz/iz), + ty = (int)cimg::round(tyz/iz); + T *const ptrd = is_horizontal?data(y,x):data(x,y); + const tc *const color = &texture._atXY(tx,ty); + cimg_forC(*this,c) { + const T val = color[c*twhd]; + ptrd[c*_sc_whd] = opacity>=1?val:(T)(val*_sc_nopacity + ptrd[c*_sc_whd]*_sc_copacity); + } } + if (!(hatch>>=1)) hatch = ~0U - (~0U>>1); } return *this; } @@ -42258,15 +45164,14 @@ **/ template CImg& draw_line(CImg& zbuffer, - const int x0, const int y0, const float z0, - const int x1, const int y1, const float z1, + int x0, int y0, const float z0, + int x1, int y1, const float z1, const CImg& texture, const int tx0, const int ty0, const int tx1, const int ty1, const float opacity=1, const unsigned int pattern=~0U, const bool init_hatch=true) { - typedef typename cimg::superset::type tzfloat; - if (is_empty() || z0<=0 || z1<=0) return *this; + if (is_empty() || z0<=0 || z1<=0 || !opacity || !pattern) return *this; if (!is_sameXY(zbuffer)) throw CImgArgumentException(_cimg_instance "draw_line(): Instance and specified Z-buffer (%u,%u,%u,%u,%p) have " @@ -42280,133 +45185,59 @@ texture._width,texture._height,texture._depth,texture._spectrum,texture._data); if (is_overlapped(texture)) return draw_line(zbuffer,x0,y0,z0,x1,y1,z1,+texture,tx0,ty0,tx1,ty1,opacity,pattern,init_hatch); - static unsigned int hatch = ~0U - (~0U>>1); - if (init_hatch) hatch = ~0U - (~0U>>1); - const bool xdir = x0=height() || std::max(y0,y1)<0 || std::min(x0,x1)>=width() || std::max(x0,x1)<0) return *this; + + float iz0 = 1/z0, iz1 = 1/z1; int - nx0 = x0, nx1 = x1, ny0 = y0, ny1 = y1, - &xleft = xdir?nx0:nx1, &yleft = xdir?ny0:ny1, - &xright = xdir?nx1:nx0, &yright = xdir?ny1:ny0, - &xup = ydir?nx0:nx1, &yup = ydir?ny0:ny1, - &xdown = ydir?nx1:nx0, &ydown = ydir?ny1:ny0; + w1 = width() - 1, h1 = height() - 1, + dx01 = x1 - x0, dy01 = y1 - y0; float - Tx0 = tx0/z0, Tx1 = tx1/z1, - Ty0 = ty0/z0, Ty1 = ty1/z1, - dtx = Tx1 - Tx0, dty = Ty1 - Ty0, - tnx0 = Tx0, tnx1 = Tx1, tny0 = Ty0, tny1 = Ty1, - &txleft = xdir?tnx0:tnx1, &tyleft = xdir?tny0:tny1, - &txright = xdir?tnx1:tnx0, &tyright = xdir?tny1:tny0, - &txup = ydir?tnx0:tnx1, &tyup = ydir?tny0:tny1, - &txdown = ydir?tnx1:tnx0, &tydown = ydir?tny1:tny0; - tzfloat - Z0 = 1/(tzfloat)z0, Z1 = 1/(tzfloat)z1, - dz = Z1 - Z0, nz0 = Z0, nz1 = Z1, - &zleft = xdir?nz0:nz1, - &zright = xdir?nz1:nz0, - &zup = ydir?nz0:nz1, - &zdown = ydir?nz1:nz0; - if (xright<0 || xleft>=width()) return *this; - if (xleft<0) { - const float D = (float)xright - xleft; - yleft-=(int)((float)xleft*((float)yright - yleft)/D); - zleft-=(float)xleft*(zright - zleft)/D; - txleft-=(float)xleft*(txright - txleft)/D; - tyleft-=(float)xleft*(tyright - tyleft)/D; - xleft = 0; - } - if (xright>=width()) { - const float d = (float)xright - width(), D = (float)xright - xleft; - yright-=(int)(d*((float)yright - yleft)/D); - zright-=d*(zright - zleft)/D; - txright-=d*(txright - txleft)/D; - tyright-=d*(tyright - tyleft)/D; - xright = width() - 1; - } - if (ydown<0 || yup>=height()) return *this; - if (yup<0) { - const float D = (float)ydown - yup; - xup-=(int)((float)yup*((float)xdown - xup)/D); - zup-=yup*(zdown - zup)/D; - txup-=yup*(txdown - txup)/D; - tyup-=yup*(tydown - tyup)/D; - yup = 0; - } - if (ydown>=height()) { - const float d = (float)ydown - height(), D = (float)ydown - yup; - xdown-=(int)(d*((float)xdown - xup)/D); - zdown-=d*(zdown - zup)/D; - txdown-=d*(txdown - txup)/D; - tydown-=d*(tydown - tyup)/D; - ydown = height() - 1; - } - T *ptrd0 = data(nx0,ny0); - tz *ptrz = zbuffer.data(nx0,ny0); - int dx = xright - xleft, dy = ydown - yup; - const bool steep = dy>dx; - if (steep) cimg::swap(nx0,ny0,nx1,ny1,dx,dy); - const longT - offx = (longT)(nx00?dx:1); - const ulongT - whd = (ulongT)_width*_height*_depth, - twh = (ulongT)texture._width*texture._height; + diz01 = iz1 - iz0, + txz0 = tx0*iz0, txz1 = tx1*iz1, + tyz0 = ty0*iz0, tyz1 = ty1*iz1, + dtxz01 = txz1 - txz0, dtyz01 = tyz1 - tyz0; + + const bool is_horizontal = cimg::abs(dx01)>cimg::abs(dy01); + if (is_horizontal) cimg::swap(x0,y0,x1,y1,w1,h1,dx01,dy01); + if (pattern==~0U && y0>y1) { + cimg::swap(x0,x1,y0,y1,iz0,iz1,txz0,txz1,tyz0,tyz1); + dx01*=-1; dy01*=-1; diz01*=-1; dtxz01*=-1; dtyz01*=-1; + } - if (opacity>=1) { - if (~pattern) for (int error = dx>>1, x = 0; x<=dx; ++x) { - if (pattern&hatch) { - const tzfloat z = Z0 + x*dz/ndx; - if (z>=(tzfloat)*ptrz) { - *ptrz = (tz)z; - const float tx = Tx0 + x*dtx/ndx, ty = Ty0 + x*dty/ndx; - const tc *col = &texture._atXY((int)(tx/z),(int)(ty/z)); - T *ptrd = ptrd0; - cimg_forC(*this,c) { *ptrd = (T)*col; ptrd+=whd; col+=twh; } - } - } - hatch>>=1; if (!hatch) hatch = ~0U - (~0U>>1); - ptrd0+=offx; ptrz+=offx; - if ((error-=dy)<0) { ptrd0+=offy; ptrz+=offy; error+=dx; } - } else for (int error = dx>>1, x = 0; x<=dx; ++x) { - const tzfloat z = Z0 + x*dz/ndx; - if (z>=(tzfloat)*ptrz) { - *ptrz = (tz)z; - const float tx = Tx0 + x*dtx/ndx, ty = Ty0 + x*dty/ndx; - const tc *col = &texture._atXY((int)(tx/z),(int)(ty/z)); - T *ptrd = ptrd0; - cimg_forC(*this,c) { *ptrd = (T)*col; ptrd+=whd; col+=twh; } - } - ptrd0+=offx; ptrz+=offx; - if ((error-=dy)<0) { ptrd0+=offy; ptrz+=offy; error+=dx; } - } - } else { - const float nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f); - if (~pattern) for (int error = dx>>1, x = 0; x<=dx; ++x) { - if (pattern&hatch) { - const tzfloat z = Z0 + x*dz/ndx; - if (z>=(tzfloat)*ptrz) { - *ptrz = (tz)z; - const float tx = Tx0 + x*dtx/ndx, ty = Ty0 + x*dty/ndx; - const tc *col = &texture._atXY((int)(tx/z),(int)(ty/z)); - T *ptrd = ptrd0; - cimg_forC(*this,c) { *ptrd = (T)(nopacity**col + *ptrd*copacity); ptrd+=whd; col+=twh; } - } - } - hatch>>=1; if (!hatch) hatch = ~0U - (~0U>>1); - ptrd0+=offx; ptrz+=offx; - if ((error-=dy)<0) { ptrd0+=offy; ptrz+=offy; error+=dx; } - } else for (int error = dx>>1, x = 0; x<=dx; ++x) { - const tzfloat z = Z0 + x*dz/ndx; - if (z>=(tzfloat)*ptrz) { - *ptrz = (tz)z; - const float tx = Tx0 + x*dtx/ndx, ty = Ty0 + x*dty/ndx; - const tc *col = &texture._atXY((int)(tx/z),(int)(ty/z)); - T *ptrd = ptrd0; - cimg_forC(*this,c) { *ptrd = (T)(nopacity**col + *ptrd*copacity); ptrd+=whd; col+=twh; } + const ulongT twhd = (ulongT)texture._width*texture._height*texture._depth; + static unsigned int hatch = ~0U - (~0U>>1); + if (init_hatch) hatch = ~0U - (~0U>>1); + cimg_init_scanline(opacity); + + const int + step = y0<=y1?1:-1, hdy01 = dy01*cimg::sign(dx01)/2, + cy0 = cimg::cut(y0,0,h1), cy1 = cimg::cut(y1,0,h1) + step; + dy01+=dy01?0:1; + + for (int y = cy0; y!=cy1; y+=step) { + const int + yy0 = y - y0, + x = x0 + (dx01*yy0 + hdy01)/dy01; + const float + iz = iz0 + diz01*yy0/dy01, + txz = txz0 + dtxz01*yy0/dy01, + tyz = tyz0 + dtyz01*yy0/dy01; + tz *const ptrz = is_horizontal?zbuffer.data(y,x):zbuffer.data(x,y); + + if (x>=0 && x<=w1 && pattern&hatch && iz>=*ptrz) { + *ptrz = (tz)iz; + const int + tx = (int)cimg::round(txz/iz), + ty = (int)cimg::round(tyz/iz); + T *const ptrd = is_horizontal?data(y,x):data(x,y); + const tc *const color = &texture._atXY(tx,ty); + cimg_forC(*this,c) { + const T val = color[c*twhd]; + ptrd[c*_sc_whd] = opacity>=1?val:(T)(val*_sc_nopacity + ptrd[c*_sc_whd]*_sc_copacity); } - ptrd0+=offx; ptrz+=offx; - if ((error-=dy)<0) { ptrd0+=offy; ptrz+=offy; error+=dx; } } + if (!(hatch>>=1)) hatch = ~0U - (~0U>>1); } return *this; } @@ -42435,7 +45266,7 @@ cimg_instance, points._width,points._height,points._depth,points._spectrum,points._data); - case 2 : { + default : { const int x0 = (int)points(0,0), y0 = (int)points(0,1); int ox = x0, oy = y0; for (unsigned int i = 1; i - CImg& draw_spline(const int x0, const int y0, const int z0, const float u0, const float v0, const float w0, - const int x1, const int y1, const int z1, const float u1, const float v1, const float w1, - const tc *const color, const float opacity=1, - const float precision=4, const unsigned int pattern=~0U, - const bool init_hatch=true) { - if (is_empty()) return *this; - if (!color) - throw CImgArgumentException(_cimg_instance - "draw_spline(): Specified color is (null).", - cimg_instance); - if (x0==x1 && y0==y1 && z0==z1) return draw_point(x0,y0,z0,color,opacity); - bool ninit_hatch = init_hatch; - const float - ax = u0 + u1 + 2*(x0 - x1), - bx = 3*(x1 - x0) - 2*u0 - u1, - ay = v0 + v1 + 2*(y0 - y1), - by = 3*(y1 - y0) - 2*v0 - v1, - az = w0 + w1 + 2*(z0 - z1), - bz = 3*(z1 - z0) - 2*w0 - w1, - _precision = 1/(cimg::hypot((float)x0 - x1,(float)y0 - y1)*(precision>0?precision:1)); - int ox = x0, oy = y0, oz = z0; - for (float t = 0; t<1; t+=_precision) { - const float t2 = t*t, t3 = t2*t; - const int - nx = (int)(ax*t3 + bx*t2 + u0*t + x0), - ny = (int)(ay*t3 + by*t2 + v0*t + y0), - nz = (int)(az*t3 + bz*t2 + w0*t + z0); - draw_line(ox,oy,oz,nx,ny,nz,color,opacity,pattern,ninit_hatch); - ninit_hatch = false; - ox = nx; oy = ny; oz = nz; - } - return draw_line(ox,oy,oz,x1,y1,z1,color,opacity,pattern,false); - } - //! Draw a textured 2D spline. /** \param x0 X-coordinate of the starting curve point @@ -42638,7 +45419,8 @@ return draw_spline(x0,y0,u0,v0,x1,y1,u1,v1,+texture,tx0,ty0,tx1,ty1,precision,opacity,pattern,init_hatch); if (x0==x1 && y0==y1) return draw_point(x0,y0,texture.get_vector_at(x0<=0?0:x0>=texture.width()?texture.width() - 1:x0, - y0<=0?0:y0>=texture.height()?texture.height() - 1:y0),opacity); + y0<=0?0:y0>=texture.height()?texture.height() - 1:y0).data(), + opacity); bool ninit_hatch = init_hatch; const float ax = u0 + u1 + 2*(x0 - x1), @@ -42686,7 +45468,7 @@ cimg_instance, points._width,points._height,points._depth,points._spectrum,points._data); - case 2 : { + default : { const int x0 = (int)points(0,0), y0 = (int)points(0,1); const float u0 = (float)tangents(0,0), v0 = (float)tangents(0,1); int ox = x0, oy = y0; @@ -42699,20 +45481,6 @@ ox = x; oy = y; ou = u; ov = v; } if (is_closed_set) draw_spline(ox,oy,ou,ov,x0,y0,u0,v0,color,precision,opacity,pattern,false); - } break; - default : { - const int x0 = (int)points(0,0), y0 = (int)points(0,1), z0 = (int)points(0,2); - const float u0 = (float)tangents(0,0), v0 = (float)tangents(0,1), w0 = (float)tangents(0,2); - int ox = x0, oy = y0, oz = z0; - float ou = u0, ov = v0, ow = w0; - for (unsigned int i = 1; i=0?x0:(x0 - y0*(x2 - x0)/(y2 - y0)), \ - xl = y1>=0?(y0>=0?(y0==y1?x1:x0):(x0 - y0*(x1 - x0)/(y1 - y0))):(x1 - y1*(x2 - x1)/(y2 - y1)), \ - _sxn=1, \ - _sxr=1, \ - _sxl=1, \ - _dxn = x2>x1?x2-x1:(_sxn=-1,x1 - x2), \ - _dxr = x2>x0?x2-x0:(_sxr=-1,x0 - x2), \ - _dxl = x1>x0?x1-x0:(_sxl=-1,x0 - x1), \ - _dyn = y2-y1, \ - _dyr = y2-y0, \ - _dyl = y1-y0, \ - _counter = (_dxn-=_dyn?_dyn*(_dxn/_dyn):0, \ - _dxr-=_dyr?_dyr*(_dxr/_dyr):0, \ - _dxl-=_dyl?_dyl*(_dxl/_dyl):0, \ - std::min((int)(img)._height - y - 1,y2 - y)), \ - _errn = _dyn/2, \ - _errr = _dyr/2, \ - _errl = _dyl/2, \ - _rxn = _dyn?(x2-x1)/_dyn:0, \ - _rxr = _dyr?(x2-x0)/_dyr:0, \ - _rxl = (y0!=y1 && y1>0)?(_dyl?(x1-x0)/_dyl:0): \ - (_errl=_errn, _dxl=_dxn, _dyl=_dyn, _sxl=_sxn, _rxn); \ - _counter>=0; --_counter, ++y, \ - xr+=_rxr+((_errr-=_dxr)<0?_errr+=_dyr,_sxr:0), \ - xl+=(y!=y1)?_rxl+((_errl-=_dxl)<0?(_errl+=_dyl,_sxl):0): \ - (_errl=_errn, _dxl=_dxn, _dyl=_dyn, _sxl=_sxn, _rxl=_rxn, x1-xl)) - -#define _cimg_for_triangle2(img,xl,cl,xr,cr,y,x0,y0,c0,x1,y1,c1,x2,y2,c2) \ - for (int y = y0<0?0:y0, \ - xr = y0>=0?x0:(x0 - y0*(x2 - x0)/(y2 - y0)), \ - cr = y0>=0?c0:(c0 - y0*(c2 - c0)/(y2 - y0)), \ - xl = y1>=0?(y0>=0?(y0==y1?x1:x0):(x0 - y0*(x1 - x0)/(y1 - y0))):(x1 - y1*(x2 - x1)/(y2 - y1)), \ - cl = y1>=0?(y0>=0?(y0==y1?c1:c0):(c0 - y0*(c1 - c0)/(y1 - y0))):(c1 - y1*(c2 - c1)/(y2 - y1)), \ - _sxn=1, _scn=1, \ - _sxr=1, _scr=1, \ - _sxl=1, _scl=1, \ - _dxn = x2>x1?x2-x1:(_sxn=-1,x1 - x2), \ - _dxr = x2>x0?x2-x0:(_sxr=-1,x0 - x2), \ - _dxl = x1>x0?x1-x0:(_sxl=-1,x0 - x1), \ - _dcn = c2>c1?c2-c1:(_scn=-1,c1 - c2), \ - _dcr = c2>c0?c2-c0:(_scr=-1,c0 - c2), \ - _dcl = c1>c0?c1-c0:(_scl=-1,c0 - c1), \ - _dyn = y2-y1, \ - _dyr = y2-y0, \ - _dyl = y1-y0, \ - _counter =(_dxn-=_dyn?_dyn*(_dxn/_dyn):0, \ - _dxr-=_dyr?_dyr*(_dxr/_dyr):0, \ - _dxl-=_dyl?_dyl*(_dxl/_dyl):0, \ - _dcn-=_dyn?_dyn*(_dcn/_dyn):0, \ - _dcr-=_dyr?_dyr*(_dcr/_dyr):0, \ - _dcl-=_dyl?_dyl*(_dcl/_dyl):0, \ - std::min((int)(img)._height - y - 1,y2 - y)), \ - _errn = _dyn/2, _errcn = _errn, \ - _errr = _dyr/2, _errcr = _errr, \ - _errl = _dyl/2, _errcl = _errl, \ - _rxn = _dyn?(x2 - x1)/_dyn:0, \ - _rcn = _dyn?(c2 - c1)/_dyn:0, \ - _rxr = _dyr?(x2 - x0)/_dyr:0, \ - _rcr = _dyr?(c2 - c0)/_dyr:0, \ - _rxl = (y0!=y1 && y1>0)?(_dyl?(x1-x0)/_dyl:0): \ - (_errl=_errn, _dxl=_dxn, _dyl=_dyn, _sxl=_sxn, _rxn), \ - _rcl = (y0!=y1 && y1>0)?(_dyl?(c1-c0)/_dyl:0): \ - (_errcl=_errcn, _dcl=_dcn, _dyl=_dyn, _scl=_scn, _rcn ); \ - _counter>=0; --_counter, ++y, \ - xr+=_rxr+((_errr-=_dxr)<0?_errr+=_dyr,_sxr:0), \ - cr+=_rcr+((_errcr-=_dcr)<0?_errcr+=_dyr,_scr:0), \ - xl+=(y!=y1)?(cl+=_rcl+((_errcl-=_dcl)<0?(_errcl+=_dyl,_scl):0), \ - _rxl+((_errl-=_dxl)<0?(_errl+=_dyl,_sxl):0)): \ - (_errcl=_errcn, _dcl=_dcn, _dyl=_dyn, _scl=_scn, _rcl=_rcn, cl=c1, \ - _errl=_errn, _dxl=_dxn, _dyl=_dyn, _sxl=_sxn, _rxl=_rxn, x1-xl)) - -#define _cimg_for_triangle3(img,xl,txl,tyl,xr,txr,tyr,y,x0,y0,tx0,ty0,x1,y1,tx1,ty1,x2,y2,tx2,ty2) \ - for (int y = y0<0?0:y0, \ - xr = y0>=0?x0:(x0 - y0*(x2 - x0)/(y2 - y0)), \ - txr = y0>=0?tx0:(tx0 - y0*(tx2 - tx0)/(y2 - y0)), \ - tyr = y0>=0?ty0:(ty0 - y0*(ty2 - ty0)/(y2 - y0)), \ - xl = y1>=0?(y0>=0?(y0==y1?x1:x0):(x0 - y0*(x1 - x0)/(y1 - y0))):(x1 - y1*(x2 - x1)/(y2 - y1)), \ - txl = y1>=0?(y0>=0?(y0==y1?tx1:tx0):(tx0 - y0*(tx1 - tx0)/(y1 - y0))):(tx1 - y1*(tx2 - tx1)/(y2 - y1)), \ - tyl = y1>=0?(y0>=0?(y0==y1?ty1:ty0):(ty0 - y0*(ty1 - ty0)/(y1 - y0))):(ty1 - y1*(ty2 - ty1)/(y2 - y1)), \ - _sxn=1, _stxn=1, _styn=1, \ - _sxr=1, _stxr=1, _styr=1, \ - _sxl=1, _stxl=1, _styl=1, \ - _dxn = x2>x1?x2 - x1:(_sxn=-1,x1 - x2), \ - _dxr = x2>x0?x2 - x0:(_sxr=-1,x0 - x2), \ - _dxl = x1>x0?x1 - x0:(_sxl=-1,x0 - x1), \ - _dtxn = tx2>tx1?tx2 - tx1:(_stxn=-1,tx1 - tx2), \ - _dtxr = tx2>tx0?tx2 - tx0:(_stxr=-1,tx0 - tx2), \ - _dtxl = tx1>tx0?tx1 - tx0:(_stxl=-1,tx0 - tx1), \ - _dtyn = ty2>ty1?ty2 - ty1:(_styn=-1,ty1 - ty2), \ - _dtyr = ty2>ty0?ty2 - ty0:(_styr=-1,ty0 - ty2), \ - _dtyl = ty1>ty0?ty1 - ty0:(_styl=-1,ty0 - ty1), \ - _dyn = y2-y1, \ - _dyr = y2-y0, \ - _dyl = y1-y0, \ - _counter =(_dxn-=_dyn?_dyn*(_dxn/_dyn):0, \ - _dxr-=_dyr?_dyr*(_dxr/_dyr):0, \ - _dxl-=_dyl?_dyl*(_dxl/_dyl):0, \ - _dtxn-=_dyn?_dyn*(_dtxn/_dyn):0, \ - _dtxr-=_dyr?_dyr*(_dtxr/_dyr):0, \ - _dtxl-=_dyl?_dyl*(_dtxl/_dyl):0, \ - _dtyn-=_dyn?_dyn*(_dtyn/_dyn):0, \ - _dtyr-=_dyr?_dyr*(_dtyr/_dyr):0, \ - _dtyl-=_dyl?_dyl*(_dtyl/_dyl):0, \ - std::min((int)(img)._height - y - 1,y2 - y)), \ - _errn = _dyn/2, _errtxn = _errn, _errtyn = _errn, \ - _errr = _dyr/2, _errtxr = _errr, _errtyr = _errr, \ - _errl = _dyl/2, _errtxl = _errl, _errtyl = _errl, \ - _rxn = _dyn?(x2 - x1)/_dyn:0, \ - _rtxn = _dyn?(tx2 - tx1)/_dyn:0, \ - _rtyn = _dyn?(ty2 - ty1)/_dyn:0, \ - _rxr = _dyr?(x2 - x0)/_dyr:0, \ - _rtxr = _dyr?(tx2 - tx0)/_dyr:0, \ - _rtyr = _dyr?(ty2 - ty0)/_dyr:0, \ - _rxl = (y0!=y1 && y1>0)?(_dyl?(x1 - x0)/_dyl:0): \ - (_errl=_errn, _dxl=_dxn, _dyl=_dyn, _sxl=_sxn, _rxn), \ - _rtxl = (y0!=y1 && y1>0)?(_dyl?(tx1 - tx0)/_dyl:0): \ - (_errtxl=_errtxn, _dtxl=_dtxn, _dyl=_dyn, _stxl=_stxn, _rtxn ), \ - _rtyl = (y0!=y1 && y1>0)?(_dyl?(ty1 - ty0)/_dyl:0): \ - (_errtyl=_errtyn, _dtyl=_dtyn, _dyl=_dyn, _styl=_styn, _rtyn ); \ - _counter>=0; --_counter, ++y, \ - xr+=_rxr+((_errr-=_dxr)<0?_errr+=_dyr,_sxr:0), \ - txr+=_rtxr+((_errtxr-=_dtxr)<0?_errtxr+=_dyr,_stxr:0), \ - tyr+=_rtyr+((_errtyr-=_dtyr)<0?_errtyr+=_dyr,_styr:0), \ - xl+=(y!=y1)?(txl+=_rtxl+((_errtxl-=_dtxl)<0?(_errtxl+=_dyl,_stxl):0), \ - tyl+=_rtyl+((_errtyl-=_dtyl)<0?(_errtyl+=_dyl,_styl):0), \ - _rxl+((_errl-=_dxl)<0?(_errl+=_dyl,_sxl):0)): \ - (_errtxl=_errtxn, _dtxl=_dtxn, _dyl=_dyn, _stxl=_stxn, _rtxl=_rtxn, txl=tx1, \ - _errtyl=_errtyn, _dtyl=_dtyn, _dyl=_dyn, _styl=_styn, _rtyl=_rtyn, tyl=ty1,\ - _errl=_errn, _dxl=_dxn, _dyl=_dyn, _sxl=_sxn, _rxl=_rxn, x1 - xl)) - -#define _cimg_for_triangle4(img,xl,cl,txl,tyl,xr,cr,txr,tyr,y,x0,y0,c0,tx0,ty0,x1,y1,c1,tx1,ty1,x2,y2,c2,tx2,ty2) \ - for (int y = y0<0?0:y0, \ - xr = y0>=0?x0:(x0 - y0*(x2 - x0)/(y2 - y0)), \ - cr = y0>=0?c0:(c0 - y0*(c2 - c0)/(y2 - y0)), \ - txr = y0>=0?tx0:(tx0 - y0*(tx2 - tx0)/(y2 - y0)), \ - tyr = y0>=0?ty0:(ty0 - y0*(ty2 - ty0)/(y2 - y0)), \ - xl = y1>=0?(y0>=0?(y0==y1?x1:x0):(x0 - y0*(x1 - x0)/(y1 - y0))):(x1 - y1*(x2 - x1)/(y2 - y1)), \ - cl = y1>=0?(y0>=0?(y0==y1?c1:c0):(c0 - y0*(c1 - c0)/(y1 - y0))):(c1 - y1*(c2 - c1)/(y2 - y1)), \ - txl = y1>=0?(y0>=0?(y0==y1?tx1:tx0):(tx0 - y0*(tx1 - tx0)/(y1 - y0))):(tx1 - y1*(tx2 - tx1)/(y2 - y1)), \ - tyl = y1>=0?(y0>=0?(y0==y1?ty1:ty0):(ty0 - y0*(ty1 - ty0)/(y1 - y0))):(ty1 - y1*(ty2 - ty1)/(y2 - y1)), \ - _sxn=1, _scn=1, _stxn=1, _styn=1, \ - _sxr=1, _scr=1, _stxr=1, _styr=1, \ - _sxl=1, _scl=1, _stxl=1, _styl=1, \ - _dxn = x2>x1?x2 - x1:(_sxn=-1,x1 - x2), \ - _dxr = x2>x0?x2 - x0:(_sxr=-1,x0 - x2), \ - _dxl = x1>x0?x1 - x0:(_sxl=-1,x0 - x1), \ - _dcn = c2>c1?c2 - c1:(_scn=-1,c1 - c2), \ - _dcr = c2>c0?c2 - c0:(_scr=-1,c0 - c2), \ - _dcl = c1>c0?c1 - c0:(_scl=-1,c0 - c1), \ - _dtxn = tx2>tx1?tx2 - tx1:(_stxn=-1,tx1 - tx2), \ - _dtxr = tx2>tx0?tx2 - tx0:(_stxr=-1,tx0 - tx2), \ - _dtxl = tx1>tx0?tx1 - tx0:(_stxl=-1,tx0 - tx1), \ - _dtyn = ty2>ty1?ty2 - ty1:(_styn=-1,ty1 - ty2), \ - _dtyr = ty2>ty0?ty2 - ty0:(_styr=-1,ty0 - ty2), \ - _dtyl = ty1>ty0?ty1 - ty0:(_styl=-1,ty0 - ty1), \ - _dyn = y2 - y1, \ - _dyr = y2 - y0, \ - _dyl = y1 - y0, \ - _counter =(_dxn-=_dyn?_dyn*(_dxn/_dyn):0, \ - _dxr-=_dyr?_dyr*(_dxr/_dyr):0, \ - _dxl-=_dyl?_dyl*(_dxl/_dyl):0, \ - _dcn-=_dyn?_dyn*(_dcn/_dyn):0, \ - _dcr-=_dyr?_dyr*(_dcr/_dyr):0, \ - _dcl-=_dyl?_dyl*(_dcl/_dyl):0, \ - _dtxn-=_dyn?_dyn*(_dtxn/_dyn):0, \ - _dtxr-=_dyr?_dyr*(_dtxr/_dyr):0, \ - _dtxl-=_dyl?_dyl*(_dtxl/_dyl):0, \ - _dtyn-=_dyn?_dyn*(_dtyn/_dyn):0, \ - _dtyr-=_dyr?_dyr*(_dtyr/_dyr):0, \ - _dtyl-=_dyl?_dyl*(_dtyl/_dyl):0, \ - std::min((int)(img)._height - y - 1,y2 - y)), \ - _errn = _dyn/2, _errcn = _errn, _errtxn = _errn, _errtyn = _errn, \ - _errr = _dyr/2, _errcr = _errr, _errtxr = _errr, _errtyr = _errr, \ - _errl = _dyl/2, _errcl = _errl, _errtxl = _errl, _errtyl = _errl, \ - _rxn = _dyn?(x2 - x1)/_dyn:0, \ - _rcn = _dyn?(c2 - c1)/_dyn:0, \ - _rtxn = _dyn?(tx2 - tx1)/_dyn:0, \ - _rtyn = _dyn?(ty2 - ty1)/_dyn:0, \ - _rxr = _dyr?(x2 - x0)/_dyr:0, \ - _rcr = _dyr?(c2 - c0)/_dyr:0, \ - _rtxr = _dyr?(tx2 - tx0)/_dyr:0, \ - _rtyr = _dyr?(ty2 - ty0)/_dyr:0, \ - _rxl = (y0!=y1 && y1>0)?(_dyl?(x1 - x0)/_dyl:0): \ - (_errl=_errn, _dxl=_dxn, _dyl=_dyn, _sxl=_sxn, _rxn), \ - _rcl = (y0!=y1 && y1>0)?(_dyl?(c1 - c0)/_dyl:0): \ - (_errcl=_errcn, _dcl=_dcn, _dyl=_dyn, _scl=_scn, _rcn ), \ - _rtxl = (y0!=y1 && y1>0)?(_dyl?(tx1 - tx0)/_dyl:0): \ - (_errtxl=_errtxn, _dtxl=_dtxn, _dyl=_dyn, _stxl=_stxn, _rtxn ), \ - _rtyl = (y0!=y1 && y1>0)?(_dyl?(ty1 - ty0)/_dyl:0): \ - (_errtyl=_errtyn, _dtyl=_dtyn, _dyl=_dyn, _styl=_styn, _rtyn ); \ - _counter>=0; --_counter, ++y, \ - xr+=_rxr+((_errr-=_dxr)<0?_errr+=_dyr,_sxr:0), \ - cr+=_rcr+((_errcr-=_dcr)<0?_errcr+=_dyr,_scr:0), \ - txr+=_rtxr+((_errtxr-=_dtxr)<0?_errtxr+=_dyr,_stxr:0), \ - tyr+=_rtyr+((_errtyr-=_dtyr)<0?_errtyr+=_dyr,_styr:0), \ - xl+=(y!=y1)?(cl+=_rcl+((_errcl-=_dcl)<0?(_errcl+=_dyl,_scl):0), \ - txl+=_rtxl+((_errtxl-=_dtxl)<0?(_errtxl+=_dyl,_stxl):0), \ - tyl+=_rtyl+((_errtyl-=_dtyl)<0?(_errtyl+=_dyl,_styl):0), \ - _rxl+((_errl-=_dxl)<0?(_errl+=_dyl,_sxl):0)): \ - (_errcl=_errcn, _dcl=_dcn, _dyl=_dyn, _scl=_scn, _rcl=_rcn, cl=c1, \ - _errtxl=_errtxn, _dtxl=_dtxn, _dyl=_dyn, _stxl=_stxn, _rtxl=_rtxn, txl=tx1, \ - _errtyl=_errtyn, _dtyl=_dtyn, _dyl=_dyn, _styl=_styn, _rtyl=_rtyn, tyl=ty1, \ - _errl=_errn, _dxl=_dxn, _dyl=_dyn, _sxl=_sxn, _rxl=_rxn, x1 - xl)) - -#define _cimg_for_triangle5(img,xl,txl,tyl,lxl,lyl,xr,txr,tyr,lxr,lyr,y,x0,y0,\ - tx0,ty0,lx0,ly0,x1,y1,tx1,ty1,lx1,ly1,x2,y2,tx2,ty2,lx2,ly2) \ - for (int y = y0<0?0:y0, \ - xr = y0>=0?x0:(x0 - y0*(x2 - x0)/(y2 - y0)), \ - txr = y0>=0?tx0:(tx0 - y0*(tx2 - tx0)/(y2 - y0)), \ - tyr = y0>=0?ty0:(ty0 - y0*(ty2 - ty0)/(y2 - y0)), \ - lxr = y0>=0?lx0:(lx0 - y0*(lx2 - lx0)/(y2 - y0)), \ - lyr = y0>=0?ly0:(ly0 - y0*(ly2 - ly0)/(y2 - y0)), \ - xl = y1>=0?(y0>=0?(y0==y1?x1:x0):(x0 - y0*(x1 - x0)/(y1 - y0))):(x1 - y1*(x2 - x1)/(y2 - y1)), \ - txl = y1>=0?(y0>=0?(y0==y1?tx1:tx0):(tx0 - y0*(tx1 - tx0)/(y1 - y0))):(tx1 - y1*(tx2 - tx1)/(y2 - y1)), \ - tyl = y1>=0?(y0>=0?(y0==y1?ty1:ty0):(ty0 - y0*(ty1 - ty0)/(y1 - y0))):(ty1 - y1*(ty2 - ty1)/(y2 - y1)), \ - lxl = y1>=0?(y0>=0?(y0==y1?lx1:lx0):(lx0 - y0*(lx1 - lx0)/(y1 - y0))):(lx1 - y1*(lx2 - lx1)/(y2 - y1)), \ - lyl = y1>=0?(y0>=0?(y0==y1?ly1:ly0):(ly0 - y0*(ly1 - ly0)/(y1 - y0))):(ly1 - y1*(ly2 - ly1)/(y2 - y1)), \ - _sxn=1, _stxn=1, _styn=1, _slxn=1, _slyn=1, \ - _sxr=1, _stxr=1, _styr=1, _slxr=1, _slyr=1, \ - _sxl=1, _stxl=1, _styl=1, _slxl=1, _slyl=1, \ - _dxn = x2>x1?x2 - x1:(_sxn=-1,x1 - x2), _dyn = y2 - y1, \ - _dxr = x2>x0?x2 - x0:(_sxr=-1,x0 - x2), _dyr = y2 - y0, \ - _dxl = x1>x0?x1 - x0:(_sxl=-1,x0 - x1), _dyl = y1 - y0, \ - _dtxn = tx2>tx1?tx2 - tx1:(_stxn=-1,tx1 - tx2), \ - _dtxr = tx2>tx0?tx2 - tx0:(_stxr=-1,tx0 - tx2), \ - _dtxl = tx1>tx0?tx1 - tx0:(_stxl=-1,tx0 - tx1), \ - _dtyn = ty2>ty1?ty2 - ty1:(_styn=-1,ty1 - ty2), \ - _dtyr = ty2>ty0?ty2 - ty0:(_styr=-1,ty0 - ty2), \ - _dtyl = ty1>ty0?ty1 - ty0:(_styl=-1,ty0 - ty1), \ - _dlxn = lx2>lx1?lx2 - lx1:(_slxn=-1,lx1 - lx2), \ - _dlxr = lx2>lx0?lx2 - lx0:(_slxr=-1,lx0 - lx2), \ - _dlxl = lx1>lx0?lx1 - lx0:(_slxl=-1,lx0 - lx1), \ - _dlyn = ly2>ly1?ly2 - ly1:(_slyn=-1,ly1 - ly2), \ - _dlyr = ly2>ly0?ly2 - ly0:(_slyr=-1,ly0 - ly2), \ - _dlyl = ly1>ly0?ly1 - ly0:(_slyl=-1,ly0 - ly1), \ - _counter =(_dxn-=_dyn?_dyn*(_dxn/_dyn):0, \ - _dxr-=_dyr?_dyr*(_dxr/_dyr):0, \ - _dxl-=_dyl?_dyl*(_dxl/_dyl):0, \ - _dtxn-=_dyn?_dyn*(_dtxn/_dyn):0, \ - _dtxr-=_dyr?_dyr*(_dtxr/_dyr):0, \ - _dtxl-=_dyl?_dyl*(_dtxl/_dyl):0, \ - _dtyn-=_dyn?_dyn*(_dtyn/_dyn):0, \ - _dtyr-=_dyr?_dyr*(_dtyr/_dyr):0, \ - _dtyl-=_dyl?_dyl*(_dtyl/_dyl):0, \ - _dlxn-=_dyn?_dyn*(_dlxn/_dyn):0, \ - _dlxr-=_dyr?_dyr*(_dlxr/_dyr):0, \ - _dlxl-=_dyl?_dyl*(_dlxl/_dyl):0, \ - _dlyn-=_dyn?_dyn*(_dlyn/_dyn):0, \ - _dlyr-=_dyr?_dyr*(_dlyr/_dyr):0, \ - _dlyl-=_dyl?_dyl*(_dlyl/_dyl):0, \ - std::min((int)(img)._height - y - 1,y2 - y)), \ - _errn = _dyn/2, _errtxn = _errn, _errtyn = _errn, _errlxn = _errn, _errlyn = _errn, \ - _errr = _dyr/2, _errtxr = _errr, _errtyr = _errr, _errlxr = _errr, _errlyr = _errr, \ - _errl = _dyl/2, _errtxl = _errl, _errtyl = _errl, _errlxl = _errl, _errlyl = _errl, \ - _rxn = _dyn?(x2 - x1)/_dyn:0, \ - _rtxn = _dyn?(tx2 - tx1)/_dyn:0, \ - _rtyn = _dyn?(ty2 - ty1)/_dyn:0, \ - _rlxn = _dyn?(lx2 - lx1)/_dyn:0, \ - _rlyn = _dyn?(ly2 - ly1)/_dyn:0, \ - _rxr = _dyr?(x2 - x0)/_dyr:0, \ - _rtxr = _dyr?(tx2 - tx0)/_dyr:0, \ - _rtyr = _dyr?(ty2 - ty0)/_dyr:0, \ - _rlxr = _dyr?(lx2 - lx0)/_dyr:0, \ - _rlyr = _dyr?(ly2 - ly0)/_dyr:0, \ - _rxl = (y0!=y1 && y1>0)?(_dyl?(x1 - x0)/_dyl:0): \ - (_errl=_errn, _dxl=_dxn, _dyl=_dyn, _sxl=_sxn, _rxn), \ - _rtxl = (y0!=y1 && y1>0)?(_dyl?(tx1 - tx0)/_dyl:0): \ - (_errtxl=_errtxn, _dtxl=_dtxn, _dyl=_dyn, _stxl=_stxn, _rtxn ), \ - _rtyl = (y0!=y1 && y1>0)?(_dyl?(ty1 - ty0)/_dyl:0): \ - (_errtyl=_errtyn, _dtyl=_dtyn, _dyl=_dyn, _styl=_styn, _rtyn ), \ - _rlxl = (y0!=y1 && y1>0)?(_dyl?(lx1 - lx0)/_dyl:0): \ - (_errlxl=_errlxn, _dlxl=_dlxn, _dyl=_dyn, _slxl=_slxn, _rlxn ), \ - _rlyl = (y0!=y1 && y1>0)?(_dyl?(ly1 - ly0)/_dyl:0): \ - (_errlyl=_errlyn, _dlyl=_dlyn, _dyl=_dyn, _slyl=_slyn, _rlyn ); \ - _counter>=0; --_counter, ++y, \ - xr+=_rxr+((_errr-=_dxr)<0?_errr+=_dyr,_sxr:0), \ - txr+=_rtxr+((_errtxr-=_dtxr)<0?_errtxr+=_dyr,_stxr:0), \ - tyr+=_rtyr+((_errtyr-=_dtyr)<0?_errtyr+=_dyr,_styr:0), \ - lxr+=_rlxr+((_errlxr-=_dlxr)<0?_errlxr+=_dyr,_slxr:0), \ - lyr+=_rlyr+((_errlyr-=_dlyr)<0?_errlyr+=_dyr,_slyr:0), \ - xl+=(y!=y1)?(txl+=_rtxl+((_errtxl-=_dtxl)<0?(_errtxl+=_dyl,_stxl):0), \ - tyl+=_rtyl+((_errtyl-=_dtyl)<0?(_errtyl+=_dyl,_styl):0), \ - lxl+=_rlxl+((_errlxl-=_dlxl)<0?(_errlxl+=_dyl,_slxl):0), \ - lyl+=_rlyl+((_errlyl-=_dlyl)<0?(_errlyl+=_dyl,_slyl):0), \ - _rxl+((_errl-=_dxl)<0?(_errl+=_dyl,_sxl):0)): \ - (_errtxl=_errtxn, _dtxl=_dtxn, _dyl=_dyn, _stxl=_stxn, _rtxl=_rtxn, txl=tx1, \ - _errtyl=_errtyn, _dtyl=_dtyn, _dyl=_dyn, _styl=_styn, _rtyl=_rtyn, tyl=ty1, \ - _errlxl=_errlxn, _dlxl=_dlxn, _dyl=_dyn, _slxl=_slxn, _rlxl=_rlxn, lxl=lx1, \ - _errlyl=_errlyn, _dlyl=_dlyn, _dyl=_dyn, _slyl=_slyn, _rlyl=_rlyn, lyl=ly1, \ - _errl=_errn, _dxl=_dxn, _dyl=_dyn, _sxl=_sxn, _rxl=_rxn, x1 - xl)) - // [internal] Draw a filled triangle. template - CImg& _draw_triangle(const int x0, const int y0, - const int x1, const int y1, - const int x2, const int y2, + CImg& _draw_triangle(int x0, int y0, + int x1, int y1, + int x2, int y2, const tc *const color, const float opacity, const float brightness) { - cimg_init_scanline(color,opacity); - const float nbrightness = cimg::cut(brightness,0,2); - int nx0 = x0, ny0 = y0, nx1 = x1, ny1 = y1, nx2 = x2, ny2 = y2; - if (ny0>ny1) cimg::swap(nx0,nx1,ny0,ny1); - if (ny0>ny2) cimg::swap(nx0,nx2,ny0,ny2); - if (ny1>ny2) cimg::swap(nx1,nx2,ny1,ny2); - if (ny0=0) { - if ((nx1 - nx0)*(ny2 - ny0) - (nx2 - nx0)*(ny1 - ny0)<0) - _cimg_for_triangle1(*this,xl,xr,y,nx0,ny0,nx1,ny1,nx2,ny2) - cimg_draw_scanline(xl,xr,y,color,opacity,nbrightness); - else - _cimg_for_triangle1(*this,xl,xr,y,nx0,ny0,nx1,ny1,nx2,ny2) - cimg_draw_scanline(xr,xl,y,color,opacity,nbrightness); + if (y0>y1) cimg::swap(x0,x1,y0,y1); + if (y0>y2) cimg::swap(x0,x2,y0,y2); + if (y1>y2) cimg::swap(x1,x2,y1,y2); + if (y2<0 || y0>=height() || cimg::min(x0,x1,x2)>=width() || cimg::max(x0,x1,x2)<0 || !opacity) return *this; + + const int + h1 = height() - 1, + dx01 = x1 - x0, dx02 = x2 - x0, dx12 = x2 - x1, + dy01 = std::max(1,y1 - y0), dy02 = std::max(1,y2 - y0), dy12 = std::max(1,y2 - y1), + cy0 = cimg::cut(y0,0,h1), cy2 = cimg::cut(y2,0,h1), + hdy01 = dy01*cimg::sign(dx01)/2, hdy02 = dy02*cimg::sign(dx02)/2, hdy12 = dy12*cimg::sign(dx12)/2; + + const float cbs = cimg::cut(brightness,0,2); + cimg_init_scanline(opacity); + + for (int y = cy0; y<=cy2; ++y) { + const int yy0 = y - y0, yy1 = y - y1; + int + xm = yxM) cimg::swap(xm,xM); + cimg_draw_scanline(xm,xM,y,color,opacity,cbs); } return *this; } @@ -43190,12 +45673,11 @@ **/ template CImg& draw_triangle(CImg& zbuffer, - const int x0, const int y0, const float z0, - const int x1, const int y1, const float z1, - const int x2, const int y2, const float z2, + int x0, int y0, const float z0, + int x1, int y1, const float z1, + int x2, int y2, const float z2, const tc *const color, const float opacity=1, const float brightness=1) { - typedef typename cimg::superset::type tzfloat; if (is_empty() || z0<=0 || z1<=0 || z2<=0) return *this; if (!color) throw CImgArgumentException(_cimg_instance @@ -43207,90 +45689,55 @@ "different dimensions.", cimg_instance, zbuffer._width,zbuffer._height,zbuffer._depth,zbuffer._spectrum,zbuffer._data); - static const T maxval = (T)std::min(cimg::type::max(),(T)cimg::type::max()); - const float - nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f), - nbrightness = cimg::cut(brightness,0,2); - const longT whd = (longT)width()*height()*depth(), offx = spectrum()*whd; - int nx0 = x0, ny0 = y0, nx1 = x1, ny1 = y1, nx2 = x2, ny2 = y2; - tzfloat nz0 = 1/(tzfloat)z0, nz1 = 1/(tzfloat)z1, nz2 = 1/(tzfloat)z2; - if (ny0>ny1) cimg::swap(nx0,nx1,ny0,ny1,nz0,nz1); - if (ny0>ny2) cimg::swap(nx0,nx2,ny0,ny2,nz0,nz2); - if (ny1>ny2) cimg::swap(nx1,nx2,ny1,ny2,nz1,nz2); - if (ny0>=height() || ny2<0) return *this; - tzfloat - pzl = (nz1 - nz0)/(ny1 - ny0), - pzr = (nz2 - nz0)/(ny2 - ny0), - pzn = (nz2 - nz1)/(ny2 - ny1), - zr = ny0>=0?nz0:(nz0 - ny0*(nz2 - nz0)/(ny2 - ny0)), - zl = ny1>=0?(ny0>=0?nz0:(nz0 - ny0*(nz1 - nz0)/(ny1 - ny0))):(pzl=pzn,(nz1 - ny1*(nz2 - nz1)/(ny2 - ny1))); - _cimg_for_triangle1(*this,xleft0,xright0,y,nx0,ny0,nx1,ny1,nx2,ny2) { - if (y==ny1) { zl = nz1; pzl = pzn; } - int xleft = xleft0, xright = xright0; - tzfloat zleft = zl, zright = zr; - if (xright=width() - 1) xright = width() - 1; - T* ptrd = data(xleft,y,0,0); - tz *ptrz = xleft<=xright?zbuffer.data(xleft,y):0; - if (opacity>=1) { - if (nbrightness==1) for (int x = xleft; x<=xright; ++x, ++ptrz, ++ptrd) { - if (zleft>=(tzfloat)*ptrz) { - *ptrz = (tz)zleft; - const tc *col = color; cimg_forC(*this,c) { *ptrd = (T)*(col++); ptrd+=whd; } - ptrd-=offx; - } - zleft+=pentez; - } else if (nbrightness<1) for (int x = xleft; x<=xright; ++x, ++ptrz, ++ptrd) { - if (zleft>=(tzfloat)*ptrz) { - *ptrz = (tz)zleft; - const tc *col = color; cimg_forC(*this,c) { *ptrd = (T)(nbrightness*(*col++)); ptrd+=whd; } - ptrd-=offx; - } - zleft+=pentez; - } else for (int x = xleft; x<=xright; ++x, ++ptrz, ++ptrd) { - if (zleft>=(tzfloat)*ptrz) { - *ptrz = (tz)zleft; - const tc *col = color; - cimg_forC(*this,c) { *ptrd = (T)((2 - nbrightness)**(col++) + (nbrightness - 1)*maxval); ptrd+=whd; } - ptrd-=offx; - } - zleft+=pentez; - } - } else { - if (nbrightness==1) for (int x = xleft; x<=xright; ++x, ++ptrz, ++ptrd) { - if (zleft>=(tzfloat)*ptrz) { - *ptrz = (tz)zleft; - const tc *col = color; cimg_forC(*this,c) { *ptrd = (T)(nopacity**(col++) + *ptrd*copacity); ptrd+=whd; } - ptrd-=offx; - } - zleft+=pentez; - } else if (nbrightness<1) for (int x = xleft; x<=xright; ++x, ++ptrz, ++ptrd) { - if (zleft>=(tzfloat)*ptrz) { - *ptrz = (tz)zleft; - const tc *col = color; - cimg_forC(*this,c) { *ptrd = (T)(nopacity*nbrightness**(col++) + *ptrd*copacity); ptrd+=whd; } - ptrd-=offx; - } - zleft+=pentez; - } else for (int x = xleft; x<=xright; ++x, ++ptrz, ++ptrd) { - if (zleft>=(tzfloat)*ptrz) { - *ptrz = (tz)zleft; - const tc *col = color; + + float iz0 = 1/z0, iz1 = 1/z1, iz2 = 1/z2; + if (y0>y1) cimg::swap(x0,x1,y0,y1,iz0,iz1); + if (y0>y2) cimg::swap(x0,x2,y0,y2,iz0,iz2); + if (y1>y2) cimg::swap(x1,x2,y1,y2,iz1,iz2); + if (y2<0 || y0>=height() || cimg::min(x0,x1,x2)>=width() || cimg::max(x0,x1,x2)<0 || !opacity) return *this; + + const int + w1 = width() - 1, h1 = height() - 1, + dx01 = x1 - x0, dx02 = x2 - x0, dx12 = x2 - x1, + dy01 = std::max(1,y1 - y0), dy02 = std::max(1,y2 - y0), dy12 = std::max(1,y2 - y1), + cy0 = cimg::cut(y0,0,h1), cy2 = cimg::cut(y2,0,h1), + hdy01 = dy01*cimg::sign(dx01)/2, hdy02 = dy02*cimg::sign(dx02)/2, hdy12 = dy12*cimg::sign(dx12)/2; + const float diz01 = iz1 - iz0, diz02 = iz2 - iz0, diz12 = iz2 - iz1; + + const float cbs = cimg::cut(brightness,0,2); + cimg_init_scanline(opacity); + + for (int y = cy0; y<=cy2; ++y) { + const int yy0 = y - y0, yy1 = y - y1; + int + xm = yxM) cimg::swap(xm,xM,izm,izM); + if (xM>=0 || xm<=w1) { + const int + cxm = cimg::cut(xm,0,w1), + cxM = cimg::cut(xM,0,w1); + T *ptrd = data(cxm,y); + tz *ptrz = zbuffer.data(cxm,y); + const int dxmM = std::max(1,xM - xm); + const float dizmM = izM - izm; + + for (int x = cxm; x=*ptrz) { + *ptrz = (tz)iz; cimg_forC(*this,c) { - const T val = (T)((2 - nbrightness)**(col++) + (nbrightness - 1)*maxval); - *ptrd = (T)(nopacity*val + *ptrd*copacity); - ptrd+=whd; + const Tfloat val = cbs<=1?color[c]*cbs:(2 - cbs)*color[c] + (cbs - 1)*_sc_maxval; + ptrd[c*_sc_whd] = (T)(opacity>=1?val:val*_sc_nopacity + ptrd[c*_sc_whd]*_sc_copacity); } - ptrd-=offx; } - zleft+=pentez; + ++ptrd; ++ptrz; } } - zr+=pzr; zl+=pzl; } return *this; } @@ -43304,67 +45751,67 @@ \param x2 X-coordinate of the third vertex in the image instance. \param y2 Y-coordinate of the third vertex in the image instance. \param color Pointer to \c spectrum() consecutive values, defining the drawing color. - \param brightness0 Brightness factor of the first vertex (in [0,2]). - \param brightness1 brightness factor of the second vertex (in [0,2]). - \param brightness2 brightness factor of the third vertex (in [0,2]). + \param bs0 Brightness factor of the first vertex (in [0,2]). + \param bs1 brightness factor of the second vertex (in [0,2]). + \param bs2 brightness factor of the third vertex (in [0,2]). \param opacity Drawing opacity. **/ template - CImg& draw_triangle(const int x0, const int y0, - const int x1, const int y1, - const int x2, const int y2, + CImg& draw_triangle(int x0, int y0, + int x1, int y1, + int x2, int y2, const tc *const color, - const float brightness0, - const float brightness1, - const float brightness2, + float bs0, + float bs1, + float bs2, const float opacity=1) { if (is_empty()) return *this; if (!color) throw CImgArgumentException(_cimg_instance "draw_triangle(): Specified color is (null).", cimg_instance); - static const T maxval = (T)std::min(cimg::type::max(),(T)cimg::type::max()); - const float nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f); - const longT whd = (longT)width()*height()*depth(), offx = spectrum()*whd - 1; - int nx0 = x0, ny0 = y0, nx1 = x1, ny1 = y1, nx2 = x2, ny2 = y2, - nc0 = (int)((brightness0<0.f?0.f:(brightness0>2.f?2.f:brightness0))*256.f), - nc1 = (int)((brightness1<0.f?0.f:(brightness1>2.f?2.f:brightness1))*256.f), - nc2 = (int)((brightness2<0.f?0.f:(brightness2>2.f?2.f:brightness2))*256.f); - if (ny0>ny1) cimg::swap(nx0,nx1,ny0,ny1,nc0,nc1); - if (ny0>ny2) cimg::swap(nx0,nx2,ny0,ny2,nc0,nc2); - if (ny1>ny2) cimg::swap(nx1,nx2,ny1,ny2,nc1,nc2); - if (ny0>=height() || ny2<0) return *this; - _cimg_for_triangle2(*this,xleft0,cleft0,xright0,cright0,y,nx0,ny0,nc0,nx1,ny1,nc1,nx2,ny2,nc2) { - int xleft = xleft0, xright = xright0, cleft = cleft0, cright = cright0; - if (xrightcleft?cright - cleft:cleft - cright, - rc = dx?(cright - cleft)/dx:0, - sc = cright>cleft?1:-1, - ndc = dc - (dx?dx*(dc/dx):0); - int errc = dx>>1; - if (xleft<0 && dx) cleft-=xleft*(cright - cleft)/dx; - if (xleft<0) xleft = 0; - if (xright>=width() - 1) xright = width() - 1; - T* ptrd = data(xleft,y); - if (opacity>=1) for (int x = xleft; x<=xright; ++x) { - const tc *col = color; - cimg_forC(*this,c) { - *ptrd = (T)(cleft<256?cleft**(col++)/256:((512 - cleft)**(col++)+(cleft - 256)*maxval)/256); - ptrd+=whd; - } - ptrd-=offx; - cleft+=rc+((errc-=ndc)<0?errc+=dx,sc:0); - } else for (int x = xleft; x<=xright; ++x) { - const tc *col = color; - cimg_forC(*this,c) { - const T val = (T)(cleft<256?cleft**(col++)/256:((512 - cleft)**(col++)+(cleft - 256)*maxval)/256); - *ptrd = (T)(nopacity*val + *ptrd*copacity); - ptrd+=whd; + + if (y0>y1) cimg::swap(x0,x1,y0,y1,bs0,bs1); + if (y0>y2) cimg::swap(x0,x2,y0,y2,bs0,bs2); + if (y1>y2) cimg::swap(x1,x2,y1,y2,bs1,bs2); + if (y2<0 || y0>=height() || cimg::min(x0,x1,x2)>=width() || cimg::max(x0,x1,x2)<0 || !opacity) return *this; + + const int + w1 = width() - 1, h1 = height() - 1, + dx01 = x1 - x0, dx02 = x2 - x0, dx12 = x2 - x1, + dy01 = std::max(1,y1 - y0), dy02 = std::max(1,y2 - y0), dy12 = std::max(1,y2 - y1), + cy0 = cimg::cut(y0,0,h1), cy2 = cimg::cut(y2,0,h1), + hdy01 = dy01*cimg::sign(dx01)/2, hdy02 = dy02*cimg::sign(dx02)/2, hdy12 = dy12*cimg::sign(dx12)/2; + const float dbs01 = bs1 - bs0, dbs02 = bs2 - bs0, dbs12 = bs2 - bs1; + + cimg_init_scanline(opacity); + + for (int y = cy0; y<=cy2; ++y) { + const int yy0 = y - y0, yy1 = y - y1; + int + xm = yxM) cimg::swap(xm,xM,bsm,bsM); + if (xM>=0 || xm<=w1) { + const int + cxm = cimg::cut(xm,0,w1), + cxM = cimg::cut(xM,0,w1); + T *ptrd = data(cxm,y); + const int dxmM = std::max(1,xM - xm); + const float dbsmM = bsM - bsm; + + for (int x = cxm; x<=cxM; ++x) { + const int xxm = x - xm; + const float cbs = cimg::cut(bsm + dbsmM*xxm/dxmM,0,2); + cimg_forC(*this,c) { + const Tfloat val = cbs<=1?color[c]*cbs:(2 - cbs)*color[c] + (cbs - 1)*_sc_maxval; + ptrd[c*_sc_whd] = (T)(opacity>=1?val:val*_sc_nopacity + ptrd[c*_sc_whd]*_sc_copacity); + } + ++ptrd; } - ptrd-=offx; - cleft+=rc+((errc-=ndc)<0?errc+=dx,sc:0); } } return *this; @@ -43373,15 +45820,14 @@ //! Draw a Gouraud-shaded 2D triangle, with z-buffering \overloading. template CImg& draw_triangle(CImg& zbuffer, - const int x0, const int y0, const float z0, - const int x1, const int y1, const float z1, - const int x2, const int y2, const float z2, + int x0, int y0, const float z0, + int x1, int y1, const float z1, + int x2, int y2, const float z2, const tc *const color, - const float brightness0, - const float brightness1, - const float brightness2, - const float opacity=1) { - typedef typename cimg::superset::type tzfloat; + float bs0, + float bs1, + float bs2, + float opacity=1) { if (is_empty() || z0<=0 || z1<=0 || z2<=0) return *this; if (!color) throw CImgArgumentException(_cimg_instance @@ -43393,72 +45839,59 @@ "different dimensions.", cimg_instance, zbuffer._width,zbuffer._height,zbuffer._depth,zbuffer._spectrum,zbuffer._data); - static const T maxval = (T)std::min(cimg::type::max(),(T)cimg::type::max()); - const float nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f); - const longT whd = (longT)width()*height()*depth(), offx = spectrum()*whd; - int nx0 = x0, ny0 = y0, nx1 = x1, ny1 = y1, nx2 = x2, ny2 = y2, - nc0 = (int)((brightness0<0.f?0.f:(brightness0>2.f?2.f:brightness0))*256.f), - nc1 = (int)((brightness1<0.f?0.f:(brightness1>2.f?2.f:brightness1))*256.f), - nc2 = (int)((brightness2<0.f?0.f:(brightness2>2.f?2.f:brightness2))*256.f); - tzfloat nz0 = 1/(tzfloat)z0, nz1 = 1/(tzfloat)z1, nz2 = 1/(tzfloat)z2; - if (ny0>ny1) cimg::swap(nx0,nx1,ny0,ny1,nz0,nz1,nc0,nc1); - if (ny0>ny2) cimg::swap(nx0,nx2,ny0,ny2,nz0,nz2,nc0,nc2); - if (ny1>ny2) cimg::swap(nx1,nx2,ny1,ny2,nz1,nz2,nc1,nc2); - if (ny0>=height() || ny2<0) return *this; - tzfloat - pzl = (nz1 - nz0)/(ny1 - ny0), - pzr = (nz2 - nz0)/(ny2 - ny0), - pzn = (nz2 - nz1)/(ny2 - ny1), - zr = ny0>=0?nz0:(nz0 - ny0*(nz2 - nz0)/(ny2 - ny0)), - zl = ny1>=0?(ny0>=0?nz0:(nz0 - ny0*(nz1 - nz0)/(ny1 - ny0))):(pzl=pzn,(nz1 - ny1*(nz2 - nz1)/(ny2 - ny1))); - _cimg_for_triangle2(*this,xleft0,cleft0,xright0,cright0,y,nx0,ny0,nc0,nx1,ny1,nc1,nx2,ny2,nc2) { - if (y==ny1) { zl = nz1; pzl = pzn; } - int xleft = xleft0, xright = xright0, cleft = cleft0, cright = cright0; - tzfloat zleft = zl, zright = zr; - if (xrightcleft?cright - cleft:cleft - cright, - rc = dx?(cright - cleft)/dx:0, - sc = cright>cleft?1:-1, - ndc = dc - (dx?dx*(dc/dx):0); - const tzfloat pentez = (zright - zleft)/dx; - int errc = dx>>1; - if (xleft<0 && dx) { - cleft-=xleft*(cright - cleft)/dx; - zleft-=xleft*(zright - zleft)/dx; - } - if (xleft<0) xleft = 0; - if (xright>=width() - 1) xright = width() - 1; - T *ptrd = data(xleft,y); - tz *ptrz = xleft<=xright?zbuffer.data(xleft,y):0; - if (opacity>=1) for (int x = xleft; x<=xright; ++x, ++ptrd, ++ptrz) { - if (zleft>=(tzfloat)*ptrz) { - *ptrz = (tz)zleft; - const tc *col = color; - cimg_forC(*this,c) { - *ptrd = (T)(cleft<256?cleft**(col++)/256:((512 - cleft)**(col++)+(cleft - 256)*maxval)/256); - ptrd+=whd; - } - ptrd-=offx; - } - zleft+=pentez; - cleft+=rc+((errc-=ndc)<0?errc+=dx,sc:0); - } else for (int x = xleft; x<=xright; ++x, ++ptrd, ++ptrz) { - if (zleft>=(tzfloat)*ptrz) { - *ptrz = (tz)zleft; - const tc *col = color; + + float iz0 = 1/z0, iz1 = 1/z1, iz2 = 1/z2; + if (y0>y1) cimg::swap(x0,x1,y0,y1,iz0,iz1,bs0,bs1); + if (y0>y2) cimg::swap(x0,x2,y0,y2,iz0,iz2,bs0,bs2); + if (y1>y2) cimg::swap(x1,x2,y1,y2,iz1,iz2,bs1,bs2); + if (y2<0 || y0>=height() || cimg::min(x0,x1,x2)>=width() || cimg::max(x0,x1,x2)<0 || !opacity) return *this; + + const int + w1 = width() - 1, h1 = height() - 1, + dx01 = x1 - x0, dx02 = x2 - x0, dx12 = x2 - x1, + dy01 = std::max(1,y1 - y0), dy02 = std::max(1,y2 - y0), dy12 = std::max(1,y2 - y1), + cy0 = cimg::cut(y0,0,h1), cy2 = cimg::cut(y2,0,h1), + hdy01 = dy01*cimg::sign(dx01)/2, hdy02 = dy02*cimg::sign(dx02)/2, hdy12 = dy12*cimg::sign(dx12)/2; + const float + diz01 = iz1 - iz0, diz02 = iz2 - iz0, diz12 = iz2 - iz1, + dbs01 = bs1 - bs0, dbs02 = bs2 - bs0, dbs12 = bs2 - bs1; + + cimg_init_scanline(opacity); + + for (int y = cy0; y<=cy2; ++y) { + const int yy0 = y - y0, yy1 = y - y1; + int + xm = yxM) cimg::swap(xm,xM,izm,izM,bsm,bsM); + if (xM>=0 || xm<=w1) { + const int + cxm = cimg::cut(xm,0,w1), + cxM = cimg::cut(xM,0,w1); + T *ptrd = data(cxm,y); + tz *ptrz = zbuffer.data(cxm,y); + const int dxmM = std::max(1,xM - xm); + const float dizmM = izM - izm, dbsmM = bsM - bsm; + + for (int x = cxm; x<=cxM; ++x) { + const int xxm = x - xm; + const float iz = izm + dizmM*xxm/dxmM; + if (iz>=*ptrz) { + *ptrz = (tz)iz; + const float cbs = cimg::cut(bsm + dbsmM*xxm/dxmM,0,2); cimg_forC(*this,c) { - const T val = (T)(cleft<256?cleft**(col++)/256:((512 - cleft)**(col++)+(cleft - 256)*maxval)/256); - *ptrd = (T)(nopacity*val + *ptrd*copacity); - ptrd+=whd; + const Tfloat val = cbs<=1?color[c]*cbs:(2 - cbs)*color[c] + (cbs - 1)*_sc_maxval; + ptrd[c*_sc_whd] = (T)(opacity>=1?val:val*_sc_nopacity + ptrd[c*_sc_whd]*_sc_copacity); } - ptrd-=offx; } - zleft+=pentez; - cleft+=rc+((errc-=ndc)<0?errc+=dx,sc:0); + ++ptrd; ++ptrz; } - zr+=pzr; zl+=pzl; + } } return *this; } @@ -43472,7 +45905,7 @@ \param x2 X-coordinate of the third vertex in the image instance. \param y2 Y-coordinate of the third vertex in the image instance. \param color1 Pointer to \c spectrum() consecutive values of type \c T, defining the color of the first vertex. - \param color2 Pointer to \c spectrum() consecutive values of type \c T, defining the color of the seconf vertex. + \param color2 Pointer to \c spectrum() consecutive values of type \c T, defining the color of the second vertex. \param color3 Pointer to \c spectrum() consecutive values of type \c T, defining the color of the third vertex. \param opacity Drawing opacity. **/ @@ -43509,13 +45942,13 @@ \param brightness Brightness factor of the drawing (in [0,2]). **/ template - CImg& draw_triangle(const int x0, const int y0, - const int x1, const int y1, - const int x2, const int y2, + CImg& draw_triangle(int x0, int y0, + int x1, int y1, + int x2, int y2, const CImg& texture, - const int tx0, const int ty0, - const int tx1, const int ty1, - const int tx2, const int ty2, + int tx0, int ty0, + int tx1, int ty1, + int tx2, int ty2, const float opacity=1, const float brightness=1) { if (is_empty()) return *this; @@ -43526,103 +45959,56 @@ texture._width,texture._height,texture._depth,texture._spectrum,texture._data); if (is_overlapped(texture)) return draw_triangle(x0,y0,x1,y1,x2,y2,+texture,tx0,ty0,tx1,ty1,tx2,ty2,opacity,brightness); - static const T maxval = (T)std::min(cimg::type::max(),cimg::type::max()); - const float - nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f), - nbrightness = cimg::cut(brightness,0,2); - const ulongT - whd = (ulongT)_width*_height*_depth, - twh = (ulongT)texture._width*texture._height, - offx = _spectrum*whd - 1; - int nx0 = x0, ny0 = y0, nx1 = x1, ny1 = y1, nx2 = x2, ny2 = y2, - ntx0 = tx0, nty0 = ty0, ntx1 = tx1, nty1 = ty1, ntx2 = tx2, nty2 = ty2; - if (ny0>ny1) cimg::swap(nx0,nx1,ny0,ny1,ntx0,ntx1,nty0,nty1); - if (ny0>ny2) cimg::swap(nx0,nx2,ny0,ny2,ntx0,ntx2,nty0,nty2); - if (ny1>ny2) cimg::swap(nx1,nx2,ny1,ny2,ntx1,ntx2,nty1,nty2); - if (ny0>=height() || ny2<0) return *this; - _cimg_for_triangle3(*this,xleft0,txleft0,tyleft0,xright0,txright0,tyright0,y, - nx0,ny0,ntx0,nty0,nx1,ny1,ntx1,nty1,nx2,ny2,ntx2,nty2) { + + if (y0>y1) cimg::swap(x0,x1,y0,y1,tx0,tx1,ty0,ty1); + if (y0>y2) cimg::swap(x0,x2,y0,y2,tx0,tx2,ty0,ty2); + if (y1>y2) cimg::swap(x1,x2,y1,y2,tx1,ty1,tx2,ty2); + if (y2<0 || y0>=height() || cimg::min(x0,x1,x2)>=width() || cimg::max(x0,x1,x2)<0 || !opacity) return *this; + + const int + w1 = width() - 1, h1 = height() - 1, + dx01 = x1 - x0, dx02 = x2 - x0, dx12 = x2 - x1, + dy01 = std::max(1,y1 - y0), dy02 = std::max(1,y2 - y0), dy12 = std::max(1,y2 - y1), + cy0 = cimg::cut(y0,0,h1), cy2 = cimg::cut(y2,0,h1), + hdy01 = dy01*cimg::sign(dx01)/2, hdy02 = dy02*cimg::sign(dx02)/2, hdy12 = dy12*cimg::sign(dx12)/2, + dtx01 = tx1 - tx0, dtx02 = tx2 - tx0, dtx12 = tx2 - tx1, + dty01 = ty1 - ty0, dty02 = ty2 - ty0, dty12 = ty2 - ty1, + hdy01tx = dy01*cimg::sign(dtx01)/2, hdy02tx = dy02*cimg::sign(dtx02)/2, hdy12tx = dy12*cimg::sign(dtx12)/2, + hdy01ty = dy01*cimg::sign(dty01)/2, hdy02ty = dy02*cimg::sign(dty02)/2, hdy12ty = dy12*cimg::sign(dty12)/2; + const ulongT twhd = (ulongT)texture._width*texture._height*texture._depth; + const float cbs = cimg::cut(brightness,0,2); + cimg_init_scanline(opacity); + + for (int y = cy0; y<=cy2; ++y) { + const int yy0 = y - y0, yy1 = y - y1; int - xleft = xleft0, xright = xright0, - txleft = txleft0, txright = txright0, - tyleft = tyleft0, tyright = tyright0; - if (xrighttxleft?txright - txleft:txleft - txright, - dty = tyright>tyleft?tyright - tyleft:tyleft - tyright, - rtx = dx?(txright - txleft)/dx:0, - rty = dx?(tyright - tyleft)/dx:0, - stx = txright>txleft?1:-1, - sty = tyright>tyleft?1:-1, - ndtx = dtx - (dx?dx*(dtx/dx):0), - ndty = dty - (dx?dx*(dty/dx):0); - int errtx = dx>>1, errty = errtx; - if (xleft<0 && dx) { - txleft-=xleft*(txright - txleft)/dx; - tyleft-=xleft*(tyright - tyleft)/dx; - } - if (xleft<0) xleft = 0; - if (xright>=width() - 1) xright = width() - 1; - T* ptrd = data(xleft,y,0,0); - if (opacity>=1) { - if (nbrightness==1) for (int x = xleft; x<=xright; ++x) { - const tc *col = &texture._atXY(txleft,tyleft); - cimg_forC(*this,c) { - *ptrd = (T)*col; - ptrd+=whd; col+=twh; - } - ptrd-=offx; - txleft+=rtx+((errtx-=ndtx)<0?errtx+=dx,stx:0); - tyleft+=rty+((errty-=ndty)<0?errty+=dx,sty:0); - } else if (nbrightness<1) for (int x = xleft; x<=xright; ++x) { - const tc *col = &texture._atXY(txleft,tyleft); - cimg_forC(*this,c) { - *ptrd = (T)(nbrightness**col); - ptrd+=whd; col+=twh; - } - ptrd-=offx; - txleft+=rtx+((errtx-=ndtx)<0?errtx+=dx,stx:0); - tyleft+=rty+((errty-=ndty)<0?errty+=dx,sty:0); - } else for (int x = xleft; x<=xright; ++x) { - const tc *col = &texture._atXY(txleft,tyleft); - cimg_forC(*this,c) { - *ptrd = (T)((2 - nbrightness)**(col++) + (nbrightness - 1)*maxval); - ptrd+=whd; col+=twh; - } - ptrd-=offx; - txleft+=rtx+((errtx-=ndtx)<0?errtx+=dx,stx:0); - tyleft+=rty+((errty-=ndty)<0?errty+=dx,sty:0); - } - } else { - if (nbrightness==1) for (int x = xleft; x<=xright; ++x) { - const tc *col = &texture._atXY(txleft,tyleft); - cimg_forC(*this,c) { - *ptrd = (T)(nopacity**col + *ptrd*copacity); - ptrd+=whd; col+=twh; - } - ptrd-=offx; - txleft+=rtx+((errtx-=ndtx)<0?errtx+=dx,stx:0); - tyleft+=rty+((errty-=ndty)<0?errty+=dx,sty:0); - } else if (nbrightness<1) for (int x = xleft; x<=xright; ++x) { - const tc *col = &texture._atXY(txleft,tyleft); + xm = yxM) cimg::swap(xm,xM,txm,txM,tym,tyM); + if (xM>=0 || xm<=w1) { + const int + cxm = cimg::cut(xm,0,w1), + cxM = cimg::cut(xM,0,w1); + T *ptrd = data(cxm,y); + const int + dxmM = std::max(1,xM - xm), hdxmM = dxmM/2, + dtxmM = txM - txm, dtymM = tyM - tym; + + for (int x = cxm; x<=cxM; ++x) { + const int + xxm = x - xm, + tx = (txm*dxmM + dtxmM*xxm + hdxmM)/dxmM, + ty = (tym*dxmM + dtymM*xxm + hdxmM)/dxmM; + const tc *const color = &texture._atXY(tx,ty); cimg_forC(*this,c) { - *ptrd = (T)(nopacity*nbrightness**col + *ptrd*copacity); - ptrd+=whd; col+=twh; + const Tfloat val = cbs<=1?color[c*twhd]*cbs:(2 - cbs)*color[c*twhd] + (cbs - 1)*_sc_maxval; + ptrd[c*_sc_whd] = (T)(opacity>=1?val:val*_sc_nopacity + ptrd[c*_sc_whd]*_sc_copacity); } - ptrd-=offx; - txleft+=rtx+((errtx-=ndtx)<0?errtx+=dx,stx:0); - tyleft+=rty+((errty-=ndty)<0?errty+=dx,sty:0); - } else for (int x = xleft; x<=xright; ++x) { - const tc *col = &texture._atXY(txleft,tyleft); - cimg_forC(*this,c) { - const T val = (T)((2 - nbrightness)**(col++) + (nbrightness - 1)*maxval); - *ptrd = (T)(nopacity*val + *ptrd*copacity); - ptrd+=whd; col+=twh; - } - ptrd-=offx; - txleft+=rtx+((errtx-=ndtx)<0?errtx+=dx,stx:0); - tyleft+=rty+((errty-=ndty)<0?errty+=dx,sty:0); + ++ptrd; } } } @@ -43631,13 +46017,13 @@ //! Draw a 2D textured triangle, with perspective correction. template - CImg& draw_triangle(const int x0, const int y0, const float z0, - const int x1, const int y1, const float z1, - const int x2, const int y2, const float z2, + CImg& draw_triangle(int x0, int y0, const float z0, + int x1, int y1, const float z1, + int x2, int y2, const float z2, const CImg& texture, - const int tx0, const int ty0, - const int tx1, const int ty1, - const int tx2, const int ty2, + int tx0, int ty0, + int tx1, int ty1, + int tx2, int ty2, const float opacity=1, const float brightness=1) { if (is_empty() || z0<=0 || z1<=0 || z2<=0) return *this; @@ -43648,118 +46034,68 @@ texture._width,texture._height,texture._depth,texture._spectrum,texture._data); if (is_overlapped(texture)) return draw_triangle(x0,y0,z0,x1,y1,z1,x2,y2,z2,+texture,tx0,ty0,tx1,ty1,tx2,ty2,opacity,brightness); - static const T maxval = (T)std::min(cimg::type::max(),(T)cimg::type::max()); + + float iz0 = 1/z0, iz1 = 1/z1, iz2 = 1/z2; + if (y0>y1) cimg::swap(x0,x1,y0,y1,iz0,iz1,tx0,tx1,ty0,ty1); + if (y0>y2) cimg::swap(x0,x2,y0,y2,iz0,iz2,tx0,tx2,ty0,ty2); + if (y1>y2) cimg::swap(x1,x2,y1,y2,iz1,iz2,tx1,tx2,ty1,ty2); + if (y2<0 || y0>=height() || cimg::min(x0,x1,x2)>=width() || cimg::max(x0,x1,x2)<0 || !opacity) return *this; + + const int + w1 = width() - 1, h1 = height() - 1, + dx01 = x1 - x0, dx02 = x2 - x0, dx12 = x2 - x1, + dy01 = std::max(1,y1 - y0), dy02 = std::max(1,y2 - y0), dy12 = std::max(1,y2 - y1), + cy0 = cimg::cut(y0,0,h1), cy2 = cimg::cut(y2,0,h1), + hdy01 = dy01*cimg::sign(dx01)/2, hdy02 = dy02*cimg::sign(dx02)/2, hdy12 = dy12*cimg::sign(dx12)/2; const float - nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f), - nbrightness = cimg::cut(brightness,0,2); - const ulongT - whd = (ulongT)_width*_height*_depth, - twh = (ulongT)texture._width*texture._height, - offx = _spectrum*whd - 1; - int nx0 = x0, ny0 = y0, nx1 = x1, ny1 = y1, nx2 = x2, ny2 = y2; - float - ntx0 = tx0/z0, nty0 = ty0/z0, - ntx1 = tx1/z1, nty1 = ty1/z1, - ntx2 = tx2/z2, nty2 = ty2/z2, - nz0 = 1/z0, nz1 = 1/z1, nz2 = 1/z2; - if (ny0>ny1) cimg::swap(nx0,nx1,ny0,ny1,ntx0,ntx1,nty0,nty1,nz0,nz1); - if (ny0>ny2) cimg::swap(nx0,nx2,ny0,ny2,ntx0,ntx2,nty0,nty2,nz0,nz2); - if (ny1>ny2) cimg::swap(nx1,nx2,ny1,ny2,ntx1,ntx2,nty1,nty2,nz1,nz2); - if (ny0>=height() || ny2<0) return *this; - float - ptxl = (ntx1 - ntx0)/(ny1 - ny0), - ptxr = (ntx2 - ntx0)/(ny2 - ny0), - ptxn = (ntx2 - ntx1)/(ny2 - ny1), - ptyl = (nty1 - nty0)/(ny1 - ny0), - ptyr = (nty2 - nty0)/(ny2 - ny0), - ptyn = (nty2 - nty1)/(ny2 - ny1), - pzl = (nz1 - nz0)/(ny1 - ny0), - pzr = (nz2 - nz0)/(ny2 - ny0), - pzn = (nz2 - nz1)/(ny2 - ny1), - zr = ny0>=0?nz0:(nz0 - ny0*(nz2 - nz0)/(ny2 - ny0)), - txr = ny0>=0?ntx0:(ntx0 - ny0*(ntx2 - ntx0)/(ny2 - ny0)), - tyr = ny0>=0?nty0:(nty0 - ny0*(nty2 - nty0)/(ny2 - ny0)), - zl = ny1>=0?(ny0>=0?nz0:(nz0 - ny0*(nz1 - nz0)/(ny1 - ny0))):(pzl=pzn,(nz1 - ny1*(nz2 - nz1)/(ny2 - ny1))), - txl = ny1>=0?(ny0>=0?ntx0:(ntx0 - ny0*(ntx1 - ntx0)/(ny1 - ny0))): - (ptxl=ptxn,(ntx1 - ny1*(ntx2 - ntx1)/(ny2 - ny1))), - tyl = ny1>=0?(ny0>=0?nty0:(nty0 - ny0*(nty1 - nty0)/(ny1 - ny0))): - (ptyl=ptyn,(nty1 - ny1*(nty2 - nty1)/(ny2 - ny1))); - _cimg_for_triangle1(*this,xleft0,xright0,y,nx0,ny0,nx1,ny1,nx2,ny2) { - if (y==ny1) { zl = nz1; txl = ntx1; tyl = nty1; pzl = pzn; ptxl = ptxn; ptyl = ptyn; } - int xleft = xleft0, xright = xright0; + diz01 = iz1 - iz0, diz02 = iz2 - iz0, diz12 = iz2 - iz1, + txz0 = tx0*iz0, txz1 = tx1*iz1, txz2 = tx2*iz2, + tyz0 = ty0*iz0, tyz1 = ty1*iz1, tyz2 = ty2*iz2, + dtxz01 = txz1 - txz0, dtxz02 = txz2 - txz0, dtxz12 = txz2 - txz1, + dtyz01 = tyz1 - tyz0, dtyz02 = tyz2 - tyz0, dtyz12 = tyz2 - tyz1; + + const ulongT twhd = (ulongT)texture._width*texture._height*texture._depth; + const float cbs = cimg::cut(brightness,0,2); + cimg_init_scanline(opacity); + + for (int y = cy0; y<=cy2; ++y) { + const int yy0 = y - y0, yy1 = y - y1; + int + xm = y=width() - 1) xright = width() - 1; - T* ptrd = data(xleft,y,0,0); - if (opacity>=1) { - if (nbrightness==1) for (int x = xleft; x<=xright; ++x) { - const float invz = 1/zleft; - const tc *col = &texture._atXY((int)(txleft*invz),(int)(tyleft*invz)); - cimg_forC(*this,c) { - *ptrd = (T)*col; - ptrd+=whd; col+=twh; - } - ptrd-=offx; zleft+=pentez; txleft+=pentetx; tyleft+=pentety; - } else if (nbrightness<1) for (int x=xleft; x<=xright; ++x) { - const float invz = 1/zleft; - const tc *col = &texture._atXY((int)(txleft*invz),(int)(tyleft*invz)); - cimg_forC(*this,c) { - *ptrd = (T)(nbrightness**col); - ptrd+=whd; col+=twh; - } - ptrd-=offx; zleft+=pentez; txleft+=pentetx; tyleft+=pentety; - } else for (int x = xleft; x<=xright; ++x) { - const float invz = 1/zleft; - const tc *col = &texture._atXY((int)(txleft*invz),(int)(tyleft*invz)); - cimg_forC(*this,c) { - *ptrd = (T)((2 - nbrightness)**col + (nbrightness - 1)*maxval); - ptrd+=whd; col+=twh; - } - ptrd-=offx; zleft+=pentez; txleft+=pentetx; tyleft+=pentety; - } - } else { - if (nbrightness==1) for (int x = xleft; x<=xright; ++x) { - const float invz = 1/zleft; - const tc *col = &texture._atXY((int)(txleft*invz),(int)(tyleft*invz)); - cimg_forC(*this,c) { - *ptrd = (T)(nopacity**col + *ptrd*copacity); - ptrd+=whd; col+=twh; - } - ptrd-=offx; zleft+=pentez; txleft+=pentetx; tyleft+=pentety; - } else if (nbrightness<1) for (int x = xleft; x<=xright; ++x) { - const float invz = 1/zleft; - const tc *col = &texture._atXY((int)(txleft*invz),(int)(tyleft*invz)); - cimg_forC(*this,c) { - *ptrd = (T)(nopacity*nbrightness**col + *ptrd*copacity); - ptrd+=whd; col+=twh; - } - ptrd-=offx; zleft+=pentez; txleft+=pentetx; tyleft+=pentety; - } else for (int x = xleft; x<=xright; ++x) { - const float invz = 1/zleft; - const tc *col = &texture._atXY((int)(txleft*invz),(int)(tyleft*invz)); + izm = yxM) cimg::swap(xm,xM,txzm,txzM,tyzm,tyzM,izm,izM); + if (xM>=0 || xm<=w1) { + const int + cxm = cimg::cut(xm,0,w1), + cxM = cimg::cut(xM,0,w1); + T *ptrd = data(cxm,y); + const int dxmM = std::max(1,xM - xm); + const float dizmM = izM - izm, dtxzmM = txzM - txzm, dtyzmM = tyzM - tyzm; + + for (int x = cxm; x=1?val:val*_sc_nopacity + ptrd[c*_sc_whd]*_sc_copacity); } - ptrd-=offx; zleft+=pentez; txleft+=pentetx; tyleft+=pentety; + ++ptrd; } } - zr+=pzr; txr+=ptxr; tyr+=ptyr; zl+=pzl; txl+=ptxl; tyl+=ptyl; } return *this; } @@ -43767,16 +46103,15 @@ //! Draw a textured 2D triangle, with perspective correction and z-buffering. template CImg& draw_triangle(CImg& zbuffer, - const int x0, const int y0, const float z0, - const int x1, const int y1, const float z1, - const int x2, const int y2, const float z2, + int x0, int y0, const float z0, + int x1, int y1, const float z1, + int x2, int y2, const float z2, const CImg& texture, - const int tx0, const int ty0, - const int tx1, const int ty1, - const int tx2, const int ty2, + int tx0, int ty0, + int tx1, int ty1, + int tx2, int ty2, const float opacity=1, const float brightness=1) { - typedef typename cimg::superset::type tzfloat; if (is_empty() || z0<=0 || z1<=0 || z2<=0) return *this; if (!is_sameXY(zbuffer)) throw CImgArgumentException(_cimg_instance @@ -43792,140 +46127,72 @@ texture._width,texture._height,texture._depth,texture._spectrum,texture._data); if (is_overlapped(texture)) return draw_triangle(zbuffer,x0,y0,z0,x1,y1,z1,x2,y2,z2,+texture,tx0,ty0,tx1,ty1,tx2,ty2,opacity,brightness); - static const T maxval = (T)std::min(cimg::type::max(),(T)cimg::type::max()); + + float iz0 = 1/z0, iz1 = 1/z1, iz2 = 1/z2; + if (y0>y1) cimg::swap(x0,x1,y0,y1,iz0,iz1,tx0,tx1,ty0,ty1); + if (y0>y2) cimg::swap(x0,x2,y0,y2,iz0,iz2,tx0,tx2,ty0,ty2); + if (y1>y2) cimg::swap(x1,x2,y1,y2,iz1,iz2,tx1,tx2,ty1,ty2); + if (y2<0 || y0>=height() || cimg::min(x0,x1,x2)>=width() || cimg::max(x0,x1,x2)<0 || !opacity) return *this; + + const int + w1 = width() - 1, h1 = height() - 1, + dx01 = x1 - x0, dx02 = x2 - x0, dx12 = x2 - x1, + dy01 = std::max(1,y1 - y0), dy02 = std::max(1,y2 - y0), dy12 = std::max(1,y2 - y1), + cy0 = cimg::cut(y0,0,h1), cy2 = cimg::cut(y2,0,h1), + hdy01 = dy01*cimg::sign(dx01)/2, hdy02 = dy02*cimg::sign(dx02)/2, hdy12 = dy12*cimg::sign(dx12)/2; const float - nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f), - nbrightness = cimg::cut(brightness,0,2); - const ulongT - whd = (ulongT)_width*_height*_depth, - twh = (ulongT)texture._width*texture._height, - offx = _spectrum*whd; - int nx0 = x0, ny0 = y0, nx1 = x1, ny1 = y1, nx2 = x2, ny2 = y2; - float - ntx0 = tx0/z0, nty0 = ty0/z0, - ntx1 = tx1/z1, nty1 = ty1/z1, - ntx2 = tx2/z2, nty2 = ty2/z2; - tzfloat nz0 = 1/(tzfloat)z0, nz1 = 1/(tzfloat)z1, nz2 = 1/(tzfloat)z2; - if (ny0>ny1) cimg::swap(nx0,nx1,ny0,ny1,ntx0,ntx1,nty0,nty1,nz0,nz1); - if (ny0>ny2) cimg::swap(nx0,nx2,ny0,ny2,ntx0,ntx2,nty0,nty2,nz0,nz2); - if (ny1>ny2) cimg::swap(nx1,nx2,ny1,ny2,ntx1,ntx2,nty1,nty2,nz1,nz2); - if (ny0>=height() || ny2<0) return *this; - float - ptxl = (ntx1 - ntx0)/(ny1 - ny0), - ptxr = (ntx2 - ntx0)/(ny2 - ny0), - ptxn = (ntx2 - ntx1)/(ny2 - ny1), - ptyl = (nty1 - nty0)/(ny1 - ny0), - ptyr = (nty2 - nty0)/(ny2 - ny0), - ptyn = (nty2 - nty1)/(ny2 - ny1), - txr = ny0>=0?ntx0:(ntx0 - ny0*(ntx2 - ntx0)/(ny2 - ny0)), - tyr = ny0>=0?nty0:(nty0 - ny0*(nty2 - nty0)/(ny2 - ny0)), - txl = ny1>=0?(ny0>=0?ntx0:(ntx0 - ny0*(ntx1 - ntx0)/(ny1 - ny0))): - (ptxl=ptxn,(ntx1 - ny1*(ntx2 - ntx1)/(ny2 - ny1))), - tyl = ny1>=0?(ny0>=0?nty0:(nty0 - ny0*(nty1 - nty0)/(ny1 - ny0))): - (ptyl=ptyn,(nty1 - ny1*(nty2 - nty1)/(ny2 - ny1))); - tzfloat - pzl = (nz1 - nz0)/(ny1 - ny0), - pzr = (nz2 - nz0)/(ny2 - ny0), - pzn = (nz2 - nz1)/(ny2 - ny1), - zr = ny0>=0?nz0:(nz0 - ny0*(nz2 - nz0)/(ny2 - ny0)), - zl = ny1>=0?(ny0>=0?nz0:(nz0 - ny0*(nz1 - nz0)/(ny1 - ny0))):(pzl=pzn,(nz1 - ny1*(nz2 - nz1)/(ny2 - ny1))); - _cimg_for_triangle1(*this,xleft0,xright0,y,nx0,ny0,nx1,ny1,nx2,ny2) { - if (y==ny1) { zl = nz1; txl = ntx1; tyl = nty1; pzl = pzn; ptxl = ptxn; ptyl = ptyn; } - int xleft = xleft0, xright = xright0; - float txleft = txl, txright = txr, tyleft = tyl, tyright = tyr; - tzfloat zleft = zl, zright = zr; - if (xright=width() - 1) xright = width() - 1; - T *ptrd = data(xleft,y,0,0); - tz *ptrz = zbuffer.data(xleft,y); - if (opacity>=1) { - if (nbrightness==1) for (int x = xleft; x<=xright; ++x, ++ptrz, ++ptrd) { - if (zleft>=(tzfloat)*ptrz) { - *ptrz = (tz)zleft; - const tzfloat invz = 1/zleft; - const tc *col = &texture._atXY((int)(txleft*invz),(int)(tyleft*invz)); - cimg_forC(*this,c) { - *ptrd = (T)*col; - ptrd+=whd; col+=twh; - } - ptrd-=offx; - } - zleft+=pentez; txleft+=pentetx; tyleft+=pentety; - } else if (nbrightness<1) for (int x = xleft; x<=xright; ++x, ++ptrz, ++ptrd) { - if (zleft>=(tzfloat)*ptrz) { - *ptrz = (tz)zleft; - const tzfloat invz = 1/zleft; - const tc *col = &texture._atXY((int)(txleft*invz),(int)(tyleft*invz)); - cimg_forC(*this,c) { - *ptrd = (T)(nbrightness**col); - ptrd+=whd; col+=twh; - } - ptrd-=offx; - } - zleft+=pentez; txleft+=pentetx; tyleft+=pentety; - } else for (int x = xleft; x<=xright; ++x, ++ptrz, ++ptrd) { - if (zleft>=(tzfloat)*ptrz) { - *ptrz = (tz)zleft; - const tzfloat invz = 1/zleft; - const tc *col = &texture._atXY((int)(txleft*invz),(int)(tyleft*invz)); - cimg_forC(*this,c) { - *ptrd = (T)((2 - nbrightness)**col + (nbrightness - 1)*maxval); - ptrd+=whd; col+=twh; - } - ptrd-=offx; - } - zleft+=pentez; txleft+=pentetx; tyleft+=pentety; - } - } else { - if (nbrightness==1) for (int x = xleft; x<=xright; ++x, ++ptrz, ++ptrd) { - if (zleft>=(tzfloat)*ptrz) { - *ptrz = (tz)zleft; - const tzfloat invz = 1/zleft; - const tc *col = &texture._atXY((int)(txleft*invz),(int)(tyleft*invz)); - cimg_forC(*this,c) { - *ptrd = (T)(nopacity**col + *ptrd*copacity); - ptrd+=whd; col+=twh; - } - ptrd-=offx; - } - zleft+=pentez; txleft+=pentetx; tyleft+=pentety; - } else if (nbrightness<1) for (int x = xleft; x<=xright; ++x, ++ptrz, ++ptrd) { - if (zleft>=(tzfloat)*ptrz) { - *ptrz = (tz)zleft; - const tzfloat invz = 1/zleft; - const tc *col = &texture._atXY((int)(txleft*invz),(int)(tyleft*invz)); - cimg_forC(*this,c) { - *ptrd = (T)(nopacity*nbrightness**col + *ptrd*copacity); - ptrd+=whd; col+=twh; - } - ptrd-=offx; - } - zleft+=pentez; txleft+=pentetx; tyleft+=pentety; - } else for (int x = xleft; x<=xright; ++x, ++ptrz, ++ptrd) { - if (zleft>=(tzfloat)*ptrz) { - *ptrz = (tz)zleft; - const tzfloat invz = 1/zleft; - const tc *col = &texture._atXY((int)(txleft*invz),(int)(tyleft*invz)); - cimg_forC(*this,c) { - const T val = (T)((2 - nbrightness)**col + (nbrightness - 1)*maxval); - *ptrd = (T)(nopacity*val + *ptrd*copacity); - ptrd+=whd; col+=twh; - } - ptrd-=offx; + diz01 = iz1 - iz0, diz02 = iz2 - iz0, diz12 = iz2 - iz1, + txz0 = tx0*iz0, txz1 = tx1*iz1, txz2 = tx2*iz2, + tyz0 = ty0*iz0, tyz1 = ty1*iz1, tyz2 = ty2*iz2, + dtxz01 = txz1 - txz0, dtxz02 = txz2 - txz0, dtxz12 = txz2 - txz1, + dtyz01 = tyz1 - tyz0, dtyz02 = tyz2 - tyz0, dtyz12 = tyz2 - tyz1; + + const ulongT twhd = (ulongT)texture._width*texture._height*texture._depth; + const float cbs = cimg::cut(brightness,0,2); + cimg_init_scanline(opacity); + + for (int y = cy0; y<=cy2; ++y) { + const int yy0 = y - y0, yy1 = y - y1; + int + xm = yxM) cimg::swap(xm,xM,txzm,txzM,tyzm,tyzM,izm,izM); + if (xM>=0 || xm<=w1) { + const int + cxm = cimg::cut(xm,0,w1), + cxM = cimg::cut(xM,0,w1); + T *ptrd = data(cxm,y); + tz *ptrz = zbuffer.data(cxm,y); + const int dxmM = std::max(1,xM - xm); + const float dizmM = izM - izm, dtxzmM = txzM - txzm, dtyzmM = tyzM - tyzm; + + for (int x = cxm; x=*ptrz) { + *ptrz = (tz)iz; + const float + txz = txzm + dtxzmM*xxm/dxmM, + tyz = tyzm + dtyzmM*xxm/dxmM; + const int + tx = (int)cimg::round(txz/iz), + ty = (int)cimg::round(tyz/iz); + const tc *const color = &texture._atXY(tx,ty); + cimg_forC(*this,c) { + const Tfloat val = cbs<=1?color[c*twhd]*cbs:(2 - cbs)*color[c*twhd] + (cbs - 1)*_sc_maxval; + ptrd[c*_sc_whd] = (T)(opacity>=1?val:val*_sc_nopacity + ptrd[c*_sc_whd]*_sc_copacity); } - zleft+=pentez; txleft+=pentetx; tyleft+=pentety; } + ++ptrd; ++ptrz; + } } - zr+=pzr; txr+=ptxr; tyr+=ptyr; zl+=pzl; txl+=ptxl; tyl+=ptyl; } return *this; } @@ -43949,14 +46216,14 @@ \param opacity Drawing opacity. **/ template - CImg& draw_triangle(const int x0, const int y0, - const int x1, const int y1, - const int x2, const int y2, + CImg& draw_triangle(int x0, int y0, + int x1, int y1, + int x2, int y2, const tc *const color, const CImg& light, - const int lx0, const int ly0, - const int lx1, const int ly1, - const int lx2, const int ly2, + int lx0, int ly0, + int lx1, int ly1, + int lx2, int ly2, const float opacity=1) { if (is_empty()) return *this; if (!color) @@ -43967,67 +46234,59 @@ throw CImgArgumentException(_cimg_instance "draw_triangle(): Invalid specified light texture (%u,%u,%u,%u,%p).", cimg_instance,light._width,light._height,light._depth,light._spectrum,light._data); - if (is_overlapped(light)) return draw_triangle(x0,y0,x1,y1,x2,y2,color,+light,lx0,ly0,lx1,ly1,lx2,ly2,opacity); - static const T maxval = (T)std::min(cimg::type::max(),(T)cimg::type::max()); - const float nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f); - int nx0 = x0, ny0 = y0, nx1 = x1, ny1 = y1, nx2 = x2, ny2 = y2, - nlx0 = lx0, nly0 = ly0, nlx1 = lx1, nly1 = ly1, nlx2 = lx2, nly2 = ly2; - const ulongT - whd = (ulongT)_width*_height*_depth, - lwh = (ulongT)light._width*light._height, - offx = _spectrum*whd - 1; - if (ny0>ny1) cimg::swap(nx0,nx1,ny0,ny1,nlx0,nlx1,nly0,nly1); - if (ny0>ny2) cimg::swap(nx0,nx2,ny0,ny2,nlx0,nlx2,nly0,nly2); - if (ny1>ny2) cimg::swap(nx1,nx2,ny1,ny2,nlx1,nlx2,nly1,nly2); - if (ny0>=height() || ny2<0) return *this; - _cimg_for_triangle3(*this,xleft0,lxleft0,lyleft0,xright0,lxright0,lyright0,y, - nx0,ny0,nlx0,nly0,nx1,ny1,nlx1,nly1,nx2,ny2,nlx2,nly2) { + + if (y0>y1) cimg::swap(x0,x1,y0,y1,lx0,lx1,ly0,ly1); + if (y0>y2) cimg::swap(x0,x2,y0,y2,lx0,lx2,ly0,ly2); + if (y1>y2) cimg::swap(x1,x2,y1,y2,lx1,lx2,ly1,ly2); + if (y2<0 || y0>=height() || cimg::min(x0,x1,x2)>=width() || cimg::max(x0,x1,x2)<0 || !opacity) return *this; + + const int + w1 = width() - 1, h1 = height() - 1, + dx01 = x1 - x0, dx02 = x2 - x0, dx12 = x2 - x1, + dy01 = std::max(1,y1 - y0), dy02 = std::max(1,y2 - y0), dy12 = std::max(1,y2 - y1), + cy0 = cimg::cut(y0,0,h1), cy2 = cimg::cut(y2,0,h1), + hdy01 = dy01*cimg::sign(dx01)/2, hdy02 = dy02*cimg::sign(dx02)/2, hdy12 = dy12*cimg::sign(dx12)/2, + dlx01 = lx1 - lx0, dlx02 = lx2 - lx0, dlx12 = lx2 - lx1, + dly01 = ly1 - ly0, dly02 = ly2 - ly0, dly12 = ly2 - ly1, + hdy01lx = dy01*cimg::sign(dlx01)/2, hdy02lx = dy02*cimg::sign(dlx02)/2, hdy12lx = dy12*cimg::sign(dlx12)/2, + hdy01ly = dy01*cimg::sign(dly01)/2, hdy02ly = dy02*cimg::sign(dly02)/2, hdy12ly = dy12*cimg::sign(dly12)/2; + + const ulongT lwhd = (ulongT)light._width*light._height*light._depth; + cimg_init_scanline(opacity); + + for (int y = cy0; y<=cy2; ++y) { + const int yy0 = y - y0, yy1 = y - y1; int - xleft = xleft0, xright = xright0, - lxleft = lxleft0, lxright = lxright0, - lyleft = lyleft0, lyright = lyright0; - if (xrightlxleft?lxright - lxleft:lxleft - lxright, - dly = lyright>lyleft?lyright - lyleft:lyleft - lyright, - rlx = dx?(lxright - lxleft)/dx:0, - rly = dx?(lyright - lyleft)/dx:0, - slx = lxright>lxleft?1:-1, - sly = lyright>lyleft?1:-1, - ndlx = dlx - (dx?dx*(dlx/dx):0), - ndly = dly - (dx?dx*(dly/dx):0); - int errlx = dx>>1, errly = errlx; - if (xleft<0 && dx) { - lxleft-=xleft*(lxright - lxleft)/dx; - lyleft-=xleft*(lyright - lyleft)/dx; - } - if (xleft<0) xleft = 0; - if (xright>=width() - 1) xright = width() - 1; - T* ptrd = data(xleft,y,0,0); - if (opacity>=1) for (int x = xleft; x<=xright; ++x) { - const tc *col = color; - const tl *lig = &light._atXY(lxleft,lyleft); - cimg_forC(*this,c) { - const tl l = *lig; - *ptrd = (T)(l<1?l**(col++):((2 - l)**(col++) + (l - 1)*maxval)); - ptrd+=whd; lig+=lwh; - } - ptrd-=offx; - lxleft+=rlx+((errlx-=ndlx)<0?errlx+=dx,slx:0); - lyleft+=rly+((errly-=ndly)<0?errly+=dx,sly:0); - } else for (int x = xleft; x<=xright; ++x) { - const tc *col = color; - const tl *lig = &light._atXY(lxleft,lyleft); - cimg_forC(*this,c) { - const tl l = *lig; - const T val = (T)(l<1?l**(col++):((2 - l)**(col++) + (l - 1)*maxval)); - *ptrd = (T)(nopacity*val + *ptrd*copacity); - ptrd+=whd; lig+=lwh; - } - ptrd-=offx; - lxleft+=rlx+((errlx-=ndlx)<0?errlx+=dx,slx:0); - lyleft+=rly+((errly-=ndly)<0?errly+=dx,sly:0); + xm = yxM) cimg::swap(xm,xM,lxm,lxM,lym,lyM); + if (xM>=0 || xm<=w1) { + const int + cxm = cimg::cut(xm,0,w1), + cxM = cimg::cut(xM,0,w1); + T *ptrd = data(cxm,y); + const int + dxmM = std::max(1,xM - xm), hdxmM = dxmM/2, + dlxmM = lxM - lxm, dlymM = lyM - lym; + + for (int x = cxm; x=1?val:val*_sc_nopacity + ptrd[c*_sc_whd]*_sc_copacity); + } + ++ptrd; + } } } return *this; @@ -44036,16 +46295,15 @@ //! Draw a Phong-shaded 2D triangle, with z-buffering. template CImg& draw_triangle(CImg& zbuffer, - const int x0, const int y0, const float z0, - const int x1, const int y1, const float z1, - const int x2, const int y2, const float z2, + int x0, int y0, const float z0, + int x1, int y1, const float z1, + int x2, int y2, const float z2, const tc *const color, const CImg& light, - const int lx0, const int ly0, - const int lx1, const int ly1, - const int lx2, const int ly2, + int lx0, int ly0, + int lx1, int ly1, + int lx2, int ly2, const float opacity=1) { - typedef typename cimg::superset::type tzfloat; if (is_empty() || z0<=0 || z1<=0 || z2<=0) return *this; if (!color) throw CImgArgumentException(_cimg_instance @@ -44063,90 +46321,72 @@ zbuffer._width,zbuffer._height,zbuffer._depth,zbuffer._spectrum,zbuffer._data); if (is_overlapped(light)) return draw_triangle(zbuffer,x0,y0,z0,x1,y1,z1,x2,y2,z2,color, +light,lx0,ly0,lx1,ly1,lx2,ly2,opacity); - static const T maxval = (T)std::min(cimg::type::max(),(T)cimg::type::max()); - const float nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f); - const ulongT - whd = (ulongT)_width*_height*_depth, - lwh = (ulongT)light._width*light._height, - offx = _spectrum*whd; - int nx0 = x0, ny0 = y0, nx1 = x1, ny1 = y1, nx2 = x2, ny2 = y2, - nlx0 = lx0, nly0 = ly0, nlx1 = lx1, nly1 = ly1, nlx2 = lx2, nly2 = ly2; - tzfloat nz0 = 1/(tzfloat)z0, nz1 = 1/(tzfloat)z1, nz2 = 1/(tzfloat)z2; - if (ny0>ny1) cimg::swap(nx0,nx1,ny0,ny1,nlx0,nlx1,nly0,nly1,nz0,nz1); - if (ny0>ny2) cimg::swap(nx0,nx2,ny0,ny2,nlx0,nlx2,nly0,nly2,nz0,nz2); - if (ny1>ny2) cimg::swap(nx1,nx2,ny1,ny2,nlx1,nlx2,nly1,nly2,nz1,nz2); - if (ny0>=height() || ny2<0) return *this; - tzfloat - pzl = (nz1 - nz0)/(ny1 - ny0), - pzr = (nz2 - nz0)/(ny2 - ny0), - pzn = (nz2 - nz1)/(ny2 - ny1), - zr = ny0>=0?nz0:(nz0 - ny0*(nz2 - nz0)/(ny2 - ny0)), - zl = ny1>=0?(ny0>=0?nz0:(nz0 - ny0*(nz1 - nz0)/(ny1 - ny0))):(pzl=pzn,(nz1 - ny1*(nz2 - nz1)/(ny2 - ny1))); - _cimg_for_triangle3(*this,xleft0,lxleft0,lyleft0,xright0,lxright0,lyright0,y, - nx0,ny0,nlx0,nly0,nx1,ny1,nlx1,nly1,nx2,ny2,nlx2,nly2) { - if (y==ny1) { zl = nz1; pzl = pzn; } + + float iz0 = 1/z0, iz1 = 1/z1, iz2 = 1/z2; + if (y0>y1) cimg::swap(x0,x1,y0,y1,iz0,iz1,lx0,lx1,ly0,ly1); + if (y0>y2) cimg::swap(x0,x2,y0,y2,iz0,iz2,lx0,lx2,ly0,ly2); + if (y1>y2) cimg::swap(x1,x2,y1,y2,iz1,iz2,lx1,lx2,ly1,ly2); + if (y2<0 || y0>=height() || cimg::min(x0,x1,x2)>=width() || cimg::max(x0,x1,x2)<0 || !opacity) return *this; + + const int + w1 = width() - 1, h1 = height() - 1, + dx01 = x1 - x0, dx02 = x2 - x0, dx12 = x2 - x1, + dy01 = std::max(1,y1 - y0), dy02 = std::max(1,y2 - y0), dy12 = std::max(1,y2 - y1), + cy0 = cimg::cut(y0,0,h1), cy2 = cimg::cut(y2,0,h1), + hdy01 = dy01*cimg::sign(dx01)/2, hdy02 = dy02*cimg::sign(dx02)/2, hdy12 = dy12*cimg::sign(dx12)/2, + dlx01 = lx1 - lx0, dlx02 = lx2 - lx0, dlx12 = lx2 - lx1, + dly01 = ly1 - ly0, dly02 = ly2 - ly0, dly12 = ly2 - ly1, + hdy01lx = dy01*cimg::sign(dlx01)/2, hdy02lx = dy02*cimg::sign(dlx02)/2, hdy12lx = dy12*cimg::sign(dlx12)/2, + hdy01ly = dy01*cimg::sign(dly01)/2, hdy02ly = dy02*cimg::sign(dly02)/2, hdy12ly = dy12*cimg::sign(dly12)/2; + const float diz01 = iz1 - iz0, diz02 = iz2 - iz0, diz12 = iz2 - iz1; + + const ulongT lwhd = (ulongT)light._width*light._height*light._depth; + cimg_init_scanline(opacity); + + for (int y = cy0; y<=cy2; ++y) { + const int yy0 = y - y0, yy1 = y - y1; int - xleft = xleft0, xright = xright0, - lxleft = lxleft0, lxright = lxright0, - lyleft = lyleft0, lyright = lyright0; - tzfloat zleft = zl, zright = zr; - if (xrightlxleft?lxright - lxleft:lxleft - lxright, - dly = lyright>lyleft?lyright - lyleft:lyleft - lyright, - rlx = dx?(lxright - lxleft)/dx:0, - rly = dx?(lyright - lyleft)/dx:0, - slx = lxright>lxleft?1:-1, - sly = lyright>lyleft?1:-1, - ndlx = dlx - (dx?dx*(dlx/dx):0), - ndly = dly - (dx?dx*(dly/dx):0); - const tzfloat pentez = (zright - zleft)/dx; - int errlx = dx>>1, errly = errlx; - if (xleft<0 && dx) { - zleft-=xleft*(zright - zleft)/dx; - lxleft-=xleft*(lxright - lxleft)/dx; - lyleft-=xleft*(lyright - lyleft)/dx; - } - if (xleft<0) xleft = 0; - if (xright>=width() - 1) xright = width() - 1; - T *ptrd = data(xleft,y,0,0); - tz *ptrz = xleft<=xright?zbuffer.data(xleft,y):0; - if (opacity>=1) for (int x = xleft; x<=xright; ++x, ++ptrz, ++ptrd) { - if (zleft>=(tzfloat)*ptrz) { - *ptrz = (tz)zleft; - const tc *col = color; - const tl *lig = &light._atXY(lxleft,lyleft); - cimg_forC(*this,c) { - const tl l = *lig; - const tc cval = *(col++); - *ptrd = (T)(l<1?l*cval:(2 - l)*cval + (l - 1)*maxval); - ptrd+=whd; lig+=lwh; - } - ptrd-=offx; - } - zleft+=pentez; - lxleft+=rlx+((errlx-=ndlx)<0?errlx+=dx,slx:0); - lyleft+=rly+((errly-=ndly)<0?errly+=dx,sly:0); - } else for (int x = xleft; x<=xright; ++x, ++ptrz, ++ptrd) { - if (zleft>=(tzfloat)*ptrz) { - *ptrz = (tz)zleft; - const tc *col = color; - const tl *lig = &light._atXY(lxleft,lyleft); + xm = yxM) cimg::swap(xm,xM,lxm,lxM,lym,lyM,izm,izM); + if (xM>=0 || xm<=w1) { + const int + cxm = cimg::cut(xm,0,w1), + cxM = cimg::cut(xM,0,w1); + T *ptrd = data(cxm,y); + tz *ptrz = zbuffer.data(cxm,y); + const int + dxmM = std::max(1,xM - xm), hdxmM = dxmM/2, + dlxmM = lxM - lxm, dlymM = lyM - lym; + const float dizmM = izM - izm; + + for (int x = cxm; x=*ptrz) { + *ptrz = (tz)iz; + const int + lx = (lxm*dxmM + dlxmM*xxm + hdxmM)/dxmM, + ly = (lym*dxmM + dlymM*xxm + hdxmM)/dxmM; + const tl *const lig = &light._atXY(lx,ly); cimg_forC(*this,c) { - const tl l = *lig; - const tc cval = *(col++); - const T val = (T)(l<1?l*cval:(2 - l)*cval + (l - 1)*maxval); - *ptrd = (T)(nopacity*val + *ptrd*copacity); - ptrd+=whd; lig+=lwh; - } - ptrd-=offx; - } - zleft+=pentez; - lxleft+=rlx+((errlx-=ndlx)<0?errlx+=dx,slx:0); - lyleft+=rly+((errly-=ndly)<0?errly+=dx,sly:0); + const float cbs = cimg::cut((float)lig[c*lwhd],0,2); + const tc col = color[c]; + const Tfloat val = cbs<=1?cbs*col:(2 - cbs)*col + (cbs - 1)*_sc_maxval; + ptrd[c*_sc_whd] = (T)(opacity>=1?val:val*_sc_nopacity + ptrd[c*_sc_whd]*_sc_copacity); + } + } + ++ptrd; ++ptrz; } - zr+=pzr; zl+=pzl; + } } return *this; } @@ -44166,22 +46406,22 @@ \param ty1 Y-coordinate of the second vertex in the texture image. \param tx2 X-coordinate of the third vertex in the texture image. \param ty2 Y-coordinate of the third vertex in the texture image. - \param brightness0 Brightness factor of the first vertex. - \param brightness1 Brightness factor of the second vertex. - \param brightness2 Brightness factor of the third vertex. + \param bs0 Brightness factor of the first vertex. + \param bs1 Brightness factor of the second vertex. + \param bs2 Brightness factor of the third vertex. \param opacity Drawing opacity. **/ template - CImg& draw_triangle(const int x0, const int y0, - const int x1, const int y1, - const int x2, const int y2, + CImg& draw_triangle(int x0, int y0, + int x1, int y1, + int x2, int y2, const CImg& texture, - const int tx0, const int ty0, - const int tx1, const int ty1, - const int tx2, const int ty2, - const float brightness0, - const float brightness1, - const float brightness2, + int tx0, int ty0, + int tx1, int ty1, + int tx2, int ty2, + float bs0, + float bs1, + float bs2, const float opacity=1) { if (is_empty()) return *this; if (texture._depth>1 || texture._spectrum<_spectrum) @@ -44191,74 +46431,65 @@ texture._width,texture._height,texture._depth,texture._spectrum,texture._data); if (is_overlapped(texture)) return draw_triangle(x0,y0,x1,y1,x2,y2,+texture,tx0,ty0,tx1,ty1,tx2,ty2, - brightness0,brightness1,brightness2,opacity); - static const T maxval = (T)std::min(cimg::type::max(),cimg::type::max()); - const float nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f); - const ulongT - whd = (ulongT)_width*_height*_depth, - twh = (ulongT)texture._width*texture._height, - offx = _spectrum*whd - 1; - int nx0 = x0, ny0 = y0, nx1 = x1, ny1 = y1, nx2 = x2, ny2 = y2, - ntx0 = tx0, nty0 = ty0, ntx1 = tx1, nty1 = ty1, ntx2 = tx2, nty2 = ty2, - nc0 = (int)((brightness0<0.f?0.f:(brightness0>2.f?2.f:brightness0))*256.f), - nc1 = (int)((brightness1<0.f?0.f:(brightness1>2.f?2.f:brightness1))*256.f), - nc2 = (int)((brightness2<0.f?0.f:(brightness2>2.f?2.f:brightness2))*256.f); - if (ny0>ny1) cimg::swap(nx0,nx1,ny0,ny1,ntx0,ntx1,nty0,nty1,nc0,nc1); - if (ny0>ny2) cimg::swap(nx0,nx2,ny0,ny2,ntx0,ntx2,nty0,nty2,nc0,nc2); - if (ny1>ny2) cimg::swap(nx1,nx2,ny1,ny2,ntx1,ntx2,nty1,nty2,nc1,nc2); - if (ny0>=height() || ny2<0) return *this; - _cimg_for_triangle4(*this,xleft0,cleft0,txleft0,tyleft0,xright0,cright0,txright0,tyright0,y, - nx0,ny0,nc0,ntx0,nty0,nx1,ny1,nc1,ntx1,nty1,nx2,ny2,nc2,ntx2,nty2) { + bs0,bs1,bs2,opacity); + + if (y0>y1) cimg::swap(x0,x1,y0,y1,tx0,tx1,ty0,ty1,bs0,bs1); + if (y0>y2) cimg::swap(x0,x2,y0,y2,tx0,tx2,ty0,ty2,bs0,bs2); + if (y1>y2) cimg::swap(x1,x2,y1,y2,tx1,tx2,ty1,ty2,bs1,bs2); + if (y2<0 || y0>=height() || cimg::min(x0,x1,x2)>=width() || cimg::max(x0,x1,x2)<0 || !opacity) return *this; + + const int + w1 = width() - 1, h1 = height() - 1, + dx01 = x1 - x0, dx02 = x2 - x0, dx12 = x2 - x1, + dy01 = std::max(1,y1 - y0), dy02 = std::max(1,y2 - y0), dy12 = std::max(1,y2 - y1), + cy0 = cimg::cut(y0,0,h1), cy2 = cimg::cut(y2,0,h1), + hdy01 = dy01*cimg::sign(dx01)/2, hdy02 = dy02*cimg::sign(dx02)/2, hdy12 = dy12*cimg::sign(dx12)/2, + dtx01 = tx1 - tx0, dtx02 = tx2 - tx0, dtx12 = tx2 - tx1, + dty01 = ty1 - ty0, dty02 = ty2 - ty0, dty12 = ty2 - ty1, + hdy01tx = dy01*cimg::sign(dtx01)/2, hdy02tx = dy02*cimg::sign(dtx02)/2, hdy12tx = dy12*cimg::sign(dtx12)/2, + hdy01ty = dy01*cimg::sign(dty01)/2, hdy02ty = dy02*cimg::sign(dty02)/2, hdy12ty = dy12*cimg::sign(dty12)/2; + const float dbs01 = bs1 - bs0, dbs02 = bs2 - bs0, dbs12 = bs2 - bs1; + + const ulongT twhd = (ulongT)texture._width*texture._height*texture._depth; + cimg_init_scanline(opacity); + + for (int y = cy0; y<=cy2; ++y) { + const int yy0 = y - y0, yy1 = y - y1; int - xleft = xleft0, xright = xright0, - cleft = cleft0, cright = cright0, - txleft = txleft0, txright = txright0, - tyleft = tyleft0, tyright = tyright0; - if (xrightcleft?cright - cleft:cleft - cright, - dtx = txright>txleft?txright - txleft:txleft - txright, - dty = tyright>tyleft?tyright - tyleft:tyleft - tyright, - rc = dx?(cright - cleft)/dx:0, - rtx = dx?(txright - txleft)/dx:0, - rty = dx?(tyright - tyleft)/dx:0, - sc = cright>cleft?1:-1, - stx = txright>txleft?1:-1, - sty = tyright>tyleft?1:-1, - ndc = dc - (dx?dx*(dc/dx):0), - ndtx = dtx - (dx?dx*(dtx/dx):0), - ndty = dty - (dx?dx*(dty/dx):0); - int errc = dx>>1, errtx = errc, errty = errc; - if (xleft<0 && dx) { - cleft-=xleft*(cright - cleft)/dx; - txleft-=xleft*(txright - txleft)/dx; - tyleft-=xleft*(tyright - tyleft)/dx; - } - if (xleft<0) xleft = 0; - if (xright>=width() - 1) xright = width() - 1; - T* ptrd = data(xleft,y,0,0); - if (opacity>=1) for (int x = xleft; x<=xright; ++x) { - const tc *col = &texture._atXY(txleft,tyleft); - cimg_forC(*this,c) { - *ptrd = (T)(cleft<256?cleft**col/256:((512 - cleft)**col + (cleft - 256)*maxval)/256); - ptrd+=whd; col+=twh; + xm = yxM) cimg::swap(xm,xM,txm,txM,tym,tyM,bsm,bsM); + if (xM>=0 || xm<=w1) { + const int + cxm = cimg::cut(xm,0,w1), + cxM = cimg::cut(xM,0,w1); + T *ptrd = data(cxm,y); + const int + dxmM = std::max(1,xM - xm), hdxmM = dxmM/2, + dtxmM = txM - txm, dtymM = tyM - tym; + const float dbsmM = bsM - bsm; + + for (int x = cxm; x=1?val:val*_sc_nopacity + ptrd[c*_sc_whd]*_sc_copacity); + } + ++ptrd; } - ptrd-=offx; - cleft+=rc+((errc-=ndc)<0?errc+=dx,sc:0); - txleft+=rtx+((errtx-=ndtx)<0?errtx+=dx,stx:0); - tyleft+=rty+((errty-=ndty)<0?errty+=dx,sty:0); - } else for (int x = xleft; x<=xright; ++x) { - const tc *col = &texture._atXY(txleft,tyleft); - cimg_forC(*this,c) { - const T val = (T)(cleft<256?cleft**col/256:((512 - cleft)**col + (cleft - 256)*maxval)/256); - *ptrd = (T)(nopacity*val + *ptrd*copacity); - ptrd+=whd; col+=twh; - } - ptrd-=offx; - cleft+=rc+((errc-=ndc)<0?errc+=dx,sc:0); - txleft+=rtx+((errtx-=ndtx)<0?errtx+=dx,stx:0); - tyleft+=rty+((errty-=ndty)<0?errty+=dx,sty:0); } } return *this; @@ -44266,16 +46497,16 @@ //! Draw a textured Gouraud-shaded 2D triangle, with perspective correction \overloading. template - CImg& draw_triangle(const int x0, const int y0, const float z0, - const int x1, const int y1, const float z1, - const int x2, const int y2, const float z2, + CImg& draw_triangle(int x0, int y0, const float z0, + int x1, int y1, const float z1, + int x2, int y2, const float z2, const CImg& texture, - const int tx0, const int ty0, - const int tx1, const int ty1, - const int tx2, const int ty2, - const float brightness0, - const float brightness1, - const float brightness2, + int tx0, int ty0, + int tx1, int ty1, + int tx2, int ty2, + float bs0, + float bs1, + float bs2, const float opacity=1) { if (is_empty() || z0<=0 || z1<=0 || z2<=0) return *this; if (texture._depth>1 || texture._spectrum<_spectrum) @@ -44284,95 +46515,73 @@ cimg_instance, texture._width,texture._height,texture._depth,texture._spectrum,texture._data); if (is_overlapped(texture)) return draw_triangle(x0,y0,z0,x1,y1,z1,x2,y2,z2,+texture,tx0,ty0,tx1,ty1,tx2,ty2, - brightness0,brightness1,brightness2,opacity); - static const T maxval = (T)std::min(cimg::type::max(),(T)cimg::type::max()); - const float nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f); - const ulongT - whd = (ulongT)_width*_height*_depth, - twh = (ulongT)texture._width*texture._height, - offx = _spectrum*whd - 1; - int nx0 = x0, ny0 = y0, nx1 = x1, ny1 = y1, nx2 = x2, ny2 = y2, - nc0 = (int)((brightness0<0.f?0.f:(brightness0>2.f?2.f:brightness0))*256.f), - nc1 = (int)((brightness1<0.f?0.f:(brightness1>2.f?2.f:brightness1))*256.f), - nc2 = (int)((brightness2<0.f?0.f:(brightness2>2.f?2.f:brightness2))*256.f); - float - ntx0 = tx0/z0, nty0 = ty0/z0, - ntx1 = tx1/z1, nty1 = ty1/z1, - ntx2 = tx2/z2, nty2 = ty2/z2, - nz0 = 1/z0, nz1 = 1/z1, nz2 = 1/z2; - if (ny0>ny1) cimg::swap(nx0,nx1,ny0,ny1,ntx0,ntx1,nty0,nty1,nz0,nz1,nc0,nc1); - if (ny0>ny2) cimg::swap(nx0,nx2,ny0,ny2,ntx0,ntx2,nty0,nty2,nz0,nz2,nc0,nc2); - if (ny1>ny2) cimg::swap(nx1,nx2,ny1,ny2,ntx1,ntx2,nty1,nty2,nz1,nz2,nc1,nc2); - if (ny0>=height() || ny2<0) return *this; - float - ptxl = (ntx1 - ntx0)/(ny1 - ny0), - ptxr = (ntx2 - ntx0)/(ny2 - ny0), - ptxn = (ntx2 - ntx1)/(ny2 - ny1), - ptyl = (nty1 - nty0)/(ny1 - ny0), - ptyr = (nty2 - nty0)/(ny2 - ny0), - ptyn = (nty2 - nty1)/(ny2 - ny1), - pzl = (nz1 - nz0)/(ny1 - ny0), - pzr = (nz2 - nz0)/(ny2 - ny0), - pzn = (nz2 - nz1)/(ny2 - ny1), - zr = ny0>=0?nz0:(nz0 - ny0*(nz2 - nz0)/(ny2 - ny0)), - txr = ny0>=0?ntx0:(ntx0 - ny0*(ntx2 - ntx0)/(ny2 - ny0)), - tyr = ny0>=0?nty0:(nty0 - ny0*(nty2 - nty0)/(ny2 - ny0)), - zl = ny1>=0?(ny0>=0?nz0:(nz0 - ny0*(nz1 - nz0)/(ny1 - ny0))):(pzl=pzn,(nz1 - ny1*(nz2 - nz1)/(ny2 - ny1))), - txl = ny1>=0?(ny0>=0?ntx0:(ntx0 - ny0*(ntx1 - ntx0)/(ny1 - ny0))): - (ptxl=ptxn,(ntx1 - ny1*(ntx2 - ntx1)/(ny2 - ny1))), - tyl = ny1>=0?(ny0>=0?nty0:(nty0 - ny0*(nty1 - nty0)/(ny1 - ny0))): - (ptyl=ptyn,(nty1 - ny1*(nty2 - nty1)/(ny2 - ny1))); - _cimg_for_triangle2(*this,xleft0,cleft0,xright0,cright0,y,nx0,ny0,nc0,nx1,ny1,nc1,nx2,ny2,nc2) { - if (y==ny1) { zl = nz1; txl = ntx1; tyl = nty1; pzl = pzn; ptxl = ptxn; ptyl = ptyn; } + bs0,bs1,bs2,opacity); + + float iz0 = 1/z0, iz1 = 1/z1, iz2 = 1/z2; + if (y0>y1) cimg::swap(x0,x1,y0,y1,iz0,iz1,tx0,tx1,ty0,ty1,bs0,bs1); + if (y0>y2) cimg::swap(x0,x2,y0,y2,iz0,iz2,tx0,tx2,ty0,ty2,bs0,bs2); + if (y1>y2) cimg::swap(x1,x2,y1,y2,iz1,iz2,tx1,tx2,ty1,ty2,bs1,bs2); + if (y2<0 || y0>=height() || cimg::min(x0,x1,x2)>=width() || cimg::max(x0,x1,x2)<0 || !opacity) return *this; + + const int + w1 = width() - 1, h1 = height() - 1, + dx01 = x1 - x0, dx02 = x2 - x0, dx12 = x2 - x1, + dy01 = std::max(1,y1 - y0), dy02 = std::max(1,y2 - y0), dy12 = std::max(1,y2 - y1), + cy0 = cimg::cut(y0,0,h1), cy2 = cimg::cut(y2,0,h1), + hdy01 = dy01*cimg::sign(dx01)/2, hdy02 = dy02*cimg::sign(dx02)/2, hdy12 = dy12*cimg::sign(dx12)/2; + const float + diz01 = iz1 - iz0, diz02 = iz2 - iz0, diz12 = iz2 - iz1, + txz0 = tx0*iz0, txz1 = tx1*iz1, txz2 = tx2*iz2, + tyz0 = ty0*iz0, tyz1 = ty1*iz1, tyz2 = ty2*iz2, + dtxz01 = txz1 - txz0, dtxz02 = txz2 - txz0, dtxz12 = txz2 - txz1, + dtyz01 = tyz1 - tyz0, dtyz02 = tyz2 - tyz0, dtyz12 = tyz2 - tyz1, + dbs01 = bs1 - bs0, dbs02 = bs2 - bs0, dbs12 = bs2 - bs1; + + const ulongT twhd = (ulongT)texture._width*texture._height*texture._depth; + cimg_init_scanline(opacity); + + for (int y = cy0; y<=cy2; ++y) { + const int yy0 = y - y0, yy1 = y - y1; int - xleft = xleft0, xright = xright0, - cleft = cleft0, cright = cright0; + xm = ycleft?cright - cleft:cleft - cright, - rc = dx?(cright - cleft)/dx:0, - sc = cright>cleft?1:-1, - ndc = dc - (dx?dx*(dc/dx):0); - const float - pentez = (zright - zleft)/dx, - pentetx = (txright - txleft)/dx, - pentety = (tyright - tyleft)/dx; - int errc = dx>>1; - if (xleft<0 && dx) { - cleft-=xleft*(cright - cleft)/dx; - zleft-=xleft*(zright - zleft)/dx; - txleft-=xleft*(txright - txleft)/dx; - tyleft-=xleft*(tyright - tyleft)/dx; - } - if (xleft<0) xleft = 0; - if (xright>=width() - 1) xright = width() - 1; - T* ptrd = data(xleft,y,0,0); - if (opacity>=1) for (int x = xleft; x<=xright; ++x) { - const float invz = 1/zleft; - const tc *col = &texture._atXY((int)(txleft*invz),(int)(tyleft*invz)); - cimg_forC(*this,c) { - *ptrd = (T)(cleft<256?cleft**col/256:((512 - cleft)**col + (cleft - 256)*maxval)/256); - ptrd+=whd; col+=twh; - } - ptrd-=offx; zleft+=pentez; txleft+=pentetx; tyleft+=pentety; - cleft+=rc+((errc-=ndc)<0?errc+=dx,sc:0); - } else for (int x = xleft; x<=xright; ++x) { - const float invz = 1/zleft; - const tc *col = &texture._atXY((int)(txleft*invz),(int)(tyleft*invz)); - cimg_forC(*this,c) { - const T val = (T)(cleft<256?cleft**col/256:((512 - cleft)**col + (cleft - 256)*maxval)/256); - *ptrd = (T)(nopacity*val + *ptrd*copacity); - ptrd+=whd; col+=twh; + izm = yxM) cimg::swap(xm,xM,txzm,txzM,tyzm,tyzM,izm,izM,bsm,bsM); + if (xM>=0 || xm<=w1) { + const int + cxm = cimg::cut(xm,0,w1), + cxM = cimg::cut(xM,0,w1); + T *ptrd = data(cxm,y); + const int dxmM = std::max(1,xM - xm); + const float dizmM = izM - izm, dtxzmM = txzM - txzm, dtyzmM = tyzM - tyzm, dbsmM = bsM - bsm; + + for (int x = cxm; x=1?val:val*_sc_nopacity + ptrd[c*_sc_whd]*_sc_copacity); + } + ++ptrd; } - ptrd-=offx; zleft+=pentez; txleft+=pentetx; tyleft+=pentety; - cleft+=rc+((errc-=ndc)<0?errc+=dx,sc:0); } - zr+=pzr; txr+=ptxr; tyr+=ptyr; zl+=pzl; txl+=ptxl; tyl+=ptyl; } return *this; } @@ -44380,18 +46589,17 @@ //! Draw a textured Gouraud-shaded 2D triangle, with perspective correction and z-buffering \overloading. template CImg& draw_triangle(CImg& zbuffer, - const int x0, const int y0, const float z0, - const int x1, const int y1, const float z1, - const int x2, const int y2, const float z2, + int x0, int y0, const float z0, + int x1, int y1, const float z1, + int x2, int y2, const float z2, const CImg& texture, - const int tx0, const int ty0, - const int tx1, const int ty1, - const int tx2, const int ty2, - const float brightness0, - const float brightness1, - const float brightness2, + int tx0, int ty0, + int tx1, int ty1, + int tx2, int ty2, + float bs0, + float bs1, + float bs2, const float opacity=1) { - typedef typename cimg::superset::type tzfloat; if (is_empty() || z0<=0 || z1<=0 || z2<=0) return *this; if (!is_sameXY(zbuffer)) throw CImgArgumentException(_cimg_instance @@ -44405,100 +46613,77 @@ cimg_instance, texture._width,texture._height,texture._depth,texture._spectrum,texture._data); if (is_overlapped(texture)) - return draw_triangle(zbuffer,x0,y0,z0,x1,y1,z1,x2,y2,z2,+texture,tx0,ty0,tx1,ty1,tx2,ty2, - brightness0,brightness1,brightness2,opacity); - static const T maxval = (T)std::min(cimg::type::max(),(T)cimg::type::max()); - const float nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f); - const ulongT - whd = (ulongT)_width*_height*_depth, - twh = (ulongT)texture._width*texture._height, - offx = _spectrum*whd; - int nx0 = x0, ny0 = y0, nx1 = x1, ny1 = y1, nx2 = x2, ny2 = y2, - nc0 = (int)((brightness0<0.f?0.f:(brightness0>2.f?2.f:brightness0))*256.f), - nc1 = (int)((brightness1<0.f?0.f:(brightness1>2.f?2.f:brightness1))*256.f), - nc2 = (int)((brightness2<0.f?0.f:(brightness2>2.f?2.f:brightness2))*256.f); - float - ntx0 = tx0/z0, nty0 = ty0/z0, - ntx1 = tx1/z1, nty1 = ty1/z1, - ntx2 = tx2/z2, nty2 = ty2/z2; - tzfloat nz0 = 1/(tzfloat)z0, nz1 = 1/(tzfloat)z1, nz2 = 1/(tzfloat)z2; - if (ny0>ny1) cimg::swap(nx0,nx1,ny0,ny1,ntx0,ntx1,nty0,nty1,nz0,nz1,nc0,nc1); - if (ny0>ny2) cimg::swap(nx0,nx2,ny0,ny2,ntx0,ntx2,nty0,nty2,nz0,nz2,nc0,nc2); - if (ny1>ny2) cimg::swap(nx1,nx2,ny1,ny2,ntx1,ntx2,nty1,nty2,nz1,nz2,nc1,nc2); - if (ny0>=height() || ny2<0) return *this; - float - ptxl = (ntx1 - ntx0)/(ny1 - ny0), - ptxr = (ntx2 - ntx0)/(ny2 - ny0), - ptxn = (ntx2 - ntx1)/(ny2 - ny1), - ptyl = (nty1 - nty0)/(ny1 - ny0), - ptyr = (nty2 - nty0)/(ny2 - ny0), - ptyn = (nty2 - nty1)/(ny2 - ny1), - txr = ny0>=0?ntx0:(ntx0 - ny0*(ntx2 - ntx0)/(ny2 - ny0)), - tyr = ny0>=0?nty0:(nty0 - ny0*(nty2 - nty0)/(ny2 - ny0)), - txl = ny1>=0?(ny0>=0?ntx0:(ntx0 - ny0*(ntx1 - ntx0)/(ny1 - ny0))): - (ptxl=ptxn,(ntx1 - ny1*(ntx2 - ntx1)/(ny2 - ny1))), - tyl = ny1>=0?(ny0>=0?nty0:(nty0 - ny0*(nty1 - nty0)/(ny1 - ny0))): - (ptyl=ptyn,(nty1 - ny1*(nty2 - nty1)/(ny2 - ny1))); - tzfloat - pzl = (nz1 - nz0)/(ny1 - ny0), - pzr = (nz2 - nz0)/(ny2 - ny0), - pzn = (nz2 - nz1)/(ny2 - ny1), - zr = ny0>=0?nz0:(nz0 - ny0*(nz2 - nz0)/(ny2 - ny0)), - zl = ny1>=0?(ny0>=0?nz0:(nz0 - ny0*(nz1 - nz0)/(ny1 - ny0))):(pzl=pzn,(nz1 - ny1*(nz2 - nz1)/(ny2 - ny1))); - _cimg_for_triangle2(*this,xleft0,cleft0,xright0,cright0,y,nx0,ny0,nc0,nx1,ny1,nc1,nx2,ny2,nc2) { - if (y==ny1) { zl = nz1; txl = ntx1; tyl = nty1; pzl = pzn; ptxl = ptxn; ptyl = ptyn; } - int xleft = xleft0, xright = xright0, cleft = cleft0, cright = cright0; - float txleft = txl, txright = txr, tyleft = tyl, tyright = tyr; - tzfloat zleft = zl, zright = zr; - if (xrightcleft?cright - cleft:cleft - cright, - rc = dx?(cright - cleft)/dx:0, - sc = cright>cleft?1:-1, - ndc = dc - (dx?dx*(dc/dx):0); - float pentetx = (txright - txleft)/dx, pentety = (tyright - tyleft)/dx; - const tzfloat pentez = (zright - zleft)/dx; - int errc = dx>>1; - if (xleft<0 && dx) { - cleft-=xleft*(cright - cleft)/dx; - zleft-=xleft*(zright - zleft)/dx; - txleft-=xleft*(txright - txleft)/dx; - tyleft-=xleft*(tyright - tyleft)/dx; - } - if (xleft<0) xleft = 0; - if (xright>=width() - 1) xright = width() - 1; - T* ptrd = data(xleft,y); - tz *ptrz = zbuffer.data(xleft,y); - if (opacity>=1) for (int x = xleft; x<=xright; ++x, ++ptrd, ++ptrz) { - if (zleft>=(tzfloat)*ptrz) { - *ptrz = (tz)zleft; - const tzfloat invz = 1/zleft; - const tc *col = &texture._atXY((int)(txleft*invz),(int)(tyleft*invz)); - cimg_forC(*this,c) { - *ptrd = (T)(cleft<256?cleft**col/256:((512 - cleft)**col + (cleft - 256)*maxval)/256); - ptrd+=whd; col+=twh; - } - ptrd-=offx; - } - zleft+=pentez; txleft+=pentetx; tyleft+=pentety; - cleft+=rc+((errc-=ndc)<0?errc+=dx,sc:0); - } else for (int x = xleft; x<=xright; ++x, ++ptrd, ++ptrz) { - if (zleft>=(tzfloat)*ptrz) { - *ptrz = (tz)zleft; - const tzfloat invz = 1/zleft; - const tc *col = &texture._atXY((int)(txleft*invz),(int)(tyleft*invz)); + return draw_triangle(zbuffer,x0,y0,z0,x1,y1,z1,x2,y2,z2,+texture,tx0,ty0,tx1,ty1,tx2,ty2,bs0,bs1,bs2,opacity); + + float iz0 = 1/z0, iz1 = 1/z1, iz2 = 1/z2; + if (y0>y1) cimg::swap(x0,x1,y0,y1,iz0,iz1,tx0,tx1,ty0,ty1,bs0,bs1); + if (y0>y2) cimg::swap(x0,x2,y0,y2,iz0,iz2,tx0,tx2,ty0,ty2,bs0,bs2); + if (y1>y2) cimg::swap(x1,x2,y1,y2,iz1,iz2,tx1,tx2,ty1,ty2,bs1,bs2); + if (y2<0 || y0>=height() || cimg::min(x0,x1,x2)>=width() || cimg::max(x0,x1,x2)<0 || !opacity) return *this; + + const int + w1 = width() - 1, h1 = height() - 1, + dx01 = x1 - x0, dx02 = x2 - x0, dx12 = x2 - x1, + dy01 = std::max(1,y1 - y0), dy02 = std::max(1,y2 - y0), dy12 = std::max(1,y2 - y1), + cy0 = cimg::cut(y0,0,h1), cy2 = cimg::cut(y2,0,h1), + hdy01 = dy01*cimg::sign(dx01)/2, hdy02 = dy02*cimg::sign(dx02)/2, hdy12 = dy12*cimg::sign(dx12)/2; + const float + diz01 = iz1 - iz0, diz02 = iz2 - iz0, diz12 = iz2 - iz1, + txz0 = tx0*iz0, txz1 = tx1*iz1, txz2 = tx2*iz2, + tyz0 = ty0*iz0, tyz1 = ty1*iz1, tyz2 = ty2*iz2, + dtxz01 = txz1 - txz0, dtxz02 = txz2 - txz0, dtxz12 = txz2 - txz1, + dtyz01 = tyz1 - tyz0, dtyz02 = tyz2 - tyz0, dtyz12 = tyz2 - tyz1, + dbs01 = bs1 - bs0, dbs02 = bs2 - bs0, dbs12 = bs2 - bs1; + + const ulongT twhd = (ulongT)texture._width*texture._height*texture._depth; + cimg_init_scanline(opacity); + + for (int y = cy0; y<=cy2; ++y) { + const int yy0 = y - y0, yy1 = y - y1; + int + xm = yxM) cimg::swap(xm,xM,txzm,txzM,tyzm,tyzM,izm,izM,bsm,bsM); + if (xM>=0 || xm<=w1) { + const int + cxm = cimg::cut(xm,0,w1), + cxM = cimg::cut(xM,0,w1); + T *ptrd = data(cxm,y); + tz *ptrz = zbuffer.data(cxm,y); + const int dxmM = std::max(1,xM - xm); + const float dizmM = izM - izm, dtxzmM = txzM - txzm, dtyzmM = tyzM - tyzm, dbsmM = bsM - bsm; + + for (int x = cxm; x=*ptrz) { + *ptrz = (tz)iz; + const float + txz = txzm + dtxzmM*xxm/dxmM, + tyz = tyzm + dtyzmM*xxm/dxmM, + cbs = cimg::cut(bsm + dbsmM*xxm/dxmM,0,2); + const int + tx = (int)cimg::round(txz/iz), + ty = (int)cimg::round(tyz/iz); + const tc *const color = &texture._atXY(tx,ty); cimg_forC(*this,c) { - const T val = (T)(cleft<256?cleft**col/256:((512 - cleft)**col + (cleft - 256)*maxval)/256); - *ptrd = (T)(nopacity*val + *ptrd*copacity); - ptrd+=whd; col+=twh; + const tc col = color[c*twhd]; + const Tfloat val = cbs<=1?cbs*col:(2 - cbs)*col + (cbs - 1)*_sc_maxval; + ptrd[c*_sc_whd] = (T)(opacity>=1?val:val*_sc_nopacity + ptrd[c*_sc_whd]*_sc_copacity); } - ptrd-=offx; } - zleft+=pentez; txleft+=pentetx; tyleft+=pentety; - cleft+=rc+((errc-=ndc)<0?errc+=dx,sc:0); + ++ptrd; ++ptrz; } - zr+=pzr; txr+=ptxr; tyr+=ptyr; zl+=pzl; txl+=ptxl; tyl+=ptyl; + } } return *this; } @@ -44528,17 +46713,17 @@ \param opacity Drawing opacity. **/ template - CImg& draw_triangle(const int x0, const int y0, - const int x1, const int y1, - const int x2, const int y2, + CImg& draw_triangle(int x0, int y0, + int x1, int y1, + int x2, int y2, const CImg& texture, - const int tx0, const int ty0, - const int tx1, const int ty1, - const int tx2, const int ty2, + int tx0, int ty0, + int tx1, int ty1, + int tx2, int ty2, const CImg& light, - const int lx0, const int ly0, - const int lx1, const int ly1, - const int lx2, const int ly2, + int lx0, int ly0, + int lx1, int ly1, + int lx2, int ly2, const float opacity=1) { if (is_empty()) return *this; if (texture._depth>1 || texture._spectrum<_spectrum) @@ -44554,89 +46739,73 @@ return draw_triangle(x0,y0,x1,y1,x2,y2,+texture,tx0,ty0,tx1,ty1,tx2,ty2,light,lx0,ly0,lx1,ly1,lx2,ly2,opacity); if (is_overlapped(light)) return draw_triangle(x0,y0,x1,y1,x2,y2,texture,tx0,ty0,tx1,ty1,tx2,ty2,+light,lx0,ly0,lx1,ly1,lx2,ly2,opacity); - static const T maxval = (T)std::min(cimg::type::max(),(T)cimg::type::max()); - const float nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f); + + if (y0>y1) cimg::swap(x0,x1,y0,y1,tx0,tx1,ty0,ty1,lx0,lx1,ly0,ly1); + if (y0>y2) cimg::swap(x0,x2,y0,y2,tx0,tx2,ty0,ty2,lx0,lx2,ly0,ly2); + if (y1>y2) cimg::swap(x1,x2,y1,y2,tx1,tx2,ty1,ty2,lx1,lx2,ly1,ly2); + if (y2<0 || y0>=height() || cimg::min(x0,x1,x2)>=width() || cimg::max(x0,x1,x2)<0 || !opacity) return *this; + + const int + w1 = width() - 1, h1 = height() - 1, + dx01 = x1 - x0, dx02 = x2 - x0, dx12 = x2 - x1, + dy01 = std::max(1,y1 - y0), dy02 = std::max(1,y2 - y0), dy12 = std::max(1,y2 - y1), + cy0 = cimg::cut(y0,0,h1), cy2 = cimg::cut(y2,0,h1), + hdy01 = dy01*cimg::sign(dx01)/2, hdy02 = dy02*cimg::sign(dx02)/2, hdy12 = dy12*cimg::sign(dx12)/2, + dtx01 = tx1 - tx0, dtx02 = tx2 - tx0, dtx12 = tx2 - tx1, + dty01 = ty1 - ty0, dty02 = ty2 - ty0, dty12 = ty2 - ty1, + hdy01tx = dy01*cimg::sign(dtx01)/2, hdy02tx = dy02*cimg::sign(dtx02)/2, hdy12tx = dy12*cimg::sign(dtx12)/2, + hdy01ty = dy01*cimg::sign(dty01)/2, hdy02ty = dy02*cimg::sign(dty02)/2, hdy12ty = dy12*cimg::sign(dty12)/2, + dlx01 = lx1 - lx0, dlx02 = lx2 - lx0, dlx12 = lx2 - lx1, + dly01 = ly1 - ly0, dly02 = ly2 - ly0, dly12 = ly2 - ly1, + hdy01lx = dy01*cimg::sign(dlx01)/2, hdy02lx = dy02*cimg::sign(dlx02)/2, hdy12lx = dy12*cimg::sign(dlx12)/2, + hdy01ly = dy01*cimg::sign(dly01)/2, hdy02ly = dy02*cimg::sign(dly02)/2, hdy12ly = dy12*cimg::sign(dly12)/2; + const ulongT - whd = (ulongT)_width*_height*_depth, - twh = (ulongT)texture._width*texture._height, - lwh = (ulongT)light._width*light._height, - offx = _spectrum*whd - 1; - int nx0 = x0, ny0 = y0, nx1 = x1, ny1 = y1, nx2 = x2, ny2 = y2, - ntx0 = tx0, nty0 = ty0, ntx1 = tx1, nty1 = ty1, ntx2 = tx2, nty2 = ty2, - nlx0 = lx0, nly0 = ly0, nlx1 = lx1, nly1 = ly1, nlx2 = lx2, nly2 = ly2; - if (ny0>ny1) cimg::swap(nx0,nx1,ny0,ny1,ntx0,ntx1,nty0,nty1,nlx0,nlx1,nly0,nly1); - if (ny0>ny2) cimg::swap(nx0,nx2,ny0,ny2,ntx0,ntx2,nty0,nty2,nlx0,nlx2,nly0,nly2); - if (ny1>ny2) cimg::swap(nx1,nx2,ny1,ny2,ntx1,ntx2,nty1,nty2,nlx1,nlx2,nly1,nly2); - if (ny0>=height() || ny2<0) return *this; - const bool is_bump = texture._spectrum>=_spectrum + 2; - const ulongT obx = twh*_spectrum, oby = twh*(_spectrum + 1); + twhd = (ulongT)texture._width*texture._height*texture._depth, + lwhd = (ulongT)light._width*light._height*light._depth; + cimg_init_scanline(opacity); - _cimg_for_triangle5(*this,xleft0,lxleft0,lyleft0,txleft0,tyleft0,xright0,lxright0,lyright0,txright0,tyright0,y, - nx0,ny0,nlx0,nly0,ntx0,nty0,nx1,ny1,nlx1,nly1,ntx1,nty1,nx2,ny2,nlx2,nly2,ntx2,nty2) { + for (int y = cy0; y<=cy2; ++y) { + const int yy0 = y - y0, yy1 = y - y1; int - xleft = xleft0, xright = xright0, - lxleft = lxleft0, lxright = lxright0, - lyleft = lyleft0, lyright = lyright0, - txleft = txleft0, txright = txright0, - tyleft = tyleft0, tyright = tyright0; - if (xrightlxleft?lxright - lxleft:lxleft - lxright, - dly = lyright>lyleft?lyright - lyleft:lyleft - lyright, - dtx = txright>txleft?txright - txleft:txleft - txright, - dty = tyright>tyleft?tyright - tyleft:tyleft - tyright, - rlx = dx?(lxright - lxleft)/dx:0, - rly = dx?(lyright - lyleft)/dx:0, - rtx = dx?(txright - txleft)/dx:0, - rty = dx?(tyright - tyleft)/dx:0, - slx = lxright>lxleft?1:-1, - sly = lyright>lyleft?1:-1, - stx = txright>txleft?1:-1, - sty = tyright>tyleft?1:-1, - ndlx = dlx - (dx?dx*(dlx/dx):0), - ndly = dly - (dx?dx*(dly/dx):0), - ndtx = dtx - (dx?dx*(dtx/dx):0), - ndty = dty - (dx?dx*(dty/dx):0); - int errlx = dx>>1, errly = errlx, errtx = errlx, errty = errlx; - if (xleft<0 && dx) { - lxleft-=xleft*(lxright - lxleft)/dx; - lyleft-=xleft*(lyright - lyleft)/dx; - txleft-=xleft*(txright - txleft)/dx; - tyleft-=xleft*(tyright - tyleft)/dx; - } - if (xleft<0) xleft = 0; - if (xright>=width() - 1) xright = width() - 1; - T* ptrd = data(xleft,y,0,0); - if (opacity>=1) for (int x = xleft; x<=xright; ++x) { - const tc *col = &texture._atXY(txleft,tyleft); - const int bx = is_bump?128 - (int)col[obx]:0, by = is_bump?128 - (int)col[oby]:0; - const tl *lig = &light._atXY(lxleft + bx,lyleft + by); - cimg_forC(*this,c) { - const tl l = *lig; - *ptrd = (T)(l<1?l**col:(2 - l)**col + (l - 1)*maxval); - ptrd+=whd; col+=twh; lig+=lwh; - } - ptrd-=offx; - lxleft+=rlx+((errlx-=ndlx)<0?errlx+=dx,slx:0); - lyleft+=rly+((errly-=ndly)<0?errly+=dx,sly:0); - txleft+=rtx+((errtx-=ndtx)<0?errtx+=dx,stx:0); - tyleft+=rty+((errty-=ndty)<0?errty+=dx,sty:0); - } else for (int x = xleft; x<=xright; ++x) { - const tc *col = &texture._atXY(txleft,tyleft); - const int bx = is_bump?128 - (int)col[obx]:0, by = is_bump?128 - (int)col[oby]:0; - const tl *lig = &light._atXY(lxleft + bx,lyleft + by); - cimg_forC(*this,c) { - const tl l = *lig; - const T val = (T)(l<1?l**col:(2 - l)**col + (l - 1)*maxval); - *ptrd = (T)(nopacity*val + *ptrd*copacity); - ptrd+=whd; col+=twh; lig+=lwh; - } - ptrd-=offx; - lxleft+=rlx+((errlx-=ndlx)<0?errlx+=dx,slx:0); - lyleft+=rly+((errly-=ndly)<0?errly+=dx,sly:0); - txleft+=rtx+((errtx-=ndtx)<0?errtx+=dx,stx:0); - tyleft+=rty+((errty-=ndty)<0?errty+=dx,sty:0); + xm = yxM) cimg::swap(xm,xM,txm,txM,tym,tyM,lxm,lxM,lym,lyM); + if (xM>=0 || xm<=w1) { + const int + cxm = cimg::cut(xm,0,w1), + cxM = cimg::cut(xM,0,w1); + T *ptrd = data(cxm,y); + const int + dxmM = std::max(1,xM - xm), hdxmM = dxmM/2, + dtxmM = txM - txm, dtymM = tyM - tym, + dlxmM = lxM - lxm, dlymM = lyM - lym; + + for (int x = cxm; x=1?val:val*_sc_nopacity + ptrd[c*_sc_whd]*_sc_copacity); + } + ++ptrd; + } } } return *this; @@ -44644,17 +46813,17 @@ //! Draw a textured Phong-shaded 2D triangle, with perspective correction. template - CImg& draw_triangle(const int x0, const int y0, const float z0, - const int x1, const int y1, const float z1, - const int x2, const int y2, const float z2, + CImg& draw_triangle(int x0, int y0, const float z0, + int x1, int y1, const float z1, + int x2, int y2, const float z2, const CImg& texture, - const int tx0, const int ty0, - const int tx1, const int ty1, - const int tx2, const int ty2, + int tx0, int ty0, + int tx1, int ty1, + int tx2, int ty2, const CImg& light, - const int lx0, const int ly0, - const int lx1, const int ly1, - const int lx2, const int ly2, + int lx0, int ly0, + int lx1, int ly1, + int lx2, int ly2, const float opacity=1) { if (is_empty() || z0<=0 || z1<=0 || z2<=0) return *this; if (texture._depth>1 || texture._spectrum<_spectrum) @@ -44672,112 +46841,87 @@ if (is_overlapped(light)) return draw_triangle(x0,y0,z0,x1,y1,z1,x2,y2,z2,texture,tx0,ty0,tx1,ty1,tx2,ty2, +light,lx0,ly0,lx1,ly1,lx2,ly2,opacity); - static const T maxval = (T)std::min(cimg::type::max(),(T)cimg::type::max()); - const float nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f); + + float iz0 = 1/z0, iz1 = 1/z1, iz2 = 1/z2; + if (y0>y1) cimg::swap(x0,x1,y0,y1,iz0,iz1,tx0,tx1,ty0,ty1,lx0,lx1,ly0,ly1); + if (y0>y2) cimg::swap(x0,x2,y0,y2,iz0,iz2,tx0,tx2,ty0,ty2,lx0,lx2,ly0,ly2); + if (y1>y2) cimg::swap(x1,x2,y1,y2,iz1,iz2,tx1,tx2,ty1,ty2,lx1,lx2,ly1,ly2); + if (y2<0 || y0>=height() || cimg::min(x0,x1,x2)>=width() || cimg::max(x0,x1,x2)<0 || !opacity) return *this; + + const int + w1 = width() - 1, h1 = height() - 1, + dx01 = x1 - x0, dx02 = x2 - x0, dx12 = x2 - x1, + dy01 = std::max(1,y1 - y0), dy02 = std::max(1,y2 - y0), dy12 = std::max(1,y2 - y1), + cy0 = cimg::cut(y0,0,h1), cy2 = cimg::cut(y2,0,h1), + hdy01 = dy01*cimg::sign(dx01)/2, hdy02 = dy02*cimg::sign(dx02)/2, hdy12 = dy12*cimg::sign(dx12)/2; + const float + diz01 = iz1 - iz0, diz02 = iz2 - iz0, diz12 = iz2 - iz1, + txz0 = tx0*iz0, txz1 = tx1*iz1, txz2 = tx2*iz2, + tyz0 = ty0*iz0, tyz1 = ty1*iz1, tyz2 = ty2*iz2, + dtxz01 = txz1 - txz0, dtxz02 = txz2 - txz0, dtxz12 = txz2 - txz1, + dtyz01 = tyz1 - tyz0, dtyz02 = tyz2 - tyz0, dtyz12 = tyz2 - tyz1, + lxz0 = lx0*iz0, lxz1 = lx1*iz1, lxz2 = lx2*iz2, + lyz0 = ly0*iz0, lyz1 = ly1*iz1, lyz2 = ly2*iz2, + dlxz01 = lxz1 - lxz0, dlxz02 = lxz2 - lxz0, dlxz12 = lxz2 - lxz1, + dlyz01 = lyz1 - lyz0, dlyz02 = lyz2 - lyz0, dlyz12 = lyz2 - lyz1; + const ulongT - whd = (ulongT)_width*_height*_depth, - twh = (ulongT)texture._width*texture._height, - lwh = (ulongT)light._width*light._height, - offx = _spectrum*whd - 1; - int nx0 = x0, ny0 = y0, nx1 = x1, ny1 = y1, nx2 = x2, ny2 = y2, - nlx0 = lx0, nly0 = ly0, nlx1 = lx1, nly1 = ly1, nlx2 = lx2, nly2 = ly2; - float - ntx0 = tx0/z0, nty0 = ty0/z0, - ntx1 = tx1/z1, nty1 = ty1/z1, - ntx2 = tx2/z2, nty2 = ty2/z2, - nz0 = 1/z0, nz1 = 1/z1, nz2 = 1/z2; - if (ny0>ny1) cimg::swap(nx0,nx1,ny0,ny1,ntx0,ntx1,nty0,nty1,nlx0,nlx1,nly0,nly1,nz0,nz1); - if (ny0>ny2) cimg::swap(nx0,nx2,ny0,ny2,ntx0,ntx2,nty0,nty2,nlx0,nlx2,nly0,nly2,nz0,nz2); - if (ny1>ny2) cimg::swap(nx1,nx2,ny1,ny2,ntx1,ntx2,nty1,nty2,nlx1,nlx2,nly1,nly2,nz1,nz2); - if (ny0>=height() || ny2<0) return *this; - float - ptxl = (ntx1 - ntx0)/(ny1 - ny0), - ptxr = (ntx2 - ntx0)/(ny2 - ny0), - ptxn = (ntx2 - ntx1)/(ny2 - ny1), - ptyl = (nty1 - nty0)/(ny1 - ny0), - ptyr = (nty2 - nty0)/(ny2 - ny0), - ptyn = (nty2 - nty1)/(ny2 - ny1), - pzl = (nz1 - nz0)/(ny1 - ny0), - pzr = (nz2 - nz0)/(ny2 - ny0), - pzn = (nz2 - nz1)/(ny2 - ny1), - zr = ny0>=0?nz0:(nz0 - ny0*(nz2 - nz0)/(ny2 - ny0)), - txr = ny0>=0?ntx0:(ntx0 - ny0*(ntx2 - ntx0)/(ny2 - ny0)), - tyr = ny0>=0?nty0:(nty0 - ny0*(nty2 - nty0)/(ny2 - ny0)), - zl = ny1>=0?(ny0>=0?nz0:(nz0 - ny0*(nz1 - nz0)/(ny1 - ny0))):(pzl=pzn,(nz1 - ny1*(nz2 - nz1)/(ny2 - ny1))), - txl = ny1>=0?(ny0>=0?ntx0:(ntx0 - ny0*(ntx1 - ntx0)/(ny1 - ny0))): - (ptxl=ptxn,(ntx1 - ny1*(ntx2 - ntx1)/(ny2 - ny1))), - tyl = ny1>=0?(ny0>=0?nty0:(nty0 - ny0*(nty1 - nty0)/(ny1 - ny0))): - (ptyl=ptyn,(nty1 - ny1*(nty2 - nty1)/(ny2 - ny1))); - const bool is_bump = texture._spectrum>=_spectrum + 2; - const ulongT obx = twh*_spectrum, oby = twh*(_spectrum + 1); - - _cimg_for_triangle3(*this,xleft0,lxleft0,lyleft0,xright0,lxright0,lyright0,y, - nx0,ny0,nlx0,nly0,nx1,ny1,nlx1,nly1,nx2,ny2,nlx2,nly2) { - if (y==ny1) { zl = nz1; txl = ntx1; tyl = nty1; pzl = pzn; ptxl = ptxn; ptyl = ptyn; } + twhd = (ulongT)texture._width*texture._height*texture._depth, + lwhd = (ulongT)light._width*light._height*light._depth; + cimg_init_scanline(opacity); + + for (int y = cy0; y<=cy2; ++y) { + const int yy0 = y - y0, yy1 = y - y1; int - xleft = xleft0, xright = xright0, - lxleft = lxleft0, lxright = lxright0, - lyleft = lyleft0, lyright = lyright0; + xm = ylxleft?lxright - lxleft:lxleft - lxright, - dly = lyright>lyleft?lyright - lyleft:lyleft - lyright, - rlx = dx?(lxright - lxleft)/dx:0, - rly = dx?(lyright - lyleft)/dx:0, - slx = lxright>lxleft?1:-1, - sly = lyright>lyleft?1:-1, - ndlx = dlx - (dx?dx*(dlx/dx):0), - ndly = dly - (dx?dx*(dly/dx):0); - const float - pentez = (zright - zleft)/dx, - pentetx = (txright - txleft)/dx, - pentety = (tyright - tyleft)/dx; - int errlx = dx>>1, errly = errlx; - if (xleft<0 && dx) { - zleft-=xleft*(zright - zleft)/dx; - lxleft-=xleft*(lxright - lxleft)/dx; - lyleft-=xleft*(lyright - lyleft)/dx; - txleft-=xleft*(txright - txleft)/dx; - tyleft-=xleft*(tyright - tyleft)/dx; - } - if (xleft<0) xleft = 0; - if (xright>=width() - 1) xright = width() - 1; - T* ptrd = data(xleft,y,0,0); - if (opacity>=1) for (int x = xleft; x<=xright; ++x) { - const float invz = 1/zleft; - const tc *col = &texture._atXY((int)(txleft*invz),(int)(tyleft*invz)); - const int bx = is_bump?128 - (int)col[obx]:0, by = is_bump?128 - (int)col[oby]:0; - const tl *lig = &light._atXY(lxleft + bx,lyleft + by); - cimg_forC(*this,c) { - const tl l = *lig; - *ptrd = (T)(l<1?l**col:(2 - l)**col + (l - 1)*maxval); - ptrd+=whd; col+=twh; lig+=lwh; - } - ptrd-=offx; zleft+=pentez; txleft+=pentetx; tyleft+=pentety; - lxleft+=rlx+((errlx-=ndlx)<0?errlx+=dx,slx:0); - lyleft+=rly+((errly-=ndly)<0?errly+=dx,sly:0); - } else for (int x = xleft; x<=xright; ++x) { - const float invz = 1/zleft; - const tc *col = &texture._atXY((int)(txleft*invz),(int)(tyleft*invz)); - const int bx = is_bump?128 - (int)col[obx]:0, by = is_bump?128 - (int)col[oby]:0; - const tl *lig = &light._atXY(lxleft + bx,lyleft + by); - cimg_forC(*this,c) { - const tl l = *lig; - const T val = (T)(l<1?l**col:(2 - l)**col + (l - 1)*maxval); - *ptrd = (T)(nopacity*val + *ptrd*copacity); - ptrd+=whd; col+=twh; lig+=lwh; - } - ptrd-=offx; zleft+=pentez; txleft+=pentetx; tyleft+=pentety; - lxleft+=rlx+((errlx-=ndlx)<0?errlx+=dx,slx:0); - lyleft+=rly+((errly-=ndly)<0?errly+=dx,sly:0); + izm = yxM) cimg::swap(xm,xM,izm,izM,txzm,txzM,tyzm,tyzM,lxzm,lxzM,lyzm,lyzM); + if (xM>=0 || xm<=w1) { + const int + cxm = cimg::cut(xm,0,w1), + cxM = cimg::cut(xM,0,w1); + T *ptrd = data(cxm,y); + const int dxmM = std::max(1,xM - xm); + const float + dizmM = izM - izm, + dtxzmM = txzM - txzm, dtyzmM = tyzM - tyzm, + dlxzmM = lxzM - lxzm, dlyzmM = lyzM - lyzm; + + for (int x = cxm; x=1?val:val*_sc_nopacity + ptrd[c*_sc_whd]*_sc_copacity); + } + ++ptrd; + } } - zr+=pzr; txr+=ptxr; tyr+=ptyr; zl+=pzl; txl+=ptxl; tyl+=ptyl; } return *this; } @@ -44785,19 +46929,18 @@ //! Draw a textured Phong-shaded 2D triangle, with perspective correction and z-buffering. template CImg& draw_triangle(CImg& zbuffer, - const int x0, const int y0, const float z0, - const int x1, const int y1, const float z1, - const int x2, const int y2, const float z2, + int x0, int y0, const float z0, + int x1, int y1, const float z1, + int x2, int y2, const float z2, const CImg& texture, - const int tx0, const int ty0, - const int tx1, const int ty1, - const int tx2, const int ty2, + int tx0, int ty0, + int tx1, int ty1, + int tx2, int ty2, const CImg& light, - const int lx0, const int ly0, - const int lx1, const int ly1, - const int lx2, const int ly2, + int lx0, int ly0, + int lx1, int ly1, + int lx2, int ly2, const float opacity=1) { - typedef typename cimg::superset::type tzfloat; if (is_empty() || z0<=0 || z1<=0 || z2<=0) return *this; if (!is_sameXY(zbuffer)) throw CImgArgumentException(_cimg_instance @@ -44820,118 +46963,91 @@ if (is_overlapped(light)) return draw_triangle(zbuffer,x0,y0,z0,x1,y1,z1,x2,y2,z2, texture,tx0,ty0,tx1,ty1,tx2,ty2,+light,lx0,ly0,lx1,ly1,lx2,ly2,opacity); - static const T maxval = (T)std::min(cimg::type::max(),(T)cimg::type::max()); - const float nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f); + + float iz0 = 1/z0, iz1 = 1/z1, iz2 = 1/z2; + if (y0>y1) cimg::swap(x0,x1,y0,y1,iz0,iz1,tx0,tx1,ty0,ty1,lx0,lx1,ly0,ly1); + if (y0>y2) cimg::swap(x0,x2,y0,y2,iz0,iz2,tx0,tx2,ty0,ty2,lx0,lx2,ly0,ly2); + if (y1>y2) cimg::swap(x1,x2,y1,y2,iz1,iz2,tx1,tx2,ty1,ty2,lx1,lx2,ly1,ly2); + if (y2<0 || y0>=height() || cimg::min(x0,x1,x2)>=width() || cimg::max(x0,x1,x2)<0 || !opacity) return *this; + + const int + w1 = width() - 1, h1 = height() - 1, + dx01 = x1 - x0, dx02 = x2 - x0, dx12 = x2 - x1, + dy01 = std::max(1,y1 - y0), dy02 = std::max(1,y2 - y0), dy12 = std::max(1,y2 - y1), + cy0 = cimg::cut(y0,0,h1), cy2 = cimg::cut(y2,0,h1), + hdy01 = dy01*cimg::sign(dx01)/2, hdy02 = dy02*cimg::sign(dx02)/2, hdy12 = dy12*cimg::sign(dx12)/2; + const float + diz01 = iz1 - iz0, diz02 = iz2 - iz0, diz12 = iz2 - iz1, + txz0 = tx0*iz0, txz1 = tx1*iz1, txz2 = tx2*iz2, + tyz0 = ty0*iz0, tyz1 = ty1*iz1, tyz2 = ty2*iz2, + dtxz01 = txz1 - txz0, dtxz02 = txz2 - txz0, dtxz12 = txz2 - txz1, + dtyz01 = tyz1 - tyz0, dtyz02 = tyz2 - tyz0, dtyz12 = tyz2 - tyz1, + lxz0 = lx0*iz0, lxz1 = lx1*iz1, lxz2 = lx2*iz2, + lyz0 = ly0*iz0, lyz1 = ly1*iz1, lyz2 = ly2*iz2, + dlxz01 = lxz1 - lxz0, dlxz02 = lxz2 - lxz0, dlxz12 = lxz2 - lxz1, + dlyz01 = lyz1 - lyz0, dlyz02 = lyz2 - lyz0, dlyz12 = lyz2 - lyz1; + const ulongT - whd = (ulongT)_width*_height*_depth, - twh = (ulongT)texture._width*texture._height, - lwh = (ulongT)light._width*light._height, - offx = _spectrum*whd; - int nx0 = x0, ny0 = y0, nx1 = x1, ny1 = y1, nx2 = x2, ny2 = y2, - nlx0 = lx0, nly0 = ly0, nlx1 = lx1, nly1 = ly1, nlx2 = lx2, nly2 = ly2; - float - ntx0 = tx0/z0, nty0 = ty0/z0, - ntx1 = tx1/z1, nty1 = ty1/z1, - ntx2 = tx2/z2, nty2 = ty2/z2; - tzfloat nz0 = 1/(tzfloat)z0, nz1 = 1/(tzfloat)z1, nz2 = 1/(tzfloat)z2; - if (ny0>ny1) cimg::swap(nx0,nx1,ny0,ny1,ntx0,ntx1,nty0,nty1,nlx0,nlx1,nly0,nly1,nz0,nz1); - if (ny0>ny2) cimg::swap(nx0,nx2,ny0,ny2,ntx0,ntx2,nty0,nty2,nlx0,nlx2,nly0,nly2,nz0,nz2); - if (ny1>ny2) cimg::swap(nx1,nx2,ny1,ny2,ntx1,ntx2,nty1,nty2,nlx1,nlx2,nly1,nly2,nz1,nz2); - if (ny0>=height() || ny2<0) return *this; - float - ptxl = (ntx1 - ntx0)/(ny1 - ny0), - ptxr = (ntx2 - ntx0)/(ny2 - ny0), - ptxn = (ntx2 - ntx1)/(ny2 - ny1), - ptyl = (nty1 - nty0)/(ny1 - ny0), - ptyr = (nty2 - nty0)/(ny2 - ny0), - ptyn = (nty2 - nty1)/(ny2 - ny1), - txr = ny0>=0?ntx0:(ntx0 - ny0*(ntx2 - ntx0)/(ny2 - ny0)), - tyr = ny0>=0?nty0:(nty0 - ny0*(nty2 - nty0)/(ny2 - ny0)), - txl = ny1>=0?(ny0>=0?ntx0:(ntx0 - ny0*(ntx1 - ntx0)/(ny1 - ny0))): - (ptxl=ptxn,(ntx1 - ny1*(ntx2 - ntx1)/(ny2 - ny1))), - tyl = ny1>=0?(ny0>=0?nty0:(nty0 - ny0*(nty1 - nty0)/(ny1 - ny0))): - (ptyl=ptyn,(nty1 - ny1*(nty2 - nty1)/(ny2 - ny1))); - tzfloat - pzl = (nz1 - nz0)/(ny1 - ny0), - pzr = (nz2 - nz0)/(ny2 - ny0), - pzn = (nz2 - nz1)/(ny2 - ny1), - zr = ny0>=0?nz0:(nz0 - ny0*(nz2 - nz0)/(ny2 - ny0)), - zl = ny1>=0?(ny0>=0?nz0:(nz0 - ny0*(nz1 - nz0)/(ny1 - ny0))):(pzl=pzn,(nz1 - ny1*(nz2 - nz1)/(ny2 - ny1))); - const bool is_bump = texture._spectrum>=_spectrum + 2; - const ulongT obx = twh*_spectrum, oby = twh*(_spectrum + 1); - - _cimg_for_triangle3(*this,xleft0,lxleft0,lyleft0,xright0,lxright0,lyright0,y, - nx0,ny0,nlx0,nly0,nx1,ny1,nlx1,nly1,nx2,ny2,nlx2,nly2) { - if (y==ny1) { zl = nz1; txl = ntx1; tyl = nty1; pzl = pzn; ptxl = ptxn; ptyl = ptyn; } + twhd = (ulongT)texture._width*texture._height*texture._depth, + lwhd = (ulongT)light._width*light._height*light._depth; + cimg_init_scanline(opacity); + + for (int y = cy0; y<=cy2; ++y) { + const int yy0 = y - y0, yy1 = y - y1; int - xleft = xleft0, xright = xright0, - lxleft = lxleft0, lxright = lxright0, - lyleft = lyleft0, lyright = lyright0; - float txleft = txl, txright = txr, tyleft = tyl, tyright = tyr; - tzfloat zleft = zl, zright = zr; - if (xrightlxleft?lxright - lxleft:lxleft - lxright, - dly = lyright>lyleft?lyright - lyleft:lyleft - lyright, - rlx = dx?(lxright - lxleft)/dx:0, - rly = dx?(lyright - lyleft)/dx:0, - slx = lxright>lxleft?1:-1, - sly = lyright>lyleft?1:-1, - ndlx = dlx - (dx?dx*(dlx/dx):0), - ndly = dly - (dx?dx*(dly/dx):0); - float pentetx = (txright - txleft)/dx, pentety = (tyright - tyleft)/dx; - const tzfloat pentez = (zright - zleft)/dx; - int errlx = dx>>1, errly = errlx; - if (xleft<0 && dx) { - zleft-=xleft*(zright - zleft)/dx; - lxleft-=xleft*(lxright - lxleft)/dx; - lyleft-=xleft*(lyright - lyleft)/dx; - txleft-=xleft*(txright - txleft)/dx; - tyleft-=xleft*(tyright - tyleft)/dx; - } - if (xleft<0) xleft = 0; - if (xright>=width() - 1) xright = width() - 1; - T* ptrd = data(xleft,y); - tz *ptrz = zbuffer.data(xleft,y); - if (opacity>=1) for (int x = xleft; x<=xright; ++x, ++ptrz, ++ptrd) { - if (zleft>=(tzfloat)*ptrz) { - *ptrz = (tz)zleft; - const tzfloat invz = 1/zleft; - const tc *col = &texture._atXY((int)(txleft*invz),(int)(tyleft*invz)); - const int bx = is_bump?128 - (int)col[obx]:0, by = is_bump?128 - (int)col[oby]:0; - const tl *lig = &light._atXY(lxleft + bx,lyleft + by); - cimg_forC(*this,c) { - const tl l = *lig; - *ptrd = (T)(l<1?l**col:(2 - l)**col + (l - 1)*maxval); - ptrd+=whd; col+=twh; lig+=lwh; - } - ptrd-=offx; - } - zleft+=pentez; txleft+=pentetx; tyleft+=pentety; - lxleft+=rlx+((errlx-=ndlx)<0?errlx+=dx,slx:0); - lyleft+=rly+((errly-=ndly)<0?errly+=dx,sly:0); - } else for (int x = xleft; x<=xright; ++x, ++ptrz, ++ptrd) { - if (zleft>=(tzfloat)*ptrz) { - *ptrz = (tz)zleft; - const tzfloat invz = 1/zleft; - const tc *col = &texture._atXY((int)(txleft*invz),(int)(tyleft*invz)); - const int bx = is_bump?128 - (int)col[obx]:0, by = is_bump?128 - (int)col[oby]:0; - const tl *lig = &light._atXY(lxleft + bx,lyleft + by); + xm = yxM) cimg::swap(xm,xM,izm,izM,txzm,txzM,tyzm,tyzM,lxzm,lxzM,lyzm,lyzM); + if (xM>=0 || xm<=w1) { + const int + cxm = cimg::cut(xm,0,w1), + cxM = cimg::cut(xM,0,w1); + T *ptrd = data(cxm,y); + tz *ptrz = zbuffer.data(cxm,y); + const int dxmM = std::max(1,xM - xm); + const float + dizmM = izM - izm, + dtxzmM = txzM - txzm, dtyzmM = tyzM - tyzm, + dlxzmM = lxzM - lxzm, dlyzmM = lyzM - lyzm; + + for (int x = cxm; x=*ptrz) { + *ptrz = (tz)iz; + const float + txz = txzm + dtxzmM*xxm/dxmM, + tyz = tyzm + dtyzmM*xxm/dxmM, + lxz = lxzm + dlxzmM*xxm/dxmM, + lyz = lyzm + dlyzmM*xxm/dxmM; + const int + tx = (int)cimg::round(txz/iz), + ty = (int)cimg::round(tyz/iz), + lx = (int)cimg::round(lxz/iz), + ly = (int)cimg::round(lyz/iz); + const tc *const color = &texture._atXY(tx,ty); + const tl *const lig = &light._atXY(lx,ly); cimg_forC(*this,c) { - const tl l = *lig; - const T val = (T)(l<1?l**col:(2 - l)**col + (l - 1)*maxval); - *ptrd = (T)(nopacity*val + *ptrd*copacity); - ptrd+=whd; col+=twh; lig+=lwh; - } - ptrd-=offx; - } - zleft+=pentez; txleft+=pentetx; tyleft+=pentety; - lxleft+=rlx+((errlx-=ndlx)<0?errlx+=dx,slx:0); - lyleft+=rly+((errly-=ndly)<0?errly+=dx,sly:0); + const tc col = color[c*twhd]; + const float cbs = cimg::cut((float)lig[c*lwhd],0,2); + const Tfloat val = cbs<=1?cbs*col:(2 - cbs)*col + (cbs - 1)*_sc_maxval; + ptrd[c*_sc_whd] = (T)(opacity>=1?val:val*_sc_nopacity + ptrd[c*_sc_whd]*_sc_copacity); + } + } + ++ptrd; ++ptrz; } - zr+=pzr; txr+=ptxr; tyr+=ptyr; zl+=pzl; txl+=ptxl; tyl+=ptyl; + } } return *this; } @@ -44959,24 +47075,24 @@ nz0 = z0=width()?width() - 1 - nx1:0) + (nx0<0?nx0:0), - lY = (1 + ny1 - ny0) + (ny1>=height()?height() - 1 - ny1:0) + (ny0<0?ny0:0), - lZ = (1 + nz1 - nz0) + (nz1>=depth()?depth() - 1 - nz1:0) + (nz0<0?nz0:0), - lC = (1 + nc1 - nc0) + (nc1>=spectrum()?spectrum() - 1 - nc1:0) + (nc0<0?nc0:0); + lx = (1 + nx1 - nx0) + (nx1>=width()?width() - 1 - nx1:0) + (nx0<0?nx0:0), + ly = (1 + ny1 - ny0) + (ny1>=height()?height() - 1 - ny1:0) + (ny0<0?ny0:0), + lz = (1 + nz1 - nz0) + (nz1>=depth()?depth() - 1 - nz1:0) + (nz0<0?nz0:0), + lc = (1 + nc1 - nc0) + (nc1>=spectrum()?spectrum() - 1 - nc1:0) + (nc0<0?nc0:0); const ulongT - offX = (ulongT)_width - lX, - offY = (ulongT)_width*(_height - lY), - offZ = (ulongT)_width*_height*(_depth - lZ); + offX = (ulongT)_width - lx, + offY = (ulongT)_width*(_height - ly), + offZ = (ulongT)_width*_height*(_depth - lz); const float nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f); T *ptrd = data(nx0<0?0:nx0,ny0<0?0:ny0,nz0<0?0:nz0,nc0<0?0:nc0); - if (lX>0 && lY>0 && lZ>0 && lC>0) - for (int v = 0; v0 && ly>0 && lz>0 && lc>0) + for (int v = 0; v=1) { - if (sizeof(T)!=1) { for (int x = 0; x - CImg& draw_rectangle(const int x0, const int y0, const int z0, - const int x1, const int y1, const int z1, - const tc *const color, const float opacity, - const unsigned int pattern) { - return draw_line(x0,y0,z0,x1,y0,z0,color,opacity,pattern,true). - draw_line(x1,y0,z0,x1,y1,z0,color,opacity,pattern,false). - draw_line(x1,y1,z0,x0,y1,z0,color,opacity,pattern,false). - draw_line(x0,y1,z0,x0,y0,z0,color,opacity,pattern,false). - draw_line(x0,y0,z1,x1,y0,z1,color,opacity,pattern,true). - draw_line(x1,y0,z1,x1,y1,z1,color,opacity,pattern,false). - draw_line(x1,y1,z1,x0,y1,z1,color,opacity,pattern,false). - draw_line(x0,y1,z1,x0,y0,z1,color,opacity,pattern,false). - draw_line(x0,y0,z0,x0,y0,z1,color,opacity,pattern,true). - draw_line(x1,y0,z0,x1,y0,z1,color,opacity,pattern,true). - draw_line(x1,y1,z0,x1,y1,z1,color,opacity,pattern,true). - draw_line(x0,y1,z0,x0,y1,z1,color,opacity,pattern,true); - } - //! Draw a filled 2D rectangle. /** \param x0 X-coordinate of the upper-left rectangle corner. @@ -45079,13 +47175,18 @@ throw CImgArgumentException(_cimg_instance "draw_polygon(): Specified color is (null).", cimg_instance); - if (points._width==1) return draw_point((int)points(0,0),(int)points(0,1),color,opacity); - if (points._width==2) return draw_line((int)points(0,0),(int)points(0,1), - (int)points(1,0),(int)points(1,1),color,opacity); - if (points._width==3) return draw_triangle((int)points(0,0),(int)points(0,1), - (int)points(1,0),(int)points(1,1), - (int)points(2,0),(int)points(2,1),color,opacity); - cimg_init_scanline(color,opacity); + if (points.height()!=2) + throw CImgArgumentException(_cimg_instance + "draw_polygon(): Invalid specified point set (%u,%u,%u,%u).", + cimg_instance, + points._width,points._height,points._depth,points._spectrum); + if (points._width==1) return draw_point(cimg::uiround(points(0,0)),cimg::uiround(points(0,1)),color,opacity); + if (points._width==2) return draw_line(cimg::uiround(points(0,0)),cimg::uiround(points(0,1)), + cimg::uiround(points(1,0)),cimg::uiround(points(1,1)),color,opacity); + if (points._width==3) return draw_triangle(cimg::uiround(points(0,0)),cimg::uiround(points(0,1)), + cimg::uiround(points(1,0)),cimg::uiround(points(1,1)), + cimg::uiround(points(2,0)),cimg::uiround(points(2,1)),color,opacity); + cimg_init_scanline(opacity); int xmin = 0, ymin = 0, xmax = points.get_shared_row(0).max_min(xmin), @@ -45103,27 +47204,26 @@ while (go_on) { unsigned int an = (nn + 1)%points._width; const int - x0 = (int)points(n,0), - y0 = (int)points(n,1); + x0 = cimg::uiround(points(n,0)), + y0 = cimg::uiround(points(n,1)); if (points(nn,1)==y0) while (points(an,1)==y0) { nn = an; (an+=1)%=points._width; } const int - x1 = (int)points(nn,0), - y1 = (int)points(nn,1); + x1 = cimg::uiround(points(nn,0)), + y1 = cimg::uiround(points(nn,1)); unsigned int tn = an; while (points(tn,1)==y1) (tn+=1)%=points._width; if (y0!=y1) { const int - y2 = (int)points(tn,1), + y2 = cimg::uiround(points(tn,1)), x01 = x1 - x0, y01 = y1 - y0, y12 = y2 - y1, - dy = cimg::sign(y01), - tmax = std::max(1,cimg::abs(y01)), - tend = tmax - (dy==cimg::sign(y12)); + step = cimg::sign(y01), + tmax = std::max(1,cimg::abs(y01)), htmax = tmax*cimg::sign(x01)/2, + tend = tmax - (step==cimg::sign(y12)); unsigned int y = (unsigned int)y0 - ymin; - for (int t = 0; t<=tend; ++t, y+=dy) - if (yn; n = nn; nn = an; @@ -45133,9 +47233,9 @@ cimg_forY(Xs,y) { const CImg Xsy = Xs.get_shared_points(0,count[y] - 1,y).sort(); int px = width(); - for (unsigned int n = 0; n CImg& draw_polygon(const CImg& points, const tc *const color, const float opacity, const unsigned int pattern) { - if (is_empty() || !points || points._width<3) return *this; + if (is_empty() || !points) return *this; + if (!color) + throw CImgArgumentException(_cimg_instance + "draw_polygon(): Specified color is (null).", + cimg_instance); + if (points._width==1) return draw_point((int)points(0,0),(int)points(0,1),color,opacity); + if (points._width==2) return draw_line((int)points(0,0),(int)points(0,1), + (int)points(1,0),(int)points(1,1),color,opacity,pattern); bool ninit_hatch = true; switch (points._height) { case 0 : case 1 : throw CImgArgumentException(_cimg_instance - "draw_polygon(): Invalid specified point set.", - cimg_instance); - case 2 : { // 2D version + "draw_polygon(): Invalid specified point set (%u,%u,%u,%u).", + cimg_instance, + points._width,points._height,points._depth,points._spectrum); + default : { CImg npoints(points._width,2); int x = npoints(0,0) = (int)points(0,0), y = npoints(0,1) = (int)points(0,1); unsigned int nb_points = 1; @@ -45166,36 +47274,12 @@ const int x0 = (int)npoints(0,0), y0 = (int)npoints(0,1); int ox = x0, oy = y0; for (unsigned int i = 1; i npoints(points._width,3); - int - x = npoints(0,0) = (int)points(0,0), - y = npoints(0,1) = (int)points(0,1), - z = npoints(0,2) = (int)points(0,2); - unsigned int nb_points = 1; - for (unsigned int p = 1; p CImg& draw_ellipse(const int x0, const int y0, const float r1, const float r2, const float angle, const tc *const color, const float opacity=1) { - return _draw_ellipse(x0,y0,r1,r2,angle,color,opacity,0U); + return _draw_ellipse(x0,y0,r1,r2,angle,color,opacity,0U,true); } //! Draw a filled 2D ellipse \overloading. @@ -45249,7 +47333,7 @@ template CImg& draw_ellipse(const int x0, const int y0, const float r1, const float r2, const float angle, const tc *const color, const float opacity, const unsigned int pattern) { - if (pattern) _draw_ellipse(x0,y0,r1,r2,angle,color,opacity,pattern); + if (pattern) _draw_ellipse(x0,y0,r1,r2,angle,color,opacity,pattern,false); return *this; } @@ -45274,63 +47358,69 @@ } template - CImg& _draw_ellipse(const int x0, const int y0, const float r1, const float r2, const float angle, + CImg& _draw_ellipse(const int x0, const int y0, const float radius1, const float radius2, const float angle, const tc *const color, const float opacity, - const unsigned int pattern) { - if (is_empty()) return *this; + const unsigned int pattern, const bool is_filled) { + if (is_empty() || (!is_filled && !pattern)) return *this; + const float radiusM = std::max(radius1,radius2); + if (radius1<0 || radius2<0 || x0 - radiusM>=width() || y0 + radiusM<0 || y0 - radiusM>=height()) return *this; if (!color) throw CImgArgumentException(_cimg_instance "draw_ellipse(): Specified color is (null).", cimg_instance); - if (r1<=0 || r2<=0) return draw_point(x0,y0,color,opacity); - if (r1==r2 && (float)(int)r1==r1) { - if (pattern) return draw_circle(x0,y0,(int)cimg::round(r1),color,opacity,pattern); - else return draw_circle(x0,y0,(int)cimg::round(r1),color,opacity); - } - cimg_init_scanline(color,opacity); - const float - nr1 = cimg::abs(r1) - 0.5, nr2 = cimg::abs(r2) - 0.5, - nangle = (float)(angle*cimg::PI/180), - u = (float)std::cos(nangle), - v = (float)std::sin(nangle), - rmax = std::max(nr1,nr2), - l1 = (float)std::pow(rmax/(nr1>0?nr1:1e-6),2), - l2 = (float)std::pow(rmax/(nr2>0?nr2:1e-6),2), - a = l1*u*u + l2*v*v, - b = u*v*(l1 - l2), - c = l1*v*v + l2*u*u; - const int - yb = (int)cimg::round(std::sqrt(a*rmax*rmax/(a*c - b*b))), - tymin = y0 - yb - 1, - tymax = y0 + yb + 1, - ymin = tymin<0?0:tymin, - ymax = tymax>=height()?height() - 1:tymax; - int oxmin = 0, oxmax = 0; - bool first_line = true; - for (int y = ymin; y<=ymax; ++y) { + const int iradius1 = (int)cimg::round(radius1), iradius2 = (int)cimg::round(radius2); + if (!iradius1 && !iradius2) return draw_point(x0,y0,color,opacity); + if (iradius1==iradius2) { + if (is_filled) return draw_circle(x0,y0,iradius1,color,opacity); + else if (pattern==~0U) return draw_circle(x0,y0,iradius1,color,opacity,pattern); + } + const float ang = (float)(angle*cimg::PI/180); + + if (!is_filled) { // Outlined + const float ca = std::cos(ang), sa = std::sin(ang); + CImg points((unsigned int)cimg::round(6*radiusM),2); + cimg_forX(points,k) { + const float + _ang = (float)(2*cimg::PI*k/points._width), + X = (float)(radius1*std::cos(_ang)), + Y = (float)(radius2*std::sin(_ang)); + points(k,0) = (int)cimg::round(x0 + (X*ca - Y*sa)); + points(k,1) = (int)cimg::round(y0 + (X*sa + Y*ca)); + } + draw_polygon(points,color,opacity,pattern); + } else { // Filled + cimg_init_scanline(opacity); const float - Y = y - y0 + (y0?(float)std::sqrt(delta)/a:0.f, - bY = b*Y/a, - fxmin = x0 - 0.5f - bY - sdelta, - fxmax = x0 + 0.5f - bY + sdelta; - const int xmin = (int)cimg::round(fxmin), xmax = (int)cimg::round(fxmax); - if (!pattern) cimg_draw_scanline(xmin,xmax,y,color,opacity,1); - else { - if (first_line) { - if (y0 - yb>=0) cimg_draw_scanline(xmin,xmax,y,color,opacity,1); - else draw_point(xmin,y,color,opacity).draw_point(xmax,y,color,opacity); - first_line = false; - } else { - if (xmin=height()?height() - 1:_ymax; + for (int y = ymin; y<=ymax; ++y) { + const float + Y = y - y0 + 0.5f, + B = 2*t2*Y, + C = t3*Y*Y - 1, + D = B*B - 4*t1*C; + if (D>=0) { + const float sD = std::sqrt(D); + const int + xmin = (int)(x0 + cimg::round((-B - sD)/t12)), + xmax = (int)(x0 + cimg::round((-B + sD)/t12)); + cimg_draw_scanline(xmin,xmax,y,color,opacity,1); } } - oxmin = xmin; oxmax = xmax; } return *this; } @@ -45349,12 +47439,13 @@ CImg& draw_circle(const int x0, const int y0, int radius, const tc *const color, const float opacity=1) { if (is_empty()) return *this; + if (radius<0 || x0 - radius>=width() || y0 + radius<0 || y0 - radius>=height()) return *this; if (!color) throw CImgArgumentException(_cimg_instance "draw_circle(): Specified color is (null).", cimg_instance); - cimg_init_scanline(color,opacity); - if (radius<0 || x0 - radius>=width() || y0 + radius<0 || y0 - radius>=height()) return *this; + if (!radius) return draw_point(x0,y0,color,opacity); + cimg_init_scanline(opacity); if (y0>=0 && y0=0) { @@ -45387,7 +47478,7 @@ CImg& draw_circle(const int x0, const int y0, int radius, const tc *const color, const float opacity, const unsigned int pattern) { - cimg::unused(pattern); + if (pattern!=~0U) return draw_ellipse(x0,y0,radius,radius,0,color,opacity,pattern); if (is_empty()) return *this; if (!color) throw CImgArgumentException(_cimg_instance @@ -45395,6 +47486,7 @@ cimg_instance); if (radius<0 || x0 - radius>=width() || y0 + radius<0 || y0 - radius>=height()) return *this; if (!radius) return draw_point(x0,y0,color,opacity); + draw_point(x0 - radius,y0,color,opacity).draw_point(x0 + radius,y0,color,opacity). draw_point(x0,y0 - radius,color,opacity).draw_point(x0,y0 + radius,color,opacity); if (radius==1) return *this; @@ -45430,39 +47522,25 @@ if (is_overlapped(sprite)) return draw_image(x0,y0,z0,c0,+sprite,opacity); if (x0==0 && y0==0 && z0==0 && c0==0 && is_sameXYZC(sprite) && opacity>=1 && !is_shared()) return assign(sprite,false); - const bool bx = (x0<0), by = (y0<0), bz = (z0<0), bc = (c0<0); + const bool bx = x0<0, by = y0<0, bz = z0<0, bc = c0<0; const int - lX = sprite.width() - (x0 + sprite.width()>width()?x0 + sprite.width() - width():0) + (bx?x0:0), - lY = sprite.height() - (y0 + sprite.height()>height()?y0 + sprite.height() - height():0) + (by?y0:0), - lZ = sprite.depth() - (z0 + sprite.depth()>depth()?z0 + sprite.depth() - depth():0) + (bz?z0:0), - lC = sprite.spectrum() - (c0 + sprite.spectrum()>spectrum()?c0 + sprite.spectrum() - spectrum():0) + (bc?c0:0); - const t - *ptrs = sprite._data + - (bx?-x0:0) + - (by?-y0*(ulongT)sprite.width():0) + - (bz?-z0*(ulongT)sprite.width()*sprite.height():0) + - (bc?-c0*(ulongT)sprite.width()*sprite.height()*sprite.depth():0); - const ulongT - offX = (ulongT)_width - lX, - soffX = (ulongT)sprite._width - lX, - offY = (ulongT)_width*(_height - lY), - soffY = (ulongT)sprite._width*(sprite._height - lY), - offZ = (ulongT)_width*_height*(_depth - lZ), - soffZ = (ulongT)sprite._width*sprite._height*(sprite._depth - lZ); + dx0 = bx?0:x0, dy0 = by?0:y0, dz0 = bz?0:z0, dc0 = bc?0:c0, + sx0 = dx0 - x0, sy0 = dy0 - y0, sz0 = dz0 - z0, sc0 = dc0 - c0, + lx = sprite.width() - sx0 - (x0 + sprite.width()>width()?x0 + sprite.width() - width():0), + ly = sprite.height() - sy0 - (y0 + sprite.height()>height()?y0 + sprite.height() - height():0), + lz = sprite.depth() - sz0 - (z0 + sprite.depth()>depth()?z0 + sprite.depth() - depth():0), + lc = sprite.spectrum() - sc0 - (c0 + sprite.spectrum()>spectrum()?c0 + sprite.spectrum() - spectrum():0); + const float nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f); - if (lX>0 && lY>0 && lZ>0 && lC>0) { - T *ptrd = data(x0<0?0:x0,y0<0?0:y0,z0<0?0:z0,c0<0?0:c0); - for (int v = 0; v=1) for (int x = 0; x0 && ly>0 && lz>0 && lc>0) { + for (int c = 0; c=1) for (int x = 0; x=1 && !is_shared()) return assign(sprite,false); - const bool bx = (x0<0), by = (y0<0), bz = (z0<0), bc = (c0<0); + const bool bx = x0<0, by = y0<0, bz = z0<0, bc = c0<0; const int - lX = sprite.width() - (x0 + sprite.width()>width()?x0 + sprite.width() - width():0) + (bx?x0:0), - lY = sprite.height() - (y0 + sprite.height()>height()?y0 + sprite.height() - height():0) + (by?y0:0), - lZ = sprite.depth() - (z0 + sprite.depth()>depth()?z0 + sprite.depth() - depth():0) + (bz?z0:0), - lC = sprite.spectrum() - (c0 + sprite.spectrum()>spectrum()?c0 + sprite.spectrum() - spectrum():0) + (bc?c0:0); - const T - *ptrs = sprite._data + - (bx?-x0:0) + - (by?-y0*(ulongT)sprite.width():0) + - (bz?-z0*(ulongT)sprite.width()*sprite.height():0) + - (bc?-c0*(ulongT)sprite.width()*sprite.height()*sprite.depth():0); - const ulongT - offX = (ulongT)_width - lX, - soffX = (ulongT)sprite._width - lX, - offY = (ulongT)_width*(_height - lY), - soffY = (ulongT)sprite._width*(sprite._height - lY), - offZ = (ulongT)_width*_height*(_depth - lZ), - soffZ = (ulongT)sprite._width*sprite._height*(sprite._depth - lZ), - slX = lX*sizeof(T); + dx0 = bx?0:x0, dy0 = by?0:y0, dz0 = bz?0:z0, dc0 = bc?0:c0, + sx0 = dx0 - x0, sy0 = dy0 - y0, sz0 = dz0 - z0, sc0 = dc0 - c0, + lx = sprite.width() - sx0 - (x0 + sprite.width()>width()?x0 + sprite.width() - width():0), + ly = sprite.height() - sy0 - (y0 + sprite.height()>height()?y0 + sprite.height() - height():0), + lz = sprite.depth() - sz0 - (z0 + sprite.depth()>depth()?z0 + sprite.depth() - depth():0), + lc = sprite.spectrum() - sc0 - (c0 + sprite.spectrum()>spectrum()?c0 + sprite.spectrum() - spectrum():0); + const ulongT slx = lx*sizeof(T); + const float nopacity = cimg::abs(opacity), copacity = 1 - std::max(opacity,0.f); - if (lX>0 && lY>0 && lZ>0 && lC>0) { - T *ptrd = data(x0<0?0:x0,y0<0?0:y0,z0<0?0:z0,c0<0?0:c0); - for (int v = 0; v=1) - for (int y = 0; y0 && ly>0 && lz>0 && lc>0) { + for (int c = 0; c=1) std::memcpy(ptrd,ptrs,slx); + else for (int x = 0; xwidth()?x0 + sprite.width() - width():0) + (bx?x0:0), - lY = sprite.height() - (y0 + sprite.height()>height()?y0 + sprite.height() - height():0) + (by?y0:0), - lZ = sprite.depth() - (z0 + sprite.depth()>depth()?z0 + sprite.depth() - depth():0) + (bz?z0:0), - lC = sprite.spectrum() - (c0 + sprite.spectrum()>spectrum()?c0 + sprite.spectrum() - spectrum():0) + (bc?c0:0); - const ulongT - coff = (bx?-x0:0) + - (by?-y0*(ulongT)mask.width():0) + - (bz?-z0*(ulongT)mask.width()*mask.height():0) + - (bc?-c0*(ulongT)mask.width()*mask.height()*mask.depth():0), - ssize = (ulongT)mask.width()*mask.height()*mask.depth()*mask.spectrum(); - const ti *ptrs = sprite._data + coff; - const tm *ptrm = mask._data + coff; - const ulongT - offX = (ulongT)_width - lX, - soffX = (ulongT)sprite._width - lX, - offY = (ulongT)_width*(_height - lY), - soffY = (ulongT)sprite._width*(sprite._height - lY), - offZ = (ulongT)_width*_height*(_depth - lZ), - soffZ = (ulongT)sprite._width*sprite._height*(sprite._depth - lZ); - if (lX>0 && lY>0 && lZ>0 && lC>0) { - T *ptrd = data(x0<0?0:x0,y0<0?0:y0,z0<0?0:z0,c0<0?0:c0); - for (int c = 0; cwidth()?x0 + sprite.width() - width():0), + ly = sprite.height() - sy0 - (y0 + sprite.height()>height()?y0 + sprite.height() - height():0), + lz = sprite.depth() - sz0 - (z0 + sprite.depth()>depth()?z0 + sprite.depth() - depth():0), + lc = sprite.spectrum() - sc0 - (c0 + sprite.spectrum()>spectrum()?c0 + sprite.spectrum() - spectrum():0); + const ulongT msize = mask.size(); + + if (lx>0 && ly>0 && lz>0 && lc>0) { + for (int c = 0; cw) w = x; x = 0; break; - case '\t' : x+=4*font[' ']._width; break; + case '\t' : x+=4*font[(int)' ']._width; break; default : if (c letter = font[c]; + case '\t' : x+=4*font[(int)' ']._width; break; + default : if (ch letter = font[ch]; if (letter) { if (is_native_font && _spectrum>letter._spectrum) letter.resize(-100,-100,1,_spectrum,0,2); const unsigned int cmin = std::min(_spectrum,letter._spectrum); if (foreground_color) for (unsigned int c = 0; c& __draw_text(const char *const text, const bool is_down, ...) { + CImg& __draw_text(const char *const text, unsigned int &font_size, const int is_down, ...) { CImg tmp(2048); - std::va_list ap; va_start(ap,is_down); + std::va_list ap; + va_start(ap,is_down); cimg_vsnprintf(tmp,tmp._width,text,ap); va_end(ap); - CImg label, labelmask; - const unsigned char labelcolor = 127; - const unsigned int fsize = 13; - label.draw_text(0,0,"%s",&labelcolor,0,1,fsize,tmp._data); - if (label) { - label.crop(2,0,label.width() - 1,label.height()); - ((labelmask = label)+=label.get_dilate(5)).max(80); - (label*=2).resize(-100,-100,1,3,1); - return draw_image(0,is_down?height() - fsize:0,label,labelmask,1,254); - } - return *this; + CImg a_label, a_labelmask; + const unsigned char a_labelcolor = 255; + unsigned int ofs = font_size, fs = ofs; + do { // Determine best font size + a_label.assign().draw_text(0,0,"%s",&a_labelcolor,0,1,fs,tmp._data); + if (a_label._width<7*_width/10 && a_label._height>_height/20 && a_label._height<_height/5) { + font_size = fs; break; + } else if ((a_label._width>7*_width/10 || a_label._height>_height/5) && fs>13 && ofs>=fs) { + ofs = fs; fs = std::max(13U,(unsigned int)cimg::round(fs/1.25f)); + } else if (a_label._width<3*_width/10 && a_label._height<_height/20 && fs<64 && ofs<=fs) { + ofs = fs; fs = std::min(64U,(unsigned int)cimg::round(fs*1.25f)); + } else { font_size = fs; break; } + } while (true); + a_label.normalize(0,255); + a_label+=(255 - a_label.get_dilate(3)).normalize(0,80); + a_label.resize(-100,-100,1,3,1); + return draw_image(0,is_down?height() - a_label.height():0,a_label,0.85f); } //! Draw a 2D vector field. /** \param flow Image of 2D vectors used as input data. - \param color Image of spectrum()-D vectors corresponding to the color of each arrow. + \param color Pointer to \c spectrum() consecutive values, defining the drawing color. \param opacity Drawing opacity. \param sampling Length (in pixels) between each arrow. \param factor Length factor of each arrow (if <0, computed as a percentage of the maximum length). @@ -45920,20 +47975,20 @@ CImg& draw_axis(const CImg& values_x, const int y, const tc *const color, const float opacity=1, const unsigned int pattern=~0U, const unsigned int font_height=13, - const bool allow_zero=true) { + const bool allow_zero=true, const float round_x=0) { if (is_empty()) return *this; const int yt = (y + 3 + font_height)<_height?y + 3:y - 2 - (int)font_height; const int siz = (int)values_x.size() - 1; CImg txt(32); - CImg label; + CImg a_label; if (siz<=0) { // Degenerated case draw_line(0,y,_width - 1,y,color,opacity,pattern); if (!siz) { - cimg_snprintf(txt,txt._width,"%g",(double)*values_x); - label.assign().draw_text(0,0,txt,color,(tc*)0,opacity,font_height); + cimg_snprintf(txt,txt._width,"%g",round_x?cimg::round((double)*values_x,round_x):(double)*values_x); + a_label.assign().draw_text(0,0,txt,color,(tc*)0,opacity,font_height); const int - _xt = (width() - label.width())/2, - xt = _xt<3?3:_xt + label.width()>=width() - 2?width() - 3 - label.width():_xt; + _xt = (width() - a_label.width())/2, + xt = _xt<3?3:_xt + a_label.width()>=width() - 2?width() - 3 - a_label.width():_xt; draw_point(width()/2,y - 1,color,opacity).draw_point(width()/2,y + 1,color,opacity); if (allow_zero || *txt!='0' || txt[1]!=0) draw_text(xt,yt,txt,color,(tc*)0,opacity,font_height); @@ -45942,12 +47997,12 @@ if (values_x[0]=width() - 2?width() - 3 - label.width():_xt; + _xt = xi - a_label.width()/2, + xt = _xt<3?3:_xt + a_label.width()>=width() - 2?width() - 3 - a_label.width():_xt; draw_point(xi,y - 1,color,opacity).draw_point(xi,y + 1,color,opacity); if (allow_zero || *txt!='0' || txt[1]!=0) draw_text(xt,yt,txt,color,(tc*)0,opacity,font_height); @@ -45970,20 +48025,20 @@ CImg& draw_axis(const int x, const CImg& values_y, const tc *const color, const float opacity=1, const unsigned int pattern=~0U, const unsigned int font_height=13, - const bool allow_zero=true) { + const bool allow_zero=true, const float round_y=0) { if (is_empty()) return *this; int siz = (int)values_y.size() - 1; CImg txt(32); - CImg label; + CImg a_label; if (siz<=0) { // Degenerated case draw_line(x,0,x,_height - 1,color,opacity,pattern); if (!siz) { - cimg_snprintf(txt,txt._width,"%g",(double)*values_y); - label.assign().draw_text(0,0,txt,color,(tc*)0,opacity,font_height); + cimg_snprintf(txt,txt._width,"%g",round_y?cimg::round((double)*values_y,round_y):(double)*values_y); + a_label.assign().draw_text(0,0,txt,color,(tc*)0,opacity,font_height); const int - _yt = (height() - label.height())/2, - yt = _yt<0?0:_yt + label.height()>=height()?height() - 1-label.height():_yt, - _xt = x - 2 - label.width(), + _yt = (height() - a_label.height())/2, + yt = _yt<0?0:_yt + a_label.height()>=height()?height() - 1 - a_label.height():_yt, + _xt = x - 2 - a_label.width(), xt = _xt>=0?_xt:x + 3; draw_point(x - 1,height()/2,color,opacity).draw_point(x + 1,height()/2,color,opacity); if (allow_zero || *txt!='0' || txt[1]!=0) @@ -45993,13 +48048,13 @@ if (values_y[0]=height()?height() - 1-label.height():_yt, - _xt = x - 2 - label.width(), + _yt = yi - a_label.height()/2, + yt = _yt<0?0:_yt + a_label.height()>=height()?height() - 1 - a_label.height():_yt, + _xt = x - 2 - a_label.width(), xt = _xt>=0?_xt:x + 3; draw_point(x - 1,yi,color,opacity).draw_point(x + 1,yi,color,opacity); if (allow_zero || *txt!='0' || txt[1]!=0) @@ -46024,7 +48079,8 @@ CImg& draw_axes(const CImg& values_x, const CImg& values_y, const tc *const color, const float opacity=1, const unsigned int pattern_x=~0U, const unsigned int pattern_y=~0U, - const unsigned int font_height=13, const bool allow_zero=true) { + const unsigned int font_height=13, const bool allow_zero=true, + const float round_x=0, const float round_y=0) { if (is_empty()) return *this; const CImg nvalues_x(values_x._data,values_x.size(),1,1,1,true); const int sizx = (int)values_x.size() - 1, wm1 = width() - 1; @@ -46032,7 +48088,10 @@ float ox = (float)*nvalues_x; for (unsigned int x = sizx?1U:0U; x<_width; ++x) { const float nx = (float)nvalues_x._linear_atX((float)x*sizx/wm1); - if (nx*ox<=0) { draw_axis(nx==0?x:x - 1,values_y,color,opacity,pattern_y,font_height,allow_zero); break; } + if (nx*ox<=0) { + draw_axis(nx==0?x:x - 1,values_y,color,opacity,pattern_y,font_height,allow_zero,round_y); + break; + } ox = nx; } } @@ -46042,7 +48101,10 @@ float oy = (float)nvalues_y[0]; for (unsigned int y = sizy?1U:0U; y<_height; ++y) { const float ny = (float)nvalues_y._linear_atX((float)y*sizy/hm1); - if (ny*oy<=0) { draw_axis(values_x,ny==0?y:y - 1,color,opacity,pattern_x,font_height,allow_zero); break; } + if (ny*oy<=0) { + draw_axis(values_x,ny==0?y:y - 1,color,opacity,pattern_x,font_height,allow_zero,round_x); + break; + } oy = ny; } } @@ -46064,15 +48126,15 @@ px = dx<=0?1:precisionx==0?(float)std::pow(10.,(int)std::log10(dx) - 2.):precisionx, py = dy<=0?1:precisiony==0?(float)std::pow(10.,(int)std::log10(dy) - 2.):precisiony; if (x0!=x1 && y0!=y1) - draw_axes(CImg::sequence(subdivisionx>0?subdivisionx:1-width()/subdivisionx,x0,x1).round(px), - CImg::sequence(subdivisiony>0?subdivisiony:1-height()/subdivisiony,y0,y1).round(py), - color,opacity,pattern_x,pattern_y,font_height,allow_zero); + draw_axes(CImg::sequence(subdivisionx>0?subdivisionx:1-width()/subdivisionx,x0,x1), + CImg::sequence(subdivisiony>0?subdivisiony:1-height()/subdivisiony,y0,y1), + color,opacity,pattern_x,pattern_y,font_height,allow_zero,px,py); else if (x0==x1 && y0!=y1) - draw_axis((int)x0,CImg::sequence(subdivisiony>0?subdivisiony:1-height()/subdivisiony,y0,y1).round(py), - color,opacity,pattern_y,font_height); + draw_axis((int)x0,CImg::sequence(subdivisiony>0?subdivisiony:1-height()/subdivisiony,y0,y1), + color,opacity,pattern_y,font_height,py); else if (x0!=x1 && y0==y1) - draw_axis(CImg::sequence(subdivisionx>0?subdivisionx:1-width()/subdivisionx,x0,x1).round(px),(int)y0, - color,opacity,pattern_x,font_height); + draw_axis(CImg::sequence(subdivisionx>0?subdivisionx:1-width()/subdivisionx,x0,x1),(int)y0, + color,opacity,pattern_x,font_height,px); return *this; } @@ -46191,16 +48253,16 @@ // Draw graph edges switch (plot_type%4) { case 1 : { // Segments - int oX = 0, oY = (int)((data[0] - m)/ca); + int oX = 0, oY = (int)cimg::round((data[0] - m)/ca); if (siz==1) { - const int Y = (int)((*data - m)/ca); + const int Y = (int)cimg::round((*data - m)/ca); draw_line(0,Y,width() - 1,Y,color,opacity,pattern); } else { const float fx = (float)_width/siz1; for (ulongT off = 1; off ndata(data._data,siz,1,1,1,true); - int oY = (int)((data[0] - m)/ca); + int oY = (int)cimg::round((data[0] - m)/ca); cimg_forX(*this,x) { - const int Y = (int)((ndata._cubic_atX((float)x*siz1/width1)-m)/ca); + const int Y = (int)cimg::round((ndata._cubic_atX((float)x*siz1/width1)-m)/ca); if (x>0) draw_line(x,oY,x + 1,Y,color,opacity,pattern,init_hatch); init_hatch = false; oY = Y; } } break; case 3 : { // Bars - const int Y0 = (int)(-m/ca); + const int Y0 = (int)cimg::round(-m/ca); const float fx = (float)_width/siz1; int oX = 0; cimg_foroff(data,off) { const int - X = (int)((off + 1)*fx) - 1, - Y = (int)((data[off] - m)/ca); + X = (int)cimg::round((off + 1)*fx) - 1, + Y = (int)cimg::round((data[off] - m)/ca); draw_rectangle(oX,Y0,X,Y,color,opacity). draw_line(oX,Y,oX,Y0,color2.data(),opacity). draw_line(oX,Y0,X,Y0,Y<=Y0?color2.data():color1.data(),opacity). @@ -46243,56 +48305,56 @@ case 1 : { // Point cimg_foroff(data,off) { const int - X = (int)(off*fx + wb2), - Y = (int)((data[off]-m)/ca); + X = (int)cimg::round(off*fx + wb2), + Y = (int)cimg::round((data[off]-m)/ca); draw_point(X,Y,color,opacity); } } break; case 2 : { // Straight Cross cimg_foroff(data,off) { const int - X = (int)(off*fx + wb2), - Y = (int)((data[off]-m)/ca); + X = (int)cimg::round(off*fx + wb2), + Y = (int)cimg::round((data[off]-m)/ca); draw_line(X - 3,Y,X + 3,Y,color,opacity).draw_line(X,Y - 3,X,Y + 3,color,opacity); } } break; case 3 : { // Diagonal Cross cimg_foroff(data,off) { const int - X = (int)(off*fx + wb2), - Y = (int)((data[off]-m)/ca); + X = (int)cimg::round(off*fx + wb2), + Y = (int)cimg::round((data[off]-m)/ca); draw_line(X - 3,Y - 3,X + 3,Y + 3,color,opacity).draw_line(X - 3,Y + 3,X + 3,Y - 3,color,opacity); } } break; case 4 : { // Filled Circle cimg_foroff(data,off) { const int - X = (int)(off*fx + wb2), - Y = (int)((data[off]-m)/ca); + X = (int)cimg::round(off*fx + wb2), + Y = (int)cimg::round((data[off]-m)/ca); draw_circle(X,Y,3,color,opacity); } } break; case 5 : { // Outlined circle cimg_foroff(data,off) { const int - X = (int)(off*fx + wb2), - Y = (int)((data[off]-m)/ca); - draw_circle(X,Y,3,color,opacity,0U); + X = (int)cimg::round(off*fx + wb2), + Y = (int)cimg::round((data[off]-m)/ca); + draw_circle(X,Y,3,color,opacity,~0U); } } break; case 6 : { // Square cimg_foroff(data,off) { const int - X = (int)(off*fx + wb2), - Y = (int)((data[off]-m)/ca); + X = (int)cimg::round(off*fx + wb2), + Y = (int)cimg::round((data[off]-m)/ca); draw_rectangle(X - 3,Y - 3,X + 3,Y + 3,color,opacity,~0U); } } break; case 7 : { // Diamond cimg_foroff(data,off) { const int - X = (int)(off*fx + wb2), - Y = (int)((data[off]-m)/ca); + X = (int)cimg::round(off*fx + wb2), + Y = (int)cimg::round((data[off]-m)/ca); draw_line(X,Y - 4,X + 4,Y,color,opacity). draw_line(X + 4,Y,X,Y + 4,color,opacity). draw_line(X,Y + 4,X - 4,Y,color,opacity). @@ -46483,7 +48545,7 @@ if (is_empty()) return *this; const int w = width(), h = height(); const Tfloat m = (Tfloat)cimg::type::min(), M = (Tfloat)cimg::type::max(); - ulongT rng = (cimg::_rand(),cimg::rng()); + cimg_uint64 rng = (cimg::_rand(),cimg::rng()); cimg_forZC(*this,z,c) { CImg ref = get_shared_slice(z,c); for (int delta = 1<1; delta>>=1) { @@ -46694,8 +48756,8 @@ cimg_forX(*this,x) { const float val = (float)std::exp(a*dx*dx + b*dx*dy + c*dy*dy); T *ptrd = data(x,y,0,0); - if (opacity>=1) cimg_forC(*this,c) { *ptrd = (T)(val*(*col++)); ptrd+=whd; } - else cimg_forC(*this,c) { *ptrd = (T)(nopacity*val*(*col++) + *ptrd*copacity); ptrd+=whd; } + if (opacity>=1) cimg_forC(*this,k) { *ptrd = (T)(val*(*col++)); ptrd+=whd; } + else cimg_forC(*this,k) { *ptrd = (T)(nopacity*val*(*col++) + *ptrd*copacity); ptrd+=whd; } col-=_spectrum; ++dx; } @@ -46745,8 +48807,8 @@ dx = (x - xc), dy = (y - yc), dz = (z - zc), val = (float)std::exp(a*dx*dx + b*dx*dy + c*dx*dz + d*dy*dy + e*dy*dz + f*dz*dz); T *ptrd = data(x,y,z,0); - if (opacity>=1) cimg_forC(*this,c) { *ptrd = (T)(val*(*col++)); ptrd+=whd; } - else cimg_forC(*this,c) { *ptrd = (T)(nopacity*val*(*col++) + *ptrd*copacity); ptrd+=whd; } + if (opacity>=1) cimg_forC(*this,k) { *ptrd = (T)(val*(*col++)); ptrd+=whd; } + else cimg_forC(*this,k) { *ptrd = (T)(nopacity*val*(*col++) + *ptrd*copacity); ptrd+=whd; } col-=_spectrum; } return *this; @@ -47386,7 +49448,6 @@ const tc *const pcolor = color._data; float opacity = __draw_object3d(opacities,n_primitive,_opacity); if (_opacity.is_empty()) opacity*=g_opacity; - else if (!_opacity.is_shared()) _opacity*=g_opacity; #ifdef cimg_use_board LibBoard::Board &board = *(LibBoard::Board*)pboard; @@ -47395,12 +49456,13 @@ switch (primitive.size()) { case 1 : { // Colored point or sprite const unsigned int n0 = (unsigned int)primitive[0]; - const int x0 = (int)projections(n0,0), y0 = (int)projections(n0,1); + const int x0 = cimg::uiround(projections(n0,0)), y0 = cimg::uiround(projections(n0,1)); if (_opacity.is_empty()) { // Scalar opacity if (color.size()==_spectrum) { // Colored point draw_point(x0,y0,pcolor,opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(color[0],color[1],color[2],(unsigned char)(opacity*255)); @@ -47422,6 +49484,7 @@ color.get_resize(sw,sh,1,-100,render_type<=3?1:3):CImg(), &sprite = _sprite?_sprite:color; draw_image(nx0,ny0,sprite,opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(128,128,128); @@ -47449,7 +49512,8 @@ _nopacity = (sw!=_opacity._width || sh!=_opacity._height)? _opacity.get_resize(sw,sh,1,-100,render_type<=3?1:3):CImg<_to>(), &nopacity = _nopacity?_nopacity:_opacity; - draw_image(nx0,ny0,sprite,nopacity); + draw_image(nx0,ny0,sprite,nopacity,g_opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(128,128,128); @@ -47465,14 +49529,15 @@ n0 = (unsigned int)primitive[0], n1 = (unsigned int)primitive[1]; const int - x0 = (int)projections(n0,0), y0 = (int)projections(n0,1), - x1 = (int)projections(n1,0), y1 = (int)projections(n1,1); + x0 = cimg::uiround(projections(n0,0)), y0 = cimg::uiround(projections(n0,1)), + x1 = cimg::uiround(projections(n1,0)), y1 = cimg::uiround(projections(n1,1)); const float z0 = vertices(n0,2) + Z + _focale, z1 = vertices(n1,2) + Z + _focale; if (render_type) { if (zbuffer) draw_line(zbuffer,x0,y0,z0,x1,y1,z1,pcolor,opacity); else draw_line(x0,y0,x1,y1,pcolor,opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(color[0],color[1],color[2],(unsigned char)(opacity*255)); @@ -47481,6 +49546,7 @@ #endif } else { draw_point(x0,y0,pcolor,opacity).draw_point(x1,y1,pcolor,opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(color[0],color[1],color[2],(unsigned char)(opacity*255)); @@ -47494,20 +49560,35 @@ const unsigned int n0 = (unsigned int)primitive[0], n1 = (unsigned int)primitive[1], - is_wireframe = (unsigned int)primitive[2]; - const float - Xc = 0.5f*((float)vertices(n0,0) + (float)vertices(n1,0)), - Yc = 0.5f*((float)vertices(n0,1) + (float)vertices(n1,1)), - Zc = 0.5f*((float)vertices(n0,2) + (float)vertices(n1,2)), - zc = Z + Zc + _focale, - xc = X + Xc*(absfocale?absfocale/zc:1), - yc = Y + Yc*(absfocale?absfocale/zc:1), + is_wireframe = (unsigned int)primitive[2], + is_radius = (unsigned int)primitive[3]; + float Xc,Yc,Zc,radius; + if (is_radius) { + Xc = (float)vertices(n0,0); + Yc = (float)vertices(n0,1); + Zc = (float)vertices(n0,2); + radius = cimg::hypot(vertices(n1,0) - vertices(n0,0), + vertices(n1,1) - vertices(n0,1), + vertices(n1,2) - vertices(n0,2)); + } else { + Xc = 0.5f*((float)vertices(n0,0) + (float)vertices(n1,0)); + Yc = 0.5f*((float)vertices(n0,1) + (float)vertices(n1,1)); + Zc = 0.5f*((float)vertices(n0,2) + (float)vertices(n1,2)); radius = 0.5f*cimg::hypot(vertices(n1,0) - vertices(n0,0), vertices(n1,1) - vertices(n0,1), - vertices(n1,2) - vertices(n0,2))*(absfocale?absfocale/zc:1); + vertices(n1,2) - vertices(n0,2)); + } + const float + zc = Z + Zc + _focale, + af = absfocale?absfocale/zc:1, + xc = X + Xc*af, + yc = Y + Yc*af; + radius*=af; + switch (render_type) { case 0 : draw_point((int)xc,(int)yc,pcolor,opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(color[0],color[1],color[2],(unsigned char)(opacity*255)); @@ -47517,6 +49598,7 @@ break; case 1 : draw_circle((int)xc,(int)yc,(int)radius,pcolor,opacity,~0U); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(color[0],color[1],color[2],(unsigned char)(opacity*255)); @@ -47528,6 +49610,7 @@ default : if (is_wireframe) draw_circle((int)xc,(int)yc,(int)radius,pcolor,opacity,~0U); else draw_circle((int)xc,(int)yc,(int)radius,pcolor,opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(color[0],color[1],color[2],(unsigned char)(opacity*255)); @@ -47554,14 +49637,15 @@ const int tx0 = (int)primitive[2], ty0 = (int)primitive[3], tx1 = (int)primitive[4], ty1 = (int)primitive[5], - x0 = (int)projections(n0,0), y0 = (int)projections(n0,1), - x1 = (int)projections(n1,0), y1 = (int)projections(n1,1); + x0 = cimg::uiround(projections(n0,0)), y0 = cimg::uiround(projections(n0,1)), + x1 = cimg::uiround(projections(n1,0)), y1 = cimg::uiround(projections(n1,1)); const float z0 = vertices(n0,2) + Z + _focale, z1 = vertices(n1,2) + Z + _focale; if (render_type) { if (zbuffer) draw_line(zbuffer,x0,y0,z0,x1,y1,z1,color,tx0,ty0,tx1,ty1,opacity); - else draw_line(x0,y0,x1,y1,color,tx0,ty0,tx1,ty1,opacity); + else draw_line(x0,y0,z0,x1,y1,z1,color,tx0,ty0,tx1,ty1,opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(128,128,128,(unsigned char)(opacity*255)); @@ -47573,6 +49657,7 @@ ty0<=0?0:ty0>=color.height()?color.height() - 1:ty0)._data,opacity). draw_point(x1,y1,color.get_vector_at(tx1<=0?0:tx1>=color.width()?color.width() - 1:tx1, ty1<=0?0:ty1>=color.height()?color.height() - 1:ty1)._data,opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(128,128,128,(unsigned char)(opacity*255)); @@ -47588,9 +49673,9 @@ n1 = (unsigned int)primitive[1], n2 = (unsigned int)primitive[2]; const int - x0 = (int)projections(n0,0), y0 = (int)projections(n0,1), - x1 = (int)projections(n1,0), y1 = (int)projections(n1,1), - x2 = (int)projections(n2,0), y2 = (int)projections(n2,1); + x0 = cimg::uiround(projections(n0,0)), y0 = cimg::uiround(projections(n0,1)), + x1 = cimg::uiround(projections(n1,0)), y1 = cimg::uiround(projections(n1,1)), + x2 = cimg::uiround(projections(n2,0)), y2 = cimg::uiround(projections(n2,1)); const float z0 = vertices(n0,2) + Z + _focale, z1 = vertices(n1,2) + Z + _focale, @@ -47598,6 +49683,7 @@ switch (render_type) { case 0 : draw_point(x0,y0,pcolor,opacity).draw_point(x1,y1,pcolor,opacity).draw_point(x2,y2,pcolor,opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(color[0],color[1],color[2],(unsigned char)(opacity*255)); @@ -47614,6 +49700,7 @@ else draw_line(x0,y0,x1,y1,pcolor,opacity).draw_line(x0,y0,x2,y2,pcolor,opacity). draw_line(x1,y1,x2,y2,pcolor,opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(color[0],color[1],color[2],(unsigned char)(opacity*255)); @@ -47626,6 +49713,7 @@ case 2 : if (zbuffer) draw_triangle(zbuffer,x0,y0,z0,x1,y1,z1,x2,y2,z2,pcolor,opacity); else draw_triangle(x0,y0,x1,y1,x2,y2,pcolor,opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(color[0],color[1],color[2],(unsigned char)(opacity*255)); @@ -47638,6 +49726,7 @@ case 3 : if (zbuffer) draw_triangle(zbuffer,x0,y0,z0,x1,y1,z1,x2,y2,z2,pcolor,opacity,lightprops(l)); else _draw_triangle(x0,y0,x1,y1,x2,y2,pcolor,opacity,lightprops(l)); + #ifdef cimg_use_board if (pboard) { const float lp = std::min(lightprops(l),1.f); @@ -47656,6 +49745,7 @@ draw_triangle(zbuffer,x0,y0,z0,x1,y1,z1,x2,y2,z2,pcolor, lightprops(n0),lightprops(n1),lightprops(n2),opacity); else draw_triangle(x0,y0,x1,y1,x2,y2,pcolor,lightprops(n0),lightprops(n1),lightprops(n2),opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi((unsigned char)(color[0]), @@ -47670,12 +49760,13 @@ break; case 5 : { const unsigned int - lx0 = (unsigned int)lightprops(n0,0), ly0 = (unsigned int)lightprops(n0,1), - lx1 = (unsigned int)lightprops(n1,0), ly1 = (unsigned int)lightprops(n1,1), - lx2 = (unsigned int)lightprops(n2,0), ly2 = (unsigned int)lightprops(n2,1); + lx0 = (unsigned int)cimg::uiround(lightprops(n0,0)), ly0 = (unsigned int)cimg::uiround(lightprops(n0,1)), + lx1 = (unsigned int)cimg::uiround(lightprops(n1,0)), ly1 = (unsigned int)cimg::uiround(lightprops(n1,1)), + lx2 = (unsigned int)cimg::uiround(lightprops(n2,0)), ly2 = (unsigned int)cimg::uiround(lightprops(n2,1)); if (zbuffer) draw_triangle(zbuffer,x0,y0,z0,x1,y1,z1,x2,y2,z2,pcolor,light_texture,lx0,ly0,lx1,ly1,lx2,ly2,opacity); else draw_triangle(x0,y0,x1,y1,x2,y2,pcolor,light_texture,lx0,ly0,lx1,ly1,lx2,ly2,opacity); + #ifdef cimg_use_board if (pboard) { const float @@ -47704,10 +49795,10 @@ n2 = (unsigned int)primitive[2], n3 = (unsigned int)primitive[3]; const int - x0 = (int)projections(n0,0), y0 = (int)projections(n0,1), - x1 = (int)projections(n1,0), y1 = (int)projections(n1,1), - x2 = (int)projections(n2,0), y2 = (int)projections(n2,1), - x3 = (int)projections(n3,0), y3 = (int)projections(n3,1), + x0 = cimg::uiround(projections(n0,0)), y0 = cimg::uiround(projections(n0,1)), + x1 = cimg::uiround(projections(n1,0)), y1 = cimg::uiround(projections(n1,1)), + x2 = cimg::uiround(projections(n2,0)), y2 = cimg::uiround(projections(n2,1)), + x3 = cimg::uiround(projections(n3,0)), y3 = cimg::uiround(projections(n3,1)), xc = (x0 + x1 + x2 + x3)/4, yc = (y0 + y1 + y2 + y3)/4; const float z0 = vertices(n0,2) + Z + _focale, @@ -47720,6 +49811,7 @@ case 0 : draw_point(x0,y0,pcolor,opacity).draw_point(x1,y1,pcolor,opacity). draw_point(x2,y2,pcolor,opacity).draw_point(x3,y3,pcolor,opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(color[0],color[1],color[2],(unsigned char)(opacity*255)); @@ -47737,6 +49829,7 @@ else draw_line(x0,y0,x1,y1,pcolor,opacity).draw_line(x1,y1,x2,y2,pcolor,opacity). draw_line(x2,y2,x3,y3,pcolor,opacity).draw_line(x3,y3,x0,y0,pcolor,opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(color[0],color[1],color[2],(unsigned char)(opacity*255)); @@ -47753,6 +49846,7 @@ draw_triangle(zbuffer,x0,y0,z0,x2,y2,z2,x3,y3,z3,pcolor,opacity); else draw_triangle(x0,y0,x1,y1,x2,y2,pcolor,opacity).draw_triangle(x0,y0,x2,y2,x3,y3,pcolor,opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(color[0],color[1],color[2],(unsigned char)(opacity*255)); @@ -47772,6 +49866,7 @@ else _draw_triangle(x0,y0,x1,y1,x2,y2,pcolor,opacity,lightprops(l)). _draw_triangle(x0,y0,x2,y2,x3,y3,pcolor,opacity,lightprops(l)); + #ifdef cimg_use_board if (pboard) { const float lp = std::min(lightprops(l),1.f); @@ -47820,10 +49915,10 @@ } break; case 5 : { const unsigned int - lx0 = (unsigned int)lightprops(n0,0), ly0 = (unsigned int)lightprops(n0,1), - lx1 = (unsigned int)lightprops(n1,0), ly1 = (unsigned int)lightprops(n1,1), - lx2 = (unsigned int)lightprops(n2,0), ly2 = (unsigned int)lightprops(n2,1), - lx3 = (unsigned int)lightprops(n3,0), ly3 = (unsigned int)lightprops(n3,1), + lx0 = (unsigned int)cimg::uiround(lightprops(n0,0)), ly0 = (unsigned int)cimg::uiround(lightprops(n0,1)), + lx1 = (unsigned int)cimg::uiround(lightprops(n1,0)), ly1 = (unsigned int)cimg::uiround(lightprops(n1,1)), + lx2 = (unsigned int)cimg::uiround(lightprops(n2,0)), ly2 = (unsigned int)cimg::uiround(lightprops(n2,1)), + lx3 = (unsigned int)cimg::uiround(lightprops(n3,0)), ly3 = (unsigned int)cimg::uiround(lightprops(n3,1)), lxc = (lx0 + lx1 + lx2 + lx3)/4, lyc = (ly0 + ly1 + ly2 + ly3)/4; if (zbuffer) draw_triangle(zbuffer,x0,y0,z0,x1,y1,z1,xc,yc,zc,pcolor,light_texture,lx0,ly0,lx1,ly1,lxc,lyc,opacity). @@ -47873,9 +49968,9 @@ tx0 = (int)primitive[3], ty0 = (int)primitive[4], tx1 = (int)primitive[5], ty1 = (int)primitive[6], tx2 = (int)primitive[7], ty2 = (int)primitive[8], - x0 = (int)projections(n0,0), y0 = (int)projections(n0,1), - x1 = (int)projections(n1,0), y1 = (int)projections(n1,1), - x2 = (int)projections(n2,0), y2 = (int)projections(n2,1); + x0 = cimg::uiround(projections(n0,0)), y0 = cimg::uiround(projections(n0,1)), + x1 = cimg::uiround(projections(n1,0)), y1 = cimg::uiround(projections(n1,1)), + x2 = cimg::uiround(projections(n2,0)), y2 = cimg::uiround(projections(n2,1)); const float z0 = vertices(n0,2) + Z + _focale, z1 = vertices(n1,2) + Z + _focale, @@ -47906,6 +50001,7 @@ draw_line(x0,y0,z0,x1,y1,z1,color,tx0,ty0,tx1,ty1,opacity). draw_line(x0,y0,z0,x2,y2,z2,color,tx0,ty0,tx2,ty2,opacity). draw_line(x1,y1,z1,x2,y2,z2,color,tx1,ty1,tx2,ty2,opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(128,128,128,(unsigned char)(opacity*255)); @@ -47918,6 +50014,7 @@ case 2 : if (zbuffer) draw_triangle(zbuffer,x0,y0,z0,x1,y1,z1,x2,y2,z2,color,tx0,ty0,tx1,ty1,tx2,ty2,opacity); else draw_triangle(x0,y0,z0,x1,y1,z1,x2,y2,z2,color,tx0,ty0,tx1,ty1,tx2,ty2,opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(128,128,128,(unsigned char)(opacity*255)); @@ -47931,6 +50028,7 @@ if (zbuffer) draw_triangle(zbuffer,x0,y0,z0,x1,y1,z1,x2,y2,z2,color,tx0,ty0,tx1,ty1,tx2,ty2,opacity,lightprops(l)); else draw_triangle(x0,y0,z0,x1,y1,z1,x2,y2,z2,color,tx0,ty0,tx1,ty1,tx2,ty2,opacity,lightprops(l)); + #ifdef cimg_use_board if (pboard) { const float lp = std::min(lightprops(l),1.f); @@ -47951,6 +50049,7 @@ else draw_triangle(x0,y0,z0,x1,y1,z1,x2,y2,z2,color,tx0,ty0,tx1,ty1,tx2,ty2, lightprops(n0),lightprops(n1),lightprops(n2),opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(128,128,128,(unsigned char)(opacity*255)); @@ -47973,6 +50072,7 @@ (unsigned int)lightprops(n1,0),(unsigned int)lightprops(n1,1), (unsigned int)lightprops(n2,0),(unsigned int)lightprops(n2,1), opacity); + #ifdef cimg_use_board if (pboard) { const float @@ -48008,18 +50108,15 @@ tx1 = (int)primitive[6], ty1 = (int)primitive[7], tx2 = (int)primitive[8], ty2 = (int)primitive[9], tx3 = (int)primitive[10], ty3 = (int)primitive[11], - txc = (tx0 + tx1 + tx2 + tx3)/4, tyc = (ty0 + ty1 + ty2 + ty3)/4, - x0 = (int)projections(n0,0), y0 = (int)projections(n0,1), - x1 = (int)projections(n1,0), y1 = (int)projections(n1,1), - x2 = (int)projections(n2,0), y2 = (int)projections(n2,1), - x3 = (int)projections(n3,0), y3 = (int)projections(n3,1), - xc = (x0 + x1 + x2 + x3)/4, yc = (y0 + y1 + y2 + y3)/4; + x0 = cimg::uiround(projections(n0,0)), y0 = cimg::uiround(projections(n0,1)), + x1 = cimg::uiround(projections(n1,0)), y1 = cimg::uiround(projections(n1,1)), + x2 = cimg::uiround(projections(n2,0)), y2 = cimg::uiround(projections(n2,1)), + x3 = cimg::uiround(projections(n3,0)), y3 = cimg::uiround(projections(n3,1)); const float z0 = vertices(n0,2) + Z + _focale, z1 = vertices(n1,2) + Z + _focale, z2 = vertices(n2,2) + Z + _focale, - z3 = vertices(n3,2) + Z + _focale, - zc = (z0 + z1 + z2 + z3)/4; + z3 = vertices(n3,2) + Z + _focale; switch (render_type) { case 0 : @@ -48031,6 +50128,7 @@ ty2<=0?0:ty2>=color.height()?color.height() - 1:ty2)._data,opacity). draw_point(x3,y3,color.get_vector_at(tx3<=0?0:tx3>=color.width()?color.width() - 1:tx3, ty3<=0?0:ty3>=color.height()?color.height() - 1:ty3)._data,opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(128,128,128,(unsigned char)(opacity*255)); @@ -48052,6 +50150,7 @@ draw_line(x1,y1,z1,x2,y2,z2,color,tx1,ty1,tx2,ty2,opacity). draw_line(x2,y2,z2,x3,y3,z3,color,tx2,ty2,tx3,ty3,opacity). draw_line(x3,y3,z3,x0,y0,z0,color,tx3,ty3,tx0,ty0,opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(128,128,128,(unsigned char)(opacity*255)); @@ -48069,6 +50168,7 @@ else draw_triangle(x0,y0,z0,x1,y1,z1,x2,y2,z2,color,tx0,ty0,tx1,ty1,tx2,ty2,opacity). draw_triangle(x0,y0,z0,x2,y2,z2,x3,y3,z3,color,tx0,ty0,tx2,ty2,tx3,ty3,opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(128,128,128,(unsigned char)(opacity*255)); @@ -48088,6 +50188,7 @@ else draw_triangle(x0,y0,z0,x1,y1,z1,x2,y2,z2,color,tx0,ty0,tx1,ty1,tx2,ty2,opacity,lightprops(l)). draw_triangle(x0,y0,z0,x2,y2,z2,x3,y3,z3,color,tx0,ty0,tx2,ty2,tx3,ty3,opacity,lightprops(l)); + #ifdef cimg_use_board if (pboard) { const float lp = std::min(lightprops(l),1.f); @@ -48107,26 +50208,18 @@ case 4 : { const float lightprop0 = lightprops(n0), lightprop1 = lightprops(n1), - lightprop2 = lightprops(n2), lightprop3 = lightprops(n3), - lightpropc = (lightprop0 + lightprop1 + lightprop2 + lightprop3)/4; + lightprop2 = lightprops(n2), lightprop3 = lightprops(n3); if (zbuffer) - draw_triangle(zbuffer,x0,y0,z0,x1,y1,z1,xc,yc,zc,color,tx0,ty0,tx1,ty1,txc,tyc, - lightprop0,lightprop1,lightpropc,opacity). - draw_triangle(zbuffer,x1,y1,z1,x2,y2,z2,xc,yc,zc,color,tx1,ty1,tx2,ty2,txc,tyc, - lightprop1,lightprop2,lightpropc,opacity). - draw_triangle(zbuffer,x2,y2,z2,x3,y3,z3,xc,yc,zc,color,tx2,ty2,tx3,ty3,txc,tyc, - lightprop2,lightprop3,lightpropc,opacity). - draw_triangle(zbuffer,x3,y3,z3,x0,y0,z0,xc,yc,zc,color,tx3,ty3,tx0,ty0,txc,tyc, - lightprop3,lightprop0,lightpropc,opacity); + draw_triangle(zbuffer,x0,y0,z0,x1,y1,z1,x2,y2,z2,color,tx0,ty0,tx1,ty1,tx2,ty2, + lightprop0,lightprop1,lightprop2,opacity). + draw_triangle(zbuffer,x0,y0,z0,x2,y2,z2,x3,y3,z3,color,tx0,ty0,tx2,ty2,tx3,ty3, + lightprop0,lightprop2,lightprop3,opacity); else - draw_triangle(x0,y0,z0,x1,y1,z1,xc,yc,zc,color,tx0,ty0,tx1,ty1,txc,tyc, - lightprop0,lightprop1,lightpropc,opacity). - draw_triangle(x1,y1,z1,x2,y2,z2,xc,yc,zc,color,tx1,ty1,tx2,ty2,txc,tyc, - lightprop1,lightprop2,lightpropc,opacity). - draw_triangle(x2,y2,z2,x3,y3,z3,xc,yc,zc,color,tx2,ty2,tx3,ty3,txc,tyc, - lightprop2,lightprop3,lightpropc,opacity). - draw_triangle(x3,y3,z3,x0,y0,z0,xc,yc,zc,color,tx3,ty3,tx0,ty0,txc,tyc, - lightprop3,lightprop0,lightpropc,opacity); + draw_triangle(x0,y0,z0,x1,y1,z1,x2,y2,z2,color,tx0,ty0,tx1,ty1,tx2,ty2, + lightprop0,lightprop1,lightprop2,opacity). + draw_triangle(x0,y0,z0,x2,y2,z2,x3,y3,z3,color,tx0,ty0,tx2,ty2,tx3,ty3, + lightprop0,lightprop2,lightprop3,opacity); + #ifdef cimg_use_board if (pboard) { board.setPenColorRGBi(128,128,128,(unsigned char)(opacity*255)); @@ -48141,29 +50234,20 @@ } break; case 5 : { const unsigned int - lx0 = (unsigned int)lightprops(n0,0), ly0 = (unsigned int)lightprops(n0,1), - lx1 = (unsigned int)lightprops(n1,0), ly1 = (unsigned int)lightprops(n1,1), - lx2 = (unsigned int)lightprops(n2,0), ly2 = (unsigned int)lightprops(n2,1), - lx3 = (unsigned int)lightprops(n3,0), ly3 = (unsigned int)lightprops(n3,1), - lxc = (lx0 + lx1 + lx2 + lx3)/4, lyc = (ly0 + ly1 + ly2 + ly3)/4; + lx0 = (unsigned int)cimg::uiround(lightprops(n0,0)), ly0 = (unsigned int)cimg::uiround(lightprops(n0,1)), + lx1 = (unsigned int)cimg::uiround(lightprops(n1,0)), ly1 = (unsigned int)cimg::uiround(lightprops(n1,1)), + lx2 = (unsigned int)cimg::uiround(lightprops(n2,0)), ly2 = (unsigned int)cimg::uiround(lightprops(n2,1)), + lx3 = (unsigned int)cimg::uiround(lightprops(n3,0)), ly3 = (unsigned int)cimg::uiround(lightprops(n3,1)); if (zbuffer) - draw_triangle(zbuffer,x0,y0,z0,x1,y1,z1,xc,yc,zc,color,tx0,ty0,tx1,ty1,txc,tyc, - light_texture,lx0,ly0,lx1,ly1,lxc,lyc,opacity). - draw_triangle(zbuffer,x1,y1,z1,x2,y2,z2,xc,yc,zc,color,tx1,ty1,tx2,ty2,txc,tyc, - light_texture,lx1,ly1,lx2,ly2,lxc,lyc,opacity). - draw_triangle(zbuffer,x2,y2,z2,x3,y3,z3,xc,yc,zc,color,tx2,ty2,tx3,ty3,txc,tyc, - light_texture,lx2,ly2,lx3,ly3,lxc,lyc,opacity). - draw_triangle(zbuffer,x3,y3,z3,x0,y0,z0,xc,yc,zc,color,tx3,ty3,tx0,ty0,txc,tyc, - light_texture,lx3,ly3,lx0,ly0,lxc,lyc,opacity); + draw_triangle(zbuffer,x0,y0,z0,x1,y1,z1,x2,y2,z2,color,tx0,ty0,tx1,ty1,tx2,ty2, + light_texture,lx0,ly0,lx1,ly1,lx2,ly2,opacity). + draw_triangle(zbuffer,x0,y0,z0,x2,y2,z2,x3,y3,z3,color,tx0,ty0,tx2,ty2,tx3,ty3, + light_texture,lx0,ly0,lx2,ly2,lx3,ly3,opacity); else - draw_triangle(x0,y0,z0,x1,y1,z1,xc,yc,zc,color,tx0,ty0,tx1,ty1,txc,tyc, - light_texture,lx0,ly0,lx1,ly1,lxc,lyc,opacity). - draw_triangle(x1,y1,z1,x2,y2,z2,xc,yc,zc,color,tx1,ty1,tx2,ty2,txc,tyc, - light_texture,lx1,ly1,lx2,ly2,lxc,lyc,opacity). - draw_triangle(x2,y2,z2,x3,y3,z3,xc,yc,zc,color,tx2,ty2,tx3,ty3,txc,tyc, - light_texture,lx2,ly2,lx3,ly3,lxc,lyc,opacity). - draw_triangle(x3,y3,z3,x0,y0,z0,xc,yc,zc,color,tx3,ty3,tx0,ty0,txc,tyc, - light_texture,lx3,ly3,lx0,ly0,lxc,lyc,opacity); + draw_triangle(x0,y0,z0,x1,y1,z1,x2,y2,z2,color,tx0,ty0,tx1,ty1,tx2,ty2, + light_texture,lx0,ly0,lx1,ly1,lx2,ly2,opacity). + draw_triangle(x0,y0,z0,x2,y2,z2,x3,y3,z3,color,tx0,ty0,tx2,ty2,tx3,ty3, + light_texture,lx0,ly0,lx2,ly2,lx3,ly3,opacity); #ifdef cimg_use_board if (pboard) { const float @@ -48246,7 +50330,10 @@ if (!disp) { disp.assign(cimg_fitscreen(_width,_height,_depth),title?title:0,1); if (!title) disp.set_title("CImg<%s> (%ux%ux%ux%u)",pixel_type(),_width,_height,_depth,_spectrum); - } else if (title) disp.set_title("%s",title); + } else { + if (title) disp.set_title("%s",title); + disp.move_inside_screen(); + } CImg thumb; if (width()>disp.screen_width() || height()>disp.screen_height()) @@ -48258,17 +50345,16 @@ disp.show().set_key(0).set_wheel().show_mouse(); static const unsigned char foreground_color[] = { 255,255,255 }, background_color[] = { 0,0,0 }; - int area = 0, area_started = 0, area_clicked = 0, phase = 0, - X0 = (int)((XYZ?XYZ[0]:(_width - 1)/2)%_width), - Y0 = (int)((XYZ?XYZ[1]:(_height - 1)/2)%_height), - Z0 = (int)((XYZ?XYZ[2]:(_depth - 1)/2)%_depth), + X0 = (int)((XYZ?XYZ[0]:_width/2)%_width), + Y0 = (int)((XYZ?XYZ[1]:_height/2)%_height), + Z0 = (int)((XYZ?XYZ[2]:_depth/2)%_depth), X1 =-1, Y1 = -1, Z1 = -1, X3d = -1, Y3d = -1, oX3d = X3d, oY3d = -1, omx = -1, omy = -1; float X = -1, Y = -1, Z = -1; - unsigned int key = 0; + unsigned int key = 0, font_size = 32; bool is_deep_selection = is_deep_selection_default, shape_selected = false, text_down = false, visible_cursor = true; @@ -48310,7 +50396,7 @@ if (disp.is_keyCTRLLEFT() || disp.is_keyCTRLRIGHT()) { disp.set_wheel(1); key = 0; } break; case cimg::keyPAGEDOWN : if (disp.is_keyCTRLLEFT() || disp.is_keyCTRLRIGHT()) { disp.set_wheel(-1); key = 0; } break; - case cimg::keyA : if (disp.is_keyCTRLLEFT() || disp.is_keyCTRLRIGHT()) { + case cimg::keyX : if (disp.is_keyCTRLLEFT() || disp.is_keyCTRLRIGHT()) { is_axes = !is_axes; disp.set_key(key,false); key = 0; visu0.assign(); } break; case cimg::keyD : if (disp.is_keyCTRLLEFT() || disp.is_keyCTRLRIGHT()) { @@ -48344,9 +50430,9 @@ if ((file=cimg::std_fopen(filename,"r"))!=0) cimg::fclose(file); } while (file); if (visu0) { - (+visu0).__draw_text(" Saving snapshot...",text_down).display(disp); + (+visu0).__draw_text(" Saving snapshot...",font_size,(int)text_down).display(disp); visu0.save(filename); - (+visu0).__draw_text(" Snapshot '%s' saved. ",text_down,filename._data).display(disp); + (+visu0).__draw_text(" Snapshot '%s' saved. ",font_size,(int)text_down,filename._data).display(disp); } disp.set_key(key,false); key = 0; } break; @@ -48354,6 +50440,7 @@ static unsigned int snap_number = 0; std::FILE *file; do { + #ifdef cimg_use_zlib cimg_snprintf(filename,filename._width,cimg_appname "_%.4u.cimgz",snap_number++); #else @@ -48361,9 +50448,9 @@ #endif if ((file=cimg::std_fopen(filename,"r"))!=0) cimg::fclose(file); } while (file); - (+visu0).__draw_text(" Saving instance... ",text_down).display(disp); + (+visu0).__draw_text(" Saving instance... ",font_size,(int)text_down).display(disp); save(filename); - (+visu0).__draw_text(" Instance '%s' saved. ",text_down,filename._data).display(disp); + (+visu0).__draw_text(" Instance '%s' saved. ",font_size,(int)text_down,filename._data).display(disp); disp.set_key(key,false); key = 0; } break; } @@ -48673,41 +50760,44 @@ zyc0 = (zyp0 + zyn0)/2; switch (feature_type) { - case 1 : { - visu.draw_arrow(xc0,yc0,xc,yc,background_color,0.9f,30,5,0x55555555). - draw_arrow(xc0,yc0,xc,yc,foreground_color,0.9f,30,5,0xAAAAAAAA); + case 1 : { // Vector + visu.draw_arrow(xc0,yc0,xc,yc,background_color,0.9f,30,5,0x33333333). + draw_arrow(xc0,yc0,xc,yc,foreground_color,0.9f,30,5,0xCCCCCCCC); if (d) { - visu.draw_arrow(zxc0,yc0,zxc,yc,background_color,0.9f,30,5,0x55555555). - draw_arrow(zxc0,yc0,zxc,yc,foreground_color,0.9f,30,5,0xAAAAAAAA). - draw_arrow(xc0,zyc0,xc,zyc,background_color,0.9f,30,5,0x55555555). - draw_arrow(xc0,zyc0,xc,zyc,foreground_color,0.9f,30,5,0xAAAAAAAA); + visu.draw_arrow(zxc0,yc0,zxc,yc,background_color,0.9f,30,5,0x33333333). + draw_arrow(zxc0,yc0,zxc,yc,foreground_color,0.9f,30,5,0xCCCCCCCC). + draw_arrow(xc0,zyc0,xc,zyc,background_color,0.9f,30,5,0x33333333). + draw_arrow(xc0,zyc0,xc,zyc,foreground_color,0.9f,30,5,0xCCCCCCCC); } } break; - case 2 : { + case 2 : { // Box visu.draw_rectangle(X0 values = get_vector_at((int)X,(int)Y,(int)Z); - const bool is_large_spectrum = values._height>16; + const bool is_large_spectrum = values._height>8; if (is_large_spectrum) - values.draw_image(0,8,values.get_rows(values._height - 8,values._height - 1)).resize(1,16,1,1,0); + values.draw_image(0,4,values.get_rows(values._height - 4,values._height - 1)).resize(1,8,1,1,0); char *ctext = text._data + std::strlen(text), *const ltext = text._data + 512; for (unsigned int c = 0; c::format_s(), cimg::type::format(values[c])); ctext += std::strlen(ctext); - if (c==7 && is_large_spectrum) { - cimg_snprintf(ctext,24," (...)"); + if (c==3 && is_large_spectrum) { + cimg_snprintf(ctext,24," ..."); ctext += std::strlen(ctext); } *(ctext++) = ' '; *ctext = 0; @@ -48775,34 +50865,34 @@ length = cimg::round(cimg::hypot(dX,dY,dZ),0.1); if (_depth>1 || force_display_z_coord) cimg_snprintf(text,text._width, - " Box (%d,%d,%d)-(%d,%d,%d), Size = (%d,%d,%d), Length = %g ", + " Box ( %d,%d,%d ) - ( %d,%d,%d )\n Size = ( %d,%d,%d ), Length = %g ", origX + (X01 || force_display_z_coord) - cimg_snprintf(text,text._width," Ellipse (%d,%d,%d)-(%d,%d,%d), Radii = (%d,%d,%d) ", + cimg_snprintf(text,text._width," Ellipse ( %d,%d,%d ) - ( %d,%d,%d ), Radii = ( %d,%d,%d ) ", origX + X0,origY + Y0,origZ + Z0,origX + X1,origY + Y1,origZ + Z1, 1 + cimg::abs(X0 - X1),1 + cimg::abs(Y0 - Y1),1 + cimg::abs(Z0 - Z1)); - else cimg_snprintf(text,text._width," Ellipse (%d,%d)-(%d,%d), Radii = (%d,%d) ", + else cimg_snprintf(text,text._width," Ellipse ( %d,%d ) - ( %d,%d ), Radii = ( %d,%d ) ", origX + X0,origY + Y0,origX + X1,origY + Y1, 1 + cimg::abs(X0 - X1),1 + cimg::abs(Y0 - Y1)); } - if (phase || (mx>=0 && my>=0)) visu.__draw_text("%s",text_down,text._data); + if (phase || (mx>=0 && my>=0)) visu.__draw_text("%s",font_size,(int)text_down,text._data); } disp.display(visu); @@ -48899,7 +50989,9 @@ case 3 : if (cimg::type::is_float()) img2d.normalize((ucharT)0,(ucharT)255); else { - const float m = (float)cimg::type::min(), M = (float)cimg::type::max(); + const float + m = (float)cimg::type::min(), + M = (float)cimg::type::max(); (img2d-=m)*=255.f/(M - m>0?M - m:1); } break; } @@ -48941,7 +51033,7 @@ if (_spectrum>4) { colormap(0,4) = 220; colormap(1,4) = 10; colormap(2,4) = 220; } if (_spectrum>5) { colormap(0,5) = 10; colormap(1,5) = 220; colormap(2,5) = 220; } if (_spectrum>6) { - ulongT rng = 10; + cimg_uint64 rng = 10; cimg_for_inY(colormap,6,colormap.height()-1,k) { colormap(0,k) = (unsigned char)(120 + cimg::rand(-100.f,100.f,&rng)); colormap(1,k) = (unsigned char)(120 + cimg::rand(-100.f,100.f,&rng)); @@ -48953,7 +51045,7 @@ CImg visu0, visu, graph, text, axes; int x0 = -1, x1 = -1, y0 = -1, y1 = -1, omouse_x = -2, omouse_y = -2; const unsigned int one = plot_type==3?0U:1U; - unsigned int okey = 0, obutton = 0; + unsigned int okey = 0, obutton = 0, font_size = 32; CImg message(1024); CImg_3x3(I,unsigned char); @@ -48982,15 +51074,15 @@ py = (float)std::pow(10.,(int)std::log10(dy?dy:1) - 2.); const CImg seqx = dx<=0?CImg::vector(nxmin): - CImg::sequence(1 + gdimx/60,nxmin,one?nxmax:nxmin + (nxmax - nxmin)*(siz + 1)/siz).round(px), - seqy = CImg::sequence(1 + gdimy/60,nymax,nymin).round(py); + CImg::sequence(1 + gdimx/60,nxmin,one?nxmax:nxmin + (nxmax - nxmin)*(siz + 1)/siz), + seqy = CImg::sequence(1 + gdimy/60,nymax,nymin); const bool allow_zero = (nxmin*nxmax>0) || (nymin*nymax>0); - axes.draw_axes(seqx,seqy,white,1,~0U,~0U,13,allow_zero); - if (nymin>0) axes.draw_axis(seqx,gdimy - 1,gray,1,~0U,13,allow_zero); - if (nymax<0) axes.draw_axis(seqx,0,gray,1,~0U,13,allow_zero); - if (nxmin>0) axes.draw_axis(0,seqy,gray,1,~0U,13,allow_zero); - if (nxmax<0) axes.draw_axis(gdimx - 1,seqy,gray,1,~0U,13,allow_zero); + axes.draw_axes(seqx,seqy,white,1,~0U,~0U,13,allow_zero,px,py); + if (nymin>0) axes.draw_axis(seqx,gdimy - 1,gray,1,~0U,13,allow_zero,px); + if (nymax<0) axes.draw_axis(seqx,0,gray,1,~0U,13,allow_zero,px); + if (nxmin>0) axes.draw_axis(0,seqy,gray,1,~0U,13,allow_zero,py); + if (nxmax<0) axes.draw_axis(gdimx - 1,seqy,gray,1,~0U,13,allow_zero,py); cimg_for3x3(axes,x,y,0,0,I,unsigned char) if (Icc) { @@ -49107,9 +51199,9 @@ cimg_snprintf(filename,filename._width,cimg_appname "_%.4u.bmp",snap_number++); if ((file=cimg::std_fopen(filename,"r"))!=0) cimg::fclose(file); } while (file); - (+screen).__draw_text(" Saving snapshot... ",false).display(disp); + (+screen).__draw_text(" Saving snapshot... ",font_size,0).display(disp); screen.save(filename); - (+screen).__draw_text(" Snapshot '%s' saved. ",false,filename._data).display(disp); + (+screen).__draw_text(" Snapshot '%s' saved. ",font_size,0,filename._data).display(disp); } disp.set_key(key,false); okey = 0; } break; @@ -49119,6 +51211,7 @@ CImg &screen = visu?visu:visu0; std::FILE *file; do { + #ifdef cimg_use_zlib cimg_snprintf(filename,filename._width,cimg_appname "_%.4u.cimgz",snap_number++); #else @@ -49126,9 +51219,9 @@ #endif if ((file=cimg::std_fopen(filename,"r"))!=0) cimg::fclose(file); } while (file); - (+screen).__draw_text(" Saving instance... ",false).display(disp); + (+screen).__draw_text(" Saving instance... ",font_size,0).display(disp); save(filename); - (+screen).__draw_text(" Instance '%s' saved. ",false,filename._data).display(disp); + (+screen).__draw_text(" Instance '%s' saved. ",font_size,0,filename._data).display(disp); } disp.set_key(key,false); okey = 0; } break; @@ -49220,9 +51313,10 @@ #ifdef cimg_load_plugin8 cimg_load_plugin8(filename); #endif - // Ascii formats + // Text formats if (!cimg::strcasecmp(ext,"asc")) load_ascii(filename); - else if (!cimg::strcasecmp(ext,"dlm") || + else if (!cimg::strcasecmp(ext,"csv") || + !cimg::strcasecmp(ext,"dlm") || !cimg::strcasecmp(ext,"txt")) load_dlm(filename); // 2D binary formats @@ -49348,7 +51442,7 @@ return CImg().load(filename); } - //! Load image from an Ascii file. + //! Load image from an ascii file. /** \param filename Filename, as a C -string. **/ @@ -49356,17 +51450,17 @@ return _load_ascii(0,filename); } - //! Load image from an Ascii file \inplace. + //! Load image from an ascii file \inplace. static CImg get_load_ascii(const char *const filename) { return CImg().load_ascii(filename); } - //! Load image from an Ascii file \overloading. + //! Load image from an ascii file \overloading. CImg& load_ascii(std::FILE *const file) { return _load_ascii(file,0); } - //! Loadimage from an Ascii file \newinstance. + //! Loadimage from an ascii file \newinstance. static CImg get_load_ascii(std::FILE *const file) { return CImg().load_ascii(file); } @@ -49386,7 +51480,7 @@ if (!dx || !dy || !dz || !dc) { if (!file) cimg::fclose(nfile); throw CImgIOException(_cimg_instance - "load_ascii(): Invalid Ascii header in file '%s', image dimensions are set " + "load_ascii(): Invalid ascii header in file '%s', image dimensions are set " "to (%u,%u,%u,%u).", cimg_instance, filename?filename:"(FILE*)",dx,dy,dz,dc); @@ -49531,7 +51625,7 @@ align_bytes = (4 - dx_bytes%4)%4; const ulongT cimg_iobuffer = (ulongT)24*1024*1024, - buf_size = std::min((ulongT)cimg::abs(dy)*(dx_bytes + align_bytes),(ulongT)file_size - offset); + buf_size = (ulongT)cimg::abs(dy)*(dx_bytes + align_bytes); CImg colormap; if (bpp<16) { if (!nb_colors) nb_colors = 1< buffer; if (buf_size=0; --y) { if (buf_size>=cimg_iobuffer) { if (!cimg::fread(ptrs=buffer._data,dx_bytes,nfile)) break; @@ -49621,10 +51715,10 @@ } cimg_forX(*this,x) { const unsigned char c1 = *(ptrs++), c2 = *(ptrs++); - const unsigned short col = (unsigned short)(c1|(c2<<8)); - (*this)(x,y,2) = (T)(col&0x1F); - (*this)(x,y,1) = (T)((col>>5)&0x1F); - (*this)(x,y,0) = (T)((col>>10)&0x1F); + const unsigned short col = (unsigned short)c2<<8 | c1; + (*this)(x,y,2) = (T)((col&0x1F)<<3); + (*this)(x,y,1) = (T)(((col>>5)&0x3F)<<3); + (*this)(x,y,0) = (T)(((col>>11)&0x1F)<<3); } ptrs+=align_bytes; } @@ -49799,6 +51893,7 @@ throw CImgArgumentException(_cimg_instance "load_magick(): Specified filename is (null).", cimg_instance); + #ifdef cimg_use_magick Magick::Image image(filename); const unsigned int W = image.size().width(), H = image.size().height(); @@ -50126,17 +52221,17 @@ std::fgetc(nfile); switch (ppm_type) { - case 1 : { // 2D b&w Ascii + case 1 : { // 2D B&W ascii assign(W,H,1,1); T* ptrd = _data; cimg_foroff(*this,off) { if (std::fscanf(nfile,"%d",&rval)>0) *(ptrd++) = (T)(rval?0:255); else break; } } break; - case 2 : { // 2D grey Ascii + case 2 : { // 2D grey ascii assign(W,H,1,1); T* ptrd = _data; cimg_foroff(*this,off) { if (std::fscanf(nfile,"%d",&rval)>0) *(ptrd++) = (T)rval; else break; } } break; - case 3 : { // 2D color Ascii + case 3 : { // 2D color ascii assign(W,H,1,3); T *ptrd = data(0,0,0,0), *ptr_g = data(0,0,0,1), *ptr_b = data(0,0,0,2); cimg_forXY(*this,x,y) { @@ -51275,6 +53370,7 @@ *(ptr_b++) = (T)pixels[y][x].b; *(ptr_a++) = (T)pixels[y][x].a; } + return *this; #elif defined(cimg_use_tinyexr) float *res; const char *err = 0; @@ -51283,12 +53379,12 @@ if (ret) throw CImgIOException(_cimg_instance "load_exr(): Unable to load EXR file '%s'.", cimg_instance,filename); - CImg(out,4,width,height,1,true).get_permute_axes("yzcx").move_to(*this); + CImg(res,4,width,height,1,true).get_permute_axes("yzcx").move_to(*this); std::free(res); + return *this; #else return load_other(filename); #endif - return *this; } //! Load image from a EXR file \newinstance. @@ -51610,7 +53706,7 @@ cimg_instance,filename?filename:"(FILE*)"); cimg::fseek(nfile,0,SEEK_END); siz = cimg::ftell(nfile)/sizeof(T); - _size_y = (unsigned int)siz; + _size_y = (unsigned int)siz; _size_x = _size_z = _size_c = 1; cimg::fseek(nfile,fpos,SEEK_SET); } @@ -51917,7 +54013,7 @@ \param last_frame Index of the last frame to read. \param step_frame Step value for frame reading. \param axis Alignment axis. - \param align Apending alignment. + \param align Appending alignment. **/ CImg& load_video(const char *const filename, const unsigned int first_frame=0, const unsigned int last_frame=~0U, @@ -52255,71 +54351,116 @@ return CImg().load_dcraw_external(filename); } +#ifdef cimg_use_opencv + + // Convert a continuous cv::Mat to a CImg. + static CImg _cvmat2cimg(const cv::Mat &src) { + if (src.channels()==1) return CImg(src.ptr(),src.cols,src.rows,1,1); + else if (src.channels()==3) { // BGR + CImg res(src.cols,src.rows,1,src.channels()); + const unsigned char *ptrs = src.ptr(); + unsigned char *pR = res.data(), *pG = res.data(0,0,0,1), *pB = res.data(0,0,0,2); + cimg_forXY(res,x,y) { *(pB++) = *(ptrs++); *(pG++) = *(ptrs++); *(pR++) = *(ptrs++); } + return res; + } + return CImg(src.ptr(),src.channels(),src.cols,src.rows,1,true).get_permute_axes("yzcx"); + } + + // Convert a CImg to a cv::Mat. + cv::Mat _cimg2cvmat() const { + if (is_empty()) + throw CImgInstanceException(_cimg_instance + "_cimg2cvmat() : Instance image is empty.", + cimg_instance); + if (_spectrum==2) + throw CImgInstanceException(_cimg_instance + "_cimg2cvmat() : Invalid number of channels (should be '1' or '3+').", + cimg_instance); + if (_depth!=1) + throw CImgInstanceException(_cimg_instance + "_cimg2cvmat() : Invalid number of slices (should be '1').", + cimg_instance); + int mat_type = -1; + if (cimg::type::string()==cimg::type::string()) mat_type = CV_8UC1; + if (cimg::type::string()==cimg::type::string()) mat_type = CV_8SC1; + if (cimg::type::string()==cimg::type::string()) mat_type = CV_16UC1; + if (cimg::type::string()==cimg::type::string()) mat_type = CV_16SC1; + if (cimg::type::string()==cimg::type::string()) mat_type = CV_32SC1; + if (cimg::type::string()==cimg::type::string()) mat_type = CV_32FC1; + if (cimg::type::string()==cimg::type::string()) mat_type = CV_64FC1; + if (mat_type<0) + throw CImgInstanceException(_cimg_instance + "_cvmat2cimg() : pixel type '%s' is not supported.", + cimg_instance,pixel_type()); + cv::Mat res; + std::vector channels(_spectrum); + if (_spectrum>1) { + cimg_forC(*this,c) + channels[c] = cv::Mat(_height,_width,mat_type,_data + _width*_height*(_spectrum - 1 - c)); + cv::merge(channels,res); + } else res = cv::Mat(_height,_width,mat_type,_data).clone(); + return res; + } + +#endif + //! Load image from a camera stream, using OpenCV. /** - \param camera_index Index of the camera to capture images from. + \param index Index of the camera to capture images from (from 0 to 63). + \param capture_width Width of the desired image ('0' stands for default value). + \param capture_height Height of the desired image ('0' stands for default value). \param skip_frames Number of frames to skip before the capture. - \param release_camera Tells if the camera ressource must be released at the end of the method. - \param capture_width Width of the desired image. - \param capture_height Height of the desired image. - **/ - CImg& load_camera(const unsigned int camera_index=0, const unsigned int skip_frames=0, - const bool release_camera=true, const unsigned int capture_width=0, - const unsigned int capture_height=0) { + \param release_camera Tells if the camera resource must be released at the end of the method. + **/ + CImg& load_camera(const unsigned int camera_index=0, + const unsigned int capture_width=0, const unsigned int capture_height=0, + const unsigned int skip_frames=0, const bool release_camera=true) { #ifdef cimg_use_opencv - if (camera_index>99) + if (camera_index>=64) throw CImgArgumentException(_cimg_instance "load_camera(): Invalid request for camera #%u " "(no more than 100 cameras can be managed simultaneously).", cimg_instance, camera_index); - static CvCapture *capture[100] = { 0 }; - static unsigned int capture_w[100], capture_h[100]; + static cv::VideoCapture *captures[64] = { 0 }; + static unsigned int captures_w[64], captures_h[64]; if (release_camera) { cimg::mutex(9); - if (capture[camera_index]) cvReleaseCapture(&(capture[camera_index])); - capture[camera_index] = 0; - capture_w[camera_index] = capture_h[camera_index] = 0; + if (captures[camera_index]) captures[camera_index]->release(); + delete captures[camera_index]; + captures[camera_index] = 0; + captures_w[camera_index] = captures_h[camera_index] = 0; cimg::mutex(9,0); return *this; } - if (!capture[camera_index]) { + if (!captures[camera_index]) { cimg::mutex(9); - capture[camera_index] = cvCreateCameraCapture(camera_index); - capture_w[camera_index] = 0; - capture_h[camera_index] = 0; - cimg::mutex(9,0); - if (!capture[camera_index]) { + captures[camera_index] = new cv::VideoCapture(camera_index); + captures_w[camera_index] = captures_h[camera_index] = 0; + if (!captures[camera_index]->isOpened()) { + delete captures[camera_index]; + captures[camera_index] = 0; + cimg::mutex(9,0); throw CImgIOException(_cimg_instance "load_camera(): Failed to initialize camera #%u.", cimg_instance, camera_index); } + cimg::mutex(9,0); } cimg::mutex(9); - if (capture_width!=capture_w[camera_index]) { - cvSetCaptureProperty(capture[camera_index],CV_CAP_PROP_FRAME_WIDTH,capture_width); - capture_w[camera_index] = capture_width; - } - if (capture_height!=capture_h[camera_index]) { - cvSetCaptureProperty(capture[camera_index],CV_CAP_PROP_FRAME_HEIGHT,capture_height); - capture_h[camera_index] = capture_height; - } - const IplImage *img = 0; - for (unsigned int i = 0; iwidthStep - 3*img->width); - assign(img->width,img->height,1,3); - const unsigned char* ptrs = (unsigned char*)img->imageData; - T *ptr_r = data(0,0,0,0), *ptr_g = data(0,0,0,1), *ptr_b = data(0,0,0,2); - if (step>0) cimg_forY(*this,y) { - cimg_forX(*this,x) { *(ptr_b++) = (T)*(ptrs++); *(ptr_g++) = (T)*(ptrs++); *(ptr_r++) = (T)*(ptrs++); } - ptrs+=step; - } else for (ulongT siz = (ulongT)img->width*img->height; siz; --siz) { - *(ptr_b++) = (T)*(ptrs++); *(ptr_g++) = (T)*(ptrs++); *(ptr_r++) = (T)*(ptrs++); - } - } + if (capture_width!=captures_w[camera_index]) { + captures[camera_index]->set(_cimg_cap_prop_frame_width,capture_width); + captures_w[camera_index] = capture_width; + } + if (capture_height!=captures_h[camera_index]) { + captures[camera_index]->set(_cimg_cap_prop_frame_height,capture_height); + captures_h[camera_index] = capture_height; + } + for (unsigned int i = 0; igrab(); + cv::Mat cvimg; + captures[camera_index]->read(cvimg); + if (cvimg.empty()) assign(); else _cvmat2cimg(cvimg).move_to(*this); cimg::mutex(9,0); return *this; #else @@ -52332,10 +54473,10 @@ } //! Load image from a camera stream, using OpenCV \newinstance. - static CImg get_load_camera(const unsigned int camera_index=0, const unsigned int skip_frames=0, - const bool release_camera=true, - const unsigned int capture_width=0, const unsigned int capture_height=0) { - return CImg().load_camera(camera_index,skip_frames,release_camera,capture_width,capture_height); + static CImg get_load_camera(const unsigned int camera_index=0, + const unsigned int capture_width=0, const unsigned int capture_height=0, + const unsigned int skip_frames=0, const bool release_camera=true) { + return CImg().load_camera(camera_index,capture_width,capture_height,skip_frames,release_camera); } //! Load image using various non-native ways. @@ -52480,7 +54621,7 @@ const CImg& _display(CImgDisplay &disp, const char *const title, const bool display_info, unsigned int *const XYZ, const bool exit_on_anykey, - const bool exit_on_simpleclick) const { + const bool exit_on_singleclick) const { unsigned int oldw = 0, oldh = 0, _XYZ[3] = { 0 }, key = 0; int x0 = 0, y0 = 0, z0 = 0, x1 = width() - 1, y1 = height() - 1, z1 = depth() - 1, old_mouse_x = -1, old_mouse_y = -1; @@ -52500,9 +54641,9 @@ if (reset_view) { if (XYZ) { _XYZ[0] = XYZ[0]; _XYZ[1] = XYZ[1]; _XYZ[2] = XYZ[2]; } else { - _XYZ[0] = (unsigned int)(x0 + x1)/2; - _XYZ[1] = (unsigned int)(y0 + y1)/2; - _XYZ[2] = (unsigned int)(z0 + z1)/2; + _XYZ[0] = (unsigned int)(x0 + x1 + 1)/2; + _XYZ[1] = (unsigned int)(y0 + y1 + 1)/2; + _XYZ[2] = (unsigned int)(z0 + z1 + 1)/2; } x0 = 0; y0 = 0; z0 = 0; x1 = width() - 1; y1 = height() - 1; z1 = depth() - 1; disp.resize(cimg_fitscreen(_width,_height,_depth),false); @@ -52563,7 +54704,7 @@ x1 = x0 + sx1; y1 = y0 + sy1; z1 = z0 + sz1; x0+=sx0; y0+=sy0; z0+=sz0; if ((sx0==sx1 && sy0==sy1) || (_depth>1 && sx0==sx1 && sz0==sz1) || (_depth>1 && sy0==sy1 && sz0==sz1)) { - if (exit_on_simpleclick && (!zoom || is_empty())) break; else reset_view = true; + if (exit_on_singleclick && (!zoom || is_empty())) break; else reset_view = true; } resize_disp = true; } else switch (key = disp.key()) { @@ -52908,18 +55049,16 @@ // Check input arguments if (is_empty()) { - if (disp) return CImg(disp.width(),disp.height(),1,(colors && colors[0].size()==1)?1:3,0). - _display_object3d(disp,title,vertices,primitives,colors,opacities,centering, - render_static,render_motion,is_double_sided,focale, - light_x,light_y,light_z,specular_lightness,specular_shininess, - display_axes,pose_matrix,exit_on_anykey); - else return CImg(1,2,1,1,64,128).resize(cimg_fitscreen(CImgDisplay::screen_width()/2, - CImgDisplay::screen_height()/2,1), - 1,(colors && colors[0].size()==1)?1:3,3). - _display_object3d(disp,title,vertices,primitives,colors,opacities,centering, - render_static,render_motion,is_double_sided,focale, - light_x,light_y,light_z,specular_lightness,specular_shininess, - display_axes,pose_matrix,exit_on_anykey); + CImg background; + if (colors && colors[0].size()==1) background.assign(1,2,1,1,64,128); + else background.assign(1,2,1,3,32,64,32,116,64,96); + if (disp) background.resize(disp.width(),disp.height(),1,-100,3); + else background.resize(cimg_fitscreen(CImgDisplay::screen_width()/2, + CImgDisplay::screen_height()/2,1),1,-100,3); + return background._display_object3d(disp,title,vertices,primitives,colors,opacities,centering, + render_static,render_motion,is_double_sided,focale, + light_x,light_y,light_z,specular_lightness,specular_shininess, + display_axes,pose_matrix,exit_on_anykey); } else { if (disp) disp.resize(*this,false); } CImg error_message(1024); if (!vertices.is_object3d(primitives,colors,opacities,true,error_message)) @@ -52955,7 +55094,7 @@ bool ndisplay_axes = display_axes; const CImg background_color(1,1,1,_spectrum,0), - foreground_color(1,1,1,_spectrum,255); + foreground_color(1,1,1,_spectrum,(T)std::min((int)cimg::type::max(),255)); float Xoff = 0, Yoff = 0, Zoff = 0, sprite_scale = 1, xm = 0, xM = vertices?vertices.get_shared_row(0).max_min(xm):0, @@ -52984,7 +55123,7 @@ CImg visu0(*this,false), visu; CImg zbuffer(visu0.width(),visu0.height(),1,1,0); bool init_pose = true, clicked = false, redraw = true; - unsigned int key = 0; + unsigned int key = 0, font_size = 32; int x0 = 0, y0 = 0, x1 = 0, y1 = 0, nrender_static = render_static, @@ -53018,13 +55157,20 @@ r00 = pose(0,0), r10 = pose(1,0), r20 = pose(2,0), r30 = pose(3,0), r01 = pose(0,1), r11 = pose(1,1), r21 = pose(2,1), r31 = pose(3,1), r02 = pose(0,2), r12 = pose(1,2), r22 = pose(2,2), r32 = pose(3,2); - if ((clicked && nrender_motion>=0) || (!clicked && nrender_static>=0)) + if ((clicked && nrender_motion>=0) || (!clicked && nrender_static>=0)) { + const tp *const pv0 = vertices.data(), *const pv1 = vertices.data(0,1), *const pv2 = vertices.data(0,2); + float + *const prv0 = rotated_vertices.data(), + *const prv1 = rotated_vertices.data(0,1), + *const prv2 = rotated_vertices.data(0,2); + cimg_pragma_openmp(parallel for cimg_openmp_if(vertices.width()>(cimg_openmp_sizefactor)*1024)) cimg_forX(vertices,l) { - const float x = (float)vertices(l,0), y = (float)vertices(l,1), z = (float)vertices(l,2); - rotated_vertices(l,0) = r00*x + r10*y + r20*z + r30; - rotated_vertices(l,1) = r01*x + r11*y + r21*z + r31; - rotated_vertices(l,2) = r02*x + r12*y + r22*z + r32; + const float x = (float)pv0[l], y = (float)pv1[l], z = (float)pv2[l]; + prv0[l] = r00*x + r10*y + r20*z + r30; + prv1[l] = r01*x + r11*y + r21*z + r31; + prv2[l] = r02*x + r12*y + r22*z + r32; } + } else cimg_forX(bbox_vertices,l) { const float x = bbox_vertices(l,0), y = bbox_vertices(l,1), z = bbox_vertices(l,2); rotated_bbox_vertices(l,0) = r00*x + r10*y + r20*z + r30; @@ -53083,12 +55229,13 @@ } // Handle user interaction - disp.wait(); + if (!redraw) disp.wait(); if ((disp.button() || disp.wheel()) && disp.mouse_x()>=0 && disp.mouse_y()>=0) { redraw = true; if (!clicked) { x0 = x1 = disp.mouse_x(); y0 = y1 = disp.mouse_y(); if (!disp.wheel()) clicked = true; } else { x1 = disp.mouse_x(); y1 = disp.mouse_y(); } - if (disp.button()&1) { + const bool is_keyCTRL = disp.is_keyCTRLLEFT() || disp.is_keyCTRLRIGHT(); + if (disp.button()&1 && !is_keyCTRL) { const float R = 0.45f*std::min(disp.width(),disp.height()), R2 = R*R, @@ -53112,7 +55259,7 @@ (CImg::rotation_matrix(u,v,w,-alpha)*pose).move_to(pose); x0 = x1; y0 = y1; } - if (disp.button()&2) { + if (disp.button()&2 && !is_keyCTRL) { if (focale>0) Zoff-=(y0 - y1)*focale/400; else { const float s = std::exp((y0 - y1)/400.f); pose*=s; sprite_scale*=s; } x0 = x1; y0 = y1; @@ -53122,8 +55269,10 @@ else { const float s = std::exp(disp.wheel()/20.f); pose*=s; sprite_scale*=s; } disp.set_wheel(); } - if (disp.button()&4) { Xoff+=(x1 - x0); Yoff+=(y1 - y0); x0 = x1; y0 = y1; } - if ((disp.button()&1) && (disp.button()&2)) { + if (disp.button()&4 || (disp.button()&1 && is_keyCTRL)) { + Xoff+=(x1 - x0); Yoff+=(y1 - y0); x0 = x1; y0 = y1; + } + if ((disp.button()&1) && (disp.button()&2) && !is_keyCTRL) { init_pose = true; disp.set_button(); x0 = x1; y0 = y1; pose = CImg(4,3,1,1, 1,0,0,0, 0,1,0,0, 0,0,1,0); } @@ -53177,7 +55326,7 @@ else zbuffer.assign(visu0.width(),visu0.height(),1,1,0); disp.set_key(key,false); key = 0; redraw = true; } break; - case cimg::keyA : if (disp.is_keyCTRLLEFT() || disp.is_keyCTRLRIGHT()) { // Show/hide 3D axes + case cimg::keyX : if (disp.is_keyCTRLLEFT() || disp.is_keyCTRLRIGHT()) { // Show/hide 3D axes ndisplay_axes = !ndisplay_axes; disp.set_key(key,false); key = 0; redraw = true; } break; @@ -53213,9 +55362,9 @@ cimg_snprintf(filename,filename._width,cimg_appname "_%.4u.bmp",snap_number++); if ((file=cimg::std_fopen(filename,"r"))!=0) cimg::fclose(file); } while (file); - (+visu).__draw_text(" Saving snapshot... ",false).display(disp); + (+visu).__draw_text(" Saving snapshot... ",font_size,0).display(disp); visu.save(filename); - (+visu).__draw_text(" Snapshot '%s' saved. ",false,filename._data).display(disp); + (+visu).__draw_text(" Snapshot '%s' saved. ",font_size,0,filename._data).display(disp); disp.set_key(key,false); key = 0; } break; case cimg::keyG : if (disp.is_keyCTRLLEFT() || disp.is_keyCTRLRIGHT()) { // Save object as a .off file @@ -53225,15 +55374,16 @@ cimg_snprintf(filename,filename._width,cimg_appname "_%.4u.off",snap_number++); if ((file=cimg::std_fopen(filename,"r"))!=0) cimg::fclose(file); } while (file); - (+visu).__draw_text(" Saving object... ",false).display(disp); + (+visu).__draw_text(" Saving object... ",font_size,0).display(disp); vertices.save_off(reverse_primitives?reverse_primitives:primitives,colors,filename); - (+visu).__draw_text(" Object '%s' saved. ",false,filename._data).display(disp); + (+visu).__draw_text(" Object '%s' saved. ",font_size,0,filename._data).display(disp); disp.set_key(key,false); key = 0; } break; case cimg::keyO : if (disp.is_keyCTRLLEFT() || disp.is_keyCTRLRIGHT()) { // Save object as a .cimg file static unsigned int snap_number = 0; std::FILE *file; do { + #ifdef cimg_use_zlib cimg_snprintf(filename,filename._width,cimg_appname "_%.4u.cimgz",snap_number++); #else @@ -53241,12 +55391,13 @@ #endif if ((file=cimg::std_fopen(filename,"r"))!=0) cimg::fclose(file); } while (file); - (+visu).__draw_text(" Saving object... ",false).display(disp); + (+visu).__draw_text(" Saving object... ",font_size,0).display(disp); vertices.get_object3dtoCImg3d(reverse_primitives?reverse_primitives:primitives,colors,opacities). save(filename); - (+visu).__draw_text(" Object '%s' saved. ",false,filename._data).display(disp); + (+visu).__draw_text(" Object '%s' saved. ",font_size,0,filename._data).display(disp); disp.set_key(key,false); key = 0; } break; + #ifdef cimg_use_board case cimg::keyP : if (disp.is_keyCTRLLEFT() || disp.is_keyCTRLRIGHT()) { // Save object as a .EPS file static unsigned int snap_number = 0; @@ -53255,7 +55406,7 @@ cimg_snprintf(filename,filename._width,cimg_appname "_%.4u.eps",snap_number++); if ((file=cimg::std_fopen(filename,"r"))!=0) cimg::fclose(file); } while (file); - (+visu).__draw_text(" Saving EPS snapshot... ",false).display(disp); + (+visu).__draw_text(" Saving EPS snapshot... ",font_size,0).display(disp); LibBoard::Board board; (+visu)._draw_object3d(&board,zbuffer.fill(0), Xoff + visu._width/2.f,Yoff + visu._height/2.f,Zoff, @@ -53266,7 +55417,7 @@ specular_lightness,specular_shininess,1, sprite_scale); board.saveEPS(filename); - (+visu).__draw_text(" Object '%s' saved. ",false,filename._data).display(disp); + (+visu).__draw_text(" Object '%s' saved. ",font_size,0,filename._data).display(disp); disp.set_key(key,false); key = 0; } break; case cimg::keyV : if (disp.is_keyCTRLLEFT() || disp.is_keyCTRLRIGHT()) { // Save object as a .SVG file @@ -53276,7 +55427,7 @@ cimg_snprintf(filename,filename._width,cimg_appname "_%.4u.svg",snap_number++); if ((file=cimg::std_fopen(filename,"r"))!=0) cimg::fclose(file); } while (file); - (+visu).__draw_text(" Saving SVG snapshot... ",false,13).display(disp); + (+visu).__draw_text(" Saving SVG snapshot... ",font_size,0).display(disp); LibBoard::Board board; (+visu)._draw_object3d(&board,zbuffer.fill(0), Xoff + visu._width/2.f,Yoff + visu._height/2.f,Zoff, @@ -53287,7 +55438,7 @@ specular_lightness,specular_shininess,1, sprite_scale); board.saveSVG(filename); - (+visu).__draw_text(" Object '%s' saved. ",false,filename._data).display(disp); + (+visu).__draw_text(" Object '%s' saved. ",font_size,0,filename._data).display(disp); disp.set_key(key,false); key = 0; } break; #endif @@ -53514,9 +55665,10 @@ #ifdef cimg_save_plugin8 cimg_save_plugin8(fn); #endif - // Ascii formats + // Text formats if (!cimg::strcasecmp(ext,"asc")) return save_ascii(fn); - else if (!cimg::strcasecmp(ext,"dlm") || + else if (!cimg::strcasecmp(ext,"csv") || + !cimg::strcasecmp(ext,"dlm") || !cimg::strcasecmp(ext,"txt")) return save_dlm(fn); else if (!cimg::strcasecmp(ext,"cpp") || !cimg::strcasecmp(ext,"hpp") || @@ -53543,8 +55695,14 @@ !cimg::strcasecmp(ext,"tiff")) return save_tiff(fn); // 3D binary formats - else if (!cimg::strcasecmp(ext,"cimgz")) return save_cimg(fn,true); - else if (!cimg::strcasecmp(ext,"cimg") || !*ext) return save_cimg(fn,false); + else if (!*ext) { +#ifdef cimg_use_zlib + return save_cimg(fn,true); +#else + return save_cimg(fn,false); +#endif + } else if (!cimg::strcasecmp(ext,"cimgz")) return save_cimg(fn,true); + else if (!cimg::strcasecmp(ext,"cimg")) return save_cimg(fn,false); else if (!cimg::strcasecmp(ext,"dcm")) return save_medcon_external(fn); else if (!cimg::strcasecmp(ext,"hdr") || !cimg::strcasecmp(ext,"nii")) return save_analyze(fn); @@ -53584,7 +55742,7 @@ return save_other(fn); } - //! Save image as an Ascii file. + //! Save image as an ascii file. /** \param filename Filename, as a C-string. **/ @@ -54938,7 +57096,7 @@ \param dc Number of channels of the image. \note - All pixel values of the saved image are set to \c 0. - - Use this method to save large images without having to instanciate and allocate them. + - Use this method to save large images without having to instantiate and allocate them. **/ static void save_empty_cimg(const char *const filename, const unsigned int dx, const unsigned int dy=1, @@ -55049,7 +57207,9 @@ switch (_spectrum) { case 1 : { // Grayscale image for (const T *ptr_r = data(), *const ptr_e = ptr_r + (ulongT)_width*_height; ptr_r default_color(1,3,1,1,200); + const CImg default_color(1,3,1,1,(tc)std::min((int)cimg::type::max(),200)); std::FILE *const nfile = file?file:cimg::fopen(filename,"w"); unsigned int supported_primitives = 0; cimglist_for(primitives,l) if (primitives[l].size()!=5) ++supported_primitives; @@ -55585,20 +57745,21 @@ cimg_instance,filename); #ifdef cimg_use_png -#define _cimg_sge_ext1 "png" -#define _cimg_sge_ext2 "png" +#define _cimg_sge_extension1 "png" +#define _cimg_sge_extension2 "png" #else -#define _cimg_sge_ext1 "pgm" -#define _cimg_sge_ext2 "ppm" +#define _cimg_sge_extension1 "pgm" +#define _cimg_sge_extension2 "ppm" #endif CImg command(1024), filename_tmp(256); std::FILE *file; do { cimg_snprintf(filename_tmp,filename_tmp._width,"%s%c%s.%s", cimg::temporary_path(),cimg_file_separator,cimg::filenamerand(), - _spectrum==1?_cimg_sge_ext1:_cimg_sge_ext2); + _spectrum==1?_cimg_sge_extension1:_cimg_sge_extension2); if ((file=cimg::std_fopen(filename_tmp,"rb"))!=0) cimg::fclose(file); } while (file); + #ifdef cimg_use_png save_png(filename_tmp); #else @@ -55641,17 +57802,17 @@ "ImageMagick only writes the first image slice.", cimg_instance,filename); #ifdef cimg_use_png -#define _cimg_sie_ext1 "png" -#define _cimg_sie_ext2 "png" +#define _cimg_sie_extension1 "png" +#define _cimg_sie_extension2 "png" #else -#define _cimg_sie_ext1 "pgm" -#define _cimg_sie_ext2 "ppm" +#define _cimg_sie_extension1 "pgm" +#define _cimg_sie_extension2 "ppm" #endif CImg command(1024), filename_tmp(256); std::FILE *file; do { cimg_snprintf(filename_tmp,filename_tmp._width,"%s%c%s.%s",cimg::temporary_path(), - cimg_file_separator,cimg::filenamerand(),_spectrum==1?_cimg_sie_ext1:_cimg_sie_ext2); + cimg_file_separator,cimg::filenamerand(),_spectrum==1?_cimg_sie_extension1:_cimg_sie_extension2); if ((file=cimg::std_fopen(filename_tmp,"rb"))!=0) cimg::fclose(file); } while (file); #ifdef cimg_use_png @@ -55795,7 +57956,7 @@ } //@} - }; + }; // struct CImg { ... /* #----------------------------------------- @@ -56544,7 +58705,7 @@ //! Return a reference to one image element of the list. /** - \param pos Indice of the image element. + \param pos Index of the image element. **/ CImg& operator()(const unsigned int pos) { #if cimg_verbosity>=3 @@ -56561,7 +58722,7 @@ //! Return a reference to one image of the list. /** - \param pos Indice of the image element. + \param pos Index of the image element. **/ const CImg& operator()(const unsigned int pos) const { return const_cast*>(this)->operator()(pos); @@ -56569,7 +58730,7 @@ //! Return a reference to one pixel value of one image of the list. /** - \param pos Indice of the image element. + \param pos Index of the image element. \param x X-coordinate of the pixel value. \param y Y-coordinate of the pixel value. \param z Z-coordinate of the pixel value. @@ -56752,7 +58913,7 @@ //! Return pointer to the pos-th image of the list. /** - \param pos Indice of the image element to access. + \param pos Index of the image element to access. \note list.data(n); is equivalent to list.data + n;. **/ #if cimg_verbosity>=3 @@ -56829,7 +58990,7 @@ //! Return pos-th image of the list. /** - \param pos Indice of the image element to access. + \param pos Index of the image element to access. **/ CImg& at(const int pos) { if (is_empty()) @@ -56842,7 +59003,7 @@ //! Access to pixel value with Dirichlet boundary conditions. /** - \param pos Indice of the image element to access. + \param pos Index of the image element to access. \param x X-coordinate of the pixel value. \param y Y-coordinate of the pixel value. \param z Z-coordinate of the pixel value. @@ -56851,17 +59012,17 @@ \note list.atNXYZC(p,x,y,z,c); is equivalent to list[p].atXYZC(x,y,z,c);. **/ T& atNXYZC(const int pos, const int x, const int y, const int z, const int c, const T& out_value) { - return (pos<0 || pos>=(int)_width)?(cimg::temporary(out_value)=out_value):_data[pos].atXYZC(x,y,z,c,out_value); + return (pos<0 || pos>=width())?(cimg::temporary(out_value)=out_value):_data[pos].atXYZC(x,y,z,c,out_value); } //! Access to pixel value with Dirichlet boundary conditions \const. T atNXYZC(const int pos, const int x, const int y, const int z, const int c, const T& out_value) const { - return (pos<0 || pos>=(int)_width)?out_value:_data[pos].atXYZC(x,y,z,c,out_value); + return (pos<0 || pos>=width())?out_value:_data[pos].atXYZC(x,y,z,c,out_value); } //! Access to pixel value with Neumann boundary conditions. /** - \param pos Indice of the image element to access. + \param pos Index of the image element to access. \param x X-coordinate of the pixel value. \param y Y-coordinate of the pixel value. \param z Z-coordinate of the pixel value. @@ -56897,7 +59058,7 @@ //! Access pixel value with Dirichlet boundary conditions for the 3 coordinates (\c pos, \c x,\c y,\c z). /** - \param pos Indice of the image element to access. + \param pos Index of the image element to access. \param x X-coordinate of the pixel value. \param y Y-coordinate of the pixel value. \param z Z-coordinate of the pixel value. @@ -56906,17 +59067,17 @@ \note list.atNXYZ(p,x,y,z,c); is equivalent to list[p].atXYZ(x,y,z,c);. **/ T& atNXYZ(const int pos, const int x, const int y, const int z, const int c, const T& out_value) { - return (pos<0 || pos>=(int)_width)?(cimg::temporary(out_value)=out_value):_data[pos].atXYZ(x,y,z,c,out_value); + return (pos<0 || pos>=width())?(cimg::temporary(out_value)=out_value):_data[pos].atXYZ(x,y,z,c,out_value); } //! Access pixel value with Dirichlet boundary conditions for the 3 coordinates (\c pos, \c x,\c y,\c z) \const. T atNXYZ(const int pos, const int x, const int y, const int z, const int c, const T& out_value) const { - return (pos<0 || pos>=(int)_width)?out_value:_data[pos].atXYZ(x,y,z,c,out_value); + return (pos<0 || pos>=width())?out_value:_data[pos].atXYZ(x,y,z,c,out_value); } //! Access to pixel value with Neumann boundary conditions for the 4 coordinates (\c pos, \c x,\c y,\c z). /** - \param pos Indice of the image element to access. + \param pos Index of the image element to access. \param x X-coordinate of the pixel value. \param y Y-coordinate of the pixel value. \param z Z-coordinate of the pixel value. @@ -56952,7 +59113,7 @@ //! Access to pixel value with Dirichlet boundary conditions for the 3 coordinates (\c pos, \c x,\c y). /** - \param pos Indice of the image element to access. + \param pos Index of the image element to access. \param x X-coordinate of the pixel value. \param y Y-coordinate of the pixel value. \param z Z-coordinate of the pixel value. @@ -56961,17 +59122,17 @@ \note list.atNXYZ(p,x,y,z,c); is equivalent to list[p].atXYZ(x,y,z,c);. **/ T& atNXY(const int pos, const int x, const int y, const int z, const int c, const T& out_value) { - return (pos<0 || pos>=(int)_width)?(cimg::temporary(out_value)=out_value):_data[pos].atXY(x,y,z,c,out_value); + return (pos<0 || pos>=width())?(cimg::temporary(out_value)=out_value):_data[pos].atXY(x,y,z,c,out_value); } //! Access to pixel value with Dirichlet boundary conditions for the 3 coordinates (\c pos, \c x,\c y) \const. T atNXY(const int pos, const int x, const int y, const int z, const int c, const T& out_value) const { - return (pos<0 || pos>=(int)_width)?out_value:_data[pos].atXY(x,y,z,c,out_value); + return (pos<0 || pos>=width())?out_value:_data[pos].atXY(x,y,z,c,out_value); } //! Access to pixel value with Neumann boundary conditions for the 3 coordinates (\c pos, \c x,\c y). /** - \param pos Indice of the image element to access. + \param pos Index of the image element to access. \param x X-coordinate of the pixel value. \param y Y-coordinate of the pixel value. \param z Z-coordinate of the pixel value. @@ -57007,7 +59168,7 @@ //! Access to pixel value with Dirichlet boundary conditions for the 2 coordinates (\c pos,\c x). /** - \param pos Indice of the image element to access. + \param pos Index of the image element to access. \param x X-coordinate of the pixel value. \param y Y-coordinate of the pixel value. \param z Z-coordinate of the pixel value. @@ -57016,17 +59177,17 @@ \note list.atNXYZ(p,x,y,z,c); is equivalent to list[p].atXYZ(x,y,z,c);. **/ T& atNX(const int pos, const int x, const int y, const int z, const int c, const T& out_value) { - return (pos<0 || pos>=(int)_width)?(cimg::temporary(out_value)=out_value):_data[pos].atX(x,y,z,c,out_value); + return (pos<0 || pos>=width())?(cimg::temporary(out_value)=out_value):_data[pos].atX(x,y,z,c,out_value); } //! Access to pixel value with Dirichlet boundary conditions for the 2 coordinates (\c pos,\c x) \const. T atNX(const int pos, const int x, const int y, const int z, const int c, const T& out_value) const { - return (pos<0 || pos>=(int)_width)?out_value:_data[pos].atX(x,y,z,c,out_value); + return (pos<0 || pos>=width())?out_value:_data[pos].atX(x,y,z,c,out_value); } //! Access to pixel value with Neumann boundary conditions for the 2 coordinates (\c pos, \c x). /** - \param pos Indice of the image element to access. + \param pos Index of the image element to access. \param x X-coordinate of the pixel value. \param y Y-coordinate of the pixel value. \param z Z-coordinate of the pixel value. @@ -57062,7 +59223,7 @@ //! Access to pixel value with Dirichlet boundary conditions for the coordinate (\c pos). /** - \param pos Indice of the image element to access. + \param pos Index of the image element to access. \param x X-coordinate of the pixel value. \param y Y-coordinate of the pixel value. \param z Z-coordinate of the pixel value. @@ -57071,17 +59232,17 @@ \note list.atNXYZ(p,x,y,z,c); is equivalent to list[p].atXYZ(x,y,z,c);. **/ T& atN(const int pos, const int x, const int y, const int z, const int c, const T& out_value) { - return (pos<0 || pos>=(int)_width)?(cimg::temporary(out_value)=out_value):(*this)(pos,x,y,z,c); + return (pos<0 || pos>=width())?(cimg::temporary(out_value)=out_value):(*this)(pos,x,y,z,c); } //! Access to pixel value with Dirichlet boundary conditions for the coordinate (\c pos) \const. T atN(const int pos, const int x, const int y, const int z, const int c, const T& out_value) const { - return (pos<0 || pos>=(int)_width)?out_value:(*this)(pos,x,y,z,c); + return (pos<0 || pos>=width())?out_value:(*this)(pos,x,y,z,c); } //! Return pixel value with Neumann boundary conditions for the coordinate (\c pos). /** - \param pos Indice of the image element to access. + \param pos Index of the image element to access. \param x X-coordinate of the pixel value. \param y Y-coordinate of the pixel value. \param z Z-coordinate of the pixel value. @@ -57253,17 +59414,17 @@ **/ bool containsNXYZC(const int n, const int x=0, const int y=0, const int z=0, const int c=0) const { if (is_empty()) return false; - return n>=0 && n<(int)_width && x>=0 && x<_data[n].width() && y>=0 && y<_data[n].height() && + return n>=0 && n=0 && x<_data[n].width() && y>=0 && y<_data[n].height() && z>=0 && z<_data[n].depth() && c>=0 && c<_data[n].spectrum(); } - //! Test if list contains image with specified indice. + //! Test if list contains image with specified index. /** \param n Index of the checked image. **/ bool containsN(const int n) const { if (is_empty()) return false; - return n>=0 && n<(int)_width; + return n>=0 && n& img = (*this)[l]; - if (img) res.draw_image(pos, - (int)(align*(dy - img._height)), - (int)(align*(dz - img._depth)), - (int)(align*(dc - img._spectrum)), - img); + if (img) { + if (img._height==1 && img._depth==1 && img._spectrum==1 && + res._height==1 && res._depth==1 && res._spectrum==1) + std::memcpy(&res[pos],img._data,sizeof(T)*img._width); + else + res.draw_image(pos, + (int)(align*(dy - img._height)), + (int)(align*(dz - img._depth)), + (int)(align*(dc - img._spectrum)), + img); + } pos+=img._width; } } break; @@ -57974,11 +60141,17 @@ res.assign(dx,dy,dz,dc,(T)0); if (res) cimglist_for(*this,l) { const CImg& img = (*this)[l]; - if (img) res.draw_image((int)(align*(dx - img._width)), - pos, - (int)(align*(dz - img._depth)), - (int)(align*(dc - img._spectrum)), - img); + if (img) { + if (img._width==1 && img._depth==1 && img._spectrum==1 && + res._width==1 && res._depth==1 && res._spectrum==1) + std::memcpy(&res[pos],img._data,sizeof(T)*img._height); + else + res.draw_image((int)(align*(dx - img._width)), + pos, + (int)(align*(dz - img._depth)), + (int)(align*(dc - img._spectrum)), + img); + } pos+=img._height; } } break; @@ -57995,11 +60168,17 @@ res.assign(dx,dy,dz,dc,(T)0); if (res) cimglist_for(*this,l) { const CImg& img = (*this)[l]; - if (img) res.draw_image((int)(align*(dx - img._width)), - (int)(align*(dy - img._height)), - pos, - (int)(align*(dc - img._spectrum)), - img); + if (img) { + if (img._width==1 && img._height==1 && img._spectrum==1 && + res._width==1 && res._height==1 && res._spectrum==1) + std::memcpy(&res[pos],img._data,sizeof(T)*img._depth); + else + res.draw_image((int)(align*(dx - img._width)), + (int)(align*(dy - img._height)), + pos, + (int)(align*(dc - img._spectrum)), + img); + } pos+=img._depth; } } break; @@ -58016,11 +60195,17 @@ res.assign(dx,dy,dz,dc,(T)0); if (res) cimglist_for(*this,l) { const CImg& img = (*this)[l]; - if (img) res.draw_image((int)(align*(dx - img._width)), - (int)(align*(dy - img._height)), - (int)(align*(dz - img._depth)), - pos, - img); + if (img) { + if (img._width==1 && img._height==1 && img._depth==1 && + res._width==1 && res._height==1 && res._depth==1) + std::memcpy(&res[pos],img._data,sizeof(T)*img._spectrum); + else + res.draw_image((int)(align*(dx - img._width)), + (int)(align*(dy - img._height)), + (int)(align*(dz - img._depth)), + pos, + img); + } pos+=img._spectrum; } } @@ -58031,7 +60216,7 @@ //! Return a list where each image has been split along the specified axis. /** \param axis Axis to split images along. - \param nb Number of spliting parts for each image. + \param nb Number of split parts for each image. **/ CImgList& split(const char axis, const int nb=-1) { return get_split(axis,nb).move_to(*this); @@ -58170,7 +60355,10 @@ if (axis=='x') disp.assign(cimg_fitscreen(sum_width,max_height,1),title?title:0,1); else disp.assign(cimg_fitscreen(max_width,sum_height,1),title?title:0,1); if (!title) disp.set_title("CImgList<%s> (%u)",pixel_type(),_width); - } else if (title) disp.set_title("%s",title); + } else { + if (title) disp.set_title("%s",title); + disp.move_inside_screen(); + } if (resize_disp) { if (axis=='x') disp.resize(cimg_fitscreen(sum_width,max_height,1),false); else disp.resize(cimg_fitscreen(max_width,sum_height,1),false); @@ -58179,16 +60367,16 @@ const unsigned int old_normalization = disp.normalization(); bool old_is_resized = disp.is_resized(); disp._normalization = 0; - disp.show().set_key(0); + disp.show().set_key(0).show_mouse(); static const unsigned char foreground_color[] = { 255,255,255 }, background_color[] = { 0,0,0 }; // Enter event loop. CImg visu0, visu; CImg indices; CImg positions(_width,4,1,1,-1); - int oindice0 = -1, oindice1 = -1, indice0 = -1, indice1 = -1; + int oindex0 = -1, oindex1 = -1, index0 = -1, index1 = -1; bool is_clicked = false, is_selected = false, text_down = false, update_display = true; - unsigned int key = 0; + unsigned int key = 0, font_size = 32; while (!is_selected && !disp.is_closed() && !key) { @@ -58196,7 +60384,7 @@ if (!visu0) { visu0.assign(disp._width,disp._height,1,3,0); visu.assign(); (indices0.get_resize(axis=='x'?visu0._width:visu0._height,1)).move_to(indices); - unsigned int ind = 0; + unsigned int _ind = 0; const CImg onexone(1,1,1,1,(T)0); if (axis=='x') cimg_pragma_openmp(parallel for cimg_openmp_if_size(_width,4)) @@ -58207,7 +60395,7 @@ while (x1 &src = _data[ind]?_data[ind]:onexone; CImg res; - src._get_select(disp,old_normalization,(src._width - 1)/2,(src._height - 1)/2,(src._depth - 1)/2). + src._get_select(disp,old_normalization,src._width/2,src._height/2,src._depth/2). move_to(res); const unsigned int h = CImgDisplay::_fitscreen(res._width,res._height,1,128,-85,true); res.resize(x1 - x0,std::max(32U,h*disp._height/max_height),1,res._spectrum==1?3:-100); @@ -58236,14 +60424,14 @@ positions(ind,3)+=res._height; visu0.draw_image(positions(ind,0),positions(ind,1),res); } - if (axis=='x') --positions(ind,2); else --positions(ind,3); + if (axis=='x') --positions(_ind,2); else --positions(_ind,3); update_display = true; } - if (!visu || oindice0!=indice0 || oindice1!=indice1) { - if (indice0>=0 && indice1>=0) { + if (!visu || oindex0!=index0 || oindex1!=index1) { + if (index0>=0 && index1>=0) { visu.assign(visu0,false); - const int indm = std::min(indice0,indice1), indM = std::max(indice0,indice1); + const int indm = std::min(index0,index1), indM = std::max(index0,index1); for (int ind = indm; ind<=indM; ++ind) if (positions(ind,0)>=0) { visu.draw_rectangle(positions(ind,0),positions(ind,1),positions(ind,2),positions(ind,3), background_color,0.2f); @@ -58252,14 +60440,14 @@ visu.draw_rectangle(positions(ind,0),positions(ind,1),positions(ind,2),positions(ind,3), foreground_color,0.9f,0xAAAAAAAA); } - if (is_clicked) visu.__draw_text(" Images #%u - #%u, Size = %u",text_down, + if (is_clicked) visu.__draw_text(" Images #%u - #%u, Size = %u ",font_size,(int)text_down, orig + indm,orig + indM,indM - indm + 1); - else visu.__draw_text(" Image #%u (%u,%u,%u,%u)",text_down, - orig + indice0, - _data[indice0]._width, - _data[indice0]._height, - _data[indice0]._depth, - _data[indice0]._spectrum); + else visu.__draw_text(" Image #%u (%u,%u,%u,%u) ",font_size,(int)text_down, + orig + index0, + _data[index0]._width, + _data[index0]._height, + _data[index0]._depth, + _data[index0]._spectrum); update_display = true; } else visu.assign(); } @@ -58269,27 +60457,27 @@ // Manage user events. const int xm = disp.mouse_x(), ym = disp.mouse_y(); - int indice = -1; + int index = -1; if (xm>=0) { - indice = (int)indices(axis=='x'?xm:ym); + index = (int)indices(axis=='x'?xm:ym); if (disp.button()&1) { - if (!is_clicked) { is_clicked = true; oindice0 = indice0; indice0 = indice; } - oindice1 = indice1; indice1 = indice; + if (!is_clicked) { is_clicked = true; oindex0 = index0; index0 = index; } + oindex1 = index1; index1 = index; if (!feature_type) is_selected = true; } else { - if (!is_clicked) { oindice0 = oindice1 = indice0; indice0 = indice1 = indice; } + if (!is_clicked) { oindex0 = oindex1 = index0; index0 = index1 = index; } else is_selected = true; } } else { if (is_clicked) { - if (!(disp.button()&1)) { is_clicked = is_selected = false; indice0 = indice1 = -1; } - else indice1 = -1; - } else indice0 = indice1 = -1; + if (!(disp.button()&1)) { is_clicked = is_selected = false; index0 = index1 = -1; } + else index1 = -1; + } else index0 = index1 = -1; } - if (disp.button()&4) { is_clicked = is_selected = false; indice0 = indice1 = -1; } - if (disp.button()&2 && exit_on_rightbutton) { is_selected = true; indice1 = indice0 = -1; } + if (disp.button()&4) { is_clicked = is_selected = false; index0 = index1 = -1; } + if (disp.button()&2 && exit_on_rightbutton) { is_selected = true; index1 = index0 = -1; } if (disp.wheel() && exit_on_wheel) is_selected = true; CImg filename(32); @@ -58328,9 +60516,9 @@ if ((file=cimg::std_fopen(filename,"r"))!=0) cimg::fclose(file); } while (file); if (visu0) { - (+visu0).__draw_text(" Saving snapshot... ",text_down).display(disp); + (+visu0).__draw_text(" Saving snapshot... ",font_size,(int)text_down).display(disp); visu0.save(filename); - (+visu0).__draw_text(" Snapshot '%s' saved. ",text_down,filename._data).display(disp); + (+visu0).__draw_text(" Snapshot '%s' saved. ",font_size,(int)text_down,filename._data).display(disp); } disp.set_key(key,false).wait(); key = 0; } break; @@ -58346,9 +60534,9 @@ #endif if ((file=cimg::std_fopen(filename,"r"))!=0) cimg::fclose(file); } while (file); - (+visu0).__draw_text(" Saving instance... ",text_down).display(disp); + (+visu0).__draw_text(" Saving instance... ",font_size,(int)text_down).display(disp); save(filename); - (+visu0).__draw_text(" Instance '%s' saved. ",text_down,filename._data).display(disp); + (+visu0).__draw_text(" Instance '%s' saved. ",font_size,(int)text_down,filename._data).display(disp); disp.set_key(key,false).wait(); key = 0; } break; } @@ -58362,8 +60550,8 @@ } CImg res(1,2,1,1,-1); if (is_selected) { - if (feature_type) res.fill(std::min(indice0,indice1),std::max(indice0,indice1)); - else res.fill(indice0); + if (feature_type) res.fill(std::min(index0,index1),std::max(index0,index1)); + else res.fill(index0); } if (!(disp.button()&2)) disp.set_button(); disp._normalization = old_normalization; @@ -59106,7 +61294,7 @@ /** \param filename Filename, as a C-string. \param first_frame Index of the first frame to read. - \param last_frame Index of the last frame to read. + \param last_frame Index of the last frame to read (can be higher than the actual number of frames, e.g. '~0U'). \param step_frame Step value for frame reading. \note If step_frame==0, the current video stream is forced to be released (without any frames read). **/ @@ -59122,7 +61310,7 @@ cimglist_instance,filename); return load_ffmpeg_external(filename); #else - static CvCapture *captures[32] = { 0 }; + static cv::VideoCapture *captures[32] = { 0 }; static CImgList filenames(32); static CImg positions(32,1,1,1,0); static int last_used_index = -1; @@ -59143,8 +61331,11 @@ if (!step_frame || (index>=0 && positions[index]>first_frame)) { if (index>=0) { cimg::mutex(9); - cvReleaseCapture(&captures[index]); - captures[index] = 0; filenames[index].assign(); positions[index] = 0; + captures[index]->release(); + delete captures[index]; + captures[index] = 0; + positions[index] = 0; + filenames[index].assign(); if (last_used_index==index) last_used_index = -1; index = -1; cimg::mutex(9,0); @@ -59174,69 +61365,56 @@ "You have to release some of your previously opened videos.", cimglist_instance,filename); cimg::mutex(9); - captures[index] = cvCaptureFromFile(filename); - CImg::string(filename).move_to(filenames[index]); + captures[index] = new cv::VideoCapture(filename); positions[index] = 0; - cimg::mutex(9,0); - if (!captures[index]) { - filenames[index].assign(); + if (!captures[index]->isOpened()) { + delete captures[index]; + captures[index] = 0; + cimg::mutex(9,0); cimg::fclose(cimg::fopen(filename,"rb")); // Check file availability throw CImgIOException(_cimglist_instance "load_video(): File '%s', unable to detect format of video file.", cimglist_instance,filename); } + CImg::string(filename).move_to(filenames[index]); + cimg::mutex(9,0); } cimg::mutex(9); - const unsigned int nb_frames = (unsigned int)std::max(0.,cvGetCaptureProperty(captures[index], - CV_CAP_PROP_FRAME_COUNT)); + const unsigned int nb_frames = (unsigned int)std::max(0.,captures[index]->get(_cimg_cap_prop_frame_count)); cimg::mutex(9,0); assign(); - // Skip frames if necessary. + // Skip frames if requested. bool go_on = true; unsigned int &pos = positions[index]; while (posgrab()) { cimg::mutex(9,0); go_on = false; break; } cimg::mutex(9,0); ++pos; } // Read and convert frames. - const IplImage *src = 0; - if (go_on) { - const unsigned int _last_frame = std::min(nb_frames?nb_frames - 1:~0U,last_frame); - while (pos<=_last_frame) { - cimg::mutex(9); - src = cvQueryFrame(captures[index]); - if (src) { - CImg frame(src->width,src->height,1,3); - const int step = (int)(src->widthStep - 3*src->width); - const unsigned char* ptrs = (unsigned char*)src->imageData; - T *ptr_r = frame.data(0,0,0,0), *ptr_g = frame.data(0,0,0,1), *ptr_b = frame.data(0,0,0,2); - if (step>0) cimg_forY(frame,y) { - cimg_forX(frame,x) { *(ptr_b++) = (T)*(ptrs++); *(ptr_g++) = (T)*(ptrs++); *(ptr_r++) = (T)*(ptrs++); } - ptrs+=step; - } else for (ulongT siz = (ulongT)src->width*src->height; siz; --siz) { - *(ptr_b++) = (T)*(ptrs++); *(ptr_g++) = (T)*(ptrs++); *(ptr_r++) = (T)*(ptrs++); - } - frame.move_to(*this); - ++pos; - - bool skip_failed = false; - for (unsigned int i = 1; iread(cvimg)) { CImg::_cvmat2cimg(cvimg).move_to(*this); ++pos; } + else go_on = false; + cimg::mutex(9,0); + if (go_on) + for (unsigned int i = 1; go_on && igrab()) go_on = false; + cimg::mutex(9,0); } - cimg::mutex(9,0); - if (!src) break; - } } - if (!src || (nb_frames && pos>=nb_frames)) { // Close video stream when necessary + if (!go_on || (nb_frames && pos>=nb_frames)) { // Close video stream when necessary cimg::mutex(9); - cvReleaseCapture(&captures[index]); + captures[index]->release(); + delete captures[index]; captures[index] = 0; filenames[index].assign(); positions[index] = 0; @@ -59346,7 +61524,7 @@ cimg::graphicsmagick_path(), CImg::string(filename)._system_strescape().data(), CImg::string(filename_tmp)._system_strescape().data()); - else cimg_snprintf(command,command._width,"%s \"%s\" \"%s.png\"", + else cimg_snprintf(command,command._width,"%s -coalesce \"%s\" \"%s.png\"", cimg::imagemagick_path(), CImg::string(filename)._system_strescape().data(), CImg::string(filename_tmp)._system_strescape().data()); @@ -59366,7 +61544,6 @@ for (bool stop_flag = false; !stop_flag; ++i) { if (use_graphicsmagick) cimg_snprintf(filename_tmp2,filename_tmp2._width,"%s.png.%u",filename_tmp._data,i); else cimg_snprintf(filename_tmp2,filename_tmp2._width,"%s-%u.png",filename_tmp._data,i); - CImg img; try { img.load_png(filename_tmp2); } catch (CImgException&) { stop_flag = true; } if (img) { img.move_to(*this); std::remove(filename_tmp2); } @@ -59433,26 +61610,6 @@ return CImgList().load_gzip_external(filename); } - //! Load a 3D object from a .OFF file. - /** - \param filename Filename to read data from. - \param[out] primitives At return, contains the list of 3D object primitives. - \param[out] colors At return, contains the list of 3D object colors. - \return List of 3D object vertices. - **/ - template - CImgList& load_off(const char *const filename, - CImgList& primitives, CImgList& colors) { - return get_load_off(filename,primitives,colors).move_to(*this); - } - - //! Load a 3D object from a .OFF file \newinstance. - template - static CImgList get_load_off(const char *const filename, - CImgList& primitives, CImgList& colors) { - return CImg().load_off(filename,primitives,colors)<'x'; - } - //! Load images from a TIFF file. /** \param filename Filename to read data from. @@ -59563,10 +61720,10 @@ /** \param disp Reference to an existing CImgDisplay instance, where the current image list will be displayed. \param axis Appending axis. Can be { 'x' | 'y' | 'z' | 'c' }. - \param align Appending alignmenet. + \param align Appending alignment. \note This function displays the list images of the current CImgList instance into an existing CImgDisplay window. - Images of the list are appended in a single temporarly image for visualization purposes. + Images of the list are appended in a single temporary image for visualization purposes. The function returns immediately. **/ const CImgList& display(CImgDisplay &disp, const char axis='x', const float align=0) const { @@ -59579,12 +61736,12 @@ \param disp Display window. \param display_info Tells if image information are displayed on the standard output. \param axis Alignment axis for images viewing. - \param align Apending alignment. + \param align Appending alignment. \param[in,out] XYZ Contains the XYZ coordinates at start / exit of the function. \param exit_on_anykey Exit function when any key is pressed. \note This function opens a new window with a specific title and displays the list images of the current CImgList instance into it. - Images of the list are appended in a single temporarly image for visualization purposes. + Images of the list are appended in a single temporary image for visualization purposes. The function returns when a key is pressed or the display window is closed by the user. **/ const CImgList& display(CImgDisplay &disp, const bool display_info, @@ -59701,7 +61858,7 @@ CImg __display() const { CImg res, str; cimglist_for(*this,l) { - CImg::string(_data[l]).move_to(str); + CImg::string((char*)_data[l]).move_to(str); if (l!=width() - 1) { str.resize(str._width + 1,1,1,1,0); str[str._width - 2] = ','; @@ -59854,19 +62011,19 @@ std::FILE *file = 0; #ifdef cimg_use_png -#define _cimg_save_gif_ext "png" +#define _cimg_save_gif_extension "png" #else -#define _cimg_save_gif_ext "ppm" +#define _cimg_save_gif_extension "ppm" #endif do { cimg_snprintf(filename_tmp,filename_tmp._width,"%s%c%s", cimg::temporary_path(),cimg_file_separator,cimg::filenamerand()); - cimg_snprintf(filename_tmp2,filename_tmp2._width,"%s_000001." _cimg_save_gif_ext,filename_tmp._data); + cimg_snprintf(filename_tmp2,filename_tmp2._width,"%s_000001." _cimg_save_gif_extension,filename_tmp._data); if ((file=cimg::std_fopen(filename_tmp2,"rb"))!=0) cimg::fclose(file); } while (file); cimglist_for(*this,l) { - cimg_snprintf(filename_tmp2,filename_tmp2._width,"%s_%.6u." _cimg_save_gif_ext,filename_tmp._data,l + 1); + cimg_snprintf(filename_tmp2,filename_tmp2._width,"%s_%.6u." _cimg_save_gif_extension,filename_tmp._data,l + 1); CImg::string(filename_tmp2).move_to(filenames); if (_data[l]._depth>1 || _data[l]._spectrum!=3) _data[l].get_resize(-100,-100,1,3).save(filename_tmp2); else _data[l].save(filename_tmp2); @@ -60340,7 +62497,7 @@ cimg::unused(codec,keep_open); return save_ffmpeg_external(filename,fps); #else - static CvVideoWriter *writers[32] = { 0 }; + static cv::VideoWriter *writers[32] = { 0 }; static CImgList filenames(32); static CImg sizes(32,2,1,1,0); static int last_used_index = -1; @@ -60379,32 +62536,32 @@ throw CImgInstanceException(_cimglist_instance "save_video(): Frame [0] is an empty image.", cimglist_instance); - -#define _cimg_docase(x) ((x)>='a'&&(x)<='z'?(x) + 'A' - 'a':(x)) - const char - *const _codec = codec && *codec?codec:cimg_OS==2?"mpeg":"mp4v", - codec0 = _cimg_docase(_codec[0]), - codec1 = _codec[0]?_cimg_docase(_codec[1]):0, - codec2 = _codec[1]?_cimg_docase(_codec[2]):0, - codec3 = _codec[2]?_cimg_docase(_codec[3]):0; + *const _codec = codec && *codec?codec:cimg_OS==2?"mpeg":"fmp4", + codec0 = cimg::uppercase(_codec[0]), + codec1 = _codec[0]?cimg::uppercase(_codec[1]):0, + codec2 = _codec[1]?cimg::uppercase(_codec[2]):0, + codec3 = _codec[2]?cimg::uppercase(_codec[3]):0; cimg::mutex(9); - writers[index] = cvCreateVideoWriter(filename,CV_FOURCC(codec0,codec1,codec2,codec3), - fps,cvSize(W,H)); - CImg::string(filename).move_to(filenames[index]); - sizes(index,0) = W; sizes(index,1) = H; - cimg::mutex(9,0); - if (!writers[index]) + writers[index] = new cv::VideoWriter(filename,_cimg_fourcc(codec0,codec1,codec2,codec3),fps,cv::Size(W,H)); + if (!writers[index]->isOpened()) { + delete writers[index]; + writers[index] = 0; + cimg::mutex(9,0); throw CImgIOException(_cimglist_instance "save_video(): File '%s', unable to initialize video writer with codec '%c%c%c%c'.", cimglist_instance,filename, codec0,codec1,codec2,codec3); + } + CImg::string(filename).move_to(filenames[index]); + sizes(index,0) = W; + sizes(index,1) = H; + cimg::mutex(9,0); } if (!is_empty()) { const unsigned int W = sizes(index,0), H = sizes(index,1); cimg::mutex(9); - IplImage *ipl = cvCreateImage(cvSize(W,H),8,3); cimglist_for(*this,l) { CImg &src = _data[l]; if (src.is_empty()) @@ -60416,31 +62573,21 @@ "save_video(): Frame %u has incompatible dimension (%u,%u,%u,%u). " "Some image data may be ignored when writing frame into video file '%s'.", cimglist_instance,l,src._width,src._height,src._depth,src._spectrum,filename); - if (src._width==W && src._height==H && src._spectrum==3) { - const T *ptr_r = src.data(0,0,0,0), *ptr_g = src.data(0,0,0,1), *ptr_b = src.data(0,0,0,2); - char *ptrd = ipl->imageData; - cimg_forXY(src,x,y) { - *(ptrd++) = (char)*(ptr_b++); *(ptrd++) = (char)*(ptr_g++); *(ptrd++) = (char)*(ptr_r++); - } - } else { - CImg _src(src,false); + if (src._width==W && src._height==H && src._spectrum==3) + writers[index]->write(CImg(src)._cimg2cvmat()); + else { + CImg _src(src,false); _src.channels(0,std::min(_src._spectrum - 1,2U)).resize(W,H); _src.resize(W,H,1,3,_src._spectrum==1); - const unsigned char *ptr_r = _src.data(0,0,0,0), *ptr_g = _src.data(0,0,0,1), *ptr_b = _src.data(0,0,0,2); - char *ptrd = ipl->imageData; - cimg_forXY(_src,x,y) { - *(ptrd++) = (char)*(ptr_b++); *(ptrd++) = (char)*(ptr_g++); *(ptrd++) = (char)*(ptr_r++); - } + writers[index]->write(_src._cimg2cvmat()); } - cvWriteFrame(writers[index],ipl); } - cvReleaseImage(&ipl); cimg::mutex(9,0); } cimg::mutex(9); if (!keep_open) { - cvReleaseVideoWriter(&writers[index]); + delete writers[index]; writers[index] = 0; filenames[index].assign(); sizes(index,0) = sizes(index,1) = 0; @@ -60575,7 +62722,7 @@ Bytef *cbuf = 0; \ if (sizeof(t)!=1 || cimg::type::string()==cimg::type::string()) { \ cbuf = new Bytef[csiz]; Bytef *_cbuf = cbuf; \ - for (ulongT i = 0; i raw; \ CImg &img = res._data[l]; \ if (err==5) _cimgz_unserialize_case(Tss) \ - else if (sizeof(Tss)==sizeof(t) && cimg::type::is_float()==cimg::type::is_float()) { \ - raw.assign((Tss*)stream,W,H,D,C,true); \ - stream+=raw.size(); \ - } else { \ + else { \ raw.assign(W,H,D,C); \ CImg _raw((unsigned char*)raw._data,W*sizeof(Tss),H,D,C,true); \ - cimg_for(_raw,p,unsigned char) *p = (unsigned char)*(stream++); \ + if (sizeof(t)==1) { std::memcpy(_raw,stream,_raw.size()); stream+=_raw.size(); } \ + else cimg_for(_raw,p,unsigned char) *p = (unsigned char)*(stream++); \ } \ if (endian!=cimg::endianness()) cimg::invert_endianness(raw._data,raw.size()); \ raw.move_to(img); \ @@ -60763,7 +62908,7 @@ } if (ind==~0U) { // No empty slots nor existing font in cache fonts->assign(); - std::memmove(fonts,fonts + 1,15*sizeof(CImgList)); + std::memmove((void*)fonts,(void*)(fonts + 1),15*sizeof(CImgList)); std::memmove(is_variable_widths,is_variable_widths + 1,15*sizeof(bool)); std::memset((void*)(fonts + (ind=15)),0,sizeof(CImgList)); // Free a slot in cache for new font } @@ -60787,12 +62932,12 @@ cimg_forXY(letter,x,y) if (letter(x,y)) { if (xxmax) xmax = x; } if (xmin<=xmax) letter.crop(xmin,0,xmax,letter._height - 1); } - font[' '].resize(font['f']._width,-100,-100,-100,0); - if (' ' + 256::FFT(_data[0],_data[1],axis,invert); return *this; } @@ -60822,7 +62966,7 @@ return CImgList(*this,false).FFT(axis,invert); } - //! Compute a n-d Fast Fourier Transform. + //! Compute n-D Fast Fourier Transform. /** \param invert Tells if the direct (\c false) or inverse transform (\c true) is computed. **/ @@ -60838,7 +62982,7 @@ return *this; } - //! Compute a n-d Fast Fourier Transform \newinstance. + //! Compute n-D Fast Fourier Transform \newinstance. CImgList get_FFT(const bool invert=false) const { return CImgList(*this,false).FFT(invert); } @@ -60866,1252 +63010,1295 @@ } //@} - }; // struct CImgList { ... - - /* - #--------------------------------------------- - # - # Completion of previously declared functions - # - #---------------------------------------------- - */ + }; // struct CImgList { ... -namespace cimg { + // Completion of previously declared functions + //-------------------------------------------- + namespace cimg { - // Functions to return standard streams 'stdin', 'stdout' and 'stderr'. - // (throw a CImgIOException when macro 'cimg_use_r' is defined). - inline FILE* _stdin(const bool throw_exception) { + // Functions to return standard streams 'stdin', 'stdout' and 'stderr'. + // (throw a CImgIOException when macro 'cimg_use_r' is defined). + inline FILE* _stdin(const bool throw_exception) { #ifndef cimg_use_r - cimg::unused(throw_exception); - return stdin; + cimg::unused(throw_exception); + return stdin; #else - if (throw_exception) { - cimg::exception_mode(0); - throw CImgIOException("cimg::stdin(): Reference to 'stdin' stream not allowed in R mode " - "('cimg_use_r' is defined)."); - } - return 0; + if (throw_exception) { + cimg::exception_mode(0); + throw CImgIOException("cimg::stdin(): Reference to 'stdin' stream not allowed in R mode " + "('cimg_use_r' is defined)."); + } + return 0; #endif - } + } - inline FILE* _stdout(const bool throw_exception) { + inline FILE* _stdout(const bool throw_exception) { #ifndef cimg_use_r - cimg::unused(throw_exception); - return stdout; + cimg::unused(throw_exception); + return stdout; #else - if (throw_exception) { - cimg::exception_mode(0); - throw CImgIOException("cimg::stdout(): Reference to 'stdout' stream not allowed in R mode " - "('cimg_use_r' is defined)."); - } - return 0; + if (throw_exception) { + cimg::exception_mode(0); + throw CImgIOException("cimg::stdout(): Reference to 'stdout' stream not allowed in R mode " + "('cimg_use_r' is defined)."); + } + return 0; #endif - } + } - inline FILE* _stderr(const bool throw_exception) { + inline FILE* _stderr(const bool throw_exception) { #ifndef cimg_use_r - cimg::unused(throw_exception); - return stderr; + cimg::unused(throw_exception); + return stderr; #else - if (throw_exception) { - cimg::exception_mode(0); - throw CImgIOException("cimg::stderr(): Reference to 'stderr' stream not allowed in R mode " - "('cimg_use_r' is defined)."); + if (throw_exception) { + cimg::exception_mode(0); + throw CImgIOException("cimg::stderr(): Reference to 'stderr' stream not allowed in R mode " + "('cimg_use_r' is defined)."); + } + return 0; +#endif } - return 0; + + // Open a file (similar to std:: fopen(), but with wide character support on Windows). + inline std::FILE *std_fopen(const char *const path, const char *const mode) { + std::FILE *const res = std::fopen(path,mode); + if (res) return res; +#if cimg_OS==2 + // Try alternative method, with wide-character string. + int err = MultiByteToWideChar(CP_UTF8,0,path,-1,0,0); + if (err) { + CImg wpath(err); + err = MultiByteToWideChar(CP_UTF8,0,path,-1,wpath,err); + if (err) { // Convert 'mode' to a wide-character string + err = MultiByteToWideChar(CP_UTF8,0,mode,-1,0,0); + if (err) { + CImg wmode(err); + if (MultiByteToWideChar(CP_UTF8,0,mode,-1,wmode,err)) + return _wfopen(wpath,wmode); + } + } + } #endif - } + return 0; + } - // Open a file (similar to std:: fopen(), but with wide character support on Windows). - inline std::FILE *std_fopen(const char *const path, const char *const mode) { - std::FILE *const res = std::fopen(path,mode); - if (res) return res; + //! Get the file or directory attributes with support for UTF-8 paths (Windows only). #if cimg_OS==2 - // Try alternative method, with wide-character string. - int err = MultiByteToWideChar(CP_UTF8,0,path,-1,0,0); - if (err) { - CImg wpath(err); - err = MultiByteToWideChar(CP_UTF8,0,path,-1,wpath,err); - if (err) { // Convert 'mode' to a wide-character string - err = MultiByteToWideChar(CP_UTF8,0,mode,-1,0,0); + inline DWORD win_getfileattributes(const char *const path) { + DWORD res = GetFileAttributesA(path); + if (res==INVALID_FILE_ATTRIBUTES) { + // Try alternative method, with wide-character string. + int err = MultiByteToWideChar(CP_UTF8,0,path,-1,0,0); if (err) { - CImg wmode(err); - if (MultiByteToWideChar(CP_UTF8,0,mode,-1,wmode,err)) - return _wfopen(wpath,wmode); + CImg wpath(err); + if (MultiByteToWideChar(CP_UTF8,0,path,-1,wpath,err)) res = GetFileAttributesW(wpath); } } + return res; } #endif - return 0; - } - //! Get/set path to store temporary files. - /** - \param user_path Specified path, or \c 0 to get the path currently used. - \param reinit_path Force path to be recalculated (may take some time). - \return Path where temporary files can be saved. - **/ - inline const char* temporary_path(const char *const user_path, const bool reinit_path) { -#define _cimg_test_temporary_path(p) \ - if (!path_found) { \ - cimg_snprintf(s_path,s_path.width(),"%s",p); \ - cimg_snprintf(tmp,tmp._width,"%s%c%s",s_path.data(),cimg_file_separator,filename_tmp._data); \ - if ((file=cimg::std_fopen(tmp,"wb"))!=0) { cimg::fclose(file); std::remove(tmp); path_found = true; } \ - } - static CImg s_path; - cimg::mutex(7); - if (reinit_path) s_path.assign(); - if (user_path) { - if (!s_path) s_path.assign(1024); - std::strncpy(s_path,user_path,1023); - } else if (!s_path) { - s_path.assign(1024); - bool path_found = false; - CImg tmp(1024), filename_tmp(256); - std::FILE *file = 0; - cimg_snprintf(filename_tmp,filename_tmp._width,"%s.tmp",cimg::filenamerand()); - char *tmpPath = std::getenv("TMP"); - if (!tmpPath) { tmpPath = std::getenv("TEMP"); winformat_string(tmpPath); } - if (tmpPath) _cimg_test_temporary_path(tmpPath); + //! Get/set path to store temporary files. + /** + \param user_path Specified path, or \c 0 to get the path currently used. + \param reinit_path Force path to be recalculated (may take some time). + \return Path where temporary files can be saved. + **/ + inline const char* temporary_path(const char *const user_path, const bool reinit_path) { +#define _cimg_test_temporary_path(p) \ + if (!path_found) { \ + cimg_snprintf(s_path,s_path.width(),"%s",p); \ + cimg_snprintf(tmp,tmp._width,"%s%c%s",s_path.data(),cimg_file_separator,filename_tmp._data); \ + if ((file=cimg::std_fopen(tmp,"wb"))!=0) { cimg::fclose(file); std::remove(tmp); path_found = true; } \ + } + static CImg s_path; + cimg::mutex(7); + if (reinit_path) s_path.assign(); + if (user_path) { + if (!s_path) s_path.assign(1024); + std::strncpy(s_path,user_path,1023); + } else if (!s_path) { + s_path.assign(1024); + bool path_found = false; + CImg tmp(1024), filename_tmp(256); + std::FILE *file = 0; + cimg_snprintf(filename_tmp,filename_tmp._width,"%s.tmp",cimg::filenamerand()); + char *tmpPath = std::getenv("TMP"); + if (!tmpPath) { tmpPath = std::getenv("TEMP"); winformat_string(tmpPath); } + if (tmpPath) _cimg_test_temporary_path(tmpPath); #if cimg_OS==2 - _cimg_test_temporary_path("C:\\WINNT\\Temp"); - _cimg_test_temporary_path("C:\\WINDOWS\\Temp"); - _cimg_test_temporary_path("C:\\Temp"); - _cimg_test_temporary_path("C:"); - _cimg_test_temporary_path("D:\\WINNT\\Temp"); - _cimg_test_temporary_path("D:\\WINDOWS\\Temp"); - _cimg_test_temporary_path("D:\\Temp"); - _cimg_test_temporary_path("D:"); + _cimg_test_temporary_path("C:\\WINNT\\Temp"); + _cimg_test_temporary_path("C:\\WINDOWS\\Temp"); + _cimg_test_temporary_path("C:\\Temp"); + _cimg_test_temporary_path("C:"); + _cimg_test_temporary_path("D:\\WINNT\\Temp"); + _cimg_test_temporary_path("D:\\WINDOWS\\Temp"); + _cimg_test_temporary_path("D:\\Temp"); + _cimg_test_temporary_path("D:"); #else - _cimg_test_temporary_path("/tmp"); - _cimg_test_temporary_path("/var/tmp"); + _cimg_test_temporary_path("/tmp"); + _cimg_test_temporary_path("/var/tmp"); #endif - if (!path_found) { - *s_path = 0; - std::strncpy(tmp,filename_tmp,tmp._width - 1); - if ((file=cimg::std_fopen(tmp,"wb"))!=0) { cimg::fclose(file); std::remove(tmp); path_found = true; } - } - if (!path_found) { - cimg::mutex(7,0); - throw CImgIOException("cimg::temporary_path(): Failed to locate path for writing temporary files.\n"); + if (!path_found) { + *s_path = 0; + std::strncpy(tmp,filename_tmp,tmp._width - 1); + if ((file=cimg::std_fopen(tmp,"wb"))!=0) { cimg::fclose(file); std::remove(tmp); path_found = true; } + } + if (!path_found) { + cimg::mutex(7,0); + throw CImgIOException("cimg::temporary_path(): Failed to locate path for writing temporary files.\n"); + } } + cimg::mutex(7,0); + return s_path; } - cimg::mutex(7,0); - return s_path; - } - //! Get/set path to the Program Files/ directory (Windows only). - /** - \param user_path Specified path, or \c 0 to get the path currently used. - \param reinit_path Force path to be recalculated (may take some time). - \return Path containing the program files. - **/ + //! Get/set path to the Program Files/ directory (Windows only). + /** + \param user_path Specified path, or \c 0 to get the path currently used. + \param reinit_path Force path to be recalculated (may take some time). + \return Path containing the program files. + **/ #if cimg_OS==2 - inline const char* programfiles_path(const char *const user_path, const bool reinit_path) { - static CImg s_path; - cimg::mutex(7); - if (reinit_path) s_path.assign(); - if (user_path) { - if (!s_path) s_path.assign(1024); - std::strncpy(s_path,user_path,1023); - } else if (!s_path) { - s_path.assign(MAX_PATH); - *s_path = 0; - // Note: in the following line, 0x26 = CSIDL_PROGRAM_FILES (not defined on every compiler). + inline const char* programfiles_path(const char *const user_path, const bool reinit_path) { + static CImg s_path; + cimg::mutex(7); + if (reinit_path) s_path.assign(); + if (user_path) { + if (!s_path) s_path.assign(1024); + std::strncpy(s_path,user_path,1023); + } else if (!s_path) { + s_path.assign(MAX_PATH); + *s_path = 0; + // Note: in the following line, 0x26 = CSIDL_PROGRAM_FILES (not defined on every compiler). #if !defined(__INTEL_COMPILER) - if (!SHGetSpecialFolderPathA(0,s_path,0x0026,false)) { - const char *const pfPath = std::getenv("PROGRAMFILES"); - if (pfPath) std::strncpy(s_path,pfPath,MAX_PATH - 1); - else std::strcpy(s_path,"C:\\PROGRA~1"); - } + if (!SHGetSpecialFolderPathA(0,s_path,0x0026,false)) { + const char *const pfPath = std::getenv("PROGRAMFILES"); + if (pfPath) std::strncpy(s_path,pfPath,MAX_PATH - 1); + else std::strcpy(s_path,"C:\\PROGRA~1"); + } #else - std::strcpy(s_path,"C:\\PROGRA~1"); + std::strcpy(s_path,"C:\\PROGRA~1"); #endif + } + cimg::mutex(7,0); + return s_path; } - cimg::mutex(7,0); - return s_path; - } #endif - //! Get/set path to the ImageMagick's \c convert binary. - /** - \param user_path Specified path, or \c 0 to get the path currently used. - \param reinit_path Force path to be recalculated (may take some time). - \return Path containing the \c convert binary. - **/ - inline const char* imagemagick_path(const char *const user_path, const bool reinit_path) { - static CImg s_path; - cimg::mutex(7); - if (reinit_path) s_path.assign(); - if (user_path) { - if (!s_path) s_path.assign(1024); - std::strncpy(s_path,user_path,1023); - } else if (!s_path) { - s_path.assign(1024); - bool path_found = false; - std::FILE *file = 0; + //! Get/set path to the ImageMagick's \c convert binary. + /** + \param user_path Specified path, or \c 0 to get the path currently used. + \param reinit_path Force path to be recalculated (may take some time). + \return Path containing the \c convert binary. + **/ + inline const char* imagemagick_path(const char *const user_path, const bool reinit_path) { + static CImg s_path; + cimg::mutex(7); + if (reinit_path) s_path.assign(); + if (user_path) { + if (!s_path) s_path.assign(1024); + std::strncpy(s_path,user_path,1023); + } else if (!s_path) { + s_path.assign(1024); + bool path_found = false; + std::FILE *file = 0; #if cimg_OS==2 - const char *const pf_path = programfiles_path(); - for (int l = 0; l<2 && !path_found; ++l) { - const char *const s_exe = l?"convert":"magick"; - cimg_snprintf(s_path,s_path._width,".\\%s.exe",s_exe); + const char *const pf_path = programfiles_path(); + for (int l = 0; l<2 && !path_found; ++l) { + const char *const s_exe = l?"convert":"magick"; + cimg_snprintf(s_path,s_path._width,".\\%s.exe",s_exe); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + for (int k = 32; k>=10 && !path_found; --k) { + cimg_snprintf(s_path,s_path._width,"%s\\IMAGEM~1.%.2d-\\%s.exe",pf_path,k,s_exe); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + for (int k = 9; k>=0 && !path_found; --k) { + cimg_snprintf(s_path,s_path._width,"%s\\IMAGEM~1.%d-Q\\%s.exe",pf_path,k,s_exe); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + for (int k = 32; k>=0 && !path_found; --k) { + cimg_snprintf(s_path,s_path._width,"%s\\IMAGEM~1.%d\\%s.exe",pf_path,k,s_exe); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + for (int k = 32; k>=10 && !path_found; --k) { + cimg_snprintf(s_path,s_path._width,"%s\\IMAGEM~1.%.2d-\\VISUA~1\\BIN\\%s.exe",pf_path,k,s_exe); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + for (int k = 9; k>=0 && !path_found; --k) { + cimg_snprintf(s_path,s_path._width,"%s\\IMAGEM~1.%d-Q\\VISUA~1\\BIN\\%s.exe",pf_path,k,s_exe); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + for (int k = 32; k>=0 && !path_found; --k) { + cimg_snprintf(s_path,s_path._width,"%s\\IMAGEM~1.%d\\VISUA~1\\BIN\\%s.exe",pf_path,k,s_exe); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + for (int k = 32; k>=10 && !path_found; --k) { + cimg_snprintf(s_path,s_path._width,"C:\\IMAGEM~1.%.2d-\\%s.exe",k,s_exe); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + for (int k = 9; k>=0 && !path_found; --k) { + cimg_snprintf(s_path,s_path._width,"C:\\IMAGEM~1.%d-Q\\%s.exe",k,s_exe); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + for (int k = 32; k>=0 && !path_found; --k) { + cimg_snprintf(s_path,s_path._width,"C:\\IMAGEM~1.%d\\%s.exe",k,s_exe); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + for (int k = 32; k>=10 && !path_found; --k) { + cimg_snprintf(s_path,s_path._width,"C:\\IMAGEM~1.%.2d-\\VISUA~1\\BIN\\%s.exe",k,s_exe); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + for (int k = 9; k>=0 && !path_found; --k) { + cimg_snprintf(s_path,s_path._width,"C:\\IMAGEM~1.%d-Q\\VISUA~1\\BIN\\%s.exe",k,s_exe); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + for (int k = 32; k>=0 && !path_found; --k) { + cimg_snprintf(s_path,s_path._width,"C:\\IMAGEM~1.%d\\VISUA~1\\BIN\\%s.exe",k,s_exe); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + for (int k = 32; k>=10 && !path_found; --k) { + cimg_snprintf(s_path,s_path._width,"D:\\IMAGEM~1.%.2d-\\%s.exe",k,s_exe); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + for (int k = 9; k>=0 && !path_found; --k) { + cimg_snprintf(s_path,s_path._width,"D:\\IMAGEM~1.%d-Q\\%s.exe",k,s_exe); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + for (int k = 32; k>=0 && !path_found; --k) { + cimg_snprintf(s_path,s_path._width,"D:\\IMAGEM~1.%d\\%s.exe",k,s_exe); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + for (int k = 32; k>=10 && !path_found; --k) { + cimg_snprintf(s_path,s_path._width,"D:\\IMAGEM~1.%.2d-\\VISUA~1\\BIN\\%s.exe",k,s_exe); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + for (int k = 9; k>=0 && !path_found; --k) { + cimg_snprintf(s_path,s_path._width,"D:\\IMAGEM~1.%d-Q\\VISUA~1\\BIN\\%s.exe",k,s_exe); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + for (int k = 32; k>=0 && !path_found; --k) { + cimg_snprintf(s_path,s_path._width,"D:\\IMAGEM~1.%d\\VISUA~1\\BIN\\%s.exe",k,s_exe); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + if (!path_found) cimg_snprintf(s_path,s_path._width,"%s.exe",s_exe); + } +#else + std::strcpy(s_path,"./magick"); if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + if (!path_found) { + std::strcpy(s_path,"./convert"); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + if (!path_found) std::strcpy(s_path,"convert"); +#endif + winformat_string(s_path); + } + cimg::mutex(7,0); + return s_path; + } + + //! Get/set path to the GraphicsMagick's \c gm binary. + /** + \param user_path Specified path, or \c 0 to get the path currently used. + \param reinit_path Force path to be recalculated (may take some time). + \return Path containing the \c gm binary. + **/ + inline const char* graphicsmagick_path(const char *const user_path, const bool reinit_path) { + static CImg s_path; + cimg::mutex(7); + if (reinit_path) s_path.assign(); + if (user_path) { + if (!s_path) s_path.assign(1024); + std::strncpy(s_path,user_path,1023); + } else if (!s_path) { + s_path.assign(1024); + bool path_found = false; + std::FILE *file = 0; +#if cimg_OS==2 + const char *const pf_path = programfiles_path(); + if (!path_found) { + std::strcpy(s_path,".\\gm.exe"); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } for (int k = 32; k>=10 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"%s\\IMAGEM~1.%.2d-\\%s.exe",pf_path,k,s_exe); + cimg_snprintf(s_path,s_path._width,"%s\\GRAPHI~1.%.2d-\\gm.exe",pf_path,k); if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } } for (int k = 9; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"%s\\IMAGEM~1.%d-Q\\%s.exe",pf_path,k,s_exe); + cimg_snprintf(s_path,s_path._width,"%s\\GRAPHI~1.%d-Q\\gm.exe",pf_path,k); if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } } for (int k = 32; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"%s\\IMAGEM~1.%d\\%s.exe",pf_path,k,s_exe); + cimg_snprintf(s_path,s_path._width,"%s\\GRAPHI~1.%d\\gm.exe",pf_path,k); if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } } for (int k = 32; k>=10 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"%s\\IMAGEM~1.%.2d-\\VISUA~1\\BIN\\%s.exe",pf_path,k,s_exe); + cimg_snprintf(s_path,s_path._width,"%s\\GRAPHI~1.%.2d-\\VISUA~1\\BIN\\gm.exe",pf_path,k); if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } } for (int k = 9; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"%s\\IMAGEM~1.%d-Q\\VISUA~1\\BIN\\%s.exe",pf_path,k,s_exe); + cimg_snprintf(s_path,s_path._width,"%s\\GRAPHI~1.%d-Q\\VISUA~1\\BIN\\gm.exe",pf_path,k); if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } } for (int k = 32; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"%s\\IMAGEM~1.%d\\VISUA~1\\BIN\\%s.exe",pf_path,k,s_exe); + cimg_snprintf(s_path,s_path._width,"%s\\GRAPHI~1.%d\\VISUA~1\\BIN\\gm.exe",pf_path,k); if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } } for (int k = 32; k>=10 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"C:\\IMAGEM~1.%.2d-\\%s.exe",k,s_exe); + cimg_snprintf(s_path,s_path._width,"C:\\GRAPHI~1.%.2d-\\gm.exe",k); if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } } for (int k = 9; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"C:\\IMAGEM~1.%d-Q\\%s.exe",k,s_exe); + cimg_snprintf(s_path,s_path._width,"C:\\GRAPHI~1.%d-Q\\gm.exe",k); if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } } for (int k = 32; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"C:\\IMAGEM~1.%d\\%s.exe",k,s_exe); + cimg_snprintf(s_path,s_path._width,"C:\\GRAPHI~1.%d\\gm.exe",k); if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } } for (int k = 32; k>=10 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"C:\\IMAGEM~1.%.2d-\\VISUA~1\\BIN\\%s.exe",k,s_exe); + cimg_snprintf(s_path,s_path._width,"C:\\GRAPHI~1.%.2d-\\VISUA~1\\BIN\\gm.exe",k); if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } } for (int k = 9; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"C:\\IMAGEM~1.%d-Q\\VISUA~1\\BIN\\%s.exe",k,s_exe); + cimg_snprintf(s_path,s_path._width,"C:\\GRAPHI~1.%d-Q\\VISUA~1\\BIN\\gm.exe",k); if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } } for (int k = 32; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"C:\\IMAGEM~1.%d\\VISUA~1\\BIN\\%s.exe",k,s_exe); + cimg_snprintf(s_path,s_path._width,"C:\\GRAPHI~1.%d\\VISUA~1\\BIN\\gm.exe",k); if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } } for (int k = 32; k>=10 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"D:\\IMAGEM~1.%.2d-\\%s.exe",k,s_exe); + cimg_snprintf(s_path,s_path._width,"D:\\GRAPHI~1.%.2d-\\gm.exe",k); if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } } for (int k = 9; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"D:\\IMAGEM~1.%d-Q\\%s.exe",k,s_exe); + cimg_snprintf(s_path,s_path._width,"D:\\GRAPHI~1.%d-Q\\gm.exe",k); if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } } for (int k = 32; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"D:\\IMAGEM~1.%d\\%s.exe",k,s_exe); + cimg_snprintf(s_path,s_path._width,"D:\\GRAPHI~1.%d\\gm.exe",k); if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } } for (int k = 32; k>=10 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"D:\\IMAGEM~1.%.2d-\\VISUA~1\\BIN\\%s.exe",k,s_exe); + cimg_snprintf(s_path,s_path._width,"D:\\GRAPHI~1.%.2d-\\VISUA~1\\BIN\\gm.exe",k); if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } } for (int k = 9; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"D:\\IMAGEM~1.%d-Q\\VISUA~1\\BIN\\%s.exe",k,s_exe); + cimg_snprintf(s_path,s_path._width,"D:\\GRAPHI~1.%d-Q\\VISUA~1\\BIN\\gm.exe",k); if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } } for (int k = 32; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"D:\\IMAGEM~1.%d\\VISUA~1\\BIN\\%s.exe",k,s_exe); + cimg_snprintf(s_path,s_path._width,"D:\\GRAPHI~1.%d\\VISUA~1\\BIN\\gm.exe",k); if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } } - if (!path_found) cimg_snprintf(s_path,s_path._width,"%s.exe",s_exe); - } + if (!path_found) std::strcpy(s_path,"gm.exe"); #else - std::strcpy(s_path,"./magick"); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - if (!path_found) { - std::strcpy(s_path,"./convert"); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - if (!path_found) std::strcpy(s_path,"convert"); + if (!path_found) { + std::strcpy(s_path,"./gm"); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + if (!path_found) std::strcpy(s_path,"gm"); #endif - winformat_string(s_path); + winformat_string(s_path); + } + cimg::mutex(7,0); + return s_path; } - cimg::mutex(7,0); - return s_path; - } - //! Get/set path to the GraphicsMagick's \c gm binary. - /** - \param user_path Specified path, or \c 0 to get the path currently used. - \param reinit_path Force path to be recalculated (may take some time). - \return Path containing the \c gm binary. - **/ - inline const char* graphicsmagick_path(const char *const user_path, const bool reinit_path) { - static CImg s_path; - cimg::mutex(7); - if (reinit_path) s_path.assign(); - if (user_path) { - if (!s_path) s_path.assign(1024); - std::strncpy(s_path,user_path,1023); - } else if (!s_path) { - s_path.assign(1024); - bool path_found = false; - std::FILE *file = 0; + //! Get/set path to the XMedcon's \c medcon binary. + /** + \param user_path Specified path, or \c 0 to get the path currently used. + \param reinit_path Force path to be recalculated (may take some time). + \return Path containing the \c medcon binary. + **/ + inline const char* medcon_path(const char *const user_path, const bool reinit_path) { + static CImg s_path; + cimg::mutex(7); + if (reinit_path) s_path.assign(); + if (user_path) { + if (!s_path) s_path.assign(1024); + std::strncpy(s_path,user_path,1023); + } else if (!s_path) { + s_path.assign(1024); + bool path_found = false; + std::FILE *file = 0; #if cimg_OS==2 - const char *const pf_path = programfiles_path(); - if (!path_found) { - std::strcpy(s_path,".\\gm.exe"); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - for (int k = 32; k>=10 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"%s\\GRAPHI~1.%.2d-\\gm.exe",pf_path,k); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - for (int k = 9; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"%s\\GRAPHI~1.%d-Q\\gm.exe",pf_path,k); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - for (int k = 32; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"%s\\GRAPHI~1.%d\\gm.exe",pf_path,k); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - for (int k = 32; k>=10 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"%s\\GRAPHI~1.%.2d-\\VISUA~1\\BIN\\gm.exe",pf_path,k); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - for (int k = 9; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"%s\\GRAPHI~1.%d-Q\\VISUA~1\\BIN\\gm.exe",pf_path,k); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - for (int k = 32; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"%s\\GRAPHI~1.%d\\VISUA~1\\BIN\\gm.exe",pf_path,k); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - for (int k = 32; k>=10 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"C:\\GRAPHI~1.%.2d-\\gm.exe",k); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - for (int k = 9; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"C:\\GRAPHI~1.%d-Q\\gm.exe",k); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - for (int k = 32; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"C:\\GRAPHI~1.%d\\gm.exe",k); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - for (int k = 32; k>=10 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"C:\\GRAPHI~1.%.2d-\\VISUA~1\\BIN\\gm.exe",k); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - for (int k = 9; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"C:\\GRAPHI~1.%d-Q\\VISUA~1\\BIN\\gm.exe",k); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - for (int k = 32; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"C:\\GRAPHI~1.%d\\VISUA~1\\BIN\\gm.exe",k); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - for (int k = 32; k>=10 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"D:\\GRAPHI~1.%.2d-\\gm.exe",k); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - for (int k = 9; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"D:\\GRAPHI~1.%d-Q\\gm.exe",k); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - for (int k = 32; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"D:\\GRAPHI~1.%d\\gm.exe",k); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - for (int k = 32; k>=10 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"D:\\GRAPHI~1.%.2d-\\VISUA~1\\BIN\\gm.exe",k); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - for (int k = 9; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"D:\\GRAPHI~1.%d-Q\\VISUA~1\\BIN\\gm.exe",k); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - for (int k = 32; k>=0 && !path_found; --k) { - cimg_snprintf(s_path,s_path._width,"D:\\GRAPHI~1.%d\\VISUA~1\\BIN\\gm.exe",k); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - if (!path_found) std::strcpy(s_path,"gm.exe"); + const char *const pf_path = programfiles_path(); + if (!path_found) { + std::strcpy(s_path,".\\medcon.exe"); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + if (!path_found) { + cimg_snprintf(s_path,s_path._width,"%s\\XMedCon\\bin\\medcon.bat",pf_path); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + if (!path_found) { + cimg_snprintf(s_path,s_path._width,"%s\\XMedCon\\bin\\medcon.exe",pf_path); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + if (!path_found) { + std::strcpy(s_path,"C:\\XMedCon\\bin\\medcon.exe"); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + if (!path_found) std::strcpy(s_path,"medcon.exe"); #else - if (!path_found) { - std::strcpy(s_path,"./gm"); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - if (!path_found) std::strcpy(s_path,"gm"); + if (!path_found) { + std::strcpy(s_path,"./medcon"); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + if (!path_found) std::strcpy(s_path,"medcon"); #endif - winformat_string(s_path); + winformat_string(s_path); + } + cimg::mutex(7,0); + return s_path; } - cimg::mutex(7,0); - return s_path; - } - //! Get/set path to the XMedcon's \c medcon binary. - /** - \param user_path Specified path, or \c 0 to get the path currently used. - \param reinit_path Force path to be recalculated (may take some time). - \return Path containing the \c medcon binary. - **/ - inline const char* medcon_path(const char *const user_path, const bool reinit_path) { - static CImg s_path; - cimg::mutex(7); - if (reinit_path) s_path.assign(); - if (user_path) { - if (!s_path) s_path.assign(1024); - std::strncpy(s_path,user_path,1023); - } else if (!s_path) { - s_path.assign(1024); - bool path_found = false; - std::FILE *file = 0; + //! Get/set path to the FFMPEG's \c ffmpeg binary. + /** + \param user_path Specified path, or \c 0 to get the path currently used. + \param reinit_path Force path to be recalculated (may take some time). + \return Path containing the \c ffmpeg binary. + **/ + inline const char *ffmpeg_path(const char *const user_path, const bool reinit_path) { + static CImg s_path; + cimg::mutex(7); + if (reinit_path) s_path.assign(); + if (user_path) { + if (!s_path) s_path.assign(1024); + std::strncpy(s_path,user_path,1023); + } else if (!s_path) { + s_path.assign(1024); + bool path_found = false; + std::FILE *file = 0; #if cimg_OS==2 - const char *const pf_path = programfiles_path(); - if (!path_found) { - std::strcpy(s_path,".\\medcon.exe"); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - if (!path_found) { - cimg_snprintf(s_path,s_path._width,"%s\\XMedCon\\bin\\medcon.bat",pf_path); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - if (!path_found) { - cimg_snprintf(s_path,s_path._width,"%s\\XMedCon\\bin\\medcon.exe",pf_path); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - if (!path_found) { - std::strcpy(s_path,"C:\\XMedCon\\bin\\medcon.exe"); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - if (!path_found) std::strcpy(s_path,"medcon.exe"); + if (!path_found) { + std::strcpy(s_path,".\\ffmpeg.exe"); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + if (!path_found) std::strcpy(s_path,"ffmpeg.exe"); #else - if (!path_found) { - std::strcpy(s_path,"./medcon"); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - if (!path_found) std::strcpy(s_path,"medcon"); + if (!path_found) { + std::strcpy(s_path,"./ffmpeg"); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + if (!path_found) std::strcpy(s_path,"ffmpeg"); #endif - winformat_string(s_path); + winformat_string(s_path); + } + cimg::mutex(7,0); + return s_path; } - cimg::mutex(7,0); - return s_path; - } - //! Get/set path to the FFMPEG's \c ffmpeg binary. - /** - \param user_path Specified path, or \c 0 to get the path currently used. - \param reinit_path Force path to be recalculated (may take some time). - \return Path containing the \c ffmpeg binary. - **/ - inline const char *ffmpeg_path(const char *const user_path, const bool reinit_path) { - static CImg s_path; - cimg::mutex(7); - if (reinit_path) s_path.assign(); - if (user_path) { - if (!s_path) s_path.assign(1024); - std::strncpy(s_path,user_path,1023); - } else if (!s_path) { - s_path.assign(1024); - bool path_found = false; - std::FILE *file = 0; + //! Get/set path to the \c gzip binary. + /** + \param user_path Specified path, or \c 0 to get the path currently used. + \param reinit_path Force path to be recalculated (may take some time). + \return Path containing the \c gzip binary. + **/ + inline const char *gzip_path(const char *const user_path, const bool reinit_path) { + static CImg s_path; + cimg::mutex(7); + if (reinit_path) s_path.assign(); + if (user_path) { + if (!s_path) s_path.assign(1024); + std::strncpy(s_path,user_path,1023); + } else if (!s_path) { + s_path.assign(1024); + bool path_found = false; + std::FILE *file = 0; #if cimg_OS==2 - if (!path_found) { - std::strcpy(s_path,".\\ffmpeg.exe"); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - if (!path_found) std::strcpy(s_path,"ffmpeg.exe"); + if (!path_found) { + std::strcpy(s_path,".\\gzip.exe"); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + if (!path_found) std::strcpy(s_path,"gzip.exe"); #else - if (!path_found) { - std::strcpy(s_path,"./ffmpeg"); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - if (!path_found) std::strcpy(s_path,"ffmpeg"); + if (!path_found) { + std::strcpy(s_path,"./gzip"); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + if (!path_found) std::strcpy(s_path,"gzip"); #endif - winformat_string(s_path); + winformat_string(s_path); + } + cimg::mutex(7,0); + return s_path; } - cimg::mutex(7,0); - return s_path; - } - //! Get/set path to the \c gzip binary. - /** - \param user_path Specified path, or \c 0 to get the path currently used. - \param reinit_path Force path to be recalculated (may take some time). - \return Path containing the \c gzip binary. - **/ - inline const char *gzip_path(const char *const user_path, const bool reinit_path) { - static CImg s_path; - cimg::mutex(7); - if (reinit_path) s_path.assign(); - if (user_path) { - if (!s_path) s_path.assign(1024); - std::strncpy(s_path,user_path,1023); - } else if (!s_path) { - s_path.assign(1024); - bool path_found = false; - std::FILE *file = 0; + //! Get/set path to the \c gunzip binary. + /** + \param user_path Specified path, or \c 0 to get the path currently used. + \param reinit_path Force path to be recalculated (may take some time). + \return Path containing the \c gunzip binary. + **/ + inline const char *gunzip_path(const char *const user_path, const bool reinit_path) { + static CImg s_path; + cimg::mutex(7); + if (reinit_path) s_path.assign(); + if (user_path) { + if (!s_path) s_path.assign(1024); + std::strncpy(s_path,user_path,1023); + } else if (!s_path) { + s_path.assign(1024); + bool path_found = false; + std::FILE *file = 0; #if cimg_OS==2 - if (!path_found) { - std::strcpy(s_path,".\\gzip.exe"); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - if (!path_found) std::strcpy(s_path,"gzip.exe"); + if (!path_found) { + std::strcpy(s_path,".\\gunzip.exe"); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + if (!path_found) std::strcpy(s_path,"gunzip.exe"); #else - if (!path_found) { - std::strcpy(s_path,"./gzip"); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - if (!path_found) std::strcpy(s_path,"gzip"); + if (!path_found) { + std::strcpy(s_path,"./gunzip"); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + if (!path_found) std::strcpy(s_path,"gunzip"); #endif - winformat_string(s_path); + winformat_string(s_path); + } + cimg::mutex(7,0); + return s_path; } - cimg::mutex(7,0); - return s_path; - } - //! Get/set path to the \c gunzip binary. - /** - \param user_path Specified path, or \c 0 to get the path currently used. - \param reinit_path Force path to be recalculated (may take some time). - \return Path containing the \c gunzip binary. - **/ - inline const char *gunzip_path(const char *const user_path, const bool reinit_path) { - static CImg s_path; - cimg::mutex(7); - if (reinit_path) s_path.assign(); - if (user_path) { - if (!s_path) s_path.assign(1024); - std::strncpy(s_path,user_path,1023); - } else if (!s_path) { - s_path.assign(1024); - bool path_found = false; - std::FILE *file = 0; + //! Get/set path to the \c dcraw binary. + /** + \param user_path Specified path, or \c 0 to get the path currently used. + \param reinit_path Force path to be recalculated (may take some time). + \return Path containing the \c dcraw binary. + **/ + inline const char *dcraw_path(const char *const user_path, const bool reinit_path) { + static CImg s_path; + cimg::mutex(7); + if (reinit_path) s_path.assign(); + if (user_path) { + if (!s_path) s_path.assign(1024); + std::strncpy(s_path,user_path,1023); + } else if (!s_path) { + s_path.assign(1024); + bool path_found = false; + std::FILE *file = 0; #if cimg_OS==2 - if (!path_found) { - std::strcpy(s_path,".\\gunzip.exe"); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - if (!path_found) std::strcpy(s_path,"gunzip.exe"); + if (!path_found) { + std::strcpy(s_path,".\\dcraw.exe"); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + if (!path_found) std::strcpy(s_path,"dcraw.exe"); #else - if (!path_found) { - std::strcpy(s_path,"./gunzip"); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - if (!path_found) std::strcpy(s_path,"gunzip"); + if (!path_found) { + std::strcpy(s_path,"./dcraw"); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + if (!path_found) std::strcpy(s_path,"dcraw"); #endif - winformat_string(s_path); + winformat_string(s_path); + } + cimg::mutex(7,0); + return s_path; } - cimg::mutex(7,0); - return s_path; - } - //! Get/set path to the \c dcraw binary. - /** - \param user_path Specified path, or \c 0 to get the path currently used. - \param reinit_path Force path to be recalculated (may take some time). - \return Path containing the \c dcraw binary. - **/ - inline const char *dcraw_path(const char *const user_path, const bool reinit_path) { - static CImg s_path; - cimg::mutex(7); - if (reinit_path) s_path.assign(); - if (user_path) { - if (!s_path) s_path.assign(1024); - std::strncpy(s_path,user_path,1023); - } else if (!s_path) { - s_path.assign(1024); - bool path_found = false; - std::FILE *file = 0; + //! Get/set path to the \c wget binary. + /** + \param user_path Specified path, or \c 0 to get the path currently used. + \param reinit_path Force path to be recalculated (may take some time). + \return Path containing the \c wget binary. + **/ + inline const char *wget_path(const char *const user_path, const bool reinit_path) { + static CImg s_path; + cimg::mutex(7); + if (reinit_path) s_path.assign(); + if (user_path) { + if (!s_path) s_path.assign(1024); + std::strncpy(s_path,user_path,1023); + } else if (!s_path) { + s_path.assign(1024); + bool path_found = false; + std::FILE *file = 0; #if cimg_OS==2 - if (!path_found) { - std::strcpy(s_path,".\\dcraw.exe"); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - if (!path_found) std::strcpy(s_path,"dcraw.exe"); + if (!path_found) { + std::strcpy(s_path,".\\wget.exe"); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + if (!path_found) std::strcpy(s_path,"wget.exe"); #else - if (!path_found) { - std::strcpy(s_path,"./dcraw"); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - if (!path_found) std::strcpy(s_path,"dcraw"); + if (!path_found) { + std::strcpy(s_path,"./wget"); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + if (!path_found) std::strcpy(s_path,"wget"); #endif - winformat_string(s_path); + winformat_string(s_path); + } + cimg::mutex(7,0); + return s_path; } - cimg::mutex(7,0); - return s_path; - } - //! Get/set path to the \c wget binary. - /** - \param user_path Specified path, or \c 0 to get the path currently used. - \param reinit_path Force path to be recalculated (may take some time). - \return Path containing the \c wget binary. - **/ - inline const char *wget_path(const char *const user_path, const bool reinit_path) { - static CImg s_path; - cimg::mutex(7); - if (reinit_path) s_path.assign(); - if (user_path) { - if (!s_path) s_path.assign(1024); - std::strncpy(s_path,user_path,1023); - } else if (!s_path) { - s_path.assign(1024); - bool path_found = false; - std::FILE *file = 0; + //! Get/set path to the \c curl binary. + /** + \param user_path Specified path, or \c 0 to get the path currently used. + \param reinit_path Force path to be recalculated (may take some time). + \return Path containing the \c curl binary. + **/ + inline const char *curl_path(const char *const user_path, const bool reinit_path) { + static CImg s_path; + cimg::mutex(7); + if (reinit_path) s_path.assign(); + if (user_path) { + if (!s_path) s_path.assign(1024); + std::strncpy(s_path,user_path,1023); + } else if (!s_path) { + s_path.assign(1024); + bool path_found = false; + std::FILE *file = 0; #if cimg_OS==2 - if (!path_found) { - std::strcpy(s_path,".\\wget.exe"); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - if (!path_found) std::strcpy(s_path,"wget.exe"); + if (!path_found) { + std::strcpy(s_path,".\\curl.exe"); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + if (!path_found) std::strcpy(s_path,"curl.exe"); #else - if (!path_found) { - std::strcpy(s_path,"./wget"); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - if (!path_found) std::strcpy(s_path,"wget"); + if (!path_found) { + std::strcpy(s_path,"./curl"); + if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } + } + if (!path_found) std::strcpy(s_path,"curl"); #endif - winformat_string(s_path); + winformat_string(s_path); + } + cimg::mutex(7,0); + return s_path; } - cimg::mutex(7,0); - return s_path; - } - //! Get/set path to the \c curl binary. - /** - \param user_path Specified path, or \c 0 to get the path currently used. - \param reinit_path Force path to be recalculated (may take some time). - \return Path containing the \c curl binary. - **/ - inline const char *curl_path(const char *const user_path, const bool reinit_path) { - static CImg s_path; - cimg::mutex(7); - if (reinit_path) s_path.assign(); - if (user_path) { - if (!s_path) s_path.assign(1024); - std::strncpy(s_path,user_path,1023); - } else if (!s_path) { - s_path.assign(1024); - bool path_found = false; - std::FILE *file = 0; -#if cimg_OS==2 - if (!path_found) { - std::strcpy(s_path,".\\curl.exe"); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - if (!path_found) std::strcpy(s_path,"curl.exe"); -#else - if (!path_found) { - std::strcpy(s_path,"./curl"); - if ((file=cimg::std_fopen(s_path,"r"))!=0) { cimg::fclose(file); path_found = true; } - } - if (!path_found) std::strcpy(s_path,"curl"); -#endif - winformat_string(s_path); + // [internal] Sorting function, used by cimg::files(). + inline int _sort_files(const void* a, const void* b) { + const CImg &sa = *(CImg*)a, &sb = *(CImg*)b; + return std::strcmp(sa._data,sb._data); } - cimg::mutex(7,0); - return s_path; - } - // [internal] Sorting function, used by cimg::files(). - inline int _sort_files(const void* a, const void* b) { - const CImg &sa = *(CImg*)a, &sb = *(CImg*)b; - return std::strcmp(sa._data,sb._data); - } + //! Generate a numbered version of a filename. + inline char* number_filename(const char *const filename, const int number, + const unsigned int digits, char *const str) { + if (!filename) { if (str) *str = 0; return 0; } + CImg format(1024), body(1024); + const char *const ext = cimg::split_filename(filename,body); + if (*ext) cimg_snprintf(format,1024,"%%s_%%.%ud.%%s",digits); + else cimg_snprintf(format,1024,"%%s_%%.%ud",digits); + cimg_snprintf(str,1024,format._data,body._data,number,ext); + return str; + } - //! Return list of files/directories in specified directory. - /** - \param path Path to the directory. Set to 0 for current directory. - \param is_pattern Tell if specified path has a matching pattern in it. - \param mode Output type, can be primary { 0=files only | 1=folders only | 2=files + folders }. - \param include_path Tell if \c path must be included in resulting filenames. - \return A list of filenames. - **/ - inline CImgList files(const char *const path, const bool is_pattern=false, - const unsigned int mode=2, const bool include_path=false) { - if (!path || !*path) return files("*",true,mode,include_path); - CImgList res; - - // If path is a valid folder name, ignore argument 'is_pattern'. - const bool _is_pattern = is_pattern && !cimg::is_directory(path); - bool is_root = false, is_current = false; - cimg::unused(is_root,is_current); + //! Return list of files/directories in specified directory. + /** + \param path Path to the directory. Set to 0 for current directory. + \param is_pattern Tell if specified path has a matching pattern in it. + \param mode Output type, can be primary { 0=files only | 1=folders only | 2=files + folders }. + \param include_path Tell if \c path must be included in resulting filenames. + \return A list of filenames. + **/ + inline CImgList files(const char *const path, const bool is_pattern=false, + const unsigned int mode=2, const bool include_path=false) { + if (!path || !*path) return files("*",true,mode,include_path); + CImgList res; + + // If path is a valid folder name, ignore argument 'is_pattern'. + const bool _is_pattern = is_pattern && !cimg::is_directory(path); + bool is_root = false, is_current = false; + cimg::unused(is_root,is_current); - // Clean format of input path. - CImg pattern, _path = CImg::string(path); + // Clean format of input path. + CImg pattern, _path = CImg::string(path); #if cimg_OS==2 - for (char *ps = _path; *ps; ++ps) if (*ps=='\\') *ps='/'; + for (char *ps = _path; *ps; ++ps) if (*ps=='\\') *ps='/'; #endif - char *pd = _path; - for (char *ps = pd; *ps; ++ps) { if (*ps!='/' || *ps!=*(ps+1)) *(pd++) = *ps; } - *pd = 0; - unsigned int lp = (unsigned int)std::strlen(_path); - if (!_is_pattern && lp && _path[lp - 1]=='/') { - _path[lp - 1] = 0; --lp; + char *pd = _path; + for (char *ps = pd; *ps; ++ps) { if (*ps!='/' || *ps!=*(ps+1)) *(pd++) = *ps; } + *pd = 0; + unsigned int lp = (unsigned int)std::strlen(_path); + if (!_is_pattern && lp && _path[lp - 1]=='/') { + _path[lp - 1] = 0; --lp; #if cimg_OS!=2 - is_root = !*_path; + is_root = !*_path; #endif - } + } - // Separate folder path and matching pattern. - if (_is_pattern) { - const unsigned int bpos = (unsigned int)(cimg::basename(_path,'/') - _path.data()); - CImg::string(_path).move_to(pattern); - if (bpos) { - _path[bpos - 1] = 0; // End 'path' at last slash + // Separate folder path and matching pattern. + if (_is_pattern) { + const unsigned int bpos = (unsigned int)(cimg::basename(_path,'/') - _path.data()); + CImg::string(_path).move_to(pattern); + if (bpos) { + _path[bpos - 1] = 0; // End 'path' at last slash #if cimg_OS!=2 - is_root = !*_path; + is_root = !*_path; #endif - } else { // No path to folder specified, assuming current folder - is_current = true; *_path = 0; + } else { // No path to folder specified, assuming current folder + is_current = true; *_path = 0; + } + lp = (unsigned int)std::strlen(_path); } - lp = (unsigned int)std::strlen(_path); - } - // Windows version. + // Windows version. #if cimg_OS==2 - if (!_is_pattern) { - pattern.assign(lp + 3); - std::memcpy(pattern,_path,lp); - pattern[lp] = '/'; pattern[lp + 1] = '*'; pattern[lp + 2] = 0; - } - WIN32_FIND_DATAA file_data; - const HANDLE dir = FindFirstFileA(pattern.data(),&file_data); - if (dir==INVALID_HANDLE_VALUE) return CImgList::const_empty(); - do { - const char *const filename = file_data.cFileName; - if (*filename!='.' || (filename[1] && (filename[1]!='.' || filename[2]))) { - const unsigned int lf = (unsigned int)std::strlen(filename); - const bool is_directory = (file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)!=0; - if ((!mode && !is_directory) || (mode==1 && is_directory) || mode>=2) { - if (include_path) { - CImg full_filename((lp?lp+1:0) + lf + 1); - if (lp) { std::memcpy(full_filename,_path,lp); full_filename[lp] = '/'; } - std::memcpy(full_filename._data + (lp?lp + 1:0),filename,lf + 1); - full_filename.move_to(res); - } else CImg(filename,lf + 1).move_to(res); + if (!_is_pattern) { + pattern.assign(lp + 3); + std::memcpy(pattern,_path,lp); + pattern[lp] = '/'; pattern[lp + 1] = '*'; pattern[lp + 2] = 0; + } + WIN32_FIND_DATAA file_data; + const HANDLE dir = FindFirstFileA(pattern.data(),&file_data); + if (dir==INVALID_HANDLE_VALUE) return CImgList::const_empty(); + do { + const char *const filename = file_data.cFileName; + if (*filename!='.' || (filename[1] && (filename[1]!='.' || filename[2]))) { + const unsigned int lf = (unsigned int)std::strlen(filename); + const bool is_directory = (file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)!=0; + if ((!mode && !is_directory) || (mode==1 && is_directory) || mode>=2) { + if (include_path) { + CImg full_filename((lp?lp+1:0) + lf + 1); + if (lp) { std::memcpy(full_filename,_path,lp); full_filename[lp] = '/'; } + std::memcpy(full_filename._data + (lp?lp + 1:0),filename,lf + 1); + full_filename.move_to(res); + } else CImg(filename,lf + 1).move_to(res); + } } - } - } while (FindNextFileA(dir,&file_data)); - FindClose(dir); + } while (FindNextFileA(dir,&file_data)); + FindClose(dir); - // Unix version (posix). + // Unix version (posix). #elif cimg_OS == 1 - DIR *const dir = opendir(is_root?"/":is_current?".":_path.data()); - if (!dir) return CImgList::const_empty(); - struct dirent *ent; - while ((ent=readdir(dir))!=0) { - const char *const filename = ent->d_name; - if (*filename!='.' || (filename[1] && (filename[1]!='.' || filename[2]))) { - const unsigned int lf = (unsigned int)std::strlen(filename); - CImg full_filename(lp + lf + 2); - - if (!is_current) { - full_filename.assign(lp + lf + 2); - if (lp) std::memcpy(full_filename,_path,lp); - full_filename[lp] = '/'; - std::memcpy(full_filename._data + lp + 1,filename,lf + 1); - } else full_filename.assign(filename,lf + 1); - - struct stat st; - if (stat(full_filename,&st)==-1) continue; - const bool is_directory = (st.st_mode & S_IFDIR)!=0; - if ((!mode && !is_directory) || (mode==1 && is_directory) || mode==2) { - if (include_path) { - if (!_is_pattern || (_is_pattern && !fnmatch(pattern,full_filename,0))) - full_filename.move_to(res); - } else { - if (!_is_pattern || (_is_pattern && !fnmatch(pattern,full_filename,0))) - CImg(filename,lf + 1).move_to(res); + DIR *const dir = opendir(is_root?"/":is_current?".":_path.data()); + if (!dir) return CImgList::const_empty(); + struct dirent *ent; + while ((ent=readdir(dir))!=0) { + const char *const filename = ent->d_name; + if (*filename!='.' || (filename[1] && (filename[1]!='.' || filename[2]))) { + const unsigned int lf = (unsigned int)std::strlen(filename); + CImg full_filename(lp + lf + 2); + + if (!is_current) { + full_filename.assign(lp + lf + 2); + if (lp) std::memcpy(full_filename,_path,lp); + full_filename[lp] = '/'; + std::memcpy(full_filename._data + lp + 1,filename,lf + 1); + } else full_filename.assign(filename,lf + 1); + + struct stat st; + if (stat(full_filename,&st)==-1) continue; + const bool is_directory = (st.st_mode & S_IFDIR)!=0; + if ((!mode && !is_directory) || (mode==1 && is_directory) || mode==2) { + if (include_path) { + if (!_is_pattern || (_is_pattern && !fnmatch(pattern,full_filename,0))) + full_filename.move_to(res); + } else { + if (!_is_pattern || (_is_pattern && !fnmatch(pattern,full_filename,0))) + CImg(filename,lf + 1).move_to(res); + } } } } - } - closedir(dir); + closedir(dir); #endif - // Sort resulting list by lexicographic order. - if (res._width>=2) std::qsort(res._data,res._width,sizeof(CImg),_sort_files); + // Sort resulting list by lexicographic order. + if (res._width>=2) std::qsort(res._data,res._width,sizeof(CImg),_sort_files); - return res; - } + return res; + } - //! Try to guess format from an image file. - /** - \param file Input file (can be \c 0 if \c filename is set). - \param filename Filename, as a C-string (can be \c 0 if \c file is set). - \return C-string containing the guessed file format, or \c 0 if nothing has been guessed. - **/ - inline const char *ftype(std::FILE *const file, const char *const filename) { - if (!file && !filename) - throw CImgArgumentException("cimg::ftype(): Specified filename is (null)."); - static const char - *const _pnm = "pnm", - *const _pfm = "pfm", - *const _bmp = "bmp", - *const _gif = "gif", - *const _jpg = "jpg", - *const _off = "off", - *const _pan = "pan", - *const _png = "png", - *const _tif = "tif", - *const _inr = "inr", - *const _dcm = "dcm"; - const char *f_type = 0; - CImg header; - const unsigned int omode = cimg::exception_mode(); - cimg::exception_mode(0); - try { - header._load_raw(file,filename,512,1,1,1,false,false,0); - const unsigned char *const uheader = (unsigned char*)header._data; - if (!std::strncmp(header,"OFF\n",4)) f_type = _off; // OFF - else if (!std::strncmp(header,"#INRIMAGE",9)) f_type = _inr; // INRIMAGE - else if (!std::strncmp(header,"PANDORE",7)) f_type = _pan; // PANDORE - else if (!std::strncmp(header.data() + 128,"DICM",4)) f_type = _dcm; // DICOM - else if (uheader[0]==0xFF && uheader[1]==0xD8 && uheader[2]==0xFF) f_type = _jpg; // JPEG - else if (header[0]=='B' && header[1]=='M') f_type = _bmp; // BMP - else if (header[0]=='G' && header[1]=='I' && header[2]=='F' && header[3]=='8' && header[5]=='a' && // GIF - (header[4]=='7' || header[4]=='9')) f_type = _gif; - else if (uheader[0]==0x89 && uheader[1]==0x50 && uheader[2]==0x4E && uheader[3]==0x47 && // PNG - uheader[4]==0x0D && uheader[5]==0x0A && uheader[6]==0x1A && uheader[7]==0x0A) f_type = _png; - else if ((uheader[0]==0x49 && uheader[1]==0x49) || (uheader[0]==0x4D && uheader[1]==0x4D)) f_type = _tif; // TIFF - else { // PNM or PFM - CImgList _header = header.get_split(CImg::vector('\n'),0,false); - cimglist_for(_header,l) { - if (_header(l,0)=='#') continue; - if (_header[l]._height==2 && _header(l,0)=='P') { - const char c = _header(l,1); - if (c=='f' || c=='F') { f_type = _pfm; break; } - if (c>='1' && c<='9') { f_type = _pnm; break; } - } - f_type = 0; break; - } - } - } catch (CImgIOException&) { } - cimg::exception_mode(omode); - return f_type; - } + //! Try to guess format from an image file. + /** + \param file Input file (can be \c 0 if \c filename is set). + \param filename Filename, as a C-string (can be \c 0 if \c file is set). + \return C-string containing the guessed file format, or \c 0 if nothing has been guessed. + **/ + inline const char *ftype(std::FILE *const file, const char *const filename) { + if (!file && !filename) + throw CImgArgumentException("cimg::ftype(): Specified filename is (null)."); + static const char + *const _pnm = "pnm", + *const _pfm = "pfm", + *const _bmp = "bmp", + *const _gif = "gif", + *const _jpg = "jpg", + *const _off = "off", + *const _pan = "pan", + *const _png = "png", + *const _tif = "tif", + *const _inr = "inr", + *const _dcm = "dcm"; + const char *f_type = 0; + CImg header; + const unsigned int omode = cimg::exception_mode(); + cimg::exception_mode(0); + try { + header._load_raw(file,filename,512,1,1,1,false,false,0); + const unsigned char *const uheader = (unsigned char*)header._data; + if (!std::strncmp(header,"OFF\n",4)) f_type = _off; // OFF + else if (!std::strncmp(header,"#INRIMAGE",9)) // INRIMAGE + f_type = _inr; + else if (!std::strncmp(header,"PANDORE",7)) // PANDORE + f_type = _pan; + else if (!std::strncmp(header.data() + 128,"DICM",4)) // DICOM + f_type = _dcm; + else if (uheader[0]==0xFF && uheader[1]==0xD8 && uheader[2]==0xFF) // JPEG + f_type = _jpg; + else if (header[0]=='B' && header[1]=='M') // BMP + f_type = _bmp; + else if (header[0]=='G' && header[1]=='I' && header[2]=='F' && header[3]=='8' && header[5]=='a' && + (header[4]=='7' || header[4]=='9')) // GIF + f_type = _gif; + else if (uheader[0]==0x89 && uheader[1]==0x50 && uheader[2]==0x4E && uheader[3]==0x47 && + uheader[4]==0x0D && uheader[5]==0x0A && uheader[6]==0x1A && uheader[7]==0x0A) // PNG + f_type = _png; + else if ((uheader[0]==0x49 && uheader[1]==0x49) || (uheader[0]==0x4D && uheader[1]==0x4D)) // TIFF + f_type = _tif; + else { // PNM or PFM + CImgList _header = header.get_split(CImg::vector('\n'),0,false); + cimglist_for(_header,l) { + if (_header(l,0)=='#') continue; + if (_header[l]._width==2 && _header(l,0)=='P') { + const char c = _header(l,1); + if (c=='f' || c=='F') { f_type = _pfm; break; } + if (c>='1' && c<='9') { f_type = _pnm; break; } + } + f_type = 0; break; + } + } + } catch (CImgIOException&) { } + cimg::exception_mode(omode); + return f_type; + } - //! Load file from network as a local temporary file. - /** - \param url URL of the filename, as a C-string. - \param[out] filename_local C-string containing the path to a local copy of \c filename. - \param timeout Maximum time (in seconds) authorized for downloading the file from the URL. - \param try_fallback When using libcurl, tells using system calls as fallbacks in case of libcurl failure. - \param referer Referer used, as a C-string. - \return Value of \c filename_local. - \note Use the \c libcurl library, or the external binaries \c wget or \c curl to perform the download. - **/ - inline char *load_network(const char *const url, char *const filename_local, - const unsigned int timeout, const bool try_fallback, - const char *const referer) { - if (!url) - throw CImgArgumentException("cimg::load_network(): Specified URL is (null)."); - if (!filename_local) - throw CImgArgumentException("cimg::load_network(): Specified destination string is (null)."); - - const char *const __ext = cimg::split_filename(url), *const _ext = (*__ext && __ext>url)?__ext - 1:__ext; - CImg ext = CImg::string(_ext); - std::FILE *file = 0; - *filename_local = 0; - if (ext._width>16 || !cimg::strncasecmp(ext,"cgi",3)) *ext = 0; - else cimg::strwindows_reserved(ext); - do { - cimg_snprintf(filename_local,256,"%s%c%s%s", - cimg::temporary_path(),cimg_file_separator,cimg::filenamerand(),ext._data); - if ((file=cimg::std_fopen(filename_local,"rb"))!=0) cimg::fclose(file); - } while (file); + //! Load file from network as a local temporary file. + /** + \param url URL of the filename, as a C-string. + \param[out] filename_local C-string containing the path to a local copy of \c filename. + \param timeout Maximum time (in seconds) authorized for downloading the file from the URL. + \param try_fallback When using libcurl, tells using system calls as fallbacks in case of libcurl failure. + \param referer Referer used, as a C-string. + \return Value of \c filename_local. + \note Use the \c libcurl library, or the external binaries \c wget or \c curl to perform the download. + **/ + inline char *load_network(const char *const url, char *const filename_local, + const unsigned int timeout, const bool try_fallback, + const char *const referer) { + if (!url) + throw CImgArgumentException("cimg::load_network(): Specified URL is (null)."); + if (!filename_local) + throw CImgArgumentException("cimg::load_network(): Specified destination string is (null)."); + if (!network_mode()) + throw CImgIOException("cimg::load_network(): Loading files from network is disabled."); + + const char *const __ext = cimg::split_filename(url), *const _ext = (*__ext && __ext>url)?__ext - 1:__ext; + CImg ext = CImg::string(_ext); + std::FILE *file = 0; + *filename_local = 0; + if (ext._width>16 || !cimg::strncasecmp(ext,"cgi",3)) *ext = 0; + else cimg::strwindows_reserved(ext); + do { + cimg_snprintf(filename_local,256,"%s%c%s%s", + cimg::temporary_path(),cimg_file_separator,cimg::filenamerand(),ext._data); + if ((file=cimg::std_fopen(filename_local,"rb"))!=0) cimg::fclose(file); + } while (file); #ifdef cimg_use_curl - const unsigned int omode = cimg::exception_mode(); - cimg::exception_mode(0); - try { - CURL *curl = 0; - CURLcode res; - curl = curl_easy_init(); - if (curl) { - file = cimg::fopen(filename_local,"wb"); - curl_easy_setopt(curl,CURLOPT_URL,url); - curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,0); - curl_easy_setopt(curl,CURLOPT_WRITEDATA,file); - curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,0L); - curl_easy_setopt(curl,CURLOPT_SSL_VERIFYHOST,0L); - curl_easy_setopt(curl,CURLOPT_FOLLOWLOCATION,1L); - if (timeout) curl_easy_setopt(curl,CURLOPT_TIMEOUT,(long)timeout); - if (std::strchr(url,'?')) curl_easy_setopt(curl,CURLOPT_HTTPGET,1L); - if (referer) curl_easy_setopt(curl,CURLOPT_REFERER,referer); - res = curl_easy_perform(curl); - curl_easy_cleanup(curl); - cimg::fseek(file,0,SEEK_END); // Check if file size is 0 - const cimg_ulong siz = cimg::ftell(file); - cimg::fclose(file); - if (siz>0 && res==CURLE_OK) { - cimg::exception_mode(omode); - return filename_local; - } else std::remove(filename_local); - } - } catch (...) { } - cimg::exception_mode(omode); - if (!try_fallback) throw CImgIOException("cimg::load_network(): Failed to load file '%s' with libcurl.",url); -#endif - - CImg command((unsigned int)std::strlen(url) + 64); - cimg::unused(try_fallback); - - // Try with 'curl' first. - if (timeout) { - if (referer) - cimg_snprintf(command,command._width,"%s -e %s -m %u -f --silent --compressed -o \"%s\" \"%s\"", - cimg::curl_path(),referer,timeout,filename_local, - CImg::string(url)._system_strescape().data()); - else - cimg_snprintf(command,command._width,"%s -m %u -f --silent --compressed -o \"%s\" \"%s\"", - cimg::curl_path(),timeout,filename_local, - CImg::string(url)._system_strescape().data()); - } else { - if (referer) - cimg_snprintf(command,command._width,"%s -e %s -f --silent --compressed -o \"%s\" \"%s\"", - cimg::curl_path(),referer,filename_local, - CImg::string(url)._system_strescape().data()); - else - cimg_snprintf(command,command._width,"%s -f --silent --compressed -o \"%s\" \"%s\"", - cimg::curl_path(),filename_local, - CImg::string(url)._system_strescape().data()); - } - cimg::system(command); + const unsigned int omode = cimg::exception_mode(); + cimg::exception_mode(0); + try { + CURL *curl = 0; + CURLcode res; + curl = curl_easy_init(); + if (curl) { + file = cimg::fopen(filename_local,"wb"); + curl_easy_setopt(curl,CURLOPT_URL,url); + curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,0); + curl_easy_setopt(curl,CURLOPT_WRITEDATA,file); + curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,0L); + curl_easy_setopt(curl,CURLOPT_SSL_VERIFYHOST,0L); + curl_easy_setopt(curl,CURLOPT_FOLLOWLOCATION,1L); + if (timeout) curl_easy_setopt(curl,CURLOPT_TIMEOUT,(long)timeout); + if (std::strchr(url,'?')) curl_easy_setopt(curl,CURLOPT_HTTPGET,1L); + if (referer) curl_easy_setopt(curl,CURLOPT_REFERER,referer); + res = curl_easy_perform(curl); + curl_easy_cleanup(curl); + cimg::fseek(file,0,SEEK_END); // Check if file size is 0 + const cimg_ulong siz = cimg::ftell(file); + cimg::fclose(file); + if (siz>0 && res==CURLE_OK) { + cimg::exception_mode(omode); + return filename_local; + } else std::remove(filename_local); + } + } catch (...) { } + cimg::exception_mode(omode); + if (!try_fallback) throw CImgIOException("cimg::load_network(): Failed to load file '%s' with libcurl.",url); +#endif - if (!(file=cimg::std_fopen(filename_local,"rb"))) { + CImg command((unsigned int)std::strlen(url) + 64); + cimg::unused(try_fallback); - // Try with 'wget' otherwise. + // Try with 'curl' first. if (timeout) { if (referer) - cimg_snprintf(command,command._width,"%s --referer=%s -T %u -q -r -l 0 --no-cache -O \"%s\" \"%s\"", - cimg::wget_path(),referer,timeout,filename_local, + cimg_snprintf(command,command._width,"%s -e %s -m %u -f --silent --compressed -o \"%s\" \"%s\"", + cimg::curl_path(),referer,timeout,filename_local, CImg::string(url)._system_strescape().data()); else - cimg_snprintf(command,command._width,"%s -T %u -q -r -l 0 --no-cache -O \"%s\" \"%s\"", - cimg::wget_path(),timeout,filename_local, + cimg_snprintf(command,command._width,"%s -m %u -f --silent --compressed -o \"%s\" \"%s\"", + cimg::curl_path(),timeout,filename_local, CImg::string(url)._system_strescape().data()); } else { if (referer) - cimg_snprintf(command,command._width,"%s --referer=%s -q -r -l 0 --no-cache -O \"%s\" \"%s\"", - cimg::wget_path(),referer,filename_local, + cimg_snprintf(command,command._width,"%s -e %s -f --silent --compressed -o \"%s\" \"%s\"", + cimg::curl_path(),referer,filename_local, CImg::string(url)._system_strescape().data()); else - cimg_snprintf(command,command._width,"%s -q -r -l 0 --no-cache -O \"%s\" \"%s\"", - cimg::wget_path(),filename_local, + cimg_snprintf(command,command._width,"%s -f --silent --compressed -o \"%s\" \"%s\"", + cimg::curl_path(),filename_local, CImg::string(url)._system_strescape().data()); } cimg::system(command); - if (!(file=cimg::std_fopen(filename_local,"rb"))) - throw CImgIOException("cimg::load_network(): Failed to load file '%s' with external commands " - "'wget' or 'curl'.",url); - cimg::fclose(file); + if (!(file=cimg::std_fopen(filename_local,"rb"))) { - // Try gunzip it. - cimg_snprintf(command,command._width,"%s.gz",filename_local); - std::rename(filename_local,command); - cimg_snprintf(command,command._width,"%s --quiet \"%s.gz\"", - gunzip_path(),filename_local); - cimg::system(command); - file = cimg::std_fopen(filename_local,"rb"); - if (!file) { + // Try with 'wget' otherwise. + if (timeout) { + if (referer) + cimg_snprintf(command,command._width,"%s --referer=%s -T %u -q -r -l 0 --no-cache -O \"%s\" \"%s\"", + cimg::wget_path(),referer,timeout,filename_local, + CImg::string(url)._system_strescape().data()); + else + cimg_snprintf(command,command._width,"%s -T %u -q -r -l 0 --no-cache -O \"%s\" \"%s\"", + cimg::wget_path(),timeout,filename_local, + CImg::string(url)._system_strescape().data()); + } else { + if (referer) + cimg_snprintf(command,command._width,"%s --referer=%s -q -r -l 0 --no-cache -O \"%s\" \"%s\"", + cimg::wget_path(),referer,filename_local, + CImg::string(url)._system_strescape().data()); + else + cimg_snprintf(command,command._width,"%s -q -r -l 0 --no-cache -O \"%s\" \"%s\"", + cimg::wget_path(),filename_local, + CImg::string(url)._system_strescape().data()); + } + cimg::system(command); + + if (!(file=cimg::std_fopen(filename_local,"rb"))) + throw CImgIOException("cimg::load_network(): Failed to load file '%s' with external commands " + "'wget' or 'curl'.",url); + cimg::fclose(file); + + // Try gunzip it. cimg_snprintf(command,command._width,"%s.gz",filename_local); - std::rename(command,filename_local); + std::rename(filename_local,command); + cimg_snprintf(command,command._width,"%s --quiet \"%s.gz\"", + gunzip_path(),filename_local); + cimg::system(command); file = cimg::std_fopen(filename_local,"rb"); + if (!file) { + cimg_snprintf(command,command._width,"%s.gz",filename_local); + std::rename(command,filename_local); + file = cimg::std_fopen(filename_local,"rb"); + } } - } - cimg::fseek(file,0,SEEK_END); // Check if file size is 0 - if (std::ftell(file)<=0) - throw CImgIOException("cimg::load_network(): Failed to load URL '%s' with external commands " - "'wget' or 'curl'.",url); - cimg::fclose(file); - return filename_local; - } - - // Implement a tic/toc mechanism to display elapsed time of algorithms. - inline cimg_ulong tictoc(const bool is_tic) { - cimg::mutex(2); - static CImg times(64); - static unsigned int pos = 0; - const cimg_ulong t1 = cimg::time(); - if (is_tic) { - // Tic - times[pos++] = t1; - if (pos>=times._width) - throw CImgArgumentException("cimg::tic(): Too much calls to 'cimg::tic()' without calls to 'cimg::toc()'."); - cimg::mutex(2,0); - return t1; + cimg::fseek(file,0,SEEK_END); // Check if file size is 0 + if (std::ftell(file)<=0) + throw CImgIOException("cimg::load_network(): Failed to load URL '%s' with external commands " + "'wget' or 'curl'.",url); + cimg::fclose(file); + return filename_local; } - // Toc - if (!pos) - throw CImgArgumentException("cimg::toc(): No previous call to 'cimg::tic()' has been made."); - const cimg_ulong - t0 = times[--pos], - dt = t1>=t0?(t1 - t0):cimg::type::max(); - const unsigned int - edays = (unsigned int)(dt/86400000.), - ehours = (unsigned int)((dt - edays*86400000.)/3600000.), - emin = (unsigned int)((dt - edays*86400000. - ehours*3600000.)/60000.), - esec = (unsigned int)((dt - edays*86400000. - ehours*3600000. - emin*60000.)/1000.), - ems = (unsigned int)(dt - edays*86400000. - ehours*3600000. - emin*60000. - esec*1000.); - if (!edays && !ehours && !emin && !esec) - std::fprintf(cimg::output(),"%s[CImg]%*sElapsed time: %u ms%s\n", - cimg::t_red,1 + 2*pos,"",ems,cimg::t_normal); - else { - if (!edays && !ehours && !emin) - std::fprintf(cimg::output(),"%s[CImg]%*sElapsed time: %u sec %u ms%s\n", - cimg::t_red,1 + 2*pos,"",esec,ems,cimg::t_normal); + // Implement a tic/toc mechanism to display elapsed time of algorithms. + inline cimg_uint64 tictoc(const bool is_tic) { + cimg::mutex(2); + static CImg times(64); + static unsigned int pos = 0; + const cimg_uint64 t1 = cimg::time(); + if (is_tic) { + // Tic + times[pos++] = t1; + if (pos>=times._width) + throw CImgArgumentException("cimg::tic(): Too much calls to 'cimg::tic()' without calls to 'cimg::toc()'."); + cimg::mutex(2,0); + return t1; + } + + // Toc + if (!pos) + throw CImgArgumentException("cimg::toc(): No previous call to 'cimg::tic()' has been made."); + const cimg_uint64 + t0 = times[--pos], + dt = t1>=t0?(t1 - t0):cimg::type::max(); + const unsigned int + edays = (unsigned int)(dt/86400000.), + ehours = (unsigned int)((dt - edays*86400000.)/3600000.), + emin = (unsigned int)((dt - edays*86400000. - ehours*3600000.)/60000.), + esec = (unsigned int)((dt - edays*86400000. - ehours*3600000. - emin*60000.)/1000.), + ems = (unsigned int)(dt - edays*86400000. - ehours*3600000. - emin*60000. - esec*1000.); + if (!edays && !ehours && !emin && !esec) + std::fprintf(cimg::output(),"%s[CImg]%*sElapsed time: %u ms%s\n", + cimg::t_red,1 + 2*pos,"",ems,cimg::t_normal); else { - if (!edays && !ehours) - std::fprintf(cimg::output(),"%s[CImg]%*sElapsed time: %u min %u sec %u ms%s\n", - cimg::t_red,1 + 2*pos,"",emin,esec,ems,cimg::t_normal); - else{ - if (!edays) - std::fprintf(cimg::output(),"%s[CImg]%*sElapsed time: %u hours %u min %u sec %u ms%s\n", - cimg::t_red,1 + 2*pos,"",ehours,emin,esec,ems,cimg::t_normal); + if (!edays && !ehours && !emin) + std::fprintf(cimg::output(),"%s[CImg]%*sElapsed time: %u sec %u ms%s\n", + cimg::t_red,1 + 2*pos,"",esec,ems,cimg::t_normal); + else { + if (!edays && !ehours) + std::fprintf(cimg::output(),"%s[CImg]%*sElapsed time: %u min %u sec %u ms%s\n", + cimg::t_red,1 + 2*pos,"",emin,esec,ems,cimg::t_normal); else{ - std::fprintf(cimg::output(),"%s[CImg]%*sElapsed time: %u days %u hours %u min %u sec %u ms%s\n", - cimg::t_red,1 + 2*pos,"",edays,ehours,emin,esec,ems,cimg::t_normal); + if (!edays) + std::fprintf(cimg::output(),"%s[CImg]%*sElapsed time: %u hours %u min %u sec %u ms%s\n", + cimg::t_red,1 + 2*pos,"",ehours,emin,esec,ems,cimg::t_normal); + else{ + std::fprintf(cimg::output(),"%s[CImg]%*sElapsed time: %u days %u hours %u min %u sec %u ms%s\n", + cimg::t_red,1 + 2*pos,"",edays,ehours,emin,esec,ems,cimg::t_normal); + } } } } + cimg::mutex(2,0); + return dt; } - cimg::mutex(2,0); - return dt; - } - // Return a temporary string describing the size of a memory buffer. - inline const char *strbuffersize(const cimg_ulong size) { - static CImg res(256); - cimg::mutex(5); - if (size<1024LU) cimg_snprintf(res,res._width,"%lu byte%s",(unsigned long)size,size>1?"s":""); - else if (size<1024*1024LU) { const float nsize = size/1024.f; cimg_snprintf(res,res._width,"%.1f Kio",nsize); } - else if (size<1024*1024*1024LU) { - const float nsize = size/(1024*1024.f); cimg_snprintf(res,res._width,"%.1f Mio",nsize); - } else { const float nsize = size/(1024*1024*1024.f); cimg_snprintf(res,res._width,"%.1f Gio",nsize); } - cimg::mutex(5,0); - return res; - } + // Return a temporary string describing the size of a memory buffer. + inline const char *strbuffersize(const cimg_ulong size) { + static CImg res(256); + cimg::mutex(5); + if (size<1024LU) cimg_snprintf(res,res._width,"%lu byte%s",(unsigned long)size,size>1?"s":""); + else if (size<1024*1024LU) { const float nsize = size/1024.f; cimg_snprintf(res,res._width,"%.1f Kio",nsize); } + else if (size<1024*1024*1024LU) { + const float nsize = size/(1024*1024.f); cimg_snprintf(res,res._width,"%.1f Mio",nsize); + } else { const float nsize = size/(1024*1024*1024.f); cimg_snprintf(res,res._width,"%.1f Gio",nsize); } + cimg::mutex(5,0); + return res; + } - //! Display a simple dialog box, and wait for the user's response. - /** - \param title Title of the dialog window. - \param msg Main message displayed inside the dialog window. - \param button1_label Label of the 1st button. - \param button2_label Label of the 2nd button (\c 0 to hide button). - \param button3_label Label of the 3rd button (\c 0 to hide button). - \param button4_label Label of the 4th button (\c 0 to hide button). - \param button5_label Label of the 5th button (\c 0 to hide button). - \param button6_label Label of the 6th button (\c 0 to hide button). - \param logo Image logo displayed at the left of the main message. - \param is_centered Tells if the dialog window must be centered on the screen. - \return Indice of clicked button (from \c 0 to \c 5), or \c -1 if the dialog window has been closed by the user. - \note - - Up to 6 buttons can be defined in the dialog window. - - The function returns when a user clicked one of the button or closed the dialog window. - - If a button text is set to 0, the corresponding button (and the followings) will not appear in the dialog box. - At least one button must be specified. - **/ - template - inline int dialog(const char *const title, const char *const msg, - const char *const button1_label, const char *const button2_label, - const char *const button3_label, const char *const button4_label, - const char *const button5_label, const char *const button6_label, - const CImg& logo, const bool is_centered=false) { + //! Display a simple dialog box, and wait for the user's response. + /** + \param title Title of the dialog window. + \param msg Main message displayed inside the dialog window. + \param button1_label Label of the 1st button. + \param button2_label Label of the 2nd button (\c 0 to hide button). + \param button3_label Label of the 3rd button (\c 0 to hide button). + \param button4_label Label of the 4th button (\c 0 to hide button). + \param button5_label Label of the 5th button (\c 0 to hide button). + \param button6_label Label of the 6th button (\c 0 to hide button). + \param logo Image logo displayed at the left of the main message. + \param is_centered Tells if the dialog window must be centered on the screen. + \return Index of clicked button (from \c 0 to \c 5), or \c -1 if the dialog window has been closed by the user. + \note + - Up to 6 buttons can be defined in the dialog window. + - The function returns when a user clicked one of the button or closed the dialog window. + - If a button text is set to 0, the corresponding button (and the following) will not appear in the dialog box. + At least one button must be specified. + **/ + template + inline int dialog(const char *const title, const char *const msg, + const char *const button1_label, const char *const button2_label, + const char *const button3_label, const char *const button4_label, + const char *const button5_label, const char *const button6_label, + const CImg& logo, const bool is_centered=false) { #if cimg_display==0 - cimg::unused(title,msg,button1_label,button2_label,button3_label,button4_label,button5_label,button6_label, - logo._data,is_centered); - throw CImgIOException("cimg::dialog(): No display available."); -#else - static const unsigned char - black[] = { 0,0,0 }, white[] = { 255,255,255 }, gray[] = { 200,200,200 }, gray2[] = { 150,150,150 }; - - // Create buttons and canvas graphics - CImgList buttons, cbuttons, sbuttons; - if (button1_label) { CImg().draw_text(0,0,button1_label,black,gray,1,13).move_to(buttons); - if (button2_label) { CImg().draw_text(0,0,button2_label,black,gray,1,13).move_to(buttons); - if (button3_label) { CImg().draw_text(0,0,button3_label,black,gray,1,13).move_to(buttons); - if (button4_label) { CImg().draw_text(0,0,button4_label,black,gray,1,13).move_to(buttons); - if (button5_label) { CImg().draw_text(0,0,button5_label,black,gray,1,13).move_to(buttons); - if (button6_label) { CImg().draw_text(0,0,button6_label,black,gray,1,13).move_to(buttons); - }}}}}} - if (!buttons._width) - throw CImgArgumentException("cimg::dialog(): No buttons have been defined."); - cimglist_for(buttons,l) buttons[l].resize(-100,-100,1,3); - - unsigned int bw = 0, bh = 0; - cimglist_for(buttons,l) { bw = std::max(bw,buttons[l]._width); bh = std::max(bh,buttons[l]._height); } - bw+=8; bh+=8; - if (bw<64) bw = 64; - if (bw>128) bw = 128; - if (bh<24) bh = 24; - if (bh>48) bh = 48; - - CImg button(bw,bh,1,3); - button.draw_rectangle(0,0,bw - 1,bh - 1,gray); - button.draw_line(0,0,bw - 1,0,white).draw_line(0,bh - 1,0,0,white); - button.draw_line(bw - 1,0,bw - 1,bh - 1,black).draw_line(bw - 1,bh - 1,0,bh - 1,black); - button.draw_line(1,bh - 2,bw - 2,bh - 2,gray2).draw_line(bw - 2,bh - 2,bw - 2,1,gray2); - CImg sbutton(bw,bh,1,3); - sbutton.draw_rectangle(0,0,bw - 1,bh - 1,gray); - sbutton.draw_line(0,0,bw - 1,0,black).draw_line(bw - 1,0,bw - 1,bh - 1,black); - sbutton.draw_line(bw - 1,bh - 1,0,bh - 1,black).draw_line(0,bh - 1,0,0,black); - sbutton.draw_line(1,1,bw - 2,1,white).draw_line(1,bh - 2,1,1,white); - sbutton.draw_line(bw - 2,1,bw - 2,bh - 2,black).draw_line(bw - 2,bh - 2,1,bh - 2,black); - sbutton.draw_line(2,bh - 3,bw - 3,bh - 3,gray2).draw_line(bw - 3,bh - 3,bw - 3,2,gray2); - sbutton.draw_line(4,4,bw - 5,4,black,1,0xAAAAAAAA,true).draw_line(bw - 5,4,bw - 5,bh - 5,black,1,0xAAAAAAAA,false); - sbutton.draw_line(bw - 5,bh - 5,4,bh - 5,black,1,0xAAAAAAAA,false).draw_line(4,bh - 5,4,4,black,1,0xAAAAAAAA,false); - CImg cbutton(bw,bh,1,3); - cbutton.draw_rectangle(0,0,bw - 1,bh - 1,black).draw_rectangle(1,1,bw - 2,bh - 2,gray2). - draw_rectangle(2,2,bw - 3,bh - 3,gray); - cbutton.draw_line(4,4,bw - 5,4,black,1,0xAAAAAAAA,true).draw_line(bw - 5,4,bw - 5,bh - 5,black,1,0xAAAAAAAA,false); - cbutton.draw_line(bw - 5,bh - 5,4,bh - 5,black,1,0xAAAAAAAA,false).draw_line(4,bh - 5,4,4,black,1,0xAAAAAAAA,false); - - cimglist_for(buttons,ll) { - CImg(cbutton). - draw_image(1 + (bw -buttons[ll].width())/2,1 + (bh - buttons[ll].height())/2,buttons[ll]). - move_to(cbuttons); - CImg(sbutton). - draw_image((bw - buttons[ll].width())/2,(bh - buttons[ll].height())/2,buttons[ll]). - move_to(sbuttons); - CImg(button). - draw_image((bw - buttons[ll].width())/2,(bh - buttons[ll].height())/2,buttons[ll]). - move_to(buttons[ll]); - } - - CImg canvas; - if (msg) - ((CImg().draw_text(0,0,"%s",gray,0,1,13,msg)*=-1)+=200).resize(-100,-100,1,3).move_to(canvas); - - const unsigned int - bwall = (buttons._width - 1)*(12 + bw) + bw, - w = cimg::max(196U,36 + logo._width + canvas._width,24 + bwall), - h = cimg::max(96U,36 + canvas._height + bh,36 + logo._height + bh), - lx = 12 + (canvas._data?0:((w - 24 - logo._width)/2)), - ly = (h - 12 - bh - logo._height)/2, - tx = lx + logo._width + 12, - ty = (h - 12 - bh - canvas._height)/2, - bx = (w - bwall)/2, - by = h - 12 - bh; - - if (canvas._data) - canvas = CImg(w,h,1,3). - draw_rectangle(0,0,w - 1,h - 1,gray). - draw_line(0,0,w - 1,0,white).draw_line(0,h - 1,0,0,white). - draw_line(w - 1,0,w - 1,h - 1,black).draw_line(w - 1,h - 1,0,h - 1,black). - draw_image(tx,ty,canvas); - else - canvas = CImg(w,h,1,3). - draw_rectangle(0,0,w - 1,h - 1,gray). - draw_line(0,0,w - 1,0,white).draw_line(0,h - 1,0,0,white). - draw_line(w - 1,0,w - 1,h - 1,black).draw_line(w - 1,h - 1,0,h - 1,black); - if (logo._data) canvas.draw_image(lx,ly,logo); - - unsigned int xbuttons[6] = { 0 }; - cimglist_for(buttons,lll) { xbuttons[lll] = bx + (bw + 12)*lll; canvas.draw_image(xbuttons[lll],by,buttons[lll]); } - - // Open window and enter events loop - CImgDisplay disp(canvas,title?title:" ",0,false,is_centered?true:false); - if (is_centered) disp.move((CImgDisplay::screen_width() - disp.width())/2, - (CImgDisplay::screen_height() - disp.height())/2); - bool stop_flag = false, refresh = false; - int oselected = -1, oclicked = -1, selected = -1, clicked = -1; - while (!disp.is_closed() && !stop_flag) { - if (refresh) { - if (clicked>=0) - CImg(canvas).draw_image(xbuttons[clicked],by,cbuttons[clicked]).display(disp); - else { - if (selected>=0) - CImg(canvas).draw_image(xbuttons[selected],by,sbuttons[selected]).display(disp); - else canvas.display(disp); - } - refresh = false; - } - disp.wait(15); - if (disp.is_resized()) disp.resize(disp,false); - - if (disp.button()&1) { - oclicked = clicked; - clicked = -1; - cimglist_for(buttons,l) - if (disp.mouse_y()>=(int)by && disp.mouse_y()<(int)(by + bh) && - disp.mouse_x()>=(int)xbuttons[l] && disp.mouse_x()<(int)(xbuttons[l] + bw)) { - clicked = selected = l; - refresh = true; - } - if (clicked!=oclicked) refresh = true; - } else if (clicked>=0) stop_flag = true; - - if (disp.key()) { - oselected = selected; - switch (disp.key()) { - case cimg::keyESC : selected = -1; stop_flag = true; break; - case cimg::keyENTER : if (selected<0) selected = 0; stop_flag = true; break; - case cimg::keyTAB : - case cimg::keyARROWRIGHT : - case cimg::keyARROWDOWN : selected = (selected + 1)%buttons.width(); break; - case cimg::keyARROWLEFT : - case cimg::keyARROWUP : selected = (selected + buttons.width() - 1)%buttons.width(); break; + cimg::unused(title,msg,button1_label,button2_label,button3_label,button4_label,button5_label,button6_label, + logo._data,is_centered); + throw CImgIOException("cimg::dialog(): No display available."); +#else + static const unsigned char + black[] = { 0,0,0 }, white[] = { 255,255,255 }, gray[] = { 200,200,200 }, gray2[] = { 150,150,150 }; + + // Create buttons and canvas graphics + CImgList buttons, cbuttons, sbuttons; + if (button1_label) { + CImg().draw_text(0,0,button1_label,black,gray,1,13).move_to(buttons); + if (button2_label) { + CImg().draw_text(0,0,button2_label,black,gray,1,13).move_to(buttons); + if (button3_label) { + CImg().draw_text(0,0,button3_label,black,gray,1,13).move_to(buttons); + if (button4_label) { + CImg().draw_text(0,0,button4_label,black,gray,1,13).move_to(buttons); + if (button5_label) { + CImg().draw_text(0,0,button5_label,black,gray,1,13).move_to(buttons); + if (button6_label) { + CImg().draw_text(0,0,button6_label,black,gray,1,13).move_to(buttons); + }}}}}} + if (!buttons._width) + throw CImgArgumentException("cimg::dialog(): No buttons have been defined."); + cimglist_for(buttons,l) buttons[l].resize(-100,-100,1,3); + + unsigned int bw = 0, bh = 0; + cimglist_for(buttons,l) { bw = std::max(bw,buttons[l]._width); bh = std::max(bh,buttons[l]._height); } + bw+=8; bh+=8; + if (bw<64) bw = 64; + if (bw>128) bw = 128; + if (bh<24) bh = 24; + if (bh>48) bh = 48; + + CImg button(bw,bh,1,3); + button.draw_rectangle(0,0,bw - 1,bh - 1,gray); + button.draw_line(0,0,bw - 1,0,white).draw_line(0,bh - 1,0,0,white); + button.draw_line(bw - 1,0,bw - 1,bh - 1,black).draw_line(bw - 1,bh - 1,0,bh - 1,black); + button.draw_line(1,bh - 2,bw - 2,bh - 2,gray2).draw_line(bw - 2,bh - 2,bw - 2,1,gray2); + CImg sbutton(bw,bh,1,3); + sbutton.draw_rectangle(0,0,bw - 1,bh - 1,gray); + sbutton.draw_line(0,0,bw - 1,0,black).draw_line(bw - 1,0,bw - 1,bh - 1,black); + sbutton.draw_line(bw - 1,bh - 1,0,bh - 1,black).draw_line(0,bh - 1,0,0,black); + sbutton.draw_line(1,1,bw - 2,1,white).draw_line(1,bh - 2,1,1,white); + sbutton.draw_line(bw - 2,1,bw - 2,bh - 2,black).draw_line(bw - 2,bh - 2,1,bh - 2,black); + sbutton.draw_line(2,bh - 3,bw - 3,bh - 3,gray2).draw_line(bw - 3,bh - 3,bw - 3,2,gray2); + sbutton.draw_line(4,4,bw - 5,4,black,1,0xAAAAAAAA,true). + draw_line(bw - 5,4,bw - 5,bh - 5,black,1,0xAAAAAAAA,false); + sbutton.draw_line(bw - 5,bh - 5,4,bh - 5,black,1,0xAAAAAAAA,false). + draw_line(4,bh - 5,4,4,black,1,0xAAAAAAAA,false); + CImg cbutton(bw,bh,1,3); + cbutton.draw_rectangle(0,0,bw - 1,bh - 1,black).draw_rectangle(1,1,bw - 2,bh - 2,gray2). + draw_rectangle(2,2,bw - 3,bh - 3,gray); + cbutton.draw_line(4,4,bw - 5,4,black,1,0xAAAAAAAA,true). + draw_line(bw - 5,4,bw - 5,bh - 5,black,1,0xAAAAAAAA,false); + cbutton.draw_line(bw - 5,bh - 5,4,bh - 5,black,1,0xAAAAAAAA,false). + draw_line(4,bh - 5,4,4,black,1,0xAAAAAAAA,false); + + cimglist_for(buttons,ll) { + CImg(cbutton). + draw_image(1 + (bw -buttons[ll].width())/2,1 + (bh - buttons[ll].height())/2,buttons[ll]). + move_to(cbuttons); + CImg(sbutton). + draw_image((bw - buttons[ll].width())/2,(bh - buttons[ll].height())/2,buttons[ll]). + move_to(sbuttons); + CImg(button). + draw_image((bw - buttons[ll].width())/2,(bh - buttons[ll].height())/2,buttons[ll]). + move_to(buttons[ll]); + } + + CImg canvas; + if (msg) + ((CImg().draw_text(0,0,"%s",gray,0,1,13,msg)*=-1)+=200).resize(-100,-100,1,3).move_to(canvas); + + const unsigned int + bwall = (buttons._width - 1)*(12 + bw) + bw, + w = cimg::max(196U,36 + logo._width + canvas._width,24 + bwall), + h = cimg::max(96U,36 + canvas._height + bh,36 + logo._height + bh), + lx = 12 + (canvas._data?0:((w - 24 - logo._width)/2)), + ly = (h - 12 - bh - logo._height)/2, + tx = lx + logo._width + 12, + ty = (h - 12 - bh - canvas._height)/2, + bx = (w - bwall)/2, + by = h - 12 - bh; + + if (canvas._data) + canvas = CImg(w,h,1,3). + draw_rectangle(0,0,w - 1,h - 1,gray). + draw_line(0,0,w - 1,0,white).draw_line(0,h - 1,0,0,white). + draw_line(w - 1,0,w - 1,h - 1,black).draw_line(w - 1,h - 1,0,h - 1,black). + draw_image(tx,ty,canvas); + else + canvas = CImg(w,h,1,3). + draw_rectangle(0,0,w - 1,h - 1,gray). + draw_line(0,0,w - 1,0,white).draw_line(0,h - 1,0,0,white). + draw_line(w - 1,0,w - 1,h - 1,black).draw_line(w - 1,h - 1,0,h - 1,black); + if (logo._data) canvas.draw_image(lx,ly,logo); + + unsigned int xbuttons[6] = { 0 }; + cimglist_for(buttons,lll) { + xbuttons[lll] = bx + (bw + 12)*lll; + canvas.draw_image(xbuttons[lll],by,buttons[lll]); + } + + // Open window and enter events loop + CImgDisplay disp(canvas,title?title:" ",0,false,is_centered?true:false); + if (is_centered) disp.move((CImgDisplay::screen_width() - disp.width())/2, + (CImgDisplay::screen_height() - disp.height())/2); + bool stop_flag = false, refresh = false; + int oselected = -1, oclicked = -1, selected = -1, clicked = -1; + while (!disp.is_closed() && !stop_flag) { + if (refresh) { + if (clicked>=0) + CImg(canvas).draw_image(xbuttons[clicked],by,cbuttons[clicked]).display(disp); + else { + if (selected>=0) + CImg(canvas).draw_image(xbuttons[selected],by,sbuttons[selected]).display(disp); + else canvas.display(disp); + } + refresh = false; + } + disp.wait(15); + if (disp.is_resized()) disp.resize(disp,false); + + if (disp.button()&1) { + oclicked = clicked; + clicked = -1; + cimglist_for(buttons,l) + if (disp.mouse_y()>=(int)by && disp.mouse_y()<(int)(by + bh) && + disp.mouse_x()>=(int)xbuttons[l] && disp.mouse_x()<(int)(xbuttons[l] + bw)) { + clicked = selected = l; + refresh = true; + } + if (clicked!=oclicked) refresh = true; + } else if (clicked>=0) stop_flag = true; + + if (disp.key()) { + oselected = selected; + switch (disp.key()) { + case cimg::keyESC : selected = -1; stop_flag = true; break; + case cimg::keyENTER : if (selected<0) selected = 0; stop_flag = true; break; + case cimg::keyTAB : + case cimg::keyARROWRIGHT : + case cimg::keyARROWDOWN : selected = (selected + 1)%buttons.width(); break; + case cimg::keyARROWLEFT : + case cimg::keyARROWUP : selected = (selected + buttons.width() - 1)%buttons.width(); break; + } + disp.set_key(); + if (selected!=oselected) refresh = true; } - disp.set_key(); - if (selected!=oselected) refresh = true; } - } - if (!disp) selected = -1; - return selected; + if (!disp) selected = -1; + return selected; #endif - } - - //! Display a simple dialog box, and wait for the user's response \specialization. - inline int dialog(const char *const title, const char *const msg, - const char *const button1_label, const char *const button2_label, const char *const button3_label, - const char *const button4_label, const char *const button5_label, const char *const button6_label, - const bool is_centered) { - return dialog(title,msg,button1_label,button2_label,button3_label,button4_label,button5_label,button6_label, - CImg::_logo40x38(),is_centered); - } + } - //! Evaluate math expression. - /** - \param expression C-string describing the formula to evaluate. - \param x Value of the pre-defined variable \c x. - \param y Value of the pre-defined variable \c y. - \param z Value of the pre-defined variable \c z. - \param c Value of the pre-defined variable \c c. - \return Result of the formula evaluation. - \note Set \c expression to \c 0 to keep evaluating the last specified \c expression. - \par Example - \code - const double - res1 = cimg::eval("cos(x)^2 + sin(y)^2",2,2), // will return '1' - res2 = cimg::eval(0,1,1); // will return '1' too - \endcode - **/ - inline double eval(const char *const expression, const double x, const double y, const double z, const double c) { - static const CImg empty; - return empty.eval(expression,x,y,z,c); - } + //! Display a simple dialog box, and wait for the user's response \specialization. + inline int dialog(const char *const title, const char *const msg, + const char *const button1_label, const char *const button2_label, + const char *const button3_label, const char *const button4_label, + const char *const button5_label, const char *const button6_label, + const bool is_centered) { + return dialog(title,msg,button1_label,button2_label,button3_label,button4_label,button5_label,button6_label, + CImg::_logo40x38(),is_centered); + } - template - inline CImg::type> eval(const char *const expression, const CImg& xyzc) { - static const CImg empty; - return empty.eval(expression,xyzc); - } + //! Evaluate math expression. + /** + \param expression C-string describing the formula to evaluate. + \param x Value of the pre-defined variable \c x. + \param y Value of the pre-defined variable \c y. + \param z Value of the pre-defined variable \c z. + \param c Value of the pre-defined variable \c c. + \return Result of the formula evaluation. + \note Set \c expression to \c 0 to keep evaluating the last specified \c expression. + \par Example + \code + const double + res1 = cimg::eval("cos(x)^2 + sin(y)^2",2,2), // will return '1' + res2 = cimg::eval(0,1,1); // will return '1' too + \endcode + **/ + inline double eval(const char *const expression, const double x, const double y, const double z, const double c) { + static const CImg empty; + return empty.eval(expression,x,y,z,c); + } - // End of cimg:: namespace -} + template + inline CImg::type> eval(const char *const expression, const CImg& xyzc) { + static const CImg empty; + return empty.eval(expression,xyzc); + } - // End of cimg_library:: namespace -} + } // namespace cimg { ... +} // namespace cimg_library { ... //! Short alias name. namespace cil = cimg_library_suffixed; @@ -62122,6 +64309,12 @@ #ifdef _cimg_redefine_True #define True 1 #endif +#ifdef _cimg_redefine_Status +#define Status int +#endif +#ifdef _cimg_redefine_Success +#define Success 0 +#endif #ifdef _cimg_redefine_min #define min(a,b) (((a)<(b))?(a):(b)) #endif @@ -62136,6 +64329,7 @@ #endif #endif + // Local Variables: // mode: c++ // End: diff -Nru gmic-2.4.5/src/gmic_cli.cpp gmic-2.9.2/src/gmic_cli.cpp --- gmic-2.4.5/src/gmic_cli.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/src/gmic_cli.cpp 2020-09-03 11:37:06.000000000 +0000 @@ -6,7 +6,7 @@ # Description : G'MIC CLI interface - A command-line tool to allow the use # of G'MIC commands from the shell. # - # Copyright : David Tschumperle + # Copyright : David Tschumperlé # ( http://tschumperle.users.greyc.fr/ ) # # Licenses : This file is 'dual-licensed', you have to choose one @@ -14,17 +14,17 @@ # # CeCILL-C # The CeCILL-C license is close to the GNU LGPL. - # ( http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html ) + # ( http://cecill.info/licences/Licence_CeCILL-C_V1-en.html ) # # or CeCILL v2.1 # The CeCILL license is compatible with the GNU GPL. - # ( http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html ) + # ( http://cecill.info/licences/Licence_CeCILL_V2.1-en.html ) # # This software is governed either by the CeCILL or the CeCILL-C license # under French law and abiding by the rules of distribution of free software. # You can use, modify and or redistribute the software under the terms of # the CeCILL or CeCILL-C licenses as circulated by CEA, CNRS and INRIA - # at the following URL: "http://www.cecill.info". + # at the following URL: "http://cecill.info". # # As a counterpart to the access to the source code and rights to copy, # modify and redistribute granted by the license, users are provided only @@ -58,7 +58,7 @@ cimg::mutex(29); std::fprintf(cimg::output(), "\n\n%s[gmic] G'MIC encountered a %sfatal error%s%s. " - "Please submit a bug report, at: %shttps://framagit.org/dtschump/gmic/issues%s\n\n", + "Please submit a bug report, at: %shttps://github.com/dtschump/gmic/issues%s\n\n", cimg::t_red,cimg::t_bold,cimg::t_normal,cimg::t_red, cimg::t_bold,cimg::t_normal); std::fflush(cimg::output()); @@ -89,7 +89,7 @@ sigaction(SIGSEGV,&sa,0); #endif - // Create resources directory. + // Init resources folder. if (!gmic::init_rc()) { std::fprintf(cimg::output(), "\n[gmic] Unable to create resources folder.\n"); @@ -109,138 +109,78 @@ // Load startup command files. CImg commands_user, commands_update, filename_update; - bool is_invalid_user = false, is_invalid_update = false; + bool is_invalid_userfile = false, is_invalid_updatefile = false; char sep = 0; - gmic_instance.verbosity = -1; - // Update file (in resources directory). + // Import update file (from resources directory). filename_update.assign(1024); cimg_snprintf(filename_update,filename_update.width(),"%supdate%u.gmic", gmic::path_rc(),gmic_version); - try { - try { - commands_update.load_cimg(filename_update); - } catch (...) { - commands_update.load_raw(filename_update); - } - commands_update.append(CImg::vector(0),'y'); - try { gmic_instance.add_commands(commands_update); - } catch (...) { is_invalid_update = true; throw; } - } catch (...) { commands_update.assign(); } - if (commands_update && (cimg_sscanf(commands_update," #@gmi%c",&sep)!=1 || sep!='c')) - commands_update.assign(); // Discard invalid update file + try { commands_update.load_cimg(filename_update); } + catch (...) { + try { commands_update.load_raw(filename_update); } + catch (...) { } + } + if (commands_update) try { + commands_update.unroll('y').append(CImg::vector(0),'y'); + gmic_instance.add_commands(commands_update); + } catch (...) { is_invalid_updatefile = true; } + is_invalid_updatefile|=commands_update && (cimg_sscanf(commands_update," #@gmi%c",&sep)!=1 || sep!='c'); + commands_update.assign(); - // User file (in parent of resources directory). + // Import user file (in parent of resources directory). const char *const filename_user = gmic::path_user(); - try { - commands_user.load_raw(filename_user).append(CImg::vector(0),'y'); - try { gmic_instance.add_commands(commands_user,filename_user); } - catch (...) { is_invalid_user = true; throw; } - } catch (...) { commands_user.assign(); } - - // When help has been requested. - const char - *const is_help1 = cimg_option("--h",(char*)0,0), - *const is_help2 = cimg_option("-h",(char*)0,0), - *const is_help3 = cimg_option("h",(char*)0,0), - *const is_help4 = cimg_option("--help",(char*)0,0), - *const is_help5 = cimg_option("-help",(char*)0,0), - *const is_help6 = cimg_option("help",(char*)0,0), - *const help_command = is_help1?"--h":is_help2?"-h":is_help3?"h":is_help4?"--help":is_help5?"-help":"help", - *const help_argument = is_help1?is_help1:is_help2?is_help2:is_help3?is_help3: - is_help4?is_help4:is_help5?is_help5:is_help6; - const bool - is_help = is_help1 || is_help2 || is_help3 || is_help4 || is_help5 || is_help6, - is_global_help = is_help && !std::strcmp(help_command,help_argument); - - if (is_help) { - - // Load specified commands definitions data (eventually). - CImgList images; - CImgList images_names; - if (!is_global_help && commands_user) commands_user.move_to(images); - if (commands_update) images.insert(commands_update); - if (!is_global_help || !commands_update) images.insert(gmic::stdlib); - commands_update.assign(); - - for (int i = 1; i filename_tmp(256); *filename_tmp = 0; - if ((!std::strcmp("-m",argv[i]) || !std::strcmp("m",argv[i]) || - !std::strcmp("-command",argv[i]) || !std::strcmp("command",argv[i])) && i::get_load_cimg(file).move_to(images,0); - } catch (CImgIOException&) { - CImg::get_load_raw(file).move_to(images,0); - } - if (images.size()!=n) CImg::vector('\n').move_to(images,1); - cimg::fclose(file); - if (*filename_tmp) std::remove(filename_tmp); - } - } - - cimg::output(stdout); - if (is_global_help) { // Global help - try { - gmic_instance.verbosity = -1; - gmic_instance.run("v - l help \"\" onfail endl q",images,images_names); - } catch (...) { // Fallback in case default version of 'help' has been overloaded - images.assign(); - images_names.assign(); - images.insert(gmic::stdlib); - gmic("v - _host=cli l help \"\" onfail endl q",images,images_names); - } - } else { // Help for a specified command - CImg tmp_line(1024); - try { - cimg_snprintf(tmp_line,tmp_line.width(),"v - l help \"%s\",1 onfail endl q",help_argument); - gmic_instance.verbosity = -1; - gmic_instance.run(tmp_line,images,images_names); - } catch (...) { // Fallback in case default version of 'help' has been overloaded - cimg_snprintf(tmp_line,tmp_line.width(),"v - l help \"%s\",1 onfail endl q",help_argument); - images.assign(); - images_names.assign(); - images.insert(gmic::stdlib); - gmic(tmp_line,images,images_names); - } - } - - std::exit(0); - } + try { commands_user.load_raw(filename_user); } + catch (...) {} + if (commands_user) try { + commands_user.append(CImg::vector(0),'y'); + gmic_instance.add_commands(commands_user,filename_user); + } catch (...) { is_invalid_userfile = true; } + commands_user.assign(); // Convert 'argv' into G'MIC command line. - commands_user.assign(); commands_update.assign(); - CImgList items; - if (argc==1) { // When no args have been specified - gmic_instance.verbosity = -1; + if (argc==1) // When no args have been specified CImg::string("l[] cli_noarg onfail endl").move_to(items); - } else { - gmic_instance.verbosity = 0; + else { for (int l = 1; l::vector('\"').move_to(items); CImg(argv[l],(unsigned int)std::strlen(argv[l])).move_to(items); CImg::string("\"").move_to(items); } else CImg::string(argv[l]).move_to(items); - if (l::string("cli_start ",false),is_first_item_verbose?2:0); - if (is_invalid_user) { // Display warning message in case of invalid user command file + if (is_invalid_userfile) { // Display warning message in case of invalid user command file CImg tmpstr(1024); - cimg_snprintf(tmpstr,tmpstr.width(),"warn \"File '%s' is not a valid G'MIC command file.\" ", + cimg_snprintf(tmpstr,tmpstr.width(),"warn \"File '\"{/\"%s\"}\"' is not a valid G'MIC command file.\" ", filename_user); items.insert(CImg::string(tmpstr.data(),false),is_first_item_verbose?2:0); } - if (is_invalid_update) { // Display warning message in case of invalid user command file + if (is_invalid_updatefile) { // Display warning message in case of invalid user command file CImg tmpstr(1024); - cimg_snprintf(tmpstr,tmpstr.width(),"warn \"File '%s' is not a valid G'MIC command file.\" ", + cimg_snprintf(tmpstr,tmpstr.width(),"warn \"File '\"{/\"%s\"}\"' is not a valid G'MIC update file.\" ", filename_update.data()); items.insert(CImg::string(tmpstr.data(),false),is_first_item_verbose?2:0); } - const CImg commands_line(items>'x'); + CImg commands_line(items>'x'); + commands_line.back() = 0; items.assign(); // Launch G'MIC interpreter. @@ -271,41 +212,53 @@ CImgList images_names; gmic_instance.run(commands_line.data(),images,images_names); } catch (gmic_exception &e) { + int error_code; + bool is_error_code = false; - // Something went wrong during the pipeline execution. - if (gmic_instance.verbosity<0) { - std::fprintf(cimg::output(),"\n[gmic] %s%s%s%s", - cimg::t_red,cimg::t_bold, - e.what(),cimg::t_normal); - std::fflush(cimg::output()); - } - if (*e.command_help()) { - std::fprintf(cimg::output(),"\n[gmic] Command '%s' has the following description: \n", - e.command_help()); - std::fflush(cimg::output()); - CImgList images; - CImgList images_names; - images.insert(gmic::stdlib); - CImg tmp_line(1024); - cimg_snprintf(tmp_line,tmp_line.width(), - "v - " - "l[] i raw:\"%s\",char m \"%s\" onfail rm endl " - "l[] i raw:\"%s\",char m \"%s\" onfail rm endl " - "rv help \"%s\",0 q", - filename_update.data(),filename_update.data(), - filename_user,filename_user, - e.command_help()); - try { - gmic(tmp_line,images,images_names); - } catch (...) { - cimg_snprintf(tmp_line,tmp_line.width(),"v - help \"%s\",1 q",e.command_help()); - images.assign(); - images_names.assign(); + const char + *const it1 = std::strstr(gmic_instance.status,"***"), + *const it2 = it1?std::strstr(it1 + 3,"***"):0; + if (it2 && std::sscanf(it2,"*** %d%c",&error_code,&sep)!=1) error_code = -1; + else is_error_code = true; + + if (!is_error_code) { + + // Something went wrong during the pipeline execution. + if (gmic_instance.verbosity<=0) { + std::fprintf(cimg::output(),"\n[gmic] %s%s%s%s", + cimg::t_red,cimg::t_bold, + e.what(),cimg::t_normal); + std::fflush(cimg::output()); + } + if (*e.command()) { + std::fprintf(cimg::output(),"\n[gmic] Command '%s' has the following description: \n", + e.command()); + std::fflush(cimg::output()); + CImgList images; + CImgList images_names; images.insert(gmic::stdlib); - gmic(tmp_line,images,images_names); + CImg tmp_line(1024); + cimg_snprintf(tmp_line,tmp_line.width(), + "l[] i raw:\"%s\",char m \"%s\" onfail rm endl " + "l[] i raw:\"%s\",char m \"%s\" onfail rm endl " + "rv help \"%s\",0", + filename_update.data(),filename_update.data(), + filename_user,filename_user, + e.command()); + try { + gmic(tmp_line,images,images_names); + } catch (...) { // Fallback in case overloaded version of 'help' crashed + cimg_snprintf(tmp_line,tmp_line.width(),"help \"%s\",1",e.command()); + images.assign().insert(gmic::stdlib); + images_names.assign(); + gmic(tmp_line,images,images_names); + } + } else { + std::fprintf(cimg::output(),"\n\n"); + std::fflush(cimg::output()); } - } else { std::fprintf(cimg::output(),"\n\n"); std::fflush(cimg::output()); } - return -1; + } + return error_code; } return 0; } diff -Nru gmic-2.4.5/src/gmic.cpp gmic-2.9.2/src/gmic.cpp --- gmic-2.4.5/src/gmic.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/src/gmic.cpp 2020-09-03 11:37:06.000000000 +0000 @@ -6,7 +6,7 @@ # Description : GREYC's Magic for Image Computing - G'MIC core # ( https://gmic.eu ) # - # Copyright : David Tschumperle + # Copyright : David Tschumperlé # ( https://tschumperle.users.greyc.fr/ ) # # Licenses : This file is 'dual-licensed', you have to choose one @@ -14,17 +14,17 @@ # # CeCILL-C # The CeCILL-C license is close to the GNU LGPL. - # ( http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html ) + # ( http://cecill.info/licences/Licence_CeCILL-C_V1-en.html ) # # or CeCILL v2.1 # The CeCILL license is compatible with the GNU GPL. - # ( http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html ) + # ( http://cecill.info/licences/Licence_CeCILL_V2.1-en.html ) # # This software is governed either by the CeCILL or the CeCILL-C license # under French law and abiding by the rules of distribution of free software. # You can use, modify and or redistribute the software under the terms of # the CeCILL or CeCILL-C licenses as circulated by CEA, CNRS and INRIA - # at the following URL: "http://www.cecill.info". + # at the following URL: "http://cecill.info". # # As a counterpart to the access to the source code and rights to copy, # modify and redistribute granted by the license, users are provided only @@ -48,9 +48,22 @@ # */ -// Add G'MIC-specific methods to the CImg library. -//------------------------------------------------ -#ifdef cimg_plugin +// Add G'MIC-specific methods to the CImg class of the CImg library. +//---------------------------------------------------------------------- +#if defined(cimg_plugin) + +template +static CImg copy_rounded(const CImg& img) { + if (!cimg::type::is_float() || cimg::type::is_float()) return img; + CImg res(img._width,img._height,img._depth,img._spectrum); + const t *ptrs = img._data; + cimg_for(res,ptrd,T) *ptrd = (T)cimg::round(*(ptrs++)); + return res; +} + +static CImg copy_rounded(const CImg& img) { + return CImg(img,true); +} static const char *storage_type(const CImgList& images) { T im = cimg::type::max(), iM = cimg::type::min(); @@ -81,7 +94,7 @@ if (!images) return CImg(); if (images.size()==1) return +images[0]; CImg error_message(1024); - unsigned int nbv = 0, nbp = 0; + unsigned int g_nbv = 0, g_nbp = 0; ulongT siz = 0; cimglist_for(images,l) { const CImg& img = images[l]; @@ -91,8 +104,8 @@ l,img._width,img._height,img._depth,img._spectrum,img._data, error_message.data()); siz+=img.size() - 8; - nbv+=cimg::float2uint((float)img[6]); - nbp+=cimg::float2uint((float)img[7]); + g_nbv+=cimg::float2uint((float)img[6]); + g_nbp+=cimg::float2uint((float)img[7]); } CImg res(1,siz + 8); @@ -101,8 +114,8 @@ *(ptrd++) = (T)('C' + 0.5f); *(ptrd++) = (T)('I' + 0.5f); // Create object header *(ptrd++) = (T)('m' + 0.5f); *(ptrd++) = (T)('g' + 0.5f); *(ptrd++) = (T)('3' + 0.5f); *(ptrd++) = (T)('d' + 0.5f); - *(ptrd++) = (T)cimg::uint2float(nbv); - *(ptrd++) = (T)cimg::uint2float(nbp); + *(ptrd++) = (T)cimg::uint2float(g_nbv); + *(ptrd++) = (T)cimg::uint2float(g_nbp); cimglist_for(images,l) { // Merge object points const CImg& img = images[l]; const unsigned int nbv = cimg::float2uint((float)img[6]); @@ -239,50 +252,27 @@ } CImg get_copymark() const { - if (is_empty()) return CImg::string("~"); - CImg res = get_resize(_width + 1,1,1,1,0); - const char *const ext = cimg::split_filename(_data); - if (*ext) { - const int l = (int)(ext - _data - 1); - if (l>0) { - if (_data[l - 1]=='~') return +*this; - std::memcpy(res._data,_data,l); - } - res[l] = '~'; res[l + 1] = '.'; - std::memcpy(res._data + l + 2,ext,_data + _width - ext); - } else { - const int l = (int)(ext - _data); - if (_data[l - 1]=='~' || (l>1 && _data[l - 1]==']' && _data[l - 2]=='~')) return +*this; - std::memcpy(res._data,_data,l); - res[l] = '~'; - if (ext>_data && *(ext - 1)==']') cimg::swap(res[l],res[l - 1]); - std::memcpy(res._data + l + 1,ext,_data + _width - ext); - } + if (is_empty() || !*_data) return CImg::string("_c1"); + const char *pe = _data + _width - 1, *ext = cimg::split_filename(_data); + if (*ext) pe = --ext; + unsigned int num = 0, fact = 1, baselength = _width; + if (pe>_data+2) { // Try to find ending number if any + const char *npe = pe - 1; + while (npe>_data && *npe>='0' && *npe<='9') { num+=fact*(*(npe--) - '0'); fact*=10; } + if (npe>_data && npe!=pe - 1 && *(npe-1)=='_' && *npe=='c' && npe[1]!='0') { + pe = npe - 1; + baselength = pe + _width - ext; + } + else num = 0; + } + ++num; + const unsigned int ndigits = (unsigned int)std::max(1.,std::ceil(std::log10(num + 1.))); + CImg res(baselength + ndigits + 2); + std::memcpy(res,_data,pe - _data); + std::sprintf(res._data + (pe - _data),"_c%u%s",num,ext); return res; } -template -CImg get_draw_axes(const float x0, const float x1, const float y0, const float y1, - const tc *const color, const float opacity=1, - const int subdivisionx=-60, const int subdivisiony=-60, - const float precisionx=0, const float precisiony=0, - const unsigned int patternx=~0U, const unsigned int patterny=~0U, - const unsigned int font_height=13) const { - return (+*this).draw_axes(x0,x1,y0,y1,color,opacity,subdivisionx,subdivisiony, - precisionx,precisiony,patternx,patterny,font_height); -} - -CImg get_draw_circle(const int x, const int y, const int r, const T *const col, - const float opacity) const { - return (+*this).draw_circle(x,y,r,col,opacity); -} - -CImg get_draw_circle(const int x, const int y, const int r, const T *const col, - const float opacity, - const unsigned int pattern) const { - return (+*this).draw_circle(x,y,r,col,opacity,pattern); -} - CImg get_draw_ellipse(const int x, const int y, const float r0, const float r1, const float angle, const T *const col, const float opacity) const { return (+*this).draw_ellipse(x,y,r0,r1,angle,col,opacity); @@ -302,32 +292,51 @@ template CImg get_draw_graph(const CImg& data, - const tc *const color, const float opacity=1, - const unsigned int plot_type=1, const int vertex_type=1, - const double ymin=0, const double ymax=0, - const unsigned int pattern=~0U) const { + const tc *const color, const float opacity, + const unsigned int plot_type, const int vertex_type, + const double ymin, const double ymax, + const unsigned int pattern) const { return (+*this).draw_graph(data,color,opacity,plot_type,vertex_type,ymin,ymax,pattern); } -template -CImg get_draw_grid(const float sizex, const float sizey, - const float offsetx, const float offsety, - const bool invertx, const bool inverty, - const tc *const color, const float opacity=1, - const unsigned int patternx=~0U, const unsigned int patterny=~0U) { - return (+*this).draw_grid(sizex,sizey,offsetx,offsety,invertx,inverty,color,opacity, - patternx,patterny); -} - -CImg get_draw_image(const int x, const int y, const int z, const int c, - const CImg& sprite, const CImg& mask, const float opacity, - const float max_opacity_mask) const { - return (+*this).draw_image(x,y,z,c,sprite,mask,opacity,max_opacity_mask); -} - -CImg get_draw_image(const int x, const int y, const int z, const int c, - const CImg& sprite, const float opacity) const { - return (+*this).draw_image(x,y,z,c,sprite,opacity); +CImg& gmic_draw_image(const float x, const float y, const float z, const float c, + const char sepx, const char sepy, const char sepz, const char sepc, + const CImg& sprite, const CImg& mask, const float opacity, + const float max_opacity_mask) { + const float + fx = sepx=='~'?x*(width() - sprite.width()):sepx=='%'?x*(width() - 1)/100:x, + fy = sepy=='~'?y*(height() - sprite.height()):sepy=='%'?y*(height() - 1)/100:y, + fz = sepz=='~'?y*(depth() - sprite.depth()):sepz=='%'?z*(depth() - 1)/100:z, + fc = sepc=='~'?c*(spectrum() - sprite.spectrum()):sepc=='%'?c*(spectrum() - 1)/100:c; + return draw_image((int)cimg::round(fx),(int)cimg::round(fy), + (int)cimg::round(fz),(int)cimg::round(fc), + sprite,mask,opacity,max_opacity_mask); +} + +CImg get_gmic_draw_image(const float x, const float y, const float z, const float c, + const char sepx, const char sepy, const char sepz, const char sepc, + const CImg& sprite, const CImg& mask, const float opacity, + const float max_opacity_mask) const { + return (+*this).gmic_draw_image(x,y,z,c,sepx,sepy,sepz,sepc,sprite,mask,opacity,max_opacity_mask); +} + +CImg& gmic_draw_image(const float x, const float y, const float z, const float c, + const char sepx, const char sepy, const char sepz, const char sepc, + const CImg& sprite, const float opacity) { + const float + fx = sepx=='~'?x*(width() - sprite.width()):sepx=='%'?x*(width() - 1)/100:x, + fy = sepy=='~'?y*(height() - sprite.height()):sepy=='%'?y*(height() - 1)/100:y, + fz = sepz=='~'?y*(depth() - sprite.depth()):sepz=='%'?z*(depth() - 1)/100:z, + fc = sepc=='~'?c*(spectrum() - sprite.spectrum()):sepc=='%'?c*(spectrum() - 1)/100:c; + return draw_image((int)cimg::round(fx),(int)cimg::round(fy), + (int)cimg::round(fz),(int)cimg::round(fc), + sprite,opacity); +} + +CImg get_gmic_draw_image(const float x, const float y, const float z, const float c, + const char sepx, const char sepy, const char sepz, const char sepc, + const CImg& sprite, const float opacity) const { + return (+*this).gmic_draw_image(x,y,z,c,sepx,sepy,sepz,sepc,sprite,opacity); } CImg get_draw_line(const int x0, const int y0, const int x1, const int y1, const T *const col, @@ -458,23 +467,39 @@ return (+*this).gmic_discard(values,axes); } -CImg& gmic_draw_text(const int x, const int y, +CImg& gmic_draw_text(const float x, const float y, + const char sepx, const char sepy, const char *const text, const T *const col, const int bg, const float opacity, const unsigned int siz, const unsigned int nb_cols) { + float fx = 0, fy = 0; if (is_empty()) { const T one[] = { (T)1 }; - assign().draw_text(x,y,"%s",one,0,opacity,siz,text).resize(-100,-100,1,nb_cols); + fx = sepx=='%' || sepx=='~'?0:x; + fy = sepy=='%' || sepy=='~'?0:y; + draw_text((int)cimg::round(fx),(int)cimg::round(fy),"%s",one,0,opacity,siz,text).resize(-100,-100,1,nb_cols); cimg_forC(*this,c) get_shared_channel(c)*=col[c]; - } else draw_text(x,y,"%s",col,bg,opacity,siz,text); - return *this; + return *this; + } + if (sepx=='~' || sepy=='~') { + const char one[] = { 1 }; + CImg foo; + foo.draw_text(0,0,"%s",one,0,1,siz,text); + fx = sepx=='~'?x*(width() - foo.width()):sepx=='%'?x*(width() - 1)/100:x; + fy = sepy=='~'?y*(height() - foo.height()):sepy=='%'?y*(height() - 1)/100:y; + } else { + fx = sepx=='%'?x*(width() - 1)/100:x; + fy = sepy=='%'?y*(height() - 1)/100:y; + } + return draw_text((int)cimg::round(fx),(int)cimg::round(fy),"%s",col,bg,opacity,siz,text); } -CImg get_gmic_draw_text(const int x, const int y, +CImg get_gmic_draw_text(const float x, const float y, + const char sepx, const char sepy, const char *const text, const T *const col, const int bg, const float opacity, const unsigned int siz, const unsigned int nb_cols) const { - return (+*this).gmic_draw_text(x,y,text,col,bg,opacity,siz,nb_cols); + return (+*this).gmic_draw_text(x,y,sepx,sepy,text,col,bg,opacity,siz,nb_cols); } CImg& gmic_invert_endianness(const char *const stype) { @@ -511,11 +536,11 @@ const unsigned int patch_depth, const unsigned int nb_iterations, const unsigned int nb_randoms, - const float occ_penalization, + const float patch_penalization, const bool is_score, const CImg *const initialization) { return get_gmic_matchpatch(patch_image,patch_width,patch_height,patch_depth, - nb_iterations,nb_randoms,occ_penalization,is_score,initialization).move_to(*this); + nb_iterations,nb_randoms,patch_penalization,is_score,initialization).move_to(*this); } CImg get_gmic_matchpatch(const CImg& patch_image, @@ -524,12 +549,12 @@ const unsigned int patch_depth, const unsigned int nb_iterations, const unsigned int nb_randoms, - const float occ_penalization, + const float patch_penalization, const bool is_score, const CImg *const initialization) const { CImg score, res; res = _matchpatch(patch_image,patch_width,patch_height,patch_depth, - nb_iterations,nb_randoms,occ_penalization, + nb_iterations,nb_randoms,patch_penalization, initialization?*initialization:CImg::const_empty(), is_score,is_score?score:CImg::empty()); const unsigned int s = res._spectrum; @@ -564,7 +589,7 @@ cimg_foroff(*this,off) { std::fprintf(cimg::output(),cimg::type::format_s(),cimg::type::format(_data[off])); if (off!=siz1) std::fprintf(cimg::output(),"%s", - off%whd==whd1?"^": + off%whd==whd1?" ^ ": off%wh==wh1?"\\": off%_width==w1?";":","); if (off==11 && siz>24) { off = siz1 - 12; std::fprintf(cimg::output(),"(...),"); } @@ -649,10 +674,7 @@ } break; case 2 : // Periodic cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if_size(res.size(),4096)) - cimg_forXYZC(res,x,y,z,c) res(x,y,z,c) = _linear_atXYZC(cimg::mod(x - delta_x,(float)_width), - cimg::mod(y - delta_y,(float)_height), - cimg::mod(z - delta_z,(float)_depth), - cimg::mod(c - delta_c,(float)_spectrum)); + cimg_forXYZC(res,x,y,z,c) res(x,y,z,c) = _linear_atXYZC_p(x - delta_x,y - delta_y,z - delta_z,c - delta_c); break; case 1 : // Neumann cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if_size(res.size(),4096)) @@ -679,9 +701,7 @@ } break; case 2 : // Periodic cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if_size(res.size(),4096)) - cimg_forC(res,c) cimg_forXYZ(res,x,y,z) res(x,y,z,c) = _linear_atXYZ(cimg::mod(x - delta_x,(float)_width), - cimg::mod(y - delta_y,(float)_height), - cimg::mod(z - delta_z,(float)_depth),c); + cimg_forC(res,c) cimg_forXYZ(res,x,y,z) res(x,y,z,c) = _linear_atXYZ_p(x - delta_x,y - delta_y,z - delta_z,c); break; case 1 : // Neumann cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if_size(res.size(),4096)) @@ -706,8 +726,7 @@ } break; case 2 : // Periodic cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if_size(res.size(),4096)) - cimg_forZC(res,z,c) cimg_forXY(res,x,y) res(x,y,z,c) = _linear_atXY(cimg::mod(x - delta_x,(float)_width), - cimg::mod(y - delta_y,(float)_height),z,c); + cimg_forZC(res,z,c) cimg_forXY(res,x,y) res(x,y,z,c) = _linear_atXY_p(x - delta_x,y - delta_y,z,c); break; case 1 : // Neumann cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if_size(res.size(),4096)) @@ -729,7 +748,7 @@ } break; case 2 : // Periodic cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if_size(res.size(),4096)) - cimg_forYZC(res,y,z,c) cimg_forX(res,x) res(x,y,z,c) = _linear_atX(cimg::mod(x - delta_x,(float)_width),y,z,c); + cimg_forYZC(res,y,z,c) cimg_forX(res,x) res(x,y,z,c) = _linear_atX_p(x - delta_x,y,z,c); break; case 1 : // Neumann cimg_pragma_openmp(parallel for cimg_openmp_collapse(3) cimg_openmp_if_size(res.size(),4096)) @@ -1054,8 +1073,10 @@ // Construct normalized version of the mask. CImg nmask(dx,dy); - unsigned char *ptrM = nmask.data(); - cimg_for_inXY(mask,xm0,ym0,xm1,ym1,x,y) *(ptrM++) = mask(x,y)?0U:1U; + { + unsigned char *ptrM = nmask.data(); + cimg_for_inXY(mask,xm0,ym0,xm1,ym1,x,y) *(ptrM++) = mask(x,y)?0U:1U; + } xm0 = ym0 = 0; xm1 = dx - 1; ym1 = dy - 1; // Start patch filling algorithm. @@ -1151,21 +1172,23 @@ // Locate already reconstructed neighbors (if any), to get good origins for patch lookup. CImg lookup_candidates(2,256); unsigned int nb_lookup_candidates = 0, *ptr_lookup_candidates = lookup_candidates.data(); - const unsigned int *ptr_saved_patches = saved_patches.data(); - const int - x0 = target_x - (int)patch_size, y0 = target_y - (int)patch_size, - x1 = target_x + (int)patch_size, y1 = target_y + (int)patch_size; - for (unsigned int k = 0; k=x0 && (int)dest_y>=y0 && (int)dest_x<=x1 && (int)dest_y<=y1) { - const int off_x = target_x - (int)dest_x, off_y = target_y - (int)dest_y; - *(ptr_lookup_candidates++) = src_x + off_x; - *(ptr_lookup_candidates++) = src_y + off_y; - if (++nb_lookup_candidates>=lookup_candidates._height) { - lookup_candidates.resize(2,-200,1,1,0); - ptr_lookup_candidates = lookup_candidates.data(0,nb_lookup_candidates); + { + const unsigned int *ptr_saved_patches = saved_patches.data(); + const int + x0 = target_x - (int)patch_size, y0 = target_y - (int)patch_size, + x1 = target_x + (int)patch_size, y1 = target_y + (int)patch_size; + for (unsigned int k = 0; k=x0 && (int)dest_y>=y0 && (int)dest_x<=x1 && (int)dest_y<=y1) { + const int off_x = target_x - (int)dest_x, off_y = target_y - (int)dest_y; + *(ptr_lookup_candidates++) = src_x + off_x; + *(ptr_lookup_candidates++) = src_y + off_y; + if (++nb_lookup_candidates>=lookup_candidates._height) { + lookup_candidates.resize(2,-200,1,1,0); + ptr_lookup_candidates = lookup_candidates.data(0,nb_lookup_candidates); + } } } } @@ -1219,10 +1242,10 @@ const int xl = (int)lookup_candidates(0,C), yl = (int)lookup_candidates(1,C), - x0 = std::max(p1,xl - l1), y0 = std::max(p1,yl - l1), - x1 = std::min(width() - 1 - p2,xl + l2), y1 = std::min(height() - 1 - p2,yl + l2); - for (int y = y0; y<=y1; y+=_lookup_increment) - for (int x = x0; x<=x1; x+=_lookup_increment) if (is_visited(x,y)!=target_index) { + xl0 = std::max(p1,xl - l1), yl0 = std::max(p1,yl - l1), + xl1 = std::min(width() - 1 - p2,xl + l2), yl1 = std::min(height() - 1 - p2,yl + l2); + for (int y = yl0; y<=yl1; y+=_lookup_increment) + for (int x = xl0; x<=xl1; x+=_lookup_increment) if (is_visited(x,y)!=target_index) { if (is_strict_search) mask._inpaint_patch_crop(x - p1,y - p1,x + p2,y + p2,1).move_to(pN); else nmask._inpaint_patch_crop(x - ox - p1,y - oy - p1,x - ox + p2,y - oy + p2,0).move_to(pN); if ((is_strict_search && pN.sum()==0) || (!is_strict_search && pN.sum()==patch_size2)) { @@ -1306,17 +1329,19 @@ // Generate map of source offsets. CImg offsets(dx,dy,1,2); - unsigned int *ptr = saved_patches.end(); - cimg_forY(saved_patches,i) { - const unsigned int yd = *(--ptr), xd = *(--ptr), ys = *(--ptr), xs = *(--ptr); - for (int l = -p1; l<=p2; ++l) - for (int k = -p1; k<=p2; ++k) { - const int xdk = (int)xd + k, ydl = (int)yd + l; - if (xdk>=0 && xdk<=width() - 1 && ydl>=0 && ydl<=height() - 1 && mask(xd + k,yd + l)) { - offsets(xd - ox + k,yd - oy + l,0) = xs + k; - offsets(xd - ox + k,yd - oy + l,1) = ys + l; + { + unsigned int *ptr = saved_patches.end(); + cimg_forY(saved_patches,i) { + const unsigned int yd = *(--ptr), xd = *(--ptr), ys = *(--ptr), xs = *(--ptr); + for (int l = -p1; l<=p2; ++l) + for (int k = -p1; k<=p2; ++k) { + const int xdk = (int)xd + k, ydl = (int)yd + l; + if (xdk>=0 && xdk<=width() - 1 && ydl>=0 && ydl<=height() - 1 && mask(xd + k,yd + l)) { + offsets(xd - ox + k,yd - oy + l,0) = xs + k; + offsets(xd - ox + k,yd - oy + l,1) = ys + l; + } } - } + } } unsigned int *ptrx = offsets.data(0,0,0,0), *ptry = offsets.data(0,0,0,1); cimg_forXY(offsets,x,y) { @@ -1439,10 +1464,18 @@ return max((+*this)._fill(expression,true,1,&images,&images,"max",this)); } +CImg& maxabs(const char *const expression, CImgList &images) { + return maxabs((+*this)._fill(expression,true,1,&images,&images,"maxabs",this)); +} + CImg& min(const char *const expression, CImgList &images) { return min((+*this)._fill(expression,true,1,&images,&images,"min",this)); } +CImg& minabs(const char *const expression, CImgList &images) { + return minabs((+*this)._fill(expression,true,1,&images,&images,"minabs",this)); +} + CImg& operator_andeq(const char *const expression, CImgList &images) { return operator&=((+*this)._fill(expression,true,1,&images,&images,"operator&=",this)); } @@ -1821,9 +1854,142 @@ return images; } -//--------------- End of CImg plug-in ---------------------------- +//--------------- End of CImg plug-in ---------------------------- + +// Add G'MIC-specific methods to the CImgList class of the CImg library. +//------------------------------------------------------------------------- +#undef cimg_plugin +#elif defined(cimglist_plugin) + +template +static CImgList copy_rounded(const CImgList& list) { + if (!cimg::type::is_float() || cimg::type::is_float()) return list; + CImgList res(list.size()); + cimglist_for(res,l) CImg::copy_rounded(list[l]).move_to(res[l]); + return res; +} + +static CImg copy_rounded(const CImg& list) { + return CImgList(list,true); +} + +// The method below is a variant of the method 'CImgList::_display()', where +// G'MIC command 'display2d' is used in place of the built-in method 'CImg::display()', +// for displaying 2d images only. +template +const CImgList& _gmic_display(CImgDisplay &disp, const char *const title, const CImgList *const titles, + const bool display_info, const char axis, const float align, unsigned int *const XYZ, + const bool exit_on_anykey, const unsigned int orig, const bool is_first_call, + bool &is_exit, + t& gmic_instance0, CImgList& images, CImgList& images_names) const { + if (is_empty()) + throw CImgInstanceException(_cimglist_instance + "display(): Empty instance.", + cimglist_instance); + if (!disp) { + if (axis=='x') { + unsigned int sum_width = 0, max_height = 0; + cimglist_for(*this,l) { + const CImg &img = _data[l]; + const unsigned int + w = CImgDisplay::_fitscreen(img._width,img._height,img._depth,128,-85,false), + h = CImgDisplay::_fitscreen(img._width,img._height,img._depth,128,-85,true); + sum_width+=w; + if (h>max_height) max_height = h; + } + disp.assign(cimg_fitscreen(sum_width,max_height,1),title?title:titles?titles->__display()._data:0,1); + } else { + unsigned int max_width = 0, sum_height = 0; + cimglist_for(*this,l) { + const CImg &img = _data[l]; + const unsigned int + w = CImgDisplay::_fitscreen(img._width,img._height,img._depth,128,-85,false), + h = CImgDisplay::_fitscreen(img._width,img._height,img._depth,128,-85,true); + if (w>max_width) max_width = w; + sum_height+=h; + } + disp.assign(cimg_fitscreen(max_width,sum_height,1),title?title:titles?titles->__display()._data:0,1); + } + if (!title && !titles) disp.set_title("CImgList<%s> (%u)",pixel_type(),_width); + } else if (title) disp.set_title("%s",title); + else if (titles) disp.set_title("%s",titles->__display()._data); + const CImg dtitle = CImg::string(disp.title()); + if (display_info) print(disp.title()); + disp.show().flush(); + + if (_width==1) { + const unsigned int dw = disp._width, dh = disp._height; + if (!is_first_call) + disp.resize(cimg_fitscreen(_data[0]._width,_data[0]._height,_data[0]._depth),false); + disp.set_title("%s (%ux%ux%ux%u)", + dtitle.data(),_data[0]._width,_data[0]._height,_data[0]._depth,_data[0]._spectrum); + if (_data[0]._depth==1) { // Use custom command 'display2d' for 2D images. + CImgList _images(_data[0],true); + CImgList _images_names(dtitle,true); + CImg com(128); + bool is_exception = false; + std::sprintf(com,"_d2d_core %d",(int)!is_first_call); + t gmic_instance; + cimg::swap(gmic_instance.commands,gmic_instance0.commands); + cimg::swap(gmic_instance.commands_names,gmic_instance0.commands_names); + cimg::swap(gmic_instance.commands_has_arguments,gmic_instance0.commands_has_arguments); + void *const _display_window0 = gmic_instance.display_windows[0]; + gmic_instance.display_windows[0] = &disp; + try { gmic_instance.run(com.data(),_images,_images_names); } + catch (...) { is_exception = true; } + cimg::swap(gmic_instance.commands,gmic_instance0.commands); + cimg::swap(gmic_instance.commands_names,gmic_instance0.commands_names); + cimg::swap(gmic_instance.commands_has_arguments,gmic_instance0.commands_has_arguments); + gmic_instance.display_windows[0] = _display_window0; + if (is_exception) throw CImgDisplayException(""); + } else _data[0]._display(disp,0,false,XYZ,exit_on_anykey,!is_first_call); // Otherwise, use standard display() + if (disp.key()) is_exit = true; + disp.resize(cimg_fitscreen(dw,dh,1),false).set_title("%s",dtitle.data()); + } else { + bool disp_resize = !is_first_call; + while (!disp.is_closed() && !is_exit) { + const CImg s = _select(disp,0,true,axis,align,exit_on_anykey,orig,disp_resize,!is_first_call,true); + disp_resize = true; + if (s[0]<0 && !disp.wheel()) { // No selections done + if (disp.button()&2) { disp.flush(); break; } + is_exit = true; + } else if (disp.wheel()) { // Zoom in/out + const int wheel = disp.wheel(); + disp.set_wheel(); + if (!is_first_call && wheel<0) break; + if (wheel>0 && _width>=4) { + const unsigned int + delta = std::max(1U,(unsigned int)cimg::round(0.3*_width)), + ind0 = (unsigned int)std::max(0,s[0] - (int)delta), + ind1 = (unsigned int)std::min(width() - 1,s[0] + (int)delta); + if ((ind0!=0 || ind1!=_width - 1) && ind1 - ind0>=3) { + const CImgList sublist = get_shared_images(ind0,ind1); + CImgList t_sublist; + if (titles) t_sublist = titles->get_shared_images(ind0,ind1); + sublist._gmic_display(disp,0,titles?&t_sublist:0,false,axis,align,XYZ,exit_on_anykey, + orig + ind0,false,is_exit, + gmic_instance0,images,images_names); + } + } + } else if (s[0]!=0 || s[1]!=width() - 1) { + const CImgList sublist = get_shared_images(s[0],s[1]); + CImgList t_sublist; + if (titles) t_sublist = titles->get_shared_images(s[0],s[1]); + sublist._gmic_display(disp,0,titles?&t_sublist:0,false,axis,align,XYZ,exit_on_anykey, + orig + s[0],false,is_exit, + gmic_instance0,images,images_names); + } + disp.set_title("%s",dtitle.data()); + } + } + return *this; +} + +#undef cimglist_plugin -#else // #ifdef cimg_plugin +//--------------- End of CImgList plug-in ------------------------ + +#else // #if defined(cimg_plugin) .. #elif defined(cimglist_plugin) #include "gmic.h" using namespace cimg_library; @@ -1843,6 +2009,9 @@ #ifndef gmic_comslots #define gmic_comslots 128 #endif +#ifndef gmic_winslots +#define gmic_winslots 10 +#endif // Macro to force stringifying selection for error messages. #define gmic_selection_err selection2string(selection,images_names,1,gmic_selection) @@ -1877,14 +2046,13 @@ _gmic_substitute_args(argument = _argument,argument0,command,item,images); \ } -// Macro for computing a readable version of a command argument. -inline char *_gmic_argument_text(const char *const argument, CImg& argument_text, const bool is_verbose) { +// Macros for computing a readable version of a command argument. +inline char *_gmic_argument_text(const char *const argument, char *const argument_text, const bool is_verbose) { if (is_verbose) return cimg::strellipsize(argument,argument_text,80,false); else return &(*argument_text=0); } - -#define gmic_argument_text_printed() _gmic_argument_text(argument,argument_text,is_verbose) -#define gmic_argument_text() _gmic_argument_text(argument,argument_text,true) +#define gmic_argument_text_printed() _gmic_argument_text(argument,gmic_use_argument_text,is_verbose) +#define gmic_argument_text() _gmic_argument_text(argument,gmic_use_argument_text,true) // Macro for having 'get' or 'non-get' versions of G'MIC commands. #define gmic_apply(function) { \ @@ -1893,7 +2061,17 @@ if (is_get) { \ images[__ind].get_##function.move_to(images); \ images_names[__ind].get_copymark().move_to(images_names); \ - } else images[__ind].function; \ + } else images[__ind].function; \ + } + +// Same as 'gmic_apply' but force computation with double-precision images. +#define gmic_apply_double(function) { \ + __ind = (unsigned int)selection[l]; \ + gmic_check(images[__ind]); \ + if (is_get) { \ + CImg(images[__ind],false).get_##function.move_to(images); \ + images_names[__ind].get_copymark().move_to(images_names); \ + } else CImg(images[__ind],false).function.move_to(images[__ind]); \ } // Macro for simple commands that has no arguments and act on images. @@ -1901,7 +2079,7 @@ if (!std::strcmp(command_name,command)) { \ print(images,0,description,gmic_selection.data()); \ cimg_forY(selection,l) gmic_apply(function()); \ - is_released = false; continue; \ + is_change = true; continue; \ } // Macro for G'MIC arithmetic commands. @@ -1912,7 +2090,7 @@ description4) \ if (!std::strcmp(command_name,command)) { \ gmic_substitute_args(true); \ - sep = *indices = *formula = 0; value = 0; \ + sep = 0; value = 0; \ if (cimg_sscanf(argument,"%lf%c",&value,&end)==1 || \ (cimg_sscanf(argument,"%lf%c%c",&value,&sep,&end)==2 && sep=='%')) { \ const char *const ssep = sep=='%'?"%":""; \ @@ -1930,7 +2108,7 @@ } else img.function1((value_type1)nvalue); \ } \ ++position; \ - } else if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",indices,&sep,&end)==2 && sep==']' && \ + } else if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_indices,&sep,&end)==2 && sep==']' && \ (ind=selection2cimg(indices,images.size(),images_names,command_name)).height()==1) { \ print(images,0,description2 ".",arg2_1,arg2_2); \ const CImg img0 = gmic_image_arg(*ind); \ @@ -1942,7 +2120,7 @@ } else img.function2(img0); \ } \ ++position; \ - } else if (cimg_sscanf(argument,"'%4095[^']%c%c",formula,&sep,&end)==2 && sep=='\'') { \ + } else if (cimg_sscanf(argument,"'%4095[^']%c%c",gmic_use_formula,&sep,&end)==2 && sep=='\'') { \ strreplace_fw(formula); print(images,0,description3 ".",arg3_1,arg3_2); \ cimg_forY(selection,l) { \ CImg& img = gmic_check(images[selection[l]]); \ @@ -1962,64 +2140,193 @@ images_names.insert(images_names[selection[0]].get_copymark()); \ g_img.move_to(images); \ } else if (selection.height()>=2) { \ - const unsigned int ind0 = selection[0]; \ - CImg& img = gmic_check(images[ind0]); \ + CImg& img = gmic_check(images[selection[0]]); \ for (unsigned int l = 1; l<(unsigned int)selection.height(); ++l) \ img.function2(gmic_check(images[selection[l]])); \ remove_images(images,images_names,selection,1,selection.height() - 1); \ - }}} is_released = false; continue; \ + }}} is_change = true; continue; \ } +// Parse debug info string (eq. to std::sscanf(s,"%x,%x",&line_number,&file_number). +bool gmic::get_debug_info(const char *s, unsigned int &line_number, unsigned int &file_number) { + char c = *(++s); + bool is_digit = (c>='0' && c<='9') || (c>='a' && c<='f'); + if (is_digit) { + unsigned int ln = 0; + while (is_digit) { + (ln<<=4)|=(c>='a'?c - 'a' + 10:c - '0'); + c = *(++s); + is_digit = (c>='0' && c<='9') || (c>='a' && c<='f'); + } + line_number = ln; + unsigned int fn = 0; + if (*(s++)==',') { + c = *s; + is_digit = (c>='0' && c<='9') || (c>='a' && c<='f'); + while (is_digit) { + (fn<<=4)|=(c>='a'?c - 'a' + 10:c - '0'); + c = *(++s); + is_digit = (c>='0' && c<='9') || (c>='a' && c<='f'); + } + } + file_number = fn; + return true; + } + return false; +} + // Manage list of all gmic runs (for CImg math parser 'ext()'). inline gmic_list& gmic_runs() { static gmic_list val; return val; } -double gmic::mp_ext(char *const str, void *const p_list) { +template +double gmic::mp_run(char *const str, + void *const p_list, const T& pixel_type) { + cimg::unused(pixel_type); double res = cimg::type::nan(); char sep; - cimg_pragma_openmp(critical(mp_ext)) + cimg_pragma_openmp(critical(mp_run)) { - // Retrieve current gmic instance. + // Retrieve current gmic run. cimg::mutex(24); CImgList &grl = gmic_runs(); - int ind; - for (ind = grl.width() - 1; ind>=0; --ind) { - CImg &gr = grl[ind]; + int p; + for (p = grl.width() - 1; p>=0; --p) { + CImg &gr = grl[p]; if (gr[1]==(void*)p_list) break; } - if (ind<0) { cimg::mutex(24,0); res = cimg::type::nan(); } // Instance not found + if (p<0) { cimg::mutex(24,0); res = cimg::type::nan(); } // Instance not found else { - CImg &gr = grl[ind]; - gmic &gi = *(gmic*)gr[0]; + CImg &gr = grl[p]; + gmic &gmic_instance = *(gmic*)gr[0]; cimg::mutex(24,0); // Run given command line. - CImgList &images = *(CImgList*)gr[1]; + CImgList &images = *(CImgList*)gr[1]; CImgList &images_names = *(CImgList*)gr[2]; - CImgList &parent_images = *(CImgList*)gr[3]; + CImgList &parent_images = *(CImgList*)gr[3]; CImgList &parent_images_names = *(CImgList*)gr[4]; const unsigned int *const variables_sizes = (const unsigned int*)gr[5]; const CImg *const command_selection = (const CImg*)gr[6]; - if (gi.is_debug_info && gi.debug_line!=~0U) { + if (gmic_instance.is_debug_info && gmic_instance.debug_line!=~0U) { CImg title(32); - cimg_snprintf(title,title.width(),"*ext#%u",gi.debug_line); - CImg::string(title).move_to(gi.callstack); - } else CImg::string("*ext").move_to(gi.callstack); + cimg_snprintf(title,title.width(),"*ext#%u",gmic_instance.debug_line); + CImg::string(title).move_to(gmic_instance.callstack); + } else CImg::string("*ext").move_to(gmic_instance.callstack); unsigned int pos = 0; - try { - gi._run(gi.commands_line_to_CImgList(gmic::strreplace_fw(str)),pos,images,images_names, - parent_images,parent_images_names,variables_sizes,0,0,command_selection); + gmic_instance._run(gmic_instance.commands_line_to_CImgList(gmic::strreplace_fw(str)),pos,images,images_names, + parent_images,parent_images_names,variables_sizes,0,0,command_selection); } catch (gmic_exception&) { res = cimg::type::nan(); } - gi.callstack.remove(); - if (!gi.status || !*gi.status || cimg_sscanf(gi.status,"%lf%c",&res,&sep)!=1) res = cimg::type::nan(); + gmic_instance.callstack.remove(); + if (!gmic_instance.status || !*gmic_instance.status || cimg_sscanf(gmic_instance.status,"%lf%c",&res,&sep)!=1) + res = cimg::type::nan(); } } return res; } +template +double gmic::mp_store(const Ts *const ptr, + const unsigned int w, const unsigned int h, const unsigned d, const unsigned int s, + const bool is_compressed, const char *const str, + void *const p_list, const T& pixel_type) { + cimg::unused(pixel_type); + + // Retrieve current gmic run. + cimg::mutex(24); + CImgList &grl = gmic_runs(); + int p; + for (p = grl.width() - 1; p>=0; --p) { + CImg &gr = grl[p]; + if (gr[1]==(void*)p_list) break; + } + if (p<0) cimg::mutex(24,0); // Instance not found + else { + CImg &gr = grl[p]; + gmic &gmic_instance = *(gmic*)gr[0]; + const unsigned int *const variables_sizes = (const unsigned int*)gr[5]; + CImg _varname(256); + char *const varname = _varname.data(), end; + + if (cimg_sscanf(str,"%255[a-zA-Z0-9_]%c",&(*varname=0),&end)==1 && + (*varname<'0' || *varname>'9')) { + CImgList g_list; + CImg(ptr,w,h,d,s).move_to(g_list); + CImg name = CImg::string(varname); + name.resize(name.width() + 4,1,1,1,0,0,1); + name[0] = 'G'; name[1] = 'M'; name[2] = 'Z'; name[3] = 0; + name.unroll('y').move_to(g_list); + + g_list.get_serialize(is_compressed).unroll('x').move_to(name); + name.resize(name.width() + 9 + std::strlen(varname),1,1,1,0,0,1); + std::sprintf(name,"%c*store/%s",gmic_store,_varname.data()); + gmic_instance.set_variable(_varname.data(),name,variables_sizes); + cimg::mutex(24,0); + } else { + cimg::mutex(24,0); + throw CImgArgumentException("[" cimg_appname "_math_parser] CImg<%s>: Function 'store()': " + "Invalid variable name '%s' specified.", + cimg::type::string(),str); + } + } + return cimg::type::nan(); +} + +template +double gmic::mp_name(const unsigned int ind, Ts *const out_str, const unsigned int siz, + void *const p_list, const T& pixel_type) { + cimg::unused(pixel_type); + std::memset(out_str,0,siz*sizeof(Ts)); + + // Retrieve current gmic run. + cimg::mutex(24); + CImgList &grl = gmic_runs(); + int p; + for (p = grl.width() - 1; p>=0; --p) { + CImg &gr = grl[p]; + if (gr[1]==(void*)p_list) break; + } + if (p<0) cimg::mutex(24,0); // Instance not found + else { + CImg &gr = grl[p]; + cimg::mutex(24,0); + CImgList &images_names = *(CImgList*)gr[2]; + if (ind::nan(); +} + +template +double gmic::mp_setname(const unsigned int ind, const char *const str, + void *const p_list, const T& pixel_type) { + cimg::unused(pixel_type); + + // Retrieve current gmic run. + cimg::mutex(24); + CImgList &grl = gmic_runs(); + int p; + for (p = grl.width() - 1; p>=0; --p) { + CImg &gr = grl[p]; + if (gr[1]==(void*)p_list) break; + } + if (p<0) cimg::mutex(24,0); // Instance not found + else { + CImg &gr = grl[p]; + cimg::mutex(24,0); + CImgList &images_names = *(CImgList*)gr[2]; + if (ind::string(str).move_to(images_names[ind]); + } + return cimg::type::nan(); +} + // Manage correspondence between abort pointers and thread ids. CImgList gmic::list_p_is_abort = CImgList(); bool *gmic::abort_ptr(bool *const p_is_abort) { @@ -2031,7 +2338,7 @@ void* tid = (void*)(cimg_ulong)GetCurrentThreadId(); #else void* tid = (void*)0; -#endif +#endif // #if defined(__MACOSX__) || defined(__APPLE__) cimg::mutex(21); bool *res = p_is_abort; int ind = -1; @@ -2050,12 +2357,12 @@ // Manage mutexes. struct _gmic_mutex { -#ifdef _PTHREAD_H +#if cimg_OS==1 && (defined(cimg_use_pthread) || cimg_display==1) pthread_mutex_t mutex[256]; _gmic_mutex() { for (unsigned int i = 0; i<256; ++i) pthread_mutex_init(&mutex[i],0); } void lock(const unsigned int n) { pthread_mutex_lock(&mutex[n]); } void unlock(const unsigned int n) { pthread_mutex_unlock(&mutex[n]); } -#elif cimg_OS==2 // #ifdef _PTHREAD_H +#elif cimg_OS==2 // #if cimg_OS==1 && (defined(cimg_use_pthread) || cimg_display==1) HANDLE mutex[256]; _gmic_mutex() { for (unsigned int i = 0; i<256; ++i) mutex[i] = CreateMutex(0,FALSE,0); } void lock(const unsigned int n) { WaitForSingleObject(mutex[n],INFINITE); } @@ -2064,7 +2371,7 @@ _gmic_mutex() {} void lock(const unsigned int) {} void unlock(const unsigned int) {} -#endif // #if cimg_OS==2 +#endif // #if cimg_OS==1 && (defined(cimg_use_pthread) || cimg_display==1) }; inline _gmic_mutex& gmic_mutex() { static _gmic_mutex val; return val; } @@ -2072,7 +2379,7 @@ template struct _gmic_parallel { CImgList *images_names, *parent_images_names, commands_line; - CImgList<_gmic_parallel > *threads_data; + CImg<_gmic_parallel > *gmic_threads; CImgList *images, *parent_images; CImg variables_sizes; const CImg *command_selection; @@ -2105,24 +2412,9 @@ *st.parent_images,*st.parent_images_names, st.variables_sizes,0,0,st.command_selection); } catch (gmic_exception &e) { - - // Send all remaining running threads the 'abort' signal. -#ifdef gmic_is_parallel - CImgList<_gmic_parallel > &threads_data = *st.threads_data; - cimglist_for(threads_data,i) cimg_forY(threads_data[i],l) - if (&threads_data(i,l)!=&st && threads_data(i,l).is_thread_running) { - threads_data(i,l).gmic_instance.is_abort_thread = true; -#ifdef _PTHREAD_H - pthread_join(threads_data(i,l).thread_id,0); -#elif cimg_OS==2 // #ifdef _PTHREAD_H - WaitForSingleObject(threads_data(i,l).thread_id,INFINITE); - CloseHandle(threads_data(i,l).thread_id); -#endif // #ifdef _PTHREAD_H - threads_data(i,l).is_thread_running = false; - } -#endif // #ifdef gmic_is_parallel - - st.exception._command_help.assign(e._command_help); + cimg_forY(*st.gmic_threads,l) + (*st.gmic_threads)[l].gmic_instance.is_abort_thread = true; + st.exception._command.assign(e._command); st.exception._message.assign(e._message); } #if defined(gmic_is_parallel) && defined(_PTHREAD_H) @@ -2131,15 +2423,15 @@ return 0; } -// Array of G'MIC builtin commands (must be sorted in lexicographic order!). +// Array of G'MIC built-in commands (must be sorted in lexicographic order!). const char *gmic::builtin_commands_names[] = { "!=","%","&","*","*3d","+","+3d","-","-3d","/","/3d","<","<<","<=","=","==",">",">=",">>", "a","abs","acos","acosh","add","add3d","and","append","asin","asinh","atan","atan2","atanh","autocrop","axes", "b","bilateral","blur","boxfilter","break","bsl","bsr", "c","camera","channels","check","check3d","col3d","color3d","columns","command","continue","convolve","correlate", "cos","cosh","crop","cumulate","cursor","cut", - "d","d3d","db3d","debug","denoise","deriche","dijkstra","dilate","discard","displacement","display","display3d", - "distance","div","div3d","divide","do","done","double3d", + "d","db3d","debug","denoise","deriche","dijkstra","dilate","discard","displacement","display", + "distance","div","div3d","do","done","double3d", "e","echo","eigen","eikonal","elevation3d","elif","ellipse","else","endian","endif","endl","endlocal","eq", "equalize","erode","error","eval","exec","exp", "f","f3d","fft","fi","files","fill","flood","focale3d","for", @@ -2149,20 +2441,19 @@ "j","j3d", "k","keep", "l","l3d","label","le","light3d","line","local","log","log10","log2","lt", - "m","m*","m/","m3d","mandelbrot","map","matchpatch","max","md3d","mdiv","median","min","mirror","mmul","mod", - "mode3d","moded3d","move","mse","mul","mul3d","mutex","mv", - "n","name","neq","nm","noarg","noise","normalize", + "m","m*","m/","m3d","mandelbrot","map","matchpatch","max","maxabs","md3d","mdiv","median","min","minabs","mirror", + "mmul","mod","mode3d","moded3d","move","mproj","mse","mul","mul3d","mutex","mv", + "n","name","named","neq","network","nm","nmd","noarg","noise","normalize", "o","o3d","object3d","onfail","opacity3d","or","output", - "p","parallel","pass","permute","plasma","plot","point","polygon","pow","print", - "progress", + "p","parallel","pass","permute","plasma","plot","point","polygon","pow","print","progress", "q","quit", "r","r3d","rand","remove","repeat","resize","return","reverse","reverse3d", "rm","rol","ror","rotate","rotate3d","round","rows","rv","rv3d", "s","s3d","screen","select","serialize","set","sh","shared","sharpen","shift","sign","sin","sinc","sinh","skip", "sl3d","slices","smooth","solve","sort","specl3d","specs3d","sphere3d","split","split3d","sqr","sqrt","srand", - "ss3d","status","streamline3d","structuretensors","sub","sub3d","svd", - "t","tan","tanh","text","threshold","trisolve", - "u","uncommand","unroll","unserialize", + "ss3d","status","store","streamline3d","structuretensors","sub","sub3d","svd", + "t","tan","tanh","text","trisolve", + "u","um","uncommand","unroll","unserialize", "v","vanvliet","verbose", "w","w0","w1","w2","w3","w4","w5","w6","w7","w8","w9","wait","warn","warp","watershed","while","window", "x","xor","y","z","^","|" }; @@ -2213,17 +2504,31 @@ return _levenshtein(ns,nt,d,0,0); } -// Return true if specified filename corresponds to an existing file or directory. -bool gmic::check_filename(const char *const filename) { - bool res = false; -#if cimg_OS==2 - const unsigned int attr = (unsigned int)GetFileAttributesA(filename); - res = (attr!=~0U); -#else // #if cimg_OS==2 - std::FILE *const file = cimg::std_fopen(filename,"r"); - if (file) { res = true; cimg::fclose(file); } -#endif // #if cimg_OS==2 - return res; +// Wait for threads to finish. +template +void gmic::wait_threads(void *const p_gmic_threads, const bool try_abort, const T& pixel_type) { + cimg::unused(pixel_type); + CImg<_gmic_parallel > &gmic_threads = *(CImg<_gmic_parallel >*)p_gmic_threads; +#ifdef gmic_is_parallel + cimg_forY(gmic_threads,l) { + if (try_abort && gmic_threads[l].is_thread_running) + gmic_threads[l].gmic_instance.is_abort_thread = true; + + cimg::mutex(25); + if (gmic_threads[l].is_thread_running) { + gmic_threads[l].is_thread_running = false; + cimg::mutex(25,0); +#ifdef _PTHREAD_H + pthread_join(gmic_threads[l].thread_id,0); +#elif cimg_OS==2 // #ifdef _PTHREAD_H + WaitForSingleObject(gmic_threads[l].thread_id,INFINITE); + CloseHandle(gmic_threads[l].thread_id); +#endif // #ifdef _PTHREAD_H + } else cimg::mutex(25,0); + + is_change|=gmic_threads[l].gmic_instance.is_change; + } +#endif // #ifdef gmic_is_parallel } // Return a hashcode from a string. @@ -2239,7 +2544,7 @@ return hash&(gmic_comslots - 1); } -// Tells if the the implementation of a G'MIC command contains arguments. +// Tells if the implementation of a G'MIC command contains arguments. bool gmic::command_has_arguments(const char *const command) { if (!command || !*command) return false; for (const char *s = std::strchr(command,'$'); s; s = std::strchr(s,'$')) { @@ -2259,9 +2564,13 @@ // Compute the basename of a filename. const char* gmic::basename(const char *const str) { - if (!str) return str; + if (!str || !*str) return ""; const unsigned int l = (unsigned int)std::strlen(str); - if (*str=='[' && (str[l - 1]==']' || str[l - 1]=='.')) return str; + unsigned int ll = l - 1; // 'Last' character to check + while (ll>=3 && str[ll]>='0' && str[ll]<='9') --ll; + if (ll>=3 && ll!=l - 1 && str[ll - 1]=='_' && str[ll]=='c' && str[ll + 1]!='0') ll-=2; // Ignore copy mark + else ll = l - 1; + if (*str=='[' && (str[ll]==']' || str[ll]=='.')) return str; const char *p = 0, *np = str; while (np>=str && (p=np)) np = std::strchr(np,'/') + 1; np = p; @@ -2269,43 +2578,57 @@ return p; } +// Return true if specified character is considered as 'blank'. +inline bool is_blank(const char x) { + return (x>1 && xgmic_store && x<=' '); +} + +inline void _strreplace_fw(char &c) { + switch (c) { + case gmic_dollar : c = '$'; break; + case gmic_lbrace : c = '{'; break; + case gmic_rbrace : c = '}'; break; + case gmic_comma : c = ','; break; + case gmic_dquote : c = '\"'; break; + } +} + +inline void _strreplace_bw(char &c) { + switch (c) { + case '$' : c = gmic_dollar; break; + case '{' : c = gmic_lbrace; break; + case '}' : c = gmic_rbrace; break; + case ',' : c = gmic_comma; break; + case '\"' : c = gmic_dquote; break; + } +} + // Replace special characters in a string. char *gmic::strreplace_fw(char *const str) { - if (str) for (char *s = str ; *s; ++s) { - const char c = *s; - if (c<' ') - *s = c==gmic_dollar?'$':c==gmic_lbrace?'{':c==gmic_rbrace?'}':c==gmic_comma?',': - c==gmic_dquote?'\"':c; - } + if (str) for (char *s = str ; *s; ++s) _strreplace_fw(*s); return str; } char *gmic::strreplace_bw(char *const str) { - if (str) for (char *s = str ; *s; ++s) { - const char c = *s; - *s = c=='$'?gmic_dollar:c=='{'?gmic_lbrace:c=='}'?gmic_rbrace:c==','?gmic_comma: - c=='\"'?gmic_dquote:c; - } + if (str) for (char *s = str ; *s; ++s) _strreplace_bw(*s); return str; } //! Escape a string. -// 'res' must be a C-string large enough ('4*strlen(str)+1' is always safe). +// 'res' must be a C-string large enough ('4*strlen(str) + 1' is always safe). unsigned int gmic::strescape(const char *const str, char *const res) { const char *const esc = "abtnvfr"; char *ptrd = res; - for (const char *ptrs = str; *ptrs; ++ptrs) { - const char c = *ptrs; + for (const unsigned char *ptrs = (unsigned char*)str; *ptrs; ++ptrs) { + const unsigned char c = *ptrs; if (c=='\\' || c=='\'' || c=='\"') { *(ptrd++) = '\\'; *(ptrd++) = c; } - else if (c>=7 && c<=13) { *(ptrd++) = '\\'; *(ptrd++) = esc[c - 7]; } - else if (c>=32 && c<=126) *(ptrd++) = c; - else if (cgmic_newline) { + else if (c>='\a' && c<='\r') { *(ptrd++) = '\\'; *(ptrd++) = esc[c - 7]; } + else if (c>=' ' && c<='~') *(ptrd++) = c; + else if (cgmic_dquote) { *(ptrd++) = '\\'; - *(ptrd++) = 'x'; - char d = c>>4; - *(ptrd++) = d + (d<10?'0':'a'-10); - d = c&15; - *(ptrd++) = d + (d<10?'0':'a'-10); + *(ptrd++) = (char)('0' + (c>>6)); + *(ptrd++) = (char)('0' + ((c>>3)&7)); + *(ptrd++) = (char)('0' + (c&7)); } else *(ptrd++) = c; } *ptrd = 0; @@ -2314,34 +2637,29 @@ // Constructors / destructors. //---------------------------- -#if cimg_display!=0 -#define gmic_new_attr commands(new CImgList[gmic_comslots]), commands_names(new CImgList[gmic_comslots]), \ - commands_has_arguments(new CImgList[gmic_comslots]), \ - _variables(new CImgList[gmic_varslots]), _variables_names(new CImgList[gmic_varslots]), \ - variables(new CImgList*[gmic_varslots]), variables_names(new CImgList*[gmic_varslots]), \ - display_windows(new CImgDisplay[10]), is_running(false) -#else #define gmic_new_attr commands(new CImgList[gmic_comslots]), commands_names(new CImgList[gmic_comslots]), \ commands_has_arguments(new CImgList[gmic_comslots]), \ _variables(new CImgList[gmic_varslots]), _variables_names(new CImgList[gmic_varslots]), \ variables(new CImgList*[gmic_varslots]), variables_names(new CImgList*[gmic_varslots]), \ - display_windows(0), is_running(false) -#endif // #if cimg_display!=0 + is_running(false) + +#define display_window(n) (*(CImgDisplay*)display_windows[n]) CImg gmic::stdlib = CImg::empty(); gmic::gmic():gmic_new_attr { CImgList images; CImgList images_names; - verbosity = -1; _gmic(0,images,images_names,0,true,0,0); - verbosity = 0; } +template gmic::gmic(const char *const commands_line, const char *const custom_commands, - const bool include_stdlib, float *const p_progress, bool *const p_is_abort): + const bool include_stdlib, float *const p_progress, bool *const p_is_abort, + const T& pixel_type): gmic_new_attr { - CImgList images; + cimg::unused(pixel_type); + CImgList images; CImgList images_names; _gmic(commands_line, images,images_names,custom_commands, @@ -2350,11 +2668,7 @@ gmic::~gmic() { cimg::exception_mode(cimg_exception_mode); -#if cimg_display!=0 - CImgDisplay *const _display_windows = (CImgDisplay*)display_windows; - delete[] _display_windows; -#endif // #if cimg_display!=0 - + cimg_forX(display_windows,l) delete &display_window(l); cimg::mutex(21); #if defined(__MACOSX__) || defined(__APPLE__) void* tid = (void*)(cimg_ulong)getpid(); @@ -2398,6 +2712,36 @@ return stdlib; } +// Gets the value of an environment variable. +//-------------------------------------------- +static const char* gmic_getenv(const char *const varname) { +#if cimg_OS==2 + static CImg utf8Buffer(768); + // Get the value of the environment variable using the wide-character + // (UTF-16) version of the Windows API and convert it to UTF-8. + + // Convert the environment variable name to a wide string. + const int wideNameLength = MultiByteToWideChar(CP_UTF8,0,varname,-1,0,0); + if (wideNameLength) { + CImg wideVarName(wideNameLength); + if (MultiByteToWideChar(CP_UTF8,0,varname,-1,wideVarName,wideNameLength)) { + const DWORD wideValueLength = GetEnvironmentVariableW(wideVarName,0,0); + if (wideValueLength) { + CImg wideValue(wideValueLength); + if (GetEnvironmentVariableW(wideVarName,wideValue,wideValueLength)) { + // Convert the returned value from UTF-16 to UTF-8. + const int utf8Length = WideCharToMultiByte(CP_UTF8,0,wideValue,wideValueLength,0,0,0,0); + if (utf8Length && utf8Length dirname = CImg::string(path_rc(custom_path)); - if (dirname.width()>=2) dirname[dirname.width() - 2] = 0; + if (dirname.width()>=2) { + char &c = dirname[dirname.width() - 2]; + if (c=='/' || c=='\\') c = 0; + } if (!cimg::is_directory(dirname)) { - std::remove(dirname); // In case 'dirname' is already a file #if cimg_OS==2 - return (bool)CreateDirectoryA(dirname,0); + DeleteFileA(dirname); // In case 'dirname' is already a file + if (!CreateDirectoryA(dirname,0)) { + // The path may be UTF-8, convert it to a + // wide-character string and try again. + const int wideLength = MultiByteToWideChar(CP_UTF8,0,dirname,-1,0,0); + if (!wideLength) return false; + CImg wpath(wideLength); + if (!MultiByteToWideChar(CP_UTF8,0,dirname,-1,wpath,wideLength)) return false; + DeleteFileW(wpath); + return (bool)CreateDirectoryW(wpath,0); + } #else + std::remove(dirname); // In case 'dirname' is already a file return !(bool)mkdir(dirname,0777); #endif } @@ -2486,14 +2843,14 @@ // Get current call stack as a string. //------------------------------------- -CImg gmic::callstack2string(const CImg *const callstack_selection, const bool is_debug) const { +CImg gmic::callstack2string(const CImg *const callstack_selection, const bool _is_debug) const { if (callstack_selection && !*callstack_selection) return CImg("./",3); CImgList input_callstack; if (!callstack_selection) input_callstack.assign(callstack,true); else cimg_forY(*callstack_selection,l) input_callstack.insert(callstack[(*callstack_selection)[l]],~0U,true); CImgList res; const unsigned int siz = (unsigned int)input_callstack.size(); - if (siz<=9 || is_debug) res.assign(input_callstack,false); + if (siz<=9 || _is_debug) res.assign(input_callstack,false); else { res.assign(9); res[0].assign(input_callstack[0],false); @@ -2506,23 +2863,17 @@ res[7].assign(input_callstack[siz - 2],false); res[8].assign(input_callstack[siz - 1],false); } - cimglist_for(res,l) { - if (!verbosity && !is_debug) { - char *const s = res(l,0)!='*'?0:std::strchr(res[l],'#'); - if (s) { *s = 0; CImg(res[l].data(),(unsigned int)(s - res[l].data() + 1)).move_to(res[l]); } - } - res[l].back() = '/'; - } + cimglist_for(res,l) if (res(l,0)) res[l].back() = '/'; else res.remove(l--); CImg::vector(0).move_to(res); return res>'x'; } -CImg gmic::callstack2string(const bool is_debug) const { - return callstack2string(0,is_debug); +CImg gmic::callstack2string(const bool _is_debug) const { + return callstack2string(0,_is_debug); } -CImg gmic::callstack2string(const CImg& callstack_selection, const bool is_debug) const { - return callstack2string(&callstack_selection,is_debug); +CImg gmic::callstack2string(const CImg& callstack_selection, const bool _is_debug) const { + return callstack2string(&callstack_selection,_is_debug); } // Parse items from a G'MIC command line. @@ -2531,7 +2882,7 @@ if (!commands_line || !*commands_line) return CImgList(); bool is_dquoted = false; const char *ptrs0 = commands_line; - while (*ptrs0==' ') ++ptrs0; // Remove leading spaces to first item + while (is_blank(*ptrs0)) ++ptrs0; // Remove leading spaces to first item CImg item((unsigned int)std::strlen(ptrs0) + 1); CImgList items; char *ptrd = item.data(), c = 0; @@ -2540,26 +2891,33 @@ c = *ptrs; if (c=='\\') { // If escaped character c = *(++ptrs); - if (!c) { c = '\\'; --ptrs; } - else if (c=='$') c = gmic_dollar; - else if (c=='{') c = gmic_lbrace; - else if (c=='}') c = gmic_rbrace; - else if (c==',') c = gmic_comma; - else if (c=='\"') c = gmic_dquote; - else if (c==' ') c = ' '; - else *(ptrd++) = '\\'; + switch (c) { + case 0 : c = '\\'; --ptrs; break; + case '$' : c = gmic_dollar; break; + case '{' : c = gmic_lbrace; break; + case '}' : c = gmic_rbrace; break; + case ',' : c = gmic_comma; break; + case '\"' : c = gmic_dquote; break; + case ' ' : c = ' '; break; + default : *(ptrd++) = '\\'; + } *(ptrd++) = c; } else if (is_dquoted) { // If non-escaped character inside string - if (c=='\"') is_dquoted = false; - else if (c==1) { while (c && c!=' ') c = *(++ptrs); if (!c) break; } // Discard debug info inside string - else *(ptrd++) = (c=='$' && ptrs[1]!='?')?gmic_dollar:c=='{'?gmic_lbrace:c=='}'?gmic_rbrace: - c==','?gmic_comma:c; + if (c==1) { while (c && c!=' ') c = *(++ptrs); if (!c) break; } // Discard debug info inside string + else switch (c) { + case '\"': is_dquoted = false; break; + case '$' : *(ptrd++) = ptrs[1]=='?'?'$':gmic_dollar; break; + case '{' : *(ptrd++) = gmic_lbrace; break; + case '}' : *(ptrd++) = gmic_rbrace; break; + case ',' : *(ptrd++) = gmic_comma; break; + default : *(ptrd++) = c; + } } else { // Non-escaped character outside string if (c=='\"') is_dquoted = true; - else if (c==' ') { + else if (is_blank(c)) { *ptrd = 0; CImg(item.data(),(unsigned int)(ptrd - item.data() + 1)).move_to(items); ptrd = item.data(); - ++ptrs; while (*ptrs==' ') ++ptrs; ptrs0 = ptrs--; // Remove trailing spaces to next item + ++ptrs; while (is_blank(*ptrs)) ++ptrs; ptrs0 = ptrs--; // Remove trailing spaces to next item } else *(ptrd++) = c; } } @@ -2572,19 +2930,14 @@ c = *ptrs; if (c && c!=1) *(ptrd++) = c; else { // Try to retrieve first debug line when discarding debug info - unsigned int _debug_filename = ~0U, _debug_line = ~0U; - if (!_is_debug_info && cimg_sscanf(ptrs + 1,"%x,%x",&_debug_line,&(_debug_filename=0))) { - debug_filename = _debug_filename; - debug_line = _debug_line; - _is_debug_info = is_debug_info = true; - } + if (!_is_debug_info) is_debug_info|=(_is_debug_info=get_debug_info(ptrs,debug_line,debug_filename)); while (c && c!=' ') c = *(++ptrs); } } *ptrd = 0; - error("Invalid command line: Double quotes are not closed, in expression '%s'.", + error(true,"Invalid command line: Double quotes are not closed, in expression '%s'.", str.data()); } - if (ptrd!=item.data() && c!=' ') { + if (ptrd!=item.data() && !is_blank(c)) { *ptrd = 0; CImg(item.data(),(unsigned int)(ptrd - item.data() + 1)).move_to(items); } if (is_debug) { @@ -2596,13 +2949,14 @@ } else debug(" item[%u] = '%s'",l,items[l].data()); } } + return items; } // Print log message. //------------------- gmic& gmic::print(const char *format, ...) { - if (verbosity<0 && !is_debug) return *this; + if (verbosity<1 && !is_debug) return *this; va_list ap; va_start(ap,format); CImg message(65536); @@ -2614,12 +2968,13 @@ // Display message. cimg::mutex(29); - if (*message!='\r') - for (unsigned int i = 0; i message(1024); @@ -2639,19 +2994,24 @@ // Display message. const CImg s_callstack = callstack2string(); - if (verbosity>=0 || is_debug) { + if (verbosity>=1 || is_debug) { cimg::mutex(29); if (*message!='\r') for (unsigned int i = 0; i=gmic_dollar && c<=gmic_dquote) switch (c) { case gmic_dollar : std::fprintf(cimg::output(),"\\$"); break; case gmic_lbrace : std::fprintf(cimg::output(),"\\{"); break; case gmic_rbrace : std::fprintf(cimg::output(),"\\}"); break; case gmic_comma : std::fprintf(cimg::output(),"\\,"); break; case gmic_dquote : std::fprintf(cimg::output(),"\\\""); break; default : std::fputc(c,cimg::output()); - } - else std::fputc(c,cimg::output()); + } else std::fputc(c,cimg::output()); } std::fprintf(cimg::output(), "%s", @@ -2724,7 +3083,7 @@ // Set variable in the interpreter environment. //--------------------------------------------- -// 'operation' can be { 0 (add new variable), '=' (replace or add),'+','-','*','/','%','&','|','^','<','>' } +// 'operation' can be { 0 (add new variable), '=' (replace or add),'.','+','-','*','/','%','&','|','^','<','>' } // Return the variable value. const char *gmic::set_variable(const char *const name, const char *const value, const char operation, @@ -2744,6 +3103,28 @@ CImgList &__variables = *variables[hash], &__variables_names = *variables_names[hash]; + + if ((!operation || operation=='=') && *value==gmic_store && + !std::strncmp(value + 1,"*store/",7) && value[8]) { // Get value from image-encoded variable. + const char *const cname = value + 8; + const bool is_cglobal = *cname=='_'; + const unsigned int chash = hashcode(cname,true); + const int clind = is_cglobal || !variables_sizes?0:(int)variables_sizes[chash]; + CImgList + &__cvariables = *variables[chash], + &__cvariables_names = *variables_names[chash]; + for (int l = __cvariables.width() - 1; l>=clind; --l) if (!std::strcmp(__cvariables_names[l],cname)) { + is_name_found = true; ind = l; break; + } + if (is_name_found) { + __cvariables[ind].get_resize(__cvariables[ind].width() + std::strlen(name) - std::strlen(cname),1,1,1,0,0,1). + move_to(s_value); + std::sprintf(s_value,"%c*store/%s",gmic_store,name); + } else s_value.assign(1,1,1,1,0); + is_name_found = false; + } else if (!operation || operation=='=' || operation=='.') s_value.assign(value,std::strlen(value) + 1,1,1,1,true); + else s_value.assign(24); + if (operation) { // Retrieve index of current definition. for (int l = __variables.width() - 1; l>=lind; --l) if (!std::strcmp(__variables_names[l],name)) { @@ -2751,7 +3132,7 @@ } if (operation=='=') { if (!is_name_found) _operation = 0; // New variable - else CImg::string(value).move_to(__variables[ind]); + else s_value.move_to(__variables[ind]); } else if (operation=='.') { if (!is_name_found) _operation = 0; // New variable else if (*value) { @@ -2763,15 +3144,15 @@ operation=='%'?"%":operation=='&'?"&":operation=='|'?"|":operation=='^'?"^": operation=='<'?"<<":">>"; if (!is_name_found) - error("Operation '%s=' requested on undefined variable '%s'.", + error(true,"Operation '%s=' requested on undefined variable '%s'.", s_operation,name); if (cimg_sscanf(__variables[ind],"%lf%c",&lvalue,&end)!=1) - error("Operation '%s=' requested on non-numerical variable '%s=%s'.", + error(true,"Operation '%s=' requested on non-numerical variable '%s=%s'.", s_operation,name,__variables[ind].data()); if (cimg_sscanf(value,"%lf%c",&rvalue,&end)!=1) - error("Operation '%s=' requested on variable '%s', with non-numerical argument '%s'.", + error(true,"Operation '%s=' requested on variable '%s', with non-numerical argument '%s'.", s_operation,name,value); - s_value.assign(24); *s_value = 0; + *s_value = 0; cimg_snprintf(s_value,s_value.width(),"%.17g", operation=='+'?lvalue + rvalue: operation=='-'?lvalue - rvalue: @@ -2789,7 +3170,37 @@ if (!_operation) { // New variable ind = __variables.width(); CImg::string(name).move_to(__variables_names); - CImg::string(value).move_to(__variables); + s_value.move_to(__variables); + } + if (is_thread_global) cimg::mutex(30,0); + return __variables[ind].data(); +} + +const char *gmic::set_variable(const char *const name, const CImg& value, + const unsigned int *const variables_sizes) { + if (!name || !value) return ""; + bool is_name_found = false; + CImg s_value((char*)value.data(),value.width(),value.height(),value.depth(),value.spectrum(),true); + int ind = 0; + const bool + is_global = *name=='_', + is_thread_global = is_global && name[1]=='_'; + if (is_thread_global) cimg::mutex(30); + const unsigned int hash = hashcode(name,true); + const int lind = is_global || !variables_sizes?0:(int)variables_sizes[hash]; + CImgList + &__variables = *variables[hash], + &__variables_names = *variables_names[hash]; + + // Retrieve index of current definition. + for (int l = __variables.width() - 1; l>=lind; --l) if (!std::strcmp(__variables_names[l],name)) { + is_name_found = true; ind = l; break; + } + if (is_name_found) s_value.move_to(__variables[ind]); // Update variable + else { // New variable + ind = __variables.width(); + CImg::string(name).move_to(__variables_names); + s_value.move_to(__variables); } if (is_thread_global) cimg::mutex(30,0); return __variables[ind].data(); @@ -2798,17 +3209,34 @@ // Add custom commands from a char* buffer. //------------------------------------------ gmic& gmic::add_commands(const char *const data_commands, const char *const commands_file, - unsigned int *count_new, unsigned int *count_replaced) { + unsigned int *count_new, unsigned int *count_replaced, + bool *const is_entrypoint) { if (!data_commands || !*data_commands) return *this; cimg::mutex(23); CImg s_body(256*1024), s_line(256*1024), s_name(256), debug_info(32); - unsigned int line_number = 1, pos = 0; + unsigned int line_number = 0, pos = 0; bool is_last_slash = false, _is_last_slash = false, is_newline = false; int hash = -1, l_debug_info = 0; char sep = 0; - if (commands_file) CImg::string(commands_file).move_to(commands_files); + if (commands_file) { + CImg::string(commands_file).move_to(commands_files); + + CImgList ltmp(commands_files.size()); // Update global variable '$_path_commands'. + CImg tmp; + (commands_files>'x').move_to(tmp); + tmp.resize(tmp.width() + 4,1,1,1,0,0,1); + tmp[0] = 'G'; tmp[1] = 'M'; tmp[2] = 'Z'; tmp[3] = 0; + tmp.unroll('y').move_to(ltmp); + ltmp.get_serialize(false).unroll('x').move_to(tmp); + const char *const _command_files = "_path_commands"; + tmp.resize(tmp.width() + 9 + std::strlen(_command_files),1,1,1,0,0,1); + std::sprintf((char*)tmp.data(),"%c*store/%s",gmic_store,_command_files); + set_variable(_command_files,tmp,0); + } if (count_new) *count_new = 0; if (count_replaced) *count_replaced = 0; + if (is_entrypoint) *is_entrypoint = false; + if (*data_commands) line_number = 1; for (const char *data = data_commands; *data; is_last_slash = _is_last_slash, line_number+=is_newline?1:0) { @@ -2819,19 +3247,17 @@ if (_line=s_line && *linee==' ') --linee; + while (linee>=s_line && is_blank(*linee)) --linee; *(linee + 1) = 0; - char *lines = s_line; while (*lines==' ') ++lines; // Remove useless leading spaces + char *lines = s_line; while (is_blank(*lines)) ++lines; // Remove useless leading spaces if (!*lines) continue; // Empty line // Check if last character is a '\'... @@ -2841,11 +3267,14 @@ if (!*lines) continue; // Empty line found *s_name = *s_body = 0; - if (!is_last_slash && std::strchr(lines,':') && // Check for a command definition - cimg_sscanf(lines,"%255[a-zA-Z0-9_] %c %262143[^\n]",s_name.data(),&sep,s_body.data())>=2 && - (*lines<'0' || *lines>'9') && sep==':') { + if ((!is_last_slash && std::strchr(lines,':') && // Check for a command definition (or implicit '_main_') + cimg_sscanf(lines,"%255[a-zA-Z0-9_] %c %262143[^\n]",s_name.data(),&sep,s_body.data())>=2 && + (*lines<'0' || *lines>'9') && sep==':') || ((*s_name=0), hash<0)) { + CImg body = CImg::string(hash<0 && !*s_name?lines:s_body); + if (hash<0 && !*s_name) std::strcpy(s_name,"_main_"); + if (is_entrypoint && !std::strcmp(s_name,"_main_")) *is_entrypoint = true; hash = (int)hashcode(s_name,false); - CImg body = CImg::string(s_body); + if (commands_file) { // Insert debug info code in body if (commands_files.width()<2) l_debug_info = cimg_snprintf(debug_info.data() + 1,debug_info.width() - 2,"%x",line_number); @@ -2868,7 +3297,6 @@ body.move_to(commands[hash][pos]); } else { // Continuation of a previous line - if (hash<0) error("Command 'command': Syntax error in expression '%s'.",lines); if (!is_last_slash) commands[hash][pos].back() = ' '; else --(commands[hash][pos]._width); const CImg body = CImg(lines,(unsigned int)(linee - lines + 2)); @@ -2904,8 +3332,9 @@ // Add commands from a file. //--------------------------- -gmic& gmic::add_commands(std::FILE *const file, const char *const filename, - unsigned int *count_new, unsigned int *count_replaced) { +gmic& gmic::add_commands(std::FILE *const file, const char *const commands_file, + unsigned int *count_new, unsigned int *count_replaced, + bool *const is_entrypoint) { if (!file) return *this; // Try reading it first as a .cimg file. @@ -2913,8 +3342,8 @@ CImg buffer; buffer.load_cimg(file).unroll('x'); buffer.resize(buffer.width() + 1,1,1,1,0); - add_commands(buffer.data(),filename,count_new,count_replaced); - } catch (...) { + add_commands(buffer.data(),commands_file,count_new,count_replaced,is_entrypoint); + } catch (...) { // If failed, read as a text file std::rewind(file); std::fseek(file,0,SEEK_END); const cimg_long siz = std::ftell(file); @@ -2923,7 +3352,7 @@ CImg buffer((unsigned int)siz + 1); if (std::fread(buffer.data(),sizeof(char),siz,file)) { buffer[siz] = 0; - add_commands(buffer.data(),filename,count_new,count_replaced); + add_commands(buffer.data(),commands_file,count_new,count_replaced,is_entrypoint); } } } @@ -2932,21 +3361,20 @@ // Return subset indices from a selection string. //----------------------------------------------- -CImg gmic::selection2cimg(const char *const string, const unsigned int indice_max, +CImg gmic::selection2cimg(const char *const string, const unsigned int index_max, const CImgList& names, - const char *const command, const bool is_selection, - CImg *const new_name) { + const char *const command, const bool is_selection) { - // Try to detect common cases to be faster. + // First, try to detect the most common cases. if (string && !*string) return CImg(); // Empty selection if (!string || (*string=='^' && !string[1])) { // Whole selection - CImg res(1,indice_max); cimg_forY(res,y) res[y] = (unsigned int)y; return res; + CImg res(1,index_max); cimg_forY(res,y) res[y] = (unsigned int)y; return res; } else if (*string>='0' && *string<='9' && !string[1]) { // Single positive digit const unsigned int ind = *string - '0'; - if (ind::vector(ind); + if (ind::vector(ind); } else if (*string=='-' && string[1]>='0' && string[2]<='9' && !string[2]) { // Single negative digit - const unsigned int ind = indice_max - string[1] + '0'; - if (ind::vector(ind); + const unsigned int ind = index_max - string[1] + '0'; + if (ind::vector(ind); } // Manage remaining cases. @@ -2955,90 +3383,91 @@ ctypel = is_selection?'[':'\'', ctyper = is_selection?']':'\''; - CImg is_selected(1,indice_max,1,1,false); + CImg is_selected(1,index_max,1,1,false); CImg name, item; bool is_inverse = *string=='^'; const char *it = string + (is_inverse?1:0); for (bool stopflag = false; !stopflag; ) { float ind0 = 0, ind1 = 0, step = 1; - int iind0 = 0, iind1 = 0; + int iind0 = 0, iind1 = 0, istep = 1; bool is_label = false; char sep = 0; - name.assign(256); const char *const it_comma = std::strchr(it,','); if (it_comma) { item.assign(it,(unsigned int)(it_comma - it + 1)); item.back() = 0; it = it_comma + 1; } else { CImg::string(it).move_to(item); stopflag = true; } - char end, *const it_colon = std::strchr(item,':'); + char end, *it_colon = std::strchr(item,':'); if (it_colon) { - *it_colon = 0; - if (cimg_sscanf(it_colon + 1,"%f%c",&step,&end)!=1 || step<=0) - error("Command '%s': Invalid %s %c%s%c (syntax error after colon ':').", + *(it_colon++) = sep = 0; + if ((cimg_sscanf(it_colon,"%f%c",&step,&end)==1 || + cimg_sscanf(it_colon,"%f%c%c",&step,&sep,&end)==2) && + (!sep || sep=='%') && step>0) { + if (sep=='%') step*=index_max/100.0f; + } else step = 0; + istep = (int)cimg::round(step); + if (istep<=0) + error(true,"Command '%s': Invalid %s %c%s%c (syntax error after colon ':').", command,stype,ctypel,string,ctyper); } + if (!*item) { // Particular cases [:N] or [^:N] if (is_inverse) { iind0 = 0; iind1 = -1; is_inverse = false; } else continue; - } else if (cimg_sscanf(item,"%f%c",&ind0,&end)==1) { // Single indice + } else if (cimg_sscanf(item,"%f%c",&ind0,&end)==1) { // Single index iind1 = iind0 = (int)cimg::round(ind0); } else if (cimg_sscanf(item,"%f-%f%c",&ind0,&ind1,&end)==2) { // Sequence between 2 indices iind0 = (int)cimg::round(ind0); iind1 = (int)cimg::round(ind1); - } else if (cimg_sscanf(item,"%255[a-zA-Z0-9_]%c",name.data(),&end)==1 && // Label + } else if (cimg_sscanf(item,"%255[a-zA-Z0-9_]%c",name.assign(256).data(),&end)==1 && // Label (*name<'0' || *name>'9')) { cimglist_for(names,l) if (names[l] && !std::strcmp(names[l],name)) { is_selected(l) = true; is_label = true; } - if (!is_label) { - if (new_name) { - iind0 = iind1 = -1; - CImg::string(name).move_to(*new_name); - } else error("Command '%s': Invalid %s %c%s%c (undefined label '%s').", - command,stype,ctypel,string,ctyper,name.data()); - } + if (!is_label) + error(true,"Command '%s': Invalid %s %c%s%c (undefined label '%s').", + command,stype,ctypel,string,ctyper,name.data()); } else if (cimg_sscanf(item,"%f%c%c",&ind0,&sep,&end)==2 && sep=='%') { // Single percent - iind1 = iind0 = (int)cimg::round(ind0*((int)indice_max - 1)/100) - (ind0<0?1:0); + iind1 = iind0 = (int)cimg::round(ind0*((int)index_max - 1)/100) - (ind0<0?1:0); } else if (cimg_sscanf(item,"%f%%-%f%c%c",&ind0,&ind1,&sep,&end)==3 && sep=='%') { // Sequence between 2 percents. - iind0 = (int)cimg::round(ind0*((int)indice_max - 1)/100) - (ind0<0?1:0); - iind1 = (int)cimg::round(ind1*((int)indice_max - 1)/100) - (ind1<0?1:0); + iind0 = (int)cimg::round(ind0*((int)index_max - 1)/100) - (ind0<0?1:0); + iind1 = (int)cimg::round(ind1*((int)index_max - 1)/100) - (ind1<0?1:0); } else if (cimg_sscanf(item,"%f%%-%f%c",&ind0,&ind1,&end)==2) { - // Sequence between a percent and an indice. - iind0 = (int)cimg::round(ind0*((int)indice_max - 1)/100) - (ind0<0?1:0);; + // Sequence between a percent and an index. + iind0 = (int)cimg::round(ind0*((int)index_max - 1)/100) - (ind0<0?1:0); iind1 = (int)cimg::round(ind1); } else if (cimg_sscanf(item,"%f-%f%c%c",&ind0,&ind1,&sep,&end)==3 && sep=='%') { - // Sequence between an indice and a percent. + // Sequence between an index and a percent. iind0 = (int)cimg::round(ind0); - iind1 = (int)cimg::round(ind1*((int)indice_max - 1)/100) - (ind1<0?1:0);; - } else error("Command '%s': Invalid %s %c%s%c.", + iind1 = (int)cimg::round(ind1*((int)index_max - 1)/100) - (ind1<0?1:0); + } else error(true,"Command '%s': Invalid %s %c%s%c.", command,stype,ctypel,string,ctyper); - if (!indice_max) error("Command '%s': Invalid %s %c%s%c (no data available).", - command,stype,ctypel,string,ctyper); + if (!index_max) error(true,"Command '%s': Invalid %s %c%s%c (no data available).", + command,stype,ctypel,string,ctyper); if (!is_label) { int - uind0 = (int)(iind0<0?iind0 + indice_max:iind0), - uind1 = (int)(iind1<0?iind1 + indice_max:iind1); + uind0 = (int)(iind0<0?iind0 + index_max:iind0), + uind1 = (int)(iind1<0?iind1 + index_max:iind1); if (uind0>uind1) { cimg::swap(uind0,uind1); cimg::swap(iind0,iind1); } - if (uind0<0 || uind0>=(int)indice_max) - error("Command '%s': Invalid %s %c%s%c (contains indice '%d', " + if (uind0<0 || uind0>=(int)index_max) + error(true,"Command '%s': Invalid %s %c%s%c (contains index '%d', " "not in range -%u...%u).", - command,stype,ctypel,string,ctyper,iind0,indice_max,indice_max - 1); - if (uind1<0 || uind1>=(int)indice_max) - error("Command '%s': Invalid %s %c%s%c (contains indice '%d', " + command,stype,ctypel,string,ctyper,iind0,index_max,index_max - 1); + if (uind1<0 || uind1>=(int)index_max) + error(true,"Command '%s': Invalid %s %c%s%c (contains index '%d', " "not in range -%u...%u).", - command,stype,ctypel,string,ctyper,iind1,indice_max,indice_max - 1); - const int istep = (int)cimg::round(step); + command,stype,ctypel,string,ctyper,iind1,index_max,index_max - 1); for (int l = uind0; l<=uind1; l+=istep) is_selected[l] = true; } } - unsigned int indice = 0; - cimg_for(is_selected,p,bool) if (*p) ++indice; - CImg selection(1,is_inverse?indice_max - indice:indice); - indice = 0; - if (is_inverse) { cimg_forY(is_selected,l) if (!is_selected[l]) selection[indice++] = (unsigned int)l; } - else cimg_forY(is_selected,l) if (is_selected[l]) selection[indice++] = (unsigned int)l; + unsigned int index = 0; + cimg_for(is_selected,p,bool) if (*p) ++index; + CImg selection(1,is_inverse?index_max - index:index); + index = 0; + if (is_inverse) { cimg_forY(is_selected,l) if (!is_selected[l]) selection[index++] = (unsigned int)l; } + else cimg_forY(is_selected,l) if (is_selected[l]) selection[index++] = (unsigned int)l; return selection; } @@ -3135,7 +3564,7 @@ template gmic& gmic::print(const CImgList& list, const CImg *const callstack_selection, const char *format, ...) { - if (verbosity<0 && !is_debug) return *this; + if (verbosity<1 && !is_debug) return *this; va_list ap; va_start(ap,format); CImg message(65536); @@ -3147,14 +3576,15 @@ // Display message. cimg::mutex(29); - if (*message!='\r') - for (unsigned int i = 0; i gmic& gmic::warn(const CImgList& list, const CImg *const callstack_selection, const bool force_visible, const char *const format, ...) { - if (!force_visible && verbosity<0 && !is_debug) return *this; + if (!force_visible && verbosity<1 && !is_debug) return *this; va_list ap; va_start(ap,format); CImg message(1024); @@ -3204,7 +3634,8 @@ // Print error message, and quit interpreter. //------------------------------------------- template -gmic& gmic::error(const CImgList& list, const CImg *const callstack_selection, +gmic& gmic::error(const bool output_header, const CImgList& list, + const CImg *const callstack_selection, const char *const command, const char *const format, ...) { va_list ap; va_start(ap,format); @@ -3217,22 +3648,28 @@ // Display message. const CImg s_callstack = callstack2string(callstack_selection); - if (verbosity>=0 || is_debug) { + if (verbosity>=1 || is_debug) { cimg::mutex(29); if (*message!='\r') for (unsigned int i = 0; i +bool gmic::check_cond(const char *const expr, CImgList& images, const char *const command) { + CImg &img = images.size()?images.back():CImg::empty(); + bool res = false; + float _res = 0; + if (img.__eval(expr,_res)) return (bool)_res; + CImg _expr(expr,(unsigned int)std::strlen(expr) + 1); + strreplace_fw(_expr); + try { if (img.eval(_expr,0,0,0,0,&images,&images)) res = true; } + catch (CImgException &e) { + const char *const e_ptr = std::strstr(e.what(),": "); + error(true,images,0,command, + "Command '%s': Invalid argument '%s': %s", + command,cimg::strellipsize(_expr,64,false),e_ptr?e_ptr + 2:e.what()); + } + return res; +} + +#define arg_error(command) gmic::error(true,images,0,command,"Command '%s': Invalid argument '%s'.",\ command,gmic_argument_text()) // Print debug message. @@ -3288,16 +3743,14 @@ cimg::t_green,list.size(),callstack2string(true).data()); for (char *s = message; *s; ++s) { char c = *s; - if (c<' ') { - switch (c) { + if (c>=gmic_dollar && c<=gmic_dquote) switch (c) { case gmic_dollar : std::fprintf(cimg::output(),"\\$"); break; case gmic_lbrace : std::fprintf(cimg::output(),"\\{"); break; case gmic_rbrace : std::fprintf(cimg::output(),"\\}"); break; case gmic_comma : std::fprintf(cimg::output(),"\\,"); break; case gmic_dquote : std::fprintf(cimg::output(),"\\\""); break; default : std::fputc(c,cimg::output()); - } - } else std::fputc(c,cimg::output()); + } else std::fputc(c,cimg::output()); } std::fprintf(cimg::output(), "%s", @@ -3330,10 +3783,10 @@ const CImg& gmic::check_image(const CImgList& list, const CImg& img) { #ifdef gmic_check_image if (!img.is_shared() || gmic_is_valid_pointer(img.data())) return img; - if (is_debug) error(list,0,0,"Image list contains an invalid shared image (%p,%d,%d,%d,%d) " + if (is_debug) error(true,list,0,0,"Image list contains an invalid shared image (%p,%d,%d,%d,%d) " "(references a deallocated buffer).", img.data(),img.width(),img.height(),img.depth(),img.spectrum()); - else error(list,0,0,"Image list contains an invalid shared image (%d,%d,%d,%d) " + else error(true,list,0,0,"Image list contains an invalid shared image (%d,%d,%d,%d) " "(references a deallocated buffer).", img.width(),img.height(),img.depth(),img.spectrum()); #else // #ifdef gmic_check_image @@ -3397,12 +3850,14 @@ setlocale(LC_NUMERIC,"C"); cimg_exception_mode = cimg::exception_mode(); cimg::exception_mode(0); + allow_entrypoint = false; is_debug = false; is_double3d = true; nb_carriages = 0; verbosity = 0; render3d = 4; renderd3d = -1; + network_timeout = 0; focale3d = 700; light3d.assign(); light3d_x = light3d_y = 0; @@ -3410,13 +3865,15 @@ specular_lightness3d = 0.15f; specular_shininess3d = 0.8f; starting_commands_line = commands_line; - reference_time = (unsigned long)cimg::time(); + reference_time = cimg::time(); if (is_first) { -#if cimg_display!=0 try { is_display_available = (bool)CImgDisplay::screen_width(); } catch (CImgDisplayException&) { } -#endif is_first = false; } + if (is_display_available) { + display_windows.assign(gmic_winslots); + cimg_forX(display_windows,l) display_windows[l] = new CImgDisplay; + } for (unsigned int l = 0; l str(8); + + set_variable("_path_rc",gmic::path_rc(),0); + set_variable("_path_user",gmic::path_user(),0); + cimg_snprintf(str,str.width(),"%u",cimg::nb_cpus()); - set_variable("_cpus",str,0); + set_variable("_cpus",str.data(),0); + + cimg_snprintf(str,str.width(),"%u",gmic_version); + set_variable("_version",str.data(),0); #if cimg_OS==1 cimg_snprintf(str,str.width(),"%u",(unsigned int)getpid()); @@ -3443,22 +3907,20 @@ #else // #if cimg_OS==1 cimg_snprintf(str,str.width(),"0"); #endif // #if cimg_OS==1 - set_variable("_pid",str,0); - -#ifdef gmic_prerelease - set_variable("_prerelease",gmic_prerelease,0); -#endif // #ifdef gmic_prerelease - - cimg_snprintf(str,str.width(),"%u",gmic_version); - set_variable("_version",str,0); - - set_variable("_path_rc",gmic::path_rc(),0); - set_variable("_path_user",gmic::path_user(),0); + set_variable("_pid",str.data(),0); #ifdef cimg_use_vt100 set_variable("_vt100","1",0); +#else + set_variable("_vt100","0",0); #endif // # if cimg_use_vt100 +#ifdef gmic_prerelease + set_variable("_prerelease",gmic_prerelease,0); +#else + set_variable("_prerelease","0",0); +#endif // #ifdef gmic_prerelease + // Launch the G'MIC interpreter. const CImgList items = commands_line?commands_line_to_CImgList(commands_line):CImgList::empty(); try { @@ -3479,7 +3941,7 @@ if (is_header) print(images,0,"Print image []."); return *this; } - const bool is_verbose = verbosity>=0 || is_debug; + const bool is_verbose = verbosity>=1 || is_debug; CImg title(256); if (is_header) { CImg gmic_selection, gmic_names; @@ -3496,13 +3958,15 @@ cimg_forY(selection,l) { const unsigned int uind = selection[l]; const CImg& img = images[uind]; + const int o_verbosity = verbosity; + const bool o_is_debug = is_debug; bool is_valid = true; - int _verbosity = verbosity; - bool _is_debug = is_debug; - verbosity = -1; is_debug = false; + verbosity = 0; + is_debug = false; try { gmic_check(img); } catch (gmic_exception&) { is_valid = false; } - verbosity = _verbosity; is_debug = _is_debug; + is_debug = o_is_debug; + verbosity = o_verbosity; cimg_snprintf(title,title.width(),"[%u] = '%s'", uind,images_names[uind].data()); cimg::strellipsize(title,80,false); @@ -3520,7 +3984,7 @@ const CImg& selection, unsigned int *const XYZ, const bool exit_on_anykey) { if (!images || !images_names || !selection) { print(images,0,"Display image []."); return *this; } - const bool is_verbose = verbosity>=0 || is_debug; + const bool is_verbose = verbosity>=1 || is_debug; CImg gmic_selection; if (is_verbose) selection2string(selection,images_names,1,gmic_selection); @@ -3540,18 +4004,18 @@ return *this; } -#if cimg_display!=0 - CImgDisplay *const _display_windows = (CImgDisplay*)display_windows; CImgList visu; CImgList t_visu; CImg is_valid(1,selection.height(),1,1,true); cimg_forY(selection,l) { const CImg& img = images[selection[l]]; - int _verbosity = verbosity; - bool _is_debug = is_debug; - verbosity = -1; is_debug = false; + const int o_verbosity = verbosity; + const bool o_is_debug = is_debug; + verbosity = 0; + is_debug = false; try { gmic_check(img); } catch (gmic_exception&) { is_valid[l] = false; } - verbosity = _verbosity; is_debug = _is_debug; + is_debug = o_is_debug; + verbosity = o_verbosity; } CImg s_tmp; @@ -3584,7 +4048,7 @@ } if (visu) { - CImgDisplay _disp, &disp = _display_windows[0]?_display_windows[0]:_disp; + CImgDisplay _disp, &disp = display_window(0)?display_window(0):_disp; CImg title(256); if (visu.size()==1) cimg_snprintf(title,title.width(),"%s (%dx%dx%dx%d)", @@ -3601,11 +4065,15 @@ } print_images(images,images_names,selection,false); bool is_exit = false; - visu._display(disp,0,&t_visu,false,'x',0.5f,XYZ,exit_on_anykey,0,true,is_exit); - + try { + visu._gmic_display(disp,0,&t_visu,false,'x',0.5f,XYZ,exit_on_anykey,0,true,is_exit, + *this,visu,t_visu); + } catch (CImgDisplayException&) { + try { error(true,images,0,"display","Unable to display image '%s'.",gmic_names.data()); } + catch (gmic_exception&) {} + } cimglist_for(visu,l) visu[l]._is_shared = is_shared(l); } -#endif // #if cimg_display!=0 return *this; } @@ -3619,7 +4087,7 @@ const double ymin, const double ymax, const bool exit_on_anykey) { if (!images || !images_names || !selection) { print(images,0,"Plot image []."); return *this; } - const bool is_verbose = verbosity>=0 || is_debug; + const bool is_verbose = verbosity>=1 || is_debug; CImg gmic_selection; if (is_verbose) selection2string(selection,images_names,1,gmic_selection); @@ -3632,8 +4100,6 @@ return *this; } -#if cimg_display!=0 - CImgDisplay *const _display_windows = (CImgDisplay*)display_windows; CImgList empty_indices; cimg_forY(selection,l) if (!gmic_check(images[selection(l)])) CImg::vector(selection(l)).move_to(empty_indices); @@ -3650,7 +4116,7 @@ print(images,0,"Plot image%s = '%s'.", gmic_selection.data(),gmic_names.data()); - CImgDisplay _disp, &disp = _display_windows[0]?_display_windows[0]:_disp; + CImgDisplay _disp, &disp = display_window(0)?display_window(0):_disp; bool is_first_line = false; cimg_forY(selection,l) { const unsigned int uind = selection[l]; @@ -3672,86 +4138,11 @@ if (is_verbose) nb_carriages = 0; } } -#endif // #if cimg_display!=0 return *this; } -// Display selected 3D objects. -//----------------------------- -template -gmic& gmic::display_objects3d(const CImgList& images, const CImgList& images_names, - const CImg& selection, - const CImg& background3d, - const bool exit_on_anykey) { - if (!images || !images_names || !selection) { - print(images,0,"Display 3D object []."); - return *this; - } - const bool is_verbose = verbosity>=0 || is_debug; - CImg gmic_selection; - if (is_verbose) selection2string(selection,images_names,1,gmic_selection); - CImg error_message(1024); - cimg_forY(selection,l) if (!gmic_check(images[selection[l]]).is_CImg3d(true,error_message)) - error(images,0,0, - "Command 'display3d': Invalid 3D object [%d] in selected image%s (%s).", - selection[l],gmic_selection_err.data(),error_message.data()); - - // Check for available display. - if (!is_display_available) { - cimg::unused(background3d,exit_on_anykey); - print(images,0,"Display 3D object%s (skipped, no display %s).", - gmic_selection.data(),cimg_display?"available":"support"); - return *this; - } - -#if cimg_display!=0 - CImgDisplay *const _display_windows = (CImgDisplay*)display_windows; - CImgDisplay _disp, &disp = _display_windows[0]?_display_windows[0]:_disp; - cimg_forY(selection,l) { - const unsigned int uind = selection[l]; - const CImg& img = images[uind]; - if (!disp) { - if (background3d) disp.assign(cimg_fitscreen(background3d.width(),background3d.height(),1),0,0); - else disp.assign(cimg_fitscreen(CImgDisplay::screen_width()/2,CImgDisplay::screen_height()/2,1),0,0); - } - - CImg background; - if (background3d) background = background3d.get_resize(disp.width(),disp.height(),1,3); - else background.assign(1,2,1,3).fill(32,64,32,116,64,96).resize(1,256,1,3,3). - resize(disp.width(),disp.height(),1,3); - background.display(disp); - - CImgList primitives; - CImgList colors; - CImgList opacities; - CImg vertices(img,false), pose3d(4,4,1,1,0); - pose3d(0,0) = pose3d(1,1) = pose3d(2,2) = pose3d(3,3) = 1; - vertices.CImg3dtoobject3d(primitives,colors,opacities,false); - print(images,0,"Display 3D object [%u] = '%s' (%d vertices, %u primitives).", - uind,images_names[uind].data(), - vertices.width(),primitives.size()); - disp.set_title("%s (%d vertices, %u primitives)", - basename(images_names[uind]), - vertices.width(),primitives.size()); - if (light3d) colors.insert(light3d,~0U,true); - background.display_object3d(disp,vertices,primitives,colors,opacities, - true,render3d,renderd3d,is_double3d,focale3d, - light3d_x,light3d_y,light3d_z, - specular_lightness3d,specular_shininess3d, - true,pose3d,exit_on_anykey); - print(images,0,"Selected 3D pose = [ %g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g ].", - pose3d[0],pose3d[1],pose3d[2],pose3d[3], - pose3d[4],pose3d[5],pose3d[6],pose3d[7], - pose3d[8],pose3d[9],pose3d[10],pose3d[11], - pose3d[12],pose3d[13],pose3d[14],pose3d[15]); - if (disp.is_closed()) break; - } -#endif // #if cimg_display!=0 - return *this; -} - -// Substitute '{}' and '$' expressions in a string. -//-------------------------------------------------- +// Substitute '{}' and '$' expressions in a string. +//-------------------------------------------------- template CImg gmic::substitute_item(const char *const source, CImgList& images, CImgList& images_names, @@ -3759,9 +4150,6 @@ const unsigned int *const variables_sizes, const CImg *const command_selection, const bool is_image_expr) { -#if cimg_display!=0 - CImgDisplay *const _display_windows = (CImgDisplay*)display_windows; -#endif // #if cimg_display!=0 if (!source) return CImg(); CImg substituted_items(64), inbraces, substr(40), vs; char *ptr_sub = substituted_items.data(); @@ -3790,15 +4178,15 @@ unsigned int p = 0, N = 0; if (nsource==source || *(nsource - 1)==',') { if (!nsource[1] || nsource[1]==',' || - (nsource==source && nsource[1]=='x' && nsource[2]>='0' && nsource[2]<='9' && + (nsource[1]=='x' && nsource[2]>='0' && nsource[2]<='9' && cimg_sscanf(nsource + 2,"%u%c",&p,&(sep=0))==1)) { str = "[-1]"; N = 1; } else if (nsource[1]=='.') { if (!nsource[2] || nsource[2]==',' || - (nsource==source && nsource[2]=='x' && nsource[3]>='0' && nsource[3]<='9' && + (nsource[2]=='x' && nsource[3]>='0' && nsource[3]<='9' && cimg_sscanf(nsource + 3,"%u%c",&p,&(sep=0))==1)) { str = "[-2]"; N = 2; } else if (nsource[2]=='.') { if (!nsource[3] || nsource[3]==',' || - (nsource==source && nsource[3]=='x' && nsource[4]>='0' && nsource[4]<='9' && + (nsource[3]=='x' && nsource[4]>='0' && nsource[4]<='9' && cimg_sscanf(nsource + 4,"%u%c",&p,&(sep=0))==1)) { str = "[-3]"; N = 3; } } } @@ -3810,6 +4198,7 @@ // '{...}' expression. } else if (*nsource=='{') { const char *const ptr_beg = nsource + 1, *ptr_end = ptr_beg; + char delimiter = 0; unsigned int p = 0; for (p = 1; p>0 && *ptr_end; ++ptr_end) { if (*ptr_end=='{') ++p; if (*ptr_end=='}') --p; } if (p) { @@ -3817,16 +4206,24 @@ continue; } l_inbraces = (int)(ptr_end - ptr_beg - 1); - if (l_inbraces>0) { + if ((*ptr_beg!='`' || ptr_beg[1]!='`') && *ptr_beg!='/' && + l_inbraces>2 && ptr_beg[l_inbraces - 2]==':') { + const char del = ptr_beg[l_inbraces - 1]; + if (del==',' || del==';' || del=='/' || del=='^' || del==' ') { + delimiter = del; + l_inbraces-=2; + } + } inbraces.assign(ptr_beg,l_inbraces + 1).back() = 0; substitute_item(inbraces,images,images_names,parent_images,parent_images_names,variables_sizes, command_selection,false).move_to(inbraces); strreplace_fw(inbraces); } - nsource+=l_inbraces + 2; + nsource+=l_inbraces + 2 + (delimiter?2:0); + if (!delimiter) delimiter = ','; if (!*inbraces) - error(images,0,0, + error(true,images,0,0, "Item substitution '{}': Empty braces."); // Display window features. @@ -3835,148 +4232,151 @@ (inbraces[1]>='0' && inbraces[1]<='9' && !inbraces[2]) || (inbraces[1]==',' && inbraces[2]) || (inbraces[1]>='0' && inbraces[1]<='9' && inbraces[2]==',' && inbraces[3]))) { -#if cimg_display==0 - *substr = '0'; substr[1] = 0; - is_substituted = true; -#else // #if cimg_display==0 + + char *feature = inbraces.data() + 1; unsigned int wind = 0; - const char *feature = inbraces.data() + 1; if (*feature>='0' && *feature<='9') wind = (unsigned int)(*(feature++) - '0'); - CImgDisplay &disp = _display_windows[wind]; - + char *e_feature = 0; if (!*feature) { - cimg_snprintf(substr,substr.width(),"%d",disp?(disp.is_closed()?0:1):0); + if (!is_display_available) { *substr = '0'; substr[1] = 0; } + else cimg_snprintf(substr,substr.width(),"%d", + (int)(display_window(wind) && !display_window(wind).is_closed())); is_substituted = true; - } else if (*feature==',') { - bool flush_request = false; - if (*(++feature)=='-' && - feature[1]!='w' && feature[1]!='h' && feature[1]!='d' && feature[1]!='e' && - feature[1]!='u' && feature[1]!='v' && feature[1]!='n' && feature[1]!='t') { - flush_request = true; ++feature; - } - if (!feature[1]) switch (*feature) { // Single-char features - case 'w' : // Display width - cimg_snprintf(substr,substr.width(),"%d",disp.width()); - is_substituted = true; - break; - case 'h' : // Display height - cimg_snprintf(substr,substr.width(),"%d",disp.height()); - is_substituted = true; - break; - case 'd' : // Window width - cimg_snprintf(substr,substr.width(),"%d",disp.window_width()); - is_substituted = true; - break; - case 'e' : // Window height - cimg_snprintf(substr,substr.width(),"%d",disp.window_height()); - is_substituted = true; - break; - case 'u' : // Screen width - try { - cimg_snprintf(substr,substr.width(),"%d",CImgDisplay::screen_width()); - } catch (CImgDisplayException&) { - *substr = '0'; substr[1] = 0; + } else if (*(feature++)==',') { + do { + is_substituted = false; + e_feature = std::strchr(feature,','); + if (e_feature) *e_feature = 0; + if (!is_display_available) { *substr = '0'; substr[1] = 0; is_substituted = true; } + else { + CImgDisplay &disp = display_window(wind); + bool flush_request = false; + if (*feature=='-' && + feature[1]!='w' && feature[1]!='h' && feature[1]!='d' && feature[1]!='e' && + feature[1]!='u' && feature[1]!='v' && feature[1]!='n' && feature[1]!='t') { + flush_request = true; ++feature; } - is_substituted = true; - break; - case 'v' : // Screen height - try { - cimg_snprintf(substr,substr.width(),"%d",CImgDisplay::screen_height()); - } catch (CImgDisplayException&) { - *substr = '0'; substr[1] = 0; + if (!*feature) { // Empty feature + cimg_snprintf(substr,substr.width(),"%d",disp?(disp.is_closed()?0:1):0); + is_substituted = true; + } else if (*feature && !feature[1]) switch (*feature) { // Single-char features + case 'w' : // Display width + cimg_snprintf(substr,substr.width(),"%d",disp.width()); + is_substituted = true; + break; + case 'h' : // Display height + cimg_snprintf(substr,substr.width(),"%d",disp.height()); + is_substituted = true; + break; + case 'd' : // Window width + cimg_snprintf(substr,substr.width(),"%d",disp.window_width()); + is_substituted = true; + break; + case 'e' : // Window height + cimg_snprintf(substr,substr.width(),"%d",disp.window_height()); + is_substituted = true; + break; + case 'f' : // Is fullscreen? + cimg_snprintf(substr,substr.width(),"%d",disp.is_fullscreen()); + is_substituted = true; + break; + case 'u' : // Screen width + try { + cimg_snprintf(substr,substr.width(),"%d",CImgDisplay::screen_width()); + } catch (CImgDisplayException&) { + *substr = '0'; substr[1] = 0; + } + is_substituted = true; + break; + case 'v' : // Screen height + try { + cimg_snprintf(substr,substr.width(),"%d",CImgDisplay::screen_height()); + } catch (CImgDisplayException&) { + *substr = '0'; substr[1] = 0; + } + is_substituted = true; + break; + case 'n' : // Normalization type + cimg_snprintf(substr,substr.width(),"%d",disp.normalization()); + is_substituted = true; + break; + case 't' : // Window title + cimg_snprintf(substr,substr.width(),"%s",disp.title()); + is_substituted = true; + break; + case 'x' : // X-coordinate of mouse pointer + cimg_snprintf(substr,substr.width(),"%d",disp.mouse_x()); + is_substituted = true; + if (flush_request) { disp._mouse_x = -1; disp._mouse_y = -1; } + break; + case 'y' : // Y-coordinate of mouse pointer + cimg_snprintf(substr,substr.width(),"%d",disp.mouse_y()); + is_substituted = true; + if (flush_request) { disp._mouse_x = -1; disp._mouse_y = -1; } + break; + case 'b' : // State of mouse buttons + cimg_snprintf(substr,substr.width(),"%d",disp.button()); + is_substituted = true; + if (flush_request) disp._button = 0; + break; + case 'o' : // State of mouse wheel + cimg_snprintf(substr,substr.width(),"%d",disp.wheel()); + is_substituted = true; + if (flush_request) disp._wheel = 0; + break; + case 'c' : // Closed state of display window + cimg_snprintf(substr,substr.width(),"%d",(int)disp.is_closed()); + is_substituted = true; + if (flush_request) disp._is_closed = false; + break; + case 'r' : // Resize event + cimg_snprintf(substr,substr.width(),"%d",(int)disp.is_resized()); + is_substituted = true; + if (flush_request) disp._is_resized = false; + break; + case 'm' : // Move event + cimg_snprintf(substr,substr.width(),"%d",(int)disp.is_moved()); + is_substituted = true; + if (flush_request) disp._is_moved = false; + break; + case 'k' : // Key event + cimg_snprintf(substr,substr.width(),"%u",disp.key()); + is_substituted = true; + if (flush_request) disp._keys[0] = 0; + break; + } else if (*feature=='w' && feature[1]=='h' && !feature[2]) { // Display width*height + cimg_snprintf(substr,substr.width(),"%lu", + (unsigned long)disp.width()*disp.height()); + is_substituted = true; + } else if (*feature=='d' && feature[1]=='e' && !feature[2]) { // Window width*height + cimg_snprintf(substr,substr.width(),"%lu", + (unsigned long)disp.window_width()*disp.window_height()); + is_substituted = true; + } else if (*feature=='u' && feature[1]=='v' && !feature[2]) { // Screen width*height + try { + cimg_snprintf(substr,substr.width(),"%lu", + (unsigned long)CImgDisplay::screen_width()*CImgDisplay::screen_height()); + } catch (CImgDisplayException&) { + *substr = '0'; substr[1] = 0; + } + is_substituted = true; + } + if (*feature && !is_substituted) { // Pressed state of specified key + bool &ik = disp.is_key(feature); + cimg_snprintf(substr,substr.width(),"%d",(int)ik); + is_substituted = true; + if (flush_request) ik = false; } - is_substituted = true; - break; - case 'n' : // Normalization type - cimg_snprintf(substr,substr.width(),"%d",disp.normalization()); - is_substituted = true; - break; - case 't' : // Window title - cimg_snprintf(substr,substr.width(),"%s",disp.title()); - is_substituted = true; - break; - case 'x' : // X-coordinate of mouse pointer - cimg_snprintf(substr,substr.width(),"%d",disp.mouse_x()); - is_substituted = true; - if (flush_request) { disp._mouse_x = -1; disp._mouse_y = -1; } - break; - case 'y' : // Y-coordinate of mouse pointer - cimg_snprintf(substr,substr.width(),"%d",disp.mouse_y()); - is_substituted = true; - if (flush_request) { disp._mouse_x = -1; disp._mouse_y = -1; } - break; - case 'b' : // State of mouse buttons - cimg_snprintf(substr,substr.width(),"%d",disp.button()); - is_substituted = true; - if (flush_request) disp._button = 0; - break; - case 'o' : // State of mouse wheel - cimg_snprintf(substr,substr.width(),"%d",disp.wheel()); - is_substituted = true; - if (flush_request) disp._wheel = 0; - break; - case 'c' : // Closed state of display window - cimg_snprintf(substr,substr.width(),"%d",(int)disp.is_closed()); - is_substituted = true; - if (flush_request) disp._is_closed = false; - break; - case 'r' : // Resize event - cimg_snprintf(substr,substr.width(),"%d",(int)disp.is_resized()); - is_substituted = true; - if (flush_request) disp._is_resized = false; - break; - case 'm' : // Move event - cimg_snprintf(substr,substr.width(),"%d",(int)disp.is_moved()); - is_substituted = true; - if (flush_request) disp._is_moved = false; - break; - case 'k' : // Key event - cimg_snprintf(substr,substr.width(),"%u",disp.key()); - is_substituted = true; - if (flush_request) disp._keys[0] = 0; - break; - } else if (*feature=='w' && feature[1]=='h' && !feature[2]) { // Display width*height - cimg_snprintf(substr,substr.width(),"%lu", - (unsigned long)disp.width()*disp.height()); - is_substituted = true; - } else if (*feature=='d' && feature[1]=='e' && !feature[2]) { // Window width*height - cimg_snprintf(substr,substr.width(),"%lu", - (unsigned long)disp.window_width()*disp.window_height()); - is_substituted = true; - } else if (*feature=='u' && feature[1]=='v' && !feature[2]) { // Screen width*height - try { - cimg_snprintf(substr,substr.width(),"%lu", - (unsigned long)CImgDisplay::screen_width()*CImgDisplay::screen_height()); - } catch (CImgDisplayException&) { - *substr = '0'; substr[1] = 0; - } - is_substituted = true; - } else if (*feature=='w' && feature[1]==',' && feature[2]=='h' && !feature[3]) { // Display width,height - cimg_snprintf(substr,substr.width(),"%u,%u", - (unsigned int)disp.width(),(unsigned int)disp.height()); - is_substituted = true; - } else if (*feature=='d' && feature[1]==',' && feature[2]=='e' && !feature[3]) { // Window width,height - cimg_snprintf(substr,substr.width(),"%u,%u", - (unsigned int)disp.window_width(),(unsigned int)disp.window_height()); - is_substituted = true; - } else if (*feature=='u' && feature[1]==',' && feature[2]=='v' && !feature[3]) { // Display width,height - try { - cimg_snprintf(substr,substr.width(),"%u,%u", - (unsigned int)CImgDisplay::screen_width(),(unsigned int)CImgDisplay::screen_height()); - } catch (CImgDisplayException&) { - *substr = '0'; substr[1] = ','; substr[2] = '0'; substr[3] = 0; } - is_substituted = true; - } - - if (!is_substituted) { // Pressed state of specified key - bool &ik = disp.is_key(feature); - cimg_snprintf(substr,substr.width(),"%d",(int)ik); - is_substituted = true; - if (flush_request) ik = false; - } + if (is_substituted) + CImg::string(substr,false,true).append_string_to(substituted_items,ptr_sub); + if (e_feature) { + *e_feature = ','; feature = e_feature + 1; + CImg::append_string_to(delimiter,substituted_items,ptr_sub); + } else feature+=std::strlen(feature); + } while (*feature || e_feature); + *substr = 0; is_substituted = true; } -#endif // #if cimg_display==0 } // Double-backquoted string. @@ -3997,7 +4397,7 @@ *substr = 0; is_substituted = true; } - // Sequence of ascii characters. + // Sequence of character codes. if (!is_substituted && inbraces.width()>=3 && *inbraces=='\'' && inbraces[inbraces.width() - 2]=='\'') { const char *s = inbraces.data() + 1; @@ -4005,7 +4405,7 @@ inbraces[inbraces.width() - 2] = 0; cimg::strunescape(inbraces); for (*substr = 0; *s; ++s) { - cimg_snprintf(substr,substr.width(),"%d,",(int)(unsigned char)*s); + cimg_snprintf(substr,substr.width(),"%d%c",(int)(unsigned char)*s,delimiter); CImg(substr.data(),(unsigned int)std::strlen(substr),1,1,1,true). append_string_to(substituted_items,ptr_sub); } @@ -4022,11 +4422,11 @@ if (ind<0) ind+=images.width(); if (ind<0 || ind>=images.width()) { if (images.width()) - error(images,0,0, + error(true,images,0,0, "Item substitution '{%s}': Invalid selection [%d] (not in range -%u...%u).", cimg::strellipsize(inbraces,64,false),ind,images.size(),images.size() - 1); else - error(images,0,0, + error(true,images,0,0, "Item substitution '{%s}': Invalid selection [%d] (no image data available).", cimg::strellipsize(inbraces,64,false),ind); } @@ -4035,7 +4435,7 @@ } else if (cimg_sscanf(inbraces,"%255[a-zA-Z0-9_]%c",substr.assign(256).data(),&(sep=0))==2 && sep==',') { selection2cimg(substr,images.size(),images_names,"Item substitution '{name,feature}'").move_to(_ind); if (_ind.height()!=1) - error(images,0,0, + error(true,images,0,0, "Item substitution '{%s}': Invalid selection [%s], specifies multiple images.", cimg::strellipsize(inbraces,64,false),substr.data()); ind = (int)*_ind; @@ -4046,13 +4446,13 @@ CImg &img = ind>=0?gmic_check(images[ind]):CImg::empty(); *substr = 0; if (!*feature) - error(images,0,0, + error(true,images,0,0, "Item substitution '{%s}': Request for empty feature.", cimg::strellipsize(inbraces,64,false)); if (!feature[1]) switch (*feature) { // Single-char feature case 'b' : { // Image basename - if (ind>=0) { + if (ind>=0 && *images_names[ind]) { substr.assign(std::max(substr.width(),images_names[ind].width())); cimg::split_filename(images_names[ind].data(),substr); const char *const basename = gmic::basename(substr); @@ -4066,7 +4466,7 @@ is_substituted = true; break; case 'f' : { // Image folder name - if (ind>=0) { + if (ind>=0 && *images_names[ind]) { substr.assign(std::max(substr.width(),images_names[ind].width())); std::strcpy(substr,images_names[ind]); const char *const basename = gmic::basename(substr); @@ -4080,7 +4480,7 @@ is_substituted = true; break; case 'n' : // Image name - if (ind>=0) { + if (ind>=0 && *images_names[ind]) { substr.assign(std::max(substr.width(),images_names[ind].width())); cimg_snprintf(substr,substr.width(),"%s",images_names[ind].data()); strreplace_bw(substr); @@ -4107,7 +4507,7 @@ *substr = 0; is_substituted = true; } break; case 'x' : // Image extension - if (ind>=0) { + if (ind>=0 && *images_names[ind]) { substr.assign(std::max(substr.width(),images_names[ind].width())); cimg_snprintf(substr,substr.width(),"%s", cimg::split_filename(images_names[ind].data())); @@ -4120,7 +4520,7 @@ is_substituted = true; break; case '^' : { // Sequence of all pixel values - img.value_string(',').move_to(vs); + img.value_string(delimiter).move_to(vs); if (vs && *vs) { --vs._width; vs.append_string_to(substituted_items,ptr_sub); } *substr = 0; is_substituted = true; } break; @@ -4130,7 +4530,7 @@ if (!is_substituted && *feature=='@') { // Subset of values if (l_feature>=2) { if (feature[1]=='^' && !feature[2]) { // All pixel values - img.value_string(',').move_to(vs); + img.value_string(delimiter).move_to(vs); if (vs && *vs) { --vs._width; vs.append_string_to(substituted_items,ptr_sub); } *substr = 0; is_substituted = true; } else { @@ -4138,29 +4538,31 @@ subset.back() = 0; CImg values; ++feature; - int _verbosity = verbosity; - bool _is_debug = is_debug; - verbosity = -1; is_debug = false; - CImg _status; - status.move_to(_status); // Save status because 'selection2cimg' may change it + CImg o_status; + status.move_to(o_status); // Save status because 'selection2cimg' may change it + const int o_verbosity = verbosity; + const bool o_is_debug = is_debug; + verbosity = 0; + is_debug = false; try { const CImg inds = selection2cimg(subset,(unsigned int)img.size(), CImgList::empty(),"",false); values.assign(1,inds.height()); - cimg_foroff(inds,p) values[p] = img[inds[p]]; + cimg_foroff(inds,q) values[q] = img[inds[q]]; } catch (gmic_exception &e) { const char *const e_ptr = std::strstr(e.what(),": "); - error(images,0,0, + error(true,images,0,0, "Item substitution '{%s}': %s", cimg::strellipsize(inbraces,64,false),e_ptr?e_ptr + 2:e.what()); } - _status.move_to(status); - verbosity = _verbosity; is_debug = _is_debug; - cimg_foroff(values,p) { - cimg_snprintf(substr,substr.width(),"%.17g",(double)values[p]); + is_debug = o_is_debug; + verbosity = o_verbosity; + o_status.move_to(status); + cimg_foroff(values,q) { + cimg_snprintf(substr,substr.width(),"%.17g",(double)values[q]); CImg::string(substr,true,true). append_string_to(substituted_items,ptr_sub); - *(ptr_sub - 1) = ','; + *(ptr_sub - 1) = delimiter; } if (values) --ptr_sub; } @@ -4187,7 +4589,7 @@ append_string_to(substituted_items,ptr_sub); } else { if (output.height()>1) { // Vector-valued result - output.value_string(',',0,is_rounded?"%g":"%.17g").move_to(vs); + output.value_string(delimiter,0,is_rounded?"%g":"%.17g").move_to(vs); if (vs && *vs) { --vs._width; vs.append_string_to(substituted_items,ptr_sub); } } else { // Scalar result if (is_rounded) cimg_snprintf(substr,substr.width(),"%g",*output); @@ -4198,7 +4600,7 @@ } catch (CImgException& e) { const char *const e_ptr = std::strstr(e.what(),": "); if (is_string) inbraces[inbraces.width() - 2] = '`'; - error(images,0,0, + error(true,images,0,0, "Item substitution '{%s}': %s", cimg::strellipsize(inbraces,64,false),e_ptr?e_ptr + 2:e.what()); } @@ -4216,6 +4618,8 @@ for (p = 1; p>0 && *ptr_end; ++ptr_end) { if (*ptr_end=='{') ++p; if (*ptr_end=='}') --p; } if (p) { CImg::append_string_to(*(nsource++),substituted_items,ptr_sub); + CImg::append_string_to(*(nsource++),substituted_items,ptr_sub); + if (is_2dollars) CImg::append_string_to(*(nsource++),substituted_items,ptr_sub); continue; } l_inbraces = (int)(ptr_end - ptr_beg - 1); @@ -4228,7 +4632,6 @@ } // Substitute '$?' -> String to describes the current command selection. - // (located here to avoid substitution when verbosity<0). if (nsource[1]=='?') { if (command_selection) { const unsigned int substr_width = (unsigned int)substr.width(); @@ -4255,7 +4658,7 @@ // Substitute '$|' -> Timer value. } else if (nsource[1]=='|') { - cimg_snprintf(substr,substr.width(),"%g",(cimg::time() - reference_time)/1000.); + cimg_snprintf(substr,substr.width(),"%.17g",(cimg::time() - reference_time)/1000.); CImg(substr.data(),(unsigned int)std::strlen(substr),1,1,1,true). append_string_to(substituted_items,ptr_sub); nsource+=2; @@ -4268,10 +4671,10 @@ } nsource+=2; - // Substitute '$>' and '$<' -> Forward/backward indice of current loop. + // Substitute '$>' and '$<' -> Forward/backward index of current loop. } else if (nsource[1]=='>' || nsource[1]=='<') { if (!nb_repeatdones) - error(images,0,0, + error(true,images,0,0, "Item substitution '$%c': There is no loop currently running.", nsource[1]); const unsigned int *const rd = repeatdones.data(0,nb_repeatdones - 1); @@ -4295,12 +4698,12 @@ if (search_sorted(name,commands_names[hash],commands_names[hash].size(),uind)) { CImgList sc = CImg::string(commands[hash][uind],false,true).get_split(CImg::vector(' ')); cimglist_for(sc,l) if (sc(l,0)==1) sc.remove(l--); // Discard debug info - (sc>'y').autocrop(' ').unroll('x').move_to(inbraces); + (sc>'x').autocrop(' ').move_to(inbraces); inbraces.append_string_to(substituted_items,ptr_sub); } nsource+=l_name; - // Substitute '$name' and '${name}' -> Variable, image indice or environment variable. + // Substitute '$name' and '${name}' -> Variable, image index or environment variable. } else if ((((is_braces && cimg_sscanf(inbraces,"%255[a-zA-Z0-9_]", substr.assign(256).data())==1) && !inbraces[std::strlen(substr)]) || @@ -4324,15 +4727,22 @@ is_name_found = true; ind = l; break; } if (is_name_found) { // Regular variable - if (__variables[ind].size()>1) - CImg(__variables[ind].data(),(unsigned int)(__variables[ind].size() - 1)). - append_string_to(substituted_items,ptr_sub); + if (__variables[ind].size()>1) { + if (*(__variables[ind])==gmic_store && !std::strncmp(__variables[ind].data() + 1,"*store/",7) + && __variables(ind,8)) { + const char *const zero = (char*)std::memchr(__variables[ind].data() + 8,0,__variables[ind].width()); + CImg(__variables[ind].data(),zero - __variables[ind].data(),1,1,1,true). + append_string_to(substituted_items,ptr_sub); + } else + CImg(__variables[ind].data(),(unsigned int)(__variables[ind].size() - 1),1,1,1,true). + append_string_to(substituted_items,ptr_sub); + } } else { for (int l = images.width() - 1; l>=0; --l) if (images_names[l] && !std::strcmp(images_names[l],name)) { is_name_found = true; ind = l; break; } - if (is_name_found) { // Latest image indice + if (is_name_found) { // Latest image index cimg_snprintf(substr,substr.width(),"%d",ind); CImg(substr.data(),(unsigned int)std::strlen(substr),1,1,1,true). append_string_to(substituted_items,ptr_sub); @@ -4355,8 +4765,13 @@ CImg::string("*substitute").move_to(callstack); CImg nvariables_sizes(gmic_varslots); cimg_forX(nvariables_sizes,l) nvariables_sizes[l] = variables[l]->size(); + const unsigned int psize = images.size(); _run(ncommands_line,nposition,images,images_names,parent_images,parent_images_names, nvariables_sizes,0,inbraces,command_selection); + if (images.size()!=psize) + error(true,images,0,0, + "Item substitution '${\"%s\"}': Expression incorrectly changes the number of images (from %u to %u).", + cimg::strellipsize(inbraces,64,false),psize,images.size()); for (unsigned int l = 0; lsize()>nvariables_sizes[l]) { variables_names[l]->remove(nvariables_sizes[l],variables[l]->size() - 1); variables[l]->remove(nvariables_sizes[l],variables[l]->size() - 1); @@ -4377,9 +4792,12 @@ // Main parsing procedures. //------------------------- +template gmic& gmic::run(const char *const commands_line, - float *const p_progress, bool *const p_is_abort) { - gmic_list images; + float *const p_progress, bool *const p_is_abort, + const T& pixel_type) { + cimg::unused(pixel_type); + gmic_list images; gmic_list images_names; return run(commands_line,images,images_names, p_progress,p_is_abort); @@ -4391,13 +4809,12 @@ float *const p_progress, bool *const p_is_abort) { cimg::mutex(26); if (is_running) - error(images,0,0, + error(true,images,0,0, "An instance of G'MIC interpreter %p is already running.", (void*)this); is_running = true; cimg::mutex(26,0); starting_commands_line = commands_line; - is_debug = false; _run(commands_line_to_CImgList(commands_line), images,images_names,p_progress,p_is_abort); is_running = false; @@ -4412,9 +4829,9 @@ unsigned int position = 0; setlocale(LC_NUMERIC,"C"); callstack.assign(1U); - callstack._data[0].assign(2,1,1,1); - callstack._data[0]._data[0] = '.'; - callstack._data[0]._data[1] = 0; + callstack[0].assign(2,1,1,1); + callstack[0][0] = '.'; + callstack[0][1] = 0; dowhiles.assign(nb_dowhiles = 0U); fordones.assign(nb_fordones = 0U); repeatdones.assign(nb_repeatdones = 0U); @@ -4422,13 +4839,12 @@ nb_carriages = 0; debug_filename = ~0U; debug_line = ~0U; - is_released = true; + is_change = false; is_debug_info = false; is_debug = false; is_start = true; is_quit = false; is_return = false; - check_elif = false; if (p_progress) progress = p_progress; else { _progress = -1; progress = &_progress; } if (p_is_abort) is_abort = p_is_abort; else { _is_abort = false; is_abort = &_is_abort; } is_abort_thread = false; @@ -4453,12 +4869,8 @@ const unsigned int *const variables_sizes, bool *const is_noarg, const char *const parent_arguments, const CImg *const command_selection) { - -#if cimg_display!=0 - CImgDisplay *const _display_windows = (CImgDisplay*)display_windows; -#endif // #if cimg_display!=0 - if (!commands_line || position>=commands_line._width) { - if (is_debug) debug(images,"Return from empty function '%s/'.", + if (*callstack.back()!='*' && (!commands_line || position>=commands_line._width)) { + if (is_debug) debug(images,"Return from empty command '%s/'.", callstack.back().data()); return *this; } @@ -4484,7 +4896,7 @@ typedef typename cimg::last::type int64T; const unsigned int initial_callstack_size = callstack.size(), initial_debug_line = debug_line; - CImgList<_gmic_parallel > threads_data; + CImgList<_gmic_parallel > gmic_threads; CImgList primitives; CImgList g_list_uc; CImgList g_list_f; @@ -4494,38 +4906,45 @@ CImg ind, ind0, ind1; CImg g_img_uc; CImg vertices; - CImg name; CImg g_img; - unsigned int next_debug_line = ~0U, next_debug_filename = ~0U, _debug_line, _debug_filename, - is_high_connectivity, __ind = 0, boundary = 0, pattern = 0, exit_on_anykey = 0, wind = 0, - interpolation = 0; + CImg name,o_status,_argument_text, _argx, _argy, _argz, _argc, _title, _indices, _message, _formula, _color, + _command(256), _s_selection(256); + char _c0 = 0, + *argument_text = &_c0, + *argx = &_c0, + *argy = &_c0, + *argz = &_c0, + *argc = &_c0, + *title = &_c0, + *indices = &_c0, + *message = &_c0, + *formula = &_c0, + *color = &_c0, + *const command = _command.data(), + *s_selection = _s_selection.data(); + +// Macros below allows to allocate memory for string variables only when necessary. +#define gmic_use_var(name,siz) (name = (name!=&_c0?name:&(*_##name.assign(siz).data() = 0))) +#define gmic_use_argument_text gmic_use_var(argument_text,81) +#define gmic_use_argx gmic_use_var(argx,256) +#define gmic_use_argy gmic_use_var(argy,256) +#define gmic_use_argz gmic_use_var(argz,256) +#define gmic_use_argc gmic_use_var(argc,256) +#define gmic_use_title gmic_use_var(title,256) +#define gmic_use_indices gmic_use_var(indices,256) +#define gmic_use_message gmic_use_var(message,1024) +#define gmic_use_formula gmic_use_var(formula,4096) +#define gmic_use_color gmic_use_var(color,4096) + + unsigned int next_debug_line = ~0U, next_debug_filename = ~0U, is_high_connectivity, __ind = 0, + boundary = 0, pattern = 0, exit_on_anykey = 0, wind = 0, interpolation = 0, hash = 0; char end, sep = 0, sep0 = 0, sep1 = 0, sepx = 0, sepy = 0, sepz = 0, sepc = 0, axis = 0; double vmin = 0, vmax = 0, value, value0, value1, nvalue, nvalue0, nvalue1; - bool is_endlocal = false; + bool is_cond, is_endlocal = false, check_elif = false, run_entrypoint = false; float opacity = 0; int err; - // Allocate string variables, widely used afterwards - // (prevents stack overflow on recursive calls while remaining thread-safe). - CImg _formula(4096), _color(4096), message(1024), _title(256), _indices(256), - _argx(256), _argy(256), _argz(256), _argc(256), argument_text(81), - _command(256), _s_selection(256); - - char - *const formula = _formula.data(), - *const color = _color.data(), - *const title = _title.data(), - *const indices = _indices.data(), - *const argx = _argx.data(), - *const argy = _argy.data(), - *const argz = _argz.data(), - *const argc = _argc.data(), - *const command = _command.data(), - *const s_selection = _s_selection.data(); - *formula = *color = *title = *indices = *argx = *argy = *argz = *argc = - *command = *s_selection = 0; - try { // Init interpreter environment. @@ -4547,7 +4966,9 @@ } // Begin command line parsing. + const int starting_verbosity = verbosity; if (!commands_line && is_start) { print(images,0,"Start G'MIC interpreter."); is_start = false; } + while (position0) { - is_debug_info = true; debug_line = _debug_line; debug_filename = _debug_filename; - } - ++position; - } + while (position=commands_line.size()) break; // Check consistency of the interpreter environment. if (images_names.size()!=images.size()) - error("G'MIC encountered a fatal error (images (%u) and images names (%u) have different size). " + error(true,"G'MIC encountered a fatal error (images (%u) and images names (%u) have different size). " "Please submit a bug report, at: https://github.com/dtschump/gmic/issues", images_names.size(),images.size()); if (!callstack) - error("G'MIC encountered a fatal error (empty call stack). " + error(true,"G'MIC encountered a fatal error (empty call stack). " "Please submit a bug report, at: https://github.com/dtschump/gmic/issues"); if (callstack.size()>=64) - error("Call stack overflow (infinite recursion?)."); + error(true,"Call stack overflow (infinite recursion?)."); // Substitute expressions in current item. const char - *const initial_item = commands_line[position].data(), + *const initial_item = run_entrypoint?"_main_":commands_line[position].data(), *const empty_argument = "", *initial_argument = empty_argument; unsigned int position_argument = position + 1; - while (position_argument0) { - is_debug_info = true; next_debug_line = _debug_line; next_debug_filename = _debug_filename; - } - ++position_argument; - } + while (position_argument _item, _argument; @@ -4596,75 +5009,81 @@ const char *argument = initial_argument; // Check if current item is a known command. -#define _gmic_eok(i) (!item[i] || item[i]=='[' || (item[i]=='.' && (!item[i + 1] || item[i + 1]=='.'))) - const bool is_simple_hyphen = *item=='-' && item[1] && item[1]!='[' && item[1]!='.' && (item[1]!='3' || item[2]!='d'), is_plus = *item=='+' && item[1] && - item[1]!='[' && item[1]!='.' && (item[1]!='3' || item[2]!='d'), - is_double_hyphen = *item=='-' && item[1]=='-' && - item[2] && item[2]!='[' && item[2]!='.' && (item[2]!='3' || item[3]!='d'); - item+=is_double_hyphen?2:is_simple_hyphen || is_plus?1:0; - const bool is_get = is_double_hyphen || is_plus; + item[1]!='[' && item[1]!='.' && (item[1]!='3' || item[2]!='d'); + item+=is_simple_hyphen || is_plus?1:0; + const bool is_get = is_plus; +#define _gmic_eok(i) (!item[i] || item[i]=='[' || (item[i]=='.' && (!item[i + 1] || item[i + 1]=='.'))) unsigned int hash_custom = ~0U, ind_custom = ~0U; - bool is_command = *item>='a' && *item<='z' && _gmic_eok(1); // Alphabetical shortcut commands - is_command|= *item=='m' && (item[1]=='*' || item[1]=='/') && _gmic_eok(2); // Shortcuts 'm*' and 'm/' - is_command|= *item=='f' && item[1]=='i' && _gmic_eok(2); // Shortcuts 'fi' - if (!is_command) { + const bool + is_com1 = *item && _gmic_eok(1), + is_com2 = *item && item[1] && _gmic_eok(2), + is_com3 = *item && item[1] && item[2] && _gmic_eok(3); + bool is_builtin_command = + (*item>='a' && *item<='z' && is_com1) || // Alphabetical shortcut commands + (*item=='m' && (item[1]=='*' || item[1]=='/') && is_com2) || // Shortcuts 'm*' and 'm/' + (*item=='f' && item[1]=='i' && is_com2) || // Shortcuts 'fi' + (*item=='u' && item[1]=='m' && is_com2) || // Shortcut 'um' + (*item=='!' && item[1]=='=' && is_com2) || // Shortcut '!=' + ((*item=='%' || *item=='&' || *item=='^' || *item=='|') && is_com1) || // Shortcuts '%','&','^' and '|' + ((*item=='*' || *item=='+' || *item=='-' || *item=='/') && // Shortcuts '*','+','-','/', + (is_com1 || (item[1]=='3' && item[2]=='d' && is_com3))) || // '*3d','+3d','-3d' and '/3d' + ((*item=='<' || *item=='=' || *item=='>') && // Shortcuts '<','=','>','<=','==' and '>=' + (is_com1 || ((item[1]==*item || item[1]=='=') && is_com2))), + is_command = is_builtin_command; + + if (!is_builtin_command) { *command = sep0 = sep1 = 0; - switch (*item) { - case '!' : is_command = item[1]=='=' && _gmic_eok(2); break; - case '%' : case '&' : case '^' : case '|' : - is_command = _gmic_eok(1); break; - case '*' : case '+' : case '-' : case '/' : - is_command = _gmic_eok(1) || (item[1]=='3' && item[2]=='d' && _gmic_eok(3)); break; - case '<' : case '=' : case '>' : - is_command = _gmic_eok(1) || ((item[1]==*item || item[1]=='=') && _gmic_eok(2)); break; - default : - - // Extract command name. - // (same as but faster than 'err = cimg_sscanf(item,"%255[a-zA-Z_0-9]%c%c",command,&sep0,&sep1);'). - const char *ps = item; - char *pd = command; - char *const pde = _command.end() - 1; - for (err = 0; *ps && pd='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9') || c=='_') *(pd++) = c; - else break; - } - if (pd!=command) { - *pd = 0; + + // Extract command name. + // (same as but faster than 'err = cimg_sscanf(item,"%255[a-zA-Z_0-9]%c%c",command,&sep0,&sep1);'). + const char *ps = item; + char *pd = command; + char *const pde = _command.end() - 1; + for (err = 0; *ps && pd='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9') || c=='_') *(pd++) = c; + else break; + } + if (pd!=command) { + *pd = 0; + ++err; + if (*ps) { + sep0 = *(ps++); ++err; - if (*ps) { - sep0 = *(ps++); - ++err; - if (*ps) { sep1 = *(ps++); ++err; } - } + if (*ps) { sep1 = *(ps++); ++err; } } + } + is_command = + (err==1 || (err==2 && sep0=='.') || (err==3 && (sep0=='[' || (sep0=='.' && sep1=='.')))) && + (*item<'0' || *item>'9'); - is_command = err==1 || (err==2 && sep0=='.') || (err==3 && (sep0=='[' || (sep0=='.' && sep1=='.'))); - is_command&=*item<'0' || *item>'9'; - if (is_command) { // Look for a builtin command + if (is_command) { + if (!is_builtin_command) { // Search for known built-in command name const int - ind0 = builtin_commands_inds[*command], - ind1 = builtin_commands_inds(*command,1); - if (ind0>=0) is_command = search_sorted(command,builtin_commands_names + ind0,ind1 - ind0 + 1U,__ind); - if (!is_command) { // Look for a custom command - hash_custom = hashcode(command,false); - is_command = search_sorted(command,commands_names[hash_custom], - commands_names[hash_custom].size(),ind_custom); - } + _ind0 = builtin_commands_inds[(unsigned int)*command], + _ind1 = builtin_commands_inds((unsigned int)*command,1); + if (_ind0>=0) + is_builtin_command = search_sorted(command,builtin_commands_names + _ind0, + _ind1 - _ind0 + 1U,__ind); + } + if (!is_builtin_command) { // Search for a custom command name + hash_custom = hashcode(command,false); + is_command = search_sorted(command,commands_names[hash_custom], + commands_names[hash_custom].size(),ind_custom); } } + is_command|=is_builtin_command; } // Split command/selection, if necessary. bool is_selection = false; - const unsigned int siz = images._width; + const unsigned int siz = images._width, selsiz = _s_selection._width; CImg selection; - CImg new_name; if (is_command) { sep0 = sep1 = 0; strreplace_fw(item); @@ -4672,6 +5091,12 @@ // Extract selection. // (same as but faster than 'err = cimg_sscanf(item,"%255[^[]%c%255[a-zA-Z_0-9.eE%^,:+-]%c%c", // command,&sep0,s_selection,&sep1,&end); + if (selsiz<_item._width) { // Expand size for getting a possibly large selection + _s_selection.assign(_item.width()); + s_selection = _s_selection.data(); + *s_selection = 0; + } + const char *ps = item; char *pd = command; char *const pde = _command.end() - 1; @@ -4706,25 +5131,33 @@ const unsigned int l_command = err==1?(unsigned int)std::strlen(command):0; if (err==1 && l_command>=2 && command[l_command - 1]=='.') { // Selection shortcut - err = 4; sep0 = '['; sep1 = ']'; *s_selection = '-'; - if (command[l_command - 2]!='.') { s_selection[1] = '1'; command[l_command - 1] = 0; } - else if (l_command>=3 && command[l_command - 3]!='.') { s_selection[1] = '2'; command[l_command - 2] = 0; } - else if (l_command>=4 && command[l_command - 4]!='.') { s_selection[1] = '3'; command[l_command - 3] = 0; } + err = 4; sep0 = '['; sep1 = ']'; + if (command[l_command - 2]!='.') { + *s_selection = '-'; s_selection[1] = '1'; s_selection[2] = 0; command[l_command - 1] = 0; + } + else if (l_command>=3 && command[l_command - 3]!='.') { + *s_selection = '-'; s_selection[1] = '2'; s_selection[2] = 0; command[l_command - 2] = 0; + } + else if (l_command>=4 && command[l_command - 4]!='.') { + *s_selection = '-'; s_selection[1] = '3'; s_selection[2] = 0; command[l_command - 3] = 0; + } else { is_command = false; ind_custom = ~0U; *s_selection = 0; } - s_selection[2] = 0; } + if (err==1) { // No selection -> all images - selection.assign(1,siz); + if (!is_get && *command=='p' && command[1]=='a' && command[2]=='s' && command[3]=='s' && !command[4]) + selection.assign(1,parent_images.size()); + else selection.assign(1,siz); cimg_forY(selection,y) selection[y] = (unsigned int)y; } else if (err==2 && sep0=='[' && item[std::strlen(command) + 1]==']') { // Empty selection - selection.assign(); is_selection = true; + is_selection = true; } else if (err==4 && sep1==']') { // Other selections is_selection = true; if (!is_get && (!std::strcmp("wait",command) || !std::strcmp("cursor",command))) selection2cimg(s_selection,10,CImgList::empty(),command).move_to(selection); else if (!is_get && *command=='i' && (!command[1] || !std::strcmp("input",command))) - selection2cimg(s_selection,siz + 1,images_names,command,true,&new_name).move_to(selection); + selection2cimg(s_selection,siz + 1,images_names,command,true).move_to(selection); else if (!is_get && ((*command=='e' && (!command[1] || !std::strcmp("echo",command) || @@ -4745,23 +5178,35 @@ command[_command.width() - 1] = *s_selection = 0; } position = position_argument; + if (_s_selection._width!=selsiz) { // Go back to initial size for selection image. + _s_selection.assign(selsiz); + s_selection = _s_selection.data(); + *s_selection = 0; + } const bool - is_verbose_command = is_get?false: + is_command_verbose = is_get?false: is_command && *item=='v' && (!item[1] || !std::strcmp(item,"verbose")), - is_echo_command = is_get || is_verbose_command?false: + is_command_echo = is_command_verbose?false: is_command && *command=='e' && (!command[1] || !std::strcmp(command,"echo")), - is_input_command = is_get || is_verbose_command || is_echo_command?false: + is_command_error = is_get || is_command_verbose || is_command_echo?false: + is_command && *command=='e' && !std::strcmp(command,"error"), + is_command_warn = is_command_verbose || is_command_echo || is_command_error?false: + is_command && *command=='w' && !std::strcmp(command,"warn"), + is_command_input = is_get || is_command_verbose || is_command_echo || is_command_error || + is_command_warn?false: is_command && *command=='i' && (!command[1] || !std::strcmp(command,"input")), - is_check_command = is_get || is_verbose_command || is_echo_command || is_input_command?false: - !std::strcmp(item,"check"), - is_skip_command = is_get || is_verbose_command || is_echo_command || is_input_command || - is_check_command?false:!std::strcmp(item,"skip"); + is_command_check = is_get || is_command_verbose || is_command_echo || is_command_error || + is_command_warn || is_command_input?false: + is_command && *command=='c' && !std::strcmp(item,"check"), + is_command_skip = is_get || is_command_verbose || is_command_echo || is_command_error || + is_command_warn || is_command_input || is_command_check?false: + is_command && *command=='s' && !std::strcmp(item,"skip"); // Check for verbosity command, prior to the first output of a log message. - bool is_verbose = verbosity>=0 || is_debug, is_verbose_argument = false; + bool is_verbose = verbosity>=1 || is_debug, is_verbose_argument = false; const int old_verbosity = verbosity; - if (is_verbose_command) { + if (is_command_verbose) { // Do a first fast check. if (*argument=='-' && !argument[1]) { --verbosity; is_verbose_argument = true; } else if (*argument=='+' && !argument[1]) { ++verbosity; is_verbose_argument = true; } @@ -4779,14 +5224,14 @@ } } } - is_verbose = verbosity>=0 || is_debug; - const bool is_very_verbose = verbosity>0 || is_debug; + is_verbose = verbosity>=1 || is_debug; + const bool is_very_verbose = verbosity>1 || is_debug; - // Generate strings for displaying image selections when verbosity>=0. + // Generate strings for displaying image selections when verbosity>=1. CImg gmic_selection; if (is_debug || - (verbosity>=0 && !is_check_command && !is_skip_command && - !is_echo_command && !is_verbose_command)) + (verbosity>=1 && !is_command_check && !is_command_skip && + !is_command_verbose && !is_command_echo && !is_command_error && !is_command_warn)) selection2string(selection,images_names,1,gmic_selection); if (is_debug) { @@ -4854,10 +5299,10 @@ else if (command0=='m' && command1=='/') std::strcpy(command,"mdiv"); else if (command0=='m' && command1=='*') std::strcpy(command,"mmul"); else if (command0=='!' && command1=='=') std::strcpy(command,"neq"); + else if (command0=='u' && command1=='m') CImg::string("uncommand").move_to(_item); } else if (!command3 && command1=='3' && command2=='d') switch (command0) { // Three-chars shortcuts (ending with '3d'). - case 'd' : if (!is_get) std::strcpy(command,"display3d"); break; case 'j' : std::strcpy(command,"object3d"); break; case '+' : std::strcpy(command,"add3d"); break; case '/' : std::strcpy(command,"div3d"); break; @@ -4875,7 +5320,9 @@ case 'r' : std::strcpy(command,"rotate3d"); break; case 's' : std::strcpy(command,"split3d"); break; case '-' : std::strcpy(command,"sub3d"); break; - } else if (!command4 && command2=='3' && command3=='d') { + } else if (!is_get && !command3 && command0=='n' && command1=='m' && command2=='d') { + std::strcpy(command,"named"); // Shortcut 'nmd' for 'named". + } else if (!command4 && command2=='3' && command3=='d') { // Four-chars shortcuts (ending with '3d'). if (command0=='d' && command1=='b') { if (!is_get && !is_selection) CImg::string("double3d").move_to(_item); @@ -4890,31 +5337,22 @@ if (!is_get && !is_selection) CImg::string("specs3d").move_to(_item); } } - if (item!=_item.data() + (is_double_hyphen?2:is_simple_hyphen || is_plus?1:0)) item = _item; + if (item!=_item.data() + (is_simple_hyphen || is_plus?1:0)) item = _item; command0 = *command?*command:*item; - // Check if a new name has been requested for a command that does not allow that. - if (new_name && !is_get && !is_input_command) - error(images,0,0, - "Item '%s %s': Unknown name '%s'.", - initial_item,initial_argument,new_name.data()); - // Dispatch to dedicated parsing code, regarding the first character of the command. // We rely on the compiler to optimize this using an associative array (verified with g++). + if (!is_builtin_command) goto gmic_commands_others; switch (command0) { case 'a' : goto gmic_commands_a; case 'b' : goto gmic_commands_b; case 'c' : goto gmic_commands_c; case 'd' : goto gmic_commands_d; case 'e' : goto gmic_commands_e; - case 'f' : - if (command[1]=='i' && !command[2]) goto gmic_commands_e; // (Skip for 'fi') - goto gmic_commands_f; + case 'f' : goto gmic_commands_f; case 'g' : goto gmic_commands_g; case 'h' : goto gmic_commands_h; - case 'i' : - if (command[1]=='f' && !command[2]) goto gmic_commands_others; // (Skip for 'if') - goto gmic_commands_i; + case 'i' : goto gmic_commands_i; case 'k' : goto gmic_commands_k; case 'l' : goto gmic_commands_l; case 'm' : goto gmic_commands_m; @@ -4966,7 +5404,7 @@ g_list.assign(); } } else if ((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c,%c%c", - indices,&sep,&axis,&end)==3 || + &(*gmic_use_indices=0),&sep,&axis,&end)==3 || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c,%c,%f%c", indices,&sep,&axis,&(align=0),&end)==4) && (axis=='x' || axis=='y' || axis=='z' || axis=='c') && @@ -4977,13 +5415,13 @@ const CImg img0 = gmic_image_arg(*ind); cimg_forY(selection,l) gmic_apply(append(img0,axis,align)); } else arg_error("append"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Autocrop. if (!std::strcmp("autocrop",command)) { gmic_substitute_args(false); - if (*argument && cimg_sscanf(argument,"%4095[0-9.,eEinfa+-]%c",formula,&end)==1) + if (*argument && cimg_sscanf(argument,"%4095[0-9.,eEinfa+-]%c",gmic_use_formula,&end)==1) try { CImg(1).fill(argument,true,false).move_to(g_img); } catch (CImgException&) { g_img.assign(); } if (g_img) { @@ -5001,7 +5439,7 @@ } else gmic_apply(gmic_autocrop()); } g_img.assign(); - is_released = false; continue; + is_change = true; continue; } // Add. @@ -5036,15 +5474,15 @@ CImg& img = images[uind]; try { gmic_apply(shift_CImg3d(tx,ty,tz)); } catch (CImgException&) { - if (!img.is_CImg3d(true,&(*message=0))) - error(images,0,0, + if (!img.is_CImg3d(true,&(*gmic_use_message=0))) + error(true,images,0,0, "Command 'add3d': Invalid 3D object [%d], in selected image%s (%s).", - uind,gmic_selection_err.data(),message.data()); + uind,gmic_selection_err.data(),message); else throw; } } ++position; - } else if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",indices,&sep,&end)==2 && + } else if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_indices,&sep,&end)==2 && sep==']' && (ind=selection2cimg(indices,images.size(),images_names,"add3d")).height()==1) { const CImg img0 = gmic_image_arg(*ind); @@ -5059,15 +5497,15 @@ CImg res; try { CImg::append_CImg3d(g_list).move_to(res); } catch (CImgException&) { - if (!img0.is_CImg3d(true,&(*message=0))) - error(images,0,0, + if (!img0.is_CImg3d(true,&(*gmic_use_message=0))) + error(true,images,0,0, "Command 'add3d': Invalid 3D object [%u], in specified " "argument '%s' (%s).", - *ind,gmic_argument_text(),message.data()); + *ind,gmic_argument_text(),message); else if (!img.is_CImg3d(true,message)) - error(images,0,0, + error(true,images,0,0, "Command 'add3d': Invalid 3D object [%d], in selected image%s (%s).", - _ind,gmic_selection_err.data(),message.data()); + _ind,gmic_selection_err.data(),message); else throw; } if (is_get) { @@ -5088,10 +5526,10 @@ catch (CImgException&) { cimg_forY(selection,l) { const unsigned int uind = selection[l]; - if (!images[uind].is_CImg3d(true,&(*message=0))) - error(images,0,0, + if (!images[uind].is_CImg3d(true,&(*gmic_use_message=0))) + error(true,images,0,0, "Command 'add3d': Invalid 3D object [%d], in selected image%s (%s).", - uind,gmic_selection_err.data(),message.data()); + uind,gmic_selection_err.data(),message); } throw; } @@ -5107,7 +5545,7 @@ g_list.assign(); } } - is_released = false; continue; + is_change = true; continue; } // Absolute value. @@ -5131,7 +5569,7 @@ gmic_substitute_args(true); sep = 0; if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c", - indices,&sep,&end)==2 && sep==']' && + gmic_use_indices,&sep,&end)==2 && sep==']' && (ind=selection2cimg(indices,images.size(),images_names,"atan2")).height()==1) { print(images,0,"Compute pointwise oriented arctangent of image%s, " "with x-argument [%u].", @@ -5140,7 +5578,7 @@ const CImg img0 = gmic_image_arg(*ind); cimg_forY(selection,l) gmic_apply(atan2(img0)); } else arg_error("atan2"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Arccosine. @@ -5167,6 +5605,8 @@ // Commands starting by 'b...' //----------------------------- gmic_commands_b : + if (!is_get && item[1]=='r' && item[2]=='e' && item[3]=='a' && item[4]=='k' && !item[5]) // Redirect 'break' + goto gmic_commands_others; // Blur. if (!std::strcmp("blur",command)) { @@ -5176,22 +5616,22 @@ sep = *argx = 0; boundary = 1; - const char *_argument = argument; - if (cimg_sscanf(argument,"%255[xyzc]%c",argx,&sep)==2 && sep==',') { - _argument+=1 + std::strlen(argx); + const char *p_argument = argument; + if (cimg_sscanf(argument,"%255[xyzc]%c",gmic_use_argx,&sep)==2 && sep==',') { + p_argument+=1 + std::strlen(argx); } else sep = *argx = 0; - if ((cimg_sscanf(_argument,"%f%c", + if ((cimg_sscanf(p_argument,"%f%c", &sigma,&end)==1 || - (cimg_sscanf(_argument,"%f%c%c", + (cimg_sscanf(p_argument,"%f%c%c", &sigma,&sep,&end)==2 && sep=='%') || - cimg_sscanf(_argument,"%f,%u%c", + cimg_sscanf(p_argument,"%f,%u%c", &sigma,&boundary,&end)==2 || - (cimg_sscanf(_argument,"%f%c,%u%c", + (cimg_sscanf(p_argument,"%f%c,%u%c", &sigma,&sep,&boundary,&end)==3 && sep=='%') || - cimg_sscanf(_argument,"%f,%u,%u%c", + cimg_sscanf(p_argument,"%f,%u,%u%c", &sigma,&boundary,&is_gaussian,&end)==3 || - (cimg_sscanf(_argument,"%f%c,%u,%u%c", + (cimg_sscanf(p_argument,"%f%c,%u,%u%c", &sigma,&sep,&boundary,&is_gaussian,&end)==4 && sep=='%')) && sigma>=0 && boundary<=1 && is_gaussian<=1) { print(images,0,"Blur image%s%s%s%s with standard deviation %g%s, %s boundary conditions " @@ -5212,7 +5652,7 @@ g_img.assign(); } else cimg_forY(selection,l) gmic_apply(blur(sigma,(bool)boundary,(bool)is_gaussian)); } else arg_error("blur"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Box filter. @@ -5223,25 +5663,25 @@ sep = *argx = 0; boundary = 1; value = 1; - const char *_argument = argument; - if (cimg_sscanf(argument,"%255[xyzc]%c",argx,&sep)==2 && sep==',') { - _argument+=1 + std::strlen(argx); + const char *p_argument = argument; + if (cimg_sscanf(argument,"%255[xyzc]%c",gmic_use_argx,&sep)==2 && sep==',') { + p_argument+=1 + std::strlen(argx); } else sep = *argx = 0; - if ((cimg_sscanf(_argument,"%f%c", + if ((cimg_sscanf(p_argument,"%f%c", &sigma,&end)==1 || - (cimg_sscanf(_argument,"%f%c%c", + (cimg_sscanf(p_argument,"%f%c%c", &sigma,&sep,&end)==2 && sep=='%') || - cimg_sscanf(_argument,"%f,%u%c", + cimg_sscanf(p_argument,"%f,%u%c", &sigma,&order,&end)==2 || - (cimg_sscanf(_argument,"%f%c,%u%c", + (cimg_sscanf(p_argument,"%f%c,%u%c", &sigma,&sep,&order,&end)==3 && sep=='%') || - cimg_sscanf(_argument,"%f,%u,%u%c", + cimg_sscanf(p_argument,"%f,%u,%u%c", &sigma,&order,&boundary,&end)==3 || - (cimg_sscanf(_argument,"%f%c,%u,%u%c", + (cimg_sscanf(p_argument,"%f%c,%u,%u%c", &sigma,&sep,&order,&boundary,&end)==4 && sep=='%') || - cimg_sscanf(_argument,"%f,%u,%u,%lf%c", + cimg_sscanf(p_argument,"%f,%u,%u,%lf%c", &sigma,&order,&boundary,&value,&end)==4 || - (cimg_sscanf(_argument,"%f%c,%u,%u,%lf%c", + (cimg_sscanf(p_argument,"%f%c,%u,%u,%lf%c", &sigma,&sep,&order,&boundary,&value,&end)==5 && sep=='%')) && sigma>=0 && boundary<=1 && order<=2 && value>=0) { const unsigned int nb_iter = (unsigned int)cimg::round(value); @@ -5264,7 +5704,7 @@ g_img.assign(); } else cimg_forY(selection,l) gmic_apply(gmic_blur_box(sigma,order,(bool)boundary,nb_iter)); } else arg_error("boxfilter"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Bitwise right shift. @@ -5297,9 +5737,9 @@ if (!std::strcmp("bilateral",command)) { gmic_substitute_args(true); float sigma_s = 0, sigma_r = 0, sampling_s = 0, sampling_r = 0; - sep0 = sep1 = *argz = *argc = 0; + sep0 = sep1 = *argx = *argy = 0; if ((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - indices,argx,argy,&end)==3 || + gmic_use_indices,gmic_use_argx,gmic_use_argy,&end)==3 || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-],%255[0-9.eE%+-],%f,%f%c", indices,argx,argy,&sampling_s,&sampling_r,&end)==5) && (cimg_sscanf(argx,"%f%c",&sigma_s,&end)==1 || @@ -5320,7 +5760,7 @@ if (sep1=='%') sigma_r = -sigma_r; cimg_forY(selection,l) gmic_apply(blur_bilateral(guide,sigma_s,sigma_r,sampling_s,sampling_r)); } else if ((cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - argx,argy,&end)==2 || + gmic_use_argx,gmic_use_argy,&end)==2 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%f,%f%c", argx,argy,&sampling_s,&sampling_r,&end)==4) && (cimg_sscanf(argx,"%f%c",&sigma_s,&end)==1 || @@ -5339,7 +5779,7 @@ cimg_forY(selection,l) gmic_apply(blur_bilateral(images[selection[l]],sigma_s,sigma_r,sampling_s,sampling_r)); } else arg_error("bilateral"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } goto gmic_commands_others; @@ -5350,28 +5790,17 @@ gmic_commands_c : // Check expression or filename. - if (is_check_command) { + if (is_command_check) { gmic_substitute_args(false); - name.assign(argument,(unsigned int)std::strlen(argument) + 1); - strreplace_fw(name); - bool is_cond = false, is_filename = false; - CImg &img = images.size()?images.back():CImg::empty(); - try { if (img.eval(name,0,0,0,0,&images,&images)) is_cond = true; } - catch (CImgException&) { - is_filename = true; - is_cond = check_filename(name); - } + is_cond = check_cond(argument,images,"check"); if (is_very_verbose) - print(images,0,"Check %s '%s' -> %s.", - is_filename?"file":"expression", - gmic_argument_text_printed(), - is_filename?(is_cond?"found":"not found"):(is_cond?"true":"false")); + print(images,0,"Check condition '%s' -> %s.",gmic_argument_text_printed(),is_cond?"true":"false"); if (!is_cond) { if (is_first_item && callstack.size()>1 && callstack.back()[0]!='*') - gmic::error(images,0,callstack.back(),"Command '%s': Invalid argument '%s'.", - callstack.back().data(),_gmic_argument_text(parent_arguments,argument_text,true)); - else error(images,0,0, - "Command 'check': Expression '%s' is false (and no file with this name exists).", + error(true,images,0,callstack.back(),"Command '%s': Invalid argument '%s'.", + callstack.back().data(),_gmic_argument_text(parent_arguments,gmic_use_argument_text,true)); + else error(true,images,0,0, + "Command 'check': Expression '%s' evaluated to false.", gmic_argument_text()); } ++position; continue; @@ -5413,7 +5842,6 @@ x1 = (int)cimg::round(sep1=='%'?a1*(img.width() - 1)/100:a1); gmic_apply(crop(x0,x1,boundary)); } - ++position; } else if ((boundary=0,cimg_sscanf(argument, "%63[0-9.eE%+-],%63[0-9.eE%+-]," "%63[0-9.eE%+-],%63[0-9.eE%+-]%c", @@ -5449,7 +5877,6 @@ y1 = (int)cimg::round(sep3=='%'?a3*(img.height() - 1)/100:a3); gmic_apply(crop(x0,y0,x1,y1,boundary)); } - ++position; } else if ((boundary=0,cimg_sscanf(argument, "%63[0-9.eE%+-],%63[0-9.eE%+-],%63[0-9.eE%+-]," "%63[0-9.eE%+-],%63[0-9.eE%+-],%63[0-9.eE%+-]%c", @@ -5491,7 +5918,6 @@ z1 = (int)cimg::round(sep5=='%'?a5*(img.depth() - 1)/100:a5); gmic_apply(crop(x0,y0,z0,x1,y1,z1,boundary)); } - ++position; } else if ((boundary=0,cimg_sscanf(argument, "%63[0-9.eE%+-],%63[0-9.eE%+-],%63[0-9.eE%+-]," "%63[0-9.eE%+-],%63[0-9.eE%+-],%63[0-9.eE%+-]," @@ -5544,36 +5970,8 @@ v1 = (int)cimg::round(sep7=='%'?a7*(img.spectrum() - 1)/100:a7); gmic_apply(crop(x0,y0,z0,v0,x1,y1,z1,v1,boundary)); } - ++position; - } else { - if (!is_display_available) { - print(images,0,"Crop image%s in interactive mode (skipped, no display %s).", - gmic_selection.data(),cimg_display?"available":"support"); - } else { -#if cimg_display!=0 - print(images,0,"Crop image%s in interactive mode.", - gmic_selection.data()); - CImgDisplay _disp, &disp = _display_windows[0]?_display_windows[0]:_disp; - g_img.assign(6,selection.height()).fill((T)0); - cimg_forY(selection,l) { - CImg& img = gmic_check(images[selection[l]]); - if (disp) disp.resize(cimg_fitscreen(img.width(),img.height(),img.depth()),false); - else disp.assign(cimg_fitscreen(img.width(),img.height(),img.depth()),0,1); - disp.set_title("%s: crop",basename(images_names[selection[l]])); - CImg s = img.get_select(disp,2); - print(images,0,"Crop image [%d] with coordinates (%d,%d,%d) - (%d,%d,%d).", - selection[l], - s[0],s[1],s[2], - s[3],s[4],s[5]); - gmic_apply(crop(s[0],s[1],s[2],s[3],s[4],s[5])); - g_img.draw_image(0,l,s.unroll('x')); - } - g_img.value_string().move_to(status); - g_img.assign(); -#endif // #if cimg_display!=0 - } - } - is_released = false; continue; + } else arg_error("crop"); + is_change = true; ++position; continue; } // Cut. @@ -5583,13 +5981,13 @@ sep0 = sep1 = *argx = *argy = *indices = 0; value0 = value1 = 0; if (cimg_sscanf(argument,"%255[][a-zA-Z0-9_.eE%+-],%255[][a-zA-Z0-9_.eE%+-]%c", - argx,argy,&end)==2 && - ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",indices,&sep0,&end)==2 && + gmic_use_argx,gmic_use_argy,&end)==2 && + ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_indices,&sep0,&end)==2 && sep0==']' && (ind0=selection2cimg(indices,images.size(),images_names,"cut")).height()==1) || (cimg_sscanf(argx,"%lf%c%c",&value0,&sep0,&end)==2 && sep0=='%') || cimg_sscanf(argx,"%lf%c",&value0,&end)==1) && - ((cimg_sscanf(argy,"[%255[a-zA-Z0-9_.%+-]%c%c",formula,&sep1,&end)==2 && + ((cimg_sscanf(argy,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_formula,&sep1,&end)==2 && sep1==']' && (ind1=selection2cimg(formula,images.size(),images_names,"cut")).height()==1) || (cimg_sscanf(argy,"%lf%c%c",&value1,&sep1,&end)==2 && sep1=='%') || @@ -5611,8 +6009,7 @@ } gmic_apply(cut((T)nvalue0,(T)nvalue1)); } - ++position; - } else if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",indices,&sep0,&end)==2 && + } else if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_indices,&sep0,&end)==2 && sep0==']' && (ind0=selection2cimg(indices,images.size(),images_names,"cut")).height()==1) { if (images[*ind0]) value1 = (double)images[*ind0].max_min(value0); @@ -5621,88 +6018,8 @@ value0, value1); cimg_forY(selection,l) gmic_apply(cut((T)value0,(T)value1)); - ++position; - } else { - if (!is_display_available) { - print(images,0,"Cut image%s in interactive mode (skipped, no display %s).", - gmic_selection.data(),cimg_display?"available":"support"); - } else { -#if cimg_display!=0 - print(images,0,"Cut image%s in interactive mode.", - gmic_selection.data()); - CImgDisplay _disp, &disp = _display_windows[0]?_display_windows[0]:_disp; - g_img.assign(2,selection.height()).fill((T)0); - cimg_forY(selection,l) { - CImg &img = gmic_check(images[selection[l]]); - value0 = value1 = 0; - if (img) { - CImg visu = img.depth()>1?img.get_projections2d(img.width()/2, - img.height()/2, - img.depth()/2). - channels(0,std::min(3,img.spectrum()) - 1): - img.get_channels(0,std::min(3,img.spectrum() - 1)); - const unsigned int - w = CImgDisplay::_fitscreen(visu.width(),visu.height(),1,256,-85,false), - h = CImgDisplay::_fitscreen(visu.width(),visu.height(),1,256,-85,true); - if (disp) disp.resize(w,h,false); else disp.assign(w,h,0,0); - double percent0 = 0, percent1 = 100; - vmin = 0, vmax = (double)img.max_min(vmin); - bool stopflag = false, is_clicked = false; - int omx = -1, omy = -1; - g_img_uc.assign(); - for (disp.show().flush(); !stopflag; ) { - static const unsigned char white[] = { 255,255,255 }, black[] = { 0,0,0 }; - const unsigned int key = disp.key(); - if (!g_img_uc) { - value0 = vmin + percent0*(vmax - vmin)/100; - value1 = vmin + percent1*(vmax - vmin)/100; - disp.display((g_img_uc=visu.get_cut((T)value0,(T)value1).normalize((T)0,(T)255).resize(disp)). - draw_text(0,0,"Cut [%g,%g] = [%.3g%%,%.3g%%]", - white,black,0.7f,13,value0,value1,percent0,percent1)). - set_title("%s (%dx%dx%dx%d)", - basename(images_names[selection[l]]), - img.width(),img.height(),img.depth(),img.spectrum()).wait(); - } - const int mx = disp.mouse_x(), my = disp.mouse_y(); - if (disp.button()) { - if (mx>=0 && my>=0 && (mx!=omx || my!=omy)) { - percent0 = (my - 16)*100./(disp.height() - 32); - percent1 = (mx - 16)*100./(disp.width() - 32); - if (percent0<0) percent0 = 0; else if (percent0>101) percent0 = 101; - if (percent1<0) percent1 = 0; else if (percent1>101) percent1 = 101; - if (percent0>percent1) cimg::swap(percent0,percent1); - omx = mx; omy = my; g_img_uc.assign(); - } - is_clicked = true; - } else if (is_clicked) break; - if (disp.is_closed() || (key && key!=cimg::keyCTRLLEFT)) stopflag = true; - if (key==cimg::keyD && disp.is_keyCTRLLEFT()) { - disp.resize(cimg_fitscreen(3*disp.width()/2,3*disp.height()/2,1), - stopflag=false).set_key(cimg::keyD,false); - g_img_uc.assign(); - } - if (key==cimg::keyC && disp.is_keyCTRLLEFT()) { - disp.resize(cimg_fitscreen(2*disp.width()/3,2*disp.height()/3,1), - stopflag=false).set_key(cimg::keyC,false); - g_img_uc.assign(); - } - if (disp.is_resized()) { disp.resize(false); g_img_uc.assign(); } - } - value0 = vmin + percent0*(vmax - vmin)/100; - value1 = vmin + percent1*(vmax - vmin)/100; - print(images,0,"Cut image [%d] in range [%g,%g] = [%.3g%%,%.3g%%].", - selection[l],value0,value1,percent0,percent1); - gmic_apply(cut((T)value0,(T)value1)); - } else gmic_apply(replace(img)); - g_img(0,l) = (T)value0; g_img(1,l) = (T)value1; - } - g_img.value_string().move_to(status); - g_img.assign(); - g_img_uc.assign(); -#endif // #if cimg_display!=0 - } - } - is_released = false; continue; + } else arg_error("cut"); + is_change = true; ++position; continue; } // Keep channels. @@ -5712,8 +6029,8 @@ sep0 = sep1 = *argx = *argy = *indices = 0; value0 = value1 = 0; if (cimg_sscanf(argument,"%255[][a-zA-Z0-9_.eE%+-]%c", - argx,&end)==1 && - ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c]",indices,&sep0,&end)==2 && + gmic_use_argx,&end)==1 && + ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c]",gmic_use_indices,&sep0,&end)==2 && sep0==']' && (ind0=selection2cimg(indices,images.size(),images_names,"channels")).height()==1) || cimg_sscanf(argx,"%lf%c",&value0,&end)==1 || @@ -5728,13 +6045,13 @@ gmic_apply(channel((int)nvalue0)); } } else if (cimg_sscanf(argument,"%255[][a-zA-Z0-9_.eE%+-],%255[][a-zA-Z0-9_.eE%+-]%c", - argx,argy,&end)==2 && - ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",indices,&sep0,&end)==2 && + gmic_use_argx,gmic_use_argy,&end)==2 && + ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_indices,&sep0,&end)==2 && sep0==']' && (ind0=selection2cimg(indices,images.size(),images_names,"channels")).height()==1) || cimg_sscanf(argx,"%lf%c",&value0,&end)==1 || (cimg_sscanf(argx,"%lf%c%c",&value0,&sep0,&end)==2 && sep0=='%')) && - ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",formula,&sep0,&end)==2 && + ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_formula,&sep0,&end)==2 && sep0==']' && (ind1=selection2cimg(formula,images.size(),images_names,"channels")).height()==1) || cimg_sscanf(argy,"%lf%c",&value1,&end)==1 || @@ -5752,7 +6069,7 @@ gmic_apply(channels((int)nvalue0,(int)nvalue1)); } } else arg_error("channels"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Keep columns. @@ -5762,8 +6079,8 @@ sep0 = sep1 = *argx = *argy = *indices = 0; value0 = value1 = 0; if (cimg_sscanf(argument,"%255[][a-zA-Z0-9_.eE%+-]%c", - argx,&end)==1 && - ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c]",indices,&sep0,&end)==2 && + gmic_use_argx,&end)==1 && + ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c]",gmic_use_indices,&sep0,&end)==2 && sep0==']' && (ind0=selection2cimg(indices,images.size(),images_names,"columns")).height()==1) || cimg_sscanf(argx,"%lf%c",&value0,&end)==1 || @@ -5778,13 +6095,13 @@ gmic_apply(column((int)nvalue0)); } } else if (cimg_sscanf(argument,"%255[][a-zA-Z0-9_.eE%+-],%255[][a-zA-Z0-9_.eE%+-]%c", - argx,argy,&end)==2 && - ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",indices,&sep0,&end)==2 && + gmic_use_argx,gmic_use_argy,&end)==2 && + ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_indices,&sep0,&end)==2 && sep0==']' && (ind0=selection2cimg(indices,images.size(),images_names,"columns")).height()==1) || cimg_sscanf(argx,"%lf%c",&value0,&end)==1 || (cimg_sscanf(argx,"%lf%c%c",&value0,&sep0,&end)==2 && sep0=='%')) && - ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",formula,&sep0,&end)==2 && + ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_formula,&sep0,&end)==2 && sep0==']' && (ind1=selection2cimg(formula,images.size(),images_names,"columns")).height()==1) || cimg_sscanf(argy,"%lf%c",&value1,&end)==1 || @@ -5802,11 +6119,11 @@ gmic_apply(columns((int)nvalue0,(int)nvalue1)); } } else arg_error("columns"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Import custom commands. - if (!std::strcmp("command",item)) { + if (!is_get && !std::strcmp("command",item)) { gmic_substitute_args(false); name.assign(argument,(unsigned int)std::strlen(argument) + 1); const char *arg_command_text = gmic_argument_text_printed(); @@ -5825,36 +6142,38 @@ print(images,0,"Import commands from file '%s'%s", arg_command_text, !add_debug_info?" without debug info":""); - add_commands(file,add_debug_info?arg_command:0,&count_new,&count_replaced); + add_commands(file,arg_command,&count_new,&count_replaced); cimg::fclose(file); + } else if (!cimg::strncasecmp(arg_command,"http://",7) || !cimg::strncasecmp(arg_command,"https://",8)) { // Try to read from network print(images,0,"Import commands from URL '%s'%s", arg_command_text, !add_debug_info?" without debug info":""); try { - file = cimg::std_fopen(cimg::load_network(arg_command,argx),"r"); + file = cimg::std_fopen(cimg::load_network(arg_command,gmic_use_argx,network_timeout),"r"); } catch (...) { file = 0; } if (file) { - CImg _status; - status.move_to(_status); // Save status because 'add_commands()' can change it - const int _verbosity = verbosity; - const bool _is_debug = is_debug; - verbosity = -1; is_debug = false; + status.move_to(o_status); // Save status because 'add_commands()' can change it, with 'error()' + const int o_verbosity = verbosity; + const bool o_is_debug = is_debug; + verbosity = 0; + is_debug = false; try { - add_commands(file,add_debug_info?arg_command:0,&count_new,&count_replaced); + add_commands(file,arg_command,&count_new,&count_replaced); cimg::fclose(file); } catch (...) { cimg::fclose(file); file = 0; } - verbosity = _verbosity; is_debug = _is_debug; - _status.move_to(status); + is_debug = o_is_debug; + verbosity = o_verbosity; + o_status.move_to(status); } if (!file) - error(images,0,0, + error(true,images,0,0, "Command 'command': Unable to load custom command file '%s' " "from network.", gmic_argument_text() + offset_argument_text); @@ -5862,6 +6181,7 @@ } else { print(images,0,"Import custom commands from expression '%s'", arg_command_text); + cimg::strunescape(arg_command); add_commands(arg_command,0,&count_new,&count_replaced); } if (is_verbose) { @@ -5898,16 +6218,16 @@ cimg_forY(selection,l) { const unsigned int uind = selection[l]; CImg& img = gmic_check(images[uind]); - if (!img.is_CImg3d(is_full_check,&(*message=0))) { + if (!img.is_CImg3d(is_full_check,&(*gmic_use_message=0))) { if (is_very_verbose) { cimg::mutex(29); std::fprintf(cimg::output()," -> invalid."); std::fflush(cimg::output()); cimg::mutex(29,0); } - error(images,0,0, + error(true,images,0,0, "Command 'check3d': Invalid 3D object [%d], in selected image%s (%s).", - uind,gmic_selection_err.data(),message.data()); + uind,gmic_selection_err.data(),message); } } if (is_very_verbose) { @@ -5922,58 +6242,91 @@ // Cosine. gmic_simple_command("cos",cos,"Compute pointwise cosine of image%s."); - // Convolve. - if (!std::strcmp("convolve",command)) { + // Convolve & Correlate. + if (!std::strcmp("convolve",command) || !std::strcmp("correlate",command)) { gmic_substitute_args(true); - unsigned int is_normalized = 0; + unsigned int + is_normalized = 0, channel_mode = 1, + xcenter = ~0U, ycenter = ~0U, zcenter = ~0U, + xstart = 0, ystart = 0, zstart = 0, + xend = ~0U, yend = ~0U, zend = ~0U; + float + xstride = 1, ystride = 1, zstride = 1, + xdilation = 1, ydilation = 1 , zdilation = 1; + is_cond = command[2]=='n'; // is_convolve? boundary = 1; sep = 0; - if (((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c", - indices,&sep,&end)==2 && sep==']') || - cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u%c", - indices,&boundary,&end)==2 || - cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u,%u%c", - indices,&boundary,&is_normalized,&end)==3) && - (ind=selection2cimg(indices,images.size(),images_names,"convolve")).height()==1 && - boundary<=1) { - print(images,0, - "Convolve image%s with kernel [%u] and %s boundary conditions, " - "with%s normalization.", - gmic_selection.data(), - *ind, - boundary?"neumann":"dirichlet", - is_normalized?"":"out"); - const CImg kernel = gmic_image_arg(*ind); - cimg_forY(selection,l) gmic_apply(convolve(kernel,(bool)boundary,(bool)is_normalized)); - } else arg_error("convolve"); - is_released = false; ++position; continue; - } - // Correlate. - if (!std::strcmp("correlate",command)) { - gmic_substitute_args(true); - unsigned int is_normalized = 0; - boundary = 1; - sep = 0; if (((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c", - indices,&sep,&end)==2 && sep==']') || + gmic_use_indices,&sep,&end)==2 && sep==']') || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u%c", indices,&boundary,&end)==2 || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u,%u%c", - indices,&boundary,&is_normalized,&end)==3) && + indices,&boundary,&is_normalized,&end)==3 || + cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u,%u,%u%c", + indices,&boundary,&is_normalized,&channel_mode,&end)==4 || + cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u,%u,%u,%u,%u,%u%c", + indices,&boundary,&is_normalized,&channel_mode,&xcenter,&ycenter,&zcenter,&end)==7 || + cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u%c", + indices,&boundary,&is_normalized,&channel_mode,&xcenter,&ycenter,&zcenter, + &xstart,&ystart,&zstart,&xend,¥d,&zend,&end)==13 || + cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%f,%f,%f%c", + indices,&boundary,&is_normalized,&channel_mode,&xcenter,&ycenter,&zcenter, + &xstart,&ystart,&zstart,&xend,¥d,&zend,&xstride,&ystride,&zstride,&end)==16 || + cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%f,%f,%f,%f,%f,%f%c", + indices,&boundary,&is_normalized,&channel_mode,&xcenter,&ycenter,&zcenter, + &xstart,&ystart,&zstart,&xend,¥d,&zend,&xstride,&ystride,&zstride, + &xdilation,&ydilation,&zdilation,&end)==19) && (ind=selection2cimg(indices,images.size(),images_names,"correlate")).height()==1 && - boundary<=1) { + boundary<=3 && channel_mode<=2) { + + *argx = *argy = *argz = *argc = 0; + if (is_verbose) { + if (xcenter!=~0U || ycenter!=~0U || zcenter!=~0U) { + gmic_use_argx; + cimg_snprintf(argx,_argx.width(),", kernel center (%d,%d,%d)", + (int)xcenter,(int)ycenter,(int)zcenter); + } + if (xstart!=0 || ystart!=0 || zstart!=0 || xend!=~0U || yend!=~0U || zend!=~0U) { + gmic_use_argy; + cimg_snprintf(argy,_argy.width(),", crop coordinates (%d,%d,%d) - (%d,%d,%d)", + (int)xstart,(int)ystart,(int)zstart,(int)xend,(int)yend,(int)zend); + } + if (xstride!=1 || ystride!=1 || zstride!=1) { + gmic_use_argz; + cimg_snprintf(argz,_argz.width(),", strides (%g,%g,%g)", + xstride,ystride,zstride); + } + if (xdilation!=1 || ydilation!=1 || zdilation!=1) { + gmic_use_argc; + cimg_snprintf(argc,_argc.width(),", dilations (%g,%g,%g)", + xdilation,ydilation,zdilation); + } + } + print(images,0, - "Correlate image%s with kernel [%u] and %s boundary conditions, " - "with%s normalization.", + "%s image%s with kernel [%u], %s boundary conditions, " + "with%s normalization, %s channel mode%s%s%s.", + is_cond?"Convolve":"Correlate", gmic_selection.data(), *ind, - boundary?"neumann":"dirichlet", - is_normalized?"":"out"); + boundary==0?"dirichlet":boundary==1?"neumann":boundary==2?"periodic":"mirror", + is_normalized?"":"out", + channel_mode==0?"sum input": + channel_mode==1?"one-for-one":"expand", + *argx?argx:"",*argy?argy:"",*argz?argz:"",*argc?argc:""); const CImg kernel = gmic_image_arg(*ind); - cimg_forY(selection,l) gmic_apply(correlate(kernel,(bool)boundary,(bool)is_normalized)); - } else arg_error("correlate"); - is_released = false; ++position; continue; + if (is_cond) { + cimg_forY(selection,l) gmic_apply(convolve(kernel,boundary,(bool)is_normalized,channel_mode, + xcenter,ycenter,zcenter,xstart,ystart,zstart,xend,yend,zend, + xstride,ystride,zstride,xdilation,ydilation,zdilation)); + } else { + cimg_forY(selection,l) gmic_apply(correlate(kernel,boundary,(bool)is_normalized,channel_mode, + xcenter,ycenter,zcenter,xstart,ystart,zstart,xend,yend,zend, + xstride,ystride,zstride,xdilation,ydilation,zdilation)); + } + } else arg_error(is_cond?"convolve":"correlate"); + is_change = true; ++position; continue; } // Set 3D object color. @@ -6004,16 +6357,16 @@ CImg& img = gmic_check(images[uind]); try { gmic_apply(color_CImg3d(R,G,B,opacity,true,set_opacity)); } catch (CImgException&) { - if (!img.is_CImg3d(true,&(*message=0))) - error(images,0,0, + if (!img.is_CImg3d(true,&(*gmic_use_message=0))) + error(true,images,0,0, "Command 'color3d': Invalid 3D object [%d], " "in selected image%s (%s).", - uind,gmic_selection_err.data(),message.data()); + uind,gmic_selection_err.data(),message); else throw; } } } else arg_error("color3d"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Cumulate. @@ -6036,14 +6389,14 @@ gmic_selection.data()); cimg_forY(selection,l) gmic_apply(cumulate()); } - is_released = false; continue; + is_change = true; continue; } // Hyperbolic cosine. gmic_simple_command("cosh",cosh,"Compute pointwise hyperbolic cosine of image%s."); // Camera input. - if (!std::strcmp("camera",item)) { + if (!is_get && !std::strcmp("camera",item)) { gmic_substitute_args(false); float cam_index = 0, nb_frames = 1, skip_frames = 0, @@ -6068,7 +6421,7 @@ capture_height = cimg::round(capture_height); if (!nb_frames) { print(images,0,"Release camera #%g.",cam_index); - CImg::get_load_camera((unsigned int)cam_index,0,true); + CImg::get_load_camera((unsigned int)cam_index,0,0,0,true); } else { if (capture_width) print(images,0,"Insert %g image%s from camera #%g, with %g frames skipping " @@ -6077,6 +6430,7 @@ capture_width,capture_height); else print(images,0,"Insert %g image%s from camera #%g, with %g frames skipping.", cam_index,nb_frames,nb_frames>1?"s":"",skip_frames); + gmic_use_title; cimg_snprintf(title,_title.width(),"[Camera #%g]",cam_index); CImg::string(title).move_to(name); if (nb_frames>1) { @@ -6093,13 +6447,14 @@ std::fflush(cimg::output()); cimg::mutex(29,0); } - CImg::get_load_camera((unsigned int)cam_index,(unsigned int)skip_frames,false, - (unsigned int)capture_width,(unsigned int)capture_height). + CImg::get_load_camera((unsigned int)cam_index, + (unsigned int)capture_width,(unsigned int)capture_height, + (unsigned int)skip_frames,false). move_to(images); images_names.insert(name); } } - is_released = false; continue; + is_change = true; continue; } // Show/hide mouse cursor. @@ -6117,17 +6472,15 @@ state?"Show":"Hide", gmic_selection.data(),cimg_display?"available":"support"); } else { -#if cimg_display!=0 if (state) cimg_forY(selection,l) { - if (!_display_windows[l].is_closed()) _display_windows[selection[l]].show_mouse(); + if (!display_window(l).is_closed()) display_window(selection[l]).show_mouse(); } else cimg_forY(selection,l) { - if (!_display_windows[l].is_closed()) _display_windows[selection[l]].hide_mouse(); + if (!display_window(l).is_closed()) display_window(selection[l]).hide_mouse(); } print(images,0,"%s mouse cursor for display window%s.", state?"Show":"Hide", gmic_selection.data()); -#endif // #if cimg_display!=0 } continue; } @@ -6138,22 +6491,26 @@ // Commands starting by 'd...' //----------------------------- gmic_commands_d : + if (command[1]=='i' && command[2]=='v' && command[3]=='3' && command[4]=='d' && !command[5]) // Redirect 'div3d' + goto gmic_commands_others; // Done. - if (!std::strcmp("done",item)) { + if (!is_get && !std::strcmp("done",item)) { const CImg &s = callstack.back(); if (s[0]!='*' || (s[1]!='r' && s[1]!='f')) - error(images,0,0, + error(true,images,0,0, "Command 'done': Not associated to a 'repeat' or 'for' command " "within the same scope."); if (s[1]=='r') { // End a 'repeat...done' block *title = 0; unsigned int *const rd = repeatdones.data(0,nb_repeatdones - 1); - const unsigned int hash = rd[3], pos = rd[4]; + const unsigned int pos = rd[4]; + hash = rd[3]; ++rd[2]; if (--rd[1]) { position = rd[0] + 1; if (hash!=~0U) { + gmic_use_argx; cimg_snprintf(argx,_argx.width(),"%u",rd[2]); CImg::string(argx).move_to((*variables[hash])[pos]); } @@ -6176,8 +6533,9 @@ } // Do...while. - if (!std::strcmp("do",item)) { + if (!is_get && !std::strcmp("do",item)) { if (is_debug_info && debug_line!=~0U) { + gmic_use_argx; cimg_snprintf(argx,_argx.width(),"*do#%u",debug_line); CImg::string(argx).move_to(callstack); } else CImg::string("*do").move_to(callstack); @@ -6193,7 +6551,7 @@ CImg values; *argx = 0; - if (cimg_sscanf(argument,"%255[xyzc]%c",argx,&end)==1) { + if (cimg_sscanf(argument,"%255[xyzc]%c",gmic_use_argx,&end)==1) { // Discard neighboring duplicate values along axes. print(images,0,"Discard neighboring duplicate values along '%s'-ax%cs, in image%s.", @@ -6203,7 +6561,7 @@ cimg_forY(selection,l) gmic_apply(gmic_discard(argx)); ++position; - } else if (cimg_sscanf(argument,"%255[xyzc]%c",argx,&end)==2 && end==',') { + } else if (cimg_sscanf(argument,"%255[xyzc]%c",gmic_use_argx,&end)==2 && end==',') { // Discard sequence of values along axes. unsigned int nb_values = 1, s_argx = (unsigned int)std::strlen(argx) + 1; @@ -6236,11 +6594,11 @@ cimg_forY(selection,l) gmic_apply(discard()); } } - is_released = false; continue; + is_change = true; continue; } // Enable debug mode (useful when 'debug' is invoked from a custom command). - if (!std::strcmp("debug",item)) { + if (!is_get && !std::strcmp("debug",item)) { is_debug = true; continue; } @@ -6290,7 +6648,7 @@ gmic_apply(distance((T)nvalue,metric)); } } else if ((((cimg_sscanf(argument,"%lf,[%255[a-zA-Z0-9_.%+-]%c%c", - &value,indices,&sep1,&end)==3 || + &value,gmic_use_indices,&sep1,&end)==3 || (cimg_sscanf(argument,"%lf%c,[%255[a-zA-Z0-9_.%+-]%c%c", &value,&sep0,indices,&sep1,&end)==4 && sep0=='%')) && sep1==']') || @@ -6344,7 +6702,7 @@ } } } else arg_error("distance"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Dilate. @@ -6355,7 +6713,7 @@ boundary = 1; sep = 0; if (((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c", - indices,&sep,&end)==2 && sep==']') || + gmic_use_indices,&sep,&end)==2 && sep==']') || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u%c", indices,&boundary,&end)==2 || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u,%u%c", @@ -6391,11 +6749,11 @@ sx,sy,sz); cimg_forY(selection,l) gmic_apply(dilate((unsigned int)sx,(unsigned int)sy,(unsigned int)sz)); } else arg_error("dilate"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Set double-sided mode for 3D rendering. - if (!std::strcmp("double3d",item)) { + if (!is_get && !std::strcmp("double3d",item)) { gmic_substitute_args(false); bool state = true; if (!argument[1] && (*argument=='0' || *argument=='1')) { @@ -6410,40 +6768,77 @@ // Patch-based smoothing. if (!std::strcmp("denoise",command)) { - gmic_substitute_args(false); + gmic_substitute_args(true); float sigma_s = 10, sigma_r = 10, smoothness = 1; unsigned int is_fast_approximation = 0; float psize = 5, rsize = 6; - if ((cimg_sscanf(argument,"%f%c", - &sigma_s,&end)==1 || - cimg_sscanf(argument,"%f,%f%c", - &sigma_s,&sigma_r,&end)==2 || - cimg_sscanf(argument,"%f,%f,%f%c", - &sigma_s,&sigma_r,&psize,&end)==3 || - cimg_sscanf(argument,"%f,%f,%f,%f%c", - &sigma_s,&sigma_r,&psize,&rsize,&end)==4 || - cimg_sscanf(argument,"%f,%f,%f,%f,%f%c", - &sigma_s,&sigma_r,&psize,&rsize,&smoothness,&end)==5 || - cimg_sscanf(argument,"%f,%f,%f,%f,%f,%u%c", - &sigma_s,&sigma_r,&psize,&rsize,&smoothness, - &is_fast_approximation,&end)==6) && + sep0 = sep1 = *argx = *argy = 0; + if ((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-]%c", + gmic_use_indices,gmic_use_argx,&end)==2 || + cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-],%255[0-9.eE%+-]%c", + indices,argx,gmic_use_argy,&end)==3 || + cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-],%255[0-9.eE%+-],%f%c", + indices,argx,argy,&psize,&end)==4 || + cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-],%255[0-9.eE%+-],%f,%f%c", + indices,argx,argy,&psize,&rsize,&end)==5 || + cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-],%255[0-9.eE%+-],%f,%f,%f%c", + indices,argx,argy,&psize,&rsize,&smoothness,&end)==6 || + cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-],%255[0-9.eE%+-],%f,%f,%f,%u%c", + indices,argx,argy,&psize,&rsize,&smoothness, + &is_fast_approximation,&end)==7) && + (cimg_sscanf(argx,"%f%c",&sigma_s,&end)==1 || + (cimg_sscanf(argx,"%f%c%c",&sigma_s,&sep0,&end)==2 && sep0=='%')) && + (cimg_sscanf(argy,"%f%c",&sigma_r,&end)==1 || + (cimg_sscanf(argy,"%f%c%c",&sigma_r,&sep1,&end)==2 && sep1=='%')) && + (ind=selection2cimg(indices,images.size(),images_names,"denoise")).height()==1 && sigma_s>=0 && sigma_r>=0 && psize>=0 && rsize>=0 && is_fast_approximation<=1) { psize = cimg::round(psize); rsize = cimg::round(rsize); - print(images,0,"Denoise image%s using %gx%g patches, with standard deviations %lg,%g, " + print(images,0,"Denoise image%s using guide image [%u], with %gx%g patches, " + "standard deviations (%g%s,%g%s), lookup size %g and smoothness %g.", + gmic_selection.data(),*ind,psize,psize, + sigma_s,sep0=='%'?"%":"", + sigma_r,sep1=='%'?"%":"", + rsize,smoothness); + const CImg guide = gmic_image_arg(*ind); + if (sep0=='%') sigma_s = -sigma_s; + if (sep1=='%') sigma_r = -sigma_r; + cimg_forY(selection,l) + gmic_apply(blur_patch(guide,sigma_s,sigma_r,(unsigned int)psize,(unsigned int)rsize,smoothness, + (bool)is_fast_approximation)); + } else if ((cimg_sscanf(argument,"%255[0-9.eE%+-]%c", + gmic_use_argx,&end)==1 || + cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-]%c", + argx,gmic_use_argy,&end)==2 || + cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%f%c", + argx,argy,&psize,&end)==3 || + cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%f,%f%c", + argx,argy,&psize,&rsize,&end)==4 || + cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%f,%f,%f%c", + argx,argy,&psize,&rsize,&smoothness,&end)==5 || + cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%f,%f,%f,%u%c", + argx,argy,&psize,&rsize,&smoothness, + &is_fast_approximation,&end)==6) && + (cimg_sscanf(argx,"%f%c",&sigma_s,&end)==1 || + (cimg_sscanf(argx,"%f%c%c",&sigma_s,&sep0,&end)==2 && sep0=='%')) && + (cimg_sscanf(argy,"%f%c",&sigma_r,&end)==1 || + (cimg_sscanf(argy,"%f%c%c",&sigma_r,&sep1,&end)==2 && sep1=='%')) && + sigma_s>=0 && sigma_r>=0 && psize>=0 && rsize>=0 && is_fast_approximation<=1) { + psize = cimg::round(psize); + rsize = cimg::round(rsize); + print(images,0,"Denoise image%s with %gx%g patches, standard deviations (%g%s,%g%s), " "lookup size %g and smoothness %g.", - gmic_selection.data(), - psize, - psize, - sigma_s, - sigma_r, - rsize, - smoothness); + gmic_selection.data(),psize,psize, + sigma_s,sep0=='%'?"%":"", + sigma_r,sep1=='%'?"%":"", + rsize,smoothness); + if (sep0=='%') sigma_s = -sigma_s; + if (sep1=='%') sigma_r = -sigma_r; cimg_forY(selection,l) gmic_apply(blur_patch(sigma_s,sigma_r,(unsigned int)psize,(unsigned int)rsize,smoothness, (bool)is_fast_approximation)); } else arg_error("denoise"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Deriche filter. @@ -6469,7 +6864,7 @@ if (sep=='%') sigma = -sigma; cimg_forY(selection,l) gmic_apply(deriche(sigma,order,axis,(bool)boundary)); } else arg_error("deriche"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Dijkstra algorithm. @@ -6505,7 +6900,7 @@ } } } else arg_error("dijkstra"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Estimate displacement field. @@ -6516,7 +6911,7 @@ sep = *argx = 0; ind0.assign(); if (((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c", - indices,&sep,&end)==2 && sep==']') || + gmic_use_indices,&sep,&end)==2 && sep==']') || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%f%c", indices,&smoothness,&end)==2 || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%f,%f%c", @@ -6530,14 +6925,14 @@ &is_backward,&end)==6 || (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%f,%f,%f,%f,%u,[%255[a-zA-Z0-9_.%+-]%c%c", indices,&smoothness,&precision,&nb_scales,&nb_iterations, - &is_backward,argx,&sep,&end)==8 && sep==']')) && + &is_backward,gmic_use_argx,&sep,&end)==8 && sep==']')) && (ind=selection2cimg(indices,images.size(),images_names,"displacement")).height()==1 && precision>=0 && nb_scales>=0 && nb_iterations>=0 && is_backward<=1 && (!*argx || (ind0=selection2cimg(argx,images.size(),images_names,"displacement")).height()==1)) { nb_scales = cimg::round(nb_scales); nb_iterations = cimg::round(nb_iterations); if (nb_scales) cimg_snprintf(argx,_argx.width(),"%g ",nb_scales); else std::strcpy(argx,"auto-"); - if (ind0) cimg_snprintf(argy,_argy.width()," with guide [%u]",*ind0); else *_argy = 0; + if (ind0) { gmic_use_argy; cimg_snprintf(argy,_argy.width()," with guide [%u]",*ind0); } else *argy = 0; print(images,0,"Estimate displacement field from source [%u] to image%s, with " "%s smoothness %g, precision %g, %sscales, %g iteration%s, in %s direction%s.", @@ -6555,7 +6950,7 @@ (unsigned int)nb_iterations,(bool)is_backward, constraints)); } else arg_error("displacement"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Display. @@ -6565,11 +6960,11 @@ value = value0 = value1 = 0; exit_on_anykey = 0; if (((cimg_sscanf(argument,"%255[0-9.eE%+-]%c", - argx,&end)==1) || + gmic_use_argx,&end)==1) || (cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - argx,argy,&end)==2) || + argx,gmic_use_argy,&end)==2) || (cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - argx,argy,argz,&end)==3) || + argx,argy,gmic_use_argz,&end)==3) || (cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-],%u%c", argx,argy,argz,&exit_on_anykey,&end)==4)) && (cimg_sscanf(argx,"%lf%c",&value,&end)==1 || @@ -6597,29 +6992,10 @@ XYZ[2] = (unsigned int)cimg::cut(cimg::round(sep1=='%'?(img.depth() - 1)*value1/100:value1), 0.,img.depth() - 1.); } + ++verbosity; display_images(images,images_names,selection,XYZ,exit_on_anykey); - is_released = true; continue; - } - - // Display 3D object. - if (!is_get && !std::strcmp("display3d",command)) { - gmic_substitute_args(true); - exit_on_anykey = 0; - sep = *indices = 0; - ind.assign(); - if ((cimg_sscanf(argument,"%u%c", - &exit_on_anykey,&end)==1 || - (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c", - indices,&sep,&end)==2 && sep==']') || - cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u%c", - indices,&exit_on_anykey,&end)==2) && - exit_on_anykey<=1 && - (*argument!='[' || - (ind=selection2cimg(indices,images.size(),images_names,"display3d")).height()==1)) ++position; - if (ind.height()==1) g_img_uc = gmic_image_arg(*ind); - display_objects3d(images,images_names,selection,g_img_uc,exit_on_anykey); - g_img_uc.assign(); - is_released = true; continue; + --verbosity; + is_change = false; continue; } goto gmic_commands_others; @@ -6628,12 +7004,14 @@ // Commands starting by 'e...' //----------------------------- gmic_commands_e : + if (check_elif && !std::strcmp("elif",item)) // Redirect 'elif' + goto gmic_commands_others; // Endif. - if (!std::strcmp("endif",item) || !std::strcmp("fi",item)) { + if (!is_get && (!std::strcmp("endif",item) || !std::strcmp("fi",item))) { const CImg &s = callstack.back(); if (s[0]!='*' || s[1]!='i') - error(images,0,0, + error(true,images,0,0, "Command 'endif': Not associated to a 'if' command within the same scope."); if (is_very_verbose) print(images,0,"End 'if...endif' block."); check_elif = false; @@ -6641,21 +7019,20 @@ continue; } - // Else and elif. - if (!std::strcmp("else",item) || (!std::strcmp("elif",item) && !check_elif)) { + // Else and eluded elif. + if (!is_get && (!std::strcmp("else",item) || (!check_elif && !std::strcmp("elif",item)))) { const CImg &s = callstack.back(); if (s[0]!='*' || s[1]!='i') - error(images,0,0, + error(true,images,0,0, "Command '%s': Not associated to a 'if' command within the same scope.", item); check_elif = false; if (is_very_verbose) print(images,0,"Reach 'else' block."); for (int nb_ifs = 1; nb_ifs && position0) { - is_debug_info = true; next_debug_line = _debug_line; next_debug_filename = _debug_filename; - } else { + if (*it==1) + is_debug_info|=get_debug_info(commands_line[position].data(),next_debug_line,next_debug_filename); + else { it+=*it=='-'; if (!std::strcmp("if",it)) ++nb_ifs; else if (!std::strcmp("endif",it) || !std::strcmp("fi",it)) { if (!--nb_ifs) --position; } @@ -6665,10 +7042,10 @@ } // End local environment. - if (!std::strcmp("endlocal",item) || !std::strcmp("endl",item)) { + if (!is_get && (!std::strcmp("endlocal",item) || !std::strcmp("endl",item))) { const CImg &s = callstack.back(); if (s[0]!='*' || s[1]!='l') - error(images,0,0, + error(true,images,0,0, "Command 'endlocal': Not associated to a 'local' command within " "the same scope."); if (is_very_verbose) print(images,0,"End 'local...endlocal' block."); @@ -6679,51 +7056,56 @@ // Evaluate expression. if (!std::strcmp("eval",command)) { if (is_get && !is_selection) - error(images,0,0, + error(true,images,0,0, "Command 'eval': Image selection is missing."); gmic_substitute_args(false); gmic_argument_text_printed(); - if (*argument_text=='\'') cimg::strpare(argument_text,'\'',true,false); + if (*_argument_text=='\'') cimg::strpare(_argument_text,'\'',true,false); name.assign(argument,(unsigned int)std::strlen(argument) + 1); cimg::strpare(name,'\'',true,false); strreplace_fw(name); if (!is_selection) { // No selection -> single evaluation print(images,0,"Evaluate expression '%s' and assign it to status.", - argument_text.data()); + _argument_text.data()); CImg &img = images.size()?images.back():CImg::empty(); CImg output; img.eval(output,name,0,0,0,0,&images,&images); if (output.height()>1) // Vector-valued result output.value_string().move_to(status); else { // Scalar result + gmic_use_formula; cimg_snprintf(formula,_formula.width(),"%.17g",*output); CImg::string(formula).move_to(status); } } else { // Selection -> loop over images print(images,0,"Evaluate expression '%s' looped over image%s.", - argument_text.data(), + _argument_text.data(), gmic_selection.data()); cimg_forY(selection,l) gmic_apply(gmic_eval(name.data(),images)); - is_released = false; + is_change = true; } ++position; continue; } // Echo. - if (!is_get && is_echo_command) { - if (is_verbose) { + if (is_command_echo) { + if (verbosity>=0 || is_debug || is_get) { gmic_substitute_args(false); name.assign(argument,(unsigned int)std::strlen(argument) + 1); cimg::strunescape(name); - if (is_selection) print(images,&selection,"%s",name.data()); - else print(images,0,"%s",name.data()); + const int _verbosity = ++verbosity; + std::FILE *_file = 0; + if (is_get) { _file = cimg::output(); verbosity = 1; cimg::output(stdout); } + if (is_selection) print(images,&selection,"%s",name.data()); else print(images,0,"%s",name.data()); + if (is_get) { verbosity = _verbosity; cimg::output(_file); } + --verbosity; } ++position; continue; } // Exec. - if (!std::strcmp("exec",item)) { + if (!is_get && !std::strcmp("exec",item)) { gmic_substitute_args(false); name.assign(argument,(unsigned int)std::strlen(argument) + 1); const char *arg_exec_text = gmic_argument_text_printed(); @@ -6748,6 +7130,7 @@ cimg::mutex(31); const int errcode = cimg::system(arg_exec,0,is_verbose); cimg::mutex(31,0); + gmic_use_title; cimg_snprintf(title,_title.width(),"%d",errcode); CImg::string(title).move_to(status); if (errcode) print(images,0,"Command 'exec' returned error code '%d'.", @@ -6757,12 +7140,12 @@ } // Error. - if (!is_get && !std::strcmp("error",command)) { + if (is_command_error) { gmic_substitute_args(false); name.assign(argument,(unsigned int)std::strlen(argument) + 1); cimg::strunescape(name); - if (is_selection) error(images,&selection,0,"%s",name.data()); - else error(images,0,0,"%s",name.data()); + if (is_selection) error(true,images,&selection,0,"%s",name.data()); + else error(true,images,0,0,"%s",name.data()); } // Invert endianness. @@ -6782,7 +7165,7 @@ } else print(images,0,"Invert data endianness of image%s.", gmic_selection.data()); cimg_forY(selection,l) gmic_apply(gmic_invert_endianness(argument)); - is_released = false; continue; + is_change = true; continue; } // Exponential. @@ -6808,10 +7191,10 @@ sep = sepx = sepy = sepz = sepc = *argx = *argy = *argz = *argc = *color = 0; pattern = ~0U; opacity = 1; if ((cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - argx,argy,argz,&end)==3 || + gmic_use_argx,gmic_use_argy,gmic_use_argz,&end)==3 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-]," "%255[0-9.eE%+-]%c", - argx,argy,argz,argc,&end)==4 || + argx,argy,argz,gmic_use_argc,&end)==4 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-]," "%255[0-9.eE%+-],%f%c", argx,argy,argz,argc,&angle,&end)==5 || @@ -6826,7 +7209,7 @@ (cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-]," "%255[0-9.eE%+-],%f,%f,0%c%x,%4095[0-9.eEinfa,+-]%c", argx,argy,argz,argc,&angle,&opacity,&sep, - &pattern,color,&end)==9 && + &pattern,gmic_use_color,&end)==9 && sep=='x') || (cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-]," "%255[0-9.eE%+-],%f,%f,%4095[0-9.eEinfa,+-]%c", @@ -6861,19 +7244,17 @@ nx = (int)cimg::round(sepx=='%'?x*(img.width() - 1)/100:x), ny = (int)cimg::round(sepy=='%'?y*(img.height() - 1)/100:y); const float - nR = cimg::round(sepz=='%'?R*rmax/100:R), - nr = cimg::round(sepc=='%'?r*rmax/100:r); + nR = sepz=='%'?R*rmax/100:R, + nr = sepc=='%'?r*rmax/100:r; if (sep=='x') { - if (nR==nr) { gmic_apply(draw_circle(nx,ny,(int)nR,g_img.data(),opacity,~0U)); } - else gmic_apply(draw_ellipse(nx,ny,nR,nr,angle,g_img.data(),opacity,~0U)); + gmic_apply(draw_ellipse(nx,ny,nR,nr,angle,g_img.data(),opacity,pattern)); } else { - if (nR==nr) { gmic_apply(draw_circle(nx,ny,(int)nR,g_img.data(),opacity)); } - else gmic_apply(draw_ellipse(nx,ny,nR,nr,angle,g_img.data(),opacity)); + gmic_apply(draw_ellipse(nx,ny,nR,nr,angle,g_img.data(),opacity)); } } } else arg_error("ellipse"); g_img.assign(); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Equalize. @@ -6931,7 +7312,7 @@ nb_levels)); gmic_apply(equalize(_nb_levels,(T)nvalue0,(T)nvalue1)); } - is_released = false; continue; + is_change = true; continue; } // Erode. @@ -6942,7 +7323,7 @@ boundary = 1; sep = 0; if (((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c", - indices,&sep,&end)==2 && sep==']') || + gmic_use_indices,&sep,&end)==2 && sep==']') || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u%c", indices,&boundary,&end)==2 || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u,%u%c", @@ -6978,7 +7359,7 @@ sx,sy,sz); cimg_forY(selection,l) gmic_apply(erode((unsigned int)sx,(unsigned int)sy,(unsigned int)sz)); } else arg_error("erode"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Build 3d elevation. @@ -6986,7 +7367,7 @@ gmic_substitute_args(true); sep = *formula = *indices = 0; float fact = 1; - if (cimg_sscanf(argument,"'%4095[^']'%c",formula,&end)==1) { + if (cimg_sscanf(argument,"'%4095[^']'%c",gmic_use_formula,&end)==1) { print(images,0,"Build 3D elevation of image%s, with elevation formula '%s'.", gmic_selection.data(), formula); @@ -6999,7 +7380,7 @@ primitives.assign(); } ++position; - } else if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",indices,&sep,&end)==2 && + } else if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_indices,&sep,&end)==2 && sep==']' && (ind=selection2cimg(indices,images.size(),images_names,"elevation3d")).height()==1) { print(images,0,"Build 3D elevation of image%s, with elevation map [%u].", @@ -7039,7 +7420,7 @@ } } g_list_f.assign(); - is_released = false; continue; + is_change = true; continue; } // Eigenvalues/eigenvectors. @@ -7063,7 +7444,7 @@ ++off; } } - is_released = false; continue; + is_change = true; continue; } goto gmic_commands_others; @@ -7072,33 +7453,25 @@ // Commands starting by 'f...' //----------------------------- gmic_commands_f : + if ((command[1]=='i' && !command[2]) || // Redirect 'fi' + (command[1]=='f' && command[2]=='t' && !command[3])) // Redirect 'fft' + goto gmic_commands_e; // For. - if (!std::strcmp("for",item)) { + if (!is_get && !std::strcmp("for",item)) { gmic_substitute_args(false); - float _is_cond = 0; - bool is_filename = false; - if (cimg_sscanf(argument,"%f%c",&_is_cond,&end)!=1) { - is_filename = true; - name.assign(argument,(unsigned int)std::strlen(argument) + 1); - strreplace_fw(name); - _is_cond = (float)check_filename(name); - } - const bool - is_cond = (bool)_is_cond, - is_first = !nb_fordones || fordones(0,nb_fordones - 1)!=position; + is_cond = check_cond(argument,images,"for"); + const bool is_first = !nb_fordones || fordones(0,nb_fordones - 1)!=position; if (is_very_verbose) - print(images,0,"%s %s -> %s '%s' %s.", + print(images,0,"%s %s -> condition '%s' %s.", !is_first?"Reach":is_cond?"Start":"Skip", is_first?"'for...done' block":"'for' command", - is_filename?"file":"condition", gmic_argument_text_printed(), - is_filename?(is_cond?"exists": - "does not exist"): - (is_cond?"holds":"does not hold")); + is_cond?"holds":"does not hold"); if (is_cond) { if (is_first) { if (is_debug_info && debug_line!=~0U) { + gmic_use_argx; cimg_snprintf(argx,_argx.width(),"*for#%u",debug_line); CImg::string(argx).move_to(callstack); } else CImg::string("*for").move_to(callstack); @@ -7116,7 +7489,7 @@ else if (!std::strcmp("done",it)) --nb_repeat_fors; } if (nb_repeat_fors && position>=commands_line.size()) - error(images,0,0, + error(true,images,0,0, "Command 'for': Missing associated 'done' command."); if (!is_first) { --nb_fordones; callstack.remove(); } } @@ -7134,7 +7507,7 @@ gmic_selection.data(), value); cimg_forY(selection,l) gmic_apply(fill((T)value)); - } else if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",indices,&sep,&end)==2 && + } else if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_indices,&sep,&end)==2 && sep==']' && (ind=selection2cimg(indices,images.size(),images_names,"fill")).height()==1) { print(images,0,"Fill image%s with values from image [%u].", @@ -7144,16 +7517,16 @@ cimg_forY(selection,l) gmic_apply(fill(values)); } else { gmic_argument_text_printed(); - if (*argument_text=='\'') cimg::strpare(argument_text,'\'',true,false); + if (*_argument_text=='\'') cimg::strpare(_argument_text,'\'',true,false); print(images,0,"Fill image%s with expression '%s'.", gmic_selection.data(), - argument_text.data()); + _argument_text.data()); name.assign(argument,(unsigned int)std::strlen(argument) + 1); cimg::strpare(name,'\'',true,false); strreplace_fw(name); cimg_forY(selection,l) gmic_apply(fill(name.data(),true,true,&images,&images)); } - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Flood fill. @@ -7164,11 +7537,11 @@ is_high_connectivity = 0; opacity = 1; if ((cimg_sscanf(argument,"%255[0-9.eE%+-]%c", - argx,&end)==1 || + gmic_use_argx,&end)==1 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - argx,argy,&end)==2 || + argx,gmic_use_argy,&end)==2 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - argx,argy,argz,&end)==3 || + argx,argy,gmic_use_argz,&end)==3 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eEinfa%+-],%f%c", argx,argy,argz,&tolerance,&end)==4 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eEinfa%+-],%f,%u%c", @@ -7178,7 +7551,7 @@ cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eEinfa%+-],%f,%u,%f," "%4095[0-9.eEinfa,+-]%c", argx,argy,argz,&tolerance,&is_high_connectivity, - &opacity,color,&end)==7) && + &opacity,gmic_use_color,&end)==7) && (cimg_sscanf(argx,"%f%c",&x,&end)==1 || (cimg_sscanf(argx,"%f%c%c",&x,&sepx,&end)==2 && sepx=='%')) && (!*argy || @@ -7210,11 +7583,11 @@ } } else arg_error("flood"); g_img.assign(); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // List of directory files. - if (!std::strcmp("files",item)) { + if (!is_get && !std::strcmp("files",item)) { gmic_substitute_args(false); unsigned int mode = 5; if ((*argument>='0' && *argument<='5') && @@ -7240,7 +7613,7 @@ } // Set 3D focale. - if (!std::strcmp("focale3d",item)) { + if (!is_get && !std::strcmp("focale3d",item)) { gmic_substitute_args(false); value = 700; if (cimg_sscanf(argument,"%lf%c",&value,&end)==1) ++position; @@ -7289,10 +7662,10 @@ // Compute gradient. if (!std::strcmp("gradient",command)) { gmic_substitute_args(false); - int scheme = 3; + int scheme = 0; *argx = 0; if ((cimg_sscanf(argument,"%15[xyz]%c", - argx,&end)==1 || + gmic_use_argx,&end)==1 || cimg_sscanf(argument,"%15[xyz],%d%c", argx,&scheme,&end)==2) && scheme>=-1 && scheme<=5) { @@ -7324,17 +7697,16 @@ } } g_list.assign(); - is_released = false; continue; + is_change = true; continue; } // Guided filter. if (!std::strcmp("guided",command)) { gmic_substitute_args(true); float radius = 0, regularization = 0; - *argz = *argc = 0; sep0 = sep1 = 0; if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - indices,argx,argy,&end)==3 && + gmic_use_indices,gmic_use_argx,gmic_use_argy,&end)==3 && (cimg_sscanf(argx,"%f%c",&radius,&end)==1 || (cimg_sscanf(argx,"%f%c%c",&radius,&sep0,&end)==2 && sep0=='%')) && (cimg_sscanf(argy,"%f%c",®ularization,&end)==1 || @@ -7352,7 +7724,7 @@ if (sep1=='%') regularization = -regularization; cimg_forY(selection,l) gmic_apply(blur_guided(guide,radius,regularization)); } else if (cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - argx,argy,&end)==2 && + gmic_use_argx,gmic_use_argy,&end)==2 && (cimg_sscanf(argx,"%f%c",&radius,&end)==1 || (cimg_sscanf(argx,"%f%c%c",&radius,&sep0,&end)==2 && sep0=='%')) && (cimg_sscanf(argy,"%f%c",®ularization,&end)==1 || @@ -7366,7 +7738,7 @@ if (sep1=='%') regularization = -regularization; cimg_forY(selection,l) gmic_apply(blur_guided(images[selection[l]],radius,regularization)); } else arg_error("guided"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Draw graph. @@ -7378,7 +7750,7 @@ *formula = *color = sep = sep1 = 0; pattern = ~0U; opacity = 1; if (((cimg_sscanf(argument,"'%1023[^']%c%c", - formula,&sep,&end)==2 && sep=='\'') || + gmic_use_formula,&sep,&end)==2 && sep=='\'') || cimg_sscanf(argument,"'%1023[^']',%f%c", formula,&resolution,&end)==2 || cimg_sscanf(argument,"'%1023[^']',%f,%u%c", @@ -7398,11 +7770,11 @@ &ymin,&ymax,&opacity,&sep1,&pattern,&end)==11 && sep1=='x') || (cimg_sscanf(argument,"'%1023[^']',%f,%u,%u,%lf,%lf,%lf,%lf,%f,%4095[0-9.eEinfa,+-]%c", formula,&resolution,&plot_type,&vertex_type,&xmin,&xmax,&ymin,&ymax, - &opacity,color,&end)==10 && (bool)(pattern=~0U)) || - (*color=0,cimg_sscanf(argument,"'%1023[^']',%f,%u,%u,%lf,%lf,%lf,%lf,%f,0%c%x," - "%4095[0-9.eEinfa,+-]%c", - formula,&resolution,&plot_type,&vertex_type,&xmin,&xmax, - &ymin,&ymax,&opacity,&sep1,&pattern,color,&end)==12 && + &opacity,gmic_use_color,&end)==10 && (bool)(pattern=~0U)) || + (cimg_sscanf(argument,"'%1023[^']',%f,%u,%u,%lf,%lf,%lf,%lf,%f,0%c%x," + "%4095[0-9.eEinfa,+-]%c", + formula,&resolution,&plot_type,&vertex_type,&xmin,&xmax, + &ymin,&ymax,&opacity,&sep1,&pattern,&(*color=0),&end)==12 && sep1=='x')) && resolution>0 && plot_type<=3 && vertex_type<=7) { resolution = cimg::round(resolution); @@ -7437,7 +7809,7 @@ gmic_apply(draw_graph(values,g_img.data(),opacity,plot_type,vertex_type,ymin,ymax,pattern)); } } else if (((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c", - indices,&sep,&end)==2 && sep==']') || + gmic_use_indices,&sep,&end)==2 && sep==']') || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u%c", indices,&plot_type,&end)==2 || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u,%u%c", @@ -7453,12 +7825,12 @@ (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u,%u,%lf,%lf,%f," "%4095[0-9.eEinfa,+-]%c", indices,&plot_type,&vertex_type,&ymin,&ymax,&opacity, - color,&end)==7 && + gmic_use_color,&end)==7 && (bool)(pattern=~0U)) || - (*color=0,cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u,%u,%lf,%lf," - "%f,0%c%x,%4095[0-9.eEinfa,+-]%c", - indices,&plot_type,&vertex_type,&ymin,&ymax, - &opacity,&sep1,&pattern,color,&end)==9 && + (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u,%u,%lf,%lf," + "%f,0%c%x,%4095[0-9.eEinfa,+-]%c", + indices,&plot_type,&vertex_type,&ymin,&ymax, + &opacity,&sep1,&pattern,&(*color=0),&end)==9 && sep1=='x')) && (ind=selection2cimg(indices,images.size(),images_names,"graph")).height()==1 && plot_type<=3 && vertex_type<=7) { @@ -7482,7 +7854,7 @@ } } else arg_error("graph"); g_img.assign(); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } goto gmic_commands_others; @@ -7548,7 +7920,7 @@ nb_levels)); gmic_apply(histogram(_nb_levels,(T)nvalue0,(T)nvalue1)); } - is_released = false; continue; + is_change = true; continue; } // Compute Hessian. @@ -7556,7 +7928,7 @@ gmic_substitute_args(false); *argx = 0; if (cimg_sscanf(argument,"%255[xyz]%c", - argx,&end)==1) { + gmic_use_argx,&end)==1) { ++position; print(images,0,"Compute Hessian of image%s along axes '%s'.", gmic_selection.data(), @@ -7582,7 +7954,7 @@ } } g_list.assign(); - is_released = false; continue; + is_change = true; continue; } goto gmic_commands_others; @@ -7591,6 +7963,10 @@ // Commands starting by 'i...' //----------------------------- gmic_commands_i : + if (is_command_input || // Redirect 'input' + (command[1]=='f' && !command[2]) || // Redirect 'if' + (command[1]=='f' && command[2]=='f' && command[3]=='t' && !command[4])) // Redirect 'ifft' + goto gmic_commands_others; // Draw image. if (!std::strcmp("image",command)) { @@ -7601,27 +7977,26 @@ ind0.assign(); opacity = 1; if (((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c", - indices,&sep,&end)==2 && sep==']') || - cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-]%c", - indices,argx,&end)==2 || - cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - indices,argx,argy,&end)==3 || - cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-],%255[0-9.eE%+-]," - "%255[0-9.eE%+-]%c", - indices,argx,argy,argz,&end)==4 || - cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-],%255[0-9.eE%+-]," - "%255[0-9.eE%+-]," - "%255[0-9.eE%+-]%c", - indices,argx,argy,argz,argc,&end)==5 || - cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-],%255[0-9.eE%+-]," - "%255[0-9.eE%+-],%255[0-9.eE%+-],%f%c", + gmic_use_indices,&sep,&end)==2 && sep==']') || + cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%~+-]%c", + indices,gmic_use_argx,&end)==2 || + cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%~+-],%255[0-9.eE%~+-]%c", + indices,argx,gmic_use_argy,&end)==3 || + cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%~+-],%255[0-9.eE%~+-]," + "%255[0-9.eE%~+-]%c", + indices,argx,argy,gmic_use_argz,&end)==4 || + cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%~+-],%255[0-9.eE%~+-]," + "%255[0-9.eE%~+-],%255[0-9.eE%~+-]%c", + indices,argx,argy,argz,gmic_use_argc,&end)==5 || + cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%~+-],%255[0-9.eE%~+-]," + "%255[0-9.eE%~+-],%255[0-9.eE%~+-],%f%c", indices,argx,argy,argz,argc,&opacity,&end)==6 || - (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-],%255[0-9.eE%+-]," - "%255[0-9.eE%+-],%255[0-9.eE%+-],%f,[%255[a-zA-Z0-9_.%+-]%c%c", + (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%~+-],%255[0-9.eE%~+-]," + "%255[0-9.eE%~+-],%255[0-9.eE%~+-],%f,[%255[a-zA-Z0-9_.%+-]%c%c", indices,argx,argy,argz,argc,&opacity,name.data(),&sep,&end)==8 && sep==']') || - cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-],%255[0-9.eE%+-]," - "%255[0-9.eE%+-],%255[0-9.eE%+-],%f,[%255[a-zA-Z0-9_.%+-]],%f%c", + cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%~+-],%255[0-9.eE%~+-]," + "%255[0-9.eE%~+-],%255[0-9.eE%~+-],%f,[%255[a-zA-Z0-9_.%+-]],%f%c", indices,argx,argy,argz,argc,&opacity,name.data(), &max_opacity_mask,&end)==8) && (ind=selection2cimg(indices,images.size(),images_names,"image")).height()==1 && @@ -7629,16 +8004,16 @@ (ind0=selection2cimg(name,images.size(),images_names,"image")).height()==1) && (!*argx || cimg_sscanf(argx,"%f%c",&x,&end)==1 || - (cimg_sscanf(argx,"%f%c%c",&x,&sepx,&end)==2 && sepx=='%')) && + (cimg_sscanf(argx,"%f%c%c",&x,&sepx,&end)==2 && (sepx=='%' || sepx=='~'))) && (!*argy || cimg_sscanf(argy,"%f%c",&y,&end)==1 || - (cimg_sscanf(argy,"%f%c%c",&y,&sepy,&end)==2 && sepy=='%')) && + (cimg_sscanf(argy,"%f%c%c",&y,&sepy,&end)==2 && (sepy=='%' || sepy=='~'))) && (!*argz || cimg_sscanf(argz,"%f%c",&z,&end)==1 || - (cimg_sscanf(argz,"%f%c%c",&z,&sepz,&end)==2 && sepz=='%')) && + (cimg_sscanf(argz,"%f%c%c",&z,&sepz,&end)==2 && (sepz=='%' || sepz=='~'))) && (!*argc || cimg_sscanf(argc,"%f%c",&c,&end)==1 || - (cimg_sscanf(argc,"%f%c%c",&c,&sepc,&end)==2 && sepc=='%'))) { + (cimg_sscanf(argc,"%f%c%c",&c,&sepc,&end)==2 && (sepc=='%' || sepc=='~')))) { const CImg sprite = gmic_image_arg(*ind); CImg mask; if (ind0) { @@ -7646,44 +8021,41 @@ print(images,0,"Draw image [%u] at (%g%s,%g%s,%g%s,%g%s) on image%s, " "with opacity %g and mask [%u].", *ind, - x,sepx=='%'?"%":"", - y,sepy=='%'?"%":"", - z,sepz=='%'?"%":"", - c,sepc=='%'?"%":"", + x,sepx=='%'?"%":sepx=='~'?"~":"", + y,sepy=='%'?"%":sepy=='~'?"~":"", + z,sepz=='%'?"%":sepz=='~'?"~":"", + c,sepc=='%'?"%":sepc=='~'?"~":"", gmic_selection.data(), opacity, *ind0); } else print(images,0,"Draw image [%u] at (%g%s,%g%s,%g%s,%g%s) on image%s, " "with opacity %g.", *ind, - x,sepx=='%'?"%":"", - y,sepy=='%'?"%":"", - z,sepz=='%'?"%":"", - c,sepc=='%'?"%":"", + x,sepx=='%'?"%":sepx=='~'?"~":"", + y,sepy=='%'?"%":sepy=='~'?"~":"", + z,sepz=='%'?"%":sepz=='~'?"~":"", + c,sepc=='%'?"%":sepc=='~'?"~":"", gmic_selection.data(), opacity); - cimg_forY(selection,l) { - CImg &img = images[selection[l]]; - const int - nx = (int)cimg::round(sepx=='%'?x*(img.width() - 1)/100:x), - ny = (int)cimg::round(sepy=='%'?y*(img.height() - 1)/100:y), - nz = (int)cimg::round(sepz=='%'?z*(img.depth() - 1)/100:z), - nc = (int)cimg::round(sepc=='%'?c*(img.spectrum() - 1)/100:c); - if (ind0) { gmic_apply(draw_image(nx,ny,nz,nc,sprite,mask,opacity,max_opacity_mask)); } - else gmic_apply(draw_image(nx,ny,nz,nc,sprite,opacity)); - } + cimg_forY(selection,l) + if (ind0) { + gmic_apply(gmic_draw_image(x,y,z,c,sepx,sepy,sepz,sepc,sprite,mask,opacity,max_opacity_mask)); + } + else { + gmic_apply(gmic_draw_image(x,y,z,c,sepx,sepy,sepz,sepc,sprite,opacity)); + } } else arg_error("image"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Index image with a LUT. if (!std::strcmp("index",command)) { gmic_substitute_args(true); - unsigned int lut_type = 0, map_indexes = 0; + unsigned int map_indexes = 0; float dithering = 0; sep = 0; if (((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c", - indices,&sep,&end)==2 && sep==']') || + gmic_use_indices,&sep,&end)==2 && sep==']') || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%f%c", indices,&dithering,&end)==2 || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%f,%u%c", @@ -7697,29 +8069,26 @@ map_indexes?" and index mapping":""); const CImg palette = gmic_image_arg(*ind); cimg_forY(selection,l) gmic_apply(index(palette,ndithering,(bool)map_indexes)); - } else if ((cimg_sscanf(argument,"%u%c",&lut_type,&end)==1 || - cimg_sscanf(argument,"%u,%f%c",&lut_type,&dithering,&end)==2 || - cimg_sscanf(argument,"%u,%f,%u%c", - &lut_type,&dithering,&map_indexes,&end)==3) && - lut_type<=7) { - const float ndithering = dithering<0?0:dithering>1?1:dithering; - print(images,0,"Index values in image%s by %s color LUT, with dithering level %g%s.", - gmic_selection.data(), - lut_type==0?"default":lut_type==1?"HSV":lut_type==2?"lines":lut_type==3?"hot": - lut_type==4?"cool":lut_type==5?"jet":lut_type==6?"flag":"cube", - ndithering,map_indexes?" and index mapping":""); - const CImg - palette = lut_type==0?CImg::default_LUT256():lut_type==1?CImg::HSV_LUT256(): - lut_type==2?CImg::lines_LUT256():lut_type==3?CImg::hot_LUT256(): - lut_type==4?CImg::cool_LUT256():lut_type==5?CImg::jet_LUT256(): - lut_type==6?CImg::flag_LUT256():CImg::cube_LUT256(); - cimg_forY(selection,l) gmic_apply(index(palette,ndithering,(bool)map_indexes)); - } else arg_error("index"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; + } + // When command 'index' is invoked with different arguments, custom version in stdlib + // is used rather than the built-in version. + is_builtin_command = false; + goto gmic_commands_others; } // Matrix inverse. - gmic_simple_command("invert",invert,"Invert matrix image%s."); + if (!std::strcmp("invert",command)) { + gmic_substitute_args(false); + if (cimg_sscanf(argument,"%u%c", + &pattern,&end)==1 && pattern<=1) ++position; + else pattern = 1; + print(images,0,"Invert matrix image%s, using %s-based solver.", + gmic_selection.data(),pattern?"LU":"SVD"); + cimg_forY(selection,l) gmic_apply(invert((bool)pattern)); + is_change = true; + continue; + } // Extract 3D isoline. if (!std::strcmp("isoline3d",command)) { @@ -7774,7 +8143,7 @@ } else gmic_apply(replace(img)); } } else if ((cimg_sscanf(argument,"'%4095[^']',%lf%c", - formula,&value,&end)==2 || + gmic_use_formula,&value,&end)==2 || cimg_sscanf(argument,"'%4095[^']',%lf,%f,%f,%f,%f%c", formula,&value,&x0,&y0,&x1,&y1,&end)==6 || cimg_sscanf(argument,"'%4095[^']',%lf,%f,%f,%f,%f,%f,%f%c", @@ -7806,10 +8175,11 @@ x0,y0,x1,y1,(int)dx,(int)dy).move_to(vertices); vertices.object3dtoCImg3d(primitives,false).move_to(images); primitives.assign(); + gmic_use_title; cimg_snprintf(title,_title.width(),"[3D isoline %g of '%s']",value,formula); CImg::string(title).move_to(images_names); } else arg_error("isoline3d"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Extract 3D isosurface. @@ -7871,7 +8241,7 @@ } else gmic_apply(replace(img)); } } else if ((cimg_sscanf(argument,"'%4095[^']',%lf%c", - formula,&value,&end)==2 || + gmic_use_formula,&value,&end)==2 || cimg_sscanf(argument,"'%4095[^']',%lf,%f,%f,%f,%f,%f,%f%c", formula,&value,&x0,&y0,&z0,&x1,&y1,&z1,&end)==8 || cimg_sscanf(argument,"'%4095[^']',%lf,%f,%f,%f,%f,%f,%f,%f,%f,%f%c", @@ -7925,10 +8295,11 @@ x0,y0,z0,x1,y1,z1,(int)dx,(int)dy,(int)dz).move_to(vertices); vertices.object3dtoCImg3d(primitives,false).move_to(images); primitives.assign(); + gmic_use_title; cimg_snprintf(title,_title.width(),"[3D isosurface %g of '%s']",value,formula); CImg::string(title).move_to(images_names); } else arg_error("isosurface3d"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Inpaint. @@ -7938,7 +8309,7 @@ blend_size = 0, blend_threshold = 0, blend_decay = 0.05f, blend_scales = 10; unsigned int is_blend_outer = 1, method = 1; sep = *indices = 0; - if (((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",indices,&sep,&end)==2 && + if (((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_indices,&sep,&end)==2 && sep==']') || (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%c%c",indices,&sep,&end)==2 && sep=='0') || @@ -7953,7 +8324,7 @@ const CImg mask = gmic_image_arg(*ind); cimg_forY(selection,l) gmic_apply(inpaint(mask,method)); } else if (((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c", - indices,&sep,&end)==2 && sep==']') || + gmic_use_indices,&sep,&end)==2 && sep==']') || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%f%c", indices,&patch_size,&end)==2 || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%f,%f%c", @@ -8006,7 +8377,7 @@ (unsigned int)blend_size,blend_threshold,blend_decay, (unsigned int)blend_scales,(bool)is_blend_outer)); } else arg_error("inpaint"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } goto gmic_commands_others; @@ -8047,7 +8418,7 @@ cimg::mutex(29,0); } g_list.assign(); g_list_c.assign(); - is_released = false; continue; + is_change = true; continue; } goto gmic_commands_others; @@ -8057,9 +8428,10 @@ //----------------------------- gmic_commands_l : - // Start local environnement. + // Start local environment. if (!std::strcmp("local",command)) { if (is_debug_info && debug_line!=~0U) { + gmic_use_argx; cimg_snprintf(argx,_argx.width(),"*local#%u",debug_line); CImg::string(argx).move_to(callstack); } else CImg::string("*local").move_to(callstack); @@ -8083,7 +8455,7 @@ else { if ((images[uind].width() || images[uind].height()) && !images[uind]._spectrum) { selection2string(selection,images_names,1,name); - error(images,0,0, + error(true,images,0,0, "Command 'local': Invalid selection%s " "(image [%u] is already used in another thread).", name.data() + (*name=='s'?1:0),uind); @@ -8097,40 +8469,53 @@ } cimg::mutex(27,0); } + const unsigned int local_callstack_size = callstack.size(); + const int o_verbosity = verbosity; try { if (next_debug_line!=~0U) { debug_line = next_debug_line; next_debug_line = ~0U; } if (next_debug_filename!=~0U) { debug_filename = next_debug_filename; next_debug_filename = ~0U; } _run(commands_line,position,g_list,g_list_c,images,images_names,variables_sizes,is_noarg,0, command_selection); } catch (gmic_exception &e) { + check_elif = false; int nb_locals = 0; for (nb_locals = 1; nb_locals && position0) { - is_debug_info = true; next_debug_line = _debug_line; next_debug_filename = _debug_filename; - } else { + if (*it==1) + is_debug_info|=get_debug_info(commands_line[position].data(),next_debug_line,next_debug_filename); + else { const bool _is_get = *it=='+' || (*it=='-' && it[1]=='-'); it+=(*it=='+' || *it=='-') + (*it=='-' && it[1]=='-'); if (!std::strcmp("local",it) || !std::strcmp("l",it) || + !std::strncmp("local.",it,6) || !std::strncmp("l.",it,2) || !std::strncmp("local[",it,6) || !std::strncmp("l[",it,2)) ++nb_locals; else if (!_is_get && (!std::strcmp("endlocal",it) || !std::strcmp("endl",it))) --nb_locals; else if (!_is_get && nb_locals==1 && !std::strcmp("onfail",it)) break; } } - if (callstack.size()>local_callstack_size) callstack.remove(local_callstack_size,callstack.size() - 1); + if (callstack.size()>local_callstack_size) + for (unsigned int k = callstack.size() - 1; k>=local_callstack_size; --k) { + const char *const s = callstack[k].data(); + if (*s=='*') switch (s[1]) { + case 'r' : --nb_repeatdones; break; + case 'd' : --nb_dowhiles; break; + case 'f' : --nb_fordones; break; + } + callstack.remove(k); + } if (nb_locals==1 && position=0) ++position; - else { tolerance = 0; is_high_connectivity = 0; } + cimg_sscanf(argument,"%f,%u%c",&tolerance,&is_high_connectivity,&end)==2 || + cimg_sscanf(argument,"%f,%u,%u%c",&tolerance,&is_high_connectivity,&is_L2_norm,&end)==3) && + tolerance>=0 && is_high_connectivity<=1 && is_L2_norm<=1) ++position; + else { tolerance = 0; is_high_connectivity = 0; is_L2_norm = 1; } print(images,0, - "Label connected components on image%s, with tolerance %g and " + "Label connected components on image%s, with tolerance %g (L%d-norm) and " "%s connectivity.", - gmic_selection.data(),tolerance,is_high_connectivity?"high":"low"); - cimg_forY(selection,l) gmic_apply(label((bool)is_high_connectivity,tolerance)); - is_released = false; continue; + gmic_selection.data(),tolerance,1 + is_L2_norm,is_high_connectivity?"high":"low"); + cimg_forY(selection,l) gmic_apply(label((bool)is_high_connectivity,tolerance,is_L2_norm)); + is_change = true; continue; } // Set 3D light position. - if (!std::strcmp("light3d",item)) { + if (!is_get && !std::strcmp("light3d",item)) { gmic_substitute_args(true); float lx = 0, ly = 0, lz = -5e8f; sep = *indices = 0; @@ -8287,7 +8675,7 @@ light3d_y = ly; light3d_z = lz; ++position; - } else if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",indices,&sep,&end)==2 && + } else if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_indices,&sep,&end)==2 && sep==']' && (ind=selection2cimg(indices,images.size(),images_names,"light3d")).height()==1) { print(images,0,"Set 3D light texture from image [%u].",*ind); @@ -8307,6 +8695,8 @@ // Commands starting by 'm...' //----------------------------- gmic_commands_m : + if (command[1]=='u' && command[2]=='l' && command[3]=='3' && command[4]=='d' && !command[5]) // Redirect 'mul3d' + goto gmic_commands_others; // Move images. if (!std::strcmp("move",command)) { @@ -8319,7 +8709,7 @@ _iind0 = (int)cimg::round(sep=='%'?pos*images.size()/100:pos), iind0 = _iind0<0?_iind0 + (int)images.size():_iind0; if (iind0<0 || iind0>(int)images.size()) - error(images,0,0, + error(true,images,0,0, "Command 'move': Invalid position '%d' (not in range -%u...%u).", _iind0,images.size(),images.size() - 1); print(images,0,"Move image%s to position %d.", @@ -8358,25 +8748,7 @@ _images_names.move_to(images_names,0); } } else arg_error("move"); - is_released = false; ++position; continue; - } - - // Mirror. - if (!std::strcmp("mirror",command)) { - gmic_substitute_args(false); - bool is_valid_argument = *argument!=0; - if (is_valid_argument) for (const char *s = argument; *s; ++s) { - const char _s = *s; - if (_s!='x' && _s!='y' && _s!='z' && _s!='c') { is_valid_argument = false; break; } - } - if (is_valid_argument) { - print(images,0,"Mirror image%s along the '%s'-ax%cs.", - gmic_selection.data(), - gmic_argument_text_printed(), - std::strlen(argument)>1?'e':'i'); - cimg_forY(selection,l) gmic_apply(mirror(argument)); - } else arg_error("mirror"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Multiplication. @@ -8416,6 +8788,20 @@ "Compute pointwise maximum between image%s and expression %s", gmic_selection.data(),gmic_argument_text_printed(), "Compute pointwise maximum of all image%s together"); + + // Maxabs. + gmic_arithmetic_command("maxabs", + maxabs, + "Compute pointwise maxabs between image%s and %g%s", + gmic_selection.data(),value,ssep,T, + maxabs, + "Compute pointwise maxabs between image%s and image [%d]", + gmic_selection.data(),ind[0], + maxabs, + "Compute pointwise maxabs between image%s and expression %s", + gmic_selection.data(),gmic_argument_text_printed(), + "Compute pointwise maxabs of all image%s together"); + // Min. gmic_arithmetic_command("min", min, @@ -8429,6 +8815,19 @@ gmic_selection.data(),gmic_argument_text_printed(), "Compute pointwise minimum of image%s"); + // Minabs. + gmic_arithmetic_command("minabs", + minabs, + "Compute pointwise minabs between image%s and %g%s", + gmic_selection.data(),value,ssep,T, + minabs, + "Compute pointwise minabs between image%s and image [%d]", + gmic_selection.data(),ind[0], + minabs, + "Compute pointwise minabs between image%s and expression %s", + gmic_selection.data(),gmic_argument_text_printed(), + "Compute pointwise minabs of image%s"); + // Matrix multiplication. gmic_arithmetic_command("mmul", operator*=, @@ -8442,21 +8841,72 @@ gmic_selection.data(),gmic_argument_text_printed(), "Multiply matrix/vector%s"); - // Matrix division. - gmic_arithmetic_command("mdiv", - operator/=, - "Divide matrix/vector%s by %g%s", - gmic_selection.data(),value,ssep,Tfloat, - operator/=, - "Divide matrix/vector%s by matrix/vector image [%d]", - gmic_selection.data(),ind[0], - operator_diveq, - "Divide matrix/vector%s by expression %s", - gmic_selection.data(),gmic_argument_text_printed(), - "Divide matrix/vector%s"); + // Map LUT. + if (!std::strcmp("map",command)) { + gmic_substitute_args(true); + sep = *indices = 0; + boundary = 0; + if (((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_indices,&sep,&end)==2 && sep==']') || + cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u%c",indices,&boundary,&end)==2) && + (ind=selection2cimg(indices,images.size(),images_names,"map")).height()==1 && + boundary<=3) { + print(images,0,"Map LUT [%u] on image%s, with %s boundary conditions.", + *ind, + gmic_selection.data(), + boundary==0?"dirichlet":boundary==1?"neumann":boundary==2?"periodic":"mirror"); + const CImg palette = gmic_image_arg(*ind); + cimg_forY(selection,l) gmic_apply(map(palette,boundary)); + is_change = true; ++position; continue; + } + // If command 'map' is invoked with different arguments, custom version in stdlib + // is used rather than the built-in version. + is_builtin_command = false; + goto gmic_commands_others; + } + + // Mirror. + if (!std::strcmp("mirror",command)) { + gmic_substitute_args(false); + bool is_valid_argument = *argument!=0; + if (is_valid_argument) for (const char *s = argument; *s; ++s) { + const char _s = *s; + if (_s!='x' && _s!='y' && _s!='z' && _s!='c') { is_valid_argument = false; break; } + } + if (is_valid_argument) { + print(images,0,"Mirror image%s along the '%s'-ax%cs.", + gmic_selection.data(), + gmic_argument_text_printed(), + std::strlen(argument)>1?'e':'i'); + cimg_forY(selection,l) gmic_apply(mirror(argument)); + } else arg_error("mirror"); + is_change = true; ++position; continue; + } + + // Median filter. + if (!std::strcmp("median",command)) { + gmic_substitute_args(false); + float fsiz = 3, threshold = 0; + if ((cimg_sscanf(argument,"%f%c", + &fsiz,&end)==1 || + cimg_sscanf(argument,"%f,%f%c", + &fsiz,&threshold,&end)==2) && + fsiz>=0 && threshold>=0) { + fsiz = cimg::round(fsiz); + if (threshold) + print(images,0,"Apply median filter of size %g with threshold %g, on image%s.", + fsiz,threshold, + gmic_selection.data()); + else + print(images,0,"Apply median filter of size %g, on image%s.", + fsiz, + gmic_selection.data()); + cimg_forY(selection,l) gmic_apply(blur_median((unsigned int)fsiz,threshold)); + } else arg_error("median"); + is_change = true; ++position; continue; + } // Set 3D rendering modes. - if (!std::strcmp("mode3d",item)) { + if (!is_get && !std::strcmp("mode3d",item)) { gmic_substitute_args(false); float mode = 4; if (cimg_sscanf(argument,"%f%c", @@ -8472,7 +8922,7 @@ continue; } - if (!std::strcmp("moded3d",item)) { + if (!is_get && !std::strcmp("moded3d",item)) { gmic_substitute_args(false); float mode = -1; if (cimg_sscanf(argument,"%f%c", @@ -8488,63 +8938,6 @@ continue; } - // Map LUT. - if (!std::strcmp("map",command)) { - gmic_substitute_args(true); - unsigned int lut_type = 0; - sep = *indices = 0; - boundary = 0; - if (((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",indices,&sep,&end)==2 && sep==']') || - cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u%c",indices,&boundary,&end)==2) && - (ind=selection2cimg(indices,images.size(),images_names,"map")).height()==1 && - boundary<=3) { - print(images,0,"Map LUT [%u] on image%s, with %s boundary conditions.", - *ind, - gmic_selection.data(), - boundary==0?"dirichlet":boundary==1?"neumann":boundary==2?"periodic":"mirror"); - const CImg palette = gmic_image_arg(*ind); - cimg_forY(selection,l) gmic_apply(map(palette,boundary)); - } else if ((cimg_sscanf(argument,"%u%c",&lut_type,&end)==1 || - cimg_sscanf(argument,"%u,%u%c",&lut_type,&boundary,&end)==2) && - lut_type<=7 && boundary<=3) { - print(images,0,"Map %s color LUT on image%s, with %s boundary conditions.", - lut_type==0?"default":lut_type==1?"HSV":lut_type==2?"lines":lut_type==3?"hot": - lut_type==4?"cool":lut_type==5?"jet":lut_type==6?"flag":"cube", - gmic_selection.data(), - boundary==0?"dirichlet":boundary==1?"neumann":boundary==2?"periodic":"mirror"); - const CImg - palette = lut_type==0?CImg::default_LUT256():lut_type==1?CImg::HSV_LUT256(): - lut_type==2?CImg::lines_LUT256():lut_type==3?CImg::hot_LUT256(): - lut_type==4?CImg::cool_LUT256():lut_type==5?CImg::jet_LUT256(): - lut_type==6?CImg::flag_LUT256():CImg::cube_LUT256(); - cimg_forY(selection,l) gmic_apply(map(palette,boundary)); - } else arg_error("map"); - is_released = false; ++position; continue; - } - - // Median filter. - if (!std::strcmp("median",command)) { - gmic_substitute_args(false); - float siz = 3, threshold = 0; - if ((cimg_sscanf(argument,"%f%c", - &siz,&end)==1 || - cimg_sscanf(argument,"%f,%f%c", - &siz,&threshold,&end)==2) && - siz>=0 && threshold>=0) { - siz = cimg::round(siz); - if (threshold) - print(images,0,"Apply median filter of size %g with threshold %g, on image%s.", - siz,threshold, - gmic_selection.data()); - else - print(images,0,"Apply median filter of size %g, on image%s.", - siz, - gmic_selection.data()); - cimg_forY(selection,l) gmic_apply(blur_median((unsigned int)siz,threshold)); - } else arg_error("median"); - is_released = false; ++position; continue; - } - // MSE. if (!std::strcmp("mse",command)) { print(images,0,"Compute the %dx%d matrix of MSE values, from image%s.", @@ -8566,17 +8959,17 @@ } g_list.assign(); } - is_released = false; continue; + is_change = true; continue; } // Get patch-matching correspondence map. if (!std::strcmp("matchpatch",command)) { gmic_substitute_args(true); - float patch_width, patch_height, patch_depth = 1, nb_iterations = 5, nb_randoms = 5, occ_penalization = 0; + float patch_width, patch_height, patch_depth = 1, nb_iterations = 5, nb_randoms = 5, patch_penalization = 0; unsigned int is_score = 0; *argx = 0; ind0.assign(); if (((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%f,%c", - indices,&patch_width,&end)==2 && (patch_height=patch_width)) || + gmic_use_indices,&patch_width,&end)==2 && (patch_height=patch_width)) || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%f,%f,%c", indices,&patch_width,&patch_height,&end)==3 || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%f,%f,%f%c", @@ -8587,13 +8980,13 @@ indices,&patch_width,&patch_height,&patch_depth,&nb_iterations,&nb_randoms,&end)==6 || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%f,%f,%f,%f,%f,%f%c", indices,&patch_width,&patch_height,&patch_depth,&nb_iterations,&nb_randoms, - &occ_penalization,&end)==7 || + &patch_penalization,&end)==7 || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%f,%f,%f,%f,%f,%f,%u%c", indices,&patch_width,&patch_height,&patch_depth,&nb_iterations,&nb_randoms, - &occ_penalization,&is_score,&end)==8 || + &patch_penalization,&is_score,&end)==8 || (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%f,%f,%f,%f,%f,%f,%u,[%255[a-zA-Z0-9_.%+-]%c%c", indices,&patch_width,&patch_height,&patch_depth,&nb_iterations,&nb_randoms, - &occ_penalization,&is_score,argx,&sep,&end)==10 && sep==']')) && + &patch_penalization,&is_score,gmic_use_argx,&sep,&end)==10 && sep==']')) && (ind=selection2cimg(indices,images.size(),images_names,"matchpatch")).height()==1 && (!*argx || (ind0=selection2cimg(argx,images.size(),images_names,"matchpatch")).height()==1) && @@ -8607,14 +9000,14 @@ nb_randoms = cimg::round(nb_randoms); if (ind0) initialization = &images[*ind0]; print(images,0,"Estimate correspondence map between image%s and patch image [%u], " - "using %gx%gx%g patches, %g iteration%s, %g randomization%s and occurence penalization %g " + "using %gx%gx%g patches, %g iteration%s, %g randomization%s and occurrence penalization %g " "(%sscore returned).", gmic_selection.data(), *ind, patch_width,patch_height,patch_depth, nb_iterations,nb_iterations!=1?"s":"", nb_randoms,nb_randoms!=1?"s":"", - occ_penalization, + patch_penalization, is_score?"":"no "); const CImg patch_image = gmic_image_arg(*ind); cimg_forY(selection,l) gmic_apply(gmic_matchpatch(patch_image, @@ -8623,11 +9016,79 @@ (unsigned int)patch_depth, (unsigned int)nb_iterations, (unsigned int)nb_randoms, - occ_penalization, + patch_penalization, (bool)is_score, initialization)); } else arg_error("matchpatch"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; + } + + // Project matrix onto dictionnary. + if (!std::strcmp("mproj",command)) { + gmic_substitute_args(true); + int method = 0, max_iter = 0; + sep = *indices = 0; value = 1e-6; + if ((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c", + gmic_use_indices,&sep,&end)==2 || + cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c,%d%c", + indices,&sep,&method,&end)==3 || + cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c,%d,%d%c", + indices,&sep,&method,&max_iter,&end)==4 || + cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c,%d,%d,%lf%c", + indices,&sep,&method,&max_iter,&value,&end)==5) && + sep==']' && method>=0 && max_iter>=0 && value>=0 && + (ind=selection2cimg(indices,images.size(),images_names,"mproj")).height()==1) { + const CImg A = gmic_image_arg(*ind); + if (method==0) + print(images,0,"Project matri%s%s to dictionnary [%d] with orthogonal projection.", + selection.size()>1?"ce":"x",gmic_selection.data(),*ind); + else if (method<4) + print(images,0,"Project matri%s%s to dictionnary [%d] with %s, " + "max iterations %d and max residual %g.", + selection.size()>1?"ce":"x",gmic_selection.data(),*ind, + method==1?"matching pursuit": + method==2?"matching pursuit + orthogonal projection": + "orthogonal matching pursuit (ortho-projection every iteration)", + max_iter?max_iter:A.width(),value); + else + print(images,0,"Project matri%s%s to dictionnary [%d] with orthogonal matching pursuit " + "(ortho-projection every %d iterations), max iterations %d and max residual %g.", + selection.size()>1?"ce":"x",gmic_selection.data(),*ind, + method - 2,max_iter?max_iter:A.width(),value); + + cimg_forY(selection,l) gmic_apply_double(project_matrix(A,method,max_iter,value)); + } else arg_error("mproj"); + is_change = true; ++position; continue; + } + + // Matrix division. + gmic_arithmetic_command("mdiv", + operator/=, + "Divide matrix/vector%s by %g%s", + gmic_selection.data(),value,ssep,Tfloat, + operator/=, + "Divide matrix/vector%s by matrix/vector image [%d]", + gmic_selection.data(),ind[0], + operator_diveq, + "Divide matrix/vector%s by expression %s", + gmic_selection.data(),gmic_argument_text_printed(), + "Divide matrix/vector%s"); + + // Manage mutexes. + if (!is_get && !std::strcmp("mutex",item)) { + gmic_substitute_args(false); + unsigned int number, is_lock = 1; + if ((cimg_sscanf(argument,"%u%c", + &number,&end)==1 || + cimg_sscanf(argument,"%u,%u%c", + &number,&is_lock,&end)==2) && + number<256 && is_lock<=1) { + print(images,0,"%s mutex #%u.", + is_lock?"Lock":"Unlock",number); + if (is_lock) gmic_mutex().lock(number); + else gmic_mutex().unlock(number); + } else arg_error("mutex"); + ++position; continue; } // Draw mandelbrot/julia fractal. @@ -8662,24 +9123,7 @@ cimg_forY(selection,l) gmic_apply(draw_mandelbrot(CImg(),opacity,z0r,z0i,z1r,z1i,(unsigned int)itermax, true,(bool)is_julia,paramr,parami)); } else arg_error("mandelbrot"); - is_released = false; ++position; continue; - } - - // Manage mutexes. - if (!std::strcmp("mutex",item)) { - gmic_substitute_args(false); - unsigned int number, is_lock = 1; - if ((cimg_sscanf(argument,"%u%c", - &number,&end)==1 || - cimg_sscanf(argument,"%u,%u%c", - &number,&is_lock,&end)==2) && - number<256 && is_lock<=1) { - print(images,0,"%s mutex #%u.", - is_lock?"Lock":"Unlock",number); - if (is_lock) gmic_mutex().lock(number); - else gmic_mutex().unlock(number); - } else arg_error("mutex"); - ++position; continue; + is_change = true; ++position; continue; } goto gmic_commands_others; @@ -8691,47 +9135,166 @@ // Set image name. if (!is_get && !std::strcmp("name",command)) { - gmic_substitute_args(true); - if (selection.height()>1) - CImg::string(argument).get_split(CImg::vector(','),0,false).move_to(g_list_c); - else CImg::string(argument).move_to(g_list_c); + gmic_substitute_args(false); + if (selection.height()>1) { + const CImg arg = CImg::string(argument); + const unsigned int pend = (unsigned int)arg.size(); + g_list_c.assign(); + for (unsigned int p = 0; p(arg.data(p),1,++np - p,1,1,true).move_to(g_list_c); + g_list_c.back().back() = 0; + } + p = np; + } + } else CImg::string(argument).move_to(g_list_c); print(images,0,"Set name%s of image%s to '%s'.", selection.height()>1?"s":"",gmic_selection.data(),gmic_argument_text_printed()); - cimglist_for(g_list_c,l) { - g_list_c[l].unroll('x'); - if (g_list_c[l].back()) g_list_c[l].resize(g_list_c[l].width()+1,1,1,1,0); - strreplace_fw(g_list_c[l]); - } + cimglist_for(g_list_c,l) { g_list_c[l].unroll('x'); strreplace_fw(g_list_c[l]); } cimg_forY(selection,l) images_names[selection[l]].assign(g_list_c[l%g_list_c.width()]); g_list_c.assign(); ++position; continue; } + // Get image indices from names. + if (!is_get && !std::strcmp("named",command)) { + gmic_substitute_args(false); + if (cimg_sscanf(argument,"%u%c",&pattern,&sep)==2 && pattern<=5 && sep==',') is_cond = true; + else { pattern = 0; is_cond = false; } + boundary = pattern%3; + CImg::string(argument + (is_cond?2:0)).get_split(CImg::vector(','),0,false).move_to(g_list_c); + + // Detect possible empty names in argument list. + bool contains_empty_name = false; + unsigned int sl = 0; + for (; argument[sl]; ++sl) if (argument[sl]==',' && argument[sl + 1]==',') { + contains_empty_name = true; + break; + } + if (!contains_empty_name && sl && (*argument==',' || argument[sl - 1]==',')) contains_empty_name = true; + if (contains_empty_name) CImg(1,1,1,1,0).move_to(g_list_c); + + print(images,0,"Get %s%s with name%s '%s' for image%s (case-%s).", + boundary==0?"all image ind":boundary==1?"lowest image ind":"highest image ind", + boundary==0 || g_list_c.size()>1?"ices":"ex", + g_list_c.size()>1?"s":"", + gmic_argument_text_printed() + (is_cond?2:0),gmic_selection.data(), + pattern<3?"sensitive":"insensitive"); + int nb_found = 0, last_found = 0; + const bool is_single_res = boundary>0 && g_list_c.size()==1; + if (!is_single_res) ind.assign(selection.height(),1,1,1,0); + + cimglist_for(g_list_c,k) { + if (g_list_c[k].back()) g_list_c[k].resize(g_list_c[k].width() + 1,1,1,1,0); + strreplace_fw(g_list_c[k]); + switch (pattern) { + case 0 : // All indices, case sensitive + cimg_forY(selection,l) + if (!std::strcmp(g_list_c[k],images_names[selection[l]])) { + nb_found+=(ind[l]==0); ind[l] = 1; last_found = l; + } + break; + case 1 : // Lowest index, case sensitive + if (is_single_res) { + cimg_forY(selection,l) + if (!std::strcmp(g_list_c[k],images_names[selection[l]])) { + nb_found = 1; last_found = l; break; + } + } else + cimg_forY(selection,l) + if (!std::strcmp(g_list_c[k],images_names[selection[l]])) { + nb_found+=(ind[l]==0); ind[l] = 1; last_found = l; break; + } + break; + case 2 : // Highest index, case sensitive + if (is_single_res) { + cimg_rofY(selection,l) + if (!std::strcmp(g_list_c[k],images_names[selection[l]])) { + nb_found = 1; last_found = l; break; + } + } else + cimg_rofY(selection,l) + if (!std::strcmp(g_list_c[k],images_names[selection[l]])) { + nb_found+=(ind[l]==0); ind[l] = 1; last_found = l; break; + } + break; + case 3 : // All indices, case insensitive + cimg_forY(selection,l) + if (!cimg::strcasecmp(g_list_c[k],images_names[selection[l]])) { + nb_found+=(ind[l]==0); ind[l] = 1; last_found = l; + } + break; + case 4 : // Lowest index, case insensitive + if (is_single_res) { + cimg_forY(selection,l) + if (!cimg::strcasecmp(g_list_c[k],images_names[selection[l]])) { + nb_found = 1; last_found = l; break; + } + } else + cimg_forY(selection,l) + if (!cimg::strcasecmp(g_list_c[k],images_names[selection[l]])) { + nb_found+=(ind[l]==0); ind[l] = 1; last_found = l; break; + } + break; + default : // Highest index, case insensitive + if (is_single_res) { + cimg_rofY(selection,l) + if (!cimg::strcasecmp(g_list_c[k],images_names[selection[l]])) { + nb_found = 1; last_found = l; break; + } + } else + cimg_rofY(selection,l) + if (!cimg::strcasecmp(g_list_c[k],images_names[selection[l]])) { + nb_found+=(ind[l]==0); ind[l] = 1; last_found = l; break; + } + break; + } + } + if (!nb_found) CImg(1,1,1,1,0).move_to(status); + else if (nb_found==1) { + gmic_use_title; + cimg_snprintf(title,_title.width(),"%u",selection[last_found]); + CImg::string(title).move_to(status); + } else { + ind0.assign(nb_found); + nb_found = 0; cimg_forX(ind,l) if (ind[l]) ind0[nb_found++] = selection[l]; + ind0.value_string().move_to(status); + } + if (!is_single_res) ind.assign(); + g_list_c.assign(); + ++position; continue; + } + // Normalize. if (!std::strcmp("normalize",command)) { gmic_substitute_args(true); ind0.assign(); ind1.assign(); sep0 = sep1 = *argx = *argy = *indices = 0; - value0 = value1 = 0; - if (cimg_sscanf(argument,"%255[][a-zA-Z0-9_.eE%+-],%255[][a-zA-Z0-9_.eE%+-]%c", - argx,argy,&end)==2 && - ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",indices,&sep0,&end)==2 && + value0 = value1 = value = 0; + if ((cimg_sscanf(argument,"%255[][a-zA-Z0-9_.eE%+-],%255[][a-zA-Z0-9_.eE%+-]%c", + gmic_use_argx,gmic_use_argy,&end)==2 || + cimg_sscanf(argument,"%255[][a-zA-Z0-9_.eE%+-],%255[][a-zA-Z0-9_.eE%+-],%lf%c", + argx,argy,&value,&end)==3) && + ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_indices,&sep0,&end)==2 && sep0==']' && (ind0=selection2cimg(indices,images.size(),images_names,"normalize")).height()==1) || (cimg_sscanf(argx,"%lf%c%c",&value0,&sep0,&end)==2 && sep0=='%') || cimg_sscanf(argx,"%lf%c",&value0,&end)==1) && - ((cimg_sscanf(argy,"[%255[a-zA-Z0-9_.%+-]%c%c",formula,&sep1,&end)==2 && + ((cimg_sscanf(argy,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_formula,&sep1,&end)==2 && sep1==']' && (ind1=selection2cimg(formula,images.size(),images_names,"normalize")).height()==1) || (cimg_sscanf(argy,"%lf%c%c",&value1,&sep1,&end)==2 && sep1=='%') || cimg_sscanf(argy,"%lf%c",&value1,&end)==1)) { if (ind0) { value0 = images[*ind0].min(); sep0 = 0; } if (ind1) { value1 = images[*ind1].max(); sep1 = 0; } - print(images,0,"Normalize image%s in range [%g%s,%g%s].", + print(images,0,"Normalize image%s in range [%g%s,%g%s], with constant-case ratio %g.", gmic_selection.data(), value0,sep0=='%'?"%":"", - value1,sep1=='%'?"%":""); + value1,sep1=='%'?"%":"", + value); cimg_forY(selection,l) { CImg& img = gmic_check(images[selection[l]]); nvalue0 = value0; nvalue1 = value1; @@ -8741,9 +9304,9 @@ if (sep0=='%') nvalue0 = vmin + (vmax - vmin)*value0/100; if (sep1=='%') nvalue1 = vmin + (vmax - vmin)*value1/100; } - gmic_apply(normalize((T)nvalue0,(T)nvalue1)); + gmic_apply(normalize((T)nvalue0,(T)nvalue1,(float)value)); } - } else if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",indices,&sep0,&end)==2 && + } else if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_indices,&sep0,&end)==2 && sep0==']' && (ind0=selection2cimg(indices,images.size(),images_names,"normalize")).height()==1) { if (images[*ind0]) value1 = (double)images[*ind0].max_min(value0); @@ -8753,7 +9316,7 @@ value1); cimg_forY(selection,l) gmic_apply(normalize((T)value0,(T)value1)); } else arg_error("normalize"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Test difference. @@ -8769,8 +9332,23 @@ gmic_selection.data(),gmic_argument_text_printed(), "Compute boolean inequality between image%s"); + // Manage network permission and timeout. + if (!is_get && !std::strcmp("network",item)) { + gmic_substitute_args(false); + if (cimg_sscanf(argument,"%d%c", + &err,&end)==1 && + err>=-1) { + if (err==-1) print(images,0,"Disable load-from-network."); + else if (!err) print(images,0,"Enable load-from-network, with no timeout."); + else print(images,0,"Enable load-from-network, with %ds timeout.",err); + cimg::network_mode(err!=-1,true); + if (err!=-1) network_timeout = err; + } else arg_error("network"); + ++position; continue; + } + // Discard custom command arguments. - if (!std::strcmp("noarg",item)) { + if (!is_get && !std::strcmp("noarg",item)) { print(images,0,"Discard command arguments."); if (is_noarg) *is_noarg = true; continue; @@ -8795,14 +9373,14 @@ noise_type==1?"uniform": noise_type==2?"salt&pepper": noise_type==3?"poisson":"rice"; - if (sep=='%') sigma = -sigma; + if (sep=='%' && noise_type!=2) sigma = -sigma; print(images,0,"Add %s noise to image%s, with standard deviation %g%s.", s_type, gmic_selection.data(), cimg::abs(sigma),sep=='%'?"%":""); cimg_forY(selection,l) gmic_apply(noise(sigma,noise_type)); } else arg_error("noise"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } goto gmic_commands_others; @@ -8813,21 +9391,21 @@ gmic_commands_o : // Exception handling in local environments. - if (!std::strcmp("onfail",item)) { + if (!is_get && !std::strcmp("onfail",item)) { const CImg &s = callstack.back(); if (s[0]!='*' || s[1]!='l') - error(images,0,0, + error(true,images,0,0, "Command 'onfail': Not associated to a 'local' command within " "the same scope."); for (int nb_locals = 1; nb_locals && position0) { - is_debug_info = true; next_debug_line = _debug_line; next_debug_filename = _debug_filename; - } else { + if (*it==1) + is_debug_info|=get_debug_info(commands_line[position].data(),next_debug_line,next_debug_filename); + else { const bool _is_get = *it=='+' || (*it=='-' && it[1]=='-'); it+=(*it=='+' || *it=='-') + (*it=='-' && it[1]=='-'); if (!std::strcmp("local",it) || !std::strcmp("l",it) || + !std::strncmp("local.",it,6) || !std::strncmp("l.",it,2) || !std::strncmp("local[",it,6) || !std::strncmp("l[",it,2)) ++nb_locals; else if (!_is_get && (!std::strcmp("endlocal",it) || !std::strcmp("endl",it))) { --nb_locals; if (!nb_locals) --position; @@ -8855,11 +9433,11 @@ sep = sepx = sepy = *argx = *argy = 0; opacity = 1; if (((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c", - indices,&sep,&end)==2 && sep==']') || + gmic_use_indices,&sep,&end)==2 && sep==']') || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-]%c", - indices,argx,&end)==2 || + indices,gmic_use_argx,&end)==2 || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - indices,argx,argy,&end)==3 || + indices,argx,gmic_use_argy,&end)==3 || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-],%255[0-9.eE%+-]," "%f%c", indices,argx,argy,&z,&end)==4 || @@ -8928,11 +9506,11 @@ if (light3d) g_list_uc.insert(light3d,~0U,true); } else vertices.CImg3dtoobject3d(primitives,g_list_f,opacities,false); } catch (CImgException&) { - if (!vertices.is_CImg3d(true,&(*message=0))) - error(images,0,0, + if (!vertices.is_CImg3d(true,&(*gmic_use_message=0))) + error(true,images,0,0, "Command 'object3d': Invalid 3D object [%u], specified " "in argument '%s' (%s).", - *ind,gmic_argument_text(),message.data()); + *ind,gmic_argument_text(),message); else throw; } @@ -8948,21 +9526,21 @@ _light3d_x,_light3d_y,_light3d_z, _specular_lightness3d,_specular_shininess3d, opacity,zbuffer)); - g_list_f.assign(); + } else { gmic_apply(draw_object3d(nx,ny,z,vertices,primitives,g_list_uc,opacities, _render3d,_is_double3d,_focale3d, _light3d_x,_light3d_y,_light3d_z, _specular_lightness3d,_specular_shininess3d, opacity,zbuffer)); - g_list_uc.assign(); } } } else arg_error("object3d"); + g_list_f.assign(); + g_list_uc.assign(); vertices.assign(); primitives.assign(); - - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Bitwise or. @@ -8980,7 +9558,7 @@ // Set 3d object opacity. if (!std::strcmp("opacity3d",command)) { - gmic_substitute_args(true); + gmic_substitute_args(false); value = 1; if (cimg_sscanf(argument,"%lf%c", &value,&end)==1) ++position; @@ -8993,15 +9571,15 @@ CImg& img = images[uind]; try { gmic_apply(color_CImg3d(0,0,0,(float)value,false,true)); } catch (CImgException&) { - if (!img.is_CImg3d(true,&(*message=0))) - error(images,0,0, + if (!img.is_CImg3d(true,&(*gmic_use_message=0))) + error(true,images,0,0, "Command 'opacity3d': Invalid 3D object [%d], " "in selected image%s (%s).", - uind,gmic_selection.data(),message.data()); + uind,gmic_selection.data(),message); else throw; } } - is_released = false; continue; + is_change = true; continue; } // Output. @@ -9009,6 +9587,9 @@ gmic_substitute_args(false); // Set good alias for shared variables. + gmic_use_argc; + gmic_use_title; + gmic_use_color; CImg &_filename = _color, &filename_tmp = _title, &options = _argc; char cext[12]; *cext = *_filename = *filename_tmp = *options = 0; @@ -9049,15 +9630,15 @@ CImg uext = CImg::string(ext); cimg::lowercase(uext); - if (!cimg::strcasecmp(ext,"off")) { + if (!std::strcmp(uext,"off")) { // OFF file (geomview). - *formula = 0; + *gmic_use_formula = 0; std::strncpy(formula,filename,_formula.width() - 1); formula[_formula.width() - 1] = 0; if (*options) - error(images,0,0, + error(true,images,0,0, "Command 'output': File '%s', format does not take any output options (options '%s' specified).", formula,options.data()); @@ -9074,24 +9655,27 @@ vertices.CImg3dtoobject3d(primitives,g_list_f,opacities,false). save_off(primitives,g_list_f,formula); } catch (CImgException&) { - if (!vertices.is_CImg3d(true,&(*message=0))) - error(images,0,0, + if (!vertices.is_CImg3d(true,&(*gmic_use_message=0))) + error(true,images,0,0, "Command 'output': 3D object file '%s', invalid 3D object [%u] " "in selected image%s (%s).", - formula,uind,gmic_selection.data(),message.data()); + formula,uind,gmic_selection.data(),message); else throw; } } vertices.assign(); primitives.assign(); g_list_f.assign(); - } else if (!cimg::strcasecmp(ext,"cpp") || !cimg::strcasecmp(ext,"c") || - !cimg::strcasecmp(ext,"hpp") || !cimg::strcasecmp(ext,"h") || - !cimg::strcasecmp(ext,"pan")) { + } else if (!std::strcmp(uext,"cpp") || !std::strcmp(uext,"c") || + !std::strcmp(uext,"hpp") || !std::strcmp(uext,"h") || + !std::strcmp(uext,"pan") || !std::strcmp(uext,"pnk") || + !std::strcmp(uext,"pgm") || !std::strcmp(uext,"ppm") || + !std::strcmp(uext,"ppm") || !std::strcmp(uext,"hdr") || + !std::strcmp(uext,"nii")) { - // .cpp, .c, .hpp, .h or .pan file. + // .cpp, .c, .hpp, .h, .pan, .pnk, .pgm, .ppm, .pnm, .hdr or .nii file. const char * - stype = (cimg_sscanf(options,"%255[a-z64]%c",&(*argx=0),&(end=0))==1 || + stype = (cimg_sscanf(options,"%255[a-z64]%c",&(*gmic_use_argx=0),&(end=0))==1 || (cimg_sscanf(options,"%255[a-z64]%c",&(*argx=0),&end)==2 && end==','))? argx:"auto"; g_list.assign(selection.height()); @@ -9118,22 +9702,18 @@ uext.data(),_filename.data(), stype); if (!g_list) - error(images,0,0, + error(true,images,0,0, "Command 'output': File '%s', instance list (%u,%p) is empty.", _filename.data(),g_list.size(),g_list.data()); #define gmic_save_multitype(value_type,svalue_type) \ if (!std::strcmp(stype,svalue_type)) { \ if (g_list.size()==1) \ - CImg(g_list[0], \ - cimg::type::string()==cimg::type::string()). \ - save(filename); \ + CImg::copy_rounded(g_list[0]).save(filename); \ else { \ cimglist_for(g_list,l) { \ - cimg::number_filename(filename,l,6,formula); \ - CImg(g_list[l], \ - cimg::type::string()==cimg::type::string()). \ - save(formula); \ + cimg::number_filename(filename,l,6,gmic_use_formula); \ + CImg::copy_rounded(g_list[l]).save(formula); \ } \ } \ } @@ -9152,22 +9732,22 @@ else gmic_save_multitype(int64T,"int64") else gmic_save_multitype(float,"float") else gmic_save_multitype(double,"double") - else error(images,0,0, + else error(true,images,0,0, "Command 'output': File '%s', invalid " "specified pixel type '%s'.", _filename.data(),stype); - } else if (!cimg::strcasecmp(ext,"tiff") || !cimg::strcasecmp(ext,"tif")) { + } else if (!std::strcmp(uext,"tiff") || !std::strcmp(uext,"tif")) { // TIFF file. const char * - stype = (cimg_sscanf(options,"%255[a-z64]%c",&(*argx=0),&(end=0))==1 || + stype = (cimg_sscanf(options,"%255[a-z64]%c",&(*gmic_use_argx=0),&(end=0))==1 || (cimg_sscanf(options,"%255[a-z64]%c",&(*argx=0),&end)==2 && end==','))? argx:"auto"; const unsigned int l_stype = (unsigned int)std::strlen(stype); const char *const _options = options.data() + (stype!=argx?0:l_stype + (end==','?1:0)); float _is_multipage = 0; *argy = 0; opacity = 1; - if (cimg_sscanf(_options,"%255[a-z],%f,%f",argy,&_is_multipage,&opacity)<1) + if (cimg_sscanf(_options,"%255[a-z],%f,%f",gmic_use_argy,&_is_multipage,&opacity)<1) cimg_sscanf(_options,"%f,%f",&_is_multipage,&opacity); const unsigned int compression_type = !cimg::strcasecmp(argy,"jpeg") || @@ -9204,21 +9784,19 @@ is_multipage?"multi":"single", use_bigtiff?"":"no "); if (!g_list) - error(images,0,0, + error(true,images,0,0, "Command 'output': File '%s', instance list (%u,%p) is empty.", _filename.data(),g_list.size(),g_list.data()); #define gmic_save_tiff(value_type,svalue_type) \ if (!std::strcmp(stype,svalue_type)) { \ if (g_list.size()==1 || is_multipage) \ - CImgList(g_list, \ - cimg::type::string()==cimg::type::string()). \ + CImgList::copy_rounded(g_list). \ save_tiff(filename,compression_type,0,0,use_bigtiff); \ else { \ cimglist_for(g_list,l) { \ - cimg::number_filename(filename,l,6,formula); \ - CImg(g_list[l], \ - cimg::type::string()==cimg::type::string()). \ + cimg::number_filename(filename,l,6,gmic_use_formula); \ + CImg::copy_rounded(g_list[l]). \ save_tiff(formula,compression_type,0,0,use_bigtiff); \ } \ } \ @@ -9238,12 +9816,12 @@ else gmic_save_tiff(int64T,"int64") else gmic_save_tiff(float,"float") else gmic_save_tiff(double,"double") - else error(images,0,0, + else error(true,images,0,0, "Command 'output': File '%s', invalid " "specified pixel type '%s'.", _filename.data(),stype); - } else if (!cimg::strcasecmp(ext,"gif")) { + } else if (!std::strcmp(uext,"gif")) { // GIF file. float fps = 0, _nb_loops = 0; @@ -9281,7 +9859,7 @@ gmic_selection.data(),uext.data(),_filename.data()); g_list.save(filename); // Save distinct .gif files } - } else if (!cimg::strcasecmp(ext,"jpeg") || !cimg::strcasecmp(ext,"jpg")) { + } else if (!std::strcmp(uext,"jpeg") || !std::strcmp(uext,"jpg")) { // JPEG file. float quality = 100; @@ -9311,18 +9889,18 @@ uext.data(),_filename.data(), quality); if (!g_list) - error(images,0,0, + error(true,images,0,0, "Command 'output': File '%s', instance list (%u,%p) is empty.", _filename.data(),g_list.size(),g_list.data()); if (g_list.size()==1) g_list[0].save_jpeg(filename,(unsigned int)cimg::round(quality)); else { cimglist_for(g_list,l) { - cimg::number_filename(filename,l,6,formula); + cimg::number_filename(filename,l,6,gmic_use_formula); g_list[l].save_jpeg(formula,(unsigned int)cimg::round(quality)); } } - } else if (!cimg::strcasecmp(ext,"mnc") && *options) { + } else if (!std::strcmp(uext,"mnc") && *options) { // MNC file. g_list.assign(selection.height()); @@ -9355,14 +9933,14 @@ g_list[0].save_minc2(filename,options); else { cimglist_for(g_list,l) { - cimg::number_filename(filename,l,6,formula); + cimg::number_filename(filename,l,6,gmic_use_formula); g_list[l].save_minc2(formula,options); } } - } else if (!cimg::strcasecmp(ext,"raw")) { + } else if (!std::strcmp(uext,"raw")) { // RAW data file. - const char *stype = cimg_sscanf(options,"%255[a-z64]%c",argx,&end)==1?argx:"auto"; + const char *stype = cimg_sscanf(options,"%255[a-z64]%c",gmic_use_argx,&end)==1?argx:"auto"; g_list.assign(selection.height()); cimg_forY(selection,l) if (!gmic_check(images[selection(l)])) CImg::vector(selection(l)).move_to(empty_indices); @@ -9387,22 +9965,18 @@ uext.data(),_filename.data(), stype); if (!g_list) - error(images,0,0, + error(true,images,0,0, "Command 'output': File '%s', instance list (%u,%p) is empty.", _filename.data(),g_list.size(),g_list.data()); #define gmic_save_raw(value_type,svalue_type) \ if (!std::strcmp(stype,svalue_type)) { \ if (g_list.size()==1) \ - CImg(g_list[0], \ - cimg::type::string()==cimg::type::string()). \ - save_raw(filename); \ + CImg::copy_rounded(g_list[0]).save_raw(filename); \ else { \ cimglist_for(g_list,l) { \ - cimg::number_filename(filename,l,6,formula); \ - CImg(g_list[l], \ - cimg::type::string()==cimg::type::string()). \ - save_raw(formula); \ + cimg::number_filename(filename,l,6,gmic_use_formula); \ + CImg::copy_rounded(g_list[l]).save_raw(formula); \ } \ } \ } @@ -9421,18 +9995,18 @@ else gmic_save_raw(int64T,"int64") else gmic_save_raw(float,"float") else gmic_save_raw(double,"double") - else error(images,0,0, + else error(true,images,0,0, "Command 'output': File '%s', invalid " "specified pixel type '%s'.", _filename.data(),stype); - } else if (!cimg::strcasecmp(ext,"yuv")) { + } else if (!std::strcmp(uext,"yuv")) { // YUV sequence. if (cimg_sscanf(options,"%f",&opacity)!=1) opacity = 444; else opacity = cimg::round(opacity); const unsigned int ich = (unsigned int)opacity; if (ich!=420 && ich!=422 && ich!=444) - error(images,0,0, + error(true,images,0,0, "Command 'output': YUV file '%s', specified chroma subsampling '%g' is invalid.", _filename.data(),opacity); g_list.assign(selection.height()); @@ -9444,10 +10018,10 @@ _filename.data()); g_list.save_yuv(filename,ich,true); - } else if (!cimg::strcasecmp(ext,"cimg") || !cimg::strcasecmp(ext,"cimgz")) { + } else if (!std::strcmp(uext,"cimg") || !std::strcmp(uext,"cimgz")) { // CImg[z] file. - const char *stype = cimg_sscanf(options,"%255[a-z64]%c",argx,&end)==1?argx:"auto"; + const char *stype = cimg_sscanf(options,"%255[a-z64]%c",gmic_use_argx,&end)==1?argx:"auto"; g_list.assign(selection.height()); cimg_forY(selection,l) g_list[l].assign(images[selection[l]],images[selection[l]]?true:false); @@ -9458,9 +10032,7 @@ #define gmic_save_cimg(value_type,svalue_type) \ if (!std::strcmp(stype,svalue_type)) \ - CImgList(g_list, \ - cimg::type::string()==cimg::type::string()). \ - save(filename); + CImgList::copy_rounded(g_list).save(filename); if (!std::strcmp(stype,"auto")) stype = CImg::storage_type(g_list); gmic_save_cimg(unsigned char,"uchar") @@ -9477,14 +10049,14 @@ else gmic_save_cimg(int64T,"int64") else gmic_save_cimg(float,"float") else gmic_save_cimg(double,"double") - else error(images,0,0, + else error(true,images,0,0, "Command 'output': File '%s', invalid " "specified pixel type '%s'.", _filename.data(),stype); - } else if (!cimg::strcasecmp(ext,"gmz") || !*ext) { + } else if (!std::strcmp(uext,"gmz") || !*ext) { // GMZ file. - const char *stype = cimg_sscanf(options,"%255[a-z64]%c",argx,&end)==1?argx:"auto"; + const char *stype = cimg_sscanf(options,"%255[a-z64]%c",gmic_use_argx,&end)==1?argx:"auto"; g_list.assign(selection.height()); g_list_c.assign(selection.height()); cimg_forY(selection,l) { @@ -9498,9 +10070,7 @@ #define gmic_save_gmz(value_type,svalue_type) \ if (!std::strcmp(stype,svalue_type)) \ - CImg::save_gmz(filename, \ - CImgList(g_list,cimg::type::string()==cimg::type::string()), \ - g_list_c); + CImg::save_gmz(filename,CImgList::copy_rounded(g_list),g_list_c); if (!std::strcmp(stype,"auto")) stype = CImg::storage_type(g_list); gmic_save_gmz(unsigned char,"uchar") @@ -9517,33 +10087,33 @@ else gmic_save_gmz(int64T,"int64") else gmic_save_gmz(float,"float") else gmic_save_gmz(double,"double") - else error(images,0,0, + else error(true,images,0,0, "Command 'output': File '%s', invalid " "specified pixel type '%s'.", _filename.data(),stype); - } else if (!cimg::strcasecmp(ext,"avi") || - !cimg::strcasecmp(ext,"mov") || - !cimg::strcasecmp(ext,"asf") || - !cimg::strcasecmp(ext,"divx") || - !cimg::strcasecmp(ext,"flv") || - !cimg::strcasecmp(ext,"mpg") || - !cimg::strcasecmp(ext,"m1v") || - !cimg::strcasecmp(ext,"m2v") || - !cimg::strcasecmp(ext,"m4v") || - !cimg::strcasecmp(ext,"mjp") || - !cimg::strcasecmp(ext,"mp4") || - !cimg::strcasecmp(ext,"mkv") || - !cimg::strcasecmp(ext,"mpe") || - !cimg::strcasecmp(ext,"movie") || - !cimg::strcasecmp(ext,"ogm") || - !cimg::strcasecmp(ext,"ogg") || - !cimg::strcasecmp(ext,"ogv") || - !cimg::strcasecmp(ext,"qt") || - !cimg::strcasecmp(ext,"rm") || - !cimg::strcasecmp(ext,"vob") || - !cimg::strcasecmp(ext,"wmv") || - !cimg::strcasecmp(ext,"xvid") || - !cimg::strcasecmp(ext,"mpeg")) { + } else if (!std::strcmp(uext,"avi") || + !std::strcmp(uext,"mov") || + !std::strcmp(uext,"asf") || + !std::strcmp(uext,"divx") || + !std::strcmp(uext,"flv") || + !std::strcmp(uext,"mpg") || + !std::strcmp(uext,"m1v") || + !std::strcmp(uext,"m2v") || + !std::strcmp(uext,"m4v") || + !std::strcmp(uext,"mjp") || + !std::strcmp(uext,"mp4") || + !std::strcmp(uext,"mkv") || + !std::strcmp(uext,"mpe") || + !std::strcmp(uext,"movie") || + !std::strcmp(uext,"ogm") || + !std::strcmp(uext,"ogg") || + !std::strcmp(uext,"ogv") || + !std::strcmp(uext,"qt") || + !std::strcmp(uext,"rm") || + !std::strcmp(uext,"vob") || + !std::strcmp(uext,"wmv") || + !std::strcmp(uext,"xvid") || + !std::strcmp(uext,"mpeg")) { // Generic video file. float fps = 0, keep_open = 0; @@ -9576,33 +10146,49 @@ g_list.save_ffmpeg_external(filename,(unsigned int)fps); } } else { // Any other extension - g_list.assign(selection.height()); - cimg_forY(selection,l) if (!gmic_check(images[selection(l)])) - CImg::vector(selection(l)).move_to(empty_indices); - if (empty_indices && is_verbose) { - selection2string(empty_indices>'y',images_names,1,eselec); - warn(images,0,false, - "Command 'output': Image%s %s empty.", - eselec.data(),empty_indices.size()>1?"are":"is"); - } - cimg_forY(selection,l) - g_list[l].assign(images[selection[l]],g_list[l]?true:false); - if (g_list.size()==1) - print(images,0,"Output image%s as %s file '%s' (1 image %dx%dx%dx%d).", - gmic_selection.data(), - uext.data(),_filename.data(), - g_list[0].width(),g_list[0].height(), - g_list[0].depth(),g_list[0].spectrum()); - else print(images,0,"Output image%s as %s file '%s'.", - gmic_selection.data(),uext.data(),_filename.data()); - if (*options) - error(images,0,0, - "Command 'output': File '%s', format '%s' does not take any output options " - "(options '%s' specified).", - _filename.data(),ext,options.data()); + // Check if a custom command handling requested file format exists. + gmic_use_formula; + cimg_snprintf(formula,_formula.width(),"output_%s",uext.data()); + hash = hashcode(formula,false); + if (search_sorted(formula,commands_names[hash],commands_names[hash].size(),pattern)) { // Command found + cimg_snprintf(formula,_formula.width(),"output_%s[%s] \"%s\"", + uext.data(),*s_selection?s_selection:"^",filename); + const CImgList ncommands_line = commands_line_to_CImgList(formula); + unsigned int nposition = 0; + CImg::string("").move_to(callstack); // Anonymous scope + _run(ncommands_line,nposition,images,images_names,images,images_names,variables_sizes,0,0,0); + callstack.remove(); + + } else { // Not found -> Try generic image saver - if (g_list.size()==1) g_list[0].save(filename); else g_list.save(filename); + g_list.assign(selection.height()); + cimg_forY(selection,l) if (!gmic_check(images[selection(l)])) + CImg::vector(selection(l)).move_to(empty_indices); + if (empty_indices && is_verbose) { + selection2string(empty_indices>'y',images_names,1,eselec); + warn(images,0,false, + "Command 'output': Image%s %s empty.", + eselec.data(),empty_indices.size()>1?"are":"is"); + } + cimg_forY(selection,l) + g_list[l].assign(images[selection[l]],g_list[l]?true:false); + if (g_list.size()==1) + print(images,0,"Output image%s as %s file '%s' (1 image %dx%dx%dx%d).", + gmic_selection.data(), + uext.data(),_filename.data(), + g_list[0].width(),g_list[0].height(), + g_list[0].depth(),g_list[0].spectrum()); + else print(images,0,"Output image%s as %s file '%s'.", + gmic_selection.data(),uext.data(),_filename.data()); + + if (*options) + error(true,images,0,0, + "Command 'output': File '%s', format '%s' does not take any output options " + "(options '%s' specified).", + _filename.data(),ext,options.data()); + if (g_list.size()==1) g_list[0].save(filename); else g_list.save(filename); + } } if (*cext) { // When output forced to 'ext' : copy final file to specified location @@ -9613,20 +10199,20 @@ bool save_failure = false; *message = 0; for (unsigned int i = 0; i!=~0U; ++i) { - cimg::number_filename(filename_tmp,i,6,formula); - cimg::number_filename(_filename,i,6,message); + cimg::number_filename(filename_tmp,i,6,gmic_use_formula); + cimg::number_filename(_filename,i,6,gmic_use_message); try { CImg::get_load_raw(formula).save_raw(message); } catch (...) { i = ~0U - 1; if (!i) save_failure = true; } } if (save_failure) - error(images,0,0, + error(true,images,0,0, "Command 'output': Invalid write of file '%s' from temporary file '%s'.", _filename.data(),filename_tmp.data()); } } g_list.assign(); g_list_c.assign(); if (is_stdout) std::fflush(stdout); - is_released = true; ++position; continue; + is_change = false; ++position; continue; } goto gmic_commands_others; @@ -9639,45 +10225,51 @@ // Pass image from parent context. if (!is_get && !std::strcmp("pass",command)) { gmic_substitute_args(false); - unsigned int shared_state = 2; - if (cimg_sscanf(argument,"%u%c",&shared_state,&end)==1 && shared_state<=2) ++position; - else shared_state = 2; - print(images,0,"Insert image%s from parent context %s%s.", - gmic_selection.data(), - shared_state==0?"in non-shared state": - shared_state==1?"in shared state":"using adaptive state", - selection.height()>1?"s":""); - - cimg_forY(selection,l) { - CImg &img = parent_images[selection[l]]; - const T *p = 0; - std::memcpy(&p,&img._width,sizeof(void*)); - - if (p && !img.data()) { - // Parent image is in the current selection -> must search the current list - bool found_image = false; - cimglist_for(images,i) { - if (images[i].data()==p) { // Found it ! - images.insert(images[i],~0U,shared_state==1); - images_names.insert(images_names[i].get_copymark()); - found_image = true; - break; + if (cimg_sscanf(argument,"%d%c",&(err=2),&end)==1 && err>=-1 && err<=2) ++position; + else err = 2; + if (err<0) + print(images,0,"Return ind%s of image%s from parent context.", + selection.height()==1?"ex":"ices", + gmic_selection.data()); + else { + print(images,0,"Insert image%s from parent context %s%s.", + gmic_selection.data(), + err==0?"in non-shared state": + err==1?"in shared state":"using adaptive state", + selection.height()>1?"s":""); + + cimg_forY(selection,l) { + CImg &img = parent_images[selection[l]]; + const T *p = 0; + std::memcpy(&p,&img._width,sizeof(void*)); + + if (p && !img.data()) { + // Parent image is in the current selection -> must search the current list + bool found_image = false; + cimglist_for(images,i) { + if (images[i].data()==p) { // Found it ! + images.insert(images[i],~0U,err==1); + images_names.insert(images_names[i].get_copymark()); + found_image = true; + break; + } } + if (!found_image) error(true,images,0,0, + "Command 'pass': Unreferenced image [%d] from parent context " + "(has been re-allocated in current context or reserved by another thread).", + selection[l]); + } else { // Easy case, parent image not in the current selection + images.insert(img,~0U,(bool)err); + images_names.insert(parent_images_names[selection[l]].get_copymark()); } - if (!found_image) error(images,0,0, - "Command 'pass': Unreferenced image [%d] from parent context " - "(has been re-allocated in current context or reserved by another thread).", - selection[l]); - } else { // Easy case, parent image not in the current selection - images.insert(img,~0U,(bool)shared_state); - images_names.insert(parent_images_names[selection[l]].get_copymark()); } } - is_released = false; continue; + selection.value_string().move_to(status); + is_change = true; continue; } // Run multiple commands in parallel. - if (!std::strcmp("parallel",item)) { + if (!is_get && !std::strcmp("parallel",item)) { gmic_substitute_args(false); const char *_arg = argument, *_arg_text = gmic_argument_text_printed(); bool wait_mode = true; @@ -9685,8 +10277,9 @@ wait_mode = (bool)(*_arg - '0'); _arg+=2; _arg_text+=2; } CImgList arguments = CImg::string(_arg).get_split(CImg::vector(','),0,false); - CImg<_gmic_parallel >(1,arguments.width()).move_to(threads_data); - CImg<_gmic_parallel > &_threads_data = threads_data.back(); + + CImg<_gmic_parallel >(1,arguments.width()).move_to(gmic_threads); + CImg<_gmic_parallel > &_gmic_threads = gmic_threads.back(); #ifdef gmic_is_parallel print(images,0,"Execute %d command%s '%s' in parallel%s.", @@ -9700,81 +10293,79 @@ #endif // #ifdef gmic_is_parallel // Prepare thread structures. - cimg_forY(_threads_data,l) { - gmic &gi = _threads_data[l].gmic_instance; + cimg_forY(_gmic_threads,l) { + gmic &gmic_instance = _gmic_threads[l].gmic_instance; for (unsigned int i = 0; i::string(title).move_to(gi.callstack); - gi.light3d.assign(light3d); - gi.status.assign(status); - gi.debug_filename = debug_filename; - gi.debug_line = debug_line; - gi.focale3d = focale3d; - gi.light3d_x = light3d_x; - gi.light3d_y = light3d_y; - gi.light3d_z = light3d_z; - gi.specular_lightness3d = specular_lightness3d; - gi.specular_shininess3d = specular_shininess3d; - gi._progress = 0; - gi.progress = &gi._progress; - gi.is_released = is_released; - gi.is_debug = is_debug; - gi.is_start = false; - gi.is_quit = false; - gi.is_return = false; - gi.is_double3d = is_double3d; - gi.check_elif = false; - gi.verbosity = verbosity; - gi.render3d = render3d; - gi.renderd3d = renderd3d; - gi._is_abort = _is_abort; - gi.is_abort = is_abort; - gi.is_abort_thread = false; - gi.nb_carriages = nb_carriages; - gi.reference_time = reference_time; - _threads_data[l].images = &images; - _threads_data[l].images_names = &images_names; - _threads_data[l].parent_images = &parent_images; - _threads_data[l].parent_images_names = &parent_images_names; - _threads_data[l].threads_data = &threads_data; - _threads_data[l].command_selection = command_selection; - _threads_data[l].is_thread_running = true; + CImg::string(title).move_to(gmic_instance.callstack); + gmic_instance.light3d.assign(light3d); + gmic_instance.status.assign(status); + gmic_instance.debug_filename = debug_filename; + gmic_instance.debug_line = debug_line; + gmic_instance.focale3d = focale3d; + gmic_instance.light3d_x = light3d_x; + gmic_instance.light3d_y = light3d_y; + gmic_instance.light3d_z = light3d_z; + gmic_instance.specular_lightness3d = specular_lightness3d; + gmic_instance.specular_shininess3d = specular_shininess3d; + gmic_instance._progress = 0; + gmic_instance.progress = &gmic_instance._progress; + gmic_instance.is_change = is_change; + gmic_instance.is_debug = is_debug; + gmic_instance.is_start = false; + gmic_instance.is_quit = false; + gmic_instance.is_return = false; + gmic_instance.is_double3d = is_double3d; + gmic_instance.verbosity = verbosity; + gmic_instance.render3d = render3d; + gmic_instance.renderd3d = renderd3d; + gmic_instance._is_abort = _is_abort; + gmic_instance.is_abort = is_abort; + gmic_instance.is_abort_thread = false; + gmic_instance.nb_carriages = nb_carriages; + gmic_instance.reference_time = reference_time; + _gmic_threads[l].images = &images; + _gmic_threads[l].images_names = &images_names; + _gmic_threads[l].parent_images = &parent_images; + _gmic_threads[l].parent_images_names = &parent_images_names; + _gmic_threads[l].gmic_threads = &_gmic_threads; + _gmic_threads[l].command_selection = command_selection; + _gmic_threads[l].is_thread_running = true; // Substitute special characters codes appearing outside strings. - arguments[l].resize(1,arguments[l].height() + 1,1,1,0); + arguments[l].resize(arguments[l].width() + 1,1,1,1,0); bool is_dquoted = false; for (char *s = arguments[l].data(); *s; ++s) { - const char c = *s; - if (c=='\"') is_dquoted = !is_dquoted; - if (!is_dquoted) *s = c<' '?(c==gmic_dollar?'$':c==gmic_lbrace?'{':c==gmic_rbrace?'}': - c==gmic_comma?',':c==gmic_dquote?'\"':c):c; + if (*s=='\"') is_dquoted = !is_dquoted; + else if (!is_dquoted) _strreplace_fw(*s); } - gi.commands_line_to_CImgList(arguments[l].data()). - move_to(_threads_data[l].commands_line); + gmic_instance.commands_line_to_CImgList(arguments[l].data()). + move_to(_gmic_threads[l].commands_line); } // Run threads. - cimg_forY(_threads_data,l) { + cimg_forY(_gmic_threads,l) { #ifdef gmic_is_parallel #ifdef _PTHREAD_H @@ -9783,45 +10374,34 @@ pthread_attr_t thread_attr; if (!pthread_attr_init(&thread_attr) && !pthread_attr_setstacksize(&thread_attr,stacksize)) // Reserve enough stack size for the new thread. - pthread_create(&_threads_data[l].thread_id,&thread_attr,gmic_parallel,(void*)&_threads_data[l]); + pthread_create(&_gmic_threads[l].thread_id,&thread_attr,gmic_parallel,(void*)&_gmic_threads[l]); else #endif // #if defined(__MACOSX__) || defined(__APPLE__) - pthread_create(&_threads_data[l].thread_id,0,gmic_parallel,(void*)&_threads_data[l]); + pthread_create(&_gmic_threads[l].thread_id,0,gmic_parallel,(void*)&_gmic_threads[l]); #elif cimg_OS==2 // #ifdef _PTHREAD_H - _threads_data[l].thread_id = CreateThread(0,0,gmic_parallel, - (void*)&_threads_data[l],0,0); + _gmic_threads[l].thread_id = CreateThread(0,0,gmic_parallel, + (void*)&_gmic_threads[l],0,0); #endif // #ifdef _PTHREAD_H #else // #ifdef gmic_is_parallel - gmic_parallel((void*)&_threads_data[l]); + gmic_parallel((void*)&_gmic_threads[l]); #endif // #ifdef gmic_is_parallel } // Wait threads if immediate waiting mode selected. if (wait_mode) { - cimg_forY(_threads_data,l) if (_threads_data[l].is_thread_running) { -#ifdef gmic_is_parallel -#ifdef _PTHREAD_H - pthread_join(_threads_data[l].thread_id,0); -#elif cimg_OS==2 // #ifdef _PTHREAD_H - WaitForSingleObject(_threads_data[l].thread_id,INFINITE); - CloseHandle(_threads_data[l].thread_id); -#endif // #ifdef _PTHREAD_H - _threads_data[l].is_thread_running = false; -#endif // #ifdef gmic_is_parallel - } + wait_threads((void*)&_gmic_threads,false,(T)0); // Get 'released' state of the image list. - cimg_forY(_threads_data,l) is_released&=_threads_data[l].gmic_instance.is_released; + cimg_forY(_gmic_threads,l) is_change|=_gmic_threads[l].gmic_instance.is_change; // Get status modified by first thread. - _threads_data[0].gmic_instance.status.move_to(status); + _gmic_threads[0].gmic_instance.status.move_to(status); // Check for possible exceptions thrown by threads. - cimg_forY(_threads_data,l) if (_threads_data[l].exception._message) - throw _threads_data[l].exception; - - threads_data.remove(); + cimg_forY(_gmic_threads,l) if (_gmic_threads[l].exception._message) + error(false,images,0,_gmic_threads[l].exception.command(),"%s",_gmic_threads[l].exception.what()); + gmic_threads.remove(); } ++position; continue; @@ -9833,30 +10413,41 @@ print(images,0,"Permute axes of image%s, with permutation '%s'.", gmic_selection.data(),gmic_argument_text_printed()); cimg_forY(selection,l) gmic_apply(permute_axes(argument)); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } - // Set progress indice. - if (!std::strcmp("progress",item)) { + // Set progress index. + if (!is_get && !std::strcmp("progress",item)) { gmic_substitute_args(false); value = -1; - if (cimg_sscanf(argument,"%lf%c", - &value,&end)==1) { - if (value<0) value = -1; else if (value>100) value = 100; - if (value>=0) - print(images,0,"Set progress indice to %g%%.", - value); - else - print(images,0,"Disable progress indice."); - *progress = (float)value; - } else arg_error("progress"); + if (cimg_sscanf(argument,"%lf%c",&value,&end)!=1) { + name.assign(argument,(unsigned int)std::strlen(argument) + 1); + CImg &img = images.size()?images.back():CImg::empty(); + strreplace_fw(name); + try { value = img.eval(name,0,0,0,0,&images,&images); } + catch (CImgException &e) { + const char *const e_ptr = std::strstr(e.what(),": "); + error(true,images,0,"progress", + "Command 'progress': Invalid argument '%s': %s", + cimg::strellipsize(name,64,false),e_ptr?e_ptr + 2:e.what()); + } + } + if (value<0) value = -1; else if (value>100) value = 100; + if (value>=0) + print(images,0,"Set progress index to %g%%.", + value); + else + print(images,0,"Disable progress index."); + *progress = (float)value; ++position; continue; } // Print. if (!is_get && !std::strcmp("print",command)) { + ++verbosity; print_images(images,images_names,selection); - is_released = true; continue; + --verbosity; + is_change = false; continue; } // Power. @@ -9879,16 +10470,16 @@ sepx = sepy = sepz = *argx = *argy = *argz = *color = 0; opacity = 1; if ((cimg_sscanf(argument,"%255[0-9.eE%+-]%c", - argx,&end)==1 || + gmic_use_argx,&end)==1 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - argx,argy,&end)==2 || + argx,gmic_use_argy,&end)==2 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - argx,argy,argz,&end)==3 || + argx,argy,gmic_use_argz,&end)==3 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-],%f%c", argx,argy,argz,&opacity,&end)==4 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-],%f," "%4095[0-9.eEinfa,+-]%c", - argx,argy,argz,&opacity,color,&end)==5) && + argx,argy,argz,&opacity,gmic_use_color,&end)==5) && (cimg_sscanf(argx,"%f%c",&x,&end)==1 || (cimg_sscanf(argx,"%f%c%c",&x,&sepx,&end)==2 && sepx=='%')) && (!*argy || @@ -9916,7 +10507,7 @@ } } else arg_error("point"); g_img.assign(); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Draw polygon. @@ -9938,7 +10529,7 @@ for (unsigned int n = 0; n<(unsigned int)N; ++n) if (nargument &img = images[selection[l]]; CImg coords(vertices.width(),2,1,1,0); @@ -9986,14 +10577,14 @@ coords(p,1) = (int)cimg::round(vertices(p,1)*(img.height() - 1)/100); else coords(p,1) = (int)cimg::round(vertices(p,1)); } - g_img.assign(img.spectrum(),1,1,1,(T)0).fill(_color,true,false); + g_img.assign(img.spectrum(),1,1,1,(T)0).fill(p_color,true,false); if (sep1=='x') { gmic_apply(draw_polygon(coords,g_img.data(),opacity,pattern)); } else gmic_apply(draw_polygon(coords,g_img.data(),opacity)); } } else arg_error("polygon"); vertices.assign(); g_img.assign(); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Draw plasma fractal. @@ -10015,7 +10606,7 @@ beta, _scale); cimg_forY(selection,l) gmic_apply(draw_plasma(alpha,beta,_scale)); - is_released = false; continue; + is_change = true; continue; } // Display as a graph plot. @@ -10027,7 +10618,7 @@ *formula = sep = 0; exit_on_anykey = 0; if (((cimg_sscanf(argument,"'%1023[^']%c%c", - formula,&sep,&end)==2 && sep=='\'') || + gmic_use_formula,&sep,&end)==2 && sep=='\'') || cimg_sscanf(argument,"'%1023[^']',%f%c", formula,&resolution,&end)==2 || cimg_sscanf(argument,"'%1023[^']',%f,%u%c", @@ -10056,6 +10647,7 @@ cimg_forY(values,X) values(0,X) = xmin + X*dx/resolution; cimg::eval(formula,values).move_to(values); + gmic_use_title; cimg_snprintf(title,_title.width(),"[Plot of '%s']",formula); CImg::string(title).move_to(g_list_c); display_plots(tmp_img,g_list_c,CImg::vector(0), @@ -10079,7 +10671,7 @@ display_plots(images,images_names,selection,plot_type,vertex_type, xmin,xmax,ymin,ymax,exit_on_anykey); } - is_released = true; continue; + is_change = false; continue; } goto gmic_commands_others; @@ -10090,13 +10682,14 @@ gmic_commands_q : // Quit. - if (!std::strcmp("quit",item)) { + if (!is_get && !std::strcmp("quit",item)) { print(images,0,"Quit G'MIC interpreter."); dowhiles.assign(nb_dowhiles = 0); fordones.assign(nb_fordones = 0); repeatdones.assign(nb_repeatdones = 0); position = commands_line.size(); - is_released = is_quit = true; + is_change = false; + is_quit = true; *is_abort = true; break; } @@ -10126,60 +10719,77 @@ cimg::mutex(29,0); } g_list.assign(); g_list_c.assign(); - is_released = false; continue; + is_change = true; continue; } // Repeat. - if (!std::strcmp("repeat",item)) { + if (!is_get && !std::strcmp("repeat",item)) { gmic_substitute_args(false); - float number = 0; - *title = 0; - if (cimg_sscanf(argument,"%f%c",&number,&end)==1 || - (cimg_sscanf(argument,"%f,%255[a-zA-Z0-9_]%c",&number,title,&sep)==2 && - (*title<'0' || *title>'9'))) { - const unsigned int nb = number<=0?0U: - cimg::type::is_inf(number)?~0U:(unsigned int)cimg::round(number); - if (nb) { - if (is_debug_info && debug_line!=~0U) { - cimg_snprintf(argx,_argx.width(),"*repeat#%u",debug_line); - CImg::string(argx).move_to(callstack); - } else CImg::string("*repeat").move_to(callstack); - if (is_very_verbose) { - if (*title) print(images,0,"Start 'repeat...done' block with variable '%s' (%u iteration%s).", - title,nb,nb>1?"s":""); - else print(images,0,"Start 'repeat...done' block (%u iteration%s).", - nb,nb>1?"s":""); - } - const unsigned int l = (unsigned int)std::strlen(title); - if (nb_repeatdones>=repeatdones._height) repeatdones.resize(5,std::max(2*repeatdones._height,8U),1,1,0); - unsigned int *const rd = repeatdones.data(0,nb_repeatdones++); - rd[0] = position; rd[1] = nb; rd[2] = 0; - if (l) { - const unsigned int hash = hashcode(title,true); - rd[3] = hash; - rd[4] = variables[hash]->_width; - CImg::string(title).move_to(*variables_names[hash]); - CImg::string("0").move_to(*variables[hash]); - } else rd[3] = rd[4] = ~0U; - } else { - if (is_very_verbose) { - if (*title) print(images,0,"Skip 'repeat...done' block with variable '%s' (0 iteration).", - title); - else print(images,0,"Skip 'repeat...done' block (0 iteration)."); - } - int nb_repeat_fors = 0; - for (nb_repeat_fors = 1; nb_repeat_fors && position=name.data(); --ps) { + if (*ps==',' && ps[1] && (ps[1]<'0' || ps[1]>'9')) { varname = ps + 1; *ps = 0; break; } + else if ((*ps<'a' || *ps>'z') && (*ps<'A' || *ps>'Z') && (*ps<'0' || *ps>'9') && *ps!='_') break; + } + if (*name) { + if (cimg_sscanf(name,"%lf%c",&value,&end)!=1) { + CImg &img = images.size()?images.back():CImg::empty(); + strreplace_fw(name); + try { value = img.eval(name,0,0,0,0,&images,&images); } + catch (CImgException &e) { + const char *const e_ptr = std::strstr(e.what(),": "); + error(true,images,0,"repeat", + "Command 'repeat': Invalid argument '%s': %s", + cimg::strellipsize(name,64,false),e_ptr?e_ptr + 2:e.what()); + } } - if (nb_repeat_fors && position>=commands_line.size()) - error(images,0,0, - "Command 'repeat': Missing associated 'done' command."); - continue; } - } else arg_error("repeat"); + } + const unsigned int nb = value<=0?0U: + cimg::type::is_inf(value)?~0U:(unsigned int)cimg::round(value); + if (nb) { + if (is_debug_info && debug_line!=~0U) { + gmic_use_argx; + cimg_snprintf(argx,_argx.width(),"*repeat#%u",debug_line); + CImg::string(argx).move_to(callstack); + } else CImg::string("*repeat").move_to(callstack); + if (is_very_verbose) { + if (*varname) print(images,0,"Start 'repeat...done' block with variable '%s' (%u iteration%s).", + varname,nb,nb>1?"s":""); + else print(images,0,"Start 'repeat...done' block (%u iteration%s).", + nb,nb>1?"s":""); + } + const unsigned int l = (unsigned int)std::strlen(varname); + if (nb_repeatdones>=repeatdones._height) repeatdones.resize(5,std::max(2*repeatdones._height,8U),1,1,0); + unsigned int *const rd = repeatdones.data(0,nb_repeatdones++); + rd[0] = position; rd[1] = nb; rd[2] = 0; + if (l) { + hash = hashcode(varname,true); + rd[3] = hash; + rd[4] = variables[hash]->_width; + CImg::string(varname).move_to(*variables_names[hash]); + CImg::string("0").move_to(*variables[hash]); + } else rd[3] = rd[4] = ~0U; + } else { + if (is_very_verbose) { + if (*varname) print(images,0,"Skip 'repeat...done' block with variable '%s' (0 iteration).", + varname); + else print(images,0,"Skip 'repeat...done' block (0 iteration)."); + } + int nb_repeat_fors = 0; + for (nb_repeat_fors = 1; nb_repeat_fors && position=commands_line.size()) + error(true,images,0,0, + "Command 'repeat': Missing associated 'done' command."); + continue; + } ++position; continue; } @@ -10188,14 +10798,15 @@ gmic_substitute_args(true); float valx = 100, valy = 100, valz = 100, valc = 100, cx = 0, cy = 0, cz = 0, cc = 0; CImg indicesy(256), indicesz(256), indicesc(256); - CImg ind, indx, indy, indz, indc; + CImg indx, indy, indz, indc; *indices = *indicesy = *indicesz = *indicesc = *argx = *argy = *argz = *argc = sep = 0; sepx = sepy = sepz = sepc = '%'; int iinterpolation = 1; boundary = 0; + ind.assign(); if (((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c", - indices,&sep,&end)==2 && sep==']') || + gmic_use_indices,&sep,&end)==2 && sep==']') || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%d%c", indices,&iinterpolation,&end)==2 || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%d,%u%c", @@ -10226,18 +10837,17 @@ boundary<=0?"dirichlet":boundary==1?"neumann":boundary==2?"periodic":"mirror", cx,cy,cz,cc); cimg_forY(selection,l) gmic_apply(resize(nvalx,nvaly,nvalz,nvalc,iinterpolation,boundary,cx,cy,cz,cc)); - ++position; } else if ((cx=cy=cz=cc=0, iinterpolation=1, boundary=0, true) && (cimg_sscanf(argument,"%255[][a-zA-Z0-9_.eE%+-]%c", - argx,&end)==1 || + gmic_use_argx,&end)==1 || cimg_sscanf(argument,"%255[][a-zA-Z0-9_.eE%+-],%255[][a-zA-Z0-9_.eE%+-]%c", - argx,argy,&end)==2 || + argx,gmic_use_argy,&end)==2 || cimg_sscanf(argument,"%255[][a-zA-Z0-9_.eE%+-],%255[][a-zA-Z0-9_.eE%+-]," "%255[][a-zA-Z0-9_.eE%+-]%c", - argx,argy,argz,&end)==3 || + argx,argy,gmic_use_argz,&end)==3 || cimg_sscanf(argument,"%255[][a-zA-Z0-9_.eE%+-],%255[][a-zA-Z0-9_.eE%+-]," "%255[][a-zA-Z0-9_.eE%+-],%255[][a-zA-Z0-9_.eE%+-]%c", - argx,argy,argz,argc,&end)==4 || + argx,argy,argz,gmic_use_argc,&end)==4 || cimg_sscanf(argument,"%255[][a-zA-Z0-9_.eE%+-],%255[][a-zA-Z0-9_.eE%+-]," "%255[][a-zA-Z0-9_.eE%+-],%255[][a-zA-Z0-9_.eE%+-],%d%c", argx,argy,argz,argc,&iinterpolation,&end)==5 || @@ -10320,35 +10930,8 @@ nvalc = _nvalc?_nvalc:1; gmic_apply(resize(nvalx,nvaly,nvalz,nvalc,iinterpolation,boundary,cx,cy,cz,cc)); } - ++position; - } else { - if (!is_display_available) { - print(images,0,"Resize image%s in interactive mode (skipped, no display %s).", - gmic_selection.data(),cimg_display?"available":"support"); - } else { -#if cimg_display!=0 - print(images,0,"Resize image%s in interactive mode.", - gmic_selection.data()); - CImgDisplay _disp, &disp = _display_windows[0]?_display_windows[0]:_disp; - cimg_forY(selection,l) { - CImg& img = gmic_check(images[selection[l]]); - if (img) { - if (disp) disp.resize(cimg_fitscreen(img.width(),img.height(),1),false); - else disp.assign(cimg_fitscreen(img.width(),img.height(),1),0,1); - disp.set_title("%s: resize",basename(images_names[selection[l]])); - img.get_select(disp,0); - print(images,0, - "Resize image [%d] to %dx%d, with nearest-neighbor interpolation.", - selection[l], - disp.width(), - disp.height()); - gmic_apply(resize(disp)); - } else gmic_apply(replace(img)); - } -#endif // #if cimg_display!=0 - } - } - is_released = false; continue; + } else arg_error("resize"); + is_change = true; ++position; continue; } // Reverse positions. @@ -10364,11 +10947,11 @@ images[i0].swap(images[i1]); images_names[i0].swap(images_names[i1]); } - is_released = false; continue; + is_change = true; continue; } // Return. - if (!std::strcmp("return",item)) { + if (!is_get && !std::strcmp("return",item)) { if (is_very_verbose) print(images,0,"Return."); position = commands_line.size(); while (callstack && callstack.back()[0]=='*') { @@ -10390,8 +10973,8 @@ sep0 = sep1 = *argx = *argy = *indices = 0; value0 = value1 = 0; if (cimg_sscanf(argument,"%255[][a-zA-Z0-9_.eE%+-]%c", - argx,&end)==1 && - ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c]",indices,&sep0,&end)==2 && + gmic_use_argx,&end)==1 && + ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c]",gmic_use_indices,&sep0,&end)==2 && sep0==']' && (ind0=selection2cimg(indices,images.size(),images_names,"rows")).height()==1) || cimg_sscanf(argx,"%lf%c",&value0,&end)==1 || @@ -10406,13 +10989,13 @@ gmic_apply(row((int)nvalue0)); } } else if (cimg_sscanf(argument,"%255[][a-zA-Z0-9_.eE%+-],%255[][a-zA-Z0-9_.eE%+-]%c", - argx,argy,&end)==2 && - ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",indices,&sep0,&end)==2 && + gmic_use_argx,gmic_use_argy,&end)==2 && + ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_indices,&sep0,&end)==2 && sep0==']' && (ind0=selection2cimg(indices,images.size(),images_names,"rows")).height()==1) || cimg_sscanf(argx,"%lf%c",&value0,&end)==1 || (cimg_sscanf(argx,"%lf%c%c",&value0,&sep0,&end)==2 && sep0=='%')) && - ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",formula,&sep0,&end)==2 && + ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_formula,&sep0,&end)==2 && sep0==']' && (ind1=selection2cimg(formula,images.size(),images_names,"rows")).height()==1) || cimg_sscanf(argy,"%lf%c",&value1,&end)==1 || @@ -10430,7 +11013,7 @@ gmic_apply(rows((int)nvalue0,(int)nvalue1)); } } else arg_error("rows"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Rotate. @@ -10447,7 +11030,7 @@ cimg_sscanf(argument,"%f,%u,%u%c", &angle,&interpolation,&boundary,&end)==3 || cimg_sscanf(argument,"%f,%u,%u,%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - &angle,&interpolation,&boundary,argx,argy,&end)==5) && + &angle,&interpolation,&boundary,gmic_use_argx,gmic_use_argy,&end)==5) && (!*argx || cimg_sscanf(argx,"%f%c",&cx,&end)==1 || (cimg_sscanf(argx,"%f%c%c",&cx,&sep0,&end)==2 && sep0=='%')) && @@ -10477,7 +11060,8 @@ cimg_forY(selection,l) gmic_apply(rotate(angle,interpolation,boundary)); } } else if ((cimg_sscanf(argument,"%f,%f,%f,%f,%u,%u,%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - &u,&v,&w,&angle,&interpolation,&boundary,&(*argx=0),&(*argy=0),argz,&end)==9 || + &u,&v,&w,&angle,&interpolation,&boundary, + &(*gmic_use_argx=0),&(*gmic_use_argy=0),&(*gmic_use_argz=0),&end)==9 || cimg_sscanf(argument,"%f,%f,%f,%f,%u,%u%c", &u,&v,&w,&angle,&interpolation,&boundary,&end)==6) && (!*argx || @@ -10514,7 +11098,7 @@ cimg_forY(selection,l) gmic_apply(rotate(u,v,w,angle,interpolation,boundary)); } } else arg_error("rotate"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Round. @@ -10533,7 +11117,7 @@ value, rounding_type<0?"backward":rounding_type>0?"forward":"nearest"); cimg_forY(selection,l) gmic_apply(round(value,rounding_type)); - is_released = false; continue; + is_change = true; continue; } // Fill with random values. @@ -10543,13 +11127,13 @@ sep0 = sep1 = *argx = *argy = *indices = 0; value0 = value1 = 0; if (cimg_sscanf(argument,"%255[][a-zA-Z0-9_.eE%+-],%255[][a-zA-Z0-9_.eE%+-]%c", - argx,argy,&end)==2 && - ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",indices,&sep0,&end)==2 && + gmic_use_argx,gmic_use_argy,&end)==2 && + ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_indices,&sep0,&end)==2 && sep0==']' && (ind0=selection2cimg(indices,images.size(),images_names,"rand")).height()==1) || (cimg_sscanf(argx,"%lf%c%c",&value0,&sep0,&end)==2 && sep0=='%') || cimg_sscanf(argx,"%lf%c",&value0,&end)==1) && - ((cimg_sscanf(argy,"[%255[a-zA-Z0-9_.%+-]%c%c",formula,&sep1,&end)==2 && + ((cimg_sscanf(argy,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_formula,&sep1,&end)==2 && sep1==']' && (ind1=selection2cimg(formula,images.size(),images_names,"rand")).height()==1) || (cimg_sscanf(argy,"%lf%c%c",&value1,&sep1,&end)==2 && sep1=='%') || @@ -10571,7 +11155,7 @@ } gmic_apply(rand((T)nvalue0,(T)nvalue1)); } - } else if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",indices,&sep0,&end)==2 && + } else if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_indices,&sep0,&end)==2 && sep0==']' && (ind0=selection2cimg(indices,images.size(),images_names,"rand")).height()==1) { if (images[*ind0]) value1 = (double)images[*ind0].max_min(value0); @@ -10582,7 +11166,7 @@ *ind0); cimg_forY(selection,l) gmic_apply(rand((T)value0,(T)value1)); } else arg_error("rand"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Rotate 3D object. @@ -10601,17 +11185,17 @@ CImg& img = images[uind]; try { gmic_apply(rotate_CImg3d(vertices)); } catch (CImgException&) { - if (!img.is_CImg3d(true,&(*message=0))) - error(images,0,0, + if (!img.is_CImg3d(true,&(*gmic_use_message=0))) + error(true,images,0,0, "Command 'rotate3d': Invalid 3D object [%d], " "in selected image%s (%s).", - uind,gmic_selection_err.data(),message.data()); + uind,gmic_selection_err.data(),message); else throw; } } } else arg_error("rotate3d"); vertices.assign(); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Bitwise left rotation. @@ -10649,15 +11233,15 @@ CImg &img = images[uind]; try { gmic_apply(reverse_CImg3d()); } catch (CImgException&) { - if (!img.is_CImg3d(true,&(*message=0))) - error(images,0,0, + if (!img.is_CImg3d(true,&(*gmic_use_message=0))) + error(true,images,0,0, "Command 'reverse3d': Invalid 3D object [%d], " "in selected image%s (%s).", - uind,gmic_selection_err.data(),message.data()); + uind,gmic_selection_err.data(),message); else throw; } } - is_released = false; continue; + is_change = true; continue; } goto gmic_commands_others; @@ -10668,7 +11252,7 @@ gmic_commands_s : // Set status. - if (!std::strcmp("status",item)) { + if (!is_get && !std::strcmp("status",item)) { gmic_substitute_args(false); print(images,0,"Set status to '%s'.",gmic_argument_text_printed()); CImg::string(argument).move_to(status); @@ -10676,7 +11260,7 @@ } // Skip argument. - if (is_skip_command) { + if (is_command_skip) { gmic_substitute_args(false); if (is_very_verbose) print(images,0,"Skip argument '%s'.", @@ -10694,14 +11278,14 @@ if ((cimg_sscanf(argument,"%lf%c", &value,&end)==1 || cimg_sscanf(argument,"%lf,%255[0-9.eE%+-]%c", - &value,argx,&end)==2 || + &value,gmic_use_argx,&end)==2 || cimg_sscanf(argument,"%lf,%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - &value,argx,argy,&end)==3 || + &value,argx,gmic_use_argy,&end)==3 || cimg_sscanf(argument,"%lf,%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - &value,argx,argy,argz,&end)==4 || + &value,argx,argy,gmic_use_argz,&end)==4 || cimg_sscanf(argument,"%lf,%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-]," "%255[0-9.eE%+-]%c", - &value,argx,argy,argz,argc,&end)==5) && + &value,argx,argy,argz,gmic_use_argc,&end)==5) && (!*argx || (cimg_sscanf(argx,"%f%c%c",&x,&sepx,&end)==2 && sepx=='%') || cimg_sscanf(argx,"%f%c",&x,&end)==1) && @@ -10731,7 +11315,7 @@ gmic_apply(gmic_set(value,nx,ny,nz,nc)); } } else arg_error("set"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Split. @@ -10741,7 +11325,7 @@ float nb = -1; char pm = 0; *argx = 0; - if (cimg_sscanf(argument,"%255[xyzc],%f%c",argx,&nb,&end)==2 || + if (cimg_sscanf(argument,"%255[xyzc],%f%c",gmic_use_argx,&nb,&end)==2 || (nb = -1,cimg_sscanf(argument,"%255[xyzc]%c",argx,&end))==1) { // Split along axes. @@ -10779,10 +11363,10 @@ } else { g_list.assign(img,true); name = images_names[uind]; - for (const char *axis = argx; *axis; ++axis) { + for (const char *p_axis = argx; *p_axis; ++p_axis) { const unsigned int N = g_list.size(); - for (unsigned int l = 0; l values; @@ -10835,10 +11419,10 @@ if (*argx) { // Along axes g_list.assign(img,true); - for (const char *axis = argx; *axis; ++axis) { + for (const char *p_axis = argx; *p_axis; ++p_axis) { const unsigned int N = g_list.size(); - for (unsigned int l = 0; l'9') && *formula!=',') { + char *current = formula, *next = std::strchr(current,','), saved = 0; + pattern = 1U; + if (next) // Count number of specified variable names + for (const char *ptr = next; ptr; ptr = std::strchr(ptr,',')) { ++ptr; ++pattern; } + print(images,0, + "Store image%s as %s variable%s '%s'", + gmic_selection.data(), + is_compressed?"compressed":"", + next?"s":"", + gmic_argument_text_printed() + (*argument=='0' || *argument=='1'?2:0)); + + if (pattern!=1 && (int)pattern!=selection.height()) + error(true,images,0,0, + "Command 'store': Specified arguments '%s' do not match numbers of selected images.", + gmic_argument_text() + (*argument=='0' || *argument=='1'?2:0)); + + g_list.assign(selection.height()); + g_list_c.assign(g_list.size()); + cimg_forY(selection,l) { + const unsigned int uind = selection[l]; + if (is_get) { + g_list[l] = images[uind].get_shared(); +// g_list_c[l] = images_names[uind].get_shared(); // TO FIX! + CImg::string(images_names[uind]).move_to(g_list_c[l]); + } else { + images[uind].move_to(g_list[l]); +// images_names[uind].move_to(g_list_c[l]); // TO FIX! + CImg::string(images_names[uind]).move_to(g_list_c[l]); + images_names[uind].assign(); + } + } + + if (pattern==1) { // Assignment to a single variable + (g_list_c>'x').move_to(name); + name.resize(name.width() + 4,1,1,1,0,0,1); + name[0] = 'G'; name[1] = 'M'; name[2] = 'Z'; name[3] = 0; + name.unroll('y').move_to(g_list); + g_list.get_serialize((bool)is_compressed).unroll('x').move_to(name); + name.resize(name.width() + 9 + std::strlen(formula),1,1,1,0,0,1); + std::sprintf(name,"%c*store/%s",gmic_store,_formula.data()); + set_variable(formula,name,variables_sizes); + } else for (unsigned int n = 0; n tmp(2); + g_list_c[n].move_to(name); + name.resize(name.width() + 4,1,1,1,0,0,1); + name[0] = 'G'; name[1] = 'M'; name[2] = 'Z'; name[3] = 0; + name.unroll('y').move_to(tmp[1]); + g_list[n].move_to(tmp[0]); + tmp.get_serialize((bool)is_compressed).unroll('x').move_to(name); + name.resize(name.width() + 9 + std::strlen(current),1,1,1,0,0,1); + std::sprintf(name,"%c*store/%s",gmic_store,current); + set_variable(current,name,variables_sizes); + + if (saved) { // other variables names follow + *next = saved; + current = next + 1; + next = std::strchr(next + 1,','); + } + } + if (!is_get) remove_images(images,images_names,selection,0,selection.height() - 1); + name.assign(); + g_list.assign(); + g_list_c.assign(); + } else arg_error("store"); + ++position; continue; } // Shift. @@ -11050,14 +11716,14 @@ sepx = sepy = sepz = sepc = *argx = *argy = *argz = *argc = 0; interpolation = boundary = 0; if ((cimg_sscanf(argument,"%255[0-9.eE%+-]%c", - argx,&end)==1 || + gmic_use_argx,&end)==1 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - argx,argy,&end)==2 || + argx,gmic_use_argy,&end)==2 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - argx,argy,argz,&end)==3 || + argx,argy,gmic_use_argz,&end)==3 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-]," "%255[0-9.eE%+-]%c", - argx,argy,argz,argc,&end)==4 || + argx,argy,argz,gmic_use_argc,&end)==4 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-]," "%255[0-9.eE%+-],%u%c", argx,argy,argz,argc,&boundary,&end)==5 || @@ -11096,7 +11762,7 @@ gmic_apply(gmic_shift(ndx,ndy,ndz,ndc,boundary,(bool)interpolation)); } } else arg_error("shift"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Keep slices. @@ -11106,8 +11772,8 @@ sep0 = sep1 = *argx = *argy = *indices = 0; value0 = value1 = 0; if (cimg_sscanf(argument,"%255[][a-zA-Z0-9_.eE%+-]%c", - argx,&end)==1 && - ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c]",indices,&sep0,&end)==2 && + gmic_use_argx,&end)==1 && + ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c]",gmic_use_indices,&sep0,&end)==2 && sep0==']' && (ind0=selection2cimg(indices,images.size(),images_names,"slices")).height()==1) || cimg_sscanf(argx,"%lf%c",&value0,&end)==1 || @@ -11122,13 +11788,13 @@ gmic_apply(slice((int)nvalue0)); } } else if (cimg_sscanf(argument,"%255[][a-zA-Z0-9_.eE%+-],%255[][a-zA-Z0-9_.eE%+-]%c", - argx,argy,&end)==2 && - ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",indices,&sep0,&end)==2 && + gmic_use_argx,gmic_use_argy,&end)==2 && + ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_indices,&sep0,&end)==2 && sep0==']' && (ind0=selection2cimg(indices,images.size(),images_names,"slices")).height()==1) || cimg_sscanf(argx,"%lf%c",&value0,&end)==1 || (cimg_sscanf(argx,"%lf%c%c",&value0,&sep0,&end)==2 && sep0=='%')) && - ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",formula,&sep0,&end)==2 && + ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_formula,&sep0,&end)==2 && sep0==']' && (ind1=selection2cimg(formula,images.size(),images_names,"slices")).height()==1) || cimg_sscanf(argy,"%lf%c",&value1,&end)==1 || @@ -11146,7 +11812,7 @@ gmic_apply(slices((int)nvalue0,(int)nvalue1)); } } else arg_error("slices"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Sub. @@ -11188,22 +11854,22 @@ else print(images,0,"Sort values of image%s in %s order.", gmic_selection.data(),order=='+'?"ascending":"descending"); cimg_forY(selection,l) gmic_apply(sort(order=='+',axis)); - is_released = false; continue; + is_change = true; continue; } // Solve. if (!std::strcmp("solve",command)) { gmic_substitute_args(true); sep = *indices = 0; - if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",indices,&sep,&end)==2 && + if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_indices,&sep,&end)==2 && sep==']' && (ind=selection2cimg(indices,images.size(),images_names,"solve")).height()==1) { print(images,0,"Solve linear system AX = B, with B-vector%s and A-matrix [%d].", gmic_selection.data(),*ind); - const CImg A = gmic_image_arg(*ind); - cimg_forY(selection,l) gmic_apply(solve(A)); + const CImg A = gmic_image_arg(*ind); + cimg_forY(selection,l) gmic_apply_double(solve(A)); } else arg_error("solve"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Shift 3D object, with opposite displacement. @@ -11224,15 +11890,15 @@ CImg& img = images[uind]; try { gmic_apply(shift_CImg3d(-tx,-ty,-tz)); } catch (CImgException&) { - if (!img.is_CImg3d(true,&(*message=0))) - error(images,0,0, + if (!img.is_CImg3d(true,&(*gmic_use_message=0))) + error(true,images,0,0, "Command 'sub3d': Invalid 3D object [%d], in selected image%s (%s).", - uind,gmic_selection_err.data(),message.data()); + uind,gmic_selection_err.data(),message); else throw; } } } else arg_error("sub3d"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Sharpen. @@ -11262,11 +11928,11 @@ amplitude); cimg_forY(selection,l) gmic_apply(sharpen(amplitude,(bool)(edge>=0),edge,alpha,sigma)); } else arg_error("sharpen"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Set random generator seed. - if (!std::strcmp("srand",item)) { + if (!is_get && !std::strcmp("srand",item)) { gmic_substitute_args(false); value = 0; if (cimg_sscanf(argument,"%lf%c", @@ -11292,15 +11958,15 @@ interpolation = 0; value0 = 0.6; value1 = 1.1; if ((cimg_sscanf(argument,"%255[0-9.eE%+-]%c", - argz,&end)==1 || + gmic_use_argz,&end)==1 || cimg_sscanf(argument,"%255[0-9.eE%+-],%f%c", argz,&sharpness,&end)==2 || cimg_sscanf(argument,"%255[0-9.eE%+-],%f,%f%c", argz,&sharpness,&anisotropy,&end)==3 || cimg_sscanf(argument,"%255[0-9.eE%+-],%f,%f,%255[0-9.eE%+-]%c", - argz,&sharpness,&anisotropy,argx,&end)==4 || + argz,&sharpness,&anisotropy,gmic_use_argx,&end)==4 || cimg_sscanf(argument,"%255[0-9.eE%+-],%f,%f,%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - argz,&sharpness,&anisotropy,argx,argy,&end)==5 || + argz,&sharpness,&anisotropy,argx,gmic_use_argy,&end)==5 || cimg_sscanf(argument,"%255[0-9.eE%+-],%f,%f,%255[0-9.eE%+-],%255[0-9.eE%+-],%f%c", argz,&sharpness,&anisotropy,argx,argy,&dl,&end)==6 || cimg_sscanf(argument,"%255[0-9.eE%+-],%f,%f,%255[0-9.eE%+-],%255[0-9.eE%+-],%f,%f%c", @@ -11346,9 +12012,9 @@ gmic_apply(blur_anisotropic((float)value,sharpness,anisotropy,(float)value0,(float)value1,dl,da, gauss_prec,interpolation,(bool)is_fast_approximation)); } else if (((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c", - indices,&sep,&end)==2 && sep==']') || + gmic_use_indices,&sep,&end)==2 && sep==']') || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-]%c", - indices,argx,&end)==2 || + indices,gmic_use_argx,&end)==2 || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-],%f%c", indices,argx,&dl,&end)==3 || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%255[0-9.eE%+-],%f,%f%c", @@ -11388,7 +12054,7 @@ gmic_apply(blur_anisotropic(tensors,(float)value0,dl,da,gauss_prec,interpolation, is_fast_approximation)); } else arg_error("smooth"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Split 3D objects, into 6 vector images @@ -11421,10 +12087,10 @@ primitives.assign(); } else img.get_split_CImg3d().move_to(g_list); } catch (CImgException&) { - if (!img.is_CImg3d(true,&(*message=0))) - error(images,0,0, + if (!img.is_CImg3d(true,&(*gmic_use_message=0))) + error(true,images,0,0, "Command 'split3d': Invalid 3D object [%d], in selected image%s (%s).", - uind - off,gmic_selection_err.data(),message.data()); + uind - off,gmic_selection_err.data(),message); else throw; } if (is_get) { @@ -11440,15 +12106,16 @@ } } g_list.assign(); - is_released = false; continue; + is_change = true; continue; } // Screenshot. - if (!std::strcmp("screen",item)) { + if (!is_get && !std::strcmp("screen",item)) { gmic_substitute_args(false); + gmic_use_title; sepx = sepy = sepz = sepc = *argx = *argy = *argz = *argc = 0; if (cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - argx,argy,argz,argc,&end)==4 && + gmic_use_argx,gmic_use_argy,gmic_use_argz,gmic_use_argc,&end)==4 && (cimg_sscanf(argx,"%lf%c",&value0,&end)==1 || (cimg_sscanf(argx,"%lf%c%c",&value0,&sepx,&end)==2 && sepx=='%')) && (cimg_sscanf(argy,"%lf%c",&value1,&end)==1 || @@ -11479,7 +12146,7 @@ CImgDisplay::screenshot(images.back()); } CImg::string(title).move_to(images_names); - is_released = false; continue; + is_change = true; continue; } // SVD. @@ -11508,11 +12175,11 @@ off+=2; } } - is_released = false; continue; + is_change = true; continue; } // Input 3D sphere. - if (!std::strcmp("sphere3d",item)) { + if (!is_get && !std::strcmp("sphere3d",item)) { gmic_substitute_args(false); float radius = 100, recursions = 3; if ((cimg_sscanf(argument,"%f%c", @@ -11529,11 +12196,11 @@ primitives.assign(); CImg::string("[3D sphere]").move_to(images_names); } else arg_error("sphere3d"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Set 3D specular light parameters. - if (!std::strcmp("specl3d",item)) { + if (!is_get && !std::strcmp("specl3d",item)) { gmic_substitute_args(false); value = 0.15; if (cimg_sscanf(argument,"%lf%c", @@ -11545,7 +12212,7 @@ continue; } - if (!std::strcmp("specs3d",item)) { + if (!is_get && !std::strcmp("specs3d",item)) { gmic_substitute_args(false); value = 0.8; if (cimg_sscanf(argument,"%lf%c", @@ -11571,7 +12238,7 @@ sepx = sepy = sepz = *formula = 0; interpolation = 2; if ((cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - argx,argy,argz,&end)==3 || + gmic_use_argx,gmic_use_argy,gmic_use_argz,&end)==3 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-],%f%c", argx,argy,argz,&L,&end)==4 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-],%f,%f%c", @@ -11610,7 +12277,7 @@ (bool)is_backward,(bool)is_oriented_only).move_to(vertices); if (vertices.width()>1) { primitives.assign(vertices.width() - 1,1,2); - cimglist_for(primitives,l) { primitives(l,0) = (unsigned int)l; primitives(l,1) = l + 1U; } + cimglist_for(primitives,q) { primitives(q,0) = (unsigned int)q; primitives(q,1) = q + 1U; } g_list_uc.assign(primitives.size(),1,3,1,1,200); } else { vertices.assign(); @@ -11628,7 +12295,7 @@ g_list_uc.assign(); } } else if ((cimg_sscanf(argument,"'%4095[^']',%f,%f,%f%c", - formula,&x,&y,&z,&end)==4 || + gmic_use_formula,&x,&y,&z,&end)==4 || cimg_sscanf(argument,"'%4095[^']',%f,%f,%f,%f%c", formula,&x,&y,&z,&L,&end)==5 || cimg_sscanf(argument,"'%4095[^']',%f,%f,%f,%f,%f%c", @@ -11661,11 +12328,12 @@ vertices.object3dtoCImg3d(primitives,g_list_uc,false).move_to(images); primitives.assign(); g_list_uc.assign(); + gmic_use_title; cimg_snprintf(title,_title.width(),"[3D streamline of '%s' at (%g,%g,%g)]", formula,x,y,z); CImg::string(title).move_to(images_names); } else arg_error("streamline3d"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Compute structure tensor field. @@ -11679,7 +12347,7 @@ gmic_selection.data(), is_fwbw_scheme==1?"forward-backward":"centered"); cimg_forY(selection,l) gmic_apply(structure_tensors((bool)is_fwbw_scheme)); - is_released = false; continue; + is_change = true; continue; } // Select image feature. @@ -11691,11 +12359,11 @@ exit_on_anykey = 0; if ((cimg_sscanf(argument,"%u%c",&feature_type,&end)==1 || (cimg_sscanf(argument,"%u,%255[0-9.eE%+-]%c", - &feature_type,argx,&end)==2) || + &feature_type,gmic_use_argx,&end)==2) || (cimg_sscanf(argument,"%u,%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - &feature_type,argx,argy,&end)==3) || + &feature_type,argx,gmic_use_argy,&end)==3) || (cimg_sscanf(argument,"%u,%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - &feature_type,argx,argy,argz,&end)==4) || + &feature_type,argx,argy,gmic_use_argz,&end)==4) || (cimg_sscanf(argument,"%u,%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-],%u%c", &feature_type,argx,argy,argz,&exit_on_anykey,&end)==5) || (cimg_sscanf(argument,"%u,%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-],%u,%u%c", @@ -11720,9 +12388,8 @@ feature_type==0?"point":feature_type==1?"segment": feature_type==2?"rectangle":"ellipse",gmic_selection.data(), value,sep=='%'?"%":"",value0,sep0=='%'?"%":"",value1,sep1=='%'?"%":"", - cimg_display==0?"support":"available"); + cimg_display?"available":"support"); } else { -#if cimg_display!=0 print(images,0,"Select %s in image%s in interactive mode, from point (%g%s,%g%s,%g%s).", feature_type==0?"point":feature_type==1?"segment": feature_type==2?"rectangle":"ellipse",gmic_selection.data(), @@ -11737,18 +12404,17 @@ 0.,img.height() - 1.); XYZ[2] = (unsigned int)cimg::cut(cimg::round(sep1=='%'?(img.depth() - 1)*value1/100:value1), 0.,img.depth() - 1.); - if (_display_windows[0]) { - gmic_apply(select(_display_windows[0],feature_type,XYZ, + if (display_window(0)) { + gmic_apply(select(display_window(0),feature_type,XYZ, (bool)exit_on_anykey,is_deep_selection)); } else { gmic_apply(select(images_names[selection[l]].data(),feature_type,XYZ, (bool)exit_on_anykey,is_deep_selection)); } } -#endif // #if cimg_display!=0 } } else arg_error("select"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Serialize. @@ -11766,7 +12432,7 @@ #endif unsigned int is_compressed = is_compressed0?1U:0U, is_gmz = 1; if ((cimg_sscanf(argument,"%255[a-z ]%c", - argx,&end)==1 || + gmic_use_argx,&end)==1 || cimg_sscanf(argument,"%255[a-z ],%u%c", argx,&is_compressed,&end)==2 || cimg_sscanf(argument,"%255[a-z ],%u,%u%c", @@ -11821,7 +12487,7 @@ else gmic_serialize(int64T,"int64") else gmic_serialize(float,"float") else gmic_serialize(double,"double") - else error(images,0,0, + else error(true,images,0,0, "Command 'serialize': Invalid " "specified pixel type '%s'.", argx); @@ -11834,7 +12500,7 @@ } g_list.assign(); } - is_released = false; continue; + is_change = true; continue; } goto gmic_commands_others; @@ -11844,115 +12510,6 @@ //----------------------------- gmic_commands_t : - // Threshold. - if (!std::strcmp("threshold",command)) { - gmic_substitute_args(false); - unsigned int is_soft = 0; - value = 0; - sep = 0; - if ((cimg_sscanf(argument,"%lf%c", - &value,&end)==1 || - (cimg_sscanf(argument,"%lf%c%c", - &value,&sep,&end)==2 && sep=='%') || - cimg_sscanf(argument,"%lf,%u%c", - &value,&is_soft,&end)==2 || - (cimg_sscanf(argument,"%lf%c,%u%c", - &value,&sep,&is_soft,&end)==3 && sep=='%')) && - is_soft<=1) { - print(images,0,"%s-threshold image%s by %g%s.", - is_soft?"Soft":"Hard", - gmic_selection.data(), - value,sep=='%'?"%":""); - cimg_forY(selection,l) { - CImg& img = gmic_check(images[selection[l]]); - nvalue = value; - if (sep=='%' && img) { - vmax = (double)img.max_min(vmin); - nvalue = vmin + (vmax - vmin)*value/100; - } - gmic_apply(threshold((T)nvalue,(bool)is_soft)); - } - ++position; - } else { - if (!is_display_available) { - print(images,0, - "Threshold image%s in interactive mode (skipped, no display %s).", - gmic_selection.data(),cimg_display?"available":"support"); - } else { -#if cimg_display!=0 - print(images,0,"Threshold image%s in interactive mode.", - gmic_selection.data()); - CImgDisplay _disp, &disp = _display_windows[0]?_display_windows[0]:_disp; - g_img.assign(1,selection.height()).fill((T)0); - cimg_forY(selection,l) { - CImg& img = gmic_check(images[selection[l]]); - value = 0; - if (img) { - CImg visu = img.depth()>1?img.get_projections2d(img.width()/2, - img.height()/2, - img.depth()/2). - channels(0,std::min(3,img.spectrum()) - 1): - img.get_channels(0,std::min(3,img.spectrum() - 1)); - const unsigned int - w = CImgDisplay::_fitscreen(visu.width(),visu.height(),1,256,-85,false), - h = CImgDisplay::_fitscreen(visu.width(),visu.height(),1,256,-85,true); - if (disp) disp.resize(w,h,false); else disp.assign(w,h,0,0); - double percent = 50; - bool stopflag = false, is_clicked = false; - int omx = -1, omy = -1; - g_img_uc.assign(); - vmax = (double)img.max_min(vmin); - for (disp.show().flush(); !stopflag; ) { - static const unsigned char white[] = { 255,255,255 }, black[] = { 0,0,0 }; - const unsigned int key = disp.key(); - if (!g_img_uc) { - value = vmin + percent*(vmax - vmin)/100; - disp.display(((g_img_uc=visu.get_threshold((T)value)*=255).resize(disp)). - draw_text(0,0,"Threshold %g = %.3g%%", - white,black,0.7f,13,value,percent)). - set_title("%s (%dx%dx%dx%d)", - basename(images_names[selection[l]]), - img.width(),img.height(),img.depth(),img.spectrum()).wait(); - } - const int mx = disp.mouse_x(), my = disp.mouse_y(); - if (disp.button()) { - if (mx>=0 && my>=0 && (mx!=omx || my!=omy)) { - percent = (my - 16)*100./(disp.height() - 32); - if (percent<0) percent = 0; else if (percent>101) percent = 101; - omx = mx; omy = my; g_img_uc.assign(); - } - is_clicked = true; - } else if (is_clicked) break; - if (disp.is_closed() || (key && key!=cimg::keyCTRLLEFT)) stopflag = true; - if (key==cimg::keyD && disp.is_keyCTRLLEFT()) { - disp.resize(cimg_fitscreen(3*disp.width()/2,3*disp.height()/2,1), - stopflag=false).set_key(cimg::keyD,false); - g_img_uc.assign(); - } - if (key==cimg::keyC && disp.is_keyCTRLLEFT()) { - disp.resize(cimg_fitscreen(2*disp.width()/3,2*disp.height()/3,1), - stopflag=false).set_key(cimg::keyC,false); - g_img_uc.assign(); - } - if (disp.is_resized()) { disp.resize(false); g_img_uc.assign(); } - } - value = vmin + percent*(vmax - vmin)/100; - print(images,0, - "Hard-threshold image [%d] by %g = %.3g%%.", - selection[l],value,percent); - gmic_apply(threshold((T)value)); - } else gmic_apply(replace(img)); - g_img[l] = (T)value; - } - g_img.value_string().move_to(status); - g_img.assign(); - g_img_uc.assign(); -#endif // #if cimg_display!=0 - } - } - is_released = false; continue; - } - // Tangent. gmic_simple_command("tan",tan,"Compute pointwise tangent of image%s."); @@ -11961,41 +12518,40 @@ gmic_substitute_args(false); name.assign(4096); *argx = *argy = *argz = *name = *color = 0; - float x = 0, y = 0, height = 13; - sep = sepx = sepy = 0; + float x = 0, y = 0, height = 16; + sep = sepx = sepy = sep0 = 0; opacity = 1; if ((cimg_sscanf(argument,"%4095[^,]%c", name.data(),&end)==1 || - cimg_sscanf(argument,"%4095[^,],%255[0-9.eE%+-]%c", - name.data(),argx,&end)==2 || - cimg_sscanf(argument,"%4095[^,],%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - name.data(),argx,argy,&end)==3 || - cimg_sscanf(argument,"%4095[^,],%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - name.data(),argx,argy,argz,&end)==4 || - cimg_sscanf(argument,"%4095[^,],%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-],%f%c", + cimg_sscanf(argument,"%4095[^,],%255[0-9.eE%~+-]%c", + name.data(),gmic_use_argx,&end)==2 || + cimg_sscanf(argument,"%4095[^,],%255[0-9.eE%~+-],%255[0-9.eE%~+-]%c", + name.data(),argx,gmic_use_argy,&end)==3 || + cimg_sscanf(argument,"%4095[^,],%255[0-9.eE%~+-],%255[0-9.eE%~+-],%255[0-9.eE%+-]%c", + name.data(),argx,argy,gmic_use_argz,&end)==4 || + cimg_sscanf(argument,"%4095[^,],%255[0-9.eE%~+-],%255[0-9.eE%~+-],%255[0-9.eE%+-],%f%c", name.data(),argx,argy,argz,&opacity,&end)==5 || - cimg_sscanf(argument,"%4095[^,],%255[0-9.eE%+-],%255[0-9.eE%+-],%255[0-9.eE%+-],%f," + cimg_sscanf(argument,"%4095[^,],%255[0-9.eE%~+-],%255[0-9.eE%~+-],%255[0-9.eE%+-],%f," "%4095[0-9.eEinfa,+-]%c", - name.data(),argx,argy,argz,&opacity,color,&end)==6) && + name.data(),argx,argy,argz,&opacity,gmic_use_color,&end)==6) && (!*argx || cimg_sscanf(argx,"%f%c",&x,&end)==1 || - (cimg_sscanf(argx,"%f%c%c",&x,&sepx,&end)==2 && sepx=='%')) && + (cimg_sscanf(argx,"%f%c%c",&x,&sepx,&end)==2 && (sepx=='%' || sepx=='~'))) && (!*argy || cimg_sscanf(argy,"%f%c",&y,&end)==1 || - (cimg_sscanf(argy,"%f%c%c",&y,&sepy,&end)==2 && sepy=='%')) && + (cimg_sscanf(argy,"%f%c%c",&y,&sepy,&end)==2 && (sepy=='%' || sepy=='~'))) && (!*argz || cimg_sscanf(argz,"%f%c",&height,&end)==1 || (cimg_sscanf(argz,"%f%c%c",&height,&sep,&end)==2 && sep=='%')) && height>=0) { strreplace_fw(name); print(images,0,"Draw text '%s' at position (%g%s,%g%s) on image%s, with font " - "height %g%s, opacity %g and color (%s).", + "height %s, opacity %g and color (%s).", name.data(), - x,sepx=='%'?"%":"", - y,sepy=='%'?"%":"", + x,sepx=='%'?"%":sepx=='~'?"~":"", + y,sepy=='%'?"%":sepy=='~'?"~":"", gmic_selection.data(), - height,sep=='%'?"%":"", - opacity, + argz,opacity, *color?color:"default"); cimg::strunescape(name); unsigned int nb_cols = 1; @@ -12005,30 +12561,27 @@ const unsigned int font_height = (unsigned int)cimg::round(sep=='%'? height*img.height()/100:height); g_img.assign(std::max(img.spectrum(),(int)nb_cols),1,1,1,(T)0).fill(color,true,false); - const int - nx = (int)cimg::round(sepx=='%'?x*(img.width() - 1)/100:x), - ny = (int)cimg::round(sepy=='%'?y*(img.height() - 1)/100:y); - gmic_apply(gmic_draw_text(nx,ny,name,g_img,0,opacity,font_height,nb_cols)); + gmic_apply(gmic_draw_text(x,y,sepx,sepy,name,g_img,0,opacity,font_height,nb_cols)); } } else arg_error("text"); g_img.assign(); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Tridiagonal solve. if (!std::strcmp("trisolve",command)) { gmic_substitute_args(true); sep = *indices = 0; - if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",indices,&sep,&end)==2 && + if (cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_indices,&sep,&end)==2 && sep==']' && (ind=selection2cimg(indices,images.size(),images_names,"trisolve")).height()==1) { print(images,0,"Solve tridiagonal system AX = B, with B-vector%s and tridiagonal " "A-matrix [%d].", gmic_selection.data(),*ind); - const CImg A = gmic_image_arg(*ind); - cimg_forY(selection,l) gmic_apply(solve_tridiagonal(A)); + const CImg A = gmic_image_arg(*ind); + cimg_forY(selection,l) gmic_apply_double(solve_tridiagonal(A)); } else arg_error("trisolve"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Hyperbolic tangent. @@ -12054,11 +12607,11 @@ gmic_selection.data(), axis); cimg_forY(selection,l) gmic_apply(unroll(axis)); - is_released = false; continue; + is_change = true; continue; } // Remove custom command. - if (!std::strcmp("uncommand",item)) { + if (!is_get && !std::strcmp("uncommand",item)) { gmic_substitute_args(false); if (argument[0]=='*' && !argument[1]) { // Discard all custom commands cimg::mutex(23); @@ -12082,25 +12635,24 @@ unsigned int nb_removed = 0; cimglist_for(g_list_c,l) { CImg& arg_command = g_list_c[l]; - arg_command.resize(1,arg_command.height() + 1,1,1,0); + arg_command.resize(arg_command.width() + 1,1,1,1,0); strreplace_fw(arg_command); if (*arg_command) { - const unsigned int hash = hashcode(arg_command,false); - unsigned int ind; - if (search_sorted(arg_command,commands_names[hash],commands_names[hash].size(),ind)) { - commands_names[hash].remove(ind); - commands[hash].remove(ind); - commands_has_arguments[hash].remove(ind); + hash = hashcode(arg_command,false); + if (search_sorted(arg_command,commands_names[hash],commands_names[hash].size(),pattern)) { + commands_names[hash].remove(pattern); + commands[hash].remove(pattern); + commands_has_arguments[hash].remove(pattern); ++nb_removed; } } } if (is_verbose) { cimg::mutex(29); - unsigned int siz = 0; - for (unsigned int l = 0; l1?"s":""); + nb_removed,isiz,isiz>1?"s":""); std::fflush(cimg::output()); cimg::mutex(29,0); } @@ -12123,10 +12675,15 @@ const CImg& back = g_list.back(); if (back.width()==1 && back.depth()==1 && back.spectrum()==1 && back[0]=='G' && back[1]=='M' && back[2]=='Z' && !back[3]) { // .gmz serialization - g_list_c = back.get_split(CImg::vector(0),0,false); - g_list_c.remove(0); - cimglist_for(g_list_c,l) - g_list_c[l].resize(1,g_list_c[l].height() + 1,1,1,0).unroll('x'); + g_list_c.assign(); + const unsigned int pend = (unsigned int)back.size(); + for (unsigned int p = 4; p(back.data(p),1,++np - p,1,1,true).move_to(g_list_c); + p = np; + } + cimglist_for(g_list_c,q) g_list_c[q].unroll('x'); if (g_list_c) g_list.remove(); } else { // .cimg[z] serialization g_list_c.insert(images_names[uind]); @@ -12148,7 +12705,7 @@ } } g_list.assign(); g_list_c.assign(); - is_released = false; continue; + is_change = true; continue; } goto gmic_commands_others; @@ -12160,14 +12717,14 @@ // Set verbosity // (actually only display a log message, since it has been already processed before). - if (is_verbose_command) { + if (is_command_verbose) { if (*argument=='-' && !argument[1]) print(images,0,"Decrement verbosity level (set to %d).", verbosity); else if (*argument=='+' && !argument[1]) { if (is_very_verbose) print(images,0,"Increment verbosity level (set to %d).", verbosity); - } else if ((verbosity>=0 && old_verbosity>=0) || is_debug) + } else if ((verbosity>=1 && old_verbosity>=1) || is_debug) print(images,0,"Set verbosity level to %d.", verbosity); if (is_verbose_argument) ++position; @@ -12197,7 +12754,7 @@ if (sep=='%') sigma = -sigma; cimg_forY(selection,l) gmic_apply(vanvliet(sigma,order,axis,(bool)boundary)); } else arg_error("vanvliet"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } goto gmic_commands_others; @@ -12208,28 +12765,17 @@ gmic_commands_w : // While. - if (!std::strcmp("while",item)) { + if (!is_get && !std::strcmp("while",item)) { gmic_substitute_args(false); const CImg& s = callstack.back(); if (s[0]!='*' || s[1]!='d') - error(images,0,0, + error(true,images,0,0, "Command 'while': Not associated to a 'do' command within the same scope."); - float _is_cond = 0; - bool is_filename = false; - if (cimg_sscanf(argument,"%f%c",&_is_cond,&end)!=1) { - is_filename = true; - name.assign(argument,(unsigned int)std::strlen(argument) + 1); - strreplace_fw(name); - _is_cond = (float)check_filename(name); - } - const bool is_cond = (bool)_is_cond; + is_cond = check_cond(argument,images,"while"); if (is_very_verbose) - print(images,0,"Reach 'while' command -> %s '%s' %s.", - is_filename?"file":"condition", + print(images,0,"Reach 'while' command -> condition '%s' %s.", gmic_argument_text_printed(), - is_filename?(is_cond?"exists": - "does not exist"): - (is_cond?"holds":"does not hold")); + is_cond?"holds":"does not hold"); if (is_cond) { position = dowhiles[nb_dowhiles - 1]; next_debug_line = debug_line; next_debug_filename = debug_filename; @@ -12243,34 +12789,42 @@ } // Warning. - if (!is_get && !std::strcmp("warn",command)) { - gmic_substitute_args(false); - bool force_visible = false; - if ((*argument=='0' || *argument=='1') && argument[1]==',') { - force_visible = *argument=='1'; argument+=2; + if (is_command_warn) { + if (verbosity>=0 || is_debug || is_get) { + gmic_substitute_args(false); + bool force_visible = false; + if ((*argument=='0' || *argument=='1') && argument[1]==',') { + force_visible = *argument=='1'; argument+=2; + } + name.assign(argument,(unsigned int)std::strlen(argument) + 1); + cimg::strunescape(name); + const int _verbosity = ++verbosity; + std::FILE *_file = 0; + if (is_get) { _file = cimg::output(); verbosity = 1; cimg::output(stdout); } + if (is_selection) warn(images,&selection,force_visible,"%s",name.data()); + else warn(images,0,force_visible,"%s",name.data()); + if (is_get) { verbosity = _verbosity; cimg::output(_file); } + --verbosity; } - name.assign(argument,(unsigned int)std::strlen(argument) + 1); - cimg::strunescape(name); - if (is_selection) warn(images,&selection,force_visible,"%s",name.data()); - else warn(images,0,force_visible,"%s",name.data()); ++position; continue; } // Display images in display window. - wind = 0; + sep = '0'; if (!is_get && (!std::strcmp("window",command) || - cimg_sscanf(command,"window%u%c",&wind,&end)==1 || - cimg_sscanf(command,"w%u%c",&wind,&end)==1) && - wind<10) { + cimg_sscanf(command,"window%c%c",&sep,&end)==1 || + cimg_sscanf(command,"w%c%c",&sep,&end)==1) && + sep>='0' && sep<='9') { + wind = (unsigned int)(sep - '0'); gmic_substitute_args(false); int norm = -1, fullscreen = -1; - float dimw = -1, dimh = -1, posx = -1, posy = -1; + float dimw = -1, dimh = -1, posx = cimg::type::inf(), posy = cimg::type::inf(); sep0 = sep1 = sepx = sepy = *argx = *argy = *argz = *argc = *title = 0; if ((cimg_sscanf(argument,"%255[0-9.eE%+-]%c", - argx,&end)==1 || + gmic_use_argx,&end)==1 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-]%c", - argx,argy,&end)==2 || + argx,gmic_use_argy,&end)==2 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%d%c", argx,argy,&norm,&end)==3 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%d,%d%c", @@ -12278,11 +12832,11 @@ cimg_sscanf(argument, "%255[0-9.eE%+-],%255[0-9.eE%+-],%d,%d,%255[0-9.eE%+-]," "%255[0-9.eE%+-]%c", - argx,argy,&norm,&fullscreen,argz,argc,&end)==6 || + argx,argy,&norm,&fullscreen,gmic_use_argz,gmic_use_argc,&end)==6 || cimg_sscanf(argument, "%255[0-9.eE%+-],%255[0-9.eE%+-],%d,%d,%255[0-9.eE%+-]," "%255[0-9.eE%+-],%255[^\n]", - argx,argy,&norm,&fullscreen,argz,argc,title)==7 || + argx,argy,&norm,&fullscreen,argz,argc,gmic_use_title)==7 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%d,%d,%255[^\n]", &(*argx=*argz=*argc=0),argy,&norm,&fullscreen,title)==5 || cimg_sscanf(argument,"%255[0-9.eE%+-],%255[0-9.eE%+-],%d,%255[^\n]", @@ -12307,12 +12861,11 @@ else { dimw = dimh = -1; norm = fullscreen = -1; - posx = posy = -1; + posx = posy = cimg::type::inf(); sep0 = sep1 = 0; } - if (dimh==0) dimw = 0; - strreplace_fw(title); - cimg::strunescape(title); + if (dimw==0 || dimh==0) dimw = dimh = 0; + if (*title) { strreplace_fw(title); cimg::strunescape(title); } if (!is_display_available) { print(images,0, @@ -12320,7 +12873,7 @@ gmic_selection.data(), wind,cimg_display?"available":"support"); } else { -#if cimg_display!=0 + // Get images to display and compute associated optimal size. unsigned int optw = 0, opth = 0; if (dimw && dimh) cimg_forY(selection,l) { @@ -12336,8 +12889,8 @@ dimw = dimw<0?-1:cimg::round(sep0=='%'?optw*dimw/100:dimw); dimh = dimh<0?-1:cimg::round(sep1=='%'?opth*dimh/100:dimh); - const bool is_move = posx!=-1 || posy!=-1; - CImgDisplay &disp = _display_windows[wind]; + const bool is_move = !cimg::type::is_inf(posx) && !cimg::type::is_inf(posy); + CImgDisplay &disp = display_window(wind); if (!dimw || !dimh) { // Close print(images,0,"Close display window [%d].", @@ -12374,34 +12927,35 @@ else { disp._min = 0; disp._max = 255; } } } - if (is_move) print(images,0, - "Display image%s in %dx%d %sdisplay window [%d], " - "with%snormalization, " - "%sfullscreen, at position (%s,%s) and title '%s'.", - gmic_selection.data(), - disp.width(),disp.height(),disp.is_fullscreen()?"fullscreen ":"", - wind, - disp.normalization()==0?"out ":disp.normalization()==1?" ": - disp.normalization()==2?" 1st-time ":" auto-", - disp.is_fullscreen()?"":"no ", - argz,argc, - disp.title()); - else print(images,0, - "Display image%s in %dx%d %sdisplay window [%d], with%snormalization, " - "%sfullscreen and title '%s'.", - gmic_selection.data(), - disp.width(),disp.height(),disp.is_fullscreen()?"fullscreen ":"", - wind, - disp.normalization()==0?"out ":disp.normalization()==1?" ": - disp.normalization()==2?" 1st-time ":" auto-", - disp.is_fullscreen()?"":"no ", - disp.title()); - if (g_list) g_list.display(disp); + if (is_move) + print(images,0, + "Display image%s in %dx%d %sdisplay window [%d], " + "with%snormalization, " + "%sfullscreen, at position (%s,%s) and title '%s'.", + gmic_selection.data(), + disp.width(),disp.height(),disp.is_fullscreen()?"fullscreen ":"", + wind, + disp.normalization()==0?"out ":disp.normalization()==1?" ": + disp.normalization()==2?" 1st-time ":" auto-", + disp.is_fullscreen()?"":"no ", + argz,argc, + disp.title()); + else + print(images,0, + "Display image%s in %dx%d %sdisplay window [%d], with%snormalization, " + "%sfullscreen and title '%s'.", + gmic_selection.data(), + disp.width(),disp.height(),disp.is_fullscreen()?"fullscreen ":"", + wind, + disp.normalization()==0?"out ":disp.normalization()==1?" ": + disp.normalization()==2?" 1st-time ":" auto-", + disp.is_fullscreen()?"":"no ", + disp.title()); + if (g_list) { g_list.display(disp); is_change = false; } } g_list.assign(); -#endif // #if cimg_display!=0 } - is_released = true; continue; + continue; } // Warp. @@ -12413,7 +12967,7 @@ boundary = 1; sep = 0; if (((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c", - indices,&sep,&end)==2 && sep==']')|| + gmic_use_indices,&sep,&end)==2 && sep==']')|| cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u%c", indices,&mode,&end)==2 || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u,%u%c", @@ -12445,14 +12999,25 @@ boundary==0?"dirichlet":boundary==1?"neumann":boundary==2?"periodic":"mirror", (int)nb_frames); unsigned int off = 0; + CImg _warp; + if (!(mode%2)) _warp.assign(warping_field,false); + cimg_forY(selection,l) { const unsigned int _ind = selection[l] + off; CImg& img = gmic_check(images[_ind]); g_list.assign((int)nb_frames); name = images_names[_ind]; cimglist_for(g_list,t) - g_list[t] = img.get_warp(warping_field*((t + 1.f)/nb_frames),mode, - interpolation,boundary); + if (mode%2) g_list[t] = img.get_warp(warping_field*(t/(nb_frames - 1)),mode,interpolation,boundary); + else { + cimg_forXYZ(_warp,x,y,z) { + const float fact = t/(nb_frames - 1); + if (_warp.spectrum()>0) _warp(x,y,z,0) = x + (warping_field(x,y,z,0) - x)*fact; + if (_warp.spectrum()>1) _warp(x,y,z,1) = y + (warping_field(x,y,z,1) - y)*fact; + if (_warp.spectrum()>2) _warp(x,y,z,2) = z + (warping_field(x,y,z,2) - z)*fact; + } + g_list[t] = img.get_warp(_warp,mode,interpolation,boundary); + } if (is_get) { images_names.insert((int)nb_frames,name.copymark()); g_list.move_to(images,~0U); @@ -12465,7 +13030,7 @@ g_list.assign(); } } else arg_error("warp"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Watershed transform. @@ -12473,7 +13038,7 @@ gmic_substitute_args(true); is_high_connectivity = 1; sep = *indices = 0; - if (((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",indices,&sep,&end)==2 && + if (((cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_indices,&sep,&end)==2 && sep==']') || cimg_sscanf(argument,"[%255[a-zA-Z0-9_.%+-]],%u%c", indices,&is_high_connectivity,&end)==2) && @@ -12485,7 +13050,7 @@ const CImg priority = gmic_image_arg(*ind); cimg_forY(selection,l) gmic_apply(watershed(priority,(bool)is_high_connectivity)); } else arg_error("watershed"); - is_released = false; ++position; continue; + is_change = true; ++position; continue; } // Wait for a given delay of for user events on display window. @@ -12497,76 +13062,84 @@ if (cimg_sscanf(argument,"%f%c", &delay,&end)==1) ++position; else delay = 0; -#if cimg_display==0 - if (!delay) - print(images,0, - "Wait for user events on display window%s (skipped, no display support).", - gmic_selection.data()); - else { - delay = cimg::round(delay); - print(images,0, - "%s for %g milliseconds according to display window%s.", - delay<0?"Sleep":"Wait",delay, - gmic_selection.data()); - if (delay<0) cimg::sleep((unsigned int)-delay); - else cimg::wait((unsigned int)delay); - } -#else // #if cimg_display==0 - if (!delay) { - print(images,0,"Wait for user events on display window%s.", - gmic_selection.data()); - CImgDisplay *const iw = _display_windows; - switch (selection.height()) { - case 1 : CImgDisplay::wait(iw[selection[0]]); break; - case 2 : CImgDisplay::wait(iw[selection[0]],iw[selection[1]]); break; - case 3 : CImgDisplay::wait(iw[selection[0]],iw[selection[1]],iw[selection[2]]); - break; - case 4 : CImgDisplay::wait(iw[selection[0]],iw[selection[1]],iw[selection[2]], - iw[selection[3]]); - break; - case 5 : CImgDisplay::wait(iw[selection[0]],iw[selection[1]],iw[selection[2]], - iw[selection[3]],iw[selection[4]]); - break; - case 6 : CImgDisplay::wait(iw[selection[0]],iw[selection[1]],iw[selection[2]], - iw[selection[3]],iw[selection[4]],iw[selection[5]]); - break; - case 7 : CImgDisplay::wait(iw[selection[0]],iw[selection[1]],iw[selection[2]], - iw[selection[3]],iw[selection[4]],iw[selection[5]], - iw[selection[6]]); - break; - case 8 : CImgDisplay::wait(iw[selection[0]],iw[selection[1]],iw[selection[2]], - iw[selection[3]],iw[selection[4]],iw[selection[5]], - iw[selection[6]],iw[selection[7]]); - break; - case 9 : CImgDisplay::wait(iw[selection[0]],iw[selection[1]],iw[selection[2]], - iw[selection[3]],iw[selection[4]],iw[selection[5]], - iw[selection[6]],iw[selection[7]],iw[selection[8]]); - break; - case 10 : CImgDisplay::wait(iw[selection[0]],iw[selection[1]],iw[selection[2]], - iw[selection[3]],iw[selection[4]],iw[selection[5]], - iw[selection[6]],iw[selection[7]],iw[selection[8]], - iw[selection[9]]); - break; + + if (!is_display_available) { + if (!delay) + print(images,0, + "Wait for user events on display window%s (skipped, no display support).", + gmic_selection.data()); + else { + delay = cimg::round(delay); + print(images,0, + "%s for %g milliseconds according to display window%s.", + delay<0?"Sleep":"Wait",delay, + gmic_selection.data()); + if (delay<0) cimg::sleep((unsigned int)-delay); + else cimg::wait((unsigned int)delay); } - } else if (delay<0) { - delay = cimg::round(-delay); - print(images,0, - "Flush display events of display window%s and wait for %g milliseconds.", - gmic_selection.data(),delay); - cimg_forY(selection,l) _display_windows[selection[l]].flush(); - if (selection && _display_windows[selection[0]]) - _display_windows[selection[0]].wait((unsigned int)delay); - else cimg::wait((unsigned int)delay); } else { - delay = cimg::round(delay); - print(images,0,"Wait for %g milliseconds according to display window%s.", - delay, - gmic_selection.data()); - if (selection && _display_windows[selection[0]]) - _display_windows[selection[0]].wait((unsigned int)delay); - else cimg::sleep((unsigned int)delay); + if (!delay) { + print(images,0,"Wait for user events on display window%s.", + gmic_selection.data()); + switch (selection.height()) { + case 1 : CImgDisplay::wait(display_window(selection[0])); break; + case 2 : CImgDisplay::wait(display_window(selection[0]),display_window(selection[1])); break; + case 3 : CImgDisplay::wait(display_window(selection[0]),display_window(selection[1]), + display_window(selection[2])); + break; + case 4 : CImgDisplay::wait(display_window(selection[0]),display_window(selection[1]), + display_window(selection[2]),display_window(selection[3])); + break; + case 5 : CImgDisplay::wait(display_window(selection[0]),display_window(selection[1]), + display_window(selection[2]),display_window(selection[3]), + display_window(selection[4])); + break; + case 6 : CImgDisplay::wait(display_window(selection[0]),display_window(selection[1]), + display_window(selection[2]),display_window(selection[3]), + display_window(selection[4]),display_window(selection[5])); + break; + case 7 : CImgDisplay::wait(display_window(selection[0]),display_window(selection[1]), + display_window(selection[2]),display_window(selection[3]), + display_window(selection[4]),display_window(selection[5]), + display_window(selection[6])); + break; + case 8 : CImgDisplay::wait(display_window(selection[0]),display_window(selection[1]), + display_window(selection[2]),display_window(selection[3]), + display_window(selection[4]),display_window(selection[5]), + display_window(selection[6]),display_window(selection[7])); + break; + case 9 : CImgDisplay::wait(display_window(selection[0]),display_window(selection[1]), + display_window(selection[2]),display_window(selection[3]), + display_window(selection[4]),display_window(selection[5]), + display_window(selection[6]),display_window(selection[7]), + display_window(selection[8])); + break; + case 10 : CImgDisplay::wait(display_window(selection[0]),display_window(selection[1]), + display_window(selection[2]),display_window(selection[3]), + display_window(selection[4]),display_window(selection[5]), + display_window(selection[6]),display_window(selection[7]), + display_window(selection[8]),display_window(selection[9])); + break; + } + } else if (delay<0) { + delay = cimg::round(-delay); + print(images,0, + "Flush display events of display window%s and wait for %g milliseconds.", + gmic_selection.data(),delay); + cimg_forY(selection,l) display_window(selection[l]).flush(); + if (selection && display_window(selection[0])) + display_window(selection[0]).wait((unsigned int)delay); + else cimg::wait((unsigned int)delay); + } else { + delay = cimg::round(delay); + print(images,0,"Wait for %g milliseconds according to display window%s.", + delay, + gmic_selection.data()); + if (selection && display_window(selection[0])) + display_window(selection[0]).wait((unsigned int)delay); + else cimg::sleep((unsigned int)delay); + } } -#endif // #if cimg_display==0 continue; } @@ -12597,271 +13170,262 @@ //---------------------------- gmic_commands_others : - // If...[elif]...[else]...endif. - if (!std::strcmp("if",item) || (!std::strcmp("elif",item) && check_elif)) { - gmic_substitute_args(false); - check_elif = false; - float _is_cond = 0; - bool is_filename = false; - if (cimg_sscanf(argument,"%f%c",&_is_cond,&end)!=1) { - is_filename = true; - name.assign(argument,(unsigned int)std::strlen(argument) + 1); - strreplace_fw(name); - _is_cond = (float)check_filename(name); - } - const bool is_cond = (bool)_is_cond; - if (*item=='i') { - if (is_debug_info && debug_line!=~0U) { - cimg_snprintf(argx,_argx.width(),"*if#%u",debug_line); - CImg::string(argx).move_to(callstack); - } else CImg::string("*if").move_to(callstack); - if (is_very_verbose) print(images,0,"Start 'if...endif' block -> %s '%s' %s.", - is_filename?"file":"condition", - gmic_argument_text_printed(), - is_filename?(is_cond?"exists":"does not exist"): - (is_cond?"holds":"does not hold")); - } else if (is_very_verbose) print(images,0,"Reach 'elif' block -> %s '%s' %s.", - is_filename?"file":"condition", - gmic_argument_text_printed(), - is_filename?(is_cond?"exists": - "does not exist"): - (is_cond?"holds":"does not hold")); - if (!is_cond) { - for (int nb_ifs = 1; nb_ifs && position0) { - is_debug_info = true; next_debug_line = _debug_line; next_debug_filename = _debug_filename; - } else { - it+=*it=='-'; - if (!std::strcmp("if",it)) ++nb_ifs; - else if (!std::strcmp("endif",it) || !std::strcmp("fi",it)) { --nb_ifs; if (!nb_ifs) --position; } - else if (nb_ifs==1) { - if (!std::strcmp("else",it)) --nb_ifs; - else if (!std::strcmp("elif",it)) { --nb_ifs; check_elif = true; --position; } + if (is_builtin_command) { + + // If...[elif]...[else]...endif. + if (!is_get && (!std::strcmp("if",item) || (check_elif && !std::strcmp("elif",item)))) { + gmic_substitute_args(false); + is_cond = check_cond(argument,images,*item=='i'?"if":"elif"); + check_elif = false; + if (*item=='i') { + if (is_debug_info && debug_line!=~0U) { + gmic_use_argx; + cimg_snprintf(argx,_argx.width(),"*if#%u",debug_line); + CImg::string(argx).move_to(callstack); + } else CImg::string("*if").move_to(callstack); + if (is_very_verbose) print(images,0,"Start 'if...endif' block -> condition '%s' %s.", + gmic_argument_text_printed(), + is_cond?"holds":"does not hold"); + } else if (is_very_verbose) print(images,0,"Reach 'elif' block -> condition '%s' %s.", + gmic_argument_text_printed(), + is_cond?"holds":"does not hold"); + if (!is_cond) { + for (int nb_ifs = 1; nb_ifs && position=commands_line.size()) - error(images,0,0, - "Command '%s': Missing associated '%s' command.",stb,ste); - if (is_continue || callstack_local) { - if (callstack_ind1?'e':'i', - selection.height()>2?"s":selection.height()>=1?"":"()."); - ++position; - } else - print(images,0,"Compute %sfourier transform of image%s with complex pair%s", - inv_fft?"inverse ":"", - gmic_selection.data(), - selection.height()>2?"s":selection.height()>=1?"":" ()."); - cimg_forY(selection,l) { - const unsigned int - uind0 = selection[l], - uind1 = l + 1 &img0 = gmic_check(images[uind0]), - &img1 = uind1!=~0U?gmic_check(images[uind1]):CImg::empty(); - name = images_names[uind0]; - if (uind1!=~0U) { // Complex transform - if (is_verbose) { - cimg::mutex(29); - std::fprintf(cimg::output()," ([%u],[%u])%c",uind0,uind1, - l>=selection.height() - 2?'.':','); - std::fflush(cimg::output()); - cimg::mutex(29,0); + // Break and continue. + bool is_continue = false; + if (!is_get && (!std::strcmp("break",item) || + (!std::strcmp("continue",item) && (is_continue=true)==true))) { + const char + *const com = is_continue?"continue":"break", + *const Com = is_continue?"Continue":"Break"; + unsigned int callstack_repeat = 0, callstack_do = 0, callstack_for = 0, callstack_local = 0; + for (unsigned int l = callstack.size() - 1; l; --l) { + const char *const s = callstack[l].data(); + if (s[0]=='*' && s[1]=='r') { callstack_repeat = l; break; } + else if (s[0]=='*' && s[1]=='d') { callstack_do = l; break; } + else if (s[0]=='*' && s[1]=='f') { callstack_for = l; break; } + else if (s[0]=='*' && s[1]=='l') { callstack_local = l; break; } + else if (s[0]!='*' || s[1]!='i') break; + } + const char *stb = 0, *ste = 0; + unsigned int callstack_ind = 0; + int level = 0; + if (callstack_repeat) { + print(images,0,"%s %scurrent 'repeat...done' block.", + Com,is_continue?"to next iteration of ":""); + for (level = 1; level && position=selection.height() - 2?'.':','); - std::fflush(cimg::output()); - cimg::mutex(29,0); + callstack_ind = callstack_do; + stb = "do"; ste = "while"; + } else if (callstack_for) { + print(images,0,"%s %scurrent 'for...done' block.", + Com,is_continue?"to next iteration of ":""); + for (level = 1; level && position(g_list[0].width(),g_list[0].height(),g_list[0].depth(),g_list[0].spectrum(),(T)0). - move_to(g_list); - if (is_valid_argument) for (const char *s = argument; *s; ++s) g_list.FFT(*s,inv_fft); - else g_list.FFT(inv_fft); - g_list.move_to(images,~0U); - images_names.insert(2,name.copymark()); - } else { - g_list.assign(1); - g_list[0].swap(img0); - CImg(g_list[0].width(),g_list[0].height(),g_list[0].depth(),g_list[0].spectrum(),(T)0). - move_to(g_list); - if (is_valid_argument) for (const char *s = argument; *s; ++s) g_list.FFT(*s,inv_fft); - else g_list.FFT(inv_fft); - g_list[0].swap(img0); - g_list[1].move_to(images,uind0 + 1); - name.get_copymark().move_to(images_names,uind0 + 1); - name.move_to(images_names[uind0]); + callstack_ind = callstack_for; + stb = "for"; ste = "done"; + } else if (callstack_local) { + print(images,0,"%s %scurrent local environment.", + Com,is_continue?"to end of ":""); + for (level = 1; level && position=commands_line.size()) + error(true,images,0,0, + "Command '%s': Missing associated '%s' command.",stb,ste); + if (is_continue || callstack_local) { + if (callstack_ind1?'e':'i', + selection.height()>2?"s":selection.height()>=1?"":"()."); + ++position; + } else + print(images,0,"Compute %sfourier transform of image%s with complex pair%s", + inv_fft?"inverse ":"", gmic_selection.data(), - sx,sy,sz); + selection.height()>2?"s":selection.height()>=1?"":" ()."); cimg_forY(selection,l) { - const unsigned int uind = selection[l]; - CImg& img = images[uind]; - try { - if (divide3d) { gmic_apply(scale_CImg3d(1/sx,1/sy,1/sz)); } - else gmic_apply(scale_CImg3d(sx,sy,sz)); - } catch (CImgException&) { - if (!img.is_CImg3d(true,&(*message=0))) - error(images,0,0, - "Command '%s3d': Invalid 3D object [%d], in selected image%s (%s).", - divide3d?"div":"mul",uind,gmic_selection_err.data(),message.data()); - else throw; + const unsigned int + uind0 = selection[l], + uind1 = l + 1 &img0 = gmic_check(images[uind0]), + &img1 = uind1!=~0U?gmic_check(images[uind1]):CImg::empty(); + name = images_names[uind0]; + if (uind1!=~0U) { // Complex transform + if (is_verbose) { + cimg::mutex(29); + std::fprintf(cimg::output()," ([%u],[%u])%c",uind0,uind1, + l>=selection.height() - 2?'.':','); + std::fflush(cimg::output()); + cimg::mutex(29,0); + } + if (is_get) { + g_list.assign(img0,img1); + if (is_valid_argument) for (const char *s = argument; *s; ++s) g_list.FFT(*s,inv_fft); + else g_list.FFT(inv_fft); + g_list.move_to(images,~0U); + images_names.insert(2,name.copymark()); + } else { + g_list.assign(2); + g_list[0].swap(img0); + g_list[1].swap(img1); + if (is_valid_argument) for (const char *s = argument; *s; ++s) g_list.FFT(*s,inv_fft); + else g_list.FFT(inv_fft); + g_list[0].swap(img0); + g_list[1].swap(img1); + name.get_copymark().move_to(images_names[uind1]); + name.move_to(images_names[uind0]); + } + ++l; + } else { // Real transform + if (is_verbose) { + cimg::mutex(29); + std::fprintf(cimg::output()," ([%u],0)%c",uind0, + l>=selection.height() - 2?'.':','); + std::fflush(cimg::output()); + cimg::mutex(29,0); + } + if (is_get) { + g_list.assign(img0); + CImg(g_list[0].width(),g_list[0].height(),g_list[0].depth(),g_list[0].spectrum(),(T)0). + move_to(g_list); + if (is_valid_argument) for (const char *s = argument; *s; ++s) g_list.FFT(*s,inv_fft); + else g_list.FFT(inv_fft); + g_list.move_to(images,~0U); + images_names.insert(2,name.copymark()); + } else { + g_list.assign(1); + g_list[0].swap(img0); + CImg(g_list[0].width(),g_list[0].height(),g_list[0].depth(),g_list[0].spectrum(),(T)0). + move_to(g_list); + if (is_valid_argument) for (const char *s = argument; *s; ++s) g_list.FFT(*s,inv_fft); + else g_list.FFT(inv_fft); + g_list[0].swap(img0); + g_list[1].move_to(images,uind0 + 1); + name.get_copymark().move_to(images_names,uind0 + 1); + name.move_to(images_names[uind0]); + } } } - } else { if (divide3d) arg_error("div3d"); else arg_error("mul3d"); } - is_released = false; ++position; continue; - } + g_list.assign(); + is_change = true; continue; + } + + // Rescale a 3D object (* or /). + const bool divide3d = !std::strcmp("div3d",command); + if (!std::strcmp("mul3d",command) || divide3d) { + gmic_substitute_args(false); + float sx = 0, sy = 1, sz = 1; + if ((cimg_sscanf(argument,"%f%c", + &sx,&end)==1 && ((sz=sy=sx),1)) || + cimg_sscanf(argument,"%f,%f%c", + &sx,&sy,&end)==2 || + cimg_sscanf(argument,"%f,%f,%f%c", + &sx,&sy,&sz,&end)==3) { + if (divide3d) + print(images,0,"Scale 3D object%s with factors (1/%g,1/%g,1/%g).", + gmic_selection.data(), + sx,sy,sz); + else + print(images,0,"Scale 3D object%s with factors (%g,%g,%g).", + gmic_selection.data(), + sx,sy,sz); + cimg_forY(selection,l) { + const unsigned int uind = selection[l]; + CImg& img = images[uind]; + try { + if (divide3d) { gmic_apply(scale_CImg3d(1/sx,1/sy,1/sz)); } + else gmic_apply(scale_CImg3d(sx,sy,sz)); + } catch (CImgException&) { + if (!img.is_CImg3d(true,&(*gmic_use_message=0))) + error(true,images,0,0, + "Command '%s3d': Invalid 3D object [%d], in selected image%s (%s).", + divide3d?"div":"mul",uind,gmic_selection_err.data(),message); + else throw; + } + } + } else { if (divide3d) arg_error("div3d"); else arg_error("mul3d"); } + is_change = true; ++position; continue; + } + } // if (is_builtin_command) // Execute custom command. - if (!is_input_command && is_command) { - if (hash_custom==~0U) { // A --builtin_command not supporting double hyphen (e.g. --v) + if (!is_command_input && is_command) { + if (hash_custom==~0U) { // A --built-in_command not supporting double hyphen (e.g. --v) hash_custom = hashcode(command,false); is_command = search_sorted(command,commands_names[hash_custom], commands_names[hash_custom].size(),ind_custom); @@ -12885,7 +13449,7 @@ } else std::strcpy(command_code_text.data(),command_code); for (char *ptrs = command_code_text, *ptrd = ptrs; *ptrs || (bool)(*ptrd=0); ++ptrs) - if (*ptrs==1) while (*ptrs!=' ') ++ptrs; else *(ptrd++) = *ptrs; + if (*ptrs==1) do ++ptrs; while (*ptrs!=' '); else *(ptrd++) = *ptrs; debug(images,"Found custom command '%s: %s' (%s).", command,command_code_text.data(), commands_has_arguments[hash_custom](ind_custom,0)?"takes arguments": @@ -12945,7 +13509,7 @@ } else { // '$' expression found CImg substr(324); inbraces.assign(1,1,1,1,0); - int ind = 0, ind1 = 0, l_inbraces = 0; + int iind = 0, iind1 = 0, l_inbraces = 0; bool is_braces = false; sep = 0; @@ -12962,7 +13526,7 @@ is_braces = true; } - // Substitute $# -> maximum indice of known arguments. + // Substitute $# -> maximum index of known arguments. if (nsource[1]=='#') { nsource+=2; cimg_snprintf(substr,substr.width(),"%u",nb_arguments); @@ -13001,7 +13565,7 @@ // Substitute $= -> transfer (quoted) arguments to named variables. } else if (nsource[1]=='=' && - cimg_sscanf(nsource + 2,"%255[a-zA-Z0-9_]",title)==1 && + cimg_sscanf(nsource + 2,"%255[a-zA-Z0-9_]",gmic_use_title)==1 && (*title<'0' || *title>'9')) { nsource+=2 + std::strlen(title); for (unsigned int i = 0; i<=nb_arguments; ++i) { @@ -13016,74 +13580,74 @@ has_arguments = true; // Substitute $i and ${i} -> value of the i^th argument. - } else if ((cimg_sscanf(nsource,"$%d",&ind)==1 || - (cimg_sscanf(nsource,"${%d%c",&ind,&sep)==2 && sep=='}'))) { - const int nind = ind + (ind<0?(int)nb_arguments + 1:0); - if ((nind<=0 && ind) || nind>=arguments.width() || !arguments[nind]) { - error(images,0,command, + } else if ((cimg_sscanf(nsource,"$%d",&iind)==1 || + (cimg_sscanf(nsource,"${%d%c",&iind,&sep)==2 && sep=='}'))) { + const int niind = iind + (iind<0?(int)nb_arguments + 1:0); + if ((niind<=0 && iind) || niind>=arguments.width() || !arguments[niind]) { + error(true,images,0,command, "Command '%s': Undefined argument '$%d', in expression '$%s%d%s' " "(for %u argument%s specified).", - command,ind,sep=='}'?"{":"",ind,sep=='}'?"}":"", + command,iind,sep=='}'?"{":"",iind,sep=='}'?"}":"", nb_arguments,nb_arguments!=1?"s":""); } - nsource+=cimg_snprintf(substr,substr.width(),"$%d",ind) + (sep=='}'?2:0); - if (arguments[nind].width()>1) - CImg(arguments[nind].data(),arguments[nind].width() - 1,1,1,1,true). + nsource+=cimg_snprintf(substr,substr.width(),"$%d",iind) + (sep=='}'?2:0); + if (arguments[niind].width()>1) + CImg(arguments[niind].data(),arguments[niind].width() - 1,1,1,1,true). append_string_to(substituted_command,ptr_sub); - if (nind!=0) has_arguments = true; + if (niind!=0) has_arguments = true; // Substitute ${i=$j} -> value of the i^th argument, or the default value, // i.e. the value of another argument. - } else if (cimg_sscanf(nsource,"${%d=$%d%c",&ind,&ind1,&sep)==3 && sep=='}' && - ind>0) { - const int nind1 = ind1 + (ind1<0?(int)nb_arguments + 1:0); - if (nind1<=0 || nind1>=arguments.width() || !arguments[nind1]) - error(images,0,command, + } else if (cimg_sscanf(nsource,"${%d=$%d%c",&iind,&iind1,&sep)==3 && sep=='}' && + iind>0) { + const int niind1 = iind1 + (iind1<0?(int)nb_arguments + 1:0); + if (niind1<=0 || niind1>=arguments.width() || !arguments[niind1]) + error(true,images,0,command, "Command '%s': Undefined argument '$%d', in expression '${%d=$%d}' " "(for %u argument%s specified).", - command,ind1,ind,ind1, + command,iind1,iind,iind1, nb_arguments,nb_arguments!=1?"s":""); - nsource+=cimg_snprintf(substr,substr.width(),"${%d=$%d}",ind,ind1); - if (ind>=arguments.width()) arguments.insert(2 + 2*ind - arguments.size()); - if (!arguments[ind]) { - arguments[ind] = arguments[nind1]; - if (ind>(int)nb_arguments) nb_arguments = (unsigned int)ind; + nsource+=cimg_snprintf(substr,substr.width(),"${%d=$%d}",iind,iind1); + if (iind>=arguments.width()) arguments.insert(2 + 2*iind - arguments.size()); + if (!arguments[iind]) { + arguments[iind] = arguments[niind1]; + if (iind>(int)nb_arguments) nb_arguments = (unsigned int)iind; } - if (arguments[ind].width()>1) - CImg(arguments[ind].data(),arguments[ind].width() - 1,1,1,1,true). + if (arguments[iind].width()>1) + CImg(arguments[iind].data(),arguments[iind].width() - 1,1,1,1,true). append_string_to(substituted_command,ptr_sub); has_arguments = true; // Substitute ${i=$#} -> value of the i^th argument, or the default value, - // i.e. the maximum indice of known arguments. - } else if (cimg_sscanf(nsource,"${%d=$#%c",&ind,&sep)==2 && sep=='}' && - ind>0) { - if (ind>=arguments.width()) arguments.insert(2 + 2*ind - arguments.size()); - if (!arguments[ind]) { + // i.e. the maximum index of known arguments. + } else if (cimg_sscanf(nsource,"${%d=$#%c",&iind,&sep)==2 && sep=='}' && + iind>0) { + if (iind>=arguments.width()) arguments.insert(2 + 2*iind - arguments.size()); + if (!arguments[iind]) { cimg_snprintf(substr,substr.width(),"%u",nb_arguments); - CImg::string(substr).move_to(arguments[ind]); - if (ind>(int)nb_arguments) nb_arguments = (unsigned int)ind; + CImg::string(substr).move_to(arguments[iind]); + if (iind>(int)nb_arguments) nb_arguments = (unsigned int)iind; } - nsource+=cimg_snprintf(substr,substr.width(),"${%d=$#}",ind); - if (arguments[ind].width()>1) - CImg(arguments[ind].data(),arguments[ind].width() - 1,1,1,1,true). + nsource+=cimg_snprintf(substr,substr.width(),"${%d=$#}",iind); + if (arguments[iind].width()>1) + CImg(arguments[iind].data(),arguments[iind].width() - 1,1,1,1,true). append_string_to(substituted_command,ptr_sub); has_arguments = true; // Substitute ${i=default} -> value of the i^th argument, // or the specified default value. - } else if (cimg_sscanf(inbraces,"%d%c",&ind,&sep)==2 && sep=='=' && - ind>0) { + } else if (cimg_sscanf(inbraces,"%d%c",&iind,&sep)==2 && sep=='=' && + iind>0) { nsource+=l_inbraces + 3; - if (ind>=arguments.width()) arguments.insert(2 + 2*ind - arguments.size()); - if (!arguments[ind]) { + if (iind>=arguments.width()) arguments.insert(2 + 2*iind - arguments.size()); + if (!arguments[iind]) { CImg::string(inbraces.data() + - cimg_snprintf(substr,substr.width(),"%d=",ind)). - move_to(arguments[ind]); - if (ind>(int)nb_arguments) nb_arguments = (unsigned int)ind; + cimg_snprintf(substr,substr.width(),"%d=",iind)). + move_to(arguments[iind]); + if (iind>(int)nb_arguments) nb_arguments = (unsigned int)iind; } - if (arguments[ind].width()>1) - CImg(arguments[ind].data(),arguments[ind].width() - 1,1,1,1,true). + if (arguments[iind].width()>1) + CImg(arguments[iind].data(),arguments[iind].width() - 1,1,1,1,true). append_string_to(substituted_command,ptr_sub); has_arguments = true; @@ -13101,18 +13665,19 @@ nc=='_'))) { CImg inds; - CImg _status; - const int _verbosity = verbosity; - const bool _is_debug = is_debug; - verbosity = -16384; is_debug = false; - status.move_to(_status); // Save status because 'selection2cimg' can change it + status.move_to(o_status); // Save status because 'selection2cimg' can change it + const int o_verbosity = verbosity; + const bool o_is_debug = is_debug; + verbosity = 0; + is_debug = false; try { inds = selection2cimg(inbraces,nb_arguments + 1, CImgList::empty(),"",false); is_valid_subset = true; } catch (...) { inds.assign(); is_valid_subset = false; } - _status.move_to(status); - verbosity = _verbosity; is_debug = _is_debug; + is_debug = o_is_debug; + verbosity = o_verbosity; + o_status.move_to(status); if (is_valid_subset) { nsource+=l_inbraces + 3; @@ -13121,7 +13686,7 @@ const unsigned int uind = inds[j]; if (uind) has_arguments = true; if (!arguments[uind]) - error(images,0,command, + error(true,images,0,command, "Command '%s': Undefined argument '$%d', " "in expression '${%s}'.", command,uind,inbraces.data()); @@ -13146,8 +13711,7 @@ if (is_escaped) is_escaped = false; else if (c=='\\') is_escaped = true; else if (c=='\"') is_dquoted = !is_dquoted; - if (!is_dquoted) *s = c<' '?(c==gmic_dollar?'$':c==gmic_lbrace?'{':c==gmic_rbrace?'}': - c==gmic_comma?',':c==gmic_dquote?'\"':c):c; + else if (!is_dquoted) _strreplace_fw(*s); } if (is_debug) { @@ -13160,7 +13724,7 @@ } else std::strcpy(command_code_text.data(),substituted_command.data()); for (char *ptrs = command_code_text, *ptrd = ptrs; *ptrs || (bool)(*ptrd=0); ++ptrs) - if (*ptrs==1) while (*ptrs!=' ') ++ptrs; else *(ptrd++) = *ptrs; + if (*ptrs==1) do ++ptrs; while (*ptrs!=' '); else *(ptrd++) = *ptrs; debug(images,"Expand command line for command '%s' to: '%s'.", command,command_code_text.data()); } @@ -13184,14 +13748,18 @@ g_list[l] = images[uind]; g_list_c[l] = images_names[uind]; } + try { is_debug_info = false; + --verbosity; _run(ncommands_line,nposition,g_list,g_list_c,images,images_names,nvariables_sizes,&_is_noarg, argument,&selection); + ++verbosity; } catch (gmic_exception &e) { - cimg::swap(exception._command_help,e._command_help); + cimg::swap(exception._command,e._command); cimg::swap(exception._message,e._message); } + g_list.move_to(images,~0U); cimglist_for(g_list_c,l) g_list_c[l].copymark(); g_list_c.move_to(images_names,~0U); @@ -13201,7 +13769,7 @@ const unsigned int uind = selection[l]; if ((images[uind].width() || images[uind].height()) && !images[uind].spectrum()) { selection2string(selection,images_names,1,name); - error(images,0,0, + error(true,images,0,0, "Command '%s': Invalid selection%s " "(image [%u] is already used in another thread).", command,name.data() + (*name=='s'?1:0),uind); @@ -13220,12 +13788,15 @@ try { is_debug_info = false; + --verbosity; _run(ncommands_line,nposition,g_list,g_list_c,images,images_names,nvariables_sizes,&_is_noarg, argument,&selection); + ++verbosity; } catch (gmic_exception &e) { - cimg::swap(exception._command_help,e._command_help); + cimg::swap(exception._command,e._command); cimg::swap(exception._message,e._message); } + if (run_entrypoint) { --verbosity; run_entrypoint = false; } const unsigned int nb = std::min((unsigned int)selection.height(),g_list.size()); if (nb>0) { @@ -13265,7 +13836,7 @@ } // if (is_command) { // Variable assignment. - if (!is_input_command && (*item=='_' || (*item>='a' && *item<='z') || (*item>='A' && *item<='Z'))) { + if (!is_command_input && (*item=='_' || (*item>='a' && *item<='z') || (*item>='A' && *item<='Z'))) { const char *const s_op_right = std::strchr(item,'='); if (s_op_right) { const char *s_op_left = s_op_right; @@ -13284,7 +13855,7 @@ bool is_valid_name = true, is_multiarg = false; const char *s = std::strchr(item,','); if (!s || s>s_op_right) { // Single variable assignment - is_valid_name = cimg_sscanf(item,"%255[a-zA-Z0-9_]",title)==1 && (*title<'0' || *title>'9'); + is_valid_name = cimg_sscanf(item,"%255[a-zA-Z0-9_]",gmic_use_title)==1 && (*title<'0' || *title>'9'); is_valid_name&=(item + std::strlen(title)==s_op_left); } else { // Multi-variable assignment @@ -13295,7 +13866,7 @@ if (!ns || ns>=s_op_left) ns = s_op_left; CImg(s,(unsigned int)(ns - s + 1)).move_to(name); name.back() = 0; - if (cimg_sscanf(name,"%255[a-zA-Z0-9_]%c",title,&sep)==1 && (*title<'0' || *title>'9')) + if (cimg_sscanf(name,"%255[a-zA-Z0-9_]%c",gmic_use_title,&sep)==1 && (*title<'0' || *title>'9')) name.move_to(varnames); else { is_valid_name = false; break; } s = ns + 1; @@ -13332,17 +13903,18 @@ CImg::string(new_value).move_to(name); cimg::strellipsize(name,80,true); cimg::strellipsize(varnames[l],80,true); + gmic_use_message; switch (sep0) { case '=' : - cimg_snprintf(message,message.width(),"'%s=%s', ", + cimg_snprintf(message,_message.width(),"'%s=%s', ", varnames[l].data(),varvalues[is_multiarg?l:0].data()); break; case '<' : case '>' : - cimg_snprintf(message,message.width(),"'%s%c%c=%s'->'%s', ", + cimg_snprintf(message,_message.width(),"'%s%c%c=%s'->'%s', ", varnames[l].data(),sep0,sep0,varvalues[is_multiarg?l:0].data(),name.data()); break; default : - cimg_snprintf(message,message.width(),"'%s%c=%s'->'%s', ", + cimg_snprintf(message,_message.width(),"'%s%c=%s'->'%s', ", varnames[l].data(),sep0,varvalues[is_multiarg?l:0].data(),name.data()); } CImg::string(message,false).move_to(varnames[l]); @@ -13385,20 +13957,19 @@ } // Input. - if (is_input_command) ++position; + if (is_command_input) ++position; else { std::strcpy(command,"input"); - argument = item - (is_double_hyphen?2:is_simple_hyphen || is_plus?1:0); + argument = item - (is_simple_hyphen || is_plus?1:0); *s_selection = 0; } gmic_substitute_args(true); if (!is_selection || !selection) selection.assign(1,1,1,1,images.size()); CImg indicesy(256), indicesz(256), indicesc(256); - float dx = 0, dy = 1, dz = 1, dc = 1, nb = 1; + float dx = 0, dy = 1, dz = 1, dc = 1; + int nb = 1; CImg indx, indy, indz, indc; - CImgList input_images_names; - CImgList input_images; sepx = sepy = sepz = sepc = *indices = *indicesy = *indicesz = *indicesc = *argx = *argy = *argz = *argc = 0; CImg arg_input(argument,(unsigned int)std::strlen(argument) + 1); @@ -13407,25 +13978,165 @@ CImg _gmic_selection; if (is_verbose) selection2string(selection,images_names,0,_gmic_selection); + char *last_x = std::strrchr(arg_input,'x'); + if (last_x && cimg_sscanf(last_x + 1,"%d%c",&nb,&end)==1 && nb>0) *last_x = 0; else { last_x = 0; nb = 1; } + unsigned int larg = 0; + if (*arg_input=='0' && !arg_input[1]) { - // Empty image. - print(images,0,"Input empty image at position%s", - _gmic_selection.data()); - input_images.assign(1); - CImg::string("[empty]").move_to(input_images_names); + // Empty image(s). + if (nb==1) + print(images,0,"Input empty image at position%s", + _gmic_selection.data()); + else + print(images,0,"Input %u empty images at position%s", + nb,_gmic_selection.data()); + g_list.assign(nb); + CImg::string("[empty]").move_to(g_list_c); + if (--nb) g_list_c.insert(nb,g_list_c[0]); + } else if (*arg_input=='(' && arg_input[(larg = (unsigned int)std::strlen(arg_input)) - 1]==')') { + CImg img; + char delimiter = 0; + if (arg_input[1]=='\'' && + ((larg>3 && arg_input[larg - 2]=='\'') || + (larg>5 && arg_input[larg - 3]==':' && arg_input[larg - 4]=='\'' && + ((delimiter = arg_input[larg-2])==',' || delimiter==';' || delimiter=='/' || delimiter=='^' || + delimiter=='x' || delimiter=='y' || delimiter=='z' || delimiter=='c')))) { + + // String encoded as an image. + CImg str(arg_input.data() + 2,larg - (delimiter?5:3)); + str.back() = 0; + cimg::strunescape(str); + img.assign((unsigned char*)str.data(),(unsigned int)std::strlen(str)); + if (delimiter && delimiter!=',' && delimiter!='x') + img.unroll(delimiter==';' || delimiter=='y'?'y': + delimiter=='/' || delimiter=='z'?'z':'c'); + } else { - } else if ((cimg_sscanf(arg_input,"[%255[a-zA-Z_0-9%.eE%^,:+-]%c%c",indices,&sep,&end)==2 && - sep==']') || - cimg_sscanf(arg_input,"[%255[a-zA-Z_0-9%.eE%^,:+-]]x%f%c",indices,&nb,&end)==2) { + // New IxJxKxL image specified as array. + CImg au(256,1,1,1,false); + au[(int)'0'] = au[(int)'1'] = au[(int)'2'] = au[(int)'3'] = au[(int)'4'] = au[(int)'5'] = au[(int)'6'] = + au[(int)'7'] = au[(int)'8'] = au[(int)'9'] = au[(int)'.'] = au[(int)'e'] = au[(int)'E'] = au[(int)'i'] = + au[(int)'n'] = au[(int)'f'] = au[(int)'a'] = au[(int)'+'] = au[(int)'-'] = true; + unsigned int l, cx = 0, cy = 0, cz = 0, cc = 0, maxcx = 0, maxcy = 0, maxcz = 0; + const char *nargument = 0; + CImg s_value(256); + char separator = 0, unroll_axis = 0; + + for (nargument = arg_input.data() + 1; *nargument; ) { + *s_value = separator = 0; + char *pd = s_value; + // Do something faster than 'scanf("%255[0-9.eEinfa+-]")'. + for (l = 0; l<255 && au((unsigned int)*nargument); ++l) *(pd++) = *(nargument++); + if (l<255) *pd = 0; else arg_error("input"); + if (*nargument) separator = *(nargument++); + if ((separator=='^' || separator=='/' || separator==';' || separator==',' || + separator==')' || separator==':') && + cimg_sscanf(s_value,"%lf%c",&value,&end)==1) { + if (cx>maxcx) maxcx = cx; + if (cy>maxcy) maxcy = cy; + if (cz>maxcz) maxcz = cz; + if (cx>=img._width || cy>=img._height || cz>=img._depth || cc>=img._spectrum) + img.resize(cx>=img._width?7*cx/4 + 1:std::max(1U,img._width), + cy>=img._height?4*cy/4 + 1:std::max(1U,img._height), + cz>=img._depth?7*cz/4 + 1:std::max(1U,img._depth), + cc>=img._spectrum?7*cc/4 + 1:std::max(1U,img._spectrum),0); + img(cx,cy,cz,cc) = (T)value; + switch (separator) { + case '^' : cx = cy = cz = 0; ++cc; break; + case '/' : cx = cy = 0; ++cz; break; + case ';' : cx = 0; ++cy; break; + case ',' : ++cx; break; + case ':' : { + const char c = *nargument; + if ((c=='x' || c=='y' || c=='z' || c=='c' || c==',' || c==';' || c=='/' || c=='^') && + nargument[1]==')' && !nargument[2]) { unroll_axis = c; nargument+=2; } + else arg_error("input"); + } break; + case ')' : break; + default : arg_error("input"); + } + } else arg_error("input"); + } + img.resize(maxcx + 1,maxcy + 1,maxcz + 1,cc + 1,0); + if (unroll_axis) img.unroll(unroll_axis=='x' || unroll_axis==','?'x': + unroll_axis=='y' || unroll_axis==';'?'y': + unroll_axis=='z' || unroll_axis=='/'?'z':'v'); + print(images,0,"Input image at position%s, with values %s", + _gmic_selection.data(), + gmic_argument_text_printed()); + } + img.move_to(g_list); + arg_input.move_to(g_list_c); + if (--nb) { g_list.insert(nb,g_list[0]); g_list_c.insert(nb,g_list_c[0]); } + + } else if (*arg_input==gmic_store && + cimg_sscanf(arg_input.data() + 1,"*store/%255[a-zA-Z0-9_]%c",&(*gmic_use_argx=0),&end)==1 && + (*argx<'0' || *argx>'9')) { + if (last_x) *last_x = 'x'; // Restore full input argument + + // Binary-stored variable. + print(images,0, + "Input image from variable '%s', at position%s", + argx,_gmic_selection.data()); + hash = hashcode(argx,true); - // Nb copies of existing images. - nb = cimg::round(nb); + const bool + is_global = *argx=='_', + is_thread_global = is_global && argx[1]=='_'; + const int lind = is_global?0:(int)variables_sizes[hash]; + int vind = 0; + if (is_thread_global) cimg::mutex(30); + const CImgList + &__variables = *variables[hash], + &__variables_names = *variables_names[hash]; + bool is_name_found = false; + for (int l = __variables.width() - 1; l>=lind; --l) + if (!std::strcmp(__variables_names[l],argx)) { + is_name_found = true; vind = l; break; + } + if (is_name_found) { + try { + const char *const zero = (char*)std::memchr(__variables[vind],0,__variables[vind].width()); + if (!zero) throw CImgArgumentException(0); + CImgList::get_unserialize(__variables[vind].get_shared_points(zero + 1 - __variables[vind].data(), + __variables[vind].width() - 1)). + move_to(g_list); + } catch (CImgArgumentException&) { + error(true,images,0,0, + "Command 'input': Variable '%s' has not been assigned with command 'store'.", + argx); + } + if (g_list.width()==1 && !g_list_c) // Empty list + g_list.assign(); + else { // Non-empty list + g_list_c.assign(); + const CImg &arg = g_list.back(); + const unsigned int pend = (unsigned int)arg.size(); + for (unsigned int p = 4; p(arg.data(p),1,++np - p,1,1,true).move_to(g_list_c); + p = np; + } + cimglist_for(g_list_c,q) g_list_c[q].unroll('x'); + if (g_list_c.size()!=g_list.size() - 1) + error(true,images,0,0, + "Command 'input': Invalid binary encoding of variable '%s' " \ + "(%d items, %d names)", + argx,(int)g_list.size() - 1,(int)g_list_c.size()); + g_list.remove(); + } + } else error(true,images,0,0, + "Command 'input': Variable '%s' has not been assigned.", + argx); + } else if (cimg_sscanf(arg_input,"[%255[a-zA-Z_0-9%.eE%^,:+-]%c%c",gmic_use_indices,&sep,&end)==2 && sep==']') { + + // Nb copies of existing image(s). const CImg inds = selection2cimg(indices,images.size(),images_names,"input"); CImg s_tmp; if (is_verbose) selection2string(inds,images_names,1,s_tmp); - if (nb<=0) arg_error("input"); if (nb!=1) print(images,0,"Input %u copies of image%s at position%s", (unsigned int)nb, @@ -13436,24 +14147,25 @@ s_tmp.data(), _gmic_selection.data()); for (unsigned int i = 0; i<(unsigned int)nb; ++i) cimg_foroff(inds,l) { - input_images.insert(gmic_check(images[inds[l]])); - input_images_names.insert(images_names[inds[l]].get_copymark()); + g_list.insert(gmic_check(images[inds[l]])); + g_list_c.insert(images_names[inds[l]].get_copymark()); } + } else if ((sep=0,true) && (cimg_sscanf(arg_input,"%255[][a-zA-Z0-9_.eE%+-]%c", - argx,&end)==1 || + gmic_use_argx,&end)==1 || cimg_sscanf(arg_input,"%255[][a-zA-Z0-9_.eE%+-],%255[][a-zA-Z0-9_.eE%+-]%c", - argx,argy,&end)==2 || + argx,gmic_use_argy,&end)==2 || cimg_sscanf(arg_input,"%255[][a-zA-Z0-9_.eE%+-],%255[][a-zA-Z0-9_.eE%+-]," "%255[][a-zA-Z0-9_.eE%+-]%c", - argx,argy,argz,&end)==3 || + argx,argy,gmic_use_argz,&end)==3 || cimg_sscanf(arg_input,"%255[][a-zA-Z0-9_.eE%+-],%255[][a-zA-Z0-9_.eE%+-]," "%255[][a-zA-Z0-9_.eE%+-],%255[][a-zA-Z0-9_.eE%+-]%c", - argx,argy,argz,argc,&end)==4 || + argx,argy,argz,gmic_use_argc,&end)==4 || cimg_sscanf(arg_input,"%255[][a-zA-Z0-9_.eE%+-],%255[][a-zA-Z0-9_.eE%+-]," "%255[][a-zA-Z0-9_.eE%+-],%255[][a-zA-Z0-9_.eE%+-],%c", argx,argy,argz,argc,&sep)==5) && - ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",indices,&sepx,&end)==2 && + ((cimg_sscanf(argx,"[%255[a-zA-Z0-9_.%+-]%c%c",gmic_use_indices,&sepx,&end)==2 && sepx==']' && (indx=selection2cimg(indices,images.size(),images_names,"input")).height()==1) || (cimg_sscanf(argx,"%f%c",&dx,&end)==1 && dx>=1) || @@ -13507,65 +14219,25 @@ std::memcpy(s_values_text.data() + 32,"(...)",5); std::memcpy(s_values_text.data() + 37,s_values.data() + l - 34,35); // Last '\0' is included } else std::strcpy(s_values_text,s_values); - print(images,0,"Input image at position%s, with values '%s'", - _gmic_selection.data(),s_values_text.data()); + + if (nb==1) + print(images,0,"Input image at position%s, with values '%s'", + _gmic_selection.data(),s_values_text.data()); + else + print(images,0,"Input %u images at position%s, with values '%s'", + nb,_gmic_selection.data(),s_values_text.data()); } else print(images,0,"Input black image at position%s", _gmic_selection.data()); CImg new_image(idx,idy,idz,idc); if (s_values) { new_image.fill(s_values.data(),true,true,&images,&images); + gmic_use_title; cimg_snprintf(title,_title.width(),"[image of '%s']",s_values.data()); - CImg::string(title).move_to(input_images_names); - } else { new_image.fill((T)0); CImg::string("[unnamed]").move_to(input_images_names); } - new_image.move_to(input_images); - - } else if (*arg_input=='(' && arg_input[std::strlen(arg_input) - 1]==')') { - - // New IxJxKxL image specified as array. - CImg au(256,1,1,1,false); - au['0'] = au['1'] = au['2'] = au['3'] = au['4'] = au['5'] = au['6'] = au['7'] = au['8'] = au['9'] = - au['.'] = au['e'] = au['E'] = au['i'] = au['n'] = au['f'] = au['a'] = au['+'] = au['-'] = true; - unsigned int l, cx = 0, cy = 0, cz = 0, cc = 0, maxcx = 0, maxcy = 0, maxcz = 0; - const char *nargument = 0; - CImg s_value(256); - char separator = 0; - CImg img; - - for (nargument = arg_input.data() + 1; *nargument; ) { - *s_value = separator = 0; - char *pd = s_value; - // Do something faster than 'scanf("%255[0-9.eEinfa+-]")'. - for (l = 0; l<255 && au((unsigned int)*nargument); ++l) *(pd++) = *(nargument++); - if (l<255) *pd = 0; else arg_error("input"); - if (*nargument) separator = *(nargument++); - if ((separator=='^' || separator=='/' || separator==';' || separator==',' || separator==')') && - cimg_sscanf(s_value,"%lf%c",&value,&end)==1) { - if (cx>maxcx) maxcx = cx; - if (cy>maxcy) maxcy = cy; - if (cz>maxcz) maxcz = cz; - if (cx>=img._width || cy>=img._height || cz>=img._depth || cc>=img._spectrum) - img.resize(cx>=img._width?7*cx/4 + 1:std::max(1U,img._width), - cy>=img._height?4*cy/4 + 1:std::max(1U,img._height), - cz>=img._depth?7*cz/4 + 1:std::max(1U,img._depth), - cc>=img._spectrum?7*cc/4 + 1:std::max(1U,img._spectrum),0); - img(cx,cy,cz,cc) = (T)value; - switch (separator) { - case '^' : cx = cy = cz = 0; ++cc; break; - case '/' : cx = cy = 0; ++cz; break; - case ';' : cx = 0; ++cy; break; - case ',' : ++cx; break; - case ')' : break; - default : arg_error("input"); - } - } else arg_error("input"); - } - img.resize(maxcx + 1,maxcy + 1,maxcz + 1,cc + 1,0); - print(images,0,"Input image at position%s, with values %s", - _gmic_selection.data(), - gmic_argument_text_printed()); - img.move_to(input_images); - arg_input.move_to(input_images_names); + CImg::string(title).move_to(g_list_c); + } else { new_image.fill((T)0); CImg::string("[unnamed]").move_to(g_list_c); } + new_image.move_to(g_list); + if (--nb) { g_list.insert(nb,g_list[0]); g_list_c.insert(nb,g_list_c[0]); } } else { @@ -13593,12 +14265,12 @@ if (!cimg::strncasecmp(_filename,"http://",7) || !cimg::strncasecmp(_filename,"https://",8)) { try { - cimg::load_network(_filename,filename_tmp); + cimg::load_network(_filename,filename_tmp,network_timeout); } catch (CImgIOException&) { print(images,0,"Input file '%s' at position%s", _filename0, _gmic_selection.data()); - error(images,0,0, + error(true,images,0,0, "Unreachable network file '%s'.", gmic_argument_text()); } @@ -13638,38 +14310,40 @@ *const filename = *filename_tmp?filename_tmp:_filename, *const ext = cimg::split_filename(filename); const bool is_stdin = *filename=='-' && (!filename[1] || filename[1]=='.'); + CImg uext = CImg::string(ext); + cimg::lowercase(uext); const char *file_type = 0; std::FILE *const file = is_stdin?0:cimg::std_fopen(filename,"rb"); - longT siz = 0; + longT _siz = 0; if (file) { std::fseek(file,0,SEEK_END); - siz = std::ftell(file); + _siz = std::ftell(file); std::rewind(file); - file_type = *ext?0:cimg::ftype(file,0); + file_type = *uext?0:cimg::ftype(file,0); cimg::fclose(file); } - if (!is_stdin && file && siz==0) { // Empty file -> Insert an empty image - input_images_names.insert(__filename0); - input_images.insert(1); - } else if (!cimg::strcasecmp("off",ext) || (file_type && !std::strcmp(file_type,"off"))) { + if (!is_stdin && file && _siz==0) { // Empty file -> Insert an empty image + g_list_c.insert(__filename0); + g_list.insert(1); + } else if (!std::strcmp("off",uext) || (file_type && !std::strcmp(file_type,"off"))) { // 3D object .off file. print(images,0,"Input 3D object '%s' at position%s", _filename0,_gmic_selection.data()); if (*options) - error(images,0,0, + error(true,images,0,0, "Command 'input': File '%s', format does not take any input options (options '%s' specified).", _filename0,options.data()); CImg::get_load_off(primitives,g_list_f,filename).move_to(vertices); const CImg opacities(1,primitives.size(),1,1,1); - vertices.object3dtoCImg3d(primitives,g_list_f,opacities,false).move_to(input_images); + vertices.object3dtoCImg3d(primitives,g_list_f,opacities,false).move_to(g_list); primitives.assign(); g_list_f.assign(); - input_images_names.insert(__filename0); - } else if (!cimg::strcasecmp(ext,"cimg") && *options) { + g_list_c.insert(__filename0); + } else if (!std::strcmp(uext,"cimg") && *options) { // Part of a .cimg file (non-compressed). float @@ -13702,122 +14376,126 @@ print(images,0,"Input crop [%d] -> [%d] of file '%s' at position%s", (int)n0,(int)n1, _filename0,_gmic_selection.data()); - input_images.load_cimg(filename, - (unsigned int)n0,(unsigned int)n1, - 0U,0U,0U,0U,~0U,~0U,~0U,~0U); + g_list.load_cimg(filename, + (unsigned int)n0,(unsigned int)n1, + 0U,0U,0U,0U,~0U,~0U,~0U,~0U); } else { print(images,0,"Input crop [%d](%d) -> [%d](%d) of file '%s' at position%s", (int)n0,(int)x0,(int)n1,(int)x1, _filename0,_gmic_selection.data()); - input_images.load_cimg(filename, - (unsigned int)n0,(unsigned int)n1, - (unsigned int)x0,0U,0U,0U, - (unsigned int)x1,~0U,~0U,~0U); + g_list.load_cimg(filename, + (unsigned int)n0,(unsigned int)n1, + (unsigned int)x0,0U,0U,0U, + (unsigned int)x1,~0U,~0U,~0U); } } else { print(images,0,"Input crop [%d](%d,%d) -> [%d](%d,%d) of file '%s' at position%s", (int)n0,(int)n1,(int)x0,(int)y0,(int)x1,(int)y1, _filename0,_gmic_selection.data()); - input_images.load_cimg(filename, - (unsigned int)n0,(unsigned int)n1, - (unsigned int)x0,(unsigned int)y0,0U,0U, - (unsigned int)x1,(unsigned int)y1,~0U,~0U); + g_list.load_cimg(filename, + (unsigned int)n0,(unsigned int)n1, + (unsigned int)x0,(unsigned int)y0,0U,0U, + (unsigned int)x1,(unsigned int)y1,~0U,~0U); } } else { print(images,0,"Input crop [%d](%d,%d,%d) -> [%d](%d,%d,%d) of file '%s' " "at position%s", (int)n0,(int)n1,(int)x0,(int)y0,(int)z0,(int)x1,(int)y1,(int)z1, _filename0,_gmic_selection.data()); - input_images.load_cimg(filename, - (unsigned int)n0,(unsigned int)n1, - (unsigned int)x0,(unsigned int)y0,(unsigned int)z0,0U, - (unsigned int)x1,(unsigned int)y1,(unsigned int)z1,~0U); + g_list.load_cimg(filename, + (unsigned int)n0,(unsigned int)n1, + (unsigned int)x0,(unsigned int)y0,(unsigned int)z0,0U, + (unsigned int)x1,(unsigned int)y1,(unsigned int)z1,~0U); } } else { - print(images,0,"Input crop [%d](%d,%d,%d,%d) -> [%d](%d,%d,%d,%d) of file '%s' " - "at position%s", - (int)n0,(int)n1, - (int)x0,(int)y0,(int)z0,(int)c0, - (int)x1,(int)y1,(int)z1,(int)c1, - _filename0,_gmic_selection.data()); - input_images.load_cimg(filename, - (unsigned int)n0,(unsigned int)n1, - (unsigned int)x0,(unsigned int)y0, - (unsigned int)z0,(unsigned int)c0, - (unsigned int)x1,(unsigned int)y1, - (unsigned int)z1,(unsigned int)c1); + print(images,0,"Input crop [%d](%d,%d,%d,%d) -> [%d](%d,%d,%d,%d) of file '%s' " + "at position%s", + (int)n0,(int)n1, + (int)x0,(int)y0,(int)z0,(int)c0, + (int)x1,(int)y1,(int)z1,(int)c1, + _filename0,_gmic_selection.data()); + g_list.load_cimg(filename, + (unsigned int)n0,(unsigned int)n1, + (unsigned int)x0,(unsigned int)y0, + (unsigned int)z0,(unsigned int)c0, + (unsigned int)x1,(unsigned int)y1, + (unsigned int)z1,(unsigned int)c1); } - if (input_images) { - input_images_names.insert(__filename0); - if (input_images.size()>1) - input_images_names.insert(input_images.size() - 1,__filename0.copymark()); + if (g_list) { + g_list_c.insert(__filename0); + if (g_list.size()>1) + g_list_c.insert(g_list.size() - 1,__filename0.copymark()); } } else - error(images,0,0, + error(true,images,0,0, "Command 'input': .cimg file '%s', invalid file options '%s'.", _filename0,options.data()); - } else if (!cimg::strcasecmp(ext,"gmz")) { + } else if (!std::strcmp(uext,"gmz")) { print(images,0,"Input file '%s' at position%s", _filename0, _gmic_selection.data()); - input_images.load_cimg(filename); + g_list.load_cimg(filename); bool is_gmz = false; - const CImg back = input_images?CImg(input_images.back()):CImg::empty(); + const CImg back = g_list?CImg(g_list.back()):CImg::empty(); if (back.width()==1 && back.depth()==1 && back.spectrum()==1 && back[0]=='G' && back[1]=='M' && back[2]=='Z' && !back[3]) { - input_images_names = back.get_split(CImg::vector(0),0,false); - if (input_images_names) { + g_list_c.assign(); + const unsigned int pend = (unsigned int)back.size(); + for (unsigned int p = 4; p(back.data(p),1,++np - p,1,1,true).move_to(g_list_c); + p = np; + } + if (g_list_c) { is_gmz = true; - input_images_names.remove(0); - cimglist_for(input_images_names,l) - input_images_names[l].resize(1,input_images_names[l].height() + 1,1,1,0). - unroll('x'); - input_images.remove(); + cimglist_for(g_list_c,l) g_list_c[l].unroll('x'); + g_list.remove(); } } if (!is_gmz) - error(images,0,0,"Command 'input': File '%s' is not in .gmz format (magic number not found).", + error(true,images,0,0,"Command 'input': File '%s' is not in .gmz format (magic number not found).", _filename0); - if (input_images.size()!=input_images_names.size()) - error(images,0,0,"Command 'input': File '%s' is not in .gmz format " + if (g_list.size()!=g_list_c.size()) + error(true,images,0,0,"Command 'input': File '%s' is not in .gmz format " "(numbers of images and names do not match).", _filename0); - } else if (!cimg::strcasecmp(ext,"cimg") || !cimg::strcasecmp(ext,"cimgz")) { + } else if (!std::strcmp(uext,"cimg") || !std::strcmp(uext,"cimgz")) { print(images,0,"Input file '%s' at position%s", _filename0, _gmic_selection.data()); - input_images.load_cimg(filename); - if (input_images) { - input_images_names.insert(__filename0); - if (input_images.size()>1) - input_images_names.insert(input_images.size() - 1,__filename0.copymark()); - } - - } else if (!cimg::strcasecmp(ext,"avi") || - !cimg::strcasecmp(ext,"mov") || - !cimg::strcasecmp(ext,"asf") || - !cimg::strcasecmp(ext,"divx") || - !cimg::strcasecmp(ext,"flv") || - !cimg::strcasecmp(ext,"mpg") || - !cimg::strcasecmp(ext,"m1v") || - !cimg::strcasecmp(ext,"m2v") || - !cimg::strcasecmp(ext,"m4v") || - !cimg::strcasecmp(ext,"mjp") || - !cimg::strcasecmp(ext,"mp4") || - !cimg::strcasecmp(ext,"mkv") || - !cimg::strcasecmp(ext,"mpe") || - !cimg::strcasecmp(ext,"movie") || - !cimg::strcasecmp(ext,"ogm") || - !cimg::strcasecmp(ext,"ogg") || - !cimg::strcasecmp(ext,"qt") || - !cimg::strcasecmp(ext,"rm") || - !cimg::strcasecmp(ext,"vob") || - !cimg::strcasecmp(ext,"wmv") || - !cimg::strcasecmp(ext,"xvid") || - !cimg::strcasecmp(ext,"mpeg")) { + g_list.load_cimg(filename); + if (g_list) { + g_list_c.insert(__filename0); + if (g_list.size()>1) + g_list_c.insert(g_list.size() - 1,__filename0.copymark()); + } + + } else if (!std::strcmp(uext,"avi") || + !std::strcmp(uext,"mov") || + !std::strcmp(uext,"asf") || + !std::strcmp(uext,"divx") || + !std::strcmp(uext,"flv") || + !std::strcmp(uext,"mpg") || + !std::strcmp(uext,"m1v") || + !std::strcmp(uext,"m2v") || + !std::strcmp(uext,"m4v") || + !std::strcmp(uext,"mjp") || + !std::strcmp(uext,"mp4") || + !std::strcmp(uext,"mkv") || + !std::strcmp(uext,"mpe") || + !std::strcmp(uext,"movie") || + !std::strcmp(uext,"ogm") || + !std::strcmp(uext,"ogg") || + !std::strcmp(uext,"qt") || + !std::strcmp(uext,"rm") || + !std::strcmp(uext,"vob") || + !std::strcmp(uext,"wmv") || + !std::strcmp(uext,"xvid") || + !std::strcmp(uext,"mpeg")) { // Image sequence file. float first_frame = 0, last_frame = -1, step = 1; @@ -13841,7 +14519,7 @@ _filename0, _gmic_selection.data()); - input_images.load_video(filename,_first_frame,_last_frame,(unsigned int)step); + g_list.load_video(filename,_first_frame,_last_frame,(unsigned int)step); } else if (cimg_sscanf(options,"%f%c",&first_frame,&end)==1 && first_frame>=0) { // Read a single frame. @@ -13849,26 +14527,26 @@ print(images,0,"Input frame %u of file '%s' at position%s", _first_frame,_filename0, _gmic_selection.data()); - input_images.load_video(filename,_first_frame,_first_frame); + g_list.load_video(filename,_first_frame,_first_frame); } else if (!*options) { // Read all frames. print(images,0,"Input all frames of file '%s' at position%s", _filename0, _gmic_selection.data()); - input_images.load_video(filename); + g_list.load_video(filename); } else - error(images,0,0, + error(true,images,0,0, "Command 'input': video file '%s', invalid file options '%s'.", _filename0,options.data()); - if (input_images) { - input_images_names.insert(__filename0); - if (input_images.size()>1) - input_images_names.insert(input_images.size() - 1,__filename0.copymark()); + if (g_list) { + g_list_c.insert(__filename0); + if (g_list.size()>1) + g_list_c.insert(g_list.size() - 1,__filename0.copymark()); } - } else if (!cimg::strcasecmp("raw",ext)) { + } else if (!std::strcmp(uext,"raw")) { // Raw file. - float dx = 0, dy = 1, dz = 1, dc = 1; + dx = 0; dy = dz = dc = 1; uint64T offset = 0; *argx = 0; if (!*options || @@ -13877,7 +14555,7 @@ cimg_sscanf(options,"%f,%f,%f%c",&dx,&dy,&dz,&end)==3 || cimg_sscanf(options,"%f,%f,%f,%f%c",&dx,&dy,&dz,&dc,&end)==4 || cimg_sscanf(options,"%f,%f,%f,%f," cimg_fuint64 "%c",&dx,&dy,&dz,&dc,&offset,&end)==5 || - cimg_sscanf(options,"%255[a-z64]%c",argx,&end)==1 || + cimg_sscanf(options,"%255[a-z64]%c",gmic_use_argx,&end)==1 || cimg_sscanf(options,"%255[a-z64],%f%c",argx,&dx,&end)==2 || cimg_sscanf(options,"%255[a-z64],%f,%f%c",argx,&dx,&dy,&end)==3 || cimg_sscanf(options,"%255[a-z64],%f,%f,%f%c",argx,&dx,&dy,&dz,&end)==4 || @@ -13890,7 +14568,7 @@ dz = cimg::round(dz); dc = cimg::round(dc); if (dx<0 || dy<=0 || dz<=0 || dc<=0) - error(images,0,0, + error(true,images,0,0, "Command 'input': raw file '%s', invalid specified " "dimensions %gx%gx%gx%g.", _filename0,dx,dy,dz,dc); @@ -13909,7 +14587,7 @@ CImg::get_load_raw(filename, \ (unsigned int)dx,(unsigned int)dy, \ (unsigned int)dz,(unsigned int)dc,false,false,\ - (cimg_ulong)offset).move_to(input_images); + (cimg_ulong)offset).move_to(g_list); gmic_load_raw(unsigned char,"uchar") else gmic_load_raw(unsigned char,"unsigned char") else gmic_load_raw(char,"char") @@ -13924,30 +14602,31 @@ else gmic_load_raw(int64T,"int64") else gmic_load_raw(float,"float") else gmic_load_raw(double,"double") - else error(images,0,0, + else error(true,images,0,0, "Command 'input': raw file '%s', " "invalid specified pixel type '%s'.\n", _filename0,stype); - input_images_names.insert(__filename0); + g_list_c.insert(__filename0); } else - error(images,0,0, + error(true,images,0,0, "Command 'input': raw file '%s', invalid file options '%s'.", _filename0,options.data()); - } else if (!cimg::strcasecmp("yuv",ext)) { + } else if (!std::strcmp(uext,"yuv")) { // YUV file. - float first_frame = 0, last_frame = 0, step = 1, dx = 0, dy = 1, ch = 444; + float first_frame = 0, last_frame = 0, step = 1, ch = 444; + dx = 0; dy = 1; if ((err = cimg_sscanf(options,"%f,%f,%f,%f,%f,%f", &dx,&dy,&ch,&first_frame,&last_frame,&step))>=1) { dx = cimg::round(dx); dy = cimg::round(dy); const unsigned int ich = (unsigned int)cimg::round(ch); if (dx<=0 || dy<=0) - error(images,0,0, + error(true,images,0,0, "Command 'input': YUV file '%s', specified dimensions (%g,%g) are invalid.", _filename0,dx,dy); if (ich!=420 && ich!=422 && ich!=444) - error(images,0,0, + error(true,images,0,0, "Command 'input': YUV file '%s', specified chroma subsampling '%g' is invalid.", _filename0,ch); first_frame = cimg::round(first_frame); @@ -13959,36 +14638,36 @@ ich/100,(ich/10)%10,ich%10, _filename0, _gmic_selection.data()); - input_images.load_yuv(filename,(unsigned int)dx,(unsigned int)dy,ich, - (unsigned int)first_frame,(unsigned int)last_frame, - (unsigned int)step); + g_list.load_yuv(filename,(unsigned int)dx,(unsigned int)dy,ich, + (unsigned int)first_frame,(unsigned int)last_frame, + (unsigned int)step); } else if (err==4) { // Load a single frame print(images,0,"Input frames %g of YUV-%u:%u:%u file '%s' at position%s", first_frame, ich/100,(ich/10)%10,ich%10, _filename0, _gmic_selection.data()); - input_images.load_yuv(filename,(unsigned int)dx,(unsigned int)dy,ich, - (unsigned int)first_frame,(unsigned int)first_frame); + g_list.load_yuv(filename,(unsigned int)dx,(unsigned int)dy,ich, + (unsigned int)first_frame,(unsigned int)first_frame); } else { // Load all frames print(images,0,"Input all frames of YUV-%u:%u:%u file '%s' at position%s", ich/100,(ich/10)%10,ich%10, _filename0, _gmic_selection.data()); - input_images.load_yuv(filename,(unsigned int)dx,(unsigned int)dy,(unsigned int)ch); + g_list.load_yuv(filename,(unsigned int)dx,(unsigned int)dy,(unsigned int)ch); } - if (input_images) { - input_images_names.insert(__filename0); - if (input_images.size()>1) - input_images_names.insert(input_images.size() - 1,__filename0.copymark()); + if (g_list) { + g_list_c.insert(__filename0); + if (g_list.size()>1) + g_list_c.insert(g_list.size() - 1,__filename0.copymark()); } } else - error(images,0,0, + error(true,images,0,0, "Command 'input': YUV file '%s', invalid or missing file options '%s'.", _filename0,options.data()); - } else if (!cimg::strcasecmp("tif",ext) || !cimg::strcasecmp("tiff",ext) || - (file_type && !std::strcmp(file_type,"tif"))) { + } else if (!std::strcmp(uext,"tif") || !std::strcmp(uext,"tiff") || + (file_type && !std::strcmp(file_type,"tif"))) { // TIFF file. float first_frame = 0, last_frame = 0, step = 1; @@ -14006,63 +14685,65 @@ first_frame,last_frame,step, _filename0, _gmic_selection.data()); - input_images.load_tiff(filename,(unsigned int)first_frame,(unsigned int)last_frame, - (unsigned int)step); + g_list.load_tiff(filename,(unsigned int)first_frame,(unsigned int)last_frame, + (unsigned int)step); } else if (err==1) { // Load a single frame print(images,0,"Input frames %g of TIFF file '%s' at position%s", first_frame, _filename0, _gmic_selection.data()); - input_images.load_tiff(filename,(unsigned int)first_frame,(unsigned int)first_frame); + g_list.load_tiff(filename,(unsigned int)first_frame,(unsigned int)first_frame); } } else { // Load all frames - if (*options) error(images,0,0, + if (*options) error(true,images,0,0, "Command 'input': TIFF file '%s', " "invalid file options '%s'.", _filename0,options.data()); print(images,0,"Input all frames of TIFF file '%s' at position%s", _filename0, _gmic_selection.data()); - input_images.load_tiff(filename); + g_list.load_tiff(filename); } - if (input_images) { - input_images_names.insert(__filename0); - if (input_images.size()>1) - input_images_names.insert(input_images.size() - 1,__filename0.copymark()); + if (g_list) { + g_list_c.insert(__filename0); + if (g_list.size()>1) + g_list_c.insert(g_list.size() - 1,__filename0.copymark()); } - } else if (!cimg::strcasecmp("gmic",ext)) { + } else if ((allow_entrypoint && !*uext) || !std::strcmp(uext,"gmic")) { // G'MIC command file. const bool add_debug_info = (*options!='0'); print(images,0,"Input custom command file '%s'%s", _filename0,!add_debug_info?" without debug info":""); unsigned int count_new = 0, count_replaced = 0; - std::FILE *const file = cimg::fopen(filename,"rb"); + std::FILE *const gfile = cimg::fopen(filename,"rb"); - bool is_command_error = false; - CImg _status; - status.move_to(_status); // Save status because 'add_commands' can change it - const int _verbosity = verbosity; - const bool _is_debug = is_debug; - verbosity = -1; is_debug = false; + bool is_entrypoint = false, is_add_error = false; + status.move_to(o_status); // Save status because 'add_commands' can change it, with error() + int o_verbosity = verbosity; + const bool o_is_debug = is_debug; + verbosity = 0; + is_debug = false; try { - add_commands(file,add_debug_info?filename:0,&count_new,&count_replaced); + add_commands(gfile,filename,&count_new,&count_replaced, + allow_entrypoint && callstack.size()==1 && !is_command_input?&is_entrypoint:0); } catch (...) { - is_command_error = true; + is_add_error = true; is_entrypoint = false; } - verbosity = _verbosity; is_debug = _is_debug; - _status.move_to(status); - if (is_command_error) { + is_debug = o_is_debug; + verbosity = o_verbosity; + o_status.move_to(status); + if (is_add_error) { if (is_network_file) - error(images,0,0, + error(true,images,0,0, "Command 'input': Unable to load custom command file '%s' from network.", _filename0); else - error(images,0,0, + error(true,images,0,0, "Command 'input': File '%s' is not recognized as a custom command file.", _filename0); } - cimg::fclose(file); + cimg::fclose(gfile); if (is_verbose) { unsigned int count_total = 0; for (unsigned int l = 0; l ncommands_line = commands_line_to_CImgList(formula); + unsigned int nposition = 0; + CImg::string("").move_to(callstack); // Anonymous scope + _run(ncommands_line,nposition,g_list,g_list_c,images,images_names,variables_sizes,0,0,0); + callstack.remove(); - try { - try { - input_images.load(filename); - } catch (CImgIOException&) { - if (is_network_file) - error(images,0,0, - "Command 'input': Unable to load image file '%s' from network.", - _filename0); - else throw; - } + } else { // Not found -> Try generic image loader + + print(images,0,"Input file '%s' at position%s", + _filename0, + _gmic_selection.data()); + if (*options) + error(true,images,0,0, + "Command 'input': File '%s', format does not take any input options (options '%s' specified).", + _filename0,options.data()); - // If .gmz file without extension, process images names anyway. - bool is_gmz = false; - const CImg back = input_images?CImg(input_images.back()):CImg::empty(); - if (back.width()==1 && back.depth()==1 && back.spectrum()==1 && - back[0]=='G' && back[1]=='M' && back[2]=='Z' && !back[3]) { - input_images_names = back.get_split(CImg::vector(0),0,false); - if (input_images_names) { - is_gmz = true; - input_images_names.remove(0); - cimglist_for(input_images_names,l) - input_images_names[l].resize(1,input_images_names[l].height() + 1,1,1,0). - unroll('x'); - input_images.remove(input_images.size() - 1); + try { + try { + g_list.load(filename); + } catch (CImgIOException&) { + if (is_network_file) + error(true,images,0,0, + "Command 'input': Unable to load image file '%s' from network.", + _filename0); + else throw; } - } - if (input_images && !is_gmz) { - input_images_names.insert(__filename0); - if (input_images.size()>1) { - input_images_names.insert(input_images.size() - 1,__filename0.copymark()); + // If .gmz file without extension, process images names anyway. + bool is_gmz = false; + const CImg back = g_list?CImg(g_list.back()):CImg::empty(); + if (back.width()==1 && back.depth()==1 && back.spectrum()==1 && + back[0]=='G' && back[1]=='M' && back[2]=='Z' && !back[3]) { + g_list_c.assign(); + const unsigned int pend = (unsigned int)back.size(); + for (unsigned int p = 4; p(back.data(p),1,++np - p,1,1,true).move_to(g_list_c); + p = np; + } + if (g_list_c) { + is_gmz = true; + cimglist_for(g_list_c,l) g_list_c[l].unroll('x'); + g_list.remove(); + } } - } - } catch (CImgException&) { - std::FILE *file = 0; - if (!(file=cimg::std_fopen(filename,"r"))) { - if (is_input_command) - error(images,0,0, - "Unknown filename '%s'.", - gmic_argument_text()); - else { - CImg::string(filename).move_to(name); - const unsigned int foff = (*name=='+' || *name=='-') + (*name=='-' && name[1]=='-'); - const char *misspelled = 0; - char *const posb = std::strchr(name,'['); - if (posb) *posb = 0; // Discard selection from the command name - int dmin = 4; - // Look for a builtin command - for (unsigned int l = 0; l1) { + g_list_c.insert(g_list.size() - 1,__filename0.copymark()); + } + } + } catch (CImgException&) { + std::FILE *efile = 0; + if (!(efile = cimg::std_fopen(filename,"r"))) { + if (is_command_input) + error(true,images,0,0, + "Unknown filename '%s'.", + gmic_argument_text()); + else { + CImg::string(filename).move_to(name); + const unsigned int foff = (*name=='+' || *name=='-') + (*name=='-' && name[1]=='-'); + const char *misspelled = 0; + char *const posb = std::strchr(name,'['); + if (posb) *posb = 0; // Discard selection from the command name + int dmin = 4; + // Look for a built-in command + for (unsigned int l = 0; l0 && is_change && !is_quit && !is_return && callstack.size()==1 && images) { if (!std::strcmp(set_variable("_host","",'.',0),"cli")) { -#if cimg_display!=0 - CImgList lselection, lselection3d; - bool is_first3d = false; - _display_windows[0].assign(); - cimglist_for(images,l) { - const bool is_3d = images[l].is_CImg3d(false); - if (!l) is_first3d = is_3d; - CImg::vector(l).move_to(is_3d?lselection3d:lselection); - } - if (is_first3d) { - display_objects3d(images,images_names,lselection3d>'y',CImg::empty(),false); - if (lselection) display_images(images,images_names,lselection>'y',0,false); + if (is_display_available) { + CImgList lselection, lselection3d; + bool is_first3d = false; + display_window(0).assign(); + cimglist_for(images,l) { + const bool is_3d = images[l].is_CImg3d(false); + if (!l) is_first3d = is_3d; + CImg::vector(l).move_to(is_3d?lselection3d:lselection); + } + + // Prepare for '_run()' used for 3D interactive viewer. + CImgList ncommands_line; + unsigned int nposition = 0; + if (lselection3d) { + gmic_use_formula; + cimg_snprintf(formula,_formula.width(),"d3d[%s]",(lselection3d>'y').value_string().data()); + commands_line_to_CImgList(formula).move_to(ncommands_line); + } + + if (is_first3d) { + CImg::string("").move_to(callstack); // Anonymous scope + _run(ncommands_line,nposition,images,images_names,images,images_names,variables_sizes,0,0,0); + callstack.remove(); + if (lselection) display_images(images,images_names,lselection>'y',0,false); + } else { + if (lselection) display_images(images,images_names,lselection>'y',0,false); + if (lselection3d) { + CImg::string("").move_to(callstack); // Anonymous scope + _run(ncommands_line,nposition,images,images_names,images,images_names,variables_sizes,0,0,0); + callstack.remove(); + } + } } else { - if (lselection) display_images(images,images_names,lselection>'y',0,false); - if (lselection3d) display_objects3d(images,images_names,lselection3d>'y',CImg::empty(),false); + CImg seq(1,images.width()); + cimg_forY(seq,y) seq[y] = y; + print_images(images,images_names,seq,true); } -#else - CImg seq(1,images.width()); - cimg_forY(seq,y) seq[y] = y; - print_images(images,images_names,seq,true); -#endif // #if cimg_display!=0 } - is_released = true; + is_change = false; } if (is_debug) debug(images,"%sExit scope '%s/'.%s\n", @@ -14295,7 +15000,7 @@ if (callstack.size()==1) { if (is_quit) { - if (verbosity>=0 || is_debug) { + if (verbosity>=1 || is_debug) { std::fputc('\n',cimg::output()); std::fflush(cimg::output()); } @@ -14304,16 +15009,32 @@ is_quit = true; } } + + verbosity = starting_verbosity; + + } catch (gmic_exception&) { + // Wait for remaining threads to finish. + cimglist_for(gmic_threads,k) wait_threads(&gmic_threads[k],true,(T)0); + throw; + } catch (CImgAbortException &) { // Special case of abort (abort from a CImg method) + // Wait for remaining threads to finish. + cimglist_for(gmic_threads,k) wait_threads(&gmic_threads[k],true,(T)0); + // Do the same as for a cancellation point. - const bool is_very_verbose = verbosity>0 || is_debug; + const bool is_very_verbose = verbosity>1 || is_debug; if (is_very_verbose) print(images,0,"Abort G'MIC interpreter (caught abort signal)."); dowhiles.assign(nb_dowhiles = 0); fordones.assign(nb_fordones = 0); repeatdones.assign(nb_repeatdones = 0); position = commands_line.size(); - is_released = is_quit = true; + is_change = false; + is_quit = true; + } catch (CImgException &e) { + // Wait for remaining threads to finish. + cimglist_for(gmic_threads,k) wait_threads(&gmic_threads[k],true,(T)0); + const char *const e_ptr = e.what() + (!std::strncmp(e.what(),"[gmic_math_parser] ",19)?19:0); CImg error_message(e_ptr,(unsigned int)std::strlen(e_ptr) + 1); @@ -14322,9 +15043,8 @@ if (!std::strncmp(error_message,s_fopen,l_fopen) && !std::strcmp(error_message.end() - 18,"' with mode 'rb'.")) { error_message[error_message.width() - 18] = 0; - error(images,0,0,"Unknown filename '%s'.",error_message.data(l_fopen)); + error(true,images,0,0,"Unknown filename '%s'.",error_message.data(l_fopen)); } - for (char *str = std::strstr(error_message,"CImg<"); str; str = std::strstr(str,"CImg<")) { str[0] = 'g'; str[1] = 'm'; str[2] = 'i'; str[3] = 'c'; } @@ -14340,10 +15060,9 @@ em = std::strstr(em,"(): "); if (em) em+=4; else em = error_message.data(); } - error(images,0,command,"Command '%s': %s",command,em); - } else error(images,0,0,"%s",error_message.data()); + error(true,images,0,command,"Command '%s': %s",command,em); + } else error(true,images,0,0,"%s",error_message.data()); } - if (!is_endlocal) debug_line = initial_debug_line; else { if (next_debug_line!=~0U) { debug_line = next_debug_line; next_debug_line = ~0U; } @@ -14353,14 +15072,14 @@ // Remove current run from managed list of gmic runs. cimg::mutex(24); for (int k = grl.width() - 1; k>=0; --k) { - CImg &gr = grl[k]; - if (gr[0]==(void*)this && - gr[1]==(void*)&images && - gr[2]==(void*)&images_names && - gr[3]==(void*)&parent_images && - gr[4]==(void*)&parent_images_names && - gr[5]==(void*)variables_sizes && - gr[6]==(void*)command_selection) { + CImg &_gr = grl[k]; + if (_gr[0]==(void*)this && + _gr[1]==(void*)&images && + _gr[2]==(void*)&images_names && + _gr[3]==(void*)&parent_images && + _gr[4]==(void*)&parent_images_names && + _gr[5]==(void*)variables_sizes && + _gr[6]==(void*)command_selection) { grl.remove(k); break; } } @@ -14368,33 +15087,34 @@ return *this; } -// Explicitly instantiate constructors and destructor when building the library. -#ifdef gmic_pixel_type -template gmic::gmic(const char *const commands_line, - gmic_list& images, gmic_list& images_names, - const char *const custom_commands, const bool include_stdlib, - float *const p_progress, bool *const p_is_abort); - -template gmic& gmic::run(const char *const commands_line, - gmic_list &images, gmic_list &images_names, - float *const p_progress, bool *const p_is_abort); +// Explicitly instantiate constructors and destructor when compiling the library. +#define export_gmic(pt) \ +template gmic::gmic(const char *const commands_line, const char *const custom_commands, \ + const bool include_stdlib, float *const p_progress, bool *const p_is_abort, \ + const pt& pixel_type); \ +template gmic::gmic(const char *const commands_line, \ + gmic_list& images, gmic_list& images_names, \ + const char *const custom_commands, const bool include_stdlib, \ + float *const p_progress, bool *const p_is_abort); \ +template gmic& gmic::run(const char *const commands_line, \ + float *const p_progress, bool *const p_is_abort,\ + const pt& pixel_type); \ +template gmic& gmic::run(const char *const commands_line, \ + gmic_list &images, gmic_list &images_names, \ + float *const p_progress, bool *const p_is_abort); \ +template CImg& CImg::assign(const unsigned int size_x, const unsigned int size_y=1, \ + const unsigned int size_z=1, const unsigned int size_c=1); \ +template CImgList& CImgList::assign(const unsigned int n) -template CImgList::~CImgList(); +#ifdef gmic_pixel_type +export_gmic(gmic_pixel_type); #endif - #ifdef gmic_pixel_type2 -template gmic::gmic(const char *const commands_line, - gmic_list& images, gmic_list& images_names, - const char *const custom_commands, const bool include_stdlib, - float *const p_progress, bool *const p_is_abort); - -template gmic& gmic::run(const char *const commands_line, - gmic_list &images, gmic_list &images_names, - float *const p_progress=0, bool *const p_is_abort=0); - -template CImgList::~CImgList(); +export_gmic(gmic_pixel_type2); #endif - template CImgList::~CImgList(); +template CImgList& CImgList::assign(const unsigned int n); +template bool gmic::search_sorted(const char *const str, const gmic_list& list, + const unsigned int length, unsigned int &out_ind); #endif // #ifdef cimg_plugin diff -Nru gmic-2.4.5/src/gmic.h gmic-2.9.2/src/gmic.h --- gmic-2.4.5/src/gmic.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/src/gmic.h 2020-09-03 11:37:05.000000000 +0000 @@ -9,7 +9,7 @@ # Note : Include this file in your C++ source code, if you # want to use the G'MIC interpreter in your own program. # - # Copyright : David Tschumperle + # Copyright : David Tschumperlé # ( https://tschumperle.users.greyc.fr/ ) # # Licenses : This file is 'dual-licensed', you have to choose one @@ -17,17 +17,17 @@ # # CeCILL-C # The CeCILL-C license is close to the GNU LGPL. - # ( http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html ) + # ( http://cecill.info/licences/Licence_CeCILL-C_V1-en.html ) # # or CeCILL v2.1 # The CeCILL license is compatible with the GNU GPL. - # ( http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html ) + # ( http://cecill.info/licences/Licence_CeCILL_V2.1-en.html ) # # This software is governed either by the CeCILL or the CeCILL-C license # under French law and abiding by the rules of distribution of free software. # You can use, modify and or redistribute the software under the terms of # the CeCILL or CeCILL-C licenses as circulated by CEA, CNRS and INRIA - # at the following URL: "http://www.cecill.info". + # at the following URL: "http://cecill.info". # # As a counterpart to the access to the source code and rights to copy, # modify and redistribute granted by the license, users are provided only @@ -52,7 +52,7 @@ */ #ifndef gmic_version -#define gmic_version 245 +#define gmic_version 292 #ifndef gmic_pixel_type #define gmic_pixel_type float @@ -78,19 +78,29 @@ unsigned int _height; // Number of image lines (dimension along the Y-axis) unsigned int _depth; // Number of image slices (dimension along the Z-axis) unsigned int _spectrum; // Number of image channels (dimension along the C-axis) - bool _is_shared; // Tells if the data buffer is shared by another structure + bool _is_shared; // Tells if the data buffer has been allocated by another object T *_data; // Pointer to the first pixel value // Destructor. - ~gmic_image(); + ~gmic_image() { + if (!_is_shared) delete[] _data; + } // Constructor. - gmic_image():_width(0),_height(0),_depth(0),_spectrum(0),_is_shared(false),_data(0) {} + gmic_image():_width(0),_height(0),_depth(0),_spectrum(0),_is_shared(false),_data(0) { } // Allocate memory for specified image dimensions. gmic_image& assign(const unsigned int size_x, const unsigned int size_y=1, const unsigned int size_z=1, const unsigned int size_c=1); + // Create image by copying existing buffer of t values. + template + gmic_image& assign(const t *const values, const unsigned int size_x, const unsigned int size_y=1, + const unsigned int size_z=1, const unsigned int size_c=1); + + gmic_image& assign(const T *const values, const unsigned int size_x, const unsigned int size_y, + const unsigned int size_z, const unsigned int size_c, const bool is_shared); + // Pixel access. operator T*() { return _data; @@ -107,6 +117,7 @@ const T& operator()(const unsigned int x, const unsigned int y=0, const unsigned z=0, const unsigned c=0) const { return _data[x + y*_width + z*_width*_height + c*_width*_height*_depth ]; } + }; // Class 'gmic_list'. @@ -116,7 +127,9 @@ gmic_image *_data; // Pointer to the first image of the list // Destructor. - ~gmic_list(); + ~gmic_list() { + delete[] _data; + } // Constructor. gmic_list():_width(0),_allocated_width(0),_data(0) {} @@ -133,11 +146,11 @@ return _data; } - T& operator()(const unsigned int l) { + gmic_image& operator()(const unsigned int l) { return _data[l]; } - const T& operator()(const unsigned int l) const { + const gmic_image& operator()(const unsigned int l) const { return _data[l]; } @@ -154,35 +167,59 @@ #ifndef cimg_verbosity #define cimg_verbosity 1 -#endif // #ifndef cimg_verbosity +#endif #ifdef _MSC_VER #pragma comment(linker,"/STACK:6291456") #pragma inline_depth(2) -#endif // #ifdef _MSC_VER +#endif #include #ifdef cimg_version #error "[gmic] *** Error *** File 'CImg.h' has been already included (should have been done first in file 'gmic.h')." #endif #define cimg_plugin "gmic.cpp" +#define cimglist_plugin "gmic.cpp" #ifdef cimg_use_abort inline bool *gmic_abort_ptr(bool *const p_is_abort); #define cimg_abort_init bool *const gmic_is_abort = ::gmic_abort_ptr(0) #define cimg_abort_test if (*gmic_is_abort) throw CImgAbortException() -#endif // #ifdef cimg_use_abort +#endif -inline double gmic_mp_ext(char *const str, void *const p_list); -#define cimg_mp_ext_function(str) return ::gmic_mp_ext(str._data,&mp.listout) +template +inline double gmic_mp_run(char *const str, + void *const p_list, const T& pixel_type); +#define cimg_mp_func_run(str) \ + return ::gmic_mp_run(str,&mp.listout,(T)0) + +template +inline double gmic_mp_store(const Ts *const ptr, + const unsigned int w, const unsigned int h, const unsigned int d, const unsigned int s, + const bool is_compressed, const char *const str, + void *const p_list, const T& pixel_type); +#define cimg_mp_func_store(ptr,w,h,d,s,is_compressed,str) \ + return ::gmic_mp_store(ptr,w,h,d,s,is_compressed,str,&mp.listout,(T)0) + +template +inline double gmic_mp_name(const unsigned int ind, Ts *const out_str, const unsigned int siz, + void *const p_list, const T& pixel_type); +#define cimg_mp_func_name(ind,out_str,siz) \ + return ::gmic_mp_name(ind,out_str,siz,&mp.listout,(T)0) + +template +inline double gmic_mp_setname(const unsigned int ind, const char *const str, + void *const p_list, const T& pixel_type); +#define cimg_mp_func_setname(ind,str) \ + return ::gmic_mp_setname(ind,str,&mp.listout,(T)0) #ifndef cimg_display #define cimg_display 0 -#endif // #ifndef cimg_display +#endif #ifndef cimg_appname #define cimg_appname "gmic" -#endif // #ifndef cimg_appname -#include "./CImg.h" +#endif +#include "CImg.h" #if cimg_OS==2 #include @@ -193,13 +230,28 @@ #include #include #include + #endif // #if cimg_OS==2 // Define some special character codes used for replacement in double quoted strings. -const char gmic_dollar = 23, gmic_lbrace = 24, gmic_rbrace = 25, gmic_comma = 26, gmic_dquote = 28, gmic_newline = 29; +const char gmic_dollar = 23, gmic_lbrace = 24, gmic_rbrace = 25, gmic_comma = 26, gmic_dquote = 28, + gmic_store = 29; // <- this one is only used in variable names. #endif // #ifndef gmic_build +// Define gmic_uint64 type. +#ifndef gmic_uint64 +#if cimg_OS==2 +#define gmic_uint64 __int64 +#else // #if cimg_OS==2 +#if UINTPTR_MAX==0xffffffff || defined(__arm__) || defined(_M_ARM) || ((ULONG_MAX)==(UINT_MAX)) +#define gmic_uint64 unsigned long long +#else +#define gmic_uint64 unsigned long +#endif // #if UINTPTR_MAX==0xffffffff || defined(__arm__) || defined(_M_ARM) || ((ULONG_MAX)==(UINT_MAX)) +#endif // #if cimg_OS==2 +#endif // #ifndef gmic_uint64 + // Define main libgmic class 'gmic'. //---------------------------------- #define gmic_image cimg_library::CImg @@ -214,10 +266,12 @@ // Constructors. gmic(); + template gmic(const char *const commands_line, const char *const custom_commands=0, const bool include_stdlib=true, - float *const p_progress=0, bool *const p_is_abort=0); + float *const p_progress=0, bool *const p_is_abort=0, + const T& pixel_type=(T)0); template gmic(const char *const commands_line, @@ -225,8 +279,10 @@ const bool include_stdlib=true, float *const p_progress=0, bool *const p_is_abort=0); // Run G'MIC pipeline on an already-constructed object. + template gmic& run(const char *const commands_line, - float *const p_progress=0, bool *const p_is_abort=0); + float *const p_progress=0, bool *const p_is_abort=0, + const T& pixel_type=(T)0); template gmic& run(const char *const commands_line, @@ -238,14 +294,27 @@ static const char* path_rc(const char *const custom_path=0); static bool init_rc(const char *const custom_path=0); - // Functions below should be considered as *private*, and should not be - // used in user's code. + // Functions below should be considered as *private*, and should not be used in user's code. template static bool search_sorted(const char *const str, const T& list, const unsigned int length, unsigned int &out_ind); + template + static double mp_run(char *const str, + void *const p_list, const T& pixel_type); + template + static double mp_store(const Ts *const ptr, + const unsigned int w, const unsigned int h, const unsigned int d, const unsigned int s, + const bool is_compressed, const char *const str, + void *const p_list, const T& pixel_type); + template + static double mp_name(const unsigned int ind, Ts *const out_str, const unsigned int siz, + void *const p_list, const T& pixel_type); + template + static double mp_setname(const unsigned int ind, const char *const str, + void *const p_list, const T& pixel_type); + static bool get_debug_info(const char *const s, unsigned int &line_number, unsigned int &file_number); static int _levenshtein(const char *const s, const char *const t, gmic_image& d, const int i, const int j); static int levenshtein(const char *const s, const char *const t); - static bool check_filename(const char *const filename); static unsigned int hashcode(const char *const str, const bool is_variable); static bool command_has_arguments(const char *const command); static const char* basename(const char *const str); @@ -253,7 +322,6 @@ static char *strreplace_bw(char *const str); static unsigned int strescape(const char *const str, char *const res); static const gmic_image& decompress_stdlib(); - static double mp_ext(char *const str, void *const p_list); static bool *abort_ptr(bool *const p_is_abort); template @@ -265,21 +333,25 @@ const char *set_variable(const char *const name, const char *const value, const char operation='=', const unsigned int *const variables_sizes=0); + const char *set_variable(const char *const name, const gmic_image& value, + const unsigned int *const variables_sizes=0); gmic& add_commands(const char *const data_commands, const char *const commands_file=0, - unsigned int *count_new=0, unsigned int *count_replaced=0); + unsigned int *count_new=0, unsigned int *count_replaced=0, + bool *const is_entrypoint=0); gmic& add_commands(std::FILE *const file, const char *const filename=0, - unsigned int *count_new=0, unsigned int *count_replaced=0); + unsigned int *count_new=0, unsigned int *count_replaced=0, + bool *const is_entrypoint=0); - gmic_image callstack2string(const bool is_debug=false) const; + gmic_image callstack2string(const bool _is_debug=false) const; gmic_image callstack2string(const gmic_image& callstack_selection, - const bool is_debug=false) const; + const bool _is_debug=false) const; gmic_image callstack2string(const gmic_image* callstack_selection, - const bool is_debug=false) const; + const bool _is_debug=false) const; gmic_image selection2cimg(const char *const string, const unsigned int indice_max, const gmic_list& names, const char *const command, - const bool is_selection=true, gmic_image *const new_name=0); + const bool is_selection=true); gmic_image& selection2string(const gmic_image& selection, const gmic_list& images_names, @@ -294,7 +366,7 @@ const gmic_list& images); gmic& print(const char *format, ...); - gmic& error(const char *format, ...); + gmic& error(const bool output_header, const char *format, ...); gmic& debug(const char *format, ...); template @@ -304,6 +376,10 @@ const unsigned int *const variables_sizes, const gmic_image *const command_selection, const bool is_image_expr); + + template + void wait_threads(void *const p_gmic_threads, const bool try_abort, const T& pixel_type); + template gmic& print(const gmic_list& list, const gmic_image *const callstack_selection, const char *format, ...); @@ -313,10 +389,14 @@ const bool force_visible, const char *format, ...); template - gmic& error(const gmic_list& list, const gmic_image *const callstack_selection, + gmic& error(const bool output_header, const gmic_list& list, + const gmic_image *const callstack_selection, const char *const command, const char *format, ...); template + bool check_cond(const char *const expr, gmic_list& images, const char *const command); + + template gmic& debug(const gmic_list& list, const char *format, ...); template @@ -374,19 +454,19 @@ static gmic_list list_p_is_abort; static bool is_display_available; - gmic_list *const commands, *const commands_names, *const commands_has_arguments, - *const _variables, *const _variables_names, **const variables, **const variables_names, + gmic_list *commands, *commands_names, *commands_has_arguments, + *_variables, *_variables_names, **variables, **variables_names, commands_files, callstack; gmic_image dowhiles, fordones, repeatdones; gmic_image light3d; + gmic_image display_windows; gmic_image status; - void *display_windows; float focale3d, light3d_x, light3d_y, light3d_z, specular_lightness3d, specular_shininess3d, _progress, *progress; - unsigned long reference_time; + gmic_uint64 reference_time; unsigned int nb_dowhiles, nb_fordones, nb_repeatdones, nb_carriages, debug_filename, debug_line, cimg_exception_mode; - int verbosity,render3d, renderd3d; - bool is_released, is_debug, is_running, is_start, is_return, is_quit, is_double3d, is_debug_info, check_elif, + int verbosity,render3d, renderd3d, network_timeout; + bool allow_entrypoint, is_change, is_debug, is_running, is_start, is_return, is_quit, is_double3d, is_debug_info, _is_abort, *is_abort, is_abort_thread; const char *starting_commands_line; }; @@ -394,15 +474,15 @@ // Class 'gmic_exception'. //------------------------ struct gmic_exception { - gmic_image _command_help, _message; + gmic_image _command, _message; // Constructors. gmic_exception() {} gmic_exception(const char *const command, const char *const message) { if (command) { - _command_help.assign((unsigned int)std::strlen(command) + 1,1,1,1); - std::strcpy(_command_help._data,command); + _command.assign((unsigned int)std::strlen(command) + 1,1,1,1); + std::strcpy(_command._data,command); } if (message) { _message.assign((unsigned int)std::strlen(message) + 1,1,1,1); @@ -415,12 +495,37 @@ return _message._data?_message._data:""; } - const char *command_help() const { - return _command_help._data?_command_help._data:""; + const char *command() const { + return _command._data?_command._data:""; } }; -inline double gmic_mp_ext(char *const str, void *const p_list) { return gmic::mp_ext(str,p_list); } +template +inline double gmic_mp_run(char *const str, + void *const p_list, const T& pixel_type) { + return gmic::mp_run(str,p_list,pixel_type); +} + +template +inline double gmic_mp_store(const Ts *const ptr, + const unsigned int w, const unsigned int h, const unsigned int d, const unsigned int s, + const bool is_compressed, const char *const str, + void *const p_list, const T& pixel_type) { + return gmic::mp_store(ptr,w,h,d,s,is_compressed,str,p_list,pixel_type); +} + +template +inline double gmic_mp_name(const unsigned int ind, Ts *const out_str, const unsigned int siz, + void *const p_list, const T& pixel_type) { + return gmic::mp_name(ind,out_str,siz,p_list,pixel_type); +} + +template +inline double gmic_mp_setname(const unsigned int ind, const char *const str, + void *const p_list, const T& pixel_type) { + return gmic::mp_setname(ind,str,p_list,pixel_type); +} + inline bool *gmic_abort_ptr(bool *const p_is_abort) { return gmic::abort_ptr(p_is_abort); } #endif // #ifndef gmic_version diff -Nru gmic-2.4.5/src/gmic_in_script.scm gmic-2.9.2/src/gmic_in_script.scm --- gmic-2.4.5/src/gmic_in_script.scm 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/src/gmic_in_script.scm 2020-09-03 11:37:06.000000000 +0000 @@ -5,17 +5,17 @@ ;; Description : Show how to call G'MIC commands from a GIMP script. ;; ( https://gmic.eu ) ;; -;; Copyright : David Tschumperle +;; Copyright : David Tschumperlé ;; ( https://tschumperle.users.greyc.fr/ ) ;; ;; License : CeCILL v2.0 -;; ( http://www.cecill.info/licences/Licence_CeCILL_V2-en.html ) +;; ( http://cecill.info/licences/Licence_CeCILL_V2-en.html ) ;; ;; This software is governed by the CeCILL license under French law and ;; abiding by the rules of distribution of free software. You can use, ;; modify and/ or redistribute the software under the terms of the CeCILL ;; license as circulated by CEA, CNRS and INRIA at the following URL -;; "http://www.cecill.info". +;; "http://cecill.info". ;; ;; As a counterpart to the access to the source code and rights to copy, ;; modify and redistribute granted by the license, users are provided only @@ -53,7 +53,6 @@ ;; Render a 3D mapped cube from the active layer, using G'MIC. (plug-in-gmic-qt 1 img drawable 1 0 (string-append - "v - " ; To have a silent output. Remove it to display errors from the G'MIC interpreter on stderr. "fx_imageobject3d 1,{w},{h},0.5," (number->string x) "," (number->string y) "," @@ -61,7 +60,7 @@ )) ;; Merge two layers together, using the G'MIC 'edges' mode (this layer mode does not exist by default in GIMP). - (plug-in-gmic-qt 1 img drawable 2 0 "v - blend_edges 1") + (plug-in-gmic-qt 1 img drawable 2 0 "blend_edges 1") ) diff -Nru gmic-2.4.5/src/gmic_libc.cpp gmic-2.9.2/src/gmic_libc.cpp --- gmic-2.4.5/src/gmic_libc.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/src/gmic_libc.cpp 2020-09-03 11:37:06.000000000 +0000 @@ -10,13 +10,13 @@ # ( https://plus.google.com/u/0/b/117441237982283011318/+TobiasFleischer ) # # License : CeCILL-B v1.0 - # ( http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html ) + # ( http://cecill.info/licences/Licence_CeCILL-B_V1-en.html ) # # This software is governed either by the CeCILL-B license # under French law and abiding by the rules of distribution of free software. # You can use, modify and or redistribute the software under the terms of # the CeCILL-B licenses as circulated by CEA, CNRS and INRIA - # at the following URL: "http://www.cecill.info". + # at the following URL: "http://cecill.info". # # As a counterpart to the access to the source code and rights to copy, # modify and redistribute granted by the license, users are provided only @@ -106,7 +106,7 @@ else gmic(_cmd, images, images_names); - } catch (gmic_exception &e) { // catch exception, if an error occured in the interpreter. + } catch (gmic_exception &e) { // catch exception, if an error occurred in the interpreter. std::string error_string = e.what(); std::fprintf(stderr, "\n- Error encountered when calling G'MIC : '%s'\n", e.what()); if (_options && _options->error_message_buffer) { @@ -136,12 +136,12 @@ if (_options && _options->output_format == E_FORMAT_BYTE) { gmic_image img_tmp; img_tmp = img; - _images[i].format = E_FORMAT_BYTE; + _images[i].format = E_FORMAT_BYTE; _images[i].data = img_tmp._data; img_tmp._is_shared = true; img._is_shared = false; } else { - _images[i].format = E_FORMAT_FLOAT; + _images[i].format = E_FORMAT_FLOAT; _images[i].data = img._data; img._is_shared = true; } diff -Nru gmic-2.4.5/src/gmic_libc.h gmic-2.9.2/src/gmic_libc.h --- gmic-2.4.5/src/gmic_libc.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/src/gmic_libc.h 2020-09-03 11:37:05.000000000 +0000 @@ -14,13 +14,13 @@ # ( https://plus.google.com/u/0/b/117441237982283011318/+TobiasFleischer ) # # License : CeCILL-B v1.0 - # ( http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html ) + # ( http://cecill.info/licences/Licence_CeCILL-B_V1-en.html ) # # This software is governed either by the CeCILL-B license # under French law and abiding by the rules of distribution of free software. # You can use, modify and or redistribute the software under the terms of # the CeCILL-B licenses as circulated by CEA, CNRS and INRIA - # at the following URL: "http://www.cecill.info". + # at the following URL: "http://cecill.info". # # As a counterpart to the access to the source code and rights to copy, # modify and redistribute granted by the license, users are provided only diff -Nru gmic-2.4.5/src/gmic_stdlib.gmic gmic-2.9.2/src/gmic_stdlib.gmic --- gmic-2.4.5/src/gmic_stdlib.gmic 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/src/gmic_stdlib.gmic 2020-09-03 11:37:06.000000000 +0000 @@ -6,7 +6,7 @@ # Description : GREYC's Magic for Image Computing - Standard library # ( https://gmic.eu ) # -# Copyright : David Tschumperle +# Copyright : David Tschumperlé # ( https://tschumperle.users.greyc.fr/ ) # # Licenses : This file is 'dual-licensed', you have to choose one @@ -14,17 +14,17 @@ # # CeCILL-C # The CeCILL-C license is close to the GNU LGPL. -# ( http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html ) +# ( http://cecill.info/licences/Licence_CeCILL-C_V1-en.html ) # # or CeCILL v2.1 # The CeCILL license is compatible with the GNU GPL. -# ( http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html ) +# ( http://cecill.info/licences/Licence_CeCILL_V2.1-en.html ) # # This software is governed either by the CeCILL or the CeCILL-C license # under French law and abiding by the rules of distribution of free software. # You can use, modify and or redistribute the software under the terms of # the CeCILL or CeCILL-C licenses as circulated by CEA, CNRS and INRIA -# at the following URL: "http://www.cecill.info". +# at the following URL: "http://cecill.info". # # As a counterpart to the access to the source code and rights to copy, # modify and redistribute granted by the license, users are provided only @@ -65,7 +65,7 @@ # starts a new command description. # _ '#@cli : description' add a new description line to the current command description. # -#*** Specific rules for the universal plug-in : +#*** Specific rules for the universal plug-in 'gmic-qt': # # - A comment line starting with '#@gui' will be parsed by the plug-in to define the filters tree. # - A comment line starting with '#@gui_xx' will define a filter only for a specific language 'xx' @@ -78,8 +78,9 @@ # # or # -# '#@gui Command name : command, preview_command, parameter = typedef, parameter2 = typedef' -# '#@gui : parameter3 = typedef, parameter4 = typedef ...., parameterN = typedef' +# '#@gui Command name : command, preview_command (zoom_factor)[+] [: default_input_mode] +# '#@gui : parameter1 = typedef(arguments1...), parameter2 = typedef(arguments2...)' +# '#@gui : parameter3 = typedef(arguments3...), # # where : # @@ -93,38 +94,76 @@ # You can also put an additional '+' sign after the parenthesis to specify the rendered preview # is still accurate for different zoom factors. # +# 'default_input_mode' set the default input mode for that filter. It can be +# { x=none | .=active (default) | *=all | +=active & below | -=active & above | v=all visible | i=all invisible } +# # 'parameter = typedef' tells about the names, types and default values of the filter parameters. # # 'typedef' can be : # -# _ 'bool(default_value={ 0 | 1 | false | true })' : Add a boolean parameter (0 or 1) (as a checkbutton). -# _ 'button(_alignment)' : Add a boolean parameter (0 or 1) (as a button). -# _ 'choice(_default_indice,Choice0,..,ChoiceN)' : Add a integer parameter (as a combobox). -# _ 'color(R,_G,_B,_A)' : Add R,G,B[,A] parameters (as a colorchooser). -# _ 'point(_X,_Y,_removable={ -1 | 0 | 1 },_burst={ 0 | 1 },_R,_G,_B,_[-]A,_radius%,_is_visible={ 0 | 1 })' : +# _ 'bool(default_value={ 0 | 1 | false | true })': +# Add a boolean parameter (0 or 1) (as a checkbutton). +# +# _ 'button(_alignment)': +# Add a boolean parameter (0 or 1) (as a button). +# +# _ 'choice(_default_index,Choice0,..,ChoiceN)': +# Add a integer parameter (as a combobox). +# +# _ 'color(R,_G,_B,_A)': +# Add R,G,B[,A] parameters (as a colorchooser). +# +# _ 'point(_X,_Y,_removable={ -1 | 0 | 1 },_burst={ 0 | 1 },_R,_G,_B,_[-]A,_radius[%])': # Add X,Y parameters (as a moveable point over the preview). -# _ 'value(value)' : Add a pre-defined value parameter (not displayed). -# _ 'file[_in,_out](_default_filename)' : Add a filename parameter (as a filechooser). -# _ 'float(default_value,min_value,max_value)' : Add a float-valued parameter (as a float slider). -# _ 'folder(_default_foldername)' : Add a foldername parameter (as a folderchooser). -# _ 'int(default_value,min_value,max_value)' : Add a integer parameter (as an integer slider). -# _ 'link(_alignment,_label,URL)' : Display a URL (do not add a parameter). -# _ 'note(_label)' : Display a label (do not add a parameter). -# _ 'text(_is_multiline={ 0 | 1 },_default text)' : Add a single or multi-line text parameter (as a text entry). -# _ 'separator()' : Display an horizontal separator (do not add a parameter). +# +# _ 'file[_in,_out](_default_filename)': +# Add a filename parameter (as a filechooser). +# +# _ 'float(default_value,min_value,max_value)': +# Add a float-valued parameter (as a float slider). +# +# _ 'folder(_default_foldername)': +# Add a foldername parameter (as a folderchooser). +# +# _ 'int(default_value,min_value,max_value)': +# Add a integer parameter (as an integer slider). +# +# _ 'link(_alignment,_label,URL)': +# Display a URL (do not add a parameter). +# +# _ 'note(_label)': +# Display a label (do not add a parameter). +# +# _ 'text(_is_multiline={ 0 | 1 },_default text)': +# Add a single or multi-line text parameter (as a text entry). +# +# _ 'separator()': +# Display an horizontal separator (do not add a parameter). +# +# _ 'value(value)': +# Add a pre-defined value parameter (not displayed). # # Type separators '()' can be replaced by '[]' or '{}' if necessary (for instance if parentheses are required in # an argument of the typedef, e.g in a text). You can also replace 'typedef' by '_typedef' to tell the plug-in not -# to update the image preview when the corresponding parameter is modified. +# being responsive, i.e not to update the image preview when the corresponding parameter is modified. +# After the closing separator, you may specify a 'visibility state' character for the parameter, which can be +# { _0=Hidden | _1=Grayed-out | _2=Visible (default) }, opt. followed by a propagation character that tells +# if this visibility state must be propagated to neighboring non-valued interface widgets +# (s.a. separator(), link() or note()). +# This propagation character can be: +# { '+'=propagate forward | '-'=propagate backward | '*'=propagate in both directions }. # # Use '_none_' as a special command or preview_command to tell the plug-in that the entry requires no G'MIC call. # -# A G'MIC command can return new values for each parameter of the filter, into the status (see command 'status'). -# To do so, the returned status must follow the syntax : {params1}{params2}{..}{paramsN} where N must be exactly -# equal to the number of parameters for the current filter. +# A G'MIC command can set new values for each filter parameter, through the status (see command 'status'). +# To do so, the returned status must follow the syntax : +# '{params1}{params2}{..}{paramsN}' where N must be exactly equal to the number of parameters +# for the current filter. Optionnally, you can append to each {param} its visibility state suffix ( e.g: {param}_1 ). +# +# A G'MIC command can also specify the output blending mode, the opacity and the position of each of the output image +# (i.e. layer in the plug-in). To do so, set the image name to something like: +# 'mode(grainmerge),opacity(50),pos(30,50),name(name)'. # -# A G'MIC command can also specify the blending mode, the opacity and the position of each of the output image -# (i.e. layer in the plug-in). To do so, set the image name to something like 'mode(grainmerge),opacity(50),pos(30,50),name(name)'. # - Blending mode name should be the same as the argument of the 'blend' command. # - Opacity is a float number in [0,100]. # - X and Y positions are integers. @@ -140,26 +179,29 @@ # This command is run when the cli tool 'gmic' is invoked without arguments on the command line. cli_noarg : - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r version - v + e[] "\n[gmic] No commands, options or data provided (type "${c}"'gmic help'"$n" to get help)." v - - if {{*,u}>0} - v + e[] "[gmic] "${c}"Running in demo mode."$n v - parallel 0,"demo ," e[] "" + v 0 use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r _cli_noarg=1 version + +e[] "\n[gmic] No commands, options or data provided." + if {*,u}>0 + +e[] "[gmic] (type "${c}"'gmic help'"$n" to get help, "${c}"'gmic demos'"$n" to launch demos)." else - v + e[] "\n" v - + +e[] "[gmic] (type "${c}"'gmic help'"$n" to get help)." fi file_update=${_path_rc}update$_version.gmic need_update={"Y = date(0); M = date(1); D = date(2); date_current = Y*365 + M*31 + D; - Y = date(0,"$file_update"); M = date(1,"$file_update"); D = date(2,"$file_update"); date_file = Y*365 + M*31 + D; + Y = date(0,'"{/$file_update}"'); M = date(1,'"{/$file_update}"'); + D = date(2,'"{/$file_update}"'); date_file = Y*365 + M*31 + D; date_current - date_file>=7"} if $need_update - v + e[] "[gmic] Update commands..." v - + +e[] "[gmic] Updating commands..." l[] update - v + e[] "\r[gmic] Update commands: "${g}"Succeeded!"$n v - + +e[] "\r[gmic] Updating commands: "${g}"Succeeded!"$n onfail - v + e[] "\r[gmic] Update commands: "${r}"Failed!"$n v - + +e[] "\r[gmic] Updating commands: "${r}"Failed!"$n endl fi + +e[] "\n" +# cli_start # This command is called each time the cli interface 'gmic' starts. # Overload it in your local user command file if necessary. cli_start : @@ -172,78 +214,91 @@ #@cli h : eq. to 'help'. h : - help $* + help $"*" #@cli help : command : (no arg) #@cli : Display help (optionally for specified command only) and exit. #@cli : (eq. to 'h'). help : skip ${1=""},${2=1} - if {!$!} return fi + if narg("$1")" && "isfile(['{/$_path_user}']) + l[] it[] $_path_user onfail endl + fi + if isfile(['{/$_path_rc/update$_version.gmic}']) + l[] cimgz:$_path_rc/update$_version.gmic + onfail l[] it[] $_path_rc/update$_version.gmic onfail endl + endl + fi + if narg("$1")" && "narg($_path_commands) l[] + $_path_commands repeat $! l[$>] it[] {n} k. onfail rm 0 endl done onfail + endl fi + if !$! return fi y a y +_help $1,$2 k[0] - if {narg(${})} _help[0] ${},0 fi # In case of shortcut, display also help for shortcut command. - rm + if narg(${}) _help[0] ${},0 fi # In case of shortcut, display also help for shortcut command. + +e[] "\n" rm q _help : skip ${1=""} - v -1 use_vt100 - if {!narg("$1")} _is_example=0 __help ascii v + e[] "" v - rm u "" return fi # Global help. + v 0 use_vt100 + if !narg("$1") _is_example=0 __help ascii rm u "" return fi # Global help. - ({'"$1"'}) autocrop. {'-'} - if {{@100%}==_']'" && "i!=_'['} l. s -,{'['} k[0] endl fi + ('"$1"') autocrop. {'-'} + if {@100%}==_']'" && "i!=_'[' l. s -,{'['} k[0] endl fi command={t} rm. # Help requested for a specific command. ks0="0" ks1="k[0]" - if $2 e[] "" __help_header_ascii[] fi + if $2 __help_header_ascii[] fi r 1,{h+1},1,1,0,0,0,1 s +,{'"#@cli "$command" :"'} s +,{'"#@cli "$command":"'} s +,{'"#@cli "$command"\n"'} - if {$!==1} + if $!==1 l[] m "foo : "$command # Detect command misspelling. - repeat 16 uncommand $command done # Be sure the specified command does not exist anymore ! - foo uncommand foo - onfail ({'${}'}) s -,{'" (did you mean "'} if {$!>1} s[1] -,39 k[1] misspelling={t} fi rm + repeat 16 um $command done # Be sure the specified command does not exist anymore ! + foo um foo + onfail ('${}') s -,{'"; did you mean "'} if $!>1 s[1] -,39 k[1] misspelling={t} fi rm endl - if {narg($misspelling)} misspelling=" (did you mean '"$misspelling"' ?)" fi - v + e[] "\n[gmic] Command '"$command"' has no description"$misspelling". Try 'gmic -h' for global help.\n\n" v - + if narg($misspelling) misspelling="; did you mean '"$_gmic_g$misspelling$_gmic_n"' ?)" fi + +e[] "\n[gmic] Command '"$_gmic_r$command$_gmic_n"' has no description"$misspelling". "\ + "Try '"${_gmic_c}"gmic -h"$_gmic_n"' for global help." rm u "" return fi - rm[0] a y s -,10 + rm[0] a y merge_multiline_comments s -,10 stopflag=0 _is_example=0 _document_gmic_header_ascii[] 0 - repeat $! l[$>] if {h>6" && "same([{^}],'#@cli',5)} - rows 6,100% autocrop {'" "'} # Discard '#@cli'. - if {i!=_':'} # Command declaration. + repeat $! l[$>] if h>6" && "same([{^}],'#@cli',5) + rows 6,100% autocrop {'" "'} # Discard '#@cli'. + if i!=_':' # Command declaration. s -,{'": "'} autocrop {'" "'} autocrop {':'} autocrop {'" "'} - if {['{0,t}']==['$command']} + if ['{0,t}']==['$command'] _document_gmic_declaration_ascii - if $_shortcut # Found shortcut command. - v + e[] "\n "$_gmic_m${_gmic_b}$command":"$_gmic_n" Shortcut for command '"$_gmic_m$_gmic_b$_shortcutlink0$_gmic_n"'." v - + if $_shortcut # Found shortcut command. + +e[] "\n "$_gmic_m${_gmic_b}$command":"$_gmic_n" Shortcut for command '"\ + $_gmic_m$_gmic_b$_shortcutlink0$_gmic_n"'." u $_shortcutlink0 return fi else stopflag=1 fi else rows 1,100% # Discard ':' char. - if {i==_':'} stopflag=1 # Subsection + if i==_':' stopflag=1 # Subsection else _is_tutorial= autocrop {'" "'} - if {i==_'$'} # Example of use. + if i==_'$' # Example of use. rows 1,100% autocrop {'" "'} # Discard '$' character. - if {i==_'$'} # Tutorial page. - v + e[] "" v - - if {h==1" && "i==_'$'} tuturl=https://gmic.eu/tutorial/_$command.shtml + if i==_'$' # Tutorial page. + +e[] "" + if h==1" && "i==_'$' tuturl=https://gmic.eu/tutorial/_$command.shtml else autocrop {'$'} autocrop {'" "'} tuturl=https://gmic.eu/tutorial/{0,t}.shtml fi - rm ({'$_gmic_n${_gmic_b}"Tutorial:"$_gmic_n$_gmic_r" "$tuturl'}) y + rm ('$_gmic_n${_gmic_b}"Tutorial:"$_gmic_n$_gmic_r" "$tuturl') y _is_tutorial=1 else # Regular example. - if $_is_example i[0] ({'"\n "'}) - else i[0] ({'"\n "$_gmic_n${_gmic_b}"Example: "$_gmic_n'}) _nb_example=0 + if $_is_example i[0] ('"\n "') + else i[0] ('"\n "$_gmic_n${_gmic_b}"Example: "$_gmic_n') _nb_example=0 fi _is_example=1 _nb_example+=1 - i[1] ({'$_gmic_n[#$_nb_example]" "$_gmic_g'}) + i[1] ('$_gmic_n[#$_nb_example]" "$_gmic_g') y a y fi fi @@ -251,8 +306,7 @@ fi fi else stopflag=1 fi ${ks{$!!=0}} endl if $stopflag break fi done - v + e[] $_gmic_n"\n" v - rm - u "" + rm u "" # Display global help. __help : @@ -268,7 +322,7 @@ # Command to write general usage (used by all types of output). _help_usage : m "GMIC : u ${_gmic_g}G\47MIC$_gmic_n" - g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r + g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r m=$_gmic_m _help_paragraph " "${c}${b}"gmic [command1 [arg1_1,arg1_2,..]] .. [commandN [argN_1,argN_2,..]]"$n" \n @@ -281,19 +335,21 @@ \n As a starting point, you may want to visit our detailed tutorial pages, at: \n "${r}"https://gmic.eu/tutorial/"$n - _help_section "Overall context" + _help_section "Overall Context" _help_paragraph " - At any time, "${-GMIC}" manages one list of numbered (and optionally named) pixel-based images, \n entirely stored in computer memory (uncompressed). \n -\n - The first image of the list has indice '"${g}"0"$n"' and is denoted by '"${c}"[0]"$n"'. The second image of the +\n - The first image of the list has index '"${g}"0"$n"' and is denoted by '"${c}"[0]"$n"'. The second image of the \n list is denoted by '"${c}"[1]"$n"', the third by '"${c}"[2]"$n"' and so on. \n \n - Negative indices are treated in a periodic way: '"${c}"[-1]"$n"' refers to the last image of the list, -\n '"${c}"[-2]"$n"' to the penultimate one, etc. Thus, if the list has 4 images, '"${c}"[1]"$n"' and '"${c}"[-3]"$n"' both +\n '"${c}"[-2]"$n"' to the penultimate one, etc. Thus, if the list has 4 images, '"${c}"[1]"$n"' and '"\ +${c}"[-3]"$n"' both \n designate the second image of the list. \n -\n - A named image may be also indicated by '"${c}"[name]"$n"', if '"${g}"name"$n"' uses the character set "${g}"[a-zA-Z0-9_]"$n" +\n - A named image may be also indicated by '"${c}"[name]"$n"', if '"${g}"name"$n"' uses the character set "\ +${g}"[a-zA-Z0-9_]"$n" \n and does not start with a number. Image names can be set or reassigned at any moment during \n the processing pipeline (see command '"${c}"name"$n"' for this purpose). \n @@ -302,10 +358,10 @@ \n You can insert or remove images in the list, rearrange image order, process images \n (individually or grouped), merge image data together, display and output image files, etc. \n -\n - Such a pipeline can be then added as a new custom "${-GMIC}" command (stored in a user -\n command file), so it can be re-used afterwards in a larger pipeline if necessary." +\n - Such a pipeline can define a new custom "${-GMIC}" command (stored in a user command +\n file), and re-used afterwards as a regular command, in a larger pipeline if necessary." - _help_section "Image definition and terminology" + _help_section "Image Definition and Terminology" _help_paragraph " - In "${-GMIC}", each image is modeled as a 1D, 2D, 3D or 4D array of scalar values, uniformly \n discretized on a rectangular/parallelepipedic domain. @@ -317,7 +373,8 @@ \n . '"${g}"depth"$n"', the number of image slices (size along the "${g}"'z'-axis"$n"). \n (the depth is equal to "${g}"1"$n" for usual color or grayscale 2D images). \n . '"${g}"spectrum"$n"', the number of image channels (size along the "${g}"'c'-axis"$n"). -\n (the spectrum is respectively equal to "${g}"3"$n" and "${g}"4"$n" for usual "${g}"RGB"$n" and "${g}"RGBA"$n" color images). +\n (the spectrum is respectively equal to "${g}"3"$n" and "${g}"4"$n" for usual "${g}"RGB"$n" and "\ +${g}"RGBA"$n" color images). \n \n - There are no hard limitations on the size of the image along each dimension. For instance, \n the number of image slices or channels can be of arbitrary size within the limits of @@ -336,11 +393,12 @@ \n \n - Considering '"${g}"float"$n"'-valued pixels ensure to keep the numerical precision when executing \n image processing pipelines. For image input/output operations, you may want to prescribe the -\n image datatype to be different than '"${g}"float"$n"' (like '"${g}"bool"$n"', '"${g}"char"$n"', '"${g}"int"$n"', etc...). +\n image datatype to be different than '"${g}"float"$n"' (like '"${g}"bool"$n"', '"${g}"char"$n"', '"\ +${g}"int"$n"', etc...). \n This is possible by specifying it as a file option when using I/O commands. -\n (see section '"${c}"Input/output properties"$n"' to learn more about file options)." +\n (see section '"${m}"Input/Output Properties"$n"' to learn more about file options)." - _help_section "Items of a processing pipeline" + _help_section "Items of a Processing Pipeline" _help_paragraph " - In "${-GMIC}", an image processing pipeline is described as a sequence of items separated by the \n space character ' '. Such items are interpreted and executed from the left to the right. @@ -357,7 +415,7 @@ \n other special characters. For instance, the two strings '"${c}"single\\ item"$n"' and '"${c}"\"single item\""$n"' \n both define the same single item, with a space in it." - _help_section "Input data items" + _help_section "Input Data Items" _help_paragraph " - If a specified "${-GMIC}" item appears to be an existing filename, the corresponding image data \n are loaded and inserted at the end of the image list (which is equivalent to the use of @@ -371,26 +429,36 @@ \n \n . '"${c}"[selection]"$n"' or '"${c}"[selection]xN"$n"': Insert 1 or N copies of already existing images. \n '"${g}"selection"$n"' may represent one or several images -\n (see section '"${c}"Command items and selections"$n"' to learn more about selections). +\n (see section '"${m}"Command Items and Selections"$n"' to learn more about selections). \n -\n . '"${c}"width[%],_height[%],_depth[%],_spectrum[%],_values"$n"': Insert a new image with specified +\n . '"${c}"width[%],_height[%],_depth[%],_spectrum[%],_values[xN]"$n"': Insert one or N images with specified \n size and values (adding '"${g}"%"$n"' to a dimension means 'percentage of the size along the same \n axis, taken from the last image '"${g}"[-1]"$n"''). Any specified dimension can be also written as \n '"${c}"[image]"$n"', and is then set to the size (along the same axis) of the existing specified image -\n "${g}"[image]"$n". '"${g}"values"$n"' can be either a sequence of numbers separated by commas '"${g}","$n"', or a -\n mathematical expression, as e.g. in input item '"${c}"256,256,1,3,[x,y,128]"$n"' which +\n "${g}"[image]"$n". '"${g}"values"$n"' can be either a sequence of numbers separated by commas '"${g}","$n"', +\n or a mathematical expression, as e.g. in input item '"${c}"256,256,1,3,[x,y,128]"$n"' which \n creates a 256x256 RGB color image with a spatial shading on the red and green channels. -\n (see section '"${c}"Mathematical expressions"$n"' to learn more about mathematical expressions). +\n (see section '"${m}"Mathematical Expressions"$n"' to learn more about mathematical expressions). \n -\n . '"${c}"(v1,v2,..)"$n"': Insert a new image from specified prescribed values. Value separator inside -\n parentheses can be '"${g}","$n"' (column separator), '"${g}";"$n"' (row separator), '"${g}"/"$n"' (slice separator) or -\n '"${g}"^"$n"' (channel separator). For instance, expression '"${c}"(1,2,3;4,5,6;7,8,9)"$n"' creates a 3x3 matrix -\n (scalar image), with values running from 1 to 9. +\n . '"${c}"(v1,v2,..)[xN]"$n"': Insert one or N new images from specified prescribed values. Value separator +\n inside parentheses can be '"${g}","$n"' (column separator), '"${g}";"$n"' (row separator), '"${g}"/"$n"' + (slice separator) or +\n '"${g}"^"$n"' (channel separator). For instance, expression '"${c}"(1,2,3;4,5,6;7,8,9)"$n"' creates a +\n 3x3 matrix (scalar image), with values running from 1 to 9. +\n +\n . '"${c}"('string'[:delimiter])[xN]"$n"': Insert one or N new images from specified string, by filling +\n the images with the character codes composing the string. When specified, '"${g}"delimiter"$n"' tells about +\n the main orientation of the image. Delimiter can be '"${g}"x"$n"' (eq. to '"${g}","$n"' which is the default), +\n '"${g}"y"$n"' (eq. to '"${g}";"$n"'), '"${g}"z"$n"' (eq. to '"${g}"/"$n"') or '"${g}"c"$n"' + (eq. to '"${g}"^"$n"'). +\n When specified delimiter is '"${g}","$n"', '"${g}";"$n"', '"${g}"/"$n"' or '"${g}"^"$n"', the expression is +\n actually equivalent to '"${c}"({'string'[:delimiter]})[xN]"$n"' (see section '"${m}"Substitution Rules"$n"' +\n for more information on the syntax). \n -\n . '"${c}"0"$n"': Insert a new '"${g}"empty"$n"' image, containing no pixel data. Empty images are used only in rare -\n occasions. +\n . '"${c}"0[xN]"$n"': Insert one or N new '"${g}"empty"$n"' images, containing no pixel data. +\n Empty images are used only in rare occasions. \n -\n - Input item '"${c}"name=value"$n"' declares a new variable '"${g}"name"$n"', or assign a new value +\n - Input item '"${c}"name=value"$n"' declares a new variable '"${g}"name"$n"', or assign a new string value \n to an existing variable. Variable names must use the character set "${g}"[a-zA-Z0-9_]"$n" and cannot \n start with a number. \n @@ -403,21 +471,28 @@ \n for this purpose). Otherwise, it remains local to the thread that defined it. \n \n - Numerical variables can be updated with the use of these special operators: -\n '"${g}"+="$n"' (addition), '"${g}"-="$n"' (subtraction), '"${g}"*="$n"' (multiplication), '"${g}"/="$n"' (division), '"${g}"%="$n"' (modulo), -\n '"${g}"&="$n"' (bitwise and), '"${g}"|="$n"' (bitwise or), '"${g}"^="$n"' (power), '"${g}"<<="$n"' and '"${g}">>="$n"' (bitwise left and right +\n '"${g}"+="$n"' (addition), '"${g}"-="$n"' (subtraction), '"${g}"*="$n"' (multiplication), '"${g}"/="$n"' + (division), '"${g}"%="$n"' (modulo), +\n '"${g}"&="$n"' (bitwise and), '"${g}"|="$n"' (bitwise or), '"${g}"^="$n"' (power), '"${g}"<<="$n"' and '"\ +${g}">>="$n"' (bitwise left and right \n shifts). For instance, '"${c}"foo=1 foo+=3"$n"'. \n -\n - Input item '"${c}"name.=string"$n"' concatenates specified '"${g}"string"$n"' to the end of variable '"${g}"name"$n"'. +\n - Input item '"${c}"name.=string"$n"' concatenates specified '"${g}"string"$n"' to the end of variable '"\ +${g}"name"$n"'. \n \n - Multiple variable assignments and updates are allowed, with expressions: \n '"${c}"name1,name2,...,nameN=value"$n"' or '"${c}"name1,name2,...,nameN=value1,value2,...,valueN"$n"' \n where assignment operator '"${g}"="$n"' can be replaced by one of the allowed operators \n (e.g. '"${g}"+="$n"'). +\n +\n - Variables usually store numbers or strings. Use command 'store' to assign variables from image +\n data (and command 'input $variable' to bring them back on the image list afterwards). " - _help_section "Command items and selections" + _help_section "Command Items and Selections" - _help_paragraph " - A "${-GMIC}" item that is not a filename nor a special input string designates a "${g}"command"$n", + _help_paragraph " - A "${-GMIC}" item that is not a filename nor a special input string designates a "\ +${g}"command"$n", \n most of the time. Generally, commands perform image processing operations on one or several \n available images of the list. \n @@ -433,61 +508,66 @@ \n \n . '"${c}"command[-2]"$n"': Apply command only on the penultimate image "${g}"[-2]"$n" of the list. \n . '"${c}"command[0,1,3]"$n"': Apply command only on images "${g}"[0],[1]"$n" and "${g}"[3]"$n". -\n . '"${c}"command[3-6]"$n"': Apply command only on images "${g}"[3]"$n" to "${g}"[6]"$n" (i.e, "${g}"[3],[4],[5]"$n" and "${g}"[6]"$n"). +\n . '"${c}"command[3-6]"$n"': Apply command only on images "${g}"[3]"$n" to "${g}"[6]"$n" (i.e, "${g}"[3],[4],[5]"\ +$n" and "${g}"[6]"$n"). \n . '"${c}"command[50%-100%]"$n"': Apply command only on the second half of the image list. \n . '"${c}"command[0,-4--1]"$n"': Apply command only on the first image and the last four images. \n . '"${c}"command[0-9:3]"$n"': Apply command only on images "${g}"[0]"$n" to "${g}"[9]"$n", with a step of 3 \n (i.e. on images "${g}"[0], [3], [6]"$n" and "${g}"[9]"$n"). +\n . '"${c}"command[0-9:25%]"$n"': Apply command only on images "${g}"[0]"$n" to "${g}"[9]"$n", with a step of 25% +\n (i.e. on images "${g}"[0], [3], [6]"$n" and "${g}"[9]"$n"). \n . '"${c}"command[0--1:2]"$n"': Apply command only on images of the list with even indices. \n . '"${c}"command[0,2-4,50%--1]"$n"': Apply command on images "${g}"[0],[2],[3],[4]"$n" and on the second half of \n the image list. \n . '"${c}"command[^0,1]"$n"': Apply command on all images except the first two. \n . '"${c}"command[name1,name2]"$n"': Apply command on named images '"${g}"name1"$n"' and '"${g}"name2"$n"'. \n -\n - Indices in selections are always sorted in increasing order, and duplicate indices are +\n - indices in selections are always sorted in increasing order, and duplicate indices are \n discarded. For instance, selections '"${c}"[3-1,1-3]"$n"' and '"${c}"[1,1,1,3,2]"$n"' are both equivalent to \n '"${c}"[1-3]"$n"'. If you want to repeat a single command multiple times on an image, use a \n '"${c}"repeat..done"$n"' loop instead. Inverting the order of images for a command is achieved by \n explicitly inverting the order of the images in the list, with command '"${c}"reverse[selection]"$n"'. \n -\n - Command selections '"${c}"[-1]"$n"','"${c}"[-2]"$n"' and '"${c}"[-3]"$n"' are so often used that they have their own -\n shortcuts, respectively '"${c}"."$n"', '"${c}".."$n"' and '"${c}"..."$n"'. For instance, command '"${c}"blur.."$n"' is equivalent to -\n '"${c}"blur[-2]"$n"'. These shortcuts work also when specifying command arguments. +\n - Command selections '"${c}"[-1]"$n"','"${c}"[-2]"$n"' and '"${c}"[-3]"$n"' are so often used they have their own +\n shortcuts, respectively '"${c}"."$n"', '"${c}".."$n"' and '"${c}"..."$n"'. For instance, command '"\ +${c}"blur.."$n"' (or '"${c}"blur[..]"$n"') +\n is equivalent to '"${c}"blur[-2]"$n"'. These shortcuts work also when specifying command arguments. \n \n - "${-GMIC}" commands invoked without '"${c}"[selection]"$n"' are applied on all images of the list, i.e. the -\n default selection is '"${c}"[0--1]"$n"' (except for command '"${c}"input"$n"' whose default selection is '"${c}"[-1]"$n"'). +\n default selection is '"${c}"[0--1]"$n"' (except for command '"${c}"input"$n"' whose default selection is '"\ +${c}"[-1]"$n"'). \n \n - Prepending a single hyphen '"${g}"-"$n"' to a "${-GMIC}" command is allowed. This may be useful to recognize \n command items more easily in a one-liner pipeline (typically invoked from a shell). \n -\n - A "${-GMIC}" command prepended with a plus sign '"${g}"+"$n"' or a double hyphen '"${g}"--"$n"' does not act 'in-place' +\n - A "${-GMIC}" command prepended with a plus sign '"${g}"+"$n"' does not act 'in-place' \n but inserts its result as one or several new images at the end of the image list. \n \n - There are two different types of commands that can be run by the "${-GMIC}" interpreter: \n -\n . "${g}"Builtin commands"$n", are the hard-coded functionalities in the interpreter core. They are thus +\n . "${g}"Built-in commands"$n", are the hard-coded functionalities in the interpreter core. They are thus \n compiled as binary code and run fast, most of the time. Omitting an argument when invoking a -\n builtin command is not permitted, except if all following arguments are also omitted. +\n built-in command is not permitted, except if all following arguments are also omitted. \n For instance, invoking '"${c}"plasma 10,,5"$n"' is invalid but '"${c}"plasma 10"$n"' is correct. -\n . "${g}"Custom commands"$n", are defined as "${-GMIC}" pipelines of builtin or other custom commands. -\n They are interpreted by the "${-GMIC}" interpreter, and thus run a bit slower than builtin commands. +\n . "${g}"Custom commands"$n", are defined as "${-GMIC}" pipelines of built-in or other custom commands. +\n They are parsed by the "${-GMIC}" interpreter, and thus run a bit slower than built-in commands. \n Omitting arguments when invoking a custom command is permitted. For instance, expressions \n '"${c}"flower ,,,100,,2"$n"' or '"${c}"flower ,"$n"' are correct. \n \n - Most of the existing commands in "${-GMIC}" are actually defined as "${g}"custom commands"$n". \n \n - A user can easily add its own custom commands to the "${-GMIC}" interpreter (see section -\n "${c}"'Adding custom commands"$n"' for more details). New builtin commands cannot be added +\n '"${m}"Adding Custom Commands"$n"' for more details). New built-in commands cannot be added \n (unless you modify the "${-GMIC}" interpreter source code and recompile it)." - _help_section "Input/output properties" + _help_section "Input/Output Properties" _help_paragraph " - "${-GMIC}" is able to read/write most of the classical image file formats, including: \n \n . 2D grayscale/color files: "${c}".png, .jpeg, .gif, .pnm, .tif, .bmp, ..."$n" \n . 3D volumetric files: "${c}".dcm, .hdr, .nii, .pan, .inr, .pnk, ..."$n" \n . video files: "${c}".mpeg, .avi, .mov, .ogg, .flv, ..."$n" -\n . Generic ascii or binary data files: "${c}".gmz, .cimg, .cimgz, .dlm, .asc, .pfm, .raw, .txt, .h."$n" +\n . Generic text or binary data files: "${c}".gmz, .cimg, .cimgz, .dlm, .asc, .pfm, .raw, .txt, .h."$n" \n . 3D object files: "${c}".off."$n" \n \n - When dealing with color images, "${-GMIC}" generally reads, writes and displays data using the usual @@ -512,8 +592,8 @@ \n the last frame of the video. Set '"${g}"step"$n"' to 0 to force an opened video file to be \n opened/closed. Output framerate and codec can be also set by using the output expression \n '"${c}"filename.avi,_fps,_codec,_keep_open={ 0 | 1 }"$n"'. '"${g}"codec"$n"' is a 4-char string -\n (see "${r}"http://www.fourcc.org/codecs.php"$n") or '"${g}"0"$n"' for the default codec. '"${g}"keep_open"$n"' tells if -\n the output video file must be kept open for appending new frames afterwards. +\n (see "${r}"http://www.fourcc.org/codecs.php"$n") or '"${g}"0"$n"' for the default codec. '"${g}"keep_open"$n"' +\n tells if the output video file must be kept open for appending new frames afterwards. \n \n . "${g}".cimg[z] files:"$n" Only crops and sub-images of .cimg files can be loaded, using the input \n expressions '"${c}"filename.cimg,N0,N1"$n"', '"${c}"filename.cimg,N0,N1,x0,x1"$n"', @@ -530,8 +610,8 @@ \n type can also be specified with the output expression '"${c}"filename.raw[,datatype]"$n"'. \n '"${g}"datatype"$n"' can be the same as for "${g}".cimg[z]"$n" files. \n -\n . "${g}".yuv files:"$n" Image dimensions must be specified when loading, and only sub-frames of an image sequence -\n may be loaded, using the input expression +\n . "${g}".yuv files:"$n" Image dimensions must be specified when loading, and only sub-frames of an image +\n sequence may be loaded, using the input expression \n '"${c}"filename.yuv,width,height[,chroma_subsampling[,first_frame[,last_frame[,step]]]"$n"'. \n '"${g}"chroma_subsampling"$n"' can be "${g}"{ 420 | 422 | 444 }"$n". \n When saving, chroma subsampling mode can be specified with output expression @@ -542,7 +622,8 @@ \n Output expression '"${c}"filename.tiff,_datatype,_compression,_force_multipage,_use_bigtiff"$n"' can \n be used to specify the output pixel type, as well as the compression method. \n '"${g}"datatype"$n"' can be the same as for "${g}".cimg[z]"$n" files. '"${g}"compression"$n"' can be -\n "${g}"{ none (default) | lzw | jpeg }"$n". '"${g}"force_multipage"$n" can be "${g}"{ 0=no (default) | 1=yes }"$n". +\n "${g}"{ none (default) | lzw | jpeg }"$n". '"${g}"force_multipage"$n" can be "\ +${g}"{ 0=no (default) | 1=yes }"$n". \n '"${g}"use_bigtiff"$n" can be "${g}"{ 0=no | 1=yes (default) }"$n". \n \n . "${g}".gif files:"$n" Animated gif files can be saved, using the input expression @@ -568,35 +649,42 @@ \n - Some input/output formats and options may not be supported, depending on the configuration \n flags that have been set during the build of the "${-GMIC}" software." - _help_section "Substitution rules" + _help_section "Substitution Rules" - _help_paragraph " - "${-GMIC}" items containing '"${g}"$"$n"' or '"${g}"{}"$n"' are substituted before being interpreted. Use these + _help_paragraph " - "${-GMIC}" items containing '"${g}"$"$n"' or '"${g}"{}"$n"' are substituted before being + interpreted. Use these \n substituting expressions to access various data from the interpreter environment. \n -\n - '"${c}"$name"$n"' and '"${c}"${name}"$n"' are both substituted by the value of the specified named "${g}"variable"$n" +\n - '"${c}"$name"$n"' and '"${c}"${name}"$n"' are both substituted by the value of the specified named "\ +${g}"variable"$n" \n (set previously by the item '"${c}"name=value"$n"'). If this variable has not been already set, the -\n expression is substituted by the highest positive "${g}"indice"$n" of the named image '"${g}"[name]"$n"'. If no +\n expression is substituted by the highest positive "${g}"index"$n" of the named image '"${g}"[name]"$n"'. If no \n image has this name, the expression is substituted by the value of the "${g}"OS environment variable"$n" \n with same name (it may be thus an empty string). \n The following reserved variables are predefined by the "${-GMIC}" interpreter: \n \n . '"${c}"$!"$n"': The current number of images in the list. -\n . '"${c}"$>"$n"' and '"${c}"$<"$n"': The increasing/decreasing indice of the latest (currently running) -\n '"${c}"repeat...done"$n"' loop. +\n . '"${c}"$>"$n"' and '"${c}"$<"$n"': The increasing/decreasing index of the latest (currently running) +\n '"${c}"repeat...done"$n"' loop. '"${c}"$>"$n"' goes from '"${g}"0"$n"' (first loop iteration) to +\n '"${g}"nb_iterations - 1"$n"' (last iteration). '"${c}"$<"$n"' does the opposite. \n . '"${c}"$/"$n"': The current call stack. Stack items are separated by slashes '"${g}"/"$n"'. \n . '"${c}"$|"$n"': The current value (expressed in seconds) of a millisecond precision timer. \n . '"${c}"$^"$n"': The current verbosity level. \n . '"${c}"$_cpus"$n"': The number of computation cores available on your machine. \n . '"${c}"$_pid"$n"': The current process identifier, as an integer. -\n . '"${c}"$_prerelease"$n"': For pre-releases only, the date of the pre-release as '"${g}"yymmdd"$n"'. -\n For stable releases, this variable is not defined. +\n . '"${c}"$_prerelease"$n"': For pre-releases, the date of the pre-release as '"${g}"yymmdd"$n"'. +\n For stable releases, this variable is set to 0. \n . '"${c}"$_version"$n"': A 3-digits number telling about the current version of the "${-GMIC}" interpreter \n (e.g. '"$g$_version$n"'). -\n . '"${c}"$_vt100"$n"': Set to "${g}"1"$n" (default value) if colored text output is allowed on the console. -\n . '"${c}"$_path_rc"$n"': The path to the "${-GMIC}" folder used to store resources and configuration files +\n . '"${c}"$_host"$n"': A string telling about the host running the "${-GMIC}" interpreter +\n (e.g. '"${g}"cli"$n"' or '"${g}"gimp"$n"'). +\n . '"${c}"$_vt100"$n"': Set to "${g}"1"$n" if colored text output is allowed on the console. +\n Otherwise, set to "${g}"0"$n" +\n . '"${c}"$_path_rc"$n"': The path to the "${-GMIC}" folder used to store configuration files \n (its value is OS-dependent). -\n . '"${c}"$_path_user"$n"': The path to the "${-GMIC}" user file "${g}".gmic"$n" or "${g}"user.gmic"$n" (its value is -\n OS-dependent). +\n . '"${c}"$_path_user"$n"': The path to the "${-GMIC}" user file "${g}".gmic"$n" or "${g}"user.gmic"$n" +\n (its value is OS-dependent). +\n . '"${c}"$_path_commands"$n"': A list of all imported command files (stored as a list-valued variable). \n \n - '"${c}"$$name"$n"' and '"${c}"$${name}"$n"' are both substituted by the G'MIC script code of the specified named \n "${g}"custom command"$n", or by an empty string if no custom command with specified name exists. @@ -610,19 +698,22 @@ \n \n - '"${c}"{/string}"$n"' is substituted by the "${g}"escaped version"$n" of the specified string. \n -\n - '"${c}"{'string'}"$n"' (between single quotes) is substituted by the "${g}"sequence of ascii codes"$n" that compose -\n the specified string, separated by commas '"${g}","$n"'. For instance, item '"${c}"{'foo'}"$n"' is substituted -\n by '"${c}"102,111,111"$n"'. -\n -\n - '"${c}"{image,feature}"$n"' is substituted by a specific feature of the image "${c}"[image]"$n". '"${g}"image"$n"' can be -\n either an image number or an image name. It can be also eluded, in which case, the last image -\n '"${c}"[-1]"$n"' of the list is considered for the requested feature. +\n - '"${c}"{'string'[:delimiter]}"$n"' (between single quotes) is substituted by the "${g}"sequence of character + codes"$n" +\n that composes the specified string, separated by specified delimiter. Possible delimiters are +\n '"${g}","$n"' (default), '"${g}";"$n"', '"${g}"/"$n"', '"${g}"^"$n"' or ' '. +\n For instance, item '"${c}"{'foo'}"$n"' is substituted by '"${c}"102,111,111"$n"' and '"${c}"{'foo':;}"$n"' + by '"${c}"102;111;111"$n"'. +\n +\n - '"${c}"{image,feature[:delimiter]}"$n"' is substituted by a specific feature of the image "${c}"[image]"$n". +\n '"${g}"image"$n"' can be either an image number or an image name. It can be also eluded, in which case, +\n the last image '"${c}"[-1]"$n"' of the list is considered for the requested feature. \n Specified '"${g}"feature"$n"' can be one of: \n \n . '"${c}"b"$n"': The image basename (i.e. filename without the folder path nor extension). \n . '"${c}"f"$n"': The image folder name. \n . '"${c}"n"$n"': The image name or filename (if the image has been read from a file). -\n . '"${c}"t"$n"': The text string from the image values regarded as ascii codes. +\n . '"${c}"t"$n"': The text string from the image values regarded as character codes. \n . '"${c}"x"$n"': The image extension (i.e the characters after the last '.' in the image name). \n . '"${c}"^"$n" : The sequence of all image values, separated by commas ','. \n . '"${c}"@subset"$n"': The sequence of image values corresponding to the specified subset, and @@ -630,33 +721,31 @@ \n . Any other '"${c}"feature"$n"' is considered as a "${g}"mathematical expression"$n" associated to the image \n "${c}"[image]"$n" and is substituted by the result of its evaluation (float value). For instance, \n expression '"${c}"{0,w+h}"$n"' is substituted by the sum of the width and height of the first image -\n (see section '"${c}"Mathematical expressions"$n"' for more details). If a mathematical expression +\n (see section '"${m}"Mathematical Expressions"$n"' for more details). If a mathematical expression \n starts with an underscore '"${g}"_"$n"', the resulting value is truncated to a readable format. -\n For instance, item '"${c}"{_pi}"$n"' is substituted by '"${g}"3.14159"$n"' (while '"${c}"{pi}"$n"' is substituted by -\n '"${g}"3.141592653589793"$n"'). -\n . A '"${c}"feature"$n"' delimited by backquotes is replaced by a string whose ascii codes correspond +\n For instance, item '"${c}"{_pi}"$n"' is substituted by '"${g}"3.14159"$n"' (while '"${c}"{pi}"$n"' +\n is substituted by '"${g}"3.141592653589793"$n"'). +\n . A '"${c}"feature"$n"' delimited by backquotes is replaced by a string whose character codes correspond \n to the list of values resulting from the evaluation of the specified mathematical \n expression. For instance, item '"${c}"{`[102,111,111]`}"$n"' is substituted by '"${c}"foo"$n"' and item \n '"${c}"{`vector8(65)`}"$n"' by '"${c}"AAAAAAAA"$n"'. \n -\n - '"${c}"{*}"$n"' is substituted by the "${g}"visibility state"$n" of the instant display window "${c}"[0]"$n" (can be -\n "${g}"{ 0=closed | 1=visible }"$n"). +\n - '"${c}"{*}"$n"' is substituted by the "${g}"visibility state"$n" of the instant display window "${c}"[0]"$n" +\n (can be "${g}"{ 0=closed | 1=visible }"$n"). \n -\n - '"${c}"{*,feature}"$n"' or '"${c}"{*indice,feature}"$n"' is substituted by a specific feature of the instant -\n display window "${c}"#0"$n" (or "${c}"#indice"$n", if specified). Requested '"${g}"feature"$n"' can be: +\n - '"${c}"{*[index],feature1,...,featureN[:delimiter]}"$n"' is substituted by +\n a specific set of features of the instant display window "${c}"#0"$n" (or "${c}"#index"$n", if specified). +\n Requested '"${g}"features"$n"' can be: \n \n . '"${c}"w"$n"': display width (i.e. width of the display area managed by the window). \n . '"${c}"h"$n"': display height (i.e. height of the display area managed by the window). \n . '"${c}"wh"$n"': display width x display height. -\n . '"${c}"w,h"$n"': display width, display height (equivalent to '"${c}"{*,w},{*,h}"$n"'). \n . '"${c}"d"$n"': window width (i.e. width of the window widget). \n . '"${c}"e"$n"': window height (i.e. height of the window widget). \n . '"${c}"de"$n"': window width x window height. -\n . '"${c}"d,e"$n"': window width, window height (equivalent to '"${c}"{*,d},{*,e}"$n"'). \n . '"${c}"u"$n"': screen width (actually independent on the window size). -\n .' "${c}"v"$n"': screen height (actually independent on the window size). +\n . '"${c}"v"$n"': screen height (actually independent on the window size). \n . '"${c}"uv"$n"': screen width x screen height. -\n . '"${c}"u,v"$n"': screen width, screen height (equivalent to '"${c}"{*,u},{*,v}"$n"'). \n . '"${c}"n"$n"': current normalization type of the instant display. \n . '"${c}"t"$n"': window title of the instant display. \n . '"${c}"x"$n"': X-coordinate of the mouse position (or -1, if outside the display area). @@ -667,22 +756,23 @@ \n . '"${c}"c"$n"': boolean (0 or 1) telling if the instant display has been closed recently. \n . '"${c}"r"$n"': boolean telling if the instant display has been resized recently. \n . '"${c}"m"$n"': boolean telling if the instant display has been moved recently. -\n . Any other '"${c}"feature"$n"' stands for a "${g}"keycode name"$n" (in capital letters), and is substituted by -\n a boolean describing the current key state "${g}"{ 0=pressed | 1=released }"$n". +\n . Any other '"${c}"feature"$n"' stands for a "${g}"keycode name"$n" (in capital letters), and is substituted +\n by a boolean describing the current key state "${g}"{ 0=pressed | 1=released }"$n". \n . You can also prepend a hyphen '"${c}"-"$n"' to a '"${g}"feature"$n"' (that supports it) to flush the \n corresponding event immediately after reading its state (works for keys, mouse and \n window events). \n \n - Item substitution is "${g}"never performed in items between double quotes"$n". One must break the quotes -\n to enable substitution if needed, as in "${c}"\"3+8 kg = \"{3+8}\" kg\""$n". Using double quotes is then +\n to enable substitution if needed, as in '"${c}"\"3+8 kg = \"{3+8}\" kg\""$n"'. Using double quotes is then \n a convenient way to disable the substitutions mechanism in items, when necessary. \n \n - One can also disable the substitution mechanism on items outside double quotes, by escaping the \n '"${g}"{"$n"','"${g}"}"$n"' or '"${g}"$"$n"' characters, as in '"${c}"\\{3+4\\}\\ doesn\47t\\ evaluate"$n"'." - _help_section "Mathematical expressions" + _help_section "Mathematical Expressions" - _help_paragraph " - "${-GMIC}" has an embedded "${g}"mathematical parser"$n". It is used to evaluate (possibly complex) expressions + _help_paragraph " - "${-GMIC}" has an embedded "${g}"mathematical parser"$n", used to evaluate + (possibly complex) expressions \n inside braces '"${g}"{}"$n"', or formulas in commands that may take one as an argument (e.g. '"${c}"fill"$n"'). \n \n - When the context allows it, a formula is evaluated "${g}"for each pixel"$n" of the selected images @@ -693,39 +783,62 @@ \n \n - The mathematical parser understands the following set of functions, operators and variables: \n -\n _ "${g}"Usual operators:"$n" "${c}"||"$n" (logical or), "${c}"&&"$n" (logical and), "${c}"|"$n" (bitwise or), "${c}"&"$n" (bitwise and), +\n _ "${g}"Usual operators:"$n" "${c}"||"$n" (logical or), "${c}"&&"$n" (logical and), "${c}"|"$n" (bitwise or), "\ +${c}"&"$n" (bitwise and), \n "${c}"!=, ==, <=, >=, <, >, <<"$n" (left bitwise shift), "${c}">>"$n" (right bitwise shift), "${c}"-, +, *, /, \n %"$n" (modulo), "${c}"^"$n" (power), "${c}"!"$n" (logical not), "${c}"~"$n" (bitwise not), -\n "${c}"++"$n", "${c}"--"$n", "${c}"+="$n", "${c}"-="$n", "${c}"*="$n", "${c}"/="$n", "${c}"%="$n", "${c}"&="$n", "${c}"|="$n", "${c}"^="$n", "${c}">>="$n", "${c}"<<="$n" (in-place operators). +\n "${c}"++"$n", "${c}"--"$n", "${c}"+="$n", "${c}"-="$n", "${c}"*="$n", "${c}"/="$n", "${c}"%="$n", "\ +${c}"&="$n", "${c}"|="$n", "${c}"^="$n", "${c}">>="$n", "${c}"<<="$n" (in-place operators). \n -\n _ "${g}"Usual math functions:"$n" "${c}"abs(), acos(), acosh(), arg(), argkth(), argmax(), argmin(), asin(), -\n asinh(), atan(), atan2(), atanh(), avg(), bool(), cbrt(), ceil(), cos(), cosh(), cut(), exp(), fact(), -\n fibo(), floor(), gauss(), int(), isval(), isnan(), isinf(), isint(), isbool(), isfile(), isdir(), isin(), -\n kth(), log(), log2(), log10(), max(), med(), min(), narg(), prod(), rol()"$n" (left bit rotation), +\n _ "${g}"Usual math functions:"$n" "${c}"abs(), acos(), acosh(), arg(), argkth(), argmax(), argmaxabs(), +\n argmin(), argminabs(), asin(), asinh(), atan(), atan2(), atanh(), avg(), bool(), cbrt(), ceil(), +\n cos(), cosh(), cut(), exp(), fact(), fibo(), floor(), gauss(), int(), isnan(), isnum(), isinf(), +\n isint(), isbool(), isexpr(), isfile(), isdir(), isin(), kth(), log(), log2(), log10(), max(), +\n maxabs(), med(), min(), minabs(), narg(), prod(), rol()"$n" (left bit rotation), \n "${c}"ror()"$n" (right bit rotation)"${c}", round(), sign(), sin(), sinc(), sinh(), sqrt(), std(), \n srand(_seed), sum(), tan(), tanh(), var(), xor()"$n". \n -\n . '"${c}"atan2(y,x)"$n"' is the version of '"${c}"atan()"$n"' with two arguments '"${g}"y"$n"' and '"${g}"x"$n"' (as in C/C++). +\n . '"${c}"atan2(y,x)"$n"' is the version of '"${c}"atan()"$n"' with two arguments '"${g}"y"$n"' and '"\ +${g}"x"$n"' (as in C/C++). \n . '"${c}"permut(k,n,with_order)"$n"' computes the number of permutations of "${g}"k"$n" objects from a set of \n "${g}"n"$n" objects. -\n . '"${c}"gauss(x,_sigma,_is_normalized)"$n"' returns '"${g}"exp(-x^2/(2*s^2))/(is_normalized?sqrt(2*pi*sigma^2):1)'"$n". -\n . '"${c}"cut(value,min,max)"$n"' returns value if it is in range "${g}"[min,max]"$n", or "${g}"min"$n" or "${g}"max"$n" otherwise. +\n . '"${c}"gauss(x,_sigma,_is_normalized)"$n"' returns +\n '"${g}"exp(-x^2/(2*s^2))/(is_normalized?sqrt(2*pi*sigma^2):1)"$n"'. +\n . '"${c}"cut(value,min,max)"$n"' returns value if it is in range "${g}"[min,max]"$n", or "${g}"min"$n" or "\ +${g}"max"$n" otherwise. \n . '"${c}"narg(a_1,...,a_N)"$n"' returns the number of specified arguments (here, "${g}"N"$n"). \n . '"${c}"arg(i,a_1,..,a_N)"$n"' returns the "${g}"ith"$n" argument "${g}"a_i"$n". -\n . '"${c}"isval()"$n"', '"${c}"isnan()"$n"', '"${c}"isinf()"$n"', '"${c}"isint()"$n"', '"${c}"isbool()"$n"' test the type of the given +\n . '"${c}"isnum()"$n"', '"${c}"isnan()"$n"', '"${c}"isinf()"$n"', '"${c}"isint()"$n"', '"\ +${c}"isbool()"$n"' test the type of the given \n number or expression, and return "${g}"0 (false)"$n" or "${g}"1 (true)"$n". -\n . '"${c}"isfile()"$n"' (resp. '"${c}"isdir()"$n"') returns "${g}"0 (false)"$n" or "${g}"1 (true)"$n" whether its argument is a -\n path to an existing file (resp. to a directory) or not. -\n . '"${c}"isin(v,a_1,...,a_n)"$n"' returns "${g}"0 (false)"$n" or "${g}"1 (true)"$n" whether the first value '"${g}"v"$n"' appears +\n . '"${c}"isfile('path')"$n"' (resp. '"${c}"isdir('path')"$n"') returns "${g}"0 (false)"$n" or "\ +${g}"1 (true)"$n" whether its string +\n argument is a path to an existing file (resp. to a directory) or not. +\n . '"${c}"isin(v,a_1,...,a_n)"$n"' returns "${g}"0 (false)"$n" or "${g}"1 (true)"$n" whether the first value '"\ +${g}"v"$n"' appears \n in the set of other values 'a_i'. -\n . '"${c}"argmin()"$n"', '"${c}"argmax()"$n"', '"${c}"avg()"$n"', '"${c}"kth()"$n"', '"${c}"max()"$n"', '"${c}"med()"$n"', '"${c}"min()"$n"', '"${c}"std()"$n"', '"${c}"sum()"$n"' -\n and '"${c}"var()"$n"' can be called with an arbitrary number of scalar/vector arguments. +\n . '"${c}"inrange(value,m,M,include_boundaries)"$n"' returns "${g}"0 (false)"$n" or "${g}"1 (true)"$n" whether +\n the specified value lies in range "${g}"[m,M]"$n" or not (checked range is "${g}"]m,M["$n" if +\n '"${g}"include_boundaries=0"$n"'). +\n . '"${c}"argkth()"$n"', '"${c}"argmin()"$n"', '"${c}"argmax()"$n"', '"${c}"argminabs()"$n"', \ +'"${c}"argmaxabs()"$n"', '"${c}"avg()"$n"', '"${c}"kth()"$n"', '"${c}"min()"$n"', +\n '"${c}"max()"$n"', '"${c}"minabs()"$n"', '"${c}"maxabs()"$n"', "${c}"med()"$n"', '"${c}"prod()"$n"', \ +'"${c}"std()"$n"', '"${c}"sum()"$n"' and '"${c}"var()"$n"' +\n can be called with an arbitrary number of scalar/vector arguments. +\n . '"${c}"vargkth()"$n"', '"${c}"vargmin()"$n"', '"${c}"vargmax()"$n"', '"${c}"vargminabs()"$n"', \ +'"${c}"vargmaxabs()"$n"', '"${c}"vavg()"$n"', '"${c}"vkth()"$n"', '"${c}"vmin()"$n"', +\n '"${c}"vmax()"$n"', '"${c}"vminabs()"$n"', '"${c}"vmaxabs()"$n"', '"${c}"vmed()"$n"', '"${c}"vprod()"$n"', \ +'"${c}"vstd()"$n"', '"${c}"vsum()"$n"' and '"${c}"vvar()"$n"' +\n are the versions of the previous function with vector-valued arguments. \n . '"${c}"round(value,rounding_value,direction)"$n"' returns a rounded value. '"${g}"direction"$n"' can be \n "${g}"{ -1=to-lowest | 0=to-nearest | 1=to-highest }"$n". +\n . '"${c}"lerp(a,b,t)"$n"' returns '"${g}"a*(1-t) + b*t"$n"'. +\n . '"${c}"swap(a,b)"$n" swaps the values of the given arguments. \n \n _ "${g}"Variable names"$n" below are pre-defined. They can be overridden. \n \n . '"${c}"l"$n"': length of the associated list of images. +\n . '"${c}"k"$n"': index of the associated image, in "${g}"[0,l-1]"$n". \n . '"${c}"w"$n"': width of the associated image, if any ("${g}"0"$n" otherwise). \n . '"${c}"h"$n"': height of the associated image, if any ("${g}"0"$n" otherwise). \n . '"${c}"d"$n"': depth of the associated image, if any ("${g}"0"$n" otherwise). @@ -734,28 +847,33 @@ \n . '"${c}"wh"$n"': shortcut for width x height. \n . '"${c}"whd"$n"': shortcut for width x height x depth. \n . '"${c}"whds"$n"': shortcut for width x height x depth x spectrum (i.e. number of image values). -\n . '"${c}"im"$n"','"${c}"iM"$n"','"${c}"ia"$n"','"${c}"iv"$n"','"${c}"is"$n"','"${c}"ip"$n"','"${c}"ic"$n"': Respectively the minimum, maximum, average, -\n variance, sum, product and median value of the associated image, if any ("${g}"0"$n" otherwise). -\n . '"${c}"xm"$n"','"${c}"ym"$n"','"${c}"zm"$n"','"${c}"cm"$n"': The pixel coordinates of the minimum value in the associated -\n image, if any ("${g}"0"$n" otherwise). -\n . '"${c}"xM"$n"','"${c}"yM"$n"','"${c}"zM"$n"','"${c}"cM"$n"': The pixel coordinates of the maximum value in the associated -\n image, if any ("${g}"0"$n" otherwise). +\n . '"${c}"im"$n"', '"${c}"iM"$n"', '"${c}"ia"$n"', '"${c}"iv"$n"', '"${c}"is"$n"', '"${c}"ip"$n"', +'"${c}"ic"$n"', '"${c}"in"$n"': Respectively the minimum, maximum, average, +\n variance, sum, product, median value and L2-norm of the associated image, if any +\n ("${g}"0"$n" otherwise). +\n . '"${c}"xm"$n"', '"${c}"ym"$n"', '"${c}"zm"$n"', '"${c}"cm"$n"': The pixel coordinates of the minimum value +\n in the associated image, if any ("${g}"0"$n" otherwise). +\n . '"${c}"xM"$n"', '"${c}"yM"$n"', '"${c}"zM"$n"', '"${c}"cM"$n"': The pixel coordinates of the maximum value +\n in the associated image, if any ("${g}"0"$n" otherwise). \n . All these variables are considered as "${g}"constant values"$n" by the math parser (for optimization \n purposes) which is indeed the case most of the time. Anyway, this might not be the case, \n if function '"${c}"resize(#ind,..)"$n"' is used in the math expression. -\n If so, it is safer to invoke functions '"${c}"l()"$n"', '"${c}"w(_#ind)"$n"', '"${c}"h(_#ind)"$n"', ... '"${c}"s(_#ind)"$n"' -\n and '"${c}"ic(_#ind)"$n"' instead of the corresponding named variables. +\n If so, it is safer to invoke functions '"${c}"l()"$n"', '"${c}"w(_#ind)"$n"', '"${c}"h(_#ind)"$n"', ... + '"${c}"s(_#ind)"$n"' +\n and '"${c}"in(_#ind)"$n"' instead of the corresponding named variables. \n . '"${c}"i"$n"': current processed pixel value (i.e. value located at "${g}"(x,y,z,c)"$n") in the associated \n image, if any ("${g}"0"$n" otherwise). \n . '"${c}"iN"$n"': Nth channel value of current processed pixel (i.e. value located at "${g}"(x,y,z,N)"$n") in -\n the associated image, if any ("${g}"0"$n" otherwise). '"${g}"N"$n"' must be an integer in range "${g}"[0,9]"$n". -\n . '"${c}"R"$n"','"${c}"G"$n"','"${c}"B"$n"' and '"${c}"A"$n"' are equivalent to '"${c}"i0"$n"', '"${c}"i1"$n"', '"${c}"i2"$n"' and '"${c}"i3"$n"' respectively. +\n the associated image, if any ("${g}"0"$n" otherwise). '"${g}"N"$n"' must be an integer in range "\ +${g}"[0,9]"$n". +\n . '"${c}"R"$n"', '"${c}"G"$n"', '"${c}"B"$n"' and '"${c}"A"$n"' are equivalent to '"${c}"i0"$n"', '"\ +${c}"i1"$n"', '"${c}"i2"$n"' and '"${c}"i3"$n"' respectively. \n . '"${c}"I"$n"': current vector-valued processed pixel in the associated image, if any ("${g}"0"$n" otherwise). \n The number of vector components is equal to the number of image channels \n (e.g. "${g}"I = [ R,G,B ]"$n" for a "${g}"RGB"$n" image). \n . You may add '"${c}"#ind"$n"' to any of the variable name above to retrieve the information for any -\n numbered image "${g}"[ind]"$n" of the list (when this makes sense). For instance '"${c}"ia#0"$n"' denotes the -\n average value of the first image of the list). +\n numbered image "${g}"[ind]"$n" of the list (when this makes sense). For instance '"${c}"ia#0"$n"' denotes +\n the average value of the first image of the list). \n . '"${c}"x"$n"': current processed column of the associated image, if any ("${g}"0"$n" otherwise). \n . '"${c}"y"$n"': current processed row of the associated image, if any ("${g}"0"$n" otherwise). \n . '"${c}"z"$n"': current processed slice of the associated image, if any ("${g}"0"$n" otherwise). @@ -778,44 +896,63 @@ \n \n _ "${g}"Vector calculus:"$n" Most operators are also able to work with vector-valued elements. \n -\n . '"${c}"[ a0,a1,...,aN ]"$n"' defines a "${g}"(N+1)"$n"-dimensional vector with scalar coefficients "${g}"ak"$n". -\n . '"${c}"vectorN(a0,a1,,...,)"$n"' does the same, with the "${g}"ak"$n" being repeated periodically if only a -\n few are specified. -\n . In both previous expressions, the "${g}"ak"$n" can be vectors themselves, to be concatenated into a +\n . '"${c}"[ a0,a1,...,aN-1 ]"$n"' defines a "${g}"N"$n"-dimensional vector with scalar coefficients "\ +${g}"ak"$n". +\n . '"${c}"vectorN(a0,a1,,...,aN-1)"$n"' does the same, with the "${g}"ak"$n" being repeated periodically if +\n only a few are specified. +\n . '"${c}"vector(#N,a0,a1,,...,aN-1)"$n"' does the same, and can be used for any constant expression "\ +${g}"N"$n". +\n . In previous expressions, the "${g}"ak"$n" can be vectors themselves, to be concatenated into a \n single vector. \n . The scalar element "${g}"ak"$n" of a vector "${g}"X"$n" is retrieved by '"${c}"X[k]"$n"'. -\n . The sub-vector "${g}"[ X[p]...X[p+q-1] ]"$n" (of size "${g}"q"$n") of a vector "${g}"X"$n" is retrieved by '"${c}"X[p,q]"$n"'. +\n . The sub-vector "${g}"[ X[p],X[p+s]...X[p+s*(q-1)] ]"$n" (of size "${g}"q"$n") of a vector "${g}"X"$n" +\n is retrieved by '"${c}"X[p,q,s]"$n"'. \n . Equality/inequality comparisons between two vectors is done with operators '"${c}"=="$n"' and '"${c}"!="$n"'. \n . Some vector-specific functions can be used on vector values: -\n '"${c}"cross(X,Y)"$n"' (cross product), '"${c}"dot(X,Y)"$n"' (dot product), '"${c}"size(X)"$n"' (vector dimension), +\n '"${c}"cross(X,Y)"$n"' (cross product), '"${c}"dot(X,Y)"$n"' (dot product), '"${c}"size(X)"$n"' + (vector dimension), \n '"${c}"sort(X,_is_increasing,_chunk_size)"$n"' (sorting values), '"${c}"reverse(A)"$n"' (reverse order of \n components), '"${c}"shift(A,_length,_boundary_conditions)"$n"' and \n '"${c}"same(A,B,_nb_vals,_is_case_sensitive)"$n"' (vector equality test). \n . Function '"${c}"normP(u1,...,un)"$n"' computes the LP-norm of the specified vector -\n ("${c}"P"$n" being an "${g}"unsigned integer"$n" constant or '"${g}"inf"$n"'). If "${c}"P"$n" is omitted, the L2 norm is used. +\n ("${c}"P"$n" being an "${g}"unsigned integer"$n" constant or '"${g}"inf"$n"'). If "${c}"P"$n" is omitted, + the L2 norm is used. \n . Function '"${c}"resize(A,size,_interpolation,_boundary_conditions)"$n"' returns a resized version of \n a vector '"${g}"A"$n"' with specified interpolation mode. '"${g}"interpolation'"$n" can be "${g}"{ -1=none \n (memory content) | 0=none | 1=nearest | 2=average | 3=linear | 4=grid | 5=bicubic | -\n 6=lanczos }"$n", and '"${g}"boundary_conditions'"$n" can be "${g}"{ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }"$n". -\n . Function '"${c}"find(A,B,_is_forward,_starting_indice)"$n"' returns the index where sub-vector "${g}"B"$n" -\n appears in vector "${g}"A"$n", (or "${g}"-1"$n" if "${g}"B"$n" is not found in "${g}"A"$n"). Argument "${g}"A"$n" can be also replaced by -\n an image indice "${g}"#ind"$n". +\n 6=lanczos }"$n", and '"${g}"boundary_conditions'"$n" can be "${g}"{ 0=dirichlet | 1=neumann | 2=periodic | +\n 3=mirror }"$n". +\n . Function '"${c}"find(A,B,_starting_index,_search_step)"$n"' returns the index where +\n sub-vector "${g}"B"$n" appears in vector "${g}"A"$n", (or "${g}"-1"$n" if "${g}"B"$n" is not + found in "${g}"A"$n"). +\n Argument "${g}"A"$n" can be also replaced by an image index "${g}"#ind"$n". \n . A "${g}"2"$n"-dimensional vector may be seen as a complex number and used in those particular \n functions/operators: -\n '"${c}"**"$n"' (complex multiplication), '"${c}"//"$n"' (complex division), '"${c}"^^"$n"' (complex exponentiation), -\n '"${c}"**="$n"' (complex self-multiplication), '"${c}"//="$n"' (complex self-division), '"${c}"^^="$n"' (complex -\n self-exponentiation), '"${c}"cabs()"$n"' (complex modulus), '"${c}"carg()"$n"' (complex argument), '"${c}"cconj()"$n"' -\n (complex conjugate), '"${c}"cexp()"$n"' (complex exponential) and '"${c}"clog()"$n"' (complex logarithm). -\n . A "${g}"MN"$n"-dimensional vector may be seen as a "${g}"M"${n}" x "${g}"N"$n" matrix and used in those particular -\n functions/operators: -\n '"${c}"*"$n"' (matrix-vector multiplication), '"${c}"det(A)"$n"' (determinant), '"${c}"diag(V)"$n"' (diagonal matrix +\n '"${c}"**"$n"' (complex multiplication), '"${c}"//"$n"' (complex division), '"${c}"^^"$n"' + (complex exponentiation), +\n '"${c}"**="$n"' (complex self-multiplication), '"${c}"//="$n"' (complex self-division), '"${c}"^^="$n"' + (complex +\n self-exponentiation), '"${c}"cabs()"$n"' (complex modulus), '"${c}"carg()"$n"' (complex argument), + '"${c}"cconj()"$n"' +\n (complex conjugate), '"${c}"cexp()"$n"' (complex exponential), '"${c}"clog()"$n"' (complex logarithm) +\n '"${c}"ccos()"$n"' (complex cosine), '"${c}"csin()"$n"' (complex sine), '"${c}"ctan()"$n"' \ +(complex tangent), +\n '"${c}"ccosh()"$n"' (complex hyperpolic cosine), '"${c}"csinh()"$n"' (complex hyperbolic sine) +\n and '"${c}"ctanh()"$n"' (complex hyperbolic tangent). +\n . A "${g}"MN"$n"-dimensional vector may be seen as a "${g}"M"${n}" x "${g}"N"$n" matrix and used in those +\n particular functions/operators: +\n '"${c}"*"$n"' (matrix-vector multiplication), '"${c}"det(A)"$n"' (determinant), '"${c}"diag(V)"$n"' + (diagonal matrix \n from a vector), '"${c}"eig(A)"$n"' (eigenvalues/eigenvectors), '"${c}"eye(n)"$n"' (n x n identity matrix), -\n '"${c}"inv(A)"$n"' (matrix inverse), '"${c}"mul(A,B,_nb_colsB)"$n"' (matrix-matrix multiplication), -\n '"${c}"pseudoinv(A,_nb_colsA)"$n"', '"${c}"rot(u,v,w,angle)"$n"' (3D rotation matrix), '"${c}"rot(angle)"$n"' (2D -\n rotation matrix), '"${c}"solve(A,B,_nb_colsB)"$n"' (least-square solver of linear system A.X = B), +\n '"${c}"invert(A,_solver)"$n"' (matrix inverse), '"${c}"mul(A,B,_nb_colsB)"$n"' (matrix-matrix multiplication), +\n '"${c}"pseudoinvert(A,_nb_colsA,_solver)"$n"', '"${c}"rot(u,v,w,angle)"$n"' (3D rotation matrix), + '"${c}"rot(angle)"$n"' (2D +\n rotation matrix), '"${c}"solve(A,B,_nb_colsB)"$n"' (solver of linear system A.X = B), \n '"${c}"svd(A,_nb_colsA)"$n"' (singular value decomposition), '"${c}"trace(A)"$n"' (matrix trace) and -\n '"${c}"transp(A,nb_colsA)"$n"' (matrix transpose). Argument '"${c}"nb_colsB"$n"' may be omitted if it is +\n '"${c}"transpose(A,nb_colsA)"$n"' (matrix transpose). Argument '"${c}"nb_colsB"$n"' may be omitted if it is \n equal to "${g}"1"$n". +\n . '"${c}"mproj(S,nb_colsS,D,nb_colsD,method,max_iter,max_residual)"$n"' projects a matrix "${g}"S"$n" onto +\n a dictionnary (matrix) "${g}"D"$n". Equivalent to command '"${c}"mproj"$n"' but inside the math evaluator. \n . Specifying a vector-valued math expression as an argument of a command that operates on \n image values (e.g. '"${c}"fill"$n"') modifies the whole spectrum range of the processed image(s), \n for each spatial coordinates "${g}"(x,y,z)"$n". The command does not loop over the "${g}"C"$n"-axis in this @@ -824,22 +961,23 @@ \n _ "${g}"String manipulation:"$n" Character strings are defined and managed as vectors objects. \n Dedicated functions and initializers to manage strings are \n -\n . "${c}"[ 'string' ]"$n" and "${c}"'string'"$n" define a vector whose values are the ascii codes of the +\n . "${c}"[ 'string' ]"$n" and "${c}"'string'"$n" define a vector whose values are the character codes of the \n specified "${g}"character string"$n" (e.g. "${c}"'foo'"$n" is equal to "${g}"[ 102,111,111 ]"$n"). -\n . "${c}"_'character'"$n" returns the (scalar) ascii code of the specified character (e.g. "${c}"_'A'"$n" is +\n . "${c}"_'character'"$n" returns the (scalar) byte code of the specified character (e.g. "${c}"_'A'"$n" is \n equal to "${g}"65"$n"). -\n . A special case happens for "${g}"empty"$n" strings: Values of both expressions "${c}"[ '' ]"$n" and "${c}"''"$n" are "${g}"0"$n". +\n . A special case happens for "${g}"empty"$n" strings: Values of both expressions "${c}"[ '' ]"$n" and "\ +${c}"''"$n" are "${g}"0"$n". \n . Functions '"${c}"lowercase()"$n"' and '"${c}"uppercase()"$n"' return string with all string characters \n lowercased or uppercased. -\n . Function '"${c}"stov(str,_starting_indice,_is_strict)"$n"' parses specified string '"${c}"str"$n"' and returns the value -\n contained in it. +\n . Function '"${c}"stov(str,_starting_index,_is_strict)"$n"' parses specified string '"${c}"str"$n"' and +\n returns the value contained in it. \n . Function '"${c}"vtos(expr,_nb_digits,_siz)"$n"' returns a vector of size '"${c}"siz"$n"' which contains -\n the ascii representation of values described by expression '"${c}"expr"$n"'. +\n the character representation of values described by expression '"${c}"expr"$n"'. \n '"${c}"nb_digits"$n"' can be "${g}"{ -1=auto-reduced | 0=all | >0=max number of digits }"$n". \n . Function '"${c}"echo(str1,str2,...,strN)"$n"' prints the concatenation of given string arguments \n on the console. -\n . Function '"${c}"cats(str1,str2,...,strN,siz)"$n"' returns the concatenation of given string arguments -\n as a new vector of size '"${c}"siz"$n"'. +\n . Function '"${c}"string(_#siz,str1,str2,...,strN)"$n"' generates a vector corresponding to the +\n concatenation of given string/number arguments. \n \n _ "${g}"Special operators"$n" can be used: \n @@ -851,18 +989,22 @@ \n '"${c}"t=cos(x);3*t^2+2*t+1"$n"'. \n These variables remain "${g}"local"$n" to the mathematical parser and cannot be accessed outside \n the evaluated expression. -\n . Variables defined in math parser may have a "${g}"constant"$n" property, by specifying keyword "${c}"const"$n" -\n before the variable name (e.g. "${c}"const foo = pi/4;"$n"). The value set to such a variable must -\n be indeed a "${c}"constant scalar"$n". Constant variables allows certain types of optimizations in -\n the math JIT compiler. +\n . Variables defined in math parser may have a "${g}"constant"$n" property, by specifying keyword +\n '"${c}"const"$n"' before the variable name (e.g. '"${c}"const foo = pi/4;"$n"'). +\n The value set to such a variable must be indeed a "${c}"constant scalar"$n". +\n Constant variables allows certain types of optimizations in the math JIT compiler. \n \n _ The following "${g}"specific functions"$n" are also defined: \n -\n . '"${c}"u(max)"$n"' or '"${c}"u(min,max)"$n"': return a random value between "${g}"[0,max]"$n" or "${g}"[min,max]"$n", following +\n . '"${c}"u(max)"$n"' or '"${c}"u(min,max)"$n"': return a random value between "${g}"[0,max]"$n" or "\ +${g}"[min,max]"$n", following \n a uniform distribution. +\n . '"${c}"f2ui(value)"$n"' and '"${c}"ui2f(value)"$n"': Convert a large unsigned integer as a negative +\n floating point value (and vice-versa), so that 32bits floats can be used to store large +\n integers while keeping a unitary precision. \n . '"${c}"i(_a,_b,_c,_d,_interpolation_type,_boundary_conditions)"$n"': return the value of the pixel \n located at position "${g}"(a,b,c,d)"$n" in the associated image, if any ("${g}"0"$n" otherwise). -\n '"${g}"interpolation_type"$n"' can be "${g}"{ 0=nearest neighbor | other=linear }"$n". +\n '"${g}"interpolation_type"$n"' can be "${g}"{ 0=nearest neighbor | 1=linear | 2=cubic }"$n". \n '"${g}"boundary_conditions"$n"' can be "${g}"{ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }"$n". \n Omitted coordinates are replaced by their default values which are respectively \n "${c}"x, y, z, c, interpolation"$n" and "${c}"boundary"$n". @@ -877,82 +1019,119 @@ \n coordinates "${g}"(x,y,z,c)"$n". \n . '"${c}"i(#ind,_x,_y,_z,_c,_interpolation,_boundary_conditions)"$n"', \n '"${c}"j(#ind,_dx,_dy,_dz,_dc,_interpolation,_boundary_conditions)"$n"', -\n '"${c}"i[#ind,offset,_boundary_conditions]"$n"' and '"${c}"i[offset,_boundary_conditions]"$n"' are similar expressions used to -\n access pixel values for any numbered image "${g}"[ind]"$n" of the list. -\n . '"${c}"I/J[offset,_boundary_conditions]"$n"' and '"${c}"I/J(#ind,_x,_y,_z,_interpolation,_boundary_conditions)"$n"' do -\n the same as '"${c}"i/j[offset,_boundary_conditions]"$n"' and -\n '"${c}"i/j(#ind,_x,_y,_z,_c,_interpolation,_boundary_conditions)"$n"' but return a vector instead of a scalar -\n (e.g. a vector "${g}"[ R,G,B ]"$n" for a pixel at "${g}"(a,b,c)"$n" in a color image). +\n '"${c}"i[#ind,offset,_boundary_conditions]"$n"' and '"${c}"i[offset,_boundary_conditions]"$n"' are similar +\n expressions used to access pixel values for any numbered image "${g}"[ind]"$n" of the list. +\n . '"${c}"I/J[offset,_boundary_conditions]"$n"' and +\n '"${c}"I/J(#ind,_x,_y,_z,_interpolation,_boundary_conditions)"$n"' do the same as +\n '"${c}"i/j[offset,_boundary_conditions]"$n"' and +\n '"${c}"i/j(#ind,_x,_y,_z,_c,_interpolation,_boundary_conditions)"$n"' but return a vector instead +\n of a scalar (e.g. a vector "${g}"[ R,G,B ]"$n" for a pixel at "${g}"(a,b,c)"$n" in a color image). \n . '"${c}"sort(#ind,_is_increasing,_axis)"$n"' sorts the values in the specified image "${g}"[ind]"$n". -\n . '"${c}"crop(_#ind,_x,_y,_z,_c,_dx,_dy,_dz,_dc,_boundary_conditions)"$n"' returns a vector whose values come -\n from the cropped region of image "${g}"[ind]"$n" (or from default image selected if '"${c}"ind"$n"' is not -\n specified). Cropped region starts from point "${g}"(x,y,z,c)"$n" and has a size of +\n . '"${c}"crop(_#ind,_x,_y,_z,_c,_dx,_dy,_dz,_dc,_boundary_conditions)"$n"' returns a vector whose +\n values come from the cropped region of image "${g}"[ind]"$n" (or from default image selected if +\n '"${c}"ind"$n"' is not specified). Cropped region starts from point "${g}"(x,y,z,c)"$n" and has a size of \n "${g}"dx x dy x dz x dc"$n". Arguments for coordinates and sizes can be omitted if they are not \n ambiguous (e.g. '"${c}"crop(#ind,x,y,dx,dy)"$n"' is a valid invocation of this function). -\n . '"${c}"draw(_#ind,S,x,y,z,c,dx,_dy,_dz,_dc,_opacity,_M,_max_M)"$n"' draws a sprite "${g}"S"$n" in image "${g}"[ind]"$n" +\n . '"${c}"draw(_#ind,S,x,y,z,c,dx,_dy,_dz,_dc,_opacity,_M,_max_M)"$n"' draws a sprite "${g}"S"$n" in image "\ +${g}"[ind]"$n" \n (or in default image selected if '"${c}"ind"$n"' is not specified) at coordinates "${g}"(x,y,z,c)"$n". \n The size of the sprite "${g}"dx x dy x dz x dc"$n" must be specified. You can also specify a \n corresponding opacity mask "${g}"M"$n" if its size matches "${g}"S"$n". -\n . '"${c}"polygon(_#ind,nb_vertices,coords,_opacity,_color)"$n"' draws a filled polygon in image "${g}"[ind]"$n" -\n (or in default image selected if '"${c}"ind"$n"' is not specified) at specified coordinates. +\n . '"${c}"polygon(_#ind,nb_vertices,coords,_opacity,_color)"$n"' draws a filled polygon +\n in image "${g}"[ind]"$n" (or in default image selected if '"${c}"ind"$n"' is not specified) +\n at specified coordinates. It draws a single line if '"${c}"nb_vertices"$n"' is set to 2. +\n . '"${c}"polygon(_#ind,-nb_vertices,coords,_opacity,_pattern,_color)"$n"' draws a outlined polygon +\n in image "${g}"[ind]"$n" (or in default image selected if '"${c}"ind"$n"' is not specified) +\n at specified coordinates and with specified line pattern. \n It draws a single line if '"${c}"nb_vertices"$n"' is set to 2. -\n . '"${c}"ellipse(_#ind,xc,yc,radius1,_radius2,_angle,_opacity,_color)"$n"' draws a filled ellipse in image "${g}"[ind]"$n" -\n (or in default image selected if '"${c}"ind"$n"' is not specified) with specified coordinates and geometry. -\n . '"${c}"resize(#ind,w,_h,_d,_s,_interp,_boundary_conditions,cx,_cy,_cz,_cc)"$n"' resizes an image of the -\n associated list with specified dimension and interpolation method. When using this, +\n . '"${c}"ellipse(_#ind,xc,yc,radius1,_radius2,_angle,_opacity,_color)"$n"' draws a filled ellipse +\n in image "${g}"[ind]"$n" (or in default image selected if '"${c}"ind"$n"' is not specified) +\n with specified coordinates. +\n . '"${c}"ellipse(_#ind,xc,yc,-radius1,-_radius2,_angle,_opacity,_pattern,_color)"$n"' draws an +\n outlined ellipse in image "${g}"[ind]"$n" (or in default image selected if '"${c}"ind"$n"' is not \ +specified). +\n . '"${c}"resize(#ind,w,_h,_d,_s,_interp,_boundary_conditions,_cx,_cy,_cz,_cc)"$n"' resizes an image +\n of the associated list with specified dimension and interpolation method. When using this \n function, you should consider retrieving the (non-constant) image dimensions using the -\n dynamic functions '"${c}"w(_#ind)"$n"', '"${c}"h(_#ind)"$n"', '"${c}"d(_#ind)"$n"', '"${c}"s(_#ind)"$n"', '"${c}"wh(_#ind)"$n"', +\n dynamic functions '"${c}"w(_#ind)"$n"', '"${c}"h(_#ind)"$n"', '"${c}"d(_#ind)"$n"', '"${c}"s(_#ind)"$n"', + '"${c}"wh(_#ind)"$n"', \n '"${c}"whd(_#ind)"$n"' and '"${c}"whds(_#ind)"$n"' instead of the corresponding constant variables. -\n . '"${c}"if(condition,expr_then,_expr_else)"$n"': return value of '"${c}"expr_then"$n"' or '"${c}"expr_else"$n"', -\n depending on the value of '"${c}"condition"$n"' "${g}"(0=false, other=true)"$n". '"${c}"expr_else"$n"' can be omitted +\n . '"${c}"if(condition,expr_then,_expr_else)"$n"': return value of '"${c}"expr_then"$n"' or '"\ +${c}"expr_else"$n"', +\n depending on the value of '"${c}"condition"$n"' "${g}"(0=false, other=true)"$n". '"${c}"expr_else"$n"' + can be omitted \n in which case "${g}"0"$n" is returned if the condition does not hold. Using the ternary operator \n '"${c}"condition?expr_then[:expr_else]"$n"' gives an equivalent expression. -\n For instance, "${-GMIC}" commands '"${c}"fill if(x%10==0,255,i)"$n"' and '"${c}"fill x%10?i:255"$n"' both draw -\n blank vertical lines on every 10th column of an image. -\n . '"${c}"do(expression,_condition)"$n"' repeats the evaluation of '"${c}"expression"$n"' until '"${c}"condition"$n"' +\n For instance, "${-GMIC}" commands '"${c}"fill if(x%10==0,255,i)"$n"' and '"${c}"fill x%10?i:255"$n"' +\n both draw blank vertical lines on every 10th column of an image. +\n . '"${c}"do(expression,_condition)"$n"' repeats the evaluation of '"${c}"expression"$n"' until '"\ +${c}"condition"$n"' \n vanishes (or until '"${c}"expression"$n"' vanishes if no '"${c}"condition"$n"' is specified). For instance, \n the expression: '"${c}"if(N<2,N,n=N-1;F0=0;F1=1;do(F2=F0+F1;F0=F1;F1=F2,n=n-1))"$n"' returns \n the Nth value of the Fibonacci sequence, for "${g}"N>=0"$n" (e.g., "${g}"46368"$n" for "${g}"N=24"$n"). \n '"${c}"do(expression,condition)"$n"' always evaluates the specified expression at least once, \n then check for the loop condition. When done, it returns the last value of '"${c}"expression"$n"'. \n . '"${c}"for(init,condition,_procedure,body)"$n"' first evaluates the expression '"${c}"init"$n"', then -\n iteratively evaluates '"${c}"body"$n"' (followed by '"${c}"procedure"$n"' if specified) while '"${c}"condition"$n"' +\n iteratively evaluates '"${c}"body"$n"' (followed by '"${c}"procedure"$n"' if specified) while + '"${c}"condition"$n"' \n is verified (i.e. not zero). It may happen that no iteration is done, in which case the \n function returns "${g}"nan"$n". Otherwise, it returns the last value of '"${c}"body"$n"'. \n For instance, the expression: '"${c}"if(N<2,N,for(n=N;F0=0;F1=1,n=n-1,F2=F0+F1;F0=F1;F1=F2))"$n"' -\n returns the "${g}"Nth"$n" value of the Fibonacci sequence, for "${g}"N>=0"$n" (e.g., "${g}"46368"$n" for "${g}"N=24"$n"). +\n returns the "${g}"Nth"$n" value of the Fibonacci sequence, for "${g}"N>=0"$n" (e.g., "${g}"46368"$n" for "\ +${g}"N=24"$n"). \n . '"${c}"while(condition,expression)"$n"' is exactly the same as '"${c}"for(init,condition,expression)"$n"' \n without the specification of an initializing expression. \n . '"${c}"break()"$n"' and '"${c}"continue()"$n"' respectively breaks and continues the current running bloc \n (loop, init or main environment). -\n . '"${c}"fsize(filename)"$n"' returns the size of the specified 'filename' (or '-1' if file does not exist). -\n . '"${c}"date(attr,path)"$n"' returns the date attribute for the given 'path' (file or directory), +\n . '"${c}"fsize('filename')"$n"' returns the size of the specified 'filename' +\n (or '-1' if file does not exist). +\n . '"${c}"date(attr,'path')"$n"' returns the date attribute for the given 'path' (file or directory), \n with '"${g}"attr"$n"' being "${g}"{ 0=year | 1=month | 2=day | 3=day of week | 4=hour | 5=minute | \n 6=second }"$n", or a vector of those values. -\n . '"${c}"date(_attr)"$n" returns the specified attribute for the current (locale) date. -\n . '"${c}"print(expr1,expr2,...)"$n" or '"${c}"print(#ind)"$n" prints the value of the specified expressions +\n . '"${c}"date(_attr)"$n"' returns the specified attribute for the current (locale) date +\n (attributes being "$g"{ 0...6=same meaning as above | 7=milliseconds }"$n"). +\n . '"${c}"print(expr1,expr2,...)"$n"' or '"${c}"print(#ind)"$n"' prints the value of the specified expressions \n (or image information) on the console, and returns the value of the last expression \n (or "${g}"nan"$n" in case of an image). Function '"${c}"prints(expr)"$n"' also prints the string composed -\n of the ascii characters defined by the vector-valued expression (e.g. '"${c}"prints('Hello')"$n"'). -\n . '"${c}"debug(expression)"$n" prints detailed debug information about the sequence of operations done +\n of the character codes defined by the vector-valued expression (e.g. '"${c}"prints('Hello')"$n"'). +\n . '"${c}"debug(expression)"$n"' prints detailed debug info about the sequence of operations done \n by the math parser to evaluate the expression (and returns its value). -\n . '"${c}"display(_X,_w,_h,_d,_s)"$n" or '"${c}"display(#ind)"$n" display the contents of the vector '"${c}"X"$n"' +\n . '"${c}"display(_X,_w,_h,_d,_s)"$n"' or '"${c}"display(#ind)"$n"' display the contents of the vector + '"${c}"X"$n"' \n (or specified image) and wait for user events. if no arguments are provided, a memory \n snapshot of the math parser environment is displayed instead. -\n . '"${c}"begin(expression)"$n" and '"${c}"end(expression)"$n" evaluates the specified expressions only once, +\n . '"${c}"begin(expression)"$n"' and '"${c}"end(expression)"$n"' evaluates the specified expressions only once, \n respectively at the beginning and end of the evaluation procedure, and this, \n even when multiple evaluations are required (e.g. in '"${c}"fill \">begin(foo = 0); ++foo\""$n"'). -\n . '"${c}"copy(dest,src,_nb_elts,_inc_d,_inc_s,_opacity)"$n" copies an entire memory block of '"${c}"nb_elts"$n"' -\n elements starting from a source value '"${c}"src"$n"' to a specified destination '"${c}"dest"$n"', with -\n increments defined by '"${c}"inc_d"$n"' and '"${c}"inc_s"$n"' respectively for the destination and source -\n pointers. -\n . '"${c}"stats(_#ind)"$n" returns the statistics vector of the running image '"${c}"[ind]"$n"', i.e the vector +\n . '"${c}"copy(dest,src,_nb_elts,_inc_d,_inc_s,_opacity)"$n"' copies an entire memory block of +\n '"${c}"nb_elts"$n"' elements starting from a source value '"${c}"src"$n"' to a specified destination +\n '"${c}"dest"$n"', with increments defined by '"${c}"inc_d"$n"' and '"${c}"inc_s"$n"' respectively for +\n the destination and source pointers. +\n . '"${c}"stats(_#ind)"$n"' returns the statistics vector of the running image '"${c}"[ind]"$n"', i.e the vector \n "${g}"[ im,iM,ia,iv,xm,ym,zm,cm,xM,yM,zM,cM,is,ip ]"$n" (14 values). -\n . '"${c}"unref(a,b,...)"$n" destroys references to the named variable given as arguments. -\n . '"${c}"breakpoint()"$n" inserts a possible computation breakpoint (not supported by the cli interface). -\n . '"${c}"_(expr)"$n" just ignores its arguments (mainly useful for debugging). -\n . '"${c}"ext('pipeline')"$n" executes the specified "${-GMIC}" pipeline as if it was called outside +\n . '"${c}"ref(expr,a)"$n"' references specified expression '"${g}"expr"$n"' as variable name '"${g}"a"$n"'. +\n . '"${c}"unref(a,b,...)"$n"' destroys references to the named variable given as arguments. +\n . '"${c}"breakpoint()"$n"' inserts a possible computation breakpoint (useless with the cli interface). +\n . '"${c}"_(expr)"$n"' just ignores its arguments (mainly useful for debugging). +\n . '"${c}"run('pipeline')"$n"' executes the specified "${-GMIC}" pipeline as if it was called outside \n the currently evaluated expression. +\n . '"${c}"store(A,'varname',_w,_h,_d,_s,_is_compressed)"$n"' transfers the data of vector '"${g}"A"${n}"' as a +\n '"${g}"w x h x d x s"$n"' image to the "${-GMIC}" variable '"${g}"$varname"$n"'. Thus, the data becomes +\n available outside the math expression (that is equivalent to using the regular command +\n '"${c}"store"${n}"', but directly in the math expression). +\n . '"${c}"name(_#ind,size)"$n"' returns a vector of size "${g}"size"$n", whose values are the characters +\n codes of the name of image "${c}"[ind]"$n" (or default image selected if '"${c}"ind"$n"' is not specified). +\n . '"${c}"setname(_#ind,string)"$n"' sets the name of image "${c}"[ind]"$n" (or default image selected if +\n '"${c}"ind"$n"' is not specified). +\n . '"${c}"correlate(I,wI,hI,dI,sI,K,wK,hK,dK,sK,_boundary_conditions,_is_normalized,_channel_mode, +\n _xcenter,_ycenter,_zcenter,_xstart,_ystart,_zstart,_xend,_yend,_zend, +\n _xstride,_ystride,_zstride,_xdilation,_ydilation,_zdilation)"$n"' +\n returns the correlation, unrolled as a vector, of the \ + "${g}"wI"${n}" x "${g}"hI"${n}" x "${g}"dI"${n}" x "${g}"sI"${n}"-sized image "${g}"I"$n" +\n with the "${g}"wK"${n}" x "${g}"hK"${n}" x "${g}"dK"${n}" x "${g}"sK"${n}"-sized kernel "${g}"K"$n" + (the meaning of the other arguments are the +\n same as in command '"${c}"correlate"$n"'). Similar function '"${c}"convolve(...)"$n"' is also defined for +\n computing the convolution between "${g}"I"$n" and "${g}"K"$n". \n \n - "${g}"User-defined macros:"$n" \n @@ -968,8 +1147,10 @@ \n than expected value '"${g}"2"$n"'. \n . When substituted, macro arguments are placed inside parentheses, except if a number sign \n '"${c}"#"$n"' is located just before or after the argument name. For instance, expression -\n '"${c}"foo(x,y) = x*y; foo(1+2,3)"$n"' returns '"${g}"9"$n"' (being substituted as '"${c}"(1+2)*(3)"$n"'), while -\n expression '"${c}"foo(x,y) = x#*y#; foo(1+2,3)"$n"' returns '"${g}"7"$n"' (being substituted as '"${c}"1+2*3"$n"'). +\n '"${c}"foo(x,y) = x*y; foo(1+2,3)"$n"' returns '"${g}"9"$n"' (being substituted as + '"${c}"(1+2)*(3)"$n"'), while +\n expression '"${c}"foo(x,y) = x#*y#; foo(1+2,3)"$n"' returns '"${g}"7"$n"' (being substituted as + '"${c}"1+2*3"$n"'). \n . Number signs appearing between macro arguments function actually count for '"${c}"empty"$n"' \n separators. They may be used to force the substitution of macro arguments in unusual \n places, e.g. as in '"${c}"str(N) = ['I like N#'];"$n"'. @@ -988,61 +1169,91 @@ \n '"${c}"i(), i[], j()"$n"' and '"${c}"j[]"$n"' return values of the image being currently modified, \n in forward ('"${c}">"$n"') or backward ('"${c}"<"$n"') order. The multi-threading evaluation of the \n expression is also disabled in this case. -\n . Function '"${c}"critical(operands)"$n"' forces the execution of the given operands in a single thread at a -\n time. +\n . Function '"${c}"critical(operands)"$n"' forces the execution of the given operands in a single +\n thread at a time. +\n . '"${c}"begin_t(expression)"$n"' and '"${c}"end_t(expression)"$n"' evaluates the specified expressions once +\n for each running thread (so possibly several times) at the beginning and the end of the +\n evaluation procedure. +\n . '"${c}"merge(variable,operator)"$n"' tells to merge the local variable value computed by threads, +\n with the specified operator, when all threads have finished computing. \n -\n _ Expressions '"${c}"i(_#ind,x,_y,_z,_c)=value"$n"', '"${c}"j(_#ind,x,_y,_z,_c)=value"$n"', '"${c}"i[_#ind,offset]=value"$n"' +\n _ Expressions '"${c}"i(_#ind,x,_y,_z,_c)=value"$n"', '"${c}"j(_#ind,x,_y,_z,_c)=value"$n"', + '"${c}"i[_#ind,offset]=value"$n"' \n and '"${c}"j[_#ind,offset]=value"$n"' set a pixel value at a different location than the running one \n in the image "${g}"[ind]"$n" (or in the associated image if argument '"${c}"#ind"$n"' is omitted), either with \n global coordinates/offsets (with '"${c}"i(...)"$n"' and '"${c}"i[...]"$n"'), or relatively to the current -\n position "${g}"(x,y,z,c)"$n" (with '"${c}"j(...)"$n"' and '"${c}"j[...]"$n"'). These expressions always return '"${c}"value"$n"'. +\n position "${g}"(x,y,z,c)"$n" (with '"${c}"j(...)"$n"' and '"${c}"j[...]"$n"'). These expressions always + return '"${c}"value"$n"'. \n \n - The last image of the list is always associated to the evaluations of '"${c}"{expressions}"$n"', \n e.g. "${-GMIC}" sequence '"${c}"256,128 fill {w}"$n"' will create a 256x128 image filled with value 256." - _help_section "Image and data viewers" + _help_section "Image and Data Viewers" - _help_paragraph " - "${-GMIC}" has some very handy embedded "${g}"visualization modules"$n", for 1D signals (command '"${c}"plot"$n"'), + _help_paragraph " - "${-GMIC}" has some very handy embedded "${g}"visualization modules"$n", for 1D signals + (command '"${c}"plot"$n"'), \n 1D/2D/3D images (command '"${c}"display"$n"') and 3D objects (command '"${c}"display3d"$n"'). It manages \n interactive views of the selected image data. \n -\n - The following keyboard shortcuts are available in the interactive viewers: +\n - The following actions are available in the interactive viewers: \n \n . "${g}"(mousewheel)"$n": Zoom in/out. +\n . "${g}"ESC"$n": Close window. \n . "${g}"CTRL+D"$n": Increase window size. \n . "${g}"CTRL+C"$n": Decrease window size. \n . "${g}"CTRL+R"$n": Reset window size. -\n . "${g}"CTRL+W"$n": Close window. \n . "${g}"CTRL+F"$n": Toggle fullscreen mode. -\n . "${g}"CTRL+S"$n": Save current window snapshot as numbered file 'gmic_xxxx.bmp'. -\n . "${g}"CTRL+O"$n": Save current instance of the viewed data, as numbered file 'gmic_xxxx.cimgz'. +\n . "${g}"CTRL+S"$n": Save current view as a numbered file 'gmic_xxxx.ext'. +\n . "${g}"CTRL+O"$n": Save copy of the viewed data, as a numbered file 'gmic_xxxx.ext'. \n -\n - Shortcuts specific to the 1D/2D/3D image viewer (command '"${c}"display"$n"') are: +\n - Actions specific to the 1D/2D image viewer (command '"${c}"display"$n"') are: \n -\n . "${g}"CTRL+A"$n": Switch cursor mode. -\n . "${g}"CTRL+P"$n": Play z-stack of frames as a movie (for volumetric 3D images). -\n . "${g}"CTRL+V"$n": Show/hide 3D view (for volumetric 3D images). +\n . "${g}"Left mouse button"$n": Create an image selection and zoom into it. +\n . "${g}"Middle mouse button"$n", or "${g}"CTRL+left mouse button"$n": Move image. +\n . "${g}"Mouse wheel"$n" or "${g}"PADD+/-"$n": Zoom in/out. +\n . "${g}"Arrow keys:"$n" Move image left/right/up/down. +\n . "${g}"CTRL+A"$n": Enable/disable transparency (show alpha channel). +\n . "${g}"CTRL+N"$n": Change normalization mode (can be 'none', 'normal' or 'channel-by-channel'). +\n . "${g}"CTRL+SPACE"$n": Reset view. +\n . "${g}"CTRL+X"$n": Show/hide axes. +\n . "${g}"CTRL+Z"$n": Hold/release aspect ratio. +\n +\n - Actions specific to the 3D volumetric image viewer (command '"${c}"display"$n"') are: +\n +\n . "${g}"CTRL+P"$n": Play z-stack of frames as a movie. +\n . "${g}"CTRL+V"$n": Show/hide 3D view on bottom right zone. +\n . "${g}"CTRL+X"$n": Show/hide axes. \n . "${g}"CTRL+(mousewheel)"$n": Go up/down. \n . "${g}"SHIFT+(mousewheel)"$n": Go left/right. \n . "${g}"Numeric PAD"$n": Zoom in/out (+/-) and move through zoomed image (digits). \n . "${g}"BACKSPACE"$n": Reset zoom scale. \n -\n - Shortcuts specific to the 3D object viewer (command '"${c}"display3d"$n"') are: +\n - Actions specific to the 3D object viewer (command '"${c}"display3d"$n"') are: \n \n . "${g}"(mouse)+(left mouse button)"$n": Rotate 3D object. \n . "${g}"(mouse)+(right mouse button)"$n": Zoom 3D object. \n . "${g}"(mouse)+(middle mouse button)"$n": Shift 3D object. -\n . "${g}"CTRL+F1 ... CTRL+F6"$n": Toggle between different 3D rendering modes. -\n . "${g}"CTRL+Z"$n": Enable/disable z-buffered rendering. +\n . "${g}"F1 ... F6"$n": Toggle between different 3D rendering modes. +\n . "${g}"F7/F8"$n": Decrease/increase focale. +\n . "${g}"F9"$n": Select animation mode. +\n . "${g}"F10"$n": Select animation speed. +\n . "${g}"SPACE"$n": Start/stop animation. \n . "${g}"CTRL+A"$n": Show/hide 3D axes. +\n . "${g}"CTRL+B"$n": Switch between available background. \n . "${g}"CTRL+G"$n": Save 3D object, as numbered file 'gmic_xxxx.off'. -\n . "${g}"CTRL+T"$n": Switch between single/double-sided 3D modes." +\n . "${g}"CTRL+L"$n": Show/hide outline. +\n . "${g}"CTRL+P"$n": Print current 3D pose on stderr. +\n . "${g}"CTRL+T"$n": Switch between single/double-sided 3D modes. +\n . "${g}"CTRL+V"$n": Start animation with video output. +\n . "${g}"CTRL+X"$n": Show/hide 3D bounding box. +\n . "${g}"CTRL+Z"$n": Enable/disable z-buffered rendering." - _help_section "Adding custom commands" + _help_section "Adding Custom Commands" - _help_paragraph " - New custom commands can be added by the user, through the use of "${-GMIC}" "${g}"custom commands files"$n". + _help_paragraph " - New custom commands can be added by the user, through the use of "${-GMIC}" "\ +${g}"custom commands files"$n". \n -\n - A command file is a simple ascii text file, where each line starts either by +\n - A command file is a simple text file, where each line starts either by \n '"${c}"command_name: command_definition"$n"' or '"${c}"command_definition (continuation)"$n"'. \n \n - At startup, "${-GMIC}" automatically includes user's command file "${g}"$HOME/.gmic"$n" (on Unix) or @@ -1059,14 +1270,15 @@ \n . '"${c}"$""\*"$n"' is substituted by a copy of the specified string of arguments. \n . '"${c}"$\"*\""$n"' is substituted by a copy of the specified string of arguments, each being \n double-quoted. -\n . '"${c}"$""#"$n"' is substituted by the maximum indice of known arguments (either specified by the user +\n . '"${c}"$""#"$n"' is substituted by the maximum index of known arguments (either specified by the user \n or set to a default value in the custom command). -\n . '"${c}"$""[]"$n"' is substituted by the list of selected image indices that have been specified during the +\n . '"${c}"$""[]"$n"' is substituted by the list of selected image indices that have been specified in the \n command invocation. \n . '"${c}"$""?"$n"' is substituted by a printable version of '"${c}"$""[]"$n"' to be used in command descriptions. -\n . '"${c}"$i"$n"' and '"${c}"${i}"$n"' are both substituted by the "${g}"i^th"$n" specified argument. Negative indices such as -\n '"${c}"${-j}"$n"' are allowed and refer to the "${g}"j^th"$n" latest argument. '"${c}"$""0"$n"' is substituted by the -\n custom command name. +\n . '"${c}"$i"$n"' and '"${c}"${i}"$n"' are both substituted by the "${g}"i^th"$n" specified argument. + Negative indices such as +\n '"${c}"${-j}"$n"' are allowed and refer to the "${g}"j^th"$n" latest argument. '"${c}"$""0"$n"' is substituted +\n by the custom command name. \n . '"${c}"${i=default}"$n"' is substituted by the value of "${c}"$i"$n" (if defined) or by its new value set to \n '"${g}"default"$n"' otherwise ('"${g}"default"$n"' may be a $-expression as well). \n . '"${c}"${subset}"$n"' is substituted by the argument values (separated by commas '"${g}","$n"') of a specified @@ -1091,22 +1303,25 @@ \n - If one numbered argument required by a custom command misses a value, an error is thrown by the \n "${-GMIC}" interpreter." - _help_section "List of commands" + _help_section "List of Commands" _help_paragraph " All available "${-GMIC}" commands are listed below, classified by themes. When several choices of \n command arguments are possible, they appear separated by '"${g}"|"$n"'. An argument specified inside '"${g}"[]"$n"' -\n or starting by '"${g}"_"$n"' is optional except when standing for an existing image "${c}"[image]"$n", where '"${g}"image"$n"' -\n can be either an indice number or an image name. In this case, the '"${g}"[]"$n"' characters are mandatory -\n when writing the item. A command marked with '"${g}"(+)"$n"' is one of the "${g}"builtin"$n" commands. Note also that -\n all images that serve as illustrations in this reference documentation are normalized in "${g}"[0,255]"$n" -\n before being displayed. You may need to do this explicitly (command '"${c}"normalize 0,255"$n"') if you -\n want to save and view images with the same aspect than those illustrated in the example codes." +\n or starting by '"${g}"_"$n"' is optional except when standing for an existing image "${c}"[image]"$n", where '"\ +${g}"image"$n"' +\n can be either an index number or an image name. In this case, the '"${g}"[]"$n"' characters are mandatory +\n when writing the item. A command marked with '"${g}"(+)"$n"' is one of the "${g}"built-in"$n" commands. Note also +\n that all images that serve as illustrations in this reference documentation are normalized in +\n range "${g}"[0,255]"$n" before being displayed. You may need to do this explicitly (command +\n '"${c}"normalize 0,255"$n"') if you want to save and view images with the same aspect than those +\n illustrated in the example codes." _help_examples : g=$_gmic_g c=$_gmic_c n=$_gmic_n - _help_section "Examples of use" + _help_section "Examples of Use" - _help_paragraph " '"${g}"gmic"$n"' is a generic image processing tool which can be used in a wide variety of situations. + _help_paragraph " '"${g}"gmic"$n"' is a generic image processing tool which can be used in a wide variety + of situations. \n The few examples below illustrate possible uses of this tool: \n \n - View a list of images: @@ -1158,7 +1373,7 @@ \n "${c}"gmic apply_camera \\\"+mirror x +mirror y add div 4\\\""$n" \n \n - Launch a set of "${-GMIC}" interactive demos: -\n "${c}"gmic demo"$n" +\n "${c}"gmic demos"$n" \n" # Commands to output help in ascii format. @@ -1168,54 +1383,61 @@ _help_section "Usage" __help_header_ascii : - if {narg($_prerelease)} strprerelease=" (pre-release ""#"$_prerelease")" else strprerelease="" fi - str="\n "${_gmic_b}"gmic: GREYC\'s Magic for Image Computing."$_gmic_n" -\n -\n "$_gmic_g${_gmic_b}"Version "${-strver}$strprerelease$_gmic_n", Copyright (c) 2008-2019, David Tschumperle. -\n "$_gmic_g"(https://gmic.eu)"$_gmic_n - if {['$$_e']==0} m "_e : e[] \"$""*\"" fi - v + _e[] $str v - + v 0 + if $_prerelease strprerelease=" (pre-release ""#"$_prerelease")" else strprerelease="" fi + str="\n "${_gmic_b}"gmic: GREYC\'s Magic for Image Computing:"$_gmic_n" command-line interface +\n "$_gmic_g"(https://gmic.eu)"$_gmic_n" +\n "${_gmic_m}${_gmic_b}"Version "${-strver}$strprerelease$_gmic_n" +\n +\n Copyright (c) 2008-2020, David Tschumperlé / GREYC / CNRS. +\n "$_gmic_c"(https://www.greyc.fr)"$_gmic_n + +e[] $str _help_section_ascii : + v 0 _section+=1 {narg({'"$1"'})},1,1,1,{'-'} - v + - e[] "\n "$_gmic_m$_gmic_b$_section". $1" - e[] " "${_space{narg({'$_section'})}}{t}$_gmic_n"\n" - v - + +e[] "\n "$_gmic_m$_gmic_b$_section". $1" + +e[] " "${_space{narg({'$_section'})}}{t}$_gmic_n"\n" rm. _help_paragraph_ascii : - v + - e[] "$*" - v - + v 0 + +e[] "$*" _help_footer_ascii : - v + - e[] " "$_gmic_r$_gmic_b"** G\47MIC comes with ABSOLUTELY NO WARRANTY; for details visit: https://gmic.eu **"$_gmic_n - v - + v 0 + +e[] " "$_gmic_r$_gmic_b"** G\47MIC comes with ABSOLUTELY NO WARRANTY; for details visit: https://gmic.eu **"$_gmic_n # Commands to output help in html format. _help_header_html : + v 0 _section=0 - if {narg($_prerelease)} strprerelease=" (pre-release ""#"$_prerelease")" else strprerelease="" fi - _gmic_n="" - _gmic_r="" - _gmic_g="" - _gmic_m="" - _gmic_c="" - - v + --e[] " + if $_prerelease strprerelease=" (pre-release ""#"$_prerelease")" else strprerelease="" fi + _gmic_n="" + _gmic_r="" + _gmic_g="" + _gmic_m="" + _gmic_c="" + _gmic_b="" + _gmic_quotedc="" + _gmic_quotedg="" + +e[] " \n \n
\"\"
\n"') + ('"\n
Presets ("{narg({/$presets})}")
\n
\n
\n \n -\n\n" - repeat {narg({/$presets})} +\n\n"') + repeat narg({/$presets}) preset=${arg\ {1+$>},$presets} - ({'$preset'}) replace_seq. 39,"92,92,39" preset_esc={t} rm. + ('$preset') replace_seq. 39,"92,92,39" preset_esc={t} rm. + _title $preset title=${} + if $>%4==0 if $> ('"\n"') fi ('""') fi - title=${_title\ $preset} - if {$>%4==0} if $> string "\n" fi string "" fi - - string " + ('" \n\n" +
\n -
\"\"\n +
\"\"\n
Reference Image
\n
Reference Image
Reference Image
\n \n \n -
\n
\n \"\"\n \n
\n -\"\"\n +\"\"\n
\n -
Preset: "$title" [Download HaldCLUT]
\n +
Preset: "$title" +[Download HaldCLUT]
\n
"$title"
\n\n"') done - string " + ('"
\n -
\"\"
\n" - string "\n -\n" - a[$nb_samples--1] x o. raw:${category}_$basename.shtml,char rm. +
\"\"
\n"') + ('"\n +\n"') + a[$nb_samples--1] x ot. ${category}_$basename.shtml rm. done done @@ -3961,62 +5601,72 @@ rm category=${arg\ 1,$categories} x "ln -fs "${category}_$basename0.shtml" index.shtml" - v + e[] "\n > All done, for "$nb_presets" presets.\n" + if $1 + e[] "\n * Transfer color presets on G'MIC server.\n" + x "lftp ftp://"$GMIC_LOGIN":"$GMIC_PASSWD"@"$GMIC_FTP" -e \"mirror -eRL . /www/gmic/color_presets ; quit\"" + fi + e[] "\n > All done, for "$nb_presets" presets.\n" # Generate gallery page for the G'MIC website. # $1 = upload to G'MIC server, can be { 0 | 1 }. update_gallery_html : check "isbool(${1=0})" e[^-1] "Generate gallery pages for the G'MIC website." - v - use_vt100 # Check directory and clean in case of upload. - if {narg(${"files *"})} - if {narg(${"files *_full_*.jpg"})" && "\ - narg(${"files *_thumb_*.jpg"})" && "\ - narg(${"files *_original_*.jpg"})} + if narg(${"files *"}) + if narg(${"files *_full_*.jpg"})" && "\ + narg(${"files *_thumb_*.jpg"})" && "\ + narg(${"files *_original_*.jpg"}) if $1 x 0,"rm -f *" fi - else v + error[0--4] "Current folder should be empty!" + else error[0--4] "Current folder should be empty!" fi fi # Prepare folder structure. - v + e[] " * Prepare folder structure." v - - x "ln -fs ../copyright.html ." - x "ln -fs ../favicon.ico ." - x "ln -fs ../favicon.png ." - x "ln -fs ../footer.html ." - x "ln -fs ../header.html ." - x "ln -fs ../gmicmenu ." - x "ln -fs ../jquery-1.11.0.min.js ." - x "ln -fs ../style.css ." - x "ln -fs ../images ." - x "ln -fs ../highslide ." + HTML=$HOME/work/src/gmic/html + e[] " * Prepare folder structure." + x "ln -fs "$HTML"/copyright.html ." + x "ln -fs "$HTML"/favicon.ico ." + x "ln -fs "$HTML"/favicon.png ." + x "ln -fs "$HTML"/footer.html ." + x "ln -fs "$HTML"/header.html ." + x "ln -fs "$HTML"/jquery-1.11.0.min.js ." + x "ln -fs "$HTML"/style.css ." + x "ln -fs "$HTML"/images ." + x "ln -fs "$HTML"/highslide ." # Define categories and sample pictures. - categories=arrays,artistic,blackandwhite,colors,deformations,filtering,patterns,3drendering,stylization,codesamples + categories=arrays,artistic,blackandwhite,colors,deformations,filtering,patterns,3dmeshes,stylization,codesamples nb_categories={narg($categories)} - commands_arrays=gallery_arrays,array,array_fade,array_mirror,frame_blur,frame_cube,frame_painting,img2ascii,imagegrid,rotate_tiles,vignette,tunnel - commands_artistic=gallery_artistic,boxfitting,cartoon,cubism,draw_whirl,fractalize,halftone,sketchbw,light_relief,mosaic,linify,polaroid,polygonize,poster_hope,rodilius,stencil,stained_glass + commands_arrays=gallery_arrays,array,array_fade,array_mirror,frame_blur,frame_cube,frame_painting,img2ascii,\ + imagegrid,rotate_tiles,vignette,tunnel + commands_artistic=gallery_artistic,boxfitting,cartoon,cubism,draw_whirl,fractalize,halftone,sketchbw,light_relief,\ + mosaic,linify,polaroid,polygonize,poster_hope,rodilius,stencil,stained_glass commands_blackandwhite=gallery_blackandwhite,pencilbw,old_photo,sepia commands_colors=gallery_colors,solarize,hsv2rgb,transfer_rgb commands_deformations=gallery_deformations,deform,map_sphere,seamcarve,spherize,twirl,warp_perspective,water,wave - commands_filtering=gallery_filtering,blur_angular,blur_linear,blur_radial,glow,smooth,bilateral,dog,deriche,distance,gradient_norm,normalize_local,sharpen,solidify - commands_patterns=gallery_patterns,tsp,chessboard,mandelbrot,maze_mask,plasma,shape_fern,shape_snowflake,sierpinski,syntexturize_matchpatch,truchet,turbulence,watermark_visible,weave - commands_3drendering=gallery_3drendering,add3d,distribution3d,elevation3d,gmic3d,imageblocks3d,imagerubik3d,skeleton3d,spherical3d,tensors3d,text3d,torus3d,weird3d + commands_filtering=gallery_filtering,blur_angular,blur_linear,blur_radial,glow,smooth,bilateral,dog,deriche,\ + distance,gradient_norm,normalize_local,sharpen,solidify + commands_patterns=gallery_patterns,tsp,chessboard,mandelbrot,maze_mask,plasma,shape_fern,shape_snowflake,\ + sierpinski,syntexturize_matchpatch,truchet,turbulence,watermark_visible,weave + commands_3dmeshes=gallery_3dmeshes,add3d,distribution3d,elevation3d,gmic3d,imageblocks3d,imagerubik3d,\ + skeleton3d,spherical3d,tensors3d,text3d,torus3d,weird3d commands_stylization=gallery_stylization commands_codesamples=gallery_codesamples - pics=apples,bottles,butterfly,car,cat,cliff,david,dog,duck,eagle,elephant,earth,flower,fruits,greece,gummy,inside,landscape,leaf,leno,lion,mandrill,monalisa,parrots,pencils,rooster,rose,square,teddy,tiger,wall,waterfall,zelda + pics=apples,bottles,butterfly,car,cat,cliff,david,dog,duck,eagle,elephant,earth,flower,fruits,greece,gummy,inside,\ + landscape,leaf,leno,lion,mandrill,monalisa,parrots,pencils,rooster,rose,square,teddy,tiger,wall,waterfall,zelda # Generate HTML pages. - i raw:$HOME/work/src/gmic/src/gmic_stdlib.gmic,uchar + it[] $HOME/work/src/gmic/src/gmic_stdlib.gmic + merge_multiline_comments. s -,10 append_newline[^-1] a y nb_cols=3 repeat $nb_categories,ncat category=${arg\ 1+$>,$categories} - if {isfile($category.shtml)} continue fi - v + e[] "\n * Process category '"$_gmic_b$category$_gmic_n"'." v - + if isfile('{/$category.shtml}') continue fi + e[] "\n * Process category '"$_gmic_b$category$_gmic_n"'." commands=${commands_$category} nb_commands={narg($commands)} @@ -4024,7 +5674,7 @@ repeat $nb_categories cat=${arg\ 1+$>,$categories} - if {;'$cat'=='$category'} td_$cat="" + if '$cat'=='$category' td_$cat="" else td_$cat="" fi done @@ -4037,19 +5687,24 @@ "\n\n"\ "
Image gallery
\n"\ "
\n"\ - "This gallery gives a quick overview of the kind of features and generic filters available in the "\ - "G\47MIC open-source image processing framework.
\n"\ - "All the images below have been processed by the CLI interface gmic\n"\ + "

This gallery gives a quick overview of the kind of features and generic filters available in the "\ + "G\47MIC open-source image processing framework.

\n"\ + "

All the images below have been processed by the CLI interface "\ + "gmic\n"\ " of G\47MIC, from a set of initial 2D color images.\n"\ "Click on an image to enlarge it and display the G\47MIC command-line "\ - "used for the processing (note: to reproduce this, you may have to escape some characters, according to type of shell you use!).
\n"\ - "Remember, G\47MIC lets you define your own image pipelines through\n"\ + "used for the processing (note: to reproduce this, you may have to escape some characters, "\ + "according to the type of shell you use!).

\n"\ + "

Remember, G\47MIC lets you define your own image pipelines "\ + "through\n"\ "custom command files.\n"\ - "Your custom filters can be easily added afterwards in the plug-in for GIMP or "\ - "Krita.
\n\n"\ - "For more details, visit the tutorial pages as well as the "\ - "technical reference to get a full documentation on this software.\n"\ - "

\n

\n" + "Your custom filters can be easily added afterwards in the plug-in for "\ + "GIMP or "\ + "Krita.

\n\n"\ + "

For more details, visit the tutorial pages as well as the "\ + "technical reference to get a full documentation on this "\ + "software.\n"\ + "

\n
\n" html_menu="\n"\ $td_arrays"Arrays & Frames"\ @@ -4059,7 +5714,7 @@ $td_deformations"Deformations"\ $td_filtering"Filtering"\ $td_patterns"Patterns"\ - $td_3drendering"3D Rendering"\ + $td_3dmeshes"3D Meshes"\ $td_stylization"Stylization"\ $td_codesamples"Code samples"\ "
\n" @@ -4070,26 +5725,26 @@ repeat $nb_commands command=${"arg "1+$>,$commands} - is_stylization={;'$command'=='gallery_stylization'} + is_stylization={['$command']=='gallery_stylization'} - v + e[] $_gmic_m" - Command '"$_gmic_b$command$_gmic_n"' ["{1+$>}/$nb_commands"]."$_gmic_n v - + e[] $_gmic_m" - Command '"$_gmic_b$command$_gmic_n"' ["{1+$>}/$nb_commands"]."$_gmic_n +l # Parse command definition and examples s -,{'"#@cli "$command" :"'} - if {$!<2} s -,{'"#@cli "$command"\n"'} i[1] ({'\n'}) a[-2,-1] y fi - if {$!<2} v + warn[] " ** Command '"$command"' not found! **" v - + if $!<2 s -,{'"#@cli "$command"\n"'} i[1] ('\n') a[-2,-1] y fi + if $!<2 warn[] " ** Command '"$command"' not found! **" else k. eval " - str = crop(#-1); + ref(crop(#-1),str); ind = 0; - while ((ind = find(str,'\n#@cli ',1,ind))>=0, + while ((ind = find(str,'\n#@cli ',ind))>=0, ++ind; str[ind+6]!=_':' ? break() : str[ind+7]==_' ' && str[ind+8]==_'$' && str[ind+9]==_' '?( beg = ind + 10; - end = find(str,_'\n',1,beg) - 1; - com = vector1024(0); - ext('+rows[0] ',beg,',',end); + end = find(str,_'\n',beg) - 1; + ref(vector1024(0),com); + run('+rows[0] ',beg,',',end); ); ); "; @@ -4099,49 +5754,53 @@ repeat $nb_examples # For each example found example$nex={$>,t} - v + e[] $_gmic_g" $ "${example$nex}$_gmic_n v - + e[] $_gmic_g" $ "${example$nex}$_gmic_n sample=${"arg 1+"{($nex+8*$ncat)%narg($pics)},$pics} is_codesample=0 l[] # Create a HTML representation of the command - ({'${example$nex}'}) y - is_input={find(#-1,'image.jpg')>=0} + ('${example$nex}') y + is_input={"find(#-1,'image.jpg')>=0"} - if {!$is_input" && "find(#-1,'"sample "')>=0} + if !$is_input" && find(#-1,'sample ')>=0" s +,{'"sample "'} if {0,crop()=='"sample "'" && "$!>1} l[1] s +,{'" "'} - if {find(#0,_',')==-1} sample={0,t} is_input=1 fi + if "find(#0,_',')==-1" sample={0,t} is_input=1 fi a y endl fi a y fi - replace_str. "image.jpg",""$sample".png" + replace_str. "image.jpg",\ + ""$sample".png" replace_str. "_output_mode=1","" - l. s +,{'" "'} repeat $! if {$<,crop(0,0,1,5)=='_fps='||crop(0,0,1,7)=='_label='} # Discard '_fps=?' and '_label=?' + # Discard '_fps=?' and '_label=?' + l. s +,{'" "'} repeat $! if {$<,crop(0,0,1,5)=='_fps='||crop(0,0,1,7)=='_label='} rm[$<] fi done a y endl l. s +,{'" "'} repeat $! if {$<,crop(0,0,1,8)=='https://'} l[$<] # Add hyperlink - if {crop(0,0,1,24)=='https://gmic.eu/samples/'} + if crop(0,0,1,24)=='https://gmic.eu/samples/' is_codesample=1 basename_codesample={`crop(0,24,1,h-24)`} filename_codesample="../../resources/samples"/$basename_codesample url_codesample="https://gmic.eu/samples/"$basename_codesample - if $1 x "lftp ftp://"$GMIC_LOGIN":"$GMIC_PASSWD"@ftp.gmic.eu -e \"put -O /www/gmic/samples \\\""$filename_codesample"\\\"; quit\" >/dev/null" fi - i[0] ({'""'}) - else i[0] ({'""'}) + if $1 x "lftp ftp://"$GMIC_LOGIN":"$GMIC_PASSWD"@"$GMIC_FTP" -e \"put -O /www/gmic/samples \\\""\ + $filename_codesample"\\\"; quit\" >/dev/null" fi + i[0] ('""') + else i[0] ('""') fi - ({''}) y a y + ('') y a y endl fi done a y endl replaced_example$nex={t} rm endl - ({'${example$nex}'}) replace_str. "https://gmic.eu/samples/","../../resources/samples/" example$nex={t} rm. + ('${example$nex}') replace_str. "https://gmic.eu/samples/","../../resources/samples/" example$nex={t} rm. m "_run : _preview_width,_preview_height=450,300 "${example$nex} if $is_input sample_=${sample}_ else sample_= fi filename_original=${category}_${sample_}original_$nex.jpg filename_thumb_original=${category}_${sample_}thumb_original_$nex.jpg - if {"find(['"${example$nex}"'],' _fps=')>=0"} + if "find(['"${example$nex}"'],' _fps=')>=0" filename_full=${category}_${sample_}full_$nex.gif filename_thumb=${category}_${sample_}thumb_$nex.gif _is_animated=1 @@ -4153,7 +5812,7 @@ etime= _label= - if {!isfile($filename_thumb)} l[] + if !isfile('{/$filename_thumb}') l[] if $is_input sp $sample,600 o image.jpg rm fi db3d m3d md3d f3d l3d sl3d ss3d 0.8 srand 512 @@ -4168,7 +5827,7 @@ width,height={[w,h]} if $_is_animated o $filename_full,$_fps else o $filename_full,70 fi fi - v + e[] "\r"$_gmic_g" $ "${example$nex}" (done in "$_gmic_n${etime}"s"$_gmic_g")."$_gmic_n v - + e[] "\r"$_gmic_g" $ "${example$nex}" (done in "$_gmic_n${etime}"s"$_gmic_g")."$_gmic_n crop 5,5,{w-6},{h-6} # Remove frame added by '_gallery' frame 3%,3%,255 rr2d 440,440,0,3 drop_shadow 2,2,2 @@ -4197,48 +5856,58 @@ l[] $filename_full width,height={round([w,h]*(max(w,h)<300?1.75:1))} - if $filename_original $filename_original is_samesize={w==w#0" && "h==h#0} fi + if isfile(['{/${filename}_original}']) $filename_original is_samesize={w==w#0" && "h==h#0} fi rm endl - if {!$is_samesize} filename_original=$filename_full fi - - if {!($col%$nb_cols)} html=${html}"\n" fi - if {$nb_examples==1} counter= else counter=" "[{$>+1}/$nb_examples]"" fi - + if !$is_samesize filename_original=$filename_full fi + if !($col%$nb_cols) html=${html}"\n" fi + if $nb_examples==1 counter= else counter=" "[{$>+1}/$nb_examples]"" fi html_etime= - if {narg($etime)} html_etime="
(generated in "${etime}"s)" fi + if narg($etime) html_etime="
(generated in "${etime}"s)" fi html_codesample= if $is_codesample - html_codesample="\n
\n
\n"
-               i raw:$url_codesample,uchar html_codesample=${html_codesample}{t} rm.
+               html_codesample="\n
"\ + "\n
\n"
+               it[] $url_codesample html_codesample=${html_codesample}{t} rm.
                html_codesample=${html_codesample}"\n
\n"\ - "
\n"\ - "[ Source code ]\n" + "
\n + [ Source code ]\n" fi - - if {['$_label']==0} _label=$command$counter else ({'$_label'}) replace_str. "~"," " _label={t} rm. fi + if ['$_label']==0 _label=$command$counter else ('$_label') replace_str. "~"," " _label={t} rm. fi if $is_input html=${html}\ - "
\n"\ + "
\n"\ " \""gallery_$command$nex"\"
"${_label}${html_codesample}"
\n"\ + "onmouseover=\"javascript:this.src='"$filename_thumb_original"';\" + onmouseout=\"javascript:this.src='"$filename_thumb"';\"/>
"\ + ${_label}${html_codesample}"\n"\ "
\n"\ - " \""gallery_$command$nex"\"\n"\ + " \""gallery_$command$nex"\"\n"\ "
\n"\ - "
Command: $ gmic "${replaced_example$nex}""${html_etime}"
\n" + "
Command: $ gmic "${replaced_example$nex}""\ + ${html_etime}"
\n" else html=${html}\ - "
\n"\ - " \""gallery_$command$nex"\"
"${_label}${html_codesample}"
\n"\ + "
\n"\ + " \""gallery_$command$nex"\"
"\ + ${_label}${html_codesample}"
\n"\ "
\n"\ - " \""gallery_$command$nex"\"\n"\ + " \""gallery_$command$nex"\"\n"\ "
\n"\ - "
Command: $ gmic "${replaced_example$nex}""${html_etime}"
\n" + "
Command: $ gmic "${replaced_example$nex}""\ + ${html_etime}"
\n" fi nex+=1 col={($col+1)%$nb_cols} - if {!$col} html=${html}"\n" fi + if !$col html=${html}"\n" fi done fi rm @@ -4250,55 +5919,55 @@ "
\"\"
\n\n"\ "\n"\ "\n" - ({'$html'}) o. raw:$category.shtml,uchar rm. + ('$html') ot. $category.shtml rm. done rm # Transfer on G'MIC server x "ln -fs artistic.shtml index.shtml" if $1 - v + e[] "\n * Transfer gallery on G'MIC server.\n" v - - x "lftp ftp://"$GMIC_LOGIN":"$GMIC_PASSWD"@ftp.gmic.eu -e \"mirror -eRL . /www/gmic/gallery ; quit\"" + e[] "\n * Transfer gallery on G'MIC server.\n" + x "lftp ftp://"$GMIC_LOGIN":"$GMIC_PASSWD"@"$GMIC_FTP" -e \"mirror -eRL . /www/gmic/gallery ; quit\"" fi - v + e[] " * All done!.\n" + e[] " * All done!\n" # Generate a single image from a list of images, for the gallery. _gallery : repeat $! l[$>] W$>={w} H$>={h} D$>={d} S$>={s} IS_3D$>=${-_is_3d} endl done repeat $! l[$>] if ${IS_3D$>} r3d 1,1,0,-80 r3d 0,1,0,80 snapshot3d 400 - else if {w>8192} z 0,8191 elif {h>8192} rows 0,8191 fi n 0,255 + else if w>8192 z 0,8191 elif h>8192 rows 0,8191 fi n 0,255 fi endl done - if {!$_is_animated} + if !$_is_animated +__gallery - if {w>1024} r={round(1024*100/w,0.1)} r[^-1] $r%,$r%,1,100%,2 fi rm. + if w>1024 r={round(1024*100/w,0.1)} r[^-1] $r%,$r%,1,100%,2 fi rm. fi repeat $! l[$>] - if {s==1} r {w},{h},1,3 - elif {s==4} drgba + if s==1 r {w},{h},1,3 + elif s==4 drgba else r {w},{h},1,3,0 fi - if {w<=h&&h<256} r2dy 256,2 elif {h<=w&&w<256} r2dx 256,2 fi - if {w<=h&&h>620} r2dy 620,2 elif {h<=w&&w>620} r2dx 620,2 fi - if {h<48} r 100%,48 fi - if {w<48} r 48,100% fi - if {$_is_animated" && "(w>480" || "h>480)} rr2d 480,480,0,2 fi + if w<=h" && "h<256 r2dy 256,2 elif h<=w" && "w<256 r2dx 256,2 fi + if w<=h" && "h>620 r2dy 620,2 elif h<=w" && "w>620 r2dx 620,2 fi + if h<48 r 100%,48 fi + if w<48 r 48,100% fi + if $_is_animated" && "(w>480" || "h>480) rr2d 480,480,0,2 fi frame 1,1,0 frame 4,4,255 endl done - if {$_is_animated} + if $_is_animated - 255 r ${-max_wh},1,3,0,0,0.5,0.5 + 255 else - 255 __gallery + 255 - if {w<256} - 255 r 256,100%,1,100%,0,0,0.5,0.5 + 255 fi - if {h<256} - 255 r 100%,256,1,100%,0,0,0.5,0.5 + 255 fi + if w<256 - 255 r 256,100%,1,100%,0,0,0.5,0.5 + 255 fi + if h<256 - 255 r 100%,256,1,100%,0,0,0.5,0.5 + 255 fi fi __gallery : - if {$!==2} if {w>h} a y else a x fi + if $!==2 if w>h a y else a x fi else montage A # append_tiles 2 fi @@ -4306,692 +5975,1311 @@ # passed as an argument. update_deprecate : check "isint($1) && $1>0 && $1<999" e[^-1] "Deprecate filter updates for G'MIC version $1." - v - l[] + l[] file=${_path_rc}update$1.gmic i cimgz:"https://gmic.eu/update$1.gmic",uchar +l. s +,{'"UPDATE"" INFORMATION"'} is_deprecated={$!>1} rm endl # Check if deprecation has not been already done. if $is_deprecated - v + e[0--4] " > Version $1 already deprecated -> Removing deprecation." v - - off1={"data = crop(); find(data,'\n#@gui !>> UPDATE"" INFORMATION')"} - if {$off1>0} + e[0--4] " > Version $1 already deprecated -> Removing deprecation." + off1={"ref(crop(),data); find(data,'\n#@gui !>> UPDATE"" INFORMATION')"} + if $off1>0 +rows $off1,100% rows[0] 0,{$off1-1} - off2={"data = crop(); find(data,'\n\n')"} - if {$off2>0} + off2={"ref(crop(),data); find(data,'\n\n')"} + if $off2>0 rows. {$off2+2},100% a y o cimgz:$file,uchar - _update_server_upload $file - v + e[0--6] " > Done! Version $1 is not deprecated anymore." v - + _upload[] $file + e[0--6] " > Done! Version $1 is not deprecated anymore." fi fi else s +,{'"#@cli :: "'} - i[1] ({'"\n\ - \#@gui !>> UPDATE"" INFORMATION : _none_, fx_logo_en\n\ - \#@gui : note = note{\"A new version of the G\47MIC plug-in is available!\\n\\n\n\ - \#@gui : You are strongly encouraged to upgrade your version, by visiting our Download page :\\n\\n\"}\n\ - \#@gui : url = link{\"Visit G\47MIC Download Page\",\"https://gmic.eu/download.shtml\"}\n\ - \#@gui : note = note{\"\\nOf course, your plug-in will continue to work, but please note that we won\47t be able\n\ - \#@gui : to provide filter updates anymore for your current plug-in version.\\n\\n\n\ - \#@gui : Best regards,\\n\\n The G\47MIC team.\"}\n\n"'}) + i[1] ('"\n\ + \#@gui !>> UPDATE"" INFORMATION : _none_, _none_\n\ + \#@gui : note = note{\"A new version of the G\47MIC plug-in is available!\\n\\n\n\ + \#@gui : You are strongly encouraged to upgrade your version, + by visiting our Download page:\\n\\n\"}\n\ + \#@gui : url = link{\"Visit G\47MIC Download Page\",\"https://gmic.eu/download.shtml\"}\n\ + \#@gui : note = note{\"\\nOf course, your plug-in will continue to work, but please note that we + won\47t be able\n\ + \#@gui : to provide filter updates anymore for your current plug-in version.\\n\\n\n\ + \#@gui : Best regards,\\n\\n The G\47MIC team.\"}\n\n"') y[1] a y o cimgz:$file,uchar - _update_server_upload $file - v + e[0--4] " > Done! Version $1 is now deprecated." v - + _upload[] $file + e[0--4] " > Done! Version $1 is now deprecated." fi - rm endl v + + rm endl -# Function that updates filters definitions on the G'MIC web server. -# It sorts and merges filters from all available sources, and save -# a single update file on the G'MIC server. It also print on the standard -# output (stdout), the list of available filters. -update_server : - v - - use_vt100 +# update_download_version. +# Update file versions on G'MIC download page, with specified version number. +# $1 = version number (e.g. '2.9.2'). +update_download_version : check " + is_digit(c)=(c>=_'0' && c<=_'9'); + ver = ['${1=undefined}']; + size(ver)==5 && is_digit(ver[0]) && ver[1]==_'.' && is_digit(ver[2]) && ver[3]==_'.' && is_digit(ver[4])" + e[^-1] "Replace version number on G'MIC download page to '$1'." + rm filename=$HOME/work/src/gmic/html/download.shtml it[] $filename + eval " + is_digit(c) = (c>=_'0' && c<=_'9'); + ver = ['$1']; + ref(crop(),data); + p = stop = N = 0; + while (!stop, + p = find(data,'?dwl=gmic_',p); + p<0?(stop=1):( + str = data[p + 10,5]; + is_digit(str[0]) && str[1]==_'.' && is_digit(str[2]) && str[3]=='.' && is_digit(str[4])?( + copy(data[p + 10],ver,size(ver)); + ++N; + ); + ++p; + ); + ); + p = find(data,'/source/gmic_',0); + p>0?( + str = data[p + 13,5]; + is_digit(str[0]) && str[1]==_'.' && is_digit(str[2]) && str[3]=='.' && is_digit(str[4])?( + copy(data[p + 13],ver,size(ver)); + ++N; + ); + ); + copy(i[0],data,size(data)); + echo(' -> ',N,' occurrences found.'); + " + ot $filename - # Promote cool testing filters to main filter tree. - _update_server_move[] "/Testing/Garagecoder/Anti~Alias","/Repair" - _update_server_move[] "/Testing/Garagecoder/Aurora","/Artistic" - _update_server_move[] "/Testing/Garagecoder/Auto~Balance","/Colors" - _update_server_move[] "/Testing/Garagecoder/Compression~Blur","/Repair" - _update_server_move[] "/Testing/Garagecoder/Despeckle","/Repair" - _update_server_move[] "/Testing/Garagecoder/Emboss","/Black~&~White" - _update_server_move[] "/Testing/Garagecoder/HSL~Adjustment","/Colors" - _update_server_move[] "/Testing/Garagecoder/HSV~Select","/Colors" - _update_server_move[] "/Testing/Garagecoder/JPEG~Smooth","/Repair" - _update_server_move[] "/Testing/Garagecoder/Normalize~Brightness","/Colors" - _update_server_move[] "/Testing/Garagecoder/Stereo~Image","/Stereoscopic~3D" - _update_server_move[] "/Testing/Garagecoder/Undo~Anaglyph","/Stereoscopic~3D" - _update_server_move[] "/Testing/Garagecoder/Sharpen~[Gradient]","/Details" - _update_server_move[] "/Testing/Garagecoder/Sharpen~[Tones]","/Details" - _update_server_move[] "/Testing/Garagecoder/Temperature~Balance","/Colors" - _update_server_move[] "/Testing/Garagecoder/Unquantize~[JPEG~Smooth]","/Repair" - _update_server_move[] "/Testing/Garagecoder/Wiremap","/Rendering" - _update_server_move[] "/Testing/Garagecoder/Smooth~[Geometric-Median]","/Repair" - _update_server_move[] "/Testing/Gmic~Tutorials/Hedcut~(Experimental)","/Patterns" - _update_server_move[] "/Testing/Iain~Fergusson/Constrained~Sharpen","/Details" - _update_server_move[] "/Testing/Iain~Fergusson/Easy~Skin~Retouch","/Details" - _update_server_move[] "/Testing/Iain~Fergusson/Moire~Removal","/Repair" - _update_server_move[] "/Testing/Iain~Fergusson/Halftone~Shapes","/Patterns" - _update_server_move[] "/Testing/Iain~Fergusson/Simple~Local~Contrast","/Details" - _update_server_move[] "/Testing/Iain~Fergusson/Turbulent~Halftone","/Patterns" - _update_server_move[] "/Testing/Joan~Rake/Artistic/Ultrawarp++++","/Degradations" - _update_server_move[] "/Testing/JéJé/Rays","/Patterns" - _update_server_move[] "/Testing/Naggobot/Blockism","/Artistic" - _update_server_move[] "/Testing/Samj/Arrays~&~Tiles/Annular~Steiner~Chain~Round~Tile","/Arrays~&~Tiles" - _update_server_move[] "/Testing/Samj/Arrays~&~Tiles/Reptile","/Patterns" - _update_server_move[] "/Testing/Samj/Artistic/Anguish","/Artistic" - _update_server_move[] "/Testing/Samj/Artistic/Chalk~It~Up","/Artistic" - _update_server_move[] "/Testing/Samj/Artistic/Paint~Daub","/Artistic" -# _update_server_move[] "/Testing/Samj/Artistic/Skeletik","/Artistic" - _update_server_move[] "/Testing/Samj/Patterns/Denim","/Patterns" - _update_server_move[] "/Testing/Samj/Patterns/Soft~Random~Shades","/Patterns" - _update_server_move[] "/Testing/Samj/Rendering/Pythagoras~Tree","/Rendering" - _update_server_move[] "/Testing/Samj/Rendering/Snowflake~2","/Rendering" - _update_server_move[] "/Testing/Samj/Rendering/Twisted~Rays","/Rendering" - _update_server_move[] "/Testing/Souphead/Disco","/Rendering" - _update_server_move[] "/Testing/Souphead/Moon2panorama","/Deformations" - _update_server_move[] "/Testing/Souphead/Spiral~RGB","/Rendering" - _update_server_move[] "/Testing/Souphead/Kitaoka~Spin~Illusion","/Rendering" - _update_server_move[] "/Testing/Zonderr/Spiral","/Rendering" - - # Define useful sub-commands. - m "parent : l[] ({'$""1'}) s -,{'/'} if $! rm. fi i[0--1] (47) a y u {0,t} rm endl" # Command to return parent of a path - m "varname : ({'\"$""1\"'}) f. if((i>=48&&i<=57)||(i>=65&&i<=90)||(i>=97&&i<=122),i,95) u {t} rm." # Convert string to a valid variable name - m "load_gmic : "\ - "_nb_sources+=1 filename=${\"basename $""1\"} "\ - "v + e[] $_gmic_c\" \"$_nb_sources\". \"$_gmic_n$filename\" \" v - "\ - "l[] "\ - " i raw:$""1,char nm {0,b} v + e[] $_gmic_g\" [retrieved from source '$""1']\"$_gmic_n v - "\ - " l "\ - " o raw:/tmp/$filename,char "\ - " _update_server_upload /tmp/$filename,include/$filename "\ - " v + e[] $_gmic_g\" [archived]\n\"$_gmic_n v - "\ - " onfail v + e[] $_gmic_r\" [could not be archived!]\n\"$_gmic_n v - endl "\ - "onfail l[] "\ - " source=https://gmic.eu/include/$filename "\ - " i raw:$source,char v + e[] $_gmic_c\" [retrieved from archive '\"$source\"']\n\"$_gmic_n v - "\ - " onfail v + e[] $_gmic_r\" [error, not reachable!]\n\"$_gmic_n v -"\ - " endl endl" - - # Copy latest command definitions on G'MIC server if necessary. - v + e[] "> Upload latest version ("${-strver}") of commands on G'MIC server.\n" v - - _update_server_upload $HOME/work/src/gmic/src/gmic_stdlib.gmic,gmic_stdlib.$_version - _update_server_upload $HOME/work/src/gmic/src/gmic_stdlib.gmic - - # Get command source files and archive them. - v + e[] "> Load and archive .gmic source files.\n" v - - _nb_sources=0 - load_gmic ${HOME}/work/src/gmic/src/gmic_stdlib.gmic - x "cd $HOME/work/src/gmic-community && git pull 2>&1 >/dev/null" - load_gmic ${HOME}/work/src/gmic-community/include/andreas_pahlsson.gmic - load_gmic ${HOME}/work/src/gmic-community/include/andy_kelday.gmic - load_gmic ${HOME}/work/src/gmic-community/include/arto_huotari.gmic - load_gmic ${HOME}/work/src/gmic-community/include/david_tschumperle.gmic - load_gmic ${HOME}/work/src/gmic-community/include/garry_osgood.gmic - load_gmic ${HOME}/work/src/gmic-community/include/gentlemanbeggar.gmic - load_gmic ${HOME}/work/src/gmic-community/include/iain_fergusson.gmic - load_gmic ${HOME}/work/src/gmic-community/include/james_prichard.gmic - load_gmic ${HOME}/work/src/gmic-community/include/jerome_boulanger.gmic - load_gmic ${HOME}/work/src/gmic-community/include/jerome_ferrari.gmic - load_gmic ${HOME}/work/src/gmic-community/include/karsten_rodenacker.gmic - load_gmic ${HOME}/work/src/gmic-community/include/martin_souphead.gmic - load_gmic ${HOME}/work/src/gmic-community/include/mathew_callaghan.gmic - load_gmic ${HOME}/work/src/gmic-community/include/photocomix.gmic - load_gmic ${HOME}/work/src/gmic-community/include/joan_rake.gmic - load_gmic ${HOME}/work/src/gmic-community/include/afre.gmic - load_gmic ${HOME}/work/src/gmic-community/include/mccap.gmic - l[] - load_gmic ${HOME}/work/src/gmic-community/include/sylvie_alexandre.gmic - s +,{'"#@gui "'} i[1--2:2] ({'"#@gui ________Testing\n#@gui Samj\n"'}) y a y - endl - load_gmic ${HOME}/work/src/gmic-community/include/tom_keil.gmic +#@cli parse_gui : _filter_name,_outputmode +#@cli : Parse selected filter definitions and generate info about filters in selected output mode. +#@cli : 'outputmode' can be { json | list | print | update | zart }.\n +#@cli : It is possible to define a custom output mode, by implementing the following commands +#@cli : ('outputmode' must be replaced by the name of the custom user output mode): +#@cli : . 'parse_gui_outputmode' : A command that outputs the parsing information with a custom format. +#@cli : . 'parse_gui_parseparams_outputmode' (optional): A simple command that returns 0 or 1. It tells the parser \ +# whether parameters of matching filter must be analyzed (slower) or not. +#@cli : . 'parse_gui_trigger_outputmode' (optional): A command that is called by the parser just before parsing \ +# the set of each matching filters.\n +#@cli : Here is the list of variables set by the parser, accessible in command 'parse_gui_outputmode':\n +#@cli : '$_nbfilters': Number of matching filters. +#@cli : '$_nongui' (stored as an image): All merged lines in the file that do not correspond to '#@gui' lines.\n +#@cli : For each filter \#F ('F' in range [0,$_nbfilters-1]): +#@cli : . '$_fF_name': Filter name. +#@cli : . '$_fF_path': Full path. +#@cli : . '$_fF_locale': Filter locale (empty, if not specified). +#@cli : . '$_fF_command': Filter command. +#@cli : . '$_fF_commandpreview': Filter preview command (empty, if not specified). +#@cli : . '$_fF_zoomfactor': Default zoom factor (empty, if not specified). +#@cli : . '$_fF_zoomaccurate': Is preview accurate when zoom changes ? (can be { 0=false | 1=true }). +#@cli : . '$_fF_inputmode': Default preferred input mode (empty, if not specified). +#@cli : . '$_fF_hide': Path of filter hided by current filter (for localized filters, empty if not specified). +#@cli : . '$_fF_nbparams': Number of parameters.\n +#@cli : For each parameter \#P of the filter \#F ('P' in range [0,$_fF_nbparams-1]): +#@cli : . '$_fF_pP_name': Parameter name. +#@cli : . '$_fF_pP_type': Parameter type. +#@cli : . '$_fF_pP_responsivity': Parameter responsivity (can be { 0 | 1 }). +#@cli : . '$_fF_pP_visibility': Parameter visibility. +#@cli : . '$_fF_pP_propagation': Propagation of the parameter visibility. +#@cli : . '$_fF_pP_nbargs': Number of parameter arguments.\n +#@cli : For each argument \#A of the parameter \#P ('A' in range [0,$_fF_pP_nbargs-1]): +#@cli : . '$_fF_pP_aA': Argument value\n +#@cli : Default parameters: 'filter_name=*' and 'output_format=print'. +parse_gui : skip "${1=*},${2=print}" + e[^-1] "Parse '#@gui' filters '$1' and output in '$2' mode." + use_vt100 + if !$! l[] it[] ${_path_rc}update$_version.gmic onfail endl fi + if !$! return fi + y a y merge_multiline_comments + + # Extract all filter chunks with full path. + e[] "" + e[] "\r > Extract filter chunks." + macros=" + is_blank(p) = ((_c=source[p])<=_' ' && _c!=_'\n'); + skip_blank(p) = (while (is_blank(p), ++p)); + clean(name) = ( + _l = find(name,0); + _l>0?( + _p = 0; while (1, + _p = find(name,_'<',_p); + _p<0 || _p>=_l?break(); + isin(name[_p+1],_'b',_'i') && name[_p+2]==_'>'?( # Opening tag + copy(name[_p],name[_p+3],_l-_p-2); + _l-=3; + ):name[_p+1]==_'/' && isin(name[_p+2],_'b',_'i') && name[_p+3]==_'>'?( # Closing tag + copy(name[_p],name[_p+4],_l-_p-3); + _l-=4; + ):++_p; + ); + _p = 0; while (1, _p = find(name,_'/',_p); _p<0 || _p>=_l?break(); name[_p++] = _'-'); # Replace '/' by '-' + ); + );" - load_gmic ${HOME}/work/src/gmic-community/include/translation_ca.gmic - load_gmic ${HOME}/work/src/gmic-community/include/translation_fr.gmic - load_gmic ${HOME}/work/src/gmic-community/include/translation_ja.gmic - - # Merge them together. - i[0] (10) i[2--1] ({"'\n#@gui ________________\n'"}) y a y discard 13 replace 9,32 - s +,{'"#@gui"'} - repeat {int(($!-1)/2)} a[{$>+1},{$>+2}] y done - nm[0] !header - - # Parse filter tree. - v + e[] "> Start filter parsing.\n" v - - progress_factor={100/($!-1)} - merge_request=0 - merge_start=0 - nb_filters=0 - offset=0 - path=/ + eval $macros" + store_block(p,q,path,name,hide) = ( + run('+rows[0] ',p,',',q,' discard. -1 autocrop. 10 autocrop. 32 nm. \"',path,'/',name,'\"'); - repeat $! - ind={$>-$offset} - if {{{$ind-1},@-1}==10" && "same([{^}],'#@gui',5)" && "({$ind,@5}==32" || "{$ind,@5}==_'_')} l[$ind] # Line starts by '#@gui[_] ' + # Insert hide() info at the end of the chunk, with magic number '-2'. + hide[0]?run([40,45,50,44,123,39,34],hide,[34,39,125,41],' y. a[-2,-1] y'); + ); - if {i[5]==_'_'} locale=_{`[i[6],i[7]]`} # Retrieve locale if any specified - else locale= - fi + # Init variables. + #---------------- + ref(crop(),source); + path = prev_path = name = prev_name = hide = prev_hide = vector1024(); + + # Start parsing. + #--------------- + prev_p0 = p0 = p = 0; + while (p0 && source[p - 1]==_'\n')?( # Found line starting with '#@gui' + p0 = p; # Remember starting position of line + p+=5; + source[p]==_'_' && (l = find(source,_' ',++p))>=0?(p = l + 1); # Skip locale + + # Detect new filter, folder or hide() directive. + #----------------------------------------------- + skip_blank(p); + source[p]!=_':'?( + hide[0] = 0; + q = find(source,_':',p)%size(source); + r = find(source,_'\n',p)%size(source); + is_hide = q>r && (l=find(source,'hide(',p)%size(source))=0} # Found a hide() pragma. - i[1] ({'" "'}) - - elif {{1,@0}!=_':'} # Found a new filter or folder definition. - l[1] - - # Format string by removing special character sequences. - s +,{':'} - replace_str[0] "" - replace_str[0] "" - replace_str[0] "" - replace_str[0] "" - replace[0] {'/'},{'-'} - replace[0] {','},{';'} - autocrop[0] 32 - - if {$!>1} # Found new filter. - _update_server_calibrate_name[0] +replace[0] 32,{'~'} - name=$path{t} rm. - merge_request=1 - nb_filters+=1 - i[0,1] (32) a y - v + e[] $_gmic_c" "$nb_filters". "$_gmic_n$name" ("{round($>*$progress_factor)}"%)." v - - - else # Found new folder (opt. parent(s)). - - if {i==_'_'} # Folder has parents before creating it. - do path=${"parent[] "$path} shift 0,-1,0,0 while {i==_'_'} - autocrop 0 - fi - autocrop 32 - if {w} # Folder name specified after the underscore(s). - varname {0,t} locale_${}=$locale # Keep locale of each folder - _update_server_calibrate_name[0] - replace 32,{'~'} - path=$path{0,t}/ - fi - is_folder=1 + # Manage hide() directive. + #-------------------------- + l0 = l + 5; l = find(source,_')',l0); + l1} - endl # l[1] + # Isolate only requested filters. + if "['$1']!='*'" + 1 eval ${-math_lib}" + ref(lowercase(['$1']),str); + for (k = 0, k,f} if {$>,h} l[$>] + if crop(0,0,1,5)!='#@gui' # Non-gui : merge code and skip chunk + autocrop {'\n'} store nongui$c 0 continue + fi - if $is_folder rm[0,1] i[0] (10) # Discard folder definition (will be recreated afterwards). - else nm[0] $name fi + # Init variables. + _f${f}_locale= + _f${f}_commandpreview= + _f${f}_zoomfactor= + _f${f}_zoomaccurate= + _f${f}_inputmode= + _f${f}_nbparams=0 + _f${f}_hide= + + # Detect locale. + if crop(0,0,1,6)=='#@gui_' _f${f}_locale={`crop(0,6,1,2)`} fi + + # Detect hided filter. + p={"find(#0,-2,h-1,0)"} + if $p>=0 +rows. {$p+1},100% _f${f}_hide={t} rm. fi + + # Separate '#@gui' lines from other lines, and merge them. + eval $macros" + ref(crop(),source); + is_first = 1; + p = 0; + while (p0 && source[p - 1]==_'\n')?( # Found line starting with '#@gui' + p0 = p; # Remember starting position of line + p+=5; + source[p]==_'_' && (l = find(source,_' ',++p))>=0?(p = l + 1); # Skip locale + skip_blank(p); + source[p]==_':'?(++p; skip_blank(p)); + r = find(source,_'\n',p)%size(source); # Find end of line + run('+rows[0] ',p,',',r); + source[r]==_'\n'?(i[#-1,h(#-1)-1] = is_first?0:_' '); + copy(i[#0,p0],-1,min(r,size(source)-1)-p0+1,1,0); # Part to be discarded + p = r + 1; + is_first = 0; + ):++p + )" + a[^0] y discard.. -1 + autocrop[0] {'\n'} store[0] nongui$c + s -,0 # Split in two images : definition and parameters + f "max(_' ',i)" # Replace all blank characters by space - else # Found possibly a filter argument. - - if {$!>=3} l[1] - s +,{'='} - if {$!>=3} if {{1,@0}==_'='} - if {find(#0,'"1 l[1] + s -,{'('} + _f${f}_commandpreview={0,t} # Filter preview command + if $!>1 l[1] + s +,{'+'} + discard[0] {')'} + _f${f}_zoomfactor={0,t} # Default zoom factor + if $!>1" && "i[0]==_'+' _f${f}_zoomaccurate=1 fi # Is zoom accurate ? + endl fi endl fi - i[1] (32) + rm + endl fi + if $! _f${f}_inputmode={0,t} fi # Default input mode + rm + endl + e[] "\r > "$_gmic_c[#$f]$_gmic_n" "{`copy(vector48(_'" "'),['${_f${f}_path}${_f${f}_name}'])`} - fi # if {i!=_':'} - a y + # Parse filter parameters. + parseparams=1 + l[] parseparams=${-parse_gui_parseparams_$2} onfail endl - endl fi + if !$!" || "!$parseparams _f${f}_nbparams=0 + else + eval $macros" + ref(crop(),source); + ref(vector256(),name); + ref(vector256(),type); + ref(vector65536(),argument); + + p = nbparams = 0; + while (p parse list of arguments + while (p "${_gmic_g}{`copy(vector64(_'" "'),'"Parsing done!"')`}$_gmic_n + v + parse_gui_$2 # Output result of the parsing. + +# +# Output mode 'print' (default output mode). +# +parse_gui_parseparams_print : u 0 # Tell parser to not parse filter parameters +parse_gui_trigger_print : sort_list +,n +parse_gui_print : + e[] "\r"${_gmic_g}{`vector68(_'" "')`}$_gmic_n + e[] " > "${_gmic_g}"List of matching filters:"$_gmic_n"\n\n" + repeat $_nbfilters + +e[] " [#"{1+$>}"] "${_f$>_path}${_f$>_name} + done + +# +# Output mode 'list'. +# +parse_gui_parseparams_list : u 0 # Tell parser to not parse filter parameters +parse_gui_list : + e[] " >> Generate output, in 'list' mode.\n" + ('"*** List of filters in the G\47MIC plug-in ("$_nbfilters" filters, on "\ + {`v=date(1);sv=vtos(v);v<10?[_'0',sv]:[sv,0]`}"/"\ + {`v=date(2);sv=vtos(v);v<10?[_'0',sv]:[sv,0]`}", "\ + {`v=date(4);sv=vtos(v);v<10?[_'0',sv]:[sv,0]`}":"\ + {`v=date(5);sv=vtos(v);v<10?[_'0',sv]:[sv,0]`}") ***\n\n"') + + ('"* List of filters, sorted by path:\n\n"') + l[] + 1,1,1,1x$_nbfilters + repeat $! nm[$>] -${_f$>_path}${_f$>_name} f[$>] $> done + sort_list +,n a x + repeat w n={0,i[$>]} + ('${_f${n}_path}${_f${n}_name}" (command: '"${_f${n}_command}"')\n"') + done + rm[0] + endl + + ('"\n* List of filters, sorted alphabetically:\n\n"') + l[] + 1,1,1,1x$_nbfilters + repeat $! nm[$>] -${_f$>_name} f[$>] $> done + sort_list +,n a x + repeat w n={0,i[$>]} + ('${_f${n}_name}" (in '"${_f${n}_path}"')\n"') + done + rm[0] + endl + + ('"\n*** End of list ***\n"') + y a y + e[] "\r >> "${_gmic_g}{`copy(vector64(_'" "'),'"Output done!"')`}$_gmic_n + +# +# Output mode 'update'. +# +parse_gui_parseparams_update : u 1 # Tell parser to parse filter parameters +parse_gui_update : + e[] " >> Generate output, in 'update' mode.\n" + path=/ + N={$_nbfilters-1} + is_af={date([1,2])==[4,1]" && "(date(4)%2)} # April fool mode ? + repeat $_nbfilters,f + e[] "\r >> "$_gmic_c[#$f/$N]$_gmic_n" "{`copy(vector48(_'" "'),['${_f${f}_path}${_f${f}_name}'])`} + + # Insert directives to change folder if necessary. + if ;['$path']!=['${_f${f}_path}'] + command_path={`" + src = ['"$path"']; + dest = ['"${_f${f}_path}'"]; + ref(vector1024(),command); + for (p = 0, p0 && src[p]!=_'/' && dest[p]!=_'/', --p); + + nb_levelup = 0; + for (q = p + 1, q':''); + copy(command[eoc + 3],dest[p],q-p); + copy(command[eoc + 3 + q - p],is_italic?'
\n':'\n'); + p = q + 1; + ); command"`} + ('$command_path\n') + fi + + path=${_f${f}_path} + + if narg(${_f${f}_commandpreview}) commandpreview=,${_f${f}_commandpreview} else commandpreview= fi + if narg(${_f${f}_locale}) locale=_${_f${f}_locale} else locale= fi + if narg(${_f${f}_zoomfactor}) zoomfactor=(${_f${f}_zoomfactor}) else zoomfactor= fi + if ${_f${f}_zoomaccurate} zoomaccurate=+ else zoomaccurate= fi + if narg(${_f${f}_inputmode}) inputmode=" : "${_f${f}_inputmode} else inputmode= fi + strcapitalize ${_f${f}_name} name=${} + + if ['${_f${f}_hide}']!=0 ('"#@gui"$locale" hide("${_f${f}_hide}")\n"') fi + ('"#@gui"$locale" "$name:${_f${f}_command}$commandpreview$zoomfactor$zoomaccurate$inputmode\n') + + repeat ${_f${f}_nbparams},p + responsivity,visibility= + if !${_f${f}_p${p}_responsivity} responsivity=_ fi + if narg(${_f${f}_p${p}_visibility}) visibility=_${_f${f}_p${p}_visibility}${_f${f}_p${p}_propagation} fi + is_choice={['${_f${f}_p${p}_type}']=='choice'} + is_color={['${_f${f}_p${p}_type}']=='color'} + + # Build list of arguments. + args= c= + if $is_choice # Capitalize arguments of choice() + repeat ${_f${f}_p${p}_nbargs},a + if $is_af straprilfool ${_f${f}_p${p}_a${a}} + else strcapitalize ${_f${f}_p${p}_a${a}} + fi + args.=$c${} c=, done + elif $is_color # Force HTML color code for color() + if inrange(${_f${f}_p${p}_nbargs},3,4)" && "\ + inrange(${_f${f}_p${p}_a0},0,255)" && "\ + inrange(${_f${f}_p${p}_a1},0,255)" && "\ + inrange(${_f${f}_p${p}_a2},0,255)" && "\ + (${_f${f}_p${p}_nbargs}==3" || "inrange(${_f${f}_p${p}_a3},0,255)) + args=# + repeat ${_f${f}_p${p}_nbargs},a + args.={`"tab = [ _'0',_'1',_'2',_'3',_'4',_'5',_'6',_'7',_'8',_'9',_'a',_'b',_'c',_'d',_'e',_'f' ]; + const v = "${_f${f}_p${p}_a${a}}"; [ tab[(v>>4)&15],tab[v&15] ]"`} + done + else repeat ${_f${f}_p${p}_nbargs},a args.=$c${_f${f}_p${p}_a${a}} c=, done + fi + else + repeat ${_f${f}_p${p}_nbargs},a args.=$c${_f${f}_p${p}_a${a}} c=, done + fi + sep1,sep2={`" + s = ['"$args"']; + size(s)?( + find(s,_'(')<0 && find(s,_')')<0?[_'(',_',',_')']: + find(s,_'{')<0 && find(s,_'}')<0?[_'{',_',',_'}']: + [_'[',_',',_']'] + ):[_'(',_',',_')']; + "`} + if s=['${_f${f}_p${p}_type}'];"s=='link' || s=='note' || s=='separator' || s=='value'" name=_ + else strcapitalize ${_f${f}_p${p}_name} name=${} + fi + ('"#@gui"$locale" :"{/$name}=$responsivity${_f${f}_p${p}_type}{``$sep1}{``{/$args}}{``$sep2}$visibility\n') + done done + repeat $! l[$>] utf82html endl done + $_nongui y a y - a[$merge_start--1] y # Final merge. + # Clean generated output, add footer and header. + compress_gmic. + i[0] ('"#@gmic"\n\ + "#"\n\ + "# File : update"$_version".gmic"\n\ + "# ( G\47MIC command file )"\n\ + "#"\n\ + "# Description : Update file for G\47MIC commands and filters (for current version "${-strver}")."\n\ + "# ( https://gmic.eu )"\n\ + "#"\n\ + "# License : CeCILL v2.1"\n\ + "# ( https://cecill.info/licences/Licence_CeCILL_V2.1-en.html )"\n\ + "#"\n\ + "# Generated on : "\ + {date(0)}"/"\ + {`v=date(1);sv=vtos(v);v<10?[_'0',sv]:[sv,0]`}"/"\ + {`v=date(2);sv=vtos(v);v<10?[_'0',sv]:[sv,0]`}", "\ + {`v=date(4);sv=vtos(v);v<10?[_'0',sv]:[sv,0]`}":"\ + {`v=date(5);sv=vtos(v);v<10?[_'0',sv]:[sv,0]`}\n\ + "#"\n') + ('"\n# Local Variables:"\n\ + "# mode: sh"\n\ + "# End:"\n\ + "#"\n\ + "# (End of G\47MIC update file)"') + y a y + e[] "\r >> "${_gmic_g}{`copy(vector64(_'" "'),'"Output done!"')`}$_gmic_n - # Force filters to move if necessary. - v + e[] "\n> Force filters to move, if necessary." v - - repeat $!,ind repeat $_nbm if {['{$ind,n}']==['${_to_move$>}']} - v + e[] $_gmic_c" "$ind$_gmic_n". Move '"${_gmic_g}{$ind,n}$_gmic_n"' to '"$_gmic_g${_move_to$>}$_gmic_n"'." v - - nm[$ind] ${_move_to$>}/{$ind,b} - fi done done +# April Fool version! +straprilfool : skip "${1=}" + if ['"$1"']==0 u "" return fi + l[] ('{/"$1"}') + f "(i<=_' ' || i==_'_') && i!=_'\n'?_' ':i" # Replace blank characters and underscores + f "x%2?lowercase(i):uppercase(i)" + f "c = lowercase(i); + c==_'o'?_'0': + c==_'i'?_'1': + c==_'e'?_'3': + c==_'a'?_'4': + c==_'s'?_'5': + c==_'t'?_'7': + c==_'b'?_'8': + i" + u {t} rm endl - # Sort filter code by lexicographical order. - v + e[] "\n> Sort filters by lexicographic order." v - +# +# Output mode 'json'. +# +parse_gui_parseparams_json : u 1 # Tell parser to not parse filter parameters +parse_gui_trigger_json : + repeat $! l[$>] # Keep only 1-level folders + nm {`s=[['{n}'],0];p=find(s,_'/',size(s)-1,0);p>=0?(p=find(s,_'/',p-1,0);p>0?copy(s,s[p+1],size(s)-p));s`} + endl done sort_list +,n - # Rebuild folder structure. - v + e[] "\n> Rebuild folder structure." v - - m "nb_levels : l[] ({'$""1'}) s -,{'/'} u $! rm endl" # Command to count number of folders in a given path. +parse_gui_json : + e[] " >> Generate output, in 'json' mode.\n" + ('"{\n \"format_version\": \"gmic_json_1.0\",\n \"gmic_version\": \""${-strver}"\",\n \"categories\": [\n"') + + current_category= + N={$_nbfilters-1} + repeat $_nbfilters,f + e[] "\r >> "$_gmic_c[#$f/$N]$_gmic_n" "{`copy(vector48(_'" "'),['${_f${f}_path}${_f${f}_name}'])`} + + # Manage categories. + 0 nm. {`s=['${_f${f}_path}'];s[0,size(s)-1]`} _parse_gui_json[] {b} path=${} rm. + if ['$current_category']!=['$path'] + if ['$current_category']!=0 ('" ]\n },\n"') fi + ('" {\n"') + ('" \"name\": \""$path"\", \"filters\": [\n"') + current_category=$path + else + if i[-1,2]==_'\n' z. 0,{w-2} fi + ('",\n"') + fi - path=/ + # Filter definition. + _parse_gui_json[] ${_f${f}_name} fname=${} - repeat $! l[$>] - npath=${"parent "{0,n}} - if {['$path']!=['$npath']} # Need to change the path. - nc=${"nb_levels[] "$path} - nn=${"nb_levels[] "$npath} - - # Get the minimal basis path in common and the number of up/down operations. - nb_up=0 - nb_down=0 - basis=$path nbasis=$npath - do - nc=${"nb_levels[] "$basis} - nn=${"nb_levels[] "$nbasis} - if {$nc>$nn} basis=${"parent[] "$basis} nb_up+=1 - elif {$nn>$nc} nbasis=${"parent[] "$nbasis} nb_down+=1 - elif {['$nbasis']!=['$basis']} basis=${"parent[] "$basis} nb_up+=1 nbasis=${"parent[] "$nbasis} nb_down+=1 - fi - while {['$nbasis']!=['$basis']} - - # Deduce the G'MIC command to apply. - command= - if $nb_up 1,$nb_up,1,1,{'_'} command="#@gui "{t}"\n" rm. fi - if $nb_down l[] - ({'$npath'}) s -,{'/'} k[-$nb_down--1] replace {'~'},32 - level={${"nb_levels "$path}-$nb_up} - balise=${"if "{$level<=0" && "['$npath']!='/About/'}" u b else u i fi"} - repeat $! - varname {$>,t} locale=${locale_${}} # Retrieve locale of folder name - command=$command"#@gui"$locale" <"$balise">"{$>,t}"\n" - balise="i" - done rm - endl fi - if {narg(['$command'])} nm={0,n} i[0] ({'$command'}) y[0] a y nm $nm + locale=en + if narg(${_f${f}_locale}) locale=${_f${f}_locale} fi + + ('" {\n \"name\": \""$fname"\", \"lang\": \""$locale"\", \"command\": \""${_f${f}_command}"\", "\ + "\"parameters\": [\n"') + + sepf={`$}') autocrop. {'\"'} _parse_gui_json {t} arg$>=${} rm. done + sepp={`$"\": \""${arg{$n+$a}}"\"" c=", " done + ('" { \"type\": \"choice\", \"name\": \""$name"\", \"default\": \""$default"\", \"pos\": \""$ppos"\", "\ + "\"choices\": { "$choices" } }"$sepp\n') + ppos+=1 + + elif ['$type']=='color' + args= c= repeat $nbargs,a args.=$c${arg$a} c="," done + ('" { \"type\": \"color\", \"name\": \""$name"\", \"default\": \""$args"\", \"pos\": \""$ppos"\" }"\ + $sepp\n') + ppos+=$nbargs + + elif s=['$type'];s=='int' + ('" { \"type\": \"int\", \"name\": \""$name"\", \"default\": \""$arg0"\", \"min\": \""$arg1"\", "\ + "\"max\": \""$arg2"\", \"pos\": \""$ppos"\" }"$sepp\n') + ppos+=1 + + elif s=['$type'];s=='float' + ('" { \"type\": \"float\", \"name\": \""$name"\", \"default\": \""$arg0"\", \"min\": \""$arg1"\", "\ + "\"max\": \""$arg2"\", \"pos\": \""$ppos"\" }"$sepp\n') + ppos+=1 + + elif ['$type']=='file'" || "['$type']=='filein'" || "['$type']=='fileout' + ('" { \"type\": \"file\", \"name\": \""$name"\", \"default\": \""{/$arg0}"\", \"pos\": \""$ppos"\" }"\ + $sepp\n') + ppos+=1 + + elif ['$type']=='folder' + ('" { \"type\": \"folder\", \"name\": \""$name"\", \"default\": \""{/$arg0}"\", \"pos\": \""$ppos"\"}"\ + $sepp\n') + ppos+=1 + + elif ['$type']=='link' + align=-1 name= url= n=0 + l[] if isnum($arg0) align=$arg0 n+=1 fi onfail endl + if $nbargs-$n>1 name=${arg$n} url=${arg{$n+1}} + else url,name=${arg$n} + fi + if $align==0 align=left elif $align==1 align=right else align=center fi + ('" { \"type\": \"link\", \"name\": \""$name"\", \"url\": \""{/$url}"\", \"align\": \""$align"\" }"\ + $sepp\n') + + elif ['$type']=='note' + ('" { \"type\": \"note\", \"text\": \""{/$arg0}"\"}"$sepp\n') + + elif ['$type']=='point' + ('" { \"type\": \"point\", \"name\": \""$name"\", \"position\": \""$arg0,$arg1"\", \"pos\": "\ + "\""$ppos"\" }"$sepp\n') + ppos+=2 + + elif ['$type']=='separator' + ('" { \"type\": \"separator\" }"$sepp\n') + + elif ['$type']=='text' + ('" { \"type\": \"text\", \"name\": \""$name"\", \"default\": \""{/$arg0}"\", \"pos\": \""$ppos"\" }"\ + $sepp\n') + ppos+=1 + + elif ['$type']=='value' + ('" { \"type\": \"value\", \"value\": \""{/$arg0}"\", \"pos\": \""$ppos"\" }"$sepp\n') + ppos+=1 + + else # Unknown parameter + ('" { \"type\": \"unknown\", \"name\": \""$name"\" }"$sepp\n') fi - path=$npath - fi + done + ('" ]\n }\n"') + done + if ['$current_category']!=0 ('" ]\n }\n"') fi + ('" ]\n}\n"') + y a y html2utf8 + e[] "\r >> "${_gmic_g}{`copy(vector64(_'" "'),'"Output done!"')`}$_gmic_n + +_parse_gui_json : + l[] + ('{/"$*"}') + replace_str "\\","\\\\" + replace_str "\n","\\n" + replace_str "\r","\\r" + replace_str "\"","\\\"" + replace_str "&","&" + replace_str " "," " + replace_str. "","" + replace_str. "","" + replace_str. "","" + replace_str. "","" + replace_str. "","" + replace_str. "","" + u {t} rm. + onfail u "" endl + +# +# Output mode 'zart' (output in stdout). +# +parse_gui_parseparams_zart : u 1 # Tell parser to not parse filter parameters +parse_gui_trigger_zart : + repeat $! l[$>] # Keep only 1-level folders + nm {`s=[['{n}'],0];p=find(s,_'/',size(s)-1,0);p>=0?(p=find(s,_'/',p-1,0);p>0?copy(s,s[p+1],size(s)-p));s`} endl done + sort_list +,n - # Search / replace strings. - v + e[] "> Search and replace strings." v - - replace_str "#@gmic\n","" - replace_str "samj","Author: Samj." - replace_str " Update : 20"," Latest Update: 20" +parse_gui_zart : + e[] " >> Generate output, in 'zart' mode.\n" + +e[] "" + +e[] "\n" - # Remove useless comments and line breaks. - repeat $! l[$>] s -,10 repeat $! l[$<] - if {i[0]==_'#'" && "i[1]!=_'@'} rm fi - endl done i[^0] ({'\n'}) a y endl done + current_group= + N={$_nbfilters-1} + repeat $_nbfilters,f + e[] "\r >> "$_gmic_c[#$f/$N]$_gmic_n" "{`copy(vector48(_'" "'),['${_f${f}_path}${_f${f}_name}'])`} - # Retrieve G'MIC command name for each filter. - repeat $! +l[$>] command_name$>="" - +rows 0,5 head={t} rm. - if {['$head']=='"#@gui "'} s -,{':'} - if {$!>=1} l[1] s -,{','} - if $! autocrop[0] 32 command_name$>={0,t} fi - endl fi + # Manage groups. + 0 nm. {`s=['${_f${f}_path}'];s[0,size(s)-1]`} path={b} rm. + if ['$current_group']!=['$path'] + if ['$current_group']!=0 +e[] "\n" fi + +e[] "" + +e[] "\n" + current_group=$path fi - rm endl done - # Save reordered .gmic file. - if {$nb_filters>400} - v + e[] "> Compress and save output .gmic files." v - - +a y l. - compress_gmic[0] - - # Add footer and header. - i[0] ({'"#@gmic"\n\ - "#"\n\ - "# File : update"$_version".gmic"\n\ - "# ( G\47MIC command file )"\n\ - "#"\n\ - "# Description : Update file for G\47MIC commands and filters (for version "${-strver}")."\n\ - "# ( https://gmic.eu )"\n\ - "#"\n\ - "# License : CeCILL v2.1 or CeCILL-C v1.0"\n\ - "# ( http://www.cecill.info/index.en.html )"\n\ - "#"\n\n'}) - ({'"\n\n# Local Variables:"\n\ - "# mode: sh"\n\ - "# End:"\n\ - "#"\n\ - "# (End of G\47MIC update file)"'}) - y a y + # Filter definition. + _parse_gui_zart[] ${_f${f}_name} fname=${} - # Upload filter files on G'MIC server. - o raw:${_path_rc}update$_version.gmic,uchar - if {"d = date(3); h = date(4); h>=7 && d>=1 && d<=5"} url=https://goo.gl/Ryf7Cv - else url=http://ow.ly/wpsV30fzhdI # url=https://goo.gl/Ryf7Cv - fi - replace_str "David Tschumperlé","David Tschumperlé" - o cimgz:/tmp/update$_version.gmic,uchar + +e[] "" + +e[] "" + +e[] " "${_f${f}_commandpreview}" $""*" + repeat ${_f${f}_nbparams},p + _parse_gui_zart ${_f${f}_p{$p}_name} name=${} + type=${_f${f}_p{$p}_type} + nbargs=${_f${f}_p{$p}_nbargs} + arg0= repeat $nbargs ('${_f${f}_p${p}_a$>}') autocrop. {'\"'} _parse_gui_zart {t} arg$>=${} rm. done - (242,243,244,245) - repeat {w} - v={i[$>]} - _update_server_upload[] ${_path_rc}update$_version.gmic,plain_update$v.gmic - _update_server_upload[] /tmp/update$_version.gmic,update$v.gmic - done rm. + if ['$type']=='bool' + if lowercase(['$arg0'])=='false' arg0=0 elif lowercase(['$arg0'])=='true' arg0=1 elif !isnum($arg0) arg0=0 fi + +e[] " " - rm endl - fi + elif ['$type']=='choice' + default=0 n=0 args= + l[] if isint($arg0) default=$arg0 n+=1 fi onfail endl + c= repeat $nbargs-$n,a args.=${c}"choice"$>"=\""${arg{$n+$a}}"\"" c=" " done + +e[] " " - # Display list of filters (sorted alphabetically) on stdout. - v + e[] "> Output list of filters in stdout.\n" v - - echo_stdout "*** List of filters in the G\47MIC plug-in ("$nb_filters" filters, on "{date(0)}/{date(1)}/{date(2)}" "{date(4)}:{date(5)}") ***\n" - echo_stdout "* List of filters, sorted by path:\n" - repeat $! l[$>] - ({'{0,n}'}) if {i!=_'!'} - r. {w-1},1,1,1,0,0,1 - replace_str. "&","&" - replace_str. "é","e" - replace_str. "/","~/~" - replace. {'~'},32 - if {narg(${command_name$>})} echo_stdout[] " "{t}" (command '"${command_name$>}"')" - else echo_stdout[] " "{t} - fi - fi rm. - endl done + elif ['$type']=='color' + args= c= repeat $nbargs,a args.=$c${arg$a} c="," done + +e[] " " - echo_stdout "\n* List of filters, sorted alphabetically:\n" + elif s=['$type'];s=='int'" || "s=='float' + +e[] " <"$type" name=\""$name"\" default=\""$arg0"\" min=\""$arg1"\" max=\""$arg2"\" />" - repeat $! - name={$>,b} - path={$>,f} - nm[$>] $name"~(in~'"$path"')" + elif ['$type']=='file'" || "['$type']=='filein'" || "['$type']=='fileout' + +e[] " " + + elif ['$type']=='folder' + +e[] " " + + elif ['$type']=='link' + align=-1 name= url= n=0 + l[] if isnum($arg0) align=$arg0 n+=1 fi onfail endl + if $nbargs-$n>1 name=${arg$n} url=${arg{$n+1}} + else url,name=${arg$n} + fi + if $align==0 align=left elif $align==1 align=right else align=center fi + +e[] " " + + elif ['$type']=='note' + text={/$arg0} + +e[] " " + + elif ['$type']=='point' + +e[] " " + + elif ['$type']=='separator' + +e[] " " + + elif ['$type']=='text' + +e[] " " + + elif ['$type']=='value' + +e[] " " + + else # Unsupported parameter + +e[] " " + fi + + done + +e[] "\n" done + if narg($current_group) +e[] "" fi + +e[] "" + e[] "\r >> "${_gmic_g}{`copy(vector64(_'" "'),'"Output done!"')`}$_gmic_n + +_parse_gui_zart : + l[] + ('"$*"') + replace_str "&","#amp;" + replace_str. "&","&" + replace_str. "<","<" + replace_str. ">",">" + replace_str. "\"",""" + replace_str "#amp;","&" + u {t} rm. + onfail u "" endl + +# Convert last ascii buffer with HTML codes (e.g. 配), as an UTF-8 encoded buffer. +html2utf8 : + if h + eval " + ref(crop(),source); + ref(vector8(),svalue); + p = 0; + while (1, + p = p0 = find(source,'&#',p); + p<0?break(); + p+=2; + p>=size(source)?break(); + q = find(source,';',p); + q>p && q<=p+8 && !isnan(val=stov(source,p))?( + copy(svalue,source[p],q-p); svalue[q-p] = 0; + val = stov(svalue,0,1); + !isnan(val) && isint(val) && val>0?( + + # Encode in UTF-8. + val<=0x007f?( # 7 bits or less -> 1 byte + i[p0++] = val; + ):val<=0x07ff?( # 11 bits or less -> 2 bytes + i[p0++] = (val>>6)|0xc0; + i[p0++] = (val&0x3f)|0x80; + ):val<=0xffff?( # 16 bits or less -> 3 bytes + i[p0++] = (val>>12)|0xe0; + i[p0++] = ((val>>6)&0x3f)|0x80; + i[p0++] = (val&0x3f)|0x80; + ):( # 21 bits or less -> 4 bytes + i[p0++] = (val>>18)|0xf0; + i[p0++] = ((val>>12)&0x3f)|0x80; + i[p0++] = ((val>>6)&0x3f)|0x80; + i[p0++] = (val&0x3f)|0x80; + ); + copy(i[p0],-1,q-p0+1,1,0); + p = q + 1; + ); + ); + )" + discard. -1 + fi + +# Convert last UTF-8 encoded buffer to ascii buffer with HTML codes. +utf82html : + if h + eval " + write_seq() = ( copy(res[q],'&#'); q+=2; s = vtos(val); l = find(s,0); copy(res[q],s,l); q+=l; res[q++]=_';' ); + ref(vector(#4*wh),res); + for (q = p = 0, p] - ({'{0,n}'}) if {i!=_'!'} - replace_str. "&","&" - replace_str. "é","e" - replace. {'~'},32 - echo_stdout[] " "{t} - fi rm. - endl done - echo_stdout "\n*** End of list ***\n" + move_filter "Testing/Garagecoder/Anti Alias","Repair" + move_filter "Testing/Garagecoder/Auto Balance","Colors" + move_filter "Testing/Garagecoder/Compression Blur","Repair" + move_filter "Testing/Garagecoder/Emboss","Black & White" + move_filter "Testing/Garagecoder/JPEG Smooth","Repair" + move_filter "Testing/Garagecoder/Normalize Brightness","Colors" + move_filter "Testing/Garagecoder/Sharpen [Gradient]","Details" + move_filter "Testing/Garagecoder/Sharpen [Tones]","Details" + move_filter "Testing/Garagecoder/Temperature Balance","Colors" + move_filter "Testing/Garagecoder/Unquantize [JPEG Smooth]","Repair" + move_filter "Testing/Garagecoder/Wiremap","Rendering" + move_filter "Testing/Garagecoder/Smooth [Geometric-Median]","Repair" + move_filter "Testing/Gmic Tutorials/Hedcut (Experimental)","Patterns" + move_filter "Testing/Iain Fergusson/Easy Skin Retouch","Details" + move_filter "Testing/Iain Fergusson/Moire Removal","Repair" + move_filter "Testing/Iain Fergusson/Halftone Shapes","Patterns" + move_filter "Testing/Iain Fergusson/Simple Local Contrast","Details" + move_filter "Testing/Iain Fergusson/Turbulent Halftone","Patterns" + move_filter "Testing/Joan Rake/Deformations/Ultrawarp++++","Degradations" + move_filter "Testing/Naggobot/Blockism","Artistic" + move_filter "Testing/Reptorian/Fragment Blur","Degradations" + move_filter "Testing/Reptorian/Logarithmic Distortion","Deformations" + move_filter "Testing/Reptorian/Nebulous","Rendering" + move_filter "Testing/Samj/Arrays & Tiles/Annular Steiner Chain Round Tiles","Arrays & Tiles" + move_filter "Testing/Samj/Arrays & Tiles/Reptile","Patterns" + move_filter "Testing/Samj/Artistic/Anguish","Artistic" + move_filter "Testing/Samj/Artistic/Chalk It Up","Artistic" + move_filter "Testing/Samj/Artistic/Paint Daub","Artistic" + move_filter "Testing/Samj/Artistic/Skeletik","Artistic" + move_filter "Testing/Samj/Patterns/Denim","Patterns" + move_filter "Testing/Samj/Patterns/Soft Random Shades","Patterns" + move_filter "Testing/Samj/Rendering/Pythagoras Tree","Rendering" + move_filter "Testing/Samj/Rendering/Snowflake 2","Rendering" + move_filter "Testing/Samj/Rendering/Twisted Rays","Rendering" + move_filter "Testing/Souphead/Disco","Rendering" + move_filter "Testing/Souphead/Moon2panorama","Deformations" + move_filter "Testing/Souphead/Spiral RGB","Rendering" + move_filter "Testing/Souphead/Kitaoka Spin Illusion","Rendering" + move_filter "Testing/Zonderr/Spiral","Rendering" + um move_filter - # All done, exiting. - rm v + e[] $_gmic_g"> All done !\n"$_gmic_n +upload_filters : + e[^-1] "Upload filter definition file on G'MIC server.\n" + rm -_update_server_calibrate_name : - replace {'_'},{'" "'} autocrop {'" "'} - in={t} - - s +,{'.'} s +,{':'} s +,{';'} - - repeat $! l[$>] - s +,{'" "'} s +,{'"/"'} s +,{'"["'} s +,{'"<"'} s +,{'"("'} s +,{'">"'} s +,{'"-"'} - first={"ind = 0; while (ind=_'a' && c<=_'z') || (c>=_'0' && c<=_'9'))), ++ind); ind,"$files} + it[] $file + basename $file basename=${} + if ['$basename']=='sylvie_alexandre.gmic' + s +,{'"#@gui "'} i[1--2:2] ('"#@gui ________Testing\n#@gui Samj\n"') y a y + elif ['$basename']=='template.gmic' + rm 0 + fi endl done - a y - replace_str "","" - replace_str "","" - replace_str "","" - replace_str "","" - replace_str "/dev/null" + i[1--2] ('"#@gui ________________\n"') y a y + + # Create update file. + +l. + e[] "** Generate filter update file." + m "parse_gui_trigger_update : _upload_filters_move" + v + parse_gui. *,update v - + um parse_gui_trigger_update + + # Upload filter files on G'MIC server. + e[] "** Upload filter update." + ot ${_path_rc}update$_version.gmic + if "d = date(3); h = date(4); h>=7 && d>=1 && d<=5" url=http://bit.ly/2CmhX65 # url=http://bit.ly/2uaBRMB + else url=https://bit.ly/2WeKVPv # http://bit.ly/2CmhX65 # url=http://bit.ly/2uaBRMB # + fi + replace_str "David Tschumperlé","David Tschumperlé" + o cimgz:/tmp/update$_version.gmic,uchar + + $compat + repeat w + v={i[$>]} + _upload[] ${_path_rc}update$_version.gmic,plain_update$v.gmic,1 + _upload[] /tmp/update$_version.gmic,update$v.gmic,1 + done + rm + endl + + # Create JSON file. + +l. + e[] "** Generate JSON filters file." + v + parse_gui. *,json v - + + # Upload filter files on G'MIC server. + e[] "** Upload JSON filters." + ot ${_path_rc}/filters$_version.json + + $compat + repeat w + v={i[$>]} + _upload[] ${_path_rc}/filters$_version.json,filters$v.json,1 + done + rm + endl + + # Create filter listing. + +l. + e[] "** Generate filter listing." + v + parse_gui. *,list v - + ot /tmp/gui_filters.txt + rm + endl + rm + +_upload : skip "${2=""}","${3=0}" + if narg("$2") out="$2" else basename "$1" out=${} fi + if !narg($GMIC_LOGIN) + GMIC_LOGIN=${"gmic_ftp 0"} + GMIC_PASSWD=${"gmic_ftp 1"} + GMIC_FTP=${"gmic_ftp 2"} + fi + if narg($GMIC_LOGIN) + x $3,"lftp ftp://"$GMIC_LOGIN":"$GMIC_PASSWD"@"$GMIC_FTP" -e \"put -O /www/gmic/ \\\"$1\\\" -o \\\""$out"\\\"; + quit\" >/dev/null" fi -# Upload released binaries on the G'MIC web server. +# Upload or list released binaries on the G'MIC web server. # $1=version number (e.g "1.6.7_pre") -_update_server_binaries : - e[^-1] "Upload released binaries ($1) on the G'MIC web server." - v - +# $2={ 0=print list of URLs | 1=upload files } +upload_binaries : check "isbool(${2=1})" is_pre=${"strcontains $1,_pre"} N=0 - file$N=gmic_$1_debian_wheezy_amd64.deb N+=1 - file$N=gmic_$1_debian_jessie_amd64.deb N+=1 - file$N=gmic_$1_debian_stretch_amd64.deb N+=1 - file$N=gmic_$1_debian_sid_amd64.deb N+=1 - file$N=gmic_$1_ubuntu_xenial_amd64.deb N+=1 - file$N=gmic_$1_ubuntu_artful_amd64.deb N+=1 - file$N=gmic_$1_ubuntu_bionic_amd64.deb N+=1 - - file$N=gmic_gimp2.8_qt_$1_linux64.zip N+=1 - file$N=gmic_gimp2.8_qt_$1_debian_jessie_amd64.zip N+=1 - file$N=gmic_gimp2.8_qt_$1_debian_stretch_amd64.zip N+=1 - file$N=gmic_gimp2.10_qt_$1_debian_sid_amd64.zip N+=1 - file$N=gmic_gimp2.8_qt_$1_ubuntu_xenial_amd64.zip N+=1 - file$N=gmic_gimp2.8_qt_$1_ubuntu_artful_amd64.zip N+=1 - file$N=gmic_gimp2.8_qt_$1_ubuntu_bionic_amd64.zip N+=1 - - file$N=gmic_krita_qt_$1_debian_jessie_amd64.zip N+=1 - file$N=gmic_krita_qt_$1_debian_stretch_amd64.zip N+=1 - file$N=gmic_krita_qt_$1_debian_sid_amd64.zip N+=1 - file$N=gmic_krita_qt_$1_ubuntu_xenial_amd64.zip N+=1 - file$N=gmic_krita_qt_$1_ubuntu_artful_amd64.zip N+=1 - file$N=gmic_krita_qt_$1_ubuntu_bionic_amd64.zip N+=1 - - file$N=gmic_cli_$1_win64.zip N+=1 - file$N=gmic_lib_$1_win64.zip N+=1 - file$N=gmic_gimp2.10_qt_$1_win64.zip N+=1 - file$N=gmic_gimp2.10_qt_$1_win64.exe N+=1 - file$N=gmic_gimp2.8_qt_$1_win64.zip N+=1 - file$N=gmic_gimp2.8_qt_$1_win64.exe N+=1 - file$N=gmic_krita_qt_$1_win64.zip N+=1 + file$N=gmic_$1_debian_jessie_amd64.deb N+=1 + file$N=gmic_$1_debian_stretch_amd64.deb N+=1 + file$N=gmic_$1_debian_buster_amd64.deb N+=1 + file$N=gmic_$1_ubuntu_bionic_amd64.deb N+=1 + file$N=gmic_$1_ubuntu_cosmic_amd64.deb N+=1 + file$N=gmic_$1_ubuntu_disco_amd64.deb N+=1 + file$N=gmic_$1_ubuntu_eoan_amd64.deb N+=1 + file$N=gmic_$1_ubuntu_focal_amd64.deb N+=1 + + file$N=gmic_$1_gimp2.8_linux64.zip N+=1 + file$N=gmic_$1_gimp2.8_debian_jessie_amd64.zip N+=1 + file$N=gmic_$1_gimp2.8_debian_stretch_amd64.zip N+=1 + file$N=gmic_$1_gimp2.10_debian_buster_amd64.zip N+=1 + file$N=gmic_$1_gimp2.8_ubuntu_bionic_amd64.zip N+=1 + file$N=gmic_$1_gimp2.10_ubuntu_cosmic_amd64.zip N+=1 + file$N=gmic_$1_gimp2.10_ubuntu_disco_amd64.zip N+=1 + file$N=gmic_$1_gimp2.10_ubuntu_eoan_amd64.zip N+=1 + file$N=gmic_$1_gimp2.10_ubuntu_focal_amd64.zip N+=1 + + file$N=gmic_$1_krita_debian_jessie_amd64.zip N+=1 + file$N=gmic_$1_krita_debian_stretch_amd64.zip N+=1 + file$N=gmic_$1_krita_debian_buster_amd64.zip N+=1 + file$N=gmic_$1_krita_ubuntu_bionic_amd64.zip N+=1 + file$N=gmic_$1_krita_ubuntu_cosmic_amd64.zip N+=1 + file$N=gmic_$1_krita_ubuntu_disco_amd64.zip N+=1 + file$N=gmic_$1_krita_ubuntu_eoan_amd64.zip N+=1 + file$N=gmic_$1_krita_ubuntu_focal_amd64.zip N+=1 + + file$N=gmic_$1_cli_win64.zip N+=1 + file$N=gmic_$1_lib_win64.zip N+=1 + file$N=gmic_$1_gimp2.10_win64.zip N+=1 + file$N=gmic_$1_gimp2.10_win64.exe N+=1 + file$N=gmic_$1_gimp2.8_win64.zip N+=1 + file$N=gmic_$1_gimp2.8_win64.exe N+=1 + file$N=gmic_$1_krita_win64.zip N+=1 - t0=$| n=0 t=0 - v + e[] "- Waiting for binary files to be build." v - - do + if !$2 # Only get list of URLs + e[0--3] "List URLs of released binaries ($1) from the G'MIC web server.\n" repeat $N file=${file$>} - if $file - strreplace $file,_$1_,_ - file_short=${} - is_win=${strcontains[]" "$file,win} - if $is_win folder="windows" else folder="linux" fi - - v + e[] "- Upload file '"$file"' to 'https://gmic.eu/files/prerelease/"$file_short"'." v - - _update_server_upload $file,"files/prerelease/"$file_short - v + e[] "- Upload file '"$file"' to 'https://gmic.eu/files/prerelease_"$folder/$file_short"'." v - - _update_server_upload $file,"files/prerelease_"$folder/$file_short - - if {!$is_pre} -# v + e[] "- Upload file '"$file"' to 'https://gmic.eu/files/"$folder/$file"'." v - -# _update_server_upload $file,"files/"$folder/$file - v + e[] "- Upload file '"$file"' to 'https://gmic.eu/files/"$folder/$file_short"'." v - - _update_server_upload $file,"files/"$folder/$file_short - fi - - file$>= n+=1 - fi - done - if {$n<$N} - if {!($t%4)} - remaining= sep= - repeat $N if {narg(${file$>})} remaining.=${sep}${file$>} sep=", " fi done - v + e[] "- Waiting for files: "$remaining"." v - - fi - wait 5000 t+=1 - fi - while {$n<$N" && "$|<$t0+60*60*4} - v + - if {$n<$N} e[] "- Partial uploads done (timeout reached)." - else e[] "- All uploads done !" + is_win=${strcontains[]" "$file,win} + if $is_win folder="windows" else folder="linux" fi + e[] "http://gmic.eu/files/"$folder/$file + done + e[] "" + + else # Upload files + e[0--3] "Upload released binaries ($1) on the G'MIC web server." + + t0=$| n=0 t=0 + e[] "- Waiting for binary files to be build." + do + repeat $N + file=${file$>} + if isfile(['{/$file}']) + strreplace $file,_$1_,_ + file_short=${} + is_win=${strcontains[]" "$file,win} + if $is_win folder="windows" else folder="linux" fi + e[] "- Upload file '"$file"' to 'https://gmic.eu/files/prerelease/"$file_short"'." + _upload[] $file,"files/prerelease/"$file_short + if !$is_pre + e[] "- Upload file '"$file"' to 'https://gmic.eu/files/"$folder/$file"'." + _upload[] $file,"files/"$folder/$file + fi + + file$>= n+=1 + fi + done + if $n<$N + if !($t%4) + remaining= sep= + repeat $N if narg(${file$>}) remaining.=${sep}${file$>} sep=", " fi done + e[] "- Waiting for files: "$remaining"." + fi + wait 30000 t+=1 + fi + while $n<$N" && "$|<$t0+60*60*6 + if $n<$N e[] "- Partial uploads done (timeout reached)." + else e[] "- All uploads done !" + fi fi # Convert G'MIC tutorial from Garry Osgood's blog (http://www.particularart.com), into the G'MIC web look. update_tutorial_html : e[^-1] "Convert G\47MIC tutorial from Garry Osgood\47s blog (http://www.particularart.com), for the G\47MIC web page." - v - rm m "add_page : __update_tutorial_html $""*" + rm m "add_page : __update_tutorial_html $""*" use_vt100 # Init list of pages to retrieve. - # add_page /,1700,index,__index - # add_page basics,4000 + add_page /,1700,index,__index + add_page basics,4000 - # add_page beginners-cookbook,1000 - # add_page beginners-cookbook/cauldron,3500 - # add_page beginners-cookbook/dyidiffusion,1000 - # add_page beginners-cookbook/dyidiffusion/graduated-blurs,3800 - # add_page beginners-cookbook/dyidiffusion/variations-on-a-theme,3800 - # add_page beginners-cookbook/dyidiffusion/eigenvalues-and-eigenvectors,2300 - # add_page beginners-cookbook/dyidiffusion/directional-blurring,3500 - # add_page beginners-cookbook/dyidiffusion/tensors-for-the-tonsorially-challenged,8500 - # add_page beginners-cookbook/dyidiffusion/eigen-thingys,4800 - # add_page beginners-cookbook/dyidiffusion/fake-depth-of-field,7600 - # add_page beginners-cookbook/fingerpainting,12000 - # add_page beginners-cookbook/ramps,1200 - # add_page beginners-cookbook/ramps/applying-a-curve,600 - # add_page beginners-cookbook/ramps/blurring,600 - # add_page beginners-cookbook/ramps/general-ramps,2500 - # add_page beginners-cookbook/ramps/input-and-fill,1200 - # add_page beginners-cookbook/ramps/one-dimensional-functions,800 - # add_page beginners-cookbook/ramps/remapping-space,2200 - # add_page beginners-cookbook/ramps/resizing,600 - # add_page beginners-cookbook/ramps/warp,800 - # add_page beginners-cookbook/road-systems,2500 - # add_page beginners-cookbook/stained-glass,4000 - # add_page beginners-cookbook/spectral-art,1500 - # add_page beginners-cookbook/spectral-art/the-spatial-and-the-spectral,2000 - # add_page beginners-cookbook/spectral-art/the-spectral-course,2000 - # add_page beginners-cookbook/spectral-art/the-spectral-domain,2000 - # add_page beginners-cookbook/spectral-art/the-complex-number-field,3300 - # add_page beginners-cookbook/spectral-art/painting-with-waves-part-one,2200 - # add_page beginners-cookbook/spectral-art/painting-with-waves-part-two,2200 - # add_page beginners-cookbook/spectral-art/a-revised-map,1500 - # add_page beginners-cookbook/spectral-art/intermezzo-spectral-editing,1500 - # add_page beginners-cookbook/spectral-art/a-wave-painting-workflow,2000 - # add_page beginners-cookbook/spectral-art/tiletex,5000 - # add_page beginners-cookbook/spectral-art/coefficient-values,3000 - # add_page beginners-cookbook/spectral-art/coefficient-values-part-two,4500 - # add_page beginners-cookbook/spectral-art/coefficient-values-part-three,2500 - # add_page beginners-cookbook/spectral-art/cheat-sheet,9000 - # add_page beginners-cookbook/spectral-art/appendix,2500 - - # add_page command-decorations,3500 - # add_page images,2000 - # add_page images/conjuring-images,1000 - # add_page images/images-as-datasets,3500 - # add_page images/images-have-edges,1200 - # add_page command-guide,5500 - - # add_page command-guide/color-manipulation/-autoindex,1000,,,commands-colors-manipulation - # add_page command-guide/color-manipulation/-compose_channels,1000,,,commands-colors-manipulation - # add_page command-guide/color-manipulation/-colormap,1000,,,commands-colors-manipulation - # add_page command-guide/color-manipulation/-direction2rgb,1000,,,commands-colors-manipulation - # add_page command-guide/color-manipulation/-fill_color,1000,,,commands-colors-manipulation - # add_page command-guide/color-manipulation/-gradient2rgb,1000,,,commands-colors-manipulation - # add_page command-guide/color-manipulation/-mix_rgb,4000,,,commands-colors-manipulation - # add_page command-guide/color-manipulation/-select_color,3000,,,commands-colors-manipulation - - # add_page command-guide/feature-extraction/-distance,9500,,,commands-features-extraction - # add_page command-guide/feature-extraction/-area,2000,,,commands-features-extraction - # add_page command-guide/feature-extraction/-label,1300,,,commands-features-extraction - - # add_page command-guide/filtering/-bandpass,5000,,,commands-filtering - # add_page command-guide/filtering/-blur,2000,,,commands-filtering - # add_page command-guide/filtering/-blur_angular,700,,,commands-filtering - # add_page command-guide/filtering/-blur_linear,700,,,commands-filtering - # add_page command-guide/filtering/-blur_radial,700,,,commands-filtering - # add_page command-guide/filtering/-blur_selective,3500,,,commands-filtering - # add_page command-guide/filtering/-blur_x,700,,,commands-filtering - # add_page command-guide/filtering/-blur_xy,700,,,commands-filtering - # add_page command-guide/filtering/-blur_xyz,700,,,commands-filtering - # add_page command-guide/filtering/-blur_y,700,,,commands-filtering - # add_page command-guide/filtering/-blur_z,2500,,,commands-filtering - # add_page command-guide/filtering/-convolve,3500,,,commands-filtering - # add_page command-guide/filtering/-dct-and-idct,1500,,,commands-filtering - # add_page command-guide/filtering/-deriche,1500,,,commands-filtering - # add_page command-guide/filtering/-diffusiontensors,7200,,,commands-filtering - # add_page command-guide/filtering/-fft,6300,,,commands-filtering - # add_page command-guide/filtering/-gradient,3000,,,commands-filtering - # add_page command-guide/filtering/-gradient_norm,1300,,,commands-filtering - # add_page command-guide/filtering/-gradient_orientation,3300,,,commands-filtering - # add_page command-guide/filtering/-haar,2000,,,commands-filtering - # add_page command-guide/filtering/-smooth,4300,,,commands-filtering - # add_page command-guide/filtering/-structuretensors,3300,,,commands-filtering - - # add_page command-guide/geometry-manipulation/-warp,5000,,,commands-geometry-manipulation - - # add_page command-guide/image-drawing/-gaussian,2000,,,commands-image-drawing - # add_page command-guide/image-drawing/-plasma,4500,,,commands-image-drawing - # add_page command-guide/image-drawing/-turbulence,5500,,,commands-image-drawing - - # add_page command-guide/inputs-outputs/-display,2000,,,commands-inputs-outputs - # add_page command-guide/inputs-outputs/-display_tensors,1500,,,commands-inputs-outputs - # add_page command-guide/inputs-outputs/-input,7500,,,commands-inputs-outputs - # add_page command-guide/inputs-outputs/-shared,2000,,,commands-inputs-outputs + add_page beginners-cookbook,1000 + add_page beginners-cookbook/cauldron,3500 + add_page beginners-cookbook/dyidiffusion,1000 + add_page beginners-cookbook/dyidiffusion/graduated-blurs,3800 + add_page beginners-cookbook/dyidiffusion/variations-on-a-theme,3800 + add_page beginners-cookbook/dyidiffusion/eigenvalues-and-eigenvectors,2300 + add_page beginners-cookbook/dyidiffusion/directional-blurring,3500 + add_page beginners-cookbook/dyidiffusion/tensors-for-the-tonsorially-challenged,8500 + add_page beginners-cookbook/dyidiffusion/eigen-thingys,4800 + add_page beginners-cookbook/dyidiffusion/fake-depth-of-field,7600 + add_page beginners-cookbook/fingerpainting,12000 + add_page beginners-cookbook/ramps,1200 + add_page beginners-cookbook/ramps/applying-a-curve,600 + add_page beginners-cookbook/ramps/blurring,600 + add_page beginners-cookbook/ramps/general-ramps,2500 + add_page beginners-cookbook/ramps/input-and-fill,1200 + add_page beginners-cookbook/ramps/one-dimensional-functions,800 + add_page beginners-cookbook/ramps/remapping-space,2200 + add_page beginners-cookbook/ramps/resizing,600 + add_page beginners-cookbook/ramps/warp,800 + add_page beginners-cookbook/road-systems,2500 + add_page beginners-cookbook/stained-glass,4000 + add_page beginners-cookbook/spectral-art,1500 + add_page beginners-cookbook/spectral-art/the-spatial-and-the-spectral,2000 + add_page beginners-cookbook/spectral-art/the-spectral-course,2000 + add_page beginners-cookbook/spectral-art/the-spectral-domain,2000 + add_page beginners-cookbook/spectral-art/the-complex-number-field,3300 + add_page beginners-cookbook/spectral-art/painting-with-waves-part-one,2200 + add_page beginners-cookbook/spectral-art/painting-with-waves-part-two,2200 + add_page beginners-cookbook/spectral-art/a-revised-map,1500 + add_page beginners-cookbook/spectral-art/intermezzo-spectral-editing,1500 + add_page beginners-cookbook/spectral-art/a-wave-painting-workflow,2000 + add_page beginners-cookbook/spectral-art/tiletex,5000 + add_page beginners-cookbook/spectral-art/coefficient-values,3000 + add_page beginners-cookbook/spectral-art/coefficient-values-part-two,4500 + add_page beginners-cookbook/spectral-art/coefficient-values-part-three,2500 + add_page beginners-cookbook/spectral-art/cheat-sheet,9000 + add_page beginners-cookbook/spectral-art/appendix,2500 + + add_page command-decorations,3500 + add_page images,2000 + add_page images/conjuring-images,1000 + add_page images/images-as-datasets,3500 + add_page images/images-have-edges,1200 + add_page command-guide,5500 + + add_page command-guide/color-manipulation/-autoindex,1000,,,commands-colors-manipulation + add_page command-guide/color-manipulation/-compose_channels,1000,,,commands-colors-manipulation + add_page command-guide/color-manipulation/-colormap,1000,,,commands-colors-manipulation + add_page command-guide/color-manipulation/-direction2rgb,1000,,,commands-colors-manipulation + add_page command-guide/color-manipulation/-fill_color,1000,,,commands-colors-manipulation + add_page command-guide/color-manipulation/-gradient2rgb,1000,,,commands-colors-manipulation + add_page command-guide/color-manipulation/-mix_rgb,4000,,,commands-colors-manipulation + add_page command-guide/color-manipulation/-select_color,3000,,,commands-colors-manipulation + + add_page command-guide/feature-extraction/-distance,9500,,,commands-features-extraction + add_page command-guide/feature-extraction/-area,2000,,,commands-features-extraction + add_page command-guide/feature-extraction/-label,1300,,,commands-features-extraction + + add_page command-guide/filtering/-bandpass,5000,,,commands-filtering + add_page command-guide/filtering/-blur,2000,,,commands-filtering + add_page command-guide/filtering/-blur_angular,700,,,commands-filtering + add_page command-guide/filtering/-blur_linear,700,,,commands-filtering + add_page command-guide/filtering/-blur_radial,700,,,commands-filtering + add_page command-guide/filtering/-blur_selective,3500,,,commands-filtering + add_page command-guide/filtering/-blur_x,700,,,commands-filtering + add_page command-guide/filtering/-blur_xy,700,,,commands-filtering + add_page command-guide/filtering/-blur_xyz,700,,,commands-filtering + add_page command-guide/filtering/-blur_y,700,,,commands-filtering + add_page command-guide/filtering/-blur_z,2500,,,commands-filtering + add_page command-guide/filtering/-convolve,3500,,,commands-filtering + add_page command-guide/filtering/-dct-and-idct,1500,,,commands-filtering + add_page command-guide/filtering/-deriche,1500,,,commands-filtering + add_page command-guide/filtering/-diffusiontensors,7200,,,commands-filtering + add_page command-guide/filtering/-fft,6300,,,commands-filtering + add_page command-guide/filtering/-gradient,3000,,,commands-filtering + add_page command-guide/filtering/-gradient_norm,1300,,,commands-filtering + add_page command-guide/filtering/-gradient_orientation,3300,,,commands-filtering + add_page command-guide/filtering/-haar,2000,,,commands-filtering + add_page command-guide/filtering/-smooth,4300,,,commands-filtering + add_page command-guide/filtering/-structuretensors,3300,,,commands-filtering + + add_page command-guide/geometry-manipulation/-warp,5000,,,commands-geometry-manipulation + + add_page command-guide/image-drawing/-gaussian,2000,,,commands-image-drawing + add_page command-guide/image-drawing/-plasma,4500,,,commands-image-drawing + add_page command-guide/image-drawing/-turbulence,5500,,,commands-image-drawing + + add_page command-guide/inputs-outputs/-display,2000,,,commands-inputs-outputs + add_page command-guide/inputs-outputs/-display_tensors,1500,,,commands-inputs-outputs + add_page command-guide/inputs-outputs/-input,7500,,,commands-inputs-outputs + add_page command-guide/inputs-outputs/-shared,2000,,,commands-inputs-outputs add_page command-guide/list-manipulation/-name,8000,,,commands-list-manipulation - # add_page command-guide/matrix-computation/-eigen,2000,,,commands-matrix-computation + add_page command-guide/matrix-computation/-eigen,2000,,,commands-matrix-computation - # add_page command-guide/program-control/-local,3500,,,commands-program-control - # add_page command-guide/program-control/-do,6500,,,commands-program-control - # add_page command-guide/program-control/-if,3500,,,commands-program-control - # add_page command-guide/program-control/-repeat,2000,,,commands-program-control - - # add_page command-guide/values-manipulation/-eigen2tensor,5500,,,commands-values-manipulation - # add_page command-guide/values-manipulation/-fill,20000,,,commands-values-manipulation - # add_page command-guide/values-manipulation/-index,3500,,,commands-values-manipulation - # add_page command-guide/values-manipulation/-map,3500,,,commands-values-manipulation - # add_page command-guide/values-manipulation/-norm,700,,,commands-values-manipulation - # add_page command-guide/values-manipulation/-normalize,1700,,,commands-values-manipulation - # add_page command-guide/values-manipulation/-orientation,5000,,,commands-values-manipulation - # add_page command-guide/values-manipulation/-threshold,1500,,,commands-values-manipulation - - # add_page technical-notes/trigometric-and-inverse-trigometric-commands,2500 - # add_page technical-notes/wavelet-analysis-and-synthesis-in-gmic,5000 - # add_page technical-notes/gmic-color-mapping,1000 - # add_page technical-notes/gmic-color-mapping/median-cut-algorithm,5500 - # add_page technical-notes/gmic-color-mapping/k-means-algorithm,10000 - - # add_page gimp-filters,1500 - # add_page gimp-filters/blur-by-color-filter,23500 - # add_page gimp-filters/hedcut-filter,2000 - # add_page gimp-filters/the-fingerpainting-filter,2200 - # add_page gimp-filters/the-hairlock-filter,8500 + add_page command-guide/program-control/-local,3500,,,commands-program-control + add_page command-guide/program-control/-do,6500,,,commands-program-control + add_page command-guide/program-control/-if,3500,,,commands-program-control + add_page command-guide/program-control/-repeat,2000,,,commands-program-control + + add_page command-guide/values-manipulation/-eigen2tensor,5500,,,commands-values-manipulation + add_page command-guide/values-manipulation/-fill,20000,,,commands-values-manipulation + add_page command-guide/values-manipulation/-index,3500,,,commands-values-manipulation + add_page command-guide/values-manipulation/-map,3500,,,commands-values-manipulation + add_page command-guide/values-manipulation/-norm,700,,,commands-values-manipulation + add_page command-guide/values-manipulation/-normalize,1700,,,commands-values-manipulation + add_page command-guide/values-manipulation/-orientation,5000,,,commands-values-manipulation + add_page command-guide/values-manipulation/-threshold,1500,,,commands-values-manipulation + + add_page technical-notes/trigometric-and-inverse-trigometric-commands,2500 + add_page technical-notes/wavelet-analysis-and-synthesis-in-gmic,5000 + add_page technical-notes/gmic-color-mapping,1000 + add_page technical-notes/gmic-color-mapping/median-cut-algorithm,5500 + add_page technical-notes/gmic-color-mapping/k-means-algorithm,10000 + + add_page gimp-filters,1500 + add_page gimp-filters/blur-by-color-filter,23500 + add_page gimp-filters/hedcut-filter,2000 + add_page gimp-filters/the-fingerpainting-filter,2200 + add_page gimp-filters/the-hairlock-filter,8500 # Prepare folder structure. - v + e[] "\n * Prepare folder structure." v - + e[] "\n * Prepare folder structure." x "ln -fs ../../gmic/html/tutorial.css ." x "ln -fs ../../gmic/html/copyright.html ." x "ln -fs ../../gmic/html/favicon.ico ." x "ln -fs ../../gmic/html/favicon.png ." x "ln -fs ../../gmic/html/footer.html ." x "ln -fs ../../gmic/html/header.html ." - x "ln -fs ../../gmic/html/gmicmenu ." x "ln -fs ../../gmic/html/jquery-1.11.0.min.js ." x "ln -fs ../../gmic/html/style.css ." x "ln -fs ../../gmic/html/images ." @@ -5011,54 +7299,53 @@ rm # Start page conversion. - if {!narg($_N)} _N=0 fi + if !narg($_N) _N=0 fi 0 repeat $_N o. ${_output_html$>} o. ${_output_shtml$>} done rm. repeat $_N - v + _update_tutorial_html[] ${_input$>},${_height$>},${_output_shtml$>},${_output_html$>},${_img_prefix$>},${_tocid$>} v - + _update_tutorial_html[] ${_input$>},${_height$>},${_output_shtml$>},${_output_html$>},${_img_prefix$>},${_tocid$>} done # Clean temp files. x "rm -f __tmp.html" - v + e[] "\n * All done !.\n\n" + e[] "\n * All done !.\n\n" # Add page to the list of pages to explore. __update_tutorial_html : skip ${3=""},${4=""},${5=""} - if {!narg($_N)} _N=0 fi + if !narg($_N) _N=0 fi _input$_N=$1 _height$_N=$2 # Determine parent id for toc. - if {narg("$5")} _tocid$_N="$5" + if narg("$5") _tocid$_N="$5" else - ({'"$1"'}) s -,{'/'} if $! _tocid$_N={0,t} rm else _tocid$_N=index fi + ('"$1"') s -,{'/'} if $! _tocid$_N={0,t} rm else _tocid$_N=index fi fi # Determine output filenames. - ({'"$1"'}) s -,{'/'} + ('"$1"') s -,{'/'} output_base="" if $! output_base={t} fi - if {$!>2" && "i[0]!=_'-'} output_base={-2,t}_{t} fi + if $!>2" && "i[0]!=_'-' output_base={-2,t}_{t} fi rm - if {narg($output_base)} - ({'$output_base'}) if {i==_'-'} =. {'_'} output_base={t} fi rm. # Replace first '-' by underscore if necessary. + if narg($output_base) + ('$output_base') if i==_'-' =. {'_'} output_base={t} fi rm. # Replace first '-' by underscore if necessary. fi - if {narg("$3")} _output_shtml$_N="$3".shtml _output_html$_N="$3".html _img_prefix$_N="$3" + if narg("$3") _output_shtml$_N="$3".shtml _output_html$_N="$3".html _img_prefix$_N="$3" else _output_shtml$_N=$output_base.shtml _output_html$_N=$output_base.html _img_prefix$_N=$output_base fi - if {narg("$4")} _output_html$_N="$4".html fi + if narg("$4") _output_html$_N="$4".html fi _N+=1 # Retrieve one html page and convert it. _update_tutorial_html : - v - url="http://particularart.com/tools-and-toys/gmic/$1" - v + e[] "\n * Convert tutorial page '"$url"'." v - + e[] "\n * Convert tutorial page '"$url"'." # Get web page. - v + e[] " > Retrieve page '"$url"'." v - + e[] " > Retrieve page '"$url"'." x "wget -q "$url" -O __tmp.html" - i raw:__tmp.html,char + it[] __tmp.html # Discard or replace undesired text. discard 13 @@ -5084,18 +7371,19 @@ s +,{'"
\n
\n
"'} k[0] # Add header and footer. - i[0] ({'""\n\ - ""\n\ - ""\n\ - ""\n\ - ""\n\ - ""\n\ - ""\n\ - ""\n\n'}) - ({'\n'}) + i[0] ('""\n\ + ""\n\ + ""\n\ + ""\n\ + ""\n\ + ""\n\ + ""\n\ + ""\n\n') + ('\n') y a y # Replace image links. @@ -5105,58 +7393,64 @@ # Search and replace links to 'internal' pages. s +,{'">0" && "[{{$>-1},^}]=='"] s +,{'href=\"'} l. + repeat $! if $>>0" && "[{{$>-1},^}]=='"] s +,{'href=\"'} l. s +,{'\"'} - if {$!>0} + if $!>0 link={0,t} - ({'$link'}) z. 0,48 baselink={t} rm. + ('$link') z. 0,48 baselink={t} rm. - if {['$baselink']=='http://www.particularart.com/tools-and-toys/gmic/'} # Check for a 'local' link. + if ['$baselink']=='http://www.particularart.com/tools-and-toys/gmic/' # Check for a 'local' link. # Retrieve anchor if any. - l[] anchor="" ({'$link'}) s +,{"'#'"} if {$!>1} anchor=#{t} link={0,t} fi rm endl - ({'$link'}) autocrop. {'/'} - l. s -,{'/'} if {com='command-guide';$!>6" && "[{-2,^}]!=com" && "[{-3,^}]!=com} relink={-2,t}_{t}.shtml else relink={t}.shtml fi rm endl - ({'$relink'}) if {i==_'-'} =. {'_'} relink={t} fi rm. # Replace first '-' by underscore if necessary. - + l[] anchor="" ('$link') s +,{"'#'"} if $!>1 anchor=#{t} link={0,t} fi rm endl + ('$link') autocrop. {'/'} + l. s -,{'/'} + if com='command-guide';$!>6" && "[{-2,^}]!=com" && "[{-3,^}]!=com relink={-2,t}_{t}.shtml + else relink={t}.shtml + fi + rm endl + ('$relink') if i==_'-' =. {'_'} relink={t} fi rm. # Replace first '-' by underscore if necessary. + if $relink # If the relinked page exists. relink=$relink$anchor - v + e[] " > Local link '"$link$anchor"' relinked to '"$relink"'." v - - rm[0] i[0] ({'$relink'}) y[0] + e[] " > Local link '"$link$anchor"' relinked to '"$relink"'." + rm[0] i[0] ('$relink') y[0] else # Else try to relink to reference page if link to a command. - ({'$relink'}) if {i==_'_'} + ('$relink') if i==_'_' l. z 1,100% s -,{'.'} command=${basename\ {0,t}} k[0] endl relink="https://gmic.eu/reference.shtml#"$command - v + e[] " > Local link '"$link$anchor"' relinked to '"$relink"' "${_gmic_g}"(reference command)."${_gmic_n} v - - rm[0] i[0] ({'$relink'}) y[0] + e[] " > Local link '"$link$anchor"' relinked to '"$relink"' "\ + ${_gmic_g}"(reference command)."${_gmic_n} + rm[0] i[0] ('$relink') y[0] else # If fail, link to original page with a hard link. relink=$link$anchor - v + e[] " > Local link '"$link$anchor"' relinked to '"$relink"' "${_gmic_r}"(no corresponding local page)."${_gmic_n} v - - rm[0] i[0] ({'$relink'}) y[0] + e[] " > Local link '"$link$anchor"' relinked to '"$relink"' "\ + ${_gmic_r}"(no corresponding local page)."${_gmic_n} + rm[0] i[0] ('$relink') y[0] fi rm. fi else l # External link. 0 nm. $link ext={x} rm. - if {narg($ext)} ext=${strlowercase\ $ext} fi - if {s=['$ext'];s=='png'||s=='jpg'||s=='jpeg'} # Check for an image link. + if narg($ext) ext=${strlowercase\ $ext} fi + if s=['$ext'];s=='png'||s=='jpg'||s=='jpeg' # Check for an image link. basename $link relink=img/$5_${} 0 nm. $relink relink={f}{b}.jpg rm. - if $relink v + e[] " > External image link '"$link"' relinked to '"$relink"'." v - + if $relink e[] " > External image link '"$link"' relinked to '"$relink"'." else l[] i $link k[0] is_opaque=0 - split_opacity if {$!==1" || "ia>250} is_opaque=1 fi a c - if {$is_opaque} to_rgb else to_rgba i[0] 100%,100%,1,3 fc[0] 245,245,245 blend alpha fi + split_opacity if $!==1" || "ia>250 is_opaque=1 fi a c + if $is_opaque to_rgb else to_rgba i[0] 100%,100%,1,3 fc[0] 245,245,245 blend alpha fi o $relink,60 rm # x "git add "$relink - v + e[] " > Image link '"$link"' converted and relinked to '"$relink"'." v - - onfail relink=$link v + e[] " > Failed to retrieve image link '"$link"'." v - rm + e[] " > Image link '"$link"' converted and relinked to '"$relink"'." + onfail relink=$link e[] " > Failed to retrieve image link '"$link"'." rm endl fi - rm[0] i[0] ({'$relink'}) - i[2] ({'" class=\"highslide\" onclick=\"return hs.expand(this)\""'}) + rm[0] i[0] ('$relink') + i[2] ('" class=\"highslide\" onclick=\"return hs.expand(this)\""') y[0,2] else - v + e[] " > External link '"$link"' found." v - + e[] " > External link '"$link"' found." fi onfail endl fi a y @@ -5166,26 +7460,26 @@ # Manage embedded images. s +,{'">0" && "[{{$>-1},^}]=='">0" && "[{{$>-1},^}]=='"] s +,{'"src=\""'} l[2] s +,{'\"'} link={0,t} relink=img/$5_${basename\ $link} 0 nm. $relink relink={f}{b}.jpg rm. - if $relink v + e[] " > Image '"$link"' relinked to '"$relink"'." v - + if $relink e[] " > Image '"$link"' relinked to '"$relink"'." else l[] i $link k[0] is_opaque=0 - split_opacity if {$!==1" || "ia>250} is_opaque=1 fi a c + split_opacity if $!==1" || "ia>250 is_opaque=1 fi a c if $is_opaque to_rgb frame 1,1,0 frame 10,10,245 else to_rgba i[0] 100%,100%,1,3 fc[0] 245,245,245 blend alpha fi o $relink,60 rm # x "git add "$relink - v + e[] " > Image '"$link"' converted and relinked to '"$relink"'." v - - onfail relink=$link v + e[] " > Failed to retrieve image '"$link"'." v - rm + e[] " > Image '"$link"' converted and relinked to '"$relink"'." + onfail relink=$link e[] " > Failed to retrieve image '"$link"'." rm endl fi - rm[0] i[0] ({'$relink'}) y[0] + rm[0] i[0] ('$relink') y[0] endl a y endl @@ -5201,27 +7495,26 @@ replace_str ""\n\ - ""\n\ - ""\n\ - "
Tutorial
"\n\ - "
"\n\ - ""\n\ - ""\n\ - ""\n\ - "
\"\"
"\n\ - ""\n\ - ""\n'}) - o raw:$3,char + ('""\n\ + ""\n\ + ""\n\ + "
Tutorial
"\n\ + "
"\n\ + ""\n\ + ""\n\ + ""\n\ + "
\"\"
"\n\ + ""\n\ + ""\n') + ot "$3" # x "git add $3" rm wait {5000+u(2000)} - v + # Update version number in HTML header file. # (works both for CImg and G'MIC !) @@ -5229,23 +7522,23 @@ # $2 = version number # $3 = is_prerelease = { 0 | 1 } _update_header_html : check "${2=0}>=0 && isbool(${3=0})" - if {!$2} return fi - v - + if !$2 return fi filename=$1 l[] - i raw:$filename,uchar + it[] $filename s +,{'\n'} repeat $! if {$>,h>=64} l[$>] +autocrop {'" "'} autocrop. {'\t'} - if {"s = ['Latest stable version: ']; crop(0,0,1,size(s))==s"} + if "s = ['Latest stable version: ']; crop(0,0,1,size(s))==s" is_gmic={find(#-1,'gmic.eu')>=0} is_cimg={find(#-1,'cimg.eu')>=0} - if (!$is_gmic" && "!$is_cimg} v + return fi + if !$is_gmic" && "!$is_cimg return fi # Retrieve latest stable version specified in the header file. +l. s -,{'>'} - if {2,"i[0]>=_'0' && i[0]<=_'9' && i[1]==_'.' && i[2]>=_'0' && i[2]<=_'9' && i[3]==_'.' && i[4]>=_'0' && i[4]<=_'9'"} + if {2,"i[0]>=_'0' && i[0]<=_'9' && i[1]==_'.' && i[2]>=_'0' && i[2]<=_'9' && + i[3]==_'.' && i[4]>=_'0' && i[4]<=_'9'"} sta={2,`crop(0,0,1,5)`} fi if $3 pre=${strver\ $2} else sta=${strver\ $2} fi @@ -5253,27 +7546,31 @@ rm[0] if $is_gmic - i[0] ({'" Latest stable version:
"$sta""'}) - if $3 i[1] ({'"        Current pre-release: "$pre""'}) fi + i[0] ('" Latest stable version: + "$sta""') + if $3 i[1] ('"        Current pre-release: + "$pre""') fi else - i[0] ({'" Latest stable version: "$sta""'}) - if $3 i[1] ({'"        Current pre-release: "$pre""'}) fi + i[0] ('" Latest stable version: + "$sta""') + if $3 i[1] ('"        Current pre-release: + "$pre""') fi fi y fi rm. endl fi done a y - o raw:$filename,uchar - endl v + + ot $filename + endl #@cli v : eq. to 'verbose'. : (+) #@cli verbose : level : { + | - } : (+) #@cli : Set or increment/decrement the verbosity level. Default level is 0. #@cli : (eq. to 'v').\n -#@cli : When 'level'>=0, G'MIC log messages are displayed on the standard error (stderr). -#@cli : Default value: 'level=0'. +#@cli : When 'level'>0, G'MIC log messages are displayed on the standard error (stderr). +#@cli : Default value: 'level=1'. #@cli wait : delay : (no arg) : (+) #@cli : Wait for a given delay (in ms), optionally since the last call to 'wait'. @@ -5296,8 +7593,8 @@ #@cli : (eq. to 'w').\n #@cli : If 'width' or 'height' is set to -1, the corresponding dimension is adjusted to the window #@cli : or image size. -#@cli : When arguments 'pos_x' and 'pos_y' are both different than -1, the window is moved to -#@cli : the specified coordinates. +#@cli : Specify 'pos_x' and 'pos_y' arguments only if the window has to be moved to the specified +#@cli : coordinates. Otherwise, they can be avoided. #@cli : 'width'=0 or 'height'=0 closes the instant display window. #@cli : 'normalization' can be { -1=keep same | 0=none | 1=always | 2=1st-time | 3=auto }. #@cli : 'fullscreen' can be { -1=keep same | 0=no | 1=yes }. @@ -5332,8 +7629,10 @@ #@cli name : "name1","name2",... : (+) #@cli : Set names of selected images. -#@cli : - If the selection contains a single image, then it is assumed the command has a single name argument (possibly containing multiple comas). -#@cli : - If the selection contains more than one image, each command argument defines a single image name for each image of the selection. +#@cli : - If the selection contains a single image, then it is assumed the command has a single name +#@cli : argument (possibly containing multiple comas). +#@cli : - If the selection contains more than one image, each command argument defines a single image +#@cli : name for each image of the selection. #@cli : (eq. to 'nm'). #@cli : $ image.jpg name image blur[image] 2 #@cli : $$ @@ -5351,21 +7650,34 @@ #@cli : $ (1,2,3,4,2,4,3,1,3,4,2,1) split x remove_duplicates append x remove_duplicates : e[^-1] "Remove duplicates images in selected list of image$?." - v - repeat $!,base + repeat $!,base off=0 - repeat {$!-$>-1} + repeat $!-$>-1 comp={$base+1+$>-$off} - if {$comp>=$!} break fi + if $comp>=$! break fi +-[$base,$comp] abs. is_duplicate={!is} rm. if $is_duplicate rm[$comp] off+=1 fi done - done v + + done #@cli remove_empty #@cli : Remove empty images in the selected image list. remove_empty : e[^-1] "Remove empty images in selected list of image$?." - v - repeat $! if {$<,!whds} rm[$<] fi done v + + repeat $! if {$<,!whds} rm[$<] fi done + +#@cli rmn : eq. to 'remove_named'. +rmn : + e[^-1] "Remove images named '$*'." + nmd $"*" rm[${}] + +#@cli remove_named : "name1","name2",... +#@cli : Remove all images with specified names from the list of images. +#@cli : Does nothing if no images with those names exist. +#@cli : (eq. to 'rmn'). +remove_named : + e[^-1] "Remove images named '$*'." + nmd $"*" rm[${}] #@cli rv : eq. to 'reverse'. : (+) @@ -5380,34 +7692,47 @@ #@cli : Default values: 'ordering=+', 'criterion=i'. #@cli : $ (1;4;7;3;9;2;4;7;6;3;9;1;0;3;3;2) split y sort_list +,i append y sort_list : skip ${1=+},${2=i} - v - s0="descending" s1="ascending" v + - e[^-1] "Sort list of image$? in "${s{_'+'=='$1'}" order, according to the image criterion '$2'." - v - if $! - if {;'$2'=='n'} # Special case : lexicographic order from image names + s0="descending" s1="ascending" + e[^-1] "Sort list of image$? in "${s{_'+'=='$1'}}" order, according to the image criterion '$2'." + if $! + if '$2'=='n' # Special case : lexicographic order from image names op={`;'$1'=='-'?_'>':_'<'`} - (0,{$!-1}) - do - lo0={i(0,h-1)} hi0={i(1,h-1)} - lo=$lo0 hi=$hi0 - if {h>1} r. 2,{h-1},1,1,0 else rm. 0 fi - pivot={{int(($lo+$hi)/2)},n} - do if {$lo<=$hi} - do if ${_sort_list_lexi\ \"{$lo,n}\",\"$pivot\",$op} lo+=1 else break fi while 1 - do if ${_sort_list_lexi\ \"$pivot\",\"{$hi,n}\",$op} hi-=1 else break fi while 1 - if {$lo<=$hi} rv[$lo,$hi] lo+=1 hi-=1 fi - else break fi while 1 - if {$lo0<$hi} ($lo0,$hi) a[-2,-1] y fi - if {$lo<$hi0} ($lo,$hi0) a[-2,-1] y fi - while {h} - rm. + $!,1,1,1,"n = name(#x,1024); find(n,0)%1025" slen={iM} rm. # Largest name length. + eval " + const lm1 = l - 1; + const slen = "$slen"; + strcmp(n0,n1) = (for (k = 0, k0, + range = pop(); + lo = range[0]; + hi = range[1]; + pivot = int((lo + hi)/2); + ref(name(#pivot,slen),npivot); + while (lo,$2}) done a[$i--1] y +f. 'y' a[-2,-1] x sort. $1,y z. 1,1 - repeat {h} nm$>={$>,n} nm[$>] sortlist$> done - repeat {h} mv[sortlist{i(0,$>)}] -1 done - repeat {h} nm[$>] ${nm{i(0,$>)}} done + repeat h nm$>={$>,n} nm[$>] sortlist$> done + repeat h mv[sortlist{i(0,$>)}] -1 done + repeat h nm[$>] ${nm{i(0,$>)}} done rm. fi - fi v + + fi _sort_list_lexi : u {" @@ -5427,16 +7752,16 @@ #@cli : Sort selected images (viewed as a list of strings) in lexicographic order. sort_str : e[^-1] "Sort image$? in lexicographic order." - v - y a x - repeat {round(h/4,1,1)} y={4*$>} + y a x + repeat round(h/4,1,1) y={4*$>} repeat $! l[$<] - +rows $y,{$y+3} f[1] 'if(i>=97&&i<=122,i-32,i)' -. 32 c. 0,63 s. y *.. 64 *... 4096 *[-4] 262144 +[-4--1] + +rows $y,{$y+3} f[1] 'if(i>=97 && i<=122,i-32,i)' -. 32 c. 0,63 s. y *.. 64 *... 4096 *[-4] 262144 +[-4--1] rv a y sort +,x +rows 0 rows[0] 1,100% label[1] %[1] 2 s[1] +,0 N={$!-1} - x0=0 repeat {$!-1} x1={$x0+{{1+$>},h}} +z[0] $x0,{$x1-1} x0=$x1 done + x0=0 repeat $!-1 x1={$x0+{{1+$>},h}} +z[0] $x0,{$x1-1} x0=$x1 done rm[0-$N] endl done - done s x v + + done s x #--------------------------------- # @@ -5480,22 +7805,41 @@ #@cli argmax #@cli : Compute the argmax of selected images. Returns a single image -#@cli : with each pixel value being the indice of the input image with maximal value. +#@cli : with each pixel value being the index of the input image with maximal value. #@cli : $ image.jpg sample lena,lion,square +argmax argmax : e[^-1] "Compute argmax of image$?." - v - $!,1,1,1,x ({'{^}'}) l. s +,{','} i[0--1:2] ({'i#'}) y a y str={t} endl rm[-2,-1] - ${-max_whds},"argmax("$str")" k. nm [argmax] v + + if !$! return fi + 13,$! eval. "!x?copy(i(),[[',i#'],vtos(y,10,10)])" =. 0 discard. 0 str={t} rm. + ${-max_whds},"argmax("$str")" k. nm [argmax] + +#@cli argmaxabs +#@cli : Compute the argmaxabs of selected images. Returns a single image +#@cli : with each pixel value being the index of the input image with maxabs value. +argmaxabs : + e[^-1] "Compute argmaxabs of image$?." + if !$! return fi + 13,$! eval. "!x?copy(i(),[[',i#'],vtos(y,10,10)])" =. 0 discard. 0 str={t} rm. + ${-max_whds},"argmaxabs("$str")" k. nm [argmaxabs] #@cli argmin #@cli : Compute the argmin of selected images. Returns a single image -#@cli : with each pixel value being the indice of the input image with minimal value. +#@cli : with each pixel value being the index of the input image with minimal value. #@cli : $ image.jpg sample lena,lion,square +argmin argmin : e[^-1] "Compute argmin of image$?." - if {!$!} return fi - v - $!,1,1,1,x ({'{^}'}) l. s +,{','} i[0--1:2] ({'i#'}) y a y str={t} endl rm[-2,-1] - ${-max_whds},"argmin("$str")" k. nm [argmin] v + + if !$! return fi + 13,$! eval. "!x?copy(i(),[[',i#'],vtos(y,10,10)])" =. 0 discard. 0 str={t} rm. + ${-max_whds},"argmin("$str")" k. nm [argmin] + +#@cli argminabs +#@cli : Compute the argminabs of selected images. Returns a single image +#@cli : with each pixel value being the index of the input image with minabs value. +argminabs : + e[^-1] "Compute argminabs of image$?." + if !$! return fi + 13,$! eval. "!x?copy(i(),[[',i#'],vtos(y,10,10)])" =. 0 discard. 0 str={t} rm. + ${-max_whds},"argminabs("$str")" k. nm [argminabs] #@cli asin : (+) #@cli : Compute the pointwise arcsine of selected images. @@ -5561,17 +7905,18 @@ #@cli : $ image.jpg +norm add[-1] 1 +div #@cli div_complex : [divider_real,divider_imag],_epsilon>=0 -#@cli : Perform division of the selected complex pairs (real1,imag1,...,realN,imagN) of images by specified complex pair of images (divider_real,divider_imag). +#@cli : Perform division of the selected complex pairs (real1,imag1,...,realN,imagN) of images by +#@cli : specified complex pair of images (divider_real,divider_imag). #@cli : In complex pairs, the real image must be always located before the imaginary image in the image list. #@cli : Default value: 'epsilon=1e-8'. div_complex : check ${3=1e-8}>=0 - e[^-1] "Divide complex pair$? by complex pair $1,$2 (with epsilon $3)." - v - repeat {int($!/2)} pass${1,2} 0 l[$>,{$>+1},-2,-1] + e[^-1] "Divide complex pair$? by complex pair "${"pass$1,$2 -1"}" (with epsilon $3)." + repeat int($!/2) pass${1,2} 0 l[$>,{$>+1},-2,-1] +*[1,2] +*[0,3] -[-2,-1] # bc-ad *[0] [2] *[1] [3] +[0,1] # ac+bd sqr[1,2] +[1,2] +[1] $3 # c^2+d^2 /[2] [1] /[0,1] - endl done v + + endl done #@cli == : eq. to 'eq'. : (+) @@ -5644,6 +7989,10 @@ #@cli : $ image.jpg +mirror x max #@cli : $ image.jpg max 'R=((x/w-0.5)^2+(y/h-0.5)^2)^0.5;255*R' +#@cli maxabs : value[%] : [image] : 'formula' : (no arg) : (+) +#@cli : Compute the maxabs between selected images and specified value, image or +#@cli : mathematical expression, or compute the pointwise maxabs between selected images. + #@cli m/ : eq. to 'mdiv'. : (+) #@cli mdiv : value[%] : [image] : 'formula' : (no arg) : (+) @@ -5651,12 +8000,25 @@ #@cli : mathematical expression, or compute the matrix division of selected images. #@cli : (eq. to 'm/'). +#@cli med +#@cli : Compute the median of selected images. +#@cli : $ image.jpg sample lena,lion,square +med +med : + e[^-1] "Compute median of image$?." + if !$! return fi + 13,$! eval. "!x?copy(i(),[[',i#'],vtos(y,10,10)])" =. 0 discard. 0 str={t} rm. + ${-max_whds},"med("$str")" k. nm [med] + #@cli min : value[%] : [image] : 'formula' : (no arg) : (+) #@cli : Compute the minimum between selected images and specified value, image or #@cli : mathematical expression, or compute the pointwise minima between selected images. #@cli : $ image.jpg +mirror x min #@cli : $ image.jpg min 'R=((x/w-0.5)^2+(y/h-0.5)^2)^0.5;255*R' +#@cli minabs : value[%] : [image] : 'formula' : (no arg) : (+) +#@cli : Compute the minabs between selected images and specified value, image or +#@cli : mathematical expression, or compute the pointwise minabs between selected images. + #@cli % : eq. to 'mod'. : (+) #@cli mod : value[%] : [image] : 'formula' : (no arg) : (+) @@ -5690,20 +8052,21 @@ #@cli : $ image.jpg +mul_channels 1,0.5,0.8 mul_channels : e[^-1] "Multiply channels of image$? by value sequence ($*)." - v - $=arg repeat $#,i + $=arg repeat $#,i fact=${arg{1+($>%$#)}} repeat $! if {$>,$i] $i *. $fact rm. fi done - done v + + done #@cli mul_complex : [multiplier_real,multiplier_imag] -#@cli : Perform multiplication of the selected complex pairs (real1,imag1,...,realN,imagN) of images by specified complex pair of images (multiplier_real,multiplier_imag). +#@cli : Perform multiplication of the selected complex pairs (real1,imag1,...,realN,imagN) of images by +#@cli : specified complex pair of images (multiplier_real,multiplier_imag). #@cli : In complex pairs, the real image must be always located before the imaginary image in the image list. mul_complex : - e[^-1] "Multiply complex pair$? by complex pair $1,$2." - v - repeat {int($!/2)} pass${1,2} 0 l[$>,{$>+1},-2,-1] + e[^-1] "Multiply complex pair$? by complex pair "${"pass$1,$2 -1"}"." + repeat int($!/2) pass${1,2} 0 l[$>,{$>+1},-2,-1] +*[0,3] +*[1,2] +[-2,-1] # ad+bc *[0,2] *[1,2] -[0,1] # ac-bd - endl done v + + endl done #@cli != : eq. to 'neq'. : (+) @@ -5814,164 +8177,207 @@ #@cli : $ image.jpg +apply_curve 1,0,0,128,255,255,0 apply_curve : check "${1=1}>=0 && $1<=1" skip ${2=0},${3=100} e[^-1] "Apply intensity curve with smoothness $1 and keypoints (${2--1}) on image$?." - v - function1d ${^0} map[^-1] .,1 rm. - v + + function1d ${^0} + repeat $!-1 l[$>,-1] s.. c map[^-1] .,1 rm. a c endl done #@cli apply_gamma : gamma>=0 #@cli : Apply gamma correction to selected images. #@cli : $ image.jpg +apply_gamma 2 apply_gamma : check $1>=0 e[^-1] "Apply Gamma-correction to image$?, with gamma $1." - if {$1==1} return fi - v - repeat $! l[$>] mM={[im,iM]} n 0,1 ^ {1/$1} n $mM endl done v + + if $1==1 return fi + repeat $! l[$>] mM={[im,iM]} n 0,1 ^ {1/$1} n $mM endl done #@cli balance_gamma : _ref_color1,... #@cli : Compute gamma-corrected color balance of selected image, with respect to specified reference color. #@cli : Default value: 'ref_color1=128'. #@cli : $ image.jpg +balance_gamma 128,64,64 -balance_gamma : skip ${1=128} +balance_gamma : check "isnum(${1=128})" e[^-1] "Apply gamma-corrected color balance of image$?, with reference color ("${^0}")." - v - repeat $! l[$>] + repeat $! l[$>] (${^0}) r. {-2,s},1,1,1,0,1 s.. c /. 255 - repeat {$!-1} /[$>] 255 ^[$>] {log({@$>})/log({$>,ia})} *[$>] 255 done + repeat $!-1 /[$>] 255 ^[$>] {log({@$>})/log({$>,ia})} *[$>] 255 done rm. a c c 0,255 - endl done v + + endl done #@cli cast : datatype_source,datatype_target #@cli : Cast datatype of image buffer from specified source type to specified target type. -#@cli : 'datatype_source' and 'datatype_target' can be { uchar | char | ushort | short | uint | int | uint64 | int64 | float | double }. +#@cli : 'datatype_source' and 'datatype_target' can be \ +# { uchar | char | ushort | short | uint | int | uint64 | int64 | float | double }. cast : e[^-1] "Cast datatype of image buffer$? from '$1' to '$2'." - v - stype="$1" - if {s='$stype';s[0]==_'u'&&s[1]!=_'n'} stype="unsigned_"{`s='$stype';s[1,size(s)-1]`} - elif {s='$stype';s[0]==_'u'&&s[0,9]=='"unsigned "'} stype="unsigned_"{`s='$stype';s[9,size(s)-9]`} + if s='$stype';s[0]==_'u'" && "s[1]!=_'n' stype="unsigned_"{`s='$stype';s[1,size(s)-1]`} + elif s='$stype';s[0]==_'u'" && "s[0,9]=='"unsigned "' stype="unsigned_"{`s='$stype';s[9,size(s)-9]`} fi dtype="$2" - if {s='$dtype';s[0]==_'u'&&s[1]!=_'n'} dtype="unsigned_"{`s='$dtype';s[1,size(s)-1]`} - elif {s='$dtype';s[0]==_'u'&&s[0,9]=='"unsigned "'} dtype="unsigned_"{`s='$dtype';s[9,size(s)-9]`} + if s='$dtype';s[0]==_'u'" && "s[1]!=_'n' dtype="unsigned_"{`s='$dtype';s[1,size(s)-1]`} + elif s='$dtype';s[0]==_'u'" && "s[0,9]=='"unsigned "' dtype="unsigned_"{`s='$dtype';s[9,size(s)-9]`} fi - ssize={s='$stype';s=='"unsigned_char"'||s=='char'?1:s=='"unsigned_short"'||s=='short'?2:s=='"unsigned_int"'||s=='int'||s=='float'?4:8} - dsize={s='$dtype';s=='"unsigned_char"'||s=='char'?1:s=='"unsigned_short"'||s=='short'?2:s=='"unsigned_int"'||s=='int'||s=='float'?4:8} + ssize={s='$stype';s=='"unsigned_char"'||s=='char'?1:s=='"unsigned_short"'||s=='short'?2:s=='"unsigned_int"'||\ + s=='int'||s=='float'?4:8} + dsize={s='$dtype';s=='"unsigned_char"'||s=='char'?1:s=='"unsigned_short"'||s=='short'?2:s=='"unsigned_int"'||\ + s=='int'||s=='float'?4:8} repeat $! l[$>] w,h,d,s={[w,h,d,s]} serialize $1,0,0 s -,{'\n$w\ $h\ $d\ $s\n'} - i[1] ({'\n1\ {int($w*$h*$d*$s*$ssize/$dsize)}\ 1\ 1\n'}) y[1] + i[1] ('\n1\ {int($w*$h*$d*$s*$ssize/$dsize)}\ 1\ 1\n') y[1] replace_str[0] $stype,$dtype a y unserialize - endl done v + + endl done #@cli complex2polar #@cli : Compute complex to polar transforms of selected images. #@cli : $ image.jpg +fft complex2polar[-2,-1] log[-2] shift[-2] 50%,50%,0,0,2 remove[-1] complex2polar : e[^-1] "Compute complex to polar transforms of image$?." - v - repeat {int($!/2)} l[{2*$>},{2*$>+1}] + repeat int($!/2) l[{2*$>},{2*$>+1}] r[1] [0],3 +atan2[1] [0] nm. {1,n} sqr[-3,-2] +[-3,-2] sqrt.. - endl done v + + endl done -#@cli compress_clut : _max_nbpoints>=1,_max_error>=0,_avg_error>=0 +#@cli compress_clut : _max_error>0,_avg_error>0,_max_nbpoints>=8 | 0 (unlimited),\ +# _error_metric={ 0=L2-norm | 1=deltaE_1976 | 2=deltaE_2000 },_reconstruction_colorspace={ 0=srgb | 1=rgb | 2=lab },\ +# _try_rbf_first={ 0 | 1 } #@cli : Compress selected color LUTs as sequences of colored keypoints. -#@cli : Default values: 'max_nb_points=2048', 'max_error=17.5' and 'avg_error=1.75'. -compress_clut : check "isint(${1=2048}) && $1>=1 && ${2=17.5}>=0 && ${3=1.75}>=0" - e[^-1] "Compress color LUT$? as a set of colored keypoints, with $1 max points, maximum error $2 and average error $3." - v - - repeat $! l[$>] strvar {b} nm=${} - if {iM>255} / 257 fi # Input is probably 16bits - if {d==1} S={cbrt(wh)} r $S,$S,$S,3,-1 r3dx 32 round fi # Input is a 2D haldclut image - w={w} h={h} d={d} w_size=${fitscreen" "$w,$h,$d,256,50%} - v + e[] " > Process clut '"$nm"' ("${w}"x"${h}"x"${d}")." v - - nm clut - 100%,100%,100% nm. keypoints - +laplacian[0] norm. ^. 0.5 nm. potential - - # Insert initialization keypoints. - 0 nm. keycoords - _w1={max(1,$w-1)} _h1={max(1,$h-1)} _d1={max(1,$d-1)} - m "add_keypoint : \ - x={round($""1)} y={round($""2)} z={round($""3)} \ - X={round($x*255/$_w1)} Y={round($y*255/$_h1)} Z={round($z*255/$_h1)} \ - rgb={clut,I($x,$y,$z)} \ - =[keypoints] 1,$x,$y,$z \ - ($X,$Y,$Z,$rgb) a[keycoords,-1] y" - add_keypoint 0,0,0 add_keypoint $_w1,0,0 add_keypoint $_w1,$_h1,0 - add_keypoint 0,0,$_d1 add_keypoint $_w1,0,$_d1 add_keypoint $_w1,$_h1,$_d1 - add_keypoint {potential,xM},{potential,yM},{potential,zM} - - 0 nm. error - max_error=inf avg_error=inf - target_max_error=$2 target_avg_error=$3 - best_max_error=inf best_avg_error=inf best_nbpts=0 - - # Step 1 : Add new keypoints iteratively until quality constraints are reached. - #------------------------------------------------------------------------------- - v + e[] "" v - - iter=0 - repeat inf - if {keycoords,h>=$1} break fi - - # Find new keypoint. - if {$iter<2} # Using farthest point sampling - +distance[keypoints] 1,[potential],0 X={xM} Y={yM} Z={zM} rm. - else # Using location of maximal reconstruction error - +decompress_clut[keycoords] $w,$h,$d - if {*0} w. $w_size,0,"Reconstructed CLUT (step 1)" fi - -. [clut] abs. max_error={iM} avg_error={ia} X={xM} Y={yM} Z={zM} rm. - if {$max_error<=$target_max_error" && "$avg_error<=$target_avg_error} break fi # Found a good-enough solution - ($max_error^{10*$avg_error}) a[error,-1] x _compress_clut_draw_error - if {$max_error<$best_max_error} - best_max_error=$max_error - best_avg_error=$avg_error - best_nbpts={keycoords,h} - fi - iter=0 - fi - v + e[] "\r - Insert keypoint "{keycoords,h}": Max error = "{_$max_error}" ( avg = "{_$avg_error}" ) " v - - add_keypoint $X,$Y,$Z - iter+=1 - done +#@cli : Default values: 'max_error=1.25', 'avg_error=0.75', 'max_nb_points=2048', 'error_metric=2', \ +# 'reconstruction_colorspace=0' and 'try_rbf_first=1'. +compress_clut : check "${1=1.25}>0 && ${2=0.75}>0 && isint(${3=2048}) && (!$3 || $3>=8) && isin(${4=2},0,1,2) && "\ + "isin(${5=0},0,1,2) && isbool(${6=1})" + e[^-1] "Compress color LUT$? as a set of colored keypoints, with maximum error $1, average error $2, "\ + "$3 maximum keypoints, "${"s0,s1,s2=L2-RGB,DeltaE_1976,DeltaE_2000 u $s$4"}" metric and "\ + ${"s0,s1,s2=srgb,rgb,lab u $s$5"}" colorspace for reconstruction." + v 0 + max_error,avg_error,max_keypoints,metric,colorspace,try_rbf=${1-6} + if $try_rbf method=rbf else method=pde fi + repeat $! l[$>] nm={b} + if iM>1024 / 257 fi # When input is 16bits + if d==1 S={round(cbrt(wh))} r $S,$S,$S,100%,-1 fi # When input is a 2D haldclut image + e[] "\n* Process CLUT '"$nm"' ("{w}"x"{h}"x"{d}")." + + # Detect B&W cluts. + if "s==3 && + crop(0,0,0,0,w,h,d,1)==crop(0,0,0,1,w,h,d,1) && + crop(0,0,0,0,w,h,d,1)==crop(0,0,0,2,w,h,d,1)" + channels 0 + fi + + _metric={s==3?$metric:0} + if $_metric +srgb2lab 1 fi + + # Initialize keypoints (corners of the RGB cube). + 1,8,1,{s+3} + eval " + coords = [ 0,0,0, 255,0,0, 255,255,0, 0,255,0, 0,0,255, 255,0,255, 255,255,255, 0,255,255 ]; + for (k = 0, k$target_max_error" || "$avg_error>$target_avg_error} # Didn't fulfilled the quality constraints - rows[keycoords] 0,{$best_nbpts-1} # -> Go back to the latest 'best' configuration - max_error=$best_max_error - avg_error=$best_avg_error - fi - rows[keycoords] 0,{keycoords,min($1-1,h-1)} - - # Step 2 : Remove keypoints iteratively while preserving quality constraints. - #----------------------------------------------------------------------------- - v + e[] "" v - - nb_attempts=1 - target_max_error={max($2,round($max_error,0.1,1))} target_avg_error={max($3,round($avg_error,0.1,1))} + # Iteratively add keypoints. + sep="\n" do - nb_max_attempts={keycoords,round(h*75%)} - v + e[] "\r - Remove attempt \#"$nb_attempts/$nb_max_attempts" : Keypoints "{keycoords,h}", Max error = "{_$max_error}" ( avg = "{_$avg_error}" ) " v - - k={keycoords,round(u(h-1))} +l[keycoords] s y rm[$k] a y nm new_keycoords endl # Remove random keypoint - +decompress_clut[new_keycoords] $w,$h,$d - if {*0} w. 400,400,0,"Reconstructed CLUT (step 2)" fi - -. [clut] abs. new_max_error={iM} new_avg_error={ia} rm. - if {$new_max_error<=$target_max_error" && "$new_avg_error<=$target_avg_error} - max_error=$new_max_error - avg_error=$new_avg_error - rm[keycoords] nm[new_keycoords] keycoords - ($max_error^{10*$avg_error}) a[error,-1] x _compress_clut_draw_error - nb_attempts=0 - else rm[new_keycoords] nb_attempts+=1 - fi - while {$nb_attempts<=$nb_max_attempts} - v + e[] "" v - - - k[keycoords] nm $nm - o ${_path_rc}comp_$nm.gmz,uchar - endl done v + - - # Draw evolution of the reconstruction error. -_compress_clut_draw_error : - if {error,w>=2} - +dg[error] 640,480,1,0,0,{keycoords,h},0,{error,@0},"Number of keypoints","Maximum reconstruction error" - if {*1} w1. 100%,100%,0,"Evolution of the reconstruction error" fi - rm. fi + +decompress_clut_$method. {0,[w,h,d]},$colorspace + if !$_metric -. [0] norm. else srgb2lab. deltaE. [1],{$_metric-1}," " fi + emax,eavg={[iM,ia]} + + e[] "\r"$sep" > Add [#"{-2,h}"] Max_Err = "{_$emax}", Avg_Err = "{_$eavg}" " sep="" + if $emax<=$max_error" && "$eavg<=$avg_error rm. break fi + 1,1,1,{0,s+3},{"P = [ xM,yM,zM ]; [ P*255/[max(1,w#0-1),max(1,h#0-1),max(1,d#0-1)], I(#0,P) ]"} rm.. + a[-2,-1] y + if $max_keypoints" && "h>=320" && "'$method'=='rbf' method=pde rows. 0,7 fi # RBF failed, switch to PDE method. + while h<($max_keypoints?$max_keypoints:inf) + + # Iteratively remove keypoints. + if h>8 + if $_metric max_rounding,avg_rounding=0.1,0.025 + else max_rounding,avg_rounding=1,0.25 + fi + if $emax>$max_error" || "$eavg>$avg_error + max_error=round($max_error,$max_rounding,1) + avg_error=round($avg_error,$avg_rounding,1) + fi + index=8 sep="\n" + do + +l. s y rm[$index] a y endl # Remove kth keypoint + +decompress_clut_$method. {0,[w,h,d]},$colorspace + if $_metric==0 -. [0] norm. else srgb2lab. deltaE. [1],{$_metric-1}," " fi + emax,eavg={[iM,ia]} rm. + + if $emax<=$max_error" && "$eavg<=$avg_error rv[-2,-1] else index+=1 fi + e[] "\r"$sep" > Rem [#"{min($index,h-1)}"/"{h}"] Max_Err = "{_$emax}", Avg_Err = "{_$eavg}" " + sep="" + rm. + while $index0,_avg_error>0,_max_nb_points>=8 : "file_list.txt" +# Batch compress CLUT files. +compress_cluts : check "${2=1.25}>0 && ${3=0.75}>0 && isint(${4=2047}) && $4>8" + rm + if isfile(['{/"$1"}']) it[] "$1" s -,{'\n'} + else files "$1" ('${}') s -,{','} + fi + rv + repeat $! l[$<] + filename={t} 0 nm. $filename ext={x} rm + basename $filename + l[] ('${}') replace_str .$ext,"" basename={t} rm endl + need_compression=1 + cclut=cclut_$basename.gmz + + if isfile(['{/$cclut}']) + i $cclut + if "dat = (date(5) + 60*(date(4) + date(2)*24)); + fdat = (date(5,'"{/$cclut}"') + 60*(date(4,'"{/$cclut}"') + date(2,'"{/$cclut}"')*24)); + !h && dat-fdat<30" + e[] "* Skip file '"$filename"' (CLUT already being compressed)." + need_compression=0 + elif h>0" && "h!=2048 + e[] "* Skip file '"$filename"' (CLUT already compressed)." + need_compression=0 + fi + rm. + fi + + if $need_compression + 0 o. $cclut rm. # Lock current file + if lowercase(['$ext'])=='cube' input_cube $filename c. 0,255 + elif lowercase(['$ext'])=='png' i $filename S={round(cbrt(wh))} r $S,$S,$S,100%,-1 + else e[] "* Skip file '"$filename"' (unknown CLUT format)." continue + fi + + e[] "* Compress file '"$filename"'." + if w>48 r3dx 48 fi + to_rgb + tic compress_clut $2,$3,$4 toc + o $cclut + fi + rm + endl done + +# cluts2libclut : "compressed_CLUT_collection.gmz" +# Convert specified compressed CLUT collection for C++ 'libclut' +# (https://framagit.org/dtschump/libclut) +cluts2libclut : skip ${1=$HOME/work/src/gmic/resources/gmic_cluts.gmz} + e[] "Convert compressed CLUT collection '$1' to .png/.ppm/.txt for C++ libclut." + l[] + i $1 + 0 nm. "$1" basename={b} rm. + list= + repeat $! l[$>] if s<6 r 100%,100%,1,6,0,1 fi transpose list.={n}"\n" endl done s c,2 a y + o. $basename.png + o. $basename.ppm + ('$list') ot. $basename.txt + rm + endl #@cli compress_rle : _is_binary_data={ 0 | 1 },_maximum_sequence_length>=0 #@cli : Compress selected images as 2xN data matrices, using RLE algorithm. @@ -5979,9 +8385,9 @@ #@cli : Default values: 'is_binary_data=0' and 'maximum_sequence_length=0'. #@cli : $ image.jpg resize2dy 100 quantize 4 round +compress_rle , +decompress_rle[-1] compress_rle : skip ${1=0} check "isint(${2=0}) && $2>=0" - v - s0=" for binary data" s1="" + s0=" for binary data" s1="" if $2 s=", with maximal sequence length "$2 else s="" fi - v + e[^-1] "Compress image$? using RLE algorithm"${s{!$1}}$s"." v - + e[^-1] "Compress image$? using RLE algorithm"${s{!$1}}$s"." repeat $! l[$>] nm={0,n} im={im} header={w};{h};{d};{s};$im;{$1!=0} - $im y x ({{0,@-1}+1}) a x r 100%,3 f '>if(y==0,i,if(y==1,if(i(x,0)==i(x+1,0),-1,x),if(i(x-1,1)==-1,i(x-1,2)+1,1)))' @@ -5997,7 +8403,7 @@ *. -1 rv a x y discard -1 f '>if(i(0,y-1)<0&&i==0&&i(0,y+1)<0,-1,i)' discard -1 fi i[0] ($header) a y nm $nm - endl done v + + endl done #@cli cumulate : { x | y | z | c }...{ x | y | z | c } : (no arg) : (+) #@cli : Compute the cumulative function of specified image data, optionally along the specified axes. @@ -6005,34 +8411,89 @@ #@cli c : eq. to 'cut'. : (+) -#@cli cut : { value0[%] | [image0] },{ value1[%] | [image1] } : [image] : (no arg) : (+) +#@cli cut : { value0[%] | [image0] },{ value1[%] | [image1] } : [image] : (+) #@cli : Cut values of selected images in specified range. #@cli : (eq. to 'c').\n -#@cli : (no arg) runs interactive mode (uses the instant display window [0] if opened). -#@cli : In interactive mode, the chosen cut values are returned in the status. #@cli : $ image.jpg +add 30% cut[-1] 0,255 #@cli : $ image.jpg +cut 25%,75% -#@cli decompress_clut : _width>0,_height>0,_depth>0 -#@cli : Decompress color LUT expressed as a list of colored keypoints. -#@cli : Default value: 'width=height=depth=64'. -decompress_clut : check "isint(${1=64}) && $1>0 && isint(${2=$1}) && $2>0 && isint(${3=$1}) && $3>0" - e[^-1] "Decompress color LUT$? into a $1x$2x$3 volumetric image." - v - transpose repeat $! l[$>] - s y *[0] {($1-1)/255} *[1] {($2-1)/255} *[2] {($3-1)/255} round[0-2] a y - 100%,1,1,1,255 a y pointcloud 0,$1,$2,$3 solidify 100%,1,15 c 0,255 - endl done v + +#@cli decompress_clut : _width>0,_height>0,_depth>0,_reconstruction_colorspace={ 0=srgb | 1=rgb | 2=lab } +#@cli : Decompress selected colored keypoints into 3D CLUTs, using a mixed RBF/PDE approach. +#@cli : Default values: 'width=height=depth=48' and 'reconstruction_colorspace=0'. +decompress_clut : check "isint(${1=48}) && $1>0 && isint(${2=$1}) && $2>0 && isint(${3=$1}) && $3>0 && "\ + "isin(${4=0},0,1,2)" + e[^-1] "Decompress colored keypoint$? into $1x$2x$3 CLUTs, using "\ + ${"s0,s1=srgb,rgb u $s$4"}" colorspace for reconstruction." + repeat $! l[$>] + if "h>=320 || (P0 = I[0]; P1 = I[h-1]; val(P) = (P[0]*65536 + P[1]*256 + P[2]); val(P0)>val(P1))" + decompress_clut_pde. ${1-4} + else + decompress_clut_rbf. ${1-4} + fi + endl done + +#@cli decompress_clut_rbf : _width>0,_height>0,_depth>0,_reconstruction_colorspace={ 0=srgb | 1=rgb | 2=lab } +#@cli : Decompress selected colored keypoints into 3D CLUTs, using RBF thin plate spline interpolation. +#@cli : Default value: 'width=height=depth=48' and 'reconstruction_colorspace=0'. +decompress_clut_rbf : check "isint(${1=48}) && $1>0 && isint(${2=$1}) && $2>0 && isint(${3=$1}) && $3>0 && "\ + "isin(${4=0},0,1,2)" + e[^-1] "Decompress colored keypoint$? into $1x$2x$3 CLUTs (RBF approach), using "\ + ${"s0,s1,s2=srgb,rgb,lab u $s$4"}" colorspace for reconstruction." + repeat $! l[$>] + if $4 s c,-3 srgb2${"arg $4,rgb,lab"}. a c fi + rbf $1,$2,$3,0,0,0,255,255,255 + if $4 ${"arg $4,rgb,lab"}2srgb fi + endl done + +#@cli decompress_clut_pde : _width>0,_height>0,_depth>0,_reconstruction_colorspace={ 0=srgb | 1=rgb | 2=lab } +#@cli : Decompress selected colored keypoints into 3D CLUTs, using multiscale diffusion PDE's. +#@cli : Default values: 'width=height=depth=48' and 'reconstruction_colorspace=0'. +decompress_clut_pde : check "isint(${1=48}) && $1>0 && isint(${2=$1}) && $2>0 && isint(${3=$1}) && $3>0 && "\ + "isin(${4=0},0,1,2)" + e[^-1] "Decompress colored keypoint$? into $1x$2x$3 CLUTs (PDE approach), using "\ + ${"s0,s1,s2=srgb,rgb,lab u $s$4"}" colorspace for reconstruction." + repeat $! l[$>] nm={n} + if $4 s c,-3 srgb2${"arg $4,rgb,lab"}. a c fi + 2,2,2,{s-3} + do + +f. 0 .,.,.,1 + eval[0] "begin(fact = ([w#1,h#1,d#1] - 1)/255); PC = I; P = PC[0,3]; X = round(P*fact); + I(#2,X)+=PC[3,s-3]; ++i(#3,X); I" + f. "*i?(I(#2)/=i;1):0" + if im rm[-3,-1] # No missing data so far + else # Reconstruct missing data by anisotropic diffusion scheme + +distance. 1 .,.,.,3 + eval.. "* # Specific gradient discretization for distance function + const boundary = 1; + maxabs(a,b) = (abs(a)>abs(b)?a:b); + I(#-1) = [ maxabs(j(1) - i,i - j(-1)), + maxabs(j(0,1) - i,i - j(0,-1)), + maxabs(j(0,0,1) - i,i - j(0,0,-1)) ]" + orientation. rm.. + repeat 20 + j[-4] ...,0,0,0,0,1,.. + +warp[-4] .,1,2,1 *.. -1 warp[-5] ..,1,2,1 +[-5,-1] /[-4] 2 + done + j[-4] ...,0,0,0,0,1,.. k[0,1] + fi + if "w<$1 || h<$2 || d<$3" r. {[min($1,2*w),min($2,2*h),min($3,2*d)]},100%,3 else break fi + while 1 + k. + if $4 ${"arg $4,rgb,lab"}2srgb fi + nm $nm + endl done + um srgb2srgb #@cli decompress_rle #@cli : Decompress selected data vectors, using RLE algorithm. decompress_rle : e[^-1] "Decompress data vector$?, using RLE algorithm." - v - repeat $! l[$>] + repeat $! l[$>] # Retrieve original data dimension and min value. y whds={0,@0-3} im={0,@4} is_binary_data={0,@5} rows 6,100% - # Transform RLE data to list of pairs {nb_occurences,value}. + # Transform RLE data to list of pairs {nb_occurrences,value}. if $is_binary_data # Decode for binary data. +>= 0 abs[0] a x else # Decode for arbitrary data @@ -6047,7 +8508,7 @@ # Decompress, using 3D objects. s y,-256 repeat $! l[$>] - i[0] ({'CImg3d'}) +[0] 0.5 + i[0] ('CImg3d') +[0] 0.5 i[1] ({2*h};{h}) s. x,2 cumulate.. siz={-2,@-1} +shift.. 0,1 -... 1 rv[-3,-1] z[-3,-1] 0,2 a[-3,-1] x @@ -6056,12 +8517,12 @@ $siz j3d. ..,0,0,0,1,2,0,0 rm.. endl done a x r $whds,-1 + $im - endl done v + + endl done #@cli discard : _value1,_value2,... : { x | y | z | c}...{ x | y | z | c},_value1,_value2,... : (no arg) : (+) #@cli : Discard specified values in selected images or discard neighboring duplicate values, #@cli : optionally only for the values along the first of a specified axis. -#@cli : If no values are specified, neighboring duplicate values are discarded. +#@cli : If no arguments are specified, neighboring duplicate values are discarded. #@cli : If all pixels of a selected image are discarded, an empty image is returned. #@cli : $ (1;2;3;4;3;2;1) +discard 2 #@cli : $ (1,2,2,3,3,3,4,4,4,4) +discard x @@ -6071,8 +8532,8 @@ #@cli : $$ eigen2tensor : e[^-1] "Recompose pairs in eigen field$? as 2x2 or 3x3 tensor fields." - v - repeat {$!/2} l[$>,{$>+1}] nm={0,n} - if {s==2} # 2D tensors. + repeat $!/2 l[$>,{$>+1}] nm={0,n} + if s==2 # 2D tensors. s. c +sqr. *.. ... sqr... # u^2 uv v^2 sh. +*... -1 @@ -6081,16 +8542,17 @@ sh... 0 *[-3,-1] # l1*(u^2;uv;v^2) sh... 1 *[-2,-1] # l2*(v^2;-uv;u^2) rm... +[-2,-1] - elif {s==6} # 3D tensors. + elif s==6 # 3D tensors. s. c l[-6--4] +sqr.. +*[-2,-3] +sqr... *[-5] [-6] *[-4] [-6] sqr[-6] a c endl l[-3--1] +sqr.. +*[-2,-3] +sqr... *[-5] [-6] *[-4] [-6] sqr[-6] a c endl s... c -[-5] ... -[-4] ... *.. [-5] *. [-4] (1^0^0^1^0^1) r. ... *. [-4] rm[-6--4] +[-3--1] - else v + error[0--3] "Command '$0': Invalid image ["{$!-$>-1}"] : Dimensions "{w}","{h}","{d}","{s}" does not represent a field of 2D or 3D eigenvectors." + else error[0--3] "Command '$0': Invalid image ["{$!-$>-1}"] : Dimensions "{w}","{h}","{d}","{s}" does + not represent a field of 2D or 3D eigenvectors." fi - nm $nm endl done v + + nm $nm endl done #@cli endian : _datatype : (+) #@cli : Reverse data endianness of selected images, eventually considering the pixel being of the specified datatype. @@ -6112,86 +8574,88 @@ #@cli : (eq. to 'f'). #@cli : $ 4,4 fill 1,2,3,4,5,6,7 #@cli : $ 4,4 (1,2,3,4,5,6,7) fill[-2] [-1] -#@cli : $ 400,400,1,3 fill "X=x-w/2; Y=y-h/2; R=sqrt(X^2+Y^2); a=atan2(Y,X); if(R<=180,255*abs(cos(c+200*(x/w-0.5)*(y/h-0.5))),850*(a%(0.1*(c+1))))" +#@cli : $ 400,400,1,3 fill "X=x-w/2; Y=y-h/2; R=sqrt(X^2+Y^2); a=atan2(Y,X); \ +# if(R<=180,255*abs(cos(c+200*(x/w-0.5)*(y/h-0.5))),850*(a%(0.1*(c+1))))" #@cli : $$ -#@cli index : { [palette] | predefined_palette },0<=_dithering<=1,_map_palette={ 0 | 1 } : (+) +#@cli index : { [palette] | palette_name },0<=_dithering<=1,_map_palette={ 0 | 1 } : (+) #@cli : Index selected vector-valued images by specified vector-valued palette. -#@cli : 'predefined_palette' can be { 0=default | 1=HSV | 2=lines | 3=hot | 4=cool | 5=jet | 6=flag | 7=cube }. +#@cli : 'palette_name' can be { default | hsv | lines | hot | cool | jet | flag | cube | rainbow | algae | amp |\ +# balance | curl | deep | delta | dense | diff | haline | ice | matter | oxy | phase | rain | solar | speed | tarn |\ +# tempo | thermal | topo | turbid | aurora | hocuspocus | srb2 | uzebox } #@cli : Default values: 'dithering=0' and 'map_palette=0'. #@cli : $ image.jpg +index 1,1,1 #@cli : $ image.jpg (0;255;255^0;128;255^0;0;255) +index[-2] [-1],1,1 #@cli : $$ +index : check "${2=0}>=0 && $2<=1 && isbool(${3=0})" + names=${-_palette_names} N={narg($names)} + l[] if isint("$1") name=${"arg 1+($1%"$N"),"$names} else name="$1" fi onfail name="$1" endl + e[^-1] "Index values in image$? by color LUT '"$name"', with dithering level $2." + palette $1 index[^-1] .,$2,$3 rm. #@cli ir : eq. to 'inrange'. -ir : - v - _gmic_s="$?" v + - _inrange $* +ir : check "isbool(${3=1})" + _gmic_s="$?" v + _inrange $* -#@cli inrange : min[%],max[%] +#@cli inrange : min[%],max[%],_include_boundaries={ 0=no | 1=yes } #@cli : Detect pixels whose values are in specified range [min,max], in selected images. #@cli : (eq. to 'ir'). +#@cli : Default value: 'include_boundaries=1'. #@cli : $ image.jpg +inrange 25%,75% -inrange : - v - _gmic_s="$?" v + - _$0 $* +inrange : check "isbool(${3=1})" + _gmic_s="$?" v + _$0 $* -_inrange : - e[0--3] "Detect pixel values in range [$1,$2] in image"$_gmic_s"." - v - repeat $! l[$>] +_inrange : skip "${3=1}" + s0="out" s1="" + e[0--3] "Detect pixel values in range [$1,$2] in image"$_gmic_s", with"${s$3}" boundaries included." + repeat $! l[$>] m=$1 M=$2 if ${is_percent\ $1} m={im+(iM-im)*$1} fi if ${is_percent\ $2} M={im+(iM-im)*$2} fi - - {0.5*($m+$M)} abs <= {0.5*abs($M-$m)} - endl done v + + f. inrange(i,$m,$M,$3) + endl done -#@cli map : [palette],_boundary_conditions : predefined_palette,_boundary_conditions : (+) +#@cli map : [palette],_boundary_conditions : palette_name,_boundary_conditions : (+) #@cli : Map specified vector-valued palette to selected indexed scalar images. -#@cli : 'predefined_palette' can be { 0=default | 1=HSV | 2=lines | 3=hot | 4=cool | 5=jet | 6=flag | 7=cube }. +#@cli : 'palette_name' can be { default | hsv | lines | hot | cool | jet | flag | cube | rainbow | algae | amp | \ +# balance | curl | deep | delta | dense | diff | gray | haline | ice | matter | oxy | phase | rain | solar | speed | \ +# tarn | tempo | thermal | topo | turbid | aurora | hocuspocus | srb2 | uzebox } #@cli : 'boundary_conditions' can be { 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }. #@cli : Default value: 'boundary_conditions=0'. #@cli : $ image.jpg +luminance map[-1] 3 -#@cli : $ image.jpg +rgb2ycbcr split[-1] c (0,255,0) resize[-1] 256,1,1,1,3 map[-4] [-1] remove[-1] append[-3--1] c ycbcr2rgb[-1] +#@cli : $ image.jpg +rgb2ycbcr split[-1] c (0,255,0) resize[-1] 256,1,1,1,3 map[-4] [-1] remove[-1] append[-3--1] c \ +# ycbcr2rgb[-1] #@cli : $$ +map : check "isint(${2=0}) && $2>=0 && $2<=3" + s0,s1,s2,s3=dirichlet,neumann,periodic,mirror boundary=${s$2} + names=${-_palette_names} N={narg($names)} + l[] if isint("$1") name=${"arg 1+($1%"$N"),"$names} else name="$1" fi onfail name="$1" endl + e[^-1] "Map color LUT '"$name"' on image$?, with "$boundary" boundary conditions." + palette $1 map[^-1] .,$2 rm. -#@cli map_clut : [clut] | "clut_name" -#@cli : Map specified RGB color LUT to selected images. -#@cli : $ image.jpg uniform_distribution {2^6},3 mirror[-1] x +map_clut[0] [1] -map_clut : - e[^-1] "Map color LUT $1 on image$?." - if {!$!} return fi - v - to_color - if ${"is_image_arg $1"} pass$1 0 to_rgb. else clut "$1" fi - l={round((w*h*d)^(1/3))} - if {w*h*d!=$l^3} v + error "Command '$0': Specified CLUT $1 has invalid dimensions "({w},{h},{d},{s}). fi - r. $l,$l,$l,3,-1 - repeat {$!-1} l[$>,-1] nm={0,n} split_opacity[0] /[0] {256/$l} - +warp. [0],0,1,1 - rm[0] mv. 0 a[^-1] c nm[0] $nm - endl done rm. v + - -#@cli mix_channels : (a00,...,aMN) +#@cli mix_channels : (a00,...,aMN) : [matrix] #@cli : Apply specified matrix to channels of selected images. #@cli : $ image.jpg +mix_channels (0,1,0;1,0,0;0,0,1) mix_channels : e[^-1] "Apply matrix $1 to channels of image$?." - v - repeat $! l[$>] nm={0,n} - whd={w},{h},{d} r {w*h*d},{s},1,1,-1 i[0] ${^0} m* r $whd,{h},-1 - nm $nm endl done v + + if ${"is_image_arg $1"} pass$1 1 else i ${^0} fi + repeat $!-1 l[$>] nm={n} + whd={[w,h,d]} r. {[whd,s]},1,1,-1 + pass. 0 mv. 0 m* r $whd,{h},-1 + nm $nm endl done rm. #@cli negate : base_value : (no arg) #@cli : Negate image values. #@cli : Default value: 'base_value=(undefined)'. #@cli : $ image.jpg +negate negate : skip "${1=,}" - if {isval("$*")} + if isnum("$*") e[0--3] "Negate values of image$?, according to base value $*." - v - - {"$*"} * -1 v + + - {"$*"} * -1 else e[0--3] "Negate values of image$?." - v - repeat $! -[$>] {$>,iM} done * -1 - if {;['"$1"']!=','} noarg fi - v + + repeat $! -[$>] {$>,iM} done * -1 + if ['"$1"']!=',' noarg fi fi #@cli noise : std_deviation>=0[%],_noise_type : (+) @@ -6201,15 +8665,92 @@ #@cli : $ image.jpg +noise[0] 50,0 +noise[0] 50,1 +noise[0] 10,2 cut 0,255 #@cli : $ 300,300,1,3 [0] noise[0] 20,0 noise[1] 20,1 +histogram 100 display_graph[-2,-1] 400,300,3 +#@cli noise_perlin : _scale_x[%]>0,_scale_y[%]>0,_scale_z[%]>0,_seed_x,_seed_y,_seed_z +#@cli : Render 2D or 3D Perlin noise on selected images, from specified coordinates. +#@cli : The Perlin noise is a specific type of smooth noise, +#@cli : described here : 'https://en.wikipedia.org/wiki/Perlin_noise'. +#@cli : Default values: 'scale_x=scale_y=scale_z=16' and 'seed_x=seed_y=seed_z=0'. +#@cli : $ 500,500,1,3 noise_perlin , +noise_perlin : check "${1=16}>0 && ${2=$1}>0 && ${3=$1}>0 && isnum(${4=0}) && isnum(${5=0}) && isnum(${6=0})" + e[^-1] "Render Perlin noise on image$?, with scales (${1-3}) and seeds (${4-6})." + + init="permutation = [ 151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240, + 21,10,23,190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,88, + 237,149,56,87,174,20,125,136,171,168,68,175,74,165,71,134,139,48,27,166,77,146,158,231, + 83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,102,143,54,65,25,63,161,1, + 216,80,73,209,76,132,187,208,89,18,169,200,196,135,130,116,188,159,86,164,100,109,198, + 173,186,3,64,52,217,226,250,124,123,5,202,38,147,118,126,255,82,85,212,207,206,59,227,47, + 16,58,17,182,189,28,42,223,183,170,213,119,248,152,2,44,154,163,70,221,153,101,155,167, + 43,172,9,129,22,39,253,19,98,108,110,79,113,224,232,178,185,112,104,218,246,97,228,251, + 34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249,14,239,107,49,192,214,31, + 181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254,138,236,205,93,222,114,67,29, + 24,72,243,141,128,195,78,66,215,61,156,180 ]; + p = [ permutation,permutation ]; + fade(t) = (t*t*t*(t*(t*6 - 15) + 10)); + _lerp(t,a,b) = lerp(a,b,t); + pcmod255 = vectors(); for (k = 0, k,d>1} # 3D version + f[$>] "*begin("$init" + grad(hash,x,y,z) = ( gh = hash&15; gu = gh<8?x:y; gv = gh<4?y:gh==12 || gh==14?x:z; + (!(gh&1)?gu:-gu) + (!(gh&2)?gv:-gv)) + ); + x = x0 + x*fw + pcmod255[c]; y = y0 + y*fh + pcmod255[c]; z = z0 + z*fd + pcmod255[c]; + ix = floor(x); iy = floor(y); iz = floor(z); + X = ix&255; Y = iy&255; Z = iz&255; + fx = x - ix; fy = y - iy; fz = z - iz; + u = fade(fx); v = fade(fy); w = fade(fz); + A = p[X] + Y; AA = p[A] + Z; AB = p[A + 1] + Z; + B = p[X + 1] + Y; BA = p[B] + Z; BB = p[B + 1] + Z; + fx1 = fx - 1; fy1 = fy - 1; fz1 = fz - 1; + lerp(lerp(lerp(grad(p[AA],fx,fy,fz), + grad(p[BA],fx1,fy,fz),u), + lerp(grad(p[AB],fx,fy1,fz), + grad(p[BB],fx1,fy1,fz),u),v), + lerp(lerp(grad(p[AA + 1],fx,fy,fz1), + grad(p[BA + 1],fx1,fy,fz1,u), + lerp(grad(p[AB + 1],fx,fy1,fz1), + grad(p[BB+1],fx1,fy1,fz1),u),v),w)" + else # 2D version + f[$>] "*begin("$init" + grad(hash,x,y) = ( gh = hash&15; gu = gh<8?x:y; gv = gh<4?y:gh==12 || gh==14?x:0; + (!(gh&1)?gu:-gu) + (!(gh&2)?gv:-gv)) + ); + x = x0 + x*fw + pcmod255[c]; y = y0 + y*fh + pcmod255[c]; + ix = floor(x); iy = floor(y); + X = ix&255; Y = iy&255; + fx = x - ix; fy = y - iy; + u = fade(fx); v = fade(fy); + A = p[X] + Y; B = p[X + 1] + Y; + fx1 = fx - 1; fy1 = fy - 1; + lerp(lerp(grad(p[A],fx,fy), + grad(p[B],fx1,fy),u), + lerp(grad(p[A + 1],fx,fy1), + grad(p[B + 1],fx1,fy1),u),v)" + fi done + #@cli noise_poissondisk : _radius[%]>0,_max_sample_attempts>0 #@cli : Add poisson disk sampling noise to selected images. -#@cli : Implements the algorithm from the article "Fast Poisson Disk Sampling in Arbitrary Dimensions", by Robert Bridson (SIGGRAPH'2007). +#@cli : Implements the algorithm from the article "Fast Poisson Disk Sampling in Arbitrary Dimensions", +#@cli : by Robert Bridson (SIGGRAPH'2007). #@cli : Default values: 'radius=8' and 'max_sample_attempts=30'. #@cli : $ 300,300 noise_poissondisk 8 ##### : Original G'MIC code by Garagecoder (Andy Kelday) noise_poissondisk : check "${1=8}>0 && ${2=30}>0" e[^-1] "Add poisson disk sampling points to image$?, with radius $1 and max sample attempts $2." - v - repeat $! l[$>] + repeat $! l[$>] R={${"is_percent $1"}?max(w,h,d)*$1:$1} # [0] input image to draw samples on dim={d>1?3:h>1?2:1} cw={0.999*$R/sqrt($dim)} # dimensions, grid cell width ({[w,h,d,1]}) y. c # [1] image dimensions vector @@ -6272,22 +8813,20 @@ if (attempts == max_sample_attempts, dar_remove(#4,R)); ); " k[0] - endl done v + + endl done #@cli normp : p>=0 #@cli : Compute the pointwise Lp-norm norm of vector-valued pixels in selected images. #@cli : Default value: 'p=2'. #@cli : $ image.jpg +normp[0] 0 +normp[0] 1 +normp[0] 2 +normp[0] inf -normp : check "isval(${1==2}) && $1>=0" +normp : check "isnum(${1==2}) && $1>=0" e[^-1] "Compute pointwise L"$1"-norm of vectors, in image$?." - v - - if {$1==0} != 0 compose_channels + - elif {$1==1} abs compose_channels + - elif {$1==2} norm - elif {$1==inf} abs compose_channels max + if $1==0 != 0 compose_channels + + elif $1==1 abs compose_channels + + elif $1==2 norm + elif $1==inf abs compose_channels max else ^ $1 compose_channels + ^ {1/$1} fi - v + #@cli norm #@cli : Compute the pointwise euclidean norm of vector-valued pixels in selected images. @@ -6295,11 +8834,11 @@ #@cli : $$ norm : e[^-1] "Compute pointwise euclidean norm of vectors, in image$?." - v - sqr compose_channels + sqrt v + + sqr compose_channels + sqrt #@cli n : eq. to 'normalize'. : (+) -#@cli normalize : { value0[%] | [image0] },{ value1[%] | [image1] } : [image] : (+) +#@cli normalize : { value0[%] | [image0] },{ value1[%] | [image1] },_constant_case_ratio : [image] : (+) #@cli : Linearly normalize values of selected images in specified range. #@cli : (eq. to 'n'). #@cli : $ image.jpg split x,2 normalize[-1] 64,196 append x @@ -6310,14 +8849,14 @@ #@cli : $ image.jpg +histogram normalize_sum[-1] display_graph[-1] 400,300 normalize_sum : e[^-1] "Normalize image$? with a unitary sum." - v - repeat $! /[$>] {sum={$>,is};if(sum!=0,sum,1)} done v + + repeat $! /[$>] {sum={$>,is};if(sum!=0,sum,1)} done #@cli not #@cli : Apply boolean not operation on selected images. #@cli : $ image.jpg +ge 50% +not[-1] not : e[^-1] "Apply boolean not operation on image$?." - v - == 0 v + + == 0 #@cli orientation #@cli : Compute the pointwise orientation of vector-valued pixels in selected images. @@ -6325,14 +8864,14 @@ #@cli : $$ orientation : e[^-1] "Compute pointwise orientation vectors, in image$?." - v - repeat $! +norm[$>] replace. 0,1 /[$>,-1] done v + + repeat $! +norm[$>] replace. 0,1 /[$>,-1] done #@cli oneminus #@cli : For each selected image, compute one minus image. #@cli : $ image.jpg normalize 0,1 +oneminus oneminus : e[^-1] "Compute one minus selected images$?." - v + * -1 + 1 v - + * -1 + 1 #@cli otsu : _nb_levels>0 #@cli : Hard-threshold selected images using Otsu's method. @@ -6341,7 +8880,7 @@ #@cli : $ image.jpg luminance +otsu , otsu : check "isint(${1=256}) && $1>0" e[^-1] "Hard-threshold image$? using Otsu\47s method, with $1 histogram levels." - v - repeat $! l[$>] + repeat $! l[$>] imM={[im,iM]} +histogram $1,$imM otsu={" sum = sumB = wB = best_variance = best_t = 0; @@ -6361,33 +8900,33 @@ imM[0] + best_t*(imM[1] - imM[0])/(w - 1)"} rm. >=. $otsu if $> u ${},$otsu else u $otsu fi - endl done v + + endl done #@cli polar2complex #@cli : Compute polar to complex transforms of selected images. polar2complex : e[^-1] "Compute polar to complex transforms of image$?." - v - repeat {int($!/2)} l[{2*$>},{2*$>+1}] + repeat int($!/2) l[{2*$>},{2*$>+1}] r[1] [0],3 +sin. cos.. *. ... *[-3,-2] - endl done v + + endl done -#@cli quantize : nb_levels>=1,_keep_values={ 0 | 1 },_is_uniform={ 0 | 1 } +#@cli quantize : nb_levels>=1,_keep_values={ 0 | 1 },_quantization_type={ -1=median-cut | 0=k-means | 1=uniform } #@cli : Quantize selected images. -#@cli : Default value: 'keep_values=1' and 'is_uniform=0'. +#@cli : Default value: 'keep_values=1' and 'quantization_type=0'. #@cli : $ image.jpg luminance +quantize 3 #@cli : $ 200,200,1,1,'cos(x/10)*sin(y/10)' +quantize[0] 6 +quantize[0] 4 +quantize[0] 3 +quantize[0] 2 -quantize : check "isint($1) && $1>=1" skip ${2=1},${3=0} +quantize : check "isint($1) && $1>=1 && isbool(${2=1}) && isint(${3=0}) && $3>=-1 && $3<=1" e[^-1] "Quantize image$? using $1 levels, "${arg\ 1+!$2,with,without}" keeping value range." - v - repeat $! l[$>] - if $3 # Uniform quantization. - if {s==1} # Greyscale image. + repeat $! l[$>] + if $3==1 # Uniform quantization. + if s==1 # Greyscale image. if $2 mM={[im,iM]} n 0,$1 round 1,-1 min {$1-1} n $mM else n 0,$1 round 1,-1 min {$1-1} fi else mM={[im,iM]} uniform_distribution $1,{s} n. $mM index.. .,0,$2 rm. fi - else +colormap $1,1,1 index.. .,0,$2 rm. # Non-uniform quantization. + else +colormap $1,{!$3},1 index.. .,0,$2 rm. # Non-uniform quantization. fi - endl done v + + endl done #@cli quantize_area : _min_area>0 #@cli : Quantize selected images such that each flat region has an area greater or equal to 'min_area'. @@ -6395,10 +8934,9 @@ #@cli : $ image.jpg quantize 3 +blur 1 round[-1] +quantize_area[-1] 2 quantize_area : check "${1=10}>0" e[^-1] "Quantize image$? by regions of areas greater than $1." - v - - if {$1==1} v + return fi + if $1==1 return fi repeat $! l[$>] - if {s>1} +f. "begin(A = resize([ 0,(s-1)/s ],s,3));I+A" norm. round. 0.01 else [0] fi + if s>1 +f. "begin(A = resize([ 0,(s-1)/s ],s,3));I+A" norm. round. 0.01 else [0] fi area. 0,0 <. $1 do [0] @@ -6435,9 +8973,9 @@ ); ):i" rv[0,-1] rm. - while {iM} + while iM rm. - endl done v + + endl done #@cli rand : { value0[%] | [image0] },_{ value1[%] | [image1] } : [image] : (+) #@cli : Fill selected images with random values uniformly distributed in the specified range. @@ -6448,31 +8986,31 @@ #@cli : $ (1;2;3;4) +replace 2,3 replace : e[^-1] "Replace pixel values $1 with $2 in image$?." - v - f "i==$1?$2:i" v + + f "i==$1?$2:i" #@cli replace_inf : _expression #@cli : Replace all infinite values in selected images by specified expression. #@cli : $ (0;1;2) log +replace_inf 2 replace_inf : e[^-1] "Replace all infinite values in image$? by expression '$1'." - v - f "isinf(i)?$1:i" v + + f "isinf(i)?$1:i" #@cli replace_nan : _expression #@cli : Replace all NaN values in selected images by specified expression. #@cli : $ (-1;0;2) sqrt +replace_nan 2 replace_nan : e[^-1] "Replace all NaN values in images$? by expression '$1'." - v - f "isnan(i)?$1:i" v + + f "isnan(i)?$1:i" #@cli replace_seq : "search_seq","replace_seq" #@cli : Search and replace a sequence of values in selected images. #@cli : $ (1;2;3;4;5) +replace_seq "2,3,4","7,8" replace_seq : skip "${2=}" e[^-1] "Replace value sequence '$1' by value sequence '${2--1}' in image$?." - v - ns,nd={[narg($1),narg(${2--1})]} + ns,nd={[narg($1),narg(${2--1})]} repeat $! l[$>] - s +,$1 ind={"w#0 && crop(#0,0,0,0,0,1,min("$ns",h#0),1,1)!=[$1]"} - if {$ind<$!} + s +,$1 y ind={"w#0 && crop(#0,0,0,0,0,1,min("$ns",h#0),1,1)!=[$1]"} + if $ind<$! if $nd eval "for (t = "$ind", t=0,_rounding_type : (no arg) : (+) #@cli : Round values of selected images. @@ -6505,10 +9041,10 @@ #@cli : $ 1000 fill '4*x/w' repeat 5 +roundify[0] {$>*0.2} done append c display_graph 400,300 roundify : check $1>=0 e[^-1] "Roundify image$?, with gamma $1." - if {$1==1} return fi - v - repeat $! l[$>] + if $1==1 return fi + repeat $! l[$>] +round 1 -.. . +*.. 2 abs. ^. $1 sign... *[-3,-1] *.. 0.5 + - endl done v + + endl done #@cli = : eq. to 'set'. : (+) @@ -6520,70 +9056,37 @@ #@cli : $ 2,2 set 1,0,0 set 2,1,0 set 3,0,1 set 4,1,1 #@cli : $ image.jpg repeat 10000 set 255,{u(100)}%,{u(100)}%,0,{u(100)}% done -#@cli set_vector_covariance : coef1,coef2,...,coefN -#@cli : Apply linear transformation on selected images so that the covariance matrix of their vector-valued pixels -#@cli : is prescribed to given matrix. Matrix size 'N' must be equal to 'spectrum^2'. -set_vector_covariance : - e[^-1] "Set covariance matrix of image$? to [ $* ]." - v - repeat $! l[$>] - if {narg($*)!=s^2} error[0--4] "Command '$0': Invalid arguments '$*' for image '"{n}"' with size ("{[w,h,d,s]}") ("{s^2}" argument"${"if {s==1} u \"\" else u s fi"}" expected)." fi - - # Compute current covariance matrix. - C=${"vector_covariance _avg"} - - # Transform data to fit new covariance matrix. - f "begin( - avg = [ "$_avg" ]; - C1 = [ "$C" ]; - C2 = [ $* ]; - eig1 = eig(C1); - eig2 = eig(C2); - for (k = 0, k] nm={0,n} - y x ({{0,@-1}+1}) a x r 100%,2 - f. '>if(y==0,i,if(i(x,0)==i(x+1,0),-1,x))' - z 0,{w-2} s y,2 discard[1] -1 map[1] [0] - rm[0] nm $nm - endl done v + +threshold : check "isexpr($1) && isbool(${2=0})" + e[^-1] ${"arg 1+!$2,Soft,Hard"}"-threshold image$? by $1." + if $2 # Soft thresholding + f "begin( + str = ['$1']; + value = str[size(str)-1]==_'%'?im + (iM-im)*$1:$1 + ); + i>=value?i - value: + i<=-value?i + value:0" + else ge $1 + fi #@cli vector2tensor #@cli : Convert selected vector fields to corresponding tensor fields. vector2tensor : e[^-1] "Convert vector field$? to tensor field$?." - v - repeat $! l[$>] + repeat $! l[$>] s c - if {$!==2} +sqr. *.. ... sqr... - elif {$!==3} +sqr.. +*... .. +sqr... *[-5,-4] [-6] sqr[-6] - else v + error[0--4] "Command '$0': Invalid image ["{$!-$>-1}"] : Dimensions "{w}","{h}","{d}","{s}" does not represent a field of 2D or 3D vectors." + if $!==2 +sqr. *.. ... sqr... + elif $!==3 +sqr.. +*... .. +sqr... *[-5,-4] [-6] sqr[-6] + else error[0--4] "Command '$0': Invalid image ["{$!-$>-1}"] : Dimensions "{w}","{h}","{d}","{s}" does not + represent a field of 2D or 3D vectors." fi a c - endl done v + + endl done #--------------------------------- # @@ -6591,20 +9094,23 @@ # #--------------------------------- -#@cli adjust_colors : -100<=_brightness<=100,-100<=_contrast<=100,-100<=_gamma<=100,-100<=_hue_shift<=100,-100<=_saturation<=100,_value_min,_value_max +#@cli adjust_colors : -100<=_brightness<=100,-100<=_contrast<=100,-100<=_gamma<=100,-100<=_hue_shift<=100,\ +# -100<=_saturation<=100,_value_min,_value_max #@cli : Perform a global adjustment of colors on selected images. #@cli : Range of correct image values are considered to be in [value_min,value_max] (e.g. [0,255]). #@cli : If 'value_min==value_max==0', value range is estimated from min/max values of selected images. #@cli : Processed images have pixel values constrained in [value_min,value_max]. #@cli : Default values: 'brightness=0', 'contrast=0', 'gamma=0', 'hue_shift=0', 'saturation=0', 'value_min=value_max=0'. #@cli : $ image.jpg +adjust_colors 0,30,0,0,30 -adjust_colors : check "${1=0}>=-100 && $1<=100 && ${2=0}>=-100 && $2<=100 && ${3=0}>=-100 && $3<=100 && ${4=0}>=-100 && $4<=100 && ${5=0}>=-100 && $5<=100" skip ${6=0},${7=0} - e[^-1] "Adjust colors of image$?, with brightness $1, contrast $2, gamma $3, hue shift $4, saturation $5 and value range [$6,$7]." - v - repeat $! l[$>] split_opacity +adjust_colors : check "${1=0}>=-100 && $1<=100 && ${2=0}>=-100 && $2<=100 && ${3=0}>=-100 && $3<=100 && + ${4=0}>=-100 && $4<=100 && ${5=0}>=-100 && $5<=100" skip ${6=0},${7=0} + e[^-1] "Adjust colors of image$?, with brightness $1, contrast $2, gamma $3, hue shift $4, saturation $5 and + value range [$6,$7]." + repeat $! l[$>] split_opacity l[0] range={"$6==$7 && $6==0?[im,iM]:[min($6,$7),max($6,$7)]"} m={arg(1,$range)} M={arg(2,$range)} fact={255/max(1e-5,$M-$m)} - $m * $fact - if {$4" || "$5} # Adjust Hue/Saturation + if $4" || "$5 # Adjust Hue/Saturation to_rgb[0] rgb2hsv[0] sh[0] 0 +. {$4*1.8} rm. sh[0] 1 +. {($5%)^(1+($5>0))} c. 0,1 rm. @@ -6619,52 +9125,53 @@ +[0] {$1*2} # Adjust Brightness /[0] $fact +[0] $m c[0] $range # Renormalize values. a c - endl done v + + endl a c endl done #@cli ac : eq. to 'apply_channels'. ac : - v - _gmic_s="$?" v + - _apply_channels $"*" + _gmic_s="$?" v + _apply_channels $"*" #@cli apply_channels : "command",color_channels,_value_action={ 0=none | 1=cut | 2=normalize } #@cli : Apply specified command on the chosen color channel(s) of each selected images. #@cli : (eq. to 'ac').\n -#@cli : Argument 'color_channels' refers to a colorspace, and can be basically one of { all | rgba | rgb | lrgb | ycbcr | lab | lch | hsv | hsi | hsl | cmy | cmyk | yiq }. -#@cli : You can also make the processing focus on a few particular channels of this colorspace, by setting 'color_channels' as 'colorspace_channel' (e.g. 'hsv_h' for the hue). +#@cli : Argument 'color_channels' refers to a colorspace, and can be basically one of +#@cli : { all | rgba | [s]rgb | ryb | lrgb | ycbcr | lab | lch | hsv | hsi | hsl | cmy | cmyk | yiq }. +#@cli : You can also make the processing focus on a few particular channels of this colorspace, +#@cli : by setting 'color_channels' as 'colorspace_channel' (e.g. 'hsv_h' for the hue). #@cli : All channel values are considered to be provided in the [0,255] range. #@cli : Default value: 'value_action=0'. #@cli : $ image.jpg +apply_channels "equalize blur 2",ycbcr_cbcr apply_channels : - v - _gmic_s="$?" v + - _$0 $"*" + _gmic_s="$?" v + _$0 $"*" _apply_channels : check "isint(${3=0}) && $3>=0 && $3<=2" - v - mode="$2" - if {isval("$2")} if {isint("$2")} - mode=${arg\ 1+$2,all,rgba,rgb,rgb_r,rgb_g,rgb_b,rgba_a,\ - lrgb,lrgb_r,lrgb_g,lrgb_b,\ - ycbcr_y,ycbcr_cbcr,ycbcr_cb,ycbcr_cr,ycbcr_cg,\ - lab_l,lab_ab,lab_a,lab_b,\ - lch_ch,lch_c,lch_h,\ - hsv_h,hsv_s,hsv_v,hsi_i,hsl_l,\ - cmyk_c,cmyk_m,cmyk_y,cmyk_k,\ - yiq_y,yiq_iq} - fi fi - v + e[^-1] "Apply command '$1' on channels '"$mode"' of image"$_gmic_s"." v - - ({'$/'}) id={h=0;for(k=0,k] _ac_precond$id is_alpha={s==2" || "s==4} if $is_alpha s c,{1-s} fi _ac_forward$id[0] a c sh $_s _ac. "$1" - if {$3==1} c. 0,255 elif {$3==2} n. 0,255 fi + if $3==1 c. 0,255 elif $3==2 n. 0,255 fi rm. if $is_alpha s c,{1-s} fi _ac_backward$id[0] a c endl done - uncommand _ac_precond$id,_ac_forward$id,_ac_backward$id - v + + um _ac_precond$id,_ac_forward$id,_ac_backward$id + +_ac_list : + if isnum("$1") + arg 1+round($1),all,rgba,rgb,rgb_r,rgb_g,rgb_b,rgba_a,\ + lrgb,lrgb_r,lrgb_g,lrgb_b,\ + ycbcr_y,ycbcr_cbcr,ycbcr_cb,ycbcr_cr,ycbcr_cg,\ + lab_l,lab_ab,lab_a,lab_b,\ + lch_ch,lch_c,lch_h,\ + hsv_h,hsv_s,hsv_v,hsi_i,hsl_l,\ + cmyk_c,cmyk_m,cmyk_y,cmyk_k,\ + yiq_y,yiq_iq,ryb,ryb_r,ryb_y,ryb_b + else u "$1" fi _ac : whds={w},{h},{d},{s} ${1--1} k[0] r $whds,0 @@ -6682,11 +9189,21 @@ _ac_rgb_g : _ac_rgba_g _ac_rgb_b : _ac_rgba_b +_ac_srgb : _ac_rgb +_ac_srgb_r : _ac_rgb_r +_ac_srgb_g : _ac_rgb_g +_ac_srgb_b : _ac_rgb_b + _ac_lrgb : _p="to_color" _f="srgb2rgb" _b="rgb2srgb" _s=0,2 _ac_lrgb_r : _p="to_color" _f="srgb2rgb" _b="rgb2srgb" _s=0 _ac_lrgb_g : _p="to_color" _f="srgb2rgb" _b="rgb2srgb" _s=1 _ac_lrgb_b : _p="to_color" _f="srgb2rgb" _b="rgb2srgb" _s=2 +_ac_ryb : _p="to_color" _f="rgb2ryb" _b="ryb2rgb" _s=0,2 +_ac_ryb_r : _p="to_color" _f="rgb2ryb" _b="ryb2rgb" _s=0 +_ac_ryb_y : _p="to_color" _f="rgb2ryb" _b="ryb2rgb" _s=1 +_ac_ryb_b : _p="to_color" _f="rgb2ryb" _b="ryb2rgb" _s=2 + _ac_ycbcr : _p="to_color" _f="rgb2ycbcr" _b="ycbcr2rgb" _s=0,2 _ac_ycbcr_y : _p="to_color" _f="rgb2ycbcr" _b="ycbcr2rgb" _s=0 _ac_ycbcr_cbcr : _p="to_color" _f="rgb2ycbcr" _b="ycbcr2rgb" _s=1,2 @@ -6745,13 +9262,13 @@ autoindex : check "isint($1) && $1>0 && ${2=0}>=0" skip ${3=1} e[^-1] "Index colors in images$? by adapted colormap with $1 entries, dithering level $2 and "\ ${arg\ 1+!$3,k-means,median-cut}" method." - v - repeat $! l[$>] - if {w>h} if {w>256} +r2dx 256 else [0] fi - else if {h>256} +r2dy 256 else [0] fi + repeat $! l[$>] + if w>h if w>256 +r2dx 256 else [0] fi + else if h>256 +r2dy 256 else [0] fi fi colormap[1] $1,$3,0 index[0] [1],$2,1 rm[1] - endl done v + + endl done #@cli bayer2rgb : _GM_smoothness,_RB_smoothness1,_RB_smoothness2 #@cli : Transform selected RGB-Bayer sampled images to color images. @@ -6759,7 +9276,7 @@ #@cli : $ image.jpg rgb2bayer 0 +bayer2rgb 1,1,0.5 bayer2rgb : skip ${1=1},${2=1},${3=0.5} e[^-1] "Transform RGB-Bayer image$? to color images, with smoothness ($1,$2,$3)." - v - channels 0 repeat $! l[$>] + channels 0 repeat $! l[$>] # Expand image size to avoid problems with borders. expand_x {"2 + 4*$1"},0 expand_y {"2 + 4*$1"},0 @@ -6800,29 +9317,50 @@ shrink_x {"2 + 4*$1"},0 shrink_y {"2 + 4*$1"},0 c 0,255 - endl done v + + endl done + +#@cli deltaE : [image],_metric={ 0=deltaE_1976 | 1=deltaE_2000 },"_to_Lab_command" +#@cli : Compute the CIE DeltaE color difference between selected images and specified [image]. +#@cli : Argument 'to_Lab_command' is a command able to convert colors of [image] into a Lab representation. +#@cli : Default values: 'metric=1' and 'to_Lab_command="srgb2lab"'. +#@cli : $ image.jpg +blur 2 +deltaE[0] [1],1,srgb2lab +deltaE : check ${"is_image_arg $1"}" && isbool(${2=1})" skip "${3=srgb2lab}" + e[^-1] "Compute the CIE DeltaE_"${"s0,s1=1976,2000 u $s$2"}" color difference between image$? and image$1, "\ + "with to_Lab command '$3'." + pass$1 1 + needs_to_lab={"s = ['$3']; s!=0 && s!=' '"} + if $needs_to_lab m "_deltaE_to_lab : $3" +_deltaE_to_lab. rm.. fi + repeat $!-1 l[$>,-1] nm={0,n} + if $needs_to_lab _deltaE_to_lab[0] fi + if !$2 -.. . norm.. # DeltaE_1976 + else 100%,100%,100%,1,${-math_lib}"deltaE00(I#0,I#1)" rv[0,-1] rm. # DeltaE_2000 + fi + nm[0] $nm endl done + rm. um _deltaE_to_lab #@cli cmy2rgb #@cli : Convert color representation of selected images from CMY to RGB. cmy2rgb : e[^-1] "Convert color representation of image$? from CMY to RGB." - v - rgb2cmy v + + rgb2cmy #@cli cmyk2rgb #@cli : Convert color representation of selected images from CMYK to RGB. cmyk2rgb : e[^-1] "Convert color representation of image$? from CMYK to RGB." - v - repeat $! l[$>] + repeat $! l[$>] s c +/. -255 +. 1 *[0-2] . rm. +[0-2] . rm. a c cmy2rgb - endl done v + + endl done -#@cli colorblind : type={ 0=protanopia | 1=protanomaly | 2=deuteranopia | 3=deuteranomaly | 4=tritanopia | 5=tritanomaly | 6=achromatopsia | 7=achromatomaly } +#@cli colorblind : type={ 0=protanopia | 1=protanomaly | 2=deuteranopia | 3=deuteranomaly | \ +# 4=tritanopia | 5=tritanomaly | 6=achromatopsia | 7=achromatomaly } #@cli : Simulate color blindness vision. #@cli : $ image.jpg +colorblind 0 colorblind : check "isint($1) && $1>=0 && $1<=7" - v - s0="protanopia" s1="protanomaly" s2="deuteranopia" s3="deuteranomaly" s4="tritanopia" s5="tritanomaly" s6="achromatopsia" s7="achromatomaly" - v + e[^-1] "Simulate color blindness of type '"${s$1}"' on image$?." v - + s0="protanopia" s1="protanomaly" s2="deuteranopia" s3="deuteranomaly" s4="tritanopia" + s5="tritanomaly" s6="achromatopsia" s7="achromatomaly" + e[^-1] "Simulate color blindness of type '"${s$1}"' on image$?." type0=(0.567,0.433,0;0.558,0.442,0;0,0.242,0.758) type1=(0.817,0.183,0;0.333,0.667,0;0,0.125,0.875) type2=(0.625,0.375,0;0.7,0.3,0;0,0.3,0.7) @@ -6832,11 +9370,11 @@ type6=(0.299,0.587,0.114;0.299,0.587,0.114;0.299,0.587,0.114) type7=(0.618,0.320,0.062;0.163,0.775,0.062;0.163,0.320,0.516) repeat $! l[$>] split_opacity l[0] to_rgb mix_channels ${type$1} endl a c endl done - v + -#@cli colormap : nb_levels>=0,_method={ 0=median-cut | 1=k-means },_sort_vectors={ 0 | 1 } +#@cli colormap : nb_levels>=0,_method={ 0=median-cut | 1=k-means },_sort_vectors #@cli : Estimate best-fitting colormap with 'nb_colors' entries, to index selected images. #@cli : Set 'nb_levels==0' to extract all existing colors of an image. +#@cli : 'sort_vectors' can be '{ 0=unsorted | 1=by increasing norm | 2=by decreasing occurrence }' #@cli : Default value: 'method=1' and 'sort_vectors=1'. #@cli : $ image.jpg +colormap[0] 4 +colormap[0] 8 +colormap[0] 16 #@cli : $$ @@ -6844,45 +9382,84 @@ if $1 e[0--3] "Estimate colormap with $1 entries for image$?, by "${arg\ 1+!$2,k-means,median-cut}" method." else e[0--3] "Estimate full colormap for image$?." fi - v - repeat $! l[$>] nm={b} - r {w*h*d},1,1,100%,-1 + repeat $! l[$>] nm={b} is_half=${-is_half} if $1 # Estimate quantized colormap. - if {!$2} _colormap $1 # Just run the median-cut algorithm + r {whd},1,1,100%,-1 + if !$2 +_colormap $1 # Just run the median-cut algorithm else +_colormap $1 max_diff={(iM-im+1)/8192} do +index.. . # Find nearest cluster for each color - ..,1,1,{-2,s+1} - f.. ">I[#3,i]+=[ I[#0,x],1 ]" rm.. - f. "s = i(x,0,0,s-1); s?I/s:[ I[#1,x], 0 ]" + if $is_half + ..,1,1,{1,s} + eval " + ref(vector(#w*s#0),csum); + ref(vector(#w,0),cocc); + for (k = 0, kI[#3,i]+=[ I[#0,x],1 ]" rm.. + f. "s = i(x,0,0,s-1); s?I/s:[ I[#1,x], 0 ]" + fi +-.. . abs. diff={iM/w} rm. # Compute colormap difference j.. . rm. - while {$diff>$max_diff} - rm.. + while $diff>$max_diff + fi + if $3 index.. .,0,0 histogram.. {[w,0,w-1]} a y sort -,x rows 1 # Sort by decreasing occurrence + else rm.. fi else # Extract full colormap. - repeat {s} ap "sort +,x" s x,0 ap "shift 0,0,0,1,2" done - ap "discard x" a x + # Compute map of hashcodes. + +n. 0,255 f. "ret = vectors(); H = 0; for (p = 0, p"${-math_lib}" + begin( ret = vectors(); col_r = vectors() ); + col_s = I; + H = 2 + i#1; + sH = dar_size(#H); + is_found = 0; + for (p = 0, p =.. {iv},$""1,0,0,$> rm. done" + m "__colormap : repeat s sh[$""1] $> =.. {iv},$""1,0,0,$> rm. done" 1,1,1,{s} __colormap 0 # Initialize image of box variances - repeat {$1-1} + repeat $1-1 b,a={[xM,cM]} # b = box with highest variance, a = axis with highest variance - shift[$b] 0,0,0,{-$a},2 sort[$b] +,x shift[$b] 0,0,0,$a,2 s[$b] x,2 # Split selected box along its median axis + shift[$b] 0,0,0,{-$a},2 sort[$b] +,x shift[$b] 0,0,0,$a,2 + if {$b,w>1} s[$b] x,2 else 1 fi # Split selected box along its median axis mv[$b] -1 r. {w+1},1,1,100%,0 __colormap $b __colormap {$!-2} # Update box variances done rm. r 1,1,1,100%,2 a x # Average value in each box and append as final colormap - uncommand __colormap + um __colormap #@cli compose_channels #@cli : Compose all channels of each selected image, using specified arithmetic operator (+,-,or,min,...). @@ -6891,37 +9468,36 @@ #@cli : $$ compose_channels : skip ${1="+"} e[^-1] "Compose all channels of image$?, with operator '$1'." - v - repeat $! l[$>] + repeat $! l[$>] sh 0 - repeat {-2,s-1} sh.. {$>+1} l[-2,-1] $1 endl done + repeat s#-2-1 sh.. {$>+1} l[-2,-1] $1 endl done rm. r 100%,100%,100%,1,-1 - endl done v + + endl done #@cli direction2rgb #@cli : Compute RGB representation of selected 2D direction fields. #@cli : $ image.jpg luminance gradient append c blur 2 orientation +direction2rgb direction2rgb : e[^-1] "Compute RGB representation of 2D direction field$?." - v - channels 0,1 repeat $! l[$>] nm={0,n} + channels 0,1 repeat $! l[$>] nm={0,n} s c complex2polar round.. 0.001 *. {180/pi} %. 360 100%,100%,1,1,1 mv... $! - if {im!=iM} n. 0,1 else f. 1 fi + if im!=iM n. 0,1 else f. 1 fi a c hsv2rgb - nm $nm endl done v + + nm $nm endl done #@cli ditheredbw #@cli : Create dithered B&W version of selected images. #@cli : $ image.jpg +equalize ditheredbw[-1] ditheredbw : e[^-1] "Create dithered B&W version of image$?." - v - repeat $! l[$>] split_opacity + repeat $! l[$>] split_opacity luminance[0] n[0] 0,255 (0,255) index[0] .,1,1 rm. - a c endl done v + + a c endl done #@cli fc : eq. to 'fill_color'. fc : - v - _gmic_s="$?" v + - _fill_color $* + _gmic_s="$?" v + _fill_color $* #@cli fill_color : col1,...,colN #@cli : Fill selected images with specified color. @@ -6929,14 +9505,13 @@ #@cli : $ image.jpg +fill_color 255,0,255 #@cli : $$ fill_color : - v - _gmic_s="$?" v + - _$0 $* + _gmic_s="$?" v + _$0 $* _fill_color : e[0--3] "Fill image"$_gmic_s" with color (${^0})." - v - repeat $! l[$>] - repeat {s} sh[0] $> f. {arg(1+$>,${^0})} done k[0] - nm {n} endl done v + + repeat $! l[$>] + repeat s sh[0] $> f. {arg(1+$>,${^0})} done k[0] + nm {n} endl done #@cli gradient2rgb : _is_orientation={ 0 | 1 } #@cli : Compute RGB representation of 2D gradient of selected images. @@ -6945,93 +9520,86 @@ gradient2rgb : check "isbool(${1=0})" arg 1+!$1,"orientation ","" e[^-1] "Compute RGB representation of 2D gradient "${}"of image$?." - v - norm repeat $! l[$>] + norm repeat $! l[$>] if $1 gradient_orientation 2 else g xy fi a c direction2rgb - endl done v + + endl done -#@cli hcy2rgb : +#@cli hcy2rgb #@cli : Convert color representation of selected images from HCY to RGB. hcy2rgb : e[^-1] "Convert color representation of image$? from HCY to RGB." - v - to_color f " + to_color f " H = (R/60)%6; X = G*(1 - abs(H%2 - 1)); RGB = arg(1 + int(H),[G,X,0],[X,G,0],[0,G,X],[0,X,G],[X,0,G],[G,0,X]); m = B - 0.3*RGB[0] - 0.59*RGB[1] - 0.11*RGB[2]; cut((RGB+=m)*=255,0,255)" - v + #@cli hsi2rgb #@cli : Convert color representation of selected images from HSI to RGB. hsi2rgb : e[^-1] "Convert color representation of image$? from HSI to RGB." - v - to_color + to_color f " H = (R/60)%6; - S = cut(G,0,1); - I = cut(B,0,1); + S = G; + I = B; Z = 1 - abs((H%2) - 1); C = I*S/(1 + Z); X = C*Z; m = I*(1 - S)/3; RGB = arg(1 + int(H),[C,X,0],[X,C,0],[0,C,X],[0,X,C],[X,0,C],[C,0,X]); - cut((RGB+=m)*=3*255,0,255); - " - v + + (RGB+=m)*=3*255" #@cli hsi82rgb #@cli : Convert color representation of selected images from HSI8 to RGB. hsi82rgb : e[^-1] "Convert color representation of image$? from HSI8 to RGB." - v - _hsx82rgb hsi2rgb v + + _hsx82rgb hsi2rgb #@cli hsl2rgb #@cli : Convert color representation of selected images from HSL to RGB. hsl2rgb : e[^-1] "Convert color representation of image$? from HSL to RGB." - v - to_color + to_color f " H = (R/60)%6; - S = cut(G,0,1); - L = cut(B,0,1); + S = G; + L = B; C = (1 - abs(2*L - 1))*S; X = C*(1 - abs(H%2 - 1)); m = L - C/2; RGB = arg(1 + int(H),[C,X,0],[X,C,0],[0,C,X],[0,X,C],[X,0,C],[C,0,X]); - cut((RGB+=m)*=255,0,255); - " - v + + (RGB+=m)*=255" #@cli hsl82rgb #@cli : Convert color representation of selected images from HSL8 to RGB. hsl82rgb : e[^-1] "Convert color representation of image$? from HSL8 to RGB." - v - _hsx82rgb hsl2rgb v + + _hsx82rgb hsl2rgb #@cli hsv2rgb #@cli : Convert color representation of selected images from HSV to RGB. #@cli : $ (0,360;0,360^0,0;1,1^1,1;1,1) resize 400,400,1,3,3 hsv2rgb hsv2rgb : e[^-1] "Convert color representation of image$? from HSV to RGB." - v - to_color + to_color f " H = (R/60)%6; - S = cut(G,0,1); - V = cut(B,0,1); + S = G; + V = B; C = V*S; X = C*(1 - abs(H%2 - 1)); m = V - C; RGB = arg(1 + int(H),[C,X,0],[X,C,0],[0,C,X],[0,X,C],[X,0,C],[C,0,X]); - cut((RGB+=m)*=255,0,255); - " - v + + (RGB+=m)*=255" #@cli hsv82rgb #@cli : Convert color representation of selected images from HSV8 to RGB. hsv82rgb : e[^-1] "Convert color representation of image$? from HSV8 to RGB." - v - _hsx82rgb hsv2rgb v + + _hsx82rgb hsv2rgb _hsx82rgb : repeat $! @@ -7043,123 +9611,271 @@ #@cli : Convert color representation of selected images from INT24 to RGB. int2rgb : e[^-1] "Convert color representation of image$? from INT24 scalars to RGB." - v - round repeat $! l[$>] + round repeat $! l[$>] +>> 8 &[1] 255 +&[0] 255 >>[0] 16 a c - endl done v + + endl done + +#@cli jzazbz2rgb : illuminant={ 0=D50 | 1=D65 | 2=E } : (no arg) +#@cli : Convert color representation of selected images from RGB to Jzazbz. +#@cli : Default value: 'illuminant=2'. +jzazbz2rgb : skip "${1=,}" + l[] if isnum("$1") illu={"$1>1?2:$1>0?1:0"} else if ["'$1'"]!=',' noarg fi illu=2 fi onfail noarg illu=2 endl + e[^-1] "Convert color representation of image$? from Jzazbz to RGB, using the "${arg\ 1+$illu,D50,D65,E}" illuminant." + jzazbz2xyz xyz2rgb $illu + +#@cli jzazbz2xyz +#@cli : Convert color representation of selected images from RGB to XYZ. +jzazbz2xyz : + e[^-1] "Convert color representation of image$? from Jzazbz to XYZ." + repeat $! l[$>] split_opacity + f[0] ${-_jzazbz_const}" + tmp = i0 + Jzazbz_d0; + Iz = tmp/(1 + Jzazbz_d - Jzazbz_d*tmp); + azz = i1; + bzz = i2; + Lp = Iz + 0.138605043271539*azz + 0.0580473161561189*bzz; + Mp = Iz - 0.138605043271539*azz - 0.0580473161561189*bzz; + Sp = Iz - 0.0960192420263189*azz - 0.811891896056039*bzz; + tmp = Lp^(1/Jzazbz_p); + L = peakLum*((Jzazbz_c1 - tmp)/(Jzazbz_c3*tmp-Jzazbz_c2))^(1/Jzazbz_n); + tmp = Mp^(1/Jzazbz_p); + M = peakLum*((Jzazbz_c1 - tmp)/(Jzazbz_c3*tmp-Jzazbz_c2))^(1/Jzazbz_n); + tmp = Sp^(1/Jzazbz_p); + S = peakLum*((Jzazbz_c1 - tmp)/(Jzazbz_c3*tmp-Jzazbz_c2))^(1/Jzazbz_n); + Xp = 1.92422643578761*L - 1.00479231259537*M + 0.037651404030618*S; + Yp = 0.350316762094999*L + 0.726481193931655*M - 0.065384422948085*S; + Zp = -0.0909828109828476*L - 0.312728290523074*M + 1.52276656130526*S; + X = (Xp + (Jzazbz_b - 1)*Zp)/Jzazbz_b; + Y = (Yp + (Jzazbz_g - 1)*X)/Jzazbz_g; + Z = Zp; + [ X,Y,Z ]/255" + a c endl done + +# The XYZ<->Jzazbz conversion code has been written by Alan Gibson, +# and published on this page: http://im.snibgo.com/jzazbz.htm +_jzazbz_const : + u "const Jzazbz_b = 1.15; + const Jzazbz_g = 0.66; + const Jzazbz_c1 = 3424/4096; + const Jzazbz_c2 = 2413/128; + const Jzazbz_c3 = 2392/128; + const Jzazbz_n = 2610/16384; + const Jzazbz_p = 1.7*2523/32; + const Jzazbz_d = -0.56; + const Jzazbz_d0 = 1.6295499532821566e-11; + const peakLum = 10000;" #@cli lab2lch #@cli : Convert color representation of selected images from Lab to Lch. lab2lch : e[^-1] "Convert color representation of image$? from Lab to Lch." - v - r 100%,100%,100%,3 repeat $! l[$>] + r 100%,100%,100%,3 repeat $! l[$>] s c complex2polar[-2,-1] a c - endl done v + + endl done -#@cli lab2rgb : illuminant={ 0=D50 | 1=D65 } : (no arg) +#@cli lab2rgb : illuminant={ 0=D50 | 1=D65 | 2=E } : (no arg) #@cli : Convert color representation of selected images from Lab to RGB. -#@cli : Default value: 'illuminant=1'. +#@cli : Default value: 'illuminant=2'. #@cli : $ (50,50;50,50^-3,3;-3,3^-3,-3;3,3) resize 400,400,1,3,3 lab2rgb lab2rgb : skip "${1=,}" - v - l[] if {isval("$1")} illu={"$1?1:0"} else if {["'$1'"]!=','} noarg fi illu=1 fi onfail noarg illu=1 endl v + - e[^-1] "Convert color representation of image$? from Lab to RGB, using the D"{arg(1+$illu,50,65)}" illuminant." - v - lab2xyz $illu xyz2rgb $illu v + + l[] if isnum("$1") illu={"$1>1?2:$1>0?1:0"} else if ["'$1'"]!=',' noarg fi illu=2 fi onfail noarg illu=2 endl + e[^-1] "Convert color representation of image$? from Lab to RGB, using the "${arg\ 1+$illu,D50,D65,E}" illuminant." + lab2xyz $illu xyz2rgb $illu -#@cli lab2srgb : illuminant={ 0=D50 | 1=D65 } : (no arg) +#@cli lab2srgb : illuminant={ 0=D50 | 1=D65 | 2=E } : (no arg) #@cli : Convert color representation of selected images from Lab to sRGB. -#@cli : Default value: 'illuminant=1'. +#@cli : Default value: 'illuminant=2'. #@cli : $ (50,50;50,50^-3,3;-3,3^-3,-3;3,3) resize 400,400,1,3,3 lab2rgb lab2srgb : skip "${1=,}" - v - l[] if {isval("$1")} illu={"$1?1:0"} else if {["'$1'"]!=','} noarg fi illu=1 fi onfail noarg illu=1 endl v + - e[^-1] "Convert color representation of image$? from Lab to sRGB, using the D"{arg(1+$illu,50,65)}" illuminant." - v - lab2rgb $illu rgb2srgb v + + l[] if isnum("$1") illu={"$1>1?2:$1>0?1:0"} else if ["'$1'"]!=',' noarg fi illu=2 fi onfail noarg illu=2 endl + e[^-1] "Convert color representation of image$? from Lab to sRGB, using the "${arg\ 1+$illu,D50,D65,E}" illuminant." + lab2rgb $illu rgb2srgb -#@cli lab82srgb : illuminant={ 0=D50 | 1=D65 } : (no arg) +#@cli lab82srgb : illuminant={ 0=D50 | 1=D65 | 2=E } : (no arg) #@cli : Convert color representation of selected images from Lab8 to sRGB. -#@cli : Default value: 'illuminant=1'. +#@cli : Default value: 'illuminant=2'. #@cli : $ (50,50;50,50^-3,3;-3,3^-3,-3;3,3) resize 400,400,1,3,3 lab2rgb lab82srgb : skip "${1=,}" - v - l[] if {isval("$1")} illu={"$1?1:0"} else if {["'$1'"]!=','} noarg fi illu=1 fi onfail noarg illu=1 endl v + - e[^-1] "Convert color representation of image$? from Lab8 to sRGB, using the D"{arg(1+$illu,50,65)}" illuminant." - v - lab82rgb $illu rgb2srgb v + + l[] if isnum("$1") illu={"$1>1?2:$1>0?1:0"} else if ["'$1'"]!=',' noarg fi illu=2 fi onfail noarg illu=2 endl + e[^-1] "Convert color representation of image$? from Lab8 to sRGB, using the "${arg\ 1+$illu,D50,D65,E}" illuminant." + lab82rgb $illu rgb2srgb -#@cli lab2xyz : illuminant={ 0=D50 | 1=D65 } : (no arg) +#@cli lab2xyz : illuminant={ 0=D50 | 1=D65 | 2=E } : (no arg) #@cli : Convert color representation of selected images from Lab to XYZ. -#@cli : Default value: 'illuminant=1'. +#@cli : Default value: 'illuminant=2'. lab2xyz : skip "${1=,}" - v - l[] if {isval("$1")} illu={"$1?1:0"} else if {["'$1'"]!=','} noarg fi illu=1 fi onfail noarg illu=1 endl v + - e[^-1] "Convert color representation of image$? from Lab to XYZ, using the D"{arg(1+$illu,50,65)}" illuminant." - v - to_color + l[] if isnum("$1") illu={"$1>1?2:$1>0?1:0"} else if ["'$1'"]!=',' noarg fi illu=2 fi onfail noarg illu=2 endl + e[^-1] "Convert color representation of image$? from Lab to XYZ, using the "${arg\ 1+$illu,D50,D65,E}" illuminant." + to_color f " begin( + const epsilon = 216/24389; + const kappa = 24389/27; D65 = [ 0.4124564, 0.3575761, 0.1804375, 0.2126729, 0.7151522, 0.0721750, 0.0193339, 0.1191920, 0.9503041 ]; D50 = [ 0.43603516, 0.38511658, 0.14305115, 0.22248840, 0.71690369, 0.06060791, 0.01391602, 0.09706116, 0.71392822 ]; - white = ("$illu"?D65:D50)*[ 1,1,1 ]; + E = [ 0.488718,0.3106803,0.2006017, + 0.1762044,0.8129847,0.0108109, + 0,0.0102048,0.9897952 ]; + white = ("$illu"==2?E:"$illu"==1?D65:D50)*[ 1,1,1 ]; ); - cY = (R + 16)/116; - cZ = cY - B/200; - cX = G/500 + cY; - XYZ = [ 24389*cX>216?cX^3:(116*cX - 16)*27/24389, - 27*R>216?cY^3:27*R/24389, - 24389*cZ>216?cZ^3:(116*cZ - 16)*27/24389 ]; - XYZ*=white; - " - v + -#@cli lab82rgb : illuminant={ 0=D50 | 1=D65 } : (no arg) + fy = (i0 + 16)/116; + fz = fy - i2/200; + fx = i1/500 + fy; + fx3 = fx^3; + fz3 = fz^3; + XYZ = [ fx3>epsilon?fx3:(116*fx - 16)/kappa, + i0>kappa*epsilon?((i0+16)/116)^3:i0/kappa, + fz3>epsilon?fz3:(116*fz - 16)/kappa ]; + XYZ*=white" + +#@cli lab82rgb : illuminant={ 0=D50 | 1=D65 | 2=E } : (no arg) #@cli : Convert color representation of selected images from Lab8 to RGB. -#@cli : Default value: 'illuminant=1'. +#@cli : Default value: 'illuminant=2'. lab82rgb : skip "${1=,}" - v - l[] if {isval("$1")} illu={"$1?1:0"} else if {["'$1'"]!=','} noarg fi illu=1 fi onfail noarg illu=1 endl v + - e[^-1] "Convert color representation of image$? from Lab8 to RGB, using the D"{arg(1+$illu,50,65)}" illuminant." - v - repeat $! + l[] if isnum("$1") illu={"$1>1?2:$1>0?1:0"} else if ["'$1'"]!=',' noarg fi illu=2 fi onfail noarg illu=2 endl + e[^-1] "Convert color representation of image$? from Lab8 to RGB, using the "${arg\ 1+$illu,D50,D65,E}" illuminant." + repeat $! sh[$>] 0 /. 2.55 rm. sh[$>] 1 /. 1.275 -. 100 rm. sh[$>] 2 /. 1.15909 -. 110 rm. - done lab2rgb $illu v + + done lab2rgb $illu #@cli lch2lab #@cli : Convert color representation of selected images from Lch to Lab. lch2lab : e[^-1] "Convert color representation of image$? from Lch to Lab." - v - r 100%,100%,100%,3 repeat $! l[$>] + r 100%,100%,100%,3 repeat $! l[$>] s c polar2complex[-2,-1] a c - endl done v + + endl done -#@cli lch2rgb : illuminant={ 0=D50 | 1=D65 } : (no arg) +#@cli lch2rgb : illuminant={ 0=D50 | 1=D65 | 2=E } : (no arg) #@cli : Convert color representation of selected images from Lch to RGB. -#@cli : Default value: 'illuminant=1'. +#@cli : Default value: 'illuminant=2'. lch2rgb : skip "${1=,}" - v - l[] if {isval("$1")} illu={"$1?1:0"} else if {["'$1'"]!=','} noarg fi illu=1 fi onfail noarg illu=1 endl v + - e[^-1] "Convert color representation of image$? from Lch to RGB, using the D"{arg(1+$illu,50,65)}" illuminant." - v - lch2lab lab2rgb $illu v + + l[] if isnum("$1") illu={"$1>1?2:$1>0?1:0"} else if ["'$1'"]!=',' noarg fi illu=2 fi onfail noarg illu=2 endl + e[^-1] "Convert color representation of image$? from Lch to RGB, using the "${arg\ 1+$illu,D50,D65,E}" illuminant." + lch2lab lab2rgb $illu -#@cli lch82rgb : illuminant={ 0=D50 | 1=D65 } : (no arg) +#@cli lch82rgb : illuminant={ 0=D50 | 1=D65 | 2=E } : (no arg) #@cli : Convert color representation of selected images from Lch8 to RGB. -#@cli : Default value: 'illuminant=1'. +#@cli : Default value: 'illuminant=2'. lch82rgb : skip "${1=,}" - v - l[] if {isval("$1")} illu={"$1?1:0"} else if {["'$1'"]!=','} noarg fi illu=1 fi onfail noarg illu=1 endl v + - e[^-1] "Convert color representation of image$? from Lch8 to RGB, using the D"{arg(1+$illu,50,65)}" illuminant." - v - repeat $! + l[] if isnum("$1") illu={"$1>1?2:$1>0?1:0"} else if ["'$1'"]!=',' noarg fi illu=2 fi onfail noarg illu=2 endl + e[^-1] "Convert color representation of image$? from Lch8 to RGB, using the "${arg\ 1+$illu,D50,D65,E}" illuminant." + repeat $! sh[$>] 0 /. 2.55 rm. sh[$>] 1 /. 1.88889 rm. sh[$>] 2 /. 40.5845 -. 3.14159 rm. - done lch2rgb $illu v + + done lch2rgb $illu #@cli luminance #@cli : Compute luminance of selected sRGB images. #@cli : $ image.jpg +luminance luminance : e[^-1] "Compute luminance of image$?." - v - remove_opacity srgb2rgb + remove_opacity srgb2rgb repeat $! l[$>] - if {s==3} sh 0 sh[0] 1 sh[0] 2 *[1] 0.22248840 *[2] 0.71690369 *[3] 0.06060791 +[1-3] rm[1] - elif {s!=1} norm n 0,255 + if s==3 sh 0 sh[0] 1 sh[0] 2 *[1] 0.22248840 *[2] 0.71690369 *[3] 0.06060791 +[1-3] rm[1] + elif s!=1 norm n 0,255 fi endl done - channels 0 rgb2srgb v + + channels 0 rgb2srgb + +#@cli lightness +#@cli : Compute lightness of selected sRGB images. +#@cli : $ image.jpg +lightness +lightness : + e[^-1] "Compute lightness of image$?." + remove_opacity srgb2rgb + if s==3 rgb2lab channels 0 * {255/100} elif s!=1 norm n 0,255 rgb2srgb fi + +#@cli lut_contrast : _nb_colors>1,_min_rgb_value +#@cli : Generate a RGB colormap where consecutive colors have high contrast. +#@cli : This function performs a specific score maximization to generate the result, so +#@cli : it may take some time when 'nb_colors' is high. +#@cli : Default values: 'nb_colors=256' and 'min_rgb_value=64'. +lut_contrast : check "isint(${1=256}) && $1>=1 && isnum(${2=48})" + e[^-1] "Generate high-contrast RGB colormap with $1 colors and min RGB value $2." + l[] + + # Initialization by farthest point sampling of the RGB cube. + 64,64,64,1 eval "for (k = 0, k<8, ++k, x = !!(k&1); y = !!(k&2); z = !!(k&4); i([x,y,z]*(w-1)) = 1)" + N={is} + e[] "" + do + +neq. 0 distance. 1 xyzM={[xM,yM,zM]} rm. + col={round([$xyzM]*255/(w-1))} + if max($col)>=$2 =. 1,$xyzM N+=1 else =. -1,$xyzM fi + e[] "\r [ Init ] > Colors \#"$N + while $N<$1 + >. 0 {is},1,1,3 + eval.. ">begin(k = 0); i>0?(I[#-1,k++] = round([ x,y,z ]*255/63))" + k. + + N0=5 # 5 first colors to be preserved. + s x repeat $! + if {$>,I==[0,0,0]} rv[$>,0] fi + if {$>,I==[255,255,255]} rv[$>,1] fi + if {$>,I==[255,0,0]} rv[$>,2] fi + if {$>,I==[0,255,0]} rv[$>,3] fi + if {$>,I==[0,0,255]} rv[$>,4] fi + done a x + + # Functional optimization. + e[] "" + +srgb2lab a c + energy_max=${-_lut_contrast.} + nb_attempts=1000 + do + e[] "\r [ Optim ] > Score = "{_$energy_max}", Attempts = "$nb_attempts" " + . eval " + do( + k0 = round(u("$N0",w-1)); + k1 = round(u("$N0",w-1)), + k0==k1); + tmp = I[k0]; I[k0] = I[k1]; I[k1] = tmp" + energy=${-_lut_contrast.} + if $energy>$energy_max energy_max=$energy k. nb_attempts=1000 else rm. nb_attempts-=1 fi + while $nb_attempts>0 + + channels 0,2 + endl + +_lut_contrast : + 100%,1,1,1,"> + const N = 10; + dist = 0; sumw = 0; + RGB0 = (I[#0,x])[3,3]; + kmin = max(x-N,0); + kmax = min(x+N,w-1); + for (k = kmin, k<=kmax, ++k, + RGB = (I[#0,k])[3,3]; + w = (1 + N - abs(k-x))^1.5; + dist+= w*norm(RGB - RGB0); + sumw+=w; + ); + dist/=sumw" + u {is} rm. + +#@cli map_clut : [clut] | "clut_name" +#@cli : Map specified RGB color LUT to selected images. +#@cli : $ image.jpg uniform_distribution {2^6},3 mirror[-1] x +map_clut[0] [1] +map_clut : + e[^-1] "Map color LUT $1 on image$?." + if !$! return fi + to_color + if ${"is_image_arg $1"} pass$1 0 to_rgb. else clut "$1" fi + l={round((w*h*d)^(1/3))} + if w*h*d!=$l^3 error "Command '$0': Specified CLUT $1 has invalid dimensions "({w},{h},{d},{s}). fi + r. $l,$l,$l,3,-1 + repeat $!-1 l[$>,-1] nm={0,n} split_opacity[0] /[0] {256/$l} + +warp. [0],0,1,1 + rm[0] mv. 0 a[^-1] c nm[0] $nm + endl done rm. #@cli mix_rgb : a11,a12,a13,a21,a22,a23,a31,a32,a33 #@cli : Apply 3x3 specified matrix to RGB colors of selected images. @@ -7168,92 +9884,503 @@ #@cli : $$ mix_rgb : skip ${1=1},${2=0},${3=0},${4=0},${5=1},${6=0},${7=0},${8=0},${9=1} e[^-1] "Apply matrix [ $1 $2 $3 ; $4 $5 $6 ; $7 $8 $9 ] to RGB colors of image$?." - v - to_color repeat $! sh[$>] 0,2 mix_channels. (${1-3};${4-6};${7-9}) rm. done v + + to_color repeat $! sh[$>] 0,2 mix_channels. (${1-3};${4-6};${7-9}) rm. done -#@cli pseudogray : _max_increment>=0,_JND_threshold>=0,_bits_depth>0 -#@cli : Generate pseudogray colormap with specified increment and perceptual threshold. -#@cli : If 'JND_threshold' is 0, no perceptual constraints are applied. -#@cli : Default values: 'max_increment=5', 'JND_threshold=2.3' and 'bits_depth=8'. -#@cli : $ pseudogray 5 -pseudogray : check "isint(${1=5}) && $1>=0 && ${2=2.3}>=0 && isint(${3=8}) && $3>0" - e[^-1] "Generate pseudogray colormap with increment $1, JND threshold $2 and $3 bits depth." - v - +#@cli palette : palette_name | palette_number +#@cli : Input specified color palette at the end of the image list. +#@cli : 'palette_name' can be { default | hsv | lines | hot | cool | jet | flag | cube | rainbow | \ +# parula | spring | summer | autumn | winter | bone | copper | pink | vga | \ +# algae | amp | balance | curl | deep | delta | dense | diff | gray | haline | ice | \ +# matter | oxy | phase | rain | solar | speed | tarn | tempo | thermal | topo | turbid | aurora | hocuspocus | srb2 | \ +# uzebox | amiga7800 | amiga7800mess | fornaxvoid1 +#@cli : $ palette hsv +palette : + names=${-_palette_names} N={narg($names)} + l[] if isint("$1") name=${"arg 1+($1%"$N"),"$names} else name="$1" fi onfail name="$1" endl + e[^-1] "Input color palette '"$name"'." + _palette_$name + +_palette_names : + u default,hsv,lines,hot,cool,jet,flag,cube,rainbow,\ + parula,spring,summer,autumn,winter,bone,copper,pink,vga,\ + algae,amp,balance,curl,deep,delta,dense,diff,gray,haline,ice,\ + matter,oxy,phase,rain,solar,speed,tarn,tempo,thermal,topo,turbid,aurora,hocuspocus,srb2,uzebox,\ + amiga7800,amiga7800mess,fornaxvoid1 - # Generate all possible sRGB colors with given increments. - {round(2^$3)},1,1,3,'x' - if {!$1} n. 0,255 v + return fi - {$1+1},{$1+1},{$1+1},1,'x' +f. 'y' +f. 'z' a[-3--1] c r. {w*h*d},1,1,3,-1 - f. 'R=i(x,0,0,0);G=i(x,0,0,1);B=i(x,0,0,2);if(min(R,G,B),-1,i)' - permute. cxyz discard. -1 r. 3,{h/3},1,1,-1 permute. yzcx - r.. {w*100}% r. ..,0,2 +[-2,-1] - f. 'R=i(x,0,0,0);G=i(x,0,0,1);B=i(x,0,0,2);if(max(R,G,B)>2^$3-1,-1,i)' - permute. cxyz discard. -1 r. 3,{h/3},1,1,-1 permute. yzcx - n. 0,255 - +srgb2lab. rv[-2,-1] a[-2,-1] y sort. +,x # Sort by increasing lightness. - if {!$2} rows. 1 - else # Add perceptual constraint if requested. +_palette2code : # Convert a set of input palettes + sort_list +,n + repeat $! l[$>] + r {whd},1,1,100%,-1 + img2base64 0,0 + e[] "_palette_"{n}" : " + b64=\"${}\" + l[] ('$b64') s x,-119 ('\\\\\n') a[0--3] .,x rm. a x b64={t} rm endl # No more than 120 char / lines + e[] " base642img \\\n"$b64"\n" + endl done + +# The color palettes below comes from the CImg library 'http://cimg.eu/'. +_palette_default : + 256,1,1,3,[16+32*int(x>>5),16+32*int((x>>2)&7),32+64*int(x&3)] - # Constraint 1 : keep colors close enough to equivalent 'pure' grays. - s. y rv[-2,-1] . sh. 1,2 f. 0 rm. -[-2,-1] norm. - <=. $2 *. 'x+1' discard. 0 -. 1 map. .. rm.. +_palette_hsv : + 256,1,1,3,[x*359/(w-1),1,1] hsv2rgb. round. - # Constraint 2 : remove neighboring colors that are above the JND. - repeat 10000 - +srgb2lab. +shift. 0,{1-2*($>%2)},0,0,1 -[-2,-1] norm. - <=. $2 - if {im} rm. break fi - *. 'y+1' discard. 0 -. 1 map. .. rm.. - done - transpose. +_palette_lines : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMjU2IDEgMSAzICM2MTcKeJwNkhGgu1AYxT8YDP4QDB4Eg+BKEATBYBAEQXDhQhAMHgweBBeuXB\ +gMgmAwCIIgCIJBEAQPguBKEASDwWDwYDD4/tGx75zf+Q4gAuhCPFVzM0CgvUXFmr0plIpkB2KwW4bppr16aMgRzge16wbwTbxW0L6Y0IxsjiFyZyQvAISoD\ +PFMYgWlnTUI/M4bsllO+I5M0GuoWm+LP6kImrtktjhu8sxjaJ9V6zwNDy0FijoRcloRzGvghbDTAiO+Z8/Hv9JoKRbRr79JjwXqpOfBGxRasEejCH2kHyhr\ +uCHk2jXJ5xkgGFdjPgp/4IZ4HDTk4LTjXrAED56dzkIskRGG8Gwh9FdqTh8bkMgp0+JG9tb+xXpLf58ugHG/GoPG6ZmnSGh+Bn1OyCkX23dUAjon753DhyT\ +JuhiCaxcy8acf79DuuwbQNo/NItIqXXWF491E8R0ECNOppKlesjlaK8wsIqpKwL3QJwnhCygGtbCWbgbvJ0W4GFMOSrgnpIQ9rZHDYMyVS261dE1U1B/hkU\ +InqiU/44MDQ/m4BMtHV9Wq5bgqjtJ6laFWKUDtOwsRFvaMLvSAZbHj+u9o/u0itAN5xHX85KSu4GblHN0BJgEHfPGtksZjK4JkzFY1AvkIMTEJBX7tO4HCF\ +6Hov85VvUXaEWosOIqirYUDkWW/OH7FGP18B9h0jjs49tyukEYSKYiZTjCmPnkxI7neAWkOOTxrs4A3blzFEhvJsgMXqmsicxgRGMFil7o5wS3HuIZmAGcc\ +g8wvlM8UfPWXpfJN5JTPj+YlnxB6QD6tvGmdD9oUxoBrWc3mf8h5fjM=" - fi - v + +_palette_flag : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMjU2IDEgMSAzICMyNAp4nPv/n4Hh/wjGDCMeD4JIGEAMAH3RPtA=" -#@cli replace_color : tolerance[%]>=0,smoothness[%]>=0,src1,src2,...,dest1,dest2,... -#@cli : Replace pixels from/to specified colors in selected images. -#@cli : $ image.jpg +replace_color 40,3,204,153,110,255,0,0 -replace_color : check "$1>=0 && $2>=0" - v - l[] (${3--1}) y c s c,2 col1={0,^} col2={1,^} rm endl v + - e[^-1] "Replace color ("$col1") by color ("$col2") in image$?, with tolerance $1 and smoothness $2." - v - repeat $! l[$>] - 1,1,1,100%,$col1 r[1] [0] - if $1 -[1] [0] norm[1] <=[1] $1 else ==[1] [0] l[1] s c & endl fi - b[1] $2 - 1,1,1,{0,s},$col2 r[2] [0] j[0] [2],0,0,0,0,1,[1] k[0] - endl done v + +_palette_cube : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMjMxIDEgMSAzICMzMzgKeJxj5BCQkFfXN7Nz8wuLS80trWnpmTJn8erNuw6dunTr0cuPP39/e/f83v\ +Xzxw/s2LBy4cyJnY1VRVnJ0cHezjYmOqqyoryszFxCUoqahhaOHgER8en55XVtfdPmLV27dc+RM1fuPH79+ffvL2+e3Ll69ui+beuWz5ve395QUZCRGBHo6\ +WhlpKUsLczNwsIjIqOsbWzt7BUUlZhZWNnYMWHGguXrt+87fu7avadvv/759enVo1uXTx/es2XNkjlTe1vryvLS4sL83e0tDDQUJQQ5Wdj4xGRVdU1tXX1C\ +YpKzi6ubuybNWrhy486DJy/cePD8/fd/DIQAE6eghKKGgYW9u39YXFpeWV1r79Q5S9Zs2XP49OVbj159+vWf9oCQN5kI+oIOgIVbWFpZy8jK0TMwIjGjoKK\ +hvX/6vOXrtu07evbqnSdvvvymQ0ABAC/raR8=" r. 256,1,1,3,3 round. -#@cli retinex : _value_offset>0,_colorspace={ hsi | hsv | lab | lrgb | rgb | ycbcr },0<=_min_cut<=100,0<=_max_cut<=100,_sigma_low>0,_sigma_mid>0,_sigma_high>0 -#@cli : Apply multi-scale retinex algorithm on selected images to improve color consistency. -#@cli : (as described in the page http://www.ipol.im/pub/art/2014/107/). -#@cli : Default values: 'offset=1', 'colorspace=hsv', 'min_cut=1', 'max_cut=1', 'sigma_low=15','sigma_mid=80' and 'sigma_high=250'. -retinex : check "${1=5}>0 && ${3=1}>=0 && $3<=100 && ${4=1}>=0 && $4<=100 && ${5=15}>0 && ${6=80}>0 && ${7=250}>0" skip "${2=hsv}" - e[^-1] "Apply Retinex color consistency algorithm on image$?, with value offset $1, colorspace '$2', cuts ($3,$4) and sigmas (${5-7})." - v - - if {;'$2'=='hsi'} mode=hsi_i - elif {;'$2'=='hsv'} mode=hsv_v - elif {;'$2'=='lab'} mode=lab_l - elif {;'$2'=='rgb'} mode=rgb - elif {;'$2'=='lrgb'} mode=lrgb - elif {;'$2'=='ycbcr'} mode=ycbcr_y - else v + error[0--2] "Command '$0': Invalid colorspace argument '$2'." - fi - ac "_retinex $1,${3--1}",$mode - v + +_palette_rainbow : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMjI1IDEgMSAzICM1NjcKeJxj5ublE+DnF5KQUVBWU9fS0tHV0dXVAVL6RiZm5haWFpaWVpZWVtbW1i\ +BsbWMDJq3BwMrK0sLMWF9LRYqLkYGRAQygFAYbG2DkVrH2iUjNq2zpnTp3+eadB09fvvXo+dvPP/7+//v375/fv37++PH9+7dvX799/fr1GwQAWV+/ACEUA\ +Bmf3796+uDW1XMnD+3dum75wpkTOhvK81Ii/Z3NDbSUxNhZuPkEhISFhMWl5RRV1LV09AyMjE1MLWwcnJxd3T29vH18/fz9AwIDg4JDQCA0DAjCI0BkRGRk\ +dExsQnJaZm5ReW1T54Tp85au3rBp8+ZNmzZt3Lhxw4YN69euXbd2zWpMABTfsHHTpq3bd+7ae+Dg4eMnTp+9cPnC2RNHDuzatnH10gWzJvW01JUXZCbHhvt\ +5OttbW5gYGepDgJ6enq6OjpaWpoa6mqqKorysnJy8goKCopKSopKigrycrLSkuIggHy+/kJCQAB8PFzOHiIyKnqm9R0BYbHJmXmlVY2tn38SpM2bPmTd/wc\ +JFi5csWbZ82dJly5avWLFiJRCsAoPVYGL1GqBDN27eugPoyqMnz1+/++gxMCRPH9mzdd3KhbOn9rU3VBZmxEcEByGD4BAwPzgoMDAgwM/P19vT093d1dnJ3\ +trK3NhIX0dDTVUJ5GCgi5VVVIFpSkdXT9/A0AAGQH7U1dXW1gJ5UA2E1NTUNdQ1NDTU1dXUVJQU5WQkxYT4efkFhIQE+Xm5mAHNkQH/" + r. 256,1,1,3,3 round. + +# The color palettes below have been converted from +# 'https://stackoverflow.com/questions/33273340/matlab-set-color-map-color-range'. +_palette_parula : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KNjQgMSAxIDMgIzIwMwp4nAHAAD//NTY2NDAoHAwDAwUJDhETFBQSEAwJBwYGBggLEBYdJS44Qk1ZZX\ +F7hpGbpK22v8fP2N/n7/b8//79+/j29fX2+C0zOT9FTVZeZGlucnZ6foKGio+UmZ2hpKeprK6xs7W3ubu8vb6/v7+/v76+vby8u7q5ubm7vsLHzNLX3OLp8\ +PiMmKWyvsvX3uHh4N7c2tjW1NPS0tHPzcrGwr65tK+ppJ6Yko2HgXx4dHBsaGVhXlpXU09LRj85NDAsKCMfGhUQJK9mpg==" r. 256,1,1,3,3 round. -_retinex : - - {im-$1} {[w,h,d,s]},1 - repeat 3 +b[0] {arg(1+$>,${4-6})} +/[0,-1] rm.. *[1,-1] done - rm[0] log c $2%,{100-$3}% n 0,255 +_palette_jet : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KNzYgMSAxIDMgIzEzMQp4nGNgwA24JFSN7H2i0ksa+2av3Hb4wr3XP/9jgt/vH145tnPN/ImtMH1MvN\ +Iapk7+sVnlLRPnrdl57PLDd7+xaPz55t7Fw9tWzulrKkmP8rU3UpXgYoTbPWXh+j0nrz35+BeLxm8vb587sHnZzO76wpRwLxt9JVF2PL5gYAAAc+1twA==" + r. 256,1,1,3,3 round. -#@cli rgb2bayer : _start_pattern=0,_color_grid=0 -#@cli : Transform selected color images to RGB-Bayer sampled images. -#@cli : Default values: 'start_pattern=0' and 'color_grid=0'. -#@cli : $ image.jpg +rgb2bayer 0 -rgb2bayer : skip ${1=0},${2=0} - e[^-1] "Transform image$? to a RGB-Bayer "${arg\ 1+!$2,color,monochrome}" grid, starting from pattern '$1'." - v - to_rgb repeat $! l[$>] - _rgb2bayer$1 r[1] [0],0,2 * if {!$2} s c + fi - endl done v + +_palette_hot : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMTI0IDEgMSAzICMxNDEKeJzjFRKXVdLQNTK3dXb3DY6IS87IK66oa+nsmzJz3pKV67fu2n/k1IWrt+\ +4/ff3+66//1AUMpABGdl5BcRlFdZBTndx9g0BOzS2urGvuADl18cr1W3buP3LyPMipr4BO/UdNu0kEjFxC0kpaRtbO3kHRydnFNS3dk2cvXr1lz5EzV+88e\ +fP1LwA796yq" r. 256,1,1,3,3 round. + +_palette_cool : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMzIgMSAxIDMgIzc4CnicY+ERkVHRMbFx8QmJSckpqWnpmTJnyZote46cuXLnyZsvf/58efPkzpUzR/\ +ZsWbNkzpSelpqSnJSYEB8XGxMdFRkRHpb/BAAAHuY/4Q==" r. 256,1,1,3,3 round. + +_palette_spring : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMjggMSAxIDMgIzcxCnic+/8fN2DhFVPQNLJ28Q1LyCyqbumdtmDlpt1Hzl578PLT79+fXj64dvbI7k\ +0rF0zrbakuykwI83WxNtJUEONlAQDKiDfN" r. 256,1,1,3,3 round. + +_palette_summer : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMjggMSAxIDMgIzcxCnicY+EVU9A0snbxDUvILKpu6Z22YOWm3UfOXnvw8tPvprbuCVNmzl20bPX6LT\ +v2Hjx26vyVm3cfPXv94cvPv2l4AACR+i4M" r. 256,1,1,3,3 round. + +_palette_autumn : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMjYgMSAxIDMgIzQyCnic+/8fF2Dhk1DSMXPwDI5NL6xu6ZuxaM22Aycv333+8TcDTgAAaHcm2w==" + r. 256,1,1,3,3 round. + +_palette_winter : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMzEgMSAxIDMgIzc5CnicY2DAC1h4RGRUdU1t3fzC4tLzyxs6JsxYuHLjzkOnLt16/Prz778/v358+/\ +Lpwzs3rlw4ffzw/t3bN69bvXzxvFnTJvV1tTUBACEGJp4=" r. 256,1,1,3,3 round. + +_palette_bone : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KOTkgMSAxIDMgIzI1Mgp4nGNkZuXg4uETFBaVkJKRU1BWVdfU0TMwNjG3tLZzcHJx9/T28w8KCY+Mjk\ +tISk3PzM4rKCwpq6iqbWhqaevs7p0wccq0GbPnzl+4ZNnKtRu3bN+9/9Cxk2cuXLl+696jpy/ffPj8/dc/RmKsCI2IiU9KzcjJLyqtqK5rbGnv6ps4Zfqsu\ +QsWAw3esHnbzr37Dx09cfrM+YtXrt24fef+w8fPnr968+7j56/ff/35x8TKwcMvJCopLa+koq6lZ2hibmXnCDTZNyA4PDI2ITktE2hwSVlldV1DU2t7Z3cf\ +2N2zwO5esXrtho1btu3YvXf/wSPHcFoBAJTokrQ=" r. 256,1,1,3,3 round. + +_palette_copper : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMTE1IDEgMSAzICMzMzkKeJxj4+TmExQWk5SWU1RW09TRNzKxsLK1d3b18PINCA6NiI5LSE7LyM4rKC\ +6rqK5rbGnv7O2fNGX6rLnzFy1dvmrthk1bd+zee+DQ0ROnz164fO3mnXsPnzx7+eb9xy/ff/359x87YGFl5+Dm5RMQFBYVk5CSlpVXVFZRU9fU1tEzMDIxN\ +be0trG1d3R2dfP08vH1DwwKCY2Iio6NT0hKTk3PyMrJKygsLi2rqKyurW9sam1r7+zu7eufOGXa9Jmz5sybv3DxkmUrVq1Zu37Dpi1bt+/avXffgUOHjx5j\ +YgZZysnFzcPLxy8oJCwiIiYuISklLSMrp6CopKyiqqauoakFdIG+gaGRsYmpmbmFpZWNrZ29g6OTs4ubu4ent4+vn39AYFBwaFh4RGRUdExsXHxCYnJKalp\ +6RmZWdm5uXn5BUXFJaVl5RWVVTW1dPQCk5ZAs" r. 256,1,1,3,3 round. + +_palette_pink : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMTIxIDEgMSAzICMzMDUKeJxT1DG1cfbwC46ISUzNzC0sraiub2rr7O6bOGX6zDnzFy5ZtnL1ug2bt2\ +7fuXvvgUOHDx85euz4iZOnTp85e+7c+QsXL12+cuXqtes3bt66ffvO3Xv37j94+PDR4ydPnj57/uLFy1evX799++79hw8fP33+8uXr12/ff/z49ev37z9//\ +/37zyoso6SurW9sZmVr7+Tq7uXjHxQSFh4ZHRuflJyanpGVnZtfWFRSWl5RWV1b39Ta0d0PddLiZSvXIJx05NiJU2fOXbh89fqNW3fu3X/0BGgzFS1uaGxq\ +aW1r7+zu6e2bMHHS5CnTps+YOWv2nHnzFy5avGTpsuUrVq5avWbtuvUbNm4COmn3vgOHj504fRbonhu3795/+OTZi1dv33/68u3Hrz//AH2168E=" + r. 256,1,1,3,3 round. + +_palette_vga : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMjU2IDEgMSAzICMxNzgKeJz7/+fn10/vXz9/8uDOjasXzpw4sv/IiTMXrt648+DJ89fvP339+ec/Bv\ +jx8dXj25dOHdi2ZsGU1tIEVwbCwDWhtHXKgjXbDpy6dPvxq48/MM2Q0zF3cPcLiYpPycgtLK2saSAMaipLC3MzUuKjQvzcHcx15IhwB4Yt/zH8v2vr+pWL5\ +07r72goz00KdTPEdDthQEYIYbgMw3c0CSEi/E9G7JIRQoT9T0YYEgYAJsphWQ==" + +# The color palettes below have been converted from 'https://matplotlib.org/cmocean/'. +_palette_algae : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KNTAgMSAxIDMgIzE2MQp4nAGWAGn/1M3Hwbq0raegmZKLhH11bWVcU0k+MygeFg8JBwYICg0PEhQVFx\ +gZGRkZGRkYFxYVExL38u7p5ODc19PPy8fEwLy4tbGtqqainpqWko2JhH96dnFtaGRfW1ZRTUlEQDw3My4qJczFvbavqKGak42GgHp0bmhjX1pXVFJRUFBPT\ +k1MS0lIRkRCPz07ODUyLywpJiMgHBkV1p88Lw==" r. 256,1,1,3,3 round. + +_palette_amp : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KNjEgMSAxIDMgIzE5NAp4nAG3AEj/8O3r6ejm5OLh397c29nY1tXU0tHPzszLycjGxMPBv728uri1s7\ +CtqqainpqVkIuFgHp0b2lkXlhTTkhDPurm4dzX0s3Iw765tLCrpqGcmJOOiYSAe3ZxbGdiXVhTTklDPTgyLSgjHhkWEhAODg0ODg4ODg4NDQwLCgnq5N7Y0\ +szGwLq0rqihnJWPiYN9eHJsZmBbVU9KRUA7NjIuKygmJCQkJCUmJicoKSkpKCcmJSMhHxwaGBUS64BWpQ==" r. 256,1,1,3,3 round. + +_palette_balance : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMTIxIDEgMSAzICMzNzQKeJwBawGU/hgaHB4gIiMlJigoKSkoJyQgGhMNCgoMERYcIictMzg+Q0lOVV\ +thaG51fIKJkJado6mwtrzDyc7V2+Dm7PDu7Oro5+Xj4t/e3dva2NfW1NLR0M7Ny8rIxsXDwcC+vLq4tbOwraqno56alZCLhYB6dG9pY15YU01IQj0dICImK\ +CsuMDM2OTs/QUVJTFFVW19kaGxxdHh8gISHi46SlZmcoKOmqqyvs7a5vL/CxcnMz9PW2t3h5ens6OPe2dTPysXAu7axraijnpmVkIuGgXx3cm1pY15ZVE9K\ +RD45My4oIx8aFhMQDw4NDg4ODg4ODQ0MCwoJREpRWF5lbHN7goqSmqGpsLa7vb69vby8u7u6urm5ubm5ubq6uru8vL2+v8HDxcbIys3P0dXX2t3f4ubp6+f\ +h2tXPyMK9trCqpJ6YkYuGf3l0bWhiXFZQS0ZBPDczLisoJiQkJCQlJSYnKCkpKSgnJiQiIR4cGhcVEqaTs4c=" r. 256,1,1,3,3 round. + +_palette_curl : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMTI0IDEgMSAzICMzODEKeJwTFROXkJCUkpKWlpaRARJSkuJiosJCggKCwmLSCup6Znbu/uHx6fnldW\ +29U2YtXLF+6+6DJ85duXn/6euP3/78+fn96+eP79++efXy+bOnjx89uH/3zu2b169duXT+7KkTRw/u271984Y1K5YsmDN9Ul9nS31VaUF2anxUqL+Xi72Vq\ +ZySmpaekZmVraOrp29gSERMQnJGTkFxeXV9U3tX38SpM2bPW7h0xaq1GzZv27F738Ejx0+dvXDl+q27D5+8ePPhy+d3r57cv3X1wumjB/ds37hm+UKgHb0d\ +TbUVxXmZKQnR4UF+Xq6OtlZmxvraGqpKCrJgn4kIg/wmwMfr4ubh7esfFBIWGR2bkJSSnpWTV1BUXFpeUVVdU1tXV9/Q2NTc2tbR1Tth8rRZcxcuXbVu846\ +9h0+cvQz2+cfXT+5eO3/i4O4ta5cvnD21v6u1obq8uCA3KyMtJTkpMSEhIT4+PgEG4uPjYqMjw0OD/L09nO2tzACwu7nF" r. 256,1,1,3,3 round. + +_palette_deep : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KNDkgMSAxIDMgIzE1OAp4nAGTAGz/+e7j2M7Dt6yhlYqAdm5mYVxYVVJPTUtKSEZEQ0FAPz49PT0+P0\ +BBQT8+Ozk2MzAsKfv38/Ds6OXh3dnV0czIw764s66po56Yk46Ig396dG9qZF5ZU05IQz46NjIvKycjHxvJw724s6+rqKWko6Kjo6Ojo6OjoqKhoJ+dnJuam\ +ZeWlZSTkY+Mh4B4b2ZeVU1FPTYvM2JJnA==" r. 256,1,1,3,3 round. + +_palette_delta : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMjU2IDEgMSAzICM3NzAKeJwTEBIWEROXkJSWkZWTV1BUUlZRVVUDAlVlJUV5OVlZGWlpKRCQlp\ +aWASmBqFFT19DU0tHVNzA0NjWzsLKxc3Bycff08Q8Ki4xNSMnIKSipqGlo6ejpnzx91rxFS1euWb952869Bw4fP3X2wuVrN+8+ePzs5Zv3n7/9/Pvv7+9fP\ +79/+/r508f37968fvXi2dPHjx7cu3PrxrUrl86fPX3i6OEDe3dt37Jx3arlSxbMnTVtcn9PR2tjXVV5cUFORmpibFRYkL+3u4uDraWZkb62hqqSvIykuIiQ\ +AB8vDzcXFzc3Dw8vH7+AINCbIqJiYuLiEhISkmAAZIiLi8srKCmrqqlramnr6ukbGBmbmJpbWFqDPeTm4e3rHxgcFhEVE5eQlJKWkZWTV1BUUlZRWV1b39j\ +c2t7Z3ds3YdKUaTNmzZk7f+HipctXrFqzdv3GTVu2bt+xc/eeffsPHjpy9NiJk6fPnLtw8fKVa9dv3r5z78Gjx0+fv3z99t2HT1++/fj15+f3L58+vH398t\ +mTR/fv3r55/eqlC+fOnDp5/Ojhgwf27dm9c8e2rZs3bVy/bu2aVStXLF+2ZPGihQvmzZ0ze+aM6dOmTp40sb+vt7urs72tpbmxoa62uqqirLS4sCAvJyszP\ +TU5MT4uJioiLCQowM/H29Pd1dnR3tba0tzUxMhAT0dLQ01F2d7JFRJvMQnJ6dl5RWVVtY2tnb0TgL6aOWv27Dlz5gLBvHnz5s+fv2DBgoULFy5atHjxkiVL\ +ly5dtmz58hUrVq5ctWr16jVr1q5dt27d+vUbNmzYuHHT5s1btm4DhsEuUCAcOHj4yNHjJ04BQ+H8xUtXrl6/cQsYDPcfPHz0+MnTp6ePH96/e9umdSuXLpw\ +zY0p/d3tTXVVpYW5GSkJ0eDAwYp3trS1MDHS11JUVZKUlRIUF+Hi4ONjZWIGAjZ2Dk5uHj18QlIIlpYCpE5J+gYkTmDq1tLV14EBbW1tLS1NDQ11NVQWYsB\ +Xk5WSkpSTERUWEAGwPYP8=" + +_palette_dense : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KNzQgMSAxIDMgIzIyNAp4nHt878alM8cO7N66YfXSBbOnT+rram9uqKmqKCstKQaBktLSsvLyioqKys\ +pKIFleDpIoLMjLyc5MS0mKj4kMC/L38XBxsDF//+bV8ycP792+ce3ShTMnjx3ev3fXts3r16xYsmDOjCkTejpaGmoqivOz05Pjo8NDAnw8XB3trMyNDfW0N\ +FSVFGSlJcXFRISFhQQF+Pnev3398sWzp0+ePH4EA48fP34CBo8fP3p4/+7tm9euXDh78tihfbu2bly7YvG8mVP6u1rqK0vyMpJjwwN93BxtzI30NFUBgy55\ +hg==" r. 256,1,1,3,3 round. + +_palette_diff : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMTQzIDEgMSAzICM0NDAKeJwBrQFS/gcJCw0ODxESFBYWGBseIiYqLjI2Oj5CRUlNUVRYXF9jZmtvcn\ +Z5fYCEiYyQk5ebn6Onq66yt7q/wsfLz9PX3N/k5+vu8fP19fX08e/s6ebi39zZ1dLOy8jEwr67uLWyr6yppqOgnZqYlZKPjIqHhIF+fHl2c3Bua2hkYF1ZV\ +lJPS0hFQT47NzQwLSomIyAdIyYpLC8zNTk7P0JFSEtNUFNVWFteYGNmaGtucHN2eXx+gYSHioyPkpWYm56hpKeqrbC0trq+wMTHy8/R1djc3+Pm6ezu8PHx\ +8O/s6ufj4NzZ1dLOy8fDwLy5trKvq6mlop+bmJWSj4yJhoOAfXp3dHFubGhmY2BeW1hWU1FOTEpHRUI/PTs4NTIwLSooJSJAQ0dKTlFUWFteYWRmaGpsbnB\ +yc3V4enx9gIKEhoiKjY+Rk5aYmpyfoaSnqauusLO2uLu+wcTGyszP0tXY29/i5efq7O7v8PDv7Onm4t3Z1dDLxsK9ubSvq6einZqVkY2IhIB8d3Nva2djX1\ +tXU09LR0RAOzg0MS0qJyQiISAeHRsbGRgWFRQSEA4ODAoIBjEs26k=" r. 256,1,1,3,3 round. + +_palette_gray : + 256,1,1,1,x r. 100%,1,1,3 + +_palette_haline : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KNDYgMSAxIDMgIzE0OQp4nAGKAHX/KiwuLSgiGxQPDAwPEhcbICUpLTA0Nzo8QEJGSU5TWF9mb3mEkJ\ +6sucXR2+bw+RgaHB8mMDlBSE9VW19laW5zeHyBhouQlZqfpKmus7i9wsbLztLV2Nrd4OPm6e1xfoyZoaKfnJiVkpCOjIuKiYmIiIiHh4aFhIOBfnt4dHBrZ\ +2JeW1xgZW12gIqU7TdADQ==" r. 256,1,1,3,3 round. + +_palette_ice : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMTA5IDEgMSAzICMzMzgKeJwBRwG4/gQGBwoMDhETFRgaHB4gIiQmKCorLS8wMjQ1Nzg5Ojs8PD0+Pj\ +4+Pj4+Pj4+Pj4+Pj4+Pz9AQUJDREVGSEpLTE9QUlRWWFpcXmFjZWhqbXBzdnl8f4OGio6Slpqfo6essLS5vsLGy8/T2Nzg5OkGCAkMDhASFBYYGRwdHyEjJ\ +CYoKSwtLzEzNDc4Ojw+QEJER0lLTlBSVVhaXWBiZWdqbW9ydXd6fX+ChIaJjI6Rk5WYmp2goqSnqayvsbS2uLu9v8LEx8rLzdDS1NfZ293f4eTm6evt8PL0\ +9/n7ExYaHSAkJyouMTU5PEBDR0pOUlZZXWFlaW1xdHh8gISIjI+Tlpmcn6KkpqiqrK6vsLKztLW2t7i5urq7vL2+v8DAwcLDxMXGx8jJysvMzc3P0NDS09P\ +V1tfY2dvc3t/h4+Xn6evt7/L09fj6/ETzn2w=" r. 256,1,1,3,3 round. + +_palette_matter : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KNjQgMSAxIDMgIzIwMwp4nAHAAD///fz8+/v6+vn4+Pf29fTz8vHw7+3s6ujn5eLg3drX1NDNycXAvL\ +ezrqmkn5qVkIqFgHt1cGplYFpVUEpFQDs2Mevl4NrUz8nEvrmzrqijnZiSjYiCfXdybGdiXVhTTkpGQj46NzMwLSsoJiQiIB8dHBsaGhkYGBcXFhYVFBMSE\ +Q+uqKOemJOPioWBfHh0cGxpZWJfXFpYVlRTUlJSU1NUVVdYWVtcXV5fYGFiYmNjY2NiYWBfXVxaV1VST0xJRkM/PV5d6A==" r. 256,1,1,3,3 round. + +_palette_oxy : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMjU2IDEgMSAzICM2NTYKeJyzd3RydnP39PL18w8MDg2LiIqJjUtMSknNyMzOyS8oKi4rr6iqqa\ +tvaG5pbevo7Oru6e0LDAgMDA4JCQ0Pj4iMigaqj09ISEpOTklLS8/IzMrOyc3LLygsKi4uLSsvr6yqrq6tq2tobGoCGgAzoX/CxEmTp0ydNn3mzFmz586bP\ +3/hosVLli5bvmLV6jVr163fsHHzlq3btu/YuXvP3n0HDh46dOToseMnT50+c+78hYuXr1y9duPmrdt3791/8Ojxk6fPX7x89ebt+w+fPn/5/u3L54/v3719\ +/frVq1cvIeAFEDx//vzZs2dPnz558uTx40ePHj18+ODB/fv37t29e+cOKxCwQQE7DED5rGDAwgJSws7Bxc3HLygkKibh6x8QGBQcEhoWHhERFR0dEwcMgMS\ +k5JTUtPT0zKys7Ny8vPxCYACUAgOgAhgANbV1DcAAaAGFIDAAenp7+4D+nwTy/wyg/+cAAwDo/8Vg/wMDAOT/TZu3QP2/dz8wAAj7/937T5+//vv75/fPH6\ +BQ+PTh3ZvXL58/ffLowb27d25ev3b10sXz586cOnni6JFDB/fv3bN7x/ZtWzdt3LAO4n92dg4OTk4uLi5ubh4eHl4g4AMCfhAAMYB8Hm5uLk5OTg4OdnZvs\ +P+DQ8LC4AkgPjEpKTk1FSUBFJWUlpVVVFZW1dTW1jc0NgJTUGt7R2cnSgIABsCcuXPnLYAmgJXAAAAlgE2bNoMSwK7de/bsAwbAYWAAnAAGwNlz585fvHT5\ +yrXrN27evnP3HigAngED4DUwAD58fJSRlpIYExUe4uft4epgZ2NlYWZqYmRooK+ro6OtqamhrqaqqqKspKSoIC8vJysrIyMlJSkJADQjlG8=" + +_palette_phase : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMTA2IDEgMSAzICMzMjkKeJwBPgHB/qissLO2uby/wsTHyczO0dPU1tjZ29zd3d7e3t7d3NvZ19XSz8\ +zJxcG9ubWxrKeinpiTjYeBe3VuaGFbVE1HQTs1MCsnIyEeHBkXFRMRDw0MCwsOEhgeJS01PkdQWWJqcXh/hIqPlJidoqZ2dHJwbmtoZWNhXVtYVVJPTElFQ\ +j47NzQwLSsoJiUlJicpLC8zNjo/Q0dLT1NXW19iZmltcHN2eXx+gYOGiIqLjY6PkJGSk5OUlZWWlpeXmJiZmZmampmZmZiXlpSSkI6MioiGhIF/fXp4DhIX\ +Gx4iJiouMjY6PkNHTFFXXGJobnV8g4qSmaGor7e+xMvQ1tvf4+fq7O/w8vPz9PPz8vHv7ero5eHd2dTPysbBu7axrKejnpqVkIyHgnx3cWtlXlhRSUI5Mio\ +jHRcTEA8ODQ0NDQ0NDPDwmdk=" r. 256,1,1,3,3 round. + +_palette_rain : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMTE1IDEgMSAzICMzNDIKeJx7++bVy2dPHz96eP/e3Tu3b928cf3q5Yvnz5w8dmjf7u2b169evmTBnB\ +lTJvZ2tjbWVpYU5makxEeHBfq4O9taGOtpqirIiIsI8nJxsLGyMDMzs7CwcXBy8woIiYhJSEnLyikoKCopq6ioqIIAkFZRVlZSUnzz6vnTRw/u3bl57cqlC\ +2dPnzh25NCBfXt37dyxfduWzZs2rl+3ds2qlSuWL12yeOGC+fPmzJ41Y/q0qZMnTZzQ19Pd1dHW0txYX1tdWVFaXJifm52ZnpqcGB8bFREWEhTg5+Pl7urs\ +aG9rbWluYmSgr6OloaaiKC8r/fHdq+ePH9y9efXimZNHDgA9tm7V0oVzZ06bPLG/p6sTZGZTQ31dbU1VZUV5aWlJcVFhQX5+Xl4uDORBAYidk5OTnZWVmZm\ +enpaanJSYEBcTHRkRGgy23RNovZMD0H4rSwDxo6Ac" r. 256,1,1,3,3 round. + +_palette_solar : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMzUgMSAxIDMgIzExNgp4nAFpAJb/N0BJUltkbXZ/h46VnKGnrLG1ur7BxcjMztHU1tja3N3f3+AVGB\ +odHyIlJysvNDpARk5VXGRrc3uDi5OcpK22v8jR2+Xu+RkcHyEjJCQkIiAeHBoYFhQTExITFBUXGh0gJCgsMDU6PkNIm9UqlA==" + r. 256,1,1,3,3 round. + +_palette_speed : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KNDkgMSAxIDMgIzE1OAp4nAGTAGz//fn28+/r5+Pf2tXOyMG5samgl46FfHJpYFZNQzoxKCAZEg4LCg\ +wOEBMVFxgZGRkYF/rz7efh29bQy8bCvbm1sq6rqKWinpuYlZKOi4eDf3t3c25pZWBbVlFMSEI9ODMvKSTIvbKnnJCFeW5jWE1COS8nHxgRDAcFBQgLDxQYG\ +x8iJScpKywsLCwrKiknJCIfGxgUF7w7kA==" r. 256,1,1,3,3 round. + +_palette_tarn : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMTA1IDEgMSAzICMzMjYKeJwBOwHE/hcaHiEjJyktMDU8Q0lQV11kanF4f4aNk5uiqbG4v8XKzc/S1N\ +bY2t3f4uPm6evu8PT2+vv8+/j08Ovn4tzWzsa+t6+ooJmSioR9dm5nX1dPRz84MSolIh8eHRwaGRcUExAOCwoICQsODyQoLTE1OT5CRklMT1JVWFpdYGNlZ\ +2psb3F0dnl7fYCEiY6Ump+lq7C2vMHHzdLY3uTq7/T39vPu6eTf2tXRzcrGwr66trOvq6ekoJyZlpKOi4eDf3t3cm5qZGFcV1NOSkVBPTgzLikkIA0ODw8Q\ +Dw8ODQwNEBETFhgbHR8hIyUnKisuMTQ3O0FIUlpia3N8hI2Vnqavt8DJ0dri6/H18uzj29HJwLewq6ikop+dm5mXlJKPjYuJh4WEgoF/fnx7enh2c3JvbWt\ +paGZkYmFfXVpVUfhNmgM=" r. 256,1,1,3,3 round. + +_palette_tempo : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMTEyIDEgMSAzICMzNDcKeJwBUAGv/v369/Tx7uvn5OHe29fU0c3Kx8PAvLm1sq+rp6OgnJiVkI2JhY\ +B9eHRwa2hjX1pVUUxIQz86NTEtKSUhHhsYFhMSEREQEBEREhMUFBUWFxcYGRkaGhsbGxscHBwcHBsbGxsbGhoaGRkZGBgXFxYWFRX08vDu7Oro5eTi4N7c2\ +tjW1dPRz87MysnHxcPCwL+9u7q4t7W0srGvrqyqqaempKKhn52cmpiWlZKQj42KiYeEgoB+fHp4dXNxb21raWZkYmBeXFpXVVNRT01LSEZFQ0A+PDo4NjQx\ +Ly4rKSclIiAe8+/s6eXi3tvY1dLOy8jFwr+9ure0sa+sqqelo6CenJqYlpSSkY+OjIuKiIeGhYSDg4KBgYGAgH9/fn5+fXx8e3t6eXh4d3Z1dHNycXBvbm1\ +samloZmVkY2FgX11cW1pYV1ZUU1JQT05MS0pIR0ZFRA7PoM4=" r. 256,1,1,3,3 round. + +_palette_thermal : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMTA3IDEgMSAzICMzMjUKeJxjYWFhZWVj5+Ti4RcUkZBRUNUyMLWyd/HwCQiJiI5PSsvMyS8qq6ypb2\ +rr7J0wefqseQuXrlizYfP2XfsOHj155vzla7fuPnj07MXrt+8/fv7y7fuPn79+/YaAX79+/vzx/dvXL58/fXz/7s2rF8qq6hpa2jp6+gaGRkbGYACkTMzML\ +aysbe0dnJxd3T28vH39/AODgkNCwyMio6JjY+MTEpOSU1LTMjKzcnLzC4pKyiqraxua2zp7JkyeNmveoqUr127cumPPgSMnzly4cuPOgycv3nz8+tPE0tbJ\ +3ScwPCYpI6+0urGjb8qM2fPmz58/b+6c2bNmzpg2dcrkSRMn9Pf39fb2dHd1drS3tbY0NzXU11RXlpcWFeRlZ6QmJcREhgUH+nl7uLk6Odrb2dqAgK2tHdS\ +lQIcGBoeGRwIArFub1Q==" r. 256,1,1,3,3 round. + +_palette_topo : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMjU2IDEgMSAzICM2OTEKeJxT19TS1tXTNzQyNjE1s7C0sraxtbWzt3dwcAQBBwcHe3s7OztbCA\ +Cy7MFyTk7Ozi6urm7u7h6enl7e3j6+fn7+AYFBwSGhYRGR0TFxCUkp6Zk5+UVllbWNrZ29E6fOmrd4+eoNW3bsPXj05LlL127de/Ts9fvP33/z8vELCAoJC\ +4uIiolLSEpKScvIysopKCqpqGvpGhibWVrbOTq7eXr7BQaHRUbHJSSnZWTnFRSXVVTXNTS3dXT3TZg8bebseQuXLF+5Zv2mrTt27zt46PDRY8dPnDx1+szZ\ +c+cvXLp85eq16zdu3rp95979Bw8fPX767PmLV6/fvHv/8dPnr99/SEmDrFNWUVMHB4SBobGJmbmllY2tvaOzq5uHt69/YHBoRBTYR2mZ2bn5hcWl5ZXVtfW\ +NTS1tHV09fRMmTZk2Y9ac+QsXL12+cvXa9Rs3b92+c/fe/QcPHz1+8tSZcxcuXr567cZNkPVg21+8fP3m7fsPQMu//fj5+4+qmoaWDjD8jYGhD7HVxc3DC2\ +htQCAwMMMjIqNiYuPiE5OSU1LTMzKzcnLz8guLikvKyisqq2tq6xoam5pb29o7urp7+vonTJw0ZSrIMfMWLFoCdcy2Hbv27AO5BeSUy1ev37pz78Hjp89fv\ +Xn/8fO3H7/+6ugZmphb2tg7uXp4+wWFRkTHJ6UCI664rLKmvqm1vbO7F2zupMmTp0yZOnXatGnTp8+YMXPmzFmzZs+eM2fu3Lnz5s2fv2DBgoULFwHBYgwA\ +FVyyZOmy5StWrlq9dt0GRAgdO3EKGPHAmAdHvZS0tLQMMPqBCQAM5MHxoqEJS59m5uagBGptYwNLiSjADgIcXDx8/IPDomITUzKywQmwoaW9u2/S1JlzFix\ +evmrdxq079xw4fPzUuUtXb9558AQAVgJv5Q==" + +_palette_turbid : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMTI2IDEgMSAzICMzNzAKeJx78fzpk8ePHj64f+/undu3bt64fu3qlcuXLl28cP7c2TOnT506cfzY0S\ +OHDx08sH/f3j27d+7Yvm3L5k0b1q9ds2rl8mVLFi2YN2fWzOlTJ0/s7+3p6mhraWqoq6mqKC0uzM/NzkxPTU6Ii4kMDw0O9Pf19nR3dXa0t7W2NDc1NtTX1\ +dZUV1X+8unD29cvnz15dP/u7RvXrlw6f/b0yWNHDh3Yu3vn9q2bNqxbvXI5xI4Z06ZMmtAHsaKxvra6sqKsBGRJTlZmelpKcmJCXGxMVGREWGhIcGCAv5+P\ +t5enh7uri5Ojg72djbWVpYW5qYmxkaG+nq6OlqaGuqqKsqKC/KrlSxbOmz1j6qT+3s72lsa6msryksL8nCyguxPjY6IiQkOCAvx8vb083N1cXZyBZgENs7O\ +1tbWxsbEGASsYsIQACyAwNzc3MzMzNTUxMQbaZ2hgoK8HtFNHW0sTaK2aqoqKshLQZjlZGWkAeF+paA==" + r. 256,1,1,3,3 round. + +# The color palettes below comes from the LoSpec palette list 'https://lospec.com/palette-list'. +_palette_aurora : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMjU2IDEgMSAzICM2ODYKeJxt0kFo01AYB/B3qYwwaDbCaEG6aS4T3ME4qJrgVpCiLUqolEgYbI\ +QirIce9kQLknXbZSplWaGMSaeUYWU0g21QD0XbFLaasimMQqmUOiyBHiyOemgZZfpMql7Ew/v43vtOv+//QN/5yze89x89eZ58++HzMQJjQJnXizmktH4gh\ +JSQN6SgbqO/bgHgfnfwejYwG88d1hqtdivEwSVZ1U60PQnSDiitv1Er31R5Cd5zWkmapTnok9ZrKXmRNdtI2ifJalbekDiONg/Stzj4UJIPNVmCHOOckWS5\ +gbRaWS3suqnhcSFRKaEWaqNyJRWfvCuEN3fqCBViK9DPDA/1EhghuoHpbH//GTDC+CNesQc3DZgBBSzktGuZzwZdAoMDspedWlzLpMvlkzqqZDJh3uegvPE\ +CQp3TemY1Av7xG9iuXz/zOaMjxkLGo/KnilvJeHQhMB18FkumCzVAO7xQkovqS8iN/PVralYSWRvL+fRRTv10cqylxGl9rG/qe1FNG2Cr4Q/o/opmrIOkxj\ +kOblbVdFwS+eEBzGIhhjwML2QSsQDvplhhLrpTKn1FzWphIzDqnFgp11EznwpfWd07avxEjXr5aI2/aHf5PP7gi1fb+XSAdzBncfwcjlMOIZLYfQ89Qxdww\ +kIAzGoFrD9+zYaPEv/zG0xWzx8ddP3GJhS9GPnrAeSeLkcXpyZnHojh2FYR0Yzhr8iQowdJmvPqMaqy5OWuU2Y7zeoRL0jrnf380qSTdHb9Ta2qqhIc0b+G\ +lNzXvw4yrr/zr7W0YjYdj9hJWx/AcBdGCZcYMwZMBAZ4gPG4y+G0mkyEqafXhGGQJ9g71FzEv5H4iFCzdDThEddW2pnqrk7oNFG7VclEb24fFg1S5xShLyi\ +ffewTnPaFoJJPh4NXb9t/Aejmgpc=" + +_palette_hocuspocus : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMjU2IDEgMSAzICM2MzQKeJxjk3x5buu8lopLu5f0lsV5mHk7WxlpKkrINhWlhnla6iotmtpakR\ +Ht7b5oUlNRUpCT+anN87qK4jzteqtz4/wdjVRfXNy1pK880UdUiJ+Xi52VyUJTXpSPg1ns57Vt08sjLGTeHp5bFW2vovrr3qFVfWVRLk9Ob53TmhMW8OT0p\ +tlNOUF2DASAqIiwkKAAPx8vDzcXFycH+9PrZw5uW71g+uJpnQ1lWQkRMGW/Hp3aNKspK1wUAjR/3Tu2blpdWsDzFy9fv3n3/uOHG4fXz2orjGfklTN0DEwq\ +bZ26bOfJm6/+MIg83t2fZq1amRUb6GiqIQu0go2NlUVgamtpWpibuUZ+Upifq6WBfn1xerSfk5n29LaytDB3c8OOyowoL0sdhRktxUlBrqYWx3fPbczwMZD\ +ePK0ywdtcWevjkRnFweYy3Dc29GT7mcrIf9ndGW+rxM0Mda/AgcWdBVHuRqpk+n9qX3NFYWZ8eKCosCAfDxcHO5Dm5+XmZP9258jKSeUJEcBwnt9ZHOt5cP\ +Oymf1NpSncvHwCgkIiouj+F5adluOmIchflwfyhqbslb3LJlQm+bismNJSkOBjo1eQHO4P9L/pjiVTmvPj/ewXT2goiPGxNN+zfEp9TpiLcU9lZoyPvZGqi\ +CAo+pkZfz29sHvZxJriO1vA/uZ+cnhZZ7afoQjMP0yioiIiIsLCwkJCQoKCggLK3z69evbo3q1rl86dOnZo365tm9YuWzRv1rRJfV1tTXVVZc115cX52enJ\ +8dHhwf7e7s6/P715/vDOtQtH9+3avnn9mhVPz+9cPLE61R/mf3h6gMY/AyMzCxs7hxyu+AcA2aYUlw==" + +_palette_srb2 : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMjU2IDEgMSAzICM0OTcKeJz7//398/vXzx/fv3398vnT+9vry/PT48P93e3N9dXlxfnZGcAS0/\ +ra6kpzU2NDfJz3b169eDZIXXZ8sLe9sfZ/GIAYdBrG/fz0xul9G5dMh8ufX9+f76/P///19cPrZ7cXw4Tf3z+/f/38/vr8eH97fXn+/5+f3z69f/NyqIWh5\ +QWZiVFB3s42prpqckD33Du+dmpNipcRAxT8/39///z6ePuXR+aWhzjqSV/dv2pqQ1Yo2Pkg+efH1vYUBxlKMKCB89vnt+eH26v/J+T/5QtmTOhsrCzKSooK\ +BjrDuLo4Pzs5PjzY390ZqEZb+fXj25eB2neDgmVyd3P9uzund66Y3gZ2vK+rrRmG/2/vnl0d7awNcbY8uru2L+6vzo72t9dTV5AU4mZl+P/hwYUDGxZMaCh\ +ICHAwUOD//+TE2knlUfZQb8vnQ/XB/P/x9eO7186f2D+3vzx+P1ABDv//h4c3If/3dzRUFILiwMvJ2lhbRdob6G9rc2N9bXVleWlxYf77l4/v3rx89uTm6u\ +Ls5Ohg/zs7p5eGmknCbXoP9TeMXxzurC8vzM5AwP8wvr+3m6ONuZGuhrKcpAg/F8uKKQ3ZES4Gsujx//nhud3Lm2NMYKENEgX5Hx78z89tndOSHeRvb64uz\ +8/+Hxb/ADJVV38=" + +_palette_uzebox : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMjU2IDEgMSAzICM1Mwp4nGNQ8ciduO3Wf4aRSkOBChR4QEEuFEyEgm1QcAsK/kPBcNFPLgilEK\ +yiEPynEAAA16V90A==" + +_palette_amiga7800 : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMjU2IDEgMSAzICM1MzMKeJxjEFQydglNK++YuWr3mbvv/v////3Z1SObF01syI/ztdGWMnQKTiltm7\ +5i56nbb/7+h4CfL64f27pkclNhgr+dfUBiUfOUpduO33j5Cyr9/93dM7tXzewoTwt1MZbVcwhMKm6Zumz7iZsvfwMlP9w/t3fN7K7KjHA3UxVhJgYGDkkta\ +5/YvPoJCzcdvvIUTRIM2MQ1LL2ic2r75m84eGD9vN6a7ChPC3UxVqg0g4CikXNIaln7jJW7Tj+8sH/d3J7qrEgPczVRFqAkn7yBY1BySeu05TtO3nr95///\ +b0+vHN60cEJ9XqyPtZYkA5r/v399cvnQxgX9dbkx3laaEuwoll96/AVFMwfYen4FpEC6cXzb0inNRYkB9nqyPJjOu4MUdLoy3EBZLmkdW7/4gsZJi7ccvfb\ +8x/8fz68d3bJ4UmNBvJ+tjjSXlLaNb1x+w8RFm49cffYdHLwoIahu4RmVXdM7b/2Bi48+Q4L//b2ze1bP6qxID3M1UUZ1PVAW3X9o/p/eDIl3TgZkAHVk65\ +xNt46sm9FcnBTooC/HC5Jh5peGu/DEvfdfPr97+QRug4+jaUxGCSTyX71+/eb1+y8/voPBJ0g81RZm1EDi/dt/ZAB1ZGWyr5pNUAay9/5+fApPnhZKAtw8g\ +mLS8BDcvP/04undVZkR7maqIsJAIMDFzgEGvHL6oHTY1DetCdV/ADmMewY=" + +_palette_amiga7800mess : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMjU2IDEgMSAzICM3MTQKeJxj1LONLG9ZsP3sjbsPXn349v//PyAEgxu7Z5aHOLoXLdh84smf/2jg7+\ +fnV/ZvmFsV712/+cT9t7//QDVBNP9+/+T6qd2rpjame3nGpFZNmrts454j567euvfw2dkDG+bPmNBQmBrl76LKycbKo2DmFp6YW905ce7yTbsPX75weP3sy\ +b0FYb6exrKycrKyTEyMTEDMKG2XWtY1e+PxCye2LWqrLQ7yM9eQ5GdhYBCTUdbQs3IPjC1s7Z2+dMfOTy9unzu0Y/W87sqcBA9XSx03n9DcCWsOXbz//N33\ +vyD3AcGfn28fXti/dXVvYYQjI7r////88uzGhaOrJzZk+JtrKEjKqVoGZjX1zFx35Oixa0+e37p4aNOSGV2VeUl+ZvraKvLiUrKKqjZBCQX1E+at2nni1I7\ +1S+f21hWlR/na6kowMzIys/ApW7v6R6XmljVPmLNq2+XT+zatWjCpuTQjysfWQE2OQ8bQKTg2s7y1d8aS9TsOXnz78sn9OzeObVs5q60wxtNC0ye2oGXm6j\ +3n7zx8/urth88gB/5/8/jm2V1LJteXZod4OASnVfTMWLp+9/nHr7+CJP+8f3jtzP5N83vrC8OCXEyt7N0iynoWbth37OytZ59+/rxy+tjB7WsXTG4tTwm0U\ +pWXQvf/mpkVYYG+NsCwF5cQYGNkYBGUU1RSkFfVtQiJzO1YtPrikc3zumszQ73ttVX4BXj5WHjFJWUsQxOT6/rnr9137t6bVy+ePbp17jDQA50lCd7muR0T\ +l+07eenuiw8/QYGPlITe3rt6amlzZe/izUfO33rx/R807YAiCMh6c/P88TWTy2Oi8lvmbDt19ws0Xf6Dxb+vuTo4/hkYGBkZeCSV9Z3D4zOnTZ++ujInJNj\ +TRl+GixEkycDJxcnJwa2gb+vqm1q75OiVGc2FCTGRfi5WBurywhyszABUd6ys" + +_palette_fornaxvoid1 : + base642img \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMjU2IDEgMSAzICM1MjkKeJyrKi3ISU+OiwwN8HF3srM01Te3d/MLi03NLalp6Z48exEDO6+IlIK6ro\ +mVg7tvSFTChwcXDmxYMKGhICHAwUBBgOH/p2e3zh3aunLuxNaKnIQQj8/Pb184snPtwmld9cXpMQGu/6HgwYEFDQlAHTeObJjbWZrkZ6UuzAAC/9/dPbN71\ +cyO8rRQF2MlQQYGVk5eITEpOWV1bX0TCxsHRkYGFIChXkBez9YnOquqc8bybUevPP7/6enNM0AXNoDcp6EgsGzT3hOX77388v/Wtom5HioMjy8f2bpsekdl\ +ZpS3ja4cP4Oqlr6xhY2jm5d/cERsYlrWvWvnju3btm7ZvGl9bXVleWlnDu/auGLB9L7WmpLspMgAjw8vH925eu7EwV1b1i5bMHNSD7r/+zqaasoKslLiIoJ\ +83BysTG8cWjMN6HG4+9H9r62hpqKkICcjKS4qLMjPy43u//8fHl46vGXptI7KrGgfWz2FBXNnz5w+dfLEvp6ujraWpgYGTiFpFV0ze4/AqOSc0rq2A2tmth\ +UnGDDgAuj+/48GXn/6icI/c+Hy9Vt3Hz558frdp68///zH8D+RABb//79/ePHw5qVTh3dvWTuxLNrh/7d3T+9eOXN496ZVC2dO6GhgEFQydglNK++YuWr3m\ +bvv/qP7n6B6KHhx4QA4Cfy/v39+fby9PAOXsIyqnjlGeAIAmOWLbw==" + +# Command that tries to compress a smooth-enough palette. +compress_palette : + N={w} + do + N-=1 + +r. $N,1,1,3,2 round. + r. ..,3 round. + deltaE. .. + dEavg,dEmax={[ia,iM]} rm. + e[] "N = "$N", dEavg = "$dEavg", dEmax = "$dEmax + while $dEavg<0.75" && "$dEmax<1.25 + N+=1 + r $N,1,1,3,2 round. + e[] "" + img2base64 0,0 rm + str=\"${}\" + ('$str') s. x,-119 ('\\\n') if $!>2 a[0--3] .,x fi rm. + i[0] ('" base642img \\\n"') + ('"\n r. 256,1,1,3,3 round.\n"') + a x + ot pal.txt + +#@cli pseudogray : _max_increment>=0,_JND_threshold>=0,_bits_depth>0 +#@cli : Generate pseudogray colormap with specified increment and perceptual threshold. +#@cli : If 'JND_threshold' is 0, no perceptual constraints are applied. +#@cli : Default values: 'max_increment=5', 'JND_threshold=2.3' and 'bits_depth=8'. +#@cli : $ pseudogray 5 +pseudogray : check "isint(${1=5}) && $1>=0 && ${2=2.3}>=0 && isint(${3=8}) && $3>0" + e[^-1] "Generate pseudogray colormap with increment $1, JND threshold $2 and $3 bits depth." + + # Generate all possible sRGB colors with given increments. + {round(2^$3)},1,1,3,'x' + if !$1 n. 0,255 return fi + {$1+1},{$1+1},{$1+1},1,'x' +f. 'y' +f. 'z' a[-3--1] c r. {w*h*d},1,1,3,-1 + f. 'R=i(x,0,0,0);G=i(x,0,0,1);B=i(x,0,0,2);if(min(R,G,B),-1,i)' + permute. cxyz discard. -1 r. 3,{h/3},1,1,-1 permute. yzcx + r.. {w*100}% r. ..,0,2 +[-2,-1] + f. 'R=i(x,0,0,0);G=i(x,0,0,1);B=i(x,0,0,2);if(max(R,G,B)>2^$3-1,-1,i)' + permute. cxyz discard. -1 r. 3,{h/3},1,1,-1 permute. yzcx + n. 0,255 + +srgb2lab. rv[-2,-1] a[-2,-1] y sort. +,x # Sort by increasing lightness. + if !$2 rows. 1 + else # Add perceptual constraint if requested. + + # Constraint 1 : keep colors close enough to equivalent 'pure' grays. + s. y rv[-2,-1] . sh. 1,2 f. 0 rm. -[-2,-1] norm. + <=. $2 *. 'x+1' discard. 0 -. 1 map. .. rm.. + + # Constraint 2 : remove neighboring colors that are above the JND. + repeat 10000 + +srgb2lab. +shift. 0,{1-2*($>%2)},0,0,1 -[-2,-1] norm. + <=. $2 + if im rm. break fi + *. 'y+1' discard. 0 -. 1 map. .. rm.. + done + transpose. + + fi + +#@cli replace_color : tolerance[%]>=0,smoothness[%]>=0,src1,src2,...,dest1,dest2,... +#@cli : Replace pixels from/to specified colors in selected images. +#@cli : $ image.jpg +replace_color 40,3,204,153,110,255,0,0 +replace_color : check "$1>=0 && $2>=0" + l[] (${3--1}) y c s c,2 col1={0,^} col2={1,^} rm endl + e[^-1] "Replace color ("$col1") by color ("$col2") in image$?, with tolerance $1 and smoothness $2." + repeat $! l[$>] + 1,1,1,100%,$col1 r[1] [0] + if $1 -[1] [0] norm[1] <=[1] $1 else ==[1] [0] l[1] s c & endl fi + b[1] $2 + 1,1,1,{0,s},$col2 r[2] [0] j[0] [2],0,0,0,0,1,[1] k[0] + endl done + +#@cli retinex : _value_offset>0,_colorspace={ hsi | hsv | lab | lrgb | rgb | ycbcr },\ +# 0<=_min_cut<=100,0<=_max_cut<=100,_sigma_low>0,_sigma_mid>0,_sigma_high>0 +#@cli : Apply multi-scale retinex algorithm on selected images to improve color consistency. +#@cli : (as described in the page http://www.ipol.im/pub/art/2014/107/). +#@cli : Default values: 'offset=1', 'colorspace=hsv', 'min_cut=1', 'max_cut=1', 'sigma_low=15','sigma_mid=80' \ +# and 'sigma_high=250'. +retinex : check "${1=5}>0 && ${3=1}>=0 && $3<=100 && ${4=1}>=0 && $4<=100 && ${5=15}>0 && ${6=80}>0 && ${7=250}>0" + skip "${2=hsv}" + e[^-1] "Apply Retinex color consistency algorithm on image$?, with value offset $1, colorspace '$2', cuts ($3,$4) + and sigmas (${5-7})." + if '$2'=='hsi' mode=hsi_i + elif '$2'=='hsv' mode=hsv_v + elif '$2'=='lab' mode=lab_l + elif '$2'=='rgb' mode=rgb + elif '$2'=='lrgb' mode=lrgb + elif '$2'=='ycbcr' mode=ycbcr_y + else error[0--2] "Command '$0': Invalid colorspace argument '$2'." + fi + ac "_retinex $1,${3--1}",$mode + +_retinex : + - {im-$1} {[w,h,d,s]},1 + repeat 3 +b[0] {arg(1+$>,${4-6})} +/[0,-1] rm.. *[1,-1] done + rm[0] log c $2%,{100-$3}% n 0,255 + +#@cli rgb2bayer : _start_pattern=0,_color_grid=0 +#@cli : Transform selected color images to RGB-Bayer sampled images. +#@cli : Default values: 'start_pattern=0' and 'color_grid=0'. +#@cli : $ image.jpg +rgb2bayer 0 +rgb2bayer : skip ${1=0},${2=0} + e[^-1] "Transform image$? to a RGB-Bayer "${arg\ 1+!$2,color,monochrome}" grid, starting from pattern '$1'." + to_rgb repeat $! l[$>] + _rgb2bayer$1 r[1] [0],0,2 * if !$2 s c + fi + endl done _rgb2bayer0 : (1,0;0,0^0,1;1,0^0,0;0,1) _rgb2bayer1 : (0,0;0,1^0,1;1,0^1,0;0,0) @@ -7265,7 +10392,7 @@ #@cli : $ image.jpg rgb2cmy split c rgb2cmy : e[^-1] "Convert color representation of image$? from RGB to CMY." - v - to_rgb * -1 + 255 c 0,255 v + + to_rgb * -1 + 255 c 0,255 #@cli rgb2cmyk #@cli : Convert color representation of selected images from RGB to CMYK. @@ -7273,48 +10400,45 @@ #@cli : $ image.jpg rgb2cmyk split c fill[3] 0 append c cmyk2rgb rgb2cmyk : e[^-1] "Convert color representation of image$? from RGB to CMYK." - v - rgb2cmy repeat $! l[$>] + rgb2cmy repeat $! l[$>] s c +min -[0-2] . +/. 255 -. 1 *. -1 +==. 0 +[-2,-1] /[0-2] . rm. a c - endl done v + + endl done #@cli rgb2hcy #@cli : Convert color representation of selected images from RGB to HCY. #@cli : $ image.jpg rgb2hcy split c rgb2hcy : e[^-1] "Convert color representation of image$? from RGB to HCY." - v - to_color f " + to_color f " M = max(R,G,B); C = M - min(R,G,B); H = 60*(C==0?0:M==R?((G-B)/C)%6:M==G?(B-R)/C+2:(R-G)/C+4); Y = 0.299*R + 0.587*G + 0.114*B; [ H,C/255,Y/255 ]" - v + #@cli rgb2hsi #@cli : Convert color representation of selected images from RGB to HSI. #@cli : $ image.jpg rgb2hsi split c rgb2hsi : e[^-1] "Convert color representation of image$? from RGB to HSI." - v - to_color + to_color f " m = min(R,G,B); M = max(R,G,B); C = M - m; sum = R + G + B; - H = 60*(C==0?0:M==R?((G-B)/C)%6:M==G?(B-R)/C+2:(R-G)/C+4); + H = 60*(C==0?0:M==R?((G - B)/C)%6:M==G?(B - R)/C + 2:(R - G)/C + 4); S = sum<=0?0:1 - 3*m/sum; I = sum/(3*255); - [ cut(H,0,360), cut(S,0,1), cut(I,0,1) ]; - " - v + + [ H, S, I ]" #@cli rgb2hsi8 #@cli : Convert color representation of selected images from RGB to HSI8. #@cli : $ image.jpg rgb2hsi8 split c rgb2hsi8 : e[^-1] "Convert color representation of image$? from RGB to HSI8." - v - rgb2hsi _rgb2hsx8 v + + rgb2hsi _rgb2hsx8 #@cli rgb2hsl #@cli : Convert color representation of selected images from RGB to HSL. @@ -7322,24 +10446,22 @@ #@cli : $ image.jpg rgb2hsl +split c add[-3] 100 mod[-3] 360 append[-3--1] c hsl2rgb rgb2hsl : e[^-1] "Convert color representation of image$? from RGB to HSL." - v - to_color + to_color f " m = min(R,G,B); M = max(R,G,B); C = M - m; - H = 60*(C==0?0:M==R?((G-B)/C)%6:M==G?(B-R)/C+2:(R-G)/C+4); + H = 60*(C==0?0:M==R?((G - B)/C)%6:M==G?(B - R)/C + 2:(R - G)/C + 4); L = 0.5*(m + M)/255; - S = L>=1 || L<=0?0:C/(1-abs(2*L-1))/255; - [ cut(H,0,360), cut(S,0,1), cut(L,0,1) ]; - " - v + + S = L==1 || L==0?0:C/(1 - abs(2*L - 1))/255; + [ H, S, L ]" #@cli rgb2hsl8 #@cli : Convert color representation of selected images from RGB to HSL8. #@cli : $ image.jpg rgb2hsl8 split c rgb2hsl8 : e[^-1] "Convert color representation of image$? from RGB to HSL8." - v - rgb2hsl _rgb2hsx8 v + + rgb2hsl _rgb2hsx8 #@cli rgb2hsv #@cli : Convert color representation of selected images from RGB to HSV. @@ -7347,22 +10469,20 @@ #@cli : $ image.jpg rgb2hsv +split c add[-2] 0.3 cut[-2] 0,1 append[-3--1] c hsv2rgb rgb2hsv : e[^-1] "Convert color representation of image$? from RGB to HSV." - v - to_color + to_color f " M = max(R,G,B); C = M - min(R,G,B); - H = 60*(C==0?0:M==R?((G-B)/C)%6:M==G?(B-R)/C+2:(R-G)/C+4); + H = 60*(C==0?0:M==R?((G - B)/C)%6:M==G?(B - R)/C + 2:(R - G)/C + 4); S = M<=0?0:C/M; - [ cut(H,0,360), cut(S,0,1), cut(M/255,0,1) ]; - " - v + + [ H, S, M/255 ]" #@cli rgb2hsv8 #@cli : Convert color representation of selected images from RGB to HSV8. #@cli : $ image.jpg rgb2hsv8 split c rgb2hsv8 : e[^-1] "Convert color representation of image$? from RGB to HSV8." - v - rgb2hsv _rgb2hsx8 v + + rgb2hsv _rgb2hsx8 _rgb2hsx8 : repeat $! @@ -7370,86 +10490,129 @@ sh[$>] 1,2 *. 255 rm. done -#@cli rgb2lab : illuminant={ 0=D50 | 1=D65 } : (no arg) +#@cli rgb2int +#@cli : Convert color representation of selected images from RGB to INT24 scalars. +#@cli : $ image.jpg rgb2int +rgb2int : + e[^-1] "Convert color representation of image$? from RGB to INT24 scalars." + to_rgb round repeat $! l[$>] + s c <<[0] 16 <<[1] 8 + + endl done + +#@cli rgb2jzazbz : illuminant={ 0=D50 | 1=D65 | 2=E } : (no arg) +#@cli : Convert color representation of selected images from RGB to Jzazbz. +#@cli : Default value: 'illuminant=2'. +rgb2jzazbz : skip "${1=,}" + l[] if isnum("$1") illu={"$1>1?2:$1>0?1:0"} else if ["'$1'"]!=',' noarg fi illu=2 fi onfail noarg illu=2 endl + e[^-1] "Convert color representation of image$? from RGB to Jzazbz, using the "${arg\ 1+$illu,D50,D65,E}" illuminant." + rgb2xyz $illu xyz2jzazbz + +#@cli rgb2lab : illuminant={ 0=D50 | 1=D65 | 2=E } : (no arg) #@cli : Convert color representation of selected images from RGB to Lab. -#@cli : Default value: 'illuminant=1'. +#@cli : Default value: 'illuminant=2'. rgb2lab : skip "${1=,}" - v - l[] if {isval("$1")} illu={"$1?1:0"} else if {["'$1'"]!=','} noarg fi illu=1 fi onfail noarg illu=1 endl v + - e[^-1] "Convert color representation of image$? from RGB to Lab, using the D"{arg(1+$illu,50,65)}" illuminant." - v - rgb2xyz $illu xyz2lab $illu v + + l[] if isnum("$1") illu={"$1>1?2:$1>0?1:0"} else if ["'$1'"]!=',' noarg fi illu=2 fi onfail noarg illu=2 endl + e[^-1] "Convert color representation of image$? from RGB to Lab, using the "${arg\ 1+$illu,D50,D65,E}" illuminant." + rgb2xyz $illu xyz2lab $illu -#@cli rgb2lab8 : illuminant={ 0=D50 | 1=D65 } : (no arg) +#@cli rgb2lab8 : illuminant={ 0=D50 | 1=D65 | 2=E } : (no arg) #@cli : Convert color representation of selected images from RGB to Lab8. -#@cli : Default value: 'illuminant=1'. +#@cli : Default value: 'illuminant=2'. #@cli : $ image.jpg rgb2lab8 split c rgb2lab8 : skip "${1=,}" - v - l[] if {isval("$1")} illu={"$1?1:0"} else if {["'$1'"]!=','} noarg fi illu=1 fi onfail noarg illu=1 endl v + - e[^-1] "Convert color representation of image$? from RGB to Lab8, using the D"{arg(1+$illu,50,65)}" illuminant." - v - rgb2lab $illu repeat $! + l[] if isnum("$1") illu={"$1>1?2:$1>0?1:0"} else if ["'$1'"]!=',' noarg fi illu=2 fi onfail noarg illu=2 endl + e[^-1] "Convert color representation of image$? from RGB to Lab8, using the "${arg\ 1+$illu,D50,D65,E}" illuminant." + rgb2lab $illu repeat $! sh[$>] 0 *. 2.55 rm. sh[$>] 1 +. 100 *. 1.275 rm. sh[$>] 2 +. 110 *. 1.15909 rm. - done v + + done -#@cli rgb2lch : illuminant={ 0=D50 | 1=D65 } : (no arg) +#@cli rgb2lch : illuminant={ 0=D50 | 1=D65 | 2=E } : (no arg) #@cli : Convert color representation of selected images from RGB to Lch. -#@cli : Default value: 'illuminant=1'. +#@cli : Default value: 'illuminant=2'. #@cli : $ image.jpg rgb2lch split c rgb2lch : skip "${1=,}" - v - l[] if {isval("$1")} illu={"$1?1:0"} else if {["'$1'"]!=','} noarg fi illu=1 fi onfail noarg illu=1 endl v + - e[^-1] "Convert color representation of image$? from RGB to Lch, using the D"{arg(1+$illu,50,65)}" illuminant." - v - rgb2lab $illu lab2lch v + + l[] if isnum("$1") illu={"$1>1?2:$1>0?1:0"} else if ["'$1'"]!=',' noarg fi illu=2 fi onfail noarg illu=2 endl + e[^-1] "Convert color representation of image$? from RGB to Lch, using the "${arg\ 1+$illu,D50,D65,E}" illuminant." + rgb2lab $illu lab2lch -#@cli rgb2lch8 : illuminant={ 0=D50 | 1=D65 } : (no arg) +#@cli rgb2lch8 : illuminant={ 0=D50 | 1=D65 | 2=E } : (no arg) #@cli : Convert color representation of selected images from RGB to Lch8. -#@cli : Default value: 'illuminant=1'. +#@cli : Default value: 'illuminant=2'. #@cli : $ image.jpg rgb2lch8 split c rgb2lch8 : skip "${1=,}" - v - l[] if {isval("$1")} illu={"$1?1:0"} else if {["'$1'"]!=','} noarg fi illu=1 fi onfail noarg illu=1 endl v + - e[^-1] "Convert color representation of image$? from RGB to Lch8, using the D"{arg(1+$illu,50,65)}" illuminant." - v - rgb2lch $illu repeat $! + l[] if isnum("$1") illu={"$1>1?2:$1>0?1:0"} else if ["'$1'"]!=',' noarg fi illu=2 fi onfail noarg illu=2 endl + e[^-1] "Convert color representation of image$? from RGB to Lch8, using the "${arg\ 1+$illu,D50,D65,E}" illuminant." + rgb2lch $illu repeat $! sh[$>] 0 *. 2.55 rm. sh[$>] 1 *. 1.88889 rm. sh[$>] 2 +. 3.14159 *. 40.5845 rm. - done v + + done #@cli rgb2luv #@cli : Convert color representation of selected images from RGB to LUV. #@cli : $ image.jpg rgb2luv split c rgb2luv : e[^-1] "Convert color representation of image$? from RGB to LUV." - v - repeat $! l[$>] + repeat $! l[$>] +rgb2xyz rgb2lab.. channels.. 0 s. c *. 3 +*.. 15 +[-2,-1] +. ... +. 1e-8 # Z <- X+15Y+3Z *... 4 *.. 9 /[-3,-2] . rm. -.. 0.2009 -. 0.4610 +*... 13 *... . *[-2,-1] a c - endl done v + + endl done -#@cli rgb2int -#@cli : Convert color representation of selected images from RGB to INT24 scalars. -#@cli : $ image.jpg rgb2int -rgb2int : - e[^-1] "Convert color representation of image$? from RGB to INT24 scalars." - v - to_rgb round repeat $! l[$>] - s c <<[0] 16 <<[1] 8 + - endl done v + +#@cli rgb2ryb +#@cli : Convert color representation of selected images from RGB to RYB. +#@cli : $ image.jpg rgb2ryb split c +rgb2ryb : + e[^-1] "Convert color representation of image$? from RGB to RYB." + to_color + f "red = R; + green = G; + blue = B; + white = min(red,green,blue); + red-=white; + green-=white; + blue-=white; + maxgreen = max(red,green,blue); + yellow = min(red,green); + red-=yellow; + green-=yellow; + blue>0 && green>0?(blue/=2; green/=2); + yellow+=green; + blue+=green; + maxyellow = max(red,yellow,blue); + maxyellow>0?( + N = maxgreen/maxyellow; + red*=N; + yellow*=N; + blue*=N; + ); + red+=white; + yellow+=white; + blue+=white; + [ red,yellow,blue ]" #@cli rgb2srgb #@cli : Convert color representation of selected images from linear RGB to sRGB. rgb2srgb : e[^-1] "Convert color representation of image$? from linear RGB to sRGB." - v - f "val = i/255; sval = val<=0.0031308?val*12.92:1.055*val^0.416667 - 0.055; cut(255*sval,0,255)" v + + f "val = i/255; sval = val<=0.0031308?val*12.92:1.055*val^0.416667 - 0.055; cut(255*sval,0,255)" -#@cli rgb2xyz : illuminant={ 0=D50 | 1=D65 } : (no arg) +#@cli rgb2xyz : illuminant={ 0=D50 | 1=D65 | 2=E } : (no arg) #@cli : Convert color representation of selected images from RGB to XYZ. -#@cli : Default value: 'illuminant=1'. +#@cli : Default value: 'illuminant=2'. #@cli : $ image.jpg rgb2xyz split c rgb2xyz : skip "${1=,}" - v - l[] if {isval("$1")} illu={"$1?1:0"} else if {["'$1'"]!=','} noarg fi illu=1 fi onfail noarg illu=1 endl v + - e[^-1] "Convert color representation of image$? from RGB to XYZ, using the D"{arg(1+$illu,50,65)}" illuminant." - v - - if $illu # D65 + l[] if isnum("$1") illu={"$1>1?2:$1>0?1:0"} else if ["'$1'"]!=',' noarg fi illu=2 fi onfail noarg illu=2 endl + e[^-1] "Convert color representation of image$? from RGB to XYZ, using the "${arg\ 1+$illu,D50,D65,E}" illuminant." + if $illu==2 # E + mix_rgb {[0.488718,0.3106803,0.2006017,\ + 0.1762044,0.8129847,0.0108109,\ + 0,0.0102048,0.9897952]/255} + elif $illu==1 # D65 mix_rgb {[0.4124564,0.3575761,0.1804375,\ 0.2126729,0.7151522,0.0721750,\ 0.0193339,0.1191920,0.9503041]/255} @@ -7458,86 +10621,112 @@ 0.22248840,0.71690369,0.06060791,\ 0.01391602,0.09706116,0.71392822]/255} fi - v + -#@cli rgb2xyz8 : illuminant={ 0=D50 | 1=D65 } : (no arg) +#@cli rgb2xyz8 : illuminant={ 0=D50 | 1=D65 | 2=E } : (no arg) #@cli : Convert color representation of selected images from RGB to XYZ8. -#@cli : Default value: 'illuminant=1'. +#@cli : Default value: 'illuminant=2'. #@cli : $ image.jpg rgb2xyz8 split c rgb2xyz8 : skip "${1=,}" - v - l[] if {isval("$1")} illu={"$1?1:0"} else if {["'$1'"]!=','} noarg fi illu=1 fi onfail noarg illu=1 endl v + - e[^-1] "Convert color representation of image$? from RGB to XYZ8, using the D"{arg(1+$illu,50,65)}" illuminant." - v - rgb2xyz $illu repeat $! + l[] if isnum("$1") illu={"$1>1?2:$1>0?1:0"} else if ["'$1'"]!=',' noarg fi illu=2 fi onfail noarg illu=2 endl + e[^-1] "Convert color representation of image$? from RGB to XYZ8, using the "${arg\ 1+$illu,D50,D65,E}" illuminant." + rgb2xyz $illu repeat $! sh[$>] 0 *. 255 rm. sh[$>] 1 *. 255 rm. sh[$>] 2 *. 231.8182 rm. - done v + + done #@cli rgb2yiq #@cli : Convert color representation of selected images from RGB to YIQ. #@cli : $ image.jpg rgb2yiq split c rgb2yiq : e[^-1] "Convert color representation of image$? from RGB to YIQ." - v - mix_rgb 0.299,0.587,0.114,\ 0.595716,-0.274453,-0.321263,\ 0.211456,-0.522591,0.311135 - v + #@cli rgb2yiq8 #@cli : Convert color representation of selected images from RGB to YIQ8. #@cli : $ image.jpg rgb2yiq8 split c rgb2yiq8 : e[^-1] "Convert color representation of image$? from RGB to YIQ." - v - rgb2yiq + rgb2yiq repeat $! sh[$>] 1 +. 151.908 *. 0.8393238012481239 rm. sh[$>] 2 +. 133.261 *. 0.9567690472081104 rm. - done v + + done #@cli rgb2ycbcr #@cli : Convert color representation of selected images from RGB to YCbCr. #@cli : $ image.jpg rgb2ycbcr split c rgb2ycbcr : e[^-1] "Convert color representation of image$? from RGB to YCbCr." - v - mix_rgb 66,129,25,-38,-74,112,112,-94,-18 + mix_rgb 66,129,25,-38,-74,112,112,-94,-18 repeat $! sh[$>] 0,2 +. 128 /. 256 rm. sh[$>] 0 +. 16 rm. sh[$>] 1,2 +. 128 rm. - done v + + done #@cli rgb2yuv #@cli : Convert color representation of selected images from RGB to YUV. #@cli : $ image.jpg rgb2yuv split c rgb2yuv : e[^-1] "Convert color representation of image$? from RGB to YUV." - v - mix_rgb {[0.299,0.587,0.114,\ -0.14713,-0.28886,0.436,\ 0.615,-0.51498,-0.10001]/255} - v + #@cli rgb2yuv8 #@cli : Convert color representation of selected images from RGB to YUV8. #@cli : $ image.jpg rgb2yuv8 split c rgb2yuv8 : e[^-1] "Convert color representation of image$? from RGB to YUV8." - v - rgb2yuv repeat $! + rgb2yuv repeat $! sh[$>] 0 *. 255 rm. sh[$>] 1 +. 0.44 *. 289.773 rm. sh[$>] 2 +. 0.62 *. 205.645 rm. - done v + + done #@cli remove_opacity #@cli : Remove opacity channel of selected images. remove_opacity : e[^-1] "Remove opacity channel of image$?." - v - repeat $! l[$>] - if {s==2} channels 0 - elif {s==4} channels 0,2 + repeat $! l[$>] + if s==2 channels 0 + elif s==4 channels 0,2 fi - nm {n} endl done v + + nm {n} endl done + +#@cli ryb2rgb +#@cli : Convert color representation of selected images from RYB to RGB. +ryb2rgb : + e[^-1] "Convert color representation of image$? from RYB to RGB." + to_color + f "red = R; + yellow = G; + blue = B; + white = min(red,yellow,blue); + red-=white; + yellow-=white; + blue-=white; + maxyellow = max(red,yellow,blue); + green = min(yellow,blue); + yellow-=green; + blue-=green; + blue>0 && green>0?(blue*=2; green*=2); + red+=yellow; + green+=yellow; + maxgreen = max(red,green,blue); + maxgreen>0?( + N = maxyellow/maxgreen; + red*=N; + green*=N; + blue*=N; + ); + red+=white; + green+=white; + blue+=white; + [ red,green,blue ]" #@cli select_color : tolerance[%]>=0,col1,...,colN #@cli : Select pixels with specified color in selected images. @@ -7545,25 +10734,25 @@ #@cli : $$ select_color : skip ${1=0} e[^-1] "Select color (${2--1}) in image$?, with tolerance $1." - v - repeat $! l[$>] + repeat $! l[$>] +fc ${2--1} - norm <= $1 - endl done v + + endl done #@cli sepia #@cli : Apply sepia tones effect on selected images. #@cli : $ image.jpg sepia sepia : e[^-1] "Apply sepia tones effect on image$?." - v - (0,44,115,143,196,244^0,20,84,119,184,235^0,5,44,73,144,200) r. 256,1,1,3,3 - repeat {$!-1} l[$>,-1] split_opacity luminance[0] map[0] . a[^-1] c endl done - rm. v + + (0,44,115,143,196,244^0,20,84,119,184,235^0,5,44,73,144,200) r. 256,1,1,3,3 + repeat $!-1 l[$>,-1] split_opacity luminance[0] map[0] . a[^-1] c endl done + rm. #@cli solarize #@cli : Solarize selected images. #@cli : $ image.jpg solarize solarize : e[^-1] "Solarize image$?." - v - luminance n 0,128 map 1 v + + luminance n 0,128 map 1 #@cli split_colors : _tolerance>=0,_max_nb_outputs>0,_min_area>0 #@cli : Split selected images as several image containing a single color. @@ -7573,94 +10762,93 @@ #@cli : $ image.jpg quantize 5 +split_colors , display_rgba split_colors : check "${1=0}>=0 && isint(${2=256}) && $2>0 && ${3=8}>=1" e[^-1] "Split image$? as single color outputs, with tolerance $1, $2 maximal outputs and minimal color area $3." - v - repeat $! l[$>] + repeat $! l[$>] +label 0,1 norm. area. 0,1 # Loop over biggest color regions. - repeat {$2-1} + repeat $2-1 coordsM={1,[xM,yM,zM,cM]} if {1,i($coordsM)<$3} break fi color={0,I($coordsM)} +select_color[0] $1,$color ==. 0 *[1] . ==. 0 done - if {1,iM} !=[1] 0 mv[1] $! # Residual mask, if any. + if iM#1 !=[1] 0 mv[1] $! # Residual mask, if any. else rm[1] fi r[^0] [0],[0],[0],{0,s+1} N={$!-1} sh[^0] 0,{s-2} *[-$N--1] [0] rm[-$N--1] sh[^0] 100% *[-$N--1] 255 rm[0,-$N--1] - endl done v + + endl done #@cli split_opacity #@cli : Split color and opacity parts of selected images. split_opacity : e[^-1] "Split color and opacity parts of image$?." - v - repeat $! l[$<] s c,{if(s==4,-3,if(s==2,-1,-s))} endl done v + + repeat $! l[$<] s c,{if(s==4,-3,if(s==2,-1,-s))} endl done -#@cli srgb2lab : illuminant={ 0=D50 | 1=D65 } : (no arg) +#@cli srgb2lab : illuminant={ 0=D50 | 1=D65 | 2=E } : (no arg) #@cli : Convert color representation of selected images from sRGB to Lab. -#@cli : Default value: 'illuminant=1'. +#@cli : Default value: 'illuminant=2'. #@cli : $ image.jpg srgb2lab split c #@cli : $ image.jpg srgb2lab +split c mul[-2,-1] 2.5 append[-3--1] c lab2srgb srgb2lab : skip "${1=,}" - v - l[] if {isval("$1")} illu={"$1?1:0"} else if {["'$1'"]!=','} noarg fi illu=1 fi onfail noarg illu=1 endl v + - e[^-1] "Convert color representation of image$? from sRGB to Lab, using the D"{arg(1+$illu,50,65)}" illuminant." - v - srgb2rgb rgb2lab $illu v + + l[] if isnum("$1") illu={"$1>1?2:$1>0?1:0"} else if ["'$1'"]!=',' noarg fi illu=2 fi onfail noarg illu=2 endl + e[^-1] "Convert color representation of image$? from sRGB to Lab, using the "${arg\ 1+$illu,D50,D65,E}" illuminant." + srgb2rgb rgb2lab $illu -#@cli srgb2lab8 : illuminant={ 0=D50 | 1=D65 } : (no arg) +#@cli srgb2lab8 : illuminant={ 0=D50 | 1=D65 | 2=E } : (no arg) #@cli : Convert color representation of selected images from sRGB to Lab8. -#@cli : Default value: 'illuminant=1'. +#@cli : Default value: 'illuminant=2'. srgb2lab8 : skip "${1=,}" - v - l[] if {isval("$1")} illu={"$1?1:0"} else if {["'$1'"]!=','} noarg fi illu=1 fi onfail noarg illu=1 endl v + - e[^-1] "Convert color representation of image$? from sRGB to Lab8, using the D"{arg(1+$illu,50,65)}" illuminant." - v - srgb2rgb rgb2lab8 $illu v + + l[] if isnum("$1") illu={"$1>1?2:$1>0?1:0"} else if ["'$1'"]!=',' noarg fi illu=2 fi onfail noarg illu=2 endl + e[^-1] "Convert color representation of image$? from sRGB to Lab8, using the "${arg\ 1+$illu,D50,D65,E}" illuminant." + srgb2rgb rgb2lab8 $illu #@cli srgb2rgb #@cli : Convert color representation of selected images from sRGB to linear RGB. srgb2rgb : e[^-1] "Convert color representation of image$? from sRGB to linear RGB." - v - f "sval = i/255; val = sval<=0.04045?sval/12.92:((sval + 0.055)/(1.055))^2.4; cut(255*val,0,255)" v + + f "sval = i/255; val = sval<=0.04045?sval/12.92:((sval + 0.055)/(1.055))^2.4; cut(255*val,0,255)" #@cli to_a #@cli : Force selected images to have an alpha channel. to_a : e[^-1] "Force image$? to have an alpha channel." - v - repeat $! l[$>] - if {s==1||s==3} channels 0,{s} sh. {s-1} f. 255 rm. fi - endl done v + + repeat $! l[$>] + if s==1||s==3 channels 0,{s} sh. {s-1} f. 255 rm. fi + endl done #@cli to_color #@cli : Force selected images to be in color mode (RGB or RGBA). to_color : e[^-1] "Force image$? to be in color mode." - v - repeat $! l[$>] - if {s>4} v + error[] "Command '$0': Image ["$>"] is not a G,GA,RGB or RGBA image ("{s}" channels)." - elif {s==2} r 100%,100%,1,4,0,1,0,0,0,1 - elif {s==1} r 100%,100%,1,3,1 + repeat $! l[$>] + if s>4 error[0--5] "Command '$0': Image ["$>"] is not a G,GA,RGB or RGBA image ("{s}" channels)." + elif s==2 r 100%,100%,1,4,0,1,0,0,0,1 + elif s==1 r 100%,100%,1,3,1 fi - endl done v + + endl done #@cli to_colormode : mode={ 0=adaptive | 1=G | 2=GA | 3=RGB | 4=RGBA } #@cli : Force selected images to be in a given color mode. #@cli : Default value: 'mode=0'. to_colormode : skip ${1=0} - if {$1==1} to_gray - elif {$1==2} to_graya - elif {$1==3} to_rgb - elif {$1==4} to_rgba + if $1==1 to_gray + elif $1==2 to_graya + elif $1==3 to_rgb + elif $1==4 to_rgba else - v - is_rgb=0 is_alpha=0 + is_rgb=0 is_alpha=0 repeat $! - if {$>,!s||s>4} v + error "Command '$0': Image ["$>"] is not a G,GA,RGB or RGBA image ("{s}" channels)." + if {$>,!s||s>4} error "Command '$0': Image ["$>"] is not a G,GA,RGB or RGBA image ("{s}" channels)." elif {$>,s==2} is_alpha=1 elif {$>,s==3} is_rgb=1 elif {$>,s==4} is_rgb=1 is_alpha=1 fi done to_colormode {if($is_rgb,3,1)+$is_alpha} - v + fi #@cli to_gray @@ -7668,33 +10856,33 @@ #@cli : $ image.jpg +to_gray to_gray : e[^-1] "Force image$? to be in GRAY mode." - v - repeat $! l[$>] - if {s>4} v + error[] "Command '$0': Image ["$>"] is not a G,GA,RGB or RGBA image ("{s}" channels)." - elif {s>=3} channels 0,2 luminance - elif {s==2} r 100%,100%,100%,1,0 + repeat $! l[$>] + if s>4 error[0--5] "Command '$0': Image ["$>"] is not a G,GA,RGB or RGBA image ("{s}" channels)." + elif s>=3 channels 0,2 luminance + elif s==2 r 100%,100%,100%,1,0 fi - endl done v + + endl done #@cli to_graya #@cli : Force selected images to be in GRAYA mode. to_graya : e[^-1] "Force image$? to be in GRAYA mode." - v - repeat $! l[$>] - if {s>4} v + error[] "Command '$0': Image ["$>"] is not a G,GA,RGB or RGBA image ("{s}" channels)." - elif {s==4} +channels 3 channels.. 0,2 luminance.. a c - elif {s==3} luminance channels 0,1 sh. 1 f. 255 rm. - elif {s==1} channels 0,1 sh. 1 f. 255 rm. + repeat $! l[$>] + if s>4 error[0--5] "Command '$0': Image ["$>"] is not a G,GA,RGB or RGBA image ("{s}" channels)." + elif s==4 +channels 3 channels.. 0,2 luminance.. a c + elif s==3 luminance channels 0,1 sh. 1 f. 255 rm. + elif s==1 channels 0,1 sh. 1 f. 255 rm. fi - endl done v + + endl done #@cli to_pseudogray : _max_step>=0,_is_perceptual_constraint={ 0 | 1 },_bits_depth>0 #@cli : Convert selected scalar images ([0-255]-valued) to pseudo-gray color images. #@cli : Default values: 'max_step=5', 'is_perceptual_constraint=1' and 'bits_depth=8'. #@cli : The original pseudo-gray technique has been introduced by Rich Franzen [http://r0k.us/graphics/pseudoGrey.html]. -#@cli : Extension of this technique to arbitrary increments for more tones, has been done by David Tschumperle. +#@cli : Extension of this technique to arbitrary increments for more tones, has been done by David Tschumperlé. to_pseudogray : check "isint(${1=5}) && $1>=0 && isint(${3=8}) && $3>0" skip ${2=1} e[^-1] "Convert scalar image$? to pseudo-gray color images, with steps $1." - v - channels 0 srgb2rgb pseudogray $1,{2.3*$2},$3 + channels 0 srgb2rgb pseudogray $1,{2.3*$2},$3 # Compute colormap with 65336 entries, to have match corresponding lightness. +srgb2lab. channels. 0 *. {65535/100} round. rows. 0,2 @@ -7702,85 +10890,142 @@ +norm. !=. 0 distance. 1 *. -1 watershed.. . rm. -. 1 # Map colormap to images, with lightness preservation. - repeat {$!-1} + repeat $!-1 to_rgb[$>] rgb2lab[$>] channels[$>] 0 *[$>] {65535/100} round[$>] c[$>] 0,65535 map[$>] . - done rm. v + + done rm. #@cli to_rgb #@cli : Force selected images to be in RGB mode. to_rgb : e[^-1] "Force image$? to be in RGB mode." - v - repeat $! l[$>] - if {s>4} v + error[] "Command '$0': Image ["$>"] is not a G,GA,RGB or RGBA image ("{s}" channels)." - elif {s==4} channels 0,2 - elif {s==2} channels 0,0 r 100%,100%,100%,3 - elif {s==1} r 100%,100%,100%,3 + repeat $! l[$>] + if s>4 error[0--5] "Command '$0': Image ["$>"] is not a G,GA,RGB or RGBA image ("{s}" channels)." + elif s==4 channels 0,2 + elif s==2 channels 0,0 r 100%,100%,100%,3 + elif s==1 r 100%,100%,100%,3 fi - endl done v + + endl done #@cli to_rgba #@cli : Force selected images to be in RGBA mode. to_rgba : e[^-1] "Force image$? to be in RGBA mode." - v - repeat $! l[$>] - if {s>4} v + error[] "Command '$0': Image ["$>"] is not a G,GA,RGB or RGBA image ("{s}" channels)." - elif {s==3} channels 0,3 sh. 3 f. 255 rm. - elif {s==2} r 100%,100%,100%,4 sh. 2 f. .. rm. - elif {s==1} r 100%,100%,100%,4 sh. 3 f. 255 rm. + repeat $! l[$>] + if s>4 error[0--5] "Command '$0': Image ["$>"] is not a G,GA,RGB or RGBA image ("{s}" channels)." + elif s==3 channels 0,3 sh. 3 f. 255 rm. + elif s==2 r 100%,100%,100%,4 sh. 2 f. .. rm. + elif s==1 r 100%,100%,100%,4 sh. 3 f. 255 rm. fi - endl done v + + endl done #@cli transfer_histogram : [reference_image],_nb_levels>0,_color_channels #@cli : Transfer histogram of the specified reference image to selected images. #@cli : Argument 'color channels' is the same as with command 'apply_channels'. -#@cli : Default value: 'nb_levels=256' and '_color_channels=all' +#@cli : Default value: 'nb_levels=256' and 'color_channels=all'. #@cli : $ image.jpg 100,100,1,3,"u([256,200,100])" +transfer_histogram[0] [1] -transfer_histogram : check ${"is_image_arg $1"}" && ${2=256}>0" skip "${3=0}" - v - mode="$3" - if {isval("$3")} if {isint("$3")} - mode=${arg\ 1+$3,all,rgba,rgb,rgb_r,rgb_g,rgb_b,rgba_a,\ - lrgb,lrgb_r,lrgb_g,lrgb_b,\ - ycbcr_y,ycbcr_cbcr,ycbcr_cb,ycbcr_cr,ycbcr_cg,\ - lab_l,lab_ab,lab_a,lab_b,\ - lch_ch,lch_c,lch_h,\ - hsv_h,hsv_s,hsv_v,hsi_i,hsl_l,\ - cmyk_c,cmyk_m,cmyk_y,cmyk_k,\ - yiq_y,yiq_iq} - fi fi - v + e[^-1] "Transfer histogram of image $1 to image$?, with $2 levels on channels '"$mode"'." v - - if {['$mode']!='all'} repeat $! pass$1 # Small geometric hack to be able to use 'apply_channels'. - w0,h0,d0,s0={$>,[w,h,d,s]} - w1,h1,d1,s1={-1,[w,h,d,s]} - to_colormode[$>] {s} - a[$>,-1] x - ac_arg="+z "$w0",0,0,100%,"{[$h1,$d1]-1}" r.. "$w0,$h0,$d0",100%,0,0 _transfer_histogram $2 rm." - apply_channels[$>] {``$ac_arg},$mode,0 - r[$>] $w0,$h0,$d0,$s0,0 - done - else repeat $! pass$1 _transfer_histogram[$>,-1] $2 done rm. - fi v + +transfer_histogram : check ${"is_image_arg $1"}" && ${2=1024}>0" skip "${3=0}" + channels=${"_ac_list \"$3\""} + e[^-1] "Transfer histogram from image ["${"pass$1 -1"}"] to image$?, "\ + "with $2 levels, for channels '"$channels"'." + pass$1 1 sref={s} rm. + to_colormode $sref + if ['$channels']!='all' + pass$1 {$sref==3?2:0} + to_color + ac. "+store _transfer_histogram_reference",$channels rm. + ac "_transfer_histogram $2",$channels,1 + else + pass$1 + store. _transfer_histogram_reference + repeat $! _transfer_histogram[$>] $2 done + fi + _transfer_histogram_reference= _transfer_histogram : - repeat {min(s#0,s#1)} - sh $> im,iM={[min(im#0,im#1),max(iM#0,iM#1)]} - equalize.. $1 - +histogram_cumul. $1,1,$im,$iM *. {$iM-$im} +. $im rm.. - index.. .,0,0 *.. {($iM-$im)/$1} +.. $im - rm[-2,-1] + $_transfer_histogram_reference + repeat min(s#0,s#1) + sh $> + +histogram[-2,-1] $1 cumulate[-2,-1] /.. {-2,i[-1,2]} /. {i[-1,2]} + f.. "* + const w1 = w -1; + val = i; X = x; + val=1, nX = max(0,X - step); val(val - vp)?--X); # Rounding + ):( + step = int((w1 - X)/2); + while (X=1, nX = min(w1,X + step); val>i[#-1,nX]?(X = nX):(step = int(step/2))); + X(vn - val)?++X); # Rounding + ); + im#-3 + (iM#-3 - im#-3)*X/w1" + n[-4] 0,{w-1} round[-4] map[-4] .. + k[0,1] done + rm. + +#@cli transfer_pca : [reference_image],_color_channels +#@cli : Transfer mean and covariance matrix of specified vector-valued reference image to selected images. +#@cli : Argument 'color channels' is the same as with command 'apply_channels'. +#@cli : Default value: 'color_channels=all'. +#@cli : $ sample lena,earth +transfer_pca[0] [1] +transfer_pca : check ${"is_image_arg $1"} skip "${2=all}" + channels=${"_ac_list \"$2\""} + e[^-1] "Transfer mean vector and covariance matrix from image ["${"pass$1 -1"}"] to image$?, "\ + "for channels '"$channels"'." + pass$1 1 sref={s} rm. + to_colormode[^-1] $sref + if $sref==1 # Scalar case can to be solved more easily + pass$1 + var_ref,avg_ref={[iv,ia]} rm. + repeat $! l[$>] - {ia} * {sqrt($var_ref/iv)} + $avg_ref endl done + elif ['$channels']!='all' + pass$1 {$sref==3?2:0} + to_color + ac. "+store _transfer_pca_reference",$channels rm. + ac "_transfer_pca",$channels,1 + else + pass$1 + store. _transfer_pca_reference + repeat $! _transfer_pca[$>] done + fi + _transfer_pca_reference= + +_transfer_pca : + $_transfer_pca_reference + f.. "*begin( + transpose(A,nA) = transp(A,nA); # For =0,_regularization>=0,_luminosity_constraints>=0,_rgb_resolution>=0,_is_constraints={ 0 | 1 } +#@cli transfer_rgb : [target],_gamma>=0,_regularization>=0,_luminosity_constraints>=0,_rgb_resolution>=0,\ +# _is_constraints={ 0 | 1 } #@cli : Transfer colors from selected source images to selected reference image (given as argument). #@cli : 'gamma' determines the importance of color occurrences in the matching process (0=none to 1=huge). #@cli : 'regularization' determines the number of guided filter iterations to remove quantization effects. #@cli : 'luminosity_constraints' tells if luminosity constraints must be applied on non-confident matched colors. #@cli : 'is_constraints' tells if additional hard color constraints must be set (opens an interactive window). -#@cli : Default values: 'gamma=0.3','regularization=8', 'luminosity_constraints=0.1', 'rgb_resolution=64' and 'is_constraints=0'. +#@cli : Default values: 'gamma=0.3','regularization=8', 'luminosity_constraints=0.1', 'rgb_resolution=64' and \ +# 'is_constraints=0'. #@cli : $ sample pencils,wall +transfer_rgb[0] [1],0,0.01 transfer_rgb : check "${2=0.3}>=0 && ${3=8}>=0 && ${4=0.15}>=0 && ${5=64}>=0 && isint(${6=0})" e[^-1] "Transfer colors of image $1 to image$?." - v - sigma=1.5 + sigma=1.5 repeat $! pass$1 0 l[$>,-1] nm_source={0,b} nm_target={1,b} nm[0] source nm[1] target @@ -7794,19 +11039,19 @@ if $6 h0={2*{*,v}/3} ws0={source,max(1,w*$h0/h)} wt0={target,max(1,w*$h0/h)} w1={2*{*,u}/3} hs1={source,max(1,h*$w1/w)} ht1={target,max(1,h*$w1/w)} - if {abs($ws0+$wt0-$w1)$w1} r2dx[-2,-1] $w1 fi - if {h>$h0} r2dy[-2,-1] $h0 fi + if w>$w1 r2dx[-2,-1] $w1 fi + if h>$h0 r2dy[-2,-1] $h0 fi nm.. visu nm. both w[visu] -1,-1 N=0 do w[] -1,-1,"[G'MIC] Add Color Guide (Constraint ""#"{1+$N}")" - +select[$visu] 1 if {i==-1} rm. break fi + +select[$visu] 1 if i==-1 rm. break fi line[$visu] {i[0]},{i[1]},{i[3]},{i[4]},1,0xF0F0F0F0,0 line[$visu] {i[0]},{i[1]},{i[3]},{i[4]},1,0x0F0F0F0F,255 circle[$visu] {i[0]},{i[1]},5,1,0,0,0 circle[$visu] {i[0]},{i[1]},3,1,255,0,0 @@ -7868,7 +11113,7 @@ b[clut] $sigma% # Enforce luminosity constraint for non-confident colors. - if {$4>0} + if $4>0 ^[fconfidence] {$4/10} *[fconfidence] -1 +[fconfidence] 1 +f[fconfidence] x +f. y +f. z a[-3--1] c *. {255/(w-1)} rgb2hsv[clut,-1] channels. 100% @@ -7880,7 +11125,7 @@ +map_clut[source] [clut] nm. res_noregul # Apply guided smoothing to remove quantization artifacts. - if {!$3} + if !$3 nm[res_noregul] res else l[source,res_noregul] @@ -7894,51 +11139,90 @@ fi k[res] - endl done v + + endl done # _transfer_rgb : _gamma>=0,_smoothness>=0,_resolution>0 # Convert selected images into 3D volumetric scalar function for color matching. -_transfer_rgb : v - l[] check "${1=0}>=0 && ${2=1.5}>=0 && ${3=128}>0" gamma=$1 smoothness=$2 res=$3 onfail noarg gamma=0 smoothness=1.5 res=128 endl v + - e[^-1] "Convert image$? as 3D volumetric scalar functions for color matching, with gamma "$gamma", smoothness "$smoothness" and resolution "$res"." - v - to_rgb repeat $! l[$>] +_transfer_rgb : l[] check "${1=0}>=0 && ${2=1.5}>=0 && ${3=128}>0" gamma=$1 smoothness=$2 res=$3 + onfail noarg gamma=0 smoothness=1.5 res=128 endl + e[^-1] "Convert image$? as 3D volumetric scalar functions for color matching, with gamma "$gamma", + smoothness "$smoothness" and resolution "$res"." + to_rgb repeat $! l[$>] b 0.3% r {w*h},3,1,1,-1 * {($res-1)/255} pointcloud 1,$res,$res,$res f 'if(i,i^$gamma,0)' b $smoothness% n 0,1 - endl done v + + endl done + +#@cli xyz2jzazbz +#@cli : Convert color representation of selected images from XYZ to RGB. +xyz2jzazbz : + e[^-1] "Convert color representation of image$? from XYZ to Jzazbz." + repeat $! l[$>] split_opacity + f[0] ${-_jzazbz_const}" + X = i0*255; + Y = i1*255; + Z = i2*255; + Xp = Jzazbz_b*X - (Jzazbz_b - 1)*Z; + Yp = Jzazbz_g*Y - (Jzazbz_g - 1)*X; + Zp = Z; + L = 0.41478972*Xp + 0.579999*Yp + 0.0146480*Zp; + M = -0.2015100*Xp + 1.120649*Yp + 0.0531008*Zp; + S = -0.0166008*Xp + 0.264800*Yp + 0.6684799*Zp; + tmp = (L/peakLum)^Jzazbz_n; + Lp = ((Jzazbz_c1 + Jzazbz_c2*tmp)/(1 + Jzazbz_c3*tmp))^Jzazbz_p; + tmp = (M/peakLum)^Jzazbz_n; + Mp = ((Jzazbz_c1 + Jzazbz_c2*tmp)/(1 + Jzazbz_c3*tmp))^Jzazbz_p; + tmp = (S/peakLum)^Jzazbz_n; + Sp = ((Jzazbz_c1 + Jzazbz_c2*tmp)/(1 + Jzazbz_c3*tmp))^Jzazbz_p; + Iz = 0.5*Lp + 0.5*Mp; + az = 3.52400*Lp - 4.066708*Mp + 0.542708*Sp; + bz = 0.199076*Lp + 1.096799*Mp - 1.295875*Sp; + Jz = (1 + Jzazbz_d)*Iz/(1 + Jzazbz_d*Iz) - Jzazbz_d0; + [ Jz,az,bz ]" + a c endl done -#@cli xyz2lab : illuminant={ 0=D50 | 1=D65 } : (no arg) +#@cli xyz2lab : illuminant={ 0=D50 | 1=D65 | 2=E } : (no arg) #@cli : Convert color representation of selected images from XYZ to Lab. -#@cli : Default value: 'illuminant=1'. +#@cli : Default value: 'illuminant=2'. xyz2lab : skip "${1=,}" - v - l[] if {isval("$1")} illu={"$1?1:0"} else if {["'$1'"]!=','} noarg fi illu=1 fi onfail noarg illu=1 endl v + - e[^-1] "Convert color representation of image$? from XYZ to Lab, using the D"{arg(1+$illu,50,65)}" illuminant." - v - to_color + l[] if isnum("$1") illu={"$1>1?2:$1>0?1:0"} else if ["'$1'"]!=',' noarg fi illu=2 fi onfail noarg illu=2 endl + e[^-1] "Convert color representation of image$? from XYZ to Lab, using the "${arg\ 1+$illu,D50,D65,E}" illuminant." + to_color f " begin( - lab(x) = (24389*x>216?cbrt(x):(24389*x/27 + 16)/116); + const epsilon = 216/24389; + const kappa = 24389/27; + lab(x) = (x>epsilon?cbrt(x):(x*kappa + 16)/116); D65 = [ 0.4124564, 0.3575761, 0.1804375, 0.2126729, 0.7151522, 0.0721750, 0.0193339, 0.1191920, 0.9503041 ]; D50 = [ 0.43603516, 0.38511658, 0.14305115, 0.22248840, 0.71690369, 0.06060791, 0.01391602, 0.09706116, 0.71392822 ]; - white = ("$illu"?D65:D50)*[ 1,1,1 ]; + E = [ 0.488718,0.3106803,0.2006017, + 0.1762044,0.8129847,0.0108109, + 0,0.0102048,0.9897952 ]; + white = ("$illu"==2?E:"$illu"==1?D65:D50)*[ 1,1,1 ]; ); - fX = lab(R/white[0]); - fY = lab(G/white[1]); - fZ = lab(B/white[2]); - [ cut(116*fY - 16,0,100), 500*(fX - fY), 200*(fY - fZ) ]; - " - v + + xr = i0/white[0]; + yr = i1/white[1]; + zr = i2/white[2]; + fx = lab(xr); + fy = lab(yr); + fz = lab(zr); + [ cut(116*fy - 16,0,100), 500*(fx - fy), 200*(fy - fz) ]" -#@cli xyz2rgb : illuminant={ 0=D50 | 1=D65 } : (no arg) +#@cli xyz2rgb : illuminant={ 0=D50 | 1=D65 | 2=E } : (no arg) #@cli : Convert color representation of selected images from XYZ to RGB. -#@cli : Default value: 'illuminant=1'. +#@cli : Default value: 'illuminant=2'. xyz2rgb : skip "${1=,}" - v - l[] if {isval("$1")} illu={"$1?1:0"} else if {["'$1'"]!=','} noarg fi illu=1 fi onfail noarg illu=1 endl v + - e[^-1] "Convert color representation of image$? from XYZ to RGB, using the D"{arg(1+$illu,50,65)}" illuminant." - v - - if $illu # D65 + l[] if isnum("$1") illu={"$1>1?2:$1>0?1:0"} else if ["'$1'"]!=',' noarg fi illu=2 fi onfail noarg illu=2 endl + e[^-1] "Convert color representation of image$? from XYZ to RGB, using the "${arg\ 1+$illu,D50,D65,E}" illuminant." + if $illu==2 # E + mix_rgb {[2.3706743,-0.9000405,-0.4706338,\ + -0.513885,1.4253036,0.0885814,\ + 0.0052982,-0.0146949,1.0093968]*255} + elif $illu # D65 mix_rgb {[3.2404542,-1.5371385,-0.4985314,\ -0.9692660,1.8760108,0.0415560,\ 0.0556434,-0.2040259,1.0572252]*255} @@ -7947,75 +11231,73 @@ -0.978795575994,1.916161689117,0.033453331711,\ 0.071976988401,-0.228984974402,1.405718224383]*255} fi - c 0,255 v + + c 0,255 -#@cli xyz82rgb : illuminant={ 0=D50 | 1=D65 } : (no arg) +#@cli xyz82rgb : illuminant={ 0=D50 | 1=D65 | 2=E } : (no arg) #@cli : Convert color representation of selected images from XYZ8 to RGB. -#@cli : Default value: 'illuminant=1'. +#@cli : Default value: 'illuminant=2'. xyz82rgb : skip "${1=,}" - v - l[] if {isval("$1")} illu={"$1?1:0"} else if {["'$1'"]!=','} noarg fi illu=1 fi onfail noarg illu=1 endl v + - e[^-1] "Convert color representation of image$? from XYZ8 to RGB, using the D"{arg(1+$illu,50,65)}" illuminant." - v - repeat $! + l[] if isnum("$1") illu={"$1>1?2:$1>0?1:0"} else if ["'$1'"]!=',' noarg fi illu=2 fi onfail noarg illu=2 endl + e[^-1] "Convert color representation of image$? from XYZ8 to RGB, using the "${arg\ 1+$illu,D50,D65,E}" illuminant." + repeat $! sh[$>] 0 /. 255 rm. sh[$>] 1 /. 255 rm. sh[$>] 2 /. 231.8182 rm. - done xyz2rgb $illu v + + done xyz2rgb $illu #@cli ycbcr2rgb #@cli : Convert color representation of selected images from YCbCr to RGB. ycbcr2rgb : e[^-1] "Convert color representation of image$? from YCbCr to RGB." - v - repeat $! + repeat $! sh[$>] 0 -. 16 rm. sh[$>] 1,2 -. 128 rm. sh[$>] 0,2 mix_rgb. 298,0,409,\ 298,-100,-208,\ 298,516,0 +. 128 /. 256 c. 0,255 rm. - done v + + done #@cli yiq2rgb #@cli : Convert color representation of selected images from YIQ to RGB. yiq2rgb : e[^-1] "Convert color representation of image$? from YIQ to RGB." - v - mix_rgb 1,0.9563,0.6210,\ 1,-0.2721,-0.6474,\ 1,-1.1070,1.7046 - c 0,255 v + + c 0,255 #@cli yiq82rgb #@cli : Convert color representation of selected images from YIQ8 to RGB. yiq82rgb : e[^-1] "Convert color representation of image$? from YIQ8 to RGB." - v - repeat $! + repeat $! sh[$>] 1 /. 0.8393238012481239 -. 151.908 rm. sh[$>] 2 /. 0.9567690472081104 -. 133.261 rm. done mix_rgb 1,0.9563,0.6210,\ 1,-0.2721,-0.6474,\ 1,-1.1070,1.7046 - c 0,255 v + + c 0,255 #@cli yuv2rgb #@cli : Convert color representation of selected images from YUV to RGB. yuv2rgb : e[^-1] "Convert color representation of image$? from YUV to RGB." - v - mix_rgb {[1,0,1.13983,\ 1,-0.39465,-0.5806,\ 1,2.03211,0]*255} - c 0,255 v + + c 0,255 #@cli yuv82rgb #@cli : Convert selected images from YUV8 to RGB color bases. yuv82rgb : e[^-1] "Convert color representation of image$? from YUV8 to RGB." - v - repeat $! + repeat $! sh[$>] 0 /. 255 rm. sh[$>] 1 /. 289.773 -. 0.44 rm. sh[$>] 2 /. 205.645 -. 0.62 rm. - done yuv2rgb v + + done yuv2rgb #--------------------------------- # @@ -8045,50 +11327,50 @@ #@cli : Default values: 'M=0', 'N=0', 'centering_x=centering_y=0.5'. #@cli : $ image.jpg split xy,4 append_tiles , append_tiles : check "isint(${1=0}) && isint(${2=0}) && ${3=0.5}>=0 && $3<=1 && ${4=$3}>=0 && $4<=1" - if {!$!} e[0--3] "Append image$? as a 0x0-tiled image." return fi - if {!$1&&!$2} # auto-mode - v - N={int(sqrt($!))} M={round($!/$N,1,1)} - v + e[0--3] "Append image$? as a "${M}x${N}"-tiled image (auto-mode)." v - - MN={$M*$N} if {$!%$MN} {$MN-($!%$MN)} s. x fi - elif {!$2} # auto-rows - v - M=$1 N={round($!/$1,1,1)} - v + e[0--3] "Append image$? as a "${M}x${N}"-tiled image." v - - if {$M>$!} v + warn[0--3] "Missing images for having one row in a "${M}x${N}"-tiled image." return fi - if {$!%$M} {$M-($!%$M)} s. x fi - elif {!$1} # auto-columns - v - M={round($!/$2,1,1)} N=$2 - v + e[0--3] "Append image$? as a "${M}x${N}"-tiled image." v - - if {$N>$!} v + warn[0--3] "Missing images for having one column in a "${M}x${N}"-tiled image." return fi - if {$!%$M} {$M-($!%$M)} s. x fi + if !$! e[0--3] "Append image$? as a 0x0-tiled image." return fi + if !$1&&!$2 # auto-mode + N={int(sqrt($!))} M={round($!/$N,1,1)} + e[0--3] "Append image$? as a "${M}x${N}"-tiled image (auto-mode)." + MN={$M*$N} if $!%$MN {$MN-($!%$MN)} s. x fi + elif !$2 # auto-rows + M=$1 N={round($!/$1,1,1)} + e[0--3] "Append image$? as a "${M}x${N}"-tiled image." + if $M>$! warn[0--3] "Missing images for having one row in a "${M}x${N}"-tiled image." return fi + if $!%$M {$M-($!%$M)} s. x fi + elif !$1 # auto-columns + M={round($!/$2,1,1)} N=$2 + e[0--3] "Append image$? as a "${M}x${N}"-tiled image." + if $N>$! warn[0--3] "Missing images for having one column in a "${M}x${N}"-tiled image." return fi + if $!%$M {$M-($!%$M)} s. x fi else - e[0--3] "Append image$?, as $1x$2-tiled images." v - + e[0--3] "Append image$?, as $1x$2-tiled images." M=$1 N=$2 fi MN={$M*$N} - repeat {int($!/$MN)} l[$>-{$>+$MN-1}] + repeat ceil($!/$MN) l[$>-{min($!-1,$>+$MN-1)}] # Resize to best match for each column and row. - $MN,1,1,2 repeat $MN point. $>,0,0,1,{$>,w},{$>,h} done r. $M,$N,1,2,-1 + $M,$N,1,2,">begin(p = 0); p},{@$y},100%,100%,0,0,$3,$4 i+=1 done done + repeat $!-2 r[$>] {"[ i[#-2,"$>%$M"],i["int($>/$M)"] ]"},100%,100%,0,0,$3,$4 done rm[-2,-1] # Append images together. - repeat {int($!/$M)} a[$>-{$>+$M-1}] x done - repeat {int($!/$N)} a[$>-{$>+$N-1}] y done + repeat int($!/$M) a[$>-{$>+$M-1}] x done + repeat int($!/$N) a[$>-{$>+$N-1}] y done endl done - v + #@cli apply_scales : "command",number_of_scales>0,_min_scale[%]>=0,_max_scale[%]>=0,_scale_gamma>0,_interpolation #@cli : Apply specified command on different scales of selected images. #@cli : 'interpolation' can be { 0=none | 1=nearest | 2=average | 3=linear | 4=grid | 5=bicubic | 6=lanczos }. #@cli : Default value: 'min_scale=25%', 'max_scale=100%' and 'interpolation=3'. #@cli : $ image.jpg apply_scales "blur 5 sharpen 1000",4 -apply_scales : skip "${1=}" check "isint($2) && $2>0 && ${3=25%}>=0 && ${4=100%}>=0 && ${5=1}>0 && isint(${6=3}) && $6>=0" - v - s0="no" s1="nearest-neighbor" s2="average" s3="linear" s4="grid" s5="bicubic" s6="lanczos" v + +apply_scales : check "isint($2) && $2>0 && ${3=25%}>=0 && ${4=100%}>=0 && ${5=1}>0 && isint(${6=3}) && $6>=0" + skip "${1=}" + s0="no" s1="nearest-neighbor" s2="average" s3="linear" s4="grid" s5="bicubic" s6="lanczos" e[^-1] "Apply command '$1' on image$? for $2 scales ($3 -> $4) and "${s{min(6,$6)}}" interpolation." - v - repeat $! l[$<] nm={0,n} + repeat $! l[$<] nm={0,n} scale0={if(${"is_percent $3"},$3*max(w,h,d),$3)} scale1={if(${"is_percent $4"},$4*max(w,h,d),$4)} repeat $2 @@ -8097,44 +11379,47 @@ h={0,h==1?1:max(1,round($scale*h/max(w,h,d)))} d={0,d==1?1:max(1,round($scale*d/max(w,h,d)))} +r[0] $w,$h,$d,100%,$6 - if {narg("$1")} l. $1 endl fi + if narg("$1") l. $1 endl fi done rm[0] nm $nm - endl done v + + endl done #@cli autocrop : value1,value2,... : (no arg) : (+) #@cli : Autocrop selected images by specified vector-valued intensity. #@cli : If no arguments are provided, cropping value is guessed. #@cli : $ 400,400,1,3 fill_color 64,128,255 ellipse 50%,50%,120,120,0,1,255 +autocrop -#@cli autocrop_components : _threshold[%],_min_area[%]>=0,_is_high_connectivity={ 0 | 1 },_output_type={ 0=crop | 1=segmentation | 2=coordinates } +#@cli autocrop_components : _threshold[%],_min_area[%]>=0,_is_high_connectivity={ 0 | 1 },\ +# _output_type={ 0=crop | 1=segmentation | 2=coordinates } #@cli : Autocrop and extract connected components in selected images, according to a mask given as the last channel of #@cli : each of the selected image (e.g. alpha-channel). #@cli : Default values: 'threshold=0%', 'min_area=0.1%', 'is_high_connectivity=0' and 'output_type=1'. -#@cli : $ 256,256 noise 0.1,2 eq 1 dilate_circ 20 label_fg 0,1 normalize 0,255 +neq 0 *[-1] 255 append c +autocrop_components , +#@cli : $ 256,256 noise 0.1,2 eq 1 dilate_circ 20 label_fg 0,1 normalize 0,255 +neq 0 *[-1] 255 append c \ +# +autocrop_components , autocrop_components : skip ${1=0%} check "${2=0.1%}>=0 && isbool(${3=0}) && isint(${4=1}) && $4>=0 && $4<=2" - e[^-1] "Autocrop connected components from image$?, with threshold $1, minimal area $2, "${arg\ 1+$3,low,high}" connectivity "\ - "and output type set to '"${arg\ 1+$4,crop,segmentation,coordinates}"'.\n" - v - repeat $! l[$>] + e[^-1] "Autocrop connected components from image$?, with threshold $1, minimal area $2, "\ + ${arg\ 1+$3,low,high}" connectivity "\ + "and output type set to '"${arg\ 1+$4,crop,segmentation,coordinates}"'.\n" + repeat $! l[$>] min_area={max(1,round(if(${is_percent\ $2},$2*w*h,$2)))} +channels 100% >. $1 area_fg. 0,$3 >=. $min_area # Discard background and small objects. +area. 0,1 <. $min_area -|[-2,-1] label_fg. 0,1 # Fill small holes in objects. # Extract detected objects. - N={iM} repeat {iM} + N={iM} repeat iM n={1+$>} - v + e[] "\r > "$n/$N v - + e[] "\r > "$n/$N rprogress {100*$n/$N} +==[1] $n +*[0,-1] rm.. - if {$4==0} coords=${autocrop_coords.\ auto} rm. +z[0] $coords - elif {$4==1} autocrop. + if $4==0 coords=${autocrop_coords.\ auto} rm. +z[0] $coords + elif $4==1 autocrop. else coords=${autocrop_coords.\ auto} rm. ($coords) y. fi done rm[0,1] - if {!$!} 0 fi - if {$4==2} a x fi - endl done v + + if !$! 0 fi + if $4==2 a x fi + endl done #@cli autocrop_seq : value1,value2,... | auto #@cli : Autocrop selected images using the crop geometry of the last one by specified vector-valued intensity, @@ -8143,16 +11428,15 @@ #@cli : $ image.jpg +fill[-1] 0 ellipse[-1] 50%,50%,30%,20%,0,1,1 autocrop_seq 0 autocrop_seq : skip ${1=auto} e[^-1] "Auto-crop image$? using crop geometry of last image by vector '$*'." - if {!$!} return fi - v - - if {$!==1} _autocrop$is_auto ${1--1} v + return fi + if !$! return fi + is_auto={['"$1"']=='auto'} + if $!==1 _autocrop$is_auto ${1--1} return fi coords=${autocrop_coords.\ ${1--1}} x0={arg(1,$coords)} y0={arg(2,$coords)} z0={arg(3,$coords)} x1={arg(4,$coords)} y1={arg(5,$coords)} z1={arg(6,$coords)} - if {$x0>$x1" || "$y0>$y1" || "$z0>$z1} i[0--2] 0 rm[1--1:2] + if $x0>$x1" || "$y0>$y1" || "$z0>$z1 i[0--2] 0 rm[1--1:2] else z $x0,$y0,$z0,$x1,$y1,$z1 fi - v + #@cli channels : { [image0] | c0[%] },_{ [image1] | c1[%] } : (+) #@cli : Keep only specified channels of selected images. @@ -8167,12 +11451,12 @@ #@cli z : eq. to 'crop'. : (+) -#@cli crop : x0[%],x1[%],_boundary_conditions : x0[%],y0[%],x1[%],y1[%],_boundary_conditions : x0[%],y0[%],z0[%],x1[%],y1[%],z1[%],_boundary_conditions : x0[%],y0[%],z0[%],c0[%],x1[%],y1[%],z1[%],c1[%],_boundary_conditions : (no arg) : (+) +#@cli crop : x0[%],x1[%],_boundary_conditions : x0[%],y0[%],x1[%],y1[%],_boundary_conditions : \ +# x0[%],y0[%],z0[%],x1[%],y1[%],z1[%],_boundary_conditions : \ +# x0[%],y0[%],z0[%],c0[%],x1[%],y1[%],z1[%],c1[%],_boundary_conditions : (+) #@cli : Crop selected images with specified region coordinates. #@cli : (eq. to 'z').\n #@cli : 'boundary_conditions' can be { 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }. -#@cli : (no arg) runs interactive mode (uses the instant display window [0] if opened). -#@cli : In interactive mode, the chosen crop coordinates are returned in the status. #@cli : Default value: 'boundary_conditions=0'. #@cli : $ image.jpg +crop -230,-230,280,280,1 crop[0] -230,-230,280,280,0 #@cli : $ image.jpg crop 25%,25%,75%,75% @@ -8182,17 +11466,17 @@ #@cli : $ 1,10,1,1,'y' +diagonal diagonal : e[^-1] "Transform vector$? as diagonal matrix." - v - y repeat $! r[$>] {$>,h+1},100%,1,1,0 r[$>] {$>,h},100%,1,1,-1 done v + + y repeat $! r[$>] {$>,h+1},100%,1,1,0 r[$>] {$>,h},100%,1,1,-1 done # downsize_aliased : 100<=factor<=0 # Downsize selected images with a specific algorithm to better render anti-aliased rendering # over transparent background (from aliased transparent images, manage transparent border pixels with more care). downsize_aliased : check "${1=50}>=0 && $1<=100" - if {$1==100} return elif {!$1} r 1,1,1,100%,2 return fi + if $1==100 return elif !$1 r 1,1,1,100%,2 return fi N={ceil(1+100/$1)} repeat $! l[$>] split_opacity - if {$!==1} continue fi + if $!==1 continue fi +dilate.. $N +==.. 0 j[0] ..,0,0,0,0,1,. rm[-2,-1] a c @@ -8204,7 +11488,7 @@ #@cli : Default values: 'depth=64', 'is_plain=1' and 'is_colored=1'. elevate : check "${1=64}>0" skip ${2=1},${3=1} e[^-1] "Elevate 2D image$? into $1-slices volume(s)." - v - r 100%,100%,1,100% + r 100%,100%,1,100% repeat $! l[$>] nm={0,n} +norm 100%,100%,$1,{if($3,{0,s},1)} m={-2,im} d={-2,iM-$m} @@ -8215,56 +11499,80 @@ r. 100%,100%,1,.. if $3 *. [0] fi j.. .,0,0,$> rm. done - rm[0,1] nm $nm endl done v + + rm[0,1] nm $nm endl done #@cli expand_x : size_x>=0,_boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror } #@cli : Expand selected images along the x-axis. #@cli : Default value: 'boundary_conditions=1'. #@cli : $ image.jpg expand_x 30,0 expand_x : check "$1>=0 && ${2=1}>=0 && $2<=3" - e[^-1] "Expand image$? along the x-axis with size $1 and "${"arg 1+$2,dirichlet,neumann,periodic,mirror"}" boundary conditions." - v - repeat $! r[$>] {$>,w+2*$1},100%,100%,100%,0,$2,0.5,0.5,0.5 done v + + e[^-1] "Expand image$? along the x-axis with size $1 and "${"arg 1+$2,dirichlet,neumann,periodic,mirror"}" + boundary conditions." + repeat $! r[$>] {$>,w+2*$1},100%,100%,100%,0,$2,0.5,0.5,0.5 done #@cli expand_xy : size>=0,_boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror } #@cli : Expand selected images along the xy-axes. #@cli : Default value: 'boundary_conditions=1'. #@cli : $ image.jpg expand_xy 30,0 expand_xy : check "$1>=0 && ${2=1}>=0 && $2<=3" - e[^-1] "Expand image$? along the xy-axes with size $1 and "${"arg 1+$2,dirichlet,neumann,periodic,mirror"}" boundary conditions." - v - repeat $! r[$>] {$>,w+2*$1},{$>,h+2*$1},100%,100%,0,$2,0.5,0.5,0.5 done v + + e[^-1] "Expand image$? along the xy-axes with size $1 and "${"arg 1+$2,dirichlet,neumann,periodic,mirror"}" + boundary conditions." + repeat $! r[$>] {$>,w+2*$1},{$>,h+2*$1},100%,100%,0,$2,0.5,0.5,0.5 done #@cli expand_xyz : size>=0,_boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror } #@cli : Expand selected images along the xyz-axes. #@cli : Default value: 'boundary_conditions=1'. expand_xyz : check "$1>=0 && ${2=1}>=0 && $2<=3" - e[^-1] "Expand image$? along the xyz-axes with size $1 and "${"arg 1+$2,dirichlet,neumann,periodic,mirror"}" boundary conditions." - v - repeat $! r[$>] {$>,w+2*$1},{$>,h+2*$1},{$>,d+2*$1},100%,0,$2,0.5,0.5,0.5 done v + + e[^-1] "Expand image$? along the xyz-axes with size $1 and "${"arg 1+$2,dirichlet,neumann,periodic,mirror"}" + boundary conditions." + repeat $! r[$>] {$>,w+2*$1},{$>,h+2*$1},{$>,d+2*$1},100%,0,$2,0.5,0.5,0.5 done #@cli expand_y : size_y>=0,_boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror } #@cli : Expand selected images along the y-axis. #@cli : Default value: 'boundary_conditions=1'. #@cli : $ image.jpg expand_y 30,0 expand_y : check "$1>=0 && ${2=1}>=0 && $2<=3" - e[^-1] "Expand image$? along the y-axis with size $1 and "${"arg 1+$2,dirichlet,neumann,periodic,mirror"}" boundary conditions." - v - repeat $! r[$>] 100%,{$>,h+2*$1},100%,100%,0,$2,0.5,0.5,0.5 done v + + e[^-1] "Expand image$? along the y-axis with size $1 and "${"arg 1+$2,dirichlet,neumann,periodic,mirror"}" + boundary conditions." + repeat $! r[$>] 100%,{$>,h+2*$1},100%,100%,0,$2,0.5,0.5,0.5 done #@cli expand_z : size_z>=0,_boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror } #@cli : Expand selected images along the z-axis. #@cli : Default value: 'boundary_conditions=1'. expand_z : check "$1>=0 && ${2=1}>=0 && $2<=3" - e[^-1] "Expand image$? along the z-axis with size $1 and "${"arg 1+$2,dirichlet,neumann,periodic,mirror"}" boundary conditions." - v - repeat $! r[$>] 100%,100%,{$>,d+2*$1},100%,0,$2,0.5,0.5,0.5 done v + + e[^-1] "Expand image$? along the z-axis with size $1 and "${"arg 1+$2,dirichlet,neumann,periodic,mirror"}" + boundary conditions." + repeat $! r[$>] 100%,100%,{$>,d+2*$1},100%,0,$2,0.5,0.5,0.5 done + +#@cli extract : "condition",_output_type={ 0=xyzc-coordinates | 1=xyz-coordinates | 2=scalar-values | 3=vector-values } +#@cli : Extract a list of coordinates or values from selected image, where +#@cli : specified mathematical condition holds. +#@cli : For N coordinates matching, result is a 1xNx1x4 image. +#@cli : Default values: 'output_type=0'. +#@cli : $ sp lena +extract "norm(I)>128",3 +extract : check "isin(${2=0},0,1,2,3)" + s0,s1,s2,s3=xyzc-coordinates,xyz-coordinates,scalar-values,vector-values + e[^-1] "Extract "$s$2" from image$? verifying condition '$1'." + str=">"${-math_lib}"begin(run('1,32,1,',arg(1+$2,4,3,1,s)));($1)?(" + if $2==0 str.="dar_insert(#-1,[x,y,z,c]));i" + elif $2==1 str.="dar_insert(#-1,[x,y,z]));I" + elif $2==2 str.="dar_insert(#-1,i));i" + else str.="dar_insert(#-1,I));I" + fi + str.=";end(resize(#-1,1,dar_size(#-1),1,s(#-1),0))" + repeat $! nm={$>,n} eval[$>] $str nm. $nm rv[$>,-1] rm. done #@cli extract_region : [label_image],_extract_xyz_coordinates={ 0 | 1 },_label_1,...,_label_M #@cli : Extract all pixels of selected images whose corresponding label in '[label_image]' is equal to 'label_m', #@cli : and output them as M column images. #@cli : Default value: 'extract_xyz_coordinates=0'. #@cli : $ image.jpg +blur 3 quantize. 4,0 +extract_region[0] [1],0,1,3 -extract_region : check ${"is_image_arg $1"}" && isval(${2=0})" - if {$#<3} e[0--3] "Extract pixels of image$? for labels [] in image $1, with"${"arg 1+!!$2,out"}" coordinates -> no labels provided, ignoring." return fi +extract_region : check ${"is_image_arg $1"}" && isnum(${2=0})" + if $#<3 e[0--3] "Extract pixels of image$? for labels [] in image $1, with"${"arg 1+!!$2,out"}" coordinates + -> no labels provided, ignoring." return fi e[^-1] "Extract pixels of image$? for labels {${3--1}} in image $1, with"${"arg 1+!!$2,out"}" coordinates." - v - pass$1 mv. 0 repeat {$!-1} l[0,{1+$<}] - 1,16,1,{s+($2?3:0)} if {$#>3} .x{$#-3} fi + pass$1 mv. 0 repeat $!-1 l[0,{1+$<}] nm={n} + 1,16,1,{s+($2?3:0)} if $#>3 .x{$#-3} fi f[0] ">"${-math_lib}" begin( const N = iM + 1; # Number of labels @@ -8276,10 +11584,11 @@ $2?dar_insert(#ind,[ I(#1),x,y,z ]):dar_insert(#ind,I(#1)); ); i; end(for (k = 2, k=0 && $2<=3" skip "${1=X}",${3=0},"${4=}" - if {$2<=1} e[0--3] "Create aligned montage from image$?, with layout code '$1' and centering $2." +#@cli : $ image.jpg sample ? +plasma[0] shape_cupid 256 normalize 0,255 frame 3,3,0 frame 10,10,255 to_rgb \ +# +montage A +montage[^-1] H1:V0:VH2:1H0:3 +montage : check "isnum(${2=2}) && $2>=0 && $2<=3" skip "${1=X}",${3=0},"${4=}" + if $2<=1 e[0--3] "Create aligned montage from image$?, with layout code '$1' and centering $2." else e[0--3] "Create scaled montage from image$?, with layout code '$1' and scale "{$2-2}"." fi - v - to_colormode 0 + to_colormode 0 # Manage automatic layout. - if {lowercase('"$1"')=='x'} +l + if lowercase('"$1"')=='x' +l repeat $! nm[$>] $> done - repeat {$!-1} - if {{-2,w>h}" && "w>h} mode=V # Both landscape. - elif {{-2,h>w}" && "h>w} mode=H # Both portrait. - elif {{-2,w>h}" && "h>w} # Landscape - portrait. - if {{-2,h/w}<(w/h)} mode=V else mode=H fi + repeat $!-1 + if {-2,w>h}" && "w>h mode=V # Both landscape. + elif {-2,h>w}" && "h>w mode=H # Both portrait. + elif {-2,w>h}" && "h>w # Landscape - portrait. + if {-2,h/w}<(w/h) mode=V else mode=H fi else # Portrait - landscape. - if {{-2,w/h}<(h/w)} mode=H else mode=V fi + if {-2,w/h}<(h/w) mode=H else mode=V fi fi name=$mode{-2,n}:{n} montage[-2,-1] $mode,$2 @@ -8323,23 +11635,29 @@ # Format and check validity of layout code. N=$! l[] _scode="$1" _mode=$2 - if {lowercase('"$1"')=='h'} if {$N>1} {$N-1},1,1,1,-1 $N,1,1,1,x a x y else v + return fi # Simple horizontal montage. - elif {lowercase('"$1"')=='v'} if {$N>1} {$N-1},1,1,1,-2 $N,1,1,1,x a x y else v + return fi # Simple vertical montage. - elif {s=lowercase('"$1"');s=='a'||s=='b'} # Montage as an array. - if {$N<2} v + return fi - nr={round(sqrt($N))} nc={round($N/$nr,1,1)} # Horizontal array. - if {lowercase('"$1"')=='b'} n=$nr nr=$nc nc=$n fi # Vertical array. - $N,1,1,1,x s x,-{round(w/$nr,1,1)} repeat $! l[$>] if {w>1} i[0] {w-1},1,1,1,-1 a x fi endl done a x - if {$nr>1} i[0] {$nr-1},1,1,1,-2 a x fi y + if lowercase('"$1"')=='h' if $N>1 {$N-1},1,1,1,-1 $N,1,1,1,x a x y else return fi # Simple horizontal montage. + elif lowercase('"$1"')=='v' if $N>1 {$N-1},1,1,1,-2 $N,1,1,1,x a x y else return fi # Simple vertical montage. + elif s=lowercase('"$1"');s=='a'||s=='b' # Montage as an array. + if $N<2 return fi + nr={round(sqrt($N))} nc={round($N/$nr,1,1)} # Horizontal array. + if lowercase('"$1"')=='b' n=$nr nr=$nc nc=$n fi # Vertical array. + $N,1,1,1,x s x,-{round(w/$nr,1,1)} repeat $! l[$>] if w>1 i[0] {w-1},1,1,1,-1 a x fi endl done a x + if $nr>1 i[0] {$nr-1},1,1,1,-2 a x fi y else # Other complex montage. - ({'"$1"'}) f 'if(i==72||i==104,-1,if(i==86||i==118,-2,if(i==82||i==114,-3,if(i==77||i==109,-4,if(i>=48&&i<=57,i-48,-5)))))' + ('"$1"') f "if(i==72 || i==104,-1, + if(i==86 || i==118,-2, + if(i==82 || i==114,-3, + if(i==77 || i==109,-4, + if(i>=48 && i<=57,i-48,-5)))))" s +,-1 s +,-2 s +,-3 s +,-4 s +,-5 - repeat $! l[$>] if {im>=0} ++. 48 =.. {t} rm. rows 0 fi endl done a y discard -5 + repeat $! l[$>] if im>=0 ++. 48 =.. {t} rm. rows 0 fi endl done a y discard -5 fi f 'if(i<0,i,i%$N)' endl - if {$!==$N} rm v + return fi # Empty layout code. - nm[^-1] 0 repeat {h} c={i[$>]} if {$c>=0} if {$c,n} i.. [$c] i={$!-2} =. $i,0,$> ref$i=$c else nm[$c] 1 ref$c=$c fi fi done # Duplicate multiple references. + if $!==$N rm return fi # Empty layout code. + nm[^-1] 0 repeat h c={i[$>]} # Duplicate multiple references. + if $c>=0 if {$c,n} i.. [$c] i={$!-2} =. $i,0,$> ref$i=$c else nm[$c] 1 ref$c=$c fi fi + done _code={^} _lcode={narg($_code)} rm. # Determine image positions and sizes. @@ -8349,40 +11667,42 @@ endl # Render montage. - if {narg("$4")} m "__montage : $4 k[0]" - else - m "__montage : if {$""7%2} mirror x fi if {$""8%2} mirror y fi rotate {90*$""6} r {max(1,round($""4,1,1))},{max(1,round($""5,1,1))},1,100%,3" + if narg("$4") m "__montage : $4 k[0]" + else m "__montage : if $""7%2 mirror x fi if $""8%2 mirror y fi rotate {90*$""6} + r {max(1,round($""4,1,1))},{max(1,round($""5,1,1))},1,100%,3" fi + s=${max_s[^-1]} - repeat {h} + repeat h i={i(0,$>)} xi={i(1,$>)} yi={i(2,$>)} wi={i(3,$>)} hi={i(4,$>)} ai={i(5,$>)} mxi={i(6,$>)} myi={i(7,$>)} - if {$3||!$>} i.. $w,$h,1,$s fi + if $3||!$> i.. $w,$h,1,$s fi __montage[$i] ${ref$i},$xi,$yi,{max(1,$wi)},{max(1,$hi)},$ai,$mxi,$myi j.. [$i],$xi,$yi done - uncommand __montage + um __montage rm[0-{$N-1},-1] fi nm "[Montage '$1']" - v + _montage : - if {$_p>$_lcode} v + error "Command 'montage': Incomplete layout code '"$_scode"'." fi + if $_p>$_lcode error "Command 'montage': Incomplete layout code '"$_scode"'." fi c={arg($_p,$_code)} - if {$c>=0} _p+=1 u $c # Single indice. - elif {$c==-4} # Mirror. + if $c>=0 _p+=1 u $c # Single index. + elif $c==-4 # Mirror. _p+=1 l=${-_montage} f[$l] 'a=i(5,y)%2;if((x==7&&a)||(x==6&&!a),!i,if(x==1,i(3,0)-i(3,y)-i,i))' u $l - elif {$c==-3} # Rotation. + elif $c==-3 # Rotation. _p+=1 l=${-_montage} l[$l] s x +[2] [4] rv[1,2] *[1] -1 +[1] {4,@0} rv[3,4] +[5] 1 a x endl u $l else # Merge. _p+=1 l=${-_montage} lw={$l,@3} lh={$l,@4} r=${-_montage} rw={$r,@3} rh={$r,@4} - if {$c==-1} # Horizontal merge. - if {$_mode<2} - h={max($lh,$rh)} +[$l] '0,0,{($h-$lh)*min(1,$_mode)},0,0,0,0,0' +[$r] '0,$lw,{($h-$rh)*min(1,$_mode)},0,0,0,0,0' + if $c==-1 # Horizontal merge. + if $_mode<2 + h={max($lh,$rh)} + +[$l] '0,0,{($h-$lh)*min(1,$_mode)},0,0,0,0,0' + +[$r] '0,$lw,{($h-$rh)*min(1,$_mode)},0,0,0,0,0' else h={($_mode-2)*max($lh,$rh)+(3-$_mode)*min($lh,$rh)} lf={$h/$lh} rf={$h/$rh} lw={$lw*$lf} rw={$rw*$rf} @@ -8391,8 +11711,10 @@ i[$l] (-1,0,0,{$lw+$rw},$h,0,0,0) a[$l,{$l+1}] y a[$l] [$r],y r[$r] 1,1,1,1,0 else # Vertical merge. - if {$_mode<2} - w={max($lw,$rw)} +[$l] '0,{($w-$lw)*min(1,$_mode)},0,0,0,0,0,0' +[$r] '0,{($w-$rw)*min(1,$_mode)},$lh,0,0,0,0,0' + if $_mode<2 + w={max($lw,$rw)} + +[$l] '0,{($w-$lw)*min(1,$_mode)},0,0,0,0,0,0' + +[$r] '0,{($w-$rw)*min(1,$_mode)},$lh,0,0,0,0,0' else w={($_mode-2)*max($lw,$rw)+(3-$_mode)*min($lw,$rw)} lf={$w/$lw} rf={$w/$rw} lh={$lh*$lf} rh={$rh*$rf} @@ -8416,20 +11738,23 @@ #@cli r : eq. to 'resize'. : (+) -#@cli resize : [image],_interpolation,_boundary_conditions,_ax,_ay,_az,_ac : {[image_w] | width>0[%]},_{[image_h] | height>0[%]},_{[image_d] | depth>0[%]},_{[image_s] | spectrum>0[%]},_interpolation,_boundary_conditions,_ax,_ay,_az,_ac : (no arg) : (+) +#@cli resize : [image],_interpolation,_boundary_conditions,_ax,_ay,_az,_ac : \ +# {[image_w] | width>0[%]},_{[image_h] | height>0[%]},_{[image_d] | depth>0[%]},\ +# _{[image_s] | spectrum>0[%]},_interpolation,_boundary_conditions,_ax,_ay,_az,_ac : (+) #@cli : Resize selected images with specified geometry. #@cli : (eq. to 'r').\n -#@cli : 'interpolation' can be { -1=none (memory content) | 0=none | 1=nearest | 2=average | 3=linear | 4=grid | 5=bicubic | 6=lanczos }. +#@cli : 'interpolation' can be { -1=none (memory content) | 0=none | 1=nearest | 2=average | 3=linear | \ +# 4=grid | 5=bicubic | 6=lanczos }. #@cli : 'boundary_conditions' has different meanings, according to the chosen 'interpolation' mode : #@cli : . When 'interpolation=={ -1 | 1 | 2 | 4 }', 'boundary_conditions' is meaningless. #@cli : . When 'interpolation==0', 'boundary_conditions' can be { 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }. #@cli : . When 'interpolation=={ 3 | 5 | 6 }', 'boundary_conditions' can be { 0=none | 1=neumann }. #@cli : 'ax,ay,az,ac' set the centering along each axis when 'interpolation=0 or 4' #@cli : (set to '0' by default, must be defined in range [0,1]). -#@cli : (no arg) runs interactive mode (uses the instant display window [0] if opened). #@cli : Default values: 'interpolation=1', 'boundary_conditions=0' and 'ax=ay=az=ac=0'. #@cli : $ image.jpg (0,1;0,1^0,0;1,1^1,1;1,1) resize[-1] [-2],3 mul[-2] [-1] -#@cli : $ image.jpg +resize[-1] 256,128,1,3,2 +resize[-1] 120%,120%,1,3,0,1,0.5,0.5 +resize[-1] 120%,120%,1,3,0,0,0.2,0.2 +resize[-1] [0],[0],1,3,4 +#@cli : $ image.jpg +resize[-1] 256,128,1,3,2 +resize[-1] 120%,120%,1,3,0,1,0.5,0.5 \ +# +resize[-1] 120%,120%,1,3,0,0,0.2,0.2 +resize[-1] [0],[0],1,3,4 #@cli resize_mn : width[%]>=0,_height[%]>=0,_depth[%]>=0,_B_value,_C_value #@cli : Resize selected images with Mitchell-Netravali filter (cubic). @@ -8438,7 +11763,6 @@ #@cli : $ image.jpg resize2dx 32 resize_mn 800%,800% resize_mn : check "${2=100%}>=0 && ${3=100%}>=0" skip "${4=0.333},${5=0.333}" e[^-1] "Resize image$? to $1x$2x$3 using Mitchell-Netravali filter (B=$4, C=$5)." - v - lib="const B = $4; const C = $5; const boundary = 1; const interp = 0; mn(P0,P1,P2,P3,d) = ( ( (-B/6-C)*P0 + (-3*B/2-C+2)*P1 + (3*B/2+C-2)*P2 + (B/6+C)*P3 )*d^3 + ( (B/2+2*C)*P0 + (2*B+C-3)*P1 + (-5*B/2-2*C+3)*P2 -C*P3)*d^2 @@ -8448,25 +11772,34 @@ nw={${"is_percent $1"}?max(1,round($1*w)):round($1)} nh={${"is_percent $2"}?max(1,round($2*h)):round($2)} nd={${"is_percent $3"}?max(1,round($3*d)):round($3)} - if {!$nw" || "!$nh" || "!$nd} rm 0 - elif {!w} rm $nw,$nh,$nd,1 + if !$nw" || "!$nh" || "!$nd rm 0 + elif !w rm $nw,$nh,$nd,1 else - if {w==1||$nww} $nw,100%,100%,100%,${lib}"X = x*(w#-1-1)/(w-1); d = X - int(X); P0 = I(#-1,X-1); P1 = I(#-1,X); P2 = I(#-1,X+1); P3 = I(#-1,X+2); mn(P0,P1,P2,P3,d);" k. - fi - if {h==1||$nhw + $nw,100%,100%,100%,${lib}"X = x*(w#-1-1)/(w-1); d = X - int(X); P0 = I(#-1,X-1); P1 = I(#-1,X); + P2 = I(#-1,X+1); P3 = I(#-1,X+2); mn(P0,P1,P2,P3,d);" k. + fi + if h==1||$nh=-1 && $1<=6" skip ${2=0},${3=0},${4=0},${5=0},${6=0} e[^-1] "Resize image$? so that each dimension is a power of 2." - v - repeat $! + repeat $! r[$>] {$>,2^(round(log2(w),1,1))},{$>,2^(round(log2(h),1,1))},{$>,2^(round(log2(d),1,1))},100%,${1-6} - done v + + done #@cli rr2d : eq. to 'resize_ratio2d'. rr2d : - v - _gmic_s="$?" v + - _resize_ratio2d $* + _gmic_s="$?" v + _resize_ratio2d $* #@cli resize_ratio2d : width>0,height>0,_mode={ 0=inside | 1=outside | 2=padded },0=<_interpolation<=6 #@cli : Resize selected images while preserving their aspect ratio. #@cli : (eq. to 'rr2d'). #@cli : Default values: 'mode=0' and 'interpolation=6'. resize_ratio2d : - v - _gmic_s="$?" v + - _$0 $* + _gmic_s="$?" v + _$0 $* _resize_ratio2d : check "$1>0 && $2>0 && ${3=0}>=0 && $3<=2 && ${4=6}>=0 && $4<=6" e[0--3] "Resize 2D image"$_gmic_s" to $1x$2 with ratio-"${arg\ 1+$3,inside,outside,padded}\ " mode and interpolation type $4." - v - repeat $! + repeat $! ratio={$>,if($3==1,max($1/w,$2/h),min($1/w,$2/h))} r[$>] {$>,w*$ratio},{$>,h*$ratio},100%,100%,$4 done - if {$3==2} r $1,$2,100%,100%,0,0,0.5,0.5 fi - v + + if $3==2 r $1,$2,100%,100%,0,0,0.5,0.5 fi + #@cli r2dx : eq. to 'resize2dx'. r2dx : - v - _gmic_s="$?" v + - _resize2dx $* + _gmic_s="$?" v + _resize2dx $* #@cli resize2dx : width[%]>0,_interpolation,_boundary_conditions,_ax,_ay,_az,_ac #@cli : Resize selected images along the x-axis, preserving 2D ratio. #@cli : (eq. to 'r2dx').\n -#@cli : 'interpolation' can be { -1=none (memory content) | 0=none | 1=nearest | 2=average | 3=linear | 4=grid | 5=bicubic | 6=lanczos }. +#@cli : 'interpolation' can be { -1=none (memory content) | 0=none | 1=nearest | 2=average | 3=linear | \ +# 4=grid | 5=bicubic | 6=lanczos }. #@cli : 'boundary_conditions' has different meanings, according to the chosen 'interpolation' mode : #@cli : . When 'interpolation=={ -1 | 1 | 2 | 4 }', 'boundary_conditions' is meaningless. #@cli : . When 'interpolation==0', 'boundary_conditions' can be { 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }. @@ -8522,25 +11853,25 @@ #@cli : Default values: 'interpolation=3', 'boundary_conditions=0' and 'ax=ay=az=ac=0'. #@cli : $ image.jpg +resize2dx 100,2 append x resize2dx : - v - _gmic_s="$?" v + - _$0 $* + _gmic_s="$?" v + _$0 $* -_resize2dx : check "$1>0 && ${2=3}>=0 && $2<=6 && ${3=0}>=0 && $3<=3 && ${4=0}>=0 && $4<=1 && ${5=0}>=0 && $5<=1 && ${6=0}>=0 && $6<=1 && ${7=0}>=0 && $7<=1" +_resize2dx : check "$1>0 && ${2=3}>=0 && $2<=6 && ${3=0}>=0 && $3<=3 && ${4=0}>=0 && $4<=1 && ${5=0}>=0 && $5<=1 && + ${6=0}>=0 && $6<=1 && ${7=0}>=0 && $7<=1" e[0--3] "Resize 2D image"$_gmic_s" to $1 pixels along the x-axis, preserving 2D ratio." - v - repeat $! l[$>] + repeat $! l[$>] size={if(${is_percent\ $1},$1*w,$1)} r {max(1,$size)},{max(1,h*$size/w)},100%,100%,${2-7} - endl done v + + endl done #@cli r2dy : eq. to 'resize2dy'. r2dy : - v - _gmic_s="$?" v + - _resize2dy $* + _gmic_s="$?" v + _resize2dy $* #@cli resize2dy : height[%]>=0,_interpolation,_boundary_conditions,_ax,_ay,_az,_ac #@cli : Resize selected images along the y-axis, preserving 2D ratio. #@cli : (eq. to 'r2dy').\n -#@cli : 'interpolation' can be { -1=none (memory content) | 0=none | 1=nearest | 2=average | 3=linear | 4=grid | 5=bicubic | 6=lanczos }. +#@cli : 'interpolation' can be { -1=none (memory content) | 0=none | 1=nearest | 2=average | 3=linear | \ +# 4=grid | 5=bicubic | 6=lanczos }. #@cli : 'boundary_conditions' has different meanings, according to the chosen 'interpolation' mode : #@cli : . When 'interpolation=={ -1 | 1 | 2 | 4 }', 'boundary_conditions' is meaningless. #@cli : . When 'interpolation==0', 'boundary_conditions' can be { 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }. @@ -8550,25 +11881,25 @@ #@cli : Default values: 'interpolation=3', 'boundary_conditions=0' and 'ax=ay=az=ac=0'. #@cli : $ image.jpg +resize2dy 100,2 append x resize2dy : - v - _gmic_s="$?" v + - _$0 $* + _gmic_s="$?" v + _$0 $* -_resize2dy : check "$1>=0 && ${2=3}>=0 && $2<=6 && ${3=0}>=0 && $3<=3 && ${4=0}>=0 && $4<=1 && ${5=0}>=0 && $5<=1 && ${6=0}>=0 && $6<=1 && ${7=0}>=0 && $7<=1" +_resize2dy : check "$1>=0 && ${2=3}>=0 && $2<=6 && ${3=0}>=0 && $3<=3 && ${4=0}>=0 && $4<=1 && ${5=0}>=0 && $5<=1 && + ${6=0}>=0 && $6<=1 && ${7=0}>=0 && $7<=1" e[0--3] "Resize 2D image"$_gmic_s" to $1 pixels along the y-axis, preserving 2D ratio." - v - repeat $! l[$>] + repeat $! l[$>] size={if(${is_percent\ $1},$1*h,$1)} r {max(1,w*$size/h)},{max(1,$size)},100%,100%,${2-7} - endl done v + + endl done #@cli r3dx : eq. to 'resize3dx'. r3dx : - v - _gmic_s="$?" v + - _resize3dx $* + _gmic_s="$?" v + _resize3dx $* #@cli resize3dx : width[%]>0,_interpolation,_boundary_conditions,_ax,_ay,_az,_ac #@cli : Resize selected images along the x-axis, preserving 3D ratio. #@cli : (eq. to 'r3dx').\n -#@cli : 'interpolation' can be { -1=none (memory content) | 0=none | 1=nearest | 2=average | 3=linear | 4=grid | 5=bicubic | 6=lanczos }. +#@cli : 'interpolation' can be { -1=none (memory content) | 0=none | 1=nearest | 2=average | 3=linear | \ +# 4=grid | 5=bicubic | 6=lanczos }. #@cli : 'boundary_conditions' has different meanings, according to the chosen 'interpolation' mode : #@cli : . When 'interpolation=={ -1 | 1 | 2 | 4 }', 'boundary_conditions' is meaningless. #@cli : . When 'interpolation==0', 'boundary_conditions' can be { 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }. @@ -8577,25 +11908,25 @@ #@cli : (set to '0' by default, must be defined in range [0,1]). #@cli : Default values: 'interpolation=3', 'boundary_conditions=0' and 'ax=ay=az=ac=0'. resize3dx : - v - _gmic_s="$?" v + - _$0 $* + _gmic_s="$?" v + _$0 $* -_resize3dx : check "$1>0 && ${2=3}>=0 && $2<=6 && ${3=0}>=0 && $3<=3 && ${4=0}>=0 && $4<=1 && ${5=0}>=0 && $5<=1 && ${6=0}>=0 && $6<=1 && ${7=0}>=0 && $7<=1" +_resize3dx : check "$1>0 && ${2=3}>=0 && $2<=6 && ${3=0}>=0 && $3<=3 && ${4=0}>=0 && $4<=1 && ${5=0}>=0 && $5<=1 && + ${6=0}>=0 && $6<=1 && ${7=0}>=0 && $7<=1" e[0--3] "Resize 3D image"$_gmic_s" to $1 pixels along the x-axis, preserving 3D ratio." - v - repeat $! l[$>] + repeat $! l[$>] size={if(${is_percent\ $1},$1*w,$1)} r {max(1,$size)},{max(1,h*$size/w)},{max(1,d*$size/w)},100%,${2-7} - endl done v + + endl done #@cli r3dy : eq. to 'resize3dy'. r3dy : - v - _gmic_s="$?" v + - _resize3dy $* + _gmic_s="$?" v + _resize3dy $* #@cli resize3dy : height[%]>0,_interpolation,_boundary_conditions,_ax,_ay,_az,_ac #@cli : Resize selected images along the y-axis, preserving 3D ratio. #@cli : (eq. to 'r3dy').\n -#@cli : 'interpolation' can be { -1=none (memory content) | 0=none | 1=nearest | 2=average | 3=linear | 4=grid | 5=bicubic | 6=lanczos }. +#@cli : 'interpolation' can be { -1=none (memory content) | 0=none | 1=nearest | 2=average | 3=linear | \ +# 4=grid | 5=bicubic | 6=lanczos }. #@cli : 'boundary_conditions' has different meanings, according to the chosen 'interpolation' mode : #@cli : . When 'interpolation=={ -1 | 1 | 2 | 4 }', 'boundary_conditions' is meaningless. #@cli : . When 'interpolation==0', 'boundary_conditions' can be { 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }. @@ -8604,25 +11935,25 @@ #@cli : (set to '0' by default, must be defined in range [0,1]). #@cli : Default values: 'interpolation=3', 'boundary_conditions=0' and 'ax=ay=az=ac=0'. resize3dy : - v - _gmic_s="$?" v + - _$0 $* + _gmic_s="$?" v + _$0 $* -_resize3dy : check "$1>0 && ${2=3}>=0 && $2<=6 && ${3=0}>=0 && $3<=3 && ${4=0}>=0 && $4<=1 && ${5=0}>=0 && $5<=1 && ${6=0}>=0 && $6<=1 && ${7=0}>=0 && $7<=1" +_resize3dy : check "$1>0 && ${2=3}>=0 && $2<=6 && ${3=0}>=0 && $3<=3 && ${4=0}>=0 && $4<=1 && ${5=0}>=0 && $5<=1 && + ${6=0}>=0 && $6<=1 && ${7=0}>=0 && $7<=1" e[0--3] "Resize 3D image"$_gmic_s" to $1 pixels along the y-axis, preserving 3D ratio." - v - repeat $! l[$>] + repeat $! l[$>] size={if(${is_percent\ $1},$1*h,$1)} r {max(1,w*$size/h)},{max(1,$size)},{max(1,d*$size/h)},100%,${2-7} - endl done v + + endl done #@cli r3dz : eq. to 'resize3dz'. r3dz : - v - _gmic_s="$?" v + - _resize3dz $* + _gmic_s="$?" v + _resize3dz $* #@cli resize3dz : depth[%]>0,_interpolation,_boundary_conditions,_ax,_ay,_az,_ac #@cli : Resize selected images along the z-axis, preserving 3D ratio. #@cli : (eq. to 'r3dz').\n -#@cli : 'interpolation' can be { -1=none (memory content) | 0=none | 1=nearest | 2=average | 3=linear | 4=grid | 5=bicubic | 6=lanczos }. +#@cli : 'interpolation' can be { -1=none (memory content) | 0=none | 1=nearest | 2=average | 3=linear | \ +# 4=grid | 5=bicubic | 6=lanczos }. #@cli : 'boundary_conditions' has different meanings, according to the chosen 'interpolation' mode : #@cli : . When 'interpolation=={ -1 | 1 | 2 | 4 }', 'boundary_conditions' is meaningless. #@cli : . When 'interpolation==0', 'boundary_conditions' can be { 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }. @@ -8631,17 +11962,18 @@ #@cli : (set to '0' by default, must be defined in range [0,1]). #@cli : Default values: 'interpolation=3', 'boundary_conditions=0' and 'ax=ay=az=ac=0'. resize3dz : - v - _gmic_s="$?" v + - _$0 $* + _gmic_s="$?" v + _$0 $* -_resize3dz : check "$1>0 && ${2=3}>=0 && $2<=6 && ${3=0}>=0 && $3<=3 && ${4=0}>=0 && $4<=1 && ${5=0}>=0 && $5<=1 && ${6=0}>=0 && $6<=1 && ${7=0}>=0 && $7<=1" +_resize3dz : check "$1>0 && ${2=3}>=0 && $2<=6 && ${3=0}>=0 && $3<=3 && ${4=0}>=0 && $4<=1 && ${5=0}>=0 && $5<=1 && + ${6=0}>=0 && $6<=1 && ${7=0}>=0 && $7<=1" e[0--3] "Resize 3D image"$_gmic_s" to $1 pixels along the z-axis, preserving 3D ratio." - v - repeat $! l[$>] + repeat $! l[$>] size={if(${is_percent\ $1},$1*d,$1)} r[$>] {max(1,w*$size/d)},{max(1,h*$size/d)},{max(1,$size)},100%,${2-7} - endl done v + + endl done -#@cli rotate : angle,_interpolation,_boundary_conditions,_center_x[%],_center_y[%] : u,v,w,angle,interpolation,boundary_conditions,_center_x[%],_center_y[%],_center_z[%] : (+) +#@cli rotate : angle,_interpolation,_boundary_conditions,_center_x[%],_center_y[%] : \ +# u,v,w,angle,interpolation,boundary_conditions,_center_x[%],_center_y[%],_center_z[%] : (+) #@cli : Rotate selected images with specified angle (in deg.), and optionally 3D axis (u,v,w). #@cli : 'interpolation' can be { 0=none | 1=linear | 2=bicubic }. #@cli : 'boundary_conditions' can be { 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }. @@ -8655,19 +11987,19 @@ #@cli : Default values: 'max_size_factor=8'. rotate_tileable : check ${2=8}>=0 e[^-1] "Rotate image$? with angle $1 deg. and make them tileable." - v - # Reduce angle to known fraction. angle={$1%360} - if {$angle>=270} rotate 270 angle-=270 - elif {$angle>=180} rotate 180 angle-=180 - elif {$angle>=90} rotate 90 angle-=90 + if $angle>=270 rotate 270 angle-=270 + elif $angle>=180 rotate 180 angle-=180 + elif $angle>=90 rotate 90 angle-=90 fi - (0,1;1,8;1,7;1,6;1,5;1,4;1,5;1,3;2,5;1,2;2,5;3,5;2,3;3,4;4,5;1,1;5,4;7,5;3,2;8,5;9,5;2,1;3,1;4,1;5,1;6,1;7,1;8,1) # List of known fractions. + # List of known fractions. + (0,1;1,8;1,7;1,6;1,5;1,4;1,5;1,3;2,5;1,2;2,5;3,5;2,3;3,4;4,5;1,1;5,4;7,5;3,2;8,5;9,5;2,1;3,1;4,1;5,1;6,1;7,1;8,1) s. x,2 +/[-2,-1] atan. *. {180/pi} # Compute corresponding angles. ($angle) index. .. rm.. p={-3,@{^}} q={-2,@{^}} rm[-3--1] # Find nearest fraction p/q to atan(angle). - if {!$p||!$q} v + return fi + if !$p||!$q return fi repeat $! l[$>] # Compute width and height of tile. @@ -8680,13 +12012,13 @@ nh={round($qh*h/cos($theta))} # Rotate and make tileable (may result in very large images!). - if {!$2" || "($nw<$2*w" && "$nh<$2*h)} + if !$2" || "($nw<$2*w" && "$nh<$2*h) r {1.5*$nw},{1.5*$nh},1,100%,0,2 rotate {$theta*180/pi},1,2,50%,50% r $nw,$nh,1,100%,0,2,0.5,0.5 - else v + error[0--4] "Command '$0': Invalid image dimension "({w},{h},{d},{s}). + else error[0--4] "Command '$0': Invalid image dimension "({w},{h},{d},{s}). fi - endl done v + + endl done #@cli rows : { [image0] | y0[%] },_{ [image1] | y1[%] } : (+) #@cli : Keep only specified rows of selected images. @@ -8698,27 +12030,31 @@ #@cli : $ image.jpg threshold 50% resize 50%,50% +scale2x scale2x : e[^-1] "Double xy-dimensions of image$?, using Scale2x algorithm." - v - repeat $! l[$>] + repeat $! l[$>] r 200%,200% - f "dx=x&1;dy=y&1;A=j(0,-2,0,0,0,1);B=j(2,0,0,0,0,1);C=j(-2,0,0,0,0,1);D=j(0,2,0,0,0,1);"\ - "!dy*(!dx*if(C==A&&C!=D&&A!=B,A,i) + dx*if(A==B&&A!=C&&B!=D,B,i)) + dy*(dx*if(B==D&&B!=A&&D!=C,D,i) + !dx*if(D==C&&D!=B&&C!=A,C,i))" - endl done v + + f "dx=x&1;dy=y&1;A=j(0,-2,0,0,0,1);B=j(2,0,0,0,0,1);C=j(-2,0,0,0,0,1);D=j(0,2,0,0,0,1); + !dy*(!dx*if(C==A&&C!=D&&A!=B,A,i) + dx*if(A==B&&A!=C&&B!=D,B,i)) + + dy*(dx*if(B==D&&B!=A&&D!=C,D,i) + !dx*if(D==C&&D!=B&&C!=A,C,i))" + endl done #@cli scale3x #@cli : Resize selected images using the Scale3x algorithm. #@cli : $ image.jpg threshold 50% resize 33%,33% +scale3x scale3x : e[^-1] "Triple xy-dimensions of image$?, using Scale3x algorithm." - v - repeat $! l[$>] + repeat $! l[$>] r 300%,300% - f "dx=x%3;dy=y%3;c0=!dx;c1=(dx==1);c2=(dx==2);"\ - "A=j(-3,-3,0,0,0,1);B=j(0,-3,0,0,0,1);C=j(3,-3,0,0,0,1);"\ - "D=j(-3,0,0,0,0,1);F=j(3,0,0,0,0,1);"\ - "G=j(-3,3,0,0,0,1);H=j(0,3,0,0,0,1);I=j(3,3,0,0,0,1);"\ - "!dy*(c0*if(D==B&&D!=H&&B!=F,D,i) + c1*if((D==B&&D!=H&&B!=F&&i!=C)||(B==F&&B!=D&&F!=H&&i!=A),B,i) + c2*if(B==F&&B!=D&&F!=H,F,i)) + "\ - "(dy==1)*(c0*if((H==D&&H!=F&&D!=B&&i!=A)||(D==B&&D!=H&&B!=F&&i!=G),D,i) + c1*i + c2*if((B==F&&B!=D&&F!=H&&i!=I)||(F==H&&F!=B&&H!=D&&i!=C),F,i)) + "\ - "(dy==2)*(c0*if(H==D&&H!=F&&D!=B,D,i) + c1*if((F==H&&F!=B&&H!=D&&i!=G)||(H==D&&H!=F&&D!=B&&i!=I),H,i) + c2*if(F==H&&F!=B&&H!=D,F,i))" - endl done v + + f "dx=x%3;dy=y%3;c0=!dx;c1=(dx==1);c2=(dx==2); + A=j(-3,-3,0,0,0,1);B=j(0,-3,0,0,0,1);C=j(3,-3,0,0,0,1); + D=j(-3,0,0,0,0,1);F=j(3,0,0,0,0,1); + G=j(-3,3,0,0,0,1);H=j(0,3,0,0,0,1);I=j(3,3,0,0,0,1); + !dy*(c0*if(D==B&&D!=H&&B!=F,D,i) + c1*if((D==B&&D!=H&&B!=F&&i!=C)||(B==F&&B!=D&&F!=H&&i!=A),B,i) + + c2*if(B==F&&B!=D&&F!=H,F,i)) + + (dy==1)*(c0*if((H==D&&H!=F&&D!=B&&i!=A)||(D==B&&D!=H&&B!=F&&i!=G),D,i) + c1*i + + c2*if((B==F&&B!=D&&F!=H&&i!=I)||(F==H&&F!=B&&H!=D&&i!=C),F,i)) + + (dy==2)*(c0*if(H==D&&H!=F&&D!=B,D,i) + c1*if((F==H&&F!=B&&H!=D&&i!=G)||(H==D&&H!=F&&D!=B&&i!=I),H,i) + + c2*if(F==H&&F!=B&&H!=D,F,i))" + endl done #@cli scale_dcci2x : _edge_threshold>=0,_exponent>0,_extend_1px={ 0=false | 1=true } #@cli : Double image size using directional cubic convolution interpolation, @@ -8727,7 +12063,7 @@ #@cli : $ image.jpg +scale_dcci2x , scale_dcci2x : check "${1=1.15}>=0 && ${2=5}>=0" skip ${3=0} e[^-1] "Double xy-dimensions of image$?, using DCCI2x algorithm." - v - repeat $! l[$>] + repeat $! l[$>] r {2*w-(!$3)},{2*h-(!$3)},1,100%,4 # Estimate diagonal values. @@ -8746,13 +12082,14 @@ ])); ); if (!((x*y)%2),i, - P = crop(x - 3,y - 3,0,c,7,7,1,1); + ref(crop(x - 3,y - 3,0,c,7,7,1,1),P); d1 = d(j1); d2 = d(j2); ratio = (1 + d1)/(1 + d2); value = ratio>threshold ? interp(j1): # Up-right edge ratio<(1/threshold) ? interp(j2): # Down-right edge - (w1 = 1/(1 + d1^exponent); w2 = 1/(1 + d2^exponent); (interp(j1)*w1 + interp(j2)*w2)/(w1 + w2)); # Smooth area + (w1 = 1/(1 + d1^exponent); w2 = 1/(1 + d2^exponent); + (interp(j1)*w1 + interp(j2)*w2)/(w1 + w2)); # Smooth area value/=16)" # Estimate remaining values. @@ -8773,80 +12110,32 @@ ])); ); if ((x%2) + (y%2)!=1,i, - P = crop(x - 3,y - 3,0,c,7,7,1,1); + ref(crop(x - 3,y - 3,0,c,7,7,1,1),P); d1 = d(j1); d2 = d(j2); ratio = (1 + d1)/(1 + d2); value = ratio>threshold ? interp(j1) : # Horizontal edge ratio<(1/threshold) ? interp(j2) : # Vertical edge - (w1 = 1/(1 + d1^exponent); w2 = 1/(1 + d2^exponent); (interp(j1)*w1 + interp(j2)*w2)/(w1 + w2)); # Smooth area + (w1 = 1/(1 + d1^exponent); w2 = 1/(1 + d2^exponent); + (interp(j1)*w1 + interp(j2)*w2)/(w1 + w2)); # Smooth area value/=16)" - endl done v + - -###### Old version: Original code by Garagecoder (Andy Kelday) -scale_dcci2x_old : check "${1=1.15}>=0 && ${2=5}>=0" skip ${3=0} - e[^-1] "Double xy-dimensions of image$?, using DCCI2x algorithm." - v - repeat $! l[$>] - a={-1/16} b={9/16} whd={w},{h},{d} s={s} - # d1, d2 (sum of diagonal absolute gradients) - (0,-1,0;1,0,0;0,0,0) +convolve[0] [1] mirror[1] x +convolve[0] [1] rm[1] abs[^0] - 3,3,1,1,1 convolve[-3,-2] . rm. r[-2,-1] $whd,1,2 r[-2,-1] $whd,$s - - # calc all possible interpolated output [diagonal] - ($a,$b,$b,$a,0) diagonal. +convolve[0] . mirror.. x shift.. -1,0 +convolve[0] .. rm... - ++[1,2] 1 /[-2,-1] # edge comparison mask (1 + d1) / (1 + d2) - _scale_dcci2x_smooth[-5,-4] ...,..,$2 _scale_dcci2x_mask[-4--1] $1 - - # d1, d2 (sum of h/v absolute gradients) - +g[0] x,-1 +g[0] y,1 +g[1] xy,-1 abs[-4--1] - (1,1,0;1,1,0;0,0,0) convolve[-5] . rm. (1,1,1) convolve[-4] . rm. - (1;1;1) convolve... . rm. (0,1,1;0,1,1;0,0,0) convolve.. . rm. - +[-3,-1] +[-3,-1] r[-2,-1] $whd,1,2 r[-2,-1] $whd,$s - - # calc all possible interpolated output [h/v] - ($a;$b;$b;$a;0) +convolve[0] . rm.. (0,$a,$b,$b,$a) +convolve[1] . rm.. - ++[2,3] 1 /[-2,-1] # edge comparison mask (1 + d1) / (1 + d2) - _scale_dcci2x_smooth[-5,-4] ...,..,$2 _scale_dcci2x_mask[-4--1] $1 - - # d1, d2 (sum of h/v absolute gradients) - +g[0] x,1 +g[0] y,-1 +g[1] xy,-1 abs[-4--1] - (1;1;1) convolve[-5] . rm. (1,1,0;1,1,0;0,0,0) convolve[-4] . rm. - (0,0,0;1,1,0;1,1,0) convolve... . rm. (1,1,1) convolve.. . rm. - +[-3,-1] +[-3,-1] r[-2,-1] $whd,1,2 r[-2,-1] $whd,$s - - # calc all possible interpolated output [h/v] - (0;$a;$b;$b;$a) +convolve[1] . rm.. ($a,$b,$b,$a,0) +convolve[0] . rm.. - ++[3,4] 1 /[-2,-1] # edge comparison mask (1 + d1) / (1 + d2) - _scale_dcci2x_smooth[-5,-4] ...,..,$2 _scale_dcci2x_mask[-4--1] $1 - - # resize and distribute pixels - r2dx 200%,4 shift[1] 1,1 shift[2] 0,1 shift[3] 1 + - if {!$3} r {w-1},{h-1},100%,100%,0 fi - endl done v + - -_scale_dcci2x_smooth : skip ${3=5} - # calculate interpolated output for smooth areas - ^[0,1] $3 +[0,1] 1 ++[0,1] /[0,1] . rm. # weights - pass$1 pass$2 *[0,-2] *[1,-1] +[0,1] # smooth - -_scale_dcci2x_mask : skip ${1=1.15} - # combine edge mask with interp outputs - +<. {1/$1} >.. $1 *[-4] .. *... . - or[-2,-1] not. *[-4,-1] +[-3--1] + endl done -#@cli seamcarve : _width[%]>=0,_height[%]>=0,_is_priority_channel={ 0 | 1 },_is_antialiasing={ 0 | 1 },_maximum_seams[%]>=0 +#@cli seamcarve : _width[%]>=0,_height[%]>=0,_is_priority_channel={ 0 | 1 },_is_antialiasing={ 0 | 1 },\ +# _maximum_seams[%]>=0 #@cli : Resize selected images with specified 2D geometry, using the seam-carving algorithm. #@cli : Default values: 'height=100%', 'is_priority_channel=0', 'is_antialiasing=1' and 'maximum_seams=25%'. #@cli : $ image.jpg seamcarve 60% # The main code of this algorithm has been done by Andy (Garagecoder). seamcarve : check "${2=100%}>=0 && ${5=25%}>=0" skip ${3=0},${4=1} - e[^-1] "Resize image$? to $1x$2 using seam-carving algorithm, "${arg\ 1+!$3,with,without}" priority channel, "${arg\ 1+!$4,with,without}" anti-aliasing and maximum seams $5." - v - repeat $! l[$>] + e[^-1] "Resize image$? to $1x$2 using seam-carving algorithm, "${arg\ 1+!$3,with,without}" priority channel, "\ + ${arg\ 1+!$4,with,without}" anti-aliasing and maximum seams $5." + repeat $! l[$>] nw={max(1,round(if(${is_percent\ $1},$1*w,$1)))} nh={max(1,round(if(${is_percent\ $2},$2*h,$2)))} - if {$nw!=w} _seamcarve $nw,$3,$4,$5 fi - if {$nh!=h} transpose _seamcarve $nh,$3,$4,$5 transpose fi - endl done v + + if $nw!=w _seamcarve $nw,$3,$4,$5 fi + if $nh!=h transpose _seamcarve $nh,$3,$4,$5 transpose fi + endl done # Subroutine to remove/add vertical seams/ # $1 = desired width. @@ -8869,7 +12158,7 @@ # Calculate low matrix (backwards propagation). . - repeat {h} + repeat h +rows. {$<+1} erode. 3 j.. .,0,$<,0,0,-1 rm. done @@ -8878,7 +12167,7 @@ 100%,100% +rows[1] 0 nm[1] grad nm[2] low nm[3] seam nm[4] top - repeat {0,h-1} nr={$>+1} + repeat h#0-1 nr={$>+1} +rows[low] $nr # Find optimum matches between two 1D matrices. @@ -8904,10 +12193,10 @@ f. "0} # Add seams. + if $ssms<0 * discard 0 r {$w-$sms},$h,1,$s,-1 # Remove seams. + elif $ssms>0 # Add seams. -. 2 s[0] c - repeat $s if {$><($s-1)} . fi a[$>,-1] c done + repeat $s if $><($s-1) . fi a[$>,-1] c done permute cxyz a c discard -1 f "if(i<0,j(0,-1),i)" r {$w+$sms},$h,1,$s,-1 fi @@ -8920,11 +12209,11 @@ fi rprogress {a=w/$1;if(a<1,a*100,100/a)} - while {w!=$1} + while w!=$1 #@cli shift : vx[%],_vy[%],_vz[%],_vc[%],_boundary_conditions,_interpolation={ 0=nearest_neighbor | 1=linear } : (+) #@cli : Shift selected images by specified displacement vector. -#@cli : Displacement vector can be non-integer in which case linear interpolation of the shift is computed. +#@cli : Displacement vector can be non-integer in which case linear interpolation should be chosen. #@cli : 'boundary_conditions' can be { 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }. #@cli : Default value: 'boundary_conditions=0' and 'interpolation=0'. #@cli : $ image.jpg +shift[0] 50%,50%,0,0,0 +shift[0] 50%,50%,0,0,1 +shift[0] 50%,50%,0,0,2 @@ -8934,33 +12223,33 @@ #@cli : $ image.jpg shrink_x 30 shrink_x : check "$1>=0" e[^-1] "Shrink image$? along the x-axis with size $1." - v - repeat $! z[$>] $1,{$>,w-$1-1} done v + + repeat $! z[$>] $1,{$>,w-$1-1} done #@cli shrink_xy : size>=0 #@cli : Shrink selected images along the xy-axes. #@cli : $ image.jpg shrink_xy 30 shrink_xy : check "$1>=0" e[^-1] "Shrink image$? along the xy-axes with size $1." - v - repeat $! z[$>] $1,$1,{$>,w-$1-1},{$>,h-$1-1} done v + + repeat $! z[$>] $1,$1,{$>,w-$1-1},{$>,h-$1-1} done #@cli shrink_xyz : size>=0 #@cli : Shrink selected images along the xyz-axes. shrink_xyz : check "$1>=0" e[^-1] "Shrink image$? along the xyz-axes with size $1." - v - repeat $! z[$>] $1,$1,$1,{$>,w-$1-1},{$>,h-$1-1},{$>,d-$1-1} done v + + repeat $! z[$>] $1,$1,$1,{$>,w-$1-1},{$>,h-$1-1},{$>,d-$1-1} done #@cli shrink_y : size_y>=0 #@cli : Shrink selected images along the y-axis. #@cli : $ image.jpg shrink_y 30 shrink_y : check "$1>=0" e[^-1] "Shrink image$? along the y-axis with size $1." - v - repeat $! z[$>] 0,$1,100%,{$>,h-$1-1} done v + + repeat $! z[$>] 0,$1,100%,{$>,h-$1-1} done #@cli shrink_z : size_z>=0 #@cli : Shrink selected images along the z-axis. shrink_z : check "$1>=0" e[^-1] "Shrink image$? along the z-axis with size $1." - v - repeat $! z[$>] 0,0,$1,100%,100%,{$>,d-$1-1} done v + + repeat $! z[$>] 0,0,$1,100%,100%,{$>,d-$1-1} done #@cli slices : { [image0] | z0[%] },_{ [image1] | z1[%] } : (+) #@cli : Keep only specified slices of selected images. @@ -8975,10 +12264,13 @@ #@cli s : eq. to 'split'. : (+) -#@cli split : { x | y | z | c }...{ x | y | z | c },_split_mode : keep_splitting_values={ + | - },_{ x | y | z | c }...{ x | y | z | c },value1,_value2,... : (no arg) : (+) -#@cli : Split selected images along specified axes, or regarding to a sequence of scalar values (optionally along specified axes too). +#@cli split : { x | y | z | c }...{ x | y | z | c },_split_mode : \ +# keep_splitting_values={ + | - },_{ x | y | z | c }...{ x | y | z | c },value1,_value2,... : (no arg) : (+) +#@cli : Split selected images along specified axes, or regarding to a sequence of scalar values +#@cli : (optionally along specified axes too). #@cli : (eq. to 's').\n -#@cli : 'split_mode' can be { 0=split according to constant values | >0=split in N parts | <0=split in parts of size -N }. +#@cli : 'split_mode' can be { 0=split according to constant values | >0=split in N parts | \ +# <0=split in parts of size -N }. #@cli : Default value: 'split_mode=-1'. #@cli : $ image.jpg split c #@cli : $ image.jpg split y,3 @@ -8995,7 +12287,7 @@ if $3 e[^-1] "Split image$? as a $1x$2 array of homogeneous tiles." else e[^-1] "Split image$? as a $1x$2 array of tiles." fi - v - repeat $! l[$<] s y,$2 s x,$1 if $3 r [0],[0],100%,100%,0 fi endl done v + + repeat $! l[$<] s y,$2 s x,$1 if $3 r [0],[0],100%,100%,0 fi endl done #@cli undistort : -1<=_amplitude<=1,_aspect_ratio,_zoom,_center_x[%],_center_y[%],_boundary_conditions #@cli : Correct barrel/pincushion distortions occurring with wide-angle lens. @@ -9003,10 +12295,12 @@ #@cli : [1] Zhang Z. (1999). Flexible camera calibration by viewing a plane from unknown orientation. #@cli : [2] Andrew W. Fitzgibbon (2001). Simultaneous linear estimation of multiple view geometry and lens distortion. #@cli : 'boundary_conditions' can be { 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }. -#@cli : Default values: 'amplitude=0.25', 'aspect_ratio=0', 'zoom=0', 'center_x=center_y=50%' and 'boundary_conditions=0'. +#@cli : Default values: 'amplitude=0.25', 'aspect_ratio=0', 'zoom=0', 'center_x=center_y=50%' \ +# and 'boundary_conditions=0'. undistort : check "${1=0.1}>=-1 && $1<=1 && ${6=0}>=0 && $6<=3" skip ${2=0},${3=0},${4=50%},${5=50%} - e[^-1] "Undistort barrel/pincushion effect in image$?, with amplitude $1, aspect ratio $2, zoom factor $3, center ($4,$5) and "${"arg 1+$6,dirichlet,neumann,periodic,mirror"}" boundary conditions." - v - repeat $! l[$>] + e[^-1] "Undistort barrel/pincushion effect in image$?, with amplitude $1, aspect ratio $2, zoom factor $3, + center ($4,$5) and "${"arg 1+$6,dirichlet,neumann,periodic,mirror"}" boundary conditions." + repeat $! l[$>] center_x={${"is_percent $4"}?w*$4:$4} center_y={${"is_percent $5"}?h*$5:$5} f " @@ -9029,7 +12323,7 @@ x = 0.5*nx*ratio*M + center_x; y = 0.5*ny*M + center_y; I(x,y)" - endl done v + + endl done #@cli y : eq. to 'unroll'. : (+) @@ -9045,10 +12339,10 @@ #@cli : $ image.jpg resize2dy 100 +upscale_smart 500%,500% append x upscale_smart : skip ${2=100%},${3=100%} check "${4=2}>=0 && ${5=0.4}>=0 && $5<=1 && ${6=10}>=0" e[^-1] "Upscale image$? to $1x$2x$3, with smoothness $4, anisotropy $5 and sharpening $6." - v - repeat $! l[$>] + repeat $! l[$>] w={w} h={h} +r. $1,$2,$3,1,0 # Compute desired dimensions. - if {w<$w" && "h<$h} # Test for downscaling + if w<$w" && "h<$h # Test for downscaling rm. r. $1,$2,$3,100%,2 else rm. +diffusiontensors 0,$5,1.2,1.2 @@ -9056,7 +12350,7 @@ smooth.. .,$4 rm. ac "sharpen. $6,10",ycbcr_y fi - endl done v + + endl done #@cli warp : [warping_field],_mode,_interpolation,_boundary_conditions,_nb_frames>0 : (+) #@cli : Warp selected images with specified displacement field. @@ -9064,22 +12358,26 @@ #@cli : 'interpolation' can be { 0=nearest-neighbor | 1=linear | 2=cubic }. #@cli : 'boundary_conditions' can be { 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }. #@cli : Default values: 'mode=0', 'interpolation=1', 'boundary_conditions=1' and 'nb_frames=1'. -#@cli : $ image.jpg 100%,100%,1,2,'X=x/w-0.5;Y=y/h-0.5;R=(X*X+Y*Y)^0.5;A=atan2(Y,X);130*R*if(c==0,cos(4*A),sin(8*A))' warp[-2] [-1],1,1,0 quiver[-1] [-1],10,1,1,1,100 +#@cli : $ image.jpg 100%,100%,1,2,'X=x/w-0.5;Y=y/h-0.5;R=(X*X+Y*Y)^0.5;A=atan2(Y,X);130*R*if(c==0,cos(4*A),sin(8*A))' \ +# warp[-2] [-1],1,1,0 quiver[-1] [-1],10,1,1,1,100 #@cli : $$ #@cli warp_patch : [warping_field],patch_width>=1,_patch_height>=1,_patch_depth>=1,_std_factor>0,_boundary_conditions. #@cli : Patch-warp selected images, with specified 2D or 3D displacement field (in backward-absolute mode). -#@cli : Argument 'std_factor' sets the std of the gaussian weights for the patch overlap, equal to 'std = std_factor*patch_size'. +#@cli : Argument 'std_factor' sets the std of the gaussian weights for the patch overlap, +#@cli : equal to 'std = std_factor*patch_size'. #@cli : 'boundary_conditions' can be { 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }. #@cli : Default values: 'std_factor=0.3' and 'boundary_conditions=3'. -warp_patch : check ${is_image_arg\ $1}" && isint(${2=3}) && $2>=1 && isint(${3=$2}) && $3>=1 && isint(${4=1}) && $4>=1 && isval(${5=0.3}) && $5>0 && isint(${6=3}) && $6>=0 && $6<=3" - e[^-1] "Patch-warp image$? with backward-absolute displacement field $1, using $2x$3x$4 patches, std factor $5 and "${"arg 1+$6,dirichlet,neumann,periodic,mirror"}" boundary conditions." - v - if {$2<=1} pass$1 warp[^-1] .,0 rm. v + return fi +warp_patch : check ${is_image_arg\ $1}" && isint(${2=3}) && $2>=1 && isint(${3=$2}) && $3>=1 && + isint(${4=1}) && $4>=1 && isnum(${5=0.3}) && $5>0 && isint(${6=3}) && $6>=0 && $6<=3" + e[^-1] "Patch-warp image$? with backward-absolute displacement field $1, using $2x$3x$4 patches, std factor $5 + and "${"arg 1+$6,dirichlet,neumann,periodic,mirror"}" boundary conditions." + if $2<=1 pass$1 warp[^-1] .,0 rm. return fi repeat $! pass$1 l[$>,-1] [0],[0],[0],1,1 a[0,-1] c # Add weighting channel 100%,100%,100%,{0,s} - if {1,s>=3} # 3D version + if s#1>=3 # 3D version eval[1] "> begin( const pw = $2; @@ -9087,7 +12385,6 @@ const pd = $4; const stdf = $5; const boundary = $6; - const pw1 = int(pw/2); const pw2 = pw - pw1 - 1; const ph1 = int(ph/2); @@ -9095,10 +12392,11 @@ const pd1 = int(pd/2); const pd2 = pd - pd1 - 1; const pwhd = pw*ph*pd; + return = vector(s); # Pre-compute gaussian weights. if (stdf<5, - weights = vectorpwhd(); + ref(vectorpwhd(),weights); offw = 0; for (zw = -pd1, zw<=pd2, ++zw, for (yw = -ph1, yw<=ph2, ++yw, @@ -9112,10 +12410,11 @@ u = i(x,y,z,0); v = i(x,y,z,1); w = i(x,y,z,2); - patch = crop(#0,u - pw1, v - ph1,w - pd1,pw,ph,pd,boundary); + ref(crop(#0,u - pw1, v - ph1,w - pd1,pw,ph,pd,boundary),patch); stdf<5? draw(#2,patch,x - pw1,y - ph1,z - pd1,0,pw,ph,pd,s#0,-1,weights): - draw(#2,patch,x - pw1,y - ph1,z - pd1,0,pw,ph,pd,s#0,-1)" + draw(#2,patch,x - pw1,y - ph1,z - pd1,0,pw,ph,pd,s#0,-1); + return" else # 2D version eval[1] "> begin( @@ -9129,10 +12428,11 @@ const ph1 = int(ph/2); const ph2 = ph - ph1 - 1; const pwh = pw*ph; + return = vector(s); # Pre-compute gaussian weights. if (stdf<5, - weights = vectorpwh(); + ref(vectorpwh(),weights); offw = 0; for (yw = -ph1, yw<=ph2, ++yw, for (xw = -pw1, xw<=pw2, ++xw, @@ -9141,16 +12441,16 @@ ); ); ); - u = i(x,y,z,0); v = i(x,y,z,1); - patch = crop(#0,u - pw1, v - ph1,pw,ph,boundary); + ref(crop(#0,u - pw1, v - ph1,pw,ph,boundary),patch); stdf<5? draw(#2,patch,x - pw1,y - ph1,0,0,pw,ph,1,s#0,-1,weights): - draw(#2,patch,x - pw1,y - ph1,0,0,pw,ph,1,s#0,-1)" + draw(#2,patch,x - pw1,y - ph1,0,0,pw,ph,1,s#0,-1); + return" fi s. c,-{0,s-1} /[-2,-1] k. - endl done v + + endl done #--------------------------------- # @@ -9165,13 +12465,14 @@ #@cli : $$ bandpass : skip ${1=0},${2=20%} e[^-1] "Apply bandpass filter [$1,$2] to image$?." - v - repeat $! l[$>] + repeat $! l[$>] 100%,100%,100% f. "sqrt((x/w-0.5)^2 + (y/h-0.5)^2 + (z/d-0.5)^2)" n. 0,1 ir. $1,$2 shift. {int(w/2)},{int(h/2)},{int(d/2)},0,2 fft.. *... . *[-2,-1] ifft rm. - endl done v + + endl done -#@cli bilateral : [guide],std_deviation_s[%]>=0,std_deviation_r[%]>=0,_sampling_s>=0,_sampling_r>=0 : std_deviation_s[%]>=0,std_deviation_r[%]>=0,_sampling_s>=0,_sampling_r>=0 : (+) +#@cli bilateral : [guide],std_deviation_s[%]>=0,std_deviation_r[%]>=0,_sampling_s>=0,_sampling_r>=0 : \ +# std_deviation_s[%]>=0,std_deviation_r[%]>=0,_sampling_s>=0,_sampling_r>=0 : (+) #@cli : Blur selected images by anisotropic (eventually joint/cross) bilateral filtering. #@cli : If a guide image is provided, it is used for drive the smoothing filter. #@cli : A guide image must be of the same xyz-size as the selected images. @@ -9180,10 +12481,12 @@ #@cli b : eq. to 'blur'. : (+) -#@cli blur : std_deviation>=0[%],_boundary_conditions,_kernel : axes,std_deviation>=0[%],_boundary_conditions,_kernel : (+) +#@cli blur : std_deviation>=0[%],_boundary_conditions,_kernel : \ +# axes,std_deviation>=0[%],_boundary_conditions,_kernel : (+) #@cli : Blur selected images by a quasi-gaussian or gaussian filter (recursive implementation). #@cli : (eq. to 'b').\n -#@cli : 'boundary_conditions' can be { 0=dirichlet | 1=neumann } and 'kernel' can be { 0=quasi-gaussian (faster) | 1=gaussian }. +#@cli : 'boundary_conditions' can be { 0=dirichlet | 1=neumann }. +#@cli : 'kernel' can be { 0=quasi-gaussian (faster) | 1=gaussian }. #@cli : When specified, argument 'axes' is a sequence of { x | y | z | c }. #@cli : Specifying one axis multiple times apply also the blur multiple times. #@cli : Default values: 'boundary_conditions=1' and 'kernel=0'. @@ -9198,22 +12501,26 @@ #@cli : $$ blur_angular : skip ${2=50%},${3=50%} e[^-1] "Apply angular blur on image$?, with amplitude $1 and center point ($2,$3)." - v - euclidean2polar $2,$3,1.3,1 + euclidean2polar $2,$3,1.3,1 repeat $! l[$>] 1,100% =. 1,50%,50% b. y,$1 convolve_fft.. . rm. endl done - polar2euclidean $2,$3,1.3,1 v + + polar2euclidean $2,$3,1.3,1 -#@cli blur_bloom : _amplitude>=0,_ratio>=0,_nb_iter>=0,_blend_operator={ + | max | min },_kernel={ 0=quasi-gaussian (faster) | 1=gaussian | 2=box | 3=triangle | 4=quadratic },_normalize_scales={ 0 | 1 },_axes +#@cli blur_bloom : _amplitude>=0,_ratio>=0,_nb_iter>=0,_blend_operator={ + | max | min },\ +# _kernel={ 0=quasi-gaussian (faster) | 1=gaussian | 2=box | 3=triangle | 4=quadratic },\ +# _normalize_scales={ 0 | 1 },_axes #@cli : Apply a bloom filter that blend multiple blur filters of different radii, #@cli : resulting in a larger but sharper glare than a simple blur. #@cli : When specified, argument 'axes' is a sequence of { x | y | z | c }. #@cli : Specifying one axis multiple times apply also the blur multiple times. #@cli : Reference: Masaki Kawase, "Practical Implementation of High Dynamic Range Rendering", GDC 2004. -#@cli : Default values: 'amplitude=1', 'ratio=2', 'nb_iter=5', 'blend_operator=+', 'kernel=0','normalize_scales=0' and 'axes=(all)' +#@cli : Default values: 'amplitude=1', 'ratio=2', 'nb_iter=5', 'blend_operator=+', 'kernel=0','normalize_scales=0' \ +# and 'axes=(all)' #@cli : $ image.jpg blur_bloom , -blur_bloom : check "${1=1}>=0 && ${2=2}>=0 && isint(${3=5}) && $3>=0 && isint(${5=0}) && $5>=0 && $5<=4 && isval(${6=0})" skip ${4=+},${7=} - e[^-1] "Apply bloom effect on image$?, with amplitude $1, ratio $2, $3 iterations, blend operator '$4' and "${"arg 1+!$6,\"\",\"no \""}"scale normalization." - v - - if {narg("$7")} axes=$7, fi +blur_bloom : check "${1=1}>=0 && ${2=2}>=0 && isint(${3=5}) && $3>=0 && isint(${5=0}) && $5>=0 && $5<=4 && + isnum(${6=0})" skip ${4=+},${7=} + e[^-1] "Apply bloom effect on image$?, with amplitude $1, ratio $2, $3 iterations, blend operator '$4' and "\ + ${"arg 1+!$6,\"\",\"no \""}"scale normalization." + if narg("$7") axes=$7, fi m "_bloom0 : b "$axes"$""1" m "_bloom1 : b "$axes"$""1,1,1" m "_bloom2 : boxfilter "$axes"{1+2*$""1},0,1" @@ -9226,8 +12533,7 @@ done n. $mM k. nm $nm endl done - uncommand _bloom0,_bloom1,_bloom2,_bloom3,_bloom4 - v + + um _bloom0,_bloom1,_bloom2,_bloom3,_bloom4 #@cli blur_linear : amplitude1[%],_amplitude2[%],_angle,_boundary_conditions={ 0=dirichlet | 1=neumann } #@cli : Apply linear blur on selected images, with specified angle and amplitudes. @@ -9236,16 +12542,15 @@ #@cli : $$ blur_linear : skip ${2=0},${3=0},${4=1} e[^-1] "Apply linear blur on image$?, with angle $3 deg. and amplitudes ($1,$2)." - v - std1={if(${is_percent\ $1},$1*max(w,h),$1)} std2={if(${is_percent\ $2},$2*max(w,h),$2)} stdM={round(1.25*max($std1,$std2))} - if {$stdM<=0} v + return fi + if $stdM<=0 return fi repeat $! l[$>] expand_xy $stdM,{$4!=0} {2*$stdM},{2*$stdM} gaussian. $1,$2,$3 normalize_sum. convolve_fft[0] [1] rm. shrink_xy $stdM - endl done v + + endl done #@cli blur_radial : amplitude[%],_center_x[%],_center_y[%] #@cli : Apply radial blur on selected images. @@ -9254,7 +12559,7 @@ #@cli : $$ blur_radial : skip ${2=50%},${3=50%} e[^-1] "Apply radial blur on image$?, with amplitude $1 and center point ($2,$3)." - v - euclidean2polar $2,$3,5,1 blur_x $1 polar2euclidean $2,$3,5,1 v + + euclidean2polar $2,$3,5,1 blur_x $1 polar2euclidean $2,$3,5,1 #@cli blur_selective : sigma>=0,_edges>0,_nb_scales>0 #@cli : Blur selected images using selective gaussian scales. @@ -9263,10 +12568,10 @@ #@cli : $$ blur_selective : check "${1=5}>=0 && ${2=0.5}>=0 && isint(${3=5}) && $3>0" e[^-1] "Blur image$? using $3 selective gaussian scales, with sigma $1 and edges $2." - v - repeat $! l[$>] nm={0,n} + repeat $! l[$>] nm={0,n} +gradient_norm +. 1 ^. {-max(0.01,$2)} quantize. {$3+1},0,1 min. {$3-1} r. .. repeat $3 +==. $> *. ... +[-2,-1] b.. {$1/($3+1)} done - rm.. nm $nm endl done v + + rm.. nm $nm endl done #@cli blur_x : amplitude[%]>=0,_boundary_conditions={ 0=dirichlet | 1=neumann } #@cli : Blur selected images along the x-axis. @@ -9275,7 +12580,7 @@ #@cli : $$ blur_x : skip ${2=1} e[^-1] "Blur image$? along the x-axis, with sigma $1 and "${arg\ 1+!$2,neumann,dirichlet}" boundary conditions." - v - deriche $1,0,x,$2 v + + deriche $1,0,x,$2 #@cli blur_xy : amplitude_x[%],amplitude_y[%],_boundary_conditions={ 0=dirichlet | 1=neumann } #@cli : Blur selected images along the X and Y axes. @@ -9284,7 +12589,7 @@ #@cli : $$ blur_xy : skip ${2=$1},${3=1} e[^-1] "Blur image$? along the xy-axes, with sigma $1 and "${arg\ 1+!$2,neumann,dirichlet}" boundary conditions." - v - deriche $1,0,x,$3 deriche $2,0,y,$3 v + + deriche $1,0,x,$3 deriche $2,0,y,$3 #@cli blur_xyz : amplitude_x[%],amplitude_y[%],amplitude_z,_boundary_conditions={ 0=dirichlet | 1=neumann } #@cli : Blur selected images along the X, Y and Z axes. @@ -9292,7 +12597,7 @@ #@cli : $$ blur_xyz : skip ${4=1} e[^-1] "Blur image$? along the xyz-axes, with sigma $1 and "${arg\ 1+!$2,neumann,dirichlet}" boundary conditions." - v - deriche $1,0,x,$4 deriche $2,0,y,$4 deriche $3,0,z,$4 v + + deriche $1,0,x,$4 deriche $2,0,y,$4 deriche $3,0,z,$4 #@cli blur_y : amplitude[%]>=0,_boundary_conditions={ 0=dirichlet | 1=neumann } #@cli : Blur selected images along the y-axis. @@ -9301,7 +12606,7 @@ #@cli : $$ blur_y : skip ${2=1} e[^-1] "Blur image$? along the y-axis, with sigma $1 and "${arg\ 1+!$2,neumann,dirichlet}" boundary conditions." - v - deriche $1,0,y,$2 v + + deriche $1,0,y,$2 #@cli blur_z : amplitude[%]>=0,_boundary_conditions={ 0=dirichlet | 1=neumann } #@cli : Blur selected images along the z-axis. @@ -9309,9 +12614,10 @@ #@cli : $$ blur_z : skip ${2=1} e[^-1] "Blur image$? along the z-axis, with sigma $1 and "${arg\ 1+!$2,neumann,dirichlet}" boundary conditions." - v - deriche $1,0,z,$2 v + + deriche $1,0,z,$2 -#@cli boxfilter : size>=0[%],_order,_boundary_conditions,_nb_iter>=0 : axes,size>=0[%],_order,_boundary_conditions,_nb_iter>=0 : (+) +#@cli boxfilter : size>=0[%],_order,_boundary_conditions,_nb_iter>=0 : \ +# axes,size>=0[%],_order,_boundary_conditions,_nb_iter>=0 : (+) #@cli : Blur selected images by a box filter of specified size (fast recursive implementation). #@cli : 'order' can be { 0=smooth | 1=1st-derivative | 2=2nd-derivative }. #@cli : 'boundary_conditions' can be { 0=dirichlet | 1=neumann }. @@ -9326,22 +12632,27 @@ #@cli : $ 300,300 circle 50%,50%,128,1,1 blur 5% bump2normal bump2normal : e[^-1] "Convert bumpmap$? to normalmap." - v - repeat $! l[$>] + repeat $! l[$>] channels 0 g xy,1 +f. 1 a c orientation * 127 + 128 round c 0,255 - endl done v + + endl done #@cli compose_freq #@cli : Compose selected low and high frequency parts into new images. #@cli : $ image.jpg split_freq 2% mirror[-1] x compose_freq compose_freq : e[^-1] "Compose low and high frequency part$? into new images." - v - repeat {int($!/2)} +[$>,{$>+1}] done v + + repeat int($!/2) +[$>,{$>+1}] done -#@cli convolve : [mask],_boundary_conditions,_is_normalized={ 0 | 1 } : (+) +#@cli convolve : [mask],_boundary_conditions,_is_normalized={ 0 | 1 },_channel_mode,\ +# _xcenter,_ycenter,_zcenter,_xstart,_ystart,_zstart,_xend,_yend,_zend,_xstride,_ystride,_zstride,\ +# _xdilation,_ydilation,_zdilation : (+) #@cli : Convolve selected images by specified mask. -#@cli : 'boundary_conditions' can be { 0=dirichlet | 1=neumann }. -#@cli : Default values: 'boundary_conditions=1' and 'is_normalized=0'. +#@cli : 'boundary_conditions' can be { 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }. +#@cli : 'channel_mode' can be { 0=sum input channels | 1=one-for-one | 2=expand }. +#@cli : Default values: 'boundary_conditions=1', 'is_normalized=0', 'channel_mode=1', \ +# 'xcenter=ycenter=zcenter=-1' (-1=centered), 'xstart=ystart=zstart=0', 'xend=yend=zend=-1' (-1=max coordinates), \ +# 'xstride=ystride=zstride=1' and 'xdilation=ydilation=zdilation=1'. #@cli : $ image.jpg (0,1,0;1,-4,1;0,1,0) convolve[-2] [-1] keep[-2] #@cli : $ image.jpg (0,1,0) resize[-1] 130,1,1,1,3 +convolve[0] [1] #@cli : $$ @@ -9351,19 +12662,24 @@ #@cli : $ image.jpg 100%,100% gaussian[-1] 20,1,45 +convolve_fft[0] [1] convolve_fft : check ${is_image_arg\ $1} e[^-1] "Convolve image$? with mask $1, in the fourier domain." - v - repeat $! pass$1 0 l[$>,-1] + repeat $! pass$1 0 l[$>,-1] w2={0,int(w/2)} h2={0,int(h/2)} d2={0,int(d/2)} r[1] [0],[0],[0],1,0,0,0.5,0.5,0.5,0.5 shift[1] -$w2,-$h2,-$d2,0,2 fft[0] fft[2] +*[-4] . +*[-4] ... +[-2,-1] *[-5,-3] *[-3,-2] -[-3,-2] ifft rm. - endl done v + + endl done -#@cli correlate : [mask],_boundary_conditions,_is_normalized={ 0 | 1 } : (+) +#@cli correlate : [mask],_boundary_conditions,_is_normalized={ 0 | 1 },_channel_mode,\ +# _xcenter,_ycenter,_zcenter,_xstart,_ystart,_zstart,_xend,_yend,_zend,_xstride,_ystride,_zstride,\ +# _xdilation,_ydilation,_zdilation : (+) #@cli : Correlate selected images by specified mask. -#@cli : 'boundary_conditions' can be { 0=dirichlet | 1=neumann }. -#@cli : Default values: 'boundary_conditions=1' and 'is_normalized=0'. +#@cli : 'boundary_conditions' can be { 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }. +#@cli : 'channel_mode' can be { 0=sum input channels | 1=one-for-one | 2=expand }. +#@cli : Default values: 'boundary_conditions=1', 'is_normalized=0', 'channel_mode=1', \ +# 'xcenter=ycenter=zcenter=-1' (-1=centered), 'xstart=ystart=zstart=0', 'xend=yend=zend=-1' (-1=max coordinates), \ +# 'xstride=ystride=zstride=1' and 'xdilation=ydilation=zdilation=1'. #@cli : $ image.jpg (0,1,0;1,-4,1;0,1,0) correlate[-2] [-1] keep[-2] #@cli : $ image.jpg +crop 40%,40%,60%,60% +correlate[0] [-1],0,1 @@ -9372,18 +12688,18 @@ #@cli : $ image.jpg +shift -30,-20 +cross_correlation[0] [1] cross_correlation : check ${is_image_arg\ $1} e[^-1] "Compute cross-correlation of image$? with mask $1." - v - repeat $! pass$1 0 l[$>,-1] + repeat $! pass$1 0 l[$>,-1] norm fft.. fft. [-2,-1] *.. [-5] *. [-6] -[-2,-1] *[-5,-3] *[-3,-2] +[-3,-2] ifft rm. - endl done v + + endl done #@cli curvature #@cli : Compute isophote curvatures on selected images. #@cli : $ image.jpg blur 10 curvature curvature : e[^-1] "Compute isophote curvatures on image$?." - v - repeat $! l[$>] - if {d==1} + repeat $! l[$>] + if d==1 +g xy,0 hessian... xxxyyy # ixx ixy iyy ix iy *... .. *[-4] . *[-4] -2 # ixx -2iyixy ixiyy ix iy +[-4,-3] *... .. # ixx -2ixiyixy+ix^2iyy ix iy @@ -9394,7 +12710,7 @@ -[-3,-2] +. 0.1 /[-2,-1] # iee in +inn. laplacian.. - # iee/in fi - endl done v + + endl done #@cli dct : _{ x | y | z }...{ x | y | z } : (no arg) #@cli : Compute the discrete cosine transform of selected images, @@ -9403,28 +12719,27 @@ #@cli : $ image.jpg +dct +idct[-1] abs[-2] +[-2] 1 log[-2] #@cli : $$ _dct-and-idct dct : skip ${1=0} - v - ({'"$1"'}) + ('"$1"') is_axes={im>=_'x'" && "iM<=_'z'} if $is_axes - v + e[0--3] "Compute discrete cosine transform of image$? along axes '$1'." v - - repeat {w} + e[0--3] "Compute discrete cosine transform of image$? along axes '$1'." + repeat w axis={i[$>]} - if {$axis==_'x'} repeat {$!-1} l[$>] if {w>1} _dct fi endl done - elif {$axis==_'y'} repeat {$!-1} l[$>] if {h>1} permute yxzc _dct permute yxzc fi endl done - elif {$axis==_'z'} repeat {$!-1} l[$>] if {d>1} permute zxyc _dct permute yzxc fi endl done + if $axis==_'x' repeat $!-1 l[$>] if w>1 _dct fi endl done + elif $axis==_'y' repeat $!-1 l[$>] if h>1 permute yxzc _dct permute yxzc fi endl done + elif $axis==_'z' repeat $!-1 l[$>] if d>1 permute zxyc _dct permute yzxc fi endl done fi done else rm. - v + e[0--3] "Compute discrete cosine transform of image$?." v - + e[0--3] "Compute discrete cosine transform of image$?." noarg repeat $! l[$>] - if {w>1} _dct fi - if {h>1} permute yxzc _dct permute yxzc fi - if {d>1} permute zxyc _dct permute yzxc fi + if w>1 _dct fi + if h>1 permute yxzc _dct permute yxzc fi + if d>1 permute zxyc _dct permute yzxc fi endl done fi - v + # 1D direct transform (DCT-II) for a single image. _dct : @@ -9443,12 +12758,13 @@ #@cli : Default values: 'nb_iter=10', 'dt=20', 'regul=0.7' and 'regul_type=1'. #@cli : $ image.jpg blur 3 +deblur 3,40,20,0.01 deblur : check "${2=10}>=0 && ${3=20}>=0 && ${4=0.7}>=0" skip ${5=1} - e[^-1] "Deblur image$? with a regularized Jansson-Van Cittert algorithm, with sigma $1, $2 iterations, time step $3 and regularization $4." v - + e[^-1] "Deblur image$? with a regularized Jansson-Van Cittert algorithm, with sigma $1, $2 iterations, + time step $3 and regularization $4." repeat $! l[$>] nm={0,n} [0] repeat $2 - if {$5>=2} +curvature. # TV regularization. - elif {$5>=1} +iee. # Meancurv. regularization. + if $5>=2 +curvature. # TV regularization. + elif $5>=1 +iee. # Meancurv. regularization. else +laplacian. # Tikhonov regularization. fi *. $4 @@ -9458,20 +12774,21 @@ +[-2,-1] # Update image. done rm.. - nm $nm endl done v + + nm $nm endl done -#@cli deblur_goldmeinel : sigma>=0, _nb_iter>=0, _acceleration>=0, _kernel_type={ 0=quasi-gaussian (faster) | 1=gaussian }. +#@cli deblur_goldmeinel : sigma>=0,_nb_iter>=0,_acceleration>=0,_kernel_type={ 0=quasi-gaussian (faster) | 1=gaussian }. #@cli : Deblur selected images using Gold-Meinel algorithm #@cli : Default values: 'nb_iter=8', 'acceleration=1' and 'kernel_type=1'. #@cli : $ image.jpg +blur 1 +deblur_goldmeinel[-1] 1 ###### : (contribution from Jérôme Boulanger). deblur_goldmeinel : check "$1>=0 && ${2=8}>=0 && ${3=1}>=0" skip ${4=1} - e[^-1] "Deblur image$? using Gold-Meinel algorithm, with sigma $1, $2 iterations, acceleration $3 and "${arg\ 1+!$4,"",quasi-}"gaussian kernel." - v - repeat $! l[$>] + e[^-1] "Deblur image$? using Gold-Meinel algorithm, with sigma $1, $2 iterations, acceleration $3 and "\ + ${arg\ 1+!$4,"",quasi-}"gaussian kernel." + repeat $! l[$>] [0] repeat $2 +b. $1,1,$4 +/[0,-1] rm.. ^. $3 *[-1,-2] # u *= f / Hu done rm[0] - endl done v + + endl done #@cli deblur_richardsonlucy : sigma>=0, nb_iter>=0, _kernel_type={ 0=quasi-gaussian (faster) | 1=gaussian }. #@cli : Deblur selected images using Richardson-Lucy algorithm. @@ -9479,12 +12796,13 @@ #@cli : $ image.jpg +blur 1 +deblur_richardsonlucy[-1] 1 ###### : (contribution from Jérôme Boulanger). deblur_richardsonlucy : check "$1>=0 && ${2=50}>=0" skip ${3=1} - e[^-1] "Deblur image$? using Richardson-Lucy algorithm, with sigma $1, $2 iterations and "${arg\ 1+!$3,"",quasi-}"gaussian kernel." - v - repeat $! l[$>] + e[^-1] "Deblur image$? using Richardson-Lucy algorithm, with sigma $1, $2 iterations and "\ + ${arg\ 1+!$3,"",quasi-}"gaussian kernel." + repeat $! l[$>] [0] repeat $2 +b. $1,1,{$3!=0} max. 1e-6 +/[0,-1] rm.. b. $1,1,{$3!=0} *[-1,-2] # u *= H ( f / Hu ) done rm[0] - endl done v + + endl done #@cli deconvolve_fft : [kernel],_regularization>=0 #@cli : Deconvolve selected images by specified mask in the fourier space. @@ -9492,7 +12810,7 @@ #@cli : $ image.jpg +gaussian 5 +convolve_fft[0] [1] +deconvolve_fft[-1] [1] deconvolve_fft : check ${is_image_arg\ $1}" && ${2=.001}>=0" e[^-1] "Deconvolve image$? with mask $1 and regularization $2, in the fourier domain." - v - repeat $! pass$1 0 l[$>,-1] + repeat $! pass$1 0 l[$>,-1] w2={0,int(w/2)} h2={0,int(h/2)} d2={0,int(d/2)} r[1] [0],[0],[0],1,0,0,0.5,0.5,0.5,0.5 shift[1] -$w2,-$h2,-$d2,0,2 fft[0] fft[2] # a b a' b' @@ -9505,7 +12823,7 @@ +[-4,-3] # aa'+bb' (a'^2+b'^2) ba'-ab' /. .. /[-3,-2] # divide (aa'+bb') and (ba'-ab') by (a'^2+b'^2) ifft rm. - endl done v + + endl done #@cli deinterlace : _method={ 0 | 1 } #@cli : Deinterlace selected images ('method' can be { 0=standard or 1=motion-compensated }). @@ -9513,14 +12831,17 @@ #@cli : $ image.jpg +rotate 3,1,1,50%,50% resize 100%,50% resize 100%,200%,1,3,4 shift[-1] 0,1 add +deinterlace 1 deinterlace : skip ${1=0} e[^-1] "Deinterlace image$? with "${arg\ 1+!$1,motion-compensated,standard}" method." - v - repeat $! l[$>] + repeat $! l[$>] wh={w},{h} s y a[0--1:2] y a[^0] y r.. .,0 r 100%,200%,1,100%,5 - if {$1!=0} +displacement. ..,0.05 warp... .,1,1,1 rm. fi + if $1!=0 +displacement. ..,0.05 warp... .,1,1,1 rm. fi + / 2 c 0,255 r $wh - endl done v + + endl done -#@cli denoise : std_deviation_s>=0,_std_deviation_p>=0,_patch_size>0,_lookup_size>0,_smoothness,_fast_approx={ 0 | 1 } : (+) +#@cli denoise : [guide],std_deviation_s[%]>=0,_std_deviation_r[%]>=0,_patch_size>0,_lookup_size>0,_smoothness,\ +# _fast_approx={ 0 | 1 } : \ +# std_deviation_s[%]>=0,_std_deviation_r[%]>=0,_patch_size>0,_lookup_size>0,_smoothness,\ +# _fast_approx={ 0 | 1 } : (+) #@cli : Denoise selected images by non-local patch averaging. #@cli : Default values: 'std_deviation_p=10', 'patch_size=5', 'lookup_size=6' and 'smoothness=1'. #@cli : $ image.jpg +denoise 5,5,8 @@ -9533,7 +12854,7 @@ denoise_haar : check "${1=1.4}>=0 && isint(${2=0}) && $2>=0 && isint(${3=10}) && $3>0" e[^-1] "Denoise image$? using haar-wavelet thresholding, with threshold $1, "\ ${arg\ 1+($2>0),auto,$2}" scales and $3 spinning cycles." - v - repeat $! l[$>] nm={0,n} + repeat $! l[$>] nm={0,n} nb_scales={min(if($2,$2,32),int(log2(min(w,h))-1))} w={w} h={h} d={d} sigma=${-std_noise} r {round(w,2^($nb_scales+1),1)},{round(h,2^($nb_scales+1),1)},{if(d==1,1,round(d,2^($nb_scales+1),1))},100%,0,0 @@ -9550,7 +12871,7 @@ +[-2,-1] done rm[0] / $3 r $w,$h,$d,100%,0 - nm $nm endl done v + + nm $nm endl done #@cli denoise_patchpca : _strength>=0,_patch_size>0,_lookup_size>0,_spatial_sampling>0 #@cli : Denoise selected images using the patch-pca algorithm. @@ -9558,18 +12879,19 @@ #@cli : $ image.jpg +noise 20 cut[-1] 0,255 +denoise_patchpca[-1] , denoise_patchpca : check "${1=1.8} && $1>=0 && isint(${2=7}) && $2>0 && isint(${3=11}) && $3>0 && isint(${4=5}) && $4>0" e[^-1] "Denoise image$? using patch-pca, with strength $1, patch size $2, lookup size $3 and spatial sampling $4." - v - repeat $! l[$>] nm={n} + repeat $! l[$>] nm={n} N2={$2*$2} M2={$3*$3} stdnoise=${-std_noise} 100%,100%,1,100% nm. aggreg 100%,100% nm. weights f[0] "* begin( + transpose(A,nA) = transp(A,nA); # For =$1*"$stdnoise", ++k); Qt = eig["$N2","{$N2*$N2}"]; - Q = transp(Qt,"$N2"); + Q = transpose(Qt,"$N2"); for (q = -m1, q<=m2, ++q, for (p = -m1, p<=m2, ++p, pY = Qt*(patch(x + p,y + q) - X); @@ -9606,7 +12928,7 @@ ); 0);0" max[weights] 0.01 /[aggreg,weights] k[aggreg] nm $nm - endl done v + + endl done #@cli deriche : std_deviation>=0[%],order={ 0 | 1 | 2 },axis={ x | y | z | c },_boundary_conditions : (+) #@cli : Apply Deriche recursive filter on selected images, along specified axis and with @@ -9617,7 +12939,8 @@ #@cli : $ image.jpg +deriche 30,0,x deriche[-2] 30,0,y add #@cli : $$ -#@cli dilate : size>=0 : size_x>=0,size_y>=0,size_z>=0 : [kernel],_boundary_conditions,_is_real={ 0=binary-mode | 1=real-mode } : (+) +#@cli dilate : size>=0 : size_x>=0,size_y>=0,size_z>=0 : \ +# [kernel],_boundary_conditions,_is_real={ 0=binary-mode | 1=real-mode } : (+) #@cli : Dilate selected images by a rectangular or the specified structuring element. #@cli : 'boundary_conditions' can be { 0=dirichlet | 1=neumann }. #@cli : Default values: 'size_z=1', 'boundary_conditions=1' and 'is_real=0'. @@ -9629,8 +12952,8 @@ #@cli : $ image.jpg +dilate_circ 7 dilate_circ : check $1>=0 skip ${2=1},${3=0} e[^-1] "Apply circular dilation of image$? by size $1, boundary conditions $2 and is_normalized $3." - if {$1<2} return fi - v - shape_circle $1 dilate[^-1] .,$2,$3 rm. v + + if $1<2 return fi + shape_circle $1 dilate[^-1] .,$2,$3 rm. #@cli dilate_oct : _size>=0,_boundary_conditions,_is_normalized={ 0 | 1 } #@cli : Apply octagonal dilation of selected images by specified size. @@ -9638,26 +12961,25 @@ #@cli : $ image.jpg +dilate_oct 7 dilate_oct : check $1>=0 skip ${2=1},${3=0} e[^-1] "Apply octagonal dilation of image$? by size $1, boundary conditions $2 and is_normalized $3." - if {$1<2} return fi - v - - if {$1&1} ss={$1} else ss={$1+1} fi + if $1<2 return fi + if $1&1 ss={$1} else ss={$1+1} fi i[0] (0,1,0;1,1,1;0,1,0) i[1] (1,1,1;1,1,1;1,1,1) - repeat {$!-2} + repeat $!-2 r={round(($ss-1)*sqrt(2)/(1+sqrt(2))/2)} q={round(($ss-1)/(1+sqrt(2))/2)} - if {$r>0} repeat $r dilate. [0],$2,$3 done fi - if {$q>0} repeat $q dilate. [1],$2,$3 done fi - mv. 2 done rm[0,1] v + + if $r>0 repeat $r dilate. [0],$2,$3 done fi + if $q>0 repeat $q dilate. [1],$2,$3 done fi + mv. 2 done rm[0,1] _kr_circle : - if {$1%2==0} 2,2,1,1,1 else 1,1,1,1,1 fi r. $1,$1,1,1,0,0,0.5,0.5 + if $1%2==0 2,2,1,1,1 else 1,1,1,1,1 fi r. $1,$1,1,1,0,0,0.5,0.5 distance. 1 round. 0.5 ir. 0,{$1/2} _jf_circle : {round($1)},{round($1)} center={0.5*(w-1)} f. 'sqrt((x-$center)^2+(y-$center)^2)' - if {!(w%2)} + if !(w%2) round. 0.0001,-1 t1={sqrt(((round($1)-1)/2)^2+0.25)} t2={sqrt(((round($1)+1)/2)^2+0.25)} @@ -9671,32 +12993,32 @@ #@cli : Dilate selected images in the (X,Y,Z,I) space. #@cli : 'boundary_conditions' can be { 0=dirichlet | 1=neumann }. #@cli : Default values: 'size_y=size_x', 'size_z=1', 'threshold=255' and 'boundary_conditions=1'. -dilate_threshold : check "isint($1) && $1>=1 && isint(${2=$1}) && $2>=1 && isint(${3=1}) && $3>=1 && ${4=255}>=0 && isint(${5=1}) && $5>=0" +dilate_threshold : check "isint($1) && $1>=1 && isint(${2=$1}) && $2>=1 && isint(${3=1}) && $3>=1 && ${4=255}>=0 && + isint(${5=1}) && $5>=0" e[^-1] "Dilate image$? with mask $1x$2x$3, threshold $4 and "${arg\ $5,dirichlet,neumann}" boundary conditions." - v - l[] + l[] dx1={int($1/2)} dx2={$1-$dx1-1} dy1={int($2/2)} dy2={$2-$dy1-1} dz1={int($3/2)} dz2={$3-$dz1-1} (-$dx1,$dx1) (-$dy1;$dy1) (-$dz1/$dz1) r $1,$2,$3,1,3 a c round r {w*h*d},3,1,1,-1 transpose. i.. 1,100%,1,1,254 1,100%,1,1,255 a x - ({'{^}'}) rm.. replace_str "254,","(v=j(" replace_str ",255",",0,0,$5);if(abs(v-i)<=$4,v,-1e20))" list={t} + ('{^}') rm.. replace_str "254,","(v=j(" replace_str ",255",",0,0,$5);if(abs(v-i)<=$4,v,-1e20))" list={t} rm endl f 'max($list)' - v + #@cli divergence #@cli : Compute divergence of selected vector fields. #@cli : $ image.jpg luminance +gradient append[-2,-1] c divergence[-1] divergence : e[^-1] "Compute divergence of vector field$?." - v - repeat $! l[$>] - if {s==1} g x,0 - elif {s==2} s c g.. x,0 g. y,0 + - elif {s==3} s c g... x,0 g.. y,0 g. z,0 + - else v + error[] "Command '$0': Cannot compute divergence of image ["$>"] (has "{s}">3 channels)." + repeat $! l[$>] + if s==1 g x,0 + elif s==2 s c g.. x,0 g. y,0 + + elif s==3 s c g... x,0 g.. y,0 g. z,0 + + else error[] "Command '$0': Cannot compute divergence of image ["$>"] (has "{s}">3 channels)." fi - endl done v + + endl done #@cli dog : _sigma1>=0[%],_sigma2>=0[%] #@cli : Compute difference of gaussian on selected images. @@ -9704,9 +13026,9 @@ #@cli : $ image.jpg dog 2,3 dog : check "${1=2%}>=0 && ${2=3%}>=0" e[^-1] "Compute difference of gaussian on image$?, with standard deviations $1 and $2." - v - repeat $! l[$>] + repeat $! l[$>] [0] parallel "b[0] $1","b[1] $2" - abs - endl done v + + endl done #@cli diffusiontensors : _sharpness>=0,0<=_anisotropy<=1,_alpha[%],_sigma[%],is_sqrt={ 0 | 1 } #@cli : Compute the diffusion tensors of selected images for edge-preserving smoothing algorithms. @@ -9715,17 +13037,16 @@ #@cli : $$ diffusiontensors : check "${1=0.7}>=0 && ${2=0.3}>=0 && $2<=1" skip ${3=0.6},${4=1.1},${5=0} e[^-1] "Compute diffusion tensors for image$?, with sharpness $1, anisotropy $2, alpha $3 and sigma $4." - v - p1={if($5,0.5,1)*max($1,1e-2)} p2={$p1/(1e-7+1-$2)} b $3 n 0,255 structuretensors 0 b $4 repeat $! l[$>] eigen max.. 0 - if {s==2} s.. c +[-3,-2] +.. 1 +^.. -$p1 ^... -$p2 a[-3,-1] c # 2D + if s==2 s.. c +[-3,-2] +.. 1 +^.. -$p1 ^... -$p2 a[-3,-1] c # 2D else s.. c +[-4--2] +.. 1 +^.. -$p1 r. 100%,100%,100%,2 ^... -$p2 a[-3,-1] c # 3D fi eigen2tensor - endl done v + + endl done #@cli edges : _threshold[%]>=0 #@cli : Estimate contours of selected images. @@ -9733,9 +13054,10 @@ #@cli : $ image.jpg +edges 15% edges : skip ${1=15%} e[^-1] "Estimate image contours of image$?, with threshold $1." - v - gradient_norm b 0.5 >= $1 distance 0 equalize negate c 30%,70% n 0,1 v + + gradient_norm b 0.5 >= $1 distance 0 equalize negate c 30%,70% n 0,1 -#@cli erode : size>=0 : size_x>=0,size_y>=0,_size_z>=0 : [kernel],_boundary_conditions,_is_real={ 0=binary-mode | 1=real-mode } : (+) +#@cli erode : size>=0 : size_x>=0,size_y>=0,_size_z>=0 : \ +# [kernel],_boundary_conditions,_is_real={ 0=binary-mode | 1=real-mode } : (+) #@cli : Erode selected images by a rectangular or the specified structuring element. #@cli : 'boundary_conditions' can be { 0=dirichlet | 1=neumann }. #@cli : Default values: 'size_z=1', 'boundary_conditions=1' and 'is_real=0'. @@ -9747,8 +13069,8 @@ #@cli : $ image.jpg +erode_circ 7 erode_circ : check $1>=0 skip ${2=1},${3=0} e[^-1] "Apply circular erosion of image$? by size $1, boundary conditions $2 and is_normalized $3." - if {$1<2} return fi - v - shape_circle $1 erode[^-1] .,$2,$3 rm. v + + if $1<2 return fi + shape_circle $1 erode[^-1] .,$2,$3 rm. #@cli erode_oct : _size>=0,_boundary_conditions,_is_normalized={ 0 | 1 } #@cli : Apply octagonal erosion of selected images by specified size. @@ -9756,40 +13078,40 @@ #@cli : $ image.jpg +erode_oct 7 erode_oct : check $1>=0 skip ${2=1},${3=0} e[^-1] "Apply octagonal erosion of image$? by size $1, boundary conditions $2 and is_normalized $3." - if {$1<2} return fi - v - - if {$1&1} ss={$1} else ss={$1+1} fi + if $1<2 return fi + if $1&1 ss={$1} else ss={$1+1} fi i[0] (0,1,0;1,1,1;0,1,0) i[1] (1,1,1;1,1,1;1,1,1) - repeat {$!-2} + repeat $!-2 r={round(($ss-1)*sqrt(2)/(1+sqrt(2))/2)} q={round(($ss-1)/(1+sqrt(2))/2)} - if {$r>0} repeat $r erode. [0],$2,$3 done fi - if {$q>0} repeat $q erode. [1],$2,$3 done fi - mv. 2 done rm[0,1] v + + if $r>0 repeat $r erode. [0],$2,$3 done fi + if $q>0 repeat $q erode. [1],$2,$3 done fi + mv. 2 done rm[0,1] #@cli erode_threshold : size_x>=1,size_y>=1,size_z>=1,_threshold>=0,_boundary_conditions #@cli : Erode selected images in the (X,Y,Z,I) space. #@cli : 'boundary_conditions' can be { 0=dirichlet | 1=neumann }. #@cli : Default values: 'size_y=size_x', 'size_z=1', 'threshold=255' and 'boundary_conditions=1'. -erode_threshold : check "isint($1) && $1>=1 && isint(${2=$1}) && $2>=1 && isint(${3=1}) && $3>=1 && ${4=255}>=0 && isint(${5=1}) && $5>=0" +erode_threshold : check "isint($1) && $1>=1 && isint(${2=$1}) && $2>=1 && isint(${3=1}) && $3>=1 && ${4=255}>=0 && + isint(${5=1}) && $5>=0" e[^-1] "Erode image$? with mask $1x$2x$3, threshold $4 and "${arg\ $5,dirichlet,neumann}" boundary conditions." - v - l[] + l[] dx1={int($1/2)} dx2={$1-$dx1-1} dy1={int($2/2)} dy2={$2-$dy1-1} dz1={int($3/2)} dz2={$3-$dz1-1} (-$dx1,$dx1) (-$dy1;$dy1) (-$dz1/$dz1) r $1,$2,$3,1,3 a c round r {w*h*d},3,1,1,-1 transpose. i.. 1,100%,1,1,254 1,100%,1,1,255 a x - ({'{^}'}) rm.. replace_str "254,","(v=j(" replace_str ",255",",0,0,$5);if(abs(v-i)<=$4,v,1e20))" list={t} + ('{^}') rm.. replace_str "254,","(v=j(" replace_str ",255",",0,0,$5);if(abs(v-i)<=$4,v,1e20))" list={t} rm endl f 'min($list)' - v + #@cli fft : _{ x | y | z }...{ x | y | z } : (+) #@cli : Compute the direct fourier transform (real and imaginary parts) of selected images, #@cli : optionally along the specified axes only. #@cli : $ image.jpg luminance +fft append[-2,-1] c norm[-1] log[-1] shift[-1] 50%,50%,0,0,2 -#@cli : $ image.jpg w2={int(w/2)} h2={int(h/2)} fft shift $w2,$h2,0,0,2 ellipse $w2,$h2,30,30,0,1,0 shift -$w2,-$h2,0,0,2 ifft remove[-1] +#@cli : $ image.jpg w2={int(w/2)} h2={int(h/2)} fft shift $w2,$h2,0,0,2 ellipse $w2,$h2,30,30,0,1,0 \ +# shift -$w2,-$h2,0,0,2 ifft remove[-1] #@cli : $$ #@cli g : eq. to 'gradient'. : (+) @@ -9797,9 +13119,10 @@ #@cli gradient : { x | y | z }...{ x | y | z },_scheme : (no arg) : (+) #@cli : Compute the gradient components (first derivatives) of selected images. #@cli : (eq. to 'g').\n -#@cli : 'scheme' can be { -1=backward | 0=centered | 1=forward | 2=sobel | 3=rotation-invariant (default) | 4=deriche | 5=vanvliet }. -#@cli : (no arg) compute all significant 2D/3D components. -#@cli : Default value: 'scheme=3'. +#@cli : 'scheme' can be { -1=backward | 0=centered | 1=forward | 2=sobel | 3=rotation-invariant (default) | \ +# 4=deriche | 5=vanvliet }. +#@cli : (no arg) compute all significant components. +#@cli : Default value: 'scheme=0'. #@cli : $ image.jpg gradient #@cli : $$ @@ -9809,12 +13132,7 @@ #@cli : $$ gradient_norm : e[^-1] "Compute gradient norm of image$?." - v - repeat $! l[$>] - +g x sqr. - +g.. y sqr. +[-2,-1] - g.. z sqr.. +[-2,-1] - s={s} s. c +[-$s--1] sqrt. - endl done v + + repeat $! l[$>] g sqr s c + sqrt endl done #@cli gradient_orientation : _dimension={1,2,3} #@cli : Compute N-d gradient orientation of selected images. @@ -9822,20 +13140,20 @@ #@cli : $ image.jpg +gradient_orientation 2 gradient_orientation : check "${1=3}==1 || $1==2 || $1==3" e[^-1] "Compute $1-d gradient orientation of image$?." - v - repeat $! l[$<] - if {$1==1} g x +abs. +. 1e-8 -/ - elif {$1==2} g xy +sqr +[-2,-1] +. 1e-8 sqrt. /... . /[-2,-1] + repeat $! l[$<] + if $1==1 g x +abs. +. 1e-8 -/ + elif $1==2 g xy +sqr +[-2,-1] +. 1e-8 sqrt. /... . /[-2,-1] else g xyz +sqr +[-3--1] +. 1e-8 sqrt. /[-4,-3] . /[-2,-1] fi - endl done v + + endl done #@cli guided : [guide],radius[%]>=0,regularization[%]>=0 : radius[%]>=0,regularization[%]>=0 : (+) #@cli : Blur selected images by guided image filtering. #@cli : If a guide image is provided, it is used to drive the smoothing process. #@cli : A guide image must be of the same xyz-size as the selected images. #@cli : This command implements the filtering algorithm described in: -#@cli : He, Kaiming; Sun, Jian; Tang, Xiaoou, "Guided Image Filtering," Pattern Analysis and Machine Intelligence, -#@cli : IEEE Transactions on , vol.35, no.6, pp.1397,1409, June 2013 +#@cli : He, Kaiming; Sun, Jian; Tang, Xiaoou, "Guided Image Filtering", +#@cli : IEEE Transactions on Pattern Analysis and Machine Intelligence, vol.35, no.6, pp.1397,1409, June 2013 #@cli : $ image.jpg +guided 5,400 #@cli haar : scale>0 @@ -9843,32 +13161,32 @@ #@cli : $$ haar : check "isint(${1=1}) && $1>=0" e[^-1] "Compute haar transform of image$? with $1 scales." - v - repeat $! l[$>] + repeat $! l[$>] _haar - repeat {$1-1} + repeat $1-1 w={max(0,round(w/2^(1+$>))-1)} h={max(0,round(h/2^(1+$>))-1)} d={max(0,round(d/2^(1+$>))-1)} +z 0,0,0,$w,$h,$d _haar. j.. . rm. done - endl done v + + endl done _haar : # Mono-scale direct haar transform. _haar_x _haar_y _haar_z _haar_x : # Direct haar transform along the x-axis. - if {w<=1} return fi - if {w%2} v + error[0--6] "Command 'haar': Invalid image width="{w}" (is not even)." fi + if w<=1 return fi + if w%2 error[0--6] "Command 'haar': Invalid image width="{w}" (is not even)." fi +shift -1 r 50% +-[1] [0] +[0,1] / {sqrt(2)} a x _haar_y : # Direct haar transform along the y-axis. - if {h<=1} return fi - if {h%2} v + error[0--6] "Command 'haar': Invalid image height="{h}" (is not even)." fi + if h<=1 return fi + if h%2 error[0--6] "Command 'haar': Invalid image height="{h}" (is not even)." fi +shift 0,-1 r 100%,50% +-[1] [0] +[0,1] / {sqrt(2)} a y _haar_z : # Direct haar transform along the z-axis. - if {d<=1} return fi - if {d%2} v + error[0--6] "Command 'haar': Invalid image depth="{h}" (is not even)." fi + if d<=1 return fi + if d%2 error[0--6] "Command 'haar': Invalid image depth="{h}" (is not even)." fi +shift 0,0,-1 r 100%,100%,50% +-[1] [0] +[0,1] / {sqrt(2)} a z #@cli heat_flow : _nb_iter>=0,_dt,_keep_sequence={ 0 | 1 } @@ -9877,7 +13195,7 @@ #@cli : $ image.jpg +heat_flow 20 heat_flow : skip ${1=10},${2=30},${3=0} e[^-1] "Apply $1 iterations of the heat flow on image$?, with time step $2." - v - pde_flow $1,$2,laplacian,$3 v + + pde_flow $1,$2,laplacian,$3 #@cli hessian : { xx | xy | xz | yy | yz | zz }...{ xx | xy | xz | yy | yz | zz } : (no arg) : (+) #@cli : Compute the hessian components (second derivatives) of selected images. @@ -9890,28 +13208,27 @@ #@cli : Default values: (no arg) #@cli : $$ _dct-and-idct idct : skip ${1=0} - v - ({'"$1"'}) + ('"$1"') is_axes={im>=_'x'" && "iM<=_'z'} if $is_axes - v + e[0--3] "Compute inverse discrete cosine transform of image$? along axes '$1'." v - - repeat {w} + e[0--3] "Compute inverse discrete cosine transform of image$? along axes '$1'." + repeat w axis={i[$>]} - if {$axis==_'x'} repeat {$!-1} l[$>] if {w>1} _idct fi endl done - elif {$axis==_'y'} repeat {$!-1} l[$>] if {h>1} permute yxzc _idct permute yxzc fi endl done - elif {$axis==_'z'} repeat {$!-1} l[$>] if {d>1} permute zxyc _idct permute yzxc fi endl done + if $axis==_'x' repeat $!-1 l[$>] if w>1 _idct fi endl done + elif $axis==_'y' repeat $!-1 l[$>] if h>1 permute yxzc _idct permute yxzc fi endl done + elif $axis==_'z' repeat $!-1 l[$>] if d>1 permute zxyc _idct permute yzxc fi endl done fi done else rm. - v + e[0--3] "Compute inverse discrete cosine transform of image$?." v - + e[0--3] "Compute inverse discrete cosine transform of image$?." noarg repeat $! l[$>] - if {w>1} _idct fi - if {h>1} permute yxzc _idct permute yxzc fi - if {d>1} permute zxyc _idct permute yzxc fi + if w>1 _idct fi + if h>1 permute yxzc _idct permute yxzc fi + if d>1 permute zxyc _idct permute yzxc fi endl done fi - v + # 1D inverse transform (DCT-III) for a single image. _idct : @@ -9935,8 +13252,8 @@ #@cli : $ image.jpg iee iee : e[^-1] "Compute gradient-orthogonal-directed 2nd derivative of image$?." - v - repeat $! l[$>] - if {d==1} + repeat $! l[$>] + if d==1 +g xy,0 hessian... xxxyyy # ixx ixy iyy ix iy *... .. *[-4] . *[-4] -2 # ixx -2iyixy ixiyy ix iy +[-4,-3] *... .. # ixx -2ixiyixy+ix^2iyy ix iy @@ -9945,7 +13262,7 @@ else +inn laplacian.. - fi - endl done v + + endl done #@cli ifft : _{ x | y | z }...{ x | y | z } : (+) #@cli : Compute the inverse fourier transform (real and imaginary parts) of selected images. @@ -9956,32 +13273,32 @@ #@cli : Compute the inverse haar multiscale wavelet transform of selected images. ihaar : check "isint(${1=1}) && $1>=0" e[^-1] "Compute inverse haar transform of image$? with $1 scales." - v - repeat $! l[$>] - repeat {$1-1} + repeat $! l[$>] + repeat $1-1 w={max(0,round(w/2^(1+$<))-1)} h={max(0,round(h/2^(1+$<))-1)} d={max(0,round(d/2^(1+$<))-1)} +z 0,0,0,$w,$h,$d _ihaar. j.. . rm. done _ihaar - endl done v + + endl done _ihaar : # Mono-scale inverse haar transform. _ihaar_x _ihaar_y _ihaar_z _ihaar_x : # Inverse haar transform along the x-axis. - if {w<=1} return fi - if {w%2} v + error[0--6] "Command 'ihaar': Invalid image width="{w}" (is not even)." fi + if w<=1 return fi + if w%2 error[0--6] "Command 'ihaar': Invalid image width="{w}" (is not even)." fi s x,2 r 200% (-1,1) *[-2,-1] + / {sqrt(2)} _ihaar_y : # Inverse haar transform along the y-axis. - if {h<=1} return fi - if {h%2} v + error "Command 'ihaar': Invalid image height="{h}" (is not even)." fi + if h<=1 return fi + if h%2 error "Command 'ihaar': Invalid image height="{h}" (is not even)." fi s y,2 r 100%,200% (-1;1) r. {-2,w} *[-2,-1] + / {sqrt(2)} _ihaar_z : # Inverse haar transform along the z-axis. - if {d<=1} return fi - if {d%2} v + error "Command 'ihaar': Invalid image depth="{h}" (is not even)." fi + if d<=1 return fi + if d%2 error "Command 'ihaar': Invalid image depth="{h}" (is not even)." fi s z,2 r 100%,100%,200% (-1/1) r. {-2,w},{-2,h} *[-2,-1] + / {sqrt(2)} #@cli ilaplacian : { nb_iterations>0 | 0 },_time_step>0,_[initial_estimate] @@ -9992,13 +13309,13 @@ #@cli : Default values: 'nb_iterations=0','time_step=10' and '[initial_estimated]=(undefined)'. #@cli : $ image.jpg +laplacian +ilaplacian[-1] 0 ilaplacian : check "${1=0}>=0 && ${2=10}>0" skip "${3=}" - v - is_estimate=${"is_image_arg $3"} nb_iter={round($1)} - if {!$nb_iter} # Inversion in Fourier space + is_estimate=${"is_image_arg $3"} nb_iter={round($1)} + if !$nb_iter # Inversion in Fourier space if $is_estimate - v + e[0--4] "Invert Laplacian image$? in Fourier space, with initial estimate $3." v - + e[0--4] "Invert Laplacian image$? in Fourier space, with initial estimate $3." pass$3 1 ia=${-average_colors} rm. else - v + e[0--4] "Invert Laplacian image$? in Fourier space." v - + e[0--4] "Invert Laplacian image$? in Fourier space." ia=0 fi repeat $! l[$>] @@ -10009,113 +13326,126 @@ else # Inversion with PDE-flow if $is_estimate - v + e[0--4] "Invert Laplacian image$? using $1 iterations of PDE flow, with time step $2 and initial estimate $3." v - + e[0--4] "Invert Laplacian image$? using $1 iterations of PDE flow, with time step $2 and + initial estimate $3." repeat $! pass$3 0 l[$>,-1] repeat $1 +laplacian. -. ... *. {$2/max(abs(im),abs(iM))} +[^0] done k. endl done else - v + e[0--4] "Invert Laplacian image$? using $1 iterations of PDE flow, with time step $2." v - + e[0--4] "Invert Laplacian image$? using $1 iterations of PDE flow, with time step $2." repeat $! l[$>] +f 0 repeat $1 +laplacian. -. ... *. {$2/max(abs(im),abs(iM))} +[^0] done k. endl done fi fi - v + #@cli inn #@cli : Compute gradient-directed 2nd derivative of image(s). #@cli : $ image.jpg inn inn : e[^-1] "Compute gradient-directed 2nd derivative of image$?." - v - repeat $! l[$>] - if {d==1} - +g xy,0 hessian... xxxyyy # ixx ixy iyy ix iy - *[-5] .. *[-4] . *[-4] 2 # ixixx 2iyixy iyy ix iy - +[-5,-4] *[-4] .. # ix^2ixx+2ixiyixy iyy ix iy - sqr[-2,-1] *... . +[-4,-3] # ix^2ixx+2ixiyixy+iy^2iyy ix^2 iy^2 - +[-2,-1] +. 1e-8 / # (ix^2ixx+2ixiyixy+iy^2iyy)/(ix^2+iy^2) + repeat $! l[$>] + if d==1 + +g xy,0 hessian... xxxyyy # ixx ixy iyy ix iy + *[-5] .. *[-4] . *[-4] 2 # ixixx 2iyixy iyy ix iy + +[-5,-4] *[-4] .. # ix^2ixx+2ixiyixy iyy ix iy + sqr[-2,-1] *... . +[-4,-3] # ix^2ixx+2ixiyixy+iy^2iyy ix^2 iy^2 + +[-2,-1] +. 1e-8 / # (ix^2ixx+2ixiyixy+iy^2iyy)/(ix^2+iy^2) else - +g xyz,0 hessian[-4] xxxyxzyyyzzz # ixx ixy ixz iyy iyz izz ix iy iz - *[-9] ... *[-8] .. *[-8] 2 *[-7] . *[-7] 2 # ixixx 2iyixy 2izixz iyy iyz izz ix iy iz - +[-9--7] *[-7] ... # ix^2ixx+2ixiyixy+2ixizixy iyy iyz izz ix iy iz - *[-6] .. *[-5] . *[-5] 2 # ix^2ixx+2ixiyixy+2ixizixy iyiyy 2iziyz izz ix iy iz - +[-6,-5] *[-5] .. +[-6,-5] # ix^2ixx+2ixiyixy+2ixizixy+iy^2iyy+2iyiziyz izz ix iy iz - sqr[-3--1] *[-4] . +[-5,-4] # ix^2ixx+2ixiyixy+2ixizixy+iy^2iyy+2iyiziyz+iz^2izz ix^2 iy^2 iz^2 - +[-3--1] +. 1e-8 / # (ix^2ixx+2ixiyixy+2ixizixy+iy^2iyy+2iyiziyz+iz^2izz)/(ix^2+iy^2+iz^2) + +g xyz,0 hessian[-4] xxxyxzyyyzzz # ixx ixy ixz iyy iyz izz ix iy iz + *[-9] ... *[-8] .. *[-8] 2 *[-7] . *[-7] 2 # ixixx 2iyixy 2izixz iyy iyz izz ix iy iz + +[-9--7] *[-7] ... # ix^2ixx+2ixiyixy+2ixizixy iyy iyz izz ix iy iz + *[-6] .. *[-5] . *[-5] 2 # ix^2ixx+2ixiyixy+2ixizixy iyiyy 2iziyz izz ix iy iz + +[-6,-5] *[-5] .. +[-6,-5] # ix^2ixx+2ixiyixy+2ixizixy+iy^2iyy+2iyiziyz izz ix iy iz + sqr[-3--1] *[-4] . +[-5,-4] # ix^2ixx+2ixiyixy+2ixizixy+iy^2iyy+2iyiziyz+iz^2izz ix^2 iy^2 iz^2 + +[-3--1] +. 1e-8 / # (ix^2ixx+2ixiyixy+2ixizixy+iy^2iyy+2iyiziyz+iz^2izz)/(ix^2+iy^2+iz^2) fi - endl done v + + endl done -#@cli inpaint : [mask] : [mask],0,_fast_method : [mask],_patch_size>=1,_lookup_size>=1,_lookup_factor>=0,_lookup_increment!=0,_blend_size>=0,0<=_blend_threshold<=1,_blend_decay>=0,_blend_scales>=1,_is_blend_outer={ 0 | 1 } : (+) +#@cli inpaint : [mask] : [mask],0,_fast_method : \ +# [mask],_patch_size>=1,_lookup_size>=1,_lookup_factor>=0,_lookup_increment!=0,_blend_size>=0,\ +# 0<=_blend_threshold<=1,_blend_decay>=0,_blend_scales>=1,_is_blend_outer={ 0 | 1 } : (+) #@cli : Inpaint selected images by specified mask. #@cli : If no patch size (or 0) is specified, inpainting is done using a fast average or median algorithm. #@cli : Otherwise, it used a patch-based reconstruction method, that can be very time consuming. -#@cli : 'fast_method' can be { 0=low-connectivity average | 1=high-connectivity average | 2=low-connectivity median | 3=high-connectivity median }. -#@cli : Default values: 'patch_size=0', 'fast_method=1', 'lookup_size=22', 'lookup_factor=0.5', 'lookup_increment=1', 'blend_size=0', 'blend_threshold=0', 'blend_decay=0.05', 'blend_scales=10' and 'is_blend_outer=1'. +#@cli : 'fast_method' can be { 0=low-connectivity average | 1=high-connectivity average | 2=low-connectivity median | \ +# 3=high-connectivity median }. +#@cli : Default values: 'patch_size=0', 'fast_method=1', 'lookup_size=22', 'lookup_factor=0.5', 'lookup_increment=1', \ +# 'blend_size=0', 'blend_threshold=0', 'blend_decay=0.05', 'blend_scales=10' and 'is_blend_outer=1'. #@cli : $ image.jpg 100%,100% ellipse 50%,50%,30,30,0,1,255 ellipse 20%,20%,30,10,0,1,255 +inpaint[-2] [-1] remove[-2] -#@cli : $ image.jpg 100%,100% circle 30%,30%,30,1,255,0,255 circle 70%,70%,50,1,255,0,255 +inpaint[0] [1],5,15,0.5,1,9,0 remove[1] +#@cli : $ image.jpg 100%,100% circle 30%,30%,30,1,255,0,255 circle 70%,70%,50,1,255,0,255 \ +# +inpaint[0] [1],5,15,0.5,1,9,0 remove[1] -#@cli inpaint_diffusion : [mask],_nb_scales[%]>=0,_diffusion_type={ 0=isotropic | 1=delaunay-guided | 2=edge-guided | 3=mask-guided },_diffusion_iter>=0 +#@cli inpaint_pde : [mask],_nb_scales[%]>=0,_diffusion_type={ 0=isotropic | 1=delaunay-guided | \ +# 2=edge-guided | 3=mask-guided },_diffusion_iter>=0 #@cli : Inpaint selected images by specified mask using a multiscale transport-diffusion algorithm. -#@cli : If 'diffusion type==3', non-zero values of the mask (e.g. a distance function) are used to guide the diffusion process. +#@cli : If 'diffusion type==3', non-zero values of the mask (e.g. a distance function) are used +#@cli : to guide the diffusion process. #@cli : Default values: 'nb_scales=75%', 'diffusion_type=1' and 'diffusion_iter=20'. -#@cli : $ image.jpg 100%,100% ellipse[-1] 30%,30%,40,30,0,1,255 +inpaint_diffusion[0] [1] -inpaint_diffusion : check ${is_image_arg\ $1}" && ${2=75%}>=0 && isint(${3=1}) && $3>=0 && $3<=3 && ${4=20}>=0" - v - s0="isotropic" s1="delaunay-guided" s2="edge-guided" s3="mask-guided" - v + e[^-1] "Inpaint image$? by mask $1, using a multiscale diffusion algorithm with $2 scales and $4 iterations of "${s$3}" diffusion." v - +#@cli : $ image.jpg 100%,100% ellipse[-1] 30%,30%,40,30,0,1,255 +inpaint_pde[0] [1] +inpaint_pde : check ${is_image_arg\ $1}" && ${2=75%}>=0 && isint(${3=1}) && $3>=0 && $3<=3 && ${4=20}>=0" + s0="isotropic" s1="delaunay-guided" s2="edge-guided" s3="mask-guided" + e[^-1] "Inpaint image$? by mask $1, using a multiscale diffusion algorithm with $2 scales + and $4 iterations of "${s$3}" diffusion." repeat $! nm={n} pass$1 l[$>,-1] - nb_scalesM={round(log2(max(w,h,d)))} + nb_scalesM={ceil(log2(max(w,h,d)))} nb_scales={round(${"is_percent $2"}?$nb_scalesM*$2:$2)} nb_scales={max(1,min($nb_scales,$nb_scalesM))} nb_iter={max(5,$4)} repeat $nb_scales - scale={2^$<} - width={0,max(1,round(w/$scale))} - height={0,max(1,round(h/$scale))} - depth={0,max(1,round(d/$scale))} - $width,$height,$depth,{0,s} 100%,100%,100% - f[1] "const wl1 = w#-1 - 1; - const hl1 = h#-1 - 1; - const dl1 = d#-1 - 1; - const w1 = max(1,w - 1); - const h1 = max(1,h - 1); - const d1 = max(1,d - 1); - if(i,i, - X = round(x*wl1/w1); - Y = round(y*hl1/h1); - Z = round(z*dl1/d1); - I(#-2,X,Y,Z) += I(#0,x,y,z); - ++i(#-1,X,Y,Z); - 0)" + {0,"S = 2^"$<"; round([ max(1,w/S), max(1,h/S), max(1,d/S), s ])"} + 100%,100%,100% + eval[1] "const wl1 = w#-1 - 1; const hl1 = h#-1 - 1; const dl1 = d#-1 - 1; + const w1 = max(1,w - 1); const h1 = max(1,h - 1); const d1 = max(1,d - 1); + !i?( + X = round(x*wl1/w1); Y = round(y*hl1/h1); Z = round(z*dl1/d1); + I(#-2,X,Y,Z) += I(#0,x,y,z); + ++i(#-1,X,Y,Z) + );I" +max. 1 /[-3,-1] !=. 0 - if {!$>} # First scale: Initialize by value propagation + if !$> # First scale: Initialize by value propagation im={-2,im} +-.. {$im-1} *. .. +distance.. 1 *. -1 watershed.. . rm. +. {$im-1} mv. -3 fi - if {$>>0" || "$nb_scales==1} + if $>>0" || "$nb_scales==1 # Apply diffusion iterations. r... ..,3 - if {$3==0} # Isotropic diffusion + if $3==0 # Isotropic diffusion repeat $nb_iter j... ..,0,0,0,0,1,. b... 0.5 done - elif {$3==1} # Delaunay-guided - +distance. 1 g. a[-{d==1?2:3}--1] c orientation. - repeat {$nb_iter} + + elif $3==1 # Delaunay-guided + +distance. 1 100%,100%,100%,{d==1?2:3} + eval.. "* # Apply specific gradient scheme for distance function + const boundary = 1; + maxabs(a,b) = (abs(a)>abs(b)?a:b); + ix = maxabs(j(1) - i,i - j(-1)); + iy = maxabs(j(0,1) - i,i - j(0,-1)); + d>1?( + iz = maxabs(j(0,0,1) - i,i - j(0,0,-1)); + copy(I(#-1),[ ix,iy,iz ],3,whd); + ):copy(I(#-1),[ ix,iy ],2,whd)" + rm.. orientation. + repeat $nb_iter j[-4] ...,0,0,0,0,1,.. +warp[-4] .,1,2,1 *.. -1 warp[-5] ..,1,2,1 +[-5,-1] /[-4] 2 - done rm. - elif {$3==2} # Edge-guided + done + rm. + + elif $3==2 # Edge-guided repeat $nb_iter +diffusiontensors... 0,1,1.5,0.5 j[-4] ...,0,0,0,0,1,.. smooth[-4] .,1,10,0 rm. done + else # Mask-guided +r[1] .,2 g. a[-{d==1?2:3}--1] c orientation. - repeat {$nb_iter} + repeat $nb_iter j[-4] ...,0,0,0,0,1,.. +warp[-4] .,1,2,1 *.. -1 warp[-5] ..,1,2,1 +[-5,-1] /[-4] 2 done rm. @@ -10125,43 +13455,44 @@ rm[-2,-1] done nm. $nm rv[0,-1] rm. - endl rm. done v + + endl rm. done #@cli inpaint_flow : [mask],_nb_global_iter>=0,_nb_local_iter>=0,_dt>0,_alpha>=0,_sigma>=0 #@cli : Apply iteration of the inpainting flow on selected images. -#@cli : Default values: 'nb_global_iter=4', 'nb_global_iter=15', 'dt=10', 'alpha=1' and 'sigma=3'. +#@cli : Default values: 'nb_global_iter=10', 'nb_local_iter=100', 'dt=5', 'alpha=1' and 'sigma=3'. #@cli : $ image.jpg 100%,100% ellipse[-1] 30%,30%,40,30,0,1,255 inpaint_flow[0] [1] inpaint_flow : check ${is_image_arg\ $1}" && ${2=10}>=0 && ${3=100}>=0 && ${4=5}>0 && ${5=1}>=0 && ${6=3}>=0" e[^-1] "Apply $2x$3 iterations of the inpainting flow on image$?, with mask $1, time step $4, alpha $5 and sigma $6." - v - repeat $! pass$1 0 l[$>,-1] + repeat $! pass$1 0 l[$>,-1] r. [0],[0],[0],1,0 inpaint.. [1] repeat $2 progress {100*$>/($2-1)} +diffusiontensors.. 0,1,$5,$6,0 *. .. smooth... .,$3,$4,0 rm. done progress 100 - endl rm. done v + + endl rm. done #@cli inpaint_holes : maximal_area[%]>=0,_tolerance>=0,_is_high_connectivity={ 0 | 1 } #@cli : Inpaint all connected regions having an area less than specified value. #@cli : Default values: 'maximal_area=4', 'tolerance=0' and 'is_high_connectivity=0'. #@cli : $ image.jpg noise 5%,2 +inpaint_holes 8,40 inpaint_holes : check "${1=4}>=0 && ${2=0}>=0" skip ${3=0} - e[^-1] "Inpaint holes with area less than $1 pixels in image$?, with tolerance $2 and "${arg\ 1+!$3,high,low}" connectivity." - v - repeat $! l[$>] + e[^-1] "Inpaint holes with area less than $1 pixels in image$?, with tolerance $2 and "\ + ${arg\ 1+!$3,high,low}" connectivity." + repeat $! l[$>] 100%,100%,100% area={if(${is_percent\ $1},$1*w*h*d,$1)} - repeat {0,s} sh[0] $> +area. $2,$3 <=. $1 -|[1,-1] rm. done - if {im} k[0] whd={w},{h},{d} r 1,1,1,100%,2 r $whd,100% + repeat s#0 sh[0] $> +area. $2,$3 <=. $1 -|[1,-1] rm. done + if im k[0] whd={w},{h},{d} r 1,1,1,100%,2 r $whd,100% else inpaint[0] [1],0,{2*!$2+!!$3} k[0] fi - endl done v + + endl done #@cli inpaint_morpho : [mask] #@cli : Inpaint selected images by specified mask using morphological operators. #@cli : $ image.jpg 100%,100% ellipse[-1] 30%,30%,40,30,0,1,255 +inpaint_morpho[0] [1] inpaint_morpho : check ${is_image_arg\ $1} e[^-1] "Inpaint image$? by mask $1, using morphological operators." - v - repeat $! pass$1 0 l[$>,-1] + repeat $! pass$1 0 l[$>,-1] nm={0,n} im={0,im} iM={0,iM} im1={$im-1} iM1={$iM+1} channels. 0 ==. 0 +f[0] $im1 j. [0],0,0,0,0,1,.. @@ -10172,31 +13503,35 @@ replace.. $iM1,$im1 +[-2,-1] /. 2 j. ...,0,0,0,0,1,.. - while {im==$im1} + while im==$im1 k. nm $nm - endl done v + + endl done -#@cli inpaint_matchpatch : [mask],_nb_scales={ 0=auto | >0 },_patch_size>0,_nb_iterations_per_scale>0,_blend_size>=0,_allow_outer_blending={ 0 | 1 },_is_already_initialized={ 0 | 1 } +#@cli inpaint_matchpatch : [mask],_nb_scales={ 0=auto | >0 },_patch_size>0,_nb_iterations_per_scale>0,\ +# _blend_size>=0,_allow_outer_blending={ 0 | 1 },_is_already_initialized={ 0 | 1 } #@cli : Inpaint selected images by specified binary mask, using a multi-scale matchpatch algorithm. -#@cli : Default values: 'nb_scales=0', 'patch_size=9', 'nb_iterations_per_scale=10', 'blend_size=5', 'allow_outer_blending=1' and 'is_already_initialized=0'. +#@cli : Default values: 'nb_scales=0', 'patch_size=9', 'nb_iterations_per_scale=10', 'blend_size=5',\ +# 'allow_outer_blending=1' and 'is_already_initialized=0'. #@cli : $ image.jpg 100%,100% ellipse[-1] 30%,30%,40,30,0,1,255 +inpaint_matchpatch[0] [1] -inpaint_matchpatch : check ${is_image_arg\ $1}"&& ${2=0}>=0 && isint(${3=9}) && $3>0 && isint(${4=10}) && $4>0 && isint(${5=5}) && $5>=0" skip ${6=1},${7=0} - e[^-1] "Inpaint image$? with mask $1, using a multiscale patch-matching algorithm with "${"v - if $2 u \"$2 \" else u auto- fi v +"}\ - "scales, $3x$3 patches, $4 iterations per scale and blending size $5." - v - repeat $! pass$1 0 l[$>,-1] +inpaint_matchpatch : check ${is_image_arg\ $1}"&& ${2=0}>=0 && isint(${3=9}) && $3>0 && isint(${4=10}) && $4>0 && + isint(${5=5}) && $5>=0" skip ${6=1},${7=0} + e[^-1] "Inpaint image$? with mask $1, using a multiscale patch-matching algorithm with "\ + ${"if $2 u \"$2 \" else u auto- fi"}\ + "scales, $3x$3 patches, $4 iterations per scale and blending size $5." + repeat $! pass$1 0 l[$>,-1] nm={0,n} # Init variables and images. nm={0,n} nm img,mask nb_scales={max(1,round(if($2,$2,log2(min(w,h)/16)),1,1))} - visu_size=${fitscreen[]" "{0,w},{0,h},1,25%,50%} + visu_size=${fitscreen[]" "{0,[w,h,1]},25%,50%} slices[img] 0 r[mask] [img],[img],1,1,0 !=[mask] 0 - if {!$7} inpaint_diffusion[img] [mask],75% fi # Quick first estimate. + if !$7 inpaint_pde[img] [mask],75% fi # Quick first estimate. im={img,im} -[img] $im first_iter=1 iter=0 repeat $nb_scales scale={100*(0.5^$<)} - v + e[] "> Process scale "{1+$>}"/"$nb_scales" -> "$scale% v - + e[] "> Process scale "{1+$>}"/"$nb_scales" -> "$scale% progress {100*$>/max(1,$nb_scales-1)} # Compute image and mask at current scales. @@ -10260,12 +13595,13 @@ rm[correspondence] fi +[img] $im - endl rm[mask] done v + + nm[0] $nm + endl rm[mask] done # _inpaint_matchpatch : [correspondence_map],[mask],blend_size>0,_allow_outer_blending={ 0 | 1 } _inpaint_matchpatch : pass$1 1 pass$2 {!$3" || "!$4} - if {!$3} + if !$3 warp[0] [1],0,0,1 else if $4 erode. $3 fi @@ -10337,7 +13673,7 @@ #@cli : $ image.jpg +kuwahara 5 kuwahara : check $1>0 e[^-1] "Apply Kuwahara filter of size $1 on image$?." - v - repeat $! l[$>] + repeat $! l[$>] s={s} +dilate $1 compose_channels. min +erode[0] $1 compose_channels. max @@ -10356,16 +13692,16 @@ if(vm==v3,i(x-"$p",y+"$p",0,c,0,1), i(x+"$p",y+"$p",0,c,0,1)))))" channels 0,{s-2} - endl done v + + endl done #@cli laplacian #@cli : Compute Laplacian of selected images. #@cli : $ image.jpg laplacian laplacian : e[^-1] "Compute Laplacian of image$?." - v - repeat $! l[$>] + repeat $! l[$>] hessian ${arg\ 1+(d==1),xxyyzz,xxyy} + - endl done v + + endl done #@cli lic : _amplitude>0,_channels>0 #@cli : Render LIC representation of selected vector fields. @@ -10373,11 +13709,11 @@ #@cli : $ 400,400,1,2,'if(c==0,x-w/2,y-h/2)' +lic 200,3 quiver[-2] [-2],10,1,1,1,255 lic : skip ${1=30},${2=1} e[^-1] "Render LIC representation of 2D vector field$?, with amplitude $1 and $2 channel(s)." - v - repeat $! l[$>] nm={0,n} + repeat $! l[$>] nm={0,n} channels 0,1 / {max(abs(im),abs(iM))} vector2tensor 100%,100%,100%,$2 rand. 0,255 smooth. ..,$1 rm.. equalize - nm $nm endl done v + + nm $nm endl done #@cli map_tones : _threshold>=0,_gamma>=0,_smoothness>=0,nb_iter>=0 #@cli : Apply tone mapping operator on selected images, based on Poisson equation. @@ -10385,7 +13721,7 @@ #@cli : $ image.jpg +map_tones , map_tones : skip ${1=0.1},${2=0.8},${3=0.5},${4=30} e[^-1] "Apply tone mapping operator on image$?, with threshold $1, gamma $2, smoothness $3 and $4 iterations." - v - repeat $! l[$>] + repeat $! l[$>] # Estimate target divergence for each channel. +l s c repeat $! l[$>] @@ -10398,7 +13734,7 @@ # Start Poisson-PDE iterations repeat $4 +laplacian.. *. 0.25 +. ... -. .. *. 800 +[-3,-1] /.. 801 c.. 0,255 done rm. - endl done v + + endl done #@cli map_tones_fast : _radius[%]>=0,_power>=0 #@cli : Apply fast tone mapping operator on selected images. @@ -10406,13 +13742,13 @@ #@cli : $ image.jpg +map_tones_fast , map_tones_fast : check "${1=3%}>=0 && ${2=0.3}>=0" e[^-1] "Apply fast tone mapping operator on image$?, with radius $1 and power $2." - v - repeat $! l[$>] + repeat $! l[$>] +luminance b. $1 n 0,1 +*. 2 -. 1 abs. *. {$2*log(10)} exp. <=.. 0.5 r. ... +*... -1 +. 1 ^. .. *. -1 +. 1 *. ... ^[-4,-2] ==.. 0 *[-3,-2] + - endl done n 0,255 v + + endl done n 0,255 #@cli meancurvature_flow : _nb_iter>=0,_dt,_keep_sequence={ 0 | 1 } #@cli : Apply iterations of the mean curvature flow on selected images. @@ -10420,13 +13756,14 @@ #@cli : $ image.jpg +meancurvature_flow 20 meancurvature_flow : skip ${1=10},${2=30},${3=0} e[^-1] "Apply $1 iterations of the mean curvature flow on image$?, with time step $2." - v - pde_flow $1,$2,iee,$3 v + + pde_flow $1,$2,iee,$3 #@cli median : size>=0,_threshold>0 : (+) #@cli : Apply (opt. thresholded) median filter on selected images with structuring element size x size. #@cli : $ image.jpg +median 5 -#@cli nlmeans : [guide],_patch_radius>0,_spatial_bandwidth>0,_tonal_bandwidth>0,_patch_measure_command : _patch_radius>0,_spatial_bandwidth>0,_tonal_bandwidth>0,_patch_measure_command +#@cli nlmeans : [guide],_patch_radius>0,_spatial_bandwidth>0,_tonal_bandwidth>0,_patch_measure_command : \ +# _patch_radius>0,_spatial_bandwidth>0,_tonal_bandwidth>0,_patch_measure_command #@cli : Apply non local means denoising of Buades et al, 2005. on selected images. #@cli : The patch is a gaussian function of 'std _patch_radius'. #@cli : The spatial kernel is a rectangle of radius 'spatial_bandwidth'. @@ -10435,14 +13772,14 @@ #@cli : Default values: 'patch_radius=4', 'spatial_bandwidth=4', 'tonal_bandwidth=10' and 'patch_measure_command=-norm'. #@cli : $ image.jpg +noise 10 nlmeans[-1] 4,4,{0.6*${-std_noise}} nlmeans: - v - if ${"is_image_arg $1"} # Guided-filtering check "${2=4}>0 && ${3=4}>0 && ${4=10}>0" skip "${5=-norm}" - e[^-1] "Apply non-local means denoising on image$?, with guide $1, patch size $2, spatial bandwidth $3, tonal bandwidth $4 and patch measure command '$5'." + e[^-1] "Apply non-local means denoising on image$?, with guide $1, patch size $2, spatial bandwidth $3, + tonal bandwidth $4 and patch measure command '$5'." pass$1 0 l. $5 k[0] endl # [1] preprocessed image used to compute weights. - repeat {$!-1} l[$>,-1] + repeat $!-1 l[$>,-1] 100%,100%,100%,100%,{-1.0/($4*$4)} # [2] compute a scaling. nlmeans_core[0] [1],[2],$2,$3 rm. # Apply the NLM denoising with image 1 and 2 as parameter. endl done @@ -10452,26 +13789,27 @@ # Non-guided filtering check "${1=4}>0 && ${2=4}>0 && ${3=10}>0" skip "${4=-norm}" - e[^-1] "Apply non-local means denoising on image$?, with patch size $1, spatial bandwidth $2, tonal bandwidth $3 and patch measure command '$4'." + e[^-1] "Apply non-local means denoising on image$?, with patch size $1, spatial bandwidth $2, + tonal bandwidth $3 and patch measure command '$4'." repeat $! l[$>] +l $4 k[0] endl # [1] preprocessed image used to compute weights. 100%,100%,100%,100%,{-1.0/($3*$3)} # [2] compute a scaling. nlmeans_core[0] [1],[2],$1,$2 k[0] # Apply the NLM denoising with image 1 and 2 as parameter. endl done - - fi v + + fi #@cli nlmeans_core: _reference_image,_scaling_map,_patch_radius>0,_spatial_bandwidth>0 #@cli : Apply non local means denoising using a image for weight and a map for scaling nlmeans_core : check ${is_image_arg\ $1}" && "${is_image_arg\ $2}" && $3>0 && $4>0" - e[^-1] "Apply non-local means denoising using weight images $1, scaling map $2, patch size $3 and spatial bandwidth $4." - v - pass$1 0 pass$2 0 - repeat {$!-2} l[$>,-1,-2] + e[^-1] "Apply non-local means denoising using weight images $1, scaling map $2, patch size $3 and + spatial bandwidth $4." + pass$1 0 pass$2 0 + repeat $!-2 l[$>,-1,-2] # [0] original, [1] weights, [2] scaling [3] sum(weights * patch), [4] sum(weights), [5] max(weights) - 100%,100%,100%,{0,s},0 100%,100%,100%,{1,s},0 100%,100%,100%,{1,s},0 - if {{0,d}==1} - repeat {2*$4+1} j={$>-$4} repeat {2*$4+1} i={$>-$4} - if {$i!=0||$j!=0} + 100%,100%,100%,{0,s},0 100%,100%,100%,{1,s},0 100%,100%,100%,{1,s},1e-6 + if d#0==1 + repeat 2*$4+1 j={$>-$4} repeat 2*$4+1 i={$>-$4} + if $i!=0||$j!=0 # Compute shifted images [6] and weight [7] +shift[0,1] $i,$j,0,0,2 -[7] [1] sqr[7] b[7] $3 *[7] [2] exp[7] @@ -10480,8 +13818,8 @@ fi done done else - repeat {2*$4+1} k={$>-$4} repeat {2*$4+1} j={$>-$4} repeat {2*$4+1} i={$>-$4} - if {$i!=0||$j!=0||$k!=0} + repeat 2*$4+1 k={$>-$4} repeat 2*$4+1 j={$>-$4} repeat 2*$4+1 i={$>-$4} + if $i!=0||$j!=0||$k!=0 # Compute shifted images [6] and weight [7] +shift[0,1] $i,$j,0,0,2 -[7] [1] sqr[7] b[7] $3 *[7] [2] exp[7] @@ -10490,10 +13828,10 @@ fi done done done fi - max[5] 1e-6 rm[1,2] + rm[1,2] *[0] [3] +[1,0] +[1,2] # Add central patch / # Normalize - endl done v + + endl done #@cli normalize_local : _amplitude>=0,_radius>0,_n_smooth>=0[%],_a_smooth>=0[%],_is_cut={ 0 | 1 },_min=0,_max=255 #@cli : Normalize selected images locally. @@ -10501,8 +13839,9 @@ #@cli : $ image.jpg normalize_local 8,10 normalize_local : check "${1=3}>=0 && ${2=16}>0 && isbool(${5=1})" skip ${3=4%},${4=2%},${6=0},${7=255} - e[^-1] "Normalize image$? locally, with amplitude $1, radius $2, neighborhood smoothness $3 and average smoothness $4." - v - repeat $! l[$>] + e[^-1] "Normalize image$? locally, with amplitude $1, radius $2, neighborhood smoothness $3 and + average smoothness $4." + repeat $! l[$>] +l erode {2*$2+1} s c min endl +l.. dilate {2*$2+1} s c max endl +b... $4 b[-3,-2] $3 @@ -10511,18 +13850,53 @@ if $5 max.. $6 min. $7 fi -. .. *[-3,-1] + if $5 c $6,$7 fi - endl done v + + endl done #@cli normalized_cross_correlation : [mask] #@cli : Compute normalized cross-correlation of selected images with specified mask. #@cli : $ image.jpg +shift -30,-20 +normalized_cross_correlation[0] [1] normalized_cross_correlation : check ${is_image_arg\ $1} e[^-1] "Compute normalized cross-correlation of image$? with mask $1." - v - pass$1 0 norm repeat {$!-1} . l[$>,-1] + pass$1 0 norm repeat $!-1 . l[$>,-1] fft.. fft. [-2,-1] *.. [-5] *. [-6] -[-2,-1] *[-5,-3] *[-3,-2] +[-3,-2] [-2,-1] a[-2,-1] c norm. /... . /[-2,-1] ifft rm. - endl done rm. v + + endl done rm. + +#@cli percentile : [mask],0<=_min_percentile[%]<=100,0<=_max_percentile[%]<=100. +#@cli : Apply percentile averaging filter to selected images. +#@cli : Default values: 'min_percentile=0' and 'max_percentile=100'. +#@cli : $ image.jpg shape_circle 11,11 +percentile[0] [1],25,75 +percentile : check ${"is_image_arg $1"}" && inrange(${2=0},0,100) && inrange(${3=100},0,100) && $2<=$3" + vmin,vmax={_[${"is_percent $2"}?100*$2:$2,${"is_percent $3"}?100*$3:$3]} + e[^-1] "Apply percentile averaging filter to image$?, with mask $1, "\ + "min percentile "$vmin"% and max percentile "$vmax"%." + + # Generate code for masking. + pass$1 0 !=. 0 N={is} if !$N rm. return fi 128,$N + eval.. "> + begin( + p = 0; + const w2 = int(w/2); + const h2 = int(h/2); + ); + i?( + out = string('N[',p,']=j(',x - w2,',',y - h2,');'); + copy(i(#-1,0,p++),out,size(out)); + )" + discard. 0 code={t} rm[-2,-1] + + # Apply filter. + f " + begin( N = vector"$N"() ); + const boundary = 1; + const sS = size(N) - 1; + const s0 = round(sS*"$vmin"%); + const s1 = round(sS*"$vmax"%); + const ds = 1 + s1 - s0; + "$code" + S = sort(N); + res = 0; for (s = s0, s<=s1, ++s, res+=S[s]); res/=ds" #@cli peronamalik_flow : K_factor>0,_nb_iter>=0,_dt,_keep_sequence={ 0 | 1 } #@cli : Apply iterations of the Perona-Malik flow on selected images. @@ -10530,7 +13904,6 @@ #@cli : $ image.jpg +heat_flow 20 peronamalik_flow : check "${1=20}>0 && ${2=5}>=0" skip ${3=5},${4=0} e[^-1] "Apply $2 iterations of the Perona-Malik flow on image$?, with K factor $1 and time step $3." - v - m "_peronamalik_flow : +gradient xy,0 a[-2,-1] c norm. b. 0.8 /. $1 sqr. *. -1 exp. a[-2,-1] c f. '\"s1=s-1; @@ -10541,24 +13914,23 @@ (C+i(x,y+1,z,s-1,0,1))*(j(0,1,0,0,0,1)-i) - (C+i(x,y-1,z,s-1,0,1))*(i-j(0,-1,0,0,0,1)))\"'" pde_flow $2,$3,_peronamalik_flow,$4 - uncommand _peronamalik_flow - v + + um _peronamalik_flow #@cli phase_correlation : [destination] #@cli : Estimate translation vector between selected source images and specified destination. #@cli : $ image.jpg +shift -30,-20 +phase_correlation[0] [1] unroll[-1] y -phase_correlation : check ${is_image_arg\ $1} +phase_correlation : check ${"is_image_arg $1"} e[^-1] "Estimate shift between source image$? and destination $1." - v - repeat $! pass$1 - normalized_cross_correlation[$>] . rm. - l[$>] - ({[xM,yM,zM,cM]}) *. 2 s. x rm. - if {{-3,^}>{-4,w}} -... {-4,w} -... {-4,w} fi - if {{-2,^}>{-4,h}} -.. {-4,h} -.. {-4,h} fi - if {{^}>{-4,d}} -. {-4,d} -. {-4,d} fi - a[-3--1] c rm.. / 2 * -1 - nm [phase\ correlation] - endl done v + + pass$1 + repeat $!-1 + normalized_cross_correlation[$>] . + l[$>] eval " + store([xM>=w/2?xM - w:xM, + yM>=h/2?yM - h:yM, + zM>=d/2?zM - d:zM]*=-1,'res',1,1,1,3)" + endl + $res nm. "[phase correlation]" rv[$>,-1] rm. + done rm. #@cli pde_flow : _nb_iter>=0,_dt,_velocity_command,_keep_sequence={ 0 | 1 } #@cli : Apply iterations of a generic PDE flow on selected images. @@ -10566,7 +13938,7 @@ #@cli : $ image.jpg +pde_flow 20 pde_flow : skip ${1=10},${2=30},${3=laplacian},${4=0} e[^-1] "Apply $1 iterations of the velocity flow '$3' on image$?, with time step $2." - v - repeat $! l[$<] + repeat $! l[$<] repeat $1 +$3. *. {$2/(0.01+max(abs(im),abs(iM)))} if $4 +. .. else +[-2,-1] fi @@ -10574,19 +13946,128 @@ if $4 rm[0] fi a x endl done - if $4 s x,$1 fi v + + if $4 s x,$1 fi #@cli periodize_poisson #@cli : Periodize selected images using a Poisson solver in Fourier space. #@cli : $ image.jpg +periodize_poisson array 2,2,2 periodize_poisson : e[^-1] "Periodize image$? using Poisson solver in Fourier space." - v - repeat $! l[$>] + repeat $! l[$>] s c repeat $! l[$>] mM={[im,iM]} sum={0,ia} laplacian ilaplacian 0 + $sum c $mM endl done a c - endl done v + + endl done + +#@cli rbf : dx,_x0,_x1,_phi(r) : dx,dy,_x0,_y0,_x1,_y1,_phi(r) : dx,dy,dz,x0,y0,z0,x1,y1,z1,phi(r) +#@cli : Reconstruct 1D/2D or 3D image from selected sets of keypoints, by RBF-interpolation. +#@cli : A set of keypoints is represented by a vector-valued image, where each pixel represents a single keypoint. +#@cli : Vector components of a keypoint have the following meaning: +#@cli : - For 1D reconstruction: [ x_k, f1(k),...fN(k) ]. +#@cli : - For 2D reconstruction: [ x_k,y_k, f1(k),...,fN(k) ]. +#@cli : - For 3D reconstruction: [ x_k,y_k,z_k, f1(k),...,fN(k) ]. +#@cli : Values 'x_k','y_k' and 'z_k' are the spatial coordinates of keypoint 'k'. +#@cli : Values 'f1(k),..,fN(k)' are the 'N' components of the vector value of keypoint 'k'. +#@cli : The command reconstructs an image with specified size 'dx'x'dy'x'dz', with 'N' channels. +#@cli : Default values: 'x0=y0=z0=0', 'x1=dx-1', 'y1=dy-1', 'z1=dz-1', 'phi(r)=r^2*log(1e-5+r)'. +#@cli : $ sp colorful r2dx 400 100%,100% noise_poissondisk. 10 1,{is},1,5 \ +# eval[-2] "begin(p=0);i?(I[#-1,p++]=[x,y,I(#0)])" to_rgb[1] mul[0,1] dilate_circ[0] 5 +rbf[-1] {0,[w,h]} c[-1] 0,255 +#@cli : $ 32,1,1,5,u([400,400,255,255,255]) rbf 400,400 c 0,255 +rbf : + $=a d_phi_r=r^2*log(1e-5+r) + if isin($#,1,3,4) # 1D reconstruction + dx,x0,x1=$a1,{$#>1?[$a2,$a3]:[0,$a1-1]} + phi_r={`$#>3?['$a4']:'$d_phi_r'`} + check $dx>0 + e[^-1] "Reconstruct 1D image from keypoint set$?, with size "$dx", "\ + "from ("$x0") to ("$x1") and phi(r) = "$phi_r. + repeat $! l[$>] nm={n} if !w $dx elif whd==1 channels. 1,100% r. $dx,1,1,100% else + r 1,{whd},1,100%,-1 permute. cyzx + $dx,1,1,{w-1},"* + begin( + phi(r) = ("$phi_r"); + ref(crop(#0,0,0,0,0,1,h#0,1,1),X); + ref(crop(#0,1,0,0,0,s,h#0,1,1,1),F); + ref(vector(#h#0^2),M); + for (k = 0, k2?[$a3,$a4,$a5,$a6]:[0,0,[$a1,$a2]-1]} + phi_r={`$#>6?['$a7']:'$d_phi_r'`} + check $dx>0" && "$dy>0 + e[^-1] "Reconstruct 2D image from keypoint set$?, with size "$dx,$dy", "\ + "from ("$x0,$y0") to ("$x1,$y1") and phi(r) = "$phi_r. + repeat $! l[$>] nm={n} if !w $dx,$dy elif whd==1 channels 2,100% r. $dx,$dy,1,100% else + r 1,{whd},1,100%,-1 permute. cyzx + $dx,$dy,1,{w-2},"* + begin( + phi(r) = ("$phi_r"); + ref(crop(#0,0,0,0,0,1,h#0,1,1),X); + ref(crop(#0,1,0,0,0,1,h#0,1,1),Y); + ref(crop(#0,2,0,0,0,s,h#0,1,1,1),F); + ref(vector(#h#0^2),M); + for (k = 0, k3?[$a4,$a5,$a6,$a7,$a8,$a9]:[0,0,0,[$a1,$a2,$a3]-1]} + phi_r={`$#>9?['$arg10']:'$d_phi_r'`} + check $dx>0" && "$dy>0" && "$dz>0 + e[^-1] "Reconstruct 3D image from keypoint set$?, with size "$dx,$dy,$dz", "\ + "from ("$x0,$y0,$z0") to ("$x1,$y1,$z1") and phi(r) = "$phi_r. + repeat $! l[$>] nm={n} if !w $dx,$dy,$dz elif whd==1 channels 3,100% r. $dx,$dy,$dz,100% else + r 1,{whd},1,100%,-1 permute. cyzx + $dx,$dy,$dz,{w-3},"* + begin( + phi(r) = ("$phi_r"); + ref(crop(#0,0,0,0,0,1,h#0,1,1),X); + ref(crop(#0,1,0,0,0,1,h#0,1,1),Y); + ref(crop(#0,2,0,0,0,1,h#0,1,1),Z); + ref(crop(#0,3,0,0,0,s,h#0,1,1,1),F); + ref(vector(#h#0^2),M); + for (k = 0, k=0,0<=attenuation<=1 #@cli : Attenuate red-eye effect in selected images. @@ -10594,10 +14075,10 @@ #@cli : $ image.jpg +red_eye , red_eye : skip ${1=75},${2=3.5},${3=0.1} e[^-1] "Attenuate red-eye effect in image$?, with threshold $1, smoothness $2 and attenuation $3." - v - to_rgb rgb2ycbcr repeat $! l[$>] + to_rgb rgb2ycbcr repeat $! l[$>] s c -. 128 +>=. $1% b. $2 sqrt. *. -1 +. 1 n. $3,1 *[-2,-1] +. 128 a c ycbcr2rgb - endl done v + + endl done #@cli remove_hotpixels : _mask_size>0, _threshold[%]>0 #@cli : Remove hot pixels in selected images. @@ -10605,23 +14086,23 @@ #@cli : $ image.jpg noise 10,2 +remove_hotpixels , remove_hotpixels : check ${1=3}>0 skip ${2=10%} e[^-1] "Remove hot pixels in image$?, with mask size $1 and threshold $2." - v - repeat $! l[$>] + repeat $! l[$>] +median $1 +- abs. >=. $2 *.. . ==. 0 *[-3,-1] + - endl done v + + endl done #@cli remove_pixels : number_of_pixels[%]>=0 #@cli : Remove specified number of pixels (i.e. set them to 0) from the set of non-zero pixels in selected images. #@cli : $ image.jpg +remove_pixels 50% remove_pixels : check "$1>=0" e[^-1] "Remove $1 of the non-zero pixels in image$?." - v - repeat $! l[$>] + repeat $! l[$>] +norm !=. 0 N={is} # Number of non-zero pixels. n={round(if(${"is_percent $1"},$N*$1,$1))} # Number of pixels to remove. - if {$n<=0} rm. # No pixels to remove. - elif {$n>=$N} rm. f 0 # All pixels to remove. - elif {$n>int($N/2)} # More pixels to remove than to keep. + if $n<=0 rm. # No pixels to remove. + elif $n>=$N rm. f 0 # All pixels to remove. + elif $n>int($N/2) # More pixels to remove than to keep. remove_pixels. {$N-$n} ==. 0 * else # Less pixels to remove than to keep. d={d} r 100%,{d*h},1,100%,-1 # Force image to be in 2D. @@ -10634,7 +14115,7 @@ # Generate a 1xN vector with at least n non-zero pixels. do 1,100%,1,1 rand. 0,{h} <=. {$n*1.25} - if {is>=$n} break else rm. fi + if is>=$n break else rm. fi while 1 # Generate a 1xn vector of coordinates to 'remove'. @@ -10646,14 +14127,14 @@ i.. ({'CImg3d'},{h},{h}) 1,100%,1,1,1 1,100%,1,1,y a[-2,-1] x 3,100% 1,100%,1,1,1 y[-5--1] a[-5--1] y - if {0,s<=3} j3d.. .,0,0,0,1,0,0,0,0 + if s#0<=3 j3d.. .,0,0,0,1,0,0,0,0 else [0],[0],1,1,1 j3d. ..,0,0,0,1,0,0,0,0 *[0,-1] fi rm. r 100%,{h/$d},$d,100%,-1 # Resize to original dimension (eventually 3D). fi - endl done v + + endl done #@cli rolling_guidance : std_deviation_s[%]>=0,std_deviation_r[%]>=0,_precision>=0 #@cli : Apply the rolling guidance filter on selected image. @@ -10663,18 +14144,18 @@ #@cli : $ image.jpg +rolling_guidance , +- rolling_guidance : check "${1=4}>=0 && ${2=10}>=0 && ${3=0.5}>=0" e[^-1] "Apply rolling guidance filter on image$?, with standard deviations ($1,$2) and precision $3." - v - precision={2^-$3} + precision={2^-$3} repeat $! l[$>] +b $1 repeat 100 - if {c>1} +norm. +bilateral... .,$1,$2 rm.. + if c>1 +norm. +bilateral... .,$1,$2 rm.. else +bilateral.. .,$1,$2 fi -.. . std={-2,sqrt(iv)} rm.. - if {$std<$precision} break fi + if $std<$precision break fi done k. - endl done v + + endl done #@cli sharpen : amplitude>=0 : amplitude>=0,edge>=0,_alpha,_sigma : (+) #@cli : Sharpen selected images by inverse diffusion or shock filters methods. @@ -10683,11 +14164,16 @@ #@cli : $ image.jpg sharpen 300 #@cli : $ image.jpg blur 5 sharpen 300,1 -#@cli smooth : amplitude[%]>=0,_sharpness>=0,0<=_anisotropy<=1,_alpha[%],_sigma[%],_dl>0,_da>0,_precision>0,interpolation,_fast_approx={ 0 | 1 } : nb_iterations>=0,_sharpness>=0,_anisotropy,_alpha,_sigma,_dt>0,0 : [tensor_field],_amplitude>=0,_dl>0,_da>0,_precision>0,_interpolation,_fast_approx={ 0 | 1 } : [tensor_field],_nb_iters>=0,_dt>0,0 : (+) +#@cli smooth : amplitude[%]>=0,_sharpness>=0,0<=_anisotropy<=1,_alpha[%],_sigma[%],_dl>0,_da>0,\ +# _precision>0,_interpolation,_fast_approx={ 0 | 1 } : \ +# nb_iterations>=0,_sharpness>=0,_anisotropy,_alpha,_sigma,_dt>0,0 : [tensor_field],_amplitude>=0,_dl>0,_da>0,\ +# _precision>0,_interpolation,_fast_approx={ 0 | 1 } : \ +# [tensor_field],_nb_iters>=0,_dt>0,0 : (+) #@cli : Smooth selected images anisotropically using diffusion PDE's, with specified field of #@cli : diffusion tensors. #@cli : 'interpolation' can be { 0=nearest | 1=linear | 2=runge-kutta }. -#@cli : Default values: 'sharpness=0.7', 'anisotropy=0.3', 'alpha=0.6', 'sigma=1.1', 'dl=0.8', 'da=30', 'precision=2', 'interpolation=0' and 'fast_approx=1'. +#@cli : Default values: 'sharpness=0.7', 'anisotropy=0.3', 'alpha=0.6', 'sigma=1.1', 'dl=0.8', 'da=30', \ +# 'precision=2', 'interpolation=0' and 'fast_approx=1'. #@cli : $ image.jpg repeat 3 smooth 40,0,1,1,2 done #@cli : $ image.jpg 100%,100%,1,2 rand[-1] -100,100 repeat 2 smooth[-1] 100,0.2,1,4,4 done warp[0] [-1],1,1 #@cli : $$ @@ -10697,7 +14183,7 @@ #@cli : $ image.jpg split_freq 2% split_freq : e[^-1] "Split image$? into low and high frequency parts, with smoothness $1." - v - repeat $! l[$>] +b $1 -[0] [1] rv endl done v + + repeat $! l[$>] +b $1 -[0] [1] rv endl done #@cli solve_poisson : "laplacian_command",_nb_iterations>=0,_time_step>0,_nb_scales>=0 #@cli : Solve Poisson equation so that applying 'laplacian[n]' is close to the result of 'laplacian_command[n]'. @@ -10706,10 +14192,11 @@ #@cli : Default values: 'nb_iterations=60', 'dt=5' and 'nb_scales=0'. #@cli : $ image.jpg command "foo : gradient x" +solve_poisson foo +foo[0] +laplacian[1] solve_poisson : check "${2=60}>=0 && ${3=5}>0 && ${4=0}>=0" - e[^-1] "Solve Poisson equation for image$?, for laplacian command '$1', with $2 iterations, time step $3 and "${arg\ 1+($4==0),$4,auto}" scales." - v - repeat $! l[$>] + e[^-1] "Solve Poisson equation for image$?, for laplacian command '$1', with $2 iterations, time step $3 and "\ + ${arg\ 1+($4==0),$4,auto}" scales." + repeat $! l[$>] [0] - repeat {if($4,$4,int(max(log2(max(w,h))-1,1)))} + repeat if($4,$4,int(max(log2(max(w,h))-1,1))) f={2^$<} r[1] {0,max(1,w/$f)},{0,max(1,h/$f)},1,100%,3 +r[0] [1],2 l. -$1 k[0] endl @@ -10717,7 +14204,7 @@ rm. done rm[0] - endl done v + + endl done #@cli split_details : _nb_scales>0,_base_scale[%]>=0,_detail_scale[%]>=0 #@cli : Split selected images into 'nb_scales' detail scales. @@ -10726,34 +14213,34 @@ #@cli : Default values: 'nb_scales=4', 'base_scale=0' and 'detail_scale=0'. #@cli : $ image.jpg split_details , split_details : check "isint(${1=4}) && $1>0 && ${2=0}>=0 && ${3=0}>=0" - if {($2)==0" && "($3)==0} + if ($2)==0" && "($3)==0 e[^-1] "Split image$? using $1 spatial scales and 'a trous' wavelets." - v - repeat $! l[$<] - repeat {$1-1} + repeat $! l[$<] + repeat $1-1 +f. "begin(interpolation = 0; boundary = 1; d = 2^"$>"; d2 = d*2); i(x - d2) + i(x + d2) + 4*i(x - d) + 4*i(x + d) + 6*i;" /. 16 - if {h>1} + if h>1 f. "begin(interpolation = 0; boundary = 1; d = 2^"$>"; d2 = d*2); i(x,y - d2) + i(x,y + d2) + 4*i(x,y - d) + 4*i(x,y + d) + 6*i;" /. 16 fi - if {d>1} + if d>1 f. "begin(interpolation = 0; boundary = 1; d = 2^"$>"; d2 = d*2); i(x,y,z - d2) + i(x,y,z + d2) + 4*i(x,y,z - d) + 4*i(x,y,z + d) + 6*i;" /. 16 fi -.. . done rv - endl done v + + endl done else e[^-1] "Split image$? using $1 spatial scales with base scale $2 and detail scale $3." - v - repeat $! l[$<] + repeat $! l[$<] ss={max(0.3,if(${is_percent\ $2},$2*max(w,h),$2))} se={max(0.3,if(${is_percent\ $3},$3*max(w,h),$3))} ds={$se-$ss} - repeat {$1-1} +b. {$ss+$>*$ds/max(1,$1-2)} -.. . rv[-2,-1] done - endl done v + + repeat $1-1 +b. {$ss+$>*$ds/max(1,$1-2)} -.. . rv[-2,-1] done + endl done fi #@cli structuretensors : _scheme={ 0=centered | 1=forward/backward } : (+) @@ -10762,16 +14249,17 @@ #@cli : $ image.jpg structuretensors abs pow 0.2 #@cli : $$ -#@cli solidify : _smoothness[%]>=0,_diffusion_type={ 0=isotropic | 1=delaunay-oriented | 2=edge-oriented },_diffusion_iter>=0 +#@cli solidify : _smoothness[%]>=0,_diffusion_type={ 0=isotropic | 1=delaunay-oriented | 2=edge-oriented },\ +# _diffusion_iter>=0 #@cli : Solidify selected transparent images. #@cli : Default values: 'smoothness=75%', 'diffusion_type=1' and 'diffusion_iter=20'. #@cli : $ image.jpg 100%,100% circle[-1] 50%,50%,25%,1,255 append c +solidify , display_rgba solidify : check "${1=75%}>=0 && isint(${2=1}) && $2>=0 && $2<=2 && ${3=20}>=0" - v - s0="isotropic" s1="delaunay-oriented" s2="edge-oriented" - v + e[^-1] "Solidify transparent image$? with smoothness $1 and $3 iterations of "${s$2}" diffusion." v - + s0="isotropic" s1="delaunay-oriented" s2="edge-oriented" + e[^-1] "Solidify transparent image$? with smoothness $1 and $3 iterations of "${s$2}" diffusion." repeat $! l[$>] split_opacity - if {$!>1} <=. 128 inpaint_diffusion.. [1],${1-3} rm. c 0,255 fi - endl done v + + if $!>1 <=. 128 inpaint_pde.. [1],${1-3} rm. c 0,255 fi + endl done #@cli syntexturize : _width[%]>0,_height[%]>0 #@cli : Resynthetize 'width'x'height' versions of selected micro-textures by phase randomization. @@ -10781,15 +14269,15 @@ #@cli : $ image.jpg crop 2,282,50,328 +syntexturize 320,320 syntexturize : check "${1=100%}>0 && ${2=$1}>0" e[^-1] "Resynthetize $1x$2 versions of texture$? by phase randomization." - v - repeat $! l[$>] + repeat $! l[$>] # Prepare input image data. - mM={[im,iM]} repeat {s} sh. $> sum$>={is} var$>={iv} rm. done # Retrieve some stats for post-normalization. + mM={[im,iM]} repeat s sh. $> sum$>={is} var$>={iv} rm. done # Retrieve some stats for post-normalization. nw={if(${is_percent\ $1},$1*w,$1)} nh={if(${is_percent\ $2},$2*h,$2)} - repeat {s} sum$>*={$nw*$nh/(w*h)} done # Re-estimate output (0,0) frequency. + repeat s sum$>*={$nw*$nh/(w*h)} done # Re-estimate output (0,0) frequency. - if {$nw>w||$nh>h} # Spot extension required when rendering on bigger image. + if $nw>w||$nh>h # Spot extension required when rendering on bigger image. periodize_poisson 100%,100% rectangle. 5,5,{w-6},{h-6},1,1 b. 2 n. 0,1 $nw,$nh,1,{-2,s} fc. ${average_colors...} @@ -10804,9 +14292,9 @@ # Compute coherent random phase. 100%,100% rand. {-pi},{pi} =. 0 - if {!(w%2)} =. {(u<0.5)*pi},{int(w/2)} fi - if {!(h%2)} =. {(u<0.5)*pi},0,{int(h/2)} fi - if {!(h%2)&&!(h%2)} =. {(u<0.5)*pi},{int(w/2)},{int(h/2)} fi + if !(w%2) =. {(u<0.5)*pi},{int(w/2)} fi + if !(h%2) =. {(u<0.5)*pi},0,{int(h/2)} fi + if !(h%2)&&!(h%2) =. {(u<0.5)*pi},{int(w/2)},{int(h/2)} fi # Add random phase to fft of input image. +sin. cos.. @@ -10814,21 +14302,23 @@ *[-5,-3] *[-3,-2] -[-3,-2] # Get synthetized result and normalize it. - repeat {s} =.. ${sum$>},0,0,0,$> =. 0,0,0,0,$> done + repeat s =.. ${sum$>},0,0,0,$> =. 0,0,0,0,$> done ifft rm. - repeat {s} sh. $> avg={ia} -. $avg *. {sqrt(${var$>}/if(iv,iv,1))} +. $avg rm. done + repeat s sh. $> avg={ia} -. $avg *. {sqrt(${var$>}/if(iv,iv,1))} +. $avg rm. done c $mM - endl done v + + endl done #@cli syntexturize_matchpatch : _width[%]>0,_height[%]>0,_nb_scales>=0,_patch_size>0,_blending_size>=0,_precision>=0 #@cli : Resynthetize 'width'x'height' versions of selected micro-textures using a patch-matching algorithm. #@cli : If 'nbscales==0', the number of scales used is estimated from the image size. #@cli : Default values: 'width=height=100%', 'nb_scales=0', 'patch_size=7', 'blending_size=5' and 'precision=1'. #@cli : $ image.jpg crop 25%,25%,75%,75% syntexturize_matchpatch 512,512 -syntexturize_matchpatch : check "${1=100%}>0 && ${2=$1}>0 && isint(${3=0}) && $3>=0 && isint(${4=7}) && $4>0 && ${5=5}>=0 && ${6=1}>=0" - e[^-1] "Resynthetize $1x$2 version(s) of texture$? using a patch-matching algorithm with "${"v - if $3 u \"$3 \" else u auto- fi v +"}"scales, $4x$4 patches, blending size $5 and precision $6." - v - repeat $! l[$>] +syntexturize_matchpatch : check "${1=100%}>0 && ${2=$1}>0 && isint(${3=0}) && $3>=0 && isint(${4=7}) && $4>0 && + ${5=5}>=0 && ${6=1}>=0" + e[^-1] "Resynthetize $1x$2 version(s) of texture$? using a patch-matching algorithm with "\ + ${"if $3 u \"$3 \" else u auto- fi"}"scales, $4x$4 patches, blending size $5 and precision $6." + repeat $! l[$>] nb_scales={round(if($3,$3,log2(min(w,h)/16)),1,1)} width={if(${"is_percent $1"},round(w*$1,1,1),$1)} height={if(${"is_percent $2"},round(h*$2,1,1),$2)} @@ -10837,7 +14327,7 @@ scale={100*(0.5^$<)} +r[0] $scale%,$scale%,1,3,2 - if {!$>} + if !$> # Initialization. {1+round(w*$width/{0,w},1,1)},{1+round(h*$height/{0,h},1,1)},1,1 @@ -10870,7 +14360,7 @@ # Synthesis. psize={-2,min(w,h,$4)} - repeat {1+$6*$<} + repeat 1+$6*$< psynth={int(max(3,$5*$scale%))} +warp_patch.. .,$psynth matchpatch. ...,$psize,$psize,1,4,4,0,0,.. rm.. @@ -10880,11 +14370,11 @@ done warp_patch.. .,$5 rm. r $width,$height,1,100%,0,0,0.5,0.5 - endl done v + + endl done # _syntexturize_matchpatch : [correspondence_map],blend_size>0 _syntexturize_matchpatch : check ${is_image_arg\ $1}" && isint(${2=3}) && $2>=0" - if {$2<=1} pass$1 warp[^-1] .,0 rm. + if $2<=1 pass$1 warp[^-1] .,0 rm. else repeat $! pass$1 l[$>,-1] [1],[1],1,[0] f. "*begin( @@ -10924,7 +14414,7 @@ #@cli : $ image.jpg +tv_flow 40 tv_flow : skip ${1=10},${2=30},${3=0} e[^-1] "Apply $1 iterations of the total variation flow on image$?, with time step $2." - v - pde_flow $1,$2,curvature,$3 v + + pde_flow $1,$2,curvature,$3 #@cli unsharp : radius[%]>=0,_amount>=0,_threshold[%]>=0 #@cli : Apply unsharp mask on selected images. @@ -10932,11 +14422,11 @@ #@cli : $ image.jpg blur 3 +unsharp 1.5,15 cut 0,255 unsharp : check "${2=2}>=0" skip ${3=0} e[^-1] "Apply unsharp mask on image$?, with radius $1, amount $2 and threshold $3." - v - repeat $! + repeat $! +b[$>] $1 -. [$>] if $3 +norm. >=. $3 *[-2,-1] fi *. $2 -[$>,-1] - done v + + done #@cli unsharp_octave : _nb_scales>0,_radius[%]>=0,_amount>=0,threshold[%]>=0 #@cli : Apply octave sharpening on selected images. @@ -10944,7 +14434,7 @@ #@cli : $ image.jpg blur 3 +unsharp_octave 4,5,15 cut 0,255 unsharp_octave : check "${1=4}>0 && ${3=2}>=0" skip ${2=1},${4=0} e[^-1] "Apply octave sharpening on image$?, with $1 scales, radius $2, amount $3 and threshold $4." - v - repeat $! l[$>] nm={0,n} + repeat $! l[$>] nm={0,n} +f 0 weight=0 repeat $1 +unsharp[0] {$2*2^-$<},$3,$4 *. {2^-$>} @@ -10952,7 +14442,7 @@ +[1,-1] done rm[0] / $weight - nm $nm endl done v + + nm $nm endl done #@cli vanvliet : std_deviation>=0[%],order={ 0 | 1 | 2 | 3 },axis={ x | y | z | c },_boundary_conditions : (+) #@cli : Apply Vanvliet recursive filter on selected images, along specified axis and with @@ -10964,22 +14454,24 @@ #@cli voronoi #@cli : Compute the discrete Voronoi diagram of non-zero pixels in selected images. -#@cli : $ 400,400 noise 0.2,2 eq 1 +label_fg 0 voronoi[-1] +gradient[-1] xy,1 append[-2,-1] c norm[-1] ==[-1] 0 map[-2] 2,2 mul[-2,-1] normalize[-2] 0,255 dilate_circ[-2] 4 reverse max +#@cli : $ 400,400 noise 0.2,2 eq 1 +label_fg 0 voronoi[-1] +gradient[-1] xy,1 append[-2,-1] c \ +# norm[-1] ==[-1] 0 map[-2] 2,2 mul[-2,-1] normalize[-2] 0,255 dilate_circ[-2] 4 reverse max voronoi : e[^-1] "Compute the discrete Voronoi diagram of non-zero pixels in image$?." - v - repeat $! l[$>] s c repeat $! l[$>] + repeat $! l[$>] s c repeat $! l[$>] +!=. 0 distance. 1 *. -1 watershed.. . rm. - endl done a c endl done v + + endl done a c endl done #@cli watermark_fourier : text,_size>0 #@cli : Add a textual watermark in the frequency domain of selected images. #@cli : Default value: 'size=33'. -#@cli : $ image.jpg +watermark_fourier "Watermarked!" +display_fft remove[-3,-1] normalize 0,255 append[-4,-2] y append[-2,-1] y +#@cli : $ image.jpg +watermark_fourier "Watermarked!" +display_fft remove[-3,-1] normalize 0,255 \ +# append[-4,-2] y append[-2,-1] y watermark_fourier : check ${2=33}>0 e[^-1] "Add textual watermark '$1' with size $2 in the frequency domain of image$?." - v - i[0] 0 t[0] "$1",0,0,$2,1,1 >=[0] 0.5 autocrop[0] 0 - repeat {$!-1} w2={int(w/2)} h2={int(h/2)} + i[0] 0 t[0] "$1",0,0,$2,1,1 >=[0] 0.5 autocrop[0] 0 + repeat $!-1 w2={int(w/2)} h2={int(h/2)} fft. shift[-2,-1] $w2,$h2,0,0,2 [0],[0],1,{s} @@ -10995,7 +14487,7 @@ shift[-2,-1] -$w2,-$h2,0,0,2 ifft[-2,-1] rm. mv. 1 done - rm[0] v + + rm[0] #@cli watershed : [priority_image],_is_high_connectivity={ 0 | 1 } : (+) #@cli : Compute the watershed transform of selected images. @@ -11014,10 +14506,11 @@ #@cli : $ image.jpg luminance stencil[-1] 1 +area 0 #@cli : $$ area : check "$1>=0" skip ${2=0} - e[^-1] "Compute area of connected components in image$?, with tolerance $1 and "${arg\ 1+!$2,high,low}" connectivity." - v - repeat $! l[$>] s c + e[^-1] "Compute area of connected components in image$?, with tolerance $1 and "\ + ${arg\ 1+!$2,high,low}" connectivity." + repeat $! l[$>] s c repeat $! label[$>] $1,$2 nb={$>,1+iM} +histogram[$>] $nb,0,{$nb-1} map[$>] . rm. done - a c endl done v + + a c endl done #@cli area_fg : tolerance>=0,is_high_connectivity={ 0 | 1 } #@cli : Compute area of connected components for non-zero values in selected images. @@ -11025,17 +14518,18 @@ #@cli : Default values: 'is_high_connectivity=0'. #@cli : $ image.jpg luminance stencil[-1] 1 +area_fg 0 area_fg : check "$1>=0" skip ${2=0} - e[^-1] "Compute area of foreground connected components in image$?, with tolerance $1 and "${arg\ 1+!$2,high,low}" connectivity." - v - repeat $! l[$>] s c + e[^-1] "Compute area of foreground connected components in image$?, with tolerance $1 and "\ + ${arg\ 1+!$2,high,low}" connectivity." + repeat $! l[$>] s c repeat $! label_fg[$>] $1,$2 nb={$>,1+iM} +histogram[$>] $nb,0,{$nb-1} =. 0 map[$>] . rm. done - a c endl done v + + a c endl done #@cli at_line : x0[%],y0[%],z0[%],x1[%],y1[%],z1[%] #@cli : Retrieve pixels of the selected images belonging to the specified line (x0,y0,z0)-(x1,y1,z1). #@cli : $ image.jpg +at_line 0,0,0,100%,100%,0 at_line : check ${7=100%}>=0 e[^-1] "Retrieve pixels of image$?, belonging to line ($1,$2,$3)-($4,$5,$6)." - v - repeat $! l[$>] + repeat $! l[$>] x0={if(${is_percent\ $1},(w-1)*$1,$1)} y0={if(${is_percent\ $2},(h-1)*$2,$2)} z0={if(${is_percent\ $3},(d-1)*$3,$3)} @@ -11045,9 +14539,10 @@ ($x0,$x1^$y0,$y1^$z0,$z1) r. {1+max(abs($x1-$x0),abs($y1-$y0),abs($z1-$z0))},1,1,3,3 round. 1 warp[0] .,0,0,0 rm. - endl done v + + endl done -#@cli at_quadrangle : x0[%],y0[%],x1[%],y1[%],x2[%],y2[%],x3[%],y3[%],_interpolation,_boundary_conditions : x0[%],y0[%],z0[%],x1[%],y1[%],z1[%],x2[%],y2[%],z2[%],x3[%],y3[%],z3[%],_interpolation,_boundary_conditions +#@cli at_quadrangle : x0[%],y0[%],x1[%],y1[%],x2[%],y2[%],x3[%],y3[%],_interpolation,_boundary_conditions : \ +# x0[%],y0[%],z0[%],x1[%],y1[%],z1[%],x2[%],y2[%],z2[%],x3[%],y3[%],z3[%],_interpolation,_boundary_conditions #@cli : Retrieve pixels of the selected images belonging to the specified 2D or 3D quadrangle. #@cli : 'interpolation' can be { 0=nearest-neighbor | 1=linear | 2=cubic }. #@cli : 'boundary_conditions' can be { 0=dirichlet | 1=neumann | 2=periodic | 3=mirror }. @@ -11066,7 +14561,8 @@ x3={round(${"is_percent $7"}?(w-1)*$7:$7)} y3={round(${"is_percent $8"}?(h-1)*$8:$8)} ($x0,$x1;$x3,$x2^$y0,$y1;$y3,$y2) - r. {P0=[$x0,$y0];P1=[$x1,$y1];P2=[$x2,$y2];P3=[$x3,$y3];1+round([max(norm(P1-P0),norm(P3-P2)),max(norm(P3-P0),norm(P2-P1))])},1,2,3 + r. {P0=[$x0,$y0];P1=[$x1,$y1];P2=[$x2,$y2];P3=[$x3,$y3];\ + 1+round([max(norm(P1-P0),norm(P3-P2)),max(norm(P3-P0),norm(P2-P1))])},1,2,3 warp.. .,0,$9,$10 rm. endl done @@ -11085,7 +14581,8 @@ y3={round(${"is_percent $11"}?(h-1)*$11:$11)} z3={round(${"is_percent $12"}?(h-1)*$12:$12)} ($x0,$x1;$x3,$x2^$y0,$y1;$y3,$y2^$z0,$z1;$z3,$z2) - r. {P0=[$x0,$y0,$z0];P1=[$x1,$y1,$z1];P2=[$x2,$y2,$z2];P3=[$x3,$y3,$z2];1+round([max(norm(P1-P0),norm(P3-P2)),max(norm(P3-P0),norm(P2-P1))])},1,3,3 + r. {P0=[$x0,$y0,$z0];P1=[$x1,$y1,$z1];P2=[$x2,$y2,$z2];P3=[$x3,$y3,$z2];\ + 1+round([max(norm(P1-P0),norm(P3-P2)),max(norm(P3-P0),norm(P2-P1))])},1,3,3 warp.. .,0,$13,$14 rm. endl done @@ -11094,16 +14591,16 @@ #@cli : $ 256,256 ellipse 50%,50%,20%,20%,0,1,1 deform 20 +barycenter +ellipse[-2] {@0,1},5,5,0,10 barycenter : e[^-1] "Compute the barycenter vector of pixel values of image$?." - v - norm repeat $! l[$>] nm={0,b} + norm repeat $! l[$>] nm={0,b} sum={is} - if {$sum>0} - if {d>1} +* 'z' z={is} rm. else z=0 fi - if {h>1} +* 'y' y={is} rm. else y=0 fi + if $sum>0 + if d>1 +* 'z' z={is} rm. else z=0 fi + if h>1 +* 'y' y={is} rm. else y=0 fi * 'x' x={is} rm. ({$x/$sum};{$y/$sum};{$z/$sum}) else ({w/2},{h/2},{d/2}) rm.. fi - nm "[barycenter of '"$nm"']" endl done v + + nm "[barycenter of '"$nm"']" endl done #@cli delaunay #@cli : Generate discrete 2D Delaunay triangulation of non-zero pixels in selected images. @@ -11114,7 +14611,7 @@ #@cli : $ image.jpg b 1% 100%,100% noise. 0.8,2 eq. 1 mul +delaunay channels 0,2 delaunay : e[^-1] "Generate discrete 2D Delaunay triangulation of non-zero pixels in image$?." - v - repeat $! l[$>] + repeat $! l[$>] # Retrieve point coordinates. +slices 0 norm. !=. 0 {is+1},1,1,2 +f.. ">begin(p = 0); i?(I[#-1,++p] = [x,y]; p):0" @@ -11129,7 +14626,7 @@ # Map initial labels. s. c +warp[0] [1],0,0 point. 0,0 map[-4--2] . rm. a[-3--1] c k. - endl done v + + endl done _delaunay : f.. "* @@ -11151,9 +14648,8 @@ #@cli : from the sample pixels inside the circle located at ('skin_x','skin_y') with radius 'skin_radius'. #@cli : Default value: 'tolerance=0.5' and 'skin_x=skiny=radius=-1'. detect_skin : check "${1=0.5}>=0 && $1<=1" skip ${2=-1},${3=-1},${4=-1} - if {$2<0||$3<=0||$4<=0} + if $2<0||$3<=0||$4<=0 e[0--3] "Detect skin in image$?, using tolerance $1." - v - m0=120.9292108800069 m1=142.5745272918084 A=0.09749985486268997 @@ -11169,7 +14665,6 @@ endl done else e[0--3] "Detect skin in image$?, using tolerance $1 and target circle at ($2,$3) with radius $4." - v - to_rgb srgb2rgb rgb2ycbcr channels 1,2 repeat $! l[$>] 100%,100% circle[1] $2,$3,$4,1,1 +f[1] 'if(i,y,-1)' f[1] 'if(i,x,-1)' discard[1,2] -1 a[1,2] c @@ -11184,19 +14679,21 @@ r $whd,1,-1 endl done fi - v + -#@cli displacement : [source_image],_smoothness,_precision>=0,_nb_scales>=0,_iteration_max>=0,is_backward={ 0 | 1 },_[guide] : (+) +#@cli displacement : [source_image],_smoothness,_precision>=0,_nb_scales>=0,_iteration_max>=0,is_backward={ 0 | 1 },\ +# _[guide] : (+) #@cli : Estimate displacement field between specified source and selected target images. #@cli : If 'smoothness>=0', regularization type is set to isotropic, else to anisotropic. #@cli : If 'nbscales==0', the number of scales used is estimated from the image size. -#@cli : Default values: 'smoothness=0.1', 'precision=5', 'nb_scales=0', 'iteration_max=10000', 'is_backward=1' and '[guide]=(unused)'. +#@cli : Default values: 'smoothness=0.1', 'precision=5', 'nb_scales=0', 'iteration_max=10000', 'is_backward=1' \ +# and '[guide]=(unused)'. #@cli : $ image.jpg +rotate 3,1,0,50%,50% +displacement[-1] [-2] quiver[-1] [-1],15,1,1,1,{1.5*iM} #@cli distance : isovalue[%],_metric : isovalue[%],[metric],_method : (+) #@cli : Compute the unsigned distance function to specified isovalue, opt. according to a custom metric. #@cli : 'metric' can be { 0=chebyshev | 1=manhattan | 2=euclidean | 3=squared-euclidean }. -#@cli : 'method' can be { 0=fast-marching | 1=low-connectivity dijkstra | 2=high-connectivity dijkstra | 3=1+return path | 4=2+return path }. +#@cli : 'method' can be { 0=fast-marching | 1=low-connectivity dijkstra | 2=high-connectivity dijkstra | \ +# 3=1+return path | 4=2+return path }. #@cli : Default value: 'metric=2' and 'method=0'. #@cli : $ image.jpg threshold 20% distance 0 pow 0.3 #@cli : $ 400,400 set 1,50%,50% +distance[0] 1,2 +distance[0] 1,1 distance[0] 1,0 mod 32 threshold 16 append c @@ -11207,9 +14704,9 @@ #@cli : $ image.jpg fftpolar ellipse 50%,50%,10,10,0,1,0 ifftpolar fftpolar : e[^-1] "Compute fourier transform of image$?, as centered magnitude/phase images." - v - repeat $! l[$<] + repeat $! l[$<] fft complex2polar shift {-round(w/2)},{-round(h/2)},{-round(d/2)},0,2 - endl done v + + endl done #@cli histogram : _nb_levels>0[%],_value0[%],_value1[%] : (+) #@cli : Compute the histogram of selected images. @@ -11226,14 +14723,13 @@ #@cli : $ image.jpg channels 0,1 +histogram_nd 256 histogram_nd : check $1>0 skip ${2=0%},${3=100%} e[^-1] "Compute histogram of multi-channels image$?, using $1 levels in range [$1,$2]." - v - percent_nblevels=${"is_percent $1"} percent_min=${"is_percent $2"} percent_max=${"is_percent $3"} repeat $! l[$>] s={s} r {w*h*d},{min(3,s)},1,1,-1 vmin=$2 vmax=$3 - if {$percent_min||$percent_max} + if $percent_min||$percent_max im={im} iM={iM} vmin={if($percent_min,$im+($iM-$im)*$2,$2)} vmax={if($percent_max,$im+($iM-$im)*$3,$3)} @@ -11242,7 +14738,7 @@ nb_levels={max(1,round(if($percent_nblevels,$1*(1+$vmax-$vmin),$1)))} f 'if(i>=$vmin&&i<=$vmax,if(i==$vmax,$nb_levels-1,int((i-$vmin)*$nb_levels/($vmax-$vmin))),-1)' pointcloud 1,$nb_levels,{if($s>1,$nb_levels,1)},{if($s>2,$nb_levels,1)} - endl done v + + endl done #@cli histogram_cumul : _nb_levels>0,_is_normalized={ 0 | 1 },_val0[%],_val1[%] #@cli : Compute cumulative histogram of selected images. @@ -11251,7 +14747,7 @@ histogram_cumul : check ${1=256}>0 skip ${2=0},${3=0%},${4=100%} arg 1+!$2,"normalized ","" e[^-1] "Compute "${}"cumulative histogram of image$?, using $1 levels." - v - histogram $1,$3,$4 cumulate if $2 repeat $! /[$>] {$>,iM} done fi v + + histogram $1,$3,$4 cumulate if $2 repeat $! /[$>] {$>,iM} done fi #@cli histogram_pointwise : nb_levels>0[%],_value0[%],_value1[%] #@cli : Compute the histogram of each vector-valued point of selected images. @@ -11260,7 +14756,7 @@ #@cli : Default values: 'value0=0%' and 'value1=100%'. histogram_pointwise : skip ${2=0%},${3=100%} e[^-1] "Compute the pointwise histogram of vector-valued points in image$?, with $1 levels." - v - repeat $! l[$>] nm={0,n} + repeat $! l[$>] nm={0,n} nb_levels={round(if(${is_percent\ $1},(iM-im)*$1,$1))} value0={if(${is_percent\ $2},im+(iM-im)*$2,$2)} value1={if(${is_percent\ $3},im+(iM-im)*$3,$3)} @@ -11273,7 +14769,7 @@ 3,100%,1,1,1 1,100%,1,1,-1 y[-5,-3,-2] a[-5--1] y {$w*$h*$d},$nb_levels j3d. ..,0,0,0,1,0,0,0 rm.. r $w,$h,$d,$nb_levels,-1 - nm $nm endl done v + + nm $nm endl done #@cli hough : _width>0,_height>0,gradient_norm_voting={ 0 | 1 } #@cli : Compute hough transform (theta,rho) of selected images. @@ -11281,23 +14777,23 @@ #@cli : $ image.jpg +blur 1.5 hough[-1] 400,400 blur[-1] 0.5 add[-1] 1 log[-1] hough : check "${1=512}>0 && ${2=$1}>0" skip ${3=1} e[^-1] "Compute $1x$2 hough transform of image$?, "${arg\ 1+!$3,with,without}" gradient norm voting." - v - slices 50% luminance repeat $! l[$>] nm={0,n} + slices 50% luminance repeat $! l[$>] nm={0,n} rhomax={sqrt(w^2+h^2)/2} g (0,{w-1}) (0;{{-2,h}-1}) r[-2,-1] {-3,w},{-3,h},1,1,3 -.. {w/2} -. {h/2} complex2polar[-4--1] -. ... polar2complex[-2,-1] rm. +<. 0 *. {pi} +[-3,-1] abs. %.. {2*pi} *. {$2/$rhomax} *.. {0.5*$1/pi} - y[-3--1] x {w} mv[-4] $! if {!$3} f. 1 fi + y[-3--1] x {w} mv[-4] $! if !$3 f. 1 fi a y pointcloud 1 r $1,$2,1,1,0 - nm $nm endl done v + + nm $nm endl done #@cli ifftpolar #@cli : Compute inverse fourier transform of selected images, from centered magnitude/phase images. ifftpolar : e[^-1] "Compute inverse fourier transform of image$?, from centered magnitude/phase images." - v - repeat {int($!/2)} l[$>,{$>+1}] + repeat int($!/2) l[$>,{$>+1}] shift {round(w/2)},{round(h/2)},{round(d/2)},0,2 polar2complex ifft rm. - endl done v + + endl done #@cli isophotes : _nb_levels>0 #@cli : Render isophotes of selected images on a transparent background. @@ -11305,14 +14801,14 @@ #@cli : $ image.jpg blur 2 isophotes 6 dilate_circ 5 display_rgba isophotes : skip ${1=64} e[^-1] "Render isophote maps from images$?, with $1 levels." - v - to_rgba repeat $! l[$>] + to_rgba repeat $! l[$>] +luminance repeat $1 +isoline3d[1] {$>*255/($1-1)} done rm[1] +3d[^0] col3d. 1 [0],[0] j3d. ..,0,0,0,1,0,0,0 rm.. * - endl done v + + endl done -#@cli label : _tolerance>=0,is_high_connectivity={ 0 | 1 } : (+) +#@cli label : _tolerance>=0,is_high_connectivity={ 0 | 1 },_is_L2_norm={ 0 | 1 } : (+) #@cli : Label connected components in selected images. -#@cli : Default values: 'tolerance=0' and 'is_high_connectivity=0'. +#@cli : Default values: 'tolerance=0', 'is_high_connectivity=0' and 'is_L2_norm=1'. #@cli : $ image.jpg luminance threshold 60% label normalize 0,255 map 0 #@cli : $ 400,400 set 1,50%,50% distance 1 mod 16 threshold 8 label mod 255 map 2 #@cli : $$ @@ -11322,14 +14818,15 @@ #@cli : Similar to 'label' except that 0-valued pixels are not labeled. #@cli : Default value: 'is_high_connectivity=0'. label_fg : check "$1>=0" skip ${2=0} - e[^-1] "Label foreground connected components on image [1], with tolerance $1 and "${arg\ 1+!$2,high,low}" connectivity." - v - repeat $! l[$>] - if {d>1} +z -1,-1,-1,{w-1},{h-1},{d-1} label. $1,$2 z. 1,1,1,{w-1},{h-1},{d-1} + e[^-1] "Label foreground connected components on image [1], with tolerance $1 and "\ + ${arg\ 1+!$2,high,low}" connectivity." + repeat $! l[$>] + if d>1 +z -1,-1,-1,{w-1},{h-1},{d-1} label. $1,$2 z. 1,1,1,{w-1},{h-1},{d-1} else +z -1,-1,{w-1},{h-1} label. $1,$2 z. 1,1,{w-1},{h-1} fi !=.. 0 * +histogram {1+iM} =. 0 >. 0 cumulate. map.. . rm. - endl done v + + endl done #@cli max_patch : _patch_size>=1 #@cli : Return locations of maximal values in local patch-based neighborhood of given size for selected images. @@ -11337,7 +14834,7 @@ #@cli : $ image.jpg norm +max_patch 16 max_patch : check "isint(${1=16}) && $1>=1" e[^-1] "Return locations of maximal values in local patch neighborhood of size $1, in image$?." - v - repeat $! +dilate[$>] $1 ==[$>,-1] done v + + repeat $! +dilate[$>] $1 ==[$>,-1] done #@cli min_patch : _patch_size>=1 #@cli : Return locations of minimal values in local patch-based neighborhood of given size for selected images. @@ -11345,15 +14842,17 @@ #@cli : $ image.jpg norm +min_patch 16 min_patch : check "isint(${1=16}) && $1>=1" e[^-1] "Return locations of minimal values in local patch neighborhood of size $1, in image$?." - v - repeat $! +erode[$>] $1 ==[$>,-1] done v + + repeat $! +erode[$>] $1 ==[$>,-1] done #@cli minimal_path : x0[%]>=0,y0[%]>=0,z0[%]>=0,x1[%]>=0,y1[%]>=0,z1[%]>=0,_is_high_connectivity={ 0 | 1 } #@cli : Compute minimal path between two points on selected potential maps. #@cli : Default value: 'is_high_connectivity=0'. -#@cli : $ image.jpg +gradient_norm fill[-1] 1/(1+i) minimal_path[-1] 0,0,0,100%,100%,0 pointcloud[-1] 0 *[-1] 280 to_rgb[-1] resize[-1] [-2],0 or +#@cli : $ image.jpg +gradient_norm fill[-1] 1/(1+i) minimal_path[-1] 0,0,0,100%,100%,0 pointcloud[-1] 0 *[-1] 280 \ +# to_rgb[-1] resize[-1] [-2],0 or minimal_path : check "$1>=0 && $2>=0 && $3>=0" skip ${7=0} - e[^-1] "Compute minimal path between points ($1,$2,$3) and ($4,$5,$6) for potential map$?, with "${arg\ 1+$7,low,high}" connectivity." - v - repeat $! l[$>] nm={0,n} + e[^-1] "Compute minimal path between points ($1,$2,$3) and ($4,$5,$6) for potential map$?, with "\ + ${arg\ 1+$7,low,high}" connectivity." + repeat $! l[$>] nm={0,n} - {im} + {iM/100} 100%,100% = 1,${4-6} distance. 1,[0],{if($7,4,3)} k. x={round(if(${is_percent\ $1},$1*(w-1),$1))} @@ -11362,19 +14861,19 @@ ($x;$y;$z) do p={0,i($x,$y,$z)} - if {$p&1} x-=1 - elif {$p&2} x+=1 + if $p&1 x-=1 + elif $p&2 x+=1 fi - if {$p&4} y-=1 - elif {$p&8} y+=1 + if $p&4 y-=1 + elif $p&8 y+=1 fi - if {$p&16} z-=1 - elif {$p&32} z+=1 + if $p&16 z-=1 + elif $p&32 z+=1 fi ($x;$y;$z) while $p rm[0,-1] a x - nm $nm endl done v + + nm $nm endl done #@cli mse : : (+) #@cli : Compute MSE (Mean-Squared Error) matrix between selected images. @@ -11385,22 +14884,25 @@ #@cli : $ image.jpg +patches 64,64,1,153,124,0,184,240,0,217,126,0,275,38,0 patches : check "isint($1) && $1>0 && isint($2) && $2>0 && isint($3) && $3>0" e[^-1] "Extract $1x$2x$3 patches from image$?, at locations (${4--1})." - v - (${4--1}) r. 3,{w/3},1,1,-1 permute. yzcx N={w} H={int(sqrt(w))} W={round(w/$H,1,1)} r. {$W*$H},1,1,3,0 r. $W,$H,1,3,-1 r. {w*$1},{h*$2},{d*$3} $1,$2,$3,1,x-{int($1/2)} +f. y-{int($2/2)} +f. z-{int($3/2)} a[-3--1] c r. ..,0,2 +[-2,-1] - repeat {$!-1} warp[$>] .,0,0,0 done rm. + repeat $!-1 warp[$>] .,0,0,0 done rm. repeat $! l[$<] s y,$H s x,$W k[0-{$N-1}] endl done - v + -#@cli matchpatch : [patch_image],patch_width>=1,_patch_height>=1,_patch_depth>=1,_nb_iterations>=0,_nb_randoms>=0,_occ_penalization,_output_score={ 0 | 1 },_[guide] : (+) +#@cli matchpatch : [patch_image],patch_width>=1,_patch_height>=1,_patch_depth>=1,_nb_iterations>=0,\ +# _nb_randoms>=0,_patch_penalization,_output_score={ 0 | 1 },_[guide] : (+) #@cli : Estimate correspondence map between selected images and specified patch image, using #@cli : a patch-matching algorithm. #@cli : Each pixel of the returned correspondence map gives the location (p,q) of the closest patch in #@cli : the specified patch image. If 'output_score=1', the third channel also gives the corresponding #@cli : matching score for each patch as well. -#@cli : Default values: 'patch_height=patch_width', 'patch_depth=1', 'nb_iterations=5', 'nb_randoms=5', 'occ_penalization=0', 'output_score=0' and 'guide=(undefined)'. +#@cli : If 'patch_penalization' is >=0, SSD is penalized with patch occurences. +#@cli : If 'patch_penalization' is <0, SSD is inf-penalized when distance between patches are less \ +# than '-patch_penalization'. +#@cli : Default values: 'patch_height=patch_width', 'patch_depth=1', 'nb_iterations=5', 'nb_randoms=5', \ +# 'patch_penalization=0', 'output_score=0' and 'guide=(undefined)'. #@cli : $ image.jpg sample ? to_rgb +matchpatch[0] [1],3 +warp[-2] [-1],0 #@cli plot2value @@ -11408,13 +14910,14 @@ #@cli : $ 400,300,1,1,'if(y>300*abs(cos(x/10+2*u)),1,0)' +plot2value +display_graph[-1] 400,300 plot2value : e[^-1] "Retrieve values from 2D graph plot$?." - v - repeat $! l[$>] + repeat $! l[$>] s c >= 50% repeat $! l[$>] (1,{w}) r[1] [0],3 * histogram {w},1,{w} endl done a c - endl done v + + endl done -#@cli pointcloud : _type = { -X=-X-opacity | 0=binary | 1=cumulative | 2=label | 3=retrieve coordinates },_width,_height>0,_depth>0 +#@cli pointcloud : _type = { -X=-X-opacity | 0=binary | 1=cumulative | 2=label | 3=retrieve coordinates },\ +# _width,_height>0,_depth>0 #@cli : Render a set of point coordinates, as a point cloud in a 1D/2D or 3D binary image #@cli : (or do the reverse, i.e. retrieve coordinates of non-zero points from a rendered point cloud). #@cli : Input point coordinates can be a NxMx1x1, Nx1x1xM or 1xNx1xM image, where 'N' is the number of points, @@ -11430,20 +14933,22 @@ #@cli : $ 3000,2 rand 0,400 +pointcloud 0 dilate[-1] 3 #@cli : $ 3000,2 rand 0,400 {w} {w},3 rand[-1] 0,255 append y +pointcloud 0 dilate[-1] 3 pointcloud : check "${1=0}<=3 && ${2=0}>=0 && ${3=0}>=0 && ${4=0}>=0" - e[^-1] "Convert image$? to point clouds, in "${arg\ 2+($1>=0)*$1-($1<0),{-$1}-opacity,binary,cumulative,labeling}" mode,"\ - "with dimensions $2x$3x$4." - v - repeat $! l[$>] nm={0,n} - if {$1!=3} # Render point cloud image from set of point coordinates + e[^-1] "Convert image$? to point clouds, in "${arg\ 2+($1>=0)*$1-($1<0),{-$1}-opacity,binary,cumulative,labeling}\ + " mode, with dimensions $2x$3x$4." + repeat $! l[$>] nm={0,n} + if $1!=3 # Render point cloud image from set of point coordinates # Force input data to be of size Nx1x1xM. - if {"d>1 || (w>1 && h>1 && s>1)"} v + error "Command '$0': Invalid input image "{w}x{h}x{d}x{s}". Should be NxMx1x1, Nx1x1xM or 1xNx1xM." fi - if {"w>1 && h>1 && s==1"} r 100%,1,1,{h},-1 # NxMx1x1 -> Nx1x1xM - elif {"w==1 && h>1 && s>1"} r {h},1,1,{s},-1 # 1xNx1xM -> Nx1x1xM + if "d>1 || (w>1 && h>1 && s>1)" + error "Command '$0': Invalid input image "{w}x{h}x{d}x{s}". Should be NxMx1x1, Nx1x1xM or 1xNx1xM." + fi + if "w>1 && h>1 && s==1" r 100%,1,1,{h},-1 # NxMx1x1 -> Nx1x1xM + elif "w==1 && h>1 && s>1" r {h},1,1,{s},-1 # 1xNx1xM -> Nx1x1xM fi # Retrieve coordinates and color info. - if {s<3} channels 0,2 fi - if {s<4} 100%,1,1,1,1 a[-2,-1] c fi + if s<3 channels 0,2 fi + if s<4 100%,1,1,1,1 a[-2,-1] c fi sh. 0 round. siz_x={!$2?iM+1:$2} sh.. 1 round. siz_y={!$3?iM+1:$3} sh... 2 round. siz_z={!$4?iM+1:$4} @@ -11451,11 +14956,11 @@ # Draw point cloud. $siz_x,$siz_y,$siz_z,{$1!=2?s-3:1} - if {$1<0} # -X-opacity + if $1<0 # -X-opacity f.. ">V = I; P = V[0,3]; C = V[3,size(V) - 3]; I(#-1,P) = (1+$1)*I(#-1,P) - $1*C; V" - elif {$1==0} # Binary + elif $1==0 # Binary f.. ">V = I; P = V[0,3]; C = V[3,size(V) - 3]; I(#-1,P) = C; V" - elif {$1==1} # Cumulative + elif $1==1 # Cumulative f.. ">V = I; P = V[0,3]; C = V[3,size(V) - 3]; I(#-1,P) += C; V" else # Label f.. ">begin(l = 0); V = I; P = V[0,3]; C = V[3,size(V) - 3]; I(#-1,P) = ++l; V" @@ -11470,25 +14975,25 @@ end(resize(#-1,N,1,1,s#-1,0)); I" fi - k. nm $nm endl done v + + k. nm $nm endl done #@cli psnr : _max_value #@cli : Compute PSNR (Peak Signal-to-Noise Ratio) matrix between selected images. #@cli : Default value: 'max_value=255'. #@cli : $ image.jpg +noise 30 +noise[0] 35 +noise[0] 38 cut[-1] 0,255 psnr 255 replace_inf 0 psnr : skip "${1=}" - if {isval("$1")} + if isnum("$1") e[0--3] "Compute the "$!x$!" matrix of PSNR values, from image$? with maximum value $1." - v - mse log10 - {log10(($1)^2)} + mse log10 - {log10(($1)^2)} else e[0--3] "Compute the "$!x$!" matrix of PSNR values, from image$?." - v - noarg - if {$!} - $! repeat {$!-1} =. {$>,iM},$> done + noarg + if $! + $! repeat $!-1 =. {$>,iM},$> done mse[^-1] sqr. log10 -.. 'max(i[#-1,x],i[#-1,y])' rm. fi fi - * -10 nm [PSNR] v + + * -10 nm [PSNR] #@cli segment_watershed : _threshold>=0 #@cli : Apply watershed segmentation on selected images. @@ -11496,31 +15001,34 @@ #@cli : $ image.jpg segment_watershed 2 segment_watershed : check "${1=2}>=0" e[^-1] "Apply watershed segmentation on image$?, with edge threshold $1." - v - repeat $! l[$>] + repeat $! l[$>] min={im} + {1+$min} +gradient_norm +f. "i<$1 && i=0,0<=_weight_avg_max_avg<=1,_dilation,_smoothness>=0 #@cli : Estimate bumpmap from binary shape in selected images. #@cli : Default value: 'resolution=256', 'weight_avg_max=0.75', 'dilation=0' and 'smoothness=100'. -shape2bump : check "isint(${1=256}) && $1>=0 && ${2=0.75}>=0 && $2<=1 && isval(${3=0}) && ${4=100}>=0" - e[^-1] "Estimate bumpmap from binary shape in image$?, using "${"v - if $1 u \"resolution $1\" else u \"full resolution\" fi v +"}", avg/max weight $2, dilation $3 and smoothness $4." - v - repeat $! +shape2bump : check "isint(${1=256}) && $1>=0 && ${2=0.75}>=0 && $2<=1 && isnum(${3=0}) && ${4=100}>=0" + e[^-1] "Estimate bumpmap from binary shape in image$?, using "\ + ${"if $1 u \"resolution $1\" else u \"full resolution\" fi"}", avg/max weight $2, dilation $3 + and smoothness $4." + repeat $! +l[$>] norm > 0 siz={[w,h]} # Generate skeleton. distance 0 + $3 - +f. "const boundary = 1; (i>j(-1)&&i>j(1)) || (i>j(0,-1)&&i>j(0,1)) || (i>j(-1,-1)&&i>j(1,1)) || (i>j(-1,1)&&i>j(1,-1))" + +f. "const boundary = 1; + (i>j(-1)&&i>j(1)) || (i>j(0,-1)&&i>j(0,1)) || (i>j(-1,-1)&&i>j(1,1)) || (i>j(-1,1)&&i>j(1,-1))" # Downsize for faster computation. is_resized=0 - if {$1" && "max(w,h)>$1} rr2d $1,$1,0,2 gt. 0 thinning. 1 *.. {$1/max($siz)} is_resized=1 fi + if $1" && "max(w,h)>$1 rr2d $1,$1,0,2 gt. 0 thinning. 1 *.. {$1/max($siz)} is_resized=1 fi # Generate z-map. +f. 0 .x2 @@ -11542,7 +15050,7 @@ ); ); i" - if {$2<1} M={-3,iM} max. 1 /[-2,-1] n. 0,$M j. ..,0,0,0,0,$2 + if $2<1 M={-3,iM} max. 1 /[-2,-1] n. 0,$M j. ..,0,0,0,0,$2 else rm[-2,-1] fi k. @@ -11550,16 +15058,15 @@ endl if $4 M={iM} (1^0^1) r. [0],[0] !=[0] 0 *. [0] smooth.. .,$4,0.1,0 rm. b. 0.5 n. 0,$M fi # Smooth bumpmap k. - done v + + done #@cli skeleton : _boundary_conditions={ 0=dirichlet | 1=neumann } #@cli : Compute skeleton of binary shapes using distance transform and constrained thinning. #@cli : Default value: 'boundary_conditions=1'. -#@cli : $ image.jpg threshold 50% +skeleton 0 -skeleton : check "!isval(${1=1}) || ($1>=0 && $1<=1)" - v - - if {isval($1)} bc=$1 else bc=1 noarg fi - v + e[^-1] "Compute skeleton of binary image$? with "${"arg 1+"$bc",dirichlet,neumann"}" boundary conditions." v - +#@cli : $ shape_cupid 320 +skeleton 0 +skeleton : check "!isnum(${1=1}) || ($1>=0 && $1<=1)" + if isnum($1) bc=$1 else bc=1 noarg fi + e[^-1] "Compute skeleton of binary image$? with "${"arg 1+"$bc",dirichlet,neumann"}" boundary conditions." repeat $! l[$>] s c repeat $! l[$>] # [0] = 2D binary shape 1,16,1,2 # [1] = List of boundary pixels @@ -11567,17 +15074,24 @@ # [3] = Pixels on median axis. +distance[0] 0 - f. "const boundary = 1; (i>j(-1)&&i>j(1)) || (i>j(0,-1)&&i>j(0,1)) || (i>j(-1,-1)&&i>j(1,1)) || (i>j(-1,1)&&i>j(1,-1))" + f. "const boundary = 1; + (i>j(-1)&&i>j(1)) || (i>j(0,-1)&&i>j(0,1)) || (i>j(-1,-1)&&i>j(1,1)) || (i>j(-1,1)&&i>j(1,-1))" # Extract boundary pixels. - f[0] ">"${-math_lib}"const boundary = "$bc"; i && (!j(-1) || !j(1) || !j(0,-1) || !j(0,1))?dar_insert(#1,[x,y]); i;" + f[0] ">"${-math_lib}"const boundary = "$bc"; + i && (!j(-1) || !j(1) || !j(0,-1) || !j(0,1))?dar_insert(#1,[x,y]); i;" # Run thinning algorithm. eval ${-math_lib}" const boundary = "$bc"; # Lookup tables for detecting the simple points. - is_removable = [ 0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0 ]; + is_removable = [ 0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,1,1,1,0,1,1,1,0, + 1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,1,1,1,0,1,1, + 1,0,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,1,1,1,1,0,0,0,0, + 0,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,1,0,0,1,1,0,0,1,1,0, + 1,1,1,0,1,1,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0 ]; dotm = [ 128,64,32,16,0,8,4,2,1 ]; is_removed = 1; @@ -11592,7 +15106,7 @@ (icc && !i(#3,xc,yc))?( xp = xc - 1; yp = yc - 1; xn = xc + 1; yn = yc + 1; - V = crop(#0,xp,yp,3,3); + ref(crop(#0,xp,yp,3,3),V); val = dot(dotm,V>0); is_removable[val]?( i(#0,xc,yc) = 0; @@ -11609,22 +15123,22 @@ i[#2,h(#2)-1] = 0; );" k[0] > 0 thinning - endl done a c endl done v + + endl done a c endl done skeleton_v236 : check ${1=0}>=0 e[^-1] "Compute skeleton of binary image$?." - v - distance 0 b $1 sharpen 1e10 >= 100% - repeat $! +erode[$>] 2 -[$>,-1] done v + + distance 0 b $1 sharpen 1e10 >= 100% + repeat $! +erode[$>] 2 -[$>,-1] done #@cli slic : size>0,_regularity>=0,_nb_iterations>0 #@cli : Segment selected 2D images with superpixels, using the SLIC algorithm (Simple Linear Iterative Clustering). #@cli : Scalar images of increasingly labeled pixels are returned. -#@cli : Reference paper: Achanta, R., Shaji, A., Smith, K., Lucchi, A., Fua, P., & Süsstrunk, S. (2010). Slic superpixels (No. EPFL-REPORT-149300). +#@cli : Reference paper: Achanta, R., Shaji, A., Smith, K., Lucchi, A., Fua, P., & Susstrunk, S. (2010). \ +# SLIC Superpixels (No. EPFL-REPORT-149300). #@cli : Default values: 'size=16', 'regularity=10' and 'nb_iterations=10'. #@cli : $ image.jpg +srgb2lab slic[-1] 16 +blend shapeaverage f[-2] "j(1,0)==i && j(0,1)==i" *[-1] [-2] slic : check "${1=16}>0 && ${2=10}>=0 && ${3=10}>0" e[^-1] "Segment image$? using SLIC superpixels, with size $1, regularity $2 and $3 iterations." - v - S,m,nb_iter=${1-3} repeat $! l[$>] slices 50% @@ -11632,7 +15146,7 @@ {[max(1,round(w/$S)),max(1,round(h/$S))]},1,2,"round(([x,y]+=0.5)*="$S")" # Pertub the Ck towards low gradient positions. - if {$S>=3} + if $S>=3 +b[0] 0.7 g. xy,1 a[-2,-1] c norm. # Gradient norm with forward differences f.. " const n = round("$S"/3); @@ -11644,14 +15158,14 @@ fi r. {wh},1,1,2,-1 100%,1,1,{0,s},"I(#0,I#1)" a[-2,-1] c # Add superpixels colors - [0],[0],1,2 f.. "I(#-1,i0,i1) = [ x + 1,1 ];I" s. c distance. 1 *. -1 watershed.. . rm. channels. 0,1 + [0],[0],1,2 eval.. "I(#-1,i0,i1) = [ x + 1,1 ]; I" s. c distance. 1 *. -1 watershed.. . rm. channels. 0,1 # Start iteration loop. repeat $nb_iter # Assign best superpixel to each pixel. sh[2] 1 f. inf rm. - f[1] " + eval[1] " const m = "$m"; const S = "$S"; k = x; @@ -11676,7 +15190,7 @@ # Update superpixels. f[1] 0 channels[1] 0,{-2,s} - f[2] "I[#1,i0]+=[ x,y,I#0,1 ];I" + eval[2] "I[#1,i0]+=[ x,y,I#0,1 ];I" s[1] c,-{1,s-1} max[2] 1 /[1,2] done @@ -11685,7 +15199,7 @@ k[2] channels 0 label. 0,0 +area 0,0 <. {$S^2/8} {0,iM+1},1,1,1,x - f[0] "> + eval[0] "> const boundary = 1; if (i[#-1,i]>=0, N = [ j(-1,0),j(0,-1),j(1,0),j(0,1) ]; @@ -11701,7 +15215,7 @@ +[0] 1 100%,100% j[0] .,0,0,0,0,1,.. rm. distance. 0 *. -1 watershed.. . rm. label. 0,0 - endl done v + + endl done #@cli ssd_patch : [patch],_use_fourier={ 0 | 1 },_boundary_conditions={ 0=dirichlet | 1=neumann } #@cli : Compute fields of SSD between selected images and specified patch. @@ -11710,9 +15224,9 @@ #@cli : $ image.jpg +crop 20%,20%,35%,35% +ssd_patch[0] [1],0,0 ssd_patch : check ${is_image_arg\ $1} skip ${2=0},${3=0} e[^-1] "Compute field of SSD between image$? and patch $1 using "${arg\ 1+!$2,fourier,spatial}" mode." - v - repeat $! pass$1 0 l[$>,-1] + repeat $! pass$1 0 l[$>,-1] r 100%,100%,100%,${-max_s} s c - repeat {$!/2} l[$>,{-1-$<}] + repeat $!/2 l[$>,{-1-$<}] +sqr[1] val={is} rm. # Sum J(p,q)^2 +sqr[0] +f[1] 1 if $2 @@ -11724,17 +15238,17 @@ fi *[0] -2 +[0,1] + $val endl done + - endl done v + + endl done #@cli thinning : _boundary_conditions={ 0=dirichlet | 1=neumann } #@cli : Compute skeleton of binary shapes using morphological thinning #@cli : (beware, this is a quite slow iterative process) #@cli : Default value: 'boundary_conditions=1'. -#@cli : $ image.jpg threshold 50% +thinning -thinning : check "!isval(${1=1}) || ($1>=0 && $1<=1)" - v - - if {isval($1)} bc=$1 else bc=1 noarg fi - v + e[^-1] "Apply morphological thinning to binary image$? with "${"arg 1+"$bc",dirichlet,neumann"}" boundary conditions." v - +#@cli : $ shape_cupid 320 +thinning +thinning : check "!isnum(${1=1}) || ($1>=0 && $1<=1)" + if isnum($1) bc=$1 else bc=1 noarg fi + e[^-1] "Apply morphological thinning to binary image$? with "\ + ${"arg 1+"$bc",dirichlet,neumann"}" boundary conditions." repeat $! l[$>] s c repeat $! l[$>] # [0] = 2D binary shape (current iteration) 1,16,1,2 # [1] = List of boundary pixels (current iteration) @@ -11742,7 +15256,8 @@ 1,16,1,2 # [3] = List of boundary pixels (for next iteration) # Extract boundary pixels. - f[0] ">"${-math_lib}"const boundary = "$bc"; i && (!j(-1) || !j(1) || !j(0,-1) || !j(0,1))?dar_insert(#1,[x,y]); i;" + f[0] ">"${-math_lib}"const boundary = "$bc"; + i && (!j(-1) || !j(1) || !j(0,-1) || !j(0,1))?dar_insert(#1,[x,y]); i;" # Run thinning algorithm. eval ${-math_lib}" @@ -11771,7 +15286,7 @@ icc?( xp = xc - 1; yp = yc - 1; xn = xc + 1; yn = yc + 1; - V = crop(#0,xp,yp,3,3); + ref(crop(#0,xp,yp,3,3),V); val = dot(dotm,V>0); (val & hm_and[it8])==hm_eq[it8]?( dar_insert(#2,[xc,yc]); @@ -11798,16 +15313,16 @@ _(while), max(is_removed) );" k[0] - endl done a c endl done v + + endl done a c endl done #@cli tones : N>0 #@cli : Get N tones masks from selected images. #@cli : $ image.jpg +tones 3 tones : check $1>0 e[^-1] "Get $1 tones masks from image$?." - v - norm n 0,{$1-1} round 1 repeat $! l[$<] - repeat {$1-1} +==[0] {1+$>} done ==[0] 0 - endl done v + + norm n 0,{$1-1} round 1 repeat $! l[$<] + repeat $1-1 +==[0] {1+$>} done ==[0] 0 + endl done #@cli topographic_map : _nb_levels>0,_smoothness #@cli : Render selected images as topographic maps. @@ -11815,20 +15330,21 @@ #@cli : $ image.jpg topographic_map 10 topographic_map : check "isint(${1=16}) && $1>0" skip ${2=2} e[^-1] "Render topographic maps from image$?, with $1 levels and smoothness $2." - v - repeat $! l[$>] + repeat $! l[$>] +b $2 isophotes. $1 compose_channels. + ==. 0 blend shapeaverage0 - endl done v + + endl done #@cli tsp : _precision>=0 #@cli : Try to solve the 'travelling salesman' problem, using a combination of greedy search and 2-opt algorithms. #@cli : Selected images must have dimensions Nx1x1xC to represent N cities each with C-dimensional coordinates. #@cli : This command re-order the selected data along the x-axis so that the point sequence becomes a shortest path. #@cli : Default values: 'precision=256'. -#@cli : $ 256,1,1,2 rand 0,512 tsp , 512,512,1,3 repeat {0,w} circle[-1] {0,I[$>]},2,1,255,255,255 line[-1] {0,boundary=2;[I[$>],I[$>+1]]},1,255,128,0 done keep[-1] +#@cli : $ 256,1,1,2 rand 0,512 tsp , 512,512,1,3 repeat w#0 circle[-1] {0,I[$>]},2,1,255,255,255 \ +# line[-1] {0,boundary=2;[I[$>],I[$>+1]]},1,255,128,0 done keep[-1] tsp : check "${1=256}>=0" e[^-1] "Try to solve the 'travelling salesman' problem for pointcloud$?, with precision $1." - v - repeat $! l[$>] n={n} - if {h>1" || "d>1} error[0--4] "Selected image '"{n}"' has invalid dimensions ("{[w,h,d,s]}")." fi + repeat $! l[$>] n={n} + if h>1" || "d>1 error[0--4] "Selected image '"{n}"' has invalid dimensions ("{[w,h,d,s]}")." fi # Find initial estimate, using greedy nearest neighbor algorithm. eval " @@ -11887,7 +15403,7 @@ ); )" nm $n - endl done v + + endl done #@cli variance_patch : _patch_size>=1 #@cli : Compute variance of each images patch centered at (x,y), in selected images. @@ -11895,12 +15411,11 @@ #@cli : $ image.jpg +variance_patch variance_patch : check "isint(${1=16}) && $1>=1" e[^-1] "Compute variance of image patches in image$?, with patch size $1." - v - $1,$1,1,1,1 normalize_sum. - repeat {$!-1} l[$>,-1] + repeat $!-1 l[$>,-1] +sqr[0] convolve[0,2] [1] sqr[0] rv[0,2] -[0,2] max[0] 0 - endl done rm. v + + endl done rm. #--------------------------------- # @@ -11908,16 +15423,19 @@ # #--------------------------------- -#@cli arrow : x0[%],y0[%],x1[%],y1[%],_thickness[%]>=0,_head_length[%]>=0,_head_thickness[%]>=0,_opacity,_pattern,_color1,... +#@cli arrow : x0[%],y0[%],x1[%],y1[%],_thickness[%]>=0,_head_length[%]>=0,_head_thickness[%]>=0,_opacity,\ +# _pattern,_color1,... #@cli : Draw specified arrow on selected images. #@cli : 'pattern' is an hexadecimal number starting with '0x' which can be omitted #@cli : even if a color is specified. If a pattern is specified, the arrow is #@cli : drawn outlined instead of filled. -#@cli : Default values: 'thickness=1%', 'head_length=10%', 'head_thickness=3%', 'opacity=1', 'pattern=(undefined)' and 'color1=0'. +#@cli : Default values: 'thickness=1%', 'head_length=10%', 'head_thickness=3%', 'opacity=1', 'pattern=(undefined)' \ +# and 'color1=0'. #@cli : $ 400,400,1,3 repeat 100 arrow 50%,50%,{u(100)}%,{u(100)}%,3,20,10,0.3,${-RGB} done arrow : check "${5=1%}>=0 && ${6=10%}>=0 && ${7=3%}" skip ${8=1} - e[^-1] "Draw arrow in image$?, from ($1,$2) to ($3,$4), with thickness $5, head length $6, head_thickness $7 and opacity $8." - v - repeat $! l[$>] + e[^-1] "Draw arrow in image$?, from ($1,$2) to ($3,$4), with thickness $5, head length $6, + head_thickness $7 and opacity $8." + repeat $! l[$>] polygon. 7,{" x0 = "${"is_percent $1"}"?(w-1)*$1:$1; y0 = "${"is_percent $2"}"?(h-1)*$2:$2; @@ -11932,7 +15450,7 @@ lmhl = l - hl; X = mul([0,-t,lmhl,-t,lmhl,-ht,l,0,lmhl,ht,lmhl,t,0,t],rot(-180*atan2(dp[1],dp[0])/pi),2); X+=[p0,p0,p0,p0,p0,p0,p0]"},${8--1} - endl done v + + endl done #@cli axes : x0,x1,y0,y1,_font_height>=0,_opacity,_pattern,_color1,... #@cli : Draw xy-axes on selected images. @@ -11944,13 +15462,15 @@ #@cli : $ 400,400,1,3,255 axes -1,1,1,-1 axes : check "isint(${5=14}) && $5>=0 && ${6=1}>=0" skip ${7=0},${8=0} if ${"is_pattern \"$7\""} - e[0--3] "Draw xy-axes on image$?, with x-range ($1,$2), y-range ($3,$4), font height $5, opacity $6, pattern $7 and color (${8--1})." - v - pattern=$7 color=${8--1} + e[0--3] "Draw xy-axes on image$?, with x-range ($1,$2), y-range ($3,$4), font height $5, opacity $6, + pattern $7 and color (${8--1})." + pattern=$7 color=${8--1} else - e[0--3] "Draw xy-axes on image$?, with x-range ($1,$2), y-range ($3,$4), font height $5, opacity $6 and color (${7--1})." - v - pattern=0xFFFFFFFF color=${7--1} + e[0--3] "Draw xy-axes on image$?, with x-range ($1,$2), y-range ($3,$4), font height $5, opacity $6 + and color (${7--1})." + pattern=0xFFFFFFFF color=${7--1} fi - if {!$5" || "!$6} v + return fi + if !$5" || "!$6 return fi mx={min($1,$2)} Mx={max($1,$2)} my={min($3,$4)} My={max($3,$4)} @@ -11959,25 +15479,25 @@ w1={0,w-1} h1={0,h-1} # Determine number of axes tick marks. - if {$1!=$2} u=${"_axes[] $1,$2,{0.3*w/$5}"} offx={arg(1,$u)} deltax={arg(2,$u)} fi - if {$3!=$4} u=${"_axes[] $3,$4,{0.3*h/$5}"} offy={arg(1,$u)} deltay={arg(2,$u)} fi + if $1!=$2 u=${"_axes[] $1,$2,{0.3*w/$5}"} offx={arg(1,$u)} deltax={arg(2,$u)} fi + if $3!=$4 u=${"_axes[] $3,$4,{0.3*h/$5}"} offy={arg(1,$u)} deltay={arg(2,$u)} fi # Draw x-axis. is_0x=0 - if {$3==$4} y0=$3 else y0={v=-($my)*$h1/($My-$my);if($4>=$3,v,$h1-v)} fi + if $3==$4 y0=$3 else y0={v=-($my)*$h1/($My-$my);if($4>=$3,v,$h1-v)} fi sty={if($y0>$h1-$5,-1,1)} - if {$1!=$2" && "$y0>=0" && "$y0<=$h1} + if $1!=$2" && "$y0>=0" && "$y0<=$h1 line 0,$y0,$w1,$y0,$6,$pattern,$color 4,4,1,1,x<=y +mirror. y rows. 1,3 a[-2,-1] y .,.,1,[0] fc. $color - if {$2>=$1} j[0] .,{$w1-3},{$y0-3},0,0,$6,.. + if $2>=$1 j[0] .,{$w1-3},{$y0-3},0,0,$6,.. else mirror.. x j[0] .,0,{$y0-3},0,0,$6,.. fi rm[-2,-1] i=0 do val={_$offx+$i*$deltax} i+=1 - if {$val>=$mx" && "$val<=$Mx} + if $val>=$mx" && "$val<=$Mx x={v=($val-$mx)*$w1/($Mx-$mx);if($2>=$1,v,$w1-v)} line $x,{$y0-1},$x,{$y0+1},$6,$pattern,$color if $val @@ -11986,25 +15506,25 @@ else is_0x=1 fi fi - while {$val<$Mx} + while $val<$Mx fi # Draw y-axis. is_0y=0 - if {$1==$2} x0=$1 else x0={v=-($mx)*$w1/($Mx-$mx);if($2>=$1,v,$w1-v)} fi + if $1==$2 x0=$1 else x0={v=-($mx)*$w1/($Mx-$mx);if($2>=$1,v,$w1-v)} fi stx={if($x0>$w1-$5,-1,1)} - if {$3!=$4" && "$x0>=0" && "$x0<=$w1} + if $3!=$4" && "$x0>=0" && "$x0<=$w1 line $x0,0,$x0,$h1,$6,$pattern,$color 4,4,1,1,x>=y +mirror. x z. 1,3 a[-2,-1] x .,.,1,[0] fc. $color - if {$4>=$3} j[0] .,{$x0-3},{$h1-3},0,0,$6,.. + if $4>=$3 j[0] .,{$x0-3},{$h1-3},0,0,$6,.. else mirror.. y j[0] .,{$x0-3},0,0,0,$6,.. fi rm[-2,-1] i=0 do val={_$offy+$i*$deltay} i+=1 - if {$val>=$my" && "$val<=$My} + if $val>=$my" && "$val<=$My y={v=($val-$my)*$h1/($My-$my);if($4>=$3,v,$h1-v)} line {$x0-1},$y,{$x0+1},$y,$6,$pattern,$color if $val @@ -12013,17 +15533,16 @@ else is_0y=1 fi fi - while {$val<$My} + while $val<$My fi # Draw origin, if necessary. - if {$is_0x" || "$is_0y} + if $is_0x" || "$is_0y 0 t. 0,0,0,$5,1,1 100%,100%,1,[0] fc. $color j[0] .,{if($stx>0,$x0+6,$x0-w-6)},{if($sty>0,$y0+3,$y0-h-3)},0,0,$6,.. rm[-2,-1] fi endl done - v + # Return optimal (offset0,scale) to display input (min,max) values. # $1 = min value, $2 = max value, $3 = max number of tags(>=1). @@ -12033,7 +15552,7 @@ s={10^round(log10($d))} m={round(min($1,$2),$s,-1)} M={round(max($1,$2),$s,1)} - do N={1+round(($M-$m)/$s,1,1)} s={2*$s} while {$N>$n} + do N={1+round(($M-$m)/$s,1,1)} s={2*$s} while $N>$n u $m,{$s/2} #@cli ball : _size>0, _R,_G,_B,0<=_specular_light<=8,0<=_specular_size<=8,_shadow>=0 @@ -12042,28 +15561,71 @@ #@cli : $ repeat 9 ball {1.5^($>+2)},${-RGB} done append x ball : check "${1=64}>0 && ${5=0.8}>=0 && $5<=8 && ${6=1}>=0 && $6<=8 && ${7=1.5}>=0" skip ${2=255},${3=$2},${4=$3} e[^-1] "Input $1x$1 ball with color (${2-4}), specular light $5, specular size $6 and shadow factor $7." - v - l[] + l[] {2*$1},{2*$1} = 1,65%,30% distance 1 * -1 +n 0,1 ^[1] $7 *[1] 1.4 +*[1] $3 +*[1] $4 *[1] $2 a[^0] c >=[0] {100-10*$6}% b[0] {3*$6}% n[0] 0,{$5*255} rv + c 0,255 100%,100% circle[1] 50%,50%,34%,1,1 *[0] [1] *. 255 a c r $1,$1,1,4,2 - endl v + + endl # chromeball64x64 : Output a 64x64 GreyA chrome ball sprite. # ${1-3} = R,G,B chromeball64x64 : - base642img[] "MiB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KNjQgNjQgMSAyICMzMzY0CnicxZl5VJNnvsfT0mM7ntPp9N7paefe6ZzOmWlnemfGmTpzer0dO1WRnQCBQPZ9TwhhDQkYwyKQAAlbEjZBthgRRBahFamAggp1KS7QIgKyk7DIpoCQd54XtComyPLH/f7xvn/k/Xyf3/N7n+X35EUgLOqN9z/DHcqtaW69cqEmK8z7s3csP2ZZO/7ILGzpHhwaHBzoHxgA9/vt55M8fvPaxuh37NOu9AyNjBpNY+PjE+OmkYGuOzfb73XURu1589X0zx2PXu8ZMo0Dbnh41DQxMT5mHO7vam/v7O5sUH35Cgebvyiaf+g3jRuHB/oGjeMPpqamHkyMDvb3g3iG+7tvnjm8a71e/Af+5PXOYdPo4MCwaWr24cO5ubnZ2ekHY6PDgwNDRtNQT9u3mRirqXztt5Laa10jo0N9fcaZ+UWghflHwGBudnpywjTUNzjcd/faN3kBH1vGX98VWdd6b2B4oKt3fH7JbF5+vDC/ADQPm0xPTRr779/vuNZUdUzyT0t9eON/5Webb3f8eOdqW9/Eo2XI/Gh6auYxbAMMHsIO48OD/TcvnCvNltjbvIz/I/RMXVPTlaa6xrauwbG55eU5wAObpZmJialpoJnpSZCZ63WV+rRgxzfW9n0Xr/RsZVX1mdOV9a237o3OLT+amJw3Q9DS3IRxdNQ4NmYcn4YN7l8+U5ybIDq4pgsf4fPrjhcWFhScqL54vWt0Zn5++sHcotkMLc1OjptGR4yjw6MPZqbBu+yoLyvURfjueQF/z1V98YRGo8vWV128PTTzeGlpeWkZtA5B5sVHczNTD4CmZ+Zmp8b6Oy7XFB9NDOV+8hz+1j7Jt9+kKVIyC0433DItmiHzCvtEZvPSit/j+bnpsYGbF6tL8tIiRfRn4+C1PzGKWwuVCRm5xWevDS5CVmRemp0Y6m1rqCrOT1eKBS4/peA/XZKu1mkVKVn5ZQ0/TJmt8dDSeO8PNy6fK9fnZqllIu4fnuA2u4VnO0rU8WmZheUN9x5ZxaHFwatN9bVnSgtzstKOBAkIO1b595007W25CQkpmUUwb7V981T3pXM1VWXFBUcztcpQIWfX6rj9G6nqXotGmZCUDvjO2cWFhWXL/OTdK9/WlJ8yFORkalXhIt5qAL/4l/hSz8UUhVKlKyiv7xibmRibsxzDo77vL56tKDXk52TqUuQiAetTmP/USXm1pzFZoVADvuHOkGlocGzJIr881tlaV1kC+KwMXZS/gI0Er+DNL7zUV+9d1CgUqvTC8gsdIyO9vabHljMwP3S7sbr0eN7R7KN5sf4CLu2XIHv7MXFX7rZmg/jTCysutBuNvT2j81Yy+OBea22ZIe9YblFpPOAZuxGIXQd9ws/fbTMoFIm6/NPfXu8Z6e8bsZIAEMCtxqoSvf54WbUK5pEIm332nsJTP7RXqRSJaTkl3zS13e3pG5mxnABoebKrpe5MWXllXXUc4JnEn73tZo+kpH9/u+FofGJSpr6ytvlGR49VHloytrfW19bVXy6RifgcJuXXv8E6OKIP1d9oOa1JUGtyT5yuvXyza8gqDz0e6/zuUvOVCxkhfjwOk/znv1Id7d0Z+ZcvNeiTEsEELK6qb7kzMG2Vh5ZMP95ovXIqOsCXx2aQ93zFdbZz8ZKX19bX5CSqtbmG01+f/+6u0eokBKNo4PZ3X6cG+/G5LDrZ1t3fzdbBjZqgLz97KkOdmlVUUl7deKN7fNHqNFgauX0+O9zfl8dh0chIfCjazs4ZxY07WlxWlKXRZBcYSmsab9wzPlxcsmzxeKhFHx0oFHDZTBoJxZARHA46ItG86IxCg/5Yhi47/3hpdX1L293eQdP0/Mse5ocdlUlhAQKQPTqV6MmNYSDt7J3d0dzIjAKDoSA3J6/wRGlV9dfnGi5dvdU1MDa9ZjbO99bnxAGey2bQyHiUUCVEO9k5unp4sw9r8/XHiwoLi/T6E8XFJWUV1bUXWm/c6TbNLS4/DWN5prvpZDrMc1gMKgmHZGskZHdHeyekhxctVJVTdBzIcBy20RtOlFR8Xdf43Z2eQePk9KPHy0vzk73f158u0MaGBwhA78lErAMxK5qHQdo7OiM90ARfeVoewE+A5oEMer3hZFnVuebrt37s6ukb6Ou80VRbebIgKzkmPIDPolNJeMy/XHJVEgba2cEJGHhhqP6RqcdAwydLTpVXlJWcMBiKSyrONjRdam48X1dzSl+QBy8d8VHSAB6LRiHhvP/+xVHNkQCKm5PjioEPjuYXrtTmFukNJWWnSk8CA8PJU2WlhsLcrAxtilqVmJAQHxd9ONSfx6BRyVj0xx+mZKkihBgXJydnFzcPT28snswSSaMTkjOOFR4HPSgqKsjNTE2Ii4mOlB+WyQ7LwfWQNNiPS6fRKViv99+JyNaqZCwvV8C7url7on2weBKFwRUGS+VH4hRKpTI2SiYVBwXCCgoODgkJDg4KFAk4DCabhkHtQHDS0zPigyhebq6urkg3d5SXNwZHIJKpNPAAl8fj8/krFz5fIPAV+MISCAQ8LpvN51N99iMQX4J9QxslJPt4uiNh3tMLhIDDE0kUKpVGpzOYLBaLvSIOEHxnsZhMFs8vwI/s80cE4r9CFGk6VbiAjPP2RHl4oFBeXmhvDHAgEElkMmxCg22eiQ7E5PmFSPwIaHgPJUmOJCVGifl08Dp90F5eIABvHwwWi3tqQQEmK6I9EZ3FFYllMi7uILz+/40TEBkXJfXns8GIIOJxGB9v72cGRBKRBExgARtgRaMzuQJ/SUS0mIb9aGXzxzOE4TIJWE/4YErCrxW4AAEcTyAQSLBWcAqVQgX54Pj6B4VHxcoFBORqFfQ5nswPDPL35cLpFfBXXOg0Gtzac4JRFofL9w2UhMuiFTEhVPyTQvAtNAbDEAj5bI6vn5/IPyAwQOQH+/B4XM5q5tnwKwAo+DU4TB4dHaOIk7II7k+LsD97uLmTWWwGnSMQ+geGhIaKxWCYgMESFBTgD8tPKBSKwA8SqVQep1QqYqOlXCLuw6f1h42DowMSR6WQaWy+UBQUKpWAB8ElFHYSiyVhEnCXyCIjo6JiVMlqRbRczCUTv3pWP/3C1fagiw/INoXJEwiD4KclUglMAwupTA4GvTwyVhGfqErVpSnB7GGTSd4/e64A+/jg/v0O7j44YMDhCQNDACgGAx0oRCyVRUYdiYlVqlN1uvRMTZxUxKURiPj/fqEA3PPVflsndx8Chc7h8EXB0jAgqXjFAPBH4hLUKdrMLF1aYmQwj0HCk6l/ebH+tLHbe8DBHUOiMUCeRSHhh+UR0dERMqBDkXHxquRUjS5dl5oYLRawqAQsjbMXsUav79t7wBlNoIM3xfUNORyjUCYmJ6mTU5ISkmBUk5qckhgVyqdRiBgMU2T7cgX/+sEvv3JGE+nwdBNKY1O06ZnpWm16SoIqJS01Me5IpCyYSyHgfbywfMna6nlV/2e31xlLptEoZDpfHJWoyy3ILyjIzdKoosOCgvxYVCyYFyhPilj+hSUa6BOXvUgKk4rxROMYAWFH1FpNSnJ8ZFiwL5OC9/ZCodAoT4JYEfuJFRyBeNfDwZnEpHq7ubhj6Twhn8nkMYk+aA83Dx8Sm0OlsMK12ohPreJAn5FcPMg0vJu9vbMXDuPh5unuam9r6+BJF/n5R6Tk5aei3loPRyB22vliUHgqztV23wEHuwOObo62SAyJzpfEZxflpBI/WJ+G9ZZdmIxL9EG5OhzYb4ckEJnCUHmMUp2uVXj/6tX0iv6Hmp6nUYaHHkrUKmLjlOq0rOwU6u4dG6RX9ME+ukydW1FZXl6kCafs+91mWKCdu7Hqijvj8JY9dadajf3w1cgzvUutWVhbdnQl/XOD9J9y5iwXTp2itzdAF1s+PKxoTPoKh7eTXwr8RZlo6+H7e9anYTX82hptE7FO6M80ibKM7yzfCA1kllvC32veIA5U+PL5/722jeMWDHY2bgaHoGNr+JLN4RAU/gIeulkcMiOfwz9/xaixJNOzcfDmzc3jEHTmJ/7QVnAI8n6CfzC7Nb7vyZ9pmVvDIUi4OnK2kLwnAaysiJFbxSEInsw2A1vnLwF+39ZxCALLcvp2eAkCsY3wIagJ8fvt4NDCTuy2eGifent8YMX2eN2mlq2XdXZwe/w2m4d6/r/5DW1Z6/DbDKClZXt8RfH2eHXE9nim2/b43e9tC596HbGlveepKhGIbSWACgq2beAL74IF+PrW+TJ4/2BtnbeH+R19W8VbVvfPgK3yzk/Kh+6t4c1P6wfUlvCF3T8VIKVb4ROe1U+/7N88fu3549CXm64hJv+AeF6CTeILTmsK0NhN4WYmYq02Y2DmvIQjEHLrH37WBk+1gCMQRCtfHdZq0s4ijkD8tXMj+P2PrODg+JXx6u3kzLpH8C+urU93e69HA9ng2q3TfbwNfIFGOFda7sUF0kZP8L8S1K05Ay80hP52g/CqdnzOTa1o6QFqqdb57dlp7bl/A5UFagkxIDQ1IDEgMSAjNTIKeJxz941i0M/Iz03VTykpTs4ozS3Qd0ktzi7JL9BPzigCiscXF2SkFqXqFeSlMwAAcSYQbQ==" - s. c +apply_gamma.. 0.05 b. 3 n. 0,150 n... 0,1 i[-4] 100%,100%,1,3 fc[-4] ${1-3} *[-4,-3] +[-3,-1] c.. 0,255 a[-2,-1] c + base642img[] \ +"MiB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KNjQgNjQgMSAyICMzMzY0CnicxZl5VJNnvsfT0mM7ntPp9N7paefe6ZzOmWlnemfGmTpzer0dO1W"\ +"RnQCBQPZ9TwhhDQkYwyKQAAlbEjZBthgRRBahFamAggp1KS7QIgKyk7DIpoCQd54XtComyPLH/f7xvn/k/Xyf3/N7n+X35EUgLOqN9z/DHcqtaW69cq"\ +"EmK8z7s3csP2ZZO/7ILGzpHhwaHBzoHxgA9/vt55M8fvPaxuh37NOu9AyNjBpNY+PjE+OmkYGuOzfb73XURu1589X0zx2PXu8ZMo0Dbnh41DQxMT5mH"\ +"O7vam/v7O5sUH35Cgebvyiaf+g3jRuHB/oGjeMPpqamHkyMDvb3g3iG+7tvnjm8a71e/Af+5PXOYdPo4MCwaWr24cO5ubnZ2ekHY6PDgwNDRtNQT9u3"\ +"mRirqXztt5Laa10jo0N9fcaZ+UWghflHwGBudnpywjTUNzjcd/faN3kBH1vGX98VWdd6b2B4oKt3fH7JbF5+vDC/ADQPm0xPTRr779/vuNZUdUzyT0t"\ +"9eON/5Webb3f8eOdqW9/Eo2XI/Gh6auYxbAMMHsIO48OD/TcvnCvNltjbvIz/I/RMXVPTlaa6xrauwbG55eU5wAObpZmJialpoJnpSZCZ63WV+rRgxz"\ +"fW9n0Xr/RsZVX1mdOV9a237o3OLT+amJw3Q9DS3IRxdNQ4NmYcn4YN7l8+U5ybIDq4pgsf4fPrjhcWFhScqL54vWt0Zn5++sHcotkMLc1OjptGR4yjw"\ +"6MPZqbBu+yoLyvURfjueQF/z1V98YRGo8vWV128PTTzeGlpeWkZtA5B5sVHczNTD4CmZ+Zmp8b6Oy7XFB9NDOV+8hz+1j7Jt9+kKVIyC0433DItmiHz"\ +"CvtEZvPSit/j+bnpsYGbF6tL8tIiRfRn4+C1PzGKWwuVCRm5xWevDS5CVmRemp0Y6m1rqCrOT1eKBS4/peA/XZKu1mkVKVn5ZQ0/TJmt8dDSeO8PNy6"\ +"fK9fnZqllIu4fnuA2u4VnO0rU8WmZheUN9x5ZxaHFwatN9bVnSgtzstKOBAkIO1b595007W25CQkpmUUwb7V981T3pXM1VWXFBUcztcpQIWfX6rj9G6"\ +"nqXotGmZCUDvjO2cWFhWXL/OTdK9/WlJ8yFORkalXhIt5qAL/4l/hSz8UUhVKlKyiv7xibmRibsxzDo77vL56tKDXk52TqUuQiAetTmP/USXm1pzFZo"\ +"VADvuHOkGlocGzJIr881tlaV1kC+KwMXZS/gI0Er+DNL7zUV+9d1CgUqvTC8gsdIyO9vabHljMwP3S7sbr0eN7R7KN5sf4CLu2XIHv7MXFX7rZmg/jT"\ +"CysutBuNvT2j81Yy+OBea22ZIe9YblFpPOAZuxGIXQd9ws/fbTMoFIm6/NPfXu8Z6e8bsZIAEMCtxqoSvf54WbUK5pEIm332nsJTP7RXqRSJaTkl3zS"\ +"13e3pG5mxnABoebKrpe5MWXllXXUc4JnEn73tZo+kpH9/u+FofGJSpr6ytvlGR49VHloytrfW19bVXy6RifgcJuXXv8E6OKIP1d9oOa1JUGtyT5yuvX"\ +"yza8gqDz0e6/zuUvOVCxkhfjwOk/znv1Id7d0Z+ZcvNeiTEsEELK6qb7kzMG2Vh5ZMP95ovXIqOsCXx2aQ93zFdbZz8ZKX19bX5CSqtbmG01+f/+6u0"\ +"eokBKNo4PZ3X6cG+/G5LDrZ1t3fzdbBjZqgLz97KkOdmlVUUl7deKN7fNHqNFgauX0+O9zfl8dh0chIfCjazs4ZxY07WlxWlKXRZBcYSmsab9wzPlxc"\ +"smzxeKhFHx0oFHDZTBoJxZARHA46ItG86IxCg/5Yhi47/3hpdX1L293eQdP0/Mse5ocdlUlhAQKQPTqV6MmNYSDt7J3d0dzIjAKDoSA3J6/wRGlV9df"\ +"nGi5dvdU1MDa9ZjbO99bnxAGey2bQyHiUUCVEO9k5unp4sw9r8/XHiwoLi/T6E8XFJWUV1bUXWm/c6TbNLS4/DWN5prvpZDrMc1gMKgmHZGskZHdHey"\ +"ekhxctVJVTdBzIcBy20RtOlFR8Xdf43Z2eQePk9KPHy0vzk73f158u0MaGBwhA78lErAMxK5qHQdo7OiM90ARfeVoewE+A5oEMer3hZFnVuebrt37s6"\ +"ukb6Ou80VRbebIgKzkmPIDPolNJeMy/XHJVEgba2cEJGHhhqP6RqcdAwydLTpVXlJWcMBiKSyrONjRdam48X1dzSl+QBy8d8VHSAB6LRiHhvP/+xVHN"\ +"kQCKm5PjioEPjuYXrtTmFukNJWWnSk8CA8PJU2WlhsLcrAxtilqVmJAQHxd9ONSfx6BRyVj0xx+mZKkihBgXJydnFzcPT28snswSSaMTkjOOFR4HPSg"\ +"qKsjNTE2Ii4mOlB+WyQ7LwfWQNNiPS6fRKViv99+JyNaqZCwvV8C7url7on2weBKFwRUGS+VH4hRKpTI2SiYVBwXCCgoODgkJDg4KFAk4DCabhkHtQH"\ +"DS0zPigyhebq6urkg3d5SXNwZHIJKpNPAAl8fj8/krFz5fIPAV+MISCAQ8LpvN51N99iMQX4J9QxslJPt4uiNh3tMLhIDDE0kUKpVGpzOYLBaLvSIOE"\ +"HxnsZhMFs8vwI/s80cE4r9CFGk6VbiAjPP2RHl4oFBeXmhvDHAgEElkMmxCg22eiQ7E5PmFSPwIaHgPJUmOJCVGifl08Dp90F5eIABvHwwWi3tqQQEm"\ +"K6I9EZ3FFYllMi7uILz+/40TEBkXJfXns8GIIOJxGB9v72cGRBKRBExgARtgRaMzuQJ/SUS0mIb9aGXzxzOE4TIJWE/4YErCrxW4AAEcTyAQSLBWcAq"\ +"VQgX54Pj6B4VHxcoFBORqFfQ5nswPDPL35cLpFfBXXOg0Gtzac4JRFofL9w2UhMuiFTEhVPyTQvAtNAbDEAj5bI6vn5/IPyAwQOQH+/B4XM5q5tnwKw"\ +"Ao+DU4TB4dHaOIk7II7k+LsD97uLmTWWwGnSMQ+geGhIaKxWCYgMESFBTgD8tPKBSKwA8SqVQep1QqYqOlXCLuw6f1h42DowMSR6WQaWy+UBQUKpWAB"\ +"8ElFHYSiyVhEnCXyCIjo6JiVMlqRbRczCUTv3pWP/3C1fagiw/INoXJEwiD4KclUglMAwupTA4GvTwyVhGfqErVpSnB7GGTSd4/e64A+/jg/v0O7j44"\ +"YMDhCQNDACgGAx0oRCyVRUYdiYlVqlN1uvRMTZxUxKURiPj/fqEA3PPVflsndx8Chc7h8EXB0jAgqXjFAPBH4hLUKdrMLF1aYmQwj0HCk6l/ebH+tLH"\ +"be8DBHUOiMUCeRSHhh+UR0dERMqBDkXHxquRUjS5dl5oYLRawqAQsjbMXsUav79t7wBlNoIM3xfUNORyjUCYmJ6mTU5ISkmBUk5qckhgVyqdRiBgMU2"\ +"T7cgX/+sEvv3JGE+nwdBNKY1O06ZnpWm16SoIqJS01Me5IpCyYSyHgfbywfMna6nlV/2e31xlLptEoZDpfHJWoyy3ILyjIzdKoosOCgvxYVCyYFyhPi"\ +"lj+hSUa6BOXvUgKk4rxROMYAWFH1FpNSnJ8ZFiwL5OC9/ZCodAoT4JYEfuJFRyBeNfDwZnEpHq7ubhj6Twhn8nkMYk+aA83Dx8Sm0OlsMK12ohPreJA"\ +"n5FcPMg0vJu9vbMXDuPh5unuam9r6+BJF/n5R6Tk5aei3loPRyB22vliUHgqztV23wEHuwOObo62SAyJzpfEZxflpBI/WJ+G9ZZdmIxL9EG5OhzYb4c"\ +"kEJnCUHmMUp2uVXj/6tX0iv6Hmp6nUYaHHkrUKmLjlOq0rOwU6u4dG6RX9ME+ukydW1FZXl6kCafs+91mWKCdu7Hqijvj8JY9dadajf3w1cgzvUutWV"\ +"hbdnQl/XOD9J9y5iwXTp2itzdAF1s+PKxoTPoKh7eTXwr8RZlo6+H7e9anYTX82hptE7FO6M80ibKM7yzfCA1kllvC32veIA5U+PL5/722jeMWDHY2b"\ +"gaHoGNr+JLN4RAU/gIeulkcMiOfwz9/xaixJNOzcfDmzc3jEHTmJ/7QVnAI8n6CfzC7Nb7vyZ9pmVvDIUi4OnK2kLwnAaysiJFbxSEInsw2A1vnLwF+"\ +"39ZxCALLcvp2eAkCsY3wIagJ8fvt4NDCTuy2eGifent8YMX2eN2mlq2XdXZwe/w2m4d6/r/5DW1Z6/DbDKClZXt8RfH2eHXE9nim2/b43e9tC596HbG"\ +"lveepKhGIbSWACgq2beAL74IF+PrW+TJ4/2BtnbeH+R19W8VbVvfPgK3yzk/Kh+6t4c1P6wfUlvCF3T8VIKVb4ROe1U+/7N88fu3549CXm64hJv+AeF"\ +"6CTeILTmsK0NhN4WYmYq02Y2DmvIQjEHLrH37WBk+1gCMQRCtfHdZq0s4ijkD8tXMj+P2PrODg+JXx6u3kzLpH8C+urU93e69HA9ng2q3TfbwNfIFGO"\ +"Fda7sUF0kZP8L8S1K05Ay80hP52g/CqdnzOTa1o6QFqqdb57dlp7bl/A5UFagkxIDQ1IDEgMSAjNTIKeJxz941i0M/Iz03VTykpTs4ozS3Qd0ktzi7J"\ +"L9BPzigCiscXF2SkFqXqFeSlMwAAcSYQbQ==" + s. c +apply_gamma.. 0.05 b. 3 n. 0,150 n... 0,1 i[-4] 100%,100%,1,3 fc[-4] ${1-3} *[-4,-3] +[-3,-1] + c.. 0,255 a[-2,-1] c #@cli chessboard : size1>0,_size2>0,_offset1,_offset2,_angle,_opacity,_color1,...,_color2,... #@cli : Draw chessboard on selected images. #@cli : Default values: 'size2=size1', 'offset1=offset2=0', 'angle=0', 'opacity=1', 'color1=0' and 'color2=255'. #@cli : $ image.jpg chessboard 32,32,0,0,25,0.3,255,128,0,0,128,255 chessboard : check "$1>0 && ${2=$1}>0" skip ${3=0},${4=0},${5=0},${6=1},${7=0},${8=255} - e[^-1] "Draw chessboard on image$?, with sizes ($1,$2), offsets ($3,$4), angle $5 deg., opacity $6 and colors (${7--1})." - v - i[0] (${7--1}) r[0] {{0,w}/2},1,1,2,-1 permute[0] cyzx - repeat {$!-1} + e[^-1] "Draw chessboard on image$?, with sizes ($1,$2), offsets ($3,$4), angle $5 deg., opacity $6 and + colors (${7--1})." + i[0] (${7--1}) r[0] {{0,w}/2},1,1,2,-1 permute[0] cyzx + repeat $!-1 w={w} h={h} theta={$5*pi/180} ($3,{$3+$w-1};$3,{$3+$w-1}^$4,$4;{$4+$h-1},{$4+$h-1}) r. $w,$h,1,2,3 r. {$w*$h},2,1,1,-1 @@ -12071,14 +15633,13 @@ r. $w,$h,1,2,-1 %. {$1+$2} >=. $1 s. c xor[-2,-1] map. [0] r. 100%,100%,1,.. j.. .,0,0,0,0,$6 rm. - mv. 1 done rm[0] v + + mv. 1 done rm[0] #@cli cie1931 #@cli : Draw CIE-1931 chromaticity diagram on selected images. #@cli : $ 500,400,1,3 cie1931 cie1931 : e[^-1] "Draw CIE-1931 chromaticity diagram on image$?." - v - # Generate convex hull of visible colors, as a 3D object. (67.5;73.5;109.5;103.5;51.5;100.5;37;36) # Header @@ -12095,11 +15656,12 @@ xR=636 yR=504 xG=297 yG=234 xB=147 yB=774 512,512,1,3 triangle_shade. 0,0,{w-1},0,0,{h-1},""255,0,0,""0,255,0,""0,0,255 rgb2srgb. +compose_channels. max +. 1e-8 /[-2,-1] *. 255 - i.. (67.5;73.5;109.5;103.5;51.5;100.5;3;1;$xR;$yR;-0.01;$xG;$yG;-0.01;$xB;$yB;-0.01;9;0;1;2;0;0;511;0;0;511;-128;512;512;3) + i.. (67.5;73.5;109.5;103.5;51.5;100.5;3;1;$xR;$yR;-0.01;$xG;$yG;-0.01;$xB;$yB;-0.01;\ + 9;0;1;2;0;0;511;0;0;511;-128;512;512;3) y. (1) a[-3--1] y mv. 1 # Draw chroma diagram. - repeat {$!-2} + repeat $!-2 to_rgb. fc. 255,255,255 grid. 10%,10%,0,0,0.3,0xCCCCCCCC,1,0 100%,100%,1,3 +*3d[0,1] {(w-8)/$xM},{(h-32)/$yM} @@ -12112,7 +15674,7 @@ a[-2,-1] c blend[-2,-1] alpha 100%,100%,1,1,255 axes. 0,0.75,0.85,0,14,1 +erode. 3 negate. to_rgb.. j... ..,0,0,0,0,1,.,400 rm[-2,-1] - mv. 2 done rm[0,1] v + + mv. 2 done rm[0,1] #@cli circle : x[%],y[%],R[%],_opacity,_pattern,_color1,... #@cli : Draw specified colored circle on selected images. @@ -12124,22 +15686,26 @@ #@cli : $ image.jpg repeat 300 circle {u(100)}%,{u(100)}%,{u(30)},0.3,${-RGB} done circle 50%,50%,100,0.7,255 circle : skip ${4=1},${5=0},${6=0} if ${"is_pattern \"$5\""} - e[0--3] "Draw outlined circle at ($1,$2) with radius $3 on image$?, with opacity $4, pattern $5 and color (${6--1})." + e[0--3] "Draw outlined circle at ($1,$2) with radius $3 on image$?, with opacity $4, pattern $5 and + color (${6--1})." else e[0--3] "Draw filled circle at ($1,$2) with radius $3 on image$?, with opacity $4 and color (${5--1})." fi - v - ellipse $1,$2,$3,$3,0,${4--1} v + + ellipse $1,$2,$3,$3,0,${4--1} -#@cli close_binary : 0<=_endpoint_rate<=100,_endpoint_connectivity>=0,_spline_distmax>=0,_segment_distmax>=0,0<=_spline_anglemax<=180,_spline_roundness>=0,_area_min>=0,_allow_self_intersection={ 0 | 1 } +#@cli close_binary : 0<=_endpoint_rate<=100,_endpoint_connectivity>=0,_spline_distmax>=0,_segment_distmax>=0,\ +# 0<=_spline_anglemax<=180,_spline_roundness>=0,_area_min>=0,_allow_self_intersection={ 0 | 1 } #@cli : Automatically close open shapes in binary images (defining white strokes on black background). -#@cli : Default values: 'endpoint_rate=75', 'endpoint_connectivity=2', 'spline_distmax=80', 'segment_distmax=20', 'spline_anglemax=90', 'spline_roundness=1','area_min=100', 'allow_self_intersection=1'. +#@cli : Default values: 'endpoint_rate=75', 'endpoint_connectivity=2', 'spline_distmax=80', 'segment_distmax=20', \ +# 'spline_anglemax=90', 'spline_roundness=1','area_min=100', 'allow_self_intersection=1'. close_binary : - check "${1=75}>=0 && $1<=100 && ${2=2}>=0 && ${3=80}>=0 && ${4=20}>=0 && ${5=90}>=0 && $5<=180 && ${6=1}>=0 && ${7=100}>=0 && isval(${8=1})" - e[^-1] "Close open shapes in binary image$?, with endpoint rate $1, endpoint connectivity $2, spline max distance $3, segment max distance $4, spline max angle $5, "\ - "spline roundness $6, area min $7 and self intersections "${"arg 1+!$8,allowed,\"not allowed\""}"." + check "${1=75}>=0 && $1<=100 && ${2=2}>=0 && ${3=80}>=0 && ${4=20}>=0 && ${5=90}>=0 && $5<=180 && ${6=1}>=0 && + ${7=100}>=0 && isnum(${8=1})" + e[^-1] "Close open shapes in binary image$?, with endpoint rate $1, endpoint connectivity $2, spline max distance $3, + segment max distance $4, spline max angle $5, spline roundness $6, area min $7 and self intersections "\ + ${"arg 1+!$8,allowed,\"not allowed\""}"." # Set algorithm parameters. - v - endpoint_threshold={100-$1} # in [0,100] endpoint_connectivity={round($2)} spline_distmax=$3 # in px @@ -12198,10 +15764,10 @@ nm. strokes # Extract primary edgel normals. - i[e_normals] 100%,100%,1,4," - N = crop(#"$strokes",x - 1,y - 1,0,0,3,3,1,1,1); + 100%,100%,1,4," + ref(crop(#"$strokes",x - 1,y - 1,0,0,3,3,1,1,1),N); N[4]?[ N[5]?-2:0, N[7]?-2:90, N[3]?-2:180, N[1]?-2:270 ]:[-2,-2,-2,-2]; - " + " nm. e_normals # Smooth edgel normals. f[e_normals] $_edgel_lib" @@ -12285,9 +15851,10 @@ compose_channels[e_smooth_curvatures] max nm[e_smooth_curvatures] smooth_curvatures +compose_channels[e_curvatures] max nm. curvatures - f. "i(#"$smooth_curvatures")>=("$endpoint_threshold"%)/(max(1,i(#"$stroke_radii"))) || i>=max(0.25,"$endpoint_threshold"%)" + f. "i(#"$smooth_curvatures")>=("$endpoint_threshold"%)/(max(1,i(#"$stroke_radii"))) || + i>=max(0.25,"$endpoint_threshold"%)" label_fg. 0,1 nm. keypoints - if {iM>0} + if iM>0 {iM},1,1,3,-1 nm. keycoords f[keypoints] "> # Keep only a single point on connected regions of high curvatures. ret = 0; @@ -12306,8 +15873,8 @@ rm[smooth_curvatures,stroke_radii,keypoints] # Estimate point normals. - if {!narg($keycoords)} - rm[e_normals,e_curvatures] i[new_strokes] [strokes] + if !narg($keycoords) + rm[e_normals,e_curvatures] [strokes] nm. new_strokes else f[keycoords] " P = (I)[0,2]; @@ -12324,7 +15891,7 @@ rm[e_normals,e_curvatures] # Detect pairs of keypoints preserving the spline constraints. - i[keypairs] 256,1,1,3 + 256,1,1,3 nm. keypairs f[keycoords] "> begin(ind = 0); for (nx = x + 1, nx"$_edgel_lib" for_spline(code) = for (t = 0, t<=1, t+=dt, t3 = t*(t2 = t*t); @@ -12370,7 +15937,8 @@ Ic = I; indS = Ic[1]; indT = Ic[2]; - if (i(#"$keycoords",indS,0,0,2)<"$endpoint_connectivity" && i(#"$keycoords",indT,0,0,2)<"$endpoint_connectivity", + if (i(#"$keycoords",indS,0,0,2)<"$endpoint_connectivity" && + i(#"$keycoords",indT,0,0,2)<"$endpoint_connectivity", S = I(#"$keycoords",indS)[0,2]; T = I(#"$keycoords",indT)[0,2]; angS = i(#"$keycoords",indS,0,0,3)*pi/180; @@ -12403,23 +15971,47 @@ for_spline( if (i(#"$new_strokes",P[0] + 1,P[1])==0, edgels = area = 0; Q0 = Q = [ P[0] + 1,P[1],2 ]; - do (i(#"$new_strokes",Q[0],Q[1]) = 4; area+=(Q[2]&1?0:1-Q[2])*(Q[0]+!Q[2]); Q = next2(#"$new_strokes",Q), Q!=Q0 && ++edgels<=max_edgels); - if (edgels<=max_edgels && area>=area_min_threshold && area=area_min_threshold && area=area_min_threshold && area=area_min_threshold && area=area_min_threshold && area=area_min_threshold && area=area_min_threshold && area=area_min_threshold && area=area_min_threshold && area=area_min_threshold && area=area_min_threshold && area=area_min_threshold && area=area_min_threshold && area=area_min_threshold && area=area_min_threshold && area=area_min_threshold && area=0,_is_high_connectivity={ 0 | 1 },_opacity,_color1,... : (+) #@cli : Flood-fill selected images using specified value and tolerance. @@ -12562,12 +16179,11 @@ #@cli : $$ gaussian : skip ${1=3},${2=$1},${3=0} e[^-1] "Draw centered gaussian on image$? with standard deviations ($1,$2) and angle $3 deg." - v - u={cos($3*pi/180)} v={sin($3*pi/180)} dmax={max(w,h)} - if {isval($1)} l1=$1 else l1={${1}10000*$dmax/100} fi - if {isval($2)} l2=$2 else l2={${2}10000*$dmax/100} fi + if isnum($1) l1=$1 else l1={${1}10000*$dmax/100} fi + if isnum($2) l2=$2 else l2={${2}10000*$dmax/100} fi l1={1/(2*max(1/3,$l1)^2)} l2={1/(2*max(1/3,$l2)^2)} A={$l1*$u*$u+$l2*$v*$v} @@ -12577,9 +16193,10 @@ w={w} h={h} ds={d},{s} rm $w,$h,1,1,'X=x-{($w-1)/2};Y=y-{($h-1)/2};$A*X*X+2*$B*X*Y+$C*Y*Y' * -1 exp r $w,$h,$ds - nm $nm endl done v + + nm $nm endl done -#@cli graph : [function_image],_plot_type,_vertex_type,_ymin,_ymax,_opacity,_pattern,_color1,... : 'formula',_resolution>=0,_plot_type,_vertex_type,_xmin,xmax,_ymin,_ymax,_opacity,_pattern,_color1,... : (+) +#@cli graph : [function_image],_plot_type,_vertex_type,_ymin,_ymax,_opacity,_pattern,_color1,... : \ +# 'formula',_resolution>=0,_plot_type,_vertex_type,_xmin,xmax,_ymin,_ymax,_opacity,_pattern,_color1,... : (+) #@cli : Draw specified function graph on selected images. #@cli : 'plot_type' can be { 0=none | 1=lines | 2=splines | 3=bar }. #@cli : 'vertex_type' can be { 0=none | 1=points | 2,3=crosses | 4,5=circles | 6,7=squares }. @@ -12587,7 +16204,8 @@ #@cli : even if a color is specified. #@cli : Default values: 'plot_type=1', 'vertex_type=1', 'ymin=ymax=0 (auto)', 'opacity=1', 'pattern=(undefined)' #@cli : and 'color1=0'. -#@cli : $ image.jpg +rows 50% blur[-1] 3 split[-1] c div[0] 1.5 graph[0] [1],2,0,0,0,1,255,0,0 graph[0] [2],2,0,0,0,1,0,255,0 graph[0] [3],2,0,0,0,1,0,0,255 keep[0] +#@cli : $ image.jpg +rows 50% blur[-1] 3 split[-1] c div[0] 1.5 graph[0] [1],2,0,0,0,1,255,0,0 \ +# graph[0] [2],2,0,0,0,1,0,255,0 graph[0] [3],2,0,0,0,1,0,0,255 keep[0] #@cli grid : size_x[%]>=0,size_y[%]>=0,_offset_x[%],_offset_y[%],_opacity,_pattern,_color1,... #@cli : Draw xy-grid on selected images. @@ -12599,55 +16217,39 @@ grid : check "$1>=0 && $2>=0" skip ${3=0},${4=0},${5=1},${6=0},${7=$6} if ${"is_pattern \"$6\""} e[0--3] "Draw xy-grid on image$?, with sizes ($1,$2), offsets ($3,$4), opacity $5, pattern $6 and color (${7--1})." - v - pattern=$6 color=${7--1} + pattern=$6 color=${7--1} else e[0--3] "Draw xy-grid on image$?, with sizes ($1,$2), offsets ($3,$4), opacity $5, and color (${6--1})." - v - pattern=0xFFFFFFFF color=${6--1} + pattern=0xFFFFFFFF color=${6--1} fi - is_percentsx=${is_percent\ $1} is_percentsy=${is_percent\ $2} - is_percentox=${is_percent\ $3} is_percentoy=${is_percent\ $4} - - repeat $! l[$>] - w={w} h={h} s={s} + eval " + is_percent(str) = (unref(_is_pct); _is_pct=['#str']; _is_pct[size(_is_pct) - 1]==_'%'); + for (k = 0, k=1} - offset={if($is_percentox,$size*$3,$3)} - ({'CImg3d'}) +. 0.5 # Header - 1,{1+int($w/$size)},1,1,'y' *. $size +. {$offset%$size} # Points - 1,{h},1,1,{$h/2} a[-2,-1] x z. 0,2 n={h} i.. ($n;$n) - (1,0;1,{$n-1}) r. 2,$n,1,1,3 round. # Primitives - (-128;1;$h;$s) 1,$h,1,$s line. 0,0,0,100%,1,$pattern,$color # Colors. - if {$n>1} 1,{4*($n-1)},1,1,-128,0,0,0 fi - (-128;1;$h;1) 1,$h,1,1 line. 0,0,0,100%,1,$pattern,1 # Opacities. - if {$n>1} 1,{4*($n-1)},1,1,-128,0,0,0 fi - y[^0] a[^0] y j3d[0] [1],0,0,0,$5,0,0,0 rm[1] # Merge and draw. - fi - - # Draw grid along y-axis. - size={if($is_percentsy,max(1,h*$2),$2)} - if {$size>=1} - offset={if($is_percentoy,$size*$4,$4)} - ({'CImg3d'}) +. 0.5 # Header - 1,{1+int($h/$size)},1,1,'y' *. $size +. {$offset%$size} # Points. - i.. 1,{h},1,1,{$w/2} a[-2,-1] x z. 0,2 n={h} i.. ($n;$n) - (1,0;1,{$n-1}) r. 2,$n,1,1,3 round. # Primitives. - (-128;$w;1;$s) $w,1,1,$s line. 0,0,100%,0,1,$pattern,$color # Colors. - if {$n>1} 1,{4*($n-1)},1,1,-128,0,0,0 fi - (-128;$w;1;1) $w,1,1,1 line. 0,0,100%,0,1,$pattern,1 # Opacities - if {$n>1} 1,{4*($n-1)},1,1,-128,0,0,0 fi - y[^0] a[^0] y j3d.. .,0,0,0,$5,0,0,0 rm. # Merge and draw. - fi + # Horizontal lines. + size = is_percent($1)?max(1,w#k*$1):$1; + size>=1?( + off = (is_percent($3)?size*$3:$3)%size; + for (x = off, x=1?( + off = (is_percent($4)?size*$4:$4)%size; + for (y = off, y=0 && isval(${6=1}) && isval(${7=0})" +linethick : check "${5=2}>=0 && isnum(${6=1}) && isnum(${7=0})" e[^-1] "Draw thick line ($1,$2) - ($3,$4) on image$?, with thickness $5, opacity $6 and color (${7--1})." - v - - if {!$5} line ${1-4},${6--1} + if !$5 line ${1-4},${6--1} else repeat $! l[$>] x0={${"is_percent $1"}?(w-1)*$1:$1} y0={${"is_percent $2"}?(h-1)*$2:$2} @@ -12680,37 +16282,35 @@ "} polygon 4,$coords,${6--1} endl done fi - v + #@cli mandelbrot : z0r,z0i,z1r,z1i,_iteration_max>=0,_is_julia={ 0 | 1 },_c0r,_c0i,_opacity : (+) #@cli : Draw mandelbrot/julia fractal on selected images. #@cli : Default values: 'iteration_max=100', 'is_julia=0', 'c0r=c0i=0' and 'opacity=1'. #@cli : $ 400,400 mandelbrot -2.5,-2,2,2,1024 map 0 +blur 2 elevation3d[-1] -0.2 -#@cli marble : _image_weight,_pattern_weight,_angle,_amplitude,_sharpness>=0,_anisotropy>=0,_alpha,_sigma,_cut_low>=0,_cut_high>=0 +#@cli marble : _image_weight,_pattern_weight,_angle,_amplitude,_sharpness>=0,_anisotropy>=0,_alpha,_sigma,\ +# _cut_low>=0,_cut_high>=0 #@cli : Render marble like pattern on selected images. -#@cli : Default values: 'image_weight=0.2', 'pattern_weight=0.1', 'angle=45', 'amplitude=0', 'sharpness=0.4', 'anisotropy=0.8', +#@cli : Default values: 'image_weight=0.2', 'pattern_weight=0.1', 'angle=45', 'amplitude=0', 'sharpness=0.4' \ +# and 'anisotropy=0.8', #@cli : 'alpha=0.6', 'sigma=1.1' and 'cut_low=cut_high=0'. #@cli : $ image.jpg +marble , marble : skip ${1=0.2},${2=0.1},${3=45},${4=0},${5=0.4},${6=0.8},${7=0.6},${8=1.1},${9=0%},${10=100%} - e[^-1] "Render marble like pattern on image$?, with image weight $1, pattern weight $2, angle $3 deg., amplitude $4, "\ - "sharpness $5, anisotropy $6, alpha $7, sigma $8, and cut ($9,$10)." - v - sx={$2*sin($3*pi/180)} sy={$2*cos($3*pi/180)} f sin(x*$sx+y*$sy+i*$1) - if {$4} smooth $4,$5,$6,$7,$8 fi + e[^-1] "Render marble like pattern on image$?, with image weight $1, pattern weight $2, angle $3 deg., + amplitude $4, sharpness $5, anisotropy $6, alpha $7, sigma $8, and cut ($9,$10)." + sx={$2*sin($3*pi/180)} sy={$2*cos($3*pi/180)} f sin(x*$sx+y*$sy+i*$1) + if $4 smooth $4,$5,$6,$7,$8 fi c $9,$10 n 0,255 - v + #@cli maze : _width>0,_height>0,_cell_size>0 #@cli : Input maze with specified size. #@cli : $ maze 30,20 negate normalize 0,255 maze : check "isint(${1=15}) && $1>0 && isint(${2=$1}) && $2>0 && isint(${3=24}) && $3>0" e[^-1] "Input $1x$2 maze." - v - ({round(u($1-1))},{round(u($2-1))}) # Starting cell. $1,$2,1,1,15 +f. 0 a[-2,-1] c # Starting maze data. _generate_maze $1,$2 _render_maze. $3 nm. [maze] - v + _generate_maze : @@ -12721,24 +16321,24 @@ # Check for neighboring cells that are candidate for opening wall, and select one random. is_candidate=0 - up=-1 if {i($x,$y)&8" && "$y>0" && "!i($x,$y-1,0,1)} up=$x,{$y-1},8 is_candidate=1 fi # Up. - down=-1 if {i($x,$y)&4" && "$y<$2-1" && "!i($x,$y+1,0,1)} down=$x,{$y+1},4 is_candidate=1 fi # Down. - left=-1 if {i($x,$y)&2" && "$x>0" && "!i($x-1,$y,0,1)} left={$x-1},$y,2 is_candidate=1 fi # Left. - right=-1 if {i($x,$y)&1" && "$x<$1-1" && "!i($x+1,$y,0,1)} right={$x+1},$y,1 is_candidate=1 fi # Right. + up=-1 if i($x,$y)&8" && "$y>0" && "!i($x,$y-1,0,1) up=$x,{$y-1},8 is_candidate=1 fi # Up. + down=-1 if i($x,$y)&4" && "$y<$2-1" && "!i($x,$y+1,0,1) down=$x,{$y+1},4 is_candidate=1 fi # Down. + left=-1 if i($x,$y)&2" && "$x>0" && "!i($x-1,$y,0,1) left={$x-1},$y,2 is_candidate=1 fi # Left. + right=-1 if i($x,$y)&1" && "$x<$1-1" && "!i($x+1,$y,0,1) right={$x+1},$y,1 is_candidate=1 fi # Right. if $is_candidate - ($up,$down,$left,$right) discard. -1 r. 3,{h/3},1,1,-1 shift. 0,{round(u(4))},0,0,2 rows. 0,0 mv. -2 + ($up,$down,$left,$right) y. discard. -1 r. 3,{h/3},1,1,-1 shift. 0,{round(u(4))},0,0,2 rows. 0,0 mv. -2 fi # Remove wall between the current and chosen neighboring cells. if $is_candidate - if {{-2,@-1}==8} =. {i($x,$y)&7},$x,$y =. {i($x,$y-1)&11},$x,{$y-1} # Remove up wall. - elif {{-2,@-1}==4} =. {i($x,$y)&11},$x,$y =. {i($x,$y+1)&7},$x,{$y+1} # Remove down wall. - elif {{-2,@-1}==2} =. {i($x,$y)&13},$x,$y =. {i($x-1,$y)&14},{$x-1},$y # Remove left wall. - else =. {i($x,$y)&14},$x,$y =. {i($x+1,$y)&13},{$x+1},$y # Remove right wall. + if {-2,@-1}==8 =. {i($x,$y)&7},$x,$y =. {i($x,$y-1)&11},$x,{$y-1} # Remove up wall. + elif {-2,@-1}==4 =. {i($x,$y)&11},$x,$y =. {i($x,$y+1)&7},$x,{$y+1} # Remove down wall. + elif {-2,@-1}==2 =. {i($x,$y)&13},$x,$y =. {i($x-1,$y)&14},{$x-1},$y # Remove left wall. + else =. {i($x,$y)&14},$x,$y =. {i($x+1,$y)&13},{$x+1},$y # Remove right wall. fi z.. 0,1 a[-3,-2] y # Add neighboring cell to stack of cells to explore. else # No candidate : remove current cell from cells to explore. - if {{-2,h}==1} break fi + if h#-2==1 break fi rows.. 0,{{-2,h}-2} fi while 1 @@ -12762,26 +16362,84 @@ #@cli : $ 0 text "G'MIC",0,0,53,1,1 dilate 3 autocrop 0 frame 1,1,0 maze_mask 8 dilate 3 negate mul 255 maze_mask : check "isint(${1=24}) && $1>0" e[^-1] "Input masked maze from image$? with cell size $1." - v - compose_channels + >= 50% repeat $! l[$>] + compose_channels + >= 50% repeat $! l[$>] do +rand[0] 0,1 *. [0] ({[xM,yM]}) rm.. # Select one starting point in the mask. +flood[0] {^},0,0,0,1,2 >=. 2 +negate. *.. 15 a[-2,-1] c flood[0] {-2,^},0,0,0,1,0 _generate_maze {w},{h} - while {0,iM} + while iM#0 rm[0] + _render_maze. $1 nm. [maze] - endl done v + + endl done + +#@cli newton_fractal : z0r,z0i,z1r,z1i,_angle,0<=_descent_method<=2,_iteration_max>=0,_convergence_precision>0,\ +# _expr_p(z),_expr_dp(z),_expr_d2p(z) +#@cli : Draw newton fractal on selected images, for complex numbers in range (z0r,z0i) - (z1r,z1i). +#@cli : Resulting images have 3 channels whose meaning is [ last_zr, last_zi, nb_iter_used_for_convergence ]. +#@cli : 'descent_method' can be { 0=secant | 1=newton | 2=householder }. +#@cli : Default values: 'angle=0', 'descent_method=1', 'iteration_max=200', 'convergence_precision=0.01', \ +# 'expr_p(z)=z^^3-1', 'expr_dp(z)=3*z^^2' and 'expr_d2z(z)=6*z'. +#@cli : $ 400,400 newton_fractal -1.5,-1.5,1.5,1.5,0,2,200,0.01,"z^^6 + z^^3 - 1","6*z^^5 + 3*z^^2","30*z^^4 + 6*z" \ +# f "[ atan2(i1,i0)*90+20,1,cut(i2/30,0.2,0.7) ]" hsl2rgb +newton_fractal : check "isin(${6=1},0,1,2) && ${7=200}>=0 && ${8=0.01}>0" + skip "${4=0},${9=z^^3-1},${10=3*z^^2},${11=6*z}" + m0,m1,m2=secant,newton,householder + e[^-1] "Draw newton fractal on image$?, for complex range ($1,$2)-($3,$4), with angle $5, $7 max "${m$6}" "\ + "iterations, precision $8, and expressions 'p(z)=$9', 'dp(z)=$10' and 'd2p(z)=$11'." + channels 0,2 + f "* + begin( + const dx = abs($3 - $1); + const dy = abs($4 - $2); + const angle = $5; + const method = $6; + const itermax = $7; + const precision = $8; + + zc = [ $1 + $3, $2 + $4 ]/2; + R = rot(-angle); + ); + + p(z) = ($9); + dp(z) = ($10); + d2p(z) = ($11); + + zn = [ $1 + x*dx/(w-1), $2 + y*dy/(h-1) ]; + angle?(zn = (R*(zn-=zc)+=zc)); + + !method?(znm1 = zn + [ precision,0 ]); + for (iter = 0, iter=0,0<=_min_scale<=100,_allow_rotation={ 0=0 deg. | 1=180 deg. | 2=90 deg. | 3=any },_spacing,_precision>=0,max_iterations>=0 +#@cli pack_sprites : _nb_scales>=0,0<=_min_scale<=100,_allow_rotation={ 0=0 deg. | 1=180 deg. | 2=90 deg. | 3=any },\ +# _spacing,_precision>=0,max_iterations>=0 #@cli : Try to randomly pack as many sprites as possible onto the 'empty' areas of an image. #@cli : Sprites can be eventually rotated and scaled during the packing process. #@cli : First selected image is the canvas that will be filled with the sprites. @@ -12791,14 +16449,19 @@ #@cli : The order of sprite packing follows the order of specified sprites in the image list. #@cli : Sprite packing is done on random locations and iteratively with decreasing scales. #@cli : 'nb_scales' sets the number of decreasing scales considered for all specified sprites to be packed. -#@cli : 'min_scale' (in %) sets the minimal size considered for packing (specified as a percentage of the original sprite size). +#@cli : 'min_scale' (in %) sets the minimal size considered for packing (specified as a percentage of the +#@cli : original sprite size). #@cli : 'spacing' can be positive or negative. #@cli : 'precision' tells about the desired number of failed trials before ending the filling process. -#@cli : Default values: 'nb_scales=5', 'min_scale=25', 'allow_rotation=3', 'spacing=1', 'precision=7' and 'max_iterations=256'. -#@cli : $ 512,512,1,3,"min(255,y*c/2)" 100%,100% circle 50%,50%,100,1,255 append c image.jpg resize2dy[-1] 24 to_rgba pack_sprites 3,25 -pack_sprites : check "isint(${1=5}) && $1>=0 && ${2=25}>=0 && $2<=100 && isint(${3=3}) && $3>=0 && $3<=3 && isint(${4=1}) && isint(${5=7}) && $5>=0 && isint(${6=256}) && $6>=0" - e[^-1] "Randomly pack image$? with $1 scales, minimum scale $2%, "${arg\ 1+$3,no,180\"\ \"deg.,90\"\ \"deg.,any}" rotation, spacing $4, precision $5 and $6 maximum iterations." - v - N={$!-1} is_first_time=1 +#@cli : Default values: 'nb_scales=5', 'min_scale=25', 'allow_rotation=3', 'spacing=1', 'precision=7' \ +# and 'max_iterations=256'. +#@cli : $ 512,512,1,3,"min(255,y*c/2)" 100%,100% circle 50%,50%,100,1,255 append c image.jpg resize2dy[-1] 24 \ +# to_rgba pack_sprites 3,25 +pack_sprites : check "isint(${1=5}) && $1>=0 && ${2=25}>=0 && $2<=100 && isint(${3=3}) && $3>=0 && $3<=3 && + isint(${4=1}) && isint(${5=7}) && $5>=0 && isint(${6=256}) && $6>=0" + e[^-1] "Randomly pack image$? with $1 scales, minimum scale $2%, "${arg\ 1+$3,no,180\"\ \"deg.,90\"\ \"deg.,any}\ + " rotation, spacing $4, precision $5 and $6 maximum iterations." + N={$!-1} is_first_time=1 repeat $! r[$>] 100%,100%,1,{$>,max(2,s)} done # Ensure all images have a binary shape mask. # Start iterations over scales. @@ -12810,7 +16473,7 @@ ratio={if($1>1,$2+(100-$2)*$}] w={w*$ratio} h={h*$ratio} - if {$w<1||$h<1} rm + if $w<1||$h<1 rm else r $w,$h,1,100%,2 sh. 100% !=. 0 area{1+$>}={is} rm. fi endl done @@ -12820,16 +16483,16 @@ # Compute reference sprite. ind={1+($>%$N)} area=${area$ind} - if {$3==0} [$ind] - elif {$3==1} +rotate[$ind] {round(u)*180} - elif {$3==2} +rotate[$ind] {round(u(3))*90} + if $3==0 [$ind] + elif $3==1 +rotate[$ind] {round(u)*180} + elif $3==2 +rotate[$ind] {round(u(3))*90} else +rotate[$ind] {u*360} sh. 100% !=. 0 area={is} rm. fi # Get binary map of possible locations. +channels[0] 100% ==. 0 - if {$4>1} erode. {2*$4-1} - elif {$4<1} dilate. {-2*$4+3} + if $4>1 erode. {2*$4-1} + elif $4<1 dilate. {-2*$4+3} fi # Generate random skeleton-oriented point cloud. @@ -12840,7 +16503,7 @@ *. .. pointcloud3d. # Subdivide point cloud if multiple sprites. - if {$N>1} l. + if $N>1 l. s3d /[1] $N round[1] max[1] 1 n={1,@0} r[2] 3,{{2,h}/3},1,1,-1 i[2] 1,{2,h} rand[2] 0,1 a[2,3] x sort[2] +,y z[2] 1,3 r[2] 3,$n,1,1 y[2] @@ -12851,29 +16514,29 @@ n={@7} if $n s3d. rm[-2,-1] - if {$3==0} # No rotation allowed. + if $3==0 # No rotation allowed. [-6] i.. (-128;{w};{h};{s}) - if {$n>1} 4,{$n-1},1,1,-128,0,0,0 fi + if $n>1 4,{$n-1},1,1,-128,0,0,0 fi +channels.. 100% i.. (-128;{w};{h};{s}) - if {$n>1} ... fi - elif {$3==1} # 180 deg. rotation allowed. + if $n>1 ... fi + elif $3==1 # 180 deg. rotation allowed. +rotate[-6] {round(u(1))*180} i.. (-128;{w};{h};{s}) - if {$n>1} +rotate. 180 i.. (-128;{w};{h};{s}) fi - if {$n>2} 4,{$n-2},1,1,-128,0,0,0 1,100% rand. 0,1 round. 1 j.. .,1 rm. fi + if $n>1 +rotate. 180 i.. (-128;{w};{h};{s}) fi + if $n>2 4,{$n-2},1,1,-128,0,0,0 1,100% rand. 0,1 round. 1 j.. .,1 rm. fi +channels[-4] 100% i.. (-128;{w};{h};{s}) - if {$n>1} +channels[-4] 100% i.. (-128;{w};{h};{s}) fi - if {$n>2} [-5] fi + if $n>1 +channels[-4] 100% i.. (-128;{w};{h};{s}) fi + if $n>2 [-5] fi else # 90 deg. rotation (or more) allowed. +rotate[-6] {round(u(3))*90} i.. (-128;{w};{h};{s}) - if {$n>1} +rotate. 90 i.. (-128;{w};{h};{s}) fi - if {$n>2} +rotate. 90 i.. (-128;{w};{h};{s}) fi - if {$n>3} +rotate. 90 i.. (-128;{w};{h};{s}) fi - if {$n>4} 4,{$n-4},1,1,-128,0,0,0 1,100% rand. 0,3 round. 1 j.. .,1 rm. fi + if $n>1 +rotate. 90 i.. (-128;{w};{h};{s}) fi + if $n>2 +rotate. 90 i.. (-128;{w};{h};{s}) fi + if $n>3 +rotate. 90 i.. (-128;{w};{h};{s}) fi + if $n>4 4,{$n-4},1,1,-128,0,0,0 1,100% rand. 0,3 round. 1 j.. .,1 rm. fi +channels[-8] 100% i.. (-128;{w};{h};{s}) - if {$n>1} +channels[-8] 100% i.. (-128;{w};{h};{s}) fi - if {$n>2} +channels[-8] 100% i.. (-128;{w};{h};{s}) fi - if {$n>3} +channels[-8] 100% i.. (-128;{w};{h};{s}) fi - if {$n>4} [-9] fi + if $n>1 +channels[-8] 100% i.. (-128;{w};{h};{s}) fi + if $n>2 +channels[-8] 100% i.. (-128;{w};{h};{s}) fi + if $n>3 +channels[-8] 100% i.. (-128;{w};{h};{s}) fi + if $n>4 [-9] fi fi y[{$N+3}--1] a[{$N+3}--1] y fi @@ -12886,42 +16549,42 @@ *. ... rm... sh.. 0,{-2,s-2} *. .. rm. # Draw selected sprites on rendering image. - if {iM} j[0] ..,0,0,0,0,1,. rm[-2,-1] + if iM j[0] ..,0,0,0,0,1,. rm[-2,-1] else rm[-2,-1] nb_attempts+=1 - if {$nb_attempts>$5} break else continue fi + if $nb_attempts>$5 break else continue fi fi done k[0] endl - done k[0] v + + done k[0] #@cli piechart : label_height>=0,label_R,label_G,label_B,"label1",value1,R1,G1,B1,...,"labelN",valueN,RN,GN,BN #@cli : Draw pie chart on selected (RGB) images. #@cli : $ image.jpg piechart 25,0,0,0,"Red",55,255,0,0,"Green",40,0,255,0,"Blue",30,128,128,255,"Other",5,128,128,128 piechart : check $1>=0 e[^-1] "Draw pie chart on image$?, with label height $1 and color ($2,$3,$4)." - v - $=arg repeat $! l[$>] + $=arg repeat $! l[$>] ellipse 50%,50%,{w/2-1},{h/2-1},0,1,1 ellipse 50%,50%,{w/2-1},{h/2-1},0,1,0xFFFFFFFF (${6--1:5}) normalize_sum. theta=0 - if {w>1} repeat {w} + if w>1 repeat w xe={0.5*{-2,w}*(1+cos($theta))} ye={0.5*{-2,h}*(1+sin($theta))} line.. 50%,50%,$xe,$ye theta-={2*pi*i($>)} done fi theta=0 - repeat {w} if {i($>)} + repeat w if i($>) ntheta={$theta-2*pi*i($>)} xc={0.5*{-2,w}*(1+0.5*cos(0.5*($ntheta+$theta)))} yc={0.5*{-2,h}*(1+0.5*sin(0.5*($ntheta+$theta)))} xf={0.5*{-2,w}*(1+0.8*cos(0.5*($ntheta+$theta)))} yf={0.5*{-2,h}*(1+0.8*sin(0.5*($ntheta+$theta)))} flood.. $xf,$yf,0,0,0,1,${arg{7+5*$>}},${arg{8+5*$>}},${arg{9+5*$>}} - if {abs($ntheta-$theta)>0.1} + if abs($ntheta-$theta)>0.1 0 t. ${arg{5+5*$>}},0,0,$1,1,1 ($2^$3^$4) r. ..,..,1,3 *. .. j[-4] .,{$xc-w/2},{$yc-h/2},0,0,1,.. @@ -12930,7 +16593,7 @@ theta=$ntheta fi done rm. - endl done v + + endl done #@cli plasma : _alpha,_beta,_scale>=0 : (+) #@cli : Draw a random colored plasma fractal on selected images. @@ -12946,13 +16609,15 @@ #@cli polka_dots : diameter>=0,_density,_offset1,_offset2,_angle,_aliasing,_shading,_opacity,_color,... #@cli : Draw dots pattern on selected images. -#@cli : Default values: 'density=20', 'offset1=offset2=50', 'angle=0', 'aliasing=10', 'shading=1', 'opacity=1' and 'color=255'. +#@cli : Default values: 'density=20', 'offset1=offset2=50', 'angle=0', 'aliasing=10', 'shading=1', 'opacity=1' \ +# and 'color=255'. #@cli : $ image.jpg polka_dots 10,15,0,0,20,10,1,0.5,0,128,255 polka_dots : check $1>=0 skip ${2=20},${3=50},${4=50},${5=0},${6=10},${7=1},${8=1},${9=255} - e[^-1] "Draw polka dots on image$?, with diameter $1, density $2, angle $3 deg., shift ($4,$5), aliasing $6 and shading $7." - v - theta={$5*pi/180} ct={cos($theta)} st={sin($theta)} mid1={$1/2} mid2={$2/2} + e[^-1] "Draw polka dots on image$?, with diameter $1, density $2, angle $3 deg., shift ($4,$5), aliasing $6 and + shading $7." + theta={$5*pi/180} ct={cos($theta)} st={sin($theta)} mid1={$1/2} mid2={$2/2} i[0] (${9--1}) y[0] c - repeat {$!-1} + repeat $!-1 WH={max(w,h)} 100%,100%,100%,1,"xn = 100*x/"$WH"-$3; yn = 100*y/"$WH"-$4; \ xr = xn*"$ct"-yn*"$st"; yr = xn*"$st"+yn*"$ct"; \ @@ -12960,7 +16625,7 @@ "$mid1"-sqrt(xc*xc+yc*yc)" *. $6 c. 0,$7 n. 0,$8 (${9--1}) y. c r. ..,..,.. j... .,0,0,0,0,1,.. rm[-2,-1] - mv. 1 done rm[0] v + + mv. 1 done rm[0] #@cli polygon : N>=1,x1[%],y1[%],...,xN[%],yN[%],_opacity,_pattern,_color1,... : (+) #@cli : Draw specified colored N-vertices polygon on selected images. @@ -12968,7 +16633,8 @@ #@cli : even if a color is specified. If a pattern is specified, the polygon is #@cli : drawn outlined instead of filled. #@cli : Default values: 'opacity=1', 'pattern=(undefined)' and 'color1=0'. -#@cli : $ image.jpg polygon 4,20%,20%,80%,30%,80%,70%,20%,80%,0.3,0,255,0 polygon 4,20%,20%,80%,30%,80%,70%,20%,80%,1,0xCCCCCCCC,255 +#@cli : $ image.jpg polygon 4,20%,20%,80%,30%,80%,70%,20%,80%,0.3,0,255,0 \ +# polygon 4,20%,20%,80%,30%,80%,70%,20%,80%,1,0xCCCCCCCC,255 #@cli : $ image.jpg 2,16,1,1,'u(if(x,{h},{w}))' polygon[-2] {h},{^},0.6,255,0,255 remove[-1] #@cli quiver : [function_image],_sampling[%]>0,_factor>=0,_is_arrow={ 0 | 1 },_opacity,_color1,... @@ -12976,10 +16642,12 @@ #@cli : Default values: 'sampling=5%', 'factor=1', 'is_arrow=1', 'opacity=1', 'pattern=(undefined)' #@cli : and 'color1=0'. #@cli : $ 100,100,1,2,'if(c==0,x-w/2,y-h/2)' 500,500,1,3,255 quiver[-1] [-2],10 -#@cli : $ image.jpg +resize2dy 600 luminance[0] gradient[0] mul[1] -1 reverse[0,1] append[0,1] c blur[0] 8 orientation[0] quiver[1] [0],20,1,1,0.8,255 +#@cli : $ image.jpg +resize2dy 600 luminance[0] gradient[0] mul[1] -1 reverse[0,1] append[0,1] c \ +# blur[0] 8 orientation[0] quiver[1] [0],20,1,1,0.8,255 quiver : check ${"is_image_arg $1"}" && ${2=5%}>0 && ${3=1}>=0 && isbool(${4=1})" skip "${5=1},${6=0}" - e[^-1] "Draw 2D vector field $1 on image$?, with sampling $2, factor $3, arrows "${"arg 1+$4,disabled,enabled"}", opacity $5 and color (${6--1})." - v - pass$1 repeat {$!-1} l[$>,-1] + e[^-1] "Draw 2D vector field $1 on image$?, with sampling $2, factor $3, arrows "${"arg 1+$4,disabled,enabled"}", + opacity $5 and color (${6--1})." + pass$1 repeat $!-1 l[$>,-1] eval ${-math_lib}" s_sampling = ['$2']; sampling = s_sampling[size(s_sampling) - 1 ]==_'%'?min(w#0,h#0)*$2:$2; @@ -12997,7 +16665,7 @@ ); ); " - endl done rm. v + + endl done rm. #@cli rectangle : x0[%],y0[%],x1[%],y1[%],_opacity,_pattern,_color1,... #@cli : Draw specified colored rectangle on selected images. @@ -13012,7 +16680,7 @@ else e[0--3] "Draw filled rectangle from ($1,$2) to ($3,$4) on image$?, with opacity $5 and color (${6--1})." fi - v - polygon 4,$1,$2,$3,$2,$3,$4,$1,$4,${5--1} v + + polygon 4,$1,$2,$3,$2,$3,$4,$1,$4,${5--1} #@cli rorschach : 'smoothness[%]>=0','mirroring={ 0=none | 1=x | 2=y | 3=xy } #@cli : Render rorschach-like inkblots on selected images. @@ -13020,30 +16688,28 @@ #@cli : $ 400,400 rorschach 3% rorschach : check "${1=5%}>=0 && isint(${2=1}) && $2>=0 && $2<=3" e[^-1] "Render rorschach-like inkblots on image$?, with smoothness $1 and "${arg\ 1+$2,no,x,y,xy}"-mirroring." - v - - if {$2==0} # No mirroring. + if $2==0 # No mirroring. rand -1,1 b $1 >= 0 - elif {$2==1} # X-mirroring. + elif $2==1 # X-mirroring. repeat $! l[$>] w={w} columns 0,{w/2-1} rand -1,1 b $1 >= 0 - +mirror x if {$w%2} columns. 1,100% fi a x + +mirror x if $w%2 columns. 1,100% fi a x endl done - elif {$2==2} # Y-mirroring. + elif $2==2 # Y-mirroring. repeat $! l[$>] h={h} rows 0,{h/2-1} rand -1,1 b $1 >= 0 - +mirror y if {$h%2} rows. 1,100% fi a y + +mirror y if $h%2 rows. 1,100% fi a y endl done - elif {$2==3} # XY-mirroring. + elif $2==3 # XY-mirroring. repeat $! l[$>] w={w} h={h} z 0,0,{w/2-1},{h/2-1} rand -1,1 b $1 >= 0 - +mirror x if {$w%2} columns. 1,100% fi a x - +mirror y if {$h%2} rows. 1,100% fi a y + +mirror x if $w%2 columns. 1,100% fi a x + +mirror y if $h%2 rows. 1,100% fi a y endl done fi - v + #@cli sierpinski : recursion_level>=0 #@cli : Draw Sierpinski triangle on selected images. @@ -13051,30 +16717,40 @@ #@cli : $ image.jpg sierpinski 7 sierpinski : check ${1=7}>=0 skip ${2=50},${3=0},${4=0},${5=100},${6=100},${7=100} e[^-1] "Draw Sierpinski triangle of degree $1 on image$?." - v - _sierpinski ${2-7},$1 v + + _sierpinski ${2-7},$1 _sierpinski : - if {$7<=0} polygon 3,$1%,$2%,$3%,$4%,$5%,$6%,1,255 return fi + if $7<=0 polygon 3,$1%,$2%,$3%,$4%,$5%,$6%,1,255 return fi _sierpinski $1,$2,{($1+$3)/2},{($2+$4)/2},{($1+$5)/2},{($2+$6)/2},{$7-1} _sierpinski {($1+$3)/2},{($2+$4)/2},$3,$4,{($3+$5)/2},{($4+$6)/2},{$7-1} _sierpinski {($1+$5)/2},{($2+$6)/2},$5,$6,{($3+$5)/2},{($4+$6)/2},{$7-1} -#@cli spiralbw -#@cli : Draw (squared) spiral on selected images. -#@cli : $ 16,16 spiralbw -spiralbw : - e[^-1] "Draw (squared) black and white spiral on image$?." - v - channels 0 - f "r=min(x,y,w-1-x,h-1-y); 2*r*(w+h-2*r-1) + if(min(x,h-1-y)>=min(w-1-x,y),x+y,2*(w+h-2-2*r)-x-y)" - v + +#@cli spiralbw : width>0,_height>0,_is_2dcoords={ 0 | 1 } +#@cli : Input a 2D rectangular spiral image with specified size. +#@cli : Default values: 'height=width' and 'is_2dcoords=0'. +#@cli : $ spiralbw 16 +#@cli : $ image.jpg spiralbw {[w,h]},1 +warp[0] [1],0 +warp[2] [1],2 +spiralbw : check "$1>=1 && ${2=$1}>=1 && isbool(${3=0})" + e[^-1] "Input 2D rectangular spiral image of size $1x$2." + main="alpha = min(x,y,w - 1 - x,h - 1 - y); + t0 = alpha*2*(w + h) - 4*alpha^2; + X = x - alpha; + Y = y - alpha; + W = w - 2*alpha; + H = h - 2*alpha; + t = t0 + (Y==0?X: + X==W - 1?W - 1 + Y: + Y==H - 1?2*W + H - 3 - X: + 2*(W + H - 2) - Y);" + if $3 $1,$2,1,2,$main"[ t%w, int(t/w) ]" else $1,$2,1,1,$main fi #@cli spline : x0[%],y0[%],u0[%],v0[%],x1[%],y1[%],u1[%],v1[%],_opacity,_color1,... #@cli : Draw specified colored spline curve on selected images (cubic hermite spline). #@cli : Default values: 'opacity=1' and 'color1=0'. -#@cli : $ image.jpg repeat 30 spline {u(100)}%,{u(100)}%,{u(-600,600)},{u(-600,600)},{u(100)}%,{u(100)}%,{u(-600,600)},{u(-600,600)},0.6,255 done +#@cli : $ image.jpg repeat 30 spline {u(100)}%,{u(100)}%,{u(-600,600)},{u(-600,600)},{u(100)}%,{u(100)}%,\ +# {u(-600,600)},{u(-600,600)},0.6,255 done spline : skip ${9=1},${10=0} e[^-1] "Draw spline from ($1,$2) [$3,$4] to ($5,$6) [$7,$8] on image$?, with opacity $9 and color (${10--1})." - v - repeat $! l[$>] x0={if(${"is_percent $1"},$1*(w-1),$1)} y0={if(${"is_percent $2"},$2*(h-1),$2)} @@ -13085,13 +16761,12 @@ u1={if(${"is_percent $7"},$7*(w-1),$7)} v1={if(${"is_percent $8"},$8*(h-1),$8)} eval ${-math_lib}"spline(#0,["$x0","$y0"],["$u0","$v0"],["$x1","$y1"],["$u1","$v1"],$9,[${10--1}])" - endl done v + + endl done #@cli tetraedron_shade : x0,y0,z0,x1,y1,z1,x2,y2,z2,x3,y3,z3,R0,G0,B0,...,R1,G1,B1,...,R2,G2,B2,...,R3,G3,B3,... #@cli : Draw tetraedron with interpolated colors on selected (volumetric) images. tetraedron_shade : e[^-1] "Draw tetraderon ($1,$2,$3)-($4,$5,$6)-($7,$8,$9)-($10,$11,$12) with interpolated colors in image$?." - v - # Find bounding box. xm={round(min($1,$4,$7,$10),1,-1)} xM={round(max($1,$4,$7,$10),1,1)} @@ -13134,51 +16809,68 @@ ) " rm. - v + #@cli t : eq. to 'text'. : (+) -#@cli text : text,_x[%],_y[%],_font_height[%]>=0,_opacity,_color1,... : (+) +#@cli text : text,_x[%|~],_y[%|~],_font_height[%]>=0,_opacity,_color1,... : (+) #@cli : Draw specified colored text string on selected images. #@cli : (eq. to 't').\n +#@cli : If one of the x or y argument ends with a '~', its value is expected to be +#@cli : a centering ratio (in [0,1]) rather than a position. +#@cli : Usual centering ratio are { 0=left-justified | 0.5=centered | 1=right-justified }. #@cli : Sizes '13' and '128' are special and correspond to binary fonts (no-antialiasing). #@cli : Any other font size is rendered with anti-aliasing. #@cli : Specifying an empty target image resizes it to new dimensions such that the image contains #@cli : the entire text string. -#@cli : Default values: 'opacity=1' and 'color1=0'. -#@cli : $ image.jpg resize2dy 600 y=0 repeat 30 text {2*$>}" : This is a nice text, isn't it ?",10,$y,{2*$>},0.9,255 y+={2*$>} done +#@cli : Default values: 'x=y=0.01~', 'font_height=16', 'opacity=1' and 'color1=0'. +#@cli : $ image.jpg resize2dy 600 y=0 repeat 30 text {2*$>}" : This is a nice text, isn't it ?",10,$y,{2*$>},0.9,255 \ +# y+={2*$>} done #@cli : $ 0 text "G'MIC",0,0,23,1,255 #@cli to : eq. to 'text_outline'. -to : skip ${2=1%} - _text_outline "$1",${2--1} +to : skip "${1=}",${2=0.01~},${3=0.01~} check "${4=7.5%}>0 && ${5=2}>=0 && isnum(${6=1}) && isnum(${7=255}) && "\ + "isnum(${8=$7}) && isnum(${9=$7}) && isnum(${10=255})" + _text_outline $"*" -#@cli text_outline : text,_x[%],_y[%],_font_height[%]>0,_outline>=0,_opacity,_color1,... +#@cli text_outline : text,_x[%|~],_y[%|~],_font_height[%]>0,_outline>=0,_opacity,_color1,... #@cli : Draw specified colored and outlined text string on selected images. -#@cli : Default values: 'x=y=1%', 'font_height=7.5%', 'outline=2', 'opacity=1' and 'color1=255'. +#@cli : If one of the x or y argument ends with a '~', its value is expected to be +#@cli : a centering ratio (in [0,1]) rather than a position. +#@cli : Usual centering ratio are { 0=left-justified | 0.5=centered | 1=right-justified }. +#@cli : Default values: 'x=y=0.01~', 'font_height=7.5%', 'outline=2', 'opacity=1', 'color1=color2=color3=255' \ +# and 'color4=255'. #@cli : $ image.jpg text_outline "Hi there!",10,10,63,3 -text_outline : skip ${2=1%} - _text_outline "$1",${2--1} - -_text_outline : skip ${3=1%},${4=7.5%},${5=2},${6=1},${7=255} - e[0--3] "Draw outlined text '$1' at position ($2,$3) on image$?, with font height $4, outline $5, opacity $6 and color ${7--1}." - v - if $5 - repeat $! l[$>] - 0 t. "$1",0,0,{-2,${"is_percent $4"}?h*$4:$4},1,${7--1},1 expand_xy. {1+$5},0 - s. c,{-narg(${7--1})} dilate. {2*$5+1} - if {0,w} r[1] 100%,100%,1,{0,s},0,1 j[0] [1],$2,$3,0,0,$6,[2] - else rm[0] i[0] [0] fi - rm[-2,-1] - endl done - else t "$1",${2-4},${6--1} - fi v + +text_outline : skip "${1=}",${2=0.01~},${3=0.01~} + check "${4=7.5%}>0 && ${5=2}>=0 && isnum(${6=1}) && isnum(${7=255}) && "\ + "isnum(${8=$7}) && isnum(${9=$7}) && isnum(${10=255})" + _text_outline $"*" + +_text_outline : skip "${1=}" + e[0--3] "Draw outlined text '$1' at position ($2,$3) on image$?, with font height $4, outline $5, opacity $6 and + color ${7--1}." + if !narg("$1") return fi + sepx,sepy={"sx=['$2']; sy=['$3']; [sx[size(sx)-1], sy[size(sy)-1]]"} + is_fontpercent=${"is_percent $4"} + xpos={`s=['"$2"'];$sepx==_'~'||$sepx==_'%'?s[0,size(s)-1]:s`} + ypos={`s=['"$3"'];$sepy==_'~'||$sepy==_'%'?s[0,size(s)-1]:s`} + repeat $! l[$>] + 0 t. "$1",0,0,{-2,$is_fontpercent?h*$4:$4},1,1 expand_xy. {1+$5},0 + +dilate. {2*$5+1} + i[-3] (${7--1}) r... {s#0},1,1,1,0,2 y... c r... .,.,1,100% + if $5 *[-3,-2] else rm.. fi + if w#0 + j... ..,{[($sepx==_'~'?(w#0-1-w):$sepx==_'%'?(w#0-1)%:1)*$xpos,\ + ($sepy==_'~'?(h#0-1-h):$sepy==_'%'?(h#0-1)%:1)*$ypos]},0,0,$6,. + k[0] + else k[1] + fi + endl done #@cli triangle_shade : x0,y0,x1,y1,x2,y2,R0,G0,B0,...,R1,G1,B1,...,R2,G2,B2,... #@cli : Draw triangle with interpolated colors on selected images. #@cli : $ image.jpg triangle_shade 20,20,400,100,120,200,255,0,0,0,255,0,0,0,255 triangle_shade : e[^-1] "Draw triangle ($1,$2)-($3,$4)-($5,$6) with interpolated colors on image$?." - v - # Find color mapping coefficients for each vertex. l[] ($1,$2,1;$3,$4,1;$5,$6,1) (${7--1}) r. {w/3},3,1,1,-1 s. x solve[^0] [0] rm[0] a c endl @@ -13188,13 +16880,15 @@ t1={$1*$4-$2*$3} t2={$2-$4} t3={$3-$1} # Begin drawing on each selected image. - repeat {$!-1} l[$>,-1] repeat {0,s} + repeat $!-1 l[$>,-1] repeat s#0 a={i(0,0,0,$>)} b={i(0,1,0,$>)} c={i(0,2,0,$>)} sh[0] $> - f. "s = "$invarea"*("$s1" + "$s2"*x + "$s3"*y); t = "$invarea"*("$t1" + "$t2"*x + "$t3"*y); s>=0 && t>=0 && t+s<=1 ? "$a"*x+"$b"*y+"$c":i" + f. "s = "$invarea"*("$s1" + "$s2"*x + "$s3"*y); + t = "$invarea"*("$t1" + "$t2"*x + "$t3"*y); + s>=0 && t>=0 && t+s<=1 ? "$a"*x+"$b"*y+"$c":i" rm. done endl done - rm. v + + rm. #@cli truchet : _scale>0,_radius>=0,_pattern_type={ 0=straight | 1=curved } #@cli : Fill selected images with random truchet patterns. @@ -13202,14 +16896,14 @@ #@cli : $ 400,300 truchet , truchet : check "isint(${1=32}) && $1>0 && ${2=3}>=0" skip ${3=1} e[^-1] "Render "${arg\ 1+!$3,curved,straight}" truchet patterns in image$?, with scale $1 and radius $2." - v - repeat $! l[$>] nm={0,n} + repeat $! l[$>] nm={0,n} w={w} h={h} s={s} rm $1,$1 = 1,0,0 = 1,100%,100% distance 1,{1+$3} M={int(iM/2)} # Generate truchet pattern and its mirrored version. ir {$M-$2/2-($1%2)},{$M+$2/2} +mirror y a x {round($w/$1,1,1)},{round($h/$1,1,1)} rand. 0,1 >=. 50% r. {w*$1},{h*$1} *. $1 channels. 0,1 (0,{$1-1}) r. $1,$1,1,1,3 +transpose. a[-2,-1] c r. ..,0,2 +[-2,-1] warp.. . rm. >= 50% r $w,$h,1,1,0 r 100%,100%,1,$s - nm $nm endl done v + + nm $nm endl done #@cli turbulence : _radius>0,_octaves={1,2,3...,12},_alpha>0,_difference={-10,10},_mode={0,1,2,3} #@cli : Render fractal noise or turbulence on selected images. @@ -13217,33 +16911,34 @@ #@cli : $ 400,400,1,3 turbulence 16 #@cli : $$ turbulence : check "${1=32}>0 && ${2=6}>0" skip ${3=3},${4=0},${5=0} - e[^-1] "Render fractal noise or turbulence on image$?, with radius $1, octaves $2, damping per octave $3, difference $4 and mode $5." - v - repeat $! l[$>] nm={0,n} - if {$4} . fi + e[^-1] "Render fractal noise or turbulence on image$?, with radius $1, octaves $2, damping per octave $3, + difference $4 and mode $5." + repeat $! l[$>] nm={0,n} + if $4 . fi f. 0 +noise. 10,0 b. $1,0 - if {$5==0||$5==1} -. {ia} abs. - elif {$5==3||$5==4} ^. 2 - elif {$5==5} ^. 3 + if $5==0||$5==1 -. {ia} abs. + elif $5==3||$5==4 ^. 2 + elif $5==5 ^. 3 fi - repeat {$2-1} + repeat $2-1 +noise.. 10,0 b. {$1/2^$>},0 - if {$5==0} -. {ia} abs. - elif {$5==4} ^. 2 - elif {$5==5} ^. 3 + if $5==0 -. {ia} abs. + elif $5==4 ^. 2 + elif $5==5 ^. 3 fi *.. $3 +[-2--1] done n. 0,255 rm.. - if {$4} *. $4 mv.. 2 - n. 0,255 fi - nm $nm endl done v + + if $4 *. $4 mv.. 2 - n. 0,255 fi + nm $nm endl done #@cli yinyang #@cli : Draw a yin-yang symbol on selected images. #@cli : $ 400,400 yinyang yinyang : e[^-1] "Draw yin-yang symbol on image$?." - v - f 0 repeat $! l[$>] + f 0 repeat $! l[$>] s={s} channels 0 r={round(0.95*min(w,h)/4)} +line 50%,0,50%,50%,1,2 ellipse. 50%,{h/2-$r},$r,$r,0,1,2 @@ -13255,7 +16950,7 @@ ellipse. 50%,{h/2-$r},{$r/3},{$r/3},0,1,1 ellipse. 50%,{h/2+$r},{$r/3},{$r/3},0,1,2 r 100%,100%,1,$s - endl done v + + endl done #--------------------------------- # @@ -13274,13 +16969,65 @@ #@cli : $ image.jpg structuretensors blur 2 eigen split[0] c #@cli : $$ -#@cli invert : (+) +#@cli invert : solver={ 0=SVD | 1=LU } : (+) #@cli : Compute the inverse of the selected matrices. +#@cli : SVD solver is slower but less numerically instable than LU. +#@cli : Default value: 'solver=1'. #@cli : $ (0,1,0;0,0,1;1,0,0) +invert +#@cli orthogonalize : _mode = { 0=orthogonalize | 1=orthonormalize } +#@cli : Orthogonalize or orthonormalize selected matrices, using Modified Gram-Schmidt process. +#@cli : Default value: 'mode=0'. +orthogonalize : + if isbool($1) mode=$1 else mode=0 noarg fi + u0,u1,v0,v1=Orthogonalize,Orthonormalize,x,ce + e[^-1] ${u$mode}" matri"${v{$!!=1}}"$?, using Modified Gram-Schmidt process." + repeat $! l[$>] + eval "> + proj(u,v) = (dot(u,v)/dot(u,u)*u); + for (p = 1, p0 },_max_residual>=0 : (+) +#@cli : Find best matching projection of selected matrices onto the span of an over-complete +#@cli : dictionary D, using the orthogonal projection or Matching Pursuit algorithm. +#@cli : Selected images are 2D-matrices in which each column represent a signal to project. +#@cli : '[dictionnary]' is a matrix in which each column is an element of the dictionnary D. +#@cli : 'method' tells what projection algorithm must be applied. It can be: +#@cli : \ - 0 = orthogonal projection (least-squares solution using LU-based solver). +#@cli : \ - 1 = matching pursuit. +#@cli : \ - 2 = matching pursuit, with a single orthogonal projection step at the end. +#@cli : \ - >=3 = orthogonal matching pursuit where an orthogonal projection step is performed +#@cli : \ every 'method-2' iterations. +#@cli : 'max_iter' sets the max number of iterations processed for each signal. +#@cli : If set to '0' (default), 'max_iter' is equal to the number of columns in D. +#@cli : (only meaningful for matching pursuit and its variants). +#@cli : 'max_residual' gives a stopping criterion on signal reconstruction accuracy. +#@cli : (only meaningful for matching pursuit and its variants). +#@cli : For each selected image, the result is returned as a matrix W +#@cli : whose columns correspond to the weights associated to each column of D, +#@cli : such that the matrix product D*W is an approximation of the input matrix. +#@cli : Default values: 'method=0', 'max_iter=0' and 'max_residual=1e-6'. + #@cli solve : [image] : (+) #@cli : Solve linear system AX = B for selected B-matrices and specified A-matrix. -#@cli : If the system is under- or over-determined, the least square solution is returned. +#@cli : If the system is under- or over-determined, the least squares solution is returned +#@cli : (using SVD-based solver). #@cli : $ (0,1,0;1,0,0;0,0,1) (1;2;3) +solve[-1] [-2] #@cli svd : (+) @@ -13292,7 +17039,7 @@ #@cli : $ image.jpg +transpose transpose : e[^-1] "Transpose image$?." - v - permute yxzc v + + permute yxzc #@cli trisolve : [image] : (+) #@cli : Solve tridiagonal system AX = B for selected B-vectors and specified tridiagonal A-matrix. @@ -13302,7 +17049,7 @@ #--------------------------------- # -#@cli :: 3D Rendering +#@cli :: 3D Meshes # #--------------------------------- @@ -13314,22 +17061,24 @@ #@cli : (eq. to '+3d'). #@cli : Default values: 'ty=tz=0'. #@cli : $ sphere3d 10 repeat 5 +add3d[-1] 10,{u(-10,10)},0 color3d[-1] ${-RGB} done add3d -#@cli : $ repeat 20 torus3d 15,2 color3d[-1] ${-RGB} mul3d[-1] 0.5,1 if {$>%2} rotate3d[-1] 0,1,0,90 fi add3d[-1] 70 add3d rotate3d[-1] 0,0,1,18 done double3d 0 +#@cli : $ repeat 20 torus3d 15,2 color3d[-1] ${-RGB} mul3d[-1] 0.5,1 if $>%2 rotate3d[-1] 0,1,0,90 fi add3d[-1] 70 \ +# add3d rotate3d[-1] 0,0,1,18 done double3d 0 #@cli animate3d : _width>0,_height>0,_angle_dx,_angle_dy,_angle_dz,_zoom_factor>=0,_filename #@cli : Animate selected 3D objects in a window. #@cli : If argument 'filename' is provided, each frame of the animation is saved as a numbered filename. -#@cli : Default values: 'width=640', 'height=480', 'angle_dx=0', 'angle_dy=1', 'angle_dz=0', 'zoom_factor=1' and 'filename=(undefined)'. +#@cli : Default values: 'width=640', 'height=480', 'angle_dx=0', 'angle_dy=1', 'angle_dz=0', 'zoom_factor=1' \ +# and 'filename=(undefined)'. animate3d : skip ${1=640},${2=480},${3=0},${4=1},${5=0},"${7=""}" check ${6=1}>=0 e[^-1] "Animate 3D object$?, in a $1x$2 window with angle velocities ($3,$4,$5)." - v - is_multi={$!>1} repeat $! +l[$>] + is_multi={$!>1} repeat $! +l[$>] n3d *3d {$6*min($1,$2)/1.5} c3d ax=0 ay=0 az=0 frame=0 vfact=1 do +r3d 1,0,0,$ax r3d. 0,1,0,$ay r3d. 0,0,1,$az ax+=$3 ay+=$4 az+=$5 $1,$2,1,3,-1 j3d. ..,50%,50%,0,1 - if {narg("$7")} + if narg("$7") to_rgba. replace_color. 0,0,-1,-1,-1,255,64,64,64,0 if $is_multi filename=${filename\ "$7",$>,$frame} else filename=${filename\ "$7",$frame} fi o. $filename frame+=1 @@ -13337,18 +17086,18 @@ replace. -1,64 fi w. {$vfact*w},{$vfact*h},0,0,-1,-1,{0,n} wait 20 k[0] - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,-D}} vfact=1.5 fi # Increase window size. - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,-C}} vfact={1/1.5} fi # Decrease window size. - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,-R}} vfact=1 fi # Decrease window size. - while {{*}" && "!{*,ESC}" && "!{*,Q}} rm w 0 - endl done v + + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,-D} vfact=1.5 fi # Increase window size. + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,-C} vfact={1/1.5} fi # Decrease window size. + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,-R} vfact=1 fi # Decrease window size. + while {*}" && "!{*,ESC}" && "!{*,Q} rm w 0 + endl done #@cli apply_camera3d : pos_x,pos_y,pos_z,target_x,target_y,target_z,up_x,up_y,up_z #@cli : Apply 3D camera matrix to selected 3D objects. #@cli : Default values: 'target_x=0', 'target_y=0', 'target_z=0', 'up_x=0', 'up_y=-1' and 'up_z=0'. apply_camera3d : skip ${4=0},${5=0},${6=0},${7=0},${8=-1},${9=0} - e[^-1] "Apply 3D camera matrix to 3D object$?, with camera position ($1,$2,$3), target position ($4,$5,$6) and up-vector ($7,$8,$9)." - v - + e[^-1] "Apply 3D camera matrix to 3D object$?, with camera position ($1,$2,$3), target position ($4,$5,$6) and + up-vector ($7,$8,$9)." ({$4-$1}^{$5-$2}^{$6-$3}) # f. ($7^$8^$9) # up. orientation[-2,-1] # f/|f| and up/|up|. @@ -13357,7 +17106,6 @@ rm... y[-3--1] x mv[-2,-1] -3 a[-3--1] y z. 0,3 # Rotation matrix R. -3d[^-1] $1,$2,$3 pose3d[^-1] {^} rm. -3d 0,0,800 - v + _cross3d : ({$2*$6-$3*$5}^{$3*$4-$1*$6}^{$1*$5-$2*$4}) orientation. y. @@ -13367,17 +17115,18 @@ #@cli : $ torus3d 10,1 +apply_matrix3d {mul(rot(1,0,1,-15),[1,0,0,0,2,0,0,0,8],3)} double3d 0 apply_matrix3d : e[^-1] "Apply 3x3 matrix (${1-3};${4-6};${7-9}) to 3D object$?." - v - repeat $! l[$>] + repeat $! l[$>] nbp={i[6]} sh 8,{8+3*$nbp-1},0,0 r. 3,$nbp,1,1,-1 3,3,1,1,$* transpose. m*[-2,-1] rm. - endl done v + + endl done #@cli array3d : size_x>=1,_size_y>=1,_size_z>=1,_offset_x[%],_offset_y[%],_offset_y[%] #@cli : Duplicate a 3D object along the X,Y and Z axes. #@cli : Default values: 'size_y=1', 'size_z=1' and 'offset_x=offset_y=offset_z=100%'. #@cli : $ torus3d 10,1 +array3d 5,5,5,110%,110%,300% -array3d : check "isint($1) && $1>0 && isint(${2=1}) && $2>0 && isint(${3=1}) && $3>0" skip ${4=100%},${5=100%},${6=100%} +array3d : check "isint($1) && $1>0 && isint(${2=1}) && $2>0 && isint(${3=1}) && $3>0" + skip ${4=100%},${5=100%},${6=100%} e[^-1] "Duplicate 3D object$? along X,Y,Z axes with factors ($1,$2,$3) and offsets ($4,$5,$6)." - v - repeat $! l[$>] + repeat $! l[$>] # Retrieve object dimensions. +rows 8,{8+3*i[6]} r. 3,{h/3},1,1,-1 s. x,3 @@ -13387,23 +17136,23 @@ rm[-3--1] # Duplicate along X. - off=0 repeat {int(log2($1))} + off=0 repeat int(log2($1)) ++3d. {2^$>*$dx} +3d. .. - if {!($1&(2^$>))} rm.. else +3d.. $off off+={2^$>*$dx} fi + if !($1&(2^$>)) rm.. else +3d.. $off off+={2^$>*$dx} fi done +3d. $off +3d # Duplicate along Y. - off=0 repeat {int(log2($2))} + off=0 repeat int(log2($2)) ++3d. 0,{2^$>*$dy} +3d. .. - if {!($2&(2^$>))} rm.. else +3d.. 0,$off off+={2^$>*$dy} fi + if !($2&(2^$>)) rm.. else +3d.. 0,$off off+={2^$>*$dy} fi done +3d. 0,$off +3d # Duplicate along Z. - off=0 repeat {int(log2($3))} + off=0 repeat int(log2($3)) ++3d. 0,0,{2^$>*$dz} +3d. .. - if {!($3&(2^$>))} rm.. else +3d.. 0,0,$off off+={2^$>*$dz} fi + if !($3&(2^$>)) rm.. else +3d.. 0,0,$off off+={2^$>*$dz} fi done +3d. 0,0,$off +3d - endl done v + + endl done #@cli arrow3d : x0,y0,z0,x1,y1,z1,_radius[%]>=0,_head_length[%]>=0,_head_radius[%]>=0 #@cli : Input 3D arrow with specified starting and ending 3D points. @@ -13411,7 +17160,6 @@ #@cli : $ repeat 10 a={$>*2*pi/10} arrow3d 0,0,0,{cos($a)},{sin($a)},-0.5 done +3d arrow3d : check "${7=5%}>=0 && ${8=25%}>=0 && ${9=15%}>=0" e[^-1] "Input 3D arrow, from (${1-3}) to (${4-6}), with radius $7, head length $8 and head radius $9." - v - # Create 3D object. L={sqrt(($4-$1)^2+($5-$2)^2+($6-$3)^2)} @@ -13428,47 +17176,57 @@ # Rotate and translate the arrow at specified coordinates. s3d.. r[-5] 3,{-5,h/3},1,1,-1 m*[-5,-1] y[-4] a[-6--1] y +3d. ${1-3} rv3d. - v + -#@cli axes3d : _size_x,_size_y,_size_z,_font_size>0,_label_x,_label_y,_label_z +#@cli axes3d : _size_x,_size_y,_size_z,_font_size>0,_label_x,_label_y,_label_z,_is_origin={ 0=no | 1=yes } #@cli : Input 3D axes with specified sizes along the x,y and z orientations. -#@cli : Default values: 'size_x=size_y=size_z=1', 'font_size=23', 'label_x=X', 'label_y=Y' and 'label_z=Z'. +#@cli : Default values: 'size_x=size_y=size_z=1', 'font_size=23', 'label_x=X', 'label_y=Y', 'label_z=Z' and \ +# 'is_origin=1' #@cli : $ axes3d , -axes3d : check ${4=23}>0 skip ${1=1},${2=$1},${3=$2},"${5=X},${6=Y},${7=Z}" +axes3d : check "${4=23}>0 && isbool(${8=1})" skip ${1=1},${2=$1},${3=$2},"${5=X},${6=Y},${7=Z}" e[^-1] "Input 3D axes with sizes ($1,$2,$3)." - v - l[] + l[] m={max(abs($1),abs($2),abs($3))/40} m2={2*$m} m3={1.2*$m2} - _axes3d "O",$4 -3d. $m3,$m3,$m3 + if $1 line3d 0,0,0,$1,0,0 fi + if $2 line3d 0,0,0,0,$2,0 fi + if $3 line3d 0,0,0,0,0,$3 fi if $1 - line3d 0,0,0,$1,0,0 cone3d $m,{2*$m},16 r3d. 0,1,0,90 +3d. {$1-$m2},0,0 _axes3d "$5",$4 +3d. {$1+$m3},0,0 fi if $2 - line3d 0,0,0,0,$2,0 cone3d $m,{2*$m},16 r3d. 1,0,0,-90 +3d. 0,{$2-$m2},0 _axes3d "$6",$4 +3d. 0,{$2+$m3},0 fi if $3 - line3d 0,0,0,0,0,$3 cone3d $m,{2*$m},16 +3d. 0,0,{$3-$m2} _axes3d "$7",$4 +3d. 0,0,{$3+$m3} fi + if $8 _axes3d "O",$4 -3d. $m3,$m3,$m3 fi +3d nm [3d\ axes] - endl v + + endl _axes3d : 0 t. "$1",2,0,$2,1,1 +dilate. 3 *.. 255 r.. 100%,100%,1,3 i... (67.5;73.5;109.5;103.5;51.5;100.5;1;1;0;0;0;1;0;-128;{w};{h};3) i.. (-128;{w};{h};1) y[-3,-1] a[-4--1] y +#@cli boundingbox3d +#@cli : Replace selected 3D objects by their 3D bounding boxes. +#@cli : $ torus3d 100,30 +boundingbox3d +3d[-1] [-2] +boundingbox3d : + e[^-1] "Replace 3D object$? by their 3D bounding boxes." + repeat $! l[$>] + nbv={f2ui(i[6])} rows 8,{8+3*$nbv} r. 3,$nbv,1,1,-1 s. x + xc,yc,zc,sx,sy,sz={"[ (im#0 + iM#0)/2, (im#1 + iM#1)/2, (im#2 + iM#2)/2, iM#0 - im#0,iM#1 - im#1, iM#2 - im#2 ]"} + rm box3d $sx,$sy,$sz c3d +3d $xc,$yc,$zc p3d. 1 + endl done + #@cli box3d : _size_x,_size_y,_size_z #@cli : Input 3D box at (0,0,0), with specified geometry. #@cli : Default values: 'size_x=1' and 'size_z=size_y=size_x'. #@cli : $ box3d 100,40,30 +primitives3d 1 color3d[-2] ${-RGB} box3d : skip ${1=1},${2=$1},${3=$2} e[^-1] "Input 3D box, with size ($1,$2,$3)." - v - 1,86,1,1,\ 67.5,73.5,109.5,103.5,51.5,100.5,8,6,\ 0,0,0,$1,0,0,$1,$2,0,0,$2,0,\ @@ -13477,7 +17235,6 @@ 200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,200,\ 1,1,1,1,1,1 nm. [3D\ box] - v + #@cli c3d : eq. to 'center3d'. c3d : @@ -13486,19 +17243,20 @@ #@cli center3d #@cli : Center selected 3D objects at (0,0,0). #@cli : (eq. to 'c3d'). -#@cli : $ repeat 100 circle3d {u(100)},{u(100)},{u(100)},2 done add3d color3d[-1] 255,0,0 +center3d color3d[-1] 0,255,0 add3d +#@cli : $ repeat 100 circle3d {u(100)},{u(100)},{u(100)},2 done add3d color3d[-1] 255,0,0 +center3d \ +# color3d[-1] 0,255,0 add3d center3d : _$0 _center3d : e[0--3] "Center 3D object$?." - v - check3d 0 repeat $! l[$>] - if {i[6]} + check3d 0 repeat $! l[$>] + if i[6] s3d r[2] 3,{2,h/3},1,1,-1 s[2] x -[2] {2,(iM+im)/2} -[3] {3,(iM+im)/2} -[4] {4,(iM+im)/2} a[2-4] x y[2] a y fi - endl done v + + endl done #@cli circle3d : _x0,_y0,_z0,_radius>=0 #@cli : Input 3D circle at specified coordinates. @@ -13506,7 +17264,6 @@ #@cli : $ repeat 500 a={$>*pi/250} circle3d {cos(3*$a)},{sin(2*$a)},0,{$a/50} color3d[-1] ${-RGB},0.4 done add3d circle3d : skip ${1=0},${2=0},${3=0},${4=1} e[^-1] "Input 3D circle at position ($1,$2,$3) with radius $4." - v - r={$4/sqrt(3)} 1,24,1,1,\ 67.5,73.5,109.5,103.5,51.5,100.5,2,1,\ @@ -13514,25 +17271,21 @@ {$1+$r},{$2+$r},{$3+$r},\ 5,0,1,0,0,0,200,200,200,1 nm. [3D\ circle] - v + -#@cli circles3d : _radius>=0,_is_filled={ 0 | 1 } +#@cli circles3d : _radius>=0,_is_wireframe={ 0 | 1 } #@cli : Convert specified 3D objects to sets of 3D circles with specified radius. -#@cli : Default values: 'radius=1' and 'is_filled=1'. +#@cli : Default values: 'radius=1' and 'is_wireframe=1'. #@cli : $ image.jpg luminance resize2dy 40 threshold 50% * 255 pointcloud3d color3d[-1] 255,255,255 circles3d 0.7 -circles3d : check ${1=1}>=0 skip ${2=1} - e[^-1] "Convert 3D object$? to sets of 3D "${arg\ 1+$2,wireframe,filled}" circles with radius $1." - v - p3d 0 repeat $! l[$>] - nbv={@6} nbp={@7} - if {$nbv&&$nbp} - -3d {$1/2},0,0 ++3d $1,0,0 +3d nbp2={@7} - s3d =[1] $nbp,0,1 - r[3] 2,$nbp2,1,1,-1 columns[3] 1,1 s[3] y,2 i[3] 1,$nbp,1,1,5 - i[6] 1,$nbp,1,1,{!$2} a[3-6] x columns[3] 0,5 - y[3] - rows[4] 0,{3*$nbp-1} rows[5] 0,{$nbp-1} a y - fi - endl done v + +circles3d : check "${1=1}>=0 && isbool(${2=0})" + e[^-1] "Convert 3D object$? to sets of 3D "${arg\ 1+$2,filled,wireframe}" circles with radius $1." + p3d 0 repeat $! l[$>] + -3d {$1/2},0,0 ++3d $1,0,0 +3d[1] [0] + s3d # Two 3d objects decomposed here! + rows[7] 0 j[1] [7] # Number of points + rv[2,8] # Points + rv[3,9] l[3] r 2,{h/2},1,1,-1 z 1,1 s y,2 i[0] 1,100%,1,1,5 1,100%,1,1,$2 2,100% a x y endl # Primitives + k[0-5] a y + endl done #@cli col3d : eq. to 'color3d'. : (+) @@ -13547,7 +17300,6 @@ #@cli : $ colorcube3d mode3d 2 +primitives3d 1 colorcube3d : e[^-1] "Input 3D RGB-color cube." - v - (67.5;73.5;109.5;103.5;51.5;100.5;8;6) (0;0;0;\ 255;0;0;\ @@ -13572,7 +17324,6 @@ r[-6--1] 64,64,1,3,3 round[-6--1] y[-6--1] i[-7--2] (-128;64;64;3) (1;1;1;1;1;1) a[-16--1] y nm. [3D\ colorcube] - v + #@cli cone3d : _radius,_height,_nb_subdivisions>0 #@cli : Input 3D cone at (0,0,0), with specified geometry. @@ -13580,7 +17331,6 @@ #@cli : $ cone3d 10,40 +primitives3d 1 color3d[-2] ${-RGB} cone3d : check ${3=24}>0 skip ${1=1},${2=1} e[^-1] "Input 3D cone, with radius $1, height $2 and $3 subdivisions." - v - # Header. (67.5;73.5;109.5;103.5;51.5;100.5) ({$3+2};{2*$3}) @@ -13599,7 +17349,6 @@ 3,{h},1,1,200 1,{h},1,1,1 y[-4--2] a[-6--1] y nm. [3D\ cone] - v + #@cli cubes3d : _size>=0 #@cli : Convert specified 3D objects to sets of 3D cubes with specified size. @@ -13607,9 +17356,9 @@ #@cli : $ image.jpg luminance resize2dy 40 threshold 50% * 255 pointcloud3d color3d[-1] 255,255,255 cubes3d 1 cubes3d : check ${1=1}>=0 e[^-1] "Convert 3D object$? to sets of 3D cubes with size $1." - v - p3d 0 repeat $! l[$>] + p3d 0 repeat $! l[$>] nbv={@6} nbp={@7} - if {$nbv&&$nbp} + if $nbv&&$nbp s3d l[1] = {8*i[0]} = {6*i[1]},0,1 endl # Header. l[2] r 3,{h/3},1,1,-1 # Vertices. @@ -13625,21 +17374,20 @@ l[4] r 3,{h/3},1,1,-1 r 18,100%,1,1,0,2 endl r[5] 6,100% # Colors & opacities. y a y fi - endl done v + + endl done #@cli cup3d : _resolution>0 #@cli : Input 3D cup object. +#@cli : Default value: 'resolution=128'. #@cli : $ cup3d , cup3d : check ${1=128}>0 e[^-1] "Input 3D cup, with resolution $1." - v - 100,200 ellipse. 0%,0%,40%,40%,0,1,1 ellipse. 0,0,35%,35%,0,1,0 polygon. 4,0,45%,8%,45%,20%,90%,0,90%,1,1 ellipse. 0%,100%,30%,10%,0,1,1 b. 0.1% lathe3d. $1,2 nm. [3D\ cup] - v + #@cli cylinder3d : _radius,_height,_nb_subdivisions>0 #@cli : Input 3D cylinder at (0,0,0), with specified geometry. @@ -13647,37 +17395,27 @@ #@cli : $ cylinder3d 10,40 +primitives3d 1 color3d[-2] ${-RGB} cylinder3d : check ${3=24}>0 skip ${1=1},${2=1} e[^-1] "Input 3D cylinder, with radius $1, height $2 and $3 subdivisions." - v - - # Header. - (67.5;73.5;109.5;103.5;51.5;100.5) - ({2*$3+2};{3*$3}) - - # Vertices. - (0,0,0;0,0,$2) - (0;{2*pi}) r. 1,{$3+1},1,1,3 rows. 0,{$3-1} +sin. cos.. *[-2,-1] $1 a[-2,-1] x - +z. 0,2 1,$3,1,1,$2 a[-3,-1] x - a[-3--1] y - - # Primitives. - 1,$3,1,1,'y' +shift. 0,-1 +[-2,-1] 2 - 2,$3,1,1,3,1 ... ... a[-3--1] x - 2,$3,1,1,3,0 ... [-5] +[-2,-1] $3 a[-3--1] x - ++[-4,-3] $3 i[-7] 1,$3,1,1,4 rv[-6,-5] a[-7--5,-2,-1] x - - # Colors / opacities. - 3,{3*$3},1,1,200 - 1,{h},1,1,1 - y[-6--2] a[-8--1] y nm. [3D\ cylinder] - v + + l[] + N={round($3)} + nbv,nbp={[2*$N+2,3*$N]} + ({0.5+[{'CImg3d'}]}) + ($nbv,$nbp) + 1,$nbv,1,3,"Z = (y<="$N"?0:$2); ang = ((y%("$N"+1))-1)*2*pi/"$N"; + !(y%("$N"+1))?[0,0,Z]:[$1*cos(ang),$1*sin(ang),Z]" + 1,$N,1,13,"i1 = 1 + y; i2 = 1 + (i1%"$N"); const j0 = "$N" + 1; j1 = j0 + i1; j2 = j0 + i2; + [ 3,0,i2,i1, 3,j0,j1,j2, 4,i1,i2,j2,j1 ]" + permute[^0,1] "cyzx" 1,$nbp,1,3,200 1,$nbp,1,1,1 y a y + nm. [3D\ cylinder] endl #@cli delaunay3d #@cli : Generate 3D delaunay triangulations from selected images. #@cli : One assumes that the selected input images are binary images containing the set of points to mesh. #@cli : The output 3D object is a mesh composed of non-oriented triangles. -#@cli : $ 500,500 noise 0.05,2 eq 1 * 255 +delaunay3d color3d[1] 255,128,0 dilate_circ[0] 5 to_rgb[0] +object3d[0] [1],0,0,0,1,1 max[-1] [0] +#@cli : $ 500,500 noise 0.05,2 eq 1 * 255 +delaunay3d color3d[1] 255,128,0 dilate_circ[0] 5 to_rgb[0] \ +# +object3d[0] [1],0,0,0,1,1 max[-1] [0] delaunay3d : e[^-1] "Generate 3D delaunay triangulation from image$?." - v - repeat $! l[$>] + repeat $! l[$>] channels 0 != 0 # Label each point separately @@ -13688,7 +17426,7 @@ # Get redondant set of delaunay triangles from the voronoi diagram. r[1] 100%,100%,100%,3 - if {d>1} # Add detection cases for 3D images. + if d>1 # Add detection cases for 3D images. +_delaunay3d[1] 1,0,0,0,0,1 +_delaunay3d[1] -1,0,0,0,0,-1 +_delaunay3d[1] 0,1,0,0,0,1 +_delaunay3d[1] 0,-1,0,0,0,-1 fi @@ -13699,7 +17437,7 @@ pointcloud3d[0] s3d[0] rm[3-5] i.. 1,100%,1,1,3 a[-2,-1] x 3,100%,1,1,200 1,100%,1,1,1 =[1] {h},0,1 y a y - endl done v + + endl done _delaunay3d : f. "A=j($1,$2,$3,0,0,1); B=j($4,$5,$6,0,0,1); @@ -13711,7 +17449,7 @@ #@cli : $ image.jpg distribution3d colorcube3d primitives3d[-1] 1 add3d distribution3d : e[^-1] "Get 3D color distribution of image$?." - v - to_rgb permute "cxyz" y + to_rgb permute "cxyz" y repeat $! l[$>] nbp={round(h/3)} i.. (67.5;73.5;109.5;103.5;51.5;100.5;\ # Magick number for CImg3d. @@ -13720,7 +17458,7 @@ .. # Colors. 1,$nbp,1,1,1 # Opacities. a y nm. [3D\ distribution] # Build 3D object. - endl done v + + endl done #@cli /3d : eq. to 'div3d'. : (+) @@ -13744,14 +17482,15 @@ #@cli : When invoked with (no arg) or 'z-factor', the elevation map is computed as the pointwise L2 norm of the #@cli : pixel values. Otherwise, the elevation map is taken from the specified image or formula. #@cli : $ image.jpg blur 5 elevation3d 0.5 -#@cli : $ 128,128,1,3,u(255) plasma 10,3 blur 4 sharpen 10000 elevation3d[-1] 'X=(x-64)/6;Y=(y-64)/6;-100*exp(-(X^2+Y^2)/30)*abs(cos(X)*sin(Y))' +#@cli : $ 128,128,1,3,u(255) plasma 10,3 blur 4 sharpen 10000 \ +# elevation3d[-1] 'X=(x-64)/6;Y=(y-64)/6;-100*exp(-(X^2+Y^2)/30)*abs(cos(X)*sin(Y))' #@cli empty3d #@cli : Input empty 3D object. #@cli : $ empty3d empty3d : e[^-1] "Input empty 3D object." - v - (67.5;73.5;109.5;103.5;51.5;100.5;0;0) nm. [3D\ empty] v + + (67.5;73.5;109.5;103.5;51.5;100.5;0;0) nm. [3D\ empty] #@cli extrude3d : _depth>0,_resolution>0,_smoothness[%]>=0 #@cli : Generate extruded 3D object from selected binary XY-profiles. @@ -13759,13 +17498,13 @@ #@cli : $ image.jpg threshold 50% extrude3d 16 extrude3d : check "${1=16}>0 && ${2=1024}>0 && ${3=0.5%}>=0" e[^-1] "Generate extruded 3D object from XY-profile$?, with depth $1, resolution $2 and smoothness $3." - v - norm n 0,1 autocrop 0 repeat $! l[$>] nm={0,n} + norm n 0,1 autocrop 0 repeat $! l[$>] nm={0,n} wr={round(max(1,if(w>h,min($2,w),min($2,h)*w/h)))} hr={round(max(1,if(w>h,min($2,w)*h/w,min($2,h))))} fact={$1/max(w/$wr,h/$hr)} b $3,0 r $wr,$hr,1,1,2 expand_xyz 1,0 isosurface3d 50% *3d 1,1,$fact rv3d - nm $nm endl done v + + nm $nm endl done #@cli f3d : eq. to 'focale3d'. : (+) @@ -13782,19 +17521,18 @@ #@cli : $ image.jpg r2dy 32 distribution3d gaussians3d 20 colorcube3d primitives3d[-1] 1 +3d gaussians3d : check "${1=32}>0" skip ${2=0.3} e[^-1] "Convert 3D object$? into sets of gaussian-shaped 3D sprites, with size $1 and opacity $2." - v - p3d 2 p3d 0 repeat $! l[$>] nm={0,n} s3d + p3d 2 p3d 0 repeat $! l[$>] nm={0,n} s3d nbv={h} rm. (-128;$1;$1;1) $1,$1 gaussian. 35%,35%,0 c. 30%,100% n. 0,$2 y. a[-2,-1] y # First opacity is generated. - if {$nbv>1} 4,{$nbv-1},1,1,-128,0,0,0 y[-2,-1] a[-2,-1] y fi # Other ones are shared copies of the first one. + if $nbv>1 4,{$nbv-1},1,1,-128,0,0,0 y[-2,-1] a[-2,-1] y fi # Other ones are shared copies of the first one. a y - nm $nm endl done v + + nm $nm endl done #@cli gmic3d #@cli : Input a 3D G'MIC logo. #@cli : $ gmic3d +primitives3d 1 gmic3d : e[^-1] "Input 3D G\47MIC logo." - v - text3d G,60,20,2 col3d. 16,64,255 text3d \',60,20,2 +3d. 40 col3d. 64,128,255 text3d M,60,20,2 +3d. 50 col3d. 96,196,255 @@ -13808,7 +17546,6 @@ +3d. {80*cos(0.5+1.02*$>*12*pi/180)},{30*sin(0.8+$>*12*pi/180)},{2*$>-60} done +3d[-30--1] +3d. 0,5,30 +3d[-2--1] nm. [3d\ gmic] - v + #@cli gyroid3d : _resolution>0,_zoom #@cli : Input 3D gyroid at (0,0,0), with specified resolution. @@ -13816,7 +17553,6 @@ #@cli : $ gyroid3d 48 +primitives3d 1 gyroid3d : check ${1=32}>0 skip ${2=5} e[^-1] "Input 3D gyroid, with resolution $1 and range $2." - v - isosurface3d "'0.49*(\ cos( 2*x + y + z - pi) + cos( 2*x - y + z - pi)\ + cos(- 2*x + y - z - pi) + cos(- 2*x - y - z - pi)\ @@ -13839,24 +17575,23 @@ + cos( 2*z + 2*x - pi) + cos(- 2*z - 2*x - pi)\ ) - 0.69'",0,{-$2},{-$2},{-$2},$2,$2,$2,$1,$1,$1 c3d. n3d. nm. [3D\ gyroid] - v + #@cli histogram3d #@cli : Get 3D color histogram of selected images. #@cli : $ image.jpg histogram3d colorcube3d primitives3d[-1] 1 add3d histogram3d : e[^-1] "Get 3D color histogram of image$?." - v - to_rgb repeat $! l[$>] + to_rgb repeat $! l[$>] r {w*h},3,1,1,-1 pointcloud 1 n 0,255 map 3 pointcloud3d nm "[3D histogram]" - endl done v + + endl done #@cli image6cube3d #@cli : Generate 3D mapped cubes from 6-sets of selected images. #@cli : $ image.jpg animate flower,"30,0","30,5",6 image6cube3d image6cube3d : e[^-1] "Generate 3D mapped cubes from image$?." - v - M={max(${-max_wh})} r $M,$M,1,3 imageplane3d n3d c3d - repeat {int($!/6)} l[$>-{$>+5}] + M={max(${-max_wh})} r $M,$M,1,3 imageplane3d n3d c3d + repeat int($!/6) l[$>-{$>+5}] +3d[0] 0,0,-0.5 r3d[1] 0,1,0,90 +3d[1] -0.5,0,0 r3d[2] 0,1,0,180 +3d[2] 0,0,0.5 @@ -13864,7 +17599,7 @@ r3d[4] 1,0,0,90 +3d[4] 0,0.5,0 r3d[5] 1,0,0,270 +3d[5] 0,-0.5,0 +3d nm "[3D image cube]" - endl done v + + endl done #@cli imageblocks3d : _maximum_elevation,_smoothness[%]>=0 #@cli : Generate 3D blocks from selected images. @@ -13873,14 +17608,14 @@ #@cli : $ image.jpg resize2dy 32 imageblocks3d -20 mode3d 3 imageblocks3d : check ${2=0}>=0 skip ${1=10},${3=0} e[^-1] "Generate 3D blocks from image$?, with maximum elevation $1 and smoothness $2." - v - repeat $! l[$>] + repeat $! l[$>] w={w} h={h} split_opacity to_rgb[0] is_opacity={$!==2} # Create 3D object template. l[] box3d 1,1,0 - repeat {$w-1} ++3d. 1,0,0 done +3d - repeat {$h-1} ++3d. 0,1,0 done +3d + repeat $w-1 ++3d. 1,0,0 done +3d + repeat $h-1 ++3d. 0,1,0 done +3d endl s3d. @@ -13888,7 +17623,7 @@ +norm[0] b. $2 y. n. 0,$1 r[-5] 24,{-5,round(w*h/24)},1,1,-1 - if {$1<0} j[-5] .,2 j[-5] .,5 j[-5] .,8 j[-5] .,11 + if $1<0 j[-5] .,2 j[-5] .,5 j[-5] .,8 j[-5] .,11 else j[-5] .,14 j[-5] .,17 j[-5] .,20 j[-5] .,23 fi rm. y[-4] @@ -13900,14 +17635,14 @@ if $is_opacity rm. mv[0] $! /. 255 y. r. 6,100%,1,1 y. fi a y - endl done v + + endl done #@cli imagecube3d #@cli : Generate 3D mapped cubes from selected images. #@cli : $ image.jpg imagecube3d imagecube3d : e[^-1] "Generate 3D mapped cubes from image$?." - v - slices 50% to_rgb repeat $! l[$>] nm={0,n} + slices 50% to_rgb repeat $! l[$>] nm={0,n} i.. (67.5;73.5;109.5;103.5;51.5;100.5;\ # Magick number for CImg3d. 8;6;\ # Number of vertices and primitives. -0.5;-0.5;-0.5;\ # Vertex coordinates. @@ -13928,14 +17663,14 @@ y. (-128;0;0;0;-128;0;0;0;-128;0;0;0;-128;0;0;0;-128;0;0;0;1;1;1;1;1;1) # Other faces and opacities. a y - nm $nm endl done v + + nm $nm endl done #@cli imageplane3d #@cli : Generate 3D mapped planes from selected images. #@cli : $ image.jpg imageplane3d imageplane3d : e[^-1] "Generate 3D mapped planes from image$?." - v - slices 50% to_color repeat $! l[$>] nm={0,n} + slices 50% to_color repeat $! l[$>] nm={0,n} i.. (67.5;73.5;109.5;103.5;51.5;100.5;\ # Magick number for CImg3d. 4;1;\ # Number of vertices and primitives. 0;0;0;\ # Vertex coordinates. @@ -13947,14 +17682,14 @@ y. (1) # Opacity. a y - nm $nm endl done v + + nm $nm endl done #@cli imagepyramid3d #@cli : Generate 3D mapped pyramids from selected images. #@cli : $ image.jpg imagepyramid3d imagepyramid3d : e[^-1] "Generate 3D mapped pyramids from image$?." - v - to_rgb repeat $! l[$>] nm={0,n} + to_rgb repeat $! l[$>] nm={0,n} w2={w/2} i.. (67.5;73.5;109.5;103.5;51.5;100.5;\ # Magick number for CImg3d. 5;5;\ # Number of vertices and primitives. @@ -13972,7 +17707,7 @@ y. (-128;0;0;0;-128;0;0;0;-128;0;0;0;-128;0;0;0;1;1;1;1;1) # Other faces and opacities. a y - nm $nm endl done v + + nm $nm endl done #@cli imagerubik3d : _xy_tiles>=1,0<=xy_shift<=100,0<=z_shift<=100 #@cli : Generate 3D mapped rubik's cubes from selected images. @@ -13980,9 +17715,9 @@ #@cli : $ image.jpg imagerubik3d , imagerubik3d : check "${1=3}>=1 && ${2=5}>=0 && $2<=100 && ${3=5}>=0 && $3<=100" e[^-1] "Generate 3D mapped rubik\47s cubes from image$? with $1 xy-tiles, xy-shift $2 and z-shift $3." - v - repeat $! l[$>] nm={0,n} + repeat $! l[$>] nm={0,n} # Generate primary 3D side. - ({'CImg3d'}) +. 0.5 + ('CImg3d') +. 0.5 (8,5) (0,0,0;\ 100,0,0;\ @@ -14000,14 +17735,14 @@ 3,5,1,1,200 1,5,1,1,1 y[-6--1] a[-6--1] y - repeat {$1-1} ++3d. 100 done +3d[-$1--1] # Duplicate along X - repeat {$1-1} ++3d. 0,100 done +3d[-$1--1] # Duplicate along Y + repeat $1-1 ++3d. 100 done +3d[-$1--1] # Duplicate along X + repeat $1-1 ++3d. 0,100 done +3d[-$1--1] # Duplicate along Y t3d. .. rm.. /3d. $1 -3d. 50,50,50 +r3d. 0,1,0,-90 +r3d. 0,1,0,-90 +r3d. 0,1,0,-90 # Generate the 5 other sides. +r3d. 0,0,1,-90 +r3d. 0,0,1,180 +3d - nm $nm endl done v + + nm $nm endl done #@cli imagesphere3d : _resolution1>=3,_resolution2>=3 #@cli : Generate 3D mapped sphere from selected images. @@ -14015,7 +17750,7 @@ #@cli : $ image.jpg imagesphere3d 32,16 imagesphere3d : check "${1=32}>=3 && ${2=16}>=3" e[^-1] "Generate 3D mapped sphere from image$?, with resolutions ($1,$2)." - v - to_rgb repeat $! l[$>] nm={0,n} + to_rgb repeat $! l[$>] nm={0,n} # Generate object header. tw={w-1} th={h-1} # Maximum texture xy-coordinates. @@ -14034,7 +17769,7 @@ repeat $1,v tx0={$v*$tw/$1} tx1={($v+1)*$tw/$1} ty1={$th/($2-1)} (9;0;{2+$v};{2+($v+1)%$1};{$tw/2};0;$tx0;$ty1;$tx1;$ty1) # Textured triangle from 1st pole. - repeat {$2-3},u + repeat $2-3,u ty0=$ty1 ty1={($u+2)*$th/($2-1)} i0={2+$u*$1+$v} i1={2+$u*$1+($v+1)%$1} (12;$i0;{$i0+$1};{$i1+$1};$i1;$tx0;$ty0;$tx0;$ty1;$tx1;$ty1;$tx1;$ty0) # Textured quadrangle. done @@ -14044,7 +17779,7 @@ # Define sphere textures, opacities and generate object. mv[-4] $! i.. (-128;{w};{h};3) y. 1,{4*($nbp-1)},1,1,-128,0,0,0 1,$nbp,1,1,1 a y - nm $nm endl done v + + nm $nm endl done #@cli isoline3d : isovalue[%] : 'formula',value,_x0,_y0,_x1,_y1,_size_x>0[%],_size_y>0[%] : (+) #@cli : Extract 3D isolines with specified value from selected images or from specified formula. @@ -14063,7 +17798,7 @@ #@cli : Default values: 'font_height=13', 'opacity=1' and 'color=255,255,255'. label3d : check ${2=13}>=0 skip ${3=1},${4=255},${5=$4},${6=$5} e[^-1] "Generate 3D label '$1' with font height $2, opacity $3 and color (${4--1})." - v - l[] 0 t "$1",0,0,$2,1,${4--1},255 sprite3d endl v + + l[] 0 t "$1",0,0,$2,1,${4--1},255 sprite3d endl #@cli label_points3d : _label_size>0,_opacity #@cli : Add a numbered label to all vertices of selected 3D objects. @@ -14071,7 +17806,7 @@ #@cli : $ torus3d 100,40,6,6 label_points3d 23,1 mode3d 1 label_points3d : check ${1=13}>0 skip ${2=0.8} e[^-1] "Label vertices of 3D object$?." - v - repeat $! + repeat $! +p3d[$>] 0 l. s3d rm[-3--1] nbp={-2,@0} =.. $nbp,0,1 # Set correct number of primitives (1,0;1,{$nbp-1}) r. 2,$nbp,1,1,3 r. 1,{2*h},1,1,-1 # Create new primitive data @@ -14086,7 +17821,7 @@ a y # Merge final object data. endl +3d[$>,-1] - done v + + done #@cli lathe3d : _resolution>0,_smoothness[%]>=0,_max_angle>=0 #@cli : Generate 3D object from selected binary XY-profiles. @@ -14094,7 +17829,7 @@ #@cli : $ 300,300 rand -1,1 blur 40 sign normalize 0,255 lathe3d , lathe3d : check "${1=128}>0 && ${2=0.5%}>=0 && ${3=361}>=0" e[^-1] "Generate lathed 3D object from XY-profile$?, with resolution $1, smoothness $2 and maximum angle $3 deg." - v - tmax={($3-180)*pi/180} norm n 0,1 autocrop 0 + tmax={($3-180)*pi/180} norm n 0,1 autocrop 0 repeat $! l[$>] wr={max(1,w2=2*w;if(w2>h,min($1,w2),min($1,h)*w2/h))} hr={max(1,w2=2*w;if(w2>h,min($1,w2)*h/w2,min($1,h)))} @@ -14104,7 +17839,7 @@ (0;{{-2,h}-1}) r. $wr,$hr,$wr,1,3 a[-2--1] c warp.. .,0,1,0 rm. expand_xyz 10,0 b $2 isosurface3d 50% rv3d - endl done v + + endl done #@cli l3d : eq. to 'light3d'. : (+) @@ -14119,7 +17854,7 @@ #@cli : $ repeat 100 a={$>*pi/50} line3d 0,0,0,{cos(3*$a)},{sin(2*$a)},0 color3d. ${-RGB} done add3d line3d : e[^-1] "Input 3D line (${1-3})-(${4-6})." - v - 1,21,1,1,67.5,73.5,109.5,103.5,51.5,100.5,2,1,${1-6},2,0,1,200,200,200,1 nm. [3D\ line] v + + 1,21,1,1,67.5,73.5,109.5,103.5,51.5,100.5,2,1,${1-6},2,0,1,200,200,200,1 nm. [3D\ line] #@cli lissajous3d : resolution>1,a,A,b,B,c,C #@cli : Input 3D lissajous curves (x(t)=sin(a*t+A*2*pi),y(t)=sin(b*t+B*2*pi),z(t)=sin(c*t+C*2*pi)). @@ -14127,7 +17862,6 @@ #@cli : $ lissajous3d , lissajous3d : check ${1=1024}>1 skip ${2=2},${3=0},${4=1},${5=0},${6=0},${7=0} e[^-1] "Input 3D lissajous curve, with resolution $1, (a,A)=($2,$3), (b,B)=($4,$5) and (c,C)=($6,$7)." - v - res={round($1)} # Define object header and vertices. @@ -14139,24 +17873,26 @@ # Define object primitives, colors and opacities. 1,{$res-1},1,1,2 (0;{$res-2}) r. 1,{$res-1},1,1,3 ++. 1 a[-3--1] x round. 1 r. 1,{w*h},1,1,-1 1,{3*($res-1)},1,1,200 1,{$res-1},1,1,1 a[-5--1] y nm. [3D\ lissajou] - v + #@cli m3d : eq. to 'mode3d'. : (+) #@cli mode3d : _mode : (+) #@cli : Set static 3D rendering mode. #@cli : (eq. to 'm3d').\n -#@cli : 'mode' can be { -1=bounding-box | 0=dots | 1=wireframe | 2=flat | 3=flat-shaded | 4=gouraud-shaded | 5=phong-shaded }."); +#@cli : 'mode' can be { -1=bounding-box | 0=dots | 1=wireframe | 2=flat | 3=flat-shaded | 4=gouraud-shaded | \ +# 5=phong-shaded }."); #@cli : Bounding-box mode ('mode==-1') is active only for the interactive 3D viewer. #@cli : Default value: 'mode=4'. -#@cli : $ (0,1,2,3,4,5) double3d 0 repeat {w} torus3d 100,30 rotate3d[-1] 1,1,0,60 mode3d {0,@$>} snapshot3d[-1] 300 done remove[0] +#@cli : $ (0,1,2,3,4,5) double3d 0 repeat w torus3d 100,30 rotate3d[-1] 1,1,0,60 mode3d {0,@$>} \ +# snapshot3d[-1] 300 done remove[0] #@cli md3d : eq. to 'moded3d'. : (+) #@cli moded3d : _mode : (+) #@cli : Set dynamic 3D rendering mode for interactive 3D viewer. #@cli : (eq. to 'md3d').\n -#@cli : 'mode' can be { -1=bounding-box | 0=dots | 1=wireframe | 2=flat | 3=flat-shaded | 4=gouraud-shaded | 5=phong-shaded }. +#@cli : 'mode' can be { -1=bounding-box | 0=dots | 1=wireframe | 2=flat | 3=flat-shaded | 4=gouraud-shaded | \ +# 5=phong-shaded }. #@cli : Default value: 'mode=-1'. #@cli *3d : eq. to 'mul3d'. : (+) @@ -14174,19 +17910,20 @@ #@cli normalize3d #@cli : Normalize selected 3D objects to unit size. #@cli : (eq. to 'n3d'). -#@cli : $ repeat 100 circle3d {u(3)},{u(3)},{u(3)},0.1 done add3d color3d[-1] 255,0,0 +normalize3d[-1] color3d[-1] 0,255,0 add3d +#@cli : $ repeat 100 circle3d {u(3)},{u(3)},{u(3)},0.1 done add3d color3d[-1] 255,0,0 +normalize3d[-1] \ +# color3d[-1] 0,255,0 add3d normalize3d : _$0 _normalize3d : e[0--3] "Normalize size of 3D object$?." - v - check3d 0 repeat $! l[$>] - if {i[6]} + check3d 0 repeat $! l[$>] + if i[6] s3d r[2] 3,{2,h/3},1,1,-1 s[2] x factor={v=max({2,iM-im},{3,iM-im},{4,iM-im});if(v,v,1)} a[2-4] x /[2] $factor y[2] a y fi - endl done v + + endl done #@cli o3d : eq. to 'opacity3d'. : (+) @@ -14196,9 +17933,11 @@ #@cli : Default value: 'opacity=1'. #@cli : $ torus3d 100,10 double3d 0 repeat 7 +rotate3d[-1] 1,0,0,20 opacity3d[-1] {u} done add3d -#@cli parametric3d : _x(a,b),_y(a,b),_z(a,b),_amin,_amax,_bmin,_bmax,_res_a>0,_res_b>0,_res_x>0,_res_y>0,_res_z>0,_smoothness>=0,_isovalue>=0 +#@cli parametric3d : _x(a,b),_y(a,b),_z(a,b),_amin,_amax,_bmin,_bmax,_res_a>0,_res_b>0,_res_x>0,_res_y>0,_res_z>0,\ +# _smoothness>=0,_isovalue>=0 #@cli : Input 3D object from specified parametric surface (x(a,b),y(a,b),z(a,b)). -#@cli : Default values: 'x=(2+cos(b))*sin(a)', 'y=(2+cos(b))*cos(a)', 'c=sin(b)', 'amin=-pi', 'amax='pi', 'bmin=-pi', 'bmax='pi', +#@cli : Default values: 'x=(2+cos(b))*sin(a)', 'y=(2+cos(b))*cos(a)', 'c=sin(b)', 'amin=-pi', 'amax='pi', \ +# 'bmin=-pi' and 'bmax='pi', #@cli : 'res_a=512', 'res_b=res_a', 'res_x=64', 'res_y=res_x', 'res_z=res_y', 'smoothness=2%' and 'isovalue=10%'. #@cli : $ parametric3d , parametric3d : skip "${1=(2+cos(b))*sin(a)}","${2=(2+cos(b))*cos(a)}","${3=sin(b)}" @@ -14206,7 +17945,6 @@ check "${8=512}>0 && ${9=$8}>0 && ${10=64}>0 && ${11=$10}>0 && ${12=$11}>0 && \ ${13=2%}>=0 && ${14=10%}>=0" e[^-1] "Input 3D object from parametric surface ($1,$2,$3)." - v - # Compute (x(a,b),y(a,b),z(a,b)) and normalize it. ($4,$5;$4,$5^$6,$6;$7,$7) r. $8,$9,1,2,3 channels. 0,2 f. "a=i(x,y,0,0);b=i(x,y,0,1);if(c==0,$1,if(c==1,$2,$3))" @@ -14219,18 +17957,18 @@ pointcloud. 1 r. $10,$11,$12,1,0 b. $13,0 isosurface3d. $14 c3d. n3d. *3d. {$xmax-$xmin},{$ymax-$ymin},{$zmax-$zmin} nm. [3D\ parametric] - v + #@cli pca_patch3d : _patch_size>0,_M>0,_N>0,_normalize_input={ 0 | 1 },_normalize_output={ 0 | 1 },_lambda_xy #@cli : Get 3D patch-pca representation of selected images. #@cli : The 3D patch-pca is estimated from M patches on the input image, and displayed as a cloud of N 3D points. -#@cli : Default values: 'patch_size=7', 'M=1000', 'N=3000', 'normalize_input=1', 'normalize_output=0', and 'lambda_xy=0'. +#@cli : Default values: 'patch_size=7', 'M=1000', 'N=3000', 'normalize_input=1', 'normalize_output=0', \ +# and 'lambda_xy=0'. #@cli : $ image.jpg pca_patch3d 7 -pca_patch3d : check "isint(${1=7}) && $1>0 && isint(${2=1000}) && $2>0 && isint(${3=3000}) && $3>0" skip ${4=1},${5=0},${6=0} - e[^-1] "Get 3D patch-pca representation"${arg\ 1+($!>1),s,""}" of image$?, from $2 $1x$1 input patches, "\ - "with $3 output patches, input normalization "${arg\ 1+!$4,enabled,disabled}", output normalization "\ +pca_patch3d : check "isint(${1=7}) && $1>0 && isint(${2=1000}) && $2>0 && isint(${3=3000}) && $3>0" + skip ${4=1},${5=0},${6=0} + e[^-1] "Get 3D patch-pca representation"${arg\ 1+($!>1),s,""}" of image$?, from $2 $1x$1 input patches, + with $3 output patches, input normalization "${arg\ 1+!$4,enabled,disabled}", output normalization "\ ${arg\ 1+!$5,enabled,disabled}" and lambda_xy $6." - v - P1={int($1/2)} # Backward half-patch size. P2={$1-$P1-1} # Forward half-patch size. @@ -14264,21 +18002,21 @@ # Generate 3D representation of the projected patch set. +a[2--1] x m*[1,-1] transpose[1] # Vertex coordinates. - rows[2--1] 2,100% # Colors - if {$s!=3} + rows[2--1] 2,100% # Colors + if $s!=3 r[2--1] $1,$1,1,{min(3,$s)},-1 r[2--1] $1,$1,1,3,{if($s!=1,0,1)} y[2--1] fi i[2--2] (-128;$1;$1;3) a[2--1] y - rm[0] # Remove input image (now useless). - i[0] ({'CImg3d'}) # Header. - i[1] ($3;$3) # Geometry. - i[3] 2,$3,1,1,if(x==0,1,y) # Primitives. - 1,$3,1,1,1 # Opacities. - y a[-6--1] y # Merge as a 3D object. + rm[0] # Remove input image (now useless). + i[0] ('CImg3d') # Header. + i[1] ($3;$3) # Geometry. + i[3] 2,$3,1,1,if(x==0,1,y) # Primitives. + 1,$3,1,1,1 # Opacities. + y a[-6--1] y # Merge as a 3D object. - nm $nm endl done v + + nm $nm endl done #@cli plane3d : _size_x,_size_y,_nb_subdivisions_x>0,_nb_subdisivions_y>0 #@cli : Input 3D plane at (0,0,0), with specified geometry. @@ -14286,33 +18024,33 @@ #@cli : $ plane3d 50,30 +primitives3d 1 color3d[-2] ${-RGB} plane3d : check "${3=24}>0 && ${4=24}>0" skip ${1=1},${2=$1} e[^-1] "Input 3D plane, with size (${1,2}) and subdivisions (${3,4})." - v - {$3+1},{$4+1} elevation3d. 0 *3d. {$1/$3},{$2/$4} col3d. 200 nm. [3D\ plane] v + + {$3+1},{$4+1} elevation3d. 0 *3d. {$1/$3},{$2/$4} col3d. 200 nm. [3D\ plane] #@cli point3d : x0,y0,z0 #@cli : Input 3D point at specified coordinates. #@cli : $ repeat 1000 a={$>*pi/500} point3d {cos(3*$a)},{sin(2*$a)},0 color3d[-1] ${-RGB} done add3d point3d : e[^-1] "Input 3D point ($1,$2,$3)." - v - 1,17,1,1,67.5,73.5,109.5,103.5,51.5,100.5,1,1,${1-3},1,0,200,200,200,1 nm. [3D\ point] v + + 1,17,1,1,67.5,73.5,109.5,103.5,51.5,100.5,1,1,${1-3},1,0,200,200,200,1 nm. [3D\ point] #@cli pointcloud3d #@cli : Convert selected planar or volumetric images to 3D point clouds. #@cli : $ image.jpg luminance resize2dy 100 threshold 50% mul 255 pointcloud3d color3d[-1] 255,255,255 pointcloud3d : e[^-1] "Convert image$? to 3D point cloud." - v - repeat $! l[$>] nm={0,n} + repeat $! l[$>] nm={0,n} s z repeat $! l[$>] +norm !=. 0 i.. (1,{w};1,{w}^1,1;{h},{h}) r.. .,.,1,2,3 *[-2,-1] round. permute. cxyz l. s -,0 a y is_points=$! endl if $is_points -. 1 r. 2,{h/2},1,1,-1 permute. cyzx +warp.. .,0,0 rm... - permute.. cyzx i.. 1,{h},1,1,$> a[-3,-2] x # Coordinates. - i... ({'CImg3d'}) i... ({h},{h}) # Header and size. - i.. 1,{h},1,1,1 i.. 1,{h},1,1,y a[-3,-2] x # Primitives. - permute. cyzx # Colors. - if {w==1} r. 3,{h},1,1 - elif {w>3} i.. 4,{h},1,1,-128,1,1,{w} a[-2,-1] x + permute.. cyzx i.. 1,{h},1,1,$> a[-3,-2] x # Coordinates. + i... ('CImg3d') i... ({h},{h}) # Header and size. + i.. 1,{h},1,1,1 i.. 1,{h},1,1,y a[-3,-2] x # Primitives. + permute. cyzx # Colors. + if w==1 r. 3,{h},1,1 + elif w>3 i.. 4,{h},1,1,-128,1,1,{w} a[-2,-1] x else r. 3,{h},1,1,0 fi 1,{h},1,1,1 # Opacities. @@ -14321,21 +18059,22 @@ fi endl done +3d - nm $nm endl done v + + nm $nm endl done #@cli pose3d : p1,...,p12 #@cli : Apply 3D pose matrix to selected 3D objects. -#@cli : $ torus3d 100,20 pose3d 0.152437,1.20666,-0.546366,0,-0.535962,0.559129,1.08531,0,1.21132,0.0955431,0.548966,0,0,0,-206,1 snapshot3d 400 +#@cli : $ torus3d 100,20 pose3d 0.152437,1.20666,-0.546366,0,-0.535962,0.559129,1.08531,0,1.21132,0.0955431,\ +# 0.548966,0,0,0,-206,1 snapshot3d 400 pose3d : e[^-1] "Apply 3D pose matrix [ $1,$2,$3,$4; $5,$6,$7,$8; $9,$10,$11,$12 ] to 3D object$?." - v - repeat $! l[$>] if ${-_is_3d} + repeat $! l[$>] if ${-_is_3d} s3d r[2] 3,{2,h/3},1,1,-1 i[3] 1,{2,h},1,1,1 a[2,3] x i[3] ($1,$5,$9;$2,$6,$10;$3,$7,$11;$4,$8,$12) m*[2,3] r[2] 1,{2,3*h},1,1,-1 a y - else v + error "Command '$0': Image ["{$!-$>-1}"] does not represent a 3D object." - fi endl done v + + else error "Command '$0': Image ["{$!-$>-1}"] does not represent a 3D object." + fi endl done -#@cli p3d : eq. to 'primitives3d'. : (+) +#@cli p3d : eq. to 'primitives3d'. p3d : check "isint($1) && $1>=0 && $1<=2" _primitives3d $* @@ -14349,7 +18088,7 @@ _primitives3d : e[0--3] "Convert primitives of 3D object$? to "${"arg 1+$1,points,outlines,non-textured"}"." - v - repeat $! l[$>] + repeat $! l[$>] s3d 1,64 .x2 eval " const mode = $1; @@ -14385,7 +18124,9 @@ ); A = i[#5,po]; - A==-128?( # Texture + A!=-128?( # Scalar + goto_next?(po+=1); + ):( # Texture W = i[#5,po+1]; H = i[#5,po+2]; S = i[#5,po+3]; WH = W*H; WH?( # Non-shared texture off = po + (ty%H)*W + (tx%W) + 4; @@ -14553,7 +18294,9 @@ ):N==9?( # Textured triangle v0 = i[#3,pp++]; v1 = i[#3,pp++]; v2 = i[#3,pp++]; - tx0 = i[#3,pp++]; ty0 = i[#3,pp++]; tx1 = i[#3,pp++]; ty1 = i[#3,pp++]; tx2 = i[#3,pp++]; ty2 = i[#3,pp++]; + tx0 = i[#3,pp++]; ty0 = i[#3,pp++]; + tx1 = i[#3,pp++]; ty1 = i[#3,pp++]; + tx2 = i[#3,pp++]; ty2 = i[#3,pp++]; mode==0?( get_RGBA(tx0,ty0,0); add_point(v0,R,G,B,A); get_RGBA(tx1,ty1,0); add_point(v1,R,G,B,A); @@ -14576,7 +18319,10 @@ ):N==12?( # Textured quadrangle v0 = i[#3,pp++]; v1 = i[#3,pp++]; v2 = i[#3,pp++]; v3 = i[#3,pp++]; - tx0 = i[#3,pp++]; ty0 = i[#3,pp++]; tx1 = i[#3,pp++]; ty1 = i[#3,pp++]; tx2 = i[#3,pp++]; ty2 = i[#3,pp++]; tx3 = i[#3,pp++]; ty3 = i[#3,pp++]; + tx0 = i[#3,pp++]; ty0 = i[#3,pp++]; + tx1 = i[#3,pp++]; ty1 = i[#3,pp++]; + tx2 = i[#3,pp++]; ty2 = i[#3,pp++]; + tx3 = i[#3,pp++]; ty3 = i[#3,pp++]; mode==0?( get_RGBA(tx0,ty0,0); add_point(v0,R,G,B,A); get_RGBA(tx1,ty1,0); add_point(v1,R,G,B,A); @@ -14607,13 +18353,13 @@ i[#1,1] = nq" rm[3-5] a y - endl done v + + endl done #@cli projections3d : _x[%],_y[%],_z[%],_is_bounding_box={ 0 | 1 } #@cli : Generate 3D xy,xz,yz projection planes from specified volumetric images. projections3d : skip ${1=50%},${2=50%},${3=50%},${4=1} e[^-1] "Generate 3D xy,xz,yz projection planes from image$?." - v - n 0,255 repeat $! l[$>] + n 0,255 repeat $! l[$>] w={w} h={h} d={d} x={if(${is_percent\ $1},$1*w,$1)} y={if(${is_percent\ $2},$2*h,$2)} @@ -14626,14 +18372,13 @@ +3d... 0,0,$z +3d.. 0,$y,0 +3d. $x,0,0 +3d[-3--1] o3d. 0.8 if $4 box3d $w,$h,$d p3d. 1 o3d. 0.4 +3d[-2,-1] fi - endl done v + + endl done #@cli pyramid3d : width,height #@cli : Input 3D pyramid at (0,0,0), with specified geometry. #@cli : $ pyramid3d 100,-100 +primitives3d 1 color3d[-2] ${-RGB} pyramid3d : e[^-1] "Input new 3D pyramid, with width $1 and height $2." - v - (67.5;73.5;109.5;103.5;51.5;100.5;\ # Magick number for CImg3d. 5;5;\ # Number of vertices and primitives. {-$1/2};{-$1/2};{-$2/2};\ # Vertex coordinates. @@ -14647,22 +18392,21 @@ 3;2;4;1;\ 3;3;4;2) 1,15,1,1,200 1,5,1,1,1 a[-3--1] y nm. [3D\ pyramid] - v + #@cli quadrangle3d : x0,y0,z0,x1,y1,z1,x2,y2,z2,x3,y3,z3 #@cli : Input 3D quadrangle at specified coordinates. -#@cli : $ quadrangle3d -10,-10,10,10,-10,10,10,10,10,-10,10,10 repeat 10 +rotate3d[-1] 0,1,0,30 color3d[-1] ${-RGB},0.6 done add3d mode3d 2 +#@cli : $ quadrangle3d -10,-10,10,10,-10,10,10,10,10,-10,10,10 repeat 10 +rotate3d[-1] 0,1,0,30 \ +# color3d[-1] ${-RGB},0.6 done add3d mode3d 2 quadrangle3d : e[^-1] "Input 3D quadrangle ($1,$2,$3)-($4,$5,$6)-($7,$8,$9)-($10,$11,$12)." - v - 1,29,1,1,67.5,73.5,109.5,103.5,51.5,100.5,4,1,${1-12},4,0,1,2,3,200,200,200,1 nm. [3D\ quadrangle] v + + 1,29,1,1,67.5,73.5,109.5,103.5,51.5,100.5,4,1,${1-12},4,0,1,2,3,200,200,200,1 nm. [3D\ quadrangle] #@cli random3d : nb_points>=0 #@cli : Input random 3D point cloud in [0,1]^3. #@cli : $ random3d 100 circles3d 0.1 opacity3d 0.5 random3d : check "$1>=0" e[^-1] "Input random 3D point cloud, with $1 points." - v - - if {$1<0.5} empty3d + if $1<0.5 empty3d else l[] N={round($1)} ({'CImg3d'},$N,$N) @@ -14672,7 +18416,6 @@ y a y endl fi nm. [3D\ random\ pointcloud] - v + #@cli rv3d : eq. to 'reverse3d'. : (+) @@ -14693,18 +18436,22 @@ #@cli : $ rotation3d 1,0,0,0 rotation3d 1,0,0,90 rotation3d 1,0,0,180 rotation3d : e[^-1] "Input 3D rotation matrix around axis ($1,$2,$3) with angle $4 deg." - v - 3,3,1,1,{"rot(${1-4})"} nm. [3D\ rotation] v + + 3,3,1,1,{"rot(${1-4})"} nm. [3D\ rotation] #@cli sierpinski3d : _recursion_level>=0,_width,_height #@cli : Input 3d Sierpinski pyramid. #@cli : $ sierpinski3d 3,100,-100 +primitives3d 1 color3d[-2] ${-RGB} sierpinski3d : check ${1=4}>=0 skip ${2=1},${3=1} -e[^-1] "Input 3D Sierpinski pyramid of degree $1, with width $2 and height $3." - v - l[] _sierpinski3d {-$2/2},{-$2/2},{-$3/2},{$2/2},{-$2/2},{-$3/2},{$2/2},{$2/2},{-$3/2},{-$2/2},{$2/2},{-$3/2},0,0,{$3/2},$1 +3d endl - nm. [3D\ sierpinski] v + + l[] + _sierpinski3d {-$2/2},{-$2/2},{-$3/2},{$2/2},{-$2/2},{-$3/2},\ + {$2/2},{$2/2},{-$3/2},{-$2/2},{$2/2},{-$3/2},\ + 0,0,{$3/2},$1 + +3d endl + nm. [3D\ sierpinski] _sierpinski3d : - if {$16<=0} + if $16<=0 (67.5;73.5;109.5;103.5;51.5;100.5;\ 5;5;\ $1;$2;$3;\ @@ -14753,11 +18500,12 @@ #@cli size3d #@cli : Return bounding box size of the last selected 3D object. size3d : - v - +rows. 8,{8+3*i[6]} r. 3,{h/3},1,1,-1 s. x,3 + +rows. 8,{8+3*i[6]} r. 3,{h/3},1,1,-1 s. x,3 u {-3,iM-im},{-2,iM-im},{iM-im} - rm[-3--1] v + + rm[-3--1] -#@cli skeleton3d : _metric,_frame_type={ 0=squares | 1=diamonds | 2=circles | 3=auto },_skeleton_opacity,_frame_opacity,_is_frame_wireframe={ 0 | 1 } +#@cli skeleton3d : _metric,_frame_type={ 0=squares | 1=diamonds | 2=circles | 3=auto },_skeleton_opacity,\ +# _frame_opacity,_is_frame_wireframe={ 0 | 1 } #@cli : Build 3D skeletal structure object from 2d binary shapes located in selected images. #@cli : 'metric' can be { 0=chebyshev | 1=manhattan | 2=euclidean }. #@cli : Default values: 'metric=2', 'bones_type=3', 'skeleton_opacity=1' and 'frame_opacity=0.1'. @@ -14765,7 +18513,7 @@ skeleton3d : check "isint(${1=2}) && $1>=0 && $1<=2 && isint(${2=3}) && $2>=0 && $2<=3" skip ${3=1},${4=0.1},${5=1} e[^-1] "Build 3D skeletal structure object from image$?, with "${arg\ 1+$1,chebyshev,manhattan,euclidean}" metric, "\ ${arg\ 1+$2,squares,diamonds,circles,auto}" bones, skeleton opacity $3 and frame opacity $4 ." - v - repeat $! l[$>] channels 0 + repeat $! l[$>] channels 0 # Construct skeleton representation. +distance 0,$1 @@ -14779,19 +18527,19 @@ if $n r[2] 3,$n,1,1,-1 r[3] 2,$n,1,1,-1 r[4] 3,$n,1,1,-1 - if {$2==0" || "($2==3" && "$1==0)} # Frame with squares. + if $2==0" || "($2==3" && "$1==0) # Frame with squares. =[1] {4*$n} i[3] [2]x3 +z.. 0,1 z. 0,2 -[2] . +[4] . s. x *.. -1 a[-3--1] x +[3] . -[5,-1] a[2-5] x rm[3] 1,$n,1,1,4 +f. 4*y ++. 1 ++. 1 ++. 1 rv[-3,-1] a[-5--1] x mv. 3 - elif {$2==1" || "($2==3" && "$1==1)} # Frame with diamonds. + elif $2==1" || "($2==3" && "$1==1) # Frame with diamonds. =[1] {4*$n} i[3] [2]x3 +z.. 0,0 z. 0,2 -[2] . +[4] . shift. 1,0 -[3] . +[5,-1] a[2-5] x rm[3] 1,$n,1,1,4 +f. 4*y ++. 1 ++. 1 ++. 1 rv[-3,-1] a[-5--1] x mv. 3 - elif {$2==2" || "($2==3" && "$1==2)} # Frame with circles. + elif $2==2" || "($2==3" && "$1==2) # Frame with circles. =[1] {2*$n} +z[4] 0,0 z. 0,2 ++[2,-1] -[2,-2] a[2,-1] x rm[3] 1,$n,1,1,5 +f. 2*y ++. 1 3,100% a[-4--1] x mv. 3 @@ -14800,7 +18548,7 @@ else rm empty3d fi endl else rm[0] fi +3d - endl done v + + endl done #@cli snapshot3d : _size>0,_zoom>=0,_backgroundR,_backgroundG,_backgroundB,_backgroundA : [background_image],zoom>=0 #@cli : Take 2d snapshots of selected 3D objects. @@ -14811,24 +18559,24 @@ snapshot3d : check "${2=1}>=0" skip ${1=512},${3=""} if ${"is_image_arg $1"} # Background image specified. e[0--3] "Take $1x$1 snapshot$? of 3D object$?, with zoom factor $2 and background image $3." - v - pass$1 0 to_color. - elif {isval($3)} # Background color specified. + pass$1 0 to_color. + elif isnum($3) # Background color specified. e[0--3] "Take $1x$1 snapshot$? of 3D object$?, with zoom factor $2 and background color ${3--1}." - v - (${3--1}) y. c r. $1,$1 to_color. + (${3--1}) y. c r. $1,$1 to_color. else # Default background color. e[0--3] "Take $1x$1 snapshot$? of 3D object$?, with zoom factor $2 and default background." - v - 1,2,1,3,32,64,32,116,64,96 r. $1,$1,1,3,3 + 1,2,1,3,32,64,32,116,64,96 r. $1,$1,1,3,3 fi - repeat {$!-1} . l[$>,-1] - if {$2!=0} c3d[0] n3d[0] *3d[0] {3*min(w,h)*$2/4} fi - if {s>3} # RGBA rendering. + repeat $!-1 . l[$>,-1] + if $2!=0 c3d[0] n3d[0] *3d[0] {3*min(w,h)*$2/4} fi + if s>3 # RGBA rendering. 100%,100%,1,3,-1 j3d. [0],50%,50%,0,1 to_rgba. replace_color. 0,0,-1,-1,-1,255,0,0,0,0 blend[-2,-1] alpha else # RGB rendering. j3d[1] [0],50%,50%,0,1 fi nm[1] {-2,n} rm[0] - endl done rm. v + + endl done rm. #@cli sl3d : eq. to 'specl3d'. : (+) @@ -14836,7 +18584,8 @@ #@cli : Set lightness of 3D specular light. #@cli : (eq. to 'sl3d'). #@cli : Default value: 'value=0.15'. -#@cli : $ (0,0.3,0.6,0.9,1.2) repeat {w} torus3d 100,30 rotate3d[-1] 1,1,0,60 color3d[-1] 255,0,0 specl3d {0,@$>} snapshot3d[-1] 400 done remove[0] +#@cli : $ (0,0.3,0.6,0.9,1.2) repeat w torus3d 100,30 rotate3d[-1] 1,1,0,60 color3d[-1] 255,0,0 specl3d {0,@$>} \ +# snapshot3d[-1] 400 done remove[0] #@cli ss3d : eq. to 'specs3d'. : (+) @@ -14844,7 +18593,8 @@ #@cli : Set shininess of 3D specular light. #@cli : (eq. to 'ss3d'). #@cli : Default value: 'value=0.8'. -#@cli : $ (0,0.3,0.6,0.9,1.2) repeat {w} torus3d 100,30 rotate3d[-1] 1,1,0,60 color3d[-1] 255,0,0 specs3d {0,@$>} snapshot3d[-1] 400 done remove[0] +#@cli : $ (0,0.3,0.6,0.9,1.2) repeat w torus3d 100,30 rotate3d[-1] 1,1,0,60 color3d[-1] 255,0,0 specs3d {0,@$>} \ +# snapshot3d[-1] 400 done remove[0] #@cli sphere3d : radius,_nb_recursions>=0 : (+) #@cli : Input 3D sphere at (0,0,0), with specified geometry. @@ -14857,8 +18607,7 @@ #@cli : $ spherical3d 64 +primitives3d 1 spherical3d : check "${1=64}>=3 && ${2=$1}>=3" skip "${3=abs(1+0.5*cos(3*phi)*sin(4*theta))}" e[^-1] "Input 3D spherical object, with subdivisions ($1,$2) and height function '$3'." - v - - ({'CImg3d'}) y. # Magic number. + ('CImg3d':y) # Magic number. n1={round($1)} n2={round($2)} # Define 3D vertices. @@ -14886,17 +18635,16 @@ # Append as a 3D object. a[-5--1] y nm. "[3D spherical surface '$3']" - v + #@cli spline3d : x0[%],y0[%],z0[%],u0[%],v0[%],w0[%],x1[%],y1[%],z1[%],u1[%],v1[%],w1[%],_nb_vertices>=2 #@cli : Input 3D spline with specified geometry. #@cli : Default values: 'nb_vertices=128'. -#@cli : $ repeat 100 spline3d {u},{u},{u},{u},{u},{u},{u},{u},{u},{u},{u},{u},128 color3d[-1] ${-RGB} done box3d 1 primitives3d[-1] 1 add3d +#@cli : $ repeat 100 spline3d {u},{u},{u},{u},{u},{u},{u},{u},{u},{u},{u},{u},128 color3d[-1] ${-RGB} done \ +# box3d 1 primitives3d[-1] 1 add3d spline3d : check ${13=128}>=2 e[^-1] "Input new 3D spline from (${1-3}) [${4-6}] to (${7-9}) [${10-12}] with $13 vertices." - v - - ({'CImg3d'}) +. 0.5 # Header. - ($13;{$13-1}) # Nb vertices / primitives. + ('CImg3d') +. 0.5 # Header. + ($13;{$13-1}) # Nb vertices / primitives. # Define vertices. 1,$13,1,1,1 (0;1) r. 1,$13,1,1,3 +sqr. +*[-2,-1] a[-4--1] x +*. '$2,$5,{3*(($8)-($2))-2*($5)-($11)},{($5)+($11)+2*(($2)-($8))}' l. s x + endl @@ -14906,7 +18654,6 @@ 1,{$13-1},1,1,2 (0,1;{$13-2},{$13-1}) r. 2,..,1,1,3 round. a[-2,-1] x # Primitives. 1,{3*($13-1)},1,1,200 1,{$13-1},1,1,1 # Colors / opacities. y[-3,-4,-6] a[-6--1] y - v + #@cli s3d : eq. to 'split3d'. : (+) @@ -14924,48 +18671,49 @@ #@cli : $ image.jpg sprite3d sprite3d : e[^-1] "Convert image$? as 3D sprites." - v - repeat $! l[$>] nm={0,n} + repeat $! l[$>] nm={0,n} split_opacity i[0] (67.5;73.5;109.5;103.5;51.5;100.5;1;1;0;0;0;1;0;-128;{w};{h};{0,s}) y[1] - if {$!==2} (1) a y + if $!==2 (1) a y else /. 255 i.. (-128;{w};{h};{s}) y. fi a y - nm $nm endl done v + + nm $nm endl done #@cli sprites3d : [sprite],_sprite_has_alpha_channel={ 0 | 1 } #@cli : Convert selected 3D objects as a sprite cloud. #@cli : Set 'sprite_has_alpha_channel' to 1 to make the last channel of the selected sprite be a transparency mask. #@cli : Default value: 'mask_has_alpha_channel=0'. -#@cli : $ torus3d 100,20 image.jpg resize2dy[-1] 64 100%,100% gaussian[-1] 30%,30% *[-1] 255 append[-2,-1] c +sprites3d[0] [1],1 display_rgba[-2] +#@cli : $ torus3d 100,20 image.jpg resize2dy[-1] 64 100%,100% gaussian[-1] 30%,30% *[-1] 255 append[-2,-1] c \ +# +sprites3d[0] [1],1 display_rgba[-2] sprites3d : check ${is_image_arg\ $1} skip ${2=0} e[^-1] "Convert image$? as 3D sprites clouds, using sprite $1 ("${"arg {1+!$2},with,without"}" alpha-channel)." - v - repeat $! - if {!{$>,i(0,7)}} continue fi # Do nothing if 3D object is empty. + repeat $! + if !{$>,i(0,7)} continue fi # Do nothing if 3D object is empty. pass$1 0 - if {!w} empty3d rv[$>,-1] nm[$>] {n} rm. continue fi + if !w empty3d rv[$>,-1] nm[$>] {n} rm. continue fi l[$>,-1] s3d[0] N={1,@0} =[1] $N,0,1 rm[3-5] i[3] (1,0;1,{$N-1}) r[3] 2,$N,1,1,3 round[3] if $2 # With alpha-channel. - if {s==1} # Only alpha-channel. + if s==1 # Only alpha-channel. i.. 3,$N,1,1,200 /. 255 i.. (-128;{w};{h};1) - if {$N>1} 1,{4*($N-1)},1,1,-128,0,0,0 fi + if $N>1 1,{4*($N-1)},1,1,-128,0,0,0 fi else # Image + alpha. s. c,-{s-1} /. 255 i... (-128;{w};{h};{-2,s}) - if {$N>1} i.. 1,{4*($N-1)},1,1,-128,0,0,0 fi + if $N>1 i.. 1,{4*($N-1)},1,1,-128,0,0,0 fi i.. (-128;{w};{h};1) - if {$N>1} 1,{4*($N-1)},1,1,-128,0,0,0 fi + if $N>1 1,{4*($N-1)},1,1,-128,0,0,0 fi fi else # Without alpha-channel. i.. (-128;{w};{h};{s}) y[-3,-1] - if {$N>1} 1,{4*($N-1)},1,1,-128,0,0,0 fi + if $N>1 1,{4*($N-1)},1,1,-128,0,0,0 fi 1,$N,1,1,1 fi y a y - endl done v + + endl done #@cli star3d : _nb_branches>0,0<=_thickness<=1 #@cli : Input 3D star at (0,0,0), with specified geometry. @@ -14973,19 +18721,19 @@ #@cli : $ star3d , +primitives3d 1 color3d[-2] ${-RGB} star3d : check "${1=5}>0 && ${2=0.38}>=0 && $2<=1" e[^-1] "Input 3D star, with $1 branches and thickness $2." - v - - N={2*$1} ({'CImg3d'}) +. 0.5 ({$N+1};$N) + N={2*$1} ('CImg3d') +. 0.5 ({$N+1};$N) ({-pi/2};{3*pi/2}) r. 1,{$N+1},1,1,3 rows. 0,{h-2} +sin. cos.. a[-2,-1] x (1,1;$2,$2) *[-2,-1] z. 0,2 r. 3,{h+1},1,1,0 (3,$N,1,0;3,$N,$N,{$N-1}) r. 4,$N,1,1,3 round. =. 0,2,100% 3,$N,1,1,200 1,$N,1,1,1 y[-6,-4--2] a[-6--1] y nm. [3D\ star] - v + -#@cli streamline3d : x[%],y[%],z[%],_L>=0,_dl>0,_interpolation,_is_backward={ 0 | 1 },_is_oriented={ 0 | 1 } : 'formula',x,y,z,_L>=0,_dl>0,_interpolation,_is_backward={ 0 | 1 },_is_oriented={ 0 | 1 } : (+) +#@cli streamline3d : x[%],y[%],z[%],_L>=0,_dl>0,_interpolation,_is_backward={ 0 | 1 },_is_oriented={ 0 | 1 } : \ +# 'formula',x,y,z,_L>=0,_dl>0,_interpolation,_is_backward={ 0 | 1 },_is_oriented={ 0 | 1 } : (+) #@cli : Extract 3D streamlines from selected vector fields or from specified formula. #@cli : 'interpolation' can be { 0=nearest integer | 1=1st-order | 2=2nd-order | 3=4th-order }. #@cli : Default values: 'dl=0.1', 'interpolation=2', 'is_backward=0' and 'is_oriented=0'. -#@cli : $ 100,100,100,3 rand -10,10 blur 3 repeat 300 +streamline3d[0] {u(100)},{u(100)},{u(100)},1000,1,1 color3d[-1] ${-RGB} done remove[0] box3d 100 primitives3d[-1] 1 add3d +#@cli : $ 100,100,100,3 rand -10,10 blur 3 repeat 300 +streamline3d[0] {u(100)},{u(100)},{u(100)},1000,1,1 \ +# color3d[-1] ${-RGB} done remove[0] box3d 100 primitives3d[-1] 1 add3d #@cli -3d : eq. to 'sub3d'. : (+) @@ -15001,7 +18749,6 @@ #@cli : $ superformula3d , superformula3d : check "${1=1024}>1 && ${2=8}>=1" skip ${3=1},${4=5},${5=8} e[^-1] "Input 2D superformula curve, with resolution $1, m=$2 and (n1,n2,n3)=($3,$4,$5)." - v - res={round($1)} # Define object header and vertices. @@ -15016,7 +18763,6 @@ # Define object primitives, colors and opacities. 1,{$res-1},1,1,2 (0;{$res-2}) r. 1,{$res-1},1,1,3 ++. 1 a[-3--1] x round. 1 r. 1,{w*h},1,1,-1 1,{3*($res-1)},1,1,200 1,{$res-1},1,1,1 a[-5--1] y nm. [3D\ superformula] - v + #@cli tensors3d : _radius_factor>=0,_shape={ 0=box | >=N=ellipsoid },_radius_min>=0 #@cli : Generate 3D tensor fields from selected images. @@ -15025,16 +18771,16 @@ #@cli : $ 6,6,6,9,"U = [x,y,z] - [w,h,d]/2; U/=norm(U); mul(U,U,3) + 0.3*eye(3)" tensors3d 0.8 tensors3d : check "${1=1}>=0 && isint(${2=2}) && $2>=0 && ${3=0.05}>=0" e[^-1] "Generate 3D tensor field(s) from image$?, with radius factor $1, "\ - ${"v - if $2 u ellipsoid else u box fi v +"}" shape and radius min $3." - v - repeat $! l[$>] + ${"if $2 u ellipsoid else u box fi"}" shape and radius min $3." + repeat $! l[$>] # Check input image format. - if {s==1} 100%,100%,100%,6,"[i#0,0,0,i#0,0,i#0]" k. - elif {s==3} 100%,100%,100%,6,"[R#0,G#0,0,B#0,0,0]" k. - elif {s==4} 100%,100%,100%,6,"[R#0,G#0,0,A#0,0,0]" k. - elif {s==9} 100%,100%,100%,6,"I=I#0;[I[0],I[1],I[2],I[4],I[5],I[8]]" k. + if s==1 100%,100%,100%,6,"[i#0,0,0,i#0,0,i#0]" k. + elif s==3 100%,100%,100%,6,"[R#0,G#0,0,B#0,0,0]" k. + elif s==4 100%,100%,100%,6,"[R#0,G#0,0,A#0,0,0]" k. + elif s==9 100%,100%,100%,6,"I=I#0;[I[0],I[1],I[2],I[4],I[5],I[8]]" k. fi - if {s!=6} error[0--4] "Command '$0': Image '"{n}"' has an invalid size (spectrum="{s}")." fi + if s!=6 error[0--4] "Command '$0': Image '"{n}"' has an invalid size (spectrum="{s}")." fi # Estimate eigenvalues/eigenvectors. 100%,100%,100%,12," @@ -15070,19 +18816,19 @@ R = eig[3,9]; anisotropy = sqrt(((L[0] - L[1])^2 + (L[1] - L[2])^2 + (L[2] - L[0])^2)/(2*(L[0]^2 + L[1]^2 + L[2]^2))); - pts = crop(#ind,0,8,0,0,1,3*N,1,1); + ref(crop(#ind,0,8,0,0,1,3*N,1,1),pts); pts *= resize(L,size(pts),0,2); pts = mul(pts,R,3); pts += resize([x,y,z],size(pts),0,2); draw(#ind,pts,0,8,0,0,1,size(pts),1,1); - col0 = cut(255*anisotropy*abs([ R[0],R[1],R[2] ]) + (1-anisotropy)*200,0,255); + col0 = cut(255*anisotropy*abs([ R[0],R[1],R[2] ]) + (1 - anisotropy)*200,0,255); col = resize(col0,3*P,0,2); const off = siz - 4*P; draw(#ind,col,0,off,0,0,1,size(col),1,1); 0); I" rm[0] +3d - endl done v + + endl done #@cli text_pointcloud3d : _"text1",_"text2",_smoothness #@cli : Input 3D text pointcloud from the two specified strings. @@ -15090,7 +18836,6 @@ #@cli : $ text_pointcloud3d "G'MIC","Rocks!" text_pointcloud3d : skip "${1=text1}","${2=text2}",${3=1} e[^-1] "Input 3D pointcloud text object from strings '$1' and '$2', with smoothness $3." - v - 0 t. "$1",0,0,53,1,1 0 t. "$2",0,0,53,1,1 mirror. y autocrop[-2,-1] 0 @@ -15108,7 +18853,7 @@ -|[-2,-1] b. $3 isosurface3d. 25% - c3d. n3d. nm. "[3D text pointcloud]" v + + c3d. n3d. nm. "[3D text pointcloud]" #@cli text3d : text,_font_height>0,_depth>0,_smoothness #@cli : Input a 3D text object from specified text. @@ -15116,16 +18861,16 @@ #@cli : $ text3d "G'MIC as a\n3D logo!" text3d : skip ${2=53},${3=10},${4=1.5} e[^-1] "Input 3D text object '$1' with size $2, depth $3 and smoothness $4." - v - 0 t. "$1",0,0,$2,1,1 autocrop. 0 r. 100%,100%,$3 expand_xyz. 10,0 - b. $4 isosurface3d. 40% rv3d. nm. "[3D text '$1']" v + + 0 t. "$1",0,0,$2,1,1 autocrop. 0 r. 100%,100%,$3 expand_xyz. 10,0 + b. $4 isosurface3d. 40% rv3d. nm. "[3D text '$1']" #@cli t3d : eq. to 'texturize3d'. t3d : check ${"is_image_arg $1"}" && (!narg(${2=}) || "${"is_image_arg $2"}")" - e[^-1] "Texturize 3D object$? with texture $1"${"v - if {narg($2)} u \" and texture coordinates $2\" else u \"\" fi v +"}"." - v - pass$1 0 slices. 0 if {s==1} to_rgb. else channels. 0,2 fi - if {narg($2)} pass$2 else 0 fi - _texturize3d - v + + e[^-1] "Texturize 3D object$? with texture $1"\ + ${"if narg($2) u \" and texture coordinates $2\" else u \"\" fi"}"." + pass$1 0 slices. 0 if s==1 to_rgb. else channels. 0,2 fi + if narg($2) pass$2 else 0 fi + v + _texturize3d #@cli texturize3d : [ind_texture],_[ind_coords] #@cli : Texturize selected 3D objects with specified texture and coordinates. @@ -15134,25 +18879,28 @@ #@cli : Default value: 'ind_coords=(undefined)'. #@cli : $ image.jpg torus3d 100,30 texturize3d[-1] [-2] keep[-1] texturize3d : check ${"is_image_arg $1"}" && (!narg(${2=}) || "${"is_image_arg $2"}")" - e[^-1] "Texturize 3D object$? with texture $1"${"v - if {narg($2)} u \" and texture coordinates $2\" else u \"\" fi v +"}"." - v - pass$1 0 slices. 0 if {s==1} to_rgb. else channels. 0,2 fi - if {narg($2)} pass$2 else 0 fi - _$0 - v + + e[^-1] "Texturize 3D object$? with texture $1"\ + ${"if narg($2) u \" and texture coordinates $2\" else u \"\" fi"}"." + pass$1 0 slices. 0 if s==1 to_rgb. else channels. 0,2 fi + if narg($2) pass$2 else 0 fi + v + _$0 _texturize3d : - repeat {$!-2} l[$>,-2,-1] + repeat $!-2 l[$>,-2,-1] + np={f2ui(i[7])} s3d[0] # Retrieve texture coordinates for each vertex. - if {!w} + if !w +r[2] 3,{2,round(h/3)},1,1,-1 s. x,3 rm. n.. 0,{6,w-1} n. 0,{6,h-1} a[-2,-1] x mv. -2 fi # Texturize 3D object - np={1,i[1]} 1,{2*$np} 1,{3*$np} 1,$np,1,1,1 + 1,{5,2*h} + 1,{5,3*h} + 1,{5,h},1,1,1 eval " add_material() = ( ind_tex>=0?( # Shared texture @@ -15216,7 +18964,7 @@ resize(#-2,1,qc,1,1,0,0)" rm[3-5] mv[-3--1] 3 - if {!w} rm.. fi + if !w rm.. fi a[0-5] y endl done rm[-2,-1] @@ -15226,7 +18974,6 @@ #@cli : $ torus3d 10,3 +primitives3d 1 color3d[-2] ${-RGB} torus3d : check "${3=24}>2 && ${4=12}>2" skip ${1=1},${2=0.3} e[^-1] "Input 3D torus, with radii ($1,$2) and subdivisions ($3,$4)." - v - # Header. nbp={$3*$4} 1,8,1,1,67.5,73.5,109.5,103.5,51.5,100.5,$nbp,{$4*$3} @@ -15246,27 +18993,26 @@ # Colors / opacities. 3,{h},1,1,200 1,{h},1,1,1 y[-4--2] a[-5--1] y nm. [3D\ torus] - v + #@cli triangle3d : x0,y0,z0,x1,y1,z1,x2,y2,z2 #@cli : Input 3D triangle at specified coordinates. #@cli : $ repeat 100 a={$>*pi/50} triangle3d 0,0,0,0,0,3,{cos(3*$a)},{sin(2*$a)},0 color3d[-1] ${-RGB} done add3d triangle3d : e[^-1] "Input 3D triangle ($1,$2,$3)-($4,$5,$6)-($7,$8,$9)." - v - 1,25,1,1,67.5,73.5,109.5,103.5,51.5,100.5,3,1,${1-9},3,0,1,2,200,200,200,1 nm. [3D\ triangle] v + + 1,25,1,1,67.5,73.5,109.5,103.5,51.5,100.5,3,1,${1-9},3,0,1,2,200,200,200,1 nm. [3D\ triangle] #@cli volume3d #@cli : Transform selected 3D volumetric images as 3D parallelepipedic objects. #@cli : $ image.jpg animate blur,0,5,30 append z volume3d volume3d : e[^-1] "Transform image$? as 3D parallelepipedic objects." - v - repeat $! l[$>] + repeat $! l[$>] w={w} h={h} d={d} +slices 0 +slices[0] 100% mirror. y +columns[0] 0 +columns[0] 100% permute[-2,-1] zyxc mirror.. x +rows[0] 0 +rows[0] 100% permute[-2,-1] xzyc mirror.. y rm[0] image6cube3d *3d $w,$h,$d - endl done v + + endl done #@cli weird3d : _resolution>0 #@cli : Input 3D weird object at (0,0,0), with specified resolution. @@ -15274,13 +19020,11 @@ #@cli : $ weird3d 48 +primitives3d 1 color3d[-2] ${-RGB} weird3d : skip ${1=32} e[^-1] "Input 3D weird object, with resolution $1." - v - - isosurface3d "'\ - T = 1.61803399;\ - 2 - (cos(x + T*y) + cos(x - T*y) + cos(y + T*z) + cos(y - T*z) + cos(z - T*x) + cos(z + T*x))\ - '",0,-4.7,-4.7,-4.7,4.7,4.7,4.7,$1,$1,$1 + isosurface3d '" + T = 1.61803399; + 2 - (cos(x + T*y) + cos(x - T*y) + cos(y + T*z) + cos(y - T*z) + cos(z - T*x) + cos(z + T*x))"',\ + 0,-4.7,-4.7,-4.7,4.7,4.7,4.7,$1,$1,$1 c3d. n3d. nm. [3D\ weird] - v + #------------------------------- # @@ -15290,96 +19034,89 @@ #@cli ap : eq. to 'apply_parallel'. ap : - v - _gmic_s="$?" v + - _apply_parallel "$*" + _gmic_s="$?" v + _apply_parallel "$*" #@cli apply_parallel : "command" #@cli : Apply specified command on each of the selected images, by parallelizing it for all image of the list. #@cli : (eq. to 'ap'). #@cli : $ image.jpg +mirror x +mirror y apply_parallel "blur 3" apply_parallel : - v - _gmic_s="$?" v + - _$0 "$*" + _gmic_s="$?" v + _$0 "$*" _apply_parallel : e[0--3] "Apply command '$*' on all image"$_gmic_s" in parallel, using "$_cpus" threads." - v - - if {$!" && "narg("$*")} + if $!" && "narg("$*") m "_ap : repeat $! l[$>] $* if $! k[0] else 0 fi endl done" N={min($!,$_cpus)} commands= sep= repeat $N commands=$commands${sep}_ap[$>--1:$N] sep=, done parallel $commands - uncommand _ap + um _ap fi - v + #@cli apc : eq. to 'apply_parallel_channels'. apc : - v - _gmic_s="$?" v + - _apply_parallel_channels "$*" + _gmic_s="$?" v + _apply_parallel_channels "$*" #@cli apply_parallel_channels : "command" -#@cli : Apply specified command on each of the selected images, by parallelizing it for all channel of the images independently. +#@cli : Apply specified command on each of the selected images, by parallelizing it for all channel +#@cli : of the images independently. #@cli : (eq. to 'apc'). #@cli : $ image.jpg apply_parallel_channels "blur 3" apply_parallel_channels : - v - _gmic_s="$?" v + - _$0 "$*" + _gmic_s="$?" v + _$0 "$*" _apply_parallel_channels : e[0--3] "Apply command '$*' on all channels of image"$_gmic_s" in parallel, using "$_cpus" threads." - v - N=$! repeat $N s$>={$>,s} done s c + N=$! repeat $N s$>={$>,s} done s c ap "$1" - repeat $N a[$>-{$>+${s$>}-1}] c done v + + repeat $N a[$>-{$>+${s$>}-1}] c done #@cli apo : eq. to 'apply_parallel_overlap'. apo : check "${2=0}>=0 && isint(${3=0}) && $3>=0" - v - _gmic_s="$?" v + - _apply_parallel_overlap "$1",${2--1} + _gmic_s="$?" v + _apply_parallel_overlap "$1",${2--1} #@cli apply_parallel_overlap : "command",overlap[%],nb_threads={ 0=auto | 1 | 2 | 4 | 8 | 16 } -#@cli : Apply specified command on each of the selected images, by parallelizing it on 'nb_threads' overlapped sub-images. +#@cli : Apply specified command on each of the selected images, by parallelizing it on 'nb_threads' +#@cli : overlapped sub-images. #@cli : (eq. to 'apo').\n #@cli : 'nb_threads' must be a power of 2. #@cli : Default values: 'overlap=0','nb_threads=0'. #@cli : $ image.jpg +apply_parallel_overlap "smooth 500,0,1",1 apply_parallel_overlap : check "${2=0}>=0 && isint(${3=0}) && $3>=0" - v - _gmic_s="$?" v + - _$0 "$1",${2--1} + _gmic_s="$?" v + _$0 "$1",${2--1} _apply_parallel_overlap : check "${2=0}>=0 && isint(${3=0}) && $3>=0" - v - N={if($3,max(1,round($3)),$_cpus)} N={2^int(log2(min(16,$N)))} v + + N={if($3,max(1,round($3)),$_cpus)} N={2^int(log2(min(16,$N)))} e[0--3] "Apply parallelized command '$1' on image"$_gmic_s", with overlap $2 and "$N" threads." - v - __apo_exception="" - m "_check1 : if {$!!=1} rm 0 __apo_exception=\"Command 'apply_parallel_overlap': Specified command '$1' changes the size of the image stack.\" fi" + m "_check1 : if $!!=1 rm 0 __apo_exception=\"Command 'apply_parallel_overlap': Specified command '$1' changes the + size of the image stack.\" fi" repeat $! l[$>] _apply_parallel_overlap$N "$1",$2 endl done - uncommand _check1 - v + + um _check1 _apply_parallel_overlap1 : $1 - if {narg($__apo_exception)} v + error[0--12] $__apo_exception fi + if narg($__apo_exception) error[0--12] $__apo_exception fi _apply_parallel_overlap2 : - if {w>=h} + if w>=h ovx={round(if(${"is_percent $2"},w*$2,$2))} w2={int(w/2)} +z[0] {$w2-$ovx},100% z[0] 0,{$w2+$ovx-1} parallel "l[0] $1 _check1 endl","l[1] $1 _check1 endl" - if {narg($__apo_exception)} v + error[0--12] $__apo_exception fi + if narg($__apo_exception) error[0--12] $__apo_exception fi z[0] 0,{0,w-1-$ovx} z[1] $ovx,100% a x else ovy={round(if(${"is_percent $2"},h*$2,$2))} h2={int(h/2)} +rows[0] {$h2-$ovy},100% rows[0] 0,{$h2+$ovy-1} parallel "l[0] $1 _check1 endl","l[1] $1 _check1 endl" - if {narg($__apo_exception)} v + error[0--12] $__apo_exception fi + if narg($__apo_exception) error[0--12] $__apo_exception fi rows[0] 0,{0,h-1-$ovy} rows[1] $ovy,100% a y fi _apply_parallel_overlap4 : - if {max(w,h)/min(w,h)>=3} + if max(w,h)/min(w,h)>=3 _apply_parallel_overlap2 "_apply_parallel_overlap2 \"$1\",$2",$2 else ovx={round(if(${"is_percent $2"},w*$2,$2))} w2={int(w/2)} @@ -15387,7 +19124,7 @@ +z[0] {$w2-$ovx},0,100%,{$h2+$ovy-1} +z[0] 0,{$h2-$ovy},{$w2+$ovx-1},100% +z[0] {$w2-$ovx},{$h2-$ovy},100%,100% z[0] 0,0,{$w2+$ovx-1},{$h2+$ovy-1} parallel "l[0] $1 _check1 endl","l[1] $1 _check1 endl","l[2] $1 _check1 endl","l[3] $1 _check1 endl" - if {narg($__apo_exception)} v + error[0--12] $__apo_exception fi + if narg($__apo_exception) error[0--12] $__apo_exception fi z[0] 0,0,{0,w-1-$ovx},{0,h-1-$ovy} z[1] $ovx,0,100%,{1,h-1-$ovy} z[2] 0,$ovy,{2,w-1-$ovx},100% z[3] $ovx,$ovy,100%,100% a[0,1] x a[1,2] x a y @@ -15400,22 +19137,25 @@ _apply_parallel_overlap2 "_apply_parallel_overlap8 \"$1\",$2",$2 #@cli at : eq. to 'apply_tiles'. -at : check "${2=10%}>0 && ${3=10%}>0 && ${4=10%}>0 && ${5=0}>=0 && ${6=0}>=0 && ${7=0}>=0 && isint(${8=1}) && $8>=0 && $8<=3" - v - _gmic_s="$?" v + - _apply_tiles "$1",${2--1} - -#@cli apply_tiles : "command",_bloc_width[%]>0,_bloc_height[%]>0,_bloc_depth[%]>0,_overlap_width[%]>=0,_overlap_height[%]>=0,_overlap_depth[%]>=0,_boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror } -#@cli : Apply specified command on each bloc (neighborhood) of the selected images, eventually with overlapping blocs. +at : check "${2=10%}>0 && ${3=10%}>0 && ${4=10%}>0 && ${5=0}>=0 && ${6=0}>=0 && ${7=0}>=0 && + isint(${8=1}) && $8>=0 && $8<=3" + _gmic_s="$?" v + _apply_tiles "$1",${2--1} + +#@cli apply_tiles : "command",_tile_width[%]>0,_tile_height[%]>0,_tile_depth[%]>0,_overlap_width[%]>=0,\ +# _overlap_height[%]>=0,_overlap_depth[%]>=0,_boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror } +#@cli : Apply specified command on each tile (neighborhood) of the selected images, eventually with overlapping tiles. #@cli : (eq. to 'at'). -#@cli : Default values: 'bloc_width=bloc_height=bloc_depth=10%','overlap_width=overlap_height=overlap_depth=0' and 'boundary_conditions=1'. +#@cli : Default values: 'tile_width=tile_height=tile_depth=10%','overlap_width=overlap_height=overlap_depth=0' \ +# and 'boundary_conditions=1'. #@cli : $ image.jpg +equalize[0] 256 +apply_tiles[0] "equalize 256",16,16,1,50%,50% -apply_tiles : check "${2=10%}>0 && ${3=10%}>0 && ${4=10%}>0 && ${5=0}>=0 && ${6=0}>=0 && ${7=0}>=0 && isint(${8=1}) && $8>=0 && $8<=3" - v - _gmic_s="$?" v + - _$0 "$1",${2--1} +apply_tiles : check "${2=10%}>0 && ${3=10%}>0 && ${4=10%}>0 && ${5=0}>=0 && ${6=0}>=0 && ${7=0}>=0 && + isint(${8=1}) && $8>=0 && $8<=3" + _gmic_s="$?" v + _$0 "$1",${2--1} _apply_tiles : - e[0--3] "Apply command '$1' on $2x$3x$4 blocs of image$?, with overlaps ($5,$6,$7) and "${"arg 1+$8,dirichlet,neumann,periodic,mirror"}" boundary conditions." - v - repeat $! l[$>] + e[0--3] "Apply command '$1' on $2x$3x$4 tiles of image$?, with overlaps ($5,$6,$7) and "\ + ${"arg 1+$8,dirichlet,neumann,periodic,mirror"}" boundary conditions." + repeat $! l[$>] bw={cut(round(${"is_percent $2"}?w*$2:$2),1,w)} bh={cut(round(${"is_percent $3"}?h*$3:$3),1,h)} bd={cut(round(${"is_percent $4"}?d*$4:$4),1,d)} @@ -15426,7 +19166,7 @@ sh={cut($bh-$oh,1,$bh)} sd={cut($bd-$od,1,$bd)} 100%,100%,100%,{s+1} # Reconstructed image + weights - if {$ow>0" || "$oh>0" || "$od>0} l[] # Generate gaussian weight in case of overlap + if $ow>0" || "$oh>0" || "$od>0 l[] # Generate gaussian weight in case of overlap $bw,1,1 1,$bh,1 1,1,$bd = 1,50%,50%,50% distance 1 /[0] {0.3*$bw} /[1] {0.3*$bh} /[2] {0.3*$bd} @@ -15436,12 +19176,12 @@ $bw,$bh,$bd,[0] m "__at : $1 k. r "$bw,$bh,$bd,{0,s},0 eval " - mask = crop(#2); + ref(crop(#2),mask); for (z = 0, z0=with specified timeout (in seconds) } #@cli : Apply a command with a timeout. -apply_timeout : - if {!$2} +#@cli : Set variable '$_is_timeout' to '1' if timeout occured, '0' otherwise. +#@cli : Default value: 'timeout=20'. +apply_timeout : check "${2=20}>=0" + if $2<=0 e[0--3] "Apply command '$1' on image$?, with no timeout." - v - $1 v + + $1 + _is_timeout=0 else e[0--3] "Apply command '$1' on image$?, with a timeout of $2 seconds." - v - - l[] ({'$/'}) id={is} rm endl - __done$id=0 __is_timeout$id=0 + l[] ('$/') id={is} rm endl l - parallel "$1 __done"$id"=1",\ - "do if {$|>$2} __is_timeout"$id"=1 error \"\" elif $__done"$id" break fi wait 100 while 1" + +store initial + __done$id=0 __is_timeout$id=0 + parallel "$1 __done"$id"=1",\ + "l[] do if $|-"$|">$2 __is_timeout"$id"=1 error \"\" elif $__done"$id" break fi wait 100 while 1 endl" onfail - v + - if ${__is_timeout$id} v + error[0--5] "Command '$0': Time out ($2 seconds) for command '$1'." - else v + error[0--5] "Command '$0': "${} + rm $initial + _is_timeout=0 + if ${__is_timeout$id} _is_timeout=1 error[0--5] "Command '$0': Time out ($2 seconds) for command '$1'." + else error[0--5] "Command '$0': "${} fi endl - v + fi -#@cli check : expression : (+) -#@cli : Evaluate specified expression and display an error message if evaluated to false. +#@cli check : condition : (+) +#@cli : Evaluate specified condition and display an error message if evaluated to false. #@cli : If 'expression' is not a math expression, it is regarded as a filename and checked if it exists. #@cli check3d : _is_full_check={ 0 | 1 } : (+) @@ -15486,33 +19229,36 @@ #@cli : Full 3D object check is slower but more precise. #@cli : Default value: 'is_full_check=1'. +#@cli check_display +#@cli : Check if a display is available, and throw an error otherwise. +check_display : + if !{*,u} error[0--3] "Command '$0': No display available." fi + #@cli continue : (+) #@cli : Go to end of current 'repeat...done', 'do...while' or 'local...endlocal' block. -#@cli : $ image.jpg repeat 10 blur 1 if {1==1} continue fi deform 10 done +#@cli : $ image.jpg repeat 10 blur 1 if 1==1 continue fi deform 10 done #@cli break : (+) #@cli : Break current 'repeat...done', 'do...while' or 'local...endlocal' block. -#@cli : $ image.jpg repeat 10 blur 1 if {1==1} break fi deform 10 done +#@cli : $ image.jpg repeat 10 blur 1 if 1==1 break fi deform 10 done #@cli do : (+) #@cli : Start a 'do...while' block. -#@cli : $ image.jpg luminance i={ia+2} do set 255,{u(100)}%,{u(100)}% while {ia<$i} +#@cli : $ image.jpg luminance i={ia+2} do set 255,{u(100)}%,{u(100)}% while ia<$i #@cli done : (+) #@cli : End a 'repeat/for...done' block, and go to associated 'repeat/for' position, if iterations remain. -#@cli elif : boolean : filename : (+) +#@cli elif : condition : (+) #@cli : Start a 'elif...[else]...fi' block if previous 'if' was not verified -#@cli : and test if specified boolean is true, or if specified filename exists. -#@cli : 'boolean' can be a float number standing for { 0=false | other=true }. +#@cli : and test if specified condition holds +#@cli : 'condition' is a mathematical expression, whose evaluation is interpreted as { 0=false | other=true }.. #@cli else : (+) #@cli : Execute following commands if previous 'if' or 'elif' conditions failed. -#@cli fi : eq. to 'endif'. : (+) - -#@cli endif : (+) -#@cli : End a 'if...[elif]...[else]...endif' block. +#@cli fi : (+) +#@cli : End a 'if...[elif]...[else]...fi' block. #@cli : (eq. to 'fi').\n #@cli endl : eq. to 'endlocal'. : (+) @@ -15543,13 +19289,12 @@ #@cli for : condition : (+) #@cli : Start a 'for...done' block. -#@cli : $ image.jpg resize2dy 32 400,400,1,3 x=0 for {$x<400} image[1] [0],$x,$x x+=40 done +#@cli : $ image.jpg resize2dy 32 400,400,1,3 x=0 for $x<400 image[1] [0],$x,$x x+=40 done -#@cli if : boolean : filename : (+) -#@cli : Start a 'if...[elif]...[else]...fi' block and test if specified boolean is true, -#@cli : or if specified filename exists. -#@cli : 'boolean' can be a float number standing for { 0=false | other=true }. -#@cli : $ image.jpg if {ia<64} add 50% elif {ia<128} add 25% elif {ia<192} sub 25% else sub 50% fi cut 0,255 +#@cli if : condition : (+) +#@cli : Start a 'if...[elif]...[else]...fi' block and test if specified condition holds. +#@cli : 'condition' is a mathematical expression, whose evaluation is interpreted as { 0=false | other=true }. +#@cli : $ image.jpg if ia<64 add 50% elif ia<128 add 25% elif ia<192 sub 25% else sub 50% fi cut 0,255 #@cli l : eq. to 'local'. : (+) @@ -15560,10 +19305,10 @@ #@cli : $ image.jpg +local repeat 3 deform 20 done endlocal #@cli : $$ -#@cli mutex : indice,_action={ 0=unlock | 1=lock } : (+) +#@cli mutex : index,_action={ 0=unlock | 1=lock } : (+) #@cli : Lock or unlock specified mutex for multi-threaded programming. #@cli : A locked mutex can be unlocked only by the same thread. All mutexes are unlocked by default. -#@cli : 'indice' designates the mutex indice, in [0,255]. +#@cli : 'index' designates the mutex index, in [0,255]. #@cli : Default value: 'action=1'. #@cli noarg : (+) @@ -15586,13 +19331,13 @@ # The implementation below allows to use parallel as a regular command with selections. parallel : skip "${1=},${2=},${3=},${4=},${5=},${6=},${7=},${8=},${9=},${10=},${11=},${12=},${13=},${14=},${15=}" - if {$1==0||$1==1||$1==2} e[0--3] "Execute "{$#-1}" commands '${2--1}' in parallel on image$?." + if $1==0||$1==1||$1==2 e[0--3] "Execute "{$#-1}" commands '${2--1}' in parallel on image$?." else e[0--3] "Execute "$#" commands '$*' in parallel on image$?." fi - v - parallel $"*" v + + parallel $"*" #@cli progress : 0<=value<=100 : -1 : (+) -#@cli : Set the progress indice of the current processing pipeline. +#@cli : Set the progress index of the current processing pipeline. #@cli : This command is useful only when G'MIC is used by an embedding application. #@cli q : eq. to 'quit'. : (+) @@ -15602,7 +19347,8 @@ #@cli : (eq. to 'q'). #@cli repeat : nb_iterations,_variable_name : (+) -#@cli : Start iterations of a 'repeat...done' block. +#@cli : Start 'nb_iterations' iterations of a 'repeat...done' block. +#@cli : 'nb_iterations' is a mathematical expression that will be evaluated. #@cli : $ image.jpg split y repeat $!,n shift[$n] $<,0,0,0,2 done append y #@cli : $ image.jpg mode3d 2 repeat 4 imagecube3d rotate3d 1,1,0,40 snapshot3d 400,1.4 done #@cli : $$ @@ -15611,25 +19357,23 @@ #@cli : Return from current custom command. #@cli rprogress : 0<=value<=100 | -1 | "command",0<=value_min<=100,0<=value_max<=100 -#@cli : Set the progress indice of the current processing pipeline (relatively to +#@cli : Set the progress index of the current processing pipeline (relatively to #@cli : previously defined progress bounds), or call the specified command with #@cli : specified progress bounds. rprogress : skip ${2=""} - v - - if {!narg($_progress_bounds)} _progress_bounds=0,100 fi + if !narg($_progress_bounds) _progress_bounds=0,100 fi m={arg(-2,$_progress_bounds)} M={arg(-1,$_progress_bounds)} - if {$#==2&&!narg($2)} # 1 argument -> Set progress bar. - v + e[0--3] "Set relative progress indice to $1%." v - + if $#==2&&!narg($2) # 1 argument -> Set progress bar. + e[0--3] "Set relative progress index to $1%." progress {if($1<0,-1,min(100,max(0,$m+($M-$m)*$1%)))} - elif {$#==3} # 3 arguments -> Call command with specified bounds. + elif $#==3 # 3 arguments -> Call command with specified bounds. nm={min($2,$-1)} nM={max($2,$-1)} - v + e[0--3] "Call command '$1' with progress bounds ["$nm,$nM"]." v - + e[0--3] "Call command '$1' with progress bounds ["$nm,$nM"]." progress $m _progress_bounds=$_progress_bounds,{$m+$nm*($M-$m)/100},{$m+$nM*($M-$m)/100} # Push new bounds. run "$1" progress $M ($_progress_bounds) _progress_bounds={@0--3} rm. # Pop bounds. - else v + error[0--3] "Command '$0': Invalid argument '$*'." + else error[0--3] "Command '$0': Invalid argument '$*'." fi - v + #@cli run : "G'MIC pipeline" #@cli : Run specified G'MIC pipeline. @@ -15647,10 +19391,9 @@ #@cli : (eq. to 'u'). #@cli : $ image.jpg command "foo : u0=Dark u1=Bright status ${u{ia>=128}}" text_outline ${-foo},2,2,23,2,1,255 -#@cli while : boolean : filename : (+) -#@cli : End a 'do...while' block and go back to associated 'do' -#@cli : if specified boolean is true or if specified filename exists. -#@cli : 'boolean' can be a float number standing for { 0=false | other=true }. +#@cli while : condition : (+) +#@cli : End a 'do...while' block and go back to associated 'do' if specified condition holds. +#@cli : 'condition' is a mathematical expression, whose evaluation is interpreted as { 0=false | other=true }. #---------------------------------- # @@ -15664,8 +19407,8 @@ #@cli : $ image.jpg array 3,2,2 array : check "isint($1) && $1>0 && isint(${2=$1}) && $2>0" skip ${3=0} e[^-1] "Create $1x$2 array from image$?, with expand type $3." - v - r0={100/max($1,$2)} r1={100/min($1,$2)} r2=100 - r ${r$3}%,${r$3}%,1,100%,2 r {$1*100}%,{$2*100}%,1,100%,0,2 v + + r0={100/max($1,$2)} r1={100/min($1,$2)} r2=100 + r ${r$3}%,${r$3}%,1,100%,2 r {$1*100}%,{$2*100}%,1,100%,0,2 #@cli array_fade : M>0,_N>0,0<=_fade_start<=100,0<=_fade_end<=100,_expand_type={0=min | 1=max | 2=all} #@cli : Create MxN array from selected images. @@ -15673,9 +19416,8 @@ #@cli : $ image.jpg array_fade 3,2 array_fade : skip ${2=$1},${3=60},${4=90},${5=1} e[^-1] "Create $1x$2 array of ($3%,$4%) faded tiles from image$?, with expand type $5." - v - repeat $! l[$>] . shift.. {round(w/2)},{round(h/2)},1,1,2 fade_diamond $3,$4 endl done + repeat $! l[$>] . shift.. {round(w/2)},{round(h/2)},1,1,2 fade_diamond $3,$4 endl done array $1,$2,$5 - v + #@cli array_mirror : N>=0,_dir={ 0=x | 1=y | 2=xy | 3=tri-xy },_expand_type={ 0 | 1 } #@cli : Create 2^Nx2^N array from selected images. @@ -15683,19 +19425,19 @@ #@cli : $ image.jpg array_mirror 2 array_mirror : skip ${2=2},${3=0} e[^-1] "Create a 2^$1x2^$1 mirrored-array from image$?, with expand type $2." - v - repeat $1 - if {$3==0} - if {$2>=3} r 33%,33%,100%,100%,2 + repeat $1 + if $3==0 + if $2>=3 r 33%,33%,100%,100%,2 else r 50%,50%,100%,100%,2 fi fi repeat $! l[$>] - if {$2==0} +mirror x a x - elif {$2==1} +mirror y a y - else +mirror x a x +mirror y a y if {$2==3} r 150%,150%,1,100%,0,2,1,1 fi + if $2==0 +mirror x a x + elif $2==1 +mirror y a y + else +mirror x a x +mirror y a y if $2==3 r 150%,150%,1,100%,0,2,1,1 fi fi endl done - done v + + done #@cli array_random : Ms>0,_Ns>0,_Md>0,_Nd>0 #@cli : Create MdxNd array of tiles from selected MsxNs source arrays. @@ -15703,16 +19445,15 @@ #@cli : $ image.jpg +array_random 8,8,15,10 array_random : skip ${2=$1},${3=$1},${4=$2} e[^-1] "Create $3x$4 array of tiles from $1x$2 array$?." - v - repeat $! l[$>] nm={0,n} + repeat $! l[$>] nm={0,n} split_tiles $1,$2 repeat $3 repeat $4 [{u($1*$2-1)}] done done rm[0-{$1*$2-1}] append_tiles $3,$4 - nm $nm endl done v + + nm $nm endl done #@cli frame : eq. to 'frame_xy'. frame : skip ${2=$1}>=0,${3=255},${4=$3},${5=$4},${6=255} - v - _gmic_s="?" v + - _frame_xy ${1--1} + _gmic_s="?" v + _frame_xy ${1--1} #@cli frame_blur : _sharpness>0,_size>=0,_smoothness,_shading,_blur #@cli : Draw RGBA-colored round frame in selected images. @@ -15720,20 +19461,21 @@ #@cli : $ image.jpg frame_blur 3,30,8,10% frame_blur : skip ${1=10},${2=30},${3=0},${4=1},${5=3%} e[^-1] "Draw round frame on image$?, with sharpness $1, size $2, smoothness $3, shading $4 and blur $5." - v - to_rgba repeat $! l[$>] nm={0,n} + to_rgba repeat $! l[$>] nm={0,n} 100%,100%,1,1,"-(abs(x/w-0.5)^$1 + abs(y/h-0.5)^$1)^(1/$1)" >=. $2% if $4 distance. 1 n. 0,1 *. -1 +. 1 ^. {1/$4} fi b. $3 +b.. $5 mv. -3 blend_fade[0,1] . rm. - nm $nm endl done v + + nm $nm endl done -#@cli frame_cube : _depth>=0,_centering_x,_centering_y,_left_side={0=normal | 1=mirror-x | 2=mirror-y | 3=mirror-xy},_right_side,_lower_side,_upper_side +#@cli frame_cube : _depth>=0,_centering_x,_centering_y,_left_side={0=normal | 1=mirror-x | 2=mirror-y | 3=mirror-xy},\ +# _right_side,_lower_side,_upper_side #@cli : Insert 3D frames in selected images. #@cli : Default values: 'depth=1', 'centering_x=centering_y=0' and 'left_side=right_side,lower_side=upper_side=0'. #@cli : $ image.jpg frame_cube , frame_cube : check "${1=1}>=0" skip ${2=0},${3=0},${4=0},${5=0},${6=0},${7=0} e[^-1] "Insert 3D frame in image$?, with depth $1, centering point ($2,$3) and orientations (${4--1})." - v - repeat $! l[$>] nm={0,n} split_opacity - if {$!==2} frame_cube ${1--1} a c # Manage image with alpha-channel. + repeat $! l[$>] nm={0,n} split_opacity + if $!==2 frame_cube ${1--1} a c # Manage image with alpha-channel. else m={max(w,h)} w={w} h={h} s={s} imageplane3d c3d /3d. $w,$h,1 @@ -15753,12 +19495,11 @@ r $w,$h,1,100%,2 fi nm $nm endl done - v + _frame_cube : - if {$1==1} r3d. 0,1,0,180 rv3d. - elif {$1==2} r3d. 1,0,0,180 rv3d. - elif {$1==3} r3d. 0,0,1,180 + if $1==1 r3d. 0,1,0,180 rv3d. + elif $1==2 r3d. 1,0,0,180 rv3d. + elif $1==3 r3d. 0,0,1,180 fi #@cli frame_fuzzy : size_x[%]>=0,_size_y[%]>=0,_fuzzyness>=0,_smoothness[%]>=0,_R,_G,_B,_A @@ -15767,36 +19508,46 @@ #@cli : $ image.jpg frame_fuzzy 20 frame_fuzzy : skip ${2=$1},${3=5},${4=1},${5=255},${6=$5},${7=$6},${8=255} e[^-1] "Draw $1x$2 fuzzy frame on image$?, with fuzzyness $3, smoothness $4 and RGBA color ($5,$6,$7,$8)." - v - to_rgba repeat $! l[$>] + to_rgba repeat $! l[$>] 100%,100%,1,1,1 padx={if(${"is_percent $1"},$1*(w-1)/2,$1)} pady={if(${"is_percent $2"},$2*(h-1)/2,$2)} rectangle. $padx,$pady,{w-1-$padx},{h-1-$pady} spread. $3 b. $4 100%,100%,1,4 fc. ${5-8} j[0] [2],0,0,0,0,1,[1] k[0] - endl done v + + endl done -#@cli frame_painting : _size[%]>=0,0<=_contrast<=1,_profile_smoothness[%]>=0,_R,_G,_B,_vignette_size[%]>=0,_vignette_contrast>=0,_defects_contrast>=0,0<=_defects_density<=100,_defects_size>=0,_defects_smoothness[%]>=0,_serial_number +#@cli frame_painting : _size[%]>=0,0<=_contrast<=1,_profile_smoothness[%]>=0,_R,_G,_B,_vignette_size[%]>=0,\ +# _vignette_contrast>=0,_defects_contrast>=0,0<=_defects_density<=100,_defects_size>=0,_defects_smoothness[%]>=0,\ +# _serial_number #@cli : Add a painting frame to selected images. -#@cli : Default values: 'size=10%', 'contrast=0.4', 'profile_smoothness=6%', 'R=225', 'G=200', 'B=120', 'vignette_size=2%', 'vignette_contrast=400', 'defects_contrast=50', 'defects_density=10', 'defects_size=1', 'defects_smoothness=0.5%' and 'serial_number=123456789'. +#@cli : Default values: 'size=10%', 'contrast=0.4', 'profile_smoothness=6%', 'R=225', 'G=200', 'B=120', \ +# 'vignette_size=2%', 'vignette_contrast=400', 'defects_contrast=50', 'defects_density=10', 'defects_size=1', \ +# 'defects_smoothness=0.5%' and 'serial_number=123456789'. #@cli : $ image.jpg frame_painting , frame_painting : - check "${1=10%}>=0 && ${2=0.4}>=0 && $2<=1 && ${3=6%}>=0 && ${7=2%}>=0 && ${8=400}>=0 && ${9=50}>=0 && ${10=10}>=0 && $10<=100 && ${11=1}>=0 && ${12=0.5%}>=0" + check "${1=10%}>=0 && ${2=0.4}>=0 && $2<=1 && ${3=6%}>=0 && ${7=2%}>=0 && ${8=400}>=0 && ${9=50}>=0 && + ${10=10}>=0 && $10<=100 && ${11=1}>=0 && ${12=0.5%}>=0" skip ${4=225},${5=200},${6=120},${13=123456789} - e[^-1] "Add painting frame to image$?, with size $1, contrast $2, profile smoothness $3, color (${4-6}), vignette size $7, "\ - "vignette strength $8, defects contrast $9, defects density $10, defects size $11, defects smoothness $12 and serial number $13." - if {!$1} return fi - v - repeat $! l[$>] + e[^-1] "Add painting frame to image$?, with size $1, contrast $2, profile smoothness $3, color (${4-6}), + vignette size $7, vignette strength $8, defects contrast $9, defects density $10, defects size $11, + defects smoothness $12 and serial number $13." + if !$1 return fi + repeat $! l[$>] $1,$1 s={max(w,h)} rm. # Determine size of the frame - ({'${dec2bin\ $13}'}) -. {'0'} r. $s # Generate frame profile from serial number + ('${dec2bin\ $13}') -. {'0'} r. $s # Generate frame profile from serial number transpose. b. $3 n. {1-$2},{1+$2} +r. {{-2,w}+2*$s},100%,1,1 # Upper frame +mirror. y # Lower frame mv... $! transpose. r. 100%,{-4,h+2*$s},1,1 # Left frame +mirror. x # Right frame - ...,...,1,1,1 polygon. 3,0,0,{$s-1},{$s-1},0,{$s-1},1,0 polygon. 3,100%,0,{w-$s},100%,100%,100%,1,0 # Upper/lower mask. - ..,..,1,1,1 polygon. 3,1,0,100%,{$s-2},100%,0 polygon. 3,1,100%,100%,{h-$s+1},100%,100%,1,0 # Left/right mask. - _frame_painting[-6--3] ${4-6},${9-12} # Add colors + defects. + ...,...,1,1,1 + polygon. 3,0,0,{$s-1},{$s-1},0,{$s-1},1,0 + polygon. 3,100%,0,{w-$s},100%,100%,100%,1,0 # Upper/lower mask + ..,..,1,1,1 + polygon. 3,1,0,100%,{$s-2},100%,0 + polygon. 3,1,100%,100%,{h-$s+1},100%,100%,1,0 # Left/right mask + _frame_painting[-6--3] ${4-6},${9-12} # Add colors + defects # Build full frame picture. {-7,w+2*$s},{-7,h+2*$s},1,3 @@ -15807,13 +19558,13 @@ ..,..,1,1,-255 r. ..,..,1,1,0,0,0.5,0.5 +. 255 +b. $7 n. 0,$8 max[-2,-1] c. 0,255 # Frame opacity. a[-2--1] c r.. .,.,1,100%,0,0,0.5,0.5 blend alpha # Insert initial image into frame picture. - endl done v + + endl done _frame_painting : # Add color + texture to each frame part. repeat $! l[$>] +*. $2 +*.. $3 *... $1 a[-3--1] c 100%,100% - i=0 do rand. 0,1 remove_pixels. {100-$5}% b. $6 >=. 50% i+=1 while {"m=$5/200;(iam+0.2) && "$i"<10"} + i=0 do rand. 0,1 remove_pixels. {100-$5}% b. $6 >=. 50% i+=1 while "m=$5/200;(iam+0.2) && "$i"<10" b. $7 g. +[-2,-1] n. -$4,$4 +[-2,-1] c. 0,255 endl done @@ -15823,10 +19574,10 @@ #@cli : Default values: 'pattern=0' and 'constrain_size=0'. #@cli : $ image.jpg frame_pattern 8 frame_pattern : check $1>=3 skip ${2=0},${3=} - v - to_colormode 0 + to_colormode 0 if ${"is_image_arg $2"} # Frame from specified image. - v + e[^-1] "Insert $1x$1 pattern frame on image$?, using frame image$2." v - - pass$2 0 repeat {$!-1} l[$>,-1] + e[^-1] "Insert $1x$1 pattern frame on image$?, using frame image$2." + pass$2 0 repeat $!-1 l[$>,-1] wh={0,w},{0,h} +r[1] {0,max(1,w/($1-2))},{0,max(1,h/($1-2))},1,100%,2 r[0] {{0,w}+2*w},{{0,h}+2*h},1,100%,0,0,0.5,0.5 @@ -15835,7 +19586,7 @@ if $3 r[0] $wh,1,100%,2 fi endl done rm. else # Self-frame. - v + e[^-1] "Insert $1x$1 self-pattern frame on image$?." v - + e[^-1] "Insert $1x$1 self-pattern frame on image$?." repeat $! l[$>] wh={w},{h} +r {max(1,w/($1-2))},{max(1,h/($1-2))},1,100%,2 r.. {$1*w},{$1*h},1,100%,0,0,0.5,0.5 @@ -15844,31 +19595,32 @@ if $3 r $wh,1,100%,2 fi endl done fi - v + #@cli frame_round : _sharpness>0,_size>=0,_smoothness,_shading,_R,_G,_B,_A #@cli : Draw RGBA-colored round frame in selected images. #@cli : Default values: 'sharpness=10', 'size=10', 'smoothness=0', 'shading=0' and 'R=G=B=A=255'. #@cli : $ image.jpg frame_round 10 frame_round : skip ${1=10},${2=10},${3=0},${4=0},${5=255},${6=$5},${7=$6},${8=255} - e[^-1] "Draw round frame on image$?, with sharpness $1, size $2, smoothness $3, shading $4 and RGBA color ($5,$6,$7,$8)." - v - to_rgba repeat $! l[$>] nm={0,n} + e[^-1] "Draw round frame on image$?, with sharpness $1, size $2, smoothness $3, shading $4 and + RGBA color ($5,$6,$7,$8)." + to_rgba repeat $! l[$>] nm={0,n} 100%,100%,1,1,"-(abs(x/w-0.5)^$1 + abs(y/h-0.5)^$1)^(1/$1)" >=. $2% if $4 distance. 1 n. 0,1 *. -1 +. 1 ^. {1/$4} fi b. $3 i... 100%,100%,1,4 fc... $5,$6,$7,$8 blend_fade[0,1] . rm. - nm $nm endl done v + + nm $nm endl done -#@cli frame_seamless : frame_size>=0,_patch_size>0,_blend_size>=0,_frame_direction={ 0=inner (preserve image size) | 1=outer } +#@cli frame_seamless : frame_size>=0,_patch_size>0,_blend_size>=0,\ +# _frame_direction={ 0=inner (preserve image size) | 1=outer } #@cli : Insert frame in selected images, so that tiling the resulting image makes less visible seams. #@cli : Default values: 'patch_size=7', 'blend_size=5' and 'frame_direction=1'. #@cli : $ image.jpg +frame_seamless 30 array 2,2 frame_seamless : check "$1>=0 && isint(${2=7}) && $2>0 && isint(${3=5}) && $3>=0" skip ${4=1} - v - s0="inner" s1="outer" - v + e[^-1] "Insert "${s{!!$4}}" seamless frame in image$?, with size $1, patch size $2 and blend size $3." v - + s0="inner" s1="outer" + e[^-1] "Insert "${s{!!$4}}" seamless frame in image$?, with size $1, patch size $2 and blend size $3." repeat $! l[$>] w2={round(w/2)} h2={round(h/2)} w4={round(w/4)} h4={round(h/4)} - if {!$4} r {max(1,w-$1)},{max(1,h-$1)},1,100%,0,0,0.5,0.5 fi + if !$4 r {max(1,w-$1)},{max(1,h-$1)},1,100%,0,0,0.5,0.5 fi 100%,100%,1,1,-1 r[-2,-1] {w+$1},{h+$1},1,100%,0,0,0.5,0.5 n. 0,1 shift -$w2,-$h2,0,0,2 inpaint_matchpatch.. [1],0,$2,10,$3 @@ -15877,7 +19629,7 @@ inpaint_matchpatch.. [1],0,$2,10,$3 rm. shift {$w4+$w2},{$h4+$h2},0,0,2 - endl done v + + endl done #@cli frame_x : size_x[%],_col1,...,_colN #@cli : Insert colored frame along the x-axis in selected images. @@ -15893,8 +19645,7 @@ #@cli : (eq. to 'frame'). #@cli : $ image.jpg frame_xy 1,1,0 frame_xy 20,10,255,0,255 frame_xy : skip ${2=$1},${3=255},${4=$3},${5=$4},${6=255} - v - _gmic_s="$?" v + - _$0 ${1--1} + _gmic_s="$?" v + _$0 ${1--1} _frame_xy : e[0--3] "Insert $1x$2 outer frame in image"$_gmic_s" along the xy-axes, with color (${3--1})." @@ -15916,28 +19667,32 @@ _frame 0,$1,0,${2--1} _frame : - v - repeat $! l[$>] + repeat $! l[$>] nm={0,n} w={round($1*if(${is_percent\ $1},w,1))} h={round($2*if(${is_percent\ $2},h,1))} d={round($3*if(${is_percent\ $3},d,1))} {w+2*$w},{h+2*$h},{d+2*$d},100% fc[1] ${4--1} j[1] [0],$w,$h,$d rm[0] nm $nm - endl done v + + endl done #@cli img2ascii : _charset,_analysis_scale>0,_analysis_smoothness[%]>=0,_synthesis_scale>0,_output_ascii_filename #@cli : Render selected images as binary ascii art. -#@cli : This command returns the corresponding the list of widths and heights (expressed as a number of characters) for each selected image. -#@cli : Default values: 'charset=[ascii charset]', 'analysis_scale=16', 'analysis_smoothness=20%', 'synthesis_scale=16' and '_output_ascii_filename=[undefined]'. +#@cli : This command returns the corresponding the list of widths and heights (expressed as a number of characters) +#@cli : for each selected image. +#@cli : Default values: 'charset=[ascii charset]', 'analysis_scale=16', 'analysis_smoothness=20%', \ +# 'synthesis_scale=16' and '_output_ascii_filename=[undefined]'. #@cli : $ image.jpg img2ascii , -img2ascii : skip "${1= !\042#$%&\047()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\133\\\135^_\140abcdefghijklmnopqrstuvwxyz\173|\174~}","${5=}" check "${2=16}>0 && ${3=20%}>=0 && ${4=16}>0" - e[^-1] "Render image$? as binary ascii art, with charset '$1', analysis scale $2, analysis smoothness $3, synthesis scale $4 and output ascii filename '$5'." - v - +img2ascii : check "${2=16}>0 && ${3=20%}>=0 && ${4=16}>0" + skip "${1= !\042#$%&\047()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\133\\\135^_\140abcdefghijk"\ + "lmnopqrstuvwxyz\173|\174~}","${5=}" + e[^-1] "Render image$? as binary ascii art, with charset '$1', analysis scale $2, analysis smoothness $3, + synthesis scale $4 and output ascii filename '$5'." is_multi={$!>1} - # Generate dictionnaries for image analysis and synthesis. + # Generate dictionaries for image analysis and synthesis. l[] - ({'"$1"'}) repeat {w} + ('"$1"') repeat w C={`92`}${dec2oct\ {0,@$>}} 0 t. $C,0,0,$2,1,1 0 t. $C,0,0,$4,1,1 @@ -15949,33 +19704,33 @@ w={-2,w} h={-2,h} # Transform selected images to ascii art. - repeat {$!-2} l[$>,-2,-1] + repeat $!-2 l[$>,-2,-1] luminance[0] n[0] 0,255 nw={0,round(w/$w,1,1)} nh={0,round(h/$h,1,1)} if $> list_wh=$list_wh,$nw,$nh else list_wh=$nw,$nh fi s[0] y,-$h s[0--3] x,-$w r[0--3] $w,$h,1,1,0,0 - repeat {$!-2} l[$>,-2,-1] + repeat $!-2 l[$>,-2,-1] rprogress {$>*100/($!-2)} r[0] [1] -[0] [1] sqr[0] r[0] 1,1,100%,1,2 y[0] C={0,ym} rm[0] +slices[1] $C mv. 0 - if {narg("$5")} +f[0] $C a[0,-1] c fi + if narg("$5") +f[0] $C a[0,-1] c fi endl done append_tiles[0--2] $nw,$nh - if {narg("$5")} s[0] c l[1] # Export as ascii file. + if narg("$5") s[0] c l[1] # Export as text file. r $nw,$nh,1,1,1 - ({'"$1"'}) map[0] . k[0] - s y i[1-$!] ({'\n'}) + ('"$1"') map[0] . k[0] + s y i[1-$!] ('\n') a x if $is_multi filename=${filename\ "$5",$>} else filename="$5" fi - o raw:$filename,char rm + ot $filename rm endl fi endl done - rm[-2,-1] u $list_wh v + + rm[-2,-1] u $list_wh #@cli imagegrid : M>0,_N>0 #@cli : Create MxN image grid from selected images. @@ -15983,11 +19738,11 @@ #@cli : $ image.jpg imagegrid 16 imagegrid : skip ${2=$1} e[^-1] "Create $1x$2 image grid from image$?." - v - repeat $! l[$>] + repeat $! l[$>] ({w},{h}) ($1,$2) /[-2,-1] round. 1 r.. {^},..,..,2 rm. ({w},{h}) ($1,$2) *[-2,-1] r.. {^},..,..,2 rm. $1,$2,1,.,1 shift. 1,1 r. ..,0,2 * - endl done v + + endl done #@cli imagegrid_hexagonal : _resolution>0,0<=_outline<=1 #@cli : Create hexagonal grids from selected images. @@ -15995,7 +19750,7 @@ #@cli : $ image.jpg imagegrid_hexagonal 24 imagegrid_hexagonal : check "isint(${1=32}) && $1>0 && ${2=0.1}>=0 && $2<=1" e[^-1] "Create hexagonal grid(s) from image$?, with resolution $1 and outline $2." - v - repeat $! l[$>] + repeat $! l[$>] # Generate hexagonal grid. l[] @@ -16022,27 +19777,28 @@ [0],[0] j3d. ..,50%,50%,0,1,2,0,0 rm.. blend shapeaverage0 - endl done v + + endl done -#@cli imagegrid_triangular : pattern_width>=1,_pattern_height>=1,_pattern_type,0<=_outline_opacity<=1,_outline_color1,... +#@cli imagegrid_triangular : pattern_width>=1,_pattern_height>=1,_pattern_type,0<=_outline_opacity<=1,\ +# _outline_color1,... #@cli : Create triangular grids from selected images. #@cli : 'pattern type' can be { 0=horizontal | 1=vertical | 2=crossed | 3=cube | 4=decreasing | 5=increasing }. -#@cli : Default values: 'pattern_width=24', 'pattern_height=pattern_width', 'pattern_type=0', 'outline_opacity=0.1' and 'outline_color1=0'. +#@cli : Default values: 'pattern_width=24', 'pattern_height=pattern_width', 'pattern_type=0', 'outline_opacity=0.1' \ +# and 'outline_color1=0'. #@cli : $ image.jpg imagegrid_triangular 6,10,3,0.5 imagegrid_triangular : check "$1>=1 && ${2=$1}>=1 && isint(${3=0}) && $3>=0 && $3<=5" skip ${4=0},${5=0} - v - s0="horizontal" s1="vertical" s2="crossed" s3="cube" v + + s0="horizontal" s1="vertical" s2="crossed" s3="cube" e[^-1] "Create triangular grid(s) from image$?, with pattern width $1, height $2, pattern type '"${s$3}"', "\ "outline opacity $4 and outline color (${5--1})." - v - # Create triangular patterns and outlines (always square!). M={max($1,$2)} - if {$3==4" || "$3==5} # Decreasing/Increasing. + if $3==4" || "$3==5 # Decreasing/Increasing. $M,$M,1,1,x>y ++. 2 a[-2,-1] x ++. 4 a[-2,-1] y $M,$M,1,1,"!x || !y || x==y" r. 200%,200%,1,1,0,2 a[-2,-1] c - if {$3==5} mirror. y fi - elif {$3==3} # Cube. + if $3==5 mirror. y fi + elif $3==3 # Cube. $M,$M,1,1,x>y 100%,100%,1,1,w-1-x>=y a[-2,-1] x ++. 2 mirror. y a[-2,-1] y ++. 4 =. 4,50%,50% =.. 2 a[-2,-1] x label. 0,0 (2,2,2,0,1,2,1,1,3,3,3,1,1,0) map.. . rm. @@ -16051,11 +19807,11 @@ line. {$M-1},{$M-1},{3*$M-1},{$M-1},1,1 line. {2*$M},0,0,0,1,1 line. {2*$M},0,100%,100%,1,1 line. {2*$M},100%,100%,0,1,1 a[-2,-1] c - elif {$3==2} # Horizontal + vertical. + elif $3==2 # Horizontal + vertical. $M,$M,1,1,x>y ++. 2 mirror. x a[-2,-1] x ++. 4 mirror. y a[-2,-1] y 100%,100%,1,1,"!x || !y || x==int(w/2) || y==int(h/2) || x==y || w-1-x==y" a[-2,-1] c - elif {$3==1} # Vertical. + elif $3==1 # Vertical. $M,$M,1,1,x>y 100%,100%,1,1,w-1-x<=y a[-2,-1] y ++. 2 mirror. x a[-2,-1] x 100%,100%,1,1,"!x || x==int(w/2) || x==y || w-1-x==y" a[-2,-1] c @@ -16066,9 +19822,9 @@ fi # Apply grid on images. - repeat {$!-1} + repeat $!-1 wh={$>,w},{$>,h} - if {$1>$2} r[$>] 100%,{$>,$1*h/$2} elif {$1<$2} r[$>] {$>,$2*w/$1} fi + if $1>$2 r[$>] 100%,{$>,$1*h/$2} elif $1<$2 r[$>] {$>,$2*w/$1} fi +r. [$>],[$>],1,2,0,2,0.5,0.5 s. c blend[$>,-2] shapeaverage @@ -16076,7 +19832,6 @@ r[$>] $wh,1,100%,2 done rm. - v + #@cli linearize_tiles : M>0,_N>0 #@cli : Linearize MxN tiles on selected images. @@ -16084,15 +19839,15 @@ #@cli : $ image.jpg +linearize_tiles 16 linearize_tiles : check "$1>0 && ${2=$1}>0" e[^-1] "Linearize $1x$2 tiles on image$?." - v - repeat $! l[$>] nm={0,n} + repeat $! l[$>] nm={0,n} s={s} split_tiles $1,$2 s c # Split as tiles for all channels. repeat $! l[$>] wh={w},{h} +f x +f. y +f. 1 y a[^0] x solve.. . rm. $wh,1,1,{@0}"*x + "{@1}"*y + "{@2} rm.. endl done - repeat {int($!/$s)} a[-$s--1] c mv. 0 done append_tiles $1,$2 - nm $nm endl done v + + repeat int($!/$s) a[-$s--1] c mv. 0 done append_tiles $1,$2 + nm $nm endl done #@cli map_sprites : _nb_sprites>=1,_allow_rotation={ 0=none | 1=90 deg. | 2=180 deg. } #@cli : Map set of sprites (defined as the 'nb_sprites' latest images of the selection) to other selected images, @@ -16100,21 +19855,21 @@ #@cli : $ image.jpg resize2dy 48 repeat 16 ball {8+2*$>},${-RGB} mul[-1] {(1+$>)/16} done map_sprites 16 map_sprites : check "isint($1) && $1>0 && isint(${2=0}) && $2>=0 && $2<=2" e[^-1] "Map set of $1 sprites to image selection$?." - v - norm[0--{$1+1}] quantize[0--{$1+1}] $1,0,1 + norm[0--{$1+1}] quantize[0--{$1+1}] $1,0,1 slices[-$1--1] 0 r[-$1--1] ${max_wh[-$1--1]},1,100%,0,0,0.5,0.5 - if {$2==1} + if $2==1 N={4*$1} - repeat {$!-$1} *[$>] 4 +rand[$>] 0,3 round. +[$>,-1] done + repeat $!-$1 *[$>] 4 +rand[$>] 0,3 round. +[$>,-1] done repeat $1 l[{1+$<}] +mirror xy +rotate 90 endl done - elif {$2==2} + elif $2==2 N={2*$1} - repeat {$!-$1} *[$>] 2 +rand[$>] 0,1 round. +[$>,-1] done + repeat $!-$1 *[$>] 2 +rand[$>] 0,1 round. +[$>,-1] done repeat $1 l[{1+$<}] +mirror xy endl done else N=$1 fi r[-$N--1] 100%,100%,1,${max_s[-$N--1]} w={w} h={h} a[-$N--1] x r[^-1] ${w}00%,${h}00%,1,1 *[^-1] $w (0,{$w-1};0,{$w-1}^0,0;{$h-1},{$h-1}) r. $w,$h,1,2,3 round. - repeat {$!-2} +r. [$>],[$>],1,2,0,2 r[$>] 100%,100%,1,2,0 +[$>,-1] +warp.. [$>],0,0 rv[$>,-1] rm. done rm[-2,-1] v + + repeat $!-2 +r. [$>],[$>],1,2,0,2 r[$>] 100%,100%,1,2,0 +[$>,-1] +warp.. [$>],0,0 rv[$>,-1] rm. done rm[-2,-1] #@cli pack : is_ratio_constraint={ 0 | 1 },_sort_criterion #@cli : Pack selected images into a single image. @@ -16124,48 +19879,49 @@ #@cli : $ image.jpg repeat 10 +resize2dx[-1] 75% balance_gamma[-1] ${-RGB} done pack 0 pack : skip ${1=0},${2=max(w,h)} e[^-1] "Pack image$? into a single image." - if {$!<2} return fi - if {${-max_d}>1} error[0--3] "Command '$0': Selected images contain at least one volumetric image (depth>1). Should all be 2D." fi - v - + if $!<2 return fi + if ${-max_d}>1 error[0--3] "Command '$0': Selected images contain at least one volumetric image (depth>1). + Should all be 2D." fi nm={0,n} to_colormode 0 # Sort images by decreasing size. - repeat $! nm$>={0,n} nm[$>] $> done - sort_list -,"$2" + repeat $! nm$>={$>,n} nm[$>] ${nm$>}:$> done + m "_pack : ('{n}') l. s +,{':'} u {t} rm endl" + if ['$2']=='n' sort_list +,n else sort_list -,"$2" fi # Start packing - offsets{0,n}=0,0 + offsets${-_pack[0]}=0,0 N=$! i[0] 0 # List of empty slots. do l[0,1,2] - w1={1,w} h1={1,h} w2={2,w} h2={2,h} + w1,h1,w2,h2={[w#1,h#1,w#2,h#2]} # Search an empty slot that fits. - slot=-1 min_slot_area=inf - repeat {0,h} - x={0,i(0,$>)} y={0,i(1,$>)} w={0,i(2,$>)} h={0,i(3,$>)} + slot,min_slot_area=-1,inf + repeat h#0 + x,y,w,h={0,crop(0,$>,4,1)} slot_area={$w*$h} - if {$w>=$w2" && "$h>=$h2" && "$slot_area<=$min_slot_area} # Found a fit. - slot=$> min_slot_area=$slot_area + if $w>=$w2" && "$h>=$h2" && "$slot_area<=$min_slot_area # Found a fit. + slot,min_slot_area=$>,$slot_area fi done - if {$slot>=0} # Empty slot found -> Use it. - x={0,i(0,$slot)} y={0,i(1,$slot)} w={0,i(2,$slot)} h={0,i(3,$slot)} - j[1] [2],$x,$y offsets{2,n}=$x,$y + if $slot>=0 # Empty slot found -> Use it. + x,y,w,h={0,crop(0,$slot,4,1)} + j[1] [2],$x,$y offsets${-_pack[2]}=$x,$y l[0] s y rm[$slot] area1={max(($w-$w2)*$h,$w2*($h-$h2))} area2={max(($w-$w2)*$h2,$w*($h-$h2))} - if {$area1>=$area2} # Split - type1 - if {$w2<$w} i[$slot] ({$x+$w2},$y,{$w-$w2},$h) fi - if {$h2<$h} i[$slot] ($x,{$y+$h2},$w2,{$h-$h2}) fi + if $area1>=$area2 # Split - type1 + if $w2<$w i[$slot] ({$x+$w2},$y,{$w-$w2},$h) fi + if $h2<$h i[$slot] ($x,{$y+$h2},$w2,{$h-$h2}) fi else # Split - type 2 - if {$w2<$w} i[$slot] ({$x+$w2},$y,{$w-$w2},$h2) fi - if {$h2<$h} i[$slot] ($x,{$y+$h2},$w,{$h-$h2}) fi + if $w2<$w i[$slot] ({$x+$w2},$y,{$w-$w2},$h2) fi + if $h2<$h i[$slot] ($x,{$y+$h2},$w,{$h-$h2}) fi fi - a y if {!$!} 0 fi + a y if !$! 0 fi endl rm[2] @@ -16178,43 +19934,46 @@ metric_v={if($w2<$w1,($w1-$w2)*$h2,($w2-$w1)*$h1)} fi - if {$metric_h<=$metric_v} # Append horizontally. - offsets{2,n}=$w1,0 + if $metric_h<=$metric_v # Append horizontally. + offsets${-_pack[2]}=$w1,0 a[1,2] x,0 - if {$h2<$h1} ($w1,$h2,$w2,{$h1-$h2}) a[0,-1] y - elif {$h2>$h1} (0,$h1,$w1,{$h2-$h1}) a[0,-1] y + if $h2<$h1 ($w1,$h2,$w2,{$h1-$h2}) a[0,-1] y + elif $h2>$h1 (0,$h1,$w1,{$h2-$h1}) a[0,-1] y fi else # Append vertically. - offsets{2,n}=0,$h1 + offsets${-_pack[2]}=0,$h1 a[1,2] y,0 - if {$w2<$w1} ($w2,$h1,{$w1-$w2},$h2) a[0,-1] y - elif {$w2>$w1} ($w1,0,{$w2-$w1},$h1) a[0,-1] y + if $w2<$w1 ($w2,$h1,{$w1-$w2},$h2) a[0,-1] y + elif $w2>$w1 ($w1,0,{$w2-$w1},$h1) a[0,-1] y fi fi fi - endl while {$!>2} + endl while $!>2 rm[0] # Return offsets. status= - repeat $N if {narg($status)} status=$status,${offsets$>} else status=${offsets$>} fi done + repeat $N if narg($status) status=$status,${offsets$>} else status=${offsets$>} fi done nm $nm u $status - v + + um _pack #@cli puzzle : _width>0,_height>0,_M>=1,_N>=1,_curvature,_centering,_connectors_variability,_resolution>=1 #@cli : Input puzzle binary mask with specified size and geometry. -#@cli : Default values: 'width=height=512', 'M=N=5', 'curvature=0.5', 'centering=0.5', 'connectors_variability=0.5' and 'resolution=64'. +#@cli : Default values: 'width=height=512', 'M=N=5', 'curvature=0.5', 'centering=0.5', 'connectors_variability=0.5' \ +# and 'resolution=64'. #@cli : $ puzzle , -puzzle : check "isint(${1=512}) && $1>0 && isint(${2=$1}) && $2>0 && isint(${3=5}) && $3>0 && isint(${4=$3}) && $4>0 && isint(${8=64}) && $8>0" +puzzle : check "isint(${1=512}) && $1>0 && isint(${2=$1}) && $2>0 && isint(${3=5}) && $3>0 && + isint(${4=$3}) && $4>0 && isint(${8=64}) && $8>0" skip ${5=0.5},${6=0.5},${7=0.5} - e[^-1] "Draw $3x$4 puzzle pattern on image$?, with curvature $5, centering $6, connectors variability $7 and resolution $8." - v - l[] - if {$4>=2} _puzzle[] $3,{$4-1},${5-8} +3d. 0,1 fi - if {$3>=2} _puzzle[] $4,{$3-1},${5-8} r3d. 0,0,1,-90 +3d. 1,$4 fi + e[^-1] "Draw $3x$4 puzzle pattern on image$?, with curvature $5, centering $6, connectors variability $7 + and resolution $8." + l[] + if $4>=2 _puzzle[] $3,{$4-1},${5-8} +3d. 0,1 fi + if $3>=2 _puzzle[] $4,{$3-1},${5-8} r3d. 0,0,1,-90 +3d. 1,$4 fi *3d {$1/$3},{$2/$4} quadrangle3d 0,0,0,{$1-1},0,0,{$1-1},{$2-1},0,0,{$2-1},0 p3d. 1 +3d col3d 1 $1,$2 j3d. ..,0,0,0,1,1,0,0 rm.. - endl v + + endl _puzzle : R={$6*$1} @@ -16245,7 +20004,7 @@ #@cli : $ image.jpg +quadratize_tiles 16 quadratize_tiles : check "$1>0 && ${2=$1}>0" e[^-1] "Quadratize $1x$2 tiles on image$?." - v - repeat $! l[$>] nm={0,n} + repeat $! l[$>] nm={0,n} s={s} split_tiles $1,$2 s c # Split as tiles for all channels. repeat $! l[$>] wh={w},{h} @@ -16253,8 +20012,8 @@ solve.. . rm. $wh,1,1,{@0}"*x^2 + "{@1}"*y^2 + "{@2}"*x*y +"{@3}"*x + "{@4}"*y + "{@5} rm.. endl done - repeat {int($!/$s)} a[-$s--1] c mv. 0 done append_tiles $1,$2 - nm $nm endl done v + + repeat int($!/$s) a[-$s--1] c mv. 0 done append_tiles $1,$2 + nm $nm endl done #@cli rotate_tiles : angle,_M>0,N>0 #@cli : Apply MxN tiled-rotation effect on selected images. @@ -16262,7 +20021,7 @@ #@cli : $ image.jpg to_rgba rotate_tiles 10,8 drop_shadow 10,10 display_rgba rotate_tiles : skip ${2=8},${3=$2} e[^-1] "Apply $2x$3 tiled-rotation effect on image$?, with angle $1 deg." - v - split_tiles $2,$3,1 rotate $1 append_tiles $2,$3 v + + split_tiles $2,$3,1 rotate $1 append_tiles $2,$3 #@cli shift_tiles : M>0,_N>0,_amplitude #@cli : Apply MxN tiled-shift effect on selected images. @@ -16270,29 +20029,32 @@ #@cli : $ image.jpg +shift_tiles 8,8,10 shift_tiles : check "${2=$1}>=0" skip ${3=20} e[^-1] "Apply $1x$2 tiled-shift effect on image$?, with amplitude $3." - v - repeat $! l[$>] + repeat $! l[$>] $1,$2,1,2 noise. $3 r. ..,..,1,2 warp.. .,1,1,0 rm. - endl done v + + endl done -#@cli taquin : M>0,_N>0,_remove_tile={ 0=none | 1=first | 2=last | 3=random },_relief,_border_thickness[%],_border_outline[%],_outline_color +#@cli taquin : M>0,_N>0,_remove_tile={ 0=none | 1=first | 2=last | 3=random },_relief,_border_thickness[%],\ +# _border_outline[%],_outline_color #@cli : Create MxN taquin puzzle from selected images. #@cli : Default value: 'N=M', 'relief=50', 'border_thickness=5', 'border_outline=0' and 'remove_tile=0'. #@cli : $ image.jpg +taquin 8 -taquin : check "isint($1) && $1>0 & isint(${2=$1}) && $2>0" skip ${3=0},${4=50},${5=5%},${6=0},${7=0},${8=$7},${9=$8},${10=255} - e[^-1] "Create $1x$2 taquin puzzle from image$?, with relief $4, border thickness $5, border outline $6 and outline color (${7--1})." - v - repeat $! l[$>] nm={0,n} +taquin : check "isint($1) && $1>0 & isint(${2=$1}) && $2>0" + skip ${3=0},${4=50},${5=5%},${6=0},${7=0},${8=$7},${9=$8},${10=255} + e[^-1] "Create $1x$2 taquin puzzle from image$?, with relief $4, border thickness $5, border outline $6 and + outline color (${7--1})." + repeat $! l[$>] nm={0,n} split_tiles $1,$2 r ${-min_wh},100%,100%,0 100%,100%,1,1,1 if ${"is_percent $5"} rectangle. {100*$5/2}%,{100*$5/2}%,{100-50*$5}%,{100-50*$5}%,1,0 else rectangle. $5,$5,{w-1-$5},{h-1-$5},1,0 fi *. '1-2*(x/w,-1] split_opacity[0] +[0] . a[^-1] c endl done rm. c 0,255 + repeat $!-1 l[$>,-1] split_opacity[0] +[0] . a[^-1] c endl done rm. c 0,255 frame $6,$6,${7-10} - if {$3==3} f. 0 fi + if $3==3 f. 0 fi repeat $! mv[$>] {u($!)} done - if {$3==1} f[0] 0 elif {$3==2} f. 0 fi + if $3==1 f[0] 0 elif $3==2 f. 0 fi append_tiles $1,$2 - nm $nm endl done v + + nm $nm endl done #@cli tunnel : _level>=0,_factor>0,_centering_x,_centering_y,_opacity,_angle #@cli : Apply tunnel effect on selected images. @@ -16300,12 +20062,12 @@ #@cli : $ image.jpg tunnel 20 tunnel : check "${1=9}>=0 && ${2=80%}>0" skip ${3=0.5},${4=0.5},${5=0.1},${6=0} e[^-1] "Apply tunnel effect on image$?, with depth $1, factor $2, centering ($3,$4), opacity $5 and angle $6." - v - repeat $! l[$>] + repeat $! l[$>] repeat $1 +r. $2,$2,1,100%,5 if $6 100%,100%,1,1,1 rotate[-2,-1] $6,1,0 erode. 3 j... ..,{({-3,w}-w)*$3},{({-3,h}-h)*$4},0,0,$5,. rm[-2,-1] else j.. .,{({-2,w}-w)*$3},{({-2,h}-h)*$4},0,0,$5 rm. fi done - endl done c 0,255 v + + endl done c 0,255 #----------------------------- # @@ -16320,7 +20082,6 @@ #@cli : $ image.jpg boxfitting , boxfitting : check "isint(${1=3}) && $1>=1 && isint(${2=0}) && $2>=0 && ${3=0.1}>=0 && isint(${4=3}) && $4>=1" e[^-1] "Apply box fitting effect on image$?, with box sizes ($1,$2), density $3 and $4 attempts." - v - min_size=$1 max_size={if($2,$2,max(w,h))} repeat $! l[$>] @@ -16329,7 +20090,7 @@ repeat 1e8 # Add random non-intersecting squares with min size. - if {$><1} # Takes random points for the first iteration. + if $><1 # Takes random points for the first iteration. 100%,100% noise. {max(1e-3,$3)},2 ==. 1 else # Then, try to take points near the median axis of the distance function otherwise. +distance. 1 +rand. 0,1 *[-2,-1] max_patch. {round($prec*$min_size)} @@ -16339,25 +20100,31 @@ # Discard new squares that intersect something. dilate. $min_size area_fg. 0,1 ==. {($min_size)^2} +dilate.. 3 ==. 0 *[-2,-1] area_fg. 0,1 ==. {($min_size)^2} - if {!iM} nb_attempts+=1 if {$nb_attempts>$4} rm. break fi # If no new squares have been placed. + if !iM nb_attempts+=1 if $nb_attempts>$4 rm. break fi # If no new squares have been placed. else nb_attempts=0 fi +[-2,-1] # Make current squares grown until max square size is reached. - repeat {int(($max_size-$min_size)/2)} + repeat int(($max_size-$min_size)/2) +dilate. 3 area_fg. 0,1 ==. {($min_size+2*$>+2)^2} - if {!iM} rm. break fi # No more squares to grow. + if !iM rm. break fi # No more squares to grow. -|[-2,-1] done done blend shapeaverage0 - endl done v + + endl done -#@cli brushify : [brush],_brush_nb_sizes>=1,0<=_brush_min_size_factor<=1,_brush_nb_orientations>=1,_brush_light_type,0<=_brush_light_strength<=1,_brush_opacity,_painting_density[%]>=0,0<=_painting_contours_coherence<=1,0<=_painting_orientation_coherence<=1,_painting_coherence_alpha[%]>=0,_painting_coherence_sigma[%]>=0,_painting_primary_angle,0<=_painting_angle_dispersion<=1 +#@cli brushify : [brush],_brush_nb_sizes>=1,0<=_brush_min_size_factor<=1,_brush_nb_orientations>=1,\ +# _brush_light_type,0<=_brush_light_strength<=1,_brush_opacity,_painting_density[%]>=0,\ +# 0<=_painting_contours_coherence<=1,0<=_painting_orientation_coherence<=1,_painting_coherence_alpha[%]>=0,\ +# _painting_coherence_sigma[%]>=0,_painting_primary_angle,0<=_painting_angle_dispersion<=1 #@cli : Apply specified brush to create painterly versions of specified images. #@cli : 'brush_light_type' can be { 0=none | 1=flat | 2=darken | 3=lighten | 4=full }. -#@cli : Default values: 'brush_nb_sizes=3', 'brush_min_size_factor=0.66', 'brush_nb_orientations=12', 'brush_light_type=0', 'brush_light_strength=0.25', 'brush_opacity=0.8', 'painting_density=20%', 'painting_contours_coherence=0.9', 'painting_orientation_coherence=0.9', 'painting_coherence_alpha=1', 'painting_coherence_sigma=1', 'painting_primary_angle=0', 'painting_angle_dispersion=0.2' +#@cli : Default values: 'brush_nb_sizes=3', 'brush_min_size_factor=0.66', 'brush_nb_orientations=12', \ +# 'brush_light_type=0', 'brush_light_strength=0.25', 'brush_opacity=0.8', 'painting_density=20%', \ +# 'painting_contours_coherence=0.9', 'painting_orientation_coherence=0.9', 'painting_coherence_alpha=1', \ +# 'painting_coherence_sigma=1', 'painting_primary_angle=0', 'painting_angle_dispersion=0.2' #@cli : $ image.jpg 40,40 gaussian[-1] 8,2 spread[-1] 4,0 +brushify[0] [1] brushify : check ${"is_image_arg $1"}" &&"\ # $1: [brush] "isint(${2=4}) && $2>=1 &&"\ # $2: brush_nb_sizes @@ -16365,32 +20132,32 @@ "isint(${4=12}) && $4>=1 &&"\ # $4: brush_nb_orientations "isint(${5=4}) && $5>=0 &&"\ # $5: brush_light_type "${6=0.07}>=0 && $6<=1 &&"\ # $6: brush_light_strength - "isval(${7=0.75}) &&"\ # $7: brush_opacity + "isnum(${7=0.75}) &&"\ # $7: brush_opacity "${8=40%}>=0 && $8>=0 &&"\ # $8: painting_density[%] "${9=0.7}>=0 && $9<=1 &&"\ # $9: painting_contours_coherence "${10=1}>=0 && $10<=1 &&"\ # $10: painting_orientation_coherence - "${11=1}>=0 && ${12=0.5%}>=0 &&"\ # $11 and $12: painting_coherence_alpha and painting_coherence_sigma - "isval(${13=45}) &&"\ # $13: painting_primary_angle + "${11=1}>=0 && ${12=0.5%}>=0 &&"\ # $11 and $12: painting_coherence_alpha and sigma + "isnum(${13=45}) &&"\ # $13: painting_primary_angle "${14=0.2}>=0 && $14<=1" # $14: painting_angle_dispersion e[^-1] "Brushify image$?, with brush $1." - v - # Precompute the set of oriented/resized brushes. pass$1 0 l. - slices 0 norm n 0,1 threshold 0.1,1 autocrop. + slices 0 max 1e-8 norm n 0,1 threshold 0.1,1 autocrop. repeat $4 +rotate[0] {360*$>/$4} done - rm[0] n 0,1 threshold 0.1,1 autocrop r ${-max_wh},1,1,0,0,0.5,0.5 + rm[0] n 0,1 threshold 0.1,1 + autocrop r ${-max_wh},1,1,0,0,0.5,0.5 a z nm brush wb={w} hb={h} whb={wh} ls={255*$6} - if {$5==0} +f. 0 - elif {$5==1} +n. -$ls,0 - elif {$5==2} +g xy +[-2,-1] min. 0 n. -$ls,0 - elif {$5==3} +g xy +[-2,-1] max. 0 n. 0,$ls + if $5==0 +f. 0 + elif $5==1 +n. -$ls,0 + elif $5==2 +g xy +[-2,-1] min. 0 n. -$ls,0 + elif $5==3 +g xy +[-2,-1] max. 0 n. 0,$ls else +g xy +[-2,-1] n. -$ls,$ls fi nm. brushlight - repeat {$2-1} + repeat $2-1 ratio={v=(1+$>)/max(1,$2-1);100*((1-v)+$3*v)}% +r[brush,brushlight] $ratio,$ratio,100%,1,2 r[-2,-1] [brush],0,0,0.5,0.5 @@ -16399,7 +20166,7 @@ endl # Generate images with brushes. - repeat {$!-2} l[$>,brush,brushlight] + repeat $!-2 l[$>,brush,brushlight] s={0,s} nm={0,n} to_rgb[0] nm[0] img # Generate set of random points with orientations. @@ -16426,27 +20193,31 @@ ang = round(((atan2(V[1],V[0])%(2*pi))*$4/(2*pi)))%$4; col = I(#"$img",P); ind = amp*$4 + ang; - brush = crop(#"$brush",0,0,ind,0,"$wb","$hb",1,1); - brushlight = crop(#"$brushlight",0,0,ind,0,"$wb","$hb",1,1); + ref(crop(#"$brush",0,0,ind,0,"$wb","$hb",1,1),brush); + ref(crop(#"$brushlight",0,0,ind,0,"$wb","$hb",1,1),brushlight); brush_r = cut(col[0] + brushlight,0,255); brush_g = cut(col[1] + brushlight,0,255); brush_b = cut(col[2] + brushlight,0,255); draw(#"$res",[brush_r,brush_g,brush_b,brush_a],P - S2,"$wb","$hb",1,4,$7,brush,1); P" k[res,brush,brushlight] mv[res] 0 nm[0] $nm to_colormode[0] {$s+($s%2)} - endl done rm[brush,brushlight] v + + endl done rm[brush,brushlight] #@cli cartoon : _smoothness,_sharpening,_threshold>=0,_thickness>=0,_color>=0,quantization>0 #@cli : Apply cartoon effect on selected images. -#@cli : Default values: 'smoothness=3', 'sharpening=150', 'threshold=20', 'thickness=0.25', 'color=1.5' and 'quantization=8'. +#@cli : Default values: 'smoothness=3', 'sharpening=150', 'threshold=20', 'thickness=0.25', 'color=1.5' \ +# and 'quantization=8'. #@cli : $ image.jpg cartoon 3,80,15 cartoon : skip ${1=3},${2=150},${3=20},${4=0.25},${5=1.5},${6=8} - e[^-1] "Apply cartoon effect on image$?, with smoothness $1, sharpening $2, threshold $3, thickness $4, color $5 and quantization $6." - v - repeat $! l[$>] split_opacity l[0] to_rgb - b $1 sharpen $2,1 c 0,255 n 0,255 - if $4 +edges $3 b. $4 >=. 0.9 else 100%,100%,1,1,1 fi - rgb2lab.. s.. c *[-3,-2] $5 a[-4--2] c lab2rgb.. quantize.. $6,1,0 n.. 0,255 * - endl a c endl done v + + e[^-1] "Apply cartoon effect on image$?, with smoothness $1, sharpening $2, threshold $3, thickness $4, color $5 + and quantization $6." + repeat $! l[$>] split_opacity l[0] to_rgb + b $1 sharpen $2,1 c 0,255 n 0,255 + if $4 +edges $3 b. $4 >=. 0.9 else 100%,100%,1,1,1 fi + rgb2lab.. s.. c *[-3,-2] $5 a[-4--2] c lab2rgb.. + quantize.. $6,1,-1 + n.. 0,255 * + endl a c endl done #@cli color_ellipses : _count>0,_radius>=0,_opacity>=0 #@cli : Add random color ellipses to selected images. @@ -16454,22 +20225,25 @@ #@cli : $ image.jpg +color_ellipses ,,0.15 color_ellipses : skip ${1=1400},${2=5},${3=0.1} e[^-1] "Add $1 random color ellipses to image$?, with maximum radius $2 and opacity $1." - v - repeat $1 ellipse {u(0,100)}%,{u(0,100)}%,{u(0,$2)}%,{u(0,$2)}%,{u(0,360)},$3,{u(60,255)},{u(60,255)},{u(60,255)},255 done v + + repeat $1 + ellipse {u(0,100)}%,{u(0,100)}%,{u(0,$2)}%,{u(0,$2)}%,{u(0,360)},$3,{u(60,255)},{u(60,255)},{u(60,255)},255 + done #@cli cubism : _density>=0,0<=_thickness<=50,_max_angle,_opacity,_smoothness>=0 #@cli : Apply cubism effect on selected images. #@cli : Default values: 'density=50', 'thickness=10', 'max_angle=75', 'opacity=0.7' and 'smoothness=0'. #@cli : $ image.jpg cubism , cubism : check "${1=50}>=0 && ${2=10}>=0 && $2<=50 && ${5=0}>=0" skip ${3=75},${4=0.7} - e[^-1] "Apply cubism effect on image$?, with density $1, thickness $2, maximum angle $3 deg., opacity $4 and smoothness $5." - if {"!$1 || !$2 || !$3 || !$4"} return fi - v - repeat $! l[$>] + e[^-1] "Apply cubism effect on image$?, with density $1, thickness $2, maximum angle $3 deg., opacity $4 and + smoothness $5." + if "!$1 || !$2 || !$3 || !$4" return fi + repeat $! l[$>] w={w} h={h} s={s} P={round($2*max(w,h)/200)} N={round(1.5*$1*w*h/(4*$P)/100)} # Define Header + nb vertices / primitives. - ({'CImg3d'}) +. 0.5 ({4*$N};$N) + ('CImg3d') +. 0.5 ({4*$N};$N) # Generate list of random points. 1,$N rand. $P,{$w-1-$P} +rand. $P,{$h-1-$P} a[-2,-1] x round. @@ -16486,16 +20260,16 @@ # Generate materials. (-128;$w;$h;$s) +b[0] $5 - if {$N>1} 4,{$N-1},1,1,-128,0,0,0 fi + if $N>1 4,{$N-1},1,1,-128,0,0,0 fi 1,$N,1,1,1 # Apply effect on current image. y[1--1] a[1--1] y rv3d. - if {$4>=1} j3d[0] [1],0,0,0,1,2,0,0 rm[1] + if $4>=1 j3d[0] [1],0,0,0,1,2,0,0 rm[1] else +j3d[0] [1],0,0,0,1,2,0,0 rm[1] blend alpha,$4 fi - endl done v + + endl done #@cli draw_whirl : _amplitude>=0 #@cli : Apply whirl drawing effect on selected images. @@ -16503,10 +20277,10 @@ #@cli : $ image.jpg draw_whirl , draw_whirl : skip ${1=100} e[^-1] "Apply whirl drawing effect on image$? with amplitude $1." - v - repeat $! l[$>] + repeat $! l[$>] 100%,100% noise. 70,2 ==. 1 *. 255 r. .. &[-1,-2] smooth. $1,0,1,2,2 sqrt. n. 0,255 equalize. - endl done v + + endl done #@cli drawing : _amplitude>=0 #@cli : Apply drawing effect on selected images. @@ -16514,11 +20288,11 @@ #@cli : $ image.jpg +drawing , drawing : skip ${1=200} e[^-1] "Apply drawing effect on image$? with amplitude $1." - v - repeat $! l[$>] split_opacity l[0] to_rgb + repeat $! l[$>] split_opacity l[0] to_rgb smooth $1,0.2,1,3,3 b 2 sharpen 1000 [0] r[0] 20,20,1,3,2 equalize[0] index[1] [0],1,1 nm[1] {0,n},1 rm[0] - endl a c endl done v + + endl a c endl done #@cli drop_shadow : _offset_x[%],_offset_y[%],_smoothness[%]>=0,0<=_curvature<=1,_expand_size={ 0 | 1 } #@cli : Drop shadow behind selected images. @@ -16526,15 +20300,16 @@ #@cli : $ image.jpg drop_shadow 10,20,5,0.5 expand_xy 20,0 display_rgba drop_shadow : check "${3=5}>=0 && ${4=0}>=0 && $4<=1" skip ${1=20},${2=$1},${5=1} e[^-1] "Drop shadow behind image$?, with offsets ($1,$2), smoothness $3 and curvature $4." - v - to_a repeat $! l[$>] + to_a repeat $! l[$>] nm={0,n} dx={if(${is_percent\ $1},w*$1,$1)} dy={if(${is_percent\ $2},h*$2,$2)} sigma={if(${is_percent\ $3},max(w,h)*$3,$3)} w={w} h={h} s={s} +channels 100% coords=${autocrop_coords.\ 0} rm. z $coords # Crop part with opaque pixels. - r {w+abs($dx)},{h+abs($dy)},1,100%,0,0,{if($dx>0,0,1)},{if($dy>0,0,1)} r. {w+4*$sigma},{h+4*$sigma},1,100%,0,0,0.5,0.5 + r {w+abs($dx)},{h+abs($dy)},1,100%,0,0,{if($dx>0,0,1)},{if($dy>0,0,1)} + r. {w+4*$sigma},{h+4*$sigma},1,100%,0,0,0.5,0.5 +channels. 100% - if {!$4} shift. $dx,$dy # Flat shadow. + if !$4 shift. $dx,$dy # Flat shadow. else # Curved shadow. (0;{pi}) r. ..,3 sin. *. -$4 +. 1 *. $dx (0,{pi}) r. ..,3 sin. *. -$4 +. 1 *. $dy @@ -16543,58 +20318,60 @@ b. $sigma,0 r. 100%,100%,1,2,0,0,0,0,0,1 mv. 0 blend alpha +channels. 100% >=. 1 * autocrop 0 - if {!$5} $w,$h,1,$s j. ..,{arg(1,$coords)},{arg(2,$coords)} rm.. fi + if !$5 $w,$h,1,$s j. ..,{arg(1,$coords)},{arg(2,$coords)} rm.. fi nm $nm - endl done v + + endl done #@cli ellipsionism : _R>0[%],_r>0[%],_smoothness>=0[%],_opacity,_outline>0,_density>0 #@cli : Apply ellipsionism filter to selected images. -#@cli : Default values: 'R=10', 'r=3', 'smoothness=1%', 'opacity=0.7', 'outlise=8' and 'density=0.6'. +#@cli : Default values: 'R=10', 'r=3', 'smoothness=1%', 'opacity=0.7', 'outline=8' and 'density=0.6'. #@cli : $ image.jpg +ellipsionism , ellipsionism : check "${1=10}>0 && ${2=3}>0 && ${5=8}>0 && ${6=0.6}>0" skip ${3=1%},${4=0.7} e[^-1] "Apply ellipsionism filter to image$?, with radii ($1,$2), smoothness $3, opacity $4 and outline $5." - v - to_rgba repeat $! l[$>] + repeat $! l[$>] to_color # Compute contour angle. +luminance g. xy a[-2,-1] c b. $3 orientation. sh. 0 sh.. 1 atan2. .. *. {180/pi} +. 90 rm[-2,-1] channels. 1,1 # Render ellipses. - ..,..,1,.. - repeat {$6*w*h/max($1,$2)} - xy={u(w)},{u(h)} - ellipse. $xy,$1,$2,{-2,i($xy)},$4,\ - {-3,i($xy,0,0)},{-3,i($xy,0,1)},{-3,i($xy,0,2)},{-3,i($xy,0,3)} - ellipse. $xy,$1,$2,{-2,i($xy)},$4,0x1,\ - {-3,i($xy,0,0)/$5},{-3,i($xy,0,1)/$5},{-3,i($xy,0,2)/$5},{-3,i($xy,0,3)/$5} - done rm.. - - # Renormalize and prepare next image. - n. .. blend alpha - endl done v + + 100%,100%,1,4 + eval " + const interpolation = 1; + const N = $6*wh/max($1,$2); + for (n = 0, n=0,0<=_attenuation<=1,_smoothness>=0,_threshold>=0,_nb_frames>0,_starting_frame>=0,frame_skip>=0 +#@cli fire_edges : _edges>=0,0<=_attenuation<=1,_smoothness>=0,_threshold>=0,_nb_frames>0,_starting_frame>=0,\ +# frame_skip>=0 #@cli : Generate fire effect from edges of selected images. -#@cli : Default values: 'edges=0.7', 'attenuation=0.25', 'smoothness=0.5', 'threshold=25', 'nb_frames=1', 'starting_frame=20' and 'frame_skip=0'. +#@cli : Default values: 'edges=0.7', 'attenuation=0.25', 'smoothness=0.5', 'threshold=25', 'nb_frames=1', \ +# 'starting_frame=20' and 'frame_skip=0'. #@cli : $ image.jpg fire_edges , -fire_edges : check "${1=0.7}>=0 && ${2=0.25}>=0 && $2<=1 && ${3=0.5}>=0 && ${4=25}>=0 && ${5=1}>0 && ${6=20}>=0 && ${7=0}>=0" - e[^-1] "Generate fire effect from edges of image$?, with edges $1, attenuation $2, smoothness $3, threshold $4, "\ - "$5 frames, starting frame $6 and frame skip $7." - v - repeat $! l[$>] nm={0,n} +fire_edges : check "${1=0.7}>=0 && ${2=0.25}>=0 && $2<=1 && ${3=0.5}>=0 && ${4=25}>=0 && ${5=1}>0 && + ${6=20}>=0 && ${7=0}>=0" + e[^-1] "Generate fire effect from edges of image$?, with edges $1, attenuation $2, smoothness $3, threshold $4, + $5 frames, starting frame $6 and frame skip $7." + repeat $! l[$>] nm={0,n} norm +gradient_norm n. 0,1 roundify. $1 f[0] 0 (0,0,0;0,0,0;1,1,1;0,1,0) *. {(1-$2^4)/4} - repeat {$5*(1+$7)+$6} + repeat $5*(1+$7)+$6 {0,w},{0,h} rand. 0,255 *. [1] b. $3 if $4 >=. $4% else equalize. fi n. 0,255 j[0] .,0,0,0,0,1,[1],1 rm. correlate[0] [2] - if {$>>=$6" && "($>-$6)%($7+1)==0} [0] fi + if $>>=$6" && "($>-$6)%($7+1)==0 [0] fi done rm[0-2] nm $nm endl done (0,255,255,255,255^0,0,255,255,255^0,0,0,128,255) r. 256,1,1,3,3 - map[^-1] . rm. v + + map[^-1] . rm. #@cli fractalize : 0<=detail_level<=1 #@cli : Randomly fractalize selected images. @@ -16602,7 +20379,6 @@ #@cli : $ image.jpg fractalize , fractalize : check "${1=0.8}>=0 && $1<=1" e[^-1] "Randomly fractalize image$?, with detail level $1." - v - xc=0.4433 yc=0.2645 delta=0.1 @@ -16626,7 +20402,7 @@ s={0.1*(1-$1)} parallel "register_nonrigid[1] [0],"$s",5","register_nonrigid[3] [2],"$s",5","register_nonrigid[5] [4],"$s",5" rm[0,2,4] a c nm $nm - endl done v + + endl done #@cli glow : _amplitude>=0 #@cli : Add soft glow on selected images. @@ -16634,26 +20410,28 @@ #@cli : $ image.jpg glow , glow : skip ${1=1%} e[^-1] "Add soft glow on image$?, with amplitude $1." - v - repeat $! l[$>] split_opacity +b[0] $1 n. [0] blend_edges[0,-1] 1 a c endl done v + + repeat $! l[$>] split_opacity +b[0] $1 n. [0] blend_edges[0,-1] 1 a c endl done -#@cli halftone : nb_levels>=2,_size_dark>=2,_size_bright>=2,_shape={ 0=square | 1=diamond | 2=circle | 3=inv-square | 4=inv-diamond | 5=inv-circle },_smoothness[%]>=0 +#@cli halftone : nb_levels>=2,_size_dark>=2,_size_bright>=2,_shape={ 0=square | 1=diamond | 2=circle | \ +# 3=inv-square | 4=inv-diamond | 5=inv-circle },_smoothness[%]>=0 #@cli : Apply halftone dithering to selected images. #@cli : Default values: 'nb_levels=5', 'size_dark=8', 'size_bright=8', 'shape=5' and 'smoothnesss=0'. #@cli : $ image.jpg halftone , halftone : check "${1=5}>=2 && ${2=8}>=2 && ${3=8}>=2 && ${5=0}>=0" skip ${4=5} - v - s0="square" s1="diamond" s2="circle" s3="inv-square" s4="inv-diamond" s5="inv-circle" v + - e[^-1] "Apply halftone dithering to image$?, with $1 levels, dark size $3, bright size $4, "${s$4}" shape and smoothness $5." - v - repeat $! l[$>] s c repeat $! l[$>] + s0="square" s1="diamond" s2="circle" s3="inv-square" s4="inv-diamond" s5="inv-circle" + e[^-1] "Apply halftone dithering to image$?, with $1 levels, dark size $3, bright size $4, "\ + ${s$4}" shape and smoothness $5." + repeat $! l[$>] s c repeat $! l[$>] (0,255) a y quantize $1,0 rows 0,{h-2} repeat $1 s={round(($2*$<+$3*$>)/($1-1))} $s,$s =. 1,50%,50% distance. 1,{$4%3} +shift. {round(w/2)},{round(h/2)},0,0,2 min[-2,-1] - if {$4>=3} <. {100*$} + if $4>=3 <. {100*$} else <. {100*$>/($1-1.1)}% *. 255 -. $> fi r. ..,0,2 b. $5 +==.. $> *[-2,-1] +[-2,-1] done endl done a c - endl done v + + endl done #@cli hardsketchbw : _amplitude>=0,_density>=0,_opacity,0<=_edge_threshold<=100,_is_fast={ 0 | 1 } #@cli : Apply hard B&W sketch effect on selected images. @@ -16661,8 +20439,8 @@ #@cli : $ image.jpg +hardsketchbw 200,70,0.1,10 median[-1] 2 +local reverse blur[-1] 3 blend[-2,-1] overlay endlocal hardsketchbw : skip ${1=300},${2=50},${3=0.1},${4=20},${5=0} e[^-1] "Apply hard B&W sketch effect on image$?, with amplitude $1, density $2, opacity $3 and edge threshold $4." - if {!$2} channels 0 f 255 return fi - v - luminance n 0,1 + if !$2 channels 0 f 255 return fi + luminance n 0,1 if $5 # Fast version. repeat $! l[$>] nm={0,n} @@ -16684,12 +20462,12 @@ # Convert as a 3d object and render on white background. i... 1,{h} 1,{h} a[-6--1] x - i.. ({'CImg3d'}) i.. ({2*h},{h}) + i.. ('CImg3d') i.. ({2*h},{h}) 1,{h},1,1,2 1,{h},1,1,2*y ++. 1 a[-3--1] x 3,{h} 1,{h},1,1,$3 y[-6--1] a[-6--1] y $w,$h,1,1,255 j3d. ..,0,0,0,1,1,0,0 rm.. nm $nm endl done - fi v + + fi #@cli hearts : _density>=0 #@cli : Apply heart effect on selected images. @@ -16697,10 +20475,10 @@ #@cli : $ image.jpg +hearts , hearts : skip ${1=10} e[^-1] "Apply heart filter on image$?, with density $1." - v - repeat $! l[$>] + repeat $! l[$>] 100%,100%,1 noise. $1,2 ==. 1 r. .. n. 0,1 *[-1,-2] _heart9x7 dilate.. . rm. - endl done v + + endl done _heart9x7 : (9,7,1,1,0,1,-1,2,-3,2,-1,4,-1,13,-1,7,-3,5,-5,3,-7,1,-4) @@ -16711,8 +20489,9 @@ #@cli : Default values: 'density=8', 'radius=5', 'threshold=80', 'opacity=0.1' and 'votesize=100%'. #@cli : $ image.jpg +houghsketchbw , houghsketchbw : check "${1=8}>=0 && ${2=5}>=0 && ${3=80}>=0 && $3<=100 && ${4=0.1}>=0 && $4<=1 && ${5=100%}>0" - e[^-1] "Apply hough B&W sketch effect on image$?, with density $1, radius $2, threshold $3, opacity $4 and votesize $5." - v - luminance repeat $! l[$>] nm={0,n} + e[^-1] "Apply hough B&W sketch effect on image$?, with density $1, radius $2, threshold $3, opacity $4 + and votesize $5." + luminance repeat $! l[$>] nm={0,n} # Compute normalized Hough transform. res={round(if(${is_percent\ $5},$5*max(w,h),$5))} w={w} h={h} rhomax={sqrt(w^2+h^2)/2} @@ -16739,14 +20518,14 @@ # Transform as a 3D object. i... 1,{h} 1,{h} a[-6--1] x # Vertices - i.. ({'CImg3d'}) i.. ({2*h},{h}) # Header and size. + i.. ('CImg3d') i.. ({2*h},{h}) # Header and size. 1,{h},1,1,2 1,{h},1,1,2*y ++. 1 a[-3--1] x # Primitives. 3,{h},1,1,0 1,{h},1,1,$4 # Colors and opacities y[-6--1] a[-6--1] y # Render on a white image. $w,$h,1,1,255 j3d. ..,0,0,0,1,1,0,0 rm.. - nm $nm endl done v + + nm $nm endl done #@cli lightrays : 100<=_density<=0,_center_x[%],_center_y[%],_ray_length>=0,_ray_attenuation>=0 #@cli : Generate ray lights from the edges of selected images. @@ -16754,22 +20533,24 @@ #@cli : $ image.jpg +lightrays , + cut 0,255 lightrays : check "${1=50}>=0 && $1<=100 && ${4=1}>=0 && ${5=1}>=0" skip ${2=50%},${3=50%} e[^-1] "Generate ray lights from image$?, with density $1, center point ($2,$3), ray length $4 and attenuation $5." - v - repeat $! l[$>] + repeat $! l[$>] gradient_norm >= $1% euclidean2polar $2,$3 - repeat {log2(w)} +shift. {2^$>} +[-2,-1] done + repeat log2(w) +shift. {2^$>} +[-2,-1] done function1d 0.5,0,1,{$4*w},1,{1+($4+1-$5)*w},0 r. {-2,w},1,1,1,0 (1,{w}) r. {-2,w},1,1,1,3 /[-2,-1] r. .. *[-2,-1] polar2euclidean $2,$3 n 0,255 - endl done v + + endl done -#@cli light_relief : _ambient_light,_specular_lightness,_specular_size,_light_smoothness,_darkness,_xl,_yl,_zl,_zscale,_opacity_is_heightmap={ 0 | 1 } +#@cli light_relief : _ambient_light,_specular_lightness,_specular_size,_darkness,_light_smoothness,_xl,_yl,_zl,\ +# _zscale,_opacity_is_heightmap={ 0 | 1 } #@cli : Apply relief light to selected images. -#@cli : Default values(s) : 'ambient_light=0.3', 'specular_lightness=0.5', 'specular_size=0.2', 'darkness=0', 'xl=0.2', 'yl=zl=0.5', +#@cli : Default values(s) : 'ambient_light=0.3', 'specular_lightness=0.5', 'specular_size=0.2', 'darkness=0', \ +# 'xl=0.2', 'yl=zl=0.5', #@cli : 'zscale=1', 'opacity=1' and 'opacity_is_heightmap=0'. #@cli : $ image.jpg blur 2 light_relief 0.3,4,0.1,0 light_relief : skip ${1=0.3},${2=0.5},${3=0.2},${4=0},${5=0.2},${6=0.5},${7=0.5},${8=1},${9=1},${10=0} e[^-1] "Apply relief light to image$?." - v - repeat $! l[$>] + repeat $! l[$>] ({-$6},{1-$6};{-$6},{1-$6}^{-$7},{-$7};{1-$7},{1-$7}^$8,$8;$8,$8) r. ..,..,1,3,3 # Create light vector field. if $10 +channels.. 3 to_rgb... else +to_rgb.. norm. fi b. $5% g. xy 100%,100%,1,1,$9 a[-3--1] c # Create normal vector field. @@ -16778,22 +20559,26 @@ /. {($3*max(w,h))^2} exp. *. $2 +. $1 *[-2,-1] -. $4 *. {-2,iM} split_opacity[0] +[0,-1] a c c 0,255 - endl done v + + endl done -#@cli linify : 0<=_density<=100,_spreading>=0,_resolution[%]>0,_line_opacity>=0,_line_precision>0,_mode={ 0=subtractive | 1=additive } +#@cli linify : 0<=_density<=100,_spreading>=0,_resolution[%]>0,_line_opacity>=0,_line_precision>0,\ +# _mode={ 0=subtractive | 1=additive } #@cli : Apply linify effect on selected images. #@cli : The algorithm is inspired from the one described on the webpage 'http://linify.me/about'. -#@cli : Default values: 'density=50', 'spreading=2', 'resolution=40%', 'line_opacity=10', 'line_precision=24' and 'mode=0'. +#@cli : Default values: 'density=50', 'spreading=2', 'resolution=40%', 'line_opacity=10', 'line_precision=24' \ +# and 'mode=0'. #@cli : $ image.jpg linify 40 -linify : check "${1=40}>=0 && $1<=100 && ${2=2}>=0 && ${3=40%}>0 && ${4=10}>=0 && isint(${5=24}) && $5>0 && isbool(${6=0})" - e[^-1] "Apply linify effect on image$?, with density $1, spreading $2, resolution $3, line opacity $4, line precision $5 and "${"-arg 1+$6,subtractive,additive"}" mode." - v - repeat $! l[$>] remove_opacity nm={n} +linify : check "${1=40}>=0 && $1<=100 && ${2=2}>=0 && ${3=40%}>0 && ${4=10}>=0 && isint(${5=24}) && $5>0 && + isbool(${6=0})" + e[^-1] "Apply linify effect on image$?, with density $1, spreading $2, resolution $3, line opacity $4, + line precision $5 and "${"-arg 1+$6,subtractive,additive"}" mode." + repeat $! l[$>] remove_opacity nm={n} 100%,100%,1,{s},$6?0:255 if {0,w>h} r2dx[0] {${"-is_percent $3"}?max(1,$3*w):min(w,$3)} else r2dy[0] {${"-is_percent $3"}?max(1,$3*h):min(h,$3)} fi n[0] 0,100 - if {narg($_debug)" && "!{*,w}} w[] ${-fitscreen[]\ {1,[w,h]}} fi + if narg($_debug)" && "!{*,w} w[] ${-fitscreen[]\ {1,[w,h]}} fi eval " is_in(ind,P) = (P[0]>=0 && P[0]=0 && P[1]density):(ref=0" e[^-1] "Apply mosaic effect on image$?, with density $1." - v - repeat $! l[$>] + repeat $! l[$>] 100%,100%,1,2,'u<0.25*($1%)^4?[u,1]' s. c distance. 1 *. -1 watershed.. . rm. blend shapeaverage - endl done v + + endl done #@cli old_photo #@cli : Apply old photo effect on selected images. #@cli : $ image.jpg old_photo old_photo : e[^-1] "Apply old photo effect on image$?." - v - noise 20 bilateral 30,60 b 2 sharpen 100 frame_fuzzy 8%,8%,6,3 to_rgb shadow_patch 0.75 n 0,255 sepia v + + noise 20 bilateral 30,60 b 2 sharpen 100 frame_fuzzy 8%,8%,6,3 to_rgb shadow_patch 0.75 n 0,255 sepia #@cli pencilbw : _size>=0,_amplitude>=0 #@cli : Apply B&W pencil effect on selected images. @@ -16863,7 +20650,9 @@ #@cli : $ image.jpg pencilbw , pencilbw : skip ${1=0.3},${2=60} e[^-1] "Apply B&W pencil effect on image$?, with size $1 and amplitude $2." - v - repeat $! l[$>] split_opacity l[0] norm b $1 sharpen 4000 smooth $2,0,1 equalize sqrt n 0,255 endl a c endl done v + + repeat $! l[$>] split_opacity l[0] + norm b $1 sharpen 4000 smooth $2,0,1 equalize sqrt n 0,255 + endl a c endl done #@cli pixelsort : _ordering={ + | - },_axis={ x | y | z | xy | yx },_[sorting_criterion],_[mask] #@cli : Apply a 'pixel sorting' algorithm on selected images, as described in the page : @@ -16871,39 +20660,42 @@ #@cli : Default values: 'ordering=+', 'axis=x' and 'sorting_criterion=mask=(undefined)'. #@cli : $ image.jpg +norm +ge[-1] 30% +pixelsort[0] +,y,[1],[2] pixelsort : check "(str1='${1=+}'; str1=='+' || str1=='-') && "\ - "(str2='${2=x}'; str2=='x' || str2=='y' || str2=='z' || str2=='xy' || str2=='yx') && "\ - "('${3=}'==0 || "${"is_image_arg $3"}") && "\ - "('${4=}'==0 || "${"is_image_arg $4"}")" - v - s0="descending" s1="ascending" v + - if {'$3'!=0" && "'$4'!=0} - e[^-1] "Apply 'pixelsort' effect to image$? in "${s{['$1']=='+'}}" order, along axis $2, with sorting criterion $3 and mask $4." - elif {'$3'!=0" && "'$4'==0} - e[^-1] "Apply 'pixelsort' effect to image$? in "${s{['$1']=='+'}}" order, along axis $2, with sorting criterion $3." - elif {'$3'==0" && "'$4'!=0} - e[^-1] "Apply 'pixelsort' effect to image$? in "${s{['$1']=='+'}}" order, along axis $2, with mask $4." + "(str2='${2=x}'; str2=='x' || str2=='y' || str2=='z' || str2=='xy' || str2=='yx') && "\ + "('${3=}'==0 || "${"is_image_arg $3"}") && "\ + "('${4=}'==0 || "${"is_image_arg $4"}")" + s0="descending" s1="ascending" + if '$3'!=0" && "'$4'!=0 + e[^-1] "Apply 'pixelsort' effect to image$? in "${s{['$1']=='+'}}" order, along axis $2, + with sorting criterion $3 and mask $4." + elif '$3'!=0" && "'$4'==0 + e[^-1] "Apply 'pixelsort' effect to image$? in "${s{['$1']=='+'}}" order, along axis $2, + with sorting criterion $3." + elif '$3'==0" && "'$4'!=0 + e[^-1] "Apply 'pixelsort' effect to image$? in "${s{['$1']=='+'}}" order, along axis $2, + with mask $4." else e[^-1] "Apply 'pixelsort' effect to image$? in "${s{['$1']=='+'}}" order, along axis $2." fi - v - repeat $! - if {'$3'!=0} pass$3 0 else +compose_channels[$>] + fi - if {'$4'!=0} pass$4 0 else [$>],[$>],[$>],1,1 fi + repeat $! + if '$3'!=0 pass$3 0 else +compose_channels[$>] + fi + if '$4'!=0 pass$4 0 else [$>],[$>],[$>],1,1 fi l[$>,-2,-1] nm={0,n} >=. 50% mv.. 0 a c order={`";'$1'=='+'?'<':'>'"`} - if {'$2'=='x';} + if '$2'=='x'; _pixelsort $order channels 1,{s-2} - elif {'$2'=='y';} + elif '$2'=='y'; permute yxzc _pixelsort $order channels 1,{s-2} permute yxzc - elif {'$2'=='z';} + elif '$2'=='z'; permute zxyc _pixelsort $order channels 1,{s-2} permute yzxc - elif {'$2'=='xy';} + elif '$2'=='xy'; _pixelsort $order permute yxzc _pixelsort $order channels 1,{s-2} permute yxzc - elif {'$2'=='yx';} + elif '$2'=='yx'; permute yxzc _pixelsort $order permute yxzc _pixelsort $order channels 1,{s-2} fi nm $nm endl - done v + + done _pixelsort : 1,{h},{d} @@ -16913,6 +20705,7 @@ stacksize = 0; push(elt0,elt1) = (stack[stacksize++] = elt0; stack[stacksize++] = elt1); pop() = (_s1 = stack[--stacksize]; _s0 = stack[--stacksize]; [_s0,_s1]); + swap(a,b) = (_tmp = a; a = b; b = _tmp); push(x0,x1); while (stacksize>0, range = pop(); @@ -16922,10 +20715,10 @@ while (lo<=hi, while (i(#0,lo,y,z,0)$1pivot, ++lo); while (pivot$1i(#0,hi,y,z,0), --hi); - if (lo<=hi, _tmp = I(#0,lo,y,z); I(#0,lo++,y,z) = I(#0,hi,y,z); I(#0,hi--,y,z) = _tmp); + lo<=hi?(lo!=hi?(swap(I(#0,lo,y,z),I(#0,hi,y,z))); ++lo; --hi); ); - if (range[0]=0 && ${2=20}>=0" e[^-1] "Create polaroid effect in image$?, with borders sizes $1 and $2." - v - - 255 r {100+$1}%,{100+$1}%,1,100%,0,0,0.5,0.5 r 100%,{100+$2}%,1,100%,0,0,0 + 255 v + + - 255 r {100+$1}%,{100+$1}%,1,100%,0,0,0.5,0.5 r 100%,{100+$2}%,1,100%,0,0,0 + 255 #@cli polygonize : _warp_amplitude>=0,_smoothness[%]>=0,_min_area[%]>=0,_resolution_x[%]>0,_resolution_y[%]>0 #@cli : Apply polygon effect on selected images. @@ -16952,7 +20745,7 @@ #@cli : $ image.jpg polygonize 300,1%,0.1%,3%,3% polygonize : check "${1=300}>=0 && ${2=2%}>=0 && ${3=0.1%}>=0 && ${4=10%}>0 && ${5=$4}>0" e[^-1] "Polygonize image$? with warp amplitude $1, smoothness $2, minimal area $3 and resolutions ($4,$5)." - v - repeat $! l[$>] + repeat $! l[$>] +b $2 gradient_norm. g. a[-2,-1] c channels. 0,2 *. {1/0.1+max(abs(im),abs(iM))} resx={max(1,round(if(${is_percent\ $4},w*$4,w/$4)-1))} resy={max(1,round(if(${is_percent\ $5},h*$5,h/$5)-1))} @@ -16962,27 +20755,31 @@ repeat $1 +warp[1] .,0,0 +[-2,-1] done permute. cxyz z. 0,2 y. j[2] .,0,8 rm[-3,-1] [0],[0] j3d. [1],0,0,0,1,2 rm[1] - if {$3>0} + if $3>0 min_area={0,if(${is_percent\ $3},$3*w*h,$3)} +area. 0,1 >=. $min_area +.. 1 *.. . distance. 1 *. -1 watershed.. . rm. fi blend shapeaverage - endl done v + + endl done -#@cli poster_edges : 0<=_edge_threshold<=100,0<=_edge_shade<=100,_edge_thickness>=0,_edge_antialiasing>=0,0<=_posterization_level<=15,_posterization_antialiasing>=0 +#@cli poster_edges : 0<=_edge_threshold<=100,0<=_edge_shade<=100,_edge_thickness>=0,_edge_antialiasing>=0,\ +# 0<=_posterization_level<=15,_posterization_antialiasing>=0 #@cli : Apply poster edges effect on selected images. -#@cli : Default values: 'edge_threshold=40', 'edge_shade=5', 'edge_thickness=0.5', 'edge_antialiasing=10', 'posterization_level=12' and 'posterization_antialiasing=0'. +#@cli : Default values: 'edge_threshold=40', 'edge_shade=5', 'edge_thickness=0.5', 'edge_antialiasing=10', \ +# 'posterization_level=12' and 'posterization_antialiasing=0'. #@cli : $ image.jpg +poster_edges , -poster_edges : check "${1=40}>=0 && $1<=100 && ${2=5}>=0 && $2<=100 && ${3=0.5}>=0 && ${4=10}>=0 && ${5=12}>=0 && $5<=15 && ${6=0}>=0" - e[^-1] "Apply poster edge on image$?, with edge threshold $1, edge shade $2, edge thickness $3, edge antialiasing $4, $5 level of posterization and posterization antialiasing $6." - v - repeat $! l[$>] split_opacity l[0] +poster_edges : check "${1=40}>=0 && $1<=100 && ${2=5}>=0 && $2<=100 && ${3=0.5}>=0 && ${4=10}>=0 && + ${5=12}>=0 && $5<=15 && ${6=0}>=0" + e[^-1] "Apply poster edge on image$?, with edge threshold $1, edge shade $2, edge thickness $3, + edge antialiasing $4, $5 level of posterization and posterization antialiasing $6." + repeat $! l[$>] split_opacity l[0] +g xy,1 a[-2,-1] c norm. b. $3 n. 0,255 apply_curve. 1,0,1,{max(0,(100-($1%)^0.1*100)*255%)},0.99,{min(255,(101-($1%)^0.1*100+$2)*255%)},0.01,255,0 c. 0,1 if $4 smooth. {min(50,$4)},0,1,{$4/40},{$4/40},0.8,90 fi if $5 autoindex[0] {round((4-sqrt($5+1))*32+2)} fi if $6 smooth[0] {min(50,$6)},0,1,{$6/40},{$6/40},0.8,90 fi * - endl a c endl done v + + endl a c endl done #@cli poster_hope : _smoothness>=0 #@cli : Apply Hope stencil poster effect on selected images. @@ -16990,91 +20787,54 @@ #@cli : $ image.jpg poster_hope , poster_hope : check "${1=3}>=0" e[^-1] "Apply Hope stencil poster effect on image$?, with smoothness $1." - v - repeat $! l[$>] to_rgb + repeat $! l[$>] to_rgb apc "smooth 200,0,1,$1,1" quantize 7,0 f 'if(i!=5,i,i+1-2*(y%2))' (0,32,47;0,32,47;209,1,23;209,1,23;90,141,145;-1,-1,-1;253,221,138) permute. yzcx map[0] [1] rm[1] - endl done v + + endl done -#@cli rodilius : 0<=_amplitude<=100,_0<=thickness<=100,_sharpness>=0,_nb_orientations>0,_offset,_color_mode={ 0=darker | 1=brighter } +#@cli rodilius : 0<=_amplitude<=100,_0<=thickness<=100,_sharpness>=0,_nb_orientations>0,_offset,\ +# _color_mode={ 0=darker | 1=brighter } #@cli : Apply rodilius (fractalius-like) filter on selected images. -#@cli : Default values: 'amplitude=10', 'thickness=10', 'sharpness=400', 'nb_orientations=7', 'offset=0' and 'color_mode=1'. +#@cli : Default values: 'amplitude=10', 'thickness=10', 'sharpness=400', 'nb_orientations=7', 'offset=0' \ +# and 'color_mode=1'. #@cli : $ image.jpg rodilius 12,10,300,10 normalize_local 10,6 #@cli : $ image.jpg normalize_local 10,16 rodilius 10,4,400,16 smooth 60,0,1,1,4 normalize_local 10,16 rodilius : check "${1=10}>=0 && $1<=200 && ${2=10}>=0 && $2<=100 && ${3=400}>=0 && ${4=7}>0" skip ${5=0},${6=1} - e[^-1] "Apply rodilius filter on image$? with amplitude $1, thickness $2, sharpness $3, $4 orientations, offset $5 and "\ - ${arg\ 1+!$6,brighter,darker}" color mode." - v - repeat $! l[$>] split_opacity rv - if {!$6} negate. fi + e[^-1] "Apply rodilius filter on image$? with amplitude $1, thickness $2, sharpness $3, $4 orientations, + offset $5 and "${arg\ 1+!$6,brighter,darker}" color mode." + repeat $! l[$>] split_opacity rv + if !$6 negate. fi +f. 0 nm. {-2,n} - repeat {round($4)} + repeat round($4) angle={$5+$>*180/round($4)} +blur_linear.. $1%,{$1*$2/100}%,$angle,1 b. 0.7 sharpen. $3 max[-2,-1] done rm.. - if {!$6} negate. fi - rv a c endl done v + - -#@cli stained_glass : _edges[%]>=0, shading>=0, is_thin_separators={ 0 | 1 } -#@cli : Generate stained glass from selected images. -#@cli : Default values: 'edges=40%', 'shading=0.2' and 'is_precise=0'. -#@cli : $ image.jpg stained_glass 20%,0.1 -stained_glass : check "${1=40%}>=0 && ${2=0.2}>=0" skip ${3=0} - e[^-1] "Apply stained glass effect on image$?, with edges $1, shading $2 and thin-separators "${arg\ 1+!$3,enabled,disabled}"." - v - repeat $! l[$>] - im={im-1} - $im # Ensure strict positiveness of image labels. - +gradient_norm >=. $1 *.. . - distance. 1 sharpen. 1e10 !=. 0 - if $3 skeleton. 0 fi - distance. 1 watershed.. . +.. $im - n. 0,1 ^. $2 * - endl done v + - -#@cli stars : _density[%]>=0,_depth>=0,_size>0,_nb_branches>=1,0<=_thickness<=1,_smoothness[%]>=0,_R,_G,_B,_opacity -#@cli : Add random stars to selected images. -#@cli : Default values: 'density=10%', 'depth=1', 'size=32', 'nb_branches=5', 'thickness=0.38', 'smoothness=0.5', 'R=G=B=200' and 'opacity=1'. -#@cli : $ image.jpg stars , -stars : check "${1=10%}>=0 && ${2=1}>=0 && ${3=32}>0 && ${4=5}>=1 && ${5=0.38}>=0 && $5<=1 && ${6=0.5}>=0" skip ${7=200},${8=$7},${9=$8},${10=1} - e[^-1] "Add $1 random stars to image$?, with depth $2, size $3, $4 branches, thickness $5, smoothness $6, color ($7,$8,$9) and opacity $10." - if {!$1} return fi - v - - - # Generate star sprites. - star3d $4,$5 col3d. 255 *3d. $3 - l. repeat 4 {round(2*$3)},{round(2*$3)} j3d. [0],50%,50%,0,1,2,0,0 r3d[0] 0,0,1,-90 done rm[0] endl - autocrop[-4--1] 0 r2dy[-4--1] $3 b[-4--1] $6,0 r[-4--1] 100%,100%,1,4 - repeat 4 sh[{-1-$>}] 0,2 fc. $7,$8,$9 rm. done - - # Draw stars on selected images. - repeat {$!-1} [-4--1] l[$>,-4--1] - N={round(if(${is_percent\ $1},w*h*$1,$1)/4,1,1)} - repeat 4 - 2,$N rand. -1,1 1,$N rand. 0,1 a[-2,-1] x - i.. ({'CImg3d'}) +.. 0.5 i.. ($N;$N) - (1,0;1,{$N-1}) r. 2,$N,1,1,3 round. 4,$N,1,1,1 y[-5,-3--1] a[-5--1] y - rv[-2,-1] sprites3d.. .,1 rm. *3d. {0.75*{0,w}},{0.75*{0,h}},{1000*$2} - j3d[0] .,50%,50%,0,$10,0,0,0 rm. - done - endl done - rm[-4--1] v + + if !$6 negate. fi + rv a c endl done -#@cli sketchbw : _nb_angles>0,_start_angle,_angle_range>=0,_length>=0,_threshold>=0,_opacity,_bgfactor>=0,_density>0,_sharpness>=0,_anisotropy>=0,_smoothness>=0,_coherence>=0,_is_boost={ 0 | 1 },_is_curved={ 0 | 1 } +#@cli sketchbw : _nb_angles>0,_start_angle,_angle_range>=0,_length>=0,_threshold>=0,_opacity,_bgfactor>=0,\ +# _density>0,_sharpness>=0,_anisotropy>=0,_smoothness>=0,_coherence>=0,_is_boost={ 0 | 1 },_is_curved={ 0 | 1 } #@cli : Apply sketch effect to selected images. -#@cli : Default values: 'nb_angles=2', 'start_angle=45', 'angle_range=180', 'length=30', 'threshold=3', 'opacity=0.03', -#@cli : 'bgfactor=0', 'density=0.6', 'sharpness=0.1', 'anisotropy=0.6', 'smoothness=0.25', 'coherence=1', 'is_boost=0' and 'is_curved=1'. +#@cli : Default values: 'nb_angles=2', 'start_angle=45', 'angle_range=180', 'length=30', 'threshold=3', \ +# 'opacity=0.03', 'bgfactor=0', 'density=0.6', 'sharpness=0.1', 'anisotropy=0.6', 'smoothness=0.25', 'coherence=1', \ +# 'is_boost=0' and 'is_curved=1'. #@cli : $ image.jpg +sketchbw 1 reverse blur[-1] 3 blend[-2,-1] overlay sketchbw : - check "${1=2}>0 && ${3=180}>=0 && ${4=30}>=0 && ${5=3}>=0 && ${7=0}>=0 && ${8=0.6}>0 && ${9=0.1}>=0 && ${10=0.6}>=0 && ${11=0.25}>=0 && ${12=1}>=0" + check "${1=2}>0 && ${3=180}>=0 && ${4=30}>=0 && ${5=3}>=0 && ${7=0}>=0 && ${8=0.6}>0 && ${9=0.1}>=0 && + ${10=0.6}>=0 && ${11=0.25}>=0 && ${12=1}>=0" skip ${2=45},${6=0.03},${13=0},${14=0} e[^-1] "Apply B&W sketch effect on image$?." - nb_angles,start_angle,angle_range,length,threshold,opacity,bgfactor,density,sharpness,anisotropy,smoothness,coherence,is_boost,is_curved=${1-14} + nb_angles,start_angle,angle_range,length,threshold,opacity,bgfactor,density,sharpness,\ + anisotropy,smoothness,coherence,is_boost,is_curved=${1-14} length={max($length,1)} - v - repeat $! l[$>] - {0,[w,h,1,1,0]} # [1] = canvas to draw onto + repeat $! l[$>] + {0,[w,h,1,1,0]} # [1] = canvas to draw onto +gradient_norm[0] sqrt. diffusiontensors[0] $sharpness,$anisotropy,$smoothness,$coherence - a[0,-1] c # [0] = field of stroke tensors + gradient norm - 1,{$density*wh/sqrt($length)},1,2,round(u([w#0,h#0]-1)) # [2] = set of random points + a[0,-1] c # [0] = field of stroke tensors + gradient norm + 1,{$density*wh/sqrt($length)},1,2,round(u([w#0,h#0]-1)) # [2] = set of random points repeat $nb_angles @@ -17140,7 +20900,7 @@ rm. done k.. * -1 n 0,255 - endl done v + + endl done #@cli sponge : _size>0 #@cli : Apply sponge effect on selected images. @@ -17148,22 +20908,68 @@ #@cli : $ image.jpg +sponge , sponge : skip ${1=13} e[^-1] "Apply sponge filter on image$?, with brush size $1." - v - repeat $! l[$>] + repeat $! l[$>] 100%,100%,1,1 noise. 20,2 ==. 1 r. .. n. 0,1 *[-1,-2] _circle $1 dilate.. . rm. - endl done v + + endl done _circle : - if {$1%2==0} 2,2 else 1 fi + if $1%2==0 2,2 else 1 fi +. 1 r. $1,$1,1,1,0,0,0.5,0.5 distance. 1 n. 0,1 sqrt. c. 0.85,0.86 *. -1 n. 0,1 +#@cli stained_glass : _edges[%]>=0, shading>=0, is_thin_separators={ 0 | 1 } +#@cli : Generate stained glass from selected images. +#@cli : Default values: 'edges=40%', 'shading=0.2' and 'is_precise=0'. +#@cli : $ image.jpg stained_glass 20%,0.1 +stained_glass : check "${1=40%}>=0 && ${2=0.2}>=0" skip ${3=0} + e[^-1] "Apply stained glass effect on image$?, with edges $1, shading $2 and thin-separators "\ + ${arg\ 1+!$3,enabled,disabled}"." + repeat $! l[$>] + im={im-1} - $im # Ensure strict positiveness of image labels. + +gradient_norm >=. $1 *.. . + distance. 1 sharpen. 1e10 !=. 0 + if $3 skeleton. 0 fi + distance. 1 watershed.. . +.. $im + n. 0,1 ^. $2 * + endl done + +#@cli stars : _density[%]>=0,_depth>=0,_size>0,_nb_branches>=1,0<=_thickness<=1,_smoothness[%]>=0,_R,_G,_B,_opacity +#@cli : Add random stars to selected images. +#@cli : Default values: 'density=10%', 'depth=1', 'size=32', 'nb_branches=5', 'thickness=0.38', 'smoothness=0.5', \ +# 'R=G=B=200' and 'opacity=1'. +#@cli : $ image.jpg stars , +stars : check "${1=10%}>=0 && ${2=1}>=0 && ${3=32}>0 && ${4=5}>=1 && ${5=0.38}>=0 && $5<=1 && ${6=0.5}>=0" + skip ${7=200},${8=$7},${9=$8},${10=1} + e[^-1] "Add $1 random stars to image$?, with depth $2, size $3, $4 branches, thickness $5, smoothness $6, + color ($7,$8,$9) and opacity $10." + if !$1 return fi + + # Generate star sprites. + star3d $4,$5 col3d. 255 *3d. $3 + l. repeat 4 {round(2*$3)},{round(2*$3)} j3d. [0],50%,50%,0,1,2,0,0 r3d[0] 0,0,1,-90 done rm[0] endl + autocrop[-4--1] 0 r2dy[-4--1] $3 b[-4--1] $6,0 r[-4--1] 100%,100%,1,4 + repeat 4 sh[{-1-$>}] 0,2 fc. $7,$8,$9 rm. done + + # Draw stars on selected images. + repeat $!-1 [-4--1] l[$>,-4--1] + N={round(if(${is_percent\ $1},w*h*$1,$1)/4,1,1)} + repeat 4 + 2,$N rand. -1,1 1,$N rand. 0,1 a[-2,-1] x + i.. ('CImg3d') +.. 0.5 i.. ($N;$N) + (1,0;1,{$N-1}) r. 2,$N,1,1,3 round. 4,$N,1,1,1 y[-5,-3--1] a[-5--1] y + rv[-2,-1] sprites3d.. .,1 rm. *3d. {0.75*{0,w}},{0.75*{0,h}},{1000*$2} + j3d[0] .,50%,50%,0,$10,0,0,0 rm. + done + endl done + rm[-4--1] + #@cli stencil : _radius[%]>=0,_smoothness>=0,_iterations>=0 #@cli : Apply stencil filter on selected images. #@cli : Default values: 'radius=3', 'smoothness=1' and 'iterations=8'. #@cli : $ image.jpg stencil 1,10,3 stencil : check "${1=3}>=0 && ${2=1}>=0 && ${3=8}>=0" e[^-1] "Apply stencil filter on image$?, with radius $1, smoothness $2 and $3 iterations." - v - n 0,1 repeat $3 b $1 unsharp {$1+$2},1000 c 0,255 done v + + n 0,1 repeat $3 b $1 unsharp {$1+$2},1000 c 0,255 done #@cli stencilbw : _edges>=0,_smoothness>=0 #@cli : Apply B&W stencil effect on selected images. @@ -17171,10 +20977,139 @@ #@cli : $ image.jpg +stencilbw 40,4 stencilbw : skip ${1=15},${2=10} e[^-1] "Apply B&W stencil effect on image$?, with edges $1 and smoothness $2." - v - repeat $! l[$>] split_opacity luminance[0] n[0] 0,255 + repeat $! l[$>] split_opacity luminance[0] n[0] 0,255 +edges[0] $1 quantize[0] 3,0,1 b[0] $2 sharpen[0] 1000000 n[0] 0,1 *[0,-1] n[0] 0,255 - a c endl done v + + a c endl done + +#@cli stylize : [style_image],_fidelity_finest,_fidelity_coarsest,_fidelity_smoothness_finest>=0,\ +# _fidelity_smoothnes_coarsest>=0,0<=_fidelity_chroma<=1,_init_type,_init_resolution>=0,init_max_gradient>=0,\ +# _patchsize_analysis>0,_patchsize_synthesis>0,_patchsize_synthesis_final>0,_nb_matches_finest>=0,\ +# _nb_matches_coarsest>=0,_penalize_repetitions>=0,_matching_precision>=0,_scale_factor>1,_skip_finest_scales>=0,\ +# "image_matching_command" +#@cli : Transfer colors and textures from specified style image to selected images, using a multi-scale \ +# patch-mathing algorithm. +#@cli : If instant display window[0] is opened, the steps of the image synthesis are displayed on it. +#@cli : 'init_type' can be { 0=best-match | 1=identity | 2=randomized }. +stylize : + check ${"is_image_arg $1"}" && isnum(${2=0.25}) && isnum(${3=2}) && ${4=3}>=0 && ${5=0.5}>=0 && ${6=0.1}>=0 && "\ + "$6<=1 && isint(${7=0}) && $7>=0 && $7<=3 && isint(${8=16}) && $8>=0 && ${9=0}>=0 && isint(${10=5}) && "\ + "$10>0 && isint(${11=5}) && $11>0 && isint(${12=$11}) && $12>0 && isint(${13=2}) && isint(${14=30}) && "\ + "${15=10}>=0 && ${16=2}>=0 && ${17=1.85}>1 && isint(${18=0})>=0" + skip "${19=s c,-3 transfer_pca[0] [2] b[0,2] xy,0.7 n[0,2] 0,255 n[1,2] 0,200 a[0,1] c a[1,2] c}" + e[^-1] "Stylize image$? with style image $1." + fidelity_finest,\ # $2 + fidelity_coarsest,\ # $3 + fidelity_smoothness_finest,\ # $4 + fidelity_smoothness_coarsest,\ # $5 + fidelity_chroma,\ # $6 + init_type,\ # $7 + init_resolution,\ # $8 + init_max_gradient,\ # $9 + patchsize_analysis,\ # $10 + patchsize_synthesis,\ # $11 + patchsize_synthesis_final,\ # $12 + nb_matches_finest,\ # $13 + nb_matches_coarsest,\ # $14 + penalize_repetitions,\ # $15 + matching_precision,\ # $16 + scale_factor,\ # $17 + skip_finest_scales=${2-18} \ # $18 + m "stylize_match : $19" + + init_resolution={max(2*$patchsize_analysis,$init_resolution)} + mprec0={round(2+1.5*$matching_precision)} + mprec1={1+round(4*$matching_precision)} + is_window={*} + + pass$1 repeat $!-1 l[$>,-1] + to_colormode.. {s} + nb_scales={1+round(log(min(w#0,h#0,w#1,h#1)/$init_resolution)/log($scale_factor),1,-1)} + if {*} wsiz=${"fitscreen "{0,[w,h]}} w[0] $wsiz,0,"[G'MIC Stylize]" fi + + repeat $nb_scales,scale + size_factor={100/($scale_factor^$<)} + if !$scale + + # Initialization. + +r[0,1] $size_factor%,$size_factor%,100%,100%,2 ws,hs={-2,[w,h]} + +to_color[0,1] channels[-2,-1] 0,2 gradient_norm[-2,-1] + r. [-3],[-3],[-3],1,2 r.. [-4],[-4],[-4],1,2 + a[-3,-1] c a[-3,-1] c # Append gradient information as last channel + stylize_match[-2,-1] + if $init_type==0 + +matchpatch.. .,3,3,1,{2*$mprec0},{2*$mprec1},$penalize_repetitions # Initial image match with 3x3 patches + else + ..,..,1,2,"round([x,y]*([w#-1,h#-1]-1)/([w,h]-1))" # Identity + if d#-2>1 channels. 0,2 fi + if $init_type==2 eval. ">P = u([w,h]-1); tmp = I(P); I(P) = I; I() = tmp" fi # Randomize + fi + rm[-3,-2] + if $init_max_gradient>0 # Keep only high gradients of target image + +gradient_norm[0] r. ..,..,1,1,2 gt. $init_max_gradient + +.. 1 *[-2,-1] _inpaint_warping2d. --. 1 + fi + if $is_window" && "!{*} break fi + + else + + # Upscale. + factor={1-($scale-1)/max(1,$nb_scales-2)} # Linear scale factor from 1 to 0 + +r[0,1] $size_factor%,$size_factor%,100%,100%,2 + +to_color[-2,-1] channels[-2,-1] 0,2 gradient_norm[-2,-1] + + a[-3,-1] c a[-3,-1] c # Append gradient information as last channel + stylize_match[-2,-1] mv[-2,-1] -3 + sh. 0 *. {-3,w/$ws} rm. sh. 1 *. {-3,h/$hs} rm. round. + r. ...,...,1,100%,1 + ws,hs={-2,[w,h]} + + if $<<$skip_finest_scales rm[-3,-2] continue fi # Skip finest scales + +warp_patch.. .,$patchsize_synthesis,$patchsize_synthesis,1 + if {*} w. fi + + # Inject gradients from target (in Lab colorspace). + fidelity={max(0,$fidelity_finest+($fidelity_coarsest-$fidelity_finest)*$factor)} + fidelity_smoothness={$fidelity_smoothness_finest+\ + ($fidelity_smoothness_coarsest-$fidelity_smoothness_finest)*$factor} + + if $fidelity>0.1 + sh. 0,2 sh[-5] 0,2 +gradient_norm[-2,-1] rm[-4,-3] # Gradient norm on colors only + *. $fidelity argmax[-2,-1] b. xy,$fidelity_smoothness n. 0,{min(1,$fidelity)} + sh[-5,-2] 0,2 srgb2lab[-2,-1] rm[-2,-1] + +*. $fidelity_chroma r. 100%,100%,1,2,1 a[-2,-1] c j.. [-5],0,0,0,0,1,. rm. + sh. 0,2 lab2srgb. rm. + fi + rm[-4] + + # Iterate patch-matching steps. + nb_matches={max(0,round($nb_matches_finest+($nb_matches_coarsest-$nb_matches_finest)*$factor^2))} + nb_scales1={$nb_scales-1} + nb_matches1={$nb_matches-1} + if {*} +r. $wsiz,1,100% to. "Scale "$scale/$nb_scales1": 0%",5,2,24 w. -1,-1,0 rm. fi + + repeat $nb_matches + matchpatch. ...,$patchsize_analysis,$patchsize_analysis,1,$mprec0,$mprec1,$penalize_repetitions,0,.. + -.. . abs.. diff={-2,ia} rm.. + +warp_patch.. .,$patchsize_synthesis,$patchsize_synthesis,1 + if {*}" && "(!($>%5)" || "$nb_matches<=10) + +r. $wsiz,1,100% + to. "Scale "$scale/$nb_scales1": "{round(100*($>+1)/$nb_matches)}%,5,2,24 w. -1,-1,0 rm. + fi + if $is_window" && "!{*} break fi + if $diff<1 break fi + done + rm[-3,-1] + fi + if $is_window" && "!{*} break fi + done + if $is_window" && "!{*} k[0,1] break fi + + # Do final rendering. + +warp_patch[1] .,$patchsize_synthesis_final,$patchsize_synthesis_final,1 c. 0,255 + rv[0,-1] rm[-2,-1] + endl done rm. + um stylize_match #@cli tetris : _scale>0 #@cli : Apply tetris effect on selected images. @@ -17182,9 +21117,9 @@ #@cli : $ image.jpg +tetris 10 tetris : skip ${1=10} e[^-1] "Apply tetris effect on image$?, with scale $1." - v - repeat $! l[$>] + repeat $! l[$>] wh={w},{h},1,{s} r $1%,$1%,$1%,100%,2 n 0,255 quantize 10,1,0 r $wh b 2 sharpen 300,1 - endl done v + + endl done #@cli warhol : _M>0,_N>0,_smoothness>=0,_color>=0 #@cli : Create MxN Andy Warhol-like artwork from selected images. @@ -17192,24 +21127,26 @@ #@cli : $ image.jpg warhol 3,3,3,40 warhol : skip ${1=3},${2=$1},${3=2},${4=20} e[^-1] "Create $1x$2 Andy Warhol-like artwork from image$?." - v - r0={100/max($1,$2)} + r0={100/max($1,$2)} repeat $! l[$>] norm b $3 r $r0%,$r0%,1,100%,2 quantize 6 n 0,5 round 1 repeat $1 repeat $2 (0,1,2,3,4,5) n. 32,224 6,1,1,2,128 noise. $4,0 c. 0,255 a[-2,-1] c ycbcr2rgb. +map[0] . rm.. done done append_tiles[^0] $1,$2 nm[1] {0,n} rm[0] - endl done v + + endl done -#@cli weave : _density>=0,0<=_thickness<=100,0<=_shadow<=100,_shading>=0,_fibers_amplitude>=0,_fibers_smoothness>=0,_angle,-1<=_x_curvature<=1,-1<=_y_curvature<=1 +#@cli weave : _density>=0,0<=_thickness<=100,0<=_shadow<=100,_shading>=0,_fibers_amplitude>=0,_fibers_smoothness>=0,\ +# _angle,-1<=_x_curvature<=1,-1<=_y_curvature<=1 #@cli : Apply weave effect to the selected images. #@cli : 'angle' can be { 0=0 deg. | 1=22.5 deg. | 2=45 deg. | 3=67.5 deg. }. -#@cli : Default values: 'density=6', 'thickness=65', 'shadow=40', 'shading=0.5', 'fibers_amplitude=0', 'fibers_smoothness=0', 'angle=0' and 'curvature_x=curvature_y=0' +#@cli : Default values: 'density=6', 'thickness=65', 'shadow=40', 'shading=0.5', 'fibers_amplitude=0', _ +# 'fibers_smoothness=0', 'angle=0' and 'curvature_x=curvature_y=0' #@cli : $ image.jpg weave , weave : check "${1=6}>=0 && ${2=65}>=0 && $2<=100 && ${3=40}>=0 && $3<=100 && ${4=0.5}>=0" check "${5=0}>=0 && ${6=0}>=0 && ${7=0}>=0 && $7<=3 && ${8=0}>=-1 && $8<=1 && ${9=0}>=-1 && $9<=1" e[^-1] "Apply weave effect to image$?, with $1 strips, thickness $2, shadow $3, shading $4, "\ "fibers amplitude $5 and fibers smoothness $6, angle "{$7*22.5}" deg. and curvatures ($8,$9)." - v - repeat $! l[$>] split_opacity l[0] + repeat $! l[$>] split_opacity l[0] w={round(max(w,h)/$1,1,1)} h=$w s={(100-$3)*255%} p={max(0.01,$4)} # Create patterns. @@ -17228,7 +21165,7 @@ # Render full pattern and merge. /[-2,-1] 255 . ... a[-4,-2] x a[-2,-1] x a[-2,-1] y rotate_tileable. {$7*22.5} r. ..,..,1,1,0,2 *[-2,-1] - endl a c endl done v + + endl a c endl done #@cli whirls : _texture>=0,_smoothness>=0,_darkness>=0,_lightness>=0 #@cli : Add random whirl texture to selected images. @@ -17236,10 +21173,10 @@ #@cli : $ image.jpg +whirls , whirls : skip ${1=3},${2=6},${3=0.5},${4=1.8} e[^-1] "Add random whirl texture to image$?, with texture $1, smoothness $2, darkness $3 and lightness $4." - v - repeat $! l[$>] + repeat $! l[$>] 100%,100% noise. 0.3,2 ==. 1 repeat $1 b. $2 +. 0.1 gradient_norm. ^. 0.2 done n. $3,$4 r. .. * c 0,255 - endl done v + + endl done #------------------------------------ # @@ -17254,28 +21191,30 @@ #@cli : $ image.jpg +deform[0] 10 +deform[0] 20 deform : skip ${1=10},${2=1} e[^-1] "Apply random smooth deformation on image$?, with amplitude $1." - v - repeat $! l[$>] + repeat $! l[$>] 2%,2%,1,2 noise. $1 r. ..,..,1,2,5 warp.. .,1,$2,1 rm. - endl done v + + endl done -#@cli euclidean2polar : _center_x[%],_center_y[%],_stretch_factor>0,_boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror } +#@cli euclidean2polar : _center_x[%],_center_y[%],_stretch_factor>0,\ +# _boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror } #@cli : Apply euclidean to polar transform on selected images. #@cli : Default values: 'center_x=center_y=50%', 'stretch_factor=1' and 'boundary_conditions=1'. #@cli : $ image.jpg +euclidean2polar , euclidean2polar : skip ${1=50%},${2=50%} check "${3=1}>0 && isint(${4=1}) && $4>=0 && $4<=3" - e[^-1] "Apply euclidean to polar transform on image$?, with center point ($1,$2), stretch factor $3 and "${"arg 1+$4,dirichlet,neumann,periodic,mirror"}" boundary conditions." - v - repeat $! l[$>] + e[^-1] "Apply euclidean to polar transform on image$?, with center point ($1,$2), stretch factor $3 and "\ + ${"arg 1+$4,dirichlet,neumann,periodic,mirror"}" boundary conditions." + repeat $! l[$>] cx={if(${is_percent\ $1},$1*(w-1),$1)} cy={if(${is_percent\ $2},$2*(h-1),$2)} R={sqrt(max($cx^2,(w-1-$cx)^2)+max($cy^2,(h-1-$cy)^2))} f 'r=$R*(x/(w-1))^$3;a=y*2*pi/(h-1);i($cx+r*cos(a),$cy+r*sin(a),z,c,1,$4)' - endl done v + + endl done #@cli equirectangular2nadirzenith #@cli : Transform selected equirectangular images to nadir/zenith rectilinear projections. equirectangular2nadirzenith : e[^-1] "Transform equirectangular image$? to nadir/zenith rectilinear projections." - v - repeat $! l[$>] + repeat $! l[$>] 100%,100%,1,2 sh. 100% f. " @@ -17294,7 +21233,7 @@ (Y+=0.5)*=h; i(#-2) = X; Y;" warp[0] [1],0,0,1 k... - endl done v + + endl done #@cli fisheye : _center_x,_center_y,0<=_radius<=100,_amplitude>=0 #@cli : Apply fish-eye deformation on selected images. @@ -17302,35 +21241,39 @@ #@cli : $ image.jpg +fisheye , fisheye : skip ${1=50},${2=50},${3=50},${4=1.2} e[^-1] "Apply Fish-eye effect on image$?, centered at ($1%,$2%) with radius $3% and amplitude $4." - if {$4==0} return fi - v - repeat $! l[$>] + if $4==0 return fi + repeat $! l[$>] 100%,100%,1,1 =. 1,$1%,$2% distance. 1 c. 0,$3% *. -1 n. 0,1 ^. {1/$4} i.. ({-$1/100},{1-$1/100};{-$1/100},{1-$1/100}^{-$2/100},{-$2/100};{1-$2/100},{1-$2/100}) r.. .,.,1,2,3 n. 0,{max(w,h)} *[-2,-1] warp.. .,1,1,1 rm. - endl done v + + endl done -#@cli flower : _amplitude,_frequency,_offset_r[%],_angle,_center_x[%],_center_y[%],_boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror} +#@cli flower : _amplitude,_frequency,_offset_r[%],_angle,_center_x[%],_center_y[%],\ +# _boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror} #@cli : Apply flower deformation on selected images. -#@cli : Default values: 'amplitude=30', 'frequency=6', 'offset_r=0', 'angle=0', 'center_x=center_y=50%' and 'boundary_conditions=3'. +#@cli : Default values: 'amplitude=30', 'frequency=6', 'offset_r=0', 'angle=0', 'center_x=center_y=50%' \ +# and 'boundary_conditions=3'. #@cli : $ image.jpg flower , flower : skip ${1=30},${2=6},${3=0},${4=0},${5=50%},${6=50%},${7=3} - e[^-1] "Apply flower deformation on image$?, with amplitude $1, frequency $2, offset $3, angle $4 deg. and center point ($1,$2)." - v - if ${"is_percent $3"} + e[^-1] "Apply flower deformation on image$?, with amplitude $1, frequency $2, offset $3, angle $4 deg. and + center point ($1,$2)." + if ${"is_percent $3"} transform_polar "r + (R*$3) + R*$1/100*cos(a*$2+$4*pi/180)","a",$5,$6,$7 else transform_polar "r + $3 + R*$1/100*cos(a*$2+$4*pi/180)","a",$5,$6,$7 - fi v + + fi -#@cli kaleidoscope : _center_x[%],_center_y[%],_radius,_angle,_boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror } +#@cli kaleidoscope : _center_x[%],_center_y[%],_radius,_angle,\ +# _boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror } #@cli : Create kaleidoscope effect from selected images. #@cli : Default values: 'center_x=center_y=50%', 'radius=100', 'angle=30' and 'boundary_conditions=3'. #@cli : $ image.jpg +kaleidoscope , kaleidoscope : skip ${1=50%},${2=50%},${3=100},${4=30},${5=3} e[^-1] "Create kaleidoscope effect from image$?, with center point ($1,$2), radius $3, angle $4 deg." - v - euclidean2polar $1,$2,1,$5 repeat $! l[$>] + euclidean2polar $1,$2,1,$5 repeat $! l[$>] +columns 0,$3% rows. 0,$4% r. ..,0,2 nm[1] {0,n} rm[0] - endl done polar2euclidean $1,$2,1,$5 v + + endl done polar2euclidean $1,$2,1,$5 #@cli map_sphere : _width>0,_height>0,_radius,_dilation>0,_fading>=0,_fading_power>=0 #@cli : Map selected images on a sphere. @@ -17338,7 +21281,7 @@ #@cli : $ image.jpg map_sphere , map_sphere : check "${1=512}>0 && ${2=512}>0 && ${5=0}>=0 && ${6=0.5}>=0" skip ${3=100},${4=0.5} e[^-1] "Map image$? on spheres in $1x$2 images, with radius $3, dilation $4 and fading $5." - v - r2={($3*min($1,$2)/200)^2} # Compute squared radius. + r2={($3*min($1,$2)/200)^2} # Compute squared radius. repeat $! l[$>] i.. 100%,1,1,100%,0 nm[0] {1,n} a y # Add one border line to have a sphere exterior. ({-$1/2},{$1/2}) ({-$2/2};{$2/2}) r[-2,-1] $1,$2,1,1,3 atan2. .. rm.. # Compute theta angle. @@ -17350,13 +21293,13 @@ r[-1,-2] 100%,100%,{-3,d} +f. z a[-3--1] c warp.. .,0,1,1 rm. # Apply image warping - endl done v + + endl done #@cli nadirzenith2equirectangular #@cli : Transform selected nadir/zenith rectilinear projections to equirectangular images. nadirzenith2equirectangular : e[^-1] "Transform nadir/zenith rectilinear projection$? to equirectangular images." - v - repeat $! l[$>] + repeat $! l[$>] 100%,100%,1,2 sh. 100% f. " @@ -17380,20 +21323,25 @@ (yy+=0.5)*=h; i(#-2) = xx; yy;" to_a[0] warp[0] [1],0,0,0 k... - endl done v + + endl done -#@cli polar2euclidean : _center_x[%],_center_y[%],_stretch_factor>0,_boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror } +#@cli polar2euclidean : _center_x[%],_center_y[%],_stretch_factor>0,\ +# _boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror } #@cli : Apply euclidean to polar transform on selected images. #@cli : Default values: 'center_x=center_y=50%', 'stretch_factor=1' and 'boundary_conditions=1'. #@cli : $ image.jpg +euclidean2polar , polar2euclidean : skip ${1=50%},${2=50%} check "${3=1}>0 && isint(${4=1}) && $4>=0 && $4<=3" - e[^-1] "Apply polar to euclidean transform on image$?, with center point ($1,$2), stretch factor $3 and "${"arg 1+$4,dirichlet,neumann,periodic,mirror"}" boundary conditions." - v - repeat $! l[$>] + e[^-1] "Apply polar to euclidean transform on image$?, with center point ($1,$2), stretch factor $3 and "\ + ${"arg 1+$4,dirichlet,neumann,periodic,mirror"}" boundary conditions." + repeat $! l[$>] cx={if(${is_percent\ $1},$1*(w-1),$1)} cy={if(${is_percent\ $2},$2*(h-1),$2)} R={sqrt(max($cx^2,(w-1-$cx)^2)+max($cy^2,(h-1-$cy)^2))} - f 'X=sqrt((x-$cx)^2+(y-$cy)^2);tmp=atan2((y-$cy),(x-$cx));Y=if(tmp<0,tmp+2*pi,tmp);i((X/$R)^(1/$3)*(w-1),Y*(h-1)/(2*pi),z,c,1,$4)' - endl done v + + f "X = sqrt((x-"$cx")^2+(y-"$cy")^2); + tmp = atan2((y-"$cy"),(x-"$cx")); + Y = if(tmp<0,tmp+2*pi,tmp); + i((X/"$R")^(1/$3)*(w-1),Y*(h-1)/(2*pi),z,c,1,$4)" + endl done #@cli raindrops : _amplitude,_density>=0,_wavelength>=0,_merging_steps>=0 #@cli : Apply raindrops deformation on selected images. @@ -17401,7 +21349,7 @@ #@cli : $ image.jpg +raindrops , raindrops : check "${2=0.1}>=0 && ${3=1}>=0 && isint(${4=0}) && $4>=0" skip ${1=80} e[^-1] "Apply raindrops deformation on image$?, with amplitude $1, density $2, wavelength $3 and $4 merging steps." - v - repeat $! l[$>] + repeat $! l[$>] 100%,100% noise. $2,2 ==. 1 distance. 1 f. 'cos(i)/(1+i/(1e-8+$3))' if $4 i.. (0,1,0;1,0,1;0,1,0) /.. 2 . @@ -17409,7 +21357,7 @@ fi g. a[-2,-1] c *. {$1/(1e-5+max(abs(im),abs(iM)))} warp.. .,1 rm. - endl done v + + endl done #@cli ripple : _amplitude,_bandwidth,_shape={ 0=bloc | 1=triangle | 2=sine | 3=sine+ | 4=random },_angle,_offset #@cli : Apply ripple deformation on selected images. @@ -17417,7 +21365,6 @@ #@cli : $ image.jpg +ripple , ripple : skip ${1=10},${2=20},${3=2},${4=0},${5=0} e[^-1] "Apply ripple deformation on image$?, with amplitude $1, bandwidth $2, shape $3, angle $4 deg. and offset $5." - v - theta={$4*pi/180} C={cos($theta)} S={-sin($theta)} repeat $! l[$>] 100%,100%,1,1,"x" -. {w/2} 100%,100%,1,1,'y' @@ -17425,7 +21372,7 @@ _ripple$3. $1,$2 # Generate warp field. +*. {-$S} *.. $C a[-2,-1] c # Rotate warp field. warp.. .,1 rm. - endl done v + + endl done _ripple0 : f {$1/2}*"(1-2*(i%"{2*$2}"<$2))" _ripple1 : f "I=(i%$2)/$2;$1*(2*if(I<0.5,I,1-I)-0.5)" @@ -17433,24 +21380,29 @@ _ripple3 : f {-$1/2}*"abs(cos(i*"{2*pi/$2}"))" _ripple4 : skip $* n 0,{h-1} 1,{h} rand. {-$1/2},{$1/2} m={im} M={iM} b. {$2/10} n. $m,$M map.. . rm. -#@cli rotoidoscope : _center_x[%],_center_y[%],_tiles>0,_smoothness[%]>=0,_boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror } +#@cli rotoidoscope : _center_x[%],_center_y[%],_tiles>0,_smoothness[%]>=0,\ +# _boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror } #@cli : Create rotational kaleidoscope effect from selected images. -#@cli : Default values: 'cx=cy=50%', 'tiles=10', 'smoothness=1' and 'boundary_conditions=3'. +#@cli : Default values: 'center_x=center_y=50%', 'tiles=10', 'smoothness=1' and 'boundary_conditions=3'. #@cli : $ image.jpg +rotoidoscope , rotoidoscope : skip ${1=50%},${2=50%},${5=1} check "${3=10}>0 && ${4=3}>=0" e[^-1] "Create rotational kaleidoscope effect from image$?, with center point ($1,$2), $3 tiles and smoothness $4." - v - repeat $! l[$>] + repeat $! l[$>] repeat $3 +rotate[0] {360/$3},1,$5,$1,$2 blend_edges $4 done - endl done v + + endl done -#@cli spherize : _radius[%]>=0,_strength,_smoothness[%]>=0,_center_x[%],_center_y[%],_ratio_x/y>0,_angle,_interpolation +#@cli spherize : _radius[%]>=0,_strength,_smoothness[%]>=0,_center_x[%],_center_y[%],_ratio_x/y>0,_angle,\ +# _interpolation #@cli : Apply spherize effect on selected images. -#@cli : Default values: 'radius=50%', 'strength=1', 'smoothness=0', 'center_x=center_y=50%', 'ratio_x/y=1', 'angle=0' and 'interpolation=1'. +#@cli : Default values: 'radius=50%', 'strength=1', 'smoothness=0', 'center_x=center_y=50%', 'ratio_x/y=1', \ +# 'angle=0' and 'interpolation=1'. #@cli : $ image.jpg grid 5%,5%,0,0,0.6,255 spherize , -spherize : check "${1=50%}>=0 && ${3=0}>=0 && ${6=1}>0 && isint(${8=1}) && $8>=0 && $8<=2" skip "${2=1},${4=50%},${5=50%},${7=0}" - e[^-1] "Apply spherize effect on image$?, with radius $1, strength $2, smoothness $3, center ($4,$5), x/y-ratio $6, angle $7 and "${"arg 1+$8,nearest-neighbor,linear,cubic"}" interpolation." - if {!$1||!$2} return fi - v - repeat $! l[$>] +spherize : check "${1=50%}>=0 && ${3=0}>=0 && ${6=1}>0 && isint(${8=1}) && $8>=0 && $8<=2" + skip "${2=1},${4=50%},${5=50%},${7=0}" + e[^-1] "Apply spherize effect on image$?, with radius $1, strength $2, smoothness $3, center ($4,$5), + x/y-ratio $6, angle $7 and "${"arg 1+$8,nearest-neighbor,linear,cubic"}" interpolation." + if !$1||!$2 return fi + repeat $! l[$>] rmax={${"is_percent $1"}?0.5*sqrt((w-1)^2+(h-1)^2)*$1:$1} centerx={${"is_percent $4"}?(w-1)*$4:$4} centery={${"is_percent $5"}?(h-1)*$5:$5} @@ -17476,15 +21428,15 @@ xy = center + f*xy/(f + z)*m2wh1" b. $3 warp.. .,0,$8,1 rm. - endl done v + + endl done -#@cli symmetrize : _x[%],_y[%],_angle,_boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror },_is_antisymmetry={ 0 | 1 },_swap_sides={ 0 | 1 } +#@cli symmetrize : _x[%],_y[%],_angle,_boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror },\ +# _is_antisymmetry={ 0 | 1 },_swap_sides={ 0 | 1 } #@cli : Symmetrize selected images regarding specified axis. #@cli : Default values: 'x=y=50%', 'angle=90', 'boundary_conditions=3', 'is_antisymmetry=0' and 'swap_sides=0'. #@cli : $ image.jpg +symmetrize 50%,50%,45 +symmetrize[-1] 50%,50%,-45 symmetrize : skip ${1=50%},${2=50%},${3=90},${4=3},${5=0},${6=0} e[^-1] "Symmetrize image$?, regarding axis ($1,$2,$3 deg.)." - v - theta={$3*pi/180} u={cos($theta)} v={sin($theta)} if $6 symmetry_cond=A<0 else symmetry_cond=A>0 fi repeat $! l[$>] @@ -17494,49 +21446,51 @@ else f 'A=($y0-y)*$u-($x0-x)*$v;X=x-2*$v*A;Y=y+2*$u*A;if($symmetry_cond,i(X,Y,z,c,1,$4),i)' fi endl done - v + -#@cli transform_polar : "expr_radius",_"expr_angle",_center_x[%],_center_y[%],_boundary_conditions={ 0=dirichlet | 1=neumann } +#@cli transform_polar : "expr_radius",_"expr_angle",_center_x[%],_center_y[%],\ +# _boundary_conditions={ 0=dirichlet | 1=neumann } #@cli : Apply user-defined transform on polar representation of selected images. #@cli : Default values: 'expr_radius=R-r', 'expr_rangle=a', 'center_x=center_y=50%' and 'boundary_conditions=1'. #@cli : $ image.jpg +transform_polar[0] R*(r/R)^2,a +transform_polar[0] r,2*a transform_polar : skip "${1=R-r}","${2=a}",${3=50%},${4=50%},${5=1} e[^-1] "Apply custom polar transform with 'new_r = $1', 'new_a = $2', center point ($3%,$4%)." - v - repeat $! l[$>] + repeat $! l[$>] cx={if(${is_percent\ $3},$3*(w-1),$3)} cy={if(${is_percent\ $4},$4*(h-1),$4)} R={sqrt(max($cx^2,(w-1-$cx)^2)+max($cy^2,(h-1-$cy)^2))} f "R ="$R"; r = sqrt((x-"$cx")^2 + (y-"$cy")^2); a = atan2(y-"$cy",x-"$cx"); - nr = $1; - na = $2; + nr = ($1); + na = ($2); i("$cx" + nr*cos(na), "$cy" + nr*sin(na), z, c,1,$5)" - endl done v + + endl done -#@cli twirl : _amplitude,_center_x[%],_center_y[%],_boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror } +#@cli twirl : _amplitude,_center_x[%],_center_y[%],\ +# _boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror } #@cli : Apply twirl deformation on selected images. #@cli : Default values: 'amplitude=1', 'center_x=center_y=50%' and 'boundary_conditions=3'. #@cli : $ image.jpg twirl 0.6 twirl : skip ${1=1},${2=50%},${3=50%},${4=3} e[^-1] "Apply twirl deformation on image$?, with amplitude $1 and center point at ($2%,$3%)." - v - euclidean2polar $2,$3,1,$4 repeat $! + euclidean2polar $2,$3,1,$4 repeat $! [$>],[$>],1,1,$1*x channels. -1,0 warp[$>] .,1,1,2 rm. - done polar2euclidean $2,$3,1,1 v + + done polar2euclidean $2,$3,1,1 -#@cli warp_perspective : _x-angle,_y-angle,_zoom>0,_x-center,_y-center,_boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror } +#@cli warp_perspective : _x-angle,_y-angle,_zoom>0,_x-center,_y-center,\ +# _boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror } #@cli : Warp selected images with perspective deformation. #@cli : Default values: 'x-angle=1.5', 'y-angle=0', 'zoom=1', 'x-center=y-center=50' and 'boundary_conditions=2'. #@cli : $ image.jpg warp_perspective , warp_perspective : skip ${1=1.5},${2=0},${3=1},${4=50},${5=50},${6=2} e[^-1] "Apply perspective warp on image$?, with angles ($1 deg.,$2 deg.), zoom $3 and offsets ($4,$5)." - v - repeat $! l[$>] + repeat $! l[$>] (0,100) -. $4 /. 100 (0;100) -. $5 /. 100 r[-2,-1] ...,...,...,1,3 +*.. $2 +*.. $1 +[-2,-1] +. $3 /... . /[-2,-1] *.. 100 +.. $4 /.. 100 *.. {-3,w} *. 100 +. $5 /. 100 *. {-3,h} a[-2,-1] c warp.. .,0,1,$6 rm. - endl done v + + endl done #@cli water : _amplitude,_smoothness>=0,_angle #@cli : Apply water deformation on selected images. @@ -17544,9 +21498,10 @@ #@cli : $ image.jpg water , water : check ${2=1.5}>=0 skip ${1=30},${3=1},${4=45} e[^-1] "Apply water deformation on image$?, with amplitude $1, smoothness $2 and angle $3." - v - repeat $! l[$>] - 25%,25%,25%,1 noise. $1 g. xy *.. {-sin($3*pi/180)} *. {cos($3*pi/180)} +[-2,-1] b. $2 *. 2 r. ..,..,1,2,3 warp.. .,1 rm. - endl done v + + repeat $! l[$>] + 25%,25%,25%,1 noise. $1 g. xy *.. {-sin($3*pi/180)} *. {cos($3*pi/180)} +[-2,-1] b. $2 *. 2 + r. ..,..,1,2,3 warp.. .,1 rm. + endl done #@cli wave : _amplitude>=0,_frequency>=0,_center_x,_center_y #@cli : Apply wave deformation on selected images. @@ -17554,20 +21509,20 @@ #@cli : $ image.jpg wave , wave : skip ${1=4},${2=0.4},${3=50},${4=50} e[^-1] "Apply wave deformation on image$?, with amplitude $1, frequency $2 and center point at ($3%,$4%)." - v - repeat $! l[$>] + repeat $! l[$>] 100%,100% =. 1,$3%,$4% distance. 1 *. $2 +sin. cos.. a[-2,-1] c *. $1 warp.. .,1 rm. - endl done v + + endl done #@cli wind : _amplitude>=0,_angle,0<=_attenuation<=1,_threshold #@cli : Apply wind effect on selected images. #@cli : Default values: 'amplitude=20', 'angle=0', 'attenuation=0.7' and 'threshold=20'. #@cli : $ image.jpg +wind , wind : check "isint(${1=20}) && $1>=0 && ${3=0.7}>=0 && $3<=1" skip "${2=0},${4=20}" - e[^-1] "Apply wind effect on image$?, with amplitude $1, angle "{round($2/45)*45}" deg., attenuation $3 and threshold $4." - if {!$1} return fi - v - + e[^-1] "Apply wind effect on image$?, with amplitude $1, angle "{round($2/45)*45}" deg., attenuation $3 + and threshold $4." + if !$1 return fi dxdy=${-_wind{round($2/45)%8}} fact={(1-$3)^(1/$1)} repeat $! l[$>] @@ -17577,7 +21532,7 @@ shift. $dxdy,0,0,0 max.. . *. $fact remove_pixels. {100/$1}% done rm. - endl done v + + endl done _wind0 : u 1,0 _wind1 : u 1,1 @@ -17594,8 +21549,8 @@ #@cli : $ image.jpg +zoom[0] 0.6 +zoom[0] 1.5 zoom : skip ${1=2},${2=0.5},${3=0.5},${4=0.5},${5=0} e[^-1] "Apply zoom effect on image$?, with factor $1 and center ($2,$3)." - v - repeat $! l[$>] - if {d==1} # 2D image. + repeat $! l[$>] + if d==1 # 2D image. ({(w-1)*$2*(1-1/$1)},{(w-1)*($2+(1-$2)/$1)}) ({({-2,h}-1)*$3*(1-1/$1)};{({-2,h}-1)*($3+(1-$3)/$1)}) r[-2--1] ...,...,1,1,3 a[-2--1] c warp.. .,0,1,$5 @@ -17606,7 +21561,7 @@ r[-3--1] [-4],[-4],[-4],1,3 a[-3--1] c warp.. .,0,1,$5 fi rm. - endl done v + + endl done #----------------------------- # @@ -17620,10 +21575,10 @@ #@cli : $ image.jpg +cracks , cracks : check "${1=25}>=0" skip ${2=0},${3=1},${4=0} e[^-1] "Add random cracks to image$?, with density $1, opacity $3 and color (${4--1})." - v - repeat $! l[$>] cut={[im,iM]} + repeat $! l[$>] cut={[im,iM]} 100%,100%,1,2,'u<0.25*($1%)^4?[u,1]:[0,0]' s. c distance. 1 *. -1 watershed.. . rm. - +dilate. 3 -[-2,-1] !=. 0 thinning. 1 + +dilate. 3 -[-2,-1] !=. 0 # thinning. 1 if $2 f. "i?i:j(1)?2:j(-1)?0.5:i" n. 0,1 +fc.. ${4--1} *. .. !=.. 0 j... .,0,0,0,0,$3,.. @@ -17631,7 +21586,7 @@ +fc.. ${4--1} j... .,0,0,0,0,$3,.. fi k[0] - endl done v + + endl done #@cli light_patch : _density>0,_darkness>=0,_lightness>=0 #@cli : Add light patches to selected images. @@ -17639,10 +21594,10 @@ #@cli : $ image.jpg +light_patch 20,0.9,4 light_patch : skip ${1=10},${2=0.9},${3=1.7} e[^-1] "Apply light patches to image$?, with density $1, darkness $2 and lightness $3." - v - repeat $! l[$>] + repeat $! l[$>] n 0,255 $1,$1 noise. 40 r. ..,5 c. 0,255 n. $2,$3 * c 0,255 - endl done v + + endl done #@cli noise_hurl : _amplitude>=0 #@cli : Add hurl noise to selected images. @@ -17650,11 +21605,11 @@ #@cli : $ image.jpg +noise_hurl , noise_hurl : skip ${1=10} e[^-1] "Add hurl noise to image$?, with amplitude $1%." - v - repeat $! l[$>] - +f 0 noise. 10 n. {-2,[im,iM]} 100%,100%,1,1,-2 - noise. $1,2 >=. 0 r. .. + repeat $! l[$>] + +f 0 noise. 10 n. {-2,[im,iM]} 100%,100% + noise. $1,2 >. 0 r. .. *.. . *. -1 +. 1 *[-3,-1] + - endl done v + + endl done #@cli pixelize : _scale_x>0,_scale_y>0,_scale_z>0 #@cli : Pixelize selected images with specified scales. @@ -17662,15 +21617,14 @@ #@cli : $ image.jpg +pixelize , pixelize : skip ${1=20},${2=$1},${3=$1} e[^-1] "Pixelize image$? with scales ($1%,$2%,$3%)." - v - repeat $! l[$>] whd={w},{h},{d} r $1%,$2%,$3%,100%,2 r $whd endl done v + + repeat $! l[$>] whd={w},{h},{d} r $1%,$2%,$3%,100%,2 r $whd endl done #@cli scanlines : _amplitude,_bandwidth,_shape={ 0=bloc | 1=triangle | 2=sine | 3=sine+ | 4=random },_angle,_offset #@cli : Apply ripple deformation on selected images. #@cli : Default values: 'amplitude=60', 'bandwidth=2', 'shape=0', 'angle=0' and 'offset=0'. -#@cli : $ image.jpg +ripple , +#@cli : $ image.jpg +scanlines , scanlines : skip ${1=60},${2=2},${3=0},${4=0},${5=0} e[^-1] "Apply scanlines effect on image$?, with amplitude $1, bandwidth $2, shape $3, angle $4 deg. and offset $5." - v - theta={$4*pi/180} C={cos($theta)} S={-sin($theta)} repeat $! l[$>] 100%,100%,1,1,"x" -. {w/2} 100%,100%,1,1,'y' @@ -17678,17 +21632,18 @@ _ripple$3. $1,$2 # Generate warp field. n. {-$1},$1 + cut 0,255 - endl done v + + endl done #@cli shade_stripes : _frequency>=0,_direction={ 0=horizontal | 1=vertical },_darkness>=0,_lightness>=0 #@cli : Add shade stripes to selected images. #@cli : Default values: 'frequency=5', 'direction=1', 'darkness=0.8' and 'lightness=2'. #@cli : $ image.jpg +shade_stripes 30 shade_stripes : skip ${1=5},${2=1},${3=0.8},${4=2} - e[^-1] "Add "${arg\ 1+!$2,vertical,horizontal}" shaded stripes to image$?, with frequency $1, darkness $3 and lightness $4." - v - n 0,255 repeat $! l[$>] + e[^-1] "Add "${arg\ 1+!$2,vertical,horizontal}" shaded stripes to image$?, with frequency $1, darkness $3 and + lightness $4." + n 0,255 repeat $! l[$>] {max(1,w*($2!=0))},{max(1,h*($2==0))} noise. $1,2 ==. 1 distance. 1 r. .. n. $3,$4 * c 0,255 - endl done v + + endl done #@cli shadow_patch : _opacity>=0 #@cli : Add shadow patches to selected images. @@ -17696,11 +21651,11 @@ #@cli : $ image.jpg +shadow_patch 0.4 shadow_patch : skip ${1=0.7} e[^-1] "Apply shadow patches to image$?, with opacity $1." - v - repeat $! l[$>] + repeat $! l[$>] 100%,100%,1,1 shift. -2,-2 shift. 1,1 plasma. 3,0.3,8 abs. b. 1 c. 3%,15% r. .. n. $1,1 * - endl done v + + endl done #@cli spread : _dx>=0,_dy>=0,_dz>=0 #@cli : Spread pixel values of selected images randomly along x,y and z. @@ -17708,13 +21663,13 @@ #@cli : $ image.jpg +spread 3 spread : skip ${1=3},${2=$1},${3=0} e[^-1] "Spread pixel of image$? randomly, with amplitudes ($1,$2,$3)." - v - repeat $! l[$>] + repeat $! l[$>] 100%,100%,100%,3 sh. 0 rand. {-$1},$1 rm. sh. 1 rand. {-$2},$2 rm. sh. 2 rand. {-$3},$3 rm. warp.. .,1 rm. - endl done v + + endl done #@cli stripes_y : _frequency>=0 #@cli : Add vertical stripes to selected images. @@ -17722,10 +21677,10 @@ #@cli : $ image.jpg +stripes_y , stripes_y : skip ${1=10} e[^-1] "Add vertical stripes to image$?, with frequency $1." - v - repeat $! l[$>] + repeat $! l[$>] 100% noise. $1,2 ==. 1 *. 255 r. .. *. 0.15 + c 0,255 - endl done v + + endl done #@cli texturize_canvas : _amplitude>=0,_fibrousness>=0,_emboss_level>=0 #@cli : Add paint canvas texture to selected images. @@ -17733,23 +21688,22 @@ #@cli : $ image.jpg +texturize_canvas , texturize_canvas : check "${1=20}>=0 && ${2=3}>=0 && ${3=0.6}>=0 && ${4=80}" e[^-1] "Add canvas texture to image$?, with amplitude $1, fibrousness $2 and emboss level $3." - v - repeat $! l[$>] {w},{h} rand. 0,255 +blur_x. $2 blur_y.. $2 +[-2,-1] g. a[-2,-1] c +compose_channels. + orientation.. compose_channels.. + n.. $3,1 n. 0,255 sharpen. 80 *[-2,-1] n. -$1,$1 + c 0,255 - endl done v + + endl done #@cli texturize_paper #@cli : Add paper texture to selected images. #@cli : $ image.jpg +texturize_paper texturize_paper : e[^-1] "Add paper texture to image$?." - v - repeat $! l[$>] + repeat $! l[$>] . 30%,30% noise. 1,2 ==. 1 r. ..,..,..,1,0 ifft. rm. shift. {round(w/2)},{round(h/2)},{round(d/2)},0,2 sharpen. 1 n. 1,1.2 r. .. *[-2,-1] c. ..,.. rm.. - endl done v + + endl done #@cli vignette : _strength>=0,0<=_radius_min<=100,0<=_radius_max<=100 #@cli : Add vignette effect to selected images. @@ -17757,26 +21711,27 @@ #@cli : $ image.jpg vignette , vignette : check "${1=100}>=0 && ${2=70}>=0 && $2<=100 && ${3=90}>=0 && $3<=100" e[^-1] "Add vignette effect to image$?, with strength $1 and size $2." - v - repeat $! l[$>] + repeat $! l[$>] mM={[im,iM]} d={max(w,h)} $d,$d =. 1,50%,50% distance. 1 r. ..,2 c. $2%,$3% n. 0,$1 - c $mM - endl done v + + endl done #@cli watermark_visible : _text,0<_opacity<1,_size>0,_angle,_mode={ 0=remove | 1=add },_smoothness>=0 #@cli : Add or remove a visible watermark on selected images (value range must be [0,255]). #@cli : Default values: 'text=(c) G'MIC', 'opacity=0.3', 'size=53', 'angle=25', 'mode=1' and 'smoothness=0'. #@cli : $ image.jpg watermark_visible ,0.7 -watermark_visible : skip "${1=\251\ G\47MIC}" check "${2=0.3}>0 && $2<1 && ${3=53}>0 && ${6=0.5}>=0" skip ${4=25},${5=1} +watermark_visible : check "${2=0.3}>0 && $2<1 && ${3=53}>0 && ${6=0.5}>=0" + skip "${1=\251\ G\47MIC}",${4=25},${5=1} e[^-1] ${arg\ 1+!$5,Add,Remove}" visible watermark '$1' on image$?, with opacity $2, size $3, angle $4 deg." - v - repeat $! l[$>] + repeat $! l[$>] 0 t. "$1",0,0,$3,1,255 rotate. $4,0,0 b. $6 n. 0,255 r. ..,0,2 +. .. c. 0,255 # Generate opaque watermark image if $5 *. $2 *.. {1-$2} + # Add watermark else *. $2 - / {1-$2} # Remove watermark fi c 0,255 - endl done v + + endl done #-------------------------------------- # @@ -17784,41 +21739,55 @@ # #-------------------------------------- -#@cli blend : [layer],blending_mode,_opacity[%],_selection_is={ 0=base-layers | 1=top-layers } : blending_mode,_opacity[%] -#@cli : Blend selected G,GA,RGB or RGBA images by specified layer or blend all selected images together, using specified blending mode. +#@cli blend : [layer],blending_mode,_opacity[%],_selection_is={ 0=base-layers | 1=top-layers } : \ +# blending_mode,_opacity[%] +#@cli : Blend selected G,GA,RGB or RGBA images by specified layer or blend all selected images together, +#@cli : using specified blending mode. #@cli : 'blending_mode' can be { add | alpha | and | average | blue | burn | darken | difference | #@cli : divide | dodge | edges | exclusion | freeze | grainextract | grainmerge | green | hardlight | #@cli : hardmix | hue | interpolation | lighten | lightness | linearburn | linearlight | luminance | -#@cli : multiply | negation | or | overlay | pinlight | red | reflect | saturation | seamless | seamless_mixed | screen | -#@cli : shapeareamax | shapeareamax0 | shapeareamin | shapeareamin0 | shapeaverage | shapeaverage0 | shapemedian | shapemedian0 | -#@cli : shapemin | shapemin0 | shapemax | shapemax0 | softburn | softdodge | softlight | stamp | subtract | value | vividlight | xor }. +#@cli : multiply | negation | or | overlay | pinlight | red | reflect | saturation | seamless | seamless_mixed | +#@cli : screen | shapeareamax | shapeareamax0 | shapeareamin | shapeareamin0 | shapeaverage | shapeaverage0 | +#@cli : shapemedian | shapemedian0 | shapemin | shapemin0 | shapemax | shapemax0 | softburn | softdodge | +#@cli : softlight | stamp | subtract | value | vividlight | xor }. #@cli : 'opacity' should be in '[0,1]', or '[0,100]' if expressed with a '%'. #@cli : Default values: 'blending_mode=alpha', 'opacity=1' and 'selection_is=0'. #@cli : $ image.jpg +drop_shadow , resize2dy[-1] 200 rotate[-1] 20 +blend alpha display_rgba[-2] #@cli : $ image.jpg testimage2d {w},{h} blend overlay -#@cli : $ command "ex : $""=arg repeat $""# +blend[0,1] ${arg{$>+1}} text_outline[-1] Mode:\" \"${arg{$>+1}},2,2,23,2,1,255 done" image.jpg testimage2d {w},{h} ex add,alpha,and,average,blue,burn,darken -#@cli : $ command "ex : $""=arg repeat $""# +blend[0,1] ${arg{$>+1}} text_outline[-1] Mode:\" \"${arg{$>+1}},2,2,23,2,1,255 done" image.jpg testimage2d {w},{h} ex difference,divide,dodge,exclusion,freeze,grainextract,grainmerge -#@cli : $ command "ex : $""=arg repeat $""# +blend[0,1] ${arg{$>+1}} text_outline[-1] Mode:\" \"${arg{$>+1}},2,2,23,2,1,255 done" image.jpg testimage2d {w},{h} ex green,hardlight,hardmix,hue,interpolation,lighten,lightness -#@cli : $ command "ex : $""=arg repeat $""# +blend[0,1] ${arg{$>+1}} text_outline[-1] Mode:\" \"${arg{$>+1}},2,2,23,2,1,255 done" image.jpg testimage2d {w},{h} ex linearburn,linearlight,luminance,multiply,negation,or,overlay -#@cli : $ command "ex : $""=arg repeat $""# +blend[0,1] ${arg{$>+1}} text_outline[-1] Mode:\" \"${arg{$>+1}},2,2,23,2,1,255 done" image.jpg testimage2d {w},{h} ex pinlight,red,reflect,saturation,screen,shapeaverage,softburn -#@cli : $ command "ex : $""=arg repeat $""# +blend[0,1] ${arg{$>+1}} text_outline[-1] Mode:\" \"${arg{$>+1}},2,2,23,2,1,255 done" image.jpg testimage2d {w},{h} ex softdodge,softlight,stamp,subtract,value,vividlight,xor +#@cli : $ command "ex : $""=arg repeat $""# +blend[0,1] ${arg{$>+1}} \ +# text_outline[-1] Mode:\" \"${arg{$>+1}},2,2,23,2,1,255 done" image.jpg testimage2d {w},{h} \ +# ex add,alpha,and,average,blue,burn,darken +#@cli : $ command "ex : $""=arg repeat $""# +blend[0,1] ${arg{$>+1}} \ +# text_outline[-1] Mode:\" \"${arg{$>+1}},2,2,23,2,1,255 done" image.jpg testimage2d {w},{h} \ +# ex difference,divide,dodge,exclusion,freeze,grainextract,grainmerge +#@cli : $ command "ex : $""=arg repeat $""# +blend[0,1] ${arg{$>+1}} \ +# text_outline[-1] Mode:\" \"${arg{$>+1}},2,2,23,2,1,255 done" image.jpg testimage2d {w},{h} \ +# ex green,hardlight,hardmix,hue,interpolation,lighten,lightness +#@cli : $ command "ex : $""=arg repeat $""# +blend[0,1] ${arg{$>+1}} \ +# text_outline[-1] Mode:\" \"${arg{$>+1}},2,2,23,2,1,255 done" image.jpg testimage2d {w},{h} \ +# ex linearburn,linearlight,luminance,multiply,negation,or,overlay +#@cli : $ command "ex : $""=arg repeat $""# +blend[0,1] ${arg{$>+1}} \ +# text_outline[-1] Mode:\" \"${arg{$>+1}},2,2,23,2,1,255 done" image.jpg testimage2d {w},{h} \ +# ex pinlight,red,reflect,saturation,screen,shapeaverage,softburn +#@cli : $ command "ex : $""=arg repeat $""# +blend[0,1] ${arg{$>+1}} \ +# text_outline[-1] Mode:\" \"${arg{$>+1}},2,2,23,2,1,255 done" image.jpg testimage2d {w},{h} \ +# ex softdodge,softlight,stamp,subtract,value,vividlight,xor blend : skip ${1=alpha},${2=1},${3=1},${4=0} - v - if ${"is_image_arg $1"} n={narg($*)} mode=${arg\ 1+($n>=2),alpha,$2} - v + e[^-1] "Blend image$? with "${arg\ 1+$4,base,top}" layer $1, using '"$mode"' mode and opacity $3." v - - repeat $! pass$1 l[$>,-1] if $4 rv fi blend $mode,$3 endl done v + return + e[^-1] "Blend image$? with "${arg\ 1+$4,base,top}" layer $1, using '"$mode"' mode and opacity $3." + repeat $! pass$1 l[$>,-1] if $4 rv fi blend $mode,$3 endl done return fi - v + e[^-1] "Blend all image$? together, using '$1' mode and opacity $2." v - - repeat {$!-1} l[0,1] + e[^-1] "Blend all image$? together, using '$1' mode and opacity $2." + repeat $!-1 l[0,1] r[1] [0],[0],[0],100%,0,0,0.5,0.5 s={"s0 = s#0<3?1:3; s1 = s<3?1:3; max(s0,s1)"} # Target color format (G or RGB). to_colormode[0] {$s+1-(s#0%2)} # Target format (G,GA,RGB or RGBA). to_colormode[1] {$s+1-(s%2)} # Mask format (G,GA,RGB or RGBA). if {0,"s==2 || s==4"} # Target has alpha. - if {"s==2 || s==4"} # Mask has alpha. + if "s==2 || s==4" # Mask has alpha. sh[0,1] 0,{s-2} _blend_$1[2,3] rm[2,3] - if {['"$1"']=='alpha'} # Special blending code for alpha-mode. + if ['"$1"']=='alpha' # Special blending code for alpha-mode. sh[0,1] 0,{{0,s}-2} sh[0,1] 100% *[2,4] *[3,4] rm[2,3] +channels[1] 100% sh[1] 100% f[3] 255 rm[3] j[0] [1],0,0,0,0,{max(0,min(1,$2))},[2],255 rm[1,2] @@ -17830,14 +21799,14 @@ sh[0] 0,{{0,s}-2} rv[1,2] _blend_$1[1,2] j[1] [2],0,0,0,0,{max(0,min(1,$2))} rm[^0] fi else # Target has no alpha. - if {"s==2 || s==4"} # Mask has alpha. + if "s==2 || s==4" # Mask has alpha. sh[1] 0,{s-2} _blend_$1[0,2] rm[2] sh[1] 100% j[0] [1],0,0,0,0,{max(0,min(1,$2))},[2],255 rm[^0] else # Mask has no alpha. _blend_$1 j[0] [1],0,0,0,0,{max(0,min(1,$2))} rm[1] fi fi - endl done v + + endl done _blend_alpha : _blend_normal : @@ -17910,7 +21879,8 @@ _blend_seamless_mixed : +blend_seamless 1 rm[1] _blend_saturation : - to_color sh 0,2 rgb2hsv[2,3] shift[2,3] 0,0,0,-1,2 sh[2] 1,2 j[1] [4],0,0,0,1 rm[4] shift[2,3] 0,0,0,1,2 hsv2rgb[2,3] rm[2,3] + to_color sh 0,2 rgb2hsv[2,3] shift[2,3] 0,0,0,-1,2 sh[2] 1,2 j[1] [4],0,0,0,1 rm[4] shift[2,3] 0,0,0,1,2 + hsv2rgb[2,3] rm[2,3] _blend_screen : +-[0] 255 -[1] 255 *[1,2] /[1] 255 *[1] -1 +[1] 255 _blend_shapeareamax : @@ -17957,7 +21927,7 @@ if (siz[k]>=hk3,resize(#k3,1,round(1.5*hk3+1),1,s#0,0,0)); end(for (k = 0, k $N,1,1,1,"ic(#"$N"+3+x)" j[2] .,0,0,0,$> rm[-{$N+1}--1] done + repeat s#0 sh[3--1] $> $N,1,1,1,"ic(#"$N"+3+x)" j[2] .,0,0,0,$> rm[-{$N+1}--1] done map[1] [2] k[0,1] _blend_shapemedian0 : f[1] "begin(A = resize([ 0,(s-1)/s ],s,3));I!=0?I+A:I" norm[1] round[1] 0.01 label_fg[1] 0 @@ -17974,7 +21944,7 @@ ); end(for (k = 0, k $N,1,1,1,"ic(#"$N"+3+x)" j[2] .,1,0,0,$> rm[-{$N+1}--1] done + repeat s#0 sh[3--1] $> $N,1,1,1,"ic(#"$N"+3+x)" j[2] .,1,0,0,$> rm[-{$N+1}--1] done map[1] [2] k[0,1] _blend_shapemin : f[1] "begin(A = resize([ 0,(s-1)/s ],s,3));I+A" norm[1] round[1] 0.01 label[1] 0 {iM+1},1,1,{0,s},inf @@ -18017,19 +21987,19 @@ #@cli : $ image.jpg testimage2d {w},{h} +blend_edges 0.8 blend_edges : check {$1>=0} e[^-1] "Blend image$? using 'edges' mode, with smoothness $1." - if {$!>1} v - to_rgb r[^0] [0],0,0,0.5,0.5 repeat $! l[$>] + if $!>1 to_rgb r[^0] [0],0,0,0.5,0.5 repeat $! l[$>] +gradient_norm +. 1 b. $1 n. 1,10 sqr. s.. c *[-4--2] . a[-4--1] c - endl done r[^0] [0],0,0,0.5,0.5 + s. c /[-4--2] . rm. a[-3--1] c v + fi + endl done r[^0] [0],0,0,0.5,0.5 + s. c /[-4--2] . rm. a[-3--1] c fi #@cli blend_fade : [fading_shape] #@cli : Blend selected images together using specified fading shape. #@cli : $ image.jpg testimage2d {w},{h} 100%,100%,1,1,'cos(y/10)' normalize[-1] 0,1 +blend_fade[0,1] [2] blend_fade : e[^-1] "Blend image$? together using fading pattern $1." - v - r ${-max_whds},0 + r ${-max_whds},0 pass$1 0 r. [0],[0],[0],100%,1 max. 0 min. {$!-2} - repeat {$!-1} +-. $> abs. -. 1 *. -1 max. 0 *[$>,-1] done rm. - + v + + repeat $!-1 +-. $> abs. -. 1 *. -1 max. 0 *[$>,-1] done rm. + + _fade : r.. ...,5 r. ..,3 c. $1%,$2% n. 0,1 j... ..,0,0,0,0,1,. rm[-2,-1] @@ -18039,28 +22009,28 @@ #@cli : $ image.jpg testimage2d {w},{h} +mirror[0] y +blend_median blend_median : e[^-1] "Blend image$? using 'median' mode." - if {$!<2} return fi - v - to_colormode 0 r ${-max_whd},100%,0,0,0.5,0.5,0.5 - if {$!==2} + / 2 + if $!<2 return fi + to_colormode 0 r ${-max_whd},100%,0,0,0.5,0.5,0.5 + if $!==2 + / 2 else whds={w},{h},{d},{s} r 100%,100%,{d*s},1,-1 a c 100%,100%,100%,1,"med(I(#0))" k. r $whds,-1 fi - v + #@cli blend_seamless : _is_mixed_mode={ 0 | 1 },_inner_fading[%]>=0,_outer_fading[%]>=0 #@cli : Blend selected images using a seamless blending mode (Poisson-based). #@cli : Default values: 'is_mixed=0', 'inner_fading=0' and 'outer_fading=100%'. blend_seamless : check "${2=0}>=0 && ${3=100%}>=0" skip ${1=0} - v - s0="non-mixed" s1="mixed" - v + e[^-1] "Blend image$? using seamless mode (Poisson-based), in "${s{$1!=0}}" mode with inner fading $2 and outer fading $3." v - + s0="non-mixed" s1="mixed" + e[^-1] "Blend image$? using seamless mode (Poisson-based), in "${s{$1!=0}}" mode with inner fading $2 and + outer fading $3." to_a[^0] r {0,w+32},{0,h+32},1,100%,0,0,0.5,0.5 # Avoid periodic boundaries problems. - if {['$3']!='100%'} # With outer fading. - repeat {$!-1} l[0,1] + if ['$3']!='100%' # With outer fading. + repeat $!-1 l[0,1] +blend_seamless $1,$2,100% channels.. 100% !=.. 0 distance.. 1 iM={-2,iM} ic={if(${is_percent\ $3},2*$3*$iM,1+$3)} - if {$ic<=$iM} c.. 0,{max(1,$ic)} n.. 0,1 + if $ic<=$iM c.. 0,{max(1,$ic)} n.. 0,1 else n.. 0,{max(0,2-$ic/$iM)} fi *.. -1 +.. 1 @@ -18068,7 +22038,7 @@ endl done else # Without outer fading. - repeat {$!-1} l[0,1] + repeat $!-1 l[0,1] # Get background average color. +r[0] 1,1,1,100%,2 avg={^} rm. @@ -18085,10 +22055,10 @@ fi # Compute the desired gradient map. - if {$2} + if $2 distance. 0 iM={iM} ic={if(${is_percent\ $2},2*$2*$iM,1+$2)} - if {$ic<=$iM} c. 0,{max(1,$ic)} n. 0,1 + if $ic<=$iM c. 0,{max(1,$ic)} n. 0,1 else n. 0,{max(0,2-$ic/$iM)} fi fi @@ -18108,7 +22078,7 @@ endl done fi - z 16,16,{w-17},{h-17} v + + z 16,16,{w-17},{h-17} #@cli fade_diamond : 0<=_start<=100,0<=_end<=100 #@cli : Create diamond fading from selected images. @@ -18116,9 +22086,9 @@ #@cli : $ image.jpg testimage2d {w},{h} +fade_diamond 80,85 fade_diamond : skip ${1=70},${2=90} e[^-1] "Create ($1%,$2%) diamond-shaped fading from image$?." - v - repeat {int($!/2)} l[$>,{$>+1}] + repeat int($!/2) l[$>,{$>+1}] (0,1,0;1,1,1;0,1,0) _fade $1,$2 - endl done v + + endl done #@cli fade_linear : _angle,0<=_start<=100,0<=_end<=100 #@cli : Create linear fading from selected images. @@ -18126,9 +22096,9 @@ #@cli : $ image.jpg testimage2d {w},{h} +fade_linear 45,48,52 fade_linear : skip ${1=45},${2=30},${3=70} e[^-1] "Create ($2%,$3%) linear fading from image$?, with angle $1 deg." - v - repeat {int($!/2)} l[$>,{$>+1}] + repeat int($!/2) l[$>,{$>+1}] 64,64,1,1,"x*cos($1*pi/180) + y*sin($1*pi/180)" _fade $2,$3 - endl done v + + endl done #@cli fade_radial : 0<=_start<=100,0<=_end<=100 #@cli : Create radial fading from selected images. @@ -18136,9 +22106,9 @@ #@cli : $ image.jpg testimage2d {w},{h} +fade_radial 30,70 fade_radial : skip ${1=30},${2=70} e[^-1] "Create ($1%,$2%) radial fading from image$?." - v - repeat {int($!/2)} l[$>,{$>+1}] + repeat int($!/2) l[$>,{$>+1}] 100%,100% =. 1,50%,50% distance. 1 _fade $1,$2 - endl done v + + endl done #@cli fade_x : 0<=_start<=100,0<=_end<=100 #@cli : Create horizontal fading from selected images. @@ -18146,7 +22116,7 @@ #@cli : $ image.jpg testimage2d {w},{h} +fade_x 30,70 fade_x : skip ${1=30},${2=70} e[^-1] "Create ($1%,$2%) horizontal fading from image$?." - v - repeat {int($!/2)} l[$>,{$>+1}] (0,1) _fade $1,$2 endl done v + + repeat int($!/2) l[$>,{$>+1}] (0,1) _fade $1,$2 endl done #@cli fade_y : 0<=_start<=100,0<=_end<=100 #@cli : Create vertical fading from selected images. @@ -18154,23 +22124,24 @@ #@cli : $ image.jpg testimage2d {w},{h} +fade_y 30,70 fade_y : skip ${1=30},${2=70} e[^-1] "Create ($1%,$2%) vertical fading from image$?." - v - repeat {int($!/2)} l[$>,{$>+1}] (0;1) _fade $1,$2 endl done v + + repeat int($!/2) l[$>,{$>+1}] (0;1) _fade $1,$2 endl done #@cli fade_z : 0<=_start<=100,0<=_end<=100 #@cli : Create transversal fading from selected images. #@cli : Default values: 'start=30' and 'end=70'. fade_z : skip ${1=30},${2=70} e[^-1] "Create ($1%,$2%) transversal fading from image$?." - v - repeat {int($!/2)} l[$>,{$>+1}] (0/1) _fade $1,$2 endl done v + + repeat int($!/2) l[$>,{$>+1}] (0/1) _fade $1,$2 endl done #@cli sub_alpha : [base_image],_opacity_gain>=1 -#@cli : Compute the minimal alpha-channel difference (opposite of alpha blending) between the selected images and the specified base image. +#@cli : Compute the minimal alpha-channel difference (opposite of alpha blending) between the selected images +#@cli : and the specified base image. #@cli : The alpha difference A-B is defined as the image having minimal opacity, such that alpha_blend(B,A-B) = A. #@cli : Default value: 'opacity_gain=1'. #@cli : $ image.jpg testimage2d {w},{h} +sub_alpha[0] [1] display_rgba sub_alpha : check "${2=1}>=1 && "${"is_image_arg $1"} e[^-1] "Compute minimal alpha-channel difference between image$? and base image $1, with opacity gain $2." - v - remove_opacity repeat $! pass$1 0 l[$>,-1] + remove_opacity repeat $! pass$1 0 l[$>,-1] to_colormode 0 r ${-max_whd},100%,0,0,0.5,0.5 # Normalize image dimensions. # Estimate minimal alpha-channel. @@ -18183,7 +22154,7 @@ # Synthetize alpha-difference image. +replace[2] 0,1 /[0,3] +[0,1] *[1] 255 a c - endl done v + + endl done #--------------------------------------------- # @@ -18191,59 +22162,66 @@ # #--------------------------------------------- -#@cli animate : filter_name,"param1_start,...,paramN_start","param1_end,...,paramN_end",nb_frames>=0,_output_frames={ 0 | 1 },_output_filename : delay>0,_back and forth={ 0 | 1 } +#@cli animate : filter_name,"param1_start,...,paramN_start","param1_end,...,paramN_end",nb_frames>=0,\ +# _output_frames={ 0 | 1 },_output_filename : delay>0,_back and forth={ 0 | 1 } #@cli : Animate filter from starting parameters to ending parameters or animate selected images #@cli : in a display window. #@cli : Default value: 'delay=30'. #@cli : $ image.jpg animate flower,"0,3","20,8",9 animate : skip ${1=30},${2=0},${3=""},${4=10},${5=1},"${6=}" - if {"isval($1)"} - e[0--3] "Animate image$?, with a delay of $1 ms"${"v - if $2 u \", in back-and-forth mode\" else u \"\" fi v +"}. - if {!$!} return fi - v - + if "isnum($1)" + e[0--3] "Animate image$?, with a delay of $1 ms"${"if $2 u \", in back-and-forth mode\" else u \"\" fi"}. + if !$! return fi speed,pause,direction,scale,frame=$1,-1,1,1,0 is_same_size={"res = 1; s = [ w#0,h#0 ]; for (k = 1, k=0} direction=$pause pause=-1 + if $pause>=0 direction=$pause pause=-1 else pause=$direction direction=0 fi wait -1 fi - while {{*}" && "!{*,Q}" && "!{*,ESC}} w 0 v + + while {*}" && "!{*,Q}" && "!{*,ESC} w 0 else e[0--3] "Compute animated version of filter '$1', from parameters $2 to $3 with $4 frames." - if {!($5||narg("$6"))} return fi - v - ($2) ($3) y[-2,-1] x a[-2,-1] y r. 100%,$4,1,1,3 mv. 0 rprogress 0 - repeat {$!-1},u - v + e[] " > Animate image ["$>"]" v - + if !($5||narg("$6")) return fi + ($2) ($3) y[-2,-1] x a[-2,-1] y r. 100%,$4,1,1,3 mv. 0 rprogress 0 + repeat $!-1,u + e[] " > Animate image ["$>"]" repeat $4 +l[0,1] -$1. {0,@{$>*{0,w}}-{($>+1)*{0,w}-1}} rm[0] - if {narg("$6")} o ${filename\ "$6",$u,$>} fi - if {!$5} rm fi + if narg("$6") o ${filename\ "$6",$u,$>} fi + if !$5 rm fi rprogress {100*($>+1)/$4} - v + e[] "\r > Animate image ["$u"] : Frame "{$>+1}"/$4 " v - + e[] "\r > Animate image ["$u"] : Frame "{$>+1}"/$4 " endl done - rm[1] done rm[0] v + + rm[1] done rm[0] fi #@cli apply_camera : _"command",_camera_index>=0,_skip_frames>=0,_output_filename @@ -18251,34 +22229,41 @@ #@cli : Default values: 'command=""', 'camera_index=0' (default camera), 'skip_frames=0' and 'output_filename=""'. apply_camera : skip "${1=},${4=}" check "${2=0}>=0 && ${3=0}>=0" e[^-1] "Apply command '$1' on camera stream ""#$2, with $3 frames skip and output filename '$4'." - v - is_ext "$4",avi is_outavi=${} + is_ext "$4",avi is_outavi=${} l[] i=0 do camera $2,1,$3 $1 w. -1,-1,"[G'MIC] Camera ""#$2 ("{w}x{h}")" - if {narg("$4")} if $is_outavi z. 0,{w-(w%8)-1} o. "$4",25,mp4v,1 else o. ${filename\ "$4",$i} i+=1 fi fi + if narg("$4") if $is_outavi z. 0,{w-(w%8)-1} o. "$4",25,mp4v,1 else o. ${filename\ "$4",$i} i+=1 fi fi if {*,S} o. gmic_camera.png fi - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,D}} w[] {{*,w}*1.5},{{*,h}*1.5} wait -1 fi # Increase window size. - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,C}} w[] {{*,w}/1.5},{{*,h}/1.5} wait -1 fi # Decrease window size. - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,R}} w[] {0,w},{0,h} wait -1 fi # Reset window size. + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,D} w[] {{*,w}*1.5},{{*,h}*1.5} wait -1 fi # Increase window size. + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,C} w[] {{*,w}/1.5},{{*,h}/1.5} wait -1 fi # Decrease window size. + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,R} w[] {0,w},{0,h} wait -1 fi # Reset window size. rm. - while {{*}" && "!{*,ESC}" && "!{*,Q}} camera $2,0 endl v + + while {*}" && "!{*,ESC}" && "!{*,Q} camera $2,0 endl -#@cli apply_files : "filename_pattern",_"command",_first_frame>=0,_last_frame={ >=0 | -1=last },_frame_step>=1,_output_filename +#@cli apply_files : "filename_pattern",_"command",_first_frame>=0,_last_frame={ >=0 | -1=last },_frame_step>=1,\ +# _output_filename #@cli : Apply a G'MIC command on specified input image files, in a streamed way. #@cli : If a display window is opened, rendered frames are displayed in it during processing. -#@cli : The output filename may have extension '.avi' (saved as a video), or any other usual image file extension (saved as a sequence of images). -#@cli : Default values: 'command=(undefined)', 'first_frame=0', 'last_frame=-1', 'frame_step=1' and 'output_filename=(undefined)'. +#@cli : The output filename may have extension '.avi' (saved as a video), or any other usual image file +#@cli : extension (saved as a sequence of images). +#@cli : Default values: 'command=(undefined)', 'first_frame=0', 'last_frame=-1', 'frame_step=1' \ +# and 'output_filename=(undefined)'. apply_files : check "isint(${3=0}) && $3>=0 && isint(${4=-1}) && ($4>=0 || $4==-1) && ${5=1}>=1" skip "${2=},${6=}" - e[^-1] "Apply command '$2' on input image files '$1', with first frame $3, last frame $4, frame step $5 and output filename '$6'.\n" - v - files 3,"$1" _N=/{narg(${})-1} arg2var _file,${} _apply_stream[] "${_file{$frame+1}}","$2",${3-5},"$6" v + + e[^-1] "Apply command '$2' on input image files '$1', with first frame $3, last frame $4, frame step $5 and + output filename '$6'.\n" + files 3,"$1" _N=/{narg(${})-1} arg2var _file,${} v + _apply_stream[] "${_file{$frame+1}}","$2",${3-5},"$6" -#@cli apply_video : video_filename,_"command",_first_frame>=0,_last_frame={ >=0 | -1=last },_frame_step>=1,_output_filename +#@cli apply_video : video_filename,_"command",_first_frame>=0,_last_frame={ >=0 | -1=last },_frame_step>=1,\ +# _output_filename #@cli : Apply a G'MIC command on all frames of the specified input video file, in a streamed way. #@cli : If a display window is opened, rendered frames are displayed in it during processing. -#@cli : The output filename may have extension '.avi' (saved as a video), or any other usual image file extension (saved as a sequence of images). +#@cli : The output filename may have extension '.avi' (saved as a video), or any other usual image +#@cli : file extension (saved as a sequence of images). #@cli : Default values: 'first_frame=0', 'last_frame=-1', 'frame_step=1' and 'output_filename=(undefined)'. apply_video : check "isint(${3=0}) && $3>=0 && isint(${4=-1}) && ($4>=0 || $4==-1) && ${5=1}>=1" skip "${2=},${6=}" - e[^-1] "Apply command '$2' on input video file '$1', with first frame $3, last frame $4, frame step $5 and output filename '$6'.\n" - v - _N= _apply_stream[] "\"$1\",$frame","$2",${3-5},"$6" v + + e[^-1] "Apply command '$2' on input video file '$1', with first frame $3, last frame $4, frame step $5 and + output filename '$6'.\n" + _N= v + _apply_stream[] "\"$1\",$frame","$2",${3-5},"$6" _apply_stream : skip "${2=},${6=}" is_ext "$6",avi is_outavi=${} @@ -18286,44 +22271,48 @@ do l[] $1 onfail go_on=0 endl if $go_on - v + e[] "\r > Frame ""#"$frame$_N" " v - + e[] "\r > Frame ""#"$frame$_N" " frame+=$5 l $2 onfail error[0--5] "Command 'apply_stream': Specified command errored: "${} endl - if {!$!} continue fi - if {narg("$6")} + if !$! continue fi + if narg("$6") if $is_outavi z. 0,{w-(w%8)-1} o. "$6",25,mp4v,1 else o. ${filename\ "$6",$i} i+=1 fi fi if {*} title="[G'MIC] Frame ""#"$frame - if {!narg($wh)} wh=${fitscreen[]\ {w},{h}} w. $wh,0,$title + if !narg($wh) wh=${fitscreen[]\ {[w,h]}} w. $wh,0,$title else w. -1,-1,0,$title fi - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,D}} w[] {{*,w}*1.5},{{*,h}*1.5} wait -1 fi # Increase window size. - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,C}} w[] {{*,w}/1.5},{{*,h}/1.5} wait -1 fi # Decrease window size. - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,R}} w[] {0,w},{0,h} wait -1 fi # Reset window size. + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,D} w[] {{*,w}*1.5},{{*,h}*1.5} wait -1 fi # Increase window size. + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,C} w[] {{*,w}/1.5},{{*,h}/1.5} wait -1 fi # Decrease window size. + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,R} w[] {0,w},{0,h} wait -1 fi # Reset window size. fi rm. fi - while {$go_on" && "($4==-1" || "$frame<=$4)} + while $go_on" && "($4==-1" || "$frame<=$4) if $is_outavi o[] "$6",25,mp4v,0 fi #@cli average_files : "filename_pattern",_first_frame>=0,_last_frame={ >=0 | -1=last },_frame_step>=1,_output_filename #@cli : Average specified input image files, in a streamed way. #@cli : If a display window is opened, rendered frames are displayed in it during processing. -#@cli : The output filename may have extension '.avi' (saved as a video), or any other usual image file extension (saved as a sequence of images). +#@cli : The output filename may have extension '.avi' (saved as a video), or any other usual image +#@cli : file extension (saved as a sequence of images). #@cli : Default values: 'first_frame=0', 'last_frame=-1', 'frame_step=1' and 'output_filename=(undefined)'. average_files : check "isint(${2=0}) && $2>=0 && isint(${3=-1}) && ($3>=0 || $3==-1) && ${4=1}>=1" skip "${5=}" - e[^-1] "Average input image files '$1', with first frame $2, last frame $3, frame step $4 and output filename '$5'.\n" - v - files 3,"$1" _N=/{narg(${})-1} arg2var _file,${} _average_stream[] "${_file{$frame+1}}",${2-4},"$5" v + + e[^-1] "Average input image files '$1', with first frame $2, last frame $3, frame step $4 and + output filename '$5'.\n" + files 3,"$1" _N=/{narg(${})-1} arg2var _file,${} v + _average_stream[] "${_file{$frame+1}}",${2-4},"$5" #@cli average_video : video_filename,_first_frame>=0,_last_frame={ >=0 | -1=last },_frame_step>=1,_output_filename #@cli : Average frames of specified input video file, in a streamed way. #@cli : If a display window is opened, rendered frames are displayed in it during processing. -#@cli : The output filename may have extension '.avi' (saved as a video), or any other usual image file extension (saved as a sequence of images). +#@cli : The output filename may have extension '.avi' (saved as a video), or any other usual image +#@cli : file extension (saved as a sequence of images). #@cli : Default values: 'first_frame=0', 'last_frame=-1', 'frame_step=1' and 'output_filename=(undefined)'. average_video : check "isint(${2=0}) && $2>=0 && isint(${3=-1}) && ($3>=0 || $3==-1) && ${4=1}>=1" skip "${5=}" - e[^-1] "Average frames of input video file '$1', with first frame $2, last frame $3, frame step $4 and output filename '$5'.\n" - v - _N= _average_stream[] "\"$1\",$frame",${2-4},"$5" v + + e[^-1] "Average frames of input video file '$1', with first frame $2, last frame $3, frame step $4 and + output filename '$5'.\n" + _N= v + _average_stream[] "\"$1\",$frame",${2-4},"$5" _average_stream : skip "${5=}" is_ext "$5",avi is_outavi=${} @@ -18332,11 +22321,11 @@ do l[] $1 onfail go_on=0 endl if $go_on - v + e[] "\r > Frame ""#"$frame$_N" " v - + e[] "\r > Frame ""#"$frame$_N" " imM={v=[$imM];[min(im,v[0]),max(iM,v[1])]} N+=1 - if {$!>1} + fi - if {narg("$5")} + if $!>1 r ${-max_whds} + fi + if narg("$5") +/. $N c. $imM if $is_outavi z. 0,{w-(w%8)-1} o. "$5",25,mp4v,1 else o. ${filename\ "$5",$i} i+=1 fi rm. @@ -18344,70 +22333,79 @@ if {*} title="[G'MIC] Frame ""#"$frame +n 0,255 - if {!narg($wh)} wh=${fitscreen[]\ {w},{h}} w. $wh,0,$title + if !narg($wh) wh=${fitscreen[]\ {[w,h]}} w. $wh,0,$title else w. -1,-1,0,$title fi - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,D}} w[] {{*,w}*1.5},{{*,h}*1.5} wait -1 fi # Increase window size. - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,C}} w[] {{*,w}/1.5},{{*,h}/1.5} wait -1 fi # Decrease window size. - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,R}} w[] {0,w},{0,h} wait -1 fi # Reset window size. + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,D} w[] {{*,w}*1.5},{{*,h}*1.5} wait -1 fi # Increase window size. + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,C} w[] {{*,w}/1.5},{{*,h}/1.5} wait -1 fi # Decrease window size. + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,R} w[] {0,w},{0,h} wait -1 fi # Reset window size. rm. fi frame+=$4 fi - while {$go_on" && "($3==-1" || "$frame<=$3)} + while $go_on" && "($3==-1" || "$frame<=$3) / $N c $imM if $is_outavi o[] "$5",25,mp4v,0 fi -#@cli fade_files : "filename_pattern",_nb_inner_frames>0,_first_frame>=0,_last_frame={ >=0 | -1=last },_frame_step>=1,_output_filename +#@cli fade_files : "filename_pattern",_nb_inner_frames>0,_first_frame>=0,_last_frame={ >=0 | -1=last },\ +# _frame_step>=1,_output_filename #@cli : Generate a temporal fading from specified input image files, in a streamed way. #@cli : If a display window is opened, rendered frames are displayed in it during processing. -#@cli : The output filename may have extension 'avi' (saved as a video), or any other usual image file extension (saved as a sequence of images). -#@cli : Default values: 'nb_inner_frames=10', 'first_frame=0', 'last_frame=-1', 'frame_step=1' and 'output_filename=(undefined)'. -fade_files : check "isint(${2=10}) && $2>0 && isint(${3=0}) && $3>=0 && isint(${4=-1}) && ($4>=0 || $4==-1) && ${5=1}>=1" skip "${6=}" - e[^-1] "Fade input image files '$1', with $2 inner frames, first frame $3, last frame $4, frame step $5 and output filename '$6'.\n" - v - files 3,"$1" _N=/{narg(${})-1} arg2var _file,${} _fade_stream[] "${_file{$frame+1}}",${2-5},"$6" v + +#@cli : The output filename may have extension 'avi' (saved as a video), or any other usual image +#@cli : file extension (saved as a sequence of images). +#@cli : Default values: 'nb_inner_frames=10', 'first_frame=0', 'last_frame=-1', 'frame_step=1' \ +# and 'output_filename=(undefined)'. +fade_files : check "isint(${2=10}) && $2>0 && isint(${3=0}) && $3>=0 && + isint(${4=-1}) && ($4>=0 || $4==-1) && ${5=1}>=1" skip "${6=}" + e[^-1] "Fade input image files '$1', with $2 inner frames, first frame $3, last frame $4, frame step $5 and + output filename '$6'.\n" + files 3,"$1" _N=/{narg(${})-1} arg2var _file,${} v + _fade_stream[] "${_file{$frame+1}}",${2-5},"$6" -#@cli fade_video : video_filename,_nb_inner_frames>0,_first_frame>=0,_last_frame={ >=0 | -1=last },_frame_step>=1,_output_filename +#@cli fade_video : video_filename,_nb_inner_frames>0,_first_frame>=0,_last_frame={ >=0 | -1=last },\ +# _frame_step>=1,_output_filename #@cli : Create a temporal fading sequence from specified input video file, in a streamed way. #@cli : If a display window is opened, rendered frames are displayed in it during processing. -#@cli : Default values: 'nb_inner_frames=10', 'first_frame=0', 'last_frame=-1', 'frame_step=1' and 'output_filename=(undefined)'. -fade_video : check "isint(${2=10}) && $2>0 && isint(${3=0}) && $3>=0 && isint(${4=-1}) && ($4>=0 || $4==-1) && ${5=1}>=1" skip "${6=}" - e[^-1] "Fade frames of input video file '$1', with $2 inner frames, first frame $3, last frame $4, frame step $5 and output filename '$6'.\n" - v - _N= _fade_stream[] "\"$1\",$frame",${2-5},"$6" v + +#@cli : Default values: 'nb_inner_frames=10', 'first_frame=0', 'last_frame=-1', 'frame_step=1' \ +# and 'output_filename=(undefined)'. +fade_video : check "isint(${2=10}) && $2>0 && isint(${3=0}) && $3>=0 && + isint(${4=-1}) && ($4>=0 || $4==-1) && ${5=1}>=1" skip "${6=}" + e[^-1] "Fade frames of input video file '$1', with $2 inner frames, first frame $3, last frame $4, frame step $5 and + output filename '$6'.\n" + _N= v + _fade_stream[] "\"$1\",$frame",${2-5},"$6" _fade_stream : skip "${6=}" is_ext "$6",avi is_outavi=${} frame=$3 i=0 go_on=1 l $1 onfail go_on=0 endl # Load first image. - if {!$go_on} return fi + if !$go_on return fi w={w} h={h} s={s} if {*} w. ${fitscreen\ $w,$h},0,"[G'MIC]" fi pframe=$frame frame+=$5 do l[] $1 onfail go_on=0 endl - if {!$go_on} break fi + if !$go_on break fi to_colormode. $s r. $w,$h - repeat {$2+2} if {$<} + repeat $2+2 if $< title="[G'MIC] Frame ""#"$pframe" -> ""#"$frame$_N" ("{1+$>}/$2")" - v + e[] "\r - "$title v - + e[] "\r - "$title +j[0] [1],0,0,0,0,{$>/($2+1)} - if {narg("$6")} + if narg("$6") if $is_outavi z. 0,{w-(w%8)-1} o. "$6",25,mp4v,1 else filename "$6",$i i+=1 o. ${} fi fi if {*} w. -1,-1,0,$title - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,D}} w[] {{*,w}*1.5},{{*,h}*1.5} wait -1 fi # Increase window size. - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,C}} w[] {{*,w}/1.5},{{*,h}/1.5} wait -1 fi # Decrease window size. - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,R}} w[] {0,w},{0,h} wait -1 fi # Reset window size. + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,D} w[] {{*,w}*1.5},{{*,h}*1.5} wait -1 fi # Increase window size. + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,C} w[] {{*,w}/1.5},{{*,h}/1.5} wait -1 fi # Decrease window size. + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,R} w[] {0,w},{0,h} wait -1 fi # Reset window size. fi rm. fi done rm[0] pframe=$frame frame+=$5 - while {$go_on" && "($4==-1" || "$frame<=$4)} + while $go_on" && "($4==-1" || "$frame<=$4) # Output last frame. - if {narg("$6")} + if narg("$6") if $is_outavi z. 0,{w-(w%8)-1} o[] "$6",25,mp4v,0 else filename "$6",$i o. ${} fi fi rm @@ -18416,68 +22414,75 @@ #@cli : Convert several files into a single video file. #@cli : Default values: 'output_filename=output.avi', 'fps=25' and 'codec=mp4v'. files2video : check "isint(${3=25}) && $3>0" skip "${2=output.avi}",${4=mp4v} - v - files=${"files \"$1\""} arg2var _file,$files nb_files=${} - ({'$files'}) if {w>128} z. 0,127 s_files={t}... else s_files=$files fi rm. - v + e[^-1] "Convert image files '"$s_files"' into frames of output video '$2', with $3 fps and $4 codec.\n" v - + ('$files') if w>128 z. 0,127 s_files={t}... else s_files=$files fi rm. + e[^-1] "Convert image files '"$s_files"' into frames of output video '$2', with $3 fps and $4 codec.\n" repeat $nb_files l[] file=${_file{$>+1}} _file=${basename\ $file} - v + e[] "\r - Image "{1+$>}/$nb_files" ["$_file"] -> [$2] " v - + e[] "\r - Image "{1+$>}/$nb_files" ["$_file"] -> [$2] " i $file o "$2",$3,$4,1 rm - onfail v + e[] "\n - Error occurred on input file '"$file"'.\n" v - + onfail e[] "\n - Error occurred on input file '"$file"'.\n" endl done - o $"$2",0,0,0 v + + o $"$2",0,0,0 -#@cli median_files : "filename_pattern",_first_frame>=0,_last_frame={ >=0 | -1=last },_frame_step>=1,_frame_rows[%]>=1,_is_fast_approximation={ 0 | 1 } +#@cli median_files : "filename_pattern",_first_frame>=0,_last_frame={ >=0 | -1=last },_frame_step>=1,\ +# _frame_rows[%]>=1,_is_fast_approximation={ 0 | 1 } #@cli : Compute the median frame of specified input image files, in a streamed way. #@cli : If a display window is opened, rendered frame is displayed in it during processing. -#@cli : Default values: 'first_frame=0', 'last_frame=-1', 'frame_step=1', 'frame_rows=20%' and 'is_fast_approximation=0'. -median_files : check "isint(${2=0}) && $2>=0 && isint(${3=-1}) && ($3>=0 || $3==-1) && ${4=1}>=1 && ${5=20%}>0 && isval(${6=0})" - v - s0="fast" s1="precise" - v + e[^-1] "Compute median of input image files '$1', with first frame $2, last frame $3, frame step $4, frame rows $5, using "${s{!$6}}" algorithm." v - +#@cli : Default values: 'first_frame=0', 'last_frame=-1', 'frame_step=1', 'frame_rows=20%' \ +# and 'is_fast_approximation=0'. +median_files : check "isint(${2=0}) && $2>=0 && isint(${3=-1}) && ($3>=0 || $3==-1) && + ${4=1}>=1 && ${5=20%}>0 && isnum(${6=0})" + s0="fast" s1="precise" + e[^-1] "Compute median of input image files '$1', with first frame $2, last frame $3, frame step $4, + frame rows $5, using "${s{!$6}}" algorithm." files 3,"$1" _N=/{narg(${})-1} arg2var _file,${} l[] - i[res] ${_file{$frame+1}} f. 0 - _median_stream "${_file{$frame+1}}",${2-6} - endl v + + ${_file{$frame+1}} nm. res f. 0 + v + _median_stream "${_file{$frame+1}}",${2-6} v - + endl -#@cli median_video : video_filename,_first_frame>=0,_last_frame={ >=0 | -1=last },_frame_step>=1,_frame_rows[%]>=1,_is_fast_approximation={ 0 | 1 } +#@cli median_video : video_filename,_first_frame>=0,_last_frame={ >=0 | -1=last },_frame_step>=1,\ +# _frame_rows[%]>=1,_is_fast_approximation={ 0 | 1 } #@cli : Compute the median of all frames of an input video file, in a streamed way. #@cli : If a display window is opened, rendered frame is displayed in it during processing. -#@cli : Default values: 'first_frame=0', 'last_frame=-1', 'frame_step=1', 'frame_rows=100%' and 'is_fast_approximation=1'. -median_video : check "isint(${2=0}) && $2>=0 && isint(${3=-1}) && ($3>=0 || $3==-1) && ${4=1}>=1 && ${5=100%}>0 && isval(${6=1})" - v - s0="fast" s1="precise" - v + e[^-1] "Compute median frame of input video file '$1', with first frame $2, last frame $3, frame step $4, frame rows $5, using "${s{!$6}}" algorithm." v - +#@cli : Default values: 'first_frame=0', 'last_frame=-1', 'frame_step=1', 'frame_rows=100%' \ +# and 'is_fast_approximation=1'. +median_video : check "isint(${2=0}) && $2>=0 && isint(${3=-1}) && ($3>=0 || $3==-1) && + ${4=1}>=1 && ${5=100%}>0 && isnum(${6=1})" + s0="fast" s1="precise" + e[^-1] "Compute median frame of input video file '$1', with first frame $2, last frame $3, frame step $4, + frame rows $5, using "${s{!$6}}" algorithm." _N= l[] - i[res] "$1",0 f. 0 - _median_stream "\"$1\",$frame",${2-6} - endl v + + "$1",0 nm. res f. 0 + v + _median_stream "\"$1\",$frame",${2-6} v - + endl _median_stream : # Retrieve min/max values of all frames when fast method is used. if $6 - v + e[] "- Retrieve min/max values of all frames.\n" v - + e[] "- Retrieve min/max values of all frames.\n" frame=$2 go_on=1 imM=inf,-inf do l[] $1 onfail go_on=0 endl if $go_on - v + e[] "\r > Frame ""#"$frame$_N" " v - + e[] "\r > Frame ""#"$frame$_N" " imM={v=[$imM];[min(im,v[0]),max(iM,v[1])]} if {*} title="[G'MIC] Frame ""#"$frame - if {!narg($wh)} wh=${fitscreen[]\ {w},{h}} w. $wh,1,$title + if !narg($wh) wh=${fitscreen[]\ {[w,h]}} w. $wh,1,$title else w. -1,-1,1,$title fi fi rm. frame+=$4 fi - while {$go_on" && "($3==-1" || "$frame<=$3)} + while $go_on" && "($3==-1" || "$frame<=$3) _N=/{$frame-$4} fact={v=[$imM];dv=v[1]-v[0];dv<=0?0:255/dv} fi @@ -18487,20 +22492,20 @@ nb_iter={round(h/$drows,1,1)} repeat $nb_iter row0={$drows*$>} row1={0,min(h,$row0+$drows-1)} - v + e[] "- Iteration \#"{$>+1}/$nb_iter": Load rows "$row0-$row1/$h1".\n" v - + e[] "- Iteration \#"{$>+1}/$nb_iter": Load rows "$row0-$row1/$h1".\n" frame=$2 go_on=1 if $6 # Fast method : compute median frame using streamed histogram computation. N=0 - i[hist] {w},$drows,256,{s} + {w},$drows,256,{s} nm. hist do l[] $1 nm. img onfail go_on=0 endl if $img - v + e[] "\r > Frame ""#"$frame$_N" " v - - if {{*}" && "!$>} + e[] "\r > Frame ""#"$frame$_N" " + if {*}" && "!$> title="[G'MIC] Frame ""#"$frame - if {!narg($wh)} wh=${fitscreen[]\ {img,w},{img,h}} w[img] $wh,1,$title + if !narg($wh) wh=${fitscreen[]\ {img,[w,h]}} w[img] $wh,1,$title else w[img] -1,-1,1,$title fi fi @@ -18508,11 +22513,11 @@ rm[img] frame+=$4 N+=1 fi - while {$go_on" && "($3==-1" || "$frame<=$3)} + while $go_on" && "($3==-1" || "$frame<=$3) cumulate[hist] z N2={int($N/2)} [hist],[hist],1,[hist] - if {$N%2} # Odd number of frames. + if $N%2 # Odd number of frames. f. ":go_on = 1; for (z = 0, i(#"$hist",x,y,z,c)<"$N2" && z<256, ++z); z" else # Even number of frames. f. ":begin(N2p = "$N2"; N2n = N2p + 1); @@ -18530,18 +22535,18 @@ do l[] $1 nm. img onfail go_on=0 endl if $go_on - v + e[] "\r > Frame ""#"$frame$_N" " v - - if {{*}" && "!$>} + e[] "\r > Frame ""#"$frame$_N" " + if {*}" && "!$> title="[G'MIC] Frame ""#"$frame - if {!narg($wh)} wh=${fitscreen[]\ {w},{h}} w. $wh,1,$title + if !narg($wh) wh=${fitscreen[]\ {[w,h]}} w. $wh,1,$title else w. -1,-1,1,$title fi fi rows. $row0,$row1 frame+=$4 fi - while {$go_on" && "($3==-1" || "$frame<=$3)} - v + e[] "\r > Compute median blending of "$!" frames." v - + while $go_on" && "($3==-1" || "$frame<=$3) + e[] "\r > Compute median blending of "$!" frames." __median_stream endl fi @@ -18552,12 +22557,12 @@ rm. done - v + e[] "- Done!" v - + e[] "- Done!" # Median blending optimized to deal with a lot of input frames. __median_stream : - if {$!<2} return - elif {$!==2} + / 2 + if $!<2 return + elif $!==2 + / 2 else f. ": stack = vector"{0,2*$!}"(); @@ -18578,7 +22583,7 @@ if (range[0]=0 && ${2=0.1}>=0 && ${3=4}>=0" e[^-1] "Create morphing sequence between image$?, with $1 inner frames, smoothness $2 and precision $3.\n" - if {!$1} return fi - v - r[^0] [0],3 repeat {$!-1} nm={$>,n} l[$<,{$<+1}] - v + e[] "\r > Morph image "$>" to image "{$>+1}". " v - + if !$1 return fi + r[^0] [0],3 repeat $!-1 nm={$>,n} l[$<,{$<+1}] + e[] "\r > Morph image "$>" to image "{$>+1}". " +equalize[0,1] n[-2,-1] 0,255 +displacement[3] [2],$2,$3 +displacement[2] [3],$2,$3 rm[-4,-3] - repeat {$1+2} if {$>&&$<} + repeat $1+2 if $>&&$< t={$>/($1+1)} omt={1-$t} +*[2] $t +warp[0] .,1,1,1 rm.. *. $omt +*[3] {1-$t} +warp[1] .,1,1,1 rm.. *. $t +[-2,-1] fi done rm[2,3] mv[2--1] 1 nm $nm - endl done v + + endl done -#@cli morph_files : "filename_pattern",_nb_inner_frames>0,_smoothness>=0,_precision>=0,_first_frame>=0,_last_frame={ >=0 | -1=last },_frame_step>=1,_output_filename +#@cli morph_files : "filename_pattern",_nb_inner_frames>0,_smoothness>=0,_precision>=0,\ +# _first_frame>=0,_last_frame={ >=0 | -1=last },_frame_step>=1,_output_filename #@cli : Generate a temporal morphing from specified input image files, in a streamed way. #@cli : If a display window is opened, rendered frames are displayed in it during processing. -#@cli : The output filename may have extension '.avi' (saved as a video), or any other usual image file extension (saved as a sequence of images). -#@cli : Default values: 'nb_inner_frames=10', 'smoothness=0.1', 'precision=4', 'first_frame=0', 'last_frame=-1', 'frame_step=1' and 'output_filename=(undefined)'. -morph_files : check "isint(${2=10}) && $2>0 && ${3=0.1}>=0 && ${4=4}>=0 && isint(${5=0}) && $5>=0 && isint(${6=-1}) && ($6>=0 || $6==-1) && ${7=1}>=1" skip "${8=}" - e[^-1] "Morph input image files '$1', with $2 inner frames, smoothness $3, precision $4, first frame $5, last frame $6, frame step $7 and output filename '$8'.\n" - v - files 3,"$1" _N=/{narg(${})-1} arg2var _file,${} _morph_stream[] "${_file{$frame+1}}",${2-7},"$8" v + +#@cli : The output filename may have extension '.avi' (saved as a video), or any other usual image +#@cli : file extension (saved as a sequence of images). +#@cli : Default values: 'nb_inner_frames=10', 'smoothness=0.1', 'precision=4', 'first_frame=0', 'last_frame=-1', \ +# 'frame_step=1' and 'output_filename=(undefined)'. +morph_files : check "isint(${2=10}) && $2>0 && ${3=0.1}>=0 && ${4=4}>=0 && + isint(${5=0}) && $5>=0 && isint(${6=-1}) && ($6>=0 || $6==-1) && ${7=1}>=1" skip "${8=}" + e[^-1] "Morph input image files '$1', with $2 inner frames, smoothness $3, precision $4, first frame $5, + last frame $6, frame step $7 and output filename '$8'.\n" + files 3,"$1" _N=/{narg(${})-1} arg2var _file,${} _morph_stream[] "${_file{$frame+1}}",${2-7},"$8" -#@cli morph_video : video_filename,_nb_inner_frames>0,_smoothness>=0,_precision>=0,_first_frame>=0,_last_frame={ >=0 | -1=last },_frame_step>=1,_output_filename +#@cli morph_video : video_filename,_nb_inner_frames>0,_smoothness>=0,_precision>=0,\ +# _first_frame>=0,_last_frame={ >=0 | -1=last },_frame_step>=1,_output_filename #@cli : Generate a temporal morphing from specified input video file, in a streamed way. #@cli : If a display window is opened, rendered frames are displayed in it during processing. -#@cli : The output filename may have extension '.avi' (saved as a video), or any other usual image file extension (saved as a sequence of images). -#@cli : Default values: 'nb_inner_frames=10', 'smoothness=0.1', 'precision=4', 'first_frame=0', 'last_frame=-1', 'frame_step=1' and 'output_filename=(undefined)'. -morph_video : check "isint(${2=10}) && $2>0 && ${3=0.1}>=0 && ${4=4}>=0 && isint(${5=0}) && $5>=0 && isint(${6=-1}) && ($6>=0 || $6==-1) && ${7=1}>=1" skip "${8=}" - e[^-1] "Morph frames of input video file '$1', with $2 fading frames, smoothness $3, precision $4, first frame $5, last frame $6, frame step $7 and output filename '$8'.\n" - v - _N= _morph_stream[] "\"$1\",$frame",${2-7},"$8" v + +#@cli : The output filename may have extension '.avi' (saved as a video), or any other usual image +#@cli : file extension (saved as a sequence of images). +#@cli : Default values: 'nb_inner_frames=10', 'smoothness=0.1', 'precision=4', 'first_frame=0', 'last_frame=-1', \ +# 'frame_step=1' and 'output_filename=(undefined)'. +morph_video : check "isint(${2=10}) && $2>0 && ${3=0.1}>=0 && ${4=4}>=0 && + isint(${5=0}) && $5>=0 && isint(${6=-1}) && ($6>=0 || $6==-1) && ${7=1}>=1" skip "${8=}" + e[^-1] "Morph frames of input video file '$1', with $2 fading frames, smoothness $3, precision $4, first frame $5, + last frame $6, frame step $7 and output filename '$8'.\n" + _N= v + _morph_stream[] "\"$1\",$frame",${2-7},"$8" _morph_stream : skip "${8=}" is_ext "$8",avi is_outavi=${} frame=$5 i=0 go_on=1 l $1 onfail go_on=0 endl # Load first image. - if {!$go_on} return fi + if !$go_on return fi w={w} h={h} s={s} if {*} w. ${fitscreen\ $w,$h},0,"[G'MIC]" fi pframe=$frame frame+=$7 do l[] $1 onfail go_on=0 endl - if {!$go_on} break fi + if !$go_on break fi to_colormode. $s r. $w,$h cutvals={[min(im#0,im#1),max(iM#0,iM#1)]} - v + e[] "\r - Frame ""#"$pframe" -> ""#"$frame" " v - + e[] "\r - Frame ""#"$pframe" -> ""#"$frame" " +equalize[0,1] n[-2,-1] 0,255 +displacement[3] [2],$3,$4 +displacement[2] [3],$3,$4 rm[-4,-3] - repeat {$2+2} if {$<} + repeat $2+2 if $< title="Frame ""#"$pframe" -> ""#"$frame" ("$>/$2") " - v + e[] "\r - "$title v - + e[] "\r - "$title t={$>/($2+1)} omt={1-$t} +*[2] $t +warp[0] .,1,1,1 rm.. *. $omt +*[3] {1-$t} +warp[1] .,1,1,1 rm.. *. $t +[-2,-1] c. $cutvals - if {narg("$8")} + if narg("$8") if $is_outavi z. 0,{w-(w%8)-1} o. "$8",25,mp4v,1 else filename "$8",$i i+=1 o. ${} fi fi if {*} w. -1,-1,0,$title - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,D}} w[] {{*,w}*1.5},{{*,h}*1.5} wait -1 fi # Increase window size. - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,C}} w[] {{*,w}/1.5},{{*,h}/1.5} wait -1 fi # Decrease window size. - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,R}} w[] {0,w},{0,h} wait -1 fi # Reset window size. + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,D} w[] {{*,w}*1.5},{{*,h}*1.5} wait -1 fi # Increase window size. + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,C} w[] {{*,w}/1.5},{{*,h}/1.5} wait -1 fi # Decrease window size. + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,R} w[] {0,w},{0,h} wait -1 fi # Reset window size. fi rm. fi done rm[0,-2,-1] pframe=$frame frame+=$7 - while {$go_on" && "($6==-1" || "$frame<=$6)} + while $go_on" && "($6==-1" || "$frame<=$6) # Output last frame. - if {narg("$8")} + if narg("$8") if $is_outavi z. 0,{w-(w%8)-1} o[] "$8",25,mp4v,0 else filename "$8",$i o. ${} fi fi rm @@ -18670,64 +22685,98 @@ #@cli : Default values: 'smoothness=0.2', 'precision=6' and 'nb_scale=0(auto)'. #@cli : $ image.jpg +rotate 20,1,1,50%,50% +register_nonrigid[0] [1] register_nonrigid : check ${is_image_arg\ $1}" && ${2=0.2}>=0 && ${3=5}>0 && ${4=0}>=0" - e[^-1] "Register source image$? with destination image $1, using non-rigid warp with smoothness $1, precision $2 and $3 scale(s)." - v - pass$1 0 equalize. n. 0,255 - repeat {$!-1} + e[^-1] "Register source image$? with destination image $1, using non-rigid warp with smoothness $2, + precision $3 and $4 scale(s)." + pass$1 0 equalize. n. 0,255 + repeat $!-1 +equalize[$>] n. 0,255 +displacement.. .,$2,$3,$4 rm.. warp[$>] .,1,1,1 rm. - done rm. v + + done rm. -#@cli register_rigid : [destination],_smoothness>=0,_boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror } +#@cli register_rigid : [destination],_smoothness>=0,\ +# _boundary_conditions={ 0=dirichlet | 1=neumann | 2=periodic | 3=mirror } #@cli : Register selected source images with specified destination image, using rigid warp (shift). -#@cli : Default values: 'smoothness=1' and 'boundary_conditions=0'. +#@cli : Default values: 'smoothness=0.1%' and 'boundary_conditions=0'. #@cli : $ image.jpg +shift 30,20 +register_rigid[0] [1] -register_rigid : check ${is_image_arg\ $1}" && ${2=1}>=0 && isint(${3=0}) && $3>=0 && $3<=3" +register_rigid : check ${is_image_arg\ $1}" && ${2=0.1%}>=0 && isint(${3=0}) && $3>=0 && $3<=3" e[^-1] "Register source image$? with destination image $1, using rigid warp with smoothness $2." - v - pass$1 0 equalize. b. $2 n. 0,255 - repeat {$!-1} - +equalize[$>] b. $2 n. 0,255 - +phase_correlation. .. rm.. - shift[$>] {^},0,$3 rm. - done rm. v + + m "_register_rigid : b $2 equalize 256 n 0,1" + pass$1 0 W,H,D,S={[w,h,d,s]} + f={max(w,h)/1024} + if $f<=1 # Small image: one-step registration + _register_rigid. + repeat $!-1 + if {$>,w!=$W||h!=$H||d!=$D} + error[0--4] "Images have incompatible sizes ("{$>,[w,h,d,s]}") and ("{[$W,$H,$D,$S]}")." + fi + +_register_rigid[$>] phase_correlation. .. shift[$>] {^},0,$3 rm. + done + rm. + else # Large image: two-steps registration + +r. {[min(w,1024),min(h,1024),min(d,1024)]},100%,0,0,0.5,0.5 + rr2d.. 1024,1024,0,2 + _register_rigid[-2,-1] + repeat $!-2 + if {$>,w!=$W||h!=$H||d!=$D} + error[0--4] "Images have incompatible sizes ("{$>,[w,h,d,s]}") and ("{[$W,$H,$D,$S]}")." + fi + + # Low scale. + +rr2d[$>] 1024,1024,0,2 _register_rigid. + phase_correlation. ... + s={$f*crop()} rm. + + # High scale. + +shift[$>] $s,0,$3 + r. {[min(w,1024),min(h,1024),min(d,1024)]},100%,0,0,0.5,0.5 _register_rigid. + phase_correlation. .. + s={[$s]+crop()} rm. + + shift[$>] $s,0,$3 + done + rm[-2,-1] + fi + um _register_rigid #@cli transition : [transition_shape],nb_added_frames>=0,100>=shading>=0,_single_frame_only={ -1=disabled | >=0 } #@cli : Generate a transition sequence between selected images. #@cli : Default values: 'shading=0' and 'single_frame_only=-1'. #@cli : $ image.jpg +mirror c 100%,100% plasma[-1] 1,1,6 transition[0,1] [2],5 transition : check ${is_image_arg\ $1}" && $2>=0 && ${3=0}>=0 && $3<=100" skip ${4=-1} - v - frame={round($4)} s0=" and shading $3" s1=", shading $3 and single-frame-only "$frame v + + frame={round($4)} s0=" and shading $3" s1=", shading $3 and single-frame-only "$frame e[^-1] "Create transition sequence between image$? with $2 added frames, transition shape $1"${s{$4>0}}"." - if {$!<2" || "!$2} return fi - v - to_colormode 0 r ${-max_whd},100%,0,0,0.5,0.5 + if $!<2" || "!$2 return fi + to_colormode 0 r ${-max_whd},100%,0,0,0.5,0.5 pass$1 0 norm. r. [0],[0],[0],1,3 n. 0,1 mv. 0 - repeat {$!-2} l[0,{$<+1},{$<+2}] + repeat $!-2 l[0,{$<+1},{$<+2}] nm0={1,n} - if $3 repeat $2 if {$4<0" || "$>==$frame} + if $3 repeat $2 if $4<0" || "$>==$frame val0={($>+0.5)/$2-$3%} val1={($>+0.5)/$2+$3%} +f[0] '(i-$val0)/($val1-$val0)' c. 0,1 +j[2] [1],0,0,0,0,1,. rm.. nm. $nm0\ ""#{1+$>} - fi done else repeat $2 if {$4<0" || "$>==$frame} + fi done else repeat $2 if $4<0" || "$>==$frame +>=[0] {($>+0.5)/$2} +j[2] [1],0,0,0,0,1,. rm.. nm. $nm0\ ""#{1+$>} fi done fi mv[2] $! - endl done rm[0] v + + endl done rm[0] #@cli transition3d : _nb_frames>=2,_nb_xtiles>0,_nb_ytiles>0,_axis_x,_axis_y,_axis_z,_is_antialias={ 0 | 1 } #@cli : Create 3D transition sequence between selected consecutive images. #@cli : 'axis_x', 'axis_y' and 'axis_z' can be set as mathematical expressions, depending on 'x' and 'y'. -#@cli : Default values: 'nb_frames=10', 'nb_xtiles=nb_ytiles=3', 'axis_x=1', 'axis_y=1', 'axis_z=0' and 'is_antialias=1'. +#@cli : Default values: 'nb_frames=10', 'nb_xtiles=nb_ytiles=3', 'axis_x=1', 'axis_y=1', 'axis_z=0' \ +# and 'is_antialias=1'. #@cli : $ image.jpg +blur 5 transition3d 9 display_rgba -transition3d : check "isint(${1=10}) && $1>=2 && isint(${2=3}) && $2>0 && isint(${3=$2}) && $3>0" skip ${4=1},${5=1},${6=0},${7=1} +transition3d : check "isint(${1=10}) && $1>=2 && isint(${2=3}) && $2>0 && isint(${3=$2}) && $3>0" + skip ${4=1},${5=1},${6=0},${7=1} e[^-1] "Create 3D transition sequence between image$?, with $1 frames, $2x$3 tiles and rotation axis ($4,$5,$6).\n" - if {$!<2} return fi - v - + if $!<2 return fi slices 0 to_rgb r ${-max_whds},3 - off=0 repeat {$!-1} l[{$>+$off},{$>+$off+1}] - v + e[] "\r > Generate transition from image "$>" to image "{$>+1}". " v - + off=0 repeat $!-1 l[{$>+$off},{$>+$off+1}] + e[] "\r > Generate transition from image "$>" to image "{$>+1}". " # Create 3D rotation vectors. $2,$3,1,1,'$4' @@ -18735,7 +22784,7 @@ $2,$3,1,1,'$6' a[-3--1] z permute. zxyc r. 3,{$2*$3},1,1,-1 - repeat {h} rot$>={@0-2} shift. 0,-1,0,0 done + repeat h rot$>={@0-2} shift. 0,-1,0,0 done rm. # Create 3D tiles. @@ -18752,7 +22801,7 @@ done # Generate intermediate animation frames. - repeat {$1-2} + repeat $1-2 repeat $N r3d[$>] ${rot$>},{180/(1-$1)} ++3d[$>] ${x$>},${y$>},0 done +3d[-$N--1] c3d. @@ -18771,28 +22820,497 @@ nm[1--2] {0,n} off+={$1-2} endl done - v + #@cli video2files : input_filename,_output_filename,_first_frame>=0,_last_frame={ >=0 | -1=last },_frame_step>=1 #@cli : Split specified input video file into image files, one for each frame. #@cli : First and last frames as well as step between frames can be specified. #@cli : Default values: 'output_filename=frame.png', 'first_frame=0', 'last_frame=-1' and 'frame_step=1'. -video2files : check "isint(${3=0}) && $3>=0 && isint(${4=-1}) && ($4>=0 || $4==-1) && isint(${5=1}) && $5>=1" skip ${2="frame.png"} +video2files : check "isint(${3=0}) && $3>=0 && isint(${4=-1}) && ($4>=0 || $4==-1) && isint(${5=1}) && $5>=1" + skip ${2="frame.png"} e[^-1] "Split input video file '$1' into image frames '$2', with first frame $3, last frame $4, and frame step $5.\n" - v - frame=$3 stopflag=0 do l[] i "$1",$frame if $! o ${"filename \"$2\","$frame} rm - v + e[] "\r > Frame ""#"$frame v - + e[] "\r > Frame ""#"$frame frame+=$5 else stopflag=1 fi onfail stopflag=1 - endl while {!$stopflag" && "($frame<=$4" || "$4==-1)} - v + + endl while !$stopflag" && "($frame<=$4" || "$4==-1) + +#------------------------------ +# +#@cli :: Neural Networks +# +#------------------------------ +# The following commands (starting with 'nn_') is an attempt to have a way to manage +# neural networks (evaluate and learn). Consider all this at being at an early stage! + +# [internal] nn_define_activation_none +# Return a string that defines a identity activation function, and its derivative. +nn_define_activation_none : + u "activation_none(x) = (x);"\ + "d_activation_none(x) = (1);" + +# [internal] nn_define_activation_leakyrelu +# Return a string that defines a Leaky-RELU activation function, and its derivative. +nn_define_activation_leakyrelu : + u "activation_leakyrelu(x) = (x<0?0.01*x:x);"\ + "d_activation_leakyrelu(x) = (x<0?0.01:1);" + +# [internal] nn_define_activation_relu +# Return a string that defines a RELU activation function, and its derivative. +nn_define_activation_relu : + u "activation_relu(x) = (x<0?0:x);"\ + "d_activation_relu(x) = (x<0?0:1);" + +# [internal] nn_define_activation_sigmoid +# Return a string that defines a sigmoid activation function, and its derivative. +nn_define_activation_sigmoid : + u "activation_sigmoid(x) = (0.5 + 0.5*tanh(0.5*x));"\ + "d_activation_sigmoid(x) = (sigma(x)*(1 - sigma(x)));" + +# [internal] nn_define_loss_mse +# Return a string that defines the MSE loss function (Mean Squared Error), and its derivative. +nn_define_loss_mse : + u "loss_mse(x,truth) = (norm(x - truth)^2);"\ + "d_loss_mse(x,truth) = (2*(x - truth));" + +# [internal] nn_define_loss_ce +# Return a string that defines the CR loss function (Cross Entropy), and its derivative. +nn_define_loss_ce : + u "loss_ce(x,truth) = (sum(truth*log(x) + (1 - truth)*log(1 - x)));"\ + "d_loss_ce(x,truth) = (truth/x + (1-truth)/(1-x));" + +# [internal] nn_list_modules : module_name +# Return a list of all modules of the neural network. +nn_list_modules : + modules= + name=${"nn_name_input $1"} + for narg($name) + modules.=$c$name c="," + name=${_nn_${name}_next} + done + u $modules + +# [internal] nn_name_input : module_name +# Return the input module name of the neural network, and check its type. +nn_name_input : skip "${2=nn_name_input}" + name="$1" + if !narg(${_nn_${name}_type}) + error[0--4] "Command 'nn_name_input': Unknown module name '"$name"'." + fi + for narg($name) + name_input=$name + name=${_nn_${name}_previous} + done + type_input=${_nn_${name_input}_type} + if '$type_input'!='input' + error[0--4] "Command 'nn_name_input': Invalid input type '"$type_input"' (should be 'input')." + fi + u $name_input + +# [internal] nn_name_output : module_name +# Return the output module name of the neural network, and check its type. +nn_name_output : skip "${2=nn_name_output}" + name="$1" + if !narg(${_nn_${name}_type}) + error[0--4] "Command '$2': Unknown module name '"$name"'." + fi + for narg($name) + name_output=$name + name=${_nn_${name}_next} + done + type_output=${_nn_${name_output}_type} + if '$type_output'!='output' + error[0--4] "Command '$2': Invalid output type '"$type_output"' (should be 'output')." + fi + u $name_output + +#@cli nn_new_input : module_name,width,_height,_spectrum +#@cli : Add an input module with specified size to the neural network. +nn_new_input : check ${"is_variable_name $1"}" && isint($2) && $2>0 && isint(${3=1}) && $3>0 && isint(${4=1}) && $4>0" + e[^-1] "[NN] Add input module '$1' with size ($2,$3,$4)." + name="$1" + $2,$3,1,$4 + nm. $name + _nn_${name}_type="input" + _nn_${name}_width=$2 + _nn_${name}_height=$3 + _nn_${name}_spectrum=$4 + _nn_${name}_previous= + +#@cli : nn_new_output : module_name,previous_module_name +#@cli : Add an output module to the neural network. +nn_new_output : check ${"is_variable_name $1"}" && "${"is_variable_name $2"} + e[^-1] "[NN] Add output module '$1', linked to previous module '$2'." + name="$1" + name_previous="$2" + type_previous=${_nn_${name_previous}_type} + if !narg($type_previous) + error[0--3] "Command 'nn_new_output': Unknown name for previous module '"$name_previous"'." + fi + if '$type_previous'=='fullyconnected'" || "\ + '$type_previous'=='input' + 1,{$name_previous,h} + else + error[0--3] "Command 'nn_new_output': Invalid type for previous module '"$type_previous"'." + fi + nm. $name + _nn_${name}_type="output" + _nn_${name}_width=1 + _nn_${name}_height={h} + _nn_${name}_spectrum=1 + _nn_${name}_previous=$name_previous + _nn_${name}_next= + _nn_${name_previous}_next=$name + +#@cli nn_new_fullyconnected : module_name,previous_module_name,nb_neurons,activation_function +#@cli : Add a fully-connected module to the neural network. +nn_new_fullyconnected : check ${"is_variable_name $1"}" && "${"is_variable_name $2"}" && isint($3) && $3>0" + skip "${4=leakyrelu}" + e[^-1] "[NN] Add fully-connected module '$1', linked to previous module '$2', with $3 neurons and '$4' activation." + name="$1" + name_previous="$2" + type_previous=${_nn_${name_previous}_type} + width_previous=${_nn_${name_previous}_width} + height_previous=${_nn_${name_previous}_height} + spectrum_previous=${_nn_${name_previous}_spectrum} + if !narg($type_previous) + error[0--3] "Command 'nn_new_fullyconnected': Unknown name for previous module '"$name_previous"'." + fi + if '$type_previous'=='input' + {$name_previous,$width_previous*$height_previous*$spectrum_previous+1},$3 + elif '$type_previous'=='fullyconnected' + {$name_previous,$height_previous+1},$3 + else + error[0--3] "Command 'nn_new_fullyconnected': Invalid type for previous module '"$type_previous"'." + fi + rand. -1,1 + nm. $name + _nn_${name}_type="fullyconnected" + _nn_${name}_width=1 + _nn_${name}_height=$3 + _nn_${name}_spectrum=1 + _nn_${name}_activation="$4" + _nn_${name}_previous=$name_previous + _nn_${name_previous}_next=$name + +#@cli nn_propagate_batch : module_name,[inputs_zstacked] +#@cli : Batch propagate specified inputs through the neural network. +#@cli : Insert image of corresponding network outputs at the end of the list. +nn_propagate_batch : check ${"is_variable_name $1"}" && "${"is_image_arg $2"} + e[^-1] "[NN] Batch propapate inputs $2." + name_input=${"nn_name_input $1,$0"} + name_output=${"nn_name_output $1,$0"} + width_input=${_nn_${name_input}_width} + height_input=${_nn_${name_input}_height} + spectrum_input=${_nn_${name_input}_spectrum} + pass$2 1 N={d} # [-2] = shared copy of [inputs_zstacked] + if "w!="$width_input" || h!="$height_input" || s!="$spectrum_input + error[0--3] "Command 'nn_propagate_batch': Dimensions of specified inputs ("{[w,h,d,s]}") do not "\ + "match network input dimensions ("$width_input,$height_input,$spectrum_input")." + fi + {$name_output,[w,h,$N,s]} # [-1] = network outputs (to be filled) + _nn_code_begin= + _nn_code_body="x||y||c?0:("\ # Compute only once for each z + "O_"$name_input" = crop(0,0,z,0,w,h,1,s);" # Get input + nn_compile_propagate ${_nn_${name_input}_next} + _nn_code_body.="draw(#-1,O_"${_nn_${name_output}_previous}",0,0,z,0,w#-1,h#-1,1,s#-1);"\ # Set output + "0);" # End of 'x||y||c' condition + eval.. ":begin("$_nn_code_begin");"$_nn_code_body # Multi-threaded evaluation + _nn_code_begin,_nn_code_body= + rm[-2] + +#@cli nn_propagate : module_name +#@cli : Propagate input through the neural network. +nn_propagate : check ${"is_variable_name $1"} + e[^-1] "[NN] Propagate input." + name_input=${"nn_name_input $1,$0"} + name_output=${"nn_name_output $1,$0"} + _nn_code_begin,_nn_code_body= + nn_compile_propagate $name_input + _nn_code_body.="draw(#"${$name_output}",O_"${_nn_${name_output}_previous}");" # Set output + eval "begin("$_nn_code_begin");"$_nn_code_body # Single evaluation + _nn_code_begin,_nn_code_body= + +# [internal] nn_compile_propagate : module_name +# Generate code to propagate output from the specified module through the neural network. +# This command actually append code in global variables '_nn_code_begin' and '_nn_code_body'. +nn_compile_propagate : + _nn_code_begin.="v_apply(S,X) = "\ + "( unref(_tmp); _tmp = X; for (_k = 0, _k0" + e[^-1] "[NN] Update network weights, with epsilon $2." + + # Retrieve max(|gradients|). + name=${"nn_name_input $1"} + type=${_nn_${name}_type} + gradmax=0 + for narg($name) + if '$type'=='fullyconnected' + ${_nn_${name}_dB} ${_nn_${name}_dW} a[-2,-1] x + gradmax={max(1e-8,$gradmax,abs(im),abs(iM))} + rm. + fi + name=${_nn_${name}_next} + type=${_nn_${name}_type} + done + epsilon={$2/$gradmax} +# epsilon=$2 + + # Update weights. + name=${"nn_name_input $1"} + type=${_nn_${name}_type} + for narg($name) + nn_update_$type $name,$epsilon + name=${_nn_${name}_next} + type=${_nn_${name}_type} + done + +# [internal] nn_update_input : module_name,epsilon +# Update weights for an input (actually do nothing) +nn_update_input : + skip $* + +# [internal] nn_update_output : module_name,epsilon +# Update weights for an output vector (actually do nothing) +nn_update_output : + skip $* + +# [internal] nn_update_fullyconnected : module_name,epsilon +# Update weights for a fully-connected layer. +nn_update_fullyconnected : + name="$1" + ${_nn_${name}_dW} + ${_nn_${name}_dB} + a[-2,-1] x +# *. {$2/max(abs(im),abs(iM))} + *. $2 + -[$name,-1] + +#@cli nn_output : module_name,filename +#@cli : Output specified network as a file. +nn_output : check ${"is_variable_name $1"} + e[^-1] "[NN] Output network containing module '$1' as file '$2'." + nn_serialize $1,1 ot. "$2" rm. + +#@cli nn_serialize : module_name,_is_compressed={ 0 | 1 } +#@cli : Serialize network into a single image, optionnally in a compressed form. +nn_serialize : check ${"is_variable_name $1"}" && isbool(${2=0})" + e[^-1] "[NN] Serialize network containing module '$1', with"${"s0,s1=out, u ${s$2}"}" compression." + modules=${"nn_list_modules $1"} + name_input=${"nn_name_input $1"} + name=$name_input + type=${_nn_${name}_type} + attributes= + + for narg($name) + attributes.="_nn_$1_type="${_nn_$1_type}" "\ + "_nn_$1_width="${_nn_$1_width}" "\ + "_nn_$1_height="${_nn_$1_height}" "\ + "_nn_$1_spectrum="${_nn_$1_spectrum}" "\ + "_nn_$1_previous="${_nn_$1_previous}" "\ + "_nn_$1_next="${_nn_$1_next}" "\ + ${"nn_serialize_"$type" "$name} + name=${_nn_${name}_next} + type=${_nn_${name}_type} + done + ('$attributes') y. nm. _nn_serialize +serialize[$modules,-1] auto,$2,1 nm. ${name_input}_serialized rm.. + +# [internal] nn_serialize_input : module_name +# Save attributes of specified input, for serialization purposes. +nn_serialize_input : + +# [internal] nn_serialize_output : module_name +# Save attributes of specified output vector, for serialization purposes. +nn_serialize_output : + +# [internal] nn_serialize_fullyconnected : module_name +# Save attributes of specified fully-connected layer, for serialization purposes. +nn_serialize_fullyconnected : + u "_nn_$1_activation="${_nn_$1_activation}" " + +#@cli nn_unserialize +#@cli : Unserialize specified selection to retrieve a neural network. +nn_unserialize : + e[^-1] "[NN] Unserialize serialized network$?." + repeat $! l[$<] + unserialize run {t} rm. + endl done +#@cli nn_input : "filename" +#@cli : Input neural network from file. +nn_input : + e[^-1] "[NN] Input neural network from file '$1'." + l[] + it[] "$1" nn_unserialize. + endl #------------------------------ # @@ -18805,18 +23323,17 @@ #@cli : If a single image is in the selection, it is used as an icon for the alert box. #@cli : Default values: 'title=[G'MIC Alert]' and 'message=This is an alert box.'. alert : skip "${1=[G"{`39`}"MIC Alert]},${2=This is an alert box.},${3=OK}" - if {$!==1} + if $!==1 e[0--3] "Display alert box, with image$?, title '$1', message '$2' and buttons '${3--1}'." else e[0--3] "Display alert box, with title '$1', message '$2' and buttons '${3--1}'." fi - v - - if {$!==1} logo= else logo=[] fi + if $!==1 logo= else logo=[] fi +l$logo # Manage alert icon. - if {$!==1} to_rgb + if $!==1 to_rgb else # No logo provided, generate default logo (alert). 64,64 polygon 3,50%,10%,10%,90%,90%,90%,1,1 b 3 >= 50% +erode. 5 -. .. ==. 0 @@ -18829,13 +23346,13 @@ # Create buttons graphics. $=arg - repeat {$#-2} label=${arg{$>+3}} 0 t. $label,0,0,16,1,-200 done + repeat $#-2 label=${arg{$>+3}} 0 t. $label,0,0,16,1,-200 done r[^0] {min(128,max(64,${max_w[^0]}+12))},{min(48,max(24,${max_h[^0]}+12))},1,1,0,0,0.5,0.5 +[^0] 200 to_rgb[^0] mv[0] $! [0],[0],1,1,'(y-h/2)' *. -2 c. -30,30 +[0--3] . rm. c[^-1] 0,255 # Add shading to buttons. - repeat {$!-1} l[$<] + repeat $!-1 l[$<] # Create selected buttons. +rectangle 0,0,100%,100%,1,0xFFFFFFFF,0 @@ -18863,7 +23380,7 @@ # Render alert box graphics. +l channels 0,3 sh 1,100% -[50%--1] 200 rm[50%--1] frame 8,8,0 - if {$!<6} a[^-1] x else append_tiles[^-1] , fi + if $!<6 a[^-1] x else append_tiles[^-1] , fi 0 t. "$2",0,0,16,1,0,-200,-200,-200 r. {w+16},{h+8},1,4,0 a[-2,-1] x,0.5 rv a y,0.5 sh 1,100% +. 200 rm. @@ -18877,23 +23394,23 @@ (0,{w-1}) (0;{-2,h-1}) r[-2,-1] ...,3 a[-2,-1] c round. rv[-2,-1] *[-2,-1] discard. 0 r. {h/2},2,1,1,-1 channels.. 1,3 rv[-2,-1] - 100%,100% repeat {-3,w} x0={-3,i($>,0)} y0={-3,i($>,1)} rectangle. $x0,$y0,{$x0+{0,w}-1},{$y0+{0,h}-1},1,{1+$>} done + 100%,100% repeat w#-3 x0={-3,i($>,0)} y0={-3,i($>,1)} rectangle. $x0,$y0,{$x0+{0,w}-1},{$y0+{0,h}-1},1,{1+$>} done a[-2,-1] c # Enter event loop. - repeat 9 if {!{*$>}} disp=$> break fi done # Find available display window. - if {!narg($disp)} v + error[0--4] "Command '$0': Cannot open display window for alert box." fi + repeat 9 if !{*$>} disp=$> break fi done # Find available display window. + if !narg($disp) error[0--4] "Command '$0': Cannot open display window for alert box." fi selected={if($#==3,0,-1)} clicked=-1 do # Render current view. +channels. 0,2 - if {$clicked>=0} + if $clicked>=0 x0={-3,i($clicked,0)} y0={-3,i($clicked,1)} sh[$clicked] 7,9 j.. .,$x0,$y0 rm. - elif {$selected>=0} + elif $selected>=0 x0={-3,i($selected,0)} y0={-3,i($selected,1)} sh[$selected] 4,6 j.. .,$x0,$y0 rm. @@ -18902,38 +23419,37 @@ # Handle user interactions. xm={*$disp,x} ym={*$disp,y} bm={{*$disp,b}&1} val={i($xm,$ym,0,3)} - if {$bm" && "$val} clicked={$val-1} - elif {$bm" && "!$val" && "$clicked>=0} selected=$clicked clicked=-1 - elif {!$bm" && "$clicked>=0" && "$clicked==$val-1} break + if $bm" && "$val clicked={$val-1} + elif $bm" && "!$val" && "$clicked>=0 selected=$clicked clicked=-1 + elif !$bm" && "$clicked>=0" && "$clicked==$val-1 break fi if {*$disp,ARROWRIGHT} selected={($selected+1)%{-2,w}} wait -1 elif {*$disp,ARROWLEFT} selected={($selected-1)%{-2,w}+($selected==-1)} wait -1 - elif {$selected>=0" && "{*$disp,ENTER}} clicked=$selected break + elif $selected>=0" && "{*$disp,ENTER} clicked=$selected break fi - while {{*$disp}" && "!{*$disp,ESC}} + while {*$disp}" && "!{*$disp,ESC} - # Return result (indice of clicked button or '-1'). + # Return result (index of clicked button or '-1'). w$disp 0 rm u $clicked endl - v + #@cli arg : n>=1,_arg1,...,_argN #@cli : Return the n-th argument of the specified argument list. arg : check "isint($1) && ($1)>0" - v - $=arg u ${arg{1+($1)}} v + + $=arg u ${arg{1+($1)}} #@cli arg2var : variable_name,argument_1,...,argument_N #@cli : For each i in [1...N], set 'variable_name$i=argument_i'. #@cli : The variable name should be global to make this command useful (i.e. starts by an underscore). arg2var : - v - $=arg u {$#-1} repeat ${} $1{1+$>}=${arg{2+$>}} done v + + $=arg u {$#-1} repeat ${} $1{1+$>}=${arg{2+$>}} done #@cli autocrop_coords : value1,value2,... | auto -#@cli : Return coordinates (x0,y0,z0,x1,y1,z1) of the autocrop that could be performed on the latest of the selected images. +#@cli : Return coordinates (x0,y0,z0,x1,y1,z1) of the autocrop that could be performed on the latest +#@cli : of the selected images. #@cli : Default value: 'auto' autocrop_coords : skip ${1=auto} - v - is_auto={['"$1"']=='auto'} w={w} h={h} d={d} value={i(w-1,h-1,d-1)} +=. {1+$value},100%,100%,100% _autocrop$is_auto. ${1--1} =. $value,100%,100%,100% @@ -18941,24 +23457,30 @@ +_autocrop$is_auto. ${1--1} x1={$x0+w-1} y1={$y0+h-1} z1={$z0+d-1} rm. u $x0,$y0,$z0,$x1,$y1,$z1 - v + _autocrop0 : autocrop $* _autocrop1 : skip $* autocrop +#@cli average_colors +#@cli : Return the average vector-value of the latest of the selected images. +average_colors : + res="" + repeat s-1 sh. {1+$>} res=$res,{ia} rm. done + sh. 0 u {ia}$res rm. + #@cli base642img : "base64_string" #@cli : Decode given base64-encoded string as a newly inserted image at the end of the list. #@cli : The argument string must have been generated using command 'img2base64'. base642img : - v - base642uchar "$1" unserialize. v + + base642uchar "$1" unserialize. #@cli base642uchar : "base64_string" #@cli : Decode given base64-encoded string as a newly inserted 1-column image at the end of the list. #@cli : The argument string must have been generated using command 'uchar2base64'. base642uchar : - v - 0 + 0 eval " - hash = vector256(); + ref(vector256(),hash); for (k = _'A', k<=_'Z', ++k, hash[k] = k - _'A'); for (k = _'a', k<=_'z', ++k, hash[k] = k - _'a' + 26); for (k = _'0', k<=_'9', ++k, hash[k] = k - _'0' + 52); @@ -18980,95 +23502,81 @@ ) )" nm. "[unnamed]" - v + #@cli basename : file_path,_variable_name_for_folder #@cli : Return the basename of a file path, and opt. its folder location. #@cli : When specified 'variable_name_for_folder' must starts by an underscore #@cli : (global variable accessible from calling function). basename : skip ${2=unused} - v - l[] ({"'$1'"}) replace 92,47 s +,47 - if {i==47} a y $2={t} u "" - elif {$!==1} u {t} $2="" + if i==47 a y $2={t} u "" + elif $!==1 u {t} $2="" else a[^-1] y u {t} $2={-2,t} fi rm endl - v + #@cli bin : binary_int1,... #@cli : Print specified binary integers into their octal, decimal, hexadecimal and string representations. bin : - v - dec=${bin2dec\ ${^0}} v + + dec=${bin2dec\ ${^0}} e[^-1] "Convert binary integer"${arg\ 1+($#>1),"",s}" '${^0}' to octal '"${dec2oct\ $dec}"', decimal '"$dec"', hexadecimal '"${dec2hex\ $dec}"' and string '"${dec2str\ $dec}"'." #@cli bin2dec : binary_int1,... #@cli : Convert specified binary integers into their decimal representations. bin2dec : - v - res=${_$0\ $1} repeat {$#-1} res=$res,${_$0\ ${arg\ $>+2,${^0}}} done u $res v + + $=arg res,sep= repeat $# res=$res$sep${_$0\ ${arg{$>+1}}} sep=, done u $res _bin2dec : - ({'${strlowercase\ $1}'}) - is_negative=0 - if {i[0]==45} z. 1,100% is_negative=1 fi - f. "if(i>=48 && i<=49,(i-48)*2^(w-1-x),nan)" - u {if($is_negative,-1,1)*{is}} - rm. + u {"str = vtos(abs($1)); + for (k = val = 0, str[k], ++k, + c = str[k]; + (val<<=1)+=(c==_'0'?0:c==_'1'?1:nan); + isnan(val)?break() + ); sign($1)*val"} -# compress_gmic -# Compress .gmic custom command files for compressing update files a little bit, -# by removing empty lines, and useless comments. -compress_gmic : - v - - s -,10 N=$! - ap _compress_gmic - s -,10 i[1--2] (10) a y - v + - -_compress_gmic : - if {i==_'#'} - if {h<5" || "(!same([{^}],'#@gui',5)" && "!same([{^}],'#@cli',5)" && "!same([{^}],'#@web',5))} rm. (10) fi - else - l. s +,32,35 if {$!>2} k[0] fi a y endl - autocrop. 32 if {!w} rm. (10) fi +# Command to check what lines of G'MIC sources are larger than 120 columns. +_check120 : + use_vt100 + it[] "$1" s +,10 + 1,$!,1,2,">begin(line = 1); is_lines=i[#y,0]==10; line+=is_lines?h#y:0; [is_lines || h#y<=120?-1:y,line]" + lines={{@-1}-1} f. "I = I; if(I[0]<0,I[1]=-1); I" + discard. -1 + if w + r. 1,{h/2},1,2,-1 + repeat h + l,L={I[$>]} + e[] $_gmic_c" - [Line "$_gmic_b$L$_gmic_n$_gmic_c", "\ + $_gmic_b{$l,h}$_gmic_n$_gmic_c" chars]: "$_gmic_n{$l,t} + done fi + rm + _total_lines+=$lines + e[] " - Scanned : "${lines}" lines" -# compress_gmic_cli -# Compress .gmic custom command files for the 'gmic' command line tool, -# by removing empty lines, and useless comments (non starting with '#@cli'). -compress_gmic_cli : - v - - s -,10 N=$! - ap _compress_gmic_cli - s -,10 i[1--2] (10) a y - v + - -_compress_gmic_cli : - if {i==_'#'} - if {!same([{^}],'#@cli',5)" || (i[5]!=_' ' && i[5]!=_':')"} rm. (10) fi - else - l. s +,32,35 if {$!>2} k[0] fi a y endl - autocrop. 32 if {!w} rm. (10) fi - fi +check120 : + _total_lines=0 + files 0,*.h c={`narg($files)?',':0`} if narg(${}) files=$files$c${} fi + files 0,*.cpp c={`narg($files)?',':0`} if narg(${}) files=$files$c${} fi + files 0,*.c c={`narg($files)?',':0`} if narg(${}) files=$files$c${} fi + files 0,*.gmic c={`narg($files)?',':0`} if narg(${}) files=$files$c${} fi + repeat narg($files) + arg 1+$>,$files file=${} + e[] " * File '"$file"'." + v + _check120 $file v - + done + e[] " - Total scanned : "${_total_lines}" lines" -# compress_gmic_gui -# Compress .gmic custom command files for the plug-in, -# by removing empty lines, and useless comments (non starting with '#@gui'). -compress_gmic_gui : - v - - s -,10 N=$! - ap _compress_gmic_gui - s -,10 i[1--2] (10) a y - v + - -_compress_gmic_gui : - if {i==_'#'} - if {!same([{^}],'#@gui',5)} rm. (10) fi - else - l. s +,32,35 if {$!>2} k[0] fi a y endl - autocrop. 32 if {!w} rm. (10) fi - fi +#@cli covariance_colors : _avg_outvarname +#@cli : Return the covariance matrix of the vector-valued colors in the latest of the selected images +#@cli : (for arbitrary number of channels). +#@cli : Parameter 'avg_outvarname' is used as a variable name that takes the value of the average vector-value. +covariance_colors : skip "${1=avg}" + $1=${-average_colors} + f ">begin( avg = [ "$""$1" ]; const S2 = s^2; C = vectorS2(0); ); + mI = I - avg; C+=mul(mI,mI,s); + end( C/=whd - 1; run('u ',vtos(C)) ); + I" #@cli dec : decimal_int1,... #@cli : Print specified decimal integers into their binary, octal, hexadecimal and string representations. @@ -19079,59 +23587,49 @@ #@cli dec2str : decimal_int1,... #@cli : Convert specifial decimal integers into its string representation. dec2str : - v - u {`[${^0}]`} v + + u {`[${^0}]`} #@cli dec2bin : decimal_int1,... #@cli : Convert specified decimal integers into their binary representations. dec2bin : - v - res=${_$0\ $1} repeat {$#-1} res=$res,${_$0\ ${arg\ $>+2,${^0}}} done u $res v + + $=arg res,sep= repeat $# res=$res$sep${_$0\ ${arg{$>+1}}} sep=, done u $res -_dec2bin : check isint($1) - res="" r={abs($1)} - do res={$r%2}$res r={int($r/2)} while $r - u ${arg\ 1+($1>=0),-,""}$res +_dec2bin : + u {`"const sgn = sign($1); + const N = (isinf($1) || isnan($1)?1:1 + floor(log2(max(1,abs($1))))) + (sgn>=0?0:1); + res = vectorN(); + sgn>=0?0:(res[0] = _'-'); + for (val = abs($1); k = size(res) - 1, k>=(sgn<0?1:0), --k, res[k] = _'0' + (val&1); val>>=1); res"`} #@cli dec2hex : decimal_int1,... #@cli : Convert specified decimal integers into their hexadecimal representations. dec2hex : - v - res=${_$0\ $1} repeat {$#-1} res=$res,${_$0\ ${arg\ $>+2,${^0}}} done u $res v + + $=arg res,sep= repeat $# res=$res$sep${_$0\ ${arg{$>+1}}} sep=, done u $res -_dec2hex : check isint($1) - res="" r={abs($1)} - do res=${-_dec2hex_{$r%16}}$res r={int($r/16)} while $r - u ${arg\ 1+($1>=0),-,""}$res - -_dec2hex_0 : u 0 -_dec2hex_1 : u 1 -_dec2hex_2 : u 2 -_dec2hex_3 : u 3 -_dec2hex_4 : u 4 -_dec2hex_5 : u 5 -_dec2hex_6 : u 6 -_dec2hex_7 : u 7 -_dec2hex_8 : u 8 -_dec2hex_9 : u 9 -_dec2hex_10 : u a -_dec2hex_11 : u b -_dec2hex_12 : u c -_dec2hex_13 : u d -_dec2hex_14 : u e -_dec2hex_15 : u f +_dec2hex : + u {`"begin(tab = [ _'0',_'1',_'2',_'3',_'4',_'5',_'6',_'7',_'8',_'9',_'a',_'b',_'c',_'d',_'e',_'f' ]); + const sgn = sign($1); + const N = (isinf($1) || isnan($1)?1:1 + floor(log2(max(1,abs($1)))/4)) + (sgn>=0?0:1); + res = vectorN(); + sgn>=0?0:(res[0] = _'-'); + for (val = abs($1); k = size(res) - 1, k>=(sgn<0?1:0), --k, res[k] = tab[val&15]; val>>=4); res"`} #@cli dec2oct : decimal_int1,... #@cli : Convert specified decimal integers into their octal representations. dec2oct : - v - res=${_$0\ $1} repeat {$#-1} res=$res,${_$0\ ${arg\ $>+2,${^0}}} done u $res v + + $=arg res,sep= repeat $# res=$res$sep${_$0\ ${arg{$>+1}}} sep=, done u $res -_dec2oct : check isint($1) - res="" r={abs($1)} - do res={$r%8}$res r={int($r/8)} while $r - u ${arg\ 1+($1>=0),-,""}$res +_dec2oct : + u {`"const sgn = sign($1); + const N = (isinf($1) || isnan($1)?1:1 + floor(log2(max(1,abs($1)))/3)) + (sgn>=0?0:1); + res = vectorN(); + sgn>=0?0:(res[0] = _'-'); + for (val = abs($1); k = size(res) - 1, k>=(sgn<0?1:0), --k, res[k] = _'0' + (val&7); val>>=3); res"`} #@cli fact : value #@cli : Return the factorial of the specified value. fact : check isint($1) - v - res=1 repeat $1 res*={($>+1)} done u $res v + + res=1 repeat $1 res*={($>+1)} done u $res #@cli fibonacci : N>=0 #@cli : Return the Nth number of the Fibonacci sequence. @@ -19142,47 +23640,41 @@ #@cli : Rename or move a file from a location $1 to another location $2. file_mv : e[^-1] "Move file '$1' to location '$2'." - v - if ${-is_windows} x "move "$1" "$2 else x "mv "$1" "$2 fi v + + if ${-is_windows} x "move "$1" "$2 else x "mv "$1" "$2 fi #@cli file_rand #@cli : Return a random filename for storing temporary data. file_rand : - v - - do filename=${-path_tmp}gmic$_pid{round(u(0,9))}{round(u(0,9))}{round(u(0,9))}{round(u(0,9))}{round(u(0,9))}{round(u(0,9))} - while $filename + do filename=${-path_tmp}gmic$_pid{`round(u(vector6(_'0'),vector6(_'9')))`} + while isfile(['{/$filename}']) u $filename - v + #@cli file_rm : filename #@cli : Delete a file. file_rm : e[^-1] "Remove file '$1'." - v - if ${-is_windows} 1 nm. "$1" dir={/{f}} base={/{b}} ext={/{x}} rm. com="" - if {narg($dir)} com="cd \""$dir"\\\" && " fi - if {narg($ext)} com=${com}"del \""$base.$ext"\"" else com=${com}"del \""$base"\"" fi + if narg($dir) com="cd \""$dir"\\\" && " fi + if narg($ext) com=${com}"del \""$base.$ext"\"" else com=${com}"del \""$base"\"" fi x $com else x "rm -f \"$1\"" fi - v + #@cli filename : filename,_number1,_number2,...,_numberN #@cli : Return a filename numbered with specified indices. filename : skip "${1=default}" - v - - if {$#==1} u "$1" + if $#==1 u "$1" else (${2--1}) nm. "$1" u {f}{b} - repeat {w} + repeat w u ${}_{int(i/100000)%10}{int(i/10000)%10}{int(i/1000)%10}{int(i/100)%10}{int(i/10)%10}{i%10} shift. -1 done - if {narg({'{x}'})} u ${}.{x} fi + if narg({'{x}'}) u ${}.{x} fi rm. fi - v + #@cli files : _mode,path : (+) #@cli : Return the list of files and/or subfolders from specified path. @@ -19194,21 +23686,25 @@ #@cli fitratio_wh : min_width,min_height,ratio_wh #@cli : Return a 2D size 'width,height' which is bigger than 'min_width,min_height' and has the specified w/h ratio. fitratio_wh : - v - if {$3*$2>$1} u {int($3*$2)},$2 else u $1,{int($1/$3)} fi v + + if $3*$2>$1 u {int($3*$2)},$2 else u $1,{int($1/$3)} fi -#@cli fitscreen : width,height,_depth,_minimal_size[%],_maximal_size[%] +#@cli fitscreen : width,height,_depth,_minimal_size[%],_maximal_size[%] : [image],_minimal_size[%],_maximal_size[%] #@cli : Return the 'ideal' size WxH for a window intended to display an image of specified size on screen. #@cli : Default values: 'depth=1', 'minimal_size=128' and 'maximal_size=85%'. -fitscreen : check "$1>=1 && $2>=1 && ${3=1}>=1 && ${4=128}>0 && ${5=85%}>0" - v - +fitscreen : skip ${2=},${3=},${4=},${5=} + if ${"is_image_arg $1"} + l$1 W,H,D={[w,h,d]} endl if narg($2) m=$2 else m=25% fi if narg($3) M=$3 else M=85% fi + else + W,H=${1-2} if narg($3) D=$3 else D=1 fi if narg($4) m=$4 else m=25% fi if narg($5) M=$5 else M=85% fi + fi eval " is_percent(str) = (unref(_is_pct); _is_pct=['#str']; _is_pct[size(_is_pct) - 1]==_'%'); const u = "{*,u}"; const v = "{*,v}"; - ms = round(is_percent($4)?[ u,v ]*$4:[ $4,$4 ]); - Ms = round(is_percent($5)?[ u,v ]*$5:[ $5,$5 ]); - s = [ $1,$2 ]; - $3>1?(s+=$3); + ms = round(is_percent("$m")?[ u,v ]*"$m":[ "$m,$m" ]); + Ms = round(is_percent("$M")?[ u,v ]*"$M":[ "$M,$M" ]); + s = [ "$W,$H" ]; + "$D">1?(s+="$D"); s[0]Ms[0]?(s = [ Ms[0],s[1]*Ms[0]/s[0] ]); @@ -19216,34 +23712,35 @@ s[0] = max(1,s[0],ms[0]); s[1] = max(1,s[1],ms[1]); round(s)" - v + #@cli fontchart #@cli : Insert G'MIC font chart at the end of the image list. #@cli : $ fontchart fontchart : e[^-1] "Generate G'MIC font chart." - v - l[] - repeat 256 char={`max(1,(c=$>;c>=23&&c<=28?32:c))`} 0 t. {``$char},0,0,50,1,255 done + l[] + repeat 256 + if $>==92 char=\\ else char={`max(1,(c=$>;c>=23&&c<=28?32:c))`} fi + 0 t. {``$char},0,0,50,1,255 + done a z,0.5 s z repeat $! t[$>] $>,1,-1,13,1,200 - 0 t. \\${dec2oct\ $>},1,-1,13,1,200 100%,100%,1,1,1 - j[$>] .,{$>,[w,h]-[w#-1,h#-1]},0,0,1,.. rm[-2,-1] + 0 t. \\${dec2oct\ $>},1,-1,13,1,1 + 100%,100%,1,1,200 j[$>] .,{$>,[w,h]-[w#-1,h#-1]},0,0,1,.. rm[-2,-1] done - frame 1,1,128 - append_tiles , - endl v + + frame 1,1,128 append_tiles , + endl # font2cimgh # Encode a font image as a C-style string for CImg.h. font2cimgh : e[^-1] "Encode font image$? as a C-style string for CImg.h." - v - repeat $! l[$>] bnm={0,b} - v + e[] " > Encode font '"$bnm"'." v - + repeat $! l[$>] bnm={0,b} + e[] " > Encode font '"$bnm"'." W,H={[w/256,h]} - if {!isint($W)} error[0--4] "Font image '"$bnm"' has wrong dimensions ("{[w,h,d,s]}")." fi + if !isint($W) error[0--4] "Font image '"$bnm"' has wrong dimensions ("{[w,h,d,s]}")." fi +f "i==im || i==iM" is_binary={im==1} rm. # Find best parameters for RLE compression. @@ -19251,11 +23748,12 @@ do M={floor(($Mm+$MM)/2)} +compress_rle $is_binary,$M rows. 6,100% +. {32-im} iM={iM} - if {iM<126} Mm=$M rm. elif {iM>126} MM=$M rm. fi - while {$iM!=126} + if iM<126 Mm=$M rm. elif iM>126 MM=$M rm. fi + while $iM!=126 k. nb_chunks={1+int(h/65536)} - v + e[] "\r > Encode font '"$bnm"' -> W = "$W", H = "$H", M = "$M", is_binary = "$is_binary", nb_chunks = "$nb_chunks"." v - + e[] "\r > Encode font '"$bnm"' -> W = "$W", H = "$H", M = "$M", is_binary = "$is_binary", + nb_chunks = "$nb_chunks"." # Generate C-style string for storing font data. replace_str "\\","\\\\" @@ -19264,36 +23762,34 @@ repeat $! if {$>,i[h-1]==_'\\'&&i[h-2]!=_'\\'} rows[$>] 0,{$>,h-2} rows[{$>+1}] -1,100% =[{$>+1}] {'\\'} fi l[$>] - i[0] ({'" \""'}) ({'\"'}) - if {!$<} ({'" };"'}) fi - ({'\n'}) + i[0] ('" \""') ('\"') + if !$< ('" };"') fi + ('\n') y a y endl done - repeat {$nb_chunks-1} ind={int($!*($>+1)/$nb_chunks)} l[$ind] = {','},0,100% ({'\n'}) y a y endl done - i[0] ({'" static const char *const data_font"${W}x${H}"[] = {"\n'}) - y a y o raw:$bnm.h,uchar + repeat $nb_chunks-1 ind={int($!*($>+1)/$nb_chunks)} l[$ind] = {','},0,100% ('\n') y a y endl done + i[0] ('" static const char *const data_font"${W}x${H}"[] = {"\n') + y a y ot $bnm.h - endl done v + + endl done #@cli fps #@cli : Return the number of time this function is called per second, or -1 if this info is not yet available. #@cli : Useful to display the framerate when displaying animations. fps : - v - - if {narg($_fps_fps)} + if narg($_fps_fps) dt={$|-$_fps_time} - if {$dt>1} _fps_fps={round($_fps_nbframes/$dt)} _fps_time=$| _fps_nbframes=0 fi + if $dt>1 _fps_fps={round($_fps_nbframes/$dt)} _fps_time=$| _fps_nbframes=0 fi u $_fps_fps _fps_nbframes+=1 else _fps_nbframes=0 _fps_time=$| _fps_fps=-1 u -1 fi - v + #@cli gcd : a,b #@cli : Return the GCD (greatest common divisor) between a and b. gcd : check "isint($1) && isint($2) && $1*$2!=0" - v - _gcd {max(abs($1),abs($2))},{min(abs($1),abs($2))} v + + _gcd {max(abs($1),abs($2))},{min(abs($1),abs($2))} _gcd : r={$1%$2} if $r u ${_gcd\ $2,$r} else u $2 fi @@ -19301,207 +23797,299 @@ #@cli hex : hexadecimal_int1,... #@cli : Print specified hexadecimal integers into their binary, octal, decimal and string representations. hex : - v - dec=${hex2dec\ ${^0}} v + + dec=${hex2dec\ ${^0}} e[^-1] "Convert hexadecimal integer"${arg\ 1+($#>1),s,""}" '${^0}' to binary '"${dec2bin\ $dec}"', octal '"${dec2oct\ $dec}"', decimal '"$dec"' and string '"${dec2str\ $dec}"'." #@cli hex2dec : hexadecimal_int1,... #@cli : Convert specified hexadecimal integers into their decimal representations. hex2dec : - v - res=${_$0\ $1} repeat {$#-1} res=$res,${_$0\ ${arg\ $>+2,${^0}}} done u $res v + + $=arg res,sep= repeat $# res=$res$sep${_$0\ ${arg{$>+1}}} sep=, done u $res _hex2dec : - ({'${strlowercase\ $1}'}) - is_negative=0 - if {i[0]==45} z. 1,100% is_negative=1 fi - f. "if(i>=48 && i<=57,i-48,if(i>=97 && i<=102,i-87,nan))*16^(w-1-x)" - u {if($is_negative,-1,1)*{is}} - rm. + u {"str = ['$1']; str[0]==_'-'?-stov([['0x'],str[1,max(1,size(str)-1)]]):stov([['0x'],str])"} #@cli hex2img : "hexadecimal_string" #@cli : Insert new image 1xN at the end of the list with values specified by the given hexadecimal-encoded string. hex2img : - v - ({'"$1"'}) 1,{w/2} + ('"$1"') 1,{w/2} f. "* from_char(x) = x>=48 && x<=57?x - 48:x-87; off = 2*y; from_char(i[#-2,off])*16 + from_char(i[#-2,off+1])" - rm.. v + + rm.. #@cli hex2str : hexadecimal_string #@cli : Convert specified hexadecimal string into a string. hex2str : skip ${1=""} - v - - if {!narg("$1")} u "" v + return fi - ({'$*'}) if {w<2} rm. u "" v + return fi + if !narg("$1") u "" return fi + ('$*') if w<2 rm. u "" return fi f. 'v=i-if(i>=97,87,48);if(x%2,v,v*16)' r. 2,{int(w/2)},1,1,-1 cumulate. x z. 1,1 - u {t} rm. v + + u {t} rm. + +#@cli img2base64 : _encoding={ 0=base64 | 1=base64url },_store_names={ 0 | 1 } +#@cli : Encode selected images as a base64-encoded string. +#@cli : The images can be then decoded using command 'base642img'. +#@cli : Default values: 'encoding=0'. +img2base64 : check "isbool(${1=0}) && isbool(${2=1})" + if isnum("$1") encoding=$1 else encoding=0 noarg fi + +serialize auto,1,$2 u ${uchar2base64\ $encoding} rm. #@cli img2hex #@cli : Return representation of last image as an hexadecimal-encoded string. #@cli : Input image must have values that are integers in [0,255]. img2hex : - v - whds={w},{h},{d},{s} y. 2,{h} + whds={w},{h},{d},{s} y. 2,{h} f.. "* to_char(x) = x>=0 && x<=9?48 + x:87 + x; i(#-1,0,y) = to_char(int(i/16)); i(#-1,1,y) = to_char(i%16); i" - u {t} rm. r. $whds,-1 v + + u {t} rm. r. $whds,-1 #@cli img2str #@cli : Return the content of the latest of the selected images as a special G'MIC input string. img2str : - v - - u "(" - repeat {s},c - repeat {d},z - repeat {h},y - +z. 0,$y,$z,$c,100%,$y,$z,$c - u ${}{^} - rm. - if {$y!=h-1} u ${}; fi - e ${} - done - if {$z!=d-1} u ${}/ fi - done - if {$c!=s-1} u ${}^ fi - done - u ${}")" - v + + i[-2] 256 + eval. ">begin(off = 0); + sep = x==w - 1?(y==h - 1?(z==d - 1?(c==s - 1?0:_'^'):_'/'):_';'):_','; + it = vtos(i); + off + size(it) + 1>=w(#-2)?resize(#-2,round(1.5*w(#-2)),1,1,1,0); + for (k = 0, k1 i[1--2] ('"$1"') fi a x u {0,t} rm endl #@cli img82hex #@cli : Convert selected 8bits-valued vectors into their hexadecimal representations (ascii-encoded). img82hex : e[^-1] "Convert 8bits-valued vector$? into hexadecimal representations (ascii-encoded)." - v - % 256 y + % 256 y repeat $! +f[$>] 'v=int(i)&15;v+if(v<10,48,87)' # Lower digit f[$>] 'v=int(i)>>4;v+if(v<10,48,87)' # Higher digit a[$>,-1] x - done v + + done #@cli hex2img8 #@cli : Convert selected hexadecimal representations (ascii-encoded) into 8bits-valued vectors. hex2img8 : e[^-1] "Convert hexadecimal representation$? (ascii-encoded) into 8bits-valued vectors." - v - repeat $! + repeat $! s. x,2 f[-2,-1] 'if(i>=97,i-87,i-48)' *.. 16 +[-2,-1] - mv. 0 done v + + mv. 0 done #@cli is_3d #@cli : Return 1 if all of the selected images are 3D objects, 0 otherwise. is_3d : - v - u 1 l check3d 1 onfail u 0 endl v + + u 1 l check3d 1 onfail u 0 endl # Faster version. _is_3d : - v - u {"h>6 && int(i[0])==67 && int(i[1])==73 && int(i[2])==109 && int(i[3])==103 && int(i[4])==51 && int(i[5])==100"} v + + u {"h>6 && int(i[0])==67 && int(i[1])==73 && int(i[2])==109 && int(i[3])==103 && int(i[4])==51 && int(i[5])==100"} + +#@cli is_change : _value={ 0=false | 1=true } +#@cli : Set or unset the 'is_change' flag associated to the image list. +#@cli : This flag tells the interpreter whether or not the image list should be displayed when the pipeline ends. +#@cli : Default value: 'value=1'. +is_change : + l[] check "isbool(${1=1})" arg=$1 onfail noarg arg=1 endl + if $arg 0 rm. else w9[] 0 fi + +#@cli is_half +#@cli : Return 1 if the type of image pixels is limited to half-float. +is_half : + (2049) u {i==2048} rm. #@cli is_ext : filename,_extension #@cli : Return 1 if specified filename has a given extensioin. is_ext : skip "${1=}" - v - 0 nm. "_$1" u {"lowercase(['"{x}"'])==lowercase(['$2'])"} rm. v + + 0 nm. "_$1" u {"lowercase(['"{x}"'])==lowercase(['$2'])"} rm. #@cli is_image_arg : string #@cli : Return 1 if specified string looks like '[ind]'. is_image_arg : skip "${1=;}" - v - u {"str = ['$1']; s1 = size(str) - 1; (str[0]==_'[' && str[s1]==_']') || (str[0]=='.' && str[s1]=='.') && min(str)>=45 && max(str)<=122"} - v + #@cli is_pattern : string #@cli : Return 1 if specified string looks like a drawing pattern '0x......'. is_pattern : skip "${1=;}" - v - u {"str = ['$1']; size(str)>2 && same(str,'0x',2)"} v + + u {"str = ['$1']; size(str)>2 && same(str,'0x',2)"} #@cli is_percent : string #@cli : Return 1 if specified string ends with a '%', 0 otherwise. is_percent : - v - u {"s=['$1'];s[size(s)-1]==_'%'"} v + + u {"s=['$1'];s[size(s)-1]==_'%'"} + +#@cli is_variable_name : "str" +#@cli Returns 1 if specified argument can be considered as a variable name, 0 otherwise. +is_variable_name : + l[] + u {"str = ['$1']; + res = 1; + for (k = 0, res && k=_'a' && c<=_'z') || (c>=_'A' && c<=_'Z') || (c>=_'0' && c<=_'9') || c=='_'; + ); + c = str[0]; + res && (c<_'0' || c>_'9')"} + onfail u 0 endl #@cli is_videofilename #@cli : Return 1 if extension of specified filename is typical from video files. is_videofilename : skip "${1=}" - v - 0 nm. "_$1" u {" + 0 nm. "_$1" u {" ext = lowercase(['"{x}"']); ext=='avi' || ext=='mov' || ext=='asf' || ext=='divx' || ext=='flv' || ext=='mpg' || ext=='m1v' || ext=='m2v' || ext=='m4v' || ext=='mjp' || ext=='mp4' || ext=='mkv' || ext=='mpe' || ext=='movie' || ext=='ogm' || ext=='ogg' || ext=='ogv' || ext=='qt' || ext=='rm' || ext=='vob' || ext=='wmv' || ext=='xvid' || ext=='mpeg'"} - rm. v + + rm. + +#@cli is_macos +#@cli : Return 1 if current computer OS is Darwin (MacOS), 0 otherwise. +is_macos : + if !narg($_is_macos) l[] + if ${-is_windows} _is_macos=0 return fi + file=${-path_tmp}gmic_uname + x "uname >"{/$file} + it[] $file + _is_macos={same(crop(),'Darwin',6,0)} + rm + onfail _is_macos=0 rm + endl fi + u $_is_macos #@cli is_windows #@cli : Return 1 if current computer OS is Windows, 0 otherwise. is_windows : - v - u {narg($OS)==1" && "narg($WINDIR)==1} v + + u {narg($OS)==1" && "narg($WINDIR)==1} #@cli math_lib #@cli : Return string that defines a set of several useful macros for the embedded math evaluator. math_lib : - v - u " + transpose(A,nA) = transp(A,nA); # For =h(#ind) - 1?resize(#ind,1,_heap_siz*2 + 2,1,s#ind,0); + hind = h(#ind); + unref(_heap_elt); + _heap_elt = [ elt ]; + _heap_eltsiz = max(1,size(_heap_elt)); + + copy(i[#ind,_heap_siz],_heap_elt[0],_heap_eltsiz,hind,1); + for (_heap_pos = _heap_siz, + _heap_pos && (_heap_par = int((_heap_pos + 1)/2) - 1; _heap_elt[0]i[#ind,_heap_right]?( + _heap_swap = i[#ind,_heap_left]i[#ind,_heap_left]?( + _heap_swap = _heap_left; + ):break(); + copy(i[#ind,_heap_siz],i[#ind,_heap_swap],_heap_eltsiz,hind,hind); # Use previous last elt as temporary for swap. + copy(i[#ind,_heap_swap],i[#ind,_heap_pos],_heap_eltsiz,hind,hind); + copy(i[#ind,_heap_pos],i[#ind,_heap_siz],_heap_eltsiz,hind,hind); + _heap_pos = _heap_swap; + ); + (heap_size(#ind)) = _heap_siz; + ); + + # Return number of elements in dynamic array #ind. + dar_size(ind) = i[#ind,whd(#ind)-1]; + + # Inserts new element 'elt' into dynamic array #ind, at index [pos] ('pos' must be in [0,dar_size(#ind)]). + dar_insert(ind,elt,pos) = ( _dar_pos = pos; _dar_siz = dar_size(#ind); if (_dar_pos<=_dar_siz, - _dar_siz>=h(#ind) - 1?resize(#ind,1,_dar_siz*2 + 2,1,s#ind,0); - for (_dar_c = 0, _dar_c=h(#ind) - 1?resize(#ind,1,_dar_siz*2 + 2,1,s(#ind),0); + for (_dar_c = 0, _dar_c=h(#ind) - 1?resize(#ind,1,_dar_siz*2 + 2,1,s#ind,0); + _dar_siz>=h(#ind) - 1?resize(#ind,1,_dar_siz*2 + 2,1,s(#ind),0); unref(_dar_elt); _dar_elt = elt; copy(i[#ind,_dar_siz],_dar_elt,max(1,size(_dar_elt)),h(#ind),1); (dar_size(ind#)) = ++_dar_siz; ); - dar_remove(ind,pos) = ( # Remove element from dynamic array #ind, at index [pos] ('pos' must be in [0,dar_size(#ind) - 1]). + # Remove element from dynamic array #ind, at index [pos] ('pos' must be in [0,dar_size(#ind) - 1]). + dar_remove(ind,pos) = ( _dar_pos = pos; _dar_siz = dar_size(#ind); + if (_dar_pos<_dar_siz, _dar_siz = --dar_size(#ind); - for (_dar_c = 0, _dar_c0?dar_size(#ind) = --_dar_size; ); - dist(A,B) = ( # Distance from point A to point B + # Distance from point A to point B + dist(A,B) = ( norm(B - A); ); - dist(X,A,B) = ( # Distance from point X to segment [A,B] + # Distance from point X to segment [A,B] + dist(X,A,B) = ( AB = B - A; P = A + dot(X - A,B - A)/max(1e-8,dot(AB,AB))*AB; dot(P - A,P - B)<=0?norm(P - X):min(norm(A - X),norm(B - X)); ); - dist(A,B,C,D) = ( # Distance from segment [A,B] to segment [C,D] + # Distance from segment [A,B] to segment [C,D] + dist(A,B,C,D) = ( min(dist(A,C,D),dist(B,C,D),dist(C,A,B),dist(D,A,B)); ); - search_dichotomic(fn_x,target,epsilon,xmin,xmax) = ( # Dichotomic search : Find x in [xmin,xmax] s.a f(x) = target, with a epsilon-precision + # Dichotomic search : Find x in [xmin,xmax] s.a f(x) = target, with a epsilon-precision + search_dichotomic(fn_x,target,epsilon,xmin,xmax) = ( # fn_x must be a strictly monotonic function ! # if 'xmin = xmax = nan', range of 'x' is auto-detected. _dicho_fn(x) = _dicho_sgn*(fn_x); @@ -19509,7 +24097,6 @@ _dicho_m = xmin; _dicho_M = xmax; _dicho_sgn = 1; - _dicho_autom = isnan(_dicho_m); _dicho_autoM = isnan(_dicho_M); if (_dicho_autom, _dicho_m = -1); @@ -19518,9 +24105,17 @@ _dicho_res = nan; _dicho_target = _dicho_sgn*target; _dicho_nb_attempts = 30; - _dicho_autom?do (_dicho_fm = _dicho_fn(_dicho_m); _dicho_fm<_dicho_target?break(); _dicho_m*=2; _(while), --_dicho_nb_attempts); + _dicho_autom?do ( + _dicho_fm = _dicho_fn(_dicho_m); + _dicho_fm<_dicho_target?break(); + _dicho_m*=2; + _(while), --_dicho_nb_attempts); _dicho_nb_attempts?( - _dicho_autoM?do (_dicho_fM = _dicho_fn(_dicho_M); _dicho_fM>_dicho_target?break(); _dicho_M*=2; _(while), --_dicho_nb_attempts); + _dicho_autoM?do ( + _dicho_fM = _dicho_fn(_dicho_M); + _dicho_fM>_dicho_target?break(); + _dicho_M*=2; + _(while), --_dicho_nb_attempts); _dicho_nb_attempts?( _dicho_nb_attempts = 100; do ( @@ -19590,7 +24185,7 @@ _xmax = min(w#ind-1,max(_A[0],_B[0],_C[0])); _ymin = max(0,min(_A[1],_B[1],_C[1])); _ymax = min(h#ind-1,max(_A[1],_B[1],_C[1])); - _M = transp([_A,1,_B,1,_C,1],3); + _M = transpose([_A,1,_B,1,_C,1],3); for (_y = _ymin, _y<_ymax, ++_y, for (_x = _xmin, _x<_xmax, ++_x, _L = round(solve(_M,[_x,_y,1]),1e-5); @@ -19671,288 +24266,565 @@ _AB = B - A; P = A + dot(X - A,_AB)/max(1e-8,dot(_AB,_AB))*_AB; ); - " - v + + + # CIE DeltaE_2000 color difference function. + # (code adapted from https://github.com/gfiumara/CIEDE2000). + deltaE00(lab1,lab2) = ( + _deltaE00_deg2rad(deg) = (deg*pi/180); + unref(_deltaE00_lab1); _deltaE00_lab1 = lab1; + unref(_deltaE00_lab2); _deltaE00_lab2 = lab2; + unref(_deltaE00_k_L); const _deltaE00_k_L = 1; + unref(_deltaE00_k_C); const _deltaE00_k_C = 1; + unref(_deltaE00_k_H); const _deltaE00_k_H = 1; + unref(_deltaE00_deg360inrad); const _deltaE00_deg360inrad = _deltaE00_deg2rad(360); + unref(_deltaE00_deg180inrad); const _deltaE00_deg180inrad = _deltaE00_deg2rad(180); + unref(_deltaE00_pow25to7); const _deltaE00_pow25to7 = 25^7; + + # Step 1 + _deltaE00_C1 = norm(_deltaE00_lab1[1,2]); + _deltaE00_C2 = norm(_deltaE00_lab2[1,2]); + _deltaE00_barC = (_deltaE00_C1 + _deltaE00_C2)/2; + _deltaE00_G = 0.5*(1 - sqrt(_deltaE00_barC^7/(_deltaE00_barC^7 + _deltaE00_pow25to7))); + _deltaE00_a1prime = (1 + _deltaE00_G)*_deltaE00_lab1[1]; + _deltaE00_a2prime = (1 + _deltaE00_G)*_deltaE00_lab2[1]; + _deltaE00_Cprime1 = norm(_deltaE00_a1prime,_deltaE00_lab1[2]); + _deltaE00_Cprime2 = norm(_deltaE00_a2prime,_deltaE00_lab2[2]); + + _deltaE00_lab1[2]==0 && _deltaE00_a1prime==0?( + _deltaE00_hprime1 = 0; + ):( + _deltaE00_hprime1 = atan2(_deltaE00_lab1[2],_deltaE00_a1prime); + _deltaE00_hprime1<0?(_deltaE00_hprime1+=_deltaE00_deg360inrad); + _deltaE00_lab2[2]==0 && _deltaE00_a2prime==0?( + _deltaE00_hprime2 = 0; + ):( + _deltaE00_hprime2 = atan2(_deltaE00_lab2[2],_deltaE00_a2prime); + _deltaE00_hprime2<0?(_deltaE00_hprime2+=_deltaE00_deg360inrad); + ); + ); + + # Step 2 + _deltaE00_deltaLprime = _deltaE00_lab2[0] - _deltaE00_lab1[0]; + _deltaE00_deltaCprime = _deltaE00_Cprime2 - _deltaE00_Cprime1; + _deltaE00_CprimeProduct = _deltaE00_Cprime1*_deltaE00_Cprime2; + _deltaE00_CprimeProduct==0?( + _deltaE00_deltahprime = 0; + ):( + _deltaE00_deltahprime = _deltaE00_hprime2 - _deltaE00_hprime1; + _deltaE00_deltahprime<-_deltaE00_deg180inrad?( + _deltaE00_deltahprime += _deltaE00_deg360inrad; + ):_deltaE00_deltahprime>_deltaE00_deg180inrad?( + _deltaE00_deltahprime -= _deltaE00_deg360inrad; + ); + ); + _deltaE00_deltaHprime = 2*sqrt(_deltaE00_CprimeProduct)*sin(_deltaE00_deltahprime/2); + + # Step 3 + _deltaE00_barLprime = (_deltaE00_lab1[0] + _deltaE00_lab2[0])/2; + _deltaE00_barCprime = (_deltaE00_Cprime1 + _deltaE00_Cprime2)/2; + _deltaE00_hprimeSum = _deltaE00_hprime1 + _deltaE00_hprime2; + _deltaE00_Cprime1*_deltaE00_Cprime2==0?( + _deltaE00_barhprime = _deltaE00_hprimeSum; + ):( + abs(_deltaE00_hprime1 - _deltaE00_hprime2)<=_deltaE00_deg180inrad?( + _deltaE00_barhprime = _deltaE00_hprimeSum/2; + ):( + _deltaE00_hprimeSum<_deltaE00_deg360inrad?( + _deltaE00_barhprime = (_deltaE00_hprimeSum + _deltaE00_deg360inrad)/2; + ):( + _deltaE00_barhprime = (_deltaE00_hprimeSum - _deltaE00_deg360inrad)/2; + ); + ); + ); + + _deltaE00_T = 1.0 - (0.17*cos(_deltaE00_barhprime - _deltaE00_deg2rad(30))) + + (0.24*cos(2*_deltaE00_barhprime)) + + (0.32*cos(3*_deltaE00_barhprime + _deltaE00_deg2rad(6))) - + (0.2*cos(4*_deltaE00_barhprime - _deltaE00_deg2rad(63))); + _deltaE00_deltaTheta = _deltaE00_deg2rad(30)* + exp(-((_deltaE00_barhprime - _deltaE00_deg2rad(275)) / _deltaE00_deg2rad(25))^2); + + _deltaE00_R_C = 2*sqrt(_deltaE00_barCprime^7/(_deltaE00_barCprime^7 + _deltaE00_pow25to7)); + _deltaE00_S_L = 1 + 0.015*(_deltaE00_barLprime - 50)^2/sqrt(20 + (_deltaE00_barLprime - 50)^2); + _deltaE00_S_C = 1 + 0.045*_deltaE00_barCprime; + _deltaE00_S_H = 1 + 0.015*_deltaE00_barCprime*_deltaE00_T; + _deltaE00_R_T = -sin(2*_deltaE00_deltaTheta)* _deltaE00_R_C; + + sqrt((_deltaE00_deltaLprime/(_deltaE00_k_L*_deltaE00_S_L))^2 + + (_deltaE00_deltaCprime/(_deltaE00_k_C*_deltaE00_S_C))^2 + + (_deltaE00_deltaHprime/(_deltaE00_k_H*_deltaE00_S_H))^2 + + _deltaE00_R_T*_deltaE00_deltaCprime/(_deltaE00_k_C*_deltaE00_S_C)* + _deltaE00_deltaHprime/(_deltaE00_k_H*_deltaE00_S_H)); + );" #@cli mad #@cli : Return the MAD (Maximum Absolute Deviation) of the last selected image. #@cli : The MAD is defined as MAD = med_i|x_i-med_j(x_j)| mad : - v - if $! +-. {ic} abs. u {1.4826*ic} rm. else u 0 fi v + + if $! +-. {ic} abs. u {1.4826*ic} rm. else u 0 fi #@cli max_w #@cli : Return the maximal width between selected images. max_w : - v - u {arg(1,${_max_whds\ 4})} v + + _minmax_whds max,0,1 #@cli max_h #@cli : Return the maximal height between selected images. max_h : - v - u {arg(2,${_max_whds\ 4})} v + + _minmax_whds max,1,1 #@cli max_d #@cli : Return the maximal depth between selected images. max_d : - v - u {arg(3,${_max_whds\ 4})} v + + _minmax_whds max,2,1 #@cli max_s #@cli : Return the maximal spectrum between selected images. max_s : - v - u {arg(4,${_max_whds\ 4})} v + + _minmax_whds max,3,1 #@cli max_wh #@cli : Return the maximal wxh size of selected images. max_wh : - v - _max_whds 2 v + + _minmax_whds max,0,2 #@cli max_whd #@cli : Return the maximal wxhxd size of selected images. max_whd : - v - _max_whds 3 v + + _minmax_whds max,0,3 #@cli max_whds #@cli : Return the maximal wxhxdxs size of selected images. max_whds : - v - _max_whds 4 v + - -_max_whds : - w=0 h=0 d=0 s=0 - repeat $! - w={max($w,w)} - h={max($h,h)} - d={max($d,d)} - s={max($s,s)} - mv. 0 done - if {$1>=4} u $w,$h,$d,$s - elif {$1==3} u $w,$h,$d - elif {$1==2} u $w,$h - else u $w - fi - -#@cli med -#@cli : Return the median value of the last selected image. -med : - v - u {ic} v + + _minmax_whds max,0,4 #@cli median_color #@cli : Return the median color value of the last selected image. median_color : - v - u "" s="" repeat {s} +channels. $> u ${}$s${med.} s=, rm. done v + + u "" s="" repeat s +channels. $> u ${}$s${med.} s=, rm. done #@cli min_w #@cli : Return the minimal width between selected images. min_w : - v - u {arg(1,${_min_whds\ 4})} v + + _minmax_whds min,0,1 #@cli min_h #@cli : Return the minimal height between selected images. min_h : - v - u {arg(2,${_min_whds\ 4})} v + + _minmax_whds min,1,1 #@cli min_d #@cli : Return the minimal depth between selected images. min_d : - v - u {arg(3,${_min_whds\ 4})} v + + _minmax_whds min,2,1 #@cli min_s #@cli : Return the minimal s size of selected images. min_s : - v - _min_s ${_min_whds\ 4} v + - -_min_s : - u $4 + _minmax_whds min,3,1 #@cli min_wh #@cli : Return the minimal wxh size of selected images. min_wh : - v - _min_whds 2 v + + _minmax_whds min,0,2 #@cli min_whd #@cli : Return the minimal wxhxd size of selected images. min_whd : - v - _min_whds 3 v + + _minmax_whds min,0,3 #@cli min_whds #@cli : Return the minimal wxhxdxs size of selected images. min_whds : - v - _min_whds 4 v + + _minmax_whds min,0,4 -_min_whds : - w={w} h={h} d={d} s={s} - repeat $! - w={min($w,w)} - h={min($h,h)} - d={min($d,d)} - s={min($s,s)} - mv. 0 done - if {$1>=4} u $w,$h,$d,$s - elif {$1==3} u $w,$h,$d - elif {$1==2} u $w,$h - else u $w - fi +_minmax_whds : + u {" + mw = w; mh = h; md = d; ms = s; + for (k = 0, k=65&&i<=90,i+32,if(i==32,95,i))' u {t} rm. v + + ('"$1"') f. 'if(i>=65&&i<=90,i+32,if(i==32,95,i))' u {t} rm. #@cli oct : octal_int1,... #@cli : Print specified octal integers into their binary, decimal, hexadecimal and string representations. oct : - v - dec=${oct2dec\ ${^0}} v + + dec=${oct2dec\ ${^0}} e[^-1] "Convert octal integer"${arg\ 1+($#>1),"",s}" '${^0}' to binary '"${dec2bin\ $dec}"', decimal '"$dec"', hexadecimal '"${dec2hex\ $dec}"' and string '"${dec2str\ $dec}"'." #@cli oct2dec : octal_int1,... #@cli : Convert specified octal integers into their decimal representations. oct2dec : - v - res=${_$0\ $1} repeat {$#-1} res=$res,${_$0\ ${arg\ $>+2,${^0}}} done u $res v + + $=arg res,sep= repeat $# res=$res$sep${_$0\ ${arg{$>+1}}} sep=, done u $res _oct2dec : - ({'${strlowercase\ $1}'}) - is_negative=0 - if {i[0]==45} z. 1,100% is_negative=1 fi - f. "if(i>=48 && i<=55,(i-48)*8^(w-1-x),nan)" - u {if($is_negative,-1,1)*{is}} - rm. + u {"str = vtos(abs($1)); + for (k = val = 0, str[k], ++k, + c = str[k]; + (val<<=3)+=(c>=_'0' && c<=_'7'?c - _'0':nan); + isnan(val)?break() + ); sign($1)*val"} #@cli padint : number,_size>0 #@cli : Return a integer with 'size' digits (eventually left-padded with '0'). padint : check "isint($1)" skip ${2=4} - v - u "" repeat $2 u ${}{int($1/10^$<)%10} done v + + u "" repeat $2 u ${}{int($1/10^$<)%10} done + +#@cli path_cache +#@cli : Return a path to store G'MIC data files for one user (whose value is OS-dependent). +path_cache : + if !narg({'$_path_cache'}) + _path_cache=$_path_rc + if ['$GMIC_CACHE_PATH']!=0 _patch_cache=$GMIC_CACHE_PATH + elif !${-is_windows} + if isdir(['{/$HOME/.cache}']) _path_cache=$HOME/.cache/gmic/ + elif ['$XDG_CACHE_HOME']!=0 _path_cache=$XDG_CACHE_HOME/gmic/ + fi + if !isdir('{/$_path_cache}') x "mkdir -p "$_path_cache fi + fi + fi + u $_path_cache #@cli path_gimp #@cli : Return a path to store GIMP configuration files for one user (whose value is OS-dependent). path_gimp : - v - - if {!narg({'$_path_gimp'})} - if {narg({'${GIMP2_DIRECTORY}'})} _path_gimp=${GIMP2_DIRECTORY} - elif {narg({'${USERPROFILE}'})} _path_gimp=${USERPROFILE} - elif {narg({'${HOME}'})} _path_gimp=${HOME} + if !narg({'$_path_gimp'}) + if narg({'${GIMP2_DIRECTORY}'}) _path_gimp=${GIMP2_DIRECTORY} + elif narg({'${USERPROFILE}'}) _path_gimp=${USERPROFILE} + elif narg({'${HOME}'}) _path_gimp=${HOME} fi - if ${-is_windows} sep=\\ else sep=/ fi - if $_path_gimp${sep}AppData${sep}Roaming${sep}GIMP${sep}2.10${sep}pluginrc + if ${-is_windows} sep={`92`} else sep=/ fi + if isdir(['{/$_path_gimp${sep}AppData${sep}Roaming${sep}GIMP${sep}2.10}']) _path_gimp=$_path_gimp${sep}AppData${sep}Roaming${sep}GIMP${sep}2.10${sep} - elif $_path_gimp${sep}.gimp-2.8${sep}pluginrc + elif isdir(['{/$_path_gimp${sep}AppData${sep}Roaming${sep}GIMP${sep}2.8}']) + _path_gimp=$_path_gimp${sep}AppData${sep}Roaming${sep}GIMP${sep}2.8${sep} + elif isdir(['{/$_path_gimp${sep}.config${sep}GIMP${sep}2.10}']) + _path_gimp=$_path_gimp${sep}.config${sep}GIMP${sep}2.10${sep} + elif isdir(['{/$_path_gimp${sep}.gimp-2.8}']) _path_gimp=$_path_gimp${sep}.gimp-2.8${sep} - elif $_path_gimp${sep}.gimp-2.6${sep}pluginrc + elif isdir(['{/$_path_gimp${sep}.gimp-2.6}']) _path_gimp=$_path_gimp${sep}.gimp-2.6${sep} else _path_gimp=${-path_tmp} fi fi u $_path_gimp - v + #@cli path_tmp #@cli : Return a path to store temporary files (whose value is OS-dependent). path_tmp : - v - - if {!narg({'$_path_tmp'})} - if {narg({'${TMP}'})} _path_tmp=${TMP} - elif {narg({'${TEMP}'})} _path_tmp=${TEMP} - elif {narg({'${TMPDIR}'})} _path_tmp=${TMPDIR} - elif {narg({'${HOME}'})} _path_tmp="/tmp" + if !narg({'$_path_tmp'}) + if narg({'${TMP}'}) _path_tmp=${TMP} + elif narg({'${TEMP}'}) _path_tmp=${TEMP} + elif narg({'${TMPDIR}'}) _path_tmp=${TMPDIR} + elif narg({'${HOME}'}) _path_tmp="/tmp" fi if ${-is_windows} _path_tmp=$_path_tmp{`92`} else _path_tmp=$_path_tmp/ fi fi u $_path_tmp - v + + +#@cli remove_copymark : "image_name" +#@cli : Remove copy mark from names of selected images. +remove_copymark : + u {`"name = ['$1']; + i = find(name,'_c'); + i>=0 && i=_'1' && c<=_'9'?( + ext = ['"{$>,x}"']; + size(ext)?copy(name[i],[_'.',ext,0]):(name[i]=0); + ); name"`} + +# render_donations: Parse the PayPal .CSV file and generate 'latest-months' donation gfx. +# $1 = filename.csv +# $2 = number of latest months. +render_donations : skip "${1="$HOME"/work/src/gmic_donations/donations.csv}",${2=5} + l[] + it[] "$1" s -,{'\n'} rm[0] + + # Parse CSV data. + eur2usd=1.12 # Change rate from EUR to USD + nb_entries=$! + repeat $!,e l[0] + repeat 10 l$>= done + f ">begin(iss=0);i==_'\"'?(iss=!iss;i):i==_',' && !iss?-1:i" s -,-1 autocrop {'\"'} + if $!>3 f[3] "lowercase(i)" fi # currency + if $!>4 replace[4-{min($!,6)}] {','},{'.'} fi # amounts + repeat $! l$>={$>,t} done rm + + # Available values. + date_$e=$l0 + name_$e=$l1 + type_$e=$l2 + currency_$e=$l3 + donation_$e=$l4 + charge_paypal_$e=$l5 + donation_charged_$e=$l6 + mail_$e=$l7 + message_$e=$l8 + + # Deduced values. + l[] + ('${date_$e}') s -,{'/'} day_$e,month_$e,year_$e={0,t},{1,t},{2,t} rm + edate_$e={${day_$e}+100*(${month_$e}+100*${year_$e})} + endl + donation_charged_$e={${donation_$e}+${charge_paypal}-${donation_$e}*8%} # Subtract all charges (Paypal + 8% LILA). + + if '${currency_$e}'=='eur' + donation_eur_$e=${donation_$e} + donation_charged_eur_$e=${donation_charged_$e} + else + donation_eur_$e={${donation_$e}/$eur2usd} + donation_charged_eur_$e={${donation_charged_$e}/$eur2usd} + fi + + # Print infos. + e[] "- [#"$e" - "${date_$e}"] "{_${donation_$e}}" "${currency_$e}" ("{_${donation_charged_eur_$e}}" eur), from "\ + ${name_$e}" ("${mail_$e}") : '"${message_$e}"'" + + endl done + + # Compute image for donations of the last months. + all_amounts,all_sep= + + repeat $2 + edate={y=date(0);m=date(1)-1-$>;m<=0?(--y;m+=12);100*y+m} + s_month=${"arg "$edate%100",January,February,March,April,May,June,July,August,\ + September,October,November,December"} + s_year={int($edate/100)} + + month_amounts= + sep= + + repeat $nb_entries,e if $edate==int(${edate_$e}/100) + val=${donation_eur_$e} + charged_val=${donation_charged_eur_$e} + month_amounts.=$sep$val + all_amounts.=$all_sep$val + all_charged_amounts.=$all_sep$charged_val + all_sep=, sep=, + fi done + + month_sum={sum(0$month_amounts)} + N={narg($month_amounts)} + + 600,30,1,3,'x<$month_sum?[139,181,173]+(y>h/2?0:40):[220,230,240]' r. 500,30,1,3 c. 0,255 + shape_circle 24 s. x,2 s[-2,-1] y,2 + r[-4] [-5],0,1,0,0 r[-3] [-5],0,1,0,1 r[-2] [-5],0,1,1,0 r[-1] [-5],0,1,1,1 min[-4--1] + channels. 0 *.. . *. 255 a[-2,-1] c + r. {[w,h]+4},1,100%,0,0,0.5,0.5 + sh. 100% dilate_circ. 3 b. 1 rm. + + t. $s_month" "$s_year,0.02~,0.5~,24,0.5,0,0,0,255 + t. {_round($month_sum)}" \37 = "{_round($month_sum*$eur2usd)}" $",0.5~,0.5~,24,1,0,0,0,255 + t. $N" sponsor"${"if "$N"!=1 u s else u \"\" fi"},0.97~,0.5~,24,0.5,0,0,0,255 + done + rv + + all_max={max(0$all_amounts)} + all_min={min(0$all_amounts)} + all_sum={sum(0$all_amounts)} + all_avg={avg(0$all_amounts)} + + 0 t. "Avg: "{_round(${all_avg},0.1)}"\37 / "\ + "Med: "{_round(med($all_amounts))}"\37 / "\ + "Min: "{_round($all_min,0.1)}"\37 / "\ + "Max: "{_round($all_max,0.1)}"\37",0,0,24,1,1 + *. 200 i[-2] 100%,100%,1,3 a[-2,-1] c + + rows -5,100% a y,0.5 r2dx 480 + if $2==5 o $HOME/work/src/gmic/html/img/donations_latest_months.png fi + endl + + all_charged_sum={sum(0$all_charged_amounts)} + e[] "\nTOTAL : "{_round($all_sum)}" eur (charged : "{_round($all_charged_sum)}" eur)." + + # Generate report for twitter/framasphere. + sp gmicky,{h} + l[-2,-1] + rgb={I(w-1)} to_rgba rv + frame 10,10,0,0,0,0 + drgba $rgb a x + shape_heart 82 +r. 100%,100%,1,3 hsv2rgb. rv[-2,-1] *. 255 a[-2,-1] c + r. ..,..,1,100%,0,0,0.23,0.15 drop_shadow. 3,3,2,0,0 + blend alpha,0.7 r2dx 500 + o $HOME/Desktop/donations_latest_months.jpg,85 + endl + + # Generate coin graphics. + l[] + $HOME/work/src/gmic/html/img/icon_coin.png + N=0 + text$N,r$N,g$N,b$N,file$N="2 \37",32,48,32,"don_2eur.png" N+=1 + text$N,r$N,g$N,b$N,file$N="5 \37",200,200,200,"don_5eur.png" N+=1 + text$N,r$N,g$N,b$N,file$N="10 \37",190,100,100,"don_10eur.png" N+=1 + text$N,r$N,g$N,b$N,file$N="+ \37",255,128,0,"don_moreeur.png" N+=1 + text$N,r$N,g$N,b$N,file$N="2 $",32,48,32,"don_2usd.png" N+=1 + text$N,r$N,g$N,b$N,file$N="5 $",200,200,200,"don_5usd.png" N+=1 + text$N,r$N,g$N,b$N,file$N="10 $",190,100,100,"don_10usd.png" N+=1 + text$N,r$N,g$N,b$N,file$N="+ $",255,128,0,"don_moreusd.png" N+=1 + repeat $N +l[0] + frame. 10,10,0,0,0,0 + sh. 0,2 + (${r$>}^${g$>}^${b$>}) rgb2hsl[-2,-1] H,S={[R,G]} rm. + l. s c -[0] {ia#0-$H} %[0] 360 -[1] {ia#1-$S} +[2] 0.1 /[1] 2 c[1,2] 0,1 a c endl + hsl2rgb. rm. + sh. 100% dilate_circ. 10 rm. + + 100%,100% t. ${text$>},0.5~,0.5~,45%,1,255 dilate_circ. 10 +dilate_circ. 15 to_rgb.. a[-2,-1] c + blend[-2,-1] alpha drop_shadow. 1,1 r2dx. 48 frame 10,5,0,0,0,0 + o. $HOME/work/src/gmic/html/img/${file$>} + endl done + rm[0] + endl #@cli reset #@cli : Reset global parameters of the interpreter environment. reset : e[^-1] "Reset global parameters of the interpreter environment." - v -1 db3d m3d md3d f3d l3d sl3d ss3d v + + db3d m3d md3d f3d l3d sl3d ss3d #@cli RGB #@cli : Return a random int-valued RGB color. RGB : - v - u {round(u(255))},{round(u(255))},{round(u(255))} v + + u {round(u(255))},{round(u(255))},{round(u(255))} #@cli RGBA #@cli : Return a random int-valued RGBA color. RGBA : - v - u {round(u(255))},{round(u(255))},{round(u(255))},{round(u(255))} v + + u {round(u(255))},{round(u(255))},{round(u(255))},{round(u(255))} #@cli std_noise #@cli : Return the estimated noise standard deviation of the last selected image. std_noise : - v - if $! +laplacian. -. {ic} abs. u {1.4826*ic/sqrt(d==1?20:42)} rm. else u 0 fi v + + if $! +laplacian. -. {ic} abs. u {1.4826*ic/sqrt(d==1?20:42)} rm. else u 0 fi #@cli str : string #@cli : Print specified string into its binary, octal, decimal and hexadecimal representations. str : skip $1 - v - dec={'$*'} v + + dec={'$*'} e[^-1] "Convert string '$*' to binary '"${dec2bin\ $dec}"', octal '"${dec2oct\ $dec}"', decimal '"$dec"' and hexadecimal '"${dec2hex\ $dec}"'." #@cli str2hex : string #@cli : Convert specified string into a sequence of hexadecimal values. str2hex : - v - ({'"$*"'}) y. r. 2,100% f. 'v=if(x,i%16,int(i/16));if(v<=9,48+v,87+v)' u {t} rm. v + + ('"$*"') y. r. 2,100% f. 'v=if(x,i%16,int(i/16));if(v<=9,48+v,87+v)' u {t} rm. + +#@cli strcapitalize : string +#@cli : Capitalize specified string. +strcapitalize : + l[] ('{/"$1"}') + f "(i<=_' ' || i==_'_') && i!=_'\n'?_' ':i" # Replace blank characters and underscores + f "> + t(s) = ( unref(ss); const ss = size(s); lowercase(crop(x,ss))!=s || j[ss]!=_' '); + !x || (p=j[-1])==_'.' || p==_':' || p==_';' || p==_'\"' || (find(#0,_' ',x)<0 && p==_' ') || + (p==_' ' || p==_'-') && + t('a') && t('an') && t('and') && t('as') && t('at') && t('but') && t('by') && t('for') && t('from') && + t('in') && t('into') && t('like') && t('near') && t('nor') && t('of') && t('off') && t('on') && + t('onto') && t('or') && t('over') && t('past') && t('per') && t('than') && t('the') && t('to') && + t('up') && t('upon') && t('via') && t('with')?uppercase(i):i" + u {t} rm endl #@cli strcontains : string1,string2 #@cli : Return 1 if the first string contains the second one. strcontains : - v - l[] ({'"$1"'}) s +,{'"$2"'} u {$!>1} rm endl v + + l[] ('"$1"') s +,{'"$2"'} u {$!>1} rm endl #@cli strlen : string1 #@cli : Return the length of specified string argument. strlen : skip "${1=}" - v - u {narg({'"$1"'})} v + + u {narg({'"$1"'})} #@cli strreplace : string,search,replace #@cli : Search and replace substrings in an input string. strreplace : skip "${3=}" - v - - if {narg("$3")} + if narg("$3") ls=${strlen\ "$2"} lr={${strlen\ "$3"}-1} - l[] ({'"$1"'}) s +,{'"$2"'} s y,-$ls - repeat $! if {[{$>,^}]==['"$2"']} rows[$>] 0,$lr f[$>] {'"$3"'} fi done + l[] ('"$1"':y) s +,{'"$2"'} s y,-$ls + repeat $! if [{$>,^}]==['"$2"'] rows[$>] 0,$lr f[$>] {'"$3"'} fi done a y u {t} rm endl else - l[] ({'"$1"'}) s -,{'"$2"'} a y u {t} rm endl + l[] ('"$1"') s -,{'"$2"'} a y u {t} rm endl fi - v + #@cli strlowercase : string #@cli : Return a lower-case version of the specified string. strlowercase : - v - ({'"$*"'}) +. 'if(i>=65&&i<=90,32,0)' u {t} rm. v + + ('"$*"') u {`lowercase([{^}])`} rm. + +#@cli struppercase : string +#@cli : Return an upper-case version of the specified string. +struppercase : + ('"$*"') u {`uppercase([{^}])`} rm. #@cli strvar : string #@cli : Return a simplified version of the specified string, that can be used as a variable name. strvar : - v - ({'"$*"'}) f. " + ('"$*"') f. " (i>=_'0' && i<=_'9') || (i>=_'a' && i<=_'z') || i==_'_'?i: (i>=_'A' && i<=_'Z')?i - _'A' + _'a': _'_'" - if {"i>=_'0' && i<=_'9'"} r. {w+1},1,1,1,0,0,1 =. {_'_'} fi - y. do h={h} replace_str. "__","_" while {h!=$h} - u {t} rm. v + + if "i>=_'0' && i<=_'9'" r. {w+1},1,1,1,0,0,1 =. {_'_'} fi + y. do h={h} replace_str. "__","_" while h!=$h + u {t} rm. #@cli strver : _version #@cli : Return the specified version number of the G'MIC interpreter, as a string. #@cli : Default value: 'version=$_version'. strver : check ${1=$_version}>0 - v - ({'$1'}) r. {2*w-1} f. 'if(x%2,_'.',i)' u {t} rm. v + + ('$1') r. {2*w-1} f. 'if(x%2,_'.',i)' u {t} rm. #@cli tic #@cli : Initialize tic-toc timer. #@cli : Use it in conjunction with 'toc'. tic : e[^-1] "Initialize timer." - v - if {!narg($_ticpos)} _ticpos=0 fi _tic$_ticpos=$| _ticpos={$_ticpos+1} v + + if !narg($_ticpos) _ticpos=0 fi _tic$_ticpos=$| _ticpos+=1 #@cli toc #@cli : Display elapsed time of the tic-toc timer since the last call to 'tic'. #@cli : This command returns the elapsed time in the status value. #@cli : Use it in conjunction with 'tic'. toc : - v - _ticpos={$_ticpos-1} u {_$|-${_tic$_ticpos}} v + - e[^-1] "Elapsed time: "${}" s". + v=$^ _ticpos-=1 u {_$|-${_tic$_ticpos}} + v 0 e[^-1] "Elapsed time: "${}" s". v $v + +#@cli to_clutname : "string" +#@cli : Return simplified name that can be used as a CLUT name, from specified input string. +to_clutname : + 0 nm. "$1" nm={b} rm. + u {`"ss = lowercase([['"{/$nm}"'],0]); + const N = 2*size(ss); + sd = vectorN(); + for (ps = pd = 0, ss[ps], ++ps, + ss[ps]<=_' '?(sd[pd++] = _'_'): + (ss[ps]==_'(' || ss[ps]==_')' || + ss[ps]==_'{' || ss[ps]==_'}' || + ss[ps]==_'[' || ss[ps]==_']' || + ss[ps]==_'\'' || ss[ps]==_'\"')?0: + (ps && ss[ps]>=_'0' && ss[ps]<=_'9' && ss[ps-1]>=_'a' && ss[ps-1]<=_'z')?(sd[pd++] = _'_'; sd[pd++] = ss[ps]): + (sd[pd++] = ss[ps]); + ); sd[pd] = 0; sd"`} #@cli uchar2base64 : _encoding={ 0=base64 | 1=base64url } #@cli : Encode the values of the latest of the selected images as a base64-encoded string. @@ -19960,8 +24832,7 @@ #@cli : Selected images must have values that are integers in [0,255]. #@cli : Default values: 'encoding=0'. uchar2base64 : skip "${1=0}" - v - - if {isval("$1")} encoding=$1 else encoding=0 noarg fi + if isnum("$1") encoding=$1 else encoding=0 noarg fi {ceil(whds*4/3)+([0,2,1])[whds%3]} eval " hash = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; @@ -19976,35 +24847,7 @@ n==1?(i[#-1,od++] = hash[((ov&3)<<4)]; copy(i[#-1,od],_'=',2,1,0); od+=2): n==2?(i[#-1,od++] = hash[((ov&15)<<2)]; i[#-1,od++] = _'='); " - u {t} rm. v + - -#@cli img2base64 : _encoding={ 0=base64 | 1=base64url } -#@cli : Encode selected images as a base64-encoded string. -#@cli : The images can be then decoded using command 'base642img'. -#@cli : Default values: 'encoding=0'. -img2base64 : skip "${1=0}" - v - - if {isval("$1")} encoding=$1 else encoding=0 noarg fi - +serialize u ${uchar2base64\ $encoding} rm. - v + - -#@cli average_colors -#@cli : Return the average vector-value of the latest of the selected images. -average_colors : - v - - res="" - repeat {s-1} sh. {1+$>} res=$res,{ia} rm. done - sh. 0 u {ia}$res rm. - v + - -#@cli covariance_colors : _avg_outvarname -#@cli : Return the covariance matrix of the vector-valued colors in the latest of the selected images (for arbitrary number of channels). -#@cli : Parameter 'avg_outvarname' is used as a variable name that takes the value of the average vector-value. -covariance_colors : skip "${1=avg}" - v - - $1=${-average_colors} - f ">begin(avg = [ "$""$1" ]; const S2 = s^2; C = vectorS2(0); ); mI = I - avg; C+=mul(mI,mI,s); end(C/=whd - 1; ext('u ',vtos(C))); I" - v + + u {t} rm. #------------------------------------- # @@ -20012,15 +24855,12 @@ # #------------------------------------- -#@cli demo : _run_in_parallel={ 0=no | 1=yes | 2=auto } +#@cli demos : _run_in_parallel={ 0=no | 1=yes | 2=auto } #@cli : Show a menu to select and view all G'MIC interactive demos. -demo : check "isint(${1=2}) && $1>=0 && $1<=2" - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - +demos : check "isint(${1=2}) && $1>=0 && $1<=2" check_display use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r strver=${-strver} - if {narg($_prerelease)} strver=${strver}_pre#$_prerelease fi - v + + if $_prerelease strver=${strver}_pre#$_prerelease fi e[] "\n ------ "${g}"G\47MIC demos"$n" ------------------\n ----\n @@ -20030,12 +24870,12 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n -------------------------------------" - v - l[] + l[] entries="2048 game","Blobs Editor","Bouncing Balls","Connect Four","Fire Effect","Fireworks","Fish-Eye Effect",\ - "Fourier Filtering","Tower of Hano\357","Histogram Demo","Hough Transform","Jawbreaker","Virtual Landscape","The Game of Life",\ - "Light Effect","Mandelbrot Explorer","3D Metaballs","Minesweeper","Minimal Path","Pacman","Paint",\ - "Plasma Effect","RGB Quantization","3D Reflection","3D Rubber Object","Shade Bobs","Spline Editor","3D Starfield",\ - "Tetris","Tic-Tac-Toe","Image Waves","Fractal Whirls","Color Curves" + "Fourier Filtering","Tower of Hano\357","Histogram Demo","Hough Transform","Jawbreaker","Virtual Landscape",\ + "The Game of Life","Light Effect","Mandelbrot Explorer","3D Metaballs","Minesweeper","Minimal Path",\ + "Pacman","Paint","Plasma Effect","RGB Quantization","3D Reflection","3D Rubber Object","Shade Bobs",\ + "Spline Editor","3D Starfield","Tetris","Tic-Tac-Toe","Image Waves","Fractal Whirls","Color Curves" commands=x_2048,x_blobs,x_bouncing,x_connect4,x_fire,x_fireworks,x_fisheye,\ x_fourier,x_hanoi,x_histogram,x_hough,x_jawbreaker,x_landscape,x_life,\ x_light,x_mandelbrot,x_metaballs3d,x_minesweeper,x_minimal_path,x_pacman,x_paint,\ @@ -20044,7 +24884,7 @@ nb_entries={narg($entries)} parallel_mode={1-if($1!=2,$1,$_cpus>=2)} strver=${-strver} - if {narg($_prerelease)} strver.=_pre#$_prerelease fi + if $_prerelease strver.=_pre#$_prerelease fi # Generate menu graphics. l[] @@ -20097,7 +24937,7 @@ chromeball64x64[] 200,100,64 n. 0,230 s. c,-3 rgb2hsv.. r.. 100%,100%,$n,3 f.. "[z*360/d,G,B]" hsv2rgb.. N={6*$n} P={2*$N-1} - i[0] ({'CImg3d'}) i[1] ($N,$P) i[2] 3,$N # Header, points + i[0] ('CImg3d') i[1] ($N,$P) i[2] 3,$N # Header, points i[3] 2,$N,1,1,"x?y:1" i[4] 3,{$N-1},1,1,"x==0?2:x==1?y:y+1" y[3,4] a[3,4] y # Primitives l[4] # Colors s z i[0--2] (-128,{w},{h},3) 4,{$N-$n},1,1,'x==0?-128:x==1?y%$n:0' # Colors @@ -20116,7 +24956,7 @@ (0.1;0.03^0;0.1^0.2;0.1) r. ..,3 *[-2,-1] (0;1) r. ..,..,1,1,3 pow. 1.5 n. 0.2,1.15 *[-2,-1] n. 0,128 nm. background - w. -1,-1,0,"[G'MIC - "$strver"]" cursor 0 + w. -1,-1,0,"[G'MIC - "$strver"]" cursor 0 w[] -1,-1,0,0,{([{*,u,v}]-[{*,w,h}])/2} # Enter event loop. omb,ind_clicked,cfx,cfy,cfz,alpha=0 @@ -20124,7 +24964,7 @@ do mx,my,mb={menu_fgcol,x={*,x};y={*,y};[x<0?-1:x*(w-1)/({*,w}-1),y<0?-1:y*(h-1)/({*,h}-1),{*,b}]} ind={menu_ind,i($mx,$my)} - if {$mb" && "!$ind_clicked} ind_clicked=$ind fi + if $mb" && "!$ind_clicked ind_clicked=$ind fi # Render current view. [background] @@ -20137,35 +24977,37 @@ j[background3d] .,0,8 rm. +r3d[background3d] 1,2,3,{20*$|} *3d. {menu_fgcol,[w,h]/2-30},300 +3d. 0,0,300 j3d.. .,50%,50%,0,1,1,0,0,200 rm. - if {$|-$time0>5} alpha+=0.02 fi - if {$alpha>1} alpha-=1 cfx,cfy,cfz=$nfx,$nfy,$nfz nfx,nfy,nfz={[g,g,g]} time0={$|-u*3} fi + if $|-$time0>5 alpha+=0.02 fi + if $alpha>1 alpha-=1 cfx,cfy,cfz=$nfx,$nfy,$nfz nfx,nfy,nfz={[g,g,g]} time0={$|-u*3} fi - if {$ind>0} +==[menu_ind] $ind j.. [menu_bgcol],0,0,0,0,{$mb" && "$ind_clicked==$ind?0.6:1},. rm. fi # Draw selection background + if $ind>0 +==[menu_ind] # Draw selection background + $ind j.. [menu_bgcol],0,0,0,0,{$mb" && "$ind_clicked==$ind?0.6:1},. rm. + fi j. [menu_fgcol],0,0,0,0,1,[menu_opac] - if {$mx>0} + if $mx>0 +r3d[cursor3d] 1,1.3,0.6,{50*cos($|)} j3d.. .,$mx,$my,0,1,4,0,0,800,{-2,[w,h]/2},-1000,0.7 rm. fi w. -1,-1,0 - if {{*,CTRLLEFT}&&{*,D}} w. 150%,150% elif {{*,CTRLLEFT}&&{*,C}} w. 100%,100% fi + if {*,CTRLLEFT}" && "{*,D} w. 150%,150% elif {*,CTRLLEFT}" && "{*,C} w. 100%,100% fi rm. # Manage user selection. - if {!$mb" && "$omb" && "$ind_clicked" && "$ind_clicked==$ind} - m "com : v 0 "${arg\ $ind,$commands} parallel $parallel_mode,"l[] com v -1 rm endl" uncommand com - elif {!$mb} ind_clicked=0 + if !$mb" && "$omb" && "$ind_clicked" && "$ind_clicked==$ind + m "com : v 1 "${arg\ $ind,$commands} parallel $parallel_mode,"l[] com rm endl" um com + elif !$mb ind_clicked=0 fi omb=$mb wait 20 - while {{*}" && "!{*,ESC}" && "!{*,Q}} + while {*}" && "!{*,ESC}" && "!{*,Q} rm w 0 endl v 0 e[] "" _demo_color_curves : - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + - if {!narg($__demo_color_curve)} + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r + if !narg($__demo_color_curve) e[] "\n ------ "${g}"Color curves"$n" ----------------------------------------------------------------------------\n ----\n @@ -20180,7 +25022,7 @@ ---- Keys '"${c}"ESC"$n"', '"${c}"Q"$n"' or '"${c}"ENTER"$n"' close the current window.\n ----\n ------------------------------------------------------------------------------------------------" - v - __demo_color_curve=1 l[] do rm sp ? while {s!=3} endl x_color_curves rgb __demo_color_curve= v + + __demo_color_curve=1 l[] do rm sp ? while s!=3 endl x_color_curves rgb __demo_color_curve= else e[] "\n ------ "${g}"Color curves"$n" ----------------------------------------------------------------------------\n @@ -20192,9 +25034,8 @@ #@cli x_2048 #@cli : Launch the 2048 game. -x_2048 : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_2048 : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"2048"$n" -----------------------------------------------\n ----\n @@ -20209,7 +25050,7 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n --------------------------------------------------------------" - v - l[] + l[] score=0 f3d 50 m3d 0 m "_x_2048_setrandom : +==[0] 0 f. 'if(i,4*y+x,-1)' discard. -1 off={i[round(u(h-1))]} rm. x={$off&3} y={$off>>2} n={if(u<0.75,1,2)} @@ -20217,7 +25058,7 @@ repeat 6 j3d[1] .,{78+$x*121},{190+$y*121},{10*$<},{(1+$>)/6} w[1] wait 20 done rm." m "_x_2048_object3d : +f[0] 'if(i,i*16+4*y+x,-1)' discard. -1 - N={h} repeat {h} v={-{1+$>},@$>} ++3d[{2+($v>>4)}] {$v&3},{($v>>2)&3} done + N={h} repeat h v={-{1+$>},@$>} ++3d[{2+($v>>4)}] {$v&3},{($v>>2)&3} done +3d[-$N--1] rm.." i[0] 4,4 @@ -20257,7 +25098,7 @@ if {0,iM==11} # Game won. alert "Game Over","\nCongratulations! You got the 2048 title!\n\n Your score: "$score,"OK" break - elif {!iM} # Game lost. + elif !iM # Game lost. alert "Game Over","\nBad luck! You lost the game!\n\n Your score: "$score,"OK" break fi @@ -20265,7 +25106,7 @@ # Manage user events. wait - is_shift=0 uncommand shift2048,ishift2048,vshift2048 + is_shift=0 um shift2048,ishift2048,vshift2048 if {*,ARROWLEFT} m "shift2048:" m "ishift2048:" m "vshift2048:" is_shift=1 @@ -20296,7 +25137,7 @@ +==[0,-1] insert_new={$insert_new||!im} rm. +f[0,-1] 'if(i,x,-1)' discard[-2,-1] -1 rv[-2,-1] -[-2,-1] rv[0,-2] rm.. - if {(im||iM)&&!{*,k}} # Render animation for shift. + if (im||iM)&&!{*,k} # Render animation for shift. /. 5 z. 0,2 y. repeat 5 j.. .,0,8,0,0,-1 @@ -20307,23 +25148,23 @@ rm[-2,-1] # Tile fusions. - if {!$>} dscore=0 + if !$> dscore=0 [0] +f[0] 'if(i,i*16+4*y+x,-1)' discard. -1 - repeat {h} + repeat h x={i[$>]&3} y={(i[$>]>>2)&3} n={i[$>]>>4} - if {$x>0" && "{0,i($x-1,$y)}==$n} + if $x>0" && "{0,i($x-1,$y)}==$n =[0] 0,$x,$y =[0] {$n+1},{$x-1},$y =.. 0,$x,$y insert_new=1 dscore+={2^($n+1)} else =. -1,0,$> fi done score+=$dscore - if {iM<0} rm[-2,-1] + if iM<0 rm[-2,-1] else # At least one tile fusions. discard. -1 rv[0,-2] _x_2048_object3d rv[0,-3] vshift2048. *3d. 121 # Only tiles that do not move in this step. j[1] [2],18,130 j3d[1] .,78,190 rm[-3,-1] - N={h} repeat {h} v={-{1+$>},@$>} ++3d[{2+($v>>4)}] {$v&3},{($v>>2)&3} done # Only tiles that move. + N={h} repeat h v={-{1+$>},@$>} ++3d[{2+($v>>4)}] {$v&3},{($v>>2)&3} done # Only tiles that move. +3d[-$N--1] rm.. 0 t. +$dscore,0,0,33,1,1 100%,100%,1,3 fc. $c0 repeat 6 # Render animation for fusion. @@ -20342,14 +25183,13 @@ if $insert_new _x_2048_setrandom fi fi - while {{*}" && "!{*,ESC}" && "!{*,Q}} - rm w 0 endl uncommand _x_2048_setrandom,_x_2048_object3d v + + while {*}" && "!{*,ESC}" && "!{*,Q} + rm w 0 endl um _x_2048_setrandom,_x_2048_object3d #@cli x_blobs #@cli : Launch the blobs editor. -x_blobs : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_blobs : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Blobs editor"$n" --------------------------\n ----\n @@ -20359,7 +25199,6 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n -----------------------------------------------------" - v - # Create background image [0]. l[] (0;0^0;128^0;255) r. 450,450,1,3,3 flower. 30,8,0,0,50%,50%,1 water. 20 @@ -20374,20 +25213,20 @@ fps=${-fps} # Render image of blobs and find nearest blob to mouse pointer. - if {$!>1} + if $!>1 {0,[w,h]},1,2 - repeat {1,h} + repeat h#1 r={1,i[2]*(1+i[3]*cos(i[4]+i[5]*$|*1000))} ellipse. {1,@0,1},$r,$r,0,1,{1,@6-7} d={sqrt(($x-{1,@0})^2+($y-{1,@1})^2)} - if {$d<$r} nearest=$> fi + if $d<$r nearest=$> fi shift[1] 0,-1,0,0,2 done b. 15 +norm. +>=. 50 <=.. 40 *[-3,-1] +*[0,-1] rm.. rv[-2,-1] *. 1.6 c. 0,255 +[-2,-1] - if {$fps>0} to. $fps" fps",5,{h-29},24,2,0.2 fi + if $fps>0 to. $fps" fps",5,{h-29},24,2,0.2 fi w. - if {{*,CTRLLEFT}&&{*,D}} w[] {2*[w,h]} elif {{*,CTRLLEFT}&&{*,C}} w[] {[w,h]} fi + if {*,CTRLLEFT}" && "{*,D} w[] {2*[w,h]} elif {*,CTRLLEFT}" && "{*,C} w[] {[w,h]} fi rm. else +to[0] "G\47MIC Blobs Editor",75,100,35,3,1,200,128,255 @@ -20398,37 +25237,36 @@ * Colors and sizes of appearing blobs are\n chosen randomly",\ 50,180,18,1,1,255 w. - if {{*,CTRLLEFT}&&{*,D}} w[] {1.5*[w,h]} elif {{*,CTRLLEFT}&&{*,C}} w[] {[w,h]} fi + if {*,CTRLLEFT}" && "{*,D} w[] {1.5*[w,h]} elif {*,CTRLLEFT}" && "{*,C} w[] {[w,h]} fi rm. fi wait 20 # Manage blob insertion, removal or move. - if {$x<0||$y<0} continue fi - if {$b&1} - if {$nearest>=0" || "$moving>=0} # Move existing blob. - if {$moving<0} moving=$nearest fi + if $x<0||$y<0 continue fi + if $b&1 + if $nearest>=0" || "$moving>=0 # Move existing blob. + if $moving<0 moving=$nearest fi =[1] $x,0,$moving =[1] $y,1,$moving else # Insert new blob. ($x,$y,{u(20,50)},{u(-0.3,0.3)},{u(0,pi/2)},{u(0,0.009)},{u(64,255)},{u(64,255)}) a[^0] y moving={h-1} fi - elif {$b&2} # Remove existing blob. - if {$nearest>=0} l[1] s y rm[$nearest] a y endl nearest=-1 fi - elif {$b&4} # Remove all blobs. + elif $b&2 # Remove existing blob. + if $nearest>=0 l[1] s y rm[$nearest] a y endl nearest=-1 fi + elif $b&4 # Remove all blobs. k[0] else moving=-1 fi - while {{*}" && "!{*,ESC}" && "!{*,Q}} - rm w 0 endl v + + while {*}" && "!{*,ESC}" && "!{*,Q} + rm w 0 endl #@cli x_bouncing #@cli : Launch the bouncing balls demo. -x_bouncing : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_bouncing : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Bouncing balls"$n" ------------------------------\n ----\n @@ -20437,7 +25275,7 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n -----------------------------------------------------" - v - l[] + l[] 520,320,1,3 plasma 1,1,9 n 0,220 N=12 repeat $N @@ -20454,14 +25292,14 @@ bw={$>,w} bh={$>,h} y={${h$>}*abs(cos(${t$>}*pi/60))-$bh/2} dt=1 - if {$y<0} d={-$y} y=0 bh-=$d bw+=$d dt={max(0.2,1-($d/$bh)^2)} else dt=1 fi - if {${x$>}+$bw/2>w} + if $y<0 d={-$y} y=0 bh-=$d bw+=$d dt={max(0.2,1-($d/$bh)^2)} else dt=1 fi + if ${x$>}+$bw/2>w d={${x$>}+$bw/2-w} bw-=$d bh+={0.5*$d} - if {${x$>}+$bw/4>w} vx$>={-${vx$>}} fi + if ${x$>}+$bw/4>w vx$>={-${vx$>}} fi fi - if {${x$>}-$bw/2<0} + if ${x$>}-$bw/2<0 d={$bw/2-${x$>}} bw-=$d bh+={0.5*$d} - if {${x$>}-$bw/4<0} vx$>={-${vx$>}} fi + if ${x$>}-$bw/4<0 vx$>={-${vx$>}} fi fi +r[$>] $bw,$bh,1,4,3 s. c,-3 j... ..,{max(0,min({$N,w-$bw},${x$>}-$bw/2))},{{$N,h}-{h}-$y-70},0,0,1,.,255 rm[-2,-1] @@ -20471,24 +25309,22 @@ +rows. {h-2*70},{h-1-70} mirror. y *. [{$N+1}] j.. .,0,{-2,h-71},0,0,0.5 rm. - fps=${-fps} if {$fps>0} to. $fps" fps",5,{h-29},24,2,0.2 fi - w. - - if {{*,CTRLLEFT}&&{*,D}} w[] {1.5*w},{1.5*h} elif {{*,CTRLLEFT}&&{*,C}} w[] {w},{h} fi - rm. wait 20 - while {{*}" && "!{*,ESC}" && "!{*,Q}} - w 0 rm endl v + + fps=${-fps} if $fps>0 to. $fps" fps",5,{h-29},24,2,0.2 fi + if {*,CTRLLEFT}" && "{*,D} w[] {1.5*w},{1.5*h} elif {*,CTRLLEFT}" && "{*,C} w[] {w},{h} fi + w. rm. wait 20 + while {*}" && "!{*,ESC}" && "!{*,Q} + w 0 rm endl #@cli x_color_curves : _colorspace={ rgb | cmy | cmyk | hsi | hsl | hsv | lab | lch | ycbcr | last } #@cli : Apply color curves on selected RGB[A] images, using an interactive window. #@cli : Set 'colorspace' to 'last' to apply last defined color curves without opening interactive windows. #@cli : Default value: 'colorspace=rgb'. x_color_curves : skip ${1=rgb} - if {['"$1"']!='last'&&!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + + if ['"$1"']!='last'&&!{*,u} error[0--3] "Command '$0': No display available." return fi + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[^-1] "Apply color curves of image$?, in the '$1' colorspace." - if {['"$1"']=='last'} v - - if {!narg($_xcc_colorbase)} v + return fi + if ['"$1"']=='last' + if !narg($_xcc_colorbase) return fi __x_color_curves[] $_xcc_colorbase else e[] "\n @@ -20505,35 +25341,36 @@ ---- Keys '"${c}"ESC"$n"', '"${c}"Q"$n"' or '"${c}"ENTER"$n"' close the current window.\n ----\n ------------------------------------------------------------------------------------------------" - v - __x_color_curves[] $1 _xcc_colorbase=$1 fi to_color repeat $! l[$>] - if {['"$1"']!='last'} # Open interactive windows to set color curves. - +r[0] ${fitscreen[]\ {0,w},{0,h},1,128,70%},1,100%,3 - +l. xcc_goto s c histogram 256,0,255 xcc_info endl # Compute additional info for each image channel (histogram and color axis). + if ['"$1"']!='last' # Open interactive windows to set color curves. + +r[0] ${fitscreen[]\ {0,[w,h,1]},128,70%},1,100%,3 + +l. # Compute additional info for each image channel (histogram and color axis). + xcc_goto s c histogram 256,0,255 xcc_info + endl __C0= __C1= __C2= __C3= __C4= - if {narg($__xcc_C0)} __C0=$__xcc_C0 fi - if {narg($__xcc_C1)} __C1=$__xcc_C1 fi - if {narg($__xcc_C2)} __C2=$__xcc_C2 fi - if {narg($__xcc_C3)} __C3=$__xcc_C3 fi - if {narg($__xcc_C4)} __C4=$__xcc_C4 fi + if narg($__xcc_C0) __C0=$__xcc_C0 fi + if narg($__xcc_C1) __C1=$__xcc_C1 fi + if narg($__xcc_C2) __C2=$__xcc_C2 fi + if narg($__xcc_C3) __C3=$__xcc_C3 fi + if narg($__xcc_C4) __C4=$__xcc_C4 fi x={1,({*,u}-560-w)/2} y={1,({*,v}-h)/2} - if {$!==5} # 3 channels. + if $!==5 # 3 channels. parallel "w[] 256,256,0,0,"$x","$y",\"Curve: "$_title0"\" x_select_function1d... __C0,"$_color0"",\ "w[] 256,256,0,0,"{$x+280}","$y",\"Curve: "$_title1"\" x_select_function1d.. __C1,"$_color1"",\ "w[] 256,256,0,0,"$x","{$y+300}",\"Curve: "$_title2"\" x_select_function1d. __C2,"$_color2"",\ "w. 100%,100%,0,0,"{$x+560}","$y" _x_color_curves[-4]" - elif {$!==6} # 4 channels. + elif $!==6 # 4 channels. parallel "w[] 256,256,0,0,"$x","$y",\"Curve: "$_title0"\" x_select_function1d[-4] __C0,"$_color0"",\ "w[] 256,256,0,0,"{$x+280}","$y",\"Curve: "$_title1"\" x_select_function1d... __C1,"$_color1"",\ "w[] 256,256,0,0,"$x","{$y+300}",\"Curve: "$_title2"\" x_select_function1d.. __C2,"$_color2"",\ "w[] 256,256,0,0,"{$x+280}","{$y+300}",\"Curve: "$_title3"\" x_select_function1d. __C3,"$_color3"",\ "w. 100%,100%,0,0,"{$x+560}","$y" _x_color_curves[-5]" - elif {$!==7} # 5 channels. + elif $!==7 # 5 channels. parallel "w[] 256,256,0,0,"$x","$y",\"Curve: "$_title0"\" x_select_function1d[-5] __C0,"$_color0"",\ "w[] 256,256,0,0,"{$x+280}","$y",\"Curve: "$_title1"\" x_select_function1d[-4] __C1,"$_color1"",\ "w[] 256,256,0,0,"$x","{$y+300}",\"Curve: "$_title2"\" x_select_function1d... __C2,"$_color2"",\ @@ -20546,14 +25383,14 @@ # Apply color curves on fullres image. xcc_goto - repeat {s} function1d[] 1,${__xcc_C$>} *. {255%} r. 256,1,1,1,5 c. 0,255 sh[0] $> map. .. rm[-2,-1] done + repeat s function1d[] 1,${__xcc_C$>} *. {255%} r. 256,1,1,1,5 c. 0,255 sh[0] $> map. .. rm[-2,-1] done xcc_backto endl done - uncommand xcc_goto,xcc_backto,xcc_info v + + um xcc_goto,xcc_backto,xcc_info _x_color_curves : - title={0,b} if {narg({'{0,x}'})} title=$title.{0,x} fi ({'$title'}) discard. {'~'} title={t} rm. + title={0,b} if narg({'{0,x}'}) title=$title.{0,x} fi ('$title') discard. {'~'} title={t} rm. +drgba. w. 100%,100%,0,"[G"{`39`}"MIC] Image: "$title rm. xcc_goto. . @@ -20564,20 +25401,20 @@ # Manage user events. oviewmode=$viewmode is_ctrl={{*,CTRLLEFT}" || "{*,CTRLRIGHT}} x={*,x} y={*,y} if {*,r} need_refresh=1 # Window resize. - elif {$is_ctrl" && "{*,-D}} w[] {{*,w}*125%},{{*,h}*125%} need_refresh=1 # Increase window size. - elif {$is_ctrl" && "{*,-C}} w[] {{*,w}*80%},{{*,h}*80%} need_refresh=1 # Decrease window size. - elif {$is_ctrl" && "{*,-R}} w[] {w},{h} need_refresh=1 # Reset window size. - elif {{*,b}&1} viewmode={x={*,x};if(x=0" && "$y>=0} # Add control point from picked color. + elif $is_ctrl" && "{*,-D} w[] {{*,w}*125%},{{*,h}*125%} need_refresh=1 # Increase window size. + elif $is_ctrl" && "{*,-C} w[] {{*,w}*80%},{{*,h}*80%} need_refresh=1 # Decrease window size. + elif $is_ctrl" && "{*,-R} w[] {w},{h} need_refresh=1 # Reset window size. + elif {*,b}&1 viewmode={x={*,x};if(x=0" && "$y>=0 # Add control point from picked color. xc={$x*w/{*,w}} yc={$y*h/{*,h}} +z[0] $xc,$yc,$xc,$yc - repeat {s} (${__C$>},{i[$>]/255%},{i[$>]/255%}) r. 2,{w/2},1,1,-1 sort. +,y __C$>={^} rm. done + repeat s (${__C$>},{i[$>]/255%},{i[$>]/255%}) r. 2,{w/2},1,1,-1 sort. +,y __C$>={^} rm. done rm. wait -1 else viewmode=0 fi need_refresh={$need_refresh||$oviewmode!=$viewmode} # Update result. - repeat {s} if {['_${oC$>}']!=['_${__C$>}']} # Channel must be updated. + repeat s if ['_${oC$>}']!=['_${__C$>}'] # Channel must be updated. function1d[] 1,${__C$>} *. {255%} r. 256,1,1,1,5 c. 0,255 +channels[0] $> map. .. j[1] .,0,0,0,$> rm[-2,-1] need_refresh=1 oC$>=${__C$>} @@ -20585,78 +25422,90 @@ # Display view. if $need_refresh - if {$viewmode==0} # Modified view. + if $viewmode==0 # Modified view. +xcc_backto[1] - elif {$viewmode%2} # Split view. + elif $viewmode%2 # Split view. w2={0,int(w/2)} b={$viewmode==1} +z[{!$b}] 0,{$w2-1} +z[$b] $w2,100% xcc_backto.. xcc_backto. a[-2,-1] x line. 50%,0,50%,100%,1,0 else # Original view. +xcc_backto[0] fi - if {s>3} drgba. fi w. rm. refresh=0 + if s>3 drgba. fi w. rm. refresh=0 fi - while {{*}" && "!{*,ESC}" && "!{*,Q}" && "!{*,SPACE}" && "!{*,ENTER}} + while {*}" && "!{*,ESC}" && "!{*,Q}" && "!{*,SPACE}" && "!{*,ENTER} w 0 - repeat 5 if {narg(${__C$>})} __xcc_C$>=${__C$>} __C$>=-1 fi done # Transfer curves to output variable and request curve widgets to close; + + # Transfer curves to output variable and request curve widgets to close. + repeat 5 if narg(${__C$>}) __xcc_C$>=${__C$>} __C$>=-1 fi done # Define colorspace conversion functions. __x_color_curves : - if {['"$1"']=='rgb'} - _color0="255,180,180" _color1="180,255,180" _color2="180,180,255" _color3="220,220,220" _title0=Red _title1=Green _title2=Blue _title3=Alpha + if ['"$1"']=='rgb' + _color0="255,180,180" _color1="180,255,180" _color2="180,180,255" _color3="220,220,220" + _title0=Red _title1=Green _title2=Blue _title3=Alpha m "xcc_goto:" m "xcc_backto:" - m "xcc_info: (0,255;0,0;0,0) (0,0;0,255;0,0) (0,0;0,0;0,255) r[-3--1] 256,3,1,1,3 "\ - "a[0,-3] y a[1,-2] y a[2,-1] y" - elif {['"$1"']=='cmy'} - _color0="180,255,255" _color1="255,180,255" _color2="255,255,100" _color3="220,220,220" _title0=Cyan _title1=Magenta _title2=Yellow _title3=Alpha + m "xcc_info: (0,255;0,0;0,0) (0,0;0,255;0,0) (0,0;0,0;0,255) r[-3--1] 256,3,1,1,3 + a[0,-3] y a[1,-2] y a[2,-1] y" + elif ['"$1"']=='cmy' + _color0="180,255,255" _color1="255,180,255" _color2="255,255,100" _color3="220,220,220" + _title0=Cyan _title1=Magenta _title2=Yellow _title3=Alpha m "xcc_goto: s c,-3 rgb2cmy[0] a c" m "xcc_backto: s c,-3 cmy2rgb[0] a c" - m "xcc_info: (255,0;255,255;255,255) (255,255;255,0;255,255) (255,255;255,255;255,0) r[-3--1] 256,3,1,1,3 "\ - "a[0,-3] y a[1,-2] y a[2,-1] y" - elif {['"$1"']=='cmyk'} - _color0="180,255,255" _color1="255,180,255" _color2="255,255,100" _color3="180,180,180" _color4="220,220,220" _title0=Cyan _title1=Magenta _title2=Yellow _title3=Key _title4=Alpha + m "xcc_info: (255,0;255,255;255,255) (255,255;255,0;255,255) (255,255;255,255;255,0) r[-3--1] 256,3,1,1,3 + a[0,-3] y a[1,-2] y a[2,-1] y" + elif ['"$1"']=='cmyk' + _color0="180,255,255" _color1="255,180,255" _color2="255,255,100" _color3="180,180,180" _color4="220,220,220" + _title0=Cyan _title1=Magenta _title2=Yellow _title3=Key _title4=Alpha m "xcc_goto: s c,-3 rgb2cmyk[0] a c" m "xcc_backto: s c,-4 cmyk2rgb[0] a c" - m "xcc_info: (255,0;255,255;255,255) (255,255;255,0;255,255) (255,255;255,255;255,0) (255,0) r[-4--1] 256,3,1,1,3 "\ - "a[0,-4] y a[1,-3] y a[2,-2] y a[3,-1] y" - elif {['"$1"']=='hsi'} - _color0="255,220,220" _color1="220,220,220" _color2="180,180,180" _color3="220,220,220" _title0=Hue _title1=Saturation _title2=Intensity _title3=Alpha + m "xcc_info: (255,0;255,255;255,255) (255,255;255,0;255,255) (255,255;255,255;255,0) (255,0) r[-4--1] 256,3,1,1,3 + a[0,-4] y a[1,-3] y a[2,-2] y a[3,-1] y" + elif ['"$1"']=='hsi' + _color0="255,220,220" _color1="220,220,220" _color2="180,180,180" _color3="220,220,220" + _title0=Hue _title1=Saturation _title2=Intensity _title3=Alpha m "xcc_goto: s c,-3 rgb2hsi8[0] a c" m "xcc_backto: s c,-3 hsi82rgb[0] a c" - m "xcc_info: 256,1,1,3,if(!c,x,128) 256,1,1,3,if(!c,0,if(c==1,x,128)) 256,1,1,3,if(!c,0,if(c==1,0,x)) hsi82rgb[-3--1] permute[-3--1] xcyz "\ - "a[0,-3] y a[1,-2] y a[2,-1] y" - elif {['"$1"']=='hsl'} - _color0="255,220,220" _color1="220,220,220" _color2="180,180,180" _color3="220,220,220" _title0=Hue _title1=Saturation _title2=Lightness _title3=Alpha + m "xcc_info: 256,1,1,3,if(!c,x,128) 256,1,1,3,if(!c,0,if(c==1,x,128)) 256,1,1,3,if(!c,0,if(c==1,0,x)) + hsi82rgb[-3--1] permute[-3--1] xcyz a[0,-3] y a[1,-2] y a[2,-1] y" + elif ['"$1"']=='hsl' + _color0="255,220,220" _color1="220,220,220" _color2="180,180,180" _color3="220,220,220" + _title0=Hue _title1=Saturation _title2=Lightness _title3=Alpha m "xcc_goto: s c,-3 rgb2hsl8[0] a c" m "xcc_backto: s c,-3 hsl82rgb[0] a c" - m "xcc_info: 256,1,1,3,if(!c,x,128) 256,1,1,3,if(!c,0,if(c==1,x,128)) 256,1,1,3,if(!c,0,if(c==1,0,x)) hsl82rgb[-3--1] permute[-3--1] xcyz "\ - "a[0,-3] y a[1,-2] y a[2,-1] y" - elif {['"$1"']=='hsv'} - _color0="255,220,220" _color1="220,220,220" _color2="180,180,180" _color3="220,220,220" _title0=Hue _title1=Saturation _title2=Value _title3=Alpha + m "xcc_info: 256,1,1,3,if(!c,x,128) 256,1,1,3,if(!c,0,if(c==1,x,128)) 256,1,1,3,if(!c,0,if(c==1,0,x)) + hsl82rgb[-3--1] permute[-3--1] xcyz a[0,-3] y a[1,-2] y a[2,-1] y" + elif ['"$1"']=='hsv' + _color0="255,220,220" _color1="220,220,220" _color2="180,180,180" _color3="220,220,220" + _title0=Hue _title1=Saturation _title2=Value _title3=Alpha m "xcc_goto: s c,-3 rgb2hsv8[0] a c" m "xcc_backto: s c,-3 hsv82rgb[0] a c" - m "xcc_info: 256,1,1,3,if(!c,x,255) 256,1,1,3,if(!c,0,if(c==1,x,128)) 256,1,1,3,if(!c,0,if(c==1,0,x)) hsv82rgb[-3--1] permute[-3--1] xcyz "\ - "a[0,-3] y a[1,-2] y a[2,-1] y" - elif {['"$1"']=='lab'} - _color0="180,180,180" _color1="220,180,220" _color2="220,220,180" _color3="220,220,220" _title0=Lightness _title1=Chroma-A _title2=Chroma-B _title3=Alpha + m "xcc_info: 256,1,1,3,if(!c,x,255) 256,1,1,3,if(!c,0,if(c==1,x,128)) 256,1,1,3,if(!c,0,if(c==1,0,x)) + hsv82rgb[-3--1] permute[-3--1] xcyz a[0,-3] y a[1,-2] y a[2,-1] y" + elif ['"$1"']=='lab' + _color0="180,180,180" _color1="220,180,220" _color2="220,220,180" _color3="220,220,220" + _title0=Lightness _title1=Chroma-A _title2=Chroma-B _title3=Alpha m "xcc_goto: s c,-3 srgb2rgb[0] apo[0] rgb2lab8,0,4 a c" m "xcc_backto: s c,-3 apo[0] lab82rgb,0,4 rgb2srgb[0] a c" - m "xcc_info: 256,1,1,3,if(!c,x,128) 256,1,1,3,if(!c,240,if(c==1,x,128)) 256,1,1,3,if(!c,240,if(c==1,128,x)) lab82rgb[-3--1] permute[-3--1] xcyz "\ - "a[0,-3] y a[1,-2] y a[2,-1] y" - elif {['"$1"']=='lch'} - _color0="180,180,180" _color1="220,180,220" _color2="255,220,220" _color3="220,220,220" _title0=Lightness _title1=Chroma _title2=Hue _title3=Alpha - m "xcc_goto: s c,-3 srgb2rgb[0] apo[0] rgb2lch8[0],0,4 a c" m "xcc_backto: s c,-3 apo[0] lch82rgb[0],0,4 rgb2srgb[0] a c" - m "xcc_info: 256,1,1,3,if(!c,x,0) 256,1,1,3,if(!c,255,if(c==1,x,128)) 256,1,1,3,if(!c,220,if(c==1,128,x)) lch82rgb[-3--1] permute[-3--1] xcyz "\ - "a[0,-3] y a[1,-2] y a[2,-1] y" - elif {['"$1"']=='ycbcr'} - _color0="180,180,180" _color1="220,220,255" _color2="255,220,220" _color3="220,220,220" _title0=Luma _title1=Blue\ chroma _title2=Red\ chroma _title3=Alpha + m "xcc_info: 256,1,1,3,if(!c,x,128) 256,1,1,3,if(!c,240,if(c==1,x,128)) 256,1,1,3,if(!c,240,if(c==1,128,x)) + lab82rgb[-3--1] permute[-3--1] xcyz a[0,-3] y a[1,-2] y a[2,-1] y" + elif ['"$1"']=='lch' + _color0="180,180,180" _color1="220,180,220" _color2="255,220,220" _color3="220,220,220" + _title0=Lightness _title1=Chroma _title2=Hue _title3=Alpha + m "xcc_goto: s c,-3 srgb2rgb[0] apo[0] rgb2lch8[0],0,4 a c" m "xcc_backto: s c,-3 apo[0] lch82rgb[0],0,4 + rgb2srgb[0] a c" + m "xcc_info: 256,1,1,3,if(!c,x,0) 256,1,1,3,if(!c,255,if(c==1,x,128)) 256,1,1,3,if(!c,220,if(c==1,128,x)) + lch82rgb[-3--1] permute[-3--1] xcyz a[0,-3] y a[1,-2] y a[2,-1] y" + elif ['"$1"']=='ycbcr' + _color0="180,180,180" _color1="220,220,255" _color2="255,220,220" _color3="220,220,220" + _title0=Luma _title1=Blue\ chroma _title2=Red\ chroma _title3=Alpha m "xcc_goto: s c,-3 rgb2ycbcr[0] a c" m "xcc_backto: s c,-3 ycbcr2rgb[0] a c" - m "xcc_info: 256,1,1,3,if(!c,x,128) 256,1,1,3,if(!c,128,if(c==1,x,128)) 256,1,1,3,if(!c,128,if(c==1,128,x)) ycbcr2rgb[-3--1] permute[-3--1] xcyz "\ - "a[0,-3] y a[1,-2] y a[2,-1] y" - else v + error[0--3] "Command 'x_color_curves': Unknown specified color space '$1'." + m "xcc_info: 256,1,1,3,if(!c,x,128) 256,1,1,3,if(!c,128,if(c==1,x,128)) 256,1,1,3,if(!c,128,if(c==1,128,x)) + ycbcr2rgb[-3--1] permute[-3--1] xcyz a[0,-3] y a[1,-2] y a[2,-1] y" + else error[0--3] "Command 'x_color_curves': Unknown specified color space '$1'." fi -#@cli x_colorize : _is_lineart={ 0 | 1 },_max_resolution={ 0 | >=128 },_multichannels_output={ 0 | 1 },_[palette1],_[palette2],_[grabber1] +#@cli x_colorize : _is_lineart={ 0 | 1 },_max_resolution={ 0 | >=128 },_multichannels_output={ 0 | 1 },\ +# _[palette1],_[palette2],_[grabber1] #@cli : Colorized selected B&W images, using an interactive window. #@cli : When >0, argument 'max_resolution' defines the maximal image resolution used in the interactive window. #@cli : Default values: 'is_lineart=1', 'max_resolution=1024' and 'multichannels_output=0'. -x_colorize : skip ${1=0},${3=0},${4=0},${5=0},${6=0} check "${2=1024}==0 || $2>=128" - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - s0="image" s1="lineart" s2="multichannel" s3="merged" use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_colorize : skip ${1=0},${3=0},${4=0},${5=0},${6=0} check "${2=1024}==0 || $2>=128" check_display + s0="image" s1="lineart" s2="multichannel" s3="merged" use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[^-1] "Colorize selected B&W "${s{!$1}}"$? interactively, with maximum resolution $2 and "${s{2+!$3}}" output." e[] "\n --------------------------------------------------------------------------------------\n @@ -20678,32 +25527,32 @@ ---- Keys '"${c}"ESC"$n"', '"${c}"Q"$n"' or '"${c}"ENTER"$n"' exit the interactive window.\n ----\n --------------------------------------------------------------------------------------" - v - N=$! thread_main="_x_colorize[0] ${1--1}" thread_color="w[] 400,320,0,\"Palette: main\" x_select_color[] __color,255,255,255" is_palette1=${"is_image_arg[] $4"} if $is_palette1 - pass$4 1 ({'{b}'}) discard. {'~'} palette_title1={t} rm. + pass$4 1 ('{b}') discard. {'~'} palette_title1={t} rm. thread_palette1="w[] 400,400,0,\"Palette: "$palette_title1"\" x_select_palette["{$!-1}"] __color" fi is_palette2=${"is_image_arg[] $5"} if $is_palette2 - pass$5 1 ({'{b}'}) discard. {'~'} palette_title2={t} rm. + pass$5 1 ('{b}') discard. {'~'} palette_title2={t} rm. thread_palette2="w[] 400,400,0,\"Palette: "$palette_title2"\" x_select_palette["{$!-1}"] __color" fi is_grabber=${"is_image_arg[] $6"} if $is_grabber - pass$6 1 ({'{b}'}) discard. {'~'} palette_grabber={t} rm. - thread_grabber="w[] ${\"fitscreen[] {w},{h},1,128,50%\"},0,\"Grabber: "$palette_grabber"\" x_grab_color["{$!-1}"] __color" + pass$6 1 ('{b}') discard. {'~'} palette_grabber={t} rm. + thread_grabber="w[] ${\"fitscreen[] {[w,h,1]},128,50%\"},0,\"Grabber: "$palette_grabber"\" + x_grab_color["{$!-1}"] __color" fi __color=255,255,255 - if {!$is_palette1" && "!$is_palette2" && "!$is_grabber} + if !$is_palette1" && "!$is_palette2" && "!$is_grabber repeat $N l[$>] parallel $thread_main,$thread_color endl done @@ -20713,21 +25562,20 @@ endl done fi k[0-{$N-1}] - v + _x_colorize : # Init variables and images. - name={n} title={b} if {narg({x})} title=$title.{x} fi + name={n} title={b} if narg({x}) title=$title.{x} fi w={w} h={h} if $1 # Line-art. - if {s==4} sh. 3 if {abs(im-iM)>64} +*. -1 rm.. +. 255 else rm. sh. 0 fi + if s==4 sh. 3 if abs(im-iM)>64 +*. -1 rm.. +. 255 else rm. sh. 0 fi else sh. 0 fi n 0,255 else # Regular image. - if {s==1} sh. 0 + if s==1 sh. 0 else +luminance. fi fi @@ -20737,13 +25585,14 @@ fdim=${fitscreen[]\ $w,$h} ww={arg(1,$fdim)} wh={arg(2,$fdim)} x0=0 y0=0 x1={w-1} y1={h-1} selection=-1 view_markers=2 contrast=9 xpan=-1 ypan=-1 replace_color= current_replace_color= - if {narg($_gui_control_points)>=6} ($_gui_control_points) r. {w/6},6,1,1,-1 # Import list of control points from plug-in GUI. + if narg($_gui_control_points)>=6 # Import list of control points from plug-in GUI. + ($_gui_control_points) r. {w/6},6,1,1,-1 else 0 # Empty list of control points. fi nm. points # Compute potential map. - if {$2>0} if {$w>$h} +r2dx[img] {min($2,$w)},2 else +r2dy[img] {min($2,$h)},2 fi else [img] fi + if $2>0 if $w>$h +r2dx[img] {min($2,$w)},2 else +r2dy[img] {min($2,$h)},2 fi else [img] fi __x_colorize. $1 pw={potential,w} ph={potential,h} @@ -20751,7 +25600,7 @@ do # Handle user events for zoom/navigation/resizing. - if {narg($replace_color)" && "{*,x}<0" && "{*,y}<0} wait 200 else wait fi + if narg($replace_color)" && "{*,x}<0" && "{*,y}<0 wait 200 else wait fi x={*,x} y={*,y} b={*,b} o={*,-o} is_ctrl={{*,CTRLLEFT}" || "{*,CTRLRIGHT}} is_shift={{*,SHIFTLEFT}" || "{*,SHIFTRIGHT}} @@ -20765,33 +25614,33 @@ x0={$cx-$dx/2} x1={$cx+$dx/2} y0={$cy-$dy/2} y1={$cy+$dy/2} ww=$nww wh=$nwh - elif {$is_ctrl" && "{*,-D}} # Increase window size. + elif $is_ctrl" && "{*,-D} # Increase window size. nww={min({*,u},$ww*1.25)} nwh={min({*,v},$wh*1.25)} m={min($nww,$nwh)} - if {$m==$nww} ww=$m wh={$h*$m/$w} else ww={$w*$m/$h} wh=$m fi - elif {$is_ctrl" && "{*,-C}} # Decrease window size. + if $m==$nww ww=$m wh={$h*$m/$w} else ww={$w*$m/$h} wh=$m fi + elif $is_ctrl" && "{*,-C} # Decrease window size. nww={$ww/1.25} nwh={$wh/1.25} - if {min($nww,$nwh)>=64} ww=$nww wh=$nwh fi - elif {$is_ctrl" && "{*,R}} # Reset window size. + if min($nww,$nwh)>=64 ww=$nww wh=$nwh fi + elif $is_ctrl" && "{*,R} # Reset window size. fdim=${fitscreen[]\ $w,$h} ww={arg(1,$fdim)} wh={arg(2,$fdim)} x0=0 y0=0 x1={$w-1} y1={$h-1} - elif {($is_shift" && "$o<0)" || "{*,ARROWLEFT}} # Go left. + elif ($is_shift" && "$o<0)" || "{*,ARROWLEFT} # Go left. dx={($x1-$x0)/6} x0-=$dx x1-=$dx - elif {($is_shift" && "$o>0)" || "{*,ARROWRIGHT}} # Go right. + elif ($is_shift" && "$o>0)" || "{*,ARROWRIGHT} # Go right. dx={($x1-$x0)/6} x0+=$dx x1+=$dx - elif {($is_ctrl" && "$o>0)" || "({*,ARROWUP}" && "!$is_ctrl)} # Go up. + elif ($is_ctrl" && "$o>0)" || "({*,ARROWUP}" && "!$is_ctrl) # Go up. dy={($y1-$y0)/6} y0-=$dy y1-=$dy - elif {($is_ctrl" && "$o<0)" || "({*,ARROWDOWN}" && "!$is_ctrl)} # Go down. + elif ($is_ctrl" && "$o<0)" || "({*,ARROWDOWN}" && "!$is_ctrl) # Go down. dy={($y1-$y0)/6} y0+=$dy y1+=$dy - elif {$o>0" || "($is_ctrl" && "{*,ARROWUP})} # Zoom in. - if {$x1-$x0>16" && "$y1-$y0>16} + elif $o>0" || "($is_ctrl" && "{*,ARROWUP}) # Zoom in. + if $x1-$x0>16" && "$y1-$y0>16 cx={if($x>=0" && "!{*,ARROWUP},$x,($x0+$x1)/2)} cy={if($y>=0" && "!{*,ARROWUP},$y,($y0+$y1)/2)} x0={$cx+($x0-$cx)*0.75} y0={$cy+($y0-$cy)*0.75} x1={$cx+($x1-$cx)*0.75} y1={$cy+($y1-$cy)*0.75} fi - elif {$o<0" || "($is_ctrl" && "{*,ARROWDOWN})} # Zoom out. + elif $o<0" || "($is_ctrl" && "{*,ARROWDOWN}) # Zoom out. zfactor={max(($x1-$x0+1)/$w,($y1-$y0+1)/$h)} - if {$zfactor<1.3} + if $zfactor<1.3 cx={if($x>=0" && "!{*,ARROWDOWN},$x,($x0+$x1)/2)} cy={if($y>=0" && "!{*,ARROWDOWN},$y,($y0+$y1)/2)} x0={$cx+($x0-$cx)/0.75} y0={$cy+($y0-$cy)/0.75} @@ -20802,79 +25651,85 @@ dx={($w-$x0-$x1)/2} dy={($h-$y0-$y1)/2} x0+=$dx x1+=$dx y0+=$dy y1+=$dy fi - elif {$b&4" && "!$is_mouseout} # Pan. - if {$panx<0" && "$pany<0} panx=$x pany=$y + elif $b&4" && "!$is_mouseout # Pan. + if $panx<0" && "$pany<0 panx=$x pany=$y else dx={round($panx-$x)} dy={round($pany-$y)} x0+=$dx y0+=$dy x1+=$dx y1+=$dy fi else panx=-1 pany=-1 fi - if {$ww!=$oww" || "$wh!=$owh" || "$ox0!=$x0" || "$oy0!=$y0" || "$ox1!=$x1" || "$oy1!=$y1} rm[baseview] fi + if $ww!=$oww" || "$wh!=$owh" || "$ox0!=$x0" || "$oy0!=$y0" || "$ox1!=$x1" || "$oy1!=$y1 rm[baseview] fi # Handle events related to control points management. N={points,w} - if {narg($baseview)" && "($b&3" || "{*,X}" || "{*,P})" && "$x>=0" && "$y>=0" && "$x<$w" && "$y<$h} - if {$selection==-1" && "$N} # Check for selection of an existing point. + if narg($baseview)" && "($b&3" || "{*,X}" || "{*,P})" && "$x>=0" && "$y>=0" && "$x<$w" && "$y<$h + if $selection==-1" && "$N # Check for selection of an existing point. ($x;$y) r. $N,2 -. [points] *. {max($ww,$wh)/max($x1-$x0,$y1-$y0)} sqr. s. y +[-2,-1] dmin={im} selection={if($dmin>25,-1,xm)} rm. fi - if {narg($replace_color)} # Go back from 'Replace color' mode. + if narg($replace_color) # Go back from 'Replace color' mode. replace_color= wait -1 - elif {$selection>=0} - if {$b&1" && "$view_markers} # Move existing point. + elif $selection>=0 + if $b&1" && "$view_markers # Move existing point. +columns[points] $selection ox={i[0]} oy={i[1]} =. $x =. $y,0,1 j[points] .,$selection rm. rm[view] - elif {($b&2" || "{*,X})" && "$view_markers} # Remove existing point. - if {$N>1} +z[points] {$selection+1},100% j[points] .,$selection rm. r[points] {$N-1},100%,1,1,0 - else rm[points] i[points] 0 fi + elif ($b&2" || "{*,X})" && "$view_markers # Remove existing point. + if $N>1 +z[points] {$selection+1},100% j[points] .,$selection rm. r[points] {$N-1},100%,1,1,0 + else rm[points] 0 nm. points fi wait -1 rm[view] fi - elif {$b&1} # Add new point - ($x;$y;0) ($__color) y. y +. 1 a[-2,-1] y a[points,-1] x selection=$N if {!$view_markers} view_markers=2 fi rm[view] - elif {$b&2" || "{*,P}} # Pick color from image. + elif $b&1 # Add new point + ($x;$y;0) ($__color) y. y +. 1 a[-2,-1] y a[points,-1] x selection=$N + if !$view_markers view_markers=2 fi + rm[view] + elif $b&2" || "{*,P} # Pick color from image. __color={colors,I($x*$pw/$w,$y*$ph/$h)} fi else selection=-1 - if {{*,-SPACE}" && "narg($colors)} replace_color= rm[colors] # Update color map. + if {*,-SPACE}" && "narg($colors) replace_color= rm[colors] # Update color map. elif {*,-TAB} view_markers={($view_markers-1)%3} rm[view] wait -1 # Toggle markers. - elif {!$is_ctrl" && "{*,-R}} # Switch color replace mode. - if {narg($replace_color)} replace_color= else replace_color=$__color fi + elif !$is_ctrl" && "{*,-R} # Switch color replace mode. + if narg($replace_color) replace_color= else replace_color=$__color fi rm[baseview] wait -1 elif {*,PAGEDOWN} contrast={max(0,$contrast-1)} rm[view] wait -1 # Decrease contrast. elif {*,PAGEUP} contrast={min(9,$contrast+1)} rm[view] wait -1 # Increase contrast. - elif {{*,BACKSPACE}" && "$N} if {$N>1} z[points] 0,{$N-2} else i=$points rm[points] i[$i] 0 nm[$i] points fi rm[view] wait -1 # Remove last point. + elif {*,BACKSPACE}" && "$N # Remove last point. + if $N>1 z[points] 0,{$N-2} else i=$points rm[points] i[$i] 0 nm[$i] points fi + rm[view] wait -1 fi fi # Manage zoomed view bounds. w2={round(($x1-$x0)/2)} h2={round(($y1-$y0)/2)} - if {$x0<-$w2} x1-={$x0+$w2} x0=-$w2 fi - if {$y0<-$h2} y1-={$y0+$h2} y0=-$h2 fi - if {$x1>=$w+$w2} x0+={$w-1+$w2-$x1} x1={$w-1+$w2} fi - if {$y1>=$h+$h2} y0+={$h-1+$h2-$y1} y1={$h-1+$h2} fi + if $x0<-$w2 x1-={$x0+$w2} x0=-$w2 fi + if $y0<-$h2 y1-={$y0+$h2} y0=-$h2 fi + if $x1>=$w+$w2 x0+={$w-1+$w2-$x1} x1={$w-1+$w2} fi + if $y1>=$h+$h2 y0+={$h-1+$h2-$y1} y1={$h-1+$h2} fi # Render color map. - if {!narg($colors)} + if !narg($colors) N={points,w} - if {narg($view)} to[view] "Processing...",5,5,20,2 w[view] fi + if narg($view) to[view] "Processing...",5,5,20,2 w[view] fi if $N [points] sh. 0,0,0,0 *. {$pw/$w} rm. sh. 1,1,0,0 *. {$ph/$h} rm. pointcloud. -1,$pw,$ph - +compose_channels. max !=. 0 distance. 1 *. 0.02 +. 1 ^. -1 +. [potential] # Additional term that depends on marker's positions. - if {!$1} dilate.. 3 fi + + # Additional term that depends on marker's positions. + +compose_channels. max !=. 0 distance. 1 *. 0.02 +. 1 ^. -1 +. [potential] + if !$1 dilate.. 3 fi watershed.. . rm. -. 1 else [potential],[potential],1,3,255 fi nm. colors - if {narg($baseview)} rm[baseview] fi + if narg($baseview) rm[baseview] fi fi # Manage replace color mode. - if {!narg($replace_color)" && "narg($points_replaced)} + if !narg($replace_color)" && "narg($points_replaced) rm[points,colors,view] nm[colors_replaced] colors nm[points_replaced] points current_replace_color= - elif {narg($replace_color)" && "['$__color']!=['$current_replace_color']} - if {narg($colors_replaced)} rm[colors_replaced,points_replaced] fi + elif narg($replace_color)" && "['$__color']!=['$current_replace_color'] + if narg($colors_replaced) rm[colors_replaced,points_replaced] fi current_replace_color=$__color if {points,w} +replace_color[colors] 0,0,$replace_color,$current_replace_color @@ -20885,39 +25740,43 @@ fi nm.. colors_replaced nm. points_replaced - if {narg($baseview)} rm[baseview] fi + if narg($baseview) rm[baseview] fi fi # Render base image. - if {!narg($baseview)} + if !narg($baseview) nx0={$x0*$pw/$w} ny0={$y0*$ph/$h} nx1={$x1*$pw/$w} ny1={$y1*$ph/$h} +z[img] $x0,$y0,$x1,$y1 r. $ww,$wh,1,100%,{if($ww x={(i[0]-$x0)*$ww/(1+$x1-$x0)} y={(i[1]-$y0)*$wh/(1+$y1-$y0)} col={i[3]-1},{i[4]-1},{i[5]-1} rm. + if $view_markers==2 rad1=5 rad2=3 else rad1=3 rad2=2 fi + if narg($replace_color)" && "{points,w} ipoints=$points_replaced else ipoints=$points fi + repeat w#$ipoints + +columns[$ipoints] $> + x={(i[0]-$x0)*$ww/(1+$x1-$x0)} + y={(i[1]-$y0)*$wh/(1+$y1-$y0)} + col={i[3]-1},{i[4]-1},{i[5]-1} + rm. circle. $x,$y,$rad1,1,0 circle. $x,$y,$rad2,1,$col done fi - if {narg($replace_color)} + if narg($replace_color) to. "Replace by",5,5,20,2 rectangle. 80,8,111,25,1,0 rectangle. 82,10,109,23,1,$replace_color rectangle. 150,8,181,25,1,0 rectangle. 152,10,179,23,1,$current_replace_color @@ -20927,10 +25786,10 @@ w[view] $ww,$wh,0,$title fi - while {{*}" && "!{*,ESC}" && "!{*,Q}" && "!{*,ENTER}} + while {*}" && "!{*,ESC}" && "!{*,Q}" && "!{*,ENTER} # Recompute colors at full resolution. - if {narg($view)} to[view] "Processing fullres...",5,5,20,2 w[view] fi + if narg($view) to[view] "Processing fullres...",5,5,20,2 w[view] fi k[0,img,points] N={points,w} status= if $N @@ -20938,7 +25797,7 @@ [img] __x_colorize. $1 pointcloud[points] -1,$w,$h +compose_channels[points] max !=. 0 distance. 1 *. 0.02 +. 1 ^. -1 +[potential,-1] - if {!$1} zfact={{img,max(w,h)}/{potential,max(w,h)}} dilate[points] {int(3*$zfact)} fi + if !$1 zfact={{img,max(w,h)}/{potential,max(w,h)}} dilate[points] {int(3*$zfact)} fi watershed[points] [potential] -[points] 1 nm[points] colors else [img],[img],1,3,255 nm. colors fi @@ -20969,9 +25828,8 @@ #@cli x_connect4 #@cli : Launch the Connect Four game. -x_connect4 : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_connect4 : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Connect Four"$n" --------------------------------------------\n ----\n @@ -20985,7 +25843,7 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' close the window.\n ----\n ----------------------------------------------------------------" - v - l[] + l[] # Create sprite graphics. 7,6 nm. board @@ -21028,9 +25886,9 @@ do # Initialize game. - if {!narg($visu)} + if !narg($visu) {board,[w,h]*$R},1,3,64 - repeat {board,h},y repeat {board,w},x + repeat h#$board,y repeat w#$board,x val={board,i($x,$y)} if $val j. [token{$val-1}],{$x*$R},{$y*$R},0,0,1,[tokenm],255 fi done done +r[cache,cachem] {board,[w,h]*$R},1,100%,0,2 a[-2,-1] c blend[-2,-1] alpha @@ -21040,16 +25898,16 @@ fi # Estimate ymax for each column. - if {!narg($ymax)} - i[ymax] {board,w},1,1,1,"y=-1; for (k = 0, k=w} w[visu] 100%,100% @@ -21083,23 +25941,23 @@ wait fi - if {{*,-b}&1" && "$yM>=0" && "$x>=0} is_falling=1 yv=0 dyv=1 # Manual play - elif {${autoplayer$turn}" || "{*,-SPACE}" || "{*,ENTER}} # Computer play + if {*,-b}&1" && "$yM>=0" && "$x>=0 is_falling=1 yv=0 dyv=1 # Manual play + elif ${autoplayer$turn}" || "{*,-SPACE}" || "{*,ENTER} # Computer play if {*,-ENTER} autoplayer$turn=1 fi max_score=-inf max_col= - repeat {board,w},move1 + repeat w#$board,move1 yM1={i("#"$ymax,$move1)} - if {$yM1>=0} + if $yM1>=0 +=[board] {1+$turn},$move1,$yM1 nm. board1 - i[ymax1] {board,w},1,1,1,"y=-1; for (k = 0, k=0} + if $yM2>=0 +=[board1] {1+$opp_turn},$move2,$yM2 +f. "const p = 1 + "$opp_turn"; "$evalf score={is+u} rm. - if {$score>$opp_max_score} opp_max_score=$score opp_max_board={^} fi + if $score>$opp_max_score opp_max_score=$score opp_max_board={^} fi rm. fi done @@ -21107,16 +25965,16 @@ {board,[w,h,1,1]},$opp_max_board f. "const p = 1 + "$turn"; "$evalf score={is+u} rm. - if {$score>$max_score} max_score=$score max_col=$move1 fi + if $score>$max_score max_score=$score max_col=$move1 fi fi done x=$max_col is_falling=1 yv=0 dyv=1 fi else # Manage token falling animation - if {!narg($column)} + if !narg($column) $R,{board,h*$R},1,3,64 - repeat {board,h} v={board,i($x,$>)} if $v j. [token{$v-1}],0,{$>*$R},0,0,1,[tokenm],255 fi done + repeat h#$board v={board,i($x,$>)} if $v j. [token{$v-1}],0,{$>*$R},0,0,1,[tokenm],255 fi done nm. column fi @@ -21124,9 +25982,9 @@ [column] j. [token$turn],0,$yv,0,0,1,[tokenm],255 j. [cache],0,0,0,0,1,[cachem],255 - i[tmpvisu] [visu] + [visu] nm. tmpvisu j[tmpvisu] ..,{$R*$x},0,0,0 rm.. w[tmpvisu] 100%,100% - if {$yv>=$yM*$R} + if $yv>=$yM*$R j[visu] [tmpvisu] is_falling=0 =[board] {$turn+1},$x,$yM rm[ymax,column] @@ -21138,7 +25996,7 @@ case_d1 = i==j(1,1) && i==j(2,2) && i==j(3,3); case_d2 = i==j(1,-1) && i==j(2,-2) && i==j(3,-3); case_h?1:case_v?2:case_d1?3:case_d2?4)" - if {iM} winner={[xM,yM,i(xM,yM)]} # Player won ! + if iM winner={[xM,yM,i(xM,yM)]} # Player won ! else turn={($turn+1)%2} fi rm. @@ -21148,14 +26006,80 @@ wait 20 fi - while {{*}" && "!{*,ESC}" && "!{*,Q}} - rm w 0 endl v + + while {*}" && "!{*,ESC}" && "!{*,Q} + rm w 0 endl + +#@cli xz : eq. to 'x_crop' +xz : + _gmic_s="$?" v + _x_crop + +#@cli x_crop +#@cli : Crop selected images interactively. +#@cli : (eq. to 'xz'). +x_crop : + _gmic_s="$?" v + _$0 + +_x_crop : + e[0--3] "Crop image"$_gmic_s" interactively." + repeat $! l[$>] + w ${"fitscreen "{[w,h,d]}},1,"[G'MIC] "{n}" - Interactive crop" + +select 2,{round([w,h,d]/2)},0,1 u={^} z.. $u rm. + w[] 0 is_change + endl done u $u + +#@cli x_cut +#@cli : Cut selected images interactively. +x_cut : + e[^-1] "Cut image"$_gmic_s" interactively." + repeat $! l[$>] + wsiz0=${"fitscreen ."} + value0,value1=-1,-1 + w[] $wsiz0,0,"[G'MIC] "{n}" - Interactive cut" + 0 + for {*}" && "!{*,ESC} + + if [w#1,h#1]!=[{*,w,h}] # Generate image view + rm[1] +slices[0] 50% r. {*,w,h},1,100%,1 w. + fi + + mx,my,mb={*,x,y,b} + if $mb" && "$mx>=0" && "$my>=0 + value0,value1={"dw1 = "{*,w}" - 1; value0 = "$mx"*100/dw1; + dh1 = "{*,h}" - 1; value1 = "$my"*100/dh1; + [ value0,value1 ];"} + update_view=1 + fi + + if $update_view + if $value0>=0" && "$value1>=0 + +c[1] $value0%,$value1% n. 0,255 + to. "Min: "{_round($value0,0.1)}%"\n"\ + "Max: "{_round($value1,0.1)}%,1%,1%,{max(13,3.5*h%)} + w. rm. + else w. + fi + update_view=0 + fi + + wait + if {*,r} update_view=1 fi + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,D} + w[] {{*,w}*1.5},{{*,h}*1.5} wait -1 update_view=1 + fi + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,C} + w[] {{*,w}/1.5},{{*,h}/1.5} wait -1 update_view=1 + fi + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,R} + w[] $wsiz0 wait -1 update_view=1 + fi + done + w[] 0 rm. u $value0%,$value1% c ${} + endl done #@cli x_fire #@cli : Launch the fire effect demo. -x_fire : skip "${1=G\47MIC}" - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_fire : skip "${1=G\47MIC}" check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Fire effect"$n" ------------------------\n ----\n @@ -21164,11 +26088,10 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n -------------------------------------------" - v - # Init image data. i[0] 100,32 w[0] {[4.5*w,6.75*h]},0,"[G"{`39`}"MIC] Fire Effect" - if {{*,w}<0.5*{*,u}} w[] {[{*,w},{*,h}]*1.5} fi + if {*,w}<0.5*{*,u} w[] {[{*,w},{*,h}]*1.5} fi i[1] (0,255,255,255,255^0,0,255,255,255^0,0,0,128,255) r[1] 256,1,1,3,3 i[2] (0,0,0;0,0,0;1,1,1;0,1,0) *[2] 0.21 text3d "$1",33,3,1 @@ -21186,21 +26109,19 @@ *3d. 0.25,0.16,1 j3d[0] .,50%,50%,0,1,3,0,0 rm. angle+=3 # Update 3D angle. - fps=${-fps} if {$fps>0} to. $fps" fps",5,{h-22},16,1,0.2 fi + fps=${-fps} if $fps>0 to. $fps" fps",5,{h-22},16,1,0.2 fi w. - if {{*,CTRLLEFT}&&{*,D}} w[] {1.5*[w,h]} elif {{*,CTRLLEFT}&&{*,C}} w[] {[w,h]} fi + if {*,CTRLLEFT}" && "{*,D} w[] {1.5*[w,h]} elif {*,CTRLLEFT}" && "{*,C} w[] {[w,h]} fi rm. wait 40 - while {{*}" && "!{*,ESC}" && "!{*,Q}} + while {*}" && "!{*,ESC}" && "!{*,Q} # Exit properly. rm[0-3] w 0 - v + #@cli x_fireworks #@cli : Launch the fireworks demo. -x_fireworks : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_fireworks : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Fireworks"$n" --------------------------\n ----\n @@ -21209,14 +26130,14 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n --------------------------------------------" - v - l[] + l[] (16;64^64;32^128;32) r 320,160,1,3,3 # [-2] = Background (color gradient). . # [-1] = Rendered image. w. {1.5*w},{1.5*h},0,"[G"{`39`}"MIC] Fireworks" # Display window. time=0 do # Start animation loop. time-=1 - if {$!==2\ ||\ $time<0} # Insert new rocket. + if $!==2\ ||\ $time<0 # Insert new rocket. i[0] ({u(w)},\ # X-position {h},\ # Y-position {u(-3,3)},\ # X-velocity @@ -21224,18 +26145,18 @@ {30+u(20)},\ # Time of explosion 1.5,\ # Radius 255,255,255) # Color - time={u(20)} # Elapsed time until next rocket. + time={u(20)} # Elapsed time until next rocket. fi *. 0.99 # Create fading effect with previous frames. j. ..,0,0,0,0,0.2 # Add background. i=0 - repeat {$!-2} + repeat $!-2 to_be_removed=0 radius={if({$i,@4}>0,{$i,@5}/3,{$i,@5}*(1+2*({$i,@4}+2)/120))} - ellipse. {$i,@0},{$i,@1},{$i,@5},{max(0.5,$radius)},{atan2({$i,@3},{$i,@2})*180/pi},0.6,{$i,@6-8} # Draw rocket. + ellipse. {$i,@0},{$i,@1},{$i,@5},{max(1,$radius)},{atan2({$i,@3},{$i,@2})*180/pi},0.6,{$i,@6-8} # Draw rocket. ({$i,@2},{$i,@3},0,0.09,-1,0,0,0,0) +[$i,-1] # Compute new position of the rocket. - if {{$i,@0}<0\ ||\ {$i,@0}>=w\ ||\ {$i,@1}>=h\ ||\ $radius<0} to_be_removed=1 fi # Discard if rocket disappear. - if {{$i,@4}<0\ &&\ {$i,@4}>=-1} # In case of explosion -> Split current rocket into several colorful rockets. + if {$i,@0}<0\ ||\ {$i,@0}>=w\ ||\ {$i,@1}>=h\ ||\ $radius<0 to_be_removed=1 fi # Discard if rocket disappear. + if {$i,@4}<0\ &&\ {$i,@4}>=-1 # In case of explosion -> Split current rocket into several colorful rockets. color={min(255,80+u(200))},{min(255,80+u(200))},{min(255,80+u(200))} radius={u(10)} N={5+u(10)} @@ -21247,17 +26168,16 @@ fi if $to_be_removed rm[$i] else i+=1 fi # If processed rocket has to be removed. done - fps=${-fps} if {$fps>0} to. $fps" fps",3,{h-20},14,1,0.2 fi + fps=${-fps} if $fps>0 to. $fps" fps",3,{h-20},14,1,0.2 fi w. wait 20 # Display rendered frame. - if {{*,CTRLLEFT}&&{*,D}} w[] {3*w},{3*h} elif {{*,CTRLLEFT}&&{*,C}} w[] {1.5*w},{1.5*h} fi - while {{*}" && "!{*,ESC}" && "!{*,Q}} - rm w 0 endl v + + if {*,CTRLLEFT}" && "{*,D} w[] {3*w},{3*h} elif {*,CTRLLEFT}" && "{*,C} w[] {1.5*w},{1.5*h} fi + while {*}" && "!{*,ESC}" && "!{*,Q} + rm w 0 endl #@cli x_fisheye #@cli : Launch the fish-eye effect demo. -x_fisheye : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_fisheye : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Fish-eye effect"$n" --------------------\n ----\n @@ -21268,8 +26188,8 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n -------------------------------------------" - v - - if {$!>0} a x n 0,255 r2dy 220 else + + if $!>0 a x n 0,255 r2dy 220 else 120,90,1,3 rand. 0,255 plasma. 0.3,3 n 0,255 t " G\47MIC\nFISH-EYE\n EFFECT",20,13,23,1,255 scale3x b 5 sharpen 1000 f i+150-3*abs(y-h/2) c. 0,255 frame_fuzzy. 15,10,15,1.5,0 to_rgb. @@ -21280,23 +26200,22 @@ w.. {1.25*{-2,w}},{1.25*{-2,h}},0,"[G"{`39`}"MIC] Fish-Eye Effect" do wait 40 - if {{*,b}==1} R={min(80,$R+8)} fi - if {{*,b}==2} R={max(3,$R-8)} fi + if {*,b}==1 R={min(80,$R+8)} fi + if {*,b}==2 R={max(3,$R-8)} fi +j3d.. .,{50+30*cos($|*2.5)}%,{50+30*sin($|*1.6)}%,{80+230*sin($|*2.6)},0.7,3,0,0 r3d.. 1,0.2,0.6,3 - if {{*,x}>=0} + if {*,x}>=0 fisheye. {{*,x}*100/{*,w}},{{*,y}*100/{*,h}},$R fi w. - if {{*,CTRLLEFT}&&{*,D}} w[] {3*w},{3*h} elif {{*,CTRLLEFT}&&{*,C}} w[] {1.5*w},{1.5*h} fi + if {*,CTRLLEFT}" && "{*,D} w[] {3*w},{3*h} elif {*,CTRLLEFT}" && "{*,C} w[] {1.5*w},{1.5*h} fi rm. - if {{*}==0" || "{*,ESC}" || "{*,Q}} rm[-2,-1] w 0 v + return fi + if {*}==0" || "{*,ESC}" || "{*,Q} rm[-2,-1] w 0 return fi while 1 #@cli x_fourier #@cli : Launch the fourier filtering demo. -x_fourier : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_fourier : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Fourier-filtering"$n" ----------------------------------------\n ----\n @@ -21307,8 +26226,8 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n -----------------------------------------------------------------" - v - - if {!$!} sp ? r2dx 400 fi + + if !$! sp ? r2dx 400 fi repeat $! l[$>] @@ -21317,8 +26236,8 @@ freqmin=0 # min freq. (in %) freqmax=100 # max freq. (in %) - if {w>3*{*,u}/5} r2dx. {3*{*,u}/10} fi # Reduce image size if necessary. - if {h>3*{*,v}/5} r2dy. {3*{*,v}/5} fi + if w>3*{*,u}/5 r2dx. {3*{*,u}/10} fi # Reduce image size if necessary. + if h>3*{*,v}/5 r2dy. {3*{*,v}/5} fi # Compute fourier transform. +fft. nm.. real nm. imag @@ -21332,7 +26251,7 @@ w[0,-2] -1,-1,0,"[G"{`39`}"MIC] Fourier Filtering" l - if {!narg($first_time)} + if !narg($first_time) parallel 0,"alert[thumb] \"[G"{`39`}"MIC Fourier Filtering]\",\ \"The G\47MIC Fourier filtering demo illustrates the effect\n\ of bandpass frequency filtering on an image. Use your mouse\n\ @@ -21349,7 +26268,7 @@ if $need_update # If image must be updated. # Generated filtering mask. - i[mask] [logmag],[logmag] + [logmag],[logmag] nm. mask r={sqrt(w^2+h^2)*$freqmax/200} ellipse[mask] 50%,50%,$r,$r,0,1,1 r={max(0,sqrt(w^2+h^2)*$freqmin/200-1)} if $r ellipse[mask] 50%,50%,$r,$r,0,1,0 fi @@ -21375,47 +26294,51 @@ wait - if {{*,b}" && "{*,x}>={*,w}/2} # If mouse button pressed on the right pane. + if {*,b}" && "{*,x}>={*,w}/2 # If mouse button pressed on the right pane. r={200*sqrt(({*,x}-3*{*,w}/4)^2+({*,y}-{*,h}/2)^2)/\ # Compute selected radius (in %). sqrt(({*,w}/2)^2+{*,h}^2)} - if {{*,b}&1} freqmax=$r # Update max freq. if left button. - else freqmin={max(0,$r-3)} # Update min freq. if other button. + if {*,b}&1 freqmax=$r # Update max freq. if left button. + else freqmin={max(0,$r-3)} # Update min freq. if other button. fi - if {$freqmin>=$freqmax} freqmin=$freqmax fi # Check that the min/max freq. are ordered. - need_update=1 # Tell that the image must be updated. + if $freqmin>=$freqmax freqmin=$freqmax fi # Check that the min/max freq. are ordered. + need_update=1 # Tell that the image must be updated. fi if {*,r} need_update=1 fi - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,D}} w[] {{*,w}*1.5},{{*,h}*1.5} need_update=1 fi # Increase window size. - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,C}} w[] {{*,w}/1.5},{{*,h}/1.5} need_update=1 fi # Decrease window size. - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,R}} w[] {2*{0,w}},{0,h} need_update=1 fi # Reset window size. - while {{*}" && "!{*,ESC}" && "!{*,Q}} + # Increase window size. + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,D} w[] {{*,w}*1.5},{{*,h}*1.5} need_update=1 fi + + # Decrease window size. + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,C} w[] {{*,w}/1.5},{{*,h}/1.5} need_update=1 fi + + # Reset window size. + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,R} w[] {2*{0,w}},{0,h} need_update=1 fi + + while {*}" && "!{*,ESC}" && "!{*,Q} w 0 endl rm[^0] # Clean images and window. - endl done rm v + + endl done rm #@cli x_grab_color : _variable_name #@cli : Open a color grabber widget from the first selected image. #@cli : Argument 'variable_name' specifies the variable that contains the selected color values at any time. #@cli : Assigning '-1' to it forces the interactive window to close. #@cli : Default values: 'variable_name=xgc_variable'. -x_grab_color : skip ${1=xgc_variable} - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - if {!$!} error[0--3] "Command '$0': Missing specified input image." fi - v - l[0] nm={n} nm. img v + +x_grab_color : skip ${1=xgc_variable} check_display + if !$! error[0--3] "Command '$0': Missing specified input image." fi + l[0] nm={n} nm. img e[^-1] "Open "${arg\ {0,s},GRAY,GRAYA,RGB,RGBA}" color grabber widget for image$?, with variable name '$1'." - v - - if {!{*}} w[] ${fitscreen[]\ {w},{h},1,128,50%},0,0,-1,-1,"Grab a color" fi + if !{*} w[] ${fitscreen[]\ {[w,h,1]},128,50%},0,0,-1,-1,"Grab a color" fi _x_grab_color +dilate. 3 nm. icon_mask *.. 255 to_rgb.. nm.. icon_sprite xc=5 yc=5 o$1=$$1 cursor[0] 0 do - if {!narg($visu0)} + if !narg($visu0) +r[img] {*,w},{*,h},1,100%,2 drgba. w. nm. visu0 fi @@ -21423,14 +26346,14 @@ hc={narg($$1)?40:24} yc={visu0,nhc=h-$hc-8;!$mouse_over?$yc:$y<$hc||$yc+$hc>=h?nhc:$y>=nhc?5:$yc} - if {[0$ox,0$oy,0$ob,0$ohc,0$oyc,0$ocolor,0${o$1}]!=[$x,$y,$b,$hc,$yc,0$color,0$$1]} - i[visu] [visu0] - if {narg($color)} + if [0$ox,0$oy,0$ob,0$ohc,0$oyc,0$ocolor,0${o$1}]!=[$x,$y,$b,$hc,$yc,0$color,0$$1] + [visu0] nm. visu + if narg($color) 24,$hc,1,[img] fc. $color - if {narg($$1)} rectangle. 0,24,100%,100%,1,$$1 line. 0,24,100%,24,1,0 fi + if narg($$1) rectangle. 0,24,100%,100%,1,$$1 line. 0,24,100%,24,1,0 fi drgba. frame. 1,1,0 frame. 1,1,255 j[visu] .,$xc,$yc rm. 0 - if {narg($$1)} + if narg($$1) t. "Position ("$X","$Y")\nColor ("{``$color}")\nSelected ("{``$$1}")",1,0,15,1,255 else t. "Position ("$X","$Y")\nColor ("{``$color}")",1,0,15,1,255 @@ -21444,38 +26367,36 @@ Y={img,round($y*(h-1)/({*,h}-1))} color={img,round(I($X,$Y))} j[visu] [icon_sprite],$x,{icon_sprite,$y-h+1},0,0,1,[icon_mask] - if {$b&1} $1=$color fi + if $b&1 $1=$color fi fi w[visu] rm[visu] ox=$x oy=$y ob=$b ohc=$hc oyc=$yc ocolor=$color o$1=$$1 fi - if {arg(1,{'$1'})==_'_'" && "arg(2,{'$1'})==_'_'} wait 50 else wait fi - if {*,r} w[] -1 rm[visu0] yc=5 v - fi - if {['$$1']=='-1'} break fi # Close request + if arg(1,{'$1'})==_'_'" && "arg(2,{'$1'})==_'_' wait 50 else wait fi + if {*,r} w[] -1 rm[visu0] yc=5 fi + if ['$$1']=='-1' break fi # Close request - while {{*}" && "!{*,ESC}" && "!{*,Q}} + while {*}" && "!{*,ESC}" && "!{*,Q} w 0 k[img] nm $nm endl u $color - v + # Define color grabber icon. _x_grab_color : - base642img \ -"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMSAzMzcgMSAxICMyNzcKeJyNiNlOwlAYBi9IDDcaY+LGpiJbj7tBKEbglTQE7dcbkZS1gfNXFCxlK6"\ -"WE83w+gDaaeG0mmWTm67NSea5s1Pz6Ot80tnrb/d3BnhkYBq3QKDyOTA5nmfqDnW2W5nK77Mj60yLXgZvrqm6Oq47MYWc4ZhnCJE2wrgjmBWFwRmr/hNQ3"\ -"ZqivKQIlCN0YQZdeQGgxzXOD1T3XWEMhVWMtz1Wmw4h1QHEOShogqQc67YPOBwpdmgpdWzDSY9DNFJS1wWUH/NZF926FTl4oel48tgui3C6KUrMo7rWCYC"\ -"vJg4k/fvp/5/dJq9QyuUy48UXMOZ5H7ah9ND2YRMbhUXgUsoLDgOnxsf++0/TX1zRf1fcNa0iPgw==" + base642img[] \ +"MSB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMSAzMzcgMSAxICMyNzcKeJyNiNlOwlAYBi9IDDcaY+LGpiJbj7tBKEbglTQE7dcbkZS1gfNXFCx"\ +"lK6WE83w+gDaaeG0mmWTm67NSea5s1Pz6Ot80tnrb/d3BnhkYBq3QKDyOTA5nmfqDnW2W5nK77Mj60yLXgZvrqm6Oq47MYWc4ZhnCJE2wrgjmBWFwRm"\ +"r/hNQ3ZqivKQIlCN0YQZdeQGgxzXOD1T3XWEMhVWMtz1Wmw4h1QHEOShogqQc67YPOBwpdmgpdWzDSY9DNFJS1wWUH/NZF926FTl4oel48tgui3C6KU"\ +"rMo7rWCYCvJg4k/fvp/5/dJq9QyuUy48UXMOZ5H7ah9ND2YRMbhUXgUsoLDgOnxsf++0/TX1zRf1fcNa0iPgw==" -. 127 decompress_rle. frame. 10,10,0 r2dx. 24 #@cli x_hanoi #@cli : Launch the Tower of Hanoi game. -x_hanoi : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_hanoi : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Tower of Hanoï"$n" ---------------------\n ----\n @@ -21486,7 +26407,7 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n -------------------------------------------" - v - l[] + l[] l[] # Create 3D rods cylinder3d 1,10 r3d 1,0,0,90 ++3d 10,0,0 +-3d.. 10,0,0 @@ -21501,10 +26422,11 @@ l[] # Create 3D disks 6,1,1,3,'[360*x/w,0.9*(1-(x/w)^0.5),0.9]' hsi2rgb. ytop0=0 - repeat {0,w} + repeat w#0 R,r={3-0.3*$>},{1.6-0.22*$>} torus3d $R,$r,36,10 - 300,300 plasma. 1,1,3 b. 20 sharpen. 300 n. 150,255 1,1,1,3,{0,I[$>]} r. ..,..,1,3 rv[-2,-1] blend[-2,-1] luminance,0.75 # Marble texture + 300,300 plasma. 1,1,3 b. 20 sharpen. 300 n. 150,255 1,1,1,3,{0,I[$>]} r. ..,..,1,3 rv[-2,-1] blend[-2,-1] + luminance,0.75 # Marble texture texturize3d.. . rm. /3d. 1,1,{0.3+$r} r3d. 1,0,0,90 -3d. 0,0.8,0 a$>,x$>,y$>,h$>=0,0,$ytop0,{1.8*$r/(0.3+$r)} @@ -21524,39 +26446,39 @@ # Display 3D view for current game state. repeat 6 +r3d[disk3d$>] 1,1,1,${a$>} +3d. {10*(${x$>}-1)},-${y$>},0 done +3d[-6--1] +3d. [rods3d] r3d. 1,0,0,20 - if {!($buttons&2)} r3d. 0,1,0.3,{5*cos(1.5*$|)} r3d. 0.3,0,1,{3*sin(0.8*$|)} fi + if !($buttons&2) r3d. 0,1,0.3,{5*cos(1.5*$|)} r3d. 0.3,0,1,{3*sin(0.8*$|)} fi r3d. 1,0,0,$motion3d_y r3d. 0,-1,0,$motion3d_x *3d. 20 [background] j3d. ..,50%,70%,10,1,5,0,1,800,200,0,-3000,0.15,0.2 t. "#Moves: "$nb_moves,2%,92%,20,1,255 if $error (255^0^0) r. .. j.. .,0,0,0,0,$error error={max(0,$error-0.2)} rm. fi - if {$|-$fading<1} *. {$|-$fading} fi + if $|-$fading<1 *. {$|-$fading} fi w. wait 40 - if {{*,CTRLLEFT}&&{*,D}} w[] {w*1.5},{h*1.5} elif {{*,CTRLLEFT}&&{*,C}} w[] {w},{h} fi + if {*,CTRLLEFT}" && "{*,D} w[] {w*1.5},{h*1.5} elif {*,CTRLLEFT}" && "{*,C} w[] {w},{h} fi rm[-2,-1] - # Get indice of top disk for each rod. + # Get index of top disk for each rod. top0,top1,top2,ytop0,ytop1,ytop2=-1 repeat 6 rod={round(${x$>})} - if {$selected!=$>" && "${y$>}+${h$>}>${ytop$rod}} ytop$rod={${y$>}+${h$>}} top$rod=$> fi + if $selected!=$>" && "${y$>}+${h$>}>${ytop$rod} ytop$rod={${y$>}+${h$>}} top$rod=$> fi done # Manage user events. prev_buttons=$buttons mouse_x,mouse_y,buttons={*,x},{*,y},{*,b} - if {$mouse_x>=0} x={2.6*($mouse_x/{*,w}-0.5)+1} rod={round($x)} fi + if $mouse_x>=0 x={2.6*($mouse_x/{*,w}-0.5)+1} rod={round($x)} fi - if {$mouse_x>=0" && "$buttons&2} # Right mouse button + if $mouse_x>=0" && "$buttons&2 # Right mouse button motion3d_x,motion3d_y={([$mouse_x,$mouse_y]/[{*,w},{*,h}]-0.5)*90} - elif {$mouse_x>=0" && "$buttons&1} # Left mouse button - if {$selected<0} # Select a disk + elif $mouse_x>=0" && "$buttons&1 # Left mouse button + if $selected<0 # Select a disk selected=${top$rod} rod_source={$selected<0?-1:$rod} fi - if {$selected>=0" && "$rod>=0} # Move a selected disk - if {${y$selected}<11} y$selected={min(11,${y$selected}+3)} + if $selected>=0" && "$rod>=0 # Move a selected disk + if ${y$selected}<11 y$selected={min(11,${y$selected}+3)} else x$selected+={d=$rod-${x$selected};sign(d)*min(0.3,abs(d))} y$selected={x=${x$selected};11+1.5*sin(pi*abs(x-round(x)))} @@ -21564,35 +26486,34 @@ fi fi - elif {!$buttons} # No mouse button - if {$rod>=0" && "$selected>=0} - if {$rod_target<0} - if {${top$rod}<$selected} rod_target=$rod nb_moves+={$rod_target!=$rod_source} # Allowed move + elif !$buttons # No mouse button + if $rod>=0" && "$selected>=0 + if $rod_target<0 + if ${top$rod}<$selected rod_target=$rod nb_moves+={$rod_target!=$rod_source} # Allowed move else rod_target=$rod_source error=0.8 # Forbidden move fi fi x$selected=$rod_target a$selected=0 ytop={max(0,${ytop$rod_target})} - if {${y$selected}>$ytop} y$selected={max($ytop,${y$selected}-3)} + if ${y$selected}>$ytop y$selected={max($ytop,${y$selected}-3)} else x,rod,rod_source,rod_target,selected=-1 fi fi fi - if {!($buttons&2)} # Slowly go back to initial 3D view + if !($buttons&2) # Slowly go back to initial 3D view motion3d_x-={sign($motion3d_x)*min(1,abs($motion3d_x))} motion3d_y-={sign($motion3d_y)*min(1,abs($motion3d_y))} fi - while {{*}" && "!{*,ESC}" && "!{*,Q}} - w[] 0 rm endl v + + while {*}" && "!{*,ESC}" && "!{*,Q} + w[] 0 rm endl #@cli x_histogram #@cli : Launch the histogram demo. -x_histogram : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_histogram : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Histogram demo"$n" -------------------------------\n ----\n @@ -21601,9 +26522,9 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n -----------------------------------------------------" - v - - if {!$!} sp ? to_rgb - else k[0] to_rgb r2dy 300,2 if {w>800} r 800,100%,1,3,2 fi n 0,255 + + if !$! sp ? to_rgb + else k[0] to_rgb r2dy 300,2 if w>800 r 800,100%,1,3,2 fi n 0,255 fi # Prepare image layout. @@ -21658,7 +26579,7 @@ rm[-4--2] j.. .,5,{0,h+16} rm. - if {{*,b}&1\ &&\ {*,x}<{0,w}\ &&\ {*,y}<{0,h}} + if {*,b}&1\ &&\ {*,x}<{0,w}\ &&\ {*,y}<{0,h} j. [0],6,6 to. Original,10,10,16 fi @@ -21667,24 +26588,24 @@ wait # Manage user interactions. - if {{*,b}&1\ &&\ {*,x}>={0,w}-10} - if {{*,y}>=25\ &&\ {*,y}<=42} + if {*,b}&1\ &&\ {*,x}>={0,w}-10 + if {*,y}>=25\ &&\ {*,y}<=42 gamma={max(0,min(4,({*,x}-$sx)*4/280))} - elif {{*,y}>=75\ &&\ {*,y}<=92} + elif {*,y}>=75\ &&\ {*,y}<=92 contrast={max(0,min(4,({*,x}-$sx)*4/280))} - elif {{*,y}>=125\ &&\ {*,y}<=142} + elif {*,y}>=125\ &&\ {*,y}<=142 brightness={max(-128,min(128,({*,x}-$sx)*256/280-128))} - elif {{*,y}>=175\ &&\ {*,y}<=192} + elif {*,y}>=175\ &&\ {*,y}<=192 smoothness={max(0,min(10,({*,x}-$sx)*10/280))} - elif {{*,y}>=225\ &&\ {*,y}<=242} + elif {*,y}>=225\ &&\ {*,y}<=242 sharpness={max(0,min(2000,({*,x}-$sx)*2000/280))} - elif {{*,y}>=275\ &&\ {*,y}<=292} + elif {*,y}>=275\ &&\ {*,y}<=292 clusters={max(2,min(256,({*,x}-$sx)*256/280))} fi fi - if {{*,b}&2\ ||\ {*,SPACE}} clusters=64 sharpness=0 smoothness=0 contrast=1 brightness=0 gamma=1 fi - while {{*}" && "!{*,ESC}" && "!{*,Q}} - w 0 rm v + + if {*,b}&2\ ||\ {*,SPACE} clusters=64 sharpness=0 smoothness=0 contrast=1 brightness=0 gamma=1 fi + while {*}" && "!{*,ESC}" && "!{*,Q} + w 0 rm _x_histogram : val={max(0,min(100,$1))} @@ -21695,9 +26616,8 @@ #@cli x_hough #@cli : Launch the hough transform demo. -x_hough : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_hough : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Hough-transform"$n" -----------------------------------------\n ----\n @@ -21708,13 +26628,13 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n -----------------------------------------------------------------" - v - - if {!$!} l[] sp greece onfail testimage2d 400 endl fi + + if !$! l[] sp greece onfail testimage2d 400 endl fi n 0,255 repeat $! l[$>] - r. ${fitscreen\ {w},{h}},1,100%,3 # Resize to fit screen if necessary. - if {!narg($first_time)} + r. ${fitscreen\ {[w,h]}},1,100%,3 # Resize to fit screen if necessary. + if !narg($first_time) parallel 0,"+l[0] r2dy 128 frame 1,1,0 \ alert \"[G"{`39`}"MIC Hough Transform]\",\ \"The G\47MIC Hough transform demo illustrates the application\n\ @@ -21744,10 +26664,10 @@ *. {pi} +[-3,-1] %.. {2*pi} *.. {0.5*{-3,w}/pi} *. {{-3,h}/$rhomax} a[-2,-1] y - repeat {w} point.. {i($>,0)},{i($>,1)},0,0.3,255 done + repeat w point.. {i($>,0)},{i($>,1)},0,0.3,255 done rm. w1. - elif {{*1,x}>=0" && "{*1,b}} # When clicking on the vote window. + elif {*1,x}>=0" && "{*1,b} # When clicking on the vote window. theta={{*1,x}*2*pi/{*1,w}} rho={{*1,y}*$rhomax/{*1,h}} x={{-2,w}/2+$rho*cos($theta)} @@ -21765,7 +26685,7 @@ line. $x0,{$y0+1},$x1,$y1,1,0xF0F0F0F0,0 w. rm. - elif {{*,SPACE}" || "{*1,SPACE}} + elif {*,SPACE}" || "{*1,SPACE} rm. +b. 1.5 hough. 512,400 b. 0.5 +. 1 log. n. 0,255 w1. -1,-1,0,"Hough Transform" @@ -21773,17 +26693,16 @@ elif {*1,r} w1. fi - while {{*}" && "{*1}" && "!{*,ESC}" && "!{*,Q}" && "!{*1,ESC}" && "!{*1,Q}} + while {*}" && "{*1}" && "!{*,ESC}" && "!{*,Q}" && "!{*1,ESC}" && "!{*1,Q} w 0 w1 0 rm. endl - if {!{*}" || "!{*1}} break fi - done rm v + + if !{*}" || "!{*1} break fi + done rm #@cli x_jawbreaker : 0<_width<20,0<_height<20,0<_balls<=8 #@cli : Launch the Jawbreaker game. -x_jawbreaker : check "${1=12}>0 && $1<20 && ${2=13}>0 && $2<20 && ${3=5}>0 && $3<=8" - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_jawbreaker : check "${1=12}>0 && $1<20 && ${2=13}>0 && $2<20 && ${3=5}>0 && $3<=8" check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Jawbreaker"$n" --------------------------------------------\n ----\n @@ -21799,18 +26718,17 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n --------------------------------------------------------------" - v - # Init images and variables. - i[board] $1,$2 rand[board] 1,$3 round[board] 1 - i[undo] . - i[balls] 40,40,1,4 _x_jawbreaker_ball. + $1,$2 nm. board rand[board] 1,$3 round[board] 1 + . nm. undo + 40,40,1,4 nm. balls _x_jawbreaker_ball. autocrop. 0 expand_xy. 1,0 *. 1.5 c. 0,255 r. {{board,w}*w},{{board,h}*h},1,1,0,2 /. 255 - i[back] {w},{h},1,3 l. + {w},{h},1,3 nm. back l. rand 0,255 blur_xy 6,20 equalize 100,0,255 blur_xy 2,4 sh 0 sh.. 1 sh... 2 /... 4 /.. 8 /. 2 rm[-3--1] endl - i[visu] [back] + [back] nm. visu score=0 undoscore=0 render_board=1 @@ -21826,7 +26744,7 @@ r[-3--1] [balls] [balls] *[-2,-1] a[-3--1] c hsv2rgb. +compose_channels. + >. 0 dilate. 3 j[visu] [back] j[visu] ..,0,0,0,0,1,. rm[-2,-1] - if {!$shapescorey} w[visu] {back,w},{back,h},0,"[G"{`39`}"MIC] Jawbreaker (Score : "$score")" fi + if !$shapescorey w[visu] {back,w},{back,h},0,"[G"{`39`}"MIC] Jawbreaker (Score : "$score")" fi render_board=0 fi @@ -21839,17 +26757,17 @@ # Check for the end of the game. +f[board] "if(i,j(-1)==i || j(1)==i || j(0,1)==i || j(0,-1)==i,0)" - if {!is} rm. break fi rm. + if !is rm. break fi rm. # Manage user-events - if {*,r} render_board=1 # Will resize window to initial size, if resized. - elif {*,S} o[visu] gmic_jawbreaker.png # Save snapshot if requested. - elif {{*,BACKSPACE}" || "{*,SPACE}} # Manage undo move. + if {*,r} render_board=1 # Will resize window to initial size, if resized. + elif {*,S} o[visu] gmic_jawbreaker.png # Save snapshot if requested. + elif {*,BACKSPACE}" || "{*,SPACE} # Manage undo move. abs[undo] j[board] [undo] score=$undoscore render_board=1 - elif {{*,x}">=0 && "{*,b}} # Manage button click. + elif {*,x}>=0" && "{*,b} # Manage button click. # Retrieve board coordinates. wait -1 @@ -21866,7 +26784,7 @@ elif {board,i($x,$y)} +flood[board] $x,$y,0,0,0,1,-1 ==. -1 - if {is>1} # If selected ball is connected to at least one ball. + if is>1 # If selected ball is connected to at least one ball. # Save undo state. j[undo] [board] @@ -21874,7 +26792,7 @@ # Manage board shifts (vertical and horizontal). flood[board] $x,$y,0,0,0,1,0 - repeat {board,w} + repeat w#$board +columns[board] $> mirror. y h={board,h} l. s -,0 a y if $! r 1,$h,1,1,0 mirror y else i 1,$h fi endl j[board] .,$> rm. @@ -21893,12 +26811,12 @@ render_board=1 fi - while {{*}" && "!{*,Q}" && "!{*,ESC}} + while {*}" && "!{*,Q}" && "!{*,ESC} # Game over. - if {{*}" && "!{*,ESC}} + if {*}" && "!{*,ESC} w[] {visu,w},{visu,h},0,"[G"{`39`}"MIC] Jawbreaker (Final Score : "$score")" - i[gameover] 260,85 t. "Game Over!",3,0,53,1,1 t. "Score : "$score,23,53,32,1,1 + 260,85 nm. gameover t. "Game Over!",3,0,53,1,1 t. "Score : "$score,23,53,32,1,1 +dilate. 5 nm. "mgameover" *.. 255 r.. 100%,100%,1,3 repeat 25 +r[gameover,mgameover] {400-12*($>+1)}%,{400-12*($>+1)}% @@ -21907,13 +26825,13 @@ done do wait if {*,r} w[] {*,w},{*,h} wait -1 fi - while {{*}" && "!{*,Q}" && "!{*,ESC}" && "!{*,b}} + while {*}" && "!{*,Q}" && "!{*,ESC}" && "!{*,b} rm[gameover,mgameover] fi # End properly. rm[board,undo,balls,back,visu] - w 0 v + + w 0 _x_jawbreaker_ball : mwh={min(w,h)} @@ -21926,9 +26844,8 @@ #@cli x_landscape #@cli : Launch the virtual landscape demo. -x_landscape : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_landscape : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Virtual landscape"$n" -------------------------------------\n ----\n @@ -21939,14 +26856,15 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n --------------------------------------------------------------" - v - l[] + l[] W=150 H=350 # Generate global map + colors. 900,900 plasma. 1,1,6 b. 0.07% n. 0,255 nm. map +g. *. 0.5 +[-2,-1] n. 0,1 ^. 2 n. -150,330 equalize[map] 256 n[map] -400,160 c[map] 0,100% # Add water. - (0,102,51;149,175,124;102,42,0;255,255,255) permute. yzcx srgb2rgb. r. 256,1,1,3,3 rgb2srgb. +n[map] 0,255 map. .. rm.. + (0,102,51;149,175,124;102,42,0;255,255,255) permute. yzcx srgb2rgb. r. 256,1,1,3,3 rgb2srgb. + +n[map] 0,255 map. .. rm.. +. .. rm.. c. 0,255 nm. colors # Colors. # Pre-compute some images used on each frame. @@ -21992,8 +26910,8 @@ r[lcolors,y0,y1] {$W*$H},1,1,100%,-1 # Keep only visible primitives. - +>[y0] 0 *. [offsets] discard. 0 - if {h} # There is something to display (ground). + +>[y0] 0 *. [offsets] discard. 0 y. + if h # There is something to display (ground). -. 1 +warp[x] .,0,0,0 nm. lx warp[lcolors,y0,y1] ..,0,0,0 rm.. @@ -22010,18 +26928,17 @@ fi r. {*,w},{*,h},1,3 - fps=${-fps} if {$fps>0} to. $fps" fps",5,5,24,2,0.2 fi + fps=${-fps} if $fps>0 to. $fps" fps",5,5,24,2,0.2 fi w. -1,-1,0 rm. - if {{*,CTRLLEFT}&&{*,D}} w[] 900,600 elif {{*,CTRLLEFT}&&{*,C}} w[] 600,400 fi + if {*,CTRLLEFT}" && "{*,D} w[] 900,600 elif {*,CTRLLEFT}" && "{*,C} w[] 600,400 fi wait 20 - while {{*}" && "!{*,ESC}" && "!{*,Q}} - rm w 0 endl v + + while {*}" && "!{*,ESC}" && "!{*,Q} + rm w 0 endl #@cli x_life #@cli : Launch the game of life. -x_life : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_life : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"The game of life"$n" --------------------------------------\n ----\n @@ -22037,7 +26954,7 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n --------------------------------------------------------------" - v - + i[0] 90,90,1,1,0 # Image[0] = game state. i[1] [0] f[1] 0 # Image[1] = generation counter. i[2] 400,400,1,3 # Image[2] = visualization. @@ -22054,7 +26971,7 @@ (1,1,1;1,0,1;1,1,1) +correlate[0] .,0 rm.. # Count numbers of neighboring living cells. +ir. 2,2 &. [0] ir.. 3,3 -|[-2,-1] # Make the game evolve (kill or create cells). rv[0,-1] # Update game state. - if {{*,x}>0" && "{*,b}==1" && "$stock>0} # Add random cells to the game if user presses mouse button. + if {*,x}>0" && "{*,b}==1" && "$stock>0 # Add random cells to the game if mouse button pressed. nb={u*7} repeat $nb x={{*,x}/{*,w}*{0,w}+u(-4,4)} @@ -22071,11 +26988,11 @@ +[1] [0] # Increment generation counter for still existing cells. min. 0 +. 1 *[1,-1] # Reset generation counter for died cells. - if {{*,b}==2} # Reset game if right mouse button has been pressed. + if {*,b}==2 # Reset game if right mouse button has been pressed. f[0-2] 0 iteration=0 score=0 bestscore=0 stock=500 rm[3] i[3] 1 fi - if {{3,w}==1} # Create color palette if necessary. + if {3,w}==1 # Create color palette if necessary. rm[3] i[3] {u(3,12)},1,1,3,u(100,255) r[3] {u(100,300)}%,1,1,3,4 point[3] 0,0,0,1,0 @@ -22084,7 +27001,7 @@ +r[1] {2,w},{2,h} &. 7 b. {1+$score*0.05} # Render colored image of the game and display it. n. 0,{3,w} map. [3] *. 0.1 +[2,-1] /[2] 1.1 - [2] if {{*,x}>0} # Add a small target icon at the mouse position. + [2] if {*,x}>0 # Add a small target icon at the mouse position. opac={0.7*min(1,$stock/500)} r={min(500,$stock)*cos($iteration)/100} ellipse. {*,x},{*,y},{15+$r},{15+$r},0,$opac,0,196,0 ellipse. {*,x},{*,y},{10+$r},{10+$r},0,$opac,32,64,16 @@ -22097,19 +27014,20 @@ if {*,S} o. gmic_life.png fi # Save snapshot if requested. rm. - if {!($iteration%10)} score={0,is} bestscore={max($score,$bestscore)} fi # Re-compute current and best scores, every 10th iterations. + if !($iteration%10) # Re-compute current and best scores, every 10th iterations + score={0,is} bestscore={max($score,$bestscore)} + fi wait 60 iteration+=1 - while {{*}" && "!{*,ESC}" && "!{*,Q}} + while {*}" && "!{*,ESC}" && "!{*,Q} # End game and quit properly. - rm[0-3] w 0 v + + rm[0-3] w 0 #@cli x_light #@cli : Launch the light effect demo. -x_light : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_light : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Light effect"$n" ------------------------\n ----\n @@ -22120,7 +27038,6 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n -------------------------------------------" - v - # Create warping and color images. 0 t. " G\47MIC\nLight effect",0,0,80,1,255 expand_xy. 15,0 b. 3 @@ -22142,7 +27059,7 @@ do # Manage light position and intensity. - if {{*,x}>=0} + if {*,x}>=0 X={round((w-{*,x})/2)} Y={round((h-{*,y})/2)} else @@ -22150,26 +27067,24 @@ Y={round((h-{-2,h}*(1+sin(2.5*$t)))/2)} t+=0.02 fi - if {{*,b}&1} light={min(200,$light+10)} gaussian. $light n. 0,255 fi - if {{*,b}&2} light={max(10,$light-10)} gaussian. $light n. 0,255 fi + if {*,b}&1 light={min(200,$light+10)} gaussian. $light n. 0,255 fi + if {*,b}&2 light={max(10,$light-10)} gaussian. $light n. 0,255 fi # Render lightened image. +z. $X,$Y,{$X+{-2,w}-1},{$Y+{-2,h}-1} warp. ...,1,0,1 r. 100%,100%,1,3 +. [-4] c. 0,255 - fps=${-fps} if {$fps>0} to. $fps" fps",5,5,16,1,0.2 fi + fps=${-fps} if $fps>0 to. $fps" fps",5,5,16,1,0.2 fi w. - if {{*,CTRLLEFT}&&{*,D}} w[] {3*w},{3*h} - elif {{*,CTRLLEFT}&&{*,C}} w[] {1.5*w},{1.5*h} fi - rm. if {{*,x}>=0" && "!{*,b}} wait else wait 20 fi - while {{*}" && "!{*,ESC}" && "!{*,Q}} - w[] 0 rm[-3--1] v + + if {*,CTRLLEFT}" && "{*,D} w[] {3*w},{3*h} elif {*,CTRLLEFT}" && "{*,C} w[] {1.5*w},{1.5*h} fi + rm. if {*,x}>=0" && "!{*,b} wait else wait 20 fi + while {*}" && "!{*,ESC}" && "!{*,Q} + w[] 0 rm[-3--1] #@cli x_mandelbrot : _julia={ 0 | 1 },_c0r,_c0i #@cli : Launch Mandelbrot/Julia explorer. -x_mandelbrot : skip ${1=0},${2=0.317},${3=0.03} - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_mandelbrot : skip ${1=0},${2=0.317},${3=0.03} check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Mandelbrot/Julia explorer"$n" -----------------\n ----\n @@ -22181,21 +27096,19 @@ --------------------------------------------------" # Init variables and display. - v - rm w 512,512,0 _x_mandelbrot_coords $1 _x_mandelbrot_palette # Start event loop. do - siz={min({*,w},{*,h})} # Desired window dimension. - $siz,$siz mandelbrot. {0,^},256,$1,{if($1,$2,0)},{if($1,$3,0)} map. [1] # Render fractal. - if $1 w. $siz,$siz,0,"[G"{`39`}"MIC] Julia Set c=("{0,@0-1}")-("{0,@2-3}"), c0=($2,$3)" # Display on window. + siz={min({*,w},{*,h})} # Desired window dimension. + $siz,$siz mandelbrot. {0,^},256,$1,{if($1,$2,0)},{if($1,$3,0)} map. [1] # Render fractal. + if $1 w. $siz,$siz,0,"[G"{`39`}"MIC] Julia Set c=("{0,@0-1}")-("{0,@2-3}"), c0=($2,$3)" # Display on window. else w. $siz,$siz,0,"[G"{`39`}"MIC] Mandelbrot Set c=("{0,@0-1}")-("{0,@2-3}")" fi - w={w} h={h} round. select. 2 # Get the user selection. - - if {i[0]>0} # If valid selection found. - M={max(i[3]-i[0],i[4]-i[1])} # Compute max dimension of selected rectangle. - if {$M<5} _x_mandelbrot_coords $1 rm[1] _x_mandelbrot_palette mv. 1 # If selection too small, reset the view, - else ({{0,@0}+{@0}*({0,@2}-{0,@0})/$w};\ # Else compute new fractal coordinates. + w={w} h={h} round. select. 2,0,0,0,1 # Get the user selection. + if i[0]>0 # If valid selection found. + M={max(i[3]-i[0],i[4]-i[1])} # Compute max dimension of selected rectangle. + if $M<5 _x_mandelbrot_coords $1 rm[1] _x_mandelbrot_palette mv. 1 # If selection too small, reset the view, + else ({{0,@0}+{@0}*({0,@2}-{0,@0})/$w};\ # Else compute new fractal coordinates. {{0,@1}+{@1}*({0,@3}-{0,@1})/$h};\ {{0,@0}+({@0}+$M)*({0,@2}-{0,@0})/$w};\ {{0,@1}+({@1}+$M)*({0,@3}-{0,@1})/$h}) @@ -22203,14 +27116,14 @@ rm[0] mv. 0 # Validate new coordinates. fi rm. # Delete latest rendering. - if {{*,C}} # If 'C' key has been pressed. - if $1 v + e[0--4] "Julia set, at c = ("{0,@0-1}")-("{0,@2-3}"), with c0 = ($2,$3)." v - - else v + e[0--4] "Mandelbrot set, at c = ("{0,@0-1}")-("{0,@2-3}")." v - + if {*,C} # If 'C' key has been pressed. + if $1 e[] "Julia set, at c = ("{0,@0-1}")-("{0,@2-3}"), with c0 = ($2,$3)." + else e[] "Mandelbrot set, at c = ("{0,@0-1}")-("{0,@2-3}")." fi fi - if {!{*}" || "{*,ESC}" || "{*,Q}} rm w 0 v + return fi + if !{*}" || "{*,ESC}" || "{*,Q} break fi wait -1 - while 1 + while 1 rm w 0 _x_mandelbrot_coords : if $1 (-2;-2;2;2) else (-2.1;-1.5;1.2;1.5) fi @@ -22218,15 +27131,18 @@ _x_mandelbrot_palette : 6,1,1,3 rand. 20,255 r. 32,1,1,3,3 r. 1024,1,1,3,0,2 =. 0,0,0,0,0 =. 0,0,0,0,1 =. 0,0,0,0,2 -#@cli x_mask_color : _colorspace={ all | rgb | lrgb | ycbcr | lab | lch | hsv | hsi | hsl | cmy | cmyk | yiq },_spatial_tolerance>=0,_color_tolerance>=0 +#@cli x_mask_color : _colorspace={ all | rgb | lrgb | ycbcr | lab | lch | hsv | hsi | hsl | cmy | cmyk | yiq },\ +# _spatial_tolerance>=0,_color_tolerance>=0 #@cli : Interactively select a color, and add an alpha channel containing the corresponding color mask. -#@cli : Argument 'colorspace' refers to the color metric used to compute color similarities, and can be basically one of { rgb | lrgb | ycbcr | lab | lch | hsv | hsi | hsl | cmy | cmyk | yiq }. -#@cli : You can also select one one particular channel of this colorspace, by setting 'colorspace' as 'colorspace_channel' (e.g. 'hsv_h' for the hue). +#@cli : Argument 'colorspace' refers to the color metric used to compute color similarities, and can be basically +#@cli : one of { rgb | lrgb | ycbcr | lab | lch | hsv | hsi | hsl | cmy | cmyk | yiq }. +#@cli : You can also select one one particular channel of this colorspace, by setting 'colorspace' as +#@cli : 'colorspace_channel' (e.g. 'hsv_h' for the hue). #@cli : Default values: 'colorspace=all', 'spatial_tolerance=5' and 'color_tolerance=5'. -x_mask_color : check "${2=5}>=0 && ${3=5}>=0" skip ${1=all} - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + - e[^-1] "Interactively create color mask for image$?, with color space $1, spatial tolerance $2 and color tolerance $3." +x_mask_color : check "${2=5}>=0 && ${3=5}>=0" skip ${1=all} check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r + e[^-1] "Interactively create color mask for image$?, with color space $1, spatial tolerance $2 and + color tolerance $3." e[] "\n ----------------------------------------------------------------------------------------------------\n ----\n @@ -22240,10 +27156,10 @@ ---- Keys '"${c}"ESC"$n"', '"${c}"Q"$n"' or '"${c}"ENTER"$n"' exit the interactive window.\n ----\n ----------------------------------------------------------------------------------------------------" - v - l[] _ac_$1 onfail error[0--3] "Command '$0' : Invalid colorspace '$*'." endl + l[] _ac_$1 onfail error[0--3] "Command '$0' : Invalid colorspace '$*'." endl m _ac_forward:$_f repeat $! l[$>] slices 0 basename {0,n} nm=${} - wh=${fitscreen\ {[w,h]},1,128,1024} + wh=${fitscreen\ {[w,h,1]},128,1024} +r $wh,1,100%,2 +_ac_forward. channels. $_s if {1,s>3} channels[1] 0,2 fi to_rgb[1] @@ -22262,65 +27178,77 @@ c=$x,$y,{2,I($x,$y)} is_add={arg(1,$colors_add)>=0} is_sub={arg(1,$colors_sub)>=0} - is_ctrl={{*,CTRLLEFT}||{*,CTRLRIGHT}} + is_ctrl={{*,CTRLLEFT}" || "{*,CTRLRIGHT}} is_resized=0 refresh=0 - if {$x>=0" && "$b&1} # Add a color + if $x>=0" && "$b&1 # Add a color if $is_add colors_add=$colors_add,$c else colors_add=$c fi is_clicked=1 refresh={$|-$time>$delay} - elif {$x>=0" && "$b&2} # Subtract a color + elif $x>=0" && "$b&2 # Subtract a color if $is_sub colors_sub=$colors_sub,$c else colors_sub=$c fi is_clicked=1 refresh={$|-$time>$delay} - elif {$b&4" || "{*,R}} # Reset colors + elif $b&4" || "{*,R} # Reset colors colors_add=-1 colors_sub=-1 refresh=1 is_clicked=1 - elif {!$b} + elif !$b refresh={$is_clicked==1} is_clicked=0 fi - if {{*,-TAB}||{*,-SPACE}} visumode={($visumode+1)%3} refresh=1 fi # Change visu mode + if {*,-TAB}" || "{*,-SPACE} visumode={($visumode+1)%3} refresh=1 fi # Change visu mode if {*,r} is_resized=1 - elif {$is_ctrl" && "{*,-D}} w[] {1,1.25*[w,h]} is_resized=1 - elif {$is_ctrl" && "{*,-C}} w[] {1,0.8*[w,h]} is_resized=1 - elif {$is_ctrl" && "{*,R}} w[] ${fitscreen\ {0,[w,h]},1,128,1024} is_resized=1 + elif $is_ctrl" && "{*,-D} w[] {1,1.25*[w,h]} is_resized=1 + elif $is_ctrl" && "{*,-C} w[] {1,0.8*[w,h]} is_resized=1 + elif $is_ctrl" && "{*,R} w[] ${fitscreen\ {0,[w,h,1]},128,1024} is_resized=1 fi if $is_resized rm[1,2] +r {*,d},{*,e},1,3,2 +_ac_forward. channels. $_s refresh=1 fi # Refresh view. if $refresh _x_mask_color[2] {$2*w#2/w#0},$3,{``$colors_add},{``$colors_sub} delay=${} - if {$visumode==0} +. 64 c. 0,255 +a[1,-1] c drgba. w. -1,-1,$nm" [half-masked]" rm. - elif {$visumode==1} +a[1,-1] c drgba. w. -1,-1,$nm" [masked]" rm. + if $visumode==0 +. 64 c. 0,255 +a[1,-1] c drgba. w. -1,-1,$nm" [half-masked]" rm. + elif $visumode==1 +a[1,-1] c drgba. w. -1,-1,$nm" [masked]" rm. else w. -1,-1,$nm" [mask]" fi rm. time=$| fi - while {{*}" && "!{*,ESC}" && "!{*,Q}" && "!{*,ENTER}} + while {*}" && "!{*,ESC}" && "!{*,Q}" && "!{*,ENTER} # Rescale to original image dimensions. - if {arg(1,$colors_add)>=0} ($colors_add) r. {2+s#2},{w/(2+s#2)},1,1,-1 +z. 0,1 *. '{(w#0-1)/(w#2-1)},{(h#0-1)/(h#2-1)}' j.. . colors_add={-2,^} rm[-2,-1] fi - if {arg(1,$colors_sub)>=0} ($colors_sub) r. {2+s#2},{w/(2+s#2)},1,1,-1 +z. 0,1 *. '{(w#0-1)/(w#2-1)},{(h#0-1)/(h#2-1)}' j.. . colors_sub={-2,^} rm[-2,-1] fi + if arg(1,$colors_add)>=0 ($colors_add) + r. {2+s#2},{w/(2+s#2)},1,1,-1 +z. 0,1 *. '{(w#0-1)/(w#2-1)},{(h#0-1)/(h#2-1)}' + j.. . colors_add={-2,^} rm[-2,-1] + fi + if arg(1,$colors_sub)>=0 ($colors_sub) + r. {2+s#2},{w/(2+s#2)},1,1,-1 +z. 0,1 *. '{(w#0-1)/(w#2-1)},{(h#0-1)/(h#2-1)}' + j.. . colors_sub={-2,^} rm[-2,-1] + fi rm[-2,-1] +_ac_forward channels. $_s _x_mask_color. $2,$3,{``$colors_add},{``$colors_sub} rm.. a c endl done - uncommand _ac_forward - v + + um _ac_forward _x_mask_color : # Estimate color mask image. 100%,100% is_add={arg(1,$3)>=0} is_sub={arg(1,$4)>=0} t0=$| - if {$is_add" || "$is_sub} - if $is_add ($3) r. {2+s#0},{w/(2+s#0)},1,1,-1 N_add={h} M_add={"M = vectorw(); for (k = 0, k0} to. $fps" fps",5,{h-22},16,2,0.2 fi + fps=${-fps} if $fps>0 to. $fps" fps",5,{h-22},16,2,0.2 fi w. - if {{*,CTRLLEFT}&&{*,D}} w[] {2*w},{2*h} elif {{*,CTRLLEFT}&&{*,C}} w[] {w},{h} fi + if {*,CTRLLEFT}" && "{*,D} w[] {2*w},{2*h} elif {*,CTRLLEFT}" && "{*,C} w[] {w},{h} fi rm[-3--1] wait 20 - if {{*,b}||{*,SPACE}} mode={($mode+if({*,b}&2,-1,1))%6} wait -1 rm[1] i[1] 0 fi - while {{*}" && "!{*,ESC}" && "!{*,Q}} - rm w 0 endl v + + if {*,b}" || "{*,SPACE} mode={($mode+if({*,b}&2,-1,1))%6} wait -1 rm[1] i[1] 0 fi + while {*}" && "!{*,ESC}" && "!{*,Q} + rm w 0 endl #@cli x_minesweeper : 8<=_width=<20,8<=_height<=20 #@cli : Launch the Minesweeper game. -x_minesweeper : check "${1=20}>=8 && $1<=30 && ${2=$1}>=8 && $2<=30" - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_minesweeper : check "${1=20}>=8 && $1<=30 && ${2=$1}>=8 && $2<=30" check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Minesweeper"$n" -------------------------------------------\n ----\n @@ -22422,11 +27348,11 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n --------------------------------------------------------------\n" - v - + # Generate random mine field and player board. # Labels : 0=mine, 1=empty, 2='1-near', 3='2-near', ..., 9='8-near', 10=still unknown. $1,$2 noise. 30,2 ==. 1 nb_mines={is} (1,1,1;1,0,1;1,1,1) +convolve.. .,0 rm.. +. 1 ==.. 0 *[-2,-1] nm. field - do x={round(u(w-1))} y={round(u(h-1))} while {i($x,$y)!=1} # Find a good starting point. + do x={round(u(w-1))} y={round(u(h-1))} while i($x,$y)!=1 # Find a good starting point. +f[field] 11 =. 12,$x,$y nm. board # Generate sprite graphics. @@ -22464,48 +27390,49 @@ 0 t. "Game\nOver!",3,3,38,1,255 r. 100%,100%,1,4 sh. 3 dilate. 5 /. 2 rm. drop_shadow. 5,5,1 blend[canvas,-1] alpha 0 t. "Boom! You failed!",0,0,18,1,100,255,255 r. {canvas,w},100%,1,3,0,0,0.5,0.5 negate. j[canvas] .,0,3 rm. - do w[canvas] {w},{h} wait while {{*}" && "!{*,ESC}" && "!{*,Q}} + do w[canvas] {w},{h} wait while {*}" && "!{*,ESC}" && "!{*,Q} elif $succeeded 0 t. "Success!",3,3,38,1,255 r. 100%,100%,1,4 sh. 3 dilate. 5 /. 2 rm. drop_shadow. 5,5,1 blend[canvas,-1] alpha 0 t. "Congratulations! ("{round($|-$tic)}" s)",0,0,18,1,255,100,255 r. {canvas,w},100%,1,3,0,0,0.5,0.5 negate. j[canvas] .,0,3 rm. - do w[canvas] {w},{h} wait while {{*}" && "!{*,ESC}" && "!{*,Q}} + do w[canvas] {w},{h} wait while {*}" && "!{*,ESC}" && "!{*,Q} else +==[board] 10 nb_flags={is} rm. do - if {!$started} tic=$| fi - 0 t. "Elapsed time : "{round($|-$tic)}" s / Flags : "$nb_flags,0,0,18,1,255,200,0 r. {canvas,w},100%,1,3,0,0,0.5,0.5 + if !$started tic=$| fi + 0 t. "Elapsed time : "{round($|-$tic)}" s / Flags : "$nb_flags,0,0,18,1,255,200,0 + r. {canvas,w},100%,1,3,0,0,0.5,0.5 negate. j[canvas] .,0,3 rm. wait 50 x={int(({*,x}-24)/24)} y={int(({*,y}-24)/24)} b={*,b} w[canvas] {w},{h},0,"[G"{`39`}"MIC] Minesweeper" - while {{*}" && "!{*,ESC}" && "!{*,Q}" && "!$b} + while {*}" && "!{*,ESC}" && "!{*,Q}" && "!$b fi # Manage selected square. - if {$x>=0\ &&\ $y>=0\ &&\ $x<{board,w}\ &&\ $y<{board,h}} - if {$b&1} # Try to clean square. + if $x>=0\ &&\ $y>=0\ &&\ $x<{board,w}\ &&\ $y<{board,h} + if $b&1 # Try to clean square. started=1 val={field,i($x,$y)} - if {$val==0} +==[field] 0 j[board] [field],0,0,0,0,1,. rm. failed=1 # Found a mine -> boom! - elif {$val==1} +flood[field] $x,$y,0,0,1,1,-1 ==. -1 dilate. 3 j[board] [field],0,0,0,0,1,. rm. # Found an empty area. - else =[board] $val,$x,$y # Close to one or several mines. + if $val==0 +==[field] 0 j[board] [field],0,0,0,0,1,. rm. failed=1 # Found a mine -> boom! + elif $val==1 # Found an empty area + +flood[field] $x,$y,0,0,1,1,-1 ==. -1 dilate. 3 j[board] [field],0,0,0,0,1,. rm. + else =[board] $val,$x,$y # Close to one or several mines fi - elif {n={board,i($x,$y)};$b&2" && "n>=10" && "n<=11} + elif n={board,i($x,$y)};$b&2" && "n>=10" && "n<=11 =[board] {if({board,i($x,$y)}==11,10,11)},$x,$y # Flag or unflag a square. - elif {$b&4} f[board] 10 # Reset minefield. + elif $b&4 f[board] 10 # Reset minefield. fi fi - if {$nb_mines==$nb_flags\ &&\ {board,iM}!=11} succeeded=1 fi # Check if board is cleared. - while {{*}" && "!{*,ESC}" && "!{*,Q}} - w 0 v + + if $nb_mines==$nb_flags\ &&\ {board,iM}!=11 succeeded=1 fi # Check if board is cleared. + while {*}" && "!{*,ESC}" && "!{*,Q} + w 0 #@cli x_minimal_path #@cli : Launch the minimal path demo. -x_minimal_path : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_minimal_path : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Minimal path"$n" ------------------------------------------\n ----\n @@ -22516,13 +27443,13 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n --------------------------------------------------------------" - v - - if {!$!} sp ? fi + + if !$! sp ? fi n 0,200 round 1 repeat $! l[$>] w[0] -1,-1,0,"[G"{`39`}"MIC] Select Starting Point P0" - if {!narg($first_time)} + if !narg($first_time) parallel 0,"+l[0] r2dy 128 frame 1,1,0 \ alert \"[G"{`39`}"MIC Minimal Path]\",\ \"The G\47MIC minimal path demo illustrates how minimal paths\n\ @@ -22539,12 +27466,12 @@ ellipse[0] {@0,1},3,3,0,1,255,0,255 ellipse[0] {@0,1},3,3,0,1,0xFFFFFFFF,255,255,255 rm. - if {min($P0)>=0} + if min($P0)>=0 p=1 do w[0] -1,-1,0,"[G"{`39`}"MIC] Select Ending Point P"$p +select[0] 0 - if {{*,S}} + if {*,S} rm. +to[0] "Saving snapshot...",5,5,13,1,1,255,255,255 w. rm. o[0] gmic_minimal_path.png @@ -22554,23 +27481,203 @@ ellipse[0] {@0,1},3,3,0,1,255,0,255 ellipse[0] {@0,1},3,3,0,1,0xFFFFFFFF,255,255,255 rm. - if {min($P1)>=0} + if min($P1)>=0 +to[0] "Processing...",5,5,13,1,1,255,255,255 w. rm. +minimal_path[1] $P0,$P1,1 pointcloud. 0 *. 255 r. 100%,100%,1,[0],0,0,0,0,0,0.5 r. [0],0 -|[0,-1] P0=$P1 p+=1 fi fi - while {{*}" && "!{*,ESC}" && "!{*,Q}} + while {*}" && "!{*,ESC}" && "!{*,Q} fi rm[1] w 0 - endl done v + + endl done + +#@cli x_morph : _nb_frames>=2,_preview_fidelity={ 0=coarsest | 1=coarse | 2=normal | 3=fine | 4=finest } +#@cli : Launch the interactive image morpher. +#@cli : Default values: 'nb_frames=16' and 'preview_fidelity=3'. +x_morph : check "isint(${1=16}) && isint(${2=3}) && $2>=0 && $2<=4" check_display + if $!<2 error[0--3] "Command '$0': Requires at least two input images!" return fi + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r b=$_gmic_b + e[] "\n +------ "${g}"Interactive image morpher"$n" ---------------------------\n +----\n +---- "${b}"Source/target window:"$n"\n +---- "${c}"Left mouse button"$n": Add new keypoint on current image\n +---- and move it on the other one.\n +---- "${c}"Right mouse button"$n": Add/move keypoint on current image.\n +---- Key '"${c}"DELETE"$n"' or "${c}"middle mouse button"$n": Delete keypoint.\n +---- Key '"${c}"SPACE"$n"' or "${c}"mouse wheel"$n": Toggle source/target.\n\n +---- "${b}"In-between window:"$n"\n +---- "${c}"Mouse wheel"$n": Change morphing time, from 0 to 1.\n +---- "${c}"Left mouse button"$n": Reset morphing time to 0.5.\n\n +---- "${b}"Both windows:"$n"\n +---- Key '"${c}"TAB"$n"': Change keypoint radius.\n +---- Key '"${c}"ENTER"$n"': Play/stop in-between animation.\n +---- Key '"${c}"R"$n"': Reset keypoints.\n +---- Key '"${c}"K"$n"': Show/hide keypoints.\n +---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"': Process fullres and exit.\n +----\n +-----------------------------------------------------------" + + offset=0 + radius_keypoints=3 + repeat $!-1 l[{[$>,$>+1]+$offset}] nm0={0,n} nm1={1,n} + to_colormode 0 + rr2d ${-max_wh},2 + nm img0,img1 + 256,1,1,1,"x>=4?x-2:1" map. 2 nm. colormap + + # Start interactive window. + selected_keypoint=-1 + view_keypoints=1 + time_inbetween=0.5 + animate_inbetween=0 + move_other=0 + frame=0 + + do + # Generate set of keypoints (x0,y0,x1,y1,index_color) + if !narg($keypoints) + if narg($__x_morph_keypoints) ($__x_morph_keypoints) r. 1,{w/5},1,5,-1 + else 1,4,1,5,"p = y%2; q = int(y/2); [ [ p,q,p,q ]*100,y ]" + fi + N0={h} nm. keypoints + rmn warp0,warp1 + fi + + # Generate base images. + if !narg($imgb0)" || "!narg($imgb1) + if {*} wdims=${"fitscreen "{*,d},{img0,{*,d}*h/w}} + else wdims=${"fitscreen "{img0,[w,h,1]},128,50%} + fi + w[] $wdims,0,"[G'MIC] Interactive Morph" + repeat 2 +to_color[img$>] r. $wdims,1,100%,2 n. 0,255 nm. imgb$> done + rmn imgr,warp0,warp1 + fi + + # Generate warp fields. + if (!narg($warp0)" || "!narg($warp1)) + subsamp={arg(1+$2,8,6,4,2,1)} + +_x_warp_rbf[keypoints] {imgb0,round([w,h]/$subsamp)} + +l[keypoints] s c,-2 rv[0,1] a c endl +_x_warp_rbf. {imgb0,round([w,h]/$subsamp)} rm.. + *[-2,-1] $subsamp + r[-2,-1] {imgb0,[w,h]},1,100%,3 + nm[-2,-1] warp0,warp1 + rmn imgm + fi + + # Render visualization. + if !narg($imgr) + [imgb$frame] nm. imgr + if s==4 drgba. fi + if $view_keypoints + eval[keypoints] "* + begin( + fact = ([ w#"$imgb0",h#"$imgb0" ] - 1)/100; + const radius1 = "$radius_keypoints"; + const radius2 = radius1 + 2; + const opacity = min(1,3/"($radius_keypoints-1)"); + ); + X = round((I)[2*"$frame",2]*fact); + y=="$selected_keypoint"?(ellipse(#-1,X,radius2+2,radius2+2,0,1,255)); + ellipse(#-1,X,radius2,radius2,0,opacity,0); + ellipse(#-1,X,radius1,radius1,0,opacity,I[#"$colormap",i4]); I" + fi + w. -1,-1,0,"[G'MIC] Interactive Morph ("${"s0=Source s1=Target u ${s"$frame"}"}")" + fi + + # Generate morph image + if !narg($imgm) + t,onemt={t=$animate_inbetween?0.5*(1+sin(2*($time_inbetween+$|-$animate_inbetween))):$time_inbetween;[t,1-t]} + +*[warp1] $t *. -1 +warp[imgb0] .,1,2,3 rm.. *. $onemt + +*[warp0] $onemt *. -1 +warp[imgb1] .,1,2,3 rm.. *. $t + +[-2,-1] c. 0,255 nm. imgm + w1. -1,-1,0,"[G'MIC] Interactive Morph (In-between)" + fi + + # Manage user interaction + if $animate_inbetween wait 40 else wait fi + mb={*,b} mxy={[{*,x,y}]*100/([{*,w,h}]-1)} mouse_over={{*,x}>=0} + + if $mouse_over" && "($mb" || "{*,DELETE})" && "$selected_keypoint<0" && "h#$keypoints>0 + + # Determine selected keypoint. + selected_keypoint={keypoints,"dmin = inf; kmin = -1; fact = ([w#"$imgr",h#"$imgr"]-1)%; + for (k = 0, k=0 && dmin<"max(8,1.5*$radius_keypoints)"?kmin:-1"} + fi + + if {*,-o}" || "{*,-SPACE}" || "{*1,-SPACE} frame={!$frame} rmn imgr fi # Swap frames + if {*,-K}" || "{*1,-K} view_keypoints={!$view_keypoints} rmn imgr fi # Show/hide keypoints + if {*,-R}" || "{*1,-R} rmn keypoints,imgr __x_morph_keypoints= fi # Reset keypoints + if {*,-TAB}" || "{*1,-TAB} # Change keypoint radius + radius_keypoints={max(2,($radius_keypoints+2)%8)} view_keypoints=1 rmn imgr + fi + if {*,-ENTER}" || "{*1,-ENTER} animate_inbetween={$animate_inbetween?0:$|} fi # Start in-between animation + if {*,r} rmn imgb0,imgb1 fi # Window resize + if {*1,r} rmn imgm fi + if {*1,o} # Change time of in-between + time_inbetween={max(0,min(1,$time_inbetween+0.05*{*1,-o}))} animate_inbetween=0 rmn imgm + fi + if {*1,-b} time_inbetween=0.5 animate_inbetween=0 rmn imgm fi # Reset in-between time + + if $mouse_over" && "($mb==1" || "$mb==2)" && "$selected_keypoint<0 # Add keypoint + if $mb==1" && "!$move_other frame={!$frame} move_other=1 fi # Move on other window + ({keypoints,[$mxy,$mxy,h]}) + permute. zycx a[keypoints,-1] y + selected_keypoint={keypoints,h-1} + rmn imgr + + elif $mouse_over" && "($mb==1" || "$mb==2)" && "$selected_keypoint>=0 # Move keypoint + if $mb==1" && "!$move_other frame={!$frame} move_other=1 fi # Move on other window + ({[$mxy]}) permute. zycx j[keypoints] .,0,$selected_keypoint,0,{2*$frame} rm. + rmn imgr + + elif $mouse_over" && "$selected_keypoint>=0" && ("{*,-DELETE}" || "$mb==4") && "h#$keypoints>4 # Delete keypoint + 1,1,1,5,-1 j[keypoints] .,0,$selected_keypoint rm. discard[keypoints] -1 r[keypoints] 1,{keypoints,h/5},1,5,-1 + N0-={$selected_keypoint<$N0?1:0} selected_keypoint=-1 + rmn warp0,warp1,imgr + + elif !{*,b}" && "$selected_keypoint>=0 + if $move_other frame={!$frame} move_other=0 fi + selected_keypoint=-1 + rmn warp0,warp1,imgr + fi + + if $animate_inbetween rmn imgm fi + while {*}" && "!{*,ESC}" && "!{*,Q}" && "{*1}" && "!{*1,ESC}" && "!{*1,Q} + if !$< __x_morph_keypoints={keypoints,^} fi + + # Render fullres morphing. + rmn colormap,imgb0,imgb1,warp0,warp1,imgr,imgm + +_x_warp_rbf[keypoints] {img0,[w,h]} + +l[keypoints] s c,-2 rv[0,1] a c endl +_x_warp_rbf. {img0,[w,h]} rm.. + nm[-2,-1] warp0,warp1 + + repeat $1 + t,onemt={t=$>/max(1,$1-1);[t,1-t]} + +*[warp1] $t *. -1 +warp[img0] .,1,2,3 rm.. *. $onemt + +*[warp0] $onemt *. -1 +warp[img1] .,1,2,3 rm.. *. $t + +[-2,-1] c. 0,255 nm. ${nm0}_$> + if {*}" && "{*1} w1 0 fi + if {*}" || "{*1} + text="Processing frame \#"$>"/"{$1-1}"..." + if {*} +r. {*,d,e},1,100%,2 to. $text,5,5,20,2 w. rm. fi + if {*1} +r. {*1,d,e},1,100%,2 to. $text,5,5,20,2 w1. rm. fi + fi + done + nm. $nm1 k[-$1--1] + offset+={$!-2} + endl done w0 0 w1 0 #@cli x_pacman #@cli : Launch pacman game. -x_pacman : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_pacman : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Pacman"$n" -----------------------------------------------\n ----\n @@ -22591,7 +27698,7 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n --------------------------------------------------------------" - v - l[] + l[] # Initialize characters gfx. m "_pacman_ghost_base_gfx : 31,19 circle. 15,15,15,1,1 31,12,1,1,'y<4+8*abs(cos(x*0.3+0.25*pi*$""1))' a[-2,-1] y" @@ -22627,11 +27734,11 @@ do # Build new level if necessary. - if {$level<0} + if $level<0 _rlevel=33 _glevel=33 _blevel=255 _pacman_map_level{((-$level-1)%6)+1} mw={w} mh={h} mw2={int(w/2)} mh2={int(h/2)} - if {$level<-6} replace. 3,2 fi - nm. map0 i[map] . + if $level<-6 replace. 3,2 fi + . nm[-2,-1] map0,map # Precompute valid directions on each map point, and shortest path to the ghost's home. +shift[map] -1,0 +shift[map] 0,-1 +shift[map] 1,0 +shift[map] 0,1 a[-4--1] z !=. 1 nm. can_go @@ -22668,34 +27775,35 @@ [visu] repeat 4 mg=${mg$>} xg=${xg$>} yg={${yg$>}+24} - if {$mg==0} j. [ghost$>_$t],$xg,$yg,0,0,1,[ghostm_$t] - elif {$mg==1} t2={if($left>7,$t,if($left>3,int(12*$|)%4,int(24*$|)%4))} j. [ghosta_$t2],$xg,$yg,0,0,1,[ghostm_$t] - elif {$mg==2} j. [ghostd_$t],$xg,$yg,0,0,0.8,[ghostdm] + if $mg==0 j. [ghost$>_$t],$xg,$yg,0,0,1,[ghostm_$t] + elif $mg==1 t2={if($left>7,$t,if($left>3,int(12*$|)%4,int(24*$|)%4))} j. [ghosta_$t2],$xg,$yg,0,0,1,[ghostm_$t] + elif $mg==2 j. [ghostd_$t],$xg,$yg,0,0,0.8,[ghostdm] else j. [ghost$>_$t],$xg,$yg,0,0,{$mg-2},[ghostm_$t] j. [ghostd_$t],$xg,$yg,0,0,1,[ghostdm] fi done if $dying_pacman _pacman_pacman_gfx {$dying_pacman/2} rotate[-2,-1] {90*(abs($dp)-1)} j... ..,$xp,{24+$yp},0,0,1,.,255 rm[-2,-1] dying_pacman+=1 - if {$dying_pacman>64} - if {$lives!=1} rm. break fi - j. [game_over],{(w-{game_over,w})/2},{12+(h-{game_over,h})/2},0,0,{min(1,($dying_pacman-64)/50)},[game_overm],255 + if $dying_pacman>64 + if $lives!=1 rm. break fi + j. [game_over],{(w-{game_over,w})/2},{12+(h-{game_over,h})/2},0,0,{min(1,($dying_pacman-64)/50)},\ + [game_overm],255 rectangle. 90,7,101,18,1,0 fi else +rotate[pacman_$t,pacmanm_$t] {90*(abs($dp)-1)} j... ..,$xp,{24+$yp},0,0,1,.,255 rm[-2,-1] - if {$left>=0" && "($left>=5" || "$t<=2)} j. [time{round($left)}],{(w-{time0,w})/2-10},1 fi + if $left>=0" && "($left>=5" || "$t<=2) j. [time{round($left)}],{(w-{time0,w})/2-10},1 fi fi t. $score,{w-60},3,20,1,255 - if {$is_get_ready} + if $is_get_ready j. [level_N],{(w-{level_N,w})/2},{12+(h-1.5*{level_N,h})/2},0,0,1,[levelm_N] - if {int($|*4)%2} j. [get_ready],{(w-{get_ready,w})/2},{24+(h+{get_ready,h})/2},0,0,1,[get_readym],255 fi + if int($|*4)%2 j. [get_ready],{(w-{get_ready,w})/2},{24+(h+{get_ready,h})/2},0,0,1,[get_readym],255 fi fi - if {$oscore>0} j. [score$nscore],$xscore,$yscore,0,0,$oscore,[scorem$nscore],255 oscore-=0.04 yscore-=1 fi + if $oscore>0 j. [score$nscore],$xscore,$yscore,0,0,$oscore,[scorem$nscore],255 oscore-=0.04 yscore-=1 fi j. [gate],158,223,0,0,0.6 w. - if {{*,CTRLLEFT}&&{*,D}} w[] {2*w},{2*h} - elif {{*,CTRLLEFT}&&{*,C}} w[] {f=h<0.5*{*,v}?1.5:1;[w,h]*=f} + if {*,CTRLLEFT}" && "{*,D} w[] {2*w},{2*h} + elif {*,CTRLLEFT}" && "{*,C} w[] {f=h<0.5*{*,v}?1.5:1;[w,h]*=f} fi rm. @@ -22703,29 +27811,32 @@ repeat 4 xg=${xg$>} yg=${yg$>} dg=${dg$>} mg=${mg$>} - if {max(abs($xg-$xp),abs($yg-$yp))<=8} # Test collision between ghost and pacman. - if {$mg==0" && "!$dying_pacman} dying_pacman=1 # Was in normal mode -> dying pacman. + if max(abs($xg-$xp),abs($yg-$yp))<=8 # Test collision between ghost and pacman. + if $mg==0" && "!$dying_pacman dying_pacman=1 # Was in normal mode -> dying pacman. xscore=$xp yscore={$yp+12} oscore=1 nscore=4 - elif {$mg==1} mg=2 mg$>=$mg score+=100 # Was in invicibility mode -> dying ghost. + elif $mg==1 mg=2 mg$>=$mg score+=100 # Was in invicibility mode -> dying ghost. xscore=$xp yscore={$yp+12} oscore=1 nscore=1 fi fi - if {$mg>=2" && "($xg>>4)==$mw2" && "($yg>>4)==$mh2} # Check if dying ghost has returned to home. + if $mg>=2" && "($xg>>4)==$mw2" && "($yg>>4)==$mh2 # Check if dying ghost has returned to home. mg+=0.01 - if {$mg>=3} mg=0 xg&=-2 yg&=-2 fi + if $mg>=3 mg=0 xg&=-2 yg&=-2 fi mg$>=$mg fi - if {!($xg&15)" && "!($yg&15)} # Check if ghost can take a new direction. + if !($xg&15)" && "!($yg&15) # Check if ghost can take a new direction. ({u},{u},{u},{u};0,1,2,3) - if {$mg<2} - =. {u(0.6,1)},{if($mg==0,dX0=$xp-$xg;dY0=$yp-$yg;if(abs(dX0)>abs(dY0),if(dX0>0,0,2),if(dY0>0,1,3)),\ # Try to chase pacman. - dX1=$xp-$xg;dY1=$yp-$yg;if(abs(dX1)0,2,0),if(dY1>0,3,1)))} # Try to escape pacman. + if $mg<2 # Try to chase or escape pacman + =. {u(0.6,1)},{if($mg==0,dX0=$xp-$xg;dY0=$yp-$yg;if(abs(dX0)>abs(dY0),if(dX0>0,0,2),if(dY0>0,1,3)),\ + dX1=$xp-$xg;dY1=$yp-$yg;if(abs(dX1)0,2,0),if(dY1>0,3,1)))} =. 0,{($dg+2)%4} if $is_get_ready =. 0.8,{path,i({$xg>>4},{$yg>>4})} fi else =. 1,{path,i({$xg>>4},{$yg>>4})} # If dying ghost, follow the best path to home. fi - sort. -,x repeat 4 d={i($>,1)} if {can_go,i({$xg>>4},{$yg>>4},$d)} dg=$d break fi done rm. # Try directions until it matches. + sort. -,x + repeat 4 d={i($>,1)} # Try directions until it matches. + if {can_go,i({$xg>>4},{$yg>>4},$d)} dg=$d break fi + done rm. dg$>=$d fi u={D=${dg$>};(D==0)-(D==2)} @@ -22737,13 +27848,13 @@ wait 22 # Manage pacman displacement. - if {!$dying_pacman} + if !$dying_pacman d={if({*,ARROWRIGHT},1,if({*,ARROWDOWN},2,if({*,ARROWLEFT},3,if({*,ARROWUP},4,$dp))))} - if {!($xp&15)" && "!($yp&15)} + if !($xp&15)" && "!($yp&15) i={map,i({$xp>>4},{$yp>>4})} - if {$i==2} score+=10 pacdots-=1 # Pacdot eaten. - elif {$i==3} pacgum_timer=$| repeat 4 if {!${mg$>}} mg$>=1 dg$>={(${dg$>}+2)%4} fi done # Pacgum eaten. - elif {$i>=4} score+={${score{$i-4}}} xscore=$xp yscore={$yp+12} oscore=1 nscore={$i-4} # Fruit eaten. + if $i==2 score+=10 pacdots-=1 # Pacdot eaten. + elif $i==3 pacgum_timer=$| repeat 4 if !${mg$>} mg$>=1 dg$>={(${dg$>}+2)%4} fi done # Pacgum eaten. + elif $i>=4 score+={${score{$i-4}}} xscore=$xp yscore={$yp+12} oscore=1 nscore={$i-4} # Fruit eaten. fi =[map] 0,{$xp>>4},{$yp>>4} 16,16,1,3 j[visu] .,$xp,{24+$yp} rm. @@ -22758,23 +27869,23 @@ xp={($xp+2*$u)%(16*$mw)} yp={($yp+2*$v)%(16*$mh)} - if {$pacgum_timer>=0" && "$|>$pacgum_timer+10} # Check if pacgum still has some effect. + if $pacgum_timer>=0" && "$|>$pacgum_timer+10 # Check if pacgum still has some effect. repeat 4 xg$>&=-2 yg$>&=-2 mg$>={if(${mg$>}==1,0,${mg$>})} done pacgum_timer=-1 fi - if {!$is_get_ready" && "($|-$fruit_timer)>=10} + if !$is_get_ready" && "($|-$fruit_timer)>=10 x={round(u(0,{map0,w}))} y={round(u(0,{map0,h}))} - if {!{map,i($x,$y)}" && "{map0,i($x,$y)}==2} + if !{map,i($x,$y)}" && "{map0,i($x,$y)}==2 n={min(3,int(abs(g*1.7)))} =[map] {4+$n},$x,$y j[visu] [fruit$n],{16*$x},{16*$y+24} fruit_timer=$| fi fi fi - if {!{*}" || "{*,Q}" || "{*,ESC}} is_quit=1 fi + if !{*}" || "{*,Q}" || "{*,ESC} is_quit=1 fi - while {!$is_quit" && "$pacdots} + while !$is_quit" && "$pacdots if $is_quit break # Player asked to quit elif $pacdots # Player lost a life @@ -22785,7 +27896,7 @@ fi rm[visu,level_N,levelm_N] while $lives - rm w 0 endl v + + rm w 0 endl # The functions below create the various sprite gfx. _pacman_ghost_standard_gfx : @@ -22795,7 +27906,7 @@ _pacman_ghost_afraid_gfx : _pacman_ghost_base_gfx $1 - if {$1<2} col=255,255,255 (0,0^0,0^0,208) else col=255,0,0 (0,248^0,248^0,248) fi + if $1<2 col=255,255,255 (0,0^0,0^0,208) else col=255,0,0 (0,248^0,248^0,248) fi map.. . rm. r. 16,16,1,3,2 line. 4,4,6,6,1,$col,255 line. 4,6,6,4,1,$col,255 line. 9,4,11,6,1,$col,255 line. 9,6,11,4,1,$col,255 @@ -22812,76 +27923,71 @@ 16,16,1,3 circle. 7,7,7,1,255,128,64 _pacman_cherry_gfx : - base642img \ -"MiBjaGFyIGxpdHRsZV9lbmRpYW4KNzYgMSAxIDEgIzU5CnicFYpBCgAxDALVXvv/p5ZtmsgmIMoM7k0Cx/ySYYIXrE5qOgTmE1KGloUW1pp1qVUqmkt3H"\ -"j9Whx3SMSAyMCAxIDEgIzI2Cnicc/eNYkjPzUyONwACveTM3PQqBgA+VQX2" + base642img[] "MiBjaGFyIGxpdHRsZV9lbmRpYW4KNzYgMSAxIDEgIzU5CnicFYpBCgAxDALVXvv/p5ZtmsgmIMoM7k0Cx/ySYYIXrE5qOgTmE1KGl"\ + "oUW1pp1qVUqmkt3Hj9Whx3SMSAyMCAxIDEgIzI2Cnicc/eNYkjPzUyONwACveTM3PQqBgA+VQX2" decompress_rle. (0,0,255,255^0,173,0,255^0,0,0,255) map.. . rm. r2dy. 14 r. 16,16,1,3,0,0,0.5,0.5 _pacman_strawberry_gfx : - base642img \ -"MiBjaGFyIGxpdHRsZV9lbmRpYW4KNzIgMSAxIDEgIzYwCnicJYlJDoAwEMOyHOH/H+UANJ0RBaRIlp1tJ4HAd9HFaoUtTNWC1yIPWT5ew5em+lT994guK"\ -"HgAoIoa8zEgMjAgMSAxICMyNgp4nHP3jWJIz81MjjcAAr3kzNz0KgYAPlUF9g==" + base642img[] "MiBjaGFyIGxpdHRsZV9lbmRpYW4KNzIgMSAxIDEgIzYwCnicJYlJDoAwEMOyHOH/H+UANJ0RBaRIlp1tJ4HAd9HFaoUtTNWC1yIPW"\ + "T5ew5em+lT994guKHgAoIoa8zEgMjAgMSAxICMyNgp4nHP3jWJIz81MjjcAAr3kzNz0KgYAPlUF9g==" decompress_rle. (0,0,255,255^0,173,0,255^0,0,0,255) map.. . rm. r2dy. 14 r. 16,16,1,3,0,0,0.5,0.5 _pacman_orange_gfx : - base642img \ -"MiBjaGFyIGxpdHRsZV9lbmRpYW4KNDQgMSAxIDEgIzQ2CnicBcHBDQAgDAOxXPjC/gsxU4VKi7DnAukKPU6SYjTVptxhbSv8wpVufUwDEZ4xIDIwIDEgM"\ -"SAjMjYKeJxz941iSM/NTI43AAK95Mzc9CoGAD5VBfY=" + base642img[] "MiBjaGFyIGxpdHRsZV9lbmRpYW4KNDQgMSAxIDEgIzQ2CnicBcHBDQAgDAOxXPjC/gsxU4VKi7DnAukKPU6SYjTVptxhbSv8wpVuf"\ + "UwDEZ4xIDIwIDEgMSAjMjYKeJxz941iSM/NTI43AAK95Mzc9CoGAD5VBfY=" decompress_rle. (0,0,255,255^0,173,173,255^0,0,0,255) map.. . rm. r2dy. 14 r. 16,16,1,3,0,0,0.5,0.5 _pacman_banana_gfx : - base642img \ -"MiBjaGFyIGxpdHRsZV9lbmRpYW4KNzAgMSAxIDEgIzQ4CnicNcqxDQAgDMTANx0S++8aIC9ShObceC6QQoSJ5Ai5vWW2WTI6xr+bvLU/BnUW3jEgMjAgM"\ -"SAxICMyNgp4nHP3jWJIz81MjjcAAr3kzNz0KgYAPlUF9g==" + base642img[] "MiBjaGFyIGxpdHRsZV9lbmRpYW4KNzAgMSAxIDEgIzQ4CnicNcqxDQAgDMTANx0S++8aIC9ShObceC6QQoSJ5Ai5vWW2WTI6xr+bv"\ + "LU/BnUW3jEgMjAgMSAxICMyNgp4nHP3jWJIz81MjjcAAr3kzNz0KgYAPlUF9g==" decompress_rle. (0,255,255^0,173,255^0,0,255) map.. . rm. r2dy. 14 r. 16,16,1,3,0,0,0.5,0.5 _pacman_map_level1 : - base642img \ -"MiBjaGFyIGxpdHRsZV9lbmRpYW4KMjAxIDEgMSAxICM5Nwp4nGWOUQ6AMAhDKX56Be9/QnWJArEM9MdsGa9QYOsGiOy4FaZYHAo1aMezIJ+QJnszLsq2a"\ -"Raf9Q9GiaBnGmEZhSe8wLOdVqO+My+cFdJj9OpVQ0vzRm8l/L954AHE9jnsMSAyMCAxIDEgIzI2Cnicc/eNYkjPzUyONwACveTM3PQqBgA+VQX2" + base642img[] "MiBjaGFyIGxpdHRsZV9lbmRpYW4KMjAxIDEgMSAxICM5Nwp4nGWOUQ6AMAhDKX56Be9/QnWJArEM9MdsGa9QYOsGiOy4FaZYHAo1a"\ + "MezIJ+QJnszLsq2aRaf9Q9GiaBnGmEZhSe8wLOdVqO+My+cFdJj9OpVQ0vzRm8l/L954AHE9jnsMSAyMCAxIDEgIzI2Cnicc/eNYk"\ + "jPzUyONwACveTM3PQqBgA+VQX2" decompress_rle. +mirror. x z. 1,100% a[-2,-1] x _rlevel=33 _glevel=33 _blevel=255 _pacman_map_level2 : - base642img \ -"MiBjaGFyIGxpdHRsZV9lbmRpYW4KMjA4IDEgMSAxICMxMDAKeJxljkEOAzEIAxn32C/0/y+MdlUloAKJemgvjAOG+PkCs8ElHsjRQk0iycwS+/2jcuJln"\ -"hhhf3SxPKWw9DaJmYsbmLOqmyaXn92UsVV9Y+sweOvb7YB1vQPPDnV4a/ABHS45BDEgMjAgMSAxICMyNgp4nHP3jWJIz81MjjcAAr3kzNz0KgYAPlUF9g==" + base642img[] "MiBjaGFyIGxpdHRsZV9lbmRpYW4KMjA4IDEgMSAxICMxMDAKeJxljkEOAzEIAxn32C/0/y+MdlUloAKJemgvjAOG+PkCs8ElHsjRQ"\ + "k0iycwS+/2jcuJlnhhhf3SxPKWw9DaJmYsbmLOqmyaXn92UsVV9Y+sweOvb7YB1vQPPDnV4a/ABHS45BDEgMjAgMSAxICMyNgp4nH"\ + "P3jWJIz81MjjcAAr3kzNz0KgYAPlUF9g==" decompress_rle. +mirror. x z. 1,100% a[-2,-1] x _rlevel=200 _glevel=33 _blevel=33 _pacman_map_level3 : - base642img \ -"MiBjaGFyIGxpdHRsZV9lbmRpYW4KMjA5IDEgMSAxICMxMDEKeJxVTlsOwDAIAve5K+z+N+zStGomeyTdjwIKYT9IoHGAbpOgdQ3n1i1ZinHdnO+20FuKg"\ -"3nf4WIO3YolP8QEQ75CEkoKaUIDT3K95w8OZbp4lDcMj1PNUjXyDg+u4LTGC5LiOwAxIDIwIDEgMSAjMjYKeJxz941iSM/NTI43AAK95Mzc9CoGAD5VBfY=" + base642img[] "MiBjaGFyIGxpdHRsZV9lbmRpYW4KMjA5IDEgMSAxICMxMDEKeJxVTlsOwDAIAve5K+z+N+zStGomeyTdjwIKYT9IoHGAbpOgdQ3n1"\ + "i1ZinHdnO+20FuKg3nf4WIO3YolP8QEQ75CEkoKaUIDT3K95w8OZbp4lDcMj1PNUjXyDg+u4LTGC5LiOwAxIDIwIDEgMSAjMjYKeJ"\ + "xz941iSM/NTI43AAK95Mzc9CoGAD5VBfY=" decompress_rle. +mirror. x z. 1,100% a[-2,-1] x _rlevel=33 _glevel=200 _blevel=255 _pacman_map_level4 : - base642img \ -"MiBjaGFyIGxpdHRsZV9lbmRpYW4KMjEwIDEgMSAxICM5MAp4nHVPQQ6AMAhr8egX/P8TN+cGGSy6TBMTQgqlUPaDBDINLBJZbMQHqmwq7e40eahgy8i/j"\ -"DKB1QhlRWBzcPH09Rnr9ALTrHSOuN5N+IFF9LIY9uOPDitcQvExIDIwIDEgMSAjMjYKeJxz941iSM/NTI43AAK95Mzc9CoGAD5VBfY=" + base642img[] "MiBjaGFyIGxpdHRsZV9lbmRpYW4KMjEwIDEgMSAxICM5MAp4nHVPQQ6AMAhr8egX/P8TN+cGGSy6TBMTQgqlUPaDBDINLBJZbMQHq"\ + "mwq7e40eahgy8i/jDKB1QhlRWBzcPH09Rnr9ALTrHSOuN5N+IFF9LIY9uOPDitcQvExIDIwIDEgMSAjMjYKeJxz941iSM/NTI43AA"\ + "K95Mzc9CoGAD5VBfY=" decompress_rle. +mirror. x z. 1,100% a[-2,-1] x _rlevel=200 _glevel=200 _blevel=33 _pacman_map_level5 : - base642img \ -"MiBjaGFyIGxpdHRsZV9lbmRpYW4KMjA3IDEgMSAxICMxMDAKeJxdjlEKxCAMRPOmn3uF3v+ELXRrDE2qwrIgzPB8Mn52MDv4ihBbQyjQyuRBz96RF8NmS"\ -"YAb98s65j95Wd0bFqxG1MNV/s1ealMujRHdI5wtf9X0WnWmFWO/7JmJXScPVxI1CjEgMjAgMSAxICMyNgp4nHP3jWJIz81MjjcAAr3kzNz0KgYAPlUF9g==" + base642img[] "MiBjaGFyIGxpdHRsZV9lbmRpYW4KMjA3IDEgMSAxICMxMDAKeJxdjlEKxCAMRPOmn3uF3v+ELXRrDE2qwrIgzPB8Mn52MDv4ihBbQ"\ + "yjQyuRBz96RF8NmSYAb98s65j95Wd0bFqxG1MNV/s1ealMujRHdI5wtf9X0WnWmFWO/7JmJXScPVxI1CjEgMjAgMSAxICMyNgp4nH"\ + "P3jWJIz81MjjcAAr3kzNz0KgYAPlUF9g==" decompress_rle. +mirror. x z. 1,100% a[-2,-1] x _rlevel=200 _glevel=255 _blevel=33 _pacman_map_level6 : - base642img \ -"MiBjaGFyIGxpdHRsZV9lbmRpYW4KMTgzIDEgMSAxICM5Mgp4nGVO0QqAQAhz67Ff6P+/sK66TNqJUBCozDHn5gUwW9EIBnhi2nmBPQmHCeMwDbuzBNCH1"\ -"oZeDBEiPSWiAoXU8Yfhn4PyiNc1X3i99NwUJPMoVyVs3PAASqEr4jEgMjAgMSAxICMyNgp4nHP3jWJIz81MjjcAAr3kzNz0KgYAPlUF9g==" + base642img[] "MiBjaGFyIGxpdHRsZV9lbmRpYW4KMTgzIDEgMSAxICM5Mgp4nGVO0QqAQAhz67Ff6P+/sK66TNqJUBCozDHn5gUwW9EIBnhi2nmBP"\ + "QmHCeMwDbuzBNCH1oZeDBEiPSWiAoXU8Yfhn4PyiNc1X3i99NwUJPMoVyVs3PAASqEr4jEgMjAgMSAxICMyNgp4nHP3jWJIz81Mjj"\ + "cAAr3kzNz0KgYAPlUF9g==" decompress_rle. +mirror. x z. 1,100% a[-2,-1] x _rlevel=255 _glevel=130 _blevel=233 #@cli x_paint #@cli : Launch the interactive painter. -x_paint : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_paint : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Interactive painter"$n" -----------------------\n ----\n @@ -22894,16 +28000,16 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n --------------------------------------------------" - v - to_rgb - if {!$!} i[0] 512,512,1,3,255 nm[0] "[New image]" else k[0] fi + to_rgb + if !$! i[0] 512,512,1,3,255 nm[0] "[New image]" else k[0] fi 1 # Brush image [-1] parallel "_x_paint[]","w[] 400,320,0,Palette x_select_color[] __color,0,0,0" k[0] - v + + _x_paint : # Init variables. - pass[-2,-1] 1 ({'{-2,n}'}) discard. {'~'} nm... {t} rm. + pass[-2,-1] 1 ('{-2,n}') discard. {'~'} nm... {t} rm. __color={0,if(ia<128,vector3(255),vector3(0))} brushsize=1 brushopacity=0 @@ -22954,8 +28060,8 @@ x2={*2,x} y2={*2,y} x3={*3,x} y3={*3,y} - if {$x1>=0} # Event in the image window. - if {{*1,b}&1} # Left button -> draw brush stroke. + if $x1>=0 # Event in the image window. + if {*1,b}&1 # Left button -> draw brush stroke. ox1={if($ox1<0,$x1,$ox1)} oy1={if($oy1<0,$y1,$oy1)} delta={max(abs($x1-$ox1),abs($y1-$oy1))} @@ -22964,50 +28070,49 @@ dx={2*($x1-$ox1)/max(1,$delta)} dy={2*($y1-$oy1)/max(1,$delta)} o={1-($brushopacity/4)^0.04} - repeat {max(1,($delta+1)/2)} + repeat max(1,($delta+1)/2) ellipse[$image] {$ox1+$>*$dx},{$oy1+$>*$dy},$r1,$r2,$brushangle,$o,$__color done ox1=$x1 oy1=$y1 refresh_image=1 else ox1=-1 oy1=-1 - if {{*1,b}&2} # Right button -> fill region. + if {*1,b}&2 # Right button -> fill region. flood[$image] $x1,$y1,0,10,0,1,$__color refresh_image=1 fi fi fi - if {{*1,ARROWRIGHT}" || "{*2,ARROWRIGHT}" || "{*3,ARROWRIGHT}" || "\ # Manage image selection. - {*1,ARROWUP}" || "{*2,ARROWUP}" || "{*3,ARROWUP}" || "\ - {*1,SPACE}" || "{*2,SPACE}" || "{*3,SPACE}} + if {*1,ARROWRIGHT}" || "{*2,ARROWRIGHT}" || "{*3,ARROWRIGHT}" || "\ # Manage image selection. + {*1,ARROWUP}" || "{*2,ARROWUP}" || "{*3,ARROWUP}" || "\ + {*1,SPACE}" || "{*2,SPACE}" || "{*3,SPACE} image={($image+1)%($!-2)} refresh_image=1 - elif {{*1,ARROWLEFT}" || "{*2,ARROWLEFT}" || "{*3,ARROWLEFT}" || "\ - {*1,ARROWDOWN}" || "{*2,ARROWDOWN}" || "{*3,ARROWDOWN}" || "\ - {*1,BACKSPACE}" || "{*2,BACKSPACE}" || "{*3,BACKSPACE}} + elif {*1,ARROWLEFT}" || "{*2,ARROWLEFT}" || "{*3,ARROWLEFT}" || "\ + {*1,ARROWDOWN}" || "{*2,ARROWDOWN}" || "{*3,ARROWDOWN}" || "\ + {*1,BACKSPACE}" || "{*2,BACKSPACE}" || "{*3,BACKSPACE} image={($image-1)%($!-2)} refresh_image=1 fi if {*1,S} o[$image] gmic_paint.png fi # Save snapshot if requested. - if {{*3,b}" && "$x3>=0} # Manage brush selection. - if {$x3<384" && "$y3>=192} brushangle={$x3*180/(w-16)} # Bottom slider -> select brush angle. - elif {$x3>=384" && "$y3<192} brushthickness={$y3/(h-16)} # Right slider -> select brush thickness. - elif {$x3<384" && "$y3<192} brushsize={int($x3*8/(w-16))} brushopacity={int($y3*4/(h-16))} + if {*3,b}" && "$x3>=0 # Manage brush selection. + if $x3<384" && "$y3>=192 brushangle={$x3*180/(w-16)} # Bottom slider -> select brush angle. + elif $x3>=384" && "$y3<192 brushthickness={$y3/(h-16)} # Right slider -> select brush thickness. + elif $x3<384" && "$y3<192 brushsize={int($x3*8/(w-16))} brushopacity={int($y3*4/(h-16))} fi refresh_brush=1 fi wait - while {{*1}" && "!{*1,Q}" && "!{*1,ESC}} + while {*1}" && "!{*1,Q}" && "!{*1,ESC} # Exit properly. __color=-1 w1[] 0 w2[] 0 w3[] 0 rm[-2,-1] #@cli x_plasma #@cli : Launch the plasma effect demo. -x_plasma : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_plasma : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Plasma effect"$n" ----------------------\n ----\n @@ -23016,7 +28121,7 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n -------------------------------------------" - v - l[] + l[] # Init plasma backgrounds. N=8 @@ -23047,7 +28152,7 @@ shift[$a21] 0,${dir$a},0,0,2 # Animate plasma background. shift[$b21] 0,${dir$b},0,0,2 - if {int($t+0.005)>int($t)} dir$a={if(u<0.5,-1,1)*round(u(1,3))} fi + if int($t+0.005)>int($t) dir$a={if(u<0.5,-1,1)*round(u(1,3))} fi t={($t+max(0.005,($|-$tic)))%$N} # Render text scrolling. @@ -23059,21 +28164,20 @@ j.. .,-2,-2,0,0,1,.,255 rm. tt+={max(2,($|-$tic)*250)} # Animate scrolling. - if {$tt>=$M} tt={-1.5*{0,w}} fi + if $tt>=$M tt={-1.5*{0,w}} fi # Display rendered frame. - fps=${-fps} if {$fps>0} to. $fps" fps",5,5,16,1,0.2 fi + fps=${-fps} if $fps>0 to. $fps" fps",5,5,16,1,0.2 fi w. - if {{*,CTRLLEFT}&&{*,D}} w[] {3*w},{3*h} elif {{*,CTRLLEFT}&&{*,C}} w[] {1.5*w},{1.5*h} fi + if {*,CTRLLEFT}" && "{*,D} w[] {3*w},{3*h} elif {*,CTRLLEFT}" && "{*,C} w[] {1.5*w},{1.5*h} fi rm. wait 20 - while {{*}" && "!{*,ESC}" && "!{*,Q}} - rm[{-2*$N-2}--1] w[] 0 endl v + + while {*}" && "!{*,ESC}" && "!{*,Q} + rm[{-2*$N-2}--1] w[] 0 endl #@cli x_quantize_rgb : _nbcolors>=2 #@cli : Launch the RGB color quantization demo. -x_quantize_rgb : check "isint(${1=16}) && $1>1" - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_quantize_rgb : check "isint(${1=16}) && $1>1" check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"RGB Quantization"$n" --------------------------------------\n ----\n @@ -23095,17 +28199,17 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n --------------------------------------------------------------" - v - - if {!$!} sp ? fi - k[0] to_rgb if {h>300} r2dy 300 round 1 fi nm. img # Resize input image if necessary. + + if !$! sp ? fi + k[0] to_rgb if h>300 r2dy 300 round 1 fi nm. img # Resize input image if necessary. +r {w*h},1,1,3,-1 r. {min(w,8192)},1,1,3 nm. colors # Get reduced set of image colors. - $1,1,1,3 rand. 0,255 round. 1 nm. centroids # Initialize random centroids. - _x_quantize_rgb_3d (1,0,0,0;0,1,0,0;0,0,1,0) nm. pose3d # Init 3D object. + $1,1,1,3 rand. 0,255 round. 1 nm. centroids # Initialize random centroids. + _x_quantize_rgb_3d (1,0,0,0;0,1,0,0;0,0,1,0) nm. pose3d # Init 3D object. _x_quantize_rgb_text "Colors",clustering0 _x_quantize_rgb_text "Clusters",clustering1 _x_quantize_rgb_text "Dithering: off",dithering0 _x_quantize_rgb_text "Dithering: on",dithering1 - if {img,h<300} +r2dy[img] 300,1 else [img] fi # Generate visualization canvas. + if {img,h<300} +r2dy[img] 300,1 else [img] fi # Generate visualization canvas. {w+315},365,1,3,255 rm.. rectangle. 4,4,305,305,1,0xFFFFFFFF,0 rectangle. 309,4,{w-5},305,1,0xFFFFFFFF,0 @@ -23121,12 +28225,14 @@ do # Create and display visualization. - if {!narg($visu_3d)} # Update 3D vizualization. + if !narg($visu_3d) # Update 3D vizualization. +-[centroids] 2 ++[centroids] 2 a[-2,-1] x permute. cxyz y. -. 128 j[obj3d] .,0,8 rm. # Update centroids position in 3D object. [obj3d] if $clustering - if {{colors,iM}<256} +index[colors] [centroids] *. 256 +[colors,-1] fi # Estimate nearest centroids for all colors. + if {colors,iM}<256 # Estimate nearest centroids for all colors. + +index[colors] [centroids] *. 256 +[colors,-1] + fi +channels[colors] 0 >>. 8 map. 2 permute. cxyz y. j.. .,0,{{-2,h}-$_N-h} rm. fi @@ -23135,20 +28241,20 @@ nm. visu_3d j[visu] [visu_3d],5,5 fi - if {!narg($visu_img)} # Update indexed image. - +index[img] [centroids],{0.7*$dithering},1 if {h<300} r2dy. 300,1 fi + if !narg($visu_img) # Update indexed image. + +index[img] [centroids],{0.7*$dithering},1 if h<300 r2dy. 300,1 fi j. [dithering$dithering],2,0,0,0,1,[mdithering$dithering],255 nm. visu_img j[visu] [visu_img],310,5 fi - if {!narg($visu_centroids)} # Update colormap. + if !narg($visu_centroids) # Update colormap. +luminance[centroids] a. [centroids],y sort. +,x rows. 1 r. {visu,w-10},50,1,3 0 t. "Colors: "{centroids,w},2,0,16,1,255,255,255 +dilate. 3 j... ..,2,2,0,0,1,.,255 rm[-2,-1] nm. visu_centroids j[visu] [visu_centroids],5,310 fi l[visu] w -1,-1,0,"[G"{`39`}"MIC] RGB Quantization" - if {{*,CTRLLEFT}&&{*,D}} w[] {2*w},{2*h} elif {{*,CTRLLEFT}&&{*,C}} w[] {w},{h} fi + if {*,CTRLLEFT}" && "{*,D} w[] {2*w},{2*h} elif {*,CTRLLEFT}" && "{*,C} w[] {w},{h} fi endl # Check for user's interactions. @@ -23156,29 +28262,34 @@ y={int({*,y}*{visu,h}/{*,h})} b={*,b} i={visu,i($x,$y,0,3)} - if {$b&1" && "$i==1} # Toggle dithering. + if $b&1" && "$i==1 # Toggle dithering. dithering={!$dithering} rm[visu_img] wait -1 - elif {$b&1" && "$i==2} # Add new color. - (${-RGB}) y. c a[centroids,-1] x _x_quantize_rgb_3d rm[visu_3d,visu_img,visu_centroids] &[colors] 255 pause=1 wait 100 - elif {$b&2" && "$i==2" && "{centroids,w}>2} # Remove color. - r[centroids] {centroids,w-1} _x_quantize_rgb_3d rm[visu_3d,visu_img,visu_centroids] &[colors] 255 pause=1 wait 100 - elif {$b&2" && "$i>=3} # Toggle clusters/colors mode. + elif $b&1" && "$i==2 # Add new color. + (${-RGB}) y. c a[centroids,-1] x _x_quantize_rgb_3d rm[visu_3d,visu_img,visu_centroids] &[colors] 255 + pause=1 wait 100 + elif $b&2" && "$i==2" && "{centroids,w}>2 # Remove color. + r[centroids] {centroids,w-1} _x_quantize_rgb_3d rm[visu_3d,visu_img,visu_centroids] &[colors] 255 + pause=1 wait 100 + elif $b&2" && "$i>=3 # Toggle clusters/colors mode. clustering={!$clustering} rm[visu_3d] wait -1 elif {*,M} # Init colormap with median-cut. +&[colors] 255 colormap. {centroids,w},0,0 rm[centroids] nm. centroids - _x_quantize_rgb_3d rm[visu_3d,visu_img,visu_centroids] &[colors] 255 pause=1 wait -1 + _x_quantize_rgb_3d rm[visu_3d,visu_img,visu_centroids] &[colors] 255 + pause=1 wait -1 elif {*,R} # Init colormap with random values. rand[centroids] 0,255 round[centroids] 1 - _x_quantize_rgb_3d rm[visu_3d,visu_img,visu_centroids] &[colors] 255 pause=1 wait -1 + _x_quantize_rgb_3d rm[visu_3d,visu_img,visu_centroids] &[colors] 255 + pause=1 wait -1 elif {*,U} # Init colormap with uniform sampling. uniform_distribution {centroids,w},3 *. 255 rm[centroids] nm. centroids - _x_quantize_rgb_3d rm[visu_3d,visu_img,visu_centroids] &[colors] 255 pause=1 wait -1 + _x_quantize_rgb_3d rm[visu_3d,visu_img,visu_centroids] &[colors] 255 + pause=1 wait -1 elif {*,ENTER} # Start k-means iterations. pause=0 - elif {$b&1" && "$i>=3} # Manage 3D view rotation. + elif $b&1" && "$i>=3 # Manage 3D view rotation. coords={visu,i($x,$y,0,3)-3} u1={(($coords>>2)&511)-150} v1={($coords>>11)-150} - if {!narg($u0)} u0=$u1 v0=$v1 fi - if {$u0!=$u1" || "$v0!=$v1} + if !narg($u0) u0=$u1 v0=$v1 fi + if $u0!=$u1" || "$v0!=$v1 n0={sqrt(($u0)^2+($v0)^2)} nu0={if($n0>135,$u0*135/$n0,$u0)} nv0={if($n0>135,$v0*135/$n0,$v0)} nw0={sqrt(max(0,18225-($nu0)^2-($nv0)^2))} n1={sqrt(($u1)^2+($v1)^2)} @@ -23187,24 +28298,24 @@ rotation3d[] $u,$v,$w,{-asin($n/18225)*180/pi} mv[pose3d] $! m*[-2,-1] nm. pose3d u0=$u1 v0=$v1 rm[visu_3d] fi - elif {!($b&1)} u0= + elif !($b&1) u0= fi - if {!$pause" || "{*,SPACE}} # Do one iteration of k-means. + if !$pause" || "{*,SPACE} # Do one iteration of k-means. pause={*,-SPACE} # Estimate new centroids positions. &[colors] 255 +index[colors] [centroids] *. 256 +[colors,-1] # Estimate nearest centroids for all colors. - repeat {colors,s} # Recompute centroid positions. + repeat s#$colors # Recompute centroid positions. sh[colors] $> +histogram. {centroids,w*256},0,{centroids,w*256-1} rm.. i.. 256,1,1,1,'x' r.. {w},1,1,1,0,2 *.. . r[-2,-1] {centroids,w},1,1,1,2 max. 0.01 /[-2,-1] done a[-{colors,s}--1] c rm[centroids] nm. centroids - # Reassign ununsed centroids. + # Reassign unused centroids. +>>[colors] 8 channels. 0 histogram. {centroids,w},0,{centroids,w-1} cmax={xM} - repeat {w} if {!i($>)} point[centroids] $>,0,0,1,{centroids,I($cmax)} point[centroids] $>,0,0,-0.001,${-RGB} fi done + repeat w if !i($>) point[centroids] $>,0,0,1,{centroids,I($cmax)} point[centroids] $>,0,0,-0.001,${-RGB} fi done rm. c[centroids] 0,255 if $visu_3d rm[visu_3d] fi @@ -23215,14 +28326,14 @@ else if $visu_img wait fi fi - while {{*}" && "!{*,Q}" && "!{*,ESC}} - rm w 0 v + + while {*}" && "!{*,Q}" && "!{*,ESC} + rm w 0 _x_quantize_rgb_3d : if $obj3d rm[obj3d] fi +distribution3d[centroids] circles3d. 5 col3d. 255 # Pre-compute 3D object. colorcube3d p3d. 1 - +&[colors] 255 distribution3d. o3d. 0.8 +3d[-3--1] + +&[colors] 255 distribution3d. circles3d. 3 o3d. 0.25 +3d[-3--1] -3d. 128,128,128 nm. obj3d _N={i[7]} _x_quantize_rgb_text : @@ -23231,9 +28342,8 @@ #@cli x_reflection3d #@cli : Launch the 3D reflection demo. -x_reflection3d : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_reflection3d : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"3D reflection"$n" ----------------------\n ----\n @@ -23242,7 +28352,6 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n -------------------------------------------" - v - # Render background. 128,256,1,3 rand. 0,255 plasma. 1,100 blur_xy. 30,2 @@ -23281,24 +28390,23 @@ j3d. [-4],$xf%,$yf%,0,1,4,0,0 # Display frame and update animation variables. - fps=${-fps} if {$fps>0} to. $fps" fps",5,{h-19},13,1,0.2 fi + fps=${-fps} if $fps>0 to. $fps" fps",5,{h-19},13,1,0.2 fi w. rm. - if {{*,CTRLLEFT}&&{*,D}} w[] 800,800 elif {{*,CTRLLEFT}&&{*,C}} w[] 400,400 fi + if {*,CTRLLEFT}" && "{*,D} w[] 800,800 elif {*,CTRLLEFT}" && "{*,C} w[] 400,400 fi xb={($xb+6)&255} xl={($xl-6)&255} anim+=1 r3d[-2,-1] {sin(0.5*$|)},{cos($|)},1,{max(0.005,$|-$tic)*33} r3d... -1,0.3,0.8,{max(0.005,$|-$tic)*100} wait 20 - while {{*}" && "!{*,ESC}" && "!{*,Q}} - rm[-5--1] w[] 0 v + + while {*}" && "!{*,ESC}" && "!{*,Q} + rm[-5--1] w[] 0 #@cli x_rubber3d #@cli : Launch the 3D rubber object demo. -x_rubber3d : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_rubber3d : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"3D rubber object"$n" -------------------\n ----\n @@ -23307,7 +28415,7 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n -------------------------------------------" - v - rm + rm sphere3d 150,0 torus3d 70,15 cylinder3d 20,40 col3d... 200,200,200,0.3 col3d.. 128,200,76 col3d. 200,128,76 c3d[-3--1] r3d. 1,0,0,70 +3d[-3--1] +3d. 10,-8,20 *3d. 1.5 @@ -23321,28 +28429,29 @@ {w},{h},1,3 fc. 16,32,32 j3d. [0],50%,50%,0,1,3,0,0 j[1] .,0,0,$frame rm. r3d[0] 0.1,1,0.6,{3*cos($|*1.25)} r3d[0] 1,0.2,0.6,-1 +warp[1] [2],0,0 *[3] 0.8 *. 0.2 +[3] . rm. - if {$fps>0} to. $fps" fps",5,{h-29},24,2,0.2 fi + if $fps>0 to. $fps" fps",5,{h-29},24,2,0.2 fi w. - if {{*,CTRLLEFT}&&{*,D}} w[] {2*w},{2*h} elif {{*,CTRLLEFT}&&{*,C}} w[] {w},{h} fi + if {*,CTRLLEFT}" && "{*,D} w[] {2*w},{2*h} elif {*,CTRLLEFT}" && "{*,C} w[] {w},{h} fi wait[0] 20 sh[2] 2 -. 1 &. {{1,d}-1} rm. frame={($frame-1)%{1,d}} - while {{*}" && "!{*,ESC}" && "!{*,Q}} - rm w 0 v + + while {*}" && "!{*,ESC}" && "!{*,Q} + rm w 0 #@cli x_segment : _max_resolution={ 0 | >=128 } #@cli : Segment foreground from background in selected opaque RGB images, interactively. #@cli : Return RGBA images with binary alpha-channels. #@cli : Default value: 'max_resolution=1024'. -x_segment : check "${1=1024}==0 || $1>=128" - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_segment : check "${1=1024}==0 || $1>=128" check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[^-1] "Extract foreground from background in image$? interactively, with maximum resolution $1." e[] "\n ----------------------------------------------------------------------------------------------------\n ----\n ----- "${c}"Left mouse button"$n" or key '"${c}"F"$n"' create a new foreground control point (or move an existing one).\n ----- "${c}"Right mouse button"$n" or key '"${c}"B"$n"' create a new background control point (or move an existing one).\n +---- "${c}"Left mouse button"$n" or key '"${c}"F"$n"' create a new foreground control point + (or move an existing one).\n +---- "${c}"Right mouse button"$n" or key '"${c}"B"$n"' create a new background control point + (or move an existing one).\n ---- "${c}"Mouse wheel"$n", or keys '"${c}"CTRL+arrows UP/DOWN"$n"' zoom view in/out.\n ---- '"${c}"CTRL+mouse wheel"$n"', '"${c}"SHIFT+mouse wheel"$n"' or "${c}"arrow keys"$n" move image in zoomed view.\n ---- Key '"${c}"SPACE"$n"' updates the extraction mask.\n @@ -23357,21 +28466,22 @@ ---- Keys '"${c}"ESC"$n"', '"${c}"Q"$n"' or '"${c}"ENTER"$n"' exit the interactive window.\n ----\n ----------------------------------------------------------------------------------------------------" - v - repeat $! l[$>] + repeat $! l[$>] # Init variables and images. - name={0,n} title={0,b} if {narg({0,x})} title=$title.{0,x} fi + name={0,n} title={0,b} if narg({0,x}) title=$title.{0,x} fi w={w} h={h} fdim=${fitscreen[]\ $w,$h} ww={arg(1,$fdim)} wh={arg(2,$fdim)} x0=0 y0=0 x1={w-1} y1={h-1} selection=-1 marker_mode=2 xpan=-1 ypan=-1 bg_mode=0 opacity=64 to_rgb nm img - if {narg($_gui_control_points)>=4} ($_gui_control_points) r. {w/4},4,1,1,-1 # Import list of control points from plug-in GUI. + if narg($_gui_control_points)>=4 # Import list of control points from plug-in GUI. + ($_gui_control_points) r. {w/4},4,1,1,-1 else 0 # Empty list of control points. fi nm. points # Compute potential map. - if {$1>0} if {$w>$h} +r2dx[img] {min($1,$w)},2 else +r2dy[img] {min($1,$h)},2 fi else [img] fi + if $1>0 if $w>$h +r2dx[img] {min($1,$w)},2 else +r2dy[img] {min($1,$h)},2 fi else [img] fi _x_segment. pw={potential,w} ph={potential,h} @@ -23393,33 +28503,33 @@ x0={$cx-$dx/2} x1={$cx+$dx/2} y0={$cy-$dy/2} y1={$cy+$dy/2} ww=$nww wh=$nwh - elif {$is_ctrl" && "{*,-D}} # Increase window size. + elif $is_ctrl" && "{*,-D} # Increase window size. nww={min({*,u},$ww*1.25)} nwh={min({*,v},$wh*1.25)} m={min($nww,$nwh)} - if {$m==$nww} ww=$m wh={$h*$m/$w} else ww={$w*$m/$h} wh=$m fi - elif {$is_ctrl" && "{*,-C}} # Decrease window size. + if $m==$nww ww=$m wh={$h*$m/$w} else ww={$w*$m/$h} wh=$m fi + elif $is_ctrl" && "{*,-C} # Decrease window size. nww={$ww/1.25} nwh={$wh/1.25} - if {min($nww,$nwh)>=64} ww=$nww wh=$nwh fi - elif {$is_ctrl" && "{*,-R}} # Reset window size. + if min($nww,$nwh)>=64 ww=$nww wh=$nwh fi + elif $is_ctrl" && "{*,-R} # Reset window size. fdim=${fitscreen[]\ $w,$h} ww={arg(1,$fdim)} wh={arg(2,$fdim)} x0=0 y0=0 x1={$w-1} y1={$h-1} - elif {($is_shift" && "$o<0)" || "{*,ARROWLEFT}} # Go left. + elif ($is_shift" && "$o<0)" || "{*,ARROWLEFT} # Go left. dx={($x1-$x0)/6} x0-=$dx x1-=$dx - elif {($is_shift" && "$o>0)" || "{*,ARROWRIGHT}} # Go right. + elif ($is_shift" && "$o>0)" || "{*,ARROWRIGHT} # Go right. dx={($x1-$x0)/6} x0+=$dx x1+=$dx - elif {($is_ctrl" && "$o>0)" || "({*,ARROWUP}" && "!$is_ctrl)} # Go up. + elif ($is_ctrl" && "$o>0)" || "({*,ARROWUP}" && "!$is_ctrl) # Go up. dy={($y1-$y0)/6} y0-=$dy y1-=$dy - elif {($is_ctrl" && "$o<0)" || "({*,ARROWDOWN}" && "!$is_ctrl)} # Go down. + elif ($is_ctrl" && "$o<0)" || "({*,ARROWDOWN}" && "!$is_ctrl) # Go down. dy={($y1-$y0)/6} y0+=$dy y1+=$dy - elif {$o>0" || "($is_ctrl" && "{*,ARROWUP})} # Zoom in. - if {$x1-$x0>16" && "$y1-$y0>16} + elif $o>0" || "($is_ctrl" && "{*,ARROWUP}) # Zoom in. + if $x1-$x0>16" && "$y1-$y0>16 cx={if($x>=0" && "!{*,ARROWUP},$x,($x0+$x1)/2)} cy={if($y>=0" && "!{*,ARROWUP},$y,($y0+$y1)/2)} x0={$cx+($x0-$cx)*0.75} y0={$cy+($y0-$cy)*0.75} x1={$cx+($x1-$cx)*0.75} y1={$cy+($y1-$cy)*0.75} fi - elif {$o<0" || "($is_ctrl" && "{*,ARROWDOWN})} # Zoom out. + elif $o<0" || "($is_ctrl" && "{*,ARROWDOWN}) # Zoom out. zfactor={max(($x1-$x0+1)/$w,($y1-$y0+1)/$h)} - if {$zfactor<1.3} + if $zfactor<1.3 cx={if($x>=0" && "!{*,ARROWDOWN},$x,($x0+$x1)/2)} cy={if($y>=0" && "!{*,ARROWDOWN},$y,($y0+$y1)/2)} x0={$cx+($x0-$cx)/0.75} y0={$cy+($y0-$cy)/0.75} @@ -23430,52 +28540,60 @@ dx={($w-$x0-$x1)/2} dy={($h-$y0-$y1)/2} x0+=$dx x1+=$dx y0+=$dy y1+=$dy fi - elif {$b&4" && "!$is_mouseout} # Pan. - if {$panx<0" && "$pany<0} panx=$x pany=$y + elif $b&4" && "!$is_mouseout # Pan. + if $panx<0" && "$pany<0 panx=$x pany=$y else dx={round($panx-$x)} dy={round($pany-$y)} x0+=$dx y0+=$dy x1+=$dx y1+=$dy fi else panx=-1 pany=-1 fi - if {$ww!=$oww" || "$wh!=$owh" || "$ox0!=$x0" || "$oy0!=$y0" || "$ox1!=$x1" || "$oy1!=$y1} rm[baseview] fi + if $ww!=$oww" || "$wh!=$owh" || "$ox0!=$x0" || "$oy0!=$y0" || "$ox1!=$x1" || "$oy1!=$y1 rm[baseview] fi # Handle events related to control points management. N={points,w} - is_left_button={$b&1" || "{*,F}} is_right_button={$b&2" || "{*,B}} is_button={$is_left_button" || "$is_right_button} - if {narg($baseview)" && "$is_button" && "$x>=0" && "$y>=0" && "$x<$w" && "$y<$h} - if {$selection==-1" && "$N} # Check for selection of an existing point. + is_left_button={$b&1" || "{*,F}} is_right_button={$b&2" || "{*,B}} + is_button={$is_left_button" || "$is_right_button} + if narg($baseview)" && "$is_button" && "$x>=0" && "$y>=0" && "$x<$w" && "$y<$h + if $selection==-1" && "$N # Check for selection of an existing point. ($x;$y) r. $N,2 -. [points] *. {max($ww,$wh)/max($x1-$x0,$y1-$y0)} sqr. s. y +[-2,-1] dmin={im} selection={if($dmin>25,-1,xm)} rm. fi - if {$selection>=0} + if $selection>=0 if $marker_mode # Move existing point. +columns[points] $selection ox={i[0]} oy={i[1]} =. $x =. $y,0,1 =. {1+$is_left_button},0,3 j[points] .,$selection rm. rm[view] fi else # Add new foreground or background point. - ($x;$y;0;{1+$is_left_button}) a[points,-1] x selection=$N if {!$marker_mode} marker_mode=2 fi rm[view] + ($x;$y;0;{1+$is_left_button}) a[points,-1] x selection=$N if !$marker_mode marker_mode=2 fi rm[view] fi else selection=-1 - if {{*,SPACE}" && "narg($labels)} rm[labels] # Update labels. - elif {{*,TAB}" && "narg($baseview)} bg_mode={($bg_mode+1)%6} rm[baseview] wait -1 # Toggle background view modes. - elif {{*,M}" && "narg($view)} marker_mode={($marker_mode-1)%3} rm[view] wait -1 # Toggle markers view modes. - elif {{*,PAGEDOWN}" && "narg($baseview)} opacity={max(0,$opacity-32)} rm[baseview] wait -1 # Decrease background opacity. - elif {{*,PAGEUP}" && "narg($baseview)} opacity={min(255,$opacity+32)} rm[baseview] wait -1 # Increase background opacity. - elif {{*,BACKSPACE}" && "$N} if {$N>1} z[points] 0,{$N-2} else i=$points rm[points] i[$i] 0 nm[$i] points fi rm[view] wait -1 # Remove last point. + if {*,SPACE}" && "narg($labels) rm[labels] # Update labels. + elif {*,TAB}" && "narg($baseview) # Toggle background view modes + bg_mode={($bg_mode+1)%6} rm[baseview] wait -1 + elif {*,M}" && "narg($view) # Toggle markers view modes + marker_mode={($marker_mode-1)%3} rm[view] wait -1 + elif {*,PAGEDOWN}" && "narg($baseview) # Decrease background opacity + opacity={max(0,$opacity-32)} rm[baseview] wait -1 + elif {*,PAGEUP}" && "narg($baseview) # Increase background opacity + opacity={min(255,$opacity+32)} rm[baseview] wait -1 + elif {*,BACKSPACE}" && "$N # Remove last point. + if $N>1 z[points] 0,{$N-2} + else i=$points rm[points] i[$i] 0 nm[$i] points + fi rm[view] wait -1 fi fi # Manage zoomed view bounds. w2={round(($x1-$x0)/2)} h2={round(($y1-$y0)/2)} - if {$x0<-$w2} x1-={$x0+$w2} x0=-$w2 fi - if {$y0<-$h2} y1-={$y0+$h2} y0=-$h2 fi - if {$x1>=$w+$w2} x0+={$w-1+$w2-$x1} x1={$w-1+$w2} fi - if {$y1>=$h+$h2} y0+={$h-1+$h2-$y1} y1={$h-1+$h2} fi + if $x0<-$w2 x1-={$x0+$w2} x0=-$w2 fi + if $y0<-$h2 y1-={$y0+$h2} y0=-$h2 fi + if $x1>=$w+$w2 x0+={$w-1+$w2-$x1} x1={$w-1+$w2} fi + if $y1>=$h+$h2 y0+={$h-1+$h2-$y1} y1={$h-1+$h2} fi # Render labels. - if {!narg($labels)} + if !narg($labels) N={points,w} - if {narg($view)} to[view] "Processing...",5,5,20,2 w[view] fi + if narg($view) to[view] "Processing...",5,5,20,2 w[view] fi if $N [points] sh. 0,0,0,0 *. {$pw/$w} rm. @@ -23485,33 +28603,33 @@ else [potential],[potential],1,1,1 fi nm. labels - if {narg($baseview)} rm[baseview] fi + if narg($baseview) rm[baseview] fi fi # Render base image. - if {!narg($baseview)} + if !narg($baseview) nx0={$x0*$pw/$w} ny0={$y0*$ph/$h} nx1={$x1*$pw/$w} ny1={$y1*$ph/$h} +z[img] $x0,$y0,$x1,$y1 r. $ww,$wh,1,100%,{if($ww=3} *. -1 +. 1 fi + if $bg_mode>=3 *. -1 +. 1 fi *. {255-$opacity} +. $opacity a[-2,-1] c - if {$bg_mode%3>=1} i.. 100%,100%,1,3,{(($bg_mode-1)%3)*255} blend[-2,-1] alpha + if $bg_mode%3>=1 i.. 100%,100%,1,3,{(($bg_mode-1)%3)*255} blend[-2,-1] alpha else drgba. fi nm. baseview - if {narg($view)} rm[view] fi + if narg($view) rm[view] fi fi # Render view. - if {!narg($view)} + if !narg($view) [baseview] r. 100%,100%,1,3 if $marker_mode - if {$marker_mode==2} rad1=5 rad2=3 opa=1 else rad1=3 rad2=2 opa=0.8 fi + if $marker_mode==2 rad1=5 rad2=3 opa=1 else rad1=3 rad2=2 opa=0.8 fi col0=255,0,0 col1=0,255,0 - repeat {points,w} + repeat w#$points +columns[points] $> x={(i[0]-$x0)*$ww/(1+$x1-$x0)} y={(i[1]-$y0)*$wh/(1+$y1-$y0)} l={i[3]-1} rm. circle. $x,$y,$rad1,1,0 circle. $x,$y,$rad2,$opa,${col$l} done @@ -23521,10 +28639,10 @@ w[view] $ww,$wh,0,$title fi - while {{*}" && "!{*,ESC}" && "!{*,Q}" && "!{*,ENTER}} + while {*}" && "!{*,ESC}" && "!{*,Q}" && "!{*,ENTER} # Recompute labels at full resolution. - if {narg($view)} to[view] "Processing fullres...",5,5,20,2 w[view] fi + if narg($view) to[view] "Processing fullres...",5,5,20,2 w[view] fi k[img,points] N={points,w} status= if $N @@ -23539,7 +28657,7 @@ endl done u $status # Return control points of last image. - w 0 v + + w 0 # Compute potential function. _x_segment : @@ -23548,24 +28666,26 @@ #@cli x_select_color : _variable_name #@cli : Display a RGB or RGBA color selector. -#@cli : Argument 'variable_name' specifies the variable that contains the selected color values (as R,G,B,[A]) at any time. +#@cli : Argument 'variable_name' specifies the variable that contains the selected color values (as R,G,B,[A]) +#@cli : at any time. #@cli : Its value specifies the initial selected color. Assigning '-1' to it forces the interactive window to close. #@cli : Default value: 'variable_name=xsc_variable'. -x_select_color : skip ${1=xsc_variable} - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - rm - n={narg($$1)} if {!$n} $1=0,0,0 fi +x_select_color : skip ${1=xsc_variable} check_display + rm + n={narg($$1)} if !$n $1=0,0,0 fi rgba_mode={$n>=4} R={arg(1,$$1)} G={arg(2,$$1)} B={arg(3,$$1)} A={if($rgba_mode,arg(4,$$1),255)} - v + e[^-1] "Open "${arg\ 1+$rgba_mode,RGB,RGBA}" color selector widget, with variable '$1' and starting color "($$1)"." v - - if {!{*}} w[] {400+24*$rgba_mode},400,0,"Select a color" fi + e[^-1] "Open "${arg\ 1+$rgba_mode,RGB,RGBA}" color selector widget, with variable '$1' and starting color "\ + ($$1)"." + if !{*} w[] {400+24*$rgba_mode},400,0,"Select a color" fi update_view=1 is_sv=0 is_h=0 is_a=0 colordb=0 is_thread_variable={arg(1,{'$1'})==_'_'" && "arg(2,{'$1'})==_'_'} # Manage color presets. - m "add_preset : if {!narg($_xsc_preset$""1)} _xsc_preset$""1=$""2,$""3,$""4 fi" - add_preset 0,0,0,0,0 add_preset 1,255,255,255 add_preset 2,255,0,0 add_preset 3,0,255,0 add_preset 4,0,0,255 add_preset 5,255,255,0 - add_preset 6,255,0,255 add_preset 7,0,255,255 add_preset 8,50,50,50 add_preset 9,100,100,100 add_preset 10,150,150,150 add_preset 11,200,200,200 - uncommand add_preset - if {!narg($_xsc_preset)} _xsc_preset=11 fi + m "add_preset : if !narg($_xsc_preset$""1) _xsc_preset$""1=$""2,$""3,$""4 fi" + add_preset 0,0,0,0,0 add_preset 1,255,255,255 add_preset 2,255,0,0 add_preset 3,0,255,0 + add_preset 4,0,0,255 add_preset 5,255,255,0 add_preset 6,255,0,255 add_preset 7,0,255,255 + add_preset 8,50,50,50 add_preset 9,100,100,100 add_preset 10,150,150,150 add_preset 11,200,200,200 + um add_preset + if !narg($_xsc_preset) _xsc_preset=11 fi ($R^$G^$B) c. 0,255 rgb2hsv. H={i[0]} S={i[1]} V={i[2]} rm. # Start event loop. @@ -23573,20 +28693,26 @@ w={*,d} h={*,e} x={*,x} y={*,y} b={*,b} # Update base image. - if {!$!} + if !$! $w,$h,1,3,200 if $rgba_mode x1={w-89} y1={h-57} x2={w-80} else x1={w-49} y1={h-57} x2={w-40} fi x0=8 y0=8 x3={$x2+31} x4={w-40} x5={$x4+31} x6={max($x0+232+32*$rgba_mode,w-152)} y6={$y1+7} - rectangle {$x0-1},{$y0-1},{$x1+1},{$y1+1},1,0xFFFFFFFF,232 line {$x0-1},{$y0-1},{$x1+1},{$y0-1},1,128 line {$x0-1},{$y0-1},{$x0-1},{$y1+1},1,128 + rectangle {$x0-1},{$y0-1},{$x1+1},{$y1+1},1,0xFFFFFFFF,232 + line {$x0-1},{$y0-1},{$x1+1},{$y0-1},1,128 + line {$x0-1},{$y0-1},{$x0-1},{$y1+1},1,128 (1;0) (0,1) r[-2,-1] {$x1-$x0+1},{$y1-$y0+1},1,1,3 i... 100%,100%,1,1,$H a[-3--1] c hsv2rgb. j.. .,$x0,$y0 rm. - rectangle {$x2-1},{$y0-1},{$x3+1},{$y1+1},1,0xFFFFFFFF,232 line {$x2-1},{$y0-1},{$x3+1},{$y0-1},1,128 line {$x2-1},{$y0-1},{$x2-1},{$y1+1},1,128 + rectangle {$x2-1},{$y0-1},{$x3+1},{$y1+1},1,0xFFFFFFFF,232 + line {$x2-1},{$y0-1},{$x3+1},{$y0-1},1,128 + line {$x2-1},{$y0-1},{$x2-1},{$y1+1},1,128 (359;0^1;1^1;1) r. {$x3-$x2+1},{$y1-$y0+1},1,3,3 hsv2rgb. j.. .,$x2,$y0 rm. if $rgba_mode - rectangle {$x4-1},{$y0-1},{$x5+1},{$y1+1},1,0xFFFFFFFF,232 line {$x4-1},{$y0-1},{$x5+1},{$y0-1},1,128 line {$x4-1},{$y0-1},{$x4-1},{$y1+1},1,128 + rectangle {$x4-1},{$y0-1},{$x5+1},{$y1+1},1,0xFFFFFFFF,232 + line {$x4-1},{$y0-1},{$x5+1},{$y0-1},1,128 + line {$x4-1},{$y0-1},{$x4-1},{$y1+1},1,128 (1;0) r. {$x5-$x4+1},{$y1-$y0+1},1,4,3 *. 255 drgba. j.. .,$x4,$y0 rm. fi t. "Current",$x0,{$y1+12},14,1,0 - if {narg($_xsc_old)} + if narg($_xsc_old) t. "Old",$x0,{$y1+34},14,1,0 ($_xsc_old) y. c r. 48,16 drgba. r. {w+2},{h+2},1,3,0,0,0.5,0.5 j.. .,{$x0+55},{$y1+32} rm. fi @@ -23602,19 +28728,19 @@ if $update_view . cx={$x0+$V*($x1-$x0)} cy={$y0+(1-$S)*($y1-$y0)} - if {$cx>$x0} line. {$cx-1},$y0,{$cx-1},$y1,1,200 fi - if {$cx<$x1} line. {$cx+1},$y0,{$cx+1},$y1,1,200 fi - if {$cy>$y0} line. $x0,{$cy-1},$x1,{$cy-1},1,200 fi - if {$cy<$y1} line. $x0,{$cy+1},$x1,{$cy+1},1,200 fi + if $cx>$x0 line. {$cx-1},$y0,{$cx-1},$y1,1,200 fi + if $cx<$x1 line. {$cx+1},$y0,{$cx+1},$y1,1,200 fi + if $cy>$y0 line. $x0,{$cy-1},$x1,{$cy-1},1,200 fi + if $cy<$y1 line. $x0,{$cy+1},$x1,{$cy+1},1,200 fi line. $x0,$cy,$x1,$cy,1,0 line. $cx,$y0,$cx,$y1,1,0 cy={$y0+(359-$H)*($y1-$y0)/359} - if {$cy>$y0} line. $x2,{$cy-1},$x3,{$cy-1},1,200 fi - if {$cy<$y1} line. $x2,{$cy+1},$x3,{$cy+1},1,200 fi + if $cy>$y0 line. $x2,{$cy-1},$x3,{$cy-1},1,200 fi + if $cy<$y1 line. $x2,{$cy+1},$x3,{$cy+1},1,200 fi line. $x2,$cy,$x3,$cy,1,0 if $rgba_mode cy={$y0+(255-$A)*($y1-$y0)/255} - if {$cy>$y0} line. $x4,{$cy-1},$x5,{$cy-1},1,200 fi - if {$cy<$y1} line. $x4,{$cy+1},$x5,{$cy+1},1,200 fi + if $cy>$y0 line. $x4,{$cy-1},$x5,{$cy-1},1,200 fi + if $cy<$y1 line. $x4,{$cy+1},$x5,{$cy+1},1,200 fi line. $x4,$cy,$x5,$cy,1,0 fi ($H^$S^$V^$A) sh. 0,2 hsv2rgb. rm. round. R={i[0]} G={i[1]} B={i[2]} @@ -23623,7 +28749,7 @@ if $rgba_mode t. "RGBA ("$R","$G","$B","{round($A)}")",{$x0+115},{$y1+8},14,1,0 else t. "RGB ("$R","$G","$B")",{$x0+115},{$y1+8},14,1,0 fi - ({'${dec2hex\ {$R*65536+$G*256+$B}}'}) -. {'0'} r. 6,1,1,1,0,0,1,0 +. {'0'} + ('${dec2hex\ {$R*65536+$G*256+$B}}') -. {'0'} r. 6,1,1,1,0,0,1,0 +. {'0'} f. if(i>=_'a'" && "i<=_'z',i+_'A'-_'a',i) t.. "HTML ""#"{t},{$x0+115},{$y1+40},14,1,0 rm. w. 100%,100%,0 rm. @@ -23634,40 +28760,45 @@ # Manage window size. ww={*,w} wh={*,h} - is_ctrl={{*,CTRLLEFT}||{*,CTRLRIGHT}} + is_ctrl={{*,CTRLLEFT}" || "{*,CTRLRIGHT}} if {*,r} ww={*,d} wh={*,e} - elif {$is_ctrl" && "{*,-D}} ww={1.25*$ww} wh={1.25*$wh} - elif {$is_ctrl" && "{*,-C}} ww={0.8*$ww} wh={0.8*$wh} - elif {$is_ctrl" && "{*,R}} ww={400+24*$rgba_mode} wh=400 + elif $is_ctrl" && "{*,-D} ww={1.25*$ww} wh={1.25*$wh} + elif $is_ctrl" && "{*,-C} ww={0.8*$ww} wh={0.8*$wh} + elif $is_ctrl" && "{*,R} ww={400+24*$rgba_mode} wh=400 fi ww={max(200,$ww)} wh={max(200,$wh)} - if {$ww!={*,w}" || "$wh!={*,h}} w[] $ww,$wh rm fi + if $ww!={*,w}" || "$wh!={*,h} w[] $ww,$wh rm fi # Manage user events. - if {$b&1" && "$x>=0" && "$y>=0} - if {!$is_h" && "!$is_a" && "($is_sv" || "($x>=$x0" && "$x<=$x1" && "$y>=$y0" && "$y<=$y1))} # SV selection. + if $b&1" && "$x>=0" && "$y>=0 + if !$is_h" && "!$is_a" && "($is_sv" || "($x>=$x0" && "$x<=$x1" && "$y>=$y0" && "$y<=$y1)) # SV selection S={max(0,min(1,1-($y-$y0)/($y1-$y0)))} V={max(0,min(1,($x-$x0)/($x1-$x0)))} update_view=1 colordb=0 is_sv=1 k[0] - elif {!$is_sv" && "!$is_a" && "($is_h" || "($x>=$x2" && "$x<=$x3" && "$y>=$y0" && "$y<=$y1))} # H selection. + elif !$is_sv" && "!$is_a" && "($is_h" || "($x>=$x2" && "$x<=$x3" && "$y>=$y0" && "$y<=$y1)) # H selection H={max(0,min(359,359-($y-$y0)*359/($y1-$y0)))} colordb=0 is_h=1 rm - elif {!$is_sv" && "!$is_h" && "($is_a" || "($x>=$x4" && "$x<=$x5" && "$y>=$y0" && "$y<=$y1))} # A selection. + elif !$is_sv" && "!$is_h" && "($is_a" || "($x>=$x4" && "$x<=$x5" && "$y>=$y0" && "$y<=$y1)) # A selection A={round(max(0,min(255,255-($y-$y0)*255/($y1-$y0))))} colordb=0 is_a=1 update_view=1 k[0] - elif {!$is_sv" && "!$is_h" && "!$is_a" && "{narg($_xsc_old)}" && "$x>=$x0+55" && "$x<=$x0+102" && "$y>=$y1+32" && "$y<=$y1+47} # Old color. + elif !$is_sv" && "!$is_h" && "!$is_a" && "{narg($_xsc_old)}" && "$x>=$x0+55" && "$x<=$x0+102" && "\ + $y>=$y1+32" && "$y<=$y1+47 # Old color ($_xsc_old) y. c sh. 0,2 rgb2hsv. rm. H={i[0]} S={i[1]} V={i[2]} A={i[3]} colordb=0 rm - elif {!$is_sv" && "!$is_h" && "!$is_a" && "$x>=$x6" && "$x<=$x5" && "$y>=$y6" && "$y<=$y6+50" && "($x-$x6)%25<=20" && "($y-$y6)%25<=20} # Preset. + elif !$is_sv" && "!$is_h" && "!$is_a" && "$x>=$x6" && "$x<=$x5" && "$y>=$y6" && "$y<=$y6+50" && "\ + ($x-$x6)%25<=20" && "($y-$y6)%25<=20 # Preset. p={int(($x-$x6)/25)+6*int(($y-$y6)/25)} (${_xsc_preset$p}) -. 255 r. 4,1,1,1,0 +. 255 y. c sh. 0,2 rgb2hsv. rm. H={i[0]} S={i[1]} V={i[2]} A={i[3]} colordb=0 rm - elif {!$is_sv" && "!$is_h" && "!$is_a" && "$x>=$x0+55" && "$x<=$x0+102" && "$y>=$y1+10" && "$y<=$y1+27} # Add current as old and/or preset. + elif !$is_sv" && "!$is_h" && "!$is_a" && "$x>=$x0+55" && "$x<=$x0+102" && "$y>=$y1+10" && "$y<=$y1+27 + # Add current as old and/or preset. _xsc_old=$R,$G,$B,$A colordb={($colordb+1)%2} - if {!$colordb} _xsc_preset$_xsc_preset=$R,$G,$B,$A _xsc_preset={($_xsc_preset-1)%12} fi # Double-click to add to preset. + if !$colordb # Double-click to add to preset. + _xsc_preset$_xsc_preset=$R,$G,$B,$A _xsc_preset={($_xsc_preset-1)%12} + fi rm wait -1 else colordb=0 fi - elif {!$b} is_sv=0 is_h=0 is_a=0 + elif !$b is_sv=0 is_h=0 is_a=0 fi if {*,ARROWUP} colordb=0 S={min(1,$S+1/256)} update_view=1 k[0] wait -1 elif {*,ARROWDOWN} colordb=0 S={max(0,$S-1/256)} update_view=1 k[0] wait -1 @@ -23678,17 +28809,17 @@ fi # Check RGB variable modification from another thread. - if {['$$1']=='-1'} break fi # Close request - if {(($rgba_mode" && "['$$1']!='$R,$G,$B,$A')" || "(!$rgba_mode" && "['$$1']!='$R,$G,$B'))" && "$x<0" && "$y<0" && "!$is_sv" && "!$is_h" && "!$is_a} + if ['$$1']=='-1' break fi # Close request + if (($rgba_mode" && "['$$1']!='$R,$G,$B,$A')" || "(!$rgba_mode" && "['$$1']!='$R,$G,$B'))" && "\ + $x<0" && "$y<0" && "!$is_sv" && "!$is_h" && "!$is_a ($$1) y. c -. 255 r. 1,1,1,4,0 +. 255 sh. 0,2 rgb2hsv. rm. H={i[0]} S={i[1]} V={i[2]} A={i[3]} rm fi - while {{*}" && "!{*,ESC}" && "!{*,Q}} + while {*}" && "!{*,ESC}" && "!{*,Q} rm w 0 if $rgba_mode u $R,$G,$B,$A else u $R,$G,$B fi _xsc_old=${} - v + #@cli x_select_function1d : _variable_name,_background_curve_R,_background_curve_G,_background_curve_B #@cli : Open an interactive window, where the user can defined its own 1D function. @@ -23697,22 +28828,21 @@ #@cli : - The 2nd, 3rd and 4th rows define the R,G,B color components displayed beside the X and Y axes. #@cli : Argument 'variable_name' specifies the variable that contains the selected function keypoints at any time. #@cli : Assigning '-1' to it forces the interactive window to close. -#@cli : Default values: 'variable_name=xsf_variable', 'background_curve_R=220', 'background_curve_G=background_curve_B=background_curve_T'. -x_select_function1d : skip ${1=xsf_variable},${2=220},${3=$2},${4=$2} - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi +#@cli : Default values: 'variable_name=xsf_variable', 'background_curve_R=220', \ +# 'background_curve_G=background_curve_B=background_curve_T'. +x_select_function1d : skip ${1=xsf_variable},${2=220},${3=$2},${4=$2} check_display e[^-1] "Open 1D function widget, with variable name '$1'." - v - if $! k[0] fi is_additional_data=$! - if {!{*}} w[] 400,400,0,"Create a 1D function" fi + if !{*} w[] 400,400,0,"Create a 1D function" fi reset_w={*,w} reset_h={*,h} - if {!narg($$1)} $1=0,0,100,100 fi - i[points] ($$1) y. x r. 2,{w/2},1,1,-1 + if !narg($$1) $1=0,0,100,100 fi + ($$1) nm. points y. x r. 2,{w/2},1,1,-1 is_thread_variable={arg(1,{'$1'})==_'_'" && "arg(2,{'$1'})==_'_'} selected=-1 X=-1 Y=-1 do # Update base view. - if {!narg($baseview)} + if !narg($baseview) {{*,d}-48},{{*,e}-48},1,3,255 if $is_additional_data # Render background graph. 100%,100% +rows[0] 0 graph.. .,3,0,0,0,1,1 rm. c. 0,1 @@ -23722,8 +28852,8 @@ line. 0,100%,100%,0,0.2,0 frame. 24,24,200 rectangle. 23,23,{w-24},{h-24},1,0xFFFFFFFF,232 line. 23,23,23,{h-24},1,128 line. 23,23,{w-24},23,1,128 - if {$is_additional_data" && "{0,h}>1} # Render colored X-axis guide. - if {{0,h}>2} +rows[0] 1,3 else +rows[0] 1 r. 100%,3 fi + if $is_additional_data" && "{0,h}>1 # Render colored X-axis guide. + if {0,h}>2 +rows[0] 1,3 else +rows[0] 1 r. 100%,3 fi r. {-2,w-48},3,1,1,3 permute. xzcy r. 100%,8 frame. 1,1,0 j.. .,23,{-2,h-19} rotate. -90 j.. .,{-2,w-19},23 rm. fi @@ -23732,7 +28862,7 @@ fi # Update view. - if {!narg($view)} + if !narg($view) +z[baseview] 24,24,{baseview,w-25},{baseview,h-25} r. 200%,200% # Draw curve. @@ -23747,11 +28877,11 @@ j3d.. .,0,100%,0,1,1,0,0 rm. # Draw control points. - repeat {points,h} + repeat h#$points x={points,i(0,$>)} y={100-{points,i(1,$>)}} circle. $x%,$y%,6,1,0xFFFFFFFF,0 done - if {$selected>=0} + if $selected>=0 x={points,i(0,$selected)} y={100-{points,i(1,$selected)}} circle. $x%,$y%,3,1,0 fi @@ -23760,7 +28890,7 @@ +j[baseview] .,24,24 rm.. # Draw current coordinates. - if {$X>=0" && "$Y>=0} t. "X: "{min(255,round(255*$X/100))}" Y: "{min(255,round(255*$Y/100))},24,6,12,1 fi + if $X>=0" && "$Y>=0 t. "X: "{min(255,round(255*$X/100))}" Y: "{min(255,round(255*$Y/100))},24,6,12,1 fi nm. view w[view] fi @@ -23772,61 +28902,62 @@ X={($x-24)*100/({*,w}-49)} Y={100-($y-24)*100/({*,h}-49)} oww={*,w} owh={*,h} ww=$oww wh=$owh if {*,r} ww={*,d} wh={*,e} # Resize window. - elif {$is_ctrl" && "{*,-D}} ww={view,w*125%} wh={view,h*125%} # Increase window size. - elif {$is_ctrl" && "{*,-C}} ww={view,w*75%} wh={view,h*75%} # Decrease window size. - elif {$is_ctrl" && "{*,R}} ww=$reset_w wh=$reset_h # Reset window size. - elif {!$is_ctrl" && "{*,R}} rm[points] i[points] (0,0;100,100) $1={points,^} rm[view] # Reset keypoints. - elif {$b&3} # Add/move/delete point. + elif $is_ctrl" && "{*,-D} ww={view,w*125%} wh={view,h*125%} # Increase window size. + elif $is_ctrl" && "{*,-C} ww={view,w*75%} wh={view,h*75%} # Decrease window size. + elif $is_ctrl" && "{*,R} ww=$reset_w wh=$reset_h # Reset window size. + elif !$is_ctrl" && "{*,R} rm[points] (0,0;100,100) nm. points $1={points,^} rm[view] # Reset keypoints. + elif $b&3 # Add/move/delete point. is_inside={$X>=0" && "$Y>=0" && "$X<=100" && "$Y<=100} # Check for a point selection. - if {$selected<0} +f[points] 'sqrt((i-$X)^2+(j(1)-$Y)^2)*{*,w}%' z. 0,0 selected={if(im>8,-1,ym)} rm. fi + if $selected<0 +f[points] 'sqrt((i-$X)^2+(j(1)-$Y)^2)*{*,w}%' z. 0,0 selected={if(im>8,-1,ym)} rm. fi - if {$x>=0" && "$b&1" && "$selected>=0} # Move an existing point. - if {{*,SHIFTLEFT}||{*,SHIFTRIGHT}} X={points,i(0,$selected)} fi - if {{*,CTRLLEFT}||{*,CTRLRIGHT}} Y={points,i(1,$selected)} fi + if $x>=0" && "$b&1" && "$selected>=0 # Move an existing point. + if {*,SHIFTLEFT}" || "{*,SHIFTRIGHT} X={points,i(0,$selected)} fi + if {*,CTRLLEFT}" || "{*,CTRLRIGHT} Y={points,i(1,$selected)} fi if {points,$selected>0" && "$selected8,-1,ym)} $1={points,^} rm[view,-1] - elif {$b&2" && "$selected>0" && "$selected<{points,h-1}" && "$is_inside} # Delete an existing point. + elif $b&2" && "$selected>0" && "$selected<{points,h-1}" && "$is_inside # Delete an existing point. l[points] s y rm[$selected] a y endl wait -1 selected=-1 $1={points,^} rm[view] fi - elif {!($b&1)} selected=-1 + elif !($b&1) selected=-1 fi # Manage window size. ww={min(90%*{*,u},max(200,$ww))} wh={min(90%*{*,v},max(200,$wh))} - if {$oww!=$ww" || "$owh!=$wh} w[] $ww,$wh rm[baseview,view] fi + if $oww!=$ww" || "$owh!=$wh w[] $ww,$wh rm[baseview,view] fi # Check points variable modification from another thread. - if {['$$1']=='-1'} break fi # Close request - if {['$$1']!=['{points,^}']} rm[points] i[points] ($$1) y. x r. 2,{w/2},1,1,-1 l rm[view] onfail endl fi # Keypoints changed. + if ['$$1']=='-1' break fi # Close request + if ['$$1']!=['{points,^}'] # Keypoints changed + rm[points] ($$1) nm. points y. x r. 2,{w/2},1,1,-1 l rm[view] onfail endl + fi - while {{*}" && "!{*,ESC}" && "!{*,Q}} + while {*}" && "!{*,ESC}" && "!{*,Q} w[] 0 u {points,^} if $is_additional_data rm[^0] else rm fi - v + #@cli x_select_palette : _variable_name,_number_of_columns={ 0=auto | >0 } #@cli : Open a RGB or RGBA color selector widget from a palette. #@cli : The palette is given as a selected image. -#@cli : Argument 'variable_name' specifies the variable that contains the selected color values (as R,G,B,[A]) at any time. +#@cli : Argument 'variable_name' specifies the variable that contains the selected color values (as R,G,B,[A]) +#@cli : at any time. #@cli : Assigning '-1' to it forces the interactive window to close. #@cli : Default values: 'variable_name=xsp_variable' and 'number_of_columns=2'. -x_select_palette : skip ${1=xsp_variable},${2=0} - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - if {!$!} error[0--3] "Command '$0': Missing specified palette image." fi - v - k[0] +r {w*h*d},1,1,{s},-1 to_color. rgba_mode={s==4} to_rgba. nm. palette v + +x_select_palette : skip ${1=xsp_variable},${2=0} check_display + if !$! error[0--3] "Command '$0': Missing specified palette image." fi + k[0] +r {w*h*d},1,1,{s},-1 to_color. rgba_mode={s==4} to_rgba. nm. palette e[^-1] "Open "${arg\ 1+$rgba_mode,RGB,RGBA}" color selector widget for palette$?, with variable name '$1'." - v - - if {w>1024} v + error[0--3] "Command '$0': Too much colors ("{w}") in selected palette." fi - if {!{*}} w[] 400,400,0,0,-1,-1,"Palette: "{0,b} fi + + if w>1024 error[0--3] "Command '$0': Too much colors ("{w}") in selected palette." fi + if !{*} w[] 400,400,0,0,-1,-1,"Palette: "{0,b} fi selected=-1 oselected=-1 do @@ -23835,15 +28966,15 @@ B={palette,round(i($selected,0,0,2))} A={palette,round(i($selected,0,0,3))} # Update color in specified variable. - if {$selected>=0" && "$oselected!=$selected} + if $selected>=0" && "$oselected!=$selected if $rgba_mode $1=$R,$G,$B,$A else $1=$R,$G,$B fi fi # Check close request from external thread. - if {['$$1']=='-1'} break fi + if ['$$1']=='-1' break fi # Create base view. - if {!narg($baseview)} l[palette] + if !narg($baseview) l[palette] {w},1,1,1,x +. 1 s. x append_tiles[^0] $2 M={w} N={h} 100%,100%,1,1,1 @@ -23860,13 +28991,13 @@ mv... $! +. 1 a[-3--1] c nm. baseview endl - if {narg($view)} rm[view] fi + if narg($view) rm[view] fi fi # Create and display view. - if {!narg($view)} + if !narg($view) $ww,$wh,1,3,200 - if {$selected<0} sh[baseview] 0,2 + if $selected<0 sh[baseview] 0,2 else +channels[baseview] 0,2 +channels[baseview] 4,4 !=. {$selected+1} rectangle. 0,0,100%,100%,1,0xFFFFFFFF,1 @@ -23877,7 +29008,7 @@ fi ($R^$G^$B) rgb2hsv. H={round(i[0])} S={round(i[1]*255)} V={round(i[2]*255)} rm. t.. "HSV ("$H","$S","$V")",8,{$wh-31},14,1,0 - ({'${dec2hex\ {$R*65536+$G*256+$B}}'}) -. {'0'} r. 6,1,1,1,0,0,1,0 +. {'0'} + ('${dec2hex\ {$R*65536+$G*256+$B}}') -. {'0'} r. 6,1,1,1,0,0,1,0 +. {'0'} f. if(i>=_'a'" && "i<=_'z',i+_'A'-_'a',i) t... "HTML ""#"{t},8,{$wh-17},14,1,0 rm. fi @@ -23885,42 +29016,40 @@ nm. view w[view] fi - if {arg(1,{'$1'})==_'_'" && "arg(2,{'$1'})==_'_'} wait 50 else wait fi + if arg(1,{'$1'})==_'_'" && "arg(2,{'$1'})==_'_' wait 50 else wait fi # Manage window size. - is_ctrl={{*,CTRLLEFT}||{*,CTRLRIGHT}} + is_ctrl={{*,CTRLLEFT}" || "{*,CTRLRIGHT}} if {*,r} ww={*,d} wh={*,e} - elif {$is_ctrl" && "{*,-D}} ww={1.25*$ww} wh={1.25*$wh} - elif {$is_ctrl" && "{*,-C}} ww={0.8*$ww} wh={0.8*$wh} - elif {$is_ctrl" && "{*,R}} ww=400 wh=400 + elif $is_ctrl" && "{*,-D} ww={1.25*$ww} wh={1.25*$wh} + elif $is_ctrl" && "{*,-C} ww={0.8*$ww} wh={0.8*$wh} + elif $is_ctrl" && "{*,R} ww=400 wh=400 fi ww={max(200,$ww)} wh={max(200,$wh)} - if {($ww!={*,w}" || "$wh!={*,h})" && "narg($baseview)} w[] $ww,$wh rm[baseview] fi + if ($ww!={*,w}" || "$wh!={*,h})" && "narg($baseview) w[] $ww,$wh rm[baseview] fi # Handle user events. oselected=$selected - if {narg($baseview)} + if narg($baseview) x={*,x} y={*,y} b={*,b} - if {$b&1" && "$x>=0" && "$y>=0} # Select color. + if $b&1" && "$x>=0" && "$y>=0 # Select color. if {baseview,i($x-8,$y-8,0,4)} selected={baseview,i($x-8,$y-8,0,4)-1} else selected=-1 fi rm[view] wait -1 - elif {{*,ARROWUP}" && "$selected>=$M} selected-=$M rm[view] wait -1 - elif {{*,ARROWDOWN}" && "$selected<{0,w-$M}} selected+=$M rm[view] wait -1 - elif {{*,ARROWRIGHT}" && "$selected<{0,w-1}} selected+=1 rm[view] wait -1 - elif {{*,ARROWLEFT}" && "$selected>0} selected-=1 rm[view] wait -1 + elif {*,ARROWUP}" && "$selected>=$M selected-=$M rm[view] wait -1 + elif {*,ARROWDOWN}" && "$selected<{0,w-$M} selected+=$M rm[view] wait -1 + elif {*,ARROWRIGHT}" && "$selected<{0,w-1} selected+=1 rm[view] wait -1 + elif {*,ARROWLEFT}" && "$selected>0 selected-=1 rm[view] wait -1 fi fi - while {{*}" && "!{*,ESC}" && "!{*,Q}} + while {*}" && "!{*,ESC}" && "!{*,Q} w 0 k[0] - if {$selected>=0} if $rgba_mode u $R,$G,$B,$A else u $R,$G,$B fi else u -1 fi - v + + if $selected>=0 if $rgba_mode u $R,$G,$B,$A else u $R,$G,$B fi else u -1 fi #@cli x_shadebobs #@cli : Launch the shade bobs demo. -x_shadebobs : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_shadebobs : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Shade bobs"$n" -------------------------------\n ----\n @@ -23929,12 +29058,12 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n -------------------------------------------------" - v - rm t=100 w 512,512,0,"[G"{`39`}"MIC] Shade Bobs" + rm t=100 w 512,512,0,"[G"{`39`}"MIC] Shade Bobs" # Start animation loop. do t+=0.015 - if {$t>4*pi" || "{*,b}} # Reset motions variables if necessary. + if $t>4*pi" || "{*,b} # Reset motions variables if necessary. rx={u(-1,1)} ry={u(-1,1)} rz={u(-1,1)} rt={u(-1,1)} rcx={u(-0.6*0.6)} t=0 N={20+round(u(80))} R={(2+round(u(40)))*min({*,w},{*,h})/300} if $obj3d rm[colormap,img,obj3d] fi @@ -23957,15 +29086,14 @@ # Draw bobs, map colors and display. j3d[img] [obj3d],50%,50%,0,-1,2,0,0 &[img] 255 +map[img] [colormap] w. rm. wait 20 - if {{*,CTRLLEFT}&&{*,D}} w[] 1024,1024 elif {{*,CTRLLEFT}&&{*,C}} w[] 512,512 fi - while {{*}" && "!{*,ESC}" && "!{*,Q}} - rm w 0 v + + if {*,CTRLLEFT}" && "{*,D} w[] 1024,1024 elif {*,CTRLLEFT}" && "{*,C} w[] 512,512 fi + while {*}" && "!{*,ESC}" && "!{*,Q} + rm w 0 #@cli x_spline #@cli : Launch spline curve editor. -x_spline : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_spline : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Spline curve editor"$n" --------------------------\n ----\n @@ -23983,9 +29111,8 @@ -----------------------------------------------------" # Init display and variables. - v - if $! a x n 0,255 to_rgb else (0;0^0;128^0;0) r. 512,512,1,3,3 nm. "[G"{`39`}"MIC] Spline Editor" fi - w[0] {0,w},{0,h},0,0,-1,-1,{n} r[0] {*,w},{*,h},1,3,1 + w[0] {0,w},{0,h},0,0,{n} r[0] {*,w},{*,h},1,3,1 i[1] 1 # Point coordinates roundness=0.5 # Curve roundness visuflags=23 # Visualisation flags @@ -23996,7 +29123,7 @@ do # Init coordinates [1] if necessary. - if {{1,whds}==1} + if {1,whds}==1 rm[1] roundness=0.5 nearest=-1 active=-1 i[1] ({0.2*w},{0.2*h};\ {0.2*w},{0.8*h};\ @@ -24011,88 +29138,88 @@ # Display curve, control points, polygon and tangents. +r[0] {*,w},{*,h},1,3 - if {$visuflags&4} polygon. {2,h},{2,^},0.3,128,200,255 fi - repeat {1,h} + if $visuflags&4 polygon. {2,h},{2,^},0.3,128,200,255 fi + repeat h#1 line. {2,@0-3},0.3,255,255,0 - if {$visuflags&1} spline. {2,@0-1},{3,@0-1},{2,@2-3},{3,@2-3},1,255 fi - if {$visuflags&8} line. {{2,@0}-{4,@0}*20},{{2,@1}-{4,@1}*20},{{2,@0}+{4,@0}*20},{{2,@1}+{4,@1}*20},1,0,255,0 fi - if {$visuflags&16} t. $>,{{2,@0}-3},{{2,@1}-18},13,1,255,255,0 fi - if {$visuflags&32} t. "("{round({1,@0})}","{round({1,@1})}")",{{2,@0}-16},{{2,@1}+10},13,1,100,200,255 fi + if $visuflags&1 spline. {2,@0-1},{3,@0-1},{2,@2-3},{3,@2-3},1,255 fi + if $visuflags&8 line. {{2,@0}-{4,@0}*20},{{2,@1}-{4,@1}*20},{{2,@0}+{4,@0}*20},{{2,@1}+{4,@1}*20},1,0,255,0 fi + if $visuflags&16 t. $>,{{2,@0}-3},{{2,@1}-18},13,1,255,255,0 fi + if $visuflags&32 t. "("{round({1,@0})}","{round({1,@1})}")",{{2,@0}-16},{{2,@1}+10},13,1,100,200,255 fi shift[1-4] 0,-1,0,0,2 done - if {$visuflags"&2"} repeat {1,h} + if $visuflags&2 repeat h#1 ellipse. {2,@0-1},4,4,0,1,0,0,0 ellipse. {2,@0-1},2,2,0,1,255,100,155 shift[2] 0,1,0,0,2 done fi w. rm[3,4,-1] wait # Handle key events. - if {*,SPACE} visuflags+={if($visuflags&1,-1,1)} wait -1 fi # Show/hide spline. - if {*,P} visuflags+={if($visuflags&2,-2,2)} wait -1 fi # Show/hide points. - if {*,ENTER} visuflags+={if($visuflags&4,-4,4)} wait -1 fi # Show/hide polygon. - if {*,T} visuflags+={if($visuflags&8,-8,8)} wait -1 fi # Show/hide tangents. - if {*,I} visuflags+={if($visuflags&16,-16,16)} wait -1 fi # Show/hide indices. - if {{*,C}" && "!{*,CTRLLEFT}" && "!{*,CTRLRIGHT}} visuflags+={if($visuflags&32,-32,32)} wait -1 fi # Show/hide coordinates. - if {{*,PADADD}" && "$roundness<1} roundness*=1.1 wait -1 fi # Increase roundness. - if {{*,PADSUB}" && "$roundness>0.1} roundness*=0.9 wait -1 fi # Decrease roundness. - if {{*,R}" && "!{*,CTRLLEFT}" && "!{*,CTRLRIGHT}} rm. i[1] 1 wait -1 fi # Reset curve. - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,D}} w[] {{*,w}*1.5},{{*,h}*1.5} fi # Increase window size. - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,C}} w[] {{*,w}/1.5},{{*,h}/1.5} fi # Decrease window size. - if {({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,R}} w[] {0,w},{0,h} fi # Reset window size. + if {*,SPACE} visuflags+={if($visuflags&1,-1,1)} wait -1 fi # Show/hide spline + if {*,P} visuflags+={if($visuflags&2,-2,2)} wait -1 fi # Show/hide points + if {*,ENTER} visuflags+={if($visuflags&4,-4,4)} wait -1 fi # Show/hide polygon + if {*,T} visuflags+={if($visuflags&8,-8,8)} wait -1 fi # Show/hide tangents + if {*,I} visuflags+={if($visuflags&16,-16,16)} wait -1 fi # Show/hide indices + if {*,C}" && "!{*,CTRLLEFT}" && "!{*,CTRLRIGHT} # Show/hide coordinates + visuflags+={if($visuflags&32,-32,32)} wait -1 fi + if {*,PADADD}" && "$roundness<1 roundness*=1.1 wait -1 fi # Increase roundness + if {*,PADSUB}" && "$roundness>0.1 roundness*=0.9 wait -1 fi # Decrease roundness + if {*,R}" && "!{*,CTRLLEFT}" && "!{*,CTRLRIGHT} rm. i[1] 1 wait -1 fi # Reset curve + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,D} w[] {{*,w}*1.5},{{*,h}*1.5} fi # Increase window size + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,C} w[] {{*,w}/1.5},{{*,h}/1.5} fi # Decrease window size + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,R} w[] {0,w},{0,h} fi # Reset window size if {*,r} w[] fi # Resize window if necessary. # Set/unset active point. - if {{*,b}==0} active=-1 # Unset active point if mouse button is released. - elif {{*,x}>=0" && "{*,b}" && "$active==-1} # Find new active point. - [2] ({*,x},{*,y}) -[-2,-1] sqr. s. x +[-2,-1] # Compute distance vector to points. - nearest={ym} # Set nearest point. - if {im<64} active=$nearest fi # Set it as active point, if near enough. + if {*,b}==0 active=-1 # Unset active point if mouse button is released + elif {*,x}>=0" && "{*,b}" && "$active==-1 # Find new active point + [2] ({*,x},{*,y}) -[-2,-1] sqr. s. x +[-2,-1] # Compute distance vector to points + nearest={ym} # Set nearest point + if im<64 active=$nearest fi # Set it as active point, if near enough rm. fi rm[2] # Move active point. - if {{*,b}&1" && "{*,x}>=0" && "$active!=-1} + if {*,b}&1" && "{*,x}>=0" && "$active!=-1 =[1] {{*,x}*{0,w}/{*,w}},0,$active =[1] {{*,y}*{0,h}/{*,h}},1,$active # Delete nearest point. - elif {{*,b}&2" && "{*,x}>=0" && "{1,h}>3} + elif {*,b}&2" && "{*,x}>=0" && "{1,h}>3 l[1] s y rm[$nearest] a y endl wait -1 # Insert new active point. - elif {{*,b}&1" && "{*,x}>=0} - xy=({{*,x}*{0,w}/{*,w}},{{*,y}*{0,h}/{*,h}}) # Point coordinates in the image basis. - +shift[1] 0,-1,0,0,2 +. [1] /. 2 # Compute center of segments. - $xy -[-2,-1] sqr. s. x +[-2,-1] # Compute distance vector to segments. - ns={ym} rm. # Get nearest segment. - l[1] s y i[{$ns+1}] $xy a y endl # Insert new point at right position. - active={$ns+1} # Set new active point as newly inserted. + elif {*,b}&1" && "{*,x}>=0 + xy=({{*,x}*{0,w}/{*,w}},{{*,y}*{0,h}/{*,h}}) # Point coordinates in the image basis + +shift[1] 0,-1,0,0,2 +. [1] /. 2 # Compute center of segments + $xy -[-2,-1] sqr. s. x +[-2,-1] # Compute distance vector to segments + ns={ym} rm. # Get nearest segment + l[1] s y i[{$ns+1}] $xy a y endl # Insert new point at right position + active={$ns+1} # Set new active point as newly inserted fi - while {{*}" && "!{*,ESC}" && "!{*,Q}} + while {*}" && "!{*,ESC}" && "!{*,Q} # Render spline as a tertiary mask for output. +shift[1] 0,-1,0,0,2 +shift[1] 0,1,0,0,2 -[-2,-1] *. $roundness [0],[0],1,1,2 rm[0] - repeat {1,h} spline. {0,@0-1},{1,@0-1},{0,@2-3},{1,@2-3},1,1 shift[0] 0,-1,0,0,2 shift[1] 0,-1,0,0,2 done + repeat h#1 spline. {0,@0-1},{1,@0-1},{0,@2-3},{1,@2-3},1,1 shift[0] 0,-1,0,0,2 shift[1] 0,-1,0,0,2 done flood. 0,0,0,0,0,1,0 # Exit properly. - rm[0,1] w 0 v + + rm[0,1] w 0 #@cli x_starfield3d #@cli : Launch the 3D starfield demo. -x_starfield3d : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_starfield3d : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"3D starfield"$n" ---------------------------------------\n ----\n ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n -----------------------------------------------------------" - v - l[] - ({'G\47MIC'}) s x + l[] + ('G\47MIC') s x x=0 N=$! repeat $N 0 t. {$>,t},0,0,48,1,1 x$>=$x y$>=0 z$>={-3200-150*$>} x={$x+w+8} done k[50%--1] expand_xy 6,0 dilate_circ 5 b 0.5 expand_z 1,0 isosurface3d 10% *3d 1,1,5 rv3d repeat $N col3d[$>] ${-RGB} done @@ -24129,23 +29256,22 @@ done # Presents. - if {$t<280} op={max(0,min(1,($t-200)/20))} + if $t<280 op={max(0,min(1,($t-200)/20))} else op={max(0,1-($t-280)/20)} fi j. ...,{(w-{-3,w})/2},120,0,0,$op,[-4] w. wait 30 rm. t0+=1 t={$t0%350} - if {!$t} x=0 repeat 5 z$>={-3200-150*$>} done fi + if !$t x=0 repeat 5 z$>={-3200-150*$>} done fi - while {{*}" && "!{*,ESC}" && "!{*,Q}} - w[] 0 rm endl v + + while {*}" && "!{*,ESC}" && "!{*,Q} + w[] 0 rm endl #@cli x_tetris #@cli : Launch tetris game. -x_tetris : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_tetris : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Tetris"$n" --------------------------------------------\n ----\n @@ -24156,29 +29282,33 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n ----------------------------------------------------------" - v - rm + rm # Init board and triominos shapes. - i[m0] 4,1,1,1,1,1,1,1 - i[m4] 3,2,1,1,1,0,0,1,1,1 - i[m8] 3,2,1,1,0,0,1,1,1,1 - i[m12] 2,2,1,1,1,1,1,1 - i[m16] 3,2,1,1,0,1,1,1,1,0 - i[m20] 3,2,1,1,0,1,0,1,1,1 - i[m24] 3,2,1,1,1,1,0,0,1,1 - if {u<0.25} # Enable extended set. - i[m28] 2,1,1,1,1,1 - i[m32] 2,2,1,1,1,1,0,1 - i[m36] 3,1,1,1,1,1,1 - i[m40] 1,1,1,1,1 - i[m44] 3,2,1,1,1,1,1,1,0,1 - i[m48] 3,3,1,1,1,1,1,1,0,1,1,1,1 + 4,1,1,1,1,1,1,1 + 3,2,1,1,1,0,0,1,1,1 + 3,2,1,1,0,0,1,1,1,1 + 2,2,1,1,1,1,1,1 + 3,2,1,1,0,1,1,1,1,0 + 3,2,1,1,0,1,0,1,1,1 + 3,2,1,1,1,1,0,0,1,1 + nm[-7--1] m0,m4,m8,m12,m16,m20,m24 + + if u<0.25 # Enable extended set. + i 2,1,1,1,1,1 + i 2,2,1,1,1,1,0,1 + i 3,1,1,1,1,1,1 + i 1,1,1,1,1 + i 3,2,1,1,1,1,1,1,0,1 + i 3,3,1,1,1,1,1,1,0,1,1,1,1 + nm[-6--1] m28,m32,m36,m40,m44,m48 fi repeat $! i={4*$>} l[m$i] repeat 3 +rotate[0] {90*($>+1)} nm. m{$i+$>+1} done endl done N=$! # Render triomino colored sprites. - i[colors] 3,$N,1,1,'u(16,224)' r. 3,400% i[mask] (0,-1,0;1,0,-1;0,1,0) *. 120 + 3,$N,1,1,'u(16,224)' r. 3,400% nm. colors + (0,-1,0;1,0,-1;0,1,0) *. 120 nm. mask repeat $N +r[m$>] 500%,500%,1,3 +correlate. [mask],0 r. 200%,200%,1,1,3 r.. . *[-2,-1] c. 30%,100% +r[m$>] .,.,1,3 +replace_color. 0,0,1,1,1,{colors,@{3*$>}-{3*$>+2}} rv[-3,-1] +[-3,-1] c.. 0,255 @@ -24189,8 +29319,8 @@ # Generate board and background. W=12 H=20 - i[board] $W,$H i[curr_board] [board] - i[render] {$fact*$W},{$fact*$H},1,3 i[curr_render] [render] +channels. 0 nm. curr_render_mask + $W,$H . nm[-2,-1] board,curr_board + {$fact*$W},{$fact*$H},1,3 . nm[-2,-1] render,curr_render +channels. 0 nm. curr_render_mask +rows[render] 0,50% plasma. 1,2 noise. 20 blur_y. 40%,1 +mirror. y a[-2,-1] y r. [render] n. 0,64 blur_x. 1 100%,100% noise. 0.5,2 ==. 1 b. 1 *. 300 +[-2,-1] c. 0,255 nm. background @@ -24207,18 +29337,18 @@ fi # Check for completed lines and select new random triomino. - if {$n<0} + if $n<0 l[board] s y i=-1 repeat $! if {$<,im} i=$<,$i fi done 0 rm[$i] a y score+={2^(narg($i)-1)-1} r $W,$H,1,1,0,0,0,1 nm board endl - if {narg($i)>1} l[render] s y,$H 0 rm[$i] a y r {$fact*$W},{$fact*$H},1,3,0,0,0,1 nm render endl fi + if narg($i)>1 l[render] s y,$H 0 rm[$i] a y r {$fact*$W},{$fact*$H},1,3,0,0,0,1 nm render endl fi n=$nn nn={round(u(0,$N-1))} x={$W/2} y=0 do_render=1 fall_mode=0 fi # Render board at current time. if $do_render rm[curr_board,curr_render,curr_render_mask] - i[curr_board] [board] j[curr_board] [m$n],{$x-int({m$n,w}/2)},$y,0,0,1,[m$n] - i[curr_render] [render] sh[s$n] 3 j[curr_render] [s$n],{$fact*($x-int({m$n,w}/2))},{$fact*$y},0,0,1,.,255 rm. + [board] nm. curr_board j[curr_board] [m$n],{$x-int({m$n,w}/2)},$y,0,0,1,[m$n] + [render] nm. curr_render sh[s$n] 3 j[curr_render] [s$n],{$fact*($x-int({m$n,w}/2))},{$fact*$y},0,0,1,.,255 rm. +*[curr_board] 255 r. [curr_render],[curr_render] nm. curr_render_mask 0 t. "Score : "$score" Next :",4,0,32,1,164 r. 40%,40%,1,3,2 +!=. 0 *. 255 j[curr_render] ..,0,0,0,0,1,.,255 j[curr_render_mask] .,0,0,0,0,1,.,255 rm[-2,-1] @@ -24232,34 +29362,80 @@ # Manage user interactions. if {*,SPACE} fall_mode=1 fi - if {{*,ARROWUP}" || "{*,ARROWLEFT}" || "{*,ARROWRIGHT}} + if {*,ARROWUP}" || "{*,ARROWLEFT}" || "{*,ARROWRIGHT} an={if({*,ARROWUP},n=$n+1;if(n%4,n,n-4),$n)} nx={w2=int({m$an,w}/2);max(w2,min($x-{*,ARROWLEFT}+{*,ARROWRIGHT},$W-({m$an,w}%2)-w2))} +j[board] [m$an],{$nx-int({m$an,w}/2)},$y,0,0,-1,[m$an] - if {{iM}==1} x=$nx n=$an fi + if iM==1 x=$nx n=$an fi rm. do_render=1 fi - if {{*,ARROWDOWN}" || "$|-$time>0.9^int($score/2)" || "$fall_mode} # Piece goes down. + if {*,ARROWDOWN}" || "$|-$time>0.9^int($score/2)" || "$fall_mode # Piece goes down. y+=1 +j[board] [m$n],{$x-int({m$n,w}/2)},$y,0,0,-1,[m$n] - if {{iM}>1" || "$y+{m$n,h}>$H} - if {$y<=1} gameover=1 fi # Game over! + if iM>1" || "$y+{m$n,h}>$H + if $y<=1 gameover=1 fi # Game over! j[board] [curr_board] j[render] [curr_render] n=-1 fi rm. time=$| do_render=1 fi - while {{*}" && "!{*,ESC}" && "!{*,Q}} - rm w 0 v + + while {*}" && "!{*,ESC}" && "!{*,Q} + rm w 0 + +#@cli x_threshold +#@cli : Threshold selected images interactively. +x_threshold : + e[^-1] "Threshold image"$_gmic_s" interactively." + repeat $! l[$>] + wsiz0=${"fitscreen ."} + value=-1 + w[] $wsiz0,0,"[G'MIC] "{n}" - Interactive threshold" + 0 + for {*}" && "!{*,ESC} + + if [w#1,h#1]!=[{*,w,h}] # Generate image view + rm[1] +slices[0] 50% r. {*,w,h},1,100%,1 w. + fi + + mx,my,mb={*,x,y,b} + if $mb" && "$mx>=0" && "$my>=0 + value={"w>h?( dw1 = "{*,w}" - 1; val = (dw1 - "$mx")*100/dw1; ): + ( dh1 = "{*,h}" - 1; val = (dh1 - "$my")*100/dh1; )"} + update_view=1 + fi + + if $update_view + if $value>=0 + +ge[1] $value% *. 255 + to. "Threshold: "{_round($value,0.1)}%,1%,1%,{max(13,3.5*h%)} + w. rm. + else w. + fi + update_view=0 + fi + + wait + if {*,r} update_view=1 fi + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,D} + w[] {{*,w}*1.5},{{*,h}*1.5} wait -1 update_view=1 + fi + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,C} + w[] {{*,w}/1.5},{{*,h}/1.5} wait -1 update_view=1 + fi + if ({*,CTRLLEFT}" || "{*,CTRLRIGHT})" && "{*,R} + w[] $wsiz0 wait -1 update_view=1 + fi + done + w[] 0 rm. u $value% ge ${} + endl done #@cli x_tictactoe #@cli : Launch tic-tac-toe game. -x_tictactoe : - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_tictactoe : check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Tic-Tac-Toe game"$n" -----------------\n ----\n @@ -24267,7 +29443,6 @@ ---- symbols. Close window to exit game.\n ----\n -----------------------------------------" - v - # Become quiet. # Allocate variables. message=0 # [-7] : State message. @@ -24289,57 +29464,57 @@ fi # Select position by the user. - do # Enter event loop. - w[] {w},{h},0,"[G"{`39`}"MIC] "$message wait # Wait for events and force window size if necessary. - if {!{*}" || "{*,ESC}" || "{*,Q}} w[] 0 rm v + return fi # Quit properly if window has been closed. - if {{*,b}&1" && "{*,x}>20" && "{*,y}>20" && "{*,x}<400" && "{*,y}<400} # If mouse button has been pressed on the board area. - tmp3={int(({*,x}-15)/130)} # Get x-coord of the selected position (0,1 or 2). - tmp2={int(({*,y}-15)/130)} # Get y-coord of the selected position (0,1 or 2). - tmp1={4^($tmp2*3+$tmp3)} # Get state code of the selected position. - if {int($state/$tmp1)%4} tmp1=-1 fi # Check availability of the selected position. - else tmp1=-1 fi # If no mouse button, do nothing but loop. - while {$tmp1<0} # Go on until a valid position has been selected. + do # Enter event loop. + w[] {w},{h},0,"[G"{`39`}"MIC] "$message wait # Wait for events and force window size if necessary. + if !{*}" || "{*,ESC}" || "{*,Q} w[] 0 rm return fi # Quit properly if window has been closed. + if {*,b}&1" && "{*,x}>20" && "{*,y}>20" && "{*,x}<400" && "{*,y}<400 # If mouse button pressed on the board area. + tmp3={int(({*,x}-15)/130)} # X of the selected position (0,1 or 2). + tmp2={int(({*,y}-15)/130)} # Y of the selected position (0,1 or 2). + tmp1={4^($tmp2*3+$tmp3)} # Get state code of the selected position. + if int($state/$tmp1)%4 tmp1=-1 fi # Check availability of position. + else tmp1=-1 fi # If no mouse button, do nothing but loop. + while $tmp1<0 # Go on until a valid position selected. # Draw symbol on selected position and update board state. _x_tictactoe{$player%2} # Generate the symbol sprite and his mask. - j... ..,{"130*"$tmp3" + 15+u(-5,5)"},\ # Draw symbol at its position (with some fuzzyness). + j... ..,{"130*"$tmp3" + 15+u(-5,5)"},\ # Draw symbol (with some fuzzyness). {"130*"$tmp2" + 15+u(-5,5)"},0,0,1,. - rm[-2--1] # Delete the sprite and the mask (not needed anymore). + rm[-2--1] # Delete sprite and mask. w. # Update display window. - state+={(1+$player)*$tmp1} # Update the board state. + state+={(1+$player)*$tmp1} # Update the board state. # Check for a winning configuration. - (21,1344,86016,4161,16644,66576,65793,4368;\ # The list of winning configurations. - 0,0,0,0,1,2,0,0;\ # Corresponding X coords for the stroke. - 0,1,2,0,0,0,0,0;\ # Corresponding Y coords for the stroke. - 3,3,3,4,4,4,5,6) # Corresponding indice of the stroke sprite. - repeat {w} # Start to check configurations. - tmp1={@$>} # Save the current configuration code (used several times). - if {($state&$tmp1)==$tmp1||($state&(2*$tmp1))==2*$tmp1} # If a winner has been found. + (21,1344,86016,4161,16644,66576,65793,4368;\ # The list of winning configurations. + 0,0,0,0,1,2,0,0;\ # Corresponding X coords for the stroke. + 0,1,2,0,0,0,0,0;\ # Corresponding Y coords for the stroke. + 3,3,3,4,4,4,5,6) # Corresponding index of the stroke sprite. + repeat w # Start to check configurations. + tmp1={@$>} # Save the current configuration code. + if ($state&$tmp1)==$tmp1||($state&(2*$tmp1))==2*$tmp1 # If a winner has been found. _x_tictactoe{i($>,3)} # Generate the stroke symbol and his mask. - j[-4] ..,{130*{-3,i($>,1)}+u(-5,5)},\ # And display it on the board at its position. + j[-4] ..,{130*{-3,i($>,1)}+u(-5,5)},\ # And display it on the board. {130*{-3,i($>,2)}+u(-5,5)},0,0,1,. rm[-2--1] - if {($state&$tmp1)==$tmp1} w.. -1,-1,0,"Tic-Tac-Toe (X won!)" + if ($state&$tmp1)==$tmp1 w.. -1,-1,0,"Tic-Tac-Toe (X won!)" else w.. -1,-1,0,"Tic-Tac-Toe (O won!)" # Update display window. fi do wait if {*} w[] {*,w},{*,h} fi - while {{*}" && "!{*,ESC}" && "!{*,Q}} # Wait for the window to be closed. - rm w[] 0 v + return # And return properly. + while {*}" && "!{*,ESC}" && "!{*,Q} # Wait for the window to be closed. + rm w[] 0 return # And return properly. fi - done # Go on until all configurations have been checked. + done # Go on until all configurations checked. rm. # Delete winning configuration data. player={($player+1)%2} # Select next player. counter+=1 # Increment turn counter. - while {$counter<9} # Loop to next move until all positions have been filled. + while $counter<9 # Loop to next move until all positions filled. # Here, the game has been ended without winners. w[] -1,-1,0,0,"Tic-Tac-Toe (Tied game!)" # Change window title. do wait if {*} w[] {*,w},{*,h} fi - while {{*}" && "!{*,ESC}" && "!{*,Q}} # Wait for the window to be closed. - w[] 0 rm v + # Return properly. + while {*}" && "!{*,ESC}" && "!{*,Q} # Wait for the window to be closed. + w[] 0 rm # Return properly. # Generate Tic-Tac-Toe graphics. _x_tictactoe : # Apply a hand-drawing effect. @@ -24349,32 +29524,233 @@ +f. 1-i +n.. $2,255 +n... $3,255 n[-4] $1,255 a[-4,-2,-1] c _x_tictactoe0 : # Generate a 'X' and his mask. - 128,128,1,1,1 line. 15%,15%,85%,85%,1,0 line. 15%,85%,85%,15%,1,0 erode. 12 _x_tictactoe deform. 4 __x_tictactoe 40,40,160 + 128,128,1,1,1 line. 15%,15%,85%,85%,1,0 line. 15%,85%,85%,15%,1,0 erode. 12 + _x_tictactoe deform. 4 + __x_tictactoe 40,40,160 _x_tictactoe1 : # Generate a 'O' and his mask. - 128,128,1,1,1 ellipse. 50%,50%,22%,22%,0,1,0 ellipse. 50%,50%,15%,15%,0,1,1 _x_tictactoe deform. 4 __x_tictactoe 160,40,160 + 128,128,1,1,1 ellipse. 50%,50%,22%,22%,0,1,0 ellipse. 50%,50%,15%,15%,0,1,1 + _x_tictactoe deform. 4 + __x_tictactoe 160,40,160 _x_tictactoe2 : # Generate the board. 391,391,1,1,"!(x%130) || !(y%130)" r. 421,421,1,1,0,0,0.5,0.5 dilate. 3 _x_tictactoe f. 1-i 100%,100% noise. 10 b. 8,0 sharpen. 1.5 n. 220,255 *[-2,-1] to_rgb. _x_tictactoe3 : # Generate an horizontal stroke and his mask. - 421,130,1,1,1 line. 10%,60%,90%,60%,1,0 erode. 6 _x_tictactoe rotate. {u(-6,6)},1,1,50%,50% __x_tictactoe 180,10,10 + 421,130,1,1,1 line. 10%,60%,90%,60%,1,0 erode. 6 + _x_tictactoe rotate. {u(-6,6)},1,1,50%,50% + __x_tictactoe 180,10,10 _x_tictactoe4 : # Generate a vertical stroke and his mask. _x_tictactoe3 transpose[-2--1] _x_tictactoe5 : # Generate a ++ diagonal stroke and his mask. - 421,421,1,1,1 line. 10%,10%,90%,90%,1,0 erode. 6 _x_tictactoe __x_tictactoe 180,10,10 + 421,421,1,1,1 line. 10%,10%,90%,90%,1,0 erode. 6 + _x_tictactoe + __x_tictactoe 180,10,10 _x_tictactoe6 : # Generate a +- diagonal stroke and his mask. 421,421,1,1,1 line. 10%,90%,90%,10%,1,0 erode. 6 _x_tictactoe __x_tictactoe 180,10,10 +#@cli x_warp : _nb_keypoints_xgrid>=2,_nb_keypoints_ygrid>=2,_nb_keypoints_contours>=0,\ +# _preview_fidelity={ 0=coarsest | 1=coarse | 2=normal | 3=fine | 4=finest },\ +# _[background_image],0<=_background_opacity<=1 +#@cli : Launch the interactive image warper. +#@cli : Default values: 'nb_keypoints_xgrid=nb_keypoints_ygrid=2', 'nb_keypoints_contours=0' and 'preview_fidelity=1'. +x_warp : check "isint(${1=2}) && $1>=2 && isint(${2=$1}) && $2>=2 && isint(${3=0}) && $3>=0 && + isint(${4=1}) && $4>=0 && $4<=4 && ${6=0.5}>=0 && $6<=1" skip ${5=} check_display + if !$! error[0--3] "Command '$0': Requires at least one input image!" return fi + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r + e[] "\n +------ "${g}"Interactive image warper"$n" -----------------------------\n +----\n +---- "${c}"Left mouse button"$n": Add and move keypoint.\n +---- "${c}"Right mouse button"$n": Delete keypoint.\n +---- Key '"${c}"SPACE"$n"' or "${c}"middle mouse button"$n": Show/hide keypoints.\n +---- Key '"${c}"TAB"$n"': Change keypoint radius.\n +---- Key '"${c}"SHIFT"$n"': Toggle to original image.\n +---- Key '"${c}"R"$n"': Reset keypoints.\n +---- Keys '"${c}"ESC"$n"', '"${c}"ENTER"$n"' or '"${c}"Q"$n"': Process fullres and exit.\n +----\n +-------------------------------------------------------------" + + if ${"is_image_arg $5"} pass$5 store. background fi + radius_keypoints=4 + + repeat $! l[$>] nm={n} + nm img + if narg($background) $background rr2d. {-2,[w,h]},2,3 store. rbackground fi + + # Start interactive window. + selected_keypoint=-1 + view_keypoints=1 + do + + # Generate base image. + if !narg($imgb) + if {*} wdims=${"fitscreen "{*,d},{img,{*,d}*h/w}} + else wdims=${"fitscreen "{img,[w,h,1]},128,60%} + fi + w[] $wdims,0,"[G'MIC] Interactive Warp" + +to_color[img] r. $wdims,1,100%,2 n. 0,255 nm. imgb + rmn warp,imgw,imgr + fi + + # Generate set of keypoints. + if !narg($keypoints) + if narg($__x_warp_keypoints) ($__x_warp_keypoints) r. 1,{w/4},1,4,-1 + else + + # Keypoints located on regular grid. + nbp,nbq=$1,$2 + 1,{$nbp*$nbq},1,4,"const nbp = "$nbp"; const nbq = "$nbq"; + p = y%nbp; + q = int(y/nbp); + x = p*100/(nbp - 1); + y = q*100/(nbq - 1); + [ x,y,x,y ]" + + # Keypoints located on contours. + nbc=$3 + if $nbc>0 + +b[imgb] 0.5 gradient_norm. sqrt. {round([w,h]/4)} gaussian. 20% + 1,$nbc,1,4,"> + begin(ref(crop(#-1),gauss)); + st = stats(#-2); + iM = st[1]; + xM = st[8]; + yM = st[9]; + img = vector(#w#-1*h#-1,-iM); + draw(#-2,img,xM - w#-1/2,yM - h#-1/2,0,0,w#-1,h#-1,1,1,-1,gauss); + nxyM = [ xM,yM ]*100/([w#-2,h#-2]-1); + [ nxyM,nxyM ]" + rm[-3,-2] + a[-2,-1] y + fi + fi + N0={h} nm. keypoints + rmn warp,imgw,imgr + fi + + # Generate warp field. + if !narg($warp) + subsamp={arg(1+$4,8,6,4,2,1)} + +_x_warp_rbf[keypoints] {imgb,round([w,h]/$subsamp)} *. $subsamp + r. {imgb,[w,h]},1,100%,3 +. '[x,y]' + nm. warp + rmn imgw,imgr + fi + + # Generate warped image. + if !narg($imgw) + +warp[imgb] [warp],0,1,3 nm. imgw + rmn imgr + fi + + # Render visualization. + if !narg($imgr) + [imgw] + if narg($rbackground) $rbackground r. .. j.. .,0,0,0,0,$6 rm. fi + nm. imgr + + if s==4 drgba. fi + if $view_keypoints + eval[keypoints] "* + begin( + col1 = [ 64,200,255 ]; + col2 = [ 255,255,255 ]; + fact = ([ w#"$imgw",h#"$imgw" ] - 1)/100; + const radius1 = "$radius_keypoints"; + const radius2 = radius1 + 2; + const opacity = min(1,3/"($radius_keypoints-1)"); + ); + X = round((I)[0,2]*fact); + ellipse(#-1,X,radius2,radius2,0,opacity,0); + ellipse(#-1,X,radius1,radius1,0,opacity,y<"$N0"?col1:col2); I" + fi + w. + fi + + # Manage user interaction + wait + mb={*,b} mxy={[{*,x,y}]*100/([{*,w,h}]-1)} mouse_over={{*,x}>=0} + + if $mouse_over" && "$mb" && "$selected_keypoint<0" && "h#$keypoints>0 # Determine selected keypoint + selected_keypoint={keypoints,"dmin = inf; kmin = -1; fact = ([w#"$imgr",h#"$imgr"]-1)%; + for (k = 0, k=0 && dmin<"max(8,1.5*$radius_keypoints)"?kmin:-1"} + fi + + if {*,-SPACE}" || "$mb==4 view_keypoints={!$view_keypoints} rmn imgr fi # Show/hide keypoints + + if {*,-R} rmn keypoints __x_warp_keypoints= fi # Reset keypoints + + if {*,-TAB} # Change keypoint radius + radius_keypoints={max(2,($radius_keypoints+2)%16)} view_keypoints=1 rmn imgr + fi + + if {*,SHIFTLEFT}" || "{*,SHIFTRIGHT} # View original + if {imgb,s==4} +drgba[imgb] w. rm. else w[imgb] fi + do wait while {*,SHIFTLEFT}" || "{*,SHIFTRIGHT} rmn imgr + fi + + if {*,r} rmn imgb fi # Window resize + + if $mouse_over" && "$mb==1" && "$selected_keypoint<0 # Add keypoint + wxy={warp,I([$mxy]*([w,h]-1)/100,1)*100/([w,h]-1)} + ({"[ "$mxy,$wxy" ]"}) permute. zycx a[keypoints,-1] y + selected_keypoint={keypoints,h-1} + rmn warp + + elif $mouse_over" && "$mb==1" && "$selected_keypoint>=0 # Move keypoint + ({"[ "$mxy" ]"}) permute. zycx j[keypoints] .,0,$selected_keypoint rm. + rmn warp + + elif $mouse_over" && "$mb==2" && "$selected_keypoint>=0" && "h#$keypoints>4 # Remove keypoint + 1,1,1,4,-1 j[keypoints] .,0,$selected_keypoint rm. discard[keypoints] -1 r[keypoints] 1,{keypoints,h/4},1,4,-1 + N0-={$selected_keypoint<$N0?1:0} selected_keypoint=-1 + rmn warp + + elif !$mb selected_keypoint=-1 + fi + while {*}" && "!{*,ESC}" && "!{*,Q}" && "!{*,ENTER} + if !$< __x_warp_keypoints={keypoints,^} fi + + +drgba[imgw] to. "Processing fullres...",5,5,20,2 w. rm. + k[img,keypoints] + _x_warp_rbf[keypoints] {img,[w,h]} +. '[x,y]' + warp[img] .,0,2,3 rm. nm $nm + endl done c 0,255 w 0 + +# Generate 2d warping field from set of keypoints, using RBF reconstruction. +# $1,$2 = width,height +_x_warp_rbf : + if !h $1,$2,1,2,[x,y] return fi + $1,$2,1,2,"* + begin( + fact = ([w,h] - 1)/100; + xy(p) = (I[#0,p])[0,2]*fact; + const N = h#0; + ref(vector(#N*N),A); + ref(vector(#N*2),B); + for (p = 0, p0} to. $fps" fps",5,{h-22},16,2,0.2 fi + fps=${-fps} if $fps>0 to. $fps" fps",5,{h-22},16,2,0.2 fi w. - if {{*,CTRLLEFT}&&{*,D}} w[] {2.25*w},{2.25*h} elif {{*,CTRLLEFT}&&{*,C}} w[] {1.25*w},{1.25*h} - elif {{*,CTRLLEFT}&&{*,F}} - if {!narg($is_fs)} is_fs={*,w},{*,h} fw={min({*,u}*h/w,{*,v}*w/h)} w[] $fw,{$fw*h/w},0,1 + if {*,CTRLLEFT}" && "{*,D} w[] {2.25*w},{2.25*h} elif {*,CTRLLEFT}" && "{*,C} w[] {1.25*w},{1.25*h} + elif {*,CTRLLEFT}" && "{*,F} + if !narg($is_fs) is_fs={*,w},{*,h} fw={min({*,u}*h/w,{*,v}*w/h)} w[] $fw,{$fw*h/w},0,1 else w[] $is_fs,0,0 is_fs="" fi fi rm[-2,-1] wait 20 - if {{*,b}&1||($|-$time0)>1} ({u*$w};{u*$w};70;0) a[5,-1] x time0={$|-u} fi # Insert new ball. + if {*,b}&1||($|-$time0)>1 ({u*$w};{u*$w};70;0) a[5,-1] x time0={$|-u} fi # Insert new ball. if {5,h} l[5,-1] # Manage ball motion and collision. sh[0] 2,2,0,0 sh[0] 3,3,0,0 -.. . +. 0.2 rm[-2,-1] - s[0] x repeat {$!-1} coords={$<,@0-1} if {{$<,@2}=0 #@cli : Launch the fractal whirls demo. #@cli : Default values: 'opacity=0.2'. -x_whirl : check "${1=0.2}>=0" - if {!{*,u}} error[0--3] "Command '$0': No display available." return fi - v - use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r v + +x_whirl : check "${1=0.2}>=0" check_display + use_vt100 g=$_gmic_g c=$_gmic_c n=$_gmic_n r=$_gmic_r e[] "\n ------ "${g}"Fractal whirls"$n" ----------------------------\n ----\n @@ -24451,7 +29826,7 @@ ---- Keys '"${c}"ESC"$n"' or '"${c}"Q"$n"' to exit.\n ----\n --------------------------------------------------" - v - + 5,5,1,3 256,256,1,3 [-1] w. 384,384,0,"[G"{`39`}"MIC] Fractal Whirls" tangle=0 tzoom=0 xc={(w-{-3,w})/2} yc={(h-{-3,h})/2} do @@ -24460,10 +29835,38 @@ tangle+=0.001 tzoom+=0.02 j. [-2],0,0,0,0,$1 w. - if {{*,CTRLLEFT}&&{*,D}} w[] {3*w},{3*h} elif {{*,CTRLLEFT}&&{*,C}} w[] {1.5*w},{1.5*h} fi + if {*,CTRLLEFT}" && "{*,D} w[] {3*w},{3*h} elif {*,CTRLLEFT}" && "{*,C} w[] {1.5*w},{1.5*h} fi wait 20 - while {{*}" && "!{*,ESC}" && "!{*,Q}} - rm[-3,-2] w[] 0 v + + while {*}" && "!{*,ESC}" && "!{*,Q} + rm[-3,-2] w[] 0 + +#------------------------------------- +# +#@cli :: Funny One-Liners +# +#------------------------------------- + +#@cli oneliner_sierpinski_carpet : +#@cli : Draw a sierpinski carpet. +#@cli : $ 729,729,1,3,"c(x,y,l) = (S = round(w/3^l); (int(x/S)%3)*(int(y/S)%3)==1?255:l<6?c(x,y,l + 1):0); c(x,y,1)" +oneliner_sierpinski_carpet + 729,729,1,3,"c(x,y,l) = (S = round(w/3^l); (int(x/S)%3)*(int(y/S)%3)==1?255:l<6?c(x,y,l + 1):0); c(x,y,1)" + +#@cli oneliner_sierpinski_triangle : +#@cli : Draw a sierpinski triangle. +#@cli : $ 1024,1024,1,1,">x>y?0:y<2?1:xor(j(0,-1),j(-1,-1))" f. "255*j(-w/2+y/2,0)" +oneliner_sierpinski_triangle + 1024,1024,1,1,">x>y?0:y<2?1:xor(j(0,-1),j(-1,-1))" f. "255*j(-w/2+y/2,0)" + +#@cli oneliner_lightspeed : +#@cli : A colorful lightspeed travel effect. +#@cli : $ 500,500 repeat 10 +noise_poissondisk[0] {3+$>} done rm[0] a z \ +# f "!z?(R=cut(norm(x-w/2,y-h/2)/20,0,d-1);i(x,y,R)):0" slices 0 to_rgb f "max(I)?u([255,255,255]):I" blur_radial 0.6% \ +# equalize n 0,255 +onliner_lightspeed + 500,500 repeat 10 +noise_poissondisk[0] {3+$>} done rm[0] a z \ + f "!z?(R=cut(norm(x-w/2,y-h/2)/20,0,d-1);i(x,y,R)):0" slices 0 to_rgb f "max(I)?u([255,255,255]):I" blur_radial 0.6% \ + equalize n 0,255 #------------------------------------- # @@ -24480,18 +29883,18 @@ gui_filter_sources : skip ${1=0},${2=1} # Try to update the command 'gui_filter_sources' itself. - if {$2} + if $2 local=${_path_rc}update$_version.gmic - if $local m $local gui_filter_sources $1,0 return fi + if isfile(['{/$local}']) m $local gui_filter_sources $1,0 return fi fi # Try to clean older update files to save disk space. - if {u>0.95} l[] + if u>0.95 l[] files=${"files "$_path_rc"/update*.gmic"} - repeat {narg($files)} + repeat narg($files) file=${arg\ 1+$>,$files} - ({'$file'}) z. {[w-8,w-6]} ver={t} rm. - if {isval($ver)" && "$ver<$_version} 0 o. raw:$file,uchar rm. fi + ('$file') z. {[w-8,w-6]} ver={t} rm. + if isnum($ver)" && "$ver<$_version 0 ot. $file rm. fi done onfail endl fi @@ -24500,9 +29903,9 @@ ({'https://gmic.eu/update$_version.gmic'},1) # Include stdlib update (last 1 -> Override default filters). l[] _gui_filter_sources $1 onfail rm endl # Invoke custom command to include other filter sources. l[] i cimgz:${_path_rc}gui_filter_sources onfail endl # Include other user-defined filters sources. - ({'{/$_path_user}'}) # Include local '.gmic' (or 'user.gmic') file. + ('{/$_path_user}') # Include local '.gmic' (or 'user.gmic') file. -# Function that alway returns a valid preview size. +# Function that always returns a valid preview size. gui_preview_wh : u {0$_preview_width?[0$_preview_width,0$_preview_height]:[400,400]} @@ -24562,14 +29965,14 @@ # Flatten list of input layers according to their blending modes, opacities and positions, # set in each layer name by the G'MIC plug-in. gui_merge_layers : - if {!$!} return fi + if !$! return fi mode0=${"_gui_merge_layers. mode,alpha"} opacity0=${"_gui_merge_layers. opacity,100"} pos0=${"_gui_merge_layers. pos,0,0"} - if {$opacity0<100" || "['$pos0']!='0,0'} 100%,100%,1,4 fi + if $opacity0<100" || "['$pos0']!='0,0' 100%,100%,1,4 fi wh0={w},{h} wh=${-max_wh} r. $wh,1,100%,0 - repeat {$!-1} l[-2,-1] rv + repeat $!-1 l[-2,-1] rv mode=${"_gui_merge_layers[1] mode,alpha"} opacity=${"_gui_merge_layers[1] opacity,100"} pos=${"_gui_merge_layers[1] pos,0,0"} @@ -24583,19 +29986,23 @@ _gui_merge_layers : u {`" str = ["{'{n}'}"]; const sstr = size(str); + def = ['${2--1}']; ker = ['$1(']; const sker = size(ker); - res = vectorsstr(); + const N = max(size(str),size(def)); + ref(vectorN(0),res); p = q = find(str,ker); p>=0?( q+=sker; - r = find(str,'),',1,q); + r = find(str,'),',q); q = r>=0?r:(str[sstr-1]==_')'?sstr-1:-1); ); q>=0?copy(res,str[p + sker],q - p - sker):(def = ['${2--1}']; copy(res,def,size(def))); res"`} # gui_split_preview : "command",_split_type,_split_posx,_split_posy -# 'split_type' can be { 0=no split | 1=forw. horiz. | 2=forw. vert. | 3=back. horiz. | 4=back. vert. | 5=dupl. left | 6=dupl. top | 7=dupl. bottom | 8=dupl. right | 9=dupl. horiz.l | 10=dupl. vert. | 11=checkered | 12=checkered inv. } +# 'split_type' can be { 0=no split | 1=forw. horiz. | 2=forw. vert. | 3=back. horiz. | 4=back. vert. | +# 5=dupl. left | 6=dupl. top | 7=dupl. bottom | 8=dupl. right | 9=dupl. horiz.l | 10=dupl. vert. | +# 11=checkered | 12=checkered inv. } # if 'posx' or 'posy' are equal to 'nan', splitting is done at the middle, and moving is not possible. # 'compute_entire_image' can be { 0=no | 1=yes }. gui_split_preview : check "isint(${2=0}) && $2>=0 && $2<=12 && ${5=0}>=0" skip "${3=nan},${4=nan}" @@ -24604,60 +30011,76 @@ posx,posy={$is_movable?cut([$3,$4],0,100):[50,50]} pw,ph=${-gui_preview_wh} repeat $! l[$>] - is_timeout=0 - +l apply_timeout _split_preview,0$_preview_timeout onfail gui_timeout_preview is_timeout=1 endl - if {$is_timeout" || "!$2} k. + is_failed=0 + +l + apply_timeout _split_preview,0$_preview_timeout + onfail + if 0$_is_timeout gui_timeout_preview + else gui_error_preview ${} + fi + is_failed=1 + endl + + if $is_failed" || "!$2 k. else drgba rr2d $pw,$ph,0,2 r {[max(w#0,w#1),max(h#0,h#1)]},1,100%,0,0,0.5,0.5 posx,posy={round([$posx,$posy]*([w,h]-1)%)} - if {$2==1" || "$2==3} # Forward/backward horizontal + if $2==1" || "$2==3 # Forward/backward horizontal 1,[0],1,1,'y>=$posy?($2==1):($2==3)' r. [0],[0],1,1 j[0] [1],0,0,0,0,1,. - elif {$2==2" || "$2==4} # Forward/backward vertical + elif $2==2" || "$2==4 # Forward/backward vertical [0],1,1,1,'x>=$posx?($2==2):($2==4)' r. [0],[0],1,1 j[0] [1],0,0,0,0,1,. - elif {$2==5} # Duplicate top + elif $2==5 # Duplicate top j[0] [1],0,$posy - elif {$2==6} # Duplicate left + elif $2==6 # Duplicate left j[0] [1],$posx - elif {$2==7} # Duplicate bottom + elif $2==7 # Duplicate bottom j[0] [1],0,{$posy-h} - elif {$2==8} # Duplicate right + elif $2==8 # Duplicate right j[0] [1],{$posx-w} - elif {$2==9} # Duplicate horizontal - if {!$posy} k. elif {$posy>=h} k.. else r[0] 100%,$posy,1,100%,0,0,0,0.5 r[1] 100%,{h-$posy},1,100%,0,0,0,0.5 a y fi - elif {$2==10} # Duplicate vertical - if {!$posx} k. elif {$posx>=h} k.. else r[0] $posx,100%,1,100%,0,0,0.5 r[1] {w-$posx},100%,1,100%,0,0,0.5 a x fi - elif {$2==11} # Checkered + elif $2==9 # Duplicate horizontal + if !$posy k. elif $posy>=h k.. else r[0] 100%,$posy,1,100%,0,0,0,0.5 r[1] 100%,{h-$posy},1,100%,0,0,0,0.5 a y fi + elif $2==10 # Duplicate vertical + if !$posx k. elif $posx>=h k.. else r[0] $posx,100%,1,100%,0,0,0.5 r[1] {w-$posx},100%,1,100%,0,0,0.5 a x fi + elif $2==11 # Checkered 1,[0],1,1,'y>=$posy' [0],1,1,1,'x>=$posx' r[-2,-1] [0],[0],1,1 xor[-2,-1] j[0] [1],0,0,0,0,1,. - elif {$2==12} # Checkered reverse + elif $2==12 # Checkered reverse 1,[0],1,1,'y<=$posy' [0],1,1,1,'x>=$posx' r[-2,-1] [0],[0],1,1 xor[-2,-1] j[0] [1],0,0,0,0,1,. fi k[0] dir=0 - if {isin($2,1,3,5,7,9,11,12)} + if isin($2,1,3,5,7,9,11,12) dir+=1 line 0,$posy,100%,$posy,0.75,0xF0F0F0F0,255 line 0,$posy,100%,$posy,0.75,0x0F0F0F0F,0 if $is_movable - coords={p=[$posx,$posy];[p+[-10,-1],p+[10,-1],p+[0,-11]]} polygon 3,$coords,0.7,255 polygon 3,$coords,0.7,0xFFFFFFFF,0 - coords={p=[$posx,$posy];[p+[-10,1],p+[10,1],p+[0,11]]} polygon 3,$coords,0.7,255 polygon 3,$coords,0.7,0xFFFFFFFF,0 + coords={p=[$posx,$posy];[p+[-10,-1],p+[10,-1],p+[0,-11]]} + polygon 3,$coords,0.7,255 + polygon 3,$coords,0.7,0xFFFFFFFF,0 + coords={p=[$posx,$posy];[p+[-10,1],p+[10,1],p+[0,11]]} + polygon 3,$coords,0.7,255 + polygon 3,$coords,0.7,0xFFFFFFFF,0 fi fi - if {isin($2,2,4,6,8,10,11,12)} + if isin($2,2,4,6,8,10,11,12) dir+=2 line $posx,0,$posx,100%,0.75,0xF0F0F0F0,255 line $posx,0,$posx,100%,0.75,0x0F0F0F0F,0 - if {$2!=9" && "$is_movable} - coords={p=[$posx,$posy];[p+[-1,-10],p+[-1,10],p+[-11,0]]} polygon 3,$coords,0.7,255 polygon 3,$coords,0.7,0xFFFFFFFF,0 - coords={p=[$posx,$posy];[p+[1,-10],p+[1,10],p+[11,0]]} polygon 3,$coords,0.7,255 polygon 3,$coords,0.7,0xFFFFFFFF,0 + if $2!=9" && "$is_movable + coords={p=[$posx,$posy];[p+[-1,-10],p+[-1,10],p+[-11,0]]} + polygon 3,$coords,0.7,255 + polygon 3,$coords,0.7,0xFFFFFFFF,0 + coords={p=[$posx,$posy];[p+[1,-10],p+[1,10],p+[11,0]]} + polygon 3,$coords,0.7,255 + polygon 3,$coords,0.7,0xFFFFFFFF,0 fi fi l[] 0 +t. "After",0,0,20,1,255 t.. "Before",0,0,20,1,255 autocrop 0 z[0] {0,[-1,-1,w,h]} z[1] {1,[-1,-1,w,h]} - if {isin($2,3,4,7,8,12)} rv fi + if isin($2,3,4,7,8,12) rv fi +dilate[-2,-1] 3 /[-2,-1] 255 r[-4,-3] 100%,100%,1,3 endl @@ -24670,7 +30093,7 @@ k[0] fi endl done - uncommand _split_preview + um _split_preview # Command to display text on a the G'MIC plug-in preview. # $1 : header message @@ -24682,7 +30105,7 @@ # Resize image to output resolution. if $! k[0] fi drgba - siz={0$_preview_width?[0$_preview_width,0$_preview_height]:[${fitscreen\ {[max(w,1),max(h,1)]},1,400}]} + siz={0$_preview_width?[0$_preview_width,0$_preview_height]:[${fitscreen\ {[max(w,1),max(h,1),1]},400}]} sizw={arg(1,$siz)-8} if $! rr2d $siz,2,3 drgba else $siz,1,3,128 fi (1;0.5^1;0.5^0;1) @@ -24691,17 +30114,18 @@ # Render title. l[] - 0 t. "$1",0,0,$2,1,255 i.. 100%,100%,1,3 fc.. 255,200,120 a[-2,-1] c r2dx. {min(w,arg(1,$sizw)-8)} r. 100%,140%,1,100%,0,0 + 0 t. "$1",0,0,$2,1,255 i.. 100%,100%,1,3 fc.. 255,200,120 a[-2,-1] c r2dx. {min(w,arg(1,$sizw)-8)} + r. 100%,140%,1,100%,0,0 onfail rm endl # Render message. l[] 0 t. "$3",0,0,$4,1,255 i.. 100%,100%,1,3,255 a c - ({'"$3"'}) is_err={"crop(0,4)=='*** '"} rm. + ('"$3"') is_err={"crop(0,4)=='*** '"} rm. if $is_err - x={"T = crop(0,0,0,3,32,h,1,1); + x={"ref(crop(0,0,0,3,32,h,1,1),T); for (c = 32, c$sizw} + for w>$sizw x={"const c0 = "$sizw"-1; const c02 = c0/2; for (c = c0, c>=c02, --c, max(crop(#-1,c-2,0,0,3,5,h,1,1))<=0?break()); @@ -24739,7 +30163,7 @@ gui_print_preview "Preview error:",32,"$*",20 gui_check_version : - if {$_version<$1} + if $_version<$1 gui_error_preview "This filter requires at least version *"${"strver $1"}"* of the G'MIC framework.\n\n"\ "https://gmic.eu/download.shtml" u 0 @@ -24761,178 +30185,588 @@ #@gui ____About #--------------------- +#@gui ♥ Support Us ! ♥ : _none_,fx_support_us +#@gui : note = note{"
"} +#@gui : note = note{"
is proposed to you by
"} +#@gui : note = note("
   David Tschumperlé     and     +#@gui :    Sébastien Fourey
") +#@gui : url = link{"( IMAGE Team / GREYC Laboratory - CNRS UMR 6072 )","https://www.greyc.fr/?page_id=443&lang=en"} +#@gui : note = note{"\nIf you appreciate what we do on G'MIC and want to help us maintaining and \ +# developing this piece of software, please consider \ +# making a donation!\n\n"} +#@gui : note = note{
} +#@gui : url = link("Go to the donation page","https://libreart.info/en/projects/gmic") +#@gui : sep = separator() +#@gui : note = note{"\nG'MIC officially collaborates with LILA ("Libre comme l'Art"), +#@gui : a French non-profit organization, which promotes Arts and Artists as well as access to technics and +#@gui : knowledge for everyone.\n +#@gui : LILA collects donations to help developing G'MIC."} +#@gui : note = note{"Author: David Tschumperlé.      Latest Update: 2019/03/13.") +fx_support_us : + if $!>0 k[0] fi + gui_print_preview "" + l[] + filename=${-path_tmp}gmic_donations.png + need_update={"Y = date(0); M = date(1); D = date(2); date_current = Y*365 + M*31 + D; + Y = date(0,'"{/$filename}"'); M = date(1,'"{/$filename}"'); + D = date(2,'"{/$filename}"'); date_file = Y*365 + M*31 + D; + date_current - date_file>=15"} + if $need_update i https://gmic.eu/img/donations_latest_months.png o. $filename + else i $filename + fi + 0 t. "Latest donations to the G'MIC project:",0,0,24,1,1 rows. 0,120% *. 255 channels. -3,0 + rv a y,0.5 drgba 200 frame 4,4,200 frame 2,2,0 to_rgba + onfail rm + endl + if w>w#0" || "h>h#0 rr2d. {-2,[w,h]},0 fi + j.. .,{([w#0,h#0]-[w,h])/2},0,0,0.85 + #@gui About G'MIC : _none_, _none_ -#@gui : note = note{
\n -#@gui : ( GREYC's Magic for Image Computing )\n\nis proposed to you by
} -#@gui : note = note(
  David Tschumperlé     and     -#@gui :   Sébastien Fourey
\n\n) +#@gui : note = note{"
"} +#@gui : note = note{"
is proposed to you by
"} +#@gui : note = note("
   David Tschumperlé     and     +#@gui :    Sébastien Fourey
") #@gui : url = link{"( IMAGE Team / GREYC Laboratory - CNRS UMR 6072 )","https://www.greyc.fr/?page_id=443&lang=en"} #@gui : note = note{"\n -#@gui : This plug-in is based on our open-source libraries G'MIC and CImg (C++ Template Image Processing Library), +#@gui : This plug-in is based on our open-source libraries G'MIC and +#@gui : CImg (C++ Template Image Processing Library), #@gui : available at:"} -#@gui : note = note(
  https://gmic.eu     and     -#@gui :   http://cimg.eu
) +#@gui : note = note(
  https://gmic.eu     and     +#@gui :   htt\ +# p://cimg.eu
) #@gui : note = note{"\n #@gui : If you appreciate G'MIC, you are welcome to send us a nice postcard from your place, at:\n\n -#@gui : David Tschumperlé,\n Laboratoire GREYC (CNRS UMR 6072), Equipe Image,\n -#@gui : 6 Bd du Maréchal Juin,\n 14050 Caen Cedex / France.\n\n -#@gui : Postcards senders automatically enter the Friends Hall of Fame :) ! -#@gui : "} -fx_logo_version3 : skip "${1=Universal plug-in}" - rm s="G\47MIC" - repeat {narg({'$s'})} - 0 t. {`arg(1+$>,{'$s'})`},0,0,53,1,1 frame. 3,0,0 - r. 500%,500%,1,1,3 b. 3% >=. 50% - distance. 1 <=. 10 - [-1]x3 whirls[-4--2] , - r$>={u(0.4,1)} g$>={u(0.2,1)} b$>={u(0.6,1)} - *[-4] ${r$>} *... ${g$>} *.. ${b$>} - a[-4--2] c n.. 0,255 *. 255 a[-2,-1] c - done - a[-5--1] x - r. 100%,120%,1,4,0,0,0.5,1 - ball 64,{255*$r3},{255*$g3},{255*$b3} j.. .,450,5 rm. - sh. 100% dilate. 7 rm. autocrop. - drop_shadow. 10,10,1%,0.5 - 0 t. "$1",0,0,53,1,255 frame. 4,4,0 [-1]x3 dilate. 7 a[-4--1] c - a[-2,-1] y,0.5 - r2dy. 50% - i.. 120%,120%,1,3,255 plasma.. 1,1 s.. c - n[-4] 150,255 n... 180,255 n.. 200,255 a[-4--2] c - blend alpha - frame 0,1,0,0,0 frame 0,5,255,255,255 - -fx_logo_version2 : skip "${1=Universal plug-in}" - if $! k[0] fi - to_rgb 0 t. "G\47MIC",0,0,53,1,1 label. - 6,1,1,3 rand. 150,255 point. 0 map.. . rm. - expand_xy. 10,0 b. 2 r. 200%,200%,1,3,6 sqr. c. 0,60% n. 0,255 - warp_perspective. 0.5,0,1,50,50,0 shift. 0,-10 - 100%,100% noise. 0.8,2 ==. 1 *. 180 +blur_linear. 20,0,45,0 *. 20 max[-3--1] - sh. 2 (0;128) r. ..,3 +[-2,-1] min. 255 rm. - 0 t. "$1",0,0,13,1,1 +dilate. 3 *.. 255 r.. 100%,100%,1,3 - j... ..,{({-3,w}-w)/2},75%,0,0,1,. rm[-2,-1] - frame. 1,1,128 mv. 0 - if {$!>1} *[^0] 0.45 repeat {$!-1} j. [0],{(w-{0,w})/2},{(h-{0,h})/2} mv. 1 done rm[0] fi - -fx_logo_version1 : skip "${1=Universal plug-in}" - if $! ratio={w/h} else ratio=1 fi - rm 118,44,1,1 t "G\47MIC",3,-6,53,1,255 r 100%,100%,10,1 r 100%,100%,20,1,0,0,0.5,0.5,0.5 b 1.5 - isosurface3d 50% - col3d {u(150,255)},{u(150,255)},{u(150,255)} - sphere3d 8 col3d. {u(150,255)},{u(150,255)},{u(150,255)} +3d. 77,-6 +3d c3d. rv3d - db3d 0 sl3d 0.2 ss3d 1.3 r3d. 1,0,0,-30 f3d 120 *3d. 1.5 - 230,120,1,3 j3d. ..,50%,30%,0,1,4 rm.. - 0 t. "$1",0,0,13,1,255,255,255 j.. .,{({-2,w}-w)/2},75% rm. - to_rgba replace_color 0,0,0,0,0,255,0,0,0,0 drop_shadow 6,6,2 - i.. ${fitratio_wh\ 230,120,$ratio},1,3 - rand.. 0,255 sh.. 0 /. 2 rm. - blur_radial.. 20 sharpen.. 300 - r. ..,..,1,4,0,0,0.5,0.5 blend alpha - -fx_logo : skip "${1=Universal plug-in\n [ "${-strver}" ]}","${2=$1}" - file=${_path_rc}gmicky_logo.png - is_file=1 - if $file $file - else l[] i https://gmic.eu/img/gmicky_logo.png o $file onfail is_file=0 endl - fi - if $is_file - k. r2dx {0$_preview_width?0$_preview_width:400} - if {narg($_prerelease)} strprerelease="pre" else strprerelease="" fi - 0 t. "version "${-strver}$strprerelease,0,0,{round(h#0/12)},1,1 r2dx. 50% 100%,100%,1,3,0 j[0] .,{w#0-w-5},0,0,0,1,.. rm[-2,-1] - else - if {narg($_prerelease)} - fx_logo_version{round(u(0.5,3.49))} "$2" - else - fx_logo_version{round(u(0.5,3.49))} "$1" - fi - fi - -fx_logo_en : - fx_logo "Universal plug-in\n [ "${-strver}" ]"," Universal plug-in\n[ "${-strver}" pre-release ""#"$_prerelease"]" +#@gui : David Tschumperlé,\n Laboratoire GREYC (CNRS UMR 6072), Equipe Image,\n +#@gui : 6 Bd du Maréchal Juin,\n 14050 Caen Cedex / France."} +#@gui : note = note{"Postcards senders automatically enter the Friends Hall of Fame :) !\n\ +# You may also consider making a donation!"} #@gui Contributors : _none_, _none_ #@gui : note = note{" #@gui : We would like to thank all these people who contributed to G'MIC in one way or another. #@gui : A big hug to : \n\n -#@gui : - Sylvie Alexandre (packaging, testing & filters) +#@gui : - Sylvie Alexandre (packaging, testing & filters) #@gui : - Partha Bagchi (packaging) -#@gui : - Daniel P. Berrangé (packaging) -#@gui : - Sébastien Bougleux (debugging) -#@gui : - Jérome Boulanger (testing & code) +#@gui : - Daniel P. Berrangé (packaging) +#@gui : - Sébastien Bougleux (debugging) +#@gui : - Jérome Boulanger (testing & code) #@gui : - Claude Bulin (packaging) -#@gui : - Aurélien Ceyden (packaging) -#@gui : - François Collard (testing) -#@gui : - Patrick David (testing & filters) -#@gui : - Maxime Daisy (code & testing) -#@gui : - Frédéric Devernay (code) +#@gui : - Aurélien Ceyden (packaging) +#@gui : - François Collard (testing) +#@gui : - Patrick David (testing & filters) +#@gui : - Maxime Daisy (code & testing) +#@gui : - Frédéric Devernay (code) #@gui : - Iain Fergusson (filters) -#@gui : - Tobias Fleischer (testing & code) +#@gui : - Tobias Fleischer (testing & code) #@gui : - Roberto Ferramosca (packaging) -#@gui : - Jérome Ferrari (testing, code & tutorials) +#@gui : - Jérome Ferrari (testing, code & tutorials) #@gui : - Andrea Ferrero (testing, code) #@gui : - Chris Fiedler (gfx) -#@gui : - Sébastien Fourey (G'MIC-Qt, ZArt code & G'MIC online) +#@gui : - Sébastien Fourey (G'MIC-Qt, ZArt code & G'MIC online) #@gui : - Gentlemanbeggar (filters) #@gui : - David Gowers (testing) #@gui : - Claes Holmerson (tutorials) #@gui : - Arto Huotari (filters) #@gui : - Dan Leinir Turthra Jensen (debugging) -#@gui : - Tom Keil (testing, filters & tutorials) -#@gui : - Andy Kelday (testing & filters) -#@gui : - Alan Kwan (afre) (testing & filters) -#@gui : - Angelo Lama (testing & EKD integration) +#@gui : - Tom Keil (testing, filters & tutorials) +#@gui : - Andy Kelday (testing & filters) +#@gui : - Alan Kwan (afre) (testing & filters) +#@gui : - Angelo Lama (testing & EKD integration) #@gui : - John Lakkas (filters) -#@gui : - Stéphane de la Linuxerie (design) +#@gui : - Stéphane de la Linuxerie (design) #@gui : - Mark (translation) -#@gui : - Mahvin (testing & design) +#@gui : - Mahvin (testing & design) #@gui : - MareroQ (translation) #@gui : - Ramon Miranda (translation) #@gui : - Tou Omiya (translation) #@gui : - Mauro Quercia (translation) -#@gui : - PhotoComiX (testing, translation & filters) -#@gui : - Garry Osgood (documentation & filters) -#@gui : - Jehan Pages (testing & code) -#@gui : - Andreas Påhlsson (filters) -#@gui : - James Prichard (testing & filters) +#@gui : - PhotoComiX (testing, translation & filters) +#@gui : - Garry Osgood (documentation & filters) +#@gui : - Jehan Pages (testing & code) +#@gui : - Andreas Påhlsson (filters) +#@gui : - James Prichard (testing & filters) #@gui : - Guilherme Razgriz (translation) -#@gui : - Karsten Rodenacker (packaging & code) +#@gui : - Karsten Rodenacker (packaging & code) #@gui : - Marc Roovers (clut data) -#@gui : - Dani Sardà (translation) +#@gui : - Dani Sardà (translation) #@gui : - Yuri Shemanin (debugging) #@gui : - Silvio Grosso (debugging) #@gui : - Stepanekos (translation) #@gui : - Thorsten "otto" Stettin (packaging) #@gui : - Lukas Tvrdy (Krita integration) -#@gui : - Martin Wolff (testing & filters) +#@gui : - Martin Wolff (testing & filters) #@gui : - Bernd Zeimetz (packaging) #@gui : - Matthias Zepper (testing) #@gui : -"} #@gui Download External Data : gui_download_all_data, gui_no_preview(1) -#@gui : note = note{"This filter will download all external data files used by some filters of the G'MIC plug-in (film emulation, light leaks, grain, etc...), +#@gui : note = note{"This filter will download all external data files used by some filters of the G'MIC +#@gui : plug-in (Color Grading, Light Leaks, Grain, etc...), #@gui : and will install them as persistent files on your hard drive. After this operation, you won't need a permanent #@gui : internet connection anymore in order to use some of the G'MIC filters."} #@gui : note = note() -#@gui : note = note{"Warning: A lot of data will be downloaded by this filter. This can take a long time !"} +#@gui : note = note{"Warning: A lot of data will be downloaded. +#@gui : This can take a long time !"} #@gui : sep = separator() #@gui : Force re-Download from Scratch = _bool(0) #@gui : sep = separator() -#@gui : note = note{"Alternative (manual) method:\nIf, for any reasons, your plug-in is unable to retrieve data from the Internet, you can download all +#@gui : note = note{"Alternative (manual) method:\nIf, for any reasons, +#@gui : your plug-in is unable to retrieve data from the Internet, you can download all #@gui : those data files manually (as a single .zip file) at this address :"} #@gui : url = link{"https://gmic.eu/gmic_all_data.zip"} #@gui : note = note{"You must then decompress all files contained in this archive at the following location:\n -#@gui : - for Unix-like systems : $HOME/.config/gmic/\n +#@gui : - for Unix-like systems : $HOME/.cache/gmic/\n #@gui : - for Windows systems : %APPDATA/gmic/ #@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/16/04.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/16/04.") gui_download_all_data : - # Film emulation. + # Color Presets. l[] clut foo rm onfail rm endl # Grain. - _filenames_grain=${-_fx_emulate_grain} + _filenames_grain=${-_fx_simulate_grain} _url_grain=https://gmic.eu/data_film_presets _prefix_grain=grain_ _ext_grain=cimgz @@ -24943,12 +30777,6 @@ _prefix_lightleak= _ext_lightleak=cimgz - # Logos. - _filenames_logo=gmicky_large_deevad,gmicky_small_deevad,gmicky_large_mahvin,gmicky_small_mahvin,gmicky_wilber_large,gmicky_wilber_small,roddy_large,roddy_small - _url_logo=https://gmic.eu/img - _prefix_logo= - _ext_logo=cimgz - # Sample images. _filenames_sample=${-__sample} _url_sample=https://gmic.eu/img @@ -24956,10 +30784,10 @@ _ext_sample=png # Demo thumbnails. - _filenames_demo=gmic_demos - _url_demo=https://gmic.eu/img - _prefix_demo= - _ext_demo=cimgz + _filenames_demos=gmic_demos + _url_demos=https://gmic.eu/img + _prefix_demos= + _ext_demos=cimgz # Manage downloads. _n=0 @@ -24969,14 +30797,16 @@ _gui_download_all_data[] lightleak,$1 _gui_download_all_data[] logo,$1 _gui_download_all_data[] sample,$1 - _gui_download_all_data[] demo,$1 + _gui_download_all_data[] demos,$1 progress 100 _gui_download_all_data : - repeat {narg(${_filenames_$1})} + repeat narg(${_filenames_$1}) filename=${_prefix_$1}${arg\ 1+$>,${_filenames_$1}}.${_ext_$1} - v + e[] "Download "$filename v - - if {$2" || "!isfile(${_path_rc}$filename)} l[] ${_url_$1}/$filename o ${_path_rc}$filename rm onfail endl fi + e[] "Download "$filename + if $2" || "!isfile(['{/${-path_cache}$filename}']) l[] + ${_url_$1}/$filename o ${-path_cache}$filename rm onfail + endl fi progress {100*$_n/$_N} _n+=1 done @@ -24988,7 +30818,7 @@ #@gui : To do so, you need to create a .gmic #@gui : file in your $HOME/ folder (or %APPDATA%/user.gmic on Windows). #@gui : It will be read each time the plug-in is launched, or when the Refresh -#@gui : button (under the central pane) is pressed. It must be a regular ascii file, containing the declarations and +#@gui : button (under the central pane) is pressed. It must be a regular text file, containing the declarations and #@gui : implementations of the filters (written in the G'MIC language) that will be added #@gui : to the list of available ones."} #@gui : note = note{" @@ -25013,6 +30843,25 @@ #@gui : note = note{"\nSupporters:"} #@gui : note = note{" - A big hug goes to these friends who supported the project:"} #@gui : note = note{" +#@gui : Christian Stenner, +#@gui : Daniel Balle, +#@gui : Matthias Fuchs, +#@gui : Alban Bourrat, +#@gui : Elizabeth Hayman, +#@gui : Nicolas Künzler, +#@gui : Mikael Wargh, +#@gui : Giovanni Bianchessi, +#@gui : Job van der Zwan, +#@gui : Laurent Espitallier, +#@gui : Mark van der Grijp, +#@gui : Patrick Wauters, +#@gui : Marc-André Gasser, +#@gui : Steven Shupe, +#@gui : Mika Yrjölä, +#@gui : Silvio Grosso, +#@gui : Marek Kubica, +#@gui : Mike Bing, +#@gui : Dave Allen, #@gui : Margaret Wong, #@gui : Adrian Bottomley, #@gui : Pamela Young, @@ -25029,12 +30878,11 @@ #@gui : Abhijeet Borkar, #@gui : Arleta Lesniewska, #@gui : Nicola Giaccobe, -#@gui : Helmut Mühleisen, +#@gui : Helmut Mühleisen, #@gui : Paul Buckley, -#@gui : Mike Bing, #@gui : Olivier Lecarme, #@gui : Edward Ingram, -#@gui : Stefan Städtler-Ley, +#@gui : Stefan Städtler-Ley, #@gui : Michel Pastor, #@gui : Sz.U, #@gui : Sven Kraft, @@ -25045,12 +30893,12 @@ #@gui : Manlio Barolo, #@gui : John Lewandowski, #@gui : Didier Lima, -#@gui : Žygimantas Tauras, +#@gui : Žygimantas Tauras, #@gui : Massimo Ferri, #@gui : Hiroshi Takekawa, #@gui : Freelance writer, #@gui : Elaine Hutchings, -#@gui : András Somogyi, +#@gui : András Somogyi, #@gui : Jason Dora, #@gui : Boris Hajdukovic, #@gui : Jeff Combs / Mappish, @@ -25089,13 +30937,13 @@ #@gui : Sudi, #@gui : Michael Prostka, #@gui : Arkadi Gelfond, -#@gui : Sabine Schäfers, +#@gui : Sabine Schäfers, #@gui : Bull O'Woods, #@gui : Jost Jakob Schaper, #@gui : Dominik Wefers, #@gui : Frank McLaughlin, #@gui : Jonas Wagner, -#@gui : Void lon iXaarii, +#@gui : Void lon iXaarii, #@gui : Mark Boadey, #@gui : Laura Haglund, #@gui : Lee Elliott, @@ -25120,12 +30968,12 @@ #@gui : Henk Koning, #@gui : Arnie Jordan, #@gui : Carol Jennings, -#@gui : Sébastien Huart, +#@gui : Sébastien Huart, #@gui : Jess Stryker, #@gui : Rui Luis, #@gui : Renato Salles, #@gui : Petr Zagalak, -#@gui : Antonio Vicién Faure, +#@gui : Antonio Vicién Faure, #@gui : Vincent Bermel, #@gui : Christian Stocco, #@gui : Richard Benedict, @@ -25176,16 +31024,17 @@ #@gui : James Prichard, #@gui : Matt Jones, #@gui : Eddy Vervest, -#@gui : Steven Shupe, #@gui : Flavio Casadei Della Chiesa, #@gui : Lyle Kroll. #@gui : "} #@gui : sep = separator() #@gui : note = note{"\nPostcard senders:"} -#@gui : note = note{" - We've received 44 postcards from G'MIC enthusiasts so far. -#@gui : You could be the 45rd sender :)"} +#@gui : note = note{" - We've received 46 postcards from G'MIC enthusiasts so far. +#@gui : You could be the 47rd sender :)"} #@gui : note = note{" - A big hug goes to these postcard senders (recently received first) :"} #@gui : note = note{" +#@gui : Benjamin Russell (Portsmouth/USA), +#@gui : Andreas Weissenburger (Bochum/Germany), #@gui : Patrick Wanters (USA), #@gui : Josep Febrer (Pregonda/Menorca), #@gui : Richard Gledson (Newcastle upon tyne/England), @@ -25250,42 +31099,47 @@ 40,73,1,1,0 ellipse 22,22,20,20,0,1,1 polygon 3,7,37,42,72,42,27,1,1 +mirror x a x #@gui Gmicky - Roddy : fx_gmicky, fx_gmicky_preview -#@gui : Mascot Image = choice{"Gmicky (by Deevad)","Gmicky (by Mahvin)","Gmicky & Wilber (by Mahvin)","Roddy (by Mahvin)"} +#@gui : Mascot Image = choice{"Gmicky (by Deevad)","Gmicky (by Mahvin)","Gmicky & Wilber (by Mahvin)", +#@gui : "Roddy (by Mahvin)"} #@gui : sep = separator() -#@gui : note = note{"Gmicky is the name of the G'MIC mascot. He is a small and cute tiger who knows how to do magic. +#@gui : note = note{"Gmicky is the name of the G'MIC mascot. +#@gui : He is a small and cute tiger who knows how to do magic. #@gui : Gmicky is a tiger, i.e. fast, agile and elegant, just as the G'MIC code is :). -#@gui : As many magicians, Gmicky knows lot of gimmicks, and he is a direct and friendly competitor of +#@gui : As many magicians, Gmicky knows lot of gimmicks, +#@gui : and he is a direct and friendly companion of #@gui : the ImageMagick's wizard, or the GraphicMagick's frog."} -#@gui : note = note{"Roddy is another mascot designed specifically for the Artistic / Rodilius filter of G'MIC.\n"} +#@gui : note = note{"Roddy is another mascot designed specifically for the +#@gui : Artistic / Rodilius filter of G'MIC.\n"} #@gui : note = note{"Gmicky and Roddy have been both created and drawn by "} #@gui : url = link("Mahvelous Mahvin","http://www.mahvin.com/") #@gui : note = note{"and"} #@gui : url = link{"David Revoy (Deevad)","http://www.davidrevoy.com/"} fx_gmicky : --rm - if {$1==0} gmicky_deevad nm "name(Gmicky)" - elif {$1==1} gmicky_mahvin nm "name(Gmicky)" - elif {$1==2} gmicky_wilber nm "name(Gmicky & Wilber)" - else roddy nm "name(Roddy)" + rm + if $1==0 sp gmicky nm "name(Gmicky)" + elif $1==1 sp gmicky_mahvin nm "name(Gmicky)" + elif $1==2 sp gmicky_wilber nm "name(Gmicky & Wilber)" + else sp roddy nm "name(Roddy)" fi fx_gmicky_preview : - w={w} h={h} rm - if {$1==0} - filename=${_path_rc}gmicky_small_deevad.cimgz - url=https://gmic.eu/img/gmicky_small_deevad.cimgz - elif {$1==1} - filename=${_path_rc}gmicky_small_mahvin.cimgz - url=https://gmic.eu/img/gmicky_small_mahvin.cimgz - elif {$1==2} - filename=${_path_rc}gmicky_wilber_small.cimgz - url=https://gmic.eu/img/gmicky_wilber_small.cimgz - else - filename=${_path_rc}roddy_small.cimgz - url=https://gmic.eu/img/roddy_small.cimgz - fi - if $filename $filename else $url o $filename fi - r2dy $h + fx_gmicky $* rr2d $_preview_width,$_preview_height,0,2 + +#@gui Privacy Notice : _none_, _none_ +#@gui : note = note{"This plugin may download up-to-date filter definitions from the +#@gui : gmic.eu server.\n\n +#@gui : It is the case when first launched after a fresh installation, and periodically +#@gui : with a frequency which can be set in the settings dialog. +#@gui : The user should be aware that the following information may be retrieved +#@gui : from the server logs: IP address of the client; date and time of the request; +#@gui : as well as a short string, supplied through the HTTP protocol "User Agent" header +#@gui : field, which describes the full plugin version as shown in the window title +#@gui : (e.g. "G'MIC-Qt for GIMP 2.8 - Linux 64 bits - 2.2.1_pre#180301").\n\n +#@gui : Note that this information may solely be used for purely anonymous +#@gui : statistical purposes. +#@gui : "} +#@gui : sep = separator() +#@gui : note = note("Author: Sébastien Fourey.      Latest Update: 2018/03/01.") #@gui Release Notes : _none_, _none_ #@gui : note = note{" @@ -25298,30 +31152,23 @@ #@gui : - 2017/10/09 : version 2.1.0.\n #@gui : - 2018/02/15 : version 2.2.0.\n #@gui : - 2018/06/21 : version 2.3.0.\n -#@gui : - 2019/01/11 : version 2.4.5 (Current stable).\n -##@gui : - 2019/01/02 : version 2.4.5_pre (Current pre-release).\n +#@gui : - 2018/10/04 : version 2.4.0.\n +#@gui : - 2019/03/15 : version 2.5.0.\n +#@gui : - 2019/04/29 : version 2.6.0.\n +#@gui : - 2019/08/14 : version 2.7.0.\n +#@gui : - 2019/12/04 : version 2.8.0.\n +#@gui : - 2020/03/28 : version 2.9.0.\n +#@gui : - 2020/09/03 : version 2.9.2 (Current stable).\n +##@gui : - 2020/06/14 : version 2.9.2 (Current pre-release).\n #@gui : "} #@gui : sep = separator() -#@gui : url = link{"View changelog to upcoming major version (2.5.0)","https://discuss.pixls.us/t/on-the-road-to-2-5-0"} -#@gui : url = link{"View latest minor changelog (2.4.0)","https://discuss.pixls.us/t/release-of-gmic-2-4-0"} -#@gui : url = link{"View latest major changelog (2.0.0)","https://discuss.pixls.us/t/release-of-gmic-2-0-0"} +#@gui : url = link{"View changelog to upcoming major version (3.0)","https://discuss.pixls.us/t/on-the-road-to-3-0"} +#@gui : url = link{"View latest minor changelog (2.9)","https://discuss.pixls.us/t/release-of-gmic-2-9"} +#@gui : url = link{"View latest major changelog (2.0)","https://discuss.pixls.us/t/release-of-gmic-2-0-0"} -#@gui Privacy Notice : _none_, _none_ -#@gui : note = note{"This plugin may download up-to-date filter definitions from the gmic.eu server.\n\n -#@gui : It is the case when first launched after a fresh installation, and periodically -#@gui : with a frequency which can be set in the settings dialog. -#@gui : The user should be aware that the following information may be retrieved -#@gui : from the server logs: IP address of the client; date and time of the request; -#@gui : as well as a short string, supplied through the HTTP protocol "User Agent" header -#@gui : field, which describes the full plugin version as shown in the window title -#@gui : (e.g. "G'MIC-Qt for GIMP 2.8 - Linux 64 bits - 2.2.1_pre#180301").\n\n -#@gui : Note that this information may solely be used for purely anonymous -#@gui : statistical purposes. -#@gui : "} -#@gui : sep = separator(), note = note("Author: Sébastien Fourey. Latest Update: 2018/03/01.") -#@gui ____Arrays & Tiles -#---------------------------------- +#@gui ____Arrays & Tiles +#------------------------------- #@gui Array [Faded] : fx_array_fade, fx_array_fade_preview(1) #@gui : X-Tiles = int(2,1,10) @@ -25332,9 +31179,10 @@ #@gui : Fade End (%) = float(90,1,100) #@gui : Mirror = choice("None","X-Axis","Y-Axis","XY-Axes") #@gui : Size = _choice("Shrink", "Expand", "Repeat [Memory Consuming!]") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_array_fade : - if {$7&1} mirror x fi if {$7>1} mirror y fi + if $7&1 mirror x fi if $7>1 mirror y fi array_fade $1,$2,$5,$6,$8 shift -$3%,-$4%,0,0,2 @@ -25349,19 +31197,20 @@ #@gui : Initialization = choice("Original","Mirror X","Mirror Y","Rotate 90 deg.","Rotate 180 deg.","Rotate 270 deg.") #@gui : Expand Size = _bool(false) #@gui : Crop (%) = int(0,0,100) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_array_mirror : skip ${7=0} - if {$5==1} mirror x - elif {$5==2} mirror y - elif {$5==3} rotate 90 - elif {$5==4} rotate 180 - elif {$5==5} rotate 270 + if $5==1 mirror x + elif $5==2 mirror y + elif $5==3 rotate 90 + elif $5==4 rotate 180 + elif $5==5 rotate 270 fi if $7 - if {$4==0} columns 0,{100-$7}% - elif {$4==1} rows 0,{100-$7}% - elif {$4==2} z 0,0,{100-$7}%,{100-$7}% - elif {$4==3} z {$7/2}%,{$7/2}%,{100-$7/2}%,{100-$7/2}% + if $4==0 columns 0,{100-$7}% + elif $4==1 rows 0,{100-$7}% + elif $4==2 z 0,0,{100-$7}%,{100-$7}% + elif $4==3 z {$7/2}%,{$7/2}%,{100-$7/2}%,{100-$7/2}% fi fi shift -$2%,-$3%,0,0,2 @@ -25375,13 +31224,15 @@ #@gui : Source Y-Tiles = int(5,1,20) #@gui : Destination X-Tiles = int(7,1,20) #@gui : Destination Y-Tiles = int(7,1,20) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") #@gui Array [Random Colors] : fx_array_color, fx_array_color(1) #@gui : X-Tiles = int(5,1,20) #@gui : Y-Tiles = int(5,1,20) #@gui : Opacity = float(0.5,0,1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_array_color : repeat $! l. $1,$2,1,3 rand. 0,255 to_colormode. {-2,s} r. .. *. $3 *.. {1-$3} +[-2,-1] @@ -25394,17 +31245,19 @@ #@gui : Y-Offset (%) = float(0,0,100) #@gui : Mirror = choice("None","X-Axis","Y-Axis","XY-Axes") #@gui : Size = _choice("Shrink", "Expand", "Repeat [Memory Consuming!]") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_array : shift -$3%,-$4%,0,0,2 - if {$5&1} mirror x fi if {$5>1} mirror y fi + if $5&1 mirror x fi if $5>1 mirror y fi array $1,$2,$6 fx_array_preview : fx_array $1,$2,$3,$4,$5,0 #@gui Ascii Art : fx_asciiart, fx_asciiart_preview(0)+ -#@gui : Charset = choice(5,"Custom","Binary Digits","Digits","Lowercase Letters","Uppercase Letters","Ascii","Card Suits","Math Symbols") +#@gui : Charset = choice(5,"Custom","Binary Digits","Digits","Lowercase Letters","Uppercase Letters", +#@gui : "Ascii","Card Suits","Math Symbols") #@gui : Custom Dictionary = text{" .oO0"} #@gui : Analysis Scale = int(16,8,103) #@gui : Analysis Smoothness = float(15,0,100) @@ -25419,33 +31272,44 @@ #@gui : Output Ascii File = _bool(0) #@gui : Output Folder = _folder() #@gui : Output Filename = _text("gmic_asciiart.txt") -#@gui : sep = separator(), url = link("Click here for a detailed description of this filter.","http://www.gimpchat.com/viewtopic.php?f=28&t=10047") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/27/03.") +#@gui : sep = separator() +#@gui : url = link("Click here for a detailed description of this filter.",\ +# "http://www.gimpchat.com/viewtopic.php?f=28&t=10047") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/27/03.") fx_asciiart : skip ${10=},"${11=}","${12=}" repeat $! l[$>] to_rgb apply_gamma {10^$7} b $8% n 0,255 - if {$1==0} dict="$2" - elif {$1==1} dict=" 01" - elif {$1==2} dict=" 0123456789" - elif {$1==3} dict=" abcdefghijklmnopqrstuvwxyz" - elif {$1==4} dict=" ABCDEFGHIJKLMNOPQRSTUVWXYZ" - elif {$1==5} dict=" !\042#$%&\047()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\133\\\135^_\140abcdefghijklmnopqrstuvwxyz\173|\174~" - elif {$1==6} dict=" \16\17\20\21" - elif {$1==7} dict=" \200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231" + if $1==0 dict="$2" + elif $1==1 + dict=" 01" + elif $1==2 + dict=" 0123456789" + elif $1==3 + dict=" abcdefghijklmnopqrstuvwxyz" + elif $1==4 + dict=" ABCDEFGHIJKLMNOPQRSTUVWXYZ" + elif $1==5 + dict=" !\042#$%&\047()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\133\\\135^_\140abcdefghijklmnopqrstu"\ + "vwxyz\173|\174~" + elif $1==6 + dict=" \16\17\20\21" + elif $1==7 + dict=" \200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231" fi - if {$6==1} negate fi + if $6==1 negate fi if $-3 +img2ascii $dict,$3,$4%,$5,"$-2"/"$-1" else +img2ascii $dict,$3,$4%,$5 fi wh=${} - if {$6==0} k. n 0,255 - elif {$6==1} k. negate n 0,255 - elif {$6==2||$6==3} + if $6==0 k. n 0,255 + elif $6==1 k. negate n 0,255 + elif $6==2" || "$6==3 r[0] $wh,1,100%,1 - if {$9>=7} luminance[0] fi - if {$9%7} quantize[0] {arg($9%7,2,3,4,8,12,16)-1},1,0 fi + if $9>=7 luminance[0] fi + if $9%7 quantize[0] {arg($9%7,2,3,4,8,12,16)-1},1,0 fi r[0] [1],[1],1,100% *[0] [1] - if {$6==2} rm[1] + if $6==2 rm[1] else *[1] 255 a c fi fi @@ -25467,8 +31331,13 @@ #@gui : Opacity = float(0.5,0,1) #@gui : First Color = color(0,0,0,255) #@gui : Second Color = color(255,255,255,255) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_chessboard : to_rgba chessboard ${1-14} @@ -25479,16 +31348,17 @@ #@gui : Resolution = float(2,1,10) #@gui : Size = int(24,8,64) #@gui : Color Model = choice(1,"Black Dices","White Dices","Dices with Colored Numbers","Dices with Colored Sides") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/27/06.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/27/06.") fx_dices : # Create dice patterns. repeat 6 {2*$2},{2*$2} _dice$> done - if {$3%2} negate[-6--1] fi + if $3%2 negate[-6--1] fi frame_round[-6--1] 10,10,0,0,128,128,128,0 r2dy[-6--1] $2 a[-6--1] x - repeat {$!-1} l[$>,-1] + repeat $!-1 l[$>,-1] # Prepare input images. +luminance[0] rv[1,2] r[0,1] {100*$1/$2}%,{100*$1/$2}%,1,100%,2 quantize[1] 6,0 @@ -25497,7 +31367,7 @@ *.. $2 channels.. 0,1 r.. {$2*100}%,{$2*100}% $2,$2,1,2,'if(c,y,x)' r. ...,...,1,2,0,2 +[-3,-1] +warp. ..,0,0 rm... - if {$3<2} rm[0] mv. 0 + if $3<2 rm[0] mv. 0 else r[0] [2],[2],1,100% rv[0,-1] blend[0,-1] multiply fi @@ -25510,8 +31380,9 @@ _dice4 : _dice3 _dice0 _dice5 : _dice3 ellipse. 25%,50%,5.2%,5.2%,0,1,255 ellipse. 75%,50%,5.2%,5.2%,0,1,255 -#@gui Drawn Montage : fx_drawn_montage, fx_drawn_montage_preview(1) -#@gui : Layer = choice("1st","2nd","3rd","4th","5th","6th","7th","8th","9th","10th","11th","12th","13th","14th","15th","16th") +#@gui Drawn Montage : fx_drawn_montage, fx_drawn_montage_preview(1) : * +#@gui : Layer = choice("1st","2nd","3rd","4th","5th","6th","7th","8th","9th","10th","11th","12th", +#@gui : "13th","14th","15th","16th") #@gui : Associated Color = color(0,0,0) #@gui : Zoom = float(-10,0,10) #@gui : X-Centering (%) = float(50,0,100) @@ -25534,15 +31405,17 @@ #@gui : Args13 = value(0:0:0:0:50:50:0) #@gui : Args14 = value(0:0:0:0:50:50:0) #@gui : Args15 = value(0:0:0:0:50:50:0) -#@gui : sep = separator(), note = note{"Note: -#@gui : This filter requires a top layer containing the desired montage layout defined as free-form shapes of different colors. You can then assign each -#@gui : layer to a layout color to create the montage. +#@gui : sep = separator() +#@gui : note = note{"Note: +#@gui : This filter requires a top layer containing the desired montage layout defined as free-form shapes +#@gui : of different colors. You can then assign each layer to a layout color to create the montage. #@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2018/01/29.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2018/01/29.") _fx_drawn_montage : nb_layers={min(16,$!-1)} - if {!$nb_layers} + if !$nb_layers error="A top layout layer is missing for this filter to make it work properly!" if $-1 gui_warning_preview $error return else error $error @@ -25551,16 +31424,21 @@ # Manage parameter changes. pargs,args0,args1,args2,args3,args4,args5,args6,args7,args8,args9,args10,args11,args12,args13,args14,args15=${9-25} - if {$1!=$pargs} # Get back saved parameters for selected layer - ({'${args$1}'}) replace. {':'},{','} arg_R,arg_G,arg_B,arg_zoom,arg_xcenter,arg_ycenter,arg_angle=${u\ {t}} rm. + if $1!=$pargs # Get back saved parameters for selected layer + ('${args$1}') replace. {':'},{','} arg_R,arg_G,arg_B,arg_zoom,arg_xcenter,arg_ycenter,arg_angle=${u\ {t}} rm. else # Set new parameters for selected #L arg_R,arg_G,arg_B,arg_zoom,arg_xcenter,arg_ycenter,arg_angle=${2-8} fi args$1=$arg_R:$arg_G:$arg_B:$arg_zoom:$arg_xcenter:$arg_ycenter:$arg_angle - status=\{$1\}\{$arg_R,$arg_G,$arg_B\}\{$arg_zoom\}\{$arg_xcenter\}\{$arg_ycenter\}\{$arg_angle\}\{$1\}\{$args0\}\{$args1\}\{$args2\}\{$args3\}\{$args4\}\{$args5\}\{$args6\}\{$args7\}\{$args8\}\{$args9\}\{$args10\}\{$args11\}\{$args12\}\{$args13\}\{$args14\}\{$args15\} + status=\{$1\}\{$arg_R,$arg_G,$arg_B\}\{$arg_zoom\}\{$arg_xcenter\}\{$arg_ycenter\}\{$arg_angle\}\{$1\}\{$args0\}\ + \{$args1\}\{$args2\}\{$args3\}\{$args4\}\{$args5\}\{$args6\}\{$args7\}\{$args8\}\{$args9\}\{$args10\}\ + \{$args11\}\{$args12\}\{$args13\}\{$args14\}\{$args15\} # Read parameters for all layers. - c= repeat $nb_layers ({'${args$>}'}) replace. {':'},{','} R$>,G$>,B$>,zoom$>,xcenter$>,ycenter$>,angle$>=${u\ {t}} cols=$cols$c${R$>},${G$>},${B$>} c=, rm. rotate[{1+$>}] {90*${angle$>}} done + c= repeat $nb_layers + ('${args$>}') replace. {':'},{','} R$>,G$>,B$>,zoom$>,xcenter$>,ycenter$>,angle$>=${u\ {t}} + cols=$cols$c${R$>},${G$>},${B$>} c=, rm. rotate[{1+$>}] {90*${angle$>}} + done # Get bounding boxes for each associated color in layout layer, as well as labeled layout layer. to_rgb[0] to_rgba[^0] $nb_layers,1,1,4,[inf,inf,-inf,-inf] [0],[0] @@ -25581,7 +31459,7 @@ # Render thumbnail of current layer, for preview. l={1+$1} - if {$l<=$nb_layers} + if $l<=$nb_layers if {$l,w>h} +r2dx[$l] {(0$_preview_width?0$_preview_width:400)/6} else +r2dy[$l] {(0$_preview_height?0$_preview_height:400)/6} fi frame. 1,1,0,0,0,255 drgba. to. "#"$l,0,-2,13 to_rgba. @@ -25590,12 +31468,12 @@ fi # Render region boundaries of layout layer, for preview. - +f. "const boundaries = 1; V = crop(x-2,y-2,5,5); if (min(V)==max(V),0,i)" + +f. "const boundaries = 1; ref(crop(x - 2,y - 2,5,5),V); if (min(V)==max(V),0,i)" (0,0,0,$cols) r. 3,{$nb_layers+1},1,1,-1 1,100%,1,1,y?255:0 a[-2,-1] x permute. yzcx map.. . rm. repeat $nb_layers xmin,ymin,xmax,ymax={-3,I[$>]} - if {!isinf($xmin)" && "!isinf($ymin)" && "!isinf($xmax)" && "!isinf($ymax)} + if !isinf($xmin)" && "!isinf($ymin)" && "!isinf($xmax)" && "!isinf($ymax) xc$>,yc$>={0,0.5*([$xmin,$ymin]+[$xmax,$ymax]-6)*100/[w,h]} else xc$>,yc$>=-1024 fi @@ -25606,12 +31484,12 @@ fi # Render montage. - if {iM>0} + if iM>0 # Resize layers to fit proposed layout. repeat $nb_layers l={$>+1} xmin,ymin,xmax,ymax={-2,I[$>]} - if {!isinf($xmin)" && "!isinf($ymin)" && "!isinf($xmax)" && "!isinf($ymax)} + if !isinf($xmin)" && "!isinf($ymin)" && "!isinf($xmax)" && "!isinf($ymax) dx={$xmax-$xmin+1} dy={$ymax-$ymin+1} nw,nh={$l,round(min(w/$dx,h/$dy)*[$dx,$dy]/(1+3*(${zoom$>}/10)^2))} @@ -25667,7 +31545,8 @@ #@gui : Output As = _choice(0,"Crop","Segmentation") #@gui : sep = separator() #@gui : Preview Guides = bool(1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/23/02.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/23/02.") #@gui : url = link("Filter explained here","http://gimpchat.com/viewtopic.php?f=28&t=7905") fx_extract_objects : if $5 min_area=$5% else min_area=6 fi @@ -25677,17 +31556,17 @@ x={$1%*(w-1)} y={$2%*(h-1)} color={I($x,$y)} - if {$7==0} # Output: Crop. + if $7==0 # Output: Crop. +replace_color $3,0,$color,0,0,0,0 autocrop_components. $4%,$min_area,$6,2 - repeat {w} + repeat w +z[0] {1,i($>,0)},{1,i($>,1)},{1,i($>,3)},{1,i($>,4)} nm. pos({1,i($>,0)},{1,i($>,1)}),name($nm" "[$>]) done rm[0,1] - elif {$7==1} # Output: Segmentation. + elif $7==1 # Output: Segmentation. replace_color $3,0,$color,0,0,0,0 +autocrop_components[0] $4%,$min_area,$6,2 autocrop_components[0] $4%,$min_area,$6,1 - repeat {w} nm[$>] pos({i($>,0)},{i($>,1)}),name($nm" "[$>]) done rm. + repeat w nm[$>] pos({i($>,0)},{i($>,1)}),name($nm" "[$>]) done rm. fi $w,$h,1,4 fc. $color nm. name($nm" [background]") endl done @@ -25701,7 +31580,7 @@ color={I($x,$y)} +replace_color $3,0,$color,0,0,0,0 autocrop_components. $4%,$min_area,$6,2 - repeat {w} + repeat w xycoords={1,i($>,0)},{1,i($>,1)},{1,i($>,3)},{1,i($>,4)} rectangle[0] $xycoords,0.3,0,0,255,255 rectangle[0] $xycoords,1,0xFFFFFFFF,0,0,0,255 @@ -25717,9 +31596,10 @@ endl done #@gui Grid [Cartesian] : fx_imagegrid, fx_imagegrid(0) -#@gui : X-Size = int(10,2,100) -#@gui : Y-Size = int(10,2,100) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : X-Size = int(10,2,512) +#@gui : Y-Size = int(10,2,512) +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_imagegrid : imagegrid $1,$2 @@ -25727,7 +31607,8 @@ #@gui : Resolution = int(32,1,128) #@gui : Outline = float(0.1,0,0.5) #@gui : Anti-Aliasing = bool(1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/12/01.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/12/01.") fx_imagegrid_hexagonal : repeat $! l[$>] if $3 r 200%,200%,1,100% fi @@ -25740,7 +31621,8 @@ #@gui : Pattern Height = int(18,8,128) #@gui : Pattern Type = choice(0,"Horizontal","Vertical","Crossed","Cube","Decreasing","Increasing") #@gui : Outline Color = color(255,255,255,128) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/08/07.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/08/07.") fx_imagegrid_triangular : repeat $! l[$>] split_opacity l[0] to_rgb imagegrid_triangular ${1-3},{$7/255},${4-6} @@ -25748,12 +31630,19 @@ #@gui Make Seamless [Diffusion] : fx_make_seamless, fx_make_seamless_preview(1) #@gui : Equalize Light = float(0,0,100) -#@gui : sep = separator(), +#@gui : sep = separator() #@gui : Preview Original = bool(0) #@gui : Tiled Preview = choice(3,"None","2x1","1x2","2x2","3x3","4x4") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note{"Note: This filter helps in converting your input pattern as a seamless (a.k.a periodic) texture."} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/24/02.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note{"Note: This filter helps in converting your input pattern as a seamless +#@gui : (a.k.a periodic) texture."} +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/24/02.") fx_make_seamless : repeat $! l[$>] if $1 +b {20.5-$1/50}% -[0] [1] fc. ${average_colors.} + fi @@ -25762,7 +31651,7 @@ fx_make_seamless_preview : u={arg($3,2,1,2,3,4)} v={arg($3,1,2,2,3,4)} - gui_split_preview "if {!$2} fx_make_seamless $* fi if $3 array "$u","$v" fi",${-3--1} + gui_split_preview "if !$2 fx_make_seamless $* fi if $3 array "$u","$v" fi",${-3--1} #@gui Make Seamless [Patch-Based] : fx_frame_seamless, fx_frame_seamless_preview(0) #@gui : Frame Size = int(32,0,256) @@ -25770,12 +31659,19 @@ #@gui : Blend Size = int(0,0,64) #@gui : Frame Type = choice(1,"Inner","Outer") #@gui : Equalize Light = float(100,0,100) -#@gui : sep = separator(), +#@gui : sep = separator() #@gui : Preview Original = bool(0) #@gui : Tiled Preview = choice(3,"None","2x1","1x2","2x2","3x3","4x4") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note{"Note: This filter helps in converting your input pattern as a seamless (a.k.a periodic) texture."} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/15/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note{"Note: This filter helps in converting your input pattern as a seamless +#@gui : (a.k.a periodic) texture."} +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/15/12.") fx_frame_seamless : repeat $! l[$>] if $5 +b {20.5-$5/50}% -[0] [1] fc. ${average_colors.} + fi @@ -25784,7 +31680,7 @@ fx_frame_seamless_preview : u={arg($7,2,1,2,3,4)} v={arg($7,1,2,2,3,4)} - gui_split_preview "if {!$6} fx_frame_seamless $* fi if $7 array "$u","$v" fi",${-3--1} + gui_split_preview "if !$6 fx_frame_seamless $* fi if $7 array "$u","$v" fi",${-3--1} #@gui Ministeck : fx_ministeck, fx_ministeck_preview(1) #@gui : Number of Colors = int(8,2,24) @@ -25794,10 +31690,11 @@ #@gui : Relief Amplitude = float(100,0,256) #@gui : Relief Size = float(0.3,0,1) #@gui : Add 1px Outline = bool(0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/14/01.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/14/01.") fx_ministeck : repeat $! l[$>] - if {w>h} r2dx {min($2,w)} else r2dy {min($2,h)} fi + if w>h r2dx {min($2,w)} else r2dy {min($2,h)} fi split_opacity l[0] +colormap. $1 index.. . [0],[0],1,1 rand[2] 0,1 dilate[2] $4 +[0,2] @@ -25819,7 +31716,7 @@ r $w,$h,1,100%,0,0,0.5,0.5 endl done -#@gui Montage : fx_montage, fx_montage_preview(1) +#@gui Montage : fx_montage, fx_montage_preview(1) : * #@gui : Montage Type = choice("Auto","Custom Layout","Horizontal","Vertical","Horizontal Array","Vertical Array") #@gui : Custom Layout = text{"V(H(0,1),H(2,V(3,4)))"} #@gui : Merging Mode = choice(1,"Aligned","Scaled") @@ -25837,28 +31734,33 @@ #@gui : Output As = _choice("Single Layer","Multiple Layers") #@gui : sep = separator() #@gui : note = note{"Instructions:\n -#@gui : - Don't forget to set the Input layers... option on the left if you have multiple input layers for your montage.\n +#@gui : - Don't forget to set the Input layers... option on the left if you have multiple input layers +#@gui : for your montage.\n #@gui : - The Custom layout parameter is only active when Montage type is set to Custom layout. #@gui : This is basically a string containing expressions such as:\n -#@gui : \n . H(a,b) or V(a,b) stand respectively for an horizontal and vertical merge of two blocks a and b. -#@gui : \n . R(a), stands for a 90-deg. rotated version of a block a. Use RR(a) and RRR(a) for resp. 180-deg and 270-deg. rotations. -#@gui : \n . M(a), stands for a X-mirrored version of a block a. Use MRR(a) for a Y-mirrored version of a.\n\n -#@gui : - A block a can be a layer indice or a nested montage expression itself.\n +#@gui : \n . H(a,b) or V(a,b) stand respectively for an horizontal and vertical merge of two +#@gui : blocks a and b. +#@gui : \n . R(a), stands for a 90-deg. rotated version of a block a. Use RR(a) and +#@gui : RRR(a) for resp. 180-deg and 270-deg. rotations. +#@gui : \n . M(a), stands for a X-mirrored version of a block a. Use MRR(a) for a Y-mirrored +#@gui : version of a.\n\n +#@gui : - A block a can be a layer index or a nested montage expression itself.\n #@gui : - Layer indices start from 0 (top layer) and are treated periodically. #@gui : "} #@gui : url = link("Click here for a tutorial","http://blog.patdavid.net/2014/05/gmic-montage.html") #@gui : url = link("+ video tutorial","http://www.youtube.com/watch?v=iM42vx22gwg") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/22/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/22/12.") fx_montage : skip "${2=A}" - if {!$!} return fi + if !$! return fi code0=X code1="$2" code2=H code3=V code4=A code5=B - if {$3==1&&$4<0.5} r {max(10,$4*200)}%,{max(10,$4*200)}%,1,100%,2 fi - to_rgba if $14 rv fi if {$13%$!} mv[{$13%$!}--1] 0 fi - if {$11||$12} repeat $! rotate[$>] {$11+u(-$12,$12)},1,0 done fi + if $3==1" && "$4<0.5 r {max(10,$4*200)}%,{max(10,$4*200)}%,1,100%,2 fi + to_rgba if $14 rv fi if $13%$! mv[{$13%$!}--1] 0 fi + if $11" || "$12 repeat $! rotate[$>] {$11+u(-$12,$12)},1,0 done fi montage ${code$1},{if($3==0,$4,2+max(0,$4-0.5))},$15,\ - "if {$""7%2} mirror x fi if {$""8%2} mirror y fi "\ + "if $""7%2 mirror x fi if $""8%2 mirror y fi "\ "rotate {90*$""6} "\ - "if {$5||$6} "\ + "if $5||$6 "\ "r {max(1,$""4-2*($5+$6))},{max(1,$""5-2*($5+$6))},1,100%,2 "\ "frame $6,$6,${7-10} "\ "r {w+2*$5},{h+2*$5},1,100%,0,0,0.5,0.5 "\ @@ -25867,25 +31769,27 @@ gui_set_layer_name "[Montage]" fx_montage_preview : skip "${2=A}" - if {!$!} return fi + if !$! return fi w={w} h={h} - if {$3==1&&$4<0.5} r {max(10,$4*200)}%,{max(10,$4*200)}%,1,100%,2 fi + if $3==1" && "$4<0.5 r {max(10,$4*200)}%,{max(10,$4*200)}%,1,100%,2 fi drgba code0=X code1="$2" code2=H code3=V code4=A code5=B - to_rgba if $14 rv fi if {$13%$!} mv[{$13%$!}--1] 0 fi - if {$11||$12} repeat $! rotate[$>] {$11+u(-$12,$12)},1,0 done fi + to_rgba if $14 rv fi if $13%$! mv[{$13%$!}--1] 0 fi + if $11" || "$12 repeat $! rotate[$>] {$11+u(-$12,$12)},1,0 done fi montage ${code$1},{if($3==0,$4,2+max(0,$4-0.5))},0,\ - "if {$""7%2} mirror x fi if {$""8%2} mirror y fi "\ - "rotate {90*$""6} "\ - "if {$5||$6} "\ - " r {max(1,$""4-2*($5+$6))},{max(1,$""5-2*($5+$6))},1,100%,2 fs={min(53,max(w,h)/3)} "\ - " frame $6,$6,${7-10} "\ - " r {w+2*$5},{h+2*$5},1,100%,0,0,0.5,0.5 "\ - " 0 t. \#$""1,0,0,$fs,1,255 expand_xy. 3,0 [-1]x3 a[-4--2] c dilate. {3+2*$fs/20} a.. .,c j[0] [1],{5+$5+$6},{$5+$6},0,0,1,[2],255 k[0] "\ - "else "\ - " r $""4,$""5,1,100%,2 fs={min(53,max(w,h)/3)} "\ - " 0 t. \#$""1,0,0,$fs,1,255 expand_xy. 3,0 [-1]x3 a[-4--2] c dilate. {3+2*$fs/20} a.. .,c j[0] [1],5,0,0,0,1,[2],255 k[0] "\ - "fi " + "if $""7%2 mirror x fi if $""8%2 mirror y fi + rotate {90*$""6} + if $5||$6 + r {max(1,$""4-2*($5+$6))},{max(1,$""5-2*($5+$6))},1,100%,2 fs={min(53,max(w,h)/3)} + frame $6,$6,${7-10} + r {w+2*$5},{h+2*$5},1,100%,0,0,0.5,0.5 + 0 t. \\\#$""1,0,0,$fs,1,255 expand_xy. 3,0 [-1]x3 a[-4--2] c + dilate. {3+2*$fs/20} a.. .,c j[0] [1],{5+$5+$6},{$5+$6},0,0,1,[2],255 k[0] + else + r $""4,$""5,1,100%,2 fs={min(53,max(w,h)/3)} + 0 t. \\\#$""1,0,0,$fs,1,255 expand_xy. 3,0 [-1]x3 a[-4--2] c + dilate. {3+2*$fs/20} a.. .,c j[0] [1],5,0,0,0,1,[2],255 k[0] + fi " nw={w} nh={h} resize_ratio2d $w,{$h-16},2,2 drgba @@ -25914,7 +31818,8 @@ #@gui : Shuffle Pieces = bool(0) #@gui : Additional Outline = bool(0) #@gui : Output Each Piece on a Different Layer = _bool(0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/06/01.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/06/01.") fx_puzzle : repeat $! l[$<] w={w} h={h} to_rgb @@ -25922,14 +31827,14 @@ +b. $6%,0 g. xy +[-2,-1] n. -$7,$7 +[0,-1] # Relief. +b. $8%,0 n. 0,1 *. -1 +. 1 n. {(255-$9)/255},1 *[0,-1] c 0,255 # Outline. - if {$10!=100||$11||$12||$13||$14||$15||$16} + if $10!=100||$11||$12||$13||$14||$15||$16 # Decompose puzzle into set of pieces. +-. 1 label_fg. 0 +area_fg. 0,0 <. 50% -|... . ==. 0 *[-2,-1] distance.. 0 *.. -1 watershed. .. rm.. label. 0,0 - repeat {iM+1} + repeat iM+1 +==[1] $> coords=${autocrop_coords.\ 0} +z[0] $coords z.. $coords rv[-2,-1] *.. . *. 255 a[-2,-1] c @@ -25952,7 +31857,7 @@ else # All pieces on the same layer. i[0] $w,$h,1,{s} - repeat {$!-1} + repeat $!-1 r2dy. {max(0.1,$10+$11*u(-1,1))}% rotate. {$12+$13*u(-1,1)} if $15 expand_xy. 1,0 fi cx={round(w/2)} cy={round(h/2)} @@ -25979,7 +31884,8 @@ #@gui : Ouline Color = color(0,0,0,255) #@gui : sep = separator() #@gui : Random Seed = int(0,0,65535) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/13/01.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/13/01.") fx_taquin : to_a repeat $! l[$>] srand $11 taquin $1,$2,$3,$4,$5%,$6,${7-10} endl done @@ -25987,9 +31893,13 @@ #@gui : Angle = float(45,0,360) #@gui : Maximum Size Factor = int(8,0,20) #@gui : Array Mode = choice(0,"None","x-axis","y-axis","xy-axes","2xy-axes") -#@gui : sep = separator(), note = note("Note: This filter implements the tileable rotation technique described by Peter Yu, at:") -#@gui : url = link("[Peter Yu] Create rotated tileable patterns","http://www.peteryu.ca/tutorials/gimp/rotate_tileable_patterns") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/26/05.") +#@gui : sep = separator() +#@gui : note = note("Note: This filter implements the tileable rotation technique described by +#@gui : Peter Yu, at:") +#@gui : url = link("[Peter Yu] Create rotated tileable patterns", +#@gui : "http://www.peteryu.ca/tutorials/gimp/rotate_tileable_patterns") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/26/05.") fx_rotate_tileable : if $3 array_mirror 1,{$3-1},1 fi rotate_tileable $1,{if($3==0,$2,$2/2)} @@ -26005,7 +31915,8 @@ #@gui : X-Shadow = float(3,-20,20) #@gui : Y-Shadow = float(3,-20,20) #@gui : Smoothness = float(1.8,0,5) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_rotate_tiles : to_rgba rotate_tiles $3,$1,$2 drop_shadow $4%,$5%,$6% @@ -26014,8 +31925,16 @@ #@gui : Y-Tiles = int(25,1,80) #@gui : Minimal Value = float(0,0,255) #@gui : Maximal Value = float(255,0,255) -#@gui : sep = separator(), Channel(s) = choice(11,"All","RGBA [all]","RGB [all]","RGB [red]","RGB [green]","RGB [blue]","RGBA [alpha]","Linear RGB [all]","Linear RGB [red]","Linear RGB [green]","Linear RGB [blue]","YCbCr [luminance]","YCbCr [blue-red chrominances]","YCbCr [blue chrominance]","YCbCr [red chrominance]","YCbCr [green chrominance]","Lab [lightness]","Lab [ab-chrominances]","Lab [a-chrominance]","Lab [b-chrominance]","Lch [ch-chrominances]","Lch [c-chrominance]","Lch [h-chrominance]","HSV [hue]","HSV [saturation]","HSV [value]","HSI [intensity]","HSL [lightness]","CMYK [cyan]","CMYK [magenta]","CMYK [yellow]","CMYK [key]","YIQ [luma]","YIQ [chromas]") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Channel(s) = choice(11,"All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") _fx_normalize_tiles : repeat $! l. split_tiles $1,$2 n $3,$4 append_tiles $1,$2 endl mv. 0 done @@ -26027,16 +31946,18 @@ #@gui : Y-Tiles = int(10,1,30) #@gui : Amplitude = float(10,0,100) #@gui : Opacity = float(1,0,1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_shift_tiles : to_rgba shift_tiles $1,$2,$3 - if {$4<1} repeat $! s. c *. $4 a[-4--1] c mv. 0 done fi + if $4<1 repeat $! s. c *. $4 a[-4--1] c mv. 0 done fi #@gui Tiled Parameterization : fx_parameterize_tiles, fx_parameterize_tiles(1) #@gui : X-Tiles = int(10,1,30) #@gui : Y-Tiles = int(10,1,30) #@gui : Fitting Function = choice("Linear","Quadratic") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_parameterize_tiles : if $3 quadratize_tiles $1,$2 @@ -26052,7 +31973,8 @@ #@gui : Y-Border = float(5,0,100) #@gui : Keep Tiles Square = bool(1) #@gui : Keep Borders Square = bool(1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/13/04.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/13/04.") fx_isolate_tiles : repeat $! l[$>] to_rgba if $5 sx={round(min(w,h)*max($1,$2)/100)} sy=$sx else sx={round(w*$1/100)} sy={round(h*$2/100)} fi @@ -26070,7 +31992,8 @@ #@gui : Number of Scales = int(3,1,10) #@gui : Shape = choice(8,"Triangle","Square","Diamond","Pentagon","Hexagon","Octogon","Decagon","Star","Circular") #@gui : Random Seed = int(0,0,65535) -#@gui : sep = separator(), note = note{"Starting parameters:"} +#@gui : sep = separator() +#@gui : note = note{"Starting parameters:"} #@gui : Density = int(30,1,256) #@gui : Radius (%) = float(8,0,50) #@gui : Outline (%) = float(4,0,100) @@ -26078,7 +32001,8 @@ #@gui : Smoothness = float(0.2,0,8) #@gui : Color = color(210,210,80,160) #@gui : Color Dispersion = float(0.7,0,1) -#@gui : sep = separator(), note = note{"Ending parameters:"} +#@gui : sep = separator() +#@gui : note = note{"Ending parameters:"} #@gui : Density = int(30,1,256) #@gui : Radius (%) = float(20,0,50) #@gui : Outline (%) = float(20,0,100) @@ -26086,21 +32010,26 @@ #@gui : Smoothness = float(2,0,8) #@gui : Color = color(170,130,20,110) #@gui : Color Dispersion = float(0.15,0,1) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/02/07.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/02/07.") fx_bokeh : _shape=$2 srand $3 repeat $! l[$<] nm=${-gui_layer_name} pos=${-gui_layer_pos} 100%,100%,1,3 - (${4-13};${14-23}) if {$1>2} r. 100%,$1,1,1,3 fi + (${4-13};${14-23}) if $1>2 r. 100%,$1,1,1,3 fi repeat $1 +rows. $> _fx_bokeh... {^} rm. done rm. nm. name($nm),opacity(100),mode(screen),pos($pos) rv - if {0$_output_mode==0} gui_merge_layers - elif {0$_output_mode<2} rm. + if 0$_output_mode==0 gui_merge_layers + elif 0$_output_mode<2 rm. fi endl done @@ -26126,7 +32055,7 @@ random3d $1 *3d. {-2,w},{-2,h},0 _fx_bokeh$_shape $radius1 - if {$radius2>=1} _fx_bokeh$_shape $radius2 r. ..,0,0,0.5,0.5 *. {max(0,min(1,1-$4))} -[-2,-1] fi + if $radius2>=1 _fx_bokeh$_shape $radius2 r. ..,0,0,0.5,0.5 *. {max(0,min(1,1-$4))} -[-2,-1] fi sigma={-3,$5%*w} r. {w+5*$sigma},{h+5*$sigma},1,1,0,0,0.5,0.5 b. $sigma,0 n. 0,255 @@ -26143,7 +32072,8 @@ #@gui Brushify : fx_brushify, fx_brushify_preview(0) #@gui : note = note("Brush parameters:") -#@gui : Shape = choice(7,"Bottom layer","Top layer","Rectangle","Diamond","Pentagon","Hexagon","Octogon","Ellipse","Gaussian","Star","Heart") +#@gui : Shape = choice(7,"Bottom layer","Top layer","Rectangle","Diamond","Pentagon","Hexagon","Octogon", +#@gui : "Ellipse","Gaussian","Star","Heart") #@gui : Ratio = float(0.25,0,1) #@gui : Number of Sizes = int(4,1,16) #@gui : Maximal Size = int(64,1,128) @@ -26165,7 +32095,8 @@ #@gui : Angle Dispersion = float(0.2,0,1) #@gui : sep = separator() #@gui : Preview Brush = bool(1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/22/04.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/22/04.") fx_brushify : _fx_brushify $* s0=0--3 s1=1--2 s2=0--2 @@ -26173,36 +32104,37 @@ _fx_brushify : # Insert brush at the end of the list N={0.9*$4} - if {$1==0} +autocrop. i.. 100%,100%,1,3,1 blend[-2,-1] alpha rr2d. $N,$N,0,3 - elif {$1==1} +autocrop[0] i.. 100%,100%,1,3,1 blend[-2,-1] alpha rr2d. $N,$N,0,3 - elif {$1==2} $4,$4 rectangle. 10%,10%,90%,90%,1,1 - elif {$1==3} shape_diamond. $N - elif {$1==4} shape_polygon $N,5 - elif {$1==5} shape_polygon $N,6 - elif {$1==6} shape_polygon $N,8 - elif {$1==7} shape_circle. $N - elif {$1==8} $4,$4 gaussian. 30%,30%,0 - elif {$1==9} shape_star $N - elif {$1==10} shape_heart $N + if $1==0 +autocrop. i.. 100%,100%,1,3,1 blend[-2,-1] alpha rr2d. $N,$N,0,3 + elif $1==1 +autocrop[0] i.. 100%,100%,1,3,1 blend[-2,-1] alpha rr2d. $N,$N,0,3 + elif $1==2 $4,$4 rectangle. 10%,10%,90%,90%,1,1 + elif $1==3 shape_diamond. $N + elif $1==4 shape_polygon $N,5 + elif $1==5 shape_polygon $N,6 + elif $1==6 shape_polygon $N,8 + elif $1==7 shape_circle. $N + elif $1==8 $4,$4 gaussian. 30%,30%,0 + elif $1==9 shape_star $N + elif $1==10 shape_heart $N fi norm. r. 100%,{max(0.01,100*$2)}%,1,1,2 r. $4,$4,1,1,0,0,0.5,0.5 spread. $7 b. $8% n. 0,1 fx_brushify_preview : - if {$1<2" && "$!<2} - gui_error_preview "When a custom brush (bottom or top layer) is specified, at least two layers are required for this filter to work.In this case, don't forget to set the 'Input layers' option!" + if $1<2" && "$!<2 + gui_error_preview "When a custom brush (bottom or top layer) is specified, at least two layers are required + for this filter to work.In this case, don't forget to set the 'Input layers' option!" return fi fx_brushify $* if $19 _fx_brushify $* - if {$1==0} rm.. elif {$1==1} rm[0] fi + if $1==0 rm.. elif $1==1 rm[0] fi rr2d. {0,max(1,w/5)},{0,max(1,h/5)},0,2 n. 0,255 frame. 3,3,0 frame. 1,1,255 frame. 1,1,0 to_rgb. to. "Brush",4,2,13,2,1,255,255,0 to_a. j[^-1] .,2,2 rm. else - if {$1==0} rm. elif {$1==1} rm[0] fi + if $1==0 rm. elif $1==1 rm[0] fi fi #@gui Cartoon : cartoon, fx_cartoon_preview(0) @@ -26212,8 +32144,13 @@ #@gui : Edge Thickness = float(0.25,0,1) #@gui : Color Strength = float(1.5,0,3) #@gui : Color Quantization = int(8,2,256) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_cartoon_preview : gui_split_preview "cartoon $*",${-3--1} @@ -26225,8 +32162,13 @@ #@gui : Filled Circles = bool(1) #@gui : Fill Transparent Holes = bool(1) #@gui : Normalize Colors = bool(1) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/16/06.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/16/06.") fx_circle_abstraction : repeat $! l[$>] b $4% @@ -26267,8 +32209,13 @@ #@gui : Angle = float(90,0,360) #@gui : Opacity = float(0.7,0.01,1) #@gui : Smoothness = float(0,0,5) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/05/06.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/05/06.") fx_cubism : repeat $1 cubism ${2--1} done @@ -26280,13 +32227,19 @@ #@gui : Edge Simplicity = float(0.5,0,3) #@gui : Edge Fidelity = int(4,0,10) #@gui : Normalize = bool(1) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Authors: David Tschumperlé and Garagecoder. Latest Update: 2014/03/06.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Authors: David Tschumperlé and Garagecoder +#@gui :       Latest Update: 2014/03/06.") fx_cutout : repeat $! l[$>] split_opacity l[0] median {10-$3} quantize $1 - +area. 0,1 med=${-med} rm. + +luminance. round. area. 0,1 med={ic} rm. inpaint_holes {$med*$2%},0,1 if $4 n 0,255 fi endl a c endl done @@ -26294,6 +32247,60 @@ fx_cutout_preview : gui_split_preview "fx_cutout $*",${-3--1} +#@gui Doodle : fx_doodle, gui_no_preview(0) +#@gui : Precision (%) = float(30,0,100) +#@gui : Smoothness = float(2,0,10) +#@gui : Coherence = float(2,0,10) +#@gui : Contour Threshold = float(1.5,0,10) +#@gui : Spacing = int(2,0,20) +#@gui : Minimal Stroke Length = float(70,0,255) +#@gui : Preview Progression While Running = _bool(1) +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2020/07/08.") +fx_doodle : skip "$*" + repeat $! l[$>] + b $2 n 0,255 structuretensors b $3 + 100%,100%,1,1,100 + if $7 w. ${"fitscreen ."},"[G'MIC] Doodle" fi + + _stopflag=0 + eval " + const dt = 0.5; + nb_strokes = nb_consecutive_fails = 0; + + while (nb_consecutive_fails<500*$1%, + run('+store. canvas'); + + P0 = u([w,h] - 1); + length = 0; + + for (dir = 0, dir<2, ++dir, + P = P0; + oiP = iP = round(P); + C = I(#0,P); E = eig([ C[0], C[1], C[1], C[2] ]); oV = V = (dir?1:-1)*E[4,2]; + + while (E[0]>$4^2 && (i(iP)>$5 || oiP==iP), + i(iP) = 0; + oiP = iP; + P+=dt*V; + iP = round(P); + C = I(#0,P,1); E = eig([ C[0], C[1], C[1], C[2] ]); V = E[4,2]; + dot(oV,V)<0?(V*=-1); + oV = V; + iP!=oiP?++length; + ); + ); + length<$6?(run('rm. $canvas'); ++nb_consecutive_fails):( + !(++nb_strokes%15)?run('distance. 0'); + nb_consecutive_fails = 0; + $7 && !(nb_strokes%30)?( + nb_consecutive_fails = run('if !{*} u inf else +neq. 0 r. {*,w,h},1,1,2 w. rm. u 0 fi') + ); + ) + )" + k. != 0 * 255 + endl done + #@gui Diffusion Tensors : fx_diffusiontensors, fx_diffusiontensors_preview(0) #@gui : Resolution (%) = float(10,0,20) #@gui : Size = float(5,0,16) @@ -26304,15 +32311,20 @@ #@gui : Anisotropy = float(1,0,1) #@gui : Gradient Smoothness = float(0,0,10) #@gui : Tensor Smoothness = float(3,0,10) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/19/10.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/19/10.") fx_diffusiontensors : repeat $! l[$>] wh={[w,h]} +diffusiontensors ${5-8} r2dx. $1% dt. {round(125/$1)},$2,{$3<3?$3:0},$4 - if {$3==3} + if $3==3 remove_opacity.. r.. .,.,1,100%,3 blend[0] [1],shapeaverage0 dilate. {1+2*$4} a c else k. fi r. $wh,1,100%,2 @@ -26328,8 +32340,13 @@ #@gui : Opacity = float(0.7,0,1) #@gui : Outline = float(3,1,3) #@gui : Density = float(0.5,0.1,2) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_ellipsionism : ellipsionism ${^0} @@ -26343,8 +32360,13 @@ #@gui : Opacity = float(0.1,0,1) #@gui : Edge = float(20,0,100) #@gui : Thickness = int(5,2,32) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2012/25/10.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2012/25/10.") fx_feltpen : repeat $! l[$>] +fx_hardsketchbw ${1-5},0,0 blend hardlight erode_oct $6 endl done @@ -26354,9 +32376,13 @@ #@gui Fractalize : fractalize, fractalize(1) #@gui : Detail Level = float(0.8,0,1) #@gui : sep = separator() -#@gui : note = note("Note: This filter uses lot of random values to generate its result, so running it twice will give you different results !") -#@gui : sep = separator(), url = link("Click here for a detailed description of this filter.","http://www.gimpchat.com/viewtopic.php?f=28&t=10036") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/25/04.") +#@gui : note = note("Note: This filter uses lot of random values to generate its result, +#@gui : so running it twice will give you different results !") +#@gui : sep = separator() +#@gui : url = link("Click here for a detailed description of this filter.",\ +# "http://www.gimpchat.com/viewtopic.php?f=28&t=10036") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/25/04.") #@gui Hard Sketch : fx_hardsketchbw, fx_hardsketchbw_preview(0) #@gui : Amplitude = float(300,0,4000) @@ -26365,16 +32391,22 @@ #@gui : Opacity = float(0.1,0,1) #@gui : Edge = float(20,0,100) #@gui : Fast Approximation = bool(0) -#@gui : Color Model = choice(4,"Black on white","White on black","Black on transparent white","White on transparent black","Color on white") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : Color Model = choice(4,"Black on white","White on black","Black on transparent white", +#@gui : "White on transparent black","Color on white") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_hardsketchbw : b $3 - if {$7==4} repeat $! l[$>] +hardsketchbw $1,$2,$4,$5,$6 blend hardlight endl done return fi + if $7==4 repeat $! l[$>] +hardsketchbw $1,$2,$4,$5,$6 blend hardlight endl done return fi hardsketchbw $1,$2,$4,$5,$6 - if {$7&1} negate fi - if {$7==2} r 100%,100%,1,4 repeat $! sh[$>] 3 *. -2 +. {2*255} c. 0,255 rm. done - elif {$7==3} r 100%,100%,1,4 repeat $! sh[$>] 3 *. 2 c. 0,255 rm. done + if $7&1 negate fi + if $7==2 r 100%,100%,1,4 repeat $! sh[$>] 3 *. -2 +. {2*255} c. 0,255 rm. done + elif $7==3 r 100%,100%,1,4 repeat $! sh[$>] 3 *. 2 c. 0,255 rm. done fi fx_hardsketchbw_preview : @@ -26386,15 +32418,22 @@ #@gui : Smoothness = float(60,0,255) #@gui : Highlight (%) = int(30,0,100) #@gui : Contrast (%) = float(20,0,100) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/24/10.") -#@gui : sep = separator(), note = note("This effect has been inspired by:") -#@gui : url = link("This tutorial by Sebastien Guyader and Patrick David","https://pixls.us/articles/highlight-bloom-and-photoillustration-look/") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/24/10.") +#@gui : sep = separator() +#@gui : note = note("This effect has been inspired by:") +#@gui : url = link("This tutorial by Sebastien Guyader and Patrick David", +#@gui : "https://pixls.us/articles/highlight-bloom-and-photoillustration-look/") fx_highlight_bloom : repeat $! l[$>] split_opacity l[0] +smooth $2,0.3,0.8,1,2 -.. . - amp=$3 do smooth. {min(50,$amp)},0.1,1,1,2 amp-=50 while {$amp>0} + amp=$3 do smooth. {min(50,$amp)},0.1,1,1,2 amp-=50 while $amp>0 +retinex. 16,lab,0,15 j.. .,0,0,0,0,{$4%} rm. ac. "normalize_local {$5%},5",lab_l *.. {$1%} @@ -26407,8 +32446,13 @@ #@gui Hope Poster : fx_poster_hope, fx_poster_hope_preview(0)+ #@gui : Gamma = float(0,-3,3) #@gui : Smoothness = float(3,0,20) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/07/11.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/07/11.") fx_poster_hope : repeat $! l[$>] split_opacity l[0] apply_gamma {10^$1} poster_hope $2 @@ -26423,16 +32467,22 @@ #@gui : Radius = int(5,0,30) #@gui : Threshold = float(80,0,100) #@gui : Opacity = float(0.1,0,1) -#@gui : Color Model = choice(4,"Black on white","White on black","Black on transparent white","White on transparent black","Color on white") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/18/05.") +#@gui : Color Model = choice(4,"Black on white","White on black","Black on transparent white", +#@gui : "White on transparent black","Color on white") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/18/05.") fx_houghsketchbw : b $1 n 0,255 - if {$6==4} repeat $! l[$>] +houghsketchbw ${2-5} blend hardlight endl done return fi + if $6==4 repeat $! l[$>] +houghsketchbw ${2-5} blend hardlight endl done return fi houghsketchbw ${2-5} - if {$6&1} negate fi - if {$6==2} r 100%,100%,1,4 repeat $! sh[$>] 3 *. -2 +. {2*255} c. 0,255 rm. done - elif {$6==3} r 100%,100%,1,4 repeat $! sh[$>] 3 *. 2 c. 0,255 rm. done + if $6&1 negate fi + if $6==2 r 100%,100%,1,4 repeat $! sh[$>] 3 *. -2 +. {2*255} c. 0,255 rm. done + elif $6==3 r 100%,100%,1,4 repeat $! sh[$>] 3 *. 2 c. 0,255 rm. done fi fx_houghsketchbw_preview : @@ -26441,10 +32491,22 @@ #@gui Kuwahara : fx_kuwahara, fx_kuwahara_preview(0) #@gui : Iterations = int(2,1,20) #@gui : Radius = int(5,1,30) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") #@gui : Value Action = choice("None","Cut","Normalize") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/31/05.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/31/05.") fx_kuwahara : ac "repeat $1 kuwahara $2 done",$3,$4 @@ -26458,15 +32520,22 @@ #@gui : Line Opacity = float(10,0,30) #@gui : Line Precision = int(24,1,128) #@gui : Color Mode = choice(0,"Subtractive","Additive") -#@gui : sep = separator(), Preview Progression While Running = _bool(1) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note{"Note:\n\n +#@gui : sep = separator() +#@gui : Preview Progression While Running = _bool(1) +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note{"Note:\n\n #@gui : - This filter is our own implementation of the nice algorithm proposed on the webpage #@gui : http://linify.me.\n #@gui : - This is a quite resource-demanding filter, so please be patient when running it.\n #@gui : - It actually renders better when applied on small images (<1024). #@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2017/11/21.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2017/11/21.") fx_linify : repeat $! l[$>] if $7 _debug=1 w ${-fitscreen\ {[w,h]}},0,"[Preview] G'MIC: Linify" fi @@ -26474,7 +32543,6 @@ endl done fx_linify_preview : - if {!${"-gui_check_version 216"}} return fi gui_split_preview "fx_linify ${1-6},0",${-3--1} #@gui Lylejk's Painting : fx_lylejk_painting, fx_lylejk_painting_preview(0) @@ -26482,8 +32550,14 @@ #@gui : Abstraction = int(2,1,20) #@gui : Radius = int(4,1,30) #@gui : Canvas = float(10,0,100) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Authors: Lyle Kroll and David Tschumperlé. Latest Update: 2015/23/02.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Authors: Lyle Kroll and David Tschumperlé. +#@gui :       Latest Update: 2015/23/02.") #@gui : url = link("Filter Explained here","http://www.gimpchat.com/viewtopic.php?f=10&t=2624") fx_lylejk_painting : repeat $! l[$>] @@ -26507,8 +32581,14 @@ #@gui : Color = float(1.5,0,4) #@gui : Smoothness = float(50,0,1000) #@gui : Sharpen Shades = bool(1) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Authors: Lyle Kroll, Angelo Lama and David Tschumperlé.\nLatest Update: 2011/28/02.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Authors: Lyle Kroll, Angelo Lama and David Tschumperlé. +#@gui : \nLatest Update: 2011/28/02.") fx_painting : skip ${4=0},${5=0} repeat $! l[$>] to_colormode {max(3,s)} split_opacity rv @@ -26525,8 +32605,13 @@ #@gui Pen Drawing : fx_pen_drawing, fx_pen_drawing_preview(0)+ #@gui : Amplitude = float(10,0,30) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_pen_drawing : drawing $1 @@ -26542,30 +32627,37 @@ #@gui : Outline (%) = float(50,0,100) #@gui : Outline Color = color(0,0,0,255) #@gui : Anti-Aliasing = bool(1) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2018/06/05.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2018/06/05.") fx_polygonize_delaunay : repeat $! l[$>] to_rgba wh={[w,h]} if $11 r 150%,150%,1,100%,3 fi # Compute Delaunay triangulation. mM={[im,iM]} b $4 n $mM - +to_rgb. gradient_norm. ge. $2 f. "!x || !y || x==w-1 || y==h-1?(u^0.25<$3%):(u^0.25<$1%?i:0)" {is+1},1,1,2 f.. ">begin(p = 0); i?(I[#-1,++p] = [x,y];p):0" + +to_rgb. gradient_norm. ge. $2 + f. "!x || !y || x==w-1 || y==h-1?(u^0.25<$3%):(u^0.25<$1%?i:0)" + {is+1},1,1,2 f.. ">begin(p = 0); i?(I[#-1,++p] = [x,y];p):0" delaunay.. # Render filling. - if {$5==4} # Linear + if $5==4 # Linear +f[0] 0 f... "*i?( p = I(#1); P0 = I[#2,p[0]]; P1 = I[#2,p[1]]; P2 = I[#2,p[2]]; W = solve([P0[0],P1[0],P2[0],P0[1],P1[1],P2[1],1,1,1],[x,y,1]); I(#-1) = cut(W[0]*I(#0,P0) + W[1]*I(#0,P1) + W[2]*I(#0,P2),0,255); );I" - elif {$5==3} # Average + elif $5==3 # Average +f[0] 0 f... "*i?( p = I(#1); P0 = I[#2,p[0]]; P1 = I[#2,p[1]]; P2 = I[#2,p[2]]; I(#-1) = (I(#0,P0) + I(#0,P1) + I(#0,P2))/3; );I" - elif {$5==2} # Random + elif $5==2 # Random +norm[1] label_fg. 0 {iM+1},1,1,3 rand. 0,255 to_rgba. point. 0 map.. . rm. else # Black or white +norm[1] !=. 0 *. 255 channels. -3,0 @@ -26594,9 +32686,16 @@ #@gui : X-Resolution = float(10,1,256) #@gui : Y-Resolution = float(10,1,256) #@gui : Outline Color = color(0,0,0,255) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), url = link("Click here for a detailed description of this filter.","http://www.gimpchat.com/viewtopic.php?f=28&t=9174") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/02/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : url = link("Click here for a detailed description of this filter.",\ +# "http://www.gimpchat.com/viewtopic.php?f=28&t=9174") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/02/12.") fx_polygonize : polygonize $1,$2,{$3^2},$4,$5 if $9 repeat $! l[$>] # has outline. @@ -26616,9 +32715,17 @@ #@gui : Edge Antialiasing = float(10,0,100) #@gui : Posterization Level = int(0,0,15) #@gui : Posterization Antialiasing = float(0,0,100) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), url = link("Click here for a detailed description of this filter.","http://www.davidrevoy.com/article147/gmic-new-filter-poster-edges") -#@gui : sep = separator(), note = note("Authors: David Tschumperlé and David Revoy. Latest Update: 2012/30/11.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : url = link("Click here for a detailed description of this filter.",\ +# "http://www.davidrevoy.com/article147/gmic-new-filter-poster-edges") +#@gui : sep = separator() +#@gui : note = note("Authors: David Tschumperlé and David Revoy. +#@gui :       Latest Update: 2012/30/11.") fx_poster_edges : if $1 bilateral 10,$1 fi poster_edges ${2-7} @@ -26634,17 +32741,26 @@ #@gui : Minimal Area = int(0,0,64) #@gui : Outline (%) = float(0,0,100) #@gui : Normalize Colors = bool(0) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/25/10.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/25/10.") fx_posterize : repeat $! l[$>] split_opacity l[0] - . amp=$1 do smooth. {min(50,$amp)},{$2%},1,$3,{2*$3} amp-=50 while {$amp>0} + . amp=$1 do smooth. {min(50,$amp)},{$2%},1,$3,{2*$3} amp-=50 while $amp>0 bilateral.. .,5,10 rm. srgb2rgb +colormap $4 rgb2srgb index.. .,0,0 - if $5 +area.. 0,0 <. $5 inpaint... .,0,3 rm. fi + if $5 + +area.. 0,0 <. $5 inpaint... .,0,3 rm. + fi map.. . rm. - if $6 +norm (0,1,0;1,1,1;0,1,0) +dilate.. . rm.. -[-2,-1] !=. 0 100%,100%,1,{0,s} j... .,0,0,0,0,{$6%},.. rm[-2,-1] fi + if $6 + +norm (0,1,0;1,1,1;0,1,0) +dilate.. . rm.. -[-2,-1] !=. 0 100%,100%,1,{0,s} j... .,0,0,0,0,{$6%},.. rm[-2,-1] + fi if $7 n 0,255 fi endl a c endl done @@ -26662,8 +32778,13 @@ #@gui : Secondary Radius = float(1.5,0,5) #@gui : Anisotropy = float(1,0,4) #@gui : Only Leafs = bool(1) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2017/15/06.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2017/15/06.") fx_quadtree : mode,precision,homogeneity,outline,radius1,radius2,anisotropy,only_leafs=${1-8} m "_qt : sh 3 u {w>1&&h>1?iv*(w*h)^"$homogeneity":-0.1} k[0]" # Function used to split quads @@ -26698,7 +32819,7 @@ # Estimate data average in each quad. channels[0] 0,2 +structuretensors[0] a[0,-1] c r. {w+6},100%,1,1,0 - repeat {h} + repeat h x0,y0,x1,y1={crop(0,$>,4,1)} +crop[0] $x0,$y0,$x1,$y1,3 r. 1,1,1,100%,2 y. x j.. .,{-2,w-6},$> rm. @@ -26708,7 +32829,7 @@ permute. cyzx channels[0] 0,3 f[0] 0 - if {$mode==0} # Squares + if $mode==0 # Squares f. "> rectangle(ind,P0,P1,opacity,color) = ( _P0 = P0; @@ -26730,7 +32851,7 @@ ); I" - elif {$mode==1} # Sierpinski design + elif $mode==1 # Sierpinski design f. "> P = I; Xpp = P[0,2]; @@ -26770,11 +32891,11 @@ if ("$outline">0, ellipse(#0,Xcc,R,r,angle,1,colo)); ellipse(#0,Xcc,R - "$outline",r - "$outline",angle,1,col); I" - if {!$outline} sh[0] 100% if {!im} solidify[0] 10% fi fi + if !$outline sh[0] 100% if !im solidify[0] 10% fi fi fi k[0] endl done - uncommand _qt + um _qt fx_quadtree_preview : gui_split_preview "fx_quadtree $*",${-3--1} @@ -26787,11 +32908,24 @@ #@gui : Offset = float(30,0,180) #@gui : Smoothness = int(0,0,5) #@gui : Color Mode = choice(1,"Darker","Lighter") -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") #@gui : Value Action = choice("None","Cut","Normalize") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 #@gui : url = link("Click here for a video tutorial","http://www.youtube.com/watch?v=RC07VUpzwGc") -#@gui : sep = separator(), note = note("Authors: David Tschumperlé and Rod/GimpChat. Latest Update: 2013/05/03.") +#@gui : sep = separator() +#@gui : note = note("Authors: David Tschumperlé and Rod/GimpChat. +#@gui :       Latest Update: 2013/05/03.") fx_rodilius : ac "rodilius ${1-5,7} repeat $6 smooth 10,0,1,1,1,0.8,45 sharpen 30 done c 0,255",$8,$9 @@ -26803,7 +32937,8 @@ #@gui : Branches = int(7,3,16) #@gui : Thickness = float(0.38,0,1) #@gui : Angle = float(0,0,360) -#@gui : note = note("Note: Parameters Branches, Thickness and Angle are used only for Custom shapes.") +#@gui : note = note("Note: Parameters Branches, Thickness and Angle are +#@gui : used only for Custom shapes.") #@gui : Antialiasing = bool(1) #@gui : sep = separator() #@gui : Scales = int(5,1,16) @@ -26815,8 +32950,11 @@ #@gui : Edges = float(0.5,0,2) #@gui : Smoothness = float(1,0,10) #@gui : Background = color(0,0,0,255) -#@gui : sep = separator(), url = link("Click here for a detailed description of this filter.","http://gimpchat.com/viewtopic.php?f=28&t=7500&sid=5b483979826903b8f8fc8fdaf1767dae") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/11/06.") +#@gui : sep = separator() +#@gui : url = link("Click here for a detailed description of this filter.",\ +# "http://gimpchat.com/viewtopic.php?f=28&t=7500&sid=5b483979826903b8f8fc8fdaf1767dae") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/11/06.") fx_shapeism : repeat $! l[$>] to_rgb @@ -26829,12 +32967,12 @@ # Create shape at given scale. size={if($6<=1,$7,$7+($8-$7)*$>/($6-1))} - if {$size<1} break fi + if $size<1 break fi if $5 {2*$size},{2*$size} _fx_shapeism$1. ${2-4} r2dy. $size else $size,$size _fx_shapeism$1. ${2-4} fi +!=. 0 expand_xy[-2,-1] 1,0 n[-2,-1] 0,1 - if {$10<1} dilate. 3 fi + if $10<1 dilate. 3 fi . a[-3--1] c # Pack sprites for given scale @@ -26884,9 +33022,21 @@ #@gui : Spatial Scale = float(4,0,32) #@gui : Value Scale = float(10,0,16) #@gui : Precision = float(0.5,0,2) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/20/09.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/20/09.") fx_sharp_abstract : ac "rolling_guidance ${1-3}",$4 @@ -26908,15 +33058,21 @@ #@gui : Coherence = float(6,0,10) #@gui : Boost Stroke = bool(0) #@gui : Curved Stroke = bool(1) -#@gui : Color Model = choice(4,"Black on white","White on black","Black on transparent white","White on transparent black","Color on white") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2018/05/11.") +#@gui : Color Model = choice(4,"Black on white","White on black","Black on transparent white", +#@gui : "White on transparent black","Color on white") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2018/05/11.") fx_sketchbw : - if {$15==4} repeat $! l[$>] +sketchbw ${1-14} blend hardlight endl done return fi + if $15==4 repeat $! l[$>] +sketchbw ${1-14} blend hardlight endl done return fi sketchbw ${1-14} - if {$15&1} negate fi - if {$15==2} r 100%,100%,1,4 repeat $! sh[$>] 3 *. -2 +. {2*255} c. 0,255 rm. done - elif {$15==3} r 100%,100%,1,4 repeat $! sh[$>] 3 *. 2 c. 0,255 rm. done + if $15&1 negate fi + if $15==2 r 100%,100%,1,4 repeat $! sh[$>] 3 *. -2 +. {2*255} c. 0,255 rm. done + elif $15==3 r 100%,100%,1,4 repeat $! sh[$>] 3 *. 2 c. 0,255 rm. done fi fx_sketchbw_preview : @@ -26928,23 +33084,185 @@ #@gui : Regularization Iterations = int(20,0,100) #@gui : Geometry = float(1,0,5) #@gui : Details = float(30,0,50) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/06/04.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/06/04.") fx_smooth_abstract : repeat $! l[$>] split_opacity l[0] srgb2rgb mM={[im,iM]} +b $4 n. $mM gradient_norm. <=. {50-$5} - inpaint_diffusion[0] [1],$1%,$2,$3 rm. + inpaint_pde[0] [1],$1%,$2,$3 rm. rgb2srgb c 0,255 endl a c endl done fx_smooth_abstract_preview : gui_split_preview "fx_smooth_abstract $*",${-3--1} +#@gui Stylize : fx_stylize,fx_stylize_preview +#@gui : Style = choice{0,"Custom Style (Top Layer)","Custom Style (Bottom Layer)", +#@gui : "Braque: Landscape near Antwerp", +#@gui : "Braque: Le Viaduc à l'Estaque", +#@gui : "Braque: Little Bay at La Ciotat", +#@gui : "Braque: The Mandola", +#@gui : "Delaunay: Windows Open Simultaneously", +#@gui : "Delaunay: Portrait de Metzinger", +#@gui : "Hokusai: The Great Wave", +#@gui : "Kandinsky: Squares with Concentric Circles", +#@gui : "Kandinsky: Yellow-Red-Blue", +#@gui : "Klee: Death and Fire", +#@gui : "Klee: In the Style of Kairouan", +#@gui : "Klee: Oriental Pleasure Garden Anagoria", +#@gui : "Klee: Polyphony 2", +#@gui : "Klee: Red waistcoat", +#@gui : "Klimt: The Kiss", +#@gui : "Mondrian: Composition in Red-Yellow-Blue", +#@gui : "Mondrian: Evening; Red Tree", +#@gui : "Mondrian: Gray Tree", +#@gui : "Monet: San Giorgio Maggiore at Dusk", +#@gui : "Monet: Water-Lily Pond", +#@gui : "Monet: Wheatstacks - End of Summer", +#@gui : "Munch: The Scream", +#@gui : "Picabia: Udnie", +#@gui : "Picasso: Les Demoiselles d'Avignon", +#@gui : "Picasso: Seated Woman", +#@gui : "Picasso: The Reservoir - Horta de Ebro", +#@gui : "Pollock: Convergence", +#@gui : "Pollock: Summertime Number 9A", +#@gui : "Van Gogh: Almond Blossom", +#@gui : "Van Gogh: Irises", +#@gui : "Van Gogh: The Starry Night", +#@gui : "Van Gogh: Wheat Field with Crows"} +#@gui : Scale Style to Fit Target Resolution = choice(5,"No rescaling","10%","20%","30%","50%","75%","100%","150%", +#@gui : "200%","250%","300%") +#@gui : Style Variations = choice("None","All XY-flips","All 90° rotations","All 45° rotations") +#@gui : Preview Progression While Running = bool(1) +#@gui : sep = separator(), note = note{"Style/Target Parameters:"} +#@gui : Fidelity to Target (Finest) = float(0.5,0,5) +#@gui : Fidelity to Target (Coarsest) = float(2,0,5) +#@gui : Fidelity Smoothness (Finest) = float(3,0,5) +#@gui : Fidelity Smoothness (Coarsest) = float(0.5,0,5) +#@gui : Fidelity Chromaticity = float(0.1,0,1) +#@gui : sep = separator(), note = note{"Image Matching Parameters:"} +#@gui : Match Colors With = choice(3,"Nothing","Gamma Balance","Histogram Transfer","PCA transfer") +#@gui : Colorspace = choice{3,"sRGB","Linear RGB","YCbCr","YCbCr (Luma/Chroma),"YCbCr (Luma Only)", +#@gui : "YCbCr (Chroma Only)","Lab","Lab (Luma/Chroma)","Lab (Luma Only)","Lab (Chroma Only)"} +#@gui : Keep Color Channels = choice{"All","Luminance Only (YCbCr)","Luminance Only (Lab)","Chrominances Only (CbCr)", +#@gui : "Chrominances Only (ab)"} +#@gui : Smoothness = float(0.7,0,5) +#@gui : Also Match Gradients = float(1,0,5) +#@gui : sep = separator(), note = note{"Advanced Parameters:"} +#@gui : Init. Type = choice("Best Match","Identity","Randomized") +#@gui : Init. Resolution = choice(1,"8px","16px","32px","64px","128px","256px") +#@gui : Init. With High Gradients Only = float(0,0,100) +#@gui : Patch Size for Analysis = int(5,2,16) +#@gui : Patch Size for Synthesis = int(5,2,16) +#@gui : Patch Size for Synthesis (Final) = int(7,2,16) +#@gui : Number of Matches (Finest) = int(1,0,10) +#@gui : Number of Matches (Coarsest) = int(30,0,200) +#@gui : Penalize Patch Repetitions = int(10,0,300) +#@gui : Matching Precision (Smaller is Faster) = float(2,0,10) +#@gui : Scale Factor = float(1.85,1.1,4) +#@gui : Skip Finest Scales = int(0,0,3) +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2019/01/10.") +fx_stylize : l[] if !narg($$stylize) _fx_stylize_ fi onfail endl + init_resolution={arg(1+$16,8,16,32,64,128,256)} + + # Define image matching function + colorspace=${"arg 1+$11,all,lrgb,ycbcr,ycbcr,ycbcr_y,ycbcr_cbcr,lab,lab,lab_l,lab_ab"} + match_colors="s c,-3 mv[1] 3 b[-2,-1] 1% negate[-2,-1] n[-2,-1] 0,1" + luma,chroma= + if $11==3" || "$11==7 # Chroma/Luma conversion for YCbCr or Lab + luma=_${"arg 1+($11==7),y,l"} + chroma=_${"arg 1+($11==7),cbcr,ab"} + fi + if $10==1 + match_colors=$match_colors" ac[0,1] \"balance_gamma ,\","$colorspace$luma + if narg($chroma) match_colors=$match_colors" ac[0,1] \"balance_gamma ,\","$colorspace$chroma fi + elif $10==2 + match_colors=$match_colors" transfer_histogram[0] [1],256,"$colorspace$luma + if narg($chroma) match_colors=$match_colors" transfer_histogram[0] [1],256,"$colorspace$chroma fi + elif $10==3 + match_colors=$match_colors" transfer_pca[0] [1],"$colorspace$luma" c[0] 0,255" + if narg($chroma) match_colors=$match_colors" transfer_pca[0] [1],"$colorspace$chroma" c[0] 0,255" fi + fi + if $12==1 match_colors=$match_colors" rgb2ycbcr[0,1] sh[0,1] 1,2 f[-2,-1] 128 rm[-2,-1] ycbcr2rgb[0,1]" + elif $12==2 match_colors=$match_colors" srgb2lab[0,1] sh[0,1] 1,2 f[-2,-1] 0 rm[-2,-1] lab2srgb[0,1]" + elif $12==3 match_colors=$match_colors" rgb2ycbcr[0,1] sh[0,1] 0 f[-2,-1] 128 rm[-2,-1] ycbcr2rgb[0,1]" + elif $12==4 match_colors=$match_colors" srgb2lab[0,1] sh[0,1] 0 f[-2,-1] 50 rm[-2,-1] lab2srgb[0,1]" + fi + match_colors=$match_colors\ + " b[0,1] xy,$13 repeat 2 l[$>] s c n 0,255 a c endl done *[-2,-1] {$14*255} a[0,-2] c a[1,-1] c" + + patch_penalization=$23 + + # Insert style image at the end of the list. + if $1<2 # Custom style (top or bottom layer) + if $!<2 error "At least two layers are required in this mode." fi + ind_first={$1==0?1:0} ind_style={$1==0?0:-1} N={$!-1} sh[$ind_style] + else + ind_first=0 N=$! ind_style= _fx_stylize {$1-2} + fi + + # Process layers. + is_window=0 + repeat $N l[{$ind_first+$>},-1] nm={0,n} + if $2 +rr2d[1] {0,[w,h]*arg($2,0.1,0.2,0.3,0.5,0.75,1,1.5,2,2.5,3)},1,2 fi + if $3==1 . +mirror. x +mirror[-2,-1] y a[-4--1] z + elif $3==2 +l. r {u={max(w,h)};[u,u]},1,100%,0,3,0.5,0.5 repeat 3 +rotate[0] {90*$>},1,3,50%,50% done a z endl + elif $3==3 +l. r {u={max(w,h)};[u,u]},1,100%,0,3,0.5,0.5 repeat 7 +rotate[0] {45*$>},1,3,50%,50% done a z endl + fi + if $4 wsiz=${"fitscreen "{0,[w,h]}} w[0] $wsiz is_window={*} fi + stylize[0] .,${5-9},$15,$init_resolution,${17-22},$patch_penalization,${24-26},$match_colors + k[0,1] nm[0] $nm0 + if $is_window" && "!{*} break fi + endl done + rm. # Remove style image + if 0$_output_mode + if narg($ind_style) rm[$ind_style] fi # Do not duplicate style layer if output mode -> new layers + if $is_window" && "!{*} rm fi # In case user closed the window, does not output new layers. + fi + +fx_stylize_preview : + if $1<2 # Custom style (top or bottom layer) + if $!<2 gui_warning_preview "At least two layers are required when specifying a custom style." return fi + ind_first={$1==0?1:0} ind_style={$1==0?0:-1} N={$!-1} sh[$ind_style] + else + ind_first=0 N=$! ind_style= _fx_stylize {$1-2} + fi + repeat $N l[{$ind_first+$>},-1] + gui_no_preview[0] , + +rr2d[1] {0,[w,h]*2/3},0,2 frame. 1,1,255 frame. 1,1,0,0,0,255 j[0] .,1%,30 rm. to[0] "Style:",1%,0,24 + endl done rm. + if narg($ind_style) rm[$ind_style] fi + +_fx_stylize : # Download pre-defined style image + if isnum($1) + name=${"arg 1+$1,landscapenearantwerp,leviaducalestaque,littlebayatlaciotat,themandola,windowsopensimultaneously,\ + portraitdemetzinger,greatwave,squareswithconcentriccircles,yellowredblue,deathandfire,inthestyleofkairouan,\ + orientalpleasuregardenanagoria,polyphony2,redwaistcoat,thekiss,compositionredyellowblue,redtree,graytree,\ + sangiorgiomaggioreatdusk,waterlilypond,wheatstacksendofsummer,scream,udnie,lesdemoisellesdavignon,seatedwoman,\ + reservoirhortadeebro,convergence,summertime9a,almondblossom,irises,starrynight,wheatfieldwithcrows"} + else name="$1" + fi + filename=${-path_cache}style_$name.png + if isfile(['{/$filename}']) $filename + else i https://gmic.eu/img/style_$name.png o. $filename + fi + #@gui Vector Painting : fx_vector_painting, fx_vector_painting_preview(1) #@gui : Details = float(9,0,10) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé.\nLatest Update: 2015/25/08.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.\nLatest Update: 2015/25/08.") fx_vector_painting : repeat $! l[$>] +luminance b. {10-$1}%,1,1 @@ -26966,22 +33284,28 @@ #@gui : Y-Tiles = int(3,1,10) #@gui : Smoothness = float(2,0,10) #@gui : Color = float(40,0,60) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") #@gui Whirl Drawing : fx_draw_whirl, fx_draw_whirl_preview(0) #@gui : Amplitude = float(20,0,100) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_draw_whirl : repeat $! l[$>] split_opacity draw_whirl[0] $* a c endl done fx_draw_whirl_preview : gui_split_preview "fx_draw_whirl $*",${-3--1} -#@gui ____Black & White -#--------------------------------- +#@gui ____Black & White +#------------------------------- -#@gui Black & White : fx_blackandwhite, fx_blackandwhite_preview(1)+ +#@gui Black & White : fx_blackandwhite, fx_blackandwhite_preview(1)+ #@gui : Red Level = float(0.299,0,1) #@gui : Red Smoothness = float(0,0,10) #@gui : Green Level = float(0.587,0,1) @@ -27008,8 +33332,13 @@ #@gui : sep = separator() #@gui : Pseudo-Gray Dithering = int(0,0,5) #@gui : Use Maximum Tones = bool(false) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/20/02.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/20/02.") fx_blackandwhite : repeat $! l. split_opacity rv to_rgb. s. c # Isolate opacity @@ -27018,7 +33347,7 @@ *. $5 b. $6% # Blue level + smoothness +[-3--1] /. {$1+$3+$5} c. 0,255 # (R,G,B) -> B&W adjust_colors ${7-11},0,255 - if {$12||$13||$14} + if $12||$13||$14 100%,100% [-1]x2 # Create noise for shadows, midtones and highlights. noise... 100,$17 b... $16% n... -$12,$12 # Scaled grain on shadows. noise.. 100,$17 b.. $16% n.. -$13,$13 # Scaled grain on midtones. @@ -27035,16 +33364,21 @@ fx_blackandwhite_preview : gui_split_preview "fx_blackandwhite $*",${-3--1} -#@gui B&W Stencil : fx_stencilbw, fx_stencilbw_preview(0) +#@gui B&W Stencil : fx_stencilbw, fx_stencilbw_preview(0) #@gui : Threshold = float(10,0,30) #@gui : Smoothness = float(10,0,30) #@gui : Hue = float(0,0,360) #@gui : Saturation = float(0,0,1) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_stencilbw : stencilbw $1,$2 - if {$3||$4} repeat $! l[$>] split_opacity + if $3||$4 repeat $! l[$>] split_opacity /[0] 255 i[0] 100%,100%,1,1,$4 i[0] 100%,100%,1,1,$3 a[0-2] c hsv2rgb[0] a c endl done fi @@ -27063,8 +33397,13 @@ #@gui : Background Color = color(255,255,255) #@gui : Foreground Color = color(0,0,0) #@gui : Invert Background / Foreground = bool(0) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/17/03.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/17/03.") #@gui : note = note("Inspired from the Charcoal script by micomicon :") #@gui : url = link("http://registry.gimp.org/node/25078") fx_charcoal : @@ -27076,7 +33415,7 @@ sharpen {$1*3} cut 0,255 if $6 +ir $7,$8 fi # Add highlights layer if required. ir[0] $2,$3 - if {!$15} ==[0] 0 fi + if !$15 ==[0] 0 fi -| +*[0] $10 +*[0] $11 *[0] $9 a[-3--1] c replace_color 0,0,0,0,0,$12,$13,$14 @@ -27087,18 +33426,21 @@ gui_split_preview "fx_charcoal $*",${-3--1} #@gui Colorize [Interactive] : fx_colorize_interactive, fx_colorize_interactive_preview -#@gui : Input Type = _choice("B&W Photograph","Lineart") -#@gui : Output Type = _choice{"Colorized Image (1 Layer)","Colors Only (1 Layer)","Image + Colors (2 Layers)","Image + Colors (Multi-Layers)"} +#@gui : Input Type = _choice("B&W Photograph","Lineart") +#@gui : Output Type = _choice{"Colorized Image (1 Layer)","Colors Only (1 Layer)","Image + Colors (2 Layers)", +#@gui : "Image + Colors (Multi-Layers)"} #@gui : View Resolution = _choice{1,"Small (Faster)","Medium","High (Slower)","Very High (Even Slower)"} #@gui : 1st Additional Palette (.gpl) = _filein() #@gui : 2nd Additional Palette (.gpl) = _filein() #@gui : Image to Grab Color from (.png) = _filein() #@gui : sep = separator() #@gui : note = note{"Description:\n -#@gui : This filter allows to quickly colorize a B&W image or lineart. -#@gui : Click on the Apply or OK buttons below to open the G'MIC interactive window and start adding color control points. -#@gui : When you're done, exit the interactive window: your colored result will be transferred back to the host software.\n\n -#@gui : If you are not satisfied with the result, Undo it (CTRL+Z), and click on Apply once again to modify your control points defined previously. +#@gui : This filter allows to quickly colorize a B&W image or lineart. +#@gui : Click on the Apply or OK buttons below to open the G'MIC interactive window and +#@gui : start adding color control points. When you're done, exit the interactive window: your colored +#@gui : result will be transferred back to the host software.\n\n +#@gui : If you are not satisfied with the result, Undo it (CTRL+Z), and click on Apply once +#@gui : again to modify your control points defined previously. #@gui : To clear all control points, click on the Reset button above. #@gui : "} #@gui : Clear Control Points = button(0.5) @@ -27123,35 +33465,54 @@ #@gui : - Keys CTRL+R resets window size.\n #@gui : - Keys ESC, Q or ENTER exit the interactive window. #@gui : "} -#@gui : sep = separator(), note = note("You can find more information on how to use this filter here :") -#@gui : url = link("David Revoy's G'MIC Colorization Page","http://www.davidrevoy.com/article240/gmic-line-art-colorization") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/12/07.") +#@gui : sep = separator() +#@gui : note = note("You can find more information on how to use this filter here :") +#@gui : url = link("David Revoy's G'MIC Colorization Page", +#@gui : "http://www.davidrevoy.com/article240/gmic-line-art-colorization") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/12/07.") fx_colorize_interactive : skip "${4=},${5=},${6=}" N=$! nm={n} resolution={arg(1+$3,512,1024,2048,0)} nm "[G"{`39`}"MIC] Colorize" - if {$9==-1" || "$8!=w" || "$9!=h} _gui_control_points= else _gui_control_points=${10--1} fi + if $9==-1" || "$8!=w" || "$9!=h _gui_control_points= else _gui_control_points=${10--1} fi N=$! - arg_palette1=0 l[] 0 nm. "$4" ext={x} rm if {same(['$ext'],'gpl',-1,0)} input_gpl "$4" arg_palette1=1 fi onfail rm endl if $arg_palette1 arg_palette1=[{$!-1}] fi - arg_palette2=0 l[] 0 nm. "$5" ext={x} rm if {same(['$ext'],'gpl',-1,0)} input_gpl "$5" arg_palette2=1 fi onfail rm endl if $arg_palette2 arg_palette2=[{$!-1}] fi - arg_grabber=0 l[] 0 nm. "$6" ext={x} rm i "$6" to_rgb arg_grabber=1 onfail rm endl if $arg_grabber arg_grabber=[{$!-1}] fi + arg_palette1=0 l[] + 0 nm. "$4" ext={x} rm + if same(['$ext'],'gpl',-1,0) + input_gpl "$4" arg_palette1=1 fi + onfail rm endl + if $arg_palette1 arg_palette1=[{$!-1}] fi + + arg_palette2=0 l[] + 0 nm. "$5" ext={x} rm + if same(['$ext'],'gpl',-1,0) + input_gpl "$5" arg_palette2=1 fi + onfail rm endl + if $arg_palette2 arg_palette2=[{$!-1}] fi + + arg_grabber=0 l[] + 0 nm. "$6" ext={x} rm + i "$6" to_rgb arg_grabber=1 + onfail rm endl + if $arg_grabber arg_grabber=[{$!-1}] fi repeat $N status=${x_colorize[$>]\ $1,$resolution,$2,$arg_palette1,$arg_palette2,$arg_grabber} done k[0-{$N-1}] - if {$2==1} repeat $! l[$<] # Output : colors only (1 layer). + if $2==1 repeat $! l[$<] # Output : colors only (1 layer). channels {s-3},{s-1} endl done - elif {$2>=2} repeat $! l[$<] # Output : Lineart + Colors (2 layers). + elif $2>=2 repeat $! l[$<] # Output : Lineart + Colors (2 layers). +channels {s-3},{s-1} channels.. 0,{0,s-4} endl done - if {$2>=3} split_colors[1] 0,256,8 fi # Split colors into layers. + if $2>=3 split_colors[1] 0,256,8 fi # Split colors into layers. fi nm $nm - if {!narg($status)} status=-1 fi + if !narg($status) status=-1 fi u \{$1\}\{$2\}\{$3\}\{"$4"\}\{"$5"\}\{"$6"\}\{0\}\{{w},{h}\}\{$status\} fx_colorize_interactive_preview : skip "${4=},${5=},${6=}" @@ -27166,12 +33527,14 @@ #@gui : Anisotropy = float(0.2,0,1) #@gui : Output Mode = choice("Merge Brightness / Colors","Split Brightness / Colors") #@gui : sep = separator() -#@gui : note = note{"Note: This filter needs two layers to work properly. The bottom layer must be a B&W image, while the -#@gui : top layer contains color patches that will be extrapolated in a smart way (edge-directed) to fill the entire image. At the end, +#@gui : note = note{"Note: This filter needs two layers to work properly. +#@gui : The bottom layer must be a B&W image, while the top layer contains color patches that will +#@gui : be extrapolated in a smart way (edge-directed) to fill the entire image. At the end, #@gui : you get a completely recolored image."} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/16/01.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/16/01.") fx_recolorize : - repeat {int($!/2)} + repeat int($!/2) if $3 s=$>,{$>+1} else s={2*$>},{2*$>+1} fi l[$s] rv[0,1] channels[0] 0 to_rgb.. # Convert to pure gray. @@ -27197,7 +33560,8 @@ #@gui : Gradient Preset = choice("User-Defined","Black to White","White to Black","Sepia","Solarize") #@gui : Interpolation Type = choice(1,"Nearest","Linear","Cubic","Lanczos") #@gui : Preserve Initial Brightness = bool(0) -#@gui : sep = separator(), note = note("User-defined gradient :") +#@gui : sep = separator() +#@gui : note = note("User-defined gradient :") #@gui : Number of Tones = int(5,2,8) #@gui : 1st Tone = color(0,0,0,255) #@gui : 2nd Tone = color(43,25,55,255) @@ -27207,28 +33571,33 @@ #@gui : 6th Tone = color(255,255,255,255) #@gui : 7th Tone = color(255,255,255,255) #@gui : 8th Tone = color(255,255,255,255) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_bwrecolorize : remove_opacity if $4 n 0,255 fi - if {$5==0} # User-defined gradient + if $5==0 # User-defined gradient (${9--2}) r. 4,$8,1,1,-1 permute. yzcx - elif {$5==1} # Black to white + elif $5==1 # Black to white (0,255^0,255^0,255^255,255) - elif {$5==2} # White to black + elif $5==2 # White to black (255,0^255,0^255,0^255,255) - elif {$5==3} # Sepia + elif $5==3 # Sepia (0,44,115,143,196,244^0,20,84,119,184,235^0,5,44,73,144,200^255,255,255,255,255,255) - else # Solarize + else # Solarize (0,359^1,1^1,1^255,255) r. 256,1,1,4,3 sh. 0,2 hsv2rgb. rm. fi - if {$6==0} r. 256,1,1,4,1 - elif {$6==1} r. 256,1,1,4,3 - elif {$6==2} r. 256,1,1,4,5 c. 0,255 + if $6==0 r. 256,1,1,4,1 + elif $6==1 r. 256,1,1,4,3 + elif $6==2 r. 256,1,1,4,5 c. 0,255 else r. 256,1,1,4,6 fi - if {$7==1} sh. 0,2 rgb2hsv. sh. 2 f. x/w hsv2rgb.. rm[-2,-1] fi + if $7==1 sh. 0,2 rgb2hsv. sh. 2 f. x/w hsv2rgb.. rm[-2,-1] fi l[^-1] luminance adjust_colors ${1-3} endl map[^-1] . rm. fx_bwrecolorize_preview : @@ -27240,7 +33609,8 @@ #@gui : Minimal Region Area = int(8,0,256) #@gui : Tolerance to Gaps = int(0,0,10) #@gui : Preview Type = choice("Lineart + Colors","Colors Only") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/12/11.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/12/11.") fx_autofill_lineart : repeat $! l[$>] nm=${-gui_layer_name} @@ -27253,7 +33623,7 @@ l. # Start multi-scale filling. - repeat {1+$4} + repeat 1+$4 fact={2^-$<} nw={0,max(1,round(w*$fact))} nh={0,max(1,round(h*$fact))} @@ -27268,7 +33638,7 @@ # Inpaint regions that are too small. +area. 0,1 label_maxarea={"P=[xM,yM];i(#-2,P)-1"} - if {$3>1} + if $3>1 >. {$3*sqrt($3)} *[-2,-1] b.. 0.8 watershed. .. else @@ -27287,7 +33657,7 @@ endl # Format output layers. - if {!$is_alpha} gui_set_layer_mode.. multiply fi + if !$is_alpha gui_set_layer_mode.. multiply fi gui_set_layer_name. $nm" [colors]" endl done @@ -27297,20 +33667,26 @@ if $5 k. else rv blend multiply fi endl done -#@gui Colorize Lineart [Smart Coloring] : fx_colorize_lineart_smartcoloring, fx_colorize_lineart_smartcoloring_preview(0) -#@gui : Colorize Mode = choice("Generate Random-Colors Layer","Extrapolate Color Spots on Transparent Top Layer","Auto-Clean Bottom Color Layer") -#@gui : sep = separator(), note = note{"Global geometry parameters:"} +#@gui Colorize Lineart [Smart Coloring] : fx_colorize_lineart_smart, fx_colorize_lineart_smart_preview(0) +#@gui : Colorize Mode = choice("Generate Random-Colors Layer","Extrapolate Color Spots on Transparent Top Layer", +#@gui : "Auto-Clean Bottom Color Layer") +#@gui : sep = separator() +#@gui : note = note{"Global geometry parameters:"} #@gui : Contour Detection (%) = float(95,0,100) #@gui : Discard Contour Guides = bool(0) -#@gui : note = note{"Add strokes with a saturated color having value 255 (e.g. pure red) on your lineart allows to guide the colorization algorithm with virtual contours."} +#@gui : note = note{"Add strokes with a saturated color having value 255 (e.g. pure red) on your lineart +#@gui : allows to guide the colorization algorithm with virtual contours."} #@gui : Output Region Delimiters = _bool(0) -#@gui : sep = separator(), note = note{"For Random colors mode only:"} +#@gui : sep = separator() +#@gui : note = note{"For Random colors mode only:"} #@gui : Make Hue Depends on Region Size = float(1,0,1) #@gui : Maximal Color Saturation = int(24,0,255) #@gui : Minimal Color Intensity = int(200,0,255) -#@gui : sep = separator(), note = note{"For color spots mode only:"} +#@gui : sep = separator() +#@gui : note = note{"For color spots mode only:"} #@gui : Color Shading (%) = int(0,0,100) -#@gui : sep = separator(), note = note{"Connection parameters:"} +#@gui : sep = separator() +#@gui : note = note{"Connection parameters:"} #@gui : End Point Rate (%) = float(75,0,100) #@gui : End Point Connectivity = int(2,1,5) #@gui : Spline Max Length (px) = float(60,0,256) @@ -27319,30 +33695,33 @@ #@gui : Spline Roundness = float(1,0,2) #@gui : Minimal Region Area = float(10,0,100) #@gui : Allow Self Intersections = bool(1) -#@gui : sep = separator(), Preview Type = choice(0,"Colored geometry","Colored regions","Colored lineart") -#@gui : sep = separator(), note = note("Authors: David Tschumperlé, Sébastien Fourey and David Revoy. Latest Update: 2018/11/09.") -fx_colorize_lineart_smartcoloring : - _fx_colorize_lineart_smartcoloring $*,-1 round - -fx_colorize_lineart_smartcoloring_preview : - if {$1==1" && "$!<2} gui_warning_preview "A top layer with color spots is missing, for this colorization mode." return - elif {$1==2" && "$!<2} gui_warning_preview "A bottom color layer is missing, for this colorization mode." return - fi - _fx_colorize_lineart_smartcoloring ${1-3},0,${5--1} - -_fx_colorize_lineart_smartcoloring : - if {$1==1" && "$!<2} error "A top layer with color strokes is missing, for this colorization mode." - elif {$1==2" && "$!<2} error "A bottom color layer is missing, for this colorization mode." +#@gui : sep = separator() +#@gui : Preview Type = choice(0,"Colored geometry","Colored regions","Colored lineart") +#@gui : sep = separator() +#@gui : note = note("Authors: David Tschumperlé, Sébastien Fourey and +#@gui : David Revoy.      Latest Update: 2018/11/09.") +fx_colorize_lineart_smart : + _fx_colorize_lineart_smart $*,-1 round + +fx_colorize_lineart_smart_preview : + if $1==1" && "$!<2 gui_warning_preview "A top layer with color spots is missing, for this colorization mode." return + elif $1==2" && "$!<2 gui_warning_preview "A bottom color layer is missing, for this colorization mode." return + fi + _fx_colorize_lineart_smart ${1-3},0,${5--1} + +_fx_colorize_lineart_smart : + if $1==1" && "$!<2 error "A top layer with color strokes is missing, for this colorization mode." + elif $1==2" && "$!<2 error "A bottom color layer is missing, for this colorization mode." fi min_color_area={$15^2} - repeat {$1?1:$!} inds=${arg\ 1+!!$1,$<,0--1} l[$inds] + repeat $1?1:$! inds=${arg\ 1+!!$1,$<,0--1} l[$inds] ind_lineart={$1==1?1:0} nm=${gui_layer_name[$ind_lineart]} nm[$ind_lineart] lineart - if {$!>1} ind_colors={$1==1?0:1} nmc={$ind_colors,n} nm[$ind_colors] colors fi - if {$!>=3} rm[2--1] fi # Delete old color and added contour layers if any + if $!>1 ind_colors={$1==1?0:1} nmc={$ind_colors,n} nm[$ind_colors] colors fi + if $!>=3 rm[2--1] fi # Delete old color and added contour layers if any # Constrain input lineart to be a binary, single channel image. [lineart] @@ -27357,16 +33736,16 @@ _keep_keycoords={$-1==0} [strokes] close_binary. ${9-14},$min_color_area,$16 nm. new_strokes - if {$-1==0} # Render estimated geometry + if $-1==0 # Render estimated geometry +negate[strokes] *. 255 to_rgb. +-[new_strokes] [strokes] dilate. 2 100%,100%,1,3,[0,128,255] j... .,0,0,0,0,1,.. rm[-2,-1] - if {narg($keycoords)} f[keycoords] "ellipse(#-1,(I)[0,2],3,3,0,1,[255,0,0]);I" rm[keycoords] fi + if narg($keycoords) f[keycoords] "ellipse(#-1,(I)[0,2],3,3,0,1,[255,0,0]);I" rm[keycoords] fi nm. geometry fi # Label color regions and inpaint strokes. - if {$1==1} # Mode: Color spots-guided colorization + if $1==1 # Mode: Color spots-guided colorization to_rgba[$colors] [colors],[colors] f[colors] "i(#-1) = A<255?0:norm(R,G+0.3,B+0.6);I" label_fg. 0 {1+iM},1,1,{colors,s+1} @@ -27375,7 +33754,7 @@ +l[new_strokes] * -1 + 1 +b 1% b.. 1 min endl watershed... .,0 rm. map.. . rm. - if {!$8} rm[strokes] # No color shading + if !$8 rm[strokes] # No color shading else # Shade colors j[strokes] [new_strokes] distance[strokes] 0 *[strokes] -1 eq[new_strokes] 0 label_fg[new_strokes] 0,0 @@ -27386,7 +33765,7 @@ rm[new_strokes] nm. new_colors - elif {$1==2} # Mode: Clean color layer + elif $1==2 # Mode: Clean color layer j[strokes] [new_strokes] distance[strokes] 0 *[strokes] -1 eq[new_strokes] 0 label_fg[new_strokes] 0,0 if $min_color_area +area_fg[new_strokes] 0,0 xy_bg={[xM,yM]} >. $min_color_area *[new_strokes,-1] fi @@ -27417,18 +33796,18 @@ ind_colors=$new_colors if $4 # Output region delimiters - 100%,100%,1,1,"const boundary = 1; J(#"$new_colors",1)!=I(#"$new_colors") || J(#"$new_colors",0,1)!=I(#"$new_colors")" + 100%,100%,1,1,"const boundary = 1; + J(#"$new_colors",1)!=I(#"$new_colors") || J(#"$new_colors",0,1)!=I(#"$new_colors")" *. 255 channels. -3,0 sh. 0,2 fc. 255,0,0 rm. gui_set_layer_name. $nm" [region delimiters]" mv. {$lineart+1} fi - if {!narg($nmc)} gui_set_layer_name[$ind_colors] $nm" [colors]" fi + if !narg($nmc) gui_set_layer_name[$ind_colors] $nm" [colors]" fi gui_set_layer_name[$ind_lineart] $nm - if {$-1==-1} # Rendering : Lineart and color layers - if {!$is_alpha} gui_set_layer_mode[$ind_lineart] multiply fi - - if $3 l[0] # Discard contour guides + if $-1==-1 # Rendering : Lineart and color layers + if !$is_alpha gui_set_layer_mode[$ind_lineart] multiply fi + if $3 l[{$1==1?1:0}] # Discard contour guides if $is_alpha 100%,100%,1,3,255 blend. [0],alpha,1 rgb2hsv. channels. 2 *. 255 negate. channels.. 0,{0,s-2} s={0,s} luminance[0] to_colormode[0] $s a c @@ -27437,15 +33816,15 @@ fi endl fi - elif {$-1==0} # Preview : Colored geometry - if {$is_alpha} channels[$ind_lineart] 100% negate[$ind_lineart] fi to_rgb[$ind_lineart] + elif $-1==0 # Preview : Colored geometry + if $is_alpha channels[$ind_lineart] 100% negate[$ind_lineart] fi to_rgb[$ind_lineart] n[$ind_lineart] 180,255 blend[$ind_lineart,$ind_colors] multiply +select_color[geometry] 0,255,255,255 ==. 0 j[$ind_lineart] [geometry],0,0,0,0,1,. k[$ind_lineart] - elif {$-1==1} # Preview : Colored regions + elif $-1==1 # Preview : Colored regions k[$ind_colors] else # Preview : Colored lineart - if {$is_alpha} channels[$ind_lineart] 100% negate[$ind_lineart] fi to_rgb[$ind_lineart] + if $is_alpha channels[$ind_lineart] 100% negate[$ind_lineart] fi to_rgb[$ind_lineart] if $3 l[$ind_lineart] s={s} to_rgb rgb2hsv channels 2 * 255 to_colormode $s endl fi blend[$ind_lineart,$ind_colors] multiply k[$ind_lineart] fi @@ -27454,63 +33833,75 @@ #@gui Colorize Lineart [Propagation] : fx_colorize_lineart, fx_colorize_lineart_preview(1) #@gui : note = note("Layers ordering:") -#@gui : Input Layers = choice{0,"Color Spots + Lineart","Lineart + Color Spots","Color Spots + Extrapolated Colors + Lineart","Lineart + Color Spots + Extrapolated Colors"} -#@gui : Output Layers = _choice{1,"Single (Merged)","Extrapolated Colors + Lineart","Lineart + Extrapolated Colors","Color Spots + Extrapolated Colors + Lineart","Lineart + Color Spots + Extrapolated Colors"} -#@gui : Extrapolate Colors As = choice("One Layer","Two Layers","Three Layers","Four Layers","Five Layers","Six Layers","Seven Layers","Eight Layers","Nine Layers","Ten Layers","One Layer per Single Color","One Layer per Single Region") +#@gui : Input Layers = choice{0,"Color Spots + Lineart","Lineart + Color Spots", +#@gui : "Color Spots + Extrapolated Colors + Lineart","Lineart + Color Spots + Extrapolated Colors"} +#@gui : Output Layers = _choice{1,"Single (Merged)","Extrapolated Colors + Lineart", +#@gui : "Lineart + Extrapolated Colors","Color Spots + Extrapolated Colors + Lineart", +#@gui : "Lineart + Color Spots + Extrapolated Colors"} +#@gui : Extrapolate Colors As = choice("One Layer","Two Layers","Three Layers","Four Layers","Five Layers", +#@gui : "Six Layers","Seven Layers","Eight Layers","Nine Layers","Ten Layers","One Layer per Single Color", +#@gui : "One Layer per Single Region") #@gui : sep = separator() #@gui : Smoothness = float(0.05,0,1) -#@gui : sep = separator(), note = note{"Note: You probably need to select All for the Input layers option on the left.\n +#@gui : sep = separator() +#@gui : note = note{"Note: You probably need to select All for the Input layers option +#@gui : on the left.\n #@gui : Color Spots = your layer with color indications.\n -#@gui : Lineart = your layer with line-art (b&w or transparent).\n +#@gui : Lineart = your layer with line-art (B&W or transparent).\n #@gui : Extrapolated Colors = the G'MIC generated layer with flat colors.\n\n #@gui : Warnings: #@gui : \n - Do not rely too much on the preview, it is probably not accurate ! -#@gui : \n - Activate option Extrapolate color as one layer per single color/region only if you have a lot of available memory ! +#@gui : \n - Activate option Extrapolate color as one layer per single color/region only if you have +#@gui : a lot of available memory ! #@gui : "} -#@gui : sep = separator(), url = link("Click here for a detailed description of this filter.","http://www.gimpchat.com/viewtopic.php?f=28&t=7567") -#@gui : sep = separator(), note = note("Authors: David Tschumperlé, Timothée Giet and David Revoy. Latest Update: 2013/19/06.") +#@gui : sep = separator() +#@gui : url = link("Click here for a detailed description of this filter.",\ +# "http://www.gimpchat.com/viewtopic.php?f=28&t=7567") +#@gui : sep = separator() +#@gui : note = note("Authors: David Tschumperlé, Timothée Giet and David Revoy. +#@gui :       Latest Update: 2013/19/06.") fx_colorize_lineart : - if {$!<2} return fi - if {$1<2} selection=0,1 else selection=0,1,2 fi + if $!<2 return fi + if $1<2 selection=0,1 else selection=0,1,2 fi l[$selection] # Format input layers. - if {$1==0} # Color strokes + drawing - elif {$1==1} rv # Drawing + color strokes - elif {$1==2} rm[1] # Color strokes + extrapolated colors + drawing - elif {$1==3} rm[2] rv # Drawing + color strokes + extrapolated colors. + if $1==0 # Color strokes + drawing + elif $1==1 rv # Drawing + color strokes + elif $1==2 rm[1] # Color strokes + extrapolated colors + drawing + elif $1==3 rm[2] rv # Drawing + color strokes + extrapolated colors. fi # Here we have only 'color strokes + drawing' -> process. +to_rgba[0] split_opacity. +.. 1 !=. 0 *[-2,-1] # Map of color labels to spread. +norm[1] n. 0,1 +histogram. 2,0,1 - if {i(0)>i(1)} *.. -1 +.. 1 fi rm. # Determine color model of the drawing. + if i(0)>i(1) *.. -1 +.. 1 fi rm. # Determine color model of the drawing. b. $4% watershed.. . rm. # Priority map. -. 1 # Here we have 'color strokes + drawing + extrapolated colors'. # Format output layers. - if {$2==0} rm[0] rv blend[0,1] multiply ind=-1 - elif {$2==1} rm[0] rv ind=0 - elif {$2==2} rm[0] ind=1 - elif {$2==3} rv[1,2] ind=1 - elif {$2==4} rv[0,1] ind=2 + if $2==0 rm[0] rv blend[0,1] multiply ind=-1 + elif $2==1 rm[0] rv ind=0 + elif $2==2 rm[0] ind=1 + elif $2==3 rv[1,2] ind=1 + elif $2==4 rv[0,1] ind=2 fi # Separate extrapolated colors as multiple layers. - if {$3&&$ind>=0} l[$ind] + if $3" && "$ind>=0 l[$ind] +mix_channels (65536,256,1) - if {$3==10} do # Split by colors. + if $3==10 do # Split by colors. iM={1,iM} - if {$iM>=0} + if $iM>=0 +==[1] $iM area={is} replace[1] $iM,-1 +r. 100%,100%,1,3 *. [0] rv[-2,-1] *. 255 a[-2,-1] c nm. $area fi - while {$iM>=0} else # Split by disconnected regions. + while $iM>=0 else # Split by disconnected regions. label. - if {$3<10} %. {$3+1} fi - repeat {iM+1} +==[1] $< area={is} +r. 100%,100%,1,[0] *. [0] rv[-2,-1] *. 255 a[-2,-1] c nm. $area done + if $3<10 %. {$3+1} fi + repeat iM+1 +==[1] $< area={is} +r. 100%,100%,1,[0] *. [0] rv[-2,-1] *. 255 a[-2,-1] c nm. $area done fi rm[0,1] sort_list +,n @@ -27528,20 +33919,25 @@ #@gui : Hue = float(0,0,360) #@gui : Saturation (%) = float(0,0,100) #@gui : Smoothness = float(0,0,10) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_ditheredbw : repeat $! l[$>] split_opacity l[0] luminance adjust_colors ${1-3} b $6 ditheredbw - if {$4" || "$5} / 255 i[0] 100%,100%,1,2 fc[0] $4,{$5%} a c hsv2rgb fi + if $4" || "$5 / 255 i[0] 100%,100%,1,2 fc[0] $4,{$5%} a c hsv2rgb fi endl a c endl done fx_ditheredbw_preview : gui_split_preview "fx_ditheredbw $*",${-3--1} #@gui Engrave : fx_engrave, fx_engrave_preview(0) -#@gui : note = note("Black & White foreground:") +#@gui : note = note("Black & White foreground:") #@gui : Radius = float(0.5,0,2) #@gui : Density = float(50,0,200) #@gui : Edges = float(0,0,10) @@ -27549,7 +33945,8 @@ #@gui : Threshold (%) = float(40,0,100) #@gui : Minimal Area = int(0,-256,256) #@gui : Flat Regions Removal = float(0,0,10) -#@gui : sep = separator(), note = note("Color background:") +#@gui : sep = separator() +#@gui : note = note("Color background:") #@gui : Add Color Background = bool() #@gui : Quantization = float(10,0,40) #@gui : Shading = int(1,0,5) @@ -27558,8 +33955,14 @@ #@gui : Lightness (%) = float(0,-100,100) #@gui : sep = separator() #@gui : Anti-Aliasing = choice(1,"Disabled","x1.5","x2","x3") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Authors: Lyle Kroll and David Tschumperlé. Latest Update: 03/13/2015.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Authors: Lyle Kroll and David Tschumperlé. +#@gui :       Latest Update: 03/13/2015.") fx_engrave : f={arg(1+$14,1,1.5,2,3)} r={$f*(0.2+$1)} @@ -27570,25 +33973,25 @@ wh={w},{h} norm if $14 r {100*$f}%,{100*$f}%,1,1,3 fi - if {$7>0} [0] fi # Keep copy for flat regions removal. + if $7>0 [0] fi # Keep copy for flat regions removal. l[0] amount={(0.5+$2)^2} repeat 5 b $r unsharp $r,{1+$2} c 0,255 done smooth 100,0.1,1,{$f*$3},{$f*$4} >= {100-$5}% endl - if {$7>0} # Flat region removal. + if $7>0 # Flat region removal. gradient_norm[1] b[1] $3 <[1] $7 max[0,1] fi - if {$6<0} area_fg 0,0 > {$f*$6*$6} - elif {$6>0} == 0 area_fg 0,0 > {$f*$6*$6} == 0 + if $6<0 area_fg 0,0 > {$f*$6*$6} + elif $6>0 == 0 area_fg 0,0 > {$f*$6*$6} == 0 fi * 255 if $14 r $wh,1,1,2 fi endl a c endl # Process color background. - if {$!>1} + if $!>1 l[1] split_opacity l[0] f={arg(1+$14,1,1.5,2,3)} if $14 r {100*$f}%,{100*$f}%,1,100%,3 fi @@ -27608,14 +34011,19 @@ gui_split_preview "nm foo fx_engrave $* gui_merge_layers",${-3--1} endl done -#@gui Freaky B&W : fx_freaky_bw, fx_freaky_bw_preview +#@gui Freaky B&W : fx_freaky_bw, fx_freaky_bw_preview #@gui : Strength (%) = float(90,0,100) #@gui : Oddness (%) = float(20,0,100) #@gui : Brightness (%) = float(0,-100,100) #@gui : Contrast (%) = float(0,-100,100) #@gui : Gamma (%) = float(0,-100,100) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/30/09.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/30/09.") fx_freaky_bw : repeat $! l[$>] split_opacity l[0] to_rgb @@ -27673,24 +34081,26 @@ #@gui : Smoother Edge Protection = float(0.54,0,1) #@gui : Smoother Softness = float(2.25,0,10) #@gui : sep = separator() -#@gui : Stretch Contrast = choice("None","Automatic","Automatic & Contrast Mask","Manual Controls") +#@gui : Stretch Contrast = choice("None","Automatic","Automatic & Contrast Mask","Manual Controls") #@gui : note = note ("To activate the sliders below chose 'Manual Controls'") #@gui : sep = separator() #@gui : LN Amplitude = float(2,0,60) #@gui : LN Size = float(6,0,64) #@gui : LN Neightborhood-Smoothness = float(5,0,40) #@gui : LN Average-Smoothness = float(20,0,40) -#@gui : sep = separator(), note = note("Author: PhotoComiX. Latest Update: 2011/05/04.") +#@gui : sep = separator() +#@gui : note = note("Author: PhotoComiX. +#@gui :       Latest Update: 2011/05/04.") #@gui : url = link(0,"Forum thread about the filter discussion","http://gimpchat.com/viewtopic.php?f=10&t=914") fx_ink_wash : repeat $! l[$>] split_opacity l[0] fx_pencilbw. $1,$2,0,0,0 - if {$3==1} continue - elif {$3==0} fx_smooth_anisotropic. 60,$4,$5,$6,1.1,0.8,30,2,0,1,1,0,1,16 + if $3==1 continue + elif $3==0 fx_smooth_anisotropic. 60,$4,$5,$6,1.1,0.8,30,2,0,1,1,0,1,16 fi - if {$7==1} normalize_local. 2,6,5,24,1,0,255 - elif {$7==2} normalize_local. 2,6,5,24,1,0,255 fx_contrast_swm 2,0,0.512 - elif {$7==3} fx_normalize_local. $8,$9,$10,$11,1,3,0 + if $7==1 normalize_local. 2,6,5,24,1,0,255 + elif $7==2 normalize_local. 2,6,5,24,1,0,255 fx_contrast_swm 2,0,0.512 + elif $7==3 fx_normalize_local. $8,$9,$10,$11,1,3,0 fi endl a c endl done @@ -27699,11 +34109,16 @@ #@gui : Amplitude = float(60,0,200) #@gui : Hue = float(0,0,360) #@gui : Saturation = float(0,0,1) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/05/03.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/05/03.") fx_pencilbw : pencilbw $1,$2 - if {$3||$4} repeat $! l[$>] split_opacity + if $3" || "$4 repeat $! l[$>] split_opacity /[0] 255 i[0] 100%,100%,1,1,$4 i[0] 100%,100%,1,1,$3 a[0-2] c hsv2rgb[0] a c endl done fi @@ -27716,8 +34131,14 @@ #@gui : Contour Threshold = float(1,0,10) #@gui : Opacity = float(0.5,0,1) #@gui : Color = color(144,79,21) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Authors: Jamac4k and David Tschumperlé. Latest Update: 2015/29/06.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Authors: Jamac4k and David Tschumperlé. +#@gui :       Latest Update: 2015/29/06.") fx_pencil_portraitbw : repeat $! l[$>] split_opacity l[0] +b 2% @@ -27743,8 +34164,14 @@ #@gui : Grain = float(0,0,100) #@gui : Negative = bool() #@gui : Anti-Aliasing = bool(1) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Authors: Antaron, Mahvin and David Tschumperlé. Latest Update: 2015/16/03.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Authors: Antaron, Mahvin and David Tschumperlé. +#@gui :      Latest Update: 2015/16/03.") fx_stamp : repeat $! l[$>] split_opacity l[0] wh={w},{h} @@ -27769,8 +34196,13 @@ #@gui : Smoothness = float(1,0,10) #@gui : Levels = int(10,2,100) #@gui : Contrast = float(0.2,0.01,1) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/19/10.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/19/10.") fx_color_abstraction : repeat $! l[$>] split_opacity l[0] to_rgb b $1 s c quantize $2,1,0 area 0 ^ $3 n 0,255 @@ -27779,14 +34211,72 @@ fx_color_abstraction_preview : gui_split_preview "fx_color_abstraction $*",${-3--1} +#@gui Apply External CLUT : fx_apply_haldclut, fx_apply_haldclut_preview(1)+ +#@gui : Specify HaldCLUT As = choice(2,"Top Layer","Bottom Layer","Filename") +#@gui : HaldCLUT Filename = filein() +#@gui : note = note("Note: Do not forget to set the Input layers option if you select +#@gui : Top layer or Bottom layer.") +#@gui : sep = separator() +#@gui : Strength (%) = float(100,0,100) +#@gui : Brightness (%) = float(0,-100,100) +#@gui : Contrast (%) = float(0,-100,100) +#@gui : Gamma (%) = float(0,-100,100) +#@gui : Hue (%) = float(0,-100,100) +#@gui : Saturation (%) = float(0,-100,100) +#@gui : Normalize Colors = choice("None","Pre-Normalize","Post-Normalize","Both") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/02/08.") +fx_apply_haldclut : skip "${2=}" + mode=$1 + filename="$2" + strength,brightness,contrast,gamma,hue,saturation,normalize=${3-9} + + if $mode<2 # CLUT as a layer + if $!<2 gui_warning_preview "Input layer with HaldCLUT is missing" return fi + ind_clut={$mode?$!-1:0} + else # CLUT as a file + l + 0 nm. "$2" ext={x} rm. + if lowercase(['$ext'])=='cube' input_cube "$2" + else i "$2" + fi + ind_clut={$!-1} + onfail gui_warning_preview "Specified HaldCLUT filename not found" return + endl + fi + if {$ind_clut,iM>255} /[$ind_clut] 255 fi # Possibly a 16bits HaldCLUT. + + if $normalize==1" || "$normalize==3 # Pre-normalization + repeat $! if $>!=$ind_clut l[$>] split_opacity balance_gamma[0] , a c endl fi done + fi + repeat $! if $>!=$ind_clut +map_clut[$>] [$ind_clut] j[$>] .,0,0,0,0,{$strength%} rm. fi done rm[$ind_clut] + adjust_colors $brightness,$contrast,$gamma,$hue,$saturation,0,255 + if $normalize==2" || "$normalize==3 # Post-normalization + repeat $! l[$>] split_opacity n[0] 0,255 a c endl done + fi + +fx_apply_haldclut_preview : skip "${2=}" + if $1<2 gui_warning_preview "No preview available in this mode" return fi + gui_split_preview "fx_apply_haldclut $1,\"$2\",${3--2}",${-3--1} + #@gui Basic Adjustments : fx_adjust_colors, fx_adjust_colors_preview #@gui : Brightness (%) = float(0,-100,100) #@gui : Contrast (%) = float(0,-100,100) #@gui : Gamma (%) = float(0,-100,100) #@gui : Hue (%) = float(0,-100,100) #@gui : Saturation (%) = float(0,-100,100) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/16/06.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/16/06.") fx_adjust_colors : adjust_colors ${1-5},0,255 @@ -27796,20 +34286,25 @@ #@gui Boost Chromaticity : fx_boost_chroma, fx_boost_chroma_preview(1) #@gui : Amplitude (%) = float(50,0,100) #@gui : Color Space = choice{"YCbCr (Distinct)","YCbCr (Mixed)","Lab (Distinct)","Lab (Mixed)"} -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/19/07.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/19/07.") fx_boost_chroma : repeat $! l[$>] split_opacity l[0] +to_rgb - if {$2>=2} + if $2>=2 srgb2rgb rgb2lab. - if {$2==2} sh. 1 sh.. 2 equalize[-2,-1] rm[-2,-1] + if $2==2 sh. 1 sh.. 2 equalize[-2,-1] rm[-2,-1] else sh. 1,2 equalize. rm. fi lab2rgb. rgb2srgb else rgb2ycbcr. - if {$2==0} sh. 1 sh.. 2 equalize[-2,-1] rm[-2,-1] + if $2==0 sh. 1 sh.. 2 equalize[-2,-1] rm[-2,-1] else sh. 1,2 equalize. rm. fi ycbcr2rgb. @@ -27823,8 +34318,13 @@ #@gui Boost-Fade : fx_boost_fade, fx_boost_fade_preview #@gui : Amplitude = float(5,0,10) #@gui : Chromaticity From = choice("YCbCr","Lab") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2018/11/26.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2018/11/26.") fx_boost_fade : repeat $! l[$>] 100%,100%,1,3 rand. 0,1 b. {10-10*($1/10)^0.5} n. 0,255 @@ -27840,7 +34340,7 @@ #@gui : Contrast (%) = float(0,-100,100) #@gui : Gamma (%) = float(0,-100,100) #@gui : Smoothness = float(0,0,10) -#@gui : Value Action = choice("None","Cut","Cut & Normalize","Normalize","Threshold") +#@gui : Value Action = choice("None","Cut","Cut & Normalize","Normalize","Threshold") #@gui : Low Value = float(0,0,100) #@gui : High Value = float(100,0,100) #@gui : Quantization = int(256,1,256) @@ -27850,17 +34350,28 @@ #@gui : Tones Range = choice("All tones","Shadows","Mid-Tones","Highlights") #@gui : Tones Smoothness = float(2,0,10) #@gui : sep = separator() -#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") _fx_channel_processing : adjust_colors ${1-3} b. $4% - if {$5==1} c. $6%,$7% - elif {$5==2} c. $6%,$7% n. 0,255 - elif {$5==3} n. $6%,$7% - elif {$5==4} ir. $6%,$7% *. 255 + if $5==1 c. $6%,$7% + elif $5==2 c. $6%,$7% n. 0,255 + elif $5==3 n. $6%,$7% + elif $5==4 ir. $6%,$7% *. 255 fi - if {$8!=256} quantize. $8,1,0 fi + if $8!=256 quantize. $8,1,0 fi if $9 equalize. fi if $10 negate. fi @@ -27869,22 +34380,23 @@ fx_start_mix $11,$12 ac. "_fx_channel_processing $1,$2,$3,$4,$5,$6,$7,$8,$9,$10",$13,1 fx_end_mix $11 - if {$!!=3} rv a c fi endl mv. 0 done + if $!!=3 rv a c fi endl mv. 0 done fx_channel_processing_preview : gui_split_preview "fx_channel_processing $*",${-3--1} #@gui Channels to Layers : fx_channels2layers, fx_channels2layers_preview #@gui : Colorspace = choice("RGB","CMY","HSV") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/15/07.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/15/07.") fx_channels2layers : repeat $! l[$<] nm=${-gui_layer_name} to_rgb - if {$1==0} # RGB + if $1==0 # RGB s[0] c r[0] 100%,100%,1,3,0,0,0,0,0,0 nm[0] name($nm" "[red]),mode(add) r[1] 100%,100%,1,3,0,0,0,0,0,0.5 nm[1] name($nm" "[green]),mode(add) r[2] 100%,100%,1,3,0,0,0,0,0,1 nm[2] name($nm" "[blue]),mode(add) - elif {$1==1} # CMY + elif $1==1 # CMY rgb2cmy[0] -[0] 255 s[0] c r[0] 100%,100%,1,3,0,0,0,0,0,0 nm[0] name($nm" "[cyan]),mode(difference) r[1] 100%,100%,1,3,0,0,0,0,0,0.5 nm[1] name($nm" "[magenta]),mode(difference) @@ -27909,11 +34421,16 @@ #@gui Color Balance : fx_balance_gamma, fx_balance_gamma_preview #@gui : Neutral Color = color(128,128,128) #@gui : Stretch Colors = bool(1) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/01/07.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/01/07.") fx_balance_gamma : repeat $! l[$>] split_opacity - if {$!>1} +!=. 0 *[0,-1] fi + if $!>1 +!=. 0 *[0,-1] fi l[0] balance_gamma ${1-3} if $4 n 0,255 fi @@ -27925,82 +34442,821 @@ gui_split_preview "fx_balance_gamma $*",${-3--1} #@gui Color Blindness : colorblind, fx_colorblind_preview -#@gui : Blindness Type = choice("Protanopia","Protanomaly","Deuteranopia","Deuteranomaly","Tritanopia","Tritanomaly","Achromatopsia","Achromatomaly") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note{"Note: +#@gui : Blindness Type = choice("Protanopia","Protanomaly","Deuteranopia","Deuteranomaly","Tritanopia", +#@gui : "Tritanomaly","Achromatopsia","Achromatomaly") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note{"Note: #@gui : This filter simulates different types of colorblindness vision. #@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/20/04.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/20/04.") fx_colorblind_preview : gui_split_preview "colorblind $*",${-3--1} +#@gui Color Presets : fx_color_presets, fx_color_presets_preview(1)+ +#@gui : LUTs Pack = choice{14,"Abigail Gonzalez (21)","Alex Jordan (81)","Cinematic (8)","Cinematic Travel (29)", +#@gui : "Creative Pack (33)","Eric Ellerbrock (14)","FilterGrade Cinematic (8)","J.T. Semple (14)", +#@gui : "Kyler Holland (10)","Lutify.Me (7)","Moviz (48)","Ohad Peretz (7)","ON1 Photography (90)","PictureFX (19)", +#@gui : "PIXLS.US (31)","Purple11 (12)","RocketStock (35)","Shamoon Abbasi (25)","SmallHD Movie Look (7)","Others (69)"} + +##### Abigail Gonzales +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Blade Runner","Blue House","Blue Ice","Caribe","Cinema","Cinema 2","Cinema 3","Cinema 4","Cinema 5", +#@gui : "Cinema Noir","Cinematic for Flog","Day4Nite","Eterna for Flog","Filmic","Fuji HDR", +#@gui : "Golden Gate","Matrix","Monochrome 1","Monochrome 2","Old West","Science Fiction"}_0 + +##### Alex Jordan +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Action Magenta 01","Action Red 01","Adventure 1453","Aggressive Highlights Recovery 5", +#@gui : "Bleech Bypass Green","Bleech Bypass Yellow 01","Blue Dark","Blue Shadows 01","Bright Green 01", +#@gui : "Brownish","Colorful 0209","Conflict 01","Contrast with Highlights Protection","Contrasty Afternoon", +#@gui : "Contrasty Green","Cross Process CP 130","Cross Process CP 14","Cross Process CP 15", +#@gui : "Cross Process CP 16","Cross Process CP 18","Cross Process CP 3","Cross Process CP 4", +#@gui : "Cross Process CP 6","Dark Green 02","Dark Green 1","Dark Place 01","Dream 1","Dream 85", +#@gui : "Faded Retro 01","Faded Retro 02","Film 0987","Film 9879","Film Highlight Contrast","Flat 30", +#@gui : "Green 2025","Green Action","Green Afternoon","Green Conflict","Green Day 01","Green Day 02", +#@gui : "Green G09","Green Indoor","Green Light","Harsh Day","Harsh Sunset","Highlights Protection", +#@gui : "Indoor Blue","Low Contrast Blue","Low Key 01","Magenta Day","Magenta Day 01","Magenta Dream", +#@gui : "Memories","Moonlight 01","Mostly Blue","Muted 01","Night 01","Only Red","Only Red and Blue", +#@gui : "Operation Yellow","Orange Dark 4","Orange Dark 7","Orange Dark Look","Orange Underexposed", +#@gui : "Protect Highlights 01","Red Afternoon 01","Red Day 01","Red Dream 01","Retro Brown 01", +#@gui : "Retro Magenta 01","Retro Yellow 01","Saturated Blue","Smart Contrast","Subtle Blue", +#@gui : "Subtle Green","Yellow 55B","Yellow Film 01"}_0 + +##### Cinematic +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Deep","Dimension","Enchanted","Flavin","Frosted","Shine","Ultra Water",Wipe"}_0 + +##### Cinematic Travel +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Blue Cold Fade","Bright Teal Orange","Bright Warm","Clear Teal Fade","Cold Clear Blue","Cold Clear Blue 1", +#@gui : "Deep Blue","Deep Dark Warm","Deep High Contrast","Deep Teal Fade","Deep Warm Fade","Faded Green", +#@gui : "Greenish Contrasty","Greenish Fade","Greenish Fade 1","Hard Teal Orange","Neutral Teal Orange", +#@gui : "Neutral Warm Fade","Smooth Clear","Smooth Green Orange","Smooth Teal Orange","Teal Fade","Very Warm Greenish", +#@gui : "Warm Dark Contrasty","Warm Fade","Warm Fade 1","Warm Neutral","Warm Sunset Red","Warm Teal"}_0 + +##### Creative Pack +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Anime","Bleach Bypass 1","Bleach Bypass 2","Bleach Bypass 3","Bleach Bypass 4","Candle Light", +#@gui : "Color Negative","Crisp Warm","Crip Winter","Drop Blues","Edgy Ember","Fall Colors","Foggy Night", +#@gui : "Futuristic Bleak 1","Futuristic Bleak 2","Futuristic Bleak 3","Futuristic Bleak 4","Horror Blue", +#@gui : "Late Sunset","Moonlight","Night From Day","Red Blue Yellow","Smokey","Soft Warming","Teal Magenta Gold", +#@gui : "Teal Orange","Teal Orange 1","Teal Orange 2","Teal Orange 3","Tension Green 1","Tension Green 2", +#@gui : "Tension Green 3","Tension Green 4"}_0 + +##### Eric Ellerbrock +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Avalanche","Black Star","Helios","Hydracore","Hypnosis","Killstreak","Nemesis","Night Blade 4", +#@gui : "Paladin","Seringe 4","Serpent","Terra 4","Victory","Yellowstone"}_0 + +##### FilterGrade Cinematic +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Cine Basic", "Cine Bright", "Cine Cold", "Cine Drama", "Cine Teal Orange 1", "Cine Teal Orange 2", +#@gui : "Cine Vibrant", "Cine Warm"}_0 + +##### J.T. Semple +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Bright Green","Crisp Romance","Crushin","Frosted Beach Picnic","Just Peachy","Late Afternoon Wanderlust", +#@gui : "Lush Green Summer","Magenta Coffee","Minimalist Caffeination","Mystic Purple Sunset","Nostalgia Honey", +#@gui : "Spring Morning","Toasted Garden","Winter Lighthouse"}_0 + +##### Kyler Holland +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "KH 1","KH 2","KH 3","KH 4","KH 5","KH 6","KH 7","KH 8","KH 9","KH 10"}_0 + +##### Lutify.Me +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Hackmanite","Herderite","Heulandite","Hiddenite","Hilutite","Howlite","Hypersthene"}_0 + +##### Moviz +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Moviz 1","Moviz 2","Moviz 3","Moviz 4","Moviz 5","Moviz 6","Moviz 7","Moviz 8","Moviz 9","Moviz 10", +#@gui : "Moviz 11","Moviz 12","Moviz 13","Moviz 14","Moviz 15","Moviz 16","Moviz 17","Moviz 18","Moviz 19","Moviz 20", +#@gui : "Moviz 21","Moviz 22","Moviz 23","Moviz 24","Moviz 25","Moviz 26","Moviz 27","Moviz 28","Moviz 29","Moviz 30", +#@gui : "Moviz 31","Moviz 32","Moviz 33","Moviz 34","Moviz 35","Moviz 36","Moviz 37","Moviz 38","Moviz 39","Moviz 40", +#@gui : "Moviz 41","Moviz 42","Moviz 43","Moviz 44","Moviz 45","Moviz 46","Moviz 47","Moviz 48"}_0 + +##### Ohad Peretz +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Cold Simplicity 2","D and O 1","Retro Summer 3","Subtle Yellow","Teal Moonlight","True Colors 8", +#@gui : "Vintage Warmth 1"}_0 + +##### ON1 Photography +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "2-Strip Process","Aqua","Aqua and Orange Dark","Berlin Sky","Blues", +#@gui : "Black & White-1","Black & White-2","Black & White-3","Black & White-4","Black & White-5", +#@gui : "Black & White-6","Black & White-7","Black & White-8","Black & White-9","Black & White-10","Chrome 01", +#@gui : "Cinematic-1","Cinematic-2","Cinematic-3","Cinematic-4","Cinematic-5","Cinematic-6","Cinematic-7", +#@gui : "Cinematic-8","Cinematic-9","Cinematic-10","Classic Teal and Orange","Earth Tone Boost","Fade to Green", +#@gui : "Film Print 01","Film Print 02","French Comedy","Green Blues","Green Yellow","Landscape-1","Landscape-2", +#@gui : "Landscape-3","Landscape-4","Landscape-5","Landscape-6","Landscape-7","Landscape-8","Landscape-9", +#@gui : "Landscape-10","Lifestyle & Commercial-1","Lifestyle & Commercial-2","Lifestyle & Commercial-3", +#@gui : "Lifestyle & Commercial-4","Lifestyle & Commercial-5","Lifestyle & Commercial-6","Lifestyle & Commercial-7", +#@gui : "Lifestyle & Commercial-8","Lifestyle & Commercial-9","Lifestyle & Commercial-10","Moody-1","Moody-2", +#@gui : "Moody-3","Moody-4","Moody-5","Moody-6","Moody-7","Moody-8","Moody-9","Moody-10","Nature & Wildlife-1", +#@gui : "Nature & Wildlife-2","Nature & Wildlife-3","Nature & Wildlife-4","Nature & Wildlife-5","Nature & Wildlife-6", +#@gui : "Nature & Wildlife-7","Nature & Wildlife-8","Nature & Wildlife-9","Nature & Wildlife-10","Oranges","Portrait-1", +#@gui : "Portrait-2","Portrait-3","Portrait-4","Portrait-5","Portrait-6","Portrait-7","Portrait-8","Portrait-9", +#@gui : "Portrait10","Purple","Reds","Reds Oranges Yellows","Studio Skin Tone Shaper","Vintage Chrome"}_0 + +##### Picture FX +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "AnalogFX - Anno 1870 Color","AnalogFX - Old Style I","AnalogFX - Old Style II","AnalogFX - Old Style III", +#@gui : "AnalogFX - Sepia Color","AnalogFX - Soft Sepia I","AnalogFX - Soft Sepia II", +#@gui : "GoldFX - Bright Spring Breeze","GoldFX - Bright Summer Heat","GoldFX - Hot Summer Heat", +#@gui : "GoldFX - Perfect Sunset 01min","GoldFX - Perfect Sunset 05min","GoldFX - Perfect Sunset 10min", +#@gui : "GoldFX - Spring Breeze","GoldFX - Summer Heat", +#@gui : "TechnicalFX - Backlight Filter","ZilverFX - B&W Solarization","ZilverFX - InfraRed", +#@gui : "ZilverFX - Vintage B&W"}_0 + +##### PIXLS.US +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Amstragram","Amstragram+","Autumn","Cinematic Lady Bird","Cinematic Mexico","Dark Blues in Sunlight", +#@gui : "Delicatessen","Expired 69","Faded Look","Faded Print","Hypressen","Magenta Yellow","Metropolis", +#@gui : "Modern Film","Newspaper","Night Spy","Progressen","Prussian Blue","Seventies Magazine","Street", +#@gui : "Sweet Bubblegum","Sweet Gelatto","Taiga","Tarraco","Unknown","Uzbek Bukhara","Uzbek Marriage", +#@gui : "Uzbek Samarcande","Velvetia","Warm Vintage","Whiter Whites"}_2 + +##### Purple11 +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Going for a Walk","Good Morning","Nah","Once Upon a Time","Passing By","Serenity", +#@gui : "Smooth Sailing","Undeniable","Undeniable 2","Urban Cowboy","We'll See","You Can Do It"}_0 + +##### RocketStock +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Arabica 12", "Ava 614","Azrael 93","Bourbon 64","Byers 11","Chemical 168","Clayton 33","Clouseau 54", +#@gui : "Cobi 3","Contrail 35","Cubicle 99","Django 25","Domingo 145","Faded 47","Folger 50","Fusion 88", +#@gui : "Hyla 68","Korben 214","Lenox 340","Lucky 64","McKinnon 75","Milo 5","Neon 770","Paladin 1875","Pasadena 21", +#@gui : "Pitaya 15","Reeve 38","Remy 24","Sprocket 231","Teigen 28","Trent 18","Tweed 71","Vireo 37","Zed 32", +#@gui : "Zeke 39"}_0 + +##### Shamoon Abbasi +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "City 7","Coffee 44","Date 39","Day for Night","Denoise Simple 40","Desert Gold 37","Directions 23", +#@gui : "Drop Green Tint 14","Elegance 38","Golden Night Softner 43","Golden Sony 37","Green 15","Happyness 133", +#@gui : "HLG 1","Industrial 33","Morning 6","Morroco 16","Night King 141","Rest 33","Shadow King 39","Spy 29", +#@gui : "Thriller 2","Turkiest 42","Vintage 163","Wooden Gold 20"}_0 + +##### SmallHD Movie Look +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Apocalypse This Very Moment","B-Boyz 2","Bob Ford","Life Giving Tree","Moonrise","Saving Private Damon", +#@gui : "The Matrices"}_0 + +##### Others +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "60's","60's (faded)","60's (faded alt)","Alien green","Black & White","Bleach bypass","Blue mono", +#@gui : "Cinematic-01","Cinematic-02","Cinematic-03", +#@gui : "Color (rich)","Faded","Faded (alt)","Faded (analog)","Faded (extreme)","Faded (vivid)","Expired (fade)", +#@gui : "Expired (polaroid)","Extreme","Fade","Faux infrared","Golden","Golden (bright)","Golden (fade)", +#@gui : "Golden (mono)","Golden (vibrant)","Green mono","Hong Kong","Instant-C","K-Tone Vintage Kodachrome", +#@gui : "Light (blown)","Lomo","Mono tinted","Muted fade", +#@gui : "Mute shift","Natural (vivid)","Nostalgic","Orange tone","Pink fade","Purple","Retro","Rotate (muted)", +#@gui : "Rotate (vibrant)","Rotated","Rotated (crush)","Smooth crome-ish","Smooth fade","Soft fade","Solarize color", +#@gui : "Solarized color2","Summer","Summer (alt)","Sunny","Sunny (alt)","Sunny (warm)","Sunny (rich)","Super warm", +#@gui : "Super warm (rich)","Sutro FX","Vibrant","Vibrant (alien)","Vibrant (contrast)","Vibrant (crome-ish)", +#@gui : "Vintage","Vintage (alt)","Vintage (brighter)","Warm","Warm (highlight)","Warm (yellow)"}_0 + +#@gui : Thumbnail Size = int(512,0,1024)_1 +#@gui : sep = separator() +#@gui : Strength (%) = float(100,0,100) +#@gui : Brightness (%) = float(0,-100,100) +#@gui : Contrast (%) = float(0,-100,100) +#@gui : Gamma (%) = float(0,-100,100) +#@gui : Hue (%) = float(0,-100,100) +#@gui : Saturation (%) = float(0,-100,100) +#@gui : Normalize Colors = choice("None","Pre-Normalize","Post-Normalize","Both") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = value(0)_2+ +#@gui : sep = separator() +#@gui : note = note("Note: The color LUTs proposed in this category comes from:\n") + +#@gui : sep = value(0)_0+ +#@gui : note = note{"
  \ +# Abigail Gonzalez - FreshLUTs
"} + +#@gui : sep = value(0)_0+ +#@gui : note = note{"
  \ +# Alex Jordan - FreshLUTs
"} + +#@gui : sep = value(0)_0+ +#@gui : note = note{"
Free Cinematic LUTs
"} + +#@gui : sep = value(0)_0+ +#@gui : note = note{"
&n\ +# bsp; 30 Cinematic Travel Color
"} + +#@gui : sep = value(0)_0+ +#@gui : note = note{"
  RawTherapee Film Simulation
"} + +#@gui : sep = value(0)_0+ +#@gui : note = note{"
  \ +# Eric Ellerbrock - FreshLUTs
"} + +#@gui : sep = value(0)_0+ +#@gui : note = note{"
  FilterGrade Free Cinematic LUTs Pack
"} + +#@gui : sep = value(0)_0+ +#@gui : note = note{"
  \ +# J.T. Semple - FreshLUTs
"} + +#@gui : sep = value(0)_0+ +#@gui : note = note{"
  \ +# Kyler Holland 10 Free CLUTs
"} + +#@gui : sep = value(0)_0+ +#@gui : note = note{"
  Lutify.Me Free LUTs
"} + +#@gui : sep = value(0)_0+ +#@gui : note = note{"
Moviz LUTs
"} + +#@gui : sep = value(0)_0+ +#@gui : note = note{"
Ohad Peretz - FreshLUTs
"} + +#@gui : sep = value(0)_0+ +#@gui : note = note{"
  \ +# ON1 Free Photography LUTs
"} + +#@gui : sep = value(0)_0+ +#@gui : note = note{"
PictureFX - A Free HaldCLUT Set
"} + +#@gui : sep = value(0)_2+ +#@gui : note = note{"
  \ +# PIXLS.US Contributors
"} + +#@gui : sep = value(0)_0+ +#@gui : note = note{"
  \ +# Purple11 - Free LUTs
"} + +#@gui : sep = value(0)_0+ +#@gui : note = note{"
  RocketStock 35 Free LUTs for Color Grading
"} + +#@gui : sep = value(0)_0+ +#@gui : note = note{"
  \ +# Shamoon Abbasi - FreshLUTs
"} + +#@gui : sep = value(0)_0+ +#@gui : note = note{"
  SmallHD Free \ +# Movie Look Pack
"} + +#@gui : sep = value(0)_2+ +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé. +#@gui :         Latest Update: 2019/10/11.") +fx_color_presets : + category=${arg\ 1+$1,abigailgonzalez,alexjordan,cinematic,cinematic_travel,creative,ericellerbrock,filtergrade,\ + jtsemple,kyler_holland,lutifyme,moviz,ohadperetz,on1,picturefx,pixlsus,purple11,rocketstock,\ + shamoonabbasi,smallhd,others} + presets=${-_fx_cluts_$category} + index={arg(1+$1,${2-21})} + thumbsize,strength,brightness,contrast,gamma,hue,saturation,normalize=${22-29} + + if $normalize==1" || "$normalize==3 # Pre-normalization + repeat $! l[$>] split_opacity balance_gamma[0] , a c endl done + fi + if $index>=2 # Apply CLUT + path_clut=${-path_cache} + name=${arg\ 1+$index-2,$presets} + clut $name,{0$_is_preview" && "!isfile(['{/${path_clut}clut_$name.cimgz}'])?17:48} + repeat $!-1 if $strength<100 +map_clut[$>] . j[$>] .,0,0,0,0,{$strength%} rm. else map_clut[$>] . fi done + rm. + adjust_colors $brightness,$contrast,$gamma,$hue,$saturation,0,255 + if $normalize==2" || "$normalize==3 repeat $! l[$>] split_opacity n[0] 0,255 a c endl done fi # Post-normalization + + elif $index==1 # "None" + adjust_colors $brightness,$contrast,$gamma,$hue,$saturation,0,255 + if $normalize==2" || "$normalize==3 repeat $! l[$>] split_opacity n[0] 0,255 a c endl done fi # Post-normalization + + else # Collage + repeat $! l[$>] if max(w,h)>$thumbsize rr2d $thumbsize,$thumbsize,0,2 fi endl done + N=$! +to "Original",1%,1%,7.5%,2,0.5 + Np={narg($presets)} repeat $Np + clut_name=${arg\ 1+$>,$presets} + clut $clut_name mv. $N + repeat $N + if $strength<100 [$>] +map_clut. [$N] j.. .,0,0,0,0,{$strength%} rm. else +map_clut[$>] [$N] fi + adjust_colors. $brightness,$contrast,$gamma,$hue,$saturation,0,255 + if $normalize==2" || "$normalize==3 l. split_opacity n[0] 0,255 a c endl fi # Post-normalization + strcapitalize $clut_name clut_name=${} + to. $clut_name,0.01~,0.01~,7.5%,1 + done + rm[$N] + progress {$>*100/($Np-1)} + done + k[$N--1] frame 1,1,0,0,0,255 - 128 append_tiles {s=floor(sqrt($!));w>h?[s,0]:[0,s]} + 128 + fi + +fx_color_presets_preview : + _is_preview=1 + index={arg(1+$1,${2-21})} + if !$index gui_warning_preview "Preview disabled in 'Collage' mode" + else gui_split_preview "fx_color_presets $*",${30-32} + fi + u "{$1}{$2}_"{2*($1==0)}\ + "{$3}_"{2*($1==1)}\ + "{$4}_"{2*($1==2)}\ + "{$5}_"{2*($1==3)}\ + "{$6}_"{2*($1==4)}\ + "{$7}_"{2*($1==5)}\ + "{$8}_"{2*($1==6)}\ + "{$9}_"{2*($1==7)}\ + "{$10}_"{2*($1==8)}\ + "{$11}_"{2*($1==9)}\ + "{$12}_"{2*($1==10)}\ + "{$13}_"{2*($1==11)}\ + "{$14}_"{2*($1==12)}\ + "{$15}_"{2*($1==13)}\ + "{$16}_"{2*($1==14)}\ + "{$17}_"{2*($1==15)}\ + "{$18}_"{2*($1==16)}\ + "{$19}_"{2*($1==17)}\ + "{$20}_"{2*($1==18)}\ + "{$21}_"{2*($1==19)}\ + "{$22}_"{1+!$index}\ + "{$23}{$24}{$25}{$26}{$27}{$28}{$29}{$30}{$31,$32}"\ + "{0}_"{2*($1!=19)}\ + "{0}_"{2*($1==0)}\ + "{0}_"{2*($1==1)}\ + "{0}_"{2*($1==2)}\ + "{0}_"{2*($1==3)}\ + "{0}_"{2*($1==4)}\ + "{0}_"{2*($1==5)}\ + "{0}_"{2*($1==6)}\ + "{0}_"{2*($1==7)}\ + "{0}_"{2*($1==8)}\ + "{0}_"{2*($1==9)}\ + "{0}_"{2*($1==10)}\ + "{0}_"{2*($1==11)}\ + "{0}_"{2*($1==12)}\ + "{0}_"{2*($1==13)}\ + "{0}_"{2*($1==14)}\ + "{0}_"{2*($1==15)}\ + "{0}_"{2*($1==16)}\ + "{0}_"{2*($1==17)}\ + "{0}_"{2*($1==18)}\ + "{0}" + +_fx_cluts_abigailgonzalez : + u blade_runner,blue_house,blue_ice,caribe,cinema,cinema_2,cinema_3,\ + cinema_4,cinema_5,cinema_noir,cinematic_for_flog,day_4nite,eterna_for_flog,filmic,\ + fuji_hdr,goldengate,matrix,monochrome_1,monochrome_2,old_west,science_fiction + +_fx_cluts_alexjordan : + u action_magenta_01,action_red_01,adventure_1453,agressive_highligjtes_recovery_5,bleech_bypass_green,\ + bleech_bypass_yellow_01,blue_dark,blue_shadows_01,bright_green_01,brownish,colorful_0209,conflict_01,\ + contrast_with_highlights_protection,contrasty_afternoon,contrasty_green,cross_process_cp_130,cross_process_cp_14,\ + cross_process_cp_15,cross_process_cp_16,cross_process_cp_18,cross_process_cp_3,cross_process_cp_4,\ + cross_process_cp_6,dark_green_02,dark_green_1,dark_place_01,dream_1,dream_85,faded_retro_01,faded_retro_02,\ + film_0987,film_9879,film_high_contrast,flat_30,green_2025,green_action,green_afternoon,\ + green_conflict,green_day_01,green_day_02,green_g_09,green_indoor,green_light,harsh_day,harsh_sunset,\ + highlights_protection,indoor_blue,low_contrast_blue,low_key_01,magenta_day,magenta_day_01,magenta_dream,\ + memories,moonlight_01,mostly_blue,muted_01,night_01,only_red,only_red_and_blue,operation_yellow,orange_dark_4,\ + orange_dark_7,orange_dark_look,orange_underexposed,protect_highlights_01,red_afternoon_01,red_day_01,red_dream_01,\ + retro_brown_01,retro_magenta_01,retro_yellow_01,saturated_blue,smart_contrast,subtle_blue,subtle_green,yellow_55b,\ + yellow_film_01 + +_fx_cluts_cinematic : + u deep,dimension,enchanted,flavin,frosted,shine,ultra_water,wipe + +_fx_cluts_cinematic_travel : + u blue_cold_fade,bright_teal_orange,bright_warm,clear_teal_fade,cold_clear_blue,cold_clear_blue_1,deep_blue,\ + deep_dark_warm,deep_high_contrast,deep_teal_fade,deep_warm_fade,faded_green,greenish_contrasty,greenish_fade,\ + greenish_fade_1,hard_teal_orange,neutral_teal_orange,neutral_warm_fade,smooth_clear,smooth_green_orange,\ + smooth_teal_orange,teal_fade,very_warm_greenish,warm_dark_contrasty,warm_fade,warm_fade_1,warm_neutral,\ + warm_sunset_red,warm_teal + +_fx_cluts_creative : + u anime,bleachbypass_1,bleachbypass_2,bleachbypass_3,bleachbypass_4,candlelight,colornegative,crispwarm,crispwinter,\ + dropblues,edgyember,fallcolors,foggynight,futuristicbleak_1,futuristicbleak_2,futuristicbleak_3,futuristicbleak_4,\ + horrorblue,latesunset,moonlight,nightfromday,redblueyellow,smokey,softwarming,tealmagentagold,tealorange,\ + tealorange_1,tealorange_2,tealorange_3,tensiongreen_1,tensiongreen_2,tensiongreen_3,tensiongreen_4 + +_fx_cluts_ericellerbrock : + u avalanche,black_star,helios,hydracore,hypnosis,killstreak,nemesis,night_blade_4,paladin,seringe_4,serpent,terra_4,\ + victory,yellowstone + +_fx_cluts_filtergrade : + u fgcinebasic,fgcinebright,fgcinecold,fgcinedrama,fgcinetealorange_1,fgcinetealorange_2,fgcinevibrant,fgcinewarm + +_fx_cluts_jtsemple : + u brightgreen,crispromance,crushin,frostedbeachpicnic,justpeachy,lateafternoonwanderlust,lushgreensummer,\ + magentacoffee,minimalistcaffeination,mysticpurplesunset,nostalgiahoney,springmorning,toastedgarden,\ + winterlighthouse + +_fx_cluts_kyler_holland : + u kh1,kh2,kh3,kh4,kh5,kh6,kh7,kh8,kh9,kh10 + +_fx_cluts_lutifyme : + u hackmanite,herderite,heulandite,hiddenite,hilutite,howlite,hypersthene + +_fx_cluts_moviz : + u moviz_1,moviz_2,moviz_3,moviz_4,moviz_5,moviz_6,moviz_7,moviz_8,moviz_9,moviz_10,\ + moviz_11,moviz_12,moviz_13,moviz_14,moviz_15,moviz_16,moviz_17,moviz_18,moviz_19,moviz_20,\ + moviz_21,moviz_22,moviz_23,moviz_24,moviz_25,moviz_26,moviz_27,moviz_28,moviz_29,moviz_30,\ + moviz_31,moviz_32,moviz_33,moviz_34,moviz_35,moviz_36,moviz_37,moviz_38,moviz_39,moviz_40,\ + moviz_41,moviz_42,moviz_43,moviz_44,moviz_45,moviz_46,moviz_47,moviz_48 + +_fx_cluts_ohadperetz : + u cold_simplicity_2,d_o_1,retro_summer_3,subtle_yellow,teal_moonlight,true_colors_8,vintage_warmth_1 + +_fx_cluts_on1 : + u 2-strip-process,aqua,aqua_and_orange_dark,berlin_sky,blues,\ + bw_1,bw_2,bw_3,bw_4,bw_5,bw_6,bw_7,bw_8,bw_9,bw_10,chrome_01,\ + cinematic-1,cinematic-2,cinematic-3,cinematic-4,cinematic-5,cinematic-6,cinematic-7,cinematic-8,\ + cinematic-9,cinematic-10,\ + classic_teal_and_orange,earth_tone_boost,fade_to_green,film_print_01,film_print_02,french_comedy,green_blues,\ + green_yellow,\ + landscape_1,landscape_2,landscape_3,landscape_4,landscape_5,landscape_6,landscape_7,landscape_8,landscape_9,\ + landscape_10,\ + lc_1,lc_2,lc_3,lc_4,lc_5,lc_6,lc_7,lc_8,lc_9,lc_10,\ + moody_1,moody_2,moody_3,moody_4,moody_5,moody_6,moody_7,moody_8,moody_9,moody_10,\ + nw-1,nw-2,nw-3,nw-4,nw-5,nw-6,nw-7,nw-8,nw-9,nw-10,oranges,\ + portrait_1,portrait_2,portrait_3,portrait_4,portrait_5,portrait_6,portrait_7,portrait_8,portrait_9,portrait_10,\ + purple_2,reds,reds_oranges_yellows,studio_skin_tone_shaper,vintage_chrome + +_fx_cluts_picturefx : + u analogfx_anno_1870_color,analogfx_old_style_i,analogfx_old_style_ii,analogfx_old_style_iii,\ + analogfx_sepia_color,analogfx_soft_sepia_i,analogfx_soft_sepia_ii,\ + goldfx_bright_spring_breeze,goldfx_bright_summer_heat,goldfx_hot_summer_heat,\ + goldfx_perfect_sunset_01min,goldfx_perfect_sunset_05min,goldfx_perfect_sunset_10min,\ + goldfx_spring_breeze,goldfx_summer_heat,technicalfx_backlight_filter,\ + zilverfx_bw_solarization,zilverfx_infrared,zilverfx_vintage_bw + +_fx_cluts_pixlsus : + u amstragram,amstragram+,autumn,cinematic_lady_bird,cinematic_mexico,dark_blues_in_sunlight,delicatessen,expired_69,\ + fadedlook,faded_print,hypressen,magenta_yellow,metropolis,modern_film,newspaper,night_spy,progressen,prussian_blue,\ + seventies_magazine,street,sweet_bubblegum,sweet_gelatto,taiga,tarraco,unknown,uzbek_bukhara,\ + uzbek_marriage,uzbek_samarcande,velvetia,warm_vintage,whiter_whites + +_fx_cluts_purple11 : + u good_morning,going_for_a_walk,nah,once_upon_a_time,serenity,passing_by,smooth_sailing,undeniable,undeniable2,\ + urban_cowboy,well_see,you_can_do_it + +_fx_cluts_rocketstock : + u arabica_12,ava_614,azrael_93,bourbon_64,byers_11,chemical_168,clayton_33,clouseau_54,cobi_3,contrail_35,\ + cubicle_99,django_25,domingo_145,\ + faded_47,folger_50,fusion_88,hyla_68,korben_214,lenox_340,lucky_64,mckinnon_75,milo_5,neon_770,paladin_1875,\ + pasadena_21,pitaya_15,reeve_38,remy_24,sprocket_231,teigen_28,trent_18,tweed_71,vireo_37,zed_32,zeke_39 + +_fx_cluts_shamoonabbasi : + u city_7,coffee_44,date_39,day_for_night,denoiser_simple_40,desert_gold_37,directions_23,drop_green_tint_14,\ + elegance_38,golden_night_softner_43,golden_sony_37,green_15,happyness_133,hlg_1_1,industrial_33,morning_6,\ + morroco_16,night_king_141,rest_33,shadow_king_39,spy_29,thriller_2,turkiest_42,vintage_163,wooden_gold_20 + +_fx_cluts_smallhd : + u apocalypse_this_very_moment,bboyz_2,bob_ford,life_giving_tree,moonrise,saving_private_damon,the_matrices + +_fx_cluts_others : + u 60s,60s_faded,60s_faded_alt,alien_green,black_and_white,bleach_bypass,blue_mono,\ + cinematic_01,cinematic_02,cinematic_03,\ + color_rich,faded,faded_alt,faded_analog,faded_extreme,faded_vivid,expired_fade,expired_polaroid,extreme,fade,\ + faux_infrared,golden,golden_bright,golden_fade,golden_mono,golden_vibrant,green_mono,hong_kong,instantc,\ + k_tone_vintage_kodachrome,light_blown,lomo,mono_tinted,\ + muted_fade,mute_shift,natural_vivid,nostalgic,orange_tone,pink_fade,purple,retro,rotate_muted,\ + rotate_vibrant,rotated,rotated_crush,\ + smooth_cromeish,smooth_fade,soft_fade,solarized_color,solarized_color_2,summer,summer_alt,sunny,sunny_alt,\ + sunny_warm,\ + sunny_rich,super_warm,super_warm_rich,sutro_fx,vibrant,vibrant_alien,vibrant_contrast,vibrant_cromeish,\ + vintage,vintage_alt,vintage_brighter,warm,warm_highlight,warm_yellow + #@gui Colorful Blobs : fx_colorful_blobs, fx_colorful_blobs_preview #@gui : Colorspace = choice(1,"sRGB","Linear RGB","Lab") #@gui : Background Color = color(200,200,200,0) #@gui : Display Blob Controls = bool(1) #@gui : sep = separator() #@gui : Blob 1 = point(25,25,1,1,0,0,0,0,5) -#@gui : Radius = point(50,50,0,1,0,0,0,0,5,0) +#@gui : Radius = point(50,50,0,1,0,0,0,0,5)_0 #@gui : Blob 1 Color = color(255,0,0) #@gui : Previous = value(-1,-1,-1,-1) #@gui : sep = separator() #@gui : Blob2 = point(75,25,1,1,0,0,0,0,5) -#@gui : Radius = point(50,50,0,1,0,0,0,0,5,0) +#@gui : Radius = point(50,50,0,1,0,0,0,0,5)_0 #@gui : Blob 2 Color = color(0,255,0) #@gui : Previous = value(-1,-1,-1,-1) #@gui : sep = separator() #@gui : Blob 3 = point(50,75,1,1,0,0,0,0,5) -#@gui : Radius = point(50,50,0,1,0,0,0,0,5,0) +#@gui : Radius = point(50,50,0,1,0,0,0,0,5)_0 #@gui : Blob 3 Color = color(0,0,255) #@gui : Previous = value(-1,-1,-1,-1) #@gui : sep = separator() #@gui : Blob 4 = point(5,90,-1,1,0,0,0,0,5) -#@gui : Radius = point(50,50,0,1,0,0,0,0,5,0) +#@gui : Radius = point(50,50,0,1,0,0,0,0,5)_0 #@gui : Blob 4 Color = color(255,255,0) #@gui : Previous = value(-1,-1,-1,-1) #@gui : sep = separator() #@gui : Blob 5 = point(5,90,-1,1,0,0,0,0,5) -#@gui : Radius = point(50,50,0,1,0,0,0,0,5,0) +#@gui : Radius = point(50,50,0,1,0,0,0,0,5)_0 #@gui : Blob 5 Color = color(255,0,255) #@gui : Previous = value(-1,-1,-1,-1) #@gui : sep = separator() #@gui : Blob 6 = point(5,90,-1,1,0,0,0,0,5) -#@gui : Radius = point(50,50,0,1,0,0,0,0,5,0) +#@gui : Radius = point(50,50,0,1,0,0,0,0,5)_0 #@gui : Blob 6 Color = color(0,255,255) #@gui : Previous = value(-1,-1,-1,-1) #@gui : sep = separator() #@gui : Blob 7 = point(5,90,-1,1,0,0,0,0,5) -#@gui : Radius = point(50,50,0,1,0,0,0,0,5,0) +#@gui : Radius = point(50,50,0,1,0,0,0,0,5)_0 #@gui : Blob 7 Color = color(255,255,255) #@gui : Previous = value(-1,-1,-1,-1) #@gui : sep = separator() #@gui : Blob 8 = point(5,90,-1,1,0,0,0,0,5) -#@gui : Radius = point(50,50,0,1,0,0,0,0,5,0) +#@gui : Radius = point(50,50,0,1,0,0,0,0,5)_0 #@gui : Blob 8 Color = color(0,0,0) #@gui : Previous = value(-1,-1,-1,-1) #@gui : sep = separator() #@gui : Blob 9 = point(5,90,-1,1,0,0,0,0,5) -#@gui : Radius = point(50,50,0,1,0,0,0,0,5,0) +#@gui : Radius = point(50,50,0,1,0,0,0,0,5)_0 #@gui : Blob 9 Color = color(255,128,64) #@gui : Previous = value(-1,-1,-1,-1) #@gui : sep = separator() #@gui : Blob 10 = point(5,90,-1,1,0,0,0,0,5) -#@gui : Radius = point(50,50,0,1,0,0,0,0,5,0) +#@gui : Radius = point(50,50,0,1,0,0,0,0,5)_0 #@gui : Blob 10 Color = color(255,64,128) #@gui : Previous = value(-1,-1,-1,-1) #@gui : sep = separator() #@gui : Blob 11 = point(5,90,-1,1,0,0,0,0,5) -#@gui : Radius = point(50,50,0,1,0,0,0,0,5,0) +#@gui : Radius = point(50,50,0,1,0,0,0,0,5)_0 #@gui : Blob 11 Color = color(128,64,255) #@gui : Previous = value(-1,-1,-1,-1) #@gui : sep = separator() #@gui : Blob 12 = point(5,90,-1,1,0,0,0,0,5) -#@gui : Radius = point(50,50,0,1,0,0,0,0,5,0) +#@gui : Radius = point(50,50,0,1,0,0,0,0,5)_0 #@gui : Blob 12 Color = color(64,128,255) #@gui : Previous = value(-1,-1,-1,-1) #@gui : sep = separator() -#@gui : note = note("This filter can be used to create custom palettes with given color shades. It has been inspired by Adobe's Playful Palette.") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2018/08/26.") +#@gui : note = note("This filter can be used to create custom palettes with given color shades. +#@gui : It has been inspired by +#@gui : +#@gui : Adobe's Playful Palette.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2018/08/26.") fx_colorful_blobs : N=12 colorspace,bgR,bgG,bgB,bgA,display_controls,\ @@ -28017,19 +35273,23 @@ x10,y10,rx10,ry10,R10,G10,B10,p_x10,p_y10,p_rx10,p_ry10,\ x11,y11,rx11,ry11,R11,G11,B11,p_x11,p_y11,p_rx11,p_ry11,\ =$"*" - if {!0$_is_preview} display_controls=0 fi - if {$1==1} srgb2cs=srgb2rgb cs2srgb=rgb2srgb - elif {$1==2} srgb2cs=srgb2lab cs2srgb=lab2srgb + if !0$_is_preview display_controls=0 fi + if $1==1 srgb2cs=srgb2rgb cs2srgb=rgb2srgb + elif $1==2 srgb2cs=srgb2lab cs2srgb=lab2srgb fi {0,s=min(w,h);[s,s]},1,4 k. 100%,100%,1,1,1e-8 repeat $N # If center point has been moved -> Update radius point. - rx$>,ry$>={"P = ["${x$>},${y$>}"]; R = ["${rx$>},${ry$>}"]; oP = ["${p_x$>},${p_y$>}"]; oP==[-1,-1]?P + [10,0]:P!=oP?R + P - oP:R"} - - if {!isnan(${x$>})} - x,y,rx,ry,R,G,B={"const w1 = (w - 1)%; const h1 = (h -1)%; "round([${x$>}*w1,${y$>}*h1,${rx$>}*w1,${ry$>}*h1,${R$>},${G$>},${B$>}])} + rx$>,ry$>={"P = ["${x$>},${y$>}"]; + R = ["${rx$>},${ry$>}"]; + oP = ["${p_x$>},${p_y$>}"]; + oP==[-1,-1]?P + [10,0]:P!=oP?R + P - oP:R"} + + if !isnan(${x$>}) + x,y,rx,ry,R,G,B={"const w1 = (w - 1)%; const h1 = (h -1)%; "\ + round([${x$>}*w1,${y$>}*h1,${rx$>}*w1,${ry$>}*h1,${R$>},${G$>},${B$>}])} r={max(1,round(norm($x-$rx,$y-$ry)))} if $1 ($R^$G^$B) $srgb2cs. R,G,B={^} rm. fi f. "* @@ -28048,10 +35308,12 @@ f[0] "*begin(bg = [ "$bgR,$bgG,$bgB,$bgA" ]); i(#1)<0.5?bg:[R,G,B,255]" k[0] repeat $N - if {!isnan(${x$>})" && "$display_controls} - x,y,rx,ry,R,G,B={"const w1 = (w - 1)%; const h1 = (h -1)%; "round([${x$>}*w1,${y$>}*h1,${rx$>}*w1,${ry$>}*h1,${R$>},${G$>},${B$>}])} + if !isnan(${x$>})" && "$display_controls + x,y,rx,ry,R,G,B={"const w1 = (w - 1)%; const h1 = (h -1)%; "\ + round([${x$>}*w1,${y$>}*h1,${rx$>}*w1,${ry$>}*h1,${R$>},${G$>},${B$>}])} circle $x,$y,3,0.85,0xFFFFFFFF,{v=avg(crop($x-3,$y-3,7,7))>128?0:255;[v,v,v,255]} - rectangle {"const x = "$rx"; const y = "$ry"; [x-2,y-2,x+2,y+2]"},0.85,0xFFFFFFFF,{v=avg(crop($rx-3,$ry-3,7,7))>128?0:255;[v,v,v,255]} + rectangle {"const x = "$rx"; const y = "$ry"; [x-2,y-2,x+2,y+2]"},0.85,0xFFFFFFFF,\ + {v=avg(crop($rx-3,$ry-3,7,7))>128?0:255;[v,v,v,255]} line $x,$y,$rx,$ry,0.5,0xF0F0F0F0,255 line $x,$y,$rx,$ry,0.5,0x0F0F0F0F,0,0,0,255 fi done @@ -28078,27 +35340,32 @@ fx_colorful_blobs $* #@gui Colormap : fx_colormap,fx_colormap_preview -#@gui : Colormap = choice[1,"Adaptive","Custom","Standard (256)","HSV (256)","Lines (256)","Hot (256)","Cool (256)","Jet (256)","Flag (256)","Cube (256)"] +#@gui : Colormap = choice{2,"Adaptive","Custom","Standard (256)","HSV (256)","Lines (256)","Hot (256)", +#@gui : "Cool (256)","Jet (256)","Flag (256)","Cube (256)"} #@gui : Dithering = float(1,0,1) -#@gui : sep = separator(), note = note("For adaptive and custom colormaps only :") -#@gui : Number of Tones = int(32,2,256) -#@gui : sep = separator(), note = note("For custom colormaps only :") -#@gui : Number of Colors = int(8,2,8) -#@gui : 1st Color = color(0,0,0) -#@gui : 2nd Color = color(255,255,255) -#@gui : 3rd Color = color(255,0,0) -#@gui : 4th Color = color(0,255,0) -#@gui : 5th Color = color(0,0,255) -#@gui : 6th Color = color(255,255,0) -#@gui : 7th Color = color(255,0,255) -#@gui : 8th Color = color(0,255,255) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/27/12.") +#@gui : sep = separator() +#@gui : Number of Tones = int(32,2,256)_0 +#@gui : Number of Colors = int(8,2,8)_0 +#@gui : 1st Color = color(0,0,0)_0 +#@gui : 2nd Color = color(255,255,255)_0 +#@gui : 3rd Color = color(255,0,0)_0 +#@gui : 4th Color = color(0,255,0)_0 +#@gui : 5th Color = color(0,0,255)_0 +#@gui : 6th Color = color(255,255,0)_0 +#@gui : 7th Color = color(255,0,255)_0 +#@gui : 8th Color = color(0,255,255)_0+ +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/27/12.") fx_colormap : repeat $! l[$>] split_opacity to_rgb[0] - if {$1>=2} # Pre-defined colormap. + if $1>=2 # Pre-defined colormap. index[0] {$1-2},$2,1 - elif {$1==1} # Custom colormap. + elif $1==1 # Custom colormap. (${5-28}) z. 0,{3*$4-1} r. 3,{w/3},1,1,-1 permute. yzcx r. $3,1,1,3,3 index[0] .,$2,1 rm. @@ -28110,15 +35377,35 @@ fx_colormap_preview : gui_split_preview "fx_colormap $*",${-3--1} + is_ad,is_cu={2*[$1==0||$1==1,$1==1]} + u "{$1}{$2}"\ + "{$3}_"$is_ad\ + "{$4}_"$is_cu\ + "{${5-7}}_"$is_cu\ + "{${8-10}}_"$is_cu\ + "{${11-13}}_"$is_cu\ + "{${14-16}}_"$is_cu\ + "{${17-19}}_"$is_cu\ + "{${20-22}}_"$is_cu\ + "{${23-25}}_"$is_cu\ + "{${26-28}}_"$is_cu\ + "{$29}{$30,$31}" #@gui Color Mask [Interactive] : fx_mask_color, gui_no_preview -#@gui : Color Metric = _choice(13,"RGB [all]","RGB [red]","RGB [green]","RGB [blue]","Linear RGB [all]","Linear RGB [red]","Linear RGB [green]","Linear RGB [blue]","YCbCr [luminance]","YCbCr [blue-red chrominances]","YCbCr [blue chrominance]","YCbCr [red chrominance]","YCbCr [green chrominance]","Lab [all]","Lab [lightness]","Lab [ab-chrominances]","Lab [a-chrominance]","Lab [b-chrominance]","Lch [all]","Lch [ch-chrominances]","Lch [c-chrominance]","Lch [h-chrominance]","HSV [all]","HSV [hue]","HSV [saturation]","HSV [value]","HSI [all]","HSI [intensity]","HSL [all]","HSL [lightness]","CMYK [cyan]","CMYK [magenta]","CMYK [yellow]","CMYK [key]","YIQ [luma]","YIQ [chromas]") +#@gui : Color Metric = _choice(13,"RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","Linear RGB [All]", +#@gui : "Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [red chrominance]", +#@gui : "YCbCr [green chrominance]","Lab [all]","Lab [lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [all]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]", +#@gui : "HSV [all]","HSV [hue]","HSV [saturation]","HSV [value]","HSI [all]","HSI [intensity]","HSL [all]", +#@gui : "HSL [lightness]","CMYK [cyan]","CMYK [magenta]","CMYK [yellow]","CMYK [key]","YIQ [luma]","YIQ [chromas]") #@gui : Spatial Tolerance = _float(10,0,100) #@gui : Color Tolerance = _float(5,0,100) #@gui : sep = separator() #@gui : Output Mode = _choice(0,"Masked image","Color mask") #@gui : sep = separator() -#@gui : note = note{"Note: This filter is CPU consuming, so use it at least with 4+ cores (or reduce the size of the interactive window to speed up computation)."} +#@gui : note = note{"Note: This filter is CPU consuming, so use it at least with 4+ cores +#@gui : (or reduce the size of the interactive window to speed up computation)."} #@gui : note = note{"Interactions:\n #@gui : Use the following actions in the interactive window to build your color mask :\n\n #@gui : - Left mouse button make the color pointed by the mouse wanted for the mask.\n @@ -28130,13 +35417,15 @@ #@gui : - Keys CTRL+R resets window size.\n #@gui : - Keys ESC, Q or ENTER exit the interactive window. #@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 01/20/2017.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 01/20/2017.") fx_mask_color : - cs=rgb,rgb_r,rgb_g,rgb_b,lrgb,lrgb_r,lrgb_g,lrgb_b,ycbcr_y,ycbcr_cbcr,ycbcr_cb,ycbcr_cr,ycbcr_cg,lab,lab_l,lab_ab,lab_a,lab_b,lch,lch_c,lch_h,\ - hsv,hsv_h,hsv_s,hsv_v,hsi,hsi_i,hsl,hsl_l,cmyk_c,cmyk_m,cmyk_y,cmyk_k,yiq_y,yiq_iq + cs=rgb,rgb_r,rgb_g,rgb_b,lrgb,lrgb_r,lrgb_g,lrgb_b,ycbcr_y,ycbcr_cbcr,ycbcr_cb,ycbcr_cr,ycbcr_cg,\ + lab,lab_l,lab_ab,lab_a,lab_b,lch,lch_c,lch_h,hsv,hsv_h,hsv_s,hsv_v,hsi,hsi_i,hsl,hsl_l,\ + cmyk_c,cmyk_m,cmyk_y,cmyk_k,yiq_y,yiq_iq repeat $! l[$<] to_rgb nm={n} nm ${-gui_layer_name} +x_mask_color ${arg\ 1+$1,$cs},$2,$3 - if {$4==1} channels. 100% fi + if $4==1 channels. 100% fi nm $nm rv endl done @@ -28149,8 +35438,10 @@ #@gui : sep = separator() #@gui : note = note{"Description:\n #@gui : This filter allows to apply color curves on your images, in many different colorspaces. -#@gui : Click on the Apply or OK buttons below to open the G'MIC interactive windows and start building your color curves. -#@gui : When you're done, exit the main image window: your modified result will be transferred back to the host software.\n\n +#@gui : Click on the Apply or OK buttons below to open the G'MIC interactive windows and +#@gui : start building your color curves. +#@gui : When you're done, exit the main image window: your modified result will be transferred back to the +#@gui : host software.\n\n #@gui : Once you've set curves, you can save them by pressing the Add to faves button below the filter tree. #@gui : To clear control points for your curves, click on the Reset button above. #@gui : "} @@ -28167,20 +35458,22 @@ #@gui : - Keys CTRL+R resets window size.\n #@gui : - Keys ESC, Q or ENTER close the current window. #@gui :
"} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 09/28/2014.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 09/28/2014.") fx_curves_interactive : nm "Color curves" repeat 4 __xcc_C$>=0,0,100,100 done - if {$4==$1} l[] (${5--1}) s -,-1 repeat $! __xcc_C$>={$>,^} done rm endl fi - if $3 _xcc_colorbase=${arg\ {$4+1},rgb,cmy,cmyk,hsi,hsl,hsv,lab,lch,ycbcr} x_color_curves last # Apply transformation from previously defined curves. - else # Run interactive curve builder. + if $4==$1 l[] (${5--1}) s -,-1 repeat $! __xcc_C$>={$>,^} done rm endl fi + if $3 # Apply transformation from previously defined curves + _xcc_colorbase=${arg\ {$4+1},rgb,cmy,cmyk,hsi,hsl,hsv,lab,lch,ycbcr} x_color_curves last + else # Run interactive curve builder x_color_curves ${arg\ {$1+1},rgb,cmy,cmyk,hsi,hsl,hsv,lab,lch,ycbcr} u "{$1}{$2}{$3}{$1}{"$__xcc_C0,-1,$__xcc_C1,-1,$__xcc_C2,-1,$__xcc_C3,-1,$__xcc_C4"}" fi - if $2 # Add HaldCLUT layer. + if $2 # Add HaldCLUT layer (0,255) (0;255) (0/255) r[-3--1] 2,2,2 a[-3--1] c - if {$2==2} r. 256,256,256,3,3 r. 4096,4096,1,3,-1 # High-res HaldCLUT. - else r. 64,64,64,3,3 r. 512,512,1,3,-1 # Low-res HaldCLUT. + if $2==2 r. 256,256,256,3,3 r. 4096,4096,1,3,-1 # High-res HaldCLUT + else r. 64,64,64,3,3 r. 512,512,1,3,-1 # Low-res HaldCLUT fi x_color_curves. last fi @@ -28190,7 +35483,8 @@ #@gui Customize CLUT : fx_customize_clut,fx_customize_clut_preview(1)+ #@gui : Keypoint Influence (%) = float(100,0,100) -#@gui : Lock Uniform Sampling = choice{0,"None","8 Keypoints (RGB Corners)","27 Keypoints","64 Keypoints","125 Keypoints","216 Keypoints","343 Keypoints"}, +#@gui : Lock Uniform Sampling = choice{0,"None","8 Keypoints (RGB Corners)","27 Keypoints","64 Keypoints", +#@gui : "125 Keypoints","216 Keypoints","343 Keypoints"}, #@gui : Spatial Regularization = int(10,0,30) #@gui : sep = separator() #@gui : note = note("Global correction:") @@ -28202,67 +35496,93 @@ #@gui : Post-Normalize = bool(0) #@gui : sep = separator() #@gui : Output Corresponding CLUT = _choice("Disable","512x512 Layer","4096x4096 Layer") -#@gui : Preview Type = choice{8,"Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Horizontal","Duplicate Vertical","HaldCLUT","3D CLUT (Fast)","3D CLUT (Precise)"} +#@gui : Preview Type = choice{8,"Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Horizontal","Duplicate Vertical","HaldCLUT","3D CLUT (Fast)","3D CLUT (Precise)"} #@gui : CLUT Opacity = float(0.5,0,1) #@gui : sep = separator() #@gui : note = note("Color correspondences:") -#@gui : Action #1 = choice(1,"Ignore","Lock Source","Replace Source by Target"), Source Color #1 = color(0,0,0), Target Color #1 = color(0,0,0) +#@gui : Action #1 = choice(1,"Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #1 = color(0,0,0), Target Color #1 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #2 = choice(1,"Ignore","Lock Source","Replace Source by Target"), Source Color #2 = color(255,255,255), Target Color #2 = color(255,196,128) +#@gui : Action #2 = choice(1,"Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #2 = color(255,255,255), Target Color #2 = color(255,196,128) #@gui : sep = separator() -#@gui : Action #3 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #3 = color(0,0,0), Target Color #3 = color(0,0,0) +#@gui : Action #3 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #3 = color(0,0,0), Target Color #3 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #4 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #4 = color(0,0,0), Target Color #4 = color(0,0,0) +#@gui : Action #4 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #4 = color(0,0,0), Target Color #4 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #5 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #5 = color(0,0,0), Target Color #5 = color(0,0,0) +#@gui : Action #5 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #5 = color(0,0,0), Target Color #5 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #6 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #6 = color(0,0,0), Target Color #6 = color(0,0,0) +#@gui : Action #6 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #6 = color(0,0,0), Target Color #6 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #7 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #7 = color(0,0,0), Target Color #7 = color(0,0,0) +#@gui : Action #7 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #7 = color(0,0,0), Target Color #7 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #8 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #8 = color(0,0,0), Target Color #8 = color(0,0,0) +#@gui : Action #8 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #8 = color(0,0,0), Target Color #8 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #9 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #9 = color(0,0,0), Target Color #9 = color(0,0,0) +#@gui : Action #9 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #9 = color(0,0,0), Target Color #9 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #10 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #10 = color(0,0,0), Target Color #10 = color(0,0,0) +#@gui : Action #10 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #10 = color(0,0,0), Target Color #10 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #11 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #11 = color(0,0,0), Target Color #11 = color(0,0,0) +#@gui : Action #11 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #11 = color(0,0,0), Target Color #11 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #12 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #12 = color(0,0,0), Target Color #12 = color(0,0,0) +#@gui : Action #12 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #12 = color(0,0,0), Target Color #12 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #13 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #13 = color(0,0,0), Target Color #13 = color(0,0,0) +#@gui : Action #13 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #13 = color(0,0,0), Target Color #13 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #14 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #14 = color(0,0,0), Target Color #14 = color(0,0,0) +#@gui : Action #14 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #14 = color(0,0,0), Target Color #14 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #15 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #15 = color(0,0,0), Target Color #15 = color(0,0,0) +#@gui : Action #15 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #15 = color(0,0,0), Target Color #15 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #16 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #16 = color(0,0,0), Target Color #16 = color(0,0,0) +#@gui : Action #16 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #16 = color(0,0,0), Target Color #16 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #17 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #17 = color(0,0,0), Target Color #17 = color(0,0,0) +#@gui : Action #17 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #17 = color(0,0,0), Target Color #17 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #18 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #18 = color(0,0,0), Target Color #18 = color(0,0,0) +#@gui : Action #18 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #18 = color(0,0,0), Target Color #18 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #19 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #19 = color(0,0,0), Target Color #19 = color(0,0,0) +#@gui : Action #19 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #19 = color(0,0,0), Target Color #19 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #20 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #20 = color(0,0,0), Target Color #20 = color(0,0,0) +#@gui : Action #20 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #20 = color(0,0,0), Target Color #20 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #21 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #21 = color(0,0,0), Target Color #21 = color(0,0,0) +#@gui : Action #21 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #21 = color(0,0,0), Target Color #21 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #22 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #22 = color(0,0,0), Target Color #22 = color(0,0,0) +#@gui : Action #22 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #22 = color(0,0,0), Target Color #22 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #23 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #23 = color(0,0,0), Target Color #23 = color(0,0,0) +#@gui : Action #23 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #23 = color(0,0,0), Target Color #23 = color(0,0,0) #@gui : sep = separator() -#@gui : Action #24 = choice("Ignore","Lock Source","Replace Source by Target"), Source Color #24 = color(0,0,0), Target Color #24 = color(0,0,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/14/06.") +#@gui : Action #24 = choice("Ignore","Lock Source","Replace Source by Target") +#@gui : Source Color #24 = color(0,0,0), Target Color #24 = color(0,0,0) +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/14/06.") fx_customize_clut : # Build CLUT. - if {!narg($_N)} N=64 else N=$_N fi N1={$N-1} + if !narg($_N) N=64 else N=$_N fi N1={$N-1} $N,$N,$N,4 if $2 # Lock uniform sampling uniform_distribution {(1+$2)^3},3 - repeat {w} point.. {round($N1*I[$>])},1,{255*I[$>]},1 done rm. + repeat w point.. {round($N1*I[$>])},1,{255*I[$>]},1 done rm. fi $=arg # Add user-defined color correspondences @@ -28277,12 +35597,12 @@ done s c,-3 - if {$1<100} # Need to compute a weighting map. + if $1<100 # Need to compute a weighting map. +distance. 1 if $1 ^. {1/(0.05+4*$1%)} else f. 0 fi n. 0,1 nm. influence mv. -3 fi - ==. 0 inpaint_diffusion.. .,100%,1,20 rm. c. 0,255 + ==. 0 inpaint_pde.. .,100%,1,20 rm. c. 0,255 if $influence 100%,100%,100%,3,[x,y,z] n. 0,255 @@ -28291,25 +35611,25 @@ fi # Apply CLUT on input layers + global color corrections. - if {!$3} map_clut[^-1] . # w/o spatial regularization - else repeat {$!-1} # w/ spatial regularization + if !$3 map_clut[^-1] . # w/o spatial regularization + else repeat $!-1 # w/ spatial regularization +luminance[$>] +map_clut[$>] .. -. [$>] repeat $3 guided. ..,2,50 done +[$>,-1] rm. done fi adjust_colors ${4-8},0,255 if $9 repeat $! l[$>] split_opacity n[0] 0,255 a c endl done fi if $10 - if {$10==2} r. 256,256,256,3,5 c. 0,255 fi + if $10==2 r. 256,256,256,3,5 c. 0,255 fi siz={w^1.5} r. $siz,$siz,1,3,-1 mv. 0 else rm. fi fx_customize_clut_preview : - if {$11<7} gui_split_preview "fx_customize_clut ${1-9},0,0,${12--1}",$11 - elif {$11==7} # HaldCLUT preview + if $11<7 gui_split_preview "fx_customize_clut ${1-9},0,0,${12--1}",$11 + elif $11==7 # HaldCLUT preview rm fx_customize_clut ${1-9},1,0,${12--1} - elif {$11>=8} # 3D CLUT preview + elif $11>=8 # 3D CLUT preview _N={$11>=9?64:32} k[0] to_rgb w={w} h={h} +fx_customize_clut ${1-9},1,0,${12--1} mv. 1 @@ -28317,7 +35637,7 @@ l[] if $2 # Lock uniform sampling uniform_distribution {(1+$2)^3},3 - repeat {w} circle3d {0,round($_N*I[$>])},0.75 col3d. {0,255*I[$>]} done rm[0] + repeat w circle3d {0,round($_N*I[$>])},0.75 col3d. {0,255*I[$>]} done rm[0] fi $=arg # Add user-defined color correspondences repeat 24 @@ -28333,10 +35653,11 @@ colorcube3d *3d. {$_N/255} o3d. 0.5 col3d. 0 p3d. 1 endl +3d[2--1] - pose3d. 5.10656,2.04904,2.723,-316.115,-0.0815767,4.97762,-3.59262,-41.7094,-3.40685,2.95212,4.16756,-118.811,0,0,203,1 + pose3d. 5.10656,2.04904,2.723,-316.115,-0.0815767,4.97762,-3.59262,-41.7094,\ + -3.40685,2.95212,4.16756,-118.811,0,0,203,1 # Try to find the best layout for displaying preview. - if {$w>$h} # Landscape mode + if $w>$h # Landscape mode r2dx[0,1] {0,round(w/2)} to[0] "Before",2,0,13,1,0.75 to[1] "After",2,0,13,1,0.75 @@ -28348,7 +35669,8 @@ a[0,1] x r[0] $w,100%,1,3,0 fi - snapshot3d. {0,1.1*min(w,h)},1.2,64,64,64 autocrop. -. 64 r. {0,max(w,$w-w)},{0,max(h,$h-h)},1,3,0,0,0.5,0.5 +. 64 + snapshot3d. {0,1.1*min(w,h)},1.2,64,64,64 + autocrop. -. 64 r. {0,max(w,$w-w)},{0,max(h,$h-h)},1,3,0,0,0.5,0.5 +. 64 to. "RGB CLUT",2,0,13,1,0.75 a {`$w>$h?_'x':_'y'`} fi @@ -28358,22 +35680,23 @@ #@gui : Action = choice("Decompose","Recompose") #@gui : Output Multiple Layers = _bool(0) #@gui : Include Opacity Layer = bool(1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/19/07.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/19/07.") fx_decompose_channels : - if {!$2} # Decompose + if !$2 # Decompose if $4 to_rgba else to_rgb fi repeat $! l[$<] nm={0,n} split_opacity _s3=A _s4=A _fx_decompose_channels$1[0] s[0] c - if {!$3} a x nm $nm + if !$3 a x nm $nm else nm=${-gui_layer_name} repeat $! gui_set_layer_name[$>] {``$nm}" ["${_s$>}"]" done fi endl done else # Recompose channels 0 nbc={3+($1==10)} nb={$nbc+$4} - if $3 repeat {int($!/$nb)} l[0-{$nb-1}] + if $3 repeat int($!/$nb) l[0-{$nb-1}] a[0-{$nbc-1}] c _fx_recompose_channels$1[0] a c endl mv. 0 done else repeat $! l[$>] @@ -28385,7 +35708,7 @@ repeat $! l[$<] _s3=A _s4=A fx_decompose_channels $1,$2,1,$4 - if {!$2} + if !$2 fs={round(min(w,h)*15%)} repeat $! to[$>] ${_s$>},5,3,$fs,{max(2,round($fs/15))} done to_rgba @@ -28402,7 +35725,7 @@ _fx_decompose_channels6 : rgb2xyz8 _s0=X _s1=Y _s2=Z _fx_decompose_channels7 : rgb2lab8 _s0=L _s1=a _s2=b _fx_decompose_channels8 : rgb2lch8 _s0=L _s1=c _s2=h -_fx_decompose_channels9 : rgb2cmy _s0=R _s1=G _s2=B +_fx_decompose_channels9 : rgb2cmy _s0=C _s1=M _s2=Y _fx_decompose_channels10 : rgb2cmyk _s0=C _s1=M _s2=Y _s3=K _fx_decompose_channels11 : rgb2yiq8 _s0=Y _s1=I _s2=Q @@ -28434,8 +35757,13 @@ #@gui : Radius = float(5,0,25) #@gui : sep = separator() #@gui : Output Mode = choice(1,"Probability Map","Opaque Skin","Transparent Skin") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/03/01.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/03/01.") fx_detect_skin : to_rgb m "_fx_detect_skin : @@ -28445,16 +35773,16 @@ repeat $! l[$>] if $9 # Opaque/transparent skin. +_fx_detect_skin a c - if {$9>1} sh 100% *. -1 +. 255 rm. fi + if $9>1 sh 100% *. -1 +. 255 rm. fi else _fx_detect_skin # Probability mask. fi endl done - uncommand _fx_detect_skin + um _fx_detect_skin fx_detect_skin_preview : gui_split_preview "fx_detect_skin $*",${-3--1} to_rgba - if {!$1} + if !$1 circle $6%,$7%,$8%,0.3,0,255,0,255 circle $6%,$7%,$8%,1,0xFFFFFFFF,0,255,0,255 line {$6-0.25*$8}%,{$7-0.25*$8}%,{$6+0.25*$8}%,{$7+0.25*$8}%,1,255,255,0,255 @@ -28482,7 +35810,8 @@ #@gui : Saturation Correction = float(0,-0.99,0.99) #@gui : Value Correction = float(0,-0.99,0.99) #@gui : sep = separator() -#@gui : note = note("Author: Jérome Ferrari. Latest Update: 01/14/2011.") +#@gui : note = note("Author: Jérome Ferrari. +#@gui :       Latest Update: 01/14/2011.") #@gui : url = link("Filter explained here","http://www.flickr.com/groups/gmic/discuss/72157625798533482") fx_hsv_equalizer : repeat $! l[$>] @@ -28498,14 +35827,14 @@ +*[3] $4 +*[4] $9 +*[5] $14 +[-1,-2,-3] +[-1,0] %[0] 360 # Saturation : - if {$5>=0} +*[3] -$5 else +*[3] {1/(1+$5)-1} fi +. 1 - if {$10>=0} +*[4] -$10 else +*[4] {1/(1+$10)-1} fi +. 1 - if {$15>=0} +*[5] -$15 else +*[5] {1/(1+$15)-1} fi +. 1 + if $5>=0 +*[3] -$5 else +*[3] {1/(1+$5)-1} fi +. 1 + if $10>=0 +*[4] -$10 else +*[4] {1/(1+$10)-1} fi +. 1 + if $15>=0 +*[5] -$15 else +*[5] {1/(1+$15)-1} fi +. 1 *[-1,-2,-3] ^[1,-1] # Value : - if {$6>=0} +*[3] -$6 else +*[3] {1/(1+$6)-1} fi +. 1 - if {$11>=0} +*[4] -$11 else +*[4] {1/(1+$11)-1} fi +. 1 - if {$16>=0} +*[5] -$16 else +*[5] {1/(1+$16)-1} fi +. 1 + if $6>=0 +*[3] -$6 else +*[3] {1/(1+$6)-1} fi +. 1 + if $11>=0 +*[4] -$11 else +*[4] {1/(1+$11)-1} fi +. 1 + if $16>=0 +*[5] -$16 else +*[5] {1/(1+$16)-1} fi +. 1 *[-1,-2,-3] ^[2,-1] #reconstruction rm[3,4,5] a[0,1,2] c hsv2rgb @@ -28513,7 +35842,7 @@ fx_hsv_equalizer_preview : l. - if {$1==0} fx_hsv_equalizer $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16 + if $1==0 fx_hsv_equalizer $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16 else to_rgb rgb2hsv s c (0,359) r. ..,{{0,h}/10},1,1,3 . f. 1 #create lower band @@ -28532,44 +35861,59 @@ #@gui : Color Blending = float(0,0,64) #@gui : sep = separator() #@gui : Preview Mapping = choice("None","Grey","Color") -#@gui : sep = separator(), note = note("Black:") +#@gui : sep = separator() +#@gui : note = note("Black:") #@gui : Hue Offset = float(0,-180,180) #@gui : Saturation Offset = float(0,-1,1) #@gui : Value Offset = float(0,-1,1) -#@gui : sep = separator(), note = note("Near black:") +#@gui : sep = separator() +#@gui : note = note("Near black:") #@gui : Hue Offset = float(0,-180,180) #@gui : Saturation Offset = float(0,-1,1) #@gui : Value Offset = float(0,-1,1) -#@gui : sep = separator(), note = note("Dark grey:") +#@gui : sep = separator() +#@gui : note = note("Dark grey:") #@gui : Hue Offset = float(0,-180,180) #@gui : Saturation Offset = float(0,-1,1) #@gui : Value Offset = float(0,-1,1) -#@gui : sep = separator(), note = note("Mi-dark grey:") +#@gui : sep = separator() +#@gui : note = note("Mi-dark grey:") #@gui : Hue Offset = float(0,-180,180) #@gui : Saturation Offset = float(0,-1,1) #@gui : Value Offset = float(0,-1,1) -#@gui : sep = separator(), note = note("Middle grey:") +#@gui : sep = separator() +#@gui : note = note("Middle grey:") #@gui : Hue Offset = float(0,-180,180) #@gui : Saturation Offset = float(0,-1,1) #@gui : Value Offset = float(0,-1,1) -#@gui : sep = separator(), note = note("Mid-light grey:") +#@gui : sep = separator() +#@gui : note = note("Mid-light grey:") #@gui : Hue Offset = float(0,-180,180) #@gui : Saturation Offset = float(0,-1,1) #@gui : Value Offset = float(0,-1,1) -#@gui : sep = separator(), note = note("Light grey:") +#@gui : sep = separator() +#@gui : note = note("Light grey:") #@gui : Hue Offset = float(0,-180,180) #@gui : Saturation Offset = float(0,-1,1) #@gui : Value Offset = float(0,-1,1) -#@gui : sep = separator(), note = note("Highlights:") +#@gui : sep = separator() +#@gui : note = note("Highlights:") #@gui : Hue Offset = float(0,-180,180) #@gui : Saturation Offset = float(0,-1,1) #@gui : Value Offset = float(0,-1,1) -#@gui : sep = separator(), note = note("White:") +#@gui : sep = separator() +#@gui : note = note("White:") #@gui : Hue Offset = float(0,-180,180) #@gui : Saturation Offset = float(0,-1,1) #@gui : Value Offset = float(0,-1,1) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Authors: David Tschumperlé and David Revoy. Latest Update: 2018/01/19.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Authors: David Tschumperlé and David Revoy. +#@gui :       Latest Update: 2018/01/19.") fx_equalize_hsv : cs=${"arg 1+$1,hsi,hsl,hsv"} repeat $! l[$>] split_opacity l[0] @@ -28628,8 +35972,13 @@ #@gui : sep = separator() #@gui : Tones Range = choice("All tones","Shadows","Mid-Tones","Highlights") #@gui : Tones Smoothness = float(2,0,10) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/20/06.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/20/06.") fx_mix_cmyk : repeat $! l. split_opacity rv to_rgb. fx_start_mix $13,$14 @@ -28640,7 +35989,7 @@ *. $10 +. $11 b. $12% a[-4--1] c cmyk2rgb. fx_end_mix $13 - if {$!!=3} rv a c fi endl mv. 0 done + if $!!=3 rv a c fi endl mv. 0 done fx_mix_cmyk_preview : gui_split_preview "fx_mix_cmyk $*",${-3--1} @@ -28660,8 +36009,13 @@ #@gui : sep = separator() #@gui : Tones Range = choice("All Tones","Shadows","Mid-Tones","Highlights") #@gui : Tones Smoothness = float(2,0,10) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/20/06.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/20/06.") fx_mix_hsv : repeat $! l. split_opacity rv to_rgb. fx_start_mix $10,$11 @@ -28671,7 +36025,7 @@ *. $7 +. $8 b. $9% %... 360 +[-2,-1] 0.5 c[-2,-1] 0,1 a[-3--1] c hsv2rgb. fx_end_mix $10 - if {$!!=3} rv a c fi endl mv. 0 done + if $!!=3 rv a c fi endl mv. 0 done fx_mix_hsv_preview : gui_split_preview "fx_mix_hsv $*",${-3--1} @@ -28691,8 +36045,13 @@ #@gui : sep = separator() #@gui : Tones Range = choice("All Tones","Shadows","Mid-Tones","Highlights") #@gui : Tones Smoothness = float(2,0,10) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/20/06.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/20/06.") fx_mix_lab : repeat $! l[$>] split_opacity to_rgb[0] gui_parallel_overlap[0] "_fx_mix_lab $*",0,{3*max($3,$6,$9)} @@ -28715,47 +36074,79 @@ #@gui : Primary Factor = float(0,-1.5,1.5) #@gui : Primary Shift = float(0,-255,255) #@gui : Primary Twist = float(0,-180,180) +#@gui : Primary Gamma = float(0,-100,100) #@gui : sep = separator() #@gui : Secondary Factor = float(0,-1.5,1.5) #@gui : Secondary Shift = float(0,-255,255) #@gui : Secondary Twist = float(0,-180,180) +#@gui : Secondary Gamma = float(0,-100,100) #@gui : sep = separator() #@gui : Tertiary Factor = float(0,-1.5,1.5) #@gui : Tertiary Shift = float(0,-255,255) #@gui : Tertiary Twist = float(0,-180,180) +#@gui : Tertiary Gamma = float(0,-100,100) #@gui : sep = separator() #@gui : Display Color Axes = bool(1) #@gui : Stats = value(-1,-1,-1,-1) #@gui : Avg Covariance = value(0,0,0,0,0,0,0,0,0,0,0,0) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2018/07/18.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2018/07/18.") fx_mix_pca : repeat $! l[$>] split_opacity l[0] to_rgb # Get image covariance (and remember it to speed up multiple calls of the filter). - if {[${11-14}]==round(stats()[0,4],0.1)} _avg=${15-17} C=${18-26} status= + if [${14-17}]==round(stats()[0,4],0.1) _avg=${18-20} C=${21-29} status= else +rr2d 256,256,0,2 C=${"covariance_colors. _avg"} rm. - __status="{$1}{$2}{$3}{$4}{$5}{$6}{$7}{$8}{$9}{$10}{"{round(stats()[0,4],0.1)}"}{"$_avg,$C"}{$27}{${28,29}}" - fi + __status="{$1}{$2}{$3}{$4}"\ + "{$5}{$6}{$7}{$8}"\ + "{$9}{$10}{$11}{$12}"\ + "${13}"\ + "{"{round(stats()[0,4],0.1)}"}"\ + "{"$_avg,$C"}"\ + "{$30}{${31,32}}" + fi + + # Find value ranges for gamma correction. + if "$4 || $8 || $12" +l + f "begin(avg = ["$_avg"]; eig = eig(["$C"]); Pt = eig[3,9]); Pt*(I-avg)" + s c repeat $! vmax$>={$>,1.1*max(abs(im),abs(iM))} done + rm + endl else vmax0,vmax1,vmax2=1 fi + # Modify image values. f "begin( + transpose(A,nA) = transp(A,nA); # For I(#0,round(I(#2)*(w#0-1)/255))+=[R,G,B,1]; I" + l[0] + s c,-3 +max. 1 /[-3,-1] ==. 0 inpaint_pde.. .,75%,1 distance. 0 *. {-1/(1+$5)} exp. + f.. "f = i(#-1); f*I + (1-f)*[x,y,z]*255/(w-1)" rm. + S={arg(1+$2,16,25,36,49,64,81,100,121,144,169,225,256)} if $S!=w r. $S,$S,$S,3,3 fi + endl + if $1==2 # Output as a file + is_png={str=lowercase(['"$4"']);find(str,'.png')==size(str)-4} + is_cube={str=lowercase(['"$4"']);find(str,'.cube')==size(str)-5} + if !$is_png" && "!$is_cube $!is_ciube error "Filename extension must be '.cube' or '.png'." fi + if $is_png r[0] {0,r=round(whd^0.5);[r,r]},1,3,-1 o[0] "$3/$4" + else + if {0,w>32} r3dx[0] 32 fi + output_cube[0] "$3/$4" + fi + rm[0] + else + r[0] {0,r=round(whd^0.5);[r,r]},1,3,-1 + if !$1 rm[1] fi # Replace Layer with CLUT + nm[0] "name(CLUT to '"$nm"')" + fi + if $_output_mode k[0] fi + endl done fx_clut_from_ab_preview : - if {$!<2} gui_warning_preview "At least two input layers are needed to run this filter." return fi - fx_clut_from_ab 0,$2 + if $!<2 gui_warning_preview "At least two input layers are needed to run this filter." return fi + _is_preview,_output_mode=1 fx_clut_from_ab 0,4,0,0,$5 + repeat $! l[$>] + r {a=round(cbrt(wh));[a,a,a]},3,-1 + +r3dx. 24 _fx_clut_from_ab_preview. + S={arg(1+$2,16,25,36,49,64,81,100,121,144,169,225,256)} if $S!=w#0 r[0] $S,$S,$S,3,3 fi + r[0] {0,r=round(whd^0.5);[r,r]},1,3,-1 + rr2d[0] $_preview_width,$_preview_height,2,1 r2dx. 70% + sh. 100% b. 1% n. 0,255 rm. + blend alpha + endl done -#@gui Retinex : fx_retinex, fx_retinex_preview(0)+ -#@gui : Strength (%) = float(75,0,100) -#@gui : Value Offset = float(16,1,256) -#@gui : Colorspace = choice(1,"HSI","HSV","Lab","Linear RGB","RGB","YCbCr") -#@gui : Min Cut (%) = float(1,0,100) + file_attr={$1==2?2:1} + u "{$1}{$2}{$3}_"$file_attr"{$4}_"$file_attr"{$5}" + +# Render 3D visualization of a CLUT. +_fx_clut_from_ab_preview : + repeat $! l[$>] + fact={256/w} + + # Color data, as a point cloud. + pointcloud3d +3d 0.5,0.5,0.5 *3d $fact circles3d {1.25*$fact} o3d {0.004*$fact} + + # Add cube edges. + colorcube3d[] + l. s3d l.. s y,6 repeat $! sh[$>] 4,100%,0,0 /. 1.25 rm. done endl a y endl # Darken colors of edges + p3d. 1 + l. repeat 8 o={a=$>;0.5*[a&1,(a>>1)&1,(a>>2)&1]} ++3d[0] $o +-3d[0] $o done +3d endl # Increase thickness of edges + + # Add 3D axes, without the 'O'. + axes3d 64,64,64,24,R,G,B,0 + +3d + + # Render 3D snapshot. + pose3d 1.2451,0.120715,-0.893986,-58.3864,-0.572953,1.28275,-0.62477,-11.6557,\ + 0.696784,0.839071,1.08374,-333.008,0,0,217,1 + snapshot3d {max(512,0$_preview_width,0$_preview_height)},1.22,255,255,255 + autocrop frame 10,10,255 + to_rgba flood 0,0,0,20,1,1,255,255,255,0 + endl done + +#@gui Retinex : fx_retinex, fx_retinex_preview(0)+ +#@gui : Strength (%) = float(75,0,100) +#@gui : Value Offset = float(16,1,256) +#@gui : Colorspace = choice(1,"HSI","HSV","Lab","Linear RGB","RGB","YCbCr") +#@gui : Min Cut (%) = float(1,0,100) #@gui : Max Cut (%) = float(1,0,100) #@gui : Regularization = float(5,0,32) #@gui : sep = separator() #@gui : Low Scale = float(15,1,512) #@gui : Middle Scale = float(80,1,512) #@gui : High Scale = float(250,1,512) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Note: This filter implements the Multiscale Color Retinex algorithm, as described in:") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Note: This filter implements the Multiscale Color Retinex algorithm, +#@gui : as described in:") #@gui : url = link{"http://www.ipol.im/pub/art/2014/107/"} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/13/09.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/13/09.") fx_retinex : repeat $! l[$>] +retinex $2,${"arg 1+$3,hsi,hsv,lab,lrgb,rgb,ycbcr"},$4,$5,${7--1} @@ -28922,8 +36396,13 @@ #@gui : Iterations = int(20,1,64) #@gui : Colors = int(6,2,32) #@gui : Grain = float(40,1,100) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/25/10.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/25/10.") fx_retrofade : repeat $! l[$>] split_opacity l[0] +f 0 @@ -28940,26 +36419,32 @@ gui_split_preview "fx_retrofade $*",${-3--1} #@gui Select-Replace Color : fx_select_color, fx_select_color_preview(0) -#@gui : Similarity Space = choice(0,"RGB[A]","RGB","YCbCr","Red","Green","Blue","Opacity","Luminance","Blue & Red Chrominances","Hue","Saturation") +#@gui : Similarity Space = choice(0,"RGB[A]","RGB","YCbCr","Red","Green","Blue","Opacity","Luminance", +#@gui : "Blue & Red Chrominances","Hue","Saturation") #@gui : Tolerance = float(20,0,100) #@gui : Smoothness = float(0,0,10) #@gui : Fill Holes = int(0,0,256) #@gui : Selected Color = color(255,255,255,255) #@gui : Output As = choice(0,"Selected Colors","Selected Mask","Rejected Colors","Rejected Mask","Replaced Color") #@gui : Replacement Color = color(255,0,0,255) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") _fx_select_color : - if {$1==1} to_rgb # RGB - elif {$1==2} to_rgb rgb2ycbcr # YCbCr - elif {$1==3} channels 0 # R - elif {$1==4} channels 1 # G - elif {$1==5} channels 2 # B - elif {$1==6} to_rgba channels 3 # Opacity - elif {$1==7} to_rgb rgb2ycbcr channels 0 # Luminance - elif {$1==8} to_rgb rgb2ycbcr channels 1,2 # B&R chrominances - elif {$1==9} to_rgb rgb2hsv channels 0 # Hue - elif {$1==10} to_rgb rgb2hsv channels 1 # Saturation + if $1==1 to_rgb # RGB + elif $1==2 to_rgb rgb2ycbcr # YCbCr + elif $1==3 channels 0 # R + elif $1==4 channels 1 # G + elif $1==5 channels 2 # B + elif $1==6 to_rgba channels 3 # Opacity + elif $1==7 to_rgb rgb2ycbcr channels 0 # Luminance + elif $1==8 to_rgb rgb2ycbcr channels 1,2 # B&R chrominances + elif $1==9 to_rgb rgb2hsv channels 0 # Hue + elif $1==10 to_rgb rgb2hsv channels 1 # Saturation fi fx_select_color : @@ -28969,10 +36454,10 @@ select_color[1] $2%,$color if $4 +area. 0,0 <=. {round($4^1.5)} inpaint.. .,0,3 rm. fi # Fill holes. b[1] $3 n[1] 0,255 - if {$9==0} sh[0] 100% &. [1] # Selected colors. - elif {$9==1} rm[0] # Selected mask. - elif {$9==2} -[1] 255 *[1] -1 sh[0] 100% &. [1] # Rejected colors. - elif {$9==3} rm[0] - 255 * -1 # Rejected mask. + if $9==0 sh[0] 100% &. [1] # Selected colors. + elif $9==1 rm[0] # Selected mask. + elif $9==2 -[1] 255 *[1] -1 sh[0] 100% &. [1] # Rejected colors. + elif $9==3 rm[0] - 255 * -1 # Rejected mask. else # Replaced color. /[1] 255 +*[0,1] +*[1] $11 +*[1] $12 +*[1] $13 *[1] $10 a[1,-3--1] c -[1,2] + fi @@ -28988,8 +36473,13 @@ #@gui : Strength = float(3,0,10) #@gui : Regularization = int(0,0,20) #@gui : Maximum Saturation = choice("From Input","From Reference Color","Maximum Value") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/15/07.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/15/07.") fx_selective_desaturation : repeat $! l[$>] to_color split_opacity l[0] +fc $1,$2,$3 @@ -29000,8 +36490,8 @@ c[1] 0,1 rgb2hsl[0] s[0] c mM={[im,iM]} repeat $6 guided. [2],1,0.1 done n. $mM # Regularization step. - if {$7==0} *[1,-1] - elif {$7==1} ($1^$2^$3) rgb2hsl. *[1] {i[1]} rm[-2,-1] + if $7==0 *[1,-1] + elif $7==1 ($1^$2^$3) rgb2hsl. *[1] {i[1]} rm[-2,-1] else rv[1,-1] rm. fi a c hsl2rgb @@ -29014,74 +36504,429 @@ #@gui : Brightness (%) = float(0,-100,100) #@gui : Contrast (%) = float(0,-100,100) #@gui : Gamma (%) = float(0,-100,100) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_sepia : sepia adjust_colors ${1-3},0,0,0,255 fx_sepia_preview : gui_split_preview "fx_sepia $*",${-3--1} -#@gui Transfer Colors [Variationnal] : fx_transfer_rgb, fx_transfer_rgb_preview(1)+ +#@gui Simulate Film : fx_simulate_film, fx_simulate_film_preview(1)+ +#@gui : Category = choice{"Black & White (25)","Instant [Consumer] (54)","Instant [Pro] (68)","Fuji XTrans III (15)", +#@gui : "Negative [Color] (13)","Negative [New] (39)","Negative [Old] (44)","Print Films (12)","Slide [Color] (26)"} + +##### Black & White +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Agfa APX 100","Agfa APX 25","Fuji Neopan 1600","Fuji Neopan Acros 100","Ilford Delta 100", +#@gui : "Ilford Delta 3200","Ilford Delta 400","Ilford FP4 Plus 125","Ilford HP5 Plus 400","Ilford HPS 800", +#@gui : "Ilford Pan F Plus 50","Ilford XP2","Kodak BW 400 CN","Kodak HIE (HS Infra)","Kodak T-Max 100", +#@gui : "Kodak T-Max 3200","Kodak T-Max 400","Kodak Tri-X 400","Polaroid 664","Polaroid 667","Polaroid 672", +#@gui : "Rollei IR 400","Rollei Ortho 25","Rollei Retro 100 Tonal","Rollei Retro 80s"}_2 + +##### Instant [Consumer] +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Polaroid PX-100UV+ Cold --","Polaroid PX-100UV+ Cold -","Polaroid PX-100UV+ Cold", +#@gui : "Polaroid PX-100UV+ Cold +","Polaroid PX-100UV+ Cold ++","Polaroid PX-100UV+ Cold +++", +#@gui : "Polaroid PX-100UV+ Warm --","Polaroid PX-100UV+ Warm -","Polaroid PX-100UV+ Warm", +#@gui : "Polaroid PX-100UV+ Warm +","Polaroid PX-100UV+ Warm ++","Polaroid PX-100UV+ Warm +++", +#@gui : "Polaroid PX-680 --","Polaroid PX-680 -","Polaroid PX-680","Polaroid PX-680 +","Polaroid PX-680 ++", +#@gui : "Polaroid PX-680 Cold --","Polaroid PX-680 Cold -","Polaroid PX-680 Cold","Polaroid PX-680 Cold +", +#@gui : "Polaroid PX-680 Cold ++","Polaroid PX-680 Cold ++a","Polaroid PX-680 Warm --","Polaroid PX-680 Warm -", +#@gui : "Polaroid PX-680 Warm","Polaroid PX-680 Warm +","Polaroid PX-680 Warm ++","Polaroid PX-70 --", +#@gui : "Polaroid PX-70 -","Polaroid PX-70","Polaroid PX-70 +","Polaroid PX-70 ++","Polaroid PX-70 +++", +#@gui : "Polaroid PX-70 Cold --","Polaroid PX-70 Cold -","Polaroid PX-70 Cold","Polaroid PX-70 Cold +", +#@gui : "Polaroid PX-70 Cold ++","Polaroid PX-70 Warm --","Polaroid PX-70 Warm -","Polaroid PX-70 Warm", +#@gui : "Polaroid PX-70 Warm +","Polaroid PX-70 Warm ++","Polaroid Time Zero (Expired) ---", +#@gui : "Polaroid Time Zero (Expired) --","Polaroid Time Zero (Expired) -","Polaroid Time Zero (Expired)", +#@gui : "Polaroid Time Zero (Expired) +","Polaroid Time Zero (Expired) ++","Polaroid Time Zero (Expired) Cold ---", +#@gui : "Polaroid Time Zero (Expired) Cold --","Polaroid Time Zero (Expired) Cold -", +#@gui : "Polaroid Time Zero (Expired) Cold"}_0 + +##### Instant [Pro] +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Fuji FP-100c --","Fuji FP-100c -","Fuji FP-100c","Fuji FP-100c (alt)","Fuji FP-100c +","Fuji FP-100c ++", +#@gui : "Fuji FP-100c ++a","Fuji FP-100c +++", +#@gui : "Fuji FP-100c Cool --","Fuji FP-100c Cool -","Fuji FP-100c Cool","Fuji FP-100c Cool +","Fuji FP-100c Cool ++", +#@gui : "Fuji FP-100c Negative --","Fuji FP-100c Negative -","Fuji FP-100c Negative","Fuji FP-100c Negative +", +#@gui : "Fuji FP-100c Negative ++","Fuji FP-100c Negative ++a","Fuji FP-100c Negative +++", +#@gui : "Fuji FP-3000b --","Fuji FP-3000b -","Fuji FP-3000b","Fuji FP-3000b +","Fuji FP-3000b ++","Fuji FP-3000b +++", +#@gui : "Fuji FP-3000b HC","Fuji FP-3000b Negative --","Fuji FP-3000b Negative -","Fuji FP-3000b Negative", +#@gui : "Fuji FP-3000b Negative +","Fuji FP-3000b Negative ++","Fuji FP-3000b Negative +++", +#@gui : "Fuji FP-3000b Negative Early","Polaroid 665 --","Polaroid 665 -","Polaroid 665","Polaroid 665 +", +#@gui : "Polaroid 665 ++","Polaroid 665 Negative -","Polaroid 665 Negative","Polaroid 665 Negative +", +#@gui : "Polaroid 665 Negative HC","Polaroid 669 --","Polaroid 669 -","Polaroid 669","Polaroid 669 +", +#@gui : "Polaroid 669 ++","Polaroid 669 +++","Polaroid 669 Cold --","Polaroid 669 Cold -","Polaroid 669 Cold", +#@gui : "Polaroid 669 Cold +","Polaroid 690 --","Polaroid 690 -","Polaroid 690","Polaroid 690 +","Polaroid 690 ++", +#@gui : "Polaroid 690 Cold --","Polaroid 690 Cold -","Polaroid 690 Cold","Polaroid 690 Cold +","Polaroid 690 Cold ++", +#@gui : "Polaroid 690 Warm --","Polaroid 690 Warm -","Polaroid 690 Warm","Polaroid 690 Warm +","Polaroid 690 Warm ++"}_0 + +#### Fuji XTrans III +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Acros","Acros+G","Acros+R","Acros+Ye","Astia","Classic Chrome","Mono","Mono+G","Mono+R","Mono+Ye", +#@gui : "Pro Neg Hi","Pro Neg Std","Provia","Sepia","Velvia"}_0 + +##### Negative [Color] +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Agfa Ultra Color 100","Agfa Vista 200","Fuji Superia 200","Fuji Superia HG 1600","Fuji Superia Reala 100", +#@gui : "Fuji Superia X-Tra 800","Kodak Ektar 100","Kodak Elite 100 XPRO","Kodak Elite Color 200", +#@gui : "Kodak Elite Color 400","Kodak Portra 160 NC","Kodak Portra 160 VC","Lomography Redscale 100"}_0 + +##### Negative [New] +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Fuji 160C -","Fuji 160C","Fuji 160C +","Fuji 160C ++", +#@gui : "Fuji 400H -","Fuji 400H","Fuji 400H +","Fuji 400H ++", +#@gui : "Fuji 800Z -","Fuji 800Z","Fuji 800Z +","Fuji 800Z ++", +#@gui : "Fuji Ilford HP5 -","Fuji Ilford HP5","Fuji Ilford HP5 +","Fuji Ilford HP5 ++", +#@gui : "Kodak Portra 160 -","Kodak Portra 160","Kodak Portra 160 +","Kodak Portra 160 ++", +#@gui : "Kodak Portra 400 -","Kodak Portra 400","Kodak Portra 400 +","Kodak Portra 400 ++", +#@gui : "Kodak Portra 800 -","Kodak Portra 800","Kodak Portra 800 +","Kodak Portra 800 ++","Kodak Portra 800 HC", +#@gui : "Kodak T-MAX 3200 -","Kodak T-MAX 3200","Kodak T-MAX 3200 +","Kodak T-MAX 3200 ++","Kodak T-MAX 3200 (alt)", +#@gui : "Kodak TRI-X 400 -","Kodak TRI-X 400","Kodak TRI-X 400 +","Kodak TRI-X 400 ++","Kodak TRI-X 400 (alt)"}_0 + +##### Negative [Old] +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Fuji Ilford Delta 3200 -","Fuji Ilford Delta 3200","Fuji Ilford Delta 3200 +","Fuji Ilford Delta 3200 ++", +#@gui : "Fuji Neopan 1600 -","Fuji Neopan 1600","Fuji Neopan 1600 +","Fuji Neopan 1600 ++", +#@gui : "Fuji Superia 100 -","Fuji Superia 100","Fuji Superia 100 +","Fuji Superia 100 ++", +#@gui : "Fuji Superia 400 -","Fuji Superia 400","Fuji Superia 400 +","Fuji Superia 400 ++", +#@gui : "Fuji Superia 800 -","Fuji Superia 800","Fuji Superia 800 +","Fuji Superia 800 ++", +#@gui : "Fuji Superia 1600 -","Fuji Superia 1600","Fuji Superia 1600 +","Fuji Superia 1600 ++", +#@gui : "Kodak Portra 160 NC -","Kodak Portra 160 NC","Kodak Portra 160 NC +","Kodak Portra 160 NC ++", +#@gui : "Kodak Portra 160 VC -","Kodak Portra 160 VC","Kodak Portra 160 VC +","Kodak Portra 160 VC ++", +#@gui : "Kodak Portra 400 NC -","Kodak Portra 400 NC","Kodak Portra 400 NC +","Kodak Portra 400 NC ++", +#@gui : "Kodak Portra 400 UC -","Kodak Portra 400 UC","Kodak Portra 400 UC +","Kodak Portra 400 UC ++", +#@gui : "Kodak Portra 400 VC -","Kodak Portra 400 VC","Kodak Portra 400 VC +","Kodak Portra 400 VC ++"}_0 + +##### Print Films +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Fuji 3510 (Constlclip)","Fuji 3510 (Constlmap)","Fuji 3510 (Cuspclip)", +#@gui : "Fuji 3513 (Constlclip)","Fuji 3513 (Constlmap)","Fuji 3513 (Cuspclip)", +#@gui : "Kodak 2383 (Constlclip)","Kodak 2383 (Constlmap)","Kodak 2383 (Cuspclip)", +#@gui : "Kodak 2393 (Constlclip)","Kodak 2393 (Constlmap)","Kodak 2393 (Cuspclip)"}_0 + +#### Slide [Color] +#@gui : Preset = choice{1,"All [Collage]","None", +#@gui : "Agfa Precisa 100","Fuji Astia 100F","Fuji FP 100C","Fuji Provia 100F","Fuji Provia 400F","Fuji Provia 400X", +#@gui : "Fuji Sensia 100","Fuji Superia 200 XPRO","Fuji Velvia 50","Generic Fuji Astia 100","Generic Fuji Provia 100", +#@gui : "Generic Fuji Velvia 100","Generic Kodachrome 64","Generic Kodak Ektachrome 100 VS", +#@gui : "Kodak E-100 GX Ektachrome 100","Kodak Ektachrome 100 VS","Kodak Elite Chrome 200","Kodak Elite Chrome 400", +#@gui : "Kodak Elite ExtraColor 100","Kodak Kodachrome 200","Kodak Kodachrome 25","Kodak Kodachrome 64", +#@gui : "Lomography X-Pro Slide 200", +#@gui : "Polaroid 669","Polaroid 690","Polaroid Polachrome"}_0 + +#@gui : Thumbnail Size = int(512,0,1024)_1 +#@gui : sep = separator() +#@gui : Strength (%) = float(100,0,100) +#@gui : Brightness (%) = float(0,-100,100) +#@gui : Contrast (%) = float(0,-100,100) +#@gui : Gamma (%) = float(0,-100,100) +#@gui : Hue (%) = float(0,-100,100) +#@gui : Saturation (%) = float(0,-100,100) +#@gui : Normalize Colors = choice("None","Pre-Normalize","Post-Normalize","Both") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Note: The color LUTs proposed in this filter come from +#@gui : various free sources :") +#@gui : note = note{"* +#@gui : RawTherapee Film Simulation."} +#@gui : note = note{"* +#@gui : Pat David Film Emulation. +#@gui : "} +#@gui : note = note{"* +#@gui : Fuji Film Simulation Profiles."} +#@gui : note = note{"* +#@gui : Print Film LUTs For Download. +#@gui : "} +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2019/02/27.") +fx_simulate_film : + category=${arg\ 1+$1,bw,instant_consumer,instant_pro,fujixtransiii,negative_color,negative_new,negative_old,\ + print,colorslide} + presets=${-_fx_cluts_$category} + index={arg(1+$1,${2-10})} + thumbsize,strength,brightness,contrast,gamma,hue,saturation,normalize=${11-18} + if $normalize==1" || "$normalize==3 # Pre-normalization + repeat $! l[$>] split_opacity balance_gamma[0] , a c endl done + fi + if $index>=2 # Apply CLUT + path_clut=${-path_cache} + name=${arg\ 1+$index-2,$presets} + clut $name,{0$_is_preview" && "!isfile(['{/${path_clut}clut_$name.cimgz}'])?17:48} + repeat $!-1 if $strength<100 +map_clut[$>] . j[$>] .,0,0,0,0,{$strength%} rm. else map_clut[$>] . fi done + rm. + adjust_colors $brightness,$contrast,$gamma,$hue,$saturation,0,255 + if $normalize==2" || "$normalize==3 repeat $! l[$>] split_opacity n[0] 0,255 a c endl done fi # Post-normalization + + elif $index==1 # "None" + adjust_colors $brightness,$contrast,$gamma,$hue,$saturation,0,255 + if $normalize==2" || "$normalize==3 repeat $! l[$>] split_opacity n[0] 0,255 a c endl done fi # Post-normalization + + else # Collage + repeat $! l[$>] if max(w,h)>$thumbsize rr2d $thumbsize,$thumbsize,0,2 fi endl done + N=$! +to "Original",1%,1%,7.5%,2,0.5 + Np={narg($presets)} repeat $Np + clut_name=${arg\ 1+$>,$presets} + clut $clut_name mv. $N + repeat $N + if $strength<100 [$>] +map_clut. [$N] j.. .,0,0,0,0,{$strength%} rm. else +map_clut[$>] [$N] fi + adjust_colors. $brightness,$contrast,$gamma,$hue,$saturation,0,255 + if $normalize==2" || "$normalize==3 l. split_opacity n[0] 0,255 a c endl fi # Post-normalization + strcapitalize $clut_name clut_name=${} + to. $clut_name,1%,1%,7.5%,2,0.5 + done + rm[$N] + progress {$>*100/($Np-1)} + done + k[$N--1] frame 1,1,0,0,0,255 - 128 append_tiles {s=floor(sqrt($!));w>h?[s,0]:[0,s]} + 128 + fi + +fx_simulate_film_preview : + _is_preview=1 + index={arg(1+$1,${2-10})} + if !$index gui_warning_preview "Preview disabled in 'Collage' mode" + else gui_split_preview "fx_simulate_film $*",${19-21} + fi + u "{$1}{$2}_"{2*($1==0)}\ + "{$3}_"{2*($1==1)}\ + "{$4}_"{2*($1==2)}\ + "{$5}_"{2*($1==3)}\ + "{$6}_"{2*($1==4)}\ + "{$7}_"{2*($1==5)}\ + "{$8}_"{2*($1==6)}\ + "{$9}_"{2*($1==7)}\ + "{$10}_"{2*($1==8)}\ + "{$11}_"{1+!$index}\ + "{$12}{$13}{$14}{$15}{$16}{$17}{$18}{$19}{$20,$21}" + +_fx_cluts_bw : + u agfa_apx_100,agfa_apx_25,fuji_neopan_1600,fuji_neopan_acros_100,ilford_delta_100,ilford_delta_3200,\ + ilford_delta_400,ilford_fp_4_plus_125,\ + ilford_hp_5_plus_400,ilford_hps_800,ilford_pan_f_plus_50,ilford_xp_2,kodak_bw_400_cn,kodak_hie_hs_infra,\ + kodak_t-max_100,kodak_t-max_3200,\ + kodak_t-max_400,kodak_tri-x_400,polaroid_664,polaroid_667,polaroid_672,rollei_ir_400,rollei_ortho_25,\ + rollei_retro_100_tonal,rollei_retro_80s + +_fx_cluts_instant_consumer : + u polaroid_px-100uv+_cold_--,polaroid_px-100uv+_cold_-,polaroid_px-100uv+_cold,polaroid_px-100uv+_cold_+,\ + polaroid_px-100uv+_cold_++,polaroid_px-100uv+_cold_+++,\ + polaroid_px-100uv+_warm_--,polaroid_px-100uv+_warm_-,polaroid_px-100uv+_warm,polaroid_px-100uv+_warm_+,\ + polaroid_px-100uv+_warm_++,polaroid_px-100uv+_warm_+++,\ + polaroid_px-680_--,polaroid_px-680_-,polaroid_px-680,polaroid_px-680_+,polaroid_px-680_++,\ + polaroid_px-680_cold_--,polaroid_px-680_cold_-,polaroid_px-680_cold,polaroid_px-680_cold_+,\ + polaroid_px-680_cold_++,polaroid_px-680_cold_++_alt,\ + polaroid_px-680_warm_--,polaroid_px-680_warm_-,polaroid_px-680_warm,polaroid_px-680_warm_+,polaroid_px-680_warm_++,\ + polaroid_px-70_--,polaroid_px-70_-,polaroid_px-70,polaroid_px-70_+,polaroid_px-70_++,polaroid_px-70_+++,\ + polaroid_px-70_cold_--,polaroid_px-70_cold_-,polaroid_px-70_cold,polaroid_px-70_cold_+,polaroid_px-70_cold_++,\ + polaroid_px-70_warm_--,polaroid_px-70_warm_-,polaroid_px-70_warm,polaroid_px-70_warm_+,polaroid_px-70_warm_++,\ + polaroid_time_zero_expired_---,polaroid_time_zero_expired_--,polaroid_time_zero_expired_-,\ + polaroid_time_zero_expired,polaroid_time_zero_expired_+,polaroid_time_zero_expired_++,\ + polaroid_time_zero_expired_cold_---,polaroid_time_zero_expired_cold_--,polaroid_time_zero_expired_cold_-,\ + polaroid_time_zero_expired_cold + +_fx_cluts_instant_pro : + u fuji_fp-100c_--,fuji_fp-100c_-,fuji_fp-100c,fuji_fp-100c_alt,fuji_fp-100c_+,fuji_fp-100c_++,fuji_fp-100c_++_alt,\ + fuji_fp-100c_+++,\ + fuji_fp-100c_cool_--,fuji_fp-100c_cool_-,fuji_fp-100c_cool,fuji_fp-100c_cool_+,fuji_fp-100c_cool_++,\ + fuji_fp-100c_negative_--,fuji_fp-100c_negative_-,fuji_fp-100c_negative,fuji_fp-100c_negative_+,\ + fuji_fp-100c_negative_++,fuji_fp-100c_negative_++_alt,fuji_fp-100c_negative_+++,\ + fuji_fp-3000b_--,fuji_fp-3000b_-,fuji_fp-3000b,fuji_fp-3000b_+,fuji_fp-3000b_++,fuji_fp-3000b_+++,fuji_fp-3000b_hc,\ + fuji_fp-3000b_negative_--,fuji_fp-3000b_negative_-,fuji_fp-3000b_negative,fuji_fp-3000b_negative_+,\ + fuji_fp-3000b_negative_++,fuji_fp-3000b_negative_+++,fuji_fp-3000b_negative_early,\ + polaroid_665_--,polaroid_665_-,polaroid_665,polaroid_665_+,polaroid_665_++,\ + polaroid_665_negative_-,polaroid_665_negative,polaroid_665_negative_+,polaroid_665_negative_hc,\ + polaroid_669_--,polaroid_669_-,polaroid_669,polaroid_669_+,polaroid_669_++,polaroid_669_+++,\ + polaroid_669_cold_--,polaroid_669_cold_-,polaroid_669_cold,polaroid_669_cold_+,\ + polaroid_690_--,polaroid_690_-,polaroid_690,polaroid_690_+,polaroid_690_++,\ + polaroid_690_cold_--,polaroid_690_cold_-,polaroid_690_cold,polaroid_690_cold_+,polaroid_690_cold_++,\ + polaroid_690_warm_--,polaroid_690_warm_-,polaroid_690_warm,polaroid_690_warm_+,polaroid_690_warm_++ + +_fx_cluts_fujixtransiii : + u fuji_xtrans_iii_acros,fuji_xtrans_iii_acros+g,fuji_xtrans_iii_acros+r,fuji_xtrans_iii_acros+ye,\ + fuji_xtrans_iii_astia,\ + fuji_xtrans_iii_classic_chrome,fuji_xtrans_iii_mono,fuji_xtrans_iii_mono+g,fuji_xtrans_iii_mono+r,\ + fuji_xtrans_iii_mono+ye,\ + fuji_xtrans_iii_pro_neg_hi,fuji_xtrans_iii_pro_neg_std,fuji_xtrans_iii_provia,fuji_xtrans_iii_sepia,\ + fuji_xtrans_iii_velvia + +_fx_cluts_negative_color : + u agfa_ultra_color_100,agfa_vista_200,fuji_superia_200,fuji_superia_hg_1600,fuji_superia_reala_100,\ + fuji_superia_x-tra_800,kodak_ektar_100,\ + kodak_elite_100_xpro,kodak_elite_color_200,kodak_elite_color_400,kodak_portra_160_nc,kodak_portra_160_vc,\ + lomography_redscale_100 + +_fx_cluts_negative_new : + u fuji_160c_-,fuji_160c,fuji_160c_+,fuji_160c_++,\ + fuji_400h_-,fuji_400h,fuji_400h_+,fuji_400h_++,\ + fuji_800z_-,fuji_800z,fuji_800z_+,fuji_800z_++,\ + ilford_hp_5_-,ilford_hp_5,ilford_hp_5_+,ilford_hp_5_++,\ + kodak_portra_160_-,kodak_portra_160,kodak_portra_160_+,kodak_portra_160_++,\ + kodak_portra_400_-,kodak_portra_400,kodak_portra_400_+,kodak_portra_400_++,\ + kodak_portra_800_-,kodak_portra_800,kodak_portra_800_+,kodak_portra_800_++,kodak_portra_800_hc,\ + kodak_tmax_3200_-,kodak_tmax_3200,kodak_tmax_3200_+,kodak_tmax_3200_++,kodak_tmax_3200_alt,\ + kodak_tri-x_400_-,kodak_tri-x_400,kodak_tri-x_400_+,kodak_tri-x_400_++,kodak_tri-x_400_alt + +_fx_cluts_negative_old : + u ilford_delta_3200_-,ilford_delta_3200,ilford_delta_3200_+,ilford_delta_3200_++,\ + fuji_neopan_1600_-,fuji_neopan_1600,fuji_neopan_1600_+,fuji_neopan_1600_++,\ + fuji_superia_100_-,fuji_superia_100,fuji_superia_100_+,fuji_superia_100_++,\ + fuji_superia_400_-,fuji_superia_400,fuji_superia_400_+,fuji_superia_400_++,\ + fuji_superia_800_-,fuji_superia_800,fuji_superia_800_+,fuji_superia_800_++,\ + fuji_superia_1600_-,fuji_superia_1600,fuji_superia_1600_+,fuji_superia_1600_++,\ + kodak_portra_160_nc_-,kodak_portra_160_nc,kodak_portra_160_nc_+,kodak_portra_160_nc_++,\ + kodak_portra_160_vc_-,kodak_portra_160_vc,kodak_portra_160_vc_+,kodak_portra_160_vc_++,\ + kodak_portra_400_nc_-,kodak_portra_400_nc,kodak_portra_400_nc_+,kodak_portra_400_nc_++,\ + kodak_portra_400_uc_-,kodak_portra_400_uc,kodak_portra_400_uc_+,kodak_portra_400_uc_++,\ + kodak_portra_400_vc_-,kodak_portra_400_vc,kodak_portra_400_vc_+,kodak_portra_400_vc_++ + +_fx_cluts_print : + u fuji_3510_constlclip,fuji_3510_constlmap,fuji_3510_cuspclip,\ + fuji_3513_constlclip,fuji_3513_constlmap,fuji_3513_cuspclip,\ + kodak_2383_constlclip,kodak_2383_constlmap,kodak_2383_cuspclip,\ + kodak_2393_constlclip,kodak_2393_constlmap,kodak_2393_cuspclip + +_fx_cluts_colorslide : + u agfa_precisa_100,fuji_astia_100f,fuji_fp_100c,fuji_provia_100f,fuji_provia_400f,fuji_provia_400x,fuji_sensia_100,\ + fuji_superia_200_xpro,fuji_velvia_50,fuji_astia_100_generic,fuji_provia_100_generic,fuji_velvia_100_generic,\ + kodak_kodachrome_64_generic,kodak_ektachrome_100_vs_generic,kodak_e-100_gx_ektachrome_100,kodak_ektachrome_100_vs,\ + kodak_elite_chrome_200,\ + kodak_elite_chrome_400,kodak_elite_extracolor_100,kodak_kodachrome_200,kodak_kodachrome_25,kodak_kodachrome_64,\ + lomography_x-pro_slide_200,\ + polaroid_669,polaroid_690,polaroid_polachrome + +#@gui Transfer Colors [Variational] : fx_transfer_rgb, fx_transfer_rgb_preview(1)+ : * #@gui : Regularization = int(8,0,32) #@gui : Preserve Luminance = float(0.2,0,1) #@gui : Precision = _choice(1,"Low","Normal","High","Very High") #@gui : Reference Colors = choice("Bottom Layer","Top Layer") #@gui : Add User-Defined Constraints (Interactive) = _bool(0) #@gui : sep = separator() -#@gui : Preview Reference = choice(1,"None","Up-Left","Up-Right","Bottom-Left","Bottom-Right") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note{"Instructions:\n +#@gui : Preview_ref_point = point(1,1,0,0,255,255,255,128,4)_0 +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note{"Instructions:\n #@gui : - This filter transfers the colors of one layer to all the others.\n -#@gui : - This is a highly experimental filter, it may be unstable or particularly long to render.\n #@gui : - Don't forget to set the Input layers... option on the left to manage your input layers.\n #@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/04/04.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/04/04.") fx_transfer_rgb : to_rgb - ref={if($4,0,-1)} + ref={$4?0:-1} transfer_rgb[^$ref] [$ref],0.25,$1,$2,{2^(4+$3)},$5,0 + c 0,255 fx_transfer_rgb_preview : - if {$!<2} gui_print_preview "Warning:",,"This filter requires at least two input layers to work properly." return fi - ref={if($4,0,-1)} - pf=${-path_tmp}gmic_tmp o[$ref] $pf - gui_split_preview[^$ref] "i "$pf" fx_transfer_rgb $1,$2,0,0,0 rm.",${-3--1} - if $4 mv[0] $! fi - if $6 repeat {$!-1} l[$>,-1] - +r2dy. {0,h/3} to. Reference,2,2,13,1,1,255 frame. 2,2,255 frame. 1,1,0 - if {$6==1} j[0] .,5,5 - elif {$6==2} j[0] .,{{0,w}-w-6},6 - elif {$6==3} j[0] .,5,{{0,h}-h-6} - else j[0] .,{{0,w}-w-6},{{0,h}-h-6} - fi + if $!<2 gui_print_preview "Warning:",,"This filter requires at least two input layers to work properly." return fi + ref={$4?0:-1} + +store[$ref] _fx_trgb_ref + gui_split_preview[^$ref] "$_fx_trgb_ref fx_transfer_rgb $1,$2,0,0,0 rm.",${-3--1} + _fx_trgb_ref= + + mv[$ref] $! + repeat $!-1 l[$>,-1] + rr2d[0] $_preview_width,$_preview_height,0,3 rr2d. {0,[w,h]/3},0,3 + to. Reference,2,2,13,1,1,255 frame. 2,2,255 frame. 1,1,0 + j[0] .,$6%,$7% rm. - endl done fi + endl done -#@gui Transfer Colors [Histogram] : fx_transfer_histogram, fx_transfer_histogram_preview(1)+ -#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note{"Note: -#@gui : The bottom layer contains the reference colors.\n -#@gui : This filter needs at least two layers to work properly. Set the Input layers option to handle multiple input layers. +#@gui Transfer Colors [Histogram] : fx_transfer_histogram, fx_transfer_histogram_preview(1)+ : * +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : Reference Colors = choice("Bottom Layer","Top Layer") +#@gui : sep = separator() +#@gui : Preview_ref_point = point(1,1,0,0,255,255,255,128,4)_0 +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note{"Note: +#@gui : This filter needs at least two layers to work properly. Set the Input layers option to handle +#@gui : multiple input layers. #@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2018/11/26.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2020/01/13.") fx_transfer_histogram : - to_colormode 0 - repeat {$!-1} l[$>,-1] - nm0={0,n} nm1={1,n} - m "_split : s z r.. "{[w#0,h#0,1,s#0,0]}" r. "{[w#1,h#1,1,s#1,0]} - a z - ac "_split transfer_histogram.. . a z",$1 - _split uncommand _split - nm[0] $nm0 nm[1] $nm1 - endl done + to_rgb + ref={$2?0:-1} + transfer_histogram[^$ref] [$ref],256,$1 + c 0,255 fx_transfer_histogram_preview : - to_colormode 0 - repeat {$!-1} l[$>,-1] - i[0] [0] fx_transfer_histogram[-2,-1] $1 rm. - a z gui_split_preview "s z k.",${-3--1} + if $!<2 gui_print_preview "Warning:",,"This filter requires at least two input layers to work properly." return fi + ref={$2?0:-1} + +store[$ref] _fx_trgb_ref + gui_split_preview[^$ref] "$_fx_trgb_ref fx_transfer_histogram $1,0 rm.",${-3--1} + _fx_trgb_ref= + + mv[$ref] $! + repeat $!-1 l[$>,-1] + rr2d[0] $_preview_width,$_preview_height,0,3 rr2d. {0,[w,h]/3},0,3 + to. Reference,2,2,13,1,1,255 frame. 2,2,255 frame. 1,1,0 + j[0] .,$3%,$4% + rm. + endl done + +#@gui Transfer Colors [PCA] : fx_transfer_pca, fx_transfer_pca_preview(1)+ : * +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : Reference Colors = choice("Bottom Layer","Top Layer") +#@gui : sep = separator() +#@gui : Preview_ref_point = point(1,1,0,0,255,255,255,128,4)_0 +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note{"Note: +#@gui : This filter needs at least two layers to work properly. Set the Input layers option to handle +#@gui : multiple input layers. +#@gui : "} +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2020/01/13.") +fx_transfer_pca : + to_rgb + ref={$2?0:-1} + transfer_pca[^$ref] [$ref],$1 + c 0,255 + +fx_transfer_pca_preview : + if $!<2 gui_print_preview "Warning:",,"This filter requires at least two input layers to work properly." return fi + ref={$2?0:-1} + +store[$ref] _fx_trgb_ref + gui_split_preview[^$ref] "$_fx_trgb_ref fx_transfer_pca $1,0 rm.",${-3--1} + _fx_trgb_ref= + + mv[$ref] $! + repeat $!-1 l[$>,-1] + rr2d[0] $_preview_width,$_preview_height,0,3 rr2d. {0,[w,h]/3},0,3 + to. Reference,2,2,13,1,1,255 frame. 2,2,255 frame. 1,1,0 + j[0] .,$3%,$4% + rm. endl done #@gui User-Defined : fx_custom_transform, fx_custom_transform @@ -29092,14 +36937,15 @@ #@gui : Blue = text{"i"} #@gui : Alpha = text{"i"} #@gui : Value Normalization = choice("None","RGB","RGBA") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_custom_transform : to_rgba repeat $! f. "$1" s. c a[-4--2] c f.. "$2" s.. c f[-4] "$3" f... "$4" f.. "$5" f. "$6" - if {$7==0} a[-4--1] c c. 0,255 - elif {$7==1} a[-4--2] c n.. 0,255 c. 0,255 a[-2,-1] c + if $7==0 a[-4--1] c c. 0,255 + elif $7==1 a[-4--2] c n.. 0,255 c. 0,255 a[-2,-1] c else a[-4--1] c n. 0,255 fi mv. 0 done @@ -29109,22 +36955,41 @@ #------------------------ #@gui Convolve : fx_convolve, fx_convolve_preview(0) -#@gui : Kernel = choice("Custom","Average 3x3","Average 5x5","Average 7x7","Average 9x9","Prewitt-X","Prewitt-Y","Sobel-X","Sobel-Y","Rotinv-X","Rotinv-Y","Laplacian","Robert Cross 1","Robert Cross 2","Impulses 5x5","Impulses 7x7","Impulses 9x9") +#@gui : Kernel = choice("Custom","Average 3x3","Average 5x5","Average 7x7","Average 9x9","Prewitt-X","Prewitt-Y", +#@gui : "Sobel-X","Sobel-Y","Rotinv-X","Rotinv-Y","Laplacian","Robert Cross 1","Robert Cross 2","Impulses 5x5", +#@gui : "Impulses 7x7","Impulses 9x9") #@gui : Boundary = choice(1,"Dirichlet","Neumann") -#@gui : sep = separator(), note = note("Note: If parameter Kernel is set to Custom, it uses the custom convolution kernel defined below. Use commas and semicolons as separators for res. matrix columns and rows.") +#@gui : sep = separator() +#@gui : note = note("Note: If parameter Kernel is set to Custom, it uses the custom +#@gui : convolution kernel defined below. Use commas and semicolons as separators for res. matrix columns and rows. +#@gui : ") #@gui : Custom Kernel = text("0,1,0;1,-4,1;0,1,0") -#@gui : sep = separator(), note = note("Note: Kernel multiplier is useful only when parameter Value range is set to Cut.") +#@gui : sep = separator() +#@gui : note = note("Note: Kernel multiplier is useful only when parameter Value range is set +#@gui : to Cut.") #@gui : Value Range = choice(1,"Cut","Normalize") #@gui : Kernel Multiplier = float(1,0,50) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/06/06.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/06/06.") fx_convolve : skip "${3=1}" ac "_fx_convolve $1,$2,\"$3\",${4--5}",$-4 _fx_convolve : if $1 _fx_convolve$1[] else ($3) fi - if {!$4} *. $5 fi + if !$4 *. $5 fi convolve[0--2] .,$2 if $4 n 0,255 else c 0,255 fi rm. @@ -29155,8 +37020,13 @@ #@gui : Max Threshold = float(100,0,100) #@gui : Absolute Value = bool(0) #@gui : Negative Colors = bool(0) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_curvature : repeat $! l[$>] split_opacity l[0] b $1 iee @@ -29175,8 +37045,13 @@ #@gui : Threshold = float(0,0,49) #@gui : Negative Colors = bool(0) #@gui : Monochrome = bool(1) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_dog : dog $1%,$2% if $5 norm fi @@ -29192,13 +37067,18 @@ #@gui : Metric = choice(2,"Chebyshev","Manhattan","Euclidean","Squared-Euclidean") #@gui : Normalization = choice(2,"Cut","Normalize","Modulo") #@gui : Modulo Value = int(32,1,255) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/07/04.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/07/04.") fx_distance : repeat $! l[$>] split_opacity l[0] distance $1,$2 - if {$3==0} c 0,255 - elif {$3==1} n 0,255 + if $3==0 c 0,255 + elif $3==1 n 0,255 else % $4 n 0,255 fi endl a c endl done @@ -29210,8 +37090,13 @@ #@gui : Smoothness = float(0,0,10) #@gui : Threshold = float(15,0,50) #@gui : Negative Colors = bool(0) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_edges : to_rgb b $1% edges $2% if $3 negate fi @@ -29226,13 +37111,18 @@ #@gui : Scale = int(4,0,32) #@gui : Thickness = int(1,0,16) #@gui : Negative Colors = bool(0) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_edge_offsets : repeat $! os={s} b. $1% gradient_norm. >=. $2% skeleton. 0 distance. 1 round. 1 %. $3 >=. {max(1,$3-$4)} - if {!$5} negate. fi + if !$5 negate. fi n. 0,255 to_colormode. $os mv. 0 done @@ -29242,23 +37132,27 @@ #@gui Extract Foreground [Interactive] : fx_extract_foreground, gui_no_preview #@gui : Feathering = _float(0,0,4) #@gui : Dilation = int(0,-32,32) -#@gui : Output Mode = choice{3,"RGBA Image (Full-Transparency / 1 Layer)","RGBA Image (Updatable / 1 Layer)","RGB Image + Binary Mask (2 Layers)","RGBA Foreground + Background (2 Layers)"} +#@gui : Output Mode = choice{3,"RGBA Image (Full-Transparency / 1 Layer)","RGBA Image (Updatable / 1 Layer)", +#@gui : "RGB Image + Binary Mask (2 Layers)","RGBA Foreground + Background (2 Layers)"} #@gui : View Resolution = _choice{1,"Small (Faster)","Medium","High (Slower)","Very High (Even Slower)"} #@gui : sep = separator() #@gui : note = note{"Description:\n #@gui : This filter allows to quickly extract foreground objects from background in opaque RGB images. -#@gui : Click on the Apply or OK buttons below to open the interactive window and start adding foreground and background control points. -#@gui : When you're done, exit the interactive window: your extracted foreground will be transferred back to the host software.\n\n -#@gui : If you are not satisfied with the result, click on Apply once again to modify your control points defined previously. -#@gui : To remove all control points, click on the Reset button above. +#@gui : Click on the Apply or OK buttons below to open the interactive window and start adding +#@gui : foreground and background control points. When you're done, exit the interactive window: your extracted +#@gui : foreground will be transferred back to the host software.\n\n +#@gui : If you are not satisfied with the result, click on Apply once again to modify your control points +#@gui : defined previously. To remove all control points, click on the Reset button above. #@gui : "} #@gui : Last Image Size = value(0,0) #@gui : Control Points = value(-1) #@gui : sep = separator() #@gui : note = note{"Interactions:\n #@gui : Use the following actions in the interactive window to build your extraction mask :\n\n -#@gui : - Left mouse button or key F create a new foreground control point (or move an existing one).\n -#@gui : - Right mouse button or key B create a new background control point (or move an existing one).\n +#@gui : - Left mouse button or key F create a new foreground control point +#@gui : (or move an existing one).\n +#@gui : - Right mouse button or key B create a new background control point +#@gui : (or move an existing one).\n #@gui : - Mouse wheel, or keys CTRL+arrows UP/DOWN zoom view in/out.\n #@gui : - Key SPACE updates the extraction mask.\n #@gui : - Key TAB toggles background view modes.\n @@ -29271,20 +37165,21 @@ #@gui : - Keys CTRL+R reset window size.\n #@gui : - Keys ESC, Q or ENTER exit the interactive window. #@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/29/09.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/29/09.") fx_extract_foreground : - if {!$!} return fi + if !$! return fi resolution={arg(1+$3,512,1024,2048,0)} repeat $! l[$<] nm=${-gui_layer_name} nm "[G"{`39`}"MIC] Interactive Foreground Extraction" - if {$7==-1||$5!=w||$6!=h} _gui_control_points= else _gui_control_points=${7--1} fi + if $7==-1" || "$5!=w" || "$6!=h _gui_control_points= else _gui_control_points=${7--1} fi status=${x_segment\ $resolution} - sh 3 b. $1% if {$2>0} dilate. {1+2*$2} elif {$2<0} erode. {1-2*$2} fi + sh 3 b. $1% if $2>0 dilate. {1+2*$2} elif $2<0 erode. {1-2*$2} fi rm. - if {$3==1} sh 3 max. 1 rm. - elif {$3==2} s c,-3 r. 100%,100%,1,4 rv nm[0] name(Mask) nm[1] name($nm) - elif {$3==3} + if $3==1 sh 3 max. 1 rm. + elif $3==2 s c,-3 r. 100%,100%,1,4 rv nm[0] name(Mask) nm[1] name($nm) + elif $3==3 . sh.. 0,2 +channels... 3,3 >=. 3 *[-2,-1] rm. sh. 0,2 +channels.. 3,3 <=. {255-3} *[-2,-1] rm. @@ -29295,7 +37190,7 @@ nm[1] name($nm" [background]"),pos($pos1) fi endl done - if {narg($status)>=4} u \{$1\}\{$2\}\{$3\}\{$4\}\{{w},{h}\}\{$status\} else u "" fi + if narg($status)>=4 u \{$1\}\{$2\}\{$3\}\{$4\}\{{w},{h}\}\{$status\} else u "" fi #@gui Gradient Norm : fx_gradient_norm, fx_gradient_norm_preview(0) #@gui : Smoothness = float(0,0,10) @@ -29303,8 +37198,13 @@ #@gui : Min Threshold = float(0,0,100) #@gui : Max Threshold = float(100,0,100) #@gui : Negative Colors = bool(0) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_gradient_norm : b $1 gradient_norm ^ $2 c $3%,$4% @@ -29320,8 +37220,13 @@ #@gui : Max Threshold = float(100,0,100) #@gui : Orientation Only = bool(0) #@gui : Negative Colors = bool(0) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_gradient2rgb : b $1 gradient2rgb $4 c $2%,$3% @@ -29335,8 +37240,13 @@ #@gui : Levels = int(8,1,256) #@gui : Smoothness = float(0,0,5) #@gui : Filling = choice(1,"Transparent","Colors") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_isophotes : if $3 topographic_map $1,$2 @@ -29353,8 +37263,13 @@ #@gui : Max Threshold = float(100,0,100) #@gui : Absolute Value = bool(0) #@gui : Negative Colors = bool(0) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_laplacian : b $1 laplacian if $4 abs fi @@ -29370,9 +37285,21 @@ #@gui : Min Threshold = float(0,0,100) #@gui : Max Threshold = float(100,0,100) #@gui : Negative Colors = bool(0) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") _fx_local_orientation : repeat $! l[$>] split_opacity l[0] b $1% gradient_orientation 2 complex2polar rm[0--1:2] @@ -29387,75 +37314,101 @@ fx_local_orientation_preview : gui_split_preview "fx_local_orientation ${^0}",${-3--1} -#@gui Morphological Filter : fx_morpho_v2, fx_morpho_v2_preview(0) -#@gui : Action = choice{"Erosion","Dilation","Opening","Closing","Original - Erosion","Dilation - Original","Original - Opening","Closing - Original","Original - (Opening + Closing)/2","Closing - Opening"} +#@gui Morphological Filter : fx_morphological, fx_morphological_preview(0) +#@gui : Action = choice{"Erosion","Dilation","Opening","Closing","Original - Erosion","Dilation - Original", +#@gui : "Original - Opening","Closing - Original","Original - (Opening + Closing)/2","Closing - Opening"} #@gui : Kernel = choice(0,"Square","Octagonal","Circular","Custom") #@gui : Size = int(5,2,60) #@gui : note = note("Parameter Size is inactive for Custom kernel.") #@gui : Custom Kernel = text("1,0,1; 0,1,0; 1,0,1") #@gui : Negative = bool() #@gui : Process Transparency = bool(0) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") #@gui : Value Action = choice("None","Cut","Stretch") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/22/06.") -fx_morpho_v2 : - ac "_fx_morpho_v2 ${1-3},\"$4\",${5-6}",$7,$8 - -fx_morpho_v2_preview : - gui_split_preview "fx_morpho_v2 ${1-3},\"$4\",${5--1}",${-3--1} - if {$2==3} - ({'"$4"'}) f. "(i>=_'0' && i<=_'9') || i==_',' || i==_';'?i:-1" discard. -1 ({t}) rr2d. {0,max(24,w/6)},{0,max(24,h/6)},0,1 >. 0 *. 255 +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/22/06.") +fx_morphological : + ac "_fx_morphological ${1-3},\"$4\",${5-6}",$7,$8 + +fx_morphological_preview : + gui_split_preview "fx_morphological ${1-3},\"$4\",${5--1}",${-3--1} + if $2==3 + ('"$4"') f. "(i>=_'0' && i<=_'9') || i==_',' || i==_';'?i:-1" + discard. -1 ({t}) rr2d. {0,max(24,w/6)},{0,max(24,h/6)},0,1 >. 0 *. 255 to_rgba. frame. 1,1,0,0,0,0,255 frame. 1,1,255 frame. 1,1,0,0,0,0,255 j[^-1] .,2,2,0,0,0.75 rm. else fi -_fx_morpho_v2 : - ({'"$4"'}) f. "(i>=_'0' && i<=_'9') || i==_',' || i==_';'?i:-1" discard. -1 ckernel={t} rm. - if {$2==0} m "my_erode: erode $""1" m "my_dilate: dilate $""1" - elif {$2==1} m "my_erode: erode_oct $""1" m "my_dilate: dilate_oct $""1" - elif {$2==2} m "my_erode: erode_circ $""1" m "my_dilate: dilate_circ $""1" +_fx_morphological : + ('"$4"') f. "(i>=_'0' && i<=_'9') || i==_',' || i==_';'?i:-1" discard. -1 ckernel={t} rm. + if $2==0 m "my_erode: erode $""1" m "my_dilate: dilate $""1" + elif $2==1 m "my_erode: erode_oct $""1" m "my_dilate: dilate_oct $""1" + elif $2==2 m "my_erode: erode_circ $""1" m "my_dilate: dilate_circ $""1" else m "my_erode : ("$ckernel") erode[^-1] . rm." m "my_dilate : ("$ckernel") dilate[^-1] . rm." fi # Erosion - if {$1==0} m "my_action : my_erode $3" + if $1==0 m "my_action : my_erode $3" # Dilation - elif {$1==1} m "my_action : my_dilate $3" + elif $1==1 m "my_action : my_dilate $3" # Opening - elif {$1==2} m "my_action : my_erode $3 my_dilate $3" + elif $1==2 m "my_action : my_erode $3 my_dilate $3" # Closing - elif {$1==3} m "my_action : my_dilate $3 my_erode $3" + elif $1==3 m "my_action : my_dilate $3 my_erode $3" # Original - Erosion - elif {$1==4} m "my_action : +my_erode $3 -" + elif $1==4 m "my_action : +my_erode $3 -" # Dilation - Original - elif {$1==5} m "my_action : +my_dilate $3 rv -" + elif $1==5 m "my_action : +my_dilate $3 rv -" # Original - Opening - elif {$1==6} m "my_action : +my_erode $3 my_dilate. $3 -" + elif $1==6 m "my_action : +my_erode $3 my_dilate. $3 -" # Closing - Original - elif {$1==7} m "my_action : +my_dilate $3 my_erode. $3 rv -" + elif $1==7 m "my_action : +my_dilate $3 my_erode. $3 rv -" # Original - (Opening + Closing)/2 - elif {$1==8} m "my_action : +my_erode $3 my_dilate. $3 +my_dilate.. $3 my_erode. $3 +[-2,-1] /. 2 -" + elif $1==8 m "my_action : +my_erode $3 my_dilate. $3 +my_dilate.. $3 my_erode. $3 +[-2,-1] /. 2 -" # Closing - Opening else m "my_action : +my_erode $3 my_dilate. $3 my_dilate.. $3 my_erode.. $3 -" fi repeat $! l[$>] - if {!$6} split_opacity fi + if !$6 split_opacity fi my_action[0] a c endl done if $5 repeat $! l[$>] split_opacity negate[0] a c endl done fi - uncommand my_erode,my_dilate,my_action + um my_erode,my_dilate,my_action #@gui Segmentation : fx_segment_watershed, fx_segment_watershed_preview(0) #@gui : Edge Threshold = float(2,0,15) #@gui : Smoothness = float(1,0,5) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") #@gui : Value Action = choice("None","Cut","Normalize") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_segment_watershed : skip ${4=1} ac "b $2 segment_watershed $1",$3,$4 @@ -29465,8 +37418,13 @@ #@gui Skeleton : fx_skeleton, fx_skeleton_preview(1) #@gui : Method = choice{"Distance (Fast)","Thinning (Slow)"} #@gui : Smoothness = float(0,0,10) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/07/04.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/07/04.") fx_skeleton : remove_opacity b $2% >= 50% @@ -29487,8 +37445,13 @@ #@gui : Colors = choice(1,"Random","Average") #@gui : Border Opacity = float(1,0,1) #@gui : Border Color = color(0,0,0,255) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2017/11/16.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2017/11/16.") fx_superpixels : repeat $! l[$>] +srgb2lab slic. ${1-3} @@ -29505,11 +37468,16 @@ #@gui : Smoothness = float(0,0,10) #@gui : Threshold = float(15,0,50) #@gui : Negative Colors = bool(0) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_thin_edges : b $1% gradient_norm >= $2% thinning 1 - if {!$3} negate fi + if !$3 negate fi n 0,255 fx_thin_edges_preview : @@ -29525,9 +37493,10 @@ #@gui : Relative Warping = bool(1) #@gui : Interpolation = choice(1,"Nearest Neighbor","Linear") #@gui : Boundary = choice(3,"Transparent","Nearest","Periodic","Mirror") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_custom_deformation : - if {!$5} to_a fi + if !$5 to_a fi repeat $! +norm. . f.. "$1" f. "$2" a[-2,-1] c warp.. .,$3,$4,$5,1 rm. @@ -29542,12 +37511,13 @@ #@gui : Interpolation = choice(1,"Nearest Neighbor","Linear") #@gui : Boundary = choice(3,"Transparent","Nearest","Periodic","Mirror") #@gui : Preview Reference Circle = bool(1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/08/01.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/08/01.") fx_circle_transform : repeat $! l[$>] to_rgba r={dx=($3-$1)*(w-1)%;dy=($4-$2)*(h-1)%;norm(dx,dy)} - if {$7==0} cond="i(X,Y,z,c,$8,$9)" - elif {$7==1} cond="if(N<"$r",i(X,Y,z,c,$8,$9),i)" + if $7==0 cond="i(X,Y,z,c,$8,$9)" + elif $7==1 cond="if(N<"$r",i(X,Y,z,c,$8,$9),i)" else cond="if(N>"$r",i(X,Y,z,c,$8,$9),i)" fi f "U = x - w*$1%; @@ -29573,7 +37543,8 @@ fi #@gui Conformal Maps : fx_conformal_maps, fx_conformal_maps_preview(1) -#@gui : Mapping = choice{8,"Custom Formula","z","(z-1)/(z+1)","cos(z)","sin(z)","tan(z)","exp(z)","log(z)","Dipole: 1/(4*z^2-1)","Star: -5*(z^3/3-z/4)/2"} +#@gui : Mapping = choice{8,"Custom Formula","z","(z-1)/(z+1)","cos(z)","sin(z)","tan(z)","exp(z)","log(z)", +#@gui : "Dipole: 1/(4*z^2-1)","Star: -5*(z^3/3-z/4)/2"} #@gui : Exponent (Real) = float(1,-16,16) #@gui : Exponent (Imaginary) = float(0,-16,16) #@gui : Custom Formula = text{1,"((1.1 + i*z/6)/(1.04 - i*z/6))^6.2"} @@ -29589,7 +37560,8 @@ #@gui : Specify Different Output Size = _bool(0) #@gui : Output Width = _text("1024") #@gui : Output Height = _text("1024") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2017/15/02.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2017/15/02.") fx_conformal_maps : to_a expr0="$4" @@ -29603,7 +37575,7 @@ expr8="1/(4*z^2-1)" expr9="-5*(z^3/3-z/4)/2" - ({'${expr$1}'}) + ('${expr$1}') replace_str. "*","**" replace_str. "/","//" replace_str. "^","^^" @@ -29648,10 +37620,11 @@ #@gui : Amplitude = float(30,0,300) #@gui : Frequency (%) = float(10,0,100) #@gui : Boundary = choice(3,"Transparent","Nearest","Periodic","Mirror") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2018/01/22.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2018/01/22.") fx_crease : repeat $! l[$>] - if {!$3} to_a fi + if !$3 to_a fi 2,2,1,2,{"const w1 = w#-1-1; const h1 = h#-1 - 1; [ 0,w1,0,w1,0,0,h1,h1 ];"} r. {0,D=$2*[w,h]%;[max(D[0],1),max(D[1],1)]},1,2,3 noise. $1,1 r. ..,..,1,2,3 warp.. .,0,1,$3 rm. @@ -29663,9 +37636,10 @@ #@gui : Zoom = float(0,-4,4) #@gui : Center (%) = point(50,50,0,1) #@gui : Boundary = choice(0,"Transparent","Nearest","Periodic","Mirror") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2017/18/02.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2017/18/02.") fx_distort_lens : - if {!$6} to_a fi + if !$6 to_a fi undistort ${1-3},$4%,$5%,$6 #@gui Drop Water : fx_drop_water, fx_drop_water_preview(1) @@ -29675,14 +37649,17 @@ #@gui : Radius = float(2,0,5) #@gui : Variability = float(80,0,100) #@gui : Random Seed = int(0,0,16384) -#@gui : note = note("Parameters Density, Radius, Variability and Random seed are used only in Procedural shapes mode.") -#@gui : sep = separator(), note = note("Light parameters:") +#@gui : note = note("Parameters Density, Radius, Variability and Random seed +#@gui : are used only in Procedural shapes mode.") +#@gui : sep = separator() +#@gui : note = note("Light parameters:") #@gui : Refraction = float(3,0,20) #@gui : Light Angle = float(35,0,360) #@gui : Specular Size = float(10,0,100) #@gui : Specular Intensity = float(1,0,1) #@gui : Specular Centering = float(0.5,0,1) -#@gui : sep = separator(), note = note("Shadow parameters:") +#@gui : sep = separator() +#@gui : note = note("Shadow parameters:") #@gui : Shadow Size = float(0.25,0,3) #@gui : Shadow Intensity = float(0.5,0,1) #@gui : Shadow Smoothness = float(0.75,0,3) @@ -29690,10 +37667,11 @@ #@gui : sep = separator() #@gui : Smoothness = float(0.15,0,3) #@gui : Output as Separate Layers = _bool(1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/21/07.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/21/07.") fx_drop_water : N={$!-$1} - if {$N<=0} error "At least two layers are required in this mode." fi + if $N<=0 error "At least two layers are required in this mode." fi repeat $N l[{$!-$>-1}] nm0={n} nm=${-gui_layer_name} nm img @@ -29759,13 +37737,13 @@ nm[grad] name($nm" [gradient]"),mode(grainmerge) rv - if {!$16} gui_merge_layers nm $nm0 fi + if !$16 gui_merge_layers nm $nm0 fi endl done if $1 rm[0] fi fx_drop_water_preview : N={$!-$1} - if {$N<=0} gui_warning_preview "At least two layers are required in this mode." return fi + if $N<=0 gui_warning_preview "At least two layers are required in this mode." return fi if $1 repeat $N l[{$!-$>-1}] pass[0] 0 mv. 0 @@ -29780,7 +37758,8 @@ #@gui Equirectangular to Nadir-Zenith : fx_equirectangular2nadirzenith, fx_equirectangular2nadirzenith(1) #@gui : Mode = choice{"to Nadir / Zenith","to Equirectangular"} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/29/12.") fx_equirectangular2nadirzenith : if $1 nadirzenith2equirectangular else equirectangular2nadirzenith fi @@ -29789,16 +37768,18 @@ #@gui : Stretch Factor = float(1,0.1,10) #@gui : Boundary = choice(1,"Transparent","Nearest","Periodic","Mirror") #@gui : Inverse Transform = bool(0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_euclidean2polar : - if {!$4} to_a fi + if !$4 to_a fi if $5 polar2euclidean $1%,$2%,$3,$4 else euclidean2polar $1%,$2%,$3,$4 fi #@gui Fish-Eye : fisheye, fisheye(1) #@gui : Center (%) = point(50,50,0,1,255) #@gui : Radius = float(70,0,100) #@gui : Amplitude = float(1,0,2) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") #@gui Flower : fx_flower, fx_flower_preview(1) #@gui : Center (%) = point(50,50,0,1) @@ -29806,9 +37787,10 @@ #@gui : Petals = int(6,2,20) #@gui : Offset (%) = float(0,0,100) #@gui : Boundary = choice(3,"Transparent","Nearest","Periodic","Mirror") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_flower : - if {!$7} to_a fi + if !$7 to_a fi amplitude,angle={dx=$3-$1;dy=$4-$2;[norm(dx,dy),-atan2(dy,dx)*180/pi]} flower $amplitude,$5,$6%,$angle,$1%,$2%,$7 @@ -29822,9 +37804,10 @@ #@gui : Angular Tiles = int(10,1,72) #@gui : Smoothness = float(0.5,0,5) #@gui : Boundary = choice(3,"Transparent","Nearest","Periodic","Mirror") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_rotoidoscope : - if {!$5} to_a fi + if !$5 to_a fi rotoidoscope $1%,$2%,$3,$4%,$5 #@gui Kaleidoscope [Polar] : fx_kaleidoscope, fx_kaleidoscope(1) @@ -29834,9 +37817,10 @@ #@gui : Radius Cut = float(100,0,100) #@gui : Angle Cut = float(10,0,100) #@gui : Boundary = choice(3,"Transparent","Nearest","Periodic","Mirror") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_kaleidoscope : - if {!$7} to_a fi + if !$7 to_a fi shift $3%,$4%,0,0,2 kaleidoscope $1%,$2%,$5,$6,$7 #@gui Kaleidoscope [Symmetry] : fx_symmetrizoscope, fx_symmetrizoscope(1) @@ -29844,14 +37828,56 @@ #@gui : Angle = float(0,0,360) #@gui : Boundary = choice(3,"Transparent","Nearest","Periodic","Mirror") #@gui : Symmetry Sides = choice("Backward","Forward","Swap") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/07/01.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/07/01.") fx_symmetrizoscope : - if {!$3} to_a fi + if !$3 to_a fi repeat $1 ang={$2+180*$>/max(1,$1-1)} symmetrize 50%,50%,$ang,$3,0,{if($4!=2,$4,$>%2)} done +#@gui Morph [Interactive] : fx_morph_interactive, fx_morph_interactive_preview +#@gui : Number of Frames = int(16,3,1024) +#@gui : Preview Precision = choice{2,"Coarsest (faster)","Coarse","Normal","Fine","Finest (slower)"} +#@gui : Keypoints = value(-1) +#@gui : sep = separator() +#@gui : note = note{"Instructions:"} +#@gui : note = note{" +#@gui : Use mouse buttons to add/move/remove correspondence keypoints over the interactive window that will appear, +#@gui : in order to create the morphing.\n\n +#@gui : Source/target window:\n\n +#@gui : - Left mouse button: Add new keypoint on current image and move it on the other one.\n +#@gui : - Right mouse button: Add/move keypoint on current image.\n +#@gui : - Key DELETE or middle mouse button: Delete keypoint.\n +#@gui : - Key SPACE or mouse wheel: Toggle source/target.\n\n +#@gui : In-between window:\n\n +#@gui : - Mouse wheel: Change morphing time, from 0 to 1.\n +#@gui : - Left mouse button: Reset morphing time to 0.5.\n\n +#@gui : Both windows:\n\n +#@gui : - Key TAB: Change keypoint radius.\n +#@gui : - Key ENTER: Play/stop in-between animation.\n +#@gui : - Key R: Reset keypoints.\n +#@gui : - Key K: Show/hide keypoints.\n +#@gui : - Keys ESC or Q: Process fullres and exit. +#@gui : "} +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2019/04/16.") +fx_morph_interactive : + if $3!=-1 __x_morph_keypoints=${3--1} fi + rv + x_morph $1,$2 + repeat $! gui_set_layer_name[$>] "Morphing ""#"$> gui_set_layer_pos[$>] 0,0 done + rv + u "{$1}{$2}{"$__x_morph_keypoints"}" + +fx_morph_interactive_preview : + if $!<2 gui_warning_preview "This filter requires at least two input layers!" return fi + rr2d ${-max_wh},0,3 + n 0,255 + if $3!=-1 gui_warning_preview "No preview available\n\nKeypoints from previous\nrun have been saved" + else gui_warning_preview "No preview available" + fi + #@gui Perspective : fx_warp_perspective, fx_warp_perspective(1) #@gui : X-Angle = float(1.73,-4,4) #@gui : Y-Angle = float(0,-4,4) @@ -29860,9 +37886,10 @@ #@gui : X-Offset = float(0,0,100) #@gui : Y-Offset = float(0,0,100) #@gui : Boundary = choice(2,"Transparent","Nearest","Periodic","Mirror") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_warp_perspective : - if {!$8} to_a fi + if !$8 to_a fi shift $6%,$7%,0,0,2 warp_perspective $1,$2,$3,$4,$5,$8 #@gui Polar Transform : fx_transform_polar, fx_transform_polar(1) @@ -29871,12 +37898,13 @@ #@gui : Radius = text{"r + R/10*cos(a*5)"} #@gui : Angle = text{"a"} #@gui : Boundary = choice(3,"Transparent","Nearest","Periodic","Mirror") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_transform_polar : - if {!$6} to_a fi - if {$1==0} + if !$6 to_a fi + if $1==0 transform_polar "$4","$5",$2%,$3%,$6 - elif {$1==1} + elif $1==1 transform_polar R-r,a,$2%,$3%,$6 else transform_polar a*R/(2*pi),r*2*pi/R,$2%,$3%,$6 @@ -29890,24 +37918,25 @@ #@gui : Interpolation = choice(1,"Nearest Neighbor","Linear") #@gui : Boundary = choice(3,"Transparent","Nearest","Periodic","Mirror") #@gui : Preview Type = choice(1,"Input","Output","Both") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2017/10/11.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2017/10/11.") fx_quadrangle : at_quadrangle $1%,$2%,$3%,$4%,$5%,$6%,$7%,$8%,${9-10} fx_quadrangle_preview : repeat $! l[$>] - if {!$10} to_a fi + if !$10 to_a fi if $11 +fx_quadrangle $* rr2d. {0,[w,h]},2,3 fi polygon[{$11==1?1:0}] 4,$1%,$2%,$3%,$4%,$5%,$6%,$7%,$8%,0.25,255 - if {$11>=2} + if $11>=2 circle[0] $1%,$2%,4,1,0 circle[0] $1%,$2%,3,1,255,0,0 circle[0] $3%,$4%,4,1,0 circle[0] $3%,$4%,3,1,0,255,0 circle[0] $5%,$6%,4,1,0 circle[0] $5%,$6%,3,1,64,128,255 circle[0] $7%,$8%,4,1,0 circle[0] $7%,$8%,3,1,255,255,0 - elif {$11>0} + elif $11>0 rm[0] fi - if {$!==2} + if $!==2 drgba to[0] Quadrangle to[1] Result frame 1,1,0 +a x a[0,1] y rr2d ${-gui_preview_wh},0,3 k[{max(w#0,h#0)>max(w#1,h#1)?0:1}] @@ -29919,11 +37948,13 @@ #@gui : Density = float(0.1,0,1) #@gui : Wavelength = float(1,0,2) #@gui : Merging Steps = int(0,0,20) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2012/28/11.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2012/28/11.") #@gui Random : deform, deform(0) #@gui : Amplitude = float(10,0,100) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") #@gui Ripple : ripple, ripple(0) #@gui : Amplitude = float(10,0,100) @@ -29931,7 +37962,8 @@ #@gui : Shape = choice(2,"Bloc","Triangle","Sine","Sine+","Random") #@gui : Angle = float(0,0,360) #@gui : Offset = float(0,0,500) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/23/08.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/23/08.") #@gui Reflection : fx_reflect, fx_reflect(1) #@gui : Height = float(50,0,100) @@ -29943,7 +37975,8 @@ #@gui : Y-Angle = float(-3.30,-10,10) #@gui : Focale = float(7,0,10) #@gui : Zoom = float(1.5,1,5) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_reflect : repeat $! to_rgba. +rows. {100-$1}%,100% mirror. y water. $7,$8 @@ -29969,15 +38002,18 @@ #@gui : Antialiasing = bool(1) #@gui : sep = separator() #@gui : note = note{"Note: -#@gui : You can define a transparent top layer that will help the seam-carving algorithm to preserve or force removing image structures:\n +#@gui : You can define a transparent top layer that will help the seam-carving algorithm to preserve or force +#@gui : removing image structures:\n #@gui : \n - Draw areas in red to force removing them. #@gui : \n - Draw areas in green to preserve them. #@gui : \n - Don't forget also to set the Input layers... parameter to input both layers to the filter. #@gui : "} -#@gui : sep = separator(), note = note("Authors: Garagecoder and David Tschumperlé. Latest Update: 2014/02/06.") +#@gui : sep = separator() +#@gui : note = note("Authors: Garagecoder and David Tschumperlé. +#@gui :       Latest Update: 2014/02/06.") fx_seamcarve : if $4 - if {$!<2} error "Priority mask (top layer) is missing!" fi + if $!<2 error "Priority mask (top layer) is missing!" fi _fx_seamcarve fi seamcarve $1%,$2%,$4,$5,$3% @@ -29986,7 +38022,7 @@ fx_seamcarve_preview : if $4 - if {$!<2} to_rgb to "Priority mask (top layer) is missing!",5,5,18,2 return fi + if $!<2 to_rgb to "Priority mask (top layer) is missing!",5,5,18,2 return fi _fx_seamcarve fi repeat $! l[$>] @@ -30003,7 +38039,7 @@ s c k[0,1] >[1] [0] !=[0] 0 -[0] [1] *[0] -1 + * 256 endl - repeat {$!-1} a[$>] .,c done rm. + repeat $!-1 a[$>] .,c done rm. #@gui Sphere : fx_map_sphere, fx_map_sphere_preview(1) #@gui : Width = _int(512,1,4096) @@ -30017,7 +38053,8 @@ #@gui : Background = choice("Transparent","Mean Color") #@gui : Fading = float(0,0,100) #@gui : Fading Shape = float(0.5,0,3) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/07/11.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/07/11.") fx_map_sphere : rotate {$8*90} if $6 @@ -30054,7 +38091,8 @@ #@gui : Angle = float(0,-90,90) #@gui : Interpolation = choice(2,"Nearest Neighbor","Linear","Cubic") #@gui : Preview Grid = bool(0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2017/10/03.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2017/10/03.") fx_spherize : ratio={10^$6} spherize $1%,$2,$3%,$4%,$5%,$ratio,$7,$8 @@ -30074,12 +38112,15 @@ #@gui : Y-Factor (%) = float(0,-100,100) #@gui : X-Offset (%) = float(0,-300,300) #@gui : Y-Offset (%) = float(0,-300,300) -#@gui : sep = separator(), note = note("This filter implements the mapping functions described in this page, by C. Fong:") +#@gui : sep = separator() +#@gui : note = note("This filter implements the mapping functions described in this page, +#@gui : by C. Fong:") #@gui : url = link("http://squircular.blogspot.com/2015/09/mapping-circle-to-square.html") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2017/10/30.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2017/10/30.") fx_square_circle : mode,interp,boundary,factx,facty,offx,offy=${1-7} - if {!$boundary} to_a fi + if !$boundary to_a fi base="const interpolation = "$interp"; const boundary = "$boundary"; const offx = "$offx"%; @@ -30088,7 +38129,7 @@ const facty = 10^-("$facty"%); const w2 = int(w/2); const h2 = int(h/2);" - if {!$mode} # Square to circle + if !$mode # Square to circle f $base" const tst = 2*sqrt(2); U = (2*x/(w-1) - 1)*factx + offx; @@ -30122,16 +38163,20 @@ #@gui : Mirror = choice("None","X-Axis","Y-Axis","XY-Axis") #@gui : Boundary = choice(0,"Transparent","Nearest","Periodic","Mirror") #@gui : Last Center = value(50,50) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2018/07/04.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2018/07/04.") fx_project_stereographic : is_inverse,centerx,centery,radangx,radangy,rechor,lrblur,dilation,mirror,boundary,ocenterx,ocentery=${1-12} - if {$centerx!=$ocenterx" || "$centery!=$ocentery} + if $centerx!=$ocenterx" || "$centery!=$ocentery deltax,deltay={[$radangx,$radangy]-[$ocenterx,$ocentery]} radangx,radangy={[$centerx,$centery]+[$deltax,$deltay]} fi - status=\{$is_inverse\}\{$centerx,$centery\}\{$radangx,$radangy\}\{$rechor\}\{$lrblur\}\{$dilation\}\{$mirror\}\{$boundary\}\{$centerx,$centery\} - nradangx,nradangy={[$centerx,$centery]+rot(-90)*([$radangx,$radangy]-[$centerx,$centery])} # So that preview line does not hide left/right frontier + status=\{$is_inverse\}\{$centerx,$centery\}\{$radangx,$radangy\}\{$rechor\}\{$lrblur\}\ + \{$dilation\}\{$mirror\}\{$boundary\}\{$centerx,$centery\} + + # So that preview line does not hide left/right frontier: + nradangx,nradangy={[$centerx,$centery]+rot(-90)*([$radangx,$radangy]-[$centerx,$centery])} init="const boundary = "$is_inverse?$boundary:2"; const interpolation = 1; const dilation = 2^"$dilation"; @@ -30142,9 +38187,9 @@ const R = sqrt(radangx^2 + radangy^2); const theta0 = atan2(radangy,radangx); const pi2 = 2*pi;" - m "_fx_project_stereographic_mirror : if {!$""1} mirror y elif {$""1==1} mirror xy elif {$""1==3} mirror x fi" + m "_fx_project_stereographic_mirror : if !$""1 mirror y elif $""1==1 mirror xy elif $""1==3 mirror x fi" repeat $! l[$>] - if {!$boundary} to_a fi + if !$boundary to_a fi if $rechor rotate $rechor,1,3 fi if $lrblur 100%,1,1,1,!x||x==w-1 shift {round(w/2)},0,0,0,2 b. x,$lrblur% n. 0,1 +b.. x,$lrblur% @@ -30179,7 +38224,7 @@ phi = (h#0*(phi/pi + 0.5))%h#0; I(#0,theta,phi)" fi - k. endl done uncommand _fx_project_stereographic + k. endl done um _fx_project_stereographic if $_is_preview line $centerx%,$centery%,$radangx%,$radangy%,0.75,0xF0F0F0F0,255,255,255,255 @@ -30198,9 +38243,10 @@ #@gui : Boundary = choice(0,"Transparent","Nearest","Periodic","Mirror") #@gui : Type = choice("Symmetry","Antisymmetry") #@gui : Swap Sides = bool(0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2018/06/11.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2018/06/11.") fx_symmetrize : - if {!$6} to_a fi + if !$6 to_a fi angle={isnan($3)?$5:atan2($4-$2,$3-$1)*180/pi} symmetrize $1%,$2%,$angle,${6-8} @@ -30222,8 +38268,13 @@ #@gui : Edge Attenuation = float(0,0,1) #@gui : Edge Influence = float(2,0,10) #@gui : Noise Scale = int(0,0,16) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/21/11.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/21/11.") fx_textured_glass : repeat $! l[$>] 100%,100%,1,1 @@ -30247,22 +38298,107 @@ #@gui : Amplitude = float(1,-5,5) #@gui : Center (%) = point(50,50,0,1) #@gui : Boundary = choice(3,"Transparent","Nearest","Periodic","Mirror") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_twirl : - if {!$4} to_a fi + if !$4 to_a fi twirl $1,$2%,$3%,$4 +#@gui Warp [Interactive] : fx_warp_interactive, fx_warp_interactive_preview(1) +#@gui : Preview Precision = choice{1,"Coarsest (faster)","Coarse","Normal","Fine","Finest (slower)"} +#@gui : sep = separator() +#@gui : note = note{"Pre-defined keypoints"} +#@gui : Regular Grid = int(2,2,10) +#@gui : Contours = int(0,0,32) +#@gui : Keypoints = value(-1) +#@gui : sep = separator() +#@gui : note = note{"Instructions:"} +#@gui : note = note{" +#@gui : Use mouse to add/move/delete keypoints over the interactive window that will appear, +#@gui : in order to create the deformation map.\n\n +#@gui : - Left mouse button: Add and move keypoint.\n +#@gui : - Right mouse button: Delete keypoint.\n +#@gui : - Key SPACE or middle mouse button: Show/hide keypoints.\n +#@gui : - Key TAB: Change keypoint radius.\n +#@gui : - Key SHIFT: Toggle to original image.\n +#@gui : - Key R: Reset keypoints.\n +#@gui : - Keys ESC, ENTER or Q: Process fullres and exit. +#@gui : "} +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2019/04/08.") +fx_warp_interactive : + if $4!=-1 __x_warp_keypoints=${4--1} fi + x_warp $2,$2,$3,$1 + u "{$1}{$2}{$3}{"$__x_warp_keypoints"}" + +fx_warp_interactive_preview : + if $4!=-1 __x_warp_keypoints=${4--1} fi + repeat $! l[$>] + rr2d $_preview_width,$_preview_height,0,3 to_color drgba + if narg($__x_warp_keypoints) ($__x_warp_keypoints) r. 1,{w/4},1,4,-1 + else + + # Keypoints located on regular grid. + nbp,nbq=$2,$2 + 1,{$nbp*$nbq},1,4,"const nbp = "$nbp"; const nbq = "$nbq"; + p = y%nbp; + q = int(y/nbp); + x = p*100/(nbp - 1); + y = q*100/(nbq - 1); + [ x,y,x,y ]" + + # Keypoints located on contours. + nbc=$3 + if $nbc>0 + +b[0] 0.5 gradient_norm. sqrt. {round([w,h]/4)} gaussian. 20% + 1,$nbc,1,4,"> + begin(ref(crop(#-1),gauss)); + st = stats(#-2); + iM = st[1]; + xM = st[8]; + yM = st[9]; + img = vector(#w#-1*h#-1,-iM); + draw(#-2,img,xM - w#-1/2,yM - h#-1/2,0,0,w#-1,h#-1,1,1,-1,gauss); + nxyM = [ xM,yM ]*100/([w#-2,h#-2]-1); + [ nxyM,nxyM ]" + rm[-3,-2] + a[-2,-1] y + fi + fi + + +_x_warp_rbf. {0,round([w,h]/4)} *. 4 r. [0],[0],1,100%,3 +. '[x,y]' warp[0] .,0,1,3 rm. + + eval. "* + begin( + col1 = [ 64,200,255 ]; + const radius1 = 3; + const radius2 = radius1 + 2; + fact = ([ w#0,h#0 ] - 1)% + ); + X = (I)[0,2]*fact; + ellipse(#0,X,radius2,radius2,0,1,0); + ellipse(#0,X,radius1,radius1,0,1,col1); I" + rm. + + if narg($__x_warp_keypoints) + 0 t. "Keypoints from previous\nrun have been saved",0,0,24,1,255 + frame. 5,5,0 +dilate_circ. 5 a[-2,-1] c blend alpha + fi + endl done + #@gui Water : water, water(0) #@gui : Amplitude = float(30,0,300) #@gui : Smoothness = float(1.5,0,4) #@gui : Angle = float(45,0,180) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/07/10.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/07/10.") #@gui Wave : wave, wave(1) #@gui : Amplitude = float(10,0,30) #@gui : Frequency = float(0.4,0,2) #@gui : Center (%) = point(50,50,0,1,255,255,255,170,10) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") #@gui Wind : fx_wind, fx_wind_preview(0) #@gui : Amplitude = int(20,0,500) @@ -30270,14 +38406,26 @@ #@gui : Attenuation = float(0.7,0,1) #@gui : Threshold = float(20,0,100) #@gui : Mode = choice(1,"Darker","Brighter") -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") #@gui : Value Action = choice("None","Cut","Normalize") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/13/07.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/13/07.") fx_wind : - if {!$5} negate fi + if !$5 negate fi ac "wind ${1-4}",$6,$7 - if {!$5} negate fi + if !$5 negate fi fx_wind_preview : gui_split_preview "fx_wind $*",${-3--1} @@ -30286,23 +38434,79 @@ #@gui : Factor = float(2,0.01,10) #@gui : Center (%) = point(50,50,0,1,255) #@gui : Boundary = choice(0,"Transparent","Nearest","Periodic","Mirror") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_zoom : - if {!$4" && "$1<1} to_a fi + if !$4" && "$1<1 to_a fi zoom $1,{$2%},{$3%},0,$4 #@gui ____Degradations #----------------------------- +#@gui Add Grain : fx_simulate_grain, fx_simulate_grain_preview(0) +#@gui : Preset = choice{"Orwo NP20-GDR","Kodak TMAX 400","Kodak TMAX 3200","Kodak TRI-X 1600","Unknown"} +#@gui : Blend Mode = choice(1,"Alpha","Grain Merge","Hard Light","Overlay","Soft Light","Grain Only") +#@gui : Opacity = float(0.2,0,1) +#@gui : Scale = float(100,30,200) +#@gui : Colored Grain = bool() +#@gui : sep = separator() +#@gui : Brightness (%) = float(0,-100,100) +#@gui : Contrast (%) = float(0,-100,100) +#@gui : Gamma (%) = float(0,-100,100) +#@gui : Hue (%) = float(0,-100,100) +#@gui : Saturation (%) = float(0,-100,100) +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Grain Alone = bool() +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/02/08.") +fx_simulate_grain : + __fx_simulate_grain ${arg\ {1+$1},${-_fx_simulate_grain}},${2-10},0,0 + +_fx_simulate_grain : + u orwo_np20,kodak_tmax400,kodak_tmax3200,kodak_trix1600,unknown + +fx_simulate_grain_preview : + gui_split_preview "_fx_simulate_grain_preview $*",$-2 + +_fx_simulate_grain_preview : + __fx_simulate_grain ${arg\ {1+$1},${-_fx_simulate_grain}},${2-12} + +__fx_simulate_grain : + bm0=alpha bm1=grainmerge bm2=hardlight bm3=overlay bm4=softlight bm5=alpha + if isfile(['{/${-path_cache}grain_$1.cimgz}']) i ${-path_cache}grain_$1.cimgz + else i https://gmic.eu/data_film_presets/grain_$1.cimgz o. ${-path_cache}grain_$1.cimgz + fi + + repeat $!-1 l[$>,-1] split_opacity[0] + +syntexturize. {0,max(10,100*w/$4)},{0,max(10,100*h/$4)} + if $5 +syntexturize.. {w},{h} +syntexturize... {w},{h} a[-3--1] c fi + r. {0,w},{0,h},1,100%,5 c. 0,255 + adjust_colors. ${6-10} + if $12 k[0,-1] rv + else blend[0,-1] ${bm$2},{if($2<=4,$3,1)} + fi + a[^-1] c endl done rm. + #@gui Blur [Angular] : fx_blur_angular, fx_blur_angular_preview(1) #@gui : Amplitude (%) = float(2,0,20) #@gui : Center (%) = point(50,50,0,1) #@gui : Sharpness = float(0,0,500) #@gui : Preview Guides = bool(1) -#@gui : sep = separator(), Channel(s) = choice(7,"All","RGBA [all]","RGB [all]","RGB [red]","RGB [green]","RGB [blue]","RGBA [alpha]","Linear RGB [all]","Linear RGB [red]","Linear RGB [green]","Linear RGB [blue]","YCbCr [luminance]","YCbCr [blue-red chrominances]","YCbCr [blue chrominance]","YCbCr [red chrominance]","YCbCr [green chrominance]","Lab [lightness]","Lab [ab-chrominances]","Lab [a-chrominance]","Lab [b-chrominance]","Lch [ch-chrominances]","Lch [c-chrominance]","Lch [h-chrominance]","HSV [hue]","HSV [saturation]","HSV [value]","HSI [intensity]","HSL [lightness]","CMYK [cyan]","CMYK [magenta]","CMYK [yellow]","CMYK [key]","YIQ [luma]","YIQ [chromas]") +#@gui : sep = separator() +#@gui : Channel(s) = choice(7,"All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") #@gui : Value Action = choice("None","Cut","Normalize") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/16/01.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/16/01.") fx_blur_angular : ac "blur_angular $1%,$2%,$3% sharpen $4",$6,$7 @@ -30323,12 +38527,24 @@ #@gui : Anisotropy = float(0,0,1) #@gui : Angle = float(0,-180,180) #@gui : note = note("Parameter Angle is only active when Anisotropy>0") -#@gui : sep = separator(), Channel(s) = choice(7,"All","RGBA [all]","RGB [all]","RGB [red]","RGB [green]","RGB [blue]","RGBA [alpha]","Linear RGB [all]","Linear RGB [red]","Linear RGB [green]","Linear RGB [blue]","YCbCr [luminance]","YCbCr [blue-red chrominances]","YCbCr [blue chrominance]","YCbCr [red chrominance]","YCbCr [green chrominance]","Lab [lightness]","Lab [ab-chrominances]","Lab [a-chrominance]","Lab [b-chrominance]","Lch [ch-chrominances]","Lch [c-chrominance]","Lch [h-chrominance]","HSV [hue]","HSV [saturation]","HSV [value]","HSI [intensity]","HSL [lightness]","CMYK [cyan]","CMYK [magenta]","CMYK [yellow]","CMYK [key]","YIQ [luma]","YIQ [chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/03/02.") -fx_blur_bloom : +#@gui : sep = separator() +#@gui : Channel(s) = choice(7,"All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/03/02.") +fx_blur_bloom : op=${"arg 1+$4,+,max,min"} - if {!$7} ac "blur_bloom ${1-3},"$op",${5-6},xy",$9 + if !$7 ac "blur_bloom ${1-3},"$op",${5-6},xy",$9 else wh={[w,h]} rotate $8,2,1 @@ -30356,9 +38572,11 @@ #@gui : sep = separator() #@gui : note = note("User-defined depth-of-field:") #@gui : Gamma = float(0,-2,2) -#@gui : note = note("You can specify your own depth-of-field image, as a bottom layer image whose luminance encodes the depth for each pixel. +#@gui : note = note("You can specify your own depth-of-field image, as a bottom layer image +#@gui : whose luminance encodes the depth for each pixel. #@gui : Don't forget to modify the Input layers combo-box to make this layer active for the filter.") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/25/02.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/25/02.") fx_blur_dof : _$0 ${1-10},0,$12 @@ -30366,7 +38584,7 @@ _fx_blur_dof $* _fx_blur_dof : - if {!$3} # Gaussian DOF. + if !$3 # Gaussian DOF. repeat $! l[$>] if $11 drgba fi split_opacity l[0] rmax={(w*w+h*h)^0.5} R={$7*$rmax/100} r={$8*$rmax/100} t={$9*pi/180} u={cos($t)} v={sin($t)} @@ -30387,9 +38605,9 @@ else __fx_dof_blur[0,1] $2,$ms,$Ms,$4 # Without preview. fi endl if $11 k[0] fi a c endl done - elif {$!>1} # User-defined DOF (as bottom layer). + elif $!>1 # User-defined DOF (as bottom layer). luminance. n. 0,1 ^. {10^$12} - repeat {$!-1} +r. {$>,w},{$>,h},1,1,3 l[$>,-1] split_opacity[0] + repeat $!-1 +r. {$>,w},{$>,h},1,1,3 l[$>,-1] split_opacity[0] __fx_dof_blur[0,-1] $2,0,$1,$4 a c endl done rm. else drgba to "Depth-of-field (bottom layer) is missing !",2,2,13,2,1,255 @@ -30422,14 +38640,26 @@ #@gui : X-Amplitude = float(0,0,20) #@gui : Y-Amplitude = float(0,0,20) #@gui : Boundary = choice(1,"Black","Nearest") -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") #@gui : Value Action = choice("None","Cut","Normalize") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") _fx_gaussian_blur : b $1,$4 - if {$2>0} repeat $! l. s y b $2,$4 a y endl mv. 0 done fi - if {$3>0} repeat $! l. s x b $3,$4 a x endl mv. 0 done fi + if $2>0 repeat $! l. s y b $2,$4 a y endl mv. 0 done fi + if $3>0 repeat $! l. s x b $3,$4 a x endl mv. 0 done fi fx_gaussian_blur : ac "_fx_gaussian_blur $1,$2,$3,$4",$5,$6 @@ -30439,10 +38669,22 @@ #@gui Blur [Glow] : fx_glow, fx_glow_preview(0) #@gui : Amplitude = float(6,0,20) -#@gui : sep = separator(), Channel(s) = choice(7,"All","RGBA [all]","RGB [all]","RGB [red]","RGB [green]","RGB [blue]","RGBA [alpha]","Linear RGB [all]","Linear RGB [red]","Linear RGB [green]","Linear RGB [blue]","YCbCr [luminance]","YCbCr [blue-red chrominances]","YCbCr [blue chrominance]","YCbCr [red chrominance]","YCbCr [green chrominance]","Lab [lightness]","Lab [ab-chrominances]","Lab [a-chrominance]","Lab [b-chrominance]","Lch [ch-chrominances]","Lch [c-chrominance]","Lch [h-chrominance]","HSV [hue]","HSV [saturation]","HSV [value]","HSI [intensity]","HSL [lightness]","CMYK [cyan]","CMYK [magenta]","CMYK [yellow]","CMYK [key]","YIQ [luma]","YIQ [chromas]") +#@gui : sep = separator() +#@gui : Channel(s) = choice(7,"All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") #@gui : Value Action = choice("None","Cut","Normalize") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_glow : ac "glow $1",$2,$3 @@ -30455,10 +38697,22 @@ #@gui : Angle = float(0,0,180) #@gui : Sharpness = float(0,0,500) #@gui : Boundary = choice(1,"Black","Nearest") -#@gui : sep = separator(), Channel(s) = choice(7,"All","RGBA [all]","RGB [all]","RGB [red]","RGB [green]","RGB [blue]","RGBA [alpha]","Linear RGB [all]","Linear RGB [red]","Linear RGB [green]","Linear RGB [blue]","YCbCr [luminance]","YCbCr [blue-red chrominances]","YCbCr [blue chrominance]","YCbCr [red chrominance]","YCbCr [green chrominance]","Lab [lightness]","Lab [ab-chrominances]","Lab [a-chrominance]","Lab [b-chrominance]","Lch [ch-chrominances]","Lch [c-chrominance]","Lch [h-chrominance]","HSV [hue]","HSV [saturation]","HSV [value]","HSI [intensity]","HSL [lightness]","CMYK [cyan]","CMYK [magenta]","CMYK [yellow]","CMYK [key]","YIQ [luma]","YIQ [chromas]") +#@gui : sep = separator() +#@gui : Channel(s) = choice(7,"All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") #@gui : Value Action = choice("None","Cut","Normalize") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_blur_linear : ac "blur_linear $1,{$2*$1/100},$3,$5 sharpen $4",$6,$7 @@ -30470,9 +38724,17 @@ #@gui : Center (%) = point(50,50,0,1) #@gui : Sharpness = float(0,0,500) #@gui : Preview Guides = bool(1) -#@gui : sep = separator(), Channel(s) = choice(7,"All","RGBA [all]","RGB [all]","RGB [red]","RGB [green]","RGB [blue]","RGBA [alpha]","Linear RGB [all]","Linear RGB [red]","Linear RGB [green]","Linear RGB [blue]","YCbCr [luminance]","YCbCr [blue-red chrominances]","YCbCr [blue chrominance]","YCbCr [red chrominance]","YCbCr [green chrominance]","Lab [lightness]","Lab [ab-chrominances]","Lab [a-chrominance]","Lab [b-chrominance]","Lch [ch-chrominances]","Lch [c-chrominance]","Lch [h-chrominance]","HSV [hue]","HSV [saturation]","HSV [value]","HSI [intensity]","HSL [lightness]","CMYK [cyan]","CMYK [magenta]","CMYK [yellow]","CMYK [key]","YIQ [luma]","YIQ [chromas]") +#@gui : sep = separator() +#@gui : Channel(s) = choice(7,"All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") #@gui : Value Action = choice("None","Cut","Normalize") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/16/01.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/16/01.") fx_blur_radial : ac "blur_radial $1%,$2%,$3% sharpen $4",$6,$7 @@ -30491,8 +38753,13 @@ #@gui : Secondary Color = color(0,255,0) #@gui : X-Shift (px) = float(0,-16,16) #@gui : Y-Shift (px) = float(0,-16,16) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/05/07.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/05/07.") fx_chromatic_aberrations : # Compute orthonormal color basis. @@ -30521,10 +38788,22 @@ #@gui Dirty : fx_dirty, fx_dirty_preview(0) #@gui : Amplitude = float(30,0,100) #@gui : Monochrome = bool(1) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") #@gui : Value Action = choice("None","Cut","Normalize") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/24/11.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/24/11.") fx_dirty : ac "_fx_dirty ${1-2}",$3,$4 @@ -30538,14 +38817,26 @@ * idct c 0,255 endl done -#@gui Flip & Rotate Blocs : fx_flip_blocs,fx_flip_blocs_preview(0) +#@gui Flip & Rotate Blocs : fx_flip_blocs,fx_flip_blocs_preview(0) #@gui : X-Size (px) = int(4,1,128) #@gui : Y-Size (px) = int(4,1,128) #@gui : Flip = choice(3,"None","X-axis","Y-axis","XY-axes") #@gui : Rotate = choice(1,"-90 deg.","0 deg.","90 deg.") -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/01/09.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/01/09.") fx_flip_blocs : repeat $! l[$>] if $5 ac "_fx_flip_blocs ${1-4}",$5 @@ -30554,9 +38845,9 @@ endl done _fx_flip_blocs : - if {($3%2)" && "$1>1} s x,-$1 mirror x a x fi - if {($3>1)" && "$2>1} s y,-$2 mirror y a y fi - if {$4!=1" && "$1>1" && "$2>1} + if ($3%2)" && "$1>1 s x,-$1 mirror x a x fi + if ($3>1)" && "$2>1 s y,-$2 mirror y a y fi + if $4!=1" && "$1>1" && "$2>1 s y,-$2 N=$! s x,-$1 M={$!/$N} ap "rotate {($4-1)*90}" @@ -30567,24 +38858,95 @@ gui_split_preview "fx_flip_blocs $*",${-3--1} #@gui JPEG Artefacts : fx_jpeg_artefacts, fx_jpeg_artefacts_preview(0) -#@gui : note = note("This filter simulates the JPEG compression artifacts, using DCT quantization on 8x8 blocs.") +#@gui : note = note("This filter simulates the JPEG compression artifacts, +#@gui : using DCT quantization on 8x8 blocs.") #@gui : Quality (%) = int(50,1,100) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2017/05/07.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2017/05/07.") fx_jpeg_artefacts : # Input all 8x8 DCT and iDCT kernels. # (Generated with: l[] 8,8,64,1,"y*w+x==z" s z +ap idct a[-64--1] z ap[^-1] dct a[0--2] z nm idct,dct endl) - base642img "MSBmbG9hdCBsaXR0bGVfZW5kaWFuCjggOCA2NCAxICMyMjIyCnic5Vs9q51FEC60kKtWMYpaCirYKCoI767iR6UoSangtdM/EAM2Fgab2FhaWdgIUXOqVO8sXEHBVDFia6kgCBaCQSyu+5w8c3nv5p55Bg+3uSmGs19nP2Z2Zt752P39/bJ/G8PHF5+qD1y4v77+yNWyeulegPWy9bbW+9pJ7z9XH6s/f3KxdLBeRr2hjDb0nfR+4OZyxwlw8UbHS4f1nehtBTg66f3kAyOU261OfDTiA/ehEV91ga8T208+cDlg5JNKPiknvR8ykfKwLuRlo7y0k96PegS8MxsB80RAnROBRYC9R0AZtxF45o1w+cXz9fHvztTnP7y7nv7z5dLBern1NvTht37/75P17Qt/lOsPPQqwXrbeth6D/6Hv3F2fl2/++WXqMPfyegzmwZz439e9755fHwbMvTxjHqwFQBlt6MMYjMV/8F/MgbkwJ+bGGlgLa2Jt7AF7wRjMg/+hD3vG3nmGxr0Y5/S+euPGe/XVJ/ZKB+vlBkAZbeh77ctX6re/f1E6WC83AMpoQ9+Zd++oV6+8WTpYLzcAymhD30+fPlee/e2zqcPcywZAGW3oO6J+aPw437jeuJ9xv+N5xvMCD/d1vABPL3QcdVjjpbcV4rb+2PGK8jsdxx3QjrZCvJevOl2A3/c7jTqs8dvbJtKkgK7A/eU+rsMEGoDOpJehjDb0YQzG4j+kpWEuzIm5sQbWwpqkc8NesCfsDXvEXrFn3oGGs+BMOBvOiLPizPgP+fzgW3Gsu87wb4mxTj53fixjfeDxo+qb2suC/2+Z1+ub9uX1TefyOundSG/HlxFfjfRupHclvo34dno30tvpNZNeRnob6V1I75n0nknvQnr7fZl4XybSu5Lexvs28b45vSvp7fe18L4W0ruS3n7fC+97JV808oWRLyr5ppCvGvnKyFeVfFfIl418aeTLSr4t5GsjX8/ka+f76Yj6ofHjfON6437G/Y7nGc/rMtZlJfVBoz5weXrAS9QHjfrAKI+N8tj1gVEfuDyfKc+N+sCoD2bqg4n6oPia1AeuTwr1SaU+KNQHE/VRoT5yfVBd9lCfVeoz1wfVdZPbSJvAv6ECsAjc5vq/oOZX+1Pncx3nusp1zkJ3lL1+p37gXcad7GXb490CoIw212MYi//4XcNcmNPvNdbCmn4vo341v9qfOt8HH71V/7rzSulgvYx6Qxlt3vfg36cBxnZDGW3+v6F+aPw4n1pv7Ffzq/2p9YCb6x0nwMXZjpcOa7z3trUcAW6f6TgFLv07BDjvbRNwDEAZbf5dgrH4zx5lEebCnJgba2AtrOlyK+pX86v9qfO5LeQ20lgfeHzk+RK0L30ut8ybrav51f7UOsRHIz6cHkZ6NOLTiM9Cesykh5EehfQw0mMiPQrpWUnPRnoU0qOqfjW/2p86H/nA5YDzbCWfFPKR85mRz5zvyxH1Q+PH+dR6Y7+aX+1PrUd52yhvG+Vlo7w0ylujvDXKW6O8nSlvC+VtobwulNcT5W2lvHV5Xynvi+pX86v9qfMp+x6+ogiUfU0fVAQlAuWfgF8rAuUfUPb9Kdrnl/p32E7/VuswXaJ93vvKKrCvV7Qhdm/aCQf2H77bd29+m69tMpTR5vYfxuI/+O8q8E9g7VP0L2BP2Bv2eIn+hVP85o/8A9QxZW9h37ucQd+1fkee7veow9TLBYAy2q5Rr0T29dmF/U55d2C/uz4a6ofGK//EuJ9xv+N5xvMu7XvgfHew74Ez4BV4Bo6BW+B1h/a529erhX29WtjXmBPf9+g732ncYU1XfN9jLQDKaEMfxmAs/rNL2w5zrRb+idXCP4E9YC/YE/aGPWKvO/QvLP0DXO+Qf0DZ9+Rz5ycb68q+Hnh85HkL2m3B/xvt+E378rryD+wG9j1wRXqXnYV9zvuAvsl5dLSvSa9KelfS20jvifQupHcjvQvvy7z87+oI/4TLFtLbdhb+Bd4H3Nd5N/APYL29hb3s37P+nYA+8lUhX03kKyPfzcq+9m+Qswv7fcH3dkT90Hjlnxj3M+53PM94XmXfU55OlKeF+qBQH0xL+xo0WQ32NeV5oTx3fVDcN+Q+HuqDRn1g1Afz0j+BuVeDf4L6aKY+MuoDoz6YlX8gESO3LWHbGP2xrp+InzfGSw58kxjLeEpN9G8bvz/W9RPx823j7dvG7491/UT8fB07Zbx0rZsYT/VvZ9W/bfz+WNdPxMu3jbNvG68/1vUT8XMjvmxBr0J8lkT/tvH7Y10/ET/fNt6+bfz+WNdPxM+N8tS/Pz3uZQt5GvVvG78/1vUT9nccP9f2t8ohCO3zhP8h9A8o/0PC/g7t+4T9HfoXlH2e8D+E/gHlf0jY36F9n7C/Q/+Css8T/ofQP6D8Dwn7O7TvE/Z36F9Q9nnC/xD6B5T/IWF/h/Z9wv4O/QvKPk/4H0L/gPI/JOzv0L5P2N+hf0HZ5wn/Q+gfUP6HhP0d2vcJ+zv0Lyj7POF/CP0Dyv+QsL9D+z5hf4f+BWWfJ/wPoX9A+R8S8XMVo1f5Ayp+r/IHwvnV/tT5EvFzFb9X+QMqfq/yB8L5E/kD4fkS8XMVv1f5Ayp+r/IHVL6Ayh8I10vEz1X8XuUPqPi9yh8I50/kD4TnS8TPVbxe5Q+o+L3KH1B5Aip/IFwnET9X8XuVP6Di9yp/IJw/kT8Qni8RP1fxe5U/oOL3Kn9A5Quo/IFwvUT8XMXvVf6Ait+r/IFw/kT+QHg+lZ+fyL8P7XvlP1D2u/IPJN4fhO8LVH5+Iv8+tO9V/n3i/UHoH0i8PwjfF6j8/ET+ffg+QPkPEu8Pwvz+xPuD8H2Bys9P5N+H7wNU/n3i/UGY3594fxC+L1D5+Yn8+9C+V/4DZb8r/0Di/UH4vkDl5yfy78P3ASr/PvH+IMzvT7w/CN8XqPz8RP59+D5A+Q8S7w/C/P7E+4PwfYHKz0/k34f2vcq/T7w/CP0DifcH4fuC/wBiGjbi" - base642img "MSBmbG9hdCBsaXR0bGVfZW5kaWFuCjggOCA2NCAxICMyOTE3CnicjVsxjybFEV0JB4iDyHdYhhAJIznBAiSS6ZbBkb3YS4glHOI/4ENyQuDTOsAJIRGBEyP7di+6cKo5yZY4J95DmxKChIREYMln5ODo1/OqXd9KU1XZzX37Tc+rqqlX9aq+o6Ojevr+T+rvlh/VH9x6uh716189d79c/un9cue1pwo+O//pu/Xhw9/WF/5+Mv62vnet/vzHn5Qb37xe8D189vs//Lr+4i8/G/d5853H6r+/d7d89sGrBffE9/DZP/734jjjN7e+Lp989efy4Jnny6NHj4o9H9e/NOfj3zgP98T3cP3u4x+V+3ffKufffr7g7/AsOA/3xDU+++F/bpRXvvxwwT3wnHgWnIdrfA+fPfnFswvw4lx87/y1p6Rft/48rT9Pe+O5+4Jnw/PjjO9/8zquW7dH65hbee8a/m5gw/kPPnhV8D181u3RTt55rOHewI1n+9czz0u/bv1+rX+nvX3rawFePf+sn9+vxZ4PvMANTH/79vO1X0u3R+v2aDcf/0jwPdwbeF/68sO1X0t/VunPI5/efUuAF7iB99oXz679Wro9pNtDbvf7Af8bm73HucDf7VDUH8BfNn8LcONvuh2KxgP+7mTztwA3nrvboWg84B5vb/4W4Ab+boei8QD89nzgPzPnA//Nzd8DN/B3OywaD8D/6ebvgRv36XZYNB6A//bm7xW4gb/bYdF4AP4723mtx72YeBjPA/w3NrwN55t4GPbAc3624R0+MfEw7IF7Pdjwtv68YuJh2AP49XxgM/Ewzgf+8w1v63Fv42HYA/hf2fAK/s/Ew7AH7v3khlf6fVYTD8MexC/EX4i/8fxK/EL8lfgb8VfiF+KvxN+IvxK/EH8h/kb8lfiF+Avxz/OJfyX+QvxC/JX4V+IvxC/EX4h/Jf6F+IX4C+Nf9DzGvzD+GuN/4mX8C+O/Mf4nXsa/MP4b418UL+NfGP+N8T/PZ/zP8xn/Ey/jf2X8C+N/4mX8r4x/YfyvipfxvzL+xfgb+a8w/1Xmn2L8jfxXmP8q85/1N/JfYf6rzH/V+Bv5rzD/VeY/62/kv8L8N883/kb+W5j/KvOf9Tfy38L8V5j/ivE38t/C/FeY/0b+Z74ddiD/CflHyH9N/U3+a+Q/If819Tf5r5H/hPzX1N/kPyH/Cflvnk/+m+eT/5r6m/wn5L+V/Cfqb/KfkP9W8p+ov8l/K/lvPQr4X/n7+Ap/3yN/R/yLd+k6+eain4/rv/bzX+7PhvMt3xG/EP/I1X/sn93p9v9vtzHsiGvaX2j/ybe0f6P9x5m4F95fvKO0n8B+/+w2OiP/efyv+Rp4Lwx/H5O/I/7FPfE94H2ixx/eseusRz7u8Qe8mu8Y/7MeQvwDr+ZbfK9f126P2u1R+f41zbd8/2Y9hvcPeIEbeG9v70/B9/AZ3p+I/5W/7xn+7niKxkPEv8D/8ebvBc+Pez/BfHyxxb8w/xXmv8L8N84CfubfAtzAj3jSeMDfMf8W5t/K/DvsAvw3N38P3MCPfKjxEPG/8vfxFf5We0T8C/zkn9LjfjHxMOwB/OS/Sv7TeBj2AP4bG95Rd5t4GPbAc5N/K/lX42HYA/jPNryV/KnxMOwR8b/y9/EV/ib+kH+JfyH+lfgL8QvxF+IX4q/E34i/EH8j/kr8jfgL8Tfir8TfiH8hfiH+Qvwt4n/l73uGvy82eww7RPzL+F8UL+N/YfwXxn9RvIz/wvivjP+Jl/FfGP+V8T/xMv4L478y/idexv/C+C8R/xt/I/9N/mb+C/nX+Bv5b2X+E+a/1fhb2P9MPoRfjL8HjzD/NeY/629h/zX5GBiNv0e/w/zXmP8k4n/l7+Mr/E3+k4h/yX9F/U3+W8h/i6132P8K+9/xXpD/qvqb/FfJfwf1Fvvvxv572Jj8V9Xf5L9C/lsi/rd8YftvxNPZ1n9PviN+If5RY0f8HfG/5Uvar9B+o3/P6g979UvE/9pvAS/jZ9YT7L9F8x3jf9ZDiP+IvyP+B17Nl3x/Zj2F9yerP+zVLxH/a/+NeGH+EOYP7b+F+a8w/xXmv2GXiL8j/sezMH+uzJ/C/DnsktUf9uqXiP+Bn/xx0H+rPfB35L9C/tN4GPaI+Dvi/3PTv5M/NR6GPbL6w179EvE/8a8nV/pv4q/EvxC/vg+F+CXi74j/z03/zvqpaD19nfpjRn/Yq18i/tf+W/Ey/teT//ffwvq3sP4trH+HHSL+jvif8b8qXsb/yviXrP6wV79E/G/8Xdg/TD5h/63+FvY/kw+RFyL+jvjf+Hth/zT5FHkhqz/s1S8R/9t6wfbf5D/t94r6m/xXyH9LxN8R/9t6if1zYf88+ves/rBXv0T8H+nnmf5b9WrbfyNXnG/1n6v/R/ODqP6wej31m4P6I+L/SD/P9t94JupXc56B9yfS/6P5QVR/nJr6g/rdnOdo/+fxf6SfZ/tvvBPULwv1yxEPkf4fzQ+i+uPU1B/Ubyv122b4b5f/I/08039Tvz7ov9Uekf4fzQ+i+uOU9cdD1h8mHoY9Iv6P9PNM/835xUH/Tfw6/9jV/6P5QVR/EH8h/nZq6g/khYj/I/08238rXsb/wvgvkf4fzQ+i+uPU1B+c31XO75rWPx7/R/p5tv9m/lutno28EOn/0fwgqj+Mv4Xz26nnq/7j8X+kn2f6b51X2P6b/LdE+n80P4jqDzuv4fz+oP5I8P/kO+IX4l8Nfo//3fl9gv8n3xF/I34x+D3+d/cXEvwvmu8Y/7MeMvHv8b87v0/wf9N8x/if9ZCJf4//3f2FBP8L89/C/FeY/8TkP4//3fl9gv8b819h/qvMf83kP4//3f2FBP9P/Z78p/GwGP7z+N+d3yf4v5H/KvlP46EY/vP4391fSPD/1O9Z/4jWw6b+8fjfnd8n+L+x/qmsf5rWw6b+8fjf3V9I8L+w/l1Y/xbWv2LqX4//3fl9gv8b69/C+rey/m2m/vX4391fSPC/+ntl/zP50PQ/Hv+78/sE/6u/hf3P5EPT/3j87+4vJPh/1jvsf4X972r6X4//3fl9gv9nvcP+t7H/FdP/evzv7i8k9H93fp7Q/6feTf3jgH8T+r+7P5DQ/6febeuHe6wfEvq/Oz9P6P+Tf6l/zXmI0b88/d/dH0jo/031zgtTPxyzfkjo/+78PKH/T/6l/tmof1ajf3r6v7s/kND/G/XPWT9Q/2yqfwb6vzs/T+j/lfp3o/49+dfo357+7+4PJPT/Rv37oH5QeyT0f3d+ntD/K+cfjfOPyb9m/uHp/+7+QEL/b5x/HNQPxB/2/9H8PKH/T/7l/Ktx/lXN/MvT/939gYT+3zj/mvUD519N51+B/u/OzxP6/+Rfzj+nHm7mn57+7+4PJPR/9bdcmPqB+S+c/0fz84T+P+cdnH8f8G9C/3f3BxL6/5x32PqB/Bf2/xF/Wr7b2f9z5/eJ/T+3fsjoD97+QmL/z+XPy3j/z53fJ/b/3Pohqz/s7S8k9v9c/ryM9//c+X1i/8+tH7L6w97+QmL/z+XPy3j/z53fJ/b/3Pohoz94+wuJ/T+XPy/j/T93fp/Y/3Prh4z+4O0vJPb/XP68jPf/3Pl9Yv/PrR+y+sPe/kJi/8/lT+Pvvf0/d36f2P9z64es/rC3v5DY/3P509Y7O/t/7vw+sf/n1g8Z/cHbX4j4P5qfZ/vvPf0+0v+j/YGo/ojmF4nf/7nz82z/vaffR/p/tD8Q1R/R/CLx+z93fp7tv/f0+0j/j/YHovojml8kfv/nzs+z/feefh/p/9H+QFR/RPOLxO//3Pl5tv/e0+8j/T/aH4jqj2h+kfj9nzs/z/bfe/p9pP9H+wNR/RHNLxK//3Pn59n+e0+/j/T/aH8gqj+i+UXi93/u/Dzbf+/p95H+H+0PRPVHNL/4DgTd2gQ=" + base642img[] \ +"MSBmbG9hdCBsaXR0bGVfZW5kaWFuCjggOCA2NCAxICMyMjIyCnic5Vs9q51FEC60kKtWMYpaCirYKCoI767iR6UoSangtdM/EAM2Fgab2FhaWdgIUXO"\ +"qVO8sXEHBVDFia6kgCBaCQSyu+5w8c3nv5p55Bg+3uSmGs19nP2Z2Zt752P39/bJ/G8PHF5+qD1y4v77+yNWyeulegPWy9bbW+9pJ7z9XH6s/f3KxdL"\ +"BeRr2hjDb0nfR+4OZyxwlw8UbHS4f1nehtBTg66f3kAyOU261OfDTiA/ehEV91ga8T208+cDlg5JNKPiknvR8ykfKwLuRlo7y0k96PegS8MxsB80RAn"\ +"ROBRYC9R0AZtxF45o1w+cXz9fHvztTnP7y7nv7z5dLBern1NvTht37/75P17Qt/lOsPPQqwXrbeth6D/6Hv3F2fl2/++WXqMPfyegzmwZz439e9755f"\ +"HwbMvTxjHqwFQBlt6MMYjMV/8F/MgbkwJ+bGGlgLa2Jt7AF7wRjMg/+hD3vG3nmGxr0Y5/S+euPGe/XVJ/ZKB+vlBkAZbeh77ctX6re/f1E6WC83AMp"\ +"oQ9+Zd++oV6+8WTpYLzcAymhD30+fPlee/e2zqcPcywZAGW3oO6J+aPw437jeuJ9xv+N5xvMCD/d1vABPL3QcdVjjpbcV4rb+2PGK8jsdxx3QjrZCvJ"\ +"evOl2A3/c7jTqs8dvbJtKkgK7A/eU+rsMEGoDOpJehjDb0YQzG4j+kpWEuzIm5sQbWwpqkc8NesCfsDXvEXrFn3oGGs+BMOBvOiLPizPgP+fzgW3Gsu"\ +"87wb4mxTj53fixjfeDxo+qb2suC/2+Z1+ub9uX1TefyOundSG/HlxFfjfRupHclvo34dno30tvpNZNeRnob6V1I75n0nknvQnr7fZl4XybSu5Lexvs2"\ +"8b45vSvp7fe18L4W0ruS3n7fC+97JV808oWRLyr5ppCvGvnKyFeVfFfIl418aeTLSr4t5GsjX8/ka+f76Yj6ofHjfON6437G/Y7nGc/rMtZlJfVBoz5"\ +"weXrAS9QHjfrAKI+N8tj1gVEfuDyfKc+N+sCoD2bqg4n6oPia1AeuTwr1SaU+KNQHE/VRoT5yfVBd9lCfVeoz1wfVdZPbSJvAv6ECsAjc5vq/oOZX+1"\ +"Pncx3nusp1zkJ3lL1+p37gXcad7GXb490CoIw212MYi//4XcNcmNPvNdbCmn4vo341v9qfOt8HH71V/7rzSulgvYx6Qxlt3vfg36cBxnZDGW3+v6F+a"\ +"Pw4n1pv7Ffzq/2p9YCb6x0nwMXZjpcOa7z3trUcAW6f6TgFLv07BDjvbRNwDEAZbf5dgrH4zx5lEebCnJgba2AtrOlyK+pX86v9qfO5LeQ20lgfeHzk"\ +"+RK0L30ut8ybrav51f7UOsRHIz6cHkZ6NOLTiM9Cesykh5EehfQw0mMiPQrpWUnPRnoU0qOqfjW/2p86H/nA5YDzbCWfFPKR85mRz5zvyxH1Q+PH+dR"\ +"6Y7+aX+1PrUd52yhvG+Vlo7w0ylujvDXKW6O8nSlvC+VtobwulNcT5W2lvHV5Xynvi+pX86v9qfMp+x6+ogiUfU0fVAQlAuWfgF8rAuUfUPb9Kdrnl/"\ +"p32E7/VuswXaJ93vvKKrCvV7Qhdm/aCQf2H77bd29+m69tMpTR5vYfxuI/+O8q8E9g7VP0L2BP2Bv2eIn+hVP85o/8A9QxZW9h37ucQd+1fkee7veow"\ +"9TLBYAy2q5Rr0T29dmF/U55d2C/uz4a6ofGK//EuJ9xv+N5xvMu7XvgfHew74Ez4BV4Bo6BW+B1h/a529erhX29WtjXmBPf9+g732ncYU1XfN9jLQDK"\ +"aEMfxmAs/rNL2w5zrRb+idXCP4E9YC/YE/aGPWKvO/QvLP0DXO+Qf0DZ9+Rz5ycb68q+Hnh85HkL2m3B/xvt+E378rryD+wG9j1wRXqXnYV9zvuAvsl"\ +"5dLSvSa9KelfS20jvifQupHcjvQvvy7z87+oI/4TLFtLbdhb+Bd4H3Nd5N/APYL29hb3s37P+nYA+8lUhX03kKyPfzcq+9m+Qswv7fcH3dkT90Hjlnx"\ +"j3M+53PM94XmXfU55OlKeF+qBQH0xL+xo0WQ32NeV5oTx3fVDcN+Q+HuqDRn1g1Afz0j+BuVeDf4L6aKY+MuoDoz6YlX8gESO3LWHbGP2xrp+InzfGS"\ +"w58kxjLeEpN9G8bvz/W9RPx823j7dvG7491/UT8fB07Zbx0rZsYT/VvZ9W/bfz+WNdPxMu3jbNvG68/1vUT8XMjvmxBr0J8lkT/tvH7Y10/ET/fNt6+"\ +"bfz+WNdPxM+N8tS/Pz3uZQt5GvVvG78/1vUT9nccP9f2t8ohCO3zhP8h9A8o/0PC/g7t+4T9HfoXlH2e8D+E/gHlf0jY36F9n7C/Q/+Css8T/ofQP6D"\ +"8Dwn7O7TvE/Z36F9Q9nnC/xD6B5T/IWF/h/Z9wv4O/QvKPk/4H0L/gPI/JOzv0L5P2N+hf0HZ5wn/Q+gfUP6HhP0d2vcJ+zv0Lyj7POF/CP0Dyv+QsL"\ +"9D+z5hf4f+BWWfJ/wPoX9A+R8S8XMVo1f5Ayp+r/IHwvnV/tT5EvFzFb9X+QMqfq/yB8L5E/kD4fkS8XMVv1f5Ayp+r/IHVL6Ayh8I10vEz1X8XuUPq"\ +"Pi9yh8I50/kD4TnS8TPVbxe5Q+o+L3KH1B5Aip/IFwnET9X8XuVP6Di9yp/IJw/kT8Qni8RP1fxe5U/oOL3Kn9A5Quo/IFwvUT8XMXvVf6Ait+r/IFw"\ +"/kT+QHg+lZ+fyL8P7XvlP1D2u/IPJN4fhO8LVH5+Iv8+tO9V/n3i/UHoH0i8PwjfF6j8/ET+ffg+QPkPEu8Pwvz+xPuD8H2Bys9P5N+H7wNU/n3i/UG"\ +"Y3594fxC+L1D5+Yn8+9C+V/4DZb8r/0Di/UH4vkDl5yfy78P3ASr/PvH+IMzvT7w/CN8XqPz8RP59+D5A+Q8S7w/C/P7E+4PwfYHKz0/k34f2vcq/T7"\ +"w/CP0DifcH4fuC/wBiGjbi" + + base642img[] \ +"MSBmbG9hdCBsaXR0bGVfZW5kaWFuCjggOCA2NCAxICMyOTE3CnicjVsxjybFEV0JB4iDyHdYhhAJIznBAiSS6ZbBkb3YS4glHOI/4ENyQuDTOsAJIRG"\ +"BEyP7di+6cKo5yZY4J95DmxKChIREYMln5ODo1/OqXd9KU1XZzX37Tc+rqqlX9aq+o6Ojevr+T+rvlh/VH9x6uh716189d79c/un9cue1pwo+O//pu/"\ +"Xhw9/WF/5+Mv62vnet/vzHn5Qb37xe8D189vs//Lr+4i8/G/d5853H6r+/d7d89sGrBffE9/DZP/734jjjN7e+Lp989efy4Jnny6NHj4o9H9e/NOfj3"\ +"zgP98T3cP3u4x+V+3ffKufffr7g7/AsOA/3xDU+++F/bpRXvvxwwT3wnHgWnIdrfA+fPfnFswvw4lx87/y1p6Rft/48rT9Pe+O5+4Jnw/PjjO9/8zqu"\ +"W7dH65hbee8a/m5gw/kPPnhV8D181u3RTt55rOHewI1n+9czz0u/bv1+rX+nvX3rawFePf+sn9+vxZ4PvMANTH/79vO1X0u3R+v2aDcf/0jwPdwbeF/"\ +"68sO1X0t/VunPI5/efUuAF7iB99oXz679Wro9pNtDbvf7Af8bm73HucDf7VDUH8BfNn8LcONvuh2KxgP+7mTztwA3nrvboWg84B5vb/4W4Ab+boei8Q"\ +"D89nzgPzPnA//Nzd8DN/B3OywaD8D/6ebvgRv36XZYNB6A//bm7xW4gb/bYdF4AP4723mtx72YeBjPA/w3NrwN55t4GPbAc3624R0+MfEw7IF7Pdjwt"\ +"v68YuJh2AP49XxgM/Ewzgf+8w1v63Fv42HYA/hf2fAK/s/Ew7AH7v3khlf6fVYTD8MexC/EX4i/8fxK/EL8lfgb8VfiF+KvxN+IvxK/EH8h/kb8lfiF"\ +"+Avxz/OJfyX+QvxC/JX4V+IvxC/EX4h/Jf6F+IX4C+Nf9DzGvzD+GuN/4mX8C+O/Mf4nXsa/MP4b418UL+NfGP+N8T/PZ/zP8xn/Ey/jf2X8C+N/4mX"\ +"8r4x/YfyvipfxvzL+xfgb+a8w/1Xmn2L8jfxXmP8q85/1N/JfYf6rzH/V+Bv5rzD/VeY/62/kv8L8N883/kb+W5j/KvOf9Tfy38L8V5j/ivE38t/C/F"\ +"eY/0b+Z74ddiD/CflHyH9N/U3+a+Q/If819Tf5r5H/hPzX1N/kPyH/Cflvnk/+m+eT/5r6m/wn5L+V/Cfqb/KfkP9W8p+ov8l/K/lvPQr4X/n7+Ap/3"\ +"yN/R/yLd+k6+eain4/rv/bzX+7PhvMt3xG/EP/I1X/sn93p9v9vtzHsiGvaX2j/ybe0f6P9x5m4F95fvKO0n8B+/+w2OiP/efyv+Rp4Lwx/H5O/I/7F"\ +"PfE94H2ixx/eseusRz7u8Qe8mu8Y/7MeQvwDr+ZbfK9f126P2u1R+f41zbd8/2Y9hvcPeIEbeG9v70/B9/AZ3p+I/5W/7xn+7niKxkPEv8D/8ebvBc+"\ +"Pez/BfHyxxb8w/xXmv8L8N84CfubfAtzAj3jSeMDfMf8W5t/K/DvsAvw3N38P3MCPfKjxEPG/8vfxFf5We0T8C/zkn9LjfjHxMOwB/OS/Sv7TeBj2AP"\ +"4bG95Rd5t4GPbAc5N/K/lX42HYA/jPNryV/KnxMOwR8b/y9/EV/ib+kH+JfyH+lfgL8QvxF+IX4q/E34i/EH8j/kr8jfgL8Tfir8TfiH8hfiH+Qvwt4"\ +"n/l73uGvy82eww7RPzL+F8UL+N/YfwXxn9RvIz/wvivjP+Jl/FfGP+V8T/xMv4L478y/idexv/C+C8R/xt/I/9N/mb+C/nX+Bv5b2X+E+a/1fhb2P9M"\ +"PoRfjL8HjzD/NeY/629h/zX5GBiNv0e/w/zXmP8k4n/l7+Mr/E3+k4h/yX9F/U3+W8h/i6132P8K+9/xXpD/qvqb/FfJfwf1Fvvvxv572Jj8V9Xf5L9"\ +"C/lsi/rd8YftvxNPZ1n9PviN+If5RY0f8HfG/5Uvar9B+o3/P6g979UvE/9pvAS/jZ9YT7L9F8x3jf9ZDiP+IvyP+B17Nl3x/Zj2F9yerP+zVLxH/a/"\ +"+NeGH+EOYP7b+F+a8w/xXmv2GXiL8j/sezMH+uzJ/C/DnsktUf9uqXiP+Bn/xx0H+rPfB35L9C/tN4GPaI+Dvi/3PTv5M/NR6GPbL6w179EvE/8a8nV"\ +"/pv4q/EvxC/vg+F+CXi74j/z03/zvqpaD19nfpjRn/Yq18i/tf+W/Ey/teT//ffwvq3sP4trH+HHSL+jvif8b8qXsb/yviXrP6wV79E/G/8Xdg/TD5h"\ +"/63+FvY/kw+RFyL+jvjf+Hth/zT5FHkhqz/s1S8R/9t6wfbf5D/t94r6m/xXyH9LxN8R/9t6if1zYf88+ves/rBXv0T8H+nnmf5b9WrbfyNXnG/1n6v"\ +"/R/ODqP6wej31m4P6I+L/SD/P9t94JupXc56B9yfS/6P5QVR/nJr6g/rdnOdo/+fxf6SfZ/tvvBPULwv1yxEPkf4fzQ+i+uPU1B/Ubyv122b4b5f/I/"\ +"08039Tvz7ov9Uekf4fzQ+i+uOU9cdD1h8mHoY9Iv6P9PNM/835xUH/Tfw6/9jV/6P5QVR/EH8h/nZq6g/khYj/I/08238rXsb/wvgvkf4fzQ+i+uPU1"\ +"B+c31XO75rWPx7/R/p5tv9m/lutno28EOn/0fwgqj+Mv4Xz26nnq/7j8X+kn2f6b51X2P6b/LdE+n80P4jqDzuv4fz+oP5I8P/kO+IX4l8Nfo//3fl9"\ +"gv8n3xF/I34x+D3+d/cXEvwvmu8Y/7MeMvHv8b87v0/wf9N8x/if9ZCJf4//3f2FBP8L89/C/FeY/8TkP4//3fl9gv8b819h/qvMf83kP4//3f2FBP9"\ +"P/Z78p/GwGP7z+N+d3yf4v5H/KvlP46EY/vP4391fSPD/1O9Z/4jWw6b+8fjfnd8n+L+x/qmsf5rWw6b+8fjf3V9I8L+w/l1Y/xbWv2LqX4//3fl9gv"\ +"8b69/C+rey/m2m/vX4391fSPC/+ntl/zP50PQ/Hv+78/sE/6u/hf3P5EPT/3j87+4vJPh/1jvsf4X972r6X4//3fl9gv9nvcP+t7H/FdP/evzv7i8k9"\ +"H93fp7Q/6feTf3jgH8T+r+7P5DQ/6febeuHe6wfEvq/Oz9P6P+Tf6l/zXmI0b88/d/dH0jo/031zgtTPxyzfkjo/+78PKH/T/6l/tmof1ajf3r6v7s/"\ +"kND/G/XPWT9Q/2yqfwb6vzs/T+j/lfp3o/49+dfo357+7+4PJPT/Rv37oH5QeyT0f3d+ntD/K+cfjfOPyb9m/uHp/+7+QEL/b5x/HNQPxB/2/9H8PKH"\ +"/T/7l/Ktx/lXN/MvT/939gYT+3zj/mvUD519N51+B/u/OzxP6/+Rfzj+nHm7mn57+7+4PJPR/9bdcmPqB+S+c/0fz84T+P+cdnH8f8G9C/3f3BxL6/5"\ +"x32PqB/Bf2/xF/Wr7b2f9z5/eJ/T+3fsjoD97+QmL/z+XPy3j/z53fJ/b/3Pohqz/s7S8k9v9c/ryM9//c+X1i/8+tH7L6w97+QmL/z+XPy3j/z53fJ"\ +"/b/3Pohoz94+wuJ/T+XPy/j/T93fp/Y/3Prh4z+4O0vJPb/XP68jPf/3Pl9Yv/PrR+y+sPe/kJi/8/lT+Pvvf0/d36f2P9z64es/rC3v5DY/3P509Y7"\ +"O/t/7vw+sf/n1g8Z/cHbX4j4P5qfZ/vvPf0+0v+j/YGo/ojmF4nf/7nz82z/vaffR/p/tD8Q1R/R/CLx+z93fp7tv/f0+0j/j/YHovojml8kfv/nzs+"\ +"z/feefh/p/9H+QFR/RPOLxO//3Pl5tv/e0+8j/T/aH4jqj2h+kfj9nzs/z/bfe/p9pP9H+wNR/RHNLxK//3Pn59n+e0+/j/T/aH8gqj+i+UXi93/u/D"\ +"zbf+/p95H+H+0PRPVHNL/4DgTd2gQ=" nm[-2,-1] dct,idct # Input DCT quantization matrix. - i[Q] (16,11,10,16,24,40,51,61;12,12,14,19,26,58,60,55;14,13,16,24,40,57,69,56;14,17,22,29,51,87,80,62;18,22,37,56,68,109,103,77;24,35,55,64,81,104,113,92;49,64,78,87,103,121,120,101;72,92,95,98,112,100,103,99) + (16,11,10,16,24,40,51,61;12,12,14,19,26,58,60,55;14,13,16,24,40,57,69,56;14,17,22,29,51,87,80,62;\ + 18,22,37,56,68,109,103,77;24,35,55,64,81,104,113,92;49,64,78,87,103,121,120,101;72,92,95,98,112,100,103,99) f. "const S = $1<50?5000/$1:200-2*$1; max(1,round((S*i+50)/100,1,-1))" + nm. Q # Process images. - repeat {$!-3} l[$>,-3--1] + repeat $!-3 l[$>,-3--1] # Decompose image into luma/chroma l[0] w,h={[w,h]} r {w+(-w%16)},{h+(-h%16)},1,100%,0,3 rgb2ycbcr s c r[-2,-1] 50%,50%,1,1,2 round. endl @@ -30592,9 +38954,9 @@ repeat 3 # Compute DCT of image with 8x8 blocs. [$>] - f[$>] "begin(boundary = 2; res = vector64()); + f[$>] "begin(boundary = 2; ref(vector64(),res)); if (!(x%8) && !(y%8), - src = crop(x,y,8,8); + ref(crop(x,y,8,8),src); for (l = 0, l<8, ++l, for (k = 0, k<8, ++k, off = k + 8*l; res[off] = sum(src*crop(#"$dct",0,0,off,8,8,1)))); draw(#-1,res,x,y,0,0,8,8); ); i" @@ -30604,9 +38966,9 @@ +r[Q] {$>,w},100%,1,1,0,2 /.. . round.. *[-2,-1] # Compute iDCT of 8x8 blocs. - f. "begin(boundary = 2; res = vector64()); + f. "begin(boundary = 2; ref(vector64(),res)); if (!(x%8) && !(y%8), - src = crop(x,y,8,8); + ref(crop(x,y,8,8),src); for (l = 0, l<8, ++l, for (k = 0, k<8, ++k, off = k + 8*l; res[off] = sum(src*crop(#"$idct",0,0,off,8,8,1)))); draw(#"$>",res,x,y,0,0,8,8); ); i" @@ -30623,8 +38985,14 @@ #@gui Lomo : fx_lomo, fx_lomo_preview(1) #@gui : Vignette Size = float(20,0,100) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Authors: Jérome Boulanger and David Tschumperlé. Latest Update: 2012/06/06.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Authors: Jérome Boulanger and David Tschumperlé. +#@gui :       Latest Update: 2012/06/06.") fx_lomo : remove_opacity repeat $! l[$>] to_rgb +gaussian {100-$1}%,{100-$1}% n. 0,1 * @@ -30640,13 +39008,68 @@ fx_lomo_preview : gui_split_preview "fx_lomo $*",${-3--1} +#@gui Mess with Bits : fx_mess_with_bits, fx_mess_with_bits_preview +#@gui : note = note("Input processing:") +#@gui : Pre-Normalize = bool(1) +#@gui : Smoothness (%) = float(15,0,100) +#@gui : Multiplier = int(1,1,256) +#@gui : sep = separator() +#@gui : note = note("Output processing:") +#@gui : Reversing = choice{1,"None","Reverse bits","Reverse bytes"} +#@gui : Bit Masking (Start) = int(0,0,15) +#@gui : Bit Masking (End) = int(15,0,15) +#@gui : Opacity (%) = float(100,0,100) +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2019/01/16.") +fx_mess_with_bits : + ac "_fx_mess_with_bits ${1-7}",$8 + +_fx_mess_with_bits : + repeat $! +l[$>] + b {($2/100)^2*100}% if $1 n 0,255 fi * $3 round + # -> Here, images are 'ushort'-valued. + if $4==1 f "for (k = res = 0, k<15, ++k, res|=((i>>k)&1)<<(15-k))" + elif $4==2 f "res = ((i>>8)&255) | ((i&255)<<8)" + fi + f "begin( mask = (65535>>(15-max($5,$6))) & (65535<] .,0,0,0,0,{$7%} rm. done + +fx_mess_with_bits_preview : + gui_split_preview "fx_mess_with_bits $*",${-3--1} + #@gui Noise [Additive] : fx_noise, fx_noise_preview(0) #@gui : Amplitude = float(10,0,200) #@gui : Noise Type = choice("Gaussian","Uniform","Salt and Pepper","Poisson") -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") #@gui : Value Action = choice(1,"None","Cut","Normalize") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_noise : ac "_fx_noise $1,$2",$3,$4 @@ -30656,13 +39079,77 @@ fx_noise_preview : gui_split_preview "fx_noise $*",${-3--1} +#@gui Noise [Perlin] : fx_noise_perlin, fx_noise_perlin_preview(1) +#@gui : Random Seed = int(0,0,65536) +#@gui : sep = separator() +#@gui : note = note("1st scale:") +#@gui : Amplitude = float(100,0,512) +#@gui : Scale (%) = float(8,0,100) +#@gui : X/Y-Ratio = float(0,-4,4) +#@gui : sep = separator() +#@gui : note = note("2nd scale:") +#@gui : Amplitude = float(0,0,512) +#@gui : Scale (%) = float(4,0,100) +#@gui : X/Y-Ratio = float(0,-4,4) +#@gui : sep = separator() +#@gui : note = note("3rd scale:") +#@gui : Amplitude = float(0,0,512) +#@gui : Scale (%) = float(2,0,100) +#@gui : X/Y-Ratio = float(0,-4,4) +#@gui : sep = separator() +#@gui : note = note("4th scale:") +#@gui : Amplitude = float(0,0,512) +#@gui : Scale (%) = float(1,0,100) +#@gui : X/Y-Ratio = float(0,-4,4) +#@gui : sep = separator() +#@gui : Channel(s) = choice(2,"All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2019/01/24.") +_fx_noise_perlin : + seedx,seedy={[$1>>8,$1&255]} + repeat $! l[$>] + if $2 .,.,1,. noise_perlin. {r=2^$4;s=max(w,h)*$3%;[max(1,s/r),max(1,s*r)]},1,$seedx,$seedy *. $2 + fi + if $5 .,.,1,. noise_perlin. {r=2^$7;s=max(w,h)*$6%;[max(1,s/r),max(1,s*r)]},1,$seedx,$seedy *. $5 + fi + if $8 .,.,1,. noise_perlin. {r=2^$10;s=max(w,h)*$9%;[max(1,s/r),max(1,s*r)]},1,$seedx,$seedy *. $8 + fi + if $11 .,.,1,. noise_perlin. {r=2^$13;s=max(w,h)*$12%;[max(1,s/r),max(1,s*r)]},1,$seedx,$seedy *. $11 + fi + endl done + +fx_noise_perlin : + ac "_fx_noise_perlin $*",$-4,1 + +fx_noise_perlin_preview : + gui_split_preview "fx_noise_perlin $*",${-3--1} + #@gui Noise [Spread] : fx_spread, fx_spread_preview(0) #@gui : X-Variations = float(4,0,20) #@gui : Y-Variations = float(4,0,20) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") #@gui : Value Action = choice("None","Cut","Normalize") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_spread : ac "spread $1,$2",$3,$4 @@ -30671,10 +39158,22 @@ #@gui Old-Movie Stripes : fx_stripes_y, fx_stripes_y_preview(1) #@gui : Frequency = float(10,0,100) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") #@gui : Value Action = choice("None","Cut","Normalize") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_stripes_y : ac "stripes_y $1",$2,$3 @@ -30685,8 +39184,13 @@ #@gui : Scale = float(25,1,100) #@gui : Dithering = float(800,0,10000) #@gui : Levels = int(16,2,256) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/02/11.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/02/11.") fx_8bits : remove_opacity repeat $! l[$>] w={w} h={h} @@ -30703,7 +39207,8 @@ #@gui : note = note{"Sorting parameters:"} #@gui : Order = choice(1,"Decreasing","Increasing") #@gui : Axis = choice("X-axis","Y-axis","X-axis Then Y-axis","Y-axis Then X-axis") -#@gui : Sorting Criterion = choice("Red","Green","Blue","Intensity","Luminance","Lightness","Hue","Saturation","Minimum","Maximum","Random") +#@gui : Sorting Criterion = choice("Red","Green","Blue","Intensity","Luminance","Lightness","Hue", +#@gui : "Saturation","Minimum","Maximum","Random") #@gui : sep = separator() #@gui : note = note{"Masking parameters:"} #@gui : Mask By = choice(1,"Bottom Layer","Criterion","Contours","Random") @@ -30717,27 +39222,28 @@ #@gui : This filter implements one version of the algorithm described here : #@gui : "} #@gui : url = link("http://satyarth.me/articles/pixel-sorting/") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/05/09.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/05/09.") fx_pixelsort : _fx_pixelsort ${1-8},0 _fx_pixelsort : - repeat {$!-($4==0)} l[$>] - if {$3==0} +to_rgb channels. 0 # Red - elif {$3==1} +to_rgb channels. 1 # Green - elif {$3==2} +to_rgb channels. 2 # Blue - elif {$3==3} +compose_channels + # Intensity - elif {$3==4} +luminance # Luminance - elif {$3==5} +to_rgb rgb2hsl. channels. 2 # Lightness - elif {$3==6} +to_rgb rgb2hsl. channels. 0 # Hue - elif {$3==7} +to_rgb rgb2hsl. channels. 1 # Saturation - elif {$3==8} +compose_channels min # Minimum - elif {$3==9} +compose_channels max # Maximum - else 100%,100%,1,1 rand. 0,100 # Random - fi - if {$4==0} pass. 0 norm. - elif {$4==1} . - elif {$4==2} +gradient_norm[0] + repeat $!-($4==0) l[$>] + if $3==0 +to_rgb channels. 0 # Red + elif $3==1 +to_rgb channels. 1 # Green + elif $3==2 +to_rgb channels. 2 # Blue + elif $3==3 +compose_channels + # Intensity + elif $3==4 +luminance # Luminance + elif $3==5 +to_rgb rgb2hsl. channels. 2 # Lightness + elif $3==6 +to_rgb rgb2hsl. channels. 0 # Hue + elif $3==7 +to_rgb rgb2hsl. channels. 1 # Saturation + elif $3==8 +compose_channels min # Minimum + elif $3==9 +compose_channels max # Maximum + else 100%,100%,1,1 rand. 0,100 # Random + fi + if $4==0 pass. 0 norm. + elif $4==1 . + elif $4==2 +gradient_norm[0] else +rand. 0,100 fi b. $7% ir. $5%,{$6+0.01}% @@ -30750,15 +39256,20 @@ fx_pixelsort_preview : _fx_pixelsort $* -#@gui Rain & Snow : fx_rain, fx_rain_preview(0) +#@gui Rain & Snow : fx_rain, fx_rain_preview(0) #@gui : Angle = float(65,-180,180) #@gui : Speed = float(10,0,50) #@gui : Density (%) = float(50,0,100) #@gui : Radius = float(0.1,0,3) #@gui : Gamma = float(1,0,2) #@gui : Opacity = float(1,0,1) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/29/06.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/29/06.") fx_rain : repeat $! l[$<] nm=${-gui_layer_name} 100%,100% l. @@ -30780,10 +39291,22 @@ #@gui : Orientation = choice(1,"Horizontal","Vertical") #@gui : Darkness = float(0.8,0,3) #@gui : Lightness = float(1.3,0,3) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") #@gui : Value Action = choice("None","Cut","Normalize") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_shade_stripes : ac "shade_stripes $1,$2,$3,$4",$5,$6 @@ -30796,10 +39319,22 @@ #@gui : Shape = choice(0,"Bloc","Triangle","Sine","Sine+","Random") #@gui : Angle = float(0,0,360) #@gui : Offset = float(0,0,500) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") #@gui : Value Action = choice("None","Cut","Normalize") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/19/11.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/19/11.") fx_scanlines : ac "scanlines ${1-5}",$6,$7 @@ -30813,9 +39348,21 @@ #@gui : Operator = choice("Add","Mul","And","Or","Xor","Pow","Reverse Pow","Mod","Reverse Mod") #@gui : Shift Point = point(50,50,0,1) #@gui : Boundary = choice(3,"Zero","Nearest","Periodic","Mirror") -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2018/08/19.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2018/08/19.") fx_self_glitching : ac "_fx_self_glitching ${1-7}",$8 @@ -30846,26 +39393,29 @@ #@gui : Step (%) = float(0,0,30) #@gui : Angle = float(0,0,360) #@gui : Propagation = choice(3,"Backward","Forward","Bidirectional [Sharp]","Bidirectional [Smooth]") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2017/12/22.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2017/12/22.") fx_streak : repeat $! l[$>] to_rgba - if {!$4} R,G,B,A=0 else R,G,B,A=${1-4} fi +select_color 0,$R,$G,$B,$A - if {$7==3} srgb2rgb.. fi + if !$4 R,G,B,A=0 else R,G,B,A=${1-4} fi +select_color 0,$R,$G,$B,$A + if $7==3 srgb2rgb.. fi f.. " const step = max(1,$5%*min(w,h)); const angle = $6*pi/180; const dx = step*cos(angle); const dy = step*sin(angle); if (!i(#-1),I, - ixf = xf = x; iyf = yf = y; lf = 0; if ($7>=1, while (i(#-1,ixf=round(xf),iyf=round(yf)), ++lf; xf-=dx; yf-=dy)); # Forward - ixb = xb = x; iyb = yb = y; lb = 0; if ($7!=1, while (i(#-1,ixb=round(xb),iyb=round(yb)), ++lb; xb+=dx; yb+=dy)); # Backward + ixf = xf = x; iyf = yf = y; lf = 0; + if ($7>=1, while (i(#-1,ixf=round(xf),iyf=round(yf)), ++lf; xf-=dx; yf-=dy)); # Forward + ixb = xb = x; iyb = yb = y; lb = 0; + if ($7!=1, while (i(#-1,ixb=round(xb),iyb=round(yb)), ++lb; xb+=dx; yb+=dy)); # Backward $7==0?I(ixb,iyb): $7==1?I(ixf,iyf): $7==2?(lfAuthor: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_watermark_visible : skip "${1= }" watermark_visible "$1",$2,$3,$4,$6,$5 @@ -30890,11 +39441,23 @@ #@gui : Correlated Channels = bool(0) #@gui : Interpolation = choice(1,"Nearest Neighbor","Linear") #@gui : Boundary = choice(3,"Transparent","Nearest","Periodic","Mirror") -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/02/09.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/02/09.") fx_warp_by_intensity : - if {!$7} to_a fi + if !$7 to_a fi ac "_fx_warp_by_intensity ${1-7}",$8 _fx_warp_by_intensity : @@ -30916,26 +39479,44 @@ #@gui : Smoothness = float(0,0,10) #@gui : Smoothness Type = choice(2,"Gaussian","Bilateral","Diffusion") #@gui : Gain = float(0,-4,4) -#@gui : sep = separator(), note = note("Medium scale:") +#@gui : sep = separator() +#@gui : note = note("Medium scale:") #@gui : Threshold = float(0,0,10) #@gui : Smoothness = float(0,0,10) #@gui : Smoothness Type = choice(2,"Gaussian","Bilateral","Diffusion") #@gui : Gain = float(0,-4,4) -#@gui : sep = separator(), note = note("Small scale:") +#@gui : sep = separator() +#@gui : note = note("Small scale:") #@gui : Threshold = float(0,0,10) #@gui : Smoothness = float(0,0,10) #@gui : Smoothness Type = choice(2,"Gaussian","Bilateral","Diffusion") #@gui : Gain = float(0,-4,4) -#@gui : sep = separator(), note = note("Fine scale:") +#@gui : sep = separator() +#@gui : note = note("Fine scale:") #@gui : Threshold = float(0,0,10) #@gui : Smoothness = float(0,0,10) #@gui : Smoothness Type = choice(2,"Gaussian","Bilateral","Diffusion") #@gui : Gain = float(0,-4,4) -#@gui : sep = separator(), Channel(s) = choice(11,"All","RGBA [all]","RGB [all]","RGB [red]","RGB [green]","RGB [blue]","RGBA [alpha]","Linear RGB [all]","Linear RGB [red]","Linear RGB [green]","Linear RGB [blue]","YCbCr [luminance]","YCbCr [blue-red chrominances]","YCbCr [blue chrominance]","YCbCr [red chrominance]","YCbCr [green chrominance]","Lab [lightness]","Lab [ab-chrominances]","Lab [a-chrominance]","Lab [b-chrominance]","Lch [ch-chrominances]","Lch [c-chrominance]","Lch [h-chrominance]","HSV [hue]","HSV [saturation]","HSV [value]","HSI [intensity]","HSL [lightness]","CMYK [cyan]","CMYK [magenta]","CMYK [yellow]","CMYK [key]","YIQ [luma]","YIQ [chromas]") +#@gui : sep = separator() +#@gui : Channel(s) = choice(11,"All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") #@gui : Value Action = choice("None","Cut","Normalize") -#@gui : sep = separator(), Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads","Sixteen Threads"), Spatial Overlap = int(32,0,256) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: Jérome Boulanger and David Tschumperlé. Latest Update: 2015/11/11.") +#@gui : sep = separator() +#@gui : Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads", +#@gui : "Sixteen Threads"), Spatial Overlap = int(32,0,256) +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: Jérome Boulanger and David Tschumperlé. +#@gui :       Latest Update: 2015/11/11.") _fx_equalize_details : repeat $! l[$>] split_details 5,{max(0.1,$1)},{max(0.1,$2)} @@ -30948,11 +39529,11 @@ __fx_equalize_details : threshold $1,1 - if {$3==0} b {$2*$5/2} - elif {$3==1} - if {$2>0} + if $3==0 b {$2*$5/2} + elif $3==1 + if $2>0 m={im} M={iM} n. 0,255 - repeat {int($2/5)} bilateral 15,{5*$5} done + repeat int($2/5) bilateral 15,{5*$5} done bilateral 15,{($2%5)*$5} *. {($M-$m)/255} +. $m fi @@ -30972,9 +39553,21 @@ #@gui : Sigma = float(100,0,256) #@gui : Regularization = float(8,0,32) #@gui : Reduce Halos = bool(1) -#@gui : sep = separator(), Channel(s) = choice(16,"All","RGBA [all]","RGB [all]","RGB [red]","RGB [green]","RGB [blue]","RGBA [alpha]","Linear RGB [all]","Linear RGB [red]","Linear RGB [green]","Linear RGB [blue]","YCbCr [luminance]","YCbCr [blue-red chrominances]","YCbCr [blue chrominance]","YCbCr [red chrominance]","YCbCr [green chrominance]","Lab [lightness]","Lab [ab-chrominances]","Lab [a-chrominance]","Lab [b-chrominance]","Lch [ch-chrominances]","Lch [c-chrominance]","Lch [h-chrominance]","HSV [hue]","HSV [saturation]","HSV [value]","HSI [intensity]","HSL [lightness]","CMYK [cyan]","CMYK [magenta]","CMYK [yellow]","CMYK [key]","YIQ [luma]","YIQ [chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2018/01/31.") +#@gui : sep = separator() +#@gui : Channel(s) = choice(16,"All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2018/01/31.") fx_equalize_local_histograms : b0="normal" b1="overlay" b2="softlight" repeat $! l[$>] @@ -30989,16 +39582,16 @@ const boundary = 1; const N = $3; const sigma = ($6?1:-1)*(0.1+$4); - weights = vector512(); + ref(vector512(),weights); for (k = 0, k=0?exp(-sqr(k/sigma)):1 - exp(-sqr(k/sigma)) ); ); - bins = vector512(0); + ref(vector512(0),bins); for (c = 0, cAuthors: David Tschumperlé and Patrick David. Latest Update: 2013/27/02.") -#@gui : sep = separator(), note = note("This effect has been done following:") -#@gui : url = link("This tutorial from Patrick David","http://blog.patdavid.net/2013/02/calvin-hollywood-freaky-details-in-gimp.html") +#@gui : sep = separator() +#@gui : Channel(s) = choice(11,"All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads", +#@gui : "Sixteen Threads"), Spatial Overlap = int(32,0,256) +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Authors: David Tschumperlé and Patrick David. +#@gui :       Latest Update: 2013/27/02.") +#@gui : sep = separator() +#@gui : note = note("This effect has been done following:") +#@gui : url = link("This tutorial from Patrick David", +#@gui : "http://blog.patdavid.net/2013/02/calvin-hollywood-freaky-details-in-gimp.html") _fx_freaky_details : repeat $! l[$>] repeat $3 @@ -31058,9 +39668,21 @@ #@gui : Neighborhood Smoothness = float(5,0,40) #@gui : Average Smoothness = float(20,0,40) #@gui : Constrain Values = bool(1) -#@gui : sep = separator(), Channel(s) = choice(11,"All","RGBA [all]","RGB [all]","RGB [red]","RGB [green]","RGB [blue]","RGBA [alpha]","Linear RGB [all]","Linear RGB [red]","Linear RGB [green]","Linear RGB [blue]","YCbCr [luminance]","YCbCr [blue-red chrominances]","YCbCr [blue chrominance]","YCbCr [red chrominance]","YCbCr [green chrominance]","Lab [lightness]","Lab [ab-chrominances]","Lab [a-chrominance]","Lab [b-chrominance]","Lch [ch-chrominances]","Lch [c-chrominance]","Lch [h-chrominance]","HSV [hue]","HSV [saturation]","HSV [value]","HSI [intensity]","HSL [lightness]","CMYK [cyan]","CMYK [magenta]","CMYK [yellow]","CMYK [key]","YIQ [luma]","YIQ [chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Channel(s) = choice(11,"All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_normalize_local : repeat $! l[$>] ac "normalize_local $1,$2,$3,$4,$5,0,255",$6 @@ -31076,9 +39698,21 @@ #@gui : Overlap (%) = float(50,0,75) #@gui : Regularization (%) = float(20,0,100) #@gui : Process Channels Individually = bool(0) -#@gui : sep = separator(), Channel(s) = choice(7,"All","RGBA [all]","RGB [all]","RGB [red]","RGB [green]","RGB [blue]","RGBA [alpha]","Linear RGB [all]","Linear RGB [red]","Linear RGB [green]","Linear RGB [blue]","YCbCr [luminance]","YCbCr [blue-red chrominances]","YCbCr [blue chrominance]","YCbCr [red chrominance]","YCbCr [green chrominance]","Lab [lightness]","Lab [ab-chrominances]","Lab [a-chrominance]","Lab [b-chrominance]","Lch [ch-chrominances]","Lch [c-chrominance]","Lch [h-chrominance]","HSV [hue]","HSV [saturation]","HSV [value]","HSI [intensity]","HSL [lightness]","CMYK [cyan]","CMYK [magenta]","CMYK [yellow]","CMYK [key]","YIQ [luma]","YIQ [chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2018/02/28.") +#@gui : sep = separator() +#@gui : Channel(s) = choice(7,"All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2018/02/28.") fx_local_processing : com0="n 0,255" com1="equalize 256,0,255 n 0,255" @@ -31100,9 +39734,21 @@ #@gui : Value Scale = float(15,0,20) #@gui : Edges = float(-0.5,-3,3) #@gui : Smoothness = float(2,0,20) -#@gui : sep = separator(), Channel(s) = choice(27,"All","RGBA [all]","RGB [all]","RGB [red]","RGB [green]","RGB [blue]","RGBA [alpha]","Linear RGB [all]","Linear RGB [red]","Linear RGB [green]","Linear RGB [blue]","YCbCr [luminance]","YCbCr [blue-red chrominances]","YCbCr [blue chrominance]","YCbCr [red chrominance]","YCbCr [green chrominance]","Lab [lightness]","Lab [ab-chrominances]","Lab [a-chrominance]","Lab [b-chrominance]","Lch [ch-chrominances]","Lch [c-chrominance]","Lch [h-chrominance]","HSV [hue]","HSV [saturation]","HSV [value]","HSI [intensity]","HSL [lightness]","CMYK [cyan]","CMYK [magenta]","CMYK [yellow]","CMYK [key]","YIQ [luma]","YIQ [chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2018/01/10.") +#@gui : sep = separator() +#@gui : Channel(s) = choice(27,"All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2018/01/10.") fx_magic_details : ac "_fx_magic_details ${1-5}",$6,1 @@ -31123,9 +39769,21 @@ #@gui : Details Amount = float(1,0,2) #@gui : Details Scale = float(25,1,100) #@gui : Details Smoothness = int(1,0,10) -#@gui : sep = separator(), Channel(s) = choice(11,"All","RGBA [all]","RGB [all]","RGB [red]","RGB [green]","RGB [blue]","RGBA [alpha]","Linear RGB [all]","Linear RGB [red]","Linear RGB [green]","Linear RGB [blue]","YCbCr [luminance]","YCbCr [blue-red chrominances]","YCbCr [blue chrominance]","YCbCr [red chrominance]","YCbCr [green chrominance]","Lab [lightness]","Lab [ab-chrominances]","Lab [a-chrominance]","Lab [b-chrominance]","Lch [ch-chrominances]","Lch [c-chrominance]","Lch [h-chrominance]","HSV [hue]","HSV [saturation]","HSV [value]","HSI [intensity]","HSL [lightness]","CMYK [cyan]","CMYK [magenta]","CMYK [yellow]","CMYK [key]","YIQ [luma]","YIQ [chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/08/08.") +#@gui : sep = separator() +#@gui : Channel(s) = choice(11,"All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/08/08.") _fx_mighty_details : +smooth $3,0,1,0.5,0.5 -[1] [0] +abs. sign.. M={iM} ^. {2-$2} *. {$M/iM} *[-2,-1] @@ -31146,10 +39804,24 @@ #@gui : Time Step = float(20,0,50) #@gui : Smoothness = float(0.1,0,10) #@gui : Regularization = choice(1,"Tikhonov","Mean Curvature","Total Variation") -#@gui : sep = separator(), Channel(s) = choice(11,"All","RGBA [all]","RGB [all]","RGB [red]","RGB [green]","RGB [blue]","RGBA [alpha]","Linear RGB [all]","Linear RGB [red]","Linear RGB [green]","Linear RGB [blue]","YCbCr [luminance]","YCbCr [blue-red chrominances]","YCbCr [blue chrominance]","YCbCr [red chrominance]","YCbCr [green chrominance]","Lab [lightness]","Lab [ab-chrominances]","Lab [a-chrominance]","Lab [b-chrominance]","Lch [ch-chrominances]","Lch [c-chrominance]","Lch [h-chrominance]","HSV [hue]","HSV [saturation]","HSV [value]","HSI [intensity]","HSL [lightness]","CMYK [cyan]","CMYK [magenta]","CMYK [yellow]","CMYK [key]","YIQ [luma]","YIQ [chromas]") -#@gui : sep = separator(), Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads","Sixteen Threads"), Spatial Overlap = int(24,0,256) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Channel(s) = choice(11,"All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads", +#@gui : "Sixteen Threads"), Spatial Overlap = int(24,0,256) +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_deblur : ac "gui_parallel_overlap \"deblur ${1-5} c 0,255\",$7,$8",$6,1 @@ -31162,10 +39834,24 @@ #@gui : Acceleration = float(1,1,3) #@gui : Blur = choice(1,"Exponential","Gaussian") #@gui : Cut = bool(true) -#@gui : sep = separator(), Channel(s) = choice(11,"All","RGBA [all]","RGB [all]","RGB [red]","RGB [green]","RGB [blue]","RGBA [alpha]","Linear RGB [all]","Linear RGB [red]","Linear RGB [green]","Linear RGB [blue]","YCbCr [luminance]","YCbCr [blue-red chrominances]","YCbCr [blue chrominance]","YCbCr [red chrominance]","YCbCr [green chrominance]","Lab [lightness]","Lab [ab-chrominances]","Lab [a-chrominance]","Lab [b-chrominance]","Lch [ch-chrominances]","Lch [c-chrominance]","Lch [h-chrominance]","HSV [hue]","HSV [saturation]","HSV [value]","HSI [intensity]","HSL [lightness]","CMYK [cyan]","CMYK [magenta]","CMYK [yellow]","CMYK [key]","YIQ [luma]","YIQ [chromas]") -#@gui : sep = separator(), Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads","Sixteen Threads"), Spatial Overlap = int(24,0,256) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: Jérôme Boulanger. Latest Update: 2013/29/03.") +#@gui : sep = separator() +#@gui : Channel(s) = choice(11,"All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads", +#@gui : "Sixteen Threads"), Spatial Overlap = int(24,0,256) +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: Jérôme Boulanger.      Latest Update: 2013/29/03.") fx_unsharp_goldmeinel: ac "gui_parallel_overlap \"_fx_unsharp_goldmeinel $*\",$7,$8",$6,1 @@ -31179,25 +39865,94 @@ #@gui Sharpen [Inverse Diffusion] : fx_sharpen_inversediff, fx_sharpen_inversediff_preview(0) #@gui : Amplitude = float(50,1,300) #@gui : Iterations = int(2,1,10) -#@gui : sep = separator(), Channel(s) = choice(11,"All","RGBA [all]","RGB [all]","RGB [red]","RGB [green]","RGB [blue]","RGBA [alpha]","Linear RGB [all]","Linear RGB [red]","Linear RGB [green]","Linear RGB [blue]","YCbCr [luminance]","YCbCr [blue-red chrominances]","YCbCr [blue chrominance]","YCbCr [red chrominance]","YCbCr [green chrominance]","Lab [lightness]","Lab [ab-chrominances]","Lab [a-chrominance]","Lab [b-chrominance]","Lch [ch-chrominances]","Lch [c-chrominance]","Lch [h-chrominance]","HSV [hue]","HSV [saturation]","HSV [value]","HSI [intensity]","HSL [lightness]","CMYK [cyan]","CMYK [magenta]","CMYK [yellow]","CMYK [key]","YIQ [luma]","YIQ [chromas]") -#@gui : sep = separator(), Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads","Sixteen Threads"), Spatial Overlap = int(24,0,256) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Channel(s) = choice(11,"All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_sharpen_inversediff : - ac "gui_parallel_overlap \"repeat $2 sharpen $1 c 0,255 done\",$4,$5",$3,1 + ac "repeat $2 sharpen $1 c 0,255 done",$3,1 fx_sharpen_inversediff_preview : gui_split_preview "fx_sharpen_inversediff $*",${-3--1} +#@gui Sharpen [Multiscale] : fx_sharpen_multiscale, fx_sharpen_multiscale_preview(0) +#@gui : Strength (%) = float(15,0,100) +#@gui : Regularity (%) = float(20,0,100) +#@gui : sep = separator() +#@gui : Channel(s) = choice(11,"All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2020/01/14.") +fx_sharpen_multiscale : + ac "_fx_sharpen_multiscale $1,$2",$3 + +fx_sharpen_multiscale_preview : + gui_split_preview "fx_sharpen_multiscale $*",${-3--1} + +_fx_sharpen_multiscale : + repeat $! l[$>] + N={max(1,int(log2(min(w,h))-2))} + +l repeat $N +r. 50%,50%,1,100%,2 +r. ..,..,1,100%,5 -[-3,-1] done endl # Decompose + guided[0] 4,100 # Smooth guide image + + # Process each scale. + repeat $!-1 l[0,{$>+1}] + +r[0] [1],2 + +equalize.. 1024 + bilateral. ..,{2*$2%},100 + j[1] .,0,0,0,0,{$1%} + k[0,1] + endl done + rm[0] + + repeat $!-1 r. ..,..,1,100%,5 +[-2,-1] done # Recompose + c 0,255 + endl done + #@gui Sharpen [Octave Sharpening] : fx_unsharp_octave, fx_unsharp_octave_preview(0) #@gui : Scales = int(4,1,10) #@gui : Maximal Radius = float(5,0,20) #@gui : Amount = float(3,0,10) #@gui : Threshold = float(0,0,255) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads","Sixteen Threads"), Spatial Overlap = int(24,0,256) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Parallel Processing = choice(1,"Auto","One Thread","Two Threads","Four Threads","Eight Threads", +#@gui : "Sixteen Threads"), Spatial Overlap = int(24,0,256) +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_unsharp_octave : ac "gui_parallel_overlap \"unsharp_octave $1,$2,$3,$4\",$6,$7",$5,1 @@ -31209,8 +39964,13 @@ #@gui : Iterations = int(10,1,100) #@gui : Blur = choice(1,"Exponential","Gaussian") #@gui : Cut = bool(true) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: Jérôme Boulanger. Latest Update: 2013/29/03.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: Jérôme Boulanger.      Latest Update: 2013/29/03.") fx_unsharp_richardsonlucy : deblur_richardsonlucy $* if $4 c 0,255 else n 0,255 fi @@ -31224,12 +39984,23 @@ #@gui : Gradient Smoothness = float(0.8,0,10) #@gui : Tensor Smoothness = float(1.1,0,10) #@gui : Iterations = int(1,1,10) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads","Sixteen Threads"), Spatial Overlap = int(24,0,256) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_sharpen_shock : - ac "gui_parallel_overlap \"repeat $5 sharpen $1,$2,$3,$4 c 0,255 done\",$7,$8",$6,1 + ac "repeat $5 sharpen $1,$2,$3,$4 c 0,255 done",$6,1 fx_sharpen_shock_preview : gui_split_preview "fx_sharpen_shock $*",${-3--1} @@ -31237,9 +40008,21 @@ #@gui Sharpen [Texture] : fx_sharpen_texture, fx_sharpen_texture_preview(0) #@gui : Strength = float(1,0,4) #@gui : Radius = float(4,0,32) -#@gui : sep = separator(), Channel(s) = choice(16,"All","RGBA [all]","RGB [all]","RGB [red]","RGB [green]","RGB [blue]","RGBA [alpha]","Linear RGB [all]","Linear RGB [red]","Linear RGB [green]","Linear RGB [blue]","YCbCr [luminance]","YCbCr [blue-red chrominances]","YCbCr [blue chrominance]","YCbCr [red chrominance]","YCbCr [green chrominance]","Lab [lightness]","Lab [ab-chrominances]","Lab [a-chrominance]","Lab [b-chrominance]","Lch [ch-chrominances]","Lch [c-chrominance]","Lch [h-chrominance]","HSV [hue]","HSV [saturation]","HSV [value]","HSI [intensity]","HSL [lightness]","CMYK [cyan]","CMYK [magenta]","CMYK [yellow]","CMYK [key]","YIQ [luma]","YIQ [chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/20/09.") +#@gui : sep = separator() +#@gui : Channel(s) = choice(16,"All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/20/09.") fx_sharpen_texture : ac "_fx_sharpen_texture ${1-2}",$3,1 @@ -31261,15 +40044,27 @@ #@gui : Lightness Level = float(1,0,4) #@gui : Iterations = int(1,1,10) #@gui : Negative Effect = bool(0) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 #@gui : note = note{"\n\nNote: #@gui : This filter is inspired by the original GIMP Unsharp Mask filter, with additional parameters. #@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") _fx_unsharp : repeat $! repeat $8 - if {$1==0} +b. $2 else +bilateral. $2,$3 fi + if $1==0 +b. $2 else +bilateral. $2,$3 fi -. .. *. -$4 +norm. >=. $5% r. .. *[-2,-1] if $9 *. -1 fi @@ -31290,11 +40085,12 @@ #@gui : Opacity Gain = float(5,1,20) #@gui : sep = separator() #@gui : Preview Without Alpha = bool(0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/22/04.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/22/04.") fx_split_details_alpha : remove_opacity repeat $! l[$<] - repeat {$1-1} + repeat $1-1 s={$3+($2-$3)*$>/if($1-2>0,$1-2,1)} +_fx_split_details_alpha_blur. $s sub_alpha.. .,$4 @@ -31302,9 +40098,9 @@ endl done _fx_split_details_alpha_blur : - if {$1>=0.1} b. $1 + if $1>=0.1 b. $1 else - if {$1>=0.05} (1,4,7,4,1;4,16,26,16,4;7,26,41,26,7;4,16,26,16,4;1,4,7,4,1) + if $1>=0.05 (1,4,7,4,1;4,16,26,16,4;7,26,41,26,7;4,16,26,16,4;1,4,7,4,1) else (1,2,1;2,4,2;1,2,1) fi normalize_sum. convolve.. . rm. fi @@ -31322,15 +40118,17 @@ #@gui : Number of Scales = int(6,3,12) #@gui : Base Scale = float(10,0,200) #@gui : Details Scale = float(1,0,20) -#@gui : sep = separator(), Sharpen details in preview = bool(0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/22/01.") +#@gui : sep = separator() +#@gui : Sharpen Details in Preview = bool(0) +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/22/01.") fx_split_details_gaussian : remove_opacity repeat $! l[$>] nm=${-gui_layer_name} pos=${-gui_layer_pos} split_details $1,$2,$3 +[^0] 128 c[^0] 0,255 round - repeat {$!-1} nm[{1+$>}] "mode(grainmerge), name"($nm" [scale ""#"{1+$>}"]), pos("$pos")" done + repeat $!-1 nm[{1+$>}] "mode(grainmerge), name"($nm" [scale ""#"{1+$>}"]), pos("$pos")" done nm[0] "name"($nm" [residual]), pos("$pos")" rv endl done @@ -31340,711 +40138,110 @@ fx_split_details_gaussian $* if $4 equalize[^-1] 256 fi n[^-1] 0,255 N={int(sqrt($!))} N={round($!/$N,1,1)} r2dy {100/$N}% - repeat $! l[$>] 0 text. "#"{1+$>}" ",1,1,24,1,255 +dilate. 5 to_rgba[1] j[0] [1],2,0,0,0,1,[2],255 k[0] endl done - to_rgba frame 1,1,0 frame 3,3,255 append_tiles , - endl done - -#@gui Split Details [Wavelets] : fx_split_details_wavelets, fx_split_details_wavelets_preview(0) -#@gui : Number of Scales = int(6,2,12) -#@gui : Add Alpha Channels to Detail Scale Layers = _bool(0) -#@gui : sep = separator(), Sharpen Details in Preview = bool(0) -#@gui : sep = separator() -#@gui : note = note{"Note: This filter decomposes an image into several detail scales, using wavelet atrous. -#@gui : It should provide similar results to the -#@gui : Wavelet Decompose Plug-in -#@gui : (by Marco Rossini). -#@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/23/03.") -fx_split_details_wavelets : - remove_opacity repeat $! l[$>] - nm=${-gui_layer_name} - pos=${-gui_layer_pos} - split_details $1,0,0 rv +[^-1] 128 c[^-1] 0,255 round - if $2 to_a[^-1] fi - repeat {$!-1} nm[$>] "mode(grainmerge), name"($nm" [scale ""#"{1+$>}"]), pos("$pos")" done - nm. "name"($nm" [residual]), pos("$pos")" - endl done - -fx_split_details_wavelets_preview : - repeat $! l[$>] - fx_split_details_wavelets $1,0 - if $3 equalize[^-1] 256 fi n[^-1] 0,255 - N={int(sqrt($!))} N={round($!/$N,1,1)} r2dy {100/$N}% - repeat $! l[$>] 0 text. "#"{1+$>}" ",1,1,24,1,255 +dilate. 5 to_rgba[1] j[0] [1],2,0,0,0,1,[2],255 k[0] endl done - to_rgba frame 1,1,0 frame 3,3,255 append_tiles , - endl done - -#@gui Tone Mapping : fx_map_tones, fx_map_tones_preview(0) -#@gui : Threshold = float(0.5,0,1) -#@gui : Gamma = float(0.7,0,1) -#@gui : Smoothness = float(0.1,0,10) -#@gui : Iterations = int(30,0,500) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") -fx_map_tones : - ac "map_tones ${1-4}",$5,1 - n 0,255 - -fx_map_tones_preview : - gui_split_preview "fx_map_tones $*",${-3--1} - -#@gui Tone Mapping [Fast] : fx_map_tones_fast, fx_map_tones_fast_preview(0) -#@gui : Radius = float(3,0,20) -#@gui : Power = float(0.5,0,1) -#@gui : sep = separator(), Channel(s) = choice(11,"All","RGBA [all]","RGB [all]","RGB [red]","RGB [green]","RGB [blue]","RGBA [alpha]","Linear RGB [all]","Linear RGB [red]","Linear RGB [green]","Linear RGB [blue]","YCbCr [luminance]","YCbCr [blue-red chrominances]","YCbCr [blue chrominance]","YCbCr [red chrominance]","YCbCr [green chrominance]","Lab [lightness]","Lab [ab-chrominances]","Lab [a-chrominance]","Lab [b-chrominance]","Lch [ch-chrominances]","Lch [c-chrominance]","Lch [h-chrominance]","HSV [hue]","HSV [saturation]","HSV [value]","HSI [intensity]","HSL [lightness]","CMYK [cyan]","CMYK [magenta]","CMYK [yellow]","CMYK [key]","YIQ [luma]","YIQ [chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Authors: Paul Nasca and David Tschumperlé. Latest Update: 2011/10/06.") -fx_map_tones_fast : - ac "map_tones_fast $1,$2",$3,2 - -fx_map_tones_fast_preview : - gui_split_preview "fx_map_tones_fast ${^0}",${-3--1} - -#@gui ____Film Emulation -#------------------------------ - -#@gui Add Grain : fx_emulate_grain, fx_emulate_grain_preview(0) -#@gui : Preset = choice{"Orwo NP20-GDR","Kodak TMAX 400","Kodak TMAX 3200","Kodak TRI-X 1600","Unknown"} -#@gui : Blend Mode = choice(1,"Alpha","Grain Merge","Hard Light","Overlay","Soft Light","Grain Only") -#@gui : Opacity = float(0.2,0,1) -#@gui : Scale = float(100,30,200) -#@gui : Colored Grain = bool() -#@gui : sep = separator() -#@gui : Brightness (%) = float(0,-100,100) -#@gui : Contrast (%) = float(0,-100,100) -#@gui : Gamma (%) = float(0,-100,100) -#@gui : Hue (%) = float(0,-100,100) -#@gui : Saturation (%) = float(0,-100,100) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") -#@gui : Preview Grain Alone = bool() -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/02/08.") -fx_emulate_grain : - __fx_emulate_grain ${arg\ {1+$1},${-_fx_emulate_grain}},${2-10},0,0 - -_fx_emulate_grain : - u grain_orwo_np20,grain_kodak_tmax400,grain_kodak_tmax3200,grain_kodak_trix1600,grain_unknown - -fx_emulate_grain_preview : - gui_split_preview "_fx_emulate_grain_preview $*",$-2 - -_fx_emulate_grain_preview : - __fx_emulate_grain ${arg\ {1+$1},${-_fx_emulate_grain}},${2-12} - -__fx_emulate_grain : - bm0=alpha bm1=grainmerge bm2=hardlight bm3=overlay bm4=softlight bm5=alpha - if ${_path_rc}$1.cimgz i ${_path_rc}$1.cimgz - else i https://gmic.eu/data_film_presets/$1.cimgz o. ${_path_rc}$1.cimgz - fi - - repeat {$!-1} l[$>,-1] split_opacity[0] - +syntexturize. {0,max(10,100*w/$4)},{0,max(10,100*h/$4)} - if $5 +syntexturize.. {w},{h} +syntexturize... {w},{h} a[-3--1] c fi - r. {0,w},{0,h},1,100%,5 c. 0,255 - adjust_colors. ${6-10} - if $12 k[0,-1] rv - else blend[0,-1] ${bm$2},{if($2<=4,$3,1)} - fi - a[^-1] c endl done rm. - -#@gui B&W Films : fx_emulate_film_bw, fx_emulate_film_bw_preview(1)+ -#@gui : Preset = choice{"None", -#@gui : "Agfa APX 100","Agfa APX 25","Fuji Neopan 1600","Fuji Neopan Acros 100","Ilford Delta 100","Ilford Delta 3200","Ilford Delta 400","Ilford FP4 Plus 125", -#@gui : "Ilford HP5 Plus 400","Ilford HPS 800","Ilford Pan F Plus 50","Ilford XP2","Kodak BW 400 CN","Kodak HIE (HS Infra)","Kodak T-Max 100","Kodak T-Max 3200", -#@gui : "Kodak T-Max 400","Kodak Tri-X 400","Polaroid 664","Polaroid 667","Polaroid 672","Rollei IR 400","Rollei Ortho 25","Rollei Retro 100 Tonal","Rollei Retro 80s"} -#@gui : sep = separator() -#@gui : Strength (%) = float(100,0,100) -#@gui : Brightness (%) = float(0,-100,100) -#@gui : Contrast (%) = float(0,-100,100) -#@gui : Gamma (%) = float(0,-100,100) -#@gui : Hue (%) = float(0,-100,100) -#@gui : Saturation (%) = float(0,-100,100) -#@gui : Normalize Colors = choice("None","Pre-Process","Post-Process","Both") -#@gui : sep = separator() -#@gui : Pseudo-Gray Dithering = int(0,0,5) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Note: The color LUTs used in this section have been designed by Patrick David. More info at:") -#@gui : url = link{"Film Emulation Presets in G'MIC","https://gmic.eu/film_emulation/index.shtml"} -#@gui : sep = separator(), note = note("Authors: Patrick David and David Tschumperlé. Latest Update: 2016/02/08.") -fx_emulate_film_bw : - _fx_emulate_film $1,${arg\ {max(1,$1)},${-_$0}},${2--1} - if {$1" && "$9} to_pseudogray $9,1 fi - -_fx_emulate_film_bw : - u agfa_apx_100,agfa_apx_25,fuji_neopan_1600,fuji_neopan_acros_100,ilford_delta_100,ilford_delta_3200,ilford_delta_400,ilford_fp4_plus_125,\ - ilford_hp5_plus_400,ilford_hps_800,ilford_pan_f_plus_50,ilford_xp2,kodak_bw_400_cn,kodak_hie_(hs_infra),kodak_t-max_100,kodak_t-max_3200,\ - kodak_t-max_400,kodak_tri-x_400,polaroid_664,polaroid_667,polaroid_672,rollei_ir_400,rollei_ortho_25,rollei_retro_100_tonal,rollei_retro_80s - -fx_emulate_film_bw_preview : - gui_split_preview "fx_emulate_film_bw $*",${-3--1} - -#@gui Fuji Xtrans : fx_emulate_film_fujixtransii, fx_emulate_film_fujixtransii_preview(1)+ -#@gui : Preset = choice{"None", -#@gui : "Astia","Classic Chrome","Pro Neg Hi","Pro Neg Std","Provia","Velvia"} -#@gui : sep = separator() -#@gui : Strength (%) = float(100,0,100) -#@gui : Brightness (%) = float(0,-100,100) -#@gui : Contrast (%) = float(0,-100,100) -#@gui : Gamma (%) = float(0,-100,100) -#@gui : Hue (%) = float(0,-100,100) -#@gui : Saturation (%) = float(0,-100,100) -#@gui : Normalize Colors = choice("None","Pre-Process","Post-Process","Both") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Note: The color LUTs used in this section have been designed by Stuart Sowerby. More info at:") -#@gui : url = link{"Fuji Film Simulation Profiles","http://blog.sowerby.me/fuji-film-simulation-profiles"} -#@gui : sep = separator(), note = note("Authors: Stuart Sowerby and David Tschumperlé. Latest Update: 2017/13/01.") -fx_emulate_film_fujixtransii : - _fx_emulate_film $1,${arg\ {max(1,$1)},${-_$0}},${2--1} - -_fx_emulate_film_fujixtransii : - u fuji_xtrans_ii_astia_v2,fuji_xtrans_ii_classic_chrome_v1,fuji_xtrans_ii_pro_neg_hi_v2,fuji_xtrans_ii_pro_neg_std_v2,\ - fuji_xtrans_ii_provia_v2,fuji_xtrans_ii_velvia_v2 - -fx_emulate_film_fujixtransii_preview : - gui_split_preview "fx_emulate_film_fujixtransii $*",${-3--1} - -#@gui Instant [Consumer] : fx_emulate_film_instant_consumer, fx_emulate_film_instant_consumer_preview(1)+ -#@gui : Preset = choice{"None", -#@gui : "Polaroid PX-100UV+ Cold --","Polaroid PX-100UV+ Cold -","Polaroid PX-100UV+ Cold","Polaroid PX-100UV+ Cold +","Polaroid PX-100UV+ Cold ++","Polaroid PX-100UV+ Cold +++", -#@gui : "Polaroid PX-100UV+ Warm --","Polaroid PX-100UV+ Warm -","Polaroid PX-100UV+ Warm","Polaroid PX-100UV+ Warm +","Polaroid PX-100UV+ Warm ++","Polaroid PX-100UV+ Warm +++", -#@gui : "Polaroid PX-680 --","Polaroid PX-680 -","Polaroid PX-680","Polaroid PX-680 +","Polaroid PX-680 ++", -#@gui : "Polaroid PX-680 Cold --","Polaroid PX-680 Cold -","Polaroid PX-680 Cold","Polaroid PX-680 Cold +","Polaroid PX-680 Cold ++","Polaroid PX-680 Cold ++a", -#@gui : "Polaroid PX-680 Warm --","Polaroid PX-680 Warm -","Polaroid PX-680 Warm","Polaroid PX-680 Warm +","Polaroid PX-680 Warm ++", -#@gui : "Polaroid PX-70 --","Polaroid PX-70 -","Polaroid PX-70","Polaroid PX-70 +","Polaroid PX-70 ++","Polaroid PX-70 +++", -#@gui : "Polaroid PX-70 Cold --","Polaroid PX-70 Cold -","Polaroid PX-70 Cold","Polaroid PX-70 Cold +","Polaroid PX-70 Cold ++", -#@gui : "Polaroid PX-70 Warm --","Polaroid PX-70 Warm -","Polaroid PX-70 Warm","Polaroid PX-70 Warm +","Polaroid PX-70 Warm ++", -#@gui : "Polaroid Time Zero (Expired) ---","Polaroid Time Zero (Expired) --","Polaroid Time Zero (Expired) -","Polaroid Time Zero (Expired)","Polaroid Time Zero (Expired) +","Polaroid Time Zero (Expired) ++", -#@gui : "Polaroid Time Zero (Expired) Cold ---","Polaroid Time Zero (Expired) Cold --","Polaroid Time Zero (Expired) Cold -","Polaroid Time Zero (Expired) Cold"} -#@gui : sep = separator() -#@gui : Strength (%) = float(100,0,100) -#@gui : Brightness (%) = float(0,-100,100) -#@gui : Contrast (%) = float(0,-100,100) -#@gui : Gamma (%) = float(0,-100,100) -#@gui : Hue (%) = float(0,-100,100) -#@gui : Saturation (%) = float(0,-100,100) -#@gui : Normalize Colors = choice("None","Pre-Process","Post-Process","Both") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Note: The color LUTs used in this section have been designed by Patrick David. More info at:") -#@gui : url = link{"Film Emulation Presets in G'MIC","https://gmic.eu/film_emulation/index.shtml"} -#@gui : sep = separator(), note = note("Authors: Patrick David and David Tschumperlé. Latest Update: 2016/02/08.") -fx_emulate_film_instant_consumer : - _fx_emulate_film $1,${arg\ {max(1,$1)},${-_$0}},${2--1} - -_fx_emulate_film_instant_consumer : - u polaroid_px-100uv+_cold_--,polaroid_px-100uv+_cold_-,polaroid_px-100uv+_cold,polaroid_px-100uv+_cold_+,polaroid_px-100uv+_cold_++,polaroid_px-100uv+_cold_+++,\ - polaroid_px-100uv+_warm_--,polaroid_px-100uv+_warm_-,polaroid_px-100uv+_warm,polaroid_px-100uv+_warm_+,polaroid_px-100uv+_warm_++,polaroid_px-100uv+_warm_+++,\ - polaroid_px-680_--,polaroid_px-680_-,polaroid_px-680,polaroid_px-680_+,polaroid_px-680_++,\ - polaroid_px-680_cold_--,polaroid_px-680_cold_-,polaroid_px-680_cold,polaroid_px-680_cold_+,polaroid_px-680_cold_++,polaroid_px-680_cold_++_alt,\ - polaroid_px-680_warm_--,polaroid_px-680_warm_-,polaroid_px-680_warm,polaroid_px-680_warm_+,polaroid_px-680_warm_++,\ - polaroid_px-70_--,polaroid_px-70_-,polaroid_px-70,polaroid_px-70_+,polaroid_px-70_++,polaroid_px-70_+++,\ - polaroid_px-70_cold_--,polaroid_px-70_cold_-,polaroid_px-70_cold,polaroid_px-70_cold_+,polaroid_px-70_cold_++,\ - polaroid_px-70_warm_--,polaroid_px-70_warm_-,polaroid_px-70_warm,polaroid_px-70_warm_+,polaroid_px-70_warm_++,\ - polaroid_time_zero_(expired)_---,polaroid_time_zero_(expired)_--,polaroid_time_zero_(expired)_-,polaroid_time_zero_(expired),polaroid_time_zero_(expired)_+,polaroid_time_zero_(expired)_++,\ - polaroid_time_zero_(expired)_cold_---,polaroid_time_zero_(expired)_cold_--,polaroid_time_zero_(expired)_cold_-,polaroid_time_zero_(expired)_cold - -fx_emulate_film_instant_consumer_preview : - gui_split_preview "fx_emulate_film_instant_consumer $*",${-3--1} - -#@gui Instant [Pro] : fx_emulate_film_instant_pro, fx_emulate_film_instant_pro_preview(1)+ -#@gui : Preset = choice{"None", -#@gui : "Fuji FP-100c --","Fuji FP-100c -","Fuji FP-100c","Fuji FP-100c +","Fuji FP-100c ++","Fuji FP-100c ++a","Fuji FP-100c +++", -#@gui : "Fuji FP-100c Cool --","Fuji FP-100c Cool -","Fuji FP-100c Cool","Fuji FP-100c Cool +","Fuji FP-100c Cool ++", -#@gui : "Fuji FP-100c Negative --","Fuji FP-100c Negative -","Fuji FP-100c Negative","Fuji FP-100c Negative +","Fuji FP-100c Negative ++","Fuji FP-100c Negative ++a","Fuji FP-100c Negative +++", -#@gui : "Fuji FP-3000b --","Fuji FP-3000b -","Fuji FP-3000b","Fuji FP-3000b +","Fuji FP-3000b ++","Fuji FP-3000b +++", -#@gui : "Fuji FP-3000b HC", -#@gui : "Fuji FP-3000b Negative --","Fuji FP-3000b Negative -","Fuji FP-3000b Negative","Fuji FP-3000b Negative +","Fuji FP-3000b Negative ++","Fuji FP-3000b Negative +++", -#@gui : "Fuji FP-3000b Negative Early", -#@gui : "Polaroid 665 --","Polaroid 665 -","Polaroid 665","Polaroid 665 +","Polaroid 665 ++", -#@gui : "Polaroid 665 Negative -","Polaroid 665 Negative","Polaroid 665 Negative +", -#@gui : "Polaroid 665 Negative HC", -#@gui : "Polaroid 669 --","Polaroid 669 -","Polaroid 669","Polaroid 669 +","Polaroid 669 ++","Polaroid 669 +++", -#@gui : "Polaroid 669 Cold --","Polaroid 669 Cold -","Polaroid 669 Cold","Polaroid 669 Cold +", -#@gui : "Polaroid 690 --","Polaroid 690 -","Polaroid 690","Polaroid 690 +","Polaroid 690 ++", -#@gui : "Polaroid 690 Cold --","Polaroid 690 Cold -","Polaroid 690 Cold","Polaroid 690 Cold +","Polaroid 690 Cold ++", -#@gui : "Polaroid 690 Warm --","Polaroid 690 Warm -","Polaroid 690 Warm","Polaroid 690 Warm +","Polaroid 690 Warm ++"} -#@gui : sep = separator() -#@gui : Strength (%) = float(100,0,100) -#@gui : Brightness (%) = float(0,-100,100) -#@gui : Contrast (%) = float(0,-100,100) -#@gui : Gamma (%) = float(0,-100,100) -#@gui : Hue (%) = float(0,-100,100) -#@gui : Saturation (%) = float(0,-100,100) -#@gui : Normalize Colors = choice("None","Pre-Process","Post-Process","Both") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Note: The color LUTs used in this section have been designed by Patrick David. More info at:") -#@gui : url = link{"Film Emulation Presets in G'MIC","https://gmic.eu/film_emulation/index.shtml"} -#@gui : sep = separator(), note = note("Authors: Patrick David and David Tschumperlé. Latest Update: 2016/02/08.") -fx_emulate_film_instant_pro : - _fx_emulate_film $1,${arg\ {max(1,$1)},${-_$0}},${2--1} - -_fx_emulate_film_instant_pro : - u fuji_fp-100c_--,fuji_fp-100c_-,fuji_fp-100c,fuji_fp-100c_+,fuji_fp-100c_++,fuji_fp-100c_++_alt,fuji_fp-100c_+++,\ - fuji_fp-100c_cool_--,fuji_fp-100c_cool_-,fuji_fp-100c_cool,fuji_fp-100c_cool_+,fuji_fp-100c_cool_++,\ - fuji_fp-100c_negative_--,fuji_fp-100c_negative_-,fuji_fp-100c_negative,fuji_fp-100c_negative_+,fuji_fp-100c_negative_++,fuji_fp-100c_negative_++_alt,fuji_fp-100c_negative_+++,\ - fuji_fp-3000b_--,fuji_fp-3000b_-,fuji_fp-3000b,fuji_fp-3000b_+,fuji_fp-3000b_++,fuji_fp-3000b_+++,fuji_fp-3000b_hc,\ - fuji_fp-3000b_negative_--,fuji_fp-3000b_negative_-,fuji_fp-3000b_negative,fuji_fp-3000b_negative_+,fuji_fp-3000b_negative_++,fuji_fp-3000b_negative_+++,fuji_fp-3000b_negative_early,\ - polaroid_665_--,polaroid_665_-,polaroid_665,polaroid_665_+,polaroid_665_++,\ - polaroid_665_negative_-,polaroid_665_negative,polaroid_665_negative_+,polaroid_665_negative_hc,\ - polaroid_669_--,polaroid_669_-,polaroid_669,polaroid_669_+,polaroid_669_++,polaroid_669_+++,\ - polaroid_669_cold_--,polaroid_669_cold_-,polaroid_669_cold,polaroid_669_cold_+,\ - polaroid_690_--,polaroid_690_-,polaroid_690,polaroid_690_+,polaroid_690_++,\ - polaroid_690_cold_--,polaroid_690_cold_-,polaroid_690_cold,polaroid_690_cold_+,polaroid_690_cold_++,\ - polaroid_690_warm_--,polaroid_690_warm_-,polaroid_690_warm,polaroid_690_warm_+,polaroid_690_warm_++ - -fx_emulate_film_instant_pro_preview : - gui_split_preview "fx_emulate_film_instant_pro $*",${-3--1} - -#@gui Negative [Color] : fx_emulate_film_negative_color, fx_emulate_film_negative_color_preview(1)+ -#@gui : Preset = choice{"None", -#@gui : "Agfa Ultra Color 100","Agfa Vista 200","Fuji Superia 200","Fuji Superia HG 1600","Fuji Superia Reala 100","Fuji Superia X-Tra 800", -#@gui : "Kodak Elite 100 XPRO","Kodak Elite Color 200","Kodak Elite Color 400","Kodak Portra 160 NC","Kodak Portra 160 VC","Lomography Redscale 100"} -#@gui : sep = separator() -#@gui : Strength (%) = float(100,0,100) -#@gui : Brightness (%) = float(0,-100,100) -#@gui : Contrast (%) = float(0,-100,100) -#@gui : Gamma (%) = float(0,-100,100) -#@gui : Hue (%) = float(0,-100,100) -#@gui : Saturation (%) = float(0,-100,100) -#@gui : Normalize Colors = choice("None","Pre-Process","Post-Process","Both") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Note: The color LUTs used in this section have been designed by Patrick David. More info at:") -#@gui : url = link{"Film Emulation Presets in G'MIC","https://gmic.eu/film_emulation/index.shtml"} -#@gui : sep = separator(), note = note("Authors: Patrick David and David Tschumperlé. Latest Update: 2016/02/08.") -fx_emulate_film_negative_color : - _fx_emulate_film $1,${arg\ {max(1,$1)},${-_$0}},${2--1} - -_fx_emulate_film_negative_color : - u agfa_ultra_color_100,agfa_vista_200,fuji_superia_200,fuji_superia_hg_1600,fuji_superia_reala_100,fuji_superia_x-tra_800,\ - kodak_elite_100_xpro,kodak_elite_color_200,kodak_elite_color_400,kodak_portra_160_nc,kodak_portra_160_vc,lomography_redscale_100 - -fx_emulate_film_negative_color_preview : - gui_split_preview "fx_emulate_film_negative_color $*",${-3--1} - -#@gui Negative [New] : fx_emulate_film_negative_new, fx_emulate_film_negative_new_preview(1)+ -#@gui : Preset = choice{"None","Fuji 160C","Fuji 400H","Fuji 800Z","Fuji Ilford HP5","Kodak Portra 160","Kodak Portra 400","Kodak Portra 800","Kodak TMAX 3200","Kodak TRI-X 400"} -#@gui : Effect = choice(1,"Low","Standard","High","Higher") -#@gui : sep = separator() -#@gui : Strength (%) = float(100,0,100) -#@gui : Brightness (%) = float(0,-100,100) -#@gui : Contrast (%) = float(0,-100,100) -#@gui : Gamma (%) = float(0,-100,100) -#@gui : Hue (%) = float(0,-100,100) -#@gui : Saturation (%) = float(0,-100,100) -#@gui : Normalize Colors = choice("None","Pre-Process","Post-Process","Both") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Note: The color LUTs used in this section have been designed by Patrick David. More info at:") -#@gui : url = link{"Film Emulation Presets in G'MIC","https://gmic.eu/film_emulation/index.shtml"} -#@gui : sep = separator(), note = note("Authors: Patrick David and David Tschumperlé. Latest Update: 2016/02/08.") -fx_emulate_film_negative_new : - _fx_emulate_film $1,${arg\ {max(1,4*$1+$2-3)},${-_$0}},${3--1} - -_fx_emulate_film_negative_new : - u fuji_160c_-,fuji_160c,fuji_160c_+,fuji_160c_++,\ - fuji_400h_-,fuji_400h,fuji_400h_+,fuji_400h_++,\ - fuji_800z_-,fuji_800z,fuji_800z_+,fuji_800z_++,\ - fuji_ilford_hp5_-,fuji_ilford_hp5,fuji_ilford_hp5_+,fuji_ilford_hp5_++,\ - kodak_portra_160_-,kodak_portra_160,kodak_portra_160_+,kodak_portra_160_++,\ - kodak_portra_400_-,kodak_portra_400,kodak_portra_400_+,kodak_portra_400_++,\ - kodak_portra_800_-,kodak_portra_800,kodak_portra_800_+,kodak_portra_800_++,\ - kodak_tmax_3200_-,kodak_tmax_3200,kodak_tmax_3200_+,kodak_tmax_3200_++,\ - kodak_tri-x_400_-,kodak_tri-x_400,kodak_tri-x_400_+,kodak_tri-x_400_++ - -fx_emulate_film_negative_new_preview : - gui_split_preview "fx_emulate_film_negative_new $*",${-3--1} - -#@gui Negative [Old] : fx_emulate_film_negative_old, fx_emulate_film_negative_old_preview(1)+ -#@gui : Preset = choice{0,"None","Fuji Ilford Delta 3200","Fuji Neopan 1600","Fuji Superia 100","Fuji Superia 400","Fuji Superia 800","Fuji Superia 1600", -#@gui : "Kodak Portra 160 NC","Kodak Portra 160 VC","Kodak Portra 400 NC","Kodak Portra 400 UC","Kodak Portra 400 VC"} -#@gui : Effect = choice(1,"Low","Standard","High","Higher") -#@gui : sep = separator() -#@gui : Strength (%) = float(100,0,100) -#@gui : Brightness (%) = float(0,-100,100) -#@gui : Contrast (%) = float(0,-100,100) -#@gui : Gamma (%) = float(0,-100,100) -#@gui : Hue (%) = float(0,-100,100) -#@gui : Saturation (%) = float(0,-100,100) -#@gui : Normalize Colors = choice("None","Pre-Process","Post-Process","Both") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Note: The color LUTs used in this section have been designed by Patrick David. More info at:") -#@gui : url = link{"Film Emulation Presets in G'MIC","https://gmic.eu/film_emulation/index.shtml"} -#@gui : sep = separator(), note = note("Authors: Patrick David and David Tschumperlé. Latest Update: 2016/02/08.") -fx_emulate_film_negative_old : - _fx_emulate_film $1,${arg\ {max(1,4*$1+$2-3)},${-_$0}},${3--1} - -_fx_emulate_film_negative_old : - u fuji_ilford_delta_3200_-,fuji_ilford_delta_3200,fuji_ilford_delta_3200_+,fuji_ilford_delta_3200_++,\ - fuji_neopan_1600_-,fuji_neopan_1600,fuji_neopan_1600_+,fuji_neopan_1600_++,\ - fuji_superia_100_-,fuji_superia_100,fuji_superia_100_+,fuji_superia_100_++,\ - fuji_superia_400_-,fuji_superia_400,fuji_superia_400_+,fuji_superia_400_++,\ - fuji_superia_800_-,fuji_superia_800,fuji_superia_800_+,fuji_superia_800_++,\ - fuji_superia_1600_-,fuji_superia_1600,fuji_superia_1600_+,fuji_superia_1600_++,\ - kodak_portra_160_nc_-,kodak_portra_160_nc,kodak_portra_160_nc_+,kodak_portra_160_nc_++,\ - kodak_portra_160_vc_-,kodak_portra_160_vc,kodak_portra_160_vc_+,kodak_portra_160_vc_++,\ - kodak_portra_400_nc_-,kodak_portra_400_nc,kodak_portra_400_nc_+,kodak_portra_400_nc_++,\ - kodak_portra_400_uc_-,kodak_portra_400_uc,kodak_portra_400_uc_+,kodak_portra_400_uc_++,\ - kodak_portra_400_vc_-,kodak_portra_400_vc,kodak_portra_400_vc_+,kodak_portra_400_vc_++ - -fx_emulate_film_negative_old_preview : - gui_split_preview "fx_emulate_film_negative_old $*",${-3--1} - -#@gui PictureFX : fx_emulate_film_picturefx, fx_emulate_film_picturefx_preview(1)+ -#@gui : Preset = choice{"None", -#@gui : "AnalogFX - Anno 1870 Color", -#@gui : "AnalogFX - Old Style I","AnalogFX - Old Style II","AnalogFX - Old Style III", -#@gui : "AnalogFX - Sepia Color","AnalogFX - Soft Sepia I","AnalogFX - Soft Sepia II", -#@gui : "GoldFX - Perfect Sunset 01min","GoldFX - Perfect Sunset 05min","GoldFX - Perfect Sunset 10min", -#@gui : "GoldFX - Spring breeze","GoldFX - Bright spring breeze", -#@gui : "GoldFX - Summer heat","GoldFX - Bright summer heat","GoldFX - Hot summer heat", -#@gui : "TechnicalFX - Backlight filter", -#@gui : "ZilverFX - B&W Solarization","ZilverFX - Infrared","ZilverFX - Vintage B&W"} -#@gui : sep = separator() -#@gui : Strength (%) = float(100,0,100) -#@gui : Brightness (%) = float(0,-100,100) -#@gui : Contrast (%) = float(0,-100,100) -#@gui : Gamma (%) = float(0,-100,100) -#@gui : Hue (%) = float(0,-100,100) -#@gui : Saturation (%) = float(0,-100,100) -#@gui : Normalize Colors = choice("None","Pre-Process","Post-Process","Both") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Note: The color LUTs used in this section have been provided by Marc Roovers, and are freely available at:") -#@gui : url = link("PictureFX - a free HaldCLUT set","http://www.digicrea.be/haldclut-set-style-a-la-nik-software") -#@gui : sep = separator(), note = note("Authors: Marc Roovers and David Tschumperlé. Latest Update: 2016/21/10.") -fx_emulate_film_picturefx : - _fx_emulate_film $1,${arg\ {max(1,$1)},${-_$0}},${2--1} - -_fx_emulate_film_picturefx : - u analogfx_anno_1870_color,\ - analogfx_old_style_i,analogfx_old_style_ii,analogfx_old_style_iii,\ - analogfx_sepia_color,analogfx_soft_sepia_i,analogfx_soft_sepia_ii,\ - goldfx_perfect_sunset_01min,goldfx_perfect_sunset_05min,goldfx_perfect_sunset_10min,\ - goldfx_spring_breeze,goldfx_bright_spring_breeze,goldfx_summer_heat,goldfx_bright_summer_heat,goldfx_hot_summer_heat,\ - technicalfx_backlight_filter,\ - zilverfx_b_w_solarization,zilverfx_infrared,zilverfx_vintage_b_w - -fx_emulate_film_picturefx_preview : - gui_split_preview "fx_emulate_film_picturefx $*",${-3--1} - -#@gui Print Films : fx_emulate_film_print, fx_emulate_film_print_preview(1)+ -#@gui : Preset = choice{"None","Fuji 3510 (Constlclip)","Fuji 3510 (Constlmap)","Fuji 3510 (Cuspclip)", -#@gui : "Fuji 3513 (Constlclip)","Fuji 3513 (Constlmap)","Fuji 3513 (Cuspclip)", -#@gui : "Kodak 2383 (Constlclip)","Kodak 2383 (Constlmap)","Kodak 2383 (Cuspclip)", -#@gui : "Kodak 2393 (Constlclip)","Kodak 2393 (Constlmap)","Kodak 2393 (Cuspclip)"} -#@gui : sep = separator() -#@gui : Strength (%) = float(100,0,100) -#@gui : Brightness (%) = float(0,-100,100) -#@gui : Contrast (%) = float(0,-100,100) -#@gui : Gamma (%) = float(0,-100,100) -#@gui : Hue (%) = float(0,-100,100) -#@gui : Saturation (%) = float(0,-100,100) -#@gui : Normalize Colors = choice("None","Pre-Process","Post-Process","Both") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Note: The color LUTs used in this section have been provided by Juan Melara, and are freely available at:") -#@gui : url = link("Print Film Emulation LUTs For Download","http://juanmelara.com.au/print-film-emulation-luts-for-download/") -#@gui : sep = separator(), note = note("Authors: Juan Melara and David Tschumperlé. Latest Update: 2016/02/08.") -fx_emulate_film_print : - _fx_emulate_film $1,${arg\ {max(1,$1)},${-_$0}},${2--1} - -_fx_emulate_film_print : - u fuji3510_constlclip,fuji3510_constlmap,fuji3510_cuspclip,\ - fuji3513_constlclip,fuji3513_constlmap,fuji3513_cuspclip,\ - kodak2383_constlclip,kodak2383_constlmap,kodak2383_cuspclip,\ - kodak2393_constlclip,kodak2393_constlmap,kodak2393_cuspclip - -fx_emulate_film_print_preview : - gui_split_preview "fx_emulate_film_print $*",${-3--1} - -#@gui Slide [Color] : fx_emulate_film_colorslide, fx_emulate_film_colorslide_preview(1)+ -#@gui : Preset = choice{"None", -#@gui : "Agfa Precisa 100","Fuji Astia 100F","Fuji FP 100C","Fuji Provia 100F","Fuji Provia 400F","Fuji Provia 400X","Fuji Sensia 100", -#@gui : "Fuji Superia 200 XPRO","Fuji Velvia 50","Generic Fuji Astia 100","Generic Fuji Provia 100","Generic Fuji Velvia 100", -#@gui : "Generic Kodachrome 64","Generic Kodak Ektachrome 100 VS","Kodak E-100 GX Ektachrome 100","Kodak Ektachrome 100 VS","Kodak Elite Chrome 200", -#@gui : "Kodak Elite Chrome 400","Kodak Elite ExtraColor 100","Kodak Kodachrome 200","Kodak Kodachrome 25","Kodak Kodachrome 64","Lomography X-Pro Slide 200", -#@gui : "Polaroid 669","Polaroid 690","Polaroid Polachrome"} -#@gui : sep = separator() -#@gui : Strength (%) = float(100,0,100) -#@gui : Brightness (%) = float(0,-100,100) -#@gui : Contrast (%) = float(0,-100,100) -#@gui : Gamma (%) = float(0,-100,100) -#@gui : Hue (%) = float(0,-100,100) -#@gui : Saturation (%) = float(0,-100,100) -#@gui : Normalize Colors = choice("None","Pre-Process","Post-Process","Both") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Note: The color LUTs used in this section have been designed by Patrick David. More info at:") -#@gui : url = link{"Film Emulation Presets in G'MIC","https://gmic.eu/film_emulation/index.shtml"} -#@gui : sep = separator(), note = note("Authors: Patrick David and David Tschumperlé. Latest Update: 2016/02/08.") -fx_emulate_film_colorslide : - _fx_emulate_film $1,${arg\ {max(1,$1)},${-_$0}},${2--1} - -_fx_emulate_film_colorslide : - u agfa_precisa_100,fuji_astia_100f,fuji_fp_100c,fuji_provia_100f,fuji_provia_400f,fuji_provia_400x,fuji_sensia_100,\ - fuji_superia_200_xpro,fuji_velvia_50,generic_fuji_astia_100,generic_fuji_provia_100,generic_fuji_velvia_100,\ - generic_kodachrome_64,generic_kodak_ektachrome_100_vs,kodak_e-100_gx_ektachrome_100,kodak_ektachrome_100_vs,kodak_elite_chrome_200,\ - kodak_elite_chrome_400,kodak_elite_extracolor_100,kodak_kodachrome_200,kodak_kodachrome_25,kodak_kodachrome_64,lomography_x-pro_slide_200,\ - polaroid_669,polaroid_690,polaroid_polachrome - -fx_emulate_film_colorslide_preview : - gui_split_preview "fx_emulate_film_colorslide $*",${-3--1} - -#@gui User-Defined : fx_emulate_film_userdefined, fx_emulate_film_userdefined_preview(1)+ -#@gui : Specify HaldCLUT As = choice(2,"Top Layer","Bottom Layer","Filename") -#@gui : HaldCLUT Filename = filein() -#@gui : note = note("Note: Do not forget to set the Input layers option if you select Top layer or Bottom layer.") -#@gui : sep = separator() -#@gui : Strength (%) = float(100,0,100) -#@gui : Brightness (%) = float(0,-100,100) -#@gui : Contrast (%) = float(0,-100,100) -#@gui : Gamma (%) = float(0,-100,100) -#@gui : Hue (%) = float(0,-100,100) -#@gui : Saturation (%) = float(0,-100,100) -#@gui : Normalize Colors = choice("None","Pre-Process","Post-Process","Both") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("More info at:") -#@gui : url = link{"Film Emulation Presets in G'MIC","https://gmic.eu/film_emulation/index.shtml"} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/02/08.") -fx_emulate_film_userdefined : skip "${2=}" - if {$1<2} - if {$!<2} gui_warning_preview "Input layer with HaldCLUT is missing" return fi - ind={if($1,-1,0)} map_clut[^$ind] [$ind] rm[$ind] - else - l - 0 nm. "$2" ext={x} rm. - if {['$ext']=='cube'} input_cube "$2" - else i "$2" - fi - onfail gui_warning_preview "Specified HaldCLUT filename not found" return - endl - map_clut[^-1] . rm. - if {iM>255} / 255 fi # Was possibly a 16bits HaldCLUT. - fi - _fx_emulate_film 0,1,${3--1} - -fx_emulate_film_userdefined_preview : skip "${2=}" - if {$1<2} gui_warning_preview "No preview available in this mode" return fi - gui_split_preview "fx_emulate_film_userdefined $1,\"$2\",${3--2}",${-3--1} - -#@gui Various : fx_emulate_film_various, fx_emulate_film_various_preview(1)+ -#@gui : Preset = choice{"None","60's","60's (faded)","60's (faded alt)","Alien green","Black & White","Bleach bypass","Blue mono", -#@gui : "Color (rich)","Faded","Faded (alt)","Faded (analog)","Faded (extreme)","Faded (vivid)","Expired (fade)","Expired (polaroid)","Extreme","Fade", -#@gui : "Faux infrared","Golden","Golden (bright)","Golden (fade)","Golden (mono)","Golden (vibrant)","Green mono","Hong Kong","Light (blown)","Lomo", -#@gui : "Mono tinted","Muted fade","Mute shift","Natural (vivid)","Nostalgic","Orange tone","Pink fade","Purple","Retro","Rotate (muted)","Rotate (vibrant)", -#@gui : "Smooth crome-ish","Smooth fade","Soft fade","Solarize color","Solarized color2","Summer","Summer (alt)","Sunny","Sunny (alt)","Sunny (warm)", -#@gui : "Sunny (rich)","Super warm","Super warm (rich)","Sutro FX","Vibrant","Vibrant (alien)","Vibrant (contrast)","Vibrant (crome-ish)", -#@gui : "Vintage","Vintage (alt)","Vintage (brighter)","Warm","Warm (highlight)","Warm (yellow)"} -#@gui : sep = separator() -#@gui : Strength (%) = float(100,0,100) -#@gui : Brightness (%) = float(0,-100,100) -#@gui : Contrast (%) = float(0,-100,100) -#@gui : Gamma (%) = float(0,-100,100) -#@gui : Hue (%) = float(0,-100,100) -#@gui : Saturation (%) = float(0,-100,100) -#@gui : Normalize Colors = choice("None","Pre-Process","Post-Process","Both") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("More info at:") -#@gui : url = link{"Film Emulation Presets in G'MIC","https://gmic.eu/film_emulation/index.shtml"} -#@gui : sep = separator(), note = note("Authors: David Tschumperlé and Patrick David. Latest Update: 2016/02/08.") -fx_emulate_film_various : - _fx_emulate_film $1,${arg\ {max(1,$1)},${-_$0}},${2--1} + repeat $! l[$>] 0 text. "#"{1+$>}" ",1,1,24,1,255 +dilate. 5 to_rgba[1] j[0] [1],2,0,0,0,1,[2],255 k[0] endl done + to_rgba frame 1,1,0 frame 3,3,255 append_tiles , + endl done -_fx_emulate_film_various : - u 60{`39`}s,60{`39`}s_faded,60{`39`}s_faded_alt,alien_green,black_and_white,bleach_bypass,blue_mono,\ - color_rich,faded,faded_alt,faded_analog,faded_extreme,faded_vivid,expired_fade,expired_polaroid,extreme,fade,\ - faux_infrared,golden,golden_bright,golden_fade,golden_mono,golden_vibrant,green_mono,hong_kong,light_blown,lomo,\ - mono_tinted,muted_fade,mute_shift,natural_vivid,nostalgic,orange_tone,pink_fade,purple,retro,rotate_muted,rotate_vibrant,\ - smooth_cromeish,smooth_fade,soft_fade,solarized_color,solarized_color2,summer,summer_alt,sunny,sunny_alt,sunny_warm,\ - sunny_rich,super_warm,super_warm_rich,sutro_fx,vibrant,vibrant_alien,vibrant_contrast,vibrant_cromeish,\ - vintage,vintage_alt,vintage_brighter,warm,warm_highlight,warm_yellow +#@gui Split Details [Wavelets] : fx_split_details_wavelets, fx_split_details_wavelets_preview(0) +#@gui : Number of Scales = int(6,2,12) +#@gui : Add Alpha Channels to Detail Scale Layers = _bool(0) +#@gui : sep = separator() +#@gui : Sharpen Details in Preview = bool(0) +#@gui : sep = separator() +#@gui : note = note{"Note: This filter decomposes an image into several detail scales, +#@gui : using wavelet atrous. +#@gui : It should provide similar results to the +#@gui : Wavelet Decompose Plug-in +#@gui : (by Marco Rossini). +#@gui : "} +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/23/03.") +fx_split_details_wavelets : + remove_opacity repeat $! l[$>] + nm=${-gui_layer_name} + pos=${-gui_layer_pos} + split_details $1,0,0 rv +[^-1] 128 c[^-1] 0,255 round + if $2 to_a[^-1] fi + repeat $!-1 nm[$>] "mode(grainmerge), name"($nm" [scale ""#"{1+$>}"]), pos("$pos")" done + nm. "name"($nm" [residual]), pos("$pos")" + endl done -fx_emulate_film_various_preview : - gui_split_preview "fx_emulate_film_various $*",${-3--1} +fx_split_details_wavelets_preview : + repeat $! l[$>] + fx_split_details_wavelets $1,0 + if $3 equalize[^-1] 256 fi n[^-1] 0,255 + N={int(sqrt($!))} N={round($!/$N,1,1)} r2dy {100/$N}% + repeat $! l[$>] 0 text. "#"{1+$>}" ",1,1,24,1,255 +dilate. 5 to_rgba[1] j[0] [1],2,0,0,0,1,[2],255 k[0] endl done + to_rgba frame 1,1,0 frame 3,3,255 append_tiles , + endl done -_fx_emulate_film : - if $1 - clut "$2" - repeat {$!-1} - if {$9%2} balance_gamma[$>] , fi - if {$3<100} +map_clut[$>] . j[$>] .,0,0,0,0,{$3%} rm. - else map_clut[$>] . - fi - done - rm. - fi - adjust_colors ${4-8},0,255 - if {$9>1} repeat $! l[$>] split_opacity n[0] 0,255 a c endl done fi +#@gui Tone Mapping : fx_map_tones, fx_map_tones_preview(0) +#@gui : Threshold = float(0.5,0,1) +#@gui : Gamma = float(0.7,0,1) +#@gui : Smoothness = float(0.1,0,10) +#@gui : Iterations = int(30,0,500) +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") +fx_map_tones : + ac "map_tones ${1-4}",$5,1 + n 0,255 -#@gui [Collages] -#----------------------- +fx_map_tones_preview : + gui_split_preview "fx_map_tones $*",${-3--1} -#@gui B&W Films - Collage : fx_emulate_film_collage_bw, gui_no_preview -#@gui : Image Size = float(512,16,1024) -#@gui : Columns for Collage = int(4,1,8) -#@gui : Label Size = int(16,10,100) -#@gui : Output As = choice("Table","Multiple Layers") -#@gui : sep = separator() -#@gui : note = note{"Note: This filter will create a collage of all available B&W film emulation presets -#@gui : to show you how those presets modify the look of your image. It will also download all corresponding color profiles -#@gui : (this may take some time at the first run). -#@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/28/10.") -fx_emulate_film_collage_bw : - k[0] to_rgb if {max(w,h)>$1} if {w>h} r2dx $1 else r2dy $1 fi fi - _nbc=$2 _label_size=$3 _output_type=$4 _fx_emulate_film_collage ${-_fx_emulate_film_bw} - -#@gui Instant - Collage [Consumer] : fx_emulate_film_collage_instant_consumer, gui_no_preview -#@gui : Image Size = float(512,16,1024) -#@gui : Columns for Collage = int(4,1,8) -#@gui : Label Size = int(16,10,100) -#@gui : Output As = choice("Table","Multiple Layers") -#@gui : note = note{"Note: This filter will create a collage of all available Instant [consumer] film emulation presets -#@gui : to show you how those presets modify the look of your image. It will also download all corresponding color profiles -#@gui : (this may take some time at the first run). -#@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/28/10.") -fx_emulate_film_collage_instant_consumer : - k[0] to_rgb if {max(w,h)>$1} if {w>h} r2dx $1 else r2dy $1 fi fi - _nbc=$2 _label_size=$3 _output_type=$4 _fx_emulate_film_collage ${-_fx_emulate_film_instant_consumer} - -#@gui Instant - Collage [Pro] : fx_emulate_film_collage_instant_pro, gui_no_preview -#@gui : Image Size = float(512,16,1024) -#@gui : Columns for Collage = int(4,1,8) -#@gui : Label Size = int(16,10,100) -#@gui : Output As = choice("Table","Multiple Layers") -#@gui : note = note{"Note: This filter will create a collage of all available Instant [pro] film emulation presets -#@gui : to show you how those presets modify the look of your image. It will also download all corresponding color profiles -#@gui : (this may take some time at the first run). -#@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/28/10.") -fx_emulate_film_collage_instant_pro : - k[0] to_rgb if {max(w,h)>$1} if {w>h} r2dx $1 else r2dy $1 fi fi - _nbc=$2 _label_size=$3 _output_type=$4 _fx_emulate_film_collage ${-_fx_emulate_film_instant_pro} - -#@gui Negative - Collage [Color] : fx_emulate_film_collage_negative_color, gui_no_preview -#@gui : Image Size = float(512,16,1024) -#@gui : Columns for Collage = int(4,1,8) -#@gui : Label Size = int(16,10,100) -#@gui : Output As = choice("Table","Multiple Layers") -#@gui : note = note{"Note: This filter will create a collage of all available Negative [color] film emulation presets -#@gui : to show you how those presets modify the look of your image. It will also download all corresponding color profiles -#@gui : (this may take some time at the first run). -#@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/28/10.") -fx_emulate_film_collage_negative_color : - k[0] to_rgb if {max(w,h)>$1} if {w>h} r2dx $1 else r2dy $1 fi fi - _nbc=$2 _label_size=$3 _output_type=$4 _fx_emulate_film_collage ${-_fx_emulate_film_negative_color} - -#@gui Negative - Collage [New] : fx_emulate_film_collage_negative_new, gui_no_preview -#@gui : Image Size = float(512,16,1024) -#@gui : Columns for Collage = int(4,1,8) -#@gui : Label Size = int(16,10,100) -#@gui : Output As = choice("Table","Multiple Layers") -#@gui : note = note{"Note: This filter will create a collage of all available Negative [new] film emulation presets -#@gui : to show you how those presets modify the look of your image. It will also download all corresponding color profiles -#@gui : (this may take some time at the first run). -#@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/28/10.") -fx_emulate_film_collage_negative_new : - k[0] to_rgb if {max(w,h)>$1} if {w>h} r2dx $1 else r2dy $1 fi fi - _nbc=$2 _label_size=$3 _output_type=$4 _fx_emulate_film_collage ${-_fx_emulate_film_negative_new} - -#@gui Negative - Collage [Old] : fx_emulate_film_collage_negative_old, gui_no_preview -#@gui : Image Size = float(512,16,1024) -#@gui : Columns for Collage = int(4,1,8) -#@gui : Label Size = int(16,10,100) -#@gui : Output As = choice("Table","Multiple Layers") -#@gui : note = note{"Note: This filter will create a collage of all available Negative [old] film emulation presets -#@gui : to show you how those presets modify the look of your image. It will also download all corresponding color profiles -#@gui : (this may take some time at the first run). -#@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/28/10.") -fx_emulate_film_collage_negative_old : - k[0] to_rgb if {max(w,h)>$1} if {w>h} r2dx $1 else r2dy $1 fi fi - _nbc=$2 _label_size=$3 _output_type=$4 _fx_emulate_film_collage ${-_fx_emulate_film_negative_old} - -#@gui PictureFX - Collage : fx_emulate_film_collage_picturefx, gui_no_preview -#@gui : Image Size = float(512,16,1024) -#@gui : Columns for Collage = int(4,1,8) -#@gui : Label Size = int(16,10,100) -#@gui : Output As = choice("Table","Multiple Layers") -#@gui : note = note{"Note: This filter will create a collage of all available Others film emulation presets -#@gui : to show you how those presets modify the look of your image. It will also download all corresponding color profiles -#@gui : (this may take some time at the first run). -#@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/15/04.") -fx_emulate_film_collage_picturefx : - k[0] to_rgb if {max(w,h)>$1} if {w>h} r2dx $1 else r2dy $1 fi fi - _nbc=$2 _label_size=$3 _output_type=$4 _fx_emulate_film_collage ${-_fx_emulate_film_picturefx} - -#@gui Print Films - Collage : fx_emulate_film_collage_print, gui_no_preview -#@gui : Image Size = float(512,16,1024) -#@gui : Columns for Collage = int(4,1,8) -#@gui : Label Size = int(16,10,100) -#@gui : Output As = choice("Table","Multiple Layers") -#@gui : note = note{"Note: This filter will create a collage of all available Others film emulation presets -#@gui : to show you how those presets modify the look of your image. It will also download all corresponding color profiles -#@gui : (this may take some time at the first run). -#@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/15/04.") -fx_emulate_film_collage_print : - k[0] to_rgb if {max(w,h)>$1} if {w>h} r2dx $1 else r2dy $1 fi fi - _nbc=$2 _label_size=$3 _output_type=$4 _fx_emulate_film_collage ${-_fx_emulate_film_print} - -#@gui Slide - Collage [Color] : fx_emulate_film_collage_colorslide, gui_no_preview -#@gui : Image Size = float(512,16,1024) -#@gui : Columns for Collage = int(4,1,8) -#@gui : Label Size = int(16,10,100) -#@gui : Output As = choice("Table","Multiple Layers") -#@gui : note = note{"Note: This filter will create a collage of all available Slide [color] film emulation presets -#@gui : to show you how those presets modify the look of your image. It will also download all corresponding color profiles -#@gui : (this may take some time at the first run). -#@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/28/10.") -fx_emulate_film_collage_colorslide : - k[0] to_rgb if {max(w,h)>$1} if {w>h} r2dx $1 else r2dy $1 fi fi - _nbc=$2 _label_size=$3 _output_type=$4 _fx_emulate_film_collage ${-_fx_emulate_film_colorslide} - -_fx_emulate_film_collage : - $=arg progress 0 - repeat $# - preset=${arg{$>+1}} - +l[0] - _fx_emulate_film[0] 1,$preset,100,0,0,0,0,0,0 - ({'$preset'}) replace. {'_'},32 f. if(x==0" && "i>=_'a'" && "i<=_'z',i+_'A'-_'a',i) title={t} rm. - to. $title,2,2,$_label_size,2,1,255 - endl - progress {(1+$>)*100/$#} - done - to[0] "Original image",2,2,$_label_size,2,1,255 - if {!$_output_type} frame 1,1,0 frame 5,5,255 - 255 append_tiles {min($_nbc,$!)} + 255 fi +#@gui Tone Mapping [Fast] : fx_map_tones_fast, fx_map_tones_fast_preview(0) +#@gui : Radius = float(3,0,20) +#@gui : Power = float(0.5,0,1) +#@gui : sep = separator() +#@gui : Channel(s) = choice(11,"All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Authors: Paul Nasca and David Tschumperlé. +#@gui :       Latest Update: 2011/10/06.") +fx_map_tones_fast : + ac "map_tones_fast $1,$2",$3,2 -#@gui Various - Collage : fx_emulate_film_collage_various, gui_no_preview -#@gui : Image Size = float(512,16,1024) -#@gui : Columns for Collage = int(4,1,8) -#@gui : Label Size = int(16,10,100) -#@gui : Output As = choice("Table","Multiple Layers") -#@gui : note = note{"Note: This filter will create a collage of all available Others film emulation presets -#@gui : to show you how those presets modify the look of your image. It will also download all corresponding color profiles -#@gui : (this may take some time at the first run). -#@gui : "} -#@gui : sep = separator(), note = note("Authors: David Tschumperlé and Patrick David. Latest Update: 2014/29/07.") -fx_emulate_film_collage_various : - k[0] to_rgb if {max(w,h)>$1} if {w>h} r2dx $1 else r2dy $1 fi fi - _nbc=$2 _label_size=$3 _output_type=$4 _fx_emulate_film_collage ${-_fx_emulate_film_various} +fx_map_tones_fast_preview : + gui_split_preview "fx_map_tones_fast ${^0}",${-3--1} #@gui ____Frames #---------------------- #@gui Droste : fx_droste, fx_droste_preview(1) #@gui : note = note("Upper-left coordinates :") -#@gui : X0 = float(20,0,100) -#@gui : Y0 = float(20,0,100) -#@gui : sep = separator(), note = note("Upper-right coordinates :") -#@gui : X1 = float(80,0,100) -#@gui : Y1 = float(20,0,100) -#@gui : sep = separator(), note = note("Lower-right coordinates :") -#@gui : X2 = float(80,0,100) -#@gui : Y2 = float(80,0,100) -#@gui : sep = separator(), note = note("Lower-left coordinates :") -#@gui : X3 = float(20,0,100) -#@gui : Y3 = float(80,0,100) +#@gui : Point #0 = point(20,20,0,1,255,0,0) +#@gui : sep = separator() +#@gui : note = note("Upper-right coordinates :") +#@gui : Point #1 = point(80,20,0,1,255,0,255) +#@gui : sep = separator() +#@gui : note = note("Lower-right coordinates :") +#@gui : Point #2 = point(80,80,0,1,0,128,255) +#@gui : sep = separator() +#@gui : note = note("Lower-left coordinates :") +#@gui : Point #3 = point(20,80,0,1,0,255,255) #@gui : sep = separator() #@gui : Iterations = int(1,1,10) #@gui : X-Shift = float(0,-100,100) @@ -32055,40 +40252,48 @@ #@gui : Boundary = choice(1,"Transparent","Nearest","Periodic","Mirror") #@gui : Drawing Mode = choice{"Replace","Replace (Sharpest)","Behind","Below"} #@gui : View Outlines Only = bool(0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2012/11/06.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2012/11/06.") fx_droste : repeat $! - if {$16==1} 100%,100%,1,1,'x' 100%,100%,1,1,'y' a[-2,-1] c fi + if $16==1 100%,100%,1,1,'x' 100%,100%,1,1,'y' a[-2,-1] c fi repeat $9 x0={round($1*w/100)} y0={round($2*h/100)} x1={round($3*w/100)} y1={round($4*h/100)} x2={round($5*w/100)} y2={round($6*h/100)} x3={round($7*w/100)} y3={round($8*h/100)} 100%,100%,1,2,-32767 polygon. 4,$x0,$y0,$x1,$y1,$x2,$y2,$x3,$y3,1,-65535 - sh. 0 f. 'if(i==-65535,x03=$x0+(y-$y0)/($y3-$y0)*($x3-$x0);x12=$x1+(y-$y1)/($y2-$y1)*($x2-$x1);(x-x03)/(x12-x03)*(w-1),i)' rm. - sh. 1 f. 'if(i==-65535,y01=$y0+(x-$x0)/($x1-$x0)*($y1-$y0);y32=$y3+(x-$x3)/($x2-$x3)*($y2-$y3);(y-y01)/(y32-y01)*(h-1),i)' rm. - xshift={w*$10/100} yshift={h*$11/100} alpha={-$12*pi/180} ca={cos($alpha)/$13} sa={sin($alpha)/$13} w2={w/2} h2={h/2} + sh. 0 + f. "if(i==-65535, + x03 = "$x0"+(y-"$y0")/("$y3"-"$y0")*("$x3"-"$x0"); + x12 = "$x1"+(y-"$y1")/("$y2"-"$y1")*("$x2"-"$x1"); + (x-x03)/(x12-x03)*(w-1),i)" + rm. + sh. 1 + f. "if(i==-65535, + y01 = "$y0"+(x-"$x0")/("$x1"-"$x0")*("$y1"-"$y0"); + y32 = "$y3"+(x-"$x3")/("$x2"-"$x3")*("$y2"-"$y3"); + (y-y01)/(y32-y01)*(h-1),i)" + rm. + xshift={w*$10/100} yshift={h*$11/100} alpha={-$12*pi/180} + ca={cos($alpha)/$13} sa={sin($alpha)/$13} w2={w/2} h2={h/2} f. 'if(i==-32767,i,X=i(x,y,0,0)-$w2;Y=i(x,y,0,1)-$h2;if(c==0,$w2-$xshift+X*$ca-Y*$sa,$h2-$yshift+X*$sa+Y*$ca))' - if {$14==0} sh. 0 f. 'if(i==-32767,x,i)' rm. sh. 1 f. 'if(i==-32767,y,i)' rm. - elif {$14==1} sh. 0 f. 'if(i==-32767,x,w-1-i)' rm. sh. 1 f. 'if(i==-32767,y,i)' rm. - elif {$14==2} sh. 0 f. 'if(i==-32767,x,i)' rm. sh. 1 f. 'if(i==-32767,y,h-1-i)' rm. + if $14==0 sh. 0 f. 'if(i==-32767,x,i)' rm. sh. 1 f. 'if(i==-32767,y,i)' rm. + elif $14==1 sh. 0 f. 'if(i==-32767,x,w-1-i)' rm. sh. 1 f. 'if(i==-32767,y,i)' rm. + elif $14==2 sh. 0 f. 'if(i==-32767,x,i)' rm. sh. 1 f. 'if(i==-32767,y,h-1-i)' rm. else sh. 0 f. 'if(i==-32767,x,w-1-i)' rm. sh. 1 f. 'if(i==-32767,y,h-1-i)' rm. fi - if {$16<2} warp.. .,0,{$16==0},$15 rm. + if $16<2 warp.. .,0,{$16==0},$15 rm. else +warp.. .,0,1,$15 rm.. - if {$16==3} rv[-2,-1] fi + if $16==3 rv[-2,-1] fi blend[-2,-1] alpha fi done - if {$16==1} warp.. .,0,1,1 rm. fi + if $16==1 warp.. .,0,1,1 rm. fi mv. 0 done fx_droste_preview : - if {!$17} fx_droste $* else polygon 4,$1%,$2%,$3%,$4%,$5%,$6%,$7%,$8%,0.3,0,0,0,255 fi + if !$17 fx_droste $* else polygon 4,$1%,$2%,$3%,$4%,$5%,$6%,$7%,$8%,0.3,0,0,0,255 fi polygon 4,$1%,$2%,$3%,$4%,$5%,$6%,$7%,$8%,1,0xFFFFFFFF,0,0,0,255 - ellipse $1%,$2%,3,3,0,1,255,0,0,255 ellipse $1%,$2%,3,3,0,1,0xFFFFFFFF,0,0,0,255 - ellipse $3%,$4%,3,3,0,1,255,0,255,255 ellipse $3%,$4%,3,3,0,1,0xFFFFFFFF,0,0,0,255 - ellipse $5%,$6%,3,3,0,1,0,0,255,255 ellipse $5%,$6%,3,3,0,1,0xFFFFFFFF,0,0,0,255 - ellipse $7%,$8%,3,3,0,1,0,255,255,255 ellipse $7%,$8%,3,3,0,1,0xFFFFFFFF,0,0,0,255 #@gui Frame [Blur] : fx_frame_blur, fx_frame_blur(1) #@gui : Horizontal Size (%) = float(30,0,100) @@ -32110,14 +40315,15 @@ #@gui : X-Centering = float(0.5,0,1) #@gui : Y-Centering = float(0.5,0,1) #@gui : Angle = float(0,-180,180) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/19/01.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/19/01.") fx_frame_blur : repeat $! l[$>] to_rgb sx={$1%*max(w,h)} sy={$2%*max(w,h)} +r {w+$sx},{h+$sy},1,100%,3 b[1] $4% if $6 balance_gamma[1] ${7-9} fi - if {$10==1} n[1] 0,255 elif {$10==2} n[1] 0,255 equalize[1] 256 fi + if $10==1 n[1] 0,255 elif $10==2 n[1] 0,255 equalize[1] 256 fi rv z[1] {$3/2}%,{$3/2}%,{100-$3/2}%,{100-$3/2}% @@ -32150,7 +40356,9 @@ #@gui : Right Side Orientation = choice("Normal","Mirror-X","Mirror-Y","Mirror-XY") #@gui : Upper Side Orientation = choice("Normal","Mirror-X","Mirror-Y","Mirror-XY") #@gui : Lower Side Orientation = choice("Normal","Mirror-X","Mirror-Y","Mirror-XY") -#@gui : sep = separator(), note = note("Author: David Tschumperlé, Angelo Lama. Latest Update: 2012/29/01.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé, Angelo Lama. +#@gui :       Latest Update: 2012/29/01.") #@gui Frame [Fuzzy] : fx_frame_fuzzy, fx_frame_fuzzy(0) #@gui : Horizontal Size (%) = float(5,0,100) @@ -32158,7 +40366,8 @@ #@gui : Fuzzyness = float(10,0,40) #@gui : Smoothness = float(1,0,5) #@gui : Color = color(255,255,255,255) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_frame_fuzzy : repeat $! l[$>] sx={$1%*max(w,h)/2} sy={$2%*max(w,h)/2} @@ -32169,17 +40378,20 @@ #@gui : note = note("Frame size:") #@gui : Horizontal (%) = float(10,0,100) #@gui : Vertical (%) = float(10,0,100) -#@gui : sep = separator(), note = note("Image alignment:") +#@gui : sep = separator() +#@gui : note = note("Image alignment:") #@gui : Horizontal (%) = float(50,0,100) #@gui : Vertical (%) = float(50,0,100) -#@gui : sep = separator(), note = note("Frame dilation/shrinking:") +#@gui : sep = separator() +#@gui : note = note("Frame dilation/shrinking:") #@gui : Left = float(0,-5,5) #@gui : Right = float(0,-5,5) #@gui : Up = float(0,-5,5) #@gui : Bottom = float(0,-5,5) #@gui : sep = separator() #@gui : Preview Opacity (%) = float(0.75,0,1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2018/08/20.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2018/08/20.") fx_frame_mirror : repeat $! l[$>] {100+2*$1}%,{100+2*$2}%,1,100%," @@ -32227,7 +40439,8 @@ #@gui : sep = separator() #@gui : Serial Number = int(123456,0,1000000) #@gui : Frame as a New Layer = _bool(false) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2012/07/06.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2012/07/06.") fx_frame_painting : if $14 repeat $! 100%,100%,1,4 frame_painting. $1%,$2,$3%,${4-6},$7%,${8-13} @@ -32243,9 +40456,10 @@ #@gui : Pattern = choice(1,"Top Layer","Self Image") #@gui : Iterations = int(1,1,10) #@gui : Constrain Image Size = _bool(1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/01/08.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/01/08.") fx_frame_pattern : - if {$2||$!==1} repeat $3 frame_pattern $1,$4 done + if $2" || "$!==1 repeat $3 frame_pattern $1,$4 done else repeat $3 frame_pattern[^0] $1,[0],$4 done fi fx_frame_pattern_preview : @@ -32257,13 +40471,15 @@ #@gui : X-End (%) = int(100,0,100) #@gui : Y-Start (%) = int(0,0,100) #@gui : Y-End (%) = int(100,0,100) -#@gui : sep = separator(), note = note("Frame parameters :") +#@gui : sep = separator() +#@gui : note = note("Frame parameters :") #@gui : Width (%) = int(10,0,100) #@gui : Height (%) = int(10,0,100) #@gui : Color = color(0,0,0,255) #@gui : Outline Size = int(1,0,100) #@gui : Outline Color = color(255,255,255,255) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_frame : to_rgba repeat $! z. $1%,$3%,$2%,$4% @@ -32281,7 +40497,8 @@ #@gui : Blur Frame = float(0,0,100) #@gui : Blur Shade = float(0.1,0,1) #@gui : Blur Amplitude = float(3,0,10) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_frame_round : frame_round ${1-8} if $9 frame_blur $1,{min(99,$1+$9)},$3,$10,$11% fi @@ -32290,7 +40507,8 @@ #@gui : Width (%) = int(10,0,100) #@gui : Height (%) = int(10,0,100) #@gui : Roundness = float(0.25,0,1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/25/04.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/25/04.") fx_frame_smooth : repeat $! l[$>] sx={$1%*max(w,h)} sy={$2%*max(w,h)} @@ -32299,7 +40517,7 @@ v={min(i(w/2,0),i(w-1,h/2),i(w/2,h-1),i(0,h/2))} <=. $v fi frame $sx,$sy,1 - inpaint_diffusion[0] [1],100%,1,15 + inpaint_pde[0] [1],100%,1,15 rm. endl done c 0,255 @@ -32307,7 +40525,8 @@ #@gui : Vignette Strength = float(200,0,255) #@gui : Vignette Min Radius = float(50,0,100) #@gui : Vignette Max Radius = float(85,0,100) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_old_photo : vignette ${1-3} old_photo @@ -32322,7 +40541,8 @@ #@gui : Vignette Strength = float(50,0,255) #@gui : Vignette Min Radius = float(70,0,100) #@gui : Vignette Max Radius = float(95,0,100) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/20/06.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/20/06.") fx_polaroid : vignette ${8-10} polaroid $1,$2 drop_shadow $3%,$4%,$5%,$6 rotate $7,1,0 @@ -32332,7 +40552,8 @@ #@gui : Center (%) = point(50,50) #@gui : Opacity = float(0.2,0,1) #@gui : Angle = float(0,-90,90) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2012/22/11.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2012/22/11.") fx_tunnel : tunnel $1,$2%,{[${3,4}]%},${5-6} @@ -32341,7 +40562,8 @@ #@gui : Min Radius = float(70,0,100) #@gui : Max Radius = float(95,0,100) #@gui : Color = color(0,0,0,255) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2012/24/10.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2012/24/10.") fx_vignette : repeat $! to_rgb l[$>] to_rgba split_opacity @@ -32354,10 +40576,22 @@ #@gui Bandpass : fx_bandpass, fx_bandpass_preview(0) #@gui : Low Frequency = float(0,0,100) #@gui : High Frequency = float(100,0,100) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") #@gui : Value Action = choice(2,"None","Cut","Normalize") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_bandpass : repeat $! l[$>] split_opacity l[0] ac "bandpass $1%,$2%",$3,$4 @@ -32367,45 +40601,53 @@ gui_split_preview "fx_bandpass $*",${-3--1} #@gui Fourier Analysis : fx_display_fft, fx_display_fft(1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_display_fft : to_rgb display_fft #@gui Fourier Transform : fx_fourier, fx_fourier_preview(1) #@gui : Magnitude / Phase = choice{1,"One Layer (Horizontal)","One Layer (Vertical)","Two Layers"} #@gui : Discard Transparency = bool(1) -#@gui : sep = separator(), note = note{"Note: Apply this filter once to get the direct FFT, and once again to get the reverse transform."} +#@gui : sep = separator() +#@gui : note = note{"Note: Apply this filter once to get the direct FFT, +#@gui : and once again to get the reverse transform."} #@gui : url = link("Click here for a video tutorial","http://www.youtube.com/watch?v=3137dDa6P4s") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2018/06/16.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2018/06/16.") fx_fourier : skip ${2=0} if $2 remove_opacity fi magic="GMICFFT" - i=0 for {$i<$!} ni={$i+1} nm={$i,n} + i=0 for $i<$! ni={$i+1} nm={$i,n} # Detect FFT/iFFT mode. is_ifft=0 - +columns[$i] 100% l. mag,m0,M0,m1,M1=${u\ {t}} if {['$mag']=='$magic'} is_ifft=1 fi onfail endl rm. - if {!$is_ifft} +rows[$i] 100% l. mag,m0,M0,m1,M1=${u\ {t}} if {['$mag']=='$magic'} is_ifft=2 fi onfail endl rm. fi - if {!$is_ifft} - +rows[$i] 100% l. mag,m0,M0=${u\ {t}} if {['$mag']=='$magic'} is_ifft=3 fi onfail endl rm. - if {$is_ifft==3} is_ifft=0 +rows[$ni] 100% l. mag,m1,M1=${u\ {t}} if {['$mag']=='$magic'} is_ifft=3 fi onfail endl rm. fi + +columns[$i] 100% l. mag,m0,M0,m1,M1=${u\ {t}} if ['$mag']=='$magic' is_ifft=1 fi onfail endl rm. + if !$is_ifft +rows[$i] 100% l. mag,m0,M0,m1,M1=${u\ {t}} if ['$mag']=='$magic' is_ifft=2 fi onfail endl rm. fi + if !$is_ifft + +rows[$i] 100% l. mag,m0,M0=${u\ {t}} if ['$mag']=='$magic' is_ifft=3 fi onfail endl rm. + if $is_ifft==3 + is_ifft=0 +rows[$ni] 100% + l. mag,m1,M1=${u\ {t}} if ['$mag']=='$magic' is_ifft=3 fi onfail endl + rm. + fi fi # Compute the transform. - if {!$is_ifft} # FFT + if !$is_ifft # FFT l[$i] fftpolar +.. 1 log.. m0,M0,m1,M1={[im#0,iM#0,im#1,iM#1]} n[-2,-1] 0,255 - if {$1==0} ({'$magic,$m0,$M0,$m1,$M1'},0) y. a x - elif {$1==1} ({'$magic,$m0,$M0,$m1,$M1'},0) a y + if $1==0 ({'$magic,$m0,$M0,$m1,$M1'},0) y. a x + elif $1==1 ({'$magic,$m0,$M0,$m1,$M1'},0) a y else ({'$magic,$m0,$M0'},0) a[-3,-1] y ({'$magic,$m1,$M1'},0) a[-2,-1] y fi nm $nm endl else # iFFT - if {$is_ifft==1} columns[$i] 0,{$i,w-2} s[$i] x,2 - elif {$is_ifft==2} rows[$i] 0,{$i,h-2} s[$i] y,2 + if $is_ifft==1 columns[$i] 0,{$i,w-2} s[$i] x,2 + elif $is_ifft==2 rows[$i] 0,{$i,h-2} s[$i] y,2 else rows[$i,$ni] 0,{$i,h-2} fi l[$i,{$i+1}] n[0] $m0,$M0 n[1] $m1,$M1 exp[0] -[0] 1 ifftpolar c 0,255 endl @@ -32421,41 +40663,47 @@ #@gui : Text = text{"(c) G'MIC"} #@gui : Size = int(53,13,128) #@gui : sep = separator() -#@gui : note = note("Note: To make the watermark visible afterwards, use the 'Fourier Analysis' filter. ") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : note = note("Note: To make the watermark visible afterwards, use the +#@gui : 'Fourier Analysis' filter. ") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_watermark_fourier : watermark_fourier "$1",$2 c 0,255 #@gui ____Layers #----------------------- -#@gui Align Layers : fx_align_layers, fx_align_layers_preview +#@gui Align Layers : fx_align_layers, fx_align_layers_preview : * #@gui : Alignment Type = choice(0,"Rigid","Non-Rigid") #@gui : Smoothness = float(0.7,0,1) #@gui : Scales = choice(0,"Auto","1","2","3","4","5","6","7","8") #@gui : Revert Layers = bool(0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2020/01/11.") fx_align_layers : to_colormode 0 r ${-max_wh},1,100%,0,0,0.5,0.5 if ${4=0} _fx_revert_layers fi remove_opacity if $1 register_nonrigid[^-1] .,$2,0.1,$3 - else register_rigid[^-1] .,{3*$2} + else register_rigid[^-1] .,$2 fi fx_align_layers_preview : fx_align_layers $1,$2,0 blend_edges 0.1 _fx_revert_layers : - repeat {int($!/2)} rv[{2*$>},{2*$>+1}] done + repeat int($!/2) rv[{2*$>},{2*$>+1}] done -#@gui Blend [Average All] : fx_blend_average_all, fx_blend_average_all +#@gui Blend [Average All] : fx_blend_average_all, fx_blend_average_all : * #@gui : Colorspace = choice(0,"sRGB","Linear RGB","Lab") -#@gui : sep = separator(), note = note{"Note: -#@gui : This filter takes multiple layers as input and average them. Set the Input layers option to handle multiple input layers. +#@gui : sep = separator() +#@gui : note = note{"Note: +#@gui : This filter takes multiple layers as input and average them. Set the Input layers option +#@gui : to handle multiple input layers. #@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/11/08.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/11/08.") fx_blend_average_all : if $! to_rgba N=$! r ${-max_wh},1,100%,0,0,0.5,0.5 @@ -32466,28 +40714,31 @@ _gb_fwd : to_color - if {$1==1} repeat $! l[$>] sh 0,2 srgb2rgb. rm. endl done - elif {$1==2} repeat $! l[$>] sh 0,2 srgb2rgb. rgb2lab. rm. endl done + if $1==1 repeat $! l[$>] sh 0,2 srgb2rgb. rm. endl done + elif $1==2 repeat $! l[$>] sh 0,2 srgb2rgb. rgb2lab. rm. endl done fi _gb_bwd : to_color - if {$1==1} repeat $! l[$>] sh 0,2 rgb2srgb. rm. endl done - elif {$1==2} repeat $! l[$>] sh 0,2 lab2rgb. rgb2srgb. rm. endl done + if $1==1 repeat $! l[$>] sh 0,2 rgb2srgb. rm. endl done + elif $1==2 repeat $! l[$>] sh 0,2 lab2rgb. rgb2srgb. rm. endl done fi -#@gui Blend [Edges] : fx_blend_edges, fx_blend_edges(0) +#@gui Blend [Edges] : fx_blend_edges, fx_blend_edges(0) : * #@gui : Opacity = float(1,0,1) #@gui : Smoothness = float(0.8,0,5) #@gui : Revert Layers = bool(0) -#@gui : sep = separator(), note = note{"Note: -#@gui : This filter needs two layers to work properly. Set the Input layers option to handle multiple input layers. +#@gui : sep = separator() +#@gui : note = note{"Note: +#@gui : This filter needs two layers to work properly. Set the Input layers option to handle +#@gui : multiple input layers. #@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/21/01.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/21/01.") fx_blend_edges : - repeat {int($!/2)} l[$>,{$>+1}] if $3 rv fi +blend_edges[-2,-1] $2 rm... blend[-2,-1] alpha,$1 endl done + repeat int($!/2) l[$>,{$>+1}] if $3 rv fi +blend_edges[-2,-1] $2 rm... blend[-2,-1] alpha,$1 endl done -#@gui Blend [Fade] : fx_blend_fade, fx_blend_fade(1) +#@gui Blend [Fade] : fx_blend_fade, fx_blend_fade(1) : + #@gui : Preset = choice{1,"Custom","Linear","Circular","Wave","Keftales"} #@gui : Offset = float(0,-1,1) #@gui : Thinness = float(0,0,10) @@ -32506,14 +40757,16 @@ #@gui : } #@gui : Formula = text{"cos(4*pi*x/w) * sin(4*pi*y/h)"} #@gui : note = note{"Note: -#@gui : This filter needs two layers to work properly. Set the Input layers option to handle multiple input layers. +#@gui : This filter needs two layers to work properly. Set the Input layers option to handle +#@gui : multiple input layers. #@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/21/01.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/21/01.") fx_blend_fade : - if {$!==1} return fi + if $!==1 return fi to_colormode 4 _gb_fwd $7 - if {$1==0} [0],[0],1,1,"$11" + if $1==0 [0],[0],1,1,"$11" else _fx_blend_fade$1 $8,$9,$10 r. [0],[0],1,1,3 fi n. {-($!-2)*$3},{($!-2)*(1+$3)} @@ -32532,32 +40785,41 @@ _fx_blend_fade3 : [0],[0],1,1,0 =. 1,{($1+1)*50}%,{($2+1)*50}% distance. 1 *. {0.01+$3/2} cos. _fx_blend_fade4 : [0],[0],1,1,"((x-w*($1+0.5))*(y-h*($2+0.5)))%(0.2*w*h*(1.001+$3))" -#@gui Blend [Median] : fx_blend_median, fx_blend_median(0) +#@gui Blend [Median] : fx_blend_median, fx_blend_median(0) : * #@gui : Colorspace = choice(0,"sRGB","Linear RGB","Lab") -#@gui : sep = separator(), note = note{"Note: -#@gui : This filter needs at least two layers to work properly. Set the Input layers option to handle multiple input layers. +#@gui : sep = separator() +#@gui : note = note{"Note: +#@gui : This filter needs at least two layers to work properly. Set the Input layers option to handle +#@gui : multiple input layers. #@gui : "} -#@gui : sep = separator(), note = note("Authors: David Tschumperlé and Iain Fergusson. Latest Update: 2014/16/12.") +#@gui : sep = separator() +#@gui : note = note("Authors: David Tschumperlé and Iain Fergusson. +#@gui :       Latest Update: 2014/16/12.") fx_blend_median : _gb_fwd $1 blend_median _gb_bwd $1 -#@gui Blend [Seamless] : fx_blend_seamless, fx_blend_seamless_preview(1) +#@gui Blend [Seamless] : fx_blend_seamless, fx_blend_seamless_preview(1) : * #@gui : Mixed Mode = bool(0) #@gui : Inner Fading = float(0,0,100) #@gui : Outer Fading = float(25,0,100) #@gui : Colorspace = choice(0,"sRGB","Linear RGB","Lab") #@gui : sep = separator() #@gui : Output as Separate Layers = _bool(0) -#@gui : sep = separator(), note = note{"Note: -#@gui : This filter needs at least two layers to work properly. Set the Input layers option to handle multiple input layers. +#@gui : sep = separator() +#@gui : note = note{"Note: +#@gui : This filter needs at least two layers to work properly. Set the Input layers option to handle +#@gui : multiple input layers. #@gui : "} -#@gui : sep = separator(), url = link("Click here for a detailed description of this filter.","http://gimpchat.com/viewtopic.php?f=28&t=10204") +#@gui : sep = separator() +#@gui : url = link("Click here for a detailed description of this filter.",\ +# "http://gimpchat.com/viewtopic.php?f=28&t=10204") #@gui : url = link("+ Video tutorial 1","http://www.youtube.com/watch?v=Nu-S1HmOCgE") #@gui : url = link("+ Video tutorial 2","http://www.youtube.com/watch?v=zsHgQY6025I") #@gui : url = link("+ Video tutorial 3","http://www.youtube.com/watch?v=2e6FikWMkaQ") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/04/05.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/04/05.") fx_blend_seamless : rv _gb_fwd $4 @@ -32574,7 +40836,7 @@ fx_blend_seamless_preview : fx_blend_seamless ${1-4},0 -#@gui Blend [Standard] : fx_blend, fx_blend_preview +#@gui Blend [Standard] : fx_blend, fx_blend_preview : * #@gui : Mode = choice{6,"Add","Alpha","And","Average","Blue","Burn","Custom formula","Darken","Difference", #@gui : "Divide","Dodge","Edges","Exclusion","Freeze","Grain Extract","Grain Merge","Green","Hard Light", #@gui : "Hard Mix","Hue","Interpolation","Lighten","Lightness","Linear Burn","Linear Light","Luminance", @@ -32582,18 +40844,24 @@ #@gui : "Shape Area Max","Shape Area Max0","Shape Area Min","Shape Area Min0","Shape Average","Shape Average0", #@gui : "Shape Median","Shape Median0","Shape Min","Shape Min0","Shape Max","Shape Max0", #@gui : "Soft Burn","Soft Dodge","Soft Light","Screen","Stamp","Subtract","Value","Vivid Light","Xor"} -#@gui : Process As = choice("Two-by-Two","Upper Layer is the Top Layer for All Blends","Lower Layer is the Bottom Layer for All Blends") +#@gui : Process As = choice("Two-by-Two","Upper Layer is the Top Layer for All Blends", +#@gui : "Lower Layer is the Bottom Layer for All Blends") #@gui : Opacity (%) = float(100,0,100) #@gui : Preview All Outputs = bool(1) #@gui : sep = separator() #@gui : Custom Formula = text{"1/2 - 1/4*cos(pi*a) - 1/4*cos(pi*b)"} -#@gui : note = note{"Note: In custom formulas, a and b respectively stand for the values of the base layer and the blend layer, +#@gui : note = note{"Note: In custom formulas, a and b respectively stand for +#@gui : the values of the base layer and the blend layer, #@gui : and are defined in value range [0,1]."} -#@gui : sep = separator(), note = note{"Note: -#@gui : This filter needs at least two layers to work properly. Do not forget to set the Input layers option below to handle multiple input layers. +#@gui : sep = separator() +#@gui : note = note{"Note: +#@gui : This filter needs at least two layers to work properly. Do not forget to set the Input layers option +#@gui : below to handle multiple input layers. #@gui : "} -#@gui : url = link("Reference page for G'MIC blending modes","https://github.com/dtschump/gmic-community/wiki/Blending-modes") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2017/03/08.") +#@gui : url = link("Reference page for G'MIC blending modes", +#@gui : "https://github.com/dtschump/gmic-community/wiki/Blending-modes") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2017/03/08.") fx_blend : mode=${arg\ 1+$1,add,alpha,and,average,blue,burn,custom_formula,darken,difference,\ divide,dodge,edges,exclusion,freeze,grainextract,grainmerge,green,hardlight,\ @@ -32605,11 +40873,11 @@ softburn,softdodge,softlight,screen,stamp,subtract,value,\ vividlight,xor} m "_blend_custom_formula : f. \"a = i#0/255; b = i#1/255; 255*cut(($5),0,1)\"" - if {$2==0} repeat {int($!/2)} l[$>,{$>+1}] rv blend $mode,{$3%} endl done # Two-by-two. - elif {$2==1" && "$!>1} blend[^0] [0],$mode,{$3%},0 rm[0] # Top layer is top for all blends. - elif {$2==2" && "$!>1} blend[^-1] .,$mode,{$3%},1 rm. # Bottom layer is bottom for all blends. + if $2==0 repeat int($!/2) l[$>,{$>+1}] rv blend $mode,{$3%} endl done # Two-by-two. + elif $2==1" && "$!>1 blend[^0] [0],$mode,{$3%},0 rm[0] # Top layer is top for all blends. + elif $2==2" && "$!>1 blend[^-1] .,$mode,{$3%},1 rm. # Bottom layer is bottom for all blends. fi - uncommand _blend_custom_formula + um _blend_custom_formula fx_blend_preview : fx_blend $"*" @@ -32621,9 +40889,11 @@ #@gui : Minimal Area (%) = float(1,0,100) #@gui : Autocrop Output Layers = bool() #@gui : sep = separator() -#@gui : note = note{"Note: This filter decomposes an image into several layers each with a single color + a residual layer (if any). +#@gui : note = note{"Note: This filter decomposes an image into several layers each with +#@gui : a single color + a residual layer (if any). #@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/11/03.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/11/03.") fx_split_colors : skip ${2=0} to_rgb repeat $! l[$>] nm=${-gui_layer_name} @@ -32640,39 +40910,44 @@ frame 1,1,0 frame 3,3,255 to_rgba append_tiles , endl done -#@gui Fade Layers : fx_fade_layers, fx_fade_layers_preview +#@gui Fade Layers : fx_fade_layers, fx_fade_layers_preview : + #@gui : Inter-Frames = _int(10,2,100) -#@gui : sep = separator(), note = note{"Note: -#@gui : This filter needs at least two layers to work properly. Set the Input layers option to handle multiple input layers. +#@gui : sep = separator() +#@gui : note = note{"Note: +#@gui : This filter needs at least two layers to work properly. Set the Input layers option to handle +#@gui : multiple input layers. #@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2012/04/08.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2012/04/08.") fx_fade_layers : - if {$!<2} return fi + if $!<2 return fi to_colormode 0 r ${-max_wh},1,100%,0,0,0.5,0.5 a z r 100%,100%,{(d-1)*$1+1},100%,3 s z fx_fade_layers_preview : - if {$!<2} return fi + if $!<2 return fi to_colormode 0 r ${-max_wh},1,100%,0,0,0.5,0.5 k[0,1] + / 2 -#@gui Layers to Tiles : append_tiles, fx_append_tiles_preview(1) +#@gui Layers to Tiles : append_tiles, fx_append_tiles_preview(1) : * #@gui : X-Tiles = int(0,0,256) #@gui : Y-Tiles = int(0,0,256) #@gui : note = note("For both parameters, 0 means automatic.") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_append_tiles_preview : frame 1,1,0,0,0,255 append_tiles $1,$2 -#@gui Morph Layers : fx_morph, gui_no_preview +#@gui Morph Layers : fx_morph_layers, gui_no_preview : * #@gui : Inter-Frames = _int(10,2,100) #@gui : Smoothness = _float(0.2,0,2) #@gui : Precision = _float(0.1,0,2) #@gui : Revert Layers = bool(0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") -fx_morph : +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") +fx_morph_layers : if ${4=0} _fx_revert_layers fi to_rgb morph $1,$2,$3 @@ -32696,12 +40971,13 @@ #@gui : G'MIC Operator = text("") #@gui : Return Scaling = choice("None","Bloc","Linear","Cubic","Lanczos") #@gui : Lock Return Scaling to Source Layer = bool(0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/30/03.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/30/03.") fx_apply_multiscale : skip "${13=}" repeat $! l[$<] w0={w} h0={h} apply_scales "$13",$1,$2%,$3%,{10^$4},{arg(1+$5,1,3,5,6)} - if {$8||($9&&$8!=$12)} to_a N=$! repeat $! + if $8" || "($9" && "$8!=$12) to_a N=$! repeat $! angle={$9?$8+($12-$8)*$>/max($N-1,1):$8} rotate[$>] $angle done fi @@ -32733,41 +41009,59 @@ frame 1,1,0 frame 3,3,255 append_tiles , endl done -#@gui Pack : fx_pack, fx_pack_preview(1) -#@gui : Order By = choice(2,"Width","Height","Maximum Dimension","Area") -#@gui : Tends to Be Square = bool(0) +#@gui Pack : fx_pack, fx_pack_preview(1) : * +#@gui : Order By = choice(2,"Width","Height","Maximum Dimension","Area","Name") +#@gui : Tends to Be Square = bool(1) #@gui : Force Transparency = bool(1) +#@gui : Add Image Label = bool(0) +#@gui : Font Height (px) = float(16,0,64)_0 +#@gui : Font Colors = choice(1,"White on black","Black on white")_0 #@gui : sep = separator() #@gui : Output Coordinates File = _bool(0) #@gui : Output Folder = _folder() #@gui : sep = separator() -#@gui : note = note{"This filter tries to pack all input layers into a single image, while trying to minimize the empty areas. -#@gui : This problem being NP-hard, the algorithm finds (of course) a non-optimal, but often acceptable solution to this packing problem."} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/11/05.") -fx_pack : skip "${5=}" +#@gui : note = note{"This filter tries to pack all input layers into a single image, while trying to +#@gui : minimize the empty areas. +#@gui : This problem being NP-hard, the algorithm finds (of course) a non-optimal, but often acceptable +#@gui : solution to this packing problem."} +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2019/03/20.") +fx_pack : skip "${8=}" + if $4 to_rgba repeat $! l[$>] nm0={n} gui_layer_name nm=${} + 0 t. {``$nm},3,0,$5,1,1 frame. 1,1,0 + if $6 *. -1 fi + n. 0,255 to_rgba. r. {[w+2,h+1,1,4]},0,0,0,1 + rv a y,{w#0>w?0.5:0} nm $nm0 + endl done + fi if $3 to_a fi - if $4 repeat $! nm$>=${gui_layer_name[$>]} done fi - c0="w" c1="h" c2="max(w,h)" c3="w*h" + repeat $! gui_layer_name[$>] nm$>=${} nm[$>] {`lowercase(['${nm$>}'])`} done + c0="w" c1="h" c2="max(w,h)" c3="w*h" c4="n" pack $2,${c$1} coords=${} - if $4 - repeat 256 filename "$5/gmic_pack.txt",$> filename=${} if $filename else break fi done - if {!narg($filename)} filename="$5/gmic_pack.txt" fi - l[] repeat {narg($coords)/2} + if $7 + repeat 256 filename "$8/gmic_pack.txt",$> filename=${} if isfile(['{/$filename}']) else break fi done + if !narg($filename) filename="$8/gmic_pack.txt" fi + l[] repeat narg($coords)/2 x={arg(1+2*$>,$coords)} y={arg(2+2*$>,$coords)} - ({'"Image ""#"{1+$>}" ("${nm$>}"): "$x,$y\n'}) - done a x o raw:$filename,uchar rm endl + ('"Image ""#"{1+$>}" ("${nm$>}"): "$x,$y\n') + done a x ot $filename rm endl fi nm "name(G'MIC packing),pos(0,0),mode(normal)" + if $4 autocrop fi fx_pack_preview : - if {!$!} return fi + if !$! return fi w={w} h={h} filled=0 repeat $! filled={$>,$filled+w*h} done - fx_pack $1,$2,$3,0 + fx_pack $1,$2,$3,$4,$5,$6,0 area={w*h} to_rgba rr2d $w,$h,0 i[0] $w,16,1,4,255 t[0] "Filled: "{round(100*$filled/$area)}%,3,1,14,1,0,0,0,255 a y,0.5 + u "{$1}{$2}{$3}{$4}"\ + "{$5}_"{2*$4}\ + "{$6}_"{2*$4}\ + "{$7}{$8}" #@gui Stroke : fx_stroke, fx_stroke_preview(0) #@gui : Thickness (px) = int(3,1,256) @@ -32787,23 +41081,24 @@ #@gui : sep = separator() #@gui : Output Stroke Layer On = choice(1,"Bottom","Top") #@gui : Keep Original Image Size = bool(0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/24/06.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/24/06.") fx_stroke : to_a repeat $! l[$<] nm={n} - if {!$26" && "$5} expand_xy $1,0 is_frame1=0 else expand_xy 1,0 is_frame1=1 fi + if !$26" && "$5 expand_xy $1,0 is_frame1=0 else expand_xy 1,0 is_frame1=1 fi split_opacity +l. b $3 - if {$6>=100} + if $6>=100 shift $7,$8 - if {$6!=100} wh={w},{h} r $6%,$6%,1,1,3 r $wh,1,1,0,0,0.5,0.5 fi + if $6!=100 wh={w},{h} r $6%,$6%,1,1,3 r $wh,1,1,0,0,0.5,0.5 fi else - if {$6!=100} wh={w},{h} r $6%,$6%,1,1,3 r $wh,1,1,0,0,0.5,0.5 fi + if $6!=100 wh={w},{h} r $6%,$6%,1,1,3 r $wh,1,1,0,0,0.5,0.5 fi shift $7,$8 fi > {99.99-min(99.99,$2)}% distance $5,$4 ($9^$10^$11^$12) - if {$1>1} ($13^$14^$15^$16) a[-2,-1] x r. $1,1,1,4,3 c. 0,255 fi + if $1>1 ($13^$14^$15^$16) a[-2,-1] x r. $1,1,1,4,3 c. 0,255 fi i.. ($21^$22^$23^$24) ($17^$18^$19^$20) if $5 rv[-3,-1] fi a[-3--1] x map.. .,1 rm. nm $nm @@ -32824,7 +41119,8 @@ #@gui : X-Tiles = int(3,1,100) #@gui : Y-Tiles = int(3,1,100) #@gui : Force Tiles to Have Same Size = _bool(false) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_tiles2layers_preview : split_tiles $1,$2,$3 to_rgba frame 1,1,0,0,0,255 frame 3,3,0,0,0,0 append_tiles , @@ -32834,12 +41130,13 @@ #@gui : End of Mid-Tones = int(170,0,255) #@gui : Smoothness = float(0.5,0,5) #@gui : Alpha = choice("Binary","Scalar") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/05/04.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/05/04.") fx_tones2layers : sval=$2 eval={max($2,$3)} remove_opacity repeat $! l[$<] +luminance rv - repeat {$1-1} + repeat $1-1 [1] val0={$sval+($eval-$sval)*$>/($1-2)} val1={$sval+($eval-$sval)*($>+1)/($1-2)-1} @@ -32857,25 +41154,37 @@ r {100/$!}%,{100/$!}%,1,100%,2 to_rgba frame 1,1,0,0,0,255 frame 3,3,0,0,0,0 append_tiles , -#@gui ____Lights & Shadows -#------------------------------------ +#@gui ____Lights & Shadows +#--------------------------------- #@gui Burn : fx_burn, fx_burn_preview(1) #@gui : Amplitude = float(0.5,0,1) #@gui : Scale = float(30,1,100) #@gui : Smoothness = float(1,0,4) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") #@gui : Value Action = choice("None","Cut","Normalize") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2012/24/11.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2012/24/11.") _fx_burn : repeat $! l[$>] - w={w} h={h} + w,h={[w,h]} +norm - fx_fourier. 0 + fx_fourier. 2 +rows. 0,{$h-1} r. $2%,$2%,1,100%,0,0,0.5,0.5 b. $3% j.. .,{($w-w)/2},{($h-h)/2} rm. - fx_fourier. 1 + fx_fourier[-2,-1] 2 blend overlay,$1 endl done @@ -32895,13 +41204,14 @@ #@gui : sep = separator() #@gui : note = note("Merge the Mask") #@gui : Intensity = float(1,0,1) -#@gui : sep = separator(), note = note("Author: PhotoComiX. Latest Update: 2011/01/01.") +#@gui : sep = separator() +#@gui : note = note("Author: PhotoComiX.      Latest Update: 2011/01/01.") #@gui : url = link("Filter explained here","http://www.gimpchat.com/viewtopic.php?f=9&t=864") fx_contrast_swm : repeat $! l[$>] split_opacity l[0] +luminance to_rgb blur_xy[1] $1,$1 - if {$2==0} negate[1] fi + if $2==0 negate[1] fi rv blend hardlight,$3 endl a c endl done @@ -32912,7 +41222,8 @@ #@gui : Curvature = float(0,0,1) #@gui : Corner Brightness = float(0,0,1) #@gui : Angle = float(0,0,360) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2012/14/11.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2012/14/11.") fx_drop_shadow : * -1 + 255 vignette {255*$5},80,95 * -1 + 255 drop_shadow $1%,$2%,$3%,$4 rotate $6,1,0 @@ -32928,7 +41239,8 @@ #@gui : Smoothness = float(0.5,0,5) #@gui : Color = color(0,0,0,200) #@gui : Preview Only Shadow = bool(0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/02/07.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/02/07.") fx_drop_shadow3d : repeat $! l[$<] +_fx_drop_shadow3d $* @@ -32944,7 +41256,7 @@ _fx_drop_shadow3d : point3d 0,0,1 r3d. 1,0,0,$1 r3d. 0,1,0,$2 r3d. 0,0,1,$3 u={i(0,8)} v={i(0,9)} w={i(0,10)} rm. - to_a channels 100% if {im==iM} return fi + to_a channels 100% if im==iM return fi +f 'X=x/w-0.5;Y=y/h-0.5;A=($7-$4*$7/100)*$w/(X*$u+Y*$v+$7*$w);if(A<0,1e8,A)' +*. 'y/h-0.5' *.. 'x/w-0.5' +.. {0.5-$5/100} +. {0.5-$6/100} *.. {w} *. {h} a[-2,-1] c warp[0] .,0,1,0 rm. @@ -32952,8 +41264,14 @@ #@gui Equalize Shadow : fx_equalize_shadow, fx_equalize_shadow_preview(1) #@gui : Amplitude = float(1,0,1) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Authors: Francois Grassard and David Tschumperlé. Latest Update: 2012/24/11.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Authors: Francois Grassard and David Tschumperlé. +#@gui :       Latest Update: 2012/24/11.") fx_equalize_shadow : repeat $! l[$>] +negate blend softlight,$1 endl done @@ -32962,14 +41280,17 @@ #@gui Illuminate 2D Shape : fx_illuminate_shape2d,fx_illuminate_shape2d_preview(1)+ #@gui : note = note("Input / Output:) -#@gui : Input Type = choice{"Single Opaque Shapes Over Transp. BG","Multiple Colored Shapes Over Transp. BG","Bump Map","Normal Map"} +#@gui : Input Type = choice{"Single Opaque Shapes Over Transp. BG","Multiple Colored Shapes Over Transp. BG", +#@gui : "Bump Map","Normal Map"} #@gui : Output Type = choice{"Illumination","Bump Map","Normal Map"} #@gui : Input Guide Color = color(255,0,0,255) #@gui : Keep Base Layer as Input Background = bool(1) #@gui : Keep Transparency in Output = bool(1) -#@gui : sep = separator(), note = note("Shape:) +#@gui : sep = separator() +#@gui : note = note("Shape:) #@gui : Minimal Shape Area = int(4,1,100) -#@gui : note = note{"Parameter Minimal shape area is only active in Multiple colored shapes input mode."} +#@gui : note = note{"Parameter Minimal shape area is only active in Multiple colored shapes +#@gui : input mode."} #@gui : Preview Detected Shapes = bool(0) #@gui : Erosion / Dilation = float(0,-10,10) #@gui : Smoothness = float(3,0,6) @@ -32978,7 +41299,8 @@ #@gui : Resolution = choice{4,"Full (Slower)","2048","1024","512","256","128","64 (Faster)"} #@gui : sep = separator() #@gui : note = note("Illumination:) -#@gui : Blending Mode = choice(10,"Normal","Lighten","Screen","Dodge","Add","Darken","Multiply","Burn","Overlay","Soft Light","Hard Light","Grain Merge") +#@gui : Blending Mode = choice(10,"Normal","Lighten","Screen","Dodge","Add","Darken","Multiply","Burn","Overlay", +#@gui : "Soft Light","Hard Light","Grain Merge") #@gui : Opacity (%) = float(75,0,100) #@gui : Ambient (%) = float(30,-100,100) #@gui : Diffuse (%) = float(40,0,200) @@ -32994,9 +41316,14 @@ #@gui : Normalize Illumination = bool(0) #@gui : sep = separator() #@gui : Open Interactive Preview = button() -#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") -#@gui : sep = separator(), note = note{"Note: This filter automatically adds illumination to an opaque shape defined over a transparent background."} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2018/05/18.") +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : sep = separator() +#@gui : note = note{"Note: This filter automatically adds illumination to an opaque shape defined +#@gui : over a transparent background."} +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2018/05/18.") fx_illuminate_shape2d : input_type,\ output_type,\ @@ -33004,28 +41331,29 @@ preview_shapes,\ blending_mode,\ opacity=$1,$2,$7,$10,$16,$17 - blending_mode=${arg\ 1+$blending_mode,normal,lighten,screen,dodge,add,darken,multiply,burn,overlay,softlight,hardlight,grainmerge} + blending_mode=${arg\ 1+$blending_mode,normal,lighten,screen,dodge,add,darken,multiply,burn,overlay,\ + softlight,hardlight,grainmerge} keep_input_bg&={$!>1} if $output_type # Output : bumpmap or normalmap - repeat {$!-$keep_input_bg} _fx_illuminate_shape2d[$>] $* done + repeat $!-$keep_input_bg _fx_illuminate_shape2d[$>] $* done else # Output : illumination - repeat {$!-$keep_input_bg} if $keep_input_bg sel=$>,-1 else sel=$> fi l[$sel] - if {!$keep_input_bg" && "$input_type>=2} # From bumpmap/normalmap w/o background + repeat $!-$keep_input_bg if $keep_input_bg sel=$>,-1 else sel=$> fi l[$sel] + if !$keep_input_bg" && "$input_type>=2 # From bumpmap/normalmap w/o background _fx_illuminate_shape2d $* - elif {$keep_input_bg" && "$input_type>=2} # From bumpmap/normalmap w/ background + elif $keep_input_bg" && "$input_type>=2 # From bumpmap/normalmap w/ background _fx_illuminate_shape2d[0] $* - elif {!$keep_input_bg" && "$input_type<=1} # From shape w/o background + elif !$keep_input_bg" && "$input_type<=1 # From shape w/o background +_fx_illuminate_shape2d $* rv else # From shape w/ background _fx_illuminate_shape2d[0] $* fi - if {!$preview_shapes" || "0$_is_preview!=1} + if !$preview_shapes" || "0$_is_preview!=1 gui_set_layer_mode[0] $blending_mode gui_set_layer_opacity[0] $opacity - if {$!>1" && "(0$_output_mode==0" || "0$_is_preview==1)} - if {$keep_input_bg" && "!0$_is_preview} . fi + if $!>1" && "(0$_output_mode==0" || "0$_is_preview==1) + if $keep_input_bg" && "!0$_is_preview . fi gui_merge_layers[0,1] else k[0] fi fi @@ -33040,7 +41368,7 @@ keep_input_bg&={$!>1} if $preview_interactive fx_illuminate_shape2d_preview_interactive $* fi if $keep_input_bg - repeat {$!-1} l[$>,-1] + repeat $!-1 l[$>,-1] fx_illuminate_shape2d $* rv to_colormode 0 a z gui_split_preview "slices 50%,100%",$-1 @@ -33054,11 +41382,11 @@ input_type,\ keep_input_bg=$1,$7 keep_input_bg&={$!>1} - repeat {$!-$keep_input_bg} if $keep_input_bg sel=$>,-1 else sel=$> fi +l[$sel] + repeat $!-$keep_input_bg if $keep_input_bg sel=$>,-1 else sel=$> fi +l[$sel] to_rgba +_fx_illuminate_shape2d[0] $1,2,${3-6},0,1,""$9,0,${11-15},""${16-29},""0,0 - if {$!>2} rm[0] elif {$input_type>=2} sh[0] 0,2 f. 128 rm. fi - siz=${fitscreen\ {w},{h},1,256,640} + if $!>2 rm[0] elif $input_type>=2 sh[0] 0,2 f. 128 rm. fi + siz=${fitscreen\ {[w,h,1]},256,640} wsiz0=${fitscreen\ $siz,1,30%,100%} wsiz=$wsiz0 r $siz,1,100%,3 @@ -33077,13 +41405,13 @@ do x,y,b,mw={rgb,[{*,x},{*,y}]*[w,h]/[{*,w},{*,h}]},{*,b},{*,-o} lightz={cut($lightz-0.3*sign($mw)+($y0>=0?3*($y-$y0)/h),0.1,4)} - if {$x<0} x,y={rgb,ang=$|;(1+[cos(1.4*ang),sin(0.85*ang)])*[w,h]/2} fi - if {!$b" || "($b&1)} - if {$b" && "!$clicked} x0,y0=$x,$y - elif {!$b} x0,y0=-1 + if $x<0 x,y={rgb,ang=$|;(1+[cos(1.4*ang),sin(0.85*ang)])*[w,h]/2} fi + if !$b" || "($b&1) + if $b" && "!$clicked x0,y0=$x,$y + elif !$b x0,y0=-1 fi lightx,lighty={rgb,3.5*(2*[$x/w,$y/h]-1)} - if {[$ox,$oy,$ob,$olightz]!=[$x,$y,$b,$lightz]} + if [$ox,$oy,$ob,$olightz]!=[$x,$y,$b,$lightz] +fx_illuminate_shape2d[normal,rgb] 4,0,${3-6},1,1,""$9,0,${11-15},""${16-25},$lightx,$lighty,$lightz,$29,""0,0 +j[background] .,0,0,0,0,1,[alpha],255 rm.. +r2dx[light_alpha,light_rgb] {light_rgb,8+$lightz*(w-8)} j... .,{[$x,$y]-[w,h]/2},0,0,1,.. rm[-2,-1] @@ -33092,18 +41420,18 @@ else wait fi clicked=$b - elif {$b&2} + elif $b&2 +j[background] [rgb],0,0,0,0,1,[alpha],255 +r2dx[light_alpha,light_rgb] {light_rgb,8+$lightz*(w-8)} j... .,{[$x,$y]-[w,h]/2},0,0,1,.. rm[-2,-1] w. rm. wait fi - if {{*,CTRLLEFT}&&{*,-D}} w[] {1.5*[{*,w},{*,h}]} wsiz={*,w},{*,h} - elif {{*,CTRLLEFT}&&{*,-C}} w[] {0.75*[{*,w},{*,h}]} wsiz={*,w},{*,h} - elif {{*,CTRLLEFT}&&{*,-R}} w[] $wsiz0 + if {*,CTRLLEFT}" && "{*,-D} w[] {1.5*[{*,w},{*,h}]} wsiz={*,w},{*,h} + elif {*,CTRLLEFT}" && "{*,-C} w[] {0.75*[{*,w},{*,h}]} wsiz={*,w},{*,h} + elif {*,CTRLLEFT}" && "{*,-R} w[] $wsiz0 fi ox,oy,ob=$x,$y,$b - while {{*}" && "!{*,ESC}" && "!{*,Q}} + while {*}" && "!{*,ESC}" && "!{*,Q} w 0 rm endl done @@ -33139,27 +41467,27 @@ # Generate 2D binary shape and corresponding bumpmap nm={n} - if {$input_type==0} # Single opaque shape + if $input_type==0 # Single opaque shape to_rgba +channels. 100% >. 0 . select_color... 0,$gR,$gG,$gB,$gA mv... $! -[-2,-1] - elif {$input_type==1} # Multiple colored shapes + elif $input_type==1 # Multiple colored shapes to_rgba +channels. 100% >. 0 *[-2,-1] - if {$min_shape_area>1} +quantize_area. {$min_shape_area^2} fi + if $min_shape_area>1 +quantize_area. {$min_shape_area^2} fi s. c,-{s-1} >. 0 rv[-2,-1] - if {s>1} f. "begin(A = resize([ 0,(s-1)/s ],s,3));I+A" norm. round. 0.01 fi + if s>1 f. "begin(A = resize([ 0,(s-1)/s ],s,3));I+A" norm. round. 0.01 fi label. 0,0 f. "j(1)!=i || j(0,1)!=i" thinning. 1 ==. 0 *. .. select_color... 0,$gR,$gG,$gB,$gA mv... $! -[-2,-1] - elif {$input_type==2} # Bump map + elif $input_type==2 # Bump map to_a s c,-{s-1} >. 0 *.. . rv s. c S={$!-1} +[^0] /. $S - elif {$input_type==3} # Normal map + elif $input_type==3 # Normal map +channels 100% >. 0 *.. . rv f. "I==vector4(0)?[128,128,255,255]:I" channels. 0,2 @@ -33168,23 +41496,26 @@ +channels 100% rv fi - if {0$_is_preview" && "$preview_shapes} - if {$input_type==3} k[0] else k. fi + if 0$_is_preview" && "$preview_shapes + if $input_type==3 k[0] else k. fi +dilate. 3 label_fg.. 0 srand 0 {-2,iM+1},1,1,3,'x==0?[0,0,0]:x==1?[255,255,255]:u([255,255,255])' map... . rm. *. 255 a c return fi - if {$input_type<=1} shape2bump. {arg($resolution,2048,1024,512,256,128,64)},$weight_avg_max,{$dilation%*max(w,h)},{$shape_smoothness*50} fi - if {$input_type<=2} - if {$input_type==2" && "$shape_smoothness} mM={[im,iM]} guided. ..,$shape_smoothness%,100 n. $mM fi + if $input_type<=1 + shape2bump. {arg($resolution,2048,1024,512,256,128,64)},$weight_avg_max,{$dilation%*max(w,h)},\ + {$shape_smoothness*50} + fi + if $input_type<=2 + if $input_type==2" && "$shape_smoothness mM={[im,iM]} guided. ..,$shape_smoothness%,100 n. $mM fi *. $bump_factor fi # Generate output. - if {$output_type==1} # Output as a bump map - if {$input_type<=2} + if $output_type==1 # Output as a bump map + if $input_type<=2 if $keep_output_transparency k[-2,-1] n 0,255 rv a c # With transparency else k. n 0,255 # Without transparency fi @@ -33192,15 +41523,15 @@ rm gui_error_preview "Cannot convert a normal map to a bump map." return fi - elif {$output_type==2} # Output as a normal map - if {$input_type<=2} round 0.0001 bump2normal. f. "i(#-2)?I:[128,128,255]" fi + elif $output_type==2 # Output as a normal map + if $input_type<=2 round 0.0001 bump2normal. f. "i(#-2)?I:[128,128,255]" fi if $keep_output_transparency k[-2,-1] rv *. 255 a c # With transparency else k. # Without transparency fi else # Output as illumination layer (phong model) - if {$input_type<=2} g. xy a[-2,-1] c - elif {$input_type==3} -. 128 /. 127 s. c,-2 /[-2,-1] + if $input_type<=2 g. xy a[-2,-1] c + elif $input_type==3 -. 128 /. 127 s. c,-2 /[-2,-1] fi f. "* begin( @@ -33227,7 +41558,7 @@ ):0; [ res,0 ]" channels. 0 *. 255 c. 0,255 - if {$light_smoothness" || "$linearity} + if $light_smoothness" || "$linearity mM={[im,iM]} if $light_smoothness b. $light_smoothness% fi if $linearity n. 0,1 ^. {10^-($linearity%)} fi @@ -33237,20 +41568,34 @@ if $normalize_illumination n. 0,255 fi rv[-2,-1] *. 255 a[-2,-1] c nm $nm - if {!$keep_output_transparency} remove_opacity. fi + if !$keep_output_transparency remove_opacity. fi fi nm $nm #@gui Light Glow : fx_lightglow, fx_lightglow_preview(0) #@gui : Density = float(30,0,100) #@gui : Amplitude = float(0.5,0,2) -#@gui : Mode = choice(8,"Burn","Dodge","Freeze","Grain Merge","Hard Light","Interpolation","Lighten","Multiply","Overlay","Reflect","Soft Light","Stamp","Value") +#@gui : Mode = choice(8,"Burn","Dodge","Freeze","Grain Merge","Hard Light","Interpolation","Lighten","Multiply", +#@gui : "Overlay","Reflect","Soft Light","Stamp","Value") #@gui : Opacity = float(0.8,0,1) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/21/02.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/21/02.") _fx_lightglow : - mode=${arg\ 1+$3,burn,dodge,freeze,grainmerge,hardlight,interpolation,lighten,multiply,overlay,reflect,softlight,stamp,value} + mode=${arg\ 1+$3,burn,dodge,freeze,grainmerge,hardlight,interpolation,lighten,multiply,overlay,reflect,\ + softlight,stamp,value} repeat $! +gradient_norm. >=. {100-$1}% distance. 1 ^. $2 *. -1 n. 0,255 blend $mode,$4 mv. 0 done @@ -33268,23 +41613,32 @@ #@gui : Y-Scale = float(1,1,10) #@gui : Hue = float(0,-180,180) #@gui : Opacity = float(0.85,0,1) -#@gui : Blend Mode = choice(2,"Normal","Lighten","Screen","Dodge","Add","Darken","Multiply","Burn","Overlay","Soft Light","Hard Light","Difference","Subtract","Grain Extract","Grain Merge","Divide","Hue","Saturation","Value") +#@gui : Blend Mode = choice(2,"Normal","Lighten","Screen","Dodge","Add","Darken","Multiply","Burn","Overlay", +#@gui : "Soft Light","Hard Light","Difference","Subtract","Grain Extract","Grain Merge","Divide","Hue","Saturation", +#@gui : "Value") #@gui : Output as Separate Layers = _bool(1) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note{"This filter uses the free light leaks dataset available at :"} +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note{"This filter uses the free light leaks dataset available at :"} #@gui : url = link{"Lomo Light Leaks","http://www.photoshoptutorials.ws/downloads/mockups-graphics/lomo-light-leaks/"} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/01/07.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/01/07.") fx_light_leaks : filename=lightleak_${"padint $1",6}.cimgz - if ${_path_rc}$filename i ${_path_rc}$filename - else i https://gmic.eu/data_lightleaks/$filename o. ${_path_rc}$filename + if isfile(['{/${-path_cache}$filename}']) i ${-path_cache}$filename + else i https://gmic.eu/data_lightleaks/$filename o. ${-path_cache}$filename fi - mode=${arg\ 1+$7,normal,lighten,screen,dodge,add,darken,multiply,burn,overlay,softlight,hardlight,difference,subtract,grainextract,grainmerge,divide,hue,saturation,value} + mode=${arg\ 1+$7,normal,lighten,screen,dodge,add,darken,multiply,burn,overlay,softlight,hardlight,difference,\ + subtract,grainextract,grainmerge,divide,hue,saturation,value} mv. 0 - repeat {$!-1} l[0,{1+$<}] + repeat $!-1 l[0,{1+$<}] +r[0] {1,w},{1,h},1,3,5 rotate. $2,1,1,50%,50% - if {$3>1" || "$4>1} f. 'w2=w/2;h2=h/2;X=x-w2;Y=y-h2;i(w2+X/$3,h2+Y/$4,0,c,1,0)' fi + if $3>1" || "$4>1 f. 'w2=w/2;h2=h/2;X=x-w2;Y=y-h2;i(w2+X/$3,h2+Y/$4,0,c,1,0)' fi c. 0,255 if $5 rgb2hsv. sh. 0 +. $5 rm. hsv2rgb. fi if $8 @@ -33298,15 +41652,23 @@ gui_split_preview "fx_light_leaks ${1--5},0",${-3--1} _fx_light_leaks : - u="" repeat 71 if {narg($u)} u=$u, fi u=${u}lightleak_${"padint "$>,6} done + u="" repeat 71 if narg($u) u=$u, fi u=${u}lightleak_${"padint "$>,6} done u $u #@gui Light Patch : fx_light_patch, fx_light_patch(0) #@gui : Density = int(5,2,30) #@gui : Darkness = float(0.7,0,1) #@gui : Lightness = float(2.5,1,4) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_light_patch : repeat $! l[$>] split_opacity l[0] ac "light_patch $1,$2,$3",$4 @@ -33318,7 +41680,8 @@ #@gui : Length = float(1,0,1) #@gui : Attenuation = float(0.5,0,1) #@gui : Transparency = bool(0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/03/01.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/03/01.") fx_lightrays : lightrays $1,$2%,$3%,$4,$5 if $6 repeat $! r[$>] 100%,100%,1,{{$>,s}+({$>,s}%2)} done fi @@ -33327,8 +41690,14 @@ #@gui : Strength = float(0.75,0,1) #@gui : Scale = float(5,0,20) #@gui : Post-Normalize = bool(1) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Authors: Morgan Hardwood and David Tschumperlé. Latest Update: 2017/03/05.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Authors: Morgan Hardwood and David Tschumperlé. +#@gui :       Latest Update: 2017/03/05.") fx_pop_shadows : repeat $! l[$>] split_opacity l[0] .x2 @@ -33352,14 +41721,23 @@ #@gui : Z-Scale = float(0.5,0,3) #@gui : Opacity as Heightmap = bool(0) #@gui : Image Smoothness = float(0,0,10) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_light_relief : b $11% light_relief ${1-5},{[$6,$7]%},${8-10} #@gui Shadow Patch : fx_shadow_patch, fx_shadow_patch(1) #@gui : Opacity = float(0.7,0,1) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_shadow_patch : repeat $! l[$>] split_opacity l[0] ac "shadow_patch $1",$2 @@ -33369,31 +41747,36 @@ #@gui : Luminosity Type = choice(1,"Average RGB","Luminance","Lightness","Value") #@gui : Output As = _choice(1,"Mask","Masked Image") #@gui : Preview Type = choice(2,"Mask","Mask + Background","Image","Image + Background") -#@gui : sep = separator(), note = note{"Slice 1 (shadows):"} +#@gui : sep = separator() +#@gui : note = note{"Slice 1 (shadows):"} #@gui : Activate Slice 1 = bool(1) #@gui : Starting Value = int(0,0,255) #@gui : Ending Value = int(64,0,255) #@gui : Starting Feathering = int(0,0,255) #@gui : Ending Feathering = int(0,0,255) -#@gui : sep = separator(), note = note{"Slice 2 (low midtones):"} +#@gui : sep = separator() +#@gui : note = note{"Slice 2 (low midtones):"} #@gui : Activate Slice 2 = bool(1) #@gui : Starting Value = int(64,0,255) #@gui : Ending Value = int(128,0,255) #@gui : Starting Feathering = int(0,0,255) #@gui : Ending Feathering = int(0,0,255) -#@gui : sep = separator(), note = note{"Slice 3 (high midtones):"} +#@gui : sep = separator() +#@gui : note = note{"Slice 3 (high midtones):"} #@gui : Activate Slice 3 = bool() #@gui : Starting Value = int(128,0,255) #@gui : Ending Value = int(192,0,255) #@gui : Starting Feathering = int(0,0,255) #@gui : Ending Feathering = int(0,0,255) -#@gui : sep = separator(), note = note{"Slice 4 (highlights):"} +#@gui : sep = separator() +#@gui : note = note{"Slice 4 (highlights):"} #@gui : Activate Slice 4 = bool() #@gui : Starting Value = int(192,0,255) #@gui : Ending Value = int(255,0,255) #@gui : Starting Feathering = float(0,0,255) #@gui : Ending Feathering = float(0,0,255) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/22/09.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/22/09.") fx_slice_luminosity : remove_opacity repeat $! l[$<] to_rgb _fx_slice_luminosity $* @@ -33404,17 +41787,17 @@ fx_slice_luminosity_preview : remove_opacity repeat $! l[$>] to_rgb _fx_slice_luminosity $* - if {$3==0} rm[0] channels {s-1} - elif {$3==1} 100%,100%,1,1,128 a[0,-1] c r. 100%,100%,1,4 blend alpha - elif {$3==2} a c + if $3==0 rm[0] channels {s-1} + elif $3==1 100%,100%,1,1,128 a[0,-1] c r. 100%,100%,1,4 blend alpha + elif $3==2 a c else +. 96 c. 0,255 a c fi endl done _fx_slice_luminosity : - if {$1==0} +compose_channels + /. 3 - elif {$1==1} +luminance - elif {$1==2} +srgb2lab8. channels. 0 + if $1==0 +compose_channels + /. 3 + elif $1==1 +luminance + elif $1==2 +srgb2lab8. channels. 0 else +compose_channels max fi if $4 +apply_curve[1] 0,{$5-$7-0.1},0,$5,255,$6,255,{$6+$8+0.1},0,512,0 fi @@ -33429,17 +41812,22 @@ #@gui Bayer Filter : rgb2bayer, rgb2bayer(0) #@gui : Starting Pattern = choice(0,"Red-Green","Blue-Green","Green-Red","Green-Blue") #@gui : Keep Colors = bool(1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") #@gui Box Fitting : fx_boxfitting, fx_boxfitting_preview(0) #@gui : Minimal Size = int(3,1,32) #@gui : Maximal Size = int(0,0,32) -#@gui : note = note("Note: Set Maximal size to 0 to allow any size for the squares.") +#@gui : note = note("Note: Set Maximal size to 0 to allow any size +#@gui : for the squares.") #@gui : Initial Density = float(0.1,0,1) #@gui : Transparency = bool(0) -#@gui : sep = separator(), note = note("Note: This filter has been highly inspired by the work of Jared Tarbell, described on the page:") +#@gui : sep = separator() +#@gui : note = note("Note: This filter has been highly inspired by the work of Jared Tarbell, +#@gui : described on the page:") #@gui : url = link("http://www.complexification.net/gallery/machines/boxFittingImg/") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/06/06.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/06/06.") fx_boxfitting : boxfitting ${1-3},3 if $4 to_rgba replace_color 0,0,0,0,0,255,0,0,0,0 fi @@ -33456,11 +41844,12 @@ #@gui : Color 2 = color(75,90,65) #@gui : Color 3 = color(179,189,117) #@gui : Color 4 = color(255,246,158) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/26/10.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/26/10.") fx_camouflage : repeat $! l[$>] split_opacity l[0] channels 0 r {w+16},{h+16},1,1,0 rand 0,16 - amp=$3 do smooth {min(50,$amp)},0,1 amp-=50 while {$amp>0} + amp=$3 do smooth {min(50,$amp)},0,1 amp-=50 while $amp>0 shrink_xy. 8 n 1,$2 round repeat $1 +area 0,0 <. {1+2^$>} inpaint[0] [1],0,3 rm. done +colormap 0 n.. 0,{w-1} @@ -33478,13 +41867,19 @@ #@gui : Amplitude = float(70,0,300) #@gui : Angle = float(135,0,180) #@gui : Sharpness = float(400,0,2000) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_canvas : repeat $! l. if $4 ({cos($2*pi/180)}^{sin($2*pi/180)}) vector2tensor. r. ..,.. +smooth.. .,$1 rm.. sharpen. $3 c. 0,255 - ({cos($6*pi/180)}^{sin($6*pi/180)}) vector2tensor. r. ..,.. smooth... .,$5 rm. sharpen.. $7 c.. 0,255 +[-2,-1] /. 2 + ({cos($6*pi/180)}^{sin($6*pi/180)}) vector2tensor. r. ..,.. smooth... .,$5 rm. sharpen.. $7 c.. 0,255 + +[-2,-1] /. 2 else ({cos($2*pi/180)}^{sin($2*pi/180)}) vector2tensor. r. ..,.. smooth.. .,$1 rm. sharpen. $3 c. 0,255 fi @@ -33497,15 +41892,28 @@ #@gui : Amplitude = float(20,0,256) #@gui : Fibrousness = float(3,0,20) #@gui : Emboss = float(0.6,0,1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") #@gui Cracks : fx_cracks, fx_cracks_preview(0) #@gui : Density (%) = float(30,0,100) #@gui : Relief = bool(true) #@gui : Color = color(255,255,255,128) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/20/07.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/20/07.") fx_cracks : ac "cracks $1,$2,{$6/255},${3-5},255",$7 @@ -33516,8 +41924,13 @@ #@gui : Density = float(50,0,100) #@gui : Smoothness = float(0.2,0,2) #@gui : Edges = float(20,0,100) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/19/01.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/19/01.") fx_crystal : repeat $! l[$>] split_opacity l[0] s={s} @@ -33528,7 +41941,7 @@ +b. $sigma sigma*={(1+$2)} sh[0,-1] $s max. .. rm[-2,-1] f. 'W=i(x,y,z,$s);if(W<0.001||W>=1,0,if(c<$s,i/W,1))' - if {!iM} rm[1] break fi + if !iM rm[1] break fi sh. $s j[0] [1],0,0,0,0,1,[2] k[0] while 1 @@ -33544,7 +41957,8 @@ #@gui : Random Seed = int(0,0,65535) #@gui : Opacity (%) = float(100,0,100) #@gui : Color = bool(1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/18/10.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/18/10.") fx_crystal_background : repeat $! l[$>] split_opacity l[0] N={2*max(3,round((${"is_percent $2"}?4*wh*$2:$2)))} @@ -33560,14 +41974,20 @@ #@gui : Contrast (%) = float(0,-100,100) #@gui : Gamma (%) = float(0,-100,100) #@gui : Smoothness = float(0,0,10) -#@gui : sep = separator(), note = note("Halftone parameters :") +#@gui : sep = separator() +#@gui : note = note("Halftone parameters :") #@gui : Number of Tones = int(5,2,32) #@gui : Size for Dark Tones = int(8,2,256) #@gui : Size for Bright Tones = int(8,2,256) #@gui : Shape = choice{5,"Square","Diamond","Circle","Square (Inv.)","Diamond (Inv.)","Circle (Inv.)"} #@gui : Smoothness = float(0.1,0,32) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2012/23/07.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2012/23/07.") fx_halftone : adjust_colors ${1-3},0,0,0,255 b $4 repeat $! l[$>] split_opacity @@ -33579,9 +41999,21 @@ #@gui Hearts : fx_hearts, fx_hearts_preview(0) #@gui : Density = float(2,0,30) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_hearts : ac "hearts $1",$2 @@ -33593,8 +42025,13 @@ #@gui : Smoothness = float(5,0,100) #@gui : Scale = float(3,0,20) #@gui : Sharpness = float(0,0,1000) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2012/26/11.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2012/26/11.") fx_lava : repeat $! l[$>] split_opacity l[0] norm 100%,100% plasma. 1,1,{16-$1} smooth. $2,0,1,$3,$3,0.8,90 * @@ -33617,7 +42054,8 @@ #@gui : Sigma = float(1.1,0,20) #@gui : Cut Low = float(0,0,100) #@gui : Cut High = float(100,0,100) -#@gui : sep = separator(), note = note("Author: Preben Soeberg. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: Preben Soeberg.      Latest Update: 2010/29/12.") fx_marble : repeat $! l[$>] split_opacity l[0] marble $1/10,$2/10,$3,$4,$5,$6,$7,$8,$9%,$10% @@ -33629,16 +42067,17 @@ #@gui : Masking = choice("None","Render on Dark Areas","Render on White Areas") #@gui : Preserve Image Dimension = bool(1) #@gui : Maze Type = choice("Dark Walls","White Walls") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/02/09.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/02/09.") fx_maze : repeat $! l[$>] w={w} h={h} r. {100/$1}%,{100/$1}%,1,100%,2 - if {$3==0} f. 1 - elif {$3==1} negate. + if $3==0 f. 1 + elif $3==1 negate. fi maze_mask. $1 dilate. $2 *. 255 - if {!$5} negate. fi + if !$5 negate. fi if $4 r. $w,$h,100%,100% fi endl done @@ -33648,7 +42087,8 @@ #@gui : Smoothness = float(1,0,10) #@gui : Shade Strength = float(100,0,255) #@gui : Shade Angle = float(0,0,360) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/01/02.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/01/02.") fx_mineral_mosaic : repeat $! l[$>] to_rgb +b $3 segment_watershed. $1 +norm. @@ -33662,9 +42102,21 @@ #@gui Mosaic : fx_mosaic, fx_mosaic_preview(0) #@gui : Density (%) = float(50,0,100) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/19/07.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/19/07.") fx_mosaic : ac "repeat $! l[$>] split_opacity mosaic[0] $1 a c endl done",$2 @@ -33672,37 +42124,46 @@ gui_split_preview "fx_mosaic $*",${-3--1} #@gui Op Art : fx_shapes,fx_shapes_preview(0) -#@gui : Shape = choice{1,"Custom Layers","Circles","Squares","Diamonds","Triangles","Horizontal Stripes","Vertical Stripes","Balls","Hearts","Stars","Arrows","Truchet", -#@gui : "Circles (Outline)","Squares (Outline)","Diamonds (Outline)","Triangles (Outline)","Hearts (Outline)","Stars (Outline)","Arrows (Outline)"} +#@gui : Shape = choice{1,"Custom Layers","Circles","Squares","Diamonds","Triangles","Horizontal Stripes", +#@gui : "Vertical Stripes","Balls","Hearts","Stars","Arrows","Truchet","Circles (Outline)","Squares (Outline)", +#@gui : "Diamonds (Outline)","Triangles (Outline)","Hearts (Outline)","Stars (Outline)","Arrows (Outline)"} #@gui : Number of Scales = int(16,2,24) #@gui : Resolution = float(10,1,50) #@gui : Zoom Factor = _int(2,1,8) #@gui : Minimal Size = float(5,0,150) #@gui : Maximal Size = float(90,0,150) -#@gui : Stencil Type = choice(0,"Black & White","RGB","Color") +#@gui : Stencil Type = choice(0,"Black & White","RGB","Color") #@gui : Allow Angle = choice("0 deg.","90 deg.","180 deg.") #@gui : Negative = bool(1) #@gui : Antialiasing = bool(1) #@gui : sep = separator() #@gui : note = note{"Note: -#@gui : If you set the parameter Shape to Custom layers, the different shapes used to map the pixel intensities will be defined as -#@gui : the Number of scales top layers of your image. Don't forget to set also Input layers to All to be sure +#@gui : If you set the parameter Shape to Custom layers, the different shapes used to map +#@gui : the pixel intensities will be defined as +#@gui : the Number of scales top layers of your image. Don't forget to set also Input layers to +#@gui : All to be sure #@gui : these layers are passed to the filter. #@gui : "} -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/16/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/16/12.") fx_shapes : if $1 # Pre-defined shapes. remove_opacity repeat $! l[$>] - if {!$7} _fx_shapes $* * 255 - elif {$7==1} split_opacity to_rgb[0] s[0] c repeat 3 _fx_shapes[$>] $* done *[0-2] 255 a[0-2] c a c + if !$7 _fx_shapes $* * 255 + elif $7==1 split_opacity to_rgb[0] s[0] c repeat 3 _fx_shapes[$>] $* done *[0-2] 255 a[0-2] c a c else +_fx_shapes $* r[0] $3%,$3% r[0] [1],[1] * fi endl done else # Custom shapes. - if {$!<=$2} error[] "Command '$0': Some layers are missing in 'Custom layers' mode ("{$2+1}" expected at least, "$!" provided)." fi + if $!<=$2 + error[] "Command '$0': Some layers are missing in 'Custom layers' mode ("{$2+1}" expected at least, "\ + $!" provided)." fi to_colormode[0-{$2-1}] ${max_s[0-{$2-1}]} remove_opacity[$2--1] - repeat {$!-$2} l[0-{$2-1},{$2+$>}] + repeat $!-$2 l[0-{$2-1},{$2+$>}] norm. w={w} h={h} r. $3%,$3%,1,1,2 s={$4*max(round($w/w),round($h/h))} r0={$s*$5%} r1={$s*$6%} @@ -33719,7 +42180,7 @@ r $w,$h,1,100%,0,0,0.5,0.5 endl done else - if {$!>$2} repeat {$!-$2} l[0-{$2-1},{$2+$>}] + if $!>$2 repeat $!-$2 l[0-{$2-1},{$2+$>}] w={w} h={h} +fx_shapes ${1-3},1,${5--2} rm.. r. $w,$h,1,100%,0,0,0.5,0.5 @@ -33806,14 +42267,17 @@ #@gui : Masking = choice("No Masking","Mask as Bottom Layer") #@gui : Width = int(512,32,2048) #@gui : Height = int(512,32,2048) -#@gui : note = note("Notes:\n - Parameters Width and Height are considered only when No masking mode is selected.\n +#@gui : note = note("Notes:\n - Parameters Width and Height are considered only when +#@gui : No masking mode is selected.\n #@gui : - Set different sprites on different layers to pack multiple sprites at the same time.") #@gui : url = link("Click here for a video tutorial","http://www.youtube.com/watch?v=bpg7CGH7vCM") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/24/06.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/24/06.") fx_pack_sprites : if $6 # With mask. - if {$!<2} error[] "Command '$0': Masking requires at least two input layers ! (please check that 'Input Layers' is correctly set)." fi - repeat {$!-1} l[$>] to_rgba split_opacity +!=[1] 0 *[0] . a c autocrop 0 endl done + if $!<2 error[] "Command '$0': Masking requires at least two input layers ! + (please check that 'Input Layers' is correctly set)." fi + repeat $!-1 l[$>] to_rgba split_opacity +!=[1] 0 *[0] . a c autocrop 0 endl done remove_empty[0--2] +channels. 100% channels. -4,0 mv. 0 pack_sprites[0--2] ${1-5} else # No masking @@ -33823,9 +42287,20 @@ channels[0] 0,{0,s-2} #@gui Paper Texture : fx_paper, fx_paper_preview(0) -#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_paper : ac "texturize_paper",$1 @@ -33839,7 +42314,8 @@ #@gui : Angle Range = float(90,0,360) #@gui : Smoothness = float(1,0,5) #@gui : Sharpen = float(300,0,1000) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/16/05.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/16/05.") fx_plaid_texture : repeat $! l[$>] w={w} h={h} s={s} @@ -33847,7 +42323,7 @@ b $5% sharpen $6 r $w,$h,1,$s,2 +rotate[0] $3,1,2,50%,50% - repeat {$2-1} +rotate[0] {$3+$4*($>+1)/($2-1)},1,2,50%,50% +[-2,-1] done rm[0] + repeat $2-1 +rotate[0] {$3+$4*($>+1)/($2-1)},1,2,50%,50% +[-2,-1] done rm[0] / $2 endl done @@ -33861,7 +42337,8 @@ #@gui : Shading = float(0.1,0.1,1) #@gui : Opacity = float(1,0,1) #@gui : Color = color(255,0,0,255) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_polka_dots : to_rgba polka_dots {$1*$2/100},${2--1} @@ -33869,7 +42346,8 @@ #@gui : Density = int(400,0,3000) #@gui : Radius = float(8,0,30) #@gui : Opacity = float(0.1,0.01,0.5) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_color_ellipses : color_ellipses $1,$2,$3 @@ -33877,14 +42355,24 @@ #@gui : Width = _int(1024,32,8192) #@gui : Height = _int(1024,32,8192) #@gui : Equalize Light = float(0,0,100) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) #@gui : sep = separator() -#@gui : note = note{"Note: This filter tries to re-synthetize a micro-texture (given as the input image) onto an output (seamless) image with an arbitrary size. +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note{"Note: This filter tries to re-synthetize a micro-texture +#@gui : (given as the input image) onto an output (seamless) image with an arbitrary size. #@gui : It uses a phase randomization technique, as described in:"} #@gui : url = link("Micro-Texture Synthesis by Phase Randomization","http://www.ipol.im/pub/art/2011/ggm_rpn/") -#@gui : note = note("This filter is based on the work of Bruno Galerne, Yann Gousseau and Jean-Michel Morel.") -#@gui : sep = separator(), url = link("Click here for a detailed description of this filter.","http://gimpchat.com/viewtopic.php?f=28&t=10141") -#@gui : sep = separator(), note = note("Authors: David Tschumperlé and Jérome Boulanger. Latest Update: 2014/09/04.") +#@gui : note = note("This filter is based on the work of Bruno Galerne, Yann Gousseau and +#@gui : Jean-Michel Morel.") +#@gui : sep = separator() +#@gui : url = link("Click here for a detailed description of this filter.",\ +# "http://gimpchat.com/viewtopic.php?f=28&t=10141") +#@gui : sep = separator() +#@gui : note = note("Authors: David Tschumperlé and Jérome Boulanger. +#@gui :       Latest Update: 2014/09/04.") fx_syntexturize : repeat $! l[$>] if $3 +b {20.5-$3/50}% -[0] [1] fc. ${average_colors.} + c 0,255 fi @@ -33902,11 +42390,17 @@ #@gui : Blending Size = int(5,1,24) #@gui : Precision = float(1,0,5) #@gui : Equalize Light = float(0,0,100) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) #@gui : sep = separator() -#@gui : note = note{"Note: This filter tries to re-synthetize an input texture image onto a bigger output image (with an arbitrary size). +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note{"Note: This filter tries to re-synthetize an input texture image onto a +#@gui : bigger output image (with an arbitrary size). #@gui : Beware, this filter is quite slow to compute!"} -#@gui : sep = separator(), note = note("Authors: David Tschumperlé. Latest Update: 2015/22/10.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/22/10.") _fx_syntexturize_matchpatch_preview : repeat $! l[$>] if $7 +b {20.5-$7/50}% -[0] [1] fc. ${average_colors.} + c 0,255 fi @@ -33921,12 +42415,13 @@ #@gui Rorschach : fx_rorschach, fx_rorschach #@gui : Scale = float(3,0,10) #@gui : Mirror = choice(1,"None","X-Axis","Y-Axis","XY-Axes") -#@gui : Stencil Type = choice(2,"Black & White","RGB","Color") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/12/03.") +#@gui : Stencil Type = choice(2,"Black & White","RGB","Color") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/12/03.") fx_rorschach : repeat $! remove_opacity l[$>] - if {$3==0} norm rorschach $1%,$2 * 255 - elif {$3==1} to_rgb rorschach $1%,$2 * 255 + if $3==0 norm rorschach $1%,$2 * 255 + elif $3==1 to_rgb rorschach $1%,$2 * 255 else +norm rorschach. $1%,$2 blend shapeaverage0 fi endl done @@ -33945,11 +42440,15 @@ #@gui : Gamma (%) = float(-50,-100,100) #@gui : Hue (%) = float(0,-100,100) #@gui : Saturation (%) = float(0,-100,100) -#@gui : sep = separator(), note = note{"This filter has been inspired by this tutorial from DeviantArt user fence-post."} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2017/11/27.") +#@gui : sep = separator() +#@gui : note = note{"This filter has been inspired by +#@gui : this tutorial +#@gui : from DeviantArt user fence-post."} +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2017/11/27.") fx_satin : ($4,$8^$5,$9^$6,$10^$7,$11) srgb2rgb. r. 256,1,1,4,3 rgb2srgb. - repeat {$!-1} l[$>] + repeat $!-1 l[$>] srand $3 channels 0 f 0 repeat $1 100%,100%,1,1,"begin( @@ -33977,7 +42476,8 @@ #@gui : Deviation = float(1,0,1) #@gui : Contrast = float(3,0,4) #@gui : Color Rendering = bool(0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/02/04.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/02/04.") fx_seamless_turbulence : repeat $! l[$>] wh={w},{h} rm @@ -33987,7 +42487,7 @@ vector2tensor. smooth.. .,$1,0.5,20 rm. r. $wh,1,100%,0,0,0.5,0.5 - if {$5!=1} ia={ia} - $ia * $5 + $ia fi + if $5!=1 ia={ia} - $ia * $5 + $ia fi endl done c 0,255 n 0,255 @@ -33995,9 +42495,21 @@ #@gui : Amplitude = float(10,0,100) #@gui : Low Frequency = float(10,0,100) #@gui : Frequency Range = float(20,0,100) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/01/12.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/01/12.") _fx_shockwaves : dct 100%,100%,1,1,1 circle. 0,0,{$2+$3}%,1,{$1+1} circle. 0,0,$2%,1,1 @@ -34011,9 +42523,21 @@ #@gui Sponge : fx_sponge, fx_sponge_preview(0) #@gui : Size = int(13,3,21) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_sponge : ac "sponge $1",$2 @@ -34030,8 +42554,13 @@ #@gui : Brightness (%) = float(0,-100,100) #@gui : Contrast (%) = float(0,-100,100) #@gui : Gamma (%) = float(0,-100,100) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/18/03.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/18/03.") fx_stained_glass : repeat $! l[$>] split_opacity l[0] to_rgb stained_glass $1,$2,$3 @@ -34052,7 +42581,8 @@ #@gui : Thickness = float(0.38,0.1,1) #@gui : Smoothness = float(0,0,10) #@gui : Color = color(255,255,100,200) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2012/01/10.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2012/01/10.") fx_stars : repeat $! l[$>] split_opacity rv stars $1%,$2,$3,$4,$5,$6%,${7-9},{$10/255} @@ -34063,13 +42593,18 @@ #@gui : Smoothness = float(0,0,30) #@gui : Iterations = int(8,1,100) #@gui : Aliasing = float(0,0,5) -#@gui : Stencil Type = choice(2,"Black & White","RGB","Color") +#@gui : Stencil Type = choice(2,"Black & White","RGB","Color") #@gui : Transparency = bool(0) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_stencil : - if {$5==0} norm stencil $1,$2,$3 - elif {$5==1} stencil $1,$2,$3 + if $5==0 norm stencil $1,$2,$3 + elif $5==1 stencil $1,$2,$3 else repeat $! +norm. stencil. $1,$2,$3 >=. 50% blend[-2,-1] shapeaverage0 mv. 0 done fi @@ -34081,7 +42616,8 @@ #@gui Tetris : fx_tetris, fx_tetris(0) #@gui : Scale = int(10,1,20) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_tetris : tetris $1 @@ -34090,21 +42626,77 @@ #@gui : Radius = int(5,1,64) #@gui : Smoothness = float(1,0,10) #@gui : Type = choice(1,"Straight","Curved") -#@gui : Color = choice("White on Black","Black on White","White on Transparent","Black on Transparent","Transparent on White","Transparent on Black","Random") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/26/10.") +#@gui : Color = choice("White on Black","Black on White","White on Transparent","Black on Transparent", +#@gui : "Transparent on White","Transparent on Black","Random") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/26/10.") fx_truchet : repeat $! l[$>] 100%,100% truchet $1,$2,$4 rm.. - if {$5==1} * -1 - elif {$5==2} i[0] 100%,100%,1,1,1 - elif {$5==3} i[0] 100%,100% - elif {$5==4} * -1 i[0] 100%,100% - elif {$5==5} * -1 i[0] 100%,100%,1,1,-1 - elif {$5==6} label 0,1 {iM+1},1,1,3 rand. 0,255 map.. . rm. + if $5==1 * -1 + elif $5==2 i[0] 100%,100%,1,1,1 + elif $5==3 i[0] 100%,100% + elif $5==4 * -1 i[0] 100%,100% + elif $5==5 * -1 i[0] 100%,100%,1,1,-1 + elif $5==6 label 0,1 {iM+1},1,1,3 rand. 0,255 map.. . rm. fi a c b $3 n 0,255 endl done +#@gui Voronoï : fx_voronoi, fx_voronoi_preview(0) +#@gui : Threshold = float(160,0,255) +#@gui : Threshold on = choice(1,"Pixel values","Gradient values") +#@gui : Smoothness = float(0.5,0,10) +#@gui : Subsampling (%) = float(50,0,100) +#@gui : sep = separator() +#@gui : Flat color = choice(3,"Black","White","Transparent","Image") +#@gui : Outline thickness = int(1,0,8) +#@gui : Outline color = color(0,0,0,100) +#@gui : Centers radius = int(2,0,10) +#@gui : Centers color = color(255,255,255,40) +#@gui : sep = separator() +#@gui : Anti-aliasing = choice{1,"x1 (none)","x1.5","x2","x2.5"} +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2020/04/30.") +fx_voronoi : + repeat $! l[$>] wh={[w,h]} + f={arg(1+$16,1,1.5,2,2.5)*100} r $f%,$f%,1,100%,3 + + if $2 +gradient_norm t={(255-$1)/4} else +s c med[^0] t={255-$1} fi + if $3 mM={[im,iM]} b. $3 n. $mM fi + >. $t + f. "u<($4%)^4?i:0" + label_fg. 0,1 voronoi. + + # Flat. + if $5<3 + 1,1,1,4,"$5==0?[0,0,0,255]:$5==1?[255,255,255,255]:$5==2?[128,128,128,0]" + r. [0],[0],1,4 rv[0,-1] rm. + else + blend[0] .,shapeaverage + fi + + # Outline. + if $6" && "$10 + +f. "const boundary=1; i!=j(1) || i!=j(0,1)" + dilate. $6 + 1,1,1,4,"[${7-9},255]" r. [0],[0],1,4 + j[0] .,0,0,0,0,{$10/255},.. rm[-2,-1] + fi + + # Centers. + if $11" && "$15 + 1,{iM+1},1,3 eval.. "I[#-1,i]+=[x,y,1]" s. c,-2 /[-2,-1] rm.. + eval. "const r = ($11-1)*arg(1+$16,1,1.5,2,2.5); ellipse(#0,i0,i1,r,r,0,$15/255,[${12-14},255])" + else rm. + fi + + r $wh,1,100%,2 + endl done + +fx_voronoi_preview : + fx_voronoi ${1-15},{min(1,$16)} + #@gui Weave : weave, weave(1) #@gui : Density = int(6,1,32) #@gui : Thickness = float(65,0,100) @@ -34115,16 +42707,29 @@ #@gui : Angle = choice("0 deg.","22.5 deg.","45 deg.","67.5 deg.") #@gui : X-Curvature = float(0,-1,1) #@gui : Y-Curvature = float(0,-1,1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/18/01.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/18/01.") #@gui Whirls : fx_whirls, fx_whirls_preview(0) #@gui : Density = int(7,3,20) #@gui : Smoothness = float(2,0,10) #@gui : Darkness = float(0.2,0,1) #@gui : Lightness = float(1.8,1,3) -#@gui : sep = separator(), Channel(s) = choice(11,"All","RGBA [all]","RGB [all]","RGB [red]","RGB [green]","RGB [blue]","RGBA [alpha]","Linear RGB [all]","Linear RGB [red]","Linear RGB [green]","Linear RGB [blue]","YCbCr [luminance]","YCbCr [blue-red chrominances]","YCbCr [blue chrominance]","YCbCr [red chrominance]","YCbCr [green chrominance]","Lab [lightness]","Lab [ab-chrominances]","Lab [a-chrominance]","Lab [b-chrominance]","Lch [ch-chrominances]","Lch [c-chrominance]","Lch [h-chrominance]","HSV [hue]","HSV [saturation]","HSV [value]","HSI [intensity]","HSL [lightness]","CMYK [cyan]","CMYK [magenta]","CMYK [yellow]","CMYK [key]","YIQ [luma]","YIQ [chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Channel(s) = choice(11,"All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_whirls : ac "whirls $1,$2,$3,$4",$5 @@ -34139,12 +42744,18 @@ #@gui : G/M Smoothness = _float(6,0,20) #@gui : R/B Smoothness (Principal) = _float(6,0,20) #@gui : R/B Smoothness (Secondary) = _float(4,0,20) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") #@gui Deinterlace : deinterlace, fx_deinterlace_preview(0) #@gui : Algorithm = choice("Standard","Motion-Compensated") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_deinterlace : deinterlace 0 skip ${^0} @@ -34155,19 +42766,23 @@ #@gui : Maximal Area = float(4,1,512) #@gui : Tolerance = float(20,0,255) #@gui : Connectivity = choice(1,"Low","High") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/27/05.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/27/05.") fx_inpaint_holes : inpaint_holes {$1^1.5},$2,$3 #@gui Inpaint [Morphological] : fx_inpaint_morpho, fx_inpaint_morpho_preview(1) #@gui : Mask Color = _color(255,0,0,255) #@gui : Mask Dilation = _int(0,0,32) -#@gui : sep = separator(), note = note{"Note: It is strongly suggested to apply this filter only on a selection around the region to inpaint, to save computation time!"} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/25/11.") +#@gui : sep = separator() +#@gui : note = note{"Note: It is strongly suggested to apply this filter only on a selection +#@gui : around the region to inpaint, to save computation time!"} +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/25/11.") fx_inpaint_morpho : repeat $! l[$>] R=$1 G=$2 B=$3 A=$4 - if {!$A" && "(s==2" || "s==4)} split_opacity +!=. 0 *[0,-1] a c R=0 G=0 B=0 fi # Purely transparent color. + if !$A" && "(s==2" || "s==4) split_opacity +!=. 0 *[0,-1] a c R=0 G=0 B=0 fi # Purely transparent color. +round select_color. 0,{round([$R,$G,$B,$A])} if $5 dilate. {1+2*$5} fi inpaint_morpho.. [1] @@ -34178,29 +42793,32 @@ fx_inpaint_morpho ${1-4},{1+$5} #@gui Inpaint [Multi-Scale] : fx_inpaint_matchpatch, fx_inpaint_matchpatch_preview(1) -#@gui : Number of Scales = _int(0,0,16) +#@gui : Number of Scales = int(0,0,16) #@gui : note = note{"(Set Number of scales to 0 for automatic scale detection)"} -#@gui : Patch Size = _int(9,1,64) -#@gui : Number of Iterations per Scale = _int(10,1,100) -#@gui : Blend Size = _int(5,0,32) -#@gui : Allow Outer Blending = _bool(1) -#@gui : Mask Color = _color(255,0,0,255) -#@gui : Mask Dilation = _int(0,0,32) -#@gui : sep = separator(), Preview Progression While Running = _bool(0) -#@gui : sep = separator(), note = note{"Note: Preview and final result may strongly differ."} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/25/11.") +#@gui : Patch Size = int(9,1,64) +#@gui : Number of Iterations per Scale = int(10,1,100) +#@gui : Blend Size = int(5,0,32) +#@gui : Allow Outer Blending = bool(1) +#@gui : Mask Color = color(255,0,0,255) +#@gui : Mask Dilation = int(0,0,32) +#@gui : sep = separator() +#@gui : Preview Progression While Running = _bool(0) +#@gui : sep = separator() +#@gui : note = note{"Note: Preview and final result may strongly differ."} +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/25/11.") fx_inpaint_matchpatch : - repeat $! l[$>] + repeat $! l[$>] nm={n} R=$6 G=$7 B=$8 A=$9 - if {!$A" && "(s==2" || "s==4)} split_opacity +!=. 0 *[0,-1] a c R=0 G=0 B=0 fi # Purely transparent color. + if !$A" && "(s==2" || "s==4) split_opacity +!=. 0 *[0,-1] a c R=0 G=0 B=0 fi # Purely transparent color. +round select_color. 0,{round([$R,$G,$B,$A])} if $10 dilate. {1+2*$10} fi if $11 - visu_size=${fitscreen[]" "{0,w},{0,h},1,25%,50%} + visu_size=${fitscreen[]" "{0,[w,h,1]},25%,50%} w1.. $visu_size,0,"[Preview] G'MIC: Inpaint [multi-scale]" fi srand 0 inpaint_matchpatch.. [1],${1-5} - rm. + rm. nm $nm endl done fx_inpaint_matchpatch_preview : @@ -34218,13 +42836,17 @@ #@gui : Mask Color = _color(255,0,0,255) #@gui : Mask Dilation = _int(0,0,32) #@gui : Process by Blocs of Size = _choice("100%","75%","50%","25%","10%","5%","2%","1%") -#@gui : sep = separator(), note = note("A quick tutorial on how to use this filter can be found here:") -#@gui : url = link("G'MIC Inpainting tutorial on Patrick David's blog.","http://blog.patdavid.net/2014/02/getting-around-in-gimp-gmic-inpainting.html") -#@gui : sep = separator(), note = note("Authors: David Tschumperlé and Maxime Daisy. Latest Update: 2015/25/11.") +#@gui : sep = separator() +#@gui : note = note("A quick tutorial on how to use this filter can be found here:") +#@gui : url = link("G'MIC Inpainting tutorial on Patrick David's blog.", +#@gui : "http://blog.patdavid.net/2014/02/getting-around-in-gimp-gmic-inpainting.html") +#@gui : sep = separator() +#@gui : note = note("Authors: David Tschumperlé and Maxime Daisy. +#@gui :       Latest Update: 2015/25/11.") _fx_inpaint_patch : repeat $! l[$>] R=$9 G=$10 B=$11 A=$12 - if {!$A" && "(s==2" || "s==4)} split_opacity +!=. 0 *[0,-1] a c R=0 G=0 B=0 fi # Purely transparent color. + if !$A" && "(s==2" || "s==4) split_opacity +!=. 0 *[0,-1] a c R=0 G=0 B=0 fi # Purely transparent color. +round select_color. 0,{round([$R,$G,$B,$A])} if $13 dilate. {1+2*$13} fi inpaint.. [1],$1,{$1*$2},$3,1,{$4*$1},${5-8} @@ -34243,37 +42865,44 @@ fx_inpaint_patch_preview : fx_inpaint_patch ${1-12},{1+$13},100 -#@gui Inpaint [Transport-Diffusion] : fx_inpaint_diffusion, fx_inpaint_diffusion_preview(1) +#@gui Inpaint [Transport-Diffusion] : fx_inpaint_pde, fx_inpaint_pde_preview(1) #@gui : Smoothness (%) = float(75,0,100) #@gui : Regularization = choice(1,"Isotropic","Delaunay-Oriented","Edge-Oriented") #@gui : Regularization Iterations = int(20,0,100) #@gui : Mask Color = _color(255,0,0,255) #@gui : Mask Dilation = _int(0,0,32) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/10/04.") -fx_inpaint_diffusion : +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/10/04.") +fx_inpaint_pde : repeat $! l[$>] R=$4 G=$5 B=$6 A=$7 - if {!$A" && "(s==2" || "s==4)} split_opacity +!=. 0 *[0,-1] a c R=0 G=0 B=0 fi # Purely transparent color. + if !$A" && "(s==2" || "s==4) split_opacity +!=. 0 *[0,-1] a c R=0 G=0 B=0 fi # Purely transparent color. +select_color 0,$R,$G,$B,$A - if {$8} dilate. {1+2*$8} fi - inpaint_diffusion.. [1],$1%,$2,$3 + if $8 dilate. {1+2*$8} fi + inpaint_pde.. [1],$1%,$2,$3 rm. endl done c 0,255 -fx_inpaint_diffusion_preview : - fx_inpaint_diffusion ${1-7},{1+$8} +fx_inpaint_pde_preview : + fx_inpaint_pde ${1-7},{1+$8} #@gui Red-Eye Attenuation : red_eye, red_eye #@gui : Threshold = float(75,0,100) #@gui : Smoothness = float(3.5,0,20) #@gui : Factor = float(0.1,0,1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") #@gui Remove Hot Pixels : fx_remove_hotpixels, fx_remove_hotpixels_preview(0) #@gui : Mask Size = int(3,3,20) #@gui : Threshold = float(10,0,200) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: Jérome Boulanger. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: Jérome Boulanger.      Latest Update: 2010/29/12.") fx_remove_hotpixels : remove_hotpixels $1,$2 @@ -34286,17 +42915,23 @@ #@gui : Regularization Iterations = int(20,0,100) #@gui : Dilation / Erosion = int(0,-20,20) #@gui : Colorspace = choice(1,"sRGB","Linear RGB") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 #@gui : sep = separator() #@gui : note = note{"Note: -#@gui : This filter reconstructs transparent regions of an image using a transport-diffusion algorithm. Useful only for images having an alpha-channel. +#@gui : This filter reconstructs transparent regions of an image using a transport-diffusion algorithm. +#@gui : Useful only for images having an alpha-channel. #@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/07/04.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/07/04.") fx_solidify_td : repeat $! l[$>] to_rgba sh 0,{s-2} if $5 srgb2rgb. fi rm. if $4 - . sh. 100% if {$4>0} erode. {1+2*$4} else dilate. {1-2*$4} fi rm. + . sh. 100% if $4>0 erode. {1+2*$4} else dilate. {1-2*$4} fi rm. solidify. $1%,$2,$3 rv blend alpha else @@ -34320,9 +42955,21 @@ #@gui : Interpolation = choice(0,"Nearest Neighbor","Linear","Runge-Kutta") #@gui : Fast Approximation = bool(1) #@gui : Iterations = int(1,1,10) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/08/27.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/08/27.") fx_smooth_anisotropic : repeat $! l[$>] ac "repeat $11 smooth $1,$2,$3,$4,$5,$6,$7,$8,$9,$10 done",$12 @@ -34335,8 +42982,13 @@ #@gui : Amplitude = float(5,0,100) #@gui : Edge Threshold (%) = float(10,0,100) #@gui : Smoothness = float(0.8,0,5) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/11/13.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/11/13.") fx_smooth_antialias : repeat $! l[$>] +diffusiontensors 0,1,1,$3,$3 @@ -34351,9 +43003,21 @@ #@gui : Spatial Variance = float(10,0,100) #@gui : Value Variance = float(7,0,100) #@gui : Iterations = int(2,1,10) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/27/08.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/27/08.") fx_smooth_bilateral : skip ${5=0},${6=0} ac "repeat $3 bilateral $1,$2 done",$4 @@ -34361,16 +43025,46 @@ gui_split_preview "fx_smooth_bilateral $*",${-3--1} #@gui Smooth [Guided] : fx_smooth_guided, fx_smooth_guided_preview(0) +#@gui : Guide As = choice("Self","Top Layer","Bottom Layer") #@gui : Radius = int(5,1,100) #@gui : Smoothness = float(30,0,512) #@gui : Iterations = int(1,1,10) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/29/10.") -fx_smooth_guided : skip ${5=0},${6=0} - ac "repeat $3 guided $1,$2 done",$4 +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2019/10/02.") +fx_smooth_guided : skip ${6=0},${7=0} + if $1" && "!narg($_guide) + if $!<2 gui_warning_preview "Missing guide layer" return fi + store[{$1==1?0:-1}] _guide + fi + if $1==0 # Self-guide + ac "repeat $4 guided $2,$3 done",$5 + elif $1==1 # Guide as top layer + ac "$_guide r. ..,..,1,100%,0,0,0.5,0.5 repeat $4 guided[0] [1],$2,$3 done rm.",$5 + if !narg($_is_preview) $_guide mv. 0 fi + else # Guide as bottom layer + ac "$_guide r. ..,..,1,100%,0,0,0.5,0.5 repeat $4 guided[0] [1],$2,$3 done rm.",$5 + if !narg($_is_preview) $_guide fi + fi fx_smooth_guided_preview : + if $1" && "!narg($_guide) + if $!<2 gui_warning_preview "Missing guide layer" return fi + store[{$1==1?0:-1}] _guide + fi + _is_preview=1 gui_split_preview "fx_smooth_guided $*",${-3--1} #@gui Smooth [Diffusion] : fx_smooth_diffusion, fx_smooth_diffusion_preview(0) @@ -34380,10 +43074,24 @@ #@gui : Tensor Smoothness = float(1.1,0,10) #@gui : Time Step = float(15,5,50) #@gui : Iterations = int(8,1,100) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads","Sixteen Threads"), Spatial Overlap = int(24,0,256) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/27/08.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads", +#@gui : "Sixteen Threads"), Spatial Overlap = int(24,0,256) +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/27/08.") fx_smooth_diffusion : ac "gui_parallel_overlap \"smooth $6,$1,$2,$3,$4,$5,0 c 0,255\",$8,$9",$7 @@ -34394,10 +43102,24 @@ #@gui : Time Step = float(30,5,50) #@gui : Iterations = int(4,1,30) #@gui : Keep Iterations as Different Layers = bool(false) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads","Sixteen Threads"), Spatial Overlap = int(24,0,256) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/27/08.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads", +#@gui : "Sixteen Threads"), Spatial Overlap = int(24,0,256) +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/27/08.") fx_smooth_meancurvature : ac "gui_parallel_overlap \"meancurvature_flow $2,$1,$3 c 0,255\",$5,$6",$4 @@ -34407,9 +43129,21 @@ #@gui Smooth [Median] : fx_smooth_median, fx_smooth_median_preview(0) #@gui : Radius = int(3,1,20) #@gui : Threshold = float(255,0,255) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_smooth_median : ac "median $1,$2",$3 @@ -34421,13 +43155,27 @@ #@gui : Spatial Bandwidth = int(4,3,13) #@gui : Tonal Bandwidth = float(10,1,50) #@gui : Patch Measure = choice(3,"Linf-Norm","L1-Norm","L2-Norm","Luminance","Lightness","RGB") -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads","Sixteen Threads"), Spatial Overlap = int(24,0,256) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: Jérôme Boulanger. Latest Update: 2015/01/07.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads", +#@gui : "Sixteen Threads"), Spatial Overlap = int(24,0,256) +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: Jérôme Boulanger.      Latest Update: 2015/01/07.") fx_smooth_nlmeans: repeat $! l[$>] - if {s==1} nlmeans $1,$2,$3,-_fx_smooth_nlmeans$4 # Handle separately gray scale images. + if s==1 nlmeans $1,$2,$3,-_fx_smooth_nlmeans$4 # Handle separately gray scale images. else ac "gui_parallel_overlap \"nlmeans $1,$2,$3,-_fx_smooth_nlmeans$4\",$6,$7",$5 fi endl done @@ -34435,8 +43183,8 @@ _fx_smooth_nlmeans0 : s c abs max _fx_smooth_nlmeans1 : s c abs + _fx_smooth_nlmeans2 : norm -_fx_smooth_nlmeans3 : if {s>=3} channels 0,2 luminance else norm fi -_fx_smooth_nlmeans4 : if {s>=3} channels 0,2 srgb2rgb rgb2lab channels 0 else norm fi +_fx_smooth_nlmeans3 : if s>=3 channels 0,2 luminance else norm fi +_fx_smooth_nlmeans4 : if s>=3 channels 0,2 srgb2rgb rgb2lab channels 0 else norm fi _fx_smooth_nlmeans5 : fx_smooth_nlmeans_preview: @@ -34450,10 +43198,24 @@ #@gui : Patch Smoothness = float(0,0,4) #@gui : Fast Approximation = bool(1) #@gui : Iterations = int(1,1,10) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads","Sixteen Threads"), Spatial Overlap = int(24,0,256) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/27/08.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads", +#@gui : "Sixteen Threads"), Spatial Overlap = int(24,0,256) +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/27/08.") fx_smooth_patch : ac "gui_parallel_overlap \"repeat $7 denoise $1,$2,$3,$4,$5,$6 done c 0,255\",$9,$10",$8 @@ -34465,12 +43227,26 @@ #@gui : Patch Size = int(7,2,21) #@gui : Lookup Size = int(11,2,21) #@gui : Spatial Sampling = int(7,1,16) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note{"Note: Beware, this filter uses a very computationally intensive algorithm to denoise images. So, do not complain too much if you have less than 8 cores -#@gui : available for the computation :) +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note{"Note: Beware, this filter uses a very computationally intensive algorithm to +#@gui : denoise images. So, do not complain too much if you have less than 8 cores available for the computation :) #@gui : "} -#@gui : sep = separator(), note = note("Authors: David Tschumperlé and Jérome Boulanger. Latest Update: 2016/24/03.") +#@gui : sep = separator() +#@gui : note = note("Authors: David Tschumperlé and Jérome Boulanger. +#@gui :       Latest Update: 2016/24/03.") fx_smooth_patchpca : ac "denoise_patchpca ${1-4} c 0,255",$5 @@ -34482,10 +43258,24 @@ #@gui : Time Step = float(5,5,50) #@gui : Iterations = int(5,1,30) #@gui : Keep Iterations as Different Layers = bool(false) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads","Sixteen Threads"), Spatial Overlap = int(24,0,256) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/26/11.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads", +#@gui : "Sixteen Threads"), Spatial Overlap = int(24,0,256) +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/26/11.") fx_smooth_peronamalik : ac "gui_parallel_overlap \"peronamalik_flow $1,$3,$2,$4 c 0,255\",$6,$7",$5 @@ -34497,10 +43287,24 @@ #@gui : Edges = float(0.5,0,2) #@gui : Scales = int(5,1,10) #@gui : Iterations = int(1,1,10) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads","Sixteen Threads"), Spatial Overlap = int(24,0,256) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/27/08.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads", +#@gui : "Sixteen Threads"), Spatial Overlap = int(24,0,256) +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/27/08.") fx_smooth_selective : ac "gui_parallel_overlap \"repeat $4 blur_selective $1,$2,$3 done c 0,255\",$6,$7",$5 @@ -34527,16 +43331,23 @@ #@gui : note = note("Step 3: Details enhancement") #@gui : Gain = float(0.05,0,0.5) #@gui : sep = separator() -#@gui : Preview Data = choice{5,"Skin Mask","Base Scale","Medium Scale (Original)","Medium Scale (Smoothed)","Fine Scale","Result Image"} -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), url = link("Click here for a video tutorial","http://www.youtube.com/watch?v=H8pQfq-ybCc") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/20/12.") +#@gui : Preview Data = choice{5,"Skin Mask","Base Scale","Medium Scale (Original)","Medium Scale (Smoothed)", +#@gui : "Fine Scale","Result Image"} +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : url = link("Click here for a video tutorial","http://www.youtube.com/watch?v=H8pQfq-ybCc") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/20/12.") fx_smooth_skin : repeat $! l[$>] split_opacity l[0] to_rgb # Skin detection step. if $5 +balance_gamma 128,128,128 else [0] fi - if {$1==0} channels. 0 f. 1 elif {$1==2} detect_skin. $2 else detect_skin. $2,$6%,$7%,$8% fi + if $1==0 channels. 0 f. 1 elif $1==2 detect_skin. $2 else detect_skin. $2,$6%,$7%,$8% fi M={iM} b. $3% *. {$M/iM} *. $4 c. 0,1 # Details smoothing step. @@ -34548,32 +43359,33 @@ endl a c endl done _fx_smooth_skin : - if {$1==0} b {$2/8}% + if $1==0 b {$2/8}% else - if {$2>0} + if $2>0 m={im} M={iM} n 0,255 - repeat {int($2/5)} bilateral 3%,{5*3} done + repeat int($2/5) bilateral 3%,{5*3} done bilateral 3%,{($2%5)*3} * {($M-$m)/255} + $m fi fi fx_smooth_skin_preview : - if {$-2==0} - gui_split_preview "if $5 balance_gamma 128,128,128 fi if {$1==0} f 1 elif {$1==2} detect_skin $2 else detect_skin $2,$6%,$7%,$8% fi M={iM} b $3% * {255*$M/iM} * $4 c 0,255",${-3--1} - elif {$-2==1} + if $-2==0 + gui_split_preview "if $5 balance_gamma 128,128,128 fi if $1==0 f 1 elif $1==2 detect_skin $2 "\ + "else detect_skin $2,$6%,$7%,$8% fi M={iM} b $3% * {255*$M/iM} * $4 c 0,255",${-3--1} + elif $-2==1 gui_split_preview "b $9%",${-3--1} - elif {$-2==2} + elif $-2==2 gui_split_preview "split_details 4,$9%,$10% k.. n 0,255",${-3--1} - elif {$-2==3} + elif $-2==3 gui_split_preview "split_details 4,$9%,$10% k.. _fx_smooth_skin $12,$11 n 0,255",${-3--1} - elif {$-2==4} + elif $-2==4 gui_split_preview "split_details 4,$9%,$10% k. n 0,255",${-3--1} else gui_split_preview "fx_smooth_skin $*",${-3--1} fi - if {$1==1} + if $1==1 to_rgb circle $6%,$7%,$8%,0.2,0,255,0 circle $6%,$7%,$8%,0.4,0xFFFFFFFF,0,255,0 @@ -34593,19 +43405,37 @@ #@gui : Interpolation = choice(0,"Nearest Neighbor","Linear","Runge-Kutta") #@gui : Fast Approximation = bool(1) #@gui : Iterations = int(1,1,10) -#@gui : Channel(s) = choice("RGB","Luminance","Blue & Red chrominances","Blue chrominance","Red chrominance") -#@gui : sep = separator(), Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads","Sixteen Threads"), Spatial Overlap = int(24,0,256) -#@gui : note = note{"\nNote: This set of anisotropic smoothing parameters has been suggested by PhotoComiX."} -#@gui : sep = separator(), note = note("Author: PhotoComiX. Latest Update: 2010/26/12.") +#@gui : Channel(s) = choice("RGB","Luminance","Blue & Red chrominances","Blue chrominance","Red chrominance") +#@gui : sep = separator() +#@gui : Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads", +#@gui : "Sixteen Threads"), Spatial Overlap = int(24,0,256) +#@gui : note = note{"\nNote: This set of anisotropic smoothing parameters has been suggested +#@gui : by PhotoComiX."} +#@gui : sep = separator() +#@gui : note = note("Author: PhotoComiX.      Latest Update: 2010/26/12.") #@gui Smooth [Total Variation] : fx_smooth_tv, fx_smooth_tv_preview(0) #@gui : Time Step = float(30,5,100) #@gui : Iterations = int(10,1,40) #@gui : Keep Iterations as Different Layers = bool(false) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads","Sixteen Threads"), Spatial Overlap = int(24,0,256) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/27/08.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads", +#@gui : "Sixteen Threads"), Spatial Overlap = int(24,0,256) +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/27/08.") fx_smooth_tv : ac "gui_parallel_overlap \"tv_flow $2,$1,$3 c 0,255\",$5,$6",$4 @@ -34616,10 +43446,25 @@ #@gui : Threshold = float(1,0,10) #@gui : Iterations = int(10,1,32) #@gui : Scales = int(10,2,10) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads","Sixteen Threads"), Spatial Overlap = int(24,0,256) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: Jérome Boulanger and David Tschumperlé. Latest Update: 2013/27/08.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : Parallel Processing = choice("Auto","One Thread","Two Threads","Four Threads","Eight Threads", +#@gui : "Sixteen Threads"), Spatial Overlap = int(24,0,256) +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: Jérome Boulanger and David Tschumperlé. +#@gui :       Latest Update: 2013/27/08.") fx_smooth_haar : remove_opacity ac "gui_parallel_overlap \"denoise_haar $1,$3,$2 c 0,255\",$5,$6",$4 @@ -34633,14 +43478,15 @@ #@gui : Smoothness = float(2,0,20) #@gui : Anisotropy = float(0.4,0,1) #@gui : Sharpness = float(50,0,100) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_upscale_smart : to_rgb upscale_smart $1,$2,1,$3,$4,$5 c 0,255 fx_upscale_smart_preview : repeat $! +r. $1,$2,1,1,0 - if {w<{-2,w}||h<{-2,h}} # Test for downscaling + if w<{-2,w}" || "h<{-2,h} # Test for downscaling rm. /. 4 0 t. "Downscaling is\nnot allowed!",5,5,20,1,255 r. ..,..,1,1,0,0,0.5,0.5 -|[-2,-1] @@ -34661,25 +43507,26 @@ #@gui : This filter is useful for resizing images that have very few colors #@gui : (e.g. indexed images). It is generally useless for true colors images. #@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_scalenx : repeat $! l[$>] split_opacity - if {$2==1} rgb2ycbcr[0] round[0] - elif {$2==2} rgb2lab8[0] round[0] + if $2==1 rgb2ycbcr[0] round[0] + elif $2==2 rgb2lab8[0] round[0] fi - if {$1==0} scale2x - elif {$1==1} scale3x - elif {$1==2} scale2x scale2x - elif {$1==3} scale3x scale2x - elif {$1==4} scale2x scale2x scale2x - elif {$1==5} scale3x scale3x - elif {$1==6} scale3x scale2x scale2x - elif {$1==7} scale2x scale2x scale2x scale2x - elif {$1==8} scale3x scale3x scale2x - elif {$1==9} scale3x scale3x scale3x + if $1==0 scale2x + elif $1==1 scale3x + elif $1==2 scale2x scale2x + elif $1==3 scale3x scale2x + elif $1==4 scale2x scale2x scale2x + elif $1==5 scale3x scale3x + elif $1==6 scale3x scale2x scale2x + elif $1==7 scale2x scale2x scale2x scale2x + elif $1==8 scale3x scale3x scale2x + elif $1==9 scale3x scale3x scale3x fi - if {$2==1} ycbcr2rgb[0] - elif {$2==2} lab82rgb[0] + if $2==1 ycbcr2rgb[0] + elif $2==2 lab82rgb[0] fi a c endl done @@ -34692,7 +43539,8 @@ #@gui : Threshold = float(1.15,1,2) #@gui : Exponent = int(5,1,6) #@gui : Extend 1px = _bool(0) -#@gui : sep = separator(), note = note("Author: Garagecoder. Latest Update : 2015/11/07.") +#@gui : sep = separator() +#@gui : note = note("Author: Garagecoder. Latest Update : 2015/11/07.") #@gui : note = note{"\nNote: #@gui : This filter re-implements the scaling algorithm described at : #@gui : "} @@ -34760,17 +43608,18 @@ #@gui : Use Light = bool(1) #@gui : Antialiasing = bool(1) #@gui : Outline Color = color(0,0,0,128) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/10/02.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/10/02.") fx_blocks3d : repeat $! l[$>] nm=${"gui_layer_name"} W={w} H={h} M={max(w,h)} - if {w>h} r2dx $1 else r2dy $1 fi + if w>h r2dx $1 else r2dy $1 fi w={w} h={h} m={max(w,h)} - if {$3>0} mirror y fi + if $3>0 mirror y fi imageblocks3d $3,$2% -3d. {$w/2},{$h/2} f={$4*$M/($m*(2-$16))} *3d $f,$f,{$f*abs($3*$1/100)} - if {$3>0} r3d 1,0,0,180 fi + if $3>0 r3d 1,0,0,180 fi r3d 0,0,1,$5 r3d 1,0,0,-$6 # Render object. @@ -34816,14 +43665,15 @@ #@gui : Specular Shininess = float(0.7,0,3) #@gui : Rendering = choice(4,"Dots","Wireframe","Flat","Flat-Shaded","Gouraud","Phong") #@gui : Antialiasing = bool(1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/16/05.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/16/05.") _fx_coloredobject3d : to_rgb _fx_coloredobject3d$1$2 ${6-8} col3d. ${3-5} db3d 0 fx_coloredobject3d : _fx_coloredobject3d "_",${1-4,6-8} - repeat {$!-1} + repeat $!-1 +fx_render3d. {$>,w},{$>,h},$6,${9--1} sh. 3 *. {$5/255} rm. blend[$>,-1] alpha @@ -34832,7 +43682,7 @@ fx_coloredobject3d_preview : _fx_coloredobject3d "_preview_",${1-4,6-8} - repeat {$!-1} + repeat $!-1 +fx_render3d. {$>,w},{$>,h},$6,${9--1} sh. 3 *. {$5/255} rm. blend[$>,-1] alpha @@ -34873,11 +43723,13 @@ #@gui : Specular Shininess = float(0.7,0,3) #@gui : Rendering = choice(2,"Dots","Wireframe","Flat","Flat-Shaded","Gouraud","Phong") #@gui : Antialiasing = bool(1) -#@gui : sep = separator(), note = note{"Note: Add a top layer to define object texture."} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note{"Note: Add a top layer to define object texture."} +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") _fx_elevation3d : - repeat {$!/2} l[$>,{min($>+1,$!-1)}] - if {$!==1} +norm else r[1] [0],3 fi + repeat $!/2 l[$>,{min($>+1,$!-1)}] + if $!==1 +norm else r[1] [0],3 fi n[1] 0,{abs($1)} *[1] {sign($1)} b[1] $2 elevation3d[0] [1] rm[1] endl done @@ -34908,12 +43760,14 @@ #@gui : Specular Shininess = float(0.7,0,3) #@gui : Rendering = choice(4,"Dots","Wireframe","Flat","Flat-Shaded","Gouraud","Phong") #@gui : Antialiasing = bool(1) -#@gui : sep = separator(), note = note{"Note: Add a top layer to define object texture."} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note{"Note: Add a top layer to define object texture."} +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") _fx_extrude3d : - repeat {$!/2} l[$>,{min($>+1,$!-1)}] + repeat $!/2 l[$>,{min($>+1,$!-1)}] extrude3d. $1,$2,$3% - if {$!==2} t3d. .. rm.. fi + if $!==2 t3d. .. rm.. fi endl done db3d 0 @@ -34940,7 +43794,8 @@ #@gui : Specular Shininess = float(0.7,0,3) #@gui : Rendering = choice(4,"Dots","Wireframe","Flat","Flat-Shaded","Gouraud","Phong") #@gui : Antialiasing = bool(1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") _fx_imageobject3d : to_rgb repeat $! l[$>] _fx_imageobject3d$1$2 endl done db3d 0 @@ -34989,12 +43844,14 @@ #@gui : Specular Shininess = float(0.7,0,3) #@gui : Rendering = choice(4,"Dots","Wireframe","Flat","Flat-Shaded","Gouraud","Phong") #@gui : Antialiasing = bool(1) -#@gui : sep = separator(), note = note{"Note: Add a top layer to define object texture."} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note{"Note: Add a top layer to define object texture."} +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") _fx_lathing3d : - repeat {$!/2} l[$>,{min($>+1,$!-1)}] + repeat $!/2 l[$>,{min($>+1,$!-1)}] lathe3d. $1,$2%,$3 - if {$!==2} t3d. .. rm.. fi + if $!==2 t3d. .. rm.. fi endl done db3d 0 @@ -35018,7 +43875,8 @@ #@gui : Specular Shininess = float(0.7,0,3) #@gui : Rendering = choice(3,"Dots","Wireframe","Flat","Flat-Shaded","Gouraud","Phong") #@gui : Opacity = float(1,0,1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_random3d : repeat $! l[$>] f3d={0.5*max(w,h)/tan($5*pi/360)} f3d $f3d l3d {$6*$f3d},{$7*$f3d},{$8*$f3d} sl3d $9 ss3d $10 @@ -35043,14 +43901,15 @@ #@gui : Specular Size = float(1,0,8) #@gui : Shadow = float(1.5,0,4) #@gui : Color = color(255,0,255) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/27/11.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/27/11.") fx_ball : ball $1,${5-7},${2-4} - if {$!>1} mv. 0 nm[0] "name(Ball),pos("{0,0.5*([${-max_wh}]-[w,h])}")" else nm[0] "name(Ball)" fi + if $!>1 mv. 0 nm[0] "name(Ball),pos("{0,0.5*([${-max_wh}]-[w,h])}")" else nm[0] "name(Ball)" fi fx_ball_preview : fx_ball $* - if {$!>1} rv[-2,-1] blend[-2,-1] alpha fi + if $!>1 rv[-2,-1] blend[-2,-1] alpha fi #@gui Circle Art : fx_circle_art, fx_circle_art #@gui : Type = choice(1,"Random","Lissajous spiral") @@ -35069,30 +43928,36 @@ #@gui : Y-Dispersion = float(1,0,4) #@gui : X-Factor = int(1,0,16) #@gui : Y-Factor = int(1,0,16) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/22/08.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/22/08.") fx_circle_art : - if {!$2} f 0 return fi + if !$2 f 0 return fi # Generate object coordinates. - if {$1==0} # Random. + if $1==0 # Random. {round(2*($2^1.5))} rand. -1,1 +rand. -1,1 +rand. -$3,$3 a[-3--1] y else # Spiral. {max(1,round($2*$7))} t0={$8*2*pi/180} - rows. 0,2 f. 'r=x/(w-1);t=2*pi*x/$2;if(y==0,(r^$11)*cos($t0+$13*t),if(y==1,(r^$12)*sin($t0+$14*t),max(0,$3*($9+($10-$9)*r))))' + rows. 0,2 + f. "r = x/(w-1); + t = 2*pi*x/$2; + if(y==0,(r^$11)*cos("$t0"+$13*t), + if(y==1,(r^$12)*sin("$t0"+$14*t), + max(0,$3*($9+($10-$9)*r))))" fi # Convert to 3D object. l. transpose s x,-1 h={h} - i[0] ({'CImg3d'},{2*$h},$h) # Header. - ++... . -[-4,-2] i .. i[-3,-1] 1,100% a[-6--1] x # Vertices. + i[0] ({'CImg3d'},{2*$h},$h) # Header. + ++... . -[-4,-2] i .. i[-3,-1] 1,100% a[-6--1] x # Vertices. 1,$h,1,1,5 1,$h,1,1,2*y ++. 1 a[-3--1] x z. 0,5 # Primitives. 3,$h,1,1,1 1,$h,1,1,-1 y a y # Colors + Opacities. endl # Render object on selected images. - repeat {$!-1} l[$>,-1] + repeat $!-1 l[$>,-1] s={0,max(w,h)} rm[0] if $5 {2*$s},{2*$s} +*3d[0] $s # Anti-aliasing. else $s,$s +*3d[0] {$s/2} # No anti-aliasing. @@ -35119,11 +43984,12 @@ #@gui : Colored Outline = bool(1) #@gui : Antialiasing = bool(1) #@gui : Decoration = bool(1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/13/11.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/13/11.") fx_equation_parametric : repeat $! l[$>] w={w} h={h} rm - $5,1,1,2,'"t=$3+x*($4-$3)/($5-1);if(c==0,$1,$2)"' + $5,1,1,2,"t=$3+x*($4-$3)/($5-1);if(c==0,$1,$2)" channels. 0,2 ($8,$11^$9,$12^$10,$13) r. {-2,w},1,1,3,3 a c display_parametric $w,$h,{$6+$14*1.001},$7,$15,$16 @@ -35144,7 +44010,8 @@ #@gui : Variable u refers to a uniformly distributed random value in [0,1]. #@gui : Reduce resolution to be able to view #@gui : separate graph vertices.") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_equation_plot : repeat $! l[$>] w={w} h={h} rm @@ -35157,8 +44024,10 @@ #@gui : Color 2 (Up/Right Corner) = color(255,0,0,255) #@gui : Color 3 (Bottom/Left Corner) = color(0,255,0,255) #@gui : Color 4 (Bottom/Right Corner) = color(0,0,255,255) -#@gui : sep = separator(), Colorspace = choice(1,"sRGB","Linear RGB","Lab") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Colorspace = choice(1,"sRGB","Linear RGB","Lab") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_corner_gradient : skip ${17=0} repeat $! l[$>] wh={w},{h} rm @@ -35202,7 +44071,8 @@ #@gui : 8th Color = color(128,128,128,255) #@gui : 9th Color = color(255,0,255,255) #@gui : 10th Color = color(0,0,0,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2013/03/10.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2013/03/10.") fx_custom_gradient_preview : skip "${15=}" repeat $! l[$>] if $4 @@ -35217,12 +44087,12 @@ fx_custom_gradient : skip "${15=}" _fx_custom_gradient0 ${1-14},"$15",${16--1} - if {$-1>=0&&narg("$15")} + if $-1>=0" && "narg("$15") dir_ggr=${-path_gimp}gradients 0 nm. ${"normalize_filename \"$15\""} name_ggr={b} rm. output_ggr. $dir_ggr/$name_ggr.ggr,"$15" fi i.. (0^0^0^0) a[-2,-1] x - repeat {$!-1} l[$>,-1] + repeat $!-1 l[$>,-1] _fx_custom_gradient1[0] ${1-14},"$15",${16--1} +distance[0] 1,$11 +distance[0] 0,$11 *. -1 +[0] 1 +[0,-2,-1] # Signed distance function. m={$9%*{0,im}} M={$10%*{0,iM}} @@ -35247,28 +44117,28 @@ fi __fx_custom_gradient0 : - if {$1==1} sh. 0,2 rgb2hsv. rm. - elif {$1==2} sh. 0,2 srgb2rgb. rgb2lab. rm. + if $1==1 sh. 0,2 rgb2hsv. rm. + elif $1==2 sh. 0,2 srgb2rgb. rgb2lab. rm. fi r. {$2*w},1,1,4,3 - if {$1==1} sh. 0,2 hsv2rgb. rm. - elif {$1==2} sh. 0,2 lab2rgb. rgb2srgb. rm. + if $1==1 sh. 0,2 hsv2rgb. rm. + elif $1==2 sh. 0,2 lab2rgb. rgb2srgb. rm. fi # Extract shape from image. _fx_custom_gradient1 : b $2% - if {$1==0} # Auto-mode. + if $1==0 # Auto-mode. to_a split_opacity - if {iM>im+32} + if iM>im+32 rm.. >=[0] {100-$3}% else rm. norm n 0,1 - if {ia>0.5} <=[0] $3% else >=[0] {100-$3}% fi + if ia>0.5 <=[0] $3% else >=[0] {100-$3}% fi fi - elif {$1==1} # Dark pixels. + elif $1==1 # Dark pixels. remove_opacity norm <= $3% - elif {$1==2} # Bright pixels. + elif $1==2 # Bright pixels. remove_opacity norm >= {100-$3}% else # Opaque pixels. to_a channels 100% >= {100-$3}% @@ -35280,15 +44150,17 @@ #@gui : Sampling = float(100,0,100) #@gui : Length = int(0,0,4096) #@gui : note = note("Note: Set length to 0 to release gradient length constraints.") -#@gui : Sort Colors = choice("Don't Sort","By Red Component","By Green Component","By Blue Component","By Luminance","By Blue Chrominance","By Red Chrominance","By Lightness") +#@gui : Sort Colors = choice("Don't Sort","By Red Component","By Green Component","By Blue Component", +#@gui : "By Luminance","By Blue Chrominance","By Red Chrominance","By Lightness") #@gui : Reverse Gradient = bool(0) #@gui : sep = separator() #@gui : Preview Gradient = bool(1) #@gui : Save Gradient As = _text("") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/29/06.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/29/06.") fx_line_gradient : skip "${10=}" _fx_line_gradient $* - if {narg("$10")} + if narg("$10") dir_ggr=${-path_gimp}gradients 0 nm. ${"normalize_filename \"$10\""} name_ggr={b} rm. output_ggr. $dir_ggr/$name_ggr.ggr,"$10" fi @@ -35302,7 +44174,7 @@ line $1%,$2%,$3%,$4%,1,0xF0F0F0F0,255,255,255,255 line $1%,$2%,$3%,$4%,1,0x0F0F0F0F,0,0,0,255 endl - if {$!>1} r. {{0,w}-32},32,1,4,1 frame. 1,1,0,0,0,255 j[0] [1],16,{{0,h}-48} rm. fi + if $!>1 r. {{0,w}-32},32,1,4,1 frame. 1,1,0,0,0,255 j[0] [1],16,{{0,h}-48} rm. fi endl done _fx_line_gradient : @@ -35325,8 +44197,10 @@ #@gui : Angle = float(45,0,360) #@gui : Fade Start = float(0,0,100) #@gui : Fade End = float(100,0,100) -#@gui : sep = separator(), Colorspace = choice(0,"sRGB","Linear RGB","Lab") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : Colorspace = choice(0,"sRGB","Linear RGB","Lab") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_linear_gradient : skip ${13=0} repeat $! l[$>] wh={w},{h} rm @@ -35345,8 +44219,10 @@ #@gui : Fade Start = float(0,0,100) #@gui : Fade End = float(100,0,100) #@gui : Center (%) = point(50,50,0,1,255) -#@gui : sep = separator(), Colorspace = choice(0,"sRGB","Linear RGB","Lab") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/29/06.") +#@gui : sep = separator() +#@gui : Colorspace = choice(0,"sRGB","Linear RGB","Lab") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/29/06.") fx_radial_gradient : skip ${14=0} repeat $! l[$>] wh={w},{h} rm @@ -35364,7 +44240,8 @@ #@gui : Smoothness = float(0,0,10) #@gui : Color Balance = color(128,128,128) #@gui : Opacity = float(1,0,1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/08/04.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/08/04.") fx_random_gradient : repeat $! l[$>] to_rgba 100%,100% srand $2 @@ -35377,10 +44254,10 @@ i(#0,x,y,0,2) = round(u(255)); i(#0,x,y,0,3) = $7*255 + (1-$7)*round(u(255)); )" - if {$7!=1} sh.. 100% n. 0,255 rm. fi + if $7!=1 sh.. 100% n. 0,255 rm. fi ==. 0 sh.. 0,2 srgb2rgb. rm. - inpaint_diffusion.. [1],100%,1 rm. + inpaint_pde.. [1],100%,1 rm. b $3% n 0,255 sh 0,2 rgb2srgb. balance_gamma. ${4-6} rm. endl done @@ -35412,12 +44289,13 @@ #@gui : Thickness Factor = float(-0.25,-1,1) #@gui : Blur Factor = float(-0.1,-1,1) #@gui : Opacity Factor = float(-0.20,-1,1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/27/11.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/27/11.") fx_lightning : repeat $! l[$<] 100%,100% l. fact={max(w,h)/$3*$2%} srand $11 repeat $1 - if {$!<=1} + if $!<=1 i=0 new_level=1 new_length=$3 @@ -35490,7 +44368,8 @@ #@gui : sep = separator() #@gui : Thickness = float(0,0,50) #@gui : Color = color(255,255,255,255) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/18/04.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/18/04.") fx_lissajous : repeat $! l[$>] to_rgba {w},{h} @@ -35518,29 +44397,38 @@ #@gui : Iterations = int(1024,16,65535) #@gui : X-Seed (Julia) = float(0.317,-2,2) #@gui : Y-Seed (Julia) = float(0.03,-2,2) -#@gui : sep = separator(), note = note{"Colormap:"} +#@gui : sep = separator() +#@gui : note = note{"Colormap:"} #@gui : Number of Colors = int(16,2,2048) #@gui : Smoothness = int(8,1,256) #@gui : Seed = int(255,0,65536) -#@gui : sep = separator(), note = note{"Navigation:"} +#@gui : sep = separator() +#@gui : note = note{"Navigation:"} #@gui : Zoom Center = point(50,50,0,0,255,255,255,200) #@gui : Zoom Factor = float(0.25,0,1) #@gui : Zoom In = button() #@gui : Center = button() #@gui : Zoom Out = button() #@gui : Display Coordinates = bool(0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2018/06/27.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2018/06/27.") fx_mandelbrot : - if {!narg($_size)} _size={max(w,h)} fi + if !narg($_size) _size={max(w,h)} fi rm $_size,$_size mandelbrot ${1-4},$6,{$5?[1,$7,$8]:[0,0,0]} srand $11 $9,1,1,3 rand. 0,255 r. {$9*$10},1,1,3,3 point. 0 map.. .,3 rm. fx_mandelbrot_preview : _size={min(${-gui_preview_wh})} - if {"$15 || $16 || $17"} - x0,y0,x1,y1={"P0 = [${1,2}]; dP = [${3,4}] - P0; C = P0 + [${12,13}]%*dP; zfact = $14*($15?1:$16?0:-2); dC = 0.5*dP*(1 - 0.98*zfact); [C - dC,C + dC]"} - status=\{$x0\}\{$y0\}\{$x1\}\{$y1\}\{$5\}\{$6\}\{$7\}\{$8\}\{$9\}\{$10\}\{$11\}\{50,50\}\{$14\}\{0\}\{0\}\{0\}\{$18\} + if "$15 || $16 || $17" + x0,y0,x1,y1={"P0 = [${1,2}]; + dP = [${3,4}] - P0; + C = P0 + [${12,13}]%*dP; + zfact = $14*($15?1:$16?0:-2); + dC = 0.5*dP*(1 - 0.98*zfact); + [C - dC,C + dC]"} + status=\{$x0\}\{$y0\}\{$x1\}\{$y1\}\{$5\}\{$6\}\{$7\}\{$8\}\{$9\}\{$10\}\{$11\}\ + \{50,50\}\{$14\}\{0\}\{0\}\{0\}\{$18\} px,py=50 else x0,y0,x1,y1=${1-4} @@ -35552,7 +44440,7 @@ x0r,y0r,x1r,y1r={"C = ["$px,$py"]%*w; dC = 0.5*w*(1 - 0.98*$14); round([C - dC, C + dC - 1])"} rectangle $x0r,$y0r,$x1r,$y1r,0.7,0xF0F0F0F0,255,255,255,255 rectangle $x0r,$y0r,$x1r,$y1r,0.7,0x0F0F0F0F,0,0,0,255 - if $18 to "C0 = ( "$x0" , "$y0" )\nC1 = ( "$x1" , "$y1" )",2,2,16 fi + if $18 to "Z0 = ( "{_$x0}" , "{_$y0}" )\nZ1 = ( "{_$x1}" , "{_$y1}" )",2,2,16 fi u $status #@gui Neon Lightning : fx_neon_lightning, fx_neon_lightning(1) @@ -35568,7 +44456,8 @@ #@gui : Color = color(130,80,50) #@gui : Color Dispersion = float(0.25,0,1) #@gui : Transparency = float(0,0,1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/30/06.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/30/06.") fx_neon_lightning : d={$13*255} repeat $! l[$>] @@ -35592,6 +44481,206 @@ a c c 0,255 endl done +#@gui Newton Fractal : fx_newton_fractal, fx_newton_fractal_preview +#@gui : X0 = value(-2) +#@gui : Y0 = value(-2) +#@gui : X1 = value(2) +#@gui : Y1 = value(2) +#@gui : note = note{"Fractal Type:"} +#@gui : Expression = choice(2,"Custom","z^^2 - 1","z^^3 - 1","z^^5 - 1","z^^6 + z^^3 - 1","z^^8 + 15*z^^4 - 1") +#@gui : p(z) = text{"rot(35)*z^^3 - z^^2 + 1"}_1 +#@gui : p'(z) = text{"3*z^^2 - 2*z"}_1 +#@gui : p''(z) = text{"6*z - 2"}_1 +#@gui : Descent method = choice(1,"Secant","Newton","Householder") +#@gui : Max iterations = int(200,16,1024) +#@gui : Precision = float(2,0,12) +#@gui : sep = separator() +#@gui : note = note{"Rendering:"} +#@gui : Coloring = choice(1,"By Custom Expression","By Iteration","By Value") +# +# Color by iteration +# +#@gui : Number of Colors = int(16,2,2048) +#@gui : Smoothness = int(8,1,256) +#@gui : Seed = int(255,0,65536) +# +# Color by value +# +#@gui : Colorspace = choice(2,"HSI","HSL","HSV")_0 +#@gui : Hue min (%) = float(100,0,500)_0 +#@gui : Hue max (%) = float(150,0,500)_0 +#@gui : Lightness min (%) = float(20,0,500)_0 +#@gui : Lightness max (%) = float(400,0,500)_0 +# +# Custom coloring +# +#@gui : Colorspace = choice(3,"RGB,"HSI","HSL","HSV","Lab")_0 +#@gui : Pre-Process = choice(2,"None","Equalize","Normalize","Equalize and Normalize")_0+ +#@gui : note = note{"Tips for Custom expressions:\n +#@gui : - Variables i0,i1 stand for the real and imaginary parts of the iterated complex number.\n +#@gui : - Variable i2 is the number of iterations required for convergence.\n +#@gui : - Variable z is the complex number with value [ i0,i1 ].\n +#@gui : - Functions p(z), dp(z) and d2p(z) are the expressions used for computing the fractal. +#@gui : "} +#@gui : Channel #1 = text{"carg(-z)"}_0 +#@gui : Channel #2 = text{"(i0 + i1)/2"}_0 +#@gui : Channel #3 = text{"10*(i2^0.4)"}_0 +#@gui : Post-Process = choice(0,"None","Equalize","Normalize","Equalize and Normalize")_0 +# +# Basic color adujstment +# +#@gui : Brightness (%) = float(0,-100,100) +#@gui : Contrast (%) = float(0,-100,100) +#@gui : Gamma (%) = float(0,-100,100) +#@gui : Hue (%) = float(0,-100,100) +#@gui : Saturation (%) = float(0,-100,100) +#@gui : Equalization (%) = float(0,0,100) +#@gui : Anti-aliasing = choice(2,"x1","x1.5","x2","x2.5","x3","x3.5","4") +#@gui : note = note{"Note: Anti-aliasing is applied on final rendering only, not on preview."} +#@gui : antialias_note = value(0)_2- +#@gui : sep = separator() +# +# Navigation +# +#@gui : note = note{"Navigation:"} +#@gui : Zoom Center = point(50,50,0,0,255,255,255,200) +#@gui : Zoom Factor = float(0.5,0,1) +#@gui : Angle = float(0,-180,180) +#@gui : Zoom In = button() +#@gui : Center = button() +#@gui : Zoom Out = button() +#@gui : Reset View = button() +#@gui : Display Coordinates on Preview Window = bool(1) +#@gui : Preview subsampling = choice(2,"None","x1.5","x2","x2.5","x3","x3.5","x4") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2019/01/09.") +fx_newton_fractal : skip "${6=},${7=},${8=},${22=},${25=},${28=}" + repeat $! l[$>] + if !narg($_size) _size={max(w,h)} fi + rm + antialias={arg(1+$33,1,1.5,2,2.5,3,3.5,4)} + {$antialias*[$_size,$_size]} + if $5==1 + pz="z^^2 - 1" dpz="2*zn" d2pz="2" + elif $5==2 + pz="z^^3 - 1" dpz="3*z^^2" d2pz="6*z" + elif $5==3 + pz="z^^5 - 1" dpz="5*z^^4" d2pz="20*z^^3" + elif $5==4 + pz="z^^6 + z^^3 - 1" dpz="6*z^^5 + 3*z^^2" d2pz="30*z^^4 + 6*z" + elif $5==5 + pz="z^^8 + 15*z^^4 - 1" dpz="8*z^^7 + 60*z^^3" d2pz="56*z^^6 + 180*z^^2"; + else + pz="$6" dpz="$7" d2pz="$8" + fi + if !narg($pz) pz="[1,0]" fi + if !narg($dpz) dpz="[1,0]" fi + if !narg($d2pz) d2pz="[1,0]" fi + + newton_fractal ${1-4},$38,$9,$10,{10^-$11},$pz,$dpz,$d2pz + + if $12==1 # Color by iteration + channels 100% + srand $15 $13,1,1,3 rand. 0,255 r. {$13*$14},1,1,3,3 point. 0 map.. .,3 rm. + + elif $12==2 # Color by value + f "[ atan2(i1,i0),1,i2 ]" s c n... {[$17,$18]*360%} n. {[$19,$20]%} c. 0,1 a c + ${"arg 1+$16,hsi,hsl,hsv"}2rgb + + else # Custom coloring + + if $22 # Pre-process values + s c,-2 + if $22&1 equalize 1024 fi + if $22&2 /[-2] {-2,max(1e-5,abs(im),abs(iM))} n. 0,1 fi + a c + fi + + f "*begin( + p(z) = ("$pz"); + dp(z) = ("$dpz"); + d2p(z) = ("$d2pz"); + ); + z = [ i0,i1 ]; + [ (0;$23),(0;$24),(0;$25) ]" + + if $26 # Post-process values + s c + if $26&1 equalize 1024 fi + if $26&2 normalize 0,1 fi + a c + fi + + * 255 mod 256 + if $21 ${"arg $21,hsi8,hsl8,hsv8,lab8"}2rgb fi # Convert to RGB colors + fi + + r2dx $_size + + if $32 ac "+equalize 1024 j.. .,0,0,0,0,{$32%} rm.",ycbcr_y fi + adjust_colors ${27-31},0,0,0,255 + endl done + +fx_newton_fractal_preview : skip "${6=},${7=},${8=},${22=},${25=},${28=}" + is_custom_expression={$5==0?2:1} + is_color_by_custom={$12==0?2:0} + is_color_by_iter={$12==1?2:0} + is_color_by_value={$12==2?2:0} + _size0={min(${-gui_preview_wh})} + _size={$_size0/arg(1+$44,1,1.5,2,2.5,3,3.5,4)} + + angle=$38 + if "$39 || $40 || $41" + x0,y0,x1,y1={"P0 = [${1,2}]; + dP = [${3,4}] - P0; + M = P0 + 0.5*dP; + C = P0 + [${35,36}]%*dP; + C = M + rot(-$38)*(C - M); + zfact = $37*($39?1:$40?0:-2); + dC = 0.5*dP*(1 - 0.98*zfact); + [ C - dC, C + dC ]"} + px,py=50 + elif $42 + x0,y0,x1,y1=-2,-2,2,2 + px,py=50 + angle=0 + else + x0,y0,x1,y1=${1-4} + px,py=${35,36} + fi + fx_newton_fractal $x0,$y0,$x1,$y1,$5,"$6","$7","$8",${9-22},"$23","$24","$25",${26-32},0,${34-37},$angle,${39--1} + + repeat $! l[$>] + r2dx $_size0,1 + x0r,y0r,x1r,y1r={"C = [ "$px,$py" ]%*w; dC = 0.5*w*(1 - 0.98*$37); round([ C - dC, C + dC - 1 ])"} + rectangle $x0r,$y0r,$x1r,$y1r,0.7,0xF0F0F0F0,255,255,255,255 + rectangle $x0r,$y0r,$x1r,$y1r,0.7,0x0F0F0F0F,0,0,0,255 + if $43 to "Z0 = ( "{_$x0}" , "{_$y0}" )\nZ1 = ( "{_$x1}" , "{_$y1}" )",2,2,16 fi + endl done + + u "{"$x0"}{"$y0"}{"$x1"}{"$y1"}{$5}"\ + "{$6}_"$is_custom_expression\ + "{$7}_"$is_custom_expression\ + "{$8}_"$is_custom_expression\ + "{$9}{$10}{$11}{$12}"\ + "{$13}_"$is_color_by_iter\ + "{$14}_"$is_color_by_iter\ + "{$15}_"$is_color_by_iter\ + "{$16}_"$is_color_by_value\ + "{$17}_"$is_color_by_value\ + "{$18}_"$is_color_by_value\ + "{$19}_"$is_color_by_value\ + "{$20}_"$is_color_by_value\ + "{$21}_"$is_color_by_custom\ + "{$22}_"$is_color_by_custom\ + "{$23}_"$is_color_by_custom\ + "{$24}_"$is_color_by_custom\ + "{$25}_"$is_color_by_custom\ + "{$26}_"$is_color_by_custom\ + "{$27}{$28}{$29}{$30}{$31}{$32}{$33}"\ + "{$34}"_{$33==0?0:2}\ + "{"$px,$py"}{$37}{"$angle"}{0}{0}{0}{0}{$43}{$44}" + #@gui Plasma : fx_plasma, fx_plasma(0) #@gui : Alpha = float(0.5,0,5) #@gui : Beta = float(0,0,100) @@ -35599,7 +44688,8 @@ #@gui : Randomize = bool(0) #@gui : Transparency = bool(0) #@gui : Color Balance = color(128,128,128) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/20/03.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/20/03.") fx_plasma : skip ${4=0},${5=0} if $5 to_rgba else to_rgb fi if $4 rand 0,255 fi @@ -35614,15 +44704,16 @@ #@gui : Position = choice(3,"Up-Left","Up-Right","Bottom-Left","Bottom-Right") #@gui : Offset = int(5,0,40) #@gui : Orientation = choice(1,"-90 deg.","0 deg.","+90 deg.","+180 deg.") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_quick_copyright : i[0] 0 t[0] "$1",0,0,$2,1,$3,$4,$5 autocrop[0] 0 r[0] {{0,w}+2*$7},{{0,h}+2*$7},1,3,0,0,0.5,0.5 i[1] 0 t[1] "$1",0,0,$2,1,1 autocrop[1] 0 r[1] {{1,w}+2*$7},{{1,h}+2*$7},1,1,0,0,0.5,0.5 dilate[1] {1+2*$7} rotate[0,1] {90*($10-1)} - repeat {$!-2} - if {$8==0} j. [0],$9,$9,0,0,{$6/255},[1] - elif {$8==1} j. [0],{w-1-{0,w}-$9},$9,0,0,{$6/255},[1] - elif {$8==2} j. [0],$9,{h-1-{0,h}-$9},0,0,{$6/255},[1] + repeat $!-2 + if $8==0 j. [0],$9,$9,0,0,{$6/255},[1] + elif $8==1 j. [0],{w-1-{0,w}-$9},$9,0,0,{$6/255},[1] + elif $8==2 j. [0],$9,{h-1-{0,h}-$9},0,0,{$6/255},[1] else j. [0],{w-1-{0,w}-$9},{h-1-{0,h}-$9},0,0,{$6/255},[1] fi mv. 2 done @@ -35635,15 +44726,16 @@ #@gui : Right Slope = float(175,0,400) #@gui : Thinness = float(3,0.1,8) #@gui : Opacity = float(80,0,199) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_rainbow : repeat $! l[$>] 100%,100% spline. 0,$1%,100,{-$3}%,100%,$2%,100,$4%,1,1 flood. 0,0,0,0,0,1,1 flood. {w-1},0,0,0,0,1,1 distance. 0 c. 0,255 n. 0,{$5*255} - rainbow_lut +luminance. c. 0,{min(100,200-$6)}% n. 0,255 a[-2,-1] c + palette rainbow +luminance. c. 0,{min(100,200-$6)}% n. 0,255 a[-2,-1] c map.. . rm. - if {$6<100} sh. 3 *. {$6/100} rm. fi + if $6<100 sh. 3 *. {$6/100} rm. fi blend alpha endl done @@ -35661,7 +44753,8 @@ #@gui : Rt = float(0.8,-3,3) #@gui : Rcx = float(0,-3,3) #@gui : Colormap = choice(8,"Grayscale","Standard","HSV","Lines","Hot","Cool","Jet","Flag","Cube") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2012/18/04.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2012/18/04.") fx_shadebobs : channels 0 f 0 repeat $! l[$>] @@ -35697,7 +44790,8 @@ #@gui : sep = separator() #@gui : Thickness = float(3,0,50) #@gui : Color = color(128,255,128,255) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/18/04.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/18/04.") fx_superformula : repeat $! l[$>] to_rgba {w},{h} @@ -35715,13 +44809,228 @@ +[-2,-1] endl done +#@gui Symmetric 2D Shape : fx_symmetric_shape2d, fx_symmetric_shape2d_preview(1) +#@gui : Subdivisions = int(5,2,32) +#@gui : Center = point(50,50,0,1,255,255,255,128) +#@gui : Old Center = value(50,50) +#@gui : Angle / Size = point(50,30,0,1,255,255,255,128) +#@gui : Old Angle / Size = value(50,30) +#@gui : sep = separator() +#@gui : Control Point 1 = point(50,25,1,1,255,128,0,255,4) +#@gui : Control Point 2 = point(56,42,1,1,255,128,0,255,4) +#@gui : Control Point 3 = point(52,52,-1,1,255,128,0,255,4) +#@gui : Control Point 4 = point(52,52,-1,1,255,128,0,255,4) +#@gui : Control Point 5 = point(52,52,-1,1,255,128,0,255,4) +#@gui : Control Point 6 = point(52,52,-1,1,255,128,0,255,4) +#@gui : sep = separator() +#@gui : Drawing Mode = choice(1,"Outlined","Filled") +#@gui : Color = color(255,0,255) +#@gui : Opacity (%) = float(100,0,100) +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2019/06/17.") +fx_symmetric_shape2d : + if !narg($_is_preview) _is_preview=0 fi + repeat $! l[$<] + 100%,100%,1,4 _fx_symmetric_shape2d. $* rv + if !$_is_preview" && "$_output_mode rm. fi + endl done + +_fx_symmetric_shape2d : + (${10-21}) f. "isnan(i)?-1024:i" discard. -1024 r. 2,{h/2},1,1,-1 permute. cyzx + f. "x = R - $2; y = G - $3; [ atan2(y,x), norm(x,y) ]" + l. n={h} .x{$1-1} a y f "const pi2 = 2*pi; [ (R + int(y/"$n")*pi2/$1)%pi2, G ]" sort +,y endl + f. "[ $2*w#-2,$3*h#-2 ]/100 + [ G*cos(R), G*sin(R) ]*(min(w#-2,h#-2)-1)%" permute. cyzx + coords={^} rm. + if $22 polygon {narg($coords)/2},$coords,1,${23-25},{$26*255%} + else polygon {narg($coords)/2},$coords,1,0xFFFFFFFF,${23-25},{$26*255%} + fi + +fx_symmetric_shape2d_preview : + _is_preview=1 + cx1,cy1,cx2,cy2,cx3,cy3,cx4,cy4,cx5,cy5,cx6,cy6=${10-21} + angx,angy=$6,$7 + if [$2,$3]!=[$4,$5]" || "[$angx,$angy]!=[$8,$9] # Center or angle has been modified + dx,dy={[$2-$4,$3-$5]} + repeat 6 i={1+$>} + cx$i,cy$i={" + const cx = "${cx$i}"; + const cy = "${cy$i}"; + dang = atan2($7 - $3,$6 - $2) - atan2($9 - $3,$8 - $2); + dsca = norm($6 - $2,$7 - $3)/norm($9 - $3,$8 - $2); + [ $2,$3 ] + dsca*rot(dang*180/pi)*[ cx - $4, cy - $5 ]"} + done + angx,angy={[$6+$2-$4,$7+$3-$5]} + fi + + repeat $! l[$>] + r {s=min(w,h);[s,s]},1,100%,0,0,0.5,0.5 + fx_symmetric_shape2d ${1-9},$cx1,$cy1,$cx2,$cy2,$cx3,$cy3,$cx4,$cy4,$cx5,$cy5,$cx6,$cy6,${22-26} + rv blend alpha + eval " + t0 = atan2($7 - $3,$6 - $2); + for (k = 0, k<$1, ++k, + const pi2 = 2*pi; + const xc = $2*(w-1)%; + const yc = $3*(h-1)%; + x = xc + (w+h)*cos(t0 + 2*pi*k/$1); + y = yc + (w+h)*sin(t0 + 2*pi*k/$1); + polygon(-2,xc,yc,x,y,0.35,0xF0F0F0F0,255); + polygon(-2,xc,yc,x,y,0.35,0x0F0F0F0F,0); + )" + endl done + + u "{$1}"\ # Subdivisions + "{$2,$3}"\ # Center + "{$2,$3}"\ # Old Center + "{"$angx,$angy"}"\ # Angle + "{"$angx,$angy"}"\ # Old Angle + "{"$cx1,$cy1"}"\ # Control point 1 + "{"$cx2,$cy2"}"\ # Control point 2 + "{"$cx3,$cy3"}"\ # Control point 3 + "{"$cx4,$cy4"}"\ # Control point 4 + "{"$cx5,$cy5"}"\ # Control point 5 + "{"$cx6,$cy6"}"\ # Control point 6 + "{$22}"\ # Drawing mode + "{$23,$24,$25}"\ # Color + "{$26}" # Opacity + +#@gui Tree : fx_tree, fx_tree_preview(1) +#@gui : note = note("Global parameters:") +#@gui : Recursion Depth = int(11,1,18) +#@gui : Random Seed = int(10000,0,65535) +#@gui : X-ratio = float(0,-1,1) +#@gui : Y-ratio = float(0,-1,1) +#@gui : note = note("Note: Set Random Seed to 0 to make it \ +# random as well.") +#@gui : sep = separator(), note = note("Trunk:") +#@gui : Thickness (%) = float(15,0,100) +#@gui : Base Thickness (%) = float(150,0,300) +#@gui : Angle (deg.) = float(0,-90,90) +#@gui : sep = separator(), note = note("Recursion:") +#@gui : Avg Branching = float(2.15,1,6) +#@gui : Std Branching = float(0.8,0,6) +#@gui : Avg Left Angle (deg.) = float(-40,-90,90) +#@gui : Avg Right Angle (deg.) = float(40,-90,90) +#@gui : Std Angle (deg.) = float(10,0,90) +#@gui : Avg Length Factor (%) = float(75,0,200) +#@gui : Std Length Factor (%) = float(0,0,200) +#@gui : Avg Thickness Factor (%) = float(70,0,200) +#@gui : Std Thickness Factor (%) = float(20,0,200) +#@gui : sep = separator(), note = note("Colors / Opacity:") +#@gui : Trunk color = color(40,25,0,255) +#@gui : Trunk opacity (%) = float(100,0,100) +#@gui : Leaf color = color(70,140,60,255) +#@gui : Leaf opacity (%) = float(100,0,100) +#@gui : Color gamma = float(0.4,-2,2) +#@gui : Opacity gamma = float(0.4,-2,2) +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2020/03/24.") +_fx_tree: + recursion_depth,random_seed,xratio,yratio,\ + trunk_thickness,base_thickness,trunk_angle,\ + avg_branching,std_branching,avg_leftangle,avg_rightangle,std_angle,avg_length,std_length,avg_thickness,std_thickness,\ + Rt,Gt,Bt,At,Ot,Rl,Gl,Bl,Al,Ol,gammaRGBA,gammaO=${1-28} + + W,H,S={[w,h,min(w,h)]} l[] + if $2 srand $2 fi + + # Init trunk. + 1,1,1,9," + const h_thickness = "$trunk_thickness"%/2; + const hb_thickness = h_thickness*"$base_thickness"%; + R = rot("$trunk_angle"); + C = [ 0.5,0 ]; + P0 = C + R*[ -hb_thickness,0 ]; + P1 = C + R*[ hb_thickness,0 ]; + P2 = C + R*[ h_thickness,0.5 ]; + P3 = C + R*[ -h_thickness,0.5 ]; + [ P0,P1,P2,P3,0 ]" + + # Compute tree geometry. + repeat $recursion_depth + 1,8,1,9 + eval.. >${-math_lib}" + const dangle = "$avg_rightangle" - "$avg_leftangle"; + ref(I,val); + ref(val[0,2],P0); + ref(val[2,2],P1); + ref(val[4,2],P2); + ref(val[6,2],P3); + ndepth = val[8] + 1; + + # Median axis. + A = (P0 + P1)/2; + B = (P2 + P3)/2; + AB = B - A; + thickness = norm(B - P2); + + N = round(cut("$avg_branching" + u(-1,1)*"$std_branching",1,6)); + Nm1 = N<=1?1:N - 1; + + for (n = 0, n + begin( + RGBAt = [ "$Rt,$Gt,$Bt,$At" ]; + RGBAl = [ "$Rl,$Gl,$Bl,$Al" ]; + const gRGBA = 10^"$gammaRGBA"; + const gO = 10^"$gammaO"; + ); + ref(I,val); + t = val[8]/"$recursion_depth"; # Between [0,1] + RGBA = lerp(RGBAt,RGBAl,t^gRGBA); + O = lerp("$Ot,$Ol",t^gO)%; + polygon(#-1,4,val[0,8],O,RGBA); + (i0==i2 && i1==i3) || (i4==i6 && i5==i7)?polygon(#-1,2,i0,i1,i4,i5,O,RGBA); + val" + mirror xy + rm.. + endl + +fx_tree : + _fx_tree. $* mv. 0 + if $_output_mode k[0] fi + +fx_tree_preview : + repeat $! l[$>] _fx_tree $* blend alpha endl done + #@gui Turbulence : fx_turbulence, fx_turbulence #@gui : Radius = float(128,1,1024) #@gui : Octaves = int(6,1,12) #@gui : Damping per Octave = float(4,1,10) #@gui : Difference Mixing = float(0,-10,10) #@gui : Mode = choice("Turbulence","Turbulence 2","Fractal Noise","Fractured Clouds","Stardust","Pea Soup") -#@gui : sep = separator(), note = note("Author: Preben Soeberg. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: Preben Soeberg.      Latest Update: 2010/29/12.") fx_turbulence : remove_opacity turbulence ${^0} @@ -35738,7 +45047,7 @@ if $4 s. x,2 else . fi -$1.. $2 -$1. $3 # Assume this is a 1->1 filter. r[-2,-1] {max(w,{-2,w})},{max(h,{-2,h})},1,100%,3 - if {!$4} columns.. 0,50% columns. 50%,100% fi + if !$4 columns.. 0,50% columns. 50%,100% fi a[-2,-1] x r. $width,$height,1,100%,2 drgba. line. 50%,0,50%,100%,1,0,0,0,255 to. "Start",3,-1,13,2,1,255 to. "End",{w-24},{h-18},13,2,1,255 @@ -35777,7 +45086,8 @@ #@gui : Z-Light = float(-100,-100,0) #@gui : Specular Lightness = float(0.5,0,1) #@gui : Specular Shininess = float(0.7,0,3) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_animate_elevation3d : skip "${4=}" if $3 filename="$4/gmic_elevation3d.png" else filename="" fi _fx_elevation3d ${5-6} @@ -35824,7 +45134,8 @@ #@gui : Z-Light = float(-100,-100,0) #@gui : Specular Lightness = float(0.5,0,1) #@gui : Specular Shininess = float(0.7,0,3) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_animate_extrude3d : skip "${4=}" if $3 filename="$4/gmic_extrude3d.png" else filename="" fi _fx_extrude3d ${5-7} @@ -35869,7 +45180,8 @@ #@gui : Z-Light = float(-100,-100,0) #@gui : Specular Lightness = float(0.5,0,1) #@gui : Specular Shininess = float(0.7,0,3) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_animate_imageobject3d : skip "${4=}" if $3 filename="$4/gmic_imageobject3d.png" else filename="" fi _fx_imageobject3d "_",$5 @@ -35893,7 +45205,8 @@ #@gui : Y-Shadow= float(2,0,10) #@gui : Shadow Smoothness = float(1,0,5) #@gui : Stationary Frames = _int(19,1,32) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2012/01/09.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2012/01/09.") fx_text_pointcloud3d : W={w} H={h} M={round(1.5*max(w,h))} rm text_pointcloud3d "$2","$3",$4 @@ -35910,8 +45223,8 @@ i[0] 100%,100%,1,4 fc[0] ${8-11} +channels. 3,3 +negate. b[-2,-1] $14% to_rgba. j[0] .,$12%,$13%,0,0,1,..,255 rm[-2,-1] blend alpha endl done fi - if {$W>$H} r2dx $W else r2dy $H fi - if {$15>1} + if $W>$H r2dx $W else r2dy $H fi + if $15>1 i[{int($1/2)}] [{int($1/2)}]x{$15-1} i[0] [0]x{$15-1} fi @@ -35929,16 +45242,19 @@ #@gui : Z-Rotation = text("0") #@gui : Focale = float(800,100,2000) #@gui : Enable Antialiasing = bool(1) -#@gui : sep = separator(), note = note{"Note: -#@gui : This filter needs two layers to work properly. Set the Input layers option to handle multiple input layers. +#@gui : sep = separator() +#@gui : note = note{"Note: +#@gui : This filter needs two layers to work properly. Set the Input layers option to handle +#@gui : multiple input layers. #@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2012/13/08.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2012/13/08.") fx_transition3d : f3d $7 transition3d $1,$2,$3,"$4","$5","$6",$8 fx_transition3d_preview : - if {$!==1} gui_warning_preview "Missing input layer" return fi + if $!==1 gui_warning_preview "Missing input layer" return fi f3d $7 k[0,1] transition3d 4,$2,$3,"$4","$5","$6",$8 k[1,2] @@ -35947,7 +45263,7 @@ a x line 50%,0,50%,100%,1,0,0,0,255 -#@gui B&W Pencil [Animated] : fx_animate_pencilbw, fx_animate_pencilbw_preview(0) +#@gui B&W Pencil [Animated] : fx_animate_pencilbw, fx_animate_pencilbw_preview(0) #@gui : Frames = _int(10,2,100) #@gui : Output Frames = _bool(1) #@gui : Output Files = _bool(0) @@ -35958,7 +45274,8 @@ #@gui : note = note{"\nEnding Parameters :"} #@gui : Pencil Type = float(0.3,0,5) #@gui : Amplitude = float(60,0,200) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_animate_pencilbw : skip "${4=}" if $3 filename="$4/gmic_pencilbw.png" else filename="" fi animate pencilbw,"${5-6}",\ @@ -35968,7 +45285,7 @@ fx_animate_preview pencilbw,"${5-6}",\ "${7-8}" -#@gui B&W Stencil [Animated] : fx_animate_stencilbw, fx_animate_stencilbw_preview(1) +#@gui B&W Stencil [Animated] : fx_animate_stencilbw, fx_animate_stencilbw_preview(1) #@gui : Frames = _int(10,2,100) #@gui : Output Frames = _bool(1) #@gui : Output Files = _bool(0) @@ -35979,7 +45296,8 @@ #@gui : note = note{"\nEnding Parameters :"} #@gui : Edge Threshold = float(10,0,30) #@gui : Smoothness = float(20,0,30) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_animate_stencilbw : skip "${4=}" if $3 filename="$4/gmic_stencilbw.png" else filename="" fi animate stencilbw,"${5-6}",\ @@ -36008,7 +45326,8 @@ #@gui : Edge Threshold = float(10,1,30) #@gui : Edge Thickness = float(0.1,0,1) #@gui : Color Strength = float(1.5,0,3) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_animate_cartoon : skip "${4=}" if $3 filename="$4/gmic_cartoon.png" else filename="" fi animate cartoon,"${6-10},$5",\ @@ -36031,7 +45350,8 @@ #@gui : note = note{"\nEnding Parameters :"} #@gui : Smoothness = float(0,0,10) #@gui : Edge Threshold = float(30,0,30) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_animate_edges : skip "${4=}" if $3 filename="$4/gmic_edges.png" else filename="" fi animate fx_edges,"${6-7},$5",\ @@ -36050,8 +45370,13 @@ #@gui : Number of Frames = _int(20,1,999) #@gui : Starting Frame = int(20,0,199) #@gui : Frame Skip = _int(0,0,20) -#@gui : sep = separator(), Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"), Preview split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/06/07.") +#@gui : sep = separator() +#@gui : Preview Type = choice("Full","Forward Horizontal","Forward Vertical","Backward Horizontal", +#@gui : "Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right", +#@gui : "Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse") +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/06/07.") fx_fire_edges : fire_edges ${1-7} rv @@ -36067,9 +45392,10 @@ #@gui : Size = float(2,0,30) #@gui : Smoothness = _float(0.01,0,1) #@gui : Transparent Background = bool(0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/06/07.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/06/07.") fx_lavalampbw : - if {!$!} (255;100^64;16^128;0) r. 512,512,1,3,3 fi + if !$! (255;100^64;16^128;0) r. 512,512,1,3,3 fi repeat $! l[$<] remove_opacity w={w} h={h} +r $4%,$4%,1,1,0 [-1]x{$1-1} rand[^0] 0,1 stencil[^0] $5,0 @@ -36080,7 +45406,7 @@ r[^0] 100%,100%,1,4 j[^0] [0] rm[0] if $3 rm. fi endl done - if {!$7} repeat $! l[$>] split_opacity n. 0,1 *[^-1] . rm. endl done fi + if !$7 repeat $! l[$>] split_opacity n. 0,1 *[^-1] . rm. endl done fi fx_lavalampbw_preview : fx_lavalampbw 2,2,1,$4,$5,$6,$7 k[0] @@ -36124,7 +45450,8 @@ #@gui : Z-Angle = float(0,0,360) #@gui : Thickness = float(0,0,50) #@gui : Color = color(255,255,255,255) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/18/04.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/18/04.") fx_animate_lissajous : skip "${4=}" if $3 filename="$4/gmic_lissajous.png" else filename="" fi animate fx_lissajous,"${5-22}",\ @@ -36134,6 +45461,117 @@ fx_animate_preview fx_lissajous,"${5-22}",\ "${23-40}",0 +#@gui Moiré Animation : fx_moire, fx_moire_preview(1)+ : * +#@gui : Stripe orientation = choice(1,"Horizontal","Vertical") +#@gui : Input Transparency = choice("Replace With White","Reconstruct From Previous Frames") +#@gui : Output Format = choice{2,"Same as Input","A4 / 75 PPI","A4 / 100 PPI (Recommended)", +#@gui : "A4 / 150 PPI","A4 / 300 PPI"} +#@gui : Auto-Reduce Number of Frames = bool(1) +#@gui : Landscape = bool(1) +#@gui : Margin (%) = float(2,0,30) +#@gui : sep = separator() +#@gui : Print Frame Numbers = choice(1,"Disable","Top Left","Top Right","Bottom Left","Bottom Right") +#@gui : Size of Frame Numbers (%) = float(5,0,30) +#@gui : sep = separator() +#@gui : note = note{"Instructions:\n\n +#@gui : This filter renders Moire Animations, as shown on +#@gui : this video.\n +#@gui : To make the animation visible:\n\n +#@gui : • Before running the filter, ensure that all frames are aligned and have the same size +#@gui : (and preferably without alpha)!\n +#@gui : • Run the filter. It is recommended to keep the number of frames <=6.\n +#@gui : • Print the first layer (merged frames) on a A4 blank paper, at 300 PPI.\n +#@gui : • Print the second layer (mask) on a A4 transparent sheet, at 300 PPI.\n +#@gui : • Drag the transparent layer over the A4 paper to render the animation effect. +#@gui : "} +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2020/03/02.") +fx_moire : + if 0$_is_preview" && "!narg($_preview_width) _preview_width,_preview_height=512 fi + + # Reconstruct frames from base image. + if $2 repeat $! if $>" && "{$<,s==2||s==4} blend[$<] [{$<+1}],alpha,1,1 fi done fi + + # Auto-reduce number of frames (4, 5 or 6). + if $4 + skip={" + l<=6?1:( + const l5 = int(l/5); + const l4 = int(l/4); + const l6 = int(l/6); + 5*l5==l?l5: + 6*l6==l?l6: + 4*l4==l?l4:( + const r6 = abs(6*l6 - l); + const r5 = abs(5*l5 - l); + const r4 = abs(4*l4 - l); + r5<=r4 && r5<=r6?l5: + r6<=r4 && r6<=r5?l6: + l4 + ) + )"} + k[^:$skip] + if $!>6 rm[6--1] fi + fi + N=$! + + # Blend with white background. + repeat $! l[$>] if s==2||s==4 drgba 255 fi endl done + + # Constrain size of frames. + if 0$_is_preview + W,H=$_preview_width,$_preview_height + if $3 + if $W>$H W={$H/sqrt(2)} else H={$W*sqrt(2)} fi + fW,fH=$W,$H + W,H/={arg($3,4,3,2,1)} + fi + elif $3 + W,H,fW,fH={"$3==1?[620,877]:$3==2?[827,1169]:$3==3?[1240,1754]:[2480,3508]"},2480,3508 + W,H,fW,fH={round([$W,$H,$fW,$fH]*0.95)} # Take printer margins into account + else + W,H=${-max_wh} + fi + + if $3" && "$5 # Landscape mode + W,H=$H,$W fW,fH=$fH,$fW + fi + if !narg($fW) fW,fH=$W,$H fi + repeat $! l[$>] if [w,h]!=[$W,$H] + - 255 + rr2d {(100-$6)%*[$W,$H]},2,2 + r $W,$H,1,100%,0,0,0.5,0.5 + + 255 + fi endl done + + # Generate merged image and mask. + if $1 # Vertical stripes + 100%,100%,1,100%,"i(#x%"$N",x,y,z,c)" rm[^-1] + 100%,100%,1,1,"x%"$N"?0:255" + else # Horizontal stripes + 100%,100%,1,100%,"i(#y%"$N",x,y,z,c)" rm[^-1] + 100%,100%,1,1,"y%"$N"?0:255" + fi + + # Upscale with nearest-neighbor for printing. + if $3 + ir={round(max($fW/$W,$fH/$H))*100} + r $ir%,$ir%,1,100%,1 + r $fW,$fH,1,100%,0,1,0.5,0.5 + fi + + # Insert frame number label. + if $7" && "$8 + ax,ay={a=$7-1;[a%2?0.95:0.05,int(a/2)?0.95:0.05]} + 0 t. "#"$N,0,0,{0,h*$8%},1,255 autocrop. frame. 5%,15%,0 negate. to_rgb. j[^-1] .,$ax~,$ay~ rm. + fi + nm "name(Merged Frames),pos(0,0),opacity(100),mode(alpha)","name(Mask),pos(0,0),opacity(100),mode(alpha)" + u $N + +fx_moire_preview : + _is_preview=1 + fx_moire $* + #@gui Rodilius [Animated] : fx_animate_rodilius, fx_animate_rodilius_preview(1) #@gui : Frames = _int(10,2,100) #@gui : Output as Frames = _bool(1) @@ -36152,7 +45590,8 @@ #@gui : Sharpness = float(300,0,1000) #@gui : Orientations = int(5,2,20) #@gui : Offset = float(180,0,180) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_animate_rodilius : skip "${4=}" if $3 filename="$4/gmic_rodilius.png" else filename="" fi animate rodilius,"${6-10},$5",\ @@ -36171,7 +45610,8 @@ #@gui : Amplitude = float(0,0,8) #@gui : note = note{"\nEnding Parameters :"} #@gui : Amplitude = float(3,0,8) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_animate_glow : skip "${4=}" if $3 filename="$4/gmic_glow.png" else filename="" fi animate glow,"$5",\ @@ -36184,47 +45624,52 @@ #@gui Spatial Transition : fx_spatial_transition, fx_spatial_transition_preview(1) #@gui : Number of Added Frames = _int(10,1,256) #@gui : Shading (%) = float(0,0,100) -#@gui : Transition Shape = choice(7,"Bottom Layer","Top Layer","Custom Formula","Horizontal","Vertical","Angular","Radial","Plasma") +#@gui : Transition Shape = choice(7,"Bottom Layer","Top Layer","Custom Formula","Horizontal","Vertical", +#@gui : "Angular","Radial","Plasma") #@gui : Custom Formula = text{"cos(x*y/(16+32*A))"} #@gui : A-Value = float(0,0,1) #@gui : sep = separator() #@gui : Preview Type = choice(1,"Transition Map","Timed Image","Sequence x4","Sequence x6","Sequence x8") #@gui : Preview Time = float(0.5,0,1) #@gui : Preview = value(0) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/10/04.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/10/04.") fx_spatial_transition : to_rgba r ${-max_wh},1,100%,0,0,0.5,0.5 shape=-1 formula= - if {$3==0} # Do nothing. - elif {$3==1} shape=0 - elif {$3==2} formula="$4" - elif {$3==3} formula="sin(x*0.5*pi/w*(1+100*A))" - elif {$3==4} formula="sin(y*0.5*pi/h*(1+100*A))" - elif {$3==5} formula="atan2(y-h/2,x-w/2)%((1-A)*2*pi+0.001)" - elif {$3==6} formula="R=0.5*sqrt(w*w+h*h);sqrt((y-h/2)^2+(x-w/2)^2)%(0.001+R*(1-A))" - elif {$3==7} 100%,100% plasma. 1,1,{8/(1+$5)} equalize. 1024 + if $3==0 # Do nothing. + elif $3==1 shape=0 + elif $3==2 formula="$4" + elif $3==3 formula="sin(x*0.5*pi/w*(1+100*A))" + elif $3==4 formula="sin(y*0.5*pi/h*(1+100*A))" + elif $3==5 formula="atan2(y-h/2,x-w/2)%((1-A)*2*pi+0.001)" + elif $3==6 formula="R=0.5*sqrt(w*w+h*h);sqrt((y-h/2)^2+(x-w/2)^2)%(0.001+R*(1-A))" + elif $3==7 100%,100% plasma. 1,1,{8/(1+$5)} equalize. 1024 fi - if {narg($formula)} + if narg($formula) {w},{h},1,1,"A=$5;"$formula fi if $-1 # Preview mode. - if {$6==0} k[$shape] norm n 0,255 - elif {$6==1" && "$7==0} rm[$shape] rm. - elif {$6==1" && "$7==1} rm[$shape] rm[0] - elif {$6==1} + if $6==0 k[$shape] norm n 0,255 + elif $6==1" && "$7==0 rm[$shape] rm. + elif $6==1" && "$7==1 rm[$shape] rm[0] + elif $6==1 transition[^$shape] [$shape],$1,$2,$7*($1-1) rm[$shape] rm[0--1:2] else transition[^$shape] [$shape],{$6*2},$2 rm[$shape] to_rgba fi - if {$!>1} to_rgba frame 2%,2%,0,0,0,0 append_tiles , fi + if $!>1 to_rgba frame 2%,2%,0,0,0,0 append_tiles , fi else # Apply mode. transition[^$shape] [$shape],$1,$2 rm. fi nm name(transition),pos(0,0) - if {narg($formula)} u "{$1}{$2}{$3}{\""$formula"\"}{$5}{$6}{$7}{0}" fi + if narg($formula) u "{$1}{$2}{$3}{\""$formula"\"}{$5}{$6}{$7}{0}" fi fx_spatial_transition_preview : - if {($3<=1" && "$!<3)" || "($3>1" && "$!<2)} gui_print_preview "Warning:",,"This filter requires more input layers to work properly." return fi + if ($3<=1" && "$!<3)" || "($3>1" && "$!<2) + gui_print_preview "Warning:",,"This filter requires more input layers to work properly." + return + fi fx_spatial_transition ${1-3},"$4",${5-7},1 @@ -36238,7 +45683,8 @@ #@gui : Smoothness = float(0,0,10) #@gui : Color = color(255,255,255,255) #@gui : Antialiasing = bool(1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2018/01/08.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2018/01/08.") fx_cupid : max_wh={$!>0?[${-max_wh}]:[512,512]} w,h={S=[$max_wh]*$1%;[max(S[0],1),max(S[1],1)]} @@ -36264,7 +45710,8 @@ #@gui : Smoothness = float(0,0,10) #@gui : Color = color(255,255,255,255) #@gui : Antialiasing = bool(1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2018/01/08.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2018/01/08.") fx_gear : max_wh={$!>0?[${-max_wh}]:[512,512]} w,h={S=[$max_wh]*$1%;[max(S[0],1),max(S[1],1)]} @@ -36286,7 +45733,8 @@ #@gui : Smoothness = float(0,0,10) #@gui : Color = color(255,255,255,255) #@gui : Antialiasing = bool(1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2018/01/08.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2018/01/08.") fx_heart : max_wh={$!>0?[${-max_wh}]:[512,512]} w,h={S=[$max_wh]*$1%;[max(S[0],1),max(S[1],1)]} @@ -36313,7 +45761,8 @@ #@gui : 3rd Y-Coord = float(100,0,100) #@gui : Color = color(255,255,255) #@gui : Opacity = float(1,0,1) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_sierpinski : repeat $! l[$>] split_opacity l[0] 100%,100% sierpinski. ${1-7} @@ -36332,13 +45781,14 @@ #@gui : sep = separator() #@gui : note = note("This filter renders the Barnsley fern fractal, described here:") #@gui : url = link("https://en.wikipedia.org/wiki/Barnsley_fern") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/18/10.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/18/10.") fx_barnsley_fern : repeat $! l[$<] shape_fern {min(w,h)},$2%,$3,{$4%},$1 *. 255 100%,100%,1,3,[${5-7}] rv[-2,-1] a[-2,-1] c - if {!$9} blend alpha,{$8/255} + if !$9 blend alpha,{$8/255} else nm. "name(Barnsley Fern),opacity("{round($8*100/255)})")" rv[-2,-1] fi endl done @@ -36350,68 +45800,114 @@ #@gui : Recursions = int(5,0,6) #@gui : Opacity = float(1,0,1) #@gui : Color = color(255,255,255) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_snowflake : repeat $! l[$>] to_color split_opacity l[0] shape_snowflake {min(w,h)},$1 100%,100%,1,3,[${3-5}] j[0] .,{([w#0,h#0]-[w#1,h#1])/2},0,0,$2,.. k[0] endl a c endl done +#@gui _Others + +#@gui Dragon Curve : fx_dragoncurve, fx_dragoncurve(1) +#@gui : Recursions = int(20,0,30) +#@gui : Angle = float(0,-180,180) +#@gui : Opacity = float(1,0,1) +#@gui : Color = color(255,255,255) +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2019/01/29.") +fx_dragoncurve : + repeat $! l[$>] to_color split_opacity l[0] + shape_dragon {min(w,h)},$1,$2 100%,100%,1,3,[${4-6}] + j[0] .,{([w#0,h#0]-[w#1,h#1])/2},0,0,$3,.. k[0] + endl a c endl done + #@gui ____Various #------------------------ -#@gui Custom Code [Local] : fx_custom_code, fx_custom_code_preview(0) -#@gui : Code = text(1,"repeat $! l[$>]\n\n to_rgb\n +deform 20\n blend_edges 3\n\n-endl done\n\n\n") +#@gui Custom Code [Global] : fx_custom_code, fx_custom_code_preview(1) +#@gui : Code = text(1,"repeat $! l[$>]\n\n to_rgb\n +deform 20\n blend_edges 3\n\nendl done\n\n\n") #@gui : sep = separator() -#@gui : sep = separator(), Channel(s) = choice{"None (Allows Multi-layers)","All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]"} +#@gui : Channel(s) = choice{"None (Allows Multi-layers)","All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]", +#@gui : "RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]", +#@gui : "YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]"} #@gui : Value Action = choice("None","Cut","Normalize") #@gui : Display Debug Info on Preview = bool(0) #@gui : Debug Font Size = choice(2,"Tiny","Small","Normal","Large") -#@gui : sep = separator(), Preview Type = choice{"Full (Allows Multi-Layers)","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"}, Preview Split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note{"Note: +#@gui : sep = separator() +#@gui : Preview Type = choice{"Full (Allows Multi-Layers)","Forward Horizontal","Forward Vertical", +#@gui : "Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom", +#@gui : "Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"} +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note{"Note: #@gui : This filter can execute any set of instructions understood by the G'MIC language interpreter. -#@gui : Here, you can then test some commands before creating your own G'MIC custom commands and plug-in menu entries.\n\n +#@gui : Here, you can then test some commands before creating your own G'MIC custom commands and plug-in +#@gui : menu entries.\n\n #@gui : Please look at the documentation reference web page :"} #@gui : url = link("https://gmic.eu/reference.shtml") #@gui : note = note{" #@gui : to learn more about available G'MIC commands. #@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/03/10.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/03/10.") -#@gui Custom Code [Global] : fx_custom_code, fx_custom_code_preview(1) -#@gui : Code = text(1,"repeat $! l[$>]\n\n to_rgb\n +deform 20\n blend_edges 3\n\n-endl done\n\n\n") -#@gui : sep = separator(), Channel(s) = choice{"None (Allows Multi-layers)","All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]"} +#@gui Custom Code [Local] : fx_custom_code, fx_custom_code_preview(0) +#@gui : Code = text(1,"repeat $! l[$>]\n\n to_rgb\n +deform 20\n blend_edges 3\n\nendl done\n\n\n") +#@gui : sep = separator() +#@gui : Channel(s) = choice{"None (Allows Multi-layers)","All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]", +#@gui : "RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]", +#@gui : "YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]"} #@gui : Value Action = choice("None","Cut","Normalize") #@gui : Display Debug Info on Preview = bool(0) #@gui : Debug Font Size = choice(2,"Tiny","Small","Normal","Large") -#@gui : sep = separator(), Preview Type = choice{"Full (Allows Multi-Layers)","Forward Horizontal","Forward Vertical","Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom","Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"}, Preview Split = point(50,50,0,0,200,200,200,0,10,0) -#@gui : sep = separator(), note = note{"Note: +#@gui : sep = separator() +#@gui : Preview Type = choice{"Full (Allows Multi-Layers)","Forward Horizontal","Forward Vertical", +#@gui : "Backward Horizontal","Backward Vertical","Duplicate Top","Duplicate Left","Duplicate Bottom", +#@gui : "Duplicate Right","Duplicate Horizontal","Duplicate Vertical","Checkered","Checkered Inverse"} +#@gui : Preview Split = point(50,50,0,0,200,200,200,0,10)_0 +#@gui : sep = separator() +#@gui : note = note{"Note: #@gui : This filter can execute any set of instructions understood by the G'MIC language interpreter. -#@gui : Here, you can then test some commands before creating your own G'MIC custom commands and plug-in menu entries.\n\n +#@gui : Here, you can then test some commands before creating your own G'MIC custom commands and +#@gui : plug-in menu entries.\n\n #@gui : Please look at the documentation reference web page :"} #@gui : url = link("https://gmic.eu/reference.shtml") #@gui : note = note{" #@gui : to learn more about available G'MIC commands. #@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/03/10.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/03/10.") fx_custom_code : skip "${1=-skip ,}" m "_fx_custom_code_start : $1" if $4 _nb_in=$! - _dim_in="" sep="" repeat $! l[$>] _dim_in=$_dim_in$sep"["$>"] = "{w}x{h}x{d}x{s}", in ["{_round([im,iM],0.1)}"]" sep="\n" endl done + _dim_in="" sep="" + repeat $! l[$>] + _dim_in=$_dim_in$sep"["$>"] = "{w}x{h}x{d}x{s}", in ["{_round([im,iM],0.1)}"]" sep="\n" + endl done fi if $2 ac "_fx_custom_code_start _status_out=${}",{$2-1},$3 else _fx_custom_code_start _status_out=${} - if {$3==1} c 0,255 elif {$3==2} n 0,255 fi + if $3==1 c 0,255 elif $3==2 n 0,255 fi fi if $4 _nb_out=$! _dim_out="" sep="" repeat $! l[$>] _dim_out=$_dim_out$sep"["$>"] = "{w}x{h}x{d}x{s}", in ["{_round([im,iM],0.1)}"]" sep="\n" endl done fi - uncommand _fx_custom_code_start + um _fx_custom_code_start fx_custom_code_preview : skip "${1=-skip ,}" w={w} h={h} @@ -36426,10 +45922,10 @@ gui_print_preview "Syntax error:",,{``$error_msg},20,40 endl if $4 # Display debug infos on preview - if {!$3} % 256 fi - if {$_preview_mode>=4} gui_preview fi + if !$3 % 256 fi + if $_preview_mode>=4 gui_preview fi siz0=13 siz1=17 siz2=19 siz3=22 - if {['$_status_out']==0} _status_out=(empty) fi + if ['$_status_out']==0 _status_out=(empty) fi info="Input images: "#$_nb_in"\n"\ $_dim_in"\n\n"\ "Output images: "#$_nb_out"\n"\ @@ -36441,37 +45937,61 @@ /[^-1] 2 blend[^-1] .,alpha rm. fi -#@gui Games & Demos : fx_gmic_demos, fx_gmic_demos_preview -#@gui : Selection = choice("2048","Blobs Editor","Bouncing Balls","Connect-Four","Fire Effect","Fireworks","Fish-Eye Effect","Fourier Filtering","Hanoi Tower", -#@gui : "Histogram","Hough Transform","Jawbreaker","Virtual Landscape","The Game of Life","Light Effect","Mandelbrot Explorer","3D Metaballs","Minesweeper", -#@gui : "Minimal Path","Pacman","Paint","Plasma Effect","RGB Quantization","3D Reflection","3D Rubber Object","Shadebobs","Spline Editor", +#@gui Export RGB-565 File : fx_output_565,_none_ +#@gui : Filename = _fileout("out565.rgb") +#@gui : Reverse endianness = _bool(0) +#@gui : sep = separator() +#@gui : note = note{"Note: This filter saves your selected layer as a raw RGB-565 file. Keep in mind that +#@gui : you have to remember the image dimension if you want to reload the image file afterwards!"} +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2020/05/03.") +fx_output_565 : + output_565 "$1",$2 + +#@gui Games & Demos : fx_gmic_demos, fx_gmic_demos_preview +#@gui : Selection = choice("2048","Blobs Editor","Bouncing Balls","Connect-Four","Fire Effect","Fireworks", +#@gui : "Fish-Eye Effect","Fourier Filtering","Hanoi Tower", +#@gui : "Histogram","Hough Transform","Jawbreaker","Virtual Landscape","The Game of Life","Light Effect", +#@gui : "Mandelbrot Explorer","3D Metaballs","Minesweeper", +#@gui : "Minimal Path","Pacman","Paint","Plasma Effect","RGB Quantization","3D Reflection","3D Rubber Object", +#@gui : "Shadebobs","Spline Editor", #@gui : "3D Starfield","Tetris","Tic-Tac-Toe","3D Waves","Fractal Whirl") #@gui : sep = separator() -#@gui : note = note("Note: This filter proposes a showcase of some interactive demos, all written as G'MIC scripts. -#@gui : ") -#@gui : note = note{"On most demos, you can use the keyboard shortcut CTRL+D to double the window size (and CTRL+C to go back to the original size). +#@gui : note = note("Note: This filter proposes a showcase of some interactive demos, all written +#@gui : as G'MIC scripts.") +#@gui : note = note{"On most demos, you can use the keyboard shortcut CTRL+D to double the window +#@gui : size (and CTRL+C to go back to the original size). #@gui : Also, feel free to use the mouse buttons, as they are often used to perform an action. #@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2014/10/09.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2014/10/09.") fx_gmic_demos : - coms=2048,blobs,bouncing,connect4,fire,fireworks,fisheye,fourier,hanoi,histogram,hough,jawbreaker,landscape,life,light,\ - mandelbrot,metaballs3d,minesweeper,minimal_path,pacman,paint,plasma,quantize_rgb,reflection3d,\ + coms=2048,blobs,bouncing,connect4,fire,fireworks,fisheye,fourier,hanoi,histogram,hough,jawbreaker,landscape,life,\ + light,mandelbrot,metaballs3d,minesweeper,minimal_path,pacman,paint,plasma,quantize_rgb,reflection3d,\ rubber3d,shadebobs,spline,starfield3d,tetris,tictactoe,waves,whirl com=${arg\ {1+$1},$coms} - if {$!>0} sel=0 else sel= fi - +l[$sel] m "foo : x_"$com foo rm uncommand foo endl + if $!>0 sel=0 else sel= fi + +l[$sel] m "foo : x_"$com foo rm um foo endl fx_gmic_demos_preview : rm filename=${-path_tmp}gmic_demos.cimgz - if $filename $filename + if isfile(['{/$filename}']) $filename else l[] https://gmic.eu/img/gmic_demos.cimgz o $filename endl fi k[$1,-1] rows. $1 map[0] [1] k[0] #@gui Histogram Analysis : _none_, fx_display_histogram(1) #@gui : Number of Clusters = int(256,2,1024) -#@gui : sep = separator(), Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]","Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]","YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]","YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]","Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]","HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]","CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2016/20/06.") +#@gui : sep = separator() +#@gui : Channel(s) = choice("All","RGBA [All]","RGB [All]","RGB [Red]","RGB [Green]","RGB [Blue]","RGBA [Alpha]", +#@gui : "Linear RGB [All]","Linear RGB [Red]","Linear RGB [Green]","Linear RGB [Blue]","YCbCr [Luminance]", +#@gui : "YCbCr [Blue-Red Chrominances]","YCbCr [Blue Chrominance]","YCbCr [Red Chrominance]", +#@gui : "YCbCr [Green Chrominance]","Lab [Lightness]","Lab [ab-Chrominances]","Lab [a-Chrominance]", +#@gui : "Lab [b-Chrominance]","Lch [ch-Chrominances]","Lch [c-Chrominance]","Lch [h-Chrominance]","HSV [Hue]", +#@gui : "HSV [Saturation]","HSV [Value]","HSI [Intensity]","HSL [Lightness]","CMYK [Cyan]","CMYK [Magenta]", +#@gui : "CMYK [Yellow]","CMYK [Key]","YIQ [Luma]","YIQ [Chromas]","RYB [All]","RYB [Red]","RYB [Yellow]","RYB [Blue]") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2016/20/06.") fx_display_histogram : mode=${arg\ 1+$2,all,rgba,rgb,rgb_r,rgb_g,rgb_b,rgba_a,\ lrgb,lrgb_r,lrgb_g,lrgb_b,\ @@ -36485,7 +46005,7 @@ repeat $! l[$>] _ac_precond _ac_forward[0] channels $_s display_histogram {w},{h},$1,0,255 - if {s==2" || "s==4} channels 0,2 fi + if s==2" || "s==4 channels 0,2 fi endl done #@gui Import Data : fx_import_image, gui_no_preview @@ -36495,10 +46015,27 @@ #@gui : This filter can import any image data read by the G'MIC language interpreter. #@gui : It includes exotic formats as : Pandore, CImg, Inrimage, AVI/MPEG (requires FFMPEG installed), ... #@gui : "} -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2010/29/12.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2010/29/12.") fx_import_image : skip "${1=}" rm i "$1" s z if $2 n 0,255 else c 0,255 fi +#@gui Import RGB-565 File : fx_input_565 +#@gui : Filename = filein() +#@gui : Width = text("800") +#@gui : Height = text("600") +#@gui : Reverse endianness = bool(0) +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2020/05/03.") +fx_input_565 : skip "${1=}" + l[] check "isint($2) && $2>0 && isint($3) && $3>0" + onfail error "Invalid Specified Dimensions" + endl + if ['"$1"']==0 gui_warning_preview "Choose a filename" + elif !isfile(['"$1"']) gui_warning_preview "Filename not found!" + else input_565 "$1",${2-4} mv. 0 + fi + #@gui Intarsia : fx_intarsia, fx_intarsia_preview #@gui : note = note{"Note: #@gui : Intarsia is a method of Crochet/Knitting with a number of colours, in which a separate ball of yarn @@ -36516,25 +46053,26 @@ #@gui : sep = separator() #@gui : Add Comment Area in HTML Page = _bool(1) #@gui : Preview Progress (%) = float(100,0,100) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2015/09/07.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2015/09/07.") fx_intarsia : to_rgb repeat $! nm=${gui_layer_name[$>]} +l[$>] # Constrain image for size and number of colors, and index it with colormap. - if {max(w,h)>$3} rr2d $3,$3,0 fi + if max(w,h)>$3 rr2d $3,$3,0 fi +colormap 0 - if {w>$4} rm. +colormap $4,1 fi + if w>$4 rm. +colormap $4,1 fi round[1] index[0] [1] # Output header and title. - 0 nm. $nm ({'{b}'}) f. 'if(x,i,if(i>=97&&i<=122,i-32,i))' image_basename={t} rm[-2,-1] - ({'"\n\ - \n\ -
\n\ -

"$image_basename" ("{0,w}x{0,h}")

\n\ -
\n\ - \n"'}) + 0 nm. $nm ('{b}') f. 'if(x,i,if(i>=97&&i<=122,i-32,i))' image_basename={t} rm[-2,-1] + ('"\n\ + \n\ +
\n\ +

"$image_basename" ("{0,w}x{0,h}")

\n\ +
\n\ + \n"') # Render image of colors. 0 nm. "$2" image_name={b} rm. @@ -36542,13 +46080,13 @@ repeat $nb_cols color={1,I($>)} R={arg(1,$color)} G={arg(2,$color)} B={arg(3,$color)} - ({'${dec2hex\ {$R*65536+$G*256+$B}}'}) -. {'0'} r. 6,1,1,1,0,0,1,0 +. {'0'} + ('${dec2hex\ {$R*65536+$G*256+$B}}') -. {'0'} r. 6,1,1,1,0,0,1,0 +. {'0'} f. if(i>=_'a'" && "i<=_'z',i+_'A'-_'a',i) hcolor={t} rm. 48,32,1,4 fc. $color,255 frame. 1,1,0,0,0,255 o. "$1/"${image_name}_$>.png rm. - ({'"\n"'}) + ('"\n"') done - ({'"
Colour "$>".png"\" />#"$hcolor"
Colour "$>".png"\" />#"$hcolor"
\n
"'}) + ('"
\n
"') # Render result and overview images. starting=${"arg {1+$5},\"Top left\",\"Top right\",\"Bottom left\",\"Bottom right\""} @@ -36568,37 +46106,39 @@ o. "$1/"${image_name}_B.png rm[-2,-1] - ({'"
\n"'}) - if $7 ({'"

Additional comments:

\n"'}) fi - ({'"

Starting point: "$starting"\ -           Orientation: "$label" by "$label"

\n"'}) + ('"
"\ + "
\n"') + if $7 ('"

Additional comments:

\n"') fi + ('"

Starting point: "$starting"\ +           Orientation: "$label" by "$label"

\n"') rm[1] # Output geometry. - ({'"\n"'}) + ('"
\n"') _fx_intarsia[0] $5,$6,0 +l[0] s y repeat $! l[$>] - if {$>%2} mirror. x fi + if $>%2 mirror. x fi im={im} compress_rle 0,0 rows 6,100% - ({'"\n"'}) + if !($n%8) ('"
\n"') fi + while $i\n"') rm[0] a x dir={!$dir} endl done @@ -36606,18 +46146,18 @@ endl rm[0] - ({'"
"$label" "{1+$>}""${dir$dir}"\n"'}) + ('"
"$label" "{1+$>}""${dir$dir}"\n"') i=0 n=0 do val={0,i[$i]} i+=1 - if {$val>=0} occ=1 + if $val>=0 occ=1 else occ={-$val} val={0,i[$i]} - if {$val<0} val=0 else i+=1 fi + if $val<0 val=0 else i+=1 fi fi val+=$im - ({'"colour:"$val" "$occ'}) - if {0,$i"$val" "$occ') + if {0,$i\n"'}) fi - while {0,$i
\n
\n"'}) - a x o raw:"$1/$2",uchar + ('"\n
\n"') + a x ot "$1/$2" rm endl done fx_intarsia_preview : to_rgb repeat $! l[$>] - if {max(w,h)>$3} rr2d $3,$3,0 fi + if max(w,h)>$3 rr2d $3,$3,0 fi to_rgba _fx_intarsia $5,$6,0 100%,100%,1,1,'if(y%2,y*w+w-1-x,y*w+x)<$8*wh/100' * - if {min(w,h)<140} rr2d 140,140,1,1 fi + if min(w,h)<140 rr2d 140,140,1,1 fi expand_xy 16,0 100%,100% circle. 16,16,1%,1,1 @@ -36629,25 +46169,30 @@ endl done _fx_intarsia : - if {$3" && "$2} transpose fi - if {$1==0} # Start from top left. - elif {$1==1} # Start from top right. + if $3" && "$2 transpose fi + if $1==0 # Start from top left. + elif $1==1 # Start from top right. mirror x - elif {$1==2} # Start from bottom left. + elif $1==2 # Start from bottom left. mirror y - elif {$1==3} # Start from bottom right. + elif $1==3 # Start from bottom right. mirror xy fi - if {!$3" && "$2} transpose fi + if !$3" && "$2 transpose fi #@gui Sample Image : fx_image_sample, fx_image_sample_preview -#@gui : Input = choice("Random","Apples","Barbara","Boats","Bottles","Butterfly","Cameraman","Car","Cat","Cliff","David","Dog","Duck","Eagle","Elephant","Earth","Flower", -#@gui : "Fruits","Greece","Gummy","House","Inside","Landscape","Leaf","Lena","Leno","Lion","Mandrill","Mona Lisa","Monkey","Parrots","Pencils","Peppers","Rooster","Rose", -#@gui : "Square","Teddy","Tiger","Wall","Waterfall","Zelda") -#@gui : note = note("Choosing 0 for parameters Width or Height means Automatic.") +#@gui : Input = choice{"Random","Apples","Balloons","Barbara","Boats","Bottles","Butterfly","Cameraman","Car","Cat", +#@gui : "Chick","Cliff","Colorful","David","Dog","Duck","Eagle","Elephant","Earth","Flower","Fruits", +#@gui : "Gmicky (Deevad)","Gmicky (Mahvin)","Gmicky & Wilber","Greece","Gummy","House","Inside","Landscape","Leaf", +#@gui : "Lena","Leno","Lion","Mandrill","Mona Lisa","Monkey","Parrots","Pencils","Peppers","Portrait0","Portrait1", +#@gui : "Portrait2","Portrait3","Portrait4","Portrait5","Portrait6","Portrait7","Portrait8","Portrait9", +#@gui : "Roddy","Rooster","Rose","Square","Swan","Teddy","Tiger","Tulips","Wall","Waterfall","Zelda"} +#@gui : note = note("Choosing 0 for parameters Width or Height means Automatic. +#@gui : ") #@gui : Width = _int(0,0,1024) #@gui : Height = _int(0,0,1024) -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2017/16/01.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2017/16/01.") fx_image_sample : if $1 sp {$1-1},$2,$3 else sp ?,$2,$3 fi mv. 0 @@ -36663,11 +46208,12 @@ #@gui : Thickness = int(3,1,10) #@gui : Color = color(255,0,0) #@gui : Maze Type = choice("Dark Walls","White Walls") -#@gui : sep = separator(), note = note("Author: David Tschumperlé. Latest Update: 2011/01/09.") +#@gui : sep = separator() +#@gui : note = note("Author: David Tschumperlé.      Latest Update: 2011/01/09.") fx_solve_maze : repeat $! +norm. >=. 50% - if {!$10} negate. fi + if !$10 negate. fi *. 255 +b. $5% *.. 1e10 +[-2,-1] minimal_path. $1%,$2%,0,$3%,$4%,0 pointcloud. 0 dilate. $6 r. ..,..,1,1,0 @@ -36687,6 +46233,7 @@ ellipse $3%,$4%,3,3,0,1,${7-9} ellipse $3%,$4%,3,3,0,1,0x1,0 +#@gui _ #--------------------------------- # @@ -36709,7 +46256,8 @@ #@cli : $ image.jpg fx_dreamsmooth 3,1,1,0.8,0,0.8,1,24,0 _label="Dream~smoothing" #@cli : $ image.jpg fx_feltpen 300,50,1,0.1,20,5,0 _label="Felt~pen" #@cli : $ image.jpg gtutor_fpaint 0.5,0.5,0,0,45,0.5,0.5,0.5,0 _label="Finger~paint" -#@cli : $ image.jpg fx_graphic_novelfxl 0,2,6,5,20,0,0.62,14,0,1,0.5,0.78,1.92,0,0,0,1,1,1,0.5,0.8,1.28 _label="Novel~FX" +#@cli : $ image.jpg fx_graphic_novelfxl 0,2,6,5,20,0,0.62,14,0,1,0.5,0.78,1.92,0,0,0,1,1,1,0.5,0.8,1.28 \ +# _label="Novel~FX" #@cli : $ image.jpg fx_illustration_look 100,0,0,0,0 _label="Illustration~look" #@cli : $ image.jpg fx_lylejk_painting 10,2,4,10,0 _label="Lylejk~painting" #@cli : $ image.jpg fx_painting 5,2.5,1.5,50,1,0 _label="Painting" @@ -36731,16 +46279,20 @@ #@cli : $ image.jpg fx_color_abstraction 1,10,0.2,0 _label="Color~abstraction" #@cli : $ image.jpg fx_boost_chroma 90,0,0 _label="Boost~chromaticity" #@cli : $ image.jpg fx_retrofade 20,6,40,0 _label="Retro~fade" -#@cli : $ image.jpg fx_tk_vintage 2,0.85,0.7,80,200,5,147,26,161,0.3,235,220,176,0.4,190,181,108,0.2,0,0,100,0,0.3,25,0,0 _label="Vintage~style" +#@cli : $ image.jpg fx_tk_vintage 2,0.85,0.7,80,200,5,147,26,161,0.3,235,220,176,0.4,190,181,108,0.2,\ +# 0,0,100,0,0.3,25,0,0 _label="Vintage~style" #@cli gallery_deformations #@cli : This entry defines some examples of deformation filters for the G'MIC gallery page. #@cli : $ image.jpg animate "flower","30,10,0,0","30,10,0,360",10 rm. _fps=6 _label="flower" -#@cli : $ image.jpg fx_conformal_maps 8,1,0,"((1.1 + i*z/6)/(1.04 - i*z/6))^6.2",0,0,0,0,0,3,0,0,"1024","1024" _label="Conformal~maps" -#@cli : $ image.jpg souphead_droste10 40,100,1,1,1,0,0,0,0,0,1,10,1,0,90,0,0,0,0,1,0,1,1,0,0,0,0,0,1,0,0 _label="Continuous~droste" +#@cli : $ image.jpg fx_conformal_maps 8,1,0,"((1.1 + i*z/6)/(1.04 - i*z/6))^6.2",0,0,0,0,0,3,0,0,"1024","1024" \ +# _label="Conformal~maps" +#@cli : $ image.jpg souphead_droste10 40,100,1,1,1,0,0,0,0,0,1,10,1,0,90,0,0,0,0,1,0,1,1,0,0,0,0,0,1,0,0 \ +# _label="Continuous~droste" #@cli : $ image.jpg fx_crease 30,10,3 _label="Crease" #@cli : $ image.jpg fx_distort_lens 0.29,0,0.23,50,50,0,0 _label="Distort~lens" -#@cli : $ image.jpg fx_drop_water 0,20,2,80,0,3,35,10,1,0.5,0.25,0.5,0.75,0.05,0.15,1 gui_merge_layers _label="Drop~water" +#@cli : $ image.jpg fx_drop_water 0,20,2,80,0,3,35,10,1,0.5,0.25,0.5,0.75,0.05,0.15,1 gui_merge_layers \ +# _label="Drop~water" #@cli : $ image.jpg fx_reflect 50,1,110,160,190,64,0,1.5,0,-3.3,7,1.5 _label="Reflection" #@cli : $ image.jpg fx_square_circle 0,1,0,0,0,0,0,0 _label="Square~to~circle" #@cli : $ image.jpg fx_textured_glass 40,40,1,1,0,2,0,0 _label="Textured~glass" @@ -36767,47 +46319,89 @@ #@cli : $ 400,400,1,3 fx_satin 20,1,0,0,0,0,255,255,255,255,255,0,0,0,-50,0,0 _label="Satin" #@cli : $ 400,400,1,3 fx_seamless_turbulence 15,20,0,1,3,1 _label="Seamless~turbulence" #@cli : $ image.jpg fx_shockwaves 10,10,20,0,0 _label="Shock~waves" -#@cli : $ 400,400,1,3 fx_equation_parametric "sin(t)*(exp(cos(t))-2*cos(4*t)-sin(t/12)^5)","cos(t)*(exp(cos(t))-2*cos(4*t)-sin(t/12)^5)",0,100,4096,1,0,64,0,0,128,0,0,1,1,1 _label="Equation~plot~[parametric]" +#@cli : $ 400,400,1,3 fx_equation_parametric "sin(t)*(exp(cos(t))-2*cos(4*t)-sin(t/12)^5)",\ +# "cos(t)*(exp(cos(t))-2*cos(4*t)-sin(t/12)^5)",0,100,4096,1,0,64,0,0,128,0,0,1,1,1 _label="Equation~plot~[parametric]" #@cli : $ 400,400,1,3 KittyRings 30,8,0,1,113,0,113,0,255,0 _label="Kitaoka~spin~illusion" #@cli : $ 400,400,1,3 fx_neon_lightning 50,50,0,50,50,100,50,0.7,3,130,80,50,0.25,0 _label="Neon~lighting" #@cli : $ image.jpg fx_lava 8,5,3,0,0 _label="Lava" -#@cli : $ sample monkey,lion,monkey 100%,100% plasma. equalize. 256 transition[0,1,2] [3],10 rm. _fps=10 _label="transition" +#@cli : $ sample monkey,lion,monkey 100%,100% plasma. equalize. 256 transition[0,1,2] [3],10 rm. _fps=10 \ +# _label="transition" #@cli : $ image.jpg fx_shapeism 2,7,0.38,0,1,5,32,8,3,1,5,0.5,1,0,0,0,255 _label="Shapeism" -#@cli gallery_3drendering +#@cli gallery_3dmeshes #@cli : This entry defines some examples of 3D rendering filters for the G'MIC gallery page. #@cli : $ sample leno,lion,leno resize 400,400 transition3d 20,5,5 rm. _fps=10 _label="transition3d" -#@cli : $ 256,192 fx_text_pointcloud3d 64,"G'MIC","Rocks!",1,200,220,255,255,255,255,255,2,2,1,19 _fps=10 _label="3D~text~pointcloud" +#@cli : $ 256,192 fx_text_pointcloud3d 64,"G'MIC","Rocks!",1,200,220,255,255,255,255,255,2,2,1,19 _fps=10 \ +# _label="3D~text~pointcloud" #@cli gallery_stylization #@cli : This entry defines some examples of image stylization for the G'MIC gallery page. -#@cli : $ sample car _fx_stylize starrynight _output_mode=1 +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,2,5,0,0.7,1,0,1,0,5,5,7,1,30,1000,2,1.85,0 _label="from~Van~Gogh:~Starry~Night" -#@cli : $ sample car _fx_stylize graytree _output_mode=1 +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,2,5,0,0.7,1,0,1,0,5,5,7,1,30,1000,2,1.85,0 _label="from~Mondrian:~Gray~Tree" -#@cli : $ sample car _fx_stylize yellowredblue _output_mode=1 +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,2,5,0,0.7,1,0,1,0,5,5,7,1,30,1000,2,1.85,0 _label="from~Kandinsky:~Yellow-Red-Blue" -#@cli : $ sample car _fx_stylize littlebayatlaciotat _output_mode=1 +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,2,5,0,0.7,1,0,1,0,5,5,7,1,30,1000,2,1.85,0 _label="from~Braque:~Little~Bay~at~La~Ciotat" -#@cli : $ sample car _fx_stylize leviaducalestaque _output_mode=1 +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,2,5,0,0.7,1,0,1,0,5,5,7,1,30,1000,2,1.85,0 _label="from~Braque:~Le~Viaduc~a~l'Estaque" -#@cli : $ sample car _fx_stylize greatwave _output_mode=1 +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,2,5,0,0.7,1,0,1,0,5,5,7,1,30,1000,2,1.85,0 _label="from~Hokusai:~The~Great~Wave" -#@cli : $ sample elephant input ../img/hatching.png _output_mode=1 +fx_stylize 1,4,0,0,1,2,3,0.5,0.1,2,5,0,0.7,0,0,1,0,5,5,7,1,30,10,2,1.85,0 _label="from~Hatch Drawing" -#@cli : $ sample cat input ../img/hatching.png _output_mode=1 +fx_stylize 1,4,0,0,1,2,3,0.5,0.1,2,5,0,0.7,0,0,1,0,5,5,7,1,30,10,2,1.85,0 _label="from~Hatch Drawing" -#@cli : $ sample bottles _fx_stylize starrynight _output_mode=1 +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,1,5,0,0.7,1,0,1,0,5,5,7,1,30,1000,2,1.85,0 _label="from~Van~Gogh:~Starry~Night" -#@cli : $ sample cat _fx_stylize summertime9a _output_mode=1 +fx_stylize 1,6,0,0,2,0,1,0.5,0.1,2,5,0,0.7,0,2,1,0,5,5,7,1,130,1000,2,1.85,0 _label="from~Pollock:~Summertime~No~9A" -#@cli : $ sample cat _fx_stylize greatwave _output_mode=1 +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,2,5,0,0.7,1,0,1,0,5,5,7,1,30,1000,2,1.85,0 _label="from~Hokusai:~The~Great~Wave" -#@cli : $ sample dog _fx_stylize convergence _output_mode=1 +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,2,5,0,0.7,1,0,1,0,5,5,7,1,30,1000,2,1.85,0 _label="from~Pollock:~Convergence" -#@cli : $ sample dog _fx_stylize irises _output_mode=1 +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,1,5,0,0.7,1,0,1,0,5,5,7,1,30,1000,2,1.85,0 _label="from~Van~Gogh:~Irises" -#@cli : $ sample mandrill _fx_stylize themandola _output_mode=1 +fx_stylize 1,5,0,0,0,3,1,0.5,0.1,2,5,0,0.7,1,0,1,0,5,5,7,1,30,1000,2,1.85,0 _label="from~Braque:~The~Mandola" -#@cli : $ sample square _fx_stylize orientalpleasuregardenanagoria _output_mode=1 +fx_stylize 1,6,0,0,0.52,0.5,3,0.14,0.1,2,5,0,0.7,3.39,0,1,0,5,5,7,5,30,100,2,1.85,0 _label="from~Klee:~Oriental~Pleasure~Garden~Anagoria" -#@cli : $ sample monalisa _fx_stylize squareswithconcentriccircles _output_mode=1 +fx_stylize 1,4,0,0,0.15,3,2,0.5,0.1,2,5,0,0.7,1,0,1,0,5,5,7,1,30,1000,2,1.85,0 _label="from~Kandisnky:~Squares~with~Concentric~Circles" -#@cli : $ sample monalisa _fx_stylize inthestyleofkairouan _output_mode=1 +fx_stylize 1,4,2,0,0.15,3,2,0.5,0.1,2,5,0,0.7,1,0,1,0,5,5,7,1,30,1000,2,1.85,0 _label="from~Klee:~In~the~Style~of~Kairouan" -#@cli : $ sample square _fx_stylize polyphony2 _output_mode=1 +fx_stylize 1,6,0,0,0.15,3,2,0.5,0.1,2,5,0,0.7,1,0,1,0,5,5,7,1,30,1000,2,1.85,0 _label="from~Klee:~Polyphony~2" -#@cli : $ sample square _fx_stylize wheatstacksendofsummer _output_mode=1 +fx_stylize 1,6,0,0,0.15,3,2,0.5,0.1,2,5,0,0.7,1,0,1,0,5,5,7,1,30,1000,2,1.85,0 _label="from~Monet:~Wheatstacks~-~End~of~Summer" -#@cli : $ sample square _fx_stylize portraitdemetzinger _output_mode=1 +fx_stylize 1,5,0,0,0.1,2,3,0.5,0.1,2,5,0,0.7,1,0,1,0,5,5,7,1,30,1000,2,1.85,0 _label="from~Delaunay:~Portrait~de~Metzinger" -#@cli : $ sample monalisa input ../img/mandelbrot.jpg _output_mode=1 +fx_stylize 1,3,3,0,0.15,4,3,0.5,0.1,0,5,0,0.7,1,0,1,0,5,5,7,1,30,1000,2,1.85,0 _label="from~Mandelbrot Fractal~Set" -#@cli : $ sample bottles _fx_stylize redtree _output_mode=1 +fx_stylize 1,5,0,0,2.12,2,3,0.5,0.1,2,5,0,0.7,1,0,1,0,5,5,7,1,30,1000,2,1.85,0 _label="from~Mondrian:~Evening;~Red~Tree" -#@cli : $ sample bottles _fx_stylize redwaistcoat _output_mode=1 +fx_stylize 1,4,0,0,0.67,3.17,3,0.5,0.06,2,1,0,0.7,5,0,2,0,5,5,7,1,30,1090,2.05,1.85,0 _label="from~Klee:~Red~Waistcoat" -#@cli : $ sample bottles _fx_stylize reservoirhortadeebro _output_mode=1 +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,2,5,0,0.7,1,0,1,0,5,5,7,1,30,1000,2,1.85,0 _label="from~Picasso:~The~Reservoir" -#@cli : $ sample bottles _fx_stylize almondblossom _output_mode=1 +fx_stylize 1,6,0,0,0,3,3,0.5,0.1,2,5,0,0.7,5,0,2,0,5,5,7,1,30,1000,2,1.85,0 _label="from~Van~Gogh:~Almond~Blossom" -#@cli : $ sample bottles _fx_stylize landscapenearantwerp _output_mode=1 +fx_stylize 1,6,0,0,2.17,3.65,3,0.5,0.1,2,5,0,0.7,1,0,1,0,5,5,7,1,30,1000,2,1.85,0 _label="from~Braque:~Landscape~near~Antwerp" -#@cli : $ sample bottles _fx_stylize wheatfieldwithcrows _output_mode=1 +fx_stylize 1,6,0,0,3.86,2,3,0.5,0.1,1,5,0,0.7,3.35,1,1,0,5,5,7,1,30,1000,5,1.85,0 _label="from~Van~Gogh:~Wheat~Field~with~Crows" +#@cli : $ sample car _fx_stylize starrynight _output_mode=1 \ +# +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,3,3,0,0.7,1,0,1,0,5,5,7,1,30,10,2,1.85,0 _label="from~Van~Gogh:~Starry~Night" +#@cli : $ sample car _fx_stylize graytree _output_mode=1 \ +# +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,3,3,0,0.7,1,0,1,0,5,5,7,1,30,20,2,1.85,0 _label="from~Mondrian:~Gray~Tree" +#@cli : $ sample car _fx_stylize yellowredblue _output_mode=1 \ +# +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,3,3,0,0.7,1,0,1,0,5,5,7,1,30,10,2,1.85,0 \ +# _label="from~Kandinsky:~Yellow-Red-Blue" +#@cli : $ sample car _fx_stylize littlebayatlaciotat _output_mode=1 \ +# +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,3,3,0,0.7,1,0,1,0,5,5,7,1,30,2,2,1.85,0 \ +# _label="from~Braque:~Little~Bay~at~La~Ciotat" +#@cli : $ sample car _fx_stylize leviaducalestaque _output_mode=1 \ +# +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,3,3,0,0.7,1,0,1,0,5,5,7,1,30,0,2,1.85,0 \ +# _label="from~Braque:~Le~Viaduc~a~l'Estaque" +#@cli : $ sample car _fx_stylize greatwave _output_mode=1 \ +# +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,3,3,0,0.7,1,0,1,0,5,5,7,1,30,1,2,1.85,0 _label="from~Hokusai:~The~Great~Wave" +#@cli : $ sample elephant input ../img/hatching.png _output_mode=1 \ +# +fx_stylize 1,4,0,0,1,2,3,0.5,0.1,3,3,0,0.7,0,0,1,0,5,5,7,1,30,0,2,1.85,0 _label="from~Hatch~Drawing" +#@cli : $ sample cat input ../img/hatching.png _output_mode=1 \ +# +fx_stylize 1,4,0,0,1,2,3,0.5,0.1,3,3,0,0.7,0,0,1,0,5,5,7,1,30,0,2,1.85,0 _label="from~Hatch~Drawing" +#@cli : $ sample bottles _fx_stylize starrynight _output_mode=1 \ +# +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,3,3,0,0.7,1,0,1,0,5,5,7,1,30,1,2,1.85,0 _label="from~Van~Gogh:~Starry~Night" +#@cli : $ sample cat _fx_stylize summertime9a _output_mode=1 \ +# +fx_stylize 1,6,0,0,2,0,1,0.5,0.1,3,3,0,0.7,0,2,1,0,5,5,7,1,130,100,2,1.85,0 _label="from~Pollock:~Summertime~No~9A" +#@cli : $ sample cat _fx_stylize greatwave _output_mode=1 \ +# +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,3,3,0,0.7,1,0,1,0,5,5,7,1,30,1,2,1.85,0 _label="from~Hokusai:~The~Great~Wave" +#@cli : $ sample dog _fx_stylize convergence _output_mode=1 \ +# +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,3,3,0,0.7,1,0,1,0,5,5,7,1,30,50,2,1.85,0 _label="from~Pollock:~Convergence" +#@cli : $ sample dog _fx_stylize irises _output_mode=1 \ +# +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,1,5,0,0.7,1,0,1,0,5,5,7,1,30,200,2,1.85,0 _label="from~Van~Gogh:~Irises" +#@cli : $ sample mandrill _fx_stylize themandola _output_mode=1 \ +# +fx_stylize 1,5,0,0,0,3,1,0.5,0.1,3,3,0,0.7,1,0,1,0,5,5,7,1,30,10,2,1.85,0 _label="from~Braque:~The~Mandola" +#@cli : $ sample square _fx_stylize orientalpleasuregardenanagoria _output_mode=1 \ +# +fx_stylize 1,6,0,0,0.52,0.5,3,0.14,0.1,3,3,0,0.7,3.39,0,1,0,5,5,7,5,30,40,2,1.85,0 \ +# _label="from~Klee:~Oriental~Pleasure~Garden~Anagoria" +#@cli : $ sample monalisa _fx_stylize squareswithconcentriccircles _output_mode=1 \ +# +fx_stylize 1,4,0,0,0.15,3,2,0.5,0.1,3,3,0,0.7,1,0,1,0,5,5,7,1,30,10,2,1.85,0 \ +# _label="from~Kandisnky:~Squares~with~Concentric~Circles" +#@cli : $ sample monalisa _fx_stylize inthestyleofkairouan _output_mode=1 \ +# +fx_stylize 1,4,2,0,0.15,3,2,0.5,0.1,3,3,0,0.7,1,0,1,0,5,5,7,1,30,50,2,1.85,0 \ +# _label="from~Klee:~In~the~Style~of~Kairouan" +#@cli : $ sample square _fx_stylize polyphony2 _output_mode=1 \ +# +fx_stylize 1,6,0,0,0.15,3,2,0.5,0.1,3,3,0,0.7,1,0,1,0,5,5,7,1,30,10,2,1.85,0 _label="from~Klee:~Polyphony~2" +#@cli : $ sample square _fx_stylize wheatstacksendofsummer _output_mode=1 \ +# +fx_stylize 1,6,0,0,0.15,3,2,0.5,0.1,3,3,0,0.7,1,0,1,0,5,5,7,1,30,10,2,1.85,0 \ +# _label="from~Monet:~Wheatstacks~-~End~of~Summer" +#@cli : $ sample square _fx_stylize portraitdemetzinger _output_mode=1 \ +# +fx_stylize 1,5,0,0,0.1,2,3,0.5,0.1,3,3,0,0.7,1,0,1,0,5,5,7,1,30,500,2,1.85,0 \ +# _label="from~Delaunay:~Portrait~de~Metzinger" +#@cli : $ sample monalisa input ../img/mandelbrot.jpg _output_mode=1 \ +# +fx_stylize 1,3,3,0,0.15,4,3,0.5,0.1,3,3,0,0.7,1,0,1,0,5,5,7,1,30,50,2,1.85,0 _label="from~Mandelbrot~Fractal~Set" +#@cli : $ sample bottles _fx_stylize redtree _output_mode=1 \ +# +fx_stylize 1,5,0,0,2.12,2,3,0.5,0.1,3,3,0,0.7,1,0,1,0,5,5,7,1,30,5,2,1.85,0 \ +# _label="from~Mondrian:~Evening;~Red~Tree" +#@cli : $ sample bottles _fx_stylize redwaistcoat _output_mode=1 \ +# +fx_stylize 1,4,0,0,0.67,3.17,3,0.5,0.06,3,3,0,0.7,5,0,2,0,5,5,7,1,30,0,2.05,1.85,0 \ +# _label="from~Klee:~Red~Waistcoat" +#@cli : $ sample bottles _fx_stylize reservoirhortadeebro _output_mode=1 \ +# +fx_stylize 1,6,0,0,0.5,2,3,0.5,0.1,3,3,0,0.7,1,0,1,0,5,5,7,1,30,10,2,1.85,0 _label="from~Picasso:~The~Reservoir" +#@cli : $ sample bottles _fx_stylize almondblossom _output_mode=1 \ +# +fx_stylize 1,6,0,0,0,3,3,0.5,0.1,3,3,0,0.7,5,0,2,0,5,5,7,1,30,10,2,1.85,0 _label="from~Van~Gogh:~Almond~Blossom" +#@cli : $ sample bottles _fx_stylize landscapenearantwerp _output_mode=1 \ +# +fx_stylize 1,6,0,0,2.17,3.65,3,0.5,0.1,3,3,0,0.7,1,0,1,0,5,5,7,1,30,10,2,1.85,0 \ +# _label="from~Braque:~Landscape~near~Antwerp" +#@cli : $ sample bottles _fx_stylize wheatfieldwithcrows _output_mode=1 \ +# +fx_stylize 1,6,0,0,3.86,2,3,0.5,0.1,3,3,0,0.7,3.35,1,1,0,5,5,7,1,30,10,5,1.85,0 \ +# _label="from~Van~Gogh:~Wheat~Field~with~Crows" #@cli gallery_codesamples #@cli : This entry defines some examples of coding-fun filters for the G'MIC gallery page. @@ -36817,6 +46411,9 @@ #@cli : $ https://gmic.eu/samples/scrolling.gmic go _fps=25 _label="Scrolling" #@cli : $ https://gmic.eu/samples/landscape.gmic go _fps=12 _label="Landscape" #@cli : $ https://gmic.eu/samples/mandelbrot.gmic go _fps=8 _label="Mandelbrot" +#@cli : $ https://gmic.eu/samples/heart.gmic go _fps=15 _label="Heart" +#@cli : $ https://gmic.eu/samples/distortion.gmic go _fps=20 _label="Distortion" +#@cli : $ https://gmic.eu/samples/rotozoom.gmic go _fps=15 _label="Rotozoom" # Local Variables: # mode: sh diff -Nru gmic-2.4.5/src/gmic_stdlib.h gmic-2.9.2/src/gmic_stdlib.h --- gmic-2.4.5/src/gmic_stdlib.h 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/src/gmic_stdlib.h 2020-09-03 11:37:06.000000000 +0000 @@ -1,6 +1,6 @@ /* # - # File : gmic_stdlib.h (v.2.4.5) + # File : gmic_stdlib.h (v.2.9.2) # ( C++ header file ) # # Description : Raw data arrays encoding the G'MIC standard library @@ -9,7 +9,7 @@ # 'do_gmic_stdlib.h:', from the G'MIC source file 'gmic_stdlib.gmic'. # ( https://gmic.eu ) # - # Copyright : David Tschumperle + # Copyright : David Tschumperlé # ( https://tschumperle.users.greyc.fr/ ) # # Licenses : This file is 'dual-licensed', you have to choose one @@ -17,17 +17,17 @@ # # CeCILL-C # The CeCILL-C license is close to the GNU LGPL. - # ( http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html ) + # ( http://cecill.info/licences/Licence_CeCILL-C_V1-en.html ) # # or CeCILL v2.1 # The CeCILL license is compatible with the GNU GPL. - # ( http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html ) + # ( http://cecill.info/licences/Licence_CeCILL_V2.1-en.html ) # # This software is governed either by the CeCILL or the CeCILL-C license # under French law and abiding by the rules of distribution of free software. # You can use, modify and or redistribute the software under the terms of # the CeCILL or CeCILL-C licenses as circulated by CEA, CNRS and INRIA - # at the following URL: "http://www.cecill.info". + # at the following URL: "http://cecill.info". # # As a counterpart to the access to the source code and rights to copy, # modify and redistribute granted by the license, users are provided only @@ -51,26601 +51,32979 @@ # */ -/* Define image 'gmic_stdlib' of size 1x425490x1x1 and type 'const unsigned char' */ +/* Define image 'gmic_stdlib' of size 1x527548x1x1 and type 'const unsigned char' */ const unsigned char data_gmic_stdlib[] = { - 49, 32, 99, 104, 97, 114, 32, 108, 105, 116, 116, 108, 101, 95, 101, 110, - 100, 105, 97, 110, 10, 49, 32, 49, 53, 51, 48, 53, 49, 56, 32, 49, - 32, 49, 32, 35, 52, 50, 53, 52, 52, 55, 10, 120, 156, 212, 189, 237, - 122, 219, 70, 146, 40, 252, 223, 87, 129, 48, 202, 136, 146, 64, 138, 148, - 108, 199, 150, 67, 239, 42, 118, 146, 241, 57, 177, 147, 19, 123, 102, 146, - 149, 28, 46, 8, 130, 36, 34, 16, 224, 0, 160, 36, 90, 209, 222, 206, - 185, 143, 115, 101, 111, 125, 245, 23, 208, 148, 229, 76, 118, 159, 231, 205, - 140, 69, 178, 209, 232, 174, 174, 174, 174, 174, 175, 174, 254, 252, 223, 227, - 44, 13, 78, 78, 130, 239, 178, 98, 18, 101, 193, 15, 171, 58, 45, 242, - 234, 1, 148, 142, 243, 34, 42, 231, 193, 201, 131, 117, 149, 140, 47, 235, - 225, 96, 16, 204, 71, 59, 227, 249, 50, 141, 199, 243, 32, 86, 95, 227, - 32, 87, 95, 243, 160, 84, 95, 203, 224, 50, 41, 43, 104, 234, 193, 101, - 112, 16, 36, 103, 239, 131, 206, 121, 126, 134, 143, 222, 7, 111, 138, 32, - 46, 150, 203, 40, 159, 86, 97, 80, 112, 135, 65, 81, 6, 211, 168, 142, - 130, 85, 89, 92, 166, 211, 100, 26, 116, 235, 205, 42, 9, 58, 59, 55, - 241, 109, 103, 23, 95, 12, 22, 73, 182, 218, 237, 236, 228, 157, 160, 46, - 130, 121, 82, 83, 193, 94, 191, 19, 92, 6, 189, 7, 233, 44, 184, 185, - 217, 15, 215, 183, 207, 7, 183, 166, 79, 233, 145, 91, 249, 105, 157, 231, - 105, 62, 15, 210, 60, 152, 38, 203, 34, 88, 22, 211, 164, 15, 237, 225, - 251, 193, 42, 42, 163, 44, 75, 178, 96, 16, 118, 232, 105, 216, 225, 38, - 58, 15, 146, 172, 74, 236, 97, 112, 135, 179, 20, 254, 159, 37, 227, 245, - 10, 224, 78, 70, 59, 55, 227, 85, 84, 47, 198, 101, 124, 203, 37, 59, - 99, 193, 64, 31, 97, 120, 144, 39, 201, 84, 213, 189, 233, 252, 18, 140, - 112, 184, 73, 119, 176, 247, 44, 120, 173, 126, 12, 225, 199, 75, 245, 227, - 8, 126, 224, 151, 113, 188, 46, 203, 36, 175, 161, 252, 151, 253, 227, 199, - 143, 0, 142, 215, 251, 199, 67, 248, 120, 249, 236, 129, 105, 39, 236, 236, - 88, 224, 116, 156, 102, 219, 207, 76, 47, 237, 103, 212, 41, 150, 121, 123, - 116, 64, 234, 153, 202, 207, 71, 95, 118, 110, 113, 22, 118, 172, 145, 182, - 38, 226, 111, 84, 172, 167, 191, 223, 151, 217, 203, 160, 78, 243, 149, 243, - 210, 255, 210, 9, 78, 231, 252, 182, 243, 118, 29, 199, 208, 85, 50, 253, - 76, 230, 240, 65, 145, 207, 162, 52, 187, 103, 11, 229, 109, 231, 91, 168, - 109, 189, 158, 228, 211, 12, 167, 21, 105, 191, 170, 163, 178, 6, 218, 255, - 156, 214, 199, 52, 153, 172, 97, 37, 4, 221, 131, 61, 41, 57, 9, 78, - 227, 58, 189, 196, 86, 249, 33, 17, 147, 126, 248, 143, 69, 146, 7, 145, - 212, 152, 134, 65, 189, 72, 130, 239, 118, 95, 191, 122, 1, 196, 87, 39, - 229, 170, 76, 224, 111, 48, 73, 0, 162, 164, 194, 165, 178, 193, 63, 147, - 162, 74, 2, 0, 48, 40, 214, 245, 106, 93, 87, 65, 52, 157, 166, 184, - 60, 96, 97, 102, 197, 92, 183, 14, 239, 84, 209, 28, 94, 140, 38, 80, - 51, 72, 161, 38, 53, 139, 245, 0, 112, 128, 169, 200, 169, 75, 248, 145, - 79, 163, 82, 53, 24, 116, 171, 122, 10, 95, 247, 12, 160, 239, 22, 105, - 37, 107, 48, 128, 111, 176, 212, 103, 235, 44, 152, 225, 106, 76, 46, 147, - 172, 88, 1, 13, 227, 218, 132, 21, 87, 38, 171, 2, 112, 178, 42, 170, - 42, 157, 0, 117, 192, 168, 225, 209, 140, 58, 178, 70, 165, 218, 94, 64, - 235, 201, 63, 251, 248, 230, 46, 173, 220, 254, 3, 40, 122, 128, 95, 131, - 157, 125, 85, 9, 127, 157, 168, 137, 65, 12, 231, 69, 0, 92, 199, 160, - 249, 101, 90, 173, 178, 104, 195, 53, 187, 12, 41, 44, 212, 13, 193, 88, - 173, 146, 56, 157, 165, 192, 45, 84, 11, 69, 158, 109, 246, 8, 135, 201, - 117, 90, 155, 113, 118, 53, 40, 187, 48, 122, 233, 182, 186, 72, 1, 150, - 155, 225, 168, 211, 185, 13, 119, 110, 142, 70, 67, 162, 224, 155, 207, 118, - 62, 187, 133, 225, 214, 235, 50, 15, 128, 30, 54, 65, 20, 108, 30, 28, - 140, 25, 244, 97, 184, 115, 20, 92, 156, 13, 222, 83, 213, 28, 128, 237, - 238, 220, 220, 238, 221, 6, 244, 28, 202, 161, 197, 219, 112, 128, 47, 150, - 203, 7, 99, 79, 87, 64, 160, 189, 97, 160, 185, 42, 119, 73, 13, 117, - 118, 134, 29, 108, 41, 173, 198, 201, 117, 180, 92, 101, 201, 104, 16, 140, - 185, 141, 168, 138, 211, 52, 208, 180, 77, 235, 38, 40, 151, 193, 26, 191, - 27, 96, 187, 55, 187, 216, 202, 238, 45, 96, 97, 93, 23, 113, 89, 172, - 250, 193, 205, 110, 111, 151, 135, 118, 243, 239, 208, 227, 23, 183, 163, 209, - 120, 247, 253, 110, 39, 248, 203, 95, 130, 78, 250, 25, 252, 56, 219, 189, - 13, 178, 126, 80, 5, 189, 240, 134, 126, 224, 8, 3, 92, 17, 216, 168, - 96, 119, 116, 83, 3, 94, 150, 253, 7, 23, 213, 96, 212, 25, 116, 130, - 139, 10, 6, 132, 53, 59, 180, 242, 143, 20, 104, 12, 50, 252, 137, 166, - 73, 57, 38, 200, 225, 1, 98, 36, 24, 134, 55, 139, 131, 225, 109, 56, - 132, 255, 13, 232, 127, 195, 7, 85, 112, 0, 189, 118, 120, 174, 58, 59, - 210, 91, 39, 56, 129, 97, 4, 91, 30, 222, 245, 12, 88, 180, 12, 119, - 231, 179, 17, 78, 42, 178, 151, 101, 208, 153, 21, 69, 112, 98, 234, 61, - 0, 138, 78, 162, 58, 24, 62, 14, 214, 185, 34, 32, 245, 48, 152, 22, - 121, 242, 0, 223, 48, 207, 224, 151, 240, 152, 0, 208, 12, 211, 140, 88, - 102, 148, 117, 130, 238, 52, 157, 6, 155, 98, 13, 171, 51, 202, 3, 132, - 142, 1, 120, 62, 4, 56, 207, 134, 239, 161, 218, 241, 83, 64, 43, 124, - 91, 166, 21, 80, 110, 150, 193, 102, 68, 40, 157, 165, 128, 85, 102, 63, - 134, 166, 172, 74, 64, 18, 246, 43, 205, 190, 96, 194, 173, 199, 157, 221, - 224, 223, 246, 58, 136, 236, 246, 206, 251, 66, 6, 178, 107, 112, 181, 27, - 44, 162, 42, 128, 85, 55, 77, 170, 184, 76, 105, 125, 185, 237, 245, 131, - 119, 192, 158, 120, 11, 238, 45, 118, 105, 225, 205, 89, 90, 192, 89, 238, - 159, 231, 106, 75, 116, 169, 241, 1, 173, 0, 36, 35, 88, 62, 132, 166, - 225, 224, 65, 85, 23, 171, 89, 22, 205, 71, 131, 7, 14, 149, 63, 24, - 79, 139, 120, 189, 132, 77, 133, 229, 135, 6, 233, 12, 212, 92, 237, 124, - 22, 100, 103, 59, 207, 223, 19, 114, 23, 207, 31, 51, 9, 87, 209, 50, - 233, 158, 221, 252, 122, 251, 62, 220, 37, 98, 216, 13, 31, 237, 221, 62, - 40, 139, 171, 42, 120, 28, 34, 197, 235, 197, 16, 224, 92, 41, 242, 32, - 210, 63, 129, 31, 50, 137, 39, 52, 111, 205, 170, 118, 193, 137, 231, 57, - 53, 117, 182, 123, 51, 8, 235, 219, 221, 247, 163, 209, 217, 174, 194, 238, - 238, 251, 219, 230, 192, 166, 73, 156, 129, 168, 129, 104, 230, 209, 209, 202, - 25, 87, 11, 224, 173, 241, 186, 182, 39, 45, 128, 255, 58, 34, 79, 45, - 65, 190, 160, 47, 147, 91, 107, 9, 40, 185, 171, 19, 188, 149, 247, 105, - 118, 98, 51, 205, 234, 109, 121, 217, 116, 4, 83, 123, 49, 208, 239, 239, - 202, 62, 188, 14, 26, 53, 172, 185, 68, 49, 40, 208, 243, 55, 84, 69, - 140, 229, 33, 97, 153, 145, 58, 98, 164, 218, 117, 169, 34, 78, 120, 13, - 184, 43, 211, 40, 27, 61, 240, 79, 8, 190, 187, 179, 123, 107, 55, 186, - 101, 234, 84, 77, 151, 35, 210, 179, 5, 44, 122, 225, 109, 82, 43, 128, - 126, 215, 101, 54, 90, 212, 245, 170, 58, 57, 60, 196, 97, 247, 147, 245, - 161, 2, 231, 112, 172, 176, 218, 175, 22, 245, 50, 227, 193, 90, 29, 239, - 248, 232, 226, 99, 141, 18, 69, 72, 131, 180, 24, 136, 109, 8, 206, 205, - 132, 118, 222, 201, 11, 102, 66, 149, 20, 13, 253, 236, 112, 47, 200, 106, - 54, 46, 10, 5, 173, 68, 63, 102, 45, 5, 41, 46, 57, 220, 6, 152, - 130, 172, 255, 112, 87, 224, 145, 181, 234, 116, 60, 96, 125, 195, 13, 158, - 152, 135, 8, 196, 56, 159, 88, 203, 22, 134, 101, 175, 227, 161, 253, 248, - 0, 32, 76, 145, 223, 89, 163, 62, 251, 124, 199, 170, 241, 190, 99, 122, - 158, 35, 112, 188, 213, 146, 104, 221, 94, 56, 154, 63, 201, 194, 225, 106, - 13, 178, 68, 102, 186, 115, 115, 81, 1, 231, 253, 108, 52, 184, 189, 229, - 61, 12, 113, 164, 234, 4, 147, 50, 137, 46, 176, 30, 177, 120, 69, 63, - 122, 45, 8, 55, 67, 150, 140, 220, 236, 129, 236, 191, 39, 15, 96, 7, - 225, 125, 173, 74, 98, 18, 152, 78, 2, 231, 247, 120, 103, 24, 156, 119, - 118, 58, 157, 225, 57, 188, 166, 107, 163, 102, 49, 47, 163, 213, 66, 215, - 215, 37, 238, 27, 206, 166, 185, 51, 60, 123, 47, 37, 107, 20, 246, 224, - 23, 51, 41, 217, 91, 97, 88, 231, 193, 137, 108, 212, 15, 28, 84, 161, - 140, 210, 73, 151, 243, 195, 78, 56, 144, 38, 4, 223, 149, 110, 19, 182, - 178, 218, 211, 11, 143, 242, 59, 20, 84, 79, 128, 151, 43, 98, 152, 223, - 126, 119, 254, 240, 75, 40, 213, 72, 122, 240, 9, 170, 224, 131, 38, 30, - 58, 76, 113, 160, 147, 237, 220, 0, 157, 17, 204, 103, 178, 254, 134, 193, - 25, 108, 127, 195, 241, 48, 164, 143, 163, 176, 223, 127, 255, 62, 232, 247, - 117, 133, 55, 84, 225, 13, 87, 120, 35, 21, 80, 43, 124, 112, 158, 63, - 96, 114, 222, 101, 5, 1, 219, 197, 7, 187, 40, 217, 162, 148, 10, 210, - 108, 222, 171, 138, 117, 25, 59, 18, 171, 18, 98, 225, 173, 30, 14, 253, - 182, 19, 100, 81, 62, 95, 3, 62, 66, 160, 71, 38, 187, 222, 36, 170, - 64, 206, 4, 245, 20, 198, 176, 92, 194, 198, 40, 157, 169, 170, 176, 129, - 78, 211, 24, 197, 125, 148, 51, 177, 61, 160, 216, 116, 158, 99, 235, 34, - 51, 111, 144, 51, 195, 52, 92, 7, 233, 18, 223, 128, 198, 98, 16, 229, - 81, 39, 93, 165, 176, 221, 166, 57, 202, 244, 40, 197, 130, 216, 29, 193, - 42, 175, 250, 210, 201, 171, 58, 136, 97, 167, 159, 36, 40, 54, 82, 7, - 113, 145, 131, 198, 80, 135, 1, 224, 36, 93, 173, 51, 232, 56, 4, 154, - 206, 112, 60, 216, 196, 101, 90, 173, 163, 44, 253, 144, 72, 95, 168, 92, - 87, 9, 104, 10, 75, 32, 47, 132, 9, 105, 159, 27, 71, 65, 26, 132, - 125, 208, 127, 131, 225, 203, 195, 163, 151, 88, 112, 252, 50, 88, 174, 179, - 58, 237, 161, 136, 93, 227, 35, 106, 134, 0, 146, 215, 72, 117, 40, 147, - 89, 2, 170, 32, 32, 84, 145, 32, 109, 109, 34, 77, 76, 112, 60, 89, - 70, 216, 168, 147, 120, 145, 3, 130, 178, 160, 92, 3, 37, 6, 243, 2, - 186, 36, 125, 124, 11, 238, 213, 216, 79, 43, 156, 4, 212, 199, 8, 81, - 5, 204, 92, 200, 194, 15, 168, 5, 87, 17, 168, 161, 128, 14, 24, 110, - 90, 131, 154, 131, 122, 75, 77, 106, 93, 160, 248, 36, 168, 246, 0, 56, - 204, 100, 125, 34, 45, 138, 250, 183, 149, 111, 3, 209, 60, 112, 87, 122, - 231, 7, 194, 79, 134, 104, 175, 147, 235, 186, 227, 163, 233, 94, 112, 90, - 3, 238, 55, 65, 157, 46, 97, 50, 172, 33, 193, 28, 145, 190, 6, 56, - 15, 178, 180, 170, 17, 255, 249, 122, 57, 1, 212, 77, 131, 46, 207, 184, - 86, 108, 114, 16, 102, 166, 123, 64, 17, 215, 73, 38, 84, 199, 184, 15, - 21, 248, 128, 229, 180, 76, 160, 42, 176, 52, 108, 33, 205, 137, 176, 214, - 56, 247, 203, 100, 89, 128, 184, 214, 37, 169, 21, 232, 187, 130, 247, 247, - 244, 172, 245, 96, 214, 18, 32, 147, 18, 96, 96, 186, 16, 218, 39, 168, - 80, 18, 76, 115, 160, 226, 68, 45, 161, 1, 175, 31, 132, 16, 38, 123, - 154, 228, 5, 210, 247, 100, 67, 207, 227, 219, 14, 138, 254, 88, 163, 79, - 237, 2, 182, 138, 124, 234, 52, 172, 64, 166, 246, 253, 77, 12, 185, 9, - 86, 146, 235, 69, 90, 58, 79, 143, 222, 27, 16, 170, 2, 48, 104, 141, - 229, 77, 50, 7, 106, 187, 76, 4, 104, 160, 147, 18, 90, 0, 238, 94, - 51, 82, 162, 0, 214, 81, 90, 192, 51, 160, 147, 205, 137, 110, 179, 39, - 93, 50, 245, 86, 106, 189, 102, 145, 15, 43, 26, 235, 250, 109, 5, 146, - 188, 6, 76, 5, 87, 202, 146, 245, 110, 152, 248, 164, 142, 17, 31, 107, - 160, 185, 180, 129, 221, 135, 106, 42, 155, 163, 15, 68, 94, 227, 30, 142, - 165, 112, 82, 212, 11, 213, 61, 115, 19, 236, 164, 246, 163, 154, 122, 177, - 176, 115, 202, 148, 36, 117, 112, 177, 0, 251, 136, 50, 64, 34, 161, 43, - 106, 76, 3, 86, 86, 51, 1, 96, 11, 1, 96, 41, 195, 2, 140, 135, - 185, 104, 188, 0, 162, 143, 145, 214, 128, 159, 136, 45, 230, 44, 234, 125, - 56, 237, 253, 199, 160, 247, 116, 172, 120, 49, 1, 205, 138, 84, 130, 10, - 70, 205, 107, 56, 184, 74, 235, 5, 204, 12, 147, 127, 63, 120, 69, 208, - 97, 55, 149, 98, 113, 216, 44, 176, 32, 152, 199, 10, 135, 12, 96, 70, - 188, 174, 150, 5, 50, 152, 96, 186, 46, 13, 251, 229, 41, 104, 51, 210, - 160, 91, 37, 137, 45, 9, 227, 32, 205, 104, 80, 76, 174, 145, 129, 173, - 214, 37, 112, 231, 196, 94, 34, 214, 194, 157, 38, 51, 102, 202, 12, 212, - 44, 184, 140, 128, 160, 214, 149, 54, 37, 49, 93, 174, 39, 85, 157, 2, - 251, 64, 86, 177, 4, 62, 7, 44, 185, 90, 18, 93, 193, 138, 46, 174, - 220, 221, 64, 1, 174, 246, 130, 45, 172, 159, 153, 6, 243, 71, 128, 83, - 177, 13, 69, 63, 68, 222, 100, 56, 154, 65, 35, 100, 144, 65, 26, 87, - 141, 255, 2, 252, 17, 209, 153, 230, 21, 236, 18, 140, 206, 101, 113, 41, - 187, 1, 46, 115, 67, 224, 136, 233, 178, 4, 174, 171, 246, 138, 162, 4, - 9, 36, 84, 88, 149, 87, 84, 203, 93, 164, 158, 203, 116, 186, 38, 102, - 133, 186, 96, 89, 172, 87, 192, 100, 96, 43, 74, 202, 185, 189, 223, 0, - 2, 230, 9, 116, 3, 109, 77, 197, 140, 99, 172, 91, 82, 15, 109, 135, - 21, 175, 25, 51, 3, 111, 215, 49, 210, 136, 158, 75, 33, 140, 154, 172, - 106, 83, 180, 14, 71, 56, 39, 121, 114, 21, 196, 107, 96, 130, 75, 123, - 206, 212, 156, 119, 13, 119, 140, 144, 122, 75, 11, 241, 172, 206, 67, 215, - 0, 53, 46, 8, 189, 189, 150, 73, 143, 118, 216, 104, 6, 4, 126, 21, - 149, 211, 138, 223, 7, 157, 109, 14, 20, 175, 33, 130, 21, 146, 39, 136, - 157, 168, 220, 244, 59, 205, 221, 130, 137, 154, 136, 135, 236, 119, 52, 108, - 104, 16, 196, 134, 34, 43, 230, 155, 45, 219, 199, 171, 220, 26, 7, 224, - 36, 2, 44, 48, 150, 128, 0, 208, 192, 152, 169, 145, 15, 95, 134, 193, - 17, 252, 59, 166, 205, 250, 225, 203, 0, 39, 112, 131, 244, 81, 193, 14, - 27, 149, 64, 167, 217, 26, 241, 186, 206, 83, 32, 245, 101, 182, 209, 108, - 36, 133, 141, 57, 169, 65, 48, 64, 99, 25, 52, 85, 2, 208, 184, 227, - 194, 91, 135, 202, 8, 158, 224, 56, 145, 109, 78, 139, 101, 148, 230, 205, - 237, 131, 182, 89, 216, 227, 242, 138, 77, 247, 51, 38, 81, 134, 1, 121, - 48, 108, 59, 40, 54, 0, 107, 6, 18, 49, 44, 255, 196, 8, 15, 125, - 197, 96, 174, 210, 105, 189, 176, 54, 0, 230, 11, 154, 210, 97, 178, 178, - 245, 18, 58, 233, 86, 40, 203, 68, 89, 97, 4, 6, 120, 123, 247, 122, - 183, 23, 93, 167, 21, 54, 176, 215, 111, 182, 189, 72, 210, 249, 162, 190, - 163, 113, 210, 50, 183, 180, 188, 185, 171, 229, 105, 178, 186, 19, 234, 42, - 163, 253, 104, 75, 211, 31, 60, 77, 211, 210, 98, 62, 1, 77, 227, 132, - 39, 255, 132, 37, 134, 60, 132, 223, 26, 146, 231, 3, 249, 214, 26, 37, - 59, 68, 12, 124, 167, 245, 23, 109, 112, 214, 19, 160, 8, 89, 171, 109, - 128, 89, 140, 91, 47, 239, 194, 52, 176, 173, 28, 180, 169, 109, 80, 199, - 119, 65, 173, 218, 15, 72, 38, 180, 102, 191, 49, 138, 99, 26, 5, 46, - 7, 254, 253, 176, 49, 42, 46, 253, 233, 187, 175, 27, 245, 160, 228, 148, - 138, 120, 216, 214, 48, 13, 97, 2, 225, 33, 241, 229, 5, 108, 181, 32, - 68, 100, 233, 50, 101, 105, 180, 210, 246, 112, 28, 152, 50, 89, 211, 160, - 121, 148, 180, 210, 52, 69, 247, 131, 111, 177, 139, 28, 173, 231, 113, 18, - 218, 27, 205, 150, 121, 70, 155, 139, 194, 158, 48, 18, 168, 18, 149, 147, - 20, 68, 103, 96, 209, 212, 47, 110, 124, 154, 237, 46, 209, 104, 111, 246, - 2, 44, 140, 46, 65, 110, 141, 144, 145, 179, 12, 215, 88, 117, 214, 114, - 9, 3, 67, 217, 22, 142, 52, 81, 82, 231, 185, 26, 97, 137, 139, 8, - 6, 54, 37, 105, 19, 216, 71, 181, 2, 172, 0, 174, 205, 18, 14, 131, - 171, 5, 58, 124, 44, 129, 173, 77, 54, 36, 192, 68, 77, 181, 0, 45, - 144, 176, 73, 41, 129, 39, 66, 102, 36, 60, 203, 230, 102, 65, 181, 40, - 214, 217, 20, 49, 179, 44, 104, 39, 171, 19, 197, 11, 128, 96, 230, 48, - 97, 138, 183, 1, 79, 19, 101, 5, 199, 209, 232, 238, 178, 0, 169, 184, - 234, 7, 175, 185, 145, 166, 238, 160, 183, 229, 171, 52, 67, 95, 72, 26, - 95, 16, 222, 13, 158, 129, 62, 1, 19, 81, 208, 77, 250, 0, 116, 67, - 62, 152, 100, 235, 82, 36, 47, 248, 166, 118, 62, 114, 42, 88, 235, 65, - 225, 79, 150, 214, 245, 230, 3, 189, 3, 171, 195, 37, 73, 123, 244, 184, - 21, 25, 93, 200, 218, 34, 97, 200, 147, 245, 140, 196, 208, 66, 75, 93, - 179, 172, 136, 152, 111, 9, 35, 15, 186, 199, 71, 1, 80, 19, 96, 152, - 10, 2, 218, 174, 221, 185, 2, 177, 177, 255, 240, 155, 227, 39, 225, 1, - 127, 190, 231, 149, 138, 186, 35, 200, 20, 184, 11, 48, 0, 228, 46, 106, - 234, 159, 44, 118, 208, 90, 33, 1, 141, 32, 208, 250, 150, 234, 136, 201, - 31, 208, 255, 141, 217, 154, 72, 79, 9, 234, 232, 130, 197, 195, 60, 56, - 62, 66, 64, 15, 101, 65, 0, 162, 175, 99, 32, 76, 220, 49, 167, 197, - 26, 200, 187, 7, 90, 73, 156, 34, 221, 233, 145, 47, 162, 75, 61, 152, - 73, 2, 109, 36, 57, 46, 132, 169, 136, 122, 44, 118, 130, 184, 4, 235, - 131, 182, 83, 153, 248, 10, 168, 8, 246, 232, 132, 164, 33, 160, 96, 128, - 41, 6, 186, 9, 30, 63, 116, 32, 48, 210, 131, 145, 165, 103, 17, 208, - 149, 61, 89, 47, 100, 137, 96, 119, 173, 89, 232, 17, 210, 167, 60, 86, - 224, 204, 121, 181, 70, 77, 163, 8, 46, 146, 100, 165, 24, 3, 188, 139, - 218, 173, 25, 221, 21, 98, 35, 185, 78, 226, 117, 109, 201, 171, 219, 85, - 127, 225, 59, 178, 120, 64, 68, 58, 20, 73, 201, 76, 78, 91, 241, 69, - 21, 143, 52, 109, 123, 124, 134, 190, 200, 137, 14, 213, 224, 249, 52, 157, - 145, 174, 14, 175, 45, 216, 107, 208, 32, 181, 110, 150, 94, 104, 205, 111, - 82, 20, 153, 108, 22, 82, 130, 114, 191, 91, 2, 148, 33, 5, 40, 190, - 245, 251, 102, 91, 32, 219, 0, 74, 215, 218, 89, 184, 17, 103, 221, 134, - 60, 240, 53, 47, 117, 242, 50, 139, 247, 145, 176, 181, 38, 140, 188, 58, - 252, 193, 184, 136, 181, 220, 137, 242, 188, 146, 176, 100, 189, 190, 178, 177, - 4, 40, 5, 60, 213, 105, 82, 105, 245, 44, 3, 193, 22, 36, 242, 2, - 119, 6, 114, 149, 90, 29, 194, 82, 109, 203, 109, 117, 178, 164, 117, 24, - 249, 38, 232, 126, 82, 155, 102, 188, 62, 165, 132, 52, 96, 158, 47, 225, - 118, 21, 108, 144, 100, 63, 193, 61, 133, 186, 175, 18, 236, 64, 180, 51, - 107, 82, 129, 237, 196, 182, 246, 181, 27, 128, 218, 77, 146, 50, 191, 135, - 140, 222, 88, 181, 166, 226, 4, 69, 234, 131, 31, 179, 18, 132, 100, 218, - 122, 146, 89, 173, 52, 215, 18, 55, 17, 141, 96, 103, 211, 163, 231, 201, - 53, 25, 16, 0, 53, 150, 228, 166, 76, 119, 29, 196, 37, 42, 84, 253, - 223, 86, 115, 226, 151, 193, 113, 56, 0, 62, 31, 149, 160, 17, 7, 67, - 116, 29, 208, 190, 119, 52, 24, 124, 17, 226, 31, 37, 248, 83, 188, 1, - 124, 199, 23, 93, 195, 157, 165, 111, 193, 138, 75, 167, 150, 6, 0, 171, - 191, 64, 193, 28, 45, 39, 88, 96, 49, 87, 26, 190, 181, 148, 137, 57, - 53, 158, 35, 230, 209, 138, 36, 236, 36, 34, 99, 68, 146, 162, 114, 2, - 229, 66, 224, 226, 87, 1, 144, 112, 35, 83, 26, 151, 218, 35, 184, 18, - 232, 1, 100, 230, 34, 34, 211, 178, 129, 106, 66, 225, 132, 219, 40, 176, - 109, 34, 123, 45, 217, 208, 186, 22, 56, 176, 146, 13, 54, 8, 113, 43, - 107, 130, 43, 181, 204, 206, 207, 141, 137, 128, 89, 104, 240, 207, 53, 136, - 212, 166, 66, 135, 43, 52, 76, 132, 140, 76, 161, 14, 52, 92, 129, 40, - 143, 195, 39, 66, 66, 161, 69, 65, 95, 16, 26, 20, 160, 6, 128, 190, - 135, 38, 234, 171, 66, 192, 175, 212, 42, 68, 18, 207, 146, 243, 115, 234, - 169, 101, 205, 56, 151, 231, 244, 84, 32, 213, 188, 30, 122, 86, 96, 18, - 67, 7, 212, 5, 86, 245, 80, 89, 11, 152, 246, 129, 203, 167, 181, 103, - 213, 18, 78, 105, 55, 165, 177, 110, 91, 167, 51, 53, 27, 20, 49, 208, - 36, 144, 104, 181, 2, 110, 81, 9, 179, 140, 144, 115, 3, 1, 32, 190, - 212, 164, 134, 178, 15, 149, 40, 224, 22, 160, 5, 35, 39, 211, 156, 86, - 147, 2, 44, 67, 224, 169, 83, 89, 129, 172, 128, 179, 13, 131, 214, 84, - 62, 117, 37, 80, 34, 179, 46, 239, 94, 44, 245, 167, 64, 251, 73, 174, - 87, 41, 76, 167, 37, 41, 10, 86, 153, 142, 108, 114, 219, 181, 119, 179, - 183, 50, 151, 170, 130, 158, 171, 94, 107, 126, 122, 125, 180, 103, 82, 41, - 133, 139, 136, 105, 196, 10, 30, 113, 246, 162, 10, 237, 107, 75, 29, 184, - 133, 70, 0, 5, 26, 188, 24, 51, 229, 77, 18, 214, 154, 5, 219, 177, - 34, 84, 221, 19, 241, 97, 20, 73, 0, 43, 44, 137, 105, 104, 132, 41, - 236, 226, 234, 209, 133, 43, 94, 45, 187, 45, 75, 102, 129, 246, 21, 38, - 106, 30, 177, 189, 192, 42, 101, 245, 98, 149, 190, 106, 49, 13, 50, 164, - 147, 189, 208, 154, 43, 52, 43, 56, 27, 169, 136, 68, 122, 167, 157, 106, - 237, 250, 174, 57, 109, 41, 187, 104, 100, 171, 64, 183, 38, 170, 125, 223, - 28, 163, 245, 232, 250, 13, 61, 60, 129, 157, 133, 224, 25, 98, 181, 55, - 64, 120, 171, 52, 225, 221, 41, 3, 152, 167, 27, 67, 161, 198, 54, 47, - 28, 90, 105, 125, 170, 77, 238, 13, 177, 81, 38, 56, 14, 36, 47, 52, - 70, 91, 166, 127, 215, 202, 227, 223, 111, 85, 252, 128, 108, 56, 104, 250, - 82, 61, 220, 177, 233, 154, 58, 102, 250, 44, 164, 144, 74, 115, 246, 197, - 251, 112, 204, 90, 13, 125, 37, 93, 134, 190, 41, 21, 132, 126, 48, 226, - 93, 244, 176, 29, 136, 17, 79, 19, 165, 215, 184, 25, 12, 107, 180, 249, - 84, 139, 211, 24, 89, 101, 36, 189, 47, 52, 240, 145, 209, 138, 72, 181, - 129, 133, 3, 66, 69, 140, 126, 13, 99, 104, 109, 232, 199, 200, 181, 76, - 87, 168, 35, 135, 36, 15, 231, 214, 174, 107, 76, 203, 187, 74, 90, 23, - 203, 47, 208, 116, 112, 154, 111, 44, 206, 100, 32, 16, 134, 78, 70, 219, - 171, 50, 173, 107, 180, 127, 85, 238, 52, 35, 237, 80, 203, 202, 120, 43, - 198, 122, 146, 197, 81, 137, 18, 54, 66, 64, 119, 93, 168, 9, 216, 61, - 53, 44, 77, 78, 6, 20, 106, 216, 217, 248, 231, 78, 119, 218, 190, 96, - 77, 140, 130, 90, 239, 174, 182, 136, 35, 26, 132, 43, 228, 208, 14, 171, - 119, 179, 80, 198, 129, 187, 167, 233, 26, 56, 197, 34, 129, 63, 36, 99, - 27, 193, 36, 196, 101, 77, 12, 4, 55, 7, 90, 251, 196, 205, 5, 51, - 71, 143, 30, 135, 248, 111, 24, 30, 135, 103, 215, 225, 38, 28, 30, 61, - 145, 165, 71, 28, 215, 180, 207, 108, 0, 133, 4, 168, 127, 13, 255, 130, - 159, 190, 251, 218, 182, 54, 88, 91, 17, 105, 127, 32, 232, 16, 9, 137, - 105, 161, 20, 126, 63, 47, 81, 127, 81, 214, 128, 254, 221, 235, 233, 181, - 127, 80, 119, 172, 165, 45, 104, 240, 175, 172, 238, 229, 48, 188, 68, 7, - 233, 222, 246, 21, 67, 36, 106, 38, 188, 197, 228, 250, 193, 223, 73, 225, - 148, 9, 99, 121, 0, 20, 37, 51, 48, 40, 135, 229, 177, 72, 42, 99, - 193, 119, 102, 50, 232, 178, 13, 207, 52, 177, 167, 53, 136, 103, 82, 163, - 44, 174, 124, 143, 15, 229, 49, 153, 89, 172, 10, 150, 236, 162, 121, 221, - 175, 170, 51, 209, 250, 76, 237, 166, 24, 99, 208, 166, 17, 53, 12, 143, - 194, 227, 103, 15, 195, 71, 225, 227, 103, 95, 134, 79, 194, 167, 123, 66, - 202, 154, 42, 142, 175, 143, 17, 249, 101, 122, 109, 79, 41, 27, 91, 9, - 147, 123, 34, 172, 8, 135, 41, 37, 216, 152, 240, 59, 196, 185, 124, 234, - 155, 162, 129, 111, 102, 212, 110, 185, 92, 213, 27, 113, 96, 47, 201, 25, - 109, 9, 113, 121, 33, 154, 55, 202, 30, 160, 144, 99, 93, 181, 93, 161, - 8, 66, 91, 30, 25, 46, 96, 97, 148, 80, 98, 192, 46, 98, 208, 146, - 145, 104, 172, 205, 244, 85, 107, 233, 160, 216, 48, 162, 193, 48, 8, 28, - 184, 148, 40, 187, 59, 58, 66, 200, 88, 213, 116, 20, 241, 194, 37, 207, - 141, 174, 10, 141, 104, 11, 76, 225, 200, 86, 170, 25, 36, 51, 105, 144, - 229, 149, 229, 26, 56, 38, 138, 62, 247, 117, 57, 209, 234, 3, 250, 203, - 11, 109, 174, 240, 57, 156, 108, 255, 152, 30, 131, 101, 169, 71, 61, 33, - 187, 138, 54, 21, 8, 113, 49, 91, 46, 9, 2, 137, 120, 86, 202, 128, - 24, 53, 72, 105, 77, 197, 181, 85, 53, 20, 182, 117, 62, 5, 86, 23, - 227, 226, 181, 180, 54, 134, 126, 44, 110, 211, 87, 57, 107, 35, 104, 183, - 8, 177, 37, 21, 19, 76, 60, 63, 138, 73, 131, 20, 5, 26, 93, 96, - 170, 255, 52, 191, 44, 46, 204, 14, 7, 172, 1, 23, 165, 23, 84, 128, - 0, 212, 138, 174, 132, 236, 169, 49, 219, 146, 20, 73, 198, 151, 54, 254, - 213, 128, 8, 119, 40, 242, 155, 177, 104, 62, 61, 30, 91, 198, 228, 70, - 235, 140, 70, 24, 1, 170, 131, 200, 25, 151, 133, 177, 128, 216, 134, 8, - 20, 100, 42, 53, 117, 236, 128, 137, 166, 135, 56, 203, 147, 141, 177, 230, - 149, 38, 114, 95, 199, 233, 251, 252, 123, 234, 161, 163, 100, 180, 93, 125, - 193, 15, 184, 51, 93, 165, 130, 242, 50, 65, 39, 71, 99, 194, 25, 52, - 158, 28, 214, 80, 80, 236, 177, 157, 207, 218, 226, 163, 6, 173, 217, 31, - 71, 178, 79, 5, 123, 90, 132, 15, 136, 73, 106, 73, 85, 123, 250, 180, - 211, 78, 16, 123, 48, 18, 86, 166, 194, 191, 13, 67, 236, 169, 71, 213, - 122, 82, 35, 69, 57, 79, 247, 213, 83, 50, 154, 174, 50, 116, 242, 58, - 21, 14, 85, 5, 244, 224, 85, 206, 163, 47, 244, 187, 197, 116, 157, 21, - 123, 97, 3, 168, 191, 168, 231, 147, 180, 70, 204, 225, 156, 153, 183, 127, - 111, 62, 181, 185, 248, 175, 234, 225, 170, 184, 74, 172, 242, 175, 190, 26, - 185, 218, 8, 148, 61, 127, 222, 108, 137, 12, 22, 88, 131, 172, 21, 122, - 105, 47, 210, 89, 93, 181, 88, 187, 208, 193, 172, 40, 48, 18, 172, 40, - 14, 70, 199, 188, 208, 62, 198, 233, 250, 35, 163, 147, 239, 34, 159, 69, - 255, 120, 78, 188, 223, 108, 142, 74, 170, 182, 106, 10, 181, 136, 6, 176, - 149, 41, 90, 253, 191, 230, 185, 73, 76, 101, 102, 150, 100, 84, 160, 129, - 50, 249, 48, 27, 39, 255, 49, 158, 32, 32, 90, 178, 54, 124, 135, 104, - 100, 16, 195, 16, 255, 226, 134, 223, 167, 111, 111, 108, 254, 109, 84, 141, - 59, 170, 130, 188, 128, 31, 92, 78, 95, 223, 56, 107, 233, 138, 189, 44, - 26, 96, 77, 196, 106, 196, 35, 71, 4, 4, 101, 35, 139, 98, 22, 242, - 72, 221, 96, 65, 83, 6, 101, 86, 128, 182, 241, 105, 85, 208, 44, 3, - 96, 84, 45, 141, 255, 78, 61, 100, 75, 104, 78, 75, 225, 87, 86, 32, - 12, 77, 136, 180, 166, 12, 63, 109, 171, 141, 173, 78, 154, 16, 140, 202, - 107, 51, 82, 163, 88, 90, 190, 9, 12, 5, 234, 7, 223, 37, 57, 133, - 15, 109, 66, 195, 211, 196, 38, 127, 167, 41, 30, 77, 221, 142, 150, 166, - 141, 12, 218, 87, 164, 92, 20, 222, 16, 144, 159, 146, 24, 118, 3, 107, - 51, 96, 83, 59, 113, 116, 203, 208, 192, 59, 110, 151, 71, 84, 38, 228, - 11, 110, 248, 150, 40, 40, 88, 28, 10, 238, 146, 83, 44, 152, 26, 105, - 16, 37, 91, 0, 91, 38, 135, 210, 138, 190, 209, 234, 9, 226, 94, 188, - 178, 248, 22, 98, 130, 249, 155, 179, 101, 123, 252, 252, 168, 213, 210, 168, - 240, 23, 146, 19, 69, 37, 40, 243, 132, 207, 108, 215, 215, 129, 240, 186, - 152, 229, 141, 73, 210, 86, 30, 197, 101, 151, 39, 215, 194, 53, 68, 224, - 87, 221, 163, 121, 82, 26, 108, 168, 48, 70, 14, 131, 49, 42, 133, 39, - 88, 170, 245, 111, 250, 70, 149, 94, 51, 54, 182, 126, 73, 235, 33, 75, - 24, 37, 78, 22, 236, 163, 13, 235, 135, 248, 22, 216, 33, 18, 109, 195, - 13, 173, 67, 164, 224, 184, 86, 34, 33, 41, 186, 50, 177, 235, 9, 236, - 182, 202, 107, 232, 154, 48, 66, 88, 183, 154, 226, 86, 171, 36, 215, 58, - 179, 207, 150, 161, 36, 37, 139, 30, 64, 46, 149, 192, 83, 230, 142, 104, - 210, 173, 54, 32, 195, 94, 67, 201, 204, 112, 141, 134, 157, 2, 240, 230, - 179, 158, 72, 203, 58, 0, 235, 36, 56, 93, 173, 50, 35, 19, 209, 208, - 100, 118, 236, 160, 44, 30, 144, 82, 187, 249, 229, 230, 130, 241, 118, 52, - 64, 189, 241, 238, 190, 100, 249, 73, 227, 131, 247, 161, 4, 116, 89, 75, - 231, 140, 155, 216, 218, 203, 113, 239, 241, 167, 244, 193, 173, 25, 143, 250, - 25, 191, 29, 116, 211, 62, 7, 29, 114, 165, 240, 236, 33, 252, 123, 212, - 2, 230, 241, 123, 79, 68, 131, 5, 205, 163, 193, 23, 61, 140, 186, 255, - 56, 138, 37, 4, 109, 17, 101, 179, 54, 233, 220, 129, 211, 222, 195, 158, - 178, 125, 220, 213, 188, 29, 164, 72, 225, 51, 202, 140, 66, 225, 39, 174, - 197, 171, 221, 75, 239, 233, 201, 39, 206, 92, 3, 171, 79, 223, 179, 13, - 95, 105, 253, 117, 178, 194, 81, 30, 91, 129, 15, 237, 255, 112, 14, 250, - 94, 178, 8, 112, 74, 2, 53, 87, 214, 124, 60, 253, 200, 124, 12, 0, - 89, 39, 31, 33, 248, 246, 30, 32, 226, 194, 37, 106, 39, 28, 27, 121, - 199, 132, 28, 245, 64, 241, 133, 105, 223, 62, 43, 30, 50, 63, 130, 127, - 76, 101, 122, 68, 94, 186, 184, 19, 95, 242, 223, 61, 73, 231, 87, 88, - 143, 91, 33, 36, 207, 54, 67, 41, 186, 153, 33, 34, 216, 238, 182, 54, - 106, 9, 67, 91, 219, 182, 226, 40, 43, 91, 180, 27, 182, 196, 87, 106, - 167, 45, 113, 114, 116, 106, 154, 91, 98, 138, 72, 119, 164, 105, 86, 69, - 41, 17, 171, 105, 142, 22, 7, 22, 3, 56, 8, 143, 156, 62, 107, 150, - 229, 157, 64, 87, 59, 160, 139, 162, 39, 154, 27, 179, 213, 151, 98, 217, - 199, 189, 97, 56, 212, 209, 165, 118, 200, 233, 144, 14, 228, 29, 135, 58, - 220, 22, 160, 35, 239, 140, 227, 143, 104, 108, 239, 103, 186, 173, 62, 234, - 144, 232, 154, 86, 110, 105, 57, 174, 21, 53, 246, 51, 179, 251, 161, 96, - 68, 2, 142, 242, 151, 134, 164, 37, 69, 45, 9, 2, 219, 233, 247, 241, - 168, 6, 67, 150, 21, 197, 138, 70, 9, 234, 25, 234, 207, 24, 5, 175, - 98, 4, 8, 103, 38, 74, 146, 182, 152, 200, 232, 204, 128, 183, 120, 145, - 194, 170, 152, 90, 27, 27, 200, 212, 128, 220, 180, 38, 75, 137, 183, 49, - 77, 158, 141, 176, 73, 90, 99, 13, 13, 180, 68, 57, 173, 74, 154, 155, - 163, 19, 104, 32, 106, 121, 123, 122, 212, 2, 12, 91, 161, 198, 222, 232, - 96, 156, 35, 12, 137, 198, 80, 26, 145, 51, 22, 236, 145, 16, 129, 8, - 190, 165, 48, 130, 43, 237, 94, 85, 71, 187, 170, 208, 13, 210, 146, 166, - 251, 150, 123, 31, 127, 246, 91, 157, 247, 165, 108, 155, 16, 104, 197, 209, - 168, 183, 155, 62, 173, 198, 4, 99, 85, 61, 78, 10, 35, 71, 21, 89, - 193, 25, 92, 21, 229, 133, 216, 191, 201, 158, 109, 98, 8, 226, 166, 8, - 231, 143, 188, 209, 130, 175, 88, 76, 104, 214, 208, 146, 186, 77, 140, 161, - 117, 9, 28, 32, 77, 154, 124, 197, 14, 10, 15, 136, 211, 183, 67, 74, - 204, 180, 226, 192, 117, 148, 188, 230, 173, 58, 28, 166, 113, 78, 79, 251, - 244, 148, 113, 26, 143, 130, 223, 217, 166, 106, 209, 54, 228, 252, 136, 203, - 133, 165, 52, 189, 242, 22, 155, 21, 98, 78, 25, 16, 44, 79, 135, 71, - 94, 36, 179, 13, 41, 103, 125, 142, 225, 48, 14, 52, 60, 23, 78, 11, - 59, 46, 230, 57, 72, 245, 106, 224, 250, 85, 210, 197, 200, 84, 141, 28, - 140, 13, 143, 17, 234, 47, 61, 20, 145, 173, 216, 89, 204, 236, 128, 134, - 19, 94, 113, 52, 41, 100, 37, 5, 144, 65, 115, 203, 246, 62, 38, 240, - 175, 120, 148, 202, 192, 18, 5, 171, 108, 13, 76, 20, 13, 142, 74, 117, - 212, 42, 111, 164, 60, 230, 13, 52, 8, 30, 116, 108, 58, 168, 26, 193, - 110, 154, 247, 72, 95, 53, 254, 105, 180, 20, 144, 101, 182, 162, 176, 41, - 88, 52, 56, 31, 81, 213, 116, 158, 105, 123, 122, 117, 167, 79, 208, 27, - 175, 136, 202, 152, 101, 18, 219, 172, 152, 212, 52, 225, 138, 125, 144, 21, - 234, 117, 46, 70, 70, 71, 157, 53, 103, 153, 28, 185, 153, 199, 250, 245, - 58, 5, 158, 155, 235, 6, 37, 190, 161, 100, 107, 33, 134, 74, 246, 226, - 2, 177, 57, 91, 231, 49, 43, 77, 41, 70, 209, 40, 102, 103, 159, 148, - 66, 3, 32, 45, 210, 141, 52, 176, 182, 188, 81, 28, 161, 197, 158, 214, - 73, 154, 99, 224, 35, 54, 204, 198, 27, 0, 124, 22, 225, 194, 105, 107, - 199, 63, 44, 211, 154, 184, 46, 140, 81, 173, 102, 177, 172, 34, 121, 208, - 19, 211, 203, 196, 29, 142, 210, 224, 87, 24, 93, 93, 83, 178, 5, 19, - 112, 134, 139, 215, 184, 136, 141, 194, 197, 123, 47, 242, 78, 126, 199, 114, - 211, 184, 124, 77, 3, 160, 12, 140, 32, 129, 46, 163, 96, 56, 8, 195, - 71, 154, 189, 65, 37, 210, 108, 38, 134, 171, 232, 122, 186, 18, 133, 13, - 196, 150, 112, 195, 147, 243, 130, 195, 215, 219, 115, 163, 108, 142, 174, 215, - 218, 156, 21, 0, 12, 42, 76, 160, 182, 75, 174, 182, 216, 109, 204, 26, - 149, 158, 49, 59, 64, 232, 78, 66, 10, 69, 232, 94, 147, 245, 21, 214, - 209, 4, 205, 220, 200, 26, 74, 142, 31, 107, 204, 131, 221, 155, 153, 80, - 141, 241, 198, 116, 54, 64, 165, 80, 49, 53, 129, 219, 221, 53, 109, 207, - 231, 140, 1, 10, 67, 60, 41, 28, 134, 71, 77, 83, 151, 122, 110, 88, - 187, 53, 15, 202, 32, 103, 17, 164, 246, 75, 88, 219, 134, 141, 32, 34, - 156, 184, 230, 179, 15, 238, 20, 161, 49, 168, 61, 153, 14, 47, 195, 67, - 8, 180, 146, 133, 65, 70, 211, 41, 177, 21, 216, 161, 155, 115, 167, 180, - 105, 255, 228, 56, 206, 68, 133, 20, 30, 241, 238, 41, 123, 182, 61, 176, - 240, 169, 23, 226, 208, 124, 72, 14, 237, 167, 111, 128, 115, 53, 167, 82, - 220, 40, 228, 122, 198, 211, 22, 218, 60, 183, 206, 51, 60, 16, 66, 49, - 136, 5, 240, 172, 187, 8, 40, 144, 131, 150, 134, 5, 36, 194, 32, 96, - 204, 190, 216, 187, 45, 177, 124, 126, 115, 158, 221, 39, 230, 65, 201, 18, - 222, 156, 162, 233, 33, 58, 202, 19, 135, 205, 196, 25, 90, 44, 99, 21, - 228, 96, 71, 159, 208, 73, 154, 56, 91, 35, 206, 28, 222, 121, 244, 210, - 4, 214, 31, 178, 27, 152, 142, 170, 156, 8, 158, 49, 36, 37, 12, 250, - 191, 173, 18, 252, 152, 167, 51, 248, 187, 202, 151, 240, 183, 166, 239, 147, - 229, 10, 254, 178, 16, 164, 27, 61, 126, 25, 92, 162, 47, 52, 65, 107, - 76, 163, 189, 105, 140, 47, 47, 166, 176, 242, 250, 121, 154, 98, 115, 81, - 14, 127, 211, 188, 164, 166, 47, 218, 205, 97, 162, 164, 162, 209, 204, 146, - 1, 138, 46, 177, 133, 101, 113, 9, 127, 139, 57, 150, 204, 178, 203, 118, - 11, 100, 152, 4, 80, 56, 185, 8, 140, 81, 248, 54, 5, 83, 185, 13, - 207, 151, 31, 224, 253, 56, 93, 206, 229, 3, 127, 78, 51, 4, 26, 222, - 70, 16, 103, 248, 189, 140, 174, 16, 7, 215, 53, 14, 166, 53, 250, 98, - 242, 27, 204, 119, 163, 229, 98, 54, 83, 21, 101, 169, 80, 250, 156, 105, - 18, 97, 254, 9, 37, 102, 155, 176, 127, 231, 104, 229, 92, 153, 86, 105, - 242, 49, 146, 29, 167, 159, 141, 194, 114, 232, 168, 226, 225, 112, 108, 41, - 187, 99, 214, 198, 148, 90, 25, 63, 63, 69, 153, 249, 197, 72, 139, 200, - 248, 48, 167, 58, 207, 160, 198, 84, 177, 253, 0, 247, 106, 109, 116, 139, - 68, 176, 161, 225, 210, 81, 13, 2, 86, 120, 175, 71, 72, 213, 60, 244, - 212, 66, 22, 116, 45, 39, 153, 40, 96, 20, 5, 42, 229, 80, 183, 220, - 207, 182, 111, 152, 180, 23, 126, 25, 71, 30, 202, 78, 110, 28, 98, 106, - 71, 36, 21, 71, 229, 83, 186, 1, 192, 231, 120, 116, 155, 28, 165, 207, - 40, 96, 164, 122, 22, 144, 74, 20, 227, 183, 85, 137, 199, 22, 64, 99, - 128, 239, 132, 48, 248, 44, 0, 101, 44, 45, 220, 218, 70, 46, 145, 227, - 97, 16, 58, 222, 72, 76, 218, 246, 81, 46, 49, 122, 243, 200, 196, 238, - 220, 140, 101, 242, 185, 249, 96, 86, 211, 250, 120, 106, 120, 154, 248, 73, - 213, 73, 14, 237, 106, 51, 72, 36, 10, 80, 54, 216, 108, 99, 203, 152, - 95, 3, 123, 186, 98, 105, 38, 170, 229, 24, 138, 205, 33, 212, 124, 86, - 5, 172, 91, 210, 90, 73, 96, 156, 70, 43, 57, 235, 77, 179, 163, 99, - 251, 27, 166, 121, 173, 31, 208, 68, 0, 140, 177, 195, 48, 233, 84, 37, - 197, 96, 171, 24, 115, 158, 77, 137, 140, 111, 233, 244, 176, 174, 89, 80, - 226, 106, 4, 242, 149, 9, 9, 34, 47, 54, 173, 6, 21, 130, 72, 167, - 197, 30, 59, 241, 240, 162, 110, 71, 226, 197, 192, 37, 40, 65, 119, 60, - 110, 58, 59, 33, 162, 46, 31, 126, 43, 42, 251, 176, 74, 154, 51, 102, - 232, 168, 204, 223, 196, 69, 111, 198, 212, 211, 81, 127, 212, 90, 114, 93, - 75, 52, 147, 97, 36, 202, 214, 166, 2, 233, 113, 20, 136, 63, 59, 142, - 210, 196, 209, 163, 112, 128, 52, 84, 162, 226, 206, 106, 32, 163, 161, 113, - 36, 189, 23, 188, 85, 83, 20, 58, 145, 222, 56, 131, 135, 218, 192, 159, - 176, 242, 101, 79, 177, 71, 106, 254, 187, 197, 91, 9, 220, 31, 208, 216, - 86, 173, 39, 189, 89, 73, 238, 18, 251, 140, 141, 142, 112, 18, 82, 97, - 228, 135, 22, 203, 97, 63, 146, 17, 101, 218, 146, 140, 138, 166, 6, 124, - 133, 103, 100, 183, 26, 83, 79, 103, 33, 90, 61, 213, 119, 180, 67, 190, - 127, 175, 180, 229, 183, 73, 173, 52, 26, 83, 105, 52, 234, 13, 141, 69, - 62, 161, 19, 31, 202, 189, 97, 186, 53, 230, 84, 124, 71, 237, 148, 180, - 163, 56, 237, 98, 135, 186, 181, 1, 254, 161, 48, 79, 28, 59, 166, 83, - 192, 56, 33, 141, 41, 14, 253, 180, 2, 77, 168, 194, 97, 156, 97, 228, - 54, 200, 249, 18, 254, 141, 29, 150, 42, 230, 18, 197, 131, 216, 9, 116, - 19, 231, 191, 193, 157, 200, 4, 247, 65, 30, 110, 123, 227, 217, 170, 10, - 199, 212, 110, 56, 198, 3, 26, 99, 132, 99, 116, 3, 208, 255, 30, 12, - 153, 79, 237, 106, 47, 35, 213, 211, 82, 122, 20, 60, 236, 97, 172, 134, - 120, 252, 26, 209, 91, 29, 157, 54, 224, 228, 240, 240, 234, 234, 170, 143, - 166, 232, 56, 238, 23, 229, 252, 144, 218, 169, 250, 171, 5, 97, 107, 47, - 48, 206, 141, 129, 225, 83, 124, 190, 143, 149, 122, 122, 65, 131, 161, 225, - 20, 92, 195, 180, 129, 236, 57, 115, 231, 75, 16, 97, 33, 92, 17, 245, - 5, 42, 60, 248, 58, 179, 67, 237, 171, 65, 189, 84, 232, 213, 156, 104, - 237, 183, 169, 157, 54, 244, 179, 15, 239, 91, 4, 143, 249, 110, 244, 33, - 231, 158, 49, 132, 208, 11, 178, 177, 201, 228, 109, 33, 122, 61, 4, 75, - 142, 111, 205, 27, 137, 21, 111, 6, 225, 155, 161, 107, 130, 242, 84, 8, - 175, 7, 225, 181, 84, 211, 109, 223, 93, 125, 131, 111, 132, 155, 251, 181, - 13, 149, 63, 72, 253, 240, 195, 80, 41, 20, 247, 239, 9, 94, 142, 205, - 251, 97, 60, 212, 6, 64, 110, 224, 173, 49, 97, 41, 99, 196, 208, 80, - 72, 65, 103, 29, 96, 95, 78, 37, 248, 160, 38, 129, 92, 17, 207, 50, - 186, 78, 151, 235, 165, 57, 87, 67, 155, 134, 94, 90, 158, 37, 226, 131, - 23, 38, 250, 44, 84, 167, 131, 222, 59, 30, 123, 229, 174, 228, 69, 110, - 17, 157, 28, 243, 130, 23, 204, 33, 88, 105, 193, 110, 64, 247, 171, 100, - 10, 76, 154, 4, 235, 110, 77, 171, 234, 247, 64, 62, 214, 100, 225, 131, - 47, 234, 115, 13, 154, 3, 124, 240, 95, 252, 241, 248, 33, 255, 164, 79, - 218, 32, 225, 83, 108, 57, 183, 142, 102, 101, 81, 49, 8, 159, 74, 130, - 181, 8, 89, 78, 99, 155, 3, 203, 28, 64, 229, 142, 74, 239, 242, 58, - 218, 131, 118, 26, 36, 106, 156, 42, 211, 129, 37, 210, 162, 44, 69, 43, - 128, 68, 212, 251, 179, 120, 104, 197, 194, 255, 89, 72, 17, 208, 240, 41, - 241, 207, 33, 7, 63, 135, 0, 241, 89, 8, 194, 49, 48, 196, 247, 239, - 13, 211, 127, 53, 163, 116, 109, 214, 112, 236, 224, 62, 13, 127, 40, 97, - 169, 184, 141, 155, 147, 10, 105, 67, 132, 188, 4, 225, 8, 104, 139, 6, - 208, 34, 46, 134, 167, 31, 252, 136, 88, 178, 88, 17, 162, 11, 167, 155, - 216, 181, 139, 51, 21, 241, 212, 226, 217, 31, 65, 66, 99, 145, 220, 69, - 98, 86, 244, 50, 47, 12, 151, 133, 105, 57, 198, 203, 231, 54, 235, 203, - 59, 73, 163, 21, 6, 224, 144, 65, 24, 104, 183, 219, 71, 36, 1, 51, - 146, 63, 65, 36, 0, 160, 153, 70, 52, 133, 196, 11, 208, 43, 162, 49, - 58, 239, 209, 191, 14, 77, 158, 133, 247, 147, 25, 90, 40, 110, 55, 229, - 32, 91, 173, 227, 135, 71, 184, 125, 62, 60, 58, 194, 191, 15, 31, 54, - 196, 253, 128, 85, 54, 150, 203, 194, 128, 219, 12, 172, 54, 41, 125, 129, - 78, 240, 225, 210, 203, 39, 236, 239, 128, 9, 223, 224, 27, 78, 22, 107, - 190, 65, 25, 159, 121, 165, 56, 179, 149, 241, 9, 99, 74, 18, 20, 152, - 234, 247, 221, 213, 238, 34, 113, 180, 4, 140, 173, 105, 9, 199, 102, 90, - 194, 177, 150, 172, 108, 203, 217, 71, 151, 13, 66, 24, 142, 213, 186, 64, - 57, 103, 169, 99, 225, 199, 196, 181, 199, 236, 99, 67, 25, 127, 140, 73, - 70, 39, 233, 28, 95, 210, 179, 106, 153, 82, 173, 240, 20, 222, 149, 252, - 28, 159, 116, 133, 43, 148, 36, 163, 74, 159, 197, 85, 0, 130, 196, 189, - 40, 166, 127, 246, 210, 53, 226, 153, 238, 201, 187, 205, 104, 250, 204, 113, - 231, 236, 170, 131, 189, 64, 164, 217, 135, 43, 248, 139, 246, 25, 161, 85, - 125, 226, 213, 69, 18, 117, 218, 32, 246, 193, 8, 56, 172, 221, 216, 112, - 180, 105, 169, 184, 122, 164, 13, 36, 123, 27, 83, 77, 152, 70, 183, 110, - 98, 243, 212, 161, 216, 211, 156, 162, 88, 166, 129, 46, 215, 203, 40, 186, - 252, 163, 28, 5, 237, 85, 32, 38, 63, 31, 132, 249, 100, 140, 30, 213, - 74, 105, 20, 66, 7, 202, 159, 45, 79, 71, 3, 173, 3, 96, 226, 109, - 74, 44, 67, 33, 211, 118, 74, 132, 136, 32, 117, 250, 165, 151, 49, 67, - 4, 31, 7, 182, 229, 223, 73, 178, 0, 110, 129, 225, 249, 30, 28, 208, - 180, 89, 72, 120, 103, 200, 18, 243, 73, 164, 245, 166, 189, 95, 119, 65, - 87, 253, 98, 47, 252, 99, 138, 3, 40, 192, 225, 177, 12, 178, 139, 174, - 153, 80, 143, 53, 56, 30, 124, 161, 123, 229, 38, 247, 52, 49, 13, 7, - 198, 196, 111, 141, 206, 55, 166, 101, 30, 111, 25, 18, 167, 252, 163, 105, - 37, 237, 148, 156, 97, 57, 219, 244, 241, 141, 63, 56, 38, 232, 48, 148, - 108, 130, 117, 2, 140, 18, 168, 8, 203, 182, 242, 74, 182, 55, 198, 43, - 52, 92, 46, 232, 111, 76, 251, 93, 127, 177, 5, 110, 125, 192, 92, 39, - 110, 66, 63, 229, 167, 179, 245, 150, 28, 240, 223, 182, 253, 83, 170, 65, - 119, 48, 85, 98, 157, 146, 140, 56, 186, 117, 189, 212, 231, 24, 109, 43, - 93, 195, 68, 47, 156, 234, 123, 17, 17, 43, 74, 90, 228, 138, 134, 108, - 75, 65, 59, 191, 21, 26, 135, 190, 68, 125, 210, 89, 236, 252, 118, 2, - 237, 224, 37, 101, 20, 183, 204, 44, 45, 174, 39, 249, 17, 14, 167, 105, - 197, 137, 18, 196, 151, 211, 228, 0, 237, 133, 15, 8, 56, 11, 1, 160, - 49, 165, 45, 31, 99, 39, 70, 53, 246, 236, 163, 124, 48, 197, 114, 129, - 37, 215, 245, 137, 104, 69, 236, 31, 156, 36, 243, 148, 195, 243, 41, 10, - 81, 7, 210, 58, 231, 58, 97, 125, 157, 184, 167, 85, 89, 197, 112, 188, - 91, 38, 56, 32, 176, 77, 249, 28, 200, 67, 129, 210, 136, 185, 43, 74, - 36, 66, 1, 14, 148, 43, 2, 67, 67, 208, 217, 151, 98, 138, 181, 169, - 100, 232, 80, 76, 193, 88, 159, 132, 164, 244, 105, 215, 134, 217, 200, 61, - 229, 170, 76, 127, 38, 53, 31, 155, 1, 197, 43, 82, 173, 87, 43, 138, - 217, 9, 49, 93, 143, 232, 218, 58, 46, 20, 56, 227, 124, 93, 58, 156, - 16, 243, 142, 138, 39, 215, 0, 142, 107, 221, 74, 112, 129, 94, 24, 237, - 51, 182, 176, 162, 178, 92, 180, 93, 38, 111, 237, 188, 99, 148, 85, 241, - 30, 222, 146, 230, 105, 112, 193, 203, 142, 227, 58, 195, 141, 235, 214, 138, - 50, 81, 29, 33, 165, 37, 51, 52, 119, 78, 18, 62, 144, 161, 221, 137, - 218, 20, 88, 153, 140, 5, 26, 62, 180, 204, 90, 234, 127, 173, 142, 182, - 232, 124, 106, 236, 112, 80, 199, 37, 109, 55, 82, 146, 95, 166, 101, 65, - 209, 230, 214, 148, 9, 89, 237, 152, 140, 110, 150, 125, 120, 231, 6, 139, - 45, 248, 41, 146, 201, 25, 4, 47, 23, 206, 165, 162, 78, 117, 106, 162, - 225, 120, 175, 142, 28, 108, 228, 40, 125, 91, 237, 235, 226, 204, 1, 120, - 151, 8, 58, 200, 147, 106, 241, 109, 63, 61, 181, 71, 106, 27, 109, 131, - 58, 236, 159, 243, 110, 215, 76, 11, 234, 72, 47, 180, 28, 218, 182, 122, - 107, 41, 163, 31, 160, 61, 132, 5, 40, 4, 73, 69, 105, 249, 201, 54, - 175, 243, 12, 96, 160, 152, 29, 233, 106, 39, 3, 148, 41, 182, 114, 254, - 137, 90, 169, 77, 188, 84, 109, 65, 226, 30, 58, 216, 245, 233, 247, 143, - 194, 227, 160, 148, 187, 249, 225, 173, 61, 137, 129, 15, 163, 124, 110, 151, - 194, 239, 137, 117, 164, 218, 139, 66, 30, 104, 116, 153, 210, 1, 55, 54, - 203, 217, 121, 70, 236, 51, 224, 218, 72, 108, 78, 228, 224, 236, 3, 196, - 202, 85, 123, 223, 216, 137, 192, 138, 20, 220, 249, 76, 226, 2, 223, 89, - 135, 171, 26, 137, 160, 156, 200, 176, 190, 175, 145, 231, 109, 42, 253, 202, - 106, 215, 4, 254, 29, 78, 19, 29, 3, 40, 201, 56, 85, 224, 17, 90, - 132, 234, 160, 43, 48, 160, 203, 139, 207, 69, 237, 153, 14, 131, 86, 228, - 92, 35, 116, 206, 11, 220, 161, 103, 132, 24, 160, 131, 230, 167, 248, 2, - 164, 66, 252, 176, 210, 140, 56, 167, 119, 43, 80, 106, 22, 38, 48, 242, - 176, 169, 211, 152, 110, 126, 247, 116, 195, 244, 210, 21, 186, 226, 40, 72, - 142, 32, 229, 131, 201, 81, 176, 132, 45, 52, 149, 160, 82, 227, 20, 64, - 51, 127, 233, 237, 229, 87, 95, 47, 116, 185, 6, 10, 112, 25, 94, 107, - 225, 125, 111, 28, 175, 214, 149, 245, 174, 153, 98, 78, 174, 42, 59, 49, - 39, 114, 210, 78, 30, 40, 218, 96, 64, 242, 18, 67, 11, 243, 196, 223, - 242, 42, 157, 122, 128, 210, 249, 21, 167, 152, 208, 21, 56, 79, 201, 78, - 153, 156, 136, 114, 190, 101, 120, 99, 192, 65, 9, 130, 86, 84, 37, 210, - 38, 186, 136, 160, 176, 39, 165, 156, 175, 138, 151, 43, 93, 123, 34, 228, - 99, 85, 9, 204, 81, 133, 205, 102, 185, 156, 78, 155, 115, 22, 112, 32, - 12, 76, 63, 142, 81, 53, 28, 54, 56, 152, 132, 222, 200, 226, 242, 67, - 43, 151, 224, 168, 208, 218, 224, 184, 55, 77, 231, 24, 244, 32, 232, 173, - 249, 150, 1, 57, 222, 92, 187, 115, 86, 89, 201, 158, 252, 107, 214, 1, - 89, 75, 28, 115, 221, 175, 142, 144, 243, 64, 86, 43, 225, 253, 132, 28, - 30, 141, 76, 123, 74, 83, 99, 10, 221, 67, 9, 131, 156, 158, 40, 25, - 226, 89, 16, 149, 197, 178, 50, 199, 153, 180, 0, 80, 21, 217, 54, 74, - 224, 59, 130, 44, 106, 192, 18, 79, 180, 7, 112, 53, 212, 9, 180, 126, - 78, 62, 70, 32, 61, 10, 170, 144, 19, 147, 182, 164, 193, 210, 168, 141, - 142, 46, 98, 153, 151, 23, 0, 249, 195, 219, 30, 139, 42, 128, 218, 45, - 8, 33, 216, 48, 70, 229, 227, 208, 81, 36, 11, 201, 100, 150, 96, 205, - 187, 141, 18, 200, 177, 138, 41, 118, 128, 113, 38, 173, 5, 88, 99, 135, - 223, 178, 197, 223, 123, 143, 231, 107, 119, 56, 137, 55, 7, 163, 248, 247, - 123, 43, 140, 166, 21, 202, 195, 97, 89, 24, 30, 177, 105, 238, 69, 148, - 9, 180, 104, 198, 51, 185, 121, 40, 120, 83, 163, 216, 162, 202, 51, 194, - 155, 243, 78, 79, 5, 118, 157, 119, 110, 181, 62, 233, 25, 140, 242, 201, - 69, 245, 90, 208, 73, 216, 37, 223, 142, 236, 207, 214, 145, 32, 103, 148, - 214, 248, 154, 209, 100, 126, 39, 59, 117, 162, 164, 151, 111, 90, 42, 197, - 142, 18, 16, 105, 135, 118, 253, 20, 77, 92, 242, 130, 110, 130, 221, 70, - 197, 205, 127, 254, 39, 99, 85, 154, 238, 234, 180, 223, 250, 32, 242, 4, - 118, 34, 206, 126, 180, 231, 193, 145, 58, 213, 36, 153, 230, 168, 226, 52, - 176, 120, 80, 35, 45, 181, 153, 34, 238, 215, 3, 210, 161, 3, 209, 93, - 211, 146, 80, 2, 39, 95, 119, 247, 233, 103, 151, 159, 236, 170, 161, 79, - 146, 250, 138, 180, 4, 14, 227, 221, 62, 102, 139, 46, 172, 68, 27, 28, - 209, 131, 244, 110, 69, 166, 72, 22, 45, 53, 122, 31, 100, 225, 199, 83, - 115, 52, 131, 18, 108, 185, 247, 102, 119, 86, 20, 187, 94, 100, 169, 94, - 77, 206, 233, 225, 224, 40, 28, 14, 135, 248, 175, 169, 146, 169, 230, 56, - 86, 97, 6, 146, 204, 186, 76, 182, 206, 129, 149, 105, 72, 170, 186, 177, - 183, 157, 102, 154, 20, 109, 97, 160, 34, 159, 101, 81, 101, 47, 81, 134, - 125, 37, 13, 216, 69, 116, 194, 205, 164, 230, 39, 119, 72, 146, 173, 201, - 94, 236, 100, 36, 12, 141, 187, 221, 9, 10, 105, 198, 114, 59, 71, 120, - 40, 104, 84, 231, 237, 84, 30, 64, 60, 10, 8, 82, 32, 150, 240, 72, - 53, 47, 127, 219, 60, 167, 44, 21, 28, 227, 9, 159, 194, 221, 34, 233, - 78, 108, 129, 148, 195, 80, 0, 120, 145, 200, 49, 222, 93, 235, 246, 42, - 136, 190, 102, 249, 27, 119, 42, 218, 41, 240, 240, 172, 86, 185, 189, 219, - 204, 172, 213, 135, 188, 79, 216, 244, 188, 144, 183, 94, 32, 8, 36, 130, - 67, 128, 179, 39, 27, 181, 22, 210, 169, 76, 0, 22, 91, 37, 188, 240, - 212, 86, 243, 180, 175, 11, 91, 55, 186, 40, 53, 170, 178, 122, 216, 153, - 74, 205, 10, 243, 53, 124, 221, 130, 219, 216, 34, 16, 155, 44, 43, 152, - 100, 111, 134, 135, 19, 157, 236, 246, 119, 117, 0, 182, 30, 181, 119, 4, - 36, 239, 6, 39, 146, 129, 223, 226, 0, 234, 228, 130, 78, 87, 229, 93, - 217, 161, 87, 86, 255, 119, 115, 46, 116, 183, 221, 180, 131, 19, 55, 33, - 154, 58, 206, 107, 216, 10, 53, 68, 158, 51, 103, 223, 191, 15, 48, 152, - 23, 137, 205, 160, 138, 122, 108, 146, 118, 23, 72, 100, 14, 101, 111, 73, - 146, 195, 91, 101, 85, 21, 113, 106, 95, 211, 209, 200, 113, 20, 4, 109, - 118, 161, 114, 42, 121, 56, 175, 196, 73, 81, 246, 198, 42, 72, 16, 39, - 44, 143, 117, 217, 105, 205, 210, 227, 150, 148, 194, 204, 105, 90, 91, 235, - 205, 32, 188, 58, 88, 220, 185, 227, 84, 235, 165, 98, 22, 228, 25, 36, - 8, 217, 59, 168, 202, 173, 3, 148, 174, 148, 252, 201, 137, 136, 60, 97, - 195, 148, 50, 100, 11, 158, 221, 105, 182, 18, 137, 0, 11, 178, 114, 162, - 8, 151, 178, 179, 136, 24, 111, 181, 150, 91, 107, 208, 113, 245, 173, 42, - 17, 173, 105, 210, 61, 216, 66, 215, 86, 89, 182, 108, 75, 160, 130, 109, - 197, 167, 0, 114, 220, 31, 62, 28, 62, 122, 42, 219, 47, 39, 68, 86, - 175, 111, 127, 187, 165, 122, 155, 150, 142, 30, 63, 58, 126, 244, 228, 233, - 151, 79, 143, 59, 109, 53, 228, 212, 75, 210, 211, 132, 82, 67, 51, 92, - 70, 212, 225, 172, 218, 38, 151, 130, 206, 100, 201, 231, 132, 44, 78, 100, - 173, 70, 7, 50, 117, 197, 133, 228, 180, 212, 236, 76, 225, 91, 179, 59, - 139, 130, 91, 178, 139, 61, 223, 91, 72, 248, 78, 217, 224, 63, 207, 172, - 29, 255, 253, 127, 222, 57, 33, 49, 101, 241, 48, 114, 63, 54, 228, 51, - 115, 220, 252, 39, 135, 48, 60, 233, 62, 126, 180, 167, 154, 52, 109, 156, - 202, 127, 219, 228, 139, 253, 123, 200, 117, 152, 42, 101, 146, 146, 251, 135, - 110, 215, 180, 5, 59, 30, 105, 173, 239, 55, 184, 74, 243, 105, 113, 165, - 56, 136, 156, 42, 238, 186, 162, 133, 113, 12, 114, 100, 28, 57, 7, 169, - 19, 21, 219, 226, 209, 131, 110, 246, 27, 82, 144, 57, 228, 112, 179, 207, - 118, 162, 127, 69, 76, 226, 97, 40, 8, 189, 163, 249, 124, 192, 131, 97, - 13, 15, 11, 140, 145, 145, 174, 12, 209, 132, 2, 252, 225, 39, 45, 166, - 108, 23, 70, 182, 72, 33, 87, 178, 233, 24, 32, 144, 191, 177, 0, 194, - 223, 5, 104, 125, 167, 4, 48, 5, 137, 202, 214, 51, 199, 144, 123, 247, - 203, 69, 163, 125, 225, 154, 220, 129, 203, 66, 255, 96, 15, 87, 205, 46, - 24, 236, 235, 70, 151, 222, 87, 67, 239, 187, 97, 11, 90, 55, 79, 168, - 33, 146, 171, 219, 16, 254, 202, 230, 225, 133, 78, 153, 162, 100, 114, 183, - 162, 215, 60, 159, 39, 126, 147, 65, 226, 182, 116, 7, 34, 63, 222, 214, - 52, 241, 129, 117, 237, 182, 237, 125, 49, 244, 189, 25, 54, 129, 218, 134, - 175, 41, 225, 43, 185, 3, 95, 107, 105, 30, 239, 205, 0, 169, 82, 240, - 165, 79, 1, 65, 55, 202, 124, 161, 44, 64, 210, 53, 6, 208, 59, 45, - 238, 202, 194, 185, 116, 91, 84, 32, 254, 145, 38, 53, 144, 151, 62, 40, - 175, 221, 46, 188, 47, 134, 190, 55, 195, 38, 108, 219, 208, 183, 38, 244, - 93, 222, 129, 62, 37, 191, 107, 203, 57, 110, 220, 89, 250, 129, 247, 24, - 114, 31, 251, 121, 233, 93, 210, 186, 160, 3, 120, 91, 246, 41, 175, 43, - 153, 252, 231, 158, 137, 177, 84, 175, 47, 11, 60, 127, 206, 110, 20, 20, - 223, 128, 205, 245, 134, 196, 215, 236, 228, 106, 54, 71, 240, 14, 119, 35, - 93, 252, 242, 223, 215, 133, 82, 211, 228, 170, 103, 187, 237, 201, 186, 174, - 209, 193, 118, 3, 59, 10, 38, 206, 234, 65, 65, 31, 246, 151, 163, 17, - 101, 207, 82, 63, 31, 142, 150, 233, 116, 154, 37, 252, 251, 214, 215, 73, - 177, 189, 147, 171, 69, 226, 55, 161, 95, 40, 214, 5, 251, 192, 146, 174, - 40, 153, 218, 214, 103, 50, 239, 95, 36, 27, 58, 153, 153, 111, 194, 96, - 192, 194, 61, 166, 249, 242, 53, 167, 172, 164, 152, 138, 30, 239, 185, 237, - 14, 112, 211, 27, 238, 105, 155, 113, 234, 223, 131, 181, 2, 40, 219, 107, - 153, 196, 228, 46, 241, 245, 81, 54, 250, 184, 111, 211, 156, 217, 232, 238, - 182, 151, 127, 176, 109, 188, 167, 105, 75, 203, 119, 43, 68, 150, 17, 78, - 169, 66, 128, 110, 154, 5, 101, 68, 165, 40, 153, 56, 90, 165, 53, 222, - 41, 158, 212, 168, 122, 238, 133, 126, 253, 198, 17, 183, 34, 61, 12, 73, - 96, 175, 239, 101, 144, 117, 141, 19, 203, 196, 98, 228, 27, 53, 233, 40, - 224, 136, 19, 97, 218, 138, 162, 234, 235, 203, 170, 200, 128, 34, 167, 187, - 161, 67, 235, 200, 118, 236, 158, 92, 247, 201, 20, 93, 178, 112, 137, 103, - 30, 3, 5, 246, 40, 142, 57, 91, 87, 11, 219, 226, 71, 255, 185, 42, - 43, 166, 73, 65, 69, 105, 153, 76, 83, 58, 29, 36, 186, 56, 234, 26, - 124, 91, 65, 37, 35, 235, 98, 58, 2, 70, 48, 12, 183, 10, 101, 65, - 52, 85, 91, 225, 78, 212, 174, 115, 35, 8, 222, 47, 224, 222, 22, 150, - 170, 179, 163, 57, 158, 36, 87, 73, 193, 36, 25, 8, 249, 219, 148, 29, - 208, 201, 252, 206, 54, 172, 31, 114, 117, 2, 128, 110, 52, 197, 217, 224, - 199, 2, 13, 157, 176, 33, 109, 201, 237, 19, 239, 174, 74, 200, 74, 21, - 169, 3, 174, 49, 38, 106, 63, 62, 120, 18, 92, 204, 131, 81, 112, 222, - 185, 129, 239, 183, 231, 29, 248, 201, 41, 219, 209, 187, 79, 41, 208, 156, - 252, 243, 146, 102, 88, 186, 139, 248, 82, 202, 60, 165, 243, 219, 17, 165, - 153, 146, 0, 21, 209, 89, 13, 16, 149, 185, 39, 77, 15, 85, 146, 93, - 153, 123, 181, 12, 226, 126, 200, 173, 136, 227, 109, 109, 90, 77, 22, 10, - 123, 138, 177, 58, 112, 99, 94, 171, 128, 172, 181, 66, 196, 182, 61, 14, - 73, 151, 85, 82, 249, 229, 202, 219, 38, 84, 194, 216, 110, 20, 30, 133, - 82, 207, 207, 1, 123, 15, 207, 207, 111, 207, 207, 41, 193, 64, 126, 254, - 240, 203, 26, 190, 139, 106, 37, 25, 1, 91, 209, 28, 91, 117, 240, 143, - 198, 116, 44, 34, 113, 145, 79, 18, 186, 28, 205, 99, 5, 129, 151, 197, - 177, 67, 22, 75, 152, 56, 229, 89, 82, 80, 97, 122, 70, 247, 150, 210, - 61, 223, 209, 107, 206, 254, 11, 20, 71, 119, 8, 184, 177, 34, 228, 34, - 65, 250, 93, 103, 140, 16, 55, 135, 1, 122, 244, 49, 47, 54, 25, 33, - 25, 100, 125, 220, 223, 9, 22, 154, 165, 89, 102, 4, 10, 33, 1, 10, - 48, 22, 255, 26, 25, 234, 200, 237, 134, 11, 29, 47, 107, 144, 94, 41, - 219, 136, 12, 72, 225, 1, 87, 43, 29, 11, 164, 128, 86, 199, 42, 175, - 226, 213, 26, 55, 220, 125, 20, 150, 83, 82, 133, 109, 203, 13, 167, 86, - 199, 171, 178, 77, 102, 53, 58, 157, 233, 58, 197, 88, 87, 197, 50, 117, - 220, 79, 236, 71, 93, 73, 101, 49, 3, 24, 167, 198, 245, 172, 64, 34, - 195, 125, 222, 100, 39, 239, 232, 68, 72, 107, 150, 197, 200, 82, 11, 230, - 157, 44, 249, 124, 169, 146, 202, 244, 64, 105, 252, 213, 125, 131, 156, 30, - 93, 2, 39, 44, 221, 108, 44, 176, 255, 141, 78, 70, 154, 172, 165, 52, - 50, 70, 210, 239, 191, 243, 222, 146, 21, 115, 130, 131, 178, 127, 242, 163, - 191, 252, 197, 125, 196, 105, 67, 229, 53, 126, 228, 228, 12, 149, 183, 220, - 39, 244, 146, 97, 177, 92, 231, 179, 81, 24, 140, 224, 223, 87, 240, 239, - 57, 126, 194, 7, 252, 253, 74, 250, 195, 180, 161, 234, 125, 202, 22, 170, - 27, 127, 254, 156, 171, 144, 72, 180, 165, 78, 47, 12, 14, 194, 96, 63, - 12, 14, 173, 126, 191, 224, 247, 84, 134, 212, 192, 182, 191, 234, 228, 166, - 2, 156, 59, 234, 188, 48, 77, 255, 151, 59, 54, 122, 212, 28, 219, 193, - 1, 107, 213, 2, 76, 207, 254, 197, 121, 49, 245, 51, 231, 215, 190, 243, - 235, 208, 249, 245, 133, 243, 235, 47, 206, 175, 223, 157, 95, 191, 58, 191, - 36, 37, 171, 250, 41, 89, 91, 81, 144, 224, 108, 41, 134, 36, 236, 80, - 94, 151, 106, 104, 185, 104, 170, 179, 73, 39, 154, 84, 93, 20, 64, 226, - 66, 127, 46, 232, 75, 57, 151, 143, 139, 90, 21, 44, 163, 107, 245, 45, - 205, 233, 91, 69, 159, 6, 123, 88, 192, 181, 129, 250, 213, 231, 145, 250, - 194, 79, 46, 169, 97, 148, 102, 240, 51, 158, 148, 53, 125, 38, 41, 255, - 102, 56, 20, 24, 241, 154, 158, 194, 74, 199, 143, 25, 240, 123, 167, 191, - 89, 58, 41, 232, 65, 6, 194, 62, 126, 153, 71, 235, 138, 26, 72, 115, - 122, 49, 173, 96, 157, 243, 151, 156, 33, 74, 1, 196, 153, 250, 34, 117, - 20, 48, 105, 133, 126, 10, 254, 54, 77, 75, 85, 203, 233, 82, 208, 1, - 148, 37, 31, 71, 242, 57, 28, 224, 23, 193, 17, 136, 16, 244, 193, 120, - 202, 5, 155, 171, 178, 160, 226, 18, 187, 115, 215, 9, 148, 213, 146, 45, - 184, 73, 140, 37, 14, 173, 177, 100, 76, 117, 174, 131, 109, 2, 219, 193, - 198, 49, 17, 15, 127, 170, 143, 88, 62, 9, 240, 234, 159, 140, 240, 170, - 158, 58, 227, 170, 74, 88, 229, 93, 216, 14, 233, 42, 209, 106, 189, 196, - 74, 50, 139, 106, 238, 128, 61, 225, 199, 181, 2, 200, 162, 55, 91, 240, - 230, 73, 223, 132, 215, 123, 218, 18, 70, 161, 105, 38, 160, 196, 170, 216, - 149, 74, 218, 195, 108, 146, 150, 168, 16, 25, 55, 250, 96, 174, 244, 72, - 208, 216, 105, 151, 123, 113, 248, 226, 224, 192, 171, 169, 97, 78, 19, 32, - 160, 139, 48, 15, 177, 249, 49, 157, 183, 87, 169, 229, 249, 198, 102, 6, - 205, 196, 26, 241, 43, 42, 255, 235, 76, 137, 241, 188, 141, 112, 166, 1, - 157, 45, 137, 152, 121, 211, 115, 49, 23, 149, 91, 213, 246, 193, 197, 84, - 122, 29, 142, 97, 174, 150, 81, 56, 78, 171, 177, 82, 203, 1, 251, 12, - 31, 239, 102, 26, 9, 184, 2, 122, 215, 191, 30, 29, 118, 143, 246, 171, - 95, 143, 246, 246, 14, 187, 206, 91, 255, 70, 243, 122, 180, 191, 74, 247, - 169, 81, 168, 114, 50, 220, 219, 109, 201, 250, 74, 183, 3, 180, 208, 14, - 24, 2, 137, 134, 64, 180, 141, 94, 197, 254, 79, 81, 189, 148, 98, 135, - 111, 188, 83, 25, 8, 229, 37, 201, 209, 168, 183, 87, 40, 118, 247, 91, - 168, 195, 5, 119, 233, 153, 180, 58, 162, 241, 144, 146, 30, 71, 227, 55, - 13, 80, 220, 249, 49, 214, 112, 67, 39, 114, 96, 128, 187, 124, 163, 13, - 184, 45, 178, 132, 110, 210, 144, 59, 218, 210, 143, 56, 165, 229, 26, 71, - 45, 29, 113, 113, 52, 78, 183, 161, 83, 216, 140, 72, 97, 186, 48, 215, - 228, 109, 21, 18, 251, 105, 23, 214, 237, 66, 102, 75, 162, 119, 97, 232, - 33, 130, 104, 91, 108, 230, 233, 101, 146, 59, 4, 104, 220, 228, 206, 29, - 29, 148, 254, 133, 164, 35, 30, 202, 32, 232, 206, 64, 150, 79, 246, 220, - 233, 26, 130, 22, 87, 174, 147, 189, 237, 195, 100, 254, 40, 203, 15, 117, - 56, 235, 25, 113, 76, 150, 213, 52, 82, 239, 221, 29, 234, 30, 164, 88, - 167, 148, 31, 74, 16, 143, 209, 93, 206, 248, 84, 60, 84, 243, 126, 40, - 5, 140, 92, 33, 83, 146, 156, 183, 161, 99, 224, 176, 193, 251, 199, 2, - 252, 241, 50, 52, 116, 151, 55, 232, 225, 211, 65, 55, 94, 63, 94, 62, - 178, 116, 47, 133, 127, 241, 5, 87, 206, 112, 82, 149, 178, 147, 196, 66, - 182, 44, 136, 111, 104, 23, 200, 205, 235, 26, 86, 219, 175, 75, 45, 106, - 123, 110, 148, 226, 102, 235, 22, 209, 254, 229, 22, 121, 94, 164, 253, 171, - 81, 212, 238, 148, 246, 144, 70, 17, 110, 28, 84, 228, 154, 47, 76, 96, - 19, 109, 34, 182, 31, 130, 66, 93, 117, 54, 185, 220, 186, 183, 213, 90, - 246, 36, 204, 31, 202, 113, 89, 39, 231, 96, 19, 63, 188, 17, 50, 115, - 163, 239, 64, 35, 124, 113, 81, 200, 132, 193, 187, 166, 61, 213, 17, 239, - 158, 234, 210, 21, 115, 254, 69, 213, 183, 193, 245, 48, 252, 155, 160, 55, - 28, 213, 69, 15, 227, 16, 43, 60, 40, 61, 192, 95, 121, 130, 247, 117, - 212, 100, 125, 129, 159, 42, 82, 188, 121, 240, 76, 73, 106, 238, 5, 28, - 68, 88, 147, 4, 111, 47, 151, 24, 234, 158, 138, 243, 228, 108, 98, 42, - 160, 4, 118, 213, 50, 5, 181, 51, 223, 178, 25, 103, 98, 5, 203, 146, - 124, 110, 156, 11, 150, 27, 222, 189, 217, 220, 235, 20, 209, 86, 223, 169, - 183, 5, 73, 104, 194, 102, 69, 149, 199, 124, 224, 50, 254, 59, 93, 65, - 174, 179, 226, 207, 104, 89, 57, 89, 248, 54, 231, 63, 177, 97, 21, 161, - 172, 47, 92, 254, 19, 219, 86, 198, 80, 185, 180, 195, 49, 253, 254, 25, - 237, 107, 191, 152, 202, 239, 73, 150, 52, 229, 170, 184, 195, 41, 182, 152, - 126, 252, 69, 116, 175, 33, 178, 183, 52, 80, 221, 191, 5, 116, 155, 40, - 236, 178, 51, 171, 121, 237, 51, 179, 72, 239, 24, 211, 165, 49, 30, 225, - 207, 215, 238, 207, 200, 253, 121, 233, 254, 172, 220, 159, 43, 247, 167, 178, - 135, 255, 100, 167, 110, 37, 179, 124, 154, 227, 193, 253, 80, 157, 224, 71, - 37, 7, 84, 178, 121, 35, 208, 132, 148, 123, 78, 35, 132, 117, 80, 25, - 88, 199, 124, 183, 6, 153, 62, 115, 247, 240, 198, 159, 49, 227, 215, 46, - 54, 54, 238, 207, 15, 238, 207, 88, 25, 204, 41, 240, 152, 78, 31, 219, - 169, 48, 148, 15, 130, 7, 171, 36, 196, 188, 1, 171, 187, 189, 253, 97, - 184, 221, 105, 219, 184, 63, 63, 184, 63, 227, 215, 247, 130, 91, 178, 43, - 252, 247, 192, 125, 202, 217, 167, 170, 164, 113, 246, 197, 13, 144, 234, 200, - 153, 106, 241, 60, 152, 75, 219, 148, 83, 155, 244, 116, 177, 34, 117, 103, - 114, 141, 194, 82, 156, 117, 174, 32, 196, 151, 233, 84, 123, 129, 190, 186, - 18, 221, 150, 137, 156, 116, 196, 67, 6, 237, 76, 159, 167, 249, 230, 42, - 218, 200, 49, 130, 37, 173, 57, 57, 81, 167, 94, 114, 41, 54, 53, 166, - 42, 205, 163, 200, 241, 210, 197, 216, 3, 125, 177, 153, 54, 103, 10, 86, - 27, 198, 57, 55, 72, 232, 21, 108, 230, 69, 40, 122, 69, 21, 201, 21, - 20, 156, 136, 214, 152, 40, 244, 238, 213, 148, 47, 174, 186, 99, 236, 187, - 81, 186, 112, 75, 65, 160, 211, 252, 218, 126, 178, 77, 36, 73, 99, 187, - 150, 202, 110, 173, 211, 23, 58, 222, 10, 62, 199, 165, 103, 217, 203, 131, - 132, 30, 27, 7, 77, 18, 185, 192, 90, 157, 185, 33, 214, 198, 223, 241, - 234, 35, 185, 164, 148, 105, 164, 139, 151, 229, 125, 8, 99, 130, 104, 239, - 191, 107, 153, 165, 234, 166, 203, 55, 152, 226, 79, 210, 147, 105, 38, 180, - 13, 252, 251, 0, 254, 70, 3, 238, 134, 65, 253, 17, 190, 166, 164, 49, - 6, 86, 167, 8, 49, 231, 116, 90, 234, 233, 32, 124, 234, 220, 249, 96, - 143, 249, 39, 135, 119, 124, 231, 252, 250, 218, 181, 52, 96, 252, 146, 148, - 96, 86, 101, 159, 11, 62, 29, 52, 148, 182, 70, 146, 163, 244, 168, 213, - 100, 122, 172, 132, 79, 179, 141, 248, 0, 125, 213, 160, 34, 150, 125, 245, - 85, 232, 141, 73, 105, 81, 200, 39, 83, 69, 16, 52, 142, 93, 137, 176, - 109, 108, 223, 146, 75, 220, 92, 210, 213, 220, 151, 213, 181, 139, 110, 188, - 35, 153, 243, 185, 251, 87, 193, 40, 56, 11, 126, 10, 191, 11, 191, 14, - 228, 168, 184, 229, 44, 253, 233, 59, 154, 0, 185, 207, 175, 229, 162, 68, - 27, 63, 30, 229, 22, 252, 224, 130, 21, 221, 184, 160, 33, 170, 28, 106, - 206, 69, 106, 209, 164, 184, 148, 220, 164, 117, 137, 185, 231, 197, 247, 107, - 206, 118, 19, 4, 185, 235, 109, 229, 129, 233, 243, 154, 66, 86, 208, 97, - 235, 242, 18, 140, 84, 36, 199, 8, 37, 235, 190, 192, 148, 81, 73, 94, - 53, 35, 78, 245, 220, 71, 159, 75, 190, 2, 16, 216, 11, 177, 62, 185, - 92, 137, 37, 7, 87, 20, 176, 239, 226, 176, 250, 246, 111, 157, 91, 153, - 143, 164, 28, 250, 19, 197, 139, 205, 214, 190, 240, 66, 201, 63, 177, 163, - 15, 91, 59, 226, 171, 41, 255, 196, 174, 226, 237, 248, 19, 6, 249, 39, - 118, 166, 226, 105, 228, 182, 187, 84, 210, 29, 145, 117, 195, 62, 232, 107, - 124, 106, 156, 41, 74, 223, 226, 32, 23, 248, 57, 93, 210, 189, 185, 110, - 172, 230, 50, 170, 56, 186, 29, 171, 251, 227, 132, 84, 20, 151, 38, 188, - 68, 146, 236, 115, 211, 71, 253, 47, 135, 79, 142, 158, 184, 9, 108, 237, - 247, 87, 105, 179, 129, 85, 234, 180, 160, 163, 114, 183, 183, 161, 66, 189, - 34, 100, 231, 211, 66, 9, 107, 202, 5, 175, 185, 251, 80, 12, 143, 86, - 110, 241, 96, 157, 167, 116, 159, 215, 52, 197, 216, 220, 201, 186, 118, 37, - 15, 99, 123, 245, 246, 225, 182, 69, 246, 89, 20, 200, 237, 198, 244, 5, - 115, 184, 158, 135, 46, 139, 43, 139, 245, 124, 193, 41, 247, 5, 200, 222, - 227, 176, 113, 213, 143, 179, 241, 210, 9, 202, 34, 139, 180, 113, 225, 196, - 93, 241, 234, 240, 163, 83, 145, 147, 56, 145, 164, 37, 215, 82, 113, 128, - 132, 37, 85, 184, 243, 110, 242, 129, 113, 21, 57, 244, 111, 124, 142, 18, - 118, 168, 92, 187, 110, 111, 182, 21, 14, 197, 68, 115, 83, 135, 219, 137, - 149, 242, 12, 67, 219, 217, 104, 209, 140, 89, 199, 144, 0, 63, 16, 24, - 205, 142, 123, 11, 167, 78, 85, 35, 119, 187, 208, 225, 232, 22, 157, 123, - 67, 179, 208, 140, 19, 149, 155, 187, 80, 170, 234, 160, 108, 206, 247, 59, - 86, 31, 193, 41, 161, 209, 5, 232, 254, 56, 109, 119, 247, 255, 7, 196, - 54, 109, 83, 34, 10, 68, 89, 188, 206, 214, 226, 64, 228, 196, 237, 198, - 127, 173, 146, 250, 171, 68, 205, 116, 119, 8, 223, 201, 235, 136, 46, 73, - 150, 184, 23, 134, 184, 115, 120, 22, 68, 131, 48, 18, 171, 236, 155, 224, - 189, 218, 47, 57, 95, 139, 146, 21, 186, 111, 14, 134, 36, 99, 246, 116, - 246, 56, 188, 10, 212, 74, 167, 39, 217, 153, 227, 34, 153, 205, 0, 187, - 36, 192, 136, 33, 255, 98, 27, 253, 240, 251, 111, 186, 12, 1, 129, 32, - 58, 1, 221, 84, 65, 182, 90, 202, 197, 160, 23, 150, 221, 162, 36, 229, - 224, 147, 255, 40, 153, 37, 101, 90, 76, 213, 85, 27, 51, 78, 92, 231, - 218, 179, 103, 9, 219, 247, 244, 84, 59, 80, 189, 202, 249, 88, 173, 202, - 117, 97, 7, 132, 132, 237, 238, 197, 36, 200, 131, 32, 104, 151, 85, 146, - 93, 210, 193, 113, 74, 166, 99, 221, 171, 137, 202, 26, 202, 77, 14, 52, - 114, 214, 145, 27, 112, 32, 65, 201, 80, 16, 42, 211, 231, 118, 77, 153, - 2, 4, 251, 252, 224, 103, 22, 229, 42, 45, 120, 217, 71, 11, 126, 62, - 187, 104, 229, 195, 147, 78, 214, 147, 158, 211, 206, 89, 240, 243, 217, 234, - 61, 204, 4, 124, 28, 252, 179, 55, 124, 47, 130, 99, 23, 173, 194, 120, - 167, 58, 87, 251, 39, 235, 27, 159, 12, 199, 42, 252, 167, 7, 146, 111, - 36, 223, 212, 33, 208, 156, 74, 61, 133, 114, 48, 176, 255, 10, 249, 133, - 218, 145, 208, 95, 169, 208, 13, 93, 80, 42, 28, 78, 190, 164, 151, 133, - 244, 52, 106, 220, 181, 74, 1, 20, 237, 142, 41, 21, 142, 44, 23, 115, - 88, 64, 107, 197, 118, 150, 208, 66, 103, 143, 100, 46, 117, 98, 79, 165, - 18, 102, 202, 162, 170, 186, 63, 135, 191, 40, 151, 13, 21, 40, 211, 211, - 158, 86, 83, 166, 69, 109, 215, 154, 22, 117, 187, 14, 233, 253, 63, 171, - 42, 210, 181, 94, 124, 123, 161, 167, 123, 188, 88, 11, 218, 69, 255, 166, - 73, 176, 17, 142, 227, 197, 58, 191, 24, 83, 44, 181, 180, 134, 21, 245, - 177, 163, 202, 244, 41, 215, 57, 117, 79, 141, 203, 137, 10, 244, 229, 80, - 118, 167, 86, 144, 142, 1, 26, 163, 74, 186, 167, 225, 152, 205, 223, 225, - 88, 177, 227, 177, 225, 254, 123, 122, 102, 124, 67, 128, 229, 14, 239, 127, - 29, 142, 243, 9, 122, 17, 42, 26, 13, 154, 74, 198, 40, 232, 83, 206, - 151, 6, 78, 52, 197, 160, 207, 206, 221, 254, 191, 109, 88, 83, 208, 127, - 251, 99, 119, 205, 204, 110, 173, 220, 18, 142, 107, 250, 251, 31, 123, 88, - 171, 125, 26, 136, 123, 115, 229, 16, 110, 245, 71, 139, 25, 69, 74, 34, - 89, 231, 24, 24, 192, 235, 30, 149, 102, 230, 24, 202, 20, 101, 162, 235, - 64, 53, 34, 40, 248, 144, 153, 221, 32, 16, 120, 161, 238, 120, 33, 200, - 142, 40, 152, 92, 89, 127, 238, 28, 168, 152, 141, 78, 67, 252, 0, 20, - 218, 130, 198, 93, 147, 98, 121, 104, 36, 226, 215, 68, 17, 52, 226, 99, - 5, 251, 50, 12, 81, 220, 27, 137, 0, 218, 226, 148, 57, 137, 108, 63, - 218, 181, 249, 169, 229, 227, 193, 44, 135, 46, 198, 151, 201, 178, 224, 205, - 189, 198, 4, 10, 228, 251, 161, 92, 136, 232, 245, 49, 30, 160, 163, 145, - 82, 236, 126, 15, 142, 71, 120, 232, 159, 242, 240, 62, 28, 205, 203, 20, - 227, 115, 31, 141, 38, 105, 188, 134, 127, 193, 239, 78, 251, 143, 71, 25, - 200, 155, 31, 10, 73, 126, 24, 218, 81, 16, 30, 172, 49, 220, 237, 12, - 136, 211, 180, 76, 227, 69, 150, 212, 2, 214, 122, 9, 170, 12, 129, 165, - 246, 40, 130, 107, 153, 150, 37, 160, 176, 29, 33, 220, 156, 78, 216, 139, - 167, 188, 42, 96, 49, 128, 68, 130, 121, 173, 49, 163, 38, 103, 11, 24, - 243, 193, 36, 143, 127, 29, 77, 148, 215, 114, 139, 113, 139, 211, 127, 237, - 106, 5, 65, 160, 92, 166, 40, 86, 59, 53, 79, 25, 23, 93, 93, 192, - 41, 156, 113, 143, 181, 154, 82, 226, 213, 12, 241, 100, 68, 243, 83, 150, - 202, 131, 83, 215, 187, 127, 106, 79, 57, 201, 49, 214, 137, 191, 134, 225, - 80, 37, 243, 229, 244, 64, 252, 190, 50, 71, 52, 78, 25, 138, 246, 180, - 77, 82, 81, 89, 20, 41, 7, 85, 197, 151, 229, 97, 236, 167, 50, 173, - 208, 125, 212, 218, 180, 138, 135, 13, 87, 136, 227, 24, 175, 106, 112, 5, - 9, 181, 71, 28, 182, 239, 53, 183, 249, 217, 254, 190, 218, 9, 164, 35, - 239, 93, 229, 24, 188, 118, 216, 168, 216, 184, 179, 28, 227, 212, 126, 109, - 84, 1, 241, 132, 24, 112, 218, 138, 100, 178, 1, 24, 53, 222, 2, 25, - 101, 214, 219, 14, 134, 183, 186, 15, 152, 70, 69, 87, 178, 193, 151, 154, - 224, 233, 93, 146, 130, 224, 154, 120, 193, 40, 195, 117, 101, 215, 42, 231, - 173, 90, 74, 148, 183, 170, 193, 106, 252, 205, 231, 2, 215, 239, 96, 133, - 245, 28, 100, 48, 235, 37, 10, 112, 219, 138, 205, 108, 207, 150, 27, 98, - 138, 61, 107, 84, 134, 50, 16, 78, 234, 197, 178, 121, 204, 149, 9, 240, - 245, 155, 123, 83, 160, 188, 0, 31, 249, 109, 39, 184, 182, 195, 106, 208, - 178, 95, 166, 215, 255, 13, 84, 41, 163, 225, 246, 21, 91, 216, 70, 19, - 160, 249, 24, 137, 96, 138, 105, 136, 150, 105, 30, 217, 147, 48, 77, 163, - 121, 247, 239, 186, 10, 252, 162, 33, 115, 243, 46, 132, 28, 203, 197, 61, - 154, 6, 146, 116, 110, 186, 128, 31, 73, 206, 162, 201, 33, 127, 103, 145, - 207, 170, 190, 73, 186, 106, 247, 238, 230, 128, 180, 92, 178, 74, 81, 162, - 84, 236, 212, 191, 24, 210, 252, 210, 116, 35, 200, 165, 91, 48, 43, 139, - 56, 0, 13, 90, 2, 137, 139, 172, 250, 218, 125, 161, 39, 239, 53, 177, - 229, 235, 111, 85, 37, 235, 105, 65, 189, 234, 230, 78, 27, 190, 148, 18, - 100, 193, 117, 120, 25, 94, 133, 17, 106, 3, 170, 51, 188, 75, 70, 98, - 14, 245, 144, 236, 87, 156, 202, 71, 47, 157, 222, 183, 190, 88, 21, 160, - 158, 248, 7, 135, 167, 85, 234, 94, 5, 178, 20, 93, 179, 153, 93, 178, - 161, 89, 182, 206, 106, 83, 225, 89, 142, 211, 254, 207, 193, 40, 248, 218, - 63, 216, 234, 114, 218, 30, 38, 200, 154, 176, 67, 209, 77, 55, 172, 251, - 78, 19, 206, 202, 146, 186, 52, 86, 99, 128, 125, 107, 110, 168, 116, 175, - 117, 224, 196, 188, 147, 87, 43, 232, 179, 217, 165, 121, 27, 158, 23, 100, - 29, 214, 187, 143, 146, 4, 101, 248, 226, 227, 224, 69, 41, 226, 150, 142, - 195, 115, 58, 213, 150, 248, 142, 201, 154, 229, 234, 18, 230, 166, 131, 168, - 161, 130, 55, 195, 231, 27, 167, 1, 72, 139, 82, 249, 136, 232, 236, 0, - 47, 95, 202, 109, 214, 118, 61, 41, 51, 201, 150, 192, 125, 190, 171, 44, - 21, 121, 246, 106, 81, 100, 137, 113, 240, 179, 223, 70, 31, 82, 83, 182, - 86, 106, 183, 91, 53, 38, 86, 31, 37, 168, 86, 17, 217, 52, 108, 63, - 175, 237, 127, 226, 8, 54, 206, 246, 38, 195, 208, 87, 77, 210, 5, 182, - 24, 54, 99, 41, 208, 47, 136, 59, 70, 215, 169, 36, 18, 108, 160, 26, - 197, 125, 143, 85, 228, 45, 39, 1, 128, 230, 211, 213, 154, 5, 71, 182, - 140, 188, 80, 71, 83, 36, 79, 64, 229, 94, 41, 72, 23, 195, 243, 97, - 102, 64, 188, 210, 31, 219, 241, 162, 47, 147, 105, 202, 238, 53, 163, 1, - 242, 221, 9, 100, 209, 1, 113, 184, 172, 172, 27, 177, 172, 190, 26, 150, - 21, 101, 88, 81, 57, 142, 2, 231, 26, 108, 120, 164, 30, 80, 49, 195, - 105, 36, 106, 78, 114, 32, 115, 172, 238, 173, 180, 115, 30, 184, 57, 157, - 232, 63, 35, 114, 51, 170, 226, 6, 70, 88, 133, 87, 158, 33, 132, 0, - 243, 22, 41, 169, 173, 65, 218, 103, 129, 149, 183, 32, 240, 88, 85, 185, - 137, 241, 174, 238, 133, 91, 178, 37, 207, 46, 91, 47, 246, 44, 192, 219, - 42, 149, 129, 210, 6, 109, 188, 123, 170, 32, 187, 107, 1, 62, 126, 212, - 6, 236, 148, 27, 71, 74, 69, 143, 252, 130, 110, 134, 177, 211, 38, 83, - 42, 51, 106, 92, 102, 239, 36, 248, 59, 35, 26, 47, 152, 44, 156, 85, - 90, 153, 121, 244, 204, 32, 131, 136, 211, 179, 205, 70, 250, 109, 203, 185, - 142, 71, 38, 16, 176, 174, 81, 129, 181, 41, 30, 32, 117, 158, 73, 252, - 168, 74, 124, 65, 177, 122, 148, 161, 146, 126, 155, 195, 88, 14, 138, 116, - 15, 83, 212, 48, 117, 155, 119, 235, 138, 85, 93, 92, 118, 161, 221, 150, - 66, 65, 218, 6, 118, 24, 215, 2, 20, 133, 74, 84, 173, 36, 90, 166, - 165, 210, 12, 204, 166, 6, 34, 102, 119, 137, 115, 70, 94, 117, 242, 239, - 78, 0, 47, 235, 162, 162, 140, 153, 180, 185, 112, 62, 69, 140, 229, 254, - 208, 82, 90, 101, 5, 41, 83, 149, 177, 164, 136, 118, 202, 25, 170, 184, - 107, 23, 115, 102, 141, 185, 55, 184, 89, 217, 67, 228, 32, 40, 27, 180, - 218, 89, 108, 176, 164, 105, 96, 50, 123, 149, 6, 92, 76, 14, 45, 85, - 23, 47, 142, 233, 149, 201, 116, 29, 211, 1, 210, 193, 8, 103, 251, 247, - 224, 249, 96, 180, 140, 174, 45, 207, 175, 164, 147, 252, 184, 206, 152, 196, - 139, 2, 167, 117, 24, 194, 159, 35, 178, 120, 192, 23, 21, 133, 189, 130, - 121, 171, 213, 237, 6, 202, 74, 41, 227, 165, 48, 103, 53, 181, 58, 246, - 211, 25, 213, 29, 185, 31, 155, 112, 64, 219, 149, 7, 142, 176, 61, 127, - 127, 20, 24, 18, 163, 241, 234, 167, 187, 167, 223, 183, 163, 8, 183, 208, - 210, 178, 173, 148, 162, 196, 189, 37, 103, 199, 51, 113, 120, 88, 84, 32, - 249, 157, 138, 146, 183, 65, 30, 147, 138, 112, 229, 180, 153, 87, 120, 55, - 99, 173, 50, 94, 37, 121, 12, 138, 114, 77, 110, 239, 109, 193, 59, 142, - 79, 187, 77, 114, 195, 103, 71, 207, 196, 15, 232, 122, 45, 35, 205, 115, - 228, 177, 207, 248, 62, 210, 94, 27, 113, 224, 227, 173, 161, 115, 206, 60, - 29, 252, 93, 135, 85, 165, 185, 247, 208, 29, 34, 137, 12, 236, 101, 34, - 49, 69, 64, 163, 120, 185, 102, 35, 87, 142, 146, 85, 244, 182, 91, 138, - 97, 27, 253, 37, 110, 12, 46, 71, 112, 1, 191, 234, 105, 83, 159, 202, - 178, 157, 26, 63, 75, 51, 198, 133, 212, 59, 33, 57, 98, 147, 206, 28, - 209, 161, 92, 222, 96, 201, 139, 163, 149, 61, 194, 213, 36, 75, 92, 27, - 63, 39, 181, 175, 124, 43, 184, 30, 225, 89, 169, 235, 189, 103, 199, 251, - 245, 175, 71, 7, 71, 251, 245, 65, 243, 174, 43, 252, 239, 93, 35, 42, - 173, 4, 196, 105, 91, 8, 134, 239, 240, 145, 76, 137, 232, 240, 97, 150, - 114, 157, 154, 27, 105, 99, 17, 209, 228, 104, 111, 219, 47, 102, 166, 221, - 75, 70, 246, 92, 42, 145, 72, 230, 84, 245, 184, 164, 227, 248, 151, 137, - 214, 70, 149, 157, 146, 64, 149, 203, 105, 55, 116, 140, 216, 186, 145, 254, - 34, 217, 92, 129, 56, 40, 27, 34, 189, 210, 178, 40, 73, 246, 244, 118, - 156, 136, 189, 225, 211, 171, 176, 73, 23, 160, 91, 172, 210, 195, 135, 207, - 196, 98, 244, 78, 237, 28, 20, 176, 143, 89, 97, 105, 118, 76, 75, 24, - 154, 212, 232, 78, 69, 229, 69, 118, 219, 104, 113, 53, 199, 83, 251, 193, - 11, 19, 17, 168, 131, 7, 249, 116, 109, 12, 3, 197, 233, 210, 215, 146, - 219, 1, 129, 149, 47, 188, 138, 240, 248, 191, 94, 189, 83, 215, 129, 151, - 14, 155, 121, 231, 28, 71, 101, 228, 182, 253, 12, 90, 148, 224, 243, 222, - 60, 73, 91, 88, 207, 186, 107, 78, 15, 153, 156, 72, 80, 106, 159, 43, - 58, 49, 135, 115, 239, 246, 236, 171, 67, 69, 230, 164, 69, 227, 172, 145, - 6, 190, 97, 253, 189, 175, 251, 63, 237, 142, 163, 112, 60, 9, 199, 113, - 56, 158, 54, 12, 209, 99, 190, 210, 103, 171, 53, 90, 143, 66, 139, 16, - 90, 113, 113, 111, 232, 10, 2, 59, 48, 78, 39, 28, 17, 13, 37, 10, - 39, 97, 28, 114, 176, 225, 159, 19, 183, 229, 51, 97, 143, 91, 23, 119, - 24, 115, 176, 178, 75, 231, 24, 119, 61, 41, 208, 18, 77, 77, 43, 195, - 116, 115, 51, 55, 93, 120, 112, 179, 165, 143, 127, 205, 228, 28, 200, 45, - 230, 20, 182, 100, 116, 188, 136, 146, 48, 155, 68, 108, 0, 116, 90, 6, - 78, 166, 232, 74, 164, 42, 174, 106, 66, 236, 156, 182, 153, 22, 174, 195, - 0, 152, 200, 135, 48, 136, 195, 160, 21, 145, 97, 201, 214, 118, 84, 193, - 29, 251, 97, 35, 129, 47, 42, 192, 193, 160, 255, 104, 191, 155, 118, 175, - 15, 134, 123, 61, 248, 232, 13, 247, 244, 113, 71, 120, 10, 115, 64, 151, - 11, 17, 9, 252, 220, 155, 2, 98, 46, 35, 186, 69, 128, 174, 243, 241, - 104, 218, 114, 76, 221, 220, 168, 45, 183, 0, 129, 130, 13, 187, 30, 229, - 135, 172, 98, 224, 224, 222, 131, 118, 191, 117, 199, 211, 107, 32, 251, 13, - 252, 251, 0, 255, 226, 79, 164, 127, 215, 9, 174, 83, 162, 126, 18, 241, - 95, 31, 0, 8, 155, 3, 128, 225, 195, 1, 0, 17, 31, 76, 99, 57, - 219, 234, 4, 49, 148, 73, 198, 136, 144, 125, 73, 162, 177, 26, 27, 173, - 38, 12, 127, 144, 205, 25, 95, 222, 231, 29, 209, 251, 182, 168, 215, 94, - 209, 246, 64, 90, 137, 156, 237, 101, 193, 29, 137, 224, 227, 95, 209, 114, - 165, 176, 229, 180, 24, 40, 159, 5, 191, 77, 254, 181, 117, 221, 43, 102, - 61, 130, 215, 63, 168, 223, 238, 49, 168, 246, 52, 161, 108, 196, 157, 108, - 65, 172, 103, 18, 183, 217, 86, 36, 40, 217, 207, 92, 41, 46, 124, 12, - 68, 6, 52, 246, 129, 152, 236, 125, 93, 125, 94, 19, 222, 111, 210, 224, - 157, 100, 251, 169, 141, 166, 103, 212, 232, 199, 241, 104, 7, 237, 222, 3, - 237, 100, 168, 132, 205, 153, 130, 36, 44, 173, 93, 50, 125, 184, 27, 22, - 147, 185, 19, 101, 36, 129, 168, 159, 16, 124, 234, 13, 27, 62, 252, 95, - 247, 129, 213, 12, 13, 94, 104, 78, 219, 189, 221, 179, 211, 162, 37, 127, - 168, 171, 161, 20, 226, 14, 239, 67, 177, 91, 12, 170, 240, 242, 191, 64, - 81, 152, 141, 203, 200, 29, 162, 139, 89, 177, 253, 145, 200, 96, 174, 151, - 134, 228, 192, 70, 12, 137, 47, 100, 89, 216, 85, 237, 236, 234, 122, 79, - 143, 228, 74, 123, 79, 40, 179, 29, 27, 193, 131, 107, 132, 71, 160, 25, - 82, 70, 80, 81, 46, 37, 205, 156, 244, 53, 39, 150, 71, 219, 71, 35, - 222, 184, 86, 144, 154, 249, 148, 131, 139, 205, 230, 210, 186, 143, 47, 222, - 103, 24, 132, 221, 207, 213, 5, 116, 74, 83, 236, 121, 69, 169, 86, 230, - 162, 67, 251, 9, 27, 57, 35, 189, 164, 131, 31, 229, 74, 79, 149, 37, - 70, 231, 13, 208, 145, 223, 236, 225, 245, 91, 30, 65, 96, 127, 225, 246, - 44, 185, 112, 169, 143, 85, 145, 230, 222, 195, 22, 156, 201, 151, 84, 120, - 82, 218, 189, 39, 252, 167, 215, 120, 88, 109, 131, 127, 62, 224, 159, 152, - 229, 248, 83, 125, 36, 125, 70, 129, 243, 150, 224, 130, 55, 56, 67, 115, - 58, 132, 199, 50, 237, 215, 120, 156, 19, 153, 71, 115, 40, 209, 114, 146, - 206, 215, 24, 247, 229, 88, 214, 105, 38, 105, 34, 17, 110, 152, 191, 233, - 198, 156, 195, 65, 109, 36, 75, 167, 116, 160, 38, 182, 242, 200, 194, 35, - 37, 222, 251, 15, 76, 150, 145, 28, 173, 9, 223, 134, 130, 143, 176, 73, - 27, 197, 42, 138, 83, 80, 188, 198, 175, 195, 49, 136, 228, 227, 215, 138, - 13, 192, 203, 132, 176, 21, 93, 24, 38, 182, 12, 181, 22, 188, 179, 237, - 46, 58, 90, 152, 159, 60, 239, 214, 92, 7, 148, 93, 255, 190, 27, 86, - 192, 71, 29, 100, 126, 101, 69, 89, 160, 123, 167, 183, 125, 55, 109, 35, - 115, 154, 186, 195, 51, 106, 108, 163, 246, 233, 33, 193, 32, 104, 105, 213, - 133, 241, 180, 178, 24, 64, 121, 206, 16, 36, 16, 9, 227, 133, 30, 196, - 219, 109, 43, 26, 88, 224, 102, 94, 228, 50, 107, 24, 158, 132, 55, 197, - 193, 190, 18, 18, 38, 42, 107, 190, 136, 25, 53, 38, 11, 229, 83, 12, - 82, 228, 86, 254, 39, 39, 202, 50, 184, 155, 41, 107, 156, 18, 171, 13, - 81, 113, 80, 34, 93, 148, 97, 122, 176, 134, 171, 123, 18, 173, 252, 200, - 27, 222, 158, 101, 233, 170, 74, 4, 89, 215, 113, 184, 137, 195, 50, 154, - 166, 235, 106, 24, 142, 249, 203, 17, 176, 94, 236, 234, 126, 120, 147, 6, - 255, 199, 240, 214, 136, 100, 106, 50, 151, 121, 2, 252, 183, 46, 253, 73, - 22, 173, 51, 123, 87, 225, 120, 65, 154, 111, 165, 54, 82, 47, 203, 15, - 99, 88, 250, 49, 98, 0, 119, 137, 88, 239, 0, 204, 195, 116, 4, 140, - 199, 243, 211, 60, 89, 222, 128, 91, 71, 32, 136, 39, 203, 137, 199, 226, - 171, 108, 57, 213, 152, 186, 114, 51, 173, 26, 62, 64, 225, 98, 33, 222, - 251, 132, 199, 137, 241, 54, 66, 117, 204, 82, 5, 121, 170, 228, 136, 221, - 188, 200, 123, 202, 228, 178, 39, 64, 91, 215, 77, 235, 123, 61, 157, 46, - 166, 155, 60, 90, 58, 113, 151, 130, 200, 123, 29, 62, 84, 12, 213, 91, - 90, 121, 75, 175, 220, 38, 124, 162, 208, 213, 194, 105, 208, 22, 224, 240, - 116, 245, 253, 207, 47, 198, 45, 91, 147, 87, 146, 159, 117, 53, 49, 132, - 40, 204, 142, 161, 37, 16, 182, 232, 107, 162, 242, 97, 24, 139, 136, 214, - 157, 44, 231, 3, 189, 210, 52, 12, 233, 6, 60, 67, 109, 221, 229, 216, - 108, 85, 131, 196, 173, 10, 147, 31, 140, 40, 67, 71, 40, 54, 12, 147, - 193, 196, 223, 103, 99, 7, 118, 149, 108, 251, 214, 16, 87, 77, 171, 140, - 9, 61, 85, 120, 85, 1, 253, 218, 183, 188, 40, 178, 169, 74, 213, 72, - 199, 110, 147, 50, 199, 216, 127, 101, 43, 246, 205, 172, 110, 230, 223, 52, - 210, 206, 78, 52, 200, 34, 32, 163, 215, 129, 147, 12, 154, 83, 136, 247, - 49, 210, 83, 86, 28, 125, 129, 170, 74, 7, 104, 91, 40, 96, 166, 175, - 191, 24, 14, 70, 163, 65, 120, 244, 232, 81, 152, 182, 233, 139, 170, 97, - 157, 127, 75, 79, 160, 138, 200, 214, 232, 155, 68, 150, 232, 218, 59, 179, - 40, 191, 8, 152, 49, 99, 130, 83, 10, 217, 7, 4, 97, 212, 238, 38, - 24, 14, 240, 152, 169, 62, 133, 166, 184, 136, 87, 28, 41, 186, 86, 2, - 27, 195, 152, 52, 35, 194, 16, 251, 202, 54, 55, 187, 153, 165, 220, 91, - 39, 118, 131, 117, 94, 167, 153, 159, 140, 26, 222, 129, 60, 165, 219, 244, - 144, 99, 59, 47, 53, 91, 212, 53, 249, 2, 42, 63, 133, 166, 149, 35, - 143, 110, 191, 132, 130, 6, 162, 123, 56, 177, 150, 225, 155, 175, 142, 194, - 55, 97, 62, 122, 211, 27, 62, 251, 118, 48, 26, 60, 251, 118, 56, 26, - 62, 3, 252, 124, 123, 52, 250, 118, 112, 240, 45, 149, 226, 223, 225, 232, - 219, 35, 168, 151, 27, 27, 147, 8, 236, 173, 142, 240, 180, 175, 99, 236, - 248, 54, 157, 20, 57, 168, 164, 169, 190, 101, 36, 180, 124, 212, 111, 158, - 143, 6, 198, 95, 175, 242, 44, 61, 124, 124, 252, 248, 137, 214, 135, 164, - 230, 232, 232, 97, 211, 9, 110, 8, 221, 157, 211, 230, 148, 138, 59, 74, - 57, 15, 170, 134, 158, 99, 7, 171, 212, 1, 5, 7, 1, 97, 121, 208, - 152, 7, 32, 59, 197, 23, 218, 58, 69, 225, 30, 186, 51, 217, 92, 48, - 80, 159, 206, 160, 219, 246, 31, 242, 130, 249, 24, 153, 53, 237, 62, 90, - 133, 158, 186, 104, 133, 51, 67, 10, 199, 20, 201, 50, 93, 151, 73, 56, - 41, 180, 120, 206, 199, 56, 221, 17, 182, 157, 104, 216, 148, 108, 15, 245, - 162, 145, 222, 9, 68, 212, 50, 146, 204, 19, 166, 157, 93, 101, 166, 156, - 74, 170, 180, 46, 91, 201, 157, 163, 14, 26, 34, 161, 204, 153, 35, 92, - 216, 183, 109, 220, 177, 60, 240, 246, 193, 164, 84, 247, 125, 83, 106, 14, - 224, 122, 31, 146, 178, 160, 195, 70, 226, 184, 193, 32, 7, 14, 27, 130, - 133, 33, 32, 243, 57, 70, 193, 187, 195, 101, 155, 187, 175, 206, 56, 224, - 38, 98, 202, 163, 156, 153, 250, 15, 202, 8, 126, 191, 9, 212, 88, 185, - 139, 73, 126, 108, 249, 225, 20, 195, 18, 52, 11, 144, 23, 90, 232, 91, - 131, 123, 158, 216, 207, 118, 142, 177, 55, 146, 99, 236, 127, 108, 29, 90, - 201, 88, 48, 135, 151, 187, 187, 243, 184, 141, 22, 153, 92, 71, 113, 45, - 217, 77, 26, 6, 29, 15, 181, 55, 91, 112, 134, 110, 95, 85, 165, 60, - 77, 154, 91, 211, 25, 126, 9, 102, 114, 47, 41, 246, 158, 238, 195, 52, - 203, 158, 88, 21, 12, 160, 72, 243, 181, 21, 170, 98, 37, 104, 161, 151, - 244, 133, 141, 84, 175, 114, 44, 159, 114, 137, 43, 236, 93, 69, 236, 10, - 237, 200, 58, 66, 2, 48, 160, 64, 89, 160, 91, 235, 34, 93, 255, 245, - 90, 36, 105, 171, 155, 177, 60, 241, 4, 174, 206, 169, 111, 12, 83, 111, - 236, 210, 198, 179, 219, 27, 210, 10, 165, 204, 102, 90, 184, 160, 132, 103, - 126, 229, 29, 216, 64, 55, 170, 235, 50, 196, 252, 104, 158, 94, 233, 30, - 82, 172, 128, 158, 49, 99, 185, 231, 88, 134, 93, 124, 9, 153, 6, 246, - 70, 103, 122, 84, 250, 180, 176, 53, 147, 202, 224, 141, 109, 137, 32, 144, - 24, 79, 34, 250, 125, 54, 124, 178, 97, 56, 90, 2, 182, 23, 228, 240, - 153, 2, 87, 64, 95, 15, 126, 194, 208, 175, 146, 228, 130, 206, 62, 44, - 240, 226, 86, 60, 251, 176, 132, 89, 1, 176, 154, 71, 31, 228, 210, 89, - 57, 249, 64, 86, 55, 19, 81, 81, 91, 198, 167, 173, 56, 25, 35, 156, - 108, 214, 113, 38, 193, 36, 17, 108, 225, 68, 145, 69, 151, 124, 227, 201, - 30, 225, 206, 171, 126, 99, 196, 10, 237, 104, 67, 90, 1, 20, 74, 162, - 211, 196, 57, 149, 180, 108, 110, 135, 185, 108, 185, 252, 218, 147, 243, 153, - 169, 81, 89, 19, 237, 228, 5, 123, 141, 192, 151, 208, 31, 233, 100, 110, - 48, 174, 108, 177, 177, 213, 190, 195, 105, 41, 129, 52, 50, 104, 75, 84, - 219, 107, 135, 211, 240, 136, 8, 15, 122, 39, 167, 52, 242, 122, 160, 42, - 68, 140, 47, 63, 116, 5, 110, 125, 150, 158, 130, 242, 204, 109, 108, 141, - 11, 163, 27, 7, 72, 205, 158, 233, 24, 198, 4, 148, 221, 191, 130, 110, - 94, 236, 74, 42, 66, 47, 109, 36, 147, 245, 188, 219, 96, 91, 10, 100, - 62, 87, 139, 170, 42, 214, 114, 82, 69, 152, 75, 114, 237, 219, 216, 88, - 184, 39, 61, 113, 218, 60, 31, 228, 201, 235, 99, 231, 252, 110, 72, 0, - 93, 123, 246, 244, 141, 173, 254, 33, 240, 173, 5, 221, 241, 207, 225, 216, - 232, 244, 77, 242, 83, 181, 12, 1, 170, 219, 14, 132, 104, 106, 178, 86, - 170, 204, 25, 230, 4, 85, 44, 7, 39, 119, 91, 52, 210, 48, 61, 243, - 201, 132, 171, 40, 229, 140, 94, 116, 49, 45, 39, 222, 239, 139, 100, 108, - 242, 116, 114, 34, 187, 226, 50, 229, 220, 247, 1, 159, 157, 114, 173, 183, - 121, 180, 2, 157, 94, 231, 45, 178, 17, 103, 95, 98, 142, 178, 4, 143, - 132, 162, 71, 72, 223, 245, 110, 25, 201, 60, 205, 91, 51, 109, 237, 29, - 160, 112, 182, 30, 127, 92, 6, 229, 59, 158, 61, 2, 168, 179, 245, 68, - 76, 43, 4, 67, 206, 135, 241, 160, 145, 92, 43, 230, 150, 230, 98, 228, - 197, 128, 99, 174, 155, 102, 15, 196, 41, 31, 42, 215, 201, 31, 204, 235, - 202, 49, 14, 186, 33, 250, 141, 120, 81, 152, 132, 248, 164, 192, 157, 119, - 158, 51, 50, 56, 174, 101, 176, 247, 44, 56, 56, 128, 239, 124, 191, 128, - 127, 157, 196, 197, 106, 211, 157, 38, 85, 29, 86, 101, 76, 193, 142, 73, - 86, 147, 225, 40, 230, 224, 137, 120, 108, 172, 140, 140, 59, 120, 37, 21, - 77, 21, 54, 91, 128, 74, 14, 200, 225, 238, 122, 97, 137, 101, 210, 86, - 155, 198, 212, 233, 240, 64, 223, 61, 171, 210, 237, 210, 213, 203, 86, 106, - 77, 52, 167, 200, 85, 206, 156, 247, 211, 178, 50, 161, 103, 93, 98, 246, - 244, 154, 175, 148, 88, 221, 58, 206, 79, 222, 23, 238, 213, 98, 60, 90, - 30, 135, 193, 182, 29, 130, 56, 118, 143, 184, 161, 182, 17, 27, 2, 50, - 254, 19, 244, 78, 175, 228, 130, 0, 102, 231, 245, 14, 213, 24, 165, 104, - 140, 58, 238, 246, 133, 161, 160, 208, 124, 92, 57, 251, 97, 162, 69, 25, - 222, 39, 164, 41, 109, 145, 220, 165, 116, 28, 214, 74, 247, 56, 54, 206, - 224, 221, 48, 125, 29, 166, 81, 152, 94, 134, 215, 203, 112, 179, 12, 63, - 44, 195, 120, 25, 94, 191, 14, 55, 175, 195, 15, 175, 195, 24, 158, 86, - 97, 186, 82, 231, 176, 135, 15, 239, 202, 199, 183, 206, 203, 100, 70, 206, - 49, 189, 59, 34, 106, 202, 98, 83, 113, 164, 30, 114, 209, 74, 39, 20, - 114, 146, 107, 137, 124, 18, 85, 119, 39, 252, 36, 9, 143, 144, 217, 85, - 254, 55, 96, 23, 200, 111, 2, 185, 82, 33, 113, 174, 144, 55, 245, 209, - 62, 168, 239, 44, 49, 187, 77, 156, 165, 108, 153, 156, 225, 105, 15, 95, - 151, 99, 179, 223, 5, 191, 161, 91, 32, 157, 231, 116, 49, 189, 157, 189, - 182, 194, 131, 31, 41, 242, 9, 224, 138, 179, 117, 70, 180, 65, 155, 10, - 44, 195, 185, 63, 9, 203, 117, 221, 221, 85, 215, 66, 239, 10, 55, 162, - 43, 165, 91, 204, 168, 227, 185, 71, 58, 170, 228, 168, 200, 85, 84, 169, - 172, 170, 190, 48, 61, 75, 206, 177, 20, 201, 102, 188, 158, 188, 210, 211, - 153, 228, 147, 82, 229, 32, 5, 190, 140, 39, 201, 79, 196, 208, 109, 143, - 228, 5, 223, 196, 77, 21, 218, 39, 215, 173, 128, 191, 168, 121, 10, 37, - 52, 230, 88, 43, 244, 243, 78, 219, 217, 72, 232, 218, 57, 120, 82, 20, - 232, 247, 217, 3, 38, 71, 1, 146, 193, 65, 176, 1, 102, 39, 23, 61, - 140, 48, 174, 175, 59, 12, 143, 246, 160, 28, 191, 30, 133, 199, 123, 109, - 213, 254, 93, 185, 145, 219, 84, 37, 193, 42, 198, 34, 78, 214, 105, 86, - 247, 0, 116, 173, 162, 58, 226, 135, 57, 69, 184, 71, 14, 68, 216, 251, - 146, 217, 12, 86, 154, 211, 242, 15, 208, 94, 86, 112, 146, 17, 198, 34, - 11, 214, 42, 130, 167, 182, 98, 171, 13, 37, 193, 126, 167, 104, 25, 47, - 247, 227, 121, 160, 45, 197, 101, 41, 146, 40, 2, 102, 213, 153, 41, 147, - 175, 130, 180, 57, 95, 15, 176, 157, 198, 81, 57, 101, 18, 86, 237, 52, - 204, 179, 20, 108, 212, 84, 206, 94, 55, 102, 26, 183, 34, 9, 122, 52, - 231, 121, 116, 242, 67, 30, 50, 17, 182, 37, 27, 153, 123, 87, 152, 22, - 49, 106, 249, 23, 109, 222, 119, 253, 11, 151, 133, 184, 55, 47, 132, 88, - 150, 18, 21, 165, 135, 66, 166, 7, 57, 168, 34, 25, 48, 100, 250, 43, - 190, 154, 91, 209, 22, 70, 255, 186, 226, 7, 30, 19, 53, 242, 92, 243, - 54, 77, 155, 194, 144, 190, 144, 182, 174, 159, 5, 31, 112, 63, 125, 70, - 212, 116, 112, 208, 12, 34, 23, 133, 233, 161, 148, 226, 96, 203, 198, 98, - 228, 116, 79, 236, 11, 114, 50, 71, 31, 181, 9, 147, 204, 87, 214, 61, - 81, 161, 76, 112, 67, 202, 226, 8, 57, 185, 44, 6, 228, 39, 120, 130, - 113, 192, 21, 94, 165, 16, 39, 171, 154, 194, 11, 21, 29, 32, 58, 124, - 171, 235, 115, 109, 15, 80, 113, 80, 191, 177, 11, 148, 98, 104, 81, 31, - 211, 119, 38, 235, 163, 99, 124, 41, 183, 139, 182, 45, 26, 71, 123, 189, - 94, 239, 111, 24, 141, 195, 3, 189, 44, 155, 136, 84, 23, 196, 178, 222, - 105, 223, 152, 101, 108, 20, 248, 254, 222, 126, 87, 90, 216, 11, 217, 190, - 229, 138, 25, 45, 187, 155, 13, 199, 231, 251, 155, 207, 63, 10, 201, 151, - 247, 128, 4, 94, 223, 247, 93, 63, 251, 198, 96, 190, 146, 99, 238, 100, - 131, 144, 120, 216, 230, 156, 106, 134, 163, 239, 40, 164, 88, 125, 218, 81, - 212, 214, 161, 78, 18, 237, 54, 40, 90, 142, 1, 84, 146, 55, 90, 142, - 22, 170, 235, 135, 160, 133, 216, 115, 149, 19, 44, 147, 38, 12, 41, 222, - 30, 188, 198, 235, 68, 92, 150, 131, 164, 86, 9, 11, 118, 238, 97, 130, - 93, 190, 251, 6, 209, 121, 182, 251, 42, 200, 210, 139, 36, 120, 243, 249, - 238, 251, 103, 154, 166, 27, 251, 203, 107, 148, 107, 123, 156, 162, 44, 153, - 106, 57, 189, 35, 161, 173, 124, 217, 137, 45, 159, 163, 165, 174, 177, 249, - 188, 154, 161, 87, 80, 41, 202, 160, 185, 71, 180, 28, 50, 24, 5, 200, - 203, 57, 102, 233, 162, 70, 209, 117, 72, 1, 230, 21, 122, 38, 128, 239, - 188, 248, 241, 111, 48, 15, 151, 160, 248, 161, 224, 161, 210, 147, 34, 208, - 100, 5, 139, 234, 214, 254, 217, 60, 66, 185, 138, 42, 65, 105, 212, 58, - 2, 105, 105, 100, 105, 14, 114, 136, 248, 161, 36, 94, 212, 57, 41, 145, - 98, 75, 37, 110, 221, 153, 171, 0, 240, 222, 168, 133, 127, 91, 160, 145, - 44, 112, 238, 225, 79, 37, 61, 187, 185, 228, 236, 3, 9, 39, 77, 216, - 228, 20, 54, 145, 68, 211, 183, 82, 25, 245, 66, 2, 10, 25, 199, 148, - 88, 200, 85, 129, 214, 185, 51, 10, 86, 93, 196, 103, 22, 45, 137, 110, - 241, 220, 16, 78, 78, 93, 168, 61, 130, 92, 37, 75, 60, 99, 4, 235, - 233, 42, 42, 121, 14, 212, 225, 116, 58, 71, 230, 78, 129, 165, 69, 203, - 145, 77, 178, 86, 124, 182, 167, 15, 190, 54, 198, 217, 181, 220, 162, 206, - 128, 233, 162, 58, 222, 86, 180, 188, 40, 249, 44, 65, 255, 113, 183, 64, - 204, 236, 33, 252, 79, 225, 70, 36, 22, 91, 141, 39, 104, 170, 8, 247, - 29, 86, 127, 66, 138, 69, 155, 22, 114, 114, 36, 231, 124, 80, 72, 133, - 124, 88, 211, 90, 175, 235, 82, 206, 151, 0, 176, 43, 21, 7, 160, 112, - 255, 217, 94, 131, 218, 183, 58, 73, 236, 123, 191, 101, 180, 207, 155, 243, - 253, 149, 113, 51, 108, 73, 33, 230, 13, 202, 163, 107, 113, 206, 222, 135, - 193, 111, 30, 91, 236, 111, 103, 78, 100, 173, 138, 14, 83, 119, 132, 114, - 36, 44, 49, 76, 35, 128, 202, 249, 224, 105, 35, 249, 48, 165, 230, 196, - 204, 34, 65, 215, 25, 1, 221, 234, 128, 151, 115, 59, 207, 190, 210, 207, - 166, 137, 156, 121, 90, 90, 28, 133, 47, 26, 108, 220, 173, 189, 109, 71, - 160, 211, 81, 230, 166, 187, 169, 67, 97, 119, 31, 46, 43, 83, 18, 100, - 186, 132, 66, 12, 226, 109, 175, 41, 146, 231, 13, 16, 162, 229, 168, 23, - 88, 52, 150, 160, 23, 201, 11, 137, 226, 140, 75, 253, 233, 210, 61, 144, - 252, 141, 101, 154, 48, 39, 29, 36, 72, 76, 5, 251, 237, 141, 104, 54, - 220, 216, 131, 223, 238, 87, 45, 61, 27, 91, 81, 179, 239, 173, 42, 6, - 48, 135, 12, 182, 85, 167, 40, 157, 200, 201, 132, 140, 195, 179, 228, 223, - 76, 5, 174, 145, 100, 100, 235, 181, 142, 117, 77, 66, 33, 183, 199, 18, - 110, 11, 196, 78, 141, 216, 171, 37, 29, 59, 240, 70, 2, 3, 240, 218, - 169, 20, 165, 181, 134, 189, 96, 158, 21, 19, 247, 232, 249, 33, 143, 178, - 146, 91, 228, 52, 254, 251, 58, 65, 182, 19, 73, 12, 197, 239, 149, 96, - 82, 148, 58, 34, 59, 219, 108, 13, 118, 111, 5, 209, 219, 241, 138, 78, - 167, 191, 249, 59, 253, 205, 234, 180, 47, 71, 194, 108, 107, 150, 56, 95, - 101, 205, 202, 75, 102, 206, 52, 169, 241, 157, 119, 100, 70, 110, 101, 163, - 181, 206, 20, 90, 40, 151, 33, 217, 27, 137, 225, 191, 55, 22, 12, 183, - 110, 64, 136, 58, 142, 165, 116, 92, 109, 112, 149, 87, 143, 30, 61, 14, - 135, 71, 79, 40, 26, 43, 184, 185, 146, 75, 34, 233, 84, 5, 70, 210, - 162, 187, 35, 128, 58, 215, 88, 135, 65, 149, 184, 45, 78, 72, 72, 116, - 7, 207, 219, 215, 64, 190, 162, 202, 148, 49, 0, 119, 168, 203, 52, 129, - 173, 231, 158, 151, 64, 86, 156, 189, 173, 68, 39, 104, 62, 221, 52, 111, - 132, 188, 76, 81, 122, 82, 87, 47, 83, 130, 25, 142, 94, 99, 47, 223, - 240, 37, 201, 131, 192, 121, 40, 173, 139, 125, 150, 100, 149, 21, 181, 144, - 140, 66, 208, 240, 229, 225, 209, 203, 195, 227, 151, 114, 111, 71, 235, 21, - 49, 143, 10, 87, 196, 7, 80, 87, 221, 96, 181, 165, 242, 241, 84, 145, - 8, 249, 114, 115, 251, 86, 70, 50, 136, 68, 100, 230, 34, 164, 104, 158, - 238, 222, 226, 72, 88, 107, 208, 139, 57, 112, 118, 145, 108, 38, 5, 114, - 109, 117, 13, 132, 164, 141, 84, 130, 151, 94, 212, 141, 206, 146, 210, 190, - 17, 81, 101, 148, 237, 210, 245, 175, 116, 29, 50, 145, 252, 73, 240, 31, - 69, 129, 247, 153, 30, 22, 107, 173, 116, 171, 202, 47, 222, 253, 244, 253, - 193, 75, 174, 246, 138, 163, 173, 157, 107, 189, 189, 245, 95, 112, 253, 151, - 201, 61, 235, 255, 196, 245, 127, 74, 144, 201, 125, 172, 242, 63, 184, 242, - 11, 188, 37, 89, 42, 123, 235, 125, 203, 245, 222, 21, 115, 220, 18, 102, - 235, 44, 147, 203, 193, 41, 127, 153, 239, 141, 183, 252, 198, 91, 148, 112, - 149, 63, 75, 65, 163, 12, 236, 104, 160, 80, 7, 13, 200, 243, 183, 59, - 95, 166, 241, 248, 26, 254, 235, 79, 150, 171, 93, 111, 195, 63, 120, 26, - 214, 231, 159, 148, 23, 1, 231, 139, 87, 79, 120, 103, 47, 113, 186, 156, - 127, 176, 121, 203, 91, 77, 20, 250, 72, 162, 176, 15, 151, 216, 133, 36, - 62, 70, 242, 101, 226, 161, 25, 26, 198, 169, 12, 3, 120, 1, 70, 33, - 172, 203, 138, 146, 170, 110, 193, 230, 143, 92, 251, 71, 116, 155, 124, 232, - 193, 96, 217, 144, 61, 43, 249, 140, 48, 218, 25, 151, 5, 128, 196, 55, - 54, 92, 98, 124, 19, 70, 33, 198, 129, 94, 156, 123, 222, 118, 255, 46, - 80, 44, 138, 171, 195, 5, 234, 233, 80, 31, 71, 246, 169, 237, 180, 151, - 193, 119, 69, 176, 94, 29, 194, 116, 231, 205, 23, 222, 254, 245, 213, 183, - 239, 252, 111, 224, 77, 132, 135, 165, 125, 7, 140, 122, 233, 13, 31, 164, - 14, 126, 60, 125, 217, 90, 102, 65, 247, 224, 176, 199, 252, 101, 73, 153, - 214, 23, 148, 11, 57, 248, 0, 85, 52, 79, 232, 114, 146, 128, 22, 248, - 95, 159, 190, 248, 223, 111, 127, 60, 125, 241, 141, 189, 108, 240, 77, 58, - 153, 145, 220, 139, 52, 52, 87, 251, 8, 85, 40, 222, 182, 133, 46, 24, - 37, 123, 7, 124, 33, 163, 125, 155, 187, 96, 232, 167, 130, 174, 227, 209, - 221, 53, 199, 162, 27, 224, 59, 26, 61, 45, 16, 214, 62, 254, 62, 95, - 13, 239, 107, 224, 45, 38, 179, 220, 222, 2, 51, 139, 33, 221, 126, 193, - 223, 31, 59, 156, 67, 223, 100, 173, 37, 45, 204, 233, 148, 224, 101, 181, - 164, 90, 98, 46, 23, 111, 155, 255, 193, 205, 124, 67, 119, 89, 31, 170, - 235, 159, 63, 244, 248, 68, 27, 157, 175, 144, 70, 188, 175, 159, 122, 232, - 60, 186, 222, 210, 215, 119, 22, 135, 209, 35, 189, 155, 143, 128, 244, 229, - 231, 86, 239, 156, 101, 174, 134, 207, 162, 245, 33, 223, 72, 221, 67, 3, - 25, 109, 141, 60, 252, 150, 56, 112, 58, 229, 168, 89, 182, 106, 171, 8, - 202, 45, 226, 192, 27, 88, 188, 141, 154, 58, 163, 32, 201, 1, 98, 242, - 68, 47, 105, 168, 151, 138, 148, 200, 109, 147, 74, 158, 224, 113, 52, 91, - 195, 177, 243, 237, 227, 15, 172, 219, 144, 21, 197, 19, 102, 82, 14, 154, - 199, 180, 2, 226, 87, 167, 235, 154, 241, 89, 40, 169, 23, 41, 135, 18, - 121, 12, 68, 77, 20, 65, 215, 36, 58, 212, 14, 64, 106, 120, 140, 86, - 189, 19, 213, 205, 216, 24, 130, 155, 26, 101, 187, 6, 46, 71, 138, 186, - 81, 183, 149, 186, 226, 228, 105, 205, 32, 172, 87, 78, 164, 42, 38, 31, - 17, 147, 48, 101, 85, 143, 179, 53, 38, 26, 66, 188, 237, 86, 238, 112, - 25, 79, 59, 127, 253, 225, 245, 55, 135, 125, 36, 10, 145, 255, 243, 224, - 111, 121, 122, 189, 103, 89, 120, 185, 230, 23, 167, 63, 254, 248, 242, 244, - 221, 233, 23, 135, 216, 154, 251, 198, 63, 104, 143, 172, 228, 168, 255, 139, - 239, 95, 1, 147, 41, 50, 101, 239, 83, 85, 119, 27, 224, 129, 118, 162, - 114, 133, 16, 92, 77, 28, 102, 41, 39, 178, 209, 129, 119, 234, 34, 55, - 131, 134, 23, 206, 52, 75, 246, 9, 58, 111, 130, 132, 97, 37, 79, 74, - 212, 153, 165, 179, 168, 247, 225, 180, 247, 31, 131, 222, 211, 177, 73, 5, - 36, 89, 26, 168, 55, 117, 84, 152, 151, 141, 141, 242, 92, 91, 70, 130, - 78, 231, 115, 234, 52, 201, 5, 58, 75, 9, 214, 105, 51, 163, 22, 77, - 43, 58, 19, 159, 129, 33, 108, 219, 41, 69, 78, 123, 45, 174, 18, 225, - 93, 210, 253, 142, 182, 65, 153, 154, 71, 74, 180, 0, 124, 213, 238, 146, - 109, 20, 205, 196, 5, 59, 61, 251, 154, 246, 29, 201, 89, 80, 38, 113, - 49, 207, 41, 87, 44, 57, 94, 141, 93, 214, 97, 251, 130, 130, 157, 78, - 231, 124, 95, 171, 126, 182, 17, 23, 134, 20, 145, 5, 168, 29, 163, 35, - 17, 45, 182, 255, 164, 223, 106, 248, 188, 179, 47, 190, 245, 127, 173, 229, - 144, 151, 43, 25, 77, 140, 74, 40, 236, 235, 159, 235, 162, 54, 233, 148, - 236, 81, 125, 190, 173, 107, 54, 94, 242, 101, 88, 146, 193, 20, 186, 187, - 200, 65, 90, 176, 93, 151, 194, 18, 12, 104, 22, 239, 50, 96, 20, 165, - 58, 117, 19, 185, 199, 240, 149, 36, 239, 206, 227, 158, 15, 82, 101, 49, - 242, 131, 170, 174, 39, 108, 168, 25, 12, 185, 248, 122, 200, 148, 59, 33, - 230, 110, 66, 0, 214, 101, 235, 108, 135, 182, 184, 234, 195, 113, 62, 120, - 254, 109, 251, 164, 81, 136, 16, 237, 126, 237, 203, 140, 173, 145, 112, 182, - 117, 149, 33, 83, 103, 160, 163, 124, 77, 43, 246, 44, 181, 250, 77, 91, - 74, 251, 206, 77, 42, 106, 45, 146, 53, 5, 220, 123, 240, 35, 246, 241, - 95, 37, 158, 180, 125, 63, 110, 31, 182, 165, 57, 159, 249, 86, 72, 107, - 101, 149, 209, 61, 246, 126, 179, 186, 140, 36, 136, 152, 163, 146, 36, 171, - 142, 233, 243, 55, 213, 103, 22, 209, 237, 180, 166, 67, 131, 145, 193, 29, - 83, 107, 205, 75, 155, 253, 181, 17, 116, 147, 142, 132, 194, 110, 239, 162, - 23, 29, 240, 102, 227, 53, 232, 26, 182, 203, 230, 195, 13, 249, 57, 41, - 73, 147, 149, 209, 197, 50, 178, 9, 211, 151, 46, 101, 163, 83, 161, 199, - 108, 117, 108, 62, 22, 107, 117, 20, 216, 140, 9, 69, 151, 171, 36, 203, - 60, 164, 127, 131, 224, 39, 119, 15, 71, 91, 170, 84, 222, 34, 113, 232, - 112, 13, 194, 152, 118, 72, 133, 202, 4, 58, 179, 131, 97, 44, 251, 156, - 106, 139, 251, 237, 127, 44, 157, 19, 204, 223, 205, 81, 175, 119, 212, 6, - 80, 214, 3, 230, 127, 179, 78, 164, 57, 187, 95, 96, 49, 19, 241, 57, - 18, 15, 167, 24, 120, 142, 113, 18, 75, 82, 1, 220, 223, 50, 96, 218, - 189, 255, 58, 48, 125, 215, 13, 207, 167, 64, 224, 235, 79, 89, 155, 233, - 82, 57, 13, 25, 240, 180, 127, 246, 173, 187, 187, 160, 131, 125, 189, 39, - 187, 99, 49, 77, 17, 107, 81, 57, 124, 76, 95, 110, 96, 158, 77, 241, - 163, 203, 168, 188, 107, 66, 229, 174, 95, 68, 123, 185, 22, 151, 57, 49, - 49, 178, 93, 177, 111, 154, 57, 190, 125, 253, 180, 161, 100, 94, 130, 6, - 146, 70, 200, 140, 182, 221, 149, 138, 163, 144, 54, 153, 90, 87, 211, 12, - 64, 65, 192, 13, 66, 18, 41, 130, 172, 147, 114, 128, 129, 206, 225, 107, - 66, 86, 248, 58, 34, 89, 160, 109, 70, 122, 21, 241, 109, 104, 146, 129, - 210, 164, 84, 34, 161, 163, 114, 119, 72, 43, 239, 211, 93, 2, 142, 233, - 229, 95, 149, 116, 216, 206, 105, 134, 181, 85, 108, 160, 211, 218, 13, 25, - 199, 100, 82, 20, 163, 166, 53, 151, 108, 179, 99, 191, 150, 246, 63, 58, - 59, 50, 30, 123, 88, 82, 114, 49, 125, 17, 204, 20, 164, 151, 136, 93, - 190, 106, 193, 238, 104, 66, 129, 173, 33, 90, 41, 235, 100, 68, 222, 141, - 10, 22, 135, 142, 183, 62, 63, 103, 201, 25, 116, 57, 118, 85, 169, 94, - 109, 175, 109, 200, 206, 88, 114, 249, 161, 55, 88, 64, 10, 4, 36, 145, - 45, 200, 135, 111, 60, 247, 46, 40, 93, 199, 131, 11, 50, 204, 57, 39, - 150, 101, 247, 181, 82, 198, 173, 196, 178, 122, 161, 40, 87, 221, 69, 74, - 71, 238, 105, 216, 58, 74, 163, 45, 207, 77, 54, 146, 200, 71, 7, 113, - 104, 118, 102, 203, 207, 154, 171, 137, 107, 217, 227, 182, 39, 223, 96, 16, - 134, 199, 130, 33, 149, 55, 200, 141, 136, 16, 41, 165, 246, 36, 12, 10, - 249, 52, 138, 234, 86, 29, 243, 174, 23, 124, 225, 138, 92, 205, 99, 135, - 46, 177, 176, 111, 50, 136, 54, 78, 88, 186, 187, 89, 151, 60, 183, 154, - 74, 164, 107, 189, 184, 29, 51, 124, 101, 51, 191, 161, 187, 223, 217, 51, - 240, 10, 47, 147, 73, 140, 74, 172, 91, 211, 78, 90, 150, 49, 93, 72, - 150, 105, 85, 37, 146, 34, 96, 77, 145, 166, 65, 66, 217, 151, 136, 187, - 150, 40, 0, 186, 59, 179, 37, 206, 243, 73, 221, 18, 147, 109, 183, 149, - 228, 239, 69, 70, 187, 83, 61, 166, 59, 82, 141, 165, 183, 227, 57, 151, - 72, 190, 122, 104, 11, 225, 199, 203, 142, 66, 73, 116, 100, 201, 159, 192, - 55, 84, 16, 140, 184, 238, 227, 69, 65, 66, 141, 74, 212, 160, 70, 219, - 136, 136, 17, 207, 46, 105, 18, 27, 9, 185, 8, 156, 205, 84, 232, 237, - 119, 161, 163, 83, 43, 33, 178, 125, 131, 4, 133, 212, 72, 93, 17, 248, - 184, 99, 148, 133, 149, 215, 221, 52, 55, 54, 126, 37, 18, 253, 48, 200, - 137, 183, 67, 90, 34, 184, 249, 18, 213, 136, 87, 93, 223, 106, 175, 253, - 90, 20, 194, 137, 63, 36, 3, 26, 171, 240, 210, 58, 61, 176, 96, 16, - 107, 131, 8, 239, 116, 188, 134, 36, 124, 21, 241, 101, 121, 238, 57, 82, - 231, 149, 229, 217, 12, 109, 134, 160, 100, 89, 43, 40, 31, 241, 136, 168, - 69, 215, 176, 88, 10, 104, 12, 87, 232, 244, 20, 55, 56, 242, 189, 190, - 101, 146, 88, 70, 229, 133, 226, 107, 210, 114, 247, 192, 28, 52, 66, 42, - 150, 69, 196, 15, 41, 198, 46, 229, 3, 8, 138, 46, 64, 130, 45, 106, - 73, 70, 103, 98, 49, 112, 199, 22, 223, 7, 237, 159, 160, 151, 92, 114, - 8, 100, 150, 1, 221, 171, 144, 124, 229, 186, 213, 193, 166, 192, 21, 99, - 154, 85, 117, 203, 89, 66, 215, 152, 80, 62, 229, 169, 189, 77, 226, 121, - 88, 235, 40, 191, 184, 253, 217, 121, 173, 131, 207, 205, 213, 148, 121, 194, - 238, 46, 229, 229, 183, 88, 71, 211, 36, 169, 251, 11, 168, 19, 17, 219, - 56, 34, 64, 240, 42, 27, 107, 69, 89, 16, 225, 77, 50, 12, 203, 112, - 221, 96, 190, 136, 162, 143, 149, 179, 20, 125, 9, 26, 1, 134, 91, 37, - 215, 209, 146, 195, 70, 108, 43, 151, 148, 86, 193, 201, 131, 249, 104, 103, - 76, 38, 53, 224, 95, 234, 107, 28, 228, 234, 107, 222, 92, 242, 223, 168, - 87, 97, 246, 96, 11, 247, 173, 248, 150, 217, 132, 44, 83, 243, 36, 39, - 99, 50, 19, 161, 68, 127, 112, 172, 101, 145, 233, 115, 129, 185, 173, 64, - 69, 120, 81, 56, 75, 23, 73, 189, 225, 116, 170, 181, 120, 19, 73, 4, - 35, 39, 19, 224, 71, 143, 135, 175, 74, 51, 120, 48, 129, 29, 235, 74, - 69, 35, 32, 211, 131, 46, 79, 12, 87, 253, 59, 226, 56, 210, 26, 39, - 99, 251, 196, 98, 134, 49, 143, 134, 236, 31, 67, 244, 146, 208, 183, 163, - 254, 111, 171, 100, 46, 132, 162, 12, 58, 5, 102, 241, 175, 205, 106, 195, - 138, 190, 166, 40, 30, 136, 154, 42, 214, 53, 124, 149, 15, 104, 178, 217, - 162, 242, 106, 90, 142, 1, 105, 154, 227, 227, 217, 7, 161, 252, 164, 219, - 251, 90, 174, 230, 196, 254, 128, 168, 62, 52, 58, 93, 76, 203, 230, 48, - 232, 38, 34, 233, 104, 142, 121, 50, 40, 200, 15, 232, 247, 238, 193, 168, - 170, 99, 172, 234, 182, 249, 50, 201, 11, 84, 161, 156, 20, 73, 222, 214, - 232, 112, 56, 32, 130, 46, 75, 197, 87, 142, 7, 225, 112, 160, 96, 150, - 194, 169, 7, 85, 124, 210, 136, 110, 231, 146, 37, 195, 209, 83, 24, 203, - 139, 94, 28, 92, 185, 160, 3, 102, 156, 109, 96, 107, 223, 67, 234, 156, - 190, 30, 209, 87, 122, 67, 183, 34, 112, 80, 161, 15, 140, 111, 84, 124, - 82, 212, 136, 113, 53, 7, 77, 61, 61, 99, 154, 228, 224, 188, 131, 161, - 203, 152, 123, 116, 239, 215, 163, 3, 128, 93, 125, 31, 221, 108, 121, 112, - 203, 182, 38, 211, 251, 143, 25, 58, 249, 130, 163, 151, 58, 120, 208, 215, - 219, 112, 48, 0, 156, 194, 255, 142, 2, 57, 37, 242, 243, 232, 120, 191, - 123, 221, 123, 52, 24, 236, 29, 194, 159, 103, 63, 255, 122, 180, 143, 253, - 28, 239, 195, 183, 189, 3, 76, 12, 129, 185, 2, 214, 221, 65, 216, 27, - 238, 133, 8, 206, 207, 251, 195, 193, 222, 222, 121, 39, 80, 110, 234, 22, - 20, 199, 47, 241, 92, 199, 165, 147, 203, 94, 110, 109, 158, 146, 128, 146, - 217, 55, 131, 216, 240, 29, 61, 9, 233, 95, 120, 28, 158, 119, 176, 83, - 224, 151, 220, 85, 84, 45, 35, 128, 63, 60, 134, 25, 88, 151, 193, 195, - 160, 130, 157, 10, 79, 30, 227, 152, 6, 193, 249, 249, 185, 214, 36, 184, - 111, 232, 243, 120, 122, 134, 55, 200, 157, 119, 118, 127, 30, 193, 32, 31, - 63, 220, 59, 124, 252, 236, 151, 81, 119, 35, 95, 225, 213, 125, 188, 138, - 165, 215, 133, 193, 30, 252, 2, 3, 62, 60, 30, 236, 237, 99, 100, 55, - 13, 116, 143, 80, 241, 203, 222, 222, 174, 23, 221, 180, 1, 86, 69, 181, - 166, 147, 3, 172, 135, 163, 83, 143, 86, 172, 111, 120, 232, 116, 56, 158, - 6, 143, 232, 203, 148, 190, 177, 204, 14, 95, 7, 86, 83, 240, 19, 96, - 190, 6, 152, 54, 240, 15, 193, 249, 176, 247, 43, 126, 60, 220, 167, 24, - 247, 253, 205, 254, 135, 253, 99, 2, 139, 229, 96, 3, 216, 79, 228, 155, - 225, 252, 179, 74, 224, 2, 152, 178, 98, 94, 248, 32, 26, 176, 183, 224, - 59, 64, 223, 195, 47, 161, 118, 56, 128, 255, 61, 58, 38, 26, 129, 255, - 33, 241, 162, 129, 255, 26, 179, 57, 132, 3, 70, 253, 48, 176, 55, 52, - 192, 97, 112, 32, 211, 51, 232, 63, 164, 43, 155, 237, 201, 144, 87, 172, - 57, 9, 122, 131, 254, 80, 163, 224, 161, 11, 255, 119, 184, 95, 240, 42, - 66, 119, 149, 88, 71, 65, 2, 73, 83, 31, 252, 156, 25, 34, 56, 26, - 96, 149, 117, 5, 237, 13, 31, 1, 113, 19, 133, 233, 217, 191, 89, 119, - 31, 51, 37, 221, 134, 91, 190, 3, 137, 217, 64, 239, 203, 187, 131, 254, - 35, 64, 2, 236, 212, 208, 200, 206, 243, 47, 112, 217, 241, 237, 38, 137, - 170, 0, 88, 26, 132, 79, 7, 176, 156, 112, 228, 82, 250, 229, 128, 127, - 56, 109, 170, 247, 2, 68, 49, 224, 246, 9, 135, 23, 42, 60, 28, 27, - 234, 48, 52, 177, 109, 79, 192, 224, 4, 217, 7, 208, 91, 172, 9, 103, - 27, 209, 17, 162, 189, 4, 118, 68, 212, 190, 57, 60, 98, 90, 63, 218, - 223, 32, 167, 249, 240, 235, 81, 239, 120, 55, 28, 156, 163, 133, 17, 5, - 80, 68, 108, 255, 145, 51, 30, 80, 69, 53, 18, 30, 225, 2, 205, 19, - 70, 255, 240, 145, 139, 163, 33, 17, 21, 224, 40, 78, 80, 171, 144, 82, - 131, 45, 88, 211, 253, 35, 167, 105, 123, 250, 134, 79, 0, 91, 143, 104, - 154, 76, 249, 209, 123, 98, 21, 152, 193, 100, 96, 74, 143, 223, 7, 88, - 130, 79, 100, 2, 26, 91, 145, 28, 134, 4, 214, 199, 121, 207, 175, 146, - 73, 28, 45, 81, 83, 78, 34, 239, 14, 7, 27, 103, 182, 25, 67, 29, - 160, 73, 132, 176, 115, 32, 9, 108, 175, 3, 245, 141, 47, 41, 159, 166, - 151, 193, 67, 172, 224, 246, 248, 125, 4, 220, 15, 53, 124, 49, 3, 53, - 53, 44, 137, 121, 153, 38, 203, 194, 203, 15, 241, 129, 180, 168, 68, 174, - 5, 198, 75, 151, 99, 118, 245, 157, 60, 24, 183, 75, 31, 40, 177, 109, - 52, 8, 198, 213, 10, 166, 123, 56, 234, 116, 228, 235, 209, 168, 19, 180, - 20, 186, 191, 85, 168, 86, 248, 218, 130, 30, 128, 250, 111, 114, 188, 12, - 107, 103, 12, 27, 89, 153, 96, 50, 142, 100, 239, 22, 177, 102, 126, 143, - 48, 163, 107, 153, 244, 228, 103, 64, 14, 9, 171, 126, 103, 175, 19, 96, - 126, 155, 230, 91, 29, 152, 140, 7, 80, 54, 234, 224, 224, 97, 228, 44, - 127, 78, 120, 252, 39, 193, 119, 63, 125, 243, 203, 139, 243, 221, 42, 120, - 29, 205, 81, 18, 3, 132, 115, 196, 22, 139, 42, 232, 131, 238, 40, 153, - 213, 61, 154, 20, 168, 242, 185, 213, 232, 223, 197, 140, 143, 243, 0, 189, - 194, 206, 126, 187, 227, 64, 164, 219, 10, 161, 135, 213, 134, 157, 251, 221, - 120, 15, 56, 204, 224, 73, 239, 104, 48, 124, 26, 6, 47, 163, 203, 116, - 26, 188, 171, 226, 197, 122, 185, 2, 217, 192, 14, 17, 53, 189, 118, 186, - 139, 186, 94, 85, 39, 135, 135, 248, 187, 159, 172, 247, 52, 160, 132, 210, - 179, 221, 157, 157, 113, 178, 251, 30, 118, 215, 219, 96, 25, 116, 198, 73, - 112, 18, 36, 103, 200, 175, 208, 82, 121, 206, 168, 185, 12, 14, 130, 49, - 150, 34, 152, 193, 101, 208, 115, 167, 206, 144, 129, 20, 28, 140, 134, 15, - 120, 182, 110, 64, 30, 31, 118, 118, 111, 129, 207, 49, 51, 191, 217, 237, - 237, 222, 98, 131, 15, 176, 61, 196, 183, 2, 104, 41, 159, 147, 29, 213, - 76, 167, 31, 192, 203, 92, 81, 72, 146, 201, 71, 181, 173, 107, 98, 7, - 183, 55, 245, 173, 70, 28, 82, 42, 194, 89, 46, 251, 77, 37, 65, 67, - 171, 129, 216, 217, 231, 202, 92, 113, 86, 128, 222, 87, 182, 107, 105, 64, - 75, 5, 104, 103, 127, 31, 246, 44, 218, 177, 40, 19, 165, 40, 73, 167, - 95, 191, 253, 225, 251, 191, 189, 251, 230, 251, 95, 130, 55, 63, 4, 255, - 56, 253, 233, 167, 211, 55, 239, 126, 121, 38, 39, 241, 248, 254, 100, 188, - 72, 174, 62, 9, 26, 147, 19, 224, 69, 121, 106, 122, 12, 68, 178, 20, - 22, 245, 50, 179, 144, 60, 26, 252, 15, 44, 10, 1, 102, 212, 249, 234, - 112, 86, 228, 245, 243, 175, 14, 39, 207, 59, 82, 10, 203, 229, 171, 201, - 243, 175, 176, 156, 185, 223, 232, 188, 243, 249, 83, 148, 131, 128, 99, 235, - 90, 115, 95, 173, 193, 224, 169, 91, 107, 185, 173, 173, 167, 118, 173, 216, - 223, 214, 35, 85, 11, 231, 170, 71, 147, 245, 213, 103, 47, 127, 120, 241, - 238, 151, 31, 191, 9, 8, 107, 63, 254, 237, 235, 239, 97, 146, 206, 59, - 189, 195, 195, 127, 28, 191, 56, 60, 124, 249, 238, 101, 240, 243, 95, 223, - 189, 254, 30, 54, 148, 65, 240, 14, 239, 200, 74, 217, 80, 114, 120, 248, - 205, 27, 220, 135, 59, 56, 55, 48, 53, 87, 87, 87, 253, 171, 227, 126, - 81, 206, 15, 223, 253, 116, 120, 141, 205, 13, 241, 117, 249, 218, 171, 173, - 119, 251, 211, 122, 10, 128, 192, 66, 252, 234, 179, 94, 239, 115, 9, 33, - 32, 53, 12, 32, 229, 105, 236, 227, 107, 208, 65, 175, 71, 245, 144, 101, - 167, 83, 120, 138, 103, 149, 199, 108, 173, 145, 38, 244, 163, 186, 88, 141, - 49, 106, 35, 129, 7, 86, 41, 136, 76, 99, 120, 4, 133, 63, 41, 51, - 195, 87, 135, 240, 248, 57, 255, 117, 154, 224, 77, 175, 253, 62, 150, 151, - 9, 38, 229, 43, 11, 233, 118, 113, 244, 252, 71, 220, 137, 96, 243, 255, - 234, 16, 126, 96, 217, 58, 163, 143, 44, 125, 78, 118, 123, 101, 204, 16, - 119, 188, 100, 179, 152, 6, 107, 146, 250, 80, 32, 253, 42, 10, 22, 101, - 50, 27, 57, 104, 156, 231, 107, 194, 99, 150, 66, 183, 160, 18, 31, 206, - 166, 89, 111, 216, 63, 238, 215, 215, 53, 116, 254, 221, 155, 191, 5, 223, - 150, 73, 18, 188, 116, 108, 37, 223, 115, 237, 175, 14, 163, 231, 161, 246, - 128, 226, 91, 95, 65, 67, 10, 172, 83, 171, 71, 38, 78, 133, 146, 254, - 106, 58, 131, 198, 241, 67, 189, 141, 77, 105, 117, 220, 30, 139, 54, 20, - 58, 109, 255, 67, 172, 64, 213, 122, 62, 71, 151, 35, 158, 160, 160, 8, - 121, 211, 101, 189, 70, 217, 16, 136, 135, 238, 26, 237, 87, 60, 199, 207, - 233, 248, 91, 160, 30, 6, 43, 212, 10, 169, 115, 182, 56, 72, 90, 2, - 82, 163, 75, 118, 114, 247, 102, 37, 104, 176, 211, 140, 238, 214, 1, 97, - 70, 31, 28, 88, 22, 149, 206, 79, 160, 120, 206, 36, 170, 210, 184, 50, - 176, 30, 202, 52, 193, 164, 1, 104, 66, 58, 49, 192, 241, 142, 140, 159, - 100, 43, 229, 228, 11, 8, 132, 103, 114, 205, 128, 62, 23, 38, 131, 235, - 234, 239, 6, 107, 54, 90, 218, 149, 135, 80, 153, 54, 113, 167, 234, 93, - 205, 31, 193, 27, 63, 144, 69, 53, 99, 216, 174, 235, 143, 119, 115, 12, - 47, 241, 246, 107, 69, 252, 144, 115, 143, 238, 100, 4, 190, 48, 223, 124, - 188, 149, 135, 216, 10, 251, 75, 102, 228, 100, 215, 54, 33, 117, 178, 249, - 227, 109, 60, 194, 54, 114, 178, 11, 96, 216, 54, 185, 95, 62, 254, 214, - 99, 120, 235, 133, 10, 10, 32, 8, 40, 100, 132, 66, 13, 208, 186, 244, - 241, 22, 190, 84, 253, 30, 138, 57, 64, 110, 39, 73, 147, 123, 188, 252, - 4, 94, 126, 107, 31, 187, 43, 49, 34, 252, 227, 239, 61, 133, 247, 94, - 251, 77, 10, 247, 120, 123, 56, 208, 179, 214, 12, 115, 191, 199, 203, 72, - 89, 254, 160, 56, 231, 229, 195, 187, 104, 109, 136, 196, 214, 116, 26, 220, - 131, 82, 209, 109, 173, 201, 251, 59, 62, 135, 193, 124, 250, 78, 200, 245, - 107, 71, 141, 201, 186, 215, 75, 199, 10, 86, 251, 158, 191, 123, 189, 249, - 176, 57, 77, 250, 92, 213, 189, 94, 71, 146, 150, 203, 224, 62, 185, 107, - 38, 108, 180, 170, 124, 250, 187, 72, 210, 223, 73, 58, 217, 79, 127, 27, - 105, 250, 91, 210, 167, 128, 68, 238, 245, 6, 82, 243, 183, 160, 200, 174, - 49, 129, 2, 176, 29, 82, 130, 238, 217, 155, 69, 203, 152, 140, 242, 190, - 93, 18, 21, 191, 230, 91, 57, 173, 147, 148, 247, 123, 23, 169, 200, 142, - 156, 189, 223, 91, 199, 52, 35, 184, 185, 103, 1, 250, 44, 239, 247, 22, - 146, 208, 105, 89, 70, 155, 42, 172, 211, 76, 114, 253, 114, 228, 249, 253, - 26, 120, 68, 13, 112, 186, 144, 251, 189, 129, 164, 243, 143, 168, 92, 225, - 109, 132, 247, 123, 3, 9, 230, 101, 130, 38, 223, 232, 254, 107, 113, 136, - 132, 242, 181, 152, 96, 121, 88, 116, 74, 239, 126, 47, 63, 213, 211, 174, - 12, 222, 149, 184, 73, 166, 73, 113, 79, 102, 48, 224, 25, 185, 76, 242, - 148, 252, 66, 58, 133, 193, 253, 94, 71, 18, 162, 92, 132, 142, 230, 238, - 229, 102, 91, 219, 56, 178, 246, 31, 125, 36, 230, 19, 248, 40, 18, 85, - 195, 19, 227, 125, 91, 68, 16, 75, 146, 64, 201, 68, 75, 19, 40, 165, - 192, 107, 88, 19, 246, 145, 134, 84, 63, 1, 14, 132, 47, 76, 158, 147, - 6, 142, 106, 199, 125, 180, 112, 209, 82, 28, 21, 92, 105, 219, 141, 14, - 208, 243, 204, 61, 108, 85, 195, 59, 216, 173, 52, 249, 9, 154, 248, 95, - 146, 8, 115, 167, 60, 51, 32, 116, 93, 113, 216, 210, 248, 0, 130, 70, - 9, 226, 100, 143, 208, 136, 88, 121, 192, 154, 105, 111, 139, 169, 196, 209, - 194, 27, 250, 33, 42, 225, 90, 121, 21, 153, 80, 77, 37, 139, 133, 95, - 165, 75, 88, 4, 89, 61, 194, 136, 139, 96, 66, 135, 88, 225, 59, 217, - 219, 202, 24, 190, 193, 243, 67, 140, 10, 65, 53, 163, 191, 202, 231, 240, - 224, 240, 249, 95, 242, 73, 181, 122, 198, 127, 105, 222, 221, 121, 238, 24, - 245, 29, 186, 216, 25, 106, 81, 211, 214, 177, 141, 50, 46, 64, 27, 64, - 113, 212, 59, 251, 60, 122, 143, 90, 222, 172, 143, 152, 154, 148, 135, 207, - 91, 122, 161, 154, 224, 127, 89, 71, 255, 132, 185, 3, 253, 157, 135, 171, - 117, 101, 154, 200, 186, 230, 79, 165, 149, 181, 213, 51, 30, 92, 107, 74, - 212, 44, 160, 222, 112, 200, 117, 208, 227, 67, 211, 224, 105, 206, 163, 115, - 198, 138, 104, 27, 106, 167, 167, 170, 180, 111, 213, 235, 180, 109, 16, 24, - 117, 121, 13, 248, 231, 245, 50, 50, 43, 231, 143, 217, 34, 206, 207, 255, - 136, 45, 226, 255, 253, 223, 243, 115, 138, 37, 154, 131, 86, 188, 58, 63, - 127, 17, 231, 255, 239, 255, 118, 2, 177, 202, 248, 158, 79, 204, 243, 210, - 247, 188, 52, 207, 231, 190, 231, 115, 243, 60, 254, 72, 251, 75, 128, 150, - 12, 102, 108, 223, 58, 87, 250, 37, 5, 149, 156, 69, 15, 87, 17, 240, - 136, 112, 56, 232, 63, 90, 213, 97, 125, 85, 96, 100, 199, 251, 155, 73, - 81, 92, 220, 194, 196, 156, 159, 175, 49, 60, 36, 190, 128, 41, 191, 89, - 108, 160, 42, 144, 94, 56, 139, 242, 120, 179, 152, 150, 33, 173, 153, 52, - 190, 14, 163, 101, 85, 109, 150, 19, 252, 68, 55, 95, 136, 103, 179, 171, - 112, 25, 93, 36, 233, 244, 58, 204, 56, 156, 3, 239, 100, 128, 197, 192, - 237, 202, 171, 120, 137, 245, 226, 230, 6, 87, 246, 45, 63, 32, 173, 180, - 222, 100, 201, 13, 117, 3, 90, 103, 154, 243, 147, 12, 39, 253, 236, 252, - 220, 148, 223, 220, 222, 156, 159, 163, 150, 54, 153, 193, 231, 34, 193, 119, - 111, 223, 223, 180, 170, 16, 201, 97, 20, 134, 244, 81, 250, 91, 194, 99, - 79, 84, 203, 211, 68, 179, 23, 110, 40, 70, 42, 189, 225, 239, 85, 82, - 195, 78, 62, 135, 225, 112, 237, 171, 116, 90, 47, 110, 111, 30, 43, 240, - 237, 231, 43, 76, 117, 50, 133, 105, 184, 189, 25, 172, 226, 246, 243, 98, - 58, 197, 137, 0, 96, 230, 240, 250, 205, 240, 17, 78, 79, 187, 26, 70, - 223, 221, 81, 79, 238, 50, 189, 1, 246, 58, 77, 86, 8, 204, 80, 158, - 101, 197, 106, 181, 17, 184, 57, 166, 139, 166, 230, 38, 142, 110, 111, 202, - 249, 4, 160, 234, 63, 65, 7, 133, 167, 198, 68, 213, 8, 7, 253, 35, - 248, 247, 216, 83, 39, 182, 234, 60, 242, 182, 50, 213, 253, 60, 14, 229, - 159, 174, 69, 43, 0, 70, 167, 65, 114, 158, 76, 204, 147, 137, 251, 100, - 110, 158, 196, 238, 147, 216, 60, 153, 186, 79, 114, 253, 100, 146, 1, 153, - 219, 15, 73, 138, 129, 199, 120, 192, 163, 76, 200, 162, 86, 110, 110, 194, - 91, 32, 135, 80, 234, 229, 201, 149, 200, 58, 80, 239, 69, 116, 123, 54, - 124, 47, 147, 111, 208, 249, 249, 208, 91, 121, 210, 174, 60, 217, 90, 57, - 110, 87, 142, 183, 86, 158, 182, 43, 79, 173, 202, 160, 103, 195, 218, 2, - 250, 158, 20, 215, 76, 137, 252, 197, 34, 217, 243, 115, 202, 146, 120, 195, - 86, 186, 219, 243, 243, 75, 50, 115, 239, 223, 28, 197, 75, 248, 37, 140, - 90, 173, 224, 51, 122, 107, 52, 132, 135, 239, 111, 152, 231, 69, 121, 206, - 91, 3, 212, 198, 255, 212, 251, 67, 120, 31, 90, 255, 235, 122, 142, 188, - 150, 151, 212, 13, 6, 174, 252, 21, 96, 39, 158, 131, 181, 161, 6, 103, - 65, 49, 142, 9, 230, 234, 13, 113, 200, 211, 56, 20, 129, 48, 173, 0, - 191, 149, 33, 71, 235, 26, 228, 74, 104, 246, 123, 202, 129, 3, 195, 155, - 181, 164, 164, 243, 243, 221, 68, 152, 67, 98, 240, 137, 131, 157, 38, 215, - 24, 38, 118, 243, 10, 191, 217, 202, 58, 87, 39, 38, 135, 143, 152, 71, - 85, 53, 44, 188, 27, 78, 240, 95, 141, 240, 160, 242, 44, 75, 174, 41, - 234, 142, 237, 99, 200, 218, 70, 48, 103, 228, 45, 198, 141, 153, 155, 97, - 140, 43, 238, 108, 154, 166, 233, 226, 137, 67, 171, 89, 49, 83, 54, 51, - 230, 63, 139, 104, 5, 35, 221, 191, 81, 38, 82, 181, 246, 73, 226, 217, - 191, 17, 99, 37, 150, 6, 247, 52, 149, 234, 121, 185, 219, 254, 121, 235, - 26, 63, 207, 197, 83, 249, 19, 26, 34, 41, 198, 29, 70, 30, 136, 101, - 149, 44, 97, 21, 166, 184, 128, 253, 164, 204, 110, 238, 105, 131, 189, 165, - 86, 255, 75, 53, 125, 74, 119, 27, 227, 129, 61, 235, 220, 137, 99, 51, - 213, 41, 214, 77, 132, 101, 84, 159, 48, 149, 168, 126, 45, 241, 232, 208, - 24, 101, 201, 66, 122, 219, 119, 145, 247, 186, 168, 83, 118, 207, 211, 84, - 7, 184, 16, 111, 68, 120, 187, 229, 64, 46, 28, 101, 111, 198, 122, 251, - 20, 77, 27, 121, 79, 82, 116, 146, 126, 122, 85, 148, 156, 132, 191, 25, - 232, 21, 110, 65, 254, 139, 228, 197, 171, 239, 191, 135, 151, 1, 237, 85, - 49, 171, 175, 56, 26, 148, 113, 131, 48, 116, 191, 255, 238, 199, 239, 123, - 148, 72, 10, 72, 240, 16, 154, 198, 223, 168, 190, 3, 160, 48, 96, 78, - 91, 32, 150, 220, 74, 199, 135, 82, 74, 90, 157, 206, 177, 146, 83, 30, - 49, 7, 104, 29, 106, 251, 70, 114, 200, 94, 224, 67, 149, 165, 33, 105, - 132, 170, 161, 157, 12, 179, 124, 132, 24, 181, 50, 215, 137, 73, 49, 107, - 3, 93, 35, 167, 147, 55, 212, 69, 112, 252, 242, 160, 182, 52, 83, 52, - 26, 83, 46, 26, 10, 213, 43, 57, 131, 86, 51, 142, 11, 26, 94, 144, - 30, 202, 60, 6, 59, 56, 122, 105, 199, 72, 81, 172, 27, 145, 196, 119, - 187, 40, 67, 55, 7, 38, 7, 155, 213, 122, 66, 123, 38, 140, 130, 87, - 5, 254, 8, 118, 153, 190, 235, 154, 88, 213, 237, 110, 72, 49, 88, 180, - 160, 123, 68, 92, 20, 130, 7, 224, 175, 57, 45, 127, 115, 214, 155, 17, - 123, 51, 101, 180, 81, 25, 90, 65, 60, 205, 200, 247, 169, 162, 74, 1, - 95, 53, 77, 185, 219, 146, 138, 21, 79, 36, 187, 103, 160, 77, 237, 52, - 155, 57, 37, 127, 225, 163, 70, 164, 86, 146, 150, 121, 129, 209, 171, 223, - 9, 227, 149, 18, 77, 39, 213, 58, 149, 59, 164, 90, 99, 205, 210, 137, - 25, 46, 49, 215, 48, 192, 124, 159, 145, 68, 3, 163, 255, 160, 87, 69, - 51, 182, 134, 46, 157, 44, 100, 160, 106, 30, 28, 180, 7, 14, 77, 150, - 120, 173, 11, 159, 243, 2, 212, 93, 168, 76, 39, 105, 57, 237, 225, 129, - 3, 138, 48, 206, 36, 211, 61, 7, 41, 190, 170, 119, 43, 117, 46, 247, - 244, 199, 87, 234, 134, 103, 104, 22, 118, 147, 229, 18, 3, 108, 241, 24, - 221, 116, 74, 145, 173, 46, 194, 52, 166, 57, 156, 51, 45, 3, 12, 214, - 214, 163, 87, 57, 246, 151, 120, 174, 43, 153, 205, 232, 214, 192, 110, 20, - 188, 160, 142, 92, 166, 96, 157, 70, 106, 161, 138, 232, 170, 247, 127, 106, - 198, 213, 42, 91, 207, 49, 219, 37, 142, 146, 226, 110, 92, 152, 226, 104, - 21, 77, 210, 44, 69, 83, 183, 154, 45, 198, 20, 72, 12, 5, 64, 162, - 236, 58, 43, 144, 35, 41, 62, 88, 195, 251, 221, 171, 215, 63, 210, 163, - 255, 93, 166, 156, 45, 36, 120, 205, 215, 114, 71, 121, 240, 104, 48, 144, - 128, 12, 73, 14, 146, 225, 92, 108, 236, 236, 108, 149, 78, 215, 138, 167, - 72, 231, 152, 95, 184, 171, 140, 92, 97, 240, 53, 74, 51, 0, 236, 95, - 208, 183, 83, 39, 104, 46, 64, 67, 40, 126, 230, 0, 24, 126, 123, 153, - 232, 164, 222, 156, 103, 217, 54, 95, 225, 99, 82, 59, 195, 224, 219, 52, - 91, 6, 201, 82, 236, 159, 240, 155, 44, 111, 97, 240, 61, 6, 16, 226, - 39, 25, 33, 176, 171, 106, 17, 225, 209, 225, 48, 248, 49, 170, 241, 214, - 31, 110, 246, 39, 101, 35, 12, 225, 43, 224, 161, 12, 131, 183, 138, 43, - 132, 1, 72, 169, 125, 255, 68, 184, 152, 254, 129, 88, 63, 79, 202, 85, - 50, 161, 72, 103, 12, 234, 70, 114, 65, 34, 34, 78, 80, 113, 108, 138, - 9, 29, 183, 232, 53, 202, 0, 71, 64, 35, 203, 74, 242, 197, 167, 165, - 230, 57, 156, 237, 31, 51, 23, 243, 34, 198, 14, 80, 97, 175, 248, 40, - 77, 11, 180, 255, 0, 68, 51, 40, 255, 167, 238, 193, 182, 158, 76, 13, - 15, 34, 126, 15, 179, 149, 245, 80, 9, 178, 33, 0, 14, 72, 166, 57, - 9, 173, 145, 124, 240, 154, 137, 114, 220, 13, 157, 151, 225, 106, 116, 206, - 157, 251, 71, 161, 198, 226, 101, 237, 173, 104, 6, 91, 32, 93, 72, 159, - 171, 204, 203, 120, 196, 6, 122, 148, 160, 95, 230, 42, 32, 137, 104, 119, - 146, 186, 159, 145, 182, 0, 154, 29, 99, 230, 198, 95, 51, 101, 191, 22, - 155, 34, 111, 8, 248, 91, 109, 9, 58, 33, 137, 203, 215, 27, 91, 133, - 58, 91, 165, 206, 175, 147, 0, 5, 4, 152, 56, 108, 157, 147, 195, 145, - 95, 147, 156, 143, 10, 90, 78, 95, 88, 233, 219, 226, 244, 110, 82, 194, - 254, 210, 61, 168, 247, 236, 45, 100, 150, 21, 81, 173, 18, 228, 235, 254, - 69, 126, 240, 239, 224, 148, 115, 44, 55, 187, 245, 137, 160, 143, 15, 168, - 100, 176, 201, 173, 41, 9, 158, 28, 41, 184, 174, 41, 206, 149, 141, 54, - 226, 250, 113, 26, 237, 225, 57, 128, 58, 209, 7, 94, 145, 184, 84, 154, - 90, 58, 76, 131, 167, 45, 173, 84, 63, 42, 46, 154, 86, 58, 12, 138, - 147, 229, 2, 210, 190, 230, 147, 114, 87, 209, 166, 185, 113, 40, 94, 128, - 130, 32, 112, 21, 202, 116, 128, 254, 179, 40, 199, 59, 68, 84, 80, 21, - 154, 53, 244, 105, 157, 59, 214, 2, 49, 39, 77, 18, 221, 165, 102, 65, - 24, 65, 186, 183, 29, 121, 152, 234, 137, 78, 27, 51, 169, 41, 156, 240, - 166, 130, 28, 17, 83, 22, 4, 64, 221, 114, 116, 118, 77, 249, 226, 173, - 188, 27, 160, 90, 215, 200, 128, 160, 83, 73, 57, 16, 82, 182, 130, 16, - 147, 233, 254, 240, 246, 103, 150, 100, 26, 98, 42, 110, 43, 120, 48, 175, - 41, 48, 41, 17, 41, 232, 114, 65, 239, 133, 18, 143, 248, 55, 38, 68, - 76, 81, 174, 64, 59, 169, 202, 108, 57, 5, 225, 8, 20, 97, 115, 64, - 128, 205, 183, 239, 96, 109, 106, 215, 54, 218, 120, 129, 12, 38, 5, 249, - 172, 54, 116, 111, 207, 139, 40, 201, 15, 129, 11, 82, 94, 87, 224, 191, - 160, 62, 192, 84, 243, 201, 163, 42, 137, 202, 120, 129, 147, 137, 212, 68, - 140, 40, 151, 51, 159, 73, 54, 53, 247, 190, 218, 108, 1, 131, 251, 167, - 64, 17, 27, 242, 160, 87, 13, 41, 84, 148, 160, 91, 51, 11, 145, 54, - 71, 144, 12, 115, 114, 123, 31, 83, 244, 173, 53, 147, 242, 31, 106, 161, - 170, 121, 35, 246, 111, 83, 182, 62, 193, 226, 76, 186, 212, 185, 29, 187, - 40, 157, 117, 189, 114, 248, 237, 222, 173, 173, 204, 220, 144, 53, 249, 214, - 49, 247, 41, 155, 178, 216, 251, 232, 132, 93, 128, 161, 92, 198, 242, 250, - 95, 44, 231, 75, 205, 155, 157, 225, 173, 223, 194, 123, 71, 19, 162, 119, - 118, 212, 47, 150, 33, 65, 165, 19, 3, 214, 237, 25, 31, 81, 196, 227, - 64, 163, 255, 247, 127, 223, 75, 69, 29, 20, 198, 124, 218, 170, 175, 203, - 89, 219, 195, 44, 88, 30, 27, 178, 50, 98, 218, 70, 100, 80, 204, 75, - 146, 24, 88, 177, 164, 193, 237, 0, 124, 255, 92, 131, 56, 176, 243, 95, - 223, 240, 5, 10, 74, 241, 33, 146, 145, 109, 66, 171, 144, 30, 115, 41, - 144, 41, 247, 195, 214, 192, 254, 187, 191, 106, 99, 244, 16, 222, 127, 208, - 127, 251, 215, 224, 205, 233, 235, 111, 240, 59, 133, 90, 158, 159, 247, 130, - 31, 97, 95, 3, 240, 61, 132, 107, 238, 252, 48, 73, 203, 85, 123, 154, - 163, 246, 177, 49, 213, 248, 95, 191, 249, 254, 199, 115, 188, 241, 9, 33, - 83, 246, 211, 243, 243, 217, 79, 150, 185, 20, 126, 126, 109, 89, 71, 45, - 67, 168, 101, 243, 180, 43, 145, 137, 211, 178, 218, 142, 252, 241, 159, 170, - 187, 241, 248, 141, 213, 219, 120, 108, 119, 102, 253, 138, 249, 215, 31, 143, - 27, 117, 8, 151, 49, 255, 135, 2, 18, 105, 168, 255, 66, 16, 34, 225, - 247, 174, 0, 68, 134, 45, 131, 22, 9, 156, 125, 4, 231, 1, 31, 76, - 77, 198, 24, 97, 201, 51, 20, 18, 230, 90, 15, 190, 166, 7, 95, 183, - 30, 64, 241, 185, 252, 215, 120, 134, 205, 240, 67, 104, 181, 249, 232, 107, - 245, 232, 107, 179, 48, 111, 6, 97, 125, 43, 224, 227, 221, 33, 153, 187, - 126, 4, 183, 237, 104, 201, 157, 206, 126, 231, 1, 136, 69, 227, 203, 26, - 3, 242, 145, 242, 123, 24, 183, 126, 51, 216, 225, 162, 231, 131, 91, 139, - 12, 143, 143, 207, 6, 207, 224, 127, 75, 139, 32, 184, 240, 120, 248, 236, - 209, 211, 165, 69, 137, 82, 124, 100, 23, 47, 117, 241, 35, 42, 54, 65, - 130, 82, 252, 216, 174, 61, 225, 226, 33, 212, 155, 165, 1, 142, 244, 243, - 127, 199, 59, 23, 196, 182, 33, 191, 78, 116, 120, 182, 202, 52, 167, 108, - 31, 234, 48, 35, 158, 158, 156, 82, 170, 63, 245, 132, 134, 249, 64, 7, - 207, 198, 139, 98, 204, 85, 236, 48, 90, 242, 143, 236, 252, 250, 124, 212, - 27, 222, 6, 99, 140, 194, 36, 151, 70, 123, 221, 156, 189, 127, 176, 206, - 213, 209, 189, 113, 66, 115, 114, 137, 125, 184, 112, 98, 62, 65, 140, 252, - 57, 12, 126, 160, 168, 18, 41, 151, 32, 241, 147, 64, 194, 197, 199, 196, - 208, 158, 143, 6, 116, 145, 10, 251, 240, 159, 195, 15, 100, 198, 234, 39, - 62, 4, 46, 139, 186, 222, 152, 76, 139, 78, 9, 200, 237, 176, 3, 65, - 17, 52, 218, 61, 216, 211, 120, 122, 69, 247, 93, 240, 89, 202, 82, 219, - 61, 36, 63, 29, 201, 215, 86, 150, 6, 130, 165, 175, 223, 165, 163, 180, - 187, 26, 160, 209, 104, 32, 9, 129, 5, 124, 150, 215, 249, 250, 83, 226, - 48, 250, 186, 29, 146, 102, 9, 50, 228, 127, 185, 62, 158, 104, 218, 126, - 233, 28, 179, 62, 9, 118, 109, 68, 64, 71, 65, 87, 9, 155, 252, 96, - 47, 180, 33, 25, 98, 242, 89, 11, 57, 248, 2, 157, 161, 116, 16, 52, - 114, 145, 227, 180, 138, 123, 206, 158, 2, 7, 68, 240, 26, 96, 234, 224, - 39, 229, 179, 234, 132, 99, 144, 89, 64, 130, 70, 134, 241, 124, 224, 197, - 38, 75, 66, 182, 60, 249, 226, 251, 191, 189, 171, 212, 205, 62, 214, 93, - 62, 188, 67, 224, 230, 7, 76, 95, 183, 181, 171, 123, 211, 215, 206, 222, - 4, 143, 7, 32, 173, 252, 78, 31, 227, 25, 90, 25, 156, 31, 227, 8, - 32, 255, 61, 136, 230, 179, 104, 28, 173, 174, 199, 184, 122, 173, 159, 71, - 143, 212, 47, 128, 42, 78, 171, 200, 174, 0, 131, 6, 244, 146, 110, 97, - 23, 131, 2, 83, 71, 227, 35, 46, 200, 210, 36, 31, 207, 41, 127, 36, - 252, 202, 163, 172, 152, 207, 174, 199, 152, 78, 97, 60, 124, 242, 229, 128, - 223, 182, 31, 21, 217, 116, 76, 150, 219, 113, 186, 165, 120, 107, 185, 243, - 160, 74, 86, 105, 212, 110, 30, 141, 2, 242, 44, 221, 86, 142, 15, 200, - 71, 49, 198, 179, 71, 164, 213, 83, 9, 166, 201, 24, 79, 54, 152, 122, - 157, 126, 175, 147, 241, 178, 200, 11, 248, 206, 56, 40, 49, 180, 243, 119, - 140, 142, 195, 51, 241, 132, 95, 235, 39, 222, 59, 93, 98, 214, 239, 223, - 41, 234, 40, 89, 226, 67, 169, 163, 230, 197, 158, 18, 249, 78, 0, 234, - 159, 238, 155, 83, 192, 245, 101, 202, 47, 174, 175, 129, 208, 129, 116, 75, - 110, 104, 253, 91, 122, 252, 104, 136, 248, 133, 229, 147, 1, 121, 172, 218, - 165, 203, 200, 45, 92, 87, 43, 183, 226, 177, 247, 245, 99, 223, 235, 199, - 205, 215, 199, 195, 199, 131, 216, 254, 62, 62, 112, 127, 185, 63, 123, 234, - 215, 195, 193, 96, 97, 127, 55, 175, 241, 47, 247, 167, 126, 237, 201, 96, - 240, 193, 254, 110, 94, 227, 95, 238, 79, 253, 90, 4, 210, 35, 209, 244, - 76, 149, 204, 86, 61, 248, 25, 55, 126, 154, 230, 116, 129, 167, 196, 83, - 164, 38, 211, 46, 237, 181, 10, 90, 37, 49, 154, 70, 61, 101, 109, 56, - 184, 212, 95, 236, 109, 214, 211, 91, 174, 50, 54, 109, 41, 111, 247, 106, - 158, 220, 245, 232, 174, 103, 62, 196, 232, 199, 91, 33, 116, 129, 63, 6, - 197, 121, 210, 252, 237, 0, 43, 37, 190, 162, 118, 89, 171, 105, 79, 111, - 227, 69, 220, 42, 242, 160, 207, 125, 224, 1, 201, 143, 192, 214, 179, 59, - 30, 182, 65, 187, 3, 73, 230, 89, 66, 249, 118, 244, 227, 177, 77, 236, - 105, 6, 234, 7, 166, 83, 204, 128, 129, 31, 51, 7, 247, 63, 48, 35, - 242, 60, 186, 227, 89, 175, 241, 104, 177, 122, 212, 46, 105, 53, 78, 101, - 190, 66, 221, 92, 158, 20, 171, 40, 71, 86, 50, 240, 20, 153, 6, 157, - 66, 111, 105, 179, 73, 186, 64, 72, 182, 55, 42, 39, 143, 143, 203, 51, - 164, 232, 161, 183, 232, 90, 21, 85, 24, 65, 16, 217, 77, 85, 107, 208, - 235, 182, 22, 25, 168, 157, 66, 111, 105, 175, 85, 248, 216, 211, 230, 99, - 111, 163, 143, 253, 173, 62, 246, 53, 123, 212, 110, 21, 167, 245, 26, 134, - 219, 44, 127, 216, 174, 250, 208, 215, 255, 67, 111, 247, 15, 125, 189, 63, - 105, 55, 249, 196, 215, 228, 19, 111, 147, 79, 124, 77, 46, 230, 94, 84, - 161, 85, 217, 59, 47, 215, 120, 236, 199, 6, 228, 50, 201, 112, 162, 31, - 233, 130, 107, 58, 23, 4, 82, 132, 108, 46, 151, 71, 237, 39, 156, 103, - 6, 248, 241, 2, 196, 101, 80, 154, 134, 237, 42, 128, 81, 92, 180, 227, - 69, 234, 109, 65, 61, 6, 125, 99, 219, 243, 203, 45, 157, 11, 196, 244, - 72, 12, 204, 99, 119, 51, 108, 62, 48, 36, 223, 124, 34, 109, 185, 79, - 46, 138, 105, 36, 35, 123, 252, 176, 81, 126, 49, 78, 46, 106, 245, 20, - 41, 247, 18, 101, 169, 57, 136, 113, 36, 33, 242, 151, 241, 132, 141, 95, - 250, 183, 136, 73, 242, 75, 132, 46, 249, 117, 137, 222, 177, 92, 85, 6, - 81, 142, 95, 6, 85, 29, 53, 5, 248, 149, 36, 31, 146, 246, 211, 53, - 250, 192, 80, 255, 178, 222, 92, 20, 91, 30, 192, 220, 163, 177, 24, 30, - 130, 180, 94, 143, 7, 195, 101, 154, 111, 127, 250, 232, 174, 167, 195, 129, - 243, 116, 11, 148, 13, 40, 80, 126, 86, 195, 94, 20, 80, 255, 2, 254, - 192, 119, 135, 193, 242, 36, 248, 120, 184, 83, 246, 208, 46, 154, 173, 30, - 142, 87, 217, 26, 24, 28, 73, 250, 22, 107, 165, 82, 167, 238, 98, 85, - 9, 225, 75, 1, 178, 199, 25, 87, 124, 100, 21, 95, 175, 144, 178, 104, - 178, 143, 142, 159, 52, 100, 200, 102, 49, 11, 145, 86, 169, 145, 34, 165, - 240, 169, 191, 133, 167, 222, 22, 158, 182, 91, 24, 79, 174, 136, 155, 196, - 185, 46, 73, 80, 168, 24, 207, 175, 27, 180, 104, 158, 123, 72, 84, 158, - 100, 160, 12, 80, 161, 176, 60, 187, 88, 94, 57, 178, 91, 178, 31, 60, - 108, 63, 32, 189, 193, 243, 2, 149, 183, 235, 243, 113, 5, 75, 225, 226, - 135, 139, 52, 25, 119, 23, 21, 43, 0, 123, 186, 216, 90, 135, 118, 23, - 118, 241, 35, 95, 41, 45, 90, 46, 69, 39, 67, 73, 155, 129, 167, 136, - 24, 111, 187, 208, 91, 218, 243, 21, 230, 177, 191, 212, 223, 112, 30, 111, - 105, 59, 143, 253, 205, 95, 122, 155, 191, 220, 210, 252, 229, 182, 230, 47, - 61, 205, 219, 83, 99, 138, 218, 13, 235, 205, 173, 85, 234, 107, 210, 131, - 16, 46, 245, 55, 236, 69, 136, 60, 240, 54, 191, 246, 54, 191, 222, 210, - 252, 122, 91, 243, 235, 45, 205, 183, 241, 205, 165, 254, 230, 189, 248, 150, - 7, 173, 230, 159, 180, 241, 253, 196, 135, 239, 39, 94, 124, 63, 113, 240, - 93, 247, 150, 209, 181, 179, 126, 184, 228, 248, 168, 85, 100, 79, 115, 221, - 174, 163, 74, 44, 56, 172, 50, 95, 161, 5, 69, 153, 246, 26, 29, 168, - 18, 187, 57, 83, 230, 43, 196, 230, 50, 218, 207, 38, 25, 134, 104, 192, - 175, 98, 89, 200, 7, 153, 156, 55, 32, 202, 76, 233, 122, 3, 25, 177, - 245, 228, 186, 135, 82, 68, 149, 165, 83, 197, 32, 112, 139, 25, 215, 232, - 96, 71, 35, 194, 114, 13, 44, 167, 162, 91, 0, 248, 135, 182, 105, 228, - 24, 31, 18, 101, 218, 252, 144, 23, 85, 29, 101, 232, 16, 251, 61, 40, - 48, 94, 41, 25, 215, 104, 209, 250, 61, 88, 165, 249, 133, 122, 75, 89, - 64, 198, 143, 137, 195, 88, 63, 31, 53, 126, 18, 6, 220, 130, 86, 73, - 175, 85, 208, 42, 177, 20, 51, 111, 121, 187, 27, 71, 187, 242, 63, 33, - 5, 208, 122, 244, 165, 251, 243, 105, 227, 103, 179, 143, 167, 173, 161, 60, - 21, 61, 207, 41, 234, 181, 10, 90, 37, 176, 15, 76, 125, 101, 237, 30, - 169, 212, 251, 126, 179, 217, 47, 143, 156, 159, 79, 7, 141, 159, 141, 182, - 159, 14, 154, 163, 121, 58, 104, 116, 132, 5, 173, 146, 22, 232, 82, 214, - 110, 158, 75, 253, 197, 222, 102, 61, 189, 93, 69, 229, 210, 87, 214, 238, - 141, 75, 253, 197, 222, 102, 27, 189, 225, 23, 222, 68, 157, 210, 107, 148, - 55, 214, 151, 7, 173, 113, 187, 79, 92, 120, 154, 207, 238, 126, 120, 215, - 211, 222, 93, 207, 182, 60, 108, 226, 204, 125, 178, 13, 82, 15, 254, 90, - 15, 239, 122, 122, 7, 48, 109, 72, 31, 63, 25, 180, 75, 90, 144, 81, - 153, 175, 208, 211, 156, 183, 15, 223, 164, 169, 98, 111, 111, 254, 233, 178, - 158, 252, 127, 236, 189, 119, 127, 226, 72, 211, 40, 250, 63, 159, 66, 195, - 176, 11, 24, 1, 10, 128, 97, 102, 240, 115, 156, 179, 141, 115, 94, 126, - 4, 1, 178, 73, 150, 4, 8, 24, 158, 207, 126, 171, 170, 91, 137, 96, - 207, 166, 115, 207, 121, 239, 221, 29, 35, 169, 115, 87, 87, 119, 87, 85, - 87, 87, 113, 209, 215, 210, 216, 85, 13, 88, 222, 180, 37, 163, 228, 4, - 47, 109, 218, 242, 241, 113, 99, 86, 85, 177, 88, 249, 250, 60, 232, 215, - 23, 33, 191, 190, 4, 240, 20, 182, 36, 112, 177, 252, 101, 117, 46, 27, - 138, 245, 21, 35, 177, 190, 106, 32, 214, 87, 64, 122, 125, 21, 160, 215, - 151, 194, 121, 125, 5, 152, 215, 87, 65, 121, 125, 5, 144, 215, 151, 194, - 24, 53, 218, 202, 19, 13, 246, 231, 24, 63, 64, 136, 127, 18, 29, 108, - 201, 210, 4, 159, 166, 248, 172, 9, 159, 55, 18, 82, 124, 154, 100, 126, - 20, 87, 165, 249, 188, 57, 75, 6, 236, 131, 100, 148, 110, 96, 160, 70, - 236, 79, 212, 26, 37, 6, 206, 232, 181, 219, 154, 94, 214, 29, 118, 139, - 127, 3, 225, 216, 234, 49, 254, 136, 135, 80, 6, 98, 253, 44, 50, 171, - 59, 23, 145, 151, 76, 10, 66, 195, 99, 101, 34, 150, 188, 79, 79, 68, - 193, 2, 188, 168, 122, 185, 102, 12, 76, 60, 240, 48, 59, 189, 158, 213, - 130, 79, 216, 60, 116, 127, 8, 39, 158, 232, 128, 202, 125, 135, 206, 162, - 253, 88, 247, 124, 107, 46, 4, 119, 113, 38, 66, 112, 95, 248, 162, 99, - 14, 186, 221, 177, 243, 244, 135, 57, 167, 87, 236, 131, 35, 60, 73, 189, - 22, 63, 188, 180, 216, 243, 6, 74, 56, 45, 173, 214, 234, 162, 213, 1, - 20, 177, 84, 106, 111, 140, 42, 101, 234, 118, 16, 237, 65, 128, 191, 149, - 233, 100, 208, 247, 141, 58, 118, 6, 218, 231, 247, 5, 121, 176, 24, 162, - 35, 140, 166, 230, 189, 241, 166, 59, 95, 76, 170, 67, 85, 241, 214, 82, - 59, 91, 16, 218, 230, 162, 36, 10, 24, 107, 164, 193, 250, 83, 152, 232, - 237, 161, 102, 96, 99, 203, 163, 50, 135, 30, 187, 212, 224, 139, 243, 29, - 168, 185, 97, 110, 141, 229, 145, 48, 243, 14, 159, 35, 236, 196, 151, 193, - 58, 196, 79, 127, 107, 45, 173, 246, 38, 132, 117, 115, 88, 105, 199, 34, - 83, 165, 152, 203, 204, 226, 194, 239, 191, 11, 17, 101, 67, 66, 205, 146, - 63, 208, 194, 92, 152, 157, 231, 227, 81, 47, 211, 236, 195, 3, 92, 33, - 26, 145, 163, 220, 21, 134, 115, 106, 12, 217, 82, 164, 91, 34, 180, 159, - 94, 80, 173, 32, 50, 45, 227, 165, 190, 178, 81, 155, 209, 201, 47, 42, - 184, 48, 63, 119, 130, 254, 81, 100, 67, 39, 165, 132, 240, 151, 112, 228, - 75, 88, 248, 9, 176, 249, 82, 140, 40, 248, 210, 114, 94, 234, 248, 18, - 246, 95, 238, 68, 187, 113, 229, 171, 135, 171, 235, 221, 211, 114, 105, 243, - 250, 32, 62, 19, 154, 172, 134, 65, 87, 183, 139, 11, 241, 33, 186, 206, - 233, 79, 146, 30, 152, 70, 186, 173, 87, 211, 77, 189, 211, 79, 43, 41, - 41, 205, 117, 190, 205, 116, 8, 154, 4, 195, 230, 152, 83, 164, 106, 191, - 68, 54, 194, 8, 172, 112, 236, 57, 164, 155, 168, 162, 27, 243, 245, 137, - 84, 59, 32, 176, 83, 198, 222, 153, 169, 102, 103, 18, 167, 190, 132, 125, - 169, 147, 148, 26, 171, 155, 185, 85, 253, 189, 140, 24, 84, 126, 183, 126, - 173, 20, 95, 231, 151, 182, 55, 206, 224, 251, 107, 157, 155, 5, 199, 116, - 73, 18, 128, 120, 160, 184, 95, 237, 61, 43, 249, 23, 83, 255, 114, 37, - 31, 65, 234, 147, 26, 63, 200, 58, 95, 253, 103, 32, 102, 53, 125, 146, - 10, 177, 143, 176, 21, 53, 179, 244, 121, 219, 108, 203, 154, 33, 244, 62, - 25, 11, 113, 128, 170, 139, 76, 133, 10, 113, 155, 33, 118, 228, 139, 192, - 108, 239, 77, 35, 27, 98, 119, 134, 214, 247, 158, 152, 90, 218, 203, 76, - 120, 123, 138, 108, 188, 8, 85, 67, 171, 188, 161, 57, 79, 180, 206, 201, - 116, 135, 190, 20, 139, 242, 204, 141, 128, 121, 18, 114, 227, 190, 68, 190, - 204, 4, 210, 50, 68, 99, 144, 79, 82, 50, 153, 129, 5, 197, 177, 241, - 16, 141, 72, 209, 111, 194, 77, 151, 121, 91, 162, 5, 198, 93, 91, 82, - 164, 134, 84, 215, 80, 253, 27, 141, 249, 80, 211, 97, 133, 17, 233, 31, - 108, 79, 131, 110, 61, 212, 75, 45, 44, 35, 17, 153, 45, 34, 172, 131, - 216, 183, 110, 71, 8, 63, 97, 225, 176, 10, 202, 168, 169, 9, 125, 246, - 169, 89, 117, 80, 53, 138, 123, 66, 225, 218, 77, 209, 84, 64, 165, 200, - 209, 121, 250, 38, 148, 43, 117, 20, 83, 87, 7, 77, 92, 123, 123, 197, - 169, 128, 91, 178, 44, 204, 196, 41, 233, 232, 83, 235, 127, 210, 0, 61, - 153, 47, 48, 68, 55, 151, 39, 240, 29, 102, 190, 38, 194, 194, 108, 94, - 85, 169, 131, 18, 32, 129, 93, 96, 90, 112, 43, 22, 84, 85, 98, 30, - 235, 176, 64, 178, 172, 207, 252, 11, 58, 5, 185, 190, 92, 58, 209, 184, - 95, 227, 134, 85, 224, 57, 125, 153, 119, 48, 235, 94, 119, 240, 121, 192, - 112, 128, 16, 240, 11, 181, 84, 137, 233, 155, 16, 157, 3, 8, 140, 155, - 111, 203, 241, 76, 86, 59, 32, 196, 187, 252, 16, 229, 218, 6, 173, 211, - 205, 19, 33, 18, 14, 203, 97, 33, 1, 145, 79, 210, 139, 144, 117, 223, - 228, 172, 51, 4, 204, 41, 41, 140, 0, 154, 107, 21, 138, 2, 64, 190, - 72, 222, 19, 1, 252, 69, 179, 5, 123, 230, 60, 108, 209, 193, 34, 130, - 138, 82, 49, 247, 145, 188, 148, 6, 169, 133, 57, 254, 179, 200, 225, 143, - 229, 152, 176, 231, 142, 97, 125, 106, 91, 174, 65, 18, 199, 12, 22, 121, - 79, 170, 116, 199, 113, 230, 173, 128, 221, 158, 88, 94, 140, 235, 98, 202, - 167, 36, 22, 112, 216, 181, 26, 176, 216, 79, 31, 56, 235, 62, 44, 229, - 117, 204, 97, 169, 83, 51, 192, 232, 254, 233, 183, 23, 82, 149, 123, 112, - 94, 30, 157, 23, 205, 214, 173, 50, 26, 198, 236, 142, 223, 180, 177, 135, - 192, 115, 192, 115, 116, 13, 131, 110, 198, 152, 55, 246, 238, 18, 127, 196, - 232, 214, 67, 227, 94, 134, 150, 2, 2, 71, 19, 192, 134, 87, 44, 180, - 122, 124, 9, 226, 214, 131, 136, 187, 233, 186, 171, 136, 222, 71, 197, 232, - 3, 252, 61, 70, 209, 0, 6, 89, 82, 115, 170, 210, 249, 61, 7, 103, - 100, 176, 49, 204, 123, 180, 107, 103, 218, 119, 163, 112, 53, 176, 239, 139, - 15, 197, 71, 87, 163, 110, 14, 70, 146, 31, 167, 35, 14, 180, 165, 197, - 1, 193, 132, 24, 30, 42, 59, 1, 193, 161, 145, 62, 5, 175, 115, 115, - 141, 57, 225, 114, 204, 72, 207, 77, 65, 15, 100, 18, 122, 65, 113, 10, - 199, 122, 35, 146, 87, 55, 215, 254, 28, 21, 37, 161, 5, 127, 117, 248, - 51, 139, 146, 111, 165, 111, 211, 122, 62, 74, 20, 167, 163, 25, 36, 153, - 118, 42, 118, 44, 210, 18, 91, 176, 39, 213, 249, 87, 93, 172, 163, 161, - 12, 254, 101, 138, 38, 124, 209, 242, 57, 191, 248, 143, 132, 164, 44, 38, - 153, 37, 99, 246, 54, 149, 96, 3, 121, 22, 98, 145, 145, 29, 105, 217, - 145, 186, 29, 49, 227, 124, 115, 196, 60, 202, 202, 60, 226, 116, 89, 62, - 244, 9, 189, 34, 125, 42, 149, 90, 150, 135, 91, 135, 173, 163, 134, 185, - 48, 130, 141, 83, 242, 45, 250, 104, 240, 121, 97, 252, 212, 249, 133, 223, - 13, 199, 73, 245, 132, 108, 67, 147, 246, 157, 50, 115, 64, 242, 225, 108, - 250, 203, 51, 205, 231, 151, 252, 95, 156, 109, 42, 206, 183, 213, 170, 169, - 139, 157, 45, 58, 122, 164, 241, 207, 102, 73, 189, 178, 8, 218, 114, 5, - 173, 118, 225, 252, 168, 112, 229, 107, 166, 251, 108, 22, 195, 145, 255, 132, - 105, 96, 202, 129, 164, 66, 100, 45, 56, 8, 60, 24, 0, 203, 52, 129, - 97, 45, 227, 10, 192, 139, 211, 202, 91, 172, 252, 176, 227, 43, 59, 247, - 24, 211, 215, 109, 173, 45, 116, 177, 136, 106, 207, 104, 245, 122, 158, 115, - 90, 52, 112, 217, 51, 208, 143, 228, 74, 248, 112, 67, 7, 42, 135, 5, - 215, 182, 165, 208, 168, 59, 37, 157, 38, 175, 232, 111, 68, 194, 78, 150, - 231, 251, 199, 152, 178, 200, 84, 134, 226, 103, 192, 134, 17, 139, 129, 204, - 89, 68, 134, 79, 96, 202, 128, 136, 82, 129, 136, 114, 58, 27, 145, 109, - 160, 135, 88, 110, 188, 237, 69, 253, 226, 238, 241, 220, 11, 231, 142, 241, - 94, 51, 204, 56, 180, 80, 221, 174, 22, 167, 52, 190, 177, 136, 156, 86, - 240, 194, 1, 206, 123, 187, 81, 156, 70, 228, 164, 156, 132, 73, 84, 157, - 133, 234, 99, 47, 149, 226, 165, 26, 99, 42, 133, 82, 141, 33, 213, 220, - 146, 66, 235, 194, 232, 135, 172, 228, 89, 219, 91, 248, 58, 19, 12, 207, - 123, 129, 36, 253, 198, 126, 112, 42, 147, 93, 144, 84, 22, 169, 61, 91, - 130, 69, 106, 140, 63, 35, 103, 81, 106, 205, 66, 35, 88, 124, 138, 83, - 41, 85, 88, 155, 174, 137, 131, 25, 4, 251, 3, 134, 51, 104, 102, 143, - 213, 185, 81, 140, 96, 226, 159, 63, 91, 240, 134, 169, 102, 161, 110, 17, - 150, 6, 161, 219, 73, 1, 27, 203, 92, 8, 69, 167, 213, 89, 106, 106, - 207, 162, 97, 129, 249, 60, 17, 218, 104, 11, 2, 189, 133, 145, 229, 31, - 54, 17, 217, 85, 186, 36, 163, 96, 194, 161, 4, 11, 77, 9, 138, 0, - 141, 156, 234, 48, 193, 102, 216, 82, 120, 147, 225, 13, 154, 43, 39, 244, - 39, 245, 37, 201, 98, 90, 236, 59, 131, 223, 16, 143, 119, 45, 168, 13, - 145, 46, 46, 75, 137, 9, 188, 217, 146, 24, 25, 99, 255, 167, 240, 154, - 136, 140, 146, 50, 172, 124, 16, 146, 136, 180, 240, 85, 98, 20, 110, 10, - 189, 9, 164, 152, 95, 156, 208, 168, 133, 142, 102, 151, 118, 211, 150, 139, - 73, 89, 24, 211, 111, 77, 6, 0, 246, 88, 72, 143, 5, 245, 106, 248, - 8, 217, 10, 165, 162, 223, 154, 66, 169, 20, 150, 138, 61, 106, 10, 165, - 82, 41, 21, 253, 214, 84, 74, 165, 178, 84, 236, 81, 195, 71, 168, 38, - 81, 76, 135, 197, 224, 35, 52, 74, 45, 174, 208, 73, 69, 68, 112, 195, - 195, 166, 113, 26, 85, 116, 11, 48, 88, 125, 9, 245, 160, 132, 72, 205, - 221, 144, 50, 108, 59, 225, 44, 245, 151, 233, 90, 100, 99, 230, 224, 190, - 13, 239, 27, 104, 7, 124, 20, 217, 128, 101, 20, 62, 169, 133, 236, 81, - 139, 224, 21, 0, 46, 50, 128, 92, 98, 111, 70, 97, 83, 224, 190, 224, - 57, 75, 224, 165, 196, 24, 143, 137, 199, 127, 51, 161, 24, 108, 4, 110, - 126, 144, 157, 103, 164, 120, 114, 190, 62, 99, 108, 50, 5, 236, 158, 93, - 239, 94, 250, 3, 54, 47, 47, 207, 239, 46, 15, 247, 15, 174, 23, 66, - 119, 206, 239, 206, 102, 115, 85, 203, 31, 86, 231, 250, 123, 95, 40, 235, - 100, 119, 111, 177, 130, 155, 210, 92, 241, 201, 165, 197, 123, 91, 51, 64, - 248, 11, 130, 120, 134, 40, 1, 79, 28, 115, 122, 168, 244, 192, 9, 215, - 41, 194, 20, 178, 1, 149, 233, 101, 204, 248, 253, 136, 221, 1, 144, 50, - 224, 67, 104, 117, 246, 59, 236, 240, 128, 79, 16, 142, 40, 22, 25, 119, - 156, 110, 44, 166, 132, 125, 29, 112, 138, 82, 42, 31, 167, 204, 64, 74, - 149, 165, 84, 87, 165, 140, 69, 0, 195, 190, 96, 34, 6, 140, 8, 96, - 218, 23, 76, 12, 171, 16, 110, 233, 12, 201, 252, 255, 2, 8, 23, 134, - 117, 55, 22, 134, 220, 48, 213, 58, 104, 193, 203, 173, 66, 134, 82, 96, - 138, 240, 82, 199, 244, 57, 118, 62, 109, 133, 98, 21, 39, 150, 62, 199, - 206, 167, 173, 82, 172, 234, 196, 210, 231, 88, 157, 133, 82, 78, 217, 136, - 170, 33, 92, 95, 225, 157, 45, 164, 2, 174, 163, 80, 13, 91, 48, 5, - 91, 163, 184, 4, 196, 53, 32, 78, 163, 56, 248, 26, 55, 112, 49, 173, - 193, 142, 222, 108, 107, 184, 70, 84, 161, 225, 240, 103, 107, 240, 212, 152, - 149, 37, 114, 234, 128, 171, 193, 7, 9, 97, 6, 218, 123, 252, 63, 95, - 14, 183, 247, 138, 175, 133, 74, 160, 133, 74, 160, 133, 74, 160, 133, 202, - 175, 181, 16, 107, 83, 149, 63, 213, 68, 95, 22, 183, 141, 170, 175, 141, - 106, 160, 141, 106, 160, 141, 106, 160, 141, 234, 175, 183, 145, 156, 99, 252, - 169, 38, 178, 28, 208, 66, 88, 232, 16, 193, 70, 51, 66, 183, 22, 236, - 109, 176, 182, 227, 90, 136, 216, 140, 139, 33, 160, 155, 215, 19, 57, 128, - 206, 136, 106, 46, 226, 245, 8, 243, 92, 196, 131, 101, 26, 39, 44, 236, - 177, 184, 71, 164, 4, 15, 129, 68, 15, 123, 96, 64, 33, 137, 232, 33, - 144, 232, 97, 15, 139, 251, 56, 243, 138, 140, 161, 114, 144, 18, 121, 130, - 158, 161, 244, 55, 34, 163, 196, 197, 67, 162, 145, 12, 69, 99, 207, 91, - 179, 192, 58, 175, 194, 180, 115, 230, 27, 100, 25, 203, 98, 13, 187, 2, - 179, 46, 196, 160, 131, 235, 7, 219, 144, 32, 146, 118, 36, 108, 106, 0, - 39, 61, 40, 225, 148, 115, 39, 96, 143, 102, 160, 59, 1, 97, 155, 66, - 40, 41, 62, 40, 41, 94, 71, 21, 31, 148, 20, 209, 67, 98, 209, 195, - 96, 22, 247, 113, 230, 21, 25, 63, 134, 146, 15, 143, 71, 202, 231, 96, - 82, 0, 76, 10, 129, 73, 241, 192, 132, 139, 167, 66, 59, 50, 68, 210, - 150, 140, 109, 13, 76, 11, 15, 76, 184, 246, 184, 43, 81, 143, 150, 162, - 177, 251, 89, 195, 207, 154, 234, 3, 147, 234, 245, 84, 245, 129, 73, 21, - 189, 121, 36, 122, 147, 136, 197, 125, 156, 121, 69, 198, 207, 193, 196, 230, - 210, 72, 253, 28, 74, 42, 64, 73, 37, 40, 169, 30, 148, 112, 227, 80, - 137, 34, 129, 72, 34, 73, 176, 169, 56, 53, 25, 141, 52, 93, 227, 196, - 195, 115, 8, 72, 9, 113, 247, 106, 123, 230, 18, 22, 226, 133, 63, 78, - 14, 70, 202, 193, 88, 37, 24, 171, 4, 99, 213, 96, 172, 10, 177, 179, - 208, 27, 50, 95, 35, 32, 83, 70, 50, 254, 40, 248, 163, 10, 82, 200, - 229, 155, 25, 245, 63, 79, 247, 135, 24, 189, 135, 4, 95, 45, 133, 20, - 95, 161, 80, 16, 140, 148, 224, 17, 203, 232, 244, 107, 106, 34, 187, 29, - 74, 180, 7, 29, 189, 139, 102, 7, 82, 144, 6, 135, 71, 94, 83, 50, - 56, 6, 10, 62, 133, 166, 161, 99, 81, 83, 200, 151, 6, 182, 225, 55, - 145, 189, 41, 51, 70, 114, 195, 202, 70, 43, 171, 146, 89, 3, 6, 137, - 24, 128, 56, 91, 93, 157, 16, 133, 66, 216, 10, 91, 77, 96, 145, 108, - 125, 165, 119, 223, 162, 249, 201, 170, 25, 129, 193, 203, 136, 145, 172, 203, - 34, 40, 226, 184, 233, 126, 200, 162, 221, 12, 89, 216, 78, 24, 112, 61, - 22, 177, 155, 80, 66, 19, 29, 79, 101, 19, 240, 193, 122, 4, 175, 99, - 246, 42, 171, 34, 218, 34, 156, 234, 141, 152, 151, 120, 131, 188, 25, 49, - 39, 85, 140, 244, 161, 31, 163, 243, 4, 101, 2, 202, 57, 76, 100, 163, - 97, 45, 225, 74, 33, 20, 217, 53, 138, 244, 56, 49, 248, 156, 227, 61, - 189, 16, 143, 201, 108, 244, 6, 134, 142, 50, 83, 212, 91, 39, 41, 38, - 122, 98, 12, 10, 116, 68, 110, 30, 132, 140, 208, 65, 104, 187, 215, 76, - 118, 122, 245, 65, 155, 89, 87, 114, 93, 196, 47, 97, 208, 177, 105, 241, - 229, 194, 212, 132, 191, 89, 190, 247, 57, 9, 16, 15, 114, 25, 70, 238, - 250, 108, 105, 187, 169, 240, 200, 127, 126, 177, 185, 236, 144, 111, 94, 146, - 4, 213, 209, 41, 183, 144, 32, 44, 134, 204, 240, 236, 50, 222, 5, 216, - 41, 219, 147, 28, 9, 166, 96, 139, 138, 95, 28, 211, 92, 50, 56, 164, - 5, 136, 195, 211, 244, 142, 42, 145, 45, 150, 144, 23, 160, 83, 74, 96, - 138, 233, 35, 204, 76, 56, 68, 166, 42, 76, 14, 49, 50, 205, 64, 48, - 60, 178, 236, 145, 99, 143, 117, 246, 200, 227, 3, 202, 41, 20, 237, 100, - 197, 214, 77, 242, 168, 12, 211, 163, 56, 230, 159, 30, 252, 152, 231, 78, - 136, 76, 230, 49, 75, 1, 83, 202, 82, 120, 14, 55, 88, 42, 87, 46, - 81, 244, 4, 19, 248, 138, 62, 0, 203, 214, 184, 175, 137, 101, 180, 174, - 163, 217, 252, 195, 134, 249, 139, 191, 21, 91, 44, 143, 233, 125, 76, 239, - 118, 187, 82, 213, 218, 240, 69, 79, 119, 248, 249, 216, 177, 186, 176, 76, - 126, 58, 16, 64, 55, 50, 116, 227, 161, 76, 212, 173, 219, 119, 219, 86, - 42, 118, 153, 226, 163, 92, 100, 118, 94, 126, 10, 74, 17, 58, 194, 223, - 213, 98, 21, 6, 208, 119, 110, 28, 245, 181, 122, 121, 49, 253, 158, 142, - 98, 90, 40, 71, 84, 139, 120, 25, 201, 164, 146, 50, 98, 182, 88, 211, - 141, 90, 155, 190, 114, 226, 122, 145, 89, 172, 48, 3, 165, 35, 24, 162, - 98, 20, 225, 0, 143, 49, 251, 66, 72, 68, 153, 139, 106, 242, 38, 221, - 51, 234, 176, 216, 89, 154, 235, 201, 222, 117, 55, 43, 216, 56, 106, 126, - 201, 46, 236, 146, 222, 145, 9, 19, 211, 68, 241, 20, 128, 139, 104, 200, - 235, 106, 148, 95, 234, 118, 156, 145, 226, 197, 104, 129, 153, 103, 67, 4, - 108, 85, 218, 172, 26, 52, 246, 137, 62, 137, 33, 250, 83, 81, 16, 22, - 25, 117, 47, 93, 139, 62, 224, 179, 155, 219, 62, 48, 178, 0, 236, 121, - 17, 251, 93, 196, 94, 23, 177, 207, 128, 213, 177, 202, 192, 234, 197, 41, - 158, 16, 160, 24, 102, 88, 26, 230, 130, 166, 49, 15, 29, 243, 80, 255, - 2, 193, 28, 67, 226, 255, 81, 242, 130, 152, 150, 165, 196, 32, 30, 245, - 150, 11, 134, 61, 25, 73, 18, 85, 252, 11, 205, 99, 240, 255, 73, 115, - 172, 252, 255, 98, 227, 230, 87, 76, 38, 97, 155, 159, 123, 100, 143, 202, - 91, 58, 87, 44, 138, 93, 96, 172, 81, 74, 205, 200, 55, 121, 67, 250, - 253, 119, 84, 174, 0, 246, 85, 108, 21, 137, 28, 98, 102, 165, 241, 115, - 74, 242, 173, 180, 2, 187, 30, 9, 182, 224, 13, 57, 86, 138, 122, 34, - 9, 252, 72, 84, 213, 184, 200, 5, 245, 240, 250, 50, 11, 193, 52, 132, - 141, 25, 72, 61, 117, 134, 152, 90, 156, 142, 214, 90, 107, 117, 94, 95, - 182, 88, 140, 228, 96, 31, 71, 12, 147, 4, 194, 182, 105, 4, 82, 37, - 35, 144, 109, 198, 106, 166, 200, 41, 252, 196, 34, 89, 49, 146, 195, 109, - 159, 210, 81, 45, 60, 196, 33, 63, 215, 161, 188, 60, 74, 11, 48, 139, - 222, 73, 198, 244, 211, 164, 222, 137, 167, 21, 9, 3, 49, 151, 126, 154, - 240, 7, 82, 13, 99, 175, 134, 117, 49, 146, 143, 59, 105, 169, 6, 30, - 130, 130, 11, 108, 28, 214, 157, 140, 96, 155, 80, 206, 136, 36, 7, 5, - 96, 17, 179, 208, 160, 24, 153, 134, 203, 56, 225, 201, 216, 14, 173, 161, - 148, 35, 44, 78, 165, 148, 186, 22, 142, 140, 194, 105, 57, 51, 11, 207, - 96, 96, 26, 80, 28, 42, 134, 0, 140, 7, 40, 180, 196, 203, 69, 60, - 72, 161, 160, 249, 226, 104, 25, 166, 250, 220, 226, 90, 190, 226, 198, 139, - 197, 141, 3, 197, 53, 71, 208, 220, 81, 82, 133, 81, 107, 194, 136, 69, - 90, 236, 181, 137, 242, 154, 230, 136, 64, 30, 79, 199, 92, 240, 67, 14, - 8, 22, 35, 205, 22, 81, 118, 200, 52, 16, 217, 6, 96, 102, 109, 93, - 131, 232, 52, 208, 214, 72, 214, 177, 234, 32, 164, 5, 33, 99, 8, 1, - 234, 31, 122, 200, 32, 21, 247, 167, 108, 182, 146, 20, 55, 102, 64, 139, - 123, 121, 128, 241, 5, 154, 219, 222, 230, 255, 137, 204, 75, 27, 114, 176, - 230, 140, 14, 113, 98, 178, 2, 180, 33, 252, 41, 146, 228, 156, 213, 176, - 232, 31, 136, 93, 49, 5, 163, 241, 223, 119, 248, 101, 31, 223, 233, 27, - 63, 216, 33, 77, 136, 187, 164, 69, 202, 85, 201, 230, 248, 122, 164, 10, - 157, 74, 31, 101, 167, 19, 248, 33, 98, 150, 44, 101, 13, 44, 32, 95, - 107, 246, 120, 130, 169, 85, 34, 251, 17, 37, 84, 60, 102, 162, 124, 80, - 86, 200, 108, 145, 248, 19, 233, 86, 161, 145, 34, 7, 150, 36, 53, 22, - 3, 111, 200, 129, 251, 244, 24, 176, 40, 19, 230, 67, 43, 133, 20, 234, - 6, 155, 187, 248, 158, 114, 72, 82, 218, 109, 217, 144, 51, 161, 209, 255, - 146, 146, 10, 99, 228, 233, 70, 1, 86, 154, 148, 133, 57, 98, 18, 183, - 201, 20, 115, 80, 202, 196, 215, 208, 74, 89, 18, 88, 176, 19, 228, 35, - 216, 33, 50, 228, 139, 12, 164, 160, 102, 59, 5, 186, 210, 112, 10, 14, - 5, 202, 160, 16, 218, 229, 4, 31, 202, 7, 187, 144, 33, 154, 158, 139, - 207, 244, 46, 46, 48, 44, 7, 150, 185, 144, 18, 175, 75, 121, 210, 182, - 138, 253, 195, 77, 62, 101, 114, 104, 250, 253, 48, 219, 56, 80, 139, 191, - 93, 83, 146, 95, 179, 223, 37, 217, 252, 181, 249, 179, 81, 231, 125, 201, - 19, 154, 209, 171, 3, 108, 84, 225, 75, 145, 134, 157, 24, 157, 0, 55, - 36, 188, 210, 144, 166, 56, 26, 32, 240, 82, 162, 44, 224, 112, 17, 187, - 25, 34, 75, 41, 144, 9, 240, 48, 135, 56, 26, 146, 4, 24, 88, 218, - 101, 220, 234, 146, 136, 200, 238, 15, 22, 9, 72, 50, 141, 49, 249, 78, - 114, 20, 103, 203, 49, 137, 121, 146, 114, 206, 97, 83, 9, 223, 120, 105, - 176, 93, 173, 44, 142, 105, 81, 166, 132, 100, 193, 41, 90, 225, 133, 67, - 113, 45, 42, 220, 87, 96, 183, 35, 68, 186, 29, 31, 157, 92, 227, 212, - 179, 143, 82, 110, 45, 161, 148, 91, 186, 105, 145, 217, 84, 164, 150, 91, - 159, 30, 176, 185, 201, 153, 89, 164, 32, 57, 235, 69, 174, 34, 105, 107, - 232, 70, 94, 51, 200, 90, 15, 140, 95, 153, 40, 161, 167, 223, 94, 224, - 171, 98, 251, 190, 80, 43, 131, 86, 87, 159, 154, 76, 217, 115, 205, 149, - 154, 39, 110, 43, 176, 199, 163, 185, 240, 118, 178, 58, 78, 242, 87, 193, - 109, 142, 151, 252, 112, 129, 205, 2, 146, 109, 168, 185, 150, 126, 76, 52, - 1, 104, 50, 179, 61, 174, 87, 34, 164, 239, 250, 204, 124, 25, 234, 210, - 0, 69, 136, 102, 101, 201, 67, 59, 207, 224, 163, 74, 189, 70, 70, 153, - 113, 231, 21, 14, 203, 5, 50, 180, 137, 198, 94, 93, 94, 10, 43, 245, - 64, 72, 52, 66, 131, 204, 120, 50, 163, 153, 76, 133, 19, 149, 124, 123, - 166, 182, 140, 237, 107, 249, 153, 190, 255, 99, 136, 89, 103, 200, 139, 176, - 166, 227, 183, 59, 236, 69, 233, 55, 250, 118, 6, 190, 136, 115, 147, 44, - 21, 185, 131, 47, 187, 231, 197, 14, 216, 138, 250, 10, 45, 161, 196, 34, - 18, 102, 101, 5, 169, 213, 208, 18, 244, 252, 224, 88, 21, 209, 122, 9, - 186, 127, 66, 69, 178, 15, 21, 59, 73, 7, 175, 156, 166, 4, 98, 242, - 55, 70, 77, 98, 231, 24, 65, 41, 19, 9, 185, 94, 212, 87, 146, 139, - 31, 225, 178, 75, 54, 122, 199, 178, 92, 82, 16, 81, 5, 7, 214, 34, - 154, 204, 212, 59, 131, 14, 215, 6, 137, 100, 152, 69, 102, 32, 82, 125, - 129, 217, 95, 160, 59, 35, 83, 221, 196, 107, 222, 200, 215, 63, 67, 57, - 51, 161, 131, 212, 155, 67, 168, 173, 97, 8, 17, 106, 157, 34, 84, 194, - 150, 234, 185, 60, 217, 153, 112, 26, 204, 147, 229, 121, 78, 139, 17, 58, - 187, 133, 89, 142, 59, 174, 80, 115, 197, 59, 38, 52, 101, 138, 135, 196, - 27, 179, 23, 136, 152, 248, 250, 143, 155, 112, 71, 140, 156, 194, 212, 154, - 248, 20, 74, 96, 5, 16, 26, 66, 20, 33, 155, 132, 237, 3, 152, 158, - 33, 214, 122, 138, 229, 78, 150, 30, 51, 7, 40, 234, 32, 65, 189, 146, - 158, 142, 140, 144, 226, 130, 214, 194, 18, 157, 117, 69, 83, 212, 250, 150, - 43, 168, 116, 104, 6, 220, 94, 84, 220, 67, 135, 167, 76, 112, 230, 109, - 47, 14, 113, 0, 203, 122, 2, 55, 40, 2, 91, 206, 219, 187, 157, 61, - 27, 59, 234, 228, 207, 240, 237, 156, 218, 222, 153, 219, 166, 125, 73, 36, - 111, 203, 60, 93, 177, 59, 47, 164, 134, 217, 211, 166, 205, 70, 165, 173, - 18, 247, 198, 101, 27, 36, 163, 150, 220, 45, 82, 15, 249, 225, 63, 17, - 216, 30, 52, 39, 173, 12, 110, 17, 104, 47, 144, 43, 86, 45, 83, 199, - 16, 203, 189, 129, 133, 132, 77, 185, 215, 175, 212, 116, 107, 236, 138, 62, - 140, 74, 93, 31, 48, 179, 110, 128, 93, 204, 74, 173, 142, 70, 212, 252, - 59, 4, 196, 160, 214, 39, 58, 185, 15, 132, 127, 44, 25, 81, 118, 152, - 33, 96, 193, 215, 184, 218, 192, 24, 146, 13, 56, 18, 81, 192, 196, 234, - 13, 92, 181, 202, 143, 4, 39, 219, 148, 143, 203, 53, 80, 95, 210, 177, - 118, 86, 49, 153, 122, 5, 247, 204, 169, 80, 149, 238, 244, 102, 235, 152, - 127, 155, 34, 107, 105, 84, 55, 171, 198, 181, 211, 235, 217, 214, 85, 157, - 133, 2, 230, 123, 165, 94, 231, 238, 122, 221, 64, 94, 53, 149, 20, 187, - 20, 247, 197, 173, 56, 55, 150, 140, 187, 10, 26, 252, 18, 24, 108, 3, - 245, 70, 231, 6, 96, 67, 230, 86, 236, 120, 56, 238, 15, 84, 10, 246, - 169, 86, 35, 249, 74, 211, 49, 90, 238, 237, 56, 172, 100, 150, 146, 153, - 7, 158, 47, 56, 41, 211, 30, 132, 219, 160, 91, 63, 0, 9, 139, 169, - 212, 44, 216, 241, 28, 55, 132, 2, 207, 240, 233, 214, 3, 235, 189, 111, - 243, 97, 91, 158, 184, 80, 111, 81, 245, 201, 84, 24, 86, 177, 141, 106, - 14, 173, 100, 30, 230, 33, 148, 252, 23, 101, 43, 146, 146, 97, 180, 184, - 24, 181, 138, 118, 58, 35, 125, 215, 27, 177, 90, 17, 80, 217, 4, 190, - 214, 138, 139, 40, 114, 177, 226, 241, 53, 188, 213, 19, 227, 31, 73, 101, - 13, 223, 50, 107, 86, 60, 73, 201, 210, 178, 18, 255, 35, 27, 143, 46, - 155, 74, 184, 211, 193, 95, 160, 82, 73, 226, 149, 14, 98, 120, 215, 16, - 151, 149, 184, 240, 62, 192, 46, 194, 46, 15, 45, 18, 186, 61, 29, 22, - 59, 89, 241, 48, 6, 40, 70, 33, 225, 168, 14, 106, 142, 248, 181, 223, - 71, 235, 124, 181, 15, 42, 6, 254, 80, 22, 243, 161, 165, 147, 220, 183, - 109, 66, 74, 216, 28, 157, 125, 147, 116, 146, 216, 71, 102, 65, 20, 163, - 242, 93, 51, 184, 101, 250, 165, 46, 121, 79, 232, 130, 155, 152, 41, 21, - 195, 221, 158, 0, 69, 144, 101, 213, 158, 68, 191, 240, 238, 32, 171, 227, - 191, 138, 221, 75, 9, 236, 183, 190, 246, 126, 34, 169, 225, 91, 45, 84, - 223, 155, 70, 212, 13, 121, 54, 11, 59, 243, 130, 163, 151, 16, 198, 67, - 6, 140, 3, 118, 49, 137, 63, 241, 217, 115, 40, 44, 58, 51, 130, 97, - 28, 236, 164, 34, 150, 98, 78, 35, 217, 47, 208, 249, 89, 216, 69, 61, - 199, 86, 58, 139, 205, 177, 88, 142, 132, 72, 250, 50, 179, 183, 243, 27, - 154, 179, 103, 11, 103, 158, 20, 7, 15, 147, 98, 211, 232, 246, 97, 167, - 169, 214, 163, 179, 184, 144, 192, 16, 212, 151, 66, 205, 34, 33, 22, 57, - 251, 30, 57, 139, 211, 78, 97, 22, 139, 176, 145, 39, 28, 68, 64, 150, - 90, 157, 63, 65, 82, 132, 138, 179, 123, 213, 96, 230, 162, 116, 109, 76, - 183, 239, 139, 50, 83, 178, 12, 132, 77, 205, 31, 80, 162, 87, 160, 36, - 210, 1, 61, 177, 228, 130, 77, 68, 196, 76, 176, 249, 22, 141, 12, 12, - 198, 200, 164, 76, 130, 49, 227, 185, 24, 224, 255, 121, 204, 196, 23, 19, - 148, 4, 64, 45, 54, 112, 253, 58, 236, 91, 49, 216, 109, 191, 227, 65, - 247, 25, 236, 119, 113, 218, 211, 20, 49, 114, 198, 37, 10, 238, 113, 153, - 19, 36, 135, 198, 176, 38, 143, 133, 154, 90, 23, 186, 240, 183, 6, 127, - 116, 156, 40, 135, 104, 52, 115, 36, 92, 128, 228, 114, 82, 85, 226, 240, - 192, 131, 166, 64, 132, 194, 34, 20, 146, 62, 80, 148, 31, 26, 88, 43, - 196, 224, 238, 13, 69, 227, 40, 160, 10, 90, 110, 13, 229, 90, 35, 212, - 154, 101, 251, 191, 112, 130, 170, 105, 242, 26, 9, 183, 100, 42, 141, 142, - 227, 112, 180, 34, 39, 34, 252, 99, 74, 111, 115, 178, 24, 135, 236, 2, - 122, 4, 83, 42, 56, 92, 10, 23, 0, 208, 67, 224, 149, 210, 221, 35, - 32, 211, 18, 92, 184, 206, 155, 162, 16, 21, 247, 170, 82, 61, 79, 202, - 139, 152, 133, 76, 89, 46, 163, 80, 73, 122, 2, 155, 190, 242, 34, 208, - 85, 18, 42, 34, 20, 44, 2, 202, 252, 60, 59, 63, 136, 6, 50, 181, - 141, 121, 32, 171, 208, 192, 44, 81, 61, 57, 142, 98, 18, 160, 131, 81, - 15, 78, 136, 161, 196, 70, 254, 174, 208, 240, 33, 5, 230, 140, 34, 70, - 170, 252, 211, 63, 148, 16, 14, 93, 207, 190, 192, 152, 113, 217, 129, 39, - 210, 192, 73, 10, 57, 51, 148, 51, 35, 182, 210, 42, 139, 70, 182, 217, - 11, 117, 50, 113, 2, 16, 26, 147, 193, 198, 100, 188, 250, 176, 243, 12, - 73, 136, 188, 113, 186, 43, 249, 187, 187, 56, 243, 153, 240, 137, 221, 0, - 131, 180, 108, 152, 112, 98, 57, 153, 248, 16, 41, 206, 24, 230, 66, 118, - 13, 145, 32, 187, 22, 139, 216, 157, 68, 196, 62, 69, 145, 167, 27, 52, - 134, 160, 241, 41, 105, 91, 186, 169, 78, 81, 146, 23, 79, 35, 66, 49, - 185, 39, 79, 122, 138, 82, 60, 30, 78, 218, 90, 17, 187, 134, 231, 240, - 108, 218, 193, 71, 130, 62, 112, 198, 69, 198, 24, 51, 102, 211, 14, 62, - 240, 44, 126, 182, 40, 73, 242, 68, 47, 34, 84, 43, 66, 21, 40, 226, - 153, 147, 32, 205, 203, 143, 124, 105, 2, 178, 163, 85, 180, 233, 170, 12, - 227, 78, 64, 102, 68, 45, 248, 88, 94, 116, 250, 99, 33, 195, 191, 38, - 41, 18, 104, 25, 81, 242, 2, 255, 202, 138, 240, 207, 39, 54, 90, 255, - 71, 197, 70, 249, 127, 74, 106, 68, 87, 156, 82, 171, 169, 246, 254, 18, - 137, 17, 238, 150, 237, 182, 214, 70, 129, 81, 255, 83, 129, 145, 147, 122, - 9, 31, 224, 11, 246, 142, 198, 137, 46, 157, 35, 177, 81, 151, 93, 64, - 15, 146, 72, 135, 5, 244, 178, 131, 186, 235, 203, 132, 34, 125, 223, 61, - 7, 183, 214, 15, 4, 0, 139, 45, 247, 159, 131, 7, 180, 196, 35, 255, - 193, 150, 57, 201, 128, 153, 38, 99, 251, 164, 34, 205, 174, 42, 252, 64, - 201, 120, 157, 238, 176, 25, 154, 53, 48, 186, 196, 66, 126, 225, 146, 109, - 27, 55, 231, 233, 31, 51, 220, 153, 145, 19, 12, 181, 97, 171, 19, 146, - 226, 52, 42, 70, 97, 38, 10, 54, 238, 224, 201, 164, 66, 155, 120, 253, - 9, 205, 169, 235, 79, 10, 4, 124, 99, 65, 47, 34, 6, 225, 11, 62, - 241, 144, 188, 214, 131, 185, 108, 225, 214, 72, 163, 73, 214, 187, 203, 52, - 134, 110, 95, 194, 17, 72, 36, 80, 168, 207, 32, 55, 124, 134, 234, 79, - 47, 129, 145, 95, 114, 73, 197, 5, 9, 221, 86, 233, 75, 191, 60, 248, - 210, 138, 209, 95, 84, 191, 255, 59, 195, 47, 254, 217, 59, 48, 125, 105, - 25, 114, 172, 238, 214, 50, 236, 144, 126, 17, 61, 62, 110, 220, 42, 220, - 145, 254, 25, 228, 145, 254, 6, 246, 72, 203, 209, 71, 154, 195, 31, 105, - 30, 129, 28, 56, 145, 90, 135, 203, 235, 171, 138, 203, 236, 227, 171, 195, - 155, 49, 197, 134, 134, 222, 110, 151, 47, 249, 115, 159, 63, 183, 196, 50, - 240, 132, 86, 165, 108, 90, 21, 195, 114, 62, 160, 133, 159, 177, 245, 172, - 102, 198, 200, 255, 130, 198, 131, 191, 41, 62, 109, 5, 227, 135, 84, 172, - 247, 44, 238, 97, 153, 83, 239, 73, 188, 140, 143, 122, 12, 46, 87, 252, - 83, 48, 54, 36, 166, 22, 145, 88, 72, 30, 212, 138, 160, 94, 17, 87, - 226, 171, 38, 41, 99, 105, 24, 5, 69, 17, 179, 94, 164, 15, 42, 198, - 103, 115, 158, 248, 247, 217, 231, 172, 176, 36, 125, 196, 10, 123, 170, 4, - 12, 228, 69, 6, 113, 246, 216, 42, 42, 44, 183, 15, 236, 69, 95, 0, - 64, 183, 168, 230, 164, 191, 198, 12, 171, 156, 45, 149, 197, 168, 148, 82, - 19, 149, 170, 73, 12, 175, 44, 173, 245, 245, 53, 59, 61, 138, 199, 19, - 131, 152, 148, 202, 248, 249, 92, 26, 71, 135, 211, 204, 32, 105, 203, 212, - 0, 37, 41, 88, 176, 91, 178, 253, 135, 154, 150, 53, 89, 154, 47, 3, - 213, 23, 50, 148, 12, 200, 51, 17, 9, 54, 57, 187, 6, 93, 153, 133, - 230, 177, 213, 207, 180, 74, 192, 155, 170, 138, 159, 107, 85, 149, 69, 165, - 1, 104, 13, 99, 89, 129, 150, 38, 158, 53, 146, 13, 40, 14, 96, 53, - 159, 169, 14, 44, 99, 77, 169, 65, 31, 114, 165, 11, 130, 96, 7, 39, - 185, 212, 151, 240, 136, 33, 78, 140, 52, 234, 240, 92, 254, 51, 209, 239, - 41, 59, 98, 199, 241, 209, 79, 227, 34, 61, 59, 120, 169, 127, 13, 89, - 151, 76, 158, 88, 23, 198, 163, 164, 35, 167, 51, 32, 141, 99, 211, 200, - 58, 12, 98, 90, 206, 75, 179, 239, 211, 100, 36, 239, 124, 208, 129, 46, - 16, 77, 41, 70, 178, 135, 18, 192, 226, 2, 199, 214, 51, 129, 58, 89, - 99, 178, 198, 53, 58, 36, 5, 22, 193, 229, 48, 109, 100, 100, 91, 51, - 162, 78, 72, 139, 199, 100, 188, 67, 40, 200, 208, 166, 136, 157, 5, 78, - 86, 68, 78, 54, 49, 121, 98, 105, 95, 80, 116, 17, 114, 217, 59, 197, - 227, 244, 162, 192, 106, 36, 18, 200, 105, 66, 85, 106, 146, 85, 85, 100, - 199, 196, 36, 120, 85, 157, 148, 146, 143, 61, 20, 198, 79, 201, 28, 37, - 174, 56, 47, 99, 106, 26, 211, 209, 162, 65, 114, 214, 50, 71, 223, 54, - 28, 201, 56, 231, 2, 89, 231, 37, 135, 66, 142, 217, 242, 62, 0, 155, - 145, 64, 92, 154, 239, 71, 82, 230, 77, 195, 19, 240, 64, 183, 84, 106, - 161, 175, 111, 114, 194, 223, 187, 140, 215, 59, 228, 195, 130, 189, 115, 16, - 33, 192, 3, 255, 66, 39, 17, 153, 56, 59, 195, 155, 24, 154, 18, 87, - 76, 10, 164, 244, 116, 52, 18, 86, 48, 179, 169, 143, 88, 217, 207, 32, - 7, 108, 87, 74, 120, 154, 111, 80, 144, 229, 84, 136, 27, 129, 6, 46, - 36, 115, 57, 80, 135, 53, 196, 107, 2, 139, 69, 242, 129, 12, 150, 42, - 59, 140, 28, 203, 138, 98, 25, 122, 197, 153, 1, 156, 30, 114, 153, 30, - 75, 188, 172, 52, 55, 41, 177, 146, 191, 84, 43, 93, 55, 240, 49, 144, - 203, 146, 19, 9, 143, 92, 219, 41, 231, 244, 86, 113, 109, 48, 37, 187, - 167, 128, 95, 221, 83, 250, 227, 159, 156, 119, 251, 39, 79, 204, 253, 140, - 80, 106, 145, 19, 114, 14, 208, 213, 127, 246, 0, 125, 73, 113, 127, 243, - 0, 221, 71, 203, 188, 47, 161, 133, 223, 7, 64, 129, 26, 72, 8, 191, - 127, 74, 7, 179, 180, 139, 247, 82, 121, 56, 80, 71, 120, 182, 90, 110, - 0, 89, 219, 51, 240, 20, 164, 98, 24, 189, 17, 5, 178, 99, 115, 50, - 139, 75, 215, 250, 81, 127, 18, 77, 89, 186, 166, 248, 228, 162, 43, 102, - 34, 133, 76, 78, 34, 204, 83, 67, 243, 199, 222, 176, 123, 40, 59, 194, - 80, 195, 26, 77, 238, 58, 214, 113, 46, 7, 17, 212, 0, 115, 25, 209, - 252, 254, 225, 229, 95, 95, 63, 138, 50, 157, 247, 122, 93, 41, 202, 169, - 172, 227, 120, 198, 235, 208, 42, 179, 15, 158, 158, 58, 110, 127, 117, 93, - 235, 90, 79, 180, 160, 141, 5, 99, 232, 108, 19, 176, 113, 40, 116, 121, - 205, 39, 154, 172, 25, 189, 190, 144, 35, 221, 162, 2, 170, 43, 122, 71, - 195, 12, 220, 40, 183, 17, 67, 243, 67, 240, 107, 23, 109, 221, 1, 243, - 17, 8, 114, 206, 39, 212, 134, 46, 58, 199, 193, 186, 73, 234, 240, 120, - 40, 204, 45, 35, 169, 206, 106, 166, 254, 40, 42, 139, 135, 191, 139, 240, - 103, 187, 253, 242, 93, 158, 14, 235, 25, 164, 81, 29, 158, 229, 96, 161, - 64, 55, 232, 232, 239, 28, 53, 204, 158, 5, 57, 17, 81, 69, 15, 101, - 68, 79, 42, 73, 163, 48, 11, 11, 56, 14, 203, 9, 130, 16, 157, 6, - 164, 132, 52, 106, 218, 147, 168, 83, 75, 230, 68, 29, 37, 80, 56, 103, - 240, 238, 0, 94, 193, 128, 71, 139, 4, 159, 97, 249, 199, 143, 218, 0, - 122, 141, 114, 63, 37, 14, 43, 182, 6, 168, 1, 153, 195, 33, 114, 131, - 23, 219, 22, 138, 104, 245, 9, 90, 25, 123, 130, 101, 230, 69, 52, 191, - 226, 197, 224, 248, 247, 16, 52, 55, 137, 186, 18, 229, 182, 94, 5, 106, - 168, 173, 117, 33, 41, 214, 174, 196, 14, 99, 182, 56, 198, 52, 149, 110, - 19, 2, 129, 248, 233, 42, 49, 29, 3, 113, 230, 199, 69, 231, 85, 138, - 199, 215, 128, 226, 72, 247, 245, 239, 161, 18, 36, 124, 18, 146, 120, 67, - 24, 126, 164, 172, 8, 187, 172, 234, 189, 42, 248, 170, 208, 43, 170, 130, - 81, 136, 19, 128, 119, 5, 48, 85, 146, 93, 47, 150, 178, 194, 11, 148, - 183, 6, 164, 223, 90, 68, 89, 131, 134, 125, 15, 221, 251, 186, 17, 179, - 19, 144, 48, 190, 54, 250, 42, 167, 71, 98, 108, 204, 190, 90, 240, 213, - 130, 238, 97, 146, 82, 156, 160, 1, 217, 18, 197, 206, 160, 29, 43, 137, - 176, 52, 197, 146, 208, 155, 56, 5, 195, 62, 130, 16, 131, 1, 40, 226, - 193, 125, 76, 38, 169, 50, 214, 174, 98, 117, 113, 55, 73, 177, 40, 139, - 161, 109, 234, 25, 0, 111, 109, 72, 203, 251, 139, 19, 212, 50, 135, 138, - 209, 172, 198, 158, 96, 142, 53, 97, 52, 134, 194, 75, 92, 164, 197, 28, - 218, 31, 167, 127, 120, 242, 23, 123, 131, 212, 208, 229, 183, 31, 170, 8, - 212, 194, 155, 24, 210, 37, 132, 170, 209, 132, 152, 132, 64, 170, 115, 98, - 6, 235, 148, 3, 193, 72, 133, 136, 57, 12, 87, 2, 225, 64, 148, 195, - 191, 60, 68, 192, 206, 52, 110, 246, 186, 177, 175, 72, 2, 220, 63, 233, - 80, 208, 11, 62, 101, 254, 84, 240, 41, 139, 219, 212, 22, 225, 144, 46, - 228, 164, 150, 11, 158, 160, 31, 203, 76, 1, 96, 48, 46, 185, 60, 154, - 123, 95, 156, 202, 164, 82, 142, 132, 54, 17, 232, 34, 78, 58, 199, 117, - 227, 7, 203, 50, 149, 18, 153, 254, 33, 205, 92, 159, 110, 95, 34, 211, - 217, 12, 208, 14, 186, 39, 4, 60, 170, 5, 242, 192, 130, 237, 51, 114, - 112, 185, 191, 197, 86, 232, 149, 107, 46, 164, 216, 116, 23, 222, 33, 215, - 87, 130, 5, 68, 51, 170, 80, 83, 93, 32, 23, 186, 236, 152, 202, 43, - 119, 217, 226, 75, 253, 255, 104, 253, 93, 214, 172, 34, 58, 58, 165, 83, - 232, 168, 16, 243, 215, 187, 234, 142, 72, 151, 105, 35, 1, 130, 183, 122, - 237, 58, 173, 186, 25, 160, 63, 171, 237, 129, 65, 31, 170, 43, 189, 208, - 232, 123, 197, 57, 33, 54, 54, 52, 7, 183, 191, 56, 98, 184, 12, 127, - 54, 78, 229, 149, 85, 173, 168, 134, 44, 98, 153, 152, 188, 56, 117, 12, - 217, 201, 113, 212, 216, 237, 54, 42, 122, 219, 137, 147, 4, 215, 234, 19, - 18, 143, 44, 84, 208, 28, 131, 84, 124, 172, 189, 33, 246, 86, 106, 54, - 214, 16, 227, 27, 85, 152, 198, 107, 200, 125, 209, 57, 195, 175, 23, 50, - 135, 48, 62, 44, 9, 51, 107, 37, 139, 188, 28, 63, 215, 227, 87, 31, - 233, 132, 207, 223, 1, 58, 30, 12, 82, 120, 141, 26, 157, 7, 61, 69, - 214, 94, 102, 252, 72, 143, 206, 16, 101, 220, 77, 149, 252, 119, 186, 37, - 144, 147, 240, 36, 6, 243, 162, 106, 36, 123, 133, 45, 85, 196, 63, 84, - 141, 33, 11, 4, 162, 194, 68, 203, 84, 158, 140, 12, 37, 30, 226, 81, - 164, 240, 234, 228, 240, 8, 73, 60, 53, 66, 20, 194, 251, 111, 232, 200, - 208, 91, 18, 172, 30, 53, 118, 224, 54, 219, 55, 35, 151, 221, 202, 178, - 180, 174, 9, 4, 13, 174, 17, 214, 167, 100, 25, 79, 188, 72, 151, 57, - 17, 139, 132, 153, 214, 110, 235, 125, 83, 251, 91, 164, 153, 43, 246, 130, - 2, 126, 129, 76, 115, 26, 179, 64, 163, 241, 182, 44, 165, 210, 172, 63, - 73, 165, 249, 251, 69, 116, 154, 24, 32, 210, 148, 104, 64, 135, 3, 190, - 151, 47, 29, 232, 152, 121, 128, 122, 122, 78, 163, 81, 49, 0, 248, 18, - 190, 89, 42, 117, 91, 80, 21, 143, 32, 115, 82, 229, 50, 162, 79, 121, - 33, 18, 90, 24, 135, 95, 163, 206, 188, 97, 251, 251, 228, 153, 163, 152, - 160, 144, 98, 194, 7, 180, 154, 173, 184, 35, 244, 39, 168, 53, 14, 239, - 191, 78, 175, 209, 120, 120, 146, 158, 21, 228, 219, 154, 48, 141, 1, 205, - 66, 183, 52, 211, 174, 64, 167, 195, 5, 58, 167, 40, 208, 249, 5, 26, - 174, 241, 57, 1, 247, 93, 216, 238, 249, 98, 36, 127, 248, 19, 188, 66, - 219, 96, 163, 40, 2, 108, 255, 3, 185, 190, 73, 139, 4, 31, 146, 84, - 64, 186, 0, 37, 39, 188, 36, 138, 68, 67, 69, 228, 239, 161, 107, 34, - 109, 46, 69, 97, 159, 254, 109, 33, 45, 179, 11, 97, 154, 222, 140, 93, - 67, 41, 6, 18, 41, 187, 80, 33, 188, 42, 244, 42, 191, 4, 9, 197, - 221, 39, 245, 69, 220, 133, 37, 198, 35, 14, 63, 34, 184, 12, 57, 29, - 35, 74, 47, 254, 231, 233, 46, 101, 141, 40, 175, 164, 161, 164, 141, 143, - 233, 47, 64, 129, 55, 92, 63, 132, 100, 242, 205, 197, 6, 36, 156, 238, - 69, 232, 81, 66, 120, 91, 139, 100, 68, 232, 16, 127, 99, 4, 157, 71, - 115, 109, 139, 219, 61, 106, 223, 135, 68, 212, 104, 201, 2, 57, 170, 24, - 125, 92, 29, 71, 159, 174, 142, 152, 114, 113, 105, 164, 80, 244, 196, 10, - 109, 102, 171, 224, 234, 53, 12, 214, 40, 76, 142, 26, 45, 52, 95, 150, - 174, 84, 163, 149, 43, 21, 58, 253, 116, 106, 41, 202, 217, 192, 146, 227, - 137, 114, 21, 49, 106, 23, 237, 228, 40, 173, 124, 31, 23, 199, 201, 22, - 60, 141, 162, 249, 110, 88, 49, 123, 205, 78, 140, 215, 198, 241, 239, 149, - 34, 195, 132, 177, 104, 199, 191, 103, 215, 80, 157, 202, 72, 203, 82, 124, - 237, 9, 101, 207, 149, 56, 233, 97, 85, 226, 47, 190, 251, 110, 212, 77, - 217, 211, 29, 102, 221, 254, 181, 101, 136, 131, 200, 191, 6, 101, 103, 27, - 75, 22, 145, 121, 248, 44, 172, 26, 216, 125, 190, 68, 200, 43, 102, 56, - 238, 242, 245, 47, 69, 249, 231, 79, 243, 11, 44, 86, 161, 128, 193, 76, - 213, 111, 48, 51, 128, 1, 232, 156, 21, 128, 172, 59, 135, 33, 79, 225, - 105, 228, 75, 50, 178, 129, 170, 179, 47, 120, 28, 215, 65, 143, 110, 232, - 148, 59, 60, 29, 161, 172, 122, 218, 162, 223, 58, 253, 154, 176, 8, 213, - 123, 176, 61, 117, 123, 232, 174, 30, 149, 179, 209, 171, 112, 5, 123, 228, - 223, 161, 184, 120, 129, 209, 40, 11, 4, 7, 10, 86, 73, 189, 69, 98, - 183, 251, 101, 193, 79, 48, 96, 51, 29, 74, 65, 118, 180, 103, 229, 23, - 31, 166, 175, 9, 115, 247, 27, 184, 207, 114, 2, 34, 226, 40, 106, 213, - 87, 44, 216, 151, 153, 35, 231, 159, 64, 54, 145, 197, 229, 150, 213, 193, - 99, 22, 190, 197, 254, 20, 152, 235, 116, 212, 31, 197, 16, 178, 9, 42, - 150, 71, 6, 122, 37, 26, 25, 72, 214, 26, 158, 50, 169, 167, 233, 105, - 104, 120, 28, 233, 84, 202, 180, 243, 161, 219, 41, 170, 221, 57, 26, 67, - 203, 155, 166, 16, 107, 247, 200, 11, 42, 108, 225, 70, 101, 36, 68, 201, - 190, 104, 148, 55, 0, 214, 8, 88, 253, 125, 198, 58, 169, 213, 31, 236, - 222, 188, 91, 212, 41, 82, 82, 116, 91, 93, 12, 59, 103, 48, 193, 214, - 203, 81, 191, 125, 196, 93, 187, 210, 233, 183, 181, 152, 25, 135, 15, 104, - 207, 55, 199, 252, 40, 53, 93, 36, 227, 174, 65, 88, 34, 192, 68, 189, - 211, 12, 205, 131, 152, 159, 130, 200, 197, 48, 181, 38, 204, 40, 237, 112, - 152, 81, 218, 242, 204, 51, 228, 234, 157, 97, 2, 22, 203, 33, 242, 228, - 139, 103, 13, 85, 126, 221, 240, 11, 74, 80, 245, 39, 153, 157, 89, 194, - 228, 68, 178, 30, 213, 109, 58, 2, 30, 74, 226, 217, 166, 140, 199, 175, - 254, 6, 56, 46, 166, 35, 50, 80, 242, 17, 53, 84, 54, 7, 85, 215, - 207, 122, 168, 172, 177, 126, 226, 43, 31, 14, 124, 5, 58, 210, 23, 193, - 160, 22, 81, 194, 161, 55, 212, 32, 148, 194, 194, 27, 42, 16, 34, 33, - 26, 14, 53, 123, 101, 40, 73, 94, 176, 123, 72, 13, 166, 72, 110, 165, - 108, 99, 157, 189, 152, 208, 169, 216, 211, 244, 143, 217, 139, 24, 37, 104, - 71, 197, 108, 156, 162, 98, 250, 83, 246, 165, 88, 44, 71, 133, 40, 146, - 227, 206, 215, 183, 40, 238, 175, 36, 234, 201, 49, 33, 63, 94, 226, 37, - 9, 214, 52, 26, 22, 194, 209, 217, 92, 131, 201, 64, 240, 23, 202, 57, - 115, 187, 133, 142, 224, 217, 225, 111, 248, 27, 230, 89, 82, 72, 16, 110, - 117, 173, 214, 174, 48, 125, 66, 0, 30, 187, 125, 71, 141, 96, 234, 72, - 172, 150, 162, 83, 139, 7, 85, 172, 200, 151, 110, 177, 30, 18, 223, 63, - 69, 195, 232, 48, 30, 45, 0, 71, 55, 61, 189, 228, 125, 60, 66, 54, - 198, 2, 217, 82, 51, 163, 192, 103, 49, 248, 74, 140, 213, 152, 107, 162, - 87, 41, 182, 144, 27, 49, 14, 45, 173, 144, 90, 26, 137, 206, 62, 110, - 154, 31, 142, 178, 7, 71, 200, 39, 56, 225, 208, 61, 242, 95, 238, 204, - 135, 98, 132, 240, 35, 66, 200, 26, 113, 82, 33, 161, 59, 15, 80, 30, - 229, 2, 115, 1, 222, 102, 205, 208, 251, 190, 222, 56, 255, 96, 242, 188, - 153, 128, 253, 164, 230, 233, 187, 206, 96, 116, 230, 203, 224, 62, 233, 93, - 92, 95, 58, 19, 216, 66, 231, 204, 75, 152, 102, 192, 193, 27, 22, 80, - 115, 197, 133, 185, 227, 3, 48, 207, 69, 94, 217, 53, 188, 207, 250, 220, - 125, 70, 122, 148, 251, 175, 231, 207, 106, 120, 13, 254, 131, 253, 64, 18, - 97, 116, 191, 57, 209, 93, 72, 205, 236, 2, 126, 128, 100, 78, 13, 100, - 33, 26, 231, 7, 160, 70, 44, 17, 7, 216, 191, 227, 221, 38, 88, 247, - 140, 34, 12, 19, 83, 63, 72, 49, 37, 60, 95, 140, 103, 125, 11, 150, - 137, 197, 169, 22, 230, 196, 68, 56, 42, 174, 199, 25, 26, 164, 132, 245, - 32, 30, 0, 247, 25, 77, 249, 166, 70, 202, 65, 12, 95, 136, 90, 240, - 0, 22, 241, 64, 71, 29, 246, 98, 128, 226, 126, 243, 199, 250, 227, 220, - 54, 251, 18, 68, 220, 64, 47, 93, 130, 235, 204, 114, 157, 100, 2, 185, - 0, 255, 57, 64, 237, 68, 166, 28, 232, 51, 170, 61, 50, 117, 11, 241, - 131, 158, 236, 147, 122, 154, 133, 95, 66, 64, 149, 8, 252, 191, 112, 8, - 181, 64, 156, 27, 42, 176, 185, 227, 45, 93, 236, 243, 207, 48, 30, 59, - 86, 96, 37, 227, 39, 173, 12, 225, 230, 214, 184, 121, 108, 233, 183, 117, - 139, 15, 99, 94, 90, 44, 246, 25, 255, 235, 70, 76, 2, 233, 98, 233, - 168, 95, 226, 116, 149, 55, 190, 22, 49, 89, 215, 124, 125, 241, 221, 39, - 225, 38, 88, 9, 54, 76, 229, 25, 103, 230, 234, 105, 229, 96, 152, 11, - 129, 176, 80, 197, 21, 29, 144, 19, 94, 96, 73, 103, 45, 20, 60, 240, - 224, 122, 128, 242, 124, 224, 172, 186, 48, 140, 62, 132, 10, 71, 93, 242, - 52, 44, 230, 81, 59, 23, 175, 1, 208, 46, 60, 151, 46, 176, 55, 67, - 98, 25, 77, 38, 1, 220, 153, 140, 138, 57, 23, 192, 133, 199, 2, 28, - 51, 244, 74, 59, 62, 251, 8, 176, 133, 156, 135, 231, 192, 114, 48, 68, - 151, 34, 229, 161, 5, 168, 236, 154, 243, 12, 180, 155, 44, 104, 182, 43, - 53, 224, 220, 45, 67, 224, 19, 1, 72, 52, 47, 5, 118, 3, 209, 14, - 176, 206, 161, 74, 194, 176, 91, 36, 68, 181, 32, 56, 85, 101, 113, 235, - 101, 122, 65, 46, 2, 114, 252, 195, 209, 36, 69, 88, 47, 174, 139, 97, - 99, 190, 63, 251, 111, 78, 187, 216, 16, 153, 86, 205, 136, 111, 193, 157, - 33, 98, 44, 197, 12, 52, 238, 66, 61, 246, 186, 57, 215, 165, 57, 242, - 7, 250, 6, 67, 26, 49, 157, 182, 120, 19, 101, 33, 165, 147, 228, 131, - 242, 126, 185, 184, 85, 165, 145, 249, 245, 176, 232, 100, 107, 206, 120, 200, - 242, 212, 177, 110, 15, 5, 231, 241, 64, 6, 55, 208, 205, 195, 136, 38, - 31, 252, 184, 153, 168, 249, 161, 15, 140, 226, 70, 81, 5, 68, 69, 26, - 7, 111, 43, 225, 53, 2, 88, 243, 185, 117, 211, 48, 185, 19, 69, 195, - 225, 192, 122, 2, 6, 1, 10, 124, 23, 90, 95, 49, 53, 108, 121, 40, - 12, 97, 239, 80, 24, 124, 180, 190, 198, 224, 43, 161, 196, 221, 72, 247, - 59, 144, 64, 142, 255, 200, 228, 25, 113, 211, 113, 66, 80, 83, 134, 76, - 136, 121, 83, 38, 140, 36, 14, 44, 42, 144, 64, 156, 70, 168, 164, 217, - 11, 172, 90, 66, 76, 45, 136, 46, 82, 213, 16, 57, 2, 56, 6, 93, - 139, 115, 117, 107, 236, 87, 162, 200, 76, 153, 49, 114, 135, 219, 234, 194, - 226, 126, 0, 218, 65, 215, 57, 46, 34, 76, 96, 57, 154, 70, 145, 102, - 164, 215, 25, 188, 254, 115, 32, 146, 21, 245, 19, 24, 201, 74, 118, 85, - 135, 221, 238, 53, 161, 123, 80, 82, 28, 237, 38, 100, 197, 249, 153, 245, - 151, 186, 252, 228, 246, 248, 229, 31, 237, 112, 65, 254, 164, 191, 5, 245, - 211, 238, 194, 224, 138, 5, 25, 122, 91, 80, 255, 110, 103, 217, 63, 166, - 21, 233, 236, 88, 180, 171, 152, 232, 119, 194, 154, 209, 150, 72, 59, 200, - 10, 18, 205, 217, 40, 150, 147, 87, 243, 4, 20, 110, 171, 238, 174, 141, - 138, 59, 46, 63, 237, 4, 154, 180, 172, 125, 66, 92, 165, 132, 224, 102, - 70, 167, 167, 254, 78, 120, 117, 80, 162, 21, 180, 0, 188, 185, 244, 9, - 154, 184, 13, 251, 2, 60, 210, 99, 35, 64, 157, 185, 18, 32, 39, 168, - 233, 203, 68, 180, 204, 134, 187, 7, 135, 163, 192, 170, 115, 41, 82, 50, - 176, 5, 211, 206, 233, 148, 80, 11, 63, 9, 215, 61, 11, 104, 250, 238, - 160, 83, 213, 12, 100, 123, 29, 39, 17, 223, 48, 149, 179, 207, 8, 47, - 1, 82, 101, 129, 4, 245, 237, 125, 223, 160, 94, 129, 89, 98, 142, 32, - 223, 200, 108, 73, 207, 188, 189, 69, 198, 43, 184, 152, 96, 187, 168, 199, - 152, 157, 233, 141, 248, 247, 109, 88, 147, 148, 159, 63, 241, 145, 167, 71, - 134, 125, 101, 84, 246, 200, 176, 71, 142, 61, 214, 233, 145, 101, 41, 179, - 5, 122, 228, 88, 202, 2, 203, 39, 163, 189, 58, 221, 49, 100, 189, 193, - 93, 147, 132, 28, 159, 37, 104, 126, 25, 144, 18, 21, 181, 184, 74, 22, - 234, 100, 69, 136, 146, 119, 77, 44, 71, 228, 217, 28, 177, 58, 250, 33, - 227, 85, 4, 79, 185, 109, 145, 150, 225, 4, 60, 73, 40, 60, 244, 115, - 41, 242, 175, 161, 231, 238, 87, 65, 216, 194, 104, 116, 107, 210, 214, 72, - 222, 96, 12, 218, 220, 84, 119, 20, 75, 137, 166, 48, 25, 37, 189, 110, - 233, 38, 73, 31, 132, 86, 197, 20, 170, 120, 127, 159, 124, 149, 147, 139, - 46, 36, 121, 185, 73, 130, 246, 152, 242, 8, 59, 61, 18, 230, 104, 192, - 174, 125, 89, 82, 8, 32, 204, 160, 93, 71, 93, 213, 90, 175, 175, 107, - 245, 180, 65, 28, 18, 250, 192, 16, 162, 228, 252, 200, 108, 85, 12, 45, - 141, 237, 79, 122, 13, 76, 123, 175, 204, 255, 141, 219, 66, 248, 87, 14, - 51, 206, 42, 28, 139, 195, 215, 20, 254, 158, 173, 118, 15, 205, 36, 212, - 6, 134, 208, 55, 180, 161, 208, 235, 91, 120, 221, 180, 99, 82, 100, 25, - 189, 54, 148, 125, 221, 255, 249, 147, 203, 21, 40, 122, 251, 252, 180, 116, - 185, 91, 58, 121, 40, 82, 129, 207, 128, 224, 70, 241, 25, 230, 8, 70, - 148, 239, 206, 47, 119, 174, 158, 232, 117, 27, 223, 95, 102, 207, 97, 74, - 133, 21, 173, 78, 6, 227, 133, 9, 57, 135, 131, 237, 41, 18, 223, 141, - 15, 216, 181, 125, 130, 5, 63, 171, 213, 173, 82, 74, 122, 163, 196, 31, - 177, 95, 108, 204, 63, 34, 110, 151, 167, 112, 86, 180, 85, 249, 61, 246, - 203, 73, 129, 141, 138, 56, 141, 99, 124, 156, 16, 78, 186, 47, 238, 91, - 130, 179, 60, 44, 37, 174, 199, 212, 229, 136, 211, 27, 55, 26, 191, 18, - 156, 157, 14, 155, 40, 13, 15, 3, 101, 28, 126, 249, 46, 152, 192, 225, - 145, 137, 12, 146, 119, 208, 151, 251, 214, 27, 88, 254, 136, 158, 251, 230, - 186, 143, 225, 223, 29, 148, 18, 120, 146, 163, 57, 79, 67, 1, 62, 18, - 184, 160, 200, 143, 151, 5, 231, 66, 202, 191, 201, 45, 6, 162, 147, 209, - 217, 95, 224, 30, 35, 83, 32, 12, 149, 150, 102, 63, 163, 216, 211, 154, - 145, 189, 247, 121, 62, 209, 21, 144, 185, 18, 159, 136, 31, 247, 88, 13, - 12, 36, 146, 200, 128, 210, 210, 218, 125, 108, 144, 99, 119, 49, 144, 129, - 180, 248, 205, 231, 176, 144, 76, 10, 128, 248, 48, 77, 216, 121, 180, 7, - 53, 162, 226, 55, 112, 99, 99, 96, 119, 72, 216, 167, 63, 36, 220, 157, - 128, 106, 46, 135, 23, 195, 163, 72, 77, 195, 127, 209, 48, 191, 107, 240, - 194, 56, 78, 78, 248, 99, 154, 241, 138, 38, 81, 231, 137, 197, 115, 162, - 9, 80, 62, 232, 96, 39, 103, 0, 175, 165, 249, 103, 254, 201, 136, 64, - 91, 92, 96, 249, 6, 63, 183, 192, 66, 249, 108, 54, 123, 59, 49, 195, - 106, 193, 141, 161, 70, 208, 43, 223, 113, 105, 42, 192, 214, 64, 136, 230, - 201, 76, 44, 74, 253, 28, 14, 7, 50, 192, 183, 19, 79, 179, 46, 18, - 211, 106, 173, 30, 4, 63, 59, 131, 0, 168, 14, 235, 232, 115, 24, 182, - 206, 231, 231, 216, 211, 31, 194, 203, 243, 115, 226, 249, 57, 142, 159, 178, - 144, 196, 31, 10, 128, 119, 252, 248, 214, 124, 70, 91, 182, 142, 156, 198, - 170, 161, 227, 1, 92, 190, 112, 29, 131, 165, 10, 86, 228, 176, 59, 83, - 124, 80, 161, 193, 141, 178, 230, 19, 10, 109, 204, 162, 95, 112, 86, 178, - 25, 178, 24, 211, 227, 49, 95, 104, 242, 204, 197, 139, 124, 114, 59, 242, - 205, 85, 169, 248, 84, 23, 115, 48, 211, 56, 24, 224, 255, 112, 56, 144, - 46, 76, 80, 120, 14, 39, 87, 4, 175, 8, 79, 44, 4, 199, 17, 32, - 207, 22, 81, 79, 207, 161, 176, 111, 67, 16, 34, 49, 220, 55, 96, 11, - 20, 146, 119, 2, 107, 128, 139, 72, 44, 175, 16, 255, 238, 172, 53, 210, - 247, 239, 116, 100, 17, 144, 140, 120, 36, 26, 243, 115, 22, 36, 198, 162, - 47, 62, 96, 46, 141, 116, 224, 201, 164, 2, 211, 57, 68, 159, 39, 201, - 102, 139, 0, 243, 147, 126, 126, 136, 45, 11, 95, 21, 145, 88, 12, 143, - 255, 25, 88, 173, 104, 236, 71, 240, 227, 189, 208, 204, 74, 237, 121, 97, - 163, 158, 175, 43, 130, 147, 196, 191, 50, 81, 193, 108, 247, 71, 66, 164, - 174, 27, 240, 49, 131, 63, 78, 6, 104, 66, 114, 79, 112, 41, 9, 33, - 217, 115, 157, 169, 153, 2, 206, 251, 165, 162, 73, 78, 108, 209, 57, 16, - 9, 37, 35, 178, 71, 160, 255, 248, 178, 115, 190, 125, 253, 80, 218, 101, - 231, 68, 165, 155, 173, 147, 195, 109, 132, 105, 58, 125, 167, 110, 167, 211, - 59, 215, 59, 194, 253, 193, 245, 233, 137, 32, 167, 36, 225, 26, 205, 55, - 113, 17, 119, 58, 189, 123, 246, 140, 83, 30, 157, 184, 125, 75, 167, 71, - 163, 81, 106, 164, 166, 122, 70, 51, 125, 125, 153, 182, 177, 56, 25, 179, - 243, 215, 164, 229, 203, 155, 170, 91, 245, 231, 240, 6, 116, 236, 7, 182, - 142, 94, 24, 1, 32, 208, 109, 157, 231, 176, 165, 217, 86, 250, 181, 50, - 172, 176, 96, 168, 200, 52, 106, 16, 142, 142, 64, 201, 209, 125, 218, 125, - 75, 189, 2, 12, 55, 126, 164, 89, 74, 42, 11, 71, 10, 134, 167, 13, - 25, 76, 107, 12, 84, 99, 75, 211, 176, 12, 127, 225, 53, 19, 65, 223, - 50, 180, 198, 138, 98, 89, 130, 244, 175, 52, 14, 211, 180, 204, 20, 221, - 92, 209, 107, 230, 142, 110, 0, 117, 16, 245, 10, 117, 34, 210, 209, 239, - 44, 37, 63, 171, 218, 110, 87, 76, 243, 12, 239, 208, 22, 233, 50, 147, - 150, 172, 246, 12, 24, 44, 74, 22, 232, 81, 218, 133, 83, 181, 87, 31, - 227, 11, 59, 33, 5, 188, 235, 8, 97, 64, 61, 60, 2, 92, 164, 169, - 208, 239, 16, 130, 63, 204, 82, 53, 26, 171, 146, 53, 26, 94, 58, 109, - 89, 105, 154, 29, 40, 75, 91, 90, 22, 38, 114, 75, 98, 6, 106, 204, - 154, 123, 14, 53, 79, 55, 174, 110, 46, 119, 201, 69, 252, 40, 47, 37, - 52, 0, 100, 173, 26, 233, 13, 190, 123, 227, 103, 95, 160, 209, 133, 17, - 233, 192, 148, 213, 187, 201, 182, 214, 176, 190, 101, 165, 190, 141, 8, 97, - 89, 27, 190, 70, 200, 156, 195, 91, 94, 45, 111, 244, 170, 122, 211, 80, - 214, 143, 116, 127, 35, 208, 41, 146, 219, 67, 108, 120, 69, 201, 30, 196, - 230, 138, 213, 236, 16, 101, 115, 251, 129, 221, 250, 97, 145, 159, 193, 213, - 29, 18, 216, 101, 183, 231, 240, 122, 246, 55, 248, 170, 54, 153, 186, 227, - 115, 248, 43, 179, 33, 142, 97, 132, 60, 78, 120, 21, 232, 149, 55, 55, - 20, 2, 100, 248, 192, 67, 246, 62, 218, 207, 233, 54, 33, 36, 195, 67, - 76, 52, 231, 65, 33, 18, 64, 14, 87, 200, 31, 150, 1, 77, 162, 59, - 120, 16, 217, 133, 24, 37, 88, 169, 68, 255, 33, 156, 27, 61, 180, 25, - 196, 195, 129, 47, 180, 52, 12, 173, 110, 240, 147, 87, 228, 151, 7, 166, - 246, 237, 71, 186, 10, 48, 196, 196, 240, 176, 234, 248, 99, 112, 128, 2, - 106, 172, 26, 30, 31, 70, 45, 133, 34, 148, 130, 112, 243, 10, 146, 92, - 176, 174, 26, 23, 31, 51, 226, 22, 203, 200, 154, 200, 52, 137, 120, 61, - 131, 39, 206, 149, 25, 31, 153, 150, 178, 241, 163, 226, 172, 20, 95, 129, - 8, 198, 254, 233, 157, 166, 80, 105, 91, 16, 226, 7, 177, 228, 46, 84, - 16, 159, 70, 197, 197, 50, 80, 66, 169, 126, 183, 73, 75, 201, 143, 116, - 101, 227, 247, 110, 213, 236, 127, 103, 191, 4, 233, 138, 160, 215, 113, 161, - 114, 155, 5, 235, 187, 239, 99, 1, 196, 95, 183, 28, 208, 243, 211, 41, - 23, 170, 21, 248, 131, 198, 126, 122, 64, 229, 109, 5, 127, 249, 124, 138, - 14, 25, 186, 97, 178, 68, 35, 252, 228, 19, 243, 127, 228, 161, 149, 67, - 116, 185, 135, 248, 214, 236, 3, 132, 89, 190, 36, 41, 124, 73, 226, 67, - 205, 199, 109, 113, 100, 37, 41, 43, 21, 112, 100, 253, 72, 2, 83, 137, - 101, 240, 154, 25, 198, 201, 244, 205, 55, 238, 30, 236, 57, 33, 181, 162, - 33, 0, 112, 119, 113, 252, 161, 207, 87, 95, 0, 180, 162, 234, 195, 115, - 167, 28, 237, 167, 169, 156, 64, 243, 116, 84, 77, 107, 35, 147, 103, 162, - 199, 128, 188, 95, 196, 255, 5, 210, 18, 34, 227, 41, 212, 12, 92, 60, - 150, 182, 36, 41, 167, 178, 90, 199, 143, 196, 152, 116, 131, 25, 2, 250, - 81, 196, 19, 98, 223, 1, 25, 43, 204, 233, 175, 190, 225, 91, 145, 185, - 110, 241, 139, 59, 225, 63, 59, 60, 115, 176, 255, 223, 58, 17, 11, 0, - 229, 25, 38, 137, 232, 108, 92, 203, 14, 83, 32, 110, 17, 11, 10, 108, - 126, 239, 63, 103, 214, 33, 145, 219, 239, 234, 124, 25, 222, 17, 75, 120, - 85, 25, 78, 18, 94, 72, 248, 255, 91, 231, 45, 139, 96, 225, 19, 44, - 204, 79, 96, 28, 164, 10, 255, 15, 61, 130, 89, 137, 23, 225, 185, 67, - 25, 31, 32, 254, 103, 157, 202, 124, 132, 2, 190, 115, 154, 191, 215, 127, - 126, 215, 214, 195, 75, 14, 145, 111, 81, 92, 60, 81, 22, 228, 26, 83, - 242, 233, 234, 124, 91, 166, 189, 196, 175, 94, 112, 37, 49, 190, 203, 192, - 34, 232, 80, 35, 85, 111, 197, 132, 61, 128, 182, 105, 111, 13, 12, 36, - 101, 233, 156, 69, 145, 25, 179, 10, 76, 242, 127, 250, 56, 125, 14, 212, - 85, 88, 20, 25, 41, 24, 246, 31, 172, 135, 125, 148, 96, 56, 112, 186, - 238, 42, 77, 56, 189, 208, 55, 72, 185, 10, 87, 124, 166, 22, 225, 10, - 238, 98, 250, 143, 114, 116, 51, 202, 174, 123, 232, 27, 229, 232, 99, 148, - 203, 102, 244, 47, 197, 140, 228, 190, 170, 133, 153, 48, 95, 44, 167, 189, - 166, 236, 252, 140, 1, 111, 46, 141, 19, 199, 134, 118, 133, 40, 218, 71, - 70, 185, 90, 89, 180, 63, 186, 234, 12, 78, 176, 96, 13, 172, 129, 209, - 46, 206, 59, 164, 119, 52, 37, 210, 229, 72, 128, 204, 72, 153, 88, 54, - 107, 153, 15, 65, 34, 75, 240, 229, 211, 162, 9, 9, 120, 129, 156, 32, - 118, 73, 23, 132, 49, 39, 244, 29, 238, 66, 65, 158, 0, 200, 140, 38, - 210, 252, 204, 193, 13, 163, 92, 44, 116, 254, 137, 244, 110, 25, 24, 139, - 238, 155, 199, 59, 135, 35, 172, 9, 225, 95, 37, 139, 209, 168, 39, 58, - 65, 55, 125, 116, 49, 48, 4, 140, 237, 168, 255, 114, 93, 155, 130, 211, - 71, 161, 143, 90, 189, 154, 173, 155, 22, 59, 31, 178, 90, 100, 184, 147, - 0, 154, 98, 116, 177, 199, 113, 248, 241, 40, 226, 170, 191, 17, 153, 139, - 156, 45, 115, 188, 78, 211, 170, 77, 70, 94, 146, 5, 186, 209, 161, 89, - 2, 70, 161, 66, 231, 28, 219, 43, 244, 124, 229, 136, 121, 180, 26, 203, - 214, 15, 207, 104, 12, 228, 252, 27, 192, 175, 235, 67, 31, 7, 18, 246, - 42, 67, 32, 215, 80, 134, 224, 23, 97, 64, 88, 175, 91, 107, 235, 181, - 55, 8, 229, 50, 170, 150, 153, 210, 108, 160, 175, 234, 49, 4, 77, 220, - 97, 242, 150, 78, 215, 95, 25, 194, 73, 175, 215, 241, 141, 158, 199, 127, - 64, 83, 23, 91, 148, 172, 85, 136, 244, 34, 106, 143, 230, 51, 245, 136, - 255, 226, 200, 208, 159, 229, 196, 90, 214, 194, 128, 173, 20, 113, 179, 73, - 184, 226, 8, 123, 78, 155, 243, 175, 156, 104, 99, 249, 41, 247, 4, 251, - 35, 218, 154, 19, 249, 225, 37, 50, 84, 150, 45, 0, 237, 38, 90, 25, - 103, 171, 99, 128, 35, 252, 229, 83, 111, 63, 11, 192, 100, 65, 164, 139, - 52, 47, 173, 196, 222, 153, 181, 118, 209, 225, 230, 92, 17, 254, 138, 193, - 223, 184, 226, 249, 105, 34, 57, 248, 27, 245, 49, 192, 225, 8, 148, 135, - 19, 48, 188, 88, 91, 24, 145, 32, 202, 40, 116, 134, 20, 140, 242, 245, - 19, 241, 253, 141, 176, 239, 196, 253, 79, 241, 81, 142, 104, 103, 197, 54, - 243, 203, 7, 245, 254, 29, 136, 208, 203, 155, 169, 208, 82, 17, 219, 32, - 194, 4, 21, 177, 81, 43, 196, 169, 92, 159, 222, 195, 188, 129, 169, 49, - 165, 46, 191, 102, 41, 140, 202, 62, 63, 136, 22, 248, 182, 225, 104, 226, - 115, 43, 77, 150, 191, 153, 100, 210, 155, 171, 29, 204, 184, 38, 238, 148, - 169, 20, 204, 194, 168, 214, 78, 228, 187, 119, 3, 141, 54, 8, 92, 165, - 204, 190, 208, 215, 186, 53, 29, 45, 46, 179, 251, 156, 150, 102, 90, 148, - 80, 169, 227, 253, 17, 70, 123, 244, 82, 190, 204, 136, 13, 156, 54, 88, - 141, 254, 78, 55, 3, 157, 114, 27, 105, 204, 194, 107, 107, 194, 21, 75, - 11, 12, 216, 215, 160, 232, 226, 155, 163, 63, 155, 114, 115, 64, 63, 126, - 65, 131, 214, 5, 238, 50, 230, 251, 3, 214, 206, 109, 237, 138, 29, 219, - 141, 247, 239, 217, 1, 109, 253, 132, 95, 37, 197, 29, 138, 240, 83, 216, - 213, 136, 14, 191, 248, 59, 35, 184, 55, 78, 220, 208, 230, 44, 184, 153, - 251, 82, 71, 241, 54, 15, 109, 45, 174, 36, 107, 217, 254, 227, 171, 108, - 110, 43, 146, 249, 78, 196, 118, 37, 13, 70, 88, 43, 70, 126, 226, 246, - 226, 102, 225, 161, 211, 50, 119, 71, 254, 51, 25, 161, 16, 188, 220, 143, - 78, 201, 255, 242, 6, 230, 214, 224, 195, 5, 227, 223, 6, 212, 115, 200, - 9, 237, 64, 25, 49, 82, 215, 209, 61, 117, 237, 110, 100, 74, 157, 155, - 133, 77, 87, 131, 40, 28, 79, 121, 218, 133, 31, 238, 29, 11, 115, 216, - 27, 255, 164, 240, 36, 108, 182, 153, 244, 225, 139, 240, 130, 58, 226, 31, - 29, 174, 176, 75, 53, 190, 211, 21, 14, 159, 103, 39, 53, 237, 137, 79, - 149, 76, 191, 210, 215, 12, 81, 150, 82, 217, 190, 37, 90, 35, 96, 136, - 234, 218, 203, 180, 218, 235, 189, 225, 49, 207, 243, 243, 0, 77, 255, 213, - 222, 160, 93, 211, 214, 24, 146, 194, 154, 43, 54, 42, 221, 218, 184, 85, - 55, 68, 126, 140, 96, 139, 149, 142, 105, 142, 59, 85, 124, 226, 165, 66, - 17, 65, 96, 138, 157, 202, 155, 166, 215, 109, 126, 115, 146, 138, 115, 14, - 30, 80, 179, 127, 58, 13, 51, 21, 255, 240, 140, 69, 34, 213, 68, 171, - 236, 148, 106, 0, 86, 64, 239, 178, 152, 54, 118, 235, 233, 249, 217, 11, - 159, 206, 166, 207, 207, 120, 238, 81, 109, 192, 179, 165, 97, 222, 217, 203, - 116, 33, 137, 129, 54, 216, 96, 201, 126, 227, 117, 24, 203, 75, 194, 213, - 156, 82, 45, 41, 98, 190, 22, 86, 80, 13, 199, 108, 202, 222, 97, 6, - 0, 174, 54, 161, 75, 44, 53, 145, 79, 179, 105, 54, 149, 95, 207, 58, - 93, 240, 167, 233, 87, 12, 224, 216, 80, 170, 49, 149, 250, 181, 197, 248, - 94, 189, 142, 227, 192, 118, 154, 217, 84, 206, 226, 232, 44, 38, 211, 134, - 120, 77, 108, 101, 186, 26, 204, 55, 192, 170, 41, 208, 231, 117, 173, 143, - 13, 146, 121, 92, 187, 215, 239, 143, 121, 219, 153, 113, 2, 26, 162, 105, - 173, 50, 155, 26, 77, 212, 122, 79, 161, 111, 78, 105, 73, 138, 170, 147, - 130, 57, 181, 78, 229, 150, 164, 169, 249, 210, 100, 151, 150, 82, 119, 235, - 201, 137, 252, 207, 77, 245, 252, 188, 93, 51, 160, 119, 110, 147, 2, 49, - 85, 47, 166, 26, 140, 105, 122, 49, 181, 96, 76, 205, 139, 169, 7, 99, - 186, 110, 12, 29, 78, 248, 35, 105, 33, 128, 232, 186, 142, 14, 88, 232, - 152, 208, 24, 79, 197, 25, 160, 132, 200, 211, 117, 181, 17, 95, 46, 32, - 221, 118, 101, 246, 36, 191, 112, 4, 240, 192, 249, 85, 94, 154, 184, 186, - 152, 184, 186, 50, 113, 109, 49, 113, 109, 101, 226, 250, 98, 226, 186, 47, - 177, 161, 121, 201, 159, 159, 17, 11, 109, 92, 234, 166, 135, 248, 230, 223, - 250, 89, 114, 154, 194, 24, 69, 95, 116, 9, 121, 234, 44, 33, 44, 5, - 29, 119, 244, 26, 53, 186, 117, 14, 212, 171, 115, 10, 232, 83, 94, 4, - 96, 182, 128, 224, 6, 84, 60, 1, 142, 40, 80, 9, 163, 188, 62, 62, - 227, 163, 181, 236, 243, 67, 62, 158, 236, 79, 158, 242, 249, 170, 88, 122, - 158, 131, 26, 53, 222, 201, 152, 3, 2, 198, 10, 205, 126, 245, 180, 232, - 163, 226, 97, 95, 91, 40, 238, 79, 157, 25, 57, 133, 251, 59, 30, 76, - 236, 72, 85, 40, 165, 95, 168, 65, 52, 110, 152, 45, 23, 84, 216, 148, - 211, 71, 124, 92, 62, 160, 136, 150, 212, 250, 209, 241, 205, 135, 103, 55, - 26, 93, 16, 65, 64, 52, 218, 3, 179, 133, 107, 49, 52, 64, 147, 138, - 225, 255, 254, 247, 191, 108, 0, 126, 249, 36, 231, 195, 174, 255, 95, 117, - 204, 243, 65, 71, 240, 202, 209, 138, 99, 160, 133, 161, 197, 193, 117, 145, - 5, 55, 141, 78, 191, 229, 12, 51, 95, 0, 220, 81, 159, 1, 29, 227, - 157, 233, 204, 158, 159, 135, 120, 16, 171, 173, 77, 147, 82, 106, 93, 3, - 130, 103, 254, 84, 135, 70, 199, 217, 33, 105, 93, 155, 110, 114, 93, 21, - 96, 113, 102, 51, 103, 190, 248, 198, 117, 229, 73, 14, 249, 145, 16, 198, - 98, 50, 39, 9, 158, 188, 209, 189, 148, 138, 183, 156, 146, 76, 39, 78, - 32, 83, 240, 31, 66, 200, 35, 121, 160, 85, 64, 147, 0, 229, 68, 173, - 123, 126, 110, 241, 46, 193, 214, 84, 235, 204, 34, 208, 194, 65, 187, 173, - 89, 17, 196, 52, 236, 135, 101, 121, 224, 152, 1, 105, 168, 45, 57, 253, - 249, 165, 99, 29, 151, 4, 251, 183, 206, 117, 76, 242, 178, 129, 7, 159, - 108, 146, 8, 164, 45, 231, 42, 10, 124, 50, 23, 254, 41, 241, 176, 135, - 17, 126, 141, 68, 52, 165, 202, 28, 105, 136, 225, 25, 189, 56, 120, 130, - 240, 93, 130, 168, 11, 136, 130, 251, 158, 75, 124, 185, 67, 242, 13, 139, - 225, 88, 23, 28, 73, 119, 156, 87, 12, 41, 27, 208, 197, 101, 102, 153, - 196, 149, 241, 254, 38, 135, 43, 85, 237, 72, 8, 150, 74, 173, 105, 89, - 201, 127, 190, 172, 196, 151, 45, 51, 11, 192, 128, 138, 99, 124, 158, 50, - 244, 152, 9, 62, 36, 14, 118, 40, 158, 250, 103, 228, 208, 84, 241, 42, - 1, 52, 111, 213, 156, 12, 218, 83, 100, 89, 193, 220, 250, 120, 144, 191, - 45, 143, 126, 126, 254, 223, 39, 145, 70, 214, 22, 69, 87, 44, 27, 217, - 248, 246, 31, 75, 148, 73, 207, 182, 140, 231, 14, 246, 71, 139, 149, 183, - 92, 85, 216, 85, 80, 167, 136, 148, 87, 134, 211, 52, 182, 61, 50, 30, - 119, 94, 6, 21, 56, 32, 101, 7, 48, 206, 132, 119, 78, 181, 255, 235, - 206, 147, 107, 191, 4, 26, 86, 96, 54, 83, 160, 138, 169, 43, 169, 158, - 249, 36, 206, 193, 221, 251, 127, 179, 240, 249, 51, 42, 37, 32, 153, 198, - 173, 170, 214, 30, 212, 53, 135, 131, 124, 122, 211, 128, 29, 67, 195, 13, - 22, 145, 36, 69, 203, 24, 104, 34, 183, 185, 157, 171, 117, 68, 46, 195, - 246, 24, 178, 151, 169, 95, 82, 61, 227, 148, 29, 223, 35, 144, 155, 235, - 2, 19, 78, 246, 62, 92, 112, 58, 42, 67, 62, 33, 194, 127, 191, 205, - 22, 102, 225, 39, 34, 97, 63, 51, 254, 247, 174, 51, 81, 73, 169, 207, - 238, 47, 249, 86, 192, 168, 219, 84, 228, 80, 166, 243, 210, 220, 217, 44, - 186, 90, 160, 251, 95, 221, 20, 2, 71, 111, 255, 253, 168, 56, 71, 224, - 10, 69, 166, 24, 104, 253, 87, 153, 72, 14, 225, 137, 51, 24, 187, 143, - 70, 247, 29, 230, 130, 48, 26, 26, 206, 124, 205, 71, 254, 187, 219, 37, - 51, 38, 14, 36, 240, 226, 10, 230, 193, 213, 219, 229, 63, 92, 176, 123, - 168, 181, 74, 72, 26, 36, 14, 190, 205, 235, 68, 112, 213, 121, 26, 117, - 224, 3, 205, 54, 234, 169, 207, 233, 54, 148, 121, 162, 242, 92, 248, 111, - 60, 252, 183, 185, 240, 175, 43, 194, 255, 240, 85, 70, 183, 175, 208, 114, - 241, 160, 51, 95, 93, 132, 39, 139, 204, 133, 63, 79, 121, 4, 188, 204, - 197, 204, 156, 152, 217, 92, 204, 239, 60, 226, 247, 185, 240, 159, 16, 254, - 223, 200, 207, 200, 127, 231, 194, 127, 160, 121, 244, 231, 31, 243, 85, 111, - 80, 240, 198, 66, 139, 22, 32, 151, 228, 245, 37, 231, 82, 162, 70, 206, - 148, 45, 73, 52, 96, 228, 79, 126, 153, 248, 10, 198, 210, 111, 71, 129, - 201, 206, 144, 73, 104, 92, 134, 185, 9, 160, 42, 125, 110, 57, 159, 196, - 75, 112, 49, 158, 247, 90, 11, 38, 234, 64, 204, 135, 182, 27, 184, 255, - 209, 85, 211, 143, 154, 53, 39, 121, 246, 204, 51, 44, 26, 103, 248, 76, - 172, 204, 202, 251, 255, 205, 50, 124, 102, 150, 225, 255, 54, 115, 12, 221, - 149, 55, 238, 131, 182, 24, 76, 143, 180, 252, 235, 182, 23, 24, 18, 249, - 59, 251, 153, 237, 133, 191, 105, 34, 97, 169, 193, 129, 95, 183, 55, 240, - 137, 125, 129, 249, 144, 79, 236, 7, 204, 5, 172, 88, 216, 195, 127, 231, - 206, 50, 3, 240, 242, 173, 125, 110, 161, 250, 224, 86, 243, 146, 165, 133, - 237, 67, 1, 76, 187, 139, 108, 20, 167, 163, 153, 112, 128, 207, 214, 76, - 216, 193, 103, 125, 38, 92, 225, 211, 156, 9, 135, 87, 101, 21, 195, 128, - 44, 66, 136, 171, 245, 128, 217, 154, 69, 235, 100, 145, 41, 207, 1, 107, - 8, 185, 213, 67, 3, 195, 201, 188, 68, 95, 228, 22, 87, 132, 15, 179, - 91, 233, 195, 44, 180, 84, 58, 154, 227, 198, 71, 233, 54, 112, 94, 46, - 40, 51, 97, 2, 73, 225, 77, 22, 216, 109, 184, 22, 15, 38, 139, 63, - 60, 6, 200, 220, 46, 51, 69, 27, 244, 76, 155, 96, 134, 105, 203, 22, - 153, 226, 82, 120, 177, 232, 149, 19, 242, 23, 167, 236, 76, 8, 63, 215, - 96, 101, 74, 143, 208, 151, 37, 154, 183, 102, 222, 56, 34, 198, 111, 34, - 254, 249, 252, 180, 17, 237, 179, 204, 12, 155, 89, 68, 159, 61, 6, 148, - 142, 62, 201, 200, 17, 2, 119, 39, 231, 15, 114, 253, 245, 77, 71, 63, - 138, 173, 223, 127, 111, 253, 64, 159, 209, 130, 161, 212, 199, 2, 188, 145, - 11, 58, 234, 226, 143, 226, 232, 247, 223, 71, 110, 172, 205, 99, 131, 153, - 55, 208, 167, 38, 203, 140, 222, 81, 230, 50, 187, 177, 54, 143, 229, 153, - 91, 63, 80, 93, 213, 96, 214, 216, 50, 121, 175, 76, 22, 156, 225, 140, - 36, 178, 89, 174, 115, 51, 137, 187, 54, 203, 160, 11, 22, 128, 177, 7, - 224, 179, 34, 128, 193, 1, 200, 25, 7, 8, 246, 24, 45, 196, 114, 103, - 16, 12, 232, 235, 89, 206, 173, 159, 17, 175, 194, 6, 2, 175, 70, 91, - 41, 102, 22, 234, 89, 192, 204, 223, 32, 147, 42, 202, 89, 6, 61, 136, - 11, 4, 194, 8, 56, 126, 166, 93, 204, 34, 111, 0, 49, 181, 254, 44, - 244, 170, 175, 176, 85, 198, 61, 167, 0, 212, 86, 44, 135, 165, 137, 76, - 1, 193, 103, 118, 100, 122, 192, 30, 59, 236, 1, 216, 61, 155, 203, 132, - 6, 108, 181, 38, 121, 16, 232, 166, 184, 141, 99, 244, 173, 145, 203, 8, - 53, 231, 155, 153, 167, 77, 133, 184, 231, 2, 199, 113, 65, 50, 235, 249, - 45, 64, 231, 116, 132, 50, 43, 58, 19, 242, 172, 217, 187, 23, 196, 199, - 62, 232, 38, 5, 207, 184, 178, 139, 195, 174, 211, 232, 41, 71, 16, 150, - 202, 32, 28, 113, 236, 249, 114, 23, 27, 104, 195, 60, 203, 114, 120, 227, - 31, 200, 196, 80, 59, 155, 91, 157, 137, 153, 142, 211, 124, 246, 36, 241, - 22, 99, 52, 133, 150, 28, 19, 113, 39, 26, 47, 54, 126, 19, 58, 154, - 105, 162, 242, 145, 63, 234, 155, 112, 78, 23, 1, 125, 102, 238, 156, 100, - 189, 46, 249, 252, 37, 155, 133, 2, 187, 46, 184, 196, 76, 164, 22, 141, - 251, 77, 216, 185, 92, 11, 153, 154, 196, 147, 246, 24, 244, 171, 210, 29, - 199, 5, 211, 34, 181, 1, 84, 213, 224, 22, 15, 209, 111, 18, 74, 46, - 32, 166, 246, 38, 16, 49, 133, 26, 150, 166, 5, 116, 151, 235, 69, 7, - 85, 46, 245, 154, 103, 76, 23, 59, 67, 172, 26, 212, 230, 242, 146, 188, - 205, 159, 118, 74, 228, 227, 133, 150, 29, 117, 166, 50, 232, 38, 97, 93, - 164, 50, 125, 253, 52, 245, 142, 142, 158, 126, 92, 208, 82, 7, 150, 230, - 194, 155, 169, 90, 165, 19, 7, 140, 242, 181, 209, 177, 118, 173, 20, 97, - 243, 143, 206, 28, 245, 23, 188, 215, 169, 160, 67, 116, 8, 12, 195, 118, - 216, 75, 145, 197, 191, 136, 204, 204, 252, 57, 234, 47, 190, 62, 155, 86, - 29, 189, 148, 185, 227, 248, 11, 157, 229, 67, 72, 144, 39, 115, 230, 44, - 101, 140, 21, 21, 255, 180, 155, 60, 125, 175, 187, 80, 132, 111, 148, 220, - 40, 194, 20, 167, 247, 78, 107, 169, 187, 68, 80, 69, 214, 194, 207, 100, - 90, 4, 186, 154, 76, 65, 103, 151, 245, 180, 1, 252, 26, 162, 141, 92, - 135, 86, 73, 63, 138, 102, 7, 54, 202, 86, 23, 58, 244, 163, 40, 139, - 182, 132, 166, 89, 199, 146, 104, 203, 244, 130, 206, 139, 82, 162, 221, 165, - 15, 15, 9, 15, 187, 166, 102, 88, 228, 153, 91, 239, 14, 122, 3, 83, - 144, 119, 220, 146, 185, 50, 139, 11, 172, 54, 63, 119, 122, 211, 198, 220, - 59, 120, 204, 126, 19, 199, 111, 222, 12, 209, 187, 48, 52, 93, 180, 197, - 41, 145, 57, 90, 251, 45, 254, 130, 137, 200, 141, 120, 191, 135, 23, 5, - 135, 204, 253, 93, 83, 51, 204, 15, 205, 59, 187, 189, 41, 202, 220, 30, - 164, 45, 21, 199, 82, 81, 10, 216, 80, 245, 1, 65, 102, 75, 31, 186, - 203, 16, 51, 176, 180, 73, 226, 58, 189, 231, 209, 123, 171, 107, 20, 149, - 185, 161, 66, 179, 171, 42, 236, 209, 1, 24, 250, 141, 157, 58, 22, 150, - 35, 242, 15, 148, 178, 113, 27, 145, 10, 243, 132, 165, 162, 227, 28, 199, - 213, 213, 33, 222, 33, 94, 1, 64, 199, 112, 178, 219, 23, 84, 35, 192, - 190, 248, 32, 200, 113, 219, 241, 102, 213, 126, 122, 9, 249, 250, 78, 14, - 43, 0, 150, 100, 224, 55, 34, 163, 177, 99, 55, 7, 46, 149, 226, 20, - 45, 64, 143, 210, 204, 105, 47, 58, 5, 11, 153, 192, 7, 8, 9, 113, - 44, 152, 64, 47, 146, 221, 89, 160, 143, 245, 70, 76, 63, 197, 177, 151, - 19, 152, 1, 253, 97, 73, 113, 71, 40, 134, 137, 72, 114, 38, 49, 83, - 33, 184, 90, 34, 141, 153, 104, 8, 81, 114, 196, 250, 26, 99, 68, 14, - 1, 56, 158, 196, 207, 164, 247, 29, 143, 146, 219, 98, 1, 154, 138, 166, - 68, 82, 146, 44, 164, 209, 203, 14, 57, 245, 35, 98, 149, 106, 224, 158, - 205, 146, 174, 45, 74, 104, 22, 110, 44, 33, 24, 87, 108, 33, 20, 26, - 217, 64, 79, 177, 252, 83, 102, 159, 182, 236, 197, 38, 144, 170, 25, 203, - 94, 60, 6, 132, 240, 32, 30, 58, 25, 139, 140, 229, 100, 100, 44, 49, - 35, 209, 216, 12, 49, 98, 67, 136, 141, 29, 29, 247, 121, 169, 10, 150, - 186, 22, 241, 64, 156, 136, 65, 26, 239, 19, 227, 176, 60, 204, 34, 123, - 89, 160, 162, 95, 202, 164, 59, 196, 24, 84, 139, 221, 133, 246, 190, 122, - 65, 68, 131, 64, 107, 208, 224, 53, 57, 68, 214, 209, 189, 236, 43, 217, - 143, 143, 108, 48, 178, 226, 53, 25, 209, 209, 113, 98, 40, 54, 133, 206, - 96, 243, 157, 194, 255, 152, 58, 47, 210, 31, 82, 156, 49, 121, 8, 5, - 168, 105, 138, 245, 197, 255, 64, 87, 67, 236, 77, 157, 125, 127, 14, 17, - 0, 40, 68, 118, 227, 100, 30, 135, 85, 162, 215, 100, 27, 48, 122, 170, - 174, 57, 249, 253, 49, 178, 19, 67, 185, 227, 128, 120, 99, 233, 59, 0, - 25, 254, 250, 248, 210, 151, 227, 128, 108, 237, 161, 230, 13, 246, 56, 37, - 212, 220, 75, 211, 21, 180, 159, 64, 92, 75, 167, 210, 71, 226, 130, 72, - 8, 207, 112, 174, 40, 135, 96, 84, 201, 101, 46, 249, 87, 99, 148, 7, - 143, 115, 60, 92, 135, 18, 230, 59, 196, 37, 214, 124, 4, 6, 243, 10, - 86, 19, 220, 48, 64, 191, 154, 144, 112, 34, 60, 99, 210, 222, 98, 137, - 140, 194, 219, 216, 93, 56, 156, 117, 175, 171, 141, 248, 214, 137, 70, 234, - 97, 253, 167, 235, 59, 208, 94, 179, 214, 179, 132, 232, 62, 229, 130, 5, - 135, 101, 135, 37, 154, 189, 0, 231, 168, 13, 97, 73, 71, 207, 98, 79, - 44, 232, 37, 80, 17, 79, 48, 191, 204, 254, 90, 117, 162, 80, 29, 11, - 59, 149, 161, 94, 23, 46, 181, 97, 111, 236, 95, 239, 130, 197, 7, 91, - 243, 205, 183, 38, 81, 117, 193, 170, 216, 173, 163, 79, 43, 115, 196, 129, - 142, 249, 208, 41, 41, 23, 149, 141, 218, 140, 215, 214, 70, 45, 110, 94, - 103, 170, 166, 119, 154, 19, 34, 100, 93, 161, 183, 251, 198, 168, 197, 249, - 243, 2, 212, 51, 94, 89, 18, 110, 120, 94, 73, 232, 86, 206, 113, 239, - 251, 20, 232, 235, 75, 104, 126, 104, 129, 135, 108, 13, 245, 133, 141, 237, - 79, 64, 252, 148, 10, 88, 2, 108, 94, 114, 224, 235, 111, 0, 155, 215, - 243, 139, 112, 102, 213, 253, 19, 112, 246, 151, 244, 57, 156, 89, 234, 37, - 112, 30, 233, 237, 170, 102, 252, 53, 56, 3, 205, 212, 212, 32, 214, 96, - 251, 226, 254, 225, 105, 201, 77, 114, 71, 229, 126, 50, 20, 188, 242, 192, - 215, 95, 27, 138, 63, 217, 148, 79, 71, 139, 181, 133, 129, 250, 239, 141, - 214, 98, 73, 159, 143, 22, 203, 227, 247, 93, 171, 251, 248, 28, 102, 230, - 36, 200, 232, 80, 24, 132, 60, 161, 241, 131, 111, 47, 110, 233, 110, 8, - 183, 255, 112, 115, 121, 130, 97, 46, 147, 242, 98, 151, 187, 213, 50, 25, - 208, 50, 55, 208, 175, 238, 148, 93, 115, 216, 144, 158, 126, 123, 17, 126, - 10, 79, 204, 146, 247, 232, 69, 128, 221, 67, 112, 252, 228, 6, 35, 91, - 60, 146, 244, 233, 230, 226, 234, 60, 142, 29, 73, 13, 58, 115, 209, 38, - 70, 151, 167, 140, 78, 148, 197, 50, 61, 21, 164, 109, 33, 13, 89, 21, - 31, 180, 43, 81, 97, 134, 125, 101, 105, 166, 226, 207, 239, 63, 211, 63, - 255, 152, 177, 164, 238, 39, 100, 65, 219, 225, 210, 28, 143, 199, 81, 168, - 226, 195, 104, 171, 242, 166, 113, 90, 184, 226, 242, 81, 232, 239, 136, 7, - 1, 48, 198, 136, 109, 149, 46, 187, 172, 66, 28, 19, 179, 72, 207, 24, - 178, 23, 209, 45, 30, 114, 233, 243, 51, 102, 206, 63, 110, 221, 179, 91, - 143, 164, 34, 163, 136, 83, 194, 21, 20, 219, 70, 209, 53, 30, 175, 1, - 170, 142, 209, 144, 89, 175, 163, 91, 228, 105, 197, 91, 248, 92, 32, 64, - 22, 42, 115, 140, 237, 113, 108, 159, 0, 65, 23, 229, 45, 192, 226, 129, - 131, 233, 244, 173, 49, 55, 227, 190, 132, 103, 69, 131, 87, 130, 115, 217, - 244, 35, 122, 221, 69, 10, 230, 147, 151, 159, 32, 210, 8, 23, 157, 177, - 116, 41, 121, 54, 50, 115, 164, 60, 195, 72, 87, 145, 125, 33, 38, 134, - 126, 18, 212, 239, 25, 49, 43, 230, 190, 175, 139, 121, 177, 240, 71, 1, - 126, 215, 191, 231, 32, 36, 243, 93, 69, 231, 94, 113, 127, 46, 87, 37, - 126, 49, 103, 92, 136, 41, 217, 236, 31, 178, 146, 255, 35, 151, 137, 251, - 60, 49, 168, 98, 20, 72, 101, 123, 3, 40, 106, 17, 29, 182, 173, 213, - 162, 126, 167, 46, 190, 185, 83, 174, 13, 170, 56, 93, 194, 238, 89, 40, - 58, 210, 233, 14, 1, 178, 101, 185, 94, 174, 181, 7, 150, 89, 182, 122, - 101, 181, 238, 25, 222, 79, 205, 163, 217, 246, 201, 205, 53, 243, 132, 203, - 113, 41, 69, 165, 186, 72, 22, 219, 172, 247, 224, 155, 146, 17, 147, 204, - 236, 230, 127, 228, 109, 98, 121, 19, 208, 67, 97, 160, 217, 46, 71, 35, - 207, 179, 50, 172, 50, 108, 14, 213, 24, 141, 200, 81, 31, 111, 162, 19, - 239, 29, 142, 200, 97, 145, 60, 0, 132, 26, 66, 24, 149, 37, 132, 40, - 93, 222, 252, 82, 148, 165, 255, 224, 215, 55, 61, 204, 188, 37, 72, 33, - 226, 8, 139, 211, 48, 145, 189, 66, 145, 123, 84, 200, 202, 74, 44, 254, - 61, 84, 7, 214, 134, 60, 144, 16, 55, 129, 94, 70, 234, 64, 190, 83, - 8, 243, 174, 128, 33, 122, 7, 2, 232, 76, 185, 40, 72, 223, 67, 236, - 30, 25, 123, 7, 166, 146, 189, 176, 75, 156, 49, 248, 254, 209, 18, 157, - 47, 253, 233, 43, 48, 42, 16, 246, 66, 77, 68, 95, 113, 240, 1, 213, - 118, 89, 190, 6, 76, 208, 24, 38, 65, 129, 131, 72, 41, 185, 195, 20, - 76, 240, 67, 18, 5, 158, 176, 5, 193, 109, 116, 230, 135, 159, 73, 100, - 101, 191, 135, 112, 222, 199, 136, 148, 151, 94, 68, 253, 9, 107, 17, 219, - 152, 14, 131, 218, 47, 172, 89, 88, 22, 29, 40, 97, 168, 24, 5, 216, - 150, 229, 157, 242, 213, 225, 227, 46, 52, 71, 86, 226, 98, 176, 24, 198, - 25, 40, 220, 233, 30, 126, 197, 209, 237, 12, 122, 216, 227, 253, 55, 173, - 222, 144, 69, 56, 128, 145, 191, 135, 184, 207, 154, 175, 192, 213, 138, 46, - 175, 133, 14, 106, 196, 114, 12, 247, 155, 248, 119, 97, 73, 67, 212, 127, - 184, 33, 234, 146, 134, 120, 63, 31, 54, 103, 231, 252, 116, 243, 240, 172, - 124, 122, 120, 134, 173, 145, 151, 183, 70, 158, 111, 141, 204, 17, 8, 241, - 44, 216, 32, 118, 249, 152, 134, 151, 42, 192, 209, 143, 127, 95, 82, 40, - 38, 76, 8, 243, 37, 67, 168, 83, 180, 252, 239, 21, 173, 204, 23, 253, - 41, 120, 54, 239, 255, 60, 120, 42, 246, 191, 6, 30, 40, 250, 223, 2, - 15, 20, 253, 1, 120, 96, 181, 11, 198, 17, 192, 32, 20, 69, 28, 104, - 133, 53, 6, 139, 15, 32, 33, 91, 41, 18, 9, 44, 9, 98, 87, 182, - 14, 115, 227, 237, 111, 152, 240, 36, 1, 137, 197, 255, 116, 147, 23, 154, - 132, 205, 165, 101, 136, 181, 23, 90, 134, 254, 147, 226, 228, 242, 136, 45, - 42, 137, 68, 151, 22, 18, 8, 120, 66, 132, 16, 177, 219, 47, 223, 195, - 204, 128, 98, 95, 131, 125, 220, 210, 132, 241, 164, 198, 204, 139, 63, 69, - 104, 37, 125, 249, 82, 124, 114, 156, 206, 193, 255, 47, 51, 92, 130, 153, - 99, 43, 182, 212, 146, 9, 75, 150, 54, 252, 226, 174, 176, 244, 13, 25, - 85, 111, 137, 101, 65, 42, 11, 210, 218, 176, 11, 21, 5, 138, 74, 10, - 152, 137, 26, 22, 59, 228, 95, 241, 53, 216, 49, 211, 148, 140, 91, 231, - 32, 223, 53, 174, 171, 240, 209, 6, 187, 206, 207, 175, 241, 59, 119, 253, - 35, 74, 120, 198, 165, 80, 35, 52, 35, 80, 19, 198, 40, 39, 64, 73, - 193, 68, 48, 4, 38, 25, 242, 253, 34, 61, 37, 16, 117, 139, 158, 145, - 195, 243, 124, 188, 222, 156, 167, 107, 203, 205, 118, 175, 138, 187, 91, 147, - 244, 168, 221, 32, 1, 165, 168, 129, 13, 155, 66, 191, 9, 64, 184, 91, - 154, 177, 154, 83, 116, 239, 240, 193, 62, 10, 99, 234, 153, 98, 179, 90, - 21, 11, 8, 47, 171, 214, 98, 162, 98, 151, 98, 163, 130, 121, 177, 206, - 54, 203, 42, 91, 108, 80, 57, 16, 237, 122, 83, 98, 91, 47, 74, 248, - 153, 183, 29, 95, 93, 254, 210, 97, 55, 94, 139, 250, 152, 17, 83, 80, - 69, 42, 22, 207, 175, 80, 211, 172, 76, 0, 138, 132, 195, 69, 244, 42, - 233, 28, 104, 133, 195, 95, 5, 116, 211, 1, 97, 76, 79, 152, 25, 126, - 196, 214, 52, 33, 120, 38, 120, 170, 63, 16, 194, 143, 183, 138, 69, 244, - 121, 179, 218, 23, 147, 15, 250, 223, 132, 179, 30, 107, 45, 243, 3, 229, - 64, 12, 5, 227, 193, 150, 59, 215, 241, 2, 227, 210, 111, 251, 14, 40, - 124, 227, 18, 20, 213, 187, 68, 17, 57, 17, 76, 97, 174, 126, 165, 173, - 89, 232, 192, 136, 40, 40, 58, 141, 240, 21, 57, 71, 215, 4, 114, 112, - 210, 102, 109, 25, 105, 179, 22, 230, 226, 118, 118, 8, 46, 20, 68, 85, - 113, 156, 247, 208, 93, 16, 52, 133, 59, 127, 120, 138, 241, 170, 226, 104, - 146, 20, 85, 174, 153, 73, 14, 250, 72, 63, 33, 30, 8, 145, 23, 66, - 20, 12, 153, 9, 188, 130, 8, 123, 126, 167, 172, 34, 37, 23, 41, 9, - 157, 182, 117, 128, 170, 226, 23, 66, 73, 106, 235, 247, 185, 34, 196, 120, - 222, 184, 224, 247, 37, 195, 231, 147, 16, 88, 85, 230, 38, 87, 207, 55, - 183, 184, 209, 203, 32, 211, 200, 79, 52, 22, 184, 70, 145, 187, 169, 66, - 227, 188, 196, 184, 44, 63, 55, 155, 243, 11, 89, 193, 91, 173, 196, 72, - 57, 115, 141, 221, 240, 229, 99, 29, 243, 159, 15, 184, 12, 73, 239, 35, - 87, 107, 193, 86, 68, 139, 49, 215, 107, 172, 155, 137, 117, 193, 161, 130, - 23, 144, 110, 190, 169, 72, 12, 115, 183, 149, 30, 105, 30, 36, 203, 29, - 138, 60, 80, 178, 139, 123, 188, 64, 76, 26, 249, 15, 22, 52, 79, 84, - 207, 157, 60, 39, 152, 6, 3, 59, 148, 13, 181, 29, 217, 113, 108, 180, - 214, 90, 171, 199, 255, 136, 201, 105, 53, 206, 5, 247, 20, 244, 165, 24, - 105, 255, 161, 250, 230, 169, 111, 134, 70, 36, 152, 153, 212, 200, 104, 120, - 138, 215, 47, 201, 142, 182, 206, 157, 166, 249, 248, 204, 112, 204, 57, 220, - 159, 214, 225, 207, 156, 197, 233, 14, 49, 44, 207, 109, 145, 253, 83, 209, - 197, 188, 131, 59, 53, 123, 60, 17, 210, 238, 241, 45, 59, 9, 111, 116, - 139, 145, 169, 203, 12, 161, 229, 75, 249, 57, 44, 70, 54, 96, 249, 167, - 221, 2, 226, 9, 1, 161, 220, 158, 80, 111, 119, 190, 69, 26, 93, 196, - 94, 54, 235, 224, 131, 241, 19, 238, 172, 155, 70, 69, 52, 222, 163, 132, - 36, 18, 179, 98, 234, 106, 197, 100, 226, 151, 105, 149, 29, 71, 51, 173, - 179, 98, 248, 249, 43, 119, 101, 86, 23, 170, 227, 111, 92, 246, 20, 155, - 147, 177, 196, 159, 187, 104, 29, 225, 250, 240, 250, 100, 151, 44, 130, 58, - 197, 133, 159, 233, 134, 7, 70, 126, 21, 16, 90, 184, 15, 177, 111, 63, - 149, 28, 142, 180, 125, 233, 118, 112, 201, 169, 247, 58, 21, 157, 7, 249, - 40, 88, 41, 37, 57, 127, 193, 56, 32, 223, 208, 222, 38, 255, 11, 86, - 74, 107, 24, 59, 20, 162, 11, 225, 228, 181, 118, 26, 141, 176, 62, 70, - 103, 241, 16, 221, 215, 128, 73, 58, 7, 175, 206, 82, 199, 137, 28, 27, - 155, 77, 195, 127, 248, 91, 118, 220, 208, 151, 63, 196, 122, 111, 130, 166, - 176, 0, 39, 147, 227, 9, 14, 133, 101, 190, 89, 120, 216, 16, 186, 61, - 47, 17, 13, 191, 110, 122, 43, 183, 136, 231, 199, 16, 80, 215, 234, 131, - 26, 78, 110, 220, 94, 113, 7, 117, 125, 182, 133, 2, 173, 245, 142, 129, - 103, 225, 249, 121, 68, 45, 99, 19, 105, 177, 105, 243, 211, 42, 180, 48, - 173, 12, 88, 14, 217, 188, 153, 57, 234, 48, 128, 215, 108, 178, 85, 124, - 40, 77, 42, 93, 232, 82, 13, 86, 100, 194, 56, 114, 175, 230, 222, 203, - 151, 9, 37, 9, 157, 97, 136, 0, 27, 73, 69, 29, 150, 242, 70, 204, - 46, 114, 215, 172, 27, 197, 114, 180, 194, 152, 226, 31, 240, 58, 137, 138, - 122, 18, 67, 18, 120, 177, 64, 212, 97, 241, 103, 168, 236, 211, 89, 135, - 169, 129, 167, 191, 36, 139, 220, 231, 29, 123, 238, 162, 33, 81, 52, 116, - 128, 201, 159, 187, 120, 104, 54, 163, 195, 97, 255, 49, 218, 44, 100, 2, - 169, 107, 21, 167, 229, 200, 70, 154, 2, 232, 162, 13, 124, 199, 232, 236, - 202, 9, 235, 232, 24, 70, 103, 122, 17, 202, 145, 136, 64, 50, 84, 108, - 132, 254, 227, 105, 215, 33, 63, 133, 11, 25, 69, 164, 22, 240, 120, 9, - 163, 0, 12, 77, 22, 160, 184, 1, 85, 22, 160, 186, 1, 21, 22, 144, - 113, 2, 176, 51, 172, 22, 180, 119, 1, 85, 227, 67, 235, 210, 195, 192, - 159, 38, 254, 84, 241, 167, 178, 60, 12, 166, 16, 204, 5, 236, 43, 223, - 220, 158, 232, 78, 141, 237, 91, 118, 248, 116, 88, 190, 242, 176, 125, 156, - 134, 173, 231, 201, 45, 40, 144, 182, 209, 229, 51, 167, 187, 176, 13, 118, - 129, 190, 236, 117, 87, 250, 206, 228, 137, 60, 71, 163, 78, 192, 47, 108, - 48, 222, 84, 11, 56, 52, 8, 110, 133, 140, 154, 194, 195, 117, 26, 242, - 84, 42, 69, 109, 110, 247, 122, 253, 101, 254, 72, 123, 221, 168, 187, 31, - 173, 110, 53, 247, 248, 25, 76, 230, 147, 112, 59, 175, 207, 132, 232, 34, - 170, 40, 49, 157, 93, 78, 8, 250, 103, 164, 207, 213, 183, 187, 197, 133, - 93, 145, 117, 216, 153, 148, 61, 159, 24, 219, 7, 240, 254, 2, 192, 209, - 189, 107, 111, 181, 179, 82, 158, 104, 30, 224, 88, 78, 223, 128, 13, 223, - 254, 5, 112, 179, 132, 16, 4, 164, 7, 219, 5, 217, 129, 129, 110, 0, - 69, 162, 3, 55, 229, 167, 253, 151, 1, 185, 255, 17, 37, 194, 74, 135, - 121, 239, 140, 195, 167, 158, 87, 189, 46, 120, 14, 41, 203, 97, 191, 103, - 73, 215, 211, 250, 106, 200, 179, 246, 163, 139, 9, 188, 189, 130, 142, 40, - 136, 18, 18, 189, 222, 86, 199, 206, 42, 25, 244, 222, 190, 186, 76, 221, - 50, 23, 74, 92, 90, 224, 130, 15, 247, 30, 173, 185, 168, 31, 218, 152, - 69, 100, 124, 86, 103, 41, 124, 216, 179, 133, 73, 55, 90, 192, 129, 17, - 194, 110, 181, 139, 95, 158, 40, 128, 0, 163, 207, 198, 29, 26, 139, 174, - 232, 209, 179, 40, 137, 233, 231, 198, 219, 233, 222, 178, 225, 30, 121, 115, - 106, 117, 163, 2, 99, 57, 226, 90, 233, 127, 115, 244, 254, 230, 80, 125, - 60, 48, 221, 197, 145, 176, 23, 70, 194, 198, 145, 176, 63, 25, 9, 123, - 126, 54, 82, 57, 182, 197, 104, 76, 89, 44, 187, 239, 138, 88, 70, 93, - 36, 47, 224, 76, 228, 101, 148, 129, 120, 71, 169, 87, 217, 105, 252, 18, - 159, 181, 43, 70, 150, 29, 162, 224, 194, 130, 100, 157, 111, 213, 172, 114, - 155, 71, 103, 228, 216, 29, 150, 84, 32, 22, 220, 154, 151, 78, 108, 251, - 163, 137, 189, 170, 161, 146, 59, 211, 87, 3, 42, 128, 29, 206, 77, 246, - 8, 114, 234, 120, 103, 181, 93, 49, 45, 180, 81, 15, 244, 3, 124, 205, - 149, 206, 174, 255, 153, 208, 138, 88, 36, 137, 90, 37, 254, 12, 83, 238, - 7, 30, 34, 126, 255, 29, 126, 55, 138, 18, 61, 81, 141, 100, 177, 44, - 136, 192, 221, 239, 172, 56, 141, 124, 77, 70, 124, 229, 204, 208, 236, 47, - 222, 132, 53, 185, 94, 208, 153, 115, 185, 241, 147, 21, 223, 98, 128, 247, - 22, 135, 21, 131, 65, 99, 225, 194, 94, 136, 70, 133, 24, 174, 117, 125, - 36, 17, 129, 130, 244, 98, 250, 70, 111, 168, 215, 145, 107, 11, 59, 206, - 113, 60, 83, 140, 129, 222, 56, 118, 21, 253, 253, 248, 124, 166, 252, 181, - 6, 51, 35, 182, 72, 117, 32, 43, 21, 153, 2, 97, 58, 251, 245, 133, - 244, 239, 215, 233, 200, 43, 248, 116, 94, 112, 163, 237, 81, 187, 61, 36, - 10, 27, 51, 114, 77, 156, 90, 16, 251, 248, 13, 240, 242, 139, 34, 127, - 26, 132, 255, 62, 192, 254, 109, 240, 124, 2, 153, 128, 156, 170, 95, 49, - 201, 108, 21, 249, 135, 170, 151, 129, 166, 181, 52, 92, 154, 138, 221, 94, - 55, 201, 2, 133, 24, 138, 139, 227, 184, 88, 21, 121, 200, 79, 65, 41, - 86, 234, 104, 35, 111, 168, 177, 19, 233, 197, 115, 102, 191, 196, 177, 95, - 161, 197, 137, 108, 128, 216, 164, 104, 89, 17, 106, 3, 19, 168, 66, 215, - 96, 27, 172, 99, 21, 129, 249, 151, 210, 186, 67, 221, 232, 117, 217, 181, - 190, 63, 167, 83, 92, 241, 197, 59, 186, 195, 68, 94, 34, 83, 22, 108, - 133, 87, 244, 214, 88, 224, 183, 220, 133, 152, 219, 43, 222, 83, 2, 72, - 92, 92, 36, 179, 12, 141, 31, 54, 51, 47, 91, 149, 64, 6, 148, 217, - 67, 141, 80, 46, 243, 219, 85, 213, 218, 61, 220, 147, 123, 212, 14, 7, - 12, 49, 183, 173, 113, 71, 165, 163, 54, 48, 88, 27, 23, 128, 179, 0, - 26, 220, 21, 71, 90, 187, 237, 245, 227, 122, 220, 71, 18, 27, 141, 215, - 251, 108, 168, 0, 197, 6, 99, 28, 197, 90, 107, 154, 209, 165, 189, 24, - 250, 107, 234, 77, 2, 81, 176, 38, 46, 158, 69, 189, 0, 63, 253, 238, - 152, 108, 88, 189, 121, 4, 240, 71, 9, 156, 126, 59, 237, 8, 87, 80, - 20, 70, 170, 231, 216, 162, 72, 56, 44, 11, 149, 122, 157, 113, 193, 79, - 164, 222, 166, 117, 128, 134, 161, 87, 52, 203, 168, 132, 113, 150, 224, 245, - 218, 255, 8, 137, 142, 78, 34, 160, 177, 144, 224, 197, 112, 239, 243, 14, - 30, 183, 123, 40, 189, 43, 227, 179, 140, 34, 60, 177, 140, 135, 197, 154, - 205, 63, 108, 60, 132, 128, 223, 138, 45, 150, 199, 244, 62, 166, 119, 205, - 214, 45, 52, 240, 2, 136, 244, 166, 141, 189, 77, 217, 175, 110, 32, 150, - 13, 205, 236, 181, 7, 56, 82, 120, 10, 243, 113, 37, 127, 170, 14, 255, - 188, 217, 97, 122, 188, 11, 168, 134, 234, 24, 172, 37, 132, 104, 93, 82, - 50, 54, 42, 53, 66, 211, 161, 174, 141, 52, 67, 136, 225, 152, 227, 192, - 162, 74, 118, 5, 144, 131, 43, 5, 195, 90, 211, 173, 3, 169, 137, 192, - 2, 156, 236, 245, 53, 191, 196, 16, 169, 121, 167, 43, 128, 32, 80, 116, - 85, 19, 248, 228, 215, 104, 190, 227, 121, 143, 73, 211, 29, 175, 121, 177, - 119, 181, 88, 5, 46, 211, 119, 226, 31, 245, 1, 97, 121, 49, 92, 35, - 24, 202, 17, 213, 98, 205, 232, 153, 38, 149, 148, 17, 179, 69, 188, 220, - 218, 166, 175, 156, 184, 94, 100, 183, 123, 205, 64, 233, 8, 213, 168, 24, - 69, 184, 194, 99, 204, 190, 16, 178, 81, 178, 70, 200, 102, 84, 207, 168, - 3, 157, 139, 250, 35, 124, 38, 121, 183, 11, 236, 113, 178, 98, 107, 171, - 112, 215, 244, 3, 129, 105, 120, 248, 186, 195, 2, 176, 5, 69, 172, 191, - 136, 181, 23, 177, 110, 32, 101, 98, 200, 214, 198, 185, 222, 199, 220, 24, - 123, 250, 31, 126, 14, 144, 46, 52, 207, 9, 158, 41, 108, 185, 84, 25, - 77, 206, 162, 4, 150, 22, 179, 238, 60, 94, 44, 42, 246, 51, 33, 41, - 234, 245, 195, 219, 50, 9, 179, 143, 175, 51, 42, 122, 183, 218, 27, 149, - 1, 171, 231, 142, 37, 42, 120, 75, 37, 9, 179, 221, 208, 1, 154, 151, - 251, 91, 76, 112, 223, 169, 244, 17, 180, 60, 31, 23, 230, 7, 148, 92, - 60, 59, 141, 94, 217, 66, 162, 61, 0, 144, 85, 96, 233, 121, 66, 195, - 7, 80, 202, 19, 155, 238, 10, 108, 91, 190, 116, 243, 71, 26, 243, 245, - 66, 155, 230, 235, 102, 103, 69, 184, 133, 230, 50, 10, 218, 128, 13, 159, - 234, 91, 114, 181, 123, 214, 127, 84, 178, 237, 199, 189, 194, 107, 101, 127, - 111, 124, 184, 111, 247, 235, 7, 151, 230, 227, 109, 161, 93, 237, 92, 246, - 31, 238, 50, 199, 167, 175, 55, 202, 225, 206, 110, 243, 244, 106, 115, 114, - 184, 125, 170, 156, 190, 54, 143, 181, 35, 251, 53, 51, 56, 105, 103, 47, - 27, 205, 172, 93, 187, 106, 103, 143, 238, 111, 247, 110, 175, 229, 194, 201, - 149, 84, 191, 191, 132, 191, 219, 205, 250, 113, 174, 245, 246, 208, 121, 28, - 60, 220, 181, 91, 240, 215, 127, 188, 107, 183, 31, 239, 228, 246, 131, 34, - 183, 171, 119, 135, 251, 91, 175, 155, 227, 138, 117, 88, 219, 57, 30, 155, - 198, 246, 200, 156, 60, 92, 236, 214, 235, 55, 15, 87, 183, 205, 135, 221, - 203, 215, 227, 205, 221, 131, 227, 157, 113, 109, 115, 235, 238, 234, 234, 188, - 59, 58, 214, 37, 245, 228, 100, 127, 210, 124, 155, 100, 223, 213, 7, 235, - 64, 109, 228, 27, 103, 247, 235, 19, 59, 81, 24, 84, 175, 45, 57, 141, - 255, 21, 18, 233, 70, 105, 93, 134, 223, 225, 122, 38, 223, 80, 15, 44, - 5, 94, 187, 235, 235, 137, 225, 189, 113, 54, 126, 205, 108, 55, 143, 26, - 205, 173, 205, 253, 97, 115, 251, 177, 139, 169, 135, 213, 222, 164, 167, 158, - 60, 74, 25, 77, 49, 234, 175, 163, 68, 175, 189, 173, 60, 158, 230, 246, - 223, 223, 143, 205, 254, 249, 118, 169, 62, 177, 174, 175, 175, 110, 178, 167, - 247, 143, 157, 251, 78, 102, 112, 122, 191, 183, 117, 120, 183, 219, 170, 220, - 183, 143, 206, 238, 111, 219, 55, 7, 154, 53, 220, 148, 78, 95, 31, 236, - 179, 235, 109, 197, 90, 63, 26, 215, 238, 111, 213, 122, 233, 68, 201, 55, - 14, 228, 60, 52, 104, 188, 57, 58, 221, 110, 246, 206, 55, 47, 118, 47, - 222, 74, 59, 205, 237, 205, 252, 97, 203, 222, 189, 188, 185, 220, 191, 52, - 239, 119, 237, 237, 155, 183, 190, 114, 251, 150, 205, 214, 239, 228, 157, 91, - 185, 176, 171, 212, 135, 247, 59, 217, 78, 83, 169, 158, 117, 210, 218, 214, - 230, 69, 245, 76, 89, 175, 109, 110, 94, 27, 114, 46, 91, 183, 212, 234, - 89, 229, 221, 110, 174, 215, 223, 229, 220, 164, 182, 217, 190, 91, 175, 91, - 157, 210, 189, 209, 149, 14, 118, 90, 153, 68, 125, 112, 242, 214, 185, 63, - 189, 63, 145, 243, 153, 122, 194, 232, 245, 238, 165, 117, 75, 145, 43, 166, - 58, 185, 84, 183, 222, 174, 7, 237, 225, 251, 113, 198, 154, 72, 253, 35, - 125, 52, 84, 10, 247, 151, 170, 105, 156, 218, 103, 175, 155, 19, 185, 119, - 179, 89, 218, 62, 220, 188, 236, 231, 238, 218, 239, 149, 78, 203, 120, 175, - 188, 247, 244, 139, 225, 209, 216, 236, 30, 229, 18, 205, 222, 241, 118, 239, - 253, 248, 234, 13, 254, 122, 135, 155, 249, 155, 183, 199, 195, 155, 61, 251, - 190, 147, 77, 220, 220, 238, 110, 29, 94, 237, 14, 174, 187, 89, 109, 239, - 237, 161, 117, 126, 119, 123, 182, 41, 157, 29, 212, 165, 194, 40, 113, 116, - 245, 246, 122, 50, 214, 19, 86, 117, 191, 213, 207, 37, 114, 141, 179, 131, - 251, 253, 245, 157, 246, 36, 155, 47, 52, 204, 131, 157, 203, 140, 126, 123, - 210, 214, 179, 213, 97, 103, 210, 55, 59, 247, 39, 237, 92, 225, 193, 188, - 59, 108, 239, 30, 143, 183, 155, 103, 55, 23, 181, 225, 77, 229, 173, 100, - 170, 85, 43, 55, 110, 104, 141, 65, 227, 66, 43, 117, 175, 109, 181, 208, - 168, 238, 216, 153, 244, 80, 93, 239, 43, 217, 161, 190, 117, 240, 8, 3, - 189, 215, 148, 30, 211, 198, 238, 186, 85, 201, 233, 38, 140, 226, 241, 235, - 197, 225, 206, 197, 197, 110, 243, 184, 211, 236, 157, 238, 192, 104, 236, 108, - 14, 39, 249, 244, 193, 56, 95, 218, 129, 145, 186, 181, 235, 221, 45, 213, - 50, 142, 37, 243, 245, 80, 58, 173, 87, 111, 100, 121, 239, 234, 118, 79, - 187, 104, 149, 218, 123, 119, 55, 23, 251, 237, 155, 150, 92, 47, 1, 134, - 195, 64, 239, 156, 111, 110, 31, 52, 43, 185, 129, 101, 60, 220, 41, 165, - 2, 64, 168, 191, 105, 28, 87, 58, 70, 115, 127, 123, 127, 96, 188, 95, - 108, 238, 181, 143, 46, 110, 178, 251, 87, 109, 123, 247, 98, 55, 113, 208, - 220, 107, 110, 110, 54, 143, 243, 165, 189, 241, 105, 115, 119, 211, 180, 123, - 109, 29, 231, 212, 117, 19, 231, 149, 13, 243, 106, 124, 214, 236, 103, 186, - 7, 37, 245, 245, 238, 248, 240, 228, 205, 56, 157, 236, 14, 143, 79, 228, - 198, 225, 241, 149, 114, 244, 120, 177, 185, 121, 126, 38, 237, 239, 52, 139, - 197, 48, 211, 248, 228, 243, 251, 89, 128, 5, 193, 175, 158, 107, 244, 234, - 245, 241, 194, 42, 181, 66, 47, 247, 178, 87, 215, 219, 250, 192, 116, 85, - 94, 47, 49, 119, 128, 32, 97, 229, 209, 239, 194, 186, 179, 84, 193, 118, - 85, 153, 171, 85, 103, 169, 240, 191, 165, 50, 187, 80, 194, 7, 170, 178, - 148, 214, 175, 34, 139, 22, 9, 53, 178, 151, 103, 163, 146, 41, 16, 34, - 236, 97, 203, 236, 11, 31, 115, 123, 206, 53, 146, 124, 44, 31, 222, 244, - 21, 5, 118, 212, 72, 18, 219, 166, 81, 169, 86, 181, 250, 188, 58, 167, - 111, 215, 21, 105, 23, 228, 250, 159, 186, 183, 165, 84, 216, 254, 172, 49, - 99, 29, 68, 160, 16, 128, 241, 190, 149, 51, 36, 108, 95, 67, 137, 50, - 48, 49, 3, 67, 227, 196, 212, 61, 180, 145, 168, 173, 7, 231, 229, 209, - 121, 89, 69, 80, 137, 204, 92, 141, 214, 47, 187, 148, 245, 74, 106, 235, - 208, 35, 162, 218, 14, 205, 133, 74, 176, 172, 13, 142, 162, 68, 144, 18, - 251, 203, 84, 150, 191, 103, 1, 10, 137, 8, 35, 198, 89, 105, 77, 162, - 234, 145, 214, 50, 160, 214, 10, 233, 196, 34, 181, 5, 52, 190, 222, 135, - 138, 125, 52, 145, 107, 67, 77, 136, 222, 3, 49, 244, 0, 127, 143, 81, - 32, 234, 161, 75, 29, 212, 68, 100, 109, 100, 210, 50, 143, 33, 66, 90, - 81, 36, 54, 73, 221, 17, 134, 64, 208, 118, 52, 216, 228, 107, 188, 119, - 62, 62, 2, 114, 27, 24, 165, 13, 81, 74, 207, 33, 162, 155, 92, 96, - 129, 30, 138, 241, 212, 24, 11, 33, 125, 71, 226, 196, 2, 125, 44, 2, - 1, 20, 39, 150, 14, 19, 230, 234, 60, 161, 71, 145, 204, 103, 248, 66, - 25, 144, 49, 130, 53, 128, 139, 47, 221, 154, 125, 120, 246, 1, 17, 119, - 95, 124, 40, 62, 250, 207, 197, 145, 114, 91, 32, 203, 24, 181, 182, 136, - 38, 30, 193, 6, 40, 12, 96, 67, 125, 29, 52, 36, 89, 1, 134, 134, - 208, 17, 178, 160, 79, 67, 32, 78, 77, 173, 238, 71, 57, 96, 159, 160, - 19, 36, 145, 91, 137, 108, 87, 110, 153, 46, 74, 57, 55, 14, 93, 22, - 21, 8, 52, 96, 34, 153, 42, 52, 5, 58, 83, 144, 205, 65, 226, 49, - 189, 22, 16, 75, 224, 195, 48, 167, 161, 62, 236, 66, 242, 20, 90, 195, - 206, 82, 127, 10, 252, 49, 32, 107, 26, 232, 214, 148, 63, 7, 12, 3, - 217, 47, 126, 228, 50, 236, 147, 158, 141, 118, 175, 130, 17, 245, 222, 0, - 189, 189, 249, 112, 144, 171, 96, 251, 171, 70, 134, 188, 221, 94, 152, 54, - 45, 224, 216, 160, 241, 76, 131, 11, 186, 204, 134, 76, 32, 95, 42, 184, - 230, 67, 74, 234, 60, 240, 231, 150, 94, 27, 224, 13, 84, 23, 238, 216, - 111, 178, 232, 143, 73, 0, 183, 245, 14, 66, 17, 177, 163, 3, 204, 162, - 49, 70, 91, 81, 22, 209, 208, 243, 248, 107, 2, 118, 120, 250, 234, 45, - 82, 201, 32, 56, 178, 27, 154, 78, 43, 160, 252, 39, 186, 45, 254, 66, - 168, 129, 208, 131, 210, 9, 132, 102, 101, 232, 224, 186, 81, 241, 54, 27, - 183, 158, 65, 23, 153, 104, 92, 8, 1, 180, 38, 218, 122, 198, 250, 204, - 30, 44, 7, 0, 5, 174, 81, 82, 17, 152, 78, 2, 45, 226, 79, 147, - 23, 156, 21, 169, 102, 103, 66, 98, 159, 224, 81, 115, 212, 135, 74, 81, - 58, 103, 214, 232, 118, 114, 20, 153, 16, 7, 45, 25, 59, 48, 48, 53, - 198, 200, 179, 162, 136, 77, 160, 139, 204, 88, 2, 59, 112, 135, 142, 113, - 16, 197, 122, 120, 27, 100, 164, 243, 197, 203, 109, 201, 199, 26, 215, 166, - 15, 171, 138, 136, 75, 56, 159, 130, 179, 192, 81, 122, 247, 79, 1, 57, - 186, 156, 41, 72, 120, 243, 138, 97, 100, 98, 208, 117, 131, 144, 39, 112, - 166, 95, 171, 210, 215, 202, 140, 43, 36, 193, 20, 68, 195, 162, 191, 200, - 164, 236, 8, 60, 81, 85, 71, 203, 187, 44, 227, 252, 22, 133, 185, 63, - 16, 90, 160, 242, 94, 86, 14, 138, 43, 2, 13, 16, 67, 115, 237, 241, - 221, 164, 69, 235, 13, 208, 178, 240, 28, 5, 81, 17, 34, 178, 29, 145, - 151, 181, 142, 19, 12, 186, 107, 215, 34, 34, 187, 55, 85, 117, 99, 38, - 72, 142, 55, 105, 221, 248, 161, 204, 4, 120, 136, 248, 199, 46, 20, 146, - 64, 147, 238, 196, 66, 88, 90, 137, 39, 240, 249, 27, 222, 142, 93, 22, - 40, 20, 83, 92, 63, 138, 126, 66, 176, 83, 89, 200, 133, 65, 168, 240, - 3, 226, 166, 49, 61, 33, 165, 50, 241, 180, 249, 110, 88, 49, 200, 16, - 226, 18, 150, 148, 115, 6, 173, 27, 27, 242, 239, 191, 187, 229, 225, 45, - 70, 188, 207, 40, 186, 183, 28, 73, 79, 147, 46, 212, 58, 151, 21, 109, - 193, 45, 100, 188, 170, 16, 202, 62, 109, 81, 73, 222, 205, 219, 64, 49, - 99, 135, 176, 9, 63, 121, 163, 76, 0, 124, 9, 251, 200, 66, 62, 50, - 131, 190, 94, 255, 12, 81, 40, 205, 191, 131, 39, 84, 180, 139, 38, 188, - 49, 127, 2, 75, 22, 154, 198, 13, 54, 126, 136, 36, 128, 9, 115, 124, - 239, 164, 178, 95, 24, 215, 183, 183, 204, 10, 176, 170, 213, 253, 219, 198, - 227, 93, 246, 173, 114, 183, 55, 216, 126, 5, 154, 252, 245, 116, 68, 52, - 57, 208, 231, 135, 147, 67, 229, 108, 231, 2, 249, 93, 185, 115, 222, 86, - 219, 187, 55, 119, 118, 39, 209, 205, 85, 174, 214, 15, 111, 174, 46, 46, - 129, 165, 216, 219, 84, 215, 247, 172, 183, 189, 219, 189, 205, 221, 45, 251, - 224, 113, 183, 119, 188, 185, 61, 186, 188, 216, 189, 57, 184, 145, 26, 251, - 167, 217, 252, 248, 209, 174, 20, 38, 89, 189, 176, 185, 183, 181, 217, 218, - 124, 60, 30, 53, 243, 239, 155, 219, 167, 167, 185, 237, 157, 230, 227, 225, - 225, 69, 225, 216, 150, 182, 59, 155, 7, 239, 147, 247, 244, 64, 25, 95, - 230, 165, 205, 130, 220, 29, 104, 217, 58, 44, 170, 119, 157, 172, 85, 85, - 58, 189, 179, 173, 171, 171, 183, 77, 189, 111, 1, 251, 85, 184, 124, 191, - 238, 85, 114, 125, 245, 236, 182, 115, 106, 141, 219, 186, 210, 159, 104, 181, - 190, 124, 120, 112, 119, 243, 166, 229, 46, 85, 105, 244, 58, 222, 42, 180, - 26, 45, 169, 87, 88, 223, 60, 61, 28, 201, 242, 78, 254, 237, 66, 234, - 236, 220, 95, 2, 227, 114, 219, 63, 105, 223, 153, 189, 77, 89, 58, 201, - 13, 46, 38, 253, 139, 130, 84, 184, 191, 29, 231, 6, 192, 177, 15, 218, - 215, 253, 92, 251, 232, 109, 92, 233, 140, 228, 253, 214, 245, 126, 77, 85, - 171, 138, 190, 127, 112, 240, 112, 153, 184, 188, 206, 95, 222, 14, 15, 111, - 46, 181, 235, 214, 113, 245, 80, 77, 28, 164, 165, 81, 163, 189, 191, 3, - 35, 247, 118, 157, 232, 85, 212, 221, 202, 165, 37, 157, 174, 119, 218, 187, - 149, 238, 222, 99, 230, 94, 185, 120, 175, 95, 159, 232, 39, 247, 249, 70, - 251, 56, 145, 213, 19, 198, 93, 87, 205, 105, 85, 233, 244, 225, 253, 124, - 188, 107, 92, 175, 107, 91, 253, 188, 113, 175, 52, 39, 249, 221, 215, 194, - 129, 170, 239, 143, 70, 234, 67, 118, 248, 120, 217, 76, 95, 76, 172, 97, - 229, 253, 116, 208, 179, 101, 213, 218, 28, 246, 55, 235, 167, 247, 234, 209, - 185, 116, 148, 216, 190, 87, 55, 7, 251, 237, 130, 148, 25, 141, 173, 193, - 240, 124, 239, 182, 48, 62, 121, 216, 203, 142, 154, 251, 249, 189, 113, 193, - 62, 206, 189, 202, 87, 25, 253, 110, 107, 88, 219, 58, 81, 212, 246, 73, - 255, 254, 237, 64, 125, 211, 123, 234, 86, 93, 190, 126, 183, 100, 201, 60, - 172, 215, 106, 147, 243, 183, 155, 19, 235, 100, 100, 74, 187, 131, 204, 254, - 100, 180, 59, 238, 215, 171, 165, 163, 134, 109, 231, 175, 212, 202, 182, 92, - 144, 116, 165, 114, 87, 106, 106, 9, 125, 32, 233, 245, 187, 140, 49, 56, - 218, 105, 212, 78, 135, 155, 151, 3, 237, 45, 177, 249, 106, 86, 214, 173, - 107, 37, 115, 94, 104, 111, 169, 234, 100, 176, 171, 86, 51, 70, 253, 65, - 238, 88, 198, 72, 157, 236, 151, 246, 172, 235, 199, 106, 39, 113, 92, 72, - 95, 12, 19, 157, 83, 249, 82, 203, 233, 165, 189, 227, 182, 2, 239, 23, - 253, 194, 165, 252, 96, 215, 229, 179, 163, 251, 252, 222, 253, 3, 140, 236, - 206, 177, 178, 219, 144, 58, 217, 113, 67, 183, 154, 86, 109, 188, 254, 110, - 158, 157, 142, 245, 117, 253, 228, 161, 112, 184, 111, 158, 222, 201, 219, 67, - 59, 91, 25, 183, 59, 133, 204, 253, 126, 227, 225, 170, 217, 151, 76, 109, - 47, 55, 42, 84, 78, 199, 119, 39, 199, 86, 238, 160, 180, 158, 59, 168, - 94, 181, 246, 30, 182, 237, 202, 206, 246, 253, 246, 245, 195, 245, 240, 241, - 253, 205, 124, 120, 207, 52, 250, 146, 124, 60, 218, 84, 229, 250, 241, 235, - 253, 110, 174, 209, 200, 149, 172, 214, 99, 97, 208, 27, 219, 198, 213, 201, - 250, 230, 185, 161, 30, 159, 141, 47, 118, 10, 205, 201, 86, 226, 186, 169, - 108, 239, 105, 242, 248, 124, 255, 160, 114, 221, 200, 148, 218, 134, 49, 204, - 111, 157, 61, 92, 190, 175, 107, 143, 186, 124, 126, 243, 126, 117, 150, 88, - 159, 28, 1, 176, 182, 119, 246, 251, 71, 131, 156, 85, 63, 187, 159, 116, - 118, 74, 239, 151, 173, 92, 229, 160, 116, 213, 234, 230, 79, 119, 14, 238, - 47, 178, 137, 107, 61, 95, 221, 145, 218, 234, 193, 88, 191, 175, 100, 6, - 106, 189, 254, 104, 215, 250, 215, 138, 86, 47, 148, 236, 27, 235, 96, 243, - 62, 123, 121, 220, 216, 204, 60, 166, 179, 242, 205, 209, 253, 91, 103, 120, - 212, 79, 28, 60, 92, 164, 55, 43, 137, 173, 3, 229, 40, 127, 170, 222, - 109, 223, 31, 151, 26, 91, 137, 253, 210, 205, 164, 218, 172, 212, 30, 174, - 237, 206, 217, 221, 153, 185, 255, 112, 240, 126, 85, 239, 220, 85, 213, 225, - 86, 87, 126, 61, 172, 13, 123, 253, 204, 97, 237, 113, 114, 220, 56, 174, - 30, 95, 213, 251, 242, 117, 61, 161, 84, 11, 149, 87, 115, 220, 78, 111, - 183, 205, 109, 69, 57, 200, 167, 207, 140, 227, 158, 54, 234, 39, 250, 39, - 23, 86, 222, 86, 222, 38, 87, 59, 218, 117, 174, 61, 145, 207, 148, 94, - 227, 238, 117, 167, 109, 14, 180, 124, 235, 40, 209, 79, 95, 108, 105, 143, - 247, 48, 161, 38, 122, 101, 119, 172, 116, 235, 247, 246, 250, 86, 103, 83, - 53, 173, 66, 91, 147, 143, 238, 74, 19, 211, 234, 156, 247, 182, 74, 15, - 247, 202, 29, 244, 255, 160, 218, 40, 157, 27, 163, 235, 220, 201, 224, 120, - 114, 113, 85, 153, 92, 39, 234, 213, 253, 202, 224, 189, 114, 93, 179, 239, - 114, 87, 195, 155, 131, 116, 235, 246, 225, 209, 218, 41, 157, 213, 222, 170, - 55, 218, 232, 246, 241, 213, 122, 208, 122, 103, 213, 93, 173, 255, 110, 79, - 170, 149, 252, 101, 186, 57, 236, 109, 223, 101, 46, 178, 250, 221, 137, 113, - 81, 82, 53, 171, 183, 249, 160, 159, 182, 218, 199, 249, 97, 78, 122, 232, - 42, 247, 119, 137, 245, 199, 253, 155, 198, 163, 150, 120, 188, 42, 13, 199, - 250, 209, 254, 225, 253, 241, 206, 249, 121, 253, 253, 182, 118, 63, 56, 170, - 27, 82, 235, 104, 125, 27, 234, 25, 158, 237, 27, 234, 206, 193, 30, 44, - 23, 25, 251, 242, 114, 215, 56, 91, 151, 206, 19, 37, 169, 158, 104, 245, - 243, 114, 250, 226, 160, 209, 237, 41, 231, 187, 187, 245, 254, 78, 181, 183, - 155, 190, 77, 24, 15, 217, 118, 127, 34, 89, 167, 195, 124, 250, 97, 178, - 123, 116, 96, 28, 78, 238, 219, 234, 93, 39, 119, 123, 170, 92, 191, 13, - 143, 118, 210, 151, 71, 18, 196, 119, 165, 74, 195, 220, 217, 171, 54, 187, - 249, 193, 160, 247, 86, 179, 210, 123, 233, 215, 244, 232, 177, 177, 99, 222, - 118, 31, 30, 181, 238, 217, 197, 229, 249, 195, 131, 213, 158, 232, 217, 222, - 107, 231, 174, 81, 184, 212, 51, 91, 106, 229, 77, 57, 179, 10, 233, 146, - 188, 53, 220, 171, 95, 103, 236, 154, 124, 55, 50, 50, 202, 217, 228, 192, - 216, 155, 180, 236, 102, 255, 58, 221, 207, 222, 101, 179, 137, 201, 206, 235, - 155, 178, 245, 154, 215, 215, 47, 55, 75, 227, 3, 173, 113, 159, 219, 173, - 95, 190, 246, 222, 223, 175, 211, 13, 235, 104, 59, 125, 81, 154, 156, 159, - 150, 242, 13, 101, 114, 209, 108, 228, 19, 202, 240, 237, 46, 209, 238, 95, - 173, 143, 239, 27, 57, 233, 106, 220, 56, 222, 76, 95, 222, 36, 212, 179, - 161, 50, 57, 188, 78, 220, 90, 189, 204, 68, 73, 100, 223, 186, 87, 55, - 57, 105, 248, 174, 156, 23, 58, 251, 187, 45, 185, 149, 48, 204, 253, 82, - 109, 178, 159, 111, 15, 141, 209, 88, 59, 85, 228, 237, 170, 174, 36, 172, - 174, 154, 215, 15, 122, 149, 7, 245, 237, 174, 154, 29, 188, 55, 114, 141, - 179, 166, 52, 177, 14, 171, 137, 126, 35, 183, 127, 254, 218, 104, 171, 233, - 203, 150, 185, 61, 172, 171, 157, 116, 247, 76, 175, 86, 119, 110, 135, 121, - 181, 147, 237, 150, 244, 99, 243, 85, 213, 244, 106, 162, 160, 189, 94, 231, - 182, 149, 183, 131, 146, 100, 228, 198, 141, 76, 215, 106, 92, 23, 110, 135, - 39, 138, 50, 153, 212, 78, 119, 50, 71, 195, 225, 96, 179, 81, 122, 188, - 220, 82, 39, 245, 237, 70, 247, 49, 107, 244, 31, 94, 55, 75, 141, 203, - 150, 246, 120, 48, 62, 88, 191, 216, 223, 179, 141, 70, 181, 116, 166, 190, - 170, 29, 237, 53, 127, 167, 238, 159, 201, 173, 250, 157, 162, 212, 141, 170, - 150, 168, 26, 7, 217, 66, 218, 62, 83, 31, 175, 223, 110, 26, 253, 7, - 121, 127, 187, 209, 191, 180, 204, 225, 229, 237, 195, 253, 168, 103, 118, 135, - 39, 45, 165, 250, 126, 103, 93, 94, 143, 110, 213, 139, 219, 74, 254, 117, - 114, 188, 95, 63, 218, 212, 206, 235, 143, 195, 106, 95, 222, 123, 59, 54, - 94, 75, 105, 163, 90, 209, 228, 193, 254, 245, 69, 193, 28, 116, 118, 212, - 99, 213, 40, 157, 200, 131, 86, 229, 166, 151, 77, 92, 142, 198, 157, 209, - 123, 41, 211, 144, 18, 230, 229, 117, 171, 81, 42, 165, 183, 178, 150, 90, - 237, 39, 172, 132, 220, 61, 217, 236, 79, 142, 246, 173, 236, 97, 226, 38, - 177, 35, 95, 93, 103, 142, 26, 102, 61, 115, 189, 93, 221, 150, 27, 246, - 107, 222, 152, 36, 42, 165, 102, 109, 176, 153, 169, 245, 210, 3, 179, 251, - 186, 223, 233, 77, 14, 43, 19, 88, 67, 175, 213, 194, 107, 107, 48, 220, - 122, 204, 239, 158, 237, 247, 235, 221, 209, 161, 218, 187, 105, 52, 111, 155, - 111, 133, 203, 97, 171, 89, 123, 63, 25, 60, 14, 215, 91, 111, 146, 246, - 96, 229, 182, 39, 245, 11, 197, 206, 164, 15, 119, 39, 138, 53, 84, 107, - 106, 70, 222, 170, 165, 143, 26, 163, 241, 112, 188, 211, 85, 50, 23, 123, - 149, 201, 176, 115, 181, 211, 126, 184, 172, 217, 221, 171, 235, 156, 5, 224, - 147, 178, 247, 99, 163, 119, 171, 152, 163, 131, 193, 123, 235, 250, 230, 180, - 109, 148, 206, 251, 157, 86, 38, 119, 145, 85, 31, 149, 215, 190, 212, 185, - 238, 143, 173, 131, 82, 239, 188, 107, 73, 198, 107, 230, 114, 96, 170, 133, - 74, 239, 225, 124, 71, 82, 239, 142, 222, 247, 171, 137, 230, 117, 183, 254, - 246, 222, 187, 123, 53, 39, 71, 122, 167, 149, 47, 92, 76, 238, 110, 206, - 91, 167, 195, 199, 215, 215, 132, 214, 75, 43, 183, 183, 89, 253, 118, 199, - 30, 244, 134, 198, 201, 173, 100, 15, 78, 239, 114, 227, 219, 243, 134, 146, - 174, 116, 135, 55, 146, 114, 88, 189, 185, 27, 12, 222, 90, 183, 185, 235, - 253, 115, 229, 44, 167, 223, 30, 201, 15, 195, 171, 203, 211, 194, 73, 103, - 235, 250, 234, 230, 189, 173, 150, 242, 166, 101, 101, 18, 235, 55, 19, 67, - 125, 205, 228, 31, 243, 118, 107, 210, 54, 223, 178, 163, 137, 90, 130, 165, - 104, 82, 123, 220, 83, 212, 221, 157, 251, 243, 110, 225, 220, 186, 218, 81, - 204, 252, 91, 201, 204, 231, 11, 163, 179, 247, 82, 45, 95, 120, 191, 238, - 216, 165, 81, 246, 113, 219, 56, 213, 178, 141, 201, 221, 222, 117, 174, 148, - 62, 172, 61, 40, 39, 45, 45, 91, 41, 228, 114, 215, 118, 186, 91, 234, - 222, 151, 10, 5, 45, 211, 205, 36, 26, 247, 176, 61, 148, 198, 15, 221, - 193, 65, 109, 175, 244, 186, 155, 205, 221, 31, 86, 211, 176, 251, 53, 10, - 234, 164, 148, 80, 59, 119, 71, 131, 252, 196, 238, 170, 251, 157, 155, 157, - 244, 122, 105, 80, 215, 74, 90, 54, 107, 175, 111, 218, 235, 153, 246, 201, - 155, 122, 126, 173, 21, 74, 87, 70, 87, 173, 143, 222, 96, 191, 190, 211, - 46, 212, 252, 155, 57, 216, 105, 229, 213, 131, 188, 109, 29, 37, 236, 27, - 117, 152, 217, 107, 212, 47, 6, 167, 123, 137, 189, 235, 245, 86, 117, 123, - 164, 84, 134, 131, 195, 194, 125, 77, 79, 152, 87, 105, 35, 189, 247, 94, - 24, 87, 243, 231, 59, 86, 183, 157, 40, 213, 187, 137, 227, 174, 253, 222, - 200, 220, 222, 103, 228, 243, 147, 116, 226, 225, 173, 160, 2, 182, 165, 223, - 238, 236, 247, 218, 126, 195, 148, 51, 175, 39, 173, 210, 97, 33, 87, 216, - 233, 158, 166, 243, 192, 11, 157, 55, 238, 242, 215, 149, 113, 167, 179, 149, - 61, 185, 222, 151, 143, 114, 29, 5, 168, 173, 198, 105, 85, 187, 55, 223, - 79, 171, 13, 35, 83, 178, 19, 173, 29, 229, 242, 85, 217, 58, 85, 123, - 235, 131, 166, 145, 62, 104, 188, 118, 107, 175, 133, 129, 188, 115, 160, 116, - 234, 235, 205, 139, 97, 181, 126, 122, 110, 118, 237, 110, 247, 174, 47, 29, - 12, 71, 221, 252, 93, 97, 253, 118, 255, 224, 166, 164, 218, 74, 126, 171, - 50, 214, 247, 74, 215, 234, 249, 193, 235, 168, 249, 94, 59, 175, 109, 94, - 175, 55, 114, 233, 174, 121, 114, 119, 112, 215, 171, 165, 75, 23, 3, 205, - 94, 207, 93, 53, 97, 93, 130, 185, 169, 102, 175, 229, 163, 225, 193, 160, - 190, 221, 57, 40, 29, 100, 39, 133, 163, 225, 125, 119, 183, 214, 126, 85, - 238, 14, 96, 147, 106, 231, 155, 217, 244, 126, 186, 159, 110, 92, 166, 39, - 39, 210, 125, 103, 152, 62, 60, 93, 223, 185, 172, 60, 166, 47, 206, 181, - 177, 106, 167, 245, 201, 182, 210, 78, 31, 166, 239, 128, 108, 48, 77, 233, - 174, 83, 200, 157, 77, 6, 7, 131, 219, 90, 167, 210, 176, 239, 19, 105, - 163, 177, 123, 255, 126, 96, 218, 149, 201, 241, 158, 214, 57, 54, 211, 23, - 175, 170, 44, 239, 215, 50, 55, 131, 81, 171, 218, 77, 219, 218, 205, 222, - 196, 176, 143, 215, 155, 178, 118, 32, 29, 166, 95, 115, 235, 157, 110, 119, - 191, 114, 218, 107, 92, 62, 164, 183, 74, 181, 221, 180, 93, 191, 180, 183, - 74, 121, 229, 81, 219, 147, 210, 167, 195, 194, 107, 110, 107, 55, 215, 61, - 122, 205, 118, 246, 19, 251, 74, 173, 241, 122, 218, 111, 78, 114, 250, 99, - 183, 151, 174, 165, 95, 91, 217, 205, 174, 154, 110, 85, 75, 247, 137, 163, - 194, 78, 65, 42, 221, 213, 108, 165, 110, 173, 95, 87, 110, 75, 131, 215, - 106, 226, 173, 97, 140, 242, 233, 222, 253, 64, 95, 79, 244, 187, 242, 72, - 43, 216, 165, 234, 245, 67, 99, 55, 49, 153, 168, 119, 59, 218, 122, 126, - 82, 239, 228, 97, 163, 200, 220, 117, 115, 217, 209, 122, 34, 173, 142, 222, - 52, 89, 42, 181, 178, 133, 254, 201, 121, 237, 188, 48, 217, 189, 183, 14, - 212, 187, 215, 252, 169, 49, 42, 168, 37, 171, 102, 87, 106, 245, 108, 246, - 164, 155, 109, 108, 43, 3, 43, 155, 57, 170, 194, 178, 85, 26, 222, 239, - 30, 159, 90, 231, 15, 131, 124, 233, 2, 86, 210, 131, 201, 171, 92, 232, - 170, 82, 247, 174, 158, 191, 54, 204, 252, 213, 85, 250, 178, 222, 190, 153, - 188, 94, 151, 114, 137, 189, 86, 186, 86, 173, 52, 70, 181, 193, 160, 89, - 77, 244, 118, 94, 213, 179, 122, 107, 187, 106, 12, 111, 31, 14, 74, 202, - 176, 125, 219, 236, 30, 52, 78, 110, 149, 237, 155, 66, 3, 8, 250, 91, - 233, 125, 167, 218, 41, 13, 244, 244, 230, 209, 192, 182, 107, 118, 199, 128, - 185, 51, 84, 134, 153, 241, 248, 188, 151, 152, 20, 134, 195, 45, 227, 224, - 53, 113, 221, 85, 250, 237, 126, 230, 184, 158, 79, 143, 228, 236, 221, 72, - 109, 13, 234, 143, 165, 254, 77, 246, 209, 204, 154, 114, 182, 115, 217, 28, - 100, 223, 228, 92, 243, 246, 181, 145, 57, 202, 181, 174, 119, 210, 71, 245, - 252, 233, 67, 110, 61, 55, 150, 135, 183, 237, 201, 112, 120, 120, 150, 203, - 24, 249, 122, 171, 42, 15, 183, 53, 88, 146, 170, 245, 157, 251, 161, 121, - 115, 162, 149, 42, 195, 135, 135, 209, 112, 179, 93, 181, 11, 178, 113, 114, - 119, 107, 52, 59, 195, 243, 179, 220, 120, 243, 250, 190, 147, 62, 53, 79, - 78, 135, 245, 205, 243, 195, 236, 164, 145, 121, 53, 206, 47, 172, 225, 97, - 45, 161, 222, 237, 37, 110, 141, 1, 176, 27, 167, 147, 68, 54, 49, 178, - 155, 146, 222, 126, 29, 142, 141, 218, 254, 126, 226, 46, 115, 168, 93, 42, - 237, 209, 166, 188, 87, 207, 29, 157, 141, 178, 135, 153, 189, 3, 179, 123, - 124, 127, 189, 243, 54, 209, 79, 19, 173, 140, 173, 30, 202, 233, 221, 198, - 107, 161, 113, 219, 60, 133, 245, 58, 113, 179, 123, 149, 189, 175, 79, 186, - 122, 126, 191, 174, 150, 238, 78, 222, 15, 242, 235, 235, 153, 45, 125, 104, - 104, 183, 233, 202, 249, 225, 186, 146, 190, 59, 235, 85, 247, 186, 251, 183, - 123, 214, 190, 244, 154, 144, 50, 173, 245, 186, 180, 185, 215, 219, 221, 235, - 110, 195, 160, 22, 14, 180, 195, 126, 99, 111, 127, 253, 230, 49, 91, 61, - 203, 76, 164, 170, 157, 203, 23, 214, 207, 10, 247, 82, 109, 240, 216, 218, - 157, 52, 207, 212, 92, 231, 109, 243, 228, 236, 77, 127, 191, 79, 156, 154, - 93, 25, 80, 253, 86, 127, 152, 148, 182, 206, 234, 215, 247, 131, 139, 250, - 121, 45, 219, 30, 183, 95, 181, 118, 62, 109, 203, 173, 201, 89, 34, 125, - 250, 40, 89, 231, 131, 183, 204, 72, 127, 189, 251, 127, 216, 123, 247, 254, - 182, 109, 100, 127, 248, 127, 189, 10, 134, 81, 42, 201, 166, 46, 148, 108, - 39, 177, 45, 117, 211, 164, 151, 156, 211, 164, 57, 73, 118, 187, 187, 182, - 171, 165, 37, 74, 98, 35, 145, 170, 40, 197, 118, 85, 229, 181, 63, 243, - 157, 1, 72, 144, 146, 124, 75, 186, 123, 206, 239, 243, 180, 73, 68, 130, - 192, 0, 24, 12, 6, 3, 96, 46, 191, 63, 219, 251, 175, 167, 255, 253, - 228, 197, 238, 248, 227, 192, 125, 243, 124, 112, 48, 158, 255, 248, 215, 70, - 240, 166, 255, 241, 195, 79, 143, 255, 30, 14, 7, 117, 98, 99, 23, 245, - 89, 243, 135, 167, 79, 102, 123, 131, 223, 95, 60, 245, 127, 30, 180, 254, - 185, 216, 255, 254, 111, 31, 247, 6, 209, 155, 159, 190, 13, 113, 223, 242, - 235, 51, 125, 223, 242, 251, 79, 255, 131, 251, 150, 215, 225, 147, 239, 127, - 126, 249, 143, 201, 55, 195, 119, 223, 15, 94, 254, 179, 55, 250, 240, 238, - 123, 239, 229, 63, 127, 127, 254, 236, 127, 126, 109, 12, 127, 188, 124, 21, - 77, 226, 253, 255, 249, 230, 159, 255, 243, 195, 179, 31, 174, 126, 251, 102, - 240, 143, 182, 93, 232, 251, 250, 88, 167, 59, 27, 251, 53, 108, 212, 205, - 211, 135, 125, 75, 239, 230, 247, 158, 52, 86, 214, 57, 124, 97, 53, 225, - 129, 210, 234, 180, 107, 214, 94, 227, 81, 65, 217, 53, 158, 36, 187, 109, - 181, 95, 183, 242, 251, 245, 126, 224, 77, 162, 240, 166, 29, 187, 206, 245, - 167, 236, 217, 53, 112, 189, 107, 79, 155, 116, 251, 125, 251, 166, 6, 254, - 239, 56, 222, 113, 212, 1, 79, 80, 111, 254, 239, 61, 212, 209, 232, 219, - 118, 170, 51, 128, 93, 101, 74, 34, 78, 183, 15, 173, 184, 249, 149, 190, - 1, 226, 219, 17, 167, 113, 220, 238, 70, 83, 175, 71, 31, 224, 24, 80, - 174, 30, 112, 173, 242, 44, 158, 142, 253, 48, 88, 76, 44, 143, 106, 10, - 231, 139, 73, 53, 12, 134, 51, 122, 199, 85, 203, 251, 145, 63, 190, 66, - 184, 169, 160, 239, 245, 124, 207, 55, 84, 112, 13, 18, 252, 198, 155, 133, - 241, 216, 191, 178, 184, 45, 247, 163, 61, 199, 42, 169, 134, 183, 247, 27, - 143, 240, 202, 13, 111, 183, 26, 120, 86, 77, 111, 55, 106, 45, 117, 144, - 202, 29, 104, 108, 32, 89, 110, 131, 166, 87, 133, 156, 117, 98, 101, 171, - 228, 101, 19, 117, 233, 87, 165, 88, 187, 108, 81, 157, 171, 138, 100, 216, - 67, 141, 73, 254, 189, 99, 21, 157, 92, 229, 220, 111, 83, 198, 109, 100, - 159, 65, 138, 82, 244, 84, 61, 180, 138, 77, 220, 2, 226, 250, 162, 216, - 226, 238, 168, 254, 81, 21, 183, 153, 25, 98, 128, 196, 202, 187, 75, 59, - 136, 187, 83, 127, 134, 176, 87, 108, 102, 253, 53, 229, 250, 165, 185, 83, - 108, 30, 22, 137, 168, 139, 175, 153, 202, 154, 5, 31, 150, 233, 28, 115, - 168, 92, 220, 111, 195, 62, 126, 224, 166, 30, 55, 224, 42, 248, 192, 58, - 59, 178, 210, 255, 134, 201, 103, 56, 223, 24, 52, 229, 173, 70, 20, 74, - 255, 32, 202, 92, 179, 133, 127, 154, 92, 106, 168, 62, 59, 110, 237, 128, - 179, 183, 248, 157, 178, 186, 240, 191, 218, 124, 226, 232, 66, 123, 200, 63, - 108, 105, 216, 181, 189, 61, 206, 191, 167, 192, 63, 65, 246, 198, 30, 42, - 161, 127, 241, 206, 249, 247, 76, 240, 107, 77, 111, 238, 103, 155, 110, 52, - 158, 224, 236, 101, 218, 223, 104, 237, 115, 15, 184, 199, 92, 151, 148, 85, - 61, 64, 189, 79, 145, 220, 204, 118, 131, 27, 179, 86, 40, 233, 72, 205, - 197, 183, 198, 227, 76, 95, 158, 114, 95, 26, 92, 31, 126, 40, 165, 101, - 244, 134, 83, 155, 236, 157, 246, 140, 141, 236, 47, 175, 50, 24, 199, 101, - 33, 76, 246, 225, 126, 228, 216, 46, 190, 182, 225, 183, 36, 116, 10, 51, - 74, 91, 148, 137, 141, 232, 34, 51, 162, 202, 175, 203, 229, 129, 187, 115, - 121, 85, 217, 109, 15, 221, 202, 97, 129, 210, 158, 32, 173, 169, 210, 154, - 146, 230, 238, 35, 177, 165, 18, 91, 149, 67, 122, 219, 83, 111, 123, 4, - 239, 229, 73, 8, 39, 9, 151, 87, 5, 34, 107, 109, 232, 121, 217, 251, - 157, 184, 89, 173, 102, 53, 225, 92, 7, 126, 1, 237, 183, 237, 89, 52, - 47, 87, 139, 173, 202, 145, 245, 86, 92, 52, 84, 241, 139, 183, 150, 122, - 107, 225, 205, 94, 89, 147, 29, 173, 116, 219, 164, 25, 74, 139, 101, 199, - 161, 63, 232, 101, 21, 172, 119, 34, 30, 249, 217, 254, 0, 94, 175, 193, - 51, 225, 15, 146, 175, 123, 123, 227, 104, 209, 183, 170, 197, 61, 56, 9, - 48, 214, 0, 195, 181, 175, 104, 235, 26, 107, 106, 102, 222, 109, 224, 151, - 67, 223, 155, 101, 248, 101, 120, 222, 157, 251, 62, 124, 80, 49, 151, 20, - 167, 69, 146, 68, 24, 107, 72, 106, 52, 24, 196, 254, 90, 106, 16, 134, - 254, 172, 11, 35, 189, 69, 204, 169, 155, 184, 35, 87, 248, 5, 86, 103, - 135, 253, 43, 113, 11, 218, 242, 106, 54, 181, 221, 20, 70, 105, 180, 51, - 189, 195, 53, 154, 217, 222, 219, 196, 52, 185, 141, 154, 105, 42, 12, 109, - 102, 154, 202, 202, 0, 62, 131, 154, 138, 75, 54, 59, 138, 157, 182, 168, - 17, 9, 179, 108, 49, 66, 18, 54, 154, 97, 162, 58, 125, 159, 90, 147, - 124, 216, 231, 15, 219, 216, 233, 22, 44, 22, 155, 22, 247, 213, 145, 31, - 75, 80, 66, 181, 235, 4, 65, 8, 85, 171, 212, 46, 8, 19, 150, 96, - 130, 106, 188, 3, 179, 85, 228, 71, 116, 57, 190, 26, 70, 161, 181, 180, - 11, 124, 43, 107, 233, 49, 33, 170, 47, 54, 143, 84, 162, 57, 50, 248, - 208, 122, 164, 191, 152, 3, 68, 95, 136, 83, 239, 209, 183, 233, 60, 78, - 124, 34, 53, 27, 123, 79, 224, 20, 137, 57, 64, 32, 28, 32, 56, 102, - 103, 35, 148, 173, 226, 20, 224, 161, 35, 216, 105, 238, 76, 131, 122, 146, - 122, 196, 124, 193, 114, 173, 106, 182, 238, 221, 204, 235, 78, 25, 131, 231, - 237, 232, 54, 215, 167, 1, 92, 99, 39, 239, 176, 206, 51, 218, 87, 121, - 4, 79, 63, 4, 254, 36, 16, 239, 41, 130, 164, 139, 122, 115, 167, 236, - 34, 8, 192, 78, 47, 138, 203, 158, 56, 51, 201, 231, 26, 165, 185, 136, - 100, 84, 46, 56, 57, 73, 218, 92, 111, 58, 244, 67, 188, 206, 102, 89, - 136, 245, 126, 246, 213, 37, 86, 205, 162, 149, 217, 193, 95, 196, 36, 219, - 185, 216, 41, 238, 63, 90, 137, 243, 246, 96, 109, 202, 51, 109, 108, 147, - 143, 70, 244, 113, 126, 131, 12, 45, 121, 254, 20, 9, 90, 64, 235, 169, - 165, 27, 115, 123, 233, 121, 189, 105, 119, 32, 90, 144, 146, 114, 165, 106, - 195, 85, 214, 165, 80, 205, 197, 145, 229, 30, 240, 168, 204, 43, 191, 180, - 236, 235, 178, 181, 120, 136, 231, 240, 112, 179, 207, 143, 205, 29, 126, 105, - 242, 75, 75, 94, 240, 184, 71, 143, 118, 1, 126, 91, 180, 147, 229, 169, - 7, 55, 251, 172, 54, 147, 242, 110, 230, 220, 133, 193, 56, 138, 250, 201, - 8, 107, 63, 54, 13, 171, 221, 134, 174, 150, 54, 131, 214, 195, 43, 40, - 216, 54, 190, 122, 66, 230, 88, 58, 52, 147, 225, 6, 189, 211, 110, 41, - 25, 120, 211, 192, 171, 194, 36, 27, 93, 55, 248, 67, 63, 66, 71, 174, - 110, 205, 164, 117, 229, 237, 125, 197, 129, 69, 150, 205, 114, 94, 181, 42, - 30, 228, 250, 1, 247, 245, 203, 22, 204, 81, 196, 6, 37, 223, 203, 155, - 216, 242, 126, 194, 149, 225, 127, 68, 153, 145, 110, 112, 86, 173, 9, 76, - 67, 54, 17, 224, 36, 204, 85, 247, 132, 187, 145, 136, 172, 125, 127, 120, - 7, 42, 44, 55, 142, 150, 32, 40, 106, 216, 174, 181, 44, 23, 91, 213, - 167, 141, 10, 8, 204, 197, 14, 25, 123, 34, 90, 245, 155, 187, 106, 71, - 212, 178, 36, 190, 78, 3, 187, 36, 18, 97, 131, 89, 51, 169, 130, 119, - 118, 180, 85, 163, 206, 214, 64, 117, 181, 26, 7, 129, 49, 228, 6, 246, - 119, 189, 91, 19, 63, 194, 98, 226, 78, 233, 193, 164, 26, 188, 162, 253, - 215, 46, 210, 221, 245, 116, 118, 79, 45, 52, 170, 241, 81, 131, 144, 14, - 32, 191, 112, 179, 82, 127, 194, 38, 101, 22, 155, 85, 141, 190, 109, 228, - 25, 135, 209, 197, 96, 12, 141, 193, 67, 75, 211, 39, 68, 7, 162, 146, - 153, 223, 91, 136, 213, 241, 113, 251, 96, 19, 117, 166, 101, 239, 201, 154, - 98, 147, 52, 133, 18, 51, 245, 18, 125, 94, 67, 145, 105, 245, 160, 201, - 98, 199, 164, 71, 179, 91, 119, 160, 72, 89, 233, 155, 212, 223, 109, 252, - 110, 115, 159, 83, 130, 76, 27, 127, 247, 197, 219, 34, 74, 116, 155, 141, - 163, 230, 94, 163, 98, 237, 16, 45, 104, 26, 52, 8, 42, 141, 93, 209, - 75, 140, 197, 154, 5, 162, 208, 189, 29, 14, 123, 210, 44, 12, 40, 19, - 73, 199, 196, 173, 172, 151, 180, 238, 97, 171, 241, 242, 164, 124, 181, 235, - 86, 30, 141, 104, 49, 3, 3, 45, 79, 177, 16, 79, 27, 149, 122, 139, - 114, 76, 56, 165, 65, 196, 63, 117, 105, 209, 163, 47, 180, 177, 57, 56, - 216, 161, 61, 192, 252, 196, 61, 35, 73, 5, 218, 144, 84, 244, 3, 101, - 220, 219, 185, 130, 28, 14, 119, 132, 31, 100, 57, 157, 54, 214, 18, 8, - 212, 60, 159, 56, 73, 18, 248, 21, 13, 160, 60, 118, 129, 9, 151, 71, - 14, 61, 6, 233, 23, 93, 153, 9, 69, 183, 222, 92, 105, 127, 46, 212, - 253, 171, 223, 47, 19, 234, 167, 207, 112, 4, 147, 18, 255, 218, 162, 155, - 14, 212, 86, 210, 159, 175, 75, 218, 231, 51, 47, 36, 122, 137, 149, 176, - 61, 31, 5, 189, 15, 42, 90, 193, 198, 25, 48, 191, 191, 236, 28, 175, - 243, 101, 93, 123, 194, 151, 147, 250, 177, 207, 127, 178, 105, 50, 60, 53, - 59, 195, 188, 185, 216, 217, 109, 102, 120, 179, 234, 231, 53, 135, 12, 171, - 84, 66, 166, 1, 200, 136, 200, 91, 231, 65, 190, 231, 233, 20, 208, 189, - 224, 46, 36, 61, 32, 112, 119, 152, 17, 0, 223, 234, 131, 199, 17, 59, - 239, 69, 99, 4, 52, 178, 122, 244, 111, 72, 127, 119, 240, 5, 145, 6, - 10, 252, 175, 245, 107, 171, 15, 239, 238, 78, 186, 96, 211, 60, 216, 204, - 17, 185, 217, 155, 8, 194, 176, 237, 17, 3, 184, 156, 113, 143, 178, 9, - 60, 180, 68, 13, 91, 212, 175, 113, 136, 229, 252, 142, 127, 62, 138, 26, - 182, 40, 103, 179, 82, 118, 38, 253, 119, 78, 255, 221, 53, 146, 62, 114, - 210, 71, 215, 120, 67, 133, 202, 139, 237, 102, 67, 76, 213, 136, 243, 5, - 108, 196, 149, 65, 102, 57, 154, 206, 107, 202, 39, 79, 29, 75, 83, 157, - 164, 27, 66, 120, 189, 55, 242, 104, 55, 49, 134, 25, 85, 37, 175, 200, - 105, 232, 126, 102, 65, 246, 168, 12, 91, 57, 166, 26, 194, 231, 87, 162, - 174, 10, 203, 63, 152, 64, 223, 96, 221, 89, 78, 209, 104, 154, 168, 155, - 10, 132, 170, 27, 174, 117, 62, 94, 204, 216, 136, 168, 101, 24, 12, 110, - 54, 68, 82, 110, 100, 226, 149, 46, 221, 220, 127, 228, 60, 222, 199, 96, - 19, 231, 151, 99, 205, 19, 57, 228, 52, 109, 15, 49, 11, 214, 92, 227, - 198, 166, 37, 151, 216, 37, 210, 212, 138, 19, 183, 22, 60, 71, 190, 94, - 217, 142, 4, 211, 16, 67, 121, 201, 199, 49, 55, 93, 254, 130, 240, 22, - 138, 120, 151, 171, 21, 33, 6, 38, 201, 131, 192, 60, 38, 23, 147, 71, - 98, 49, 80, 168, 116, 219, 75, 235, 107, 235, 15, 68, 172, 17, 43, 185, - 115, 111, 70, 127, 60, 60, 69, 30, 219, 212, 157, 71, 243, 185, 250, 182, - 128, 67, 186, 193, 248, 10, 234, 190, 84, 152, 68, 85, 47, 228, 103, 86, - 0, 102, 69, 94, 170, 98, 48, 128, 66, 47, 59, 198, 135, 98, 239, 16, - 255, 46, 104, 150, 255, 97, 249, 158, 40, 157, 211, 184, 79, 71, 30, 107, - 4, 67, 76, 29, 137, 34, 48, 12, 13, 233, 97, 182, 8, 184, 222, 225, - 204, 247, 123, 200, 61, 92, 76, 38, 168, 114, 20, 65, 63, 30, 186, 195, - 113, 208, 199, 195, 24, 22, 165, 61, 48, 56, 122, 246, 189, 1, 255, 132, - 158, 252, 64, 55, 121, 12, 93, 214, 63, 44, 16, 201, 12, 58, 179, 244, - 8, 185, 53, 136, 61, 121, 252, 224, 3, 46, 201, 220, 179, 136, 171, 156, - 250, 97, 47, 24, 203, 211, 116, 10, 210, 251, 131, 4, 171, 40, 158, 115, - 203, 102, 17, 87, 47, 54, 132, 244, 64, 148, 219, 71, 249, 121, 48, 228, - 239, 23, 30, 87, 113, 225, 1, 73, 242, 252, 187, 63, 238, 123, 208, 226, - 6, 174, 217, 217, 182, 60, 190, 118, 186, 18, 30, 118, 105, 129, 175, 253, - 97, 105, 115, 63, 228, 85, 219, 241, 182, 181, 254, 209, 152, 140, 27, 13, - 86, 212, 224, 194, 186, 77, 212, 137, 101, 34, 110, 224, 255, 155, 236, 247, - 226, 105, 54, 206, 210, 179, 196, 245, 53, 218, 156, 168, 126, 43, 63, 99, - 50, 9, 67, 173, 241, 108, 93, 16, 83, 29, 65, 143, 248, 163, 178, 234, - 213, 173, 225, 16, 171, 155, 69, 38, 201, 32, 203, 130, 166, 203, 47, 68, - 237, 221, 174, 134, 88, 88, 40, 242, 118, 20, 113, 59, 76, 218, 142, 34, - 108, 39, 33, 107, 39, 33, 106, 122, 154, 209, 223, 185, 195, 228, 236, 156, - 22, 152, 156, 29, 34, 102, 7, 164, 236, 48, 33, 59, 154, 140, 29, 38, - 98, 71, 72, 216, 17, 2, 118, 132, 124, 29, 38, 94, 135, 73, 151, 192, - 8, 233, 58, 9, 225, 58, 32, 91, 7, 68, 139, 127, 34, 7, 4, 235, - 104, 114, 117, 52, 177, 58, 66, 170, 142, 34, 84, 130, 163, 8, 213, 81, - 100, 234, 40, 34, 117, 64, 162, 142, 16, 168, 195, 228, 233, 48, 113, 58, - 32, 77, 39, 33, 76, 135, 201, 178, 144, 34, 136, 221, 144, 22, 31, 210, - 230, 199, 56, 169, 175, 54, 43, 134, 72, 170, 222, 232, 55, 123, 242, 95, - 117, 51, 185, 92, 149, 11, 158, 52, 236, 149, 114, 149, 65, 43, 255, 207, - 109, 42, 105, 253, 0, 23, 26, 234, 150, 138, 235, 107, 222, 17, 146, 43, - 144, 92, 130, 164, 244, 84, 57, 29, 169, 13, 78, 163, 85, 85, 220, 130, - 72, 223, 98, 14, 84, 168, 58, 186, 42, 188, 130, 163, 61, 250, 218, 252, - 72, 28, 171, 27, 79, 187, 226, 125, 188, 168, 50, 175, 224, 76, 4, 110, - 65, 220, 212, 229, 65, 1, 239, 25, 119, 7, 148, 135, 100, 137, 190, 188, - 42, 255, 34, 39, 165, 34, 229, 40, 33, 130, 234, 215, 136, 94, 10, 215, - 34, 34, 77, 44, 224, 8, 236, 85, 165, 146, 47, 167, 209, 240, 64, 245, - 30, 83, 90, 130, 166, 63, 80, 24, 64, 202, 42, 241, 197, 240, 202, 210, - 54, 96, 170, 217, 73, 115, 6, 8, 59, 206, 19, 244, 65, 91, 197, 87, - 87, 239, 237, 182, 110, 151, 106, 18, 23, 73, 34, 21, 165, 142, 44, 228, - 43, 87, 249, 136, 26, 187, 235, 174, 116, 172, 184, 155, 154, 167, 16, 102, - 134, 63, 210, 152, 106, 35, 139, 8, 209, 74, 154, 138, 197, 87, 202, 235, - 182, 171, 199, 11, 21, 187, 235, 168, 74, 131, 124, 210, 0, 228, 250, 109, - 142, 197, 106, 163, 113, 156, 140, 102, 151, 113, 80, 155, 134, 195, 194, 166, - 224, 235, 176, 129, 91, 203, 120, 141, 17, 157, 132, 28, 204, 140, 225, 138, - 61, 218, 21, 9, 122, 214, 118, 78, 249, 23, 157, 251, 241, 156, 153, 112, - 179, 111, 45, 39, 109, 132, 86, 42, 254, 236, 20, 127, 168, 28, 77, 58, - 141, 175, 39, 135, 123, 141, 134, 4, 207, 148, 33, 88, 131, 163, 226, 220, - 243, 149, 232, 207, 29, 53, 178, 197, 31, 218, 237, 134, 4, 117, 164, 172, - 63, 235, 80, 63, 234, 226, 247, 231, 118, 59, 201, 215, 145, 108, 87, 148, - 237, 135, 124, 182, 142, 153, 75, 60, 98, 214, 41, 117, 84, 47, 254, 96, - 20, 146, 232, 149, 186, 38, 140, 9, 30, 168, 7, 218, 1, 160, 25, 44, - 80, 213, 160, 46, 97, 25, 165, 133, 196, 5, 206, 94, 34, 169, 235, 37, - 129, 23, 39, 237, 91, 179, 236, 170, 4, 123, 121, 177, 186, 164, 61, 212, - 229, 178, 79, 127, 227, 149, 93, 81, 218, 234, 18, 202, 179, 70, 43, 225, - 194, 82, 116, 164, 197, 25, 140, 7, 100, 85, 236, 94, 182, 203, 170, 239, - 252, 57, 12, 132, 250, 36, 155, 14, 253, 144, 152, 252, 156, 157, 167, 250, - 253, 188, 51, 198, 36, 220, 67, 214, 15, 163, 167, 75, 75, 61, 244, 113, - 17, 139, 241, 14, 76, 94, 174, 133, 28, 207, 103, 176, 219, 57, 180, 108, - 121, 178, 243, 2, 116, 106, 105, 154, 51, 80, 147, 192, 173, 189, 168, 47, - 110, 7, 140, 5, 156, 1, 101, 206, 77, 165, 18, 123, 16, 69, 16, 225, - 236, 130, 174, 53, 183, 83, 74, 235, 18, 11, 68, 201, 101, 120, 127, 228, - 32, 122, 46, 7, 207, 77, 60, 53, 166, 194, 163, 73, 211, 36, 65, 170, - 248, 37, 78, 18, 172, 196, 49, 162, 143, 108, 220, 154, 94, 133, 212, 177, - 185, 54, 10, 188, 102, 19, 42, 226, 209, 190, 121, 103, 211, 230, 52, 109, - 19, 164, 35, 99, 180, 50, 27, 80, 179, 129, 84, 184, 144, 109, 112, 126, - 183, 153, 108, 54, 105, 119, 159, 238, 54, 91, 244, 156, 223, 97, 174, 183, - 157, 71, 4, 230, 70, 216, 122, 54, 47, 147, 141, 228, 11, 154, 232, 205, - 246, 18, 183, 184, 59, 8, 62, 135, 221, 96, 19, 97, 192, 120, 95, 136, - 203, 192, 98, 203, 41, 253, 189, 125, 89, 189, 168, 55, 143, 254, 209, 190, - 170, 142, 232, 215, 107, 123, 115, 47, 108, 150, 255, 225, 252, 189, 114, 20, - 12, 202, 127, 255, 165, 185, 251, 143, 95, 154, 199, 237, 34, 195, 131, 1, - 217, 142, 119, 30, 151, 113, 106, 220, 219, 109, 54, 26, 59, 229, 203, 250, - 69, 149, 102, 94, 101, 167, 124, 85, 31, 241, 83, 165, 226, 60, 217, 167, - 47, 222, 163, 50, 85, 191, 67, 25, 93, 56, 77, 47, 21, 146, 227, 185, - 61, 167, 137, 96, 159, 244, 247, 64, 253, 62, 86, 127, 91, 180, 107, 217, - 195, 206, 165, 246, 212, 97, 123, 53, 167, 81, 32, 74, 94, 196, 180, 173, - 197, 161, 199, 227, 149, 195, 103, 31, 13, 14, 228, 91, 179, 196, 135, 58, - 34, 249, 242, 70, 184, 102, 185, 205, 39, 4, 80, 34, 240, 98, 239, 139, - 144, 168, 45, 5, 28, 153, 247, 249, 250, 18, 215, 150, 194, 42, 44, 55, - 85, 215, 192, 40, 9, 86, 51, 27, 224, 212, 183, 246, 161, 222, 235, 241, - 18, 112, 130, 120, 33, 233, 43, 203, 213, 216, 167, 238, 172, 123, 60, 233, - 193, 113, 5, 91, 108, 6, 218, 105, 143, 97, 96, 156, 245, 77, 83, 203, - 112, 139, 132, 17, 64, 50, 222, 41, 233, 144, 162, 0, 200, 97, 97, 72, - 190, 79, 98, 214, 108, 1, 180, 8, 3, 216, 192, 117, 161, 61, 51, 11, - 206, 217, 193, 11, 65, 15, 207, 187, 99, 255, 35, 113, 215, 78, 219, 117, - 146, 249, 178, 118, 150, 131, 27, 56, 106, 174, 2, 66, 155, 174, 4, 12, - 56, 128, 42, 86, 237, 171, 93, 182, 50, 52, 116, 207, 126, 209, 159, 204, - 105, 177, 177, 37, 7, 123, 78, 75, 92, 209, 115, 144, 199, 228, 3, 141, - 184, 242, 154, 210, 234, 243, 134, 213, 109, 20, 182, 116, 69, 77, 40, 37, - 18, 40, 145, 205, 237, 152, 103, 153, 205, 228, 190, 147, 231, 84, 58, 165, - 84, 255, 138, 238, 150, 46, 22, 155, 27, 58, 87, 108, 42, 62, 21, 166, - 199, 53, 112, 237, 76, 213, 72, 208, 64, 4, 198, 115, 57, 40, 94, 49, - 212, 1, 241, 210, 136, 225, 77, 72, 144, 187, 250, 16, 66, 20, 139, 88, - 75, 169, 24, 238, 36, 1, 244, 92, 74, 1, 245, 186, 233, 58, 215, 52, - 78, 56, 149, 187, 240, 26, 78, 123, 240, 63, 230, 180, 240, 202, 19, 213, - 17, 106, 250, 11, 203, 196, 84, 70, 79, 205, 176, 75, 36, 12, 102, 41, - 246, 173, 223, 99, 111, 204, 108, 190, 27, 27, 246, 187, 202, 94, 92, 149, - 83, 39, 38, 250, 128, 196, 177, 162, 243, 185, 24, 186, 242, 78, 47, 241, - 204, 148, 20, 72, 120, 228, 194, 60, 101, 88, 76, 251, 84, 23, 125, 67, - 106, 161, 43, 175, 73, 70, 227, 229, 208, 250, 43, 191, 166, 110, 156, 18, - 79, 196, 99, 143, 39, 175, 49, 197, 216, 135, 169, 242, 29, 35, 62, 19, - 120, 79, 56, 219, 176, 225, 92, 176, 199, 24, 169, 10, 45, 40, 54, 116, - 43, 76, 15, 255, 247, 173, 91, 121, 87, 80, 181, 11, 119, 142, 22, 115, - 83, 84, 148, 202, 138, 93, 229, 201, 180, 6, 233, 176, 0, 169, 142, 93, - 34, 28, 230, 133, 198, 141, 217, 37, 34, 249, 99, 145, 168, 56, 242, 200, - 201, 242, 151, 213, 153, 83, 122, 248, 23, 124, 47, 57, 7, 149, 196, 217, - 46, 85, 111, 58, 209, 85, 146, 226, 246, 72, 1, 106, 132, 48, 0, 33, - 17, 6, 21, 133, 149, 180, 66, 17, 187, 237, 151, 56, 15, 5, 162, 57, - 130, 205, 188, 83, 190, 118, 225, 67, 0, 214, 123, 135, 133, 226, 15, 63, - 189, 250, 182, 126, 17, 205, 62, 212, 227, 89, 143, 59, 83, 31, 205, 39, - 99, 51, 116, 154, 4, 7, 60, 104, 52, 56, 128, 212, 238, 184, 192, 97, - 195, 221, 131, 189, 2, 7, 206, 182, 121, 32, 171, 255, 35, 14, 33, 225, - 102, 217, 102, 233, 239, 233, 1, 95, 66, 75, 158, 178, 66, 11, 22, 216, - 42, 17, 63, 189, 146, 4, 39, 25, 137, 215, 32, 99, 170, 174, 167, 132, - 70, 92, 90, 85, 247, 69, 201, 112, 135, 30, 221, 52, 218, 182, 138, 174, - 173, 36, 208, 37, 68, 205, 167, 251, 52, 75, 117, 76, 108, 5, 67, 130, - 97, 39, 193, 172, 193, 212, 220, 189, 92, 44, 235, 166, 206, 22, 89, 155, - 144, 1, 247, 91, 139, 89, 207, 143, 249, 85, 99, 174, 118, 62, 153, 106, - 79, 199, 130, 14, 170, 65, 215, 67, 235, 35, 253, 217, 24, 49, 251, 78, - 149, 116, 227, 9, 173, 36, 186, 42, 53, 116, 52, 176, 147, 174, 15, 143, - 92, 32, 234, 46, 198, 74, 109, 210, 31, 32, 176, 132, 144, 138, 72, 39, - 89, 143, 245, 175, 130, 56, 102, 155, 244, 212, 215, 72, 108, 61, 80, 161, - 35, 170, 133, 95, 167, 254, 176, 251, 219, 130, 56, 194, 252, 170, 253, 152, - 214, 247, 209, 98, 114, 174, 14, 162, 220, 39, 250, 93, 9, 91, 79, 27, - 133, 30, 53, 102, 24, 193, 79, 83, 251, 252, 194, 81, 78, 41, 16, 170, - 43, 166, 149, 113, 150, 36, 76, 103, 145, 51, 88, 252, 26, 92, 206, 73, - 14, 142, 131, 192, 225, 192, 233, 193, 71, 191, 203, 158, 148, 210, 87, 18, - 62, 211, 151, 104, 220, 119, 166, 65, 15, 30, 24, 6, 151, 14, 155, 216, - 59, 226, 121, 105, 140, 35, 18, 218, 161, 7, 209, 34, 214, 109, 184, 82, - 230, 223, 246, 55, 99, 132, 241, 70, 151, 127, 30, 5, 115, 218, 188, 159, - 22, 16, 188, 144, 221, 101, 156, 232, 166, 157, 101, 147, 169, 129, 146, 242, - 29, 181, 210, 250, 251, 123, 52, 211, 122, 249, 146, 147, 94, 171, 246, 160, - 48, 85, 126, 150, 75, 164, 38, 231, 147, 168, 225, 146, 244, 70, 90, 255, - 221, 223, 229, 141, 29, 109, 97, 232, 98, 126, 127, 135, 110, 100, 160, 254, - 77, 186, 100, 167, 125, 242, 22, 243, 17, 98, 86, 216, 111, 104, 117, 226, - 80, 162, 2, 234, 154, 183, 119, 243, 5, 46, 246, 223, 225, 168, 233, 252, - 234, 198, 236, 217, 183, 87, 222, 172, 103, 189, 141, 224, 200, 87, 26, 249, - 95, 11, 47, 180, 94, 249, 99, 111, 230, 173, 103, 111, 172, 53, 180, 139, - 157, 180, 173, 226, 27, 158, 143, 163, 97, 141, 24, 41, 31, 141, 213, 66, - 127, 78, 194, 161, 219, 170, 55, 158, 212, 129, 132, 106, 66, 191, 85, 232, - 125, 251, 243, 184, 26, 132, 85, 144, 126, 117, 24, 76, 166, 53, 16, 53, - 87, 249, 127, 5, 90, 44, 24, 175, 77, 252, 58, 136, 189, 202, 128, 226, - 192, 128, 20, 177, 147, 255, 255, 43, 157, 186, 184, 184, 168, 245, 131, 97, - 0, 129, 163, 118, 238, 215, 71, 222, 184, 143, 184, 119, 85, 42, 74, 220, - 251, 106, 236, 87, 189, 234, 216, 171, 134, 193, 135, 106, 28, 13, 230, 23, - 222, 204, 55, 203, 255, 74, 164, 51, 97, 202, 169, 209, 202, 92, 243, 22, - 117, 158, 195, 213, 92, 91, 16, 73, 175, 74, 139, 70, 181, 31, 93, 132, - 227, 200, 235, 255, 111, 199, 79, 131, 131, 1, 49, 43, 132, 207, 32, 168, - 227, 88, 45, 218, 31, 61, 50, 22, 37, 207, 234, 207, 162, 41, 156, 154, - 194, 45, 15, 84, 60, 91, 121, 167, 169, 22, 135, 161, 72, 52, 232, 121, - 169, 104, 238, 237, 91, 180, 126, 67, 41, 100, 60, 29, 121, 105, 240, 25, - 91, 234, 12, 230, 114, 0, 46, 155, 242, 83, 187, 104, 219, 59, 167, 182, - 62, 111, 167, 53, 176, 212, 229, 192, 30, 214, 160, 102, 209, 30, 145, 35, - 38, 252, 241, 199, 175, 229, 170, 91, 105, 183, 91, 205, 202, 87, 95, 169, - 216, 9, 244, 160, 35, 39, 112, 208, 4, 14, 159, 224, 4, 21, 107, 97, - 73, 212, 4, 18, 27, 104, 23, 162, 240, 144, 198, 228, 145, 232, 13, 197, - 148, 239, 147, 60, 173, 121, 128, 28, 130, 158, 90, 114, 246, 229, 24, 153, - 86, 5, 13, 8, 135, 173, 131, 75, 181, 116, 169, 117, 76, 103, 188, 90, - 25, 85, 238, 182, 165, 170, 101, 189, 168, 82, 86, 84, 21, 11, 214, 114, - 104, 68, 75, 219, 105, 104, 117, 180, 220, 9, 72, 86, 50, 128, 214, 84, - 28, 20, 66, 22, 177, 139, 180, 190, 137, 52, 172, 78, 113, 121, 113, 176, - 139, 105, 101, 182, 165, 30, 212, 97, 146, 89, 3, 237, 127, 222, 80, 231, - 113, 161, 51, 32, 198, 238, 207, 128, 253, 5, 243, 117, 149, 251, 210, 178, - 199, 161, 85, 29, 196, 86, 173, 86, 135, 167, 218, 25, 150, 71, 38, 23, - 139, 208, 152, 249, 60, 32, 202, 163, 53, 168, 70, 255, 108, 253, 54, 165, - 161, 93, 251, 22, 69, 115, 18, 81, 55, 194, 148, 40, 38, 155, 191, 129, - 122, 105, 143, 186, 88, 251, 240, 235, 111, 11, 127, 118, 85, 117, 107, 174, - 91, 107, 212, 38, 65, 88, 251, 53, 94, 203, 196, 147, 188, 214, 139, 215, - 191, 40, 201, 65, 146, 39, 31, 250, 193, 204, 170, 78, 9, 203, 67, 78, - 232, 97, 251, 49, 132, 184, 155, 150, 224, 66, 195, 58, 205, 192, 104, 143, - 239, 70, 107, 183, 201, 26, 223, 46, 235, 44, 142, 55, 162, 109, 68, 35, - 193, 210, 130, 197, 210, 125, 102, 84, 191, 151, 179, 56, 184, 164, 161, 153, - 28, 122, 184, 214, 147, 77, 148, 80, 137, 118, 131, 49, 72, 125, 216, 243, - 121, 103, 210, 97, 157, 204, 210, 19, 17, 83, 114, 161, 240, 160, 32, 76, - 32, 153, 241, 233, 71, 76, 253, 227, 179, 66, 200, 209, 54, 212, 233, 50, - 230, 203, 241, 170, 144, 70, 224, 129, 3, 229, 36, 32, 79, 241, 184, 157, - 68, 211, 73, 187, 0, 53, 249, 170, 149, 198, 217, 225, 166, 238, 178, 12, - 90, 52, 132, 182, 194, 238, 60, 66, 77, 246, 91, 159, 221, 179, 247, 136, - 65, 239, 57, 8, 88, 82, 109, 62, 89, 57, 77, 236, 91, 153, 129, 177, - 217, 142, 211, 40, 68, 181, 164, 91, 245, 4, 56, 198, 192, 41, 154, 178, - 33, 171, 174, 236, 10, 15, 68, 152, 66, 179, 152, 84, 127, 99, 97, 28, - 34, 163, 105, 69, 83, 166, 180, 4, 100, 45, 3, 16, 78, 151, 110, 7, - 52, 117, 49, 29, 132, 125, 53, 185, 255, 109, 188, 43, 71, 94, 207, 213, - 7, 203, 182, 31, 218, 2, 214, 70, 168, 25, 93, 128, 178, 37, 4, 150, - 36, 230, 40, 44, 205, 173, 110, 91, 146, 247, 58, 22, 226, 173, 185, 229, - 107, 122, 71, 178, 137, 149, 42, 236, 228, 250, 173, 51, 172, 83, 154, 124, - 225, 22, 51, 116, 157, 160, 55, 97, 113, 123, 201, 158, 124, 36, 152, 214, - 74, 223, 13, 241, 9, 15, 48, 13, 128, 36, 33, 132, 128, 249, 70, 138, - 150, 52, 84, 187, 100, 77, 22, 177, 210, 223, 144, 89, 209, 87, 211, 111, - 86, 195, 41, 148, 252, 105, 57, 45, 92, 31, 228, 106, 178, 118, 113, 210, - 18, 59, 244, 199, 229, 88, 90, 226, 207, 255, 213, 113, 155, 150, 227, 21, - 20, 210, 154, 251, 143, 57, 52, 86, 45, 135, 63, 141, 15, 190, 217, 1, - 253, 108, 156, 175, 203, 230, 14, 80, 195, 63, 208, 166, 132, 174, 71, 118, - 174, 102, 71, 38, 33, 210, 4, 60, 88, 88, 114, 67, 180, 158, 47, 55, - 140, 8, 159, 181, 158, 201, 166, 100, 116, 98, 119, 226, 77, 57, 250, 176, - 108, 239, 106, 196, 106, 106, 212, 175, 165, 200, 6, 167, 122, 88, 86, 152, - 230, 180, 147, 94, 155, 231, 233, 68, 175, 221, 212, 230, 236, 4, 43, 24, - 83, 115, 83, 65, 53, 67, 183, 22, 159, 77, 212, 206, 190, 160, 85, 205, - 85, 220, 161, 154, 49, 89, 119, 219, 174, 172, 241, 58, 38, 145, 91, 173, - 186, 135, 205, 179, 173, 188, 155, 23, 61, 220, 127, 212, 244, 116, 250, 204, - 201, 14, 253, 128, 92, 186, 218, 89, 102, 55, 154, 4, 227, 214, 156, 97, - 157, 172, 10, 74, 183, 163, 216, 33, 186, 222, 189, 88, 41, 115, 2, 157, - 48, 50, 87, 3, 14, 237, 178, 62, 31, 51, 173, 177, 173, 122, 126, 49, - 208, 247, 61, 133, 227, 7, 47, 126, 122, 254, 254, 31, 111, 190, 21, 100, - 189, 249, 235, 55, 63, 190, 124, 78, 84, 86, 173, 215, 127, 110, 61, 175, - 215, 95, 188, 127, 97, 253, 253, 135, 247, 175, 126, 228, 216, 105, 188, 245, - 13, 196, 241, 102, 189, 254, 237, 107, 196, 111, 43, 156, 154, 91, 130, 139, - 86, 45, 154, 13, 235, 239, 223, 214, 47, 1, 208, 5, 0, 245, 88, 157, - 27, 165, 107, 253, 121, 255, 212, 238, 32, 18, 27, 181, 161, 90, 125, 24, - 132, 68, 183, 125, 57, 149, 106, 19, 200, 84, 108, 33, 17, 182, 90, 237, - 32, 95, 220, 155, 5, 83, 98, 42, 48, 67, 60, 181, 225, 164, 190, 254, - 171, 247, 209, 147, 100, 134, 86, 24, 197, 53, 162, 168, 33, 140, 184, 74, - 176, 207, 243, 103, 165, 35, 20, 173, 75, 38, 6, 3, 231, 237, 65, 159, - 32, 144, 196, 223, 83, 49, 11, 169, 116, 154, 62, 39, 225, 156, 4, 237, - 69, 54, 145, 170, 235, 210, 23, 74, 252, 14, 226, 228, 183, 90, 156, 60, - 174, 83, 158, 142, 252, 155, 1, 47, 245, 175, 3, 65, 250, 12, 39, 108, - 243, 89, 36, 173, 62, 158, 118, 158, 77, 34, 117, 45, 160, 252, 74, 146, - 32, 250, 145, 196, 14, 62, 177, 11, 66, 235, 248, 188, 115, 60, 136, 56, - 62, 192, 56, 154, 17, 168, 135, 13, 250, 239, 224, 128, 0, 168, 147, 202, - 227, 58, 190, 83, 67, 206, 59, 142, 21, 45, 102, 40, 146, 111, 233, 121, - 7, 8, 158, 67, 53, 9, 50, 43, 3, 135, 115, 195, 233, 116, 124, 101, - 169, 51, 19, 136, 187, 85, 229, 165, 18, 48, 184, 66, 45, 3, 51, 8, - 18, 161, 175, 80, 129, 210, 187, 163, 14, 188, 138, 196, 93, 36, 109, 243, - 137, 91, 81, 161, 86, 163, 177, 203, 121, 85, 57, 241, 178, 120, 14, 183, - 175, 226, 220, 95, 244, 127, 142, 61, 107, 52, 243, 7, 237, 211, 47, 183, - 9, 35, 132, 188, 241, 96, 1, 241, 65, 142, 34, 142, 235, 94, 39, 235, - 167, 81, 205, 68, 57, 3, 142, 162, 15, 212, 112, 234, 130, 71, 84, 25, - 13, 229, 4, 166, 6, 39, 141, 87, 218, 51, 100, 223, 239, 7, 61, 142, - 113, 24, 43, 87, 165, 42, 98, 3, 60, 169, 86, 229, 88, 238, 110, 227, - 99, 77, 199, 139, 33, 53, 61, 57, 14, 229, 77, 199, 127, 207, 130, 185, - 231, 192, 67, 35, 97, 151, 181, 165, 100, 92, 64, 20, 84, 29, 66, 119, - 120, 113, 32, 206, 54, 81, 168, 118, 92, 159, 170, 25, 52, 237, 124, 227, - 143, 163, 11, 39, 41, 25, 82, 215, 135, 210, 201, 89, 180, 24, 142, 148, - 211, 121, 29, 135, 103, 74, 251, 207, 40, 102, 39, 185, 198, 224, 90, 18, - 193, 130, 24, 39, 109, 75, 57, 64, 196, 36, 234, 195, 137, 166, 56, 177, - 199, 225, 26, 223, 128, 69, 19, 63, 115, 19, 207, 36, 240, 15, 221, 230, - 49, 117, 64, 239, 214, 45, 28, 58, 103, 42, 33, 248, 48, 82, 153, 195, - 173, 173, 10, 156, 212, 139, 102, 244, 105, 26, 133, 124, 51, 182, 70, 18, - 96, 43, 180, 31, 33, 176, 99, 207, 155, 225, 180, 160, 62, 247, 123, 163, - 144, 128, 14, 101, 169, 214, 227, 254, 131, 55, 238, 35, 234, 38, 134, 92, - 197, 11, 149, 153, 131, 53, 92, 136, 95, 124, 74, 58, 32, 3, 104, 3, - 34, 62, 34, 16, 200, 46, 40, 45, 125, 78, 33, 81, 38, 226, 197, 116, - 10, 31, 164, 243, 81, 16, 235, 73, 153, 65, 57, 1, 126, 41, 247, 238, - 51, 162, 144, 121, 124, 200, 85, 188, 51, 17, 195, 161, 53, 46, 12, 226, - 63, 167, 190, 70, 23, 58, 22, 99, 182, 175, 177, 234, 236, 96, 76, 196, - 43, 29, 157, 142, 162, 121, 20, 215, 245, 132, 168, 111, 34, 110, 140, 26, - 26, 116, 75, 88, 240, 112, 55, 246, 22, 0, 245, 124, 20, 88, 255, 29, - 0, 53, 94, 135, 104, 52, 182, 190, 227, 220, 150, 215, 235, 69, 139, 112, - 78, 91, 100, 243, 66, 13, 174, 107, 103, 27, 43, 226, 75, 167, 224, 35, - 156, 52, 76, 96, 36, 128, 21, 128, 32, 249, 97, 236, 199, 245, 243, 171, - 106, 236, 213, 155, 181, 6, 215, 248, 188, 74, 239, 239, 158, 89, 244, 142, - 90, 179, 248, 228, 249, 195, 234, 227, 180, 0, 185, 96, 156, 231, 29, 92, - 194, 142, 189, 96, 226, 207, 24, 189, 199, 231, 179, 58, 115, 204, 160, 3, - 63, 170, 180, 164, 244, 253, 137, 55, 251, 64, 237, 147, 168, 83, 162, 70, - 56, 241, 174, 48, 121, 96, 163, 166, 230, 106, 26, 151, 74, 121, 122, 214, - 196, 98, 134, 76, 1, 21, 248, 60, 41, 141, 224, 6, 180, 181, 155, 46, - 102, 152, 46, 226, 163, 85, 49, 7, 190, 23, 18, 167, 173, 68, 76, 146, - 159, 1, 19, 93, 105, 109, 70, 62, 119, 136, 231, 17, 13, 23, 190, 12, - 9, 71, 97, 174, 98, 234, 11, 71, 232, 84, 60, 81, 152, 241, 44, 186, - 164, 143, 48, 16, 120, 22, 171, 70, 81, 166, 48, 34, 25, 153, 107, 235, - 69, 225, 71, 255, 74, 40, 51, 19, 134, 129, 201, 152, 168, 55, 4, 115, - 93, 196, 90, 19, 36, 143, 38, 199, 186, 0, 61, 142, 225, 66, 89, 160, - 176, 161, 100, 48, 95, 32, 68, 197, 192, 35, 65, 147, 122, 81, 179, 94, - 251, 129, 130, 232, 19, 14, 206, 199, 65, 140, 55, 168, 75, 179, 126, 137, - 156, 234, 202, 74, 50, 160, 190, 6, 96, 146, 212, 33, 190, 69, 164, 76, - 36, 200, 209, 119, 225, 244, 194, 66, 38, 83, 47, 12, 116, 148, 109, 226, - 17, 217, 214, 197, 68, 14, 65, 39, 225, 147, 154, 50, 140, 245, 53, 93, - 73, 229, 204, 3, 52, 130, 109, 191, 55, 158, 83, 26, 73, 10, 241, 172, - 71, 15, 50, 164, 250, 92, 132, 196, 77, 250, 82, 239, 108, 93, 168, 239, - 43, 7, 208, 76, 144, 242, 184, 136, 242, 41, 225, 27, 126, 0, 97, 127, - 9, 161, 96, 142, 229, 185, 115, 60, 159, 201, 91, 159, 93, 245, 14, 67, - 105, 216, 41, 2, 53, 65, 76, 60, 181, 105, 173, 165, 18, 239, 196, 71, - 56, 147, 156, 22, 255, 14, 81, 112, 49, 238, 32, 174, 237, 53, 162, 111, - 247, 51, 101, 223, 238, 186, 240, 187, 49, 183, 113, 13, 96, 134, 85, 91, - 34, 252, 118, 55, 151, 11, 153, 186, 18, 91, 117, 243, 55, 68, 89, 21, - 213, 183, 107, 138, 218, 41, 179, 178, 169, 30, 162, 144, 142, 189, 29, 156, - 141, 145, 227, 56, 86, 215, 53, 255, 198, 166, 183, 109, 123, 115, 195, 218, - 197, 237, 77, 37, 80, 155, 191, 82, 195, 180, 30, 159, 12, 93, 62, 151, - 57, 128, 73, 11, 50, 188, 20, 172, 180, 76, 115, 208, 94, 43, 107, 87, - 212, 108, 179, 117, 29, 39, 165, 52, 19, 20, 82, 233, 61, 125, 93, 37, - 27, 135, 227, 113, 144, 151, 119, 158, 63, 127, 252, 152, 41, 145, 184, 182, - 89, 19, 111, 65, 120, 105, 220, 80, 127, 50, 217, 9, 30, 168, 148, 119, - 194, 153, 74, 204, 1, 76, 138, 175, 140, 211, 158, 152, 143, 222, 31, 38, - 147, 112, 67, 221, 222, 150, 186, 85, 165, 212, 117, 209, 33, 215, 245, 214, - 121, 206, 28, 215, 231, 125, 252, 172, 205, 60, 61, 215, 76, 25, 232, 144, - 87, 38, 181, 60, 165, 179, 205, 216, 214, 209, 48, 37, 251, 182, 226, 50, - 57, 193, 235, 172, 18, 188, 235, 52, 133, 247, 244, 213, 192, 187, 137, 14, - 3, 27, 221, 173, 232, 200, 241, 71, 28, 218, 130, 101, 177, 52, 92, 229, - 193, 59, 84, 67, 119, 68, 223, 37, 29, 76, 37, 97, 166, 246, 166, 179, - 182, 174, 121, 216, 70, 128, 193, 93, 189, 13, 35, 248, 153, 205, 77, 154, - 211, 184, 111, 115, 214, 199, 86, 6, 181, 78, 108, 149, 254, 97, 22, 123, - 26, 254, 73, 107, 76, 162, 71, 105, 127, 145, 245, 230, 141, 18, 211, 203, - 246, 134, 51, 59, 76, 229, 207, 95, 115, 36, 107, 231, 88, 35, 166, 128, - 229, 231, 152, 81, 198, 0, 141, 249, 152, 140, 131, 17, 208, 93, 225, 129, - 36, 182, 56, 134, 128, 168, 79, 216, 41, 45, 162, 13, 62, 73, 151, 148, - 42, 86, 88, 22, 109, 213, 253, 75, 146, 7, 250, 101, 72, 32, 149, 219, - 140, 125, 238, 24, 121, 189, 98, 61, 238, 210, 249, 181, 102, 84, 123, 94, - 130, 245, 243, 78, 114, 236, 109, 177, 24, 207, 226, 101, 14, 133, 32, 22, - 38, 149, 20, 19, 150, 102, 5, 41, 86, 183, 128, 74, 203, 174, 173, 191, - 119, 58, 109, 69, 52, 111, 121, 129, 90, 173, 186, 206, 235, 198, 208, 130, - 106, 61, 117, 236, 167, 77, 135, 254, 180, 158, 234, 123, 170, 174, 31, 247, - 84, 116, 243, 90, 129, 15, 254, 218, 235, 39, 128, 162, 23, 222, 121, 180, - 199, 250, 224, 56, 122, 236, 88, 198, 20, 65, 163, 113, 162, 152, 166, 81, - 18, 31, 49, 166, 39, 71, 232, 222, 45, 200, 228, 225, 150, 177, 199, 188, - 255, 54, 29, 127, 199, 90, 138, 64, 131, 99, 112, 126, 176, 29, 117, 240, - 133, 20, 121, 178, 173, 85, 69, 17, 234, 141, 108, 226, 198, 99, 200, 148, - 102, 120, 164, 175, 35, 155, 137, 23, 132, 28, 22, 49, 196, 49, 147, 158, - 36, 247, 110, 134, 113, 14, 106, 103, 176, 67, 104, 233, 141, 105, 163, 81, - 174, 112, 242, 4, 102, 63, 208, 182, 160, 79, 233, 65, 215, 33, 208, 85, - 3, 248, 210, 117, 208, 65, 6, 92, 67, 233, 200, 0, 182, 152, 111, 131, - 181, 109, 58, 115, 113, 133, 35, 205, 29, 50, 44, 230, 134, 89, 38, 76, - 75, 246, 198, 180, 107, 179, 139, 76, 137, 54, 36, 125, 235, 196, 92, 31, - 182, 158, 190, 67, 106, 123, 161, 15, 20, 204, 61, 254, 217, 253, 166, 235, - 218, 54, 51, 109, 147, 18, 70, 76, 48, 106, 141, 80, 235, 6, 102, 114, - 102, 61, 41, 100, 86, 146, 4, 69, 127, 222, 190, 37, 93, 83, 54, 157, - 155, 102, 111, 152, 211, 163, 211, 13, 89, 141, 91, 99, 157, 207, 46, 120, - 39, 134, 196, 82, 21, 219, 211, 168, 38, 218, 135, 203, 173, 210, 151, 40, - 37, 130, 223, 152, 231, 243, 107, 71, 234, 110, 118, 71, 145, 94, 198, 218, - 27, 97, 55, 148, 112, 160, 44, 0, 229, 37, 119, 193, 255, 108, 44, 87, - 5, 250, 54, 127, 211, 181, 61, 250, 165, 84, 227, 134, 222, 120, 236, 147, - 4, 40, 58, 113, 169, 254, 241, 121, 20, 65, 154, 119, 179, 206, 229, 146, - 139, 4, 85, 76, 20, 7, 184, 166, 84, 59, 245, 194, 63, 143, 131, 185, - 246, 16, 67, 115, 172, 251, 113, 14, 175, 84, 169, 192, 190, 180, 89, 179, - 199, 218, 177, 87, 234, 234, 43, 151, 222, 29, 44, 198, 227, 238, 14, 207, - 86, 170, 159, 53, 65, 79, 11, 249, 76, 194, 188, 110, 202, 165, 167, 113, - 146, 81, 46, 160, 92, 26, 199, 134, 99, 207, 38, 132, 111, 106, 8, 123, - 244, 193, 22, 37, 163, 59, 10, 59, 155, 231, 42, 196, 171, 86, 103, 24, - 69, 139, 113, 31, 119, 111, 254, 100, 58, 191, 122, 96, 43, 179, 34, 227, - 198, 225, 255, 87, 129, 184, 73, 5, 98, 139, 202, 129, 161, 31, 233, 205, - 102, 222, 85, 236, 32, 194, 80, 60, 15, 122, 206, 57, 212, 20, 105, 105, - 188, 128, 146, 162, 210, 107, 116, 250, 126, 114, 210, 19, 59, 114, 140, 79, - 124, 192, 153, 122, 176, 63, 165, 164, 86, 159, 70, 174, 47, 137, 104, 153, - 138, 198, 227, 176, 5, 144, 186, 90, 162, 249, 97, 84, 187, 241, 30, 76, - 233, 73, 119, 165, 77, 109, 61, 101, 146, 38, 210, 143, 252, 219, 29, 16, - 94, 213, 163, 24, 171, 59, 124, 141, 216, 133, 9, 188, 122, 236, 45, 206, - 125, 245, 56, 165, 69, 20, 230, 14, 14, 49, 190, 38, 219, 38, 57, 140, - 165, 225, 44, 232, 59, 179, 8, 161, 121, 73, 74, 129, 69, 237, 71, 156, - 133, 81, 167, 156, 249, 2, 138, 246, 102, 147, 4, 63, 70, 163, 52, 194, - 162, 203, 65, 48, 103, 240, 61, 74, 140, 208, 237, 197, 121, 16, 79, 156, - 62, 241, 174, 46, 225, 113, 54, 70, 59, 122, 115, 86, 104, 119, 70, 222, - 120, 48, 7, 223, 136, 63, 248, 243, 222, 232, 252, 194, 25, 179, 203, 174, - 25, 14, 197, 6, 206, 36, 138, 61, 130, 58, 166, 29, 198, 224, 202, 153, - 70, 99, 111, 22, 81, 43, 149, 33, 12, 0, 76, 217, 98, 182, 59, 138, - 166, 62, 53, 94, 2, 240, 17, 214, 217, 176, 150, 126, 89, 157, 190, 59, - 196, 210, 152, 54, 63, 51, 170, 73, 31, 178, 99, 45, 166, 185, 212, 30, - 154, 75, 93, 62, 178, 117, 98, 127, 26, 120, 41, 20, 161, 134, 164, 184, - 34, 14, 156, 142, 207, 184, 103, 241, 199, 230, 108, 120, 238, 240, 109, 219, - 0, 62, 232, 134, 231, 105, 97, 147, 134, 18, 16, 25, 194, 146, 23, 7, - 55, 201, 241, 20, 71, 143, 84, 191, 55, 33, 164, 126, 164, 39, 36, 160, - 146, 249, 5, 240, 121, 225, 205, 166, 112, 132, 201, 38, 35, 1, 125, 103, - 19, 97, 250, 247, 163, 159, 214, 152, 16, 106, 82, 93, 74, 186, 32, 20, - 56, 138, 66, 80, 45, 121, 65, 20, 95, 253, 12, 151, 113, 222, 216, 25, - 226, 98, 35, 158, 208, 4, 31, 57, 231, 1, 110, 110, 102, 148, 202, 182, - 212, 4, 133, 88, 184, 163, 221, 203, 58, 67, 20, 33, 238, 213, 13, 209, - 5, 252, 195, 163, 205, 65, 235, 105, 84, 104, 145, 34, 244, 2, 85, 1, - 174, 53, 210, 54, 234, 41, 148, 52, 49, 153, 83, 243, 120, 234, 192, 239, - 7, 173, 16, 222, 172, 207, 182, 213, 254, 152, 54, 171, 115, 122, 36, 192, - 19, 47, 254, 224, 144, 60, 30, 79, 60, 39, 245, 126, 234, 228, 252, 245, - 56, 113, 224, 207, 166, 65, 24, 127, 8, 28, 152, 129, 209, 222, 107, 1, - 52, 82, 113, 162, 189, 41, 254, 113, 192, 51, 71, 254, 156, 72, 126, 118, - 190, 24, 99, 43, 33, 216, 196, 185, 104, 247, 99, 16, 7, 36, 94, 56, - 23, 126, 6, 181, 198, 132, 79, 90, 110, 50, 1, 175, 223, 111, 245, 157, - 172, 109, 14, 172, 206, 63, 122, 234, 25, 220, 143, 126, 120, 26, 98, 83, - 250, 33, 214, 111, 51, 154, 60, 31, 232, 133, 166, 199, 216, 159, 115, 102, - 25, 124, 66, 36, 61, 35, 10, 60, 81, 29, 63, 93, 206, 241, 35, 182, - 94, 212, 194, 96, 70, 149, 166, 109, 52, 24, 81, 210, 70, 35, 205, 36, - 235, 132, 75, 25, 180, 157, 114, 174, 105, 208, 35, 62, 169, 12, 241, 55, - 152, 222, 155, 6, 247, 159, 105, 110, 191, 213, 204, 126, 171, 133, 189, 54, - 173, 215, 134, 245, 247, 50, 168, 15, 68, 204, 218, 160, 252, 175, 31, 8, - 115, 253, 113, 112, 206, 134, 35, 14, 199, 41, 99, 134, 30, 141, 227, 118, - 203, 84, 36, 72, 25, 186, 19, 210, 243, 186, 32, 182, 11, 143, 160, 166, - 44, 38, 103, 154, 16, 34, 146, 229, 224, 74, 36, 174, 202, 138, 237, 74, - 131, 112, 225, 91, 230, 194, 175, 181, 31, 163, 30, 28, 225, 36, 170, 72, - 180, 39, 233, 114, 83, 207, 19, 56, 42, 33, 180, 75, 74, 32, 208, 99, - 78, 205, 73, 134, 63, 171, 231, 153, 228, 208, 43, 148, 122, 231, 245, 105, - 236, 132, 254, 101, 170, 185, 149, 237, 48, 250, 122, 125, 55, 143, 248, 68, - 179, 212, 110, 27, 39, 155, 43, 107, 222, 231, 38, 180, 109, 236, 25, 206, - 135, 201, 169, 230, 11, 254, 15, 155, 4, 17, 152, 204, 124, 157, 244, 120, - 9, 152, 162, 180, 207, 214, 166, 32, 137, 142, 68, 170, 207, 85, 169, 0, - 148, 91, 106, 85, 168, 204, 196, 119, 63, 88, 180, 248, 81, 38, 22, 106, - 226, 145, 239, 211, 94, 87, 239, 206, 234, 117, 86, 163, 17, 161, 136, 111, - 19, 23, 65, 157, 100, 163, 102, 205, 165, 77, 181, 63, 193, 61, 31, 73, - 237, 90, 106, 90, 4, 16, 138, 184, 49, 12, 93, 41, 110, 200, 38, 39, - 185, 53, 204, 65, 76, 37, 174, 102, 109, 143, 164, 45, 236, 145, 82, 181, - 141, 219, 195, 73, 91, 150, 182, 38, 15, 77, 193, 187, 213, 137, 28, 220, - 241, 109, 59, 145, 147, 251, 95, 197, 174, 114, 251, 180, 76, 5, 183, 62, - 130, 67, 177, 247, 184, 145, 211, 123, 14, 92, 26, 194, 27, 202, 111, 11, - 220, 250, 226, 52, 0, 129, 82, 245, 45, 230, 135, 64, 98, 215, 166, 74, - 35, 97, 95, 12, 201, 131, 94, 170, 234, 97, 42, 146, 160, 20, 183, 237, - 78, 10, 11, 166, 170, 131, 168, 75, 79, 101, 230, 99, 39, 202, 242, 29, - 56, 86, 77, 159, 127, 19, 252, 103, 162, 181, 176, 237, 34, 92, 21, 79, - 47, 7, 159, 255, 248, 146, 125, 193, 16, 71, 132, 58, 197, 124, 110, 156, - 33, 245, 163, 30, 27, 211, 242, 146, 33, 108, 137, 154, 9, 174, 34, 119, - 109, 115, 77, 33, 22, 112, 113, 71, 85, 25, 190, 137, 247, 180, 61, 169, - 142, 75, 139, 72, 1, 172, 182, 144, 104, 56, 0, 254, 243, 49, 15, 66, - 200, 142, 107, 24, 13, 208, 39, 9, 57, 14, 50, 148, 9, 128, 125, 29, - 117, 23, 157, 186, 27, 146, 21, 151, 171, 66, 8, 226, 49, 90, 168, 80, - 170, 114, 1, 155, 34, 188, 124, 28, 116, 66, 218, 240, 28, 162, 122, 98, - 131, 36, 128, 46, 122, 114, 147, 43, 42, 32, 184, 255, 102, 92, 163, 121, - 226, 227, 136, 181, 54, 176, 100, 144, 12, 204, 70, 159, 184, 229, 23, 99, - 100, 202, 4, 157, 42, 214, 237, 24, 249, 52, 110, 0, 65, 117, 63, 192, - 33, 77, 197, 28, 212, 183, 52, 213, 39, 231, 180, 128, 221, 177, 103, 99, - 28, 91, 3, 170, 232, 21, 137, 250, 16, 238, 127, 21, 45, 5, 83, 31, - 157, 142, 181, 186, 138, 212, 166, 236, 162, 215, 21, 14, 180, 65, 101, 126, - 77, 164, 202, 181, 241, 42, 239, 135, 89, 197, 64, 96, 253, 3, 53, 42, - 128, 122, 94, 40, 135, 68, 74, 171, 134, 164, 37, 184, 100, 24, 208, 39, - 18, 108, 251, 177, 158, 44, 166, 174, 206, 70, 229, 20, 86, 61, 34, 22, - 141, 174, 191, 124, 245, 134, 175, 155, 112, 24, 129, 73, 182, 41, 255, 7, - 232, 249, 168, 2, 172, 243, 163, 52, 33, 206, 103, 9, 103, 250, 142, 202, - 79, 56, 86, 170, 63, 135, 238, 185, 99, 65, 4, 148, 104, 213, 219, 209, - 49, 95, 144, 24, 70, 196, 75, 112, 245, 163, 28, 89, 136, 154, 72, 108, - 93, 96, 112, 149, 211, 137, 245, 230, 153, 160, 102, 250, 64, 59, 153, 109, - 172, 115, 3, 241, 207, 74, 190, 49, 88, 34, 158, 161, 207, 177, 169, 23, - 124, 22, 99, 204, 84, 49, 165, 133, 39, 12, 165, 88, 163, 198, 194, 188, - 42, 75, 249, 33, 182, 225, 194, 2, 121, 53, 237, 226, 61, 119, 145, 41, - 74, 33, 124, 212, 102, 245, 168, 47, 49, 92, 248, 147, 240, 43, 39, 174, - 72, 153, 210, 40, 74, 202, 158, 121, 32, 75, 229, 54, 28, 4, 202, 49, - 247, 105, 161, 72, 139, 186, 108, 111, 13, 140, 72, 130, 116, 255, 161, 106, - 219, 51, 78, 179, 190, 34, 145, 244, 200, 250, 14, 92, 47, 86, 12, 136, - 100, 1, 13, 71, 118, 164, 25, 72, 146, 148, 135, 37, 169, 121, 0, 153, - 237, 160, 1, 37, 147, 158, 5, 245, 13, 55, 232, 231, 60, 36, 217, 25, - 26, 32, 36, 33, 91, 246, 57, 167, 229, 139, 154, 59, 66, 3, 128, 153, - 156, 5, 243, 194, 248, 146, 7, 150, 236, 247, 12, 72, 73, 90, 22, 204, - 119, 58, 57, 15, 67, 111, 200, 12, 16, 58, 41, 11, 225, 141, 74, 205, - 3, 48, 246, 69, 6, 12, 35, 53, 11, 166, 245, 194, 122, 171, 191, 228, - 65, 25, 219, 23, 3, 148, 145, 154, 5, 245, 46, 253, 176, 62, 66, 201, - 254, 38, 51, 76, 73, 106, 126, 172, 250, 137, 153, 146, 9, 202, 206, 157, - 65, 51, 223, 213, 243, 136, 132, 97, 252, 172, 228, 135, 103, 213, 138, 139, - 176, 176, 146, 178, 118, 53, 173, 214, 102, 137, 113, 119, 85, 52, 36, 115, - 45, 196, 43, 151, 88, 150, 173, 132, 109, 245, 153, 125, 97, 153, 123, 63, - 22, 187, 229, 35, 68, 239, 13, 91, 193, 82, 170, 199, 172, 118, 12, 19, - 165, 207, 156, 88, 41, 27, 123, 11, 73, 74, 183, 22, 214, 137, 178, 163, - 168, 155, 173, 180, 207, 106, 186, 76, 40, 86, 48, 227, 66, 108, 85, 157, - 101, 201, 22, 111, 2, 182, 134, 100, 91, 135, 118, 73, 93, 139, 61, 64, - 252, 155, 45, 217, 8, 29, 180, 91, 8, 96, 215, 82, 94, 150, 78, 67, - 92, 201, 165, 102, 233, 218, 239, 149, 128, 48, 173, 26, 208, 147, 157, 29, - 179, 43, 26, 98, 201, 130, 119, 202, 1, 188, 81, 60, 160, 44, 178, 69, - 226, 91, 244, 15, 53, 29, 67, 132, 118, 240, 86, 219, 234, 205, 162, 105, - 249, 97, 213, 173, 28, 65, 43, 30, 94, 234, 143, 10, 196, 14, 160, 231, - 88, 150, 4, 90, 92, 251, 101, 202, 236, 80, 203, 164, 229, 37, 199, 165, - 253, 108, 191, 82, 129, 55, 216, 194, 238, 46, 61, 31, 1, 220, 9, 61, - 236, 30, 156, 61, 104, 119, 75, 135, 37, 235, 107, 113, 192, 85, 174, 88, - 135, 201, 199, 199, 103, 109, 250, 104, 149, 112, 208, 172, 211, 158, 112, 90, - 49, 147, 246, 84, 229, 251, 186, 92, 56, 247, 135, 240, 147, 79, 77, 217, - 181, 92, 106, 156, 159, 109, 84, 23, 248, 162, 246, 80, 54, 184, 48, 119, - 225, 159, 127, 146, 248, 224, 119, 27, 205, 189, 50, 34, 108, 144, 92, 92, - 46, 237, 66, 33, 0, 38, 64, 37, 100, 119, 74, 244, 63, 65, 19, 119, - 246, 244, 199, 62, 130, 1, 64, 227, 12, 155, 69, 255, 50, 181, 173, 50, - 40, 85, 39, 23, 212, 67, 17, 187, 70, 40, 204, 207, 215, 8, 109, 104, - 235, 40, 38, 69, 220, 69, 24, 5, 86, 25, 234, 145, 185, 167, 73, 222, - 221, 181, 151, 101, 100, 218, 125, 178, 83, 196, 62, 187, 242, 72, 118, 171, - 56, 170, 168, 224, 6, 151, 126, 121, 34, 164, 51, 154, 182, 173, 236, 158, - 123, 89, 202, 86, 3, 50, 186, 66, 86, 182, 189, 111, 47, 25, 103, 240, - 44, 92, 74, 252, 133, 150, 48, 132, 171, 212, 25, 26, 231, 148, 107, 128, - 52, 183, 173, 116, 82, 108, 149, 59, 182, 118, 65, 197, 73, 170, 148, 111, - 56, 76, 74, 21, 154, 136, 233, 39, 229, 211, 235, 65, 199, 133, 103, 50, - 247, 76, 151, 77, 74, 73, 45, 13, 26, 70, 167, 68, 69, 217, 243, 183, - 116, 138, 0, 206, 217, 153, 155, 180, 94, 66, 43, 81, 127, 180, 255, 98, - 79, 226, 43, 37, 87, 215, 243, 89, 205, 178, 147, 142, 217, 206, 53, 130, - 136, 225, 104, 205, 86, 142, 246, 108, 220, 0, 208, 130, 62, 135, 212, 141, - 251, 51, 172, 153, 225, 7, 190, 200, 51, 114, 136, 50, 87, 182, 206, 174, - 132, 189, 239, 78, 104, 64, 218, 46, 85, 108, 23, 198, 53, 203, 232, 168, - 97, 135, 203, 243, 248, 88, 48, 37, 206, 242, 247, 129, 176, 238, 96, 26, - 183, 75, 127, 252, 97, 164, 63, 230, 116, 218, 97, 209, 254, 153, 112, 69, - 132, 9, 51, 62, 229, 33, 15, 158, 38, 196, 79, 219, 29, 106, 122, 2, - 136, 26, 21, 165, 149, 50, 12, 68, 62, 35, 83, 115, 207, 204, 165, 17, - 166, 214, 135, 122, 41, 79, 121, 110, 98, 54, 98, 166, 46, 255, 165, 32, - 54, 225, 245, 98, 84, 37, 160, 255, 74, 253, 226, 153, 57, 109, 177, 168, - 76, 29, 81, 232, 149, 43, 189, 123, 54, 178, 195, 107, 94, 166, 244, 182, - 118, 218, 27, 75, 235, 59, 43, 123, 60, 152, 79, 173, 1, 203, 206, 118, - 241, 123, 218, 86, 116, 127, 252, 233, 251, 151, 175, 237, 67, 245, 246, 230, - 217, 187, 119, 63, 191, 176, 255, 66, 89, 106, 10, 180, 85, 245, 45, 18, - 15, 22, 115, 171, 250, 147, 5, 137, 91, 29, 162, 41, 163, 173, 211, 83, - 220, 54, 111, 232, 161, 141, 47, 71, 216, 104, 227, 228, 163, 83, 239, 251, - 31, 235, 33, 9, 181, 124, 91, 198, 246, 216, 240, 110, 70, 164, 154, 94, - 216, 27, 55, 233, 197, 178, 85, 58, 125, 136, 19, 235, 104, 104, 99, 78, - 19, 99, 175, 212, 228, 189, 140, 104, 90, 126, 72, 9, 71, 134, 14, 22, - 156, 170, 71, 179, 67, 113, 82, 228, 207, 142, 64, 192, 196, 7, 228, 156, - 201, 172, 79, 95, 145, 131, 72, 230, 80, 98, 220, 68, 250, 40, 73, 237, - 164, 34, 32, 124, 230, 39, 150, 49, 7, 115, 180, 168, 157, 176, 118, 51, - 204, 145, 149, 70, 196, 99, 201, 70, 14, 149, 157, 76, 91, 71, 212, 217, - 70, 42, 117, 219, 90, 175, 175, 198, 214, 235, 179, 5, 135, 147, 152, 206, - 124, 28, 111, 136, 129, 170, 147, 188, 42, 11, 168, 189, 253, 134, 211, 106, - 52, 242, 60, 154, 169, 69, 115, 31, 109, 56, 75, 92, 90, 249, 237, 236, - 138, 13, 157, 78, 183, 248, 6, 83, 141, 190, 190, 46, 109, 103, 110, 160, - 85, 201, 238, 42, 185, 77, 69, 61, 236, 219, 38, 41, 41, 215, 177, 55, - 148, 207, 102, 74, 161, 176, 7, 83, 230, 167, 39, 165, 92, 103, 236, 210, - 153, 83, 178, 132, 203, 84, 196, 121, 105, 82, 39, 182, 88, 91, 106, 226, - 43, 100, 134, 63, 12, 6, 185, 86, 94, 219, 184, 164, 76, 23, 142, 17, - 67, 214, 59, 239, 183, 85, 196, 191, 187, 213, 188, 142, 159, 155, 107, 70, - 153, 76, 205, 236, 132, 213, 159, 7, 19, 191, 93, 80, 60, 85, 155, 139, - 202, 241, 116, 182, 134, 10, 187, 209, 204, 81, 192, 212, 82, 11, 129, 115, - 64, 212, 18, 153, 62, 183, 177, 251, 47, 244, 207, 91, 125, 107, 130, 191, - 125, 250, 103, 64, 127, 225, 140, 61, 230, 127, 224, 177, 174, 81, 123, 162, - 60, 67, 194, 9, 160, 52, 166, 248, 135, 197, 68, 42, 111, 203, 174, 114, - 31, 246, 71, 181, 200, 41, 136, 59, 166, 60, 191, 23, 179, 162, 47, 201, - 156, 150, 86, 60, 160, 182, 20, 51, 56, 117, 30, 195, 169, 157, 184, 114, - 32, 113, 79, 231, 19, 19, 64, 71, 27, 254, 157, 92, 56, 163, 179, 149, - 12, 201, 245, 89, 80, 189, 137, 206, 245, 10, 139, 32, 45, 153, 17, 155, - 26, 147, 187, 222, 63, 157, 217, 55, 203, 72, 182, 85, 102, 238, 18, 192, - 119, 147, 146, 151, 40, 7, 208, 178, 178, 227, 20, 64, 37, 39, 140, 99, - 229, 177, 246, 157, 125, 103, 121, 81, 61, 88, 33, 246, 200, 1, 17, 123, - 206, 101, 198, 108, 214, 236, 91, 123, 123, 13, 7, 127, 105, 250, 175, 249, - 206, 104, 174, 119, 154, 203, 52, 91, 180, 168, 181, 164, 140, 248, 34, 69, - 42, 177, 15, 176, 16, 78, 165, 142, 110, 241, 176, 161, 236, 103, 29, 118, - 180, 145, 132, 99, 184, 22, 185, 76, 141, 219, 176, 43, 31, 15, 26, 202, - 113, 151, 73, 173, 133, 148, 56, 147, 161, 229, 150, 138, 22, 156, 163, 84, - 223, 168, 193, 251, 86, 79, 124, 91, 21, 230, 145, 242, 130, 103, 59, 205, - 71, 248, 115, 240, 40, 113, 97, 149, 43, 182, 213, 199, 212, 26, 11, 164, - 230, 253, 159, 27, 145, 53, 28, 103, 122, 67, 152, 54, 34, 87, 97, 86, - 226, 196, 6, 71, 73, 34, 133, 103, 169, 63, 55, 161, 100, 126, 243, 180, - 218, 41, 195, 251, 46, 61, 85, 142, 169, 161, 95, 187, 181, 199, 251, 135, - 110, 69, 77, 246, 53, 60, 110, 74, 50, 235, 94, 94, 180, 219, 23, 15, - 149, 11, 221, 81, 187, 61, 122, 216, 88, 41, 186, 224, 149, 55, 17, 240, - 117, 137, 149, 181, 97, 185, 202, 52, 61, 113, 183, 140, 155, 178, 241, 163, - 162, 186, 20, 36, 222, 104, 158, 0, 216, 199, 137, 94, 167, 108, 82, 205, - 189, 83, 219, 197, 61, 223, 2, 130, 72, 91, 6, 71, 191, 217, 86, 246, - 12, 174, 201, 202, 107, 29, 251, 100, 201, 38, 239, 117, 19, 204, 153, 109, - 88, 240, 112, 69, 124, 232, 160, 216, 121, 170, 250, 196, 9, 170, 121, 234, - 171, 58, 21, 220, 84, 85, 89, 121, 198, 133, 227, 66, 118, 15, 167, 89, - 75, 101, 99, 109, 134, 212, 169, 103, 154, 33, 89, 230, 179, 216, 230, 25, - 164, 41, 190, 65, 204, 98, 237, 89, 146, 188, 180, 252, 178, 73, 86, 181, - 249, 144, 100, 195, 57, 37, 9, 47, 124, 122, 162, 238, 117, 179, 2, 177, - 92, 223, 90, 249, 214, 168, 83, 154, 52, 101, 165, 133, 164, 155, 115, 162, - 39, 117, 84, 154, 156, 188, 27, 55, 81, 140, 92, 117, 255, 69, 162, 234, - 96, 17, 178, 41, 43, 237, 248, 151, 22, 189, 159, 218, 15, 115, 125, 79, - 100, 215, 37, 12, 189, 162, 159, 72, 126, 61, 180, 6, 30, 81, 134, 163, - 20, 117, 177, 182, 174, 42, 71, 214, 138, 196, 218, 252, 77, 221, 53, 66, - 242, 231, 202, 200, 199, 193, 6, 21, 206, 19, 235, 157, 92, 78, 1, 31, - 214, 89, 130, 129, 192, 52, 4, 208, 118, 22, 44, 85, 192, 200, 130, 38, - 158, 18, 49, 146, 3, 37, 69, 245, 50, 5, 32, 4, 171, 220, 107, 210, - 239, 39, 18, 115, 45, 91, 151, 87, 163, 164, 61, 113, 36, 204, 221, 156, - 127, 124, 63, 197, 106, 211, 90, 143, 246, 179, 53, 165, 151, 194, 237, 119, - 15, 246, 86, 166, 186, 244, 82, 113, 127, 78, 215, 58, 211, 114, 63, 102, - 168, 157, 218, 250, 16, 46, 233, 188, 26, 250, 141, 122, 204, 89, 62, 139, - 108, 0, 120, 43, 37, 229, 45, 44, 250, 182, 154, 201, 107, 117, 163, 156, - 186, 64, 96, 91, 163, 165, 12, 194, 106, 195, 148, 16, 77, 124, 47, 237, - 254, 221, 20, 188, 239, 137, 51, 109, 153, 167, 53, 217, 55, 161, 17, 124, - 251, 115, 181, 191, 179, 192, 238, 142, 206, 204, 72, 36, 7, 193, 121, 53, - 239, 228, 38, 251, 58, 77, 111, 117, 176, 121, 200, 55, 183, 69, 11, 82, - 30, 56, 245, 166, 125, 38, 70, 133, 50, 217, 106, 184, 20, 51, 207, 168, - 75, 167, 77, 96, 173, 107, 101, 85, 244, 255, 242, 100, 250, 127, 157, 158, - 255, 87, 83, 23, 92, 116, 249, 151, 240, 47, 67, 98, 19, 34, 89, 208, - 15, 98, 203, 105, 65, 74, 159, 186, 210, 115, 94, 164, 74, 109, 101, 68, - 17, 200, 16, 228, 116, 236, 10, 20, 219, 94, 42, 255, 65, 238, 112, 146, - 123, 153, 205, 215, 54, 95, 218, 168, 96, 187, 202, 208, 102, 131, 130, 109, - 185, 55, 218, 20, 96, 21, 69, 10, 214, 80, 109, 75, 144, 213, 49, 83, - 194, 80, 98, 64, 64, 24, 76, 213, 166, 179, 215, 167, 89, 99, 0, 62, - 38, 204, 235, 164, 189, 87, 154, 175, 137, 10, 77, 20, 102, 61, 73, 107, - 111, 64, 159, 115, 188, 40, 10, 207, 244, 252, 246, 71, 171, 102, 156, 50, - 234, 58, 245, 57, 162, 189, 166, 45, 175, 77, 22, 30, 176, 97, 66, 114, - 50, 112, 88, 200, 187, 128, 252, 185, 216, 161, 205, 194, 202, 250, 1, 191, - 163, 149, 245, 2, 191, 253, 149, 245, 14, 191, 241, 202, 122, 249, 174, 219, - 66, 26, 28, 12, 5, 208, 6, 93, 89, 134, 235, 164, 44, 48, 137, 63, - 162, 74, 176, 15, 126, 113, 245, 196, 46, 248, 241, 198, 193, 96, 29, 122, - 137, 67, 111, 26, 143, 162, 57, 165, 237, 53, 84, 244, 58, 14, 241, 209, - 121, 226, 62, 109, 174, 172, 223, 41, 43, 61, 185, 150, 68, 3, 25, 169, - 100, 92, 215, 232, 47, 131, 128, 195, 131, 98, 163, 153, 113, 231, 36, 147, - 200, 220, 23, 174, 10, 187, 221, 100, 215, 43, 181, 224, 26, 136, 192, 233, - 13, 24, 94, 119, 104, 59, 88, 191, 64, 36, 120, 68, 180, 145, 157, 96, - 113, 246, 200, 193, 95, 229, 99, 189, 137, 74, 65, 63, 70, 236, 23, 163, - 235, 75, 217, 224, 204, 168, 2, 236, 106, 87, 236, 214, 93, 58, 64, 95, - 168, 190, 62, 220, 114, 74, 103, 51, 153, 36, 248, 49, 183, 236, 184, 61, - 250, 234, 171, 209, 113, 115, 255, 64, 130, 156, 112, 100, 194, 166, 70, 195, - 113, 251, 226, 171, 175, 46, 146, 175, 151, 234, 107, 182, 112, 231, 160, 169, - 194, 170, 88, 7, 236, 118, 43, 83, 56, 249, 122, 169, 190, 170, 194, 163, - 227, 189, 39, 104, 59, 119, 116, 239, 73, 10, 83, 146, 17, 71, 24, 126, - 232, 245, 174, 206, 196, 175, 108, 50, 203, 23, 157, 189, 39, 13, 137, 191, - 51, 194, 35, 208, 200, 155, 248, 39, 180, 137, 127, 210, 112, 84, 101, 178, - 209, 119, 37, 228, 51, 63, 239, 57, 123, 60, 140, 217, 49, 204, 13, 97, - 114, 242, 176, 164, 117, 231, 178, 123, 161, 49, 183, 118, 234, 192, 139, 184, - 228, 78, 70, 93, 125, 146, 14, 49, 246, 52, 56, 32, 80, 157, 3, 172, - 133, 139, 225, 66, 41, 126, 50, 229, 132, 30, 246, 15, 174, 45, 71, 127, - 186, 198, 212, 147, 59, 219, 118, 187, 185, 82, 180, 62, 90, 201, 89, 57, - 71, 55, 178, 46, 19, 123, 153, 9, 66, 172, 12, 125, 235, 25, 32, 40, - 163, 162, 190, 79, 155, 174, 30, 123, 157, 191, 54, 162, 65, 209, 61, 126, - 250, 244, 105, 106, 94, 244, 34, 41, 39, 218, 16, 202, 49, 187, 24, 24, - 9, 195, 210, 46, 209, 139, 174, 138, 91, 128, 99, 11, 230, 181, 235, 94, - 232, 93, 229, 79, 94, 57, 159, 95, 59, 158, 207, 100, 179, 149, 250, 240, - 110, 122, 41, 245, 215, 55, 47, 158, 189, 255, 214, 182, 173, 151, 175, 191, - 251, 233, 237, 171, 103, 239, 95, 254, 244, 154, 239, 186, 227, 180, 135, 253, - 246, 82, 46, 8, 213, 153, 165, 222, 236, 164, 25, 178, 81, 123, 44, 171, - 99, 253, 45, 233, 3, 173, 76, 51, 223, 35, 226, 79, 179, 91, 213, 142, - 245, 22, 177, 13, 161, 135, 166, 147, 161, 66, 33, 28, 58, 26, 12, 220, - 246, 210, 166, 134, 123, 250, 254, 155, 54, 156, 124, 112, 142, 52, 185, 230, - 30, 46, 2, 235, 1, 244, 209, 130, 206, 87, 195, 249, 17, 254, 90, 155, - 58, 35, 187, 193, 243, 78, 169, 98, 171, 139, 126, 128, 71, 8, 35, 190, - 108, 182, 248, 85, 230, 146, 190, 124, 70, 140, 99, 164, 34, 80, 28, 253, - 54, 111, 104, 203, 105, 152, 129, 221, 4, 108, 113, 82, 47, 239, 187, 205, - 149, 192, 199, 197, 76, 164, 6, 138, 69, 40, 53, 28, 42, 124, 65, 87, - 22, 42, 122, 99, 155, 71, 206, 145, 34, 246, 64, 33, 246, 5, 22, 17, - 19, 189, 236, 35, 102, 110, 98, 215, 11, 175, 160, 70, 166, 176, 41, 116, - 47, 6, 250, 50, 230, 42, 164, 194, 161, 220, 241, 42, 165, 6, 90, 70, - 79, 11, 167, 119, 199, 43, 7, 133, 164, 54, 117, 29, 107, 112, 217, 133, - 131, 214, 174, 31, 26, 176, 14, 209, 58, 159, 112, 135, 159, 229, 169, 253, - 12, 74, 132, 136, 40, 164, 168, 92, 20, 77, 69, 175, 149, 234, 76, 212, - 8, 131, 212, 95, 86, 96, 40, 179, 62, 56, 37, 216, 167, 217, 10, 224, - 132, 10, 150, 104, 180, 69, 143, 194, 225, 24, 151, 93, 180, 161, 159, 209, - 140, 101, 215, 58, 139, 41, 44, 68, 148, 250, 161, 170, 213, 129, 2, 42, - 107, 215, 129, 4, 217, 111, 90, 144, 154, 155, 78, 217, 154, 155, 90, 112, - 168, 106, 179, 87, 153, 10, 17, 117, 171, 109, 65, 123, 154, 58, 244, 55, - 214, 209, 211, 129, 35, 18, 24, 111, 224, 230, 199, 118, 214, 239, 182, 181, - 151, 44, 173, 99, 183, 186, 6, 89, 84, 247, 79, 3, 156, 201, 205, 112, - 0, 195, 29, 208, 72, 185, 64, 108, 202, 68, 71, 159, 186, 9, 85, 92, - 7, 225, 54, 41, 139, 239, 17, 215, 98, 80, 236, 115, 231, 194, 167, 175, - 33, 181, 144, 253, 105, 2, 141, 153, 58, 169, 240, 116, 70, 147, 177, 191, - 198, 147, 20, 37, 49, 111, 186, 18, 93, 74, 49, 20, 212, 173, 208, 65, - 45, 54, 140, 202, 55, 8, 179, 49, 243, 135, 208, 170, 116, 228, 187, 165, - 28, 56, 105, 100, 205, 125, 111, 194, 222, 127, 4, 11, 33, 95, 103, 94, - 129, 32, 63, 107, 170, 236, 93, 59, 85, 46, 140, 169, 146, 78, 17, 125, - 29, 99, 4, 195, 144, 58, 104, 157, 200, 154, 120, 230, 154, 192, 17, 90, - 169, 194, 250, 123, 159, 227, 250, 212, 191, 247, 64, 121, 216, 190, 205, 234, - 207, 104, 120, 62, 61, 27, 7, 94, 108, 59, 118, 253, 173, 63, 245, 130, - 153, 125, 55, 8, 11, 18, 56, 61, 148, 214, 170, 131, 119, 45, 63, 143, - 62, 125, 227, 141, 61, 118, 244, 107, 215, 69, 243, 239, 110, 48, 104, 31, - 6, 171, 90, 96, 241, 211, 55, 227, 197, 236, 190, 125, 121, 225, 195, 102, - 236, 195, 216, 191, 47, 128, 111, 39, 231, 81, 204, 168, 228, 136, 14, 159, - 88, 3, 242, 147, 196, 116, 184, 19, 160, 31, 222, 253, 248, 233, 89, 255, - 215, 69, 60, 135, 218, 234, 125, 241, 242, 195, 187, 191, 125, 18, 167, 48, - 247, 133, 240, 95, 111, 190, 253, 254, 211, 59, 182, 114, 187, 47, 78, 94, - 107, 123, 183, 79, 223, 240, 142, 13, 17, 170, 239, 219, 156, 119, 52, 247, - 253, 232, 19, 219, 55, 0, 134, 188, 199, 180, 27, 12, 122, 159, 90, 47, - 238, 6, 236, 175, 97, 63, 250, 244, 44, 244, 136, 33, 79, 71, 159, 13, - 237, 157, 152, 241, 125, 58, 249, 94, 89, 251, 157, 1, 228, 11, 81, 148, - 190, 39, 168, 247, 196, 31, 226, 251, 195, 121, 239, 79, 166, 184, 160, 88, - 204, 252, 207, 157, 97, 127, 13, 127, 91, 120, 196, 43, 104, 20, 79, 12, - 154, 56, 187, 47, 81, 252, 28, 204, 252, 137, 55, 149, 226, 90, 1, 246, - 110, 72, 226, 6, 16, 186, 253, 104, 226, 195, 247, 96, 245, 149, 223, 15, - 188, 240, 110, 77, 162, 37, 239, 211, 123, 165, 148, 30, 215, 127, 240, 251, - 189, 197, 252, 83, 249, 219, 75, 194, 91, 192, 10, 227, 227, 10, 224, 105, - 245, 221, 155, 33, 190, 244, 130, 240, 211, 119, 254, 108, 184, 136, 227, 40, - 36, 92, 135, 180, 232, 179, 217, 237, 39, 53, 172, 119, 26, 206, 28, 184, - 111, 189, 248, 234, 211, 187, 15, 148, 246, 214, 159, 71, 180, 226, 124, 14, - 176, 87, 17, 13, 194, 39, 22, 115, 189, 241, 93, 176, 150, 131, 243, 131, - 50, 90, 70, 7, 167, 126, 252, 89, 248, 122, 23, 224, 192, 236, 211, 143, - 176, 140, 253, 68, 200, 35, 220, 197, 243, 207, 233, 228, 123, 101, 184, 58, - 255, 164, 155, 121, 183, 246, 253, 87, 228, 17, 178, 189, 15, 126, 178, 188, - 213, 255, 58, 166, 86, 193, 200, 120, 151, 254, 147, 182, 65, 126, 83, 106, - 233, 55, 67, 252, 234, 97, 179, 213, 58, 82, 63, 245, 183, 208, 239, 191, - 83, 147, 94, 123, 195, 97, 116, 30, 205, 105, 141, 137, 122, 31, 130, 120, - 114, 183, 197, 247, 157, 55, 249, 181, 46, 38, 3, 106, 125, 122, 15, 163, - 20, 18, 5, 66, 24, 60, 127, 34, 46, 72, 228, 58, 251, 244, 124, 4, - 76, 190, 197, 113, 7, 231, 144, 90, 242, 197, 238, 95, 31, 81, 219, 92, - 129, 189, 125, 223, 21, 48, 53, 18, 207, 66, 146, 228, 226, 209, 189, 250, - 175, 64, 80, 47, 199, 31, 62, 189, 156, 127, 250, 235, 244, 115, 192, 188, - 129, 23, 129, 79, 47, 188, 197, 249, 61, 160, 232, 238, 19, 33, 133, 193, - 228, 30, 8, 73, 0, 188, 139, 6, 115, 162, 86, 196, 109, 197, 108, 236, - 223, 117, 54, 50, 180, 132, 33, 215, 223, 92, 145, 116, 62, 36, 241, 46, - 254, 244, 126, 230, 251, 119, 228, 214, 57, 96, 239, 180, 221, 249, 167, 230, - 231, 1, 122, 127, 65, 200, 37, 126, 170, 103, 206, 93, 32, 69, 139, 41, - 172, 77, 235, 240, 223, 26, 221, 183, 240, 171, 40, 10, 155, 83, 47, 140, - 16, 85, 93, 24, 128, 97, 151, 114, 123, 56, 239, 166, 193, 140, 216, 220, - 219, 239, 191, 185, 111, 75, 254, 59, 152, 123, 209, 7, 239, 19, 65, 10, - 63, 189, 28, 143, 23, 16, 129, 239, 8, 236, 159, 17, 178, 206, 84, 107, - 114, 133, 39, 150, 13, 31, 42, 180, 161, 58, 228, 184, 208, 56, 52, 183, - 109, 23, 103, 230, 98, 137, 0, 53, 96, 156, 182, 60, 80, 247, 204, 208, - 16, 101, 7, 61, 229, 189, 199, 21, 62, 172, 90, 88, 162, 135, 173, 54, - 48, 12, 243, 163, 55, 99, 167, 239, 135, 108, 173, 128, 144, 64, 238, 41, - 71, 231, 85, 49, 128, 130, 78, 123, 239, 9, 199, 251, 217, 127, 92, 249, - 227, 15, 188, 31, 236, 243, 251, 211, 134, 122, 127, 250, 152, 223, 221, 102, - 179, 226, 4, 206, 211, 253, 76, 24, 32, 170, 2, 251, 46, 214, 234, 66, - 140, 226, 211, 130, 221, 133, 3, 33, 209, 251, 220, 101, 85, 240, 36, 196, - 246, 169, 157, 56, 161, 151, 134, 172, 184, 64, 78, 25, 191, 119, 202, 22, - 208, 69, 3, 206, 169, 93, 227, 20, 165, 90, 166, 65, 74, 70, 236, 219, - 24, 206, 152, 175, 0, 112, 193, 165, 52, 46, 168, 14, 241, 76, 20, 78, - 44, 137, 155, 146, 215, 251, 63, 85, 74, 109, 39, 51, 72, 54, 254, 71, - 237, 152, 89, 89, 186, 202, 16, 156, 157, 102, 212, 214, 84, 29, 99, 245, - 107, 169, 224, 140, 245, 249, 100, 90, 79, 154, 38, 245, 234, 28, 155, 247, - 170, 185, 18, 234, 42, 37, 77, 73, 138, 111, 109, 181, 55, 235, 141, 2, - 106, 244, 25, 14, 38, 54, 180, 209, 12, 16, 153, 150, 159, 37, 229, 123, - 236, 220, 7, 103, 70, 56, 12, 80, 192, 30, 172, 67, 227, 253, 176, 92, - 247, 51, 192, 20, 211, 130, 168, 245, 240, 232, 91, 250, 162, 6, 70, 74, - 9, 142, 54, 141, 254, 166, 33, 81, 205, 179, 64, 197, 82, 158, 8, 249, - 190, 29, 103, 151, 71, 14, 247, 60, 137, 139, 185, 222, 111, 129, 197, 157, - 151, 9, 149, 220, 227, 32, 178, 20, 143, 161, 138, 33, 170, 207, 105, 203, - 153, 216, 149, 56, 204, 74, 194, 142, 110, 187, 132, 218, 114, 142, 113, 91, - 47, 16, 102, 66, 18, 89, 244, 51, 129, 154, 253, 252, 17, 5, 161, 9, - 171, 241, 207, 57, 244, 4, 97, 43, 219, 180, 43, 233, 140, 133, 134, 93, - 194, 23, 138, 75, 84, 188, 186, 77, 205, 18, 201, 105, 67, 67, 171, 64, - 228, 34, 68, 48, 159, 175, 190, 178, 134, 193, 220, 154, 66, 241, 173, 217, - 249, 202, 53, 85, 245, 111, 170, 53, 5, 147, 208, 40, 156, 121, 248, 30, - 156, 192, 140, 198, 144, 100, 85, 20, 215, 251, 192, 185, 234, 126, 128, 39, - 143, 171, 123, 131, 152, 205, 163, 238, 104, 17, 205, 189, 89, 112, 95, 24, - 236, 251, 164, 59, 143, 123, 163, 5, 54, 165, 99, 255, 190, 128, 134, 222, - 108, 118, 213, 141, 226, 97, 20, 245, 239, 13, 131, 22, 180, 49, 237, 63, - 195, 115, 127, 72, 240, 238, 11, 38, 32, 161, 15, 158, 117, 100, 171, 113, - 95, 40, 191, 66, 159, 178, 59, 133, 207, 32, 111, 118, 239, 46, 253, 234, - 19, 55, 242, 187, 231, 196, 58, 189, 112, 232, 223, 187, 79, 10, 14, 245, - 106, 246, 25, 163, 253, 193, 155, 193, 233, 84, 119, 70, 91, 245, 208, 235, - 125, 184, 127, 123, 38, 184, 103, 15, 49, 127, 89, 226, 185, 63, 152, 249, - 200, 191, 232, 210, 174, 114, 236, 13, 71, 222, 189, 7, 139, 93, 95, 81, - 114, 112, 121, 111, 4, 211, 134, 178, 59, 35, 49, 248, 222, 179, 113, 48, - 187, 119, 217, 73, 175, 231, 77, 147, 120, 208, 247, 0, 16, 95, 141, 63, - 6, 126, 215, 27, 251, 151, 204, 160, 4, 86, 114, 109, 131, 131, 117, 232, - 10, 137, 45, 106, 181, 218, 60, 108, 202, 221, 141, 124, 234, 170, 255, 40, - 139, 146, 62, 233, 73, 223, 149, 29, 7, 29, 8, 250, 124, 218, 206, 7, - 237, 134, 165, 208, 61, 90, 58, 143, 38, 196, 246, 130, 241, 125, 81, 197, - 62, 108, 84, 172, 226, 158, 247, 37, 160, 12, 238, 61, 9, 76, 40, 191, - 170, 182, 136, 37, 150, 219, 168, 16, 166, 155, 34, 113, 47, 237, 228, 226, - 177, 155, 251, 239, 52, 44, 217, 26, 163, 112, 5, 210, 35, 86, 99, 185, - 45, 173, 60, 106, 61, 117, 90, 205, 204, 48, 226, 230, 77, 251, 6, 198, - 165, 113, 185, 248, 160, 234, 86, 234, 205, 202, 202, 242, 148, 138, 181, 131, - 159, 230, 10, 246, 197, 124, 7, 47, 1, 2, 31, 136, 55, 31, 115, 177, - 126, 7, 79, 242, 250, 230, 134, 182, 19, 112, 22, 146, 172, 206, 211, 89, - 52, 196, 217, 125, 119, 224, 193, 220, 182, 189, 132, 86, 133, 212, 182, 42, - 76, 136, 185, 250, 221, 153, 255, 219, 130, 200, 133, 22, 111, 121, 23, 39, - 250, 13, 24, 217, 42, 159, 25, 244, 18, 13, 6, 18, 57, 15, 247, 207, - 237, 122, 170, 110, 1, 163, 100, 24, 216, 86, 139, 146, 69, 46, 66, 151, - 203, 34, 165, 87, 169, 23, 127, 161, 127, 218, 109, 183, 177, 49, 212, 249, - 34, 40, 57, 251, 202, 171, 101, 153, 139, 56, 127, 217, 95, 33, 46, 169, - 232, 45, 24, 73, 221, 82, 183, 196, 102, 63, 72, 18, 245, 142, 224, 100, - 255, 76, 62, 80, 58, 142, 180, 252, 118, 119, 249, 175, 147, 224, 228, 224, - 204, 9, 78, 30, 159, 157, 253, 75, 172, 103, 244, 199, 130, 216, 3, 136, - 195, 74, 234, 10, 6, 196, 21, 159, 157, 180, 81, 72, 106, 65, 248, 56, - 117, 19, 252, 36, 127, 49, 252, 88, 0, 38, 25, 246, 243, 25, 246, 56, - 144, 192, 130, 184, 216, 44, 154, 214, 172, 86, 211, 154, 124, 172, 89, 174, - 161, 5, 47, 141, 169, 152, 54, 188, 174, 83, 26, 5, 125, 191, 172, 141, - 125, 245, 149, 172, 165, 44, 3, 185, 133, 174, 243, 151, 198, 74, 44, 183, - 87, 5, 195, 84, 247, 80, 72, 73, 43, 41, 115, 108, 71, 48, 137, 245, - 196, 250, 198, 212, 96, 99, 86, 35, 21, 41, 188, 19, 165, 202, 170, 105, - 101, 146, 236, 112, 242, 17, 37, 235, 78, 35, 189, 213, 84, 202, 21, 29, - 119, 149, 23, 75, 169, 247, 193, 57, 244, 250, 217, 79, 63, 114, 239, 26, - 16, 91, 77, 2, 247, 137, 192, 201, 238, 17, 212, 150, 24, 12, 102, 168, - 213, 53, 232, 19, 58, 124, 52, 97, 29, 160, 173, 213, 228, 125, 113, 222, - 216, 187, 71, 50, 61, 59, 138, 85, 69, 104, 111, 153, 110, 45, 37, 94, - 90, 217, 86, 218, 71, 197, 206, 78, 49, 55, 111, 42, 43, 251, 81, 165, - 102, 88, 233, 51, 253, 41, 122, 41, 244, 35, 139, 167, 69, 113, 169, 182, - 243, 152, 152, 220, 246, 149, 21, 143, 130, 193, 156, 8, 163, 10, 77, 171, - 134, 37, 150, 251, 105, 81, 141, 53, 171, 97, 18, 142, 70, 224, 197, 170, - 160, 247, 242, 178, 203, 23, 226, 233, 22, 151, 171, 182, 34, 164, 27, 209, - 171, 199, 43, 69, 173, 180, 149, 81, 11, 160, 245, 236, 188, 112, 181, 250, - 150, 86, 243, 80, 14, 94, 97, 121, 15, 12, 39, 156, 81, 166, 130, 176, - 37, 70, 161, 214, 151, 209, 99, 223, 110, 101, 108, 202, 219, 137, 167, 5, - 254, 146, 18, 53, 112, 209, 206, 153, 155, 151, 236, 227, 120, 234, 133, 48, - 105, 63, 86, 250, 20, 28, 27, 153, 231, 219, 205, 125, 214, 134, 180, 52, - 57, 142, 64, 17, 196, 196, 133, 54, 68, 29, 194, 50, 45, 132, 78, 220, - 244, 147, 105, 191, 206, 109, 205, 16, 157, 50, 150, 167, 38, 66, 199, 195, - 59, 41, 26, 12, 179, 170, 57, 222, 25, 174, 174, 153, 21, 238, 182, 37, - 45, 147, 205, 93, 153, 108, 22, 148, 155, 231, 194, 90, 169, 52, 7, 159, - 93, 77, 152, 90, 143, 29, 235, 187, 72, 109, 199, 216, 177, 209, 60, 178, - 112, 250, 228, 0, 179, 161, 15, 175, 81, 222, 236, 170, 150, 9, 129, 88, - 124, 0, 183, 16, 137, 17, 58, 109, 221, 38, 150, 216, 71, 8, 167, 13, - 87, 42, 10, 197, 178, 75, 123, 18, 64, 43, 118, 86, 136, 68, 177, 113, - 54, 5, 134, 43, 142, 154, 245, 42, 194, 62, 29, 122, 204, 114, 94, 177, - 210, 32, 13, 119, 29, 212, 196, 196, 157, 199, 144, 114, 162, 6, 170, 137, - 42, 89, 115, 23, 72, 116, 197, 156, 222, 202, 100, 171, 11, 208, 243, 85, - 98, 104, 159, 143, 255, 76, 235, 97, 148, 44, 135, 49, 212, 60, 72, 152, - 10, 122, 52, 155, 189, 233, 136, 132, 2, 214, 112, 86, 117, 196, 148, 179, - 59, 14, 104, 43, 191, 235, 132, 89, 32, 111, 253, 243, 69, 48, 238, 111, - 243, 110, 60, 177, 108, 226, 37, 99, 255, 35, 209, 251, 117, 103, 119, 11, - 57, 186, 83, 39, 9, 249, 181, 83, 169, 42, 134, 89, 230, 65, 203, 94, - 131, 208, 150, 68, 8, 193, 215, 210, 217, 3, 12, 75, 40, 207, 196, 29, - 123, 200, 159, 52, 33, 229, 55, 133, 48, 92, 255, 18, 170, 79, 231, 52, - 111, 100, 97, 135, 18, 10, 61, 157, 123, 113, 16, 11, 43, 176, 66, 245, - 194, 153, 137, 2, 55, 214, 193, 121, 182, 84, 162, 190, 137, 145, 89, 175, - 83, 12, 67, 14, 89, 12, 152, 25, 190, 40, 249, 44, 110, 205, 46, 219, - 28, 75, 145, 144, 138, 244, 86, 73, 59, 50, 101, 194, 180, 16, 154, 158, - 22, 3, 82, 248, 155, 194, 144, 122, 190, 85, 205, 183, 174, 138, 102, 164, - 226, 219, 219, 170, 75, 28, 227, 48, 211, 228, 10, 224, 248, 156, 31, 160, - 146, 232, 112, 24, 118, 125, 46, 212, 86, 2, 187, 189, 132, 97, 63, 73, - 106, 134, 17, 145, 170, 214, 210, 14, 67, 100, 200, 51, 68, 245, 225, 164, - 170, 179, 49, 87, 208, 12, 158, 185, 59, 36, 77, 30, 21, 98, 62, 198, - 16, 105, 250, 168, 74, 155, 16, 77, 148, 8, 159, 189, 154, 80, 173, 36, - 104, 113, 182, 227, 182, 146, 211, 82, 90, 123, 208, 46, 213, 159, 209, 190, - 119, 78, 53, 219, 68, 207, 231, 162, 30, 185, 176, 192, 68, 237, 149, 33, - 8, 38, 43, 21, 123, 91, 209, 66, 87, 113, 153, 174, 89, 41, 154, 18, - 63, 56, 34, 13, 171, 181, 204, 182, 142, 49, 72, 104, 152, 221, 177, 5, - 14, 201, 34, 105, 26, 116, 167, 85, 195, 237, 64, 124, 242, 107, 223, 5, - 154, 99, 179, 144, 117, 146, 186, 29, 58, 35, 161, 49, 156, 180, 121, 74, - 37, 254, 21, 146, 175, 16, 218, 145, 6, 185, 61, 156, 16, 246, 217, 120, - 84, 230, 163, 76, 132, 140, 46, 179, 41, 117, 251, 56, 27, 227, 67, 50, - 141, 127, 113, 209, 31, 167, 44, 87, 203, 84, 22, 186, 73, 236, 237, 52, - 100, 231, 35, 153, 47, 199, 241, 132, 118, 205, 29, 18, 140, 127, 133, 75, - 20, 121, 123, 198, 177, 138, 14, 205, 77, 91, 45, 87, 78, 71, 185, 231, - 76, 205, 6, 236, 210, 44, 235, 71, 57, 152, 148, 79, 250, 203, 154, 138, - 57, 40, 201, 109, 88, 153, 228, 99, 45, 82, 55, 88, 164, 126, 168, 28, - 195, 96, 113, 132, 204, 249, 151, 210, 74, 89, 209, 39, 200, 32, 100, 254, - 210, 48, 253, 33, 41, 47, 19, 121, 77, 244, 93, 169, 84, 97, 188, 43, - 225, 143, 16, 45, 107, 87, 105, 143, 239, 91, 216, 211, 36, 126, 33, 212, - 172, 70, 26, 22, 35, 189, 185, 197, 166, 87, 166, 192, 161, 33, 71, 40, - 175, 53, 234, 139, 35, 95, 168, 210, 172, 48, 154, 175, 92, 100, 41, 67, - 6, 48, 20, 192, 82, 125, 231, 84, 88, 236, 236, 53, 26, 43, 115, 240, - 181, 70, 148, 196, 206, 132, 203, 69, 113, 49, 163, 206, 73, 229, 128, 84, - 200, 96, 23, 120, 25, 215, 64, 249, 92, 132, 215, 57, 83, 68, 81, 180, - 193, 250, 151, 246, 67, 245, 99, 89, 223, 129, 223, 168, 255, 14, 149, 66, - 158, 157, 156, 245, 218, 53, 163, 140, 149, 251, 175, 156, 40, 216, 153, 126, - 17, 173, 74, 190, 138, 23, 190, 152, 137, 225, 12, 251, 80, 211, 19, 103, - 101, 93, 228, 44, 12, 233, 171, 94, 86, 203, 200, 161, 207, 191, 51, 199, - 223, 181, 173, 141, 202, 93, 23, 172, 183, 231, 71, 137, 30, 169, 186, 252, - 220, 127, 254, 242, 199, 31, 173, 143, 205, 154, 11, 199, 138, 242, 90, 125, - 110, 125, 116, 107, 141, 107, 235, 80, 14, 23, 123, 126, 47, 24, 143, 107, - 136, 148, 88, 23, 243, 17, 63, 148, 112, 0, 102, 197, 32, 221, 130, 82, - 127, 13, 31, 90, 172, 25, 97, 253, 205, 155, 5, 184, 28, 136, 15, 117, - 69, 112, 29, 116, 72, 178, 188, 126, 255, 54, 236, 31, 230, 154, 95, 254, - 86, 156, 178, 106, 188, 45, 82, 124, 86, 68, 177, 81, 105, 53, 74, 88, - 141, 188, 34, 183, 30, 89, 211, 205, 51, 59, 12, 129, 51, 45, 228, 40, - 183, 42, 71, 214, 72, 191, 236, 225, 165, 211, 126, 140, 89, 218, 167, 121, - 192, 191, 199, 237, 125, 123, 5, 237, 212, 244, 106, 38, 138, 106, 195, 113, - 253, 237, 213, 224, 241, 243, 143, 34, 176, 235, 207, 244, 53, 186, 168, 141, - 175, 234, 23, 211, 248, 111, 173, 198, 224, 247, 81, 255, 101, 206, 95, 19, - 239, 14, 57, 228, 168, 245, 62, 57, 90, 22, 197, 10, 222, 33, 58, 248, - 110, 70, 115, 33, 216, 28, 183, 101, 75, 17, 175, 35, 27, 75, 173, 217, - 201, 119, 97, 215, 244, 191, 220, 220, 107, 58, 205, 61, 56, 4, 216, 131, - 83, 128, 74, 114, 102, 130, 141, 81, 155, 184, 21, 113, 150, 181, 13, 166, - 220, 123, 156, 176, 228, 120, 45, 146, 169, 159, 65, 168, 10, 23, 63, 202, - 185, 207, 54, 88, 215, 52, 53, 83, 94, 45, 73, 53, 205, 79, 50, 134, - 64, 29, 235, 39, 97, 19, 44, 115, 194, 129, 175, 154, 78, 65, 72, 139, - 71, 159, 120, 72, 114, 110, 227, 247, 70, 81, 87, 210, 44, 123, 103, 103, - 135, 38, 199, 90, 145, 185, 161, 74, 171, 21, 114, 203, 153, 77, 174, 206, - 237, 224, 34, 202, 94, 50, 229, 52, 42, 36, 69, 243, 147, 155, 60, 53, - 105, 127, 171, 191, 239, 85, 86, 135, 242, 180, 143, 248, 98, 22, 85, 206, - 182, 152, 153, 6, 229, 155, 131, 0, 198, 179, 185, 248, 245, 5, 206, 15, - 77, 7, 130, 90, 206, 165, 105, 198, 203, 48, 86, 11, 94, 108, 176, 178, - 60, 192, 137, 66, 141, 70, 20, 135, 69, 174, 35, 246, 73, 180, 209, 204, - 249, 240, 98, 213, 22, 34, 184, 175, 242, 206, 189, 132, 182, 232, 139, 159, - 255, 2, 151, 68, 159, 234, 159, 146, 228, 90, 42, 32, 25, 225, 88, 178, - 75, 3, 34, 59, 26, 61, 21, 235, 45, 22, 211, 172, 178, 102, 166, 216, - 227, 228, 74, 209, 46, 85, 121, 10, 223, 88, 88, 109, 58, 65, 22, 233, - 26, 147, 65, 232, 105, 184, 29, 165, 236, 252, 226, 220, 159, 195, 13, 235, - 248, 42, 139, 217, 130, 25, 16, 158, 197, 22, 60, 15, 86, 188, 125, 234, - 168, 125, 185, 253, 169, 28, 132, 159, 74, 34, 1, 114, 83, 37, 152, 81, - 102, 247, 115, 251, 193, 186, 247, 184, 24, 3, 176, 13, 77, 55, 224, 136, - 230, 129, 226, 178, 220, 110, 69, 154, 52, 213, 214, 92, 251, 165, 65, 130, - 172, 7, 148, 71, 111, 47, 175, 63, 57, 16, 115, 60, 37, 75, 119, 249, - 100, 75, 188, 182, 37, 231, 50, 137, 103, 188, 16, 242, 138, 58, 216, 168, - 177, 104, 162, 206, 226, 212, 211, 81, 105, 181, 134, 82, 211, 15, 156, 122, - 174, 27, 207, 39, 198, 243, 177, 241, 92, 54, 158, 59, 198, 115, 21, 13, - 25, 4, 179, 120, 222, 38, 33, 94, 185, 134, 84, 7, 76, 240, 12, 121, - 60, 198, 162, 80, 238, 193, 84, 1, 81, 15, 122, 94, 236, 151, 131, 147, - 135, 216, 64, 55, 206, 104, 253, 120, 80, 46, 247, 58, 52, 170, 30, 123, - 118, 236, 29, 211, 227, 239, 165, 10, 14, 94, 37, 189, 145, 166, 63, 45, - 85, 42, 21, 199, 98, 79, 146, 84, 146, 161, 127, 77, 255, 30, 178, 167, - 42, 203, 190, 220, 189, 250, 58, 56, 44, 83, 23, 19, 35, 153, 66, 76, - 194, 27, 129, 38, 112, 252, 20, 26, 143, 125, 60, 75, 134, 56, 77, 158, - 39, 143, 231, 11, 227, 249, 42, 201, 76, 66, 71, 146, 12, 245, 128, 228, - 37, 8, 141, 199, 121, 148, 20, 24, 7, 31, 252, 228, 11, 98, 140, 164, - 47, 6, 168, 104, 96, 60, 14, 146, 194, 81, 10, 52, 82, 64, 229, 197, - 40, 73, 52, 148, 188, 76, 189, 120, 158, 20, 158, 26, 31, 16, 154, 217, - 120, 73, 91, 100, 0, 93, 76, 147, 162, 139, 169, 81, 243, 199, 32, 69, - 33, 34, 44, 151, 8, 205, 139, 233, 84, 143, 102, 165, 64, 179, 121, 112, - 82, 100, 50, 96, 111, 164, 106, 40, 204, 60, 118, 122, 172, 37, 7, 75, - 244, 150, 93, 229, 191, 225, 181, 60, 119, 60, 140, 99, 96, 249, 144, 63, - 56, 166, 47, 47, 213, 234, 191, 86, 66, 62, 212, 215, 191, 188, 156, 12, - 173, 119, 179, 30, 23, 163, 199, 152, 30, 115, 57, 158, 89, 63, 144, 32, - 145, 58, 134, 204, 127, 247, 174, 255, 94, 251, 126, 10, 253, 170, 218, 144, - 126, 114, 95, 222, 132, 240, 55, 201, 97, 229, 178, 95, 202, 47, 252, 33, - 84, 144, 203, 125, 252, 230, 190, 189, 185, 228, 79, 211, 203, 181, 47, 239, - 248, 67, 188, 150, 254, 158, 211, 231, 249, 244, 183, 126, 149, 210, 103, 244, - 111, 54, 253, 85, 16, 86, 223, 211, 23, 252, 206, 243, 223, 188, 75, 249, - 70, 191, 249, 111, 239, 68, 167, 45, 198, 143, 218, 47, 17, 55, 226, 221, - 210, 59, 127, 42, 94, 38, 141, 220, 62, 116, 47, 99, 250, 87, 239, 145, - 211, 236, 175, 163, 185, 159, 207, 143, 52, 42, 0, 243, 161, 13, 37, 254, - 58, 27, 231, 11, 80, 18, 229, 135, 236, 135, 236, 112, 66, 177, 156, 39, - 167, 87, 52, 53, 229, 168, 132, 210, 113, 46, 179, 209, 219, 47, 253, 247, - 179, 55, 11, 105, 247, 124, 104, 189, 147, 64, 119, 37, 156, 47, 218, 37, - 43, 94, 156, 171, 24, 229, 44, 92, 80, 50, 1, 178, 75, 89, 253, 31, - 24, 118, 174, 235, 225, 41, 19, 207, 7, 42, 130, 114, 120, 62, 65, 220, - 102, 250, 105, 179, 125, 111, 114, 196, 185, 68, 218, 170, 109, 23, 93, 219, - 74, 206, 26, 147, 196, 166, 205, 101, 112, 14, 180, 89, 193, 134, 246, 5, - 31, 130, 41, 118, 65, 77, 218, 214, 174, 236, 84, 186, 64, 97, 170, 18, - 24, 97, 56, 44, 33, 36, 218, 112, 92, 31, 190, 21, 151, 188, 25, 197, - 33, 98, 106, 140, 78, 169, 220, 193, 193, 124, 122, 106, 53, 86, 90, 185, - 201, 200, 96, 219, 202, 195, 168, 46, 39, 102, 235, 153, 130, 110, 182, 160, - 202, 161, 75, 166, 98, 80, 10, 182, 130, 16, 125, 13, 231, 11, 186, 224, - 100, 223, 155, 69, 23, 255, 90, 213, 72, 121, 226, 196, 32, 110, 243, 188, - 89, 88, 31, 206, 243, 128, 218, 137, 24, 242, 135, 137, 33, 173, 210, 197, - 154, 249, 108, 237, 70, 196, 161, 179, 176, 5, 110, 20, 102, 163, 245, 105, - 5, 44, 9, 216, 23, 64, 35, 132, 15, 191, 136, 128, 97, 68, 71, 27, - 129, 216, 42, 186, 236, 123, 146, 86, 180, 215, 124, 12, 63, 246, 139, 175, - 219, 140, 203, 162, 219, 237, 251, 231, 129, 23, 118, 47, 70, 190, 255, 251, - 85, 215, 155, 244, 15, 246, 106, 148, 150, 219, 129, 190, 150, 227, 194, 77, - 37, 127, 133, 5, 149, 127, 159, 146, 212, 70, 132, 43, 219, 86, 244, 186, - 146, 65, 127, 107, 133, 91, 74, 46, 206, 23, 225, 124, 209, 189, 244, 195, - 192, 27, 223, 169, 181, 170, 164, 55, 155, 15, 22, 247, 42, 121, 78, 123, - 42, 74, 184, 117, 73, 132, 96, 104, 214, 158, 116, 127, 155, 3, 200, 56, - 8, 23, 151, 84, 240, 119, 154, 139, 119, 43, 185, 105, 128, 20, 148, 219, - 149, 204, 14, 144, 20, 221, 82, 210, 109, 228, 138, 38, 35, 148, 180, 251, - 134, 58, 55, 13, 208, 237, 90, 187, 105, 128, 238, 84, 50, 51, 64, 219, - 74, 114, 160, 139, 155, 49, 123, 187, 146, 155, 48, 123, 203, 146, 235, 136, - 189, 169, 228, 53, 152, 189, 93, 201, 77, 152, 189, 93, 201, 77, 152, 221, - 80, 178, 55, 14, 80, 232, 34, 8, 55, 19, 250, 246, 126, 210, 54, 231, - 158, 37, 115, 116, 187, 29, 194, 237, 74, 250, 151, 254, 109, 75, 62, 185, - 177, 202, 219, 149, 220, 84, 229, 245, 163, 114, 45, 154, 184, 228, 188, 1, - 223, 176, 33, 73, 18, 184, 178, 77, 78, 120, 170, 36, 199, 136, 77, 57, - 14, 72, 121, 73, 186, 146, 227, 96, 220, 125, 158, 211, 234, 143, 91, 69, - 117, 52, 220, 143, 146, 45, 226, 107, 237, 223, 129, 91, 212, 73, 157, 76, - 194, 49, 191, 222, 147, 138, 33, 52, 218, 231, 116, 57, 127, 55, 30, 209, - 30, 30, 242, 3, 86, 52, 106, 52, 220, 31, 167, 11, 218, 201, 25, 237, - 53, 165, 16, 125, 75, 188, 212, 94, 112, 88, 27, 190, 235, 183, 233, 185, - 31, 93, 196, 74, 52, 209, 169, 204, 74, 237, 76, 224, 183, 170, 214, 125, - 230, 243, 97, 229, 78, 76, 221, 232, 230, 245, 192, 185, 191, 240, 73, 168, - 214, 230, 186, 228, 150, 214, 38, 23, 188, 215, 152, 114, 59, 246, 181, 32, - 190, 76, 171, 186, 148, 155, 251, 91, 255, 236, 214, 109, 4, 149, 186, 244, - 164, 140, 171, 207, 105, 243, 231, 54, 116, 99, 235, 148, 63, 236, 98, 167, - 109, 233, 59, 78, 227, 234, 227, 184, 248, 122, 165, 157, 139, 206, 31, 237, - 85, 112, 152, 1, 247, 98, 136, 178, 67, 162, 212, 180, 157, 82, 174, 101, - 28, 166, 41, 234, 133, 167, 25, 157, 189, 6, 154, 244, 167, 171, 228, 35, - 23, 183, 29, 203, 214, 254, 201, 183, 205, 30, 110, 60, 194, 192, 39, 176, - 236, 212, 94, 255, 130, 50, 90, 251, 141, 6, 205, 191, 236, 13, 45, 183, - 93, 41, 106, 252, 113, 92, 156, 55, 118, 15, 26, 59, 244, 103, 143, 135, - 192, 232, 158, 174, 242, 13, 84, 96, 189, 177, 37, 152, 139, 229, 204, 168, - 12, 7, 98, 56, 117, 98, 67, 1, 191, 95, 169, 233, 243, 61, 41, 132, - 195, 165, 76, 1, 137, 145, 172, 198, 66, 199, 97, 82, 17, 167, 19, 145, - 245, 121, 20, 34, 174, 92, 234, 255, 64, 199, 107, 98, 91, 135, 239, 161, - 122, 109, 253, 196, 170, 215, 148, 33, 182, 206, 199, 209, 208, 42, 27, 87, - 26, 83, 52, 181, 7, 51, 66, 122, 64, 216, 187, 138, 147, 198, 165, 86, - 48, 33, 235, 194, 127, 133, 114, 29, 51, 155, 88, 19, 203, 246, 250, 8, - 166, 51, 196, 109, 97, 183, 187, 177, 145, 69, 219, 222, 177, 13, 47, 7, - 73, 9, 29, 158, 108, 184, 8, 250, 126, 29, 199, 110, 85, 122, 15, 166, - 11, 81, 152, 172, 87, 217, 140, 229, 9, 141, 132, 227, 56, 250, 174, 168, - 186, 150, 111, 61, 132, 228, 237, 163, 71, 171, 136, 205, 117, 52, 52, 9, - 119, 181, 49, 0, 115, 38, 231, 13, 65, 167, 51, 121, 175, 139, 64, 189, - 49, 227, 166, 112, 212, 217, 140, 215, 196, 166, 206, 100, 188, 46, 80, 117, - 38, 35, 158, 54, 70, 173, 206, 228, 186, 85, 8, 235, 76, 137, 237, 241, - 172, 51, 217, 50, 193, 173, 39, 31, 250, 193, 204, 170, 78, 173, 96, 50, - 180, 149, 253, 6, 78, 117, 104, 218, 101, 138, 231, 32, 12, 235, 112, 16, - 179, 199, 126, 175, 107, 119, 46, 23, 223, 163, 220, 44, 142, 141, 177, 186, - 77, 169, 158, 76, 210, 46, 34, 72, 3, 194, 206, 77, 84, 150, 100, 87, - 99, 120, 77, 134, 248, 230, 81, 78, 166, 229, 60, 234, 221, 134, 122, 204, - 216, 226, 174, 235, 224, 15, 60, 104, 195, 225, 149, 225, 216, 139, 131, 11, - 182, 156, 253, 198, 35, 56, 249, 222, 91, 241, 19, 62, 236, 242, 23, 188, - 169, 175, 35, 124, 165, 47, 5, 56, 192, 130, 19, 253, 97, 157, 90, 210, - 69, 208, 93, 196, 255, 34, 92, 102, 156, 117, 239, 89, 131, 94, 205, 106, - 238, 237, 59, 250, 111, 3, 238, 254, 116, 177, 143, 81, 208, 231, 50, 226, - 255, 60, 57, 139, 121, 141, 147, 152, 215, 114, 14, 147, 106, 34, 116, 95, - 23, 168, 108, 113, 169, 3, 182, 160, 135, 88, 49, 50, 137, 177, 74, 53, - 174, 218, 210, 226, 224, 50, 27, 25, 156, 92, 7, 178, 123, 94, 42, 235, - 208, 179, 248, 247, 84, 47, 57, 216, 206, 90, 27, 144, 66, 157, 194, 90, - 62, 8, 46, 85, 2, 245, 48, 232, 163, 129, 34, 205, 209, 82, 70, 3, - 69, 28, 183, 58, 32, 54, 59, 159, 76, 107, 226, 175, 48, 199, 250, 210, - 139, 137, 26, 59, 189, 41, 108, 97, 201, 234, 92, 169, 184, 108, 225, 88, - 137, 234, 219, 83, 191, 251, 248, 221, 138, 78, 213, 73, 122, 45, 186, 150, - 238, 37, 222, 154, 230, 193, 212, 62, 14, 166, 84, 7, 232, 35, 18, 68, - 119, 19, 119, 225, 69, 215, 222, 100, 130, 154, 102, 79, 77, 78, 177, 38, - 166, 233, 124, 207, 174, 20, 42, 54, 1, 42, 40, 164, 226, 12, 12, 42, - 32, 2, 215, 76, 92, 138, 98, 134, 210, 239, 104, 106, 45, 148, 6, 107, - 161, 84, 75, 171, 108, 230, 106, 147, 218, 209, 85, 101, 20, 137, 9, 74, - 140, 108, 36, 188, 64, 229, 199, 72, 73, 238, 180, 218, 10, 104, 187, 38, - 23, 62, 27, 154, 162, 253, 11, 26, 184, 107, 49, 238, 50, 36, 195, 40, - 108, 217, 106, 130, 103, 104, 71, 127, 146, 47, 6, 13, 169, 15, 34, 87, - 172, 129, 51, 219, 187, 5, 108, 38, 203, 38, 240, 102, 134, 92, 31, 246, - 204, 62, 164, 237, 220, 83, 237, 4, 29, 189, 54, 143, 60, 243, 34, 13, - 251, 68, 154, 141, 219, 58, 196, 229, 154, 104, 66, 211, 63, 26, 199, 85, - 136, 14, 243, 232, 42, 22, 150, 69, 244, 144, 159, 13, 90, 38, 202, 196, - 174, 132, 88, 140, 243, 100, 45, 228, 26, 174, 52, 225, 216, 233, 173, 50, - 18, 221, 152, 151, 166, 224, 5, 98, 83, 86, 127, 179, 228, 3, 78, 35, - 205, 233, 40, 230, 168, 105, 10, 91, 164, 22, 82, 171, 141, 236, 89, 187, - 118, 80, 203, 158, 200, 67, 132, 217, 180, 236, 205, 57, 252, 203, 109, 57, - 104, 173, 164, 239, 227, 249, 108, 253, 147, 120, 220, 61, 180, 220, 233, 165, - 237, 36, 111, 13, 122, 203, 230, 251, 254, 212, 221, 107, 144, 124, 71, 153, - 148, 164, 151, 203, 240, 252, 245, 251, 31, 233, 227, 243, 247, 111, 127, 204, - 223, 62, 120, 241, 40, 232, 211, 183, 183, 36, 202, 210, 67, 246, 43, 111, - 53, 196, 126, 147, 68, 73, 146, 27, 67, 31, 30, 65, 212, 14, 100, 67, - 102, 132, 137, 84, 25, 148, 17, 103, 46, 211, 95, 30, 210, 231, 226, 131, - 124, 234, 178, 234, 58, 244, 97, 185, 150, 190, 33, 145, 13, 117, 72, 118, - 33, 153, 99, 172, 234, 178, 117, 8, 63, 120, 160, 181, 190, 127, 249, 138, - 80, 240, 223, 111, 255, 241, 0, 254, 102, 109, 86, 138, 100, 69, 243, 141, - 89, 112, 103, 156, 100, 107, 164, 23, 177, 150, 165, 93, 225, 38, 191, 34, - 182, 165, 89, 211, 136, 76, 153, 40, 223, 29, 209, 250, 57, 230, 217, 0, - 147, 64, 140, 127, 88, 93, 112, 196, 105, 72, 116, 157, 227, 137, 63, 247, - 88, 31, 169, 234, 255, 182, 8, 62, 82, 134, 231, 226, 155, 185, 250, 254, - 106, 10, 43, 118, 229, 170, 89, 5, 133, 230, 229, 252, 136, 99, 245, 194, - 208, 230, 175, 239, 191, 171, 62, 65, 132, 39, 169, 231, 134, 72, 221, 166, - 80, 156, 22, 82, 129, 179, 17, 229, 87, 87, 146, 250, 6, 79, 60, 5, - 39, 18, 68, 42, 75, 228, 34, 103, 223, 208, 6, 19, 62, 215, 159, 68, - 117, 219, 0, 89, 50, 212, 111, 217, 68, 149, 109, 20, 215, 148, 250, 118, - 252, 34, 64, 76, 196, 82, 10, 90, 127, 168, 151, 142, 146, 204, 23, 148, - 54, 245, 103, 207, 49, 49, 95, 67, 8, 162, 18, 23, 240, 45, 45, 243, - 75, 231, 204, 119, 240, 150, 248, 18, 134, 215, 235, 135, 53, 152, 61, 254, - 234, 93, 114, 164, 118, 245, 92, 23, 219, 240, 250, 43, 122, 253, 47, 250, - 244, 107, 252, 53, 141, 243, 32, 24, 182, 223, 251, 127, 175, 62, 123, 245, - 174, 250, 234, 213, 143, 93, 68, 131, 143, 102, 244, 180, 1, 205, 231, 81, - 255, 170, 99, 170, 166, 129, 58, 57, 241, 152, 105, 164, 147, 234, 146, 101, - 230, 204, 169, 77, 146, 188, 7, 111, 41, 19, 120, 106, 170, 171, 237, 41, - 180, 96, 78, 183, 115, 233, 205, 69, 214, 32, 111, 98, 230, 215, 3, 222, - 88, 34, 15, 119, 107, 105, 19, 246, 198, 157, 111, 221, 214, 179, 248, 216, - 179, 236, 140, 178, 5, 203, 14, 157, 142, 214, 100, 94, 194, 56, 205, 93, - 57, 191, 172, 88, 155, 84, 178, 39, 154, 176, 0, 161, 200, 21, 169, 53, - 5, 245, 52, 13, 11, 10, 83, 15, 144, 190, 8, 61, 44, 74, 224, 21, - 50, 196, 239, 53, 88, 124, 61, 225, 43, 61, 201, 146, 213, 97, 213, 233, - 124, 113, 122, 109, 111, 54, 97, 139, 205, 188, 206, 44, 47, 236, 141, 162, - 25, 238, 236, 204, 170, 185, 153, 54, 244, 116, 197, 146, 70, 28, 180, 170, - 188, 15, 209, 142, 180, 205, 34, 197, 88, 73, 132, 55, 13, 35, 53, 83, - 19, 225, 140, 189, 194, 26, 34, 31, 180, 156, 218, 165, 204, 1, 64, 233, - 136, 42, 58, 208, 152, 37, 241, 139, 176, 250, 160, 77, 89, 146, 164, 86, - 146, 132, 67, 32, 105, 68, 34, 166, 41, 65, 70, 60, 46, 39, 40, 83, - 169, 185, 86, 202, 247, 237, 162, 90, 90, 94, 75, 105, 144, 38, 37, 181, - 160, 62, 170, 215, 162, 224, 37, 47, 70, 136, 178, 39, 179, 53, 146, 33, - 140, 140, 118, 73, 65, 23, 7, 162, 37, 91, 193, 73, 100, 12, 142, 66, - 154, 106, 147, 167, 77, 133, 50, 121, 34, 71, 111, 234, 66, 87, 240, 252, - 187, 178, 100, 82, 8, 175, 25, 182, 1, 197, 165, 190, 33, 62, 21, 163, - 47, 89, 137, 116, 4, 63, 238, 215, 77, 145, 187, 31, 38, 129, 102, 191, - 64, 159, 45, 195, 166, 199, 46, 39, 53, 233, 6, 35, 190, 151, 250, 30, - 174, 110, 139, 29, 61, 62, 95, 118, 116, 210, 150, 206, 168, 165, 97, 68, - 77, 156, 205, 252, 120, 26, 133, 28, 241, 158, 141, 12, 88, 102, 188, 107, - 155, 121, 119, 81, 211, 126, 116, 173, 49, 237, 89, 195, 9, 109, 74, 185, - 117, 180, 78, 180, 151, 151, 233, 196, 87, 193, 142, 46, 231, 208, 37, 188, - 156, 203, 153, 124, 162, 129, 117, 106, 225, 83, 178, 201, 137, 161, 26, 65, - 9, 165, 179, 35, 86, 27, 10, 135, 165, 63, 254, 192, 19, 98, 191, 234, - 39, 127, 88, 90, 21, 82, 47, 58, 122, 33, 6, 6, 177, 209, 46, 238, - 195, 184, 194, 82, 109, 146, 15, 201, 244, 24, 172, 150, 231, 43, 21, 5, - 207, 156, 34, 86, 14, 221, 223, 42, 233, 85, 194, 230, 101, 240, 126, 227, - 116, 224, 33, 5, 175, 10, 84, 227, 152, 96, 131, 184, 27, 77, 189, 223, - 22, 8, 188, 21, 79, 199, 193, 28, 175, 61, 248, 242, 208, 142, 183, 93, - 177, 242, 13, 188, 78, 115, 191, 177, 50, 10, 176, 55, 121, 207, 234, 9, - 11, 78, 210, 87, 84, 125, 119, 54, 84, 38, 40, 242, 236, 201, 160, 101, - 2, 136, 89, 3, 104, 216, 155, 167, 18, 18, 78, 76, 84, 41, 89, 73, - 69, 163, 1, 225, 217, 104, 227, 152, 67, 198, 203, 77, 56, 80, 7, 57, - 126, 95, 25, 125, 92, 135, 17, 165, 116, 97, 146, 121, 30, 225, 223, 81, - 6, 41, 174, 125, 222, 108, 68, 189, 0, 76, 34, 116, 50, 37, 110, 38, - 213, 130, 24, 57, 66, 176, 93, 139, 170, 177, 37, 46, 138, 159, 198, 68, - 169, 156, 218, 202, 253, 110, 195, 105, 170, 89, 186, 141, 68, 114, 136, 225, - 40, 214, 233, 209, 188, 234, 123, 46, 12, 48, 191, 38, 54, 34, 250, 232, - 31, 31, 245, 58, 142, 163, 196, 187, 44, 228, 56, 201, 179, 121, 145, 52, - 148, 43, 85, 132, 18, 78, 110, 158, 25, 171, 185, 177, 30, 22, 242, 115, - 39, 101, 184, 220, 165, 207, 157, 74, 66, 61, 255, 43, 38, 79, 58, 119, - 244, 212, 89, 119, 247, 239, 54, 104, 226, 96, 146, 20, 62, 107, 90, 21, - 110, 59, 173, 254, 164, 25, 117, 237, 156, 186, 199, 116, 82, 171, 21, 114, - 37, 126, 50, 76, 178, 205, 234, 38, 34, 38, 17, 8, 216, 193, 99, 18, - 58, 167, 185, 127, 160, 226, 179, 228, 117, 25, 57, 6, 205, 241, 244, 154, - 66, 211, 109, 229, 190, 10, 207, 227, 233, 209, 157, 106, 35, 153, 151, 181, - 38, 211, 8, 194, 98, 240, 200, 231, 17, 202, 34, 101, 79, 206, 65, 8, - 51, 255, 249, 237, 238, 134, 32, 51, 198, 53, 137, 4, 153, 81, 89, 147, - 112, 56, 231, 180, 188, 19, 173, 171, 216, 65, 105, 250, 60, 154, 194, 96, - 99, 158, 77, 164, 38, 116, 233, 11, 37, 106, 255, 180, 102, 108, 156, 60, - 108, 9, 29, 180, 14, 1, 233, 51, 191, 27, 208, 191, 209, 218, 190, 27, - 120, 90, 16, 241, 101, 66, 114, 81, 174, 143, 222, 204, 26, 126, 167, 93, - 164, 209, 214, 180, 120, 80, 58, 202, 239, 2, 55, 96, 96, 237, 102, 32, - 131, 135, 64, 38, 179, 166, 5, 204, 89, 236, 196, 37, 174, 229, 169, 93, - 108, 210, 27, 103, 217, 24, 154, 106, 143, 35, 7, 249, 222, 132, 182, 245, - 49, 172, 116, 56, 171, 134, 253, 103, 132, 31, 218, 222, 207, 77, 193, 135, - 182, 231, 94, 11, 62, 100, 203, 198, 89, 81, 117, 43, 161, 106, 190, 49, - 94, 226, 202, 120, 119, 81, 110, 210, 79, 69, 110, 132, 245, 9, 167, 16, - 152, 62, 122, 87, 33, 61, 160, 211, 217, 88, 117, 218, 28, 202, 35, 136, - 207, 105, 155, 86, 198, 129, 124, 99, 85, 177, 213, 5, 63, 194, 224, 200, - 130, 202, 250, 18, 213, 36, 24, 114, 187, 232, 178, 27, 32, 229, 254, 46, - 113, 249, 39, 182, 77, 106, 101, 10, 55, 172, 120, 206, 168, 211, 62, 216, - 83, 123, 212, 194, 110, 222, 248, 32, 179, 111, 59, 157, 171, 141, 170, 13, - 213, 251, 147, 146, 178, 0, 141, 57, 162, 148, 182, 208, 59, 180, 72, 188, - 180, 140, 32, 242, 8, 162, 88, 142, 43, 149, 118, 59, 182, 89, 119, 4, - 162, 112, 91, 57, 95, 168, 186, 78, 73, 237, 43, 180, 67, 146, 184, 11, - 131, 45, 51, 3, 222, 141, 12, 3, 171, 204, 170, 14, 124, 82, 199, 203, - 53, 191, 34, 151, 168, 252, 166, 40, 218, 77, 182, 153, 29, 213, 244, 166, - 195, 39, 252, 169, 201, 1, 222, 196, 234, 64, 222, 92, 182, 73, 173, 169, - 183, 102, 38, 103, 51, 147, 179, 149, 201, 185, 151, 201, 185, 167, 114, 82, - 143, 9, 61, 109, 170, 246, 95, 6, 74, 246, 43, 255, 90, 169, 51, 242, - 98, 203, 18, 237, 80, 49, 106, 36, 169, 128, 198, 88, 162, 137, 83, 185, - 108, 114, 106, 57, 42, 11, 137, 94, 116, 13, 39, 66, 114, 210, 152, 249, - 111, 203, 40, 33, 236, 70, 98, 77, 119, 83, 220, 136, 142, 93, 164, 242, - 182, 88, 213, 157, 75, 40, 120, 105, 124, 234, 63, 70, 150, 138, 235, 255, - 181, 158, 235, 152, 14, 51, 191, 170, 20, 90, 110, 104, 74, 94, 255, 133, - 27, 3, 205, 89, 179, 49, 169, 55, 144, 207, 197, 2, 78, 219, 132, 220, - 84, 205, 207, 95, 78, 134, 93, 233, 62, 148, 180, 254, 237, 184, 216, 220, - 32, 57, 249, 75, 26, 180, 9, 31, 244, 231, 74, 111, 38, 215, 228, 224, - 104, 35, 159, 72, 162, 82, 72, 212, 150, 143, 196, 155, 252, 223, 106, 44, - 35, 17, 198, 206, 163, 216, 47, 213, 224, 232, 117, 183, 162, 115, 72, 42, - 188, 82, 192, 164, 159, 126, 151, 52, 255, 254, 32, 161, 103, 149, 201, 119, - 104, 189, 243, 231, 176, 172, 37, 134, 58, 243, 225, 141, 189, 222, 247, 213, - 19, 107, 148, 8, 32, 136, 156, 12, 168, 102, 189, 240, 7, 222, 98, 60, - 87, 112, 131, 216, 106, 212, 18, 88, 229, 164, 81, 165, 74, 237, 52, 76, - 210, 127, 30, 249, 161, 85, 226, 18, 37, 98, 21, 142, 210, 200, 134, 102, - 203, 4, 30, 74, 160, 82, 0, 61, 144, 126, 64, 82, 174, 119, 133, 240, - 218, 162, 185, 77, 227, 25, 246, 113, 33, 195, 94, 59, 173, 114, 60, 135, - 27, 221, 74, 90, 163, 110, 205, 71, 111, 188, 160, 65, 146, 58, 218, 141, - 146, 206, 193, 252, 254, 208, 234, 251, 4, 22, 13, 12, 35, 170, 104, 88, - 201, 225, 0, 10, 71, 172, 67, 227, 89, 195, 224, 35, 181, 85, 242, 151, - 131, 208, 154, 196, 21, 199, 18, 129, 2, 134, 119, 86, 28, 224, 212, 3, - 109, 163, 221, 213, 220, 130, 53, 30, 247, 24, 21, 149, 210, 118, 17, 172, - 139, 20, 232, 34, 70, 88, 217, 143, 192, 105, 212, 67, 244, 20, 142, 55, - 163, 186, 200, 177, 35, 56, 190, 49, 122, 59, 215, 72, 176, 148, 86, 94, - 10, 179, 196, 173, 34, 129, 217, 11, 161, 68, 184, 180, 142, 27, 109, 78, - 218, 29, 140, 23, 241, 72, 42, 136, 105, 144, 27, 109, 169, 235, 15, 171, - 163, 114, 88, 171, 20, 140, 10, 168, 168, 42, 102, 215, 165, 52, 75, 188, - 240, 170, 34, 232, 150, 32, 84, 155, 91, 3, 155, 175, 160, 231, 199, 252, - 153, 150, 74, 24, 225, 137, 108, 173, 62, 164, 213, 188, 28, 88, 132, 236, - 92, 49, 14, 208, 51, 245, 123, 193, 32, 80, 242, 62, 85, 173, 251, 69, - 180, 52, 5, 169, 5, 112, 95, 3, 212, 104, 91, 203, 153, 31, 211, 24, - 199, 9, 104, 26, 22, 207, 42, 193, 147, 99, 201, 138, 199, 190, 63, 181, - 250, 11, 70, 105, 10, 154, 65, 110, 39, 19, 254, 156, 33, 147, 25, 172, - 223, 187, 3, 248, 210, 233, 34, 36, 16, 49, 163, 246, 146, 182, 128, 127, - 88, 174, 181, 114, 186, 138, 76, 115, 116, 243, 134, 106, 157, 27, 181, 94, - 136, 249, 138, 38, 106, 231, 214, 100, 124, 187, 49, 73, 167, 7, 147, 29, - 125, 33, 233, 4, 166, 49, 52, 133, 111, 26, 144, 11, 131, 101, 200, 160, - 228, 56, 134, 26, 41, 66, 2, 75, 143, 39, 143, 104, 217, 164, 53, 94, - 233, 14, 36, 175, 161, 138, 52, 194, 250, 92, 14, 135, 254, 36, 153, 213, - 247, 233, 153, 6, 175, 123, 73, 25, 229, 233, 138, 159, 56, 140, 118, 14, - 107, 47, 20, 73, 165, 148, 47, 74, 69, 48, 218, 163, 62, 111, 35, 61, - 24, 190, 25, 184, 134, 244, 2, 55, 190, 70, 115, 248, 210, 198, 73, 234, - 73, 219, 198, 150, 251, 76, 110, 220, 158, 13, 12, 235, 34, 203, 176, 136, - 120, 75, 140, 134, 18, 102, 114, 73, 112, 192, 20, 10, 92, 83, 1, 66, - 133, 34, 81, 243, 108, 177, 143, 120, 22, 236, 13, 1, 209, 170, 56, 180, - 140, 108, 68, 145, 85, 186, 97, 114, 8, 25, 40, 116, 164, 150, 101, 149, - 196, 162, 22, 19, 158, 204, 37, 70, 106, 137, 219, 206, 207, 52, 79, 48, - 137, 206, 35, 66, 70, 63, 24, 240, 49, 44, 56, 53, 225, 77, 183, 73, - 207, 185, 152, 61, 65, 161, 254, 4, 58, 19, 99, 130, 194, 94, 68, 187, - 128, 32, 196, 138, 101, 112, 25, 233, 55, 9, 187, 70, 207, 233, 141, 227, - 185, 198, 12, 97, 243, 0, 25, 32, 50, 163, 98, 48, 172, 170, 219, 254, - 128, 233, 10, 7, 128, 204, 167, 16, 51, 12, 83, 172, 237, 141, 47, 188, - 43, 240, 174, 102, 219, 141, 231, 85, 40, 94, 210, 75, 171, 13, 41, 215, - 100, 94, 165, 116, 80, 175, 135, 203, 80, 175, 168, 193, 70, 97, 132, 8, - 67, 25, 154, 106, 64, 252, 98, 138, 161, 113, 27, 6, 30, 183, 240, 96, - 216, 156, 45, 224, 81, 145, 187, 31, 46, 38, 231, 148, 189, 79, 220, 132, - 118, 98, 161, 193, 152, 74, 23, 36, 102, 150, 251, 194, 108, 28, 203, 32, - 46, 167, 116, 225, 150, 156, 90, 173, 70, 15, 36, 166, 170, 80, 103, 137, - 49, 249, 133, 177, 116, 188, 12, 63, 70, 31, 252, 100, 150, 10, 221, 83, - 135, 82, 222, 0, 31, 95, 222, 7, 223, 28, 108, 197, 178, 216, 237, 23, - 13, 252, 200, 163, 54, 131, 240, 121, 212, 216, 102, 14, 153, 177, 14, 109, - 97, 138, 177, 30, 249, 182, 218, 45, 102, 198, 176, 157, 162, 157, 184, 128, - 34, 71, 158, 75, 237, 242, 34, 164, 14, 35, 248, 74, 37, 237, 196, 161, - 216, 177, 191, 50, 117, 63, 229, 211, 7, 131, 15, 97, 204, 114, 92, 136, - 135, 49, 203, 46, 254, 27, 73, 81, 56, 94, 99, 24, 27, 166, 241, 135, - 146, 193, 84, 139, 146, 143, 207, 234, 248, 244, 204, 186, 100, 248, 39, 141, - 234, 126, 227, 17, 188, 166, 226, 130, 152, 122, 114, 121, 115, 145, 95, 90, - 141, 71, 213, 199, 141, 71, 107, 101, 38, 166, 44, 134, 249, 150, 235, 144, - 152, 32, 170, 133, 45, 10, 137, 41, 230, 186, 199, 30, 211, 242, 172, 208, - 51, 87, 21, 93, 118, 67, 127, 39, 31, 111, 232, 176, 211, 226, 22, 64, - 254, 109, 92, 219, 75, 206, 69, 104, 169, 86, 93, 96, 166, 145, 239, 103, - 56, 49, 250, 9, 201, 52, 215, 79, 21, 106, 192, 198, 175, 11, 195, 81, - 250, 109, 218, 160, 248, 13, 242, 38, 62, 198, 152, 4, 91, 71, 180, 10, - 22, 156, 138, 71, 160, 250, 196, 66, 207, 131, 16, 54, 28, 171, 83, 61, - 230, 121, 196, 112, 231, 204, 115, 227, 152, 24, 103, 63, 51, 185, 48, 23, - 146, 34, 220, 76, 205, 94, 173, 50, 161, 22, 243, 230, 74, 3, 231, 197, - 155, 230, 68, 48, 29, 51, 0, 47, 174, 220, 174, 77, 28, 32, 143, 185, - 48, 59, 69, 146, 134, 65, 107, 60, 105, 70, 82, 169, 204, 150, 124, 55, - 164, 101, 88, 229, 185, 148, 164, 69, 185, 250, 54, 80, 64, 56, 217, 70, - 1, 12, 80, 224, 156, 143, 23, 179, 19, 126, 60, 179, 154, 105, 230, 162, - 122, 156, 153, 99, 59, 243, 55, 80, 177, 36, 230, 70, 242, 173, 36, 222, - 60, 43, 103, 91, 219, 168, 169, 79, 224, 159, 108, 155, 100, 215, 22, 218, - 54, 155, 229, 115, 183, 191, 160, 236, 136, 243, 23, 231, 27, 158, 126, 73, - 37, 144, 156, 72, 46, 201, 208, 99, 55, 219, 95, 118, 157, 166, 211, 66, - 124, 92, 250, 219, 98, 85, 91, 60, 187, 149, 92, 211, 140, 186, 211, 198, - 173, 127, 74, 77, 3, 174, 107, 88, 210, 40, 237, 54, 134, 63, 21, 191, - 214, 42, 254, 137, 111, 71, 214, 243, 139, 6, 131, 118, 35, 113, 148, 83, - 124, 80, 229, 91, 19, 246, 63, 213, 94, 178, 74, 194, 174, 187, 171, 252, - 245, 42, 29, 7, 124, 235, 180, 139, 15, 86, 214, 249, 204, 247, 62, 240, - 41, 77, 245, 132, 243, 58, 252, 145, 48, 124, 30, 215, 56, 40, 172, 110, - 96, 123, 249, 0, 94, 242, 244, 77, 136, 249, 9, 174, 66, 85, 49, 170, - 67, 194, 129, 136, 122, 44, 171, 189, 166, 155, 89, 133, 16, 127, 50, 157, - 95, 229, 135, 136, 19, 175, 29, 29, 53, 56, 38, 144, 117, 132, 230, 193, - 220, 22, 151, 114, 20, 119, 236, 60, 184, 24, 245, 185, 155, 112, 145, 166, - 183, 235, 102, 23, 62, 102, 38, 16, 14, 49, 214, 103, 16, 167, 174, 77, - 33, 73, 213, 44, 254, 122, 166, 152, 78, 168, 91, 176, 125, 85, 225, 73, - 181, 9, 143, 16, 215, 102, 174, 186, 7, 73, 118, 44, 1, 56, 54, 94, - 155, 78, 169, 163, 24, 218, 34, 240, 233, 49, 204, 128, 146, 83, 5, 167, - 219, 155, 5, 115, 74, 140, 82, 41, 154, 125, 112, 106, 20, 175, 45, 113, - 189, 30, 75, 159, 67, 45, 31, 167, 11, 158, 12, 108, 2, 239, 26, 137, - 37, 105, 199, 110, 201, 177, 74, 73, 137, 118, 80, 202, 206, 215, 163, 189, - 163, 199, 71, 173, 163, 167, 71, 77, 126, 58, 224, 103, 247, 168, 65, 191, - 173, 163, 166, 158, 183, 87, 150, 233, 13, 39, 208, 24, 184, 42, 152, 125, - 87, 234, 216, 110, 123, 23, 90, 216, 205, 118, 176, 98, 154, 137, 27, 109, - 187, 239, 199, 61, 159, 119, 2, 182, 21, 187, 109, 219, 75, 95, 65, 43, - 154, 40, 51, 104, 81, 148, 7, 170, 180, 139, 203, 120, 217, 45, 237, 150, - 218, 237, 82, 209, 133, 163, 69, 238, 158, 179, 142, 170, 28, 130, 172, 82, - 177, 89, 82, 180, 203, 202, 212, 60, 161, 143, 144, 10, 39, 39, 208, 184, - 166, 89, 255, 175, 35, 64, 165, 132, 106, 233, 235, 110, 169, 83, 58, 236, - 150, 142, 75, 255, 90, 21, 202, 136, 116, 252, 128, 184, 67, 5, 182, 136, - 227, 168, 209, 94, 6, 148, 54, 130, 115, 112, 107, 20, 240, 171, 43, 175, - 244, 21, 30, 135, 27, 148, 220, 46, 210, 39, 137, 193, 205, 65, 161, 107, - 86, 19, 102, 3, 202, 125, 83, 67, 105, 247, 76, 106, 22, 171, 163, 79, - 131, 143, 209, 188, 189, 84, 94, 206, 199, 209, 46, 149, 102, 71, 231, 78, - 200, 142, 147, 121, 158, 141, 163, 99, 64, 213, 9, 197, 101, 55, 193, 123, - 23, 238, 91, 79, 173, 83, 184, 168, 140, 168, 12, 199, 212, 45, 50, 84, - 122, 44, 70, 83, 120, 154, 4, 143, 17, 231, 10, 138, 127, 41, 55, 56, - 238, 117, 0, 19, 32, 128, 61, 10, 4, 54, 3, 28, 5, 213, 173, 0, - 51, 237, 165, 233, 127, 130, 102, 209, 243, 153, 106, 134, 148, 213, 154, 34, - 219, 138, 55, 142, 185, 56, 16, 210, 64, 233, 138, 229, 169, 233, 106, 93, - 37, 250, 239, 84, 11, 80, 45, 217, 144, 171, 145, 207, 166, 108, 222, 70, - 43, 57, 81, 228, 211, 214, 54, 60, 206, 38, 108, 172, 140, 251, 132, 98, - 115, 85, 17, 198, 229, 157, 20, 3, 241, 36, 108, 237, 14, 106, 86, 9, - 123, 74, 13, 241, 146, 231, 64, 13, 110, 16, 174, 160, 218, 230, 138, 19, - 46, 94, 70, 70, 112, 162, 9, 207, 137, 4, 45, 196, 179, 168, 207, 81, - 126, 160, 180, 216, 201, 56, 125, 68, 238, 201, 199, 19, 253, 149, 105, 170, - 216, 169, 172, 206, 104, 183, 182, 150, 81, 59, 170, 90, 134, 147, 36, 227, - 74, 229, 18, 149, 155, 65, 192, 115, 40, 55, 130, 196, 234, 23, 214, 210, - 134, 125, 172, 203, 55, 31, 68, 225, 103, 71, 120, 109, 202, 107, 147, 95, - 131, 223, 233, 109, 18, 132, 101, 185, 242, 160, 204, 21, 71, 63, 54, 43, - 149, 163, 2, 193, 162, 28, 85, 247, 168, 0, 9, 172, 28, 192, 139, 18, - 237, 165, 142, 81, 18, 118, 66, 254, 229, 113, 131, 29, 31, 57, 133, 216, - 205, 184, 82, 2, 176, 147, 224, 12, 158, 142, 154, 249, 15, 77, 249, 32, - 192, 99, 23, 122, 254, 113, 243, 107, 247, 48, 110, 242, 163, 251, 117, 227, - 16, 85, 74, 150, 227, 198, 215, 105, 235, 248, 123, 210, 192, 67, 250, 124, - 84, 176, 87, 38, 39, 166, 15, 89, 62, 155, 231, 175, 229, 143, 129, 127, - 129, 67, 54, 72, 154, 9, 19, 22, 231, 164, 21, 176, 155, 77, 30, 145, - 11, 26, 182, 177, 134, 50, 116, 131, 77, 109, 244, 164, 204, 188, 7, 250, - 168, 151, 201, 176, 138, 27, 245, 81, 125, 15, 28, 129, 88, 201, 85, 123, - 185, 183, 3, 147, 157, 188, 203, 81, 21, 130, 253, 138, 216, 208, 213, 110, - 107, 101, 13, 176, 91, 41, 5, 131, 108, 4, 50, 39, 168, 182, 232, 159, - 74, 201, 170, 178, 71, 253, 30, 212, 46, 15, 90, 22, 73, 36, 87, 214, - 14, 109, 51, 14, 246, 240, 83, 179, 246, 26, 79, 15, 172, 157, 19, 4, - 128, 110, 30, 52, 221, 189, 61, 107, 151, 94, 64, 239, 5, 90, 167, 61, - 197, 229, 137, 193, 95, 90, 202, 249, 168, 149, 117, 44, 110, 141, 189, 115, - 159, 29, 138, 62, 194, 63, 205, 66, 140, 159, 93, 98, 106, 175, 219, 194, - 41, 11, 151, 141, 118, 98, 176, 36, 73, 214, 165, 75, 31, 47, 27, 187, - 203, 37, 4, 171, 149, 51, 34, 2, 222, 253, 157, 221, 162, 95, 130, 195, - 94, 186, 156, 171, 209, 166, 39, 77, 217, 36, 187, 22, 95, 159, 25, 78, - 153, 120, 122, 198, 52, 9, 83, 217, 130, 246, 210, 80, 35, 246, 17, 250, - 14, 154, 107, 63, 113, 184, 217, 104, 166, 197, 89, 146, 201, 114, 66, 5, - 252, 146, 46, 230, 114, 60, 48, 141, 136, 229, 94, 4, 49, 2, 126, 199, - 209, 24, 201, 178, 120, 94, 43, 104, 152, 66, 194, 110, 188, 56, 183, 150, - 129, 183, 2, 132, 147, 172, 40, 209, 106, 52, 148, 183, 190, 82, 47, 138, - 203, 205, 198, 206, 101, 253, 130, 70, 104, 23, 141, 82, 103, 40, 93, 166, - 20, 26, 149, 134, 67, 217, 117, 163, 41, 251, 237, 90, 61, 163, 181, 47, - 134, 117, 218, 173, 219, 171, 15, 46, 124, 28, 136, 185, 92, 213, 53, 205, - 94, 204, 203, 212, 230, 221, 70, 205, 221, 89, 224, 10, 144, 91, 143, 214, - 93, 215, 124, 236, 157, 44, 154, 74, 67, 29, 22, 23, 170, 177, 65, 200, - 18, 84, 213, 76, 215, 166, 176, 70, 183, 71, 183, 234, 247, 232, 106, 138, - 139, 23, 18, 165, 111, 133, 130, 93, 67, 254, 244, 250, 253, 156, 236, 73, - 41, 244, 206, 227, 46, 231, 15, 122, 47, 136, 243, 52, 194, 214, 98, 236, - 149, 182, 95, 142, 60, 163, 210, 169, 108, 198, 80, 28, 189, 63, 157, 89, - 19, 147, 54, 253, 75, 29, 34, 28, 45, 201, 181, 53, 61, 152, 165, 98, - 189, 141, 189, 166, 205, 251, 237, 4, 224, 221, 109, 242, 239, 46, 250, 74, - 219, 72, 139, 6, 150, 248, 67, 115, 127, 127, 115, 54, 236, 136, 173, 125, - 43, 165, 21, 206, 11, 76, 97, 174, 227, 10, 119, 83, 49, 0, 47, 61, - 105, 236, 128, 216, 233, 7, 148, 83, 109, 212, 246, 43, 59, 229, 43, 245, - 180, 219, 35, 2, 186, 190, 110, 197, 54, 158, 130, 251, 204, 105, 163, 196, - 33, 52, 138, 157, 157, 214, 1, 155, 92, 178, 1, 38, 253, 85, 75, 53, - 213, 8, 101, 11, 87, 147, 222, 87, 230, 72, 135, 107, 35, 29, 126, 206, - 72, 155, 164, 120, 30, 200, 144, 60, 123, 253, 98, 147, 244, 158, 59, 140, - 191, 142, 42, 18, 240, 41, 117, 56, 215, 144, 0, 34, 32, 132, 108, 139, - 127, 125, 19, 54, 80, 197, 87, 219, 168, 2, 104, 89, 186, 205, 39, 187, - 7, 123, 171, 205, 244, 48, 9, 248, 102, 230, 18, 89, 53, 46, 103, 195, - 137, 119, 185, 17, 57, 242, 105, 83, 163, 96, 149, 182, 152, 173, 29, 82, - 37, 80, 24, 111, 124, 194, 51, 13, 46, 253, 177, 32, 206, 58, 247, 245, - 217, 178, 220, 218, 232, 131, 31, 54, 226, 84, 88, 229, 146, 84, 43, 172, - 161, 164, 216, 150, 29, 160, 135, 232, 206, 22, 174, 143, 157, 49, 112, 29, - 255, 182, 192, 141, 193, 174, 234, 143, 106, 187, 233, 143, 64, 58, 150, 118, - 42, 187, 27, 46, 62, 80, 204, 242, 18, 87, 232, 203, 95, 216, 25, 40, - 171, 111, 236, 138, 183, 109, 21, 142, 84, 133, 161, 10, 30, 38, 97, 165, - 32, 110, 176, 106, 62, 47, 112, 180, 220, 169, 189, 104, 113, 89, 165, 154, - 186, 188, 169, 118, 108, 169, 183, 140, 203, 251, 153, 93, 177, 173, 15, 53, - 28, 54, 158, 72, 242, 153, 177, 18, 34, 37, 8, 183, 14, 8, 137, 38, - 255, 129, 1, 17, 243, 180, 123, 15, 8, 245, 71, 181, 125, 243, 128, 72, - 167, 210, 1, 17, 109, 163, 7, 57, 109, 163, 127, 203, 24, 145, 248, 188, - 105, 140, 130, 48, 51, 70, 49, 186, 114, 187, 133, 253, 243, 150, 117, 42, - 125, 215, 101, 29, 109, 251, 83, 150, 117, 2, 124, 159, 101, 253, 6, 4, - 120, 115, 239, 214, 184, 156, 35, 32, 97, 184, 233, 160, 229, 70, 116, 54, - 156, 39, 92, 213, 118, 108, 238, 65, 172, 219, 93, 0, 133, 104, 210, 159, - 130, 66, 2, 220, 196, 122, 117, 217, 213, 7, 229, 249, 139, 146, 205, 125, - 143, 102, 1, 212, 50, 251, 183, 69, 194, 183, 152, 234, 185, 35, 196, 32, - 166, 233, 52, 244, 104, 39, 195, 219, 37, 84, 112, 85, 77, 206, 235, 213, - 212, 55, 224, 15, 22, 33, 31, 199, 59, 106, 67, 79, 159, 19, 248, 249, - 83, 44, 232, 147, 196, 27, 174, 138, 47, 147, 10, 50, 39, 85, 160, 237, - 10, 126, 142, 232, 135, 178, 99, 128, 128, 225, 61, 53, 26, 45, 193, 148, - 18, 82, 228, 110, 138, 158, 39, 17, 45, 112, 211, 160, 254, 100, 245, 5, - 198, 225, 62, 164, 124, 51, 234, 143, 143, 13, 201, 229, 60, 30, 231, 36, - 23, 74, 249, 194, 146, 203, 216, 31, 204, 85, 224, 173, 59, 11, 48, 9, - 224, 45, 226, 237, 221, 4, 152, 76, 75, 82, 74, 185, 81, 158, 57, 62, - 222, 38, 208, 0, 91, 37, 217, 96, 183, 48, 57, 157, 198, 6, 177, 179, - 211, 201, 96, 124, 182, 134, 241, 217, 23, 198, 56, 235, 235, 222, 23, 229, - 246, 151, 197, 121, 182, 45, 119, 64, 122, 167, 179, 29, 233, 179, 155, 145, - 126, 219, 141, 237, 253, 119, 181, 13, 103, 217, 220, 153, 6, 176, 21, 188, - 102, 99, 43, 123, 113, 102, 218, 127, 214, 110, 246, 62, 155, 217, 207, 216, - 204, 183, 136, 249, 161, 202, 219, 172, 83, 220, 180, 235, 250, 92, 55, 166, - 6, 237, 175, 114, 83, 3, 59, 174, 251, 79, 141, 23, 193, 71, 184, 226, - 201, 147, 255, 249, 213, 221, 183, 209, 183, 216, 51, 255, 182, 136, 230, 193, - 77, 171, 94, 66, 221, 245, 109, 196, 141, 46, 151, 92, 28, 220, 148, 177, - 187, 189, 172, 187, 141, 202, 14, 141, 21, 237, 108, 233, 169, 82, 218, 62, - 60, 188, 105, 134, 224, 234, 90, 187, 4, 37, 69, 97, 23, 13, 198, 225, - 39, 225, 175, 207, 56, 153, 117, 103, 190, 55, 118, 244, 11, 0, 157, 57, - 93, 127, 26, 7, 227, 40, 236, 180, 83, 130, 124, 227, 207, 128, 103, 64, - 9, 248, 56, 33, 115, 19, 206, 170, 75, 2, 122, 234, 5, 8, 68, 3, - 176, 174, 3, 120, 46, 43, 217, 224, 253, 53, 191, 191, 174, 36, 2, 116, - 110, 8, 76, 16, 70, 158, 242, 214, 166, 26, 152, 123, 25, 102, 91, 32, - 138, 87, 40, 161, 134, 116, 178, 136, 231, 208, 77, 82, 122, 77, 48, 58, - 101, 223, 213, 112, 175, 225, 39, 119, 56, 226, 25, 82, 235, 235, 25, 87, - 59, 217, 27, 231, 188, 246, 162, 66, 88, 219, 245, 171, 79, 74, 181, 66, - 22, 213, 98, 179, 0, 243, 4, 124, 134, 213, 66, 178, 177, 80, 132, 105, - 182, 188, 248, 53, 144, 146, 65, 69, 209, 117, 138, 77, 171, 44, 27, 35, - 169, 201, 42, 182, 42, 217, 187, 81, 190, 201, 41, 62, 224, 88, 181, 83, - 47, 142, 139, 75, 215, 105, 194, 100, 14, 230, 10, 142, 138, 93, 171, 182, - 18, 187, 59, 39, 244, 241, 204, 162, 95, 154, 130, 103, 86, 85, 239, 49, - 118, 32, 194, 192, 92, 113, 135, 229, 25, 250, 180, 203, 209, 37, 11, 241, - 111, 51, 85, 36, 249, 57, 163, 54, 20, 234, 200, 140, 231, 186, 228, 75, - 195, 80, 165, 59, 144, 118, 219, 152, 218, 254, 111, 185, 153, 237, 255, 246, - 165, 214, 188, 40, 26, 251, 36, 12, 211, 202, 67, 252, 105, 126, 245, 111, - 144, 49, 110, 81, 229, 134, 25, 223, 110, 111, 155, 242, 188, 148, 17, 95, - 4, 82, 212, 105, 125, 224, 145, 164, 89, 185, 233, 140, 196, 255, 77, 99, - 243, 50, 175, 172, 181, 121, 1, 160, 124, 52, 72, 178, 64, 223, 107, 197, - 107, 2, 196, 118, 198, 255, 56, 97, 252, 104, 209, 117, 124, 191, 99, 82, - 199, 48, 127, 73, 207, 10, 190, 95, 146, 58, 74, 67, 226, 9, 136, 200, - 12, 189, 30, 12, 155, 37, 97, 32, 238, 70, 44, 230, 34, 112, 87, 98, - 185, 125, 11, 54, 201, 66, 91, 105, 103, 232, 243, 157, 192, 13, 132, 146, - 52, 221, 148, 68, 135, 243, 60, 214, 231, 127, 22, 214, 239, 131, 236, 207, - 153, 153, 55, 86, 188, 9, 199, 91, 81, 60, 191, 21, 138, 231, 122, 127, - 101, 82, 246, 56, 79, 217, 227, 47, 78, 217, 176, 17, 252, 60, 178, 254, - 44, 76, 223, 174, 250, 77, 155, 170, 173, 52, 61, 190, 21, 77, 143, 53, - 77, 155, 251, 217, 113, 158, 166, 199, 95, 156, 166, 185, 195, 255, 25, 52, - 223, 5, 187, 91, 145, 123, 43, 106, 30, 107, 106, 134, 105, 208, 109, 86, - 22, 104, 167, 85, 17, 219, 125, 232, 205, 8, 5, 215, 95, 31, 173, 93, - 20, 185, 40, 120, 155, 101, 5, 205, 185, 110, 89, 161, 239, 110, 227, 246, - 13, 166, 188, 159, 211, 98, 183, 113, 203, 54, 179, 110, 251, 181, 173, 110, - 222, 190, 209, 205, 107, 219, 124, 67, 147, 155, 183, 108, 113, 243, 218, 6, - 243, 197, 197, 23, 153, 86, 124, 145, 178, 152, 144, 64, 62, 191, 128, 158, - 252, 154, 118, 90, 120, 205, 165, 231, 103, 156, 84, 200, 5, 206, 182, 106, - 183, 12, 124, 50, 61, 204, 251, 40, 51, 7, 240, 82, 122, 219, 46, 39, - 23, 146, 191, 52, 119, 105, 227, 54, 82, 207, 149, 95, 232, 247, 168, 185, - 191, 191, 243, 86, 239, 227, 38, 230, 6, 120, 178, 190, 3, 158, 124, 222, - 22, 56, 139, 234, 249, 44, 184, 204, 108, 229, 146, 110, 243, 183, 158, 31, - 215, 63, 210, 123, 52, 187, 126, 147, 124, 103, 180, 95, 87, 243, 86, 14, - 54, 49, 182, 200, 124, 47, 243, 101, 144, 128, 123, 162, 255, 4, 189, 241, - 253, 212, 189, 233, 205, 184, 110, 203, 208, 27, 225, 229, 110, 244, 246, 200, - 36, 183, 40, 127, 109, 141, 227, 235, 47, 132, 231, 168, 191, 24, 71, 255, - 169, 27, 235, 173, 181, 111, 160, 179, 71, 91, 85, 24, 82, 244, 71, 253, - 205, 232, 39, 116, 221, 113, 186, 239, 152, 248, 39, 124, 230, 7, 128, 146, - 190, 236, 116, 151, 243, 87, 101, 75, 1, 133, 240, 255, 200, 212, 191, 177, - 21, 219, 217, 192, 78, 118, 124, 202, 88, 175, 26, 71, 236, 38, 224, 136, - 163, 147, 86, 160, 87, 220, 60, 106, 85, 104, 196, 168, 6, 149, 55, 131, - 232, 117, 60, 127, 22, 154, 95, 73, 63, 214, 45, 39, 255, 164, 163, 197, - 233, 140, 232, 185, 119, 203, 147, 197, 157, 237, 244, 76, 157, 110, 222, 160, - 20, 147, 152, 84, 236, 59, 7, 206, 99, 231, 137, 190, 252, 226, 131, 69, - 28, 19, 17, 16, 62, 45, 218, 166, 203, 142, 74, 74, 110, 181, 181, 131, - 19, 76, 61, 47, 110, 82, 197, 217, 29, 47, 136, 149, 121, 176, 232, 14, - 253, 33, 116, 113, 80, 221, 110, 58, 154, 244, 212, 237, 145, 244, 27, 250, - 227, 88, 15, 156, 235, 116, 249, 183, 201, 39, 141, 242, 252, 122, 125, 140, - 146, 98, 27, 120, 81, 102, 188, 132, 127, 136, 142, 129, 232, 230, 109, 199, - 99, 218, 24, 34, 193, 218, 62, 253, 125, 82, 200, 182, 49, 57, 236, 219, - 216, 16, 165, 72, 128, 6, 136, 162, 67, 82, 121, 185, 184, 163, 143, 248, - 138, 109, 162, 189, 68, 123, 248, 161, 19, 20, 6, 94, 15, 30, 236, 40, - 121, 233, 238, 150, 139, 157, 71, 197, 135, 149, 213, 6, 151, 37, 197, 224, - 56, 94, 89, 241, 72, 148, 121, 105, 50, 212, 172, 34, 202, 178, 34, 184, - 246, 114, 144, 59, 175, 227, 230, 167, 7, 197, 122, 174, 234, 3, 88, 227, - 157, 143, 139, 215, 142, 136, 215, 39, 247, 191, 235, 160, 248, 134, 166, 254, - 219, 143, 139, 51, 152, 220, 64, 7, 183, 56, 246, 253, 172, 67, 94, 62, - 220, 77, 14, 123, 141, 67, 94, 71, 142, 120, 241, 83, 221, 126, 112, 251, - 192, 60, 192, 8, 215, 78, 110, 195, 47, 126, 116, 27, 132, 255, 129, 195, - 219, 107, 43, 221, 192, 86, 31, 220, 124, 124, 27, 110, 59, 191, 253, 195, - 64, 104, 148, 191, 254, 141, 190, 244, 237, 239, 79, 111, 255, 211, 138, 130, - 27, 91, 176, 1, 167, 127, 108, 67, 41, 85, 230, 54, 159, 220, 32, 149, - 37, 131, 255, 139, 129, 222, 233, 154, 63, 133, 41, 59, 83, 184, 47, 130, - 223, 122, 210, 199, 44, 50, 149, 249, 207, 20, 70, 6, 220, 213, 63, 23, - 175, 92, 207, 45, 77, 210, 126, 185, 238, 98, 17, 170, 181, 187, 64, 8, - 173, 89, 188, 82, 111, 91, 144, 105, 211, 223, 231, 203, 76, 100, 110, 178, - 246, 171, 20, 211, 86, 171, 179, 232, 79, 81, 19, 97, 77, 220, 205, 178, - 225, 191, 95, 83, 196, 104, 76, 2, 253, 86, 27, 55, 32, 231, 70, 5, - 133, 217, 23, 159, 248, 34, 100, 255, 111, 65, 225, 90, 107, 238, 138, 195, - 91, 40, 121, 196, 193, 240, 118, 154, 121, 156, 241, 238, 150, 22, 40, 118, - 27, 83, 139, 221, 5, 244, 26, 185, 146, 235, 142, 205, 110, 171, 147, 249, - 217, 26, 41, 215, 234, 100, 26, 26, 41, 127, 150, 34, 38, 156, 51, 221, - 182, 167, 189, 68, 141, 239, 62, 93, 94, 86, 185, 199, 70, 199, 123, 183, - 237, 121, 239, 166, 177, 186, 179, 82, 205, 103, 169, 212, 160, 194, 219, 168, - 212, 112, 195, 174, 109, 249, 111, 179, 219, 225, 94, 212, 159, 239, 142, 125, - 170, 96, 75, 35, 13, 252, 254, 54, 187, 169, 145, 243, 187, 180, 114, 22, - 69, 119, 80, 170, 5, 244, 219, 52, 113, 126, 109, 27, 171, 134, 92, 65, - 44, 33, 39, 87, 128, 73, 220, 159, 127, 191, 91, 156, 207, 103, 216, 145, - 253, 155, 44, 122, 180, 107, 157, 222, 245, 4, 154, 136, 17, 213, 173, 167, - 8, 232, 247, 45, 12, 123, 18, 49, 141, 242, 235, 195, 131, 141, 57, 1, - 175, 20, 148, 47, 234, 205, 221, 70, 237, 233, 78, 249, 178, 74, 143, 21, - 231, 106, 155, 170, 147, 9, 88, 229, 184, 173, 126, 246, 103, 40, 103, 47, - 171, 141, 218, 222, 99, 97, 53, 250, 201, 186, 86, 89, 219, 96, 54, 127, - 150, 178, 246, 125, 116, 132, 63, 3, 7, 204, 166, 80, 231, 109, 216, 20, - 183, 237, 186, 78, 95, 126, 113, 249, 231, 239, 255, 249, 157, 207, 230, 38, - 108, 198, 236, 229, 173, 118, 57, 151, 169, 92, 118, 104, 253, 77, 76, 70, - 55, 184, 115, 242, 166, 211, 241, 85, 183, 183, 152, 177, 119, 152, 198, 113, - 59, 158, 16, 199, 28, 133, 212, 137, 227, 182, 235, 92, 54, 156, 171, 134, - 115, 233, 58, 87, 244, 220, 116, 174, 228, 204, 236, 242, 181, 115, 149, 158, - 152, 61, 155, 242, 233, 4, 131, 32, 222, 20, 198, 24, 5, 79, 59, 186, - 18, 124, 229, 207, 197, 214, 28, 65, 164, 213, 182, 93, 184, 130, 128, 129, - 46, 126, 175, 26, 109, 183, 209, 40, 109, 161, 49, 179, 245, 124, 166, 235, - 16, 98, 192, 91, 248, 111, 163, 144, 237, 93, 226, 13, 216, 109, 187, 218, - 27, 112, 209, 61, 134, 15, 118, 229, 20, 2, 110, 130, 29, 86, 189, 107, - 52, 86, 201, 9, 140, 116, 16, 161, 195, 66, 118, 164, 41, 240, 132, 60, - 146, 102, 19, 36, 190, 4, 250, 224, 95, 241, 72, 199, 86, 153, 224, 85, - 225, 150, 1, 94, 4, 213, 193, 157, 58, 159, 209, 107, 167, 219, 167, 74, - 127, 105, 172, 136, 152, 166, 82, 89, 205, 113, 217, 27, 139, 97, 145, 195, - 125, 24, 122, 52, 131, 169, 15, 252, 107, 106, 90, 74, 227, 228, 51, 91, - 40, 36, 46, 198, 110, 121, 41, 109, 128, 111, 22, 178, 149, 41, 85, 68, - 215, 212, 65, 148, 250, 190, 71, 142, 106, 182, 62, 213, 69, 71, 48, 35, - 48, 138, 174, 178, 121, 42, 186, 237, 182, 155, 183, 122, 202, 24, 146, 119, - 206, 172, 201, 171, 246, 146, 102, 179, 19, 188, 58, 91, 89, 33, 173, 18, - 46, 237, 209, 151, 110, 189, 232, 226, 181, 56, 121, 101, 109, 58, 119, 58, - 247, 198, 56, 1, 78, 90, 221, 157, 249, 131, 110, 47, 26, 71, 51, 62, - 34, 92, 155, 250, 67, 179, 237, 124, 60, 56, 70, 148, 111, 129, 178, 62, - 11, 85, 127, 96, 250, 65, 169, 140, 216, 132, 39, 152, 97, 84, 8, 200, - 118, 141, 207, 180, 73, 109, 162, 208, 109, 228, 156, 237, 9, 72, 249, 96, - 143, 254, 20, 242, 61, 76, 92, 152, 80, 150, 60, 153, 222, 216, 187, 236, - 48, 229, 122, 96, 149, 109, 38, 72, 187, 178, 230, 74, 71, 252, 88, 151, - 249, 115, 5, 254, 66, 16, 16, 40, 94, 41, 14, 142, 177, 138, 107, 53, - 171, 103, 213, 107, 124, 58, 144, 53, 174, 175, 243, 248, 226, 24, 225, 23, - 126, 90, 142, 163, 97, 121, 249, 23, 68, 153, 174, 243, 99, 177, 227, 208, - 198, 169, 178, 178, 118, 146, 156, 218, 123, 4, 162, 32, 208, 255, 34, 51, - 108, 34, 128, 158, 199, 142, 93, 250, 30, 109, 25, 105, 193, 234, 74, 28, - 60, 39, 121, 23, 127, 249, 41, 29, 32, 187, 254, 152, 250, 219, 60, 95, - 64, 210, 145, 32, 206, 198, 225, 62, 195, 98, 199, 148, 217, 161, 23, 160, - 252, 193, 244, 240, 154, 109, 131, 114, 180, 151, 107, 137, 225, 248, 144, 189, - 3, 91, 127, 88, 234, 103, 193, 81, 189, 233, 65, 255, 46, 2, 118, 3, - 43, 255, 226, 229, 96, 79, 94, 249, 119, 48, 142, 60, 124, 232, 71, 11, - 248, 94, 94, 213, 10, 130, 138, 212, 18, 241, 186, 174, 22, 191, 150, 206, - 194, 231, 6, 203, 110, 137, 19, 154, 66, 204, 209, 211, 16, 248, 83, 133, - 183, 41, 21, 57, 169, 116, 4, 55, 11, 112, 206, 189, 40, 125, 245, 21, - 220, 42, 32, 160, 103, 88, 162, 13, 148, 148, 88, 132, 216, 204, 250, 253, - 174, 189, 252, 87, 166, 84, 226, 173, 156, 218, 245, 47, 162, 217, 241, 181, - 112, 27, 206, 83, 142, 14, 162, 193, 177, 195, 244, 155, 170, 120, 154, 84, - 241, 244, 76, 188, 128, 247, 85, 55, 154, 105, 55, 250, 215, 119, 163, 191, - 185, 142, 254, 141, 221, 216, 8, 119, 99, 55, 110, 170, 98, 189, 27, 49, - 18, 218, 25, 108, 153, 80, 113, 121, 52, 179, 85, 152, 33, 60, 151, 224, - 162, 36, 147, 67, 5, 155, 151, 44, 252, 82, 250, 186, 153, 203, 67, 68, - 165, 115, 208, 163, 122, 98, 10, 43, 125, 189, 119, 72, 124, 166, 159, 54, - 163, 255, 31, 108, 70, 158, 35, 93, 56, 35, 167, 239, 196, 180, 114, 168, - 167, 179, 85, 33, 246, 17, 98, 1, 178, 103, 145, 197, 2, 21, 82, 242, - 52, 44, 94, 156, 90, 197, 17, 253, 237, 211, 223, 152, 253, 246, 107, 223, - 226, 167, 161, 123, 170, 110, 76, 46, 118, 138, 163, 157, 98, 127, 167, 24, - 211, 31, 244, 186, 94, 228, 206, 87, 86, 167, 150, 139, 63, 161, 68, 22, - 129, 71, 146, 52, 66, 7, 187, 10, 225, 1, 114, 4, 65, 240, 7, 110, - 81, 199, 116, 99, 54, 51, 47, 185, 195, 105, 78, 163, 177, 55, 91, 91, - 171, 244, 13, 15, 77, 79, 206, 144, 10, 88, 119, 112, 0, 50, 24, 204, - 179, 213, 104, 95, 65, 172, 60, 215, 60, 19, 43, 43, 126, 82, 190, 11, - 88, 148, 106, 106, 7, 125, 144, 218, 51, 229, 55, 216, 58, 223, 208, 208, - 172, 248, 179, 225, 122, 106, 124, 178, 108, 194, 185, 140, 195, 63, 187, 238, - 138, 80, 171, 140, 36, 105, 243, 176, 155, 49, 154, 68, 84, 159, 165, 11, - 15, 70, 176, 51, 160, 221, 69, 85, 238, 171, 228, 1, 219, 243, 90, 109, - 43, 174, 33, 158, 119, 123, 227, 5, 187, 65, 131, 133, 116, 120, 46, 242, - 90, 135, 196, 93, 78, 96, 31, 207, 240, 114, 222, 245, 62, 14, 147, 183, - 204, 208, 0, 136, 121, 69, 137, 149, 243, 199, 191, 190, 135, 255, 202, 228, - 70, 150, 251, 205, 159, 124, 67, 42, 188, 70, 4, 150, 198, 116, 37, 95, - 187, 217, 216, 123, 2, 1, 56, 105, 81, 219, 125, 92, 219, 87, 11, 74, - 210, 176, 182, 91, 123, 188, 79, 226, 68, 190, 103, 74, 212, 13, 98, 70, - 49, 73, 10, 0, 71, 52, 203, 18, 47, 245, 148, 31, 72, 220, 5, 204, - 68, 20, 134, 220, 75, 224, 240, 110, 103, 6, 152, 187, 155, 244, 146, 214, - 13, 241, 200, 233, 207, 55, 118, 81, 73, 22, 36, 15, 67, 173, 77, 167, - 105, 133, 61, 241, 160, 93, 108, 114, 71, 60, 218, 170, 98, 65, 82, 137, - 45, 181, 252, 228, 229, 66, 132, 106, 32, 146, 90, 158, 195, 209, 84, 187, - 184, 20, 135, 135, 193, 171, 14, 73, 4, 36, 91, 144, 180, 240, 88, 187, - 219, 234, 179, 152, 249, 174, 189, 236, 157, 207, 230, 229, 139, 17, 145, 22, - 1, 126, 231, 200, 31, 162, 16, 18, 175, 91, 253, 75, 56, 32, 146, 251, - 55, 248, 223, 106, 47, 47, 86, 214, 168, 13, 71, 86, 253, 246, 178, 191, - 178, 46, 186, 204, 235, 138, 203, 65, 48, 23, 175, 185, 54, 237, 27, 46, - 156, 226, 136, 166, 54, 201, 33, 7, 152, 36, 43, 51, 48, 82, 199, 122, - 51, 139, 122, 140, 39, 140, 64, 201, 46, 134, 19, 187, 196, 226, 212, 197, - 202, 190, 164, 159, 145, 252, 244, 89, 182, 226, 96, 72, 225, 132, 51, 155, - 145, 216, 225, 189, 8, 228, 157, 32, 179, 176, 59, 246, 192, 97, 2, 47, - 100, 210, 143, 32, 16, 253, 82, 227, 139, 24, 100, 156, 70, 115, 217, 74, - 170, 96, 118, 84, 144, 189, 66, 199, 133, 238, 133, 219, 94, 194, 49, 131, - 235, 20, 47, 216, 23, 92, 119, 148, 166, 136, 119, 184, 110, 63, 77, 233, - 179, 131, 184, 137, 101, 123, 253, 126, 87, 215, 79, 164, 116, 90, 184, 108, - 171, 219, 201, 162, 109, 43, 71, 80, 201, 59, 230, 238, 239, 198, 123, 139, - 222, 79, 11, 127, 79, 82, 46, 119, 104, 140, 234, 69, 106, 12, 125, 248, - 71, 146, 124, 165, 146, 71, 72, 254, 103, 146, 252, 187, 153, 124, 90, 152, - 13, 207, 105, 32, 9, 69, 206, 75, 130, 228, 20, 175, 156, 226, 239, 252, - 161, 125, 146, 32, 8, 78, 159, 244, 55, 250, 82, 46, 254, 221, 41, 254, - 195, 41, 254, 211, 41, 82, 105, 120, 90, 75, 48, 34, 14, 215, 236, 66, - 166, 127, 96, 116, 13, 132, 177, 200, 164, 162, 189, 219, 63, 160, 125, 216, - 92, 230, 225, 20, 9, 157, 27, 225, 108, 249, 192, 112, 240, 45, 11, 106, - 153, 140, 169, 115, 249, 138, 24, 98, 250, 122, 149, 125, 253, 253, 213, 74, - 141, 58, 207, 159, 66, 202, 42, 130, 112, 96, 165, 60, 130, 222, 10, 34, - 121, 166, 252, 173, 77, 51, 80, 165, 165, 25, 139, 173, 194, 185, 31, 155, - 185, 0, 136, 147, 50, 208, 36, 137, 24, 39, 241, 169, 70, 58, 11, 132, - 170, 225, 211, 48, 117, 93, 138, 186, 49, 47, 211, 81, 24, 117, 218, 216, - 207, 37, 62, 74, 37, 56, 32, 21, 58, 110, 174, 10, 187, 253, 0, 14, - 188, 123, 126, 118, 128, 79, 146, 78, 159, 209, 160, 16, 117, 17, 98, 64, - 77, 132, 16, 80, 15, 33, 194, 74, 92, 231, 237, 246, 253, 12, 55, 76, - 9, 128, 150, 103, 53, 133, 185, 210, 29, 218, 119, 95, 212, 40, 141, 39, - 59, 13, 147, 253, 150, 74, 134, 196, 108, 22, 204, 214, 159, 19, 175, 131, - 171, 127, 127, 106, 185, 21, 27, 77, 173, 214, 172, 19, 128, 84, 142, 84, - 83, 52, 17, 47, 90, 25, 8, 231, 59, 160, 173, 173, 228, 14, 39, 101, - 143, 219, 197, 252, 216, 72, 232, 157, 98, 2, 47, 205, 146, 36, 25, 248, - 43, 167, 176, 126, 89, 186, 141, 157, 180, 28, 130, 195, 158, 240, 147, 242, - 12, 216, 205, 32, 166, 219, 159, 121, 23, 146, 51, 223, 166, 98, 150, 12, - 86, 121, 178, 72, 179, 22, 114, 212, 145, 214, 94, 48, 136, 196, 28, 126, - 137, 207, 35, 68, 194, 231, 0, 58, 144, 252, 12, 179, 173, 106, 189, 132, - 192, 52, 79, 56, 160, 101, 103, 10, 219, 240, 166, 118, 169, 22, 140, 54, - 125, 236, 166, 109, 89, 217, 86, 25, 163, 160, 210, 83, 60, 216, 86, 69, - 71, 171, 17, 26, 205, 206, 69, 197, 49, 184, 81, 187, 109, 87, 156, 220, - 102, 49, 210, 217, 48, 72, 136, 219, 151, 86, 210, 89, 31, 163, 2, 187, - 165, 51, 200, 15, 110, 228, 82, 172, 192, 15, 157, 129, 210, 44, 138, 11, - 6, 74, 179, 40, 230, 200, 51, 235, 128, 83, 36, 193, 209, 75, 209, 173, - 106, 151, 159, 185, 233, 73, 18, 134, 55, 159, 195, 161, 110, 76, 93, 93, - 99, 11, 188, 26, 20, 155, 142, 98, 200, 201, 7, 167, 81, 131, 103, 139, - 202, 106, 157, 107, 72, 145, 150, 46, 146, 124, 72, 138, 192, 45, 41, 85, - 11, 88, 73, 213, 70, 123, 149, 159, 193, 157, 199, 251, 143, 204, 230, 106, - 122, 80, 46, 128, 85, 73, 235, 244, 33, 45, 173, 105, 31, 234, 197, 28, - 100, 219, 130, 199, 121, 125, 6, 151, 35, 30, 231, 75, 16, 207, 135, 245, - 198, 47, 202, 192, 53, 33, 103, 119, 108, 14, 75, 76, 242, 63, 124, 14, - 127, 56, 99, 79, 61, 180, 222, 135, 254, 69, 55, 201, 32, 1, 167, 214, - 248, 85, 38, 207, 102, 158, 165, 61, 138, 92, 199, 179, 154, 27, 121, 22, - 128, 231, 248, 22, 146, 114, 188, 43, 97, 83, 153, 236, 219, 89, 85, 6, - 196, 38, 118, 101, 18, 122, 6, 166, 73, 231, 25, 40, 240, 174, 104, 96, - 33, 156, 228, 241, 146, 74, 58, 95, 132, 3, 154, 243, 162, 81, 80, 222, - 111, 243, 117, 26, 153, 192, 40, 82, 223, 173, 38, 73, 82, 255, 115, 52, - 185, 54, 9, 63, 100, 187, 102, 145, 176, 136, 168, 155, 203, 238, 212, 155, - 143, 186, 179, 222, 10, 205, 236, 82, 106, 109, 56, 249, 221, 12, 33, 149, - 108, 104, 182, 118, 132, 246, 102, 24, 57, 233, 244, 69, 167, 205, 139, 234, - 80, 144, 112, 102, 29, 236, 33, 212, 57, 171, 66, 59, 25, 166, 49, 90, - 225, 93, 74, 253, 165, 177, 114, 236, 215, 28, 36, 3, 2, 126, 178, 18, - 219, 142, 253, 74, 73, 241, 179, 148, 234, 112, 250, 43, 180, 32, 20, 74, - 107, 251, 133, 91, 51, 98, 142, 18, 145, 254, 127, 236, 189, 123, 127, 219, - 54, 178, 55, 254, 63, 95, 5, 163, 50, 213, 141, 146, 121, 145, 100, 217, - 14, 221, 109, 210, 109, 154, 103, 235, 60, 221, 180, 167, 79, 83, 199, 209, - 161, 37, 217, 98, 163, 139, 43, 202, 150, 100, 87, 239, 253, 55, 23, 0, - 4, 41, 82, 113, 98, 111, 123, 250, 251, 156, 237, 198, 34, 65, 220, 49, - 24, 12, 128, 153, 239, 252, 243, 6, 161, 43, 53, 245, 206, 220, 244, 236, - 134, 13, 21, 77, 179, 251, 181, 57, 153, 63, 246, 162, 184, 119, 78, 58, - 148, 61, 60, 211, 74, 185, 247, 225, 122, 245, 228, 230, 171, 55, 30, 78, - 47, 23, 163, 221, 251, 54, 105, 186, 17, 155, 222, 234, 53, 29, 147, 41, - 165, 118, 91, 184, 11, 121, 243, 253, 63, 205, 112, 124, 57, 35, 171, 169, - 100, 239, 134, 62, 16, 202, 5, 101, 6, 14, 157, 166, 129, 32, 67, 14, - 209, 228, 190, 135, 63, 154, 220, 236, 48, 154, 22, 193, 3, 224, 78, 48, - 211, 78, 71, 236, 250, 138, 11, 44, 80, 133, 33, 13, 108, 111, 176, 198, - 193, 48, 127, 191, 14, 65, 130, 66, 56, 34, 177, 243, 169, 167, 186, 215, - 54, 117, 70, 4, 33, 106, 219, 175, 141, 128, 58, 120, 6, 54, 148, 217, - 98, 226, 213, 9, 239, 47, 61, 218, 63, 74, 76, 109, 114, 137, 192, 173, - 161, 46, 102, 100, 109, 162, 21, 16, 65, 227, 160, 100, 167, 145, 241, 148, - 66, 179, 232, 176, 18, 196, 98, 175, 125, 144, 202, 84, 2, 67, 102, 115, - 42, 245, 162, 115, 70, 141, 80, 185, 159, 128, 200, 185, 177, 226, 146, 244, - 252, 158, 217, 96, 194, 174, 242, 206, 193, 3, 133, 8, 30, 162, 9, 108, - 6, 201, 141, 36, 238, 11, 143, 96, 227, 118, 4, 187, 182, 163, 187, 120, - 115, 100, 69, 147, 163, 59, 203, 125, 130, 222, 18, 27, 38, 188, 1, 87, - 71, 196, 54, 72, 252, 15, 88, 206, 235, 120, 217, 19, 162, 251, 0, 38, - 127, 223, 184, 48, 203, 199, 209, 69, 101, 29, 4, 142, 29, 217, 252, 228, - 226, 111, 84, 89, 217, 78, 53, 8, 224, 183, 14, 147, 177, 10, 252, 201, - 94, 85, 197, 23, 2, 145, 10, 208, 93, 19, 191, 120, 213, 58, 173, 164, - 213, 50, 119, 155, 65, 135, 43, 87, 51, 178, 15, 226, 251, 62, 3, 113, - 160, 177, 168, 85, 16, 120, 92, 212, 138, 10, 189, 168, 252, 86, 113, 32, - 119, 200, 15, 150, 117, 46, 251, 9, 212, 65, 132, 114, 198, 20, 138, 5, - 126, 249, 229, 111, 21, 25, 119, 109, 71, 84, 164, 186, 82, 84, 165, 34, - 227, 187, 69, 161, 99, 217, 240, 54, 184, 202, 217, 62, 210, 123, 63, 156, - 19, 250, 38, 236, 177, 151, 225, 252, 138, 245, 134, 33, 128, 118, 82, 192, - 76, 93, 246, 171, 232, 26, 79, 2, 220, 203, 58, 38, 225, 71, 120, 168, - 83, 140, 224, 35, 53, 150, 223, 107, 77, 204, 128, 144, 126, 87, 208, 189, - 34, 95, 12, 19, 157, 137, 248, 210, 107, 168, 228, 51, 231, 203, 47, 161, - 210, 248, 23, 67, 234, 24, 130, 221, 136, 16, 195, 73, 42, 146, 54, 201, - 119, 161, 197, 131, 90, 149, 107, 49, 50, 221, 220, 83, 162, 107, 188, 67, - 94, 32, 189, 223, 65, 21, 254, 128, 216, 127, 152, 183, 120, 72, 111, 110, - 154, 205, 230, 86, 216, 253, 46, 155, 69, 174, 209, 77, 70, 115, 38, 3, - 55, 134, 83, 36, 229, 175, 46, 28, 207, 4, 146, 161, 230, 119, 109, 85, - 120, 214, 55, 130, 253, 19, 98, 59, 79, 96, 122, 139, 118, 144, 22, 69, - 234, 70, 93, 158, 255, 137, 139, 117, 160, 83, 209, 114, 77, 113, 165, 127, - 157, 53, 137, 238, 211, 201, 210, 29, 179, 41, 7, 239, 222, 255, 16, 119, - 239, 208, 187, 176, 49, 21, 214, 21, 250, 7, 40, 99, 147, 186, 161, 47, - 234, 168, 107, 201, 253, 242, 46, 226, 209, 225, 67, 114, 229, 134, 122, 8, - 57, 138, 39, 253, 180, 3, 48, 85, 208, 252, 122, 74, 158, 201, 134, 168, - 53, 131, 189, 79, 174, 196, 42, 215, 187, 125, 97, 209, 57, 35, 16, 235, - 236, 106, 136, 142, 145, 82, 150, 0, 217, 204, 132, 35, 177, 17, 76, 140, - 41, 117, 146, 104, 9, 169, 31, 209, 125, 39, 54, 69, 57, 146, 91, 92, - 239, 178, 15, 22, 26, 50, 52, 102, 59, 180, 100, 176, 24, 175, 253, 212, - 6, 153, 89, 68, 200, 72, 145, 166, 244, 3, 119, 236, 72, 23, 112, 248, - 52, 24, 94, 97, 144, 182, 244, 244, 183, 206, 247, 164, 18, 67, 22, 123, - 252, 190, 103, 153, 89, 71, 84, 84, 102, 208, 105, 33, 210, 205, 86, 37, - 183, 14, 42, 59, 45, 117, 76, 41, 220, 245, 202, 245, 197, 114, 213, 2, - 147, 250, 226, 39, 95, 252, 99, 237, 228, 50, 175, 109, 132, 128, 142, 94, - 234, 32, 255, 149, 229, 173, 44, 223, 68, 209, 132, 213, 100, 68, 7, 243, - 218, 149, 176, 216, 236, 133, 3, 74, 245, 196, 185, 238, 104, 155, 85, 221, - 163, 83, 72, 130, 192, 129, 16, 79, 11, 241, 40, 196, 87, 33, 180, 238, - 158, 58, 120, 74, 141, 174, 66, 133, 71, 118, 252, 143, 176, 139, 33, 95, - 234, 216, 254, 120, 118, 61, 128, 209, 39, 139, 14, 27, 170, 24, 207, 198, - 209, 32, 186, 88, 155, 50, 69, 123, 231, 125, 104, 122, 29, 207, 27, 107, - 53, 195, 72, 232, 17, 6, 124, 5, 50, 79, 58, 55, 237, 232, 95, 203, - 79, 203, 6, 111, 150, 243, 242, 201, 191, 78, 134, 249, 54, 26, 196, 184, - 248, 254, 195, 105, 248, 188, 254, 194, 115, 107, 99, 102, 101, 61, 8, 165, - 30, 92, 198, 102, 135, 228, 74, 233, 176, 70, 139, 101, 212, 143, 3, 244, - 124, 117, 78, 96, 240, 136, 101, 207, 39, 66, 207, 154, 166, 99, 84, 156, - 35, 4, 101, 52, 134, 115, 152, 179, 205, 166, 217, 164, 69, 169, 137, 104, - 244, 46, 173, 53, 218, 154, 81, 127, 6, 217, 136, 4, 16, 142, 92, 20, - 83, 80, 124, 92, 159, 60, 179, 14, 169, 8, 142, 30, 55, 85, 153, 212, - 115, 114, 165, 177, 231, 241, 221, 56, 47, 65, 184, 72, 54, 188, 118, 103, - 235, 250, 74, 250, 213, 69, 231, 179, 254, 0, 239, 149, 234, 180, 56, 54, - 219, 242, 102, 202, 171, 141, 72, 10, 169, 26, 80, 212, 202, 246, 212, 2, - 5, 85, 2, 1, 47, 192, 123, 120, 148, 62, 140, 58, 221, 227, 52, 155, - 164, 56, 209, 64, 40, 125, 92, 71, 233, 94, 4, 50, 186, 149, 15, 120, - 179, 19, 202, 151, 149, 129, 238, 150, 205, 138, 71, 118, 145, 30, 94, 191, - 140, 96, 81, 231, 95, 156, 86, 115, 252, 236, 67, 123, 54, 2, 191, 146, - 137, 216, 199, 251, 153, 22, 124, 17, 152, 251, 76, 199, 12, 73, 107, 88, - 232, 118, 225, 55, 127, 0, 93, 214, 164, 141, 6, 110, 56, 60, 33, 6, - 232, 119, 51, 6, 11, 75, 22, 18, 1, 30, 205, 215, 81, 166, 202, 167, - 105, 209, 189, 192, 214, 182, 141, 248, 182, 87, 234, 156, 133, 122, 99, 231, - 167, 44, 4, 129, 227, 2, 51, 10, 96, 105, 247, 67, 98, 129, 98, 215, - 158, 20, 125, 138, 60, 239, 124, 70, 222, 76, 19, 87, 74, 156, 84, 83, - 183, 76, 214, 119, 114, 140, 135, 50, 50, 46, 15, 114, 229, 80, 107, 254, - 69, 52, 103, 230, 27, 166, 150, 255, 104, 203, 79, 171, 182, 230, 168, 136, - 246, 206, 218, 72, 135, 189, 125, 194, 77, 77, 229, 135, 206, 73, 9, 77, - 57, 22, 69, 167, 225, 86, 83, 9, 109, 244, 248, 169, 249, 103, 98, 48, - 86, 94, 245, 50, 62, 124, 188, 35, 255, 168, 133, 254, 122, 112, 86, 213, - 101, 143, 121, 169, 72, 64, 38, 104, 71, 234, 147, 45, 41, 253, 167, 69, - 149, 224, 9, 208, 170, 225, 212, 67, 117, 44, 205, 248, 224, 13, 177, 163, - 153, 110, 117, 195, 54, 131, 208, 4, 74, 192, 205, 222, 227, 103, 97, 179, - 76, 123, 63, 15, 7, 208, 95, 249, 38, 231, 8, 157, 62, 28, 15, 244, - 69, 218, 50, 244, 18, 83, 238, 169, 100, 153, 92, 20, 208, 6, 197, 228, - 44, 248, 162, 172, 48, 255, 244, 93, 40, 222, 131, 110, 116, 195, 188, 100, - 87, 34, 148, 23, 112, 43, 15, 28, 160, 111, 160, 6, 114, 147, 92, 102, - 32, 5, 227, 11, 204, 169, 120, 212, 52, 235, 228, 63, 3, 24, 14, 130, - 44, 182, 207, 12, 156, 229, 228, 39, 166, 143, 19, 190, 213, 192, 133, 167, - 143, 49, 145, 71, 160, 139, 13, 226, 1, 34, 192, 197, 0, 54, 249, 195, - 73, 218, 76, 44, 0, 165, 150, 67, 208, 17, 21, 24, 159, 54, 58, 13, - 244, 207, 65, 53, 193, 114, 41, 170, 47, 3, 154, 152, 85, 27, 141, 125, - 59, 103, 194, 147, 7, 61, 210, 117, 109, 231, 140, 20, 122, 232, 236, 107, - 44, 43, 248, 208, 140, 98, 140, 219, 55, 26, 20, 155, 58, 129, 34, 83, - 14, 240, 143, 130, 107, 248, 219, 58, 51, 42, 238, 123, 7, 254, 195, 191, - 46, 41, 50, 113, 44, 250, 72, 0, 218, 162, 109, 162, 110, 124, 22, 68, - 187, 78, 220, 7, 33, 12, 183, 207, 91, 79, 118, 253, 105, 57, 101, 242, - 249, 25, 194, 26, 45, 166, 192, 105, 73, 121, 108, 43, 157, 17, 47, 17, - 110, 101, 241, 64, 114, 185, 41, 217, 37, 188, 13, 132, 191, 3, 250, 27, - 111, 74, 192, 238, 96, 70, 78, 103, 11, 164, 7, 88, 82, 81, 211, 54, - 100, 66, 65, 250, 245, 190, 33, 18, 250, 198, 212, 137, 23, 8, 8, 22, - 22, 222, 200, 228, 42, 198, 161, 239, 42, 210, 112, 238, 41, 21, 160, 124, - 239, 101, 180, 124, 115, 108, 82, 101, 220, 150, 193, 109, 118, 78, 125, 77, - 44, 11, 207, 48, 34, 246, 219, 197, 154, 173, 4, 188, 206, 144, 235, 210, - 124, 55, 113, 228, 44, 138, 206, 81, 146, 250, 15, 234, 65, 137, 14, 32, - 75, 205, 91, 58, 59, 154, 158, 247, 200, 183, 120, 124, 236, 144, 99, 99, - 226, 6, 189, 73, 52, 213, 223, 194, 213, 182, 127, 207, 127, 202, 76, 212, - 214, 106, 183, 234, 197, 43, 97, 5, 206, 59, 21, 114, 57, 156, 48, 100, - 236, 27, 81, 43, 214, 144, 133, 207, 52, 106, 106, 25, 16, 124, 87, 238, - 23, 100, 82, 149, 189, 150, 247, 142, 19, 36, 213, 218, 0, 100, 14, 84, - 35, 80, 205, 13, 156, 167, 226, 56, 73, 181, 25, 181, 93, 159, 22, 233, - 36, 202, 62, 220, 253, 213, 108, 177, 238, 173, 136, 117, 161, 109, 36, 47, - 162, 113, 22, 69, 1, 131, 204, 60, 107, 252, 98, 109, 110, 109, 64, 190, - 197, 212, 185, 202, 218, 98, 97, 155, 163, 31, 109, 82, 109, 75, 147, 34, - 119, 29, 110, 103, 128, 156, 97, 13, 93, 32, 193, 82, 122, 221, 14, 162, - 192, 124, 162, 105, 254, 200, 238, 7, 16, 175, 21, 10, 153, 192, 94, 17, - 72, 119, 54, 137, 22, 236, 252, 61, 169, 111, 206, 238, 244, 34, 109, 22, - 1, 203, 26, 119, 66, 10, 53, 33, 19, 33, 13, 169, 80, 165, 4, 164, - 164, 147, 81, 163, 79, 224, 197, 125, 206, 180, 244, 75, 64, 198, 16, 71, - 230, 219, 96, 221, 24, 225, 195, 155, 0, 213, 98, 42, 191, 188, 247, 234, - 111, 223, 123, 213, 35, 51, 12, 72, 165, 166, 242, 214, 254, 5, 222, 162, - 139, 202, 155, 103, 129, 219, 165, 61, 69, 77, 98, 200, 246, 235, 158, 147, - 113, 146, 194, 16, 37, 213, 170, 221, 109, 195, 151, 240, 105, 5, 1, 250, - 33, 34, 30, 78, 85, 75, 250, 138, 201, 143, 176, 153, 38, 88, 128, 59, - 243, 244, 42, 28, 15, 161, 171, 240, 112, 0, 250, 84, 184, 28, 238, 137, - 80, 115, 99, 59, 207, 130, 222, 0, 70, 145, 248, 202, 51, 86, 198, 185, - 146, 223, 147, 179, 222, 12, 49, 188, 162, 2, 20, 53, 48, 107, 108, 208, - 72, 23, 160, 107, 164, 98, 136, 236, 53, 230, 180, 93, 55, 141, 77, 57, - 129, 240, 13, 77, 222, 169, 191, 251, 241, 103, 114, 120, 61, 38, 119, 176, - 232, 237, 122, 52, 195, 47, 173, 160, 63, 155, 141, 225, 161, 29, 252, 54, - 196, 128, 78, 112, 49, 14, 47, 225, 97, 63, 232, 95, 159, 15, 117, 151, - 214, 91, 51, 87, 117, 129, 118, 236, 155, 116, 67, 161, 38, 60, 119, 52, - 9, 225, 185, 17, 96, 51, 3, 67, 139, 255, 222, 195, 182, 198, 235, 138, - 39, 10, 173, 138, 228, 138, 184, 210, 185, 168, 177, 156, 107, 179, 58, 154, - 18, 11, 130, 234, 96, 48, 73, 50, 189, 203, 73, 212, 239, 197, 65, 201, - 250, 138, 253, 37, 246, 68, 36, 211, 170, 41, 114, 224, 128, 67, 83, 48, - 94, 230, 184, 90, 111, 44, 80, 199, 90, 240, 192, 37, 30, 169, 232, 210, - 234, 246, 65, 144, 121, 10, 25, 97, 46, 103, 118, 142, 96, 158, 51, 17, - 163, 121, 161, 129, 146, 172, 156, 60, 87, 81, 149, 45, 104, 157, 229, 96, - 195, 122, 73, 180, 161, 148, 13, 244, 102, 104, 219, 6, 81, 99, 218, 214, - 159, 97, 0, 21, 94, 178, 68, 214, 165, 130, 61, 242, 36, 176, 92, 243, - 36, 176, 60, 218, 241, 222, 193, 150, 247, 106, 56, 239, 195, 106, 252, 206, - 68, 69, 10, 58, 177, 174, 87, 162, 147, 70, 52, 169, 214, 48, 132, 149, - 42, 50, 49, 65, 184, 60, 73, 199, 244, 40, 102, 195, 188, 131, 41, 93, - 171, 88, 147, 186, 117, 82, 37, 39, 97, 8, 69, 73, 129, 200, 8, 172, - 147, 134, 53, 169, 110, 114, 55, 101, 64, 153, 200, 177, 229, 204, 182, 123, - 231, 184, 55, 196, 221, 120, 31, 189, 36, 176, 67, 212, 195, 156, 233, 94, - 20, 51, 5, 150, 3, 153, 127, 100, 218, 166, 173, 28, 144, 132, 81, 99, - 27, 248, 54, 8, 17, 89, 10, 248, 179, 39, 118, 57, 167, 133, 233, 2, - 163, 121, 212, 31, 141, 135, 92, 228, 116, 120, 13, 226, 228, 148, 138, 189, - 66, 167, 160, 131, 168, 79, 37, 139, 211, 247, 34, 150, 145, 95, 80, 49, - 159, 72, 0, 115, 208, 228, 4, 69, 111, 63, 63, 226, 252, 242, 220, 91, - 247, 207, 251, 115, 246, 173, 122, 202, 219, 136, 138, 195, 150, 53, 41, 120, - 31, 212, 135, 115, 197, 233, 0, 229, 218, 98, 54, 162, 233, 143, 10, 87, - 172, 201, 126, 132, 178, 246, 160, 144, 244, 98, 102, 37, 148, 37, 79, 8, - 197, 237, 245, 31, 102, 137, 110, 58, 209, 43, 118, 169, 128, 72, 222, 188, - 124, 174, 29, 99, 222, 215, 4, 230, 122, 26, 225, 202, 221, 67, 213, 163, - 121, 116, 206, 247, 148, 119, 222, 251, 206, 6, 219, 67, 221, 127, 202, 183, - 199, 117, 89, 45, 66, 50, 130, 122, 39, 213, 76, 224, 90, 160, 70, 73, - 29, 96, 230, 166, 140, 127, 10, 220, 255, 44, 102, 108, 29, 194, 243, 182, - 4, 19, 151, 146, 160, 43, 21, 200, 162, 36, 208, 91, 92, 88, 3, 33, - 38, 116, 90, 147, 175, 196, 168, 104, 212, 210, 199, 124, 198, 82, 139, 174, - 178, 172, 141, 106, 131, 234, 251, 138, 187, 231, 163, 246, 5, 150, 73, 65, - 79, 2, 107, 252, 222, 223, 36, 123, 153, 236, 46, 230, 71, 213, 147, 47, - 68, 229, 209, 247, 122, 36, 246, 54, 3, 109, 23, 83, 129, 109, 12, 157, - 9, 193, 22, 198, 134, 13, 76, 149, 110, 109, 97, 47, 101, 141, 109, 254, - 63, 110, 45, 51, 70, 32, 180, 185, 197, 78, 82, 215, 109, 68, 90, 189, - 217, 85, 216, 143, 22, 107, 236, 212, 61, 58, 87, 5, 130, 218, 179, 198, - 27, 163, 142, 215, 72, 77, 210, 1, 38, 75, 65, 242, 184, 120, 102, 78, - 110, 112, 251, 26, 114, 135, 247, 81, 53, 0, 53, 175, 83, 183, 57, 120, - 80, 167, 241, 169, 104, 165, 163, 64, 85, 66, 144, 150, 208, 142, 45, 60, - 121, 173, 185, 201, 35, 243, 153, 132, 152, 4, 2, 25, 80, 209, 14, 36, - 168, 66, 4, 56, 173, 64, 129, 60, 70, 87, 238, 140, 63, 86, 53, 210, - 53, 202, 152, 240, 136, 146, 161, 251, 51, 133, 231, 106, 81, 111, 93, 98, - 26, 203, 209, 32, 208, 198, 199, 156, 139, 241, 167, 145, 18, 103, 146, 38, - 157, 59, 10, 227, 179, 154, 56, 131, 163, 20, 48, 108, 59, 246, 148, 12, - 179, 5, 237, 69, 72, 81, 150, 220, 181, 51, 52, 213, 27, 175, 57, 218, - 61, 140, 255, 144, 129, 169, 172, 130, 10, 16, 48, 51, 233, 106, 17, 7, - 227, 26, 24, 170, 34, 116, 39, 77, 70, 125, 246, 134, 39, 88, 20, 67, - 102, 149, 146, 85, 43, 225, 186, 37, 23, 101, 81, 165, 228, 154, 73, 25, - 66, 165, 220, 51, 99, 101, 196, 78, 193, 170, 137, 158, 134, 53, 18, 115, - 219, 152, 53, 188, 134, 36, 87, 208, 120, 174, 252, 209, 172, 183, 6, 170, - 193, 198, 79, 104, 236, 116, 194, 238, 113, 41, 75, 118, 247, 124, 90, 198, - 169, 92, 62, 123, 18, 144, 195, 175, 233, 12, 103, 63, 95, 120, 27, 74, - 37, 98, 58, 139, 200, 9, 121, 188, 24, 244, 6, 195, 155, 136, 118, 145, - 199, 1, 239, 105, 233, 99, 47, 103, 163, 143, 46, 32, 65, 250, 24, 192, - 150, 136, 51, 216, 197, 27, 203, 73, 54, 169, 5, 235, 50, 188, 134, 157, - 80, 56, 165, 245, 74, 48, 77, 90, 175, 226, 112, 188, 248, 242, 106, 8, - 28, 126, 78, 75, 214, 21, 164, 143, 103, 83, 90, 48, 81, 155, 98, 215, - 226, 149, 148, 85, 188, 102, 81, 28, 36, 215, 54, 158, 32, 167, 94, 93, - 237, 213, 117, 236, 124, 148, 58, 95, 92, 115, 226, 250, 196, 74, 212, 34, - 133, 135, 249, 241, 155, 75, 111, 174, 126, 129, 138, 74, 19, 247, 186, 54, - 229, 54, 136, 86, 67, 138, 15, 100, 132, 24, 14, 162, 235, 24, 134, 5, - 175, 221, 80, 25, 136, 221, 200, 41, 157, 32, 237, 18, 238, 107, 66, 201, - 225, 62, 163, 228, 20, 21, 233, 241, 227, 131, 245, 10, 51, 69, 47, 84, - 124, 155, 169, 238, 91, 146, 253, 111, 56, 135, 173, 44, 236, 91, 75, 223, - 162, 49, 216, 15, 162, 156, 111, 176, 156, 31, 101, 57, 32, 139, 126, 61, - 63, 143, 22, 115, 212, 210, 72, 78, 171, 74, 54, 238, 157, 222, 204, 206, - 81, 33, 243, 249, 60, 26, 96, 202, 202, 143, 175, 94, 190, 124, 243, 245, - 15, 223, 149, 97, 119, 184, 95, 221, 177, 149, 225, 46, 8, 186, 137, 250, - 74, 182, 19, 2, 63, 61, 232, 98, 164, 114, 122, 180, 107, 228, 245, 178, - 102, 209, 219, 221, 28, 59, 210, 170, 193, 119, 54, 250, 69, 96, 113, 255, - 10, 45, 193, 45, 227, 85, 174, 185, 52, 233, 69, 51, 6, 225, 4, 80, - 86, 220, 204, 66, 173, 41, 105, 253, 77, 112, 199, 43, 184, 16, 189, 105, - 253, 254, 10, 85, 36, 201, 60, 9, 37, 244, 67, 16, 210, 141, 1, 94, - 117, 13, 142, 221, 175, 252, 195, 17, 252, 245, 14, 97, 129, 236, 47, 129, - 131, 55, 15, 14, 14, 106, 214, 155, 61, 218, 176, 91, 16, 13, 152, 88, - 69, 26, 55, 185, 103, 104, 120, 132, 71, 157, 119, 167, 253, 97, 52, 174, - 188, 218, 179, 250, 203, 234, 217, 134, 173, 101, 88, 10, 195, 68, 200, 198, - 147, 55, 241, 193, 53, 238, 196, 37, 29, 132, 85, 188, 26, 229, 144, 148, - 83, 173, 163, 218, 253, 92, 215, 221, 162, 63, 30, 42, 151, 148, 126, 8, - 78, 87, 246, 218, 190, 61, 107, 224, 181, 235, 233, 114, 207, 179, 71, 240, - 111, 176, 231, 157, 85, 143, 78, 227, 235, 9, 230, 84, 249, 161, 90, 181, - 7, 179, 69, 229, 7, 251, 212, 181, 151, 95, 120, 248, 175, 54, 250, 2, - 226, 156, 149, 80, 62, 128, 134, 192, 58, 19, 139, 85, 232, 108, 35, 188, - 149, 163, 51, 231, 91, 186, 184, 210, 12, 33, 168, 157, 83, 212, 27, 65, - 217, 35, 198, 133, 30, 246, 77, 151, 64, 135, 248, 8, 140, 151, 7, 133, - 62, 128, 200, 41, 174, 228, 225, 165, 125, 134, 208, 151, 43, 99, 8, 164, - 104, 146, 35, 196, 197, 168, 55, 142, 206, 97, 125, 56, 31, 94, 70, 211, - 138, 1, 85, 156, 93, 92, 152, 129, 16, 99, 43, 167, 102, 170, 182, 230, - 153, 61, 248, 194, 227, 193, 161, 95, 24, 30, 16, 122, 201, 213, 55, 105, - 112, 153, 175, 81, 79, 20, 123, 173, 36, 67, 4, 205, 96, 240, 27, 21, - 136, 149, 237, 245, 151, 20, 218, 95, 170, 224, 156, 169, 0, 81, 44, 79, - 126, 231, 245, 39, 48, 163, 147, 47, 128, 225, 153, 149, 104, 242, 133, 19, - 4, 248, 6, 21, 0, 74, 245, 42, 48, 142, 85, 116, 74, 46, 186, 29, - 95, 225, 19, 182, 26, 66, 95, 125, 209, 62, 50, 198, 48, 236, 248, 232, - 30, 25, 176, 59, 128, 109, 42, 170, 85, 87, 190, 240, 109, 8, 162, 182, - 164, 67, 175, 43, 16, 94, 5, 217, 36, 253, 1, 157, 127, 99, 228, 87, - 21, 232, 29, 28, 248, 87, 167, 16, 217, 61, 219, 19, 45, 171, 98, 45, - 92, 250, 238, 216, 226, 27, 6, 81, 11, 142, 132, 122, 100, 5, 115, 164, - 126, 254, 162, 85, 5, 126, 104, 188, 193, 182, 65, 102, 215, 169, 47, 13, - 119, 216, 104, 97, 51, 126, 192, 207, 167, 80, 246, 155, 179, 35, 227, 39, - 108, 5, 102, 252, 195, 153, 240, 238, 158, 232, 105, 218, 201, 132, 124, 150, - 215, 169, 232, 242, 93, 61, 195, 160, 3, 243, 130, 220, 90, 53, 40, 152, - 39, 194, 235, 138, 11, 45, 104, 224, 117, 107, 245, 200, 60, 65, 47, 243, - 216, 187, 63, 86, 109, 120, 129, 109, 176, 139, 90, 222, 39, 230, 177, 217, - 130, 106, 253, 2, 159, 127, 130, 225, 16, 35, 93, 51, 127, 60, 194, 149, - 187, 130, 10, 215, 191, 84, 159, 57, 24, 23, 159, 161, 231, 27, 248, 110, - 227, 73, 249, 34, 154, 94, 15, 43, 216, 170, 151, 162, 209, 191, 168, 190, - 131, 176, 87, 16, 136, 243, 229, 165, 205, 36, 89, 21, 109, 252, 23, 122, - 176, 63, 2, 242, 252, 141, 249, 62, 249, 179, 255, 215, 51, 234, 42, 28, - 229, 42, 54, 237, 95, 182, 241, 51, 119, 149, 103, 191, 124, 85, 199, 240, - 211, 127, 157, 157, 113, 173, 126, 102, 126, 72, 237, 161, 254, 251, 249, 12, - 107, 133, 212, 194, 13, 128, 44, 180, 236, 221, 35, 178, 40, 128, 154, 34, - 145, 99, 6, 79, 228, 87, 219, 248, 55, 214, 82, 141, 148, 191, 69, 60, - 191, 108, 81, 205, 191, 37, 205, 188, 68, 106, 248, 183, 32, 144, 95, 52, - 210, 16, 197, 209, 156, 18, 37, 38, 115, 33, 200, 31, 77, 44, 131, 55, - 149, 88, 198, 155, 42, 39, 45, 153, 31, 16, 36, 38, 87, 92, 5, 25, - 5, 207, 40, 174, 178, 154, 160, 219, 168, 28, 223, 95, 53, 200, 27, 22, - 253, 65, 40, 215, 244, 137, 131, 58, 150, 47, 92, 138, 179, 162, 205, 85, - 224, 21, 75, 52, 80, 45, 214, 129, 75, 158, 93, 237, 217, 211, 158, 209, - 132, 70, 182, 67, 169, 203, 160, 132, 139, 203, 94, 224, 37, 86, 125, 25, - 171, 61, 108, 162, 214, 60, 20, 46, 27, 233, 198, 197, 182, 58, 133, 146, - 194, 170, 2, 107, 128, 125, 193, 19, 84, 166, 16, 23, 156, 201, 110, 165, - 46, 238, 3, 5, 162, 3, 158, 23, 237, 140, 227, 109, 168, 75, 181, 16, - 104, 80, 65, 58, 196, 199, 167, 157, 237, 123, 92, 123, 183, 179, 85, 112, - 16, 194, 114, 68, 27, 229, 143, 140, 238, 240, 26, 190, 14, 16, 192, 243, - 179, 199, 119, 107, 4, 245, 99, 11, 202, 117, 219, 44, 246, 227, 21, 200, - 25, 3, 66, 226, 202, 105, 60, 1, 79, 105, 173, 214, 142, 99, 21, 216, - 78, 22, 116, 85, 129, 240, 60, 88, 115, 79, 219, 78, 124, 15, 27, 180, - 112, 14, 59, 213, 36, 251, 7, 106, 239, 77, 139, 78, 101, 233, 132, 128, - 180, 94, 84, 89, 116, 24, 211, 129, 133, 233, 160, 35, 142, 149, 204, 149, - 62, 20, 153, 150, 247, 96, 141, 76, 246, 165, 170, 194, 185, 23, 72, 33, - 30, 6, 45, 80, 8, 134, 68, 31, 213, 176, 76, 21, 145, 167, 101, 153, - 236, 21, 140, 84, 92, 141, 80, 146, 10, 73, 21, 230, 156, 138, 100, 37, - 77, 70, 211, 184, 131, 79, 1, 237, 37, 227, 205, 81, 116, 81, 129, 215, - 39, 176, 36, 194, 143, 141, 114, 220, 22, 39, 76, 16, 48, 248, 152, 65, - 34, 218, 226, 173, 243, 12, 164, 85, 129, 183, 120, 223, 25, 0, 27, 123, - 244, 114, 15, 51, 129, 14, 7, 13, 204, 38, 123, 146, 81, 88, 68, 154, - 222, 3, 100, 52, 73, 85, 217, 37, 176, 142, 82, 180, 219, 121, 176, 130, - 173, 124, 216, 148, 214, 51, 163, 249, 77, 247, 33, 26, 174, 56, 66, 152, - 203, 43, 18, 24, 13, 186, 59, 151, 58, 18, 26, 253, 233, 249, 236, 226, - 8, 122, 188, 98, 94, 144, 140, 58, 215, 9, 71, 94, 128, 14, 176, 162, - 215, 158, 60, 85, 203, 12, 56, 188, 129, 48, 114, 157, 56, 118, 249, 22, - 189, 45, 109, 123, 79, 182, 21, 74, 21, 166, 167, 36, 162, 87, 114, 187, - 73, 71, 141, 132, 21, 75, 149, 34, 31, 114, 154, 156, 228, 155, 25, 8, - 209, 200, 58, 159, 171, 212, 77, 151, 148, 243, 69, 245, 23, 241, 117, 230, - 222, 94, 213, 231, 187, 112, 62, 104, 44, 70, 32, 187, 143, 102, 227, 193, - 214, 84, 102, 245, 195, 255, 11, 25, 148, 97, 73, 25, 46, 70, 51, 77, - 19, 233, 167, 209, 80, 54, 120, 96, 170, 60, 50, 218, 186, 41, 189, 215, - 228, 2, 39, 79, 131, 119, 235, 64, 35, 117, 243, 94, 224, 75, 73, 29, - 194, 215, 169, 153, 182, 33, 90, 187, 109, 182, 223, 238, 36, 234, 176, 201, - 242, 158, 233, 128, 180, 245, 3, 54, 252, 93, 107, 95, 54, 61, 49, 199, - 79, 56, 23, 215, 176, 96, 7, 27, 165, 96, 152, 52, 126, 135, 23, 87, - 240, 145, 42, 27, 220, 149, 12, 228, 100, 180, 5, 121, 14, 63, 75, 252, - 67, 150, 138, 55, 225, 60, 162, 198, 137, 247, 5, 137, 178, 44, 214, 46, - 88, 144, 93, 60, 91, 162, 252, 186, 176, 49, 117, 61, 88, 212, 162, 211, - 197, 89, 181, 32, 142, 177, 124, 94, 15, 48, 130, 16, 75, 151, 207, 51, - 130, 245, 242, 91, 44, 127, 52, 136, 191, 104, 120, 208, 158, 229, 115, 25, - 241, 91, 219, 148, 66, 237, 17, 214, 246, 185, 44, 10, 54, 81, 207, 69, - 213, 247, 48, 250, 4, 115, 64, 6, 138, 139, 47, 4, 86, 247, 150, 223, - 30, 25, 90, 67, 150, 207, 107, 203, 111, 107, 21, 72, 213, 48, 39, 223, - 86, 223, 123, 92, 132, 140, 113, 156, 106, 184, 189, 213, 15, 242, 241, 40, - 233, 145, 133, 16, 123, 39, 184, 233, 56, 45, 97, 199, 150, 206, 232, 29, - 101, 190, 186, 136, 88, 171, 96, 0, 218, 84, 152, 252, 165, 186, 87, 89, - 194, 139, 91, 45, 109, 200, 86, 234, 56, 104, 154, 22, 14, 8, 93, 29, - 28, 155, 215, 176, 223, 221, 216, 20, 194, 119, 4, 215, 252, 25, 15, 18, - 243, 4, 100, 2, 235, 240, 4, 122, 199, 22, 183, 21, 80, 30, 179, 4, - 222, 99, 55, 252, 72, 42, 183, 92, 230, 183, 51, 191, 135, 162, 132, 0, - 249, 55, 209, 197, 48, 235, 115, 9, 245, 49, 66, 5, 201, 109, 187, 178, - 136, 58, 52, 19, 46, 131, 138, 7, 232, 149, 157, 15, 164, 99, 221, 200, - 44, 138, 123, 226, 216, 51, 9, 85, 93, 246, 111, 153, 217, 189, 247, 7, - 122, 41, 174, 56, 35, 211, 138, 40, 58, 14, 213, 152, 135, 106, 128, 126, - 135, 231, 129, 196, 225, 9, 100, 197, 114, 142, 43, 224, 114, 146, 14, 41, - 173, 147, 126, 109, 165, 95, 253, 244, 171, 103, 104, 125, 150, 102, 86, 110, - 2, 46, 162, 193, 233, 185, 12, 167, 167, 129, 233, 169, 126, 74, 51, 45, - 96, 79, 60, 0, 54, 30, 231, 133, 243, 203, 119, 166, 91, 127, 98, 121, - 54, 50, 47, 250, 51, 187, 94, 108, 96, 167, 7, 157, 134, 241, 117, 53, - 168, 2, 54, 118, 129, 30, 103, 133, 230, 162, 187, 17, 6, 103, 91, 16, - 115, 80, 48, 155, 195, 209, 173, 8, 58, 70, 186, 67, 173, 126, 1, 56, - 199, 187, 145, 157, 241, 112, 98, 97, 164, 84, 206, 185, 119, 138, 192, 63, - 239, 98, 200, 184, 73, 80, 118, 116, 95, 205, 122, 232, 232, 175, 23, 77, - 110, 101, 86, 117, 186, 12, 196, 219, 117, 139, 213, 170, 11, 226, 238, 160, - 233, 30, 172, 103, 4, 134, 7, 53, 165, 103, 109, 249, 44, 34, 85, 96, - 125, 32, 29, 44, 70, 208, 139, 36, 39, 92, 140, 67, 212, 71, 188, 196, - 186, 227, 69, 32, 8, 114, 148, 235, 182, 71, 82, 244, 149, 35, 202, 41, - 23, 19, 188, 140, 18, 184, 69, 180, 157, 16, 180, 89, 63, 31, 95, 207, - 77, 209, 233, 236, 214, 37, 213, 54, 190, 121, 54, 178, 237, 213, 49, 30, - 211, 167, 192, 91, 132, 119, 190, 22, 141, 99, 45, 103, 72, 31, 155, 186, - 255, 79, 6, 47, 212, 247, 196, 46, 223, 157, 38, 119, 183, 57, 52, 119, - 23, 31, 67, 180, 58, 158, 152, 242, 89, 227, 215, 250, 41, 163, 99, 87, - 98, 52, 7, 137, 205, 51, 59, 182, 125, 88, 151, 94, 213, 191, 46, 9, - 88, 23, 106, 42, 66, 187, 56, 46, 243, 110, 156, 114, 80, 10, 86, 13, - 101, 61, 199, 124, 214, 68, 243, 185, 193, 204, 192, 243, 142, 11, 32, 136, - 82, 77, 158, 104, 242, 193, 161, 212, 5, 224, 67, 185, 217, 197, 5, 30, - 7, 158, 154, 13, 87, 88, 252, 98, 38, 103, 244, 97, 77, 31, 48, 68, - 126, 20, 31, 110, 213, 7, 249, 17, 63, 0, 131, 132, 111, 120, 74, 137, - 103, 214, 29, 58, 179, 110, 29, 122, 188, 134, 197, 61, 169, 104, 14, 223, - 201, 128, 16, 121, 1, 61, 240, 58, 9, 177, 109, 83, 139, 246, 101, 240, - 91, 5, 207, 21, 57, 26, 222, 136, 138, 136, 131, 156, 136, 92, 13, 21, - 87, 198, 78, 21, 250, 68, 123, 133, 111, 108, 30, 164, 66, 190, 194, 238, - 25, 59, 120, 144, 88, 161, 35, 212, 15, 56, 127, 3, 232, 150, 35, 3, - 103, 40, 191, 69, 211, 11, 33, 129, 124, 96, 9, 228, 195, 51, 209, 106, - 148, 67, 62, 216, 198, 21, 4, 99, 151, 158, 126, 128, 14, 249, 157, 95, - 214, 244, 50, 231, 151, 91, 122, 33, 217, 227, 183, 202, 149, 253, 187, 61, - 175, 218, 88, 50, 124, 253, 63, 120, 252, 197, 65, 92, 38, 132, 225, 168, - 87, 224, 115, 35, 192, 218, 201, 30, 128, 111, 207, 68, 165, 108, 51, 169, - 29, 62, 29, 153, 162, 226, 31, 82, 199, 102, 24, 136, 120, 85, 120, 198, - 134, 29, 37, 74, 227, 170, 194, 183, 51, 155, 43, 42, 31, 111, 249, 17, - 82, 67, 26, 151, 50, 58, 140, 74, 198, 252, 230, 212, 161, 141, 4, 178, - 23, 97, 215, 30, 157, 144, 152, 145, 203, 106, 240, 66, 113, 215, 177, 66, - 239, 147, 207, 21, 138, 53, 59, 197, 229, 165, 16, 197, 5, 119, 29, 147, - 117, 40, 243, 87, 205, 196, 174, 232, 176, 33, 173, 41, 73, 181, 111, 184, - 240, 226, 72, 94, 227, 100, 113, 251, 197, 62, 11, 175, 91, 25, 82, 50, - 131, 36, 249, 70, 124, 207, 42, 122, 237, 216, 111, 74, 51, 136, 170, 89, - 151, 185, 123, 182, 111, 168, 146, 52, 211, 130, 156, 188, 97, 17, 98, 97, - 222, 219, 222, 40, 94, 192, 82, 28, 4, 150, 251, 149, 229, 193, 104, 234, - 227, 36, 32, 234, 16, 184, 7, 22, 132, 68, 165, 117, 171, 29, 104, 247, - 1, 177, 162, 105, 148, 220, 102, 231, 152, 187, 164, 244, 41, 53, 13, 89, - 189, 153, 104, 59, 229, 85, 201, 13, 108, 93, 175, 128, 103, 164, 170, 179, - 213, 220, 130, 42, 104, 60, 91, 67, 52, 71, 228, 74, 173, 245, 32, 72, - 92, 84, 162, 234, 87, 150, 155, 223, 1, 83, 86, 134, 255, 72, 7, 188, - 14, 95, 63, 176, 237, 192, 86, 28, 108, 60, 157, 215, 213, 245, 210, 147, - 214, 83, 93, 114, 91, 159, 46, 95, 110, 148, 63, 210, 114, 200, 110, 87, - 203, 99, 242, 189, 84, 138, 135, 225, 188, 63, 194, 183, 146, 93, 210, 190, - 37, 250, 84, 63, 82, 12, 146, 69, 37, 73, 134, 57, 14, 206, 238, 73, - 228, 71, 237, 132, 204, 169, 14, 37, 82, 104, 134, 194, 247, 237, 110, 201, - 72, 215, 78, 234, 113, 120, 193, 166, 180, 213, 49, 25, 103, 103, 4, 89, - 186, 237, 3, 173, 44, 16, 151, 203, 219, 179, 99, 26, 219, 211, 1, 8, - 104, 83, 152, 193, 40, 172, 218, 252, 32, 16, 154, 207, 182, 97, 37, 99, - 179, 142, 50, 95, 132, 169, 74, 203, 47, 232, 46, 165, 63, 159, 93, 33, - 103, 117, 148, 81, 27, 94, 247, 148, 44, 188, 41, 31, 193, 194, 130, 178, - 90, 245, 73, 112, 106, 185, 103, 165, 141, 0, 182, 154, 14, 158, 89, 79, - 88, 250, 156, 14, 248, 70, 178, 164, 182, 185, 37, 252, 94, 194, 189, 238, - 24, 254, 212, 3, 207, 150, 162, 194, 23, 11, 200, 76, 32, 227, 124, 177, - 168, 65, 25, 131, 61, 44, 167, 202, 104, 187, 168, 108, 125, 113, 138, 169, - 161, 254, 135, 30, 106, 242, 80, 75, 88, 49, 5, 143, 137, 212, 39, 148, - 20, 209, 40, 175, 64, 96, 212, 0, 44, 117, 18, 89, 204, 117, 18, 129, - 183, 143, 144, 200, 98, 46, 244, 8, 178, 19, 166, 114, 19, 13, 151, 124, - 164, 194, 145, 240, 144, 171, 57, 108, 166, 113, 18, 195, 184, 31, 33, 222, - 199, 96, 24, 167, 189, 54, 222, 149, 75, 223, 13, 199, 99, 242, 155, 52, - 135, 157, 245, 104, 182, 164, 163, 154, 245, 236, 218, 252, 170, 68, 230, 146, - 122, 11, 244, 200, 208, 128, 239, 34, 243, 155, 240, 38, 26, 148, 140, 116, - 51, 119, 210, 154, 104, 139, 164, 49, 245, 186, 77, 91, 219, 141, 179, 190, - 170, 38, 24, 134, 138, 184, 239, 254, 251, 191, 239, 88, 185, 103, 3, 91, - 215, 114, 73, 100, 5, 175, 218, 37, 6, 239, 46, 14, 249, 23, 178, 226, - 173, 33, 225, 80, 170, 32, 169, 218, 83, 224, 115, 138, 114, 40, 60, 137, - 215, 52, 124, 82, 25, 106, 74, 62, 13, 55, 56, 15, 251, 31, 150, 104, - 108, 247, 135, 233, 4, 120, 204, 63, 140, 89, 67, 21, 136, 150, 194, 119, - 40, 243, 164, 178, 45, 214, 231, 17, 251, 40, 221, 141, 129, 246, 25, 221, - 75, 221, 93, 69, 123, 110, 215, 33, 191, 44, 34, 190, 222, 75, 104, 10, - 93, 8, 133, 174, 98, 100, 176, 232, 225, 255, 100, 39, 36, 143, 135, 25, - 105, 33, 3, 242, 79, 121, 22, 55, 144, 62, 103, 26, 6, 237, 112, 216, - 238, 130, 189, 24, 148, 229, 78, 180, 45, 106, 14, 117, 33, 173, 70, 235, - 184, 230, 52, 61, 113, 48, 47, 46, 46, 138, 124, 201, 104, 205, 204, 3, - 97, 127, 35, 63, 63, 24, 115, 221, 144, 163, 129, 6, 195, 38, 155, 16, - 162, 227, 46, 52, 107, 126, 143, 187, 13, 146, 137, 146, 163, 20, 247, 140, - 12, 234, 16, 126, 178, 158, 203, 79, 116, 39, 128, 241, 48, 139, 33, 129, - 152, 161, 194, 240, 199, 238, 173, 72, 105, 109, 77, 127, 111, 233, 111, 127, - 219, 252, 10, 161, 118, 52, 25, 40, 135, 197, 160, 18, 64, 202, 219, 35, - 41, 243, 193, 54, 46, 79, 255, 63, 72, 195, 68, 188, 186, 200, 79, 73, - 60, 102, 118, 189, 64, 59, 55, 205, 79, 35, 109, 175, 160, 64, 156, 127, - 125, 105, 191, 117, 197, 142, 44, 117, 115, 215, 45, 85, 168, 85, 176, 14, - 110, 131, 126, 134, 116, 60, 219, 163, 30, 225, 237, 23, 62, 33, 66, 11, - 63, 249, 12, 169, 14, 79, 173, 66, 163, 14, 49, 150, 72, 129, 34, 121, - 187, 109, 223, 93, 87, 32, 160, 186, 121, 170, 61, 57, 201, 51, 219, 93, - 171, 209, 232, 241, 205, 67, 175, 63, 83, 199, 149, 64, 114, 179, 225, 133, - 107, 227, 95, 246, 247, 128, 79, 89, 127, 15, 99, 186, 3, 204, 153, 100, - 91, 135, 10, 51, 62, 82, 32, 144, 140, 164, 20, 161, 228, 202, 246, 130, - 209, 60, 247, 238, 70, 21, 137, 189, 12, 140, 168, 15, 162, 62, 158, 218, - 207, 204, 203, 232, 102, 56, 21, 121, 52, 205, 19, 206, 11, 23, 78, 179, - 252, 186, 172, 188, 113, 38, 167, 19, 132, 221, 63, 191, 158, 188, 199, 43, - 249, 130, 102, 171, 217, 133, 36, 151, 91, 83, 201, 246, 33, 199, 83, 211, - 170, 153, 103, 197, 71, 79, 119, 44, 95, 212, 64, 28, 136, 223, 195, 164, - 87, 182, 163, 173, 66, 219, 81, 72, 112, 205, 154, 124, 101, 171, 86, 38, - 99, 64, 166, 186, 114, 233, 110, 10, 139, 133, 224, 85, 216, 200, 74, 73, - 67, 187, 46, 85, 241, 29, 75, 41, 169, 60, 74, 168, 131, 38, 143, 190, - 204, 107, 243, 93, 233, 93, 73, 158, 7, 199, 192, 10, 74, 16, 23, 196, - 73, 26, 40, 132, 163, 5, 230, 240, 34, 128, 52, 219, 221, 130, 136, 108, - 32, 204, 92, 200, 227, 12, 131, 49, 242, 78, 97, 249, 164, 79, 120, 56, - 240, 194, 21, 33, 47, 248, 213, 163, 87, 236, 160, 35, 180, 156, 198, 175, - 240, 83, 121, 129, 199, 1, 240, 224, 201, 119, 175, 154, 221, 112, 203, 173, - 246, 7, 23, 143, 26, 32, 188, 110, 186, 213, 90, 44, 182, 198, 179, 69, - 5, 147, 159, 194, 87, 104, 184, 141, 89, 139, 103, 161, 109, 115, 181, 86, - 17, 232, 179, 140, 90, 67, 44, 165, 88, 168, 139, 68, 211, 155, 111, 92, - 218, 81, 135, 151, 21, 202, 195, 129, 40, 239, 201, 178, 141, 190, 190, 17, - 21, 118, 79, 99, 198, 98, 199, 231, 106, 35, 134, 214, 124, 227, 105, 9, - 61, 78, 200, 233, 222, 224, 23, 6, 13, 225, 111, 73, 90, 15, 211, 66, - 241, 172, 203, 4, 235, 91, 229, 141, 135, 206, 102, 43, 223, 240, 15, 85, - 200, 166, 130, 33, 22, 255, 159, 106, 138, 93, 93, 55, 127, 170, 85, 94, - 1, 145, 193, 11, 8, 125, 121, 44, 55, 185, 8, 74, 252, 226, 208, 105, - 117, 60, 187, 88, 164, 45, 231, 242, 5, 135, 159, 84, 6, 247, 17, 30, - 48, 215, 148, 98, 240, 40, 117, 27, 133, 194, 18, 202, 11, 24, 45, 29, - 170, 73, 14, 127, 21, 60, 207, 34, 221, 82, 29, 172, 224, 190, 23, 124, - 178, 95, 11, 197, 27, 85, 6, 235, 40, 63, 221, 14, 201, 179, 174, 187, - 158, 50, 23, 209, 246, 164, 132, 123, 137, 161, 139, 72, 222, 112, 135, 131, - 223, 66, 210, 42, 189, 239, 62, 76, 254, 231, 209, 127, 184, 39, 195, 255, - 218, 248, 31, 136, 206, 170, 80, 249, 144, 218, 147, 222, 175, 252, 123, 26, - 37, 236, 4, 74, 243, 20, 124, 89, 130, 148, 150, 143, 144, 86, 45, 103, - 144, 199, 188, 12, 242, 24, 26, 32, 9, 175, 97, 108, 45, 178, 3, 233, - 139, 185, 93, 22, 72, 226, 197, 12, 61, 104, 45, 178, 70, 165, 2, 182, - 129, 111, 175, 230, 232, 14, 102, 54, 101, 163, 129, 52, 106, 68, 42, 211, - 212, 29, 24, 103, 171, 231, 198, 107, 137, 158, 65, 81, 71, 194, 126, 180, - 207, 66, 221, 19, 82, 169, 202, 197, 128, 16, 42, 86, 16, 195, 223, 36, - 144, 10, 77, 138, 148, 66, 84, 176, 179, 72, 10, 57, 32, 7, 197, 11, - 213, 127, 26, 228, 32, 133, 111, 16, 66, 187, 243, 198, 238, 16, 7, 106, - 140, 24, 30, 121, 94, 173, 6, 191, 129, 8, 192, 54, 85, 104, 241, 211, - 0, 42, 123, 22, 244, 206, 201, 183, 168, 240, 109, 229, 224, 97, 39, 5, - 227, 101, 242, 60, 140, 23, 169, 64, 146, 165, 83, 33, 163, 107, 216, 205, - 33, 194, 78, 42, 52, 6, 110, 193, 122, 45, 28, 156, 0, 11, 104, 168, - 2, 138, 182, 164, 211, 243, 208, 188, 28, 207, 206, 65, 56, 225, 154, 78, - 132, 103, 53, 81, 225, 93, 58, 56, 111, 200, 136, 148, 226, 146, 139, 159, - 148, 141, 13, 137, 173, 18, 158, 129, 37, 165, 115, 18, 153, 79, 147, 90, - 169, 74, 157, 129, 84, 220, 188, 68, 243, 42, 180, 151, 56, 211, 185, 232, - 133, 14, 24, 16, 36, 64, 1, 228, 147, 43, 131, 110, 0, 251, 67, 168, - 2, 86, 149, 76, 14, 32, 197, 30, 42, 204, 223, 99, 37, 17, 136, 249, - 137, 168, 56, 10, 111, 50, 7, 158, 10, 46, 147, 249, 115, 110, 51, 118, - 136, 221, 201, 128, 179, 55, 49, 57, 210, 252, 38, 119, 115, 240, 168, 198, - 150, 95, 147, 65, 229, 247, 164, 51, 146, 190, 40, 118, 74, 150, 34, 62, - 220, 207, 209, 97, 145, 143, 136, 241, 105, 178, 212, 46, 171, 156, 205, 113, - 128, 20, 165, 124, 146, 57, 202, 154, 33, 245, 201, 211, 62, 249, 233, 79, - 190, 246, 169, 149, 254, 212, 210, 62, 181, 211, 159, 218, 244, 73, 93, 217, - 118, 216, 3, 218, 190, 126, 101, 251, 53, 85, 91, 17, 103, 214, 133, 84, - 210, 201, 120, 93, 105, 202, 62, 134, 186, 218, 114, 71, 234, 219, 230, 8, - 15, 234, 176, 135, 161, 54, 182, 153, 116, 48, 212, 128, 206, 146, 116, 170, - 58, 181, 58, 182, 181, 95, 32, 93, 167, 141, 6, 13, 74, 17, 220, 149, - 172, 78, 16, 88, 251, 212, 36, 120, 114, 190, 18, 87, 177, 135, 167, 4, - 135, 141, 249, 85, 109, 2, 170, 166, 71, 60, 159, 131, 149, 9, 101, 116, - 215, 182, 40, 143, 42, 25, 72, 99, 136, 151, 132, 92, 128, 32, 17, 220, - 161, 83, 2, 242, 146, 48, 4, 214, 41, 13, 162, 27, 166, 53, 49, 107, - 166, 133, 81, 152, 51, 183, 4, 38, 120, 123, 99, 176, 153, 38, 46, 63, - 104, 71, 59, 138, 111, 112, 61, 138, 71, 66, 229, 183, 137, 145, 107, 110, - 179, 203, 72, 203, 28, 238, 82, 120, 197, 106, 63, 69, 211, 205, 58, 60, - 28, 59, 8, 41, 221, 103, 53, 47, 140, 8, 249, 120, 156, 173, 33, 108, - 188, 125, 131, 44, 38, 217, 177, 22, 30, 50, 184, 206, 251, 70, 197, 242, - 159, 146, 39, 45, 254, 34, 227, 122, 6, 3, 109, 122, 93, 1, 95, 7, - 27, 128, 138, 229, 237, 117, 90, 8, 92, 45, 62, 97, 228, 58, 31, 87, - 184, 53, 111, 195, 217, 83, 27, 57, 10, 180, 185, 79, 191, 212, 67, 133, - 220, 57, 212, 161, 36, 133, 23, 62, 161, 200, 10, 211, 6, 191, 22, 24, - 213, 167, 227, 154, 86, 169, 38, 79, 30, 51, 95, 14, 205, 146, 240, 106, - 89, 178, 137, 50, 213, 39, 201, 119, 121, 135, 142, 242, 111, 48, 197, 218, - 161, 80, 138, 230, 97, 104, 178, 150, 104, 177, 109, 50, 251, 90, 253, 56, - 128, 23, 191, 217, 52, 5, 240, 72, 182, 189, 162, 172, 74, 92, 37, 120, - 169, 109, 173, 186, 188, 179, 135, 48, 131, 81, 249, 181, 216, 172, 33, 95, - 210, 27, 80, 102, 175, 108, 36, 106, 132, 98, 218, 1, 181, 15, 109, 154, - 40, 66, 240, 62, 15, 99, 68, 40, 33, 4, 49, 90, 15, 238, 232, 246, - 224, 15, 36, 184, 144, 127, 224, 239, 152, 127, 216, 144, 27, 94, 67, 10, - 132, 218, 254, 97, 2, 49, 209, 223, 136, 254, 98, 202, 254, 100, 205, 127, - 63, 96, 146, 232, 119, 93, 96, 127, 59, 187, 166, 146, 195, 49, 236, 231, - 39, 225, 7, 161, 137, 201, 28, 28, 165, 160, 139, 89, 255, 154, 86, 46, - 88, 209, 135, 75, 243, 138, 204, 206, 174, 81, 221, 71, 183, 96, 93, 140, - 162, 56, 213, 34, 60, 96, 29, 46, 8, 137, 101, 171, 23, 194, 88, 132, - 81, 92, 249, 161, 44, 150, 173, 50, 52, 160, 55, 42, 43, 236, 52, 96, - 48, 218, 18, 246, 53, 244, 133, 72, 176, 115, 109, 132, 22, 220, 64, 128, - 146, 254, 197, 98, 184, 19, 96, 231, 80, 46, 8, 130, 194, 62, 230, 158, - 82, 182, 191, 164, 208, 114, 232, 190, 209, 43, 217, 52, 46, 61, 252, 99, - 100, 201, 123, 7, 232, 4, 206, 137, 236, 68, 217, 210, 29, 244, 21, 30, - 179, 47, 253, 251, 192, 2, 225, 49, 75, 197, 125, 81, 226, 23, 77, 218, - 203, 122, 37, 96, 4, 28, 128, 121, 112, 128, 65, 113, 149, 74, 14, 48, - 117, 32, 51, 27, 137, 12, 255, 224, 191, 222, 156, 254, 94, 210, 95, 10, - 9, 123, 161, 253, 206, 64, 218, 179, 199, 28, 97, 204, 49, 198, 28, 229, - 157, 193, 13, 95, 107, 29, 160, 30, 229, 131, 10, 185, 196, 188, 194, 243, - 222, 216, 198, 191, 225, 57, 255, 208, 95, 204, 10, 168, 25, 186, 193, 166, - 31, 250, 59, 130, 64, 162, 13, 27, 255, 198, 244, 247, 6, 254, 70, 189, - 8, 254, 142, 33, 159, 119, 6, 18, 57, 68, 167, 159, 9, 255, 172, 249, - 231, 3, 214, 46, 250, 29, 235, 6, 127, 163, 223, 209, 212, 32, 11, 59, - 45, 60, 158, 42, 225, 216, 45, 35, 225, 171, 177, 40, 151, 44, 236, 180, - 82, 89, 173, 149, 58, 198, 7, 233, 184, 86, 238, 202, 214, 30, 222, 94, - 68, 131, 224, 110, 20, 56, 71, 64, 197, 149, 15, 176, 245, 249, 240, 108, - 105, 87, 42, 163, 90, 224, 187, 85, 212, 122, 252, 80, 175, 159, 85, 159, - 194, 18, 221, 234, 182, 247, 59, 85, 94, 48, 128, 240, 122, 84, 132, 57, - 49, 241, 249, 138, 224, 212, 7, 86, 52, 56, 180, 122, 87, 34, 80, 156, - 215, 115, 224, 133, 8, 148, 167, 251, 28, 122, 190, 117, 235, 149, 206, 13, - 117, 40, 194, 241, 213, 40, 12, 8, 126, 142, 151, 55, 120, 106, 109, 36, - 248, 38, 125, 133, 125, 88, 223, 190, 115, 27, 49, 41, 67, 165, 203, 102, - 32, 78, 4, 157, 51, 173, 94, 140, 117, 104, 154, 202, 175, 160, 229, 211, - 241, 20, 173, 112, 184, 132, 137, 253, 139, 207, 70, 35, 50, 148, 81, 225, - 63, 82, 162, 214, 48, 89, 100, 130, 50, 121, 61, 149, 99, 149, 110, 159, - 157, 174, 171, 157, 201, 200, 224, 21, 9, 23, 43, 70, 41, 77, 99, 30, - 32, 16, 58, 94, 227, 144, 245, 145, 66, 177, 116, 168, 58, 33, 1, 92, - 245, 174, 16, 179, 188, 119, 65, 127, 207, 233, 47, 26, 173, 17, 122, 41, - 198, 34, 86, 205, 209, 88, 96, 8, 115, 98, 251, 42, 106, 111, 158, 68, - 38, 190, 184, 29, 59, 137, 123, 249, 177, 184, 110, 18, 247, 252, 99, 113, - 189, 36, 238, 199, 42, 172, 170, 251, 209, 186, 218, 42, 87, 110, 152, 106, - 165, 10, 190, 212, 131, 47, 85, 240, 185, 30, 124, 78, 193, 227, 162, 2, - 99, 148, 191, 224, 31, 23, 140, 47, 49, 191, 37, 21, 24, 171, 26, 124, - 82, 234, 36, 109, 126, 87, 239, 72, 235, 38, 105, 63, 185, 214, 92, 103, - 94, 208, 243, 146, 42, 220, 22, 78, 171, 112, 86, 82, 77, 22, 236, 247, - 51, 50, 208, 146, 127, 94, 21, 220, 84, 21, 250, 249, 237, 223, 157, 131, - 158, 254, 51, 106, 144, 42, 191, 96, 236, 70, 36, 115, 51, 248, 11, 58, - 181, 37, 245, 188, 130, 76, 205, 188, 216, 90, 73, 40, 116, 21, 14, 50, - 124, 236, 114, 126, 248, 148, 67, 156, 184, 240, 125, 70, 114, 149, 248, 115, - 10, 119, 181, 194, 195, 207, 72, 174, 18, 127, 70, 217, 162, 228, 254, 104, - 231, 196, 160, 193, 128, 72, 50, 11, 120, 82, 193, 219, 125, 8, 66, 193, - 88, 240, 12, 234, 79, 21, 250, 24, 165, 184, 90, 41, 253, 71, 200, 78, - 101, 246, 8, 117, 227, 154, 161, 164, 95, 52, 75, 224, 155, 200, 1, 159, - 182, 24, 5, 201, 81, 159, 156, 88, 37, 141, 63, 53, 169, 171, 146, 126, - 114, 149, 101, 133, 163, 29, 9, 35, 149, 48, 202, 107, 107, 180, 179, 173, - 249, 137, 85, 210, 93, 109, 205, 77, 234, 170, 164, 159, 92, 101, 89, 225, - 124, 206, 192, 9, 199, 42, 225, 56, 175, 173, 227, 157, 109, 205, 79, 172, - 146, 238, 106, 107, 110, 82, 87, 37, 253, 228, 42, 115, 133, 113, 111, 90, - 148, 16, 190, 113, 58, 120, 216, 106, 41, 132, 21, 76, 203, 226, 164, 42, - 225, 228, 211, 18, 186, 42, 225, 39, 86, 86, 85, 245, 195, 174, 116, 31, - 84, 194, 15, 90, 51, 125, 149, 118, 119, 59, 115, 83, 39, 105, 119, 54, - 53, 47, 173, 155, 164, 221, 217, 218, 188, 180, 73, 123, 123, 159, 220, 98, - 110, 47, 30, 79, 20, 174, 252, 209, 239, 130, 144, 240, 105, 91, 248, 193, - 221, 221, 39, 39, 86, 73, 63, 189, 96, 87, 43, 184, 120, 170, 23, 37, - 86, 73, 63, 185, 92, 137, 172, 30, 94, 47, 102, 18, 136, 117, 122, 46, - 142, 159, 143, 157, 60, 196, 85, 178, 24, 164, 35, 179, 201, 16, 225, 160, - 27, 124, 96, 230, 6, 31, 26, 147, 97, 56, 141, 181, 227, 178, 123, 34, - 175, 134, 131, 240, 74, 57, 73, 158, 132, 87, 187, 60, 32, 231, 96, 159, - 114, 133, 220, 194, 19, 22, 217, 52, 97, 187, 148, 122, 239, 102, 222, 221, - 142, 161, 119, 69, 129, 253, 82, 234, 220, 61, 57, 24, 247, 209, 134, 72, - 30, 0, 112, 219, 197, 129, 120, 70, 75, 55, 219, 96, 101, 126, 57, 156, - 46, 230, 17, 170, 43, 169, 102, 178, 201, 147, 116, 134, 92, 122, 103, 104, - 150, 79, 190, 45, 186, 220, 78, 70, 98, 83, 146, 230, 172, 197, 122, 39, - 203, 227, 17, 31, 226, 44, 143, 209, 120, 212, 172, 207, 189, 193, 10, 33, - 26, 83, 38, 37, 244, 140, 177, 70, 73, 172, 245, 86, 44, 248, 191, 108, - 5, 222, 169, 162, 253, 167, 15, 27, 92, 213, 161, 232, 219, 9, 157, 74, - 9, 231, 78, 121, 7, 193, 231, 225, 122, 200, 82, 50, 16, 239, 203, 147, - 94, 60, 153, 205, 22, 35, 188, 44, 176, 123, 111, 158, 107, 175, 110, 230, - 61, 113, 11, 240, 147, 84, 49, 74, 136, 237, 205, 203, 231, 141, 231, 152, - 179, 128, 0, 82, 4, 71, 151, 179, 227, 217, 54, 252, 231, 22, 173, 165, - 234, 18, 164, 138, 86, 214, 120, 233, 10, 5, 78, 179, 93, 228, 105, 13, - 38, 33, 181, 20, 79, 247, 147, 38, 147, 170, 110, 179, 109, 232, 157, 160, - 92, 168, 145, 105, 92, 98, 33, 215, 108, 39, 228, 149, 180, 56, 105, 168, - 166, 123, 164, 183, 80, 106, 48, 170, 106, 154, 21, 233, 54, 70, 104, 162, - 38, 231, 82, 206, 22, 193, 12, 87, 87, 208, 208, 222, 202, 188, 43, 121, - 102, 221, 108, 213, 16, 172, 202, 118, 76, 17, 190, 206, 132, 27, 21, 52, - 7, 58, 114, 201, 28, 135, 128, 243, 109, 248, 63, 155, 15, 121, 6, 169, - 14, 54, 141, 138, 211, 244, 218, 216, 108, 27, 31, 170, 120, 228, 122, 51, - 27, 223, 176, 3, 21, 229, 85, 167, 153, 14, 199, 3, 158, 115, 50, 110, - 226, 76, 26, 210, 110, 179, 82, 80, 24, 219, 119, 62, 160, 176, 241, 53, - 108, 128, 155, 56, 247, 232, 113, 213, 196, 203, 148, 138, 123, 84, 84, 26, - 187, 14, 120, 80, 113, 171, 164, 184, 53, 21, 39, 61, 44, 152, 123, 77, - 211, 51, 208, 7, 203, 145, 3, 173, 46, 106, 46, 246, 74, 139, 208, 6, - 18, 199, 14, 132, 36, 57, 71, 68, 80, 236, 40, 219, 19, 41, 232, 165, - 225, 25, 241, 8, 248, 204, 135, 237, 1, 22, 225, 91, 3, 188, 203, 173, - 144, 16, 88, 182, 244, 36, 152, 28, 213, 149, 190, 66, 99, 200, 42, 2, - 210, 245, 240, 139, 147, 183, 72, 194, 64, 215, 77, 67, 100, 152, 163, 35, - 81, 148, 165, 156, 4, 217, 172, 4, 59, 100, 161, 33, 93, 229, 15, 143, - 82, 231, 127, 233, 149, 254, 240, 192, 90, 255, 43, 83, 237, 109, 77, 15, - 179, 190, 135, 94, 134, 218, 109, 242, 51, 132, 215, 117, 136, 59, 193, 254, - 135, 234, 218, 11, 222, 191, 169, 113, 201, 29, 51, 172, 210, 249, 56, 34, - 205, 114, 210, 202, 198, 181, 253, 106, 62, 91, 132, 211, 217, 85, 20, 210, - 218, 46, 94, 39, 225, 120, 77, 151, 99, 131, 225, 53, 170, 80, 201, 8, - 126, 18, 32, 162, 180, 2, 88, 201, 146, 28, 218, 242, 85, 124, 238, 4, - 97, 127, 4, 109, 13, 23, 179, 171, 152, 98, 236, 39, 33, 20, 39, 145, - 34, 126, 140, 132, 179, 61, 238, 60, 170, 42, 177, 177, 155, 40, 107, 87, - 163, 187, 63, 75, 154, 229, 24, 169, 54, 22, 25, 37, 171, 139, 245, 253, - 196, 53, 101, 210, 13, 236, 148, 82, 235, 7, 8, 240, 130, 146, 222, 17, - 16, 226, 107, 33, 34, 82, 11, 196, 49, 213, 21, 240, 222, 86, 239, 34, - 66, 39, 40, 165, 58, 3, 130, 246, 181, 32, 138, 149, 186, 91, 40, 236, - 16, 188, 61, 67, 245, 127, 52, 31, 136, 45, 180, 30, 72, 1, 169, 208, - 181, 2, 70, 112, 2, 224, 82, 237, 206, 62, 176, 168, 150, 239, 35, 75, - 105, 182, 219, 93, 124, 107, 49, 131, 1, 214, 133, 79, 205, 253, 118, 183, - 74, 41, 92, 76, 209, 117, 49, 133, 219, 229, 20, 62, 166, 108, 118, 48, - 23, 74, 225, 18, 219, 235, 238, 183, 57, 133, 135, 41, 58, 20, 230, 239, - 183, 41, 5, 166, 246, 69, 108, 76, 187, 207, 49, 125, 202, 27, 203, 164, - 88, 30, 213, 100, 95, 213, 196, 165, 154, 116, 101, 77, 90, 24, 251, 0, - 179, 117, 218, 34, 6, 181, 1, 219, 195, 111, 251, 196, 126, 61, 81, 143, - 54, 197, 167, 182, 58, 190, 44, 125, 159, 82, 120, 34, 5, 181, 8, 91, - 199, 41, 58, 152, 194, 59, 56, 192, 92, 186, 212, 98, 183, 117, 116, 143, - 16, 78, 189, 79, 237, 118, 177, 13, 62, 130, 135, 54, 157, 142, 7, 113, - 221, 14, 181, 152, 234, 166, 135, 112, 156, 182, 219, 169, 110, 121, 28, 77, - 41, 49, 64, 24, 72, 83, 124, 162, 158, 6, 43, 182, 238, 176, 88, 4, - 117, 167, 217, 45, 253, 221, 240, 181, 70, 102, 154, 51, 26, 187, 134, 100, - 224, 220, 75, 160, 183, 123, 8, 193, 40, 20, 162, 227, 28, 100, 131, 127, - 10, 5, 31, 130, 164, 104, 92, 68, 124, 91, 155, 22, 111, 203, 106, 95, - 81, 78, 228, 92, 132, 213, 76, 111, 18, 178, 82, 25, 249, 209, 77, 16, - 83, 132, 235, 220, 225, 106, 129, 10, 156, 116, 159, 173, 252, 116, 36, 218, - 39, 225, 52, 139, 79, 179, 101, 104, 46, 119, 13, 44, 198, 165, 218, 87, - 184, 149, 80, 146, 46, 239, 36, 244, 215, 110, 250, 21, 246, 17, 154, 250, - 166, 214, 247, 133, 204, 103, 27, 17, 65, 0, 18, 192, 174, 64, 130, 8, - 171, 110, 46, 218, 56, 36, 26, 225, 168, 122, 3, 59, 141, 52, 80, 194, - 238, 237, 2, 137, 245, 219, 101, 93, 92, 227, 61, 185, 44, 80, 43, 128, - 149, 239, 138, 52, 58, 207, 55, 70, 2, 42, 237, 74, 208, 78, 6, 50, - 182, 92, 129, 114, 238, 109, 204, 158, 6, 100, 32, 124, 241, 165, 130, 16, - 228, 111, 16, 93, 92, 4, 119, 236, 149, 160, 238, 86, 247, 186, 238, 129, - 71, 46, 227, 235, 10, 245, 192, 16, 146, 16, 122, 186, 139, 235, 136, 254, - 134, 166, 239, 199, 132, 106, 24, 157, 213, 131, 83, 4, 136, 116, 236, 213, - 25, 218, 170, 151, 216, 199, 28, 26, 224, 163, 14, 57, 169, 145, 194, 127, - 104, 118, 127, 100, 198, 95, 189, 218, 139, 15, 41, 190, 139, 241, 129, 216, - 207, 74, 70, 157, 109, 95, 200, 232, 133, 171, 19, 157, 236, 45, 249, 174, - 245, 55, 37, 195, 73, 87, 223, 24, 227, 216, 146, 85, 39, 251, 104, 5, - 221, 160, 16, 207, 227, 141, 9, 77, 44, 33, 233, 33, 184, 41, 16, 128, - 9, 245, 224, 48, 210, 130, 82, 110, 241, 74, 194, 19, 30, 124, 81, 126, - 206, 74, 228, 188, 80, 234, 248, 48, 242, 19, 187, 196, 237, 155, 50, 203, - 68, 174, 231, 238, 55, 217, 25, 84, 233, 84, 117, 48, 204, 149, 146, 53, - 157, 148, 206, 178, 106, 227, 201, 24, 28, 26, 144, 162, 167, 189, 155, 90, - 3, 226, 209, 169, 85, 42, 225, 198, 239, 216, 12, 160, 27, 238, 162, 27, - 32, 94, 8, 161, 170, 67, 32, 138, 35, 152, 105, 73, 64, 205, 98, 34, - 45, 51, 39, 193, 127, 71, 164, 12, 227, 220, 14, 131, 187, 211, 213, 137, - 221, 63, 57, 219, 24, 212, 13, 167, 214, 249, 153, 232, 138, 187, 134, 21, - 110, 208, 32, 6, 218, 71, 193, 216, 198, 108, 36, 43, 196, 24, 20, 176, - 2, 177, 120, 114, 67, 143, 232, 47, 24, 170, 183, 4, 210, 72, 168, 209, - 49, 180, 170, 88, 231, 122, 197, 80, 113, 149, 104, 108, 58, 36, 16, 157, - 185, 196, 199, 37, 93, 100, 234, 123, 237, 202, 88, 165, 83, 204, 54, 141, - 204, 151, 66, 205, 65, 143, 37, 97, 162, 123, 18, 23, 168, 7, 73, 31, - 153, 154, 83, 63, 130, 109, 30, 46, 162, 190, 64, 74, 67, 187, 136, 186, - 221, 176, 103, 115, 180, 50, 69, 59, 156, 34, 172, 101, 224, 120, 110, 80, - 47, 230, 107, 25, 32, 193, 112, 58, 72, 243, 175, 204, 119, 109, 143, 90, - 170, 151, 54, 41, 16, 159, 188, 230, 165, 181, 1, 85, 229, 53, 19, 229, - 45, 9, 119, 164, 209, 6, 206, 105, 188, 69, 71, 47, 116, 38, 187, 190, - 51, 199, 114, 99, 68, 220, 79, 174, 119, 98, 168, 210, 224, 196, 228, 96, - 51, 223, 99, 36, 170, 199, 130, 12, 153, 217, 0, 48, 18, 17, 186, 138, - 216, 33, 254, 123, 223, 36, 233, 183, 253, 1, 230, 162, 241, 92, 34, 170, - 42, 169, 52, 75, 211, 62, 214, 242, 73, 225, 188, 213, 211, 181, 74, 189, - 229, 224, 37, 229, 215, 114, 187, 114, 74, 107, 60, 217, 235, 227, 169, 76, - 145, 46, 62, 238, 48, 4, 2, 147, 199, 144, 76, 12, 61, 66, 216, 35, - 14, 238, 193, 205, 59, 183, 235, 236, 93, 69, 27, 243, 105, 211, 244, 59, - 142, 222, 235, 132, 72, 51, 185, 65, 93, 114, 235, 9, 43, 16, 77, 158, - 4, 8, 104, 63, 101, 85, 69, 90, 107, 46, 112, 227, 194, 250, 219, 166, - 208, 91, 220, 229, 87, 128, 207, 196, 134, 131, 243, 101, 50, 84, 132, 197, - 162, 190, 152, 207, 191, 252, 127, 38, 98, 238, 229, 111, 213, 62, 226, 190, - 76, 43, 128, 0, 30, 146, 87, 189, 219, 119, 151, 184, 219, 210, 33, 173, - 150, 170, 232, 130, 76, 16, 72, 239, 147, 148, 89, 216, 129, 74, 213, 84, - 103, 104, 180, 178, 169, 189, 92, 94, 215, 92, 232, 186, 148, 104, 104, 202, - 12, 9, 230, 251, 69, 177, 30, 101, 18, 47, 241, 190, 164, 133, 161, 141, - 223, 216, 21, 198, 125, 227, 196, 182, 175, 24, 129, 67, 215, 139, 132, 28, - 242, 124, 156, 245, 11, 93, 43, 105, 37, 147, 251, 152, 52, 64, 191, 101, - 232, 53, 219, 237, 109, 41, 21, 83, 201, 51, 84, 237, 140, 166, 21, 87, - 155, 163, 86, 200, 209, 69, 181, 128, 29, 165, 151, 60, 135, 214, 59, 32, - 95, 214, 14, 174, 91, 199, 54, 167, 22, 150, 187, 132, 53, 12, 84, 124, - 55, 221, 228, 14, 151, 228, 3, 242, 208, 51, 138, 123, 26, 7, 200, 145, - 175, 63, 58, 217, 21, 103, 217, 69, 245, 57, 102, 74, 122, 177, 133, 58, - 138, 169, 234, 58, 202, 101, 34, 77, 146, 76, 83, 148, 120, 139, 176, 158, - 21, 214, 90, 175, 150, 12, 116, 83, 129, 34, 168, 107, 151, 116, 86, 87, - 178, 75, 219, 120, 196, 31, 111, 35, 8, 181, 155, 210, 214, 100, 99, 1, - 40, 7, 225, 203, 85, 41, 245, 230, 2, 215, 37, 38, 116, 105, 174, 214, - 146, 9, 165, 57, 111, 222, 200, 141, 250, 242, 60, 234, 65, 199, 69, 223, - 189, 72, 142, 184, 146, 44, 63, 235, 176, 72, 203, 170, 148, 114, 20, 132, - 168, 31, 198, 119, 104, 34, 249, 102, 175, 227, 84, 159, 118, 24, 157, 252, - 101, 173, 226, 162, 169, 224, 121, 92, 249, 238, 169, 71, 56, 129, 104, 154, - 248, 18, 193, 14, 137, 154, 205, 58, 65, 144, 127, 87, 181, 79, 95, 218, - 191, 216, 206, 153, 125, 250, 139, 253, 146, 126, 29, 248, 253, 133, 126, 33, - 132, 194, 29, 250, 133, 175, 16, 142, 184, 243, 144, 201, 115, 194, 74, 247, - 107, 144, 37, 78, 20, 2, 78, 63, 160, 55, 151, 223, 92, 151, 222, 188, - 179, 35, 3, 118, 32, 149, 10, 188, 212, 131, 73, 181, 22, 168, 121, 95, - 45, 105, 27, 215, 81, 28, 61, 252, 124, 238, 187, 31, 95, 37, 29, 206, - 25, 126, 118, 135, 39, 89, 165, 59, 220, 216, 238, 112, 132, 146, 199, 54, - 190, 36, 72, 170, 35, 227, 149, 120, 127, 46, 222, 127, 69, 16, 46, 49, - 26, 56, 28, 85, 26, 143, 35, 227, 5, 226, 80, 213, 126, 220, 163, 209, - 248, 85, 224, 202, 191, 168, 253, 202, 61, 252, 138, 135, 240, 199, 234, 158, - 95, 52, 114, 47, 212, 200, 189, 16, 35, 247, 66, 141, 220, 11, 49, 114, - 248, 251, 66, 142, 92, 122, 36, 252, 90, 50, 22, 71, 70, 102, 52, 186, - 143, 50, 28, 93, 125, 60, 186, 15, 28, 144, 110, 122, 68, 122, 163, 120, - 197, 89, 202, 177, 214, 27, 48, 126, 140, 250, 127, 175, 85, 127, 252, 176, - 218, 127, 255, 217, 228, 244, 125, 134, 156, 144, 108, 212, 236, 246, 106, 223, - 243, 236, 174, 253, 40, 233, 39, 111, 230, 35, 65, 97, 196, 23, 123, 222, - 127, 136, 152, 138, 73, 105, 252, 40, 164, 244, 189, 78, 74, 227, 7, 146, - 210, 247, 59, 72, 105, 188, 69, 74, 55, 143, 81, 255, 159, 85, 245, 117, - 112, 44, 27, 68, 234, 35, 250, 251, 222, 33, 215, 96, 238, 123, 190, 88, - 115, 165, 99, 61, 29, 171, 204, 246, 85, 109, 196, 239, 231, 119, 193, 207, - 159, 77, 143, 63, 231, 208, 227, 207, 31, 39, 191, 159, 145, 252, 254, 116, - 226, 187, 121, 20, 226, 251, 89, 39, 190, 155, 7, 18, 223, 207, 59, 136, - 239, 70, 17, 95, 18, 122, 152, 156, 25, 163, 133, 24, 110, 49, 28, 188, - 40, 116, 154, 251, 78, 215, 247, 125, 105, 58, 134, 31, 92, 219, 163, 59, - 68, 216, 96, 96, 168, 6, 241, 17, 177, 244, 246, 176, 158, 120, 245, 250, - 39, 175, 165, 186, 34, 146, 2, 225, 231, 245, 4, 103, 198, 94, 58, 227, - 204, 77, 24, 65, 209, 108, 33, 212, 28, 31, 155, 93, 243, 75, 114, 209, - 133, 55, 98, 95, 74, 139, 183, 227, 99, 62, 141, 53, 139, 172, 208, 198, - 33, 169, 72, 62, 172, 241, 223, 135, 231, 88, 203, 239, 251, 163, 166, 33, - 50, 252, 220, 166, 107, 89, 137, 6, 103, 79, 51, 252, 220, 219, 192, 212, - 94, 93, 30, 141, 236, 106, 52, 203, 235, 176, 41, 226, 93, 40, 129, 64, - 4, 223, 180, 105, 231, 17, 124, 211, 105, 167, 192, 32, 30, 165, 123, 82, - 44, 110, 107, 47, 146, 84, 36, 125, 252, 94, 105, 59, 118, 219, 57, 162, - 191, 239, 27, 192, 232, 142, 240, 15, 62, 53, 252, 35, 120, 42, 224, 134, - 162, 137, 70, 210, 212, 180, 19, 64, 236, 218, 241, 233, 153, 169, 27, 55, - 185, 100, 220, 4, 21, 65, 91, 81, 247, 43, 247, 208, 41, 109, 76, 165, - 6, 115, 90, 194, 227, 170, 82, 214, 247, 30, 39, 192, 115, 12, 115, 54, - 189, 8, 163, 177, 248, 34, 130, 169, 251, 201, 29, 224, 3, 168, 1, 122, - 78, 158, 6, 162, 1, 218, 55, 37, 185, 239, 196, 66, 160, 95, 236, 78, - 187, 186, 41, 105, 131, 41, 104, 7, 27, 191, 90, 223, 154, 20, 15, 246, - 57, 183, 212, 21, 252, 150, 166, 134, 248, 207, 39, 135, 248, 47, 163, 135, - 248, 111, 79, 16, 241, 67, 40, 34, 161, 1, 169, 8, 158, 38, 134, 238, - 159, 77, 13, 221, 191, 148, 28, 186, 127, 115, 122, 232, 62, 148, 32, 186, - 31, 165, 8, 98, 34, 127, 46, 119, 248, 229, 237, 175, 247, 166, 134, 164, - 134, 127, 211, 33, 20, 13, 254, 172, 1, 76, 137, 231, 2, 127, 11, 71, - 132, 16, 186, 155, 45, 215, 107, 181, 59, 45, 27, 79, 100, 218, 251, 237, - 253, 142, 139, 143, 110, 215, 105, 161, 82, 134, 225, 52, 61, 215, 235, 236, - 123, 7, 24, 186, 239, 182, 221, 182, 231, 225, 163, 179, 239, 185, 251, 80, - 166, 129, 64, 227, 7, 32, 73, 82, 4, 215, 61, 112, 15, 60, 7, 31, - 15, 218, 142, 239, 180, 8, 246, 27, 201, 64, 20, 6, 155, 21, 191, 237, - 118, 168, 180, 110, 219, 117, 59, 237, 46, 165, 107, 249, 14, 188, 113, 121, - 158, 215, 234, 118, 91, 14, 23, 216, 57, 112, 252, 14, 229, 237, 116, 224, - 191, 253, 3, 151, 139, 244, 15, 220, 142, 195, 53, 57, 216, 119, 58, 46, - 231, 185, 15, 225, 94, 215, 243, 176, 212, 229, 8, 209, 127, 97, 51, 82, - 162, 14, 42, 125, 5, 109, 62, 132, 170, 84, 107, 167, 124, 83, 135, 145, - 112, 55, 240, 150, 118, 44, 8, 18, 214, 169, 238, 65, 70, 16, 132, 167, - 46, 16, 222, 48, 159, 239, 121, 142, 3, 1, 116, 46, 182, 215, 118, 208, - 145, 98, 255, 45, 108, 87, 222, 254, 74, 77, 242, 90, 126, 247, 160, 214, - 255, 229, 216, 115, 59, 95, 245, 127, 121, 239, 31, 86, 32, 7, 8, 192, - 221, 75, 167, 90, 243, 246, 247, 40, 138, 109, 120, 251, 181, 55, 28, 235, - 45, 196, 194, 55, 245, 133, 243, 248, 149, 191, 254, 170, 242, 248, 53, 147, - 7, 214, 23, 202, 173, 5, 212, 178, 244, 102, 69, 77, 210, 63, 153, 39, - 127, 10, 75, 214, 234, 248, 55, 157, 133, 221, 135, 136, 90, 249, 27, 49, - 175, 41, 182, 91, 114, 19, 134, 129, 110, 211, 219, 111, 155, 13, 242, 161, - 170, 127, 244, 248, 163, 219, 62, 112, 14, 232, 179, 235, 168, 173, 90, 102, - 225, 214, 72, 163, 63, 66, 59, 185, 7, 142, 55, 250, 116, 152, 97, 31, - 52, 13, 145, 225, 103, 239, 95, 146, 172, 62, 105, 255, 146, 114, 11, 243, - 209, 253, 11, 212, 241, 207, 156, 14, 220, 166, 79, 154, 13, 170, 134, 127, - 203, 201, 160, 26, 252, 121, 50, 133, 32, 161, 29, 52, 251, 231, 178, 51, - 40, 239, 51, 6, 240, 111, 205, 206, 146, 38, 255, 231, 217, 89, 23, 254, - 119, 176, 197, 201, 90, 168, 26, 217, 34, 70, 231, 131, 8, 0, 108, 77, - 227, 102, 98, 122, 108, 81, 134, 188, 18, 223, 186, 249, 76, 148, 40, 244, - 81, 70, 177, 119, 247, 229, 126, 146, 99, 146, 195, 182, 18, 69, 42, 247, - 236, 29, 62, 98, 28, 42, 53, 76, 105, 91, 155, 239, 215, 133, 80, 245, - 80, 117, 197, 148, 128, 77, 252, 235, 153, 53, 60, 155, 74, 196, 31, 120, - 247, 206, 52, 17, 8, 222, 253, 51, 77, 12, 50, 235, 167, 46, 94, 91, - 11, 171, 25, 2, 189, 136, 159, 32, 18, 6, 59, 160, 21, 58, 248, 64, - 59, 137, 238, 139, 110, 196, 177, 45, 198, 11, 35, 0, 232, 159, 208, 117, - 237, 208, 245, 224, 159, 111, 135, 30, 60, 131, 204, 23, 122, 240, 236, 195, - 179, 15, 207, 126, 226, 43, 138, 97, 76, 252, 149, 175, 93, 238, 11, 176, - 91, 166, 46, 77, 233, 242, 126, 247, 206, 104, 88, 3, 53, 128, 73, 102, - 227, 131, 23, 64, 53, 2, 168, 6, 163, 168, 65, 93, 196, 23, 15, 66, - 125, 23, 254, 121, 202, 210, 11, 42, 86, 172, 155, 41, 219, 231, 8, 227, - 6, 5, 192, 175, 43, 17, 36, 157, 144, 181, 177, 113, 164, 23, 42, 155, - 145, 209, 108, 68, 65, 163, 111, 26, 220, 25, 252, 116, 249, 231, 64, 55, - 245, 226, 78, 18, 221, 114, 138, 23, 206, 150, 135, 58, 121, 71, 166, 213, - 66, 236, 50, 171, 131, 143, 251, 166, 213, 53, 45, 144, 243, 182, 123, 46, - 77, 113, 234, 2, 55, 33, 49, 57, 9, 109, 47, 165, 251, 219, 68, 173, - 5, 160, 147, 205, 17, 84, 186, 209, 193, 159, 253, 198, 193, 166, 170, 180, - 238, 116, 47, 110, 241, 240, 122, 128, 78, 250, 200, 174, 17, 85, 19, 163, - 105, 31, 136, 27, 88, 8, 169, 1, 255, 159, 215, 223, 244, 20, 8, 41, - 133, 156, 71, 139, 184, 55, 24, 94, 45, 70, 154, 99, 168, 151, 195, 41, - 42, 111, 13, 245, 252, 210, 218, 168, 9, 161, 168, 2, 104, 248, 200, 217, - 253, 213, 130, 224, 150, 101, 57, 105, 60, 193, 84, 21, 202, 8, 28, 232, - 16, 142, 182, 150, 82, 129, 253, 45, 24, 172, 9, 33, 142, 162, 157, 176, - 218, 169, 150, 6, 109, 164, 173, 84, 57, 129, 215, 244, 5, 125, 37, 13, - 14, 186, 41, 50, 211, 218, 218, 54, 82, 29, 185, 229, 141, 177, 189, 201, - 216, 19, 0, 109, 65, 9, 27, 241, 154, 64, 47, 117, 21, 244, 146, 230, - 128, 234, 227, 189, 155, 244, 41, 2, 233, 65, 75, 52, 188, 90, 97, 36, - 8, 148, 135, 45, 49, 169, 37, 194, 213, 192, 29, 251, 137, 240, 222, 91, - 126, 149, 21, 32, 125, 187, 188, 42, 11, 53, 92, 87, 131, 210, 73, 123, - 175, 186, 179, 92, 212, 152, 76, 255, 184, 152, 148, 252, 87, 149, 215, 226, - 247, 22, 186, 80, 25, 28, 177, 166, 101, 162, 249, 139, 152, 240, 132, 222, - 250, 38, 144, 170, 182, 78, 245, 232, 165, 122, 113, 171, 71, 207, 213, 139, - 87, 69, 71, 181, 136, 200, 247, 198, 126, 105, 63, 39, 76, 215, 168, 90, - 54, 128, 8, 38, 192, 170, 155, 102, 31, 183, 250, 66, 13, 182, 41, 244, - 58, 125, 251, 110, 180, 231, 115, 105, 16, 162, 226, 174, 111, 251, 43, 3, - 33, 78, 161, 58, 32, 124, 110, 158, 10, 179, 41, 156, 72, 210, 178, 234, - 83, 107, 22, 174, 68, 205, 142, 177, 55, 27, 238, 195, 43, 40, 251, 222, - 168, 75, 216, 139, 166, 57, 191, 81, 66, 176, 124, 88, 147, 222, 107, 19, - 149, 94, 19, 245, 233, 249, 108, 9, 108, 64, 104, 78, 195, 211, 90, 75, - 217, 68, 133, 73, 186, 248, 129, 38, 210, 94, 194, 108, 200, 111, 228, 78, - 204, 120, 22, 144, 189, 89, 13, 122, 96, 85, 119, 203, 73, 173, 29, 218, - 128, 32, 82, 46, 1, 195, 146, 254, 178, 14, 37, 175, 87, 181, 78, 26, - 184, 216, 6, 224, 69, 94, 173, 98, 29, 63, 245, 128, 200, 168, 255, 242, - 11, 20, 26, 129, 164, 61, 205, 238, 55, 145, 214, 176, 22, 235, 143, 214, - 130, 150, 186, 196, 142, 46, 237, 229, 91, 122, 212, 144, 26, 108, 139, 217, - 24, 77, 113, 250, 8, 119, 141, 60, 45, 177, 129, 148, 1, 243, 190, 139, - 127, 24, 196, 126, 48, 140, 23, 46, 253, 165, 119, 13, 103, 89, 115, 180, - 196, 66, 229, 30, 30, 186, 165, 245, 221, 62, 193, 143, 112, 186, 158, 45, - 7, 166, 136, 231, 180, 108, 183, 237, 219, 176, 235, 179, 249, 210, 210, 49, - 178, 205, 145, 96, 160, 138, 185, 120, 228, 209, 93, 138, 164, 200, 87, 200, - 87, 13, 80, 65, 159, 240, 175, 60, 210, 225, 67, 149, 206, 247, 27, 124, - 244, 130, 59, 23, 31, 231, 147, 109, 249, 82, 54, 82, 168, 195, 149, 44, - 76, 90, 170, 162, 21, 129, 30, 228, 149, 170, 26, 164, 179, 208, 232, 85, - 253, 140, 139, 31, 242, 32, 205, 216, 212, 242, 10, 116, 234, 52, 133, 106, - 42, 203, 148, 126, 58, 133, 214, 86, 67, 188, 18, 233, 224, 243, 179, 224, - 84, 232, 251, 162, 104, 29, 4, 242, 251, 24, 31, 112, 19, 249, 37, 183, - 10, 72, 226, 156, 98, 122, 82, 233, 28, 6, 122, 67, 133, 120, 80, 136, - 199, 169, 126, 35, 243, 100, 239, 76, 115, 213, 131, 137, 72, 119, 47, 223, - 11, 206, 34, 154, 146, 85, 184, 0, 143, 68, 183, 111, 195, 197, 49, 172, - 148, 60, 252, 136, 64, 8, 187, 24, 9, 151, 120, 147, 128, 41, 206, 9, - 97, 113, 174, 225, 44, 110, 200, 178, 30, 189, 29, 246, 175, 5, 88, 48, - 5, 192, 98, 165, 2, 122, 113, 116, 57, 9, 123, 227, 217, 242, 88, 189, - 76, 162, 65, 242, 50, 138, 46, 245, 165, 89, 136, 33, 176, 250, 69, 13, - 188, 59, 29, 170, 42, 135, 227, 203, 25, 233, 142, 231, 57, 95, 64, 19, - 156, 9, 98, 28, 202, 161, 39, 0, 196, 120, 49, 156, 246, 215, 154, 10, - 103, 136, 11, 138, 116, 175, 32, 144, 16, 175, 16, 86, 120, 180, 88, 92, - 29, 238, 237, 45, 151, 203, 102, 4, 187, 248, 102, 52, 217, 187, 186, 62, - 223, 11, 231, 139, 61, 207, 113, 91, 123, 174, 179, 191, 87, 164, 150, 142, - 11, 52, 119, 35, 75, 125, 90, 71, 66, 7, 98, 136, 232, 34, 254, 44, - 186, 135, 95, 84, 239, 4, 46, 172, 234, 101, 213, 63, 65, 87, 202, 139, - 73, 47, 5, 94, 27, 181, 27, 147, 33, 212, 96, 117, 219, 155, 99, 5, - 150, 235, 110, 52, 32, 68, 13, 41, 55, 9, 79, 195, 228, 186, 73, 226, - 14, 148, 171, 94, 246, 177, 64, 116, 45, 169, 185, 17, 130, 6, 105, 158, - 132, 120, 176, 222, 136, 10, 109, 117, 124, 122, 200, 210, 147, 141, 97, 112, - 185, 219, 4, 156, 174, 236, 53, 179, 108, 121, 208, 55, 208, 71, 104, 228, - 237, 219, 86, 171, 202, 211, 17, 123, 2, 131, 238, 218, 141, 125, 169, 228, - 74, 92, 248, 8, 83, 4, 65, 25, 168, 22, 246, 166, 4, 228, 72, 112, - 51, 98, 207, 145, 124, 190, 73, 62, 223, 244, 110, 50, 159, 129, 206, 229, - 103, 70, 79, 74, 127, 6, 202, 151, 159, 73, 177, 50, 157, 86, 251, 58, - 222, 254, 76, 243, 69, 126, 23, 160, 100, 57, 80, 228, 94, 33, 20, 185, - 214, 59, 161, 66, 83, 133, 188, 5, 118, 120, 223, 44, 245, 36, 93, 160, - 89, 60, 179, 208, 146, 77, 224, 137, 12, 239, 167, 200, 198, 104, 224, 178, - 213, 64, 121, 73, 115, 174, 1, 91, 12, 193, 218, 208, 37, 41, 1, 227, - 106, 106, 193, 40, 151, 35, 120, 238, 94, 226, 57, 17, 1, 214, 93, 229, - 143, 93, 96, 208, 163, 27, 188, 62, 176, 172, 167, 176, 138, 58, 78, 195, - 242, 65, 88, 145, 219, 60, 193, 128, 20, 130, 0, 176, 160, 120, 1, 19, - 172, 119, 21, 46, 22, 195, 249, 52, 144, 60, 168, 119, 57, 135, 9, 144, - 176, 132, 28, 92, 4, 29, 25, 64, 236, 68, 114, 113, 18, 118, 204, 216, - 76, 217, 98, 182, 233, 21, 40, 116, 235, 148, 128, 32, 24, 122, 115, 212, - 110, 204, 145, 187, 177, 28, 160, 3, 13, 222, 32, 212, 170, 157, 54, 113, - 163, 90, 216, 147, 217, 116, 70, 246, 179, 195, 77, 201, 196, 42, 217, 38, - 85, 154, 80, 104, 241, 124, 68, 84, 94, 183, 64, 17, 182, 149, 91, 112, - 151, 170, 158, 86, 178, 66, 145, 0, 89, 51, 149, 20, 70, 246, 216, 219, - 254, 179, 147, 180, 14, 178, 80, 151, 173, 79, 223, 59, 164, 199, 197, 122, - 93, 40, 99, 106, 241, 92, 140, 39, 194, 85, 60, 145, 78, 143, 231, 113, - 60, 151, 242, 115, 85, 124, 212, 19, 75, 197, 243, 101, 126, 110, 42, 158, - 203, 249, 37, 116, 213, 159, 172, 31, 118, 198, 134, 27, 90, 24, 152, 23, - 39, 111, 139, 225, 47, 208, 240, 158, 76, 32, 204, 190, 33, 223, 63, 243, - 152, 89, 43, 46, 53, 122, 53, 148, 183, 235, 164, 250, 211, 79, 54, 52, - 233, 134, 126, 120, 172, 150, 254, 107, 103, 83, 63, 168, 182, 222, 39, 18, - 89, 94, 208, 25, 80, 98, 28, 164, 160, 9, 84, 228, 7, 247, 214, 191, - 50, 56, 8, 185, 192, 2, 232, 64, 182, 33, 33, 4, 234, 66, 105, 140, - 36, 241, 26, 237, 103, 234, 65, 128, 178, 185, 218, 64, 237, 233, 216, 3, - 69, 103, 246, 88, 226, 168, 255, 56, 84, 246, 221, 139, 29, 84, 6, 133, - 164, 168, 12, 223, 31, 214, 111, 88, 92, 142, 110, 253, 9, 122, 234, 81, - 187, 65, 214, 118, 60, 65, 228, 100, 181, 119, 61, 34, 125, 201, 142, 83, - 171, 188, 64, 188, 121, 231, 240, 36, 8, 222, 124, 85, 169, 188, 108, 60, - 175, 238, 189, 168, 62, 237, 96, 192, 203, 175, 42, 207, 27, 111, 224, 189, - 238, 29, 86, 222, 52, 94, 226, 83, 11, 146, 226, 197, 37, 217, 152, 215, - 240, 246, 146, 236, 204, 107, 47, 233, 201, 117, 91, 181, 231, 71, 198, 169, - 249, 157, 253, 98, 15, 247, 10, 111, 241, 47, 90, 169, 102, 186, 59, 142, - 30, 167, 187, 127, 124, 181, 163, 187, 65, 220, 77, 117, 55, 162, 235, 61, - 172, 187, 161, 184, 156, 187, 109, 212, 20, 213, 187, 182, 176, 251, 143, 140, - 248, 26, 35, 99, 183, 97, 135, 61, 127, 208, 48, 160, 142, 43, 228, 247, - 140, 18, 162, 2, 171, 95, 155, 236, 65, 0, 43, 243, 195, 195, 94, 133, - 180, 229, 171, 56, 32, 168, 123, 250, 157, 77, 90, 187, 85, 18, 195, 42, - 63, 210, 41, 2, 63, 191, 162, 103, 188, 232, 205, 25, 169, 238, 99, 13, - 85, 119, 231, 88, 117, 179, 131, 213, 125, 248, 104, 117, 53, 166, 130, 195, - 223, 227, 135, 85, 55, 59, 253, 227, 241, 35, 53, 242, 251, 93, 109, 28, - 127, 148, 241, 98, 156, 186, 100, 188, 225, 96, 112, 138, 71, 237, 40, 214, - 131, 204, 71, 207, 104, 206, 200, 108, 56, 57, 212, 146, 134, 3, 50, 131, - 135, 118, 219, 247, 15, 36, 242, 7, 208, 244, 247, 196, 90, 218, 181, 202, - 4, 166, 199, 73, 21, 185, 7, 19, 250, 247, 199, 129, 139, 8, 222, 223, - 51, 185, 191, 216, 171, 184, 13, 97, 75, 208, 112, 171, 34, 226, 199, 200, - 252, 251, 29, 100, 62, 126, 44, 50, 255, 126, 39, 153, 143, 179, 100, 62, - 126, 56, 153, 127, 159, 38, 243, 241, 14, 50, 191, 121, 164, 70, 254, 188, - 171, 141, 55, 247, 32, 243, 155, 12, 153, 211, 157, 147, 143, 163, 196, 207, - 182, 155, 67, 230, 55, 26, 153, 223, 60, 184, 219, 126, 206, 35, 243, 255, - 240, 210, 137, 164, 124, 34, 73, 248, 228, 227, 20, 123, 178, 199, 39, 110, - 69, 84, 123, 243, 88, 84, 251, 243, 78, 170, 189, 201, 82, 237, 205, 195, - 169, 246, 231, 52, 213, 222, 100, 168, 54, 121, 203, 181, 37, 168, 21, 219, - 18, 212, 114, 109, 9, 196, 161, 240, 159, 117, 179, 47, 154, 73, 138, 43, - 247, 188, 216, 79, 106, 248, 119, 188, 215, 79, 26, 252, 121, 215, 250, 151, - 89, 133, 112, 236, 138, 236, 45, 188, 232, 162, 238, 159, 63, 138, 221, 207, - 208, 0, 78, 207, 34, 170, 183, 62, 139, 68, 67, 254, 222, 131, 221, 253, - 236, 209, 78, 198, 55, 127, 122, 111, 171, 116, 212, 89, 49, 173, 38, 21, - 213, 82, 122, 29, 117, 86, 75, 171, 37, 138, 106, 74, 167, 35, 67, 63, - 132, 155, 254, 167, 146, 15, 90, 223, 60, 148, 122, 16, 133, 69, 39, 30, - 106, 197, 223, 153, 118, 250, 163, 71, 32, 29, 105, 211, 180, 53, 196, 127, - 58, 139, 128, 34, 31, 99, 144, 187, 217, 81, 254, 187, 179, 8, 104, 193, - 231, 143, 51, 140, 236, 167, 177, 136, 90, 129, 214, 87, 61, 81, 245, 170, - 37, 10, 96, 69, 28, 226, 250, 113, 196, 228, 239, 255, 107, 135, 152, 12, - 133, 164, 135, 250, 250, 161, 18, 45, 22, 151, 127, 159, 89, 151, 171, 171, - 188, 25, 111, 42, 172, 29, 132, 205, 49, 99, 120, 199, 75, 110, 159, 28, - 174, 154, 110, 91, 157, 160, 97, 199, 33, 86, 14, 114, 215, 97, 163, 107, - 144, 63, 214, 22, 185, 110, 61, 48, 247, 4, 206, 173, 128, 24, 107, 16, - 4, 143, 231, 176, 142, 176, 211, 108, 117, 92, 199, 96, 15, 174, 174, 111, - 178, 39, 87, 116, 224, 186, 91, 131, 22, 171, 24, 77, 23, 143, 50, 0, - 41, 107, 205, 226, 161, 192, 226, 196, 239, 3, 135, 32, 93, 96, 250, 244, - 62, 215, 60, 20, 79, 53, 159, 61, 19, 150, 160, 240, 224, 18, 94, 95, - 97, 199, 196, 15, 182, 134, 29, 71, 228, 249, 94, 212, 151, 77, 155, 148, - 78, 222, 103, 54, 62, 39, 79, 110, 58, 108, 168, 128, 61, 33, 142, 29, - 237, 207, 205, 152, 223, 224, 47, 108, 129, 154, 142, 227, 187, 190, 211, 253, - 10, 94, 107, 174, 215, 60, 240, 14, 221, 166, 211, 110, 215, 224, 253, 61, - 218, 135, 116, 58, 157, 125, 130, 229, 112, 48, 45, 238, 134, 32, 147, 26, - 230, 33, 177, 56, 50, 189, 243, 39, 218, 2, 137, 182, 126, 138, 45, 80, - 17, 245, 97, 173, 117, 70, 240, 247, 181, 23, 74, 58, 229, 115, 56, 62, - 251, 72, 131, 64, 165, 11, 121, 119, 154, 152, 9, 37, 86, 66, 137, 145, - 208, 59, 205, 74, 40, 49, 18, 74, 108, 132, 222, 105, 70, 66, 137, 141, - 144, 50, 17, 58, 67, 162, 220, 176, 126, 82, 170, 72, 105, 44, 164, 217, - 10, 105, 166, 66, 239, 116, 91, 33, 205, 84, 72, 179, 20, 122, 167, 155, - 10, 105, 150, 66, 137, 161, 144, 40, 59, 173, 34, 196, 131, 255, 103, 75, - 46, 48, 92, 15, 151, 92, 168, 222, 25, 42, 254, 155, 75, 46, 216, 47, - 143, 176, 149, 45, 144, 92, 114, 4, 151, 76, 24, 31, 100, 248, 32, 206, - 184, 93, 175, 72, 84, 89, 71, 191, 63, 10, 17, 188, 125, 245, 239, 226, - 193, 69, 119, 37, 250, 216, 146, 251, 146, 7, 245, 45, 22, 199, 147, 94, - 41, 71, 103, 49, 139, 105, 18, 181, 15, 218, 48, 191, 236, 6, 124, 221, - 111, 181, 218, 62, 62, 249, 56, 229, 125, 49, 249, 93, 96, 14, 24, 8, - 19, 191, 125, 128, 188, 193, 119, 93, 215, 111, 27, 91, 189, 244, 56, 231, - 100, 80, 239, 29, 231, 100, 88, 76, 182, 163, 30, 122, 78, 166, 122, 74, - 13, 247, 22, 65, 241, 198, 184, 237, 54, 15, 156, 46, 159, 139, 117, 253, - 3, 223, 243, 187, 14, 240, 206, 174, 235, 249, 219, 178, 176, 235, 251, 77, - 175, 227, 114, 236, 131, 118, 103, 31, 120, 88, 107, 223, 115, 186, 176, 133, - 110, 21, 210, 26, 185, 122, 125, 148, 110, 124, 113, 254, 98, 190, 163, 31, - 73, 17, 45, 213, 145, 236, 174, 239, 97, 61, 73, 133, 10, 23, 178, 130, - 234, 58, 29, 219, 133, 197, 195, 107, 219, 13, 191, 107, 55, 246, 91, 182, - 235, 122, 244, 175, 113, 128, 206, 10, 186, 57, 71, 143, 54, 247, 160, 215, - 101, 208, 146, 142, 222, 185, 228, 30, 219, 237, 100, 79, 36, 69, 252, 162, - 126, 125, 164, 237, 198, 219, 93, 219, 141, 117, 102, 187, 177, 126, 240, 118, - 227, 173, 220, 110, 164, 22, 207, 237, 89, 220, 192, 181, 19, 214, 61, 154, - 197, 176, 51, 235, 16, 46, 122, 135, 38, 112, 7, 214, 83, 156, 189, 110, - 235, 160, 139, 15, 168, 193, 43, 215, 229, 173, 78, 122, 164, 41, 252, 95, - 187, 142, 186, 177, 152, 108, 63, 61, 120, 10, 255, 87, 234, 168, 27, 123, - 254, 158, 139, 66, 157, 182, 81, 45, 250, 214, 61, 104, 238, 239, 251, 91, - 51, 25, 145, 236, 233, 187, 211, 110, 118, 10, 182, 180, 41, 59, 33, 77, - 117, 24, 131, 77, 105, 62, 36, 253, 77, 231, 153, 203, 100, 44, 141, 14, - 53, 205, 220, 162, 60, 118, 194, 141, 74, 147, 36, 111, 163, 97, 190, 74, - 91, 34, 244, 208, 171, 67, 193, 122, 6, 99, 67, 23, 65, 86, 114, 109, - 11, 21, 171, 243, 161, 66, 127, 164, 68, 82, 109, 58, 15, 35, 244, 254, - 42, 211, 169, 10, 128, 76, 168, 233, 75, 235, 22, 62, 153, 122, 106, 138, - 101, 170, 59, 69, 173, 20, 236, 167, 199, 58, 211, 59, 149, 154, 139, 182, - 252, 23, 125, 83, 100, 32, 17, 40, 159, 5, 4, 100, 158, 219, 133, 87, - 81, 152, 209, 214, 165, 48, 40, 105, 10, 243, 103, 120, 113, 129, 245, 218, - 86, 209, 205, 239, 17, 206, 142, 51, 56, 204, 232, 149, 230, 103, 155, 166, - 150, 138, 99, 183, 144, 19, 183, 109, 16, 186, 109, 247, 160, 99, 123, 173, - 214, 123, 236, 88, 187, 139, 225, 7, 182, 11, 191, 158, 223, 134, 176, 54, - 70, 221, 135, 88, 240, 227, 57, 14, 121, 159, 1, 166, 44, 172, 59, 252, - 4, 196, 251, 73, 131, 160, 153, 173, 99, 58, 125, 200, 120, 48, 208, 241, - 110, 5, 78, 126, 211, 12, 185, 226, 253, 12, 136, 179, 214, 109, 104, 25, - 28, 221, 38, 38, 129, 63, 138, 128, 123, 118, 147, 76, 46, 31, 180, 206, - 82, 57, 165, 123, 38, 177, 6, 68, 5, 76, 92, 83, 208, 252, 198, 213, - 235, 68, 13, 19, 90, 255, 135, 102, 79, 145, 10, 123, 84, 8, 87, 189, - 233, 121, 111, 118, 189, 184, 186, 94, 160, 23, 53, 82, 244, 14, 231, 195, - 80, 211, 214, 254, 145, 216, 95, 150, 135, 134, 49, 4, 1, 239, 11, 5, - 86, 45, 234, 4, 47, 194, 104, 138, 226, 113, 104, 162, 148, 60, 30, 102, - 209, 117, 255, 239, 52, 219, 21, 102, 63, 156, 162, 231, 122, 102, 177, 144, - 39, 140, 205, 100, 22, 47, 88, 131, 58, 169, 90, 121, 171, 231, 254, 47, - 125, 80, 181, 153, 15, 201, 230, 4, 242, 61, 95, 155, 131, 97, 31, 154, - 64, 146, 58, 182, 133, 96, 203, 217, 13, 131, 154, 205, 243, 225, 37, 176, - 104, 194, 15, 55, 71, 33, 240, 44, 168, 71, 56, 24, 68, 200, 184, 161, - 73, 228, 152, 187, 33, 184, 206, 14, 5, 83, 213, 157, 108, 20, 152, 174, - 116, 0, 132, 39, 93, 191, 137, 110, 205, 152, 107, 37, 131, 255, 251, 53, - 108, 24, 112, 128, 219, 226, 34, 92, 142, 25, 122, 88, 131, 128, 112, 77, - 30, 162, 141, 204, 120, 106, 218, 225, 78, 214, 114, 203, 195, 242, 133, 237, - 150, 151, 104, 142, 119, 33, 158, 155, 168, 119, 243, 232, 202, 117, 10, 71, - 85, 27, 58, 83, 180, 36, 135, 207, 216, 104, 142, 3, 237, 133, 148, 99, - 25, 141, 218, 10, 77, 165, 48, 206, 128, 250, 223, 242, 139, 184, 210, 56, - 60, 135, 245, 1, 111, 247, 201, 234, 134, 162, 19, 238, 118, 50, 81, 61, - 68, 219, 239, 207, 102, 243, 65, 124, 130, 70, 33, 136, 185, 191, 62, 177, - 111, 5, 242, 62, 174, 17, 174, 29, 85, 44, 17, 165, 250, 204, 242, 55, - 137, 169, 14, 213, 2, 205, 74, 94, 37, 49, 54, 70, 138, 71, 19, 72, - 178, 75, 70, 23, 179, 185, 193, 26, 131, 100, 4, 219, 52, 233, 133, 111, - 141, 69, 57, 39, 27, 243, 9, 153, 115, 56, 230, 228, 134, 76, 55, 158, - 176, 142, 55, 27, 126, 160, 123, 247, 211, 247, 14, 171, 222, 202, 127, 104, - 212, 129, 142, 30, 94, 7, 204, 118, 112, 193, 126, 79, 32, 218, 119, 113, - 3, 214, 188, 218, 105, 195, 122, 77, 74, 13, 228, 123, 125, 34, 95, 101, - 60, 114, 136, 144, 68, 98, 177, 0, 149, 180, 69, 180, 92, 22, 158, 2, - 240, 78, 79, 101, 49, 50, 48, 86, 146, 225, 93, 133, 243, 69, 190, 101, - 108, 154, 49, 30, 102, 200, 102, 71, 78, 59, 22, 252, 103, 103, 236, 242, - 62, 186, 168, 224, 234, 14, 178, 182, 205, 143, 30, 57, 250, 138, 171, 213, - 130, 149, 253, 79, 190, 179, 143, 63, 227, 210, 62, 151, 177, 203, 122, 239, - 82, 131, 81, 145, 148, 30, 204, 228, 90, 121, 14, 240, 154, 237, 45, 245, - 23, 137, 15, 102, 104, 221, 242, 119, 60, 94, 137, 31, 168, 41, 144, 246, - 33, 157, 163, 36, 160, 60, 116, 255, 5, 116, 115, 255, 147, 52, 189, 150, - 127, 243, 97, 252, 188, 99, 178, 236, 56, 118, 243, 7, 242, 193, 55, 30, - 178, 162, 201, 45, 133, 232, 252, 7, 220, 120, 228, 228, 169, 110, 60, 226, - 212, 149, 7, 191, 196, 242, 202, 163, 229, 180, 218, 95, 225, 219, 30, 223, - 120, 84, 42, 20, 189, 206, 183, 28, 213, 189, 10, 93, 129, 84, 171, 239, - 189, 102, 43, 185, 243, 200, 191, 242, 88, 204, 122, 137, 208, 254, 237, 108, - 222, 223, 146, 59, 177, 138, 74, 216, 65, 9, 199, 84, 18, 14, 38, 214, - 90, 207, 201, 53, 59, 150, 252, 100, 59, 119, 115, 238, 31, 127, 48, 204, - 132, 182, 121, 99, 183, 4, 77, 248, 142, 226, 247, 133, 218, 227, 110, 91, - 164, 168, 54, 241, 178, 252, 209, 118, 129, 16, 9, 251, 34, 30, 45, 52, - 136, 50, 17, 89, 215, 156, 209, 96, 124, 93, 165, 6, 138, 173, 86, 113, - 35, 179, 121, 236, 106, 223, 49, 236, 74, 19, 187, 174, 109, 155, 46, 146, - 110, 79, 75, 214, 113, 233, 12, 241, 1, 166, 51, 16, 111, 205, 151, 246, - 203, 175, 109, 173, 94, 66, 8, 174, 148, 160, 95, 74, 170, 159, 170, 228, - 226, 42, 217, 19, 167, 128, 137, 236, 150, 6, 26, 225, 38, 241, 220, 108, - 60, 216, 3, 25, 31, 233, 85, 234, 167, 67, 54, 88, 67, 118, 72, 222, - 126, 35, 24, 104, 228, 137, 47, 201, 125, 226, 203, 175, 201, 105, 34, 214, - 25, 93, 37, 82, 165, 55, 247, 29, 141, 208, 188, 132, 220, 82, 61, 90, - 200, 14, 169, 18, 104, 142, 149, 169, 156, 190, 47, 198, 166, 90, 46, 181, - 21, 98, 33, 230, 128, 104, 63, 6, 122, 42, 48, 212, 66, 253, 141, 184, - 112, 213, 194, 90, 50, 44, 228, 203, 30, 28, 227, 40, 198, 0, 16, 160, - 225, 129, 104, 60, 112, 180, 179, 62, 74, 121, 108, 63, 137, 129, 164, 83, - 3, 255, 159, 25, 118, 40, 138, 71, 94, 85, 198, 77, 125, 241, 55, 178, - 190, 233, 240, 86, 18, 174, 39, 5, 42, 96, 91, 116, 189, 103, 81, 250, - 178, 56, 54, 146, 74, 181, 110, 201, 20, 124, 212, 118, 17, 37, 196, 66, - 61, 125, 207, 49, 127, 249, 230, 235, 183, 153, 161, 78, 157, 142, 200, 236, - 196, 239, 199, 167, 99, 146, 225, 95, 62, 27, 143, 51, 220, 204, 211, 96, - 128, 10, 39, 44, 207, 70, 103, 199, 92, 100, 154, 253, 132, 254, 253, 90, - 116, 176, 76, 123, 191, 78, 252, 250, 127, 72, 47, 18, 157, 214, 85, 55, - 250, 41, 221, 19, 189, 79, 155, 194, 70, 75, 38, 131, 206, 79, 14, 60, - 82, 206, 161, 8, 61, 66, 91, 78, 82, 108, 113, 119, 204, 226, 97, 217, - 198, 161, 137, 23, 195, 43, 58, 55, 129, 169, 146, 64, 189, 244, 18, 168, - 151, 196, 33, 78, 1, 40, 141, 148, 42, 18, 92, 40, 210, 13, 145, 163, - 92, 65, 251, 180, 118, 251, 76, 120, 158, 175, 226, 0, 114, 53, 26, 9, - 194, 202, 199, 205, 94, 101, 93, 25, 68, 166, 176, 178, 238, 110, 52, 153, - 159, 64, 122, 155, 205, 163, 203, 8, 15, 68, 244, 90, 44, 134, 253, 209, - 52, 250, 253, 122, 8, 82, 65, 12, 4, 6, 28, 30, 178, 155, 207, 6, - 215, 125, 62, 127, 121, 19, 245, 71, 230, 183, 243, 112, 122, 11, 159, 78, - 133, 217, 253, 220, 249, 208, 188, 142, 247, 32, 135, 171, 81, 212, 143, 247, - 56, 199, 151, 243, 225, 186, 57, 90, 76, 198, 103, 73, 193, 255, 92, 45, - 134, 83, 233, 167, 106, 49, 2, 74, 75, 74, 68, 147, 218, 57, 84, 120, - 30, 206, 215, 9, 196, 12, 187, 147, 156, 204, 230, 67, 62, 74, 180, 147, - 154, 209, 184, 66, 157, 190, 9, 111, 162, 129, 249, 83, 220, 31, 93, 79, - 160, 59, 198, 60, 125, 62, 13, 34, 39, 31, 19, 71, 119, 135, 185, 37, - 62, 234, 227, 203, 19, 178, 104, 60, 165, 243, 115, 24, 183, 56, 57, 199, - 213, 160, 178, 148, 144, 170, 85, 218, 114, 237, 59, 175, 233, 215, 44, 111, - 99, 163, 15, 238, 4, 235, 36, 65, 94, 162, 187, 132, 187, 78, 187, 237, - 183, 247, 16, 90, 70, 248, 71, 19, 128, 44, 120, 160, 158, 0, 177, 40, - 184, 151, 85, 127, 125, 203, 254, 154, 53, 84, 151, 171, 25, 180, 191, 63, - 158, 93, 35, 226, 137, 81, 231, 35, 155, 39, 116, 96, 50, 136, 226, 5, - 205, 89, 101, 123, 185, 12, 23, 195, 121, 60, 26, 14, 164, 207, 73, 50, - 204, 76, 31, 192, 26, 188, 14, 211, 245, 133, 168, 57, 61, 203, 202, 203, - 187, 16, 250, 221, 106, 2, 71, 21, 183, 112, 244, 209, 192, 195, 90, 124, - 23, 151, 30, 233, 243, 89, 33, 8, 220, 147, 209, 34, 75, 83, 108, 54, - 189, 55, 40, 96, 178, 42, 197, 255, 12, 22, 155, 186, 51, 209, 151, 39, - 237, 131, 147, 131, 122, 89, 44, 83, 242, 231, 98, 142, 73, 34, 213, 253, - 187, 247, 235, 84, 255, 222, 99, 21, 75, 210, 252, 15, 232, 225, 180, 40, - 224, 211, 202, 226, 231, 174, 65, 121, 18, 65, 139, 226, 19, 222, 17, 227, - 5, 237, 238, 245, 214, 118, 246, 69, 195, 64, 40, 4, 195, 121, 15, 248, - 230, 2, 153, 196, 4, 198, 226, 116, 62, 132, 160, 33, 204, 207, 30, 53, - 236, 204, 238, 37, 174, 149, 21, 36, 195, 150, 15, 208, 159, 68, 94, 102, - 146, 23, 113, 228, 161, 118, 57, 166, 114, 22, 93, 134, 26, 127, 69, 183, - 29, 95, 43, 84, 11, 1, 35, 34, 10, 36, 4, 53, 202, 54, 156, 12, - 241, 12, 90, 120, 187, 19, 227, 134, 208, 105, 107, 85, 187, 114, 241, 30, - 34, 113, 190, 156, 156, 188, 103, 218, 22, 132, 227, 113, 57, 87, 50, 69, - 32, 27, 87, 192, 174, 151, 174, 43, 167, 120, 107, 228, 113, 216, 25, 236, - 179, 235, 219, 29, 75, 176, 60, 238, 153, 145, 219, 229, 188, 152, 88, 119, - 176, 156, 112, 159, 247, 240, 168, 197, 114, 75, 64, 79, 18, 109, 173, 221, - 73, 33, 175, 32, 168, 159, 208, 71, 192, 205, 80, 201, 242, 75, 134, 126, - 232, 227, 211, 161, 15, 5, 224, 58, 196, 1, 6, 197, 85, 200, 18, 150, - 111, 67, 11, 109, 156, 79, 248, 7, 255, 245, 230, 244, 247, 146, 254, 82, - 72, 216, 11, 237, 119, 6, 66, 152, 216, 99, 142, 48, 230, 24, 99, 142, - 242, 206, 16, 240, 37, 54, 255, 226, 31, 245, 40, 31, 84, 200, 37, 230, - 133, 88, 42, 54, 254, 13, 207, 249, 135, 254, 98, 86, 227, 254, 8, 122, - 223, 166, 31, 250, 59, 130, 64, 132, 102, 25, 217, 248, 55, 166, 191, 55, - 54, 97, 185, 192, 223, 49, 228, 243, 206, 64, 12, 1, 136, 78, 63, 19, - 254, 89, 243, 207, 7, 172, 93, 244, 59, 214, 13, 254, 70, 191, 163, 210, - 156, 201, 122, 115, 202, 237, 124, 62, 221, 50, 125, 90, 46, 227, 8, 233, - 247, 167, 22, 8, 157, 68, 55, 120, 247, 168, 38, 117, 185, 68, 200, 42, - 165, 178, 240, 71, 79, 39, 107, 101, 10, 43, 227, 209, 26, 82, 210, 70, - 227, 65, 87, 97, 28, 91, 174, 177, 116, 236, 145, 99, 15, 28, 59, 118, - 2, 220, 151, 37, 240, 43, 198, 210, 181, 71, 174, 61, 112, 237, 216, 13, - 238, 26, 174, 254, 73, 223, 155, 241, 106, 23, 111, 140, 80, 94, 79, 174, - 140, 176, 143, 244, 19, 148, 234, 183, 64, 41, 75, 167, 196, 219, 127, 100, - 13, 165, 187, 83, 11, 114, 181, 6, 238, 25, 194, 193, 152, 8, 34, 135, - 81, 108, 11, 170, 97, 13, 32, 42, 123, 16, 6, 94, 223, 203, 161, 84, - 139, 116, 201, 74, 70, 122, 146, 113, 21, 254, 251, 191, 45, 46, 119, 195, - 32, 51, 8, 244, 69, 95, 180, 236, 109, 43, 70, 0, 48, 218, 96, 242, - 69, 72, 166, 67, 242, 74, 149, 237, 130, 194, 229, 58, 141, 195, 72, 118, - 126, 121, 179, 73, 73, 13, 104, 118, 25, 127, 1, 125, 251, 133, 91, 197, - 123, 20, 244, 110, 25, 77, 236, 232, 36, 184, 59, 197, 111, 209, 4, 62, - 194, 31, 183, 106, 163, 213, 102, 116, 130, 175, 39, 240, 10, 93, 44, 189, - 65, 162, 171, 87, 215, 168, 171, 236, 123, 253, 235, 201, 245, 24, 3, 97, - 238, 91, 144, 155, 21, 157, 144, 200, 4, 191, 13, 11, 193, 223, 64, 14, - 130, 95, 70, 117, 83, 126, 188, 169, 71, 81, 241, 253, 174, 34, 34, 86, - 247, 16, 111, 167, 222, 164, 216, 8, 150, 35, 80, 39, 52, 171, 67, 213, - 56, 18, 40, 204, 211, 5, 116, 238, 112, 1, 236, 248, 50, 4, 102, 71, - 123, 139, 249, 240, 242, 154, 46, 123, 233, 168, 145, 130, 104, 215, 51, 139, - 163, 197, 90, 19, 223, 99, 142, 141, 211, 119, 24, 207, 198, 215, 42, 54, - 48, 28, 45, 86, 142, 143, 78, 53, 61, 196, 53, 34, 31, 97, 170, 29, - 201, 236, 90, 45, 190, 113, 138, 157, 103, 89, 125, 133, 79, 119, 240, 214, - 86, 48, 118, 13, 61, 171, 76, 45, 42, 155, 131, 33, 136, 129, 80, 253, - 33, 115, 248, 104, 114, 53, 155, 47, 36, 128, 173, 184, 100, 236, 247, 175, - 231, 148, 113, 44, 241, 186, 38, 225, 162, 63, 194, 35, 228, 171, 249, 172, - 143, 216, 108, 21, 39, 152, 34, 165, 64, 125, 220, 96, 116, 125, 57, 212, - 139, 74, 119, 217, 86, 153, 211, 235, 201, 57, 180, 22, 202, 187, 188, 142, - 6, 208, 144, 139, 104, 12, 17, 204, 104, 129, 16, 150, 116, 13, 12, 217, - 178, 82, 139, 188, 136, 229, 115, 94, 214, 72, 208, 86, 176, 114, 254, 80, - 148, 97, 135, 50, 6, 150, 1, 44, 34, 137, 144, 130, 0, 157, 92, 199, - 11, 148, 98, 4, 12, 40, 50, 26, 104, 79, 3, 162, 92, 64, 149, 96, - 73, 164, 22, 43, 128, 62, 173, 196, 244, 112, 106, 37, 105, 215, 213, 35, - 116, 180, 158, 64, 115, 101, 11, 69, 248, 173, 202, 236, 106, 72, 247, 221, - 184, 87, 27, 226, 93, 56, 30, 244, 45, 129, 156, 103, 203, 93, 160, 103, - 52, 140, 129, 211, 244, 203, 118, 166, 159, 97, 179, 104, 23, 117, 8, 36, - 32, 232, 179, 52, 121, 6, 157, 150, 88, 149, 51, 52, 154, 134, 97, 98, - 120, 39, 216, 139, 76, 251, 209, 56, 182, 151, 232, 163, 187, 174, 207, 28, - 177, 240, 226, 12, 108, 58, 174, 145, 153, 84, 234, 78, 220, 195, 106, 43, - 60, 52, 113, 245, 173, 144, 210, 160, 134, 237, 228, 189, 13, 117, 203, 94, - 160, 119, 216, 37, 236, 214, 170, 146, 129, 195, 77, 47, 41, 242, 54, 3, - 113, 204, 2, 183, 217, 54, 182, 248, 161, 163, 212, 78, 140, 233, 164, 199, - 211, 13, 111, 168, 207, 55, 38, 188, 51, 71, 192, 139, 238, 243, 13, 124, - 199, 166, 138, 25, 57, 165, 27, 102, 254, 110, 212, 123, 169, 14, 225, 40, - 182, 96, 39, 192, 87, 129, 45, 99, 13, 108, 171, 13, 153, 0, 71, 186, - 80, 153, 192, 179, 200, 99, 122, 42, 66, 237, 11, 153, 144, 81, 188, 80, - 243, 190, 99, 140, 96, 253, 242, 106, 119, 53, 251, 102, 179, 7, 194, 238, - 18, 215, 51, 17, 31, 121, 171, 107, 47, 107, 176, 6, 236, 141, 64, 40, - 89, 46, 224, 27, 231, 145, 253, 6, 139, 158, 200, 230, 154, 178, 25, 225, - 218, 151, 202, 102, 84, 179, 150, 238, 222, 18, 178, 25, 45, 220, 76, 54, - 234, 27, 173, 190, 8, 240, 96, 65, 61, 234, 22, 20, 216, 128, 47, 213, - 103, 20, 4, 121, 214, 45, 72, 220, 128, 50, 241, 118, 127, 238, 13, 214, - 91, 93, 50, 114, 16, 243, 76, 236, 101, 157, 102, 251, 41, 238, 108, 241, - 242, 25, 150, 215, 100, 147, 187, 226, 35, 97, 204, 98, 181, 149, 197, 210, - 45, 204, 98, 173, 237, 147, 81, 52, 199, 234, 46, 143, 33, 5, 72, 8, - 152, 149, 116, 1, 191, 36, 63, 226, 248, 117, 116, 12, 85, 162, 175, 107, - 245, 21, 234, 72, 202, 109, 48, 96, 55, 81, 124, 77, 163, 117, 62, 91, - 140, 140, 229, 41, 190, 159, 153, 4, 226, 106, 188, 6, 58, 29, 204, 32, - 80, 4, 216, 165, 211, 151, 229, 147, 87, 47, 206, 204, 175, 7, 3, 243, - 5, 241, 129, 151, 200, 234, 204, 202, 11, 53, 203, 204, 82, 233, 139, 210, - 29, 116, 212, 235, 77, 9, 168, 90, 168, 64, 156, 90, 156, 177, 203, 130, - 101, 16, 224, 189, 76, 10, 236, 20, 239, 180, 100, 172, 187, 8, 232, 113, - 99, 195, 143, 203, 63, 62, 255, 180, 16, 91, 206, 118, 86, 223, 58, 252, - 31, 8, 4, 159, 146, 76, 164, 250, 150, 136, 175, 31, 205, 251, 227, 130, - 164, 109, 121, 243, 97, 238, 138, 229, 67, 44, 9, 76, 186, 21, 79, 43, - 122, 71, 110, 90, 44, 159, 98, 81, 126, 4, 91, 107, 123, 116, 114, 162, - 200, 192, 214, 142, 72, 86, 250, 1, 202, 237, 218, 168, 47, 195, 249, 213, - 169, 133, 67, 120, 38, 36, 6, 18, 34, 106, 36, 53, 180, 27, 46, 1, - 149, 108, 208, 224, 110, 5, 155, 244, 6, 109, 6, 249, 248, 68, 229, 217, - 55, 94, 215, 3, 23, 221, 200, 0, 79, 188, 171, 209, 76, 176, 94, 227, - 119, 161, 15, 146, 41, 148, 136, 70, 95, 5, 80, 39, 101, 194, 109, 179, - 69, 85, 150, 166, 35, 136, 212, 210, 98, 26, 245, 212, 1, 15, 35, 16, - 55, 109, 249, 207, 135, 218, 215, 209, 239, 197, 44, 30, 106, 192, 222, 117, - 189, 170, 172, 171, 212, 167, 67, 57, 201, 93, 128, 87, 75, 254, 130, 252, - 218, 113, 237, 54, 203, 174, 180, 217, 194, 205, 175, 252, 110, 107, 149, 33, - 254, 72, 115, 241, 62, 121, 182, 181, 92, 206, 88, 65, 52, 137, 170, 103, - 144, 101, 156, 9, 227, 19, 12, 243, 78, 143, 109, 47, 129, 127, 193, 16, - 54, 205, 83, 61, 248, 140, 241, 96, 205, 62, 169, 42, 161, 118, 14, 177, - 85, 185, 152, 247, 129, 127, 76, 194, 171, 94, 31, 86, 189, 83, 89, 137, - 166, 28, 23, 25, 37, 147, 227, 238, 87, 215, 94, 17, 124, 245, 154, 254, - 222, 234, 16, 214, 72, 75, 64, 68, 123, 149, 37, 144, 19, 201, 170, 110, - 113, 35, 29, 251, 110, 185, 33, 169, 181, 73, 13, 147, 35, 183, 85, 28, - 222, 45, 222, 251, 76, 143, 90, 6, 141, 53, 206, 79, 241, 7, 24, 25, - 245, 229, 83, 190, 55, 107, 29, 59, 27, 227, 253, 169, 214, 61, 103, 24, - 186, 231, 58, 168, 250, 148, 10, 70, 200, 182, 116, 8, 180, 229, 34, 29, - 114, 207, 142, 144, 192, 36, 84, 35, 166, 78, 69, 178, 56, 100, 198, 111, - 162, 174, 77, 113, 151, 234, 33, 172, 110, 170, 36, 220, 149, 8, 144, 25, - 142, 139, 132, 181, 61, 178, 34, 31, 236, 4, 16, 117, 122, 211, 25, 137, - 73, 2, 248, 218, 167, 69, 92, 11, 63, 195, 72, 76, 216, 99, 185, 192, - 232, 159, 19, 251, 6, 163, 174, 112, 133, 165, 12, 225, 11, 9, 182, 73, - 250, 101, 109, 187, 205, 219, 167, 58, 189, 51, 57, 34, 11, 165, 228, 202, - 51, 188, 33, 106, 6, 45, 134, 191, 103, 102, 170, 54, 58, 166, 176, 214, - 118, 228, 24, 169, 90, 65, 203, 63, 80, 242, 44, 112, 100, 70, 248, 146, - 202, 42, 121, 138, 137, 116, 68, 222, 108, 235, 18, 153, 235, 117, 233, 8, - 132, 165, 76, 16, 142, 18, 56, 230, 0, 119, 166, 67, 248, 241, 211, 218, - 42, 66, 32, 213, 99, 66, 166, 20, 21, 21, 96, 11, 181, 88, 52, 21, - 71, 255, 27, 243, 6, 68, 210, 201, 112, 49, 143, 250, 242, 136, 254, 226, - 122, 218, 231, 205, 192, 197, 108, 46, 175, 172, 197, 54, 68, 156, 19, 80, - 209, 208, 40, 250, 45, 217, 58, 118, 116, 201, 74, 94, 74, 36, 227, 38, - 98, 47, 124, 132, 151, 210, 110, 244, 78, 52, 121, 242, 159, 26, 115, 194, - 163, 231, 85, 135, 0, 216, 107, 184, 82, 64, 114, 185, 86, 24, 9, 143, - 54, 97, 187, 10, 95, 146, 63, 230, 5, 72, 214, 23, 149, 200, 142, 222, - 115, 29, 109, 167, 90, 54, 207, 77, 173, 110, 12, 213, 154, 175, 246, 45, - 81, 86, 254, 36, 53, 41, 244, 93, 246, 137, 218, 117, 73, 13, 255, 142, - 42, 82, 73, 131, 31, 205, 127, 30, 116, 70, 101, 85, 69, 199, 113, 236, - 189, 109, 197, 206, 219, 206, 231, 11, 8, 62, 148, 129, 123, 222, 126, 226, - 86, 174, 122, 244, 191, 94, 247, 18, 175, 123, 23, 232, 81, 15, 123, 241, - 205, 30, 37, 1, 62, 138, 161, 111, 69, 232, 75, 17, 234, 82, 232, 175, - 34, 244, 185, 8, 245, 206, 20, 150, 34, 122, 202, 187, 120, 75, 158, 242, - 88, 184, 169, 218, 102, 219, 113, 106, 149, 11, 116, 193, 119, 241, 22, 94, - 61, 122, 197, 56, 23, 191, 110, 193, 119, 73, 151, 183, 127, 238, 220, 251, - 20, 63, 83, 73, 13, 255, 198, 115, 239, 51, 189, 76, 229, 217, 162, 251, - 77, 15, 181, 247, 90, 40, 64, 53, 219, 62, 16, 95, 151, 140, 215, 90, - 7, 221, 182, 47, 45, 221, 14, 58, 7, 94, 167, 3, 4, 209, 236, 238, - 119, 28, 215, 65, 203, 113, 152, 23, 237, 118, 71, 152, 163, 195, 83, 203, - 111, 145, 45, 156, 211, 114, 188, 246, 129, 141, 26, 127, 251, 158, 215, 246, - 206, 106, 121, 246, 232, 126, 211, 245, 91, 222, 126, 107, 255, 224, 96, 223, - 67, 155, 196, 102, 199, 221, 247, 96, 234, 58, 221, 3, 182, 125, 109, 29, - 192, 244, 108, 121, 93, 152, 128, 158, 168, 197, 126, 119, 255, 160, 13, 243, - 251, 224, 160, 5, 249, 195, 228, 193, 255, 186, 7, 174, 139, 102, 121, 142, - 239, 183, 218, 48, 135, 221, 125, 87, 152, 170, 239, 187, 7, 251, 157, 3, - 156, 134, 46, 213, 204, 235, 30, 116, 91, 7, 251, 45, 168, 32, 36, 111, - 65, 253, 92, 152, 102, 192, 91, 124, 81, 71, 84, 180, 223, 2, 49, 70, - 147, 239, 63, 153, 166, 63, 217, 121, 154, 86, 199, 191, 41, 85, 255, 39, - 156, 167, 229, 248, 78, 219, 50, 70, 223, 203, 51, 70, 47, 114, 220, 157, - 8, 164, 15, 26, 97, 50, 217, 85, 67, 172, 50, 253, 92, 173, 221, 84, - 118, 133, 29, 210, 200, 179, 224, 109, 36, 22, 188, 25, 143, 87, 80, 31, - 232, 153, 3, 152, 232, 118, 203, 57, 128, 249, 132, 207, 13, 188, 88, 108, - 120, 48, 253, 249, 157, 208, 36, 140, 180, 217, 176, 148, 222, 243, 76, 54, - 215, 209, 239, 143, 208, 123, 175, 254, 157, 244, 29, 103, 248, 217, 61, 151, - 100, 149, 54, 249, 117, 9, 78, 163, 227, 219, 104, 135, 234, 34, 143, 99, - 14, 2, 242, 2, 254, 118, 90, 251, 45, 14, 115, 155, 174, 179, 143, 124, - 113, 223, 105, 117, 114, 152, 7, 154, 202, 63, 74, 147, 187, 122, 155, 187, - 15, 108, 116, 247, 35, 212, 66, 83, 37, 199, 222, 190, 145, 24, 228, 103, - 39, 81, 142, 189, 125, 35, 49, 200, 87, 160, 149, 143, 223, 193, 215, 55, - 143, 208, 191, 255, 245, 115, 210, 189, 156, 225, 103, 247, 110, 146, 85, 214, - 138, 156, 78, 35, 96, 217, 59, 232, 250, 178, 189, 254, 65, 171, 195, 166, - 226, 93, 167, 67, 129, 30, 172, 99, 30, 44, 96, 142, 88, 146, 114, 91, - 156, 79, 82, 69, 77, 147, 163, 45, 26, 112, 30, 198, 168, 204, 32, 179, - 121, 64, 67, 63, 70, 70, 197, 92, 88, 88, 125, 55, 132, 33, 248, 22, - 71, 22, 86, 223, 13, 97, 8, 174, 88, 137, 28, 156, 164, 55, 14, 209, - 67, 222, 12, 183, 192, 107, 243, 36, 156, 70, 87, 215, 99, 170, 175, 248, - 28, 66, 255, 12, 127, 111, 98, 69, 203, 108, 121, 84, 198, 133, 186, 46, - 215, 104, 1, 253, 127, 104, 158, 10, 133, 146, 112, 21, 197, 118, 175, 63, - 196, 203, 37, 92, 135, 14, 205, 237, 144, 36, 57, 89, 21, 99, 6, 154, - 15, 190, 2, 245, 17, 27, 117, 114, 240, 10, 104, 91, 149, 232, 114, 8, - 171, 221, 220, 134, 175, 51, 200, 63, 201, 10, 75, 214, 28, 2, 169, 118, - 148, 171, 205, 119, 211, 228, 102, 13, 163, 149, 165, 5, 234, 157, 185, 66, - 159, 71, 240, 239, 22, 254, 245, 205, 77, 146, 193, 127, 197, 232, 208, 175, - 172, 90, 82, 22, 183, 99, 100, 117, 138, 242, 204, 120, 120, 177, 104, 252, - 118, 29, 47, 184, 248, 63, 240, 110, 32, 224, 232, 244, 234, 6, 243, 232, - 114, 164, 71, 217, 20, 75, 40, 170, 152, 66, 231, 36, 108, 32, 182, 182, - 209, 235, 50, 154, 224, 198, 67, 57, 28, 235, 220, 248, 130, 190, 218, 102, - 157, 14, 174, 217, 242, 208, 117, 234, 110, 183, 102, 29, 111, 158, 138, 43, - 120, 186, 254, 196, 143, 34, 175, 21, 226, 54, 228, 230, 39, 44, 209, 132, - 149, 227, 58, 69, 17, 189, 69, 52, 30, 146, 165, 241, 9, 93, 70, 191, - 198, 191, 232, 48, 74, 53, 171, 183, 122, 22, 184, 153, 160, 53, 4, 101, - 41, 227, 100, 245, 58, 25, 114, 206, 53, 140, 205, 233, 112, 185, 165, 86, - 132, 30, 25, 95, 147, 14, 17, 94, 116, 194, 72, 163, 51, 70, 117, 231, - 139, 109, 198, 111, 67, 232, 251, 73, 136, 153, 133, 215, 139, 25, 60, 69, - 125, 160, 170, 117, 58, 155, 147, 194, 108, 250, 120, 96, 52, 253, 164, 156, - 232, 166, 19, 42, 134, 100, 130, 231, 238, 50, 223, 50, 218, 10, 99, 210, - 6, 105, 226, 67, 142, 215, 241, 112, 176, 149, 28, 200, 126, 171, 89, 179, - 233, 120, 157, 152, 87, 243, 148, 129, 8, 87, 66, 249, 86, 187, 54, 214, - 250, 91, 186, 189, 73, 186, 91, 222, 34, 135, 231, 179, 235, 5, 137, 140, - 201, 52, 69, 13, 47, 234, 237, 229, 104, 72, 151, 241, 107, 54, 254, 25, - 68, 23, 116, 253, 15, 252, 50, 186, 221, 169, 126, 124, 194, 198, 208, 175, - 249, 71, 171, 72, 160, 85, 33, 0, 234, 218, 73, 223, 171, 181, 221, 74, - 19, 149, 109, 100, 104, 108, 75, 97, 215, 97, 181, 220, 196, 2, 90, 4, - 144, 110, 149, 118, 242, 136, 62, 179, 228, 61, 176, 229, 167, 92, 102, 149, - 196, 193, 237, 19, 16, 237, 209, 93, 147, 207, 80, 5, 72, 145, 218, 9, - 98, 104, 58, 43, 167, 129, 245, 16, 193, 205, 146, 230, 139, 82, 248, 170, - 252, 242, 75, 116, 185, 67, 44, 254, 117, 112, 135, 85, 138, 127, 159, 67, - 189, 158, 160, 129, 235, 73, 32, 60, 93, 90, 79, 246, 172, 215, 120, 34, - 81, 221, 8, 37, 166, 29, 165, 194, 254, 228, 100, 179, 178, 238, 94, 111, - 74, 122, 233, 102, 69, 145, 83, 85, 104, 43, 157, 160, 181, 241, 73, 205, - 122, 205, 42, 99, 214, 147, 167, 214, 9, 60, 67, 216, 235, 70, 133, 223, - 170, 124, 241, 68, 182, 87, 99, 233, 33, 136, 170, 123, 130, 71, 177, 175, - 245, 26, 186, 15, 172, 161, 166, 67, 101, 157, 28, 99, 239, 98, 78, 203, - 112, 62, 149, 153, 157, 68, 49, 109, 96, 228, 34, 12, 228, 15, 116, 71, - 20, 137, 236, 105, 182, 100, 139, 162, 226, 252, 211, 253, 79, 77, 164, 246, - 138, 230, 230, 180, 214, 149, 173, 213, 26, 234, 113, 67, 161, 245, 150, 247, - 40, 173, 125, 253, 25, 173, 101, 102, 243, 152, 13, 142, 135, 70, 65, 67, - 108, 108, 137, 229, 174, 44, 79, 207, 62, 150, 100, 196, 148, 96, 17, 234, - 74, 66, 83, 74, 33, 139, 38, 26, 116, 27, 81, 19, 158, 100, 55, 238, - 172, 227, 58, 18, 153, 187, 57, 51, 224, 151, 206, 177, 61, 37, 227, 156, - 188, 102, 45, 242, 166, 105, 29, 139, 123, 7, 84, 146, 91, 110, 232, 103, - 180, 17, 139, 17, 124, 62, 177, 105, 90, 224, 241, 10, 222, 187, 246, 205, - 113, 179, 105, 198, 38, 186, 47, 94, 241, 182, 121, 140, 239, 43, 245, 110, - 68, 129, 163, 202, 121, 109, 39, 46, 131, 78, 204, 249, 169, 21, 157, 153, - 119, 13, 207, 254, 7, 172, 120, 246, 221, 63, 172, 245, 70, 211, 174, 197, - 122, 144, 15, 58, 51, 170, 3, 99, 160, 42, 72, 135, 103, 66, 135, 107, - 171, 189, 208, 220, 48, 105, 46, 182, 22, 170, 194, 137, 50, 81, 95, 167, - 162, 82, 199, 64, 43, 88, 97, 78, 33, 137, 36, 130, 25, 43, 226, 145, - 91, 68, 228, 113, 37, 161, 6, 91, 178, 121, 45, 234, 205, 46, 196, 71, - 9, 215, 65, 111, 2, 221, 134, 205, 84, 244, 0, 122, 17, 234, 101, 168, - 28, 134, 12, 248, 106, 150, 146, 245, 20, 196, 139, 134, 120, 195, 170, 183, - 32, 190, 106, 108, 159, 171, 180, 203, 127, 118, 57, 149, 189, 38, 91, 9, - 237, 45, 20, 133, 208, 66, 22, 86, 80, 178, 46, 12, 17, 64, 228, 114, - 72, 38, 134, 194, 118, 22, 173, 12, 209, 15, 26, 60, 180, 131, 243, 168, - 127, 13, 255, 224, 185, 19, 140, 195, 105, 255, 118, 22, 239, 18, 157, 84, - 111, 4, 94, 251, 169, 196, 227, 224, 0, 28, 103, 169, 123, 164, 215, 49, - 240, 11, 22, 161, 212, 48, 148, 206, 199, 215, 115, 16, 160, 226, 81, 56, - 135, 185, 67, 158, 101, 75, 118, 203, 200, 140, 85, 114, 132, 68, 74, 227, - 250, 226, 228, 109, 225, 112, 64, 21, 117, 117, 36, 172, 160, 174, 142, 228, - 10, 23, 141, 137, 50, 146, 47, 214, 178, 142, 114, 165, 26, 59, 65, 105, - 58, 43, 153, 177, 11, 191, 220, 173, 141, 233, 16, 68, 205, 243, 217, 28, - 66, 189, 160, 36, 58, 24, 94, 252, 160, 196, 61, 12, 207, 173, 160, 132, - 93, 12, 79, 237, 160, 36, 250, 24, 94, 58, 16, 133, 59, 185, 148, 58, - 146, 98, 234, 80, 234, 216, 150, 91, 214, 48, 122, 136, 117, 89, 158, 164, - 142, 138, 5, 187, 147, 99, 83, 186, 115, 132, 206, 136, 73, 105, 179, 99, - 91, 157, 234, 6, 207, 160, 244, 222, 47, 64, 135, 152, 78, 80, 31, 106, - 186, 49, 40, 83, 39, 32, 91, 69, 210, 164, 38, 67, 38, 116, 41, 237, - 151, 208, 224, 165, 134, 90, 66, 164, 68, 91, 181, 209, 95, 52, 39, 112, - 243, 18, 180, 48, 65, 43, 149, 160, 85, 85, 124, 12, 248, 27, 211, 201, - 157, 197, 101, 214, 43, 252, 224, 54, 68, 64, 21, 221, 5, 239, 177, 86, - 18, 98, 146, 84, 171, 239, 45, 216, 102, 46, 177, 166, 203, 32, 192, 227, - 64, 254, 40, 150, 18, 74, 85, 91, 238, 37, 5, 194, 170, 111, 140, 48, - 250, 168, 48, 250, 40, 19, 125, 128, 209, 7, 133, 209, 7, 153, 232, 117, - 198, 50, 89, 218, 214, 200, 182, 6, 194, 97, 109, 135, 86, 135, 41, 30, - 8, 138, 35, 76, 210, 117, 85, 14, 104, 53, 207, 142, 211, 137, 105, 77, - 39, 185, 119, 131, 40, 95, 244, 231, 179, 43, 188, 226, 197, 217, 230, 218, - 244, 67, 222, 135, 181, 19, 220, 236, 38, 79, 166, 202, 238, 221, 206, 117, - 110, 115, 3, 159, 102, 115, 97, 243, 70, 4, 50, 69, 125, 194, 148, 64, - 204, 249, 95, 179, 177, 23, 10, 212, 232, 7, 22, 175, 194, 109, 19, 11, - 184, 194, 149, 147, 221, 141, 130, 56, 124, 9, 114, 104, 74, 162, 182, 204, - 150, 131, 231, 113, 164, 221, 79, 14, 236, 132, 49, 120, 167, 133, 168, 73, - 116, 80, 0, 2, 113, 116, 5, 91, 169, 54, 116, 26, 254, 115, 61, 135, - 254, 57, 172, 77, 100, 214, 101, 23, 100, 122, 164, 71, 42, 49, 83, 170, - 24, 2, 44, 73, 39, 231, 192, 128, 19, 56, 37, 201, 141, 129, 34, 209, - 203, 43, 42, 63, 78, 135, 168, 130, 9, 237, 212, 141, 6, 25, 72, 167, - 183, 88, 95, 177, 69, 54, 117, 30, 114, 205, 120, 120, 57, 81, 71, 10, - 200, 58, 9, 204, 38, 154, 194, 54, 36, 214, 84, 123, 85, 135, 227, 228, - 19, 152, 71, 166, 40, 140, 249, 186, 172, 234, 54, 156, 25, 8, 2, 253, - 62, 101, 122, 201, 158, 43, 39, 97, 252, 193, 84, 58, 190, 184, 75, 24, - 135, 192, 184, 19, 84, 55, 85, 236, 48, 236, 143, 148, 105, 72, 26, 224, - 169, 50, 108, 94, 54, 211, 120, 74, 187, 212, 77, 19, 111, 247, 206, 83, - 233, 85, 151, 128, 147, 156, 166, 251, 84, 88, 51, 110, 247, 160, 244, 236, - 169, 119, 95, 26, 141, 133, 172, 57, 218, 29, 160, 163, 8, 198, 24, 50, - 3, 153, 100, 248, 59, 116, 250, 32, 2, 86, 52, 236, 161, 6, 152, 233, - 57, 38, 1, 18, 245, 46, 46, 21, 38, 17, 169, 140, 139, 179, 164, 250, - 20, 146, 160, 57, 154, 132, 225, 81, 14, 16, 235, 121, 212, 0, 251, 149, - 92, 26, 73, 76, 218, 159, 110, 210, 218, 170, 238, 211, 68, 7, 245, 124, - 54, 27, 87, 216, 40, 36, 181, 169, 65, 31, 191, 188, 16, 180, 180, 125, - 139, 167, 57, 236, 149, 52, 144, 59, 238, 116, 6, 149, 129, 143, 147, 125, - 78, 176, 78, 18, 191, 137, 145, 155, 60, 91, 115, 91, 10, 50, 210, 120, - 6, 236, 6, 250, 31, 23, 56, 109, 4, 204, 210, 59, 163, 68, 18, 3, - 195, 114, 225, 8, 168, 237, 174, 150, 65, 203, 198, 154, 217, 58, 53, 219, - 26, 37, 111, 74, 229, 230, 187, 105, 190, 113, 151, 162, 132, 59, 157, 19, - 18, 163, 79, 248, 252, 59, 147, 44, 33, 189, 218, 178, 6, 44, 208, 99, - 174, 168, 44, 58, 72, 85, 235, 152, 184, 31, 230, 4, 195, 140, 103, 238, - 176, 98, 29, 163, 179, 119, 89, 128, 81, 87, 40, 84, 230, 51, 45, 220, - 108, 252, 33, 213, 165, 36, 149, 48, 84, 21, 110, 238, 78, 148, 37, 8, - 62, 27, 211, 0, 53, 45, 143, 229, 126, 9, 70, 229, 221, 220, 52, 143, - 161, 47, 167, 32, 16, 146, 100, 61, 7, 14, 118, 57, 71, 221, 17, 116, - 163, 91, 163, 15, 80, 89, 118, 22, 110, 77, 205, 122, 77, 243, 195, 43, - 52, 169, 2, 32, 6, 147, 97, 172, 208, 228, 39, 161, 46, 12, 105, 190, - 35, 158, 196, 234, 155, 245, 91, 90, 10, 248, 139, 4, 9, 104, 145, 113, - 153, 76, 214, 100, 123, 141, 123, 101, 39, 193, 179, 170, 230, 186, 105, 232, - 139, 134, 237, 158, 37, 27, 102, 71, 237, 69, 90, 100, 245, 22, 138, 221, - 199, 142, 245, 164, 23, 195, 148, 202, 91, 83, 254, 160, 40, 31, 95, 73, - 146, 91, 47, 250, 124, 41, 207, 52, 5, 55, 34, 142, 37, 76, 128, 63, - 186, 226, 216, 170, 56, 60, 238, 93, 39, 199, 59, 188, 162, 232, 5, 37, - 11, 78, 161, 56, 138, 169, 119, 33, 33, 144, 31, 85, 82, 33, 149, 107, - 15, 189, 201, 245, 199, 135, 127, 30, 109, 78, 80, 91, 33, 213, 95, 142, - 145, 233, 62, 197, 81, 104, 196, 82, 156, 160, 65, 221, 34, 133, 53, 238, - 173, 173, 158, 162, 94, 98, 126, 13, 205, 230, 222, 1, 65, 175, 134, 30, - 135, 213, 232, 38, 219, 77, 181, 183, 125, 66, 4, 213, 147, 181, 33, 8, - 9, 108, 53, 84, 133, 144, 38, 145, 250, 147, 100, 59, 40, 77, 36, 216, - 24, 43, 144, 246, 232, 238, 210, 150, 20, 183, 49, 215, 34, 204, 211, 194, - 110, 69, 152, 159, 132, 25, 43, 151, 195, 90, 122, 90, 17, 214, 214, 211, - 138, 176, 142, 150, 150, 154, 179, 114, 142, 173, 149, 91, 66, 191, 130, 37, - 107, 13, 47, 107, 249, 114, 11, 47, 183, 208, 160, 72, 120, 240, 118, 8, - 239, 13, 170, 124, 232, 177, 150, 170, 121, 107, 66, 114, 27, 82, 217, 16, - 217, 134, 108, 224, 25, 254, 221, 186, 105, 80, 119, 197, 139, 14, 97, 87, - 196, 103, 231, 48, 79, 255, 48, 251, 14, 136, 8, 40, 1, 200, 80, 151, - 66, 93, 10, 205, 72, 85, 255, 26, 14, 175, 248, 36, 80, 219, 177, 201, - 124, 119, 109, 207, 190, 137, 230, 81, 127, 52, 6, 182, 124, 142, 204, 147, - 76, 232, 249, 240, 145, 15, 251, 114, 178, 67, 81, 11, 207, 8, 241, 32, - 53, 156, 94, 22, 208, 178, 14, 177, 144, 27, 33, 23, 183, 193, 147, 125, - 34, 142, 86, 51, 93, 178, 202, 237, 146, 213, 253, 187, 68, 100, 251, 72, - 61, 34, 114, 187, 103, 135, 136, 216, 13, 216, 229, 225, 108, 22, 145, 110, - 181, 91, 21, 156, 0, 229, 102, 170, 29, 66, 192, 166, 134, 219, 212, 80, - 187, 39, 235, 133, 2, 15, 219, 251, 196, 42, 202, 90, 139, 184, 190, 111, - 244, 219, 173, 68, 183, 159, 150, 180, 95, 144, 65, 127, 87, 54, 5, 27, - 132, 23, 121, 44, 61, 3, 191, 203, 80, 157, 166, 38, 38, 228, 220, 237, - 220, 102, 238, 118, 114, 106, 145, 58, 142, 24, 168, 129, 231, 51, 137, 107, - 216, 219, 178, 96, 13, 146, 68, 52, 27, 208, 161, 131, 31, 76, 34, 66, - 249, 209, 206, 28, 84, 67, 230, 215, 120, 27, 160, 217, 82, 49, 234, 20, - 208, 142, 176, 116, 155, 162, 246, 244, 66, 194, 119, 10, 83, 43, 82, 212, - 5, 102, 131, 214, 88, 195, 129, 38, 9, 191, 154, 110, 101, 102, 243, 106, - 51, 154, 197, 136, 161, 196, 18, 93, 34, 244, 35, 33, 50, 111, 165, 37, - 140, 101, 111, 16, 169, 174, 139, 142, 230, 243, 123, 165, 240, 150, 169, 78, - 37, 54, 60, 31, 53, 23, 224, 143, 215, 229, 127, 46, 85, 5, 155, 177, - 253, 205, 201, 159, 12, 152, 17, 78, 4, 252, 183, 207, 255, 68, 196, 65, - 20, 94, 162, 5, 91, 198, 54, 17, 225, 137, 21, 85, 240, 114, 68, 183, - 63, 50, 58, 42, 230, 194, 248, 165, 145, 116, 97, 153, 164, 181, 210, 46, - 175, 203, 102, 93, 229, 172, 210, 28, 102, 44, 185, 176, 16, 206, 155, 79, - 115, 211, 153, 175, 196, 217, 132, 238, 121, 156, 141, 95, 233, 160, 178, 238, - 202, 3, 68, 84, 150, 215, 191, 104, 225, 13, 55, 17, 123, 96, 236, 167, - 120, 113, 210, 131, 13, 69, 136, 252, 37, 5, 222, 218, 78, 148, 164, 221, - 103, 120, 22, 84, 74, 192, 174, 8, 239, 130, 23, 209, 228, 224, 26, 33, - 2, 216, 10, 1, 11, 243, 180, 85, 22, 164, 209, 254, 48, 26, 87, 220, - 58, 124, 218, 179, 92, 237, 144, 67, 121, 25, 74, 129, 131, 106, 43, 57, - 98, 248, 70, 83, 216, 68, 163, 162, 59, 239, 140, 208, 154, 245, 53, 57, - 82, 71, 204, 143, 223, 8, 10, 185, 169, 105, 141, 147, 253, 134, 56, 36, - 69, 180, 158, 57, 180, 224, 169, 45, 255, 113, 237, 180, 115, 78, 30, 46, - 24, 218, 27, 200, 27, 247, 203, 132, 59, 195, 136, 58, 227, 48, 154, 234, - 155, 97, 50, 18, 132, 93, 250, 112, 144, 99, 196, 250, 79, 145, 133, 34, - 19, 239, 27, 201, 63, 96, 30, 205, 18, 29, 239, 93, 55, 85, 12, 122, - 211, 105, 73, 152, 28, 170, 129, 171, 219, 40, 114, 241, 184, 151, 76, 234, - 172, 141, 27, 26, 13, 166, 17, 96, 108, 82, 107, 79, 100, 48, 89, 79, - 89, 61, 160, 53, 170, 159, 229, 54, 226, 49, 146, 176, 168, 102, 133, 208, - 37, 104, 227, 147, 130, 113, 35, 91, 133, 204, 0, 38, 7, 100, 132, 193, - 162, 197, 71, 60, 24, 220, 18, 249, 4, 58, 187, 161, 43, 27, 136, 11, - 227, 131, 118, 204, 3, 126, 58, 105, 88, 147, 132, 40, 92, 82, 110, 244, - 204, 250, 49, 237, 60, 238, 172, 73, 221, 26, 224, 97, 87, 221, 37, 131, - 102, 22, 111, 234, 209, 92, 251, 106, 29, 227, 23, 123, 59, 46, 218, 26, - 53, 83, 245, 7, 178, 193, 252, 209, 225, 23, 241, 62, 136, 241, 155, 52, - 159, 182, 173, 227, 68, 195, 69, 236, 38, 196, 33, 84, 46, 0, 236, 112, - 117, 5, 35, 211, 91, 161, 196, 139, 83, 105, 69, 103, 42, 121, 76, 237, - 51, 88, 188, 6, 63, 132, 165, 108, 3, 94, 147, 146, 1, 114, 217, 85, - 35, 173, 96, 112, 31, 46, 91, 132, 13, 171, 154, 228, 35, 247, 212, 26, - 40, 137, 204, 213, 141, 39, 20, 147, 240, 158, 5, 126, 178, 227, 23, 53, - 86, 55, 83, 153, 154, 138, 5, 21, 207, 49, 112, 231, 203, 199, 178, 37, - 84, 66, 132, 61, 170, 103, 171, 126, 178, 69, 31, 217, 178, 127, 108, 238, - 27, 132, 172, 80, 226, 81, 210, 166, 173, 195, 219, 132, 9, 46, 235, 94, - 205, 114, 245, 43, 22, 113, 207, 98, 161, 255, 163, 182, 252, 87, 52, 190, - 107, 49, 192, 127, 209, 240, 174, 161, 215, 10, 217, 198, 103, 142, 239, 58, - 61, 192, 235, 71, 27, 97, 174, 236, 95, 55, 196, 188, 26, 102, 135, 251, - 222, 35, 125, 251, 23, 15, 245, 237, 103, 142, 117, 170, 1, 143, 52, 146, - 183, 255, 131, 134, 18, 159, 7, 250, 176, 222, 115, 68, 229, 212, 237, 173, - 255, 154, 17, 93, 63, 62, 111, 78, 79, 221, 71, 155, 185, 235, 191, 128, - 55, 211, 72, 62, 104, 198, 202, 249, 218, 187, 253, 107, 198, 247, 246, 51, - 199, 87, 171, 254, 163, 140, 222, 237, 95, 53, 122, 106, 8, 63, 113, 118, - 210, 85, 80, 79, 236, 165, 15, 205, 83, 62, 194, 150, 104, 96, 242, 59, - 48, 161, 158, 182, 201, 212, 165, 113, 78, 192, 190, 115, 196, 203, 137, 14, - 217, 72, 87, 77, 168, 167, 41, 156, 232, 228, 232, 12, 47, 113, 43, 11, - 237, 156, 207, 135, 241, 21, 182, 22, 58, 147, 61, 64, 192, 254, 181, 156, - 170, 18, 233, 189, 17, 98, 15, 109, 239, 249, 211, 164, 156, 156, 208, 234, - 151, 13, 163, 225, 4, 55, 112, 39, 74, 111, 102, 23, 64, 38, 16, 73, - 81, 107, 11, 183, 194, 116, 253, 239, 43, 39, 29, 77, 179, 133, 182, 240, - 233, 78, 77, 64, 73, 92, 196, 208, 203, 118, 248, 71, 240, 192, 216, 198, - 68, 168, 172, 137, 205, 223, 23, 207, 124, 77, 9, 77, 118, 113, 210, 189, - 250, 13, 60, 117, 80, 108, 162, 197, 202, 84, 193, 146, 240, 253, 78, 66, - 146, 79, 158, 0, 149, 64, 167, 149, 232, 246, 38, 57, 74, 104, 28, 227, - 253, 170, 200, 34, 185, 88, 141, 46, 97, 119, 1, 99, 148, 82, 53, 74, - 102, 198, 61, 170, 115, 7, 155, 33, 58, 215, 253, 140, 90, 137, 73, 32, - 64, 83, 38, 55, 132, 72, 144, 241, 222, 131, 122, 172, 117, 235, 217, 230, - 204, 128, 141, 18, 58, 249, 185, 139, 235, 21, 203, 251, 202, 63, 116, 4, - 84, 154, 245, 197, 49, 116, 98, 115, 5, 15, 13, 120, 128, 6, 92, 224, - 64, 149, 142, 161, 252, 6, 108, 244, 71, 189, 113, 116, 190, 81, 246, 148, - 4, 64, 96, 190, 70, 188, 246, 19, 52, 153, 60, 50, 222, 144, 241, 162, - 104, 7, 90, 237, 141, 194, 120, 132, 78, 107, 233, 228, 224, 117, 197, 65, - 195, 64, 116, 207, 244, 1, 2, 29, 219, 252, 240, 12, 217, 65, 229, 77, - 213, 54, 235, 245, 15, 4, 68, 58, 58, 125, 115, 250, 225, 236, 12, 190, - 127, 128, 60, 189, 42, 25, 30, 86, 34, 32, 224, 128, 63, 71, 103, 213, - 99, 231, 171, 138, 1, 53, 7, 78, 208, 139, 166, 241, 112, 190, 168, 124, - 1, 49, 236, 83, 243, 85, 5, 209, 172, 86, 246, 218, 190, 53, 207, 170, - 135, 217, 8, 244, 153, 178, 52, 163, 35, 220, 104, 87, 84, 109, 60, 172, - 205, 88, 212, 3, 166, 28, 214, 235, 139, 15, 208, 75, 152, 135, 120, 171, - 210, 49, 133, 3, 11, 92, 181, 10, 116, 71, 94, 76, 180, 11, 27, 214, - 11, 72, 248, 200, 4, 157, 252, 92, 226, 38, 184, 4, 60, 96, 13, 163, - 6, 19, 104, 48, 44, 217, 61, 241, 165, 39, 193, 196, 159, 37, 202, 158, - 168, 108, 9, 172, 255, 89, 64, 90, 11, 117, 228, 176, 218, 93, 183, 66, - 31, 23, 74, 173, 144, 237, 112, 78, 203, 198, 4, 230, 108, 116, 37, 131, - 98, 72, 83, 234, 9, 60, 40, 84, 33, 149, 138, 81, 218, 97, 226, 16, - 119, 218, 25, 245, 88, 89, 229, 52, 202, 85, 238, 149, 119, 114, 230, 200, - 109, 51, 251, 132, 65, 174, 10, 104, 152, 229, 95, 202, 116, 55, 30, 199, - 195, 201, 57, 20, 129, 252, 46, 117, 17, 133, 16, 249, 186, 82, 176, 166, - 44, 204, 121, 54, 245, 220, 190, 43, 204, 109, 4, 51, 239, 22, 107, 158, - 82, 44, 134, 36, 63, 23, 38, 65, 19, 132, 172, 38, 50, 36, 248, 186, - 48, 65, 72, 112, 80, 73, 73, 102, 56, 159, 135, 233, 196, 207, 119, 38, - 86, 69, 230, 164, 252, 46, 60, 60, 79, 39, 94, 44, 103, 230, 249, 120, - 214, 255, 16, 163, 42, 190, 128, 30, 46, 239, 104, 233, 125, 115, 40, 104, - 248, 155, 144, 82, 207, 103, 11, 166, 10, 74, 73, 9, 207, 215, 230, 129, - 99, 14, 134, 151, 77, 179, 82, 126, 131, 241, 112, 206, 184, 93, 17, 70, - 249, 190, 81, 225, 222, 62, 135, 87, 83, 185, 159, 112, 238, 66, 130, 209, - 115, 79, 132, 132, 95, 88, 72, 168, 148, 79, 84, 102, 24, 252, 150, 130, - 181, 236, 190, 214, 82, 139, 51, 234, 80, 242, 75, 152, 227, 81, 127, 104, - 86, 22, 68, 220, 3, 83, 74, 16, 216, 220, 42, 153, 70, 152, 83, 160, - 177, 132, 102, 65, 210, 193, 91, 101, 92, 117, 202, 223, 157, 31, 246, 203, - 118, 249, 103, 254, 121, 115, 206, 74, 229, 39, 240, 27, 45, 96, 42, 92, - 36, 85, 248, 22, 62, 12, 87, 4, 188, 101, 167, 168, 191, 252, 157, 115, - 248, 179, 123, 232, 65, 205, 168, 6, 113, 82, 181, 229, 104, 56, 151, 179, - 140, 142, 181, 9, 63, 145, 110, 93, 135, 23, 11, 219, 84, 146, 83, 140, - 11, 35, 189, 158, 122, 103, 218, 112, 1, 115, 239, 127, 96, 48, 52, 76, - 69, 70, 18, 59, 78, 235, 52, 134, 19, 252, 66, 202, 33, 58, 207, 241, - 32, 68, 103, 41, 101, 169, 20, 178, 205, 50, 130, 82, 169, 72, 245, 156, - 161, 199, 190, 50, 235, 87, 227, 48, 158, 132, 4, 191, 53, 10, 175, 134, - 189, 254, 245, 85, 52, 48, 89, 133, 36, 173, 21, 114, 49, 71, 212, 82, - 159, 240, 113, 248, 25, 207, 161, 249, 155, 0, 123, 168, 75, 38, 244, 181, - 122, 228, 101, 244, 59, 247, 240, 103, 232, 223, 239, 188, 67, 23, 250, 217, - 55, 18, 254, 170, 212, 7, 165, 92, 224, 41, 87, 94, 186, 164, 170, 233, - 28, 254, 178, 41, 217, 172, 47, 98, 151, 80, 77, 100, 35, 196, 8, 136, - 231, 106, 114, 132, 228, 146, 99, 88, 222, 161, 239, 83, 236, 49, 173, 23, - 146, 34, 3, 75, 28, 139, 38, 134, 2, 150, 71, 112, 184, 32, 209, 101, - 243, 38, 62, 255, 233, 89, 83, 50, 179, 132, 46, 191, 188, 13, 194, 101, - 240, 85, 115, 218, 93, 133, 67, 141, 26, 207, 150, 195, 121, 63, 140, 135, - 149, 50, 42, 181, 149, 171, 65, 80, 94, 149, 55, 102, 125, 172, 157, 149, - 78, 39, 12, 86, 121, 156, 214, 203, 101, 228, 105, 204, 5, 79, 67, 151, - 199, 35, 150, 192, 74, 248, 196, 200, 171, 63, 11, 133, 9, 252, 62, 58, - 94, 138, 239, 248, 196, 223, 191, 211, 190, 39, 233, 241, 187, 202, 118, 180, - 183, 220, 60, 171, 44, 9, 29, 141, 243, 100, 75, 97, 78, 175, 116, 178, - 85, 46, 123, 35, 136, 62, 34, 20, 52, 17, 37, 137, 254, 51, 137, 45, - 145, 49, 5, 218, 10, 8, 136, 19, 147, 76, 55, 135, 119, 211, 141, 164, - 24, 5, 33, 70, 23, 71, 150, 103, 176, 192, 196, 0, 114, 22, 166, 228, - 83, 86, 238, 120, 113, 122, 60, 23, 199, 172, 114, 160, 44, 254, 138, 123, - 9, 203, 7, 34, 106, 241, 248, 26, 175, 3, 235, 137, 129, 214, 208, 189, - 184, 207, 200, 180, 110, 201, 228, 89, 6, 37, 21, 141, 199, 168, 44, 68, - 176, 215, 199, 46, 234, 165, 163, 230, 51, 95, 89, 224, 197, 8, 219, 60, - 16, 176, 17, 170, 137, 172, 185, 189, 105, 133, 1, 238, 229, 188, 188, 111, - 118, 228, 237, 125, 66, 222, 113, 176, 149, 251, 81, 12, 249, 135, 101, 114, - 94, 3, 171, 139, 80, 13, 120, 253, 204, 203, 170, 51, 76, 231, 210, 110, - 128, 205, 58, 94, 163, 89, 199, 180, 175, 140, 9, 94, 239, 89, 211, 185, - 48, 155, 40, 106, 199, 57, 90, 138, 7, 16, 207, 132, 220, 172, 105, 31, - 211, 91, 148, 187, 214, 134, 216, 92, 217, 13, 145, 235, 50, 201, 52, 171, - 33, 101, 50, 230, 28, 107, 41, 156, 193, 99, 170, 191, 89, 23, 71, 59, - 86, 135, 0, 110, 218, 116, 158, 164, 129, 151, 84, 79, 138, 84, 107, 166, - 131, 202, 29, 215, 28, 56, 145, 64, 154, 9, 130, 125, 239, 143, 63, 34, - 188, 165, 66, 44, 2, 155, 195, 186, 29, 14, 115, 187, 54, 222, 55, 112, - 152, 136, 231, 74, 127, 111, 152, 118, 95, 164, 61, 176, 27, 45, 10, 59, - 14, 90, 221, 47, 191, 140, 158, 5, 237, 125, 59, 106, 180, 32, 125, 187, - 138, 255, 43, 27, 177, 89, 199, 102, 208, 143, 199, 63, 62, 255, 180, 248, - 167, 189, 117, 75, 66, 182, 251, 147, 99, 212, 153, 170, 215, 97, 207, 214, - 53, 241, 18, 235, 110, 193, 42, 77, 100, 23, 230, 100, 251, 100, 141, 247, - 181, 125, 132, 211, 132, 12, 113, 218, 113, 59, 159, 57, 118, 100, 71, 79, - 97, 140, 203, 140, 169, 36, 47, 205, 208, 190, 6, 239, 17, 211, 148, 49, - 97, 238, 158, 108, 88, 128, 179, 0, 97, 68, 88, 45, 65, 184, 125, 170, - 23, 63, 194, 92, 52, 35, 168, 218, 169, 213, 135, 90, 147, 151, 64, 160, - 54, 212, 73, 139, 196, 37, 201, 240, 194, 138, 2, 171, 207, 132, 140, 124, - 173, 143, 22, 161, 24, 220, 199, 96, 130, 64, 102, 46, 199, 203, 227, 221, - 251, 141, 217, 27, 243, 35, 169, 254, 90, 20, 94, 165, 166, 211, 124, 78, - 44, 37, 204, 138, 48, 197, 72, 25, 98, 240, 5, 95, 149, 51, 133, 254, - 100, 172, 185, 222, 21, 200, 242, 31, 78, 97, 239, 36, 5, 254, 205, 153, - 185, 12, 24, 49, 207, 28, 5, 140, 153, 39, 169, 163, 226, 216, 235, 234, - 51, 135, 8, 163, 90, 78, 122, 22, 106, 110, 118, 237, 187, 209, 94, 119, - 35, 200, 211, 16, 216, 8, 12, 218, 46, 86, 147, 159, 102, 32, 95, 133, - 83, 244, 243, 144, 184, 250, 196, 53, 71, 14, 128, 80, 106, 110, 161, 82, - 243, 4, 118, 36, 189, 100, 249, 180, 90, 80, 77, 231, 76, 48, 176, 204, - 71, 234, 245, 82, 105, 255, 41, 244, 178, 16, 224, 136, 204, 69, 120, 87, - 11, 95, 99, 184, 16, 33, 239, 14, 156, 26, 124, 238, 224, 229, 107, 74, - 9, 17, 2, 91, 52, 39, 171, 208, 123, 153, 15, 109, 249, 65, 92, 213, - 250, 180, 172, 161, 22, 20, 25, 39, 16, 161, 36, 230, 52, 35, 96, 21, - 208, 137, 21, 28, 117, 104, 212, 138, 94, 92, 126, 89, 211, 139, 199, 47, - 75, 122, 241, 249, 101, 68, 47, 45, 126, 9, 233, 165, 205, 47, 19, 206, - 161, 35, 222, 56, 139, 125, 122, 99, 18, 246, 255, 248, 227, 137, 117, 204, - 228, 199, 138, 227, 80, 26, 97, 6, 170, 14, 35, 219, 25, 235, 142, 104, - 112, 99, 91, 171, 200, 182, 214, 145, 108, 167, 181, 140, 146, 70, 91, 35, - 124, 177, 66, 136, 49, 193, 104, 80, 30, 93, 246, 97, 14, 50, 33, 47, - 67, 215, 83, 105, 78, 160, 138, 161, 11, 192, 134, 96, 229, 120, 155, 204, - 110, 158, 75, 167, 39, 98, 220, 80, 78, 56, 99, 204, 156, 100, 44, 185, - 21, 189, 171, 99, 139, 201, 61, 223, 55, 147, 136, 142, 240, 255, 88, 48, - 136, 120, 139, 97, 90, 6, 41, 89, 188, 182, 17, 218, 55, 234, 170, 177, - 138, 24, 228, 108, 203, 169, 99, 104, 243, 182, 119, 133, 134, 66, 215, 166, - 37, 221, 211, 192, 60, 12, 26, 173, 141, 193, 31, 198, 129, 62, 67, 204, - 139, 83, 107, 124, 6, 210, 125, 128, 227, 178, 174, 62, 245, 142, 96, 118, - 84, 86, 192, 0, 191, 252, 50, 172, 254, 241, 7, 62, 118, 190, 252, 242, - 73, 88, 181, 159, 68, 200, 7, 225, 29, 125, 154, 130, 68, 89, 109, 224, - 207, 26, 126, 96, 10, 193, 28, 130, 34, 199, 122, 145, 126, 65, 145, 99, - 42, 18, 205, 163, 234, 40, 115, 195, 172, 52, 231, 55, 167, 174, 13, 207, - 228, 219, 148, 144, 246, 240, 66, 183, 101, 255, 3, 245, 11, 110, 78, 125, - 27, 226, 212, 79, 219, 200, 88, 144, 237, 19, 87, 20, 197, 193, 20, 162, - 82, 140, 108, 41, 48, 245, 173, 177, 253, 15, 244, 204, 51, 226, 71, 232, - 131, 121, 58, 210, 28, 35, 205, 41, 210, 124, 196, 143, 45, 217, 153, 132, - 55, 42, 198, 16, 229, 9, 88, 101, 209, 70, 2, 201, 201, 26, 143, 108, - 107, 142, 242, 83, 157, 187, 143, 88, 84, 197, 26, 53, 224, 75, 181, 134, - 70, 37, 64, 113, 148, 170, 186, 81, 10, 9, 32, 244, 67, 244, 57, 69, - 183, 198, 75, 145, 96, 190, 43, 1, 183, 15, 74, 173, 240, 199, 134, 87, - 173, 233, 21, 168, 87, 252, 134, 72, 70, 153, 168, 138, 25, 227, 11, 104, - 206, 104, 15, 2, 160, 105, 226, 121, 62, 146, 221, 178, 172, 89, 227, 11, - 217, 124, 120, 153, 95, 108, 140, 26, 55, 5, 234, 49, 190, 72, 253, 163, - 21, 183, 140, 158, 78, 230, 252, 125, 126, 145, 250, 39, 190, 167, 218, 230, - 232, 141, 64, 205, 91, 202, 188, 210, 112, 5, 55, 31, 47, 235, 80, 240, - 6, 39, 181, 96, 230, 33, 196, 192, 15, 117, 182, 65, 11, 41, 1, 102, - 137, 214, 114, 148, 181, 80, 42, 193, 251, 14, 41, 159, 38, 35, 179, 148, - 35, 3, 140, 98, 190, 212, 71, 6, 250, 110, 9, 227, 178, 44, 238, 230, - 212, 200, 112, 244, 249, 118, 116, 236, 219, 236, 200, 44, 115, 70, 134, 43, - 176, 61, 50, 162, 98, 60, 50, 32, 43, 141, 151, 98, 100, 224, 25, 186, - 66, 80, 233, 72, 140, 12, 81, 227, 232, 145, 71, 198, 201, 54, 98, 107, - 100, 128, 207, 98, 37, 234, 72, 43, 159, 51, 50, 144, 33, 205, 75, 229, - 162, 77, 172, 85, 135, 41, 16, 131, 77, 179, 217, 76, 189, 103, 84, 239, - 78, 56, 81, 254, 85, 139, 142, 165, 80, 232, 232, 94, 45, 145, 226, 137, - 48, 40, 119, 70, 93, 105, 137, 82, 182, 220, 158, 82, 6, 21, 88, 182, - 144, 1, 63, 145, 141, 64, 47, 94, 228, 64, 72, 252, 32, 162, 102, 44, - 78, 232, 18, 53, 165, 238, 173, 229, 164, 217, 42, 106, 161, 116, 219, 16, - 162, 153, 196, 57, 30, 62, 43, 215, 83, 164, 174, 74, 126, 195, 231, 100, - 205, 112, 183, 250, 99, 253, 199, 237, 31, 253, 77, 114, 15, 65, 230, 45, - 229, 213, 186, 127, 75, 198, 238, 171, 53, 254, 66, 215, 231, 246, 131, 108, - 220, 122, 117, 43, 59, 106, 174, 169, 132, 242, 25, 109, 70, 41, 148, 3, - 205, 4, 105, 35, 109, 195, 153, 123, 7, 103, 247, 194, 21, 252, 91, 195, - 191, 91, 248, 215, 71, 210, 224, 228, 189, 37, 42, 209, 46, 163, 1, 186, - 37, 59, 125, 122, 134, 234, 181, 226, 203, 8, 191, 140, 208, 124, 112, 145, - 253, 52, 192, 79, 194, 151, 89, 250, 75, 140, 95, 176, 167, 23, 243, 235, - 137, 252, 248, 89, 21, 44, 208, 16, 125, 195, 205, 255, 136, 142, 168, 84, - 102, 207, 209, 12, 157, 103, 52, 67, 139, 76, 84, 27, 46, 219, 168, 86, - 38, 195, 201, 140, 175, 227, 22, 232, 210, 0, 225, 60, 254, 35, 214, 171, - 249, 58, 170, 35, 210, 68, 148, 54, 183, 147, 97, 56, 5, 194, 207, 30, - 84, 107, 122, 161, 217, 246, 76, 210, 71, 214, 77, 243, 255, 141, 182, 98, - 5, 1, 54, 151, 46, 246, 160, 29, 88, 105, 115, 131, 212, 155, 91, 33, - 152, 25, 162, 22, 48, 81, 53, 86, 80, 144, 179, 83, 152, 209, 99, 104, - 223, 22, 54, 199, 199, 30, 199, 158, 222, 209, 146, 124, 107, 100, 46, 91, - 31, 23, 32, 77, 160, 76, 32, 204, 176, 95, 102, 35, 166, 20, 64, 6, - 115, 72, 50, 121, 227, 59, 224, 156, 26, 57, 120, 208, 218, 74, 28, 13, - 85, 18, 232, 15, 100, 77, 3, 62, 218, 180, 149, 135, 6, 8, 136, 132, - 30, 47, 105, 149, 155, 164, 11, 167, 29, 17, 255, 167, 212, 142, 183, 14, - 89, 211, 237, 112, 11, 58, 83, 89, 220, 133, 171, 32, 92, 7, 225, 109, - 16, 246, 11, 175, 79, 97, 55, 227, 30, 193, 191, 247, 176, 210, 29, 193, - 18, 246, 30, 254, 225, 111, 85, 240, 54, 50, 123, 57, 109, 120, 103, 182, - 47, 156, 158, 227, 43, 236, 0, 114, 151, 18, 45, 13, 26, 245, 161, 249, - 38, 186, 108, 242, 82, 95, 92, 143, 45, 56, 217, 17, 46, 57, 204, 21, - 23, 227, 187, 98, 161, 63, 9, 188, 70, 79, 231, 133, 32, 55, 248, 15, - 227, 180, 82, 76, 185, 55, 193, 155, 93, 98, 166, 210, 192, 147, 249, 167, - 124, 35, 150, 41, 95, 158, 247, 168, 147, 237, 222, 11, 126, 184, 23, 139, - 59, 137, 208, 45, 200, 120, 220, 120, 13, 236, 45, 132, 116, 145, 244, 94, - 82, 33, 230, 82, 77, 31, 225, 15, 134, 11, 216, 70, 235, 192, 46, 192, - 22, 71, 179, 129, 13, 185, 15, 15, 77, 116, 197, 24, 31, 238, 237, 13, - 134, 205, 101, 244, 33, 186, 26, 14, 162, 176, 57, 155, 95, 238, 225, 219, - 222, 118, 89, 141, 111, 169, 172, 98, 106, 225, 230, 178, 117, 189, 45, 245, - 105, 229, 219, 115, 244, 191, 1, 255, 19, 164, 242, 66, 190, 230, 83, 9, - 119, 169, 55, 88, 153, 190, 167, 245, 111, 23, 55, 205, 93, 86, 130, 77, - 250, 92, 179, 154, 76, 27, 206, 251, 234, 61, 57, 26, 111, 113, 193, 168, - 154, 219, 22, 143, 137, 134, 135, 232, 124, 121, 121, 77, 154, 185, 43, 203, - 91, 89, 190, 184, 209, 219, 49, 2, 207, 3, 171, 101, 155, 47, 2, 171, - 45, 116, 119, 141, 113, 116, 30, 148, 248, 18, 249, 185, 25, 152, 22, 58, - 237, 166, 183, 23, 248, 214, 150, 111, 74, 231, 35, 48, 93, 25, 198, 19, - 15, 47, 145, 143, 140, 201, 180, 242, 131, 99, 255, 224, 218, 63, 120, 246, - 15, 190, 61, 32, 132, 95, 252, 175, 241, 124, 175, 211, 120, 81, 173, 253, - 224, 192, 46, 183, 210, 240, 107, 207, 247, 188, 198, 139, 58, 200, 197, 63, - 184, 24, 66, 1, 245, 23, 40, 40, 255, 224, 97, 0, 196, 175, 99, 124, - 223, 172, 214, 6, 239, 125, 163, 142, 185, 96, 28, 175, 166, 178, 241, 106, - 207, 33, 137, 47, 243, 104, 180, 41, 87, 136, 80, 247, 41, 155, 198, 11, - 72, 143, 201, 61, 78, 222, 160, 66, 101, 106, 42, 16, 227, 65, 12, 248, - 14, 5, 202, 218, 61, 223, 243, 235, 174, 200, 149, 130, 189, 234, 81, 41, - 87, 151, 121, 186, 49, 166, 184, 77, 74, 155, 236, 187, 165, 205, 87, 169, - 211, 20, 183, 182, 172, 86, 15, 229, 11, 136, 249, 211, 209, 86, 34, 47, - 155, 200, 171, 141, 146, 68, 30, 38, 26, 108, 37, 242, 179, 137, 252, 218, - 32, 73, 228, 139, 189, 255, 19, 107, 186, 100, 123, 48, 120, 26, 169, 167, - 1, 157, 0, 58, 18, 85, 102, 73, 175, 16, 213, 134, 72, 240, 111, 64, - 94, 186, 197, 94, 106, 73, 110, 209, 225, 227, 51, 140, 70, 177, 50, 58, - 178, 119, 2, 76, 192, 219, 200, 109, 254, 116, 137, 23, 15, 57, 81, 173, - 59, 210, 93, 64, 4, 227, 85, 173, 178, 252, 162, 225, 34, 72, 56, 193, - 223, 31, 153, 168, 92, 128, 208, 195, 104, 52, 252, 11, 188, 255, 128, 40, - 204, 175, 42, 16, 201, 254, 133, 34, 192, 176, 168, 0, 124, 245, 146, 215, - 58, 125, 247, 181, 0, 24, 57, 115, 139, 40, 143, 74, 230, 135, 166, 116, - 118, 50, 18, 45, 27, 61, 27, 41, 255, 133, 216, 1, 90, 203, 70, 91, - 45, 27, 61, 9, 32, 118, 78, 92, 209, 52, 132, 97, 94, 215, 42, 35, - 217, 180, 145, 106, 218, 91, 209, 180, 183, 233, 166, 173, 236, 183, 217, 198, - 65, 80, 186, 121, 16, 144, 109, 32, 6, 125, 188, 137, 3, 209, 196, 193, - 179, 65, 218, 69, 35, 13, 50, 53, 113, 176, 213, 196, 193, 147, 96, 176, - 201, 139, 43, 154, 136, 152, 210, 183, 181, 202, 64, 54, 113, 160, 154, 248, - 171, 104, 226, 175, 217, 38, 174, 237, 95, 183, 27, 9, 129, 217, 102, 66, - 208, 118, 67, 49, 112, 119, 83, 249, 220, 173, 8, 8, 66, 112, 225, 171, - 217, 210, 67, 243, 141, 79, 23, 245, 63, 182, 236, 197, 40, 222, 2, 131, - 32, 1, 107, 16, 77, 132, 43, 96, 218, 160, 93, 225, 21, 10, 110, 205, - 188, 123, 96, 206, 252, 175, 64, 255, 191, 2, 253, 227, 9, 244, 143, 40, - 203, 127, 68, 230, 46, 234, 240, 79, 146, 185, 235, 218, 60, 101, 35, 115, - 35, 61, 115, 139, 176, 243, 80, 45, 182, 225, 74, 75, 180, 142, 102, 219, - 228, 108, 164, 122, 1, 137, 84, 66, 156, 194, 31, 116, 148, 86, 36, 80, - 221, 115, 58, 103, 145, 80, 19, 237, 116, 239, 125, 133, 215, 225, 241, 236, - 210, 171, 44, 171, 234, 162, 101, 235, 219, 104, 199, 183, 129, 250, 38, 152, - 175, 219, 232, 108, 178, 48, 203, 243, 185, 55, 216, 58, 142, 233, 145, 143, - 64, 111, 0, 29, 205, 223, 169, 166, 189, 203, 73, 212, 239, 197, 65, 201, - 250, 138, 193, 146, 122, 233, 216, 166, 85, 75, 51, 76, 25, 126, 40, 15, - 95, 108, 121, 212, 98, 39, 42, 112, 176, 121, 67, 175, 93, 72, 199, 32, - 191, 139, 103, 152, 67, 225, 0, 221, 22, 110, 108, 39, 120, 150, 230, 184, - 48, 66, 31, 221, 70, 144, 227, 40, 130, 164, 157, 223, 8, 8, 131, 104, - 110, 134, 116, 104, 99, 82, 181, 242, 78, 77, 160, 169, 229, 93, 52, 75, - 117, 118, 114, 33, 181, 58, 216, 85, 153, 86, 23, 116, 154, 229, 96, 71, - 101, 251, 78, 215, 209, 118, 178, 184, 89, 142, 142, 226, 232, 73, 248, 172, - 142, 14, 226, 216, 41, 37, 96, 119, 162, 87, 164, 249, 93, 201, 18, 149, - 40, 41, 81, 159, 55, 90, 84, 118, 35, 133, 117, 194, 163, 97, 139, 145, - 176, 121, 20, 54, 239, 140, 18, 243, 100, 82, 111, 210, 27, 206, 168, 39, - 86, 107, 155, 152, 241, 51, 57, 131, 37, 219, 60, 188, 220, 161, 99, 108, - 119, 15, 132, 68, 111, 15, 232, 150, 78, 175, 213, 43, 154, 108, 38, 214, - 25, 53, 139, 210, 139, 139, 89, 245, 166, 137, 20, 45, 190, 84, 227, 11, - 61, 225, 111, 218, 66, 152, 170, 12, 198, 157, 220, 3, 167, 16, 9, 208, - 61, 221, 22, 209, 67, 24, 14, 34, 125, 218, 73, 239, 24, 35, 67, 234, - 156, 159, 218, 21, 103, 65, 231, 30, 69, 72, 200, 154, 184, 217, 58, 129, - 195, 88, 23, 146, 53, 54, 236, 127, 207, 3, 255, 87, 124, 248, 255, 175, - 248, 224, 63, 162, 248, 128, 83, 25, 149, 195, 61, 5, 10, 109, 104, 115, - 252, 62, 60, 157, 153, 65, 150, 157, 131, 52, 225, 235, 22, 55, 157, 92, - 230, 238, 43, 87, 173, 41, 132, 94, 137, 144, 152, 132, 182, 85, 104, 71, - 11, 237, 168, 208, 125, 45, 116, 159, 48, 126, 239, 187, 60, 72, 243, 134, - 251, 241, 155, 124, 224, 42, 44, 64, 32, 18, 166, 128, 170, 208, 86, 220, - 173, 1, 203, 39, 19, 125, 169, 81, 98, 97, 244, 68, 165, 2, 248, 61, - 6, 160, 98, 96, 106, 123, 236, 53, 246, 55, 249, 251, 51, 111, 176, 254, - 255, 216, 251, 242, 255, 182, 141, 36, 223, 223, 241, 87, 192, 12, 28, 241, - 0, 40, 28, 164, 100, 91, 134, 242, 18, 123, 142, 236, 174, 243, 188, 147, - 217, 221, 204, 40, 178, 62, 16, 73, 137, 176, 197, 195, 60, 68, 82, 10, - 255, 247, 87, 71, 95, 184, 40, 202, 118, 50, 51, 251, 50, 25, 139, 64, - 163, 209, 55, 170, 171, 170, 171, 190, 85, 66, 206, 55, 76, 206, 55, 15, - 146, 243, 77, 145, 156, 99, 121, 89, 189, 230, 175, 73, 208, 55, 143, 37, - 232, 155, 223, 9, 250, 239, 4, 253, 119, 130, 190, 39, 65, 223, 84, 17, - 244, 106, 210, 144, 35, 232, 85, 30, 176, 255, 170, 20, 125, 23, 193, 249, - 20, 138, 62, 204, 81, 244, 149, 32, 225, 67, 195, 80, 78, 16, 249, 253, - 40, 122, 84, 194, 160, 71, 204, 160, 71, 15, 50, 232, 81, 145, 65, 143, - 254, 209, 12, 122, 180, 131, 158, 71, 191, 51, 232, 191, 211, 243, 223, 233, - 185, 73, 207, 141, 175, 118, 31, 10, 29, 253, 107, 176, 220, 209, 231, 176, - 220, 209, 111, 196, 114, 139, 164, 126, 158, 11, 223, 77, 174, 139, 12, 120, - 196, 12, 120, 244, 32, 3, 30, 21, 25, 240, 40, 199, 128, 255, 246, 252, - 247, 110, 122, 253, 59, 255, 253, 59, 189, 254, 157, 94, 151, 208, 235, 61, - 57, 234, 40, 199, 81, 255, 203, 211, 235, 93, 20, 228, 87, 102, 168, 115, - 244, 122, 184, 31, 189, 190, 43, 161, 215, 119, 76, 175, 239, 30, 164, 215, - 119, 69, 122, 141, 229, 41, 211, 175, 95, 153, 92, 223, 61, 150, 92, 231, - 145, 82, 127, 39, 215, 191, 147, 235, 223, 201, 245, 96, 215, 167, 158, 35, - 215, 119, 255, 187, 200, 245, 46, 10, 242, 41, 228, 186, 47, 200, 53, 159, - 96, 102, 73, 118, 191, 200, 102, 247, 43, 212, 34, 187, 72, 54, 251, 99, - 34, 8, 20, 124, 132, 251, 209, 87, 94, 175, 23, 107, 194, 168, 22, 55, - 27, 132, 18, 127, 97, 47, 221, 91, 119, 229, 114, 89, 217, 162, 30, 85, - 146, 186, 185, 227, 98, 51, 94, 12, 220, 226, 7, 188, 24, 168, 9, 118, - 29, 86, 62, 225, 141, 48, 130, 198, 100, 138, 245, 18, 92, 6, 76, 11, - 3, 138, 80, 139, 141, 79, 98, 159, 184, 91, 138, 34, 135, 138, 16, 63, - 72, 124, 191, 4, 137, 34, 2, 149, 240, 156, 225, 33, 57, 15, 146, 93, - 239, 173, 221, 30, 236, 119, 189, 187, 6, 133, 184, 148, 131, 192, 160, 215, - 180, 132, 133, 11, 142, 17, 229, 146, 22, 168, 25, 216, 231, 115, 205, 215, - 229, 92, 198, 114, 30, 227, 58, 100, 102, 10, 212, 168, 84, 165, 242, 100, - 122, 97, 151, 226, 211, 137, 128, 13, 98, 85, 162, 161, 125, 216, 205, 44, - 84, 242, 113, 74, 16, 192, 70, 173, 88, 242, 253, 69, 147, 135, 171, 4, - 97, 164, 224, 83, 126, 104, 169, 100, 28, 154, 120, 161, 96, 15, 70, 201, - 135, 1, 3, 160, 201, 74, 50, 97, 147, 96, 196, 16, 68, 9, 61, 186, - 196, 136, 106, 96, 25, 140, 160, 59, 177, 47, 211, 107, 55, 59, 204, 240, - 181, 223, 36, 61, 168, 5, 35, 96, 216, 193, 58, 16, 125, 223, 97, 11, - 146, 237, 77, 252, 12, 169, 106, 161, 235, 18, 1, 45, 140, 159, 33, 237, - 210, 6, 67, 220, 97, 105, 48, 68, 223, 4, 119, 16, 168, 149, 2, 228, - 41, 233, 40, 155, 92, 83, 214, 248, 222, 9, 158, 70, 71, 190, 240, 37, - 165, 180, 211, 56, 60, 70, 215, 86, 46, 30, 81, 124, 40, 217, 195, 100, - 105, 158, 41, 50, 6, 207, 116, 70, 132, 1, 18, 25, 225, 50, 151, 241, - 185, 206, 247, 92, 101, 123, 78, 46, 121, 228, 229, 16, 184, 207, 224, 223, - 49, 252, 59, 130, 127, 93, 248, 215, 17, 191, 209, 73, 72, 191, 33, 253, - 70, 240, 47, 132, 180, 8, 158, 119, 40, 61, 56, 233, 194, 245, 49, 61, - 11, 79, 158, 193, 239, 115, 202, 19, 192, 125, 0, 121, 240, 121, 112, 114, - 4, 255, 142, 225, 223, 51, 55, 104, 96, 84, 196, 53, 250, 61, 28, 74, - 240, 143, 100, 145, 140, 219, 8, 180, 124, 15, 45, 63, 156, 166, 91, 171, - 206, 13, 111, 32, 140, 208, 96, 221, 182, 219, 109, 14, 39, 51, 141, 239, - 189, 200, 253, 63, 247, 239, 182, 91, 251, 35, 161, 66, 243, 53, 98, 121, - 35, 210, 153, 12, 234, 50, 69, 247, 240, 143, 121, 228, 139, 252, 126, 0, - 211, 178, 72, 226, 123, 172, 62, 172, 59, 83, 215, 249, 8, 244, 255, 186, - 215, 143, 157, 123, 248, 91, 179, 107, 247, 64, 236, 63, 2, 153, 135, 109, - 96, 186, 221, 90, 211, 85, 76, 41, 135, 14, 60, 102, 211, 111, 97, 106, - 61, 93, 53, 87, 135, 189, 201, 188, 238, 80, 153, 141, 146, 114, 166, 92, - 206, 71, 40, 231, 227, 48, 166, 75, 89, 206, 80, 149, 243, 113, 216, 28, - 230, 202, 17, 1, 78, 217, 108, 187, 142, 38, 216, 24, 38, 136, 161, 91, - 208, 108, 153, 12, 197, 73, 202, 8, 218, 221, 38, 60, 135, 122, 248, 106, - 168, 156, 247, 49, 102, 133, 4, 3, 224, 146, 155, 98, 164, 77, 74, 96, - 205, 148, 249, 183, 126, 79, 26, 223, 88, 10, 139, 68, 97, 29, 116, 206, - 13, 87, 117, 199, 39, 47, 117, 244, 51, 144, 14, 141, 218, 106, 174, 86, - 191, 199, 102, 65, 131, 238, 251, 240, 111, 190, 109, 144, 197, 110, 249, 30, - 185, 42, 68, 212, 216, 148, 70, 212, 216, 236, 29, 81, 131, 202, 124, 100, - 56, 13, 35, 10, 4, 70, 44, 40, 11, 173, 65, 197, 238, 23, 87, 131, - 178, 230, 130, 106, 16, 108, 80, 184, 126, 72, 100, 210, 129, 130, 126, 228, - 23, 128, 5, 186, 158, 204, 128, 218, 140, 202, 235, 210, 97, 177, 136, 186, - 115, 169, 146, 216, 183, 100, 173, 226, 215, 136, 46, 240, 122, 178, 68, 130, - 183, 222, 120, 106, 226, 76, 124, 68, 87, 180, 164, 216, 138, 114, 102, 107, - 102, 135, 4, 162, 143, 46, 48, 87, 118, 173, 191, 142, 215, 95, 7, 39, - 253, 77, 188, 129, 159, 111, 227, 247, 117, 140, 193, 32, 225, 248, 27, 39, - 223, 65, 74, 168, 220, 143, 33, 225, 21, 36, 120, 153, 148, 215, 244, 146, - 241, 14, 6, 239, 122, 210, 223, 52, 235, 79, 250, 235, 38, 176, 117, 175, - 226, 248, 219, 175, 191, 126, 245, 36, 126, 253, 245, 215, 223, 62, 137, 191, - 115, 191, 117, 211, 6, 172, 88, 126, 250, 109, 28, 127, 71, 233, 175, 190, - 254, 250, 59, 200, 227, 126, 135, 208, 4, 248, 24, 74, 224, 44, 223, 197, - 248, 42, 60, 132, 98, 94, 67, 70, 247, 53, 23, 32, 202, 127, 29, 227, - 187, 240, 224, 59, 170, 229, 91, 247, 21, 150, 80, 43, 93, 199, 52, 190, - 209, 99, 103, 55, 250, 180, 217, 141, 162, 167, 46, 252, 19, 179, 27, 137, - 217, 141, 214, 153, 216, 17, 4, 73, 184, 215, 236, 70, 251, 204, 110, 68, - 168, 32, 198, 236, 62, 141, 104, 118, 225, 167, 231, 199, 48, 98, 39, 189, - 32, 134, 113, 141, 99, 152, 169, 94, 200, 151, 33, 79, 26, 78, 63, 208, - 113, 47, 202, 206, 191, 159, 73, 193, 5, 144, 205, 131, 175, 190, 230, 87, - 141, 101, 241, 71, 202, 231, 103, 179, 253, 137, 179, 25, 47, 255, 153, 42, - 48, 18, 190, 167, 247, 162, 146, 229, 212, 243, 197, 108, 127, 71, 179, 253, - 103, 90, 18, 127, 148, 139, 161, 23, 224, 211, 194, 227, 175, 191, 78, 97, - 197, 32, 42, 6, 172, 162, 63, 242, 18, 251, 250, 235, 63, 210, 115, 120, - 242, 109, 131, 214, 27, 190, 31, 138, 165, 150, 201, 228, 254, 81, 172, 70, - 108, 69, 29, 6, 18, 134, 77, 182, 164, 254, 103, 90, 151, 127, 166, 90, - 120, 249, 81, 137, 80, 87, 105, 43, 254, 212, 48, 219, 170, 170, 44, 111, - 216, 247, 88, 204, 31, 99, 188, 251, 35, 21, 253, 103, 122, 78, 157, 41, - 54, 42, 84, 141, 202, 183, 41, 55, 60, 165, 37, 254, 9, 235, 42, 237, - 204, 247, 13, 247, 207, 230, 240, 228, 95, 231, 150, 236, 248, 212, 46, 250, - 189, 94, 138, 244, 204, 190, 24, 244, 175, 7, 58, 158, 37, 25, 254, 12, - 214, 28, 71, 240, 148, 174, 23, 232, 192, 31, 76, 215, 100, 187, 124, 149, - 224, 198, 134, 194, 193, 98, 182, 28, 24, 152, 206, 130, 30, 242, 94, 70, - 159, 25, 127, 34, 32, 81, 96, 248, 64, 10, 185, 194, 242, 8, 236, 21, - 24, 12, 131, 196, 132, 172, 32, 166, 10, 67, 109, 208, 96, 222, 155, 165, - 151, 172, 34, 144, 30, 141, 131, 113, 153, 71, 227, 107, 93, 197, 197, 43, - 172, 226, 226, 149, 174, 226, 226, 251, 76, 40, 218, 106, 246, 54, 59, 14, - 113, 208, 14, 186, 40, 87, 200, 177, 136, 187, 66, 152, 48, 6, 164, 210, - 12, 35, 51, 198, 174, 149, 27, 114, 35, 178, 8, 214, 178, 53, 172, 43, - 186, 134, 79, 35, 235, 21, 30, 187, 225, 188, 126, 245, 234, 251, 189, 246, - 155, 123, 224, 139, 188, 250, 19, 244, 123, 115, 225, 122, 40, 175, 5, 51, - 211, 65, 66, 149, 193, 203, 213, 180, 52, 6, 158, 253, 68, 164, 202, 241, - 193, 196, 240, 196, 202, 154, 74, 147, 155, 99, 198, 13, 210, 122, 31, 212, - 215, 238, 6, 93, 29, 223, 158, 29, 55, 55, 176, 132, 215, 8, 151, 219, - 57, 135, 71, 161, 249, 104, 77, 97, 121, 196, 35, 46, 182, 254, 1, 31, - 122, 31, 190, 98, 114, 136, 235, 255, 121, 19, 239, 16, 92, 74, 221, 145, - 207, 177, 103, 195, 21, 208, 171, 198, 137, 213, 231, 215, 230, 203, 81, 61, - 185, 156, 215, 207, 44, 241, 70, 36, 114, 97, 89, 1, 136, 225, 244, 170, - 78, 13, 84, 106, 164, 83, 57, 209, 210, 117, 202, 18, 116, 1, 129, 46, - 64, 191, 31, 168, 247, 245, 235, 198, 219, 145, 124, 219, 120, 57, 146, 47, - 235, 119, 163, 134, 117, 206, 40, 192, 200, 231, 214, 159, 212, 235, 235, 38, - 2, 13, 53, 220, 212, 181, 222, 66, 31, 49, 6, 83, 29, 7, 46, 114, - 55, 244, 215, 119, 123, 238, 49, 252, 135, 37, 195, 72, 160, 43, 89, 191, - 254, 158, 174, 67, 190, 70, 160, 98, 210, 2, 161, 243, 41, 250, 112, 246, - 209, 63, 141, 46, 240, 17, 71, 219, 141, 89, 81, 116, 170, 151, 192, 55, - 226, 211, 197, 194, 94, 112, 1, 47, 235, 193, 161, 202, 208, 48, 114, 132, - 144, 163, 190, 194, 186, 3, 81, 114, 240, 78, 46, 155, 198, 137, 189, 10, - 141, 39, 161, 249, 164, 174, 235, 104, 174, 240, 177, 46, 177, 185, 10, 209, - 9, 18, 19, 225, 74, 54, 244, 48, 14, 142, 128, 236, 253, 51, 175, 92, - 223, 92, 184, 190, 185, 110, 125, 53, 211, 254, 206, 117, 27, 234, 181, 24, - 138, 197, 20, 234, 21, 230, 171, 101, 235, 235, 196, 80, 47, 91, 68, 155, - 82, 107, 204, 231, 156, 116, 37, 11, 245, 229, 90, 244, 213, 87, 228, 171, - 106, 116, 45, 170, 18, 93, 135, 94, 218, 186, 137, 97, 118, 201, 214, 215, - 176, 90, 209, 109, 120, 3, 191, 79, 16, 254, 234, 31, 185, 112, 237, 135, - 87, 174, 253, 27, 47, 221, 236, 142, 109, 110, 28, 23, 216, 250, 127, 142, - 205, 35, 137, 239, 189, 224, 48, 56, 218, 218, 151, 241, 253, 115, 186, 88, - 13, 251, 177, 33, 181, 218, 243, 24, 228, 86, 139, 214, 32, 193, 65, 32, - 40, 132, 0, 65, 106, 49, 3, 112, 59, 16, 88, 250, 2, 216, 8, 175, - 214, 197, 135, 132, 85, 110, 195, 7, 112, 246, 206, 63, 183, 144, 3, 37, - 128, 36, 91, 229, 67, 242, 29, 158, 219, 109, 134, 123, 84, 8, 169, 208, - 32, 148, 214, 115, 41, 206, 28, 149, 37, 174, 115, 73, 255, 79, 8, 250, - 80, 4, 132, 107, 103, 235, 110, 139, 102, 181, 219, 208, 170, 249, 48, 189, - 90, 192, 21, 118, 38, 151, 141, 85, 45, 109, 171, 213, 98, 220, 181, 192, - 150, 138, 26, 235, 34, 51, 125, 243, 209, 100, 178, 24, 158, 121, 93, 23, - 85, 1, 24, 95, 1, 254, 239, 132, 118, 54, 23, 70, 227, 62, 243, 58, - 4, 195, 232, 4, 86, 235, 26, 43, 89, 35, 38, 38, 95, 110, 92, 186, - 194, 177, 218, 16, 224, 39, 12, 12, 103, 183, 234, 132, 27, 117, 194, 127, - 197, 88, 235, 81, 234, 202, 33, 162, 108, 129, 249, 168, 35, 30, 65, 9, - 39, 240, 159, 126, 132, 17, 122, 197, 75, 20, 115, 239, 68, 254, 205, 148, - 45, 51, 89, 45, 154, 139, 0, 241, 229, 196, 197, 126, 211, 113, 226, 92, - 210, 255, 147, 147, 252, 234, 224, 193, 197, 218, 141, 73, 51, 243, 4, 50, - 15, 142, 127, 232, 70, 191, 214, 248, 235, 225, 247, 118, 140, 127, 118, 244, - 242, 99, 94, 57, 53, 122, 252, 233, 209, 137, 145, 185, 116, 46, 114, 19, - 248, 153, 227, 239, 159, 24, 51, 80, 58, 182, 118, 254, 147, 41, 153, 35, - 28, 127, 194, 22, 252, 178, 227, 79, 190, 105, 164, 25, 233, 240, 71, 136, - 173, 194, 207, 159, 111, 48, 70, 175, 186, 161, 201, 111, 9, 13, 96, 68, - 240, 157, 4, 142, 123, 63, 244, 178, 49, 112, 138, 209, 170, 203, 90, 106, - 191, 208, 148, 180, 187, 181, 222, 113, 220, 58, 39, 130, 209, 165, 43, 168, - 75, 92, 29, 242, 15, 79, 130, 136, 100, 65, 63, 161, 77, 209, 189, 25, - 141, 81, 204, 12, 197, 210, 46, 246, 217, 54, 194, 59, 19, 93, 183, 90, - 47, 81, 195, 139, 241, 246, 236, 211, 54, 69, 51, 111, 242, 82, 65, 221, - 47, 206, 185, 53, 81, 147, 57, 158, 44, 218, 244, 88, 77, 191, 167, 145, - 117, 230, 131, 100, 212, 75, 102, 183, 20, 136, 113, 7, 140, 13, 30, 242, - 205, 82, 36, 252, 155, 11, 17, 191, 55, 23, 167, 17, 227, 162, 80, 96, - 75, 216, 43, 204, 71, 163, 100, 157, 142, 150, 163, 11, 172, 105, 206, 197, - 61, 18, 217, 43, 124, 173, 192, 189, 92, 67, 203, 131, 5, 122, 216, 118, - 62, 129, 46, 168, 122, 30, 66, 170, 41, 235, 146, 47, 30, 100, 58, 35, - 163, 65, 102, 122, 18, 135, 221, 167, 85, 8, 242, 106, 76, 143, 252, 167, - 150, 57, 194, 149, 152, 53, 93, 44, 174, 176, 67, 147, 151, 117, 80, 233, - 87, 173, 188, 87, 121, 76, 202, 199, 195, 181, 181, 67, 43, 172, 124, 23, - 199, 150, 254, 76, 150, 139, 109, 205, 150, 35, 32, 131, 50, 103, 179, 119, - 242, 217, 113, 92, 60, 57, 48, 226, 80, 134, 6, 133, 106, 159, 219, 78, - 183, 130, 43, 24, 11, 224, 72, 9, 175, 178, 211, 48, 179, 33, 112, 93, - 118, 191, 16, 194, 11, 33, 90, 6, 133, 13, 169, 220, 119, 198, 171, 39, - 241, 106, 107, 95, 232, 65, 39, 53, 124, 228, 66, 87, 156, 174, 138, 77, - 47, 80, 71, 22, 24, 4, 118, 138, 1, 137, 50, 47, 12, 245, 11, 58, - 71, 9, 89, 208, 19, 107, 245, 39, 22, 157, 128, 209, 202, 120, 160, 221, - 29, 104, 119, 7, 59, 218, 161, 118, 207, 231, 242, 21, 244, 0, 150, 200, - 54, 222, 170, 225, 162, 163, 187, 135, 80, 150, 156, 3, 253, 131, 85, 37, - 46, 114, 253, 14, 190, 43, 250, 14, 203, 96, 78, 232, 139, 238, 125, 224, - 205, 183, 246, 97, 155, 34, 21, 96, 20, 215, 235, 89, 210, 79, 161, 110, - 124, 156, 72, 170, 208, 195, 221, 169, 141, 120, 135, 216, 61, 249, 1, 64, - 74, 203, 30, 183, 41, 136, 183, 136, 9, 74, 39, 70, 9, 83, 177, 158, - 24, 65, 32, 116, 42, 194, 45, 194, 147, 207, 218, 18, 34, 139, 114, 122, - 50, 107, 219, 68, 53, 110, 161, 230, 30, 200, 150, 243, 178, 133, 193, 8, - 102, 147, 254, 160, 109, 71, 42, 20, 168, 243, 146, 148, 135, 136, 12, 45, - 227, 129, 42, 178, 108, 211, 187, 103, 132, 97, 48, 38, 158, 15, 251, 132, - 40, 216, 64, 62, 111, 38, 43, 188, 2, 10, 143, 35, 131, 151, 64, 8, - 23, 147, 169, 170, 219, 119, 145, 200, 35, 188, 250, 61, 134, 41, 21, 45, - 57, 131, 247, 16, 23, 127, 102, 181, 154, 103, 29, 23, 182, 227, 22, 111, - 21, 180, 79, 97, 168, 82, 157, 212, 149, 73, 157, 115, 220, 72, 121, 4, - 223, 99, 50, 230, 78, 4, 73, 181, 123, 214, 85, 219, 174, 157, 194, 148, - 247, 64, 118, 193, 41, 125, 15, 2, 79, 163, 245, 190, 46, 21, 163, 46, - 42, 226, 117, 66, 72, 17, 119, 112, 26, 36, 23, 217, 198, 173, 3, 71, - 4, 254, 153, 73, 98, 211, 182, 78, 101, 237, 88, 211, 75, 168, 233, 125, - 61, 64, 124, 109, 216, 65, 82, 40, 234, 253, 25, 142, 193, 57, 15, 232, - 169, 101, 204, 54, 230, 127, 95, 79, 197, 24, 55, 106, 182, 158, 241, 64, - 12, 8, 142, 41, 141, 8, 84, 7, 227, 71, 245, 209, 60, 64, 79, 226, - 251, 244, 77, 51, 212, 128, 243, 176, 240, 8, 157, 28, 30, 185, 247, 107, - 12, 44, 139, 25, 223, 139, 50, 176, 122, 154, 55, 96, 208, 97, 152, 93, - 40, 205, 92, 122, 150, 108, 60, 14, 211, 251, 186, 49, 60, 129, 82, 33, - 103, 90, 232, 195, 168, 195, 218, 242, 219, 129, 253, 68, 212, 138, 152, 176, - 43, 194, 27, 31, 146, 64, 129, 177, 110, 249, 227, 198, 143, 226, 165, 191, - 181, 155, 10, 109, 220, 199, 237, 30, 225, 102, 225, 201, 86, 2, 92, 35, - 228, 184, 56, 217, 197, 55, 78, 65, 32, 242, 224, 155, 17, 95, 145, 58, - 224, 156, 51, 36, 248, 233, 75, 248, 218, 60, 132, 220, 111, 35, 28, 120, - 2, 68, 77, 12, 44, 117, 92, 162, 122, 34, 248, 39, 162, 136, 154, 64, - 231, 87, 118, 77, 224, 199, 191, 23, 2, 56, 206, 20, 181, 168, 85, 104, - 145, 252, 190, 172, 185, 250, 146, 175, 219, 196, 99, 18, 101, 160, 238, 7, - 192, 151, 241, 73, 98, 57, 183, 197, 17, 154, 141, 0, 205, 66, 84, 18, - 156, 23, 158, 222, 78, 103, 147, 107, 12, 17, 99, 223, 39, 241, 10, 216, - 8, 68, 163, 78, 94, 6, 110, 210, 68, 215, 48, 140, 26, 157, 0, 89, - 97, 220, 136, 123, 160, 169, 24, 216, 87, 48, 12, 184, 40, 97, 43, 187, - 101, 227, 151, 91, 54, 123, 185, 189, 227, 159, 94, 85, 252, 247, 156, 133, - 14, 169, 139, 133, 225, 224, 197, 24, 247, 229, 203, 201, 204, 180, 81, 201, - 159, 69, 254, 72, 213, 238, 180, 136, 96, 184, 195, 222, 96, 132, 106, 27, - 142, 205, 101, 30, 75, 22, 30, 74, 211, 150, 241, 100, 236, 97, 227, 174, - 7, 51, 84, 39, 67, 167, 123, 67, 27, 131, 52, 216, 162, 45, 89, 229, - 143, 48, 73, 225, 113, 72, 231, 68, 65, 97, 234, 251, 191, 133, 33, 205, - 126, 193, 220, 203, 0, 57, 170, 181, 209, 68, 224, 96, 193, 136, 99, 77, - 94, 52, 21, 233, 65, 69, 122, 168, 22, 199, 44, 29, 127, 200, 70, 103, - 54, 166, 16, 31, 62, 34, 168, 114, 134, 167, 146, 37, 71, 190, 101, 212, - 98, 58, 33, 106, 64, 63, 81, 211, 94, 193, 144, 11, 252, 202, 29, 71, - 140, 9, 56, 22, 130, 7, 91, 113, 176, 45, 28, 147, 136, 22, 24, 81, - 138, 31, 209, 205, 124, 112, 225, 178, 126, 110, 204, 142, 230, 221, 45, 247, - 233, 105, 73, 80, 224, 234, 174, 102, 123, 203, 40, 35, 15, 244, 252, 238, - 211, 186, 46, 131, 237, 102, 202, 121, 116, 223, 74, 194, 228, 238, 236, 92, - 117, 255, 56, 142, 230, 206, 190, 102, 226, 217, 238, 223, 215, 124, 24, 218, - 146, 89, 54, 39, 249, 19, 230, 184, 36, 124, 108, 197, 40, 248, 56, 2, - 58, 242, 235, 206, 238, 102, 194, 187, 238, 223, 93, 25, 149, 213, 40, 229, - 145, 221, 41, 137, 167, 90, 217, 29, 221, 33, 29, 12, 181, 162, 87, 55, - 105, 111, 80, 48, 131, 185, 43, 53, 131, 185, 219, 219, 12, 70, 148, 250, - 229, 13, 97, 68, 193, 85, 166, 48, 243, 201, 12, 55, 223, 139, 201, 172, - 79, 150, 215, 176, 143, 182, 160, 225, 30, 118, 5, 71, 47, 54, 225, 222, - 127, 1, 62, 164, 176, 143, 98, 1, 100, 255, 43, 228, 226, 157, 125, 248, - 254, 10, 109, 165, 83, 54, 121, 207, 219, 103, 66, 73, 40, 4, 194, 19, - 14, 156, 147, 183, 198, 239, 39, 139, 68, 238, 150, 87, 233, 108, 190, 16, - 177, 89, 15, 129, 217, 60, 164, 126, 30, 10, 14, 79, 213, 183, 115, 60, - 243, 226, 188, 26, 131, 150, 178, 234, 134, 1, 168, 50, 222, 60, 234, 224, - 72, 246, 109, 226, 110, 96, 27, 195, 113, 16, 0, 201, 23, 192, 180, 78, - 135, 118, 7, 56, 159, 8, 255, 201, 177, 54, 92, 66, 32, 95, 186, 200, - 161, 178, 83, 154, 157, 69, 220, 167, 33, 207, 161, 238, 83, 154, 123, 65, - 217, 47, 216, 23, 193, 254, 0, 107, 138, 83, 112, 12, 25, 12, 120, 110, - 78, 230, 126, 133, 210, 123, 129, 203, 239, 135, 24, 151, 215, 174, 68, 81, - 255, 145, 154, 187, 15, 214, 191, 139, 200, 213, 179, 193, 117, 162, 166, 51, - 129, 247, 62, 46, 7, 227, 30, 217, 143, 162, 126, 10, 216, 34, 177, 126, - 234, 134, 117, 114, 89, 105, 104, 98, 106, 162, 88, 171, 33, 205, 57, 161, - 232, 241, 201, 240, 74, 60, 202, 153, 197, 69, 39, 116, 8, 112, 45, 90, - 240, 139, 125, 42, 243, 1, 255, 246, 131, 61, 77, 102, 11, 76, 125, 105, - 164, 114, 26, 54, 30, 41, 139, 247, 195, 46, 174, 74, 183, 36, 246, 170, - 2, 131, 115, 193, 229, 161, 14, 248, 217, 70, 45, 164, 178, 167, 168, 181, - 15, 159, 25, 25, 2, 55, 36, 5, 186, 91, 67, 51, 194, 200, 237, 212, - 96, 145, 82, 86, 15, 239, 5, 88, 195, 89, 64, 130, 230, 198, 120, 17, - 207, 209, 232, 13, 252, 175, 195, 255, 53, 228, 187, 107, 96, 229, 74, 223, - 228, 62, 114, 228, 133, 23, 246, 155, 39, 168, 227, 251, 225, 137, 208, 244, - 13, 39, 163, 201, 245, 96, 60, 152, 44, 141, 240, 207, 15, 45, 36, 68, - 243, 123, 179, 254, 129, 227, 128, 210, 119, 143, 133, 103, 104, 201, 27, 92, - 88, 63, 32, 197, 24, 195, 234, 66, 232, 114, 215, 198, 162, 96, 50, 251, - 115, 21, 27, 19, 223, 227, 105, 66, 32, 243, 65, 178, 203, 214, 251, 135, - 248, 141, 100, 119, 179, 205, 174, 228, 119, 111, 38, 24, 172, 212, 236, 126, - 215, 237, 216, 28, 221, 25, 6, 107, 62, 76, 102, 48, 92, 246, 177, 239, - 103, 195, 83, 116, 220, 46, 197, 195, 193, 215, 173, 236, 232, 41, 120, 68, - 210, 97, 241, 217, 26, 43, 73, 212, 158, 199, 203, 80, 110, 121, 56, 84, - 172, 185, 83, 131, 101, 180, 93, 12, 156, 10, 172, 184, 111, 17, 242, 53, - 17, 50, 49, 163, 129, 123, 137, 129, 128, 54, 168, 81, 199, 72, 114, 78, - 96, 115, 251, 102, 26, 217, 60, 163, 1, 183, 203, 108, 131, 128, 176, 166, - 243, 5, 111, 64, 94, 240, 50, 190, 192, 64, 153, 233, 98, 217, 31, 188, - 140, 129, 6, 49, 154, 32, 3, 248, 185, 23, 119, 147, 201, 104, 151, 159, - 68, 137, 228, 162, 230, 235, 21, 70, 7, 239, 193, 190, 9, 93, 27, 220, - 28, 78, 211, 113, 111, 9, 98, 7, 200, 94, 162, 1, 124, 64, 217, 235, - 45, 103, 228, 125, 68, 28, 195, 42, 237, 15, 60, 182, 25, 191, 25, 140, - 141, 117, 247, 151, 1, 57, 142, 193, 174, 170, 93, 192, 80, 32, 254, 59, - 236, 61, 215, 246, 223, 241, 200, 228, 249, 243, 231, 141, 182, 253, 199, 155, - 193, 58, 197, 131, 208, 94, 50, 26, 204, 64, 136, 79, 110, 210, 203, 25, - 11, 125, 32, 104, 222, 166, 131, 21, 41, 61, 109, 216, 51, 198, 34, 164, - 229, 114, 252, 97, 60, 89, 129, 80, 56, 67, 5, 91, 206, 138, 8, 149, - 83, 223, 142, 251, 179, 193, 202, 254, 31, 40, 62, 93, 220, 93, 167, 151, - 151, 80, 90, 61, 244, 253, 0, 106, 252, 49, 197, 248, 198, 9, 207, 186, - 16, 54, 69, 176, 96, 33, 105, 170, 248, 199, 88, 187, 210, 130, 211, 138, - 199, 94, 26, 3, 242, 155, 139, 159, 248, 249, 169, 21, 16, 251, 237, 144, - 44, 162, 204, 85, 192, 218, 116, 92, 9, 124, 85, 244, 180, 0, 249, 241, - 192, 22, 65, 124, 75, 69, 217, 182, 101, 174, 58, 227, 120, 219, 111, 7, - 91, 19, 165, 180, 220, 85, 42, 170, 196, 46, 133, 154, 25, 189, 20, 47, - 20, 111, 250, 95, 170, 178, 226, 218, 27, 92, 93, 225, 162, 148, 81, 204, - 85, 28, 83, 53, 6, 20, 215, 220, 196, 212, 180, 157, 208, 181, 177, 251, - 54, 59, 69, 192, 23, 231, 42, 223, 23, 210, 47, 55, 168, 239, 58, 14, - 186, 115, 228, 170, 201, 113, 197, 196, 184, 114, 82, 92, 158, 16, 140, 145, - 94, 194, 81, 86, 232, 221, 213, 152, 231, 241, 206, 59, 181, 237, 55, 171, - 166, 211, 121, 225, 116, 182, 150, 154, 144, 124, 174, 46, 228, 26, 54, 157, - 238, 11, 167, 187, 69, 203, 25, 203, 4, 170, 215, 230, 48, 202, 108, 198, - 48, 138, 113, 142, 100, 162, 108, 3, 36, 214, 28, 121, 83, 203, 61, 221, - 152, 79, 55, 234, 105, 114, 51, 29, 38, 104, 3, 178, 92, 212, 97, 124, - 61, 191, 13, 31, 171, 75, 127, 27, 50, 143, 52, 244, 160, 184, 184, 223, - 192, 40, 134, 47, 208, 236, 194, 115, 66, 149, 133, 102, 1, 114, 68, 34, - 71, 36, 114, 68, 42, 199, 27, 120, 140, 26, 219, 149, 59, 132, 52, 108, - 107, 216, 36, 163, 19, 217, 224, 198, 97, 29, 75, 105, 82, 109, 205, 55, - 144, 105, 195, 153, 54, 58, 211, 70, 102, 194, 199, 51, 120, 140, 129, 130, - 201, 250, 231, 196, 26, 227, 253, 12, 205, 65, 60, 238, 85, 115, 246, 46, - 20, 150, 47, 179, 83, 223, 181, 198, 88, 233, 120, 118, 56, 107, 174, 79, - 236, 241, 70, 222, 108, 196, 19, 153, 184, 177, 68, 251, 252, 118, 183, 57, - 94, 203, 246, 160, 185, 167, 104, 41, 183, 140, 30, 111, 204, 7, 155, 19, - 235, 123, 106, 76, 185, 237, 167, 9, 89, 177, 28, 207, 38, 55, 55, 57, - 134, 151, 19, 81, 252, 216, 75, 212, 248, 47, 206, 254, 48, 199, 105, 74, - 201, 138, 61, 220, 84, 66, 207, 190, 16, 156, 254, 38, 179, 197, 19, 27, - 20, 161, 39, 141, 123, 116, 114, 236, 62, 115, 159, 3, 19, 36, 90, 44, - 153, 158, 229, 148, 143, 86, 231, 163, 132, 232, 137, 60, 239, 52, 14, 59, - 69, 192, 14, 87, 156, 243, 142, 7, 243, 57, 157, 127, 38, 227, 116, 62, - 89, 204, 38, 211, 77, 76, 71, 33, 174, 96, 20, 96, 71, 48, 197, 228, - 255, 226, 26, 202, 79, 52, 129, 2, 163, 29, 169, 103, 120, 89, 126, 194, - 177, 101, 54, 192, 134, 110, 38, 69, 191, 62, 48, 218, 233, 183, 59, 130, - 55, 210, 109, 133, 247, 30, 136, 189, 65, 224, 96, 48, 114, 153, 161, 234, - 250, 164, 236, 243, 159, 106, 204, 176, 252, 88, 42, 58, 75, 7, 155, 174, - 10, 195, 161, 137, 118, 39, 14, 205, 3, 79, 104, 94, 169, 175, 107, 64, - 20, 92, 235, 11, 228, 144, 150, 132, 231, 16, 20, 88, 143, 129, 141, 193, - 56, 244, 16, 64, 193, 28, 85, 90, 245, 31, 168, 82, 5, 161, 52, 142, - 19, 172, 214, 172, 45, 192, 115, 157, 136, 194, 173, 81, 220, 134, 151, 142, - 112, 21, 26, 190, 116, 134, 24, 57, 185, 109, 103, 242, 145, 139, 6, 199, - 121, 192, 103, 45, 116, 89, 95, 162, 49, 213, 2, 118, 234, 201, 108, 142, - 90, 152, 174, 27, 180, 67, 252, 103, 105, 91, 139, 76, 1, 93, 139, 123, - 67, 135, 98, 78, 135, 206, 194, 146, 158, 93, 19, 93, 128, 250, 142, 32, - 99, 205, 221, 244, 46, 123, 240, 69, 87, 185, 254, 172, 32, 55, 114, 32, - 248, 139, 2, 38, 124, 105, 55, 253, 115, 134, 153, 222, 207, 89, 118, 124, - 121, 65, 145, 204, 231, 167, 126, 238, 187, 254, 31, 44, 251, 129, 35, 251, - 140, 46, 158, 42, 55, 248, 147, 130, 140, 119, 153, 244, 62, 64, 75, 251, - 94, 114, 57, 71, 203, 108, 182, 33, 87, 169, 176, 17, 147, 176, 64, 44, - 10, 72, 9, 249, 172, 145, 74, 84, 57, 77, 183, 214, 29, 142, 177, 124, - 0, 225, 149, 29, 64, 96, 93, 191, 161, 139, 108, 21, 184, 182, 187, 183, - 63, 171, 180, 82, 80, 19, 23, 87, 201, 174, 70, 12, 17, 160, 153, 7, - 63, 197, 235, 195, 21, 108, 172, 221, 147, 191, 197, 155, 195, 33, 93, 253, - 37, 174, 255, 212, 252, 169, 245, 183, 230, 223, 26, 239, 240, 254, 219, 152, - 61, 251, 254, 134, 129, 66, 130, 200, 111, 254, 5, 61, 11, 122, 49, 144, - 70, 116, 177, 235, 52, 191, 109, 184, 243, 116, 92, 127, 6, 23, 141, 3, - 90, 126, 42, 134, 19, 135, 44, 180, 63, 46, 97, 98, 102, 34, 208, 19, - 166, 250, 226, 248, 24, 90, 162, 155, 233, 24, 11, 248, 98, 154, 44, 122, - 195, 146, 101, 76, 233, 108, 173, 114, 138, 162, 7, 223, 11, 48, 117, 157, - 192, 209, 234, 240, 126, 190, 232, 75, 55, 91, 191, 116, 189, 235, 129, 122, - 139, 175, 122, 171, 146, 53, 238, 150, 216, 165, 192, 36, 70, 175, 75, 86, - 59, 121, 112, 23, 151, 53, 197, 169, 212, 117, 125, 59, 187, 94, 210, 59, - 7, 186, 129, 4, 175, 192, 113, 188, 32, 81, 234, 207, 174, 147, 229, 124, - 158, 194, 58, 91, 81, 39, 181, 176, 204, 67, 52, 129, 145, 189, 73, 166, - 46, 236, 223, 75, 144, 110, 73, 189, 178, 64, 131, 102, 93, 110, 147, 199, - 132, 163, 11, 254, 35, 22, 180, 110, 10, 6, 96, 58, 168, 230, 250, 49, - 58, 84, 102, 250, 165, 215, 48, 48, 166, 28, 113, 144, 236, 83, 64, 216, - 38, 114, 44, 195, 23, 32, 250, 66, 67, 32, 197, 243, 110, 34, 159, 68, - 177, 19, 138, 71, 81, 238, 17, 154, 215, 240, 147, 142, 122, 2, 45, 174, - 139, 48, 81, 226, 89, 151, 17, 30, 228, 75, 71, 170, 166, 163, 140, 172, - 161, 182, 44, 99, 13, 101, 92, 154, 139, 11, 162, 100, 229, 160, 20, 193, - 6, 61, 180, 199, 173, 97, 19, 160, 129, 192, 5, 136, 147, 42, 101, 137, - 238, 23, 151, 29, 232, 160, 59, 132, 173, 120, 107, 11, 67, 53, 250, 142, - 169, 79, 109, 248, 130, 113, 87, 171, 242, 2, 22, 47, 220, 136, 115, 113, - 75, 234, 21, 56, 106, 90, 160, 205, 66, 44, 131, 250, 144, 234, 94, 29, - 220, 7, 46, 176, 90, 17, 8, 99, 48, 1, 40, 160, 215, 78, 173, 140, - 161, 254, 116, 37, 140, 241, 197, 237, 144, 24, 122, 117, 219, 231, 96, 91, - 226, 22, 70, 234, 138, 227, 109, 237, 146, 76, 166, 100, 189, 141, 179, 58, - 93, 29, 106, 105, 97, 74, 166, 219, 80, 159, 71, 57, 60, 45, 223, 76, - 135, 234, 133, 161, 249, 194, 144, 94, 24, 226, 11, 195, 236, 11, 125, 245, - 66, 223, 124, 129, 12, 213, 161, 205, 30, 229, 48, 95, 88, 13, 251, 84, - 121, 115, 58, 108, 78, 251, 44, 31, 96, 111, 94, 118, 93, 75, 126, 253, - 177, 56, 194, 198, 204, 117, 40, 116, 114, 117, 181, 98, 175, 4, 164, 11, - 245, 59, 188, 241, 160, 96, 16, 63, 87, 47, 99, 168, 204, 181, 91, 173, - 187, 149, 203, 143, 55, 252, 120, 8, 143, 55, 248, 120, 72, 143, 55, 242, - 241, 154, 31, 175, 224, 241, 26, 31, 175, 232, 241, 122, 165, 170, 63, 195, - 234, 90, 173, 115, 200, 54, 88, 79, 235, 222, 122, 245, 46, 60, 172, 131, - 36, 132, 205, 108, 78, 87, 141, 119, 100, 226, 191, 201, 38, 15, 69, 242, - 93, 54, 185, 143, 201, 236, 3, 96, 254, 127, 137, 163, 134, 194, 138, 123, - 231, 250, 104, 6, 111, 220, 163, 161, 255, 202, 184, 199, 97, 101, 90, 33, - 124, 5, 190, 242, 221, 37, 207, 157, 107, 223, 242, 156, 184, 43, 30, 106, - 119, 186, 114, 167, 67, 119, 218, 87, 192, 30, 240, 50, 15, 239, 55, 86, - 127, 150, 172, 234, 95, 133, 188, 191, 184, 107, 81, 196, 70, 148, 112, 39, - 74, 240, 117, 25, 243, 175, 200, 134, 93, 140, 75, 227, 197, 167, 150, 208, - 16, 65, 234, 63, 109, 233, 255, 211, 172, 245, 213, 80, 174, 220, 7, 151, - 109, 201, 170, 253, 7, 46, 203, 71, 46, 190, 7, 23, 27, 79, 239, 163, - 87, 152, 175, 86, 70, 240, 216, 165, 85, 124, 181, 65, 154, 96, 180, 45, - 115, 61, 36, 178, 120, 54, 170, 96, 34, 62, 180, 75, 197, 134, 23, 47, - 108, 14, 247, 8, 219, 143, 72, 186, 132, 93, 6, 137, 59, 138, 253, 163, - 116, 12, 188, 229, 224, 35, 201, 201, 104, 138, 40, 110, 52, 67, 51, 157, - 222, 108, 244, 43, 34, 72, 34, 176, 35, 251, 159, 234, 201, 58, 148, 29, - 139, 172, 39, 14, 253, 42, 131, 91, 85, 97, 240, 212, 141, 158, 154, 204, - 164, 209, 122, 101, 65, 77, 26, 192, 16, 139, 211, 138, 191, 242, 134, 159, - 145, 108, 134, 198, 132, 114, 31, 175, 16, 30, 179, 123, 26, 217, 218, 205, - 63, 206, 22, 245, 186, 224, 172, 97, 141, 145, 95, 19, 115, 215, 226, 238, - 238, 176, 47, 238, 96, 170, 216, 230, 210, 78, 165, 68, 41, 140, 255, 236, - 123, 252, 254, 240, 123, 221, 186, 116, 57, 212, 151, 125, 186, 68, 227, 155, - 43, 242, 63, 97, 195, 111, 180, 244, 230, 57, 6, 241, 115, 65, 242, 99, - 217, 76, 95, 166, 32, 79, 12, 102, 9, 170, 115, 206, 174, 151, 105, 127, - 112, 238, 34, 135, 214, 31, 220, 166, 34, 222, 182, 48, 253, 206, 166, 206, - 164, 65, 248, 156, 244, 158, 192, 147, 207, 179, 183, 8, 100, 131, 163, 253, - 5, 203, 50, 133, 207, 239, 240, 160, 166, 196, 12, 76, 9, 253, 192, 144, - 214, 7, 183, 192, 78, 45, 233, 68, 242, 253, 4, 134, 234, 16, 62, 212, - 249, 188, 97, 116, 250, 74, 174, 242, 204, 249, 84, 98, 211, 72, 152, 112, - 67, 147, 91, 72, 232, 211, 49, 85, 58, 231, 19, 123, 164, 70, 253, 25, - 74, 153, 196, 164, 147, 184, 142, 236, 26, 151, 105, 112, 247, 153, 210, 36, - 182, 153, 52, 31, 3, 9, 141, 12, 89, 232, 160, 43, 17, 12, 127, 213, - 87, 242, 227, 0, 101, 4, 49, 44, 7, 120, 186, 75, 114, 195, 92, 130, - 168, 97, 147, 146, 229, 98, 130, 7, 7, 61, 59, 233, 191, 135, 202, 48, - 67, 149, 170, 135, 86, 111, 215, 24, 15, 20, 198, 124, 54, 101, 20, 235, - 195, 80, 6, 226, 225, 88, 78, 21, 72, 231, 101, 185, 89, 134, 201, 170, - 182, 254, 251, 48, 152, 141, 7, 184, 216, 232, 128, 249, 19, 222, 219, 107, - 17, 128, 144, 153, 204, 83, 79, 73, 75, 48, 44, 234, 90, 70, 108, 157, - 13, 122, 203, 217, 28, 167, 47, 133, 241, 36, 206, 155, 154, 81, 118, 70, - 125, 153, 59, 163, 254, 52, 105, 105, 203, 132, 140, 187, 146, 201, 159, 107, - 110, 253, 42, 153, 67, 27, 27, 244, 182, 74, 205, 3, 105, 25, 118, 24, - 137, 18, 32, 113, 88, 69, 8, 123, 243, 168, 190, 104, 70, 96, 28, 227, - 98, 49, 27, 92, 185, 100, 190, 129, 182, 55, 234, 184, 105, 145, 142, 80, - 85, 75, 84, 49, 185, 153, 179, 65, 7, 77, 122, 54, 203, 14, 66, 190, - 75, 71, 193, 67, 81, 125, 72, 75, 53, 117, 209, 12, 17, 175, 200, 218, - 208, 13, 118, 100, 221, 192, 234, 125, 90, 84, 34, 224, 179, 139, 100, 124, - 189, 68, 115, 133, 23, 250, 164, 198, 60, 142, 44, 156, 77, 230, 54, 51, - 249, 58, 213, 51, 25, 63, 98, 39, 43, 63, 238, 170, 216, 193, 204, 150, - 134, 217, 45, 44, 219, 9, 165, 103, 237, 74, 53, 107, 183, 184, 145, 229, - 27, 93, 125, 98, 69, 243, 33, 206, 164, 166, 72, 43, 237, 58, 105, 35, - 69, 52, 99, 123, 176, 132, 134, 244, 7, 201, 56, 68, 13, 212, 204, 22, - 170, 202, 54, 252, 43, 132, 241, 101, 139, 44, 52, 11, 15, 20, 34, 218, - 101, 27, 143, 157, 181, 71, 230, 5, 239, 85, 236, 172, 166, 54, 38, 139, - 10, 15, 85, 101, 102, 53, 230, 166, 133, 67, 113, 121, 131, 103, 57, 120, - 8, 33, 187, 65, 155, 6, 187, 242, 226, 213, 248, 242, 34, 133, 238, 208, - 245, 229, 13, 158, 224, 79, 64, 12, 78, 80, 241, 192, 6, 54, 192, 81, - 224, 223, 116, 140, 134, 54, 98, 41, 238, 253, 53, 18, 120, 222, 100, 77, - 90, 143, 197, 44, 229, 19, 103, 196, 56, 133, 183, 251, 51, 162, 191, 80, - 42, 158, 251, 36, 55, 104, 69, 71, 202, 235, 185, 233, 16, 133, 159, 106, - 126, 145, 217, 220, 43, 201, 48, 97, 180, 68, 106, 186, 254, 220, 104, 42, - 249, 57, 217, 177, 104, 64, 84, 244, 238, 72, 53, 60, 134, 198, 123, 75, - 17, 116, 15, 198, 21, 13, 155, 47, 151, 11, 161, 6, 7, 146, 120, 131, - 230, 101, 80, 9, 62, 159, 19, 21, 164, 226, 255, 37, 232, 140, 58, 206, - 127, 97, 191, 73, 230, 201, 135, 212, 254, 247, 100, 149, 204, 7, 174, 93, - 123, 59, 75, 122, 48, 254, 176, 157, 125, 159, 161, 236, 216, 192, 63, 3, - 27, 109, 191, 222, 140, 147, 17, 76, 208, 95, 8, 84, 244, 47, 48, 190, - 196, 3, 212, 92, 251, 79, 175, 95, 161, 39, 97, 103, 175, 179, 110, 82, - 193, 242, 9, 55, 157, 185, 136, 5, 23, 211, 1, 120, 110, 197, 181, 48, - 77, 145, 59, 247, 160, 176, 48, 52, 36, 41, 220, 212, 129, 103, 105, 28, - 84, 83, 8, 94, 37, 174, 149, 249, 16, 76, 167, 111, 211, 227, 91, 157, - 182, 104, 61, 88, 87, 171, 193, 50, 79, 186, 42, 244, 103, 215, 56, 146, - 233, 152, 250, 48, 60, 89, 111, 168, 227, 244, 78, 220, 66, 226, 115, 28, - 23, 88, 104, 106, 148, 56, 43, 223, 73, 121, 92, 227, 144, 220, 137, 108, - 28, 193, 132, 55, 125, 177, 244, 229, 24, 218, 7, 142, 56, 200, 210, 202, - 174, 39, 206, 145, 251, 115, 237, 231, 26, 252, 25, 79, 236, 159, 107, 181, - 109, 141, 79, 137, 228, 248, 178, 41, 6, 195, 3, 162, 114, 105, 12, 239, - 213, 107, 206, 113, 173, 177, 37, 22, 36, 118, 142, 93, 212, 96, 141, 236, - 26, 15, 36, 50, 154, 151, 80, 3, 62, 172, 57, 181, 90, 80, 211, 207, - 130, 252, 51, 84, 105, 25, 207, 49, 152, 42, 208, 4, 241, 245, 138, 124, - 247, 65, 43, 108, 98, 102, 228, 209, 205, 220, 209, 195, 185, 221, 208, 200, - 223, 217, 35, 127, 84, 21, 84, 221, 30, 189, 137, 239, 207, 210, 145, 155, - 190, 57, 223, 162, 86, 78, 201, 46, 17, 124, 250, 215, 163, 4, 97, 19, - 155, 64, 243, 223, 57, 167, 48, 52, 45, 174, 210, 233, 98, 78, 135, 50, - 144, 41, 211, 17, 58, 133, 57, 163, 55, 56, 100, 158, 211, 97, 135, 85, - 118, 14, 18, 15, 62, 180, 237, 124, 200, 104, 107, 57, 238, 9, 76, 59, - 49, 198, 174, 24, 79, 241, 27, 138, 223, 72, 252, 118, 172, 28, 173, 23, - 103, 49, 198, 214, 29, 208, 118, 173, 110, 67, 190, 101, 68, 205, 50, 142, - 99, 7, 87, 150, 163, 193, 162, 174, 138, 125, 190, 160, 252, 215, 248, 155, - 170, 49, 187, 152, 1, 221, 98, 62, 212, 97, 200, 74, 127, 135, 26, 188, - 234, 244, 198, 28, 152, 0, 197, 254, 78, 183, 192, 46, 168, 113, 171, 176, - 126, 9, 242, 159, 109, 174, 243, 185, 175, 150, 145, 56, 35, 141, 196, 169, - 187, 108, 215, 73, 92, 21, 236, 2, 234, 57, 130, 106, 88, 96, 105, 95, - 193, 232, 192, 144, 55, 44, 203, 203, 126, 157, 58, 111, 200, 121, 223, 72, - 100, 199, 160, 29, 118, 233, 177, 131, 181, 185, 248, 55, 84, 14, 160, 152, - 241, 37, 116, 243, 1, 184, 202, 193, 122, 10, 253, 64, 207, 10, 122, 195, - 189, 119, 58, 79, 208, 108, 239, 30, 62, 42, 76, 32, 212, 35, 190, 82, - 18, 132, 62, 235, 181, 13, 42, 190, 4, 1, 219, 100, 110, 52, 52, 69, - 219, 112, 230, 160, 162, 202, 5, 113, 156, 47, 220, 194, 73, 20, 255, 36, - 22, 85, 188, 253, 27, 112, 168, 162, 166, 18, 6, 85, 245, 96, 47, 254, - 52, 215, 226, 47, 205, 158, 130, 176, 192, 237, 93, 19, 218, 117, 41, 111, - 217, 45, 114, 150, 60, 112, 41, 121, 106, 19, 233, 99, 188, 179, 254, 53, - 30, 130, 19, 95, 201, 123, 246, 169, 62, 175, 44, 149, 68, 165, 59, 182, - 44, 77, 241, 142, 252, 250, 174, 51, 50, 162, 200, 12, 45, 134, 213, 198, - 126, 187, 171, 143, 117, 5, 199, 208, 173, 152, 161, 241, 36, 157, 15, 128, - 139, 65, 91, 41, 219, 119, 195, 110, 87, 88, 187, 210, 153, 171, 248, 2, - 58, 249, 174, 186, 188, 32, 149, 105, 107, 126, 98, 205, 65, 49, 56, 141, - 12, 182, 12, 180, 114, 23, 175, 97, 24, 115, 208, 120, 201, 51, 49, 113, - 202, 21, 85, 15, 149, 164, 186, 56, 44, 114, 53, 208, 192, 192, 36, 150, - 171, 226, 104, 219, 243, 221, 241, 86, 187, 61, 19, 51, 142, 126, 204, 129, - 253, 174, 109, 223, 123, 72, 58, 252, 182, 79, 100, 107, 139, 26, 131, 241, - 2, 190, 100, 116, 76, 142, 90, 188, 157, 162, 108, 64, 247, 168, 51, 157, - 161, 51, 174, 165, 119, 205, 86, 140, 30, 168, 167, 232, 14, 140, 10, 55, - 229, 14, 124, 217, 198, 87, 130, 195, 58, 22, 211, 16, 14, 177, 132, 144, - 193, 251, 98, 169, 77, 173, 88, 165, 217, 15, 159, 37, 151, 79, 220, 204, - 74, 87, 100, 181, 143, 221, 62, 30, 133, 85, 59, 81, 75, 180, 254, 168, - 176, 104, 214, 25, 131, 160, 109, 249, 244, 23, 163, 59, 21, 39, 219, 4, - 35, 8, 213, 169, 166, 26, 131, 157, 199, 153, 200, 220, 195, 138, 69, 170, - 237, 187, 107, 212, 169, 230, 199, 125, 99, 14, 60, 147, 89, 125, 91, 105, - 167, 252, 37, 166, 225, 39, 234, 221, 223, 236, 172, 35, 224, 23, 152, 140, - 77, 217, 108, 108, 202, 140, 212, 247, 152, 22, 246, 33, 252, 181, 231, 37, - 210, 41, 8, 72, 187, 193, 148, 194, 76, 221, 61, 56, 85, 250, 246, 238, - 215, 155, 54, 23, 231, 12, 250, 255, 247, 207, 157, 57, 53, 53, 119, 122, - 110, 58, 123, 205, 201, 221, 111, 50, 41, 157, 194, 164, 24, 41, 136, 192, - 118, 135, 41, 185, 105, 218, 252, 134, 132, 44, 239, 94, 249, 249, 223, 78, - 217, 167, 179, 121, 28, 33, 219, 252, 250, 132, 108, 83, 66, 200, 238, 126, - 195, 113, 191, 251, 220, 113, 23, 35, 123, 247, 184, 145, 189, 251, 245, 71, - 246, 46, 55, 178, 74, 228, 86, 142, 206, 180, 35, 144, 219, 97, 181, 209, - 164, 80, 61, 170, 147, 142, 79, 121, 115, 191, 179, 14, 212, 66, 138, 22, - 162, 95, 155, 118, 33, 197, 19, 37, 82, 94, 218, 123, 156, 117, 176, 27, - 101, 214, 229, 142, 33, 174, 112, 121, 4, 243, 133, 135, 131, 116, 171, 13, - 48, 195, 113, 223, 76, 250, 124, 235, 200, 127, 209, 243, 13, 26, 183, 202, - 216, 78, 166, 57, 38, 41, 7, 171, 105, 143, 90, 103, 221, 167, 15, 229, - 216, 32, 194, 161, 92, 159, 203, 209, 52, 100, 65, 212, 240, 156, 26, 223, - 14, 102, 134, 115, 30, 102, 26, 37, 83, 58, 40, 228, 188, 120, 103, 182, - 36, 98, 175, 87, 187, 151, 206, 122, 55, 10, 220, 222, 13, 194, 103, 100, - 183, 197, 39, 49, 79, 51, 181, 25, 215, 6, 42, 186, 172, 91, 84, 201, - 150, 218, 170, 206, 42, 247, 20, 1, 241, 98, 251, 246, 53, 130, 230, 5, - 118, 235, 10, 25, 117, 132, 80, 49, 124, 170, 172, 166, 29, 132, 199, 32, - 209, 67, 179, 4, 16, 74, 143, 69, 156, 82, 153, 90, 130, 26, 161, 217, - 128, 49, 54, 148, 168, 199, 6, 113, 131, 112, 138, 134, 168, 26, 198, 172, - 184, 170, 54, 194, 83, 20, 164, 24, 104, 253, 96, 85, 16, 162, 11, 174, - 156, 84, 11, 136, 196, 18, 169, 210, 35, 168, 202, 76, 19, 204, 155, 204, - 136, 113, 139, 118, 52, 196, 249, 166, 208, 146, 204, 64, 146, 33, 128, 243, - 4, 45, 1, 64, 18, 113, 78, 93, 70, 56, 58, 47, 142, 8, 107, 40, - 240, 180, 31, 17, 229, 42, 65, 90, 230, 250, 232, 162, 175, 15, 45, 114, - 52, 233, 149, 44, 109, 39, 30, 11, 214, 243, 37, 137, 195, 163, 78, 24, - 179, 29, 169, 58, 104, 36, 228, 74, 68, 83, 244, 58, 2, 192, 50, 131, - 189, 40, 12, 152, 201, 91, 27, 239, 118, 148, 209, 16, 14, 20, 148, 63, - 136, 164, 109, 115, 84, 192, 44, 45, 158, 82, 154, 218, 35, 53, 63, 15, - 143, 117, 78, 31, 137, 111, 185, 120, 228, 67, 238, 246, 147, 37, 124, 60, - 51, 88, 5, 163, 36, 29, 151, 247, 93, 155, 171, 72, 161, 155, 218, 78, - 94, 200, 157, 174, 110, 183, 161, 212, 178, 114, 77, 173, 52, 204, 205, 16, - 5, 106, 125, 198, 14, 150, 48, 13, 241, 4, 160, 188, 185, 121, 82, 33, - 108, 75, 125, 109, 93, 186, 10, 81, 200, 87, 166, 49, 246, 80, 221, 147, - 125, 140, 221, 87, 247, 100, 36, 99, 17, 126, 108, 214, 36, 149, 96, 110, - 24, 69, 73, 254, 211, 32, 146, 158, 179, 2, 161, 222, 25, 226, 159, 126, - 40, 109, 108, 112, 20, 174, 8, 88, 18, 33, 195, 24, 153, 83, 94, 24, - 154, 0, 171, 73, 56, 150, 17, 2, 59, 10, 252, 89, 79, 92, 88, 59, - 109, 114, 122, 232, 247, 122, 195, 97, 205, 190, 200, 87, 42, 139, 251, 95, - 250, 153, 138, 238, 237, 249, 157, 182, 208, 90, 207, 238, 32, 90, 40, 252, - 59, 226, 127, 184, 204, 101, 49, 190, 112, 76, 240, 213, 22, 75, 102, 67, - 23, 50, 7, 158, 36, 150, 124, 158, 132, 254, 196, 89, 61, 51, 107, 17, - 203, 162, 236, 147, 221, 133, 202, 100, 123, 17, 2, 132, 250, 212, 244, 108, - 67, 212, 7, 89, 210, 194, 125, 190, 202, 29, 141, 46, 251, 82, 247, 248, - 36, 73, 201, 198, 135, 251, 248, 215, 150, 106, 177, 102, 27, 175, 187, 231, - 4, 159, 231, 29, 157, 91, 158, 122, 82, 248, 76, 90, 242, 98, 247, 103, - 178, 156, 1, 239, 185, 156, 13, 10, 147, 144, 206, 39, 211, 225, 4, 59, - 38, 179, 204, 119, 42, 196, 243, 250, 109, 160, 137, 70, 233, 234, 42, 183, - 101, 239, 168, 105, 183, 149, 32, 30, 80, 244, 99, 20, 118, 90, 196, 236, - 248, 246, 112, 192, 39, 11, 136, 35, 189, 94, 111, 54, 27, 139, 141, 248, - 218, 18, 206, 85, 252, 122, 33, 194, 14, 118, 120, 180, 56, 135, 53, 255, - 56, 51, 70, 146, 137, 145, 200, 163, 49, 10, 91, 109, 2, 205, 123, 7, - 60, 21, 208, 183, 67, 182, 50, 110, 165, 240, 197, 102, 213, 163, 80, 228, - 77, 130, 158, 8, 220, 26, 203, 83, 83, 194, 5, 40, 216, 94, 124, 55, - 147, 215, 246, 170, 124, 208, 250, 61, 130, 170, 49, 89, 244, 60, 138, 9, - 145, 44, 1, 87, 82, 152, 77, 194, 144, 73, 231, 189, 217, 0, 199, 121, - 50, 79, 161, 116, 194, 227, 188, 194, 165, 86, 252, 188, 180, 9, 68, 1, - 145, 132, 140, 235, 178, 168, 36, 8, 232, 83, 77, 180, 10, 141, 202, 124, - 157, 216, 179, 86, 10, 127, 137, 234, 16, 202, 51, 175, 94, 130, 248, 190, - 153, 92, 103, 137, 144, 99, 95, 64, 94, 15, 8, 158, 135, 47, 89, 60, - 48, 134, 61, 42, 173, 150, 250, 253, 65, 205, 9, 106, 7, 219, 134, 133, - 0, 180, 120, 70, 125, 159, 142, 78, 227, 139, 131, 245, 1, 251, 29, 166, - 111, 94, 194, 221, 221, 1, 163, 75, 136, 76, 22, 197, 17, 147, 145, 63, - 229, 216, 237, 28, 183, 172, 116, 77, 163, 113, 224, 128, 124, 130, 161, 78, - 61, 133, 154, 185, 218, 90, 236, 230, 155, 226, 226, 149, 81, 245, 48, 133, - 154, 164, 160, 32, 239, 157, 39, 168, 38, 103, 237, 59, 57, 74, 158, 194, - 45, 246, 56, 3, 36, 161, 162, 232, 137, 18, 54, 59, 74, 24, 98, 9, - 18, 82, 113, 179, 190, 235, 113, 113, 153, 148, 93, 101, 223, 237, 40, 187, - 111, 150, 125, 183, 222, 228, 203, 190, 91, 231, 202, 134, 213, 45, 234, 96, - 199, 206, 79, 31, 112, 49, 192, 227, 9, 172, 172, 194, 137, 100, 126, 228, - 172, 253, 7, 194, 218, 191, 95, 86, 166, 95, 4, 99, 75, 171, 17, 151, - 220, 164, 143, 40, 253, 79, 67, 181, 188, 32, 129, 112, 178, 91, 25, 132, - 108, 17, 205, 46, 192, 210, 230, 240, 45, 223, 16, 178, 204, 11, 88, 250, - 9, 220, 9, 71, 176, 53, 15, 224, 232, 22, 185, 41, 232, 35, 60, 66, - 14, 10, 254, 26, 184, 177, 97, 19, 125, 7, 189, 117, 115, 154, 162, 65, - 254, 170, 209, 32, 72, 236, 240, 60, 155, 9, 253, 10, 115, 153, 16, 76, - 223, 242, 242, 237, 244, 74, 218, 73, 0, 184, 119, 4, 30, 10, 55, 135, - 109, 251, 158, 12, 179, 145, 73, 148, 192, 179, 190, 112, 109, 106, 202, 103, - 135, 136, 185, 43, 104, 216, 64, 88, 186, 22, 212, 107, 166, 149, 89, 127, - 193, 38, 104, 131, 235, 229, 141, 190, 186, 88, 108, 166, 3, 82, 185, 253, - 53, 253, 48, 156, 140, 39, 183, 196, 50, 97, 228, 104, 220, 53, 218, 164, - 77, 249, 235, 127, 155, 97, 146, 184, 54, 54, 24, 230, 211, 177, 196, 166, - 178, 146, 25, 50, 72, 246, 191, 193, 162, 154, 79, 198, 222, 127, 3, 63, - 246, 42, 93, 44, 80, 222, 222, 199, 133, 92, 41, 33, 72, 93, 209, 95, - 196, 33, 93, 80, 209, 177, 223, 62, 22, 220, 152, 209, 236, 93, 214, 7, - 54, 72, 53, 98, 96, 34, 96, 166, 16, 184, 8, 207, 211, 44, 53, 88, - 25, 152, 107, 125, 80, 24, 65, 181, 250, 174, 131, 21, 103, 32, 175, 187, - 166, 30, 208, 28, 11, 21, 18, 116, 255, 193, 200, 105, 10, 93, 132, 50, - 54, 77, 140, 80, 187, 99, 207, 23, 131, 41, 30, 233, 97, 231, 85, 201, - 204, 8, 57, 157, 44, 57, 44, 158, 47, 194, 154, 82, 15, 67, 166, 142, - 221, 211, 56, 4, 57, 92, 241, 4, 109, 73, 152, 224, 1, 124, 157, 173, - 116, 64, 73, 32, 242, 183, 244, 14, 138, 31, 34, 240, 70, 78, 199, 106, - 93, 50, 148, 187, 135, 156, 82, 71, 115, 74, 248, 248, 222, 137, 14, 241, - 212, 210, 247, 131, 22, 30, 96, 34, 252, 115, 58, 106, 16, 12, 116, 250, - 134, 128, 164, 149, 252, 161, 78, 30, 173, 29, 39, 143, 60, 89, 23, 215, - 147, 155, 254, 104, 144, 178, 141, 181, 58, 244, 182, 205, 229, 109, 95, 36, - 189, 30, 108, 181, 51, 105, 173, 13, 41, 108, 209, 166, 87, 248, 99, 13, - 153, 197, 236, 150, 159, 156, 255, 9, 218, 228, 189, 225, 70, 169, 9, 125, - 120, 113, 63, 35, 187, 26, 163, 169, 57, 115, 227, 221, 11, 155, 13, 137, - 3, 185, 178, 141, 129, 97, 145, 222, 42, 27, 48, 19, 225, 80, 30, 134, - 63, 51, 23, 124, 144, 89, 224, 157, 29, 11, 124, 71, 215, 31, 90, 203, - 102, 159, 229, 114, 206, 162, 184, 215, 106, 46, 207, 208, 182, 166, 102, 131, - 7, 165, 130, 85, 53, 13, 197, 66, 92, 152, 88, 111, 128, 71, 62, 173, - 67, 225, 201, 73, 76, 35, 48, 150, 80, 33, 240, 159, 1, 137, 183, 180, - 198, 102, 35, 252, 52, 118, 172, 57, 20, 32, 147, 89, 31, 190, 221, 155, - 101, 111, 147, 89, 119, 153, 101, 247, 171, 46, 178, 191, 168, 70, 120, 255, - 129, 173, 120, 12, 25, 237, 250, 159, 177, 176, 178, 189, 207, 46, 174, 194, - 200, 148, 45, 176, 174, 159, 11, 20, 240, 208, 162, 170, 236, 234, 238, 133, - 85, 88, 71, 209, 23, 91, 71, 64, 205, 208, 220, 10, 45, 177, 65, 50, - 25, 120, 71, 185, 101, 149, 207, 183, 255, 2, 203, 105, 168, 236, 51, 110, - 222, 185, 216, 147, 21, 129, 55, 65, 91, 94, 171, 183, 30, 214, 148, 228, - 85, 86, 243, 105, 210, 171, 138, 139, 253, 66, 236, 168, 102, 165, 85, 139, - 68, 13, 103, 185, 230, 13, 87, 79, 38, 153, 96, 20, 144, 214, 231, 123, - 188, 219, 89, 30, 215, 15, 108, 34, 65, 22, 98, 197, 24, 128, 50, 233, - 191, 116, 127, 12, 255, 149, 181, 119, 55, 98, 61, 217, 192, 240, 1, 55, - 223, 194, 133, 143, 235, 201, 210, 234, 60, 186, 60, 226, 75, 207, 208, 236, - 29, 97, 132, 26, 171, 105, 72, 218, 124, 113, 72, 98, 251, 225, 94, 138, - 190, 254, 128, 48, 61, 208, 241, 31, 37, 228, 209, 96, 49, 156, 244, 75, - 144, 22, 95, 27, 249, 242, 43, 179, 126, 192, 175, 101, 79, 238, 16, 73, - 17, 97, 231, 129, 5, 7, 78, 115, 130, 83, 229, 225, 233, 195, 96, 60, - 79, 240, 229, 237, 14, 80, 37, 209, 140, 202, 37, 42, 162, 94, 115, 140, - 45, 21, 241, 158, 67, 146, 48, 118, 77, 238, 62, 100, 46, 62, 82, 225, - 121, 112, 177, 161, 228, 144, 0, 195, 222, 50, 7, 1, 9, 160, 57, 36, - 166, 108, 172, 23, 169, 206, 145, 89, 165, 38, 137, 10, 220, 98, 167, 93, - 57, 42, 240, 9, 112, 31, 171, 32, 128, 134, 50, 74, 25, 8, 54, 27, - 132, 44, 16, 130, 13, 94, 191, 195, 0, 79, 246, 140, 101, 6, 123, 150, - 233, 161, 64, 238, 33, 86, 47, 32, 130, 213, 50, 129, 29, 112, 101, 32, - 135, 220, 37, 60, 5, 82, 223, 136, 56, 101, 40, 118, 160, 128, 98, 31, - 218, 161, 60, 209, 130, 178, 157, 213, 176, 98, 221, 176, 141, 95, 193, 189, - 146, 221, 38, 51, 105, 83, 74, 211, 160, 31, 104, 193, 120, 51, 153, 124, - 88, 78, 213, 173, 198, 77, 114, 47, 112, 47, 189, 72, 166, 211, 217, 100, - 93, 169, 80, 126, 45, 170, 47, 33, 146, 136, 161, 207, 200, 154, 236, 27, - 157, 220, 194, 46, 114, 157, 241, 175, 44, 5, 4, 49, 218, 43, 132, 19, - 221, 98, 182, 131, 52, 218, 28, 31, 73, 60, 43, 13, 122, 85, 185, 235, - 202, 177, 234, 186, 93, 247, 89, 118, 252, 46, 134, 9, 25, 71, 231, 2, - 219, 106, 251, 78, 188, 235, 109, 122, 136, 110, 53, 77, 199, 132, 241, 229, - 63, 56, 10, 188, 215, 98, 209, 222, 10, 186, 143, 26, 114, 85, 190, 66, - 169, 164, 82, 109, 89, 106, 206, 193, 83, 155, 120, 162, 97, 56, 194, 238, - 74, 151, 78, 82, 101, 245, 7, 176, 252, 71, 164, 92, 0, 170, 139, 58, - 46, 60, 128, 29, 47, 71, 151, 194, 2, 224, 33, 235, 82, 51, 126, 109, - 71, 56, 174, 208, 75, 202, 14, 61, 219, 233, 106, 176, 176, 50, 83, 83, - 115, 112, 249, 75, 111, 63, 179, 114, 35, 158, 137, 79, 216, 201, 219, 140, - 134, 202, 11, 37, 44, 88, 147, 6, 126, 153, 57, 169, 156, 139, 44, 191, - 83, 57, 7, 130, 223, 209, 241, 30, 145, 231, 169, 253, 108, 41, 2, 82, - 135, 154, 125, 16, 170, 96, 220, 93, 39, 4, 122, 193, 99, 74, 131, 131, - 118, 170, 98, 96, 120, 26, 43, 32, 23, 181, 132, 168, 231, 147, 130, 247, - 160, 165, 123, 136, 6, 228, 17, 198, 100, 133, 126, 221, 76, 174, 67, 10, - 250, 131, 118, 238, 13, 47, 64, 33, 206, 140, 106, 2, 91, 2, 6, 75, - 36, 155, 96, 231, 222, 195, 239, 133, 186, 187, 197, 224, 33, 108, 11, 191, - 114, 195, 119, 117, 71, 85, 212, 194, 16, 42, 232, 31, 206, 79, 135, 21, - 79, 161, 37, 168, 135, 118, 101, 140, 162, 126, 89, 190, 198, 86, 170, 122, - 124, 171, 117, 101, 251, 218, 4, 214, 234, 175, 165, 45, 254, 178, 238, 187, - 247, 157, 166, 126, 119, 139, 157, 232, 111, 30, 120, 126, 199, 118, 255, 212, - 8, 223, 173, 206, 138, 82, 173, 10, 56, 225, 244, 215, 174, 211, 223, 192, - 191, 59, 218, 211, 113, 154, 129, 79, 84, 249, 45, 53, 175, 100, 136, 219, - 100, 247, 149, 45, 70, 50, 42, 100, 149, 222, 245, 192, 32, 172, 97, 64, - 224, 103, 195, 63, 119, 236, 81, 159, 151, 165, 177, 254, 67, 70, 204, 117, - 86, 24, 175, 197, 233, 139, 209, 217, 45, 99, 243, 234, 39, 154, 54, 237, - 37, 72, 115, 230, 139, 217, 96, 124, 141, 184, 84, 15, 146, 103, 120, 154, - 38, 55, 202, 29, 126, 111, 26, 164, 112, 161, 60, 172, 115, 31, 193, 198, - 32, 186, 199, 121, 162, 27, 4, 140, 58, 184, 72, 210, 27, 160, 183, 237, - 103, 146, 8, 231, 154, 87, 105, 151, 222, 50, 169, 133, 224, 1, 50, 20, - 67, 14, 15, 61, 115, 173, 146, 81, 203, 208, 141, 103, 91, 6, 125, 45, - 80, 143, 99, 69, 61, 242, 196, 35, 208, 196, 35, 139, 254, 212, 85, 232, - 79, 15, 82, 21, 53, 162, 82, 106, 18, 19, 73, 68, 132, 119, 61, 142, - 90, 0, 156, 49, 143, 159, 184, 103, 129, 92, 12, 151, 45, 135, 139, 52, - 76, 149, 244, 3, 168, 199, 15, 192, 5, 59, 97, 19, 200, 144, 253, 6, - 47, 163, 38, 198, 45, 4, 34, 64, 141, 203, 17, 4, 19, 210, 141, 206, - 244, 199, 192, 89, 36, 215, 215, 192, 181, 27, 81, 180, 48, 81, 0, 138, - 88, 87, 184, 164, 107, 77, 137, 51, 51, 150, 88, 47, 78, 136, 88, 47, - 246, 56, 36, 196, 25, 104, 222, 88, 96, 188, 140, 84, 142, 136, 114, 140, - 40, 71, 4, 15, 71, 34, 7, 13, 130, 140, 117, 204, 65, 123, 189, 113, - 224, 110, 240, 15, 134, 236, 101, 234, 23, 136, 176, 189, 99, 18, 121, 234, - 235, 134, 194, 107, 105, 174, 81, 195, 59, 14, 224, 255, 136, 200, 114, 55, - 152, 77, 20, 100, 76, 205, 249, 33, 172, 213, 17, 140, 133, 132, 146, 98, - 50, 97, 196, 220, 16, 156, 140, 253, 17, 145, 98, 160, 82, 251, 227, 203, - 120, 76, 48, 49, 31, 5, 136, 204, 84, 62, 153, 202, 39, 83, 151, 196, - 156, 179, 27, 70, 142, 17, 173, 154, 54, 154, 226, 234, 99, 195, 162, 255, - 100, 84, 237, 245, 83, 167, 67, 107, 230, 73, 125, 131, 151, 174, 245, 19, - 130, 222, 168, 174, 159, 88, 111, 116, 235, 238, 161, 121, 77, 248, 183, 53, - 218, 72, 141, 27, 113, 227, 70, 197, 198, 141, 184, 113, 35, 209, 56, 235, - 167, 15, 186, 120, 16, 84, 166, 46, 6, 143, 254, 136, 64, 54, 63, 97, - 85, 173, 24, 45, 214, 234, 63, 125, 112, 225, 255, 52, 26, 8, 97, 131, - 205, 125, 115, 24, 215, 156, 55, 97, 237, 196, 130, 25, 199, 49, 78, 175, - 235, 8, 75, 123, 147, 140, 46, 251, 8, 169, 75, 202, 110, 212, 31, 194, - 19, 16, 190, 233, 101, 10, 199, 76, 141, 193, 106, 125, 215, 254, 240, 18, - 23, 113, 157, 95, 162, 126, 243, 229, 217, 135, 243, 211, 24, 136, 108, 205, - 145, 43, 178, 134, 13, 254, 0, 175, 255, 231, 130, 107, 59, 163, 18, 93, - 99, 16, 206, 225, 33, 60, 227, 160, 122, 245, 255, 92, 168, 6, 127, 202, - 192, 76, 255, 6, 169, 255, 185, 104, 214, 203, 7, 135, 240, 138, 166, 155, - 250, 244, 111, 208, 84, 23, 215, 18, 74, 142, 212, 153, 233, 223, 40, 2, - 53, 228, 168, 83, 25, 77, 72, 104, 197, 48, 156, 12, 177, 83, 115, 248, - 195, 169, 185, 127, 115, 169, 84, 250, 8, 184, 104, 190, 204, 46, 102, 16, - 37, 113, 5, 53, 244, 251, 226, 27, 171, 81, 250, 158, 101, 200, 105, 131, - 117, 2, 164, 104, 148, 172, 207, 68, 41, 200, 72, 249, 120, 2, 203, 173, - 114, 85, 242, 7, 145, 114, 94, 112, 188, 204, 108, 65, 108, 225, 90, 142, - 213, 193, 54, 140, 146, 223, 255, 5, 132, 144, 173, 91, 142, 237, 91, 106, - 137, 146, 147, 15, 216, 183, 235, 181, 168, 81, 219, 158, 74, 35, 213, 18, - 167, 202, 50, 48, 96, 34, 151, 72, 98, 85, 193, 134, 109, 171, 20, 112, - 85, 79, 48, 88, 5, 116, 130, 94, 42, 51, 244, 253, 181, 44, 91, 30, - 105, 98, 46, 231, 1, 165, 231, 117, 149, 196, 34, 178, 160, 114, 99, 45, - 223, 160, 67, 101, 74, 218, 160, 220, 92, 52, 31, 235, 167, 194, 100, 72, - 152, 26, 219, 70, 236, 45, 87, 197, 45, 114, 85, 72, 31, 180, 97, 81, - 74, 177, 42, 243, 162, 217, 32, 97, 76, 132, 203, 116, 12, 143, 61, 10, - 91, 130, 195, 130, 15, 248, 174, 32, 29, 166, 85, 182, 70, 120, 108, 211, - 91, 72, 76, 10, 1, 92, 105, 206, 233, 108, 217, 91, 44, 9, 202, 127, - 192, 70, 202, 191, 170, 61, 18, 143, 196, 195, 64, 170, 114, 24, 42, 21, - 34, 98, 228, 3, 63, 51, 19, 23, 104, 73, 75, 156, 30, 207, 199, 227, - 108, 184, 114, 31, 19, 150, 69, 163, 70, 101, 87, 152, 21, 101, 148, 148, - 88, 235, 175, 106, 140, 213, 50, 187, 121, 108, 101, 59, 45, 180, 143, 196, - 155, 25, 214, 253, 110, 46, 226, 252, 142, 206, 73, 166, 11, 59, 197, 65, - 160, 220, 210, 0, 74, 24, 249, 2, 26, 157, 105, 51, 176, 35, 192, 83, - 177, 26, 230, 37, 5, 171, 148, 254, 191, 200, 103, 205, 135, 201, 148, 27, - 122, 67, 174, 165, 220, 114, 9, 111, 201, 142, 189, 2, 226, 50, 59, 161, - 19, 54, 100, 249, 18, 243, 9, 69, 113, 64, 249, 127, 194, 9, 197, 110, - 170, 249, 228, 62, 63, 106, 58, 203, 251, 246, 171, 205, 167, 72, 255, 58, - 0, 166, 120, 142, 40, 6, 91, 155, 142, 86, 249, 6, 67, 204, 162, 101, - 4, 114, 185, 202, 124, 48, 208, 214, 131, 41, 42, 138, 57, 88, 250, 137, - 241, 183, 97, 25, 118, 35, 33, 8, 218, 82, 144, 197, 88, 187, 176, 73, - 55, 133, 245, 192, 97, 61, 104, 137, 203, 6, 233, 168, 63, 230, 50, 22, - 50, 80, 107, 103, 167, 190, 14, 161, 42, 214, 253, 128, 99, 231, 242, 250, - 163, 221, 91, 70, 41, 254, 104, 230, 254, 168, 115, 7, 249, 220, 163, 91, - 12, 92, 170, 206, 70, 48, 82, 47, 153, 118, 124, 152, 201, 229, 254, 66, - 140, 214, 211, 48, 70, 245, 36, 6, 12, 98, 13, 36, 13, 89, 32, 145, - 152, 209, 242, 69, 32, 208, 113, 138, 161, 103, 183, 48, 52, 70, 50, 238, - 13, 208, 62, 159, 250, 138, 166, 97, 93, 130, 172, 3, 201, 221, 9, 14, - 97, 188, 46, 222, 95, 233, 42, 239, 101, 48, 99, 173, 145, 32, 199, 127, - 246, 231, 142, 239, 49, 66, 65, 125, 133, 65, 85, 49, 32, 236, 129, 64, - 204, 243, 68, 16, 136, 198, 187, 176, 85, 223, 24, 119, 141, 3, 14, 223, - 94, 95, 61, 165, 83, 1, 217, 4, 60, 19, 199, 208, 169, 139, 32, 102, - 3, 142, 186, 138, 162, 140, 74, 21, 24, 125, 40, 9, 227, 147, 192, 75, - 139, 176, 152, 167, 149, 203, 243, 1, 215, 143, 167, 31, 163, 119, 179, 181, - 128, 196, 5, 42, 136, 22, 161, 7, 23, 141, 166, 243, 1, 230, 148, 186, - 238, 44, 248, 76, 223, 24, 8, 15, 139, 218, 226, 201, 126, 134, 144, 104, - 197, 147, 222, 163, 3, 181, 71, 7, 106, 143, 14, 220, 156, 106, 114, 87, - 180, 156, 138, 125, 87, 28, 206, 212, 127, 2, 46, 246, 239, 238, 247, 141, - 252, 73, 213, 175, 181, 177, 110, 98, 238, 25, 5, 39, 48, 118, 90, 173, - 124, 4, 217, 255, 1, 216, 139, 146, 225, 18, 26, 0, 33, 185, 7, 13, - 169, 2, 8, 178, 42, 0, 39, 168, 196, 128, 14, 114, 16, 208, 20, 144, - 160, 91, 112, 92, 239, 170, 140, 221, 236, 25, 25, 15, 115, 217, 249, 152, - 12, 70, 96, 232, 21, 59, 153, 195, 83, 167, 91, 132, 102, 222, 233, 151, - 118, 115, 118, 110, 245, 215, 136, 164, 65, 189, 229, 83, 177, 117, 72, 11, - 211, 129, 7, 94, 128, 74, 54, 249, 60, 228, 231, 27, 82, 24, 160, 42, - 139, 159, 223, 201, 231, 17, 63, 191, 35, 45, 2, 234, 184, 232, 121, 157, - 74, 114, 241, 79, 195, 174, 211, 107, 39, 248, 135, 111, 238, 130, 67, 252, - 211, 64, 133, 151, 142, 132, 16, 145, 99, 14, 59, 224, 160, 197, 85, 115, - 216, 236, 111, 221, 72, 136, 48, 58, 90, 122, 219, 74, 49, 108, 181, 210, - 72, 184, 97, 183, 147, 189, 237, 146, 73, 88, 253, 254, 224, 254, 221, 246, - 0, 6, 156, 142, 125, 129, 214, 225, 153, 9, 234, 200, 236, 26, 188, 226, - 130, 244, 88, 191, 141, 223, 215, 107, 217, 71, 248, 62, 60, 34, 234, 228, - 116, 27, 20, 188, 24, 228, 216, 91, 47, 109, 188, 140, 157, 142, 123, 11, - 141, 25, 132, 62, 198, 144, 190, 1, 162, 21, 223, 47, 48, 92, 3, 201, - 71, 214, 21, 33, 138, 214, 29, 124, 0, 20, 197, 220, 236, 111, 7, 179, - 107, 116, 44, 43, 88, 162, 234, 71, 153, 221, 90, 132, 17, 38, 216, 238, - 10, 171, 226, 155, 229, 8, 24, 104, 124, 81, 217, 219, 202, 120, 108, 42, - 50, 183, 46, 253, 140, 52, 142, 186, 178, 162, 221, 113, 182, 37, 102, 3, - 118, 90, 29, 207, 209, 234, 24, 61, 172, 92, 95, 152, 36, 65, 10, 108, - 168, 115, 168, 254, 26, 141, 143, 93, 31, 195, 76, 163, 73, 114, 75, 103, - 136, 84, 6, 153, 131, 179, 64, 206, 59, 145, 115, 78, 178, 166, 61, 32, - 207, 39, 110, 39, 225, 253, 28, 56, 254, 1, 140, 31, 172, 243, 201, 66, - 70, 72, 206, 53, 158, 173, 220, 206, 106, 206, 105, 13, 118, 226, 97, 50, - 183, 107, 247, 243, 109, 237, 52, 82, 113, 191, 27, 28, 204, 172, 84, 172, - 157, 92, 51, 75, 118, 61, 74, 2, 233, 95, 73, 119, 33, 223, 149, 204, - 225, 149, 0, 14, 195, 202, 53, 66, 228, 99, 240, 82, 184, 186, 56, 124, - 42, 85, 160, 84, 97, 28, 85, 97, 166, 96, 43, 67, 55, 178, 184, 181, - 134, 18, 51, 124, 106, 194, 103, 68, 79, 179, 199, 241, 15, 55, 57, 11, - 152, 82, 20, 138, 231, 242, 212, 190, 10, 38, 131, 12, 51, 166, 201, 44, - 185, 185, 25, 220, 216, 181, 75, 210, 175, 7, 240, 77, 93, 146, 193, 102, - 88, 195, 32, 69, 151, 243, 242, 177, 207, 199, 53, 193, 137, 64, 104, 57, - 25, 44, 199, 199, 216, 112, 42, 8, 11, 7, 135, 195, 128, 71, 122, 146, - 240, 10, 56, 61, 220, 137, 75, 88, 229, 172, 1, 184, 168, 204, 150, 181, - 149, 240, 203, 168, 36, 202, 71, 214, 209, 184, 172, 74, 1, 190, 115, 106, - 101, 7, 200, 28, 50, 31, 72, 39, 162, 20, 236, 3, 220, 28, 241, 214, - 134, 167, 50, 65, 219, 96, 181, 169, 55, 85, 76, 118, 49, 24, 76, 251, - 25, 142, 176, 61, 157, 172, 224, 58, 52, 229, 250, 146, 1, 206, 68, 62, - 59, 206, 98, 175, 68, 234, 22, 177, 251, 13, 187, 32, 104, 170, 128, 123, - 106, 7, 28, 236, 204, 47, 250, 128, 20, 7, 24, 71, 51, 183, 192, 228, - 224, 112, 136, 51, 35, 190, 78, 232, 138, 8, 93, 82, 203, 205, 166, 68, - 66, 181, 109, 77, 5, 24, 20, 27, 105, 0, 215, 68, 164, 23, 118, 128, - 129, 135, 44, 220, 20, 119, 164, 41, 70, 226, 26, 120, 199, 45, 10, 216, - 181, 181, 46, 177, 172, 177, 56, 35, 144, 186, 129, 129, 26, 54, 251, 18, - 77, 37, 11, 120, 78, 41, 208, 21, 50, 39, 2, 30, 204, 50, 8, 28, - 220, 247, 180, 95, 73, 11, 119, 37, 187, 245, 14, 221, 22, 160, 98, 251, - 93, 155, 175, 64, 246, 160, 44, 20, 160, 128, 165, 8, 249, 98, 199, 43, - 123, 17, 88, 189, 156, 165, 113, 88, 94, 24, 210, 47, 108, 91, 200, 29, - 40, 253, 160, 24, 209, 198, 60, 143, 102, 35, 99, 181, 38, 254, 192, 49, - 1, 209, 184, 124, 188, 152, 44, 75, 63, 130, 106, 53, 21, 35, 9, 5, - 221, 167, 229, 192, 130, 45, 174, 30, 158, 91, 178, 33, 202, 252, 2, 18, - 245, 138, 81, 173, 96, 202, 109, 182, 37, 187, 92, 204, 243, 85, 65, 126, - 178, 88, 60, 151, 36, 56, 156, 198, 44, 133, 179, 84, 1, 51, 75, 193, - 75, 80, 70, 164, 232, 160, 80, 131, 29, 193, 192, 30, 227, 193, 5, 153, - 141, 24, 35, 54, 227, 48, 186, 187, 85, 94, 23, 191, 186, 206, 235, 15, - 212, 142, 255, 143, 84, 94, 60, 240, 74, 227, 69, 183, 191, 142, 194, 11, - 138, 158, 255, 115, 168, 71, 140, 78, 30, 91, 153, 30, 127, 154, 182, 203, - 232, 217, 111, 167, 236, 162, 118, 239, 210, 117, 113, 199, 126, 21, 85, 215, - 63, 219, 84, 178, 162, 203, 236, 240, 39, 234, 185, 126, 139, 153, 252, 95, - 160, 230, 162, 145, 222, 87, 203, 37, 51, 239, 171, 228, 50, 87, 239, 175, - 162, 95, 41, 167, 241, 255, 202, 234, 149, 226, 96, 253, 195, 181, 43, 60, - 200, 191, 43, 87, 254, 37, 148, 43, 59, 117, 43, 233, 184, 68, 183, 194, - 166, 233, 15, 187, 2, 183, 170, 188, 128, 41, 30, 184, 52, 52, 215, 190, - 149, 117, 228, 86, 152, 160, 142, 208, 220, 20, 231, 155, 240, 91, 26, 95, - 216, 63, 184, 66, 167, 131, 253, 202, 171, 115, 144, 174, 147, 37, 19, 249, - 1, 195, 175, 182, 125, 150, 224, 58, 62, 217, 152, 149, 149, 141, 166, 241, - 89, 195, 120, 109, 22, 143, 149, 49, 46, 0, 218, 183, 163, 121, 59, 149, - 3, 219, 193, 77, 58, 133, 29, 65, 166, 70, 8, 232, 67, 168, 208, 190, - 200, 175, 13, 226, 249, 13, 54, 78, 31, 140, 38, 183, 172, 114, 42, 156, - 41, 163, 186, 66, 198, 192, 144, 172, 123, 46, 2, 136, 82, 103, 189, 176, - 119, 78, 43, 112, 225, 64, 93, 70, 200, 173, 75, 167, 234, 29, 51, 173, - 74, 37, 200, 156, 49, 197, 56, 169, 95, 165, 179, 249, 194, 214, 152, 83, - 165, 179, 91, 18, 189, 227, 58, 23, 189, 131, 27, 98, 80, 97, 79, 7, - 25, 133, 198, 250, 2, 6, 119, 208, 39, 146, 44, 98, 138, 146, 151, 230, - 124, 114, 57, 184, 33, 200, 127, 50, 130, 71, 3, 243, 116, 124, 155, 32, - 252, 255, 194, 174, 247, 153, 82, 55, 40, 12, 128, 60, 197, 255, 197, 238, - 198, 183, 201, 248, 246, 38, 5, 18, 111, 144, 117, 53, 8, 82, 43, 150, - 96, 140, 228, 244, 122, 12, 107, 175, 135, 197, 133, 175, 15, 163, 215, 70, - 255, 171, 5, 59, 238, 15, 197, 75, 44, 91, 75, 114, 44, 75, 166, 215, - 148, 198, 10, 243, 160, 230, 96, 92, 238, 103, 191, 187, 54, 150, 240, 164, - 40, 103, 214, 157, 205, 81, 212, 109, 22, 234, 221, 141, 166, 128, 24, 10, - 104, 195, 212, 134, 43, 84, 76, 210, 181, 6, 97, 193, 180, 59, 74, 51, - 18, 129, 103, 154, 163, 82, 128, 69, 123, 103, 238, 209, 247, 9, 252, 75, - 185, 159, 134, 106, 177, 1, 69, 133, 116, 172, 159, 130, 196, 134, 156, 95, - 124, 79, 81, 167, 139, 170, 171, 31, 188, 190, 238, 143, 249, 246, 99, 4, - 119, 93, 77, 213, 20, 183, 74, 91, 24, 90, 21, 13, 55, 180, 72, 209, - 54, 134, 141, 250, 151, 95, 96, 3, 138, 227, 80, 94, 68, 69, 37, 36, - 108, 138, 213, 93, 217, 49, 67, 47, 207, 5, 231, 42, 85, 207, 118, 11, - 182, 145, 54, 225, 240, 14, 188, 103, 182, 119, 40, 157, 99, 3, 210, 212, - 32, 34, 134, 221, 34, 127, 28, 3, 188, 130, 178, 210, 4, 217, 135, 28, - 222, 74, 33, 81, 16, 23, 140, 111, 221, 169, 215, 34, 175, 228, 53, 137, - 155, 97, 188, 90, 161, 84, 166, 112, 77, 200, 14, 201, 128, 88, 216, 235, - 165, 140, 93, 149, 117, 128, 226, 68, 200, 187, 79, 158, 125, 240, 252, 68, - 229, 172, 91, 249, 156, 240, 84, 64, 249, 202, 162, 83, 65, 222, 222, 96, - 110, 172, 182, 47, 24, 158, 234, 175, 67, 168, 92, 66, 253, 43, 164, 65, - 126, 73, 117, 69, 235, 97, 129, 148, 207, 123, 179, 244, 18, 75, 26, 191, - 80, 165, 252, 121, 224, 218, 255, 158, 164, 176, 185, 94, 159, 216, 63, 46, - 199, 174, 253, 111, 64, 95, 79, 236, 191, 38, 104, 185, 255, 83, 154, 76, - 38, 75, 215, 174, 253, 137, 7, 234, 123, 106, 182, 138, 86, 231, 214, 48, - 114, 47, 92, 143, 237, 111, 97, 103, 223, 204, 133, 29, 217, 155, 164, 55, - 68, 151, 137, 239, 129, 178, 195, 62, 73, 167, 15, 154, 17, 248, 254, 15, - 127, 248, 131, 253, 87, 100, 39, 48, 114, 8, 202, 103, 176, 174, 93, 251, - 118, 114, 211, 142, 186, 46, 16, 162, 246, 145, 107, 79, 167, 237, 32, 122, - 126, 236, 6, 29, 255, 57, 180, 105, 57, 70, 91, 230, 32, 170, 248, 32, - 185, 117, 93, 183, 163, 162, 26, 11, 223, 7, 178, 60, 55, 108, 184, 75, - 24, 28, 202, 73, 0, 132, 28, 204, 66, 249, 48, 236, 64, 61, 201, 32, - 107, 102, 221, 44, 36, 211, 29, 40, 166, 59, 40, 61, 103, 160, 183, 74, - 17, 66, 136, 17, 119, 2, 233, 90, 82, 78, 136, 201, 185, 67, 11, 148, - 196, 255, 174, 226, 123, 130, 217, 22, 182, 253, 192, 206, 188, 3, 73, 209, - 57, 37, 55, 135, 173, 53, 204, 62, 30, 230, 30, 247, 179, 143, 251, 185, - 199, 173, 59, 219, 103, 246, 84, 152, 226, 219, 23, 108, 224, 255, 94, 70, - 22, 18, 136, 29, 153, 111, 92, 248, 160, 240, 239, 197, 154, 223, 185, 216, - 136, 223, 59, 149, 254, 66, 68, 123, 71, 178, 165, 37, 113, 74, 123, 26, - 110, 141, 227, 46, 223, 67, 255, 64, 125, 228, 133, 239, 31, 192, 154, 2, - 198, 224, 38, 149, 95, 50, 5, 169, 142, 107, 247, 43, 16, 73, 234, 176, - 38, 241, 60, 12, 195, 211, 53, 218, 53, 242, 252, 18, 12, 90, 0, 28, - 63, 186, 207, 181, 60, 225, 235, 8, 228, 140, 68, 220, 67, 3, 176, 2, - 153, 122, 217, 106, 110, 229, 176, 164, 149, 195, 79, 104, 37, 135, 206, 134, - 102, 14, 119, 54, 19, 61, 116, 165, 235, 219, 30, 173, 221, 136, 214, 222, - 137, 214, 246, 75, 90, 219, 255, 132, 214, 82, 92, 239, 61, 26, 107, 54, - 119, 223, 54, 223, 201, 143, 22, 22, 243, 197, 21, 34, 51, 190, 176, 115, - 88, 31, 24, 51, 106, 48, 189, 144, 48, 164, 149, 10, 48, 195, 147, 90, - 80, 85, 44, 212, 166, 66, 31, 117, 236, 88, 64, 239, 136, 180, 255, 185, - 217, 144, 74, 181, 151, 238, 76, 232, 91, 102, 207, 180, 162, 95, 4, 197, - 140, 252, 10, 165, 23, 16, 129, 7, 250, 147, 59, 3, 208, 248, 26, 242, - 8, 114, 218, 31, 112, 189, 44, 243, 42, 4, 140, 44, 222, 183, 128, 196, - 98, 177, 2, 229, 136, 53, 10, 18, 107, 52, 67, 222, 224, 213, 6, 175, - 238, 148, 160, 177, 43, 199, 126, 34, 135, 172, 208, 148, 56, 230, 232, 16, - 221, 127, 132, 200, 241, 16, 83, 95, 198, 206, 155, 83, 36, 26, 33, 158, - 165, 95, 2, 58, 43, 69, 56, 214, 249, 63, 19, 132, 86, 30, 7, 43, - 253, 13, 128, 176, 246, 26, 133, 223, 4, 16, 43, 253, 194, 136, 88, 233, - 175, 9, 137, 149, 126, 9, 76, 172, 199, 140, 253, 158, 216, 88, 233, 110, - 112, 172, 178, 49, 169, 66, 199, 42, 235, 98, 9, 60, 86, 90, 130, 143, - 117, 104, 34, 69, 217, 26, 94, 170, 185, 3, 94, 106, 47, 80, 45, 134, - 171, 82, 24, 90, 194, 75, 49, 192, 130, 189, 192, 68, 197, 66, 224, 44, - 3, 18, 203, 124, 132, 112, 89, 230, 163, 22, 98, 106, 193, 180, 180, 24, - 54, 203, 132, 41, 69, 172, 45, 129, 166, 101, 123, 180, 27, 50, 110, 193, - 218, 254, 192, 14, 143, 33, 34, 124, 185, 161, 64, 245, 106, 3, 255, 65, - 193, 56, 195, 156, 183, 153, 219, 33, 47, 81, 194, 105, 40, 125, 22, 88, - 173, 125, 193, 186, 4, 5, 28, 20, 173, 176, 164, 16, 234, 77, 102, 139, - 225, 132, 78, 96, 60, 102, 156, 129, 32, 133, 25, 114, 173, 22, 86, 125, - 222, 40, 39, 184, 88, 1, 252, 219, 161, 134, 120, 76, 53, 255, 100, 144, - 143, 36, 254, 154, 96, 143, 123, 225, 53, 166, 159, 169, 165, 149, 159, 251, - 103, 170, 105, 219, 159, 177, 7, 225, 22, 3, 189, 144, 29, 218, 67, 242, - 146, 141, 254, 52, 209, 43, 253, 52, 129, 43, 83, 233, 167, 11, 94, 123, - 137, 92, 47, 119, 139, 92, 47, 119, 139, 92, 47, 171, 69, 174, 180, 84, - 230, 226, 228, 188, 232, 149, 74, 217, 43, 149, 194, 87, 42, 165, 175, 84, - 138, 95, 233, 231, 202, 95, 233, 167, 8, 96, 76, 223, 102, 68, 182, 236, - 186, 135, 103, 163, 58, 130, 122, 203, 20, 14, 44, 213, 230, 125, 101, 175, - 7, 219, 246, 144, 216, 53, 183, 55, 212, 56, 133, 53, 130, 45, 60, 193, - 115, 35, 116, 93, 15, 221, 213, 246, 129, 182, 238, 47, 121, 61, 216, 214, - 7, 132, 174, 185, 125, 167, 155, 154, 105, 239, 161, 217, 94, 23, 127, 134, - 149, 205, 22, 223, 173, 34, 87, 36, 5, 8, 241, 135, 69, 143, 83, 148, - 181, 124, 60, 86, 64, 9, 227, 2, 37, 12, 244, 149, 63, 75, 199, 41, - 121, 163, 15, 132, 145, 146, 62, 212, 248, 62, 23, 18, 225, 63, 84, 225, - 121, 122, 243, 253, 149, 125, 13, 84, 125, 172, 36, 174, 68, 28, 219, 66, - 119, 15, 80, 246, 226, 239, 22, 117, 159, 144, 66, 171, 59, 29, 219, 127, - 52, 145, 160, 64, 116, 72, 41, 90, 162, 122, 189, 97, 240, 212, 64, 112, - 102, 171, 20, 99, 213, 162, 137, 16, 202, 85, 168, 23, 203, 215, 54, 65, - 77, 159, 106, 165, 167, 43, 125, 251, 250, 15, 44, 109, 213, 115, 64, 210, - 7, 106, 44, 14, 140, 237, 238, 135, 9, 209, 184, 100, 65, 132, 206, 12, - 11, 44, 10, 156, 219, 24, 7, 24, 99, 197, 219, 98, 216, 132, 90, 119, - 58, 129, 61, 234, 242, 102, 112, 200, 128, 48, 52, 160, 125, 123, 62, 185, - 89, 230, 124, 42, 171, 68, 85, 238, 10, 5, 188, 85, 77, 67, 241, 149, - 165, 214, 194, 100, 245, 207, 227, 58, 80, 157, 193, 21, 112, 135, 253, 70, - 149, 20, 171, 87, 69, 75, 175, 16, 198, 19, 176, 50, 75, 198, 52, 150, - 52, 77, 37, 17, 139, 82, 226, 166, 213, 80, 202, 221, 50, 93, 5, 174, - 68, 182, 36, 118, 238, 107, 38, 114, 150, 237, 68, 181, 173, 92, 129, 177, - 233, 196, 66, 174, 40, 142, 120, 162, 4, 17, 89, 142, 102, 136, 97, 151, - 174, 137, 37, 152, 91, 121, 20, 219, 33, 187, 124, 132, 240, 44, 198, 71, - 206, 202, 128, 12, 68, 136, 63, 38, 48, 173, 8, 56, 194, 148, 32, 65, - 24, 102, 103, 112, 209, 155, 220, 76, 102, 243, 45, 3, 78, 225, 174, 255, - 105, 213, 139, 74, 160, 108, 223, 42, 9, 154, 137, 252, 65, 6, 104, 192, - 173, 133, 205, 58, 179, 162, 33, 114, 156, 171, 6, 84, 139, 247, 27, 190, - 31, 54, 208, 209, 186, 83, 163, 144, 224, 150, 196, 198, 18, 219, 69, 12, - 159, 113, 9, 74, 86, 203, 62, 96, 72, 130, 31, 99, 198, 146, 170, 159, - 57, 105, 114, 238, 206, 93, 191, 209, 56, 249, 241, 128, 251, 247, 105, 195, - 45, 2, 14, 230, 85, 25, 242, 187, 42, 81, 93, 48, 211, 82, 57, 29, - 57, 148, 179, 200, 68, 57, 147, 207, 2, 19, 236, 19, 177, 61, 145, 153, - 35, 68, 207, 240, 176, 12, 201, 19, 3, 121, 32, 216, 20, 141, 198, 7, - 99, 104, 30, 51, 179, 143, 239, 105, 5, 220, 105, 6, 249, 229, 203, 117, - 5, 86, 151, 16, 176, 4, 201, 31, 143, 171, 249, 253, 79, 103, 242, 161, - 84, 100, 127, 119, 48, 249, 191, 46, 103, 79, 192, 247, 5, 214, 158, 56, - 251, 46, 226, 200, 201, 7, 89, 214, 158, 15, 186, 30, 230, 236, 233, 240, - 75, 87, 76, 69, 97, 205, 235, 59, 168, 252, 238, 238, 14, 235, 127, 206, - 177, 41, 224, 234, 153, 108, 9, 92, 132, 248, 123, 44, 90, 116, 44, 90, - 244, 220, 195, 75, 241, 0, 154, 36, 241, 239, 108, 209, 13, 241, 75, 121, - 143, 92, 130, 244, 151, 253, 147, 41, 220, 13, 62, 134, 51, 36, 20, 234, - 171, 85, 56, 160, 59, 172, 148, 68, 198, 211, 36, 29, 235, 96, 40, 234, - 2, 24, 80, 70, 42, 99, 28, 55, 157, 110, 34, 233, 160, 121, 151, 9, - 165, 99, 220, 95, 37, 232, 48, 67, 122, 92, 145, 146, 142, 123, 51, 58, - 173, 122, 66, 118, 96, 20, 188, 93, 90, 63, 162, 31, 3, 167, 40, 227, - 35, 114, 102, 224, 180, 254, 160, 151, 176, 153, 177, 120, 75, 96, 135, 5, - 100, 32, 41, 194, 192, 47, 23, 6, 190, 66, 94, 120, 250, 94, 116, 243, - 17, 225, 57, 128, 69, 25, 79, 76, 180, 153, 58, 176, 110, 104, 231, 55, - 55, 195, 102, 137, 241, 163, 205, 94, 48, 42, 18, 77, 154, 194, 130, 137, - 109, 3, 237, 146, 71, 131, 62, 210, 141, 18, 144, 160, 255, 171, 185, 149, - 116, 193, 71, 139, 137, 0, 193, 185, 76, 240, 110, 134, 74, 82, 182, 100, - 70, 190, 129, 167, 196, 101, 142, 67, 152, 88, 64, 61, 27, 166, 50, 152, - 21, 237, 102, 140, 19, 205, 3, 99, 38, 51, 166, 113, 64, 160, 60, 200, - 63, 166, 152, 176, 233, 98, 163, 218, 139, 102, 25, 24, 36, 169, 234, 105, - 88, 124, 85, 244, 15, 77, 55, 138, 111, 138, 135, 187, 140, 238, 12, 100, - 36, 210, 190, 27, 109, 102, 195, 59, 19, 42, 41, 12, 141, 20, 94, 107, - 20, 193, 87, 39, 170, 229, 38, 108, 177, 213, 122, 19, 129, 196, 178, 171, - 205, 76, 164, 229, 22, 35, 138, 160, 241, 34, 163, 139, 41, 198, 42, 183, - 238, 170, 176, 40, 52, 32, 144, 52, 29, 146, 134, 73, 218, 116, 8, 141, - 200, 228, 211, 144, 184, 121, 122, 26, 232, 167, 45, 177, 202, 116, 248, 21, - 105, 81, 84, 17, 128, 69, 87, 43, 204, 146, 35, 42, 147, 203, 197, 34, - 93, 246, 249, 16, 79, 143, 217, 246, 31, 218, 149, 121, 170, 170, 101, 96, - 84, 140, 227, 44, 188, 75, 220, 231, 168, 105, 227, 54, 40, 163, 38, 145, - 251, 66, 187, 185, 104, 154, 161, 224, 192, 36, 166, 187, 202, 164, 49, 135, - 133, 171, 75, 218, 163, 197, 215, 31, 220, 36, 203, 113, 178, 241, 196, 49, - 47, 46, 57, 114, 60, 82, 247, 81, 140, 133, 203, 251, 173, 89, 166, 56, - 66, 122, 252, 231, 175, 62, 94, 67, 63, 33, 172, 1, 103, 184, 131, 201, - 158, 149, 124, 196, 64, 47, 14, 12, 15, 31, 236, 85, 140, 206, 76, 136, - 215, 72, 248, 74, 188, 208, 229, 129, 14, 213, 86, 31, 180, 49, 204, 187, - 246, 204, 184, 90, 142, 233, 19, 111, 144, 188, 32, 141, 12, 216, 122, 32, - 235, 163, 85, 48, 50, 40, 19, 16, 196, 170, 61, 238, 62, 165, 227, 172, - 236, 152, 75, 131, 238, 236, 176, 33, 94, 253, 158, 107, 153, 86, 162, 92, - 89, 157, 204, 122, 110, 21, 22, 131, 12, 163, 83, 182, 74, 30, 6, 210, - 133, 30, 20, 195, 94, 27, 134, 176, 44, 120, 68, 47, 227, 72, 89, 196, - 50, 116, 51, 91, 232, 251, 113, 77, 173, 46, 144, 74, 130, 184, 150, 91, - 94, 144, 24, 198, 53, 99, 125, 65, 66, 20, 215, 140, 5, 86, 19, 236, - 32, 51, 55, 114, 65, 25, 182, 232, 42, 210, 86, 201, 18, 42, 89, 56, - 66, 239, 20, 102, 112, 15, 59, 57, 38, 18, 68, 39, 96, 117, 97, 24, - 84, 1, 5, 222, 145, 33, 204, 36, 244, 175, 142, 17, 36, 39, 255, 141, - 20, 165, 24, 2, 17, 88, 199, 149, 59, 116, 251, 4, 248, 103, 160, 38, - 10, 113, 139, 68, 178, 233, 96, 134, 230, 121, 232, 155, 184, 253, 70, 35, - 249, 189, 105, 58, 225, 11, 242, 27, 51, 209, 22, 161, 192, 192, 37, 83, - 84, 149, 234, 26, 239, 136, 106, 88, 166, 195, 204, 93, 215, 233, 32, 164, - 128, 232, 128, 129, 19, 72, 240, 152, 247, 225, 59, 231, 229, 214, 98, 85, - 210, 189, 239, 114, 249, 82, 207, 230, 80, 38, 44, 83, 232, 115, 114, 57, - 134, 70, 14, 214, 162, 228, 50, 244, 141, 12, 14, 85, 226, 58, 92, 148, - 235, 208, 11, 46, 188, 0, 210, 93, 86, 93, 110, 93, 161, 186, 189, 70, - 123, 176, 189, 186, 65, 116, 182, 213, 87, 158, 128, 98, 227, 212, 33, 165, - 14, 115, 169, 125, 74, 237, 231, 82, 87, 152, 200, 173, 90, 97, 122, 67, - 21, 162, 31, 12, 51, 15, 250, 250, 65, 95, 60, 72, 175, 234, 169, 155, - 50, 36, 26, 247, 109, 221, 132, 166, 29, 174, 240, 225, 223, 84, 226, 166, - 9, 45, 59, 28, 98, 226, 223, 85, 226, 93, 19, 26, 118, 216, 199, 196, - 239, 235, 95, 1, 203, 75, 166, 245, 13, 68, 56, 131, 123, 12, 74, 188, - 113, 239, 224, 97, 171, 149, 194, 227, 64, 60, 70, 192, 172, 154, 213, 98, - 32, 113, 1, 191, 12, 195, 242, 36, 150, 126, 128, 79, 156, 83, 144, 206, - 97, 61, 66, 137, 233, 8, 36, 18, 143, 226, 180, 167, 35, 60, 3, 163, - 24, 238, 86, 75, 33, 91, 168, 179, 22, 123, 5, 114, 222, 108, 62, 28, - 244, 149, 122, 179, 165, 95, 67, 87, 4, 47, 178, 164, 7, 195, 41, 106, - 21, 126, 249, 5, 62, 12, 3, 193, 21, 4, 131, 25, 171, 237, 221, 136, - 179, 69, 8, 189, 97, 174, 49, 92, 127, 168, 63, 101, 124, 96, 241, 95, - 224, 34, 252, 121, 155, 177, 53, 204, 147, 188, 136, 133, 13, 19, 133, 3, - 201, 244, 153, 71, 98, 200, 55, 225, 139, 104, 235, 177, 5, 178, 97, 164, - 215, 214, 74, 98, 165, 170, 120, 47, 33, 174, 205, 58, 161, 127, 8, 78, - 204, 143, 144, 94, 186, 1, 133, 238, 162, 161, 192, 116, 98, 244, 197, 3, - 102, 233, 209, 118, 66, 200, 51, 194, 43, 163, 109, 180, 53, 44, 116, 21, - 219, 158, 117, 108, 165, 110, 162, 34, 65, 32, 140, 84, 180, 140, 141, 216, - 84, 211, 2, 121, 162, 166, 133, 226, 22, 29, 61, 181, 221, 240, 159, 112, - 72, 96, 149, 148, 204, 49, 233, 87, 70, 25, 148, 81, 68, 103, 68, 36, - 209, 217, 173, 134, 194, 103, 241, 8, 61, 181, 202, 69, 36, 105, 200, 97, - 176, 52, 215, 55, 147, 203, 228, 70, 27, 172, 64, 18, 33, 51, 103, 194, - 213, 248, 194, 37, 91, 184, 73, 114, 248, 133, 42, 251, 21, 201, 29, 24, - 98, 197, 39, 25, 177, 24, 45, 139, 37, 254, 176, 153, 22, 116, 133, 125, - 11, 27, 186, 176, 191, 117, 96, 250, 218, 87, 26, 194, 62, 134, 13, 48, - 135, 46, 207, 0, 136, 225, 124, 120, 239, 207, 198, 181, 129, 154, 205, 192, - 54, 221, 237, 169, 184, 238, 114, 4, 16, 190, 57, 138, 163, 172, 163, 191, - 48, 173, 65, 7, 151, 18, 235, 154, 146, 225, 206, 218, 216, 168, 205, 221, - 208, 227, 116, 148, 67, 118, 215, 116, 200, 62, 218, 3, 150, 127, 214, 206, - 131, 236, 203, 38, 180, 201, 31, 203, 136, 118, 3, 124, 222, 245, 12, 253, - 193, 239, 161, 231, 77, 231, 244, 176, 238, 132, 124, 78, 84, 252, 196, 233, - 11, 119, 96, 135, 61, 226, 19, 114, 72, 225, 15, 154, 129, 208, 157, 8, - 246, 94, 243, 131, 86, 101, 67, 209, 15, 46, 127, 144, 146, 200, 99, 25, - 232, 63, 162, 97, 195, 60, 13, 18, 201, 205, 47, 38, 24, 20, 5, 72, - 37, 221, 193, 84, 162, 0, 120, 97, 10, 128, 37, 166, 91, 146, 135, 66, - 3, 30, 145, 149, 68, 221, 107, 154, 153, 97, 66, 216, 2, 40, 48, 67, - 69, 246, 13, 54, 19, 228, 93, 35, 102, 53, 47, 248, 29, 223, 129, 217, - 82, 254, 10, 84, 59, 99, 67, 142, 43, 182, 117, 55, 22, 119, 23, 61, - 208, 91, 217, 97, 121, 6, 11, 223, 202, 143, 148, 161, 28, 239, 100, 112, - 4, 114, 65, 69, 12, 11, 48, 57, 38, 92, 4, 71, 98, 202, 118, 31, - 22, 210, 52, 93, 99, 28, 231, 180, 96, 8, 38, 123, 39, 181, 169, 217, - 136, 34, 216, 79, 23, 86, 55, 124, 89, 102, 111, 43, 148, 110, 57, 14, - 136, 198, 144, 0, 6, 238, 53, 135, 72, 223, 169, 235, 4, 77, 114, 160, - 114, 73, 89, 47, 41, 62, 177, 81, 243, 33, 161, 93, 156, 218, 45, 124, - 191, 109, 179, 155, 225, 203, 152, 99, 47, 253, 114, 22, 72, 226, 203, 219, - 47, 110, 104, 200, 56, 144, 73, 196, 106, 216, 151, 49, 2, 92, 4, 231, - 158, 73, 236, 44, 134, 0, 32, 232, 126, 70, 134, 22, 152, 80, 89, 97, - 213, 119, 239, 195, 230, 19, 39, 108, 61, 121, 130, 96, 190, 84, 228, 110, - 29, 216, 197, 104, 50, 155, 14, 39, 118, 33, 240, 232, 99, 165, 71, 46, - 7, 248, 109, 68, 147, 183, 39, 83, 164, 54, 248, 125, 126, 57, 169, 138, - 107, 200, 83, 84, 213, 254, 135, 195, 146, 62, 44, 191, 84, 117, 98, 143, - 240, 164, 2, 148, 221, 78, 233, 2, 39, 52, 125, 67, 87, 111, 48, 45, - 136, 37, 111, 151, 190, 161, 235, 55, 45, 104, 152, 4, 162, 1, 26, 102, - 199, 196, 81, 182, 8, 54, 25, 178, 6, 192, 184, 17, 185, 204, 48, 12, - 253, 137, 213, 146, 48, 109, 145, 37, 220, 234, 48, 168, 23, 188, 224, 66, - 161, 1, 251, 94, 182, 243, 79, 223, 224, 211, 81, 160, 85, 189, 135, 109, - 96, 33, 222, 183, 139, 44, 201, 106, 152, 130, 232, 6, 11, 50, 142, 241, - 141, 173, 245, 161, 189, 11, 254, 85, 205, 2, 97, 105, 147, 218, 176, 68, - 255, 65, 154, 14, 4, 189, 7, 98, 120, 74, 135, 171, 89, 96, 242, 204, - 169, 30, 126, 103, 23, 194, 164, 34, 175, 49, 5, 166, 2, 190, 101, 86, - 63, 241, 35, 4, 6, 87, 84, 150, 168, 112, 114, 3, 95, 93, 127, 115, - 33, 78, 85, 42, 124, 200, 247, 90, 222, 12, 212, 32, 66, 95, 103, 36, - 92, 143, 69, 92, 163, 219, 123, 198, 119, 18, 3, 146, 15, 69, 241, 92, - 176, 43, 101, 195, 32, 216, 21, 67, 151, 215, 101, 246, 165, 100, 40, 12, - 127, 245, 178, 113, 248, 162, 90, 14, 221, 249, 194, 55, 105, 174, 134, 106, - 94, 199, 220, 25, 178, 74, 142, 231, 85, 120, 234, 42, 76, 67, 231, 52, - 231, 247, 219, 53, 253, 126, 229, 54, 115, 196, 78, 246, 199, 101, 187, 77, - 153, 51, 112, 169, 30, 131, 117, 210, 212, 167, 172, 155, 137, 140, 14, 83, - 163, 67, 222, 43, 220, 128, 150, 246, 207, 53, 248, 249, 185, 198, 78, 244, - 75, 10, 177, 225, 161, 113, 35, 124, 51, 181, 237, 207, 86, 77, 104, 11, - 160, 111, 200, 149, 81, 217, 116, 155, 209, 130, 76, 241, 196, 148, 42, 39, - 216, 97, 49, 187, 194, 243, 191, 251, 24, 114, 4, 223, 110, 58, 186, 38, - 160, 232, 162, 6, 131, 5, 99, 21, 55, 34, 19, 47, 226, 48, 56, 106, - 52, 200, 151, 31, 246, 183, 219, 116, 190, 228, 165, 231, 220, 95, 165, 11, - 52, 183, 28, 140, 207, 206, 107, 118, 13, 106, 193, 237, 202, 119, 97, 195, - 194, 245, 65, 122, 222, 173, 53, 191, 73, 123, 131, 249, 25, 84, 125, 14, - 205, 154, 137, 99, 22, 186, 119, 249, 47, 161, 63, 130, 28, 45, 30, 73, - 97, 250, 120, 91, 84, 169, 114, 49, 130, 170, 28, 119, 159, 146, 133, 201, - 8, 141, 118, 175, 137, 208, 122, 156, 1, 232, 149, 69, 174, 156, 130, 219, - 167, 1, 141, 253, 106, 173, 11, 242, 150, 117, 144, 11, 223, 57, 47, 177, - 143, 164, 233, 130, 5, 114, 106, 191, 101, 53, 163, 152, 130, 218, 61, 250, - 134, 108, 107, 135, 134, 252, 93, 179, 189, 83, 152, 122, 186, 121, 202, 39, - 231, 121, 150, 149, 135, 88, 191, 194, 252, 235, 236, 76, 78, 7, 52, 152, - 95, 119, 229, 175, 218, 230, 199, 82, 112, 227, 22, 244, 47, 240, 29, 113, - 73, 51, 121, 26, 159, 25, 183, 136, 224, 253, 156, 195, 3, 25, 169, 238, - 19, 220, 122, 64, 6, 44, 47, 227, 156, 0, 118, 210, 241, 146, 192, 15, - 96, 223, 209, 217, 206, 109, 175, 227, 63, 63, 178, 91, 239, 51, 137, 230, - 78, 145, 173, 158, 252, 191, 81, 188, 20, 169, 179, 129, 192, 21, 179, 122, - 147, 193, 21, 1, 113, 154, 241, 63, 60, 7, 103, 6, 241, 153, 52, 1, - 188, 191, 141, 121, 53, 226, 176, 145, 102, 45, 114, 187, 13, 23, 163, 18, - 96, 25, 141, 198, 201, 109, 171, 30, 120, 245, 219, 167, 97, 35, 247, 166, - 88, 177, 174, 163, 19, 17, 230, 73, 147, 75, 40, 155, 65, 162, 116, 13, - 32, 20, 116, 101, 201, 185, 162, 177, 109, 173, 56, 176, 226, 252, 24, 147, - 81, 128, 94, 96, 217, 152, 8, 136, 194, 126, 133, 94, 162, 163, 219, 236, - 107, 24, 156, 86, 30, 76, 246, 44, 131, 102, 154, 67, 123, 150, 31, 184, - 115, 179, 55, 153, 235, 192, 237, 176, 57, 44, 200, 248, 122, 114, 213, 139, - 226, 235, 111, 115, 248, 250, 249, 116, 50, 238, 211, 68, 24, 31, 134, 207, - 58, 141, 230, 89, 54, 11, 158, 218, 206, 138, 105, 70, 24, 170, 178, 231, - 102, 55, 220, 204, 13, 234, 45, 208, 50, 183, 124, 152, 18, 229, 208, 110, - 93, 101, 7, 172, 214, 36, 45, 95, 224, 90, 203, 105, 15, 67, 66, 32, - 226, 125, 182, 218, 154, 187, 246, 2, 119, 131, 163, 208, 56, 177, 111, 31, - 206, 134, 74, 191, 101, 111, 90, 153, 205, 221, 120, 129, 44, 237, 225, 108, - 92, 90, 117, 165, 186, 101, 15, 101, 34, 157, 38, 105, 27, 229, 75, 144, - 191, 14, 101, 199, 49, 118, 30, 246, 179, 91, 188, 134, 30, 54, 190, 193, - 132, 150, 29, 188, 128, 167, 217, 151, 2, 227, 37, 104, 188, 122, 169, 55, - 109, 124, 131, 189, 193, 151, 110, 241, 37, 212, 100, 194, 146, 201, 79, 97, - 201, 106, 73, 42, 231, 153, 137, 112, 15, 246, 146, 121, 32, 183, 145, 28, - 141, 203, 89, 51, 137, 60, 157, 102, 189, 238, 188, 68, 44, 92, 7, 223, - 69, 188, 221, 70, 81, 133, 119, 81, 194, 92, 100, 62, 148, 92, 187, 178, - 132, 200, 117, 244, 87, 239, 58, 71, 168, 182, 253, 114, 159, 91, 190, 106, - 235, 125, 97, 144, 218, 210, 16, 255, 190, 9, 156, 254, 42, 200, 84, 234, - 168, 77, 148, 13, 209, 41, 91, 8, 217, 194, 66, 57, 70, 86, 10, 131, - 45, 131, 4, 149, 83, 114, 183, 208, 27, 133, 112, 89, 40, 25, 63, 72, - 89, 96, 70, 17, 130, 180, 45, 183, 8, 98, 189, 55, 151, 77, 75, 197, - 124, 136, 137, 64, 125, 76, 201, 98, 195, 202, 91, 122, 187, 22, 234, 23, - 81, 143, 97, 207, 91, 194, 72, 90, 130, 203, 9, 152, 221, 9, 145, 91, - 136, 88, 47, 254, 196, 233, 72, 131, 185, 104, 107, 145, 242, 84, 9, 196, - 216, 99, 101, 210, 213, 145, 240, 63, 192, 122, 161, 137, 16, 199, 168, 17, - 33, 106, 20, 162, 75, 172, 79, 45, 244, 74, 160, 96, 52, 42, 57, 20, - 177, 106, 244, 115, 140, 89, 35, 159, 6, 50, 164, 10, 191, 233, 97, 126, - 58, 10, 73, 110, 49, 82, 138, 180, 59, 195, 120, 33, 95, 97, 220, 150, - 213, 244, 99, 54, 89, 191, 252, 14, 139, 189, 166, 176, 51, 70, 20, 147, - 41, 71, 49, 153, 22, 163, 152, 76, 57, 138, 201, 84, 70, 49, 129, 162, - 207, 174, 57, 244, 12, 5, 193, 169, 79, 223, 133, 24, 36, 228, 29, 130, - 47, 133, 200, 254, 68, 77, 99, 223, 196, 175, 242, 196, 82, 255, 199, 144, - 52, 233, 87, 161, 251, 189, 43, 219, 192, 61, 128, 11, 2, 81, 248, 228, - 102, 253, 151, 77, 167, 46, 129, 107, 134, 85, 129, 129, 192, 67, 38, 209, - 98, 174, 162, 21, 175, 168, 82, 248, 109, 210, 49, 205, 127, 177, 87, 137, - 103, 159, 77, 221, 143, 231, 170, 165, 144, 229, 16, 243, 55, 8, 210, 21, - 21, 31, 122, 21, 225, 130, 0, 246, 57, 236, 195, 34, 218, 173, 241, 129, - 45, 11, 216, 63, 94, 15, 60, 151, 63, 98, 32, 155, 175, 252, 19, 27, - 79, 179, 125, 21, 121, 231, 199, 122, 131, 147, 112, 170, 161, 69, 254, 249, - 137, 253, 3, 14, 7, 36, 227, 233, 82, 208, 136, 99, 122, 227, 27, 202, - 244, 226, 172, 213, 250, 193, 13, 206, 107, 22, 97, 67, 152, 103, 44, 236, - 122, 83, 60, 14, 18, 13, 13, 173, 43, 72, 170, 157, 166, 223, 124, 255, - 162, 110, 141, 223, 170, 22, 204, 235, 106, 189, 205, 49, 149, 214, 206, 248, - 45, 36, 206, 120, 207, 161, 144, 47, 117, 124, 244, 111, 104, 119, 142, 225, - 223, 112, 185, 195, 246, 240, 158, 54, 15, 78, 139, 227, 217, 55, 240, 26, - 62, 137, 97, 106, 240, 226, 196, 134, 251, 64, 222, 7, 112, 63, 127, 123, - 26, 126, 67, 209, 110, 224, 73, 120, 238, 210, 159, 249, 91, 15, 22, 203, - 11, 89, 133, 95, 172, 193, 23, 21, 216, 182, 174, 130, 43, 176, 63, 169, - 138, 146, 78, 4, 37, 85, 120, 222, 167, 247, 2, 91, 93, 28, 39, 63, - 95, 69, 126, 160, 30, 172, 0, 22, 243, 91, 92, 154, 56, 151, 47, 63, - 111, 46, 73, 36, 203, 13, 194, 131, 99, 128, 247, 251, 207, 100, 113, 34, - 31, 156, 199, 199, 84, 224, 21, 187, 224, 137, 62, 84, 15, 241, 99, 42, - 40, 78, 98, 201, 28, 230, 135, 104, 223, 57, 20, 155, 177, 105, 109, 202, - 42, 149, 15, 203, 85, 50, 76, 102, 137, 0, 135, 59, 205, 159, 119, 253, - 187, 124, 46, 227, 21, 93, 229, 176, 9, 119, 30, 120, 101, 76, 213, 85, - 85, 93, 203, 168, 85, 161, 12, 250, 185, 19, 160, 178, 154, 25, 68, 208, - 56, 244, 169, 80, 137, 19, 164, 141, 212, 58, 226, 27, 228, 106, 60, 31, - 92, 104, 229, 37, 8, 96, 22, 67, 31, 50, 204, 115, 89, 150, 100, 173, - 163, 28, 59, 50, 30, 196, 125, 112, 136, 120, 131, 50, 56, 52, 190, 221, - 54, 112, 200, 114, 15, 112, 204, 167, 38, 170, 154, 101, 10, 17, 118, 237, - 54, 136, 211, 250, 218, 171, 57, 211, 26, 48, 234, 244, 131, 81, 199, 230, - 53, 102, 180, 237, 159, 173, 219, 16, 115, 180, 118, 229, 136, 140, 50, 90, - 165, 57, 58, 70, 25, 229, 57, 70, 49, 138, 164, 183, 129, 123, 27, 186, - 183, 145, 123, 219, 161, 100, 144, 106, 122, 167, 49, 229, 76, 93, 190, 135, - 156, 49, 100, 43, 182, 186, 71, 133, 185, 42, 79, 232, 22, 219, 157, 207, - 19, 185, 197, 150, 171, 60, 133, 22, 243, 19, 252, 95, 77, 169, 161, 49, - 186, 196, 28, 225, 26, 203, 52, 189, 202, 48, 187, 96, 71, 173, 173, 195, - 247, 197, 114, 210, 101, 25, 110, 21, 5, 27, 234, 76, 185, 187, 23, 169, - 244, 177, 215, 129, 86, 241, 128, 190, 225, 162, 153, 244, 221, 29, 253, 108, - 17, 79, 190, 172, 95, 41, 97, 203, 82, 212, 196, 197, 178, 79, 74, 103, - 57, 32, 198, 39, 252, 23, 120, 23, 190, 156, 255, 248, 254, 21, 86, 142, - 48, 224, 101, 136, 75, 21, 136, 253, 5, 69, 176, 170, 77, 67, 45, 200, - 58, 115, 86, 149, 29, 223, 71, 168, 23, 146, 166, 15, 112, 9, 197, 177, - 15, 98, 237, 234, 48, 132, 149, 128, 184, 109, 7, 118, 11, 187, 0, 34, - 186, 27, 217, 31, 151, 8, 129, 47, 44, 38, 129, 112, 5, 190, 248, 210, - 194, 110, 215, 226, 158, 42, 111, 248, 72, 64, 50, 24, 7, 36, 59, 59, - 25, 190, 206, 197, 3, 16, 7, 112, 170, 47, 26, 19, 94, 202, 31, 117, - 130, 216, 223, 25, 195, 214, 88, 123, 1, 186, 106, 149, 155, 249, 115, 197, - 18, 227, 58, 199, 179, 65, 125, 64, 50, 48, 84, 11, 67, 122, 243, 225, - 47, 218, 67, 56, 20, 1, 27, 40, 181, 68, 11, 219, 17, 75, 117, 148, - 76, 47, 22, 144, 148, 5, 202, 166, 67, 135, 235, 100, 52, 18, 150, 12, - 42, 48, 52, 222, 106, 216, 142, 28, 165, 199, 114, 176, 64, 228, 58, 213, - 41, 82, 105, 124, 58, 182, 116, 70, 223, 171, 73, 58, 159, 195, 47, 54, - 149, 173, 72, 42, 23, 143, 97, 190, 219, 38, 43, 95, 106, 31, 220, 60, - 35, 208, 78, 29, 187, 26, 77, 131, 121, 113, 73, 145, 60, 170, 132, 240, - 208, 221, 119, 45, 115, 40, 52, 120, 2, 99, 188, 35, 32, 252, 51, 129, - 225, 209, 238, 50, 252, 123, 84, 64, 243, 168, 28, 128, 106, 32, 111, 215, - 166, 110, 16, 228, 187, 238, 131, 196, 125, 207, 168, 199, 171, 0, 219, 110, - 40, 156, 68, 62, 153, 188, 39, 2, 194, 190, 108, 49, 242, 155, 97, 171, - 211, 182, 72, 143, 188, 181, 223, 192, 207, 155, 173, 125, 73, 162, 225, 24, - 254, 142, 92, 231, 141, 5, 204, 185, 48, 19, 113, 130, 102, 250, 230, 164, - 78, 55, 132, 39, 31, 248, 173, 180, 209, 104, 214, 83, 121, 71, 143, 26, - 141, 119, 78, 120, 96, 53, 141, 200, 23, 94, 192, 161, 47, 224, 215, 164, - 64, 216, 158, 38, 34, 243, 119, 105, 57, 42, 193, 164, 99, 250, 192, 144, - 247, 11, 229, 105, 177, 51, 140, 199, 158, 220, 109, 251, 153, 239, 11, 216, - 121, 58, 205, 195, 4, 216, 119, 219, 242, 35, 208, 6, 83, 170, 194, 178, - 181, 78, 206, 14, 184, 224, 51, 40, 99, 23, 211, 201, 170, 108, 89, 83, - 230, 125, 215, 246, 142, 5, 204, 149, 97, 88, 11, 94, 157, 84, 29, 69, - 65, 120, 104, 113, 114, 123, 141, 21, 42, 59, 96, 34, 207, 61, 45, 9, - 95, 144, 183, 137, 217, 221, 149, 236, 42, 229, 230, 74, 234, 70, 141, 173, - 142, 123, 209, 210, 232, 157, 151, 116, 224, 79, 208, 242, 86, 171, 137, 224, - 194, 30, 10, 124, 132, 82, 199, 78, 77, 205, 155, 201, 117, 61, 240, 129, - 192, 129, 108, 222, 182, 94, 198, 194, 44, 111, 70, 147, 141, 47, 177, 57, - 24, 58, 180, 216, 239, 228, 212, 203, 132, 38, 231, 122, 71, 126, 60, 64, - 241, 99, 122, 29, 253, 98, 68, 48, 2, 99, 242, 101, 188, 3, 99, 13, - 12, 160, 145, 203, 217, 109, 130, 209, 15, 190, 56, 18, 17, 150, 110, 171, - 226, 255, 17, 152, 68, 37, 253, 11, 125, 171, 180, 215, 159, 137, 82, 84, - 209, 215, 199, 226, 21, 165, 131, 65, 22, 169, 72, 120, 143, 168, 40, 4, - 38, 168, 116, 30, 245, 143, 155, 87, 159, 76, 23, 109, 77, 85, 7, 253, - 134, 44, 164, 50, 68, 170, 138, 53, 157, 143, 23, 192, 18, 194, 58, 7, - 154, 158, 27, 98, 42, 187, 43, 158, 142, 111, 112, 36, 230, 6, 190, 161, - 56, 230, 231, 15, 200, 12, 57, 126, 9, 51, 73, 134, 200, 167, 100, 71, - 53, 206, 39, 241, 123, 80, 220, 28, 167, 73, 34, 255, 193, 250, 252, 162, - 5, 230, 70, 111, 12, 163, 67, 150, 140, 54, 247, 131, 227, 132, 19, 109, - 184, 178, 191, 91, 38, 125, 24, 173, 1, 90, 110, 185, 200, 109, 117, 219, - 59, 23, 244, 95, 101, 140, 116, 244, 144, 74, 116, 112, 29, 233, 235, 128, - 101, 30, 204, 23, 253, 108, 151, 14, 178, 5, 200, 152, 222, 28, 90, 130, - 75, 18, 113, 31, 110, 200, 133, 80, 144, 166, 131, 194, 48, 228, 10, 162, - 17, 49, 138, 1, 114, 67, 104, 81, 88, 120, 157, 244, 130, 253, 119, 225, - 97, 126, 224, 80, 25, 168, 138, 161, 117, 210, 167, 5, 63, 88, 66, 82, - 63, 197, 101, 175, 124, 56, 46, 7, 139, 213, 96, 32, 86, 189, 60, 214, - 126, 208, 239, 73, 236, 4, 100, 166, 86, 232, 131, 180, 94, 203, 180, 73, - 59, 35, 149, 78, 105, 236, 225, 22, 191, 59, 80, 124, 224, 203, 165, 74, - 86, 14, 168, 223, 191, 247, 219, 71, 205, 76, 196, 243, 173, 37, 242, 188, - 144, 32, 249, 5, 207, 237, 160, 134, 236, 171, 216, 119, 66, 180, 118, 83, - 246, 154, 250, 186, 147, 247, 10, 239, 114, 19, 183, 249, 29, 9, 61, 102, - 42, 86, 95, 158, 150, 176, 103, 76, 73, 88, 120, 185, 94, 212, 104, 217, - 132, 108, 78, 147, 111, 164, 49, 190, 57, 191, 43, 198, 79, 161, 107, 30, - 56, 221, 3, 160, 79, 218, 162, 160, 141, 150, 158, 100, 72, 102, 178, 41, - 6, 198, 19, 137, 244, 57, 150, 156, 254, 220, 123, 65, 219, 63, 172, 59, - 157, 38, 57, 63, 136, 241, 132, 153, 154, 13, 164, 122, 30, 149, 43, 42, - 88, 132, 161, 80, 81, 126, 230, 89, 107, 66, 181, 171, 155, 99, 157, 27, - 223, 206, 231, 143, 175, 57, 170, 65, 233, 168, 134, 37, 163, 26, 237, 28, - 213, 14, 142, 106, 9, 199, 10, 147, 161, 7, 119, 215, 40, 70, 77, 39, - 218, 53, 138, 184, 135, 80, 81, 25, 47, 104, 99, 59, 49, 223, 68, 142, - 79, 158, 22, 241, 146, 118, 233, 4, 15, 134, 227, 2, 24, 162, 189, 8, - 247, 222, 212, 83, 154, 212, 8, 232, 89, 96, 177, 56, 196, 56, 141, 87, - 130, 12, 24, 37, 138, 250, 51, 61, 124, 208, 84, 186, 86, 120, 16, 10, - 27, 106, 97, 58, 132, 134, 66, 251, 47, 5, 110, 170, 104, 158, 216, 32, - 105, 9, 112, 219, 168, 173, 56, 249, 230, 10, 17, 129, 169, 138, 139, 164, - 35, 247, 121, 249, 45, 137, 115, 43, 63, 27, 28, 67, 126, 68, 200, 179, - 229, 87, 0, 25, 148, 186, 126, 62, 22, 212, 125, 176, 43, 153, 78, 194, - 224, 205, 254, 150, 189, 68, 68, 101, 33, 124, 134, 24, 206, 227, 125, 124, - 239, 156, 122, 78, 71, 227, 181, 201, 39, 169, 124, 194, 254, 36, 233, 147, - 216, 255, 229, 23, 231, 253, 19, 228, 131, 24, 244, 146, 17, 45, 157, 212, - 117, 222, 11, 168, 119, 239, 236, 152, 109, 191, 208, 51, 27, 46, 47, 241, - 15, 140, 73, 147, 210, 129, 11, 133, 221, 5, 46, 173, 230, 217, 17, 220, - 67, 26, 70, 158, 239, 242, 101, 235, 172, 227, 210, 79, 228, 30, 157, 203, - 99, 73, 3, 138, 32, 223, 190, 15, 149, 45, 255, 148, 62, 193, 207, 135, - 127, 64, 215, 20, 62, 129, 200, 13, 194, 227, 17, 30, 129, 34, 72, 26, - 66, 166, 193, 251, 8, 166, 6, 247, 62, 255, 64, 242, 97, 169, 230, 74, - 5, 120, 97, 255, 139, 172, 22, 11, 217, 69, 253, 249, 142, 133, 230, 66, - 70, 50, 76, 114, 247, 240, 13, 245, 150, 11, 211, 144, 18, 132, 24, 44, - 2, 26, 137, 97, 54, 12, 204, 23, 81, 103, 129, 143, 164, 54, 236, 194, - 107, 52, 149, 94, 184, 177, 139, 189, 63, 160, 112, 119, 178, 129, 113, 135, - 156, 54, 101, 251, 48, 20, 162, 75, 214, 140, 216, 60, 82, 118, 80, 195, - 4, 11, 32, 90, 87, 105, 184, 158, 29, 159, 103, 240, 149, 88, 133, 65, - 179, 50, 160, 229, 38, 154, 203, 209, 86, 218, 24, 94, 78, 38, 55, 50, - 184, 136, 97, 194, 222, 121, 202, 250, 143, 144, 126, 143, 98, 159, 109, 13, - 49, 44, 137, 162, 56, 122, 192, 164, 189, 161, 24, 168, 18, 237, 153, 171, - 68, 77, 32, 49, 99, 36, 66, 151, 147, 217, 112, 50, 233, 151, 40, 68, - 164, 83, 186, 249, 164, 83, 173, 24, 225, 184, 90, 248, 85, 132, 248, 85, - 160, 118, 2, 6, 146, 119, 157, 214, 13, 200, 141, 66, 191, 159, 205, 145, - 172, 69, 14, 114, 24, 131, 173, 234, 82, 202, 150, 78, 100, 145, 163, 27, - 166, 183, 40, 72, 114, 0, 223, 11, 122, 44, 145, 123, 210, 161, 240, 86, - 178, 148, 48, 42, 98, 9, 161, 248, 138, 48, 31, 10, 130, 130, 79, 4, - 144, 189, 234, 138, 240, 122, 206, 17, 54, 13, 126, 143, 241, 136, 222, 147, - 208, 117, 172, 233, 104, 137, 172, 61, 200, 230, 114, 142, 157, 159, 70, 255, - 162, 55, 155, 204, 105, 51, 153, 13, 110, 36, 78, 125, 206, 212, 93, 42, - 156, 141, 136, 73, 244, 150, 103, 190, 85, 18, 92, 42, 135, 146, 148, 69, - 82, 200, 48, 158, 2, 133, 57, 242, 97, 44, 124, 86, 67, 85, 53, 79, - 218, 210, 62, 208, 133, 135, 173, 221, 247, 237, 85, 153, 29, 108, 126, 231, - 34, 189, 89, 150, 245, 107, 107, 230, 239, 234, 10, 61, 120, 240, 175, 109, - 96, 140, 216, 180, 28, 154, 248, 11, 36, 208, 51, 128, 5, 187, 12, 58, - 168, 244, 20, 242, 66, 102, 73, 178, 193, 78, 218, 86, 14, 154, 191, 12, - 214, 39, 27, 108, 108, 10, 235, 125, 156, 96, 183, 63, 72, 33, 255, 223, - 37, 56, 135, 182, 55, 255, 108, 45, 199, 91, 170, 198, 123, 131, 245, 124, - 130, 142, 67, 54, 9, 189, 207, 181, 249, 119, 44, 189, 212, 186, 159, 1, - 194, 92, 50, 0, 102, 120, 88, 223, 224, 165, 187, 57, 199, 28, 161, 212, - 45, 234, 62, 194, 125, 71, 32, 203, 77, 255, 187, 205, 189, 148, 10, 52, - 67, 19, 18, 137, 48, 158, 35, 187, 118, 81, 108, 177, 165, 67, 26, 19, - 254, 77, 126, 89, 160, 130, 13, 163, 156, 30, 146, 158, 141, 162, 115, 176, - 118, 12, 149, 105, 25, 3, 195, 182, 125, 240, 115, 109, 30, 196, 115, 47, - 56, 177, 94, 225, 249, 29, 250, 250, 186, 115, 79, 248, 20, 247, 78, 227, - 57, 158, 114, 91, 245, 87, 45, 60, 42, 11, 228, 99, 62, 36, 107, 214, - 223, 215, 3, 109, 252, 218, 240, 210, 6, 52, 154, 243, 122, 133, 188, 169, - 247, 190, 238, 153, 217, 27, 176, 44, 57, 179, 187, 129, 162, 115, 5, 83, - 28, 157, 146, 130, 201, 214, 176, 80, 176, 239, 122, 58, 123, 163, 241, 115, - 237, 0, 100, 53, 165, 71, 162, 64, 79, 133, 145, 116, 157, 142, 181, 28, - 75, 81, 164, 240, 216, 64, 73, 154, 14, 19, 60, 181, 205, 210, 202, 62, - 194, 82, 141, 233, 86, 147, 76, 21, 171, 147, 78, 107, 69, 102, 113, 60, - 36, 85, 1, 234, 67, 152, 79, 150, 179, 222, 64, 82, 77, 230, 150, 37, - 209, 52, 74, 223, 143, 118, 22, 218, 40, 8, 166, 189, 28, 207, 38, 55, - 55, 36, 210, 111, 172, 178, 158, 60, 76, 50, 85, 175, 184, 78, 213, 17, - 163, 253, 136, 226, 60, 206, 52, 91, 147, 203, 188, 65, 254, 78, 26, 78, - 199, 96, 124, 168, 205, 187, 116, 253, 254, 108, 253, 198, 221, 188, 113, 239, - 222, 184, 189, 55, 231, 219, 134, 77, 58, 227, 121, 219, 94, 43, 179, 194, - 123, 160, 148, 239, 182, 167, 247, 94, 199, 93, 109, 183, 182, 135, 116, 145, - 111, 50, 215, 194, 186, 16, 93, 210, 69, 238, 33, 231, 182, 249, 218, 188, - 148, 121, 69, 198, 62, 101, 180, 249, 210, 184, 130, 108, 218, 140, 153, 13, - 190, 15, 17, 230, 9, 141, 151, 198, 35, 251, 140, 6, 252, 103, 219, 232, - 224, 121, 233, 206, 172, 22, 107, 137, 178, 249, 118, 0, 188, 81, 186, 216, - 72, 101, 206, 167, 17, 230, 196, 190, 30, 140, 49, 72, 146, 198, 51, 252, - 108, 205, 51, 92, 228, 27, 23, 171, 83, 154, 199, 145, 105, 53, 0, 72, - 165, 251, 15, 235, 160, 85, 53, 85, 100, 185, 76, 37, 45, 27, 203, 221, - 63, 112, 162, 131, 189, 52, 210, 249, 0, 59, 10, 151, 205, 106, 1, 173, - 150, 72, 108, 117, 228, 246, 90, 101, 7, 181, 12, 91, 136, 71, 88, 196, - 181, 145, 11, 140, 114, 57, 147, 102, 167, 156, 3, 67, 44, 82, 26, 6, - 157, 208, 26, 11, 126, 136, 160, 169, 78, 96, 103, 212, 23, 64, 182, 210, - 73, 31, 25, 247, 41, 31, 149, 170, 225, 125, 43, 159, 20, 24, 52, 169, - 121, 144, 135, 171, 115, 52, 38, 153, 21, 97, 9, 43, 102, 42, 95, 163, - 157, 204, 102, 201, 198, 14, 93, 248, 207, 42, 62, 213, 22, 12, 186, 69, - 89, 188, 188, 135, 218, 81, 97, 129, 83, 114, 168, 57, 122, 19, 223, 159, - 165, 35, 55, 5, 66, 97, 207, 151, 236, 115, 152, 108, 13, 123, 10, 3, - 177, 18, 168, 166, 237, 64, 38, 228, 154, 71, 111, 178, 103, 144, 165, 31, - 233, 12, 8, 214, 96, 131, 218, 23, 132, 40, 51, 193, 201, 252, 194, 33, - 56, 228, 192, 184, 56, 99, 62, 182, 134, 44, 250, 227, 20, 201, 136, 13, - 218, 247, 176, 188, 193, 213, 21, 134, 161, 73, 31, 243, 57, 234, 211, 238, - 227, 110, 238, 124, 59, 82, 231, 219, 70, 11, 232, 80, 188, 98, 70, 101, - 191, 92, 75, 247, 80, 125, 120, 199, 93, 241, 225, 241, 177, 118, 68, 39, - 222, 250, 99, 219, 209, 153, 93, 135, 218, 166, 124, 198, 254, 201, 70, 91, - 21, 7, 100, 47, 38, 23, 179, 235, 75, 27, 254, 133, 155, 222, 101, 111, - 86, 186, 8, 240, 248, 48, 124, 102, 183, 78, 201, 149, 248, 41, 29, 48, - 134, 34, 12, 149, 62, 23, 180, 80, 118, 138, 16, 75, 194, 196, 245, 131, - 247, 240, 196, 153, 10, 15, 161, 154, 138, 121, 71, 112, 171, 139, 225, 100, - 33, 188, 173, 129, 72, 163, 68, 32, 29, 53, 115, 17, 196, 77, 235, 24, - 124, 209, 134, 23, 13, 63, 237, 253, 231, 88, 213, 17, 71, 98, 66, 245, - 172, 7, 254, 211, 157, 142, 233, 1, 170, 106, 90, 133, 150, 227, 20, 23, - 58, 35, 57, 0, 146, 244, 205, 72, 188, 254, 83, 211, 8, 166, 164, 47, - 37, 192, 8, 210, 130, 142, 120, 90, 61, 231, 149, 7, 195, 226, 180, 12, - 165, 95, 143, 15, 129, 105, 30, 67, 196, 103, 7, 70, 128, 252, 127, 77, - 65, 119, 199, 4, 169, 14, 141, 151, 163, 203, 193, 236, 98, 114, 37, 146, - 114, 113, 221, 69, 87, 52, 183, 197, 249, 9, 130, 151, 139, 168, 167, 237, - 65, 27, 102, 138, 48, 124, 71, 8, 187, 229, 55, 236, 171, 217, 100, 36, - 2, 114, 45, 48, 175, 2, 243, 218, 99, 110, 115, 223, 155, 217, 220, 174, - 255, 212, 202, 119, 64, 10, 37, 89, 28, 115, 209, 110, 52, 79, 228, 253, - 172, 164, 5, 187, 13, 194, 216, 210, 131, 81, 122, 126, 136, 129, 229, 219, - 90, 99, 233, 144, 66, 254, 252, 25, 200, 167, 160, 6, 95, 252, 15, 77, - 212, 161, 7, 13, 25, 100, 24, 104, 153, 191, 53, 65, 103, 198, 167, 177, - 243, 3, 165, 216, 8, 90, 170, 82, 201, 32, 241, 7, 50, 72, 204, 116, - 15, 119, 203, 31, 60, 103, 188, 149, 115, 203, 90, 205, 126, 44, 28, 251, - 73, 101, 219, 111, 146, 227, 36, 221, 100, 67, 48, 172, 237, 64, 160, 89, - 211, 237, 70, 239, 164, 129, 173, 176, 60, 219, 109, 151, 128, 52, 229, 29, - 49, 148, 237, 182, 181, 41, 200, 210, 107, 10, 147, 145, 204, 250, 104, 139, - 226, 163, 39, 185, 14, 233, 170, 236, 167, 238, 129, 33, 68, 160, 2, 232, - 86, 51, 104, 135, 93, 30, 138, 20, 8, 61, 118, 227, 114, 54, 72, 62, - 240, 174, 78, 131, 144, 10, 111, 241, 0, 161, 61, 66, 77, 111, 50, 21, - 233, 88, 178, 92, 11, 225, 117, 152, 205, 154, 79, 144, 126, 181, 220, 141, - 53, 155, 172, 230, 212, 10, 103, 140, 26, 6, 178, 150, 184, 195, 183, 35, - 42, 165, 126, 127, 240, 234, 251, 209, 117, 212, 63, 16, 248, 8, 195, 109, - 195, 232, 4, 148, 106, 220, 24, 30, 102, 107, 43, 226, 250, 51, 121, 97, - 132, 186, 158, 24, 33, 190, 216, 80, 103, 125, 119, 254, 18, 200, 131, 253, - 62, 234, 235, 0, 27, 74, 70, 99, 223, 57, 133, 99, 194, 69, 97, 86, - 13, 191, 163, 178, 218, 77, 198, 217, 97, 40, 158, 182, 37, 167, 124, 120, - 232, 244, 97, 189, 245, 213, 164, 87, 40, 177, 80, 156, 193, 3, 25, 60, - 238, 163, 51, 86, 216, 172, 22, 8, 212, 120, 155, 210, 238, 113, 33, 237, - 117, 178, 169, 51, 101, 197, 51, 131, 207, 30, 253, 103, 75, 12, 212, 16, - 176, 155, 139, 183, 85, 241, 85, 54, 2, 250, 227, 254, 75, 197, 43, 116, - 48, 77, 38, 53, 124, 198, 3, 212, 13, 228, 66, 62, 231, 230, 44, 110, - 69, 76, 190, 154, 44, 242, 79, 178, 72, 142, 184, 87, 115, 237, 255, 76, - 237, 191, 15, 19, 120, 132, 145, 249, 54, 19, 140, 209, 247, 227, 16, 164, - 177, 255, 72, 93, 251, 167, 37, 198, 238, 219, 36, 248, 215, 181, 255, 240, - 234, 213, 127, 31, 132, 126, 208, 217, 21, 220, 58, 59, 114, 226, 200, 57, - 59, 112, 198, 217, 178, 28, 58, 178, 161, 171, 162, 110, 249, 249, 113, 129, - 178, 91, 37, 179, 86, 5, 137, 146, 197, 248, 65, 115, 186, 18, 75, 165, - 29, 211, 148, 221, 148, 240, 32, 190, 143, 1, 101, 85, 143, 128, 188, 211, - 177, 96, 131, 79, 38, 101, 159, 52, 215, 161, 187, 121, 31, 190, 243, 208, - 119, 170, 64, 71, 47, 145, 251, 23, 169, 194, 79, 236, 190, 135, 193, 110, - 90, 172, 131, 105, 93, 146, 226, 120, 150, 220, 8, 184, 29, 58, 135, 100, - 171, 75, 98, 255, 141, 231, 242, 177, 69, 122, 93, 220, 244, 96, 2, 8, - 56, 141, 0, 250, 211, 219, 198, 150, 223, 36, 194, 10, 207, 94, 58, 170, - 133, 146, 250, 72, 41, 226, 67, 121, 68, 213, 249, 48, 153, 77, 7, 40, - 237, 155, 71, 33, 185, 91, 23, 33, 15, 5, 156, 4, 200, 173, 2, 160, - 42, 103, 81, 243, 163, 40, 169, 4, 32, 66, 199, 29, 146, 0, 135, 120, - 124, 57, 156, 244, 62, 136, 201, 153, 11, 176, 90, 99, 95, 60, 192, 58, - 15, 84, 24, 76, 189, 37, 195, 150, 59, 24, 39, 151, 55, 3, 46, 193, - 19, 211, 203, 5, 236, 58, 77, 33, 179, 68, 63, 131, 94, 85, 37, 116, - 202, 81, 137, 124, 191, 244, 249, 37, 198, 12, 237, 154, 217, 92, 201, 198, - 51, 255, 106, 14, 160, 36, 47, 148, 219, 144, 2, 46, 146, 177, 128, 155, - 220, 16, 138, 49, 53, 144, 78, 151, 168, 113, 116, 213, 191, 65, 245, 107, - 63, 57, 205, 144, 39, 16, 93, 48, 46, 242, 116, 194, 138, 3, 1, 193, - 204, 177, 1, 50, 224, 198, 217, 72, 13, 133, 70, 24, 45, 200, 78, 173, - 128, 36, 195, 117, 112, 198, 54, 196, 23, 100, 195, 140, 39, 97, 153, 19, - 179, 170, 246, 93, 236, 217, 192, 124, 233, 162, 193, 115, 13, 139, 150, 55, - 220, 250, 145, 199, 55, 191, 202, 84, 79, 82, 58, 44, 18, 242, 163, 94, - 112, 111, 95, 255, 225, 96, 238, 230, 79, 32, 168, 90, 224, 153, 84, 233, - 6, 52, 171, 128, 203, 210, 11, 50, 211, 165, 12, 62, 242, 120, 144, 0, - 59, 187, 32, 68, 90, 160, 61, 112, 71, 64, 180, 179, 229, 248, 122, 224, - 125, 88, 46, 22, 201, 78, 72, 99, 53, 39, 64, 210, 142, 233, 52, 79, - 77, 11, 25, 121, 42, 232, 53, 191, 77, 103, 127, 188, 118, 3, 182, 101, - 238, 223, 72, 67, 230, 126, 34, 52, 47, 154, 74, 17, 252, 113, 166, 221, - 234, 3, 48, 103, 164, 74, 254, 19, 100, 44, 146, 139, 186, 195, 219, 53, - 58, 182, 27, 110, 60, 21, 200, 40, 236, 255, 158, 96, 36, 118, 32, 206, - 30, 74, 194, 240, 79, 150, 25, 218, 18, 68, 16, 249, 51, 120, 230, 183, - 67, 246, 29, 102, 10, 165, 124, 82, 225, 57, 86, 105, 68, 20, 146, 31, - 26, 174, 195, 139, 171, 217, 224, 35, 238, 243, 90, 196, 198, 3, 90, 189, - 90, 48, 83, 97, 177, 192, 136, 76, 108, 84, 244, 224, 72, 32, 224, 149, - 141, 197, 160, 30, 74, 132, 65, 170, 160, 10, 186, 198, 240, 169, 101, 214, - 175, 182, 32, 174, 79, 135, 115, 120, 160, 30, 185, 32, 13, 153, 183, 168, - 27, 21, 184, 255, 151, 132, 134, 37, 149, 183, 179, 219, 82, 163, 124, 82, - 148, 104, 5, 139, 93, 83, 74, 13, 169, 134, 171, 229, 208, 131, 216, 78, - 210, 12, 221, 162, 156, 211, 77, 54, 232, 71, 44, 184, 96, 116, 15, 245, - 49, 188, 184, 142, 157, 162, 3, 129, 140, 207, 41, 80, 75, 239, 102, 50, - 71, 131, 58, 35, 232, 9, 217, 242, 21, 90, 134, 47, 180, 51, 21, 10, - 188, 116, 16, 59, 48, 28, 19, 204, 95, 25, 164, 144, 58, 243, 64, 134, - 105, 64, 72, 113, 165, 168, 203, 89, 44, 33, 18, 146, 148, 112, 39, 208, - 117, 145, 45, 91, 46, 38, 24, 119, 133, 169, 72, 127, 0, 227, 52, 194, - 32, 40, 123, 135, 88, 57, 242, 115, 167, 81, 102, 189, 229, 235, 74, 158, - 52, 212, 174, 38, 136, 203, 165, 15, 113, 106, 118, 43, 59, 161, 152, 161, - 5, 127, 40, 90, 170, 30, 105, 52, 185, 200, 77, 188, 97, 103, 119, 148, - 225, 154, 186, 134, 165, 157, 159, 229, 159, 42, 230, 24, 109, 141, 20, 231, - 132, 55, 90, 81, 166, 205, 181, 144, 22, 73, 172, 98, 61, 26, 25, 36, - 196, 40, 135, 54, 87, 119, 58, 113, 236, 55, 16, 109, 16, 71, 125, 91, - 219, 29, 92, 11, 45, 181, 228, 137, 42, 74, 164, 29, 124, 17, 69, 73, - 84, 172, 154, 176, 197, 24, 33, 139, 14, 123, 182, 214, 149, 68, 10, 38, - 56, 82, 133, 242, 187, 58, 116, 174, 26, 4, 194, 35, 96, 116, 249, 94, - 136, 59, 17, 130, 206, 8, 75, 177, 16, 237, 249, 240, 0, 190, 96, 208, - 7, 253, 204, 248, 29, 40, 71, 131, 123, 39, 98, 40, 155, 129, 247, 204, - 45, 11, 192, 33, 20, 22, 202, 110, 79, 130, 21, 248, 229, 7, 0, 76, - 103, 96, 37, 38, 41, 43, 152, 244, 247, 137, 112, 95, 120, 108, 67, 183, - 10, 51, 157, 114, 154, 105, 251, 80, 67, 189, 76, 15, 108, 46, 65, 206, - 70, 230, 35, 210, 213, 29, 196, 241, 129, 89, 213, 1, 250, 89, 49, 76, - 166, 8, 79, 197, 78, 141, 233, 194, 12, 207, 68, 75, 228, 32, 177, 97, - 115, 91, 66, 77, 34, 168, 155, 81, 73, 33, 200, 193, 220, 88, 110, 211, - 205, 44, 25, 165, 125, 97, 72, 32, 118, 218, 18, 54, 126, 47, 68, 49, - 18, 104, 116, 127, 212, 198, 104, 118, 170, 154, 65, 204, 76, 138, 107, 229, - 39, 169, 16, 127, 174, 163, 226, 207, 101, 1, 30, 149, 48, 195, 159, 34, - 50, 242, 117, 16, 64, 98, 60, 97, 70, 115, 189, 186, 19, 53, 98, 243, - 16, 35, 187, 195, 168, 176, 50, 210, 156, 206, 192, 9, 47, 25, 230, 157, - 167, 22, 34, 108, 29, 194, 205, 212, 216, 163, 63, 195, 57, 16, 118, 129, - 157, 193, 124, 176, 251, 240, 19, 190, 171, 57, 167, 53, 184, 70, 136, 135, - 126, 51, 36, 132, 150, 53, 84, 211, 15, 49, 250, 16, 94, 183, 196, 117, - 167, 41, 158, 232, 155, 22, 223, 28, 53, 211, 147, 154, 117, 216, 182, 131, - 35, 21, 74, 212, 250, 34, 13, 113, 55, 102, 83, 8, 56, 193, 104, 12, - 63, 53, 111, 75, 26, 100, 132, 44, 253, 82, 109, 114, 239, 178, 173, 130, - 251, 92, 187, 56, 71, 54, 161, 188, 109, 36, 25, 10, 120, 227, 219, 28, - 9, 33, 5, 218, 227, 150, 14, 125, 91, 248, 93, 8, 52, 47, 161, 133, - 55, 137, 130, 22, 136, 243, 75, 105, 46, 160, 210, 128, 109, 117, 139, 48, - 160, 225, 22, 132, 217, 166, 36, 211, 40, 104, 3, 141, 158, 15, 118, 189, - 18, 109, 17, 210, 74, 191, 18, 17, 104, 59, 212, 226, 204, 7, 158, 51, - 159, 111, 179, 171, 23, 216, 36, 164, 192, 243, 121, 203, 57, 109, 58, 253, - 185, 4, 21, 11, 60, 140, 0, 203, 50, 244, 236, 86, 233, 221, 138, 65, - 233, 85, 192, 83, 233, 225, 49, 16, 130, 0, 82, 222, 57, 124, 214, 35, - 14, 67, 129, 205, 27, 204, 40, 194, 68, 16, 195, 166, 8, 252, 106, 255, - 240, 50, 233, 125, 192, 139, 157, 81, 57, 85, 193, 66, 196, 80, 66, 200, - 158, 250, 127, 20, 24, 184, 29, 85, 108, 123, 161, 233, 176, 251, 160, 27, - 22, 58, 198, 149, 240, 209, 19, 244, 77, 184, 218, 80, 7, 21, 35, 250, - 248, 8, 28, 236, 37, 104, 198, 224, 80, 41, 59, 163, 110, 252, 40, 235, - 87, 221, 103, 135, 118, 16, 169, 36, 232, 224, 46, 130, 110, 28, 111, 125, - 233, 0, 22, 28, 247, 132, 36, 20, 25, 143, 5, 241, 250, 24, 213, 17, - 56, 94, 88, 57, 232, 35, 169, 6, 208, 69, 69, 46, 236, 85, 27, 60, - 154, 74, 44, 99, 96, 13, 133, 86, 73, 140, 138, 80, 197, 168, 8, 229, - 142, 16, 190, 140, 67, 185, 53, 236, 27, 163, 66, 14, 183, 17, 165, 66, - 37, 101, 194, 82, 168, 17, 47, 12, 180, 180, 106, 203, 8, 36, 236, 79, - 154, 7, 196, 166, 160, 19, 225, 206, 160, 19, 44, 184, 240, 214, 56, 153, - 38, 120, 190, 206, 154, 170, 39, 168, 15, 67, 181, 57, 158, 178, 21, 208, - 11, 25, 220, 218, 133, 193, 242, 34, 62, 61, 232, 9, 103, 188, 10, 189, - 239, 124, 3, 125, 92, 163, 55, 214, 29, 106, 15, 47, 200, 156, 156, 206, - 219, 220, 11, 14, 219, 144, 63, 124, 195, 55, 134, 131, 5, 230, 63, 96, - 247, 159, 245, 1, 231, 60, 176, 85, 44, 70, 243, 139, 28, 165, 189, 217, - 196, 227, 90, 88, 167, 69, 246, 27, 36, 223, 78, 70, 233, 93, 206, 30, - 135, 92, 136, 56, 179, 205, 117, 205, 81, 182, 80, 64, 152, 164, 255, 69, - 149, 47, 86, 41, 168, 7, 204, 192, 148, 61, 201, 50, 24, 239, 34, 176, - 150, 169, 13, 182, 181, 58, 120, 184, 88, 76, 95, 28, 30, 174, 86, 171, - 118, 10, 123, 81, 59, 29, 29, 78, 151, 151, 135, 32, 91, 30, 134, 126, - 16, 28, 94, 95, 143, 46, 102, 211, 241, 97, 245, 247, 195, 78, 66, 34, - 80, 6, 46, 251, 42, 33, 5, 150, 28, 158, 228, 63, 11, 49, 0, 80, - 132, 199, 170, 153, 113, 143, 66, 76, 245, 173, 220, 100, 24, 43, 31, 11, - 55, 204, 232, 156, 96, 123, 154, 57, 194, 50, 38, 197, 9, 214, 176, 237, - 152, 51, 33, 70, 147, 65, 136, 203, 198, 190, 92, 104, 200, 28, 251, 203, - 157, 130, 32, 167, 219, 8, 56, 61, 95, 142, 156, 83, 58, 237, 130, 1, - 153, 209, 229, 237, 86, 35, 77, 143, 87, 59, 192, 172, 25, 200, 122, 60, - 44, 203, 194, 27, 221, 208, 117, 66, 3, 235, 122, 190, 229, 250, 154, 176, - 121, 141, 87, 77, 103, 60, 60, 172, 175, 154, 67, 216, 151, 20, 172, 53, - 164, 159, 174, 126, 249, 5, 30, 157, 14, 183, 69, 139, 9, 237, 237, 160, - 189, 218, 218, 118, 215, 237, 186, 247, 43, 239, 8, 15, 120, 240, 47, 158, - 176, 92, 226, 249, 210, 152, 142, 142, 44, 40, 212, 133, 18, 93, 62, 29, - 131, 86, 92, 245, 218, 8, 252, 144, 9, 85, 217, 110, 183, 183, 18, 223, - 248, 190, 190, 242, 56, 58, 108, 227, 16, 122, 114, 95, 31, 122, 124, 174, - 70, 183, 10, 249, 24, 163, 37, 144, 29, 170, 112, 62, 176, 117, 69, 50, - 122, 58, 197, 129, 194, 64, 18, 197, 174, 32, 154, 216, 213, 194, 236, 17, - 29, 169, 221, 123, 211, 20, 170, 132, 63, 150, 142, 24, 82, 95, 61, 197, - 237, 27, 207, 217, 234, 203, 151, 80, 94, 163, 73, 185, 144, 124, 174, 240, - 28, 81, 26, 101, 61, 169, 15, 75, 115, 250, 156, 119, 88, 204, 251, 245, - 215, 85, 239, 232, 210, 115, 47, 183, 230, 104, 109, 221, 155, 204, 201, 227, - 152, 156, 137, 3, 138, 230, 46, 130, 131, 27, 241, 220, 243, 150, 187, 158, - 28, 49, 99, 77, 160, 19, 50, 208, 82, 92, 25, 91, 113, 18, 6, 43, - 19, 59, 175, 239, 196, 2, 17, 70, 188, 197, 117, 156, 220, 94, 195, 50, - 76, 232, 8, 208, 65, 196, 49, 21, 248, 222, 185, 167, 133, 189, 61, 68, - 140, 200, 91, 23, 254, 31, 144, 20, 42, 242, 169, 165, 158, 183, 116, 41, - 167, 174, 89, 160, 226, 42, 66, 155, 85, 33, 229, 177, 171, 37, 56, 175, - 198, 168, 46, 61, 119, 251, 124, 34, 45, 149, 69, 85, 112, 196, 121, 245, - 144, 12, 20, 83, 169, 30, 162, 64, 91, 232, 12, 42, 163, 228, 234, 131, - 127, 150, 121, 179, 174, 191, 123, 144, 90, 119, 23, 196, 245, 177, 2, 177, - 150, 163, 165, 116, 74, 90, 195, 91, 197, 3, 50, 185, 238, 50, 199, 114, - 204, 255, 42, 167, 178, 27, 0, 81, 15, 66, 171, 122, 170, 31, 32, 227, - 89, 48, 106, 63, 23, 113, 75, 163, 81, 31, 103, 193, 168, 25, 134, 218, - 8, 199, 17, 100, 21, 82, 213, 123, 66, 157, 35, 213, 235, 93, 225, 161, - 201, 46, 98, 79, 71, 140, 61, 29, 85, 98, 79, 107, 228, 233, 206, 218, - 233, 104, 228, 233, 60, 186, 116, 254, 176, 176, 24, 218, 131, 247, 162, 66, - 28, 45, 220, 55, 34, 180, 64, 174, 192, 145, 86, 1, 174, 202, 13, 48, - 68, 184, 171, 38, 163, 67, 53, 120, 63, 146, 17, 175, 138, 175, 132, 234, - 149, 97, 211, 9, 197, 43, 225, 174, 32, 91, 89, 184, 103, 86, 138, 21, - 33, 152, 35, 55, 212, 113, 157, 238, 131, 150, 106, 22, 53, 254, 144, 241, - 174, 169, 59, 174, 122, 10, 45, 224, 134, 30, 74, 32, 236, 128, 245, 111, - 22, 217, 40, 17, 132, 135, 27, 146, 25, 72, 96, 183, 138, 232, 127, 55, - 201, 229, 224, 230, 226, 234, 154, 240, 27, 138, 80, 128, 15, 33, 232, 218, - 70, 28, 1, 104, 125, 139, 102, 148, 44, 18, 230, 195, 4, 6, 67, 184, - 10, 121, 170, 64, 51, 127, 96, 81, 228, 42, 140, 71, 160, 205, 64, 216, - 140, 184, 101, 222, 15, 183, 166, 73, 253, 40, 153, 182, 101, 113, 218, 48, - 133, 70, 163, 205, 24, 135, 79, 201, 196, 56, 194, 114, 158, 242, 85, 182, - 4, 222, 100, 149, 236, 154, 109, 18, 89, 62, 163, 81, 137, 137, 62, 140, - 208, 165, 109, 187, 214, 148, 176, 192, 168, 122, 81, 40, 192, 214, 109, 33, - 213, 4, 253, 101, 205, 72, 32, 243, 22, 82, 77, 72, 223, 181, 46, 51, - 147, 18, 8, 64, 204, 50, 120, 94, 188, 38, 104, 38, 91, 192, 244, 186, - 70, 214, 44, 40, 175, 200, 26, 184, 182, 0, 231, 117, 211, 6, 163, 86, - 78, 25, 173, 26, 70, 68, 65, 90, 27, 81, 227, 16, 133, 252, 168, 137, - 218, 223, 41, 145, 17, 70, 66, 211, 96, 214, 188, 130, 81, 159, 64, 97, - 165, 120, 155, 226, 67, 119, 126, 193, 0, 159, 102, 198, 200, 153, 10, 184, - 219, 60, 176, 52, 91, 17, 41, 164, 59, 113, 149, 47, 181, 139, 207, 40, - 36, 73, 38, 164, 92, 9, 187, 148, 221, 135, 47, 30, 162, 203, 85, 206, - 190, 90, 192, 140, 12, 1, 147, 181, 140, 40, 98, 6, 42, 34, 32, 29, - 183, 17, 209, 109, 139, 208, 63, 108, 181, 148, 71, 204, 87, 46, 76, 228, - 70, 77, 71, 115, 168, 183, 166, 101, 182, 55, 42, 108, 248, 255, 27, 42, - 236, 63, 0, 10, 54, 131, 0, 107, 128, 191, 42, 136, 216, 44, 10, 108, - 45, 107, 31, 162, 180, 96, 139, 219, 47, 142, 116, 179, 152, 44, 146, 27, - 20, 183, 82, 113, 188, 244, 219, 67, 221, 200, 94, 117, 124, 75, 119, 240, - 51, 65, 109, 170, 186, 245, 88, 84, 27, 133, 139, 147, 197, 182, 89, 142, - 201, 74, 0, 218, 153, 69, 158, 74, 70, 240, 185, 45, 178, 96, 55, 185, - 83, 31, 110, 180, 44, 128, 76, 113, 31, 53, 220, 92, 69, 28, 22, 44, - 141, 171, 198, 151, 172, 99, 34, 187, 37, 171, 196, 104, 130, 65, 215, 238, - 45, 23, 172, 199, 177, 116, 103, 140, 99, 202, 176, 58, 222, 85, 121, 15, - 42, 64, 167, 92, 155, 27, 44, 21, 215, 134, 169, 113, 65, 107, 13, 91, - 63, 233, 168, 240, 100, 189, 109, 203, 48, 242, 48, 240, 194, 88, 139, 12, - 142, 35, 109, 168, 9, 223, 69, 147, 108, 200, 61, 73, 7, 115, 194, 146, - 104, 227, 197, 4, 164, 243, 219, 65, 225, 180, 174, 106, 238, 118, 79, 157, - 40, 76, 88, 27, 9, 4, 142, 71, 125, 46, 230, 145, 151, 116, 35, 39, - 179, 146, 207, 156, 90, 217, 207, 142, 91, 62, 195, 122, 28, 74, 113, 73, - 162, 220, 164, 135, 28, 125, 166, 196, 105, 167, 116, 8, 178, 11, 0, 79, - 50, 4, 195, 110, 120, 133, 203, 181, 16, 229, 215, 66, 133, 239, 183, 6, - 90, 108, 93, 33, 111, 201, 236, 180, 111, 122, 246, 136, 190, 33, 55, 140, - 144, 100, 104, 8, 248, 114, 203, 97, 243, 72, 238, 198, 4, 96, 133, 249, - 213, 86, 44, 239, 91, 28, 199, 204, 56, 238, 181, 15, 129, 21, 160, 92, - 187, 112, 22, 111, 147, 241, 237, 77, 58, 88, 228, 173, 89, 5, 20, 193, - 100, 214, 55, 34, 218, 255, 2, 108, 224, 47, 48, 65, 91, 55, 89, 167, - 24, 70, 106, 13, 183, 27, 248, 119, 7, 255, 122, 168, 136, 151, 219, 51, - 198, 178, 235, 167, 76, 194, 202, 160, 177, 254, 91, 86, 11, 130, 205, 18, - 100, 174, 219, 106, 123, 215, 57, 134, 56, 156, 160, 64, 164, 12, 171, 176, - 118, 26, 113, 156, 26, 85, 178, 129, 222, 91, 56, 180, 117, 109, 234, 9, - 199, 239, 145, 44, 132, 110, 163, 97, 135, 85, 210, 131, 140, 53, 86, 63, - 157, 165, 189, 225, 205, 128, 237, 177, 198, 131, 229, 8, 56, 229, 74, 3, - 172, 242, 2, 43, 229, 234, 150, 154, 142, 8, 69, 139, 135, 242, 32, 83, - 183, 86, 83, 72, 56, 163, 148, 6, 210, 72, 95, 194, 105, 221, 78, 102, - 19, 16, 123, 74, 15, 139, 208, 50, 28, 207, 113, 236, 255, 230, 76, 144, - 144, 92, 207, 146, 209, 227, 189, 12, 4, 46, 170, 112, 2, 97, 249, 106, - 240, 17, 197, 43, 41, 76, 193, 18, 18, 77, 161, 35, 15, 229, 76, 76, - 119, 12, 9, 73, 103, 30, 89, 175, 98, 122, 26, 199, 244, 227, 35, 222, - 11, 117, 18, 75, 31, 45, 111, 100, 86, 229, 215, 73, 15, 5, 226, 34, - 217, 185, 94, 224, 33, 11, 165, 118, 96, 165, 177, 153, 40, 98, 31, 139, - 150, 148, 160, 220, 126, 194, 176, 236, 116, 125, 40, 197, 192, 108, 145, 39, - 196, 94, 184, 243, 89, 132, 202, 178, 47, 152, 222, 25, 37, 179, 15, 23, - 87, 194, 123, 237, 5, 105, 46, 220, 139, 60, 236, 117, 31, 241, 125, 136, - 213, 7, 94, 66, 189, 134, 93, 192, 94, 107, 227, 177, 254, 100, 148, 164, - 187, 225, 131, 11, 103, 134, 228, 45, 84, 137, 24, 89, 108, 99, 237, 127, - 100, 210, 160, 255, 164, 70, 82, 56, 157, 109, 145, 22, 146, 220, 54, 164, - 37, 139, 154, 93, 49, 179, 114, 153, 48, 202, 226, 38, 183, 108, 54, 86, - 217, 120, 72, 65, 6, 216, 46, 116, 53, 210, 228, 31, 134, 164, 56, 32, - 104, 111, 36, 78, 170, 24, 202, 107, 215, 16, 101, 103, 63, 69, 194, 235, - 219, 20, 1, 178, 230, 4, 53, 86, 177, 146, 62, 4, 182, 123, 122, 216, - 238, 146, 38, 8, 85, 104, 116, 159, 195, 240, 90, 133, 177, 161, 121, 30, - 138, 59, 82, 15, 19, 178, 131, 197, 240, 56, 162, 187, 206, 42, 4, 73, - 47, 100, 136, 28, 75, 251, 65, 32, 72, 248, 123, 169, 23, 110, 187, 17, - 252, 39, 34, 69, 129, 60, 53, 74, 103, 179, 9, 233, 91, 214, 102, 166, - 123, 214, 202, 123, 161, 71, 90, 149, 109, 197, 59, 155, 157, 239, 220, 179, - 46, 159, 19, 134, 219, 237, 195, 213, 70, 251, 189, 179, 33, 107, 166, 76, - 231, 61, 236, 189, 167, 187, 143, 42, 108, 165, 251, 128, 204, 24, 183, 59, - 176, 141, 29, 49, 247, 209, 224, 135, 134, 86, 194, 211, 89, 138, 106, 188, - 13, 11, 185, 231, 15, 5, 143, 221, 113, 250, 174, 139, 165, 195, 207, 43, - 194, 183, 125, 196, 103, 84, 90, 113, 41, 2, 117, 9, 165, 85, 224, 127, - 1, 19, 71, 178, 139, 181, 137, 254, 18, 9, 84, 141, 19, 128, 212, 240, - 124, 52, 225, 155, 176, 123, 164, 136, 171, 47, 41, 165, 172, 244, 133, 253, - 199, 65, 194, 74, 239, 63, 172, 165, 35, 137, 120, 72, 129, 97, 95, 216, - 153, 216, 187, 123, 134, 222, 149, 227, 70, 69, 192, 32, 233, 240, 187, 100, - 218, 133, 120, 136, 143, 244, 91, 124, 84, 28, 93, 13, 12, 11, 2, 211, - 184, 151, 242, 128, 5, 28, 37, 214, 54, 12, 243, 29, 75, 116, 50, 227, - 28, 167, 153, 74, 191, 136, 241, 242, 80, 151, 42, 67, 230, 6, 133, 144, - 185, 225, 227, 66, 230, 226, 118, 99, 158, 145, 211, 228, 179, 12, 130, 142, - 32, 227, 75, 196, 223, 114, 131, 22, 130, 43, 183, 134, 176, 96, 38, 184, - 177, 113, 142, 241, 165, 75, 206, 94, 151, 20, 243, 30, 86, 131, 130, 68, - 224, 111, 168, 106, 3, 194, 222, 226, 6, 255, 43, 46, 3, 84, 87, 168, - 157, 151, 231, 123, 231, 210, 248, 49, 29, 193, 254, 63, 67, 187, 224, 3, - 44, 248, 192, 30, 172, 123, 131, 233, 130, 205, 137, 125, 143, 138, 232, 203, - 61, 28, 114, 64, 233, 11, 172, 122, 158, 246, 209, 238, 230, 55, 89, 100, - 196, 20, 89, 122, 244, 30, 191, 190, 96, 88, 6, 215, 164, 229, 253, 39, - 89, 106, 208, 145, 79, 90, 109, 196, 14, 61, 102, 201, 45, 46, 208, 62, - 19, 6, 109, 77, 98, 202, 134, 254, 222, 209, 223, 117, 64, 41, 244, 247, - 46, 48, 205, 245, 255, 50, 88, 0, 63, 0, 162, 134, 152, 119, 161, 91, - 41, 184, 20, 13, 80, 220, 64, 41, 80, 152, 149, 107, 193, 130, 42, 173, - 175, 129, 195, 246, 161, 182, 134, 87, 95, 7, 80, 19, 84, 211, 168, 96, - 124, 100, 67, 133, 47, 162, 58, 57, 128, 121, 87, 93, 144, 204, 201, 177, - 56, 252, 138, 125, 227, 136, 170, 208, 98, 53, 161, 153, 102, 114, 195, 88, - 199, 227, 68, 208, 48, 52, 96, 198, 160, 95, 21, 136, 255, 214, 218, 175, - 48, 62, 168, 175, 188, 160, 33, 124, 111, 183, 214, 166, 52, 91, 8, 217, - 134, 148, 45, 228, 67, 158, 187, 210, 108, 17, 100, 235, 83, 54, 60, 135, - 130, 108, 235, 160, 44, 91, 71, 85, 218, 97, 13, 251, 166, 52, 91, 87, - 85, 10, 253, 234, 98, 165, 165, 217, 142, 84, 165, 71, 216, 253, 173, 85, - 119, 96, 190, 156, 117, 240, 206, 129, 73, 115, 54, 240, 123, 7, 191, 48, - 101, 232, 38, 123, 175, 145, 51, 32, 139, 7, 89, 217, 154, 26, 242, 121, - 144, 95, 220, 220, 193, 13, 76, 55, 31, 34, 33, 51, 101, 241, 209, 138, - 29, 40, 79, 18, 225, 110, 154, 227, 217, 51, 43, 246, 227, 50, 233, 207, - 24, 43, 56, 187, 110, 205, 21, 187, 14, 233, 154, 254, 174, 35, 186, 142, - 24, 19, 48, 235, 242, 84, 46, 104, 239, 241, 53, 100, 106, 184, 43, 212, - 115, 183, 111, 109, 95, 240, 171, 10, 95, 163, 199, 94, 244, 218, 214, 35, - 244, 24, 199, 40, 79, 98, 243, 229, 61, 164, 122, 203, 203, 180, 103, 138, - 230, 159, 40, 220, 99, 89, 194, 196, 4, 173, 18, 163, 152, 185, 82, 179, - 100, 243, 163, 159, 38, 64, 228, 230, 49, 198, 222, 125, 234, 62, 231, 159, - 35, 159, 47, 59, 252, 75, 132, 193, 88, 15, 14, 191, 99, 67, 55, 55, - 215, 100, 163, 214, 113, 69, 26, 157, 218, 160, 210, 43, 191, 130, 228, 118, - 241, 213, 105, 252, 140, 20, 94, 95, 189, 140, 131, 14, 95, 61, 137, 131, - 160, 102, 93, 100, 94, 185, 135, 12, 65, 248, 77, 248, 34, 218, 218, 78, - 51, 247, 48, 52, 149, 104, 207, 249, 164, 156, 138, 122, 174, 76, 5, 3, - 223, 176, 41, 15, 252, 151, 113, 84, 68, 208, 69, 170, 194, 103, 176, 197, - 19, 229, 111, 36, 101, 121, 161, 40, 75, 105, 214, 16, 179, 10, 234, 242, - 130, 168, 11, 146, 141, 210, 172, 145, 46, 53, 122, 65, 20, 102, 83, 149, - 181, 163, 75, 237, 188, 32, 42, 179, 14, 43, 178, 118, 117, 169, 221, 23, - 68, 105, 54, 85, 89, 143, 116, 169, 71, 47, 136, 218, 172, 163, 138, 172, - 199, 186, 212, 227, 23, 206, 49, 150, 90, 149, 245, 153, 46, 245, 217, 11, - 231, 153, 65, 195, 78, 156, 53, 144, 210, 117, 40, 105, 217, 137, 179, 129, - 251, 77, 200, 180, 236, 173, 31, 159, 81, 198, 141, 127, 126, 242, 54, 192, - 155, 0, 115, 193, 77, 136, 55, 33, 102, 133, 155, 8, 111, 240, 189, 232, - 252, 68, 158, 153, 159, 33, 25, 68, 81, 187, 254, 54, 240, 222, 2, 225, - 227, 235, 200, 123, 27, 54, 26, 174, 126, 24, 25, 15, 67, 239, 109, 208, - 104, 156, 19, 89, 12, 129, 40, 34, 45, 20, 78, 250, 206, 115, 216, 63, - 114, 212, 48, 183, 228, 162, 140, 222, 54, 50, 214, 92, 16, 233, 69, 215, - 49, 23, 93, 231, 55, 92, 116, 119, 85, 89, 35, 157, 85, 44, 186, 202, - 245, 217, 209, 13, 16, 139, 174, 114, 125, 118, 117, 169, 98, 209, 221, 85, - 101, 45, 89, 116, 85, 235, 179, 100, 209, 85, 101, 45, 46, 186, 187, 170, - 172, 207, 117, 214, 231, 47, 156, 231, 187, 86, 125, 224, 27, 115, 224, 195, - 36, 248, 187, 22, 126, 16, 232, 146, 3, 156, 50, 156, 179, 187, 202, 220, - 198, 164, 5, 48, 107, 65, 184, 199, 151, 34, 119, 255, 19, 231, 14, 238, - 239, 138, 95, 14, 36, 102, 191, 30, 204, 157, 249, 130, 240, 181, 204, 87, - 196, 9, 95, 234, 75, 138, 114, 95, 82, 0, 229, 7, 157, 220, 167, 196, - 251, 206, 37, 108, 101, 236, 42, 80, 170, 141, 208, 143, 37, 22, 160, 68, - 154, 17, 226, 140, 185, 127, 133, 221, 35, 23, 213, 0, 131, 155, 155, 116, - 58, 31, 104, 155, 116, 241, 143, 92, 115, 237, 254, 128, 116, 26, 136, 252, - 103, 148, 222, 18, 47, 145, 254, 224, 254, 255, 64, 214, 173, 139, 118, 163, - 200, 241, 90, 70, 190, 114, 117, 235, 131, 205, 44, 170, 217, 76, 0, 212, - 220, 217, 202, 229, 214, 34, 0, 46, 196, 152, 97, 224, 130, 229, 232, 212, - 223, 42, 31, 27, 187, 213, 180, 15, 238, 14, 236, 59, 54, 204, 69, 81, - 131, 140, 17, 238, 98, 21, 6, 120, 40, 179, 109, 14, 236, 77, 46, 219, - 134, 179, 193, 195, 245, 129, 189, 86, 15, 173, 250, 189, 179, 62, 196, 186, - 182, 39, 247, 206, 70, 93, 221, 241, 85, 131, 13, 30, 234, 247, 43, 50, - 121, 29, 210, 223, 62, 252, 109, 176, 105, 7, 148, 56, 30, 217, 181, 51, - 99, 40, 208, 137, 181, 230, 140, 71, 181, 131, 243, 90, 169, 12, 36, 45, - 243, 213, 28, 254, 9, 113, 246, 16, 18, 75, 233, 175, 129, 177, 122, 45, - 114, 217, 192, 164, 1, 217, 93, 106, 160, 217, 199, 40, 248, 191, 31, 195, - 108, 73, 78, 78, 129, 38, 244, 18, 144, 177, 117, 166, 63, 36, 189, 161, - 152, 55, 193, 3, 78, 150, 11, 245, 30, 91, 165, 67, 43, 166, 200, 94, - 213, 19, 247, 210, 237, 53, 8, 241, 157, 120, 194, 161, 224, 31, 5, 159, - 56, 7, 46, 81, 21, 140, 15, 115, 253, 0, 14, 232, 224, 219, 239, 94, - 29, 216, 171, 33, 200, 235, 32, 228, 31, 184, 7, 151, 240, 175, 119, 64, - 210, 60, 190, 65, 2, 169, 98, 71, 69, 39, 15, 190, 133, 76, 223, 193, - 191, 87, 165, 74, 53, 180, 176, 178, 163, 144, 244, 204, 218, 118, 88, 89, - 141, 117, 72, 215, 214, 102, 5, 155, 221, 42, 204, 64, 230, 44, 211, 14, - 158, 150, 149, 241, 172, 188, 12, 219, 136, 188, 22, 90, 42, 85, 127, 49, - 159, 63, 187, 15, 64, 52, 205, 111, 210, 30, 204, 174, 47, 208, 92, 249, - 136, 2, 214, 119, 43, 216, 10, 175, 252, 22, 199, 190, 101, 75, 156, 169, - 8, 175, 155, 126, 83, 255, 254, 12, 99, 122, 182, 90, 83, 52, 96, 57, - 91, 187, 155, 243, 19, 123, 218, 120, 225, 215, 44, 117, 194, 209, 230, 51, - 14, 142, 159, 164, 79, 57, 12, 136, 36, 211, 170, 46, 178, 46, 212, 8, - 48, 126, 79, 96, 235, 20, 1, 185, 234, 149, 164, 153, 73, 132, 205, 26, - 176, 72, 38, 140, 224, 90, 185, 88, 212, 192, 111, 131, 116, 65, 182, 208, - 172, 254, 236, 120, 164, 147, 166, 207, 93, 227, 107, 22, 209, 77, 46, 140, - 9, 162, 65, 105, 10, 171, 162, 172, 121, 210, 20, 35, 20, 167, 240, 139, - 182, 70, 239, 5, 250, 11, 220, 134, 124, 139, 103, 186, 194, 136, 109, 234, - 63, 137, 33, 23, 112, 57, 116, 69, 220, 207, 52, 192, 43, 215, 122, 139, - 165, 224, 24, 71, 238, 20, 182, 38, 235, 109, 160, 239, 3, 188, 15, 245, - 61, 236, 67, 150, 16, 34, 40, 208, 106, 228, 190, 245, 221, 183, 129, 251, - 22, 143, 32, 206, 166, 62, 188, 129, 153, 200, 60, 199, 78, 107, 138, 148, - 44, 224, 187, 191, 152, 127, 64, 239, 15, 4, 25, 84, 122, 34, 130, 14, - 193, 244, 139, 181, 248, 221, 136, 95, 129, 102, 111, 152, 19, 188, 166, 82, - 108, 42, 197, 36, 38, 228, 2, 96, 194, 205, 10, 178, 0, 98, 87, 50, - 69, 160, 130, 1, 171, 200, 166, 179, 201, 101, 114, 153, 222, 32, 80, 38, - 26, 52, 230, 10, 22, 142, 190, 121, 119, 253, 87, 151, 175, 102, 240, 241, - 204, 216, 175, 30, 223, 237, 39, 11, 210, 142, 81, 67, 4, 246, 151, 105, - 140, 157, 204, 174, 151, 35, 210, 143, 29, 112, 207, 8, 245, 130, 250, 38, - 225, 91, 116, 7, 153, 158, 64, 211, 110, 211, 254, 160, 239, 154, 133, 210, - 147, 27, 16, 54, 199, 11, 85, 188, 198, 106, 67, 36, 147, 129, 254, 250, - 80, 177, 72, 15, 216, 237, 139, 96, 231, 113, 112, 224, 19, 172, 171, 102, - 200, 86, 52, 50, 70, 39, 153, 230, 84, 159, 29, 168, 57, 51, 2, 13, - 114, 193, 49, 254, 108, 98, 97, 154, 225, 225, 121, 66, 118, 198, 13, 243, - 9, 1, 123, 196, 252, 54, 204, 190, 161, 136, 244, 2, 182, 88, 242, 132, - 25, 5, 186, 243, 10, 91, 63, 140, 222, 0, 76, 59, 254, 116, 94, 178, - 198, 210, 247, 208, 55, 161, 150, 91, 20, 74, 123, 197, 147, 103, 234, 35, - 37, 248, 180, 31, 7, 161, 223, 126, 30, 62, 15, 3, 255, 217, 51, 223, - 247, 143, 158, 91, 163, 0, 68, 219, 176, 221, 61, 238, 116, 195, 227, 240, - 121, 240, 204, 127, 214, 177, 190, 133, 198, 250, 207, 143, 59, 207, 159, 63, - 235, 118, 158, 29, 133, 71, 207, 158, 63, 63, 182, 190, 195, 212, 163, 232, - 217, 179, 103, 199, 65, 116, 28, 28, 119, 142, 224, 206, 122, 133, 169, 221, - 176, 235, 251, 221, 40, 240, 143, 143, 163, 103, 157, 231, 93, 75, 192, 60, - 206, 17, 231, 49, 139, 247, 168, 168, 49, 208, 189, 130, 192, 177, 26, 246, - 227, 251, 149, 64, 61, 35, 240, 184, 251, 85, 115, 216, 236, 111, 93, 58, - 232, 67, 12, 177, 185, 189, 97, 52, 13, 103, 228, 195, 5, 158, 212, 141, - 48, 232, 225, 198, 162, 19, 194, 186, 243, 173, 235, 124, 119, 226, 124, 231, - 58, 175, 26, 118, 107, 212, 100, 0, 86, 10, 84, 136, 22, 119, 228, 232, - 79, 30, 167, 20, 137, 14, 141, 58, 135, 125, 46, 89, 243, 128, 194, 251, - 246, 209, 3, 205, 182, 42, 240, 21, 192, 62, 44, 86, 35, 174, 66, 214, - 28, 102, 205, 157, 132, 25, 203, 167, 14, 84, 193, 217, 17, 199, 33, 100, - 99, 22, 98, 39, 91, 87, 152, 132, 129, 84, 83, 23, 67, 50, 54, 14, - 108, 35, 101, 205, 41, 2, 191, 142, 98, 111, 224, 246, 145, 240, 85, 207, - 42, 144, 115, 140, 219, 113, 110, 205, 207, 216, 38, 26, 4, 184, 192, 37, - 183, 21, 30, 127, 31, 151, 209, 125, 40, 146, 66, 154, 18, 235, 77, 124, - 79, 134, 208, 84, 228, 218, 110, 169, 112, 199, 12, 131, 194, 233, 163, 38, - 255, 30, 82, 65, 111, 24, 113, 106, 129, 117, 205, 110, 237, 194, 106, 32, - 48, 136, 194, 130, 192, 212, 141, 106, 138, 106, 128, 172, 122, 243, 169, 171, - 0, 88, 71, 131, 39, 164, 83, 244, 30, 71, 140, 123, 97, 159, 49, 84, - 182, 58, 215, 212, 142, 151, 89, 183, 152, 188, 75, 141, 178, 63, 196, 128, - 35, 226, 44, 71, 122, 31, 155, 81, 73, 68, 96, 185, 220, 129, 168, 130, - 237, 206, 180, 134, 253, 144, 21, 134, 183, 182, 213, 97, 52, 111, 130, 33, - 87, 46, 186, 188, 56, 11, 92, 232, 149, 233, 144, 123, 74, 46, 45, 179, - 1, 114, 61, 51, 225, 167, 103, 163, 79, 46, 238, 18, 4, 161, 57, 177, - 149, 51, 171, 203, 220, 59, 36, 25, 80, 78, 191, 185, 139, 78, 38, 24, - 108, 144, 5, 83, 234, 150, 184, 235, 100, 230, 1, 79, 7, 124, 95, 196, - 95, 81, 179, 33, 253, 143, 197, 84, 196, 245, 229, 24, 91, 217, 168, 70, - 201, 91, 224, 212, 68, 132, 139, 40, 100, 60, 105, 125, 193, 51, 69, 71, - 84, 36, 201, 201, 240, 197, 129, 4, 74, 234, 170, 64, 225, 237, 110, 51, - 125, 179, 213, 171, 110, 33, 176, 245, 96, 108, 169, 183, 164, 68, 30, 161, - 102, 184, 151, 75, 61, 227, 84, 126, 140, 190, 167, 213, 167, 233, 75, 216, - 53, 175, 199, 136, 74, 47, 43, 80, 225, 250, 96, 34, 245, 18, 146, 197, - 187, 54, 5, 92, 76, 122, 189, 201, 172, 47, 52, 205, 137, 221, 3, 113, - 5, 38, 137, 171, 53, 116, 193, 156, 144, 81, 255, 194, 62, 120, 185, 1, - 198, 244, 150, 212, 191, 163, 100, 60, 76, 22, 80, 49, 251, 156, 83, 148, - 189, 1, 221, 69, 241, 252, 227, 50, 33, 228, 97, 149, 186, 205, 22, 13, - 61, 203, 20, 141, 128, 88, 222, 40, 153, 177, 227, 16, 41, 170, 39, 43, - 207, 60, 101, 131, 94, 190, 255, 128, 94, 187, 84, 29, 30, 197, 85, 62, - 142, 226, 160, 5, 34, 192, 114, 54, 70, 11, 246, 33, 164, 116, 226, 48, - 147, 178, 195, 30, 141, 251, 173, 172, 50, 185, 173, 149, 39, 152, 218, 166, - 49, 132, 133, 162, 38, 194, 23, 30, 255, 81, 137, 16, 133, 223, 94, 144, - 89, 91, 244, 14, 18, 106, 146, 34, 178, 9, 129, 157, 189, 247, 209, 40, - 1, 100, 48, 163, 230, 224, 72, 249, 195, 23, 1, 6, 174, 174, 22, 120, - 56, 80, 212, 128, 72, 235, 159, 93, 150, 24, 174, 157, 204, 109, 5, 182, - 0, 73, 99, 2, 159, 59, 100, 23, 224, 93, 96, 186, 178, 218, 130, 190, - 4, 99, 124, 11, 220, 81, 10, 140, 194, 141, 83, 217, 139, 42, 144, 210, - 118, 170, 237, 123, 143, 246, 149, 99, 101, 160, 33, 21, 30, 5, 223, 12, - 214, 33, 87, 205, 81, 20, 238, 61, 225, 66, 197, 190, 167, 226, 110, 152, - 185, 235, 211, 29, 10, 162, 101, 138, 7, 117, 144, 43, 12, 144, 111, 6, - 183, 20, 156, 157, 190, 121, 90, 101, 198, 37, 30, 57, 237, 248, 196, 117, - 89, 187, 204, 100, 128, 60, 83, 97, 40, 159, 95, 75, 250, 238, 230, 10, - 200, 208, 229, 201, 24, 163, 10, 131, 216, 161, 197, 223, 204, 153, 147, 42, - 218, 40, 183, 109, 127, 43, 36, 3, 251, 128, 219, 94, 6, 16, 9, 28, - 47, 63, 245, 15, 68, 67, 118, 27, 71, 243, 232, 196, 97, 151, 192, 245, - 248, 205, 216, 151, 177, 150, 185, 158, 93, 158, 241, 250, 220, 220, 62, 234, - 40, 8, 8, 184, 159, 50, 186, 29, 126, 117, 136, 16, 25, 229, 103, 231, - 130, 66, 180, 238, 51, 63, 165, 51, 19, 188, 118, 213, 185, 92, 249, 44, - 49, 76, 154, 98, 0, 133, 128, 87, 31, 38, 132, 172, 134, 159, 58, 190, - 173, 56, 196, 198, 111, 62, 159, 213, 243, 242, 248, 105, 48, 212, 51, 129, - 49, 39, 56, 200, 48, 181, 86, 110, 212, 197, 145, 126, 96, 162, 154, 251, - 79, 89, 124, 162, 67, 254, 2, 21, 200, 12, 113, 217, 200, 106, 94, 30, - 29, 165, 104, 74, 113, 20, 120, 4, 207, 72, 181, 112, 46, 184, 117, 161, - 33, 135, 111, 83, 44, 190, 226, 185, 136, 202, 131, 241, 219, 138, 103, 33, - 250, 49, 240, 29, 197, 243, 143, 34, 10, 71, 140, 6, 135, 90, 14, 186, - 71, 143, 185, 200, 157, 139, 19, 115, 96, 88, 111, 169, 162, 208, 190, 165, - 18, 35, 22, 28, 141, 70, 128, 228, 104, 212, 9, 130, 165, 8, 4, 159, - 114, 36, 120, 126, 159, 142, 251, 141, 151, 92, 39, 29, 181, 234, 78, 250, - 198, 131, 11, 109, 141, 64, 117, 100, 243, 38, 235, 124, 94, 97, 146, 128, - 0, 182, 183, 241, 189, 131, 239, 120, 14, 214, 178, 181, 244, 87, 123, 207, - 0, 63, 218, 161, 54, 63, 180, 136, 213, 80, 15, 90, 198, 235, 228, 41, - 75, 232, 112, 44, 197, 156, 198, 148, 252, 245, 215, 233, 203, 152, 178, 33, - 12, 81, 26, 139, 107, 71, 213, 229, 5, 4, 55, 247, 255, 216, 123, 211, - 254, 196, 145, 228, 93, 244, 61, 159, 66, 69, 211, 93, 96, 132, 209, 194, - 90, 46, 220, 199, 187, 177, 13, 198, 198, 11, 182, 219, 237, 31, 139, 0, - 25, 16, 152, 85, 224, 241, 55, 187, 239, 238, 23, 187, 17, 145, 153, 90, - 0, 187, 92, 221, 61, 115, 230, 220, 255, 153, 233, 50, 82, 42, 51, 149, - 155, 50, 35, 35, 35, 158, 39, 108, 242, 108, 54, 220, 71, 241, 176, 55, - 255, 72, 132, 182, 69, 1, 210, 93, 213, 187, 253, 9, 44, 144, 158, 124, - 100, 170, 248, 104, 219, 23, 70, 238, 177, 44, 92, 91, 10, 255, 120, 138, - 127, 170, 79, 80, 77, 233, 159, 232, 201, 64, 210, 37, 211, 241, 238, 8, - 224, 67, 114, 38, 151, 181, 83, 11, 229, 7, 50, 237, 244, 179, 115, 255, - 143, 231, 84, 127, 97, 20, 62, 205, 250, 191, 238, 79, 78, 177, 188, 186, - 120, 14, 226, 154, 43, 41, 204, 62, 210, 55, 245, 122, 166, 221, 213, 182, - 114, 121, 13, 32, 157, 143, 217, 64, 248, 124, 113, 166, 66, 54, 21, 32, - 123, 49, 179, 191, 10, 122, 200, 225, 130, 114, 48, 184, 50, 75, 4, 67, - 175, 111, 193, 247, 154, 240, 189, 105, 130, 11, 8, 110, 92, 156, 44, 200, - 159, 132, 231, 100, 144, 199, 186, 230, 17, 33, 226, 244, 85, 163, 241, 22, - 154, 110, 113, 167, 189, 181, 227, 131, 70, 33, 34, 234, 253, 157, 181, 198, - 87, 13, 3, 143, 17, 216, 65, 144, 99, 167, 135, 47, 249, 119, 73, 8, - 174, 57, 225, 191, 111, 69, 89, 223, 94, 159, 92, 26, 232, 248, 194, 73, - 230, 107, 171, 53, 205, 180, 198, 234, 111, 121, 36, 188, 235, 148, 228, 153, - 248, 60, 220, 12, 43, 22, 98, 48, 135, 210, 20, 42, 248, 25, 120, 221, - 215, 27, 138, 225, 172, 43, 18, 136, 249, 153, 181, 205, 122, 139, 49, 111, - 124, 62, 71, 199, 164, 16, 123, 133, 180, 129, 32, 54, 206, 180, 200, 38, - 103, 178, 208, 98, 89, 198, 120, 60, 196, 32, 169, 51, 230, 2, 119, 122, - 125, 99, 254, 240, 129, 25, 106, 107, 164, 54, 233, 125, 4, 249, 131, 179, - 110, 141, 156, 5, 139, 40, 14, 20, 132, 190, 65, 248, 172, 33, 157, 198, - 110, 50, 251, 47, 238, 88, 191, 25, 112, 120, 31, 116, 31, 36, 64, 130, - 137, 218, 132, 46, 224, 248, 37, 108, 174, 33, 77, 136, 235, 252, 111, 36, - 128, 140, 118, 91, 42, 221, 241, 23, 74, 26, 227, 155, 192, 72, 222, 215, - 114, 250, 132, 85, 142, 133, 24, 99, 81, 144, 185, 101, 189, 135, 72, 225, - 53, 52, 219, 8, 181, 55, 136, 231, 192, 105, 145, 245, 60, 9, 236, 180, - 4, 85, 77, 114, 168, 141, 172, 8, 158, 213, 130, 113, 139, 189, 231, 73, - 214, 238, 79, 90, 46, 110, 139, 11, 218, 2, 87, 194, 215, 135, 230, 233, - 167, 105, 127, 12, 243, 211, 7, 166, 192, 44, 39, 119, 63, 20, 70, 144, - 142, 170, 60, 108, 247, 35, 63, 183, 84, 48, 128, 139, 164, 74, 64, 213, - 28, 187, 130, 97, 189, 176, 143, 116, 109, 185, 222, 245, 205, 34, 239, 68, - 117, 51, 201, 202, 231, 8, 223, 184, 229, 197, 71, 204, 71, 9, 189, 59, - 26, 13, 110, 230, 219, 237, 183, 240, 42, 32, 154, 198, 163, 103, 135, 66, - 173, 160, 85, 185, 222, 169, 107, 120, 67, 25, 64, 201, 114, 211, 120, 167, - 125, 175, 45, 175, 46, 227, 151, 79, 127, 250, 147, 241, 91, 208, 133, 253, - 165, 163, 115, 86, 85, 62, 29, 240, 131, 63, 220, 172, 187, 246, 202, 239, - 206, 17, 208, 11, 36, 94, 17, 254, 207, 236, 79, 45, 218, 70, 47, 117, - 237, 45, 208, 242, 124, 46, 97, 101, 75, 56, 117, 208, 96, 22, 95, 1, - 67, 160, 144, 25, 252, 4, 31, 213, 68, 126, 135, 231, 226, 68, 111, 135, - 71, 227, 1, 223, 190, 149, 78, 229, 208, 151, 129, 157, 22, 82, 152, 198, - 99, 120, 189, 61, 162, 223, 137, 213, 5, 242, 24, 152, 30, 32, 92, 162, - 246, 33, 244, 11, 13, 129, 151, 2, 156, 53, 45, 196, 234, 241, 70, 212, - 168, 175, 208, 109, 48, 157, 197, 241, 249, 92, 28, 251, 217, 18, 206, 19, - 189, 41, 49, 232, 66, 59, 48, 20, 18, 253, 77, 106, 226, 135, 77, 84, - 105, 115, 201, 43, 132, 33, 246, 130, 202, 157, 125, 100, 229, 163, 79, 197, - 124, 87, 105, 33, 184, 12, 62, 167, 188, 32, 237, 227, 15, 213, 23, 230, - 7, 202, 135, 15, 223, 231, 194, 50, 127, 230, 61, 190, 181, 133, 156, 150, - 66, 95, 200, 135, 137, 80, 29, 64, 150, 136, 170, 111, 143, 1, 174, 132, - 240, 233, 32, 124, 42, 136, 37, 13, 132, 191, 191, 215, 81, 205, 122, 154, - 117, 212, 31, 180, 251, 99, 99, 180, 36, 175, 122, 76, 85, 173, 6, 241, - 163, 136, 120, 107, 88, 132, 145, 87, 206, 7, 93, 136, 170, 214, 22, 159, - 122, 223, 211, 169, 185, 11, 103, 42, 241, 245, 125, 215, 102, 205, 243, 234, - 148, 215, 69, 81, 74, 250, 193, 29, 189, 53, 113, 144, 3, 82, 9, 47, - 43, 150, 175, 38, 120, 94, 58, 98, 221, 196, 170, 241, 238, 218, 207, 78, - 114, 170, 107, 72, 169, 87, 62, 125, 88, 189, 76, 68, 153, 180, 12, 189, - 65, 103, 26, 161, 237, 13, 45, 153, 132, 221, 136, 10, 27, 144, 55, 65, - 244, 139, 143, 162, 16, 227, 79, 144, 147, 235, 253, 46, 46, 42, 170, 240, - 68, 251, 96, 141, 65, 254, 165, 53, 125, 72, 86, 27, 216, 127, 63, 225, - 75, 178, 164, 95, 58, 163, 44, 254, 190, 59, 145, 231, 64, 149, 175, 23, - 127, 209, 247, 195, 213, 100, 166, 112, 142, 165, 226, 45, 123, 53, 66, 7, - 122, 157, 142, 222, 81, 166, 122, 93, 188, 250, 164, 24, 117, 243, 206, 240, - 156, 241, 129, 200, 113, 13, 32, 171, 227, 143, 251, 215, 220, 117, 62, 104, - 220, 117, 78, 58, 97, 215, 69, 37, 242, 105, 143, 29, 42, 226, 231, 92, - 118, 40, 234, 187, 254, 58, 31, 185, 235, 120, 218, 225, 199, 142, 55, 172, - 214, 63, 114, 183, 17, 160, 1, 116, 30, 249, 207, 59, 220, 120, 76, 216, - 22, 104, 240, 194, 254, 163, 21, 23, 177, 25, 241, 111, 3, 197, 92, 170, - 217, 38, 247, 193, 33, 194, 46, 58, 179, 89, 142, 199, 9, 129, 68, 86, - 158, 231, 107, 115, 240, 60, 71, 165, 201, 151, 28, 161, 99, 109, 120, 245, - 147, 175, 204, 211, 135, 144, 21, 183, 241, 169, 216, 95, 110, 146, 61, 199, - 170, 75, 179, 251, 217, 195, 82, 252, 228, 0, 255, 121, 16, 253, 60, 252, - 149, 151, 236, 120, 131, 12, 39, 4, 52, 10, 36, 131, 22, 239, 122, 246, - 112, 248, 184, 203, 113, 218, 16, 102, 186, 33, 9, 239, 128, 118, 191, 79, - 56, 200, 45, 216, 56, 91, 204, 179, 23, 71, 236, 167, 125, 51, 61, 216, - 121, 106, 234, 93, 14, 68, 88, 57, 163, 110, 101, 212, 84, 192, 91, 179, - 21, 220, 118, 53, 229, 0, 183, 231, 84, 47, 50, 221, 79, 86, 117, 165, - 146, 156, 13, 81, 254, 200, 238, 43, 202, 22, 32, 1, 81, 146, 203, 113, - 212, 145, 149, 190, 49, 173, 191, 212, 55, 166, 245, 223, 216, 55, 78, 101, - 176, 111, 60, 53, 251, 91, 125, 243, 81, 85, 255, 90, 223, 192, 28, 218, - 248, 84, 215, 224, 139, 159, 232, 204, 143, 187, 255, 224, 100, 62, 23, 23, - 11, 113, 65, 126, 64, 244, 72, 92, 44, 196, 197, 15, 220, 157, 87, 100, - 84, 81, 91, 122, 169, 56, 208, 31, 207, 250, 66, 255, 224, 69, 240, 24, - 128, 112, 98, 17, 254, 59, 74, 40, 127, 97, 154, 94, 187, 19, 243, 237, - 219, 16, 56, 132, 251, 85, 198, 195, 48, 3, 69, 124, 173, 194, 118, 101, - 203, 222, 119, 30, 185, 157, 67, 75, 108, 208, 175, 150, 81, 184, 132, 68, - 183, 12, 236, 203, 57, 16, 135, 116, 253, 97, 96, 169, 205, 189, 139, 135, - 31, 101, 91, 247, 46, 39, 233, 117, 126, 156, 107, 91, 146, 183, 162, 235, - 204, 71, 235, 134, 235, 208, 199, 142, 65, 188, 237, 234, 8, 123, 238, 226, - 18, 74, 227, 178, 66, 235, 203, 231, 156, 57, 157, 253, 93, 76, 34, 189, - 123, 20, 126, 10, 113, 104, 173, 55, 143, 21, 79, 14, 53, 205, 175, 137, - 88, 234, 205, 139, 93, 65, 144, 3, 164, 204, 73, 203, 9, 89, 7, 201, - 176, 179, 25, 176, 63, 84, 33, 161, 214, 28, 157, 2, 184, 2, 105, 254, - 126, 100, 134, 117, 76, 86, 254, 28, 209, 127, 241, 126, 100, 6, 231, 79, - 238, 127, 28, 203, 63, 28, 178, 183, 66, 243, 173, 208, 34, 130, 20, 155, - 3, 226, 101, 134, 48, 57, 52, 151, 33, 140, 219, 175, 13, 126, 131, 53, - 207, 142, 193, 124, 198, 73, 68, 7, 191, 193, 110, 212, 142, 230, 84, 65, - 206, 0, 33, 137, 55, 105, 238, 139, 146, 129, 0, 127, 20, 152, 49, 164, - 133, 47, 142, 14, 249, 44, 120, 36, 79, 81, 24, 79, 103, 104, 64, 176, - 4, 108, 151, 42, 217, 31, 109, 24, 123, 164, 47, 92, 127, 140, 90, 40, - 31, 72, 225, 130, 81, 181, 98, 101, 102, 148, 32, 29, 160, 119, 26, 124, - 6, 213, 241, 208, 180, 93, 147, 155, 79, 113, 196, 50, 88, 1, 93, 225, - 87, 40, 195, 235, 73, 239, 77, 6, 113, 152, 54, 133, 212, 234, 160, 4, - 112, 252, 82, 200, 142, 205, 197, 66, 9, 196, 238, 28, 77, 16, 187, 109, - 128, 92, 135, 15, 133, 35, 173, 252, 100, 171, 242, 211, 28, 254, 45, 16, - 251, 121, 19, 238, 139, 112, 15, 255, 22, 69, 215, 172, 136, 97, 15, 72, - 197, 168, 234, 188, 141, 118, 60, 43, 219, 98, 103, 167, 10, 3, 220, 227, - 187, 43, 102, 236, 247, 248, 197, 121, 158, 169, 132, 156, 34, 235, 180, 164, - 46, 171, 26, 66, 48, 170, 153, 132, 172, 17, 59, 153, 166, 166, 33, 44, - 133, 87, 233, 164, 172, 103, 96, 155, 239, 86, 220, 191, 130, 168, 62, 70, - 22, 30, 168, 9, 156, 68, 111, 160, 46, 240, 108, 61, 216, 180, 162, 178, - 164, 245, 177, 67, 186, 191, 198, 174, 117, 192, 216, 179, 16, 33, 6, 110, - 12, 245, 45, 252, 24, 208, 185, 71, 101, 162, 14, 2, 156, 208, 36, 198, - 84, 180, 162, 237, 77, 80, 48, 155, 47, 234, 182, 84, 68, 149, 104, 224, - 152, 65, 141, 48, 197, 14, 170, 80, 111, 115, 206, 62, 61, 116, 204, 80, - 84, 49, 171, 215, 208, 237, 70, 232, 88, 248, 194, 42, 24, 20, 186, 149, - 41, 6, 170, 92, 200, 161, 6, 113, 99, 81, 90, 220, 8, 145, 167, 195, - 6, 146, 89, 138, 9, 13, 145, 141, 98, 76, 65, 160, 146, 130, 128, 0, - 84, 121, 136, 230, 132, 44, 120, 136, 78, 33, 174, 53, 54, 190, 143, 118, - 148, 154, 139, 133, 189, 4, 161, 130, 102, 129, 228, 73, 206, 247, 155, 124, - 167, 186, 25, 88, 50, 146, 64, 59, 59, 40, 56, 35, 184, 191, 69, 22, - 166, 24, 114, 4, 171, 111, 143, 238, 87, 24, 240, 10, 169, 30, 108, 204, - 7, 54, 148, 185, 105, 157, 119, 208, 163, 201, 180, 111, 216, 187, 1, 108, - 224, 227, 253, 42, 75, 26, 132, 48, 204, 121, 118, 219, 175, 215, 97, 102, - 179, 112, 143, 200, 157, 112, 153, 217, 244, 211, 168, 14, 219, 144, 159, 176, - 194, 131, 232, 176, 142, 193, 30, 165, 129, 176, 133, 180, 45, 124, 103, 74, - 96, 70, 120, 206, 7, 195, 106, 74, 143, 248, 153, 146, 147, 249, 103, 96, - 175, 87, 221, 65, 152, 129, 18, 237, 153, 86, 138, 132, 146, 223, 136, 249, - 109, 240, 1, 45, 133, 7, 242, 75, 68, 164, 37, 158, 55, 129, 245, 9, - 146, 147, 207, 57, 100, 109, 153, 55, 201, 170, 207, 215, 104, 42, 55, 236, - 27, 183, 205, 97, 67, 28, 233, 67, 217, 71, 125, 207, 251, 221, 194, 121, - 107, 236, 212, 148, 114, 162, 53, 152, 14, 170, 216, 11, 171, 35, 105, 102, - 116, 187, 31, 40, 19, 188, 3, 34, 231, 25, 45, 46, 42, 55, 141, 13, - 6, 156, 231, 231, 124, 19, 150, 129, 124, 116, 176, 251, 229, 225, 193, 206, - 61, 125, 181, 21, 90, 11, 26, 30, 104, 24, 216, 48, 154, 72, 54, 247, - 158, 109, 32, 55, 89, 255, 157, 75, 64, 184, 143, 17, 227, 93, 24, 217, - 234, 220, 133, 66, 0, 200, 200, 66, 101, 49, 232, 246, 199, 26, 85, 118, - 213, 47, 156, 75, 197, 254, 185, 90, 219, 151, 216, 65, 42, 166, 92, 129, - 18, 35, 202, 83, 248, 63, 158, 160, 207, 183, 225, 110, 3, 79, 121, 234, - 253, 81, 216, 6, 153, 36, 170, 109, 76, 8, 196, 90, 137, 124, 133, 121, - 219, 121, 181, 139, 34, 181, 98, 30, 19, 240, 196, 250, 22, 88, 129, 87, - 240, 22, 209, 87, 178, 119, 221, 101, 16, 214, 107, 59, 199, 73, 212, 253, - 162, 84, 24, 55, 203, 164, 245, 70, 185, 81, 193, 86, 219, 240, 28, 219, - 189, 18, 96, 53, 234, 150, 221, 57, 166, 138, 8, 204, 107, 214, 125, 143, - 122, 25, 85, 98, 104, 220, 154, 147, 94, 165, 88, 37, 23, 171, 196, 56, - 233, 9, 76, 3, 74, 174, 102, 90, 232, 117, 130, 118, 133, 158, 227, 97, - 52, 36, 100, 74, 33, 180, 25, 28, 138, 218, 214, 251, 100, 31, 89, 69, - 253, 34, 204, 31, 12, 47, 216, 93, 163, 197, 242, 188, 172, 54, 173, 10, - 2, 122, 118, 28, 235, 201, 133, 204, 212, 170, 34, 156, 138, 107, 162, 26, - 85, 221, 143, 59, 54, 68, 188, 132, 52, 220, 156, 156, 195, 240, 172, 33, - 184, 27, 73, 19, 13, 187, 162, 77, 248, 116, 215, 150, 213, 231, 214, 196, - 164, 100, 234, 49, 212, 102, 90, 132, 219, 226, 45, 130, 215, 222, 136, 220, - 215, 86, 138, 45, 236, 51, 171, 82, 209, 46, 216, 42, 200, 32, 112, 1, - 63, 118, 1, 203, 172, 218, 69, 186, 228, 19, 32, 119, 52, 43, 146, 213, - 151, 223, 58, 152, 149, 69, 118, 103, 71, 248, 234, 10, 238, 177, 173, 247, - 149, 126, 147, 227, 194, 215, 109, 157, 205, 72, 122, 108, 220, 143, 21, 188, - 202, 36, 104, 107, 246, 158, 112, 33, 166, 71, 98, 13, 179, 103, 88, 104, - 40, 92, 237, 114, 135, 26, 24, 114, 108, 6, 34, 31, 38, 39, 223, 18, - 162, 6, 24, 196, 122, 204, 121, 13, 100, 135, 215, 128, 51, 208, 13, 232, - 0, 108, 136, 109, 222, 165, 179, 112, 129, 200, 128, 27, 83, 62, 223, 194, - 76, 1, 111, 98, 234, 44, 151, 16, 70, 130, 47, 33, 223, 20, 214, 213, - 156, 145, 143, 146, 173, 144, 91, 98, 28, 134, 219, 232, 159, 161, 17, 187, - 113, 243, 157, 12, 139, 219, 222, 44, 223, 75, 141, 239, 42, 190, 155, 197, - 247, 207, 102, 1, 237, 215, 235, 195, 138, 226, 201, 170, 196, 6, 21, 237, - 165, 188, 227, 132, 145, 144, 162, 202, 209, 104, 177, 47, 11, 218, 31, 247, - 86, 120, 98, 2, 171, 136, 39, 247, 240, 114, 163, 203, 188, 193, 221, 149, - 89, 232, 46, 113, 126, 25, 127, 136, 53, 68, 12, 83, 98, 26, 71, 69, - 18, 59, 208, 196, 43, 190, 146, 224, 37, 91, 56, 252, 155, 101, 152, 242, - 20, 78, 144, 43, 49, 69, 114, 212, 51, 151, 40, 252, 236, 129, 102, 72, - 253, 195, 100, 56, 79, 225, 140, 165, 187, 100, 187, 94, 24, 62, 244, 83, - 120, 63, 99, 223, 244, 229, 117, 50, 122, 251, 158, 211, 223, 39, 42, 124, - 135, 64, 116, 175, 79, 110, 23, 14, 151, 212, 184, 239, 253, 220, 71, 164, - 79, 17, 59, 96, 45, 26, 166, 29, 57, 90, 41, 196, 224, 242, 187, 18, - 145, 95, 99, 32, 147, 138, 89, 83, 102, 243, 145, 236, 206, 150, 50, 205, - 148, 176, 196, 195, 134, 185, 215, 111, 24, 114, 240, 143, 64, 144, 134, 130, - 243, 237, 33, 232, 43, 8, 227, 246, 143, 225, 93, 105, 255, 167, 126, 201, - 233, 236, 50, 216, 216, 86, 165, 127, 253, 75, 10, 207, 182, 201, 201, 175, - 205, 126, 70, 219, 106, 36, 248, 38, 17, 123, 22, 33, 138, 160, 102, 128, - 83, 158, 42, 95, 113, 222, 130, 161, 96, 226, 100, 234, 186, 209, 6, 161, - 55, 236, 215, 54, 252, 107, 192, 191, 209, 91, 112, 83, 42, 183, 251, 19, - 242, 173, 248, 104, 30, 219, 12, 10, 247, 230, 224, 82, 33, 114, 57, 53, - 136, 70, 16, 142, 33, 1, 122, 178, 196, 196, 46, 54, 56, 131, 231, 254, - 50, 83, 236, 87, 126, 128, 139, 38, 19, 49, 103, 23, 60, 250, 174, 191, - 249, 92, 89, 37, 231, 1, 108, 160, 93, 187, 5, 132, 251, 116, 145, 62, - 33, 14, 82, 205, 40, 240, 45, 115, 96, 29, 248, 122, 159, 236, 220, 235, - 151, 144, 246, 59, 114, 33, 124, 131, 109, 4, 70, 193, 147, 87, 111, 148, - 57, 70, 209, 121, 20, 157, 69, 33, 174, 2, 55, 202, 2, 163, 36, 120, - 148, 196, 27, 227, 21, 194, 157, 68, 32, 68, 47, 145, 233, 103, 206, 126, - 22, 50, 245, 154, 246, 251, 40, 166, 127, 19, 238, 109, 48, 120, 222, 152, - 151, 231, 246, 13, 122, 90, 110, 73, 37, 248, 185, 129, 157, 187, 254, 184, - 37, 237, 209, 181, 46, 19, 44, 252, 77, 4, 6, 5, 134, 230, 201, 251, - 178, 20, 129, 135, 104, 30, 168, 70, 54, 156, 144, 24, 108, 234, 54, 246, - 182, 164, 155, 160, 208, 19, 168, 68, 193, 249, 215, 223, 176, 156, 153, 250, - 215, 51, 139, 186, 185, 193, 214, 222, 235, 239, 219, 229, 254, 190, 127, 165, - 128, 209, 104, 151, 50, 69, 134, 53, 204, 87, 77, 241, 161, 19, 213, 69, - 81, 3, 236, 45, 69, 70, 117, 73, 75, 124, 142, 155, 55, 141, 194, 10, - 226, 221, 231, 191, 228, 48, 248, 119, 230, 109, 92, 100, 112, 249, 15, 18, - 113, 87, 202, 121, 233, 113, 43, 80, 220, 206, 205, 240, 165, 145, 223, 57, - 74, 63, 70, 68, 87, 21, 22, 74, 239, 28, 97, 24, 194, 249, 195, 228, - 21, 246, 68, 43, 122, 159, 226, 219, 168, 180, 157, 77, 233, 3, 173, 204, - 96, 100, 33, 184, 40, 90, 151, 62, 249, 101, 95, 161, 155, 41, 149, 139, - 151, 82, 184, 100, 84, 59, 82, 217, 108, 193, 138, 138, 203, 124, 145, 84, - 44, 151, 40, 182, 127, 94, 73, 179, 226, 197, 33, 222, 153, 131, 201, 248, - 61, 61, 233, 231, 148, 57, 158, 73, 157, 106, 132, 23, 48, 177, 161, 63, - 208, 147, 105, 53, 37, 16, 158, 89, 69, 73, 149, 73, 19, 248, 27, 99, - 121, 48, 71, 80, 132, 48, 226, 156, 70, 60, 46, 159, 94, 187, 181, 96, - 232, 139, 29, 250, 18, 20, 213, 4, 225, 130, 154, 132, 173, 112, 178, 79, - 155, 193, 150, 93, 58, 230, 152, 244, 184, 213, 157, 195, 87, 142, 10, 176, - 110, 191, 165, 42, 112, 253, 74, 23, 97, 84, 177, 252, 137, 230, 100, 126, - 63, 200, 191, 248, 118, 7, 88, 2, 150, 15, 78, 35, 248, 22, 128, 121, - 221, 175, 89, 64, 22, 47, 102, 20, 233, 240, 102, 65, 201, 216, 250, 52, - 122, 25, 110, 138, 50, 194, 144, 198, 30, 10, 155, 52, 86, 237, 71, 153, - 93, 204, 31, 97, 195, 130, 122, 8, 164, 39, 67, 16, 137, 24, 68, 134, - 193, 245, 128, 197, 242, 194, 147, 142, 140, 22, 250, 33, 60, 121, 97, 74, - 93, 4, 254, 85, 12, 119, 55, 30, 79, 201, 113, 0, 126, 234, 184, 219, - 129, 103, 215, 222, 219, 32, 174, 148, 74, 11, 172, 43, 169, 103, 165, 215, - 252, 75, 248, 143, 74, 235, 183, 91, 68, 146, 73, 47, 168, 250, 59, 228, - 245, 1, 102, 26, 222, 123, 11, 68, 137, 149, 5, 109, 184, 151, 206, 8, - 24, 237, 176, 249, 61, 68, 75, 152, 249, 253, 57, 204, 212, 115, 120, 21, - 115, 47, 145, 84, 198, 189, 230, 15, 194, 141, 239, 57, 245, 119, 245, 27, - 11, 244, 71, 161, 72, 145, 96, 96, 67, 88, 27, 109, 44, 1, 28, 136, - 51, 207, 152, 83, 178, 245, 44, 104, 72, 12, 164, 213, 38, 61, 100, 45, - 120, 130, 10, 247, 187, 19, 142, 194, 46, 43, 223, 115, 79, 12, 199, 253, - 169, 58, 109, 209, 100, 3, 191, 228, 152, 79, 194, 22, 233, 134, 124, 110, - 145, 171, 58, 32, 204, 25, 181, 44, 52, 226, 249, 78, 140, 222, 249, 121, - 139, 8, 24, 33, 110, 185, 132, 233, 181, 191, 92, 57, 101, 51, 157, 100, - 28, 169, 93, 161, 148, 224, 126, 232, 174, 227, 35, 200, 0, 95, 17, 199, - 215, 83, 225, 149, 163, 55, 52, 155, 118, 206, 222, 92, 70, 107, 200, 221, - 17, 15, 145, 95, 134, 233, 80, 113, 10, 242, 242, 130, 49, 187, 106, 255, - 184, 251, 92, 67, 44, 25, 80, 123, 233, 188, 84, 162, 243, 114, 27, 0, - 66, 92, 98, 175, 63, 130, 205, 73, 183, 43, 185, 79, 255, 8, 186, 52, - 95, 50, 210, 231, 161, 169, 42, 71, 251, 39, 222, 0, 209, 64, 130, 57, - 192, 203, 136, 186, 34, 91, 6, 162, 156, 225, 11, 15, 187, 182, 97, 58, - 134, 69, 43, 247, 250, 48, 147, 219, 143, 111, 1, 143, 71, 94, 20, 114, - 99, 3, 125, 13, 22, 133, 20, 54, 183, 105, 172, 255, 246, 27, 94, 192, - 168, 37, 121, 20, 175, 105, 16, 179, 96, 28, 221, 238, 3, 50, 12, 16, - 9, 150, 159, 184, 15, 216, 39, 96, 142, 158, 216, 114, 218, 200, 41, 92, - 110, 98, 28, 227, 130, 93, 121, 59, 132, 38, 184, 67, 173, 65, 118, 5, - 42, 41, 112, 91, 120, 146, 128, 234, 56, 11, 81, 96, 56, 70, 8, 38, - 37, 219, 94, 20, 201, 34, 111, 146, 39, 103, 178, 187, 195, 42, 42, 210, - 166, 173, 5, 200, 87, 60, 184, 129, 0, 26, 166, 28, 24, 18, 57, 212, - 47, 138, 12, 34, 1, 194, 106, 224, 125, 179, 11, 219, 184, 240, 16, 110, - 135, 136, 146, 49, 252, 83, 243, 178, 226, 152, 67, 98, 197, 193, 31, 98, - 197, 185, 131, 64, 34, 188, 217, 242, 16, 228, 224, 211, 129, 136, 52, 144, - 3, 21, 8, 36, 110, 156, 45, 106, 124, 184, 35, 12, 39, 84, 86, 50, - 44, 15, 12, 253, 62, 148, 97, 93, 50, 166, 240, 148, 244, 233, 67, 228, - 22, 194, 7, 127, 50, 146, 238, 95, 52, 185, 34, 223, 161, 108, 68, 203, - 132, 184, 151, 49, 13, 207, 6, 134, 56, 158, 17, 135, 127, 209, 89, 84, - 16, 205, 240, 233, 22, 148, 2, 2, 19, 20, 200, 57, 128, 2, 14, 158, - 7, 199, 99, 128, 150, 46, 228, 208, 202, 18, 237, 49, 224, 13, 216, 178, - 113, 7, 46, 31, 79, 111, 66, 5, 233, 217, 99, 153, 133, 32, 229, 156, - 148, 169, 39, 148, 234, 36, 255, 16, 99, 137, 219, 3, 100, 95, 137, 69, - 126, 192, 206, 121, 140, 211, 40, 196, 99, 1, 9, 239, 73, 134, 74, 146, - 233, 53, 157, 23, 114, 70, 93, 202, 35, 33, 49, 79, 30, 144, 135, 255, - 84, 254, 84, 233, 80, 66, 88, 137, 125, 97, 200, 232, 152, 57, 94, 176, - 175, 129, 177, 90, 37, 100, 101, 147, 131, 184, 32, 237, 40, 218, 215, 138, - 242, 179, 242, 45, 207, 164, 29, 228, 162, 239, 35, 170, 197, 58, 212, 202, - 220, 7, 20, 14, 43, 210, 155, 147, 23, 8, 14, 222, 185, 66, 144, 63, - 58, 223, 158, 107, 53, 89, 101, 182, 65, 68, 190, 139, 154, 110, 103, 104, - 191, 59, 169, 254, 12, 61, 132, 187, 22, 146, 103, 173, 83, 62, 152, 18, - 220, 106, 243, 217, 244, 139, 152, 25, 85, 226, 127, 198, 47, 215, 157, 77, - 17, 217, 35, 194, 78, 137, 92, 57, 14, 17, 242, 164, 90, 61, 7, 147, - 29, 141, 4, 184, 84, 153, 64, 36, 49, 144, 1, 105, 249, 252, 122, 77, - 3, 249, 132, 57, 156, 65, 153, 119, 75, 48, 84, 171, 7, 101, 167, 225, - 101, 222, 232, 48, 63, 174, 165, 227, 120, 135, 235, 121, 13, 149, 2, 140, - 56, 220, 76, 104, 238, 133, 207, 191, 88, 9, 252, 239, 154, 15, 155, 68, - 1, 176, 13, 77, 128, 167, 36, 237, 167, 174, 89, 123, 91, 45, 8, 181, - 11, 124, 185, 36, 104, 124, 97, 194, 8, 100, 250, 133, 4, 20, 118, 193, - 4, 17, 113, 13, 121, 255, 14, 105, 65, 48, 31, 25, 48, 175, 252, 162, - 202, 4, 184, 132, 95, 255, 22, 172, 119, 208, 143, 146, 239, 141, 171, 184, - 68, 236, 149, 108, 190, 238, 245, 167, 213, 90, 215, 160, 141, 20, 51, 208, - 228, 56, 74, 252, 255, 202, 202, 175, 247, 153, 247, 255, 238, 179, 191, 154, - 94, 93, 202, 227, 103, 255, 191, 156, 126, 249, 253, 63, 74, 253, 223, 94, - 255, 159, 77, 255, 163, 247, 123, 195, 113, 134, 133, 13, 116, 163, 63, 238, - 209, 88, 80, 181, 12, 30, 130, 235, 26, 126, 84, 138, 156, 145, 19, 136, - 100, 130, 81, 196, 176, 129, 185, 141, 32, 174, 152, 41, 67, 216, 13, 150, - 253, 81, 20, 216, 150, 195, 15, 14, 89, 182, 215, 70, 218, 70, 90, 92, - 45, 124, 42, 75, 214, 247, 34, 46, 172, 150, 28, 176, 25, 187, 227, 47, - 88, 44, 11, 139, 10, 49, 231, 75, 97, 68, 250, 200, 105, 32, 113, 165, - 175, 203, 243, 58, 4, 133, 49, 12, 62, 161, 47, 180, 92, 178, 208, 200, - 239, 225, 128, 141, 43, 56, 228, 139, 188, 126, 210, 28, 111, 230, 236, 38, - 96, 91, 236, 73, 148, 158, 88, 236, 9, 222, 4, 80, 193, 129, 228, 28, - 148, 255, 64, 158, 15, 16, 145, 17, 217, 39, 171, 168, 2, 129, 38, 10, - 99, 51, 201, 55, 219, 88, 62, 239, 87, 244, 0, 49, 30, 225, 165, 158, - 146, 177, 6, 88, 110, 179, 155, 7, 253, 49, 7, 123, 138, 176, 247, 67, - 214, 224, 67, 134, 183, 213, 233, 83, 22, 239, 166, 28, 80, 98, 184, 121, - 72, 174, 79, 98, 249, 146, 88, 190, 36, 234, 250, 36, 80, 178, 129, 155, - 4, 239, 220, 36, 233, 119, 147, 88, 190, 36, 150, 72, 18, 249, 182, 46, - 114, 221, 23, 217, 41, 18, 9, 42, 66, 233, 130, 163, 174, 13, 41, 80, - 47, 163, 81, 103, 215, 251, 131, 57, 202, 66, 106, 68, 54, 233, 129, 182, - 65, 17, 176, 157, 31, 32, 107, 186, 33, 66, 32, 108, 213, 8, 204, 119, - 29, 156, 100, 183, 61, 34, 228, 135, 124, 57, 98, 185, 122, 154, 106, 122, - 202, 231, 167, 169, 248, 80, 215, 127, 188, 188, 113, 17, 221, 35, 124, 215, - 136, 33, 140, 17, 136, 73, 170, 1, 251, 250, 237, 28, 233, 59, 3, 107, - 141, 250, 92, 142, 183, 149, 173, 96, 151, 32, 83, 4, 159, 181, 192, 183, - 25, 207, 133, 145, 128, 199, 108, 192, 221, 233, 149, 217, 70, 218, 119, 190, - 202, 15, 245, 25, 145, 205, 100, 96, 12, 153, 237, 180, 3, 9, 213, 54, - 164, 242, 89, 126, 207, 195, 98, 28, 46, 155, 116, 4, 124, 198, 48, 180, - 243, 236, 77, 83, 67, 218, 235, 78, 70, 112, 3, 201, 60, 167, 106, 101, - 194, 127, 116, 252, 38, 154, 176, 133, 170, 15, 141, 42, 102, 14, 155, 124, - 110, 153, 237, 53, 216, 22, 231, 255, 155, 158, 147, 197, 166, 49, 36, 27, - 128, 1, 200, 85, 195, 111, 210, 14, 234, 142, 199, 85, 89, 186, 220, 148, - 165, 114, 187, 250, 108, 202, 210, 14, 94, 246, 208, 157, 73, 58, 133, 203, - 179, 73, 189, 222, 230, 193, 135, 19, 136, 90, 130, 139, 223, 164, 242, 255, - 251, 255, 140, 64, 236, 154, 88, 29, 136, 189, 41, 133, 53, 69, 85, 34, - 155, 82, 25, 155, 211, 83, 123, 41, 92, 236, 111, 74, 7, 165, 195, 179, - 216, 229, 65, 233, 252, 242, 42, 166, 38, 178, 186, 162, 68, 62, 208, 140, - 8, 187, 82, 164, 183, 115, 186, 3, 249, 33, 217, 230, 214, 127, 90, 175, - 190, 107, 181, 72, 232, 89, 208, 44, 212, 197, 204, 96, 49, 37, 49, 118, - 96, 201, 199, 12, 220, 164, 243, 245, 32, 202, 18, 74, 36, 151, 35, 225, - 128, 173, 253, 112, 19, 228, 166, 138, 24, 39, 192, 7, 139, 151, 63, 59, - 229, 113, 43, 83, 125, 103, 43, 120, 231, 217, 19, 139, 33, 35, 36, 54, - 54, 42, 104, 68, 248, 70, 139, 135, 8, 73, 117, 241, 150, 198, 115, 193, - 128, 8, 91, 88, 183, 250, 220, 244, 168, 44, 247, 100, 193, 163, 9, 165, - 138, 233, 107, 32, 3, 28, 175, 179, 192, 235, 131, 215, 205, 126, 22, 15, - 149, 57, 80, 174, 8, 106, 83, 208, 35, 195, 153, 14, 178, 176, 48, 201, - 61, 81, 4, 172, 139, 108, 228, 130, 161, 114, 48, 194, 183, 63, 229, 109, - 60, 118, 137, 214, 24, 219, 82, 90, 130, 125, 37, 227, 23, 243, 83, 139, - 109, 50, 205, 51, 23, 144, 112, 5, 96, 25, 99, 86, 113, 221, 225, 137, - 181, 84, 206, 34, 107, 17, 121, 236, 160, 63, 130, 123, 16, 106, 17, 225, - 128, 45, 19, 232, 185, 143, 122, 73, 11, 126, 85, 246, 107, 193, 255, 85, - 156, 183, 26, 54, 138, 92, 15, 144, 234, 87, 139, 252, 251, 225, 42, 110, - 69, 30, 41, 218, 86, 224, 1, 245, 175, 97, 19, 247, 238, 16, 19, 183, - 67, 138, 60, 251, 69, 65, 101, 53, 123, 162, 242, 39, 4, 112, 214, 166, - 39, 210, 99, 48, 192, 117, 136, 100, 105, 197, 207, 97, 176, 106, 1, 247, - 8, 71, 145, 71, 111, 114, 144, 8, 90, 243, 48, 161, 6, 189, 92, 207, - 46, 77, 148, 38, 81, 27, 228, 121, 37, 160, 252, 17, 166, 84, 39, 34, - 100, 92, 240, 243, 65, 137, 160, 51, 87, 184, 202, 86, 149, 92, 75, 164, - 209, 30, 226, 111, 28, 7, 129, 81, 27, 33, 207, 84, 116, 159, 67, 173, - 50, 85, 129, 246, 239, 188, 161, 123, 36, 155, 246, 130, 162, 225, 203, 116, - 95, 134, 251, 14, 46, 213, 176, 100, 227, 175, 9, 51, 255, 156, 46, 160, - 249, 242, 120, 17, 206, 71, 30, 52, 228, 232, 5, 233, 196, 86, 248, 142, - 26, 226, 198, 164, 50, 173, 42, 54, 118, 32, 246, 22, 132, 69, 33, 12, - 218, 23, 69, 0, 20, 46, 68, 236, 185, 27, 123, 46, 98, 207, 89, 236, - 182, 19, 155, 132, 22, 236, 205, 57, 72, 45, 243, 239, 185, 185, 138, 114, - 203, 156, 115, 233, 218, 88, 70, 120, 96, 127, 207, 217, 244, 192, 150, 17, - 197, 117, 92, 125, 170, 11, 13, 65, 94, 232, 38, 240, 192, 186, 131, 131, - 131, 158, 143, 196, 115, 164, 202, 182, 97, 246, 66, 18, 236, 185, 243, 28, - 101, 14, 158, 79, 84, 234, 197, 203, 27, 60, 21, 215, 53, 224, 205, 119, - 147, 250, 79, 208, 98, 203, 129, 188, 184, 103, 189, 217, 145, 89, 78, 143, - 174, 182, 0, 143, 55, 30, 200, 240, 89, 116, 26, 221, 145, 199, 241, 232, - 13, 158, 225, 4, 148, 127, 248, 5, 71, 5, 124, 100, 236, 152, 37, 255, - 139, 194, 199, 4, 199, 216, 147, 99, 175, 170, 60, 98, 116, 65, 54, 235, - 221, 56, 193, 217, 49, 26, 202, 14, 6, 185, 135, 129, 194, 173, 4, 36, - 187, 0, 103, 89, 2, 177, 243, 59, 234, 123, 202, 127, 106, 241, 204, 91, - 0, 173, 115, 11, 2, 111, 22, 249, 15, 249, 38, 106, 45, 184, 42, 105, - 125, 72, 173, 110, 146, 25, 59, 201, 153, 15, 18, 109, 198, 148, 136, 204, - 55, 78, 50, 155, 69, 101, 174, 220, 125, 228, 253, 216, 97, 194, 103, 231, - 59, 201, 34, 197, 8, 246, 88, 135, 145, 132, 23, 31, 58, 143, 95, 114, - 166, 28, 16, 153, 227, 96, 227, 151, 56, 25, 195, 78, 204, 189, 197, 200, - 191, 227, 159, 111, 240, 245, 57, 140, 204, 102, 48, 192, 244, 205, 202, 239, - 202, 55, 53, 136, 150, 84, 140, 36, 132, 121, 190, 245, 133, 63, 108, 32, - 74, 152, 87, 30, 152, 224, 103, 15, 151, 8, 73, 231, 12, 31, 215, 5, - 210, 101, 90, 146, 181, 58, 102, 79, 243, 174, 213, 49, 143, 26, 79, 126, - 227, 197, 71, 249, 105, 50, 50, 4, 77, 158, 215, 164, 240, 239, 106, 78, - 8, 236, 143, 100, 130, 114, 121, 255, 103, 204, 13, 221, 165, 211, 197, 98, - 90, 75, 218, 97, 142, 36, 118, 54, 78, 56, 14, 179, 54, 100, 255, 213, - 91, 25, 229, 3, 164, 84, 127, 60, 182, 136, 175, 171, 241, 187, 43, 57, - 206, 251, 146, 0, 70, 215, 147, 244, 15, 214, 119, 209, 192, 30, 72, 202, - 128, 183, 213, 223, 165, 83, 95, 5, 8, 89, 245, 21, 96, 248, 137, 75, - 45, 42, 214, 110, 172, 2, 123, 11, 106, 170, 133, 246, 218, 227, 104, 198, - 171, 43, 143, 32, 150, 89, 237, 114, 19, 135, 149, 243, 20, 206, 195, 174, - 184, 76, 236, 67, 201, 3, 204, 140, 127, 72, 187, 96, 63, 141, 222, 188, - 252, 79, 175, 232, 234, 43, 60, 125, 99, 42, 82, 214, 34, 162, 244, 11, - 153, 192, 65, 179, 187, 56, 233, 20, 8, 237, 195, 144, 63, 85, 82, 13, - 106, 248, 125, 79, 251, 221, 169, 129, 244, 143, 206, 120, 230, 220, 127, 68, - 15, 186, 144, 188, 81, 120, 3, 115, 188, 79, 58, 255, 35, 171, 77, 242, - 53, 35, 181, 161, 78, 57, 56, 129, 162, 71, 40, 252, 129, 233, 54, 55, - 48, 48, 134, 70, 196, 240, 157, 61, 162, 246, 28, 10, 234, 249, 114, 162, - 107, 191, 34, 177, 209, 248, 79, 232, 23, 123, 253, 225, 160, 221, 239, 246, - 91, 104, 82, 229, 110, 113, 28, 227, 185, 154, 49, 131, 105, 20, 205, 157, - 184, 69, 19, 34, 54, 98, 190, 200, 247, 109, 58, 194, 251, 96, 216, 7, - 73, 107, 20, 249, 119, 168, 32, 157, 66, 121, 218, 229, 63, 160, 128, 100, - 231, 136, 235, 219, 7, 237, 130, 254, 107, 148, 145, 206, 197, 127, 187, 58, - 176, 221, 123, 194, 73, 4, 87, 80, 77, 135, 82, 103, 178, 178, 248, 85, - 53, 77, 206, 170, 114, 54, 33, 107, 106, 6, 87, 80, 136, 107, 188, 80, - 212, 180, 172, 38, 50, 178, 166, 37, 228, 4, 198, 149, 51, 138, 156, 214, - 96, 158, 248, 43, 202, 36, 102, 236, 145, 9, 147, 90, 197, 226, 170, 18, - 139, 93, 233, 16, 52, 102, 219, 254, 70, 95, 10, 47, 169, 148, 32, 14, - 166, 25, 103, 112, 165, 30, 255, 154, 241, 102, 252, 0, 193, 92, 97, 240, - 177, 214, 9, 50, 89, 163, 119, 114, 67, 223, 209, 60, 65, 208, 127, 66, - 207, 20, 198, 208, 223, 36, 214, 75, 84, 39, 216, 11, 82, 63, 208, 13, - 20, 225, 29, 45, 204, 154, 166, 120, 79, 3, 133, 109, 253, 243, 74, 40, - 158, 234, 39, 245, 80, 60, 213, 79, 170, 162, 220, 84, 159, 211, 70, 185, - 241, 223, 83, 72, 209, 127, 254, 209, 100, 177, 225, 180, 118, 180, 176, 44, - 64, 252, 163, 156, 173, 71, 247, 18, 250, 180, 205, 211, 62, 98, 238, 56, - 92, 158, 198, 189, 1, 109, 30, 27, 91, 18, 27, 199, 22, 93, 243, 65, - 141, 143, 73, 179, 69, 57, 136, 212, 142, 126, 203, 95, 42, 237, 227, 34, - 229, 81, 63, 102, 209, 155, 149, 245, 234, 178, 104, 212, 28, 67, 145, 194, - 164, 176, 5, 121, 151, 206, 29, 157, 177, 17, 113, 212, 105, 159, 96, 156, - 134, 37, 139, 28, 158, 138, 30, 5, 212, 17, 172, 118, 69, 254, 164, 87, - 29, 117, 214, 251, 102, 189, 35, 79, 177, 100, 122, 64, 100, 236, 194, 39, - 122, 232, 47, 8, 145, 98, 229, 5, 107, 120, 97, 44, 66, 126, 82, 29, - 196, 39, 68, 102, 89, 2, 71, 117, 196, 22, 138, 21, 205, 209, 249, 35, - 90, 104, 108, 115, 88, 11, 22, 178, 94, 144, 30, 247, 7, 125, 242, 16, - 48, 235, 79, 104, 75, 176, 12, 142, 231, 30, 230, 47, 91, 208, 175, 8, - 192, 35, 111, 102, 31, 185, 200, 250, 129, 239, 212, 212, 170, 93, 197, 123, - 70, 59, 203, 165, 85, 149, 192, 106, 5, 62, 114, 126, 246, 66, 34, 104, - 43, 8, 36, 203, 229, 95, 114, 80, 243, 99, 144, 172, 216, 58, 104, 239, - 145, 145, 212, 136, 117, 91, 160, 160, 32, 20, 1, 179, 141, 7, 201, 221, - 213, 50, 68, 161, 155, 112, 67, 180, 170, 66, 123, 167, 227, 70, 212, 89, - 94, 228, 115, 167, 201, 174, 96, 49, 68, 80, 105, 20, 49, 73, 53, 250, - 117, 60, 132, 204, 186, 93, 242, 249, 65, 72, 110, 16, 17, 190, 18, 71, - 69, 215, 232, 9, 29, 106, 21, 75, 133, 194, 134, 160, 93, 105, 13, 13, - 163, 129, 198, 239, 136, 244, 76, 213, 213, 98, 253, 193, 216, 213, 177, 122, - 33, 47, 150, 70, 3, 97, 205, 182, 225, 165, 94, 131, 99, 102, 200, 187, - 135, 101, 131, 70, 2, 217, 11, 183, 68, 69, 169, 14, 178, 9, 36, 33, - 7, 0, 106, 227, 189, 37, 15, 129, 53, 30, 7, 87, 40, 38, 214, 185, - 129, 241, 208, 136, 65, 20, 178, 95, 247, 112, 53, 18, 117, 134, 107, 52, - 111, 199, 200, 88, 126, 212, 103, 22, 240, 174, 71, 195, 136, 241, 160, 131, - 136, 102, 64, 134, 56, 146, 161, 249, 251, 195, 49, 247, 208, 106, 127, 48, - 138, 93, 196, 115, 180, 33, 90, 102, 160, 34, 77, 150, 176, 63, 79, 170, - 26, 245, 153, 44, 193, 21, 222, 201, 132, 130, 198, 191, 93, 228, 27, 23, - 188, 2, 132, 45, 133, 179, 32, 12, 30, 6, 186, 175, 37, 147, 226, 31, - 145, 163, 138, 40, 66, 242, 201, 105, 91, 15, 20, 157, 18, 69, 213, 71, - 166, 93, 132, 20, 40, 174, 112, 151, 193, 142, 97, 12, 8, 192, 139, 141, - 28, 175, 93, 27, 2, 59, 122, 45, 140, 126, 110, 252, 112, 31, 110, 97, - 29, 239, 124, 41, 78, 227, 188, 107, 236, 38, 89, 185, 87, 110, 95, 222, - 222, 86, 131, 40, 8, 6, 9, 19, 196, 96, 68, 233, 49, 68, 171, 10, - 250, 135, 150, 244, 53, 8, 105, 130, 95, 97, 112, 33, 56, 1, 219, 55, - 123, 198, 88, 56, 72, 214, 68, 114, 67, 30, 61, 190, 5, 35, 204, 82, - 156, 100, 71, 50, 235, 33, 212, 123, 33, 159, 205, 72, 62, 179, 12, 123, - 236, 9, 138, 225, 106, 103, 193, 178, 107, 146, 75, 58, 172, 115, 79, 245, - 201, 144, 208, 147, 132, 86, 117, 2, 194, 42, 122, 124, 71, 184, 4, 199, - 243, 125, 112, 98, 114, 201, 164, 228, 73, 153, 247, 60, 197, 252, 249, 91, - 99, 32, 73, 53, 122, 166, 69, 75, 107, 115, 121, 89, 156, 113, 185, 14, - 85, 57, 95, 156, 183, 60, 202, 129, 134, 163, 135, 131, 91, 104, 88, 231, - 77, 194, 108, 231, 59, 102, 42, 139, 172, 113, 157, 22, 111, 180, 92, 205, - 14, 68, 100, 193, 232, 103, 130, 191, 254, 26, 56, 141, 176, 37, 213, 134, - 70, 181, 19, 142, 240, 214, 90, 142, 134, 97, 88, 39, 183, 182, 34, 204, - 93, 162, 85, 239, 113, 89, 76, 149, 103, 244, 121, 140, 162, 170, 247, 180, - 140, 41, 138, 70, 17, 25, 83, 203, 51, 216, 84, 185, 74, 96, 84, 205, - 201, 194, 128, 155, 9, 29, 104, 194, 205, 36, 76, 16, 25, 64, 148, 177, - 26, 143, 66, 56, 129, 224, 135, 209, 35, 61, 14, 50, 24, 64, 119, 12, - 152, 61, 164, 192, 89, 61, 244, 21, 225, 242, 82, 36, 16, 56, 96, 185, - 26, 211, 14, 35, 164, 110, 204, 120, 47, 177, 0, 244, 208, 25, 206, 191, - 179, 8, 216, 93, 248, 67, 230, 91, 108, 172, 160, 104, 146, 65, 222, 211, - 141, 217, 6, 38, 137, 179, 152, 145, 63, 149, 77, 45, 73, 167, 129, 235, - 134, 149, 133, 161, 97, 51, 170, 70, 126, 133, 215, 13, 216, 93, 140, 221, - 225, 144, 123, 166, 0, 88, 52, 68, 202, 216, 80, 30, 70, 34, 248, 92, - 114, 219, 252, 153, 171, 248, 224, 215, 18, 23, 3, 19, 179, 167, 244, 207, - 60, 251, 210, 147, 73, 77, 104, 34, 255, 210, 147, 197, 110, 44, 118, 247, - 76, 55, 207, 236, 9, 187, 177, 240, 14, 117, 120, 56, 60, 196, 56, 164, - 116, 56, 14, 49, 123, 122, 248, 76, 209, 197, 195, 103, 122, 248, 44, 30, - 154, 158, 103, 207, 254, 116, 32, 56, 174, 38, 180, 76, 143, 61, 26, 166, - 142, 74, 78, 228, 239, 78, 89, 120, 32, 188, 89, 14, 244, 168, 205, 80, - 249, 109, 202, 207, 17, 220, 165, 80, 93, 123, 207, 194, 76, 77, 198, 194, - 244, 77, 174, 33, 239, 153, 114, 143, 2, 196, 115, 17, 32, 244, 214, 125, - 44, 72, 223, 100, 219, 29, 234, 255, 58, 235, 253, 250, 247, 17, 118, 123, - 29, 174, 216, 32, 238, 155, 52, 138, 235, 120, 240, 219, 127, 22, 215, 148, - 143, 204, 12, 106, 182, 86, 71, 33, 255, 40, 131, 12, 56, 97, 237, 138, - 63, 173, 34, 47, 90, 221, 248, 17, 126, 141, 208, 200, 136, 248, 14, 14, - 45, 95, 154, 89, 114, 47, 174, 64, 24, 181, 235, 242, 79, 153, 207, 250, - 65, 106, 214, 75, 194, 254, 2, 7, 86, 202, 255, 89, 148, 154, 117, 21, - 98, 107, 129, 0, 18, 88, 65, 137, 101, 175, 224, 7, 125, 252, 28, 143, - 89, 106, 50, 127, 29, 7, 177, 236, 105, 52, 113, 93, 233, 185, 97, 188, - 163, 47, 20, 250, 61, 161, 174, 123, 80, 144, 221, 134, 104, 121, 216, 131, - 225, 148, 5, 197, 216, 15, 30, 28, 44, 73, 218, 120, 148, 228, 118, 225, - 183, 111, 82, 158, 10, 190, 63, 172, 206, 92, 245, 87, 21, 150, 187, 153, - 244, 62, 143, 246, 211, 24, 36, 210, 14, 74, 153, 2, 229, 166, 109, 84, - 27, 32, 64, 91, 173, 113, 219, 23, 180, 18, 81, 120, 136, 97, 163, 67, - 127, 91, 242, 19, 57, 92, 18, 50, 133, 219, 185, 80, 26, 175, 83, 33, - 21, 231, 35, 123, 251, 175, 60, 55, 82, 93, 87, 45, 169, 109, 216, 213, - 6, 36, 71, 252, 23, 238, 74, 58, 26, 87, 135, 136, 203, 201, 250, 227, - 171, 98, 35, 189, 161, 137, 3, 143, 249, 169, 246, 123, 38, 58, 12, 58, - 89, 26, 8, 150, 4, 95, 120, 85, 80, 172, 141, 220, 18, 145, 247, 59, - 185, 233, 227, 75, 125, 143, 152, 127, 36, 43, 177, 233, 238, 81, 26, 80, - 35, 11, 185, 217, 186, 100, 185, 8, 123, 232, 49, 52, 15, 14, 28, 4, - 216, 249, 216, 79, 81, 52, 97, 78, 253, 149, 65, 173, 58, 77, 157, 83, - 21, 55, 200, 141, 167, 83, 32, 111, 105, 230, 244, 206, 139, 234, 115, 84, - 103, 187, 28, 214, 252, 75, 234, 120, 14, 144, 231, 21, 9, 97, 225, 227, - 213, 18, 100, 28, 175, 147, 48, 4, 70, 222, 188, 87, 186, 172, 49, 138, - 142, 77, 29, 149, 217, 151, 71, 187, 111, 220, 9, 155, 15, 41, 71, 204, - 75, 66, 117, 220, 3, 244, 20, 86, 197, 189, 77, 67, 29, 222, 156, 173, - 81, 198, 11, 217, 74, 99, 131, 183, 175, 231, 43, 163, 157, 17, 39, 1, - 68, 89, 145, 19, 0, 10, 164, 56, 209, 54, 82, 40, 41, 75, 216, 92, - 18, 107, 65, 41, 148, 98, 247, 79, 158, 40, 105, 70, 164, 199, 61, 192, - 67, 153, 119, 246, 81, 130, 79, 92, 74, 203, 175, 65, 118, 58, 26, 92, - 37, 3, 8, 122, 89, 146, 249, 177, 232, 114, 52, 141, 162, 185, 12, 201, - 252, 92, 117, 57, 154, 238, 201, 13, 217, 145, 249, 129, 234, 114, 180, 132, - 39, 55, 100, 70, 230, 84, 137, 15, 4, 8, 131, 75, 229, 128, 238, 84, - 248, 152, 31, 99, 185, 1, 72, 19, 93, 190, 190, 105, 225, 198, 0, 102, - 253, 241, 154, 76, 147, 152, 105, 151, 241, 39, 111, 5, 218, 221, 53, 81, - 82, 60, 10, 242, 38, 67, 148, 117, 185, 164, 121, 20, 228, 75, 134, 215, - 246, 40, 159, 46, 226, 167, 119, 183, 200, 246, 187, 55, 233, 134, 17, 181, - 103, 44, 227, 67, 247, 183, 13, 23, 176, 110, 209, 77, 155, 7, 142, 33, - 96, 252, 40, 15, 251, 99, 144, 145, 51, 202, 6, 108, 175, 44, 172, 1, - 158, 69, 52, 240, 72, 48, 18, 7, 225, 66, 70, 229, 78, 37, 154, 35, - 126, 198, 229, 255, 30, 131, 120, 36, 148, 137, 17, 98, 223, 154, 37, 174, - 106, 147, 202, 196, 70, 136, 47, 68, 211, 65, 20, 157, 102, 223, 26, 59, - 224, 35, 63, 53, 163, 217, 243, 24, 101, 248, 223, 52, 147, 185, 27, 216, - 62, 77, 82, 236, 200, 15, 91, 129, 239, 79, 97, 196, 227, 183, 118, 39, - 147, 19, 120, 173, 143, 175, 156, 139, 131, 189, 185, 250, 21, 63, 182, 187, - 15, 178, 153, 59, 217, 192, 219, 39, 61, 75, 170, 120, 115, 178, 69, 78, - 54, 203, 169, 242, 193, 68, 232, 105, 248, 156, 154, 248, 7, 167, 56, 230, - 114, 141, 61, 19, 99, 235, 113, 76, 13, 240, 158, 95, 18, 9, 96, 210, - 74, 112, 145, 32, 233, 157, 187, 222, 150, 209, 200, 112, 84, 229, 24, 49, - 50, 255, 4, 248, 90, 241, 71, 48, 148, 254, 35, 24, 244, 146, 56, 46, - 13, 13, 191, 224, 96, 199, 24, 232, 62, 159, 218, 100, 104, 79, 17, 192, - 39, 56, 108, 22, 169, 205, 221, 95, 146, 178, 59, 111, 193, 204, 38, 222, - 202, 167, 52, 214, 255, 97, 62, 226, 57, 148, 145, 136, 148, 131, 72, 20, - 33, 231, 124, 17, 126, 14, 196, 127, 91, 57, 253, 101, 75, 175, 43, 155, - 98, 31, 242, 255, 57, 101, 164, 120, 194, 53, 250, 11, 76, 80, 180, 93, - 255, 18, 74, 49, 159, 111, 78, 216, 5, 207, 123, 118, 142, 40, 83, 88, - 201, 222, 164, 130, 205, 168, 71, 248, 125, 160, 55, 231, 207, 169, 160, 240, - 124, 206, 159, 179, 251, 85, 134, 74, 21, 253, 208, 17, 177, 83, 106, 211, - 101, 219, 33, 235, 84, 191, 228, 66, 218, 155, 52, 65, 90, 151, 39, 108, - 168, 135, 71, 14, 91, 253, 10, 43, 226, 198, 44, 30, 74, 190, 5, 223, - 96, 217, 111, 66, 25, 170, 195, 86, 24, 158, 77, 16, 237, 23, 133, 113, - 30, 164, 177, 32, 129, 124, 166, 67, 150, 137, 229, 44, 137, 227, 145, 178, - 108, 187, 89, 206, 87, 179, 156, 175, 100, 57, 122, 82, 108, 225, 67, 164, - 231, 40, 235, 185, 146, 11, 233, 156, 128, 91, 201, 189, 78, 115, 177, 112, - 168, 55, 135, 197, 163, 173, 198, 195, 161, 194, 60, 134, 119, 91, 8, 8, - 151, 216, 134, 152, 242, 84, 134, 39, 177, 41, 203, 112, 132, 104, 134, 248, - 108, 174, 108, 99, 48, 244, 44, 217, 235, 123, 27, 132, 185, 42, 97, 12, - 252, 74, 248, 245, 247, 28, 68, 127, 11, 160, 60, 36, 113, 110, 248, 153, - 202, 126, 83, 114, 72, 204, 165, 33, 234, 237, 64, 66, 78, 48, 163, 149, - 239, 57, 228, 114, 164, 179, 235, 77, 105, 142, 51, 211, 8, 65, 242, 116, - 215, 2, 107, 206, 169, 4, 80, 240, 109, 214, 55, 37, 158, 3, 243, 221, - 217, 70, 48, 120, 97, 7, 242, 10, 47, 140, 33, 73, 0, 188, 20, 127, - 201, 81, 39, 37, 227, 214, 28, 219, 130, 191, 101, 83, 178, 93, 195, 145, - 213, 168, 104, 40, 230, 56, 245, 152, 57, 212, 109, 5, 232, 76, 254, 41, - 132, 189, 28, 13, 153, 27, 33, 214, 187, 111, 146, 137, 96, 117, 84, 16, - 136, 1, 69, 233, 217, 188, 53, 224, 22, 154, 163, 96, 191, 33, 178, 223, - 52, 71, 140, 11, 208, 234, 54, 244, 193, 140, 250, 192, 166, 59, 234, 3, - 170, 3, 246, 193, 140, 250, 128, 53, 96, 200, 102, 69, 67, 244, 63, 118, - 137, 134, 62, 107, 26, 18, 231, 35, 60, 137, 87, 164, 241, 38, 93, 177, - 170, 16, 247, 160, 215, 24, 97, 185, 249, 68, 147, 225, 119, 161, 200, 244, - 181, 192, 251, 103, 240, 182, 24, 226, 140, 59, 12, 56, 227, 249, 54, 117, - 102, 84, 199, 191, 177, 118, 76, 143, 120, 90, 203, 227, 255, 68, 77, 204, - 70, 163, 202, 61, 118, 153, 226, 131, 26, 231, 59, 53, 6, 31, 175, 115, - 199, 231, 45, 71, 95, 151, 173, 56, 135, 216, 182, 51, 94, 63, 211, 86, - 108, 188, 114, 246, 34, 27, 198, 235, 108, 101, 188, 210, 215, 198, 123, 197, - 246, 140, 87, 27, 199, 235, 76, 117, 154, 155, 170, 4, 127, 97, 12, 127, - 56, 94, 183, 189, 227, 213, 102, 112, 191, 158, 193, 106, 127, 48, 88, 233, - 99, 243, 12, 86, 91, 97, 131, 181, 173, 126, 52, 88, 231, 203, 9, 148, - 79, 15, 214, 185, 59, 88, 231, 107, 6, 235, 220, 63, 88, 231, 132, 44, - 233, 14, 214, 207, 76, 24, 172, 245, 168, 100, 56, 60, 231, 84, 200, 40, - 187, 252, 55, 12, 86, 54, 34, 237, 109, 234, 170, 104, 10, 255, 198, 102, - 177, 20, 14, 86, 207, 56, 134, 162, 181, 161, 0, 177, 54, 27, 199, 31, - 14, 214, 249, 59, 131, 117, 238, 44, 68, 33, 26, 211, 108, 45, 162, 107, - 120, 68, 229, 87, 254, 185, 194, 255, 220, 151, 198, 253, 4, 93, 188, 189, - 39, 38, 219, 4, 44, 63, 3, 23, 195, 244, 108, 192, 138, 129, 156, 47, - 90, 44, 164, 70, 160, 55, 45, 68, 163, 15, 140, 114, 175, 170, 242, 39, - 139, 199, 0, 2, 66, 13, 140, 221, 19, 32, 134, 238, 250, 42, 135, 144, - 203, 4, 158, 21, 156, 103, 206, 90, 139, 207, 240, 81, 163, 143, 168, 136, - 106, 148, 27, 27, 135, 10, 48, 98, 34, 113, 124, 72, 48, 136, 240, 54, - 109, 35, 52, 122, 147, 68, 35, 23, 183, 67, 214, 91, 96, 34, 133, 122, - 48, 98, 70, 72, 98, 193, 228, 184, 90, 181, 75, 112, 246, 220, 158, 95, - 122, 186, 148, 159, 142, 228, 167, 93, 114, 235, 70, 25, 23, 173, 169, 159, - 186, 40, 114, 124, 207, 101, 252, 161, 152, 6, 3, 159, 70, 237, 106, 163, - 63, 243, 30, 87, 49, 68, 171, 42, 154, 249, 195, 6, 118, 135, 73, 28, - 32, 171, 211, 235, 70, 131, 161, 57, 254, 144, 135, 22, 117, 80, 41, 146, - 79, 47, 9, 63, 2, 46, 142, 114, 151, 248, 179, 203, 126, 252, 37, 203, - 41, 155, 25, 95, 40, 83, 98, 137, 67, 72, 40, 29, 17, 167, 108, 250, - 129, 40, 184, 80, 146, 101, 133, 66, 206, 216, 63, 195, 161, 237, 40, 18, - 59, 120, 247, 221, 2, 73, 200, 14, 240, 182, 242, 28, 179, 164, 18, 142, - 53, 123, 18, 11, 225, 108, 191, 147, 208, 46, 62, 209, 150, 110, 82, 78, - 104, 26, 75, 227, 19, 121, 53, 172, 40, 179, 174, 35, 80, 217, 215, 4, - 206, 93, 206, 158, 157, 53, 40, 194, 109, 170, 172, 188, 28, 4, 138, 75, - 124, 90, 12, 132, 106, 89, 18, 13, 32, 117, 29, 25, 209, 9, 98, 154, - 51, 38, 41, 178, 14, 147, 154, 85, 60, 31, 1, 209, 150, 139, 138, 221, - 135, 199, 0, 142, 27, 132, 198, 164, 31, 84, 100, 202, 41, 52, 32, 244, - 131, 251, 35, 50, 68, 32, 106, 17, 217, 224, 159, 68, 25, 157, 150, 54, - 200, 96, 110, 51, 33, 69, 233, 10, 228, 33, 126, 145, 96, 143, 208, 28, - 159, 145, 48, 4, 182, 249, 121, 182, 2, 147, 152, 2, 187, 221, 183, 95, - 37, 178, 134, 127, 213, 217, 141, 69, 42, 55, 24, 168, 73, 36, 116, 120, - 147, 134, 40, 141, 214, 25, 6, 200, 90, 210, 110, 161, 79, 209, 19, 116, - 178, 32, 109, 8, 11, 188, 141, 77, 130, 11, 65, 252, 186, 161, 36, 180, - 133, 9, 65, 28, 138, 159, 114, 189, 61, 236, 247, 12, 108, 210, 84, 194, - 78, 37, 224, 163, 70, 232, 239, 84, 66, 51, 123, 45, 144, 19, 131, 5, - 115, 87, 173, 89, 197, 193, 189, 150, 236, 222, 31, 102, 159, 171, 71, 135, - 243, 252, 145, 61, 104, 28, 95, 142, 238, 111, 178, 221, 90, 239, 114, 112, - 119, 155, 56, 45, 62, 95, 180, 240, 95, 161, 188, 51, 207, 239, 21, 22, - 133, 197, 157, 178, 103, 153, 117, 251, 190, 155, 188, 57, 41, 90, 211, 81, - 243, 74, 233, 21, 210, 214, 184, 52, 200, 22, 211, 131, 170, 209, 52, 82, - 247, 139, 243, 222, 109, 215, 50, 122, 205, 163, 222, 213, 96, 97, 12, 149, - 198, 185, 122, 123, 105, 93, 236, 237, 94, 148, 238, 179, 87, 179, 118, 123, - 255, 162, 115, 55, 155, 159, 94, 236, 236, 116, 107, 7, 207, 247, 187, 227, - 118, 235, 242, 114, 183, 218, 62, 172, 246, 118, 90, 173, 129, 122, 90, 78, - 95, 228, 91, 167, 243, 78, 122, 63, 63, 232, 239, 93, 52, 146, 137, 202, - 120, 175, 223, 155, 151, 206, 142, 227, 205, 180, 61, 181, 226, 157, 120, 101, - 222, 212, 227, 197, 180, 21, 173, 232, 201, 131, 235, 214, 217, 249, 75, 49, - 187, 136, 239, 31, 215, 95, 198, 213, 219, 84, 182, 254, 114, 208, 59, 205, - 44, 210, 35, 189, 62, 42, 105, 247, 247, 231, 241, 116, 254, 236, 104, 49, - 56, 110, 207, 170, 199, 187, 139, 254, 177, 221, 218, 201, 198, 167, 227, 100, - 178, 144, 105, 78, 75, 85, 123, 210, 214, 211, 197, 243, 73, 118, 103, 94, - 124, 222, 29, 20, 239, 162, 165, 231, 131, 232, 121, 175, 115, 119, 52, 57, - 95, 52, 107, 105, 189, 114, 125, 57, 81, 147, 153, 108, 69, 89, 216, 90, - 169, 50, 201, 220, 23, 250, 202, 126, 205, 106, 39, 212, 253, 11, 187, 112, - 149, 236, 29, 159, 167, 167, 213, 94, 124, 154, 62, 79, 142, 174, 143, 245, - 228, 94, 203, 168, 77, 231, 102, 181, 25, 109, 233, 207, 151, 147, 227, 221, - 120, 255, 232, 217, 40, 148, 6, 47, 213, 222, 113, 103, 94, 216, 159, 214, - 244, 150, 110, 30, 69, 211, 227, 169, 245, 220, 203, 84, 211, 170, 17, 223, - 105, 70, 147, 165, 202, 249, 93, 163, 212, 79, 20, 246, 102, 213, 219, 161, - 150, 168, 159, 39, 39, 53, 235, 94, 51, 58, 199, 119, 169, 210, 126, 107, - 86, 220, 191, 28, 23, 47, 174, 178, 19, 189, 119, 105, 14, 95, 42, 139, - 241, 56, 121, 86, 173, 170, 202, 115, 95, 41, 102, 155, 245, 234, 125, 244, - 250, 182, 213, 110, 118, 143, 103, 71, 187, 147, 134, 53, 152, 207, 158, 175, - 174, 139, 139, 231, 122, 35, 222, 172, 22, 245, 206, 238, 177, 58, 61, 170, - 100, 51, 55, 183, 141, 70, 170, 166, 237, 38, 250, 167, 99, 189, 121, 156, - 62, 169, 29, 38, 163, 211, 253, 189, 248, 206, 254, 69, 169, 167, 216, 165, - 171, 203, 97, 58, 13, 13, 53, 41, 222, 95, 55, 174, 23, 243, 43, 101, - 156, 53, 206, 139, 241, 228, 173, 81, 171, 233, 205, 140, 113, 222, 120, 185, - 205, 198, 15, 250, 90, 37, 31, 63, 106, 167, 170, 147, 59, 187, 182, 83, - 40, 28, 143, 242, 231, 137, 204, 249, 126, 252, 170, 62, 181, 246, 166, 197, - 238, 248, 185, 54, 205, 47, 226, 249, 248, 101, 161, 114, 83, 186, 234, 86, - 171, 41, 123, 88, 157, 204, 106, 71, 201, 164, 113, 157, 156, 237, 156, 215, - 6, 247, 189, 19, 179, 218, 29, 244, 79, 172, 65, 249, 126, 239, 62, 165, - 223, 222, 68, 135, 151, 45, 123, 209, 188, 205, 90, 74, 101, 24, 199, 241, - 89, 81, 123, 141, 243, 155, 108, 85, 211, 211, 125, 253, 252, 236, 42, 90, - 237, 157, 204, 244, 139, 236, 126, 89, 207, 95, 218, 141, 226, 69, 162, 216, - 187, 171, 91, 137, 187, 98, 186, 155, 137, 94, 39, 231, 181, 252, 254, 75, - 98, 208, 26, 53, 19, 205, 210, 240, 185, 93, 191, 61, 108, 151, 235, 47, - 103, 201, 196, 244, 118, 172, 220, 91, 201, 104, 116, 116, 92, 239, 143, 59, - 133, 179, 186, 122, 254, 60, 24, 31, 93, 38, 230, 207, 179, 84, 161, 116, - 255, 82, 219, 157, 68, 231, 253, 179, 249, 244, 250, 178, 249, 60, 49, 46, - 14, 227, 11, 245, 38, 155, 185, 187, 60, 234, 103, 166, 183, 55, 170, 150, - 41, 93, 93, 45, 140, 163, 238, 192, 184, 237, 220, 143, 119, 146, 187, 201, - 209, 205, 113, 125, 81, 188, 218, 79, 236, 245, 238, 163, 247, 189, 65, 166, - 150, 58, 159, 167, 43, 135, 187, 217, 226, 254, 249, 77, 52, 211, 94, 68, - 213, 231, 244, 201, 56, 27, 237, 156, 222, 228, 231, 123, 74, 66, 215, 247, - 243, 227, 158, 121, 188, 216, 155, 142, 15, 238, 167, 165, 178, 57, 142, 63, - 71, 107, 214, 96, 116, 119, 84, 59, 76, 141, 207, 50, 227, 188, 121, 217, - 188, 180, 18, 209, 61, 181, 180, 56, 58, 189, 157, 77, 110, 246, 46, 123, - 73, 251, 214, 152, 238, 151, 147, 123, 55, 189, 75, 163, 55, 80, 238, 82, - 61, 117, 248, 178, 55, 60, 191, 82, 141, 211, 221, 114, 34, 62, 48, 118, - 226, 149, 251, 211, 137, 218, 235, 220, 156, 222, 88, 201, 251, 11, 37, 126, - 117, 210, 27, 103, 26, 251, 101, 227, 60, 83, 42, 206, 83, 205, 211, 108, - 211, 186, 127, 233, 118, 243, 147, 68, 211, 154, 236, 104, 147, 196, 141, 117, - 174, 12, 175, 51, 183, 189, 251, 182, 113, 93, 204, 218, 201, 123, 187, 122, - 124, 56, 171, 142, 139, 217, 218, 141, 85, 110, 141, 23, 163, 241, 233, 249, - 238, 78, 39, 127, 174, 214, 146, 217, 164, 162, 164, 111, 181, 228, 222, 69, - 103, 208, 187, 190, 158, 213, 210, 208, 62, 234, 149, 62, 168, 20, 212, 155, - 91, 168, 246, 117, 125, 49, 174, 15, 46, 242, 183, 205, 74, 106, 248, 156, - 61, 74, 89, 47, 149, 254, 248, 168, 119, 191, 119, 189, 63, 125, 62, 215, - 176, 59, 110, 43, 103, 241, 243, 171, 198, 105, 54, 126, 219, 61, 201, 204, - 15, 207, 47, 59, 213, 110, 165, 157, 31, 39, 95, 118, 206, 226, 137, 110, - 188, 93, 94, 100, 174, 175, 219, 55, 167, 221, 211, 185, 57, 77, 219, 38, - 76, 81, 102, 109, 100, 47, 246, 251, 233, 244, 244, 44, 153, 26, 159, 238, - 87, 58, 73, 237, 234, 229, 122, 114, 97, 238, 24, 227, 171, 94, 41, 126, - 93, 174, 244, 212, 193, 226, 240, 190, 127, 179, 179, 63, 157, 28, 159, 119, - 142, 186, 253, 250, 209, 226, 36, 63, 204, 100, 212, 113, 183, 122, 163, 118, - 246, 162, 167, 179, 66, 229, 190, 28, 111, 229, 149, 131, 97, 116, 191, 120, - 150, 94, 92, 223, 68, 179, 13, 117, 175, 117, 253, 50, 189, 218, 203, 180, - 70, 141, 252, 252, 60, 59, 173, 214, 142, 187, 207, 133, 89, 73, 47, 167, - 71, 181, 161, 98, 20, 211, 151, 233, 211, 98, 18, 70, 213, 222, 217, 4, - 6, 255, 241, 52, 93, 168, 28, 86, 210, 195, 251, 94, 43, 254, 124, 181, - 55, 31, 77, 198, 187, 147, 226, 244, 74, 123, 206, 168, 119, 243, 232, 249, - 174, 81, 213, 180, 251, 188, 145, 189, 171, 117, 15, 7, 165, 243, 157, 251, - 137, 125, 148, 175, 92, 52, 178, 179, 81, 188, 89, 187, 42, 244, 15, 243, - 189, 84, 188, 88, 106, 226, 220, 146, 50, 50, 181, 209, 125, 126, 231, 160, - 176, 55, 182, 95, 250, 229, 105, 51, 153, 184, 173, 93, 159, 38, 7, 7, - 249, 158, 174, 107, 214, 232, 228, 170, 148, 190, 172, 188, 92, 150, 79, 170, - 87, 157, 174, 190, 40, 171, 186, 161, 15, 142, 146, 61, 219, 218, 217, 237, - 27, 181, 211, 225, 192, 72, 22, 110, 43, 221, 110, 165, 114, 93, 79, 156, - 88, 7, 86, 90, 31, 223, 247, 163, 157, 193, 113, 54, 62, 137, 30, 246, - 155, 71, 39, 229, 193, 48, 53, 31, 79, 187, 48, 230, 179, 55, 199, 221, - 254, 124, 60, 108, 222, 170, 208, 209, 149, 121, 234, 210, 108, 182, 234, 39, - 147, 74, 101, 154, 57, 72, 157, 159, 230, 75, 106, 35, 219, 63, 175, 170, - 39, 215, 71, 227, 249, 85, 114, 62, 153, 86, 230, 139, 106, 166, 245, 178, - 191, 80, 140, 84, 124, 49, 185, 158, 158, 223, 236, 217, 157, 118, 243, 121, - 118, 222, 137, 47, 172, 169, 154, 111, 164, 27, 10, 124, 6, 245, 105, 209, - 48, 175, 14, 70, 7, 7, 103, 167, 169, 151, 90, 186, 179, 40, 28, 105, - 55, 237, 228, 125, 161, 148, 77, 246, 167, 149, 252, 203, 249, 104, 175, 98, - 107, 213, 139, 172, 190, 56, 108, 212, 238, 23, 153, 251, 211, 10, 148, 163, - 146, 220, 43, 191, 140, 107, 189, 35, 69, 141, 54, 227, 209, 212, 68, 49, - 250, 157, 221, 211, 98, 63, 81, 186, 215, 43, 169, 250, 81, 52, 126, 148, - 60, 219, 31, 222, 171, 48, 125, 45, 26, 181, 221, 231, 251, 151, 214, 217, - 34, 155, 62, 237, 156, 55, 122, 221, 155, 235, 235, 110, 186, 97, 156, 22, - 211, 205, 226, 241, 75, 241, 176, 85, 157, 84, 148, 232, 121, 118, 209, 236, - 102, 26, 109, 165, 222, 206, 55, 247, 158, 171, 139, 81, 226, 222, 190, 131, - 97, 220, 181, 111, 187, 167, 149, 203, 251, 221, 250, 93, 185, 55, 170, 214, - 178, 179, 69, 169, 107, 215, 71, 189, 133, 109, 156, 182, 15, 143, 109, 165, - 127, 120, 188, 127, 127, 181, 219, 63, 177, 239, 119, 46, 143, 119, 18, 169, - 252, 248, 40, 147, 202, 219, 123, 173, 120, 242, 174, 109, 38, 210, 113, 189, - 61, 104, 84, 212, 51, 45, 171, 27, 23, 141, 146, 18, 47, 140, 140, 100, - 191, 222, 232, 94, 119, 219, 59, 23, 167, 23, 165, 171, 151, 155, 84, 161, - 87, 188, 43, 239, 143, 211, 39, 122, 67, 105, 44, 242, 207, 59, 167, 251, - 253, 242, 142, 126, 146, 138, 207, 46, 143, 186, 55, 217, 70, 211, 58, 50, - 147, 141, 105, 227, 90, 45, 236, 87, 179, 247, 207, 181, 243, 108, 182, 102, - 217, 59, 71, 198, 92, 171, 93, 204, 143, 205, 235, 235, 189, 155, 131, 243, - 108, 39, 57, 177, 6, 137, 209, 44, 59, 204, 196, 43, 199, 230, 172, 127, - 102, 198, 175, 82, 7, 153, 202, 225, 201, 237, 245, 141, 90, 187, 174, 220, - 246, 226, 245, 212, 85, 173, 120, 6, 243, 193, 254, 109, 49, 57, 24, 78, - 7, 247, 251, 195, 66, 93, 109, 21, 78, 91, 189, 227, 251, 163, 81, 231, - 254, 184, 113, 108, 204, 141, 78, 219, 174, 143, 111, 78, 110, 174, 26, 187, - 139, 124, 125, 119, 174, 41, 151, 227, 243, 238, 225, 101, 166, 210, 104, 38, - 116, 88, 125, 46, 140, 82, 39, 123, 90, 58, 158, 43, 211, 69, 39, 173, - 55, 97, 53, 156, 40, 133, 234, 209, 238, 172, 189, 147, 206, 116, 15, 134, - 59, 5, 251, 52, 249, 114, 124, 209, 232, 167, 207, 205, 66, 86, 217, 185, - 108, 26, 55, 125, 99, 118, 16, 221, 73, 246, 15, 10, 198, 80, 111, 223, - 31, 90, 55, 19, 163, 54, 28, 235, 233, 81, 106, 210, 129, 201, 113, 146, - 81, 110, 46, 107, 70, 13, 86, 252, 69, 167, 87, 202, 239, 151, 250, 221, - 226, 137, 81, 152, 67, 141, 78, 110, 14, 90, 181, 170, 86, 63, 56, 57, - 58, 110, 183, 95, 74, 169, 203, 151, 122, 99, 103, 54, 111, 156, 93, 13, - 110, 42, 221, 147, 219, 122, 97, 215, 60, 45, 207, 135, 231, 197, 231, 203, - 70, 181, 151, 200, 84, 212, 198, 162, 220, 141, 94, 236, 206, 51, 141, 204, - 205, 113, 121, 103, 55, 117, 118, 105, 30, 183, 167, 165, 120, 212, 190, 57, - 46, 118, 46, 246, 78, 123, 201, 210, 179, 217, 63, 40, 61, 79, 238, 42, - 67, 152, 42, 14, 39, 157, 226, 201, 237, 173, 85, 238, 100, 246, 118, 50, - 165, 147, 107, 237, 182, 219, 30, 157, 213, 135, 59, 246, 216, 236, 190, 220, - 244, 78, 118, 46, 142, 237, 70, 246, 188, 88, 110, 218, 169, 221, 203, 249, - 205, 179, 98, 219, 209, 222, 253, 105, 199, 108, 239, 182, 42, 39, 243, 134, - 117, 184, 168, 151, 174, 180, 204, 200, 26, 205, 202, 229, 106, 225, 170, 243, - 124, 126, 126, 120, 153, 56, 46, 149, 91, 47, 167, 163, 231, 226, 213, 129, - 150, 55, 19, 189, 243, 238, 110, 244, 118, 126, 145, 62, 155, 53, 111, 47, - 138, 69, 179, 84, 78, 53, 47, 79, 111, 204, 105, 54, 27, 61, 153, 23, - 171, 47, 247, 123, 179, 233, 77, 102, 47, 61, 25, 118, 211, 125, 75, 155, - 25, 187, 167, 135, 179, 203, 235, 163, 114, 244, 230, 56, 209, 190, 60, 29, - 92, 229, 181, 178, 121, 119, 179, 59, 171, 236, 237, 181, 250, 231, 251, 173, - 206, 201, 126, 43, 113, 122, 184, 211, 73, 236, 239, 85, 107, 237, 206, 241, - 248, 226, 120, 191, 172, 44, 74, 102, 107, 222, 54, 106, 47, 169, 201, 176, - 211, 210, 27, 201, 114, 165, 56, 187, 63, 206, 159, 156, 14, 138, 37, 144, - 188, 50, 205, 231, 76, 188, 51, 60, 92, 36, 155, 249, 210, 206, 77, 180, - 144, 47, 239, 237, 92, 100, 206, 6, 211, 98, 82, 45, 102, 179, 102, 225, - 162, 146, 56, 201, 94, 216, 163, 238, 73, 105, 156, 152, 152, 197, 182, 62, - 46, 156, 181, 243, 251, 251, 7, 74, 231, 250, 116, 112, 115, 52, 88, 156, - 223, 157, 237, 86, 207, 166, 229, 252, 249, 193, 177, 109, 141, 238, 219, 133, - 195, 81, 102, 58, 203, 199, 71, 25, 165, 126, 144, 24, 102, 247, 14, 143, - 58, 169, 155, 154, 185, 243, 92, 42, 105, 151, 199, 221, 68, 255, 112, 215, - 168, 244, 218, 211, 253, 227, 157, 214, 193, 65, 183, 83, 232, 193, 183, 163, - 105, 134, 121, 145, 62, 72, 150, 122, 135, 229, 210, 44, 95, 61, 110, 65, - 39, 244, 206, 79, 246, 110, 142, 204, 102, 87, 201, 236, 15, 178, 202, 97, - 210, 200, 239, 236, 78, 143, 103, 179, 91, 83, 31, 191, 92, 92, 128, 124, - 151, 202, 103, 15, 238, 245, 195, 195, 187, 110, 183, 96, 166, 39, 249, 179, - 69, 52, 158, 80, 174, 14, 118, 59, 149, 147, 102, 197, 26, 101, 142, 242, - 249, 243, 19, 251, 104, 55, 59, 77, 107, 245, 163, 203, 221, 211, 203, 221, - 3, 16, 252, 46, 199, 173, 203, 106, 97, 49, 185, 56, 137, 151, 175, 203, - 74, 47, 95, 203, 86, 143, 42, 11, 123, 113, 126, 144, 184, 202, 159, 220, - 30, 196, 19, 119, 7, 195, 189, 161, 125, 155, 216, 217, 57, 168, 95, 205, - 119, 46, 202, 103, 187, 183, 245, 157, 151, 155, 139, 86, 37, 153, 40, 61, - 167, 118, 19, 55, 199, 118, 29, 106, 115, 126, 249, 114, 216, 188, 72, 66, - 191, 151, 246, 75, 103, 122, 178, 126, 54, 56, 108, 238, 86, 42, 231, 45, - 229, 104, 188, 168, 194, 196, 123, 9, 51, 237, 89, 118, 166, 93, 183, 11, - 19, 243, 240, 234, 160, 125, 83, 154, 95, 93, 76, 119, 198, 197, 157, 218, - 254, 193, 206, 115, 178, 150, 79, 77, 173, 100, 60, 95, 154, 239, 204, 46, - 206, 47, 142, 163, 241, 221, 68, 165, 144, 124, 73, 142, 173, 217, 233, 108, - 167, 31, 221, 191, 78, 92, 237, 38, 26, 199, 213, 243, 124, 39, 157, 207, - 167, 59, 209, 179, 209, 126, 54, 61, 57, 235, 93, 221, 222, 206, 142, 172, - 114, 225, 34, 218, 50, 142, 218, 249, 234, 169, 125, 187, 119, 215, 42, 28, - 148, 15, 119, 175, 90, 251, 153, 113, 9, 4, 1, 200, 34, 83, 134, 146, - 27, 3, 245, 226, 229, 238, 229, 188, 91, 129, 21, 107, 150, 106, 170, 237, - 132, 182, 223, 159, 21, 202, 151, 169, 219, 139, 234, 237, 60, 122, 189, 123, - 1, 253, 122, 187, 179, 155, 57, 232, 30, 30, 223, 149, 205, 249, 77, 251, - 192, 218, 171, 204, 247, 242, 207, 253, 212, 137, 121, 83, 232, 190, 92, 214, - 46, 235, 139, 189, 235, 171, 169, 62, 184, 45, 197, 245, 61, 181, 89, 109, - 153, 179, 120, 190, 216, 175, 156, 28, 204, 204, 253, 196, 105, 189, 123, 221, - 234, 22, 118, 102, 147, 193, 213, 78, 226, 104, 122, 53, 131, 92, 142, 154, - 47, 7, 195, 155, 65, 217, 218, 77, 31, 29, 93, 149, 27, 137, 56, 108, - 71, 118, 162, 241, 231, 86, 124, 170, 156, 167, 159, 19, 137, 187, 194, 126, - 123, 239, 162, 184, 191, 179, 215, 58, 218, 129, 121, 246, 114, 111, 126, 115, - 121, 125, 215, 48, 239, 186, 55, 47, 221, 162, 58, 153, 94, 22, 174, 238, - 237, 107, 251, 244, 250, 210, 44, 61, 199, 33, 195, 29, 189, 84, 186, 105, - 118, 71, 86, 195, 206, 236, 181, 235, 233, 118, 230, 160, 178, 171, 60, 239, - 180, 94, 42, 207, 135, 59, 165, 93, 248, 94, 206, 174, 79, 27, 195, 194, - 217, 161, 90, 189, 235, 93, 204, 158, 149, 227, 189, 78, 170, 27, 55, 106, - 199, 209, 241, 217, 113, 205, 200, 236, 239, 30, 95, 195, 76, 117, 189, 103, - 92, 150, 97, 130, 137, 94, 95, 42, 141, 131, 203, 194, 203, 238, 126, 167, - 114, 108, 191, 76, 46, 175, 159, 203, 201, 70, 55, 217, 191, 59, 187, 172, - 206, 94, 118, 46, 70, 207, 181, 66, 101, 116, 93, 157, 166, 179, 227, 244, - 108, 183, 91, 236, 231, 11, 186, 221, 188, 46, 158, 95, 206, 159, 175, 247, - 238, 122, 39, 169, 222, 213, 117, 50, 95, 238, 244, 118, 175, 59, 201, 151, - 122, 167, 221, 186, 153, 191, 52, 46, 205, 221, 86, 225, 90, 187, 74, 215, - 91, 149, 120, 116, 116, 48, 157, 234, 39, 71, 7, 81, 107, 214, 216, 45, - 158, 222, 169, 231, 74, 234, 222, 26, 220, 246, 212, 84, 185, 159, 127, 57, - 41, 43, 106, 193, 72, 230, 7, 123, 243, 187, 242, 252, 184, 213, 172, 205, - 103, 205, 130, 85, 77, 89, 221, 155, 184, 102, 232, 170, 221, 61, 27, 140, - 15, 250, 247, 251, 131, 230, 241, 201, 109, 127, 62, 215, 243, 103, 243, 231, - 252, 162, 113, 218, 239, 143, 206, 247, 90, 83, 251, 238, 6, 210, 30, 206, - 219, 37, 179, 251, 28, 109, 151, 175, 171, 169, 221, 243, 202, 244, 186, 117, - 218, 73, 12, 237, 203, 243, 194, 221, 206, 237, 225, 177, 122, 56, 40, 150, - 173, 147, 204, 253, 161, 57, 59, 75, 158, 239, 101, 227, 247, 123, 253, 198, - 78, 255, 42, 113, 114, 119, 208, 156, 156, 28, 94, 206, 119, 141, 98, 115, - 127, 118, 111, 29, 12, 142, 95, 210, 147, 90, 251, 57, 5, 27, 56, 43, - 99, 117, 10, 119, 157, 104, 117, 39, 163, 239, 219, 153, 114, 79, 57, 239, - 142, 10, 167, 170, 214, 111, 151, 134, 198, 201, 142, 149, 60, 172, 151, 10, - 45, 101, 122, 50, 201, 78, 161, 189, 246, 39, 165, 54, 44, 84, 147, 106, - 47, 59, 76, 69, 119, 79, 14, 227, 86, 242, 50, 117, 213, 73, 86, 13, - 83, 239, 246, 75, 240, 26, 77, 155, 118, 205, 235, 227, 214, 203, 98, 124, - 163, 233, 179, 131, 227, 201, 236, 252, 188, 214, 79, 105, 176, 245, 60, 89, - 12, 154, 7, 247, 118, 179, 59, 216, 205, 199, 111, 79, 162, 71, 217, 251, - 251, 70, 47, 111, 159, 101, 15, 142, 146, 231, 237, 197, 93, 45, 81, 239, - 28, 156, 88, 123, 215, 199, 189, 194, 245, 64, 155, 220, 84, 158, 227, 169, - 113, 69, 49, 167, 169, 227, 222, 32, 101, 93, 223, 85, 143, 143, 59, 195, - 235, 211, 222, 217, 115, 247, 252, 69, 25, 158, 207, 174, 83, 147, 68, 227, - 40, 117, 89, 201, 22, 14, 162, 147, 206, 188, 113, 171, 30, 222, 87, 186, - 169, 206, 94, 181, 57, 138, 102, 213, 222, 237, 233, 94, 99, 146, 62, 126, - 49, 159, 167, 207, 153, 147, 187, 108, 163, 218, 168, 62, 55, 245, 153, 90, - 111, 45, 166, 215, 147, 241, 237, 77, 187, 214, 176, 46, 186, 241, 202, 249, - 126, 246, 36, 59, 79, 154, 179, 202, 213, 64, 51, 199, 139, 198, 206, 161, - 58, 138, 150, 78, 237, 254, 85, 169, 127, 218, 78, 27, 87, 149, 217, 48, - 115, 121, 223, 237, 167, 162, 199, 105, 35, 91, 181, 238, 174, 42, 25, 173, - 13, 61, 152, 62, 60, 79, 21, 50, 138, 89, 59, 45, 164, 231, 139, 230, - 222, 142, 218, 233, 118, 167, 123, 186, 54, 133, 185, 46, 121, 29, 45, 157, - 37, 227, 105, 77, 131, 61, 227, 237, 254, 241, 157, 86, 107, 85, 143, 251, - 71, 197, 97, 244, 228, 172, 152, 184, 220, 185, 6, 161, 213, 152, 116, 59, - 245, 130, 121, 222, 156, 45, 178, 113, 187, 106, 218, 39, 197, 243, 69, 189, - 185, 223, 91, 212, 245, 231, 131, 227, 171, 222, 73, 60, 125, 113, 99, 237, - 228, 51, 86, 106, 175, 185, 216, 75, 23, 107, 233, 233, 252, 62, 59, 232, - 221, 76, 247, 243, 215, 102, 226, 220, 58, 213, 58, 103, 51, 107, 167, 58, - 31, 153, 39, 135, 53, 187, 124, 144, 135, 185, 76, 219, 81, 167, 214, 217, - 236, 48, 170, 103, 239, 237, 189, 157, 179, 179, 250, 116, 160, 25, 59, 157, - 189, 209, 157, 14, 19, 116, 235, 4, 54, 205, 227, 68, 113, 127, 239, 106, - 50, 215, 12, 152, 165, 13, 107, 156, 185, 43, 84, 52, 163, 168, 245, 186, - 47, 90, 165, 81, 185, 159, 25, 241, 153, 214, 75, 52, 82, 241, 97, 60, - 185, 127, 171, 222, 167, 226, 251, 181, 253, 211, 189, 238, 125, 101, 156, 185, - 108, 30, 107, 198, 113, 229, 32, 107, 153, 61, 45, 94, 75, 232, 70, 118, - 188, 151, 204, 166, 142, 107, 71, 221, 169, 97, 12, 78, 219, 71, 249, 90, - 249, 22, 166, 131, 23, 173, 102, 236, 156, 165, 19, 249, 195, 104, 105, 120, - 27, 189, 58, 73, 196, 181, 221, 177, 85, 51, 142, 163, 151, 106, 246, 54, - 115, 83, 187, 153, 54, 75, 173, 83, 125, 190, 232, 196, 79, 219, 209, 212, - 56, 81, 87, 75, 169, 89, 243, 26, 154, 242, 80, 191, 202, 220, 228, 79, - 111, 106, 137, 203, 115, 67, 189, 142, 198, 211, 197, 76, 166, 57, 209, 147, - 137, 236, 94, 165, 151, 74, 180, 79, 166, 209, 29, 227, 48, 181, 119, 101, - 228, 207, 174, 122, 163, 83, 165, 216, 46, 38, 110, 239, 122, 119, 47, 138, - 118, 167, 237, 247, 166, 249, 11, 104, 199, 179, 225, 177, 158, 190, 221, 237, - 68, 213, 214, 94, 225, 226, 114, 111, 220, 60, 110, 220, 191, 40, 163, 132, - 249, 220, 129, 89, 182, 82, 120, 142, 150, 180, 210, 16, 86, 227, 232, 73, - 197, 78, 77, 244, 206, 226, 108, 112, 156, 217, 139, 78, 134, 215, 32, 8, - 166, 178, 199, 59, 89, 171, 165, 189, 232, 87, 205, 218, 172, 216, 204, 31, - 30, 157, 31, 54, 170, 233, 209, 245, 161, 210, 185, 47, 101, 206, 50, 101, - 245, 84, 73, 238, 204, 51, 74, 187, 148, 212, 90, 241, 189, 151, 134, 181, - 56, 191, 170, 170, 253, 212, 197, 225, 203, 75, 163, 150, 76, 55, 186, 131, - 116, 173, 27, 135, 97, 113, 88, 109, 117, 236, 252, 254, 133, 154, 223, 63, - 64, 221, 12, 8, 23, 249, 83, 227, 196, 94, 100, 19, 170, 169, 20, 226, - 249, 133, 162, 223, 92, 205, 59, 131, 171, 81, 162, 191, 40, 235, 23, 13, - 165, 51, 94, 152, 233, 147, 179, 236, 110, 105, 97, 182, 246, 204, 81, 189, - 114, 168, 149, 59, 135, 47, 149, 151, 67, 163, 220, 45, 204, 118, 118, 234, - 229, 187, 139, 218, 69, 46, 23, 12, 16, 246, 64, 180, 138, 238, 126, 79, - 173, 106, 175, 87, 69, 214, 193, 77, 37, 137, 88, 112, 58, 67, 130, 83, - 147, 10, 92, 108, 210, 165, 100, 18, 91, 175, 87, 119, 173, 75, 205, 58, - 163, 240, 37, 28, 10, 68, 207, 72, 200, 120, 90, 236, 48, 4, 215, 55, - 5, 157, 145, 7, 35, 129, 169, 49, 209, 82, 110, 84, 235, 87, 135, 13, - 14, 201, 162, 146, 131, 7, 92, 104, 120, 209, 111, 54, 71, 198, 88, 21, - 23, 154, 252, 84, 181, 90, 93, 195, 99, 112, 225, 218, 89, 240, 107, 109, - 213, 230, 194, 243, 146, 159, 2, 108, 165, 98, 228, 168, 84, 100, 105, 192, - 10, 147, 227, 101, 97, 132, 32, 84, 30, 206, 13, 226, 181, 68, 112, 236, - 13, 60, 230, 7, 218, 7, 80, 194, 158, 50, 234, 26, 186, 242, 161, 26, - 95, 75, 146, 17, 149, 99, 52, 143, 94, 114, 240, 139, 74, 68, 95, 195, - 185, 20, 105, 239, 18, 94, 43, 76, 35, 75, 63, 73, 246, 131, 138, 93, - 217, 99, 170, 128, 154, 74, 191, 137, 149, 191, 225, 252, 135, 253, 216, 44, - 35, 247, 168, 159, 53, 202, 200, 61, 234, 167, 134, 145, 66, 73, 169, 97, - 180, 54, 215, 159, 244, 143, 86, 142, 250, 77, 84, 123, 58, 129, 18, 217, - 51, 190, 146, 35, 66, 92, 115, 81, 56, 4, 185, 18, 153, 65, 206, 23, - 182, 223, 84, 210, 199, 63, 79, 196, 230, 57, 212, 195, 14, 204, 184, 154, - 81, 144, 176, 76, 151, 95, 67, 122, 52, 132, 135, 247, 91, 222, 155, 63, - 145, 1, 46, 177, 245, 26, 74, 68, 67, 140, 197, 83, 92, 17, 150, 34, - 35, 108, 199, 18, 232, 132, 11, 66, 148, 239, 204, 23, 194, 229, 179, 127, - 69, 10, 149, 16, 189, 21, 79, 105, 98, 35, 60, 19, 225, 183, 91, 175, - 222, 59, 217, 23, 53, 34, 245, 54, 28, 174, 37, 239, 187, 32, 227, 95, - 9, 176, 51, 138, 199, 158, 219, 57, 242, 212, 161, 143, 214, 118, 80, 14, - 136, 252, 147, 128, 29, 33, 169, 247, 211, 132, 15, 225, 153, 220, 181, 21, - 231, 8, 144, 57, 126, 79, 17, 101, 68, 208, 11, 43, 94, 96, 228, 186, - 105, 168, 89, 93, 245, 127, 64, 123, 249, 131, 24, 134, 74, 164, 107, 70, - 6, 10, 236, 202, 134, 89, 37, 190, 149, 143, 190, 169, 144, 148, 244, 152, - 17, 138, 204, 249, 175, 135, 40, 230, 115, 175, 241, 249, 162, 5, 194, 169, - 244, 102, 114, 43, 173, 195, 31, 85, 201, 210, 95, 188, 78, 170, 116, 169, - 192, 95, 61, 189, 165, 167, 34, 129, 176, 150, 129, 50, 104, 208, 0, 91, - 106, 90, 149, 51, 90, 22, 175, 146, 25, 184, 162, 176, 164, 46, 103, 208, - 115, 118, 75, 77, 164, 225, 74, 165, 43, 69, 206, 40, 9, 188, 130, 111, - 49, 157, 165, 43, 77, 149, 211, 105, 138, 167, 164, 228, 52, 196, 85, 182, - 50, 25, 57, 173, 96, 130, 63, 2, 169, 164, 156, 210, 117, 184, 76, 104, - 114, 82, 199, 87, 104, 248, 86, 124, 152, 148, 181, 44, 124, 202, 91, 208, - 10, 105, 124, 144, 144, 85, 53, 73, 249, 200, 25, 76, 1, 47, 79, 97, - 60, 141, 81, 158, 109, 233, 144, 0, 239, 225, 21, 104, 71, 185, 5, 69, - 213, 233, 29, 105, 66, 152, 219, 202, 226, 160, 131, 100, 80, 212, 52, 85, - 0, 70, 10, 166, 67, 103, 226, 164, 134, 25, 105, 80, 64, 42, 66, 10, - 189, 133, 233, 42, 155, 145, 213, 4, 38, 211, 117, 120, 127, 26, 223, 175, - 167, 97, 142, 161, 167, 9, 5, 94, 153, 72, 208, 75, 18, 16, 75, 99, - 229, 68, 14, 54, 21, 95, 157, 132, 88, 58, 213, 56, 173, 171, 114, 50, - 5, 111, 139, 4, 236, 66, 14, 238, 164, 121, 33, 7, 77, 26, 208, 56, - 247, 173, 96, 45, 99, 52, 7, 68, 50, 52, 255, 42, 69, 163, 56, 228, - 112, 40, 183, 223, 28, 90, 49, 73, 117, 105, 199, 236, 128, 238, 36, 80, - 83, 222, 228, 42, 82, 198, 39, 98, 8, 217, 4, 177, 147, 49, 102, 225, - 129, 99, 88, 9, 216, 151, 185, 148, 158, 146, 230, 151, 185, 164, 146, 144, - 236, 163, 156, 150, 77, 75, 115, 248, 209, 225, 110, 55, 7, 29, 42, 205, - 119, 115, 233, 116, 34, 224, 245, 112, 26, 163, 205, 54, 76, 79, 116, 238, - 103, 176, 115, 89, 70, 191, 75, 87, 84, 141, 96, 16, 167, 93, 188, 15, - 6, 105, 241, 226, 87, 108, 33, 67, 164, 41, 132, 155, 218, 12, 68, 87, - 221, 230, 16, 139, 24, 171, 107, 196, 50, 46, 40, 44, 59, 200, 97, 179, - 196, 143, 7, 238, 150, 186, 21, 178, 47, 183, 66, 243, 203, 173, 24, 44, - 199, 120, 119, 4, 119, 71, 206, 221, 46, 220, 237, 242, 187, 236, 22, 116, - 253, 150, 6, 127, 161, 163, 84, 213, 249, 141, 193, 98, 1, 23, 26, 253, - 211, 35, 129, 57, 188, 90, 141, 184, 77, 206, 26, 81, 245, 78, 159, 218, - 91, 128, 145, 83, 109, 210, 121, 180, 215, 201, 171, 53, 52, 145, 121, 156, - 102, 151, 95, 217, 124, 2, 107, 147, 98, 239, 241, 255, 225, 144, 12, 248, - 4, 131, 64, 116, 67, 111, 48, 240, 135, 215, 240, 44, 150, 137, 196, 67, - 118, 1, 38, 190, 112, 59, 166, 107, 112, 51, 47, 188, 5, 144, 191, 156, - 166, 40, 152, 86, 25, 32, 139, 22, 136, 34, 247, 241, 38, 113, 157, 188, - 139, 137, 68, 18, 7, 67, 69, 138, 99, 100, 104, 187, 181, 121, 13, 136, - 46, 93, 162, 31, 205, 161, 79, 215, 50, 210, 106, 100, 149, 230, 70, 4, - 232, 153, 189, 17, 78, 15, 140, 84, 65, 175, 238, 230, 200, 28, 119, 24, - 210, 220, 166, 148, 144, 98, 248, 156, 251, 73, 10, 148, 242, 128, 7, 9, - 139, 124, 39, 197, 109, 181, 59, 104, 87, 125, 141, 164, 58, 134, 135, 52, - 12, 55, 241, 187, 220, 204, 224, 96, 83, 225, 43, 149, 196, 123, 116, 198, - 140, 3, 87, 188, 123, 104, 102, 247, 225, 11, 195, 116, 79, 132, 50, 238, - 169, 63, 246, 174, 230, 78, 243, 216, 15, 222, 137, 30, 207, 30, 209, 176, - 149, 108, 250, 241, 207, 37, 217, 245, 255, 21, 235, 124, 113, 58, 206, 51, - 253, 104, 69, 216, 145, 16, 55, 126, 66, 216, 53, 95, 177, 17, 190, 162, - 49, 171, 213, 96, 244, 230, 95, 25, 57, 34, 178, 240, 252, 169, 69, 153, - 165, 224, 159, 154, 151, 80, 237, 191, 205, 204, 159, 87, 249, 159, 177, 243, - 255, 59, 198, 172, 174, 44, 201, 191, 103, 29, 6, 3, 47, 221, 58, 51, - 125, 184, 210, 21, 180, 23, 89, 50, 211, 23, 105, 196, 145, 52, 68, 199, - 113, 201, 164, 78, 49, 104, 184, 92, 153, 96, 34, 164, 35, 80, 190, 99, - 237, 154, 92, 99, 237, 234, 180, 15, 207, 19, 93, 126, 184, 233, 62, 117, - 27, 31, 37, 33, 125, 85, 244, 116, 100, 201, 132, 199, 186, 53, 233, 183, - 32, 77, 9, 177, 114, 141, 1, 43, 235, 134, 191, 245, 98, 255, 203, 146, - 226, 101, 132, 162, 18, 147, 208, 43, 117, 48, 50, 36, 135, 144, 19, 254, - 83, 100, 206, 22, 234, 253, 6, 145, 115, 241, 137, 99, 169, 124, 147, 208, - 54, 5, 38, 11, 114, 91, 125, 26, 194, 215, 254, 29, 129, 246, 101, 55, - 204, 75, 51, 76, 118, 231, 163, 1, 182, 225, 19, 206, 147, 176, 232, 176, - 32, 206, 23, 225, 9, 99, 54, 47, 20, 147, 150, 61, 8, 134, 156, 51, - 110, 122, 178, 193, 225, 220, 6, 176, 197, 26, 26, 213, 167, 158, 105, 177, - 155, 110, 183, 63, 131, 76, 187, 205, 39, 19, 157, 179, 70, 248, 254, 190, - 181, 134, 189, 122, 199, 199, 78, 70, 85, 131, 6, 67, 84, 42, 6, 185, - 99, 90, 62, 212, 152, 17, 98, 171, 193, 168, 166, 239, 180, 77, 168, 58, - 227, 97, 191, 195, 236, 138, 107, 221, 42, 108, 104, 106, 240, 167, 69, 101, - 251, 8, 60, 210, 215, 98, 57, 198, 143, 176, 182, 197, 114, 26, 51, 177, - 241, 54, 89, 46, 67, 91, 183, 165, 70, 203, 105, 138, 39, 170, 104, 179, - 92, 214, 27, 234, 180, 25, 126, 172, 95, 69, 155, 17, 251, 2, 110, 11, - 223, 105, 54, 68, 253, 241, 247, 122, 192, 99, 141, 227, 161, 95, 80, 169, - 239, 197, 110, 78, 243, 194, 76, 102, 124, 28, 94, 154, 231, 46, 9, 69, - 244, 90, 240, 64, 31, 175, 218, 240, 160, 233, 142, 226, 68, 19, 24, 66, - 232, 95, 19, 241, 184, 183, 253, 168, 251, 92, 14, 17, 222, 212, 18, 54, - 63, 33, 88, 58, 33, 222, 198, 39, 86, 6, 214, 116, 36, 31, 57, 182, - 56, 240, 105, 8, 150, 146, 165, 7, 9, 95, 2, 177, 159, 148, 37, 164, - 13, 227, 15, 156, 78, 32, 75, 119, 130, 188, 67, 231, 98, 110, 234, 142, - 205, 47, 121, 155, 127, 228, 193, 40, 250, 18, 202, 200, 212, 75, 48, 145, - 255, 17, 68, 186, 56, 126, 135, 115, 85, 144, 111, 49, 156, 113, 228, 114, - 183, 144, 209, 79, 136, 249, 138, 172, 25, 99, 220, 222, 141, 140, 202, 151, - 134, 90, 72, 15, 44, 143, 179, 80, 34, 176, 60, 200, 66, 201, 192, 202, - 8, 11, 165, 2, 206, 0, 11, 165, 3, 239, 12, 174, 81, 238, 245, 11, - 212, 234, 45, 240, 132, 188, 46, 93, 196, 35, 202, 5, 57, 237, 83, 96, - 96, 73, 12, 131, 92, 120, 55, 200, 10, 25, 189, 178, 31, 246, 31, 131, - 171, 142, 17, 114, 208, 96, 192, 227, 199, 120, 116, 129, 101, 173, 136, 219, - 152, 147, 150, 227, 30, 162, 127, 116, 216, 236, 181, 100, 194, 152, 9, 51, - 143, 163, 193, 47, 204, 13, 49, 42, 13, 172, 135, 196, 6, 220, 106, 143, - 112, 15, 47, 80, 223, 121, 10, 55, 26, 197, 168, 87, 71, 8, 156, 254, - 5, 49, 167, 41, 91, 5, 49, 53, 225, 47, 67, 126, 67, 255, 89, 109, - 195, 125, 170, 210, 83, 85, 60, 221, 10, 124, 193, 12, 126, 127, 144, 6, - 244, 0, 195, 195, 3, 200, 31, 29, 140, 19, 210, 227, 55, 124, 138, 0, - 56, 16, 193, 147, 49, 198, 128, 135, 16, 232, 201, 143, 210, 197, 88, 58, - 170, 234, 96, 104, 76, 205, 254, 100, 244, 81, 117, 7, 31, 86, 119, 240, - 159, 170, 110, 236, 47, 86, 55, 234, 169, 46, 246, 172, 246, 239, 232, 218, - 240, 59, 117, 253, 77, 231, 213, 13, 191, 83, 221, 223, 8, 63, 246, 163, - 42, 177, 135, 250, 239, 239, 247, 228, 183, 247, 134, 134, 83, 103, 253, 159, - 172, 51, 204, 179, 42, 199, 188, 90, 83, 99, 122, 174, 121, 158, 175, 244, - 47, 111, 51, 4, 170, 66, 10, 58, 180, 46, 102, 151, 26, 107, 43, 124, - 160, 185, 15, 52, 124, 240, 111, 110, 163, 169, 81, 15, 243, 214, 129, 249, - 139, 10, 239, 198, 86, 232, 45, 17, 174, 120, 35, 40, 222, 254, 40, 12, - 241, 208, 204, 19, 166, 36, 188, 98, 249, 4, 87, 176, 223, 144, 230, 209, - 122, 11, 184, 16, 198, 94, 148, 83, 100, 232, 177, 96, 223, 199, 229, 133, - 128, 249, 96, 60, 49, 223, 233, 145, 95, 51, 157, 144, 131, 4, 242, 196, - 64, 192, 130, 33, 158, 32, 40, 35, 16, 172, 42, 207, 233, 47, 110, 157, - 116, 89, 103, 243, 34, 98, 85, 61, 36, 30, 161, 65, 138, 15, 201, 199, - 223, 99, 218, 55, 69, 134, 203, 52, 93, 102, 233, 90, 167, 107, 148, 158, - 224, 70, 165, 27, 45, 173, 96, 75, 225, 174, 139, 255, 7, 213, 66, 252, - 87, 79, 185, 66, 238, 164, 188, 6, 35, 14, 209, 86, 191, 199, 84, 204, - 12, 6, 26, 131, 64, 182, 216, 15, 251, 203, 240, 97, 235, 216, 94, 19, - 134, 11, 130, 64, 199, 2, 178, 106, 76, 102, 174, 210, 248, 123, 46, 73, - 104, 15, 178, 200, 195, 153, 167, 188, 181, 31, 176, 148, 60, 127, 154, 181, - 189, 143, 45, 246, 24, 129, 13, 48, 102, 46, 135, 1, 178, 7, 109, 99, - 6, 169, 12, 123, 16, 142, 193, 206, 44, 174, 227, 208, 156, 68, 115, 179, - 13, 42, 19, 75, 235, 220, 243, 188, 224, 63, 54, 62, 194, 204, 63, 115, - 130, 227, 99, 130, 222, 153, 27, 208, 144, 232, 161, 249, 171, 158, 82, 8, - 106, 32, 250, 151, 91, 109, 185, 157, 62, 108, 130, 15, 91, 128, 61, 29, - 56, 13, 205, 99, 139, 123, 94, 169, 6, 222, 135, 33, 52, 38, 13, 38, - 145, 184, 6, 223, 218, 144, 13, 182, 209, 40, 252, 32, 122, 72, 70, 40, - 232, 198, 4, 126, 48, 11, 196, 143, 104, 76, 34, 27, 35, 179, 133, 224, - 214, 248, 125, 112, 128, 133, 77, 201, 64, 168, 146, 105, 117, 60, 1, 73, - 131, 53, 131, 123, 255, 79, 142, 31, 6, 78, 98, 110, 73, 163, 73, 111, - 198, 210, 254, 87, 12, 34, 40, 23, 14, 27, 147, 18, 208, 44, 130, 191, - 108, 34, 193, 43, 106, 43, 39, 146, 197, 35, 89, 78, 36, 203, 137, 132, - 21, 139, 230, 52, 4, 69, 97, 73, 226, 24, 226, 105, 104, 134, 144, 229, - 107, 111, 135, 211, 134, 87, 65, 48, 219, 64, 187, 170, 164, 101, 251, 215, - 191, 204, 109, 53, 138, 87, 191, 43, 216, 200, 18, 66, 102, 75, 136, 210, - 56, 223, 146, 26, 158, 118, 132, 173, 111, 205, 192, 77, 41, 107, 79, 247, - 22, 164, 237, 198, 119, 93, 147, 105, 105, 121, 194, 12, 6, 108, 153, 121, - 194, 92, 94, 8, 128, 195, 73, 169, 112, 17, 108, 192, 80, 14, 45, 118, - 77, 64, 31, 3, 138, 206, 195, 217, 53, 133, 135, 9, 100, 6, 219, 79, - 30, 188, 68, 34, 219, 141, 223, 195, 4, 201, 131, 64, 59, 206, 27, 7, - 252, 6, 211, 13, 94, 182, 36, 95, 105, 35, 158, 76, 96, 107, 253, 110, - 38, 91, 210, 231, 50, 177, 62, 40, 137, 245, 233, 146, 32, 241, 215, 39, - 106, 243, 113, 57, 62, 85, 140, 143, 75, 97, 125, 170, 24, 214, 199, 141, - 250, 126, 38, 222, 70, 253, 40, 19, 235, 131, 146, 88, 63, 42, 201, 128, - 127, 172, 79, 48, 244, 94, 196, 245, 11, 125, 39, 13, 254, 121, 176, 15, - 224, 9, 213, 32, 102, 96, 89, 185, 253, 176, 230, 227, 33, 140, 17, 88, - 178, 215, 63, 91, 243, 173, 173, 201, 116, 53, 183, 77, 201, 147, 132, 192, - 190, 105, 130, 89, 206, 45, 24, 217, 206, 133, 131, 161, 213, 141, 90, 240, - 215, 72, 60, 204, 124, 155, 76, 119, 106, 98, 213, 10, 70, 24, 181, 148, - 185, 157, 35, 39, 176, 77, 45, 41, 191, 147, 71, 144, 161, 126, 63, 53, - 91, 236, 252, 27, 11, 214, 49, 230, 140, 145, 158, 65, 235, 22, 182, 149, - 183, 0, 50, 175, 241, 163, 143, 152, 19, 139, 80, 226, 160, 244, 15, 78, - 10, 2, 91, 31, 26, 28, 106, 149, 243, 234, 33, 188, 143, 201, 190, 103, - 120, 41, 18, 61, 74, 132, 30, 21, 12, 57, 121, 4, 101, 4, 56, 234, - 84, 7, 131, 42, 147, 17, 215, 54, 5, 203, 145, 98, 109, 243, 156, 80, - 62, 13, 172, 230, 229, 44, 9, 44, 203, 71, 162, 204, 163, 56, 172, 156, - 65, 89, 164, 135, 57, 86, 92, 170, 143, 156, 111, 135, 85, 64, 32, 4, - 161, 155, 53, 172, 73, 162, 51, 157, 247, 160, 7, 140, 206, 253, 13, 87, - 10, 43, 123, 251, 67, 118, 219, 135, 121, 114, 91, 232, 177, 236, 150, 56, - 66, 172, 210, 142, 92, 32, 251, 199, 139, 249, 96, 25, 176, 29, 22, 243, - 182, 51, 131, 115, 138, 101, 111, 129, 130, 1, 164, 85, 70, 66, 3, 133, - 100, 114, 218, 117, 227, 2, 150, 199, 218, 59, 47, 8, 202, 37, 168, 217, - 53, 223, 1, 43, 239, 128, 218, 179, 196, 94, 100, 123, 22, 242, 208, 97, - 112, 249, 184, 196, 209, 0, 52, 98, 25, 54, 6, 189, 229, 134, 119, 96, - 219, 150, 216, 226, 213, 137, 68, 144, 57, 145, 73, 73, 78, 54, 142, 236, - 124, 141, 228, 132, 179, 13, 143, 8, 237, 151, 160, 241, 191, 7, 169, 4, - 25, 113, 9, 235, 26, 179, 189, 94, 150, 176, 24, 179, 197, 123, 13, 9, - 130, 52, 246, 67, 213, 28, 66, 75, 9, 172, 64, 125, 169, 1, 5, 143, - 180, 3, 118, 198, 209, 225, 136, 158, 129, 72, 45, 36, 203, 230, 24, 113, - 182, 204, 37, 21, 40, 53, 195, 124, 195, 226, 195, 200, 245, 171, 60, 130, - 188, 154, 200, 154, 80, 167, 145, 111, 67, 165, 242, 22, 93, 90, 120, 141, - 76, 21, 249, 58, 239, 179, 43, 188, 177, 220, 14, 228, 15, 117, 183, 181, - 32, 144, 71, 242, 4, 22, 203, 212, 157, 188, 1, 203, 78, 11, 150, 169, - 9, 139, 87, 222, 167, 87, 206, 211, 43, 122, 90, 198, 167, 87, 72, 97, - 225, 167, 164, 44, 95, 17, 76, 220, 136, 144, 100, 251, 227, 112, 177, 44, - 199, 138, 87, 76, 218, 197, 176, 42, 230, 135, 207, 69, 47, 192, 164, 59, - 169, 118, 81, 29, 198, 134, 6, 206, 40, 140, 229, 40, 238, 52, 11, 215, - 13, 5, 35, 210, 6, 143, 195, 179, 134, 183, 97, 100, 188, 185, 194, 155, - 72, 156, 202, 34, 98, 81, 57, 98, 188, 173, 249, 84, 192, 223, 182, 173, - 176, 241, 9, 157, 70, 12, 222, 236, 67, 199, 142, 14, 70, 144, 113, 134, - 1, 224, 121, 66, 101, 109, 3, 33, 115, 249, 81, 46, 209, 117, 63, 248, - 158, 195, 83, 193, 15, 206, 223, 33, 219, 50, 12, 2, 103, 52, 122, 217, - 191, 151, 18, 250, 178, 101, 148, 50, 226, 57, 34, 78, 142, 250, 195, 177, - 103, 32, 198, 100, 219, 225, 205, 116, 66, 201, 211, 246, 189, 207, 30, 94, - 33, 130, 115, 175, 161, 247, 148, 101, 191, 11, 97, 245, 91, 200, 147, 15, - 115, 1, 119, 166, 31, 122, 91, 228, 141, 207, 224, 172, 64, 136, 49, 238, - 21, 198, 97, 252, 115, 61, 58, 116, 117, 195, 192, 41, 210, 145, 167, 21, - 146, 167, 81, 170, 142, 230, 26, 32, 81, 143, 117, 8, 28, 111, 132, 199, - 26, 253, 34, 50, 34, 78, 72, 220, 71, 22, 113, 111, 198, 186, 60, 214, - 228, 177, 12, 159, 239, 158, 76, 204, 92, 152, 233, 47, 48, 238, 48, 34, - 186, 229, 82, 52, 125, 3, 98, 105, 27, 99, 84, 200, 241, 152, 248, 241, - 193, 76, 3, 49, 241, 205, 232, 140, 219, 24, 35, 222, 34, 158, 41, 18, - 219, 107, 163, 196, 233, 76, 217, 87, 70, 32, 224, 252, 227, 81, 31, 233, - 238, 138, 221, 225, 135, 69, 195, 37, 236, 95, 54, 48, 62, 179, 75, 138, - 124, 247, 44, 151, 94, 253, 39, 249, 135, 175, 73, 119, 245, 163, 116, 50, - 251, 200, 215, 188, 49, 226, 253, 238, 215, 228, 28, 241, 79, 5, 239, 22, - 90, 143, 44, 79, 16, 239, 150, 211, 19, 117, 205, 167, 239, 124, 169, 142, - 130, 54, 184, 225, 78, 7, 127, 103, 158, 25, 179, 165, 31, 59, 11, 123, - 26, 191, 113, 218, 21, 32, 86, 62, 91, 112, 247, 36, 142, 143, 36, 145, - 166, 129, 244, 176, 168, 189, 160, 19, 95, 89, 240, 36, 114, 238, 66, 9, - 182, 158, 82, 89, 190, 146, 177, 224, 27, 56, 57, 177, 139, 43, 120, 128, - 186, 33, 26, 40, 52, 72, 48, 243, 184, 120, 45, 213, 150, 70, 30, 131, - 206, 124, 98, 59, 70, 149, 16, 39, 71, 51, 147, 193, 219, 9, 196, 119, - 49, 246, 221, 17, 227, 249, 254, 96, 145, 35, 237, 213, 151, 156, 39, 47, - 90, 27, 220, 156, 182, 36, 207, 179, 220, 23, 207, 141, 128, 3, 117, 227, - 110, 107, 180, 161, 226, 237, 161, 184, 24, 160, 2, 58, 148, 63, 20, 11, - 15, 211, 154, 87, 109, 87, 164, 163, 254, 19, 202, 116, 135, 10, 73, 4, - 248, 226, 37, 197, 83, 204, 128, 62, 120, 172, 181, 182, 17, 94, 147, 107, - 148, 164, 107, 146, 1, 86, 30, 126, 71, 97, 192, 211, 82, 212, 72, 158, - 57, 7, 165, 141, 28, 38, 255, 97, 172, 127, 229, 56, 74, 249, 106, 163, - 251, 99, 18, 1, 8, 172, 197, 40, 93, 68, 114, 248, 126, 167, 252, 116, - 72, 66, 109, 119, 129, 10, 205, 11, 26, 143, 190, 4, 178, 198, 216, 5, - 214, 229, 124, 129, 50, 203, 5, 151, 4, 19, 91, 148, 91, 52, 23, 190, - 128, 57, 227, 55, 220, 24, 171, 177, 11, 82, 250, 133, 49, 98, 244, 11, - 221, 108, 209, 75, 152, 14, 121, 37, 63, 88, 127, 46, 190, 228, 46, 232, - 44, 42, 26, 101, 165, 252, 158, 115, 91, 156, 183, 234, 234, 3, 76, 128, - 111, 223, 206, 173, 233, 60, 254, 236, 251, 106, 103, 188, 51, 126, 28, 236, - 217, 245, 141, 73, 237, 66, 157, 252, 201, 198, 116, 18, 200, 250, 255, 109, - 204, 229, 145, 25, 251, 217, 145, 41, 18, 8, 18, 213, 255, 219, 152, 75, - 35, 51, 246, 179, 35, 51, 198, 217, 231, 254, 39, 54, 166, 242, 151, 230, - 208, 132, 167, 113, 255, 137, 201, 83, 249, 123, 237, 245, 249, 249, 234, 227, - 130, 255, 252, 68, 245, 111, 45, 184, 119, 110, 248, 65, 139, 255, 244, 164, - 240, 31, 104, 241, 216, 167, 91, 252, 103, 62, 192, 127, 160, 224, 75, 99, - 126, 157, 112, 129, 2, 49, 251, 102, 126, 87, 191, 173, 141, 241, 27, 131, - 137, 246, 138, 89, 209, 232, 7, 155, 132, 173, 245, 143, 175, 156, 199, 158, - 255, 164, 60, 169, 38, 124, 59, 188, 92, 206, 191, 197, 83, 150, 117, 17, - 107, 54, 98, 204, 192, 226, 189, 157, 24, 10, 216, 252, 112, 195, 221, 119, - 149, 97, 248, 143, 55, 248, 94, 158, 246, 90, 145, 245, 251, 31, 251, 175, - 109, 98, 236, 31, 236, 80, 236, 229, 61, 199, 199, 91, 8, 218, 145, 176, - 146, 23, 203, 27, 176, 25, 241, 219, 148, 160, 22, 112, 237, 62, 162, 124, - 21, 167, 250, 123, 119, 20, 202, 178, 144, 175, 188, 39, 228, 243, 118, 125, - 239, 11, 248, 73, 41, 31, 181, 30, 31, 10, 250, 185, 156, 38, 123, 55, - 62, 98, 6, 223, 98, 227, 133, 87, 112, 252, 127, 130, 208, 207, 91, 110, - 173, 212, 175, 184, 82, 255, 7, 209, 254, 149, 75, 68, 62, 215, 13, 75, - 107, 150, 250, 239, 145, 251, 181, 159, 21, 8, 244, 255, 110, 129, 224, 115, - 235, 232, 167, 26, 243, 231, 151, 211, 255, 57, 141, 233, 93, 219, 63, 55, - 50, 127, 122, 137, 255, 159, 211, 152, 94, 121, 227, 39, 70, 230, 207, 136, - 29, 255, 127, 107, 76, 229, 175, 77, 162, 218, 63, 44, 248, 171, 127, 175, - 193, 62, 63, 97, 125, 92, 240, 159, 159, 169, 254, 173, 5, 247, 78, 14, - 63, 104, 241, 159, 158, 21, 254, 3, 45, 30, 251, 116, 139, 255, 204, 23, - 248, 15, 20, 124, 121, 208, 255, 64, 242, 87, 190, 173, 21, 252, 245, 37, - 185, 95, 90, 21, 236, 133, 112, 188, 36, 211, 175, 202, 240, 116, 192, 171, - 132, 158, 144, 251, 235, 201, 201, 224, 141, 159, 239, 8, 225, 158, 33, 172, - 226, 201, 177, 56, 214, 177, 122, 254, 156, 66, 86, 111, 45, 94, 191, 112, - 190, 88, 241, 108, 26, 146, 123, 211, 178, 3, 249, 26, 47, 39, 164, 254, - 141, 70, 126, 228, 235, 36, 222, 243, 63, 201, 217, 73, 212, 249, 191, 212, - 219, 73, 20, 239, 35, 119, 39, 207, 47, 158, 57, 175, 241, 127, 18, 185, - 120, 29, 160, 200, 9, 202, 113, 131, 98, 197, 104, 118, 251, 253, 134, 24, - 102, 79, 52, 206, 158, 22, 140, 26, 167, 223, 53, 134, 104, 77, 70, 46, - 52, 240, 209, 180, 161, 107, 151, 252, 4, 92, 46, 248, 53, 88, 6, 75, - 35, 240, 16, 223, 20, 195, 246, 92, 97, 184, 100, 52, 137, 238, 232, 164, - 198, 165, 118, 115, 10, 241, 65, 15, 204, 115, 11, 134, 93, 224, 68, 102, - 183, 107, 139, 188, 4, 114, 240, 51, 157, 3, 205, 167, 240, 246, 90, 215, - 55, 232, 133, 76, 199, 86, 62, 186, 24, 150, 95, 171, 58, 25, 141, 76, - 24, 203, 132, 241, 219, 234, 85, 25, 251, 16, 93, 106, 238, 23, 237, 255, - 90, 171, 46, 149, 148, 147, 126, 245, 59, 21, 72, 6, 78, 227, 209, 183, - 137, 104, 7, 13, 99, 106, 86, 153, 199, 8, 209, 192, 12, 77, 200, 142, - 2, 62, 132, 139, 192, 210, 229, 116, 114, 18, 162, 226, 229, 88, 16, 111, - 42, 1, 21, 177, 134, 129, 194, 45, 37, 14, 52, 29, 194, 146, 110, 164, - 80, 192, 211, 6, 220, 241, 14, 94, 131, 30, 119, 132, 243, 176, 76, 104, - 207, 160, 27, 214, 213, 223, 71, 215, 189, 174, 178, 194, 17, 14, 203, 203, - 29, 110, 116, 2, 112, 96, 238, 48, 147, 28, 3, 45, 208, 133, 197, 198, - 91, 96, 154, 99, 168, 6, 158, 160, 6, 186, 177, 16, 172, 244, 76, 110, - 115, 80, 117, 15, 255, 120, 87, 117, 160, 219, 225, 242, 21, 234, 242, 134, - 195, 67, 217, 8, 97, 194, 56, 250, 38, 9, 226, 3, 158, 10, 9, 27, - 186, 80, 85, 141, 167, 210, 48, 149, 182, 54, 21, 230, 168, 198, 195, 218, - 6, 25, 222, 196, 225, 203, 238, 170, 145, 63, 209, 25, 7, 83, 45, 61, - 209, 216, 147, 29, 200, 174, 171, 110, 132, 38, 240, 95, 20, 66, 55, 66, - 83, 248, 239, 45, 176, 155, 123, 13, 195, 131, 24, 70, 164, 167, 16, 182, - 199, 227, 98, 12, 22, 23, 83, 173, 240, 67, 144, 1, 187, 34, 91, 126, - 48, 138, 198, 40, 247, 218, 128, 153, 135, 22, 187, 128, 192, 120, 80, 229, - 175, 149, 156, 29, 131, 119, 33, 171, 79, 92, 123, 219, 186, 203, 205, 241, - 182, 205, 111, 67, 59, 27, 149, 141, 74, 20, 222, 181, 11, 23, 119, 209, - 208, 222, 198, 221, 198, 221, 215, 0, 98, 24, 163, 13, 173, 52, 228, 120, - 17, 161, 198, 136, 81, 181, 245, 214, 178, 10, 19, 139, 44, 12, 161, 135, - 230, 196, 34, 27, 136, 39, 26, 15, 240, 5, 13, 186, 253, 241, 211, 120, - 62, 128, 117, 113, 106, 12, 199, 134, 205, 111, 230, 104, 63, 0, 127, 171, - 246, 15, 23, 204, 175, 176, 160, 245, 38, 221, 234, 87, 249, 9, 68, 241, - 126, 119, 50, 102, 252, 175, 239, 103, 110, 99, 230, 54, 229, 253, 19, 239, - 249, 96, 97, 22, 213, 226, 21, 253, 152, 97, 71, 20, 234, 171, 88, 39, - 97, 66, 206, 89, 216, 96, 48, 43, 231, 112, 45, 27, 193, 21, 124, 193, - 3, 113, 173, 231, 106, 213, 161, 244, 230, 201, 196, 83, 157, 245, 217, 48, - 155, 54, 204, 71, 214, 115, 100, 24, 78, 57, 37, 228, 100, 142, 57, 159, - 226, 93, 74, 78, 231, 70, 47, 19, 216, 203, 140, 124, 185, 255, 239, 34, - 1, 90, 37, 148, 21, 109, 197, 22, 106, 79, 173, 89, 0, 246, 94, 14, - 59, 47, 167, 72, 225, 234, 100, 220, 143, 124, 138, 151, 199, 121, 225, 103, - 214, 145, 40, 178, 124, 144, 35, 72, 173, 59, 25, 18, 215, 172, 78, 222, - 129, 227, 7, 230, 102, 223, 48, 167, 184, 55, 80, 55, 147, 172, 251, 57, - 126, 182, 172, 57, 222, 241, 28, 206, 193, 243, 88, 243, 62, 230, 24, 15, - 158, 199, 186, 255, 49, 3, 126, 32, 198, 90, 229, 209, 249, 164, 76, 1, - 92, 244, 100, 115, 122, 59, 186, 153, 59, 92, 119, 132, 139, 243, 196, 100, - 4, 126, 51, 255, 73, 63, 123, 123, 30, 163, 23, 253, 87, 114, 70, 173, - 74, 117, 188, 198, 57, 81, 219, 53, 232, 72, 127, 89, 216, 163, 118, 240, - 99, 80, 36, 61, 34, 217, 58, 82, 167, 53, 73, 252, 176, 21, 90, 6, - 241, 150, 212, 84, 128, 247, 166, 139, 166, 196, 61, 102, 53, 47, 204, 253, - 50, 148, 146, 42, 60, 223, 9, 74, 41, 148, 90, 239, 1, 159, 90, 207, - 247, 36, 186, 245, 231, 160, 149, 28, 55, 244, 164, 199, 255, 253, 51, 12, - 74, 16, 201, 207, 156, 180, 158, 221, 233, 239, 151, 106, 189, 43, 254, 15, - 200, 156, 82, 14, 153, 147, 195, 22, 55, 178, 33, 220, 189, 253, 67, 66, - 72, 127, 207, 227, 249, 242, 99, 237, 205, 147, 186, 191, 146, 90, 247, 166, - 238, 175, 164, 78, 172, 33, 122, 242, 172, 223, 176, 124, 143, 222, 2, 68, - 205, 64, 252, 27, 222, 114, 202, 204, 212, 124, 182, 1, 50, 142, 28, 114, - 184, 100, 56, 15, 234, 91, 128, 53, 215, 114, 186, 190, 45, 83, 148, 13, - 194, 8, 128, 68, 225, 215, 175, 123, 249, 94, 75, 111, 124, 125, 139, 32, - 134, 12, 12, 239, 128, 42, 191, 170, 81, 226, 30, 155, 197, 41, 118, 196, - 133, 213, 217, 216, 148, 40, 8, 227, 190, 134, 216, 75, 126, 165, 144, 183, - 128, 139, 160, 243, 26, 106, 131, 32, 225, 165, 156, 89, 16, 34, 27, 114, - 93, 67, 189, 8, 147, 38, 100, 109, 133, 172, 72, 32, 76, 192, 66, 144, - 194, 18, 184, 87, 154, 28, 178, 152, 201, 38, 59, 117, 218, 12, 132, 9, - 88, 70, 221, 10, 181, 183, 66, 163, 136, 164, 50, 57, 38, 52, 34, 30, - 112, 193, 114, 194, 125, 240, 214, 240, 185, 64, 222, 200, 167, 13, 47, 73, - 108, 112, 114, 17, 238, 147, 204, 49, 206, 20, 148, 228, 60, 47, 81, 157, - 119, 168, 31, 190, 66, 253, 124, 238, 115, 34, 114, 96, 116, 14, 115, 68, - 121, 17, 235, 133, 67, 209, 194, 162, 14, 123, 15, 140, 62, 101, 109, 175, - 207, 121, 175, 183, 55, 136, 216, 68, 251, 108, 175, 207, 69, 175, 39, 24, - 187, 216, 199, 189, 222, 254, 169, 94, 199, 206, 244, 246, 252, 236, 159, 239, - 249, 208, 12, 251, 5, 122, 62, 196, 8, 179, 125, 61, 79, 157, 162, 252, - 253, 158, 167, 151, 168, 206, 59, 212, 15, 95, 241, 119, 122, 222, 3, 144, - 230, 233, 246, 77, 31, 103, 142, 71, 138, 126, 198, 149, 241, 5, 113, 120, - 96, 155, 140, 19, 228, 87, 191, 88, 202, 72, 128, 65, 202, 102, 36, 49, - 176, 208, 175, 234, 7, 234, 126, 1, 128, 71, 125, 234, 85, 71, 29, 8, - 71, 13, 30, 127, 70, 65, 31, 75, 189, 44, 45, 127, 237, 71, 18, 66, - 88, 148, 250, 249, 235, 71, 112, 26, 118, 14, 149, 2, 245, 53, 139, 182, - 167, 148, 107, 22, 238, 229, 82, 19, 212, 197, 90, 81, 14, 221, 113, 97, - 149, 254, 85, 198, 127, 41, 246, 143, 27, 161, 147, 48, 167, 97, 247, 106, - 28, 67, 74, 78, 74, 205, 97, 181, 199, 159, 160, 64, 198, 178, 162, 239, - 21, 194, 144, 216, 133, 200, 93, 252, 130, 25, 161, 67, 124, 64, 94, 252, - 247, 213, 127, 244, 134, 255, 67, 36, 178, 127, 82, 207, 150, 84, 20, 86, - 119, 15, 5, 240, 140, 233, 211, 218, 164, 77, 75, 250, 181, 105, 156, 220, - 79, 204, 214, 172, 91, 61, 226, 23, 138, 104, 20, 135, 127, 213, 202, 250, - 56, 158, 126, 37, 150, 222, 79, 49, 83, 175, 232, 214, 126, 212, 169, 44, - 235, 31, 118, 237, 7, 252, 204, 218, 167, 149, 100, 239, 240, 43, 187, 53, - 132, 22, 125, 152, 201, 109, 25, 255, 37, 31, 215, 180, 109, 192, 219, 26, - 30, 82, 101, 109, 25, 220, 5, 225, 95, 34, 222, 0, 196, 252, 244, 160, - 189, 80, 107, 120, 234, 46, 212, 64, 49, 33, 221, 173, 74, 131, 126, 54, - 229, 207, 240, 120, 10, 142, 206, 55, 246, 14, 68, 139, 77, 144, 236, 236, - 72, 162, 43, 236, 202, 72, 237, 183, 202, 166, 236, 37, 83, 126, 11, 204, - 87, 227, 104, 24, 199, 101, 82, 126, 11, 216, 234, 74, 28, 221, 205, 7, - 105, 148, 33, 159, 213, 56, 9, 55, 31, 228, 80, 126, 11, 176, 195, 137, - 220, 171, 240, 192, 134, 118, 64, 203, 146, 100, 112, 43, 80, 34, 122, 101, - 98, 9, 12, 202, 200, 109, 25, 196, 51, 158, 146, 42, 66, 85, 10, 85, - 41, 148, 92, 57, 74, 104, 3, 83, 66, 123, 27, 138, 18, 107, 208, 145, - 86, 131, 78, 184, 30, 227, 142, 223, 24, 115, 25, 47, 69, 34, 27, 227, - 54, 250, 152, 51, 195, 159, 7, 72, 9, 201, 45, 25, 127, 163, 244, 171, - 58, 191, 16, 46, 161, 27, 52, 108, 56, 56, 61, 181, 148, 192, 69, 24, - 203, 238, 182, 183, 179, 180, 17, 102, 149, 88, 221, 122, 208, 125, 70, 183, - 54, 236, 143, 97, 72, 45, 148, 161, 188, 80, 76, 121, 161, 194, 175, 106, - 202, 79, 48, 253, 15, 73, 83, 248, 36, 208, 166, 160, 185, 158, 39, 93, - 179, 234, 213, 103, 215, 33, 25, 252, 49, 157, 175, 111, 221, 132, 234, 190, - 40, 78, 25, 224, 44, 95, 31, 195, 212, 248, 83, 223, 157, 175, 64, 2, - 123, 201, 41, 19, 221, 65, 105, 114, 80, 24, 7, 137, 215, 253, 54, 215, - 233, 97, 61, 245, 143, 105, 240, 185, 197, 112, 201, 65, 8, 77, 45, 129, - 40, 171, 80, 201, 40, 42, 32, 36, 84, 69, 26, 83, 122, 53, 200, 142, - 248, 17, 197, 148, 77, 205, 105, 196, 97, 141, 80, 210, 152, 130, 237, 105, - 70, 39, 59, 206, 90, 227, 220, 243, 163, 168, 106, 15, 245, 24, 147, 134, - 65, 60, 116, 195, 129, 11, 196, 101, 153, 163, 254, 24, 86, 203, 57, 135, - 226, 26, 180, 171, 92, 243, 13, 13, 60, 25, 63, 117, 137, 179, 142, 93, - 163, 190, 222, 75, 96, 119, 9, 61, 12, 75, 12, 47, 75, 215, 236, 24, - 206, 94, 241, 231, 154, 216, 83, 133, 28, 212, 209, 179, 134, 184, 161, 170, - 11, 133, 156, 32, 0, 46, 167, 78, 172, 19, 156, 122, 65, 220, 4, 139, - 43, 170, 198, 168, 239, 220, 85, 147, 106, 9, 129, 41, 71, 141, 158, 83, - 55, 157, 137, 148, 85, 58, 39, 42, 252, 190, 190, 136, 215, 91, 14, 56, - 157, 225, 104, 206, 161, 18, 76, 119, 14, 229, 102, 202, 243, 68, 210, 143, - 142, 188, 153, 224, 155, 250, 205, 12, 71, 72, 222, 76, 49, 140, 100, 149, - 37, 201, 230, 148, 95, 241, 87, 85, 112, 208, 253, 234, 234, 222, 63, 110, - 117, 255, 20, 202, 68, 182, 25, 103, 67, 86, 221, 189, 188, 8, 210, 100, - 191, 18, 30, 110, 69, 179, 18, 58, 22, 1, 97, 137, 150, 229, 251, 110, - 209, 172, 12, 16, 11, 219, 82, 10, 165, 17, 112, 5, 26, 82, 10, 101, - 248, 214, 124, 130, 152, 119, 89, 216, 167, 42, 98, 95, 14, 59, 237, 215, - 144, 182, 177, 164, 203, 151, 96, 135, 141, 193, 75, 90, 127, 169, 73, 8, - 46, 246, 70, 104, 100, 71, 231, 240, 119, 30, 53, 113, 227, 203, 73, 75, - 223, 184, 211, 55, 22, 18, 74, 133, 172, 158, 105, 57, 148, 193, 153, 166, - 46, 177, 215, 74, 22, 39, 195, 243, 78, 61, 11, 250, 102, 232, 60, 20, - 193, 191, 57, 191, 58, 142, 111, 163, 219, 229, 4, 143, 75, 4, 141, 148, - 104, 249, 20, 7, 34, 122, 71, 5, 197, 209, 241, 140, 137, 131, 104, 74, - 204, 253, 21, 55, 80, 172, 16, 252, 213, 75, 68, 223, 106, 78, 77, 114, - 162, 111, 14, 172, 45, 158, 208, 177, 75, 132, 235, 134, 124, 79, 244, 156, - 38, 200, 193, 245, 109, 37, 184, 134, 253, 80, 163, 242, 8, 8, 99, 14, - 23, 54, 129, 21, 23, 214, 25, 20, 163, 156, 0, 141, 2, 34, 1, 6, - 34, 72, 123, 160, 164, 20, 109, 34, 206, 168, 7, 70, 253, 169, 101, 88, - 56, 7, 162, 92, 190, 224, 136, 131, 129, 167, 33, 13, 67, 10, 218, 196, - 209, 131, 254, 232, 15, 120, 247, 200, 216, 63, 253, 137, 190, 5, 26, 125, - 100, 29, 134, 76, 255, 87, 12, 118, 139, 115, 126, 9, 203, 68, 14, 55, - 147, 33, 27, 201, 89, 21, 220, 101, 141, 158, 64, 52, 109, 152, 13, 132, - 218, 83, 2, 147, 65, 46, 166, 74, 116, 82, 19, 166, 72, 145, 223, 50, - 130, 220, 121, 155, 211, 230, 126, 225, 143, 200, 61, 13, 207, 127, 32, 17, - 227, 39, 70, 148, 221, 140, 228, 203, 82, 197, 49, 210, 232, 207, 172, 149, - 124, 5, 33, 239, 252, 59, 54, 140, 63, 235, 168, 200, 154, 82, 178, 204, - 145, 81, 54, 177, 38, 243, 174, 209, 28, 175, 100, 46, 216, 169, 109, 95, - 161, 99, 42, 175, 54, 30, 63, 97, 178, 87, 12, 35, 162, 90, 109, 77, - 206, 67, 154, 11, 151, 179, 86, 69, 214, 223, 177, 135, 61, 185, 71, 61, - 185, 179, 164, 175, 24, 72, 217, 171, 107, 178, 71, 173, 162, 55, 52, 16, - 14, 77, 6, 114, 8, 171, 44, 135, 176, 120, 114, 136, 178, 137, 160, 59, - 113, 189, 58, 108, 16, 94, 46, 236, 226, 17, 86, 57, 174, 139, 173, 176, - 52, 106, 155, 77, 162, 162, 117, 70, 90, 66, 80, 222, 106, 156, 75, 27, - 119, 192, 136, 29, 27, 211, 2, 235, 94, 140, 245, 19, 3, 36, 151, 203, - 188, 73, 146, 4, 195, 196, 173, 114, 250, 141, 141, 24, 111, 40, 140, 229, - 223, 84, 135, 153, 154, 9, 124, 254, 124, 96, 214, 240, 229, 194, 99, 251, - 179, 137, 170, 34, 123, 214, 197, 43, 185, 104, 203, 185, 232, 203, 185, 80, - 175, 194, 131, 4, 226, 187, 243, 254, 100, 210, 167, 255, 127, 254, 108, 18, - 203, 217, 68, 85, 39, 127, 167, 223, 176, 181, 22, 156, 39, 161, 74, 80, - 192, 218, 163, 196, 50, 119, 26, 173, 13, 133, 84, 223, 152, 97, 26, 141, - 26, 108, 113, 234, 14, 246, 20, 17, 152, 29, 106, 97, 53, 128, 96, 195, - 146, 139, 44, 173, 248, 62, 109, 248, 112, 9, 48, 159, 104, 65, 37, 19, - 173, 139, 224, 214, 86, 147, 180, 49, 120, 200, 196, 212, 228, 163, 95, 97, - 162, 178, 39, 137, 88, 90, 86, 53, 254, 216, 179, 47, 227, 144, 196, 44, - 146, 6, 21, 72, 97, 68, 37, 166, 66, 96, 194, 201, 77, 89, 138, 8, - 227, 58, 249, 77, 123, 20, 27, 56, 127, 86, 213, 7, 133, 18, 218, 56, - 20, 95, 103, 140, 154, 181, 77, 212, 172, 27, 132, 101, 239, 169, 28, 68, - 23, 12, 167, 170, 108, 75, 238, 245, 220, 51, 227, 97, 62, 155, 155, 176, - 79, 39, 120, 124, 28, 180, 2, 77, 60, 48, 131, 165, 208, 213, 230, 144, - 18, 199, 93, 90, 132, 42, 133, 22, 147, 247, 215, 146, 106, 189, 14, 114, - 50, 238, 201, 199, 125, 198, 56, 203, 233, 102, 7, 6, 218, 180, 56, 114, - 19, 229, 182, 44, 60, 21, 48, 176, 87, 157, 35, 242, 229, 184, 106, 90, - 244, 41, 50, 19, 10, 131, 103, 226, 195, 198, 87, 164, 177, 97, 143, 165, - 224, 209, 215, 66, 126, 47, 72, 197, 78, 18, 18, 25, 36, 236, 226, 66, - 165, 75, 120, 158, 70, 10, 19, 133, 233, 65, 36, 194, 96, 244, 212, 40, - 227, 198, 229, 171, 91, 111, 210, 149, 196, 170, 38, 106, 189, 178, 180, 57, - 203, 148, 186, 186, 76, 97, 26, 170, 34, 212, 190, 57, 236, 247, 252, 118, - 3, 216, 126, 156, 139, 87, 229, 194, 195, 50, 160, 11, 108, 69, 182, 115, - 116, 90, 183, 188, 163, 131, 133, 38, 58, 132, 22, 101, 252, 184, 132, 234, - 77, 148, 15, 175, 15, 118, 65, 158, 23, 30, 81, 241, 72, 248, 218, 100, - 44, 66, 244, 15, 127, 10, 254, 114, 4, 223, 70, 2, 4, 232, 113, 1, - 134, 189, 129, 202, 78, 31, 173, 136, 155, 14, 130, 60, 73, 149, 229, 69, - 239, 21, 65, 190, 219, 111, 130, 196, 91, 145, 205, 2, 161, 140, 144, 73, - 231, 210, 2, 170, 122, 23, 208, 181, 74, 65, 189, 225, 81, 11, 246, 107, - 207, 208, 227, 122, 99, 73, 51, 40, 130, 81, 57, 40, 174, 151, 213, 131, - 30, 141, 5, 43, 2, 140, 196, 167, 94, 31, 247, 6, 48, 7, 55, 250, - 147, 26, 162, 214, 155, 13, 163, 225, 221, 113, 193, 163, 69, 109, 210, 108, - 26, 67, 111, 104, 179, 95, 175, 226, 254, 130, 168, 148, 159, 108, 113, 49, - 23, 23, 11, 121, 137, 31, 155, 169, 76, 92, 14, 234, 54, 162, 243, 162, - 104, 249, 161, 66, 76, 223, 231, 53, 251, 164, 246, 17, 218, 37, 178, 249, - 135, 229, 74, 252, 254, 138, 250, 78, 210, 27, 125, 58, 62, 87, 115, 51, - 115, 104, 176, 241, 143, 135, 242, 77, 24, 240, 116, 34, 143, 23, 49, 2, - 241, 111, 224, 185, 122, 174, 213, 159, 12, 171, 147, 134, 27, 148, 204, 13, - 218, 125, 171, 37, 2, 222, 126, 168, 248, 92, 107, 228, 228, 105, 95, 216, - 54, 74, 59, 240, 1, 128, 120, 11, 114, 126, 117, 216, 154, 160, 89, 229, - 72, 26, 87, 65, 212, 135, 48, 115, 8, 162, 186, 55, 103, 246, 5, 161, - 241, 28, 52, 148, 97, 77, 205, 97, 223, 34, 176, 219, 105, 117, 104, 86, - 161, 59, 71, 235, 119, 48, 227, 254, 112, 50, 210, 27, 18, 179, 62, 195, - 25, 197, 128, 59, 29, 33, 87, 65, 144, 173, 54, 26, 186, 131, 42, 15, - 187, 85, 24, 214, 4, 108, 79, 39, 213, 41, 197, 25, 107, 142, 154, 148, - 107, 235, 150, 212, 164, 80, 207, 206, 19, 211, 235, 98, 47, 63, 161, 7, - 14, 14, 154, 145, 128, 141, 70, 187, 107, 10, 225, 80, 212, 12, 77, 131, - 94, 200, 81, 160, 115, 10, 237, 77, 168, 151, 16, 111, 152, 223, 104, 185, - 172, 115, 173, 231, 170, 214, 28, 71, 228, 8, 219, 213, 106, 193, 78, 120, - 8, 163, 103, 196, 45, 68, 80, 115, 236, 108, 228, 71, 222, 61, 236, 213, - 112, 142, 99, 6, 39, 140, 126, 175, 59, 167, 226, 74, 213, 17, 238, 210, - 231, 146, 40, 54, 220, 195, 228, 51, 50, 107, 4, 60, 15, 209, 177, 173, - 191, 26, 189, 193, 120, 254, 149, 204, 196, 201, 250, 178, 202, 119, 95, 110, - 99, 151, 121, 122, 62, 220, 80, 183, 58, 158, 16, 118, 53, 107, 207, 6, - 155, 249, 177, 242, 13, 169, 49, 25, 210, 154, 208, 54, 168, 16, 120, 61, - 24, 246, 235, 240, 113, 184, 25, 30, 154, 195, 209, 120, 233, 11, 64, 21, - 45, 161, 196, 87, 173, 105, 21, 47, 97, 224, 206, 208, 142, 175, 102, 8, - 24, 114, 174, 78, 51, 68, 133, 220, 12, 243, 48, 174, 186, 85, 196, 207, - 97, 243, 42, 204, 236, 8, 251, 7, 75, 146, 128, 98, 166, 217, 125, 214, - 70, 172, 230, 133, 49, 236, 139, 33, 7, 179, 238, 208, 24, 225, 32, 27, - 244, 199, 240, 99, 86, 187, 82, 23, 102, 3, 102, 228, 133, 166, 167, 104, - 181, 41, 42, 180, 242, 94, 119, 124, 47, 91, 27, 186, 25, 123, 18, 226, - 216, 196, 41, 9, 21, 168, 152, 55, 111, 32, 55, 191, 43, 250, 44, 62, - 81, 19, 106, 30, 231, 29, 35, 207, 75, 248, 10, 28, 54, 55, 97, 62, - 174, 74, 153, 152, 187, 172, 210, 226, 99, 65, 252, 136, 239, 141, 18, 44, - 227, 80, 3, 92, 179, 89, 14, 162, 223, 154, 125, 28, 195, 44, 115, 79, - 28, 255, 121, 10, 225, 93, 99, 12, 214, 139, 93, 115, 52, 94, 30, 57, - 78, 134, 208, 197, 180, 28, 192, 244, 199, 70, 170, 167, 173, 113, 8, 241, - 177, 61, 53, 96, 104, 81, 103, 55, 140, 58, 14, 75, 50, 220, 164, 175, - 205, 115, 104, 224, 124, 129, 95, 37, 58, 94, 199, 50, 240, 211, 2, 40, - 230, 74, 202, 229, 182, 175, 226, 218, 188, 82, 23, 248, 40, 106, 172, 188, - 222, 115, 130, 175, 206, 199, 253, 21, 161, 129, 164, 95, 35, 238, 43, 225, - 17, 29, 84, 208, 58, 191, 190, 127, 165, 176, 251, 34, 24, 218, 85, 137, - 235, 77, 233, 28, 170, 201, 155, 215, 108, 65, 247, 118, 157, 78, 196, 99, - 76, 79, 1, 248, 124, 224, 76, 249, 240, 29, 155, 216, 80, 144, 144, 9, - 51, 112, 237, 61, 80, 17, 179, 198, 87, 144, 155, 64, 136, 147, 170, 181, - 254, 132, 13, 197, 134, 49, 50, 177, 124, 110, 83, 53, 171, 38, 126, 93, - 72, 245, 2, 49, 107, 6, 148, 220, 64, 179, 56, 49, 234, 241, 235, 91, - 251, 25, 175, 44, 12, 78, 151, 228, 72, 181, 229, 180, 90, 78, 75, 186, - 80, 239, 206, 148, 200, 204, 63, 89, 197, 248, 137, 139, 40, 118, 46, 237, - 57, 43, 115, 103, 60, 200, 39, 229, 83, 99, 121, 168, 106, 228, 32, 2, - 249, 160, 101, 210, 124, 163, 30, 215, 34, 65, 23, 224, 118, 29, 79, 3, - 103, 19, 25, 12, 12, 212, 242, 248, 14, 111, 136, 204, 172, 49, 103, 231, - 104, 9, 78, 35, 82, 245, 175, 0, 104, 48, 19, 88, 90, 19, 86, 36, - 71, 87, 39, 146, 115, 241, 233, 93, 224, 122, 205, 1, 174, 119, 117, 34, - 186, 163, 18, 225, 145, 244, 239, 57, 221, 27, 37, 225, 30, 80, 176, 128, - 100, 46, 205, 211, 36, 157, 179, 12, 246, 36, 133, 205, 197, 159, 165, 208, - 48, 199, 213, 189, 249, 150, 9, 159, 204, 138, 156, 89, 212, 133, 50, 27, - 217, 147, 30, 187, 135, 226, 254, 42, 227, 161, 9, 44, 228, 127, 72, 106, - 52, 164, 203, 86, 95, 134, 101, 236, 143, 224, 31, 210, 31, 65, 82, 186, - 101, 189, 55, 176, 240, 188, 5, 37, 209, 217, 8, 80, 79, 29, 205, 168, - 40, 68, 63, 11, 50, 138, 80, 10, 189, 72, 233, 109, 110, 111, 115, 145, - 185, 152, 99, 108, 101, 184, 211, 111, 226, 194, 241, 52, 54, 123, 176, 213, - 247, 24, 160, 12, 201, 146, 212, 187, 157, 122, 13, 109, 147, 197, 129, 38, - 143, 34, 252, 8, 72, 68, 135, 132, 48, 146, 91, 67, 20, 215, 32, 218, - 6, 164, 136, 227, 241, 8, 12, 94, 212, 42, 194, 106, 56, 130, 133, 149, - 202, 192, 204, 17, 212, 109, 84, 21, 69, 195, 4, 103, 143, 6, 174, 223, - 227, 76, 9, 37, 51, 163, 108, 39, 231, 162, 20, 237, 62, 188, 66, 219, - 108, 191, 49, 115, 152, 141, 16, 101, 195, 172, 98, 196, 13, 83, 253, 205, - 190, 171, 255, 250, 87, 168, 253, 93, 37, 11, 87, 118, 166, 227, 144, 153, - 81, 37, 52, 152, 201, 25, 73, 153, 244, 133, 56, 115, 112, 133, 102, 185, - 67, 185, 200, 50, 214, 127, 244, 30, 232, 62, 192, 230, 56, 84, 132, 45, - 54, 145, 22, 137, 98, 165, 16, 176, 42, 7, 41, 195, 161, 237, 95, 67, - 69, 104, 15, 204, 41, 135, 93, 105, 84, 17, 131, 136, 23, 73, 207, 229, - 148, 55, 233, 1, 67, 30, 185, 186, 0, 195, 160, 132, 81, 182, 206, 179, - 71, 146, 80, 135, 16, 84, 219, 155, 39, 166, 246, 94, 204, 176, 30, 137, - 108, 100, 21, 126, 118, 181, 20, 103, 178, 161, 167, 224, 189, 107, 42, 235, - 171, 102, 212, 129, 77, 84, 88, 87, 51, 38, 33, 174, 72, 69, 115, 6, - 78, 0, 244, 170, 109, 132, 18, 174, 222, 36, 148, 192, 54, 102, 59, 191, - 77, 220, 235, 192, 211, 168, 78, 170, 131, 40, 12, 195, 49, 233, 141, 55, - 215, 156, 187, 10, 171, 43, 89, 17, 138, 29, 119, 244, 73, 86, 223, 28, - 97, 170, 77, 220, 106, 97, 65, 152, 62, 206, 97, 97, 82, 68, 12, 220, - 217, 227, 36, 54, 168, 142, 235, 109, 180, 65, 65, 88, 55, 214, 44, 234, - 102, 114, 67, 216, 126, 71, 222, 2, 27, 68, 143, 68, 134, 176, 245, 110, - 127, 2, 82, 235, 38, 171, 92, 17, 43, 215, 221, 12, 160, 140, 27, 71, - 213, 5, 12, 52, 202, 225, 129, 8, 237, 16, 109, 18, 94, 15, 34, 166, - 42, 255, 47, 104, 99, 196, 74, 70, 85, 214, 43, 42, 73, 92, 117, 86, - 192, 196, 112, 248, 50, 136, 173, 137, 118, 150, 218, 35, 87, 192, 104, 178, - 142, 122, 7, 194, 147, 67, 28, 118, 121, 46, 45, 88, 108, 93, 226, 217, - 49, 251, 22, 105, 14, 119, 240, 6, 157, 229, 180, 17, 178, 88, 246, 10, - 68, 75, 80, 152, 238, 11, 75, 98, 24, 55, 141, 129, 62, 69, 21, 15, - 142, 86, 104, 42, 40, 238, 255, 74, 51, 11, 64, 11, 107, 182, 233, 97, - 99, 114, 71, 99, 224, 33, 150, 122, 100, 182, 55, 100, 234, 2, 91, 209, - 45, 216, 138, 110, 189, 142, 222, 34, 30, 67, 150, 4, 183, 197, 89, 99, - 196, 226, 12, 155, 77, 62, 188, 126, 152, 25, 218, 53, 224, 103, 229, 249, - 0, 2, 98, 200, 98, 105, 156, 65, 173, 70, 216, 23, 240, 227, 44, 121, - 114, 40, 1, 136, 253, 235, 99, 11, 67, 126, 72, 160, 137, 10, 105, 43, - 21, 98, 83, 3, 245, 30, 83, 158, 49, 107, 35, 232, 126, 198, 94, 72, - 196, 92, 190, 106, 59, 36, 164, 159, 40, 229, 103, 211, 248, 203, 250, 16, - 75, 62, 178, 6, 27, 25, 235, 27, 138, 127, 253, 63, 209, 78, 217, 207, - 53, 211, 79, 197, 215, 127, 50, 126, 66, 116, 67, 226, 71, 221, 160, 127, - 166, 27, 50, 127, 161, 27, 62, 78, 179, 212, 22, 127, 33, 153, 254, 215, - 146, 37, 176, 211, 179, 194, 243, 112, 254, 128, 107, 142, 206, 214, 156, 170, - 247, 102, 206, 28, 19, 209, 74, 27, 39, 109, 103, 134, 111, 98, 75, 197, - 54, 37, 28, 103, 1, 110, 87, 230, 208, 179, 49, 93, 37, 35, 103, 99, - 20, 113, 78, 58, 114, 98, 22, 240, 194, 56, 233, 18, 82, 5, 155, 56, - 137, 224, 14, 254, 66, 100, 210, 17, 195, 84, 50, 194, 19, 26, 54, 171, - 226, 26, 194, 16, 136, 223, 164, 103, 44, 139, 159, 13, 206, 51, 247, 208, - 40, 118, 111, 61, 66, 65, 52, 39, 108, 231, 220, 176, 109, 52, 210, 96, - 26, 106, 90, 218, 80, 155, 105, 90, 19, 131, 55, 13, 109, 118, 58, 248, - 62, 156, 246, 60, 183, 174, 62, 108, 96, 26, 208, 3, 67, 52, 34, 96, - 240, 201, 252, 44, 15, 118, 251, 236, 254, 146, 255, 30, 241, 223, 93, 57, - 72, 23, 106, 80, 38, 185, 91, 149, 47, 85, 249, 72, 149, 119, 25, 181, - 47, 123, 88, 228, 15, 139, 242, 101, 81, 62, 42, 202, 187, 69, 191, 78, - 10, 222, 42, 177, 215, 122, 53, 81, 225, 203, 163, 221, 200, 26, 98, 82, - 87, 56, 118, 74, 171, 113, 251, 63, 57, 120, 105, 52, 130, 50, 39, 63, - 164, 128, 163, 161, 97, 88, 65, 57, 161, 200, 14, 25, 228, 46, 20, 37, - 136, 206, 90, 248, 9, 113, 94, 94, 57, 120, 142, 27, 103, 72, 235, 132, - 194, 191, 128, 167, 61, 152, 60, 77, 210, 179, 223, 254, 198, 87, 122, 255, - 73, 49, 213, 94, 106, 139, 147, 98, 159, 141, 13, 227, 23, 75, 136, 115, - 220, 80, 14, 233, 141, 150, 213, 174, 203, 46, 141, 175, 179, 184, 70, 12, - 183, 109, 246, 203, 206, 6, 62, 19, 203, 149, 32, 2, 220, 180, 251, 27, - 110, 8, 156, 19, 213, 167, 209, 4, 70, 37, 163, 221, 101, 98, 204, 12, - 63, 127, 65, 49, 57, 123, 11, 216, 70, 238, 85, 1, 33, 129, 17, 45, - 110, 132, 213, 168, 135, 8, 23, 36, 134, 185, 231, 121, 155, 158, 123, 104, - 115, 209, 145, 11, 237, 64, 55, 157, 66, 134, 108, 67, 14, 205, 13, 246, - 202, 88, 14, 150, 239, 129, 185, 97, 130, 80, 136, 158, 104, 220, 190, 69, - 20, 199, 45, 133, 56, 164, 195, 88, 150, 32, 9, 102, 89, 120, 51, 176, - 235, 203, 101, 197, 59, 44, 47, 254, 134, 67, 44, 105, 84, 20, 14, 75, - 95, 95, 46, 61, 222, 97, 13, 222, 75, 97, 55, 87, 223, 145, 249, 248, - 29, 205, 213, 119, 100, 62, 124, 7, 105, 197, 161, 209, 66, 118, 19, 26, - 171, 233, 204, 17, 180, 241, 121, 77, 71, 147, 27, 32, 127, 191, 241, 219, - 140, 255, 54, 203, 111, 169, 51, 17, 78, 136, 231, 31, 227, 249, 111, 163, - 25, 69, 64, 145, 198, 144, 61, 37, 72, 138, 244, 100, 82, 203, 24, 92, - 97, 156, 254, 25, 210, 255, 68, 83, 50, 207, 249, 141, 206, 38, 178, 192, - 51, 99, 243, 196, 147, 180, 122, 12, 13, 150, 241, 120, 175, 30, 67, 163, - 117, 49, 153, 109, 122, 166, 47, 167, 71, 121, 73, 32, 128, 111, 134, 96, - 232, 173, 83, 207, 15, 186, 213, 81, 175, 138, 10, 78, 110, 67, 83, 131, - 84, 50, 219, 197, 227, 246, 114, 141, 126, 187, 42, 116, 57, 194, 52, 144, - 231, 241, 25, 51, 165, 171, 182, 137, 138, 153, 94, 143, 180, 63, 189, 65, - 215, 232, 185, 234, 172, 126, 12, 9, 242, 32, 213, 215, 125, 179, 218, 235, - 91, 141, 88, 153, 156, 191, 190, 74, 213, 110, 171, 15, 187, 238, 118, 239, - 3, 93, 4, 179, 142, 33, 181, 2, 214, 193, 209, 80, 51, 133, 68, 230, - 93, 3, 67, 86, 122, 175, 79, 41, 111, 25, 34, 106, 243, 186, 202, 115, - 19, 229, 31, 59, 37, 151, 141, 241, 26, 11, 202, 129, 105, 27, 63, 105, - 196, 245, 142, 210, 253, 243, 158, 197, 10, 175, 198, 122, 215, 226, 181, 94, - 197, 131, 126, 183, 83, 125, 162, 227, 133, 111, 200, 48, 221, 51, 96, 131, - 78, 182, 84, 13, 195, 26, 81, 197, 223, 229, 158, 135, 121, 142, 84, 112, - 100, 174, 213, 160, 11, 127, 107, 173, 122, 112, 209, 139, 254, 146, 249, 21, - 47, 14, 103, 36, 92, 166, 160, 79, 46, 115, 208, 139, 178, 229, 84, 97, - 119, 213, 112, 244, 80, 107, 27, 248, 3, 74, 122, 79, 27, 169, 208, 140, - 108, 33, 212, 112, 67, 137, 235, 192, 38, 113, 212, 114, 54, 122, 95, 115, - 122, 86, 56, 97, 116, 165, 33, 77, 33, 153, 90, 37, 185, 247, 84, 114, - 137, 137, 158, 251, 79, 169, 220, 204, 138, 25, 89, 173, 50, 210, 211, 139, - 88, 115, 174, 172, 146, 162, 27, 201, 150, 138, 183, 219, 58, 35, 42, 178, - 128, 128, 149, 19, 141, 147, 144, 168, 158, 55, 153, 48, 94, 229, 109, 38, - 133, 210, 124, 73, 93, 225, 144, 151, 234, 227, 156, 143, 189, 93, 26, 141, - 115, 62, 114, 119, 169, 103, 54, 208, 158, 84, 69, 231, 11, 184, 70, 143, - 101, 45, 142, 206, 73, 156, 224, 62, 203, 8, 238, 231, 68, 97, 191, 196, - 95, 127, 123, 236, 245, 158, 94, 57, 158, 15, 218, 4, 215, 172, 40, 27, - 118, 60, 24, 186, 61, 14, 198, 66, 250, 150, 52, 23, 129, 115, 17, 152, - 216, 146, 254, 8, 216, 72, 252, 97, 91, 27, 193, 80, 125, 28, 140, 205, - 241, 98, 52, 14, 66, 116, 39, 28, 110, 163, 115, 30, 129, 82, 32, 56, - 184, 61, 252, 53, 164, 197, 130, 33, 44, 58, 198, 198, 176, 185, 63, 236, - 143, 0, 93, 170, 193, 24, 161, 88, 216, 245, 13, 187, 30, 157, 215, 55, - 230, 245, 72, 16, 133, 87, 244, 53, 67, 153, 53, 148, 150, 44, 250, 205, - 120, 235, 189, 233, 61, 200, 119, 200, 140, 189, 210, 235, 230, 18, 145, 241, - 59, 124, 245, 194, 194, 245, 155, 84, 220, 206, 169, 62, 59, 112, 20, 28, - 237, 34, 221, 23, 255, 33, 163, 255, 98, 12, 189, 95, 137, 148, 76, 188, - 248, 191, 201, 5, 224, 71, 240, 29, 162, 204, 255, 77, 240, 29, 174, 137, - 178, 70, 110, 31, 191, 202, 25, 230, 209, 65, 191, 105, 79, 24, 249, 109, - 114, 47, 221, 207, 167, 122, 199, 145, 192, 95, 8, 116, 255, 100, 222, 85, - 147, 176, 217, 12, 219, 228, 63, 5, 98, 98, 4, 42, 193, 95, 245, 128, - 198, 60, 20, 140, 86, 5, 155, 41, 190, 11, 32, 50, 120, 163, 215, 159, - 146, 135, 10, 207, 252, 101, 98, 194, 56, 89, 235, 106, 63, 34, 19, 78, - 171, 133, 254, 193, 176, 218, 52, 65, 154, 232, 15, 133, 41, 117, 117, 56, - 236, 207, 126, 0, 13, 242, 222, 16, 213, 246, 145, 156, 12, 50, 139, 123, - 208, 42, 160, 19, 141, 238, 199, 142, 195, 171, 48, 22, 188, 132, 185, 228, - 175, 216, 177, 172, 132, 172, 147, 157, 34, 170, 43, 206, 65, 127, 209, 195, - 91, 96, 171, 224, 254, 248, 43, 180, 124, 29, 81, 140, 109, 148, 1, 229, - 57, 202, 127, 208, 254, 73, 120, 156, 244, 248, 243, 178, 198, 165, 115, 12, - 236, 19, 72, 254, 142, 199, 184, 56, 242, 144, 82, 232, 86, 49, 233, 153, - 22, 17, 124, 193, 244, 209, 66, 84, 30, 104, 35, 188, 238, 77, 186, 4, - 203, 164, 66, 55, 78, 145, 30, 130, 17, 165, 179, 51, 20, 118, 93, 103, - 78, 231, 16, 57, 227, 133, 2, 193, 0, 94, 24, 102, 121, 69, 139, 35, - 173, 141, 108, 85, 116, 134, 1, 95, 17, 201, 187, 128, 217, 83, 227, 38, - 13, 125, 25, 130, 226, 4, 37, 249, 235, 219, 182, 195, 240, 171, 186, 14, - 28, 181, 126, 191, 43, 14, 72, 184, 15, 114, 208, 231, 118, 188, 228, 197, - 225, 12, 3, 222, 245, 176, 91, 92, 245, 228, 229, 61, 76, 139, 35, 235, - 95, 162, 225, 165, 190, 245, 114, 228, 194, 18, 217, 48, 71, 104, 164, 208, - 144, 13, 139, 126, 161, 200, 94, 87, 223, 15, 61, 125, 71, 163, 144, 42, - 249, 214, 54, 218, 142, 50, 141, 4, 226, 141, 130, 96, 214, 171, 142, 219, - 8, 223, 10, 245, 24, 57, 31, 7, 122, 68, 124, 13, 105, 95, 31, 183, - 2, 158, 32, 247, 249, 3, 241, 138, 184, 247, 232, 169, 162, 74, 143, 185, - 220, 211, 215, 95, 191, 254, 142, 39, 102, 179, 95, 20, 185, 253, 139, 194, - 61, 64, 182, 2, 83, 63, 34, 170, 217, 139, 200, 244, 91, 64, 188, 42, - 254, 16, 127, 126, 199, 63, 223, 144, 202, 13, 154, 5, 194, 66, 250, 134, - 120, 73, 124, 74, 224, 169, 132, 40, 139, 252, 45, 78, 56, 52, 226, 252, - 59, 188, 12, 126, 162, 57, 17, 42, 179, 136, 246, 82, 68, 251, 59, 150, - 76, 178, 189, 17, 43, 14, 158, 171, 189, 49, 139, 195, 243, 200, 214, 255, - 199, 222, 187, 119, 39, 114, 36, 105, 227, 255, 215, 167, 168, 198, 244, 136, - 75, 129, 168, 42, 64, 82, 171, 105, 111, 183, 103, 215, 227, 115, 236, 126, - 231, 109, 123, 127, 158, 89, 181, 90, 7, 1, 221, 48, 141, 0, 115, 145, - 0, 153, 239, 254, 198, 19, 145, 183, 186, 128, 104, 219, 51, 187, 123, 206, - 239, 216, 141, 170, 50, 179, 242, 18, 121, 139, 140, 140, 120, 194, 255, 187, - 9, 219, 84, 134, 167, 104, 137, 56, 126, 28, 149, 254, 22, 252, 157, 193, - 86, 43, 168, 225, 37, 237, 132, 54, 48, 84, 129, 12, 213, 69, 125, 231, - 113, 135, 150, 168, 192, 171, 117, 176, 185, 166, 95, 191, 234, 175, 130, 13, - 253, 222, 95, 7, 205, 86, 96, 106, 198, 122, 218, 87, 170, 3, 175, 203, - 129, 54, 28, 193, 183, 17, 190, 171, 193, 38, 181, 178, 98, 159, 153, 120, - 186, 87, 185, 233, 208, 170, 14, 77, 228, 227, 32, 252, 22, 156, 131, 25, - 196, 136, 118, 7, 55, 215, 21, 191, 213, 94, 239, 169, 77, 219, 22, 240, - 191, 105, 175, 182, 181, 254, 159, 180, 91, 27, 176, 45, 167, 126, 123, 208, - 182, 178, 71, 177, 20, 208, 150, 231, 246, 188, 58, 40, 28, 139, 167, 208, - 202, 193, 83, 48, 100, 177, 249, 178, 238, 149, 182, 102, 91, 78, 247, 155, - 179, 237, 91, 209, 140, 1, 91, 14, 82, 130, 210, 223, 249, 3, 75, 51, - 235, 39, 219, 100, 213, 28, 46, 71, 140, 0, 144, 159, 146, 247, 113, 72, - 19, 71, 40, 124, 227, 78, 167, 233, 124, 209, 27, 118, 123, 67, 86, 176, - 96, 59, 12, 232, 240, 9, 30, 201, 73, 112, 114, 55, 162, 69, 1, 202, - 76, 157, 4, 84, 205, 154, 117, 182, 54, 172, 173, 181, 222, 248, 187, 180, - 29, 145, 201, 182, 198, 70, 45, 163, 201, 231, 219, 177, 58, 133, 125, 1, - 107, 97, 170, 3, 230, 66, 233, 66, 152, 250, 228, 91, 100, 217, 246, 196, - 207, 61, 183, 113, 198, 224, 49, 228, 205, 179, 147, 178, 208, 176, 6, 26, - 86, 49, 33, 46, 164, 13, 117, 14, 52, 43, 181, 103, 154, 170, 107, 1, - 172, 163, 53, 16, 65, 107, 0, 222, 244, 214, 155, 93, 161, 102, 90, 228, - 216, 61, 22, 35, 190, 248, 131, 76, 201, 135, 247, 116, 255, 22, 217, 188, - 234, 248, 13, 125, 37, 23, 241, 149, 92, 46, 252, 132, 71, 3, 100, 117, - 55, 89, 224, 6, 64, 68, 178, 126, 94, 70, 85, 41, 216, 95, 251, 114, - 23, 255, 156, 206, 158, 234, 203, 186, 190, 220, 249, 56, 162, 69, 103, 237, - 220, 174, 219, 210, 163, 108, 233, 12, 123, 193, 42, 234, 40, 122, 248, 116, - 209, 27, 41, 122, 136, 162, 197, 150, 192, 45, 119, 147, 91, 110, 124, 16, - 116, 195, 219, 242, 37, 118, 74, 20, 253, 123, 219, 255, 229, 245, 77, 88, - 73, 46, 70, 131, 249, 140, 22, 223, 207, 24, 170, 52, 255, 87, 115, 168, - 125, 220, 140, 105, 193, 31, 187, 250, 139, 188, 76, 252, 104, 19, 67, 25, - 233, 201, 141, 40, 49, 107, 88, 61, 54, 145, 127, 231, 108, 207, 210, 236, - 84, 234, 204, 75, 212, 80, 179, 159, 97, 231, 108, 151, 16, 202, 180, 26, - 26, 60, 46, 129, 104, 211, 48, 66, 25, 45, 149, 105, 164, 225, 229, 114, - 27, 5, 253, 180, 79, 243, 193, 32, 201, 116, 42, 118, 240, 198, 169, 18, - 149, 93, 131, 25, 71, 232, 243, 194, 229, 70, 189, 144, 233, 114, 246, 18, - 90, 27, 122, 253, 163, 5, 47, 124, 30, 64, 87, 167, 24, 211, 191, 38, - 253, 107, 209, 191, 246, 115, 165, 240, 52, 31, 44, 87, 115, 28, 118, 18, - 89, 201, 154, 249, 72, 11, 114, 181, 24, 151, 89, 170, 92, 42, 70, 196, - 212, 234, 103, 10, 111, 57, 225, 109, 121, 46, 158, 65, 8, 227, 102, 180, - 47, 11, 89, 136, 41, 36, 118, 50, 106, 62, 153, 81, 182, 76, 49, 146, - 123, 34, 35, 53, 244, 102, 163, 121, 119, 124, 251, 144, 28, 99, 37, 1, - 16, 235, 151, 85, 252, 193, 1, 70, 167, 46, 58, 236, 182, 109, 86, 250, - 129, 136, 159, 232, 100, 155, 235, 237, 152, 53, 111, 105, 206, 17, 195, 3, - 69, 62, 83, 74, 178, 147, 173, 151, 118, 239, 163, 95, 152, 119, 192, 138, - 99, 93, 124, 168, 133, 181, 117, 48, 164, 223, 13, 49, 183, 81, 101, 94, - 41, 61, 84, 135, 53, 122, 168, 133, 112, 92, 71, 39, 63, 73, 42, 73, - 94, 241, 135, 242, 209, 166, 28, 172, 171, 155, 32, 82, 95, 224, 155, 114, - 109, 77, 137, 10, 238, 132, 156, 229, 0, 62, 172, 248, 247, 62, 195, 76, - 174, 248, 247, 62, 220, 39, 231, 126, 138, 159, 84, 133, 193, 115, 102, 222, - 76, 246, 75, 189, 213, 237, 168, 71, 12, 228, 252, 78, 104, 133, 228, 135, - 32, 55, 126, 155, 228, 155, 120, 48, 85, 147, 61, 108, 87, 141, 206, 189, - 65, 187, 161, 192, 78, 147, 111, 95, 148, 94, 73, 59, 100, 33, 52, 164, - 86, 171, 200, 133, 112, 108, 97, 35, 3, 65, 169, 82, 38, 184, 162, 43, - 158, 51, 215, 194, 29, 97, 212, 35, 8, 198, 161, 215, 7, 184, 164, 139, - 36, 151, 20, 54, 92, 84, 129, 60, 204, 0, 232, 183, 101, 96, 3, 104, - 13, 169, 176, 197, 191, 192, 51, 109, 114, 211, 69, 72, 71, 99, 109, 200, - 233, 0, 232, 179, 202, 77, 23, 35, 93, 172, 243, 3, 114, 211, 125, 110, - 186, 38, 210, 53, 117, 126, 192, 250, 1, 22, 65, 54, 93, 11, 233, 90, - 58, 191, 86, 89, 240, 8, 178, 233, 218, 72, 215, 214, 249, 181, 81, 191, - 220, 116, 103, 72, 119, 166, 243, 59, 67, 253, 114, 211, 157, 35, 221, 185, - 206, 239, 156, 210, 101, 15, 230, 202, 103, 12, 142, 145, 14, 188, 193, 53, - 222, 86, 252, 118, 175, 222, 12, 200, 129, 196, 241, 219, 61, 222, 138, 23, - 56, 20, 74, 191, 93, 151, 11, 185, 119, 116, 203, 193, 114, 222, 29, 244, - 231, 180, 207, 177, 177, 6, 79, 102, 154, 201, 193, 182, 65, 179, 151, 166, - 110, 176, 13, 131, 117, 20, 108, 162, 96, 27, 5, 235, 56, 216, 196, 193, - 54, 14, 222, 53, 130, 111, 27, 193, 155, 6, 75, 123, 19, 58, 3, 239, - 162, 224, 219, 40, 120, 19, 201, 75, 28, 124, 27, 7, 111, 226, 236, 252, - 182, 229, 42, 171, 108, 224, 166, 210, 198, 211, 93, 234, 41, 159, 100, 114, - 75, 247, 96, 41, 232, 163, 81, 207, 106, 21, 100, 43, 159, 194, 214, 64, - 60, 241, 155, 148, 81, 73, 179, 242, 229, 90, 73, 219, 71, 227, 17, 147, - 128, 8, 133, 199, 16, 215, 166, 48, 126, 163, 9, 179, 183, 78, 163, 212, - 218, 235, 173, 239, 58, 74, 55, 9, 139, 167, 58, 30, 156, 177, 141, 55, - 235, 249, 148, 119, 254, 250, 7, 147, 164, 187, 206, 36, 225, 89, 145, 204, - 36, 226, 250, 157, 163, 58, 38, 147, 77, 50, 147, 84, 18, 100, 178, 77, - 102, 18, 179, 5, 248, 5, 183, 71, 103, 178, 77, 102, 146, 74, 130, 76, - 198, 87, 124, 81, 18, 214, 160, 235, 119, 73, 236, 73, 173, 45, 15, 103, - 181, 11, 121, 128, 97, 34, 148, 201, 202, 156, 46, 174, 105, 216, 42, 226, - 21, 155, 187, 160, 105, 12, 94, 235, 172, 4, 56, 190, 31, 48, 230, 19, - 164, 118, 114, 137, 64, 199, 114, 209, 96, 249, 168, 186, 170, 162, 124, 27, - 211, 26, 2, 209, 79, 120, 233, 111, 248, 33, 186, 244, 183, 252, 16, 95, - 210, 244, 197, 67, 147, 162, 248, 161, 69, 81, 252, 208, 166, 40, 56, 117, - 45, 158, 81, 20, 63, 156, 83, 20, 63, 92, 80, 84, 204, 25, 54, 40, - 78, 158, 40, 239, 173, 60, 69, 151, 180, 196, 32, 139, 53, 144, 59, 214, - 148, 228, 158, 95, 55, 120, 221, 208, 235, 3, 191, 110, 241, 186, 109, 32, - 49, 50, 165, 178, 116, 98, 188, 110, 34, 147, 24, 175, 219, 200, 36, 70, - 33, 84, 186, 78, 140, 215, 77, 108, 18, 227, 117, 27, 235, 196, 161, 205, - 153, 234, 119, 31, 218, 156, 233, 245, 33, 180, 57, 135, 72, 108, 115, 230, - 196, 54, 103, 78, 108, 115, 70, 226, 200, 38, 38, 98, 222, 71, 54, 49, - 189, 62, 68, 54, 49, 81, 99, 178, 110, 112, 81, 68, 134, 10, 154, 83, - 3, 5, 42, 212, 206, 75, 127, 178, 145, 40, 4, 172, 56, 106, 37, 137, - 40, 106, 43, 81, 43, 73, 75, 81, 247, 146, 72, 185, 22, 66, 166, 21, - 144, 163, 42, 185, 84, 238, 229, 25, 159, 81, 14, 241, 203, 6, 28, 87, - 227, 165, 83, 11, 85, 73, 234, 113, 171, 30, 203, 82, 183, 216, 212, 45, - 54, 117, 139, 229, 139, 216, 212, 45, 54, 117, 139, 37, 135, 216, 212, 45, - 54, 117, 139, 109, 221, 98, 110, 143, 212, 45, 230, 6, 72, 221, 98, 180, - 78, 215, 45, 182, 117, 139, 109, 221, 98, 91, 183, 72, 234, 22, 153, 186, - 69, 166, 110, 145, 212, 45, 50, 117, 139, 76, 221, 34, 169, 91, 100, 234, - 22, 37, 234, 22, 161, 110, 161, 212, 45, 66, 221, 66, 169, 91, 132, 186, - 133, 170, 110, 145, 173, 91, 100, 235, 22, 217, 186, 133, 82, 55, 16, 59, - 228, 186, 161, 11, 66, 174, 155, 68, 33, 96, 197, 81, 43, 73, 132, 28, - 36, 106, 37, 105, 81, 55, 73, 36, 117, 171, 113, 174, 92, 185, 154, 100, - 195, 149, 171, 201, 119, 182, 114, 161, 173, 156, 125, 220, 134, 166, 114, 202, - 183, 193, 250, 37, 237, 96, 119, 5, 255, 215, 95, 253, 245, 43, 122, 252, - 129, 31, 55, 20, 186, 145, 208, 13, 133, 110, 36, 116, 75, 161, 91, 9, - 221, 82, 232, 246, 135, 66, 48, 10, 188, 62, 175, 27, 107, 53, 217, 250, - 188, 120, 108, 212, 92, 235, 243, 10, 178, 85, 83, 173, 207, 203, 200, 90, - 77, 158, 62, 175, 37, 27, 53, 119, 250, 188, 160, 108, 213, 212, 193, 141, - 1, 174, 118, 41, 239, 138, 204, 140, 42, 114, 174, 200, 84, 168, 34, 223, - 10, 143, 80, 17, 115, 120, 58, 93, 236, 164, 139, 157, 116, 113, 50, 93, - 228, 164, 139, 156, 116, 145, 77, 23, 86, 164, 247, 144, 142, 158, 55, 234, - 121, 75, 207, 32, 34, 165, 83, 181, 252, 26, 158, 205, 148, 23, 226, 70, - 185, 2, 241, 176, 14, 8, 17, 176, 113, 2, 34, 4, 108, 157, 0, 248, - 3, 247, 95, 140, 188, 178, 87, 96, 53, 30, 135, 49, 112, 44, 107, 97, - 46, 157, 178, 170, 101, 11, 234, 23, 252, 39, 105, 75, 251, 113, 58, 89, - 42, 189, 67, 3, 198, 251, 164, 82, 203, 62, 92, 48, 20, 178, 88, 178, - 13, 224, 81, 86, 174, 203, 164, 141, 235, 143, 140, 157, 122, 18, 198, 138, - 195, 15, 163, 115, 182, 77, 148, 162, 136, 225, 18, 6, 119, 62, 31, 44, - 102, 83, 198, 238, 215, 118, 113, 104, 5, 29, 41, 38, 211, 90, 151, 237, - 248, 68, 87, 193, 57, 77, 188, 158, 108, 148, 177, 30, 146, 138, 193, 214, - 8, 150, 122, 19, 177, 216, 98, 6, 2, 223, 214, 244, 199, 174, 33, 27, - 26, 186, 65, 171, 186, 19, 159, 77, 38, 253, 101, 119, 254, 105, 176, 84, - 118, 111, 114, 135, 70, 204, 198, 18, 85, 154, 12, 30, 252, 254, 232, 14, - 154, 21, 176, 109, 91, 172, 122, 67, 49, 217, 179, 134, 114, 202, 240, 221, - 74, 172, 217, 107, 4, 149, 78, 109, 117, 136, 248, 71, 30, 134, 220, 91, - 190, 77, 167, 225, 28, 143, 184, 64, 232, 243, 191, 218, 21, 180, 90, 22, - 132, 251, 254, 100, 212, 147, 234, 192, 93, 208, 228, 100, 137, 246, 125, 93, - 128, 98, 75, 113, 19, 200, 7, 116, 232, 185, 224, 67, 207, 166, 218, 145, - 16, 87, 125, 104, 143, 241, 126, 20, 139, 64, 66, 15, 205, 105, 106, 232, - 222, 40, 17, 53, 181, 133, 227, 140, 32, 38, 124, 190, 243, 110, 220, 20, - 128, 31, 46, 0, 164, 168, 102, 143, 254, 137, 248, 35, 70, 60, 6, 188, - 164, 222, 55, 248, 159, 26, 246, 236, 251, 64, 75, 213, 143, 157, 3, 185, - 134, 213, 161, 220, 37, 219, 10, 118, 206, 234, 114, 191, 172, 242, 63, 8, - 156, 183, 95, 71, 41, 73, 179, 191, 140, 48, 222, 230, 131, 103, 220, 151, - 244, 127, 59, 14, 98, 47, 69, 183, 99, 137, 126, 147, 255, 93, 140, 239, - 88, 92, 134, 22, 136, 196, 44, 82, 242, 50, 145, 150, 41, 173, 165, 220, - 171, 9, 38, 226, 73, 17, 237, 91, 42, 115, 71, 62, 19, 240, 129, 32, - 123, 4, 230, 41, 173, 245, 126, 155, 129, 206, 103, 63, 230, 158, 186, 177, - 80, 226, 24, 220, 156, 180, 50, 39, 100, 86, 213, 228, 166, 178, 100, 181, - 70, 101, 103, 113, 239, 134, 10, 243, 142, 213, 231, 56, 207, 128, 157, 13, - 80, 81, 55, 235, 13, 49, 217, 16, 100, 209, 44, 241, 136, 189, 238, 81, - 38, 180, 88, 125, 50, 247, 37, 142, 101, 18, 77, 157, 22, 128, 90, 32, - 213, 107, 4, 15, 59, 159, 47, 203, 19, 70, 109, 141, 96, 193, 186, 197, - 162, 195, 14, 20, 60, 185, 228, 96, 245, 209, 118, 0, 219, 28, 177, 36, - 99, 174, 157, 53, 168, 240, 79, 220, 3, 105, 5, 119, 71, 176, 76, 73, - 151, 182, 43, 29, 140, 193, 143, 35, 247, 188, 169, 196, 150, 169, 211, 166, - 28, 53, 229, 156, 121, 220, 217, 50, 117, 156, 212, 210, 208, 163, 14, 147, - 135, 180, 210, 83, 21, 140, 88, 247, 174, 169, 245, 37, 248, 181, 97, 244, - 211, 83, 79, 94, 186, 117, 169, 227, 168, 174, 164, 18, 203, 212, 212, 77, - 85, 77, 203, 100, 14, 85, 62, 121, 234, 148, 99, 154, 64, 84, 93, 138, - 64, 148, 254, 178, 60, 83, 14, 102, 103, 238, 185, 140, 206, 114, 241, 241, - 231, 178, 209, 228, 94, 12, 230, 74, 181, 98, 19, 227, 8, 146, 153, 154, - 8, 73, 171, 144, 230, 20, 163, 26, 213, 182, 90, 140, 43, 244, 231, 3, - 186, 120, 17, 50, 94, 89, 177, 85, 163, 248, 98, 123, 231, 47, 160, 122, - 215, 174, 21, 35, 122, 140, 161, 145, 87, 163, 97, 235, 45, 89, 57, 15, - 22, 117, 72, 28, 239, 252, 37, 107, 232, 213, 128, 93, 182, 68, 178, 184, - 86, 180, 183, 49, 41, 221, 5, 163, 210, 128, 129, 235, 193, 158, 175, 164, - 224, 131, 95, 209, 200, 191, 149, 247, 80, 191, 247, 228, 61, 82, 239, 222, - 130, 157, 11, 20, 95, 121, 31, 105, 18, 46, 24, 63, 82, 181, 179, 80, - 41, 21, 138, 139, 176, 64, 92, 17, 253, 141, 10, 204, 65, 209, 83, 92, - 168, 64, 106, 186, 204, 164, 93, 170, 180, 75, 147, 118, 169, 210, 46, 212, - 165, 215, 82, 255, 173, 46, 94, 118, 66, 255, 107, 184, 65, 165, 180, 213, - 66, 241, 150, 18, 210, 159, 94, 225, 197, 72, 24, 46, 113, 125, 100, 166, - 81, 242, 142, 126, 57, 167, 189, 126, 0, 62, 75, 41, 77, 211, 126, 34, - 158, 173, 196, 197, 135, 194, 3, 100, 159, 16, 184, 86, 164, 109, 162, 203, - 139, 22, 174, 22, 89, 80, 218, 119, 174, 20, 255, 35, 207, 145, 17, 15, - 57, 165, 115, 173, 139, 83, 249, 30, 188, 82, 100, 197, 231, 152, 119, 15, - 169, 81, 167, 165, 54, 143, 68, 173, 178, 151, 139, 112, 24, 165, 11, 10, - 60, 219, 194, 140, 193, 115, 28, 37, 81, 224, 176, 119, 196, 187, 164, 79, - 128, 48, 3, 1, 104, 175, 7, 159, 209, 180, 16, 26, 4, 154, 46, 196, - 143, 164, 219, 232, 8, 116, 244, 149, 163, 88, 40, 203, 109, 163, 242, 35, - 86, 140, 212, 210, 126, 148, 195, 25, 6, 172, 103, 95, 51, 140, 16, 213, - 241, 153, 57, 231, 191, 214, 140, 92, 155, 119, 250, 140, 56, 142, 201, 240, - 3, 13, 89, 184, 138, 251, 225, 148, 17, 205, 231, 52, 1, 126, 168, 65, - 127, 21, 178, 169, 231, 17, 228, 195, 197, 31, 170, 172, 208, 234, 219, 155, - 52, 220, 171, 41, 153, 14, 128, 234, 67, 145, 227, 104, 152, 49, 160, 152, - 171, 32, 199, 208, 15, 112, 62, 12, 19, 148, 139, 13, 229, 37, 176, 161, - 252, 18, 236, 128, 67, 189, 154, 88, 116, 40, 58, 142, 16, 89, 39, 11, - 64, 16, 213, 179, 72, 81, 185, 16, 81, 172, 131, 162, 49, 138, 172, 133, - 50, 44, 180, 18, 155, 83, 241, 160, 71, 157, 229, 106, 126, 187, 26, 15, - 64, 60, 154, 25, 106, 66, 128, 213, 234, 45, 187, 247, 131, 5, 108, 87, - 163, 32, 198, 134, 1, 65, 149, 24, 31, 32, 190, 63, 2, 150, 12, 190, - 235, 60, 214, 152, 83, 161, 88, 128, 223, 160, 15, 249, 155, 204, 253, 187, - 182, 59, 96, 3, 92, 224, 35, 56, 101, 127, 17, 55, 166, 38, 137, 204, - 24, 93, 209, 182, 232, 142, 195, 182, 128, 241, 11, 156, 10, 106, 220, 84, - 174, 222, 126, 4, 99, 167, 58, 97, 219, 181, 51, 72, 208, 200, 185, 179, - 167, 89, 101, 167, 83, 123, 247, 202, 157, 77, 113, 18, 142, 51, 51, 183, - 158, 32, 70, 114, 26, 233, 153, 19, 18, 203, 36, 205, 101, 189, 183, 126, - 247, 110, 198, 248, 15, 128, 139, 224, 112, 214, 129, 179, 45, 39, 62, 136, - 91, 142, 134, 19, 27, 245, 212, 188, 211, 208, 151, 108, 33, 201, 40, 141, - 85, 109, 44, 141, 57, 119, 203, 35, 86, 25, 118, 183, 58, 157, 198, 175, - 191, 226, 15, 13, 245, 26, 16, 229, 186, 59, 191, 123, 75, 221, 166, 174, - 197, 41, 38, 150, 4, 148, 227, 135, 186, 31, 57, 17, 45, 14, 137, 217, - 10, 81, 239, 79, 184, 19, 247, 84, 121, 182, 64, 214, 63, 255, 192, 135, - 25, 91, 238, 222, 2, 15, 150, 4, 160, 173, 98, 204, 243, 8, 70, 144, - 188, 91, 120, 172, 215, 13, 110, 131, 33, 187, 52, 1, 48, 117, 155, 192, - 15, 4, 82, 87, 205, 215, 137, 216, 60, 122, 255, 84, 162, 67, 232, 134, - 120, 146, 180, 17, 14, 5, 215, 16, 238, 47, 54, 119, 183, 211, 167, 238, - 53, 181, 206, 136, 206, 76, 253, 77, 179, 63, 57, 153, 38, 175, 49, 63, - 250, 141, 140, 9, 157, 172, 165, 206, 5, 231, 92, 75, 176, 233, 164, 216, - 170, 240, 133, 101, 48, 44, 159, 226, 142, 167, 106, 0, 210, 27, 129, 129, - 231, 8, 34, 237, 89, 80, 140, 215, 88, 149, 161, 56, 167, 49, 62, 199, - 255, 60, 241, 197, 184, 205, 216, 182, 181, 28, 36, 189, 236, 199, 213, 228, - 199, 161, 178, 242, 242, 89, 87, 2, 113, 45, 237, 240, 134, 179, 118, 98, - 171, 233, 88, 99, 251, 231, 24, 214, 129, 117, 167, 100, 234, 143, 164, 170, - 120, 249, 77, 120, 44, 206, 79, 99, 243, 39, 153, 99, 178, 190, 217, 148, - 145, 151, 89, 114, 243, 6, 200, 11, 192, 235, 17, 227, 186, 246, 191, 153, - 222, 205, 86, 162, 130, 171, 226, 250, 163, 127, 124, 198, 214, 138, 83, 154, - 210, 209, 187, 153, 208, 180, 5, 115, 34, 144, 47, 250, 53, 37, 238, 145, - 172, 44, 220, 141, 222, 11, 5, 184, 135, 182, 230, 161, 194, 239, 114, 160, - 110, 250, 255, 232, 210, 49, 169, 7, 200, 34, 92, 2, 81, 218, 219, 13, - 139, 57, 254, 172, 107, 145, 49, 228, 162, 3, 220, 96, 178, 167, 104, 22, - 144, 32, 94, 97, 55, 161, 96, 121, 103, 53, 222, 69, 2, 117, 144, 6, - 172, 92, 61, 217, 194, 167, 115, 121, 94, 139, 194, 175, 11, 31, 245, 209, - 7, 9, 83, 128, 84, 195, 238, 194, 143, 241, 85, 219, 12, 230, 0, 242, - 15, 150, 25, 125, 234, 206, 251, 26, 206, 71, 169, 142, 127, 244, 163, 117, - 132, 244, 241, 58, 206, 41, 223, 34, 55, 11, 12, 149, 52, 117, 160, 77, - 222, 32, 227, 234, 73, 75, 251, 56, 242, 14, 160, 187, 37, 214, 90, 10, - 35, 136, 139, 113, 39, 113, 137, 153, 148, 75, 102, 153, 47, 49, 60, 233, - 96, 92, 229, 108, 243, 213, 94, 192, 72, 209, 250, 63, 88, 14, 38, 11, - 208, 75, 227, 115, 115, 69, 196, 69, 24, 27, 217, 100, 108, 223, 136, 149, - 30, 176, 73, 238, 190, 110, 225, 4, 11, 131, 102, 228, 96, 63, 74, 219, - 19, 181, 102, 150, 159, 235, 27, 94, 114, 11, 168, 214, 82, 130, 214, 81, - 192, 81, 7, 54, 1, 98, 10, 144, 182, 166, 227, 88, 76, 255, 238, 156, - 200, 188, 88, 14, 238, 252, 215, 208, 12, 126, 195, 152, 75, 166, 236, 55, - 53, 211, 243, 108, 172, 100, 198, 229, 107, 137, 88, 39, 250, 159, 171, 45, - 153, 81, 255, 66, 217, 115, 94, 67, 95, 78, 169, 94, 181, 62, 140, 165, - 238, 32, 150, 16, 141, 211, 241, 0, 8, 93, 162, 243, 225, 107, 23, 126, - 50, 46, 160, 94, 51, 232, 231, 180, 87, 247, 85, 131, 79, 123, 225, 101, - 116, 137, 222, 146, 83, 157, 214, 208, 215, 237, 191, 239, 239, 161, 245, 143, - 255, 223, 159, 129, 108, 197, 32, 146, 34, 16, 73, 34, 109, 102, 169, 29, - 42, 43, 180, 144, 141, 6, 214, 157, 206, 38, 88, 87, 87, 37, 96, 176, - 7, 244, 175, 76, 212, 63, 161, 106, 220, 247, 205, 249, 69, 241, 135, 14, - 180, 156, 10, 57, 92, 144, 99, 79, 96, 243, 48, 79, 206, 198, 98, 243, - 75, 110, 37, 196, 94, 220, 161, 141, 155, 245, 182, 151, 148, 62, 28, 51, - 30, 40, 89, 127, 212, 253, 52, 101, 12, 173, 67, 131, 66, 47, 22, 201, - 49, 225, 126, 158, 29, 31, 63, 57, 177, 106, 9, 209, 176, 108, 139, 165, - 200, 255, 176, 14, 196, 74, 137, 78, 217, 21, 16, 87, 5, 17, 155, 31, - 137, 204, 9, 17, 90, 232, 139, 81, 100, 85, 149, 117, 214, 189, 233, 224, - 227, 199, 81, 15, 102, 19, 240, 184, 42, 192, 182, 84, 12, 170, 26, 207, - 117, 38, 11, 131, 153, 42, 67, 241, 163, 36, 96, 72, 227, 68, 22, 169, - 65, 104, 166, 219, 165, 220, 50, 216, 65, 168, 73, 156, 30, 135, 180, 145, - 196, 127, 86, 108, 245, 200, 112, 28, 213, 4, 130, 39, 195, 43, 166, 46, - 26, 56, 12, 114, 215, 117, 112, 3, 49, 234, 114, 235, 187, 64, 158, 72, - 59, 153, 2, 17, 178, 156, 238, 74, 182, 55, 52, 157, 101, 240, 50, 23, - 105, 224, 114, 218, 125, 102, 99, 218, 92, 4, 30, 82, 81, 27, 235, 251, - 96, 254, 137, 87, 164, 187, 212, 23, 166, 8, 147, 167, 147, 190, 235, 30, - 178, 157, 66, 151, 211, 79, 3, 72, 73, 115, 110, 45, 170, 140, 205, 185, - 255, 236, 176, 220, 116, 150, 219, 212, 33, 96, 49, 195, 112, 96, 160, 74, - 227, 34, 198, 175, 42, 124, 74, 22, 245, 177, 54, 17, 207, 88, 232, 18, - 137, 36, 73, 69, 38, 60, 197, 240, 55, 78, 206, 42, 183, 168, 97, 177, - 48, 91, 196, 68, 229, 125, 127, 183, 26, 171, 16, 216, 165, 10, 4, 119, - 241, 149, 104, 117, 10, 54, 166, 68, 178, 88, 230, 162, 193, 234, 157, 166, - 134, 103, 10, 78, 51, 157, 150, 23, 152, 115, 169, 155, 32, 175, 82, 26, - 173, 220, 217, 5, 195, 128, 196, 126, 62, 100, 189, 72, 223, 250, 107, 243, - 180, 49, 79, 219, 224, 102, 59, 157, 222, 185, 182, 95, 31, 105, 82, 76, - 186, 119, 118, 246, 188, 150, 236, 115, 59, 144, 230, 72, 151, 6, 194, 164, - 63, 125, 72, 44, 246, 26, 140, 212, 63, 209, 217, 177, 45, 195, 108, 62, - 189, 7, 96, 108, 32, 155, 175, 160, 168, 170, 45, 77, 90, 161, 150, 249, - 69, 247, 94, 207, 121, 49, 120, 0, 222, 159, 202, 233, 192, 160, 224, 198, - 119, 218, 77, 54, 56, 86, 194, 253, 230, 185, 53, 76, 38, 34, 116, 220, - 55, 101, 130, 160, 137, 33, 113, 14, 65, 140, 240, 95, 151, 157, 176, 82, - 168, 123, 46, 229, 141, 79, 7, 42, 94, 124, 58, 80, 201, 9, 157, 214, - 208, 152, 25, 23, 32, 155, 47, 192, 228, 74, 235, 195, 182, 197, 208, 202, - 172, 225, 154, 232, 134, 214, 56, 67, 50, 181, 5, 184, 95, 104, 174, 111, - 212, 32, 63, 189, 31, 140, 167, 61, 218, 178, 6, 218, 15, 34, 116, 183, - 180, 240, 125, 113, 67, 195, 114, 57, 2, 208, 155, 3, 129, 65, 7, 138, - 170, 156, 40, 38, 212, 132, 10, 253, 123, 44, 182, 43, 90, 101, 39, 42, - 159, 134, 117, 58, 119, 245, 104, 38, 176, 67, 213, 46, 174, 180, 186, 68, - 37, 233, 56, 250, 123, 15, 50, 117, 66, 129, 82, 198, 164, 16, 217, 99, - 119, 237, 207, 99, 17, 171, 240, 235, 70, 191, 178, 5, 124, 119, 75, 217, - 85, 59, 116, 132, 235, 110, 232, 15, 157, 108, 183, 244, 167, 101, 156, 11, - 0, 147, 134, 157, 161, 65, 98, 162, 79, 0, 13, 229, 87, 141, 101, 251, - 133, 226, 89, 129, 142, 54, 10, 55, 176, 142, 230, 96, 173, 146, 219, 36, - 41, 167, 22, 170, 255, 33, 139, 110, 55, 213, 255, 6, 104, 140, 169, 97, - 70, 84, 167, 248, 168, 31, 223, 251, 200, 60, 40, 190, 10, 138, 220, 200, - 157, 192, 206, 28, 72, 169, 146, 209, 145, 114, 74, 167, 77, 29, 43, 36, - 2, 162, 141, 224, 221, 72, 13, 129, 131, 79, 245, 96, 84, 117, 156, 137, - 153, 126, 21, 160, 63, 171, 199, 161, 128, 76, 72, 213, 249, 48, 239, 63, - 116, 71, 188, 240, 0, 214, 134, 73, 80, 122, 172, 4, 223, 252, 244, 238, - 251, 239, 255, 253, 63, 126, 218, 241, 189, 127, 65, 133, 188, 251, 238, 219, - 191, 252, 4, 219, 60, 32, 251, 83, 88, 237, 207, 187, 157, 238, 163, 122, - 75, 227, 11, 125, 193, 247, 223, 152, 239, 31, 67, 25, 12, 95, 158, 199, - 59, 91, 7, 223, 160, 201, 63, 62, 86, 118, 202, 1, 1, 165, 249, 247, - 31, 191, 113, 222, 254, 239, 14, 114, 66, 255, 1, 246, 8, 57, 135, 175, - 238, 108, 54, 222, 220, 244, 136, 186, 243, 46, 79, 60, 226, 116, 110, 214, - 1, 126, 55, 252, 187, 13, 228, 222, 152, 2, 213, 195, 70, 63, 108, 131, - 213, 140, 130, 233, 103, 131, 159, 173, 93, 227, 144, 41, 38, 155, 228, 171, - 121, 16, 224, 174, 103, 87, 189, 67, 187, 146, 42, 89, 121, 178, 87, 197, - 39, 222, 212, 42, 131, 138, 152, 167, 77, 167, 166, 87, 26, 84, 139, 183, - 181, 76, 59, 213, 2, 227, 200, 162, 92, 235, 164, 134, 160, 21, 212, 180, - 79, 24, 43, 168, 218, 223, 182, 196, 226, 34, 128, 234, 146, 196, 185, 13, - 212, 26, 130, 129, 190, 141, 119, 226, 180, 202, 32, 215, 124, 53, 83, 156, - 159, 111, 21, 8, 141, 107, 17, 220, 110, 132, 187, 15, 143, 184, 12, 137, - 240, 183, 93, 43, 198, 187, 178, 71, 73, 63, 20, 207, 63, 80, 82, 207, - 181, 102, 85, 18, 210, 27, 246, 83, 141, 101, 73, 0, 212, 31, 63, 236, - 156, 48, 4, 212, 98, 10, 23, 4, 44, 127, 115, 85, 139, 107, 226, 88, - 242, 238, 94, 75, 94, 107, 177, 215, 213, 225, 27, 113, 56, 25, 123, 53, - 218, 87, 153, 54, 186, 117, 104, 212, 64, 7, 82, 198, 44, 146, 173, 97, - 139, 165, 201, 120, 222, 104, 136, 167, 18, 93, 242, 11, 52, 40, 170, 112, - 27, 42, 197, 22, 154, 19, 243, 253, 13, 95, 243, 124, 224, 219, 156, 22, - 223, 230, 0, 216, 222, 105, 23, 213, 177, 158, 24, 197, 210, 21, 220, 187, - 221, 48, 12, 186, 97, 68, 255, 88, 49, 52, 232, 198, 244, 30, 211, 123, - 28, 167, 70, 105, 2, 238, 92, 195, 127, 30, 59, 98, 139, 14, 152, 55, - 49, 39, 213, 84, 61, 30, 105, 97, 44, 81, 158, 37, 209, 148, 169, 133, - 173, 114, 112, 21, 234, 203, 60, 245, 247, 252, 154, 206, 193, 59, 151, 15, - 73, 183, 38, 61, 246, 232, 184, 174, 234, 167, 212, 40, 149, 18, 165, 82, - 161, 44, 167, 6, 99, 190, 124, 211, 155, 220, 206, 58, 143, 163, 171, 246, - 53, 176, 44, 253, 243, 224, 241, 188, 10, 48, 196, 219, 153, 0, 66, 53, - 196, 195, 8, 2, 244, 189, 94, 172, 174, 248, 138, 21, 223, 17, 203, 223, - 85, 12, 90, 249, 30, 144, 158, 238, 124, 222, 221, 196, 214, 157, 54, 224, - 28, 110, 196, 153, 182, 125, 220, 242, 227, 1, 167, 218, 246, 197, 46, 24, - 171, 217, 120, 212, 195, 198, 222, 117, 192, 234, 187, 227, 169, 66, 2, 254, - 91, 240, 119, 158, 76, 255, 229, 119, 215, 135, 205, 215, 184, 50, 202, 25, - 38, 215, 198, 240, 42, 89, 167, 215, 234, 97, 203, 14, 162, 78, 14, 12, - 6, 213, 236, 86, 128, 255, 66, 118, 84, 29, 50, 150, 65, 227, 185, 103, - 105, 146, 188, 149, 10, 247, 184, 37, 218, 235, 149, 40, 116, 156, 18, 217, - 69, 141, 125, 87, 105, 155, 159, 231, 198, 232, 199, 241, 103, 101, 105, 231, - 12, 21, 69, 59, 24, 29, 11, 205, 148, 178, 66, 87, 206, 160, 118, 253, - 18, 5, 18, 227, 40, 90, 47, 93, 123, 134, 154, 248, 120, 87, 67, 76, - 134, 92, 142, 251, 154, 186, 191, 166, 213, 164, 15, 119, 69, 113, 192, 10, - 237, 41, 23, 206, 172, 111, 63, 250, 161, 6, 27, 111, 214, 184, 239, 139, - 63, 163, 108, 218, 150, 232, 220, 235, 180, 208, 186, 39, 126, 244, 49, 155, - 176, 45, 74, 247, 58, 33, 212, 238, 25, 200, 143, 69, 225, 212, 62, 171, - 117, 196, 23, 103, 227, 233, 167, 8, 125, 4, 73, 112, 21, 60, 213, 35, - 164, 240, 149, 98, 127, 189, 243, 171, 194, 99, 137, 51, 68, 74, 244, 167, - 18, 226, 202, 101, 94, 254, 234, 194, 248, 84, 25, 60, 16, 126, 125, 65, - 60, 232, 31, 153, 207, 53, 252, 30, 103, 195, 41, 232, 105, 111, 21, 34, - 91, 5, 58, 133, 169, 92, 54, 153, 74, 68, 251, 43, 65, 156, 100, 166, - 26, 155, 84, 53, 84, 154, 67, 21, 137, 221, 138, 216, 170, 108, 51, 85, - 137, 15, 85, 37, 175, 50, 219, 76, 101, 156, 234, 236, 89, 102, 166, 15, - 60, 165, 178, 230, 5, 234, 10, 79, 171, 11, 14, 7, 221, 254, 13, 177, - 150, 159, 150, 195, 68, 144, 155, 202, 30, 192, 216, 117, 10, 205, 18, 46, - 32, 227, 147, 76, 155, 142, 179, 120, 87, 80, 200, 41, 45, 75, 66, 143, - 184, 173, 19, 85, 41, 167, 62, 157, 200, 24, 208, 58, 85, 234, 132, 173, - 228, 82, 99, 64, 178, 124, 0, 24, 189, 170, 68, 12, 97, 212, 216, 25, - 42, 200, 230, 34, 96, 70, 93, 220, 214, 50, 138, 17, 158, 106, 116, 146, - 246, 53, 93, 61, 75, 53, 115, 133, 119, 230, 152, 221, 130, 11, 138, 220, - 215, 11, 84, 101, 151, 128, 231, 78, 18, 40, 208, 118, 65, 188, 53, 41, - 115, 105, 222, 159, 202, 169, 123, 187, 179, 192, 71, 19, 125, 105, 184, 95, - 60, 231, 102, 115, 144, 78, 114, 161, 120, 158, 239, 59, 143, 12, 70, 84, - 98, 198, 160, 252, 33, 170, 150, 152, 41, 144, 39, 176, 14, 244, 68, 35, - 241, 93, 222, 36, 63, 99, 139, 153, 226, 247, 98, 46, 51, 206, 75, 114, - 206, 198, 50, 72, 2, 75, 153, 121, 94, 146, 11, 74, 114, 193, 73, 46, - 40, 201, 247, 181, 78, 113, 236, 247, 54, 227, 17, 164, 77, 68, 191, 226, - 187, 160, 248, 189, 118, 230, 129, 187, 155, 177, 51, 108, 191, 199, 179, 230, - 195, 246, 242, 111, 126, 169, 81, 111, 132, 31, 168, 127, 26, 209, 7, 250, - 137, 19, 236, 206, 1, 54, 206, 207, 97, 227, 252, 99, 217, 56, 70, 51, - 166, 83, 31, 227, 226, 210, 154, 92, 107, 5, 238, 178, 140, 237, 189, 197, - 5, 111, 24, 203, 143, 62, 108, 43, 254, 79, 150, 42, 238, 102, 127, 126, - 15, 252, 103, 103, 50, 210, 230, 33, 34, 20, 217, 243, 245, 134, 175, 119, - 123, 165, 211, 40, 238, 154, 130, 27, 193, 10, 93, 235, 135, 141, 126, 216, - 230, 204, 66, 179, 45, 37, 29, 3, 46, 156, 141, 127, 13, 199, 82, 52, - 150, 182, 46, 1, 159, 100, 0, 214, 29, 197, 7, 24, 22, 64, 107, 54, - 178, 143, 248, 136, 47, 208, 85, 77, 59, 127, 179, 47, 155, 206, 223, 213, - 140, 85, 149, 238, 252, 87, 98, 174, 42, 90, 4, 158, 33, 138, 150, 83, - 52, 41, 83, 92, 150, 27, 105, 71, 40, 178, 142, 162, 114, 95, 73, 163, - 35, 96, 80, 152, 191, 201, 22, 254, 119, 57, 157, 252, 215, 46, 111, 242, - 89, 186, 48, 53, 236, 102, 173, 118, 229, 241, 213, 181, 119, 39, 0, 100, - 12, 246, 24, 10, 82, 10, 28, 220, 243, 95, 90, 202, 79, 155, 180, 130, - 220, 69, 172, 23, 123, 71, 79, 49, 157, 84, 235, 120, 142, 232, 168, 160, - 106, 95, 248, 63, 116, 76, 111, 130, 159, 167, 206, 191, 35, 14, 81, 254, - 177, 44, 64, 252, 134, 153, 213, 167, 200, 188, 174, 167, 39, 197, 93, 32, - 249, 194, 68, 213, 145, 104, 92, 52, 100, 36, 177, 10, 215, 157, 0, 67, - 218, 210, 138, 45, 46, 78, 167, 168, 82, 81, 146, 66, 57, 176, 139, 146, - 69, 54, 208, 230, 3, 69, 10, 247, 93, 211, 101, 66, 241, 36, 82, 165, - 58, 101, 182, 109, 153, 156, 66, 149, 170, 203, 140, 211, 101, 82, 169, 113, - 110, 153, 118, 99, 132, 226, 89, 130, 140, 44, 238, 104, 38, 82, 112, 49, - 140, 244, 78, 9, 38, 119, 254, 85, 220, 127, 207, 253, 170, 212, 32, 249, - 220, 164, 7, 145, 163, 237, 25, 73, 179, 113, 151, 92, 213, 250, 153, 49, - 187, 208, 98, 27, 106, 5, 37, 174, 175, 97, 169, 171, 176, 50, 148, 218, - 103, 245, 214, 229, 89, 76, 63, 97, 227, 130, 127, 241, 220, 10, 249, 177, - 129, 95, 250, 175, 193, 255, 225, 111, 2, 97, 57, 46, 123, 89, 216, 229, - 176, 204, 203, 77, 32, 192, 202, 181, 166, 90, 95, 100, 34, 220, 78, 215, - 135, 214, 131, 236, 60, 167, 15, 112, 175, 40, 26, 120, 122, 235, 176, 83, - 254, 211, 96, 138, 11, 203, 205, 211, 147, 218, 32, 105, 202, 172, 118, 231, - 248, 58, 49, 79, 165, 138, 33, 171, 26, 16, 151, 238, 87, 103, 243, 209, - 29, 187, 45, 97, 166, 222, 202, 167, 35, 35, 159, 246, 116, 179, 14, 204, - 224, 236, 84, 165, 143, 2, 59, 85, 51, 51, 213, 11, 131, 115, 1, 45, - 123, 239, 161, 147, 2, 116, 82, 192, 157, 20, 112, 39, 5, 232, 164, 128, - 59, 41, 56, 15, 218, 148, 204, 157, 111, 10, 82, 68, 207, 5, 21, 11, - 33, 102, 104, 254, 106, 61, 92, 249, 251, 222, 107, 178, 161, 6, 134, 80, - 147, 254, 107, 81, 158, 103, 65, 147, 15, 173, 45, 14, 137, 233, 189, 77, - 241, 8, 107, 210, 115, 204, 86, 120, 17, 133, 181, 232, 107, 214, 87, 253, - 3, 254, 189, 247, 68, 239, 75, 144, 101, 217, 51, 91, 252, 231, 247, 32, - 215, 181, 179, 181, 244, 18, 23, 58, 216, 157, 177, 1, 83, 79, 114, 4, - 237, 143, 42, 68, 39, 79, 190, 190, 240, 191, 225, 128, 92, 1, 188, 29, - 111, 57, 119, 40, 189, 228, 29, 138, 195, 131, 53, 148, 199, 22, 108, 192, - 202, 238, 58, 200, 62, 68, 206, 101, 72, 226, 174, 67, 41, 248, 250, 85, - 93, 213, 68, 172, 6, 198, 147, 75, 20, 147, 132, 26, 90, 108, 216, 198, - 178, 148, 64, 41, 166, 171, 6, 102, 69, 0, 188, 237, 96, 217, 202, 156, - 208, 24, 52, 25, 7, 51, 246, 218, 160, 93, 50, 68, 9, 78, 96, 129, - 208, 181, 87, 195, 31, 138, 162, 67, 83, 149, 14, 77, 80, 21, 172, 193, - 193, 194, 99, 156, 12, 34, 94, 225, 177, 233, 4, 17, 203, 17, 129, 129, - 88, 179, 83, 6, 6, 225, 112, 189, 129, 56, 140, 188, 33, 38, 173, 22, - 196, 202, 223, 16, 47, 127, 179, 117, 245, 82, 179, 139, 133, 242, 152, 211, - 77, 2, 215, 178, 191, 199, 238, 242, 176, 13, 67, 163, 179, 105, 116, 182, - 13, 163, 14, 167, 25, 238, 60, 118, 187, 213, 208, 252, 54, 113, 219, 81, - 11, 128, 161, 166, 227, 193, 105, 199, 21, 203, 107, 71, 242, 140, 133, 189, - 123, 202, 73, 179, 215, 91, 65, 163, 222, 116, 175, 200, 156, 150, 91, 167, - 214, 202, 165, 117, 234, 242, 35, 187, 170, 88, 26, 228, 8, 28, 147, 156, - 119, 83, 155, 216, 83, 91, 154, 167, 204, 89, 195, 210, 157, 102, 116, 243, - 216, 117, 39, 226, 100, 188, 103, 179, 242, 143, 86, 23, 138, 249, 47, 199, - 40, 181, 32, 173, 30, 20, 87, 37, 166, 37, 102, 99, 10, 116, 214, 254, - 115, 102, 188, 52, 37, 49, 233, 57, 68, 177, 148, 142, 130, 50, 187, 57, - 1, 90, 147, 5, 87, 116, 180, 16, 68, 15, 36, 199, 163, 225, 66, 68, - 123, 75, 86, 194, 49, 180, 203, 240, 149, 82, 208, 211, 167, 56, 199, 157, - 160, 170, 77, 184, 199, 172, 197, 160, 21, 58, 246, 77, 77, 218, 201, 135, - 244, 58, 156, 142, 251, 172, 183, 90, 225, 125, 219, 117, 173, 146, 89, 47, - 212, 63, 135, 46, 141, 250, 153, 231, 82, 201, 98, 195, 132, 73, 108, 24, - 103, 236, 104, 10, 185, 34, 160, 36, 97, 18, 88, 72, 198, 87, 99, 32, - 173, 196, 141, 155, 75, 56, 163, 144, 169, 85, 36, 114, 215, 154, 201, 237, - 125, 231, 241, 223, 218, 59, 159, 37, 144, 202, 171, 10, 220, 20, 220, 255, - 233, 79, 16, 55, 238, 32, 81, 22, 21, 71, 17, 68, 66, 188, 224, 203, - 222, 198, 183, 249, 148, 38, 146, 15, 209, 210, 14, 187, 152, 129, 152, 18, - 67, 136, 125, 189, 68, 44, 182, 140, 244, 194, 165, 244, 16, 196, 11, 12, - 214, 49, 122, 96, 79, 207, 18, 98, 68, 156, 45, 15, 75, 160, 27, 242, - 248, 12, 230, 5, 221, 171, 24, 254, 65, 214, 110, 70, 13, 74, 189, 161, - 7, 198, 80, 194, 90, 215, 16, 95, 50, 44, 62, 101, 196, 161, 43, 118, - 170, 251, 168, 131, 14, 173, 119, 211, 113, 114, 75, 147, 190, 78, 105, 41, - 168, 80, 40, 14, 7, 55, 223, 6, 55, 111, 140, 225, 87, 90, 43, 97, - 176, 84, 54, 67, 44, 164, 83, 105, 92, 197, 155, 60, 81, 118, 201, 41, - 253, 128, 178, 0, 141, 249, 55, 157, 111, 59, 239, 180, 116, 84, 153, 117, - 37, 47, 114, 243, 36, 162, 236, 235, 210, 10, 185, 245, 168, 56, 211, 78, - 78, 180, 82, 129, 90, 22, 142, 83, 38, 224, 68, 189, 213, 237, 192, 217, - 222, 237, 122, 200, 52, 64, 172, 91, 35, 231, 19, 86, 0, 166, 63, 81, - 154, 211, 243, 220, 68, 47, 178, 43, 45, 85, 166, 230, 228, 174, 174, 101, - 158, 228, 167, 207, 47, 219, 101, 175, 36, 28, 53, 49, 77, 173, 150, 243, - 36, 111, 196, 170, 57, 79, 242, 172, 83, 218, 103, 253, 79, 167, 166, 127, - 148, 111, 24, 81, 162, 248, 50, 50, 76, 123, 59, 182, 255, 35, 195, 16, - 81, 209, 101, 251, 178, 181, 63, 65, 227, 178, 121, 121, 118, 25, 235, 232, - 134, 137, 165, 31, 78, 208, 164, 175, 219, 148, 100, 111, 2, 28, 22, 90, - 148, 108, 111, 130, 152, 190, 110, 95, 70, 121, 117, 0, 117, 2, 110, 45, - 126, 63, 64, 247, 71, 173, 115, 31, 148, 50, 26, 165, 80, 33, 137, 24, - 251, 108, 190, 230, 188, 248, 155, 131, 41, 242, 75, 75, 149, 145, 147, 50, - 149, 111, 42, 197, 129, 58, 150, 105, 137, 82, 18, 20, 185, 69, 199, 21, - 189, 242, 200, 99, 68, 43, 250, 97, 116, 85, 59, 171, 225, 184, 33, 7, - 173, 118, 19, 255, 199, 232, 236, 75, 243, 95, 25, 178, 156, 80, 203, 100, - 236, 22, 170, 135, 112, 98, 23, 149, 35, 170, 217, 66, 181, 94, 75, 192, - 254, 97, 87, 183, 253, 209, 61, 251, 185, 91, 100, 92, 104, 243, 124, 154, - 12, 126, 199, 137, 204, 221, 45, 3, 173, 78, 162, 55, 206, 84, 241, 157, - 168, 121, 146, 156, 180, 19, 81, 68, 162, 147, 217, 81, 199, 50, 211, 80, - 189, 11, 198, 240, 139, 157, 35, 105, 201, 101, 164, 232, 227, 172, 137, 129, - 54, 214, 140, 196, 3, 96, 236, 187, 21, 62, 118, 13, 40, 67, 250, 23, - 87, 35, 58, 48, 179, 121, 154, 140, 82, 165, 104, 89, 140, 120, 121, 96, - 71, 39, 98, 10, 19, 50, 219, 164, 28, 133, 197, 10, 200, 78, 132, 9, - 240, 188, 68, 108, 102, 157, 106, 11, 95, 97, 230, 18, 174, 24, 90, 67, - 153, 181, 92, 209, 70, 54, 100, 67, 60, 94, 81, 110, 241, 78, 54, 80, - 164, 132, 6, 27, 210, 208, 54, 169, 77, 105, 252, 200, 139, 116, 34, 58, - 35, 194, 31, 145, 150, 252, 41, 81, 34, 237, 147, 8, 112, 82, 133, 234, - 192, 207, 39, 4, 167, 180, 152, 241, 182, 145, 134, 56, 60, 42, 91, 191, - 133, 44, 77, 228, 244, 142, 64, 209, 25, 188, 147, 228, 184, 165, 113, 236, - 136, 19, 221, 35, 192, 151, 48, 121, 200, 37, 79, 116, 184, 127, 196, 178, - 224, 239, 95, 198, 203, 169, 86, 210, 254, 99, 218, 155, 226, 226, 190, 128, - 115, 115, 91, 155, 240, 233, 254, 91, 185, 50, 170, 144, 199, 136, 218, 29, - 255, 241, 188, 2, 107, 221, 29, 30, 219, 244, 24, 94, 139, 157, 47, 27, - 119, 142, 113, 188, 155, 167, 174, 247, 188, 97, 119, 252, 81, 249, 77, 240, - 106, 254, 73, 17, 239, 24, 249, 52, 8, 171, 176, 155, 150, 103, 152, 154, - 81, 44, 205, 5, 137, 151, 88, 145, 108, 56, 177, 42, 94, 199, 34, 254, - 196, 192, 95, 82, 5, 98, 84, 32, 98, 219, 4, 83, 129, 45, 51, 127, - 21, 255, 156, 162, 154, 98, 32, 199, 22, 199, 161, 49, 196, 8, 154, 200, - 131, 189, 106, 175, 91, 130, 38, 233, 159, 20, 228, 174, 30, 3, 221, 111, - 176, 108, 4, 146, 16, 165, 125, 5, 225, 8, 38, 24, 203, 75, 98, 9, - 109, 178, 160, 196, 23, 88, 243, 179, 160, 85, 56, 209, 181, 106, 102, 201, - 2, 163, 180, 115, 91, 1, 204, 85, 230, 16, 217, 21, 97, 155, 35, 188, - 205, 65, 222, 113, 53, 83, 11, 250, 64, 43, 118, 231, 174, 221, 171, 153, - 26, 39, 137, 101, 149, 63, 14, 60, 157, 137, 51, 216, 162, 115, 90, 45, - 115, 150, 198, 213, 76, 175, 140, 166, 60, 51, 178, 224, 209, 130, 231, 185, - 49, 16, 129, 170, 217, 115, 90, 179, 229, 95, 202, 122, 132, 45, 0, 90, - 207, 249, 31, 159, 8, 53, 54, 117, 221, 103, 49, 19, 5, 159, 63, 231, - 63, 64, 252, 191, 224, 12, 46, 132, 80, 137, 18, 152, 122, 49, 63, 168, - 50, 96, 34, 213, 168, 135, 207, 189, 113, 119, 57, 100, 247, 233, 69, 24, - 233, 216, 229, 101, 53, 75, 172, 46, 246, 22, 231, 55, 238, 140, 42, 131, - 255, 174, 221, 209, 214, 255, 11, 118, 72, 183, 209, 191, 105, 151, 84, 25, - 252, 19, 119, 74, 108, 145, 188, 87, 198, 255, 130, 189, 210, 171, 170, 205, - 210, 236, 144, 69, 222, 56, 99, 21, 237, 220, 152, 125, 233, 30, 26, 178, - 195, 63, 252, 115, 246, 208, 212, 30, 91, 23, 199, 148, 38, 3, 40, 116, - 218, 196, 85, 10, 111, 6, 144, 238, 81, 56, 184, 194, 107, 91, 205, 166, - 63, 191, 167, 61, 52, 192, 231, 93, 102, 24, 91, 129, 105, 84, 28, 8, - 241, 246, 237, 193, 109, 189, 7, 159, 103, 246, 96, 213, 191, 238, 76, 233, - 15, 198, 221, 213, 4, 138, 43, 102, 248, 125, 59, 152, 192, 1, 50, 171, - 145, 232, 104, 5, 67, 176, 26, 107, 191, 244, 108, 104, 181, 207, 186, 239, - 255, 128, 173, 92, 44, 86, 119, 240, 103, 174, 65, 103, 108, 106, 30, 111, - 202, 148, 28, 246, 43, 10, 62, 71, 133, 40, 219, 2, 227, 241, 126, 192, - 230, 71, 114, 251, 142, 13, 145, 50, 29, 166, 188, 199, 175, 150, 106, 4, - 43, 125, 33, 6, 142, 65, 58, 113, 56, 191, 24, 176, 109, 212, 100, 58, - 169, 201, 229, 161, 242, 53, 14, 181, 224, 132, 234, 151, 114, 95, 161, 108, - 85, 27, 245, 6, 116, 216, 7, 191, 248, 161, 218, 243, 171, 150, 90, 102, - 6, 170, 29, 159, 93, 115, 42, 40, 141, 27, 136, 80, 176, 17, 181, 148, - 235, 110, 60, 87, 181, 245, 129, 6, 206, 48, 246, 124, 236, 65, 183, 38, - 110, 41, 60, 167, 4, 123, 76, 125, 186, 71, 164, 67, 146, 230, 44, 105, - 126, 192, 218, 67, 250, 207, 128, 193, 252, 48, 236, 195, 254, 92, 252, 167, - 244, 225, 155, 20, 51, 238, 161, 50, 172, 244, 205, 102, 214, 91, 221, 173, - 228, 246, 73, 185, 177, 164, 133, 151, 190, 147, 253, 183, 170, 77, 240, 120, - 211, 165, 73, 24, 177, 111, 142, 7, 74, 63, 95, 12, 7, 76, 27, 230, - 28, 238, 196, 103, 111, 18, 76, 132, 215, 120, 102, 73, 250, 175, 96, 17, - 123, 99, 155, 126, 101, 196, 6, 76, 34, 63, 29, 87, 179, 145, 168, 70, - 42, 214, 202, 34, 179, 95, 178, 234, 176, 249, 18, 247, 114, 123, 138, 133, - 121, 249, 190, 82, 241, 64, 139, 7, 144, 48, 214, 174, 222, 92, 141, 150, - 44, 207, 229, 11, 209, 161, 11, 233, 113, 162, 65, 140, 233, 140, 59, 54, - 135, 63, 137, 221, 229, 42, 182, 225, 52, 175, 221, 100, 161, 200, 196, 30, - 135, 194, 148, 109, 146, 128, 215, 114, 139, 152, 24, 57, 0, 172, 120, 221, - 249, 71, 201, 185, 24, 130, 217, 215, 165, 255, 6, 129, 74, 185, 75, 7, - 82, 39, 148, 70, 207, 58, 175, 89, 13, 237, 89, 231, 13, 254, 190, 166, - 191, 129, 255, 121, 57, 132, 207, 199, 96, 20, 188, 14, 222, 192, 82, 171, - 0, 15, 211, 189, 238, 28, 55, 156, 140, 4, 48, 116, 113, 66, 140, 137, - 39, 160, 135, 110, 153, 149, 72, 172, 43, 142, 16, 199, 77, 147, 144, 100, - 29, 130, 89, 73, 102, 156, 16, 252, 184, 251, 163, 136, 157, 148, 88, 41, - 245, 141, 59, 169, 14, 84, 39, 57, 147, 100, 22, 27, 251, 176, 66, 111, - 189, 217, 22, 168, 7, 114, 21, 48, 197, 208, 152, 232, 2, 60, 134, 163, - 110, 101, 223, 123, 96, 199, 47, 241, 83, 246, 28, 89, 37, 13, 95, 234, - 199, 141, 123, 250, 35, 102, 163, 94, 79, 164, 241, 186, 238, 18, 239, 182, - 227, 58, 151, 189, 60, 77, 8, 38, 105, 19, 207, 136, 37, 57, 140, 66, - 148, 183, 25, 253, 112, 179, 14, 212, 195, 70, 251, 66, 186, 217, 166, 5, - 149, 12, 131, 145, 107, 8, 179, 152, 46, 231, 211, 217, 8, 14, 21, 55, - 62, 75, 50, 19, 65, 138, 231, 72, 153, 114, 102, 173, 167, 148, 226, 98, - 142, 148, 243, 244, 176, 140, 83, 215, 56, 101, 18, 165, 197, 153, 88, 233, - 115, 77, 162, 196, 23, 48, 211, 68, 2, 234, 249, 102, 77, 25, 73, 102, - 255, 54, 73, 105, 37, 40, 77, 19, 91, 203, 79, 137, 79, 29, 45, 110, - 228, 149, 142, 196, 125, 247, 254, 35, 69, 229, 127, 103, 247, 62, 167, 202, - 221, 143, 202, 162, 198, 223, 8, 2, 2, 12, 14, 161, 251, 172, 237, 230, - 114, 168, 133, 218, 29, 34, 87, 186, 46, 201, 19, 179, 18, 179, 26, 143, - 65, 81, 66, 44, 12, 143, 35, 73, 9, 48, 86, 206, 182, 35, 44, 46, - 190, 242, 23, 147, 238, 140, 206, 212, 75, 149, 6, 80, 0, 14, 104, 27, - 141, 160, 251, 174, 158, 178, 254, 182, 102, 198, 226, 149, 137, 185, 185, 235, - 206, 96, 201, 119, 66, 173, 197, 38, 117, 178, 223, 170, 239, 205, 106, 52, - 230, 209, 104, 62, 206, 89, 114, 212, 8, 236, 58, 28, 190, 77, 78, 101, - 217, 246, 255, 60, 132, 175, 152, 201, 253, 244, 179, 198, 236, 51, 229, 82, - 29, 79, 116, 109, 79, 196, 84, 55, 145, 137, 47, 222, 70, 149, 141, 245, - 66, 121, 122, 163, 29, 227, 1, 28, 199, 247, 17, 59, 231, 85, 22, 95, - 166, 60, 241, 211, 41, 55, 84, 117, 159, 157, 22, 35, 249, 158, 236, 151, - 221, 207, 3, 197, 15, 48, 255, 100, 90, 35, 54, 229, 240, 54, 37, 4, - 203, 95, 99, 217, 36, 187, 149, 232, 0, 90, 163, 92, 123, 94, 237, 43, - 153, 150, 253, 21, 100, 183, 101, 237, 111, 53, 132, 35, 114, 254, 190, 9, - 207, 140, 243, 25, 213, 67, 124, 126, 58, 185, 113, 111, 159, 252, 173, 83, - 90, 215, 218, 205, 242, 105, 251, 242, 239, 157, 210, 70, 61, 214, 224, 20, - 113, 176, 158, 149, 106, 165, 191, 125, 136, 170, 127, 255, 16, 149, 79, 227, - 70, 185, 2, 101, 38, 92, 198, 254, 173, 204, 158, 115, 255, 94, 54, 254, - 202, 24, 7, 49, 115, 85, 32, 232, 136, 102, 245, 113, 27, 170, 63, 80, - 127, 51, 119, 1, 233, 79, 101, 3, 120, 122, 13, 167, 51, 76, 217, 46, - 195, 156, 139, 235, 250, 112, 176, 94, 206, 87, 125, 53, 207, 251, 131, 153, - 152, 32, 186, 39, 252, 224, 38, 237, 0, 38, 203, 144, 171, 92, 156, 133, - 53, 197, 136, 43, 78, 250, 111, 127, 175, 205, 230, 83, 152, 90, 29, 118, - 87, 74, 213, 232, 132, 140, 39, 99, 107, 210, 9, 27, 116, 24, 85, 250, - 53, 214, 7, 76, 163, 158, 82, 87, 117, 192, 207, 18, 210, 49, 219, 210, - 176, 237, 185, 205, 118, 240, 100, 194, 182, 131, 39, 131, 242, 28, 127, 106, - 40, 40, 169, 140, 250, 100, 243, 109, 115, 173, 127, 81, 180, 141, 143, 174, - 174, 84, 67, 142, 175, 174, 123, 152, 88, 117, 48, 79, 187, 9, 67, 23, - 117, 87, 203, 105, 143, 246, 165, 172, 68, 205, 1, 110, 154, 187, 144, 216, - 33, 244, 213, 31, 94, 13, 3, 133, 195, 253, 80, 214, 79, 195, 114, 229, - 225, 116, 200, 110, 157, 135, 79, 124, 82, 25, 158, 62, 216, 207, 196, 19, - 52, 27, 150, 21, 195, 83, 246, 48, 122, 90, 124, 152, 7, 195, 211, 226, - 112, 78, 81, 183, 0, 192, 105, 48, 28, 210, 60, 160, 32, 97, 26, 45, - 232, 31, 68, 99, 13, 143, 118, 216, 197, 106, 78, 217, 160, 7, 88, 116, - 201, 54, 136, 196, 62, 176, 203, 52, 104, 120, 30, 194, 121, 249, 152, 216, - 192, 62, 78, 177, 185, 103, 54, 48, 29, 140, 189, 153, 31, 115, 238, 46, - 169, 191, 36, 46, 103, 35, 250, 200, 251, 144, 139, 191, 58, 88, 234, 194, - 78, 144, 2, 38, 197, 190, 120, 180, 243, 103, 221, 57, 28, 50, 143, 97, - 40, 139, 254, 103, 141, 8, 199, 179, 22, 113, 104, 88, 239, 192, 7, 58, - 123, 27, 114, 156, 12, 62, 117, 17, 108, 179, 126, 0, 178, 153, 222, 67, - 169, 134, 11, 98, 33, 105, 144, 193, 186, 117, 63, 234, 233, 11, 253, 125, - 231, 172, 209, 200, 213, 39, 57, 110, 39, 52, 84, 123, 44, 190, 172, 92, - 52, 118, 251, 182, 67, 237, 175, 178, 161, 77, 100, 62, 117, 87, 139, 5, - 29, 252, 92, 217, 185, 5, 12, 205, 202, 208, 115, 109, 146, 69, 172, 172, - 164, 202, 58, 199, 26, 45, 217, 51, 118, 153, 1, 58, 236, 225, 192, 231, - 144, 136, 199, 81, 154, 19, 119, 107, 165, 111, 122, 247, 51, 230, 80, 82, - 79, 182, 35, 141, 53, 85, 176, 186, 13, 141, 122, 124, 88, 187, 65, 55, - 135, 165, 228, 233, 198, 152, 126, 93, 4, 9, 193, 121, 226, 34, 221, 0, - 181, 205, 248, 234, 56, 87, 154, 110, 230, 190, 15, 161, 57, 139, 214, 135, - 98, 6, 39, 23, 121, 197, 16, 255, 135, 101, 5, 223, 166, 235, 81, 247, - 141, 60, 20, 46, 118, 99, 13, 228, 38, 110, 118, 35, 56, 215, 117, 238, - 86, 180, 124, 30, 38, 200, 77, 86, 52, 184, 175, 133, 250, 44, 14, 1, - 3, 243, 162, 27, 253, 129, 253, 18, 118, 21, 56, 18, 30, 152, 204, 159, - 238, 70, 189, 204, 70, 201, 70, 86, 12, 138, 235, 143, 167, 159, 166, 110, - 159, 75, 250, 204, 61, 186, 10, 206, 185, 66, 255, 246, 125, 243, 204, 100, - 36, 34, 65, 32, 168, 82, 226, 111, 105, 196, 3, 16, 51, 18, 189, 136, - 58, 124, 218, 180, 155, 130, 125, 41, 41, 222, 159, 152, 36, 172, 61, 219, - 108, 232, 164, 184, 78, 85, 142, 171, 85, 218, 31, 146, 73, 91, 38, 233, - 69, 59, 8, 47, 218, 110, 210, 239, 146, 73, 47, 14, 228, 250, 77, 50, - 41, 107, 0, 166, 43, 107, 224, 19, 206, 117, 34, 34, 127, 172, 84, 27, - 56, 224, 34, 50, 249, 178, 121, 128, 92, 131, 245, 160, 72, 111, 160, 142, - 149, 130, 233, 35, 214, 250, 184, 90, 124, 121, 26, 49, 218, 130, 206, 227, - 49, 110, 48, 166, 241, 99, 212, 168, 158, 171, 199, 176, 161, 96, 142, 91, - 158, 82, 121, 102, 85, 150, 226, 171, 74, 24, 237, 60, 81, 164, 166, 180, - 96, 145, 40, 77, 53, 172, 55, 128, 130, 76, 145, 202, 11, 54, 20, 216, - 40, 91, 240, 78, 141, 250, 121, 53, 29, 133, 196, 181, 118, 99, 39, 72, - 97, 92, 241, 184, 193, 53, 87, 170, 204, 45, 214, 157, 101, 113, 51, 7, - 11, 159, 211, 127, 207, 131, 196, 149, 38, 126, 218, 204, 167, 163, 126, 246, - 250, 66, 80, 20, 178, 98, 118, 73, 127, 72, 200, 110, 115, 57, 164, 179, - 101, 185, 151, 56, 82, 188, 11, 10, 236, 36, 161, 136, 77, 237, 154, 231, - 217, 113, 109, 107, 110, 239, 76, 4, 247, 206, 186, 224, 202, 145, 153, 203, - 119, 121, 55, 40, 10, 10, 114, 66, 60, 183, 94, 96, 146, 27, 114, 225, - 164, 81, 111, 94, 84, 74, 239, 61, 116, 156, 31, 49, 46, 40, 128, 215, - 129, 39, 63, 27, 193, 215, 146, 137, 168, 185, 17, 239, 61, 137, 169, 153, - 111, 106, 169, 111, 106, 230, 163, 90, 250, 35, 31, 95, 68, 149, 156, 114, - 116, 68, 230, 147, 26, 163, 223, 231, 125, 99, 99, 242, 203, 217, 112, 150, - 217, 111, 82, 49, 206, 55, 82, 231, 188, 111, 82, 49, 89, 34, 80, 229, - 18, 52, 83, 132, 73, 165, 172, 229, 164, 172, 101, 82, 58, 68, 114, 232, - 99, 136, 144, 147, 178, 150, 147, 210, 205, 211, 215, 69, 83, 11, 18, 36, - 87, 173, 74, 81, 59, 149, 178, 150, 74, 90, 102, 47, 174, 209, 89, 165, - 228, 203, 240, 209, 100, 144, 98, 51, 163, 199, 4, 155, 234, 228, 39, 175, - 237, 75, 175, 155, 158, 238, 25, 149, 50, 219, 149, 249, 201, 107, 251, 210, - 75, 80, 85, 21, 159, 200, 127, 235, 215, 108, 176, 147, 127, 94, 242, 90, - 54, 125, 153, 221, 224, 182, 47, 78, 128, 161, 253, 8, 243, 172, 196, 47, - 196, 163, 242, 127, 40, 255, 67, 233, 188, 238, 79, 248, 71, 159, 231, 100, - 150, 187, 43, 221, 144, 24, 160, 233, 167, 121, 247, 110, 159, 128, 211, 36, - 56, 90, 186, 233, 100, 121, 156, 104, 211, 253, 96, 143, 92, 51, 81, 139, - 92, 161, 102, 90, 134, 57, 7, 186, 235, 208, 193, 126, 182, 2, 109, 42, - 120, 162, 0, 34, 33, 107, 136, 147, 58, 16, 196, 119, 20, 136, 88, 182, - 200, 235, 124, 231, 81, 92, 139, 118, 74, 197, 207, 189, 225, 184, 131, 63, - 239, 190, 210, 118, 224, 3, 94, 187, 166, 249, 187, 163, 8, 169, 80, 103, - 252, 143, 227, 233, 195, 96, 30, 20, 98, 218, 89, 10, 252, 167, 85, 8, - 218, 201, 10, 184, 47, 123, 110, 92, 178, 245, 73, 18, 242, 7, 177, 192, - 98, 63, 92, 235, 155, 135, 33, 48, 213, 233, 96, 246, 67, 64, 255, 67, - 194, 207, 169, 103, 227, 46, 235, 47, 177, 220, 154, 202, 117, 237, 110, 139, - 207, 78, 219, 101, 193, 172, 174, 209, 166, 94, 109, 237, 174, 121, 23, 110, - 8, 178, 81, 77, 237, 251, 246, 110, 67, 108, 157, 248, 78, 2, 138, 219, - 176, 157, 66, 124, 164, 227, 105, 95, 231, 4, 145, 100, 160, 191, 143, 117, - 124, 116, 38, 241, 177, 96, 48, 233, 239, 155, 250, 250, 67, 229, 207, 58, - 176, 156, 128, 163, 91, 70, 151, 83, 125, 206, 234, 176, 82, 3, 109, 223, - 196, 35, 64, 185, 151, 128, 166, 218, 129, 33, 112, 59, 158, 246, 62, 171, - 99, 12, 17, 110, 116, 183, 186, 187, 49, 114, 162, 99, 164, 33, 48, 187, - 225, 60, 158, 184, 141, 20, 184, 183, 238, 156, 129, 32, 179, 99, 200, 202, - 204, 248, 36, 209, 237, 245, 232, 148, 190, 60, 192, 109, 100, 42, 219, 9, - 27, 57, 2, 147, 39, 157, 96, 208, 49, 42, 73, 136, 26, 113, 146, 74, - 178, 26, 123, 105, 26, 105, 174, 4, 118, 3, 142, 242, 119, 216, 9, 141, - 29, 65, 238, 232, 117, 73, 148, 4, 219, 85, 237, 112, 36, 136, 138, 105, - 113, 5, 36, 123, 48, 172, 19, 110, 95, 25, 184, 209, 168, 46, 219, 43, - 207, 209, 66, 7, 2, 87, 137, 189, 214, 2, 130, 94, 25, 101, 177, 126, - 136, 65, 197, 125, 224, 43, 253, 170, 49, 232, 179, 230, 204, 38, 201, 208, - 38, 145, 251, 57, 147, 132, 181, 113, 96, 244, 10, 92, 93, 1, 166, 7, - 134, 111, 228, 209, 241, 74, 78, 90, 80, 35, 199, 245, 91, 212, 100, 115, - 88, 17, 196, 208, 58, 119, 26, 53, 203, 70, 159, 136, 143, 95, 225, 75, - 58, 141, 255, 131, 19, 215, 233, 52, 160, 159, 90, 230, 233, 220, 60, 133, - 2, 94, 100, 223, 155, 246, 241, 204, 230, 209, 176, 143, 130, 4, 124, 199, - 70, 188, 205, 107, 198, 101, 241, 231, 168, 46, 252, 45, 232, 75, 124, 92, - 250, 97, 221, 149, 219, 38, 6, 196, 132, 64, 135, 211, 181, 29, 171, 63, - 81, 46, 218, 32, 248, 238, 30, 191, 210, 132, 162, 37, 59, 159, 79, 37, - 142, 58, 238, 84, 140, 7, 55, 124, 139, 219, 182, 96, 181, 155, 186, 62, - 62, 238, 157, 171, 95, 180, 90, 31, 181, 70, 187, 217, 58, 207, 191, 113, - 9, 94, 140, 25, 101, 19, 34, 174, 252, 109, 205, 193, 126, 62, 242, 74, - 238, 252, 178, 77, 191, 88, 221, 46, 237, 207, 123, 47, 239, 221, 121, 173, - 229, 189, 155, 64, 231, 243, 228, 215, 169, 143, 229, 53, 163, 254, 13, 139, - 76, 109, 153, 137, 191, 185, 42, 224, 123, 18, 137, 142, 119, 243, 112, 34, - 171, 41, 126, 48, 145, 40, 132, 31, 76, 148, 84, 9, 207, 75, 148, 176, - 51, 125, 92, 236, 202, 52, 89, 61, 145, 165, 200, 71, 95, 242, 152, 84, - 158, 62, 44, 8, 113, 183, 227, 67, 35, 154, 147, 124, 241, 144, 214, 25, - 39, 54, 253, 131, 131, 218, 45, 231, 208, 168, 22, 134, 238, 119, 143, 235, - 38, 17, 73, 76, 17, 208, 11, 210, 27, 250, 9, 93, 193, 207, 13, 251, - 124, 212, 40, 204, 239, 204, 99, 251, 98, 67, 204, 226, 168, 255, 68, 111, - 72, 162, 47, 239, 15, 147, 121, 242, 245, 137, 62, 73, 148, 118, 12, 223, - 236, 220, 13, 68, 29, 224, 118, 31, 223, 35, 244, 250, 7, 172, 52, 220, - 57, 199, 175, 27, 23, 108, 24, 18, 171, 216, 226, 3, 190, 209, 105, 16, - 27, 170, 181, 34, 63, 22, 171, 64, 184, 55, 54, 166, 216, 104, 79, 236, - 239, 159, 246, 95, 56, 211, 231, 171, 219, 209, 103, 101, 121, 186, 185, 89, - 226, 78, 12, 184, 84, 141, 151, 29, 122, 101, 69, 191, 151, 192, 81, 66, - 192, 214, 121, 63, 52, 22, 57, 203, 147, 197, 81, 123, 94, 214, 58, 85, - 85, 66, 156, 55, 232, 58, 24, 71, 40, 91, 243, 126, 96, 80, 235, 54, - 5, 94, 170, 137, 174, 28, 157, 184, 196, 80, 223, 177, 181, 12, 218, 75, - 196, 173, 211, 151, 109, 54, 60, 230, 240, 156, 75, 183, 84, 179, 223, 55, - 207, 22, 57, 251, 176, 112, 148, 196, 63, 174, 55, 53, 110, 94, 128, 39, - 110, 138, 190, 118, 219, 234, 215, 248, 41, 247, 12, 165, 199, 147, 111, 190, - 187, 251, 20, 247, 79, 118, 116, 174, 175, 243, 253, 115, 233, 60, 104, 25, - 117, 209, 247, 172, 151, 108, 159, 248, 13, 115, 192, 60, 201, 145, 254, 17, - 32, 44, 88, 207, 40, 88, 31, 246, 51, 97, 246, 65, 197, 32, 81, 34, - 140, 202, 109, 178, 141, 124, 59, 224, 21, 52, 16, 173, 241, 144, 159, 99, - 209, 21, 191, 212, 22, 247, 103, 65, 147, 159, 67, 182, 185, 143, 202, 94, - 140, 164, 70, 85, 179, 149, 80, 212, 12, 93, 99, 9, 203, 233, 134, 14, - 51, 220, 176, 124, 238, 85, 141, 98, 128, 219, 146, 151, 144, 219, 158, 77, - 186, 20, 204, 38, 198, 142, 241, 78, 69, 113, 90, 144, 62, 90, 208, 117, - 164, 255, 25, 153, 84, 35, 119, 48, 140, 198, 225, 119, 147, 158, 1, 240, - 156, 120, 193, 224, 229, 163, 224, 147, 179, 210, 136, 210, 19, 130, 226, 240, - 85, 39, 118, 111, 197, 35, 122, 63, 52, 17, 37, 151, 47, 157, 129, 78, - 121, 86, 92, 108, 3, 23, 17, 238, 196, 15, 204, 62, 83, 247, 56, 10, - 194, 182, 151, 110, 79, 234, 46, 171, 19, 155, 139, 238, 54, 222, 14, 78, - 49, 183, 65, 41, 207, 40, 182, 126, 218, 19, 216, 145, 251, 209, 18, 71, - 53, 140, 147, 37, 78, 107, 112, 62, 194, 183, 87, 145, 246, 202, 5, 144, - 37, 86, 92, 83, 239, 112, 232, 124, 164, 206, 218, 189, 210, 89, 99, 11, - 72, 128, 202, 203, 82, 93, 102, 247, 63, 172, 199, 125, 169, 31, 216, 96, - 238, 145, 30, 2, 252, 148, 189, 185, 96, 191, 132, 59, 129, 57, 137, 130, - 88, 44, 155, 160, 129, 90, 195, 196, 27, 214, 224, 6, 172, 238, 247, 60, - 81, 244, 230, 95, 87, 213, 187, 42, 170, 223, 42, 152, 94, 216, 130, 169, - 162, 180, 170, 173, 114, 119, 79, 159, 164, 234, 114, 142, 218, 56, 58, 219, - 86, 133, 47, 12, 238, 189, 37, 252, 209, 23, 239, 43, 197, 37, 124, 34, - 17, 193, 224, 255, 189, 84, 188, 175, 134, 101, 27, 6, 95, 239, 197, 229, - 240, 212, 144, 10, 59, 41, 168, 121, 15, 11, 176, 170, 36, 127, 78, 73, - 47, 31, 241, 77, 132, 237, 182, 72, 57, 211, 207, 38, 196, 83, 200, 79, - 101, 215, 33, 76, 188, 11, 86, 222, 114, 211, 232, 32, 70, 138, 40, 21, - 87, 213, 8, 197, 154, 146, 252, 81, 131, 123, 109, 85, 129, 29, 254, 61, - 189, 135, 246, 221, 22, 203, 102, 163, 197, 17, 213, 137, 126, 170, 82, 143, - 81, 200, 15, 244, 215, 84, 37, 183, 82, 230, 169, 81, 150, 187, 160, 18, - 24, 1, 59, 84, 226, 114, 162, 125, 110, 56, 55, 95, 53, 152, 42, 157, - 204, 179, 161, 154, 204, 121, 18, 241, 217, 130, 90, 232, 15, 8, 171, 38, - 31, 79, 179, 232, 51, 113, 25, 157, 69, 35, 162, 73, 165, 176, 209, 117, - 57, 115, 25, 154, 80, 151, 124, 138, 31, 160, 41, 52, 82, 86, 132, 244, - 204, 11, 194, 213, 243, 132, 14, 89, 192, 129, 129, 1, 169, 88, 135, 244, - 87, 3, 90, 174, 95, 53, 24, 184, 82, 1, 93, 54, 228, 219, 132, 102, - 222, 122, 9, 119, 71, 152, 209, 170, 176, 140, 117, 26, 23, 144, 187, 100, - 177, 106, 86, 210, 129, 73, 70, 83, 107, 15, 216, 69, 77, 152, 137, 176, - 67, 67, 39, 118, 193, 113, 12, 0, 86, 212, 218, 183, 166, 177, 194, 86, - 232, 16, 135, 206, 27, 110, 66, 19, 126, 242, 183, 206, 186, 70, 29, 124, - 249, 247, 206, 166, 54, 164, 191, 70, 73, 235, 121, 212, 56, 129, 147, 135, - 154, 250, 199, 255, 91, 162, 219, 43, 175, 163, 233, 190, 117, 104, 191, 61, - 64, 127, 3, 53, 250, 100, 103, 168, 74, 252, 107, 250, 99, 155, 236, 146, - 237, 190, 94, 81, 0, 70, 180, 11, 61, 37, 44, 164, 17, 239, 88, 39, - 166, 85, 174, 88, 235, 103, 235, 71, 240, 37, 101, 186, 51, 169, 250, 195, - 176, 251, 44, 117, 139, 27, 201, 238, 181, 233, 78, 214, 212, 161, 27, 250, - 7, 133, 187, 109, 249, 3, 254, 52, 249, 90, 121, 93, 217, 84, 182, 149, - 184, 92, 62, 9, 244, 142, 204, 200, 104, 220, 167, 5, 220, 161, 23, 2, - 199, 99, 236, 147, 78, 108, 221, 189, 143, 253, 172, 114, 110, 7, 232, 234, - 186, 163, 13, 227, 189, 254, 103, 59, 142, 245, 37, 209, 212, 214, 209, 138, - 79, 195, 216, 149, 159, 198, 98, 16, 213, 100, 79, 176, 12, 175, 90, 20, - 47, 164, 157, 98, 43, 95, 160, 202, 121, 138, 95, 216, 172, 223, 215, 200, - 241, 245, 26, 59, 190, 94, 25, 47, 17, 238, 240, 44, 114, 27, 20, 155, - 172, 107, 87, 222, 5, 85, 34, 190, 97, 17, 181, 149, 184, 239, 27, 156, - 48, 135, 236, 55, 98, 14, 35, 252, 147, 132, 236, 211, 4, 122, 221, 239, - 187, 78, 2, 164, 246, 144, 115, 143, 41, 215, 193, 124, 41, 142, 137, 158, - 128, 146, 200, 116, 135, 45, 179, 99, 28, 101, 235, 14, 105, 212, 207, 247, - 34, 70, 52, 27, 196, 20, 183, 211, 141, 128, 47, 102, 163, 83, 236, 101, - 90, 232, 24, 49, 198, 137, 11, 121, 42, 201, 246, 209, 247, 220, 50, 183, - 73, 7, 16, 147, 189, 234, 140, 152, 100, 240, 73, 13, 127, 92, 247, 25, - 34, 201, 160, 196, 50, 55, 68, 92, 198, 191, 53, 118, 126, 7, 232, 174, - 26, 138, 164, 36, 110, 116, 52, 2, 8, 27, 169, 69, 118, 3, 138, 149, - 209, 90, 84, 25, 26, 153, 178, 46, 145, 210, 8, 188, 91, 241, 149, 70, - 244, 10, 3, 215, 84, 88, 171, 29, 18, 19, 148, 3, 196, 198, 91, 161, - 236, 159, 7, 115, 196, 89, 235, 96, 70, 161, 205, 72, 75, 124, 249, 174, - 73, 220, 165, 122, 169, 29, 83, 89, 91, 102, 213, 57, 210, 183, 51, 1, - 174, 112, 196, 105, 198, 190, 187, 154, 223, 175, 176, 234, 42, 169, 70, 231, - 140, 236, 156, 82, 80, 85, 238, 15, 117, 85, 58, 113, 59, 169, 183, 30, - 43, 95, 162, 240, 106, 9, 123, 158, 80, 169, 43, 211, 152, 26, 125, 154, - 176, 22, 104, 119, 12, 13, 49, 185, 229, 212, 205, 15, 60, 75, 8, 87, - 141, 149, 77, 106, 53, 123, 175, 21, 87, 245, 217, 154, 202, 222, 163, 199, - 202, 153, 29, 163, 197, 154, 208, 39, 9, 146, 247, 50, 226, 239, 80, 93, - 225, 136, 135, 11, 90, 113, 250, 131, 79, 250, 88, 64, 113, 96, 35, 227, - 26, 180, 124, 148, 182, 207, 46, 95, 209, 53, 99, 200, 2, 253, 86, 81, - 83, 125, 136, 58, 81, 229, 225, 18, 218, 170, 145, 86, 87, 69, 104, 89, - 63, 66, 197, 53, 130, 142, 171, 168, 184, 62, 241, 21, 180, 92, 35, 251, - 105, 153, 209, 153, 81, 81, 133, 5, 251, 48, 23, 252, 215, 33, 254, 50, - 198, 24, 20, 92, 105, 92, 243, 111, 97, 221, 243, 59, 172, 30, 1, 54, - 196, 223, 226, 13, 183, 253, 125, 188, 193, 231, 110, 119, 217, 157, 68, 165, - 109, 47, 88, 247, 202, 151, 62, 21, 191, 124, 85, 40, 130, 18, 133, 160, - 80, 156, 243, 95, 46, 104, 221, 171, 172, 123, 213, 109, 175, 178, 237, 149, - 203, 5, 175, 194, 206, 175, 75, 152, 243, 15, 59, 226, 50, 79, 75, 15, - 204, 113, 179, 181, 155, 232, 215, 210, 95, 182, 78, 69, 154, 225, 206, 56, - 54, 181, 177, 198, 152, 75, 14, 29, 198, 123, 169, 178, 37, 99, 36, 117, - 71, 59, 23, 188, 235, 45, 186, 49, 179, 81, 179, 86, 110, 30, 251, 154, - 132, 20, 26, 99, 195, 201, 104, 227, 170, 80, 255, 133, 65, 12, 19, 215, - 15, 242, 184, 177, 143, 236, 16, 9, 59, 239, 106, 62, 56, 228, 15, 105, - 32, 198, 155, 99, 229, 219, 201, 224, 175, 177, 39, 79, 19, 161, 50, 58, - 198, 240, 100, 156, 214, 247, 53, 37, 211, 104, 199, 45, 63, 114, 197, 54, - 43, 25, 79, 105, 72, 243, 50, 176, 111, 71, 137, 19, 24, 68, 96, 213, - 56, 166, 238, 152, 243, 104, 162, 176, 194, 92, 163, 1, 27, 186, 26, 86, - 129, 170, 163, 116, 219, 56, 160, 115, 107, 14, 13, 25, 20, 234, 172, 70, - 27, 123, 147, 124, 26, 180, 46, 1, 53, 104, 240, 231, 128, 41, 151, 192, - 33, 221, 11, 65, 167, 77, 144, 234, 121, 246, 71, 186, 190, 89, 109, 53, - 174, 157, 198, 113, 174, 105, 16, 103, 181, 98, 208, 126, 36, 138, 133, 71, - 33, 197, 33, 147, 246, 142, 129, 74, 195, 36, 232, 155, 85, 155, 65, 113, - 174, 21, 196, 120, 180, 88, 116, 255, 49, 93, 201, 182, 238, 236, 40, 97, - 208, 13, 94, 7, 183, 193, 155, 160, 23, 124, 147, 71, 84, 245, 157, 207, - 190, 153, 23, 126, 105, 93, 90, 150, 59, 32, 72, 183, 178, 172, 190, 102, - 172, 236, 114, 176, 209, 129, 183, 20, 248, 70, 5, 110, 117, 96, 143, 2, - 191, 145, 192, 67, 126, 179, 210, 150, 16, 112, 127, 212, 97, 7, 188, 175, - 197, 29, 201, 173, 160, 8, 191, 145, 183, 158, 65, 25, 252, 38, 117, 229, - 239, 54, 150, 54, 144, 68, 211, 29, 142, 134, 173, 31, 66, 203, 211, 68, - 123, 92, 34, 37, 92, 153, 228, 245, 108, 130, 68, 249, 27, 72, 137, 168, - 92, 238, 148, 180, 195, 146, 18, 17, 28, 175, 236, 9, 137, 27, 81, 34, - 242, 35, 164, 13, 96, 109, 141, 40, 8, 231, 200, 202, 49, 244, 113, 178, - 161, 34, 125, 114, 249, 136, 95, 172, 147, 158, 17, 6, 201, 146, 73, 193, - 129, 118, 6, 205, 192, 28, 17, 60, 214, 226, 186, 222, 175, 226, 47, 156, - 133, 112, 114, 134, 187, 5, 158, 46, 7, 182, 76, 160, 95, 108, 67, 42, - 252, 88, 60, 147, 32, 215, 129, 9, 139, 138, 28, 147, 92, 97, 200, 30, - 28, 134, 12, 236, 155, 212, 76, 217, 76, 96, 85, 231, 144, 200, 162, 14, - 56, 9, 98, 191, 74, 133, 133, 142, 233, 190, 32, 59, 33, 44, 55, 247, - 184, 82, 146, 239, 203, 198, 68, 63, 157, 39, 231, 214, 74, 155, 231, 235, - 46, 116, 213, 204, 238, 18, 107, 190, 176, 200, 169, 37, 95, 241, 205, 208, - 162, 129, 237, 95, 118, 253, 94, 0, 44, 187, 151, 88, 151, 249, 163, 156, - 197, 249, 46, 189, 56, 115, 145, 39, 126, 175, 59, 129, 171, 193, 71, 226, - 153, 58, 183, 104, 61, 229, 81, 3, 156, 239, 175, 126, 163, 211, 159, 210, - 170, 13, 231, 241, 6, 76, 144, 222, 162, 206, 71, 98, 115, 232, 33, 230, - 7, 232, 227, 195, 114, 231, 87, 191, 217, 249, 52, 93, 205, 187, 171, 190, - 13, 106, 117, 102, 195, 41, 101, 168, 2, 118, 245, 66, 249, 210, 218, 238, - 185, 197, 113, 11, 75, 226, 223, 26, 46, 129, 202, 108, 234, 207, 246, 30, - 254, 116, 50, 222, 240, 6, 36, 54, 164, 203, 193, 92, 69, 80, 195, 239, - 71, 131, 7, 215, 139, 94, 218, 166, 131, 51, 76, 66, 112, 148, 148, 119, - 111, 136, 250, 203, 57, 48, 119, 80, 127, 57, 202, 212, 67, 245, 207, 99, - 35, 248, 183, 226, 171, 140, 161, 71, 188, 111, 211, 185, 235, 103, 186, 62, - 235, 231, 80, 133, 30, 232, 252, 254, 102, 210, 189, 203, 235, 125, 38, 213, - 19, 100, 178, 227, 162, 255, 63, 99, 96, 28, 238, 192, 154, 101, 246, 43, - 73, 226, 65, 246, 145, 38, 221, 106, 252, 223, 102, 229, 236, 8, 148, 246, - 154, 51, 87, 254, 57, 230, 204, 34, 53, 181, 62, 24, 143, 54, 103, 158, - 36, 40, 106, 78, 74, 12, 211, 44, 134, 245, 55, 78, 160, 254, 40, 19, - 242, 194, 127, 107, 14, 89, 249, 30, 47, 253, 213, 100, 180, 76, 129, 120, - 25, 170, 76, 142, 68, 108, 142, 5, 166, 217, 249, 211, 168, 135, 79, 162, - 53, 59, 213, 229, 136, 253, 160, 205, 78, 74, 141, 219, 156, 12, 50, 208, - 205, 78, 115, 241, 147, 43, 150, 248, 67, 80, 156, 149, 71, 198, 199, 251, - 14, 206, 96, 148, 134, 93, 224, 192, 242, 195, 60, 53, 213, 83, 25, 39, - 179, 251, 224, 62, 192, 126, 110, 64, 156, 79, 145, 79, 81, 205, 135, 167, - 16, 157, 167, 137, 225, 160, 68, 63, 153, 73, 102, 194, 177, 66, 237, 199, - 54, 253, 98, 68, 211, 233, 225, 201, 97, 69, 131, 127, 12, 114, 169, 105, - 6, 7, 63, 174, 114, 166, 7, 44, 19, 197, 221, 182, 210, 53, 32, 94, - 235, 182, 28, 220, 108, 212, 223, 173, 250, 75, 139, 241, 4, 191, 221, 117, - 112, 115, 203, 207, 183, 252, 76, 220, 193, 77, 87, 217, 4, 223, 220, 234, - 135, 181, 126, 216, 232, 135, 109, 82, 250, 162, 16, 147, 69, 166, 158, 139, - 163, 157, 16, 187, 152, 117, 199, 86, 215, 87, 167, 79, 240, 212, 92, 69, - 85, 99, 169, 240, 33, 78, 121, 221, 41, 69, 184, 132, 43, 81, 50, 182, - 45, 234, 150, 193, 17, 111, 220, 96, 252, 149, 224, 158, 112, 230, 252, 12, - 34, 116, 106, 179, 145, 60, 211, 241, 255, 68, 158, 111, 157, 240, 91, 19, - 110, 247, 28, 38, 82, 167, 21, 70, 202, 100, 249, 230, 182, 195, 65, 250, - 117, 221, 105, 55, 245, 243, 134, 163, 214, 250, 117, 203, 175, 155, 148, 208, - 40, 122, 110, 96, 158, 133, 132, 196, 143, 39, 205, 156, 19, 253, 26, 120, - 169, 110, 102, 174, 157, 101, 65, 25, 82, 236, 32, 114, 32, 126, 62, 67, - 12, 137, 136, 21, 57, 118, 5, 207, 184, 248, 122, 164, 166, 239, 132, 225, - 127, 84, 79, 109, 27, 120, 38, 129, 158, 17, 64, 157, 131, 18, 70, 0, - 117, 209, 41, 90, 105, 84, 216, 32, 74, 216, 183, 176, 83, 12, 27, 246, - 21, 190, 12, 66, 245, 250, 222, 163, 128, 152, 8, 97, 69, 87, 33, 156, - 141, 237, 115, 8, 228, 14, 167, 188, 65, 148, 118, 124, 32, 167, 139, 75, - 254, 253, 128, 115, 69, 251, 18, 222, 15, 207, 228, 44, 0, 39, 136, 234, - 246, 87, 163, 19, 49, 98, 23, 227, 215, 116, 59, 163, 210, 58, 216, 176, - 93, 216, 229, 173, 121, 9, 121, 245, 234, 117, 58, 44, 242, 148, 71, 93, - 104, 153, 168, 57, 4, 52, 205, 26, 35, 233, 145, 150, 58, 122, 130, 120, - 105, 244, 195, 14, 154, 192, 97, 155, 24, 241, 176, 81, 11, 207, 216, 118, - 147, 19, 135, 254, 198, 36, 222, 100, 19, 135, 137, 196, 145, 191, 53, 137, - 183, 217, 196, 145, 73, 140, 251, 237, 132, 29, 133, 3, 12, 164, 142, 14, - 84, 17, 106, 1, 76, 78, 34, 22, 17, 65, 101, 57, 140, 83, 102, 219, - 8, 107, 58, 38, 41, 21, 241, 154, 130, 86, 213, 138, 104, 37, 112, 216, - 55, 252, 182, 81, 111, 91, 126, 67, 61, 119, 246, 112, 97, 251, 202, 61, - 94, 204, 122, 221, 155, 89, 119, 217, 27, 202, 162, 197, 143, 230, 38, 225, - 7, 252, 188, 197, 143, 217, 218, 110, 24, 187, 203, 2, 147, 184, 81, 130, - 194, 229, 198, 141, 187, 119, 183, 253, 238, 205, 218, 94, 70, 40, 219, 20, - 46, 167, 70, 133, 99, 229, 133, 216, 71, 249, 243, 57, 104, 225, 241, 147, - 200, 133, 236, 183, 196, 250, 15, 22, 75, 54, 245, 232, 203, 128, 252, 65, - 98, 33, 157, 154, 168, 99, 128, 129, 26, 11, 120, 162, 139, 219, 238, 141, - 246, 157, 44, 102, 45, 84, 234, 219, 163, 60, 124, 89, 250, 116, 206, 176, - 146, 252, 0, 157, 41, 22, 3, 188, 237, 196, 234, 41, 77, 171, 48, 25, - 168, 168, 132, 164, 202, 191, 144, 162, 209, 94, 131, 1, 183, 143, 206, 188, - 100, 143, 37, 61, 13, 210, 50, 116, 182, 219, 231, 109, 144, 170, 183, 207, - 225, 96, 108, 227, 82, 62, 7, 83, 210, 135, 180, 141, 209, 190, 126, 180, - 16, 243, 37, 248, 83, 46, 7, 139, 128, 157, 57, 91, 27, 36, 229, 82, - 140, 206, 252, 112, 215, 28, 170, 142, 82, 189, 23, 248, 133, 247, 94, 65, - 52, 202, 98, 141, 238, 102, 226, 36, 169, 166, 168, 140, 27, 91, 224, 51, - 90, 105, 4, 44, 160, 31, 40, 227, 254, 62, 173, 184, 58, 151, 212, 103, - 88, 253, 204, 135, 173, 156, 15, 185, 147, 76, 31, 249, 197, 182, 90, 214, - 254, 26, 118, 196, 116, 39, 60, 133, 254, 204, 95, 163, 14, 251, 77, 248, - 107, 200, 250, 53, 234, 250, 128, 229, 4, 126, 152, 150, 174, 91, 213, 156, - 69, 231, 113, 1, 31, 13, 68, 6, 220, 72, 48, 184, 97, 35, 16, 83, - 8, 39, 64, 12, 31, 62, 98, 93, 203, 147, 66, 84, 21, 105, 88, 205, - 63, 148, 123, 32, 184, 16, 35, 22, 78, 105, 152, 69, 10, 115, 112, 171, - 76, 136, 172, 132, 4, 1, 21, 134, 219, 111, 83, 58, 90, 137, 89, 136, - 34, 208, 102, 128, 40, 196, 195, 41, 203, 102, 106, 87, 33, 3, 11, 178, - 42, 153, 70, 63, 99, 123, 131, 38, 223, 160, 209, 119, 167, 180, 183, 66, - 186, 30, 14, 106, 231, 213, 209, 125, 25, 0, 174, 27, 185, 191, 4, 210, - 90, 158, 135, 81, 111, 48, 250, 52, 160, 229, 147, 177, 29, 5, 172, 81, - 65, 242, 203, 139, 253, 134, 139, 106, 249, 40, 128, 18, 158, 66, 38, 4, - 71, 145, 63, 236, 216, 27, 18, 66, 160, 230, 38, 230, 21, 198, 218, 186, - 24, 123, 107, 45, 188, 90, 149, 64, 219, 29, 174, 28, 54, 137, 176, 33, - 135, 149, 224, 218, 187, 184, 134, 22, 11, 253, 221, 236, 202, 94, 117, 203, - 150, 25, 197, 53, 250, 149, 151, 89, 253, 176, 174, 22, 255, 26, 113, 136, - 60, 132, 94, 210, 142, 95, 236, 168, 13, 221, 209, 220, 144, 163, 92, 186, - 139, 159, 1, 73, 18, 9, 46, 44, 27, 160, 44, 158, 117, 226, 157, 55, - 87, 49, 166, 67, 217, 92, 60, 40, 46, 224, 238, 47, 204, 68, 211, 161, - 0, 254, 237, 232, 91, 182, 255, 66, 27, 37, 5, 59, 184, 194, 163, 129, - 28, 23, 164, 2, 56, 252, 84, 121, 108, 60, 54, 153, 241, 24, 59, 215, - 213, 189, 244, 0, 3, 12, 103, 233, 151, 69, 120, 135, 82, 126, 24, 100, - 67, 163, 210, 214, 216, 130, 195, 96, 83, 182, 232, 153, 161, 183, 113, 21, - 26, 15, 232, 226, 24, 213, 248, 172, 251, 168, 20, 54, 170, 48, 193, 58, - 112, 65, 193, 8, 220, 228, 161, 182, 114, 166, 127, 148, 139, 169, 192, 56, - 145, 85, 142, 165, 114, 145, 91, 41, 105, 58, 100, 147, 70, 115, 213, 109, - 109, 29, 237, 131, 202, 82, 199, 112, 123, 26, 200, 149, 89, 180, 166, 188, - 20, 242, 156, 84, 101, 121, 54, 206, 45, 233, 158, 234, 145, 166, 250, 78, - 100, 190, 110, 221, 17, 19, 7, 77, 115, 37, 160, 240, 87, 31, 139, 77, - 250, 227, 162, 56, 97, 45, 82, 172, 72, 120, 10, 48, 210, 199, 98, 116, - 90, 108, 26, 20, 3, 8, 61, 45, 239, 129, 242, 221, 123, 0, 222, 104, - 19, 55, 42, 57, 125, 137, 52, 95, 120, 147, 146, 184, 74, 105, 236, 76, - 57, 79, 94, 163, 236, 19, 125, 152, 138, 230, 16, 149, 235, 151, 113, 201, - 71, 115, 224, 236, 184, 75, 148, 80, 93, 162, 240, 65, 190, 177, 239, 10, - 133, 139, 201, 208, 78, 217, 220, 238, 135, 123, 1, 201, 187, 115, 72, 160, - 238, 177, 156, 10, 147, 174, 212, 154, 196, 151, 180, 212, 159, 51, 218, 99, - 63, 145, 7, 134, 14, 57, 75, 82, 249, 232, 110, 53, 62, 26, 15, 61, - 1, 142, 233, 16, 85, 87, 95, 43, 147, 103, 106, 248, 148, 198, 248, 194, - 223, 102, 93, 20, 243, 85, 247, 179, 142, 209, 131, 128, 168, 126, 119, 201, - 191, 31, 136, 248, 151, 140, 123, 58, 100, 161, 63, 238, 105, 235, 234, 32, - 98, 157, 95, 203, 6, 155, 208, 30, 245, 120, 171, 171, 65, 14, 68, 91, - 27, 188, 137, 50, 207, 216, 161, 82, 89, 149, 66, 217, 223, 73, 168, 87, - 83, 156, 126, 18, 183, 220, 201, 113, 179, 93, 251, 85, 231, 166, 184, 33, - 62, 62, 61, 157, 66, 37, 17, 208, 80, 141, 242, 91, 124, 165, 64, 140, - 89, 236, 35, 158, 255, 92, 141, 121, 21, 162, 90, 231, 37, 63, 14, 83, - 153, 109, 220, 188, 18, 21, 227, 221, 232, 129, 206, 86, 198, 181, 51, 127, - 225, 13, 198, 28, 241, 42, 222, 113, 86, 77, 147, 85, 77, 80, 225, 152, - 192, 46, 172, 41, 219, 72, 186, 89, 136, 219, 197, 44, 108, 113, 82, 27, - 94, 62, 187, 51, 136, 109, 174, 32, 234, 41, 29, 115, 113, 87, 143, 91, - 112, 86, 59, 11, 102, 97, 100, 21, 162, 196, 229, 250, 159, 57, 209, 111, - 113, 11, 207, 34, 33, 85, 66, 163, 30, 182, 162, 102, 76, 83, 190, 30, - 53, 218, 237, 54, 155, 67, 55, 219, 113, 187, 173, 12, 183, 227, 214, 69, - 59, 130, 17, 117, 235, 34, 140, 232, 172, 91, 111, 156, 183, 98, 222, 163, - 235, 81, 24, 198, 136, 106, 92, 180, 90, 77, 132, 209, 151, 231, 23, 237, - 182, 70, 153, 165, 12, 225, 219, 200, 220, 23, 224, 130, 218, 211, 45, 75, - 123, 144, 79, 54, 231, 202, 55, 192, 175, 197, 230, 165, 47, 104, 175, 56, - 119, 159, 211, 203, 69, 224, 156, 60, 253, 235, 163, 124, 203, 251, 24, 216, - 143, 53, 64, 84, 198, 253, 67, 194, 72, 229, 129, 9, 161, 246, 174, 139, - 166, 149, 248, 152, 136, 175, 101, 197, 164, 250, 92, 92, 162, 126, 109, 212, - 229, 18, 213, 60, 67, 141, 88, 78, 112, 142, 122, 149, 193, 52, 225, 59, - 143, 203, 225, 28, 99, 123, 209, 38, 0, 184, 24, 33, 212, 233, 254, 96, - 62, 167, 149, 142, 150, 145, 187, 59, 222, 163, 139, 141, 19, 218, 73, 216, - 10, 253, 170, 240, 88, 124, 86, 43, 190, 34, 22, 186, 112, 77, 195, 132, - 214, 191, 201, 116, 105, 207, 43, 174, 159, 121, 106, 250, 199, 81, 254, 120, - 74, 72, 59, 221, 13, 220, 8, 60, 103, 57, 7, 50, 227, 250, 93, 137, - 86, 194, 151, 157, 168, 224, 221, 36, 24, 128, 98, 69, 151, 225, 134, 190, - 224, 59, 154, 204, 250, 110, 211, 28, 47, 43, 157, 61, 117, 117, 211, 232, - 40, 112, 109, 92, 213, 208, 57, 73, 212, 150, 113, 83, 3, 196, 108, 165, - 218, 145, 184, 125, 41, 250, 214, 6, 162, 225, 167, 248, 25, 115, 5, 193, - 82, 214, 188, 13, 86, 237, 173, 201, 246, 30, 69, 185, 98, 3, 244, 74, - 18, 208, 117, 147, 152, 75, 166, 148, 67, 13, 226, 165, 10, 116, 230, 131, - 255, 179, 48, 144, 150, 7, 186, 213, 129, 219, 98, 58, 177, 238, 49, 126, - 231, 134, 6, 237, 166, 95, 95, 71, 30, 241, 68, 99, 191, 0, 255, 52, - 139, 165, 220, 172, 117, 168, 190, 151, 222, 167, 193, 242, 134, 154, 251, 186, - 180, 92, 7, 203, 77, 240, 105, 186, 156, 222, 76, 40, 235, 50, 197, 151, - 188, 119, 244, 59, 186, 250, 170, 25, 204, 122, 215, 151, 222, 187, 103, 29, - 172, 158, 95, 151, 188, 111, 109, 120, 53, 164, 152, 55, 206, 123, 68, 239, - 38, 155, 175, 75, 20, 210, 137, 203, 151, 94, 249, 69, 201, 251, 57, 249, - 153, 255, 151, 228, 103, 254, 143, 206, 123, 76, 239, 63, 35, 193, 207, 149, - 191, 92, 122, 63, 255, 133, 74, 133, 19, 246, 142, 63, 235, 209, 92, 42, - 45, 55, 207, 255, 82, 174, 252, 204, 143, 235, 231, 63, 3, 89, 165, 153, - 41, 247, 231, 191, 84, 126, 68, 132, 42, 94, 127, 63, 29, 95, 253, 76, - 149, 228, 146, 40, 236, 186, 163, 155, 85, 173, 210, 235, 165, 173, 38, 252, - 194, 87, 221, 122, 234, 128, 31, 211, 1, 182, 166, 236, 41, 190, 147, 173, - 32, 87, 225, 231, 191, 116, 128, 100, 157, 170, 38, 215, 239, 210, 18, 27, - 117, 186, 244, 126, 164, 77, 237, 235, 18, 40, 13, 234, 190, 67, 3, 190, - 117, 82, 80, 198, 63, 255, 69, 146, 69, 95, 151, 144, 164, 129, 36, 111, - 146, 73, 162, 10, 39, 42, 235, 255, 95, 75, 116, 139, 134, 20, 5, 191, - 54, 45, 255, 217, 134, 187, 61, 195, 239, 78, 207, 240, 251, 254, 158, 153, - 30, 215, 51, 211, 125, 61, 51, 157, 117, 117, 207, 180, 14, 245, 76, 43, - 221, 51, 173, 116, 207, 180, 190, 172, 103, 50, 245, 107, 166, 200, 37, 93, - 34, 129, 189, 233, 108, 115, 3, 121, 222, 124, 212, 29, 151, 38, 183, 153, - 169, 194, 229, 126, 155, 122, 127, 147, 124, 119, 38, 211, 106, 50, 31, 124, - 44, 245, 187, 203, 110, 249, 210, 199, 31, 74, 121, 229, 191, 11, 190, 13, - 222, 248, 148, 16, 55, 224, 165, 207, 232, 223, 192, 255, 252, 114, 114, 27, - 248, 213, 234, 231, 192, 71, 45, 74, 148, 33, 49, 48, 191, 244, 174, 3, - 124, 23, 208, 60, 243, 127, 73, 205, 183, 111, 133, 72, 111, 146, 179, 75, - 40, 243, 163, 144, 166, 242, 35, 186, 241, 71, 170, 202, 47, 61, 30, 86, - 220, 53, 149, 201, 237, 171, 206, 176, 68, 5, 148, 191, 22, 214, 26, 207, - 56, 84, 211, 210, 71, 7, 132, 74, 42, 113, 89, 129, 61, 52, 20, 137, - 156, 202, 169, 82, 107, 205, 235, 128, 210, 87, 65, 92, 153, 158, 63, 74, - 125, 57, 240, 50, 159, 16, 204, 175, 77, 126, 65, 198, 46, 49, 194, 39, - 137, 209, 84, 196, 208, 99, 108, 127, 238, 180, 201, 126, 164, 113, 151, 46, - 226, 105, 122, 39, 138, 72, 207, 47, 238, 229, 215, 166, 151, 247, 100, 139, - 28, 195, 224, 23, 164, 166, 184, 215, 201, 133, 82, 103, 147, 152, 142, 213, - 212, 116, 220, 215, 149, 211, 156, 174, 12, 157, 174, 12, 221, 174, 156, 62, - 221, 149, 168, 37, 119, 37, 74, 77, 116, 229, 84, 119, 229, 244, 143, 236, - 74, 41, 207, 210, 121, 250, 68, 87, 250, 233, 190, 60, 102, 242, 236, 43, - 68, 255, 79, 76, 128, 28, 147, 74, 163, 73, 63, 224, 57, 25, 188, 150, - 9, 111, 242, 136, 131, 95, 102, 215, 193, 21, 168, 217, 191, 14, 34, 100, - 51, 171, 118, 162, 204, 44, 184, 226, 207, 175, 237, 44, 229, 133, 206, 237, - 253, 75, 90, 231, 38, 191, 152, 130, 23, 131, 79, 119, 3, 41, 186, 129, - 204, 195, 195, 21, 136, 2, 147, 80, 21, 50, 227, 66, 126, 79, 53, 176, - 89, 170, 149, 25, 127, 136, 184, 244, 231, 126, 128, 203, 247, 194, 35, 125, - 70, 227, 228, 122, 87, 40, 149, 21, 165, 103, 51, 217, 160, 121, 47, 232, - 80, 5, 240, 131, 215, 95, 240, 58, 193, 235, 228, 23, 233, 141, 217, 236, - 229, 240, 171, 24, 253, 49, 153, 5, 30, 165, 164, 205, 234, 92, 70, 105, - 236, 140, 210, 216, 29, 165, 146, 200, 29, 157, 188, 6, 133, 237, 35, 22, - 170, 176, 157, 248, 14, 3, 190, 121, 196, 164, 104, 186, 95, 189, 149, 105, - 23, 7, 179, 25, 207, 110, 102, 37, 38, 179, 107, 110, 52, 38, 2, 237, - 95, 234, 117, 74, 175, 24, 138, 242, 10, 106, 190, 229, 253, 220, 187, 111, - 164, 50, 49, 28, 152, 246, 115, 97, 199, 220, 125, 195, 244, 56, 6, 254, - 91, 222, 234, 51, 57, 248, 247, 225, 83, 89, 138, 42, 90, 131, 62, 222, - 147, 185, 19, 28, 38, 202, 44, 37, 70, 34, 125, 147, 140, 87, 213, 138, - 143, 169, 150, 127, 31, 253, 179, 234, 233, 4, 71, 137, 234, 75, 134, 225, - 215, 135, 155, 145, 136, 11, 131, 68, 30, 137, 184, 40, 72, 117, 73, 102, - 22, 170, 230, 97, 125, 108, 170, 41, 216, 220, 187, 31, 198, 71, 206, 66, - 166, 113, 243, 55, 209, 216, 191, 143, 255, 197, 68, 119, 130, 227, 127, 114, - 95, 196, 251, 226, 226, 163, 251, 169, 117, 29, 180, 84, 63, 181, 254, 152, - 126, 106, 29, 213, 79, 246, 25, 107, 185, 34, 77, 249, 119, 246, 223, 90, - 21, 11, 33, 196, 61, 237, 177, 254, 38, 17, 192, 156, 253, 54, 25, 132, - 211, 218, 58, 116, 130, 144, 102, 147, 8, 144, 207, 146, 65, 248, 76, 19, - 75, 149, 22, 148, 174, 140, 160, 220, 191, 166, 165, 147, 94, 149, 1, 130, - 127, 93, 62, 141, 64, 194, 253, 107, 219, 222, 14, 106, 95, 7, 109, 213, - 65, 237, 63, 166, 131, 218, 71, 173, 161, 203, 117, 58, 201, 114, 147, 9, - 89, 167, 187, 117, 185, 73, 231, 99, 123, 199, 57, 106, 55, 232, 172, 205, - 91, 138, 191, 135, 32, 78, 218, 144, 210, 134, 236, 21, 105, 239, 34, 109, - 103, 214, 30, 34, 158, 93, 7, 103, 138, 136, 103, 233, 3, 12, 134, 144, - 34, 208, 139, 61, 149, 124, 135, 134, 191, 163, 51, 77, 67, 14, 20, 111, - 26, 114, 162, 120, 221, 16, 250, 230, 214, 182, 244, 174, 81, 237, 188, 43, - 159, 18, 39, 228, 151, 190, 165, 231, 111, 213, 243, 27, 122, 126, 163, 158, - 95, 211, 243, 107, 126, 206, 91, 20, 26, 193, 183, 141, 224, 77, 35, 120, - 221, 112, 246, 154, 139, 223, 182, 215, 252, 65, 253, 73, 105, 210, 51, 116, - 185, 73, 151, 245, 7, 245, 121, 99, 127, 159, 59, 105, 35, 74, 27, 165, - 199, 199, 190, 93, 48, 205, 51, 250, 237, 64, 104, 173, 235, 167, 203, 246, - 218, 129, 172, 190, 58, 64, 23, 132, 8, 222, 6, 117, 128, 250, 210, 39, - 214, 55, 212, 188, 111, 152, 30, 100, 152, 251, 147, 95, 120, 118, 254, 113, - 163, 76, 62, 162, 65, 134, 111, 104, 124, 225, 19, 26, 90, 248, 130, 70, - 85, 14, 145, 34, 119, 88, 198, 206, 176, 140, 157, 97, 25, 59, 195, 210, - 229, 158, 53, 197, 98, 69, 49, 26, 97, 135, 246, 120, 115, 130, 255, 130, - 149, 41, 60, 138, 189, 59, 98, 143, 248, 23, 14, 118, 74, 19, 103, 210, - 164, 235, 243, 223, 48, 33, 26, 251, 39, 132, 147, 54, 166, 180, 113, 122, - 242, 236, 99, 91, 254, 176, 201, 19, 59, 147, 71, 106, 128, 136, 88, 102, - 149, 4, 56, 179, 234, 92, 207, 170, 243, 244, 172, 106, 170, 89, 213, 252, - 111, 157, 85, 95, 240, 129, 180, 45, 49, 13, 155, 206, 52, 108, 58, 211, - 176, 233, 76, 195, 102, 206, 52, 108, 154, 105, 72, 148, 243, 15, 113, 113, - 95, 58, 19, 249, 255, 196, 1, 244, 151, 153, 115, 8, 76, 28, 49, 127, - 233, 229, 197, 32, 232, 151, 169, 19, 163, 78, 202, 124, 18, 44, 120, 218, - 203, 226, 62, 48, 83, 235, 54, 70, 97, 39, 172, 25, 67, 100, 195, 191, - 91, 254, 29, 45, 110, 180, 33, 11, 61, 172, 173, 62, 99, 174, 81, 251, - 122, 19, 172, 183, 193, 102, 235, 58, 164, 73, 0, 71, 90, 156, 145, 244, - 61, 124, 221, 75, 215, 198, 40, 115, 180, 26, 207, 69, 157, 67, 61, 196, - 250, 161, 233, 250, 237, 253, 146, 122, 36, 33, 12, 141, 130, 218, 126, 80, - 95, 191, 223, 121, 236, 239, 160, 61, 5, 189, 162, 71, 220, 105, 15, 230, - 61, 226, 32, 222, 251, 69, 232, 154, 132, 149, 135, 128, 205, 1, 55, 121, - 41, 24, 106, 173, 50, 4, 74, 213, 206, 219, 230, 165, 136, 41, 69, 92, - 233, 67, 115, 98, 231, 85, 161, 10, 229, 51, 102, 27, 59, 149, 124, 96, - 135, 164, 22, 11, 215, 171, 106, 165, 176, 186, 104, 60, 217, 43, 244, 237, - 102, 221, 243, 4, 40, 147, 141, 8, 99, 202, 209, 159, 107, 45, 57, 199, - 221, 104, 16, 39, 48, 57, 53, 214, 67, 10, 235, 12, 175, 117, 131, 130, - 205, 174, 53, 234, 130, 109, 86, 220, 178, 55, 12, 70, 19, 222, 4, 13, - 113, 141, 81, 92, 51, 120, 118, 213, 228, 7, 187, 8, 0, 214, 157, 43, - 205, 56, 193, 58, 46, 18, 173, 136, 24, 125, 220, 35, 66, 37, 64, 37, - 106, 42, 159, 26, 124, 79, 190, 199, 206, 194, 1, 172, 244, 31, 70, 253, - 229, 48, 16, 168, 145, 28, 133, 25, 73, 249, 101, 234, 79, 69, 167, 0, - 220, 108, 195, 3, 219, 113, 26, 74, 57, 64, 154, 82, 149, 201, 224, 193, - 169, 142, 170, 3, 87, 93, 227, 75, 27, 176, 148, 99, 61, 71, 27, 144, - 204, 199, 26, 187, 155, 191, 116, 254, 70, 248, 75, 49, 79, 69, 100, 194, - 107, 123, 34, 24, 245, 82, 191, 52, 13, 148, 230, 123, 47, 86, 144, 153, - 120, 18, 120, 76, 60, 9, 20, 38, 158, 24, 246, 18, 202, 112, 161, 1, - 252, 243, 13, 224, 159, 131, 57, 230, 40, 247, 8, 141, 92, 141, 236, 95, - 86, 221, 254, 156, 225, 28, 242, 45, 206, 3, 218, 26, 104, 103, 216, 70, - 1, 45, 249, 180, 226, 111, 227, 236, 72, 176, 121, 28, 165, 63, 149, 40, - 50, 1, 225, 228, 60, 165, 222, 173, 210, 85, 202, 102, 70, 166, 82, 156, - 123, 241, 27, 52, 234, 109, 215, 6, 75, 89, 70, 70, 94, 178, 209, 89, - 93, 43, 167, 65, 86, 225, 170, 102, 252, 216, 226, 241, 140, 245, 6, 46, - 240, 104, 149, 27, 28, 203, 246, 139, 227, 148, 178, 154, 74, 41, 43, 164, - 21, 172, 25, 104, 19, 208, 61, 186, 89, 182, 90, 174, 130, 22, 20, 119, - 167, 98, 183, 59, 185, 85, 154, 64, 89, 203, 28, 73, 149, 82, 115, 242, - 71, 19, 255, 138, 138, 184, 254, 16, 39, 20, 220, 116, 142, 214, 202, 109, - 33, 186, 39, 142, 129, 21, 131, 252, 219, 162, 181, 222, 96, 152, 99, 198, - 145, 91, 118, 96, 32, 60, 149, 26, 188, 242, 88, 163, 48, 209, 235, 173, - 157, 245, 157, 8, 189, 139, 241, 213, 181, 247, 54, 105, 24, 110, 149, 144, - 130, 226, 91, 250, 31, 216, 151, 197, 183, 70, 181, 25, 214, 209, 20, 46, - 211, 193, 60, 110, 146, 30, 144, 85, 168, 204, 29, 157, 218, 115, 28, 30, - 211, 58, 105, 58, 64, 26, 242, 222, 209, 61, 115, 167, 210, 252, 62, 161, - 181, 49, 31, 176, 91, 217, 140, 141, 154, 9, 79, 25, 166, 189, 147, 112, - 171, 76, 224, 139, 243, 112, 229, 1, 253, 104, 253, 11, 84, 35, 105, 179, - 152, 4, 68, 114, 13, 209, 170, 166, 50, 186, 114, 201, 38, 168, 153, 150, - 110, 129, 10, 166, 192, 85, 112, 31, 60, 4, 50, 85, 82, 205, 225, 68, - 185, 54, 151, 93, 81, 84, 183, 11, 69, 119, 61, 202, 224, 164, 169, 233, - 71, 35, 20, 24, 51, 229, 188, 134, 30, 106, 231, 151, 25, 220, 101, 204, - 235, 56, 153, 118, 7, 235, 52, 50, 189, 248, 209, 137, 73, 39, 213, 186, - 80, 233, 118, 160, 109, 216, 133, 18, 13, 74, 218, 148, 218, 194, 148, 203, - 239, 108, 208, 69, 78, 24, 192, 79, 221, 138, 102, 23, 178, 116, 221, 20, - 229, 185, 78, 118, 101, 83, 142, 104, 5, 211, 167, 233, 96, 250, 196, 202, - 154, 232, 177, 64, 25, 49, 140, 71, 115, 87, 46, 56, 86, 62, 58, 127, - 119, 61, 90, 140, 6, 243, 217, 104, 66, 204, 165, 6, 114, 234, 173, 230, - 208, 246, 189, 25, 211, 96, 27, 179, 5, 161, 112, 22, 55, 249, 172, 69, - 223, 255, 209, 100, 161, 183, 172, 132, 46, 144, 91, 0, 251, 48, 63, 158, - 141, 72, 85, 206, 226, 98, 52, 93, 144, 182, 72, 212, 155, 129, 213, 230, - 213, 50, 68, 205, 214, 14, 147, 147, 168, 54, 31, 12, 24, 246, 194, 229, - 64, 162, 4, 7, 18, 59, 112, 108, 55, 137, 186, 40, 126, 32, 112, 254, - 198, 252, 247, 112, 112, 42, 180, 150, 27, 204, 200, 46, 242, 88, 100, 111, - 136, 162, 59, 106, 122, 209, 86, 68, 250, 49, 89, 179, 23, 106, 77, 110, - 191, 132, 69, 206, 241, 188, 19, 244, 254, 163, 203, 34, 248, 151, 98, 243, - 18, 54, 121, 112, 112, 80, 60, 187, 44, 158, 95, 22, 47, 56, 65, 227, - 146, 117, 240, 194, 136, 223, 98, 122, 162, 132, 97, 235, 159, 196, 7, 209, - 169, 110, 185, 154, 79, 176, 162, 39, 91, 104, 116, 23, 137, 75, 43, 1, - 236, 180, 89, 102, 242, 149, 138, 81, 181, 216, 210, 207, 113, 149, 118, 126, - 60, 155, 84, 213, 226, 89, 149, 26, 81, 62, 109, 154, 196, 213, 226, 57, - 5, 133, 58, 8, 223, 84, 139, 23, 85, 240, 6, 8, 210, 159, 226, 35, - 83, 2, 146, 155, 34, 194, 40, 81, 70, 24, 187, 9, 155, 110, 194, 150, - 78, 72, 93, 3, 43, 160, 212, 120, 58, 170, 33, 154, 163, 145, 242, 208, - 32, 157, 8, 45, 209, 207, 104, 194, 31, 210, 242, 166, 219, 160, 150, 219, - 160, 246, 177, 13, 250, 237, 37, 63, 213, 52, 205, 210, 201, 7, 103, 110, - 39, 157, 187, 157, 116, 145, 236, 164, 51, 183, 77, 231, 110, 155, 46, 142, - 108, 211, 209, 131, 225, 183, 54, 254, 184, 182, 184, 230, 161, 82, 98, 195, - 109, 90, 24, 186, 109, 11, 163, 99, 27, 119, 196, 0, 62, 122, 96, 28, - 77, 237, 47, 168, 60, 76, 96, 41, 142, 254, 181, 156, 166, 232, 173, 44, - 129, 36, 241, 78, 214, 15, 45, 174, 193, 97, 219, 128, 44, 48, 54, 89, - 119, 145, 231, 1, 183, 238, 45, 52, 74, 3, 214, 126, 22, 62, 212, 253, - 243, 224, 241, 188, 26, 87, 24, 108, 65, 107, 171, 187, 32, 11, 117, 127, - 29, 196, 222, 138, 54, 6, 139, 167, 80, 179, 32, 11, 242, 215, 51, 32, - 146, 238, 6, 252, 153, 170, 176, 84, 188, 203, 141, 200, 128, 130, 27, 198, - 67, 185, 89, 110, 102, 3, 136, 152, 58, 11, 58, 76, 204, 7, 162, 131, - 219, 31, 117, 239, 166, 147, 190, 232, 224, 42, 126, 159, 1, 83, 128, 216, - 7, 195, 90, 157, 163, 133, 88, 149, 220, 204, 235, 104, 161, 66, 12, 242, - 74, 142, 28, 235, 205, 106, 52, 22, 15, 185, 156, 93, 119, 236, 47, 150, - 243, 85, 143, 129, 220, 92, 51, 239, 200, 192, 52, 178, 83, 221, 133, 63, - 158, 246, 216, 230, 150, 88, 167, 189, 214, 186, 39, 210, 206, 132, 154, 49, - 237, 238, 183, 155, 197, 112, 112, 207, 173, 188, 235, 78, 134, 221, 229, 146, - 162, 209, 204, 193, 138, 190, 235, 15, 232, 109, 31, 202, 203, 194, 100, 42, - 112, 92, 183, 196, 35, 46, 132, 128, 140, 7, 155, 38, 138, 1, 134, 77, - 208, 166, 67, 167, 166, 132, 113, 22, 183, 233, 166, 183, 154, 141, 224, 23, - 20, 160, 112, 182, 187, 2, 47, 209, 119, 25, 107, 219, 104, 151, 163, 166, - 156, 180, 187, 141, 141, 209, 173, 117, 192, 16, 23, 50, 232, 179, 84, 43, - 177, 181, 117, 228, 123, 199, 246, 79, 18, 40, 222, 154, 194, 210, 54, 106, - 40, 30, 24, 106, 7, 134, 210, 187, 130, 175, 6, 99, 194, 16, 150, 182, - 94, 53, 24, 3, 61, 16, 3, 53, 8, 3, 12, 64, 250, 140, 73, 31, - 152, 129, 157, 134, 188, 21, 168, 31, 19, 216, 244, 247, 216, 20, 104, 147, - 127, 191, 225, 85, 225, 80, 154, 109, 141, 216, 89, 23, 140, 93, 11, 165, - 209, 171, 127, 148, 106, 97, 249, 79, 127, 194, 67, 88, 46, 251, 191, 254, - 234, 115, 32, 24, 76, 21, 140, 139, 122, 27, 81, 11, 109, 76, 152, 142, - 177, 17, 148, 166, 92, 96, 9, 93, 76, 253, 45, 194, 67, 192, 129, 54, - 252, 164, 233, 61, 177, 79, 34, 171, 163, 116, 218, 176, 77, 97, 197, 16, - 211, 82, 185, 106, 128, 149, 117, 109, 154, 216, 140, 82, 76, 98, 97, 76, - 41, 174, 101, 39, 157, 199, 16, 88, 178, 28, 51, 241, 148, 221, 68, 113, - 162, 151, 150, 185, 50, 172, 116, 2, 154, 137, 20, 194, 240, 69, 29, 58, - 201, 163, 61, 133, 18, 158, 105, 16, 209, 112, 162, 3, 62, 5, 211, 225, - 187, 3, 83, 205, 199, 102, 165, 8, 87, 64, 200, 144, 74, 161, 195, 80, - 117, 203, 18, 203, 80, 192, 245, 97, 197, 203, 38, 188, 85, 148, 64, 235, - 32, 45, 106, 140, 178, 86, 75, 224, 155, 85, 241, 61, 5, 94, 181, 2, - 109, 63, 220, 194, 233, 28, 210, 245, 107, 70, 92, 231, 138, 53, 217, 38, - 185, 9, 63, 159, 140, 144, 230, 254, 206, 239, 217, 170, 72, 44, 122, 90, - 218, 12, 246, 158, 150, 85, 101, 63, 132, 38, 132, 249, 205, 9, 159, 108, - 78, 99, 79, 115, 224, 95, 132, 165, 183, 20, 17, 75, 196, 63, 185, 9, - 81, 126, 19, 34, 211, 132, 136, 155, 80, 221, 42, 103, 138, 186, 226, 213, - 234, 149, 200, 60, 106, 248, 27, 113, 13, 149, 12, 36, 85, 197, 22, 87, - 49, 50, 85, 140, 197, 129, 56, 213, 169, 153, 168, 19, 13, 72, 150, 146, - 48, 50, 15, 13, 64, 49, 151, 158, 241, 201, 235, 227, 72, 134, 47, 204, - 50, 211, 118, 85, 70, 240, 172, 194, 49, 110, 97, 173, 189, 7, 132, 212, - 49, 71, 114, 220, 207, 195, 217, 50, 31, 36, 111, 187, 189, 207, 159, 248, - 80, 251, 206, 125, 249, 214, 125, 121, 227, 190, 188, 166, 108, 174, 236, 235, - 13, 47, 102, 215, 129, 202, 208, 130, 63, 116, 63, 15, 176, 17, 233, 226, - 159, 150, 191, 0, 87, 136, 157, 64, 159, 64, 56, 209, 96, 36, 81, 49, - 235, 215, 139, 39, 22, 179, 218, 162, 215, 29, 39, 128, 74, 115, 13, 130, - 53, 230, 12, 59, 149, 214, 251, 74, 182, 218, 157, 146, 2, 43, 45, 239, - 5, 30, 138, 44, 76, 156, 133, 136, 75, 218, 120, 193, 52, 140, 221, 136, - 183, 155, 65, 28, 125, 81, 62, 221, 187, 25, 181, 239, 235, 52, 178, 41, - 141, 68, 100, 234, 37, 58, 207, 88, 22, 227, 116, 13, 41, 161, 115, 255, - 20, 42, 20, 202, 66, 65, 86, 173, 71, 218, 244, 164, 141, 55, 48, 157, - 41, 134, 133, 157, 181, 186, 225, 190, 17, 24, 7, 93, 64, 241, 235, 148, - 225, 141, 218, 156, 64, 63, 141, 184, 166, 142, 226, 150, 136, 202, 111, 168, - 57, 148, 207, 186, 139, 5, 229, 217, 48, 206, 207, 234, 106, 226, 141, 22, - 212, 57, 37, 190, 57, 250, 227, 43, 33, 120, 237, 212, 120, 32, 177, 171, - 154, 148, 212, 43, 251, 163, 232, 9, 118, 11, 142, 238, 110, 197, 22, 131, - 63, 170, 50, 106, 12, 57, 149, 178, 98, 108, 54, 245, 143, 35, 25, 26, - 65, 40, 190, 233, 47, 218, 166, 74, 18, 207, 94, 38, 181, 123, 145, 103, - 64, 143, 168, 243, 150, 203, 136, 11, 178, 116, 61, 235, 52, 118, 112, 68, - 139, 225, 49, 145, 63, 21, 249, 243, 24, 87, 128, 53, 240, 0, 100, 231, - 98, 68, 135, 22, 44, 7, 248, 104, 241, 42, 222, 121, 137, 27, 53, 108, - 86, 255, 192, 174, 72, 223, 5, 45, 10, 195, 63, 8, 122, 197, 39, 77, - 183, 142, 45, 127, 76, 155, 169, 34, 147, 184, 179, 13, 213, 255, 106, 43, - 229, 237, 148, 166, 229, 196, 92, 133, 117, 199, 179, 97, 87, 72, 250, 15, - 113, 115, 155, 206, 159, 133, 192, 188, 190, 210, 39, 147, 157, 44, 91, 206, - 122, 5, 191, 151, 206, 154, 149, 68, 78, 134, 44, 48, 139, 7, 168, 66, - 41, 76, 99, 105, 229, 0, 149, 49, 146, 48, 3, 112, 75, 103, 226, 163, - 213, 184, 59, 151, 136, 28, 153, 232, 98, 124, 24, 169, 76, 64, 167, 96, - 69, 154, 6, 159, 108, 212, 99, 220, 151, 208, 63, 88, 141, 70, 229, 47, - 198, 157, 204, 67, 184, 211, 141, 220, 3, 70, 185, 23, 1, 121, 177, 200, - 80, 112, 145, 75, 193, 197, 83, 20, 164, 61, 122, 50, 250, 34, 10, 46, - 142, 163, 224, 249, 191, 140, 128, 139, 223, 66, 64, 235, 31, 106, 222, 237, - 143, 86, 11, 70, 180, 48, 162, 216, 69, 150, 88, 70, 188, 169, 124, 66, - 253, 118, 84, 139, 23, 12, 90, 97, 203, 162, 227, 82, 174, 41, 231, 177, - 50, 91, 167, 69, 64, 181, 20, 78, 128, 74, 232, 110, 71, 119, 171, 229, - 144, 125, 120, 209, 235, 118, 48, 25, 169, 55, 105, 242, 205, 199, 213, 132, - 53, 19, 74, 179, 225, 40, 160, 3, 250, 178, 187, 175, 185, 200, 215, 108, - 211, 191, 11, 206, 195, 84, 164, 99, 106, 8, 144, 56, 229, 244, 43, 89, - 175, 78, 1, 14, 79, 194, 42, 177, 253, 21, 65, 140, 160, 138, 10, 158, - 91, 179, 34, 245, 45, 23, 178, 180, 83, 68, 104, 55, 211, 212, 243, 146, - 52, 114, 60, 7, 0, 156, 205, 58, 6, 43, 134, 236, 24, 204, 160, 201, - 209, 65, 255, 201, 122, 236, 114, 176, 217, 210, 164, 211, 244, 74, 2, 124, - 176, 239, 48, 87, 10, 174, 155, 239, 159, 20, 105, 100, 168, 43, 121, 23, - 80, 128, 232, 59, 9, 221, 171, 62, 127, 18, 153, 87, 176, 186, 197, 9, - 59, 197, 136, 4, 223, 56, 14, 10, 84, 95, 191, 227, 3, 157, 185, 82, - 90, 163, 29, 229, 211, 135, 203, 247, 30, 215, 157, 34, 106, 179, 209, 105, - 84, 69, 228, 70, 34, 135, 20, 217, 131, 13, 11, 154, 139, 198, 210, 251, - 2, 239, 104, 179, 122, 239, 45, 85, 188, 80, 128, 66, 192, 2, 84, 52, - 22, 92, 111, 89, 233, 205, 12, 28, 28, 189, 45, 102, 1, 190, 86, 244, - 162, 243, 94, 6, 146, 205, 106, 145, 108, 214, 219, 158, 128, 68, 176, 108, - 158, 74, 236, 52, 46, 249, 203, 14, 215, 245, 146, 93, 3, 102, 226, 56, - 10, 14, 2, 93, 240, 31, 246, 174, 54, 220, 129, 106, 134, 46, 140, 253, - 208, 12, 10, 147, 117, 135, 232, 17, 150, 159, 63, 92, 78, 54, 29, 106, - 125, 88, 190, 140, 170, 186, 9, 235, 234, 166, 82, 160, 111, 10, 166, 25, - 147, 116, 80, 132, 160, 137, 14, 179, 143, 201, 6, 54, 115, 27, 152, 66, - 126, 104, 186, 23, 175, 56, 126, 42, 80, 110, 229, 84, 75, 222, 78, 54, - 39, 234, 220, 241, 156, 50, 167, 86, 185, 9, 67, 95, 65, 71, 120, 85, - 58, 33, 5, 64, 17, 141, 248, 216, 36, 207, 85, 157, 61, 252, 165, 220, - 215, 232, 187, 157, 123, 202, 148, 19, 12, 227, 78, 176, 195, 149, 97, 85, - 124, 43, 84, 33, 97, 27, 238, 128, 96, 164, 210, 58, 87, 6, 130, 109, - 225, 184, 158, 99, 192, 109, 60, 186, 96, 219, 174, 75, 48, 219, 49, 41, - 204, 109, 118, 85, 111, 167, 140, 70, 48, 196, 36, 184, 46, 56, 215, 200, - 240, 110, 110, 240, 255, 161, 34, 182, 225, 223, 45, 255, 174, 248, 247, 158, - 127, 31, 248, 119, 29, 114, 26, 254, 221, 242, 239, 138, 127, 239, 249, 247, - 129, 127, 177, 60, 106, 71, 53, 175, 58, 81, 222, 34, 200, 72, 253, 191, - 105, 185, 211, 25, 179, 143, 148, 61, 80, 185, 166, 77, 143, 43, 0, 228, - 30, 255, 15, 110, 168, 246, 98, 230, 40, 199, 238, 9, 64, 0, 217, 82, - 213, 93, 174, 67, 74, 115, 211, 23, 139, 27, 21, 162, 66, 174, 26, 145, - 162, 4, 11, 186, 180, 227, 2, 255, 74, 28, 23, 48, 116, 5, 5, 158, - 213, 46, 36, 16, 200, 142, 17, 5, 43, 77, 134, 216, 120, 3, 202, 91, - 213, 180, 99, 81, 92, 116, 61, 210, 15, 99, 213, 131, 135, 86, 80, 86, - 0, 134, 15, 21, 34, 188, 14, 132, 184, 232, 23, 10, 169, 26, 144, 24, - 123, 14, 247, 170, 149, 58, 141, 158, 8, 55, 56, 0, 129, 47, 21, 207, - 161, 141, 18, 149, 203, 181, 168, 82, 42, 182, 88, 53, 5, 160, 240, 16, - 169, 195, 145, 30, 189, 84, 35, 164, 139, 16, 117, 78, 107, 250, 137, 32, - 169, 173, 1, 105, 193, 142, 121, 32, 155, 57, 129, 78, 91, 91, 101, 201, - 10, 46, 177, 202, 146, 21, 95, 194, 72, 178, 108, 115, 150, 145, 202, 146, - 213, 99, 46, 114, 178, 100, 168, 253, 19, 108, 2, 77, 149, 229, 25, 231, - 162, 178, 108, 138, 2, 141, 100, 217, 228, 44, 27, 42, 203, 144, 213, 108, - 84, 150, 245, 68, 166, 118, 86, 51, 188, 62, 211, 50, 208, 232, 250, 64, - 218, 65, 16, 223, 131, 10, 153, 5, 19, 167, 94, 87, 52, 85, 64, 59, - 206, 114, 164, 96, 244, 145, 58, 133, 162, 111, 243, 102, 212, 24, 90, 126, - 154, 65, 173, 157, 0, 142, 113, 166, 110, 138, 107, 29, 143, 178, 30, 83, - 84, 40, 120, 152, 207, 131, 193, 236, 102, 49, 236, 206, 7, 253, 27, 24, - 174, 90, 153, 121, 154, 145, 197, 55, 249, 0, 224, 19, 42, 169, 237, 127, - 164, 137, 6, 49, 173, 216, 115, 46, 252, 23, 230, 211, 71, 218, 117, 187, - 253, 193, 60, 224, 155, 138, 69, 96, 134, 104, 224, 76, 155, 64, 230, 216, - 66, 59, 19, 27, 13, 22, 174, 88, 220, 242, 198, 105, 104, 143, 159, 166, - 52, 203, 123, 243, 1, 52, 61, 148, 31, 21, 205, 10, 192, 193, 40, 237, - 249, 20, 186, 24, 80, 13, 21, 22, 84, 119, 60, 157, 124, 226, 164, 155, - 26, 180, 16, 246, 179, 144, 25, 226, 36, 197, 232, 106, 238, 179, 87, 21, - 161, 168, 161, 175, 248, 49, 219, 143, 85, 165, 171, 178, 144, 249, 142, 228, - 9, 57, 78, 50, 153, 232, 70, 224, 132, 104, 229, 199, 84, 41, 255, 174, - 59, 161, 248, 132, 98, 130, 133, 178, 50, 149, 48, 94, 213, 246, 131, 79, - 37, 235, 241, 20, 240, 20, 218, 106, 124, 174, 9, 130, 222, 147, 55, 242, - 161, 241, 204, 29, 106, 215, 214, 198, 35, 118, 35, 88, 128, 227, 186, 210, - 7, 245, 103, 180, 231, 239, 252, 18, 45, 68, 6, 241, 230, 148, 165, 208, - 57, 254, 50, 31, 23, 194, 172, 209, 233, 248, 9, 79, 152, 170, 117, 60, - 236, 175, 228, 5, 174, 20, 249, 225, 102, 216, 93, 220, 48, 129, 111, 20, - 129, 115, 238, 142, 50, 157, 232, 170, 19, 1, 89, 85, 242, 82, 232, 93, - 73, 161, 220, 190, 98, 88, 80, 7, 161, 10, 245, 229, 231, 129, 189, 193, - 83, 209, 250, 86, 207, 20, 169, 138, 184, 165, 179, 145, 2, 86, 164, 113, - 48, 233, 109, 232, 243, 197, 231, 3, 174, 2, 40, 54, 167, 141, 249, 56, - 250, 74, 212, 150, 227, 145, 145, 55, 54, 226, 249, 141, 64, 196, 255, 212, - 93, 45, 22, 163, 238, 68, 249, 117, 120, 78, 39, 203, 231, 64, 19, 147, - 227, 163, 154, 128, 122, 141, 235, 97, 158, 168, 78, 48, 34, 58, 13, 79, - 203, 194, 19, 156, 185, 60, 183, 163, 244, 150, 233, 138, 226, 88, 27, 219, - 113, 136, 183, 59, 110, 88, 43, 220, 183, 192, 95, 45, 112, 113, 170, 40, - 89, 164, 61, 79, 163, 227, 60, 2, 17, 149, 150, 108, 76, 55, 254, 153, - 174, 150, 128, 112, 101, 162, 213, 20, 209, 202, 25, 183, 122, 24, 179, 207, - 30, 139, 175, 130, 17, 45, 252, 103, 229, 29, 0, 1, 39, 203, 209, 4, - 46, 54, 71, 158, 150, 232, 73, 178, 7, 163, 81, 8, 166, 81, 164, 83, - 52, 179, 120, 130, 61, 178, 80, 167, 158, 248, 218, 72, 176, 20, 201, 222, - 170, 123, 21, 159, 37, 237, 197, 183, 44, 25, 210, 22, 0, 130, 53, 165, - 253, 245, 189, 149, 93, 71, 93, 180, 188, 117, 247, 29, 10, 99, 17, 103, - 36, 50, 46, 224, 157, 241, 73, 32, 161, 138, 40, 83, 46, 215, 157, 158, - 76, 211, 183, 175, 168, 27, 148, 167, 218, 183, 121, 126, 106, 33, 101, 135, - 64, 11, 30, 141, 131, 218, 35, 92, 193, 56, 185, 102, 102, 50, 141, 146, - 197, 206, 205, 91, 241, 238, 135, 242, 255, 125, 181, 211, 21, 220, 183, 172, - 168, 203, 144, 227, 51, 116, 212, 55, 245, 221, 68, 254, 141, 194, 178, 59, - 55, 50, 132, 91, 154, 199, 192, 178, 125, 69, 153, 188, 236, 220, 44, 135, - 163, 222, 103, 72, 139, 94, 118, 114, 124, 109, 225, 203, 223, 47, 30, 208, - 69, 118, 90, 74, 42, 96, 10, 237, 52, 234, 113, 146, 133, 86, 117, 13, - 142, 211, 109, 211, 13, 115, 14, 254, 173, 132, 195, 192, 248, 124, 231, 92, - 11, 135, 121, 71, 122, 202, 195, 106, 230, 234, 170, 114, 61, 77, 53, 173, - 34, 61, 205, 136, 168, 130, 5, 33, 135, 209, 165, 176, 226, 219, 42, 188, - 64, 191, 45, 19, 35, 204, 199, 90, 234, 219, 184, 194, 15, 198, 243, 17, - 146, 152, 233, 241, 192, 40, 188, 226, 138, 91, 188, 112, 139, 207, 109, 135, - 83, 195, 53, 43, 35, 185, 69, 101, 139, 156, 168, 46, 185, 148, 22, 133, - 206, 177, 225, 149, 212, 164, 106, 92, 198, 162, 33, 108, 167, 38, 128, 4, - 147, 19, 179, 238, 119, 56, 27, 129, 198, 221, 163, 25, 140, 113, 217, 14, - 212, 65, 210, 242, 128, 86, 35, 18, 4, 116, 149, 130, 23, 75, 226, 142, - 238, 236, 137, 142, 15, 107, 124, 86, 227, 131, 217, 247, 124, 139, 213, 31, - 227, 82, 139, 157, 227, 204, 166, 99, 214, 168, 20, 195, 160, 110, 239, 243, - 67, 119, 222, 119, 65, 206, 41, 88, 244, 130, 7, 253, 4, 191, 104, 93, - 27, 3, 182, 126, 251, 71, 102, 189, 199, 201, 177, 109, 218, 34, 229, 101, - 83, 216, 80, 154, 148, 131, 113, 255, 40, 183, 198, 39, 137, 10, 38, 148, - 56, 38, 3, 168, 6, 44, 217, 117, 208, 167, 193, 156, 85, 57, 194, 197, - 178, 54, 157, 247, 249, 45, 234, 68, 147, 190, 121, 139, 59, 205, 229, 80, - 189, 29, 82, 236, 232, 143, 89, 49, 35, 72, 149, 44, 154, 30, 46, 121, - 26, 198, 97, 131, 165, 77, 114, 235, 22, 109, 99, 249, 23, 107, 79, 159, - 172, 128, 204, 190, 62, 99, 189, 91, 137, 7, 64, 103, 56, 240, 229, 199, - 170, 68, 223, 137, 215, 152, 212, 3, 240, 101, 121, 200, 237, 61, 255, 26, - 161, 175, 195, 13, 239, 61, 11, 75, 133, 107, 201, 19, 202, 234, 54, 123, - 62, 65, 24, 133, 44, 215, 193, 13, 84, 123, 150, 25, 111, 68, 184, 245, - 206, 101, 196, 120, 217, 0, 203, 52, 157, 177, 223, 71, 86, 140, 178, 189, - 46, 204, 70, 111, 0, 187, 112, 53, 68, 114, 206, 24, 7, 164, 239, 232, - 184, 229, 166, 179, 76, 59, 33, 114, 36, 202, 142, 19, 34, 110, 136, 118, - 66, 68, 84, 149, 78, 57, 6, 133, 87, 19, 98, 54, 152, 171, 145, 26, - 103, 252, 7, 222, 189, 130, 184, 140, 254, 143, 130, 73, 218, 36, 38, 250, - 115, 226, 99, 241, 144, 39, 108, 170, 163, 20, 182, 183, 137, 57, 30, 1, - 239, 58, 236, 126, 118, 18, 42, 120, 255, 200, 108, 30, 147, 184, 147, 218, - 50, 146, 213, 14, 188, 76, 59, 92, 143, 178, 202, 27, 160, 218, 33, 176, - 61, 132, 89, 101, 33, 229, 168, 250, 60, 13, 245, 156, 219, 206, 124, 79, - 128, 119, 29, 117, 217, 88, 210, 52, 131, 219, 63, 160, 133, 194, 23, 224, - 191, 192, 243, 95, 157, 157, 174, 202, 253, 98, 98, 107, 185, 93, 104, 104, - 248, 15, 226, 254, 239, 67, 29, 138, 12, 70, 152, 248, 1, 192, 239, 140, - 57, 237, 241, 119, 234, 195, 58, 28, 3, 226, 87, 163, 217, 78, 244, 7, - 208, 252, 241, 172, 24, 208, 108, 107, 209, 255, 86, 63, 129, 110, 31, 187, - 91, 219, 114, 48, 89, 76, 231, 202, 176, 85, 95, 109, 240, 205, 50, 239, - 60, 172, 232, 198, 186, 134, 226, 159, 237, 85, 231, 109, 103, 48, 30, 143, - 102, 139, 233, 168, 143, 237, 70, 125, 114, 55, 154, 236, 115, 225, 44, 37, - 232, 125, 36, 185, 199, 164, 21, 0, 31, 134, 131, 9, 173, 104, 40, 244, - 132, 182, 60, 127, 180, 244, 63, 49, 34, 39, 22, 36, 91, 46, 39, 0, - 252, 85, 143, 47, 40, 14, 77, 67, 183, 69, 10, 159, 157, 155, 20, 37, - 111, 115, 224, 159, 165, 81, 111, 36, 47, 84, 219, 112, 59, 30, 92, 4, - 133, 255, 4, 160, 25, 239, 200, 52, 50, 252, 171, 135, 96, 24, 244, 175, - 225, 62, 248, 63, 79, 59, 0, 140, 46, 253, 103, 249, 18, 152, 214, 165, - 255, 12, 254, 51, 136, 1, 177, 72, 108, 90, 101, 176, 25, 148, 226, 114, - 193, 33, 49, 76, 60, 93, 130, 187, 147, 88, 51, 117, 86, 11, 48, 74, - 107, 1, 194, 195, 39, 213, 113, 143, 131, 232, 20, 169, 75, 139, 114, 158, - 166, 159, 180, 215, 40, 15, 132, 74, 141, 175, 128, 19, 25, 159, 104, 252, - 149, 67, 104, 22, 29, 172, 88, 71, 246, 227, 8, 236, 55, 78, 115, 66, - 125, 80, 79, 101, 70, 196, 179, 10, 24, 121, 206, 200, 248, 128, 228, 218, - 213, 226, 167, 29, 20, 174, 70, 95, 201, 93, 190, 252, 165, 223, 235, 130, - 255, 89, 107, 108, 208, 87, 113, 238, 87, 239, 40, 245, 183, 252, 197, 27, - 249, 62, 245, 85, 243, 137, 175, 94, 231, 126, 117, 145, 247, 213, 119, 157, - 239, 190, 106, 92, 94, 125, 7, 93, 130, 239, 112, 220, 254, 238, 42, 194, - 79, 19, 63, 45, 252, 156, 95, 75, 62, 90, 223, 225, 89, 167, 189, 19, - 108, 97, 40, 118, 52, 175, 243, 17, 134, 79, 10, 116, 88, 45, 156, 248, - 67, 108, 40, 19, 226, 139, 104, 196, 98, 96, 51, 208, 62, 118, 219, 229, - 124, 117, 215, 41, 208, 41, 170, 64, 11, 43, 159, 140, 146, 117, 11, 163, - 160, 224, 253, 68, 227, 242, 187, 210, 87, 48, 105, 255, 129, 49, 247, 126, - 66, 61, 233, 55, 228, 223, 200, 121, 142, 249, 183, 233, 132, 203, 51, 157, - 122, 175, 47, 225, 80, 131, 190, 167, 223, 210, 15, 48, 143, 255, 232, 151, - 250, 131, 101, 137, 222, 175, 226, 224, 226, 186, 252, 146, 166, 34, 191, 92, - 87, 58, 181, 240, 146, 159, 155, 206, 115, 139, 159, 203, 156, 15, 56, 153, - 14, 124, 140, 211, 58, 46, 175, 42, 60, 76, 134, 135, 58, 60, 74, 134, - 71, 42, 188, 224, 125, 22, 247, 29, 145, 195, 26, 192, 40, 166, 198, 78, - 5, 22, 246, 230, 128, 136, 243, 54, 248, 107, 231, 241, 10, 106, 216, 193, - 232, 234, 236, 250, 122, 7, 74, 242, 133, 26, 187, 29, 96, 79, 72, 245, - 53, 92, 121, 12, 251, 208, 12, 255, 136, 90, 106, 248, 93, 192, 200, 21, - 138, 111, 11, 151, 234, 253, 175, 252, 254, 87, 243, 78, 89, 113, 8, 253, - 45, 104, 82, 125, 167, 35, 251, 124, 223, 184, 29, 128, 88, 32, 221, 4, - 1, 33, 173, 0, 144, 115, 63, 64, 1, 143, 22, 181, 202, 246, 210, 251, - 94, 8, 124, 69, 252, 229, 181, 144, 24, 109, 254, 190, 140, 59, 60, 0, - 18, 0, 208, 176, 125, 45, 64, 29, 120, 62, 195, 115, 195, 162, 24, 32, - 44, 12, 4, 43, 29, 29, 126, 83, 2, 17, 202, 129, 247, 125, 165, 3, - 228, 224, 239, 45, 225, 105, 75, 254, 94, 232, 254, 189, 165, 58, 7, 134, - 18, 24, 37, 2, 153, 226, 239, 84, 245, 208, 223, 151, 158, 241, 64, 185, - 65, 243, 216, 203, 122, 137, 11, 168, 249, 156, 201, 135, 8, 112, 173, 156, - 59, 66, 34, 27, 18, 73, 72, 227, 154, 93, 177, 151, 162, 10, 127, 199, - 177, 72, 174, 30, 34, 122, 40, 151, 1, 104, 72, 28, 103, 199, 135, 67, - 121, 105, 97, 35, 16, 97, 0, 109, 141, 21, 62, 173, 169, 52, 149, 142, - 18, 162, 149, 190, 15, 248, 15, 5, 150, 97, 246, 103, 242, 192, 242, 75, - 79, 193, 59, 6, 182, 66, 88, 213, 124, 163, 214, 238, 204, 151, 253, 121, - 247, 65, 202, 197, 151, 182, 108, 155, 78, 106, 64, 172, 38, 224, 57, 122, - 171, 101, 41, 106, 181, 42, 150, 58, 21, 220, 185, 95, 249, 239, 48, 237, - 222, 97, 166, 189, 3, 1, 174, 177, 3, 148, 194, 154, 77, 87, 174, 192, - 10, 152, 241, 19, 36, 59, 223, 212, 13, 121, 83, 99, 255, 170, 170, 36, - 163, 74, 0, 120, 49, 240, 106, 126, 179, 242, 87, 183, 166, 148, 158, 146, - 82, 2, 183, 174, 20, 168, 235, 10, 248, 143, 239, 10, 226, 157, 197, 223, - 167, 144, 9, 180, 234, 155, 164, 95, 5, 255, 166, 128, 208, 176, 16, 200, - 67, 84, 112, 93, 6, 102, 229, 40, 72, 227, 168, 49, 203, 94, 131, 109, - 122, 249, 48, 117, 206, 11, 116, 86, 26, 77, 62, 29, 242, 143, 197, 165, - 118, 84, 225, 216, 160, 185, 244, 142, 170, 132, 218, 166, 29, 247, 123, 41, - 255, 140, 153, 150, 20, 190, 61, 249, 225, 187, 111, 10, 65, 225, 221, 180, - 247, 121, 241, 172, 224, 229, 53, 214, 250, 224, 227, 114, 181, 223, 61, 46, - 147, 94, 148, 217, 96, 190, 255, 14, 105, 47, 183, 63, 225, 39, 81, 90, - 138, 123, 50, 85, 233, 34, 14, 162, 34, 94, 50, 213, 55, 27, 165, 215, - 240, 151, 117, 40, 254, 22, 184, 35, 91, 124, 87, 168, 3, 35, 55, 144, - 246, 87, 108, 39, 117, 220, 70, 175, 150, 83, 76, 22, 205, 152, 54, 188, - 193, 122, 70, 101, 221, 172, 55, 58, 40, 162, 163, 81, 127, 68, 39, 225, - 129, 9, 241, 18, 192, 23, 0, 186, 144, 8, 58, 53, 209, 34, 112, 67, - 107, 226, 206, 255, 147, 102, 160, 173, 104, 218, 56, 147, 130, 96, 177, 191, - 195, 186, 171, 152, 211, 185, 184, 77, 170, 211, 137, 250, 99, 105, 219, 233, - 140, 120, 77, 58, 241, 180, 62, 62, 235, 67, 243, 207, 71, 173, 20, 45, - 37, 158, 234, 7, 230, 187, 161, 192, 143, 138, 138, 138, 223, 35, 213, 162, - 211, 73, 38, 8, 131, 61, 213, 121, 216, 91, 157, 245, 111, 174, 206, 225, - 250, 104, 81, 102, 237, 87, 77, 169, 91, 86, 241, 79, 42, 255, 71, 173, - 231, 142, 223, 61, 163, 49, 144, 154, 44, 196, 49, 36, 231, 162, 28, 214, - 233, 33, 184, 249, 56, 157, 44, 149, 77, 45, 132, 62, 253, 193, 108, 57, - 76, 186, 239, 76, 205, 197, 174, 153, 141, 249, 94, 59, 17, 117, 96, 250, - 57, 229, 117, 90, 108, 19, 195, 69, 210, 169, 50, 103, 234, 213, 91, 153, - 201, 103, 102, 28, 159, 141, 223, 79, 224, 86, 126, 250, 105, 170, 230, 157, - 11, 81, 67, 231, 221, 88, 89, 228, 106, 71, 245, 245, 86, 206, 36, 115, - 219, 194, 147, 201, 250, 32, 42, 70, 129, 207, 213, 211, 86, 35, 238, 196, - 106, 42, 14, 52, 57, 177, 138, 145, 156, 137, 212, 204, 129, 15, 34, 156, - 172, 12, 35, 69, 25, 153, 57, 180, 173, 179, 175, 99, 238, 217, 102, 170, - 103, 155, 24, 130, 247, 217, 94, 69, 13, 147, 253, 153, 144, 206, 136, 95, - 0, 237, 243, 120, 153, 184, 147, 201, 234, 71, 179, 49, 64, 233, 217, 132, - 222, 249, 8, 176, 99, 91, 148, 66, 38, 105, 68, 73, 203, 246, 12, 240, - 147, 46, 36, 225, 182, 64, 36, 57, 226, 151, 0, 185, 91, 46, 255, 81, - 10, 136, 202, 59, 98, 238, 223, 139, 191, 58, 157, 208, 193, 251, 160, 114, - 40, 82, 157, 1, 222, 23, 222, 23, 236, 33, 32, 173, 109, 173, 237, 97, - 26, 190, 229, 247, 69, 159, 183, 46, 25, 36, 60, 117, 106, 229, 96, 91, - 13, 206, 40, 146, 164, 124, 17, 112, 227, 16, 206, 75, 78, 22, 21, 138, - 91, 72, 218, 16, 85, 66, 92, 69, 242, 43, 215, 127, 113, 109, 70, 169, - 165, 205, 94, 105, 87, 114, 174, 128, 8, 221, 201, 30, 224, 19, 35, 225, - 90, 166, 111, 209, 127, 230, 163, 171, 91, 133, 19, 56, 155, 156, 222, 141, - 150, 84, 102, 96, 20, 180, 255, 246, 119, 83, 138, 3, 187, 68, 41, 213, - 249, 220, 189, 141, 78, 223, 66, 218, 204, 59, 37, 90, 249, 6, 31, 71, - 147, 65, 191, 188, 199, 5, 100, 74, 93, 213, 161, 28, 139, 204, 248, 214, - 1, 247, 243, 120, 243, 146, 116, 253, 255, 7, 232, 17, 3, 180, 216, 224, - 113, 121, 147, 32, 157, 171, 65, 31, 237, 148, 254, 124, 228, 92, 64, 234, - 91, 76, 175, 106, 93, 225, 136, 180, 108, 120, 26, 151, 83, 150, 163, 236, - 53, 113, 194, 214, 75, 143, 109, 113, 241, 56, 81, 47, 236, 222, 209, 185, - 82, 129, 61, 79, 45, 98, 29, 247, 25, 174, 56, 225, 133, 143, 111, 219, - 96, 75, 52, 227, 167, 88, 63, 209, 31, 117, 199, 166, 220, 144, 0, 108, - 207, 160, 216, 9, 154, 185, 154, 89, 175, 24, 37, 48, 131, 224, 198, 151, - 118, 42, 137, 96, 187, 91, 240, 125, 198, 190, 99, 140, 111, 98, 44, 22, - 95, 181, 45, 178, 247, 65, 64, 112, 155, 248, 128, 231, 2, 85, 242, 195, - 87, 68, 0, 250, 135, 15, 156, 146, 179, 120, 180, 165, 175, 218, 229, 64, - 114, 86, 137, 228, 229, 82, 183, 143, 97, 208, 53, 200, 156, 13, 163, 131, - 109, 26, 65, 221, 130, 167, 51, 110, 122, 62, 100, 122, 24, 31, 1, 153, - 30, 198, 25, 200, 244, 248, 8, 2, 197, 135, 160, 207, 247, 160, 153, 251, - 10, 121, 178, 244, 213, 25, 125, 120, 143, 179, 129, 66, 158, 68, 72, 200, - 33, 226, 42, 131, 40, 101, 112, 19, 5, 169, 240, 219, 108, 48, 128, 25, - 223, 100, 131, 163, 114, 14, 32, 32, 50, 247, 15, 226, 239, 231, 225, 0, - 210, 216, 1, 172, 58, 22, 21, 64, 3, 151, 127, 107, 155, 50, 32, 157, - 10, 94, 83, 125, 20, 150, 13, 188, 166, 250, 8, 71, 39, 1, 35, 158, - 205, 196, 233, 192, 177, 240, 146, 126, 2, 204, 55, 57, 149, 116, 131, 98, - 213, 160, 139, 127, 109, 131, 50, 200, 164, 10, 64, 84, 125, 20, 149, 13, - 128, 168, 250, 40, 18, 42, 92, 8, 21, 218, 121, 84, 184, 176, 64, 143, - 105, 156, 77, 133, 64, 73, 4, 9, 27, 138, 34, 97, 99, 31, 73, 154, - 138, 36, 97, 244, 191, 128, 38, 105, 68, 87, 141, 178, 170, 62, 138, 203, - 6, 101, 85, 125, 20, 11, 33, 129, 32, 11, 74, 158, 231, 206, 144, 200, - 197, 204, 220, 71, 77, 13, 65, 10, 170, 106, 47, 18, 97, 156, 71, 213, - 125, 96, 231, 255, 58, 82, 206, 100, 162, 3, 240, 180, 218, 161, 28, 20, - 170, 52, 21, 71, 175, 27, 121, 253, 39, 45, 55, 45, 75, 75, 217, 143, - 246, 163, 148, 231, 47, 60, 191, 17, 102, 212, 194, 135, 222, 221, 235, 75, - 156, 216, 168, 42, 193, 49, 35, 152, 133, 238, 85, 3, 73, 54, 9, 107, - 51, 125, 142, 84, 156, 173, 98, 215, 204, 53, 76, 168, 47, 87, 162, 140, - 119, 219, 240, 85, 54, 44, 122, 149, 163, 18, 206, 153, 254, 78, 109, 23, - 85, 27, 185, 60, 81, 53, 130, 26, 10, 223, 97, 166, 234, 5, 39, 182, - 185, 30, 111, 35, 154, 10, 123, 116, 229, 112, 9, 118, 132, 98, 140, 165, - 79, 202, 187, 109, 164, 189, 219, 134, 17, 189, 100, 189, 219, 82, 85, 243, - 14, 153, 200, 206, 185, 19, 25, 37, 140, 92, 82, 214, 47, 184, 226, 212, - 247, 155, 108, 118, 80, 36, 94, 170, 9, 39, 220, 34, 143, 125, 18, 33, - 144, 109, 11, 30, 139, 205, 10, 110, 32, 113, 39, 168, 46, 56, 171, 155, - 58, 140, 183, 69, 77, 75, 220, 230, 202, 181, 160, 50, 89, 23, 204, 39, - 72, 172, 97, 166, 193, 14, 117, 205, 101, 40, 235, 203, 80, 24, 98, 113, - 169, 105, 148, 4, 167, 139, 43, 232, 55, 199, 215, 144, 244, 136, 158, 57, - 110, 104, 99, 81, 227, 38, 38, 182, 202, 127, 67, 72, 61, 232, 173, 114, - 133, 91, 138, 186, 115, 13, 154, 99, 68, 177, 182, 238, 154, 97, 221, 81, - 225, 3, 114, 85, 217, 206, 195, 60, 19, 69, 40, 235, 143, 245, 137, 137, - 97, 92, 130, 68, 29, 170, 85, 174, 28, 189, 83, 45, 252, 43, 101, 242, - 209, 146, 10, 84, 117, 197, 55, 250, 163, 17, 199, 165, 236, 79, 148, 93, - 189, 103, 125, 131, 170, 107, 80, 227, 61, 114, 115, 101, 181, 123, 90, 198, - 175, 180, 186, 10, 229, 174, 79, 220, 129, 210, 26, 122, 4, 120, 102, 206, - 244, 82, 31, 126, 161, 199, 97, 215, 225, 240, 206, 45, 189, 161, 77, 91, - 225, 154, 251, 183, 186, 31, 118, 91, 147, 51, 238, 117, 149, 159, 194, 196, - 180, 230, 195, 173, 227, 198, 56, 70, 7, 108, 45, 46, 96, 43, 37, 32, - 152, 123, 32, 48, 117, 29, 92, 188, 27, 65, 58, 118, 52, 190, 127, 194, - 61, 59, 14, 196, 137, 115, 123, 214, 49, 177, 168, 168, 206, 186, 243, 238, - 120, 76, 9, 103, 163, 217, 160, 79, 177, 57, 206, 88, 237, 209, 184, 59, - 25, 97, 235, 100, 221, 30, 136, 89, 113, 62, 86, 170, 238, 91, 91, 19, - 253, 224, 144, 209, 86, 42, 169, 33, 187, 183, 248, 252, 59, 209, 44, 100, - 178, 2, 20, 1, 154, 163, 60, 65, 122, 207, 98, 79, 43, 252, 213, 120, - 198, 136, 162, 116, 206, 27, 39, 84, 66, 94, 163, 78, 7, 81, 175, 250, - 24, 139, 12, 35, 22, 169, 79, 245, 99, 222, 119, 235, 237, 198, 249, 78, - 185, 121, 151, 230, 182, 123, 171, 91, 208, 163, 226, 160, 19, 231, 94, 47, - 60, 12, 70, 243, 190, 6, 14, 52, 250, 54, 57, 254, 186, 57, 225, 17, - 54, 155, 54, 151, 253, 194, 17, 71, 227, 38, 78, 238, 53, 186, 58, 205, - 243, 163, 118, 26, 91, 123, 179, 149, 196, 81, 206, 22, 226, 86, 62, 79, - 97, 70, 131, 161, 58, 98, 68, 191, 112, 242, 158, 111, 109, 195, 122, 59, - 60, 111, 196, 241, 5, 48, 244, 34, 160, 5, 96, 186, 227, 206, 240, 167, - 202, 6, 215, 71, 242, 90, 115, 95, 55, 28, 187, 181, 175, 53, 247, 117, - 203, 175, 107, 251, 90, 229, 215, 242, 123, 239, 4, 130, 208, 90, 179, 126, - 230, 252, 184, 255, 4, 3, 160, 24, 166, 4, 215, 60, 85, 185, 141, 238, - 90, 249, 130, 213, 248, 151, 243, 233, 216, 255, 143, 241, 244, 65, 133, 118, - 103, 142, 200, 179, 11, 231, 194, 55, 122, 74, 80, 79, 32, 150, 231, 193, - 205, 167, 187, 81, 239, 102, 209, 41, 20, 191, 22, 137, 233, 77, 50, 45, - 109, 234, 149, 130, 201, 50, 17, 243, 194, 47, 244, 228, 30, 189, 96, 122, - 86, 188, 24, 187, 11, 175, 92, 180, 19, 245, 7, 221, 222, 48, 163, 251, - 47, 43, 70, 224, 223, 110, 204, 132, 29, 109, 161, 202, 62, 90, 66, 155, - 209, 167, 16, 5, 39, 161, 177, 192, 70, 139, 60, 235, 242, 238, 44, 9, - 89, 106, 23, 150, 170, 76, 28, 92, 254, 170, 167, 77, 186, 33, 5, 81, - 40, 44, 120, 233, 6, 238, 161, 80, 177, 33, 84, 73, 147, 202, 241, 96, - 43, 116, 232, 25, 53, 131, 202, 9, 72, 96, 90, 83, 40, 170, 92, 11, - 0, 223, 210, 25, 104, 53, 126, 138, 237, 205, 86, 20, 7, 15, 237, 221, - 126, 2, 194, 247, 153, 128, 211, 176, 20, 12, 149, 40, 239, 188, 59, 191, - 112, 195, 189, 157, 182, 110, 41, 86, 88, 127, 228, 153, 255, 25, 235, 133, - 145, 147, 89, 75, 146, 2, 52, 141, 1, 18, 81, 124, 22, 72, 153, 148, - 157, 170, 244, 162, 67, 189, 52, 235, 152, 76, 223, 250, 38, 162, 168, 159, - 138, 143, 148, 100, 71, 133, 83, 113, 180, 165, 191, 40, 190, 189, 230, 143, - 2, 113, 238, 109, 8, 99, 62, 240, 86, 19, 77, 19, 250, 10, 162, 49, - 59, 140, 187, 179, 222, 222, 17, 171, 173, 59, 22, 60, 116, 123, 71, 142, - 93, 243, 213, 254, 65, 108, 147, 252, 171, 70, 115, 202, 10, 70, 109, 153, - 163, 73, 127, 128, 205, 110, 48, 89, 142, 55, 185, 227, 187, 183, 111, 128, - 239, 109, 115, 254, 168, 118, 90, 252, 101, 195, 219, 253, 240, 136, 113, 110, - 82, 83, 67, 127, 243, 152, 247, 223, 118, 104, 248, 218, 33, 184, 40, 190, - 2, 159, 22, 44, 20, 123, 181, 240, 123, 88, 202, 112, 179, 228, 217, 84, - 93, 12, 71, 74, 86, 165, 241, 89, 124, 133, 107, 73, 216, 233, 164, 54, - 196, 238, 108, 186, 127, 184, 77, 239, 7, 243, 49, 173, 41, 24, 109, 211, - 36, 198, 78, 35, 173, 21, 22, 83, 144, 104, 133, 197, 172, 5, 118, 212, - 200, 84, 5, 200, 157, 24, 101, 91, 179, 224, 136, 123, 82, 58, 227, 51, - 80, 97, 208, 116, 167, 67, 157, 162, 24, 171, 4, 50, 178, 32, 244, 203, - 127, 245, 35, 250, 215, 164, 127, 231, 120, 111, 59, 54, 95, 127, 228, 168, - 6, 218, 128, 173, 2, 117, 190, 212, 108, 54, 224, 3, 91, 45, 173, 76, - 232, 140, 231, 105, 202, 153, 185, 155, 203, 221, 106, 177, 20, 123, 176, 217, - 244, 97, 48, 71, 141, 162, 3, 199, 97, 85, 104, 167, 113, 18, 56, 217, - 164, 148, 153, 157, 29, 97, 95, 95, 200, 205, 165, 223, 98, 189, 16, 234, - 151, 48, 61, 117, 108, 95, 252, 254, 1, 193, 179, 204, 233, 252, 125, 35, - 228, 203, 203, 122, 43, 126, 58, 226, 0, 234, 68, 161, 186, 202, 128, 177, - 177, 89, 227, 145, 36, 250, 128, 28, 198, 211, 79, 81, 9, 59, 64, 216, - 6, 208, 123, 153, 226, 80, 187, 212, 252, 182, 221, 238, 12, 23, 190, 7, - 198, 61, 89, 114, 114, 43, 182, 75, 87, 95, 169, 39, 67, 153, 43, 181, - 157, 221, 80, 139, 167, 55, 131, 117, 111, 48, 19, 208, 142, 2, 239, 100, - 220, 218, 144, 154, 45, 219, 221, 51, 220, 10, 17, 115, 223, 240, 211, 233, - 223, 91, 45, 190, 61, 179, 23, 6, 190, 233, 65, 206, 181, 198, 218, 244, - 73, 169, 176, 186, 64, 163, 194, 105, 44, 150, 221, 222, 231, 58, 223, 92, - 217, 85, 69, 159, 19, 246, 116, 19, 173, 58, 210, 155, 145, 229, 190, 221, - 205, 78, 90, 229, 29, 88, 10, 168, 201, 94, 49, 116, 174, 184, 82, 237, - 149, 158, 177, 106, 140, 33, 216, 227, 84, 26, 190, 4, 203, 207, 62, 82, - 120, 211, 15, 175, 58, 195, 157, 55, 189, 95, 107, 141, 112, 118, 233, 82, - 176, 62, 93, 248, 162, 48, 120, 168, 136, 45, 16, 149, 250, 16, 209, 120, - 162, 161, 242, 112, 10, 136, 144, 234, 150, 205, 43, 138, 15, 81, 173, 72, - 185, 236, 68, 17, 132, 3, 33, 250, 120, 136, 170, 8, 198, 128, 182, 236, - 21, 99, 40, 22, 67, 77, 5, 230, 63, 10, 1, 5, 135, 217, 224, 223, - 79, 0, 93, 151, 6, 110, 231, 164, 146, 84, 63, 20, 69, 143, 10, 116, - 143, 14, 95, 108, 36, 55, 189, 223, 28, 166, 195, 208, 210, 97, 168, 232, - 48, 20, 58, 232, 3, 219, 99, 113, 200, 164, 216, 40, 82, 152, 51, 93, - 128, 24, 80, 99, 243, 223, 73, 13, 167, 58, 13, 220, 80, 74, 85, 165, - 150, 66, 147, 141, 166, 201, 198, 219, 63, 124, 154, 106, 248, 96, 73, 1, - 162, 216, 169, 134, 22, 123, 213, 137, 247, 174, 93, 17, 51, 166, 249, 49, - 239, 105, 186, 188, 199, 124, 145, 57, 35, 157, 241, 91, 7, 229, 239, 232, - 198, 244, 112, 110, 136, 10, 138, 219, 119, 126, 117, 107, 59, 84, 117, 181, - 59, 210, 197, 176, 45, 147, 83, 106, 96, 36, 38, 74, 114, 170, 252, 17, - 35, 5, 193, 81, 126, 112, 252, 79, 156, 101, 201, 121, 150, 28, 99, 118, - 210, 105, 162, 134, 54, 150, 50, 136, 144, 1, 15, 192, 199, 200, 201, 67, - 209, 41, 86, 223, 154, 17, 42, 100, 238, 178, 95, 21, 134, 157, 9, 131, - 136, 31, 14, 14, 220, 115, 26, 184, 95, 60, 60, 155, 169, 225, 185, 111, - 201, 110, 255, 150, 204, 207, 83, 153, 43, 174, 111, 153, 225, 70, 151, 163, - 241, 128, 15, 60, 203, 36, 19, 16, 54, 158, 27, 235, 211, 56, 241, 214, - 76, 188, 181, 44, 187, 80, 124, 108, 187, 47, 103, 89, 70, 226, 188, 19, - 42, 70, 226, 92, 39, 59, 7, 194, 241, 65, 118, 150, 107, 184, 159, 135, - 149, 104, 151, 113, 189, 185, 29, 79, 123, 226, 165, 130, 152, 87, 232, 208, - 113, 128, 232, 186, 185, 33, 172, 81, 166, 2, 20, 221, 236, 103, 29, 39, - 208, 126, 234, 134, 154, 207, 25, 203, 20, 11, 67, 119, 190, 185, 233, 77, - 39, 253, 17, 123, 125, 97, 94, 185, 63, 154, 143, 122, 195, 241, 96, 201, - 182, 143, 147, 193, 138, 234, 40, 32, 214, 180, 118, 140, 166, 144, 25, 194, - 240, 81, 73, 13, 142, 231, 159, 209, 0, 191, 52, 65, 197, 110, 167, 243, - 225, 116, 218, 47, 239, 229, 169, 7, 247, 180, 70, 173, 104, 124, 108, 18, - 108, 211, 140, 97, 208, 41, 159, 92, 222, 121, 121, 208, 146, 207, 146, 184, - 227, 16, 183, 99, 201, 138, 65, 66, 156, 114, 130, 172, 157, 36, 61, 59, - 9, 66, 26, 99, 205, 60, 74, 134, 251, 184, 236, 193, 47, 212, 46, 98, - 174, 176, 80, 68, 173, 182, 102, 187, 121, 80, 176, 174, 191, 78, 128, 88, - 98, 182, 219, 252, 191, 134, 135, 244, 146, 67, 232, 127, 216, 240, 223, 195, - 188, 171, 218, 238, 63, 30, 11, 199, 92, 140, 214, 197, 120, 13, 175, 114, - 232, 97, 115, 64, 54, 6, 65, 138, 248, 184, 230, 98, 39, 18, 197, 179, - 178, 98, 162, 5, 211, 33, 172, 22, 207, 3, 51, 122, 3, 53, 114, 3, - 61, 106, 3, 25, 177, 5, 6, 248, 150, 14, 243, 109, 135, 237, 145, 127, - 223, 62, 116, 30, 161, 76, 175, 78, 11, 153, 45, 244, 107, 108, 190, 47, - 104, 11, 165, 46, 122, 160, 141, 243, 118, 120, 32, 125, 76, 233, 105, 203, - 141, 95, 20, 89, 67, 102, 136, 244, 253, 3, 233, 155, 148, 190, 95, 41, - 54, 95, 20, 89, 211, 168, 143, 45, 253, 193, 152, 44, 38, 211, 182, 40, - 109, 241, 150, 106, 211, 122, 81, 108, 33, 225, 112, 79, 194, 54, 39, 164, - 106, 180, 95, 20, 219, 72, 216, 223, 147, 240, 140, 19, 82, 249, 103, 47, - 136, 210, 59, 111, 161, 72, 65, 165, 208, 150, 244, 128, 59, 148, 91, 52, - 121, 49, 212, 225, 67, 10, 31, 114, 56, 154, 182, 232, 235, 240, 62, 133, - 247, 57, 28, 77, 72, 153, 7, 61, 46, 170, 225, 78, 132, 120, 211, 135, - 87, 10, 2, 156, 242, 177, 143, 253, 87, 141, 29, 251, 227, 162, 242, 2, - 229, 92, 235, 118, 200, 127, 57, 79, 175, 227, 155, 249, 129, 127, 190, 1, - 91, 15, 189, 83, 230, 62, 96, 227, 70, 31, 239, 252, 83, 6, 85, 149, - 215, 33, 94, 35, 243, 218, 167, 26, 255, 50, 247, 43, 184, 9, 28, 172, - 103, 254, 220, 71, 113, 40, 136, 226, 168, 176, 138, 3, 35, 157, 136, 17, - 0, 8, 55, 8, 202, 115, 56, 179, 221, 240, 22, 69, 76, 198, 231, 58, - 101, 87, 112, 147, 48, 16, 78, 208, 208, 106, 109, 0, 109, 49, 214, 37, - 208, 26, 96, 149, 174, 173, 104, 111, 109, 95, 246, 191, 194, 159, 42, 205, - 180, 5, 237, 22, 18, 185, 145, 200, 205, 203, 33, 34, 55, 28, 57, 212, - 145, 107, 137, 92, 191, 124, 64, 228, 154, 35, 31, 40, 146, 141, 51, 164, - 148, 134, 50, 220, 103, 19, 193, 160, 120, 94, 54, 55, 122, 28, 2, 211, - 166, 245, 178, 116, 130, 70, 212, 79, 232, 237, 150, 14, 169, 159, 197, 207, - 173, 177, 71, 9, 3, 201, 171, 22, 150, 85, 110, 234, 235, 96, 241, 21, - 35, 225, 162, 93, 78, 106, 188, 170, 132, 72, 32, 73, 25, 175, 254, 210, - 43, 227, 63, 214, 81, 208, 90, 136, 2, 37, 2, 66, 89, 245, 247, 207, - 117, 247, 248, 72, 117, 203, 189, 213, 209, 203, 206, 221, 96, 186, 90, 38, - 119, 90, 21, 200, 59, 221, 100, 234, 235, 52, 191, 250, 175, 26, 157, 180, - 138, 173, 138, 43, 177, 35, 8, 44, 21, 139, 114, 102, 191, 235, 154, 101, - 76, 144, 155, 244, 87, 117, 47, 85, 9, 209, 180, 40, 70, 187, 167, 150, - 193, 228, 162, 103, 235, 168, 86, 40, 26, 78, 44, 138, 72, 32, 50, 31, - 147, 147, 169, 26, 86, 86, 216, 170, 73, 147, 148, 216, 1, 46, 162, 74, - 143, 39, 197, 83, 64, 106, 140, 104, 234, 142, 22, 44, 96, 96, 0, 180, - 155, 27, 16, 184, 72, 193, 144, 55, 208, 34, 161, 114, 226, 16, 111, 236, - 240, 230, 224, 168, 57, 113, 129, 226, 10, 29, 218, 11, 222, 123, 133, 254, - 84, 164, 22, 191, 190, 162, 230, 39, 50, 80, 169, 132, 175, 22, 189, 88, - 182, 114, 44, 58, 153, 248, 60, 242, 32, 160, 127, 232, 142, 228, 86, 250, - 97, 72, 59, 138, 31, 22, 188, 233, 228, 99, 119, 52, 102, 249, 1, 227, - 120, 167, 42, 151, 98, 218, 91, 25, 19, 199, 159, 70, 240, 228, 128, 62, - 182, 4, 41, 179, 76, 218, 165, 37, 145, 136, 167, 253, 19, 153, 209, 62, - 180, 243, 20, 220, 60, 87, 137, 158, 101, 176, 200, 54, 253, 2, 235, 202, - 124, 176, 128, 174, 70, 26, 230, 2, 108, 10, 251, 175, 51, 163, 207, 73, - 203, 168, 217, 2, 157, 4, 19, 76, 33, 214, 29, 69, 66, 44, 67, 237, - 30, 168, 175, 251, 224, 131, 62, 118, 169, 170, 150, 247, 248, 238, 163, 127, - 98, 179, 98, 69, 239, 201, 20, 166, 24, 119, 93, 26, 19, 54, 134, 45, - 152, 41, 114, 62, 248, 212, 157, 247, 225, 72, 14, 248, 1, 31, 137, 206, - 19, 120, 187, 96, 53, 115, 180, 2, 76, 218, 71, 164, 29, 172, 105, 149, - 53, 124, 24, 199, 201, 61, 42, 156, 179, 172, 198, 99, 57, 88, 237, 5, - 246, 248, 134, 73, 194, 182, 164, 240, 162, 145, 130, 187, 87, 136, 30, 234, - 110, 58, 56, 72, 1, 147, 37, 213, 11, 203, 64, 62, 79, 105, 27, 46, - 246, 171, 233, 66, 44, 197, 254, 131, 42, 111, 149, 191, 85, 223, 209, 215, - 139, 49, 11, 93, 111, 105, 180, 220, 77, 231, 218, 168, 123, 112, 64, 7, - 62, 65, 8, 203, 16, 26, 208, 167, 36, 69, 190, 157, 162, 251, 112, 179, - 79, 45, 232, 173, 230, 115, 236, 194, 39, 194, 144, 212, 235, 117, 204, 7, - 182, 121, 153, 210, 11, 79, 128, 19, 64, 157, 156, 192, 91, 13, 0, 11, - 49, 234, 240, 120, 194, 236, 211, 231, 124, 238, 211, 186, 53, 229, 91, 144, - 144, 231, 101, 200, 42, 230, 14, 20, 21, 44, 0, 160, 57, 16, 10, 218, - 179, 202, 73, 166, 97, 178, 206, 111, 56, 236, 95, 95, 89, 179, 36, 228, - 214, 180, 63, 77, 99, 136, 44, 187, 115, 116, 125, 162, 62, 7, 74, 30, - 175, 238, 70, 19, 230, 32, 70, 180, 16, 118, 171, 17, 238, 85, 104, 68, - 45, 25, 40, 91, 67, 166, 60, 183, 79, 106, 69, 162, 180, 47, 139, 163, - 157, 169, 198, 36, 221, 199, 255, 14, 111, 136, 154, 78, 167, 31, 161, 184, - 32, 180, 146, 218, 200, 64, 255, 196, 3, 161, 187, 88, 76, 123, 35, 158, - 213, 78, 250, 19, 159, 161, 78, 100, 194, 98, 30, 194, 162, 158, 117, 191, - 230, 131, 187, 238, 200, 40, 29, 240, 42, 250, 130, 24, 221, 233, 24, 78, - 135, 94, 216, 153, 188, 135, 50, 248, 128, 42, 115, 133, 133, 238, 154, 30, - 62, 142, 84, 157, 80, 12, 13, 245, 251, 209, 116, 181, 128, 217, 218, 9, - 45, 195, 50, 149, 136, 29, 231, 165, 202, 100, 38, 182, 15, 0, 207, 113, - 113, 88, 116, 29, 104, 10, 45, 231, 171, 65, 128, 129, 144, 72, 96, 170, - 150, 92, 82, 112, 102, 147, 79, 13, 64, 15, 45, 72, 227, 41, 13, 137, - 201, 234, 238, 150, 166, 34, 184, 60, 246, 140, 133, 5, 27, 27, 58, 175, - 125, 180, 220, 76, 105, 1, 152, 119, 80, 154, 69, 229, 225, 21, 60, 13, - 46, 52, 32, 6, 149, 70, 252, 116, 76, 115, 27, 25, 233, 11, 217, 108, - 163, 49, 122, 65, 163, 19, 231, 204, 224, 99, 243, 177, 86, 48, 31, 71, - 142, 172, 130, 70, 56, 37, 78, 98, 221, 112, 88, 254, 136, 208, 196, 31, - 125, 188, 118, 123, 65, 114, 73, 15, 85, 115, 228, 165, 78, 114, 110, 139, - 152, 19, 74, 212, 64, 230, 88, 166, 18, 28, 156, 95, 143, 39, 39, 104, - 201, 205, 222, 30, 184, 101, 69, 126, 97, 118, 165, 100, 230, 127, 157, 195, - 15, 175, 179, 183, 37, 118, 48, 218, 225, 120, 193, 70, 111, 210, 222, 163, - 98, 75, 139, 101, 159, 158, 228, 136, 71, 35, 67, 32, 153, 230, 212, 43, - 75, 192, 139, 138, 212, 205, 93, 251, 229, 51, 26, 101, 189, 238, 10, 184, - 223, 183, 96, 206, 78, 132, 67, 56, 209, 61, 107, 27, 162, 247, 110, 217, - 39, 176, 205, 150, 40, 147, 238, 100, 83, 150, 154, 44, 120, 84, 169, 77, - 7, 226, 12, 220, 222, 242, 29, 8, 174, 240, 176, 22, 140, 38, 139, 229, - 160, 219, 55, 7, 85, 220, 86, 179, 233, 142, 166, 201, 61, 83, 249, 75, - 54, 253, 212, 166, 108, 107, 91, 195, 70, 78, 188, 96, 47, 83, 107, 236, - 76, 250, 251, 64, 208, 71, 108, 129, 20, 105, 153, 131, 41, 22, 52, 124, - 60, 90, 98, 185, 88, 96, 175, 194, 215, 212, 20, 234, 80, 106, 218, 114, - 181, 72, 149, 120, 84, 113, 82, 128, 138, 28, 79, 167, 184, 229, 196, 89, - 61, 3, 158, 130, 213, 134, 202, 208, 91, 241, 29, 157, 202, 145, 141, 45, - 211, 103, 94, 123, 57, 68, 62, 221, 37, 245, 51, 81, 125, 65, 43, 198, - 9, 202, 96, 222, 101, 49, 186, 27, 193, 157, 130, 140, 254, 241, 88, 76, - 46, 193, 193, 209, 122, 57, 250, 52, 25, 41, 184, 87, 233, 16, 17, 254, - 152, 65, 186, 118, 103, 7, 205, 253, 244, 204, 160, 32, 197, 192, 80, 237, - 111, 167, 11, 199, 171, 92, 96, 142, 16, 123, 214, 16, 58, 44, 13, 230, - 19, 234, 112, 77, 50, 185, 191, 239, 250, 139, 13, 141, 146, 59, 30, 62, - 182, 161, 63, 201, 120, 7, 49, 184, 142, 188, 56, 194, 44, 79, 117, 6, - 211, 149, 199, 115, 111, 218, 7, 242, 22, 60, 1, 98, 45, 221, 200, 84, - 201, 203, 19, 156, 158, 83, 117, 40, 65, 203, 104, 224, 10, 90, 121, 28, - 252, 3, 99, 189, 19, 118, 145, 72, 7, 37, 49, 234, 60, 154, 111, 244, - 114, 42, 211, 46, 103, 194, 175, 15, 185, 169, 72, 20, 108, 22, 68, 94, - 18, 204, 122, 185, 111, 235, 201, 108, 131, 251, 216, 1, 5, 77, 234, 199, - 17, 251, 17, 98, 95, 66, 65, 236, 175, 233, 84, 194, 59, 64, 113, 253, - 146, 194, 118, 242, 141, 246, 171, 82, 92, 211, 255, 56, 2, 55, 19, 60, - 194, 23, 110, 143, 123, 214, 103, 187, 75, 30, 183, 247, 153, 140, 255, 123, - 246, 192, 36, 65, 217, 215, 80, 247, 101, 187, 185, 131, 62, 174, 15, 201, - 137, 114, 64, 212, 125, 9, 208, 114, 14, 141, 90, 110, 232, 5, 113, 66, - 180, 250, 169, 80, 42, 7, 47, 248, 16, 46, 184, 104, 24, 49, 110, 132, - 42, 204, 221, 139, 242, 54, 162, 188, 93, 200, 208, 91, 239, 67, 87, 178, - 126, 95, 103, 183, 36, 173, 121, 185, 15, 160, 201, 140, 219, 241, 62, 13, - 33, 206, 237, 10, 88, 182, 48, 59, 149, 177, 4, 211, 125, 185, 194, 1, - 166, 45, 243, 157, 77, 192, 8, 205, 103, 52, 57, 1, 145, 103, 246, 207, - 124, 233, 174, 52, 74, 67, 240, 105, 246, 84, 187, 252, 206, 126, 91, 84, - 143, 208, 107, 197, 242, 36, 91, 72, 112, 211, 21, 143, 29, 232, 208, 213, - 132, 7, 24, 132, 241, 252, 144, 62, 73, 125, 143, 64, 234, 124, 149, 206, - 217, 76, 56, 79, 140, 139, 59, 154, 170, 163, 154, 232, 25, 80, 196, 108, - 62, 253, 52, 239, 222, 221, 37, 28, 131, 189, 6, 61, 62, 155, 207, 212, - 104, 147, 76, 121, 243, 24, 111, 204, 242, 131, 129, 42, 185, 213, 253, 215, - 180, 45, 242, 39, 3, 1, 170, 54, 95, 80, 98, 101, 73, 156, 0, 94, - 68, 251, 78, 40, 6, 171, 53, 91, 198, 34, 71, 41, 83, 53, 30, 122, - 80, 87, 220, 1, 215, 251, 23, 28, 69, 32, 187, 216, 76, 166, 144, 1, - 39, 73, 243, 159, 11, 113, 227, 9, 172, 184, 197, 114, 122, 167, 215, 64, - 216, 131, 32, 249, 9, 77, 217, 241, 88, 170, 160, 151, 199, 229, 144, 122, - 110, 196, 110, 227, 63, 173, 24, 59, 16, 186, 149, 254, 176, 123, 63, 224, - 93, 235, 118, 64, 35, 97, 181, 112, 216, 222, 143, 116, 86, 24, 143, 55, - 194, 188, 47, 120, 241, 222, 24, 93, 29, 187, 253, 78, 96, 131, 63, 18, - 94, 71, 96, 8, 160, 130, 13, 108, 198, 192, 255, 7, 82, 119, 153, 237, - 228, 186, 112, 109, 77, 1, 166, 106, 221, 207, 3, 108, 157, 166, 106, 108, - 48, 147, 216, 4, 168, 197, 178, 127, 154, 111, 166, 254, 3, 163, 31, 167, - 105, 128, 35, 75, 111, 200, 253, 220, 167, 17, 211, 31, 168, 115, 189, 20, - 98, 75, 160, 225, 67, 205, 214, 37, 200, 116, 60, 158, 143, 102, 152, 52, - 115, 98, 7, 59, 50, 233, 77, 87, 96, 228, 164, 103, 208, 218, 219, 105, - 127, 163, 79, 237, 79, 51, 160, 121, 91, 39, 118, 77, 131, 6, 217, 155, - 210, 105, 116, 49, 155, 202, 178, 152, 96, 53, 247, 92, 201, 200, 164, 229, - 201, 94, 139, 117, 19, 141, 126, 108, 106, 210, 58, 122, 190, 55, 16, 72, - 105, 189, 42, 195, 33, 132, 5, 243, 24, 21, 2, 24, 139, 228, 83, 43, - 115, 83, 182, 72, 42, 0, 242, 165, 25, 15, 94, 98, 147, 62, 14, 248, - 132, 173, 38, 157, 101, 172, 117, 101, 84, 37, 120, 169, 26, 24, 141, 96, - 195, 154, 186, 27, 138, 91, 233, 4, 244, 41, 247, 149, 62, 203, 15, 38, - 247, 163, 249, 116, 114, 39, 207, 125, 241, 220, 59, 186, 187, 27, 244, 113, - 38, 165, 181, 96, 31, 220, 105, 170, 132, 189, 23, 97, 88, 101, 147, 170, - 198, 8, 137, 137, 120, 66, 121, 236, 223, 189, 130, 231, 144, 219, 34, 225, - 136, 185, 148, 32, 116, 8, 62, 135, 64, 70, 226, 183, 205, 191, 103, 252, - 123, 206, 191, 23, 252, 27, 54, 228, 143, 124, 29, 202, 231, 161, 124, 31, - 74, 6, 33, 229, 80, 80, 238, 231, 59, 157, 198, 175, 191, 178, 187, 78, - 249, 67, 27, 159, 145, 182, 234, 30, 44, 60, 22, 191, 170, 133, 187, 130, - 237, 192, 19, 117, 243, 117, 226, 118, 165, 35, 138, 213, 146, 196, 108, 86, - 197, 175, 18, 217, 84, 14, 228, 192, 234, 193, 53, 27, 89, 44, 84, 92, - 84, 15, 94, 221, 1, 51, 242, 194, 111, 188, 236, 112, 159, 188, 236, 64, - 106, 250, 2, 87, 27, 89, 151, 101, 24, 44, 230, 27, 89, 130, 245, 108, - 212, 131, 129, 162, 123, 56, 81, 208, 124, 210, 107, 150, 59, 33, 157, 229, - 134, 30, 105, 109, 252, 184, 26, 203, 134, 193, 67, 74, 22, 59, 137, 225, - 109, 1, 235, 1, 49, 47, 125, 158, 160, 16, 147, 143, 122, 93, 215, 98, - 226, 23, 135, 115, 248, 101, 53, 90, 166, 24, 7, 4, 165, 218, 241, 127, - 17, 164, 202, 177, 167, 196, 28, 102, 224, 23, 203, 12, 168, 77, 250, 133, - 63, 185, 189, 177, 114, 148, 224, 230, 190, 59, 31, 193, 143, 230, 205, 94, - 126, 208, 145, 186, 16, 161, 186, 105, 185, 215, 33, 38, 150, 29, 42, 0, - 165, 83, 223, 51, 6, 19, 159, 45, 208, 174, 138, 147, 107, 191, 248, 82, - 93, 193, 68, 202, 76, 74, 44, 125, 54, 185, 89, 209, 241, 9, 118, 26, - 145, 206, 171, 41, 113, 202, 242, 37, 229, 61, 179, 153, 227, 133, 179, 233, - 242, 195, 14, 47, 34, 167, 141, 84, 203, 149, 51, 114, 70, 236, 209, 195, - 34, 185, 161, 24, 186, 238, 29, 128, 191, 98, 0, 254, 234, 220, 198, 232, - 104, 128, 90, 114, 18, 39, 164, 187, 230, 144, 63, 96, 168, 250, 165, 249, - 0, 120, 203, 247, 88, 182, 150, 83, 147, 163, 22, 240, 140, 153, 81, 1, - 64, 137, 205, 156, 111, 136, 23, 101, 22, 86, 241, 201, 159, 249, 158, 140, - 110, 3, 54, 29, 147, 159, 141, 78, 101, 83, 247, 92, 154, 24, 140, 33, - 120, 31, 213, 6, 12, 10, 167, 228, 70, 167, 187, 81, 21, 216, 249, 233, - 160, 14, 107, 13, 65, 215, 232, 174, 3, 159, 214, 165, 90, 20, 228, 125, - 247, 131, 138, 13, 243, 98, 101, 145, 251, 138, 150, 181, 63, 253, 233, 153, - 129, 14, 241, 248, 130, 67, 47, 77, 32, 184, 38, 92, 134, 234, 52, 151, - 138, 225, 243, 58, 214, 157, 154, 103, 34, 89, 193, 54, 124, 41, 87, 127, - 208, 158, 165, 30, 21, 188, 196, 226, 93, 181, 84, 252, 161, 86, 188, 43, - 87, 232, 59, 40, 212, 106, 47, 195, 95, 1, 59, 211, 131, 199, 17, 182, - 184, 160, 198, 212, 216, 5, 27, 213, 159, 113, 255, 84, 64, 178, 110, 223, - 176, 42, 189, 123, 221, 197, 219, 127, 138, 238, 254, 213, 255, 99, 239, 93, - 219, 27, 183, 146, 52, 193, 239, 248, 21, 48, 13, 181, 120, 1, 41, 0, - 36, 37, 165, 36, 200, 93, 151, 105, 143, 119, 39, 115, 61, 233, 234, 110, - 123, 101, 37, 155, 34, 41, 145, 54, 69, 170, 72, 74, 34, 83, 230, 254, - 246, 141, 55, 226, 220, 0, 16, 76, 101, 150, 171, 102, 107, 159, 121, 236, - 20, 129, 131, 115, 191, 70, 196, 137, 120, 163, 18, 204, 238, 195, 96, 246, - 182, 114, 157, 175, 106, 112, 95, 236, 217, 66, 71, 133, 47, 84, 111, 202, - 162, 174, 234, 126, 68, 13, 218, 170, 192, 183, 153, 64, 111, 241, 56, 19, - 125, 123, 91, 194, 91, 127, 199, 128, 22, 75, 125, 249, 87, 52, 138, 45, - 176, 119, 92, 51, 181, 139, 176, 156, 10, 129, 211, 208, 167, 56, 45, 244, - 177, 160, 15, 1, 84, 231, 76, 195, 93, 233, 133, 96, 45, 56, 222, 211, - 103, 59, 93, 179, 177, 114, 59, 59, 144, 129, 176, 149, 171, 109, 157, 119, - 116, 222, 200, 121, 43, 232, 211, 238, 69, 36, 52, 81, 43, 173, 59, 222, - 97, 251, 79, 2, 123, 59, 130, 180, 236, 241, 102, 185, 154, 172, 30, 101, - 171, 164, 143, 99, 222, 208, 152, 168, 81, 149, 111, 113, 199, 157, 121, 65, - 93, 149, 202, 171, 227, 12, 91, 236, 125, 110, 7, 250, 243, 28, 132, 232, - 152, 85, 128, 136, 213, 228, 136, 182, 13, 72, 160, 107, 254, 232, 156, 31, - 66, 42, 230, 65, 199, 133, 126, 60, 83, 15, 61, 1, 196, 43, 57, 27, - 245, 206, 162, 4, 100, 194, 84, 192, 221, 50, 239, 25, 212, 3, 178, 95, - 34, 3, 33, 72, 85, 199, 104, 191, 131, 59, 78, 161, 199, 50, 150, 84, - 79, 233, 202, 237, 28, 119, 24, 143, 81, 250, 231, 254, 226, 87, 255, 49, - 78, 255, 184, 96, 103, 134, 170, 230, 193, 203, 35, 241, 227, 151, 236, 91, - 108, 91, 17, 104, 193, 249, 227, 138, 119, 187, 224, 165, 73, 169, 183, 48, - 106, 13, 147, 54, 251, 212, 181, 76, 185, 220, 83, 188, 66, 242, 161, 228, - 193, 133, 11, 19, 125, 67, 1, 196, 250, 252, 53, 197, 112, 126, 232, 10, - 100, 75, 197, 32, 255, 171, 164, 31, 196, 228, 46, 22, 253, 205, 50, 244, - 255, 194, 26, 73, 104, 202, 191, 17, 35, 60, 210, 64, 117, 125, 124, 166, - 98, 223, 66, 191, 238, 29, 254, 40, 192, 181, 213, 70, 97, 75, 3, 64, - 24, 148, 48, 109, 77, 172, 18, 135, 125, 200, 113, 27, 36, 174, 169, 222, - 174, 223, 169, 172, 246, 99, 72, 23, 116, 212, 222, 165, 111, 149, 74, 153, - 91, 110, 153, 193, 134, 20, 129, 17, 78, 60, 93, 115, 165, 16, 166, 244, - 183, 98, 209, 221, 138, 47, 115, 120, 205, 65, 108, 0, 155, 35, 7, 127, - 221, 117, 175, 35, 45, 129, 147, 231, 196, 109, 75, 86, 165, 64, 106, 233, - 163, 150, 14, 172, 114, 148, 18, 177, 29, 29, 241, 238, 205, 64, 5, 180, - 183, 197, 42, 12, 91, 188, 14, 75, 248, 124, 135, 51, 234, 69, 208, 222, - 30, 132, 250, 87, 65, 41, 18, 97, 3, 66, 188, 142, 237, 21, 154, 199, - 137, 122, 82, 159, 65, 36, 57, 26, 31, 168, 98, 239, 182, 63, 28, 185, - 195, 7, 31, 43, 8, 235, 193, 77, 198, 202, 80, 24, 18, 70, 148, 149, - 132, 100, 7, 121, 231, 24, 255, 190, 67, 28, 250, 135, 182, 86, 233, 113, - 100, 2, 168, 74, 233, 155, 104, 199, 20, 40, 99, 162, 156, 102, 183, 245, - 44, 208, 189, 96, 232, 140, 32, 22, 78, 233, 88, 97, 25, 190, 137, 132, - 91, 138, 247, 14, 55, 209, 85, 213, 160, 77, 163, 210, 57, 168, 249, 183, - 44, 55, 18, 61, 190, 79, 205, 131, 110, 137, 83, 177, 150, 16, 186, 196, - 15, 43, 125, 51, 86, 82, 15, 95, 52, 166, 88, 162, 129, 226, 185, 180, - 30, 241, 153, 247, 196, 195, 251, 12, 105, 97, 109, 51, 213, 76, 87, 144, - 0, 93, 47, 63, 5, 20, 219, 126, 230, 191, 19, 127, 36, 147, 5, 175, - 219, 53, 143, 232, 134, 199, 115, 189, 97, 5, 86, 218, 243, 155, 244, 184, - 45, 44, 242, 188, 47, 48, 233, 155, 228, 195, 187, 53, 253, 251, 178, 81, - 71, 53, 146, 207, 93, 218, 186, 45, 122, 92, 77, 211, 204, 200, 42, 55, - 246, 197, 117, 219, 167, 234, 210, 96, 226, 143, 18, 100, 140, 134, 205, 215, - 45, 227, 36, 55, 124, 98, 123, 19, 180, 83, 20, 35, 206, 213, 97, 220, - 64, 139, 179, 77, 179, 3, 255, 172, 46, 159, 88, 44, 208, 39, 173, 141, - 231, 126, 18, 39, 76, 187, 64, 215, 131, 4, 153, 59, 38, 201, 98, 136, - 162, 63, 197, 91, 215, 70, 89, 187, 137, 203, 196, 206, 70, 240, 117, 74, - 174, 102, 204, 21, 225, 63, 102, 231, 96, 53, 66, 229, 21, 202, 204, 172, - 188, 18, 25, 119, 58, 4, 194, 115, 144, 34, 111, 151, 188, 171, 240, 223, - 183, 67, 126, 30, 58, 64, 1, 122, 95, 24, 174, 223, 13, 237, 10, 114, - 86, 140, 153, 44, 111, 151, 235, 119, 75, 127, 57, 127, 92, 224, 58, 142, - 15, 164, 125, 251, 197, 50, 125, 187, 196, 6, 241, 118, 136, 7, 153, 66, - 239, 134, 233, 187, 101, 169, 25, 159, 91, 239, 83, 224, 190, 0, 247, 194, - 203, 53, 167, 176, 59, 4, 202, 251, 70, 144, 20, 183, 5, 214, 202, 221, - 213, 40, 103, 195, 96, 209, 196, 43, 156, 9, 74, 106, 94, 191, 102, 50, - 24, 167, 53, 84, 204, 213, 203, 35, 29, 17, 117, 160, 167, 215, 182, 215, - 194, 7, 243, 240, 0, 222, 161, 249, 162, 62, 209, 23, 97, 142, 117, 126, - 216, 37, 246, 185, 4, 188, 93, 8, 141, 99, 174, 206, 241, 222, 91, 111, - 168, 23, 245, 39, 183, 75, 176, 121, 48, 108, 79, 183, 171, 186, 165, 45, - 155, 102, 208, 17, 33, 19, 62, 100, 181, 160, 181, 18, 180, 206, 25, 112, - 12, 142, 238, 191, 4, 179, 144, 241, 204, 103, 79, 147, 15, 0, 131, 101, - 192, 220, 201, 199, 145, 248, 176, 48, 24, 177, 236, 207, 2, 148, 77, 200, - 73, 236, 252, 88, 244, 159, 253, 247, 223, 254, 241, 15, 77, 198, 131, 0, - 224, 4, 182, 79, 213, 60, 86, 84, 124, 237, 158, 100, 170, 0, 0, 93, - 120, 155, 160, 90, 164, 109, 121, 180, 64, 186, 145, 114, 68, 129, 186, 164, - 26, 46, 26, 85, 74, 219, 7, 37, 51, 208, 105, 105, 59, 108, 3, 171, - 60, 142, 14, 188, 76, 251, 45, 242, 81, 36, 178, 188, 118, 164, 183, 50, - 129, 219, 149, 206, 110, 31, 216, 185, 200, 45, 119, 27, 91, 80, 112, 52, - 13, 98, 103, 17, 6, 133, 55, 131, 104, 29, 250, 170, 45, 152, 106, 104, - 11, 87, 200, 156, 89, 130, 179, 217, 47, 159, 195, 142, 242, 50, 253, 87, - 105, 86, 1, 171, 190, 62, 122, 110, 194, 207, 55, 118, 219, 6, 92, 188, - 84, 55, 71, 99, 29, 82, 251, 80, 141, 143, 232, 167, 226, 95, 166, 64, - 49, 58, 96, 77, 197, 142, 239, 66, 62, 51, 84, 38, 163, 28, 53, 21, - 254, 51, 220, 192, 80, 178, 206, 22, 187, 148, 192, 55, 55, 110, 90, 236, - 42, 134, 241, 51, 219, 84, 113, 204, 126, 28, 149, 98, 250, 211, 18, 8, - 206, 79, 172, 128, 30, 196, 67, 152, 128, 130, 214, 140, 73, 7, 109, 239, - 17, 248, 159, 222, 218, 125, 217, 132, 189, 233, 232, 118, 69, 147, 115, 200, - 84, 17, 188, 135, 244, 167, 66, 24, 241, 94, 219, 20, 234, 72, 189, 108, - 28, 163, 16, 58, 86, 225, 111, 5, 12, 11, 39, 167, 156, 160, 58, 167, - 158, 31, 105, 221, 202, 179, 189, 186, 158, 45, 225, 203, 177, 253, 103, 169, - 228, 242, 243, 38, 178, 178, 222, 192, 68, 117, 218, 146, 58, 77, 49, 150, - 26, 182, 69, 78, 237, 108, 229, 82, 91, 183, 210, 163, 217, 233, 198, 208, - 203, 244, 105, 222, 71, 74, 197, 117, 92, 233, 206, 110, 69, 127, 69, 178, - 147, 68, 34, 175, 142, 92, 220, 150, 76, 119, 160, 55, 178, 51, 93, 1, - 75, 211, 44, 55, 141, 20, 204, 110, 191, 42, 64, 73, 220, 90, 113, 32, - 166, 4, 149, 85, 248, 148, 134, 215, 162, 79, 236, 210, 126, 206, 229, 171, - 117, 210, 234, 180, 85, 237, 108, 184, 83, 18, 69, 228, 251, 212, 152, 64, - 110, 125, 23, 51, 104, 153, 190, 44, 137, 108, 64, 237, 31, 166, 125, 246, - 74, 55, 160, 127, 71, 128, 110, 17, 96, 158, 216, 107, 244, 108, 214, 108, - 218, 215, 241, 23, 109, 6, 80, 135, 228, 178, 249, 38, 130, 115, 0, 154, - 243, 128, 110, 162, 119, 120, 181, 46, 36, 233, 186, 73, 116, 138, 125, 9, - 142, 37, 1, 67, 227, 217, 50, 232, 133, 210, 236, 78, 113, 226, 166, 176, - 9, 154, 54, 133, 194, 197, 138, 241, 201, 133, 30, 186, 247, 110, 193, 104, - 68, 222, 96, 77, 199, 107, 61, 32, 194, 183, 94, 13, 110, 27, 193, 125, - 157, 54, 134, 163, 224, 214, 27, 108, 82, 0, 181, 141, 11, 31, 128, 253, - 163, 225, 119, 95, 224, 62, 254, 168, 109, 156, 44, 221, 34, 188, 50, 185, - 173, 78, 170, 73, 184, 169, 93, 160, 34, 147, 112, 210, 16, 104, 249, 40, - 172, 4, 131, 117, 37, 148, 183, 24, 111, 155, 74, 72, 71, 43, 157, 171, - 245, 74, 112, 95, 169, 213, 106, 21, 111, 131, 60, 64, 83, 213, 89, 148, - 12, 12, 222, 231, 45, 67, 241, 50, 66, 89, 64, 231, 60, 220, 168, 211, - 251, 237, 214, 251, 133, 157, 147, 180, 140, 173, 133, 64, 103, 1, 196, 16, - 232, 129, 224, 228, 100, 68, 29, 138, 47, 191, 31, 121, 206, 17, 41, 203, - 198, 220, 183, 192, 160, 221, 142, 97, 124, 26, 9, 136, 185, 38, 4, 229, - 14, 198, 25, 130, 93, 49, 218, 38, 15, 246, 101, 119, 26, 89, 29, 108, - 41, 243, 246, 241, 227, 71, 240, 201, 56, 29, 122, 107, 109, 10, 199, 111, - 27, 253, 198, 113, 248, 108, 206, 158, 201, 250, 251, 251, 176, 247, 109, 216, - 251, 99, 216, 251, 195, 158, 99, 89, 10, 250, 146, 99, 153, 235, 146, 74, - 5, 153, 51, 212, 213, 73, 187, 185, 179, 89, 31, 199, 239, 211, 111, 211, - 63, 166, 127, 0, 77, 178, 119, 211, 146, 58, 37, 145, 151, 235, 139, 60, - 41, 216, 205, 28, 194, 138, 4, 58, 78, 131, 174, 236, 84, 193, 177, 220, - 173, 49, 9, 148, 57, 158, 133, 28, 116, 155, 94, 56, 164, 77, 107, 228, - 48, 118, 65, 241, 185, 49, 232, 68, 193, 186, 178, 102, 94, 176, 78, 217, - 127, 64, 231, 206, 229, 216, 123, 232, 15, 215, 130, 247, 144, 53, 106, 138, - 43, 84, 247, 184, 94, 125, 166, 85, 112, 68, 91, 37, 36, 203, 20, 119, - 179, 43, 46, 44, 164, 105, 185, 86, 199, 42, 46, 36, 228, 11, 26, 69, - 70, 132, 163, 237, 11, 101, 132, 248, 187, 9, 95, 216, 78, 23, 1, 91, - 248, 19, 149, 231, 13, 72, 94, 81, 146, 160, 227, 91, 144, 250, 221, 122, - 118, 252, 219, 65, 11, 22, 121, 205, 83, 90, 91, 236, 37, 57, 185, 54, - 86, 56, 113, 136, 27, 80, 64, 20, 237, 52, 113, 145, 33, 124, 232, 79, - 160, 181, 125, 199, 36, 37, 140, 10, 101, 138, 66, 198, 1, 125, 238, 69, - 127, 9, 169, 71, 8, 153, 51, 100, 108, 251, 38, 243, 211, 228, 110, 54, - 90, 173, 70, 110, 62, 54, 80, 231, 38, 76, 245, 232, 22, 106, 249, 153, - 64, 20, 169, 195, 135, 163, 217, 146, 14, 15, 37, 93, 209, 161, 134, 202, - 53, 1, 133, 202, 44, 25, 35, 182, 39, 194, 61, 171, 153, 50, 132, 40, - 210, 52, 85, 38, 22, 52, 22, 63, 107, 77, 137, 121, 39, 145, 8, 170, - 210, 105, 212, 98, 95, 135, 197, 174, 73, 143, 57, 226, 251, 52, 73, 120, - 197, 125, 155, 38, 17, 147, 193, 127, 76, 227, 132, 31, 50, 125, 149, 38, - 7, 153, 48, 83, 64, 71, 82, 229, 123, 43, 237, 102, 130, 85, 103, 41, - 34, 220, 237, 44, 33, 105, 138, 189, 69, 53, 239, 30, 104, 151, 23, 110, - 143, 81, 245, 218, 157, 238, 241, 201, 233, 155, 189, 219, 128, 233, 73, 77, - 191, 216, 89, 228, 101, 156, 53, 30, 88, 219, 80, 128, 147, 118, 50, 222, - 124, 181, 165, 233, 241, 129, 107, 65, 154, 56, 111, 167, 232, 1, 251, 250, - 134, 26, 110, 223, 226, 8, 180, 191, 126, 141, 35, 185, 33, 148, 79, 142, - 143, 57, 190, 169, 71, 123, 197, 149, 156, 218, 170, 58, 24, 26, 181, 59, - 69, 138, 140, 162, 161, 81, 55, 250, 166, 23, 236, 238, 132, 41, 84, 156, - 64, 57, 246, 129, 25, 6, 208, 84, 106, 160, 152, 123, 80, 211, 35, 207, - 69, 232, 29, 138, 136, 170, 227, 109, 45, 244, 245, 232, 171, 92, 78, 216, - 89, 93, 197, 134, 174, 22, 163, 217, 29, 104, 182, 83, 246, 175, 192, 30, - 29, 108, 57, 111, 108, 160, 154, 14, 232, 18, 27, 168, 170, 22, 59, 33, - 78, 117, 98, 193, 146, 145, 169, 160, 37, 227, 65, 12, 121, 172, 216, 156, - 225, 100, 85, 215, 183, 147, 157, 86, 174, 12, 170, 7, 90, 205, 18, 113, - 96, 38, 96, 15, 246, 50, 28, 13, 146, 155, 201, 12, 158, 216, 219, 91, - 24, 135, 53, 137, 53, 57, 140, 14, 183, 236, 243, 114, 233, 57, 94, 38, - 133, 79, 153, 129, 117, 105, 194, 185, 250, 75, 220, 128, 52, 161, 1, 68, - 88, 113, 133, 211, 32, 66, 98, 185, 53, 27, 181, 215, 176, 152, 145, 196, - 214, 128, 191, 249, 42, 239, 182, 146, 109, 68, 155, 157, 112, 172, 211, 186, - 201, 214, 30, 37, 130, 142, 141, 66, 83, 125, 152, 79, 55, 119, 243, 25, - 28, 51, 11, 154, 196, 82, 112, 36, 248, 199, 188, 19, 253, 224, 198, 84, - 66, 33, 218, 195, 109, 221, 156, 109, 58, 242, 184, 136, 98, 9, 177, 69, - 197, 128, 215, 76, 149, 79, 54, 134, 99, 231, 58, 166, 236, 27, 241, 54, - 151, 119, 47, 187, 4, 217, 197, 51, 48, 30, 120, 98, 65, 121, 165, 25, - 83, 23, 190, 52, 79, 194, 103, 213, 1, 120, 182, 157, 209, 246, 126, 1, - 56, 237, 137, 123, 112, 112, 127, 48, 108, 243, 201, 181, 1, 200, 68, 31, - 115, 212, 99, 68, 229, 218, 108, 11, 241, 143, 129, 105, 43, 209, 58, 217, - 28, 85, 132, 206, 181, 139, 212, 249, 11, 59, 35, 210, 61, 87, 136, 44, - 16, 189, 182, 247, 154, 208, 169, 100, 23, 72, 58, 132, 147, 128, 74, 111, - 117, 193, 247, 226, 123, 3, 179, 232, 68, 88, 226, 224, 20, 190, 223, 12, - 92, 112, 75, 233, 151, 194, 153, 4, 67, 229, 14, 24, 144, 152, 114, 179, - 162, 61, 155, 31, 51, 200, 126, 127, 250, 48, 238, 231, 78, 208, 94, 97, - 219, 203, 47, 136, 134, 0, 14, 211, 15, 79, 233, 186, 130, 33, 54, 32, - 195, 3, 75, 112, 120, 147, 20, 218, 157, 198, 233, 83, 172, 252, 36, 247, - 30, 38, 107, 118, 210, 129, 139, 143, 38, 209, 78, 7, 188, 62, 142, 89, - 12, 0, 149, 217, 73, 131, 54, 81, 101, 55, 84, 185, 39, 234, 234, 136, - 246, 178, 243, 234, 164, 127, 113, 79, 236, 4, 59, 22, 152, 244, 47, 239, - 27, 244, 204, 151, 53, 149, 96, 82, 185, 136, 163, 202, 214, 147, 30, 186, - 107, 89, 175, 177, 212, 91, 77, 64, 227, 118, 188, 70, 161, 183, 44, 237, - 157, 165, 28, 160, 95, 63, 227, 219, 146, 180, 29, 246, 216, 155, 219, 130, - 122, 68, 142, 30, 215, 108, 79, 34, 92, 73, 58, 222, 51, 175, 203, 227, - 231, 121, 122, 115, 72, 235, 2, 191, 128, 36, 86, 73, 13, 23, 159, 43, - 123, 63, 167, 174, 203, 61, 245, 242, 13, 87, 190, 99, 98, 106, 94, 129, - 83, 223, 106, 106, 147, 55, 122, 168, 218, 248, 145, 152, 152, 22, 221, 199, - 40, 213, 132, 12, 239, 14, 74, 56, 206, 181, 217, 165, 133, 197, 58, 64, - 245, 5, 7, 38, 90, 67, 65, 220, 183, 24, 215, 210, 240, 207, 18, 107, - 255, 44, 241, 181, 247, 60, 6, 163, 254, 44, 160, 50, 236, 156, 133, 77, - 218, 21, 170, 217, 243, 17, 56, 60, 32, 250, 132, 38, 108, 108, 195, 12, - 107, 198, 202, 118, 47, 156, 17, 109, 37, 200, 141, 179, 163, 231, 241, 118, - 199, 98, 242, 0, 225, 188, 38, 22, 11, 166, 112, 253, 171, 151, 38, 50, - 220, 42, 63, 192, 76, 186, 182, 152, 15, 52, 143, 146, 29, 17, 194, 99, - 57, 74, 76, 250, 56, 159, 126, 179, 35, 189, 84, 140, 82, 11, 48, 61, - 119, 124, 219, 231, 58, 7, 207, 150, 193, 244, 93, 241, 189, 209, 159, 40, - 31, 14, 154, 113, 183, 205, 178, 49, 81, 221, 95, 0, 64, 30, 67, 154, - 1, 192, 110, 234, 106, 1, 122, 202, 246, 114, 105, 31, 251, 216, 155, 32, - 175, 70, 114, 250, 249, 130, 142, 109, 241, 238, 198, 29, 163, 31, 233, 32, - 109, 191, 190, 103, 221, 244, 220, 175, 202, 33, 93, 174, 99, 203, 123, 53, - 171, 85, 34, 43, 72, 132, 176, 159, 39, 196, 126, 21, 207, 252, 251, 138, - 178, 227, 189, 162, 236, 232, 51, 121, 103, 169, 91, 172, 121, 103, 221, 7, - 5, 65, 118, 188, 83, 212, 247, 25, 60, 244, 239, 47, 226, 254, 50, 150, - 250, 255, 19, 50, 239, 9, 166, 125, 129, 103, 102, 57, 184, 105, 199, 151, - 74, 194, 151, 163, 254, 253, 84, 84, 242, 84, 128, 158, 193, 180, 69, 12, - 198, 242, 202, 192, 75, 200, 222, 124, 148, 184, 195, 201, 98, 100, 77, 52, - 38, 179, 217, 8, 46, 152, 22, 35, 218, 109, 158, 12, 96, 34, 37, 169, - 177, 192, 124, 254, 8, 91, 182, 194, 217, 88, 54, 211, 67, 177, 34, 160, - 193, 88, 77, 166, 218, 162, 77, 12, 246, 24, 95, 148, 115, 191, 103, 61, - 125, 110, 0, 220, 63, 220, 128, 71, 161, 22, 125, 226, 28, 85, 237, 74, - 79, 176, 22, 108, 203, 210, 174, 90, 14, 249, 214, 149, 194, 24, 229, 250, - 16, 176, 244, 124, 63, 8, 101, 148, 66, 255, 106, 174, 50, 46, 120, 14, - 63, 177, 138, 40, 89, 252, 206, 174, 139, 223, 233, 27, 190, 47, 150, 131, - 121, 25, 165, 21, 238, 116, 250, 20, 167, 21, 238, 223, 202, 174, 141, 159, - 56, 217, 229, 203, 87, 95, 209, 164, 130, 59, 112, 93, 163, 18, 177, 186, - 225, 0, 185, 163, 244, 242, 82, 215, 68, 32, 38, 37, 164, 93, 118, 84, - 36, 169, 171, 217, 192, 144, 122, 142, 114, 131, 247, 220, 177, 223, 59, 248, - 222, 177, 223, 59, 74, 39, 19, 53, 245, 237, 57, 211, 132, 128, 202, 156, - 49, 242, 182, 131, 212, 205, 58, 221, 22, 191, 108, 198, 119, 234, 203, 115, - 3, 130, 189, 151, 49, 255, 236, 72, 45, 43, 209, 99, 237, 12, 34, 35, - 159, 41, 89, 48, 78, 68, 15, 217, 155, 204, 152, 76, 134, 3, 159, 193, - 152, 251, 5, 206, 48, 226, 107, 229, 175, 50, 130, 167, 12, 87, 40, 198, - 8, 237, 34, 14, 139, 181, 44, 44, 222, 218, 204, 59, 200, 188, 243, 57, - 153, 211, 90, 150, 212, 47, 148, 186, 65, 213, 99, 96, 64, 122, 26, 39, - 91, 149, 79, 249, 34, 95, 187, 178, 94, 80, 173, 83, 97, 119, 240, 244, - 46, 191, 30, 141, 236, 150, 167, 71, 127, 58, 87, 75, 111, 221, 236, 175, - 39, 159, 121, 41, 133, 146, 82, 250, 147, 224, 15, 223, 35, 27, 226, 117, - 218, 249, 228, 105, 179, 246, 19, 38, 222, 67, 33, 225, 157, 182, 24, 213, - 15, 57, 81, 218, 184, 175, 207, 92, 80, 103, 78, 20, 67, 254, 248, 178, - 5, 229, 39, 126, 161, 145, 106, 37, 24, 241, 70, 162, 239, 140, 100, 223, - 195, 248, 178, 171, 210, 12, 172, 157, 185, 241, 206, 244, 181, 17, 170, 255, - 35, 187, 189, 32, 61, 255, 156, 113, 168, 102, 148, 3, 202, 116, 52, 77, - 107, 153, 129, 181, 175, 9, 164, 1, 197, 65, 219, 41, 97, 255, 12, 181, - 2, 23, 92, 77, 107, 20, 88, 29, 3, 7, 84, 205, 33, 117, 147, 157, - 195, 237, 32, 141, 59, 157, 188, 161, 94, 30, 21, 198, 189, 93, 28, 247, - 32, 225, 129, 111, 239, 24, 248, 143, 165, 35, 207, 143, 31, 233, 241, 127, - 213, 28, 144, 159, 143, 175, 157, 10, 153, 22, 21, 84, 100, 212, 82, 83, - 163, 103, 71, 77, 83, 117, 187, 215, 222, 154, 129, 237, 94, 177, 2, 55, - 31, 119, 142, 69, 103, 231, 88, 64, 227, 69, 62, 101, 6, 195, 44, 194, - 191, 101, 229, 109, 254, 225, 27, 222, 102, 215, 134, 183, 249, 187, 110, 120, - 155, 87, 109, 120, 81, 200, 91, 158, 65, 52, 84, 202, 66, 59, 197, 168, - 134, 98, 182, 32, 125, 113, 157, 239, 149, 236, 181, 18, 228, 168, 219, 240, - 57, 140, 97, 2, 97, 49, 250, 146, 29, 241, 168, 157, 99, 137, 103, 33, - 250, 218, 59, 226, 81, 63, 12, 37, 222, 11, 203, 8, 153, 93, 109, 200, - 21, 238, 203, 16, 15, 67, 5, 31, 123, 59, 96, 236, 89, 53, 109, 126, - 49, 38, 242, 202, 67, 142, 47, 30, 116, 132, 114, 222, 121, 168, 78, 238, - 239, 146, 254, 114, 48, 193, 32, 194, 241, 193, 98, 57, 90, 133, 189, 254, - 172, 63, 221, 44, 169, 78, 203, 65, 127, 202, 52, 179, 13, 41, 222, 241, - 108, 102, 212, 251, 153, 216, 130, 65, 208, 227, 140, 123, 90, 23, 220, 177, - 60, 154, 13, 139, 96, 18, 176, 150, 189, 153, 204, 0, 226, 40, 21, 234, - 47, 28, 59, 227, 140, 77, 154, 200, 190, 151, 59, 140, 67, 93, 59, 73, - 198, 251, 20, 157, 112, 1, 251, 92, 210, 121, 32, 72, 26, 26, 13, 75, - 137, 214, 1, 207, 68, 77, 239, 83, 109, 22, 10, 45, 140, 109, 53, 179, - 53, 220, 183, 84, 164, 227, 210, 43, 169, 185, 122, 189, 198, 30, 149, 237, - 202, 52, 62, 206, 6, 90, 102, 54, 145, 219, 172, 92, 111, 34, 129, 172, - 186, 221, 157, 154, 94, 25, 103, 204, 215, 37, 235, 209, 14, 113, 232, 185, - 195, 109, 173, 47, 253, 175, 126, 142, 58, 201, 215, 193, 193, 191, 208, 239, - 73, 181, 86, 111, 132, 205, 214, 81, 100, 174, 93, 206, 206, 47, 210, 203, - 111, 254, 245, 15, 127, 252, 211, 159, 255, 219, 191, 125, 251, 223, 191, 251, - 63, 254, 207, 255, 241, 246, 221, 255, 245, 253, 255, 124, 255, 195, 95, 254, - 253, 63, 254, 243, 199, 159, 254, 239, 159, 227, 118, 251, 231, 159, 233, 111, - 247, 67, 239, 231, 184, 19, 245, 111, 6, 84, 169, 187, 241, 228, 151, 95, - 167, 247, 179, 249, 195, 95, 23, 203, 213, 227, 211, 51, 237, 135, 63, 199, - 39, 237, 223, 232, 79, 231, 255, 217, 86, 194, 10, 155, 120, 86, 50, 160, - 167, 199, 14, 230, 105, 226, 94, 88, 117, 228, 155, 117, 236, 172, 166, 145, - 227, 13, 43, 63, 125, 244, 86, 32, 195, 193, 102, 69, 176, 233, 150, 190, - 247, 185, 127, 153, 219, 182, 65, 57, 182, 91, 143, 133, 142, 43, 236, 183, - 66, 216, 144, 98, 140, 165, 195, 97, 208, 61, 52, 110, 151, 122, 108, 160, - 159, 190, 4, 95, 93, 210, 186, 4, 212, 101, 245, 229, 16, 214, 68, 184, - 111, 209, 114, 192, 231, 173, 247, 167, 244, 229, 191, 222, 36, 255, 181, 149, - 91, 153, 249, 128, 86, 63, 109, 56, 255, 26, 92, 110, 183, 30, 251, 146, - 15, 254, 228, 120, 146, 207, 6, 177, 211, 59, 79, 59, 116, 140, 174, 61, - 248, 14, 102, 7, 194, 234, 26, 195, 56, 158, 7, 118, 36, 227, 71, 74, - 56, 213, 135, 40, 140, 228, 44, 185, 102, 133, 252, 151, 38, 113, 35, 189, - 231, 173, 189, 202, 176, 114, 124, 255, 134, 47, 128, 20, 122, 66, 223, 255, - 40, 240, 129, 211, 171, 152, 5, 82, 159, 76, 110, 82, 240, 31, 218, 69, - 89, 92, 5, 85, 162, 38, 116, 95, 246, 184, 172, 54, 136, 93, 188, 129, - 25, 4, 7, 111, 246, 140, 45, 89, 115, 93, 1, 227, 135, 210, 70, 57, - 27, 219, 224, 241, 145, 232, 172, 8, 7, 22, 92, 242, 142, 208, 123, 30, - 167, 129, 122, 8, 131, 25, 109, 144, 179, 177, 32, 94, 152, 175, 42, 144, - 120, 47, 198, 237, 221, 128, 177, 241, 151, 138, 26, 91, 211, 219, 179, 175, - 45, 184, 140, 94, 12, 218, 185, 167, 21, 214, 76, 16, 94, 247, 96, 48, - 81, 69, 36, 232, 29, 176, 122, 0, 245, 97, 83, 63, 44, 255, 202, 97, - 252, 39, 54, 55, 77, 97, 226, 111, 48, 184, 127, 66, 251, 54, 247, 91, - 53, 214, 218, 85, 27, 118, 255, 63, 177, 6, 97, 100, 177, 206, 43, 65, - 183, 66, 236, 104, 227, 150, 229, 171, 127, 242, 129, 37, 206, 55, 8, 89, - 73, 160, 171, 111, 203, 51, 130, 34, 75, 31, 20, 178, 226, 14, 25, 248, - 64, 100, 135, 86, 144, 196, 82, 154, 25, 206, 204, 190, 239, 63, 176, 188, - 87, 180, 28, 150, 80, 220, 166, 153, 18, 124, 197, 72, 148, 63, 207, 40, - 138, 7, 77, 112, 140, 138, 94, 35, 102, 1, 165, 193, 139, 126, 252, 217, - 71, 177, 33, 173, 2, 25, 33, 19, 5, 193, 104, 3, 46, 103, 158, 207, - 2, 29, 30, 98, 133, 83, 199, 72, 219, 50, 109, 52, 232, 163, 254, 163, - 175, 135, 63, 115, 252, 209, 230, 113, 183, 152, 12, 29, 35, 147, 93, 150, - 33, 34, 161, 225, 136, 159, 97, 40, 160, 172, 67, 202, 182, 101, 93, 116, - 124, 236, 185, 245, 112, 169, 212, 221, 246, 28, 249, 218, 88, 75, 242, 93, - 68, 76, 85, 137, 187, 107, 198, 205, 168, 1, 95, 229, 245, 2, 73, 29, - 75, 182, 63, 108, 67, 185, 200, 75, 212, 101, 113, 62, 93, 221, 164, 219, - 17, 93, 136, 216, 24, 87, 119, 202, 46, 4, 179, 88, 221, 14, 194, 182, - 167, 94, 66, 128, 168, 150, 247, 198, 163, 117, 255, 110, 62, 99, 8, 153, - 140, 239, 62, 86, 69, 81, 198, 112, 23, 105, 156, 31, 31, 155, 14, 217, - 228, 149, 243, 63, 73, 230, 102, 125, 247, 209, 9, 172, 74, 74, 163, 150, - 86, 199, 162, 185, 218, 159, 173, 38, 253, 233, 164, 79, 164, 67, 169, 8, - 109, 87, 83, 146, 142, 183, 187, 133, 89, 187, 46, 241, 243, 151, 49, 238, - 18, 21, 141, 56, 163, 162, 81, 201, 207, 135, 108, 219, 171, 32, 94, 138, - 214, 32, 25, 207, 128, 250, 4, 19, 203, 194, 188, 109, 136, 158, 51, 234, - 196, 250, 211, 119, 247, 119, 237, 225, 225, 54, 60, 14, 143, 107, 174, 243, - 88, 168, 12, 60, 76, 142, 18, 214, 25, 136, 195, 19, 229, 23, 22, 190, - 96, 91, 240, 1, 72, 243, 163, 111, 188, 58, 178, 19, 14, 136, 164, 186, - 226, 56, 54, 241, 146, 240, 88, 82, 132, 240, 157, 106, 78, 141, 141, 223, - 96, 185, 241, 65, 203, 63, 246, 23, 79, 58, 3, 199, 19, 108, 219, 81, - 9, 115, 83, 198, 202, 144, 164, 14, 93, 65, 81, 86, 240, 26, 80, 218, - 124, 161, 93, 117, 85, 109, 99, 55, 116, 95, 143, 112, 187, 223, 234, 122, - 224, 108, 134, 16, 63, 39, 190, 122, 244, 219, 234, 201, 239, 64, 235, 211, - 59, 130, 197, 125, 75, 46, 93, 189, 217, 38, 125, 137, 27, 114, 202, 208, - 241, 86, 15, 98, 125, 252, 172, 177, 61, 235, 79, 184, 34, 58, 26, 215, - 219, 71, 85, 85, 92, 157, 225, 190, 17, 145, 101, 170, 172, 43, 59, 91, - 211, 30, 186, 161, 224, 151, 78, 93, 215, 138, 8, 255, 68, 92, 33, 74, - 67, 162, 144, 206, 50, 218, 5, 64, 211, 99, 99, 253, 132, 190, 166, 146, - 105, 142, 251, 52, 152, 79, 163, 5, 205, 129, 232, 19, 107, 78, 220, 161, - 62, 2, 128, 237, 76, 95, 110, 10, 80, 254, 37, 107, 153, 169, 16, 161, - 159, 51, 65, 176, 45, 114, 23, 166, 86, 48, 102, 237, 52, 29, 198, 76, - 24, 179, 171, 249, 69, 235, 20, 252, 154, 85, 171, 111, 140, 217, 164, 41, - 131, 113, 50, 158, 47, 38, 31, 231, 179, 149, 210, 100, 167, 102, 175, 38, - 3, 126, 33, 190, 117, 49, 103, 90, 31, 138, 236, 172, 155, 250, 155, 223, - 73, 137, 208, 162, 42, 240, 109, 237, 111, 126, 55, 157, 204, 204, 107, 25, - 0, 138, 115, 99, 173, 156, 8, 36, 162, 104, 150, 233, 157, 52, 19, 197, - 253, 174, 12, 195, 236, 214, 162, 251, 202, 217, 98, 178, 61, 86, 122, 3, - 190, 115, 228, 142, 33, 166, 106, 243, 229, 99, 201, 200, 58, 226, 250, 88, - 239, 45, 108, 19, 19, 151, 251, 216, 146, 135, 139, 180, 235, 8, 235, 141, - 158, 187, 145, 217, 219, 238, 23, 193, 189, 238, 127, 122, 75, 210, 138, 26, - 0, 122, 105, 211, 11, 141, 64, 69, 121, 221, 202, 108, 98, 185, 185, 80, - 178, 139, 233, 25, 192, 221, 203, 66, 125, 233, 119, 81, 234, 114, 166, 135, - 127, 136, 59, 2, 98, 162, 43, 135, 162, 180, 165, 119, 59, 213, 235, 14, - 25, 207, 193, 70, 82, 208, 117, 212, 233, 61, 141, 86, 32, 182, 173, 198, - 100, 174, 163, 48, 236, 233, 177, 187, 245, 130, 183, 33, 253, 143, 77, 96, - 125, 41, 155, 87, 226, 238, 123, 8, 232, 216, 128, 141, 19, 191, 242, 213, - 26, 25, 125, 181, 193, 223, 117, 154, 110, 42, 216, 73, 19, 190, 175, 181, - 68, 116, 226, 153, 196, 3, 83, 133, 238, 214, 58, 230, 101, 98, 103, 170, - 191, 180, 243, 53, 202, 222, 33, 64, 134, 191, 190, 76, 55, 249, 42, 38, - 78, 126, 78, 101, 165, 246, 41, 253, 49, 56, 252, 105, 43, 215, 194, 105, - 255, 102, 52, 101, 237, 108, 175, 202, 230, 233, 106, 75, 146, 205, 189, 29, - 138, 219, 238, 136, 41, 67, 92, 88, 51, 165, 144, 169, 149, 199, 8, 5, - 202, 85, 208, 91, 81, 238, 122, 43, 58, 93, 177, 47, 223, 84, 0, 181, - 43, 202, 39, 203, 38, 121, 105, 215, 203, 178, 72, 232, 139, 85, 104, 50, - 201, 117, 112, 166, 74, 217, 52, 246, 147, 164, 116, 70, 196, 246, 124, 178, - 123, 46, 24, 173, 182, 226, 172, 216, 217, 229, 185, 139, 217, 220, 28, 209, - 126, 160, 240, 186, 145, 215, 177, 122, 197, 12, 194, 47, 15, 49, 102, 211, - 238, 106, 198, 175, 152, 32, 23, 238, 4, 217, 215, 144, 221, 181, 205, 213, - 243, 19, 21, 91, 142, 126, 207, 25, 155, 175, 208, 230, 115, 123, 202, 154, - 179, 138, 146, 14, 43, 139, 16, 55, 199, 10, 31, 151, 96, 88, 197, 46, - 129, 97, 239, 23, 124, 169, 174, 244, 5, 47, 161, 132, 78, 135, 53, 80, - 165, 148, 241, 194, 133, 141, 196, 223, 19, 34, 10, 160, 185, 73, 133, 64, - 129, 18, 31, 66, 254, 35, 103, 120, 98, 52, 72, 224, 39, 65, 206, 114, - 225, 36, 175, 51, 71, 186, 215, 184, 29, 136, 215, 91, 217, 176, 252, 95, - 196, 24, 219, 40, 247, 5, 29, 58, 112, 125, 235, 118, 65, 170, 224, 42, - 132, 120, 138, 53, 106, 57, 154, 32, 152, 243, 253, 5, 228, 204, 218, 21, - 77, 129, 31, 250, 31, 58, 10, 179, 68, 18, 109, 254, 90, 137, 242, 94, - 94, 168, 145, 47, 157, 88, 162, 98, 133, 236, 41, 22, 185, 135, 152, 35, - 18, 178, 53, 20, 70, 201, 212, 113, 47, 135, 228, 24, 180, 194, 184, 201, - 47, 152, 181, 178, 251, 213, 125, 122, 68, 183, 152, 151, 183, 152, 141, 248, - 203, 196, 232, 213, 135, 8, 179, 149, 40, 239, 167, 145, 217, 249, 212, 32, - 132, 47, 255, 26, 109, 43, 117, 184, 220, 174, 188, 252, 107, 76, 143, 27, - 121, 76, 182, 66, 200, 57, 252, 171, 154, 142, 124, 66, 127, 117, 20, 0, - 8, 136, 38, 108, 176, 20, 173, 69, 225, 252, 93, 108, 169, 140, 57, 238, - 30, 149, 9, 218, 144, 123, 203, 7, 0, 9, 162, 107, 123, 179, 27, 253, - 198, 84, 30, 227, 201, 246, 24, 114, 74, 171, 68, 204, 144, 30, 36, 214, - 27, 42, 111, 116, 215, 98, 10, 11, 38, 59, 252, 98, 85, 33, 222, 246, - 31, 24, 190, 15, 14, 0, 84, 254, 85, 141, 198, 212, 23, 153, 237, 161, - 45, 237, 16, 184, 192, 140, 178, 42, 66, 224, 12, 214, 63, 220, 180, 49, - 164, 45, 176, 63, 10, 58, 21, 166, 196, 254, 96, 48, 95, 136, 248, 87, - 128, 118, 89, 118, 52, 95, 42, 55, 4, 20, 50, 89, 248, 172, 188, 169, - 232, 185, 79, 193, 209, 118, 78, 13, 84, 253, 177, 127, 3, 68, 144, 151, - 83, 72, 221, 47, 65, 254, 176, 163, 118, 0, 112, 94, 241, 93, 124, 53, - 110, 4, 151, 181, 163, 248, 88, 121, 234, 117, 251, 149, 102, 113, 182, 155, - 95, 7, 230, 17, 25, 21, 10, 203, 250, 37, 118, 146, 59, 29, 12, 21, - 56, 149, 185, 214, 126, 183, 93, 103, 166, 59, 12, 61, 33, 223, 17, 157, - 178, 107, 255, 175, 143, 224, 102, 63, 142, 220, 48, 190, 19, 137, 61, 37, - 85, 130, 206, 25, 202, 138, 160, 116, 160, 158, 131, 23, 150, 243, 141, 117, - 192, 78, 229, 55, 107, 225, 15, 143, 219, 157, 58, 152, 23, 103, 71, 197, - 246, 87, 231, 37, 71, 204, 21, 35, 179, 226, 57, 2, 76, 171, 72, 34, - 26, 74, 41, 50, 51, 249, 169, 149, 211, 43, 168, 158, 95, 80, 69, 13, - 74, 0, 45, 25, 129, 68, 243, 223, 68, 142, 57, 154, 69, 25, 72, 184, - 14, 73, 121, 29, 146, 76, 29, 226, 47, 170, 131, 91, 240, 114, 4, 55, - 206, 12, 67, 128, 110, 123, 199, 221, 230, 158, 73, 210, 133, 75, 253, 45, - 107, 88, 217, 55, 73, 214, 148, 252, 131, 116, 249, 243, 22, 41, 3, 250, - 174, 105, 147, 186, 250, 244, 76, 236, 56, 156, 43, 210, 9, 112, 174, 31, - 62, 208, 64, 156, 191, 4, 99, 229, 106, 17, 212, 44, 235, 244, 43, 97, - 101, 98, 250, 57, 39, 177, 220, 121, 28, 185, 231, 155, 22, 69, 18, 163, - 105, 122, 167, 241, 220, 95, 128, 166, 227, 52, 204, 130, 62, 233, 79, 180, - 135, 105, 13, 78, 125, 182, 58, 104, 134, 125, 246, 156, 50, 89, 246, 24, - 114, 207, 234, 29, 175, 28, 112, 238, 222, 114, 190, 88, 245, 6, 152, 218, - 11, 154, 202, 14, 60, 38, 0, 113, 243, 142, 64, 102, 128, 45, 242, 193, - 195, 77, 71, 249, 187, 154, 191, 140, 29, 180, 109, 5, 182, 4, 59, 13, - 42, 112, 153, 185, 46, 154, 141, 158, 253, 234, 58, 220, 192, 135, 221, 45, - 173, 175, 165, 189, 7, 154, 204, 32, 239, 207, 101, 12, 164, 206, 123, 128, - 18, 178, 124, 40, 223, 22, 13, 68, 171, 240, 95, 11, 186, 94, 128, 135, - 93, 141, 4, 206, 149, 170, 78, 75, 114, 81, 168, 122, 129, 9, 221, 213, - 103, 90, 237, 49, 219, 97, 169, 182, 251, 40, 57, 112, 173, 39, 142, 134, - 222, 246, 214, 188, 159, 157, 116, 15, 176, 227, 65, 240, 222, 187, 235, 223, - 223, 247, 175, 100, 34, 202, 174, 199, 131, 202, 3, 24, 121, 106, 28, 141, - 190, 164, 82, 151, 52, 6, 39, 102, 191, 226, 49, 211, 183, 52, 187, 198, - 74, 33, 116, 126, 117, 145, 184, 102, 45, 28, 38, 151, 11, 195, 237, 37, - 45, 218, 61, 8, 106, 63, 228, 102, 132, 26, 96, 128, 233, 78, 71, 48, - 200, 225, 179, 111, 78, 231, 194, 136, 152, 205, 129, 26, 132, 170, 152, 204, - 199, 181, 150, 255, 195, 120, 254, 56, 29, 178, 63, 247, 155, 145, 159, 252, - 185, 85, 81, 150, 53, 230, 10, 56, 175, 58, 110, 201, 129, 217, 61, 156, - 181, 115, 156, 217, 189, 208, 90, 151, 178, 37, 240, 152, 240, 252, 106, 134, - 149, 128, 182, 112, 53, 179, 56, 50, 76, 236, 60, 184, 125, 247, 38, 124, - 187, 65, 68, 25, 109, 49, 204, 62, 17, 113, 1, 120, 37, 190, 41, 225, - 135, 177, 56, 130, 149, 187, 19, 126, 32, 170, 99, 57, 157, 175, 210, 38, - 224, 96, 102, 61, 60, 247, 104, 10, 245, 137, 214, 189, 53, 171, 155, 245, - 201, 89, 50, 53, 1, 98, 223, 37, 209, 14, 27, 121, 139, 229, 237, 89, - 222, 18, 121, 27, 203, 91, 155, 223, 60, 155, 37, 109, 46, 184, 122, 150, - 17, 121, 190, 76, 131, 231, 164, 34, 246, 11, 99, 122, 25, 235, 23, 147, - 224, 34, 13, 50, 117, 82, 85, 165, 94, 201, 86, 213, 166, 0, 225, 205, - 61, 198, 69, 32, 248, 18, 66, 6, 91, 117, 4, 101, 106, 175, 2, 108, - 3, 84, 128, 109, 131, 4, 168, 59, 241, 68, 96, 227, 55, 122, 109, 83, - 15, 210, 8, 112, 16, 110, 195, 228, 174, 130, 118, 43, 78, 117, 237, 161, - 78, 177, 8, 0, 170, 180, 179, 82, 131, 107, 117, 92, 168, 63, 195, 154, - 123, 12, 101, 186, 26, 203, 242, 70, 253, 164, 16, 139, 234, 242, 236, 198, - 226, 38, 113, 134, 212, 89, 156, 68, 247, 100, 114, 17, 208, 120, 78, 84, - 161, 126, 245, 37, 88, 139, 54, 92, 176, 225, 13, 93, 158, 199, 53, 179, - 26, 198, 148, 98, 236, 166, 160, 6, 188, 4, 27, 81, 156, 131, 154, 223, - 139, 20, 187, 173, 137, 92, 96, 57, 250, 188, 146, 146, 87, 23, 149, 45, - 137, 254, 215, 32, 61, 95, 5, 95, 109, 253, 72, 223, 193, 224, 250, 133, - 102, 179, 174, 73, 16, 123, 178, 0, 123, 52, 76, 208, 48, 14, 158, 99, - 212, 163, 201, 146, 150, 113, 28, 170, 46, 83, 145, 158, 84, 164, 113, 140, - 98, 37, 210, 115, 140, 134, 10, 218, 36, 96, 10, 76, 118, 208, 162, 224, - 74, 199, 122, 152, 98, 30, 1, 122, 139, 241, 150, 208, 91, 156, 205, 28, - 73, 184, 107, 226, 16, 25, 219, 1, 172, 178, 115, 227, 231, 24, 111, 16, - 218, 234, 78, 209, 165, 97, 130, 171, 92, 182, 94, 118, 70, 61, 195, 4, - 76, 187, 236, 13, 35, 167, 51, 105, 7, 147, 234, 243, 12, 225, 177, 138, - 85, 23, 234, 251, 185, 141, 166, 94, 198, 201, 165, 36, 160, 169, 207, 13, - 138, 149, 151, 229, 113, 156, 137, 174, 71, 57, 83, 7, 78, 163, 235, 176, - 209, 117, 144, 134, 114, 29, 18, 206, 244, 69, 53, 89, 13, 124, 161, 14, - 207, 84, 135, 103, 93, 105, 241, 227, 140, 62, 65, 244, 56, 87, 7, 7, - 119, 73, 153, 63, 5, 95, 93, 210, 52, 151, 171, 74, 57, 116, 83, 179, - 99, 190, 243, 173, 83, 102, 249, 134, 11, 70, 137, 164, 2, 232, 36, 81, - 77, 50, 119, 128, 58, 130, 251, 225, 86, 92, 50, 105, 54, 231, 209, 87, - 201, 29, 182, 246, 225, 241, 227, 71, 198, 71, 84, 82, 109, 98, 105, 149, - 48, 27, 168, 79, 204, 235, 188, 227, 191, 131, 199, 197, 19, 165, 93, 140, - 28, 200, 20, 54, 138, 154, 177, 83, 177, 165, 66, 17, 158, 16, 107, 184, - 9, 221, 235, 41, 231, 66, 234, 59, 166, 19, 84, 145, 74, 25, 129, 29, - 65, 230, 252, 16, 178, 214, 49, 195, 46, 142, 230, 152, 72, 155, 61, 103, - 190, 8, 156, 149, 136, 185, 27, 243, 13, 213, 219, 244, 157, 64, 7, 152, - 74, 195, 162, 54, 3, 151, 98, 2, 118, 54, 128, 191, 10, 221, 224, 92, - 127, 29, 119, 50, 212, 130, 106, 71, 232, 153, 62, 44, 220, 89, 81, 125, - 182, 175, 64, 36, 44, 83, 4, 207, 124, 96, 253, 47, 249, 210, 185, 204, - 249, 172, 61, 238, 24, 167, 181, 214, 102, 184, 139, 86, 40, 196, 149, 150, - 210, 215, 195, 67, 14, 193, 128, 161, 174, 84, 19, 180, 152, 184, 96, 134, - 97, 58, 18, 118, 8, 14, 6, 75, 112, 204, 214, 195, 170, 11, 125, 167, - 11, 97, 176, 39, 186, 72, 246, 114, 237, 84, 49, 92, 184, 61, 227, 53, - 212, 185, 4, 196, 69, 79, 74, 191, 186, 134, 82, 9, 5, 54, 5, 135, - 161, 121, 186, 213, 144, 35, 177, 217, 119, 219, 249, 20, 29, 74, 209, 118, - 82, 56, 104, 24, 6, 228, 36, 6, 160, 30, 229, 0, 200, 15, 98, 232, - 142, 160, 64, 70, 44, 16, 91, 94, 16, 101, 57, 92, 176, 46, 183, 2, - 51, 193, 82, 142, 197, 122, 214, 60, 190, 48, 2, 151, 10, 145, 71, 255, - 129, 115, 102, 228, 19, 190, 16, 243, 99, 185, 226, 53, 151, 80, 70, 152, - 106, 47, 160, 120, 11, 96, 221, 86, 61, 103, 188, 247, 68, 62, 28, 187, - 60, 88, 144, 100, 110, 22, 131, 247, 84, 228, 123, 176, 42, 150, 213, 242, - 224, 74, 130, 247, 231, 199, 139, 148, 209, 88, 228, 242, 76, 198, 133, 50, - 236, 212, 31, 171, 48, 169, 4, 211, 153, 192, 57, 238, 175, 179, 249, 13, - 133, 119, 37, 60, 66, 120, 12, 177, 125, 149, 56, 146, 232, 252, 103, 239, - 133, 226, 53, 2, 73, 223, 0, 31, 255, 210, 12, 80, 72, 61, 104, 215, - 113, 201, 42, 81, 58, 153, 40, 42, 93, 187, 155, 77, 72, 209, 235, 156, - 86, 39, 202, 125, 175, 82, 4, 10, 66, 141, 106, 153, 136, 221, 215, 70, - 60, 254, 68, 137, 199, 187, 170, 121, 186, 175, 121, 53, 161, 174, 112, 155, - 17, 97, 239, 86, 108, 191, 50, 42, 195, 197, 3, 198, 1, 67, 105, 174, - 104, 171, 44, 202, 63, 79, 120, 116, 88, 67, 255, 189, 230, 39, 219, 234, - 69, 93, 250, 42, 150, 178, 13, 81, 24, 7, 65, 85, 40, 206, 188, 109, - 174, 154, 93, 85, 88, 223, 62, 170, 201, 31, 92, 138, 18, 19, 110, 91, - 53, 30, 60, 230, 236, 106, 175, 48, 242, 127, 154, 56, 191, 191, 52, 178, - 80, 126, 124, 236, 237, 168, 211, 167, 229, 145, 78, 37, 255, 225, 2, 201, - 15, 137, 136, 36, 213, 239, 186, 46, 194, 201, 18, 65, 165, 183, 87, 80, - 137, 60, 140, 168, 82, 191, 36, 248, 130, 92, 233, 185, 109, 197, 153, 29, - 43, 206, 236, 254, 227, 196, 153, 34, 10, 50, 67, 195, 27, 30, 14, 248, - 40, 116, 39, 141, 120, 213, 213, 243, 101, 216, 212, 2, 78, 127, 116, 11, - 20, 134, 215, 207, 31, 156, 204, 111, 211, 83, 141, 222, 88, 58, 149, 140, - 41, 158, 91, 189, 56, 10, 79, 253, 225, 98, 254, 192, 214, 148, 243, 103, - 4, 192, 223, 165, 120, 166, 227, 4, 94, 174, 61, 70, 39, 232, 212, 168, - 76, 91, 40, 12, 110, 148, 168, 164, 151, 54, 43, 231, 57, 152, 185, 239, - 32, 102, 217, 173, 76, 193, 204, 28, 99, 101, 244, 88, 213, 154, 149, 70, - 50, 131, 129, 207, 78, 223, 179, 182, 79, 97, 165, 134, 189, 254, 61, 242, - 124, 116, 96, 225, 242, 253, 47, 102, 64, 95, 210, 249, 22, 88, 217, 148, - 146, 38, 101, 183, 230, 13, 183, 134, 12, 160, 25, 121, 217, 74, 59, 26, - 168, 65, 22, 234, 13, 90, 168, 133, 190, 54, 107, 185, 216, 132, 92, 71, - 235, 202, 57, 104, 202, 59, 160, 58, 24, 210, 219, 159, 205, 225, 125, 150, - 237, 119, 45, 164, 66, 226, 43, 57, 155, 194, 87, 16, 171, 232, 29, 43, - 96, 213, 255, 235, 227, 100, 150, 25, 0, 133, 91, 128, 138, 102, 69, 248, - 183, 147, 197, 114, 197, 2, 252, 105, 159, 31, 218, 169, 194, 17, 5, 204, - 31, 49, 0, 163, 219, 176, 119, 51, 95, 12, 71, 139, 222, 106, 60, 25, - 252, 170, 244, 189, 77, 160, 186, 59, 231, 160, 140, 234, 194, 46, 229, 57, - 85, 51, 69, 18, 124, 190, 254, 92, 8, 42, 21, 117, 82, 64, 59, 249, - 138, 9, 45, 156, 173, 153, 145, 139, 185, 125, 80, 58, 63, 84, 13, 79, - 61, 211, 137, 229, 146, 250, 215, 160, 110, 179, 57, 67, 87, 105, 75, 116, - 15, 114, 176, 128, 108, 39, 28, 156, 136, 39, 155, 224, 84, 249, 178, 201, - 88, 61, 100, 212, 253, 118, 244, 95, 94, 193, 11, 189, 3, 90, 209, 151, - 94, 240, 77, 223, 48, 61, 171, 2, 141, 214, 215, 241, 110, 253, 135, 147, - 215, 192, 9, 22, 65, 95, 97, 109, 254, 210, 132, 104, 231, 121, 156, 185, - 46, 47, 96, 120, 25, 184, 5, 131, 200, 213, 173, 64, 228, 103, 140, 13, - 129, 172, 81, 7, 110, 6, 240, 193, 115, 207, 205, 46, 94, 243, 47, 96, - 183, 5, 162, 216, 49, 89, 236, 134, 244, 191, 152, 44, 118, 181, 201, 98, - 87, 80, 98, 64, 37, 183, 252, 195, 184, 153, 212, 97, 241, 124, 177, 57, - 26, 215, 14, 97, 179, 28, 116, 188, 221, 248, 12, 89, 252, 68, 136, 234, - 26, 162, 227, 218, 151, 177, 26, 56, 231, 17, 4, 223, 3, 223, 177, 120, - 1, 3, 129, 255, 169, 111, 227, 200, 106, 145, 180, 137, 119, 109, 137, 152, - 196, 246, 243, 253, 147, 220, 21, 63, 210, 201, 88, 19, 89, 171, 103, 47, - 238, 125, 86, 230, 141, 124, 87, 231, 192, 100, 242, 121, 103, 229, 234, 145, - 24, 26, 214, 178, 156, 142, 158, 70, 83, 49, 130, 238, 131, 195, 185, 220, - 139, 30, 170, 186, 0, 198, 32, 212, 207, 185, 77, 93, 101, 250, 37, 123, - 57, 215, 34, 125, 35, 160, 233, 168, 70, 122, 170, 144, 189, 202, 192, 63, - 133, 183, 213, 90, 84, 90, 135, 138, 171, 69, 139, 124, 247, 73, 44, 245, - 75, 34, 207, 52, 223, 129, 198, 122, 227, 2, 99, 157, 194, 236, 32, 179, - 160, 91, 202, 184, 79, 61, 116, 89, 49, 83, 45, 234, 220, 217, 80, 232, - 135, 50, 160, 79, 105, 42, 107, 47, 89, 126, 179, 202, 176, 199, 240, 82, - 163, 117, 149, 186, 220, 54, 117, 96, 31, 151, 156, 33, 246, 146, 10, 87, - 57, 56, 159, 19, 125, 59, 199, 119, 114, 180, 226, 115, 107, 81, 157, 237, - 250, 122, 38, 56, 230, 213, 49, 90, 204, 135, 35, 168, 64, 10, 58, 69, - 139, 152, 20, 160, 83, 60, 111, 155, 207, 196, 162, 128, 171, 172, 42, 180, - 138, 49, 189, 119, 132, 99, 164, 181, 230, 170, 27, 240, 106, 84, 232, 20, - 85, 5, 79, 225, 164, 78, 10, 169, 121, 213, 104, 1, 176, 157, 175, 106, - 29, 57, 243, 150, 221, 61, 172, 38, 203, 213, 100, 160, 66, 110, 230, 235, - 219, 201, 74, 227, 229, 97, 11, 162, 16, 101, 217, 31, 135, 112, 57, 228, - 4, 208, 220, 158, 204, 38, 80, 227, 213, 16, 109, 28, 54, 187, 233, 65, - 42, 112, 255, 176, 90, 186, 178, 28, 25, 77, 74, 237, 235, 18, 74, 167, - 118, 136, 123, 109, 235, 87, 24, 247, 61, 207, 163, 27, 255, 129, 190, 157, - 153, 252, 174, 198, 171, 213, 195, 217, 209, 209, 243, 243, 115, 107, 48, 39, - 178, 96, 180, 158, 220, 106, 55, 89, 179, 209, 234, 232, 14, 190, 191, 22, - 155, 163, 251, 254, 96, 76, 219, 242, 242, 136, 202, 254, 55, 41, 154, 120, - 229, 163, 235, 242, 245, 227, 182, 91, 32, 230, 220, 134, 139, 230, 97, 174, - 229, 142, 230, 161, 211, 254, 180, 93, 114, 64, 58, 253, 28, 122, 153, 78, - 47, 170, 49, 27, 129, 80, 86, 185, 112, 199, 181, 54, 175, 44, 163, 224, - 108, 229, 64, 86, 12, 228, 106, 60, 239, 27, 144, 236, 26, 67, 28, 180, - 124, 169, 21, 215, 67, 11, 194, 214, 230, 70, 67, 3, 80, 181, 89, 169, - 251, 221, 107, 236, 33, 200, 168, 251, 170, 231, 88, 66, 204, 139, 73, 223, - 106, 213, 182, 5, 182, 203, 237, 191, 8, 46, 168, 6, 105, 215, 1, 147, - 210, 55, 109, 163, 83, 217, 204, 47, 47, 98, 7, 128, 67, 211, 124, 2, - 8, 48, 162, 181, 21, 180, 107, 91, 34, 250, 210, 148, 216, 51, 17, 238, - 54, 92, 144, 141, 134, 69, 165, 50, 218, 248, 168, 175, 216, 218, 107, 71, - 12, 1, 170, 81, 15, 116, 163, 0, 137, 137, 122, 41, 216, 1, 249, 26, - 181, 222, 136, 104, 123, 56, 129, 10, 6, 109, 27, 58, 58, 188, 126, 246, - 123, 183, 119, 82, 12, 106, 242, 82, 181, 121, 125, 128, 106, 181, 74, 131, - 173, 2, 223, 35, 91, 153, 79, 166, 229, 91, 130, 201, 219, 173, 239, 116, - 28, 128, 179, 184, 119, 220, 197, 200, 192, 9, 180, 53, 220, 80, 142, 191, - 234, 11, 13, 63, 219, 221, 208, 165, 50, 122, 78, 14, 111, 73, 101, 170, - 65, 108, 218, 210, 25, 179, 65, 87, 157, 106, 190, 175, 170, 172, 238, 209, - 72, 178, 53, 206, 212, 166, 249, 155, 46, 216, 248, 26, 120, 181, 2, 246, - 205, 226, 17, 124, 3, 204, 97, 175, 248, 25, 148, 53, 126, 89, 15, 7, - 83, 23, 251, 23, 180, 171, 37, 84, 215, 74, 29, 211, 172, 99, 109, 226, - 187, 168, 208, 151, 246, 203, 148, 241, 176, 141, 154, 182, 27, 168, 193, 11, - 157, 124, 204, 217, 174, 49, 212, 244, 78, 225, 0, 144, 154, 79, 184, 94, - 157, 63, 46, 128, 128, 57, 134, 27, 203, 1, 204, 50, 178, 81, 156, 74, - 101, 99, 185, 185, 168, 224, 30, 67, 186, 105, 115, 210, 29, 223, 151, 147, - 187, 251, 226, 247, 135, 5, 45, 251, 197, 70, 168, 145, 108, 233, 28, 212, - 195, 150, 60, 90, 192, 109, 250, 69, 97, 99, 119, 92, 25, 161, 253, 184, - 134, 31, 8, 205, 205, 153, 140, 22, 20, 231, 73, 18, 47, 69, 149, 201, - 248, 165, 202, 171, 166, 231, 187, 59, 163, 158, 110, 89, 46, 154, 117, 204, - 113, 13, 251, 139, 95, 71, 51, 230, 185, 56, 13, 63, 119, 210, 219, 71, - 56, 30, 218, 67, 37, 101, 231, 7, 109, 213, 161, 14, 203, 205, 14, 218, - 84, 143, 143, 237, 215, 220, 12, 73, 229, 10, 33, 95, 105, 57, 37, 118, - 77, 146, 20, 34, 86, 251, 209, 170, 174, 159, 138, 142, 123, 118, 186, 104, - 51, 214, 61, 115, 133, 146, 190, 201, 68, 217, 57, 87, 10, 177, 114, 211, - 69, 14, 186, 178, 201, 146, 251, 154, 153, 42, 210, 212, 210, 185, 130, 246, - 238, 38, 33, 59, 236, 117, 241, 174, 255, 184, 92, 78, 250, 51, 86, 140, - 56, 165, 173, 90, 32, 129, 249, 181, 3, 5, 25, 189, 184, 149, 93, 159, - 231, 44, 118, 5, 80, 151, 135, 156, 139, 43, 91, 220, 161, 67, 87, 221, - 30, 151, 29, 123, 92, 198, 234, 163, 156, 152, 73, 119, 235, 168, 231, 199, - 185, 132, 157, 212, 220, 201, 116, 46, 11, 95, 187, 38, 219, 174, 228, 33, - 217, 226, 6, 37, 58, 49, 217, 30, 187, 217, 210, 4, 172, 202, 213, 202, - 137, 220, 220, 72, 18, 96, 193, 90, 235, 220, 83, 55, 183, 55, 136, 107, - 62, 189, 185, 112, 234, 15, 144, 216, 44, 70, 172, 253, 84, 6, 18, 155, - 171, 73, 220, 78, 59, 110, 69, 98, 144, 229, 137, 205, 180, 147, 177, 147, - 250, 163, 238, 252, 28, 137, 192, 139, 62, 136, 213, 233, 207, 16, 125, 49, - 29, 99, 211, 150, 82, 129, 163, 103, 168, 205, 177, 233, 107, 204, 206, 120, - 151, 227, 249, 116, 232, 19, 193, 66, 239, 218, 176, 214, 40, 82, 5, 29, - 173, 141, 198, 48, 124, 237, 99, 98, 79, 47, 249, 254, 197, 120, 58, 185, - 254, 68, 94, 138, 141, 102, 29, 187, 109, 30, 75, 211, 131, 33, 45, 177, - 115, 92, 111, 239, 249, 70, 244, 198, 110, 88, 113, 236, 25, 191, 148, 198, - 159, 46, 211, 23, 162, 152, 235, 193, 177, 226, 52, 187, 226, 133, 7, 92, - 162, 190, 213, 237, 138, 247, 29, 134, 151, 156, 46, 67, 55, 28, 138, 96, - 119, 172, 87, 103, 8, 11, 88, 115, 69, 254, 174, 200, 237, 98, 228, 254, - 90, 69, 38, 162, 126, 186, 84, 62, 125, 178, 113, 116, 78, 248, 206, 88, - 242, 45, 105, 17, 239, 56, 150, 255, 198, 13, 148, 199, 154, 78, 233, 203, - 83, 170, 52, 44, 21, 237, 2, 47, 50, 231, 16, 13, 84, 171, 113, 243, - 169, 214, 8, 218, 245, 167, 218, 246, 0, 176, 137, 156, 85, 104, 51, 36, - 182, 134, 51, 9, 213, 143, 214, 98, 243, 12, 146, 146, 62, 124, 221, 158, - 22, 211, 216, 171, 15, 48, 143, 254, 168, 196, 227, 31, 149, 54, 67, 209, - 206, 183, 80, 38, 68, 246, 81, 184, 220, 250, 174, 226, 208, 226, 238, 70, - 112, 24, 240, 119, 114, 127, 7, 42, 228, 246, 246, 17, 219, 13, 237, 255, - 203, 249, 98, 121, 69, 161, 215, 192, 13, 6, 76, 48, 128, 129, 1, 2, - 140, 254, 209, 87, 196, 94, 99, 48, 238, 131, 181, 92, 94, 233, 32, 136, - 3, 150, 99, 231, 53, 177, 61, 253, 1, 206, 18, 218, 70, 213, 147, 153, - 194, 200, 98, 179, 5, 9, 76, 248, 98, 46, 65, 239, 208, 94, 28, 190, - 80, 45, 20, 198, 100, 78, 80, 115, 90, 217, 126, 243, 60, 174, 7, 167, - 103, 193, 41, 192, 132, 21, 21, 202, 9, 160, 122, 104, 9, 83, 14, 26, - 179, 51, 9, 163, 88, 207, 229, 16, 197, 230, 53, 148, 64, 92, 154, 139, - 80, 90, 12, 222, 237, 21, 125, 163, 197, 90, 247, 110, 70, 119, 147, 89, - 213, 251, 129, 8, 96, 223, 154, 217, 93, 85, 130, 231, 27, 192, 5, 140, - 111, 42, 215, 181, 115, 217, 81, 123, 11, 138, 35, 79, 119, 230, 233, 198, - 60, 245, 233, 233, 137, 175, 109, 41, 49, 165, 171, 210, 202, 160, 164, 180, - 219, 211, 135, 32, 110, 215, 31, 38, 71, 241, 105, 116, 238, 13, 30, 41, - 224, 10, 70, 139, 85, 250, 88, 11, 105, 167, 228, 7, 255, 154, 190, 61, - 241, 183, 230, 224, 17, 24, 86, 244, 151, 134, 143, 130, 255, 66, 161, 247, - 143, 211, 234, 224, 145, 194, 194, 164, 230, 55, 176, 239, 212, 57, 232, 41, - 164, 255, 19, 42, 137, 254, 255, 158, 226, 125, 119, 238, 125, 139, 159, 234, - 215, 149, 64, 143, 84, 37, 252, 222, 84, 229, 177, 250, 48, 161, 151, 255, - 224, 130, 190, 133, 161, 223, 183, 40, 75, 253, 161, 57, 120, 93, 175, 254, - 165, 190, 179, 126, 200, 227, 30, 198, 253, 19, 100, 174, 135, 209, 205, 92, - 186, 176, 90, 237, 19, 255, 144, 84, 255, 3, 121, 254, 7, 21, 81, 59, - 168, 194, 142, 179, 6, 46, 252, 72, 61, 214, 14, 130, 206, 57, 236, 33, - 117, 101, 105, 132, 36, 171, 9, 145, 180, 41, 36, 217, 117, 236, 114, 16, - 69, 168, 17, 160, 80, 108, 92, 136, 204, 239, 21, 94, 71, 20, 61, 132, - 171, 10, 51, 98, 108, 249, 168, 146, 240, 26, 201, 167, 227, 192, 87, 36, - 230, 17, 31, 60, 174, 170, 84, 75, 150, 195, 57, 155, 135, 192, 204, 152, - 152, 119, 78, 204, 120, 111, 204, 27, 39, 102, 82, 18, 115, 184, 232, 63, - 163, 182, 52, 87, 43, 225, 149, 170, 75, 168, 74, 82, 191, 55, 234, 183, - 127, 29, 126, 239, 55, 253, 31, 146, 92, 43, 58, 192, 54, 148, 221, 2, - 13, 250, 190, 226, 253, 122, 69, 249, 21, 55, 16, 200, 1, 233, 3, 22, - 183, 236, 23, 16, 227, 185, 202, 135, 124, 194, 4, 203, 70, 53, 88, 30, - 128, 163, 113, 197, 143, 59, 246, 64, 203, 117, 12, 250, 139, 213, 124, 62, - 99, 160, 207, 44, 164, 231, 226, 97, 52, 99, 125, 23, 115, 56, 49, 169, - 109, 164, 200, 226, 86, 8, 21, 192, 147, 218, 84, 250, 98, 157, 157, 35, - 172, 117, 33, 95, 34, 8, 116, 208, 80, 218, 10, 218, 83, 213, 44, 141, - 69, 244, 111, 234, 151, 38, 234, 93, 223, 1, 104, 42, 149, 107, 153, 198, - 70, 191, 197, 173, 108, 122, 90, 34, 223, 208, 149, 110, 135, 167, 116, 68, - 119, 61, 219, 83, 70, 189, 181, 173, 208, 64, 187, 10, 14, 52, 209, 120, - 160, 45, 13, 92, 31, 107, 109, 148, 211, 188, 76, 176, 216, 39, 57, 152, - 66, 23, 251, 61, 244, 109, 179, 89, 58, 104, 9, 6, 96, 146, 56, 146, - 253, 142, 70, 173, 87, 66, 66, 183, 169, 165, 178, 194, 172, 56, 219, 231, - 133, 36, 155, 178, 119, 195, 246, 4, 82, 56, 74, 142, 141, 12, 78, 1, - 128, 40, 208, 207, 198, 104, 120, 199, 30, 218, 148, 11, 12, 64, 130, 18, - 181, 46, 122, 90, 121, 57, 35, 68, 220, 119, 55, 201, 180, 15, 103, 87, - 176, 11, 31, 64, 86, 192, 64, 226, 92, 239, 171, 102, 135, 145, 39, 6, - 176, 37, 76, 40, 42, 69, 49, 167, 86, 75, 11, 38, 103, 45, 5, 126, - 173, 81, 4, 250, 25, 185, 187, 51, 199, 209, 33, 189, 209, 116, 58, 121, - 88, 138, 101, 203, 128, 246, 64, 214, 246, 90, 244, 135, 147, 71, 153, 202, - 170, 245, 244, 156, 241, 73, 161, 238, 192, 164, 83, 77, 30, 159, 229, 152, - 130, 75, 211, 142, 34, 164, 68, 3, 197, 233, 90, 253, 150, 92, 68, 229, - 170, 31, 66, 143, 133, 173, 212, 179, 141, 178, 32, 181, 157, 72, 233, 93, - 43, 44, 45, 8, 212, 50, 78, 18, 104, 72, 75, 155, 149, 157, 133, 116, - 238, 79, 238, 31, 239, 125, 169, 181, 198, 201, 52, 130, 232, 56, 239, 70, - 82, 103, 133, 27, 11, 182, 160, 172, 225, 114, 38, 255, 12, 235, 217, 226, - 35, 17, 200, 181, 45, 46, 153, 233, 237, 88, 182, 217, 109, 233, 51, 134, - 61, 63, 204, 143, 55, 147, 37, 188, 30, 186, 162, 92, 136, 0, 204, 242, - 184, 72, 187, 145, 72, 128, 149, 46, 128, 145, 112, 216, 213, 150, 25, 127, - 89, 169, 146, 239, 151, 108, 94, 154, 1, 238, 230, 54, 38, 65, 45, 54, - 21, 73, 79, 50, 119, 23, 196, 41, 105, 5, 126, 23, 215, 184, 100, 155, - 146, 218, 133, 158, 105, 190, 115, 133, 225, 250, 226, 72, 92, 87, 28, 9, - 186, 66, 194, 97, 186, 157, 189, 220, 62, 49, 55, 27, 39, 133, 93, 43, - 223, 23, 249, 155, 12, 237, 215, 34, 179, 41, 209, 134, 165, 39, 146, 186, - 180, 104, 179, 150, 65, 152, 55, 191, 118, 55, 189, 174, 178, 1, 168, 124, - 69, 211, 10, 38, 175, 65, 34, 63, 109, 249, 233, 84, 62, 229, 240, 162, - 232, 162, 236, 123, 7, 138, 77, 139, 111, 1, 200, 95, 99, 179, 32, 249, - 20, 51, 134, 67, 253, 185, 62, 62, 170, 118, 234, 193, 247, 236, 250, 29, - 106, 99, 86, 65, 173, 6, 114, 25, 80, 70, 85, 152, 51, 189, 219, 158, - 7, 239, 106, 68, 41, 7, 239, 20, 13, 28, 124, 47, 198, 55, 205, 224, - 123, 67, 4, 115, 216, 88, 133, 101, 112, 48, 88, 83, 10, 22, 172, 135, - 244, 45, 164, 127, 135, 176, 103, 165, 87, 247, 77, 94, 229, 141, 29, 52, - 112, 100, 122, 247, 100, 183, 228, 188, 38, 20, 173, 26, 107, 123, 235, 246, - 57, 61, 82, 5, 171, 193, 187, 38, 3, 204, 234, 71, 160, 50, 217, 151, - 196, 125, 105, 67, 229, 142, 114, 233, 82, 99, 50, 170, 92, 96, 12, 92, - 51, 95, 219, 216, 151, 36, 233, 54, 249, 38, 135, 30, 136, 245, 218, 130, - 163, 120, 17, 74, 122, 235, 185, 232, 31, 13, 97, 53, 90, 2, 4, 210, - 17, 8, 37, 183, 47, 62, 82, 168, 66, 73, 194, 206, 78, 9, 244, 183, - 102, 236, 59, 237, 68, 1, 12, 143, 1, 221, 236, 239, 183, 30, 59, 190, - 232, 100, 14, 25, 78, 206, 103, 74, 124, 237, 85, 155, 113, 114, 122, 30, - 60, 159, 7, 227, 243, 96, 73, 163, 119, 35, 238, 228, 132, 35, 126, 7, - 67, 18, 168, 84, 190, 211, 250, 107, 136, 46, 252, 31, 131, 238, 234, 190, - 136, 189, 141, 194, 184, 234, 171, 223, 141, 242, 77, 166, 21, 59, 97, 121, - 219, 30, 42, 33, 143, 81, 134, 212, 104, 28, 87, 250, 38, 172, 177, 63, - 146, 235, 212, 2, 222, 30, 50, 0, 248, 118, 191, 3, 5, 218, 123, 30, - 79, 22, 124, 109, 107, 180, 74, 138, 27, 152, 196, 65, 244, 189, 87, 86, - 229, 10, 23, 86, 157, 134, 250, 183, 100, 31, 114, 106, 19, 122, 153, 170, - 57, 232, 233, 133, 155, 209, 178, 170, 105, 211, 160, 188, 194, 76, 254, 192, - 41, 120, 6, 211, 151, 39, 39, 145, 190, 48, 193, 108, 49, 46, 73, 252, - 127, 185, 106, 198, 98, 62, 205, 91, 77, 75, 25, 57, 178, 123, 117, 76, - 169, 150, 8, 43, 144, 96, 68, 36, 199, 20, 20, 71, 105, 239, 171, 59, - 198, 61, 93, 255, 187, 116, 122, 82, 218, 233, 13, 157, 191, 116, 185, 212, - 199, 244, 119, 82, 236, 239, 191, 185, 167, 247, 144, 138, 210, 163, 220, 161, - 173, 68, 176, 30, 252, 27, 63, 49, 212, 35, 156, 35, 2, 137, 82, 96, - 206, 128, 4, 26, 113, 172, 196, 244, 52, 75, 66, 102, 195, 209, 90, 99, - 86, 98, 205, 205, 238, 149, 239, 139, 217, 86, 60, 206, 104, 95, 105, 101, - 228, 158, 171, 69, 71, 163, 35, 182, 1, 10, 180, 86, 189, 40, 216, 218, - 60, 108, 37, 123, 84, 211, 90, 223, 124, 49, 161, 220, 120, 151, 120, 63, - 249, 51, 68, 116, 170, 164, 155, 209, 120, 194, 254, 153, 94, 75, 27, 232, - 122, 41, 174, 69, 215, 44, 213, 225, 57, 191, 6, 121, 221, 254, 172, 159, - 113, 117, 205, 91, 182, 52, 51, 106, 133, 212, 237, 2, 9, 174, 210, 10, - 170, 113, 78, 215, 48, 219, 137, 134, 164, 128, 166, 190, 131, 190, 104, 9, - 10, 150, 176, 186, 83, 79, 40, 208, 32, 46, 120, 161, 223, 209, 105, 89, - 34, 66, 155, 90, 154, 139, 218, 12, 2, 35, 55, 219, 81, 205, 239, 88, - 7, 7, 69, 135, 129, 70, 65, 201, 248, 9, 44, 96, 180, 214, 25, 204, - 28, 240, 171, 155, 93, 81, 0, 207, 90, 15, 148, 95, 64, 185, 70, 216, - 17, 139, 78, 63, 77, 78, 212, 3, 185, 175, 45, 82, 31, 190, 145, 214, - 49, 67, 68, 135, 226, 124, 49, 132, 245, 138, 150, 246, 246, 36, 164, 245, - 179, 31, 201, 189, 226, 71, 63, 144, 32, 111, 1, 128, 119, 54, 124, 26, - 174, 107, 140, 252, 42, 47, 155, 44, 84, 60, 87, 109, 184, 190, 228, 35, - 5, 241, 248, 125, 163, 223, 177, 7, 82, 62, 29, 214, 28, 191, 239, 115, - 62, 246, 101, 135, 233, 182, 169, 177, 248, 103, 176, 224, 245, 10, 204, 45, - 128, 111, 196, 161, 248, 106, 103, 40, 48, 6, 2, 19, 77, 197, 182, 207, - 71, 127, 157, 157, 22, 137, 239, 135, 58, 167, 96, 35, 229, 87, 68, 220, - 56, 40, 28, 174, 194, 163, 178, 44, 240, 148, 255, 8, 174, 61, 0, 23, - 91, 121, 187, 100, 235, 218, 74, 233, 16, 187, 206, 162, 114, 77, 99, 134, - 149, 10, 182, 162, 247, 72, 181, 182, 187, 53, 198, 210, 193, 210, 255, 69, - 84, 96, 96, 168, 68, 239, 50, 58, 232, 104, 4, 36, 54, 128, 117, 156, - 125, 227, 26, 117, 231, 9, 34, 172, 18, 241, 229, 138, 107, 121, 127, 25, - 241, 182, 180, 80, 191, 25, 158, 68, 118, 47, 205, 174, 40, 53, 189, 75, - 246, 179, 40, 188, 78, 254, 228, 201, 228, 126, 59, 153, 194, 40, 249, 179, - 184, 214, 247, 138, 75, 89, 40, 185, 139, 227, 145, 244, 32, 207, 173, 104, - 24, 171, 229, 200, 232, 63, 91, 165, 146, 227, 178, 195, 43, 83, 197, 208, - 203, 245, 71, 198, 73, 225, 214, 170, 211, 183, 205, 115, 55, 61, 53, 207, - 184, 173, 58, 206, 106, 104, 197, 7, 165, 108, 76, 73, 231, 228, 52, 40, - 137, 231, 157, 148, 236, 66, 5, 206, 197, 232, 81, 126, 194, 201, 184, 215, - 48, 32, 166, 240, 237, 181, 222, 184, 18, 113, 113, 135, 226, 92, 125, 194, - 41, 66, 139, 37, 250, 66, 128, 67, 100, 203, 100, 12, 40, 96, 162, 175, - 143, 104, 25, 97, 197, 188, 137, 28, 179, 122, 103, 98, 211, 241, 169, 117, - 134, 91, 142, 129, 255, 49, 115, 55, 46, 148, 213, 154, 54, 191, 199, 234, - 179, 48, 217, 108, 168, 45, 124, 60, 85, 104, 189, 9, 69, 29, 25, 122, - 90, 147, 42, 189, 131, 75, 239, 132, 63, 123, 80, 251, 226, 0, 44, 50, - 36, 117, 222, 227, 220, 123, 146, 123, 111, 191, 170, 140, 104, 29, 23, 202, - 57, 98, 253, 205, 76, 81, 133, 160, 164, 24, 212, 230, 32, 13, 141, 75, - 189, 49, 227, 142, 44, 247, 31, 167, 240, 214, 39, 139, 81, 79, 100, 91, - 180, 68, 249, 65, 83, 10, 80, 57, 153, 61, 242, 56, 49, 173, 144, 89, - 175, 121, 177, 233, 236, 70, 64, 197, 197, 139, 210, 170, 191, 224, 123, 102, - 14, 194, 119, 229, 76, 133, 166, 174, 75, 67, 126, 59, 154, 141, 22, 208, - 63, 64, 45, 52, 205, 198, 186, 190, 82, 35, 232, 32, 188, 122, 61, 115, - 18, 189, 90, 157, 186, 27, 41, 105, 214, 247, 104, 78, 178, 202, 239, 166, - 17, 114, 149, 158, 109, 6, 232, 24, 215, 189, 12, 26, 83, 238, 181, 205, - 118, 107, 232, 101, 250, 216, 89, 246, 238, 141, 49, 3, 95, 58, 183, 220, - 174, 115, 82, 104, 96, 58, 68, 137, 19, 139, 41, 15, 187, 69, 36, 142, - 56, 228, 68, 137, 61, 204, 206, 240, 138, 206, 206, 238, 15, 74, 226, 25, - 135, 190, 211, 155, 187, 60, 53, 57, 194, 218, 142, 160, 207, 5, 93, 193, - 172, 135, 19, 32, 213, 137, 190, 214, 13, 230, 62, 148, 23, 217, 202, 78, - 62, 165, 125, 205, 151, 210, 141, 59, 236, 87, 180, 113, 244, 228, 142, 186, - 101, 225, 75, 38, 183, 27, 118, 108, 40, 218, 194, 56, 126, 129, 9, 34, - 127, 153, 175, 61, 143, 4, 144, 13, 187, 74, 21, 64, 153, 31, 58, 181, - 163, 142, 131, 144, 210, 173, 227, 194, 245, 164, 214, 192, 53, 178, 227, 152, - 206, 220, 249, 177, 20, 182, 37, 170, 13, 216, 196, 148, 84, 152, 29, 67, - 117, 14, 68, 10, 108, 248, 41, 62, 23, 181, 227, 66, 235, 23, 46, 52, - 14, 145, 153, 206, 111, 121, 12, 227, 62, 85, 247, 231, 176, 25, 23, 101, - 185, 203, 52, 56, 22, 120, 129, 106, 112, 217, 12, 142, 107, 7, 213, 224, - 164, 17, 215, 248, 98, 27, 81, 149, 222, 40, 243, 10, 240, 77, 89, 112, - 79, 94, 21, 47, 4, 206, 191, 15, 81, 24, 21, 222, 169, 54, 201, 41, - 203, 27, 217, 28, 174, 171, 241, 73, 219, 64, 240, 145, 89, 195, 150, 81, - 89, 127, 52, 131, 21, 183, 146, 166, 50, 109, 18, 195, 209, 170, 63, 153, - 138, 78, 181, 171, 112, 244, 158, 197, 175, 211, 141, 155, 224, 213, 156, 161, - 155, 41, 235, 220, 148, 185, 92, 208, 57, 179, 11, 96, 91, 175, 204, 18, - 59, 181, 90, 18, 25, 37, 137, 93, 53, 204, 11, 251, 80, 13, 159, 171, - 97, 213, 38, 214, 3, 56, 17, 238, 180, 219, 222, 6, 79, 201, 113, 167, - 235, 13, 71, 211, 85, 31, 98, 104, 111, 16, 65, 21, 169, 29, 159, 208, - 211, 4, 10, 38, 237, 188, 238, 164, 157, 214, 246, 160, 212, 51, 7, 99, - 64, 44, 37, 54, 130, 3, 115, 255, 96, 213, 42, 65, 228, 7, 92, 86, - 253, 249, 200, 98, 142, 128, 176, 87, 193, 99, 39, 120, 29, 81, 240, 122, - 208, 36, 138, 244, 40, 217, 122, 27, 188, 110, 240, 186, 193, 235, 58, 230, - 175, 13, 253, 53, 230, 175, 13, 245, 21, 48, 35, 163, 233, 205, 98, 14, - 26, 120, 29, 133, 193, 134, 254, 209, 89, 21, 108, 96, 219, 136, 121, 18, - 80, 75, 241, 103, 226, 53, 68, 25, 82, 121, 65, 50, 214, 116, 106, 1, - 28, 123, 241, 177, 22, 180, 57, 107, 41, 59, 223, 50, 72, 137, 140, 4, - 55, 185, 74, 194, 54, 243, 200, 172, 91, 208, 138, 235, 88, 183, 226, 231, - 124, 1, 165, 225, 169, 95, 89, 140, 238, 38, 75, 162, 108, 104, 67, 152, - 45, 38, 119, 147, 161, 230, 170, 43, 193, 178, 18, 118, 43, 225, 142, 24, - 109, 193, 197, 216, 19, 163, 75, 49, 58, 38, 6, 107, 177, 16, 173, 221, - 185, 102, 118, 124, 15, 181, 123, 55, 21, 118, 124, 183, 176, 100, 72, 156, - 243, 252, 118, 37, 177, 190, 80, 52, 117, 80, 114, 214, 112, 158, 161, 167, - 42, 96, 165, 81, 7, 217, 75, 145, 76, 249, 165, 22, 91, 175, 19, 139, - 40, 1, 35, 251, 191, 195, 147, 248, 96, 227, 3, 67, 97, 36, 196, 165, - 226, 139, 113, 127, 122, 187, 66, 208, 25, 244, 90, 121, 117, 17, 65, 145, - 40, 47, 59, 208, 20, 180, 111, 55, 11, 193, 224, 77, 248, 198, 246, 65, - 44, 186, 20, 112, 16, 20, 12, 135, 147, 254, 253, 124, 54, 20, 224, 219, - 201, 98, 48, 29, 177, 142, 225, 100, 246, 212, 52, 177, 58, 252, 106, 99, - 118, 249, 93, 197, 222, 22, 165, 36, 57, 62, 195, 84, 119, 56, 1, 34, - 155, 66, 92, 123, 61, 89, 98, 218, 40, 18, 14, 211, 200, 244, 212, 188, - 74, 43, 85, 0, 55, 179, 91, 184, 31, 41, 191, 32, 49, 21, 12, 61, - 167, 107, 221, 75, 18, 218, 1, 19, 99, 231, 97, 95, 218, 238, 75, 254, - 150, 164, 147, 118, 45, 224, 173, 244, 165, 128, 221, 170, 142, 84, 88, 183, - 220, 139, 2, 117, 107, 59, 157, 222, 59, 242, 110, 35, 119, 37, 64, 39, - 112, 17, 113, 247, 245, 115, 118, 158, 2, 144, 140, 251, 50, 244, 209, 133, - 218, 147, 93, 232, 75, 15, 170, 119, 208, 32, 0, 195, 237, 192, 89, 30, - 186, 115, 231, 213, 203, 206, 73, 78, 83, 182, 128, 36, 47, 55, 114, 64, - 218, 54, 119, 180, 44, 3, 100, 132, 111, 159, 157, 80, 39, 91, 215, 142, - 95, 95, 180, 224, 18, 38, 184, 128, 178, 22, 84, 185, 224, 89, 149, 177, - 88, 130, 37, 248, 108, 112, 227, 6, 98, 214, 81, 118, 7, 86, 194, 1, - 20, 205, 148, 4, 194, 245, 197, 23, 186, 142, 248, 196, 105, 28, 212, 213, - 180, 74, 182, 22, 210, 83, 234, 11, 109, 86, 118, 33, 229, 182, 104, 231, - 60, 96, 242, 7, 222, 171, 153, 165, 130, 214, 92, 51, 184, 20, 76, 25, - 155, 224, 50, 151, 0, 155, 117, 147, 14, 129, 75, 198, 9, 53, 184, 246, - 32, 130, 186, 62, 182, 126, 124, 179, 154, 240, 13, 87, 63, 220, 89, 254, - 125, 32, 159, 238, 220, 12, 22, 195, 229, 175, 163, 213, 96, 124, 83, 216, - 61, 195, 140, 201, 138, 150, 13, 128, 51, 193, 70, 99, 249, 143, 11, 8, - 222, 195, 222, 100, 217, 187, 237, 47, 87, 59, 196, 152, 122, 130, 45, 134, - 254, 31, 255, 229, 63, 125, 41, 239, 139, 238, 59, 51, 23, 5, 226, 137, - 149, 131, 102, 119, 34, 68, 112, 111, 187, 67, 97, 73, 122, 25, 245, 13, - 131, 173, 207, 85, 45, 21, 123, 103, 186, 37, 161, 214, 157, 64, 102, 5, - 1, 150, 127, 63, 26, 106, 69, 220, 196, 111, 76, 231, 192, 253, 94, 140, - 160, 182, 61, 162, 109, 248, 113, 193, 95, 218, 178, 35, 235, 81, 153, 211, - 231, 105, 95, 128, 251, 144, 192, 203, 117, 187, 85, 248, 48, 55, 235, 145, - 189, 90, 23, 111, 97, 22, 6, 59, 191, 110, 203, 186, 181, 252, 140, 113, - 108, 83, 18, 71, 210, 32, 178, 79, 116, 90, 134, 165, 80, 247, 164, 95, - 1, 90, 214, 72, 24, 35, 255, 86, 110, 61, 50, 55, 164, 150, 164, 98, - 189, 83, 166, 210, 187, 229, 20, 24, 43, 106, 46, 158, 224, 25, 157, 111, - 224, 4, 112, 26, 66, 58, 230, 49, 52, 117, 95, 47, 186, 166, 68, 209, - 127, 125, 156, 80, 191, 138, 188, 76, 244, 7, 227, 136, 120, 139, 163, 99, - 240, 246, 236, 110, 171, 173, 56, 241, 60, 125, 206, 226, 196, 210, 90, 185, - 130, 213, 98, 13, 169, 54, 180, 201, 100, 43, 88, 184, 29, 162, 110, 53, - 183, 67, 122, 69, 62, 204, 137, 60, 27, 76, 231, 143, 67, 64, 80, 44, - 241, 7, 50, 149, 227, 102, 179, 27, 42, 95, 3, 130, 115, 49, 6, 36, - 191, 242, 191, 185, 4, 120, 2, 88, 0, 7, 48, 216, 136, 42, 33, 168, - 108, 52, 89, 204, 208, 208, 234, 45, 75, 7, 187, 155, 221, 222, 2, 155, - 65, 253, 237, 115, 105, 124, 191, 202, 55, 185, 238, 133, 179, 4, 176, 227, - 110, 184, 223, 240, 28, 44, 13, 23, 87, 163, 174, 221, 37, 100, 252, 35, - 152, 34, 56, 18, 117, 251, 70, 151, 100, 138, 220, 120, 214, 125, 13, 6, - 111, 15, 160, 75, 97, 184, 110, 39, 238, 142, 53, 34, 126, 118, 153, 213, - 194, 200, 239, 52, 136, 242, 37, 87, 98, 90, 166, 24, 151, 111, 12, 82, - 58, 29, 245, 186, 26, 174, 239, 230, 252, 210, 228, 122, 40, 241, 223, 30, - 93, 134, 79, 221, 57, 18, 187, 170, 231, 85, 108, 230, 149, 92, 55, 206, - 140, 89, 150, 220, 58, 246, 184, 204, 55, 235, 19, 207, 88, 75, 181, 118, - 88, 239, 155, 104, 254, 153, 87, 125, 163, 92, 105, 48, 188, 15, 4, 219, - 52, 149, 48, 135, 194, 14, 99, 224, 224, 138, 155, 98, 80, 32, 205, 211, - 46, 177, 11, 77, 68, 111, 118, 106, 196, 118, 193, 168, 16, 158, 134, 122, - 139, 169, 193, 144, 28, 207, 31, 239, 198, 238, 153, 226, 158, 34, 74, 31, - 74, 235, 205, 100, 78, 16, 118, 236, 224, 56, 116, 120, 154, 175, 24, 38, - 18, 100, 97, 97, 136, 81, 200, 223, 122, 154, 232, 225, 62, 205, 232, 77, - 101, 228, 82, 167, 81, 254, 88, 145, 19, 68, 215, 13, 21, 47, 227, 11, - 26, 217, 158, 160, 57, 147, 235, 25, 135, 70, 60, 117, 5, 81, 142, 124, - 137, 104, 196, 40, 99, 121, 17, 217, 187, 49, 199, 79, 75, 199, 72, 171, - 186, 92, 163, 12, 32, 204, 39, 123, 172, 92, 199, 198, 168, 101, 229, 53, - 2, 115, 210, 105, 221, 29, 150, 180, 179, 39, 65, 233, 62, 75, 249, 105, - 82, 173, 120, 227, 5, 21, 161, 174, 209, 161, 161, 231, 90, 45, 11, 93, - 187, 24, 207, 233, 107, 42, 122, 26, 207, 31, 146, 198, 248, 67, 2, 23, - 43, 210, 203, 62, 244, 102, 67, 252, 49, 124, 60, 118, 108, 230, 242, 123, - 124, 6, 183, 20, 144, 0, 239, 225, 237, 3, 63, 179, 61, 123, 175, 220, - 158, 7, 128, 247, 156, 45, 149, 235, 99, 218, 171, 195, 196, 195, 81, 193, - 46, 107, 142, 80, 252, 22, 166, 255, 47, 129, 212, 86, 133, 52, 68, 93, - 165, 46, 59, 55, 62, 63, 163, 226, 172, 202, 162, 195, 213, 135, 241, 17, - 67, 218, 193, 153, 201, 68, 204, 163, 33, 182, 90, 178, 134, 142, 142, 206, - 74, 45, 109, 70, 205, 141, 34, 143, 85, 123, 16, 141, 78, 6, 98, 14, - 155, 221, 107, 175, 201, 209, 249, 145, 53, 125, 168, 85, 215, 236, 164, 234, - 56, 68, 216, 63, 244, 156, 80, 128, 34, 206, 105, 209, 241, 126, 215, 211, - 194, 119, 225, 229, 137, 41, 89, 244, 55, 216, 166, 169, 115, 104, 123, 81, - 115, 251, 34, 53, 152, 3, 218, 165, 179, 188, 200, 189, 61, 37, 33, 158, - 17, 118, 104, 106, 207, 218, 184, 178, 248, 157, 2, 116, 56, 45, 159, 138, - 191, 71, 22, 233, 194, 30, 251, 213, 50, 244, 165, 218, 146, 252, 140, 70, - 159, 131, 70, 208, 91, 231, 222, 205, 119, 91, 85, 182, 93, 83, 240, 35, - 217, 10, 179, 180, 189, 20, 3, 95, 119, 81, 232, 55, 160, 147, 174, 22, - 139, 219, 117, 187, 245, 253, 226, 204, 102, 20, 231, 68, 226, 14, 39, 11, - 98, 246, 64, 168, 89, 60, 20, 229, 225, 249, 190, 43, 223, 142, 164, 245, - 178, 84, 125, 182, 146, 110, 215, 66, 73, 207, 125, 160, 183, 163, 140, 188, - 188, 132, 217, 244, 178, 242, 236, 75, 24, 104, 28, 248, 163, 71, 234, 164, - 225, 168, 63, 75, 30, 230, 240, 13, 195, 101, 24, 57, 245, 116, 126, 151, - 224, 18, 203, 114, 135, 201, 7, 96, 66, 26, 11, 24, 33, 87, 30, 103, - 140, 133, 30, 195, 218, 170, 203, 243, 21, 232, 113, 207, 152, 239, 47, 113, - 163, 26, 116, 26, 192, 6, 169, 33, 36, 226, 43, 115, 6, 44, 16, 21, - 48, 56, 53, 129, 235, 115, 185, 189, 206, 124, 105, 27, 31, 106, 194, 8, - 90, 174, 143, 235, 154, 152, 186, 43, 176, 36, 189, 241, 149, 46, 13, 133, - 186, 35, 124, 223, 13, 247, 133, 216, 32, 244, 96, 121, 10, 223, 56, 242, - 174, 84, 246, 117, 24, 54, 250, 80, 27, 108, 58, 58, 253, 16, 9, 200, - 211, 122, 26, 246, 54, 244, 239, 35, 254, 177, 27, 75, 195, 63, 130, 77, - 20, 96, 201, 251, 254, 67, 41, 175, 168, 42, 38, 150, 27, 175, 23, 247, - 192, 139, 15, 115, 137, 78, 99, 32, 14, 102, 70, 177, 208, 36, 125, 11, - 149, 105, 24, 91, 98, 82, 160, 110, 140, 24, 110, 174, 167, 58, 124, 51, - 77, 63, 78, 37, 165, 181, 198, 253, 168, 220, 166, 238, 2, 8, 217, 217, - 238, 50, 250, 18, 12, 36, 177, 149, 153, 209, 161, 250, 19, 37, 6, 238, - 51, 242, 114, 195, 102, 113, 176, 91, 202, 84, 64, 129, 133, 176, 201, 166, - 186, 157, 214, 224, 33, 201, 14, 216, 74, 70, 5, 138, 5, 20, 40, 86, - 152, 64, 5, 50, 54, 63, 24, 159, 242, 252, 215, 12, 142, 233, 112, 136, - 241, 115, 238, 190, 124, 160, 151, 19, 134, 9, 60, 161, 15, 177, 188, 240, - 207, 135, 224, 52, 12, 78, 207, 249, 111, 205, 5, 162, 194, 93, 8, 99, - 248, 70, 86, 185, 133, 1, 0, 228, 246, 27, 7, 151, 40, 60, 234, 119, - 54, 160, 228, 11, 32, 150, 144, 28, 168, 59, 240, 44, 243, 24, 188, 177, - 199, 210, 192, 115, 174, 195, 245, 122, 50, 11, 11, 178, 112, 230, 173, 16, - 215, 81, 2, 76, 69, 82, 116, 12, 239, 154, 80, 47, 15, 78, 228, 201, - 149, 36, 193, 183, 166, 104, 157, 196, 222, 17, 219, 249, 183, 13, 61, 3, - 19, 127, 168, 71, 241, 119, 34, 66, 96, 29, 23, 123, 86, 27, 149, 77, - 28, 68, 92, 20, 78, 222, 106, 252, 163, 44, 28, 144, 32, 31, 80, 253, - 6, 123, 215, 249, 76, 172, 128, 51, 167, 31, 203, 107, 196, 132, 120, 50, - 187, 147, 67, 206, 64, 138, 50, 185, 141, 245, 109, 125, 134, 113, 12, 14, - 0, 138, 195, 100, 41, 30, 18, 123, 48, 12, 18, 137, 240, 227, 205, 10, - 183, 56, 196, 143, 179, 88, 184, 63, 28, 78, 248, 37, 191, 174, 85, 117, - 94, 65, 172, 3, 66, 191, 63, 189, 163, 193, 89, 141, 233, 72, 0, 224, - 254, 242, 97, 34, 110, 198, 213, 249, 202, 194, 202, 209, 114, 176, 152, 220, - 80, 48, 101, 166, 64, 80, 128, 129, 226, 31, 42, 232, 19, 41, 177, 117, - 63, 58, 234, 223, 204, 31, 87, 135, 175, 86, 166, 55, 221, 147, 38, 2, - 6, 102, 32, 107, 59, 114, 244, 102, 156, 170, 137, 42, 75, 182, 139, 224, - 177, 77, 246, 0, 238, 168, 178, 53, 175, 250, 164, 131, 213, 61, 115, 77, - 182, 249, 196, 237, 236, 62, 113, 147, 52, 113, 153, 4, 54, 139, 182, 135, - 177, 73, 99, 77, 176, 19, 107, 131, 173, 190, 220, 204, 231, 48, 109, 6, - 156, 80, 45, 207, 44, 20, 198, 169, 252, 76, 54, 253, 196, 92, 130, 139, - 76, 75, 108, 66, 206, 5, 154, 10, 48, 61, 164, 141, 136, 168, 165, 149, - 38, 172, 210, 227, 70, 112, 28, 58, 179, 41, 212, 51, 9, 198, 234, 232, - 197, 18, 193, 177, 2, 92, 211, 37, 129, 197, 152, 109, 51, 34, 163, 151, - 37, 109, 111, 199, 223, 68, 103, 202, 164, 8, 151, 204, 151, 96, 35, 224, - 132, 128, 141, 219, 168, 10, 174, 241, 105, 187, 178, 253, 70, 89, 165, 182, - 235, 207, 181, 51, 98, 103, 104, 233, 6, 109, 133, 2, 142, 132, 155, 79, - 39, 28, 75, 194, 177, 36, 196, 189, 180, 120, 21, 166, 90, 89, 127, 183, - 1, 173, 204, 155, 199, 187, 154, 92, 58, 127, 245, 82, 167, 51, 159, 152, - 157, 43, 246, 129, 112, 59, 89, 209, 20, 31, 141, 102, 87, 215, 63, 251, - 47, 113, 120, 69, 251, 199, 245, 150, 61, 58, 141, 104, 234, 250, 21, 120, - 126, 166, 34, 96, 197, 248, 125, 205, 79, 253, 234, 247, 84, 132, 26, 127, - 60, 94, 60, 127, 13, 29, 72, 126, 139, 237, 135, 248, 250, 98, 140, 15, - 53, 24, 96, 206, 150, 43, 159, 186, 26, 86, 170, 199, 250, 93, 15, 114, - 138, 47, 223, 96, 230, 53, 105, 192, 207, 130, 88, 71, 176, 35, 159, 194, - 252, 2, 208, 178, 80, 246, 209, 159, 245, 96, 80, 158, 29, 29, 102, 71, - 158, 66, 187, 38, 230, 125, 34, 133, 199, 84, 68, 82, 167, 231, 115, 15, - 176, 18, 108, 158, 250, 124, 244, 252, 117, 20, 250, 227, 163, 241, 215, 76, - 249, 195, 22, 22, 119, 58, 128, 43, 130, 127, 233, 115, 162, 206, 110, 35, - 85, 203, 201, 219, 175, 163, 179, 201, 253, 215, 20, 58, 156, 251, 85, 239, - 7, 10, 7, 60, 247, 178, 250, 117, 4, 3, 72, 29, 239, 202, 255, 225, - 234, 244, 58, 252, 225, 234, 13, 20, 228, 127, 184, 138, 105, 234, 95, 159, - 33, 180, 131, 208, 174, 132, 158, 176, 225, 45, 101, 79, 169, 126, 184, 162, - 116, 244, 118, 51, 90, 174, 122, 98, 232, 42, 143, 79, 119, 42, 79, 42, - 120, 118, 75, 21, 7, 174, 221, 175, 236, 249, 218, 255, 245, 194, 52, 152, - 200, 235, 198, 175, 161, 177, 191, 133, 45, 146, 177, 6, 30, 126, 159, 181, - 6, 246, 181, 185, 45, 115, 57, 215, 136, 112, 196, 62, 46, 160, 147, 57, - 252, 190, 70, 45, 121, 135, 66, 185, 232, 72, 76, 126, 191, 143, 206, 21, - 14, 122, 85, 230, 3, 245, 214, 247, 148, 21, 69, 106, 164, 19, 121, 59, - 167, 58, 188, 59, 247, 191, 111, 164, 195, 239, 107, 159, 159, 172, 41, 201, - 232, 211, 81, 250, 238, 28, 211, 183, 138, 118, 87, 41, 224, 82, 247, 69, - 237, 12, 175, 23, 230, 53, 204, 244, 210, 211, 221, 185, 239, 116, 32, 154, - 200, 54, 203, 78, 7, 232, 207, 170, 23, 236, 107, 105, 87, 236, 107, 134, - 106, 65, 35, 149, 41, 86, 55, 83, 246, 117, 189, 176, 47, 121, 211, 77, - 94, 199, 116, 205, 231, 17, 235, 60, 240, 208, 212, 121, 168, 101, 81, 94, - 149, 191, 49, 47, 85, 47, 140, 206, 87, 85, 189, 80, 14, 146, 110, 84, - 11, 61, 227, 24, 60, 213, 171, 59, 77, 177, 122, 176, 186, 207, 148, 117, - 18, 80, 14, 48, 229, 177, 201, 222, 70, 181, 163, 170, 222, 7, 84, 0, - 229, 61, 90, 175, 170, 135, 38, 175, 195, 240, 105, 69, 3, 167, 223, 107, - 170, 112, 229, 201, 91, 182, 182, 74, 45, 228, 68, 141, 193, 85, 124, 109, - 85, 16, 120, 167, 11, 233, 47, 203, 2, 160, 169, 191, 154, 183, 10, 25, - 134, 135, 180, 129, 243, 255, 93, 136, 66, 159, 65, 81, 65, 38, 201, 2, - 128, 195, 154, 76, 161, 70, 67, 183, 21, 70, 214, 163, 254, 175, 204, 36, - 86, 233, 75, 175, 202, 93, 137, 73, 141, 217, 74, 141, 184, 84, 77, 162, - 201, 74, 111, 23, 250, 141, 78, 193, 95, 91, 214, 252, 180, 92, 213, 224, - 126, 190, 236, 79, 6, 59, 136, 170, 60, 16, 169, 50, 130, 84, 241, 63, - 211, 71, 180, 30, 161, 118, 25, 225, 160, 178, 13, 61, 83, 31, 135, 110, - 104, 231, 180, 207, 228, 92, 87, 49, 63, 125, 174, 127, 90, 36, 29, 38, - 225, 225, 227, 5, 84, 101, 234, 85, 226, 156, 107, 31, 58, 223, 92, 61, - 134, 241, 245, 33, 19, 205, 158, 75, 8, 139, 89, 214, 51, 245, 200, 98, - 57, 30, 13, 141, 76, 186, 136, 92, 181, 179, 187, 231, 211, 97, 239, 97, - 60, 95, 205, 115, 196, 36, 100, 145, 28, 254, 26, 122, 210, 237, 56, 155, - 161, 121, 242, 207, 114, 61, 181, 43, 243, 44, 227, 195, 34, 121, 63, 137, - 252, 27, 150, 180, 47, 232, 44, 110, 71, 225, 113, 148, 183, 73, 17, 93, - 187, 222, 237, 227, 199, 143, 27, 255, 244, 32, 164, 255, 143, 67, 205, 193, - 40, 67, 5, 129, 82, 243, 1, 119, 163, 217, 118, 106, 202, 195, 164, 239, - 250, 176, 26, 205, 6, 147, 169, 136, 212, 13, 184, 224, 30, 211, 32, 136, - 122, 37, 205, 151, 217, 197, 11, 51, 220, 46, 32, 30, 31, 151, 205, 71, - 83, 65, 218, 104, 108, 93, 139, 60, 234, 113, 129, 195, 220, 89, 213, 156, - 185, 186, 92, 251, 139, 120, 199, 94, 101, 150, 248, 18, 223, 101, 69, 196, - 98, 158, 140, 185, 121, 7, 6, 67, 218, 170, 136, 173, 26, 173, 38, 24, - 196, 202, 102, 40, 246, 154, 3, 177, 147, 63, 120, 93, 98, 99, 32, 128, - 222, 130, 105, 120, 241, 27, 196, 10, 53, 161, 224, 210, 95, 79, 150, 244, - 190, 166, 247, 13, 253, 251, 72, 255, 214, 120, 216, 172, 241, 245, 10, 73, - 25, 77, 74, 251, 209, 186, 166, 64, 120, 240, 184, 206, 13, 104, 223, 63, - 20, 135, 130, 42, 197, 161, 195, 32, 149, 1, 68, 26, 246, 104, 34, 236, - 17, 243, 70, 22, 32, 82, 49, 73, 203, 254, 106, 211, 95, 172, 198, 204, - 38, 193, 151, 242, 116, 180, 60, 226, 178, 154, 170, 172, 163, 61, 118, 70, - 186, 201, 13, 86, 252, 69, 99, 215, 142, 127, 176, 76, 211, 82, 180, 43, - 173, 210, 65, 35, 206, 25, 203, 92, 133, 53, 148, 202, 233, 72, 110, 211, - 137, 227, 110, 152, 110, 102, 246, 55, 220, 176, 30, 39, 148, 54, 221, 254, - 87, 27, 96, 117, 185, 90, 196, 233, 33, 102, 93, 99, 123, 120, 238, 243, - 107, 122, 216, 56, 132, 101, 175, 122, 105, 30, 50, 63, 4, 109, 89, 68, - 79, 16, 61, 73, 215, 42, 122, 66, 49, 214, 58, 58, 94, 54, 238, 203, - 71, 247, 101, 157, 249, 180, 89, 59, 249, 30, 130, 55, 219, 30, 166, 68, - 115, 179, 3, 231, 60, 6, 23, 177, 10, 149, 76, 236, 206, 190, 216, 29, - 196, 174, 24, 165, 32, 140, 45, 205, 71, 234, 95, 81, 12, 234, 219, 87, - 76, 78, 112, 23, 135, 65, 251, 240, 43, 136, 98, 81, 196, 97, 208, 193, - 75, 126, 237, 29, 154, 254, 59, 212, 139, 207, 202, 120, 48, 109, 160, 203, - 243, 114, 117, 24, 196, 135, 215, 220, 135, 91, 98, 197, 120, 204, 105, 134, - 77, 231, 68, 200, 97, 200, 153, 249, 147, 133, 42, 99, 238, 155, 49, 215, - 122, 5, 236, 148, 134, 181, 9, 4, 209, 169, 80, 185, 244, 127, 77, 229, - 50, 21, 74, 255, 193, 189, 229, 118, 202, 114, 244, 247, 42, 140, 178, 207, - 155, 176, 187, 243, 99, 235, 51, 22, 89, 155, 145, 158, 33, 77, 195, 181, - 238, 124, 57, 234, 25, 244, 39, 108, 169, 13, 237, 47, 70, 119, 141, 164, - 234, 232, 84, 214, 153, 163, 242, 232, 200, 56, 28, 130, 104, 45, 82, 107, - 131, 78, 133, 59, 55, 232, 93, 221, 63, 1, 98, 131, 245, 62, 184, 218, - 233, 203, 127, 85, 206, 209, 28, 110, 205, 55, 135, 23, 135, 103, 135, 151, - 135, 149, 255, 218, 170, 114, 147, 67, 94, 150, 231, 91, 175, 103, 87, 125, - 32, 64, 227, 214, 246, 141, 120, 125, 104, 132, 233, 65, 229, 68, 27, 36, - 34, 22, 253, 254, 145, 200, 178, 205, 250, 227, 192, 255, 116, 14, 190, 27, - 63, 155, 221, 71, 55, 187, 143, 235, 205, 231, 101, 247, 113, 157, 203, 110, - 189, 217, 221, 166, 223, 175, 194, 155, 245, 43, 58, 224, 51, 139, 243, 178, - 230, 103, 158, 213, 46, 112, 182, 100, 117, 65, 248, 50, 164, 232, 45, 191, - 114, 230, 253, 245, 113, 50, 248, 21, 223, 170, 235, 40, 92, 199, 180, 145, - 127, 100, 169, 5, 92, 118, 13, 126, 181, 0, 90, 52, 83, 146, 250, 243, - 182, 2, 18, 158, 63, 49, 5, 192, 252, 238, 195, 227, 114, 92, 29, 77, - 87, 81, 72, 127, 98, 78, 205, 49, 174, 76, 188, 70, 227, 154, 66, 17, - 5, 187, 249, 238, 79, 64, 68, 122, 152, 63, 84, 57, 125, 111, 25, 139, - 168, 128, 162, 54, 155, 38, 242, 245, 57, 209, 90, 81, 201, 151, 43, 250, - 20, 82, 66, 96, 98, 113, 149, 184, 65, 244, 162, 88, 55, 19, 247, 50, - 10, 61, 184, 67, 66, 245, 185, 196, 115, 111, 58, 7, 82, 22, 194, 232, - 56, 59, 247, 198, 19, 243, 26, 211, 235, 195, 228, 105, 190, 18, 140, 45, - 192, 83, 173, 170, 85, 138, 223, 240, 199, 19, 192, 201, 162, 199, 194, 200, - 22, 51, 157, 95, 164, 227, 73, 168, 95, 57, 205, 116, 174, 98, 5, 49, - 231, 5, 233, 195, 116, 110, 211, 112, 96, 16, 115, 92, 74, 43, 113, 67, - 191, 217, 28, 79, 20, 251, 166, 114, 245, 123, 43, 70, 251, 250, 206, 230, - 90, 59, 215, 111, 141, 134, 30, 189, 239, 108, 70, 250, 243, 120, 210, 108, - 234, 207, 200, 68, 216, 52, 100, 173, 155, 125, 65, 9, 184, 223, 116, 0, - 165, 169, 217, 226, 117, 119, 72, 28, 42, 91, 7, 48, 199, 135, 204, 100, - 204, 190, 134, 96, 42, 86, 130, 151, 117, 36, 146, 151, 117, 116, 193, 98, - 163, 70, 131, 6, 133, 115, 228, 182, 210, 11, 218, 186, 140, 137, 25, 150, - 248, 200, 98, 141, 4, 49, 18, 176, 100, 148, 35, 198, 58, 98, 154, 198, - 156, 13, 6, 54, 51, 119, 33, 215, 163, 104, 148, 170, 25, 215, 164, 229, - 30, 23, 143, 200, 92, 195, 10, 187, 59, 87, 84, 34, 174, 232, 230, 147, - 161, 166, 222, 99, 38, 223, 217, 11, 170, 75, 186, 43, 198, 209, 196, 86, - 219, 254, 228, 115, 41, 119, 168, 35, 105, 34, 12, 101, 148, 251, 41, 209, - 118, 132, 166, 200, 110, 216, 142, 180, 23, 22, 226, 110, 92, 67, 109, 34, - 236, 109, 51, 114, 246, 147, 86, 125, 37, 201, 177, 158, 229, 109, 202, 67, - 104, 99, 155, 89, 42, 24, 109, 69, 235, 27, 10, 191, 41, 234, 134, 172, - 38, 219, 8, 98, 229, 147, 65, 158, 138, 150, 197, 20, 145, 131, 36, 78, - 146, 139, 67, 107, 41, 139, 242, 78, 117, 219, 220, 205, 103, 98, 190, 210, - 131, 130, 93, 78, 19, 182, 96, 202, 207, 0, 184, 0, 115, 214, 239, 86, - 242, 205, 42, 5, 151, 217, 160, 205, 46, 37, 38, 85, 234, 23, 177, 103, - 217, 58, 66, 113, 52, 103, 98, 151, 240, 37, 133, 174, 37, 180, 133, 14, - 178, 247, 24, 189, 117, 234, 86, 144, 6, 177, 76, 145, 201, 233, 29, 42, - 7, 130, 24, 228, 22, 182, 241, 191, 151, 233, 186, 140, 0, 34, 59, 41, - 14, 220, 251, 10, 164, 119, 77, 234, 98, 231, 254, 162, 155, 6, 157, 140, - 254, 210, 247, 182, 132, 12, 152, 4, 186, 32, 167, 214, 234, 42, 153, 3, - 20, 104, 50, 163, 20, 83, 6, 221, 214, 100, 168, 109, 51, 16, 0, 58, - 208, 44, 82, 51, 172, 104, 74, 123, 131, 187, 185, 140, 158, 64, 11, 23, - 138, 142, 69, 173, 181, 133, 133, 86, 54, 91, 205, 30, 81, 227, 26, 90, - 68, 57, 185, 175, 133, 252, 251, 86, 96, 220, 151, 107, 13, 136, 94, 166, - 248, 212, 97, 204, 128, 78, 248, 124, 20, 116, 106, 162, 177, 78, 201, 54, - 159, 74, 214, 101, 28, 129, 110, 56, 62, 162, 6, 73, 178, 135, 105, 127, - 6, 7, 124, 124, 229, 137, 162, 249, 239, 198, 175, 67, 153, 6, 247, 31, - 236, 133, 47, 98, 220, 76, 168, 47, 137, 202, 19, 81, 100, 172, 227, 19, - 157, 191, 104, 103, 222, 162, 246, 148, 117, 189, 214, 242, 55, 173, 150, 199, - 138, 69, 212, 29, 39, 12, 167, 182, 217, 161, 33, 245, 81, 20, 20, 21, - 105, 65, 169, 62, 14, 214, 174, 235, 8, 12, 34, 100, 130, 74, 155, 53, - 163, 72, 97, 18, 13, 214, 155, 143, 202, 71, 28, 21, 235, 255, 2, 208, - 68, 36, 56, 101, 21, 45, 193, 224, 193, 249, 1, 214, 144, 85, 133, 50, - 192, 55, 10, 25, 71, 185, 58, 36, 146, 222, 44, 10, 184, 237, 221, 133, - 181, 128, 27, 159, 186, 186, 179, 105, 32, 166, 52, 130, 85, 197, 116, 98, - 191, 209, 18, 217, 22, 164, 89, 175, 145, 118, 225, 78, 250, 117, 2, 47, - 162, 189, 161, 228, 163, 45, 86, 203, 52, 238, 77, 56, 118, 231, 145, 186, - 213, 85, 17, 93, 12, 69, 14, 130, 225, 68, 127, 58, 233, 47, 213, 133, - 47, 67, 151, 115, 57, 10, 188, 207, 216, 16, 118, 195, 220, 135, 92, 210, - 194, 38, 134, 184, 74, 217, 233, 75, 118, 178, 156, 146, 126, 39, 50, 154, - 251, 220, 46, 209, 200, 204, 54, 75, 107, 110, 20, 90, 166, 238, 97, 119, - 52, 12, 16, 228, 114, 30, 150, 55, 174, 220, 30, 32, 51, 34, 56, 5, - 51, 3, 244, 154, 235, 218, 172, 101, 113, 228, 236, 132, 221, 236, 70, 152, - 81, 164, 178, 151, 188, 93, 140, 140, 129, 34, 216, 37, 219, 117, 6, 162, - 40, 62, 203, 43, 245, 211, 94, 201, 65, 220, 197, 188, 87, 170, 24, 6, - 83, 173, 173, 130, 220, 14, 226, 43, 220, 160, 171, 76, 50, 231, 183, 126, - 166, 47, 185, 123, 243, 33, 110, 226, 215, 163, 67, 122, 140, 225, 28, 198, - 25, 56, 95, 222, 126, 5, 194, 192, 88, 247, 246, 209, 116, 198, 212, 97, - 227, 29, 214, 181, 226, 187, 200, 16, 55, 25, 77, 145, 76, 195, 124, 17, - 24, 107, 117, 74, 113, 0, 203, 157, 214, 155, 55, 20, 141, 232, 55, 88, - 227, 82, 196, 56, 27, 145, 8, 6, 39, 110, 196, 42, 136, 180, 57, 13, - 90, 198, 166, 161, 99, 224, 157, 56, 155, 110, 4, 7, 58, 91, 173, 234, - 117, 68, 179, 192, 252, 70, 173, 211, 240, 77, 164, 120, 103, 220, 119, 63, - 174, 230, 130, 65, 132, 203, 99, 101, 169, 212, 105, 178, 26, 107, 208, 109, - 208, 206, 93, 111, 39, 141, 164, 182, 213, 73, 142, 85, 89, 28, 95, 151, - 118, 108, 74, 59, 86, 165, 29, 231, 74, 251, 4, 102, 165, 154, 194, 227, - 249, 195, 40, 139, 205, 90, 92, 225, 255, 29, 113, 40, 54, 203, 103, 245, - 44, 251, 124, 229, 250, 12, 208, 106, 25, 161, 97, 43, 101, 86, 153, 170, - 162, 75, 90, 236, 154, 254, 251, 107, 185, 7, 251, 180, 100, 82, 42, 208, - 169, 254, 195, 192, 175, 40, 25, 49, 12, 129, 208, 233, 180, 122, 226, 138, - 103, 140, 209, 78, 0, 227, 230, 31, 210, 73, 50, 249, 42, 237, 134, 147, - 112, 210, 96, 87, 95, 155, 131, 164, 86, 59, 132, 1, 91, 59, 9, 59, - 39, 231, 250, 55, 137, 222, 224, 88, 106, 219, 135, 55, 148, 107, 135, 50, - 237, 116, 207, 229, 106, 171, 25, 159, 39, 221, 118, 152, 36, 208, 191, 63, - 173, 229, 142, 79, 88, 135, 11, 186, 155, 6, 125, 219, 233, 156, 114, 56, - 153, 66, 121, 91, 14, 16, 67, 39, 169, 115, 130, 194, 28, 216, 74, 81, - 8, 130, 88, 220, 156, 26, 121, 39, 31, 145, 6, 183, 82, 160, 188, 86, - 251, 135, 157, 75, 44, 88, 241, 71, 236, 0, 233, 165, 160, 208, 167, 107, - 83, 213, 230, 222, 143, 203, 230, 116, 242, 235, 168, 230, 216, 71, 124, 153, - 29, 216, 46, 228, 75, 211, 20, 141, 138, 154, 119, 72, 113, 98, 33, 177, - 12, 212, 149, 211, 172, 50, 164, 43, 211, 140, 56, 33, 118, 34, 100, 106, - 88, 64, 251, 29, 205, 114, 96, 96, 29, 239, 76, 190, 35, 98, 124, 236, - 100, 26, 133, 157, 176, 19, 113, 160, 154, 114, 199, 90, 223, 185, 179, 59, - 177, 231, 12, 243, 110, 134, 140, 142, 161, 196, 30, 67, 89, 136, 78, 231, - 28, 234, 184, 228, 122, 39, 61, 113, 161, 110, 186, 162, 68, 120, 236, 162, - 108, 229, 134, 181, 96, 228, 178, 203, 232, 44, 139, 216, 105, 198, 136, 207, - 26, 218, 82, 221, 1, 10, 21, 74, 151, 209, 16, 250, 217, 11, 128, 129, - 244, 179, 31, 55, 190, 10, 142, 67, 61, 209, 66, 153, 124, 219, 138, 66, - 154, 221, 163, 35, 148, 61, 101, 22, 79, 202, 168, 237, 120, 235, 207, 70, - 119, 236, 157, 7, 142, 125, 216, 187, 29, 48, 226, 161, 122, 55, 179, 16, - 21, 10, 214, 147, 118, 121, 79, 32, 85, 95, 104, 179, 14, 46, 235, 0, - 201, 113, 190, 53, 160, 193, 201, 247, 208, 125, 208, 205, 116, 170, 192, 221, - 117, 61, 72, 142, 68, 83, 48, 16, 96, 216, 24, 231, 88, 212, 58, 209, - 87, 81, 124, 168, 209, 185, 149, 177, 222, 100, 245, 246, 93, 149, 92, 60, - 149, 110, 235, 68, 134, 226, 94, 165, 119, 55, 237, 47, 45, 162, 140, 226, - 81, 249, 180, 87, 244, 159, 79, 52, 47, 141, 199, 172, 183, 28, 193, 162, - 31, 158, 198, 119, 104, 227, 26, 29, 109, 149, 175, 47, 249, 126, 230, 77, - 182, 32, 195, 40, 181, 57, 85, 7, 214, 167, 53, 214, 152, 162, 38, 83, - 174, 35, 151, 109, 86, 18, 49, 7, 234, 229, 27, 155, 161, 195, 14, 92, - 238, 83, 57, 235, 200, 248, 203, 204, 77, 229, 108, 11, 203, 78, 14, 139, - 201, 162, 218, 161, 33, 139, 209, 151, 77, 219, 151, 168, 133, 153, 174, 237, - 112, 52, 235, 19, 237, 63, 12, 137, 79, 224, 135, 109, 165, 228, 130, 125, - 114, 159, 190, 76, 238, 225, 200, 160, 233, 7, 147, 123, 175, 145, 215, 82, - 103, 160, 21, 102, 58, 50, 87, 236, 102, 30, 197, 35, 218, 144, 190, 2, - 34, 4, 19, 15, 109, 88, 251, 76, 71, 171, 249, 76, 121, 109, 116, 19, - 101, 121, 20, 240, 51, 40, 82, 153, 148, 193, 155, 3, 181, 173, 190, 243, - 112, 1, 168, 140, 107, 131, 167, 133, 32, 236, 105, 208, 72, 182, 46, 229, - 24, 185, 89, 80, 129, 99, 235, 94, 202, 61, 119, 118, 73, 86, 222, 135, - 189, 111, 195, 222, 31, 141, 202, 248, 46, 184, 108, 169, 192, 103, 1, 1, - 88, 227, 62, 158, 135, 92, 85, 133, 51, 132, 171, 238, 118, 162, 206, 9, - 93, 93, 109, 10, 102, 121, 142, 246, 233, 110, 24, 163, 247, 233, 183, 233, - 31, 25, 69, 51, 139, 185, 93, 118, 138, 72, 229, 67, 79, 247, 98, 102, - 227, 206, 204, 219, 216, 21, 154, 180, 19, 71, 199, 19, 92, 131, 49, 249, - 66, 213, 50, 156, 130, 197, 44, 235, 102, 230, 253, 9, 99, 118, 238, 246, - 5, 91, 138, 225, 109, 250, 122, 167, 87, 73, 236, 228, 26, 6, 128, 54, - 113, 221, 123, 97, 206, 29, 172, 75, 114, 29, 135, 198, 255, 235, 73, 8, - 165, 239, 55, 181, 28, 236, 119, 100, 108, 142, 227, 28, 8, 51, 119, 90, - 155, 145, 142, 232, 104, 160, 108, 192, 238, 51, 58, 16, 30, 130, 182, 55, - 109, 233, 69, 213, 209, 187, 118, 82, 103, 7, 119, 153, 55, 37, 39, 136, - 174, 53, 8, 128, 11, 146, 43, 232, 185, 114, 244, 54, 223, 68, 198, 209, - 1, 5, 242, 77, 135, 198, 240, 211, 136, 193, 145, 104, 131, 170, 55, 96, - 212, 155, 231, 99, 228, 167, 223, 92, 245, 25, 227, 250, 181, 3, 127, 42, - 47, 0, 110, 190, 220, 10, 44, 241, 45, 113, 26, 186, 103, 216, 248, 55, - 227, 198, 92, 60, 197, 234, 44, 229, 126, 141, 159, 45, 196, 116, 9, 18, - 229, 88, 97, 81, 30, 117, 216, 195, 133, 57, 220, 58, 94, 98, 225, 150, - 97, 242, 233, 59, 240, 203, 81, 152, 1, 102, 46, 24, 132, 97, 219, 128, - 192, 149, 63, 4, 239, 24, 170, 186, 26, 51, 242, 147, 32, 30, 11, 184, - 81, 30, 239, 217, 239, 24, 212, 99, 88, 11, 27, 27, 59, 42, 170, 171, - 76, 192, 22, 79, 70, 13, 255, 1, 247, 181, 16, 80, 49, 66, 35, 247, - 137, 146, 98, 181, 78, 186, 117, 6, 140, 130, 40, 75, 189, 140, 241, 2, - 107, 184, 58, 92, 150, 43, 44, 228, 150, 51, 208, 240, 119, 19, 25, 156, - 199, 172, 15, 80, 54, 140, 147, 190, 117, 246, 59, 199, 156, 21, 206, 0, - 113, 136, 91, 164, 53, 141, 246, 46, 94, 189, 248, 154, 66, 52, 230, 173, - 13, 89, 22, 172, 205, 224, 44, 222, 220, 41, 31, 184, 46, 218, 66, 129, - 20, 239, 207, 38, 203, 249, 138, 230, 219, 38, 39, 139, 86, 46, 50, 148, - 23, 50, 241, 54, 186, 236, 221, 204, 231, 46, 12, 3, 135, 49, 135, 60, - 44, 181, 183, 201, 154, 132, 126, 46, 190, 138, 116, 135, 232, 201, 59, 29, - 146, 118, 120, 119, 116, 122, 37, 141, 197, 158, 86, 89, 172, 181, 115, 238, - 53, 114, 16, 14, 81, 219, 181, 177, 209, 93, 37, 6, 57, 46, 250, 99, - 134, 222, 87, 200, 15, 182, 203, 76, 20, 119, 219, 214, 110, 59, 180, 223, - 55, 78, 99, 186, 206, 129, 137, 80, 253, 86, 234, 59, 193, 76, 140, 248, - 181, 32, 16, 158, 157, 75, 158, 179, 241, 219, 189, 189, 141, 94, 114, 105, - 241, 118, 70, 38, 212, 46, 64, 204, 201, 203, 169, 2, 168, 148, 183, 55, - 25, 243, 96, 54, 235, 193, 87, 243, 30, 103, 209, 238, 224, 250, 76, 172, - 246, 60, 99, 181, 215, 233, 106, 131, 161, 136, 21, 183, 98, 229, 100, 28, - 190, 207, 118, 41, 112, 149, 153, 21, 211, 86, 110, 230, 72, 232, 174, 23, - 103, 98, 132, 50, 35, 66, 51, 23, 66, 189, 68, 244, 176, 135, 106, 196, - 67, 51, 212, 161, 29, 227, 208, 49, 67, 51, 131, 26, 234, 241, 12, 237, - 56, 82, 237, 155, 113, 103, 235, 169, 9, 200, 162, 162, 64, 149, 141, 13, - 113, 23, 73, 70, 27, 10, 116, 238, 197, 56, 239, 122, 155, 35, 201, 176, - 181, 48, 174, 183, 87, 240, 174, 5, 132, 38, 91, 219, 192, 169, 110, 224, - 212, 55, 48, 21, 246, 250, 202, 168, 103, 128, 75, 243, 64, 53, 184, 254, - 60, 62, 18, 225, 144, 212, 147, 1, 121, 19, 117, 15, 240, 88, 189, 194, - 53, 231, 248, 235, 232, 26, 50, 127, 35, 88, 55, 29, 174, 197, 226, 156, - 166, 162, 53, 253, 217, 71, 66, 234, 87, 43, 129, 51, 30, 21, 191, 65, - 83, 241, 178, 82, 175, 4, 206, 200, 84, 142, 42, 54, 183, 138, 213, 89, - 151, 156, 6, 240, 120, 165, 244, 214, 167, 35, 163, 250, 191, 68, 176, 82, - 98, 231, 224, 191, 168, 59, 98, 122, 252, 119, 86, 245, 254, 11, 213, 169, - 78, 169, 27, 244, 20, 95, 215, 151, 253, 80, 30, 84, 80, 130, 32, 168, - 123, 227, 230, 182, 18, 232, 145, 172, 132, 255, 126, 148, 194, 101, 237, 41, - 197, 66, 239, 87, 255, 189, 134, 219, 224, 127, 103, 106, 33, 48, 227, 236, - 221, 226, 134, 160, 82, 247, 230, 143, 112, 181, 52, 127, 226, 191, 143, 183, - 252, 124, 43, 74, 4, 243, 201, 26, 161, 242, 7, 97, 19, 14, 220, 224, - 93, 254, 112, 96, 204, 49, 57, 229, 132, 67, 154, 8, 193, 149, 120, 37, - 80, 115, 180, 226, 215, 245, 245, 242, 109, 184, 185, 101, 44, 208, 139, 74, - 96, 230, 114, 229, 155, 74, 160, 167, 113, 229, 12, 247, 200, 243, 123, 206, - 1, 230, 14, 243, 7, 105, 228, 252, 129, 246, 125, 159, 239, 164, 135, 83, - 185, 195, 30, 78, 41, 23, 25, 244, 10, 174, 160, 135, 211, 208, 147, 170, - 200, 224, 175, 111, 113, 89, 190, 177, 1, 155, 91, 117, 123, 78, 177, 190, - 74, 185, 218, 191, 253, 230, 83, 12, 188, 80, 197, 184, 150, 113, 72, 225, - 33, 189, 214, 234, 41, 234, 1, 237, 246, 135, 115, 95, 53, 146, 254, 158, - 235, 150, 78, 56, 63, 238, 53, 74, 71, 116, 129, 110, 94, 164, 28, 100, - 61, 21, 63, 197, 234, 19, 55, 233, 241, 182, 78, 169, 27, 232, 243, 250, - 211, 237, 5, 53, 137, 66, 82, 234, 64, 255, 137, 127, 113, 97, 126, 219, - 72, 31, 111, 207, 189, 13, 253, 62, 209, 175, 12, 18, 66, 100, 160, 16, - 198, 99, 168, 138, 185, 9, 55, 55, 110, 13, 138, 159, 178, 53, 184, 169, - 83, 106, 212, 224, 166, 254, 116, 195, 53, 184, 81, 53, 184, 209, 53, 184, - 105, 166, 143, 55, 84, 3, 250, 125, 186, 57, 87, 83, 6, 33, 50, 109, - 16, 38, 83, 69, 245, 250, 13, 247, 186, 13, 216, 220, 152, 94, 191, 225, - 94, 191, 145, 94, 231, 23, 170, 146, 233, 245, 27, 234, 245, 155, 66, 175, - 115, 11, 214, 55, 220, 235, 252, 204, 249, 97, 86, 127, 167, 148, 194, 244, - 100, 150, 181, 53, 229, 169, 167, 166, 5, 85, 95, 205, 220, 141, 154, 172, - 143, 182, 67, 66, 193, 179, 165, 94, 202, 133, 241, 20, 44, 155, 194, 225, - 230, 243, 39, 176, 186, 3, 70, 51, 147, 112, 13, 244, 135, 250, 99, 184, - 225, 223, 39, 122, 111, 168, 247, 6, 191, 207, 31, 184, 2, 223, 177, 78, - 154, 161, 191, 126, 133, 61, 51, 46, 206, 246, 89, 45, 47, 31, 230, 208, - 162, 209, 10, 208, 121, 65, 181, 250, 252, 37, 178, 105, 134, 242, 40, 19, - 75, 55, 84, 198, 196, 177, 233, 10, 88, 212, 151, 118, 65, 144, 32, 113, - 202, 96, 95, 196, 139, 157, 82, 103, 126, 133, 154, 189, 193, 126, 73, 162, - 253, 216, 47, 94, 79, 97, 234, 17, 231, 182, 31, 252, 69, 197, 59, 147, - 43, 209, 248, 32, 97, 100, 83, 64, 22, 137, 55, 45, 22, 132, 169, 114, - 2, 17, 119, 103, 61, 131, 102, 238, 59, 85, 53, 196, 185, 5, 238, 72, - 90, 167, 136, 116, 122, 172, 110, 66, 229, 187, 17, 28, 136, 128, 158, 134, - 80, 176, 69, 52, 211, 159, 35, 106, 161, 158, 169, 189, 75, 23, 134, 89, - 229, 241, 37, 130, 99, 133, 242, 82, 64, 28, 215, 20, 159, 41, 182, 212, - 109, 155, 46, 61, 102, 1, 176, 103, 27, 148, 191, 160, 216, 201, 195, 159, - 238, 186, 186, 40, 54, 168, 8, 20, 254, 184, 44, 42, 56, 136, 130, 76, - 219, 183, 181, 214, 166, 9, 130, 205, 171, 102, 85, 91, 180, 222, 31, 103, - 76, 140, 96, 196, 161, 17, 19, 178, 187, 12, 109, 237, 82, 144, 239, 56, - 198, 6, 6, 148, 122, 239, 45, 17, 147, 128, 171, 47, 183, 55, 16, 33, - 97, 92, 68, 94, 220, 131, 198, 100, 171, 9, 55, 201, 158, 91, 107, 187, - 64, 187, 202, 137, 222, 110, 162, 181, 80, 227, 221, 242, 190, 2, 132, 225, - 43, 13, 15, 52, 10, 14, 27, 32, 136, 80, 1, 155, 91, 67, 65, 117, - 50, 134, 167, 190, 72, 194, 107, 155, 173, 16, 4, 221, 51, 241, 148, 84, - 15, 111, 12, 238, 66, 3, 166, 237, 71, 105, 217, 11, 177, 232, 228, 90, - 38, 20, 94, 141, 86, 139, 9, 139, 235, 24, 167, 160, 176, 111, 170, 239, - 95, 178, 111, 10, 238, 65, 233, 0, 169, 156, 227, 200, 51, 117, 216, 131, - 151, 85, 168, 71, 238, 214, 14, 133, 149, 111, 154, 207, 99, 160, 3, 41, - 69, 21, 184, 195, 88, 176, 248, 93, 255, 227, 237, 52, 49, 38, 29, 230, - 246, 46, 102, 108, 106, 68, 126, 30, 103, 76, 119, 248, 114, 103, 231, 49, - 244, 220, 95, 208, 177, 136, 254, 124, 11, 102, 253, 221, 229, 46, 166, 92, - 252, 86, 230, 21, 251, 222, 174, 223, 249, 127, 152, 13, 55, 254, 127, 114, - 30, 124, 5, 230, 19, 9, 254, 60, 95, 252, 250, 185, 98, 245, 183, 178, - 141, 189, 75, 223, 230, 85, 191, 220, 11, 173, 114, 205, 63, 213, 140, 54, - 80, 22, 194, 78, 228, 153, 102, 229, 253, 79, 138, 147, 149, 118, 154, 24, - 40, 194, 188, 110, 95, 16, 175, 105, 59, 218, 223, 176, 28, 108, 68, 148, - 66, 68, 147, 113, 18, 80, 240, 174, 162, 44, 118, 218, 24, 157, 5, 13, - 31, 255, 137, 245, 80, 154, 33, 60, 230, 81, 237, 10, 61, 230, 199, 142, - 122, 145, 126, 74, 112, 11, 203, 62, 203, 194, 78, 216, 173, 225, 76, 106, - 211, 121, 151, 116, 124, 193, 64, 78, 128, 196, 109, 64, 214, 58, 250, 178, - 31, 19, 197, 209, 64, 216, 12, 110, 6, 11, 118, 23, 233, 55, 212, 29, - 172, 104, 76, 201, 125, 141, 0, 109, 62, 60, 0, 138, 119, 53, 33, 118, - 137, 221, 56, 11, 202, 148, 227, 100, 200, 117, 49, 148, 159, 88, 80, 11, - 242, 247, 58, 24, 212, 138, 63, 162, 145, 105, 111, 110, 13, 144, 195, 237, - 228, 102, 180, 88, 230, 212, 23, 85, 96, 110, 146, 10, 27, 222, 140, 41, - 187, 117, 214, 47, 17, 135, 109, 50, 97, 121, 159, 95, 92, 85, 43, 48, - 130, 113, 81, 233, 212, 21, 25, 208, 33, 177, 139, 51, 255, 102, 228, 227, - 210, 56, 98, 7, 125, 124, 105, 156, 36, 160, 40, 228, 13, 98, 7, 253, - 220, 78, 143, 79, 244, 151, 237, 43, 4, 251, 199, 89, 121, 253, 113, 87, - 95, 55, 205, 159, 149, 86, 145, 189, 123, 226, 111, 249, 174, 18, 209, 82, - 161, 175, 36, 88, 68, 90, 230, 174, 88, 247, 76, 111, 157, 218, 231, 13, - 125, 223, 189, 212, 184, 183, 66, 79, 15, 176, 67, 43, 28, 187, 180, 194, - 113, 153, 154, 80, 167, 28, 5, 78, 36, 252, 86, 150, 212, 117, 165, 66, - 199, 105, 209, 37, 1, 191, 156, 92, 164, 109, 35, 56, 162, 208, 166, 220, - 25, 156, 154, 203, 131, 55, 110, 240, 155, 12, 116, 251, 238, 25, 80, 128, - 10, 94, 210, 110, 254, 176, 220, 113, 237, 11, 85, 98, 92, 23, 152, 43, - 52, 229, 181, 64, 122, 222, 189, 52, 150, 203, 95, 21, 158, 187, 66, 16, - 41, 70, 5, 216, 43, 152, 65, 219, 138, 204, 148, 140, 251, 38, 168, 120, - 242, 253, 194, 235, 53, 143, 158, 181, 16, 221, 248, 111, 20, 250, 183, 6, - 224, 185, 224, 25, 174, 150, 88, 181, 40, 104, 139, 142, 208, 214, 127, 16, - 57, 18, 107, 10, 241, 37, 48, 253, 140, 5, 34, 38, 202, 195, 11, 243, - 173, 218, 3, 118, 151, 174, 198, 146, 129, 29, 180, 171, 219, 9, 212, 226, - 231, 131, 90, 109, 43, 160, 243, 193, 51, 29, 246, 26, 173, 248, 19, 89, - 9, 193, 173, 29, 21, 21, 114, 29, 35, 87, 79, 121, 73, 164, 31, 193, - 52, 157, 137, 83, 68, 16, 17, 193, 18, 111, 172, 79, 233, 7, 75, 166, - 41, 112, 164, 226, 62, 0, 145, 113, 33, 160, 119, 67, 33, 83, 212, 75, - 112, 124, 224, 27, 240, 156, 102, 208, 197, 213, 204, 2, 56, 115, 29, 70, - 36, 238, 98, 159, 108, 112, 49, 113, 38, 64, 46, 187, 27, 183, 200, 92, - 237, 181, 29, 181, 215, 226, 34, 62, 187, 253, 194, 239, 120, 15, 8, 252, - 167, 245, 106, 240, 220, 124, 6, 216, 31, 230, 74, 15, 240, 251, 111, 108, - 152, 103, 174, 91, 12, 134, 92, 222, 237, 212, 173, 120, 184, 156, 84, 215, - 141, 128, 115, 173, 67, 88, 181, 57, 26, 195, 43, 57, 51, 192, 3, 28, - 10, 181, 67, 159, 106, 129, 104, 205, 253, 209, 60, 110, 1, 34, 134, 27, - 201, 113, 195, 81, 215, 71, 207, 28, 213, 205, 79, 199, 107, 238, 139, 231, - 41, 201, 177, 0, 251, 177, 247, 152, 172, 48, 89, 130, 6, 118, 52, 48, - 86, 26, 30, 140, 59, 174, 101, 252, 96, 242, 224, 102, 252, 96, 154, 199, - 141, 82, 244, 231, 243, 10, 55, 211, 192, 28, 84, 235, 201, 115, 112, 152, - 196, 223, 165, 129, 178, 221, 171, 89, 198, 46, 23, 153, 218, 92, 141, 214, - 88, 132, 187, 248, 59, 13, 175, 165, 144, 133, 20, 34, 87, 137, 111, 100, - 113, 226, 168, 114, 251, 188, 219, 9, 149, 168, 192, 240, 29, 103, 49, 190, - 140, 231, 110, 11, 14, 22, 183, 202, 56, 192, 134, 106, 33, 155, 220, 72, - 83, 243, 20, 211, 177, 6, 225, 82, 158, 110, 41, 179, 236, 237, 106, 89, - 203, 178, 155, 168, 254, 176, 67, 181, 93, 215, 93, 171, 181, 155, 138, 91, - 143, 117, 159, 244, 97, 9, 100, 49, 35, 82, 48, 52, 211, 141, 70, 164, - 138, 90, 113, 94, 249, 253, 3, 66, 19, 185, 39, 99, 165, 21, 218, 240, - 148, 52, 162, 190, 23, 135, 234, 236, 12, 132, 225, 3, 237, 246, 75, 21, - 50, 28, 221, 130, 188, 43, 96, 142, 79, 0, 241, 7, 91, 17, 48, 180, - 121, 45, 50, 117, 33, 45, 186, 81, 146, 131, 40, 154, 238, 99, 90, 14, - 51, 89, 102, 168, 144, 25, 106, 9, 26, 68, 52, 118, 152, 0, 185, 153, - 192, 9, 241, 160, 148, 228, 200, 171, 159, 149, 121, 206, 228, 218, 9, 235, - 230, 190, 37, 145, 103, 154, 238, 242, 66, 194, 164, 22, 20, 172, 246, 181, - 248, 115, 157, 72, 120, 9, 145, 205, 12, 221, 96, 241, 132, 93, 180, 181, - 132, 104, 104, 199, 15, 30, 123, 99, 47, 138, 143, 164, 181, 121, 160, 68, - 56, 61, 47, 5, 212, 36, 74, 0, 119, 67, 61, 117, 217, 73, 163, 124, - 131, 67, 169, 191, 32, 18, 115, 62, 3, 194, 19, 36, 46, 172, 75, 56, - 89, 76, 6, 227, 233, 104, 197, 163, 50, 27, 61, 222, 247, 103, 51, 30, - 150, 7, 216, 235, 14, 105, 92, 64, 24, 222, 79, 22, 139, 121, 81, 203, - 208, 34, 32, 210, 82, 146, 122, 173, 168, 7, 151, 220, 221, 159, 37, 141, - 48, 184, 155, 121, 192, 205, 108, 83, 140, 224, 104, 87, 123, 74, 47, 13, - 243, 125, 23, 122, 197, 222, 52, 83, 67, 129, 103, 10, 138, 166, 235, 40, - 83, 59, 158, 210, 24, 95, 0, 225, 20, 136, 175, 142, 3, 11, 220, 206, - 147, 109, 159, 234, 163, 236, 164, 202, 33, 110, 106, 87, 117, 210, 9, 190, - 116, 130, 222, 130, 96, 177, 174, 64, 188, 58, 161, 25, 200, 80, 13, 98, - 168, 7, 48, 148, 193, 3, 162, 151, 238, 53, 223, 246, 90, 201, 204, 29, - 148, 249, 215, 12, 226, 122, 245, 25, 6, 120, 236, 156, 102, 80, 230, 99, - 147, 200, 159, 234, 152, 163, 129, 209, 124, 175, 96, 131, 153, 249, 28, 172, - 63, 36, 97, 149, 189, 105, 15, 214, 181, 15, 73, 173, 33, 193, 27, 4, - 179, 67, 237, 193, 6, 193, 192, 239, 130, 183, 194, 224, 125, 157, 14, 108, - 46, 180, 246, 33, 104, 159, 247, 211, 77, 157, 225, 126, 185, 128, 243, 9, - 114, 108, 44, 234, 124, 43, 70, 229, 13, 54, 244, 194, 119, 97, 181, 240, - 35, 159, 239, 68, 35, 30, 238, 94, 83, 127, 125, 156, 44, 104, 130, 18, - 101, 11, 60, 202, 100, 70, 123, 239, 226, 227, 104, 70, 3, 97, 113, 241, - 204, 88, 153, 201, 156, 75, 166, 38, 55, 134, 151, 51, 56, 146, 28, 124, - 68, 153, 168, 125, 238, 97, 49, 255, 101, 52, 144, 14, 247, 246, 20, 235, - 192, 162, 216, 130, 119, 150, 23, 124, 243, 234, 2, 95, 1, 45, 195, 110, - 9, 153, 252, 133, 209, 176, 247, 163, 159, 250, 73, 93, 117, 186, 88, 123, - 254, 132, 27, 58, 233, 114, 10, 160, 131, 86, 238, 96, 126, 188, 136, 66, - 143, 122, 251, 97, 60, 129, 101, 103, 124, 238, 255, 216, 192, 49, 236, 6, - 226, 250, 231, 199, 38, 66, 97, 68, 186, 88, 224, 174, 18, 179, 225, 199, - 250, 143, 126, 195, 255, 169, 254, 19, 238, 49, 7, 192, 167, 162, 38, 86, - 147, 250, 98, 1, 3, 95, 49, 209, 93, 164, 105, 244, 77, 116, 6, 131, - 134, 42, 70, 120, 48, 168, 213, 85, 206, 20, 233, 71, 149, 40, 169, 254, - 24, 54, 127, 50, 31, 142, 30, 38, 82, 97, 122, 227, 231, 106, 163, 241, - 99, 173, 142, 26, 212, 159, 233, 237, 39, 174, 34, 5, 140, 169, 17, 213, - 175, 155, 9, 108, 102, 127, 60, 247, 127, 58, 175, 48, 216, 191, 235, 202, - 59, 246, 127, 5, 184, 243, 110, 87, 130, 203, 241, 104, 51, 114, 183, 98, - 187, 15, 179, 208, 64, 4, 201, 74, 104, 176, 7, 58, 6, 57, 53, 145, - 213, 107, 143, 216, 194, 254, 185, 78, 53, 142, 162, 198, 85, 143, 10, 64, - 50, 113, 43, 41, 219, 33, 117, 83, 224, 187, 79, 55, 202, 217, 17, 179, - 62, 50, 228, 23, 68, 86, 146, 63, 62, 255, 77, 55, 100, 135, 76, 81, - 122, 102, 4, 180, 96, 236, 108, 7, 180, 53, 28, 212, 178, 2, 247, 246, - 65, 30, 111, 70, 59, 195, 8, 58, 124, 103, 146, 245, 126, 177, 255, 26, - 135, 121, 56, 85, 78, 134, 143, 99, 81, 19, 202, 114, 239, 75, 64, 106, - 189, 196, 71, 65, 103, 171, 84, 174, 154, 65, 204, 58, 196, 12, 153, 42, - 143, 231, 187, 2, 129, 178, 154, 168, 64, 253, 196, 104, 171, 137, 141, 41, - 143, 98, 218, 71, 103, 191, 72, 198, 68, 241, 243, 197, 56, 48, 179, 228, - 190, 67, 19, 196, 123, 72, 130, 219, 233, 252, 121, 180, 200, 80, 116, 97, - 239, 118, 65, 219, 197, 104, 54, 216, 24, 223, 216, 11, 38, 9, 148, 202, - 84, 57, 205, 240, 187, 80, 8, 121, 2, 65, 85, 241, 139, 167, 181, 107, - 112, 203, 178, 34, 221, 58, 97, 40, 116, 11, 179, 18, 163, 176, 140, 156, - 40, 39, 29, 202, 110, 34, 85, 253, 105, 89, 232, 190, 118, 92, 199, 100, - 89, 143, 12, 250, 175, 34, 34, 142, 245, 195, 73, 90, 184, 182, 220, 221, - 53, 251, 124, 200, 152, 198, 139, 23, 25, 165, 175, 223, 214, 146, 25, 226, - 12, 172, 64, 102, 7, 25, 161, 206, 1, 40, 110, 48, 210, 141, 11, 160, - 233, 25, 146, 164, 39, 36, 74, 101, 65, 91, 115, 245, 61, 84, 55, 233, - 129, 126, 121, 178, 203, 33, 91, 15, 18, 162, 56, 148, 102, 74, 173, 18, - 86, 250, 149, 16, 50, 136, 227, 48, 56, 145, 27, 244, 157, 185, 17, 213, - 242, 89, 57, 101, 188, 144, 252, 218, 159, 142, 38, 195, 249, 114, 160, 236, - 167, 246, 129, 201, 99, 47, 49, 19, 254, 247, 38, 124, 149, 0, 62, 83, - 31, 215, 183, 232, 239, 64, 242, 170, 29, 60, 142, 156, 89, 221, 142, 190, - 96, 246, 54, 50, 181, 12, 189, 92, 39, 238, 38, 121, 121, 54, 199, 145, - 154, 207, 109, 53, 161, 219, 133, 43, 136, 210, 30, 120, 13, 65, 107, 54, - 252, 220, 228, 149, 41, 90, 0, 133, 23, 222, 136, 165, 92, 121, 147, 113, - 229, 17, 66, 237, 232, 112, 81, 198, 187, 123, 231, 192, 183, 206, 187, 246, - 93, 6, 20, 160, 220, 109, 89, 14, 0, 97, 255, 161, 183, 124, 128, 218, - 24, 195, 21, 76, 134, 171, 49, 152, 42, 193, 23, 191, 140, 236, 164, 99, - 61, 0, 133, 214, 124, 235, 220, 17, 240, 35, 45, 6, 90, 241, 238, 233, - 255, 182, 255, 144, 159, 48, 216, 4, 250, 190, 20, 182, 15, 142, 0, 117, - 72, 165, 2, 105, 55, 78, 138, 243, 70, 87, 197, 8, 223, 149, 40, 94, - 251, 244, 117, 170, 180, 199, 97, 129, 211, 242, 208, 203, 116, 131, 235, 165, - 32, 78, 28, 127, 222, 238, 91, 94, 54, 158, 83, 143, 119, 38, 26, 62, - 153, 41, 134, 126, 209, 84, 46, 206, 11, 46, 19, 144, 212, 234, 226, 75, - 35, 174, 101, 137, 135, 208, 215, 109, 214, 126, 9, 110, 149, 188, 219, 184, - 36, 72, 82, 129, 5, 39, 106, 82, 166, 226, 81, 18, 69, 0, 7, 47, - 220, 133, 129, 8, 48, 0, 230, 34, 208, 196, 60, 130, 77, 104, 140, 121, - 212, 247, 55, 158, 16, 9, 9, 172, 65, 241, 83, 99, 170, 33, 161, 167, - 243, 23, 254, 169, 65, 19, 93, 73, 108, 213, 180, 130, 66, 182, 245, 250, - 205, 119, 89, 114, 97, 85, 234, 31, 175, 237, 31, 181, 252, 96, 145, 56, - 10, 31, 97, 236, 129, 32, 110, 193, 187, 136, 255, 2, 151, 225, 236, 3, - 165, 10, 247, 216, 207, 91, 162, 208, 143, 170, 96, 144, 106, 226, 11, 37, - 97, 167, 226, 31, 12, 196, 57, 98, 141, 183, 208, 105, 87, 130, 105, 55, - 76, 25, 205, 54, 46, 89, 72, 85, 164, 154, 224, 167, 213, 208, 75, 193, - 49, 133, 178, 87, 114, 8, 185, 154, 186, 173, 80, 51, 210, 254, 145, 44, - 73, 134, 34, 134, 91, 54, 248, 250, 232, 194, 193, 59, 222, 181, 246, 17, - 59, 14, 147, 148, 228, 24, 162, 125, 188, 218, 107, 24, 36, 48, 82, 187, - 121, 186, 150, 183, 167, 216, 157, 188, 218, 43, 202, 19, 206, 173, 164, 192, - 191, 23, 175, 54, 127, 92, 61, 60, 174, 152, 67, 99, 190, 237, 167, 203, - 168, 21, 39, 221, 28, 239, 182, 6, 23, 214, 100, 246, 141, 35, 93, 52, - 11, 177, 154, 58, 26, 199, 50, 217, 70, 172, 65, 71, 135, 250, 64, 52, - 81, 17, 155, 185, 240, 159, 48, 17, 207, 189, 245, 90, 41, 174, 242, 59, - 127, 249, 17, 79, 71, 72, 114, 238, 109, 160, 78, 215, 212, 233, 108, 60, - 60, 185, 241, 24, 3, 249, 102, 89, 93, 175, 107, 151, 68, 17, 73, 241, - 41, 116, 238, 40, 136, 25, 188, 90, 35, 93, 115, 134, 252, 166, 112, 121, - 37, 94, 232, 115, 45, 164, 44, 176, 143, 196, 22, 82, 70, 150, 47, 220, - 108, 118, 49, 134, 235, 245, 57, 165, 33, 214, 112, 53, 239, 245, 177, 1, - 228, 89, 196, 168, 156, 69, 204, 159, 46, 255, 91, 106, 247, 183, 72, 237, - 138, 189, 249, 119, 147, 218, 169, 110, 153, 187, 157, 245, 191, 165, 118, 175, - 150, 218, 253, 152, 114, 74, 92, 228, 113, 236, 70, 117, 163, 35, 156, 175, - 238, 31, 82, 17, 218, 168, 192, 80, 69, 171, 157, 255, 148, 82, 181, 232, - 251, 69, 20, 210, 223, 6, 14, 177, 144, 161, 204, 38, 213, 234, 143, 71, - 193, 251, 218, 135, 42, 177, 232, 237, 154, 106, 204, 79, 82, 91, 117, 218, - 125, 74, 218, 183, 232, 79, 102, 0, 215, 90, 230, 56, 102, 215, 93, 222, - 115, 255, 105, 228, 88, 17, 221, 143, 22, 119, 160, 146, 150, 171, 209, 195, - 14, 21, 60, 155, 227, 239, 192, 224, 194, 82, 199, 49, 179, 97, 11, 25, - 91, 29, 179, 132, 50, 85, 42, 7, 80, 177, 85, 3, 20, 158, 109, 184, - 89, 25, 73, 214, 96, 165, 109, 213, 38, 237, 74, 137, 156, 149, 82, 177, - 107, 237, 180, 232, 177, 166, 172, 35, 94, 235, 18, 213, 54, 84, 47, 19, - 34, 86, 84, 83, 125, 110, 234, 107, 239, 216, 28, 79, 160, 46, 245, 130, - 123, 101, 28, 38, 116, 146, 84, 227, 198, 228, 136, 141, 26, 26, 52, 149, - 104, 178, 48, 192, 136, 72, 125, 88, 55, 237, 156, 113, 77, 206, 249, 185, - 70, 212, 87, 203, 79, 252, 150, 33, 16, 59, 128, 235, 156, 61, 205, 167, - 64, 64, 105, 225, 30, 199, 111, 202, 221, 47, 187, 141, 51, 182, 139, 226, - 31, 20, 58, 215, 89, 4, 43, 118, 79, 23, 115, 5, 186, 59, 97, 171, - 104, 5, 89, 1, 80, 41, 61, 180, 152, 80, 207, 143, 114, 83, 249, 134, - 122, 142, 57, 3, 215, 125, 248, 205, 116, 62, 224, 115, 98, 181, 152, 8, - 179, 133, 131, 98, 57, 153, 137, 239, 112, 60, 52, 216, 109, 184, 186, 251, - 218, 26, 222, 89, 68, 12, 249, 73, 47, 5, 255, 14, 51, 94, 160, 35, - 76, 157, 45, 148, 4, 85, 60, 41, 170, 0, 25, 244, 136, 178, 41, 47, - 21, 163, 249, 174, 187, 166, 112, 221, 151, 68, 25, 197, 186, 50, 23, 191, - 187, 155, 184, 111, 46, 155, 70, 104, 149, 155, 135, 81, 137, 100, 198, 192, - 44, 200, 132, 246, 86, 227, 209, 170, 159, 190, 24, 41, 200, 214, 255, 83, - 250, 130, 153, 26, 240, 151, 218, 214, 255, 33, 125, 1, 101, 100, 2, 10, - 172, 74, 214, 217, 82, 101, 93, 193, 132, 124, 129, 139, 195, 156, 31, 166, - 195, 205, 161, 135, 79, 227, 163, 164, 25, 116, 133, 107, 8, 126, 96, 151, - 72, 127, 178, 234, 33, 61, 105, 126, 208, 86, 30, 27, 89, 129, 133, 24, - 155, 31, 84, 130, 63, 237, 244, 141, 187, 107, 166, 170, 156, 34, 26, 10, - 86, 124, 167, 26, 213, 43, 85, 198, 106, 153, 28, 84, 94, 18, 152, 139, - 86, 46, 232, 172, 169, 85, 116, 220, 152, 227, 86, 190, 75, 41, 6, 216, - 179, 32, 57, 199, 217, 149, 212, 233, 96, 248, 238, 2, 52, 231, 119, 97, - 220, 252, 174, 6, 34, 213, 166, 74, 164, 132, 166, 42, 130, 23, 122, 189, - 162, 156, 66, 38, 140, 226, 172, 98, 182, 179, 49, 177, 230, 138, 177, 109, - 244, 142, 153, 69, 117, 214, 121, 100, 136, 54, 229, 181, 81, 204, 117, 179, - 44, 160, 207, 112, 2, 91, 255, 45, 253, 188, 221, 226, 106, 255, 133, 133, - 191, 91, 112, 77, 193, 125, 24, 188, 5, 71, 109, 236, 4, 52, 114, 204, - 106, 254, 58, 217, 22, 107, 57, 102, 181, 95, 181, 62, 255, 223, 73, 206, - 197, 234, 42, 148, 89, 127, 250, 187, 136, 188, 136, 82, 52, 52, 34, 55, - 70, 47, 250, 162, 105, 192, 103, 9, 186, 50, 93, 72, 59, 64, 182, 71, - 75, 5, 93, 112, 157, 152, 33, 22, 35, 199, 226, 63, 135, 122, 244, 25, - 29, 242, 26, 226, 144, 142, 57, 238, 128, 130, 162, 123, 153, 54, 137, 181, - 46, 104, 136, 14, 17, 203, 34, 218, 199, 209, 81, 192, 232, 127, 144, 155, - 178, 36, 129, 245, 150, 20, 86, 26, 118, 158, 140, 181, 117, 198, 184, 103, - 12, 224, 176, 209, 14, 219, 16, 34, 92, 217, 68, 115, 199, 60, 219, 39, - 120, 165, 126, 233, 173, 143, 216, 160, 90, 157, 32, 251, 148, 75, 76, 249, - 95, 98, 189, 96, 110, 185, 12, 187, 161, 168, 164, 156, 229, 113, 249, 101, - 0, 11, 204, 84, 141, 211, 184, 120, 220, 100, 170, 94, 202, 165, 220, 45, - 128, 224, 202, 158, 82, 68, 225, 237, 88, 124, 73, 232, 182, 193, 132, 201, - 116, 115, 198, 177, 103, 22, 159, 211, 149, 146, 229, 89, 150, 83, 195, 178, - 156, 234, 88, 167, 23, 105, 162, 40, 178, 138, 232, 177, 240, 129, 102, 166, - 181, 185, 118, 136, 182, 5, 227, 151, 98, 183, 151, 91, 191, 168, 126, 149, - 83, 205, 153, 164, 109, 227, 27, 84, 65, 122, 18, 111, 125, 180, 105, 114, - 135, 58, 202, 162, 193, 73, 158, 229, 57, 13, 33, 13, 25, 45, 87, 205, - 25, 100, 151, 55, 243, 69, 40, 2, 146, 144, 149, 128, 192, 238, 100, 58, - 222, 226, 82, 252, 246, 219, 87, 180, 57, 127, 226, 6, 112, 193, 46, 138, - 115, 247, 27, 113, 101, 251, 13, 88, 124, 97, 73, 192, 57, 128, 33, 25, - 243, 111, 173, 206, 46, 182, 136, 39, 226, 230, 20, 19, 119, 40, 49, 167, - 169, 7, 157, 51, 220, 14, 74, 196, 77, 33, 98, 23, 17, 199, 28, 177, - 123, 70, 167, 171, 103, 38, 37, 29, 1, 151, 209, 55, 65, 114, 22, 55, - 71, 235, 135, 42, 29, 8, 221, 218, 54, 231, 218, 165, 226, 221, 140, 136, - 216, 173, 170, 236, 217, 102, 183, 18, 168, 74, 85, 66, 253, 184, 169, 192, - 72, 247, 121, 28, 139, 171, 174, 112, 236, 95, 139, 200, 231, 62, 145, 64, - 180, 147, 111, 20, 199, 16, 112, 160, 59, 216, 236, 16, 15, 149, 35, 142, - 164, 109, 134, 97, 237, 25, 31, 193, 34, 121, 161, 109, 27, 229, 131, 12, - 162, 120, 38, 163, 157, 70, 204, 93, 105, 30, 158, 212, 248, 253, 70, 189, - 55, 57, 0, 162, 29, 200, 83, 170, 87, 235, 112, 131, 186, 72, 61, 107, - 186, 44, 254, 136, 92, 234, 235, 13, 37, 71, 214, 151, 105, 252, 77, 117, - 189, 129, 245, 113, 202, 1, 181, 51, 188, 70, 215, 71, 234, 149, 226, 81, - 34, 40, 192, 37, 244, 129, 94, 63, 34, 143, 11, 180, 225, 155, 229, 228, - 142, 40, 33, 26, 54, 30, 76, 4, 125, 72, 48, 15, 104, 36, 207, 162, - 66, 1, 71, 217, 2, 234, 166, 0, 93, 173, 27, 174, 22, 191, 169, 142, - 111, 248, 168, 234, 81, 21, 118, 180, 31, 107, 117, 110, 70, 133, 157, 91, - 182, 93, 81, 37, 77, 228, 114, 218, 124, 185, 185, 191, 135, 105, 141, 236, - 173, 178, 85, 110, 220, 91, 216, 223, 233, 176, 102, 164, 9, 216, 100, 168, - 2, 55, 46, 8, 197, 242, 25, 210, 250, 201, 112, 180, 11, 103, 234, 7, - 91, 195, 252, 253, 195, 98, 116, 215, 95, 176, 216, 28, 126, 90, 39, 183, - 19, 220, 216, 175, 39, 159, 86, 62, 56, 176, 123, 232, 27, 161, 236, 119, - 158, 224, 2, 252, 144, 169, 181, 65, 206, 182, 85, 46, 55, 65, 179, 53, - 215, 248, 34, 157, 174, 27, 204, 80, 16, 250, 83, 179, 211, 245, 50, 163, - 177, 231, 206, 235, 141, 190, 242, 210, 92, 129, 160, 49, 88, 230, 192, 233, - 52, 179, 99, 218, 222, 98, 215, 15, 114, 188, 195, 25, 48, 8, 254, 90, - 142, 198, 111, 27, 26, 255, 49, 71, 227, 63, 165, 47, 25, 18, 95, 225, - 80, 170, 14, 226, 14, 76, 255, 112, 161, 28, 63, 228, 130, 47, 25, 103, - 42, 191, 19, 174, 163, 18, 81, 208, 179, 2, 165, 217, 122, 155, 157, 81, - 18, 6, 54, 78, 68, 4, 36, 183, 1, 183, 254, 225, 31, 210, 106, 176, - 137, 154, 27, 218, 221, 30, 155, 213, 96, 29, 53, 215, 244, 248, 116, 254, - 99, 186, 110, 16, 57, 47, 1, 231, 63, 165, 27, 126, 227, 152, 231, 200, - 59, 83, 215, 112, 82, 253, 49, 252, 201, 202, 105, 194, 9, 68, 53, 104, - 210, 254, 18, 136, 97, 8, 158, 234, 127, 80, 217, 7, 143, 244, 248, 186, - 188, 225, 179, 209, 224, 204, 56, 246, 121, 185, 235, 233, 51, 191, 66, 27, - 243, 66, 81, 65, 149, 176, 39, 175, 130, 210, 240, 251, 233, 76, 228, 229, - 176, 143, 203, 209, 162, 169, 28, 243, 100, 165, 139, 82, 45, 26, 82, 58, - 41, 53, 68, 223, 107, 28, 155, 59, 214, 157, 182, 61, 233, 251, 230, 130, - 193, 123, 37, 136, 23, 104, 255, 75, 148, 36, 74, 37, 181, 185, 254, 4, - 97, 250, 190, 94, 93, 28, 189, 167, 3, 54, 236, 239, 252, 190, 8, 147, - 122, 191, 160, 39, 112, 102, 72, 154, 24, 181, 222, 226, 224, 163, 37, 218, - 167, 7, 237, 206, 60, 75, 231, 20, 244, 119, 7, 143, 203, 21, 81, 224, - 121, 169, 54, 19, 54, 135, 179, 209, 115, 15, 71, 75, 192, 228, 30, 222, - 128, 155, 17, 64, 214, 144, 35, 210, 219, 7, 184, 66, 46, 177, 98, 41, - 17, 179, 10, 142, 181, 18, 179, 182, 75, 197, 172, 29, 138, 214, 209, 98, - 214, 206, 223, 36, 102, 173, 188, 247, 211, 74, 240, 190, 34, 7, 166, 150, - 184, 18, 173, 176, 174, 80, 28, 40, 112, 108, 240, 182, 169, 176, 220, 213, - 235, 27, 109, 57, 21, 28, 234, 200, 231, 222, 76, 250, 133, 30, 164, 75, - 112, 255, 193, 223, 0, 252, 33, 202, 149, 179, 62, 81, 121, 156, 78, 194, - 176, 97, 113, 216, 71, 234, 62, 102, 64, 224, 214, 118, 151, 57, 236, 51, - 148, 238, 179, 146, 170, 191, 179, 30, 82, 97, 173, 73, 29, 126, 15, 161, - 213, 239, 169, 94, 36, 181, 34, 166, 193, 211, 125, 100, 69, 86, 185, 211, - 201, 204, 253, 130, 34, 209, 206, 166, 149, 11, 171, 138, 250, 65, 172, 143, - 151, 28, 64, 129, 162, 86, 166, 129, 129, 51, 141, 55, 86, 199, 163, 81, - 198, 247, 16, 174, 24, 214, 14, 60, 63, 251, 139, 228, 155, 50, 216, 125, - 137, 42, 91, 98, 224, 191, 138, 106, 23, 170, 128, 56, 107, 246, 251, 128, - 133, 3, 58, 132, 189, 91, 131, 152, 106, 42, 18, 106, 163, 31, 62, 206, - 231, 247, 224, 56, 215, 77, 105, 20, 62, 233, 167, 223, 123, 46, 193, 164, - 162, 64, 48, 113, 15, 187, 213, 116, 134, 98, 31, 209, 36, 13, 72, 99, - 81, 207, 80, 237, 17, 142, 21, 109, 146, 153, 166, 91, 149, 234, 70, 89, - 197, 206, 93, 141, 43, 83, 240, 44, 116, 101, 232, 237, 232, 93, 59, 249, - 90, 202, 136, 95, 201, 75, 13, 123, 169, 185, 75, 161, 141, 10, 234, 159, - 110, 118, 236, 45, 162, 56, 19, 25, 215, 8, 116, 18, 83, 72, 144, 87, - 48, 165, 68, 187, 8, 181, 89, 11, 255, 69, 72, 154, 247, 23, 145, 223, - 134, 171, 236, 214, 185, 166, 188, 183, 31, 241, 165, 56, 252, 40, 152, 192, - 174, 14, 52, 106, 24, 45, 54, 189, 144, 127, 113, 216, 134, 104, 83, 172, - 111, 248, 55, 182, 254, 16, 26, 140, 16, 123, 212, 98, 81, 157, 182, 243, - 242, 234, 162, 20, 34, 208, 157, 29, 190, 26, 192, 43, 107, 95, 176, 238, - 5, 20, 46, 36, 130, 83, 122, 93, 190, 142, 183, 158, 115, 13, 144, 81, - 123, 32, 90, 175, 140, 151, 96, 204, 208, 220, 230, 185, 203, 172, 56, 111, - 46, 204, 201, 126, 55, 189, 75, 87, 62, 103, 108, 183, 12, 232, 92, 217, - 156, 91, 177, 234, 164, 110, 129, 72, 63, 88, 90, 161, 48, 248, 115, 186, - 148, 102, 158, 117, 186, 249, 137, 181, 179, 57, 251, 4, 242, 69, 220, 14, - 37, 145, 104, 151, 153, 234, 116, 15, 66, 253, 47, 118, 204, 117, 238, 90, - 112, 30, 41, 35, 204, 36, 186, 38, 226, 107, 172, 63, 35, 100, 188, 19, - 102, 102, 144, 152, 117, 213, 113, 121, 148, 49, 249, 105, 251, 175, 184, 221, - 121, 86, 118, 233, 57, 171, 114, 173, 0, 154, 145, 196, 217, 243, 179, 48, - 7, 158, 126, 151, 123, 154, 78, 86, 243, 54, 106, 117, 180, 81, 246, 142, - 99, 176, 116, 50, 168, 77, 39, 187, 209, 116, 212, 54, 211, 234, 100, 85, - 203, 187, 133, 59, 153, 93, 141, 121, 173, 178, 108, 201, 145, 183, 159, 200, - 179, 55, 139, 162, 72, 46, 177, 221, 75, 69, 44, 118, 236, 29, 80, 197, - 130, 110, 75, 43, 127, 207, 23, 196, 175, 185, 201, 123, 134, 183, 248, 194, - 88, 203, 233, 198, 72, 242, 171, 213, 104, 246, 200, 141, 102, 0, 95, 3, - 19, 149, 31, 110, 228, 243, 37, 178, 84, 59, 210, 73, 94, 143, 218, 41, - 155, 6, 233, 68, 141, 187, 69, 144, 44, 197, 186, 104, 112, 109, 104, 192, - 165, 113, 74, 242, 169, 37, 154, 49, 110, 226, 68, 164, 25, 103, 188, 20, - 157, 100, 172, 238, 93, 9, 103, 100, 176, 48, 10, 118, 241, 217, 118, 239, - 155, 20, 218, 132, 93, 155, 104, 31, 117, 186, 181, 122, 71, 155, 178, 211, - 119, 219, 92, 125, 20, 57, 62, 60, 58, 229, 32, 185, 195, 245, 112, 147, - 6, 47, 205, 30, 42, 147, 201, 254, 224, 116, 75, 164, 122, 127, 176, 130, - 25, 59, 140, 216, 89, 133, 33, 222, 113, 141, 183, 11, 122, 186, 115, 224, - 105, 235, 114, 37, 42, 132, 229, 39, 182, 19, 11, 186, 225, 45, 199, 147, - 219, 21, 69, 70, 37, 148, 66, 18, 49, 13, 124, 114, 97, 18, 162, 112, - 138, 125, 63, 127, 26, 41, 71, 129, 45, 118, 234, 117, 4, 87, 94, 6, - 249, 60, 127, 117, 135, 134, 224, 226, 238, 17, 86, 245, 242, 26, 171, 215, - 88, 94, 19, 126, 141, 244, 107, 155, 95, 155, 230, 115, 71, 191, 171, 212, - 93, 253, 222, 84, 17, 142, 85, 122, 253, 126, 162, 178, 111, 106, 232, 11, - 166, 8, 104, 97, 40, 64, 202, 222, 0, 91, 221, 134, 254, 125, 252, 123, - 113, 9, 92, 162, 82, 215, 249, 44, 179, 103, 163, 231, 20, 234, 75, 174, - 193, 71, 199, 202, 121, 87, 109, 75, 87, 14, 42, 193, 24, 67, 173, 99, - 251, 66, 71, 166, 167, 250, 195, 108, 158, 137, 222, 60, 187, 57, 235, 103, - 245, 176, 227, 102, 155, 179, 40, 91, 43, 90, 79, 41, 195, 34, 84, 153, - 50, 47, 219, 36, 177, 28, 134, 41, 216, 240, 234, 139, 146, 146, 39, 117, - 154, 231, 50, 197, 67, 21, 70, 121, 52, 48, 249, 113, 159, 75, 193, 53, - 68, 6, 220, 63, 52, 78, 41, 69, 219, 166, 56, 119, 63, 208, 14, 221, - 144, 53, 163, 146, 129, 140, 107, 186, 100, 156, 210, 167, 213, 193, 121, 170, - 170, 43, 214, 8, 255, 136, 170, 85, 69, 251, 118, 40, 201, 58, 54, 217, - 145, 251, 129, 232, 89, 78, 214, 113, 90, 36, 122, 176, 0, 72, 8, 237, - 31, 213, 172, 118, 73, 179, 20, 144, 95, 137, 225, 247, 159, 71, 216, 73, - 4, 160, 76, 133, 14, 22, 112, 141, 233, 139, 107, 18, 165, 120, 163, 204, - 210, 38, 203, 222, 98, 52, 157, 140, 110, 93, 225, 177, 1, 76, 102, 72, - 35, 70, 163, 176, 147, 127, 209, 127, 214, 118, 210, 42, 223, 226, 113, 163, - 16, 164, 140, 4, 153, 243, 121, 5, 166, 140, 0, 5, 219, 58, 69, 46, - 68, 113, 236, 226, 44, 197, 229, 43, 72, 213, 42, 244, 76, 179, 93, 224, - 223, 172, 10, 122, 158, 199, 137, 118, 226, 6, 168, 140, 118, 96, 178, 43, - 29, 38, 40, 163, 106, 52, 117, 57, 56, 52, 226, 250, 11, 176, 49, 182, - 101, 128, 40, 131, 71, 58, 24, 174, 38, 247, 225, 228, 237, 117, 254, 78, - 232, 240, 241, 2, 160, 193, 117, 241, 149, 212, 249, 230, 234, 49, 140, 175, - 207, 174, 104, 127, 191, 62, 244, 104, 19, 31, 188, 202, 13, 90, 67, 97, - 19, 250, 109, 171, 161, 205, 254, 10, 216, 133, 194, 108, 50, 187, 3, 41, - 3, 65, 111, 194, 10, 197, 147, 111, 38, 103, 191, 84, 227, 218, 55, 9, - 253, 208, 164, 197, 213, 217, 217, 164, 162, 97, 5, 27, 183, 80, 249, 86, - 173, 146, 163, 8, 217, 33, 191, 95, 90, 106, 142, 202, 127, 196, 207, 67, - 43, 22, 43, 48, 155, 104, 103, 60, 154, 210, 191, 150, 193, 52, 49, 214, - 66, 239, 161, 15, 101, 74, 7, 172, 233, 213, 176, 22, 252, 193, 231, 244, - 163, 47, 118, 98, 144, 3, 176, 120, 179, 3, 192, 226, 164, 108, 66, 186, - 13, 72, 112, 75, 252, 38, 236, 120, 217, 86, 21, 116, 149, 40, 146, 154, - 152, 68, 21, 229, 182, 241, 66, 131, 202, 103, 165, 197, 173, 72, 242, 184, - 21, 101, 172, 144, 134, 108, 227, 123, 2, 205, 10, 117, 34, 197, 198, 116, - 13, 84, 23, 35, 82, 240, 101, 199, 126, 44, 10, 206, 161, 55, 126, 204, - 9, 1, 243, 163, 196, 17, 56, 238, 235, 135, 232, 149, 216, 16, 78, 13, - 66, 47, 83, 157, 221, 232, 120, 133, 218, 148, 19, 149, 7, 37, 157, 216, - 184, 133, 95, 27, 233, 59, 184, 44, 18, 7, 55, 122, 165, 231, 20, 179, - 154, 137, 103, 56, 206, 48, 97, 210, 79, 117, 183, 87, 215, 116, 156, 88, - 106, 48, 252, 168, 0, 6, 53, 118, 107, 156, 131, 194, 83, 55, 143, 12, - 224, 215, 91, 179, 194, 16, 63, 110, 236, 227, 71, 7, 149, 240, 123, 157, - 230, 19, 155, 56, 167, 220, 235, 9, 87, 10, 4, 91, 160, 110, 244, 164, - 216, 84, 149, 169, 126, 215, 165, 110, 255, 116, 69, 66, 207, 105, 135, 37, - 120, 162, 44, 62, 94, 224, 136, 255, 77, 27, 50, 254, 144, 164, 198, 198, - 220, 216, 21, 113, 230, 119, 226, 231, 241, 208, 224, 25, 190, 12, 13, 154, - 161, 36, 210, 16, 120, 140, 90, 56, 220, 237, 9, 104, 208, 159, 65, 149, - 33, 175, 94, 252, 207, 165, 147, 121, 156, 211, 201, 76, 172, 74, 230, 14, - 84, 182, 87, 171, 100, 186, 157, 99, 134, 243, 88, 107, 101, 238, 178, 160, - 45, 250, 11, 50, 89, 188, 142, 215, 251, 255, 181, 74, 230, 76, 20, 15, - 161, 216, 239, 53, 64, 68, 236, 3, 113, 134, 203, 201, 30, 131, 195, 201, - 228, 204, 138, 145, 134, 108, 134, 4, 6, 31, 19, 115, 60, 95, 76, 62, - 206, 103, 171, 254, 148, 167, 231, 211, 104, 177, 154, 192, 249, 217, 246, 181, - 103, 173, 56, 184, 212, 165, 125, 30, 19, 101, 68, 76, 93, 49, 96, 212, - 21, 139, 115, 103, 239, 105, 225, 236, 45, 5, 54, 200, 54, 190, 29, 121, - 249, 222, 176, 10, 1, 26, 17, 72, 241, 82, 167, 74, 224, 144, 61, 22, - 92, 55, 83, 73, 168, 187, 39, 180, 221, 182, 173, 72, 23, 12, 221, 62, - 200, 241, 89, 86, 52, 149, 57, 160, 75, 129, 165, 244, 129, 92, 240, 148, - 32, 128, 115, 207, 224, 98, 190, 74, 35, 64, 216, 169, 160, 49, 130, 82, - 14, 242, 221, 147, 165, 168, 24, 111, 160, 173, 5, 91, 106, 255, 73, 46, - 88, 130, 150, 18, 83, 36, 239, 174, 57, 48, 127, 254, 124, 130, 235, 204, - 245, 70, 82, 74, 76, 101, 42, 17, 181, 58, 94, 174, 86, 102, 68, 163, - 34, 225, 84, 172, 89, 118, 104, 172, 71, 164, 87, 33, 133, 43, 201, 11, - 86, 105, 162, 95, 32, 0, 121, 152, 246, 151, 247, 125, 248, 102, 6, 228, - 215, 169, 223, 191, 89, 178, 39, 85, 182, 162, 196, 105, 210, 85, 230, 201, - 76, 66, 33, 167, 18, 183, 95, 15, 139, 81, 159, 133, 131, 195, 181, 44, - 86, 181, 102, 63, 186, 93, 254, 131, 196, 226, 19, 83, 173, 166, 29, 202, - 2, 138, 149, 161, 78, 232, 79, 231, 179, 59, 127, 29, 110, 120, 190, 125, - 220, 71, 253, 174, 69, 97, 103, 184, 73, 135, 107, 181, 232, 134, 31, 247, - 40, 231, 72, 77, 218, 158, 169, 120, 25, 180, 173, 171, 86, 227, 86, 159, - 234, 173, 15, 112, 93, 223, 252, 238, 238, 104, 217, 124, 82, 118, 43, 127, - 218, 108, 50, 25, 57, 26, 219, 216, 56, 153, 59, 98, 91, 74, 251, 129, - 109, 160, 204, 135, 196, 126, 224, 203, 125, 254, 240, 10, 137, 174, 90, 249, - 189, 77, 126, 183, 205, 172, 18, 179, 183, 126, 246, 102, 153, 217, 43, 247, - 161, 117, 235, 106, 192, 245, 153, 173, 82, 41, 205, 187, 171, 70, 229, 91, - 215, 158, 190, 223, 177, 231, 212, 5, 94, 82, 19, 181, 0, 187, 235, 250, - 141, 189, 187, 141, 160, 241, 193, 1, 39, 29, 253, 79, 253, 44, 97, 165, - 97, 118, 23, 243, 199, 165, 245, 188, 125, 127, 51, 95, 46, 197, 1, 117, - 190, 187, 31, 250, 16, 252, 171, 156, 190, 8, 219, 48, 47, 39, 119, 74, - 167, 101, 34, 171, 195, 173, 1, 123, 66, 42, 5, 234, 206, 181, 45, 244, - 118, 52, 215, 21, 91, 68, 46, 110, 109, 59, 163, 60, 236, 122, 26, 234, - 192, 60, 171, 146, 25, 214, 98, 155, 247, 94, 156, 216, 86, 105, 158, 81, - 26, 165, 188, 80, 107, 182, 177, 64, 243, 40, 226, 217, 184, 49, 195, 112, - 139, 123, 206, 53, 223, 147, 240, 227, 70, 221, 183, 106, 73, 68, 198, 54, - 10, 104, 14, 247, 15, 115, 226, 206, 172, 30, 65, 195, 117, 83, 218, 194, - 61, 75, 46, 6, 162, 224, 3, 212, 7, 172, 159, 106, 227, 159, 241, 52, - 50, 184, 58, 248, 218, 20, 166, 246, 181, 19, 239, 129, 168, 198, 69, 110, - 26, 81, 200, 171, 230, 79, 201, 120, 75, 150, 185, 119, 199, 150, 124, 103, - 33, 57, 44, 239, 92, 207, 211, 153, 130, 93, 206, 174, 187, 56, 235, 185, - 34, 212, 183, 143, 145, 63, 185, 165, 51, 10, 194, 67, 125, 92, 169, 203, - 10, 34, 77, 173, 199, 190, 177, 251, 50, 228, 23, 192, 104, 88, 159, 151, - 232, 73, 58, 181, 90, 137, 94, 207, 102, 8, 85, 113, 130, 108, 176, 171, - 111, 159, 38, 119, 179, 209, 106, 37, 252, 169, 82, 61, 214, 176, 219, 162, - 175, 214, 187, 159, 204, 44, 238, 182, 14, 235, 175, 57, 44, 187, 131, 234, - 188, 190, 196, 143, 154, 181, 25, 136, 28, 220, 44, 20, 158, 158, 104, 254, - 198, 22, 14, 149, 214, 221, 67, 107, 42, 17, 122, 78, 219, 50, 46, 38, - 51, 75, 247, 164, 204, 35, 240, 155, 60, 228, 116, 118, 21, 239, 104, 108, - 14, 174, 223, 40, 235, 43, 239, 9, 236, 242, 164, 196, 111, 130, 119, 255, - 214, 202, 29, 253, 97, 106, 97, 168, 188, 96, 24, 6, 195, 82, 60, 10, - 53, 163, 18, 15, 62, 19, 133, 57, 150, 85, 23, 192, 57, 205, 192, 15, - 238, 223, 150, 235, 49, 220, 19, 173, 219, 123, 154, 44, 39, 55, 98, 186, - 136, 25, 78, 163, 172, 233, 200, 139, 216, 250, 49, 85, 236, 174, 113, 122, - 45, 23, 88, 204, 148, 244, 169, 55, 182, 165, 206, 49, 232, 227, 28, 186, - 147, 28, 189, 239, 235, 210, 76, 249, 187, 132, 213, 85, 158, 21, 62, 59, - 224, 242, 239, 31, 151, 43, 224, 149, 94, 241, 6, 113, 93, 251, 4, 218, - 109, 90, 29, 212, 252, 111, 15, 223, 126, 247, 167, 172, 55, 189, 182, 241, - 116, 218, 109, 91, 206, 89, 228, 219, 202, 231, 117, 193, 243, 70, 249, 237, - 121, 190, 243, 136, 176, 60, 241, 118, 245, 169, 85, 160, 252, 57, 233, 198, - 63, 251, 223, 254, 220, 57, 161, 186, 193, 97, 179, 107, 250, 219, 214, 134, - 78, 201, 69, 172, 39, 96, 215, 4, 238, 128, 106, 233, 64, 112, 158, 211, - 185, 116, 120, 161, 110, 72, 29, 31, 190, 231, 94, 167, 178, 138, 189, 126, - 24, 80, 123, 11, 44, 187, 161, 183, 93, 175, 166, 59, 16, 129, 242, 179, - 55, 242, 105, 235, 170, 4, 113, 69, 75, 144, 99, 97, 144, 216, 48, 74, - 60, 10, 208, 102, 119, 195, 16, 37, 230, 76, 176, 128, 64, 13, 102, 122, - 140, 28, 83, 180, 156, 235, 74, 97, 3, 183, 163, 160, 4, 33, 96, 131, - 110, 178, 132, 55, 253, 35, 21, 14, 81, 245, 39, 160, 119, 255, 8, 19, - 44, 86, 10, 167, 1, 254, 55, 6, 161, 81, 31, 217, 56, 139, 134, 233, - 106, 218, 223, 140, 22, 215, 225, 141, 138, 201, 19, 221, 220, 187, 8, 28, - 4, 79, 82, 58, 245, 122, 19, 185, 219, 188, 233, 47, 71, 77, 78, 183, - 20, 217, 209, 252, 65, 191, 110, 41, 203, 210, 172, 204, 148, 226, 106, 217, - 201, 255, 109, 248, 237, 31, 194, 247, 223, 254, 17, 235, 133, 126, 254, 160, - 87, 195, 205, 198, 145, 249, 113, 1, 136, 33, 53, 239, 79, 167, 133, 213, - 179, 154, 223, 141, 86, 227, 209, 34, 244, 31, 151, 89, 187, 1, 93, 37, - 113, 19, 110, 234, 113, 152, 169, 170, 3, 16, 140, 149, 253, 155, 194, 218, - 254, 141, 59, 143, 254, 18, 85, 74, 197, 208, 211, 13, 214, 40, 253, 224, - 222, 253, 55, 230, 155, 71, 252, 64, 103, 154, 56, 244, 243, 127, 51, 69, - 12, 39, 79, 147, 33, 98, 15, 231, 67, 78, 44, 246, 112, 244, 187, 30, - 76, 217, 107, 32, 61, 19, 53, 59, 250, 136, 143, 119, 48, 96, 167, 181, - 188, 232, 15, 86, 250, 21, 214, 231, 242, 109, 196, 197, 208, 225, 55, 20, - 185, 187, 45, 5, 97, 247, 147, 53, 190, 114, 213, 50, 166, 75, 244, 206, - 241, 71, 230, 137, 105, 42, 60, 195, 224, 73, 53, 67, 94, 84, 198, 214, - 127, 141, 83, 200, 61, 109, 57, 19, 48, 175, 191, 137, 79, 114, 201, 122, - 14, 240, 100, 229, 226, 146, 158, 30, 38, 51, 157, 7, 32, 22, 241, 247, - 22, 163, 68, 79, 75, 32, 243, 235, 100, 203, 81, 255, 126, 42, 213, 208, - 143, 116, 228, 173, 57, 201, 114, 32, 77, 53, 37, 179, 208, 172, 79, 220, - 25, 204, 136, 126, 203, 188, 70, 153, 247, 201, 44, 247, 106, 63, 155, 209, - 115, 95, 205, 231, 251, 209, 112, 210, 159, 101, 223, 162, 124, 13, 156, 236, - 221, 172, 157, 74, 233, 10, 205, 111, 87, 170, 91, 241, 168, 135, 30, 207, - 186, 115, 232, 28, 187, 127, 192, 239, 227, 141, 30, 109, 217, 251, 233, 23, - 83, 70, 199, 91, 67, 59, 192, 153, 177, 106, 53, 29, 82, 121, 243, 199, - 233, 16, 211, 149, 106, 117, 72, 103, 68, 124, 77, 59, 58, 197, 230, 231, - 40, 186, 62, 4, 194, 30, 116, 237, 169, 107, 169, 91, 133, 194, 246, 15, - 15, 14, 247, 156, 35, 153, 245, 144, 242, 252, 223, 117, 239, 153, 217, 17, - 202, 129, 176, 23, 243, 7, 229, 174, 196, 135, 129, 10, 246, 85, 246, 150, - 12, 160, 122, 40, 67, 138, 245, 168, 188, 130, 66, 151, 117, 141, 53, 71, - 231, 252, 3, 205, 167, 222, 226, 238, 6, 84, 249, 245, 206, 2, 86, 163, - 229, 138, 223, 146, 161, 175, 105, 126, 201, 68, 123, 92, 181, 169, 136, 90, - 191, 103, 11, 192, 209, 26, 239, 149, 74, 10, 59, 64, 189, 155, 87, 42, - 95, 171, 242, 185, 31, 229, 60, 121, 9, 46, 27, 241, 118, 203, 212, 111, - 111, 254, 184, 194, 2, 225, 202, 190, 165, 190, 57, 251, 185, 226, 255, 92, - 113, 227, 133, 9, 254, 107, 195, 163, 140, 113, 172, 85, 249, 68, 109, 169, - 50, 180, 211, 132, 220, 230, 144, 170, 23, 170, 105, 25, 98, 135, 9, 49, - 131, 66, 217, 93, 254, 25, 90, 98, 183, 191, 80, 54, 189, 144, 231, 125, - 104, 54, 186, 80, 182, 185, 208, 221, 228, 66, 187, 197, 253, 51, 180, 145, - 247, 224, 208, 236, 192, 161, 218, 119, 67, 218, 117, 195, 204, 158, 27, 170, - 29, 55, 52, 251, 237, 63, 67, 243, 236, 129, 16, 58, 199, 65, 104, 14, - 131, 80, 31, 1, 161, 62, 0, 194, 249, 34, 252, 39, 90, 109, 250, 116, - 10, 233, 108, 10, 213, 201, 20, 218, 115, 41, 148, 147, 39, 116, 143, 136, - 80, 111, 230, 255, 12, 237, 51, 167, 77, 104, 206, 154, 144, 79, 154, 80, - 159, 51, 33, 239, 245, 161, 61, 99, 66, 58, 97, 60, 77, 13, 26, 137, - 28, 111, 73, 153, 139, 8, 171, 150, 2, 153, 139, 1, 111, 229, 74, 244, - 208, 124, 152, 55, 123, 179, 244, 101, 70, 47, 213, 160, 94, 219, 50, 177, - 149, 26, 218, 188, 26, 204, 46, 211, 164, 166, 118, 59, 208, 175, 68, 170, - 250, 154, 179, 20, 146, 48, 115, 103, 106, 175, 56, 136, 140, 6, 205, 25, - 18, 161, 73, 52, 189, 80, 130, 16, 17, 9, 153, 119, 88, 9, 80, 82, - 229, 144, 11, 148, 155, 52, 163, 2, 211, 34, 30, 32, 35, 35, 122, 232, - 47, 151, 196, 34, 130, 124, 103, 73, 1, 131, 238, 248, 139, 39, 255, 86, - 19, 197, 156, 27, 164, 172, 25, 162, 90, 41, 90, 122, 172, 104, 153, 175, - 55, 168, 81, 139, 134, 158, 165, 66, 153, 225, 40, 214, 44, 201, 214, 236, - 37, 248, 10, 42, 41, 83, 158, 50, 222, 2, 56, 161, 218, 131, 51, 123, - 113, 206, 123, 178, 33, 74, 188, 178, 140, 96, 109, 245, 117, 116, 209, 254, - 38, 62, 107, 159, 251, 75, 24, 94, 47, 245, 27, 24, 233, 101, 20, 46, - 227, 26, 96, 117, 231, 162, 65, 133, 122, 48, 94, 67, 176, 108, 196, 205, - 42, 37, 62, 128, 121, 101, 230, 115, 108, 63, 31, 40, 219, 203, 151, 40, - 172, 44, 211, 52, 129, 131, 91, 250, 237, 84, 36, 52, 31, 182, 28, 203, - 140, 143, 194, 151, 101, 147, 24, 151, 158, 64, 64, 4, 241, 85, 18, 182, - 175, 1, 70, 132, 95, 78, 122, 117, 8, 174, 233, 240, 58, 77, 15, 133, - 204, 200, 164, 166, 242, 150, 91, 228, 160, 195, 196, 203, 17, 37, 239, 92, - 211, 79, 27, 63, 58, 183, 134, 150, 192, 93, 233, 120, 148, 72, 63, 222, - 94, 181, 197, 43, 14, 197, 166, 184, 191, 100, 224, 242, 66, 133, 122, 29, - 133, 192, 225, 100, 60, 140, 218, 54, 188, 74, 174, 67, 149, 130, 214, 222, - 53, 87, 203, 54, 73, 222, 56, 239, 6, 220, 243, 198, 163, 102, 28, 249, - 71, 28, 149, 147, 92, 91, 137, 30, 52, 142, 164, 46, 78, 106, 93, 51, - 169, 74, 178, 191, 42, 109, 83, 149, 15, 17, 67, 56, 233, 60, 163, 108, - 55, 45, 158, 164, 2, 182, 195, 249, 245, 23, 158, 70, 123, 203, 200, 231, - 93, 50, 172, 59, 7, 53, 82, 109, 150, 78, 202, 54, 236, 213, 125, 140, - 194, 185, 100, 147, 239, 107, 114, 144, 174, 70, 173, 93, 211, 90, 209, 24, - 150, 124, 132, 144, 60, 211, 175, 80, 101, 238, 79, 237, 59, 214, 226, 153, - 247, 47, 106, 157, 153, 208, 33, 66, 27, 42, 212, 31, 92, 25, 23, 75, - 58, 130, 98, 35, 156, 72, 71, 120, 72, 116, 4, 230, 13, 207, 204, 16, - 197, 102, 12, 84, 71, 233, 104, 224, 14, 40, 147, 38, 123, 134, 129, 128, - 154, 139, 106, 197, 148, 93, 194, 141, 87, 147, 137, 195, 161, 108, 163, 188, - 59, 21, 171, 164, 248, 207, 51, 143, 186, 39, 215, 28, 135, 35, 61, 243, - 154, 186, 194, 253, 27, 44, 21, 27, 135, 25, 84, 213, 32, 212, 224, 3, - 30, 154, 170, 76, 36, 216, 87, 56, 179, 54, 42, 115, 10, 47, 77, 222, - 220, 157, 94, 184, 97, 42, 220, 125, 133, 163, 97, 25, 95, 29, 203, 240, - 202, 20, 179, 46, 59, 2, 247, 83, 51, 78, 224, 41, 176, 33, 211, 189, - 145, 107, 190, 98, 171, 207, 60, 91, 131, 166, 110, 164, 237, 249, 229, 95, - 23, 200, 234, 179, 251, 61, 195, 171, 59, 221, 91, 87, 237, 151, 28, 146, - 211, 178, 164, 194, 215, 59, 19, 169, 185, 47, 193, 136, 135, 88, 77, 43, - 181, 11, 37, 118, 114, 201, 67, 91, 47, 153, 196, 236, 142, 42, 3, 43, - 52, 200, 245, 160, 234, 192, 134, 4, 213, 121, 187, 164, 154, 168, 93, 147, - 31, 16, 237, 82, 213, 141, 118, 208, 196, 45, 8, 122, 192, 186, 211, 176, - 197, 23, 171, 174, 69, 19, 78, 67, 47, 83, 221, 171, 186, 123, 77, 100, - 94, 60, 250, 52, 162, 102, 250, 220, 150, 187, 155, 100, 188, 124, 146, 67, - 132, 154, 142, 106, 135, 186, 241, 29, 93, 21, 92, 131, 210, 155, 79, 49, - 225, 170, 51, 123, 228, 168, 252, 179, 114, 17, 233, 138, 107, 32, 23, 31, - 81, 37, 182, 82, 29, 243, 54, 152, 47, 205, 188, 194, 143, 204, 113, 53, - 190, 199, 237, 214, 201, 174, 89, 161, 37, 45, 180, 28, 251, 235, 220, 124, - 180, 178, 151, 221, 109, 156, 246, 111, 94, 217, 70, 138, 89, 218, 70, 43, - 186, 217, 93, 10, 59, 51, 125, 101, 57, 198, 241, 233, 238, 146, 172, 252, - 40, 63, 141, 121, 201, 180, 242, 93, 99, 37, 76, 106, 77, 38, 254, 142, - 100, 133, 62, 53, 130, 39, 149, 202, 238, 186, 54, 142, 145, 72, 237, 170, - 137, 236, 120, 217, 149, 233, 164, 157, 227, 218, 171, 249, 91, 110, 180, 180, - 76, 107, 247, 130, 201, 238, 141, 182, 168, 166, 94, 145, 141, 11, 38, 20, - 104, 57, 23, 78, 225, 24, 7, 187, 238, 204, 29, 237, 53, 50, 52, 219, - 75, 66, 153, 170, 173, 94, 21, 118, 156, 225, 50, 244, 196, 147, 197, 21, - 125, 98, 161, 234, 162, 180, 116, 46, 179, 131, 155, 126, 194, 214, 24, 21, - 182, 198, 98, 133, 33, 233, 211, 155, 147, 2, 225, 206, 53, 58, 206, 30, - 127, 70, 250, 103, 118, 126, 19, 18, 101, 183, 254, 156, 112, 176, 24, 63, - 206, 197, 183, 66, 198, 79, 110, 36, 147, 219, 149, 60, 74, 29, 155, 49, - 223, 45, 126, 98, 73, 20, 146, 33, 238, 190, 61, 71, 73, 51, 221, 195, - 222, 204, 150, 186, 236, 44, 71, 206, 251, 206, 25, 154, 17, 128, 158, 121, - 183, 248, 92, 17, 160, 166, 63, 0, 64, 136, 101, 107, 213, 255, 151, 189, - 55, 111, 108, 219, 72, 242, 134, 255, 199, 167, 128, 105, 56, 188, 64, 10, - 0, 73, 73, 182, 4, 121, 28, 199, 201, 120, 55, 82, 60, 78, 118, 178, - 187, 178, 194, 80, 36, 37, 34, 230, 161, 229, 33, 145, 166, 249, 126, 246, - 183, 126, 85, 221, 64, 3, 36, 117, 248, 200, 204, 238, 51, 78, 36, 161, - 239, 238, 234, 238, 234, 234, 234, 58, 78, 169, 71, 133, 9, 12, 209, 78, - 236, 51, 119, 226, 214, 138, 197, 131, 215, 229, 23, 57, 54, 97, 196, 243, - 135, 135, 84, 57, 1, 61, 31, 72, 164, 219, 151, 197, 82, 190, 64, 215, - 30, 90, 99, 160, 107, 12, 84, 141, 232, 33, 7, 92, 207, 90, 250, 110, - 116, 76, 87, 89, 150, 46, 4, 161, 74, 223, 170, 227, 71, 200, 71, 141, - 68, 133, 199, 65, 241, 192, 62, 167, 187, 44, 133, 94, 159, 62, 174, 185, - 209, 217, 129, 205, 182, 181, 41, 199, 17, 18, 78, 185, 31, 248, 98, 155, - 226, 103, 174, 206, 199, 134, 167, 94, 23, 30, 123, 116, 163, 68, 117, 103, - 197, 131, 40, 103, 73, 175, 226, 27, 65, 144, 144, 173, 240, 219, 188, 137, - 18, 75, 51, 147, 31, 6, 219, 71, 161, 247, 156, 192, 241, 236, 245, 173, - 32, 110, 94, 92, 254, 63, 3, 101, 214, 106, 85, 157, 115, 197, 193, 250, - 221, 128, 143, 134, 255, 139, 215, 180, 27, 13, 47, 30, 6, 241, 195, 63, - 121, 93, 227, 169, 226, 255, 194, 186, 254, 71, 67, 250, 193, 107, 59, 190, - 43, 126, 233, 181, 109, 47, 211, 192, 193, 150, 199, 12, 28, 1, 30, 46, - 253, 242, 221, 185, 187, 112, 63, 184, 94, 145, 187, 218, 46, 150, 195, 8, - 131, 43, 247, 162, 201, 116, 68, 215, 15, 113, 68, 115, 3, 121, 154, 229, - 13, 24, 79, 177, 11, 97, 53, 36, 209, 217, 218, 48, 156, 175, 187, 150, - 190, 230, 200, 120, 254, 170, 235, 179, 183, 62, 84, 245, 26, 248, 21, 144, - 210, 73, 40, 3, 180, 157, 19, 25, 227, 228, 177, 199, 129, 253, 56, 48, - 169, 218, 115, 189, 204, 149, 49, 70, 106, 148, 26, 191, 238, 66, 45, 54, - 231, 156, 228, 10, 240, 113, 241, 30, 235, 159, 254, 212, 232, 239, 123, 187, - 108, 215, 14, 172, 30, 7, 122, 133, 199, 239, 107, 236, 4, 227, 106, 81, - 136, 78, 41, 224, 82, 5, 167, 239, 207, 202, 229, 51, 87, 214, 59, 53, - 228, 82, 102, 247, 166, 215, 121, 12, 167, 21, 216, 48, 146, 231, 40, 68, - 188, 26, 39, 138, 106, 63, 226, 126, 181, 81, 162, 164, 178, 95, 164, 40, - 148, 167, 255, 208, 13, 2, 90, 225, 2, 10, 134, 232, 143, 231, 218, 239, - 15, 185, 40, 253, 42, 186, 116, 175, 124, 175, 95, 254, 168, 178, 50, 106, - 147, 102, 204, 58, 208, 126, 46, 230, 131, 10, 12, 122, 167, 162, 114, 234, - 28, 105, 72, 249, 110, 46, 106, 23, 30, 99, 248, 229, 90, 121, 94, 204, - 217, 76, 225, 106, 245, 61, 202, 8, 91, 231, 75, 231, 132, 160, 203, 69, - 217, 214, 154, 177, 65, 223, 11, 107, 117, 125, 158, 191, 50, 118, 60, 17, - 19, 204, 210, 179, 47, 52, 233, 152, 175, 247, 174, 245, 222, 231, 185, 103, - 195, 155, 239, 3, 181, 14, 2, 172, 131, 64, 173, 131, 192, 92, 7, 129, - 0, 223, 95, 91, 8, 193, 250, 66, 240, 121, 37, 4, 201, 74, 8, 50, - 43, 33, 88, 91, 9, 255, 12, 139, 193, 255, 140, 197, 240, 85, 200, 144, - 53, 132, 166, 78, 177, 219, 145, 26, 53, 12, 102, 231, 214, 116, 55, 226, - 179, 42, 117, 252, 84, 179, 163, 249, 147, 49, 245, 151, 28, 216, 54, 84, - 189, 113, 164, 95, 229, 74, 180, 62, 188, 202, 125, 199, 215, 154, 127, 214, - 196, 125, 237, 107, 200, 215, 29, 217, 125, 103, 78, 75, 200, 24, 215, 98, - 230, 29, 7, 138, 119, 172, 56, 14, 37, 147, 203, 155, 48, 203, 13, 110, - 121, 77, 61, 9, 37, 156, 153, 154, 193, 81, 103, 118, 163, 190, 76, 63, - 152, 119, 153, 8, 239, 112, 55, 253, 205, 221, 244, 214, 186, 233, 199, 221, - 244, 254, 172, 110, 198, 204, 221, 29, 13, 164, 152, 169, 0, 54, 78, 213, - 4, 169, 207, 213, 107, 190, 188, 164, 48, 39, 174, 82, 187, 149, 217, 47, - 50, 75, 15, 98, 221, 197, 226, 77, 27, 24, 228, 235, 185, 69, 2, 234, - 94, 12, 224, 228, 105, 69, 158, 2, 239, 96, 252, 26, 50, 85, 89, 166, - 26, 47, 195, 141, 44, 53, 153, 250, 135, 49, 212, 230, 204, 76, 164, 223, - 154, 155, 104, 136, 91, 234, 215, 14, 59, 107, 205, 126, 155, 96, 100, 70, - 174, 113, 162, 95, 148, 185, 158, 124, 70, 152, 241, 46, 209, 168, 204, 19, - 203, 190, 149, 238, 147, 72, 229, 46, 217, 14, 82, 162, 141, 147, 126, 150, - 95, 111, 94, 139, 124, 27, 86, 206, 124, 237, 41, 249, 209, 17, 209, 185, - 16, 154, 165, 233, 164, 121, 177, 199, 120, 235, 227, 87, 109, 227, 33, 123, - 93, 95, 61, 109, 125, 136, 85, 205, 207, 217, 2, 154, 200, 250, 123, 54, - 47, 103, 232, 91, 180, 161, 81, 81, 175, 192, 189, 31, 107, 111, 212, 149, - 39, 191, 228, 61, 112, 115, 147, 101, 155, 141, 86, 236, 36, 133, 161, 135, - 96, 152, 57, 193, 3, 255, 69, 148, 154, 186, 11, 104, 147, 62, 179, 79, - 149, 187, 74, 70, 213, 91, 5, 90, 51, 243, 182, 38, 142, 170, 220, 65, - 114, 37, 247, 159, 192, 140, 194, 46, 20, 129, 23, 59, 190, 87, 204, 219, - 242, 184, 169, 109, 78, 99, 107, 148, 147, 94, 203, 90, 198, 229, 212, 28, - 201, 150, 25, 206, 116, 89, 117, 244, 10, 246, 168, 198, 67, 67, 215, 202, - 118, 150, 21, 58, 14, 154, 68, 55, 210, 1, 226, 89, 74, 170, 130, 141, - 5, 172, 201, 45, 248, 108, 6, 138, 18, 7, 48, 80, 6, 73, 135, 196, - 207, 165, 146, 123, 40, 195, 76, 226, 145, 232, 39, 86, 18, 43, 34, 170, - 92, 73, 11, 107, 196, 70, 162, 202, 242, 212, 171, 198, 194, 238, 172, 217, - 36, 132, 136, 86, 215, 240, 246, 160, 61, 110, 43, 55, 145, 98, 236, 163, - 106, 236, 222, 42, 19, 137, 162, 216, 108, 78, 181, 220, 10, 30, 54, 183, - 121, 41, 244, 224, 61, 41, 246, 159, 128, 21, 23, 122, 206, 84, 243, 102, - 96, 235, 116, 109, 106, 92, 239, 190, 195, 53, 39, 5, 166, 148, 7, 166, - 202, 152, 196, 213, 154, 132, 9, 75, 153, 72, 77, 97, 8, 33, 116, 123, - 199, 14, 228, 165, 30, 147, 110, 154, 40, 160, 59, 12, 204, 20, 24, 46, - 54, 59, 165, 9, 8, 12, 154, 193, 22, 237, 199, 140, 22, 36, 17, 239, - 212, 225, 2, 95, 64, 136, 114, 127, 95, 85, 214, 12, 38, 176, 184, 37, - 226, 53, 169, 249, 72, 30, 11, 108, 24, 9, 226, 135, 128, 88, 31, 67, - 27, 10, 138, 134, 195, 238, 88, 249, 183, 213, 46, 66, 70, 179, 105, 38, - 238, 142, 73, 21, 112, 182, 18, 225, 228, 148, 220, 184, 93, 120, 51, 138, - 38, 147, 209, 176, 2, 97, 164, 206, 109, 250, 24, 186, 155, 98, 171, 192, - 236, 91, 98, 178, 192, 232, 28, 148, 108, 32, 151, 187, 54, 94, 83, 85, - 34, 229, 35, 205, 19, 183, 29, 134, 51, 52, 17, 204, 178, 39, 94, 152, - 27, 82, 23, 185, 121, 74, 246, 195, 156, 124, 222, 34, 109, 165, 208, 147, - 110, 118, 211, 88, 93, 72, 25, 83, 63, 38, 116, 64, 16, 185, 185, 90, - 229, 36, 27, 99, 127, 30, 95, 236, 227, 86, 84, 245, 120, 120, 113, 156, - 22, 195, 98, 207, 149, 64, 201, 99, 136, 20, 221, 148, 107, 112, 88, 68, - 55, 80, 254, 240, 215, 165, 156, 68, 82, 200, 169, 229, 207, 30, 133, 121, - 6, 82, 22, 113, 40, 129, 169, 236, 171, 144, 114, 115, 139, 151, 40, 67, - 65, 143, 195, 202, 72, 80, 172, 74, 196, 86, 135, 142, 67, 88, 69, 193, - 61, 61, 106, 111, 177, 169, 29, 192, 10, 151, 19, 29, 187, 126, 153, 173, - 106, 243, 222, 136, 218, 135, 161, 131, 98, 176, 43, 228, 105, 173, 119, 138, - 134, 190, 123, 85, 44, 21, 177, 242, 198, 48, 73, 39, 138, 166, 66, 57, - 118, 168, 92, 145, 149, 56, 160, 234, 193, 86, 85, 208, 149, 53, 185, 32, - 131, 204, 8, 12, 179, 68, 178, 21, 55, 3, 99, 172, 30, 226, 52, 72, - 105, 74, 174, 47, 195, 229, 111, 43, 209, 40, 134, 150, 165, 86, 203, 168, - 42, 27, 76, 98, 222, 165, 59, 6, 6, 177, 107, 214, 165, 156, 26, 243, - 5, 245, 191, 164, 92, 200, 217, 85, 22, 251, 243, 173, 114, 75, 82, 219, - 54, 125, 201, 27, 166, 92, 60, 20, 50, 61, 212, 28, 55, 173, 142, 135, - 65, 50, 184, 8, 239, 39, 42, 92, 30, 131, 125, 59, 204, 3, 134, 121, - 160, 97, 30, 108, 128, 249, 58, 200, 77, 136, 111, 5, 56, 253, 255, 199, - 105, 165, 33, 246, 219, 140, 3, 1, 177, 245, 179, 204, 41, 97, 177, 15, - 61, 80, 6, 128, 10, 193, 4, 104, 141, 175, 82, 11, 124, 149, 173, 168, - 223, 186, 234, 19, 48, 9, 79, 123, 108, 97, 202, 118, 8, 220, 86, 108, - 52, 99, 77, 71, 7, 237, 127, 176, 253, 93, 151, 254, 7, 143, 114, 111, - 197, 254, 188, 246, 86, 134, 242, 14, 78, 182, 38, 97, 245, 193, 136, 5, - 51, 161, 129, 72, 112, 27, 79, 19, 133, 68, 170, 46, 173, 137, 168, 28, - 67, 233, 66, 106, 239, 61, 208, 51, 22, 55, 2, 31, 144, 74, 141, 120, - 216, 217, 174, 113, 184, 241, 68, 75, 117, 124, 223, 115, 247, 27, 86, 102, - 44, 49, 202, 218, 83, 118, 87, 158, 122, 107, 78, 221, 181, 161, 156, 162, - 30, 78, 133, 137, 165, 244, 168, 54, 42, 163, 46, 217, 178, 231, 35, 40, - 139, 138, 144, 167, 72, 212, 138, 149, 102, 246, 169, 232, 39, 62, 21, 133, - 128, 16, 83, 38, 155, 84, 168, 184, 231, 202, 113, 50, 148, 190, 99, 91, - 168, 247, 156, 11, 85, 244, 211, 166, 34, 54, 107, 236, 234, 105, 169, 153, - 211, 178, 247, 240, 105, 81, 221, 169, 55, 220, 250, 190, 219, 8, 172, 244, - 240, 18, 99, 184, 202, 4, 137, 182, 134, 188, 183, 105, 126, 148, 17, 163, - 77, 67, 220, 96, 105, 219, 86, 118, 182, 239, 55, 85, 187, 117, 151, 254, - 23, 139, 53, 108, 242, 223, 241, 181, 97, 99, 58, 196, 22, 108, 241, 63, - 137, 202, 233, 105, 132, 37, 134, 237, 211, 136, 107, 5, 36, 0, 31, 178, - 151, 84, 153, 207, 217, 74, 159, 59, 103, 170, 11, 53, 207, 221, 243, 172, - 244, 64, 50, 102, 171, 131, 205, 19, 165, 55, 210, 134, 177, 60, 108, 3, - 101, 12, 17, 111, 210, 201, 189, 215, 126, 154, 63, 108, 14, 12, 75, 64, - 255, 200, 121, 152, 155, 83, 48, 127, 48, 244, 183, 140, 226, 65, 51, 192, - 110, 97, 83, 72, 107, 163, 1, 48, 238, 225, 226, 97, 64, 142, 45, 110, - 252, 35, 65, 188, 48, 65, 188, 120, 48, 136, 55, 142, 225, 161, 0, 62, - 184, 47, 128, 63, 60, 12, 192, 236, 2, 134, 122, 56, 249, 226, 48, 142, - 123, 243, 48, 104, 109, 235, 208, 67, 1, 182, 115, 15, 128, 77, 102, 231, - 90, 30, 219, 62, 197, 133, 66, 212, 70, 206, 98, 229, 224, 230, 101, 43, - 26, 30, 133, 126, 2, 181, 209, 224, 106, 6, 176, 245, 186, 224, 26, 68, - 144, 221, 230, 26, 42, 138, 156, 55, 181, 109, 11, 163, 171, 171, 209, 36, - 162, 236, 163, 11, 165, 64, 168, 47, 110, 69, 251, 188, 59, 189, 129, 252, - 21, 106, 202, 222, 247, 196, 174, 118, 215, 84, 20, 166, 206, 169, 181, 26, - 247, 229, 23, 202, 161, 213, 18, 227, 54, 95, 84, 190, 181, 35, 118, 51, - 205, 94, 147, 96, 214, 164, 167, 74, 218, 189, 214, 53, 223, 25, 85, 191, - 181, 13, 91, 2, 67, 187, 71, 217, 8, 158, 92, 157, 112, 12, 11, 223, - 186, 84, 23, 216, 235, 47, 238, 180, 70, 197, 96, 218, 234, 254, 104, 227, - 198, 138, 65, 175, 100, 234, 83, 170, 149, 150, 57, 49, 198, 93, 19, 46, - 184, 89, 27, 63, 183, 81, 201, 39, 94, 83, 106, 146, 238, 156, 32, 61, - 7, 250, 194, 9, 184, 39, 144, 102, 85, 158, 148, 22, 62, 134, 105, 90, - 140, 96, 147, 225, 58, 113, 77, 149, 199, 139, 149, 121, 172, 7, 113, 56, - 172, 242, 145, 150, 122, 14, 132, 243, 94, 17, 149, 6, 190, 111, 117, 65, - 211, 119, 21, 171, 217, 138, 52, 167, 127, 71, 216, 202, 89, 235, 47, 72, - 166, 134, 44, 174, 138, 118, 65, 91, 23, 44, 167, 43, 162, 242, 30, 46, - 76, 177, 188, 181, 226, 156, 183, 82, 108, 203, 148, 14, 255, 107, 134, 209, - 207, 98, 239, 72, 45, 218, 191, 71, 157, 238, 72, 171, 20, 182, 0, 125, - 54, 246, 113, 17, 245, 193, 84, 24, 182, 6, 93, 55, 119, 213, 26, 183, - 6, 190, 224, 39, 54, 82, 205, 17, 39, 18, 145, 139, 211, 169, 85, 51, - 149, 130, 57, 119, 120, 222, 188, 160, 80, 119, 162, 217, 40, 52, 205, 42, - 38, 101, 156, 89, 37, 68, 180, 142, 41, 13, 218, 238, 93, 90, 90, 176, - 154, 113, 222, 162, 181, 132, 158, 94, 140, 198, 240, 60, 185, 230, 248, 239, - 133, 234, 180, 116, 89, 225, 66, 244, 76, 248, 141, 104, 11, 6, 132, 97, - 93, 68, 177, 96, 140, 200, 209, 56, 30, 116, 102, 75, 199, 245, 211, 2, - 138, 213, 136, 217, 50, 255, 232, 102, 251, 246, 226, 110, 3, 181, 110, 222, - 88, 186, 173, 139, 254, 232, 166, 59, 118, 115, 52, 131, 4, 191, 128, 238, - 54, 57, 247, 169, 149, 128, 127, 13, 1, 43, 250, 57, 151, 19, 221, 57, - 223, 211, 134, 43, 224, 78, 108, 55, 92, 9, 171, 142, 118, 24, 117, 132, - 48, 115, 145, 247, 150, 87, 193, 51, 76, 78, 3, 40, 67, 76, 11, 136, - 129, 232, 104, 229, 15, 38, 216, 160, 216, 35, 108, 54, 217, 158, 217, 239, - 114, 204, 169, 1, 248, 43, 4, 254, 10, 131, 159, 89, 53, 239, 114, 226, - 180, 15, 121, 232, 251, 34, 194, 42, 203, 173, 170, 202, 147, 192, 163, 172, - 39, 1, 194, 137, 221, 14, 173, 138, 217, 4, 250, 188, 202, 2, 162, 203, - 118, 76, 93, 94, 10, 161, 3, 6, 31, 83, 233, 116, 147, 159, 52, 39, - 20, 199, 86, 83, 194, 101, 110, 76, 235, 52, 180, 253, 3, 123, 34, 254, - 65, 33, 101, 240, 216, 179, 207, 14, 236, 88, 58, 192, 135, 116, 64, 31, - 72, 134, 50, 39, 194, 1, 112, 225, 57, 9, 67, 148, 121, 79, 101, 222, - 219, 103, 69, 128, 229, 6, 123, 207, 89, 94, 68, 83, 17, 167, 61, 61, - 123, 7, 14, 210, 233, 141, 219, 59, 91, 173, 248, 217, 159, 45, 250, 131, - 155, 116, 190, 170, 210, 239, 249, 202, 234, 140, 152, 97, 97, 246, 141, 42, - 114, 184, 247, 103, 226, 1, 192, 44, 41, 9, 92, 92, 125, 82, 29, 194, - 240, 140, 11, 45, 29, 134, 64, 233, 52, 219, 23, 85, 66, 117, 232, 108, - 117, 103, 197, 96, 67, 224, 187, 28, 58, 49, 120, 149, 245, 107, 230, 114, - 8, 140, 67, 176, 117, 228, 19, 44, 171, 216, 16, 37, 245, 203, 204, 133, - 233, 147, 79, 197, 9, 74, 178, 10, 79, 85, 156, 27, 34, 199, 19, 202, - 140, 152, 155, 86, 68, 72, 148, 103, 153, 27, 44, 44, 75, 238, 203, 95, - 222, 254, 248, 227, 171, 239, 127, 89, 229, 160, 253, 149, 83, 49, 111, 95, - 255, 240, 215, 95, 86, 116, 205, 194, 129, 64, 113, 223, 173, 86, 246, 205, - 41, 193, 130, 190, 111, 86, 37, 246, 209, 132, 239, 158, 124, 139, 173, 219, - 18, 156, 235, 216, 220, 72, 197, 183, 21, 255, 231, 254, 109, 188, 76, 181, - 177, 99, 180, 177, 147, 180, 177, 243, 121, 109, 188, 213, 109, 120, 238, 141, - 176, 33, 85, 189, 161, 159, 173, 180, 228, 142, 86, 54, 195, 42, 92, 66, - 126, 161, 65, 212, 30, 243, 157, 60, 87, 64, 88, 241, 189, 18, 231, 130, - 110, 218, 90, 225, 159, 223, 188, 120, 249, 74, 113, 175, 120, 71, 225, 141, - 205, 152, 35, 137, 180, 249, 55, 38, 140, 103, 75, 66, 201, 226, 48, 242, - 179, 163, 77, 213, 10, 207, 101, 143, 80, 48, 96, 181, 146, 193, 61, 162, - 54, 255, 102, 124, 191, 250, 153, 225, 73, 72, 248, 90, 25, 147, 73, 240, - 140, 62, 196, 21, 26, 99, 227, 123, 19, 229, 230, 81, 33, 231, 60, 251, - 41, 100, 20, 109, 32, 97, 194, 55, 132, 156, 157, 154, 32, 38, 167, 46, - 203, 107, 162, 125, 147, 20, 156, 198, 199, 143, 172, 11, 156, 115, 118, 115, - 172, 178, 151, 122, 140, 128, 243, 92, 248, 190, 41, 218, 11, 205, 46, 156, - 39, 38, 216, 22, 182, 118, 55, 226, 212, 149, 119, 133, 193, 53, 155, 78, - 188, 26, 143, 46, 199, 172, 40, 144, 102, 126, 186, 51, 197, 225, 166, 49, - 217, 71, 118, 10, 125, 218, 167, 57, 231, 40, 119, 150, 86, 5, 174, 219, - 101, 197, 47, 173, 56, 126, 21, 171, 224, 47, 68, 213, 150, 120, 53, 172, - 42, 203, 2, 40, 220, 162, 4, 43, 208, 220, 30, 195, 255, 5, 143, 45, - 25, 213, 202, 30, 49, 86, 146, 3, 240, 157, 141, 72, 215, 153, 185, 206, - 209, 74, 207, 254, 35, 88, 211, 29, 15, 216, 53, 106, 220, 119, 184, 61, - 41, 73, 11, 59, 240, 229, 28, 247, 252, 221, 120, 83, 223, 103, 185, 51, - 58, 94, 190, 7, 124, 105, 229, 50, 233, 157, 163, 114, 54, 253, 147, 49, - 37, 172, 69, 17, 255, 80, 239, 100, 64, 154, 152, 241, 248, 45, 179, 5, - 227, 163, 205, 54, 213, 51, 6, 201, 215, 204, 41, 77, 118, 56, 23, 229, - 200, 38, 157, 148, 93, 49, 241, 137, 211, 108, 19, 25, 160, 6, 155, 177, - 252, 108, 122, 88, 16, 229, 120, 90, 66, 125, 248, 95, 83, 173, 193, 42, - 88, 107, 224, 50, 81, 160, 207, 229, 136, 141, 39, 167, 79, 105, 80, 89, - 183, 220, 130, 84, 237, 116, 166, 178, 139, 19, 163, 211, 120, 89, 41, 116, - 84, 126, 73, 40, 130, 115, 150, 12, 195, 124, 123, 49, 135, 130, 202, 170, - 86, 6, 54, 137, 253, 42, 57, 188, 51, 134, 171, 214, 156, 166, 103, 189, - 1, 105, 48, 104, 123, 83, 41, 48, 216, 185, 220, 99, 152, 154, 146, 173, - 83, 83, 91, 71, 218, 84, 175, 39, 212, 65, 59, 166, 172, 242, 78, 61, - 175, 168, 97, 58, 205, 186, 243, 41, 245, 162, 158, 115, 233, 158, 129, 48, - 229, 166, 175, 208, 89, 174, 172, 62, 45, 162, 8, 71, 197, 200, 82, 13, - 226, 25, 4, 202, 236, 68, 46, 220, 84, 213, 161, 151, 59, 101, 59, 97, - 103, 246, 75, 201, 195, 189, 177, 11, 57, 186, 53, 204, 233, 214, 144, 43, - 230, 204, 117, 94, 199, 58, 87, 7, 169, 52, 101, 127, 96, 222, 250, 77, - 165, 112, 243, 100, 191, 136, 243, 102, 84, 149, 30, 5, 13, 119, 112, 85, - 191, 38, 66, 151, 113, 216, 168, 154, 217, 30, 148, 197, 137, 168, 182, 114, - 8, 244, 104, 96, 72, 174, 226, 114, 16, 181, 213, 12, 84, 175, 112, 33, - 125, 40, 74, 191, 235, 104, 250, 106, 231, 209, 23, 61, 132, 140, 202, 216, - 208, 235, 6, 236, 14, 140, 110, 226, 250, 149, 157, 76, 183, 39, 119, 240, - 228, 18, 33, 43, 27, 211, 128, 55, 197, 156, 158, 143, 166, 122, 214, 135, - 159, 225, 4, 15, 92, 68, 227, 137, 34, 246, 197, 192, 118, 75, 7, 137, - 138, 199, 162, 255, 72, 93, 11, 17, 139, 43, 0, 39, 208, 149, 162, 123, - 117, 4, 151, 96, 183, 227, 136, 150, 152, 167, 51, 49, 68, 130, 54, 162, - 33, 86, 188, 160, 60, 238, 170, 43, 52, 188, 108, 24, 24, 48, 106, 45, - 18, 188, 240, 250, 98, 141, 188, 199, 117, 124, 116, 213, 165, 219, 56, 8, - 73, 194, 8, 208, 74, 83, 27, 171, 53, 238, 234, 220, 220, 20, 48, 79, - 103, 54, 230, 107, 197, 120, 68, 183, 42, 188, 128, 166, 111, 252, 217, 45, - 56, 160, 134, 122, 240, 253, 70, 187, 15, 110, 45, 168, 243, 249, 42, 237, - 5, 66, 58, 19, 138, 102, 22, 0, 172, 252, 209, 197, 172, 232, 202, 13, - 133, 200, 116, 37, 34, 48, 107, 245, 141, 161, 25, 85, 152, 101, 39, 234, - 138, 23, 219, 30, 158, 220, 246, 196, 172, 17, 97, 97, 54, 84, 76, 136, - 162, 216, 130, 141, 167, 79, 30, 159, 141, 249, 171, 248, 226, 64, 79, 79, - 89, 108, 207, 41, 139, 15, 205, 58, 53, 98, 212, 203, 39, 227, 65, 13, - 216, 79, 28, 168, 213, 20, 70, 212, 41, 117, 208, 174, 156, 84, 112, 234, - 188, 112, 62, 210, 161, 11, 138, 86, 242, 243, 69, 232, 40, 237, 92, 77, - 220, 121, 174, 121, 86, 75, 112, 105, 32, 182, 251, 178, 107, 69, 145, 40, - 98, 26, 24, 16, 144, 137, 103, 43, 126, 188, 84, 85, 176, 238, 170, 47, - 12, 31, 182, 246, 54, 35, 219, 221, 124, 245, 221, 80, 208, 173, 84, 95, - 115, 97, 173, 194, 110, 158, 132, 59, 202, 190, 201, 114, 197, 120, 143, 190, - 131, 235, 214, 216, 102, 240, 80, 231, 87, 118, 83, 192, 37, 203, 22, 71, - 186, 179, 228, 68, 69, 171, 195, 184, 11, 188, 73, 7, 236, 73, 186, 210, - 192, 85, 112, 55, 183, 182, 89, 121, 29, 17, 180, 249, 111, 60, 49, 255, - 192, 141, 10, 11, 39, 106, 51, 209, 242, 76, 51, 205, 100, 58, 164, 203, - 12, 135, 127, 237, 220, 219, 118, 238, 87, 219, 162, 122, 209, 252, 243, 108, - 209, 100, 77, 124, 189, 29, 74, 155, 114, 125, 211, 189, 163, 253, 250, 142, - 182, 24, 215, 181, 101, 191, 165, 10, 25, 20, 159, 49, 198, 152, 216, 218, - 221, 68, 108, 41, 54, 72, 141, 41, 174, 203, 81, 147, 47, 230, 68, 121, - 129, 8, 35, 114, 107, 52, 188, 104, 69, 125, 149, 32, 135, 50, 95, 240, - 57, 34, 69, 242, 19, 205, 175, 136, 251, 220, 227, 156, 244, 217, 105, 158, - 228, 108, 245, 79, 104, 124, 205, 45, 104, 88, 125, 220, 189, 84, 237, 93, - 145, 31, 171, 64, 154, 1, 119, 57, 153, 4, 115, 100, 121, 24, 230, 207, - 18, 231, 92, 172, 219, 121, 134, 241, 174, 226, 174, 9, 31, 168, 61, 26, - 78, 163, 225, 172, 171, 137, 25, 227, 186, 99, 221, 135, 12, 220, 189, 155, - 12, 220, 77, 145, 129, 90, 60, 164, 180, 178, 166, 209, 148, 238, 223, 49, - 125, 154, 133, 138, 116, 82, 48, 240, 77, 15, 87, 237, 94, 152, 229, 196, - 8, 231, 123, 5, 106, 151, 242, 64, 27, 132, 43, 149, 75, 117, 76, 2, - 199, 209, 255, 162, 49, 21, 153, 153, 240, 17, 100, 133, 74, 241, 130, 224, - 3, 169, 95, 38, 225, 48, 116, 234, 107, 75, 97, 196, 71, 157, 49, 245, - 94, 34, 65, 171, 52, 7, 111, 165, 64, 191, 206, 105, 166, 52, 48, 255, - 69, 101, 254, 51, 157, 85, 153, 213, 144, 57, 173, 130, 248, 180, 10, 50, - 167, 85, 205, 56, 173, 106, 250, 180, 170, 25, 167, 85, 61, 123, 90, 53, - 82, 231, 148, 90, 12, 247, 39, 30, 131, 244, 209, 84, 75, 31, 77, 245, - 45, 71, 83, 227, 179, 136, 71, 5, 156, 219, 201, 71, 130, 82, 165, 142, - 147, 172, 145, 162, 28, 85, 217, 109, 180, 227, 87, 221, 98, 9, 109, 248, - 47, 186, 240, 159, 111, 175, 109, 161, 12, 191, 250, 94, 75, 86, 197, 189, - 233, 193, 207, 222, 116, 66, 15, 174, 237, 163, 12, 69, 152, 221, 66, 153, - 18, 6, 57, 216, 72, 17, 130, 141, 91, 8, 193, 192, 36, 4, 237, 147, - 208, 179, 162, 193, 113, 24, 13, 47, 68, 195, 238, 171, 81, 134, 104, 101, - 121, 29, 158, 58, 244, 113, 118, 112, 202, 10, 150, 3, 247, 250, 212, 59, - 43, 242, 43, 69, 116, 76, 1, 255, 172, 120, 182, 178, 78, 136, 226, 50, - 180, 115, 202, 25, 26, 175, 1, 26, 175, 188, 67, 148, 211, 9, 171, 80, - 80, 133, 247, 34, 249, 26, 119, 147, 124, 141, 52, 201, 167, 40, 142, 123, - 146, 125, 229, 97, 98, 33, 255, 95, 244, 223, 87, 224, 49, 26, 175, 145, - 245, 173, 148, 96, 109, 3, 37, 8, 73, 248, 29, 94, 46, 155, 86, 139, - 80, 133, 141, 141, 84, 33, 203, 45, 221, 70, 18, 14, 207, 181, 86, 135, - 60, 66, 120, 95, 233, 8, 251, 129, 78, 152, 49, 222, 91, 90, 246, 180, - 59, 184, 26, 141, 179, 34, 90, 255, 171, 169, 199, 127, 224, 129, 150, 153, - 64, 229, 187, 248, 43, 28, 115, 169, 165, 180, 118, 198, 249, 201, 33, 151, - 57, 227, 190, 28, 95, 36, 197, 17, 249, 30, 210, 112, 183, 146, 153, 56, - 42, 68, 105, 134, 33, 227, 254, 195, 153, 150, 23, 202, 25, 229, 29, 68, - 231, 58, 187, 146, 11, 110, 163, 56, 255, 172, 29, 172, 132, 27, 215, 247, - 111, 188, 94, 55, 110, 228, 127, 10, 202, 244, 31, 188, 107, 182, 82, 134, - 255, 152, 93, 115, 63, 130, 241, 43, 111, 31, 166, 32, 51, 59, 98, 3, - 249, 152, 226, 37, 26, 217, 13, 218, 241, 83, 153, 136, 253, 91, 168, 196, - 229, 35, 57, 149, 77, 129, 138, 27, 168, 99, 218, 189, 16, 34, 159, 147, - 112, 57, 89, 41, 194, 138, 137, 160, 132, 62, 122, 71, 20, 145, 235, 244, - 96, 27, 73, 211, 90, 144, 4, 179, 174, 84, 39, 4, 78, 9, 163, 241, - 78, 138, 53, 233, 203, 57, 141, 252, 61, 234, 50, 69, 48, 169, 241, 9, - 4, 57, 184, 213, 68, 92, 35, 40, 7, 252, 160, 188, 116, 14, 111, 35, - 253, 164, 87, 57, 187, 114, 148, 165, 126, 11, 185, 165, 95, 118, 142, 86, - 59, 78, 128, 183, 234, 20, 193, 92, 33, 64, 115, 157, 76, 26, 151, 215, - 109, 73, 59, 71, 59, 5, 7, 214, 107, 86, 95, 136, 187, 25, 47, 34, - 197, 215, 20, 26, 151, 9, 224, 85, 154, 187, 185, 78, 125, 254, 63, 78, - 122, 198, 212, 103, 44, 188, 66, 179, 181, 109, 53, 62, 148, 59, 249, 160, - 169, 93, 103, 95, 110, 158, 219, 212, 180, 142, 7, 250, 20, 196, 129, 27, - 104, 92, 186, 137, 152, 205, 160, 98, 58, 218, 174, 248, 60, 108, 211, 54, - 105, 27, 98, 239, 67, 104, 49, 208, 185, 133, 219, 104, 95, 29, 228, 132, - 94, 71, 56, 157, 34, 214, 164, 74, 80, 226, 45, 135, 72, 22, 243, 75, - 152, 185, 27, 56, 42, 174, 38, 112, 0, 39, 135, 4, 247, 32, 196, 160, - 113, 38, 164, 6, 178, 246, 144, 20, 52, 98, 220, 239, 153, 143, 66, 73, - 245, 76, 40, 212, 185, 58, 241, 20, 193, 53, 18, 166, 203, 201, 88, 4, - 143, 230, 214, 136, 16, 73, 133, 224, 177, 202, 191, 178, 10, 203, 188, 68, - 231, 169, 81, 204, 231, 205, 145, 31, 236, 175, 100, 242, 252, 96, 207, 158, - 168, 204, 203, 233, 10, 202, 253, 60, 97, 58, 78, 85, 72, 43, 11, 11, - 204, 212, 125, 214, 48, 78, 145, 102, 57, 71, 21, 204, 229, 5, 220, 201, - 65, 164, 142, 10, 129, 9, 158, 183, 12, 177, 157, 43, 17, 199, 118, 234, - 54, 67, 17, 39, 72, 74, 198, 76, 143, 199, 38, 52, 202, 144, 8, 99, - 202, 138, 221, 124, 88, 77, 21, 9, 105, 120, 185, 41, 115, 199, 211, 18, - 97, 21, 37, 3, 30, 99, 61, 93, 109, 14, 194, 97, 252, 153, 59, 3, - 154, 60, 117, 130, 51, 123, 195, 63, 197, 38, 144, 186, 237, 145, 45, 207, - 97, 53, 150, 173, 195, 34, 86, 216, 61, 105, 115, 72, 109, 190, 194, 19, - 145, 61, 106, 183, 103, 99, 80, 55, 241, 155, 158, 28, 198, 57, 174, 43, - 151, 143, 135, 156, 136, 160, 141, 108, 135, 27, 96, 124, 107, 144, 138, 98, - 165, 224, 235, 189, 2, 72, 112, 60, 186, 17, 171, 42, 20, 67, 27, 254, - 2, 53, 180, 174, 136, 242, 154, 67, 168, 78, 185, 151, 207, 8, 163, 167, - 180, 77, 196, 226, 130, 32, 159, 13, 236, 204, 175, 114, 251, 99, 85, 146, - 207, 160, 25, 31, 72, 29, 198, 97, 0, 43, 12, 188, 39, 10, 21, 108, - 134, 23, 196, 226, 51, 115, 247, 197, 249, 136, 154, 64, 12, 96, 215, 64, - 213, 192, 66, 241, 240, 0, 185, 42, 230, 98, 219, 6, 232, 159, 152, 53, - 184, 26, 211, 196, 76, 186, 185, 204, 230, 86, 42, 41, 50, 139, 49, 29, - 249, 5, 216, 253, 58, 8, 152, 17, 25, 169, 221, 187, 176, 81, 132, 71, - 206, 46, 76, 34, 180, 250, 151, 163, 49, 213, 59, 80, 230, 14, 30, 122, - 15, 3, 181, 101, 69, 167, 227, 238, 4, 194, 238, 217, 43, 152, 125, 1, - 157, 121, 101, 18, 68, 211, 154, 91, 175, 106, 187, 43, 43, 35, 6, 166, - 10, 126, 149, 231, 129, 47, 186, 247, 88, 139, 203, 20, 55, 105, 173, 203, - 19, 252, 31, 217, 123, 108, 211, 226, 182, 205, 231, 39, 155, 239, 171, 49, - 241, 227, 219, 153, 183, 97, 247, 249, 159, 190, 251, 98, 28, 250, 165, 152, - 255, 159, 176, 5, 105, 215, 153, 187, 74, 92, 181, 110, 222, 73, 27, 174, - 120, 230, 38, 202, 100, 127, 198, 36, 229, 110, 114, 80, 87, 236, 183, 221, - 233, 56, 34, 202, 13, 10, 113, 59, 48, 75, 40, 107, 36, 189, 158, 227, - 3, 51, 126, 52, 208, 151, 190, 207, 127, 44, 248, 226, 207, 5, 95, 77, - 42, 195, 223, 204, 149, 247, 13, 174, 188, 190, 27, 124, 50, 91, 154, 17, - 174, 196, 84, 32, 100, 127, 209, 106, 79, 141, 129, 119, 174, 67, 12, 179, - 130, 129, 83, 224, 48, 244, 158, 123, 207, 130, 70, 99, 167, 115, 205, 218, - 57, 61, 63, 132, 85, 142, 149, 221, 225, 157, 170, 188, 144, 103, 108, 148, - 52, 86, 207, 157, 70, 169, 247, 204, 105, 80, 131, 224, 220, 16, 33, 19, - 198, 222, 203, 29, 46, 10, 253, 133, 226, 202, 164, 9, 145, 203, 162, 36, - 47, 92, 74, 150, 18, 20, 6, 232, 131, 154, 20, 55, 71, 61, 215, 65, - 122, 89, 146, 43, 40, 111, 44, 180, 215, 211, 174, 242, 113, 240, 238, 177, - 210, 7, 216, 209, 245, 230, 158, 217, 63, 142, 90, 29, 217, 35, 57, 174, - 165, 130, 223, 254, 142, 211, 243, 115, 183, 172, 62, 94, 205, 252, 104, 117, - 10, 91, 202, 98, 68, 89, 141, 32, 104, 236, 194, 200, 147, 177, 42, 135, - 131, 42, 29, 170, 151, 91, 87, 39, 165, 125, 210, 218, 188, 48, 5, 157, - 9, 42, 95, 98, 237, 81, 95, 248, 246, 137, 191, 188, 6, 79, 233, 235, - 108, 211, 58, 148, 132, 205, 107, 17, 103, 155, 148, 3, 76, 121, 126, 232, - 14, 43, 81, 185, 103, 229, 114, 84, 120, 92, 9, 216, 42, 166, 76, 127, - 84, 162, 46, 210, 146, 203, 21, 221, 118, 145, 237, 138, 35, 107, 178, 158, - 109, 126, 139, 123, 232, 162, 110, 207, 6, 179, 62, 220, 166, 202, 28, 125, - 176, 78, 130, 80, 180, 179, 79, 160, 157, 109, 73, 188, 171, 254, 248, 234, - 67, 158, 252, 78, 158, 192, 105, 116, 149, 122, 203, 77, 137, 134, 30, 43, - 228, 125, 16, 115, 189, 17, 76, 234, 162, 64, 78, 89, 247, 108, 23, 15, - 115, 206, 73, 192, 157, 250, 112, 136, 85, 96, 151, 203, 31, 138, 7, 246, - 135, 156, 168, 17, 113, 109, 98, 165, 244, 36, 184, 162, 90, 56, 251, 129, - 125, 18, 160, 122, 68, 149, 109, 191, 120, 96, 37, 13, 90, 210, 224, 213, - 230, 22, 175, 208, 36, 138, 161, 193, 171, 184, 197, 171, 162, 46, 135, 74, - 40, 215, 90, 193, 161, 20, 28, 114, 193, 97, 92, 112, 72, 5, 189, 106, - 163, 132, 130, 101, 27, 245, 228, 20, 98, 169, 90, 120, 230, 196, 4, 197, - 47, 157, 60, 34, 28, 22, 247, 95, 230, 159, 142, 132, 191, 198, 66, 255, - 52, 36, 75, 11, 187, 106, 46, 234, 207, 64, 185, 107, 128, 200, 80, 4, - 177, 61, 53, 58, 18, 115, 206, 163, 92, 172, 51, 38, 103, 117, 250, 136, - 229, 163, 23, 93, 200, 34, 242, 63, 228, 44, 135, 149, 38, 238, 118, 204, - 236, 148, 120, 61, 202, 24, 148, 9, 186, 100, 112, 30, 233, 71, 79, 190, - 173, 26, 104, 245, 59, 10, 63, 218, 216, 21, 57, 237, 83, 70, 245, 180, - 6, 230, 154, 117, 60, 222, 18, 214, 100, 10, 13, 232, 216, 126, 55, 161, - 245, 160, 228, 60, 90, 229, 10, 180, 32, 57, 141, 189, 204, 211, 30, 56, - 176, 174, 102, 147, 94, 161, 219, 159, 122, 46, 253, 242, 139, 172, 1, 139, - 28, 167, 113, 190, 114, 25, 206, 10, 144, 229, 192, 222, 150, 132, 93, 118, - 53, 186, 42, 112, 249, 166, 184, 130, 228, 172, 149, 74, 156, 249, 236, 192, - 110, 138, 211, 200, 13, 41, 167, 148, 228, 82, 193, 179, 162, 234, 146, 231, - 242, 20, 85, 120, 3, 203, 50, 40, 196, 5, 142, 60, 215, 26, 183, 134, - 151, 24, 3, 55, 123, 96, 245, 71, 176, 83, 140, 56, 156, 168, 86, 47, - 138, 131, 62, 5, 175, 162, 235, 209, 84, 92, 54, 0, 93, 21, 40, 119, - 217, 238, 69, 69, 194, 90, 73, 245, 253, 209, 97, 216, 139, 92, 29, 164, - 188, 253, 81, 241, 144, 139, 98, 59, 83, 32, 206, 202, 145, 135, 148, 131, - 234, 112, 237, 74, 133, 254, 136, 249, 114, 85, 135, 221, 156, 14, 174, 164, - 61, 20, 147, 191, 229, 114, 81, 162, 144, 91, 254, 86, 42, 136, 66, 102, - 49, 97, 142, 42, 244, 32, 14, 169, 30, 6, 133, 142, 112, 169, 92, 210, - 140, 30, 156, 228, 233, 143, 92, 29, 193, 214, 208, 181, 29, 70, 66, 186, - 246, 251, 83, 195, 130, 134, 248, 59, 52, 227, 112, 190, 187, 75, 124, 173, - 206, 212, 82, 146, 189, 169, 46, 110, 163, 241, 85, 143, 8, 255, 236, 115, - 26, 174, 89, 137, 229, 85, 190, 180, 9, 89, 78, 75, 221, 52, 118, 168, - 158, 199, 184, 154, 212, 171, 152, 182, 203, 240, 0, 35, 36, 113, 115, 161, - 87, 213, 207, 76, 113, 163, 97, 125, 155, 47, 112, 241, 245, 109, 7, 30, - 43, 115, 106, 211, 65, 50, 176, 167, 150, 30, 160, 86, 176, 243, 99, 229, - 186, 0, 205, 152, 186, 118, 245, 180, 174, 221, 157, 67, 75, 171, 207, 19, - 70, 79, 63, 28, 153, 134, 107, 197, 112, 97, 60, 24, 88, 45, 196, 139, - 144, 60, 115, 248, 89, 253, 213, 196, 180, 108, 205, 78, 91, 225, 27, 14, - 136, 172, 59, 114, 135, 108, 42, 229, 144, 230, 245, 144, 205, 39, 165, 117, - 60, 143, 121, 200, 194, 150, 128, 114, 42, 116, 105, 85, 72, 41, 120, 86, - 147, 195, 162, 76, 163, 18, 251, 174, 108, 53, 98, 168, 181, 100, 69, 38, - 166, 44, 183, 215, 118, 119, 64, 52, 169, 114, 216, 231, 178, 49, 44, 59, - 157, 164, 236, 23, 75, 18, 172, 218, 213, 221, 74, 237, 44, 121, 151, 241, - 227, 119, 153, 163, 111, 190, 225, 183, 153, 80, 94, 75, 124, 188, 150, 216, - 163, 1, 133, 253, 138, 51, 93, 193, 35, 26, 236, 92, 76, 237, 242, 77, - 107, 124, 5, 166, 125, 85, 172, 13, 130, 219, 90, 133, 241, 86, 135, 114, - 35, 27, 117, 71, 202, 168, 172, 254, 134, 172, 211, 196, 86, 158, 241, 18, - 192, 134, 5, 7, 215, 167, 1, 27, 229, 197, 81, 76, 180, 243, 96, 163, - 149, 12, 158, 254, 135, 202, 146, 220, 178, 115, 254, 68, 65, 147, 120, 229, - 254, 31, 16, 53, 249, 71, 10, 79, 110, 126, 53, 207, 160, 43, 55, 141, - 171, 190, 206, 179, 122, 122, 49, 222, 249, 174, 206, 47, 234, 38, 142, 171, - 11, 142, 51, 25, 57, 141, 152, 197, 211, 200, 164, 236, 26, 44, 158, 93, - 205, 226, 217, 53, 88, 60, 123, 217, 55, 247, 125, 243, 205, 93, 97, 161, - 7, 137, 170, 152, 40, 179, 230, 154, 248, 178, 158, 121, 136, 111, 164, 185, - 57, 187, 105, 110, 206, 222, 150, 135, 248, 253, 207, 145, 99, 17, 224, 223, - 45, 200, 178, 135, 183, 251, 253, 220, 26, 14, 121, 128, 36, 203, 255, 6, - 252, 241, 79, 33, 225, 242, 47, 244, 241, 112, 244, 113, 111, 177, 156, 127, - 2, 244, 113, 111, 153, 157, 88, 168, 242, 79, 71, 36, 44, 209, 147, 197, - 13, 27, 248, 189, 38, 90, 72, 229, 55, 100, 122, 246, 83, 50, 61, 251, - 183, 200, 244, 52, 254, 249, 100, 122, 246, 190, 176, 76, 79, 123, 54, 165, - 61, 68, 221, 83, 108, 228, 199, 158, 75, 191, 124, 205, 72, 70, 240, 152, - 130, 103, 171, 172, 144, 206, 93, 114, 62, 49, 187, 228, 243, 168, 96, 188, - 113, 111, 161, 130, 57, 105, 3, 21, 188, 73, 58, 233, 238, 222, 22, 136, - 136, 103, 113, 164, 184, 207, 183, 137, 37, 105, 194, 58, 248, 179, 8, 107, - 230, 113, 169, 201, 50, 101, 99, 246, 239, 43, 246, 180, 127, 155, 216, 211, - 254, 191, 196, 158, 62, 87, 236, 201, 213, 78, 10, 183, 108, 219, 141, 108, - 184, 221, 13, 108, 184, 221, 180, 240, 211, 189, 38, 152, 41, 165, 253, 219, - 132, 159, 246, 111, 17, 126, 26, 119, 47, 163, 9, 219, 29, 28, 13, 199, - 209, 101, 4, 27, 223, 167, 29, 24, 163, 28, 50, 215, 237, 236, 22, 90, - 201, 99, 210, 138, 173, 110, 153, 28, 139, 183, 170, 202, 132, 51, 49, 25, - 205, 198, 237, 174, 54, 220, 41, 78, 103, 98, 98, 199, 104, 76, 114, 232, - 151, 65, 120, 66, 144, 46, 97, 143, 220, 151, 175, 17, 164, 79, 250, 93, - 117, 110, 235, 142, 134, 94, 161, 53, 155, 142, 138, 15, 227, 117, 148, 215, - 192, 164, 36, 19, 173, 77, 240, 147, 115, 159, 31, 155, 98, 227, 155, 132, - 233, 125, 97, 24, 11, 95, 36, 48, 249, 34, 141, 213, 81, 76, 0, 100, - 236, 17, 37, 192, 52, 96, 232, 60, 23, 32, 174, 129, 142, 173, 113, 110, - 130, 222, 6, 79, 63, 169, 67, 91, 216, 39, 78, 77, 108, 168, 21, 136, - 220, 146, 179, 55, 182, 210, 169, 209, 119, 85, 76, 243, 3, 105, 167, 24, - 39, 6, 130, 119, 142, 206, 226, 76, 105, 244, 13, 55, 5, 194, 193, 16, - 244, 93, 173, 90, 140, 254, 80, 194, 192, 127, 150, 246, 20, 99, 80, 248, - 49, 156, 239, 183, 72, 207, 241, 138, 211, 26, 47, 232, 232, 27, 118, 34, - 228, 97, 227, 151, 97, 39, 26, 71, 237, 94, 191, 59, 133, 32, 67, 56, - 236, 206, 6, 173, 225, 144, 190, 131, 240, 170, 59, 142, 70, 157, 168, 77, - 129, 90, 40, 158, 93, 12, 65, 135, 47, 181, 166, 141, 25, 41, 176, 51, - 242, 219, 232, 90, 99, 93, 107, 242, 115, 211, 184, 182, 89, 190, 44, 115, - 3, 48, 203, 28, 120, 198, 10, 222, 188, 124, 239, 191, 118, 253, 44, 133, - 186, 46, 84, 238, 212, 14, 195, 218, 23, 88, 195, 183, 173, 223, 96, 251, - 10, 133, 199, 169, 224, 126, 235, 52, 147, 181, 124, 213, 131, 129, 227, 246, - 104, 60, 238, 246, 185, 79, 112, 59, 36, 43, 85, 124, 199, 163, 208, 242, - 55, 16, 108, 204, 134, 219, 184, 86, 217, 58, 115, 36, 110, 236, 237, 211, - 36, 164, 28, 79, 193, 66, 107, 171, 211, 233, 118, 12, 3, 109, 190, 231, - 29, 133, 148, 12, 26, 91, 12, 184, 177, 188, 168, 186, 92, 142, 134, 253, - 5, 45, 95, 186, 116, 210, 110, 106, 157, 247, 105, 133, 125, 228, 139, 232, - 106, 227, 245, 50, 105, 254, 115, 152, 197, 189, 180, 203, 155, 245, 14, 85, - 182, 217, 50, 86, 142, 145, 236, 118, 226, 85, 200, 38, 28, 48, 25, 180, - 216, 197, 21, 246, 249, 174, 209, 203, 216, 199, 149, 219, 176, 82, 160, 187, - 99, 45, 6, 6, 6, 77, 76, 186, 213, 216, 130, 119, 236, 91, 135, 245, - 26, 132, 31, 33, 23, 120, 37, 9, 80, 39, 210, 13, 66, 49, 60, 56, - 53, 86, 42, 44, 242, 49, 174, 17, 35, 25, 120, 240, 21, 121, 197, 194, - 224, 245, 153, 45, 54, 25, 211, 252, 236, 219, 224, 159, 90, 250, 192, 186, - 88, 7, 241, 165, 202, 44, 137, 165, 2, 139, 205, 236, 182, 167, 126, 4, - 175, 61, 134, 119, 40, 161, 27, 30, 57, 159, 231, 38, 42, 241, 252, 5, - 15, 48, 213, 53, 255, 95, 110, 77, 59, 224, 98, 251, 141, 230, 78, 10, - 196, 97, 141, 240, 199, 249, 79, 176, 58, 179, 134, 3, 143, 136, 97, 119, - 40, 84, 75, 204, 91, 7, 27, 10, 29, 175, 31, 122, 138, 224, 57, 10, - 21, 149, 68, 115, 211, 234, 83, 33, 216, 83, 164, 30, 21, 137, 12, 175, - 56, 181, 39, 28, 237, 167, 162, 203, 28, 45, 238, 202, 243, 133, 168, 226, - 160, 96, 145, 232, 112, 228, 84, 161, 188, 184, 149, 241, 161, 58, 16, 164, - 85, 7, 196, 101, 24, 237, 99, 188, 10, 59, 212, 209, 119, 184, 2, 136, - 80, 174, 38, 230, 132, 114, 186, 79, 167, 203, 71, 33, 250, 97, 246, 111, - 245, 169, 141, 210, 204, 129, 83, 78, 55, 135, 71, 166, 247, 187, 216, 0, - 100, 22, 169, 212, 128, 167, 155, 134, 153, 231, 128, 233, 176, 249, 20, 12, - 55, 69, 148, 45, 226, 64, 107, 78, 219, 103, 174, 254, 46, 212, 223, 15, - 44, 226, 215, 26, 78, 35, 66, 133, 173, 201, 38, 201, 62, 89, 203, 181, - 239, 238, 135, 78, 232, 56, 154, 116, 233, 138, 2, 155, 145, 89, 212, 146, - 151, 46, 128, 46, 147, 78, 40, 140, 34, 61, 161, 41, 195, 219, 50, 140, - 65, 79, 193, 252, 25, 180, 166, 189, 46, 228, 231, 224, 12, 160, 59, 191, - 130, 201, 77, 28, 115, 46, 157, 20, 87, 250, 1, 122, 104, 231, 231, 170, - 150, 69, 254, 118, 206, 80, 138, 39, 20, 131, 41, 140, 97, 20, 214, 226, - 142, 205, 69, 194, 79, 58, 105, 124, 127, 136, 145, 96, 10, 104, 91, 209, - 223, 121, 127, 54, 182, 27, 233, 25, 123, 154, 182, 221, 158, 153, 205, 12, - 167, 200, 79, 56, 69, 62, 77, 175, 121, 216, 6, 97, 109, 155, 106, 23, - 45, 193, 172, 124, 191, 72, 9, 106, 187, 213, 34, 143, 235, 10, 99, 40, - 139, 181, 238, 152, 233, 181, 167, 56, 141, 179, 156, 96, 78, 27, 157, 65, - 201, 48, 98, 2, 26, 85, 0, 116, 80, 38, 115, 157, 134, 75, 23, 155, - 248, 57, 110, 131, 115, 59, 107, 210, 143, 96, 29, 221, 139, 189, 77, 166, - 93, 20, 214, 172, 209, 197, 5, 225, 247, 172, 195, 44, 60, 182, 57, 148, - 180, 114, 245, 215, 134, 199, 186, 248, 100, 52, 134, 151, 56, 75, 184, 251, - 253, 78, 232, 85, 246, 218, 232, 212, 243, 169, 96, 35, 29, 220, 205, 91, - 177, 31, 202, 15, 22, 17, 148, 131, 217, 148, 200, 145, 15, 243, 69, 27, - 168, 181, 70, 189, 132, 31, 50, 241, 222, 91, 241, 99, 116, 218, 131, 248, - 216, 148, 208, 203, 242, 47, 30, 16, 43, 83, 26, 192, 99, 124, 235, 246, - 244, 61, 179, 106, 149, 197, 251, 23, 3, 91, 243, 6, 228, 65, 144, 16, - 8, 159, 162, 132, 66, 78, 66, 213, 12, 51, 176, 22, 97, 140, 182, 157, - 154, 53, 55, 66, 129, 213, 191, 161, 172, 17, 93, 114, 237, 126, 143, 191, - 122, 132, 183, 1, 6, 90, 167, 195, 110, 173, 115, 234, 68, 103, 118, 58, - 226, 228, 204, 30, 171, 191, 206, 18, 157, 142, 104, 52, 251, 158, 221, 230, - 220, 46, 226, 203, 241, 167, 53, 119, 162, 208, 153, 219, 11, 252, 89, 216, - 115, 186, 11, 247, 111, 152, 211, 32, 210, 27, 11, 68, 244, 228, 59, 121, - 199, 52, 252, 75, 58, 39, 210, 218, 145, 110, 237, 136, 102, 154, 154, 219, - 41, 16, 194, 7, 243, 165, 92, 142, 147, 231, 72, 116, 150, 11, 252, 81, - 32, 67, 98, 197, 57, 17, 191, 160, 181, 142, 120, 64, 219, 179, 34, 232, - 155, 192, 99, 92, 80, 18, 139, 223, 56, 232, 48, 31, 37, 202, 99, 7, - 246, 31, 244, 135, 111, 42, 234, 246, 199, 120, 60, 224, 153, 192, 36, 200, - 18, 109, 129, 44, 20, 239, 0, 114, 224, 86, 197, 111, 178, 240, 74, 232, - 127, 34, 39, 245, 49, 64, 35, 188, 25, 66, 238, 162, 201, 136, 163, 75, - 213, 219, 13, 79, 4, 78, 226, 206, 128, 213, 64, 127, 122, 186, 55, 95, - 161, 27, 180, 217, 98, 150, 5, 252, 171, 87, 124, 62, 178, 79, 125, 118, - 164, 186, 244, 112, 110, 99, 15, 133, 106, 22, 18, 173, 144, 228, 24, 98, - 254, 112, 160, 31, 200, 152, 103, 108, 188, 180, 172, 43, 74, 125, 250, 83, - 74, 140, 91, 127, 198, 162, 191, 229, 117, 68, 116, 126, 82, 175, 173, 124, - 172, 18, 5, 218, 109, 181, 21, 139, 59, 65, 213, 223, 51, 115, 26, 168, - 42, 97, 75, 79, 112, 242, 220, 116, 251, 125, 252, 101, 198, 180, 198, 123, - 42, 89, 159, 81, 186, 19, 15, 208, 222, 146, 230, 175, 134, 151, 247, 120, - 115, 144, 83, 38, 245, 236, 80, 181, 210, 32, 255, 82, 246, 1, 147, 247, - 5, 63, 121, 95, 240, 227, 115, 35, 8, 115, 113, 199, 13, 175, 33, 50, - 23, 27, 159, 10, 82, 211, 32, 80, 51, 20, 174, 238, 80, 242, 101, 111, - 19, 198, 179, 64, 67, 115, 255, 19, 21, 219, 201, 116, 116, 117, 209, 111, - 209, 141, 132, 86, 49, 235, 100, 69, 34, 17, 158, 136, 216, 17, 246, 131, - 73, 239, 88, 134, 0, 10, 107, 193, 59, 88, 16, 20, 178, 141, 54, 206, - 93, 6, 90, 50, 214, 250, 68, 45, 77, 183, 204, 18, 159, 138, 243, 110, - 68, 242, 62, 81, 60, 190, 71, 142, 78, 208, 124, 62, 205, 219, 171, 43, - 42, 82, 166, 96, 101, 236, 169, 103, 74, 119, 112, 24, 241, 145, 251, 253, - 108, 200, 150, 226, 99, 23, 33, 125, 104, 188, 17, 201, 199, 236, 87, 183, - 73, 144, 157, 128, 165, 208, 20, 207, 240, 231, 179, 233, 116, 52, 244, 211, - 193, 0, 110, 65, 146, 53, 170, 94, 7, 91, 67, 85, 217, 249, 104, 206, - 32, 103, 182, 38, 54, 202, 108, 210, 29, 231, 105, 153, 247, 70, 116, 16, - 103, 222, 22, 149, 234, 162, 204, 108, 4, 141, 70, 195, 31, 15, 252, 74, - 224, 9, 49, 130, 3, 86, 245, 124, 71, 212, 66, 27, 135, 44, 213, 59, - 101, 247, 59, 170, 201, 91, 54, 141, 176, 234, 229, 9, 196, 126, 129, 2, - 103, 106, 51, 168, 209, 134, 191, 244, 208, 244, 36, 53, 134, 42, 172, 36, - 41, 232, 36, 38, 191, 79, 127, 200, 45, 127, 175, 61, 253, 125, 149, 75, - 42, 19, 151, 30, 27, 235, 16, 55, 31, 63, 253, 251, 74, 147, 39, 161, - 80, 71, 202, 196, 126, 12, 59, 93, 64, 45, 232, 152, 32, 146, 135, 1, - 121, 44, 83, 157, 21, 67, 154, 236, 40, 135, 103, 3, 59, 97, 9, 186, - 96, 5, 67, 224, 105, 19, 254, 219, 234, 127, 112, 181, 138, 148, 74, 198, - 96, 247, 71, 151, 163, 80, 238, 52, 252, 73, 171, 158, 50, 149, 251, 14, - 66, 102, 70, 57, 75, 164, 99, 236, 190, 207, 190, 26, 245, 23, 151, 52, - 135, 53, 62, 121, 124, 245, 243, 212, 248, 1, 175, 238, 220, 174, 17, 18, - 167, 179, 236, 137, 85, 86, 222, 71, 27, 240, 0, 77, 135, 80, 8, 199, - 164, 150, 170, 166, 106, 215, 221, 250, 222, 19, 183, 94, 163, 147, 172, 150, - 252, 221, 221, 125, 194, 241, 248, 75, 164, 142, 221, 142, 198, 237, 62, 42, - 161, 250, 247, 40, 46, 96, 247, 36, 229, 18, 110, 66, 96, 38, 86, 13, - 134, 130, 225, 241, 155, 90, 204, 215, 74, 133, 69, 165, 183, 19, 20, 243, - 86, 41, 230, 217, 216, 113, 201, 241, 53, 123, 233, 233, 140, 71, 87, 224, - 194, 224, 141, 188, 70, 199, 172, 111, 71, 236, 109, 213, 112, 111, 92, 115, - 3, 207, 19, 89, 87, 241, 137, 4, 192, 106, 79, 65, 120, 10, 9, 44, - 39, 108, 141, 47, 19, 138, 229, 49, 95, 134, 177, 249, 66, 103, 73, 41, - 32, 33, 107, 171, 21, 168, 89, 186, 244, 113, 130, 92, 6, 119, 65, 246, - 161, 118, 57, 133, 89, 6, 141, 61, 82, 248, 193, 62, 191, 185, 17, 236, - 157, 37, 147, 189, 72, 91, 149, 253, 160, 8, 217, 66, 100, 169, 75, 142, - 64, 231, 232, 153, 57, 196, 19, 138, 225, 27, 137, 171, 70, 75, 50, 179, - 8, 226, 142, 233, 49, 129, 152, 92, 239, 137, 104, 213, 80, 99, 159, 221, - 1, 174, 207, 149, 154, 231, 214, 60, 56, 57, 226, 5, 42, 254, 213, 219, - 130, 255, 55, 48, 212, 88, 78, 14, 110, 107, 9, 25, 136, 183, 72, 30, - 171, 1, 81, 111, 254, 189, 250, 231, 130, 250, 84, 217, 216, 31, 60, 94, - 50, 2, 118, 160, 202, 46, 132, 83, 57, 225, 155, 146, 200, 49, 36, 18, - 201, 76, 25, 107, 43, 245, 77, 5, 27, 158, 45, 233, 102, 188, 124, 7, - 146, 174, 202, 171, 70, 20, 209, 141, 165, 144, 196, 251, 113, 125, 50, 170, - 184, 103, 180, 90, 81, 168, 193, 21, 55, 164, 103, 47, 212, 63, 44, 72, - 33, 208, 165, 18, 140, 54, 48, 11, 127, 145, 225, 99, 0, 247, 239, 80, - 146, 179, 122, 71, 251, 60, 120, 238, 185, 52, 154, 238, 64, 12, 214, 42, - 3, 54, 78, 145, 111, 223, 4, 172, 106, 72, 82, 60, 19, 180, 42, 197, - 139, 107, 101, 211, 95, 169, 109, 102, 135, 226, 227, 24, 68, 41, 109, 203, - 196, 237, 28, 33, 167, 100, 175, 209, 50, 164, 171, 144, 45, 110, 144, 237, - 202, 41, 97, 5, 222, 240, 88, 215, 68, 194, 234, 160, 28, 219, 251, 238, - 190, 235, 233, 251, 229, 238, 138, 208, 195, 111, 226, 149, 132, 209, 95, 235, - 10, 172, 3, 117, 113, 226, 4, 8, 41, 88, 188, 67, 99, 117, 103, 222, - 159, 30, 239, 208, 228, 23, 46, 110, 203, 155, 178, 191, 11, 88, 148, 247, - 49, 158, 58, 122, 29, 187, 61, 193, 134, 19, 244, 178, 224, 189, 151, 244, - 184, 92, 85, 93, 173, 90, 247, 220, 28, 128, 95, 6, 172, 188, 227, 244, - 143, 29, 103, 72, 160, 155, 202, 32, 82, 247, 204, 113, 42, 199, 174, 179, - 9, 15, 23, 184, 74, 16, 122, 5, 239, 128, 175, 25, 28, 24, 235, 81, - 192, 135, 88, 45, 113, 224, 66, 215, 85, 112, 73, 105, 235, 95, 175, 121, - 131, 238, 68, 147, 118, 107, 220, 97, 119, 46, 4, 26, 66, 30, 106, 203, - 225, 6, 101, 186, 235, 134, 104, 173, 46, 110, 184, 31, 213, 200, 163, 82, - 195, 197, 115, 238, 133, 248, 138, 10, 206, 145, 235, 209, 133, 110, 97, 132, - 125, 118, 59, 19, 239, 1, 103, 238, 185, 206, 2, 44, 199, 185, 87, 214, - 158, 93, 40, 180, 224, 80, 143, 67, 180, 172, 153, 183, 38, 139, 41, 25, - 143, 70, 89, 79, 153, 165, 247, 104, 9, 149, 173, 21, 115, 100, 66, 231, - 40, 22, 149, 144, 82, 134, 170, 6, 50, 20, 87, 162, 90, 175, 77, 53, - 215, 77, 83, 205, 142, 151, 39, 218, 141, 198, 60, 154, 178, 192, 85, 86, - 14, 11, 36, 80, 66, 105, 176, 104, 135, 102, 153, 137, 211, 236, 199, 97, - 88, 227, 235, 26, 53, 67, 164, 81, 251, 61, 37, 84, 216, 14, 181, 57, - 127, 174, 114, 43, 165, 114, 192, 1, 145, 149, 64, 78, 197, 102, 224, 167, - 99, 65, 106, 78, 122, 167, 58, 124, 102, 239, 185, 79, 173, 63, 228, 37, - 78, 32, 202, 43, 84, 41, 68, 232, 222, 101, 154, 208, 209, 153, 54, 226, - 104, 221, 136, 142, 56, 35, 140, 181, 187, 161, 21, 72, 198, 48, 84, 141, - 147, 28, 178, 47, 16, 17, 196, 49, 3, 122, 212, 154, 15, 66, 154, 32, - 228, 114, 231, 212, 90, 18, 90, 172, 236, 115, 10, 233, 224, 249, 234, 27, - 58, 126, 136, 132, 36, 80, 22, 156, 249, 128, 90, 25, 80, 101, 177, 123, - 247, 243, 129, 144, 224, 96, 13, 39, 208, 93, 34, 136, 55, 1, 53, 98, - 157, 235, 17, 226, 85, 1, 3, 206, 49, 139, 51, 212, 177, 230, 60, 73, - 29, 143, 146, 166, 146, 146, 233, 136, 48, 84, 205, 202, 98, 139, 229, 43, - 100, 36, 47, 222, 190, 253, 233, 87, 17, 67, 72, 218, 91, 38, 240, 45, - 251, 197, 39, 194, 35, 136, 37, 17, 84, 211, 102, 5, 44, 217, 176, 177, - 124, 37, 46, 95, 78, 34, 229, 26, 146, 169, 207, 92, 0, 90, 32, 66, - 154, 120, 117, 242, 203, 43, 72, 70, 232, 1, 197, 57, 147, 17, 197, 190, - 78, 184, 68, 226, 226, 68, 85, 0, 63, 86, 106, 250, 129, 60, 6, 246, - 204, 214, 224, 17, 188, 101, 88, 195, 29, 95, 66, 101, 130, 5, 42, 233, - 219, 103, 39, 135, 248, 58, 49, 94, 100, 153, 129, 136, 11, 198, 176, 2, - 231, 122, 227, 203, 25, 222, 152, 215, 61, 28, 196, 41, 253, 104, 50, 165, - 11, 3, 215, 157, 190, 70, 251, 234, 158, 236, 23, 143, 60, 121, 86, 100, - 26, 15, 61, 100, 138, 206, 47, 35, 109, 101, 250, 120, 215, 242, 171, 207, - 104, 5, 142, 35, 60, 202, 137, 235, 70, 221, 90, 83, 58, 29, 7, 147, - 158, 127, 175, 25, 19, 17, 174, 82, 167, 62, 101, 59, 57, 115, 153, 255, - 157, 79, 213, 229, 68, 97, 92, 60, 202, 167, 101, 50, 117, 70, 155, 239, - 185, 147, 222, 104, 214, 239, 128, 67, 113, 217, 31, 157, 183, 250, 96, 104, - 14, 90, 239, 161, 152, 79, 215, 29, 109, 55, 158, 46, 104, 23, 179, 190, - 93, 136, 170, 132, 78, 217, 95, 227, 196, 62, 231, 91, 33, 132, 24, 199, - 147, 246, 104, 220, 45, 50, 128, 100, 100, 41, 64, 128, 206, 101, 61, 10, - 225, 204, 45, 87, 182, 227, 11, 178, 85, 84, 111, 80, 22, 164, 154, 150, - 238, 135, 176, 69, 27, 84, 119, 123, 52, 26, 119, 38, 12, 46, 186, 243, - 249, 46, 255, 225, 107, 170, 253, 145, 115, 101, 103, 150, 11, 224, 101, 184, - 59, 177, 11, 132, 67, 8, 245, 127, 240, 220, 185, 239, 46, 124, 247, 3, - 77, 152, 154, 103, 221, 128, 248, 102, 109, 107, 56, 92, 117, 199, 132, 124, - 7, 98, 251, 4, 249, 160, 119, 57, 73, 86, 199, 189, 222, 65, 241, 118, - 65, 213, 231, 173, 245, 81, 196, 238, 34, 145, 36, 198, 114, 240, 56, 64, - 129, 112, 121, 154, 7, 66, 203, 159, 133, 161, 20, 95, 165, 196, 1, 105, - 103, 118, 248, 121, 107, 214, 5, 226, 162, 99, 25, 167, 177, 219, 225, 221, - 88, 166, 107, 19, 160, 202, 201, 43, 147, 82, 192, 217, 217, 212, 253, 112, - 84, 91, 16, 233, 241, 113, 1, 132, 87, 111, 41, 148, 41, 195, 72, 220, - 185, 169, 220, 8, 222, 118, 122, 21, 234, 194, 7, 214, 93, 174, 116, 86, - 140, 148, 203, 219, 171, 181, 230, 126, 200, 231, 45, 136, 7, 123, 129, 0, - 29, 183, 172, 88, 253, 1, 129, 15, 94, 185, 195, 171, 130, 170, 153, 197, - 39, 52, 69, 19, 214, 247, 233, 155, 126, 62, 248, 150, 152, 232, 85, 109, - 120, 4, 188, 120, 206, 156, 82, 146, 224, 199, 80, 45, 197, 25, 212, 180, - 192, 192, 206, 110, 61, 128, 46, 231, 51, 59, 39, 33, 200, 118, 70, 195, - 203, 156, 49, 115, 48, 227, 99, 95, 70, 215, 221, 161, 42, 81, 233, 14, - 17, 215, 177, 37, 175, 200, 22, 15, 187, 55, 253, 5, 237, 188, 9, 29, - 203, 122, 1, 216, 180, 116, 176, 44, 112, 233, 83, 43, 68, 144, 69, 202, - 141, 176, 198, 35, 170, 182, 193, 140, 214, 19, 203, 65, 159, 131, 83, 120, - 169, 222, 25, 58, 74, 120, 33, 118, 170, 65, 221, 14, 164, 63, 180, 135, - 205, 161, 240, 254, 82, 17, 51, 58, 238, 199, 204, 207, 162, 205, 72, 93, - 139, 148, 44, 67, 178, 147, 82, 25, 191, 56, 24, 252, 74, 123, 212, 159, - 13, 134, 127, 2, 60, 120, 4, 107, 16, 81, 227, 98, 152, 120, 86, 151, - 214, 178, 157, 179, 122, 45, 34, 167, 181, 30, 102, 208, 216, 45, 104, 85, - 98, 104, 103, 54, 243, 47, 242, 240, 67, 26, 54, 243, 255, 157, 87, 78, - 72, 81, 224, 244, 61, 180, 42, 223, 67, 114, 152, 114, 164, 75, 180, 116, - 137, 15, 219, 74, 180, 242, 68, 237, 5, 187, 233, 98, 158, 46, 246, 116, - 91, 49, 15, 197, 26, 1, 21, 227, 148, 102, 190, 156, 71, 162, 10, 84, - 56, 176, 27, 196, 169, 59, 102, 106, 83, 82, 107, 7, 22, 123, 92, 5, - 207, 231, 236, 192, 194, 147, 42, 193, 22, 81, 120, 59, 40, 76, 160, 124, - 138, 215, 222, 231, 5, 34, 103, 57, 234, 49, 171, 202, 78, 38, 165, 218, - 78, 29, 94, 25, 39, 167, 147, 9, 209, 187, 33, 117, 52, 204, 23, 227, - 152, 64, 199, 176, 49, 131, 3, 107, 212, 17, 221, 85, 30, 224, 104, 34, - 202, 220, 163, 201, 161, 106, 198, 181, 218, 190, 238, 220, 228, 116, 52, 41, - 151, 207, 208, 157, 96, 67, 92, 109, 67, 92, 125, 61, 46, 58, 69, 79, - 71, 29, 209, 119, 45, 180, 253, 195, 195, 160, 72, 104, 191, 208, 14, 142, - 142, 234, 197, 181, 12, 20, 255, 141, 223, 40, 30, 30, 214, 37, 87, 237, - 232, 40, 216, 148, 171, 246, 77, 141, 50, 237, 34, 83, 187, 126, 96, 21, - 161, 183, 137, 151, 246, 220, 233, 108, 136, 115, 177, 115, 150, 179, 210, 27, - 72, 185, 58, 6, 131, 24, 10, 102, 61, 183, 153, 58, 113, 155, 4, 18, - 250, 233, 211, 105, 184, 137, 208, 136, 107, 128, 81, 16, 225, 124, 115, 37, - 34, 195, 126, 69, 151, 201, 136, 142, 84, 41, 111, 247, 71, 109, 145, 32, - 138, 107, 250, 181, 215, 53, 157, 166, 229, 183, 53, 157, 151, 173, 180, 229, - 132, 142, 171, 43, 168, 179, 62, 38, 5, 90, 109, 86, 223, 192, 39, 63, - 112, 182, 91, 253, 62, 203, 236, 43, 134, 114, 81, 54, 155, 130, 65, 204, - 232, 159, 13, 193, 185, 149, 51, 12, 210, 229, 133, 101, 14, 75, 48, 135, - 11, 162, 60, 45, 217, 79, 3, 183, 190, 103, 79, 236, 50, 253, 97, 194, - 53, 10, 195, 250, 222, 10, 151, 94, 219, 9, 96, 195, 141, 40, 132, 92, - 206, 80, 171, 246, 17, 131, 120, 74, 206, 9, 207, 83, 223, 201, 23, 73, - 10, 136, 210, 233, 74, 4, 82, 237, 12, 13, 120, 30, 65, 6, 136, 126, - 67, 220, 141, 168, 52, 63, 197, 210, 126, 67, 40, 199, 124, 20, 146, 124, - 120, 131, 232, 94, 194, 193, 41, 63, 70, 208, 156, 69, 176, 130, 54, 109, - 245, 33, 62, 208, 134, 163, 115, 218, 186, 221, 121, 75, 5, 68, 184, 71, - 208, 23, 141, 149, 182, 21, 225, 51, 158, 53, 34, 9, 184, 3, 140, 143, - 96, 99, 207, 89, 82, 56, 160, 175, 119, 4, 180, 223, 60, 69, 11, 102, - 237, 210, 165, 187, 145, 99, 202, 232, 157, 13, 242, 241, 241, 145, 95, 116, - 115, 57, 119, 66, 116, 113, 158, 107, 200, 131, 74, 227, 206, 193, 34, 219, - 146, 170, 14, 40, 68, 213, 211, 215, 42, 151, 119, 45, 221, 73, 74, 165, - 79, 248, 204, 52, 187, 174, 203, 80, 92, 92, 198, 28, 143, 78, 167, 96, - 156, 94, 205, 37, 192, 197, 88, 110, 1, 112, 108, 205, 240, 62, 32, 214, - 125, 218, 4, 67, 105, 71, 57, 131, 135, 113, 192, 166, 227, 177, 20, 151, - 109, 112, 80, 57, 68, 137, 112, 39, 173, 115, 8, 236, 156, 163, 114, 224, - 10, 196, 21, 113, 73, 132, 6, 124, 77, 51, 85, 145, 212, 15, 131, 131, - 75, 26, 43, 187, 249, 110, 211, 50, 231, 54, 242, 171, 34, 232, 178, 97, - 247, 178, 5, 217, 148, 80, 88, 68, 224, 70, 209, 2, 110, 176, 57, 66, - 197, 173, 49, 115, 137, 156, 55, 225, 17, 186, 162, 71, 71, 97, 125, 159, - 31, 204, 14, 195, 250, 83, 183, 16, 85, 234, 251, 197, 82, 240, 27, 8, - 183, 202, 188, 232, 14, 91, 67, 194, 58, 180, 162, 113, 157, 55, 42, 97, - 51, 6, 197, 210, 50, 154, 208, 173, 7, 244, 17, 188, 206, 67, 152, 165, - 9, 71, 153, 2, 16, 194, 247, 21, 106, 221, 62, 129, 91, 231, 214, 149, - 221, 76, 229, 209, 169, 145, 122, 160, 45, 248, 94, 17, 59, 78, 232, 169, - 108, 117, 106, 87, 54, 243, 143, 243, 114, 255, 237, 29, 54, 228, 197, 169, - 240, 8, 30, 180, 11, 167, 203, 223, 86, 103, 110, 254, 241, 95, 46, 103, - 81, 222, 109, 40, 121, 247, 76, 26, 205, 253, 214, 180, 155, 238, 57, 210, - 138, 76, 238, 73, 111, 148, 115, 106, 171, 95, 101, 228, 80, 11, 220, 90, - 195, 86, 30, 10, 88, 115, 222, 195, 147, 3, 163, 9, 222, 221, 154, 174, - 171, 218, 53, 145, 174, 122, 116, 147, 174, 13, 188, 118, 115, 96, 77, 94, - 140, 119, 195, 10, 249, 30, 0, 47, 85, 237, 26, 204, 182, 65, 131, 192, - 88, 136, 78, 27, 103, 143, 40, 175, 157, 231, 213, 160, 66, 207, 242, 197, - 220, 159, 10, 16, 154, 189, 123, 1, 132, 242, 61, 4, 32, 82, 237, 93, - 0, 81, 75, 231, 43, 15, 88, 80, 144, 160, 39, 133, 89, 238, 62, 0, - 52, 10, 218, 132, 158, 4, 115, 185, 250, 36, 184, 239, 1, 32, 136, 37, - 139, 226, 51, 13, 221, 3, 199, 43, 196, 169, 17, 50, 5, 245, 25, 66, - 56, 61, 247, 206, 202, 109, 60, 5, 116, 134, 91, 144, 190, 202, 178, 29, - 235, 171, 12, 49, 218, 87, 41, 183, 193, 53, 131, 247, 169, 205, 205, 144, - 5, 165, 179, 17, 112, 12, 55, 105, 133, 145, 62, 161, 198, 223, 79, 185, - 39, 103, 191, 155, 12, 20, 5, 138, 7, 244, 229, 94, 179, 188, 113, 26, - 131, 228, 44, 255, 242, 103, 80, 50, 16, 97, 42, 197, 60, 37, 144, 233, - 68, 252, 216, 227, 112, 217, 58, 159, 48, 7, 9, 162, 11, 136, 93, 58, - 227, 39, 193, 138, 235, 24, 43, 19, 80, 99, 152, 23, 81, 98, 4, 206, - 216, 154, 217, 198, 194, 130, 77, 141, 162, 91, 161, 181, 197, 101, 12, 8, - 210, 66, 248, 114, 16, 52, 87, 218, 70, 48, 114, 107, 95, 17, 140, 50, - 154, 251, 131, 209, 89, 86, 116, 185, 38, 64, 234, 239, 174, 178, 64, 245, - 119, 239, 13, 213, 184, 42, 240, 40, 102, 48, 50, 168, 35, 124, 142, 240, - 147, 136, 128, 35, 130, 36, 162, 198, 17, 181, 36, 162, 206, 17, 245, 36, - 162, 193, 17, 141, 36, 98, 151, 35, 118, 147, 136, 61, 142, 216, 75, 34, - 246, 57, 98, 63, 137, 120, 202, 17, 79, 141, 142, 73, 87, 91, 70, 140, - 244, 245, 220, 136, 145, 206, 182, 141, 24, 233, 109, 199, 136, 145, 238, 118, - 141, 24, 233, 239, 133, 177, 214, 8, 47, 125, 185, 181, 38, 40, 111, 227, - 42, 227, 118, 190, 226, 42, 147, 113, 60, 108, 179, 238, 103, 215, 213, 254, - 3, 55, 43, 27, 43, 83, 220, 207, 77, 119, 75, 164, 143, 192, 246, 89, - 103, 96, 115, 153, 170, 165, 106, 200, 246, 91, 195, 201, 143, 121, 179, 248, - 154, 148, 68, 120, 30, 76, 197, 44, 16, 180, 217, 243, 243, 209, 144, 174, - 140, 232, 199, 73, 90, 127, 47, 238, 212, 201, 180, 103, 15, 103, 131, 115, - 186, 206, 170, 94, 125, 31, 151, 210, 34, 194, 120, 213, 73, 106, 50, 173, - 0, 49, 89, 76, 228, 137, 127, 64, 180, 241, 201, 97, 224, 158, 184, 116, - 201, 45, 12, 195, 147, 131, 239, 189, 208, 59, 248, 222, 15, 125, 119, 24, - 14, 137, 82, 254, 62, 8, 191, 247, 202, 223, 251, 72, 192, 111, 63, 252, - 30, 146, 13, 134, 133, 246, 230, 224, 90, 93, 220, 249, 182, 60, 25, 183, - 221, 56, 0, 29, 34, 163, 251, 114, 69, 31, 219, 131, 209, 117, 87, 223, - 211, 249, 66, 220, 138, 47, 229, 0, 18, 236, 178, 15, 197, 44, 65, 18, - 29, 136, 25, 117, 110, 205, 80, 149, 191, 238, 26, 130, 110, 84, 48, 46, - 0, 145, 28, 165, 137, 4, 1, 180, 101, 133, 174, 0, 242, 248, 55, 89, - 217, 115, 59, 199, 125, 96, 182, 94, 206, 9, 228, 49, 26, 177, 215, 73, - 28, 81, 71, 230, 164, 80, 219, 99, 58, 207, 179, 179, 209, 130, 53, 174, - 14, 141, 33, 150, 109, 3, 247, 102, 130, 37, 67, 39, 176, 178, 40, 65, - 167, 95, 167, 53, 109, 169, 33, 160, 128, 34, 21, 59, 163, 184, 28, 112, - 38, 152, 22, 48, 154, 181, 2, 233, 231, 52, 175, 162, 142, 82, 139, 153, - 21, 60, 247, 41, 193, 253, 11, 6, 213, 171, 144, 19, 27, 196, 152, 25, - 223, 217, 129, 15, 140, 41, 54, 56, 154, 253, 238, 84, 79, 164, 30, 219, - 192, 152, 158, 183, 221, 65, 106, 130, 100, 62, 172, 181, 249, 176, 196, 36, - 32, 67, 190, 19, 209, 86, 222, 89, 94, 16, 142, 0, 79, 4, 223, 231, - 244, 221, 157, 79, 241, 57, 95, 9, 81, 74, 52, 50, 184, 23, 177, 74, - 174, 67, 197, 240, 82, 139, 232, 118, 199, 126, 151, 203, 33, 38, 247, 238, - 221, 59, 185, 49, 165, 60, 178, 57, 84, 153, 202, 236, 44, 233, 247, 42, - 215, 233, 246, 185, 12, 90, 172, 34, 57, 71, 33, 89, 20, 91, 114, 113, - 6, 170, 116, 110, 59, 148, 38, 164, 54, 173, 31, 26, 126, 229, 66, 155, - 227, 23, 201, 47, 19, 144, 6, 151, 75, 89, 64, 225, 61, 236, 235, 143, - 64, 222, 211, 36, 176, 246, 164, 214, 74, 234, 144, 28, 176, 56, 146, 214, - 111, 36, 128, 66, 96, 95, 38, 195, 228, 39, 177, 0, 94, 71, 222, 80, - 86, 185, 68, 32, 237, 177, 226, 8, 1, 246, 50, 10, 232, 50, 84, 88, - 10, 33, 158, 19, 194, 22, 23, 43, 154, 134, 88, 192, 232, 102, 197, 152, - 117, 213, 100, 164, 27, 237, 208, 69, 157, 254, 21, 159, 248, 222, 202, 140, - 201, 70, 100, 194, 233, 160, 10, 225, 183, 165, 4, 237, 43, 74, 30, 61, - 158, 185, 101, 158, 86, 64, 126, 85, 92, 241, 3, 224, 170, 74, 33, 195, - 215, 90, 26, 214, 120, 12, 106, 66, 219, 202, 197, 174, 2, 91, 174, 92, - 220, 132, 74, 193, 63, 7, 18, 189, 208, 154, 18, 59, 216, 191, 179, 115, - 97, 249, 77, 178, 38, 96, 80, 153, 161, 66, 131, 96, 172, 41, 211, 189, - 166, 3, 115, 214, 234, 179, 179, 247, 65, 107, 218, 102, 27, 50, 202, 94, - 150, 81, 8, 189, 138, 11, 65, 251, 85, 218, 102, 253, 53, 168, 191, 234, - 166, 85, 68, 160, 210, 203, 182, 78, 88, 37, 149, 189, 232, 116, 236, 124, - 141, 113, 159, 170, 119, 58, 138, 149, 56, 102, 253, 62, 119, 24, 7, 252, - 100, 218, 109, 117, 244, 64, 135, 98, 92, 132, 234, 223, 254, 194, 134, 218, - 194, 70, 252, 188, 121, 17, 77, 217, 222, 99, 243, 6, 192, 28, 68, 67, - 218, 190, 157, 105, 15, 134, 117, 155, 68, 56, 92, 246, 166, 174, 78, 95, - 95, 184, 193, 119, 204, 43, 183, 243, 82, 70, 242, 231, 113, 78, 227, 185, - 117, 66, 87, 132, 75, 162, 67, 240, 84, 72, 152, 123, 83, 221, 114, 151, - 234, 181, 38, 153, 35, 248, 102, 167, 103, 115, 179, 88, 1, 70, 7, 53, - 226, 95, 58, 181, 146, 19, 28, 57, 194, 246, 228, 163, 25, 17, 197, 149, - 171, 177, 254, 12, 122, 173, 146, 226, 239, 192, 222, 102, 22, 241, 43, 147, - 32, 52, 28, 179, 243, 46, 29, 110, 87, 224, 83, 83, 31, 153, 236, 194, - 248, 78, 159, 156, 81, 68, 107, 110, 70, 108, 90, 115, 249, 168, 211, 109, - 245, 243, 2, 147, 95, 231, 127, 21, 121, 148, 216, 72, 16, 81, 101, 67, - 60, 11, 209, 76, 118, 18, 9, 97, 121, 0, 74, 57, 79, 224, 242, 208, - 10, 226, 30, 222, 34, 198, 203, 125, 21, 205, 41, 179, 191, 161, 31, 236, - 107, 113, 94, 163, 215, 225, 126, 227, 9, 187, 45, 73, 134, 110, 144, 15, - 190, 86, 242, 244, 181, 146, 167, 97, 239, 188, 142, 42, 99, 173, 249, 6, - 106, 90, 169, 167, 123, 253, 118, 148, 152, 122, 46, 208, 101, 148, 45, 107, - 206, 134, 227, 238, 69, 1, 170, 111, 87, 237, 105, 241, 192, 86, 95, 225, - 105, 254, 49, 101, 201, 159, 197, 49, 167, 252, 20, 162, 51, 194, 138, 38, - 63, 161, 60, 193, 107, 146, 188, 203, 204, 96, 46, 119, 89, 114, 103, 171, - 156, 142, 186, 86, 81, 215, 136, 26, 224, 89, 69, 217, 18, 78, 58, 226, - 212, 139, 207, 79, 237, 153, 123, 109, 159, 149, 156, 250, 179, 83, 200, 190, - 59, 117, 27, 86, 59, 143, 55, 23, 104, 24, 5, 26, 40, 208, 112, 157, - 6, 23, 224, 183, 34, 44, 42, 90, 97, 103, 7, 150, 83, 59, 242, 159, - 23, 38, 101, 216, 114, 165, 68, 24, 192, 28, 224, 55, 197, 113, 70, 14, - 184, 147, 83, 255, 172, 196, 159, 59, 248, 37, 21, 81, 28, 242, 250, 113, - 94, 36, 149, 56, 102, 7, 191, 92, 254, 84, 121, 189, 179, 163, 99, 179, - 222, 227, 164, 222, 227, 245, 122, 145, 55, 83, 239, 113, 82, 239, 113, 170, - 94, 202, 2, 17, 87, 223, 229, 26, 185, 147, 170, 22, 35, 69, 247, 134, - 82, 4, 88, 147, 162, 249, 198, 115, 49, 26, 78, 241, 144, 152, 144, 131, - 175, 249, 133, 211, 22, 201, 114, 36, 219, 156, 190, 225, 133, 83, 22, 126, - 250, 157, 211, 49, 106, 140, 191, 12, 210, 35, 86, 46, 203, 214, 175, 104, - 66, 168, 41, 168, 211, 44, 104, 236, 114, 82, 184, 252, 93, 6, 83, 104, - 135, 206, 209, 65, 251, 40, 12, 106, 223, 124, 211, 62, 12, 131, 253, 231, - 181, 224, 89, 187, 88, 252, 93, 201, 14, 47, 127, 255, 221, 65, 137, 21, - 11, 252, 53, 180, 148, 165, 200, 182, 217, 31, 68, 220, 208, 254, 16, 107, - 75, 61, 178, 68, 63, 29, 178, 115, 204, 126, 134, 98, 90, 224, 121, 34, - 231, 248, 238, 157, 201, 93, 58, 90, 165, 243, 164, 100, 160, 233, 63, 235, - 15, 101, 149, 1, 214, 48, 89, 77, 170, 114, 122, 131, 231, 183, 30, 253, - 58, 91, 105, 237, 214, 42, 27, 225, 81, 146, 129, 232, 151, 72, 99, 114, - 21, 193, 190, 101, 202, 93, 218, 110, 98, 142, 31, 112, 10, 232, 110, 120, - 217, 51, 96, 249, 138, 95, 169, 5, 134, 90, 79, 154, 159, 170, 95, 86, - 38, 211, 69, 191, 171, 217, 77, 64, 98, 47, 95, 15, 46, 171, 61, 5, - 228, 120, 252, 144, 69, 134, 82, 63, 140, 120, 122, 238, 185, 97, 183, 8, - 170, 30, 102, 253, 121, 34, 175, 134, 3, 112, 198, 88, 225, 227, 87, 247, - 175, 225, 242, 244, 102, 7, 150, 167, 123, 202, 116, 254, 35, 117, 197, 250, - 149, 80, 117, 74, 250, 239, 251, 184, 131, 113, 53, 124, 98, 220, 140, 71, - 212, 187, 78, 52, 16, 131, 102, 19, 120, 58, 3, 228, 220, 142, 59, 57, - 91, 229, 138, 34, 255, 87, 190, 176, 115, 81, 24, 70, 3, 48, 149, 241, - 113, 156, 195, 219, 131, 48, 175, 232, 118, 57, 96, 74, 9, 164, 198, 241, - 32, 244, 236, 227, 99, 168, 179, 67, 32, 240, 56, 92, 94, 244, 71, 116, - 127, 42, 56, 199, 131, 178, 115, 124, 92, 100, 155, 225, 229, 152, 143, 59, - 6, 153, 29, 87, 229, 58, 199, 182, 88, 135, 222, 141, 197, 81, 151, 181, - 160, 18, 13, 86, 118, 68, 117, 69, 199, 50, 204, 232, 248, 208, 15, 118, - 87, 54, 181, 134, 18, 3, 184, 98, 146, 248, 35, 137, 63, 214, 241, 134, - 61, 233, 232, 248, 81, 136, 84, 235, 125, 21, 134, 109, 219, 189, 217, 240, - 61, 221, 147, 253, 50, 32, 214, 219, 217, 109, 52, 106, 187, 89, 139, 210, - 155, 39, 0, 166, 152, 126, 101, 211, 227, 191, 230, 92, 251, 175, 252, 245, - 87, 250, 58, 230, 175, 99, 250, 138, 71, 196, 49, 113, 136, 82, 226, 150, - 57, 37, 14, 229, 170, 177, 31, 39, 214, 139, 3, 43, 146, 72, 244, 156, - 11, 58, 253, 93, 46, 19, 159, 147, 120, 34, 163, 39, 246, 130, 214, 177, - 239, 27, 251, 73, 236, 169, 186, 209, 105, 79, 61, 171, 191, 123, 151, 255, - 230, 27, 4, 3, 230, 254, 83, 144, 77, 255, 79, 120, 221, 177, 127, 58, - 23, 114, 185, 18, 39, 186, 164, 108, 211, 90, 73, 61, 235, 152, 165, 148, - 36, 136, 242, 138, 21, 241, 104, 34, 59, 149, 225, 44, 234, 13, 220, 102, - 81, 196, 187, 28, 191, 96, 177, 144, 225, 225, 74, 178, 172, 14, 56, 149, - 10, 35, 195, 16, 25, 22, 204, 214, 103, 6, 123, 90, 155, 50, 6, 10, - 24, 38, 116, 236, 43, 246, 197, 163, 146, 240, 6, 118, 146, 12, 69, 150, - 228, 167, 44, 192, 182, 203, 188, 155, 95, 41, 73, 101, 91, 183, 98, 47, - 98, 54, 190, 146, 148, 53, 123, 61, 1, 11, 167, 109, 203, 81, 200, 178, - 28, 37, 249, 198, 141, 180, 137, 57, 167, 187, 193, 175, 171, 185, 179, 252, - 235, 42, 119, 202, 141, 228, 140, 206, 219, 68, 77, 182, 110, 158, 97, 81, - 84, 123, 46, 11, 131, 108, 180, 22, 123, 113, 53, 217, 68, 233, 24, 76, - 10, 218, 127, 34, 246, 166, 159, 189, 65, 248, 225, 41, 28, 84, 53, 91, - 112, 129, 237, 20, 182, 75, 88, 241, 65, 187, 113, 230, 104, 120, 49, 66, - 70, 72, 242, 46, 160, 137, 126, 221, 138, 250, 120, 85, 79, 206, 130, 255, - 16, 241, 57, 131, 90, 98, 190, 13, 16, 30, 31, 1, 55, 189, 68, 0, - 152, 197, 108, 134, 202, 15, 12, 238, 73, 87, 19, 117, 21, 79, 174, 135, - 240, 34, 135, 31, 48, 154, 96, 83, 236, 99, 69, 162, 48, 2, 37, 194, - 218, 153, 194, 209, 183, 206, 24, 27, 175, 224, 136, 225, 185, 104, 217, 237, - 80, 174, 162, 202, 132, 162, 161, 243, 209, 78, 101, 8, 217, 111, 51, 209, - 159, 186, 30, 43, 149, 12, 117, 92, 166, 80, 179, 133, 214, 107, 68, 31, - 8, 102, 51, 220, 152, 82, 23, 161, 203, 54, 180, 216, 91, 238, 249, 166, - 185, 249, 225, 229, 119, 118, 225, 146, 181, 204, 177, 52, 70, 131, 193, 8, - 112, 186, 142, 38, 35, 34, 203, 180, 162, 101, 75, 20, 155, 170, 150, 212, - 181, 73, 62, 83, 5, 2, 165, 25, 79, 244, 245, 163, 80, 137, 107, 54, - 81, 10, 138, 49, 5, 197, 188, 115, 249, 111, 162, 63, 179, 22, 45, 236, - 64, 110, 204, 26, 67, 227, 245, 137, 35, 166, 227, 156, 49, 223, 250, 144, - 244, 142, 181, 171, 199, 171, 152, 130, 15, 18, 15, 216, 194, 170, 54, 56, - 230, 119, 63, 81, 153, 236, 245, 123, 60, 83, 221, 231, 137, 42, 97, 200, - 139, 140, 2, 133, 239, 148, 81, 216, 208, 141, 181, 71, 172, 9, 184, 151, - 119, 63, 98, 105, 73, 133, 91, 164, 24, 226, 97, 104, 41, 134, 123, 203, - 40, 168, 177, 220, 5, 229, 117, 182, 243, 93, 112, 222, 250, 196, 17, 183, - 248, 149, 152, 207, 73, 253, 127, 134, 180, 66, 99, 207, 133, 176, 130, 43, - 209, 79, 247, 84, 180, 239, 5, 20, 191, 191, 199, 146, 11, 197, 146, 191, - 171, 69, 25, 238, 37, 197, 144, 76, 141, 146, 198, 52, 231, 38, 43, 139, - 168, 104, 239, 97, 247, 70, 209, 75, 254, 252, 100, 139, 104, 161, 112, 152, - 148, 207, 37, 67, 230, 68, 144, 172, 72, 51, 26, 77, 101, 68, 26, 101, - 234, 18, 161, 74, 28, 74, 16, 193, 165, 67, 11, 74, 86, 59, 202, 117, - 74, 201, 2, 151, 165, 137, 195, 165, 48, 199, 141, 112, 174, 193, 53, 7, - 184, 158, 207, 169, 104, 125, 255, 217, 156, 160, 115, 0, 77, 120, 202, 17, - 148, 22, 7, 70, 41, 136, 160, 5, 46, 37, 157, 1, 114, 96, 149, 172, - 39, 149, 233, 118, 146, 99, 37, 28, 227, 220, 66, 255, 228, 229, 117, 29, - 96, 247, 92, 202, 106, 207, 104, 135, 162, 198, 192, 165, 226, 88, 36, 153, - 182, 110, 124, 212, 60, 82, 166, 4, 253, 92, 81, 100, 180, 88, 155, 37, - 177, 190, 129, 133, 88, 138, 125, 116, 178, 101, 14, 34, 245, 54, 100, 36, - 248, 229, 175, 195, 168, 162, 87, 147, 75, 43, 168, 190, 95, 4, 107, 127, - 254, 36, 112, 175, 221, 107, 2, 72, 49, 15, 165, 160, 64, 248, 28, 55, - 160, 79, 149, 102, 144, 173, 93, 223, 84, 237, 185, 90, 198, 150, 72, 129, - 165, 77, 103, 65, 86, 150, 70, 148, 61, 70, 210, 59, 21, 235, 134, 245, - 199, 149, 172, 42, 43, 244, 222, 182, 56, 146, 245, 152, 216, 202, 78, 164, - 85, 213, 162, 99, 249, 113, 88, 71, 54, 80, 134, 125, 202, 234, 85, 103, - 85, 75, 117, 76, 173, 47, 152, 37, 9, 149, 199, 22, 119, 217, 89, 193, - 191, 146, 189, 16, 109, 69, 44, 53, 94, 107, 48, 197, 100, 174, 52, 79, - 45, 180, 167, 207, 105, 205, 149, 237, 249, 179, 253, 61, 252, 57, 176, 34, - 22, 228, 244, 220, 5, 50, 234, 82, 138, 95, 185, 203, 46, 43, 148, 164, - 103, 58, 195, 19, 31, 82, 170, 81, 206, 0, 36, 155, 118, 165, 190, 1, - 226, 105, 160, 18, 40, 54, 157, 205, 68, 10, 77, 13, 165, 137, 91, 133, - 228, 149, 105, 102, 172, 77, 90, 141, 114, 225, 21, 75, 0, 26, 206, 170, - 33, 69, 233, 208, 34, 42, 228, 98, 82, 116, 178, 114, 99, 53, 44, 64, - 236, 131, 97, 254, 196, 93, 88, 101, 54, 108, 233, 208, 181, 229, 131, 235, - 180, 229, 34, 170, 67, 194, 4, 94, 254, 38, 24, 136, 9, 163, 197, 163, - 144, 165, 208, 57, 229, 128, 165, 80, 240, 149, 240, 113, 157, 15, 143, 194, - 78, 156, 99, 199, 214, 182, 47, 68, 143, 234, 81, 56, 137, 211, 126, 139, - 211, 56, 152, 75, 241, 19, 48, 162, 41, 140, 5, 63, 179, 155, 80, 190, - 107, 78, 186, 87, 45, 162, 246, 70, 235, 208, 68, 46, 128, 179, 5, 99, - 208, 98, 176, 155, 150, 252, 52, 170, 176, 210, 158, 152, 7, 218, 202, 4, - 77, 215, 29, 218, 121, 1, 166, 106, 58, 97, 173, 219, 194, 84, 183, 203, - 132, 14, 136, 104, 134, 128, 143, 71, 127, 231, 90, 228, 6, 84, 190, 150, - 246, 73, 112, 32, 11, 224, 204, 193, 153, 244, 92, 94, 41, 118, 198, 187, - 36, 181, 181, 159, 218, 119, 137, 47, 99, 181, 4, 246, 207, 163, 233, 164, - 194, 221, 237, 40, 121, 236, 251, 138, 14, 216, 133, 214, 164, 29, 69, 122, - 87, 22, 121, 104, 251, 106, 55, 101, 137, 147, 13, 237, 56, 207, 165, 161, - 135, 52, 33, 80, 122, 194, 76, 151, 133, 113, 161, 43, 95, 240, 77, 13, - 152, 12, 251, 171, 248, 141, 223, 56, 184, 46, 19, 14, 187, 62, 244, 61, - 194, 103, 132, 213, 138, 121, 43, 147, 233, 232, 168, 190, 33, 83, 139, 50, - 137, 10, 168, 149, 185, 163, 168, 179, 104, 127, 59, 52, 31, 48, 20, 25, - 251, 38, 240, 199, 135, 222, 254, 6, 56, 110, 111, 129, 192, 121, 255, 38, - 50, 12, 22, 107, 66, 248, 219, 37, 42, 88, 107, 86, 230, 227, 227, 128, - 73, 10, 22, 142, 132, 46, 57, 97, 120, 58, 29, 53, 103, 136, 173, 199, - 101, 111, 114, 68, 101, 212, 214, 158, 57, 249, 66, 6, 127, 139, 219, 80, - 208, 152, 45, 85, 141, 206, 255, 160, 232, 137, 75, 181, 242, 3, 238, 77, - 52, 161, 205, 197, 53, 198, 82, 71, 190, 221, 151, 91, 4, 197, 197, 246, - 178, 103, 182, 151, 172, 253, 102, 186, 192, 50, 215, 59, 218, 101, 34, 9, - 179, 14, 238, 99, 24, 238, 238, 37, 17, 62, 34, 246, 106, 73, 68, 128, - 8, 223, 123, 154, 196, 212, 36, 198, 200, 83, 71, 76, 195, 79, 34, 26, - 146, 197, 203, 173, 210, 176, 144, 157, 158, 60, 217, 197, 134, 241, 55, 130, - 40, 161, 16, 226, 23, 184, 30, 163, 103, 161, 148, 116, 225, 104, 88, 181, - 226, 186, 19, 44, 162, 144, 136, 39, 79, 111, 77, 245, 246, 150, 139, 137, - 209, 194, 105, 62, 183, 156, 19, 45, 142, 190, 154, 177, 78, 64, 81, 185, - 181, 67, 219, 176, 207, 136, 118, 210, 68, 205, 230, 110, 43, 98, 166, 63, - 26, 189, 159, 16, 1, 248, 190, 107, 231, 79, 193, 124, 200, 115, 135, 83, - 213, 197, 221, 62, 80, 47, 138, 232, 43, 142, 153, 68, 87, 66, 60, 102, - 177, 250, 2, 88, 253, 21, 184, 170, 195, 39, 83, 206, 205, 252, 41, 139, - 108, 34, 60, 17, 54, 206, 89, 190, 200, 50, 157, 58, 75, 190, 154, 206, - 65, 97, 190, 100, 226, 230, 136, 26, 137, 76, 108, 112, 152, 46, 152, 8, - 19, 21, 29, 4, 57, 211, 134, 11, 120, 246, 242, 0, 247, 233, 16, 104, - 217, 157, 113, 235, 198, 120, 203, 179, 243, 222, 188, 202, 255, 4, 44, 70, - 11, 89, 160, 216, 107, 64, 73, 224, 113, 196, 22, 228, 88, 146, 147, 130, - 46, 85, 154, 119, 131, 98, 118, 1, 170, 39, 135, 7, 118, 159, 54, 147, - 178, 126, 219, 178, 243, 79, 242, 235, 59, 50, 174, 54, 233, 101, 168, 122, - 56, 57, 85, 26, 39, 21, 253, 188, 146, 237, 19, 155, 24, 90, 19, 8, - 48, 59, 148, 248, 143, 24, 109, 220, 21, 17, 17, 118, 139, 43, 54, 38, - 200, 47, 172, 137, 209, 162, 9, 119, 47, 213, 194, 125, 54, 137, 133, 205, - 20, 218, 155, 246, 202, 1, 210, 160, 244, 7, 87, 24, 180, 188, 36, 52, - 24, 93, 27, 161, 214, 228, 194, 8, 117, 162, 235, 185, 17, 188, 232, 155, - 89, 7, 87, 151, 8, 169, 74, 7, 126, 42, 45, 72, 133, 234, 169, 208, - 31, 87, 169, 90, 234, 102, 232, 253, 181, 89, 231, 85, 55, 221, 209, 200, - 12, 143, 46, 7, 169, 208, 101, 42, 100, 182, 248, 63, 83, 35, 48, 30, - 24, 45, 92, 143, 206, 141, 164, 155, 129, 89, 106, 78, 176, 79, 117, 180, - 123, 73, 11, 192, 90, 195, 45, 74, 124, 99, 227, 244, 179, 127, 251, 33, - 115, 149, 224, 170, 112, 108, 255, 244, 51, 166, 252, 87, 41, 178, 190, 26, - 85, 93, 201, 106, 20, 86, 220, 79, 63, 3, 41, 139, 12, 135, 196, 252, - 250, 250, 228, 187, 215, 111, 139, 204, 140, 55, 252, 204, 64, 112, 166, 31, - 173, 177, 185, 212, 102, 224, 43, 132, 184, 3, 17, 47, 38, 76, 74, 79, - 186, 116, 34, 211, 250, 83, 234, 183, 131, 86, 123, 60, 154, 196, 214, 145, - 186, 131, 243, 46, 27, 129, 69, 221, 54, 222, 46, 103, 32, 1, 171, 150, - 110, 43, 161, 166, 173, 78, 107, 204, 15, 167, 116, 57, 232, 176, 47, 188, - 211, 199, 244, 229, 18, 197, 15, 191, 124, 29, 236, 163, 3, 206, 36, 106, - 125, 200, 6, 183, 132, 238, 213, 104, 194, 239, 159, 86, 19, 137, 87, 172, - 242, 69, 191, 15, 36, 76, 53, 82, 56, 174, 155, 107, 18, 55, 121, 58, - 251, 97, 168, 51, 186, 113, 145, 163, 176, 39, 89, 129, 109, 159, 107, 133, - 52, 180, 232, 187, 58, 79, 41, 128, 46, 29, 84, 212, 56, 193, 211, 74, - 117, 156, 222, 22, 189, 51, 249, 62, 148, 28, 118, 185, 44, 97, 151, 102, - 244, 106, 81, 136, 164, 198, 184, 219, 101, 49, 26, 34, 17, 237, 162, 155, - 73, 79, 165, 197, 99, 171, 216, 58, 29, 119, 41, 245, 6, 140, 24, 2, - 13, 30, 129, 213, 167, 120, 98, 196, 99, 46, 26, 62, 77, 85, 124, 230, - 234, 92, 174, 122, 136, 228, 247, 97, 93, 73, 209, 85, 176, 96, 245, 186, - 130, 57, 77, 143, 139, 128, 188, 26, 22, 69, 178, 155, 194, 226, 166, 89, - 50, 102, 104, 243, 140, 124, 38, 228, 31, 62, 112, 170, 231, 11, 15, 28, - 223, 99, 150, 214, 226, 81, 127, 246, 186, 92, 95, 150, 84, 162, 82, 201, - 150, 249, 172, 69, 119, 219, 130, 91, 91, 144, 91, 22, 93, 113, 125, 240, - 247, 158, 238, 238, 145, 247, 60, 157, 198, 99, 140, 147, 5, 176, 209, 100, - 90, 120, 225, 126, 43, 181, 194, 154, 115, 225, 91, 234, 195, 139, 98, 146, - 250, 159, 110, 156, 254, 226, 91, 250, 195, 233, 7, 214, 27, 250, 124, 65, - 227, 232, 140, 40, 11, 162, 92, 41, 184, 195, 243, 221, 173, 236, 187, 72, - 121, 241, 173, 251, 226, 219, 98, 177, 244, 226, 91, 170, 141, 194, 111, 56, - 39, 126, 127, 91, 132, 243, 109, 110, 17, 193, 255, 44, 62, 3, 209, 196, - 225, 23, 28, 118, 227, 222, 252, 103, 177, 152, 234, 172, 251, 210, 253, 78, - 58, 132, 34, 42, 22, 113, 46, 127, 127, 107, 124, 191, 228, 206, 203, 247, - 119, 252, 45, 85, 77, 186, 173, 113, 187, 215, 236, 68, 237, 222, 104, 58, - 26, 68, 237, 194, 197, 176, 57, 119, 167, 132, 195, 187, 83, 183, 123, 53, - 137, 250, 163, 161, 59, 167, 250, 233, 87, 107, 174, 129, 142, 236, 205, 139, - 161, 176, 102, 84, 112, 114, 57, 44, 113, 105, 134, 61, 71, 169, 242, 216, - 32, 242, 21, 167, 12, 192, 210, 161, 90, 227, 136, 99, 142, 104, 205, 227, - 8, 170, 78, 92, 38, 171, 48, 20, 95, 80, 42, 154, 12, 91, 195, 130, - 174, 166, 152, 74, 63, 206, 166, 31, 199, 11, 62, 169, 195, 181, 141, 62, - 84, 252, 245, 28, 199, 113, 14, 212, 231, 23, 51, 93, 74, 70, 31, 119, - 226, 104, 45, 238, 184, 248, 188, 226, 63, 75, 122, 15, 22, 118, 104, 83, - 207, 226, 24, 1, 113, 26, 124, 18, 23, 103, 129, 157, 251, 41, 68, 83, - 167, 40, 92, 243, 210, 176, 120, 222, 25, 197, 221, 190, 24, 108, 238, 216, - 65, 28, 57, 56, 76, 181, 251, 156, 141, 142, 20, 146, 12, 131, 82, 24, - 80, 160, 192, 47, 212, 236, 83, 118, 189, 19, 197, 77, 61, 123, 94, 72, - 205, 64, 170, 87, 199, 155, 122, 117, 108, 244, 234, 248, 232, 246, 94, 29, - 127, 126, 175, 210, 64, 164, 139, 35, 54, 96, 178, 136, 219, 236, 49, 88, - 47, 136, 114, 220, 112, 113, 39, 136, 235, 189, 104, 111, 26, 71, 155, 26, - 198, 107, 88, 146, 169, 98, 167, 70, 83, 212, 32, 87, 139, 255, 121, 33, - 181, 24, 116, 53, 7, 182, 26, 117, 241, 89, 210, 96, 102, 182, 146, 30, - 38, 229, 40, 123, 12, 82, 51, 154, 186, 125, 43, 188, 212, 1, 90, 52, - 215, 230, 253, 113, 1, 54, 252, 237, 25, 9, 231, 213, 240, 54, 194, 239, - 35, 119, 212, 122, 191, 218, 182, 214, 114, 75, 113, 156, 216, 173, 241, 120, - 116, 195, 7, 229, 27, 207, 125, 227, 187, 108, 8, 203, 165, 171, 202, 229, - 180, 231, 142, 174, 90, 237, 104, 186, 112, 217, 234, 175, 224, 181, 248, 132, - 23, 83, 192, 128, 144, 202, 69, 201, 234, 139, 207, 21, 73, 167, 72, 254, - 75, 81, 111, 224, 87, 250, 13, 54, 232, 27, 220, 164, 223, 248, 28, 199, - 223, 205, 56, 80, 9, 155, 200, 194, 254, 147, 185, 15, 135, 56, 73, 145, - 82, 10, 43, 18, 3, 113, 219, 56, 78, 69, 1, 253, 7, 5, 142, 43, - 178, 248, 28, 91, 80, 129, 56, 24, 197, 185, 84, 189, 254, 1, 163, 137, - 142, 22, 30, 101, 177, 196, 5, 50, 73, 21, 51, 13, 66, 111, 114, 176, - 191, 87, 135, 250, 251, 195, 26, 31, 230, 239, 93, 109, 120, 82, 78, 235, - 192, 149, 70, 79, 235, 37, 74, 11, 206, 204, 96, 57, 64, 132, 134, 147, - 107, 2, 79, 157, 48, 87, 224, 205, 234, 89, 248, 133, 39, 226, 23, 255, - 54, 240, 79, 18, 240, 111, 130, 235, 198, 41, 153, 196, 83, 162, 232, 57, - 14, 10, 245, 86, 44, 133, 188, 79, 85, 118, 158, 214, 65, 82, 11, 128, - 131, 179, 58, 30, 3, 150, 78, 243, 37, 100, 230, 102, 253, 194, 41, 81, - 129, 21, 101, 159, 13, 22, 47, 153, 35, 167, 164, 183, 60, 109, 54, 210, - 62, 115, 101, 54, 48, 54, 26, 36, 193, 214, 13, 120, 131, 9, 130, 159, - 210, 73, 135, 150, 118, 244, 3, 187, 76, 9, 149, 40, 198, 163, 140, 134, - 23, 122, 62, 166, 106, 62, 166, 135, 161, 143, 63, 101, 186, 62, 76, 137, - 68, 123, 19, 75, 56, 114, 207, 154, 211, 223, 106, 46, 253, 10, 232, 151, - 235, 211, 36, 188, 116, 217, 157, 120, 179, 131, 140, 104, 134, 179, 213, 74, - 156, 39, 40, 33, 151, 235, 153, 249, 208, 16, 72, 7, 233, 161, 235, 85, - 247, 26, 220, 69, 170, 65, 123, 250, 166, 206, 61, 162, 117, 235, 218, 175, - 21, 229, 246, 70, 142, 124, 13, 112, 194, 152, 49, 48, 75, 73, 158, 120, - 88, 205, 55, 188, 10, 248, 228, 163, 191, 116, 207, 227, 53, 104, 236, 202, - 55, 65, 122, 49, 120, 242, 199, 151, 63, 65, 122, 109, 76, 227, 181, 145, - 137, 241, 214, 163, 252, 245, 168, 96, 235, 158, 214, 213, 100, 86, 144, 167, - 150, 144, 145, 197, 207, 100, 241, 215, 179, 4, 153, 44, 65, 146, 229, 69, - 60, 135, 111, 120, 157, 125, 155, 132, 125, 189, 238, 84, 152, 59, 59, 151, - 165, 131, 89, 241, 92, 158, 171, 23, 144, 238, 108, 126, 203, 191, 95, 130, - 203, 42, 217, 90, 115, 53, 153, 55, 104, 138, 214, 40, 79, 228, 198, 204, - 139, 13, 117, 250, 156, 141, 87, 145, 242, 225, 78, 217, 226, 58, 123, 233, - 58, 55, 100, 198, 17, 196, 14, 2, 174, 104, 97, 190, 192, 77, 234, 91, - 252, 122, 137, 133, 89, 139, 175, 16, 0, 58, 55, 79, 203, 122, 113, 200, - 45, 48, 198, 89, 184, 42, 3, 26, 228, 49, 83, 134, 249, 33, 15, 139, - 51, 204, 105, 249, 255, 24, 131, 102, 50, 234, 211, 37, 160, 121, 236, 158, - 194, 51, 199, 130, 218, 40, 226, 160, 104, 168, 53, 203, 67, 250, 177, 8, - 131, 233, 201, 156, 160, 226, 31, 33, 63, 107, 204, 117, 25, 81, 190, 17, - 229, 75, 84, 96, 68, 5, 250, 98, 167, 214, 54, 55, 72, 123, 30, 119, - 21, 149, 69, 95, 234, 244, 226, 4, 67, 65, 223, 39, 19, 164, 19, 255, - 175, 247, 66, 111, 114, 29, 140, 47, 207, 11, 175, 21, 85, 253, 154, 254, - 188, 38, 80, 190, 166, 94, 62, 9, 107, 187, 30, 127, 179, 244, 110, 123, - 54, 45, 240, 55, 112, 78, 145, 227, 3, 35, 62, 136, 227, 153, 82, 121, - 205, 3, 64, 118, 172, 12, 196, 180, 75, 5, 191, 2, 140, 80, 224, 218, - 119, 118, 189, 226, 147, 160, 194, 231, 73, 1, 236, 26, 140, 27, 236, 245, - 56, 149, 32, 219, 198, 88, 97, 234, 22, 67, 110, 243, 151, 231, 114, 172, - 124, 33, 86, 82, 61, 245, 213, 198, 215, 252, 172, 72, 248, 138, 251, 71, - 24, 174, 77, 200, 55, 104, 52, 120, 188, 224, 75, 15, 99, 4, 240, 198, - 229, 27, 140, 26, 251, 53, 54, 222, 75, 185, 81, 53, 175, 253, 228, 122, - 213, 188, 198, 102, 122, 163, 2, 116, 117, 242, 144, 19, 87, 40, 42, 227, - 210, 79, 81, 69, 251, 169, 104, 95, 71, 7, 169, 232, 64, 69, 251, 73, - 110, 223, 200, 237, 7, 169, 104, 206, 29, 13, 175, 191, 235, 14, 249, 234, - 225, 239, 20, 164, 7, 37, 85, 7, 8, 62, 52, 93, 146, 63, 200, 62, - 19, 122, 18, 201, 37, 213, 129, 84, 46, 63, 160, 227, 87, 215, 137, 225, - 233, 252, 186, 214, 76, 126, 47, 147, 127, 166, 222, 193, 155, 215, 250, 99, - 134, 53, 123, 125, 232, 107, 8, 255, 207, 172, 213, 25, 71, 120, 137, 30, - 183, 250, 26, 204, 250, 162, 184, 105, 14, 190, 99, 94, 126, 54, 69, 10, - 233, 137, 251, 42, 154, 0, 66, 224, 52, 21, 133, 96, 80, 7, 106, 81, - 108, 58, 253, 63, 237, 92, 110, 102, 15, 230, 62, 110, 99, 184, 87, 39, - 39, 177, 58, 239, 250, 132, 51, 134, 72, 166, 60, 101, 185, 127, 78, 121, - 238, 155, 253, 3, 37, 191, 91, 64, 6, 42, 212, 167, 41, 168, 122, 190, - 43, 213, 81, 228, 129, 42, 138, 46, 235, 227, 207, 187, 235, 84, 231, 99, - 125, 251, 129, 206, 117, 150, 67, 233, 108, 19, 27, 161, 41, 189, 213, 45, - 168, 19, 86, 119, 83, 216, 76, 84, 38, 33, 243, 251, 248, 61, 104, 93, - 21, 254, 238, 206, 221, 139, 225, 220, 60, 82, 231, 143, 221, 230, 227, 121, - 140, 160, 31, 207, 85, 47, 31, 207, 197, 156, 213, 223, 31, 23, 25, 1, - 63, 38, 60, 60, 127, 76, 137, 127, 127, 124, 74, 1, 154, 96, 245, 65, - 81, 84, 229, 99, 170, 225, 239, 143, 185, 185, 171, 238, 252, 170, 160, 57, - 5, 8, 48, 10, 2, 242, 97, 206, 128, 196, 28, 6, 207, 43, 94, 213, - 247, 189, 90, 131, 232, 19, 137, 251, 173, 78, 0, 247, 170, 187, 251, 181, - 32, 240, 227, 200, 26, 221, 209, 171, 254, 94, 176, 31, 196, 81, 224, 205, - 249, 207, 60, 110, 108, 60, 250, 195, 228, 204, 52, 111, 103, 205, 80, 114, - 134, 49, 67, 49, 28, 75, 187, 12, 188, 25, 170, 210, 20, 95, 24, 180, - 214, 94, 88, 193, 115, 62, 126, 241, 157, 93, 56, 134, 38, 206, 108, 96, - 191, 56, 167, 227, 104, 54, 237, 218, 223, 117, 175, 35, 126, 33, 46, 38, - 226, 32, 147, 105, 230, 9, 54, 109, 2, 14, 21, 69, 19, 197, 242, 102, - 227, 255, 136, 161, 229, 208, 237, 52, 163, 143, 243, 102, 84, 193, 215, 31, - 133, 121, 243, 143, 226, 71, 154, 194, 78, 162, 49, 229, 60, 178, 203, 149, - 170, 189, 140, 218, 43, 0, 23, 50, 71, 75, 191, 90, 223, 15, 118, 75, - 136, 18, 65, 116, 150, 186, 244, 210, 154, 82, 108, 31, 125, 211, 168, 148, - 106, 145, 168, 79, 109, 247, 120, 199, 229, 147, 7, 0, 62, 62, 32, 197, - 167, 221, 13, 189, 179, 235, 171, 226, 42, 211, 224, 154, 174, 153, 217, 160, - 104, 106, 221, 222, 98, 47, 221, 98, 112, 103, 139, 27, 39, 78, 183, 200, - 122, 86, 183, 55, 216, 73, 55, 88, 187, 179, 193, 141, 114, 213, 186, 65, - 188, 172, 77, 199, 180, 90, 110, 109, 115, 146, 110, 179, 126, 103, 155, 235, - 58, 124, 169, 137, 156, 247, 148, 234, 217, 197, 150, 105, 212, 80, 141, 91, - 177, 131, 181, 22, 110, 5, 36, 53, 49, 239, 220, 213, 72, 103, 173, 149, - 218, 122, 43, 183, 130, 143, 155, 153, 79, 238, 108, 104, 178, 214, 82, 93, - 185, 51, 79, 210, 111, 232, 220, 236, 209, 79, 135, 126, 38, 134, 63, 167, - 71, 176, 50, 10, 220, 224, 220, 184, 55, 197, 149, 213, 83, 161, 158, 219, - 131, 132, 185, 10, 117, 220, 14, 108, 53, 171, 208, 196, 133, 244, 121, 34, - 158, 33, 226, 81, 254, 81, 88, 103, 225, 40, 120, 9, 119, 169, 136, 51, - 209, 150, 221, 252, 48, 172, 153, 73, 70, 124, 16, 199, 91, 90, 92, 250, - 38, 177, 230, 67, 120, 96, 35, 128, 186, 29, 58, 177, 69, 12, 234, 86, - 172, 3, 75, 174, 241, 226, 2, 130, 48, 38, 128, 235, 16, 218, 245, 150, - 54, 132, 138, 190, 87, 75, 113, 117, 113, 147, 185, 156, 45, 214, 33, 98, - 105, 54, 219, 48, 208, 237, 28, 137, 40, 153, 51, 113, 150, 84, 188, 10, - 159, 239, 46, 163, 176, 140, 204, 11, 171, 156, 110, 236, 163, 104, 75, 222, - 137, 187, 80, 126, 19, 238, 66, 252, 198, 77, 6, 205, 214, 219, 26, 188, - 19, 119, 161, 130, 77, 184, 235, 182, 22, 55, 79, 181, 106, 241, 46, 220, - 133, 242, 155, 112, 215, 109, 13, 110, 222, 124, 170, 193, 219, 182, 29, 202, - 198, 123, 142, 3, 153, 166, 212, 246, 83, 249, 104, 150, 235, 230, 84, 222, - 10, 218, 219, 209, 23, 23, 55, 155, 94, 71, 95, 18, 121, 71, 19, 183, - 162, 47, 169, 97, 173, 149, 218, 122, 43, 183, 66, 240, 110, 244, 165, 107, - 206, 182, 84, 79, 224, 23, 163, 175, 140, 41, 100, 218, 43, 180, 157, 50, - 104, 140, 110, 192, 6, 26, 67, 40, 65, 99, 8, 37, 104, 12, 161, 63, - 15, 141, 129, 140, 101, 203, 188, 205, 13, 118, 22, 214, 245, 209, 115, 113, - 254, 78, 206, 190, 238, 142, 181, 160, 74, 90, 185, 60, 22, 250, 98, 65, - 154, 17, 4, 106, 233, 214, 173, 252, 41, 182, 91, 87, 17, 148, 43, 250, - 93, 200, 254, 16, 172, 55, 117, 33, 43, 244, 14, 97, 109, 145, 204, 219, - 109, 124, 243, 77, 116, 24, 62, 245, 220, 168, 92, 11, 88, 23, 128, 198, - 30, 184, 79, 27, 110, 84, 44, 230, 237, 77, 66, 216, 98, 31, 135, 117, - 58, 238, 86, 106, 17, 213, 143, 219, 212, 89, 30, 108, 120, 51, 177, 255, - 35, 74, 45, 20, 190, 83, 169, 37, 213, 141, 79, 181, 201, 182, 77, 101, - 197, 181, 190, 152, 225, 77, 53, 150, 237, 240, 93, 215, 1, 216, 14, 225, - 173, 138, 44, 113, 43, 95, 73, 145, 37, 169, 255, 79, 81, 100, 105, 104, - 179, 155, 251, 15, 55, 187, 41, 112, 189, 130, 59, 103, 172, 106, 81, 20, - 116, 213, 195, 250, 250, 142, 85, 96, 22, 145, 182, 60, 114, 229, 237, 78, - 116, 9, 107, 119, 5, 195, 238, 70, 191, 123, 49, 173, 92, 137, 247, 102, - 201, 234, 229, 139, 85, 43, 110, 38, 171, 190, 102, 248, 213, 171, 175, 18, - 154, 34, 113, 53, 44, 34, 238, 202, 60, 132, 239, 253, 230, 28, 178, 161, - 146, 44, 1, 193, 150, 123, 46, 163, 193, 213, 122, 207, 217, 252, 8, 45, - 13, 216, 4, 234, 218, 63, 188, 62, 126, 3, 113, 244, 139, 232, 114, 54, - 22, 173, 9, 177, 238, 129, 123, 50, 79, 231, 132, 70, 89, 184, 233, 141, - 38, 74, 3, 2, 23, 185, 159, 126, 174, 136, 151, 93, 26, 40, 15, 71, - 181, 102, 232, 46, 62, 82, 22, 82, 156, 102, 156, 10, 75, 41, 166, 241, - 20, 103, 137, 214, 131, 230, 119, 175, 223, 190, 122, 249, 203, 79, 111, 255, - 75, 108, 169, 36, 5, 194, 245, 28, 10, 3, 199, 53, 252, 199, 207, 175, - 222, 190, 121, 251, 211, 247, 175, 127, 124, 181, 161, 180, 153, 154, 45, 249, - 215, 159, 142, 55, 21, 225, 104, 229, 119, 35, 99, 166, 105, 210, 189, 10, - 223, 189, 147, 235, 38, 190, 119, 148, 25, 31, 99, 136, 180, 198, 187, 87, - 171, 23, 87, 87, 223, 181, 166, 45, 9, 188, 29, 181, 232, 240, 185, 148, - 0, 134, 35, 95, 65, 213, 247, 228, 235, 170, 63, 187, 140, 134, 227, 182, - 101, 246, 227, 243, 170, 148, 177, 174, 85, 82, 197, 103, 37, 168, 238, 63, - 160, 225, 76, 153, 59, 106, 222, 253, 132, 154, 119, 227, 154, 39, 221, 84, - 1, 195, 0, 149, 37, 22, 63, 103, 102, 203, 86, 102, 185, 79, 239, 94, - 237, 137, 253, 43, 89, 228, 247, 89, 215, 211, 219, 150, 245, 116, 211, 170, - 254, 229, 248, 141, 185, 176, 166, 60, 22, 68, 102, 151, 224, 47, 175, 54, - 230, 124, 181, 41, 235, 241, 27, 218, 4, 27, 171, 69, 252, 93, 139, 27, - 153, 115, 59, 244, 59, 183, 121, 105, 27, 85, 198, 159, 203, 223, 159, 6, - 191, 43, 157, 214, 77, 233, 59, 118, 102, 82, 166, 169, 57, 193, 73, 99, - 90, 91, 131, 148, 163, 178, 68, 14, 245, 149, 65, 119, 202, 54, 133, 148, - 77, 13, 66, 167, 99, 58, 156, 32, 154, 217, 29, 94, 71, 227, 209, 16, - 46, 3, 224, 17, 11, 229, 76, 27, 94, 159, 84, 15, 203, 232, 250, 118, - 231, 188, 214, 177, 7, 248, 233, 208, 175, 11, 250, 233, 211, 207, 132, 127, - 77, 232, 87, 210, 251, 183, 63, 124, 187, 213, 180, 26, 53, 162, 245, 31, - 40, 155, 92, 24, 171, 22, 62, 227, 235, 136, 182, 109, 22, 52, 26, 172, - 90, 124, 123, 56, 221, 238, 139, 123, 54, 252, 194, 104, 249, 197, 167, 54, - 125, 75, 87, 38, 211, 78, 115, 56, 138, 38, 27, 205, 16, 118, 39, 83, - 104, 173, 83, 79, 56, 11, 212, 250, 135, 157, 214, 24, 182, 28, 21, 119, - 240, 214, 203, 115, 92, 119, 154, 209, 215, 111, 193, 228, 2, 93, 171, 171, - 246, 86, 158, 223, 206, 228, 127, 198, 211, 66, 39, 12, 253, 231, 129, 247, - 172, 30, 20, 111, 99, 2, 42, 141, 199, 180, 160, 122, 150, 52, 53, 21, - 38, 113, 128, 223, 162, 95, 125, 171, 229, 83, 83, 189, 210, 143, 233, 82, - 81, 156, 220, 72, 140, 106, 66, 144, 50, 220, 73, 107, 62, 84, 117, 250, - 78, 82, 52, 38, 53, 169, 23, 202, 160, 234, 157, 106, 166, 25, 213, 82, - 237, 252, 157, 102, 218, 108, 77, 20, 37, 25, 30, 134, 46, 36, 95, 59, - 74, 124, 237, 88, 84, 69, 253, 147, 41, 59, 165, 48, 122, 81, 152, 187, - 80, 85, 116, 13, 133, 70, 86, 165, 10, 159, 186, 245, 253, 242, 181, 187, - 191, 87, 190, 222, 114, 17, 161, 134, 148, 70, 221, 36, 30, 133, 239, 202, - 223, 96, 163, 60, 56, 91, 100, 96, 87, 195, 106, 72, 113, 121, 209, 38, - 130, 233, 7, 144, 63, 60, 136, 164, 110, 109, 171, 199, 188, 67, 193, 156, - 53, 66, 1, 133, 216, 255, 17, 107, 215, 173, 235, 206, 129, 248, 237, 38, - 90, 31, 254, 166, 93, 37, 47, 69, 25, 163, 90, 202, 25, 139, 242, 162, - 194, 61, 82, 21, 101, 117, 16, 102, 241, 9, 160, 58, 151, 222, 206, 99, - 237, 166, 65, 247, 193, 21, 161, 34, 87, 197, 199, 61, 250, 153, 163, 121, - 193, 235, 34, 147, 217, 185, 148, 97, 117, 87, 152, 255, 74, 105, 116, 166, - 43, 87, 253, 170, 133, 134, 105, 63, 165, 95, 92, 203, 209, 105, 217, 199, - 61, 67, 134, 241, 142, 253, 42, 82, 20, 108, 43, 24, 113, 181, 28, 28, - 245, 89, 183, 193, 154, 237, 176, 56, 253, 73, 194, 18, 96, 237, 70, 24, - 79, 113, 127, 91, 209, 13, 226, 84, 114, 158, 165, 76, 175, 56, 253, 177, - 45, 122, 123, 168, 168, 150, 99, 243, 42, 218, 86, 210, 34, 94, 94, 98, - 133, 92, 76, 150, 103, 251, 80, 73, 250, 176, 94, 36, 101, 239, 194, 188, - 240, 108, 85, 152, 105, 137, 146, 72, 133, 51, 109, 189, 252, 27, 144, 54, - 170, 204, 238, 172, 242, 134, 11, 61, 221, 226, 189, 237, 27, 71, 124, 147, - 109, 235, 217, 132, 232, 172, 190, 178, 46, 123, 123, 207, 92, 229, 88, 75, - 172, 8, 198, 62, 158, 211, 14, 200, 184, 251, 137, 207, 48, 163, 227, 184, - 206, 89, 232, 55, 187, 200, 145, 251, 28, 220, 232, 136, 254, 21, 199, 183, - 146, 248, 15, 18, 207, 38, 232, 155, 249, 231, 209, 51, 85, 244, 69, 146, - 229, 191, 243, 197, 231, 145, 242, 237, 131, 151, 99, 42, 254, 204, 66, 110, - 49, 211, 153, 91, 111, 42, 183, 210, 78, 60, 149, 15, 83, 121, 102, 133, - 203, 172, 37, 10, 178, 29, 158, 5, 120, 181, 138, 45, 101, 24, 8, 130, - 230, 79, 51, 231, 230, 154, 57, 237, 224, 187, 247, 40, 116, 122, 171, 141, - 202, 235, 128, 65, 23, 80, 111, 42, 152, 110, 66, 5, 134, 89, 95, 5, - 248, 180, 129, 93, 173, 87, 29, 211, 59, 174, 210, 187, 206, 232, 178, 103, - 53, 136, 85, 109, 68, 199, 169, 175, 188, 76, 10, 119, 72, 174, 163, 192, - 40, 113, 242, 138, 110, 191, 106, 174, 28, 31, 51, 5, 24, 5, 37, 118, - 244, 165, 216, 71, 208, 235, 111, 230, 171, 121, 55, 218, 178, 204, 166, 81, - 219, 208, 173, 143, 166, 226, 180, 10, 209, 149, 233, 168, 205, 166, 120, 198, - 41, 251, 57, 236, 41, 28, 172, 248, 225, 31, 218, 56, 143, 220, 158, 41, - 59, 245, 119, 26, 153, 6, 247, 83, 53, 162, 166, 216, 204, 174, 246, 207, - 217, 164, 2, 144, 176, 95, 217, 234, 139, 77, 221, 112, 64, 167, 177, 237, - 26, 245, 185, 212, 145, 229, 148, 82, 15, 181, 157, 64, 85, 89, 246, 233, - 18, 197, 130, 165, 206, 214, 132, 212, 204, 164, 134, 5, 175, 232, 237, 110, - 66, 8, 193, 192, 16, 27, 199, 164, 92, 41, 87, 125, 134, 255, 61, 49, - 166, 32, 71, 81, 170, 1, 237, 81, 157, 40, 142, 217, 68, 155, 123, 190, - 23, 216, 184, 49, 116, 74, 49, 94, 179, 35, 21, 45, 247, 101, 19, 198, - 133, 150, 38, 92, 50, 108, 180, 87, 70, 119, 158, 1, 199, 175, 114, 246, - 36, 167, 59, 97, 122, 236, 194, 242, 102, 197, 97, 90, 141, 33, 140, 138, - 170, 104, 24, 20, 149, 207, 217, 184, 111, 175, 226, 238, 43, 163, 95, 211, - 94, 108, 104, 225, 254, 182, 6, 54, 186, 47, 75, 191, 64, 235, 99, 94, - 208, 83, 167, 43, 57, 51, 30, 199, 76, 23, 99, 198, 228, 252, 156, 105, - 243, 129, 38, 33, 182, 90, 193, 140, 193, 227, 81, 99, 25, 216, 37, 103, - 187, 103, 28, 162, 209, 132, 10, 107, 43, 29, 113, 113, 199, 23, 234, 55, - 169, 143, 136, 114, 40, 197, 18, 190, 90, 182, 187, 81, 191, 0, 158, 122, - 169, 190, 83, 43, 150, 11, 232, 22, 4, 201, 78, 17, 247, 164, 118, 182, - 202, 248, 80, 203, 191, 248, 246, 229, 119, 175, 190, 255, 225, 175, 175, 255, - 237, 223, 127, 60, 62, 249, 233, 205, 223, 222, 254, 252, 203, 127, 252, 253, - 215, 255, 252, 175, 255, 110, 157, 183, 59, 221, 139, 203, 94, 244, 199, 251, - 254, 96, 56, 186, 250, 31, 162, 159, 102, 215, 55, 243, 197, 7, 207, 15, - 106, 245, 198, 238, 222, 254, 211, 242, 78, 254, 192, 202, 57, 186, 43, 185, - 231, 5, 246, 241, 181, 203, 98, 92, 112, 112, 118, 32, 78, 191, 118, 107, - 18, 209, 204, 107, 71, 99, 35, 136, 8, 13, 237, 141, 30, 199, 208, 87, - 88, 77, 177, 144, 71, 25, 80, 129, 207, 176, 111, 88, 230, 106, 24, 134, - 222, 243, 66, 218, 235, 23, 55, 114, 125, 116, 20, 156, 29, 72, 205, 215, - 7, 92, 185, 95, 124, 134, 252, 254, 198, 252, 133, 194, 232, 154, 93, 133, - 137, 63, 177, 107, 56, 29, 203, 148, 15, 32, 142, 190, 173, 40, 251, 34, - 11, 116, 217, 93, 148, 221, 212, 171, 111, 104, 240, 82, 155, 167, 36, 229, - 238, 209, 33, 42, 161, 21, 175, 56, 215, 153, 11, 87, 109, 236, 82, 153, - 106, 177, 169, 88, 24, 200, 216, 130, 237, 85, 169, 14, 174, 245, 139, 189, - 190, 65, 36, 100, 155, 173, 149, 207, 218, 211, 159, 186, 103, 85, 118, 181, - 103, 167, 108, 54, 237, 214, 141, 75, 61, 205, 223, 119, 191, 165, 70, 245, - 165, 118, 91, 57, 246, 200, 200, 140, 90, 115, 79, 211, 189, 75, 151, 16, - 179, 141, 134, 239, 83, 232, 125, 94, 118, 229, 41, 121, 227, 3, 155, 202, - 161, 204, 45, 84, 50, 143, 211, 183, 58, 44, 77, 87, 174, 56, 89, 226, - 195, 32, 177, 185, 2, 244, 63, 233, 137, 75, 209, 35, 131, 215, 191, 140, - 90, 171, 248, 125, 218, 66, 14, 143, 223, 213, 91, 202, 203, 65, 106, 24, - 237, 17, 211, 122, 116, 220, 197, 141, 217, 205, 214, 245, 101, 115, 52, 155, - 82, 202, 166, 151, 47, 49, 45, 163, 139, 65, 181, 117, 28, 205, 245, 80, - 204, 193, 118, 108, 85, 101, 116, 15, 47, 173, 118, 129, 237, 23, 143, 207, - 97, 129, 153, 46, 212, 9, 225, 164, 159, 226, 139, 198, 59, 149, 230, 33, - 217, 249, 116, 95, 243, 96, 8, 110, 161, 99, 5, 227, 79, 91, 239, 187, - 147, 228, 196, 138, 61, 205, 110, 152, 44, 184, 245, 90, 135, 78, 178, 236, - 168, 105, 181, 240, 28, 31, 140, 207, 244, 172, 173, 172, 11, 59, 119, 116, - 222, 189, 132, 129, 186, 235, 75, 86, 138, 200, 57, 57, 54, 134, 206, 120, - 1, 246, 19, 127, 134, 80, 231, 228, 183, 224, 192, 134, 236, 160, 52, 254, - 115, 80, 0, 114, 160, 255, 7, 44, 117, 75, 71, 63, 149, 167, 28, 229, - 16, 146, 120, 131, 215, 46, 253, 63, 161, 100, 186, 186, 20, 94, 238, 132, - 120, 4, 134, 81, 4, 168, 90, 23, 242, 51, 59, 239, 94, 79, 71, 147, - 194, 203, 34, 93, 198, 237, 215, 166, 196, 216, 179, 103, 246, 79, 236, 18, - 225, 53, 40, 208, 86, 27, 111, 42, 182, 242, 119, 158, 248, 157, 25, 140, - 176, 6, 198, 179, 97, 51, 26, 54, 193, 173, 235, 247, 187, 125, 198, 28, - 195, 17, 99, 141, 5, 1, 16, 22, 197, 161, 83, 101, 32, 142, 159, 123, - 163, 27, 216, 197, 233, 14, 103, 204, 188, 229, 249, 229, 251, 232, 117, 212, - 189, 97, 195, 31, 6, 253, 171, 90, 71, 115, 236, 25, 132, 91, 77, 191, - 172, 16, 136, 131, 149, 178, 7, 168, 4, 74, 29, 255, 48, 12, 228, 50, - 240, 136, 13, 52, 27, 230, 91, 107, 107, 206, 219, 79, 12, 219, 215, 177, - 201, 199, 156, 97, 247, 138, 117, 175, 39, 221, 230, 245, 212, 247, 60, 155, - 208, 132, 242, 151, 101, 183, 245, 103, 219, 30, 234, 207, 161, 61, 214, 159, - 99, 69, 125, 99, 214, 229, 107, 101, 218, 126, 36, 218, 126, 76, 163, 39, - 20, 66, 56, 40, 206, 169, 50, 34, 245, 177, 153, 199, 86, 183, 79, 49, - 166, 58, 180, 42, 252, 15, 75, 140, 150, 215, 15, 239, 234, 123, 128, 25, - 195, 41, 231, 12, 115, 118, 101, 237, 159, 42, 163, 254, 160, 96, 123, 149, - 59, 30, 209, 192, 236, 243, 217, 116, 58, 26, 114, 57, 99, 74, 184, 182, - 170, 206, 255, 239, 221, 197, 132, 153, 77, 84, 234, 229, 47, 111, 127, 44, - 127, 135, 252, 204, 220, 34, 50, 120, 204, 93, 84, 86, 197, 241, 100, 182, - 189, 220, 203, 184, 156, 48, 128, 239, 42, 244, 234, 103, 85, 130, 54, 190, - 138, 250, 91, 92, 69, 119, 30, 77, 171, 233, 145, 221, 249, 47, 49, 203, - 220, 133, 180, 48, 240, 101, 224, 213, 247, 237, 75, 218, 253, 116, 207, 251, - 182, 63, 58, 159, 216, 175, 58, 17, 109, 50, 4, 71, 68, 111, 227, 68, - 250, 150, 150, 230, 132, 34, 94, 142, 8, 207, 16, 124, 190, 31, 205, 144, - 254, 125, 68, 196, 225, 171, 139, 11, 138, 82, 161, 155, 209, 248, 253, 132, - 191, 39, 189, 202, 171, 69, 146, 250, 206, 202, 161, 80, 68, 91, 235, 251, - 168, 79, 171, 27, 84, 148, 155, 251, 5, 119, 126, 96, 152, 191, 182, 134, - 163, 119, 181, 198, 30, 197, 253, 53, 154, 76, 71, 151, 132, 190, 232, 168, - 27, 140, 16, 49, 154, 93, 246, 236, 95, 160, 158, 0, 167, 214, 20, 243, - 111, 173, 27, 214, 186, 235, 162, 23, 127, 143, 198, 120, 150, 180, 127, 196, - 30, 109, 183, 174, 48, 16, 156, 179, 63, 40, 87, 165, 63, 70, 23, 93, - 238, 192, 143, 44, 235, 19, 247, 247, 152, 242, 119, 251, 231, 227, 17, 197, - 205, 175, 8, 33, 113, 109, 181, 239, 236, 227, 238, 180, 117, 174, 70, 124, - 12, 99, 6, 55, 93, 58, 81, 198, 18, 98, 86, 224, 155, 214, 180, 71, - 193, 55, 173, 54, 237, 37, 254, 160, 237, 200, 109, 188, 161, 235, 208, 160, - 149, 52, 2, 246, 249, 223, 102, 173, 225, 52, 250, 192, 252, 84, 105, 225, - 109, 247, 2, 235, 44, 9, 207, 206, 129, 202, 127, 98, 187, 62, 20, 245, - 115, 175, 69, 4, 198, 183, 52, 25, 8, 176, 128, 117, 50, 43, 148, 255, - 231, 105, 107, 76, 151, 232, 126, 135, 219, 252, 165, 75, 83, 137, 156, 191, - 208, 21, 237, 151, 22, 253, 140, 0, 131, 215, 108, 232, 237, 87, 194, 185, - 60, 35, 192, 39, 212, 245, 95, 123, 209, 88, 205, 37, 36, 188, 94, 206, - 198, 72, 183, 20, 205, 49, 9, 231, 77, 44, 8, 119, 222, 60, 199, 90, - 192, 95, 181, 8, 232, 179, 45, 211, 95, 167, 207, 11, 154, 108, 245, 135, - 231, 156, 191, 39, 189, 238, 162, 75, 61, 162, 111, 153, 107, 138, 165, 163, - 105, 20, 225, 175, 158, 85, 124, 99, 66, 233, 239, 31, 241, 52, 82, 160, - 175, 167, 15, 223, 52, 101, 92, 79, 159, 157, 0, 204, 155, 131, 120, 174, - 16, 208, 243, 83, 235, 32, 148, 204, 144, 132, 216, 180, 32, 59, 166, 157, - 211, 31, 204, 16, 127, 208, 12, 113, 149, 87, 60, 67, 20, 245, 63, 50, - 45, 221, 230, 248, 242, 156, 130, 227, 120, 78, 184, 218, 49, 79, 9, 127, - 78, 48, 27, 231, 2, 13, 145, 118, 199, 135, 158, 2, 202, 130, 106, 167, - 60, 9, 148, 64, 23, 204, 41, 156, 25, 33, 211, 13, 128, 143, 191, 0, - 58, 124, 25, 12, 70, 114, 246, 53, 219, 12, 119, 107, 120, 222, 212, 27, - 81, 123, 77, 145, 96, 113, 101, 233, 131, 133, 221, 107, 132, 75, 31, 182, - 7, 29, 255, 81, 24, 184, 176, 122, 223, 108, 95, 205, 224, 14, 25, 114, - 64, 15, 196, 180, 213, 112, 35, 134, 53, 140, 181, 59, 73, 191, 44, 208, - 128, 160, 159, 92, 221, 53, 27, 127, 23, 33, 236, 205, 177, 101, 117, 142, - 103, 165, 26, 55, 168, 179, 241, 116, 49, 194, 140, 199, 56, 17, 220, 92, - 197, 108, 39, 175, 218, 96, 187, 237, 202, 78, 122, 224, 238, 186, 30, 97, - 219, 15, 86, 121, 8, 107, 202, 124, 183, 36, 114, 19, 142, 73, 16, 246, - 221, 26, 43, 2, 80, 53, 116, 193, 131, 45, 173, 242, 5, 226, 63, 148, - 125, 139, 121, 89, 176, 147, 87, 115, 103, 5, 63, 216, 71, 81, 102, 227, - 248, 238, 41, 107, 187, 156, 185, 53, 187, 84, 181, 243, 139, 157, 66, 175, - 226, 139, 109, 70, 157, 194, 169, 110, 205, 74, 155, 125, 207, 105, 133, 169, - 185, 43, 114, 22, 7, 246, 66, 197, 44, 224, 165, 190, 178, 160, 152, 194, - 188, 180, 216, 185, 233, 21, 127, 243, 170, 123, 71, 80, 32, 200, 89, 229, - 78, 36, 198, 29, 107, 246, 124, 52, 174, 86, 237, 170, 85, 70, 55, 171, - 85, 139, 109, 129, 209, 201, 89, 62, 245, 221, 74, 112, 102, 149, 78, 3, - 151, 142, 225, 170, 120, 83, 97, 40, 212, 221, 186, 235, 89, 45, 187, 109, - 195, 154, 125, 202, 102, 124, 141, 162, 218, 176, 164, 72, 75, 20, 170, 68, - 173, 211, 90, 165, 113, 70, 81, 12, 120, 58, 250, 242, 201, 201, 71, 119, - 166, 0, 76, 81, 95, 89, 176, 151, 247, 236, 100, 134, 165, 200, 223, 133, - 253, 245, 236, 29, 29, 121, 178, 26, 220, 58, 20, 46, 252, 125, 93, 80, - 153, 77, 151, 103, 12, 17, 2, 75, 23, 181, 239, 40, 89, 81, 69, 105, - 73, 181, 180, 161, 180, 57, 207, 250, 57, 17, 218, 213, 134, 61, 132, 173, - 67, 223, 42, 212, 130, 3, 154, 179, 223, 112, 217, 197, 95, 239, 192, 227, - 249, 171, 86, 93, 250, 31, 83, 79, 243, 167, 43, 224, 231, 60, 204, 109, - 197, 183, 203, 143, 66, 80, 236, 137, 0, 170, 111, 77, 194, 125, 107, 124, - 250, 155, 202, 204, 19, 186, 236, 149, 123, 143, 189, 114, 80, 114, 38, 229, - 221, 149, 94, 44, 158, 112, 63, 105, 161, 211, 46, 133, 174, 140, 44, 59, - 103, 34, 201, 75, 100, 46, 195, 182, 34, 22, 108, 117, 215, 200, 231, 111, - 205, 231, 7, 30, 255, 212, 2, 235, 15, 158, 118, 119, 89, 184, 121, 236, - 85, 110, 138, 59, 193, 138, 179, 214, 196, 99, 64, 5, 126, 5, 124, 172, - 139, 109, 57, 124, 215, 116, 41, 208, 150, 206, 249, 214, 112, 192, 68, 35, - 171, 163, 185, 252, 117, 113, 73, 120, 68, 62, 161, 170, 198, 31, 231, 136, - 19, 51, 232, 172, 59, 93, 235, 216, 212, 171, 192, 115, 245, 127, 1, 245, - 188, 46, 63, 184, 120, 212, 8, 160, 4, 120, 184, 42, 112, 197, 206, 19, - 97, 165, 201, 136, 144, 30, 227, 130, 97, 232, 239, 90, 237, 222, 120, 52, - 232, 2, 219, 238, 214, 231, 187, 117, 34, 192, 2, 143, 13, 163, 187, 116, - 195, 228, 137, 12, 106, 158, 77, 115, 208, 118, 43, 53, 139, 150, 105, 208, - 155, 92, 195, 47, 130, 172, 123, 181, 185, 156, 33, 205, 37, 219, 5, 61, - 253, 80, 170, 237, 122, 59, 29, 247, 7, 247, 219, 179, 156, 173, 148, 232, - 104, 163, 156, 132, 203, 221, 146, 51, 92, 217, 111, 194, 37, 205, 217, 9, - 158, 73, 180, 133, 117, 184, 59, 168, 117, 216, 76, 43, 192, 87, 112, 78, - 92, 231, 13, 2, 193, 153, 93, 115, 157, 19, 11, 166, 231, 104, 197, 82, - 188, 108, 227, 231, 139, 103, 116, 135, 128, 249, 57, 74, 95, 114, 101, 42, - 5, 60, 149, 224, 217, 28, 156, 137, 197, 179, 69, 153, 114, 45, 78, 107, - 110, 157, 183, 22, 254, 44, 104, 232, 245, 51, 248, 149, 160, 226, 158, 88, - 146, 172, 0, 64, 218, 220, 105, 173, 72, 27, 22, 85, 82, 95, 185, 206, - 60, 215, 137, 60, 170, 218, 39, 206, 240, 153, 151, 183, 208, 240, 155, 138, - 115, 34, 185, 224, 99, 194, 48, 83, 223, 63, 109, 16, 128, 109, 70, 136, - 182, 12, 51, 213, 138, 175, 91, 241, 181, 9, 89, 204, 17, 254, 35, 188, - 103, 214, 235, 85, 131, 134, 89, 177, 124, 210, 122, 57, 111, 181, 223, 95, - 242, 174, 161, 233, 228, 164, 165, 177, 112, 216, 165, 5, 106, 168, 217, 101, - 57, 16, 89, 36, 205, 109, 36, 115, 122, 3, 21, 52, 158, 68, 171, 224, - 85, 253, 3, 66, 117, 53, 236, 209, 170, 79, 152, 47, 192, 95, 189, 91, - 147, 109, 74, 57, 15, 252, 212, 38, 70, 11, 87, 163, 27, 170, 71, 109, - 252, 42, 97, 135, 170, 223, 72, 118, 182, 96, 131, 96, 159, 93, 215, 39, - 189, 182, 110, 224, 153, 74, 180, 194, 114, 167, 114, 45, 170, 196, 168, 39, - 71, 107, 71, 22, 171, 237, 89, 163, 193, 185, 75, 155, 0, 94, 141, 219, - 239, 187, 29, 183, 125, 49, 167, 159, 5, 253, 124, 112, 91, 253, 171, 94, - 43, 244, 172, 33, 197, 13, 41, 110, 120, 241, 33, 92, 158, 94, 186, 244, - 223, 217, 138, 249, 189, 30, 219, 158, 175, 195, 120, 170, 53, 152, 187, 131, - 133, 59, 56, 15, 77, 88, 205, 67, 186, 71, 205, 87, 7, 11, 252, 93, - 172, 14, 78, 231, 135, 152, 239, 103, 243, 18, 164, 241, 138, 59, 5, 138, - 190, 89, 209, 151, 187, 144, 132, 69, 137, 15, 28, 78, 232, 113, 2, 125, - 156, 175, 224, 88, 3, 46, 8, 226, 77, 27, 21, 28, 106, 208, 25, 44, - 148, 164, 141, 51, 56, 87, 158, 167, 29, 99, 56, 236, 184, 64, 7, 66, - 164, 224, 176, 62, 77, 32, 117, 102, 213, 226, 149, 47, 119, 102, 214, 85, - 171, 238, 151, 114, 206, 199, 156, 190, 71, 183, 108, 120, 137, 96, 112, 196, - 113, 163, 65, 75, 105, 208, 183, 14, 44, 94, 198, 20, 83, 106, 211, 213, - 56, 231, 16, 16, 115, 165, 133, 93, 182, 167, 69, 250, 165, 99, 135, 73, - 236, 51, 139, 151, 59, 74, 208, 101, 148, 75, 44, 82, 37, 36, 118, 152, - 196, 62, 179, 204, 204, 31, 54, 102, 142, 99, 115, 214, 162, 74, 216, 210, - 92, 198, 192, 172, 158, 187, 207, 252, 153, 50, 97, 169, 76, 162, 143, 243, - 207, 93, 6, 94, 201, 249, 184, 178, 75, 192, 110, 107, 75, 126, 39, 168, - 212, 60, 218, 196, 56, 145, 145, 1, 91, 138, 2, 214, 31, 20, 160, 69, - 235, 54, 8, 89, 53, 248, 152, 208, 20, 11, 54, 110, 108, 119, 247, 99, - 197, 225, 37, 115, 212, 88, 217, 12, 202, 50, 84, 8, 3, 237, 247, 78, - 192, 139, 119, 114, 254, 168, 132, 190, 109, 172, 197, 16, 208, 115, 1, 16, - 252, 250, 96, 223, 181, 36, 103, 165, 218, 42, 174, 153, 166, 253, 200, 91, - 217, 229, 48, 60, 213, 235, 231, 204, 230, 197, 240, 7, 117, 252, 52, 193, - 255, 103, 49, 182, 79, 214, 147, 185, 156, 66, 94, 66, 207, 233, 108, 123, - 70, 184, 165, 170, 93, 155, 252, 161, 43, 185, 72, 87, 66, 196, 84, 124, - 242, 156, 169, 85, 58, 167, 158, 200, 4, 232, 243, 2, 192, 247, 171, 53, - 156, 152, 238, 178, 225, 241, 98, 113, 62, 210, 178, 214, 112, 85, 11, 157, - 43, 172, 115, 197, 251, 116, 132, 44, 9, 5, 168, 105, 89, 209, 78, 247, - 60, 224, 195, 61, 91, 57, 154, 75, 16, 0, 183, 75, 123, 8, 119, 232, - 31, 95, 125, 255, 203, 234, 155, 111, 40, 244, 221, 106, 101, 3, 177, 96, - 190, 240, 75, 121, 110, 89, 203, 247, 82, 229, 211, 167, 145, 246, 101, 39, - 110, 69, 98, 24, 141, 54, 65, 107, 27, 252, 86, 214, 192, 166, 205, 6, - 135, 141, 215, 68, 138, 104, 137, 107, 36, 185, 142, 190, 75, 173, 108, 77, - 194, 219, 78, 138, 152, 119, 115, 120, 124, 71, 113, 22, 223, 82, 111, 236, - 57, 155, 46, 90, 138, 59, 35, 222, 14, 117, 15, 211, 40, 192, 3, 112, - 168, 183, 33, 165, 88, 55, 173, 104, 74, 71, 178, 118, 77, 179, 44, 173, - 20, 10, 161, 129, 191, 250, 249, 165, 17, 250, 27, 75, 4, 219, 55, 137, - 9, 88, 79, 188, 211, 228, 172, 245, 139, 137, 150, 187, 250, 20, 206, 15, - 243, 216, 205, 103, 202, 181, 234, 105, 97, 108, 100, 229, 200, 149, 84, 122, - 176, 133, 147, 243, 233, 255, 54, 242, 128, 126, 236, 94, 76, 237, 65, 150, - 17, 52, 130, 140, 0, 119, 195, 110, 139, 227, 14, 10, 195, 140, 63, 68, - 102, 198, 163, 62, 157, 104, 16, 181, 42, 40, 39, 171, 108, 128, 189, 59, - 167, 11, 46, 120, 37, 116, 247, 41, 86, 211, 173, 188, 101, 198, 195, 150, - 102, 82, 85, 118, 216, 217, 231, 196, 78, 56, 59, 119, 117, 84, 244, 236, - 34, 237, 184, 78, 115, 148, 122, 48, 243, 40, 162, 131, 252, 140, 172, 146, - 103, 116, 227, 237, 171, 26, 192, 8, 86, 151, 131, 206, 189, 59, 188, 185, - 185, 86, 167, 3, 16, 189, 239, 46, 100, 24, 144, 163, 234, 247, 213, 76, - 138, 229, 209, 43, 94, 188, 74, 182, 207, 224, 117, 105, 190, 214, 91, 197, - 232, 74, 64, 207, 44, 178, 20, 40, 182, 241, 225, 62, 137, 9, 215, 233, - 62, 164, 144, 234, 222, 195, 216, 118, 110, 134, 105, 151, 112, 241, 94, 157, - 252, 242, 74, 85, 217, 238, 67, 86, 151, 159, 12, 148, 53, 79, 169, 254, - 161, 172, 189, 207, 248, 167, 156, 200, 172, 237, 83, 58, 191, 128, 168, 224, - 7, 26, 206, 57, 237, 231, 90, 10, 100, 242, 8, 10, 68, 140, 70, 230, - 105, 188, 65, 196, 252, 166, 138, 228, 181, 29, 98, 71, 255, 240, 141, 255, - 19, 220, 125, 202, 44, 64, 17, 96, 210, 157, 224, 86, 203, 173, 210, 154, - 29, 221, 224, 101, 68, 124, 116, 76, 248, 73, 4, 18, 10, 143, 254, 204, - 185, 136, 181, 173, 132, 21, 23, 191, 30, 252, 216, 162, 243, 161, 199, 61, - 139, 121, 182, 85, 75, 50, 17, 190, 254, 130, 28, 255, 207, 192, 251, 27, - 167, 23, 61, 252, 148, 105, 205, 204, 220, 191, 141, 34, 211, 221, 149, 40, - 136, 193, 10, 159, 104, 4, 101, 27, 3, 11, 37, 51, 113, 44, 77, 178, - 24, 205, 198, 106, 1, 240, 53, 25, 104, 107, 162, 31, 0, 216, 149, 178, - 136, 187, 192, 70, 178, 253, 43, 158, 103, 167, 55, 35, 9, 235, 106, 88, - 252, 36, 94, 34, 234, 33, 110, 58, 154, 181, 123, 144, 23, 35, 164, 54, - 232, 142, 47, 187, 34, 80, 74, 139, 76, 247, 34, 45, 15, 19, 1, 101, - 94, 141, 198, 241, 123, 159, 194, 13, 122, 0, 121, 158, 97, 66, 26, 209, - 101, 52, 132, 218, 141, 174, 165, 211, 157, 68, 151, 67, 113, 15, 35, 69, - 126, 104, 157, 143, 35, 66, 229, 246, 203, 104, 60, 235, 247, 35, 20, 119, - 25, 60, 241, 28, 211, 162, 126, 102, 32, 121, 2, 84, 111, 58, 189, 122, - 182, 179, 115, 169, 202, 182, 165, 104, 245, 146, 198, 54, 59, 175, 70, 163, - 29, 116, 100, 7, 85, 101, 128, 248, 85, 95, 40, 182, 254, 75, 158, 46, - 38, 237, 209, 184, 11, 89, 167, 90, 199, 110, 120, 44, 248, 238, 129, 30, - 107, 202, 94, 104, 18, 138, 86, 146, 229, 207, 152, 96, 6, 19, 37, 214, - 9, 116, 235, 165, 69, 121, 238, 50, 67, 144, 54, 66, 187, 53, 238, 176, - 11, 228, 209, 197, 69, 184, 140, 78, 181, 216, 56, 46, 112, 197, 51, 121, - 37, 166, 11, 160, 67, 201, 223, 16, 202, 91, 200, 231, 209, 81, 176, 162, - 77, 0, 237, 171, 217, 33, 236, 110, 225, 134, 79, 84, 13, 183, 229, 12, - 93, 135, 168, 221, 133, 125, 186, 12, 202, 206, 112, 69, 148, 30, 81, 193, - 154, 181, 186, 107, 19, 77, 204, 76, 32, 119, 185, 183, 95, 118, 230, 37, - 63, 32, 66, 124, 233, 63, 245, 202, 206, 66, 7, 232, 14, 115, 72, 127, - 11, 96, 188, 22, 119, 118, 137, 128, 69, 17, 69, 236, 201, 179, 53, 245, - 44, 103, 142, 90, 156, 2, 192, 160, 191, 45, 76, 82, 25, 110, 84, 242, - 119, 203, 91, 198, 124, 162, 229, 253, 148, 35, 18, 251, 58, 92, 86, 228, - 177, 220, 253, 11, 94, 204, 203, 116, 73, 194, 40, 10, 14, 11, 141, 192, - 117, 159, 115, 77, 112, 160, 158, 33, 38, 40, 2, 38, 220, 27, 100, 172, - 56, 39, 21, 230, 213, 13, 170, 212, 53, 230, 106, 212, 221, 186, 117, 238, - 133, 212, 65, 215, 127, 74, 55, 255, 189, 167, 246, 185, 31, 6, 181, 125, - 55, 0, 199, 214, 223, 183, 207, 3, 10, 238, 81, 176, 206, 87, 173, 243, - 90, 24, 212, 145, 113, 207, 37, 80, 88, 231, 117, 10, 18, 116, 235, 79, - 221, 167, 84, 180, 65, 161, 93, 74, 168, 187, 79, 27, 246, 249, 46, 135, - 158, 214, 221, 6, 37, 237, 73, 53, 30, 149, 243, 235, 86, 219, 11, 125, - 255, 41, 125, 130, 87, 69, 183, 48, 106, 147, 170, 64, 118, 170, 221, 158, - 120, 97, 206, 206, 89, 141, 192, 115, 119, 107, 30, 243, 40, 46, 218, 224, - 133, 129, 131, 77, 221, 170, 61, 181, 192, 240, 228, 141, 8, 254, 25, 213, - 178, 79, 205, 18, 101, 239, 113, 194, 93, 136, 136, 49, 50, 163, 31, 46, - 254, 148, 153, 112, 82, 60, 230, 39, 86, 237, 122, 16, 32, 190, 225, 249, - 46, 47, 32, 127, 159, 250, 190, 87, 115, 253, 93, 225, 183, 254, 252, 242, - 167, 183, 175, 114, 110, 189, 70, 29, 167, 116, 94, 99, 9, 224, 244, 122, - 242, 3, 203, 199, 160, 241, 163, 198, 225, 44, 207, 69, 49, 248, 200, 221, - 43, 210, 105, 80, 150, 200, 246, 210, 193, 186, 93, 89, 19, 63, 92, 6, - 191, 97, 126, 133, 127, 191, 156, 32, 197, 91, 41, 71, 171, 204, 66, 182, - 82, 60, 28, 131, 117, 111, 11, 175, 187, 73, 232, 162, 13, 134, 183, 240, - 116, 233, 254, 88, 229, 2, 201, 189, 177, 10, 134, 240, 6, 239, 168, 77, - 222, 98, 167, 65, 69, 56, 181, 110, 131, 185, 88, 141, 212, 240, 57, 163, - 202, 178, 231, 238, 165, 65, 35, 220, 112, 78, 180, 198, 96, 1, 214, 61, - 230, 105, 50, 19, 31, 239, 5, 129, 205, 92, 86, 216, 213, 2, 115, 186, - 230, 89, 147, 171, 113, 52, 237, 210, 18, 173, 113, 41, 222, 76, 9, 119, - 146, 25, 76, 185, 229, 239, 181, 167, 191, 175, 114, 199, 175, 95, 158, 241, - 4, 230, 108, 49, 80, 221, 36, 194, 63, 140, 189, 98, 6, 246, 58, 150, - 225, 177, 117, 70, 204, 113, 79, 202, 88, 107, 27, 147, 89, 18, 180, 170, - 179, 221, 75, 48, 194, 30, 133, 159, 10, 191, 97, 223, 227, 89, 215, 83, - 218, 246, 213, 100, 49, 242, 19, 206, 68, 35, 97, 188, 39, 176, 231, 89, - 218, 79, 243, 173, 177, 210, 104, 23, 97, 165, 237, 62, 205, 172, 52, 205, - 144, 86, 121, 214, 153, 208, 12, 44, 3, 20, 124, 253, 44, 243, 251, 134, - 207, 88, 245, 143, 2, 33, 150, 48, 140, 62, 126, 252, 163, 16, 127, 128, - 217, 29, 71, 186, 158, 124, 70, 97, 232, 231, 153, 80, 241, 220, 232, 152, - 2, 254, 202, 106, 245, 161, 139, 145, 227, 199, 218, 159, 174, 249, 149, 245, - 221, 240, 229, 104, 120, 57, 110, 77, 225, 50, 11, 58, 40, 143, 236, 255, - 26, 205, 236, 203, 209, 212, 220, 93, 83, 62, 221, 223, 13, 109, 27, 169, - 99, 155, 1, 195, 143, 19, 12, 161, 220, 79, 255, 158, 179, 248, 117, 81, - 95, 164, 225, 242, 117, 99, 107, 223, 182, 58, 118, 127, 214, 126, 47, 205, - 16, 57, 46, 237, 224, 244, 189, 103, 11, 138, 163, 0, 252, 12, 197, 95, - 126, 191, 162, 3, 42, 185, 207, 115, 12, 63, 172, 70, 201, 231, 117, 252, - 201, 48, 41, 185, 47, 222, 190, 253, 233, 87, 102, 92, 0, 177, 199, 169, - 207, 114, 246, 0, 34, 31, 233, 240, 181, 17, 78, 26, 245, 213, 104, 85, - 101, 111, 95, 255, 240, 215, 108, 109, 176, 37, 10, 135, 157, 254, 190, 151, - 173, 216, 76, 178, 210, 109, 216, 80, 36, 235, 99, 187, 141, 193, 83, 239, - 237, 212, 98, 231, 102, 19, 123, 110, 87, 78, 105, 221, 156, 217, 96, 5, - 243, 7, 69, 195, 231, 146, 242, 151, 218, 178, 23, 219, 251, 248, 31, 111, - 182, 116, 176, 242, 116, 107, 7, 159, 62, 180, 127, 227, 107, 213, 47, 172, - 91, 238, 37, 247, 241, 222, 157, 252, 238, 167, 95, 79, 182, 116, 115, 123, - 47, 43, 159, 209, 77, 5, 76, 255, 206, 110, 42, 14, 97, 201, 29, 43, - 42, 33, 197, 232, 98, 156, 164, 50, 11, 179, 136, 206, 253, 184, 59, 4, - 133, 24, 177, 173, 225, 43, 171, 204, 110, 201, 23, 154, 100, 56, 173, 212, - 25, 33, 123, 246, 66, 127, 82, 135, 245, 103, 61, 81, 46, 176, 91, 58, - 114, 97, 49, 253, 197, 124, 126, 3, 133, 44, 13, 52, 249, 241, 227, 35, - 248, 100, 102, 158, 238, 133, 202, 42, 148, 75, 154, 96, 209, 207, 5, 224, - 151, 93, 199, 129, 248, 121, 16, 112, 195, 99, 13, 104, 15, 134, 71, 33, - 26, 16, 194, 57, 46, 126, 243, 13, 46, 69, 239, 233, 216, 219, 169, 218, - 13, 155, 253, 172, 5, 246, 34, 166, 199, 248, 232, 18, 198, 114, 234, 141, - 206, 64, 207, 229, 100, 254, 40, 107, 130, 197, 55, 96, 109, 147, 76, 83, - 103, 30, 80, 131, 198, 165, 194, 208, 163, 131, 183, 163, 104, 88, 11, 16, - 190, 47, 185, 150, 16, 106, 214, 28, 180, 170, 115, 116, 166, 104, 210, 2, - 7, 52, 65, 54, 84, 137, 68, 178, 169, 135, 133, 249, 145, 39, 140, 64, - 32, 222, 130, 51, 175, 16, 49, 178, 40, 174, 194, 144, 200, 83, 33, 90, - 61, 69, 179, 114, 96, 233, 12, 161, 45, 178, 68, 198, 21, 199, 86, 171, - 113, 14, 243, 84, 84, 227, 40, 131, 158, 40, 160, 80, 81, 244, 157, 161, - 92, 194, 47, 55, 206, 145, 165, 221, 203, 169, 156, 142, 20, 209, 206, 183, - 189, 149, 113, 212, 48, 131, 32, 53, 98, 61, 173, 107, 103, 169, 164, 208, - 245, 214, 152, 155, 120, 106, 214, 102, 112, 125, 170, 78, 43, 53, 110, 242, - 43, 146, 192, 242, 72, 95, 86, 3, 230, 197, 85, 171, 241, 113, 109, 74, - 29, 232, 243, 61, 182, 100, 181, 107, 165, 214, 155, 177, 224, 202, 153, 97, - 128, 105, 95, 197, 209, 77, 52, 236, 114, 223, 171, 160, 207, 204, 248, 7, - 241, 71, 51, 124, 184, 179, 91, 92, 185, 180, 23, 207, 192, 75, 143, 193, - 108, 87, 192, 148, 135, 84, 44, 93, 44, 120, 191, 166, 22, 44, 195, 134, - 201, 36, 209, 131, 22, 139, 50, 41, 148, 145, 38, 116, 54, 80, 68, 82, - 242, 225, 60, 233, 228, 192, 92, 171, 211, 93, 91, 2, 137, 212, 166, 18, - 86, 218, 196, 41, 225, 4, 187, 203, 178, 83, 96, 150, 72, 248, 159, 154, - 91, 242, 173, 209, 229, 59, 184, 38, 219, 229, 26, 53, 63, 67, 166, 105, - 7, 108, 141, 29, 97, 46, 11, 72, 254, 15, 202, 54, 110, 100, 24, 136, - 154, 163, 119, 224, 253, 230, 29, 248, 193, 62, 253, 214, 98, 66, 117, 186, - 237, 225, 71, 4, 77, 46, 88, 251, 144, 46, 52, 250, 28, 208, 47, 129, - 190, 126, 8, 199, 35, 139, 189, 188, 8, 123, 116, 225, 111, 148, 104, 233, - 92, 175, 158, 251, 213, 198, 51, 255, 128, 159, 176, 74, 225, 133, 236, 190, - 236, 93, 34, 37, 83, 105, 193, 203, 212, 240, 50, 172, 64, 72, 10, 88, - 156, 159, 150, 75, 132, 150, 111, 86, 59, 252, 142, 188, 178, 22, 28, 187, - 224, 216, 30, 199, 246, 40, 246, 60, 228, 71, 100, 123, 216, 109, 17, 124, - 167, 168, 1, 254, 200, 157, 101, 133, 254, 40, 52, 15, 21, 93, 139, 74, - 197, 175, 251, 65, 124, 102, 248, 84, 9, 28, 125, 251, 46, 164, 38, 74, - 5, 191, 12, 153, 9, 126, 168, 131, 152, 68, 25, 158, 249, 74, 206, 199, - 18, 30, 225, 138, 140, 197, 251, 209, 213, 164, 11, 44, 225, 254, 133, 128, - 68, 199, 192, 24, 255, 3, 94, 136, 218, 173, 236, 177, 57, 42, 214, 90, - 199, 137, 194, 249, 86, 197, 223, 128, 41, 23, 28, 242, 17, 210, 79, 219, - 157, 67, 56, 18, 215, 157, 119, 142, 176, 119, 68, 204, 139, 229, 106, 148, - 241, 215, 64, 48, 233, 57, 94, 245, 172, 50, 76, 61, 17, 2, 61, 162, - 195, 164, 225, 217, 135, 56, 132, 234, 30, 4, 7, 4, 117, 151, 75, 138, - 92, 96, 95, 195, 9, 81, 80, 130, 176, 193, 174, 221, 174, 138, 56, 89, - 226, 135, 145, 59, 66, 208, 194, 67, 234, 116, 68, 72, 151, 190, 115, 54, - 126, 209, 37, 116, 217, 171, 4, 79, 87, 144, 96, 11, 32, 84, 97, 243, - 3, 228, 45, 15, 143, 180, 172, 150, 65, 73, 32, 125, 235, 203, 35, 50, - 170, 108, 234, 154, 192, 199, 92, 121, 58, 194, 81, 27, 139, 47, 167, 69, - 111, 193, 16, 240, 232, 188, 104, 184, 53, 17, 30, 113, 149, 132, 155, 133, - 142, 231, 74, 246, 218, 123, 16, 20, 219, 249, 173, 138, 153, 17, 204, 198, - 212, 27, 157, 254, 179, 74, 246, 250, 155, 14, 43, 44, 196, 57, 227, 140, - 199, 81, 167, 67, 120, 123, 115, 78, 60, 235, 164, 235, 229, 55, 28, 218, - 204, 178, 145, 255, 150, 167, 188, 127, 155, 241, 238, 149, 244, 151, 162, 22, - 192, 183, 32, 194, 5, 172, 0, 7, 33, 183, 22, 107, 174, 9, 62, 166, - 85, 193, 215, 172, 54, 236, 150, 12, 149, 93, 136, 254, 2, 210, 173, 216, - 161, 251, 158, 150, 50, 3, 4, 238, 156, 22, 218, 149, 159, 54, 49, 152, - 115, 117, 20, 10, 217, 116, 232, 125, 252, 232, 44, 64, 164, 224, 153, 46, - 26, 206, 186, 241, 131, 252, 249, 55, 190, 90, 218, 106, 81, 31, 133, 68, - 99, 125, 252, 72, 72, 88, 246, 56, 133, 181, 88, 7, 135, 81, 139, 218, - 253, 186, 8, 42, 11, 177, 1, 28, 88, 225, 86, 249, 108, 137, 89, 128, - 97, 36, 49, 178, 96, 10, 76, 126, 185, 203, 89, 129, 153, 70, 176, 113, - 49, 43, 84, 60, 126, 117, 175, 73, 200, 115, 175, 34, 246, 58, 205, 223, - 94, 213, 243, 158, 74, 96, 183, 206, 210, 145, 169, 239, 34, 145, 233, 191, - 129, 190, 215, 56, 105, 9, 113, 54, 192, 64, 89, 131, 59, 255, 38, 88, - 27, 225, 138, 238, 46, 212, 59, 56, 223, 37, 58, 65, 39, 156, 177, 194, - 56, 159, 224, 9, 122, 178, 205, 154, 136, 16, 125, 15, 202, 129, 71, 146, - 224, 192, 79, 34, 18, 82, 231, 190, 18, 78, 222, 120, 244, 107, 233, 117, - 150, 21, 22, 137, 126, 43, 41, 242, 79, 78, 4, 164, 58, 127, 143, 199, - 147, 91, 120, 244, 255, 7, 143, 117, 126, 7, 104, 176, 204, 165, 240, 111, - 69, 136, 141, 101, 216, 158, 218, 16, 172, 11, 104, 19, 159, 132, 126, 124, - 2, 58, 39, 22, 64, 137, 77, 175, 121, 252, 181, 192, 221, 199, 97, 231, - 210, 33, 250, 246, 135, 111, 87, 214, 212, 57, 10, 121, 127, 209, 238, 178, - 231, 8, 120, 144, 45, 246, 32, 13, 140, 168, 158, 164, 251, 13, 22, 26, - 130, 25, 10, 206, 164, 94, 1, 26, 124, 141, 47, 150, 40, 131, 187, 95, - 84, 206, 184, 7, 215, 252, 36, 240, 8, 20, 56, 17, 15, 55, 154, 120, - 152, 109, 34, 30, 214, 72, 135, 180, 254, 5, 164, 235, 188, 234, 158, 146, - 176, 131, 240, 204, 205, 202, 221, 19, 81, 165, 26, 232, 137, 83, 231, 228, - 204, 28, 47, 110, 218, 71, 148, 201, 62, 239, 241, 87, 143, 137, 11, 103, - 73, 227, 88, 149, 96, 210, 155, 229, 116, 150, 83, 4, 9, 115, 236, 18, - 48, 42, 206, 121, 111, 135, 246, 125, 7, 172, 5, 241, 53, 14, 196, 69, - 39, 125, 197, 89, 224, 174, 233, 81, 101, 21, 186, 197, 217, 231, 55, 184, - 204, 217, 148, 145, 141, 233, 178, 96, 95, 165, 224, 116, 118, 168, 6, 62, - 248, 69, 159, 16, 21, 197, 72, 115, 73, 240, 90, 149, 157, 243, 155, 157, - 224, 232, 134, 233, 7, 51, 170, 130, 158, 222, 72, 229, 61, 186, 83, 2, - 84, 78, 103, 149, 45, 90, 167, 162, 10, 242, 21, 103, 137, 143, 213, 74, - 221, 56, 146, 156, 21, 174, 145, 186, 206, 141, 112, 237, 146, 112, 87, 19, - 92, 176, 142, 49, 111, 110, 162, 60, 102, 43, 27, 148, 203, 165, 129, 178, - 56, 83, 45, 150, 127, 213, 92, 240, 101, 226, 156, 99, 233, 156, 208, 242, - 161, 236, 88, 102, 73, 207, 216, 70, 17, 210, 122, 171, 10, 93, 59, 9, - 184, 149, 61, 47, 150, 1, 102, 186, 37, 185, 23, 211, 4, 1, 214, 83, - 107, 142, 15, 34, 166, 166, 37, 221, 43, 89, 101, 101, 145, 188, 6, 13, - 83, 66, 53, 64, 229, 168, 207, 30, 68, 64, 107, 85, 194, 206, 68, 21, - 157, 82, 123, 116, 175, 63, 139, 57, 30, 88, 66, 189, 202, 158, 191, 210, - 172, 99, 17, 189, 74, 200, 74, 251, 139, 147, 76, 56, 155, 33, 227, 138, - 191, 189, 187, 207, 103, 17, 135, 85, 231, 179, 253, 48, 97, 39, 28, 24, - 235, 246, 106, 50, 242, 10, 207, 108, 165, 140, 8, 147, 163, 225, 146, 229, - 23, 62, 218, 237, 193, 66, 126, 191, 167, 63, 189, 73, 196, 191, 251, 252, - 251, 154, 126, 211, 9, 128, 223, 116, 206, 124, 180, 23, 237, 243, 246, 152, - 227, 232, 60, 79, 84, 253, 94, 92, 93, 245, 23, 202, 232, 178, 106, 106, - 100, 152, 251, 37, 116, 115, 250, 226, 76, 41, 118, 186, 74, 239, 151, 205, - 207, 36, 138, 127, 74, 12, 196, 208, 215, 159, 218, 249, 164, 179, 140, 80, - 243, 104, 150, 191, 90, 220, 32, 247, 66, 219, 163, 79, 181, 174, 109, 171, - 142, 174, 186, 67, 101, 236, 40, 211, 210, 100, 187, 117, 13, 3, 68, 4, - 160, 60, 142, 209, 12, 20, 149, 125, 71, 31, 233, 178, 157, 78, 197, 180, - 204, 217, 163, 80, 58, 41, 140, 184, 127, 244, 81, 43, 246, 30, 54, 205, - 206, 133, 204, 134, 243, 220, 213, 218, 184, 176, 12, 98, 39, 67, 175, 230, - 82, 227, 10, 213, 184, 96, 73, 162, 146, 146, 119, 155, 183, 219, 2, 158, - 115, 209, 186, 161, 150, 141, 17, 52, 155, 105, 224, 209, 50, 207, 20, 217, - 36, 40, 243, 245, 254, 253, 75, 46, 238, 95, 114, 113, 255, 146, 139, 219, - 248, 79, 56, 72, 155, 54, 172, 111, 167, 183, 108, 232, 240, 101, 102, 170, - 164, 222, 236, 196, 118, 87, 31, 228, 194, 70, 132, 8, 25, 106, 38, 14, - 151, 23, 209, 116, 66, 64, 239, 14, 79, 207, 222, 217, 204, 11, 114, 153, - 247, 195, 186, 69, 251, 68, 226, 61, 137, 245, 151, 106, 86, 185, 95, 181, - 209, 246, 229, 8, 250, 202, 118, 219, 142, 53, 43, 237, 160, 177, 235, 10, - 207, 3, 25, 162, 225, 197, 72, 140, 119, 53, 155, 47, 61, 184, 154, 121, - 233, 243, 239, 128, 127, 215, 248, 119, 61, 52, 149, 5, 121, 80, 47, 65, - 217, 114, 145, 56, 66, 19, 112, 169, 108, 190, 100, 243, 227, 108, 254, 198, - 108, 129, 100, 11, 226, 108, 193, 198, 108, 53, 201, 86, 139, 179, 213, 54, - 102, 171, 75, 182, 122, 156, 173, 142, 108, 115, 48, 182, 10, 124, 188, 84, - 26, 187, 74, 175, 10, 15, 35, 18, 123, 189, 170, 244, 16, 163, 184, 100, - 97, 216, 72, 180, 43, 237, 28, 8, 13, 64, 78, 160, 71, 84, 184, 51, - 207, 209, 47, 112, 31, 114, 172, 30, 139, 39, 223, 38, 63, 56, 123, 185, - 119, 57, 162, 32, 228, 24, 111, 94, 40, 107, 68, 62, 179, 211, 1, 49, - 42, 166, 156, 147, 229, 88, 51, 119, 173, 234, 165, 51, 47, 7, 251, 222, - 106, 91, 3, 254, 214, 6, 24, 212, 113, 253, 254, 150, 250, 185, 235, 68, - 179, 151, 233, 126, 178, 218, 80, 127, 176, 173, 126, 158, 162, 184, 250, 64, - 85, 95, 77, 73, 73, 168, 254, 19, 128, 85, 255, 237, 236, 206, 168, 212, - 207, 114, 250, 210, 79, 96, 222, 253, 194, 96, 70, 253, 95, 27, 206, 95, - 27, 208, 91, 32, 125, 203, 0, 110, 105, 165, 118, 219, 116, 214, 226, 70, - 106, 159, 58, 157, 141, 212, 116, 238, 125, 241, 233, 108, 124, 229, 233, 212, - 11, 230, 107, 206, 231, 159, 51, 161, 91, 102, 244, 142, 86, 118, 55, 183, - 82, 191, 109, 217, 212, 227, 70, 234, 159, 186, 108, 118, 207, 88, 138, 153, - 57, 126, 192, 206, 234, 180, 178, 12, 247, 49, 198, 28, 65, 121, 200, 89, - 42, 116, 142, 39, 215, 18, 76, 241, 53, 26, 79, 216, 112, 33, 134, 38, - 146, 5, 141, 132, 165, 63, 233, 241, 193, 121, 68, 36, 215, 21, 46, 220, - 198, 227, 38, 223, 135, 81, 21, 148, 195, 168, 77, 190, 254, 113, 100, 242, - 184, 168, 59, 228, 38, 249, 220, 248, 196, 100, 11, 255, 217, 251, 141, 197, - 112, 3, 63, 232, 92, 46, 197, 202, 32, 41, 69, 204, 197, 32, 181, 100, - 112, 248, 79, 149, 163, 97, 139, 15, 230, 5, 57, 10, 202, 171, 241, 203, - 246, 50, 255, 255, 229, 117, 9, 101, 152, 202, 42, 119, 232, 230, 212, 170, - 218, 25, 104, 103, 89, 66, 108, 212, 1, 51, 201, 165, 185, 164, 30, 13, - 212, 206, 71, 56, 232, 71, 56, 231, 71, 56, 230, 71, 56, 229, 71, 116, - 90, 178, 129, 25, 182, 35, 128, 87, 94, 225, 114, 227, 2, 53, 236, 118, - 59, 176, 124, 64, 244, 91, 143, 146, 70, 113, 54, 71, 127, 193, 69, 65, - 123, 58, 238, 135, 169, 91, 186, 112, 186, 85, 140, 8, 25, 173, 108, 165, - 40, 105, 43, 69, 201, 68, 44, 37, 213, 138, 22, 172, 113, 84, 197, 74, - 48, 161, 228, 86, 98, 38, 1, 63, 132, 149, 252, 128, 150, 128, 187, 228, - 247, 47, 9, 220, 183, 162, 151, 233, 138, 246, 189, 164, 30, 124, 223, 183, - 154, 183, 25, 46, 196, 198, 98, 252, 42, 247, 13, 44, 42, 106, 208, 45, - 181, 194, 40, 108, 72, 30, 222, 236, 224, 5, 135, 63, 131, 18, 2, 129, - 91, 147, 7, 182, 164, 116, 160, 212, 204, 230, 252, 134, 192, 159, 11, 126, - 62, 152, 183, 67, 218, 107, 84, 76, 158, 6, 237, 5, 194, 139, 82, 79, - 61, 10, 218, 229, 15, 188, 15, 230, 109, 215, 89, 208, 143, 252, 53, 183, - 89, 1, 27, 11, 155, 202, 21, 145, 144, 29, 222, 87, 169, 64, 81, 140, - 22, 47, 111, 160, 132, 167, 69, 145, 70, 99, 136, 46, 184, 11, 155, 75, - 135, 203, 223, 12, 123, 89, 49, 39, 166, 226, 139, 176, 135, 177, 182, 104, - 183, 167, 160, 132, 183, 131, 36, 248, 241, 163, 19, 175, 176, 71, 201, 18, - 91, 153, 61, 22, 74, 185, 233, 44, 71, 232, 54, 168, 101, 14, 201, 40, - 242, 103, 43, 107, 3, 230, 184, 31, 214, 176, 98, 151, 85, 25, 228, 33, - 34, 144, 74, 112, 149, 226, 19, 198, 91, 122, 198, 109, 116, 41, 212, 13, - 90, 218, 190, 46, 164, 33, 204, 140, 66, 101, 198, 64, 193, 60, 150, 19, - 68, 115, 202, 114, 46, 169, 44, 79, 136, 50, 189, 9, 128, 92, 96, 212, - 9, 204, 193, 149, 125, 30, 154, 85, 248, 60, 213, 203, 71, 206, 249, 10, - 175, 165, 75, 231, 38, 168, 72, 156, 115, 78, 67, 185, 81, 22, 23, 146, - 86, 170, 114, 71, 80, 1, 59, 177, 195, 96, 195, 124, 9, 222, 83, 159, - 168, 55, 110, 37, 134, 226, 169, 87, 73, 163, 163, 130, 188, 209, 211, 201, - 17, 100, 92, 4, 63, 209, 168, 111, 68, 107, 52, 65, 27, 247, 124, 198, - 73, 190, 127, 126, 243, 226, 229, 43, 51, 39, 174, 125, 194, 178, 139, 229, - 178, 18, 52, 171, 33, 206, 164, 191, 58, 37, 226, 105, 80, 43, 148, 223, - 155, 100, 62, 178, 247, 53, 245, 208, 99, 240, 109, 192, 195, 90, 89, 138, - 228, 8, 255, 127, 242, 222, 124, 161, 141, 92, 249, 31, 253, 191, 159, 162, - 227, 211, 25, 108, 119, 219, 238, 197, 54, 16, 104, 230, 11, 33, 11, 201, - 64, 200, 30, 134, 16, 174, 177, 141, 109, 240, 22, 47, 216, 141, 227, 251, - 74, 247, 33, 238, 139, 221, 90, 36, 181, 218, 24, 2, 51, 57, 223, 51, - 191, 115, 207, 153, 224, 110, 109, 45, 149, 164, 82, 73, 170, 250, 84, 138, - 48, 16, 232, 142, 17, 102, 159, 16, 19, 194, 148, 71, 26, 184, 37, 61, - 212, 231, 80, 17, 35, 67, 3, 40, 193, 167, 11, 7, 252, 151, 50, 133, - 208, 19, 190, 131, 109, 189, 16, 79, 194, 23, 184, 187, 19, 111, 126, 184, - 131, 176, 106, 98, 193, 15, 183, 209, 84, 24, 181, 4, 37, 31, 103, 245, - 206, 184, 35, 158, 164, 100, 44, 174, 79, 79, 204, 52, 125, 125, 3, 6, - 43, 254, 203, 224, 59, 62, 137, 48, 245, 46, 194, 50, 168, 162, 71, 250, - 60, 52, 41, 2, 97, 147, 159, 130, 133, 189, 34, 84, 168, 34, 24, 31, - 132, 78, 66, 79, 60, 80, 34, 41, 248, 105, 100, 171, 118, 34, 157, 108, - 146, 64, 26, 41, 188, 152, 152, 90, 168, 207, 161, 20, 227, 186, 63, 35, - 219, 211, 168, 210, 85, 116, 219, 135, 213, 174, 59, 170, 40, 202, 29, 213, - 209, 68, 235, 14, 218, 225, 142, 24, 26, 133, 231, 184, 62, 212, 23, 103, - 122, 197, 172, 46, 82, 84, 166, 130, 20, 8, 63, 33, 83, 45, 208, 25, - 43, 76, 250, 34, 142, 128, 40, 97, 122, 166, 245, 16, 247, 150, 112, 21, - 255, 107, 233, 127, 249, 107, 59, 64, 142, 102, 109, 140, 23, 127, 65, 183, - 224, 241, 149, 144, 52, 127, 222, 69, 151, 119, 246, 81, 145, 78, 225, 255, - 253, 157, 148, 142, 59, 171, 120, 123, 103, 21, 85, 103, 5, 170, 179, 68, - 183, 5, 183, 118, 91, 115, 216, 90, 228, 54, 49, 117, 85, 175, 37, 104, - 190, 200, 109, 180, 254, 185, 109, 218, 188, 84, 44, 197, 11, 223, 87, 70, - 210, 235, 145, 236, 33, 196, 51, 236, 14, 91, 163, 232, 158, 115, 7, 42, - 189, 246, 147, 201, 131, 73, 110, 239, 24, 185, 2, 7, 40, 251, 60, 170, - 58, 83, 60, 202, 202, 220, 8, 118, 241, 183, 10, 43, 156, 72, 112, 87, - 10, 16, 170, 33, 94, 125, 86, 204, 170, 126, 125, 208, 25, 143, 234, 242, - 117, 90, 141, 174, 255, 210, 236, 106, 14, 219, 255, 249, 110, 34, 136, 186, - 110, 125, 56, 188, 119, 55, 181, 127, 222, 77, 237, 255, 76, 55, 181, 255, - 77, 221, 116, 245, 159, 239, 166, 79, 149, 187, 87, 240, 100, 23, 93, 253, - 188, 139, 174, 30, 212, 69, 196, 201, 126, 69, 23, 93, 253, 91, 186, 168, - 93, 57, 91, 92, 166, 110, 138, 87, 72, 114, 90, 166, 18, 93, 36, 59, - 227, 30, 93, 180, 56, 85, 188, 240, 41, 98, 85, 85, 114, 219, 170, 155, - 68, 192, 206, 61, 122, 106, 136, 93, 37, 187, 160, 79, 170, 121, 24, 2, - 77, 65, 117, 208, 226, 93, 189, 39, 146, 99, 82, 44, 129, 146, 99, 222, - 225, 223, 157, 116, 126, 241, 231, 125, 170, 167, 193, 187, 2, 236, 87, 89, - 147, 95, 222, 175, 213, 230, 95, 238, 215, 155, 211, 244, 161, 253, 170, 122, - 245, 229, 189, 166, 222, 109, 29, 90, 109, 226, 108, 188, 111, 159, 66, 106, - 81, 200, 95, 234, 86, 119, 73, 135, 1, 37, 126, 218, 169, 254, 146, 78, - 149, 85, 249, 197, 157, 74, 250, 11, 247, 235, 86, 250, 119, 83, 170, 188, - 103, 183, 142, 85, 23, 122, 180, 1, 250, 106, 86, 147, 253, 10, 251, 165, - 133, 176, 159, 177, 86, 170, 251, 79, 120, 43, 165, 249, 219, 235, 31, 246, - 194, 207, 122, 77, 79, 35, 123, 45, 254, 250, 223, 237, 182, 33, 249, 193, - 188, 69, 119, 34, 185, 225, 93, 121, 98, 126, 236, 94, 118, 123, 147, 174, - 230, 110, 133, 239, 37, 73, 145, 129, 20, 27, 242, 9, 160, 9, 138, 69, - 124, 247, 39, 230, 105, 107, 120, 138, 135, 4, 149, 193, 8, 33, 173, 17, - 207, 218, 156, 59, 228, 130, 29, 182, 251, 189, 246, 24, 87, 66, 17, 179, - 21, 66, 67, 41, 118, 220, 30, 181, 228, 241, 10, 162, 141, 247, 199, 137, - 220, 199, 253, 10, 121, 240, 245, 78, 226, 103, 31, 159, 27, 131, 10, 226, - 172, 122, 39, 154, 123, 46, 174, 74, 45, 214, 150, 217, 249, 237, 243, 195, - 84, 101, 8, 181, 97, 203, 117, 148, 123, 41, 115, 37, 89, 255, 21, 161, - 36, 51, 76, 248, 169, 231, 187, 251, 56, 21, 227, 164, 11, 109, 144, 187, - 190, 119, 3, 147, 95, 163, 161, 135, 215, 221, 11, 212, 243, 92, 191, 200, - 78, 115, 87, 150, 82, 206, 141, 85, 108, 184, 83, 148, 122, 141, 139, 106, - 100, 1, 255, 20, 249, 167, 196, 63, 101, 212, 206, 21, 240, 224, 232, 104, - 21, 191, 49, 15, 67, 23, 79, 106, 45, 159, 122, 234, 151, 194, 130, 147, - 21, 61, 81, 44, 101, 14, 129, 67, 136, 246, 194, 11, 48, 6, 189, 85, - 16, 2, 76, 129, 16, 49, 106, 169, 95, 160, 188, 35, 7, 72, 114, 124, - 164, 208, 140, 253, 145, 229, 205, 231, 41, 235, 119, 189, 179, 218, 17, 59, - 150, 230, 94, 30, 119, 244, 254, 181, 124, 234, 4, 202, 235, 219, 143, 172, - 0, 114, 155, 220, 7, 48, 63, 254, 189, 26, 56, 15, 208, 187, 89, 84, - 182, 65, 172, 234, 218, 175, 86, 186, 25, 160, 154, 138, 212, 195, 248, 34, - 20, 51, 208, 127, 210, 189, 117, 113, 238, 85, 242, 33, 151, 92, 233, 70, - 147, 102, 125, 80, 103, 37, 81, 84, 130, 25, 210, 135, 144, 73, 145, 94, - 204, 72, 122, 202, 200, 47, 177, 110, 50, 33, 47, 12, 44, 66, 57, 225, - 226, 147, 90, 41, 132, 235, 50, 52, 63, 30, 22, 208, 110, 151, 191, 120, - 221, 67, 188, 53, 196, 217, 111, 117, 11, 208, 199, 170, 92, 61, 99, 39, - 89, 122, 172, 169, 242, 254, 229, 222, 243, 15, 55, 162, 241, 227, 75, 145, - 100, 200, 86, 130, 217, 9, 176, 15, 252, 116, 157, 65, 254, 151, 169, 248, - 208, 105, 40, 151, 55, 238, 215, 168, 167, 201, 71, 210, 116, 52, 0, 57, - 164, 77, 238, 40, 5, 101, 16, 112, 122, 89, 17, 31, 182, 119, 164, 146, - 117, 163, 129, 200, 193, 103, 245, 209, 4, 143, 28, 59, 149, 193, 37, 34, - 84, 80, 195, 241, 48, 121, 184, 44, 251, 206, 246, 211, 215, 90, 45, 100, - 15, 199, 238, 157, 18, 3, 128, 252, 62, 47, 43, 230, 112, 251, 197, 51, - 32, 122, 82, 249, 104, 40, 232, 64, 101, 64, 97, 183, 102, 140, 187, 74, - 170, 32, 221, 39, 235, 187, 100, 187, 149, 250, 13, 57, 237, 195, 6, 255, - 119, 107, 73, 161, 70, 253, 109, 203, 211, 191, 91, 81, 138, 213, 163, 14, - 66, 235, 145, 49, 106, 2, 53, 106, 167, 168, 1, 23, 166, 78, 227, 165, - 139, 245, 155, 60, 144, 117, 230, 41, 153, 136, 226, 66, 186, 187, 46, 186, - 172, 193, 239, 58, 95, 83, 135, 44, 21, 60, 33, 53, 58, 253, 126, 154, - 210, 31, 227, 61, 62, 61, 201, 35, 79, 18, 69, 209, 16, 94, 138, 22, - 161, 53, 75, 193, 43, 13, 153, 83, 88, 248, 81, 79, 171, 152, 154, 75, - 19, 120, 153, 204, 232, 87, 134, 67, 171, 8, 114, 9, 222, 223, 158, 205, - 151, 220, 204, 138, 164, 82, 90, 149, 87, 180, 162, 254, 234, 123, 170, 9, - 248, 47, 209, 132, 148, 149, 44, 34, 113, 223, 46, 162, 142, 83, 51, 235, - 17, 210, 69, 181, 140, 157, 24, 171, 154, 250, 203, 26, 84, 186, 209, 32, - 159, 27, 84, 186, 119, 131, 252, 91, 26, 228, 223, 191, 65, 254, 195, 26, - 36, 132, 188, 101, 237, 41, 199, 237, 17, 169, 184, 57, 229, 251, 52, 71, - 150, 187, 208, 30, 25, 76, 205, 177, 102, 95, 83, 154, 126, 157, 169, 16, - 150, 73, 70, 47, 185, 143, 191, 166, 230, 212, 214, 23, 156, 75, 111, 171, - 40, 136, 27, 139, 47, 98, 44, 46, 111, 168, 120, 14, 181, 241, 41, 12, - 254, 181, 209, 167, 0, 126, 227, 254, 211, 130, 196, 7, 231, 177, 17, 135, - 208, 31, 140, 129, 68, 181, 153, 230, 88, 250, 140, 210, 52, 29, 232, 42, - 47, 89, 132, 195, 134, 233, 247, 41, 72, 189, 201, 58, 47, 6, 248, 42, - 64, 118, 89, 252, 105, 86, 251, 200, 49, 116, 245, 137, 161, 43, 83, 144, - 36, 107, 160, 159, 161, 112, 214, 85, 234, 15, 9, 125, 138, 233, 77, 77, - 10, 210, 163, 48, 38, 33, 244, 27, 251, 167, 164, 225, 194, 182, 41, 195, - 48, 44, 178, 135, 167, 128, 10, 65, 147, 150, 86, 39, 215, 218, 207, 108, - 149, 33, 194, 206, 230, 25, 94, 53, 159, 71, 15, 162, 168, 56, 66, 210, - 6, 94, 94, 178, 211, 39, 50, 81, 67, 55, 207, 248, 70, 151, 215, 226, - 170, 152, 40, 40, 62, 33, 156, 72, 241, 13, 169, 105, 183, 199, 157, 86, - 23, 29, 30, 229, 133, 129, 60, 226, 86, 183, 58, 13, 227, 188, 214, 234, - 132, 11, 202, 156, 214, 196, 177, 154, 115, 115, 2, 245, 199, 6, 2, 41, - 49, 21, 52, 114, 210, 228, 16, 95, 133, 76, 93, 144, 213, 35, 252, 51, - 5, 150, 67, 142, 40, 35, 79, 24, 229, 241, 68, 195, 157, 3, 180, 7, - 151, 242, 83, 177, 174, 135, 190, 90, 28, 195, 117, 115, 218, 175, 80, 138, - 72, 252, 74, 79, 158, 60, 46, 165, 30, 237, 105, 50, 88, 215, 177, 108, - 140, 91, 167, 98, 173, 63, 165, 181, 126, 152, 217, 10, 203, 115, 211, 92, - 30, 199, 142, 69, 17, 69, 160, 44, 52, 7, 132, 191, 0, 73, 22, 78, - 199, 23, 226, 62, 218, 144, 208, 211, 100, 11, 105, 98, 15, 252, 218, 244, - 24, 8, 7, 115, 146, 208, 170, 128, 20, 147, 204, 220, 241, 185, 147, 48, - 58, 90, 136, 110, 82, 244, 121, 139, 83, 112, 164, 174, 81, 143, 43, 42, - 142, 141, 62, 144, 187, 223, 27, 65, 91, 91, 149, 54, 218, 63, 245, 155, - 122, 64, 115, 46, 208, 154, 68, 179, 19, 244, 200, 40, 253, 143, 233, 124, - 211, 85, 47, 209, 28, 77, 130, 132, 1, 138, 203, 21, 160, 55, 214, 62, - 213, 245, 94, 76, 105, 170, 221, 195, 223, 92, 111, 110, 220, 91, 133, 38, - 198, 117, 193, 164, 36, 115, 38, 211, 82, 144, 150, 152, 4, 210, 30, 238, - 181, 209, 88, 85, 216, 159, 162, 197, 22, 86, 202, 154, 186, 136, 47, 151, - 182, 166, 94, 14, 159, 189, 76, 193, 154, 76, 24, 196, 46, 34, 180, 185, - 180, 21, 65, 84, 36, 162, 128, 46, 61, 24, 169, 144, 198, 236, 193, 248, - 132, 0, 179, 7, 163, 18, 178, 154, 61, 24, 152, 144, 14, 222, 97, 153, - 157, 122, 240, 14, 191, 145, 167, 84, 124, 140, 46, 14, 241, 172, 83, 155, - 155, 93, 28, 218, 89, 167, 62, 55, 59, 33, 247, 28, 196, 57, 240, 7, - 122, 207, 168, 66, 181, 210, 92, 47, 143, 116, 116, 171, 136, 94, 194, 181, - 225, 128, 26, 86, 28, 114, 220, 172, 118, 45, 162, 152, 230, 205, 90, 79, - 17, 48, 187, 58, 205, 89, 181, 41, 22, 129, 243, 7, 94, 109, 126, 53, - 34, 138, 141, 32, 54, 34, 173, 96, 138, 141, 108, 126, 53, 176, 193, 240, - 57, 156, 144, 88, 248, 93, 202, 73, 220, 72, 50, 234, 194, 29, 52, 12, - 215, 73, 214, 203, 251, 165, 140, 104, 180, 136, 185, 194, 152, 166, 140, 89, - 66, 4, 54, 10, 14, 233, 187, 196, 27, 172, 14, 241, 3, 171, 153, 181, - 58, 208, 34, 97, 57, 135, 31, 179, 38, 20, 212, 36, 134, 97, 117, 52, - 155, 218, 101, 74, 79, 92, 65, 168, 86, 1, 63, 46, 106, 5, 117, 225, - 87, 250, 110, 178, 46, 48, 185, 139, 92, 3, 141, 4, 119, 124, 4, 117, - 52, 254, 30, 155, 51, 146, 108, 206, 82, 124, 206, 34, 70, 199, 223, 77, - 43, 200, 34, 137, 205, 189, 233, 102, 212, 28, 136, 81, 178, 96, 30, 243, - 120, 162, 129, 66, 56, 137, 83, 23, 141, 251, 166, 80, 56, 253, 222, 90, - 224, 214, 98, 129, 114, 82, 45, 41, 209, 22, 37, 218, 139, 37, 198, 180, - 209, 10, 76, 107, 184, 86, 218, 210, 142, 105, 209, 40, 148, 199, 59, 141, - 95, 42, 62, 162, 10, 71, 64, 3, 250, 189, 173, 248, 205, 27, 197, 19, - 34, 213, 189, 62, 96, 139, 15, 216, 218, 7, 176, 194, 162, 192, 27, 189, - 44, 107, 47, 135, 42, 19, 99, 203, 43, 75, 221, 52, 42, 28, 222, 121, - 62, 163, 91, 162, 88, 115, 237, 145, 86, 0, 34, 6, 105, 179, 29, 231, - 127, 196, 233, 163, 91, 210, 71, 142, 198, 12, 50, 106, 102, 219, 88, 74, - 14, 30, 50, 89, 68, 219, 196, 70, 241, 36, 198, 212, 16, 30, 137, 112, - 67, 78, 125, 238, 65, 45, 189, 167, 210, 123, 122, 250, 120, 168, 247, 54, - 239, 166, 7, 145, 27, 106, 116, 125, 142, 206, 157, 6, 108, 244, 154, 228, - 81, 78, 130, 49, 169, 153, 46, 114, 108, 122, 249, 224, 78, 130, 209, 23, - 30, 68, 50, 145, 227, 167, 68, 43, 220, 66, 180, 194, 45, 68, 43, 220, - 66, 52, 145, 158, 88, 180, 104, 213, 55, 31, 216, 241, 36, 71, 95, 18, - 44, 157, 248, 180, 30, 221, 204, 209, 7, 153, 193, 27, 11, 243, 105, 201, - 248, 68, 16, 40, 154, 133, 55, 203, 125, 104, 97, 9, 12, 2, 109, 178, - 200, 117, 83, 116, 17, 200, 75, 83, 185, 216, 227, 11, 217, 60, 99, 32, - 44, 118, 248, 27, 193, 98, 199, 162, 13, 86, 140, 237, 199, 41, 19, 84, - 46, 195, 53, 139, 3, 97, 165, 137, 50, 49, 223, 144, 85, 82, 85, 212, - 171, 134, 103, 95, 248, 25, 16, 214, 232, 51, 57, 133, 231, 6, 92, 252, - 81, 104, 193, 122, 44, 22, 245, 73, 147, 94, 155, 226, 21, 22, 230, 71, - 184, 50, 203, 215, 8, 95, 35, 245, 58, 245, 48, 214, 83, 177, 248, 26, - 121, 132, 181, 133, 230, 74, 40, 66, 146, 232, 116, 128, 114, 17, 202, 104, - 32, 37, 105, 18, 145, 76, 35, 132, 33, 8, 248, 45, 80, 236, 242, 75, - 44, 142, 0, 143, 88, 174, 186, 42, 67, 55, 173, 137, 12, 221, 180, 154, - 130, 218, 177, 52, 11, 237, 21, 209, 7, 115, 4, 184, 216, 0, 202, 161, - 80, 105, 29, 128, 156, 151, 203, 155, 199, 92, 57, 194, 116, 161, 9, 103, - 225, 202, 5, 11, 87, 129, 94, 120, 242, 57, 146, 219, 129, 156, 254, 29, - 50, 15, 209, 220, 89, 129, 190, 212, 96, 197, 131, 9, 212, 153, 155, 241, - 103, 105, 62, 97, 196, 150, 95, 66, 232, 153, 41, 46, 85, 2, 0, 228, - 54, 177, 144, 246, 100, 186, 52, 29, 171, 192, 38, 27, 21, 227, 126, 156, - 253, 38, 91, 167, 139, 236, 115, 195, 134, 18, 198, 157, 238, 80, 181, 46, - 206, 12, 2, 22, 130, 183, 185, 39, 32, 61, 226, 188, 63, 246, 224, 41, - 4, 130, 76, 233, 47, 57, 208, 48, 47, 84, 198, 188, 163, 101, 197, 6, - 64, 255, 82, 223, 170, 101, 228, 12, 149, 139, 85, 199, 101, 150, 214, 135, - 42, 123, 176, 197, 10, 165, 178, 104, 173, 69, 136, 5, 71, 120, 130, 183, - 127, 216, 28, 104, 25, 217, 107, 145, 116, 170, 38, 246, 77, 80, 51, 153, - 162, 165, 158, 104, 7, 38, 8, 105, 170, 186, 235, 147, 214, 147, 227, 2, - 157, 131, 161, 21, 24, 247, 134, 25, 81, 39, 231, 77, 47, 214, 109, 197, - 11, 51, 49, 152, 89, 213, 53, 238, 112, 216, 4, 243, 78, 60, 209, 240, - 197, 157, 20, 108, 44, 22, 232, 151, 32, 223, 33, 72, 7, 114, 143, 63, - 99, 179, 96, 103, 15, 42, 151, 181, 250, 19, 228, 254, 32, 79, 91, 253, - 38, 51, 126, 181, 177, 212, 54, 110, 210, 50, 62, 167, 107, 191, 242, 80, - 227, 210, 50, 243, 197, 29, 27, 84, 135, 163, 100, 133, 32, 247, 135, 237, - 157, 133, 154, 35, 18, 157, 246, 158, 243, 50, 143, 131, 185, 106, 202, 194, - 64, 125, 180, 84, 207, 253, 246, 97, 191, 88, 37, 238, 204, 68, 152, 236, - 21, 54, 211, 215, 24, 76, 242, 203, 64, 193, 237, 23, 207, 104, 205, 138, - 55, 173, 2, 41, 193, 146, 1, 57, 47, 115, 107, 213, 185, 0, 144, 19, - 244, 236, 32, 207, 174, 199, 217, 237, 59, 178, 67, 126, 117, 206, 61, 87, - 108, 199, 140, 71, 127, 60, 248, 93, 242, 189, 229, 11, 65, 188, 21, 90, - 28, 145, 28, 196, 86, 11, 7, 112, 183, 67, 15, 34, 129, 54, 132, 212, - 215, 5, 24, 158, 47, 215, 136, 88, 186, 68, 69, 239, 166, 22, 46, 165, - 54, 133, 154, 53, 117, 55, 115, 214, 132, 182, 52, 57, 177, 159, 163, 55, - 55, 196, 96, 5, 171, 17, 97, 178, 38, 237, 109, 114, 98, 111, 71, 111, - 152, 172, 25, 39, 155, 122, 91, 176, 169, 147, 69, 216, 44, 125, 227, 43, - 46, 177, 115, 37, 143, 115, 2, 85, 54, 102, 106, 202, 2, 109, 22, 212, - 241, 53, 71, 11, 138, 20, 221, 57, 129, 200, 244, 40, 57, 170, 111, 91, - 101, 104, 133, 65, 92, 9, 65, 176, 212, 225, 160, 87, 69, 119, 12, 221, - 70, 62, 159, 71, 132, 137, 18, 2, 100, 251, 230, 228, 88, 45, 88, 120, - 248, 115, 96, 200, 94, 96, 223, 221, 172, 185, 79, 107, 4, 79, 69, 102, - 230, 24, 39, 17, 73, 57, 174, 73, 59, 41, 140, 163, 252, 213, 118, 111, - 76, 56, 147, 14, 100, 131, 127, 77, 228, 204, 157, 126, 111, 8, 3, 91, - 249, 22, 132, 241, 105, 178, 191, 193, 90, 107, 56, 162, 115, 31, 96, 58, - 89, 68, 189, 118, 125, 230, 64, 223, 232, 152, 201, 166, 229, 74, 156, 49, - 72, 168, 79, 160, 144, 240, 13, 137, 103, 84, 196, 236, 70, 48, 69, 155, - 117, 114, 139, 68, 156, 51, 135, 254, 11, 249, 64, 35, 206, 238, 232, 207, - 168, 98, 128, 135, 82, 226, 80, 133, 201, 186, 108, 181, 190, 185, 190, 39, - 59, 100, 217, 65, 7, 199, 48, 61, 229, 201, 80, 13, 87, 59, 57, 212, - 29, 193, 234, 184, 204, 174, 228, 72, 42, 237, 137, 244, 97, 222, 149, 57, - 180, 40, 49, 45, 110, 57, 121, 226, 121, 121, 123, 221, 142, 87, 36, 107, - 97, 59, 16, 107, 105, 57, 104, 20, 18, 151, 179, 80, 59, 166, 201, 66, - 160, 115, 163, 158, 64, 167, 229, 117, 148, 21, 160, 47, 196, 131, 216, 78, - 164, 146, 76, 154, 134, 98, 178, 37, 206, 242, 58, 51, 98, 139, 98, 38, - 129, 83, 146, 154, 33, 121, 115, 122, 93, 141, 120, 84, 36, 178, 228, 31, - 82, 58, 14, 203, 184, 64, 84, 50, 177, 245, 197, 219, 117, 2, 134, 40, - 21, 238, 61, 229, 129, 157, 28, 92, 138, 50, 218, 41, 94, 28, 246, 23, - 70, 94, 156, 208, 232, 210, 246, 100, 234, 102, 229, 92, 237, 210, 190, 36, - 114, 197, 234, 137, 41, 144, 169, 76, 61, 45, 5, 6, 68, 158, 74, 1, - 114, 10, 29, 254, 177, 244, 135, 200, 180, 8, 104, 75, 160, 245, 66, 66, - 148, 246, 242, 36, 234, 77, 38, 155, 82, 12, 157, 52, 55, 155, 142, 239, - 120, 153, 219, 151, 60, 177, 48, 170, 206, 134, 37, 130, 169, 18, 46, 14, - 46, 177, 60, 36, 99, 177, 241, 104, 152, 211, 146, 131, 194, 234, 98, 45, - 187, 88, 205, 46, 214, 179, 251, 144, 138, 6, 25, 113, 224, 109, 162, 39, - 89, 98, 51, 124, 146, 173, 56, 20, 132, 6, 192, 225, 206, 218, 117, 116, - 144, 154, 207, 179, 203, 67, 173, 123, 149, 166, 84, 222, 188, 208, 49, 250, - 249, 96, 92, 105, 40, 229, 37, 127, 145, 125, 117, 147, 83, 171, 165, 237, - 70, 255, 138, 190, 213, 134, 192, 32, 159, 132, 185, 229, 213, 68, 174, 211, - 155, 235, 115, 179, 128, 224, 146, 184, 17, 21, 97, 115, 100, 161, 51, 207, - 95, 203, 166, 189, 156, 87, 72, 235, 113, 153, 140, 92, 92, 18, 162, 78, - 108, 106, 165, 132, 161, 16, 150, 161, 65, 165, 230, 133, 37, 252, 241, 195, - 64, 72, 44, 24, 20, 112, 208, 2, 0, 193, 79, 123, 159, 159, 195, 69, - 38, 41, 122, 63, 25, 75, 50, 144, 176, 102, 179, 90, 26, 195, 144, 50, - 191, 12, 36, 11, 180, 41, 65, 55, 187, 39, 36, 14, 100, 241, 224, 14, - 61, 126, 8, 241, 64, 34, 59, 123, 39, 36, 21, 100, 241, 32, 15, 163, - 213, 110, 7, 138, 196, 45, 66, 112, 130, 242, 246, 12, 97, 60, 197, 67, - 9, 31, 104, 157, 67, 47, 13, 232, 107, 130, 177, 3, 45, 164, 2, 174, - 136, 230, 205, 112, 159, 28, 84, 244, 218, 10, 181, 250, 246, 141, 16, 65, - 80, 190, 19, 87, 236, 244, 191, 179, 40, 94, 173, 117, 23, 23, 107, 136, - 166, 234, 121, 30, 251, 42, 128, 17, 167, 69, 161, 205, 26, 252, 183, 238, - 248, 104, 102, 145, 252, 136, 94, 6, 162, 173, 65, 33, 107, 203, 10, 241, - 74, 92, 202, 170, 44, 101, 57, 59, 20, 3, 155, 6, 181, 148, 37, 228, - 244, 131, 89, 73, 55, 77, 15, 55, 98, 147, 70, 107, 247, 18, 104, 204, - 243, 113, 187, 61, 168, 15, 111, 21, 108, 46, 143, 93, 7, 120, 154, 35, - 37, 27, 93, 102, 50, 65, 240, 24, 141, 135, 161, 144, 126, 196, 155, 140, - 255, 6, 243, 142, 184, 225, 205, 123, 16, 37, 229, 40, 222, 143, 194, 14, - 30, 214, 222, 20, 117, 84, 146, 251, 75, 60, 177, 144, 162, 161, 155, 163, - 32, 141, 135, 63, 225, 108, 134, 237, 65, 249, 126, 226, 192, 158, 168, 160, - 221, 192, 168, 64, 41, 30, 197, 187, 71, 52, 129, 12, 178, 124, 126, 196, - 147, 94, 137, 76, 42, 145, 38, 28, 153, 57, 21, 234, 197, 18, 136, 148, - 73, 140, 248, 162, 200, 225, 191, 66, 150, 50, 53, 65, 74, 240, 149, 128, - 186, 64, 50, 237, 138, 89, 229, 147, 40, 217, 47, 114, 31, 198, 204, 216, - 206, 50, 201, 89, 238, 75, 240, 99, 141, 29, 11, 185, 128, 182, 163, 146, - 43, 115, 113, 39, 11, 172, 89, 73, 16, 23, 234, 137, 235, 27, 243, 106, - 145, 81, 83, 41, 149, 85, 98, 110, 140, 14, 196, 187, 29, 88, 109, 42, - 157, 186, 218, 167, 194, 246, 99, 108, 90, 60, 96, 200, 186, 242, 52, 121, - 27, 203, 119, 169, 236, 130, 23, 123, 181, 36, 145, 107, 138, 166, 205, 158, - 93, 30, 163, 251, 115, 237, 90, 185, 1, 188, 162, 133, 83, 140, 209, 121, - 187, 210, 36, 31, 95, 43, 109, 40, 245, 180, 221, 171, 86, 218, 32, 238, - 178, 251, 117, 160, 144, 76, 195, 254, 191, 93, 40, 82, 124, 144, 142, 107, - 212, 119, 186, 114, 35, 143, 81, 240, 81, 121, 130, 163, 238, 18, 69, 159, - 107, 74, 171, 64, 241, 234, 168, 184, 12, 252, 243, 41, 199, 153, 207, 209, - 113, 135, 244, 148, 38, 51, 252, 179, 161, 63, 245, 170, 63, 216, 107, 218, - 130, 86, 161, 44, 235, 28, 201, 48, 234, 93, 214, 187, 67, 84, 72, 171, - 160, 171, 118, 199, 228, 53, 9, 21, 139, 106, 173, 74, 163, 151, 112, 50, - 54, 234, 161, 26, 145, 114, 132, 146, 127, 128, 186, 162, 192, 239, 162, 178, - 25, 127, 92, 170, 46, 82, 13, 150, 42, 61, 105, 218, 103, 75, 245, 156, - 218, 8, 121, 69, 96, 80, 192, 182, 64, 170, 29, 152, 212, 41, 228, 169, - 13, 186, 66, 22, 153, 38, 229, 47, 24, 239, 131, 17, 123, 79, 155, 160, - 38, 112, 107, 180, 50, 36, 93, 198, 204, 50, 13, 50, 237, 43, 149, 246, - 16, 33, 147, 176, 151, 161, 202, 227, 81, 143, 62, 114, 14, 133, 234, 56, - 84, 24, 88, 31, 60, 16, 253, 52, 134, 179, 250, 229, 218, 89, 49, 34, - 234, 170, 83, 38, 206, 118, 214, 171, 12, 106, 198, 187, 112, 70, 15, 206, - 56, 164, 145, 190, 113, 21, 210, 245, 228, 6, 242, 88, 68, 190, 196, 195, - 147, 113, 97, 226, 92, 21, 154, 8, 73, 128, 126, 215, 223, 129, 0, 65, - 63, 74, 68, 144, 64, 232, 129, 79, 231, 121, 232, 240, 201, 127, 108, 54, - 96, 91, 17, 159, 178, 138, 9, 109, 216, 93, 246, 251, 144, 47, 153, 149, - 51, 96, 133, 221, 122, 3, 247, 190, 166, 125, 158, 167, 107, 115, 4, 233, - 102, 197, 247, 138, 124, 168, 42, 31, 240, 6, 123, 118, 170, 228, 111, 124, - 218, 95, 101, 19, 245, 89, 145, 43, 88, 92, 90, 65, 223, 85, 21, 244, - 110, 169, 160, 172, 144, 65, 46, 201, 177, 154, 170, 198, 107, 55, 107, 236, - 45, 175, 176, 161, 180, 71, 242, 102, 153, 164, 104, 217, 4, 201, 177, 98, - 15, 44, 55, 136, 72, 117, 68, 126, 89, 33, 24, 115, 31, 119, 99, 85, - 62, 186, 69, 117, 8, 241, 13, 235, 157, 57, 84, 223, 35, 107, 7, 16, - 213, 243, 70, 151, 0, 155, 153, 223, 178, 23, 45, 124, 135, 85, 15, 127, - 170, 149, 106, 179, 238, 208, 223, 142, 67, 19, 205, 229, 31, 143, 127, 58, - 134, 13, 75, 6, 69, 159, 96, 15, 210, 117, 40, 146, 202, 241, 30, 11, - 240, 117, 88, 150, 69, 10, 135, 157, 107, 233, 101, 10, 199, 50, 98, 72, - 53, 17, 41, 126, 254, 88, 238, 94, 80, 238, 171, 95, 85, 218, 231, 161, - 112, 65, 222, 235, 155, 161, 25, 192, 176, 236, 111, 24, 85, 216, 20, 164, - 107, 83, 167, 22, 101, 32, 48, 109, 244, 27, 189, 94, 13, 158, 250, 103, - 21, 252, 113, 55, 12, 156, 97, 233, 75, 120, 6, 2, 154, 151, 155, 240, - 199, 182, 47, 29, 227, 11, 132, 76, 77, 219, 188, 204, 214, 166, 27, 198, - 17, 188, 69, 252, 22, 109, 32, 3, 79, 127, 217, 10, 93, 20, 199, 190, - 108, 78, 240, 231, 72, 188, 30, 193, 206, 201, 128, 202, 64, 250, 86, 250, - 139, 115, 148, 225, 212, 244, 89, 145, 4, 98, 195, 176, 215, 119, 76, 89, - 23, 24, 3, 252, 108, 135, 143, 30, 65, 172, 204, 3, 85, 212, 179, 64, - 14, 89, 109, 202, 1, 143, 113, 6, 254, 79, 150, 72, 215, 222, 54, 189, - 17, 168, 171, 239, 20, 9, 211, 221, 171, 175, 97, 42, 46, 68, 36, 130, - 23, 61, 77, 156, 138, 202, 202, 209, 119, 168, 112, 34, 37, 250, 211, 2, - 58, 208, 51, 164, 84, 207, 94, 226, 57, 231, 101, 82, 82, 207, 69, 237, - 210, 134, 99, 156, 231, 220, 133, 140, 60, 140, 19, 10, 133, 162, 114, 81, - 237, 91, 68, 15, 207, 157, 200, 76, 6, 77, 230, 206, 20, 9, 43, 249, - 74, 139, 49, 201, 51, 116, 136, 106, 33, 197, 209, 141, 56, 141, 182, 25, - 190, 162, 10, 24, 122, 145, 225, 89, 139, 231, 227, 239, 36, 196, 45, 167, - 234, 156, 208, 88, 22, 94, 70, 132, 27, 149, 197, 97, 183, 164, 186, 114, - 204, 197, 135, 255, 85, 33, 113, 137, 87, 146, 182, 132, 208, 63, 28, 147, - 156, 61, 28, 223, 240, 249, 182, 66, 144, 58, 137, 245, 214, 192, 213, 4, - 58, 188, 53, 60, 61, 135, 229, 16, 113, 202, 93, 147, 238, 231, 162, 43, - 120, 170, 209, 95, 224, 224, 221, 250, 32, 52, 228, 10, 81, 31, 160, 62, - 67, 252, 230, 49, 38, 134, 70, 249, 8, 166, 22, 238, 228, 143, 241, 225, - 68, 163, 39, 131, 148, 164, 240, 230, 111, 195, 84, 211, 192, 197, 89, 208, - 252, 87, 202, 162, 116, 41, 158, 14, 38, 154, 25, 181, 210, 113, 232, 212, - 185, 204, 64, 31, 133, 230, 101, 38, 179, 65, 94, 161, 206, 165, 79, 29, - 81, 67, 246, 159, 206, 88, 236, 137, 45, 29, 199, 83, 141, 70, 157, 62, - 19, 135, 105, 132, 138, 67, 66, 135, 67, 38, 194, 125, 168, 80, 226, 80, - 65, 85, 14, 10, 28, 173, 40, 1, 153, 63, 215, 27, 62, 170, 79, 65, - 140, 103, 87, 56, 169, 221, 65, 101, 66, 203, 114, 138, 93, 108, 172, 178, - 243, 58, 96, 124, 176, 241, 23, 245, 112, 16, 135, 198, 172, 163, 42, 91, - 237, 116, 26, 161, 28, 233, 154, 182, 56, 68, 5, 249, 180, 155, 151, 18, - 39, 47, 23, 200, 22, 21, 248, 19, 126, 205, 193, 63, 29, 108, 238, 133, - 214, 54, 12, 132, 177, 40, 63, 146, 166, 209, 148, 59, 158, 252, 139, 106, - 232, 52, 249, 247, 4, 47, 149, 217, 135, 142, 155, 95, 181, 221, 124, 144, - 133, 205, 91, 186, 148, 69, 103, 246, 14, 21, 210, 57, 73, 168, 87, 22, - 13, 30, 201, 22, 142, 27, 96, 153, 108, 240, 203, 43, 4, 204, 103, 58, - 210, 112, 243, 69, 173, 24, 198, 163, 241, 244, 117, 35, 143, 158, 124, 120, - 212, 43, 137, 31, 231, 136, 152, 1, 36, 59, 107, 141, 201, 195, 92, 122, - 151, 61, 166, 185, 119, 34, 38, 20, 35, 65, 225, 241, 124, 245, 81, 232, - 255, 238, 61, 129, 65, 16, 209, 107, 24, 122, 191, 187, 79, 240, 183, 248, - 123, 206, 123, 226, 205, 213, 14, 127, 18, 23, 25, 175, 88, 176, 209, 80, - 161, 186, 51, 4, 253, 226, 74, 92, 136, 229, 228, 14, 152, 206, 133, 128, - 170, 60, 184, 207, 143, 105, 124, 226, 229, 136, 156, 40, 234, 70, 143, 110, - 159, 196, 196, 18, 227, 196, 154, 197, 19, 135, 168, 56, 39, 229, 53, 42, - 240, 139, 64, 82, 250, 178, 233, 254, 254, 229, 9, 138, 45, 95, 178, 208, - 101, 84, 126, 1, 15, 156, 162, 253, 112, 214, 74, 167, 96, 78, 224, 183, - 29, 107, 42, 198, 33, 207, 47, 77, 39, 110, 186, 21, 162, 174, 213, 34, - 31, 224, 190, 20, 161, 214, 59, 117, 90, 133, 26, 21, 251, 192, 248, 145, - 144, 153, 108, 154, 234, 245, 251, 177, 212, 236, 117, 79, 158, 208, 51, 80, - 254, 36, 35, 208, 180, 37, 155, 227, 206, 155, 137, 236, 110, 222, 43, 61, - 129, 97, 196, 167, 49, 58, 182, 151, 169, 57, 156, 144, 115, 19, 105, 138, - 96, 82, 242, 202, 124, 95, 187, 73, 39, 231, 11, 26, 87, 210, 24, 146, - 186, 131, 190, 65, 201, 184, 171, 22, 186, 78, 63, 187, 80, 29, 105, 46, - 100, 103, 224, 118, 52, 93, 99, 111, 101, 185, 86, 247, 28, 101, 4, 220, - 64, 134, 198, 141, 165, 1, 109, 94, 60, 232, 17, 47, 217, 37, 20, 44, - 217, 3, 196, 210, 253, 184, 29, 202, 65, 130, 190, 182, 168, 174, 34, 165, - 131, 105, 98, 33, 214, 19, 60, 211, 123, 40, 211, 244, 150, 115, 77, 111, - 9, 219, 236, 245, 251, 167, 11, 173, 148, 65, 148, 71, 46, 119, 223, 230, - 148, 148, 72, 51, 227, 49, 97, 123, 25, 68, 111, 90, 74, 11, 31, 104, - 225, 235, 180, 96, 135, 30, 117, 63, 38, 134, 159, 32, 134, 199, 212, 144, - 223, 16, 20, 241, 145, 34, 190, 129, 2, 169, 144, 173, 80, 180, 242, 96, - 161, 79, 169, 164, 169, 13, 120, 33, 249, 139, 157, 84, 194, 87, 135, 246, - 152, 7, 29, 107, 39, 96, 232, 150, 149, 104, 233, 220, 76, 54, 156, 19, - 45, 54, 253, 155, 238, 29, 69, 58, 8, 227, 234, 58, 220, 49, 186, 60, - 129, 29, 3, 44, 201, 74, 20, 98, 44, 171, 250, 67, 170, 173, 85, 249, - 70, 117, 229, 120, 228, 209, 99, 106, 62, 203, 166, 161, 37, 34, 111, 157, - 55, 226, 154, 126, 225, 210, 18, 246, 173, 208, 69, 192, 13, 148, 172, 123, - 135, 144, 132, 14, 227, 116, 105, 104, 75, 74, 67, 9, 89, 136, 36, 33, - 100, 11, 91, 183, 203, 64, 44, 254, 136, 131, 41, 168, 3, 214, 110, 25, - 127, 59, 230, 232, 19, 67, 125, 128, 23, 31, 60, 202, 140, 174, 150, 148, - 125, 143, 213, 229, 166, 24, 160, 175, 55, 188, 224, 88, 211, 185, 126, 113, - 176, 108, 245, 16, 227, 250, 106, 43, 132, 49, 139, 45, 133, 98, 228, 2, - 44, 19, 235, 146, 149, 17, 179, 1, 49, 157, 230, 236, 101, 112, 31, 71, - 25, 53, 89, 54, 214, 86, 203, 74, 10, 5, 243, 71, 45, 168, 9, 137, - 195, 167, 77, 148, 243, 195, 16, 157, 207, 34, 175, 164, 71, 63, 126, 12, - 132, 216, 124, 122, 37, 211, 145, 204, 44, 163, 65, 150, 208, 95, 84, 234, - 154, 167, 138, 213, 147, 251, 122, 242, 64, 75, 238, 199, 201, 115, 137, 244, - 185, 68, 134, 156, 202, 209, 132, 181, 133, 235, 245, 187, 255, 68, 124, 242, - 247, 64, 60, 249, 191, 23, 51, 82, 158, 83, 210, 220, 236, 120, 186, 239, - 68, 251, 48, 208, 232, 55, 115, 34, 156, 45, 46, 97, 72, 241, 148, 213, - 214, 115, 3, 198, 60, 43, 0, 83, 231, 224, 104, 65, 45, 232, 43, 210, - 96, 187, 178, 197, 154, 219, 44, 224, 206, 78, 57, 66, 250, 219, 46, 122, - 206, 91, 131, 250, 178, 19, 58, 12, 55, 235, 231, 231, 40, 122, 75, 223, - 60, 20, 38, 172, 157, 83, 104, 238, 44, 188, 99, 205, 127, 173, 229, 242, - 47, 62, 176, 123, 30, 183, 228, 206, 243, 186, 255, 114, 23, 61, 108, 14, - 72, 110, 223, 201, 119, 25, 94, 111, 160, 51, 209, 227, 34, 250, 252, 112, - 202, 249, 213, 82, 182, 121, 178, 204, 207, 13, 17, 240, 25, 19, 80, 10, - 66, 147, 121, 236, 42, 71, 58, 235, 162, 96, 135, 176, 47, 79, 178, 94, - 190, 196, 119, 130, 136, 222, 152, 118, 117, 179, 64, 252, 247, 141, 93, 100, - 39, 223, 149, 27, 53, 4, 250, 18, 32, 95, 12, 225, 16, 24, 232, 23, - 143, 176, 243, 24, 61, 15, 254, 146, 152, 177, 129, 188, 18, 246, 219, 89, - 140, 118, 243, 190, 103, 224, 46, 32, 64, 163, 113, 144, 37, 130, 0, 65, - 194, 140, 206, 21, 170, 119, 84, 209, 193, 248, 137, 217, 229, 159, 44, 255, - 4, 190, 139, 252, 156, 95, 168, 46, 110, 137, 124, 146, 214, 206, 160, 16, - 215, 60, 135, 191, 129, 235, 26, 116, 52, 128, 71, 100, 21, 188, 198, 229, - 29, 142, 114, 194, 39, 143, 143, 240, 226, 136, 252, 29, 65, 66, 60, 230, - 114, 141, 97, 179, 50, 232, 215, 187, 36, 88, 186, 176, 235, 24, 180, 186, - 151, 180, 109, 138, 143, 221, 229, 70, 201, 108, 163, 125, 54, 124, 142, 244, - 78, 12, 186, 66, 99, 56, 88, 88, 72, 7, 117, 186, 134, 113, 201, 109, - 170, 193, 24, 244, 158, 168, 12, 211, 172, 108, 94, 96, 52, 249, 141, 33, - 116, 122, 121, 199, 200, 40, 246, 104, 50, 72, 126, 234, 8, 49, 141, 160, - 53, 17, 234, 210, 30, 112, 203, 137, 138, 142, 69, 31, 69, 119, 172, 36, - 51, 203, 102, 97, 36, 73, 211, 6, 249, 58, 5, 42, 163, 19, 115, 175, - 236, 176, 147, 93, 250, 170, 158, 54, 160, 180, 170, 17, 118, 24, 60, 204, - 105, 13, 2, 157, 98, 199, 63, 196, 105, 205, 95, 113, 40, 199, 27, 168, - 226, 125, 29, 214, 224, 29, 15, 178, 52, 188, 167, 89, 228, 160, 147, 222, - 224, 114, 169, 131, 83, 21, 153, 96, 162, 28, 242, 143, 190, 230, 120, 46, - 171, 249, 48, 31, 167, 255, 109, 92, 83, 59, 189, 79, 123, 229, 141, 114, - 241, 91, 185, 184, 17, 248, 223, 96, 210, 193, 79, 6, 221, 132, 35, 162, - 82, 89, 56, 42, 53, 104, 23, 185, 224, 70, 233, 22, 150, 202, 212, 53, - 70, 173, 142, 152, 231, 248, 148, 147, 126, 189, 30, 133, 161, 255, 21, 246, - 131, 95, 77, 11, 195, 233, 220, 6, 167, 90, 122, 54, 78, 163, 29, 222, - 87, 3, 205, 100, 225, 239, 56, 157, 67, 65, 71, 60, 251, 153, 92, 137, - 30, 3, 215, 70, 87, 105, 20, 14, 213, 128, 191, 26, 183, 205, 240, 87, - 103, 156, 2, 133, 8, 186, 63, 94, 95, 55, 18, 42, 40, 56, 3, 141, - 86, 232, 198, 42, 19, 143, 114, 62, 42, 24, 156, 158, 213, 79, 7, 228, - 113, 178, 134, 177, 149, 90, 11, 47, 188, 97, 43, 55, 179, 90, 206, 255, - 20, 231, 91, 40, 75, 195, 83, 105, 94, 8, 228, 19, 58, 53, 245, 179, - 50, 133, 237, 103, 10, 158, 191, 224, 203, 20, 163, 208, 61, 22, 254, 122, - 115, 153, 81, 184, 235, 130, 54, 88, 252, 37, 244, 205, 85, 25, 85, 186, - 62, 23, 22, 136, 148, 254, 60, 147, 245, 214, 220, 66, 191, 5, 20, 207, - 151, 57, 176, 156, 91, 155, 27, 105, 17, 239, 200, 244, 228, 125, 113, 93, - 186, 53, 37, 88, 86, 251, 24, 226, 228, 53, 185, 168, 201, 166, 203, 61, - 32, 94, 183, 194, 137, 246, 238, 193, 123, 83, 244, 16, 215, 107, 147, 24, - 154, 78, 27, 229, 114, 67, 180, 26, 11, 252, 237, 55, 81, 0, 144, 41, - 68, 163, 42, 161, 178, 140, 146, 31, 118, 207, 26, 119, 28, 121, 190, 187, - 119, 160, 234, 3, 244, 135, 199, 42, 157, 37, 91, 60, 199, 30, 231, 120, - 77, 193, 93, 142, 143, 14, 229, 80, 171, 191, 133, 8, 249, 76, 31, 114, - 35, 59, 243, 201, 233, 44, 175, 4, 25, 91, 16, 174, 128, 171, 57, 198, - 225, 57, 89, 34, 46, 16, 113, 57, 95, 246, 142, 195, 138, 86, 25, 222, - 229, 45, 208, 67, 222, 230, 39, 130, 201, 87, 101, 235, 68, 40, 236, 216, - 76, 53, 62, 5, 187, 223, 178, 17, 208, 178, 1, 35, 199, 43, 234, 203, - 198, 226, 1, 217, 45, 203, 71, 64, 83, 53, 184, 143, 191, 179, 5, 247, - 104, 191, 64, 248, 30, 54, 235, 209, 45, 242, 247, 176, 153, 131, 184, 155, - 50, 56, 101, 249, 167, 47, 30, 137, 202, 223, 186, 132, 220, 238, 32, 155, - 181, 26, 235, 3, 5, 215, 50, 140, 41, 82, 173, 99, 204, 82, 224, 25, - 190, 230, 230, 53, 11, 87, 13, 149, 231, 238, 197, 230, 255, 240, 69, 74, - 136, 246, 180, 108, 224, 244, 168, 152, 83, 179, 43, 47, 34, 253, 90, 100, - 250, 62, 219, 68, 27, 192, 114, 157, 117, 118, 201, 169, 75, 178, 236, 158, - 19, 151, 0, 84, 11, 145, 86, 246, 35, 51, 101, 154, 98, 139, 247, 181, - 251, 124, 239, 253, 203, 220, 179, 163, 103, 95, 187, 230, 179, 231, 207, 159, - 61, 253, 144, 66, 37, 41, 47, 96, 213, 46, 114, 251, 80, 173, 180, 235, - 193, 212, 60, 51, 209, 5, 4, 9, 190, 36, 247, 26, 231, 48, 171, 189, - 18, 8, 79, 228, 213, 50, 202, 53, 11, 176, 114, 42, 111, 17, 231, 131, - 74, 167, 126, 122, 62, 190, 190, 70, 185, 184, 68, 26, 99, 240, 23, 248, - 189, 43, 101, 99, 118, 222, 52, 24, 15, 65, 60, 134, 143, 150, 89, 100, - 135, 21, 99, 156, 14, 220, 216, 119, 238, 178, 103, 19, 69, 92, 60, 236, - 71, 62, 191, 238, 26, 15, 201, 73, 25, 75, 248, 171, 156, 87, 99, 80, - 81, 110, 14, 96, 71, 145, 55, 222, 133, 1, 72, 144, 121, 90, 245, 125, - 216, 17, 145, 223, 79, 226, 17, 226, 173, 57, 95, 46, 1, 192, 200, 124, - 22, 197, 27, 43, 233, 247, 161, 168, 248, 213, 217, 156, 208, 13, 222, 241, - 218, 176, 6, 242, 249, 59, 123, 77, 105, 90, 202, 20, 62, 167, 128, 37, - 50, 128, 4, 57, 145, 192, 150, 66, 252, 172, 228, 218, 129, 203, 76, 253, - 71, 214, 207, 67, 195, 30, 203, 64, 226, 230, 63, 96, 171, 86, 166, 64, - 88, 79, 252, 56, 212, 199, 80, 96, 166, 171, 44, 207, 155, 3, 42, 144, - 216, 43, 45, 175, 129, 172, 196, 116, 78, 199, 164, 130, 49, 229, 69, 24, - 94, 64, 11, 191, 8, 142, 112, 152, 46, 66, 144, 30, 214, 59, 227, 62, - 146, 253, 223, 98, 205, 242, 152, 18, 120, 115, 40, 157, 63, 43, 238, 44, - 94, 128, 57, 107, 206, 73, 144, 71, 39, 189, 1, 50, 123, 247, 98, 134, - 221, 27, 15, 90, 245, 193, 82, 134, 205, 81, 144, 171, 13, 220, 9, 117, - 10, 21, 203, 22, 49, 255, 108, 150, 205, 149, 204, 169, 234, 63, 72, 183, - 233, 14, 70, 174, 179, 100, 225, 137, 111, 64, 72, 100, 12, 30, 133, 94, - 210, 128, 115, 194, 8, 71, 163, 65, 96, 6, 245, 239, 227, 122, 183, 218, - 74, 34, 97, 253, 106, 118, 253, 151, 240, 161, 254, 211, 108, 254, 103, 204, - 255, 145, 245, 104, 110, 14, 251, 230, 239, 116, 103, 139, 91, 126, 77, 221, - 89, 249, 186, 35, 95, 24, 12, 100, 134, 242, 24, 208, 27, 77, 48, 93, - 126, 170, 76, 67, 24, 81, 84, 218, 100, 43, 224, 227, 157, 66, 105, 46, - 47, 129, 101, 136, 231, 42, 46, 212, 228, 100, 87, 50, 89, 36, 147, 113, - 8, 178, 162, 115, 84, 100, 33, 243, 5, 160, 121, 219, 100, 64, 150, 74, - 195, 176, 135, 223, 7, 199, 24, 228, 224, 235, 73, 172, 13, 4, 225, 163, - 60, 171, 178, 182, 123, 141, 188, 161, 142, 74, 132, 82, 140, 176, 200, 154, - 176, 51, 117, 126, 105, 210, 11, 43, 202, 72, 63, 127, 132, 47, 70, 158, - 152, 135, 115, 58, 185, 135, 210, 232, 195, 92, 79, 4, 199, 164, 197, 71, - 24, 34, 81, 205, 70, 205, 113, 231, 204, 152, 32, 222, 167, 79, 250, 184, - 180, 73, 184, 193, 189, 197, 148, 126, 174, 102, 139, 209, 214, 175, 41, 96, - 147, 63, 28, 157, 226, 38, 43, 163, 121, 229, 130, 114, 96, 133, 28, 140, - 142, 233, 35, 39, 230, 215, 100, 177, 55, 75, 61, 249, 138, 46, 158, 190, - 166, 62, 192, 164, 17, 11, 177, 74, 148, 228, 51, 102, 171, 221, 30, 15, - 71, 131, 24, 158, 142, 150, 149, 175, 221, 175, 70, 239, 220, 60, 3, 222, - 130, 184, 77, 106, 122, 69, 90, 118, 212, 7, 20, 142, 49, 243, 230, 71, - 152, 19, 17, 106, 35, 146, 218, 32, 102, 23, 243, 151, 39, 42, 154, 75, - 154, 232, 75, 0, 153, 85, 19, 166, 49, 185, 113, 175, 13, 149, 18, 158, - 54, 127, 49, 179, 96, 99, 32, 227, 139, 169, 47, 107, 15, 163, 18, 231, - 82, 119, 196, 200, 221, 80, 71, 133, 40, 136, 249, 210, 26, 139, 200, 228, - 5, 21, 222, 188, 254, 154, 66, 40, 39, 73, 90, 86, 227, 96, 29, 26, - 75, 27, 214, 176, 81, 238, 84, 134, 151, 39, 230, 49, 247, 247, 137, 35, - 31, 12, 216, 103, 225, 224, 74, 79, 190, 249, 118, 243, 155, 159, 201, 90, - 98, 216, 23, 96, 31, 53, 151, 39, 122, 34, 187, 60, 211, 178, 6, 248, - 31, 157, 157, 25, 3, 105, 18, 185, 172, 24, 224, 97, 80, 12, 217, 72, - 98, 149, 6, 63, 45, 143, 38, 168, 157, 149, 213, 51, 69, 66, 180, 85, - 227, 167, 66, 222, 244, 99, 5, 93, 26, 254, 34, 38, 55, 195, 95, 71, - 159, 9, 137, 32, 109, 62, 224, 23, 180, 105, 198, 5, 224, 113, 22, 63, - 180, 96, 126, 202, 153, 167, 235, 12, 27, 168, 93, 231, 171, 61, 113, 118, - 142, 222, 23, 56, 25, 159, 0, 163, 50, 6, 173, 231, 216, 10, 84, 32, - 121, 14, 68, 200, 155, 251, 64, 134, 125, 96, 229, 33, 172, 176, 168, 19, - 32, 105, 147, 153, 167, 30, 155, 133, 68, 32, 106, 221, 164, 30, 179, 198, - 189, 39, 196, 72, 152, 123, 170, 50, 9, 71, 63, 130, 103, 185, 234, 90, - 94, 9, 65, 26, 38, 208, 86, 40, 171, 134, 93, 5, 189, 145, 165, 142, - 74, 83, 100, 142, 24, 19, 196, 22, 51, 208, 113, 105, 146, 74, 114, 212, - 2, 32, 22, 116, 99, 225, 171, 161, 82, 79, 56, 204, 166, 232, 111, 242, - 82, 88, 185, 147, 146, 220, 210, 26, 240, 37, 143, 228, 163, 210, 96, 118, - 144, 11, 248, 96, 133, 183, 173, 28, 187, 21, 202, 102, 207, 85, 6, 25, - 98, 74, 223, 76, 49, 107, 110, 45, 184, 232, 146, 49, 146, 245, 166, 127, - 130, 87, 20, 99, 37, 45, 186, 238, 162, 221, 188, 240, 220, 133, 231, 244, - 127, 179, 248, 164, 67, 175, 130, 86, 124, 225, 87, 20, 175, 28, 125, 249, - 89, 58, 249, 22, 238, 87, 111, 22, 123, 111, 199, 227, 132, 136, 134, 51, - 224, 155, 123, 18, 163, 163, 161, 59, 114, 125, 119, 30, 67, 202, 33, 238, - 242, 85, 101, 208, 66, 65, 236, 148, 52, 248, 165, 0, 248, 6, 55, 57, - 18, 25, 85, 224, 173, 129, 124, 80, 107, 224, 230, 83, 2, 165, 18, 203, - 138, 241, 112, 153, 213, 198, 190, 200, 21, 8, 114, 226, 19, 43, 10, 29, - 154, 25, 186, 140, 132, 151, 10, 67, 126, 86, 90, 93, 142, 82, 37, 115, - 53, 24, 230, 216, 132, 84, 149, 110, 100, 34, 167, 212, 62, 54, 28, 182, - 26, 228, 97, 124, 37, 231, 177, 8, 133, 234, 231, 131, 106, 125, 120, 11, - 78, 37, 166, 33, 237, 232, 59, 240, 148, 19, 21, 15, 167, 141, 170, 162, - 22, 33, 37, 39, 8, 169, 176, 146, 245, 100, 243, 95, 38, 26, 43, 65, - 232, 142, 66, 246, 91, 108, 244, 19, 195, 111, 183, 186, 253, 177, 88, 110, - 160, 52, 33, 97, 183, 143, 73, 125, 151, 224, 240, 4, 138, 92, 2, 233, - 152, 250, 30, 196, 59, 88, 241, 201, 47, 240, 112, 238, 188, 120, 183, 125, - 68, 127, 182, 157, 119, 47, 118, 240, 223, 54, 140, 190, 229, 163, 3, 130, - 148, 75, 115, 66, 64, 86, 61, 140, 84, 148, 40, 224, 74, 184, 131, 81, - 205, 211, 96, 209, 33, 241, 34, 98, 34, 115, 125, 150, 92, 8, 54, 81, - 142, 79, 106, 216, 105, 162, 59, 148, 230, 94, 192, 45, 132, 97, 117, 138, - 171, 2, 153, 51, 234, 90, 124, 44, 191, 81, 252, 176, 63, 104, 141, 208, - 137, 99, 88, 66, 143, 119, 37, 179, 103, 121, 161, 101, 121, 104, 162, 59, - 236, 209, 109, 147, 187, 68, 179, 21, 143, 34, 237, 129, 128, 140, 139, 111, - 10, 165, 186, 168, 111, 198, 30, 22, 165, 98, 40, 177, 250, 219, 224, 219, - 72, 64, 57, 69, 179, 1, 180, 70, 93, 116, 205, 215, 172, 134, 66, 151, - 210, 242, 50, 191, 23, 221, 39, 126, 113, 110, 160, 127, 62, 42, 215, 233, - 66, 124, 51, 103, 53, 171, 185, 181, 141, 71, 86, 92, 212, 239, 86, 84, - 125, 66, 96, 40, 213, 31, 63, 224, 217, 134, 135, 173, 176, 249, 59, 164, - 127, 130, 37, 195, 239, 239, 37, 120, 170, 242, 128, 61, 118, 173, 222, 212, - 129, 63, 17, 254, 57, 195, 63, 205, 42, 189, 211, 95, 54, 2, 118, 173, - 25, 80, 104, 142, 38, 210, 194, 158, 239, 204, 129, 98, 201, 39, 160, 107, - 201, 52, 150, 135, 118, 210, 199, 154, 146, 135, 123, 178, 104, 55, 13, 20, - 244, 139, 148, 215, 115, 4, 188, 94, 53, 111, 90, 177, 5, 180, 106, 241, - 92, 55, 195, 131, 213, 188, 232, 232, 214, 158, 144, 66, 56, 154, 139, 163, - 252, 162, 148, 71, 164, 39, 57, 93, 50, 214, 94, 112, 84, 72, 181, 145, - 188, 116, 106, 72, 55, 141, 238, 66, 29, 72, 38, 56, 236, 13, 91, 36, - 226, 165, 83, 214, 23, 244, 72, 122, 148, 202, 124, 237, 18, 72, 56, 154, - 38, 166, 65, 254, 253, 191, 184, 5, 115, 140, 120, 47, 89, 25, 71, 0, - 221, 82, 153, 20, 93, 78, 226, 153, 80, 12, 254, 248, 179, 162, 147, 229, - 46, 148, 128, 66, 87, 172, 178, 58, 200, 47, 218, 194, 170, 230, 229, 29, - 188, 71, 129, 54, 206, 185, 183, 232, 226, 96, 173, 228, 228, 249, 104, 173, - 163, 217, 64, 161, 192, 23, 143, 35, 227, 75, 72, 230, 117, 2, 118, 104, - 154, 77, 79, 64, 44, 44, 176, 96, 1, 79, 64, 156, 163, 68, 138, 40, - 155, 110, 202, 20, 77, 145, 66, 92, 12, 196, 169, 246, 210, 214, 23, 199, - 58, 194, 56, 165, 184, 163, 77, 201, 19, 84, 206, 153, 105, 1, 80, 233, - 92, 19, 149, 118, 132, 74, 145, 154, 222, 39, 10, 1, 103, 110, 226, 228, - 85, 248, 32, 164, 118, 202, 37, 11, 173, 209, 19, 163, 71, 48, 75, 61, - 4, 89, 50, 123, 103, 161, 117, 102, 194, 32, 15, 97, 20, 66, 24, 252, - 66, 231, 247, 132, 49, 62, 23, 35, 217, 129, 96, 198, 172, 173, 60, 67, - 118, 54, 207, 132, 225, 233, 202, 233, 10, 207, 84, 214, 89, 78, 68, 8, - 8, 199, 210, 2, 130, 163, 18, 131, 144, 253, 73, 40, 26, 156, 32, 204, - 127, 144, 87, 139, 84, 199, 43, 240, 101, 114, 156, 1, 171, 27, 240, 10, - 16, 123, 47, 31, 36, 25, 152, 151, 60, 177, 200, 84, 175, 195, 254, 217, - 199, 114, 138, 9, 184, 84, 125, 57, 51, 208, 164, 186, 92, 244, 113, 109, - 248, 106, 164, 246, 223, 239, 120, 103, 221, 131, 254, 159, 126, 169, 253, 231, - 243, 245, 139, 202, 139, 231, 209, 222, 139, 105, 191, 246, 242, 221, 240, 207, - 79, 235, 237, 179, 206, 187, 254, 209, 231, 226, 235, 253, 247, 219, 215, 251, - 215, 213, 6, 252, 78, 247, 158, 238, 71, 7, 215, 213, 215, 245, 87, 209, - 65, 235, 160, 253, 102, 210, 222, 62, 218, 105, 173, 239, 237, 238, 86, 43, - 71, 246, 31, 47, 250, 173, 87, 103, 23, 171, 163, 157, 215, 207, 206, 26, - 237, 15, 111, 159, 173, 214, 170, 103, 151, 127, 190, 247, 26, 231, 7, 95, - 158, 63, 157, 182, 95, 151, 209, 67, 197, 231, 103, 107, 193, 196, 110, 236, - 86, 42, 245, 23, 110, 167, 243, 249, 67, 167, 188, 122, 240, 190, 94, 41, - 13, 189, 195, 235, 242, 155, 209, 154, 59, 234, 14, 206, 10, 181, 96, 167, - 219, 188, 60, 218, 249, 30, 188, 125, 189, 27, 189, 249, 176, 93, 234, 118, - 206, 191, 239, 118, 63, 251, 159, 75, 221, 215, 171, 171, 251, 23, 101, 55, - 250, 227, 75, 227, 207, 171, 193, 247, 78, 249, 205, 119, 216, 115, 30, 125, - 174, 22, 255, 108, 118, 159, 190, 122, 230, 79, 6, 141, 139, 206, 206, 231, - 231, 147, 119, 157, 65, 161, 121, 240, 54, 192, 47, 255, 249, 189, 117, 245, - 250, 237, 94, 251, 233, 129, 123, 244, 246, 207, 90, 253, 237, 139, 198, 244, - 250, 203, 155, 93, 239, 67, 240, 229, 243, 179, 253, 230, 167, 207, 251, 163, - 107, 239, 115, 103, 82, 108, 122, 111, 95, 62, 123, 243, 190, 217, 107, 124, - 127, 91, 45, 175, 30, 29, 190, 217, 153, 244, 107, 157, 70, 191, 246, 249, - 122, 247, 253, 209, 250, 238, 193, 243, 87, 239, 189, 201, 231, 143, 47, 11, - 7, 64, 61, 191, 252, 252, 67, 187, 216, 171, 183, 139, 107, 163, 198, 184, - 21, 60, 45, 191, 254, 56, 216, 239, 173, 14, 62, 63, 61, 122, 138, 95, - 190, 122, 213, 40, 94, 22, 206, 175, 250, 133, 82, 161, 246, 234, 251, 250, - 219, 104, 252, 49, 42, 174, 125, 252, 178, 255, 230, 207, 210, 203, 213, 74, - 115, 253, 96, 215, 63, 122, 183, 127, 214, 252, 248, 165, 241, 113, 216, 251, - 99, 183, 241, 166, 59, 29, 158, 219, 182, 91, 248, 240, 197, 187, 126, 119, - 238, 157, 87, 15, 42, 110, 235, 176, 49, 9, 195, 148, 129, 168, 14, 254, - 42, 30, 14, 245, 58, 184, 61, 29, 158, 14, 218, 136, 35, 43, 152, 31, - 106, 128, 160, 98, 3, 157, 133, 248, 69, 37, 39, 54, 43, 221, 94, 107, - 217, 145, 224, 135, 222, 4, 214, 123, 216, 219, 190, 196, 20, 202, 206, 145, - 210, 255, 179, 79, 3, 19, 53, 255, 127, 255, 159, 219, 207, 2, 111, 183, - 59, 212, 44, 14, 133, 19, 7, 136, 33, 14, 73, 97, 32, 85, 18, 10, - 127, 5, 27, 119, 185, 212, 85, 129, 86, 2, 30, 189, 245, 70, 192, 176, - 205, 96, 247, 6, 80, 255, 127, 223, 93, 14, 233, 27, 224, 191, 106, 4, - 235, 116, 173, 62, 8, 106, 184, 246, 210, 33, 124, 124, 149, 97, 219, 248, - 198, 58, 159, 166, 157, 227, 243, 121, 122, 53, 206, 122, 83, 82, 92, 34, - 233, 202, 204, 241, 69, 6, 218, 116, 24, 152, 7, 24, 219, 160, 87, 27, - 6, 53, 67, 160, 137, 155, 48, 32, 135, 100, 71, 126, 126, 62, 66, 159, - 6, 3, 88, 255, 161, 180, 149, 65, 200, 27, 226, 105, 110, 194, 219, 225, - 188, 235, 101, 197, 13, 14, 108, 138, 55, 90, 8, 121, 48, 200, 172, 152, - 45, 153, 49, 97, 209, 23, 120, 70, 122, 173, 12, 66, 41, 252, 183, 225, - 5, 190, 19, 148, 65, 74, 221, 240, 189, 53, 130, 22, 40, 151, 55, 252, - 0, 150, 100, 119, 21, 221, 25, 145, 175, 71, 111, 61, 112, 188, 162, 155, - 137, 225, 81, 162, 235, 234, 20, 225, 42, 2, 95, 233, 130, 161, 250, 146, - 196, 231, 97, 123, 71, 248, 59, 117, 188, 199, 166, 174, 111, 21, 123, 22, - 86, 87, 23, 40, 23, 175, 187, 100, 135, 50, 70, 19, 235, 64, 224, 252, - 104, 241, 235, 164, 63, 203, 27, 68, 236, 1, 169, 129, 182, 114, 28, 148, - 221, 236, 180, 48, 1, 9, 96, 29, 33, 48, 210, 240, 156, 249, 230, 230, - 75, 25, 12, 57, 89, 65, 207, 135, 108, 45, 18, 141, 122, 125, 87, 211, - 154, 192, 61, 171, 241, 206, 129, 165, 60, 200, 161, 205, 10, 249, 123, 246, - 242, 101, 120, 241, 125, 124, 83, 119, 91, 168, 245, 57, 32, 34, 185, 70, - 128, 74, 122, 208, 10, 121, 55, 199, 154, 91, 216, 92, 55, 110, 38, 38, - 232, 50, 8, 3, 74, 36, 158, 168, 44, 124, 114, 15, 15, 123, 201, 217, - 50, 72, 49, 240, 31, 93, 249, 201, 3, 157, 164, 53, 150, 130, 204, 198, - 219, 158, 146, 113, 131, 58, 64, 142, 2, 223, 161, 121, 104, 120, 19, 216, - 22, 44, 197, 137, 91, 53, 30, 97, 36, 28, 193, 224, 171, 88, 91, 206, - 20, 254, 69, 240, 175, 105, 129, 56, 78, 170, 207, 72, 20, 108, 246, 90, - 214, 26, 20, 210, 92, 12, 154, 136, 96, 184, 29, 90, 179, 38, 18, 2, - 37, 127, 228, 7, 65, 205, 218, 82, 234, 236, 98, 143, 110, 224, 234, 95, - 46, 74, 248, 251, 197, 35, 217, 4, 203, 250, 26, 148, 86, 83, 134, 71, - 46, 66, 161, 239, 162, 48, 116, 127, 63, 198, 17, 228, 227, 200, 115, 79, - 158, 68, 104, 119, 115, 92, 46, 162, 166, 25, 218, 139, 208, 180, 129, 78, - 68, 200, 236, 196, 230, 132, 46, 68, 9, 118, 165, 122, 217, 32, 49, 204, - 232, 158, 157, 210, 141, 180, 35, 142, 70, 157, 78, 15, 197, 208, 160, 118, - 58, 141, 31, 35, 24, 0, 83, 144, 219, 106, 248, 239, 116, 216, 27, 195, - 22, 155, 30, 71, 32, 247, 212, 71, 142, 220, 179, 19, 166, 100, 165, 134, - 250, 214, 214, 15, 94, 6, 88, 27, 72, 140, 158, 50, 93, 96, 30, 75, - 162, 156, 136, 62, 134, 93, 39, 122, 87, 166, 43, 202, 153, 231, 102, 211, - 214, 12, 72, 142, 130, 227, 220, 201, 89, 179, 8, 199, 152, 203, 167, 26, - 116, 125, 89, 38, 99, 85, 74, 126, 204, 115, 255, 196, 208, 186, 80, 40, - 73, 60, 74, 91, 162, 77, 191, 33, 248, 217, 128, 123, 21, 239, 252, 96, - 76, 149, 232, 18, 17, 239, 215, 200, 78, 138, 35, 243, 1, 137, 150, 51, - 182, 196, 114, 177, 119, 127, 240, 13, 164, 86, 186, 21, 83, 69, 150, 73, - 167, 234, 113, 248, 148, 111, 86, 161, 26, 199, 49, 161, 79, 72, 19, 17, - 199, 47, 158, 154, 174, 146, 132, 46, 84, 17, 61, 103, 77, 40, 52, 162, - 95, 46, 180, 200, 68, 83, 30, 210, 87, 194, 157, 193, 191, 246, 177, 127, - 208, 87, 128, 234, 43, 255, 177, 179, 238, 63, 166, 43, 107, 9, 253, 111, - 17, 181, 201, 183, 236, 55, 247, 155, 155, 225, 201, 98, 178, 193, 144, 84, - 129, 18, 137, 184, 99, 228, 233, 30, 189, 225, 244, 101, 96, 74, 133, 198, - 246, 35, 103, 113, 95, 110, 130, 96, 205, 168, 102, 42, 104, 174, 43, 165, - 20, 127, 166, 148, 50, 17, 135, 116, 77, 62, 160, 251, 217, 237, 39, 159, - 1, 8, 132, 63, 177, 41, 161, 9, 7, 127, 208, 192, 184, 239, 59, 60, - 1, 35, 10, 192, 191, 62, 142, 60, 57, 200, 12, 24, 19, 10, 36, 149, - 70, 146, 180, 130, 145, 227, 244, 81, 104, 109, 137, 29, 54, 141, 46, 155, - 103, 236, 22, 188, 65, 97, 22, 228, 135, 186, 200, 71, 216, 145, 235, 137, - 80, 97, 135, 195, 173, 45, 165, 219, 3, 2, 214, 213, 169, 24, 109, 161, - 28, 118, 6, 111, 161, 112, 30, 225, 111, 36, 167, 24, 159, 1, 56, 116, - 2, 224, 208, 254, 95, 192, 116, 115, 114, 178, 190, 154, 134, 51, 63, 95, - 134, 153, 32, 2, 249, 246, 57, 135, 28, 218, 70, 93, 88, 173, 133, 211, - 248, 22, 93, 43, 66, 52, 79, 205, 128, 185, 177, 124, 98, 207, 210, 199, - 50, 151, 35, 30, 162, 147, 66, 66, 253, 153, 190, 154, 93, 119, 37, 100, - 246, 237, 95, 241, 22, 232, 140, 138, 126, 138, 55, 88, 51, 73, 91, 35, - 230, 34, 161, 158, 24, 109, 6, 57, 129, 108, 143, 140, 139, 63, 53, 32, - 187, 106, 241, 29, 232, 23, 153, 98, 190, 233, 33, 68, 160, 122, 103, 61, - 3, 15, 153, 139, 150, 200, 14, 50, 108, 200, 96, 76, 85, 160, 29, 206, - 160, 114, 80, 110, 14, 7, 139, 74, 186, 129, 103, 139, 233, 90, 134, 144, - 11, 144, 53, 160, 186, 71, 13, 183, 171, 250, 71, 96, 59, 153, 200, 228, - 121, 54, 50, 21, 228, 31, 253, 22, 105, 136, 76, 115, 220, 79, 211, 12, - 230, 173, 220, 145, 183, 120, 71, 62, 222, 206, 74, 195, 70, 65, 111, 65, - 5, 38, 137, 160, 143, 70, 177, 56, 90, 240, 233, 77, 69, 55, 217, 19, - 155, 241, 231, 205, 56, 29, 81, 195, 148, 220, 6, 45, 59, 227, 184, 71, - 20, 41, 122, 79, 24, 133, 44, 228, 20, 145, 146, 255, 231, 215, 68, 237, - 227, 182, 134, 90, 129, 58, 73, 92, 90, 65, 21, 103, 82, 179, 81, 36, - 85, 243, 88, 239, 210, 45, 90, 141, 23, 186, 30, 17, 123, 49, 56, 217, - 251, 57, 217, 251, 230, 189, 23, 179, 150, 161, 225, 143, 37, 22, 20, 109, - 62, 229, 194, 25, 13, 22, 109, 9, 224, 97, 227, 209, 160, 209, 131, 245, - 124, 209, 205, 124, 209, 242, 124, 145, 24, 2, 247, 220, 249, 31, 163, 61, - 236, 160, 115, 83, 69, 175, 217, 26, 142, 122, 176, 227, 239, 44, 219, 224, - 169, 72, 165, 235, 17, 135, 252, 163, 247, 119, 47, 19, 21, 191, 143, 170, - 199, 237, 26, 30, 114, 131, 134, 155, 38, 188, 234, 238, 212, 17, 16, 234, - 103, 59, 186, 164, 219, 57, 13, 95, 70, 110, 192, 254, 51, 154, 21, 203, - 180, 41, 248, 12, 156, 103, 193, 37, 30, 111, 115, 0, 171, 214, 161, 152, - 238, 155, 172, 48, 177, 134, 119, 200, 3, 115, 141, 109, 69, 216, 82, 153, - 112, 139, 165, 70, 29, 105, 67, 104, 231, 170, 36, 228, 207, 132, 156, 233, - 131, 244, 131, 194, 203, 139, 10, 140, 14, 243, 73, 138, 5, 29, 50, 132, - 160, 240, 167, 2, 108, 143, 163, 74, 137, 184, 157, 129, 114, 203, 75, 177, - 100, 174, 18, 71, 191, 239, 244, 122, 163, 166, 22, 157, 204, 253, 30, 183, - 19, 113, 172, 159, 204, 252, 20, 21, 11, 208, 73, 29, 71, 198, 89, 21, - 186, 195, 212, 64, 1, 132, 205, 75, 24, 11, 181, 49, 104, 161, 244, 71, - 34, 219, 99, 113, 110, 10, 146, 226, 244, 169, 248, 31, 30, 163, 232, 7, - 212, 110, 226, 124, 218, 157, 62, 23, 255, 195, 175, 76, 235, 67, 177, 145, - 227, 83, 220, 128, 62, 78, 100, 148, 21, 32, 196, 54, 95, 171, 81, 100, - 84, 69, 173, 195, 114, 145, 183, 75, 216, 190, 16, 182, 78, 138, 20, 161, - 27, 3, 21, 123, 230, 153, 162, 32, 132, 55, 176, 11, 66, 15, 197, 112, - 220, 125, 180, 42, 225, 172, 85, 97, 164, 71, 138, 162, 123, 121, 216, 111, - 125, 67, 225, 187, 192, 97, 115, 148, 247, 4, 92, 70, 46, 111, 90, 173, - 10, 6, 40, 136, 68, 188, 212, 183, 226, 143, 208, 107, 171, 130, 152, 91, - 86, 92, 165, 216, 94, 200, 82, 117, 54, 212, 54, 214, 102, 201, 180, 236, - 148, 141, 33, 8, 59, 180, 175, 180, 61, 16, 83, 78, 53, 190, 131, 50, - 39, 213, 135, 212, 237, 138, 115, 33, 206, 90, 67, 244, 75, 78, 123, 185, - 197, 212, 178, 134, 55, 51, 172, 46, 205, 144, 214, 154, 97, 163, 175, 93, - 202, 232, 151, 202, 122, 86, 239, 150, 143, 197, 109, 165, 92, 168, 72, 164, - 101, 90, 254, 193, 152, 22, 252, 37, 215, 77, 228, 242, 111, 107, 151, 24, - 1, 203, 170, 231, 139, 47, 217, 8, 208, 89, 141, 249, 184, 66, 248, 145, - 153, 217, 74, 205, 44, 200, 136, 89, 153, 238, 160, 155, 243, 130, 74, 194, - 26, 132, 165, 19, 132, 21, 205, 21, 113, 48, 226, 245, 180, 237, 149, 241, - 18, 60, 87, 68, 25, 180, 36, 30, 155, 243, 92, 121, 142, 24, 109, 253, - 38, 236, 195, 32, 177, 195, 219, 39, 178, 180, 112, 4, 102, 129, 140, 207, - 195, 198, 71, 143, 230, 41, 160, 69, 47, 196, 138, 179, 14, 168, 75, 49, - 151, 243, 79, 4, 240, 65, 92, 27, 51, 86, 136, 36, 37, 6, 97, 138, - 64, 158, 148, 104, 44, 169, 128, 136, 2, 154, 176, 46, 162, 105, 178, 123, - 130, 67, 142, 116, 238, 223, 64, 199, 183, 186, 149, 54, 99, 67, 2, 31, - 96, 45, 78, 117, 7, 121, 115, 87, 30, 47, 52, 187, 184, 208, 48, 206, - 66, 66, 121, 35, 81, 145, 173, 144, 106, 146, 243, 92, 165, 111, 17, 65, - 160, 95, 210, 235, 22, 22, 97, 204, 243, 20, 21, 98, 15, 10, 0, 69, - 71, 40, 121, 64, 255, 102, 178, 197, 130, 191, 38, 172, 75, 180, 114, 86, - 147, 229, 172, 251, 120, 201, 146, 132, 58, 191, 111, 81, 222, 66, 157, 60, - 172, 148, 198, 68, 168, 184, 28, 158, 55, 144, 116, 2, 191, 122, 153, 48, - 28, 177, 212, 28, 185, 170, 94, 44, 121, 161, 150, 30, 86, 83, 99, 91, - 90, 69, 161, 15, 244, 82, 61, 119, 105, 85, 253, 133, 170, 250, 88, 213, - 152, 39, 106, 229, 225, 212, 74, 214, 211, 117, 111, 41, 115, 161, 146, 62, - 209, 82, 242, 92, 42, 210, 231, 34, 75, 229, 101, 45, 143, 5, 244, 120, - 32, 8, 123, 39, 120, 97, 56, 140, 185, 249, 43, 152, 248, 195, 174, 127, - 132, 10, 200, 105, 82, 146, 35, 80, 37, 157, 236, 32, 105, 211, 21, 29, - 180, 4, 225, 138, 5, 106, 165, 188, 83, 133, 88, 200, 241, 88, 204, 78, - 154, 181, 42, 206, 19, 113, 116, 149, 90, 228, 216, 178, 31, 227, 241, 150, - 197, 25, 39, 65, 242, 200, 253, 42, 2, 88, 205, 121, 29, 37, 19, 23, - 143, 157, 231, 225, 55, 5, 190, 229, 13, 60, 223, 139, 60, 171, 127, 167, - 113, 152, 77, 8, 56, 103, 150, 246, 202, 185, 166, 194, 208, 241, 28, 212, - 200, 84, 199, 5, 228, 44, 206, 198, 100, 77, 252, 43, 204, 56, 17, 44, - 14, 255, 197, 242, 112, 111, 220, 104, 46, 149, 133, 49, 194, 132, 158, 232, - 14, 207, 123, 3, 77, 34, 166, 240, 127, 182, 52, 140, 85, 204, 169, 170, - 63, 12, 213, 241, 97, 170, 207, 87, 189, 81, 61, 214, 124, 174, 33, 226, - 18, 153, 247, 14, 251, 189, 46, 158, 18, 241, 56, 185, 103, 97, 170, 28, - 42, 21, 21, 74, 42, 237, 54, 149, 48, 52, 171, 131, 30, 67, 245, 43, - 196, 72, 132, 72, 108, 183, 170, 151, 245, 26, 27, 215, 252, 196, 215, 177, - 186, 8, 137, 59, 55, 9, 141, 248, 143, 81, 121, 110, 67, 159, 130, 160, - 222, 24, 212, 235, 176, 133, 238, 117, 207, 97, 216, 152, 163, 250, 112, 68, - 244, 241, 107, 164, 9, 77, 27, 187, 243, 216, 133, 228, 162, 90, 52, 66, - 126, 199, 138, 53, 74, 173, 70, 233, 167, 4, 247, 82, 239, 181, 73, 103, - 136, 54, 6, 74, 187, 88, 168, 80, 124, 53, 72, 247, 247, 134, 210, 47, - 13, 62, 243, 131, 28, 124, 203, 84, 126, 95, 46, 153, 90, 55, 20, 126, - 43, 253, 62, 244, 46, 169, 211, 10, 173, 95, 12, 93, 204, 74, 186, 239, - 35, 210, 226, 165, 97, 210, 90, 166, 252, 139, 249, 117, 216, 208, 33, 119, - 98, 31, 29, 155, 51, 166, 167, 42, 143, 135, 32, 78, 223, 97, 29, 135, - 201, 4, 243, 170, 162, 41, 118, 104, 86, 6, 245, 88, 225, 23, 134, 223, - 89, 36, 61, 15, 8, 8, 83, 85, 158, 174, 234, 11, 20, 19, 27, 242, - 155, 74, 191, 131, 102, 15, 181, 47, 147, 202, 188, 168, 244, 137, 112, 181, - 94, 190, 196, 3, 54, 111, 150, 60, 159, 238, 183, 206, 4, 156, 164, 84, - 41, 143, 149, 92, 39, 132, 219, 190, 92, 203, 123, 15, 171, 159, 50, 39, - 222, 237, 73, 22, 122, 79, 153, 241, 8, 157, 133, 51, 118, 247, 197, 235, - 159, 210, 76, 141, 56, 40, 86, 62, 157, 99, 131, 92, 209, 28, 244, 11, - 70, 250, 169, 8, 35, 78, 154, 167, 64, 162, 81, 5, 162, 217, 232, 149, - 17, 245, 81, 157, 10, 150, 163, 25, 90, 114, 206, 209, 247, 14, 39, 114, - 102, 226, 33, 199, 17, 70, 172, 179, 155, 11, 98, 112, 166, 0, 228, 30, - 216, 85, 225, 6, 5, 191, 108, 218, 155, 136, 152, 137, 16, 155, 121, 52, - 5, 158, 65, 86, 84, 199, 15, 40, 231, 99, 52, 110, 162, 226, 12, 84, - 11, 155, 17, 240, 3, 149, 134, 182, 182, 116, 204, 141, 175, 40, 19, 115, - 191, 204, 245, 141, 152, 188, 5, 67, 63, 159, 196, 118, 32, 121, 43, 109, - 109, 57, 104, 155, 204, 79, 30, 107, 42, 231, 121, 21, 21, 215, 62, 121, - 164, 187, 18, 58, 60, 54, 51, 146, 58, 161, 30, 80, 86, 208, 37, 20, - 177, 108, 211, 138, 207, 147, 57, 209, 147, 35, 162, 121, 86, 212, 138, 226, - 154, 12, 95, 198, 86, 90, 5, 223, 198, 56, 54, 142, 162, 194, 240, 168, - 146, 99, 155, 42, 150, 236, 161, 100, 44, 123, 71, 176, 209, 172, 45, 25, - 193, 94, 18, 114, 20, 145, 40, 143, 189, 37, 228, 150, 228, 32, 175, 9, - 246, 205, 28, 208, 7, 44, 45, 44, 248, 79, 160, 157, 177, 251, 156, 255, - 79, 131, 151, 147, 145, 231, 25, 132, 230, 249, 121, 82, 44, 145, 60, 208, - 16, 146, 207, 79, 147, 46, 150, 40, 82, 225, 38, 229, 238, 79, 223, 72, - 120, 219, 135, 181, 132, 19, 190, 106, 84, 98, 102, 18, 19, 205, 147, 66, - 33, 13, 141, 135, 79, 115, 125, 14, 223, 152, 180, 210, 129, 17, 170, 24, - 229, 101, 21, 224, 147, 248, 238, 229, 151, 29, 35, 66, 236, 125, 80, 232, - 189, 100, 148, 167, 228, 204, 137, 103, 18, 68, 6, 107, 24, 73, 5, 79, - 110, 44, 38, 156, 107, 202, 75, 203, 116, 147, 47, 42, 19, 138, 71, 179, - 50, 211, 221, 60, 157, 180, 106, 163, 230, 38, 250, 106, 223, 60, 109, 214, - 81, 10, 22, 47, 103, 176, 54, 13, 55, 195, 181, 101, 34, 219, 171, 184, - 16, 169, 155, 146, 40, 183, 218, 172, 87, 47, 25, 233, 199, 243, 231, 91, - 132, 179, 106, 121, 80, 48, 61, 204, 252, 208, 11, 100, 168, 175, 66, 131, - 176, 36, 3, 3, 248, 238, 63, 26, 26, 40, 38, 192, 223, 69, 242, 198, - 229, 186, 209, 171, 180, 165, 37, 11, 161, 91, 183, 104, 225, 100, 105, 136, - 109, 221, 41, 14, 120, 81, 171, 51, 238, 152, 221, 113, 231, 140, 174, 172, - 101, 33, 212, 87, 82, 184, 99, 20, 81, 168, 150, 99, 14, 91, 157, 126, - 59, 194, 101, 147, 4, 56, 97, 180, 3, 137, 96, 252, 236, 140, 71, 102, - 69, 22, 64, 74, 105, 184, 192, 162, 28, 88, 133, 133, 29, 40, 10, 114, - 65, 189, 2, 95, 233, 66, 9, 208, 21, 173, 17, 86, 11, 47, 88, 251, - 144, 144, 244, 142, 43, 35, 153, 191, 93, 199, 147, 42, 28, 110, 84, 130, - 104, 203, 16, 219, 34, 156, 220, 96, 59, 25, 217, 13, 74, 65, 3, 32, - 104, 64, 75, 53, 0, 132, 7, 16, 47, 64, 42, 233, 69, 102, 27, 175, - 6, 6, 120, 42, 60, 196, 130, 4, 184, 187, 84, 82, 23, 149, 28, 230, - 111, 87, 32, 186, 1, 92, 174, 44, 144, 10, 242, 27, 138, 96, 68, 172, - 101, 2, 173, 114, 41, 182, 40, 157, 38, 37, 93, 216, 101, 245, 168, 173, - 109, 36, 0, 246, 212, 82, 233, 88, 165, 31, 86, 160, 47, 135, 221, 74, - 127, 216, 236, 141, 36, 157, 36, 0, 249, 173, 250, 73, 255, 123, 66, 178, - 4, 123, 18, 152, 108, 22, 48, 92, 159, 44, 190, 101, 8, 4, 4, 2, - 164, 90, 134, 64, 114, 36, 195, 137, 153, 199, 140, 72, 89, 132, 13, 2, - 190, 10, 140, 186, 104, 158, 234, 188, 129, 184, 74, 158, 0, 118, 97, 159, - 209, 71, 217, 65, 131, 132, 245, 216, 163, 23, 242, 103, 101, 228, 141, 187, - 75, 133, 191, 72, 134, 186, 10, 162, 47, 203, 74, 224, 100, 185, 199, 231, - 170, 244, 253, 234, 229, 137, 166, 219, 30, 152, 240, 61, 108, 128, 40, 239, - 172, 61, 30, 192, 199, 204, 178, 131, 166, 237, 223, 199, 228, 219, 128, 128, - 173, 146, 241, 176, 46, 24, 195, 166, 137, 42, 51, 168, 226, 67, 63, 104, - 83, 85, 192, 159, 34, 254, 152, 107, 108, 101, 53, 144, 135, 127, 172, 108, - 162, 84, 177, 169, 38, 6, 131, 26, 186, 6, 82, 72, 62, 67, 103, 215, - 144, 22, 132, 196, 232, 225, 137, 74, 191, 78, 113, 168, 251, 17, 191, 133, - 82, 27, 222, 210, 51, 24, 54, 72, 91, 146, 246, 57, 225, 194, 99, 22, - 148, 221, 130, 21, 128, 236, 181, 21, 198, 48, 173, 140, 205, 98, 218, 143, - 226, 48, 20, 235, 248, 64, 82, 246, 148, 252, 205, 42, 140, 229, 37, 16, - 238, 75, 28, 168, 217, 230, 22, 251, 18, 17, 118, 0, 177, 102, 49, 119, - 129, 166, 11, 29, 131, 19, 234, 231, 6, 188, 13, 211, 26, 31, 227, 184, - 206, 176, 8, 186, 20, 167, 135, 165, 7, 132, 218, 26, 148, 126, 79, 140, - 5, 213, 54, 168, 164, 84, 38, 197, 6, 172, 26, 153, 37, 114, 179, 254, - 65, 195, 30, 137, 15, 166, 236, 148, 22, 225, 8, 165, 1, 22, 181, 203, - 69, 59, 81, 75, 39, 240, 157, 89, 90, 15, 66, 253, 235, 0, 228, 19, - 54, 181, 139, 59, 83, 222, 173, 38, 147, 206, 233, 224, 243, 239, 183, 80, - 1, 81, 249, 172, 218, 174, 180, 158, 19, 144, 138, 233, 150, 115, 145, 134, - 175, 134, 97, 11, 101, 4, 68, 83, 84, 143, 8, 152, 168, 189, 112, 42, - 16, 175, 197, 210, 219, 26, 178, 146, 138, 148, 39, 212, 57, 48, 201, 59, - 11, 131, 88, 74, 66, 239, 231, 102, 79, 16, 149, 22, 209, 120, 238, 231, - 251, 221, 198, 114, 151, 141, 194, 132, 75, 202, 105, 56, 190, 153, 161, 92, - 200, 134, 240, 187, 152, 76, 150, 154, 75, 139, 51, 73, 149, 62, 157, 167, - 4, 188, 123, 138, 54, 83, 115, 233, 141, 20, 101, 248, 20, 218, 17, 178, - 213, 95, 42, 155, 82, 204, 37, 85, 72, 209, 70, 11, 104, 75, 194, 188, - 74, 22, 105, 201, 154, 34, 89, 147, 147, 209, 231, 22, 64, 211, 183, 92, - 110, 130, 168, 250, 121, 187, 215, 83, 188, 146, 237, 56, 228, 108, 200, 45, - 102, 53, 18, 211, 151, 124, 197, 105, 236, 96, 150, 110, 13, 109, 15, 118, - 118, 115, 51, 49, 202, 208, 195, 152, 54, 120, 97, 120, 186, 194, 239, 45, - 211, 227, 198, 71, 238, 170, 146, 103, 134, 33, 74, 188, 12, 82, 57, 220, - 242, 208, 100, 128, 123, 67, 228, 208, 88, 25, 15, 70, 227, 142, 242, 220, - 27, 24, 186, 177, 203, 44, 153, 97, 203, 236, 180, 80, 188, 203, 195, 166, - 175, 25, 198, 8, 172, 237, 188, 57, 52, 115, 176, 38, 84, 76, 146, 64, - 172, 71, 230, 0, 215, 159, 38, 115, 125, 145, 11, 226, 24, 255, 135, 162, - 112, 152, 18, 27, 86, 67, 39, 239, 192, 7, 144, 24, 188, 61, 68, 247, - 124, 146, 121, 242, 9, 141, 153, 152, 46, 168, 241, 231, 224, 180, 73, 79, - 29, 52, 172, 112, 166, 206, 36, 227, 180, 96, 190, 13, 123, 131, 145, 76, - 105, 59, 83, 83, 47, 138, 75, 226, 241, 105, 135, 100, 168, 10, 157, 149, - 243, 120, 27, 46, 48, 37, 168, 154, 241, 200, 48, 22, 89, 148, 119, 155, - 218, 193, 219, 133, 29, 131, 188, 226, 184, 17, 76, 42, 93, 140, 182, 14, - 156, 133, 97, 63, 127, 198, 89, 158, 227, 189, 140, 121, 147, 191, 192, 66, - 134, 178, 40, 26, 165, 156, 152, 126, 217, 117, 214, 74, 166, 184, 101, 174, - 155, 111, 32, 244, 81, 138, 78, 122, 75, 1, 157, 43, 211, 117, 112, 178, - 16, 4, 120, 129, 88, 214, 191, 213, 13, 103, 80, 45, 50, 213, 145, 165, - 167, 148, 205, 216, 77, 131, 26, 49, 120, 128, 195, 217, 3, 85, 29, 167, - 19, 87, 108, 86, 68, 187, 105, 244, 70, 190, 133, 62, 98, 31, 59, 139, - 1, 134, 173, 27, 229, 164, 37, 117, 212, 201, 182, 164, 146, 118, 190, 61, - 179, 182, 10, 126, 105, 238, 228, 121, 103, 41, 151, 67, 201, 107, 105, 28, - 73, 208, 149, 132, 133, 137, 166, 200, 37, 189, 196, 222, 118, 137, 176, 216, - 165, 241, 219, 25, 35, 6, 46, 105, 172, 128, 125, 21, 190, 95, 96, 18, - 58, 180, 116, 59, 180, 130, 176, 201, 141, 0, 34, 49, 110, 10, 93, 230, - 19, 163, 51, 105, 178, 166, 22, 185, 232, 66, 233, 38, 64, 95, 39, 66, - 111, 153, 45, 206, 249, 144, 198, 130, 164, 104, 44, 123, 243, 49, 87, 92, - 120, 113, 229, 117, 132, 248, 231, 145, 212, 4, 18, 25, 8, 31, 43, 105, - 76, 101, 71, 185, 105, 166, 144, 246, 179, 147, 204, 138, 112, 224, 106, 6, - 212, 231, 121, 83, 51, 166, 226, 8, 151, 177, 245, 87, 112, 6, 254, 246, - 91, 250, 17, 173, 93, 63, 126, 60, 194, 117, 139, 126, 104, 153, 18, 79, - 94, 38, 131, 223, 44, 148, 129, 225, 173, 36, 91, 129, 31, 206, 186, 249, - 85, 132, 110, 227, 199, 64, 0, 160, 5, 168, 62, 10, 33, 248, 167, 0, - 251, 255, 204, 237, 225, 46, 199, 80, 8, 106, 252, 102, 230, 9, 52, 210, - 24, 221, 165, 13, 242, 229, 176, 10, 28, 120, 217, 102, 249, 170, 53, 24, - 129, 152, 105, 170, 68, 234, 134, 35, 14, 249, 71, 223, 114, 124, 90, 108, - 192, 253, 247, 188, 11, 155, 180, 103, 221, 139, 94, 36, 136, 82, 159, 60, - 250, 111, 135, 128, 188, 101, 123, 69, 70, 26, 159, 67, 175, 228, 154, 47, - 195, 160, 228, 26, 235, 46, 234, 194, 39, 53, 246, 203, 124, 38, 229, 174, - 62, 214, 124, 177, 117, 208, 111, 113, 223, 176, 27, 121, 150, 237, 75, 55, - 28, 33, 125, 19, 184, 15, 57, 212, 212, 9, 2, 215, 144, 91, 156, 99, - 200, 72, 192, 184, 102, 151, 31, 115, 69, 210, 214, 113, 205, 42, 191, 179, - 38, 13, 30, 13, 123, 174, 239, 148, 188, 13, 175, 184, 142, 138, 21, 142, - 231, 23, 55, 48, 168, 8, 114, 197, 134, 142, 5, 185, 96, 106, 49, 68, - 39, 25, 4, 72, 59, 200, 235, 8, 188, 228, 13, 111, 72, 17, 118, 87, - 126, 11, 155, 67, 96, 178, 116, 149, 152, 207, 163, 107, 91, 241, 24, 239, - 253, 52, 103, 126, 214, 103, 199, 122, 73, 37, 174, 76, 87, 208, 75, 252, - 148, 98, 167, 122, 132, 103, 79, 237, 40, 59, 209, 162, 123, 231, 231, 120, - 140, 160, 39, 66, 222, 21, 173, 80, 108, 3, 42, 96, 238, 227, 223, 16, - 225, 184, 85, 170, 128, 172, 99, 113, 197, 67, 165, 33, 81, 141, 155, 245, - 72, 71, 5, 235, 37, 44, 240, 92, 88, 39, 78, 80, 20, 112, 185, 43, - 103, 33, 72, 16, 57, 139, 62, 177, 129, 178, 197, 86, 120, 134, 136, 187, - 118, 58, 202, 157, 225, 141, 118, 169, 128, 198, 155, 240, 236, 68, 244, 118, - 134, 108, 12, 247, 214, 121, 35, 189, 94, 254, 230, 149, 17, 46, 52, 99, - 166, 221, 111, 190, 11, 255, 144, 230, 177, 238, 212, 2, 153, 161, 231, 190, - 5, 62, 106, 163, 195, 67, 185, 200, 57, 111, 79, 173, 197, 104, 86, 49, - 198, 130, 197, 2, 12, 158, 218, 128, 148, 173, 130, 26, 154, 80, 186, 249, - 98, 73, 220, 238, 170, 7, 161, 94, 149, 147, 79, 172, 145, 63, 179, 62, - 211, 2, 107, 189, 68, 191, 47, 210, 77, 39, 150, 5, 69, 25, 105, 172, - 96, 89, 168, 206, 91, 159, 185, 59, 232, 147, 108, 48, 73, 22, 27, 238, - 109, 22, 27, 146, 33, 253, 161, 24, 18, 161, 160, 134, 51, 235, 7, 48, - 122, 55, 152, 27, 211, 14, 110, 190, 250, 232, 116, 198, 78, 79, 114, 88, - 9, 88, 222, 233, 180, 60, 200, 123, 89, 11, 125, 215, 68, 34, 77, 19, - 211, 52, 85, 26, 60, 106, 247, 209, 28, 1, 211, 140, 57, 137, 44, 130, - 10, 240, 113, 245, 195, 200, 43, 17, 41, 242, 82, 206, 245, 252, 42, 71, - 86, 212, 173, 203, 149, 99, 141, 21, 192, 40, 3, 39, 107, 164, 96, 231, - 210, 32, 186, 86, 104, 216, 34, 228, 232, 180, 99, 183, 142, 215, 78, 144, - 120, 244, 232, 121, 39, 243, 13, 249, 188, 170, 133, 23, 79, 230, 223, 102, - 86, 132, 207, 235, 20, 76, 143, 158, 79, 201, 249, 121, 77, 11, 47, 157, - 204, 51, 60, 217, 136, 232, 60, 144, 125, 24, 238, 246, 164, 50, 232, 227, - 204, 84, 110, 50, 243, 2, 101, 70, 248, 39, 195, 89, 217, 198, 217, 66, - 88, 72, 98, 164, 227, 177, 66, 155, 167, 179, 214, 127, 134, 45, 2, 143, - 113, 212, 163, 191, 129, 182, 242, 124, 41, 38, 81, 194, 91, 65, 71, 122, - 187, 212, 19, 106, 67, 1, 161, 166, 233, 180, 137, 75, 5, 121, 101, 101, - 171, 19, 162, 202, 174, 144, 5, 50, 27, 173, 173, 206, 239, 173, 39, 185, - 14, 79, 196, 200, 53, 108, 1, 247, 132, 12, 145, 188, 191, 209, 185, 62, - 69, 122, 70, 246, 56, 114, 157, 200, 83, 95, 33, 131, 101, 241, 104, 12, - 100, 37, 28, 145, 8, 134, 113, 214, 122, 41, 110, 191, 80, 42, 133, 157, - 145, 189, 5, 69, 136, 243, 149, 99, 193, 98, 78, 112, 89, 174, 226, 89, - 162, 201, 22, 26, 205, 57, 89, 133, 10, 218, 78, 79, 164, 101, 8, 147, - 112, 106, 80, 240, 194, 199, 228, 81, 9, 119, 210, 65, 136, 150, 25, 233, - 217, 202, 211, 189, 78, 35, 168, 173, 176, 7, 191, 131, 185, 99, 29, 100, - 12, 187, 114, 220, 134, 66, 177, 34, 184, 21, 233, 80, 141, 84, 160, 39, - 2, 219, 83, 42, 55, 190, 84, 51, 175, 137, 183, 26, 48, 222, 14, 88, - 147, 132, 60, 226, 69, 166, 141, 106, 133, 7, 241, 217, 207, 212, 232, 92, - 197, 29, 2, 59, 47, 197, 235, 171, 209, 245, 52, 206, 239, 25, 209, 113, - 174, 148, 227, 194, 43, 241, 35, 241, 0, 186, 55, 33, 68, 193, 132, 113, - 78, 158, 15, 61, 248, 213, 153, 144, 115, 99, 45, 160, 201, 66, 165, 167, - 104, 33, 60, 234, 9, 255, 76, 29, 249, 17, 189, 76, 18, 141, 111, 88, - 96, 221, 31, 61, 188, 132, 48, 6, 190, 134, 0, 43, 174, 124, 116, 213, - 183, 229, 6, 55, 184, 118, 151, 81, 77, 224, 110, 67, 27, 193, 204, 76, - 1, 65, 132, 6, 75, 127, 15, 1, 22, 62, 183, 84, 218, 164, 251, 131, - 222, 185, 137, 241, 36, 99, 194, 239, 63, 91, 188, 252, 176, 80, 235, 7, - 220, 168, 220, 118, 151, 194, 247, 39, 40, 50, 142, 248, 230, 132, 133, 186, - 179, 86, 163, 81, 71, 111, 53, 168, 225, 130, 120, 41, 103, 45, 24, 224, - 141, 86, 181, 210, 150, 69, 12, 163, 225, 168, 78, 138, 60, 121, 243, 168, - 55, 54, 217, 229, 40, 223, 118, 192, 75, 175, 122, 73, 119, 18, 117, 188, - 62, 128, 14, 4, 162, 227, 213, 69, 181, 162, 60, 149, 14, 251, 240, 213, - 26, 121, 37, 141, 111, 99, 242, 230, 115, 52, 5, 171, 64, 114, 116, 151, - 202, 217, 185, 122, 53, 149, 177, 213, 25, 183, 97, 197, 168, 247, 198, 195, - 118, 196, 154, 17, 125, 4, 235, 145, 33, 103, 17, 3, 172, 113, 21, 29, - 124, 145, 121, 27, 149, 86, 215, 236, 224, 230, 59, 46, 30, 47, 27, 170, - 149, 145, 6, 120, 123, 223, 171, 18, 206, 37, 138, 129, 130, 169, 217, 75, - 213, 242, 151, 101, 103, 145, 91, 247, 45, 251, 127, 246, 77, 136, 139, 115, - 156, 177, 111, 241, 56, 139, 220, 82, 96, 224, 57, 62, 184, 236, 94, 66, - 88, 67, 19, 207, 65, 199, 237, 120, 39, 130, 112, 72, 168, 83, 131, 71, - 250, 226, 52, 255, 12, 6, 159, 124, 38, 162, 134, 37, 215, 53, 38, 210, - 205, 194, 45, 230, 169, 168, 207, 35, 166, 199, 31, 56, 61, 22, 225, 114, - 210, 236, 207, 130, 84, 220, 217, 183, 69, 198, 180, 19, 174, 31, 242, 114, - 73, 177, 91, 40, 5, 2, 211, 255, 141, 212, 115, 205, 22, 158, 184, 160, - 136, 158, 251, 161, 180, 249, 174, 16, 193, 80, 194, 153, 147, 106, 173, 82, - 158, 96, 96, 89, 105, 252, 132, 13, 192, 179, 206, 238, 89, 56, 27, 103, - 87, 99, 188, 240, 238, 25, 105, 74, 96, 94, 54, 165, 99, 244, 45, 123, - 156, 206, 21, 157, 162, 208, 148, 192, 99, 85, 6, 117, 205, 146, 202, 176, - 45, 225, 232, 141, 144, 60, 141, 176, 191, 32, 120, 65, 165, 106, 69, 76, - 17, 74, 250, 32, 72, 120, 244, 206, 54, 35, 141, 12, 9, 240, 101, 69, - 24, 208, 164, 0, 6, 208, 69, 219, 98, 60, 153, 167, 115, 27, 38, 187, - 80, 143, 148, 199, 243, 24, 150, 131, 106, 11, 221, 210, 28, 19, 135, 156, - 92, 115, 134, 92, 8, 75, 111, 154, 140, 211, 28, 60, 219, 107, 13, 11, - 94, 57, 203, 167, 92, 5, 216, 105, 145, 217, 152, 45, 70, 134, 1, 233, - 240, 84, 133, 132, 142, 236, 177, 167, 83, 147, 113, 119, 141, 115, 224, 190, - 232, 118, 196, 212, 70, 137, 112, 149, 229, 154, 218, 40, 49, 213, 40, 193, - 101, 16, 198, 149, 24, 92, 82, 251, 21, 85, 105, 16, 234, 215, 208, 98, - 17, 136, 216, 161, 227, 11, 22, 245, 199, 164, 117, 74, 216, 253, 3, 17, - 239, 177, 133, 120, 134, 253, 188, 66, 154, 162, 160, 104, 192, 210, 168, 56, - 184, 213, 82, 151, 245, 212, 37, 216, 50, 6, 39, 154, 101, 10, 249, 92, - 161, 110, 112, 136, 246, 56, 188, 86, 113, 255, 138, 110, 207, 168, 41, 40, - 150, 151, 230, 140, 199, 73, 181, 22, 158, 68, 130, 19, 222, 200, 162, 211, - 121, 22, 81, 10, 216, 173, 94, 222, 51, 240, 87, 27, 131, 232, 163, 173, - 82, 13, 209, 127, 163, 48, 219, 226, 126, 43, 148, 92, 58, 237, 230, 147, - 173, 146, 43, 251, 147, 101, 245, 120, 228, 100, 216, 253, 81, 236, 51, 64, - 183, 11, 245, 74, 104, 154, 174, 126, 93, 116, 116, 86, 65, 216, 30, 111, - 189, 12, 148, 184, 37, 147, 43, 50, 185, 137, 76, 129, 239, 144, 117, 248, - 45, 185, 196, 151, 146, 31, 162, 29, 117, 128, 186, 44, 2, 16, 241, 143, - 214, 21, 94, 214, 51, 11, 142, 79, 101, 191, 118, 17, 189, 228, 61, 45, - 67, 79, 228, 28, 148, 161, 234, 240, 85, 13, 32, 16, 107, 208, 58, 136, - 176, 152, 89, 101, 77, 151, 144, 140, 248, 194, 38, 207, 119, 53, 36, 51, - 244, 225, 187, 26, 8, 242, 35, 141, 134, 143, 209, 45, 128, 116, 233, 6, - 51, 1, 164, 170, 120, 176, 178, 33, 32, 127, 55, 174, 2, 219, 203, 146, - 200, 83, 118, 99, 166, 104, 135, 222, 195, 157, 167, 44, 200, 63, 176, 0, - 45, 19, 128, 40, 98, 17, 252, 158, 3, 255, 209, 98, 208, 31, 90, 189, - 31, 226, 110, 10, 45, 214, 69, 163, 251, 18, 215, 138, 228, 149, 5, 224, - 148, 159, 234, 6, 159, 87, 106, 178, 160, 86, 183, 208, 27, 47, 55, 164, - 251, 111, 56, 152, 227, 165, 157, 125, 215, 34, 150, 152, 130, 170, 79, 244, - 1, 49, 194, 53, 97, 246, 159, 80, 83, 64, 181, 252, 51, 188, 242, 206, - 11, 183, 181, 222, 146, 171, 11, 210, 27, 96, 125, 6, 223, 21, 199, 219, - 121, 113, 93, 191, 170, 5, 184, 194, 253, 145, 175, 39, 245, 75, 143, 29, - 252, 231, 41, 103, 77, 57, 31, 97, 11, 132, 1, 131, 128, 107, 241, 72, - 193, 130, 145, 58, 8, 225, 35, 224, 163, 63, 54, 35, 52, 212, 217, 32, - 251, 76, 215, 124, 42, 203, 3, 66, 248, 103, 40, 16, 116, 13, 128, 254, - 46, 252, 121, 166, 145, 4, 159, 215, 101, 17, 26, 59, 225, 170, 107, 32, - 214, 6, 252, 3, 33, 112, 12, 130, 118, 5, 173, 210, 120, 92, 41, 173, - 186, 145, 210, 109, 208, 128, 224, 191, 200, 117, 57, 61, 201, 81, 104, 6, - 161, 104, 17, 239, 76, 4, 55, 115, 196, 68, 57, 152, 118, 131, 137, 44, - 84, 127, 244, 22, 67, 167, 52, 120, 12, 147, 89, 82, 2, 53, 12, 83, - 241, 65, 79, 73, 75, 55, 178, 67, 88, 167, 252, 164, 113, 137, 55, 231, - 73, 33, 28, 173, 224, 2, 67, 239, 54, 49, 195, 91, 155, 104, 38, 45, - 84, 226, 66, 128, 75, 122, 178, 140, 220, 207, 203, 176, 97, 199, 78, 224, - 109, 32, 218, 124, 177, 185, 141, 180, 99, 182, 142, 108, 110, 11, 186, 130, - 193, 211, 4, 54, 252, 34, 49, 208, 88, 180, 234, 32, 100, 96, 180, 49, - 83, 54, 129, 15, 216, 26, 63, 200, 167, 86, 140, 188, 111, 252, 37, 228, - 125, 83, 31, 19, 137, 91, 49, 190, 82, 139, 53, 29, 124, 247, 1, 22, - 58, 194, 76, 91, 30, 111, 232, 43, 9, 242, 253, 122, 251, 108, 0, 187, - 144, 39, 230, 233, 197, 184, 141, 86, 155, 144, 250, 7, 204, 213, 185, 115, - 90, 117, 7, 248, 231, 6, 78, 215, 190, 202, 86, 120, 133, 121, 164, 158, - 251, 0, 215, 155, 68, 153, 10, 184, 212, 157, 59, 168, 252, 232, 230, 3, - 111, 21, 31, 131, 144, 79, 43, 255, 193, 171, 210, 173, 173, 92, 190, 68, - 45, 172, 77, 12, 202, 104, 94, 247, 122, 29, 20, 103, 6, 245, 198, 61, - 87, 167, 167, 168, 174, 104, 246, 186, 213, 122, 114, 91, 137, 37, 193, 66, - 85, 29, 245, 6, 127, 111, 193, 208, 247, 164, 241, 170, 212, 31, 128, 20, - 172, 54, 161, 231, 136, 103, 91, 105, 155, 213, 94, 111, 80, 107, 117, 209, - 96, 226, 111, 237, 46, 121, 217, 161, 3, 29, 212, 59, 198, 127, 46, 170, - 199, 197, 131, 229, 148, 62, 53, 52, 45, 111, 33, 188, 95, 105, 215, 97, - 83, 142, 60, 19, 22, 75, 102, 69, 154, 40, 135, 110, 109, 33, 220, 193, - 63, 102, 156, 13, 85, 238, 157, 111, 120, 105, 89, 118, 44, 207, 33, 69, - 17, 84, 232, 19, 26, 244, 252, 22, 144, 182, 136, 114, 236, 135, 122, 22, - 30, 98, 169, 170, 2, 151, 233, 15, 208, 80, 120, 15, 29, 82, 13, 211, - 41, 248, 200, 255, 184, 57, 4, 220, 204, 241, 139, 159, 11, 224, 197, 49, - 171, 110, 152, 134, 175, 89, 65, 38, 37, 52, 148, 238, 46, 54, 30, 108, - 63, 43, 155, 244, 187, 38, 33, 218, 6, 52, 233, 152, 148, 111, 77, 132, - 154, 39, 236, 113, 89, 125, 5, 214, 37, 220, 57, 236, 51, 219, 197, 237, - 81, 14, 195, 156, 214, 113, 17, 159, 188, 19, 9, 114, 177, 191, 89, 154, - 223, 218, 21, 192, 54, 128, 101, 44, 237, 16, 19, 61, 68, 122, 220, 184, - 244, 140, 42, 59, 183, 103, 240, 39, 155, 166, 202, 206, 115, 28, 150, 41, - 88, 147, 249, 198, 87, 131, 146, 120, 152, 196, 19, 73, 2, 78, 226, 97, - 146, 166, 74, 2, 165, 164, 177, 24, 219, 218, 207, 252, 164, 168, 52, 150, - 21, 167, 75, 150, 151, 17, 58, 3, 176, 62, 99, 77, 93, 227, 92, 119, - 111, 226, 8, 85, 18, 104, 35, 122, 47, 169, 35, 219, 129, 53, 34, 197, - 221, 11, 243, 205, 65, 44, 232, 170, 25, 154, 119, 116, 50, 205, 230, 170, - 139, 137, 184, 175, 129, 37, 225, 56, 39, 154, 36, 138, 213, 186, 247, 94, - 101, 139, 130, 52, 80, 16, 165, 233, 62, 91, 234, 142, 101, 153, 31, 22, - 161, 246, 37, 253, 177, 44, 237, 227, 39, 130, 8, 233, 156, 191, 1, 255, - 193, 255, 51, 188, 206, 64, 64, 222, 219, 200, 193, 2, 181, 225, 229, 125, - 248, 87, 202, 8, 40, 228, 37, 67, 225, 137, 132, 124, 19, 18, 155, 175, - 20, 88, 99, 4, 58, 54, 183, 36, 200, 92, 182, 147, 244, 205, 48, 111, - 42, 175, 121, 250, 139, 167, 191, 248, 218, 106, 53, 188, 140, 177, 197, 249, - 128, 30, 182, 144, 176, 255, 34, 27, 190, 31, 120, 219, 10, 127, 219, 252, - 19, 85, 207, 170, 3, 124, 173, 80, 32, 44, 91, 63, 80, 169, 147, 254, - 182, 232, 47, 102, 169, 118, 34, 254, 123, 137, 89, 90, 223, 113, 217, 131, - 66, 71, 173, 74, 251, 116, 212, 107, 195, 158, 13, 24, 49, 194, 177, 241, - 247, 18, 97, 106, 89, 220, 139, 1, 192, 219, 145, 244, 248, 32, 0, 164, - 29, 58, 206, 172, 212, 106, 104, 51, 86, 105, 247, 155, 16, 206, 138, 164, - 18, 143, 28, 151, 7, 58, 0, 76, 216, 52, 114, 59, 177, 201, 203, 80, - 207, 227, 198, 175, 64, 143, 159, 35, 210, 196, 168, 39, 74, 161, 124, 245, - 209, 160, 85, 197, 21, 177, 70, 199, 193, 189, 78, 127, 60, 146, 145, 195, - 86, 7, 86, 208, 1, 236, 151, 234, 67, 174, 30, 170, 189, 159, 161, 2, - 251, 16, 15, 132, 161, 13, 168, 206, 222, 131, 97, 247, 107, 72, 26, 183, - 224, 136, 79, 140, 129, 16, 67, 229, 26, 131, 190, 5, 255, 250, 149, 193, - 168, 85, 29, 67, 205, 20, 133, 232, 104, 180, 53, 52, 227, 230, 58, 120, - 22, 12, 83, 104, 68, 112, 236, 58, 25, 42, 67, 253, 93, 106, 235, 174, - 152, 233, 122, 30, 54, 1, 43, 80, 207, 211, 230, 138, 242, 185, 209, 28, - 215, 51, 119, 128, 179, 107, 131, 11, 232, 177, 226, 152, 43, 55, 6, 69, - 88, 90, 33, 218, 173, 44, 12, 12, 8, 103, 49, 72, 27, 172, 202, 40, - 196, 71, 67, 143, 80, 183, 250, 64, 73, 79, 73, 73, 240, 173, 127, 142, - 72, 196, 128, 237, 201, 177, 45, 238, 21, 226, 193, 185, 4, 146, 93, 12, - 50, 36, 30, 42, 209, 155, 130, 114, 166, 162, 144, 105, 249, 60, 234, 40, - 161, 22, 28, 228, 83, 11, 162, 216, 191, 247, 127, 15, 184, 28, 128, 9, - 60, 132, 41, 61, 169, 116, 99, 159, 1, 98, 198, 241, 48, 6, 233, 238, - 126, 247, 4, 92, 82, 215, 28, 119, 245, 194, 134, 63, 43, 109, 191, 85, - 171, 1, 27, 191, 81, 92, 18, 19, 72, 120, 93, 34, 137, 113, 168, 243, - 144, 187, 237, 150, 99, 145, 241, 195, 246, 142, 20, 9, 27, 141, 118, 125, - 72, 215, 17, 38, 58, 5, 26, 154, 105, 44, 9, 42, 252, 238, 197, 142, - 41, 202, 205, 252, 244, 160, 228, 47, 157, 146, 252, 37, 87, 83, 15, 59, - 87, 113, 22, 132, 228, 152, 4, 207, 14, 62, 60, 19, 69, 162, 216, 124, - 139, 139, 135, 95, 105, 155, 125, 143, 255, 41, 237, 41, 243, 180, 82, 61, - 133, 5, 91, 152, 108, 223, 202, 32, 104, 89, 2, 126, 214, 170, 105, 220, - 19, 98, 178, 43, 192, 36, 72, 77, 184, 67, 69, 193, 252, 133, 29, 116, - 237, 137, 117, 122, 190, 104, 223, 109, 14, 97, 43, 2, 253, 238, 226, 194, - 80, 39, 7, 11, 32, 161, 144, 99, 7, 216, 63, 195, 206, 178, 25, 38, - 205, 191, 217, 83, 180, 227, 9, 200, 80, 116, 31, 96, 15, 76, 107, 210, - 148, 26, 4, 190, 97, 107, 223, 204, 155, 177, 73, 133, 117, 58, 36, 198, - 231, 57, 195, 173, 96, 174, 34, 232, 162, 137, 241, 160, 24, 64, 10, 229, - 244, 9, 134, 198, 123, 124, 215, 177, 186, 29, 6, 126, 31, 158, 194, 236, - 10, 115, 158, 104, 242, 233, 112, 124, 134, 111, 168, 32, 138, 67, 24, 150, - 236, 214, 240, 84, 24, 244, 3, 23, 102, 219, 104, 24, 109, 192, 68, 97, - 63, 234, 73, 135, 194, 225, 204, 138, 211, 253, 78, 190, 132, 159, 88, 63, - 88, 145, 30, 239, 119, 124, 129, 45, 79, 123, 245, 37, 48, 245, 81, 34, - 73, 52, 95, 130, 83, 47, 60, 50, 24, 192, 139, 73, 105, 28, 50, 236, - 41, 45, 245, 22, 183, 67, 192, 192, 91, 113, 211, 50, 12, 183, 199, 13, - 91, 136, 134, 32, 21, 93, 29, 13, 218, 97, 226, 248, 225, 199, 143, 153, - 238, 40, 134, 82, 193, 132, 129, 89, 66, 222, 136, 235, 231, 240, 210, 12, - 89, 127, 67, 247, 12, 113, 38, 192, 22, 45, 174, 147, 169, 145, 89, 171, - 23, 84, 130, 165, 198, 68, 52, 157, 3, 197, 244, 246, 212, 103, 8, 225, - 19, 169, 186, 101, 17, 237, 21, 226, 99, 226, 195, 190, 250, 48, 52, 77, - 239, 81, 173, 197, 139, 31, 230, 232, 135, 127, 248, 236, 183, 162, 18, 168, - 223, 205, 231, 119, 142, 38, 89, 152, 103, 38, 190, 161, 64, 19, 231, 218, - 231, 180, 20, 120, 87, 165, 143, 62, 237, 168, 45, 7, 92, 151, 123, 40, - 39, 81, 92, 212, 144, 157, 177, 39, 16, 124, 182, 189, 204, 227, 96, 174, - 125, 95, 135, 249, 215, 250, 83, 214, 197, 18, 35, 65, 221, 97, 230, 98, - 247, 239, 14, 185, 218, 20, 174, 221, 239, 149, 55, 62, 187, 194, 107, 197, - 135, 100, 125, 119, 211, 9, 11, 249, 126, 185, 201, 46, 146, 197, 9, 171, - 165, 56, 140, 182, 163, 142, 127, 98, 2, 87, 129, 114, 107, 116, 4, 80, - 23, 72, 112, 230, 29, 172, 229, 6, 205, 44, 17, 192, 251, 25, 41, 169, - 241, 181, 170, 159, 157, 252, 203, 47, 76, 254, 133, 71, 86, 129, 163, 92, - 98, 208, 104, 152, 235, 239, 48, 30, 230, 130, 121, 32, 59, 164, 182, 171, - 126, 67, 116, 85, 59, 111, 150, 139, 177, 78, 167, 93, 225, 27, 81, 216, - 250, 197, 126, 91, 88, 219, 6, 56, 88, 202, 60, 110, 86, 218, 231, 57, - 94, 100, 79, 82, 154, 21, 139, 86, 170, 55, 255, 121, 49, 11, 37, 240, - 225, 195, 98, 130, 147, 148, 220, 16, 19, 199, 179, 126, 220, 23, 248, 81, - 139, 193, 133, 82, 88, 100, 44, 103, 85, 102, 90, 15, 33, 131, 70, 223, - 30, 254, 11, 149, 35, 39, 133, 52, 61, 138, 203, 90, 152, 87, 246, 53, - 223, 39, 160, 246, 252, 44, 13, 244, 39, 158, 9, 125, 65, 0, 205, 179, - 116, 83, 132, 52, 57, 100, 133, 161, 201, 116, 150, 131, 135, 194, 223, 116, - 231, 164, 9, 119, 26, 139, 140, 50, 174, 28, 134, 252, 91, 43, 71, 236, - 122, 73, 229, 226, 23, 125, 240, 46, 44, 139, 137, 33, 10, 65, 254, 61, - 134, 165, 65, 218, 196, 176, 213, 140, 61, 117, 25, 227, 110, 85, 200, 7, - 218, 183, 164, 127, 14, 125, 187, 98, 168, 181, 117, 113, 37, 10, 150, 46, - 64, 69, 14, 29, 185, 56, 138, 36, 7, 128, 108, 204, 81, 5, 3, 79, - 172, 34, 105, 40, 73, 17, 220, 141, 9, 238, 198, 4, 63, 224, 15, 55, - 231, 230, 62, 63, 165, 246, 205, 208, 188, 170, 227, 249, 231, 36, 157, 217, - 160, 141, 71, 250, 18, 194, 92, 199, 188, 220, 156, 56, 166, 109, 95, 58, - 230, 254, 241, 229, 9, 132, 117, 234, 181, 52, 90, 217, 166, 47, 209, 82, - 34, 179, 177, 159, 210, 65, 167, 229, 154, 146, 134, 170, 255, 180, 26, 212, - 82, 170, 6, 61, 253, 170, 106, 156, 231, 205, 212, 89, 189, 209, 234, 166, - 17, 78, 109, 136, 22, 230, 68, 154, 144, 41, 134, 228, 219, 136, 99, 176, - 182, 161, 162, 165, 138, 25, 14, 33, 148, 0, 80, 208, 159, 162, 167, 130, - 171, 122, 176, 191, 161, 45, 103, 16, 113, 12, 27, 45, 243, 68, 5, 114, - 209, 16, 88, 196, 192, 125, 149, 200, 77, 89, 244, 146, 162, 80, 153, 138, - 66, 177, 10, 39, 242, 99, 7, 34, 7, 196, 28, 36, 170, 125, 32, 50, - 81, 68, 162, 214, 173, 107, 8, 6, 134, 109, 2, 169, 181, 64, 159, 107, - 157, 134, 199, 204, 134, 49, 108, 53, 58, 21, 69, 107, 8, 75, 15, 171, - 50, 24, 15, 245, 32, 45, 61, 122, 244, 56, 220, 48, 70, 245, 238, 176, - 55, 72, 247, 250, 25, 60, 89, 51, 62, 232, 121, 125, 232, 42, 236, 249, - 52, 16, 240, 95, 189, 190, 99, 36, 187, 13, 87, 151, 180, 160, 7, 68, - 103, 32, 204, 14, 241, 160, 214, 124, 10, 73, 226, 136, 227, 75, 7, 66, - 79, 114, 225, 62, 190, 109, 152, 79, 179, 33, 85, 98, 195, 252, 96, 135, - 157, 113, 59, 253, 212, 121, 138, 41, 160, 171, 141, 15, 133, 208, 171, 231, - 214, 160, 149, 7, 148, 216, 128, 36, 245, 168, 46, 90, 135, 181, 107, 117, - 175, 210, 31, 224, 25, 70, 209, 7, 3, 195, 4, 37, 69, 67, 144, 101, - 98, 32, 83, 81, 4, 34, 171, 194, 28, 198, 33, 117, 199, 212, 137, 156, - 189, 127, 185, 216, 115, 253, 222, 72, 228, 231, 225, 243, 123, 26, 235, 126, - 8, 187, 6, 234, 198, 13, 188, 190, 72, 231, 106, 189, 17, 84, 146, 190, - 148, 125, 10, 67, 242, 137, 199, 57, 249, 35, 60, 188, 244, 156, 240, 186, - 144, 19, 66, 56, 167, 27, 127, 51, 103, 138, 50, 82, 140, 188, 233, 241, - 61, 94, 201, 243, 227, 91, 55, 118, 249, 200, 182, 234, 48, 254, 199, 140, - 243, 62, 2, 198, 161, 206, 247, 234, 163, 10, 153, 117, 5, 181, 101, 218, - 13, 193, 174, 169, 82, 40, 237, 6, 45, 207, 63, 91, 199, 65, 175, 253, - 67, 128, 51, 126, 10, 149, 38, 79, 1, 110, 238, 234, 241, 92, 0, 79, - 21, 104, 39, 47, 140, 150, 241, 216, 140, 92, 252, 254, 183, 42, 56, 220, - 186, 113, 54, 132, 110, 128, 242, 219, 130, 175, 154, 221, 145, 75, 190, 98, - 24, 23, 39, 32, 151, 7, 129, 180, 44, 58, 203, 155, 69, 199, 141, 175, - 240, 59, 173, 169, 134, 6, 144, 70, 29, 35, 215, 113, 55, 80, 223, 110, - 157, 127, 81, 188, 206, 196, 146, 95, 27, 70, 180, 139, 126, 232, 248, 63, - 207, 89, 249, 18, 146, 123, 152, 141, 163, 144, 28, 195, 108, 252, 25, 94, - 231, 106, 240, 75, 83, 45, 253, 37, 251, 197, 62, 202, 30, 217, 127, 102, - 255, 36, 229, 173, 204, 138, 177, 234, 59, 244, 159, 185, 31, 174, 81, 15, - 134, 129, 49, 116, 195, 221, 222, 104, 104, 14, 189, 240, 115, 11, 37, 90, - 220, 162, 15, 253, 240, 121, 27, 118, 241, 195, 128, 126, 115, 195, 102, 165, - 6, 162, 243, 176, 24, 190, 232, 141, 7, 149, 113, 77, 133, 148, 194, 195, - 102, 175, 219, 16, 239, 106, 247, 191, 111, 158, 79, 173, 45, 84, 251, 67, - 255, 11, 81, 252, 120, 173, 30, 73, 158, 32, 229, 205, 219, 48, 190, 96, - 184, 239, 171, 225, 174, 185, 230, 176, 246, 13, 42, 28, 173, 83, 208, 30, - 9, 149, 23, 232, 94, 191, 40, 180, 214, 102, 248, 241, 57, 121, 196, 48, - 232, 219, 77, 153, 178, 153, 35, 13, 59, 76, 73, 152, 80, 51, 172, 155, - 72, 73, 85, 171, 201, 148, 53, 76, 89, 211, 83, 94, 171, 148, 84, 245, - 115, 82, 226, 51, 227, 22, 95, 96, 0, 136, 255, 206, 76, 248, 4, 193, - 74, 21, 124, 210, 170, 36, 175, 12, 244, 109, 25, 112, 45, 2, 106, 20, - 128, 58, 163, 76, 17, 155, 244, 6, 97, 51, 195, 255, 161, 137, 65, 107, - 216, 27, 142, 7, 231, 149, 106, 157, 93, 127, 20, 133, 99, 33, 116, 171, - 2, 255, 177, 177, 128, 135, 110, 102, 224, 65, 250, 255, 192, 59, 147, 25, - 116, 123, 22, 15, 29, 14, 194, 89, 235, 120, 21, 182, 90, 105, 101, 124, - 89, 114, 55, 80, 25, 99, 189, 236, 120, 229, 226, 6, 43, 179, 160, 18, - 29, 9, 51, 129, 180, 79, 8, 208, 170, 70, 58, 230, 16, 248, 92, 185, - 34, 154, 81, 8, 252, 9, 28, 69, 115, 179, 218, 26, 84, 219, 245, 33, - 57, 174, 41, 42, 111, 160, 51, 134, 4, 35, 69, 33, 107, 54, 228, 180, - 108, 45, 16, 16, 190, 165, 102, 13, 199, 230, 122, 171, 241, 252, 208, 60, - 100, 218, 23, 164, 133, 155, 39, 125, 60, 1, 132, 193, 22, 112, 120, 123, - 136, 210, 48, 200, 191, 202, 33, 32, 217, 75, 176, 53, 136, 116, 252, 76, - 158, 82, 90, 231, 105, 174, 46, 20, 66, 191, 194, 77, 115, 224, 242, 29, - 81, 174, 196, 222, 76, 96, 218, 61, 64, 189, 99, 214, 204, 249, 136, 218, - 89, 214, 205, 31, 126, 162, 227, 225, 147, 218, 134, 143, 74, 27, 15, 243, - 47, 162, 27, 82, 187, 177, 122, 12, 237, 250, 229, 166, 95, 110, 248, 105, - 179, 15, 109, 22, 10, 52, 56, 195, 64, 124, 124, 92, 142, 77, 171, 249, - 94, 150, 20, 178, 31, 160, 10, 114, 155, 65, 69, 7, 177, 7, 39, 117, - 152, 13, 120, 89, 177, 182, 25, 50, 52, 86, 136, 112, 88, 248, 38, 192, - 177, 66, 223, 93, 182, 46, 239, 107, 185, 37, 36, 86, 178, 68, 13, 19, - 203, 119, 231, 91, 192, 192, 24, 20, 43, 12, 20, 42, 150, 229, 169, 112, - 31, 195, 255, 209, 16, 88, 90, 139, 31, 138, 129, 117, 183, 217, 6, 47, - 131, 48, 29, 43, 124, 75, 133, 100, 60, 111, 213, 219, 132, 105, 69, 183, - 43, 189, 49, 106, 118, 194, 178, 95, 161, 27, 48, 133, 98, 213, 209, 32, - 80, 239, 105, 236, 48, 26, 32, 54, 22, 124, 138, 177, 177, 96, 229, 248, - 62, 174, 12, 22, 129, 84, 111, 183, 118, 56, 111, 87, 26, 184, 120, 143, - 187, 244, 84, 89, 158, 255, 182, 123, 11, 37, 39, 96, 205, 77, 106, 228, - 127, 216, 234, 225, 107, 151, 181, 84, 24, 248, 73, 72, 9, 1, 221, 83, - 135, 100, 68, 119, 198, 195, 26, 248, 49, 112, 150, 91, 76, 15, 186, 87, - 189, 246, 85, 157, 153, 46, 155, 244, 146, 46, 60, 148, 64, 26, 145, 202, - 100, 153, 54, 129, 208, 102, 88, 143, 208, 9, 15, 31, 22, 143, 233, 40, - 57, 67, 126, 123, 101, 72, 147, 67, 196, 4, 151, 72, 38, 143, 240, 52, - 209, 62, 63, 166, 50, 78, 76, 143, 110, 204, 97, 69, 161, 88, 246, 189, - 69, 128, 73, 82, 222, 8, 208, 211, 0, 217, 246, 210, 2, 66, 214, 189, - 154, 114, 55, 47, 71, 69, 167, 40, 32, 151, 203, 180, 58, 173, 225, 2, - 197, 1, 240, 42, 194, 100, 64, 64, 96, 230, 69, 118, 47, 21, 3, 57, - 99, 184, 71, 225, 194, 239, 173, 113, 45, 156, 160, 77, 114, 132, 147, 12, - 127, 19, 110, 114, 161, 21, 88, 43, 164, 115, 73, 172, 30, 168, 155, 234, - 165, 176, 100, 225, 225, 94, 40, 163, 155, 54, 2, 97, 166, 252, 148, 179, - 174, 197, 192, 66, 203, 49, 16, 21, 36, 162, 100, 113, 164, 253, 151, 42, - 106, 113, 2, 53, 222, 196, 184, 18, 196, 149, 244, 56, 94, 83, 40, 174, - 12, 113, 101, 45, 14, 215, 89, 84, 85, 199, 184, 85, 136, 91, 213, 227, - 176, 34, 34, 223, 26, 196, 173, 105, 113, 229, 34, 103, 59, 103, 120, 135, - 233, 102, 232, 253, 248, 17, 209, 223, 233, 86, 8, 148, 129, 183, 173, 16, - 104, 227, 80, 108, 68, 133, 161, 221, 2, 90, 169, 219, 126, 54, 29, 217, - 211, 12, 8, 129, 118, 191, 215, 142, 26, 189, 46, 202, 163, 88, 112, 137, - 200, 92, 194, 190, 129, 206, 90, 165, 191, 10, 55, 27, 187, 11, 77, 216, - 49, 86, 181, 88, 21, 16, 112, 76, 25, 42, 41, 132, 17, 244, 6, 65, - 213, 84, 46, 239, 140, 69, 85, 74, 53, 58, 184, 223, 215, 24, 129, 12, - 9, 38, 191, 201, 161, 101, 250, 166, 140, 146, 210, 128, 111, 216, 177, 212, - 44, 182, 136, 40, 55, 196, 210, 2, 3, 112, 223, 134, 154, 85, 57, 206, - 121, 194, 68, 147, 134, 56, 59, 236, 29, 162, 221, 190, 31, 108, 224, 159, - 111, 40, 134, 131, 128, 226, 243, 241, 146, 28, 253, 62, 107, 159, 72, 28, - 158, 172, 143, 72, 30, 2, 107, 135, 94, 48, 9, 78, 116, 221, 112, 62, - 239, 228, 29, 9, 82, 190, 204, 175, 51, 125, 134, 70, 24, 107, 83, 31, - 72, 100, 66, 226, 104, 108, 186, 32, 89, 6, 55, 102, 141, 175, 193, 136, - 42, 100, 227, 95, 111, 80, 187, 47, 4, 234, 184, 208, 112, 21, 240, 44, - 66, 96, 163, 9, 35, 205, 211, 171, 149, 238, 85, 101, 104, 224, 205, 31, - 93, 96, 13, 199, 213, 106, 189, 94, 163, 103, 248, 22, 242, 97, 130, 122, - 71, 203, 61, 186, 99, 0, 193, 219, 206, 74, 164, 30, 159, 20, 166, 149, - 217, 174, 19, 27, 240, 198, 221, 130, 219, 29, 91, 183, 237, 101, 35, 94, - 65, 106, 97, 202, 203, 22, 85, 23, 199, 92, 29, 12, 36, 74, 43, 71, - 5, 2, 67, 201, 226, 122, 10, 250, 160, 33, 215, 215, 174, 66, 207, 129, - 255, 175, 9, 206, 177, 160, 177, 139, 176, 245, 56, 24, 98, 128, 20, 129, - 53, 151, 55, 106, 131, 94, 255, 20, 183, 43, 189, 73, 158, 28, 152, 120, - 194, 43, 35, 215, 132, 49, 220, 80, 199, 70, 124, 115, 167, 215, 235, 60, - 34, 165, 19, 174, 202, 163, 212, 66, 79, 8, 1, 22, 7, 135, 40, 2, - 225, 126, 165, 31, 26, 13, 203, 61, 238, 44, 173, 213, 46, 142, 43, 130, - 87, 2, 137, 79, 6, 75, 185, 143, 8, 113, 63, 185, 140, 36, 73, 75, - 117, 166, 168, 252, 123, 124, 31, 14, 255, 247, 168, 245, 20, 54, 131, 131, - 202, 104, 220, 38, 59, 149, 225, 35, 84, 79, 19, 96, 250, 116, 109, 86, - 205, 64, 189, 135, 25, 141, 134, 180, 152, 184, 238, 61, 105, 104, 252, 123, - 105, 56, 132, 13, 88, 168, 48, 196, 60, 109, 70, 204, 4, 156, 155, 212, - 187, 127, 100, 137, 25, 2, 155, 130, 86, 21, 125, 72, 130, 156, 200, 52, - 120, 214, 174, 244, 73, 105, 170, 213, 33, 139, 162, 37, 4, 48, 11, 230, - 115, 44, 86, 206, 112, 250, 70, 146, 38, 204, 247, 254, 38, 69, 132, 91, - 111, 188, 112, 38, 80, 45, 6, 196, 246, 139, 192, 30, 138, 44, 35, 200, - 224, 72, 11, 150, 23, 203, 55, 136, 185, 76, 233, 84, 147, 99, 31, 114, - 247, 131, 119, 156, 210, 117, 30, 94, 217, 178, 87, 11, 43, 138, 31, 167, - 155, 10, 244, 76, 70, 110, 42, 116, 179, 121, 236, 73, 221, 144, 172, 202, - 51, 201, 95, 4, 201, 51, 26, 94, 27, 223, 126, 65, 12, 93, 167, 65, - 239, 10, 129, 199, 213, 240, 241, 56, 104, 97, 205, 200, 139, 25, 31, 223, - 74, 82, 41, 120, 125, 198, 144, 109, 162, 160, 24, 178, 205, 211, 33, 224, - 244, 53, 233, 39, 31, 226, 131, 77, 53, 238, 240, 59, 194, 84, 83, 121, - 210, 235, 134, 139, 64, 116, 27, 120, 191, 205, 212, 236, 110, 133, 158, 184, - 244, 238, 130, 68, 224, 161, 21, 168, 40, 11, 247, 189, 139, 57, 161, 13, - 30, 45, 190, 120, 239, 196, 223, 137, 239, 176, 231, 49, 160, 155, 231, 106, - 218, 163, 106, 33, 10, 67, 53, 98, 133, 43, 18, 81, 252, 254, 252, 17, - 126, 91, 91, 81, 30, 232, 4, 100, 97, 63, 217, 234, 84, 218, 167, 253, - 202, 104, 169, 219, 11, 17, 111, 98, 124, 124, 146, 171, 101, 250, 103, 31, - 229, 238, 107, 213, 127, 224, 254, 111, 233, 14, 77, 106, 252, 155, 163, 73, - 79, 128, 252, 203, 45, 146, 84, 220, 196, 6, 203, 118, 106, 20, 148, 229, - 16, 205, 206, 234, 35, 152, 203, 136, 113, 220, 131, 1, 201, 229, 48, 248, - 112, 157, 85, 74, 41, 136, 118, 154, 205, 186, 50, 218, 175, 98, 234, 46, - 106, 79, 98, 185, 221, 250, 116, 196, 226, 67, 156, 129, 124, 100, 116, 123, - 35, 132, 45, 198, 15, 253, 87, 216, 182, 39, 156, 213, 73, 23, 23, 104, - 107, 140, 236, 222, 244, 110, 184, 186, 184, 243, 176, 83, 216, 122, 188, 151, - 116, 59, 36, 186, 29, 202, 67, 140, 95, 239, 255, 66, 142, 192, 67, 232, - 142, 101, 206, 47, 110, 76, 176, 132, 231, 139, 102, 111, 146, 72, 49, 68, - 255, 19, 66, 5, 88, 12, 184, 154, 230, 137, 34, 118, 127, 129, 163, 16, - 202, 128, 193, 90, 175, 53, 212, 16, 195, 220, 210, 11, 134, 216, 231, 43, - 212, 105, 68, 182, 110, 33, 112, 181, 26, 83, 88, 134, 62, 30, 135, 14, - 230, 151, 206, 48, 38, 205, 138, 28, 161, 201, 70, 168, 122, 197, 163, 188, - 30, 143, 242, 123, 122, 192, 176, 65, 188, 169, 181, 96, 32, 158, 118, 209, - 15, 199, 25, 57, 111, 207, 243, 245, 86, 171, 224, 185, 25, 67, 40, 153, - 33, 160, 12, 55, 128, 204, 251, 160, 43, 195, 217, 55, 101, 65, 141, 97, - 179, 255, 1, 22, 60, 39, 201, 204, 85, 219, 43, 190, 230, 186, 45, 141, - 230, 161, 79, 59, 60, 85, 54, 9, 4, 183, 119, 232, 242, 93, 122, 159, - 29, 233, 221, 103, 212, 61, 99, 98, 138, 49, 151, 178, 250, 134, 94, 117, - 121, 210, 248, 158, 157, 0, 192, 206, 181, 135, 225, 169, 247, 21, 178, 178, - 150, 19, 21, 246, 93, 194, 224, 45, 112, 60, 41, 196, 8, 225, 88, 248, - 24, 160, 124, 196, 26, 117, 78, 77, 200, 182, 82, 230, 39, 25, 236, 208, - 251, 223, 162, 149, 199, 180, 146, 77, 58, 28, 244, 80, 94, 70, 255, 61, - 63, 111, 141, 173, 55, 130, 128, 22, 14, 93, 7, 138, 116, 60, 198, 3, - 168, 182, 123, 227, 154, 48, 98, 93, 34, 117, 163, 37, 141, 27, 255, 63, - 79, 9, 40, 16, 241, 36, 24, 69, 2, 6, 13, 20, 104, 246, 237, 80, - 58, 120, 189, 223, 106, 202, 7, 198, 30, 217, 125, 199, 234, 27, 137, 5, - 182, 95, 169, 194, 26, 184, 184, 180, 114, 168, 58, 131, 21, 175, 255, 232, - 165, 244, 144, 234, 248, 96, 71, 2, 55, 87, 210, 15, 104, 38, 208, 66, - 21, 109, 201, 3, 17, 255, 191, 142, 214, 18, 180, 155, 145, 43, 17, 127, - 182, 31, 127, 86, 71, 107, 73, 216, 149, 99, 106, 65, 66, 92, 131, 128, - 47, 161, 145, 9, 132, 212, 240, 202, 77, 56, 28, 168, 181, 206, 207, 235, - 180, 180, 181, 235, 87, 245, 24, 154, 223, 124, 38, 206, 103, 49, 67, 99, - 220, 49, 59, 149, 75, 96, 165, 162, 188, 86, 23, 38, 95, 149, 96, 120, - 112, 113, 229, 245, 14, 54, 44, 195, 122, 181, 215, 173, 209, 226, 239, 200, - 130, 24, 105, 167, 83, 135, 108, 34, 55, 114, 106, 172, 78, 3, 86, 110, - 168, 73, 109, 60, 96, 11, 18, 100, 155, 45, 13, 122, 70, 85, 129, 18, - 66, 150, 65, 119, 168, 190, 229, 154, 125, 150, 50, 110, 38, 175, 194, 66, - 63, 136, 22, 210, 223, 158, 28, 87, 149, 201, 217, 146, 44, 183, 231, 129, - 222, 32, 8, 184, 197, 12, 119, 124, 229, 172, 210, 133, 255, 39, 50, 148, - 150, 100, 72, 10, 86, 219, 48, 216, 39, 120, 13, 174, 201, 83, 221, 209, - 160, 215, 22, 164, 252, 255, 205, 37, 120, 78, 191, 7, 239, 152, 41, 193, - 27, 78, 105, 100, 156, 162, 118, 247, 105, 227, 124, 10, 156, 36, 0, 6, - 184, 46, 174, 4, 201, 218, 95, 252, 231, 120, 20, 197, 198, 92, 43, 209, - 102, 209, 94, 35, 239, 225, 120, 101, 59, 69, 132, 89, 219, 69, 125, 210, - 126, 43, 107, 165, 82, 94, 38, 179, 162, 1, 175, 165, 164, 48, 85, 52, - 146, 223, 5, 153, 160, 91, 131, 221, 7, 125, 91, 28, 80, 34, 98, 53, - 33, 234, 97, 10, 247, 212, 218, 186, 43, 143, 56, 192, 241, 253, 68, 46, - 239, 39, 185, 248, 4, 188, 120, 35, 159, 127, 207, 124, 171, 94, 34, 91, - 112, 51, 91, 5, 100, 184, 22, 103, 210, 83, 86, 110, 166, 84, 164, 71, - 160, 110, 32, 120, 153, 45, 206, 61, 113, 22, 73, 137, 58, 63, 165, 194, - 34, 221, 106, 122, 14, 153, 81, 85, 38, 47, 70, 255, 169, 200, 194, 111, - 244, 21, 190, 197, 86, 202, 247, 162, 48, 18, 129, 30, 161, 73, 158, 246, - 137, 142, 250, 0, 243, 11, 250, 0, 93, 107, 12, 198, 173, 145, 107, 202, - 216, 152, 61, 36, 83, 120, 42, 63, 243, 130, 100, 172, 175, 242, 243, 196, - 79, 198, 6, 134, 175, 92, 72, 186, 162, 82, 32, 217, 50, 216, 148, 235, - 208, 143, 199, 63, 62, 255, 4, 252, 83, 12, 201, 9, 43, 253, 67, 240, - 9, 248, 3, 76, 162, 209, 124, 164, 198, 104, 73, 93, 121, 99, 122, 107, - 75, 184, 125, 12, 22, 164, 136, 59, 188, 120, 196, 151, 223, 116, 100, 75, - 229, 116, 36, 229, 69, 169, 76, 104, 228, 214, 197, 80, 47, 22, 67, 2, - 21, 18, 248, 20, 224, 83, 0, 222, 8, 136, 0, 47, 228, 88, 248, 79, - 86, 219, 243, 76, 174, 247, 102, 202, 28, 242, 1, 157, 143, 117, 182, 102, - 152, 97, 198, 14, 90, 5, 16, 132, 181, 105, 123, 8, 250, 144, 153, 51, - 56, 41, 166, 176, 54, 89, 131, 65, 28, 213, 2, 231, 122, 87, 175, 212, - 34, 113, 94, 74, 70, 156, 119, 52, 187, 168, 55, 123, 109, 9, 32, 8, - 181, 189, 81, 31, 157, 34, 64, 28, 223, 79, 169, 183, 206, 178, 243, 97, - 252, 106, 41, 248, 37, 95, 133, 98, 79, 9, 146, 142, 135, 137, 120, 235, - 72, 100, 50, 94, 184, 81, 175, 191, 221, 186, 170, 15, 195, 0, 149, 224, - 190, 195, 32, 139, 97, 58, 44, 74, 178, 9, 162, 230, 233, 128, 83, 7, - 129, 121, 218, 136, 31, 207, 248, 17, 37, 84, 57, 108, 59, 149, 254, 41, - 133, 206, 210, 233, 28, 23, 144, 243, 50, 143, 203, 25, 219, 155, 155, 29, - 54, 223, 238, 176, 253, 118, 103, 226, 243, 81, 222, 4, 145, 56, 32, 84, - 188, 54, 9, 152, 67, 171, 64, 14, 253, 17, 215, 65, 64, 171, 226, 232, - 34, 171, 24, 67, 224, 34, 187, 102, 139, 225, 133, 243, 2, 1, 84, 0, - 29, 211, 128, 212, 2, 72, 87, 69, 15, 184, 153, 192, 67, 214, 93, 164, - 107, 150, 107, 154, 245, 12, 31, 90, 69, 30, 210, 163, 19, 86, 206, 24, - 19, 155, 238, 30, 17, 65, 28, 248, 41, 212, 30, 165, 200, 17, 26, 244, - 97, 40, 193, 179, 208, 117, 129, 184, 251, 106, 133, 33, 222, 181, 240, 19, - 158, 151, 242, 19, 222, 192, 240, 83, 17, 102, 117, 43, 147, 193, 53, 132, - 185, 211, 168, 25, 127, 213, 151, 2, 88, 124, 166, 203, 180, 159, 9, 34, - 179, 135, 92, 78, 76, 159, 219, 10, 241, 238, 173, 5, 165, 105, 85, 95, - 152, 178, 196, 121, 217, 147, 44, 54, 167, 62, 64, 5, 57, 115, 29, 55, - 136, 190, 33, 16, 100, 206, 134, 74, 85, 91, 62, 108, 65, 187, 215, 32, - 253, 153, 0, 158, 70, 218, 13, 155, 32, 141, 93, 114, 201, 101, 3, 61, - 206, 90, 98, 164, 160, 251, 89, 124, 227, 193, 130, 32, 240, 248, 198, 3, - 74, 115, 60, 99, 196, 107, 0, 194, 61, 219, 57, 89, 231, 78, 101, 42, - 65, 117, 202, 11, 53, 214, 243, 68, 43, 230, 64, 58, 33, 164, 155, 52, - 63, 174, 112, 12, 131, 163, 114, 4, 166, 182, 78, 32, 97, 137, 211, 106, - 97, 32, 188, 82, 144, 170, 97, 164, 16, 87, 212, 85, 80, 140, 161, 167, - 246, 73, 232, 16, 183, 168, 121, 196, 133, 125, 149, 0, 247, 194, 171, 49, - 186, 220, 117, 197, 229, 92, 169, 164, 123, 80, 72, 225, 77, 177, 87, 116, - 231, 90, 60, 93, 38, 209, 244, 52, 237, 193, 177, 168, 27, 98, 165, 137, - 139, 75, 88, 203, 233, 176, 157, 84, 166, 40, 221, 60, 190, 31, 33, 18, - 240, 21, 219, 186, 235, 172, 74, 253, 107, 134, 101, 30, 142, 13, 229, 120, - 135, 188, 33, 156, 135, 205, 77, 242, 213, 152, 117, 174, 230, 191, 123, 249, - 210, 19, 111, 131, 236, 84, 178, 225, 249, 178, 35, 116, 177, 129, 49, 117, - 48, 32, 230, 103, 127, 80, 199, 166, 120, 88, 18, 9, 202, 236, 134, 248, - 14, 118, 150, 38, 137, 230, 155, 252, 235, 102, 76, 91, 67, 168, 86, 62, - 3, 96, 216, 81, 253, 169, 232, 211, 3, 94, 90, 232, 165, 115, 122, 160, - 164, 45, 115, 218, 64, 173, 56, 68, 235, 131, 169, 57, 55, 163, 248, 181, - 233, 219, 197, 44, 44, 110, 102, 13, 195, 2, 179, 131, 63, 46, 47, 1, - 211, 62, 37, 66, 47, 243, 17, 63, 250, 192, 178, 106, 125, 100, 145, 98, - 60, 224, 138, 49, 192, 119, 90, 141, 197, 171, 245, 195, 172, 69, 32, 172, - 139, 177, 3, 197, 1, 35, 85, 92, 30, 246, 192, 83, 201, 113, 35, 249, - 208, 149, 15, 202, 61, 20, 99, 89, 35, 247, 43, 163, 186, 222, 227, 226, - 28, 218, 117, 62, 98, 71, 47, 250, 215, 209, 36, 223, 115, 115, 214, 15, - 59, 17, 236, 144, 147, 33, 238, 209, 88, 236, 236, 192, 94, 117, 134, 109, - 156, 3, 77, 224, 113, 74, 143, 81, 35, 68, 229, 62, 124, 198, 177, 202, - 156, 22, 146, 226, 85, 3, 250, 112, 39, 57, 199, 218, 58, 181, 70, 39, - 142, 53, 109, 56, 86, 212, 16, 231, 254, 199, 82, 46, 27, 157, 200, 195, - 119, 204, 7, 100, 26, 249, 92, 85, 172, 244, 214, 170, 99, 141, 28, 245, - 22, 16, 124, 162, 231, 115, 187, 232, 197, 47, 242, 11, 42, 120, 168, 47, - 130, 148, 56, 242, 239, 249, 69, 95, 203, 87, 187, 81, 81, 68, 127, 20, - 113, 29, 134, 16, 190, 179, 93, 88, 36, 234, 104, 104, 223, 186, 171, 116, - 79, 43, 91, 56, 92, 164, 121, 170, 15, 130, 101, 66, 232, 44, 145, 2, - 17, 210, 7, 189, 17, 162, 117, 74, 159, 171, 235, 110, 54, 141, 123, 11, - 171, 214, 207, 96, 119, 42, 173, 0, 107, 218, 119, 102, 126, 209, 182, 162, - 190, 242, 198, 205, 87, 143, 74, 69, 64, 47, 26, 207, 93, 136, 82, 122, - 224, 86, 89, 246, 52, 241, 9, 212, 163, 73, 56, 122, 50, 168, 197, 82, - 74, 56, 113, 102, 168, 160, 170, 222, 157, 201, 156, 47, 231, 61, 194, 77, - 215, 34, 154, 243, 216, 135, 10, 99, 52, 166, 19, 223, 205, 149, 139, 153, - 66, 9, 13, 75, 226, 210, 59, 39, 194, 171, 114, 117, 68, 56, 243, 121, - 68, 91, 93, 133, 97, 237, 9, 213, 10, 190, 65, 194, 123, 77, 65, 34, - 41, 184, 143, 28, 37, 180, 143, 254, 38, 197, 132, 124, 1, 3, 84, 154, - 94, 138, 241, 26, 150, 132, 253, 14, 42, 254, 137, 1, 74, 194, 164, 184, - 17, 197, 68, 153, 185, 160, 16, 70, 184, 76, 157, 28, 112, 14, 135, 46, - 143, 24, 208, 81, 224, 34, 2, 87, 47, 187, 115, 146, 216, 99, 166, 78, - 150, 66, 138, 71, 204, 137, 248, 130, 169, 137, 130, 197, 219, 2, 225, 9, - 166, 77, 70, 105, 164, 135, 49, 41, 217, 32, 183, 12, 103, 153, 245, 35, - 91, 204, 60, 150, 83, 69, 126, 76, 118, 173, 124, 87, 95, 0, 114, 165, - 155, 182, 22, 145, 44, 63, 150, 91, 79, 36, 78, 153, 188, 100, 99, 46, - 182, 37, 216, 7, 139, 250, 204, 226, 112, 230, 8, 120, 72, 102, 126, 188, - 101, 227, 12, 206, 177, 216, 35, 200, 180, 88, 44, 71, 229, 16, 37, 171, - 40, 24, 102, 142, 175, 228, 120, 128, 142, 32, 157, 87, 90, 131, 77, 172, - 188, 80, 46, 63, 68, 121, 245, 167, 0, 101, 119, 174, 131, 210, 114, 80, - 49, 216, 36, 87, 21, 76, 21, 22, 23, 120, 172, 209, 99, 204, 129, 249, - 252, 182, 50, 229, 1, 59, 109, 228, 96, 140, 102, 28, 122, 137, 224, 37, - 234, 103, 50, 155, 225, 154, 206, 141, 229, 165, 179, 62, 157, 230, 201, 181, - 70, 45, 46, 80, 152, 92, 94, 102, 80, 150, 237, 65, 183, 139, 197, 197, - 147, 203, 77, 113, 129, 103, 195, 143, 207, 43, 32, 132, 152, 194, 143, 21, - 130, 8, 62, 160, 76, 79, 191, 108, 237, 52, 182, 66, 95, 206, 165, 105, - 99, 107, 171, 152, 9, 67, 92, 131, 101, 88, 164, 194, 154, 254, 28, 86, - 39, 194, 222, 243, 226, 204, 1, 85, 202, 133, 197, 234, 183, 48, 231, 3, - 73, 233, 7, 138, 151, 181, 84, 168, 64, 88, 254, 111, 94, 41, 35, 104, - 132, 69, 227, 235, 220, 72, 207, 198, 208, 213, 241, 191, 13, 151, 245, 160, - 50, 242, 43, 155, 240, 101, 144, 95, 103, 227, 52, 12, 29, 242, 239, 67, - 11, 23, 81, 220, 169, 125, 113, 177, 217, 208, 55, 141, 141, 218, 17, 60, - 71, 240, 28, 53, 208, 145, 7, 246, 20, 68, 103, 182, 232, 225, 200, 205, - 224, 10, 7, 1, 91, 36, 208, 241, 219, 17, 190, 129, 232, 151, 201, 56, - 95, 141, 218, 23, 79, 43, 203, 187, 89, 150, 151, 217, 228, 178, 60, 81, - 150, 183, 133, 187, 123, 81, 242, 17, 190, 5, 100, 62, 71, 21, 118, 209, - 1, 97, 173, 97, 251, 40, 28, 72, 99, 190, 120, 107, 137, 41, 96, 217, - 155, 225, 182, 193, 105, 161, 71, 9, 164, 53, 129, 35, 211, 3, 131, 178, - 242, 149, 61, 10, 255, 119, 36, 68, 34, 163, 227, 51, 16, 111, 209, 165, - 128, 148, 170, 106, 161, 114, 192, 77, 234, 229, 188, 49, 90, 86, 132, 99, - 213, 50, 60, 11, 106, 177, 35, 65, 225, 152, 56, 111, 144, 232, 101, 213, - 200, 22, 42, 156, 237, 202, 169, 178, 145, 222, 133, 30, 200, 228, 240, 199, - 103, 79, 27, 201, 56, 143, 227, 16, 46, 154, 5, 60, 28, 3, 182, 53, - 70, 92, 71, 209, 127, 64, 171, 199, 105, 150, 251, 208, 138, 66, 164, 138, - 32, 213, 213, 210, 84, 77, 105, 23, 193, 234, 233, 190, 184, 30, 77, 76, - 56, 163, 70, 146, 13, 240, 131, 237, 119, 239, 222, 124, 102, 24, 1, 222, - 190, 201, 176, 221, 55, 159, 15, 230, 188, 143, 147, 65, 196, 89, 112, 67, - 23, 7, 125, 60, 156, 131, 80, 142, 75, 21, 117, 169, 28, 198, 253, 228, - 48, 238, 243, 48, 110, 177, 159, 17, 34, 110, 95, 18, 183, 47, 250, 135, - 23, 16, 146, 130, 212, 172, 149, 251, 195, 156, 102, 142, 30, 226, 132, 74, - 136, 174, 32, 171, 170, 254, 228, 182, 50, 115, 154, 51, 31, 240, 88, 46, - 6, 154, 49, 221, 121, 176, 201, 222, 83, 229, 194, 214, 82, 125, 121, 38, - 78, 140, 32, 56, 87, 156, 67, 65, 15, 96, 30, 156, 7, 7, 66, 40, - 55, 225, 55, 154, 171, 109, 216, 148, 83, 183, 196, 242, 206, 99, 138, 251, - 72, 31, 146, 201, 98, 156, 25, 203, 9, 32, 38, 204, 81, 127, 164, 70, - 29, 49, 255, 43, 25, 115, 82, 226, 192, 236, 125, 28, 201, 52, 171, 106, - 125, 42, 138, 35, 115, 24, 143, 27, 126, 245, 33, 70, 102, 136, 183, 5, - 196, 116, 106, 125, 226, 30, 137, 153, 204, 30, 104, 48, 142, 135, 60, 61, - 4, 60, 33, 248, 197, 151, 161, 136, 171, 142, 187, 22, 28, 69, 54, 200, - 215, 227, 196, 232, 167, 136, 136, 34, 174, 244, 1, 79, 125, 184, 176, 165, - 16, 216, 19, 63, 182, 18, 17, 54, 72, 52, 201, 93, 149, 96, 203, 226, - 129, 198, 12, 53, 132, 71, 17, 158, 102, 64, 107, 248, 37, 35, 172, 165, - 22, 182, 78, 138, 131, 39, 26, 45, 23, 136, 31, 57, 75, 219, 90, 101, - 80, 67, 104, 110, 104, 106, 226, 40, 100, 86, 250, 36, 112, 49, 220, 200, - 98, 68, 115, 174, 230, 150, 152, 64, 66, 125, 72, 128, 50, 80, 34, 77, - 167, 8, 22, 131, 46, 67, 43, 242, 54, 5, 187, 175, 145, 245, 242, 171, - 56, 71, 77, 49, 44, 103, 48, 210, 186, 66, 233, 72, 141, 194, 99, 170, - 168, 213, 5, 121, 10, 73, 139, 104, 223, 248, 27, 225, 150, 106, 97, 127, - 40, 214, 200, 101, 136, 118, 111, 147, 224, 118, 115, 117, 8, 167, 107, 33, - 17, 173, 48, 84, 116, 147, 152, 234, 106, 21, 192, 40, 102, 180, 66, 163, - 82, 36, 48, 72, 212, 103, 142, 0, 194, 116, 242, 192, 8, 198, 51, 169, - 25, 242, 77, 59, 222, 188, 18, 109, 200, 35, 16, 207, 6, 92, 33, 164, - 3, 66, 58, 35, 144, 130, 103, 44, 106, 114, 5, 121, 75, 113, 195, 202, - 230, 142, 163, 251, 39, 183, 94, 7, 20, 241, 44, 192, 242, 190, 193, 31, - 31, 255, 4, 153, 132, 175, 170, 88, 115, 31, 53, 193, 16, 198, 94, 94, - 173, 155, 42, 202, 95, 140, 50, 180, 27, 6, 60, 62, 164, 139, 110, 212, - 12, 157, 173, 194, 76, 42, 110, 133, 236, 248, 15, 207, 40, 68, 20, 148, - 126, 35, 238, 246, 187, 142, 219, 91, 35, 100, 27, 15, 132, 14, 180, 166, - 78, 156, 121, 67, 59, 221, 111, 252, 207, 119, 215, 50, 10, 206, 37, 148, - 42, 235, 120, 40, 82, 92, 251, 166, 253, 37, 36, 66, 141, 28, 102, 178, - 97, 6, 235, 162, 23, 161, 229, 172, 136, 142, 200, 8, 154, 141, 2, 7, - 23, 181, 8, 145, 99, 221, 33, 187, 133, 37, 89, 214, 49, 208, 75, 230, - 17, 7, 154, 209, 86, 184, 254, 219, 111, 168, 204, 239, 254, 246, 219, 20, - 8, 5, 127, 225, 37, 248, 237, 183, 116, 154, 20, 52, 167, 124, 220, 110, - 71, 176, 9, 1, 73, 119, 208, 72, 87, 109, 46, 6, 157, 171, 174, 44, - 219, 35, 63, 49, 232, 116, 159, 79, 244, 208, 84, 212, 43, 145, 165, 40, - 252, 108, 135, 236, 91, 235, 200, 249, 146, 217, 120, 23, 146, 149, 255, 151, - 111, 190, 125, 244, 205, 135, 247, 77, 175, 148, 47, 253, 246, 27, 78, 223, - 237, 204, 22, 226, 180, 184, 249, 32, 200, 90, 222, 138, 177, 120, 182, 196, - 79, 137, 97, 165, 211, 17, 207, 212, 134, 121, 179, 234, 228, 2, 99, 217, - 17, 225, 19, 3, 237, 17, 191, 121, 107, 197, 111, 94, 201, 35, 117, 251, - 34, 209, 39, 72, 246, 134, 174, 237, 186, 228, 88, 241, 137, 182, 176, 201, - 107, 199, 85, 7, 255, 47, 180, 139, 253, 53, 167, 92, 92, 118, 215, 244, - 196, 192, 241, 85, 46, 250, 45, 144, 218, 191, 26, 169, 253, 214, 206, 69, - 229, 197, 243, 104, 239, 197, 180, 95, 123, 249, 110, 248, 231, 167, 245, 246, - 89, 231, 93, 255, 232, 115, 241, 245, 193, 245, 81, 99, 255, 253, 246, 116, - 111, 247, 89, 99, 239, 250, 99, 233, 105, 183, 85, 125, 126, 212, 223, 121, - 218, 216, 158, 238, 110, 255, 241, 233, 203, 213, 85, 161, 95, 250, 115, 212, - 25, 54, 58, 123, 251, 189, 253, 213, 75, 247, 233, 180, 16, 189, 63, 58, - 218, 251, 50, 120, 86, 250, 254, 166, 241, 161, 243, 204, 123, 253, 162, 221, - 251, 248, 217, 235, 247, 189, 239, 159, 62, 126, 239, 92, 142, 130, 151, 232, - 125, 224, 98, 253, 115, 115, 26, 188, 135, 242, 163, 253, 167, 242, 27, 123, - 62, 126, 163, 90, 168, 31, 28, 93, 94, 28, 94, 127, 140, 222, 28, 76, - 182, 159, 94, 213, 63, 236, 7, 135, 111, 191, 239, 52, 182, 237, 79, 111, - 191, 248, 41, 163, 86, 71, 205, 166, 65, 125, 56, 196, 163, 224, 60, 205, - 6, 57, 53, 160, 135, 188, 213, 192, 81, 61, 230, 44, 235, 49, 191, 134, - 71, 205, 197, 159, 19, 125, 225, 34, 238, 97, 228, 219, 211, 200, 119, 52, - 193, 166, 189, 58, 106, 191, 218, 237, 109, 79, 158, 237, 191, 137, 94, 190, - 121, 89, 120, 105, 127, 220, 62, 120, 229, 190, 219, 169, 188, 219, 107, 247, - 189, 209, 171, 226, 203, 237, 218, 250, 203, 231, 149, 222, 199, 209, 135, 131, - 207, 79, 189, 104, 239, 240, 243, 135, 82, 125, 82, 170, 119, 236, 246, 135, - 245, 245, 98, 99, 252, 26, 201, 247, 178, 177, 221, 219, 235, 85, 214, 174, - 159, 53, 246, 47, 182, 249, 59, 79, 247, 163, 131, 70, 191, 216, 125, 121, - 24, 92, 124, 126, 181, 119, 189, 230, 237, 95, 92, 84, 183, 183, 7, 193, - 229, 245, 193, 181, 251, 186, 113, 180, 125, 216, 254, 248, 124, 29, 196, 216, - 255, 77, 18, 106, 55, 149, 15, 34, 223, 238, 91, 141, 124, 111, 105, 100, - 236, 84, 95, 238, 236, 190, 221, 110, 236, 110, 191, 153, 126, 57, 188, 120, - 90, 104, 12, 167, 31, 139, 159, 94, 183, 86, 119, 187, 219, 227, 203, 215, - 135, 31, 203, 239, 143, 46, 62, 124, 234, 143, 166, 205, 179, 247, 87, 107, - 147, 254, 167, 241, 249, 199, 201, 238, 179, 63, 139, 80, 206, 222, 4, 203, - 218, 39, 223, 23, 219, 23, 251, 23, 71, 175, 235, 175, 166, 215, 235, 69, - 175, 245, 126, 191, 112, 240, 97, 175, 24, 108, 111, 191, 94, 47, 237, 95, - 87, 215, 159, 246, 94, 108, 239, 150, 62, 237, 156, 31, 221, 143, 84, 248, - 239, 151, 16, 75, 187, 184, 125, 216, 88, 219, 214, 137, 85, 68, 98, 29, - 84, 191, 79, 137, 88, 251, 31, 182, 15, 166, 238, 123, 219, 94, 171, 236, - 61, 93, 127, 223, 124, 115, 86, 173, 63, 45, 191, 125, 219, 123, 255, 170, - 180, 221, 42, 93, 125, 254, 236, 127, 254, 176, 87, 158, 14, 236, 179, 171, - 63, 62, 22, 118, 186, 31, 63, 7, 23, 98, 92, 49, 177, 254, 254, 216, - 74, 146, 75, 146, 234, 111, 16, 74, 93, 21, 122, 15, 34, 20, 52, 138, - 136, 36, 38, 76, 233, 96, 2, 141, 122, 241, 249, 205, 199, 183, 229, 237, - 253, 237, 230, 238, 235, 47, 165, 242, 78, 125, 189, 240, 182, 251, 249, 213, - 246, 224, 217, 254, 250, 126, 109, 248, 162, 178, 254, 246, 232, 205, 240, 69, - 235, 77, 84, 124, 94, 249, 243, 232, 229, 118, 207, 171, 236, 215, 175, 247, - 94, 217, 111, 95, 117, 135, 215, 127, 12, 191, 251, 21, 36, 212, 187, 202, - 249, 250, 219, 245, 23, 173, 202, 78, 247, 69, 231, 217, 159, 205, 247, 245, - 181, 201, 31, 111, 106, 159, 190, 191, 177, 247, 35, 187, 250, 188, 246, 234, - 98, 253, 77, 255, 211, 91, 247, 234, 250, 93, 103, 173, 93, 248, 99, 189, - 84, 220, 126, 249, 108, 253, 162, 59, 252, 53, 124, 208, 150, 126, 209, 167, - 38, 27, 16, 226, 197, 92, 236, 184, 243, 175, 220, 196, 250, 15, 37, 111, - 81, 35, 239, 116, 127, 119, 27, 39, 89, 251, 226, 242, 217, 155, 237, 235, - 103, 123, 219, 211, 110, 224, 63, 45, 184, 133, 200, 222, 175, 181, 63, 182, - 123, 219, 175, 95, 213, 59, 141, 171, 139, 237, 55, 47, 236, 195, 203, 167, - 195, 181, 103, 237, 151, 195, 139, 119, 111, 47, 221, 86, 84, 157, 188, 183, - 11, 254, 69, 117, 252, 170, 77, 14, 107, 154, 205, 230, 121, 240, 126, 122, - 248, 250, 243, 100, 125, 183, 242, 170, 115, 52, 60, 235, 252, 241, 230, 123, - 39, 170, 124, 233, 174, 251, 31, 135, 159, 62, 173, 31, 217, 195, 73, 253, - 205, 213, 217, 234, 209, 142, 119, 245, 246, 240, 112, 183, 251, 169, 88, 41, - 108, 239, 188, 124, 95, 44, 237, 236, 254, 42, 94, 121, 95, 50, 163, 154, - 197, 18, 58, 7, 193, 77, 50, 7, 15, 37, 115, 41, 73, 230, 103, 72, - 230, 79, 31, 218, 195, 55, 147, 221, 237, 189, 237, 171, 122, 233, 181, 125, - 109, 31, 216, 215, 239, 71, 47, 122, 157, 122, 244, 161, 118, 49, 217, 123, - 125, 244, 97, 125, 175, 247, 242, 197, 246, 89, 255, 77, 163, 246, 54, 232, - 122, 45, 239, 207, 86, 247, 101, 173, 251, 198, 246, 221, 231, 227, 215, 13, - 36, 115, 208, 61, 47, 126, 222, 123, 19, 28, 245, 218, 135, 107, 111, 159, - 189, 93, 45, 61, 125, 118, 217, 123, 93, 249, 184, 183, 251, 33, 0, 254, - 56, 89, 123, 243, 231, 89, 191, 216, 222, 173, 238, 95, 120, 135, 7, 31, - 47, 190, 68, 187, 13, 123, 92, 252, 227, 195, 139, 167, 165, 63, 90, 111, - 38, 219, 49, 175, 253, 91, 124, 246, 47, 140, 102, 162, 248, 93, 195, 185, - 248, 64, 58, 63, 155, 232, 220, 98, 127, 27, 135, 204, 167, 195, 183, 204, - 45, 6, 107, 245, 198, 151, 194, 225, 218, 135, 3, 187, 250, 226, 197, 251, - 168, 252, 97, 103, 255, 195, 219, 198, 247, 246, 199, 195, 202, 238, 206, 238, - 222, 193, 31, 59, 175, 254, 60, 219, 127, 251, 242, 123, 103, 242, 125, 181, - 94, 116, 235, 149, 102, 35, 90, 107, 21, 46, 144, 206, 187, 175, 119, 188, - 183, 205, 246, 187, 207, 59, 215, 213, 195, 151, 238, 250, 187, 238, 96, 125, - 251, 143, 15, 131, 151, 239, 223, 140, 15, 74, 7, 246, 222, 243, 231, 235, - 127, 236, 29, 173, 143, 223, 28, 238, 182, 70, 213, 183, 87, 207, 254, 151, - 233, 170, 15, 95, 157, 176, 203, 198, 111, 233, 161, 227, 55, 88, 194, 38, - 106, 23, 237, 103, 175, 167, 79, 183, 247, 223, 29, 190, 233, 116, 131, 241, - 243, 224, 202, 126, 246, 199, 151, 119, 131, 221, 103, 254, 247, 201, 96, 175, - 113, 125, 184, 179, 182, 223, 45, 249, 251, 187, 87, 197, 86, 115, 231, 236, - 109, 116, 241, 54, 26, 191, 219, 185, 94, 47, 191, 123, 190, 118, 208, 121, - 143, 116, 61, 218, 62, 91, 95, 27, 150, 75, 23, 235, 165, 207, 53, 247, - 236, 249, 247, 233, 11, 111, 255, 224, 83, 97, 232, 213, 43, 237, 253, 241, - 197, 187, 151, 181, 189, 210, 100, 116, 190, 254, 197, 253, 220, 253, 220, 121, - 254, 249, 77, 97, 245, 85, 231, 213, 151, 247, 213, 195, 79, 211, 61, 239, - 233, 197, 127, 146, 77, 224, 230, 233, 46, 58, 151, 31, 70, 231, 15, 141, - 235, 196, 248, 197, 182, 188, 248, 244, 198, 125, 251, 125, 251, 237, 118, 243, - 186, 188, 250, 252, 188, 124, 104, 23, 134, 175, 203, 229, 15, 7, 223, 95, - 125, 220, 121, 218, 187, 222, 125, 217, 45, 53, 62, 78, 62, 175, 63, 219, - 219, 233, 54, 91, 126, 183, 179, 115, 248, 182, 243, 242, 105, 125, 127, 178, - 123, 54, 190, 222, 57, 120, 250, 210, 67, 58, 247, 254, 172, 239, 238, 60, - 107, 29, 190, 255, 220, 218, 238, 125, 249, 184, 118, 116, 222, 236, 22, 15, - 163, 214, 65, 213, 251, 18, 180, 214, 215, 15, 38, 31, 95, 29, 238, 247, - 62, 69, 159, 134, 193, 225, 246, 246, 251, 239, 207, 6, 197, 255, 125, 218, - 34, 61, 5, 109, 189, 64, 99, 14, 64, 220, 88, 47, 28, 118, 156, 203, - 44, 174, 116, 252, 98, 74, 196, 190, 90, 232, 241, 159, 173, 33, 190, 119, - 179, 230, 119, 169, 139, 47, 232, 1, 163, 93, 202, 130, 187, 21, 205, 56, - 133, 241, 14, 177, 125, 103, 131, 241, 176, 185, 128, 92, 65, 192, 25, 26, - 98, 69, 13, 246, 79, 67, 9, 235, 79, 38, 45, 131, 222, 229, 114, 184, - 12, 45, 215, 121, 11, 225, 202, 226, 92, 236, 8, 38, 127, 167, 162, 242, - 82, 52, 47, 234, 6, 14, 221, 217, 126, 250, 90, 139, 193, 6, 77, 42, - 125, 89, 164, 180, 144, 81, 93, 36, 12, 121, 254, 207, 179, 219, 98, 157, - 101, 182, 201, 137, 77, 182, 200, 47, 169, 244, 34, 35, 45, 244, 187, 228, - 232, 35, 117, 124, 80, 159, 112, 115, 79, 82, 124, 146, 116, 73, 14, 75, - 91, 134, 23, 219, 92, 165, 78, 197, 200, 63, 62, 73, 57, 41, 188, 238, - 68, 247, 163, 1, 161, 31, 28, 10, 143, 22, 211, 83, 30, 35, 2, 24, - 246, 196, 60, 229, 39, 150, 224, 83, 84, 172, 196, 206, 148, 179, 168, 95, - 25, 42, 37, 49, 15, 189, 87, 163, 9, 127, 119, 190, 50, 207, 196, 30, - 178, 103, 43, 255, 247, 10, 169, 93, 194, 70, 97, 54, 226, 83, 123, 81, - 52, 249, 21, 60, 79, 183, 42, 155, 120, 232, 193, 208, 133, 65, 154, 80, - 32, 228, 139, 75, 208, 209, 56, 86, 81, 163, 60, 244, 248, 25, 253, 40, - 182, 70, 17, 122, 89, 197, 87, 210, 37, 8, 215, 197, 219, 168, 217, 170, - 94, 118, 129, 219, 160, 54, 4, 18, 38, 134, 123, 62, 229, 119, 5, 143, - 124, 74, 25, 224, 189, 55, 245, 240, 136, 186, 23, 209, 15, 107, 65, 90, - 137, 68, 228, 174, 42, 77, 254, 30, 55, 202, 69, 160, 93, 38, 185, 207, - 241, 72, 31, 107, 45, 91, 92, 155, 59, 179, 34, 253, 8, 167, 31, 234, - 32, 221, 137, 228, 29, 204, 154, 230, 47, 178, 184, 150, 181, 182, 72, 117, - 140, 30, 35, 126, 244, 49, 16, 61, 127, 165, 249, 41, 147, 181, 146, 141, - 155, 59, 86, 220, 118, 103, 230, 229, 172, 168, 80, 156, 43, 223, 167, 124, - 4, 175, 41, 90, 204, 44, 69, 69, 174, 163, 165, 83, 146, 130, 190, 26, - 201, 68, 118, 113, 117, 73, 58, 10, 253, 106, 220, 176, 88, 34, 72, 99, - 127, 205, 64, 227, 107, 113, 188, 197, 39, 137, 236, 243, 142, 148, 211, 232, - 1, 50, 150, 196, 255, 196, 97, 23, 229, 59, 155, 134, 51, 173, 73, 217, - 73, 193, 91, 163, 91, 8, 189, 9, 211, 156, 87, 134, 70, 162, 186, 29, - 188, 216, 248, 178, 70, 101, 98, 9, 252, 185, 229, 169, 124, 74, 21, 31, - 111, 38, 34, 22, 202, 138, 143, 71, 85, 89, 107, 55, 83, 149, 139, 230, - 45, 31, 204, 233, 137, 140, 216, 44, 0, 15, 254, 102, 77, 138, 141, 169, - 195, 136, 95, 165, 88, 139, 247, 22, 234, 68, 146, 58, 106, 4, 16, 198, - 122, 57, 147, 32, 145, 168, 66, 164, 87, 58, 178, 249, 139, 49, 137, 150, - 166, 18, 245, 138, 73, 180, 118, 71, 89, 49, 137, 18, 101, 249, 201, 84, - 138, 68, 137, 240, 181, 197, 68, 134, 182, 246, 79, 130, 188, 110, 190, 191, - 131, 45, 78, 45, 76, 87, 9, 36, 110, 37, 102, 181, 49, 241, 142, 45, - 102, 132, 120, 85, 137, 15, 228, 50, 75, 60, 114, 121, 123, 248, 108, 166, - 254, 197, 129, 41, 194, 59, 16, 9, 206, 230, 121, 249, 56, 157, 47, 48, - 12, 250, 34, 176, 136, 89, 214, 131, 72, 51, 226, 167, 104, 110, 76, 125, - 120, 242, 41, 140, 159, 48, 44, 128, 167, 128, 194, 248, 41, 18, 87, 111, - 83, 143, 177, 132, 73, 13, 197, 99, 119, 131, 196, 121, 232, 38, 13, 30, - 54, 93, 7, 18, 57, 248, 8, 221, 138, 204, 136, 99, 34, 138, 137, 48, - 38, 194, 152, 90, 189, 61, 170, 132, 154, 78, 9, 204, 126, 204, 35, 148, - 74, 240, 45, 34, 204, 253, 129, 135, 240, 133, 241, 164, 182, 209, 123, 48, - 84, 212, 26, 120, 55, 248, 137, 81, 155, 146, 227, 99, 85, 90, 129, 188, - 23, 58, 22, 125, 13, 191, 26, 113, 188, 44, 127, 49, 190, 23, 2, 23, - 74, 39, 216, 69, 161, 152, 249, 134, 250, 60, 234, 50, 145, 61, 34, 162, - 166, 24, 102, 226, 107, 130, 216, 114, 50, 238, 62, 248, 190, 109, 109, 101, - 173, 26, 222, 174, 225, 215, 248, 45, 2, 174, 55, 128, 79, 14, 252, 4, - 247, 179, 122, 142, 37, 150, 20, 190, 213, 71, 162, 66, 59, 76, 36, 33, - 212, 247, 6, 251, 167, 91, 49, 230, 249, 166, 224, 249, 90, 175, 160, 207, - 102, 66, 76, 144, 245, 161, 78, 137, 24, 48, 147, 174, 132, 212, 215, 22, - 11, 78, 220, 247, 97, 113, 154, 234, 128, 188, 239, 243, 151, 5, 6, 55, - 3, 129, 29, 203, 2, 62, 30, 46, 230, 214, 66, 130, 133, 16, 206, 199, - 8, 123, 113, 174, 228, 123, 32, 17, 248, 196, 10, 57, 75, 115, 91, 17, - 112, 63, 109, 61, 202, 161, 250, 219, 77, 162, 37, 26, 69, 138, 14, 11, - 181, 74, 132, 5, 55, 194, 180, 22, 145, 230, 196, 66, 238, 68, 88, 112, - 35, 140, 115, 43, 73, 80, 203, 125, 51, 44, 208, 194, 22, 219, 152, 187, - 163, 141, 210, 191, 128, 71, 158, 146, 213, 0, 32, 145, 157, 132, 30, 233, - 49, 153, 73, 17, 192, 112, 17, 87, 179, 211, 64, 77, 110, 120, 222, 12, - 214, 138, 34, 34, 130, 8, 111, 221, 159, 155, 154, 168, 130, 73, 178, 176, - 188, 21, 16, 254, 172, 156, 137, 189, 65, 64, 90, 61, 231, 102, 156, 49, - 150, 106, 102, 16, 81, 144, 188, 95, 101, 220, 188, 37, 31, 137, 77, 172, - 21, 8, 223, 92, 19, 95, 204, 136, 88, 41, 72, 113, 130, 40, 200, 22, - 69, 201, 172, 184, 176, 40, 38, 9, 31, 107, 177, 89, 175, 23, 91, 242, - 122, 58, 82, 190, 199, 151, 218, 74, 208, 131, 121, 6, 236, 25, 173, 170, - 38, 62, 255, 4, 202, 73, 39, 107, 101, 170, 13, 29, 193, 211, 46, 219, - 209, 113, 204, 162, 179, 103, 17, 250, 143, 222, 209, 29, 234, 53, 191, 99, - 47, 183, 176, 149, 251, 111, 179, 209, 140, 13, 50, 15, 194, 53, 133, 55, - 113, 96, 4, 62, 35, 132, 197, 222, 244, 24, 95, 73, 71, 42, 214, 176, - 86, 43, 157, 126, 56, 27, 167, 115, 69, 215, 41, 162, 55, 75, 24, 162, - 223, 99, 125, 16, 16, 208, 113, 116, 215, 90, 3, 161, 162, 50, 70, 173, - 78, 6, 20, 205, 202, 68, 32, 192, 224, 8, 215, 141, 167, 60, 103, 197, - 130, 146, 9, 146, 55, 202, 250, 100, 216, 137, 37, 23, 154, 153, 21, 94, - 84, 102, 19, 219, 159, 107, 201, 167, 43, 230, 66, 1, 71, 97, 58, 202, - 173, 185, 182, 87, 162, 98, 166, 133, 192, 205, 216, 158, 75, 144, 188, 211, - 130, 15, 223, 68, 29, 192, 163, 77, 247, 199, 143, 163, 173, 176, 132, 166, - 73, 206, 145, 110, 57, 90, 21, 150, 20, 217, 172, 249, 185, 222, 174, 246, - 58, 4, 44, 33, 236, 187, 29, 180, 173, 238, 77, 234, 131, 243, 113, 155, - 119, 124, 102, 95, 1, 0, 48, 136, 198, 164, 55, 184, 52, 179, 89, 97, - 77, 38, 149, 32, 8, 172, 182, 20, 19, 112, 31, 109, 177, 216, 21, 180, - 235, 156, 135, 228, 145, 87, 83, 125, 13, 158, 160, 11, 196, 59, 77, 64, - 120, 60, 75, 183, 208, 35, 116, 44, 52, 10, 103, 172, 164, 236, 18, 140, - 46, 249, 21, 66, 160, 41, 163, 34, 152, 203, 8, 122, 165, 226, 147, 60, - 82, 193, 39, 16, 77, 172, 138, 143, 18, 201, 25, 178, 230, 255, 143, 188, - 239, 108, 79, 36, 73, 18, 254, 206, 175, 168, 214, 209, 219, 66, 5, 162, - 12, 118, 90, 104, 78, 128, 48, 146, 0, 225, 65, 26, 141, 14, 79, 9, - 239, 141, 150, 255, 254, 70, 68, 102, 25, 140, 212, 221, 115, 179, 119, 251, - 188, 55, 187, 45, 170, 178, 210, 68, 186, 200, 200, 176, 72, 12, 124, 181, - 167, 1, 47, 177, 60, 117, 124, 194, 60, 117, 202, 195, 156, 178, 65, 129, - 23, 1, 255, 202, 47, 204, 219, 158, 158, 94, 167, 244, 186, 153, 174, 123, - 1, 150, 184, 162, 255, 220, 133, 173, 178, 56, 220, 104, 250, 69, 117, 8, - 168, 179, 132, 43, 165, 198, 148, 157, 21, 253, 99, 221, 250, 177, 174, 127, - 52, 212, 171, 231, 34, 16, 53, 146, 215, 113, 109, 116, 140, 42, 249, 100, - 185, 169, 14, 166, 134, 57, 199, 174, 206, 69, 164, 130, 168, 10, 167, 225, - 103, 203, 65, 189, 199, 8, 208, 151, 130, 125, 62, 71, 144, 231, 34, 224, - 106, 88, 115, 220, 252, 8, 157, 58, 58, 185, 191, 194, 67, 195, 63, 52, - 187, 114, 145, 31, 59, 156, 96, 166, 12, 111, 117, 219, 164, 235, 192, 95, - 242, 129, 113, 145, 15, 226, 125, 253, 248, 75, 27, 180, 200, 168, 74, 197, - 132, 235, 66, 65, 29, 126, 118, 174, 205, 231, 215, 33, 123, 106, 119, 56, - 217, 164, 17, 254, 47, 143, 48, 253, 67, 239, 195, 167, 35, 76, 235, 254, - 135, 127, 214, 95, 240, 243, 187, 11, 86, 95, 218, 165, 236, 152, 251, 98, - 58, 166, 142, 252, 7, 79, 22, 181, 225, 28, 208, 39, 242, 105, 48, 52, - 231, 176, 206, 66, 38, 92, 135, 148, 83, 71, 23, 198, 143, 99, 172, 55, - 94, 144, 121, 104, 208, 207, 176, 131, 218, 184, 243, 96, 109, 70, 203, 235, - 93, 14, 193, 69, 201, 193, 28, 8, 95, 203, 255, 214, 110, 130, 177, 159, - 89, 75, 15, 127, 193, 205, 197, 41, 239, 22, 228, 199, 7, 136, 148, 21, - 243, 224, 99, 140, 226, 76, 15, 223, 201, 6, 174, 173, 181, 154, 208, 19, - 192, 130, 122, 105, 238, 247, 2, 206, 173, 158, 11, 29, 73, 204, 132, 90, - 191, 51, 154, 106, 243, 238, 224, 99, 223, 9, 167, 221, 6, 195, 52, 169, - 81, 22, 19, 144, 153, 164, 204, 44, 65, 71, 27, 139, 250, 79, 122, 15, - 182, 84, 163, 199, 25, 100, 93, 113, 55, 208, 77, 17, 134, 51, 221, 11, - 82, 240, 3, 144, 24, 250, 215, 107, 106, 106, 232, 170, 74, 15, 116, 224, - 252, 201, 58, 168, 253, 65, 109, 172, 71, 122, 196, 163, 119, 52, 96, 201, - 63, 221, 41, 163, 146, 41, 204, 21, 154, 43, 214, 14, 42, 184, 63, 10, - 213, 168, 13, 181, 185, 89, 142, 2, 104, 242, 166, 89, 48, 210, 83, 69, - 139, 31, 22, 93, 12, 181, 54, 186, 54, 154, 193, 225, 221, 71, 79, 56, - 39, 74, 167, 62, 44, 61, 104, 53, 181, 218, 208, 213, 88, 204, 205, 21, - 242, 131, 200, 145, 205, 17, 245, 18, 151, 27, 50, 154, 145, 87, 175, 187, - 91, 49, 22, 27, 108, 194, 113, 13, 6, 235, 100, 95, 44, 209, 22, 167, - 11, 200, 125, 180, 68, 255, 207, 57, 233, 56, 118, 78, 70, 60, 108, 198, - 6, 167, 227, 164, 123, 173, 74, 112, 154, 144, 203, 48, 213, 116, 90, 134, - 10, 234, 104, 22, 170, 13, 58, 24, 119, 241, 125, 5, 136, 223, 201, 162, - 45, 187, 24, 67, 22, 21, 124, 87, 206, 0, 220, 135, 120, 132, 35, 149, - 217, 118, 211, 222, 67, 199, 215, 242, 17, 217, 201, 163, 139, 115, 35, 240, - 22, 186, 79, 209, 154, 20, 148, 202, 138, 167, 95, 213, 38, 122, 196, 166, - 19, 150, 76, 77, 36, 61, 14, 6, 26, 177, 146, 29, 247, 104, 214, 82, - 155, 71, 229, 230, 232, 112, 14, 112, 53, 2, 112, 230, 228, 187, 31, 22, - 147, 244, 81, 78, 142, 31, 172, 121, 229, 15, 242, 70, 117, 68, 240, 27, - 58, 245, 61, 115, 26, 136, 225, 163, 202, 173, 5, 134, 150, 252, 140, 31, - 2, 195, 234, 236, 94, 209, 200, 139, 56, 244, 207, 144, 240, 130, 227, 239, - 148, 153, 168, 129, 37, 192, 124, 1, 109, 172, 202, 222, 157, 83, 245, 121, - 13, 1, 5, 217, 192, 91, 120, 147, 168, 44, 169, 2, 201, 131, 255, 246, - 184, 199, 146, 53, 151, 42, 161, 78, 234, 251, 202, 133, 181, 125, 154, 19, - 107, 11, 234, 57, 125, 210, 97, 206, 75, 231, 94, 235, 42, 57, 215, 70, - 155, 60, 189, 94, 217, 250, 25, 192, 66, 213, 95, 246, 153, 42, 83, 108, - 216, 81, 234, 44, 210, 246, 231, 155, 171, 43, 89, 118, 136, 231, 235, 171, - 43, 197, 33, 170, 60, 222, 25, 82, 52, 68, 59, 153, 52, 188, 96, 24, - 90, 27, 195, 9, 4, 178, 57, 121, 33, 137, 33, 135, 144, 44, 204, 164, - 16, 204, 19, 70, 51, 25, 13, 13, 87, 173, 204, 121, 30, 86, 0, 107, - 12, 72, 47, 209, 245, 108, 172, 66, 244, 7, 32, 138, 251, 239, 38, 247, - 84, 24, 183, 166, 131, 5, 58, 135, 104, 172, 55, 91, 12, 134, 225, 66, - 167, 216, 1, 219, 219, 243, 168, 254, 166, 54, 153, 175, 213, 0, 193, 203, - 83, 136, 143, 106, 194, 198, 168, 49, 182, 59, 208, 69, 230, 149, 226, 245, - 193, 228, 3, 186, 104, 173, 159, 89, 50, 16, 218, 150, 230, 201, 89, 152, - 79, 16, 249, 71, 61, 204, 155, 233, 81, 69, 47, 36, 9, 215, 215, 232, - 180, 2, 53, 198, 208, 169, 193, 33, 164, 135, 97, 59, 236, 175, 105, 87, - 151, 81, 236, 80, 31, 219, 75, 176, 159, 217, 3, 134, 149, 51, 103, 71, - 21, 222, 240, 155, 37, 132, 6, 57, 60, 113, 50, 2, 151, 208, 5, 121, - 111, 6, 18, 218, 236, 169, 165, 211, 47, 60, 39, 89, 59, 14, 62, 202, - 2, 116, 181, 62, 177, 184, 247, 13, 107, 0, 158, 240, 130, 43, 193, 208, - 244, 183, 204, 33, 108, 17, 156, 68, 54, 132, 180, 95, 44, 227, 231, 124, - 151, 46, 253, 23, 118, 99, 161, 160, 29, 41, 225, 187, 43, 3, 223, 93, - 242, 13, 199, 13, 33, 141, 172, 102, 161, 125, 248, 79, 103, 176, 66, 143, - 202, 7, 251, 224, 35, 88, 180, 1, 78, 246, 192, 0, 23, 251, 209, 95, - 0, 74, 69, 95, 23, 214, 85, 80, 187, 220, 235, 212, 70, 96, 86, 100, - 34, 90, 145, 1, 245, 70, 113, 79, 46, 185, 191, 129, 21, 153, 203, 210, - 229, 84, 53, 220, 48, 227, 26, 65, 94, 188, 81, 9, 178, 238, 177, 87, - 178, 238, 202, 93, 87, 158, 23, 143, 125, 167, 43, 206, 189, 171, 140, 37, - 198, 160, 209, 101, 163, 222, 131, 142, 91, 128, 38, 12, 128, 221, 239, 115, - 99, 250, 213, 135, 126, 8, 143, 200, 220, 127, 69, 8, 21, 138, 88, 204, - 61, 33, 179, 176, 187, 124, 252, 118, 110, 10, 188, 203, 204, 96, 248, 215, - 141, 254, 181, 75, 95, 187, 59, 75, 192, 93, 45, 196, 62, 113, 227, 23, - 220, 18, 14, 211, 33, 49, 231, 25, 106, 20, 173, 213, 68, 88, 104, 12, - 103, 44, 74, 129, 219, 129, 208, 58, 17, 76, 223, 135, 199, 117, 192, 101, - 21, 110, 44, 46, 24, 32, 184, 177, 192, 210, 109, 0, 118, 50, 231, 148, - 33, 41, 225, 196, 73, 170, 55, 0, 91, 91, 111, 200, 121, 48, 65, 194, - 63, 12, 92, 66, 204, 33, 142, 66, 9, 26, 180, 93, 53, 192, 81, 44, - 224, 112, 227, 31, 235, 178, 186, 6, 24, 167, 214, 197, 107, 253, 138, 182, - 49, 255, 83, 224, 161, 213, 171, 205, 114, 44, 192, 144, 155, 111, 59, 75, - 155, 135, 67, 126, 225, 76, 193, 70, 220, 111, 79, 39, 107, 47, 133, 253, - 61, 196, 28, 150, 88, 187, 251, 67, 170, 230, 191, 217, 89, 11, 152, 57, - 24, 233, 26, 122, 95, 55, 11, 90, 72, 44, 107, 242, 49, 65, 243, 183, - 2, 82, 220, 217, 248, 61, 225, 21, 93, 245, 76, 53, 184, 196, 32, 205, - 190, 63, 86, 170, 225, 250, 242, 127, 107, 192, 88, 124, 89, 27, 251, 44, - 157, 216, 97, 108, 205, 140, 70, 211, 230, 236, 196, 174, 118, 169, 59, 97, - 33, 135, 222, 207, 49, 206, 43, 230, 185, 190, 86, 28, 255, 240, 2, 217, - 226, 146, 189, 112, 156, 44, 241, 155, 241, 73, 79, 182, 226, 251, 5, 50, - 84, 23, 82, 200, 190, 144, 133, 37, 252, 44, 141, 144, 203, 240, 233, 11, - 38, 115, 23, 9, 75, 124, 91, 2, 202, 24, 74, 161, 119, 50, 201, 161, - 194, 127, 42, 34, 28, 26, 248, 11, 40, 102, 8, 21, 145, 0, 115, 40, - 93, 203, 170, 215, 9, 25, 46, 224, 215, 13, 239, 78, 214, 210, 112, 121, - 144, 99, 105, 201, 177, 164, 28, 43, 189, 126, 226, 153, 57, 229, 128, 162, - 120, 93, 80, 128, 26, 195, 7, 214, 26, 54, 39, 155, 144, 200, 28, 18, - 89, 135, 132, 139, 82, 135, 50, 135, 68, 230, 237, 200, 248, 76, 144, 28, - 228, 88, 90, 114, 44, 41, 199, 74, 254, 0, 18, 89, 135, 68, 230, 144, - 44, 66, 239, 8, 215, 133, 29, 202, 184, 224, 15, 62, 193, 88, 9, 75, - 76, 167, 183, 5, 166, 47, 88, 14, 192, 252, 70, 126, 51, 29, 243, 15, - 205, 14, 241, 254, 176, 159, 21, 235, 21, 241, 35, 96, 25, 171, 77, 12, - 53, 189, 0, 56, 157, 246, 149, 243, 221, 85, 163, 16, 112, 67, 55, 65, - 232, 32, 57, 211, 88, 219, 9, 131, 229, 51, 163, 158, 94, 208, 201, 243, - 96, 47, 50, 15, 191, 171, 236, 207, 188, 5, 3, 153, 158, 221, 191, 156, - 227, 122, 100, 171, 196, 52, 233, 164, 21, 107, 24, 52, 234, 114, 55, 182, - 142, 205, 32, 223, 182, 253, 93, 240, 107, 100, 165, 33, 66, 230, 73, 179, - 157, 109, 214, 53, 10, 219, 175, 5, 177, 11, 91, 123, 212, 153, 214, 6, - 251, 72, 240, 2, 105, 88, 164, 44, 15, 210, 92, 204, 17, 202, 165, 77, - 187, 164, 214, 156, 178, 193, 215, 71, 207, 106, 164, 199, 66, 255, 67, 119, - 74, 23, 204, 204, 193, 112, 217, 178, 135, 56, 100, 238, 192, 144, 57, 172, - 186, 148, 100, 193, 109, 184, 103, 65, 93, 28, 160, 208, 77, 168, 185, 211, - 171, 207, 112, 140, 120, 125, 109, 116, 44, 96, 13, 85, 34, 124, 208, 197, - 195, 238, 65, 215, 108, 13, 128, 38, 244, 190, 78, 153, 178, 247, 21, 99, - 205, 126, 65, 99, 126, 152, 64, 178, 120, 180, 2, 97, 191, 230, 100, 148, - 165, 170, 36, 224, 11, 168, 232, 147, 236, 46, 100, 100, 163, 223, 61, 58, - 245, 13, 147, 113, 228, 189, 54, 142, 48, 63, 93, 55, 116, 18, 218, 122, - 194, 113, 141, 14, 131, 62, 221, 163, 56, 172, 31, 77, 74, 78, 207, 98, - 105, 131, 203, 39, 145, 223, 75, 247, 211, 189, 42, 233, 203, 199, 110, 137, - 179, 7, 140, 97, 35, 120, 28, 215, 121, 59, 196, 250, 36, 113, 180, 211, - 45, 10, 65, 225, 23, 44, 188, 251, 88, 143, 24, 117, 239, 152, 51, 35, - 15, 10, 116, 100, 227, 3, 142, 10, 77, 54, 50, 19, 161, 174, 49, 69, - 68, 60, 60, 223, 247, 235, 188, 20, 70, 44, 184, 98, 64, 16, 161, 5, - 230, 167, 204, 198, 227, 44, 6, 116, 85, 44, 22, 220, 135, 0, 124, 213, - 99, 42, 158, 230, 3, 252, 198, 9, 113, 187, 204, 67, 157, 112, 170, 155, - 168, 118, 38, 246, 242, 242, 173, 96, 198, 135, 177, 80, 226, 140, 83, 115, - 121, 201, 28, 16, 218, 153, 43, 207, 129, 93, 49, 248, 229, 211, 86, 27, - 117, 11, 9, 248, 15, 34, 221, 154, 89, 12, 190, 184, 181, 212, 191, 183, - 132, 119, 15, 254, 255, 227, 18, 94, 27, 11, 229, 229, 251, 68, 158, 139, - 227, 94, 239, 47, 166, 228, 6, 78, 101, 130, 55, 114, 182, 138, 89, 131, - 116, 95, 167, 32, 63, 60, 100, 150, 207, 76, 209, 221, 14, 6, 36, 221, - 169, 185, 174, 74, 110, 113, 249, 199, 124, 57, 174, 45, 151, 85, 88, 141, - 70, 70, 211, 121, 33, 110, 189, 249, 104, 186, 192, 80, 202, 42, 69, 195, - 53, 247, 36, 139, 104, 99, 155, 141, 241, 14, 212, 168, 65, 178, 224, 241, - 59, 85, 143, 243, 44, 32, 137, 138, 100, 248, 2, 86, 46, 96, 253, 206, - 107, 14, 199, 153, 64, 251, 154, 188, 214, 225, 137, 162, 146, 14, 27, 29, - 13, 24, 230, 77, 145, 140, 56, 57, 250, 85, 118, 131, 1, 235, 159, 93, - 62, 238, 100, 240, 68, 83, 232, 222, 15, 27, 146, 69, 233, 210, 71, 50, - 101, 245, 98, 220, 213, 88, 144, 87, 143, 209, 50, 70, 81, 213, 187, 207, - 88, 145, 48, 134, 205, 58, 212, 35, 217, 214, 117, 231, 186, 239, 172, 13, - 181, 1, 16, 148, 186, 230, 175, 135, 34, 190, 157, 136, 96, 155, 51, 23, - 177, 69, 132, 43, 178, 75, 124, 192, 249, 30, 16, 213, 11, 237, 217, 247, - 130, 103, 167, 104, 136, 25, 3, 76, 200, 138, 228, 19, 54, 116, 165, 120, - 57, 158, 112, 161, 84, 25, 193, 102, 31, 92, 40, 75, 164, 232, 190, 14, - 126, 244, 138, 91, 10, 57, 103, 7, 40, 201, 5, 72, 93, 132, 129, 33, - 45, 86, 131, 167, 227, 247, 154, 97, 81, 201, 156, 208, 44, 212, 103, 133, - 250, 70, 33, 219, 186, 205, 125, 58, 0, 253, 72, 45, 250, 37, 7, 206, - 22, 194, 32, 95, 6, 120, 144, 93, 200, 228, 165, 73, 196, 97, 84, 144, - 1, 131, 201, 212, 32, 214, 12, 87, 117, 73, 180, 175, 219, 187, 175, 64, - 88, 183, 89, 203, 44, 156, 29, 78, 13, 51, 118, 20, 79, 129, 199, 172, - 247, 247, 69, 207, 48, 113, 164, 229, 66, 254, 41, 245, 54, 60, 232, 30, - 171, 125, 84, 253, 175, 196, 113, 149, 131, 59, 30, 245, 79, 151, 164, 10, - 122, 172, 128, 15, 25, 17, 1, 152, 118, 248, 247, 35, 38, 4, 95, 33, - 88, 235, 154, 100, 243, 48, 45, 62, 199, 63, 112, 144, 109, 235, 62, 37, - 244, 93, 122, 2, 142, 50, 250, 157, 179, 44, 193, 119, 28, 86, 156, 121, - 28, 86, 32, 38, 48, 200, 241, 63, 137, 253, 254, 110, 10, 190, 13, 249, - 178, 10, 55, 26, 140, 2, 140, 78, 53, 177, 55, 42, 121, 241, 59, 149, - 19, 22, 206, 206, 246, 203, 242, 92, 151, 215, 34, 200, 181, 202, 112, 167, - 139, 122, 189, 53, 253, 248, 60, 162, 207, 120, 126, 90, 213, 141, 244, 66, - 255, 254, 199, 145, 21, 252, 143, 78, 164, 255, 11, 199, 145, 128, 158, 143, - 17, 181, 34, 113, 69, 225, 44, 5, 29, 231, 251, 49, 142, 180, 208, 216, - 244, 241, 34, 130, 147, 170, 224, 194, 183, 177, 67, 0, 47, 5, 122, 232, - 66, 138, 181, 172, 242, 211, 129, 209, 88, 152, 230, 247, 25, 7, 134, 196, - 226, 114, 250, 125, 182, 134, 65, 144, 9, 60, 184, 53, 162, 1, 191, 100, - 161, 212, 240, 145, 92, 141, 184, 176, 30, 30, 17, 251, 210, 107, 211, 81, - 51, 218, 23, 216, 116, 45, 104, 196, 122, 232, 117, 163, 129, 110, 202, 214, - 78, 246, 36, 59, 55, 206, 205, 197, 187, 236, 108, 238, 220, 93, 140, 147, - 105, 201, 109, 179, 48, 18, 63, 192, 242, 108, 109, 100, 216, 218, 176, 145, - 234, 16, 115, 69, 106, 193, 64, 214, 42, 41, 142, 42, 16, 133, 228, 163, - 131, 97, 102, 12, 253, 97, 141, 88, 173, 50, 220, 71, 177, 172, 153, 175, - 63, 22, 214, 135, 188, 230, 65, 207, 209, 79, 236, 37, 145, 144, 151, 62, - 84, 232, 96, 88, 225, 66, 190, 132, 43, 234, 78, 224, 57, 8, 155, 81, - 14, 151, 204, 85, 123, 100, 22, 165, 28, 43, 191, 160, 24, 230, 64, 243, - 94, 32, 233, 139, 94, 126, 225, 221, 68, 123, 159, 70, 189, 6, 108, 137, - 17, 27, 255, 181, 81, 175, 117, 175, 58, 128, 158, 224, 106, 170, 160, 112, - 6, 5, 48, 194, 63, 128, 138, 166, 185, 226, 87, 78, 62, 226, 128, 72, - 233, 1, 21, 82, 233, 243, 238, 215, 162, 90, 91, 145, 217, 172, 213, 193, - 200, 31, 168, 139, 2, 152, 19, 40, 231, 217, 168, 79, 151, 133, 208, 59, - 228, 252, 167, 112, 29, 194, 11, 193, 206, 192, 117, 121, 158, 191, 61, 154, - 182, 58, 76, 154, 218, 158, 142, 6, 66, 189, 214, 232, 241, 119, 109, 200, - 173, 198, 90, 77, 97, 52, 174, 77, 22, 76, 143, 133, 153, 86, 57, 173, - 6, 118, 253, 205, 165, 81, 113, 142, 225, 53, 200, 121, 163, 135, 83, 34, - 73, 123, 29, 8, 177, 233, 134, 69, 95, 116, 25, 87, 90, 163, 88, 180, - 213, 174, 45, 250, 115, 166, 2, 240, 155, 240, 237, 160, 19, 178, 164, 120, - 190, 33, 254, 53, 251, 105, 9, 177, 141, 95, 119, 176, 61, 144, 255, 96, - 151, 169, 171, 255, 62, 106, 50, 127, 226, 134, 63, 187, 93, 99, 24, 169, - 31, 141, 55, 13, 152, 253, 247, 253, 177, 117, 114, 85, 133, 218, 90, 27, - 44, 6, 130, 57, 42, 208, 215, 203, 179, 131, 3, 224, 95, 251, 223, 175, - 232, 205, 76, 209, 186, 79, 199, 230, 49, 134, 205, 241, 12, 193, 216, 110, - 194, 176, 181, 178, 14, 133, 17, 164, 132, 66, 58, 157, 143, 48, 170, 214, - 18, 99, 192, 33, 242, 159, 205, 121, 184, 110, 199, 79, 106, 165, 236, 181, - 28, 62, 209, 178, 101, 208, 255, 90, 203, 41, 106, 115, 213, 109, 181, 250, - 20, 186, 134, 183, 185, 127, 8, 214, 208, 196, 113, 38, 20, 31, 221, 168, - 196, 206, 192, 216, 142, 80, 205, 5, 181, 128, 180, 161, 123, 180, 48, 206, - 181, 189, 130, 131, 253, 218, 191, 57, 13, 45, 148, 68, 50, 86, 56, 250, - 44, 24, 1, 117, 106, 251, 70, 149, 212, 19, 166, 41, 4, 107, 11, 155, - 134, 157, 124, 104, 216, 120, 66, 195, 101, 49, 110, 26, 122, 78, 45, 182, - 110, 113, 181, 13, 106, 179, 222, 169, 146, 133, 155, 176, 126, 86, 51, 117, - 36, 203, 240, 82, 87, 81, 41, 233, 164, 38, 76, 106, 191, 220, 160, 54, - 237, 193, 177, 244, 121, 153, 3, 75, 208, 38, 96, 40, 29, 86, 184, 94, - 206, 15, 38, 180, 214, 108, 182, 154, 167, 170, 121, 188, 137, 223, 194, 212, - 232, 138, 65, 140, 184, 217, 3, 157, 171, 198, 127, 88, 216, 156, 212, 102, - 235, 231, 138, 159, 164, 173, 254, 18, 97, 165, 183, 248, 115, 133, 116, 101, - 163, 95, 34, 197, 156, 7, 132, 152, 73, 153, 89, 244, 151, 144, 52, 59, - 178, 182, 102, 45, 252, 109, 26, 66, 63, 247, 31, 39, 245, 14, 98, 24, - 14, 233, 152, 149, 156, 67, 12, 123, 59, 239, 211, 115, 157, 221, 173, 72, - 222, 1, 175, 107, 244, 87, 200, 62, 218, 233, 231, 146, 18, 233, 56, 167, - 152, 21, 44, 100, 69, 187, 9, 23, 104, 251, 123, 91, 155, 207, 96, 232, - 91, 195, 231, 151, 63, 4, 251, 202, 105, 199, 144, 189, 144, 15, 43, 147, - 129, 228, 129, 92, 20, 186, 158, 165, 40, 70, 202, 90, 66, 47, 240, 248, - 7, 205, 189, 72, 204, 136, 214, 93, 93, 100, 212, 178, 67, 22, 79, 57, - 151, 204, 247, 192, 43, 46, 255, 144, 34, 160, 175, 124, 76, 221, 240, 223, - 122, 135, 125, 145, 244, 229, 21, 242, 121, 120, 4, 63, 97, 56, 32, 53, - 40, 163, 111, 112, 12, 45, 180, 87, 190, 29, 94, 89, 216, 64, 7, 57, - 240, 20, 78, 127, 99, 204, 62, 52, 34, 37, 175, 253, 78, 30, 222, 78, - 32, 161, 56, 19, 18, 96, 62, 238, 216, 14, 41, 45, 122, 90, 93, 227, - 32, 160, 126, 16, 87, 111, 96, 177, 234, 96, 52, 86, 112, 231, 83, 152, - 162, 144, 69, 125, 200, 248, 220, 165, 207, 109, 237, 64, 149, 232, 213, 56, - 228, 47, 109, 99, 24, 218, 241, 104, 14, 207, 90, 173, 239, 132, 201, 24, - 119, 173, 9, 93, 210, 51, 39, 139, 148, 117, 136, 100, 228, 24, 35, 24, - 165, 225, 122, 80, 96, 97, 68, 226, 135, 209, 14, 125, 112, 54, 230, 83, - 184, 189, 90, 9, 57, 67, 98, 129, 41, 204, 246, 138, 114, 146, 26, 56, - 101, 37, 148, 187, 159, 151, 146, 44, 153, 9, 31, 3, 46, 71, 171, 158, - 43, 137, 203, 199, 54, 87, 204, 127, 165, 125, 141, 172, 4, 110, 85, 7, - 207, 178, 195, 109, 95, 173, 8, 78, 251, 6, 62, 109, 184, 65, 221, 134, - 127, 130, 46, 141, 96, 65, 65, 30, 97, 4, 203, 8, 18, 132, 209, 26, - 93, 19, 195, 148, 111, 208, 45, 49, 252, 30, 24, 183, 49, 209, 225, 116, - 103, 27, 226, 74, 188, 0, 58, 82, 24, 226, 10, 188, 112, 182, 118, 194, - 128, 241, 67, 236, 240, 205, 9, 127, 208, 13, 104, 99, 77, 87, 120, 132, - 11, 237, 239, 118, 112, 1, 34, 135, 161, 8, 13, 75, 64, 75, 64, 44, - 113, 12, 54, 218, 0, 98, 53, 199, 80, 3, 144, 239, 246, 198, 218, 101, - 111, 174, 177, 10, 92, 230, 240, 42, 178, 87, 219, 134, 190, 110, 224, 235, - 6, 191, 110, 232, 235, 70, 100, 175, 54, 236, 48, 52, 135, 251, 6, 43, - 55, 220, 205, 178, 41, 227, 50, 124, 152, 70, 160, 206, 89, 39, 177, 75, - 68, 218, 193, 34, 91, 233, 119, 8, 234, 52, 255, 178, 196, 47, 93, 253, - 203, 137, 65, 96, 62, 161, 67, 212, 46, 109, 97, 251, 128, 182, 173, 189, - 123, 97, 31, 64, 143, 118, 108, 85, 98, 99, 246, 21, 37, 117, 105, 95, - 67, 54, 67, 20, 118, 12, 96, 68, 7, 16, 192, 114, 99, 227, 28, 42, - 128, 133, 189, 154, 177, 28, 13, 88, 174, 97, 15, 51, 8, 44, 67, 240, - 89, 35, 57, 140, 152, 248, 223, 66, 71, 182, 125, 116, 100, 55, 240, 145, - 157, 16, 18, 107, 248, 220, 174, 111, 4, 46, 124, 30, 93, 73, 14, 99, - 19, 152, 166, 125, 204, 112, 84, 95, 41, 14, 183, 15, 177, 157, 43, 4, - 19, 15, 149, 211, 239, 135, 21, 94, 31, 86, 168, 239, 170, 19, 53, 138, - 188, 70, 241, 176, 70, 115, 112, 44, 21, 90, 125, 47, 235, 222, 212, 121, - 94, 110, 201, 170, 47, 96, 170, 126, 67, 0, 111, 96, 12, 232, 247, 163, - 234, 175, 142, 170, 231, 230, 137, 63, 209, 128, 200, 27, 16, 45, 13, 32, - 192, 188, 194, 163, 105, 214, 161, 119, 24, 198, 195, 56, 24, 215, 178, 79, - 55, 242, 163, 202, 225, 157, 109, 104, 228, 189, 174, 13, 127, 190, 95, 172, - 174, 167, 237, 107, 167, 101, 187, 35, 2, 224, 78, 136, 55, 31, 228, 223, - 56, 45, 216, 192, 97, 108, 109, 17, 107, 113, 193, 131, 227, 66, 186, 244, - 123, 177, 83, 108, 23, 99, 110, 72, 223, 240, 116, 155, 190, 247, 217, 12, - 90, 242, 203, 70, 126, 217, 154, 223, 92, 235, 163, 171, 207, 199, 131, 134, - 27, 32, 218, 182, 107, 232, 30, 130, 25, 171, 236, 35, 41, 231, 30, 102, - 50, 182, 58, 47, 113, 37, 95, 170, 159, 14, 24, 243, 232, 253, 43, 67, - 198, 75, 252, 112, 208, 220, 31, 12, 154, 251, 131, 65, 115, 127, 48, 104, - 60, 63, 225, 104, 222, 171, 63, 209, 44, 123, 229, 162, 150, 56, 78, 39, - 68, 109, 253, 220, 117, 81, 131, 12, 195, 219, 14, 246, 211, 137, 245, 57, - 107, 241, 93, 120, 92, 239, 175, 86, 102, 206, 111, 253, 31, 30, 203, 102, - 209, 15, 78, 195, 51, 245, 144, 206, 79, 238, 233, 120, 136, 71, 168, 128, - 137, 112, 218, 225, 239, 38, 100, 223, 112, 143, 219, 134, 99, 104, 42, 4, - 192, 57, 24, 100, 102, 34, 28, 53, 27, 135, 137, 55, 116, 144, 12, 16, - 173, 160, 97, 84, 101, 108, 134, 194, 253, 64, 51, 166, 175, 106, 64, 227, - 95, 66, 118, 56, 144, 249, 169, 190, 234, 210, 107, 151, 191, 194, 201, 252, - 5, 143, 102, 253, 117, 131, 175, 27, 227, 117, 45, 227, 87, 217, 248, 138, - 175, 27, 226, 0, 61, 163, 27, 40, 188, 231, 16, 197, 147, 70, 154, 134, - 2, 67, 175, 136, 160, 192, 56, 35, 175, 236, 66, 27, 226, 218, 63, 28, - 73, 198, 152, 159, 232, 41, 94, 124, 173, 57, 20, 35, 71, 152, 229, 48, - 190, 237, 87, 199, 65, 57, 168, 98, 103, 33, 26, 117, 192, 28, 186, 198, - 209, 204, 40, 202, 204, 156, 77, 159, 225, 230, 94, 0, 186, 199, 190, 210, - 83, 175, 224, 16, 98, 131, 103, 18, 182, 48, 164, 252, 115, 26, 21, 4, - 215, 223, 97, 114, 144, 220, 180, 167, 157, 196, 34, 123, 102, 253, 39, 189, - 15, 218, 211, 118, 60, 29, 225, 112, 36, 31, 3, 124, 127, 59, 117, 132, - 186, 19, 102, 19, 40, 60, 187, 20, 54, 70, 164, 47, 91, 19, 78, 85, - 216, 163, 131, 157, 96, 54, 203, 92, 173, 195, 135, 107, 133, 76, 242, 214, - 3, 135, 161, 81, 188, 15, 161, 110, 187, 109, 183, 208, 223, 54, 177, 49, - 234, 47, 6, 195, 153, 1, 157, 153, 31, 136, 48, 20, 168, 75, 47, 64, - 97, 34, 106, 120, 150, 95, 40, 86, 3, 172, 84, 252, 139, 234, 88, 50, - 62, 189, 203, 226, 193, 20, 32, 75, 86, 181, 189, 25, 117, 94, 58, 45, - 181, 146, 27, 77, 84, 107, 128, 149, 97, 132, 194, 97, 227, 245, 93, 250, - 126, 162, 50, 135, 80, 227, 53, 113, 229, 74, 179, 243, 246, 52, 119, 244, - 111, 233, 210, 238, 224, 126, 1, 196, 247, 97, 115, 130, 245, 58, 98, 196, - 210, 230, 198, 245, 56, 133, 108, 157, 244, 107, 117, 200, 77, 195, 249, 204, - 158, 95, 12, 7, 1, 206, 194, 77, 120, 47, 179, 177, 168, 118, 198, 13, - 6, 144, 8, 127, 68, 187, 79, 223, 193, 166, 216, 215, 139, 35, 133, 71, - 107, 125, 188, 46, 107, 95, 160, 62, 203, 43, 114, 84, 213, 157, 209, 183, - 227, 250, 240, 6, 111, 57, 187, 143, 192, 52, 236, 226, 153, 174, 151, 157, - 191, 187, 84, 197, 241, 35, 80, 177, 106, 131, 234, 248, 164, 98, 20, 61, - 122, 189, 70, 213, 226, 79, 84, 109, 245, 115, 192, 119, 19, 187, 131, 165, - 175, 1, 173, 108, 141, 53, 133, 82, 81, 180, 96, 100, 52, 172, 22, 178, - 179, 15, 88, 187, 158, 69, 123, 182, 107, 47, 20, 222, 148, 30, 120, 6, - 203, 122, 48, 90, 231, 26, 51, 138, 142, 93, 77, 186, 12, 1, 238, 90, - 210, 117, 122, 199, 8, 226, 184, 150, 174, 92, 246, 21, 221, 6, 92, 252, - 42, 68, 111, 82, 8, 147, 13, 205, 194, 13, 102, 235, 210, 181, 192, 197, - 175, 69, 244, 134, 217, 186, 102, 54, 116, 159, 98, 95, 233, 85, 136, 140, - 110, 197, 87, 60, 156, 118, 6, 37, 203, 50, 24, 117, 99, 161, 174, 94, - 161, 200, 72, 92, 124, 117, 17, 42, 214, 137, 94, 150, 97, 95, 247, 93, - 95, 226, 7, 248, 217, 64, 149, 124, 70, 231, 35, 62, 96, 167, 194, 177, - 163, 212, 95, 88, 61, 27, 168, 30, 81, 76, 218, 166, 207, 2, 211, 122, - 96, 98, 98, 66, 125, 246, 241, 138, 238, 30, 204, 78, 153, 52, 37, 44, - 223, 186, 116, 9, 193, 111, 214, 128, 237, 128, 215, 160, 24, 252, 235, 10, - 102, 28, 214, 85, 13, 77, 134, 186, 173, 38, 225, 86, 126, 95, 126, 33, - 105, 4, 219, 229, 150, 84, 167, 245, 153, 244, 21, 244, 11, 63, 27, 129, - 83, 167, 195, 241, 33, 182, 63, 118, 102, 70, 219, 144, 40, 161, 181, 116, - 161, 119, 110, 72, 36, 208, 6, 19, 168, 71, 144, 3, 103, 97, 45, 91, - 114, 96, 194, 70, 54, 114, 136, 91, 198, 30, 96, 167, 0, 247, 146, 131, - 126, 93, 0, 215, 178, 147, 194, 201, 220, 8, 50, 37, 132, 213, 234, 74, - 63, 142, 86, 221, 171, 46, 6, 206, 117, 80, 37, 28, 83, 9, 246, 33, - 86, 52, 196, 154, 134, 88, 213, 240, 87, 234, 50, 181, 231, 25, 2, 163, - 232, 69, 134, 253, 53, 41, 204, 226, 124, 193, 230, 118, 233, 155, 123, 135, - 95, 244, 23, 171, 185, 191, 181, 158, 175, 232, 40, 100, 71, 186, 35, 123, - 198, 221, 78, 212, 231, 229, 121, 8, 177, 161, 77, 54, 80, 134, 245, 126, - 107, 104, 200, 220, 73, 174, 194, 169, 163, 105, 167, 94, 187, 212, 231, 80, - 159, 137, 227, 133, 107, 236, 244, 163, 217, 227, 51, 103, 153, 224, 35, 131, - 243, 195, 179, 146, 221, 167, 45, 8, 25, 99, 212, 76, 107, 77, 57, 228, - 197, 31, 37, 164, 34, 234, 11, 113, 187, 49, 250, 160, 178, 15, 10, 125, - 64, 177, 30, 0, 1, 39, 174, 100, 132, 65, 128, 23, 57, 196, 212, 101, - 36, 67, 137, 209, 220, 137, 199, 199, 243, 181, 128, 20, 43, 30, 203, 132, - 160, 46, 240, 22, 126, 46, 139, 58, 194, 34, 174, 203, 57, 158, 213, 132, - 167, 46, 240, 86, 142, 159, 13, 178, 162, 143, 39, 185, 250, 162, 75, 233, - 116, 239, 252, 76, 193, 218, 142, 64, 227, 126, 20, 142, 211, 21, 66, 227, - 78, 59, 106, 121, 218, 251, 60, 180, 144, 17, 114, 19, 6, 95, 71, 1, - 250, 10, 131, 133, 71, 204, 198, 143, 148, 17, 15, 101, 126, 150, 47, 164, - 34, 254, 147, 120, 72, 104, 47, 250, 253, 105, 107, 246, 33, 62, 234, 225, - 190, 114, 234, 232, 200, 138, 232, 132, 217, 188, 54, 95, 204, 66, 28, 101, - 241, 55, 253, 251, 159, 176, 58, 104, 71, 90, 184, 117, 130, 137, 149, 140, - 41, 65, 228, 132, 108, 9, 118, 99, 11, 189, 147, 73, 33, 158, 169, 43, - 39, 92, 205, 220, 22, 94, 158, 145, 184, 227, 104, 204, 168, 131, 108, 92, - 212, 11, 118, 155, 113, 236, 76, 220, 102, 228, 216, 67, 113, 70, 170, 44, - 236, 247, 142, 41, 247, 219, 184, 143, 68, 102, 137, 69, 134, 79, 236, 175, - 204, 189, 101, 192, 168, 212, 200, 136, 15, 176, 68, 109, 208, 34, 59, 28, - 166, 210, 186, 0, 2, 144, 134, 193, 102, 81, 11, 53, 4, 146, 204, 205, - 134, 242, 85, 232, 192, 130, 208, 32, 233, 117, 56, 162, 200, 171, 151, 194, - 55, 25, 215, 153, 246, 167, 226, 248, 198, 25, 169, 28, 92, 139, 248, 214, - 116, 189, 136, 50, 220, 101, 109, 170, 161, 36, 242, 149, 64, 48, 132, 164, - 186, 160, 146, 4, 177, 144, 147, 164, 172, 172, 16, 171, 97, 52, 53, 69, - 170, 55, 211, 206, 130, 64, 251, 182, 87, 219, 55, 97, 54, 110, 53, 208, - 104, 158, 73, 77, 244, 143, 240, 82, 99, 226, 147, 154, 54, 100, 159, 12, - 241, 47, 107, 130, 153, 103, 11, 231, 181, 153, 144, 115, 198, 157, 97, 231, - 243, 205, 11, 16, 160, 115, 1, 46, 77, 20, 83, 219, 108, 59, 9, 196, - 4, 101, 63, 104, 12, 77, 176, 161, 223, 7, 53, 95, 10, 55, 176, 92, - 59, 67, 92, 177, 223, 92, 50, 83, 56, 33, 89, 105, 195, 40, 119, 40, - 95, 192, 60, 176, 214, 102, 173, 143, 101, 200, 123, 221, 14, 173, 103, 13, - 99, 88, 185, 40, 121, 111, 204, 103, 61, 109, 44, 160, 52, 217, 154, 113, - 247, 183, 138, 145, 167, 3, 140, 57, 196, 118, 173, 93, 143, 166, 246, 197, - 62, 220, 9, 118, 68, 116, 136, 243, 208, 107, 5, 160, 111, 78, 212, 218, - 135, 196, 176, 207, 25, 28, 61, 42, 21, 55, 216, 121, 244, 26, 102, 175, - 42, 127, 189, 97, 215, 30, 163, 22, 138, 191, 226, 161, 143, 228, 179, 127, - 135, 78, 60, 5, 93, 46, 157, 25, 183, 134, 40, 61, 132, 76, 127, 8, - 128, 11, 205, 98, 176, 182, 240, 223, 13, 224, 158, 253, 21, 6, 19, 208, - 236, 180, 230, 92, 44, 109, 44, 159, 111, 118, 153, 185, 108, 133, 61, 50, - 37, 193, 41, 43, 118, 70, 125, 61, 131, 193, 48, 44, 189, 1, 213, 113, - 221, 9, 143, 36, 137, 24, 19, 214, 104, 118, 167, 235, 38, 230, 153, 195, - 90, 238, 78, 0, 189, 202, 218, 152, 92, 242, 21, 145, 23, 28, 36, 200, - 76, 92, 178, 152, 187, 93, 246, 83, 11, 73, 44, 119, 179, 206, 18, 230, - 93, 140, 49, 101, 76, 166, 62, 138, 239, 8, 234, 206, 17, 10, 189, 126, - 123, 253, 198, 48, 43, 27, 207, 189, 15, 59, 219, 0, 210, 155, 205, 215, - 49, 19, 156, 253, 38, 88, 78, 200, 87, 92, 36, 236, 131, 253, 236, 12, - 135, 253, 32, 37, 4, 127, 96, 130, 206, 206, 84, 252, 227, 1, 240, 207, - 108, 150, 202, 12, 237, 64, 193, 146, 184, 111, 232, 104, 249, 160, 56, 245, - 35, 209, 146, 200, 99, 124, 236, 39, 122, 244, 24, 22, 214, 68, 163, 78, - 56, 70, 45, 201, 62, 94, 235, 65, 110, 191, 25, 32, 195, 154, 28, 64, - 147, 77, 250, 191, 53, 53, 200, 76, 109, 217, 191, 189, 190, 72, 164, 246, - 202, 255, 237, 125, 145, 157, 22, 189, 42, 219, 98, 216, 224, 27, 201, 204, - 99, 59, 61, 210, 251, 163, 28, 146, 137, 212, 58, 183, 231, 254, 180, 199, - 255, 180, 135, 29, 66, 195, 176, 224, 239, 212, 149, 238, 108, 121, 41, 36, - 244, 75, 122, 158, 223, 209, 133, 18, 62, 40, 47, 60, 120, 220, 200, 166, - 75, 76, 116, 121, 201, 7, 114, 36, 195, 67, 129, 141, 142, 51, 102, 227, - 14, 208, 147, 23, 74, 125, 237, 114, 217, 94, 32, 168, 11, 247, 188, 126, - 168, 80, 161, 52, 137, 95, 198, 88, 22, 207, 137, 44, 30, 137, 46, 32, - 64, 45, 7, 240, 234, 19, 16, 208, 143, 164, 125, 173, 136, 42, 94, 110, - 60, 122, 150, 181, 23, 83, 61, 44, 213, 199, 46, 168, 120, 179, 82, 84, - 200, 169, 88, 118, 18, 90, 129, 120, 241, 138, 182, 241, 17, 49, 45, 250, - 45, 158, 66, 233, 114, 230, 146, 41, 218, 29, 255, 93, 203, 34, 123, 167, - 223, 125, 247, 174, 170, 66, 142, 60, 63, 43, 69, 239, 228, 100, 244, 195, - 172, 250, 59, 111, 0, 13, 211, 207, 229, 239, 146, 3, 99, 140, 96, 60, - 37, 67, 127, 212, 96, 232, 178, 236, 140, 155, 171, 187, 111, 208, 46, 15, - 8, 100, 64, 139, 9, 75, 56, 121, 1, 102, 94, 65, 107, 4, 174, 136, - 203, 239, 12, 76, 17, 205, 218, 127, 229, 0, 60, 245, 167, 250, 255, 81, - 169, 19, 253, 63, 204, 170, 156, 232, 191, 234, 13, 126, 151, 254, 148, 191, - 203, 248, 143, 137, 96, 161, 78, 23, 206, 251, 81, 239, 85, 232, 253, 81, - 231, 20, 163, 115, 123, 107, 113, 191, 171, 158, 3, 72, 188, 63, 213, 213, - 143, 74, 157, 232, 234, 97, 86, 207, 71, 83, 205, 58, 8, 55, 35, 88, - 194, 71, 29, 244, 152, 38, 152, 236, 18, 99, 244, 210, 99, 244, 146, 133, - 88, 62, 139, 48, 63, 221, 103, 52, 189, 172, 33, 180, 82, 65, 201, 181, - 100, 149, 129, 35, 190, 24, 245, 209, 141, 2, 150, 202, 244, 155, 150, 18, - 170, 199, 40, 97, 201, 201, 204, 150, 49, 184, 87, 192, 41, 251, 116, 64, - 12, 67, 152, 247, 46, 153, 195, 236, 71, 182, 225, 112, 18, 139, 3, 85, - 209, 89, 245, 138, 193, 108, 228, 151, 23, 89, 65, 235, 104, 235, 73, 113, - 189, 115, 224, 165, 156, 155, 218, 120, 116, 131, 51, 221, 145, 151, 14, 10, - 6, 199, 14, 232, 160, 144, 206, 32, 227, 13, 224, 37, 243, 226, 220, 126, - 29, 10, 237, 227, 73, 155, 1, 143, 79, 132, 207, 95, 125, 120, 101, 36, - 176, 232, 253, 58, 196, 18, 56, 18, 68, 210, 214, 122, 180, 234, 238, 117, - 45, 137, 182, 75, 18, 154, 16, 11, 167, 100, 136, 133, 29, 76, 118, 140, - 243, 119, 14, 9, 121, 135, 33, 22, 214, 175, 200, 141, 245, 53, 228, 219, - 25, 158, 146, 27, 107, 92, 24, 120, 133, 55, 159, 137, 240, 102, 234, 230, - 188, 204, 21, 49, 116, 204, 50, 162, 165, 140, 120, 186, 204, 230, 26, 50, - 232, 101, 216, 12, 55, 54, 84, 63, 220, 239, 245, 231, 195, 50, 87, 196, - 3, 218, 47, 35, 90, 202, 136, 214, 50, 102, 54, 248, 194, 56, 16, 240, - 139, 147, 197, 191, 52, 214, 140, 55, 65, 191, 52, 141, 54, 99, 116, 96, - 155, 187, 236, 9, 203, 248, 184, 33, 101, 119, 26, 118, 197, 2, 187, 250, - 147, 176, 43, 22, 216, 213, 143, 97, 87, 56, 236, 170, 14, 251, 1, 210, - 48, 224, 37, 230, 197, 141, 21, 94, 82, 246, 63, 9, 175, 199, 2, 175, - 247, 39, 225, 245, 88, 224, 245, 126, 12, 175, 135, 195, 235, 53, 224, 165, - 19, 63, 241, 167, 61, 255, 167, 189, 244, 39, 64, 40, 48, 22, 154, 98, - 34, 70, 226, 161, 51, 23, 62, 57, 253, 248, 143, 235, 199, 127, 152, 31, - 255, 182, 191, 97, 127, 203, 18, 219, 64, 136, 88, 18, 249, 146, 112, 126, - 166, 203, 159, 18, 142, 221, 153, 211, 120, 203, 95, 16, 217, 109, 73, 41, - 241, 20, 199, 25, 171, 82, 150, 245, 58, 21, 143, 21, 137, 89, 72, 11, - 108, 132, 110, 123, 231, 103, 246, 28, 84, 101, 143, 227, 159, 176, 165, 210, - 155, 147, 21, 6, 140, 250, 136, 252, 224, 213, 28, 214, 242, 89, 57, 28, - 113, 32, 140, 223, 155, 173, 134, 210, 109, 173, 255, 128, 217, 204, 93, 248, - 188, 94, 213, 39, 218, 227, 104, 71, 43, 218, 195, 59, 114, 249, 239, 66, - 103, 255, 210, 183, 29, 14, 166, 110, 77, 203, 61, 34, 33, 66, 163, 111, - 24, 67, 18, 93, 254, 95, 3, 141, 93, 227, 196, 183, 118, 5, 47, 219, - 111, 78, 77, 124, 253, 118, 243, 205, 133, 31, 156, 154, 3, 198, 21, 7, - 182, 144, 122, 16, 206, 206, 254, 227, 236, 125, 190, 59, 132, 17, 200, 33, - 14, 36, 205, 195, 202, 74, 22, 156, 56, 18, 241, 146, 101, 207, 57, 237, - 113, 167, 61, 236, 180, 223, 48, 122, 204, 146, 118, 120, 197, 48, 220, 140, - 31, 223, 36, 24, 115, 220, 43, 113, 37, 17, 110, 88, 202, 212, 111, 86, - 76, 225, 2, 157, 112, 156, 86, 58, 250, 231, 63, 15, 21, 142, 184, 2, - 143, 96, 232, 239, 232, 234, 59, 159, 105, 194, 80, 110, 84, 42, 185, 32, - 205, 28, 44, 194, 223, 186, 31, 151, 139, 240, 114, 24, 39, 211, 40, 198, - 94, 62, 46, 149, 227, 133, 142, 47, 107, 88, 28, 82, 109, 188, 243, 228, - 58, 18, 232, 122, 168, 153, 171, 157, 152, 41, 134, 36, 30, 69, 170, 52, - 76, 22, 153, 42, 141, 22, 187, 18, 114, 14, 25, 76, 159, 129, 60, 76, - 255, 7, 7, 210, 71, 157, 44, 199, 43, 160, 69, 174, 92, 211, 131, 10, - 211, 21, 81, 87, 40, 128, 178, 36, 170, 229, 2, 75, 38, 153, 213, 171, - 34, 169, 45, 151, 95, 162, 144, 22, 173, 248, 243, 186, 244, 7, 69, 53, - 176, 150, 93, 128, 12, 25, 46, 52, 176, 34, 218, 177, 149, 246, 179, 65, - 67, 76, 58, 98, 28, 146, 228, 17, 96, 239, 234, 186, 119, 73, 133, 75, - 172, 204, 130, 107, 112, 3, 123, 29, 236, 147, 253, 233, 238, 117, 71, 177, - 118, 71, 253, 188, 59, 9, 43, 156, 112, 250, 56, 241, 76, 210, 187, 116, - 1, 47, 123, 221, 178, 237, 193, 216, 13, 161, 55, 128, 15, 1, 236, 90, - 0, 172, 237, 1, 232, 177, 2, 232, 253, 28, 192, 27, 93, 146, 100, 130, - 201, 239, 161, 38, 152, 240, 98, 5, 243, 16, 78, 100, 48, 239, 15, 245, - 167, 3, 123, 98, 209, 28, 209, 141, 230, 202, 99, 200, 223, 218, 33, 64, - 70, 146, 98, 237, 20, 18, 125, 123, 253, 194, 96, 25, 199, 196, 165, 126, - 102, 25, 247, 84, 60, 179, 62, 185, 171, 222, 48, 190, 180, 181, 179, 63, - 158, 13, 107, 175, 24, 248, 190, 15, 39, 195, 103, 5, 218, 39, 122, 37, - 125, 66, 113, 45, 251, 28, 95, 21, 239, 85, 72, 49, 18, 113, 46, 140, - 196, 157, 109, 204, 188, 16, 233, 153, 129, 82, 112, 136, 190, 11, 150, 196, - 178, 186, 73, 11, 239, 128, 244, 29, 127, 74, 250, 126, 60, 80, 182, 127, - 253, 64, 253, 196, 60, 203, 251, 235, 87, 84, 252, 104, 90, 207, 102, 121, - 239, 148, 209, 33, 33, 199, 43, 244, 136, 2, 111, 69, 71, 93, 60, 109, - 159, 127, 100, 229, 114, 88, 235, 178, 166, 191, 239, 177, 70, 80, 46, 36, - 43, 220, 233, 173, 69, 112, 60, 107, 153, 200, 198, 226, 195, 3, 189, 43, - 159, 228, 159, 25, 14, 240, 13, 117, 48, 11, 178, 202, 51, 169, 53, 16, - 190, 121, 81, 134, 57, 245, 161, 23, 144, 163, 221, 118, 228, 212, 198, 212, - 146, 58, 168, 139, 137, 214, 243, 174, 95, 173, 139, 157, 155, 150, 202, 74, - 6, 96, 165, 95, 6, 140, 142, 228, 131, 186, 24, 96, 165, 95, 1, 140, - 75, 253, 45, 21, 37, 184, 37, 50, 96, 90, 123, 66, 148, 73, 224, 118, - 178, 216, 225, 208, 24, 136, 218, 158, 112, 29, 20, 227, 179, 243, 252, 205, - 110, 151, 191, 189, 132, 66, 200, 44, 223, 177, 0, 240, 250, 105, 121, 110, - 97, 253, 178, 37, 202, 115, 127, 9, 125, 179, 172, 165, 111, 186, 38, 227, - 151, 31, 103, 255, 230, 112, 24, 187, 193, 92, 246, 146, 101, 247, 124, 188, - 173, 16, 251, 217, 101, 142, 247, 204, 237, 206, 54, 187, 199, 220, 238, 127, - 117, 167, 227, 254, 254, 73, 25, 154, 110, 55, 119, 64, 21, 46, 132, 35, - 162, 208, 76, 98, 10, 233, 250, 182, 126, 39, 222, 249, 161, 208, 166, 189, - 24, 146, 190, 140, 220, 60, 146, 220, 56, 95, 77, 139, 144, 215, 198, 98, - 186, 108, 189, 230, 78, 164, 197, 79, 164, 133, 13, 177, 6, 177, 232, 107, - 195, 19, 50, 16, 39, 90, 1, 77, 91, 36, 33, 89, 204, 90, 83, 114, - 139, 220, 108, 181, 225, 246, 212, 20, 180, 249, 76, 24, 173, 134, 130, 28, - 21, 116, 8, 45, 242, 153, 54, 213, 200, 108, 131, 102, 134, 56, 198, 137, - 98, 23, 120, 135, 202, 154, 40, 96, 49, 68, 26, 205, 166, 134, 21, 212, - 250, 0, 5, 186, 209, 98, 46, 111, 127, 51, 234, 19, 4, 116, 217, 220, - 130, 225, 154, 206, 230, 232, 243, 143, 131, 161, 139, 152, 72, 112, 52, 130, - 70, 247, 108, 175, 176, 163, 122, 27, 104, 100, 56, 164, 220, 92, 190, 115, - 222, 186, 236, 92, 34, 148, 134, 207, 27, 199, 229, 81, 123, 202, 16, 96, - 86, 167, 77, 18, 60, 120, 208, 147, 48, 154, 92, 177, 182, 153, 231, 109, - 20, 84, 233, 222, 154, 71, 131, 241, 104, 216, 66, 69, 23, 179, 209, 122, - 107, 166, 53, 89, 222, 10, 213, 82, 21, 106, 235, 214, 236, 95, 34, 70, - 211, 231, 1, 77, 180, 184, 198, 205, 73, 233, 217, 223, 47, 13, 155, 157, - 16, 135, 181, 77, 113, 152, 83, 248, 118, 188, 80, 67, 138, 34, 157, 252, - 18, 15, 29, 175, 214, 227, 164, 130, 85, 200, 182, 183, 71, 44, 146, 54, - 19, 134, 157, 211, 254, 174, 96, 147, 248, 160, 134, 236, 10, 254, 122, 240, - 247, 111, 19, 193, 237, 201, 188, 44, 219, 226, 3, 129, 22, 14, 19, 73, - 181, 46, 13, 39, 197, 246, 47, 70, 116, 61, 68, 110, 198, 174, 120, 133, - 243, 161, 22, 178, 127, 57, 16, 111, 89, 92, 109, 68, 116, 251, 67, 75, - 187, 36, 212, 162, 227, 251, 85, 191, 57, 178, 55, 227, 250, 104, 138, 65, - 72, 180, 199, 165, 132, 186, 184, 5, 161, 48, 164, 221, 6, 154, 93, 35, - 126, 85, 156, 239, 43, 183, 178, 211, 237, 120, 254, 219, 178, 48, 99, 13, - 163, 146, 108, 5, 255, 84, 205, 64, 121, 39, 148, 126, 222, 233, 30, 235, - 162, 64, 115, 116, 147, 117, 233, 1, 241, 116, 39, 80, 199, 227, 103, 134, - 227, 16, 200, 225, 8, 153, 140, 163, 52, 125, 220, 37, 238, 139, 106, 56, - 57, 149, 137, 96, 38, 113, 143, 108, 19, 219, 13, 244, 57, 244, 174, 184, - 60, 59, 225, 68, 228, 3, 75, 140, 25, 24, 176, 206, 84, 67, 55, 178, - 24, 5, 199, 225, 70, 232, 48, 220, 13, 61, 49, 118, 143, 226, 148, 214, - 17, 254, 31, 58, 252, 224, 17, 236, 44, 140, 5, 150, 201, 198, 185, 176, - 104, 84, 238, 33, 81, 144, 53, 10, 27, 116, 83, 69, 103, 194, 20, 202, - 175, 75, 63, 39, 185, 236, 122, 86, 204, 173, 103, 211, 217, 234, 7, 213, - 40, 42, 231, 163, 235, 87, 244, 131, 209, 227, 215, 23, 9, 214, 205, 181, - 204, 131, 140, 209, 139, 178, 51, 135, 19, 229, 39, 220, 30, 75, 79, 49, - 84, 123, 84, 90, 141, 48, 54, 48, 88, 43, 154, 46, 149, 75, 92, 12, - 95, 189, 235, 109, 99, 99, 228, 15, 88, 25, 209, 18, 231, 56, 35, 188, - 232, 191, 23, 221, 147, 112, 127, 249, 151, 130, 43, 168, 59, 69, 97, 117, - 163, 235, 18, 69, 213, 121, 227, 123, 74, 74, 125, 83, 43, 105, 52, 108, - 195, 38, 166, 208, 11, 167, 213, 147, 196, 173, 69, 65, 137, 205, 195, 187, - 158, 0, 173, 16, 195, 219, 120, 239, 186, 136, 223, 77, 158, 26, 190, 226, - 124, 125, 181, 153, 56, 233, 25, 71, 198, 162, 218, 210, 71, 98, 133, 237, - 177, 249, 180, 54, 156, 161, 119, 60, 27, 5, 225, 60, 127, 255, 22, 73, - 14, 58, 106, 243, 27, 243, 141, 64, 22, 124, 14, 242, 32, 39, 155, 242, - 168, 141, 37, 168, 173, 202, 125, 17, 201, 44, 47, 247, 20, 39, 182, 73, - 121, 153, 244, 197, 44, 153, 60, 102, 29, 178, 128, 122, 30, 27, 230, 96, - 2, 136, 22, 26, 7, 242, 20, 129, 131, 200, 214, 47, 58, 68, 161, 49, - 61, 151, 93, 93, 246, 74, 30, 102, 216, 22, 224, 203, 85, 215, 33, 100, - 242, 175, 61, 37, 170, 46, 153, 168, 241, 23, 13, 41, 206, 107, 166, 36, - 5, 69, 93, 102, 186, 76, 233, 59, 139, 62, 20, 122, 174, 249, 234, 244, - 29, 186, 220, 38, 81, 130, 69, 177, 186, 213, 36, 38, 205, 65, 27, 250, - 183, 15, 154, 50, 63, 31, 183, 168, 234, 28, 201, 41, 11, 156, 232, 229, - 26, 114, 138, 77, 124, 179, 44, 134, 75, 218, 147, 30, 238, 221, 15, 225, - 169, 152, 140, 163, 42, 194, 68, 140, 208, 10, 122, 28, 214, 217, 12, 140, - 245, 128, 242, 20, 123, 133, 187, 40, 58, 19, 170, 31, 228, 168, 242, 28, - 216, 14, 140, 130, 194, 220, 51, 31, 106, 123, 253, 42, 255, 240, 35, 27, - 198, 159, 55, 93, 172, 144, 217, 20, 224, 11, 114, 150, 227, 62, 167, 67, - 197, 229, 9, 194, 80, 87, 217, 80, 227, 149, 220, 250, 185, 203, 62, 147, - 209, 33, 59, 130, 70, 58, 247, 146, 108, 210, 70, 220, 38, 13, 82, 255, - 59, 124, 74, 182, 39, 47, 100, 197, 251, 149, 149, 98, 155, 146, 37, 252, - 144, 91, 201, 75, 251, 15, 10, 251, 63, 41, 203, 121, 150, 118, 126, 188, - 82, 31, 248, 225, 106, 229, 7, 28, 149, 217, 83, 145, 54, 206, 86, 244, - 237, 207, 79, 93, 7, 158, 194, 38, 174, 48, 245, 231, 13, 19, 23, 149, - 248, 190, 64, 252, 105, 164, 194, 115, 176, 244, 248, 99, 229, 42, 4, 149, - 233, 233, 244, 178, 219, 223, 58, 104, 253, 34, 182, 13, 24, 190, 49, 79, - 160, 154, 203, 94, 33, 39, 160, 111, 231, 178, 195, 101, 175, 162, 39, 208, - 11, 154, 184, 175, 223, 48, 154, 54, 238, 116, 227, 172, 70, 69, 32, 109, - 112, 29, 64, 219, 135, 13, 183, 125, 48, 213, 169, 77, 96, 76, 6, 235, - 222, 190, 213, 149, 255, 13, 19, 88, 226, 92, 91, 205, 95, 129, 20, 248, - 104, 107, 27, 49, 242, 62, 102, 124, 227, 154, 60, 189, 243, 245, 210, 252, - 171, 9, 150, 116, 0, 231, 21, 25, 44, 134, 76, 93, 65, 94, 2, 47, - 208, 100, 102, 89, 217, 7, 12, 238, 225, 232, 147, 204, 177, 159, 10, 184, - 84, 196, 84, 36, 2, 140, 68, 220, 189, 150, 138, 137, 193, 0, 75, 128, - 95, 205, 171, 14, 114, 104, 101, 228, 254, 225, 170, 48, 92, 248, 234, 75, - 3, 111, 198, 21, 172, 104, 223, 132, 131, 249, 78, 55, 218, 21, 157, 27, - 219, 223, 189, 10, 78, 130, 74, 4, 210, 145, 147, 234, 143, 7, 222, 56, - 67, 92, 122, 12, 64, 107, 215, 250, 6, 196, 51, 232, 17, 52, 97, 20, - 124, 161, 83, 141, 148, 42, 57, 87, 99, 143, 182, 252, 96, 24, 143, 221, - 207, 90, 10, 25, 226, 7, 152, 162, 160, 244, 245, 130, 89, 6, 91, 133, - 17, 168, 53, 218, 221, 203, 176, 180, 102, 232, 58, 116, 225, 196, 136, 12, - 190, 12, 123, 175, 17, 25, 124, 173, 186, 135, 162, 9, 227, 172, 113, 90, - 53, 251, 63, 229, 203, 24, 108, 149, 231, 111, 102, 7, 191, 189, 124, 132, - 113, 62, 161, 230, 133, 211, 68, 146, 240, 211, 108, 16, 230, 10, 109, 33, - 88, 40, 158, 211, 20, 57, 182, 243, 39, 80, 61, 76, 103, 123, 192, 212, - 24, 143, 248, 31, 99, 30, 64, 252, 152, 249, 49, 92, 12, 234, 173, 233, - 235, 168, 253, 202, 85, 181, 209, 25, 81, 168, 182, 128, 203, 234, 63, 133, - 107, 201, 226, 142, 136, 241, 56, 62, 81, 107, 229, 119, 52, 230, 52, 167, - 38, 240, 54, 205, 219, 46, 50, 3, 116, 64, 180, 153, 208, 129, 171, 49, - 84, 72, 129, 122, 244, 29, 74, 220, 142, 127, 15, 245, 216, 255, 153, 11, - 254, 216, 188, 224, 19, 103, 227, 219, 241, 124, 40, 214, 75, 186, 57, 145, - 150, 27, 250, 248, 224, 134, 46, 253, 125, 247, 113, 93, 167, 238, 179, 74, - 82, 26, 83, 100, 215, 39, 165, 105, 206, 50, 77, 231, 153, 174, 91, 75, - 247, 114, 30, 3, 232, 162, 201, 246, 202, 251, 108, 135, 251, 101, 62, 122, - 229, 106, 198, 22, 213, 218, 89, 8, 53, 107, 153, 239, 140, 218, 37, 115, - 130, 205, 107, 182, 250, 109, 250, 235, 250, 177, 56, 159, 122, 149, 246, 223, - 127, 130, 185, 240, 190, 186, 38, 71, 86, 2, 233, 231, 126, 60, 36, 133, - 209, 72, 24, 44, 26, 93, 61, 22, 218, 249, 217, 251, 106, 119, 230, 216, - 243, 215, 165, 239, 143, 51, 99, 156, 79, 48, 37, 40, 254, 36, 252, 255, - 236, 145, 229, 254, 141, 238, 143, 117, 58, 125, 173, 56, 121, 100, 197, 181, - 168, 51, 121, 36, 231, 206, 1, 210, 102, 117, 112, 42, 89, 59, 55, 16, - 62, 187, 88, 59, 152, 222, 242, 231, 185, 72, 12, 24, 254, 81, 46, 116, - 177, 142, 252, 223, 207, 115, 169, 6, 78, 183, 208, 52, 186, 33, 191, 158, - 4, 200, 93, 127, 220, 253, 186, 178, 192, 79, 96, 253, 35, 206, 136, 0, - 39, 35, 131, 251, 197, 102, 122, 24, 95, 147, 229, 144, 109, 134, 248, 190, - 54, 134, 37, 215, 124, 157, 3, 38, 159, 17, 246, 181, 43, 44, 98, 167, - 144, 38, 79, 52, 251, 170, 143, 178, 77, 36, 149, 186, 21, 92, 8, 253, - 150, 232, 164, 30, 219, 84, 87, 147, 68, 239, 19, 168, 103, 170, 167, 235, - 106, 150, 151, 200, 28, 113, 253, 83, 103, 142, 48, 158, 131, 126, 105, 180, - 54, 114, 130, 11, 98, 124, 34, 255, 118, 100, 252, 68, 13, 66, 157, 252, - 246, 234, 186, 36, 47, 214, 24, 146, 130, 57, 11, 148, 116, 195, 164, 233, - 82, 135, 64, 119, 65, 111, 19, 191, 132, 200, 253, 167, 197, 130, 109, 176, - 68, 86, 142, 253, 139, 176, 127, 71, 110, 236, 243, 11, 232, 86, 252, 235, - 150, 77, 166, 161, 151, 161, 198, 187, 79, 120, 207, 186, 150, 235, 36, 250, - 39, 38, 75, 92, 51, 170, 209, 222, 71, 225, 84, 186, 7, 134, 250, 11, - 90, 0, 91, 104, 79, 228, 239, 25, 76, 34, 233, 96, 152, 45, 55, 105, - 217, 102, 248, 214, 246, 10, 46, 99, 180, 152, 137, 153, 249, 229, 226, 146, - 105, 9, 78, 15, 45, 198, 140, 200, 56, 22, 62, 152, 133, 13, 118, 168, - 89, 244, 161, 106, 145, 253, 6, 53, 131, 2, 108, 5, 121, 188, 135, 170, - 68, 31, 234, 18, 29, 151, 216, 87, 212, 182, 234, 103, 243, 221, 11, 43, - 196, 65, 114, 30, 253, 93, 126, 97, 74, 82, 40, 242, 209, 211, 20, 61, - 141, 169, 93, 25, 122, 87, 246, 4, 54, 157, 199, 63, 37, 75, 251, 170, - 108, 234, 119, 254, 111, 105, 48, 29, 170, 48, 113, 208, 104, 175, 154, 170, - 75, 136, 112, 173, 43, 206, 156, 193, 0, 119, 174, 188, 63, 131, 58, 167, - 65, 216, 231, 52, 252, 34, 79, 247, 36, 19, 226, 255, 43, 149, 37, 244, - 98, 252, 235, 42, 74, 231, 31, 235, 40, 57, 62, 48, 235, 254, 224, 122, - 64, 24, 200, 60, 62, 205, 187, 229, 41, 147, 218, 143, 248, 63, 63, 165, - 4, 101, 92, 72, 48, 30, 140, 43, 224, 180, 111, 92, 184, 112, 60, 214, - 155, 210, 199, 153, 208, 226, 209, 98, 252, 207, 142, 125, 210, 37, 248, 200, - 128, 126, 223, 185, 142, 229, 140, 197, 248, 192, 198, 189, 26, 222, 62, 49, - 194, 63, 244, 160, 99, 185, 92, 74, 206, 149, 11, 106, 50, 171, 18, 127, - 162, 42, 182, 56, 79, 214, 37, 239, 85, 37, 255, 168, 38, 206, 97, 59, - 184, 2, 91, 59, 118, 162, 138, 143, 67, 75, 156, 184, 130, 193, 5, 140, - 84, 147, 142, 184, 165, 194, 175, 73, 167, 245, 36, 54, 95, 123, 183, 179, - 110, 173, 217, 170, 143, 234, 179, 83, 254, 173, 233, 163, 128, 95, 13, 207, - 214, 70, 254, 127, 111, 215, 214, 121, 3, 242, 159, 9, 46, 252, 255, 185, - 131, 235, 61, 223, 135, 3, 97, 142, 108, 68, 97, 37, 120, 101, 197, 137, - 255, 142, 157, 63, 179, 209, 11, 227, 232, 145, 127, 127, 49, 132, 225, 106, - 188, 60, 188, 247, 181, 231, 98, 172, 25, 140, 229, 58, 106, 76, 0, 78, - 90, 156, 83, 52, 115, 56, 20, 55, 214, 151, 173, 245, 101, 110, 125, 105, - 176, 66, 24, 178, 0, 254, 161, 105, 114, 72, 66, 219, 98, 69, 18, 245, - 136, 232, 1, 186, 16, 192, 181, 225, 92, 49, 210, 60, 168, 209, 119, 193, - 29, 184, 161, 83, 101, 66, 184, 110, 149, 115, 70, 205, 80, 43, 122, 172, - 51, 39, 90, 247, 154, 113, 87, 222, 61, 70, 85, 178, 226, 48, 195, 189, - 142, 180, 89, 139, 188, 50, 163, 50, 161, 16, 10, 81, 52, 66, 150, 192, - 206, 120, 180, 171, 185, 224, 57, 4, 22, 1, 158, 36, 99, 70, 160, 88, - 104, 203, 118, 238, 243, 95, 122, 191, 251, 85, 248, 35, 75, 65, 250, 139, - 207, 94, 153, 30, 37, 248, 139, 81, 235, 211, 187, 239, 246, 180, 3, 99, - 63, 208, 11, 35, 32, 108, 178, 211, 158, 166, 71, 175, 160, 232, 143, 223, - 54, 226, 26, 178, 124, 35, 111, 0, 76, 252, 195, 56, 119, 94, 155, 71, - 207, 35, 11, 27, 157, 238, 53, 162, 90, 108, 204, 168, 46, 54, 203, 56, - 25, 97, 112, 45, 216, 104, 26, 122, 183, 79, 55, 112, 103, 93, 147, 183, - 109, 223, 133, 125, 186, 189, 176, 207, 29, 100, 172, 49, 93, 179, 40, 18, - 152, 58, 199, 212, 157, 237, 92, 250, 254, 174, 74, 240, 142, 78, 9, 211, - 168, 123, 228, 16, 206, 237, 115, 236, 216, 88, 227, 73, 110, 123, 90, 180, - 207, 119, 22, 107, 45, 163, 115, 170, 77, 196, 176, 73, 170, 143, 197, 85, - 224, 141, 237, 136, 76, 125, 31, 107, 110, 57, 0, 19, 41, 194, 39, 195, - 253, 193, 104, 6, 189, 114, 34, 98, 185, 160, 7, 5, 14, 209, 41, 62, - 83, 176, 4, 120, 110, 172, 209, 193, 15, 203, 98, 120, 250, 161, 250, 168, - 235, 232, 144, 234, 130, 189, 116, 233, 197, 12, 133, 106, 67, 217, 154, 61, - 71, 215, 16, 248, 49, 62, 108, 216, 32, 43, 20, 114, 244, 56, 42, 42, - 188, 114, 203, 112, 246, 201, 226, 226, 220, 197, 3, 138, 218, 254, 193, 114, - 80, 4, 43, 88, 25, 122, 76, 79, 190, 80, 224, 60, 96, 250, 156, 122, - 160, 130, 67, 46, 248, 158, 159, 113, 188, 240, 59, 241, 207, 143, 188, 140, - 243, 45, 253, 243, 76, 190, 83, 62, 194, 49, 64, 118, 235, 240, 56, 96, - 169, 92, 25, 167, 213, 212, 200, 134, 92, 207, 252, 111, 126, 22, 28, 131, - 254, 131, 67, 225, 164, 3, 107, 242, 230, 76, 5, 233, 28, 152, 181, 166, - 115, 55, 250, 78, 118, 51, 231, 194, 220, 57, 206, 39, 17, 205, 141, 99, - 128, 34, 195, 35, 52, 63, 240, 176, 60, 231, 97, 237, 221, 93, 212, 61, - 178, 206, 192, 73, 119, 195, 167, 10, 237, 249, 57, 254, 81, 156, 241, 143, - 138, 246, 55, 157, 209, 240, 164, 79, 231, 83, 229, 152, 75, 101, 188, 191, - 182, 62, 104, 50, 249, 113, 49, 56, 32, 181, 198, 105, 151, 206, 145, 143, - 75, 81, 172, 66, 109, 136, 238, 168, 79, 158, 171, 34, 43, 74, 203, 144, - 165, 184, 142, 78, 116, 183, 225, 45, 153, 142, 135, 97, 107, 118, 186, 174, - 127, 121, 208, 115, 171, 26, 81, 13, 208, 253, 144, 155, 43, 115, 7, 190, - 68, 201, 1, 14, 150, 254, 148, 190, 203, 74, 0, 254, 50, 123, 73, 253, - 52, 103, 7, 21, 226, 249, 163, 83, 157, 45, 160, 91, 182, 3, 8, 71, - 224, 9, 134, 148, 47, 28, 15, 168, 5, 98, 225, 246, 189, 15, 119, 236, - 248, 179, 156, 30, 84, 183, 108, 195, 91, 183, 32, 219, 140, 97, 2, 226, - 192, 107, 195, 248, 105, 237, 126, 173, 51, 11, 41, 170, 109, 216, 170, 193, - 74, 159, 35, 35, 144, 177, 167, 45, 90, 64, 239, 178, 115, 213, 109, 206, - 118, 20, 73, 22, 142, 105, 12, 128, 97, 173, 73, 48, 11, 11, 102, 97, - 106, 243, 28, 46, 116, 44, 226, 2, 254, 118, 119, 223, 255, 176, 89, 82, - 2, 70, 74, 224, 195, 20, 44, 229, 192, 67, 143, 85, 199, 142, 7, 26, - 0, 166, 129, 212, 165, 183, 238, 14, 78, 46, 147, 235, 196, 206, 122, 5, - 153, 56, 46, 118, 209, 87, 4, 107, 162, 158, 102, 101, 193, 216, 141, 62, - 65, 121, 228, 215, 205, 38, 198, 81, 168, 31, 81, 152, 54, 39, 155, 50, - 168, 79, 15, 5, 200, 3, 30, 157, 26, 122, 70, 126, 25, 3, 253, 15, - 207, 206, 216, 155, 194, 59, 70, 195, 6, 114, 194, 249, 231, 142, 130, 227, - 232, 177, 71, 112, 225, 152, 150, 165, 48, 246, 112, 25, 230, 22, 147, 138, - 243, 63, 37, 151, 202, 178, 155, 150, 255, 7, 109, 192, 141, 143, 225, 29, - 189, 0, 90, 227, 170, 250, 3, 164, 40, 88, 5, 166, 208, 131, 172, 55, - 120, 80, 77, 192, 176, 211, 164, 90, 118, 174, 119, 15, 254, 92, 160, 30, - 31, 37, 201, 44, 73, 182, 36, 73, 59, 241, 56, 151, 104, 201, 37, 27, - 174, 13, 142, 27, 148, 125, 164, 188, 97, 191, 214, 235, 34, 48, 121, 75, - 114, 128, 7, 69, 50, 186, 125, 162, 6, 180, 203, 69, 245, 15, 195, 94, - 15, 6, 15, 234, 177, 90, 232, 97, 138, 188, 227, 6, 117, 188, 25, 104, - 216, 128, 21, 35, 88, 83, 59, 178, 238, 201, 128, 13, 14, 91, 59, 178, - 203, 99, 93, 82, 22, 181, 24, 3, 136, 179, 127, 40, 103, 59, 97, 111, - 242, 90, 253, 190, 54, 158, 89, 167, 195, 67, 97, 161, 120, 208, 61, 225, - 248, 59, 139, 123, 205, 58, 75, 218, 9, 6, 249, 106, 93, 189, 44, 4, - 165, 30, 33, 234, 89, 133, 74, 41, 30, 18, 122, 205, 102, 108, 28, 230, - 82, 78, 48, 128, 19, 153, 7, 17, 203, 152, 59, 57, 105, 175, 75, 108, - 13, 43, 129, 199, 207, 138, 193, 178, 7, 16, 79, 21, 99, 78, 140, 62, - 41, 10, 48, 122, 136, 121, 113, 84, 180, 240, 89, 177, 0, 70, 212, 9, - 156, 42, 150, 252, 180, 127, 24, 111, 6, 238, 2, 190, 227, 146, 68, 130, - 153, 148, 149, 69, 253, 198, 154, 164, 43, 52, 124, 220, 132, 10, 131, 65, - 209, 115, 78, 54, 241, 120, 19, 189, 137, 70, 117, 142, 131, 129, 97, 174, - 144, 99, 172, 191, 92, 132, 228, 75, 249, 116, 217, 124, 49, 124, 84, 246, - 90, 186, 220, 47, 45, 93, 6, 79, 148, 206, 253, 124, 231, 144, 168, 101, - 39, 196, 97, 61, 231, 63, 80, 76, 114, 24, 124, 57, 35, 190, 14, 97, - 192, 11, 184, 60, 233, 232, 153, 158, 127, 189, 194, 200, 94, 133, 110, 75, - 133, 238, 191, 86, 97, 78, 175, 208, 60, 60, 205, 85, 52, 101, 223, 204, - 225, 171, 99, 216, 153, 157, 229, 56, 51, 200, 248, 245, 206, 96, 211, 81, - 62, 62, 63, 60, 103, 8, 213, 86, 112, 155, 178, 208, 238, 78, 98, 248, - 57, 204, 131, 70, 119, 112, 186, 54, 175, 61, 250, 233, 249, 190, 25, 48, - 150, 159, 54, 184, 66, 207, 225, 188, 70, 59, 255, 206, 216, 118, 204, 235, - 192, 0, 90, 48, 33, 213, 25, 136, 251, 192, 113, 136, 190, 132, 152, 34, - 141, 252, 194, 161, 191, 160, 1, 96, 161, 230, 73, 47, 134, 229, 51, 179, - 108, 40, 139, 30, 111, 158, 148, 97, 120, 22, 99, 12, 160, 77, 229, 84, - 155, 132, 240, 174, 85, 84, 19, 145, 77, 13, 17, 222, 129, 99, 5, 145, - 189, 10, 15, 58, 177, 179, 173, 55, 161, 243, 83, 32, 159, 128, 209, 161, - 31, 249, 242, 254, 145, 127, 41, 96, 138, 27, 142, 107, 155, 125, 189, 249, - 124, 22, 102, 52, 1, 116, 89, 52, 160, 215, 158, 223, 237, 195, 153, 40, - 239, 208, 67, 225, 198, 128, 95, 39, 145, 248, 199, 159, 231, 14, 158, 134, - 210, 146, 248, 3, 194, 4, 197, 109, 248, 143, 233, 154, 194, 216, 74, 47, - 123, 132, 130, 121, 242, 75, 250, 129, 47, 235, 15, 146, 126, 242, 203, 198, - 201, 47, 155, 76, 17, 11, 60, 167, 96, 100, 126, 239, 250, 163, 81, 243, - 210, 116, 113, 68, 44, 16, 4, 194, 137, 199, 206, 225, 157, 116, 94, 155, - 182, 181, 86, 191, 249, 97, 28, 62, 35, 135, 201, 169, 52, 203, 252, 123, - 223, 79, 173, 208, 255, 12, 183, 242, 131, 91, 234, 255, 232, 37, 197, 114, - 85, 17, 250, 207, 47, 40, 57, 139, 255, 225, 241, 195, 61, 3, 5, 100, - 51, 97, 109, 91, 135, 36, 33, 29, 130, 59, 140, 30, 109, 37, 45, 80, - 244, 224, 119, 160, 201, 230, 236, 166, 129, 174, 21, 96, 217, 172, 237, 104, - 77, 41, 108, 224, 71, 18, 182, 240, 247, 29, 206, 64, 73, 194, 168, 243, - 23, 246, 107, 114, 182, 100, 95, 139, 43, 17, 136, 72, 34, 82, 122, 207, - 94, 233, 43, 133, 50, 110, 97, 228, 147, 230, 43, 108, 38, 31, 10, 142, - 73, 228, 249, 138, 218, 192, 130, 87, 168, 11, 120, 153, 224, 57, 182, 24, - 51, 78, 208, 102, 163, 217, 98, 218, 174, 53, 40, 198, 159, 244, 21, 67, - 234, 9, 140, 225, 54, 93, 194, 202, 50, 33, 37, 117, 106, 140, 13, 35, - 232, 1, 171, 105, 205, 178, 240, 199, 165, 214, 116, 134, 246, 32, 48, 174, - 174, 217, 28, 110, 227, 211, 189, 238, 96, 12, 19, 244, 197, 66, 218, 219, - 230, 197, 237, 210, 134, 65, 110, 71, 3, 140, 31, 232, 149, 172, 49, 100, - 89, 100, 63, 85, 97, 52, 34, 44, 43, 73, 96, 49, 154, 125, 244, 70, - 225, 68, 233, 98, 230, 147, 88, 108, 86, 159, 231, 147, 216, 172, 121, 99, - 41, 217, 230, 24, 186, 97, 206, 66, 246, 25, 213, 195, 61, 162, 127, 121, - 137, 81, 104, 109, 83, 60, 90, 144, 9, 233, 236, 186, 85, 67, 111, 108, - 134, 169, 107, 225, 235, 179, 7, 25, 79, 208, 36, 220, 77, 248, 35, 23, - 46, 179, 168, 184, 220, 178, 130, 161, 191, 55, 22, 248, 28, 208, 93, 237, - 89, 65, 194, 118, 109, 35, 12, 199, 68, 239, 122, 20, 84, 157, 77, 134, - 61, 209, 41, 86, 167, 226, 97, 253, 101, 184, 128, 105, 80, 42, 78, 251, - 92, 114, 203, 146, 203, 131, 46, 121, 120, 28, 70, 36, 94, 213, 189, 224, - 187, 62, 15, 25, 138, 136, 60, 9, 94, 89, 138, 53, 164, 34, 154, 21, - 80, 32, 69, 159, 151, 133, 133, 53, 35, 144, 54, 32, 217, 198, 179, 98, - 230, 119, 151, 239, 194, 62, 223, 177, 210, 60, 198, 185, 130, 41, 134, 186, - 252, 251, 185, 125, 238, 130, 97, 116, 92, 40, 59, 157, 227, 7, 183, 74, - 47, 143, 107, 104, 81, 158, 183, 167, 225, 18, 199, 215, 16, 186, 137, 185, - 254, 74, 102, 27, 239, 46, 251, 59, 44, 113, 100, 67, 154, 149, 6, 37, - 209, 254, 14, 187, 0, 143, 35, 31, 62, 111, 232, 153, 229, 116, 242, 176, - 175, 84, 57, 237, 142, 121, 63, 164, 4, 36, 17, 96, 189, 250, 142, 228, - 227, 252, 106, 222, 39, 59, 120, 137, 23, 17, 21, 201, 1, 68, 181, 116, - 129, 208, 206, 251, 168, 226, 98, 94, 46, 230, 87, 10, 186, 25, 27, 141, - 15, 29, 18, 176, 142, 185, 21, 228, 185, 51, 217, 189, 153, 7, 189, 26, - 192, 247, 0, 251, 78, 103, 212, 27, 206, 40, 142, 200, 202, 5, 251, 21, - 206, 82, 7, 233, 30, 42, 108, 82, 237, 163, 177, 19, 3, 216, 226, 117, - 130, 206, 103, 149, 117, 96, 46, 161, 92, 13, 131, 224, 204, 165, 175, 170, - 215, 240, 205, 48, 199, 109, 46, 233, 184, 194, 123, 10, 13, 24, 23, 148, - 95, 208, 94, 156, 14, 24, 137, 96, 61, 75, 230, 173, 249, 84, 59, 22, - 119, 81, 170, 208, 65, 91, 21, 155, 158, 233, 223, 251, 220, 40, 16, 140, - 191, 114, 98, 156, 58, 54, 10, 93, 232, 167, 134, 42, 144, 28, 129, 11, - 218, 96, 220, 111, 161, 206, 35, 51, 223, 28, 181, 233, 140, 61, 106, 147, - 134, 234, 36, 167, 244, 102, 63, 192, 28, 28, 57, 196, 39, 101, 134, 62, - 84, 25, 84, 50, 130, 117, 55, 58, 201, 232, 219, 231, 128, 14, 106, 189, - 150, 206, 49, 69, 95, 94, 70, 89, 161, 93, 131, 187, 238, 176, 243, 191, - 195, 165, 179, 156, 127, 211, 129, 77, 123, 30, 72, 47, 134, 119, 2, 254, - 63, 76, 245, 32, 130, 85, 246, 116, 68, 248, 151, 128, 249, 197, 72, 103, - 95, 100, 12, 9, 106, 20, 50, 147, 125, 214, 18, 250, 39, 9, 63, 41, - 210, 254, 39, 75, 51, 202, 30, 4, 70, 91, 180, 174, 23, 87, 18, 139, - 54, 4, 217, 2, 216, 230, 94, 123, 234, 1, 24, 18, 79, 38, 48, 14, - 187, 73, 86, 99, 214, 132, 131, 102, 45, 21, 120, 168, 231, 234, 225, 39, - 94, 214, 100, 86, 1, 233, 160, 133, 222, 61, 180, 247, 251, 207, 3, 244, - 63, 207, 191, 168, 104, 152, 134, 107, 137, 152, 100, 65, 196, 115, 215, 100, - 58, 143, 92, 207, 193, 187, 93, 19, 241, 157, 99, 12, 211, 49, 111, 154, - 76, 47, 153, 8, 102, 134, 48, 232, 50, 182, 197, 57, 92, 235, 21, 197, - 227, 248, 134, 204, 56, 21, 207, 214, 175, 64, 173, 99, 36, 67, 178, 234, - 64, 194, 245, 187, 76, 172, 209, 239, 52, 188, 14, 60, 8, 1, 213, 237, - 33, 123, 0, 17, 112, 189, 87, 162, 51, 142, 107, 88, 193, 201, 4, 139, - 150, 105, 98, 177, 250, 16, 145, 91, 204, 203, 184, 244, 145, 148, 226, 12, - 150, 35, 158, 172, 42, 87, 212, 50, 42, 102, 58, 115, 216, 245, 22, 160, - 153, 70, 75, 87, 86, 53, 23, 207, 59, 235, 153, 243, 63, 223, 85, 28, - 52, 23, 253, 136, 10, 222, 201, 151, 186, 176, 76, 212, 31, 26, 151, 122, - 104, 123, 35, 202, 170, 32, 233, 110, 245, 76, 215, 227, 52, 164, 51, 251, - 53, 59, 64, 116, 169, 42, 90, 78, 64, 95, 108, 220, 91, 243, 140, 93, - 168, 6, 196, 71, 181, 149, 67, 178, 34, 36, 66, 40, 211, 122, 174, 143, - 106, 211, 38, 16, 81, 101, 116, 190, 8, 67, 15, 91, 248, 149, 167, 241, - 111, 144, 9, 118, 117, 179, 53, 69, 135, 142, 88, 223, 133, 189, 140, 142, - 155, 216, 99, 130, 197, 21, 230, 37, 245, 140, 70, 9, 209, 10, 59, 201, - 97, 205, 108, 175, 8, 34, 139, 73, 111, 228, 71, 191, 164, 95, 5, 24, - 190, 217, 160, 134, 135, 190, 194, 196, 190, 56, 31, 66, 189, 191, 152, 190, - 2, 225, 230, 193, 129, 23, 196, 129, 134, 200, 30, 205, 239, 44, 66, 65, - 120, 215, 235, 178, 17, 17, 228, 243, 176, 114, 107, 148, 22, 155, 134, 169, - 188, 86, 116, 11, 166, 139, 146, 235, 92, 3, 82, 5, 236, 47, 90, 230, - 153, 49, 5, 153, 182, 162, 110, 26, 109, 67, 53, 240, 144, 253, 159, 194, - 12, 150, 15, 134, 241, 67, 76, 167, 135, 244, 67, 180, 11, 216, 116, 10, - 143, 20, 236, 111, 56, 212, 53, 223, 22, 72, 0, 160, 244, 213, 97, 4, - 188, 19, 136, 191, 100, 20, 39, 222, 190, 194, 221, 238, 217, 245, 154, 152, - 85, 156, 222, 56, 10, 41, 45, 131, 109, 92, 207, 164, 75, 191, 243, 249, - 112, 124, 95, 104, 5, 97, 40, 229, 179, 56, 212, 246, 199, 48, 3, 245, - 125, 57, 131, 205, 228, 196, 5, 172, 50, 252, 129, 61, 228, 129, 231, 81, - 168, 164, 13, 23, 45, 35, 182, 202, 16, 35, 224, 245, 245, 133, 66, 215, - 100, 236, 149, 5, 7, 96, 174, 43, 39, 134, 108, 209, 66, 240, 96, 215, - 80, 159, 133, 147, 227, 83, 22, 151, 2, 175, 210, 52, 86, 98, 232, 93, - 249, 243, 156, 169, 76, 105, 14, 24, 10, 114, 210, 206, 214, 159, 129, 254, - 144, 104, 29, 14, 4, 106, 82, 56, 80, 13, 213, 28, 24, 35, 163, 111, - 172, 24, 0, 8, 151, 238, 94, 75, 211, 143, 87, 170, 181, 126, 86, 133, - 97, 116, 1, 135, 251, 112, 120, 122, 182, 232, 134, 83, 166, 136, 119, 48, - 171, 205, 17, 31, 97, 32, 148, 44, 19, 175, 155, 9, 26, 159, 105, 55, - 26, 27, 202, 105, 153, 26, 231, 209, 52, 217, 78, 238, 61, 225, 109, 63, - 117, 96, 31, 190, 160, 247, 52, 23, 122, 229, 121, 135, 55, 18, 158, 59, - 40, 108, 21, 67, 51, 148, 197, 246, 209, 118, 156, 117, 159, 103, 240, 29, - 245, 18, 15, 114, 204, 88, 205, 52, 84, 231, 71, 13, 56, 204, 97, 220, - 236, 116, 61, 70, 70, 199, 195, 146, 17, 47, 246, 160, 228, 174, 65, 246, - 23, 233, 126, 115, 39, 49, 1, 187, 187, 229, 113, 149, 0, 213, 119, 102, - 167, 245, 114, 38, 192, 127, 233, 214, 122, 46, 252, 118, 70, 100, 182, 74, - 71, 22, 108, 235, 41, 195, 4, 30, 221, 116, 84, 64, 229, 99, 3, 67, - 218, 14, 58, 184, 175, 68, 75, 160, 191, 29, 111, 22, 225, 56, 151, 169, - 172, 9, 221, 132, 1, 129, 209, 147, 131, 62, 58, 134, 200, 218, 218, 80, - 213, 125, 254, 116, 126, 241, 22, 241, 110, 205, 177, 218, 185, 86, 46, 207, - 142, 175, 72, 108, 141, 170, 37, 71, 158, 250, 242, 162, 37, 197, 249, 69, - 214, 253, 15, 23, 33, 182, 68, 93, 50, 156, 32, 24, 124, 93, 242, 252, - 201, 198, 203, 177, 227, 210, 130, 183, 195, 25, 48, 59, 246, 1, 146, 88, - 161, 72, 2, 213, 56, 41, 98, 58, 62, 156, 140, 59, 207, 9, 76, 102, - 186, 191, 152, 206, 70, 36, 9, 147, 246, 101, 16, 230, 182, 176, 50, 169, - 77, 101, 195, 163, 232, 131, 167, 227, 7, 214, 88, 236, 39, 75, 81, 39, - 238, 82, 81, 198, 107, 213, 240, 171, 199, 57, 116, 14, 225, 6, 234, 180, - 15, 41, 64, 73, 232, 125, 165, 132, 248, 202, 173, 241, 165, 251, 157, 2, - 18, 40, 116, 137, 130, 117, 189, 215, 168, 184, 223, 158, 211, 94, 118, 25, - 69, 191, 42, 14, 215, 10, 87, 62, 33, 95, 99, 255, 213, 104, 155, 12, - 141, 13, 82, 59, 220, 130, 46, 218, 131, 181, 33, 103, 216, 106, 41, 146, - 163, 2, 2, 129, 66, 120, 127, 168, 13, 117, 206, 174, 5, 141, 216, 14, - 198, 136, 43, 83, 146, 206, 234, 63, 93, 118, 60, 109, 174, 165, 203, 224, - 159, 216, 40, 155, 103, 104, 146, 127, 55, 134, 122, 103, 219, 192, 213, 109, - 31, 220, 207, 209, 133, 203, 192, 23, 28, 212, 107, 61, 200, 217, 70, 164, - 236, 221, 221, 53, 224, 77, 30, 129, 231, 10, 251, 97, 28, 110, 52, 175, - 102, 83, 86, 4, 240, 102, 224, 155, 131, 93, 207, 109, 252, 232, 154, 201, - 15, 208, 131, 65, 248, 203, 58, 49, 115, 173, 49, 199, 32, 121, 71, 106, - 49, 240, 193, 5, 95, 92, 240, 201, 188, 59, 234, 153, 255, 205, 175, 143, - 0, 122, 1, 64, 47, 112, 208, 79, 95, 36, 15, 46, 120, 197, 89, 139, - 95, 242, 6, 86, 117, 24, 166, 154, 42, 140, 71, 51, 50, 12, 156, 241, - 75, 163, 94, 106, 182, 25, 212, 71, 72, 165, 69, 208, 54, 205, 98, 171, - 70, 145, 161, 79, 92, 36, 127, 254, 246, 101, 27, 180, 102, 179, 90, 7, - 15, 200, 6, 32, 173, 57, 225, 53, 114, 218, 131, 15, 24, 136, 3, 63, - 205, 7, 99, 149, 253, 40, 236, 71, 134, 159, 87, 203, 84, 41, 136, 159, - 152, 230, 3, 224, 36, 225, 140, 107, 43, 216, 89, 77, 130, 222, 200, 222, - 160, 157, 103, 176, 11, 152, 195, 113, 198, 24, 38, 167, 179, 85, 44, 217, - 96, 42, 145, 52, 67, 201, 209, 138, 249, 134, 56, 70, 129, 103, 118, 94, - 143, 41, 125, 253, 66, 75, 150, 227, 48, 182, 98, 249, 75, 150, 11, 162, - 136, 215, 129, 38, 97, 251, 134, 115, 39, 164, 33, 138, 41, 111, 218, 236, - 189, 173, 119, 87, 30, 201, 250, 17, 95, 119, 108, 236, 152, 239, 62, 202, - 228, 146, 189, 14, 183, 172, 34, 21, 73, 227, 105, 124, 218, 28, 124, 146, - 225, 246, 246, 231, 185, 29, 51, 93, 168, 34, 254, 234, 49, 145, 24, 162, - 193, 185, 113, 99, 178, 236, 248, 138, 70, 118, 88, 130, 73, 11, 153, 229, - 136, 249, 206, 247, 45, 229, 69, 122, 209, 58, 115, 239, 124, 142, 208, 89, - 158, 110, 14, 241, 126, 6, 64, 92, 156, 81, 147, 103, 48, 38, 178, 87, - 92, 156, 187, 188, 78, 175, 227, 108, 231, 252, 195, 102, 249, 172, 28, 125, - 230, 231, 165, 141, 78, 102, 226, 50, 175, 46, 217, 58, 2, 226, 18, 227, - 0, 177, 230, 28, 23, 4, 205, 206, 118, 174, 0, 193, 160, 122, 60, 206, - 128, 79, 130, 107, 164, 71, 246, 33, 1, 225, 131, 4, 159, 207, 235, 247, - 57, 225, 79, 16, 174, 148, 170, 47, 240, 253, 15, 155, 121, 74, 146, 146, - 32, 165, 240, 103, 246, 63, 72, 193, 187, 177, 74, 82, 125, 143, 211, 235, - 244, 57, 12, 153, 204, 74, 31, 213, 255, 132, 219, 29, 55, 65, 32, 192, - 254, 193, 6, 49, 20, 162, 223, 127, 254, 83, 79, 62, 87, 24, 144, 14, - 248, 164, 232, 240, 238, 141, 157, 6, 55, 103, 138, 84, 245, 134, 204, 58, - 26, 58, 28, 26, 100, 232, 209, 39, 184, 84, 235, 67, 67, 3, 183, 247, - 81, 177, 126, 220, 179, 62, 113, 113, 251, 161, 211, 0, 194, 130, 189, 180, - 108, 182, 131, 189, 178, 26, 13, 191, 232, 251, 233, 227, 124, 25, 61, 31, - 109, 40, 139, 154, 2, 23, 203, 90, 84, 94, 127, 9, 239, 211, 78, 50, - 183, 17, 171, 158, 110, 190, 151, 58, 86, 129, 78, 177, 39, 238, 161, 145, - 163, 29, 60, 28, 245, 117, 202, 147, 174, 130, 140, 15, 169, 119, 225, 176, - 19, 5, 52, 84, 69, 236, 135, 29, 249, 187, 122, 97, 69, 6, 123, 147, - 13, 167, 209, 108, 140, 254, 69, 128, 178, 197, 235, 168, 15, 213, 251, 167, - 227, 22, 94, 100, 47, 3, 140, 169, 47, 219, 94, 15, 138, 160, 16, 67, - 118, 105, 130, 56, 68, 21, 89, 10, 49, 66, 207, 240, 162, 178, 171, 43, - 173, 28, 59, 187, 229, 213, 152, 130, 46, 15, 91, 102, 173, 74, 130, 186, - 80, 41, 137, 254, 145, 156, 132, 91, 18, 122, 129, 192, 133, 127, 1, 254, - 207, 244, 148, 190, 151, 202, 191, 180, 166, 64, 137, 32, 235, 69, 216, 3, - 179, 217, 106, 83, 16, 37, 143, 176, 15, 62, 201, 73, 96, 55, 238, 227, - 122, 249, 8, 20, 67, 105, 70, 23, 80, 40, 10, 251, 199, 108, 186, 142, - 62, 235, 64, 51, 47, 83, 63, 5, 10, 10, 115, 78, 192, 162, 0, 44, - 106, 16, 40, 252, 32, 227, 225, 156, 125, 57, 95, 127, 69, 12, 138, 248, - 253, 203, 249, 134, 158, 207, 232, 54, 2, 120, 6, 255, 25, 183, 88, 238, - 115, 220, 176, 133, 220, 135, 131, 77, 155, 237, 136, 39, 33, 75, 56, 247, - 1, 244, 252, 160, 207, 190, 140, 74, 119, 112, 173, 81, 24, 47, 194, 224, - 66, 233, 114, 43, 107, 189, 42, 192, 75, 80, 168, 210, 254, 52, 66, 51, - 62, 248, 23, 228, 191, 150, 201, 242, 237, 3, 166, 187, 123, 66, 221, 127, - 192, 142, 92, 1, 159, 143, 236, 225, 160, 5, 80, 2, 6, 255, 223, 131, - 193, 3, 48, 236, 195, 100, 184, 95, 210, 113, 143, 245, 179, 151, 131, 172, - 15, 158, 21, 100, 153, 131, 28, 252, 20, 228, 159, 1, 202, 247, 73, 43, - 70, 11, 127, 169, 21, 157, 6, 93, 213, 150, 173, 147, 86, 58, 204, 63, - 35, 125, 54, 132, 223, 236, 237, 223, 154, 254, 76, 154, 96, 255, 21, 117, - 236, 135, 86, 123, 46, 16, 17, 42, 240, 208, 195, 156, 22, 109, 78, 71, - 99, 161, 14, 215, 22, 83, 184, 192, 213, 176, 49, 152, 241, 201, 34, 92, - 50, 129, 134, 90, 31, 27, 243, 252, 79, 25, 1, 81, 161, 152, 169, 236, - 188, 210, 230, 48, 209, 24, 162, 111, 6, 205, 182, 134, 2, 222, 198, 254, - 103, 133, 30, 166, 243, 1, 114, 196, 128, 2, 127, 30, 152, 9, 89, 87, - 46, 249, 82, 242, 185, 22, 23, 164, 74, 182, 129, 119, 233, 82, 209, 223, - 109, 184, 200, 90, 253, 58, 140, 48, 15, 132, 136, 178, 124, 252, 130, 206, - 249, 217, 131, 226, 245, 217, 100, 221, 198, 102, 65, 236, 113, 139, 201, 13, - 241, 39, 208, 72, 28, 141, 40, 164, 23, 129, 135, 110, 80, 154, 107, 100, - 184, 218, 56, 163, 22, 221, 164, 241, 167, 53, 156, 222, 168, 51, 141, 94, - 240, 0, 199, 141, 91, 175, 237, 22, 44, 226, 119, 210, 19, 246, 35, 114, - 247, 82, 113, 230, 34, 77, 189, 88, 185, 13, 15, 15, 164, 140, 171, 243, - 114, 56, 126, 101, 231, 98, 208, 119, 204, 181, 101, 49, 255, 120, 160, 64, - 128, 140, 56, 21, 70, 160, 43, 98, 26, 145, 239, 69, 116, 8, 167, 72, - 223, 3, 168, 179, 125, 240, 235, 96, 133, 60, 36, 217, 150, 120, 143, 41, - 114, 161, 94, 151, 98, 40, 105, 203, 58, 243, 132, 63, 158, 188, 59, 176, - 77, 85, 166, 77, 133, 81, 171, 86, 104, 177, 217, 90, 146, 36, 143, 164, - 218, 164, 233, 192, 194, 198, 6, 156, 239, 126, 81, 189, 208, 158, 125, 47, - 59, 38, 97, 70, 225, 199, 187, 69, 23, 192, 118, 78, 7, 32, 201, 62, - 12, 209, 7, 41, 64, 225, 254, 130, 77, 173, 24, 122, 173, 252, 52, 69, - 46, 177, 122, 233, 181, 73, 2, 70, 192, 90, 9, 151, 164, 189, 240, 110, - 39, 199, 52, 40, 96, 134, 90, 81, 145, 96, 70, 74, 13, 151, 30, 97, - 54, 163, 135, 128, 208, 134, 95, 212, 139, 192, 171, 187, 4, 119, 119, 188, - 39, 137, 141, 209, 112, 57, 234, 47, 81, 122, 162, 190, 144, 187, 0, 20, - 58, 147, 142, 244, 165, 80, 103, 132, 11, 90, 99, 107, 53, 138, 213, 129, - 130, 246, 213, 133, 125, 101, 232, 50, 188, 161, 46, 195, 37, 18, 216, 20, - 71, 28, 65, 210, 187, 246, 204, 73, 84, 47, 82, 87, 98, 255, 217, 251, - 194, 188, 194, 226, 144, 15, 235, 56, 114, 71, 190, 252, 28, 76, 177, 241, - 220, 62, 172, 59, 225, 159, 195, 114, 238, 40, 47, 182, 115, 54, 82, 239, - 240, 5, 189, 253, 49, 143, 60, 152, 149, 139, 120, 40, 216, 8, 58, 248, - 243, 92, 64, 42, 247, 233, 32, 152, 90, 18, 2, 106, 89, 0, 133, 166, - 205, 91, 51, 174, 25, 192, 60, 88, 90, 52, 22, 96, 61, 145, 106, 8, - 31, 80, 246, 195, 244, 71, 222, 113, 201, 6, 47, 244, 0, 153, 24, 33, - 215, 102, 85, 100, 96, 140, 46, 212, 181, 115, 50, 53, 56, 213, 39, 49, - 37, 56, 167, 253, 159, 23, 120, 103, 179, 106, 77, 160, 112, 75, 68, 51, - 39, 220, 113, 116, 58, 251, 188, 200, 142, 212, 153, 220, 182, 246, 120, 22, - 178, 191, 187, 224, 135, 7, 151, 134, 39, 180, 125, 69, 89, 0, 62, 159, - 9, 248, 7, 46, 48, 232, 177, 18, 21, 3, 124, 56, 11, 151, 204, 52, - 233, 242, 115, 115, 167, 35, 62, 225, 143, 204, 158, 222, 141, 189, 193, 119, - 134, 237, 131, 2, 177, 221, 158, 187, 84, 109, 246, 218, 198, 232, 228, 244, - 27, 218, 35, 183, 185, 163, 40, 58, 58, 47, 186, 238, 21, 166, 47, 119, - 128, 44, 186, 186, 29, 119, 123, 133, 92, 235, 21, 126, 220, 145, 108, 147, - 93, 89, 240, 19, 213, 71, 91, 138, 213, 124, 118, 198, 205, 126, 13, 118, - 239, 161, 221, 23, 94, 210, 241, 226, 198, 217, 113, 18, 137, 33, 206, 223, - 23, 184, 152, 191, 243, 31, 63, 33, 140, 218, 179, 151, 7, 113, 103, 59, - 229, 29, 202, 44, 12, 229, 83, 90, 205, 125, 150, 5, 157, 5, 72, 76, - 134, 75, 158, 190, 232, 77, 229, 170, 42, 46, 146, 56, 138, 20, 140, 212, - 194, 133, 38, 111, 159, 107, 67, 229, 220, 254, 5, 5, 40, 100, 94, 3, - 227, 99, 191, 98, 234, 127, 52, 225, 244, 166, 236, 174, 52, 244, 88, 143, - 223, 97, 92, 208, 145, 69, 64, 18, 223, 45, 105, 176, 186, 216, 35, 73, - 80, 174, 94, 12, 225, 13, 45, 154, 47, 196, 189, 212, 152, 15, 87, 26, - 191, 26, 18, 40, 164, 128, 132, 124, 0, 238, 213, 243, 47, 243, 237, 160, - 224, 180, 143, 46, 167, 120, 80, 229, 235, 144, 116, 138, 130, 106, 163, 23, - 165, 90, 95, 160, 236, 58, 17, 245, 161, 3, 37, 61, 56, 59, 140, 28, - 249, 69, 210, 27, 105, 116, 91, 141, 30, 210, 26, 50, 126, 34, 61, 214, - 127, 103, 250, 43, 182, 215, 233, 31, 170, 145, 252, 159, 176, 145, 230, 148, - 14, 198, 64, 70, 156, 141, 116, 8, 163, 69, 84, 225, 153, 118, 45, 156, - 144, 1, 143, 19, 255, 29, 159, 189, 250, 128, 150, 217, 128, 218, 152, 11, - 23, 84, 193, 219, 142, 70, 3, 248, 93, 55, 66, 251, 234, 82, 194, 6, - 83, 186, 148, 210, 165, 20, 60, 245, 80, 79, 240, 82, 23, 207, 147, 102, - 221, 51, 44, 25, 167, 125, 221, 0, 250, 169, 193, 176, 47, 122, 12, 185, - 168, 183, 58, 128, 162, 114, 66, 8, 9, 216, 243, 0, 217, 211, 186, 206, - 236, 172, 221, 51, 135, 195, 125, 14, 148, 153, 10, 68, 150, 164, 208, 55, - 248, 132, 144, 192, 151, 239, 66, 36, 244, 12, 199, 196, 11, 138, 48, 132, - 228, 249, 121, 238, 226, 252, 121, 237, 220, 188, 184, 66, 17, 135, 67, 12, - 69, 176, 21, 135, 222, 5, 50, 255, 150, 100, 27, 149, 166, 23, 38, 0, - 130, 125, 106, 112, 174, 236, 178, 240, 67, 180, 174, 18, 138, 86, 127, 14, - 161, 235, 248, 156, 240, 63, 226, 0, 142, 48, 127, 22, 23, 144, 162, 3, - 32, 18, 131, 165, 99, 123, 125, 237, 182, 250, 227, 87, 64, 42, 112, 49, - 234, 44, 180, 215, 182, 214, 7, 74, 235, 117, 54, 90, 144, 75, 53, 139, - 67, 51, 137, 121, 49, 227, 30, 146, 209, 187, 120, 127, 212, 168, 245, 225, - 196, 123, 29, 215, 230, 221, 215, 105, 99, 199, 162, 61, 216, 95, 151, 76, - 27, 244, 18, 183, 27, 177, 140, 41, 167, 48, 208, 31, 78, 52, 100, 39, - 135, 46, 198, 222, 230, 168, 123, 129, 50, 24, 47, 163, 174, 219, 232, 214, - 9, 90, 59, 163, 7, 216, 176, 122, 179, 103, 110, 214, 238, 5, 181, 119, - 182, 51, 152, 131, 236, 64, 163, 236, 164, 159, 7, 11, 207, 116, 71, 118, - 237, 100, 95, 118, 228, 225, 6, 31, 145, 152, 217, 2, 182, 126, 94, 185, - 2, 206, 149, 11, 40, 64, 1, 197, 46, 239, 243, 157, 30, 17, 235, 93, - 155, 1, 198, 59, 183, 67, 178, 30, 215, 1, 30, 175, 140, 14, 239, 96, - 84, 225, 172, 159, 214, 86, 191, 81, 141, 206, 69, 163, 91, 155, 234, 190, - 67, 9, 197, 51, 183, 131, 54, 93, 2, 14, 109, 119, 231, 243, 241, 236, - 55, 183, 27, 129, 191, 108, 45, 220, 167, 6, 241, 27, 16, 11, 14, 27, - 82, 151, 175, 39, 199, 78, 247, 102, 200, 117, 251, 40, 167, 38, 52, 180, - 65, 103, 251, 155, 101, 126, 78, 148, 181, 250, 138, 6, 96, 222, 221, 124, - 88, 49, 40, 2, 58, 246, 161, 69, 49, 158, 146, 243, 19, 192, 234, 176, - 74, 22, 64, 86, 217, 205, 36, 173, 57, 239, 254, 254, 124, 152, 226, 180, - 36, 116, 91, 120, 201, 124, 249, 237, 153, 251, 79, 123, 217, 177, 74, 107, - 83, 32, 152, 91, 253, 87, 20, 110, 245, 107, 99, 168, 186, 54, 30, 193, - 144, 202, 103, 78, 187, 74, 196, 25, 242, 214, 254, 132, 191, 46, 217, 225, - 68, 6, 186, 5, 22, 200, 77, 78, 180, 5, 83, 131, 1, 49, 195, 0, - 189, 12, 2, 181, 31, 166, 188, 196, 146, 36, 159, 126, 4, 55, 172, 29, - 26, 190, 65, 107, 218, 105, 177, 143, 116, 182, 147, 203, 197, 231, 197, 16, - 127, 155, 47, 103, 59, 75, 89, 242, 36, 242, 89, 89, 22, 39, 186, 63, - 238, 214, 246, 202, 241, 243, 240, 211, 162, 60, 15, 94, 141, 246, 202, 2, - 241, 252, 105, 57, 248, 142, 253, 229, 101, 208, 49, 239, 94, 63, 77, 53, - 145, 62, 106, 218, 218, 244, 163, 25, 40, 211, 35, 248, 118, 4, 255, 254, - 39, 22, 158, 12, 26, 217, 79, 134, 132, 157, 109, 56, 64, 15, 62, 131, - 214, 57, 134, 196, 198, 140, 128, 63, 41, 254, 137, 195, 201, 107, 132, 4, - 254, 4, 105, 80, 6, 222, 225, 239, 25, 114, 175, 13, 165, 179, 125, 176, - 249, 16, 31, 130, 77, 158, 24, 247, 32, 192, 148, 157, 240, 121, 119, 126, - 0, 246, 25, 5, 166, 63, 227, 176, 99, 39, 254, 50, 216, 230, 12, 255, - 44, 228, 127, 113, 168, 247, 97, 62, 26, 111, 236, 196, 79, 1, 204, 150, - 213, 127, 23, 216, 79, 135, 255, 167, 129, 62, 26, 109, 174, 93, 129, 155, - 31, 53, 95, 244, 55, 229, 140, 44, 73, 15, 250, 100, 221, 16, 58, 63, - 15, 121, 48, 230, 241, 129, 205, 73, 161, 83, 27, 232, 114, 127, 199, 114, - 48, 62, 202, 187, 191, 69, 1, 210, 143, 50, 154, 123, 146, 57, 195, 229, - 213, 94, 145, 167, 106, 20, 75, 62, 127, 195, 249, 145, 40, 58, 16, 100, - 252, 182, 239, 141, 208, 195, 100, 25, 82, 136, 75, 64, 209, 231, 46, 140, - 48, 92, 92, 95, 209, 133, 46, 221, 211, 209, 231, 30, 243, 49, 104, 219, - 191, 138, 244, 13, 51, 233, 165, 141, 79, 219, 9, 196, 33, 191, 156, 236, - 249, 135, 153, 143, 186, 254, 97, 78, 179, 239, 243, 209, 107, 141, 140, 215, - 241, 207, 30, 196, 134, 201, 147, 253, 125, 241, 135, 128, 67, 65, 236, 21, - 155, 238, 96, 20, 65, 99, 102, 78, 146, 13, 232, 124, 32, 71, 104, 201, - 56, 247, 244, 241, 245, 97, 229, 46, 228, 45, 171, 98, 138, 173, 73, 102, - 115, 71, 112, 178, 115, 235, 191, 206, 108, 179, 249, 20, 104, 195, 231, 51, - 56, 234, 134, 112, 190, 157, 189, 124, 71, 167, 14, 179, 185, 48, 99, 95, - 144, 198, 62, 135, 71, 199, 119, 91, 175, 69, 89, 191, 217, 229, 243, 111, - 102, 54, 150, 74, 217, 224, 17, 178, 1, 137, 14, 9, 75, 114, 96, 138, - 149, 156, 67, 218, 24, 82, 38, 240, 175, 13, 132, 59, 214, 230, 100, 89, - 199, 112, 255, 249, 253, 220, 54, 17, 67, 88, 13, 20, 181, 102, 249, 230, - 112, 126, 131, 30, 76, 32, 31, 22, 157, 98, 222, 233, 111, 248, 233, 25, - 171, 133, 9, 70, 239, 115, 142, 111, 191, 179, 183, 223, 224, 80, 252, 110, - 195, 204, 152, 177, 49, 26, 111, 206, 1, 18, 39, 102, 31, 11, 34, 193, - 249, 226, 156, 192, 21, 105, 12, 255, 240, 205, 241, 219, 121, 179, 213, 102, - 61, 122, 71, 145, 192, 142, 245, 138, 23, 132, 111, 78, 234, 21, 60, 56, - 28, 172, 95, 103, 255, 197, 207, 152, 113, 95, 155, 155, 39, 175, 126, 171, - 211, 102, 36, 180, 38, 215, 182, 14, 36, 135, 236, 10, 154, 43, 209, 195, - 21, 106, 188, 226, 211, 187, 23, 190, 146, 253, 34, 81, 146, 103, 24, 162, - 102, 88, 27, 178, 24, 53, 248, 112, 102, 3, 164, 113, 212, 132, 157, 69, - 11, 59, 67, 175, 122, 131, 209, 146, 5, 94, 249, 162, 205, 160, 196, 185, - 93, 229, 212, 151, 254, 142, 22, 49, 176, 164, 214, 136, 75, 48, 14, 175, - 89, 230, 247, 198, 98, 126, 254, 12, 228, 132, 221, 131, 116, 57, 46, 156, - 223, 158, 189, 168, 243, 10, 84, 200, 120, 229, 28, 119, 117, 76, 102, 210, - 56, 187, 35, 36, 137, 97, 8, 180, 65, 107, 180, 64, 195, 33, 177, 143, - 142, 70, 251, 27, 61, 73, 216, 135, 221, 74, 249, 232, 57, 56, 145, 133, - 205, 240, 36, 163, 167, 150, 170, 101, 83, 241, 210, 110, 38, 51, 244, 241, - 5, 232, 109, 161, 119, 201, 156, 105, 146, 55, 80, 97, 58, 85, 96, 151, - 64, 31, 236, 227, 46, 233, 159, 77, 129, 116, 37, 86, 215, 127, 72, 206, - 213, 127, 224, 1, 13, 47, 93, 120, 233, 194, 203, 203, 206, 216, 29, 38, - 35, 215, 58, 104, 12, 229, 62, 219, 41, 9, 255, 110, 94, 224, 254, 131, - 247, 33, 140, 144, 167, 123, 132, 85, 66, 33, 93, 97, 9, 30, 213, 157, - 77, 54, 204, 37, 191, 97, 124, 63, 44, 247, 251, 57, 101, 131, 245, 70, - 121, 152, 6, 185, 197, 176, 82, 120, 67, 42, 6, 144, 129, 85, 243, 79, - 119, 71, 8, 37, 20, 179, 1, 207, 206, 166, 87, 15, 13, 172, 89, 3, - 107, 214, 128, 194, 27, 240, 252, 114, 3, 94, 148, 237, 27, 57, 8, 102, - 203, 87, 159, 229, 43, 53, 103, 249, 230, 223, 43, 249, 78, 69, 93, 166, - 47, 69, 200, 17, 176, 228, 160, 239, 107, 215, 202, 250, 61, 168, 91, 247, - 96, 81, 156, 82, 126, 237, 163, 247, 235, 80, 23, 147, 46, 185, 219, 112, - 206, 239, 254, 202, 64, 220, 155, 63, 98, 195, 19, 154, 101, 142, 106, 187, - 46, 86, 225, 113, 38, 212, 206, 53, 124, 192, 211, 196, 72, 22, 16, 214, - 7, 32, 172, 79, 128, 192, 150, 132, 238, 183, 214, 178, 132, 24, 0, 239, - 43, 23, 171, 233, 100, 150, 26, 231, 90, 153, 205, 203, 39, 23, 205, 55, - 225, 196, 68, 127, 51, 125, 101, 89, 167, 119, 61, 210, 147, 109, 63, 152, - 105, 89, 217, 111, 236, 234, 239, 111, 12, 58, 71, 238, 8, 155, 26, 42, - 87, 177, 75, 34, 42, 62, 50, 175, 51, 94, 167, 223, 25, 116, 202, 80, - 145, 130, 26, 232, 26, 169, 68, 144, 203, 25, 73, 159, 85, 115, 130, 165, - 75, 191, 23, 157, 217, 74, 236, 127, 116, 161, 249, 65, 94, 158, 53, 198, - 163, 94, 155, 136, 207, 166, 51, 40, 199, 161, 189, 61, 253, 253, 121, 44, - 62, 187, 100, 148, 57, 188, 56, 225, 209, 124, 194, 7, 249, 229, 197, 112, - 160, 130, 198, 32, 172, 18, 146, 96, 32, 48, 167, 191, 236, 5, 178, 249, - 81, 179, 70, 171, 122, 163, 127, 67, 155, 38, 191, 64, 31, 122, 197, 137, - 209, 101, 2, 36, 45, 182, 142, 189, 194, 198, 158, 65, 198, 70, 149, 175, - 236, 15, 199, 254, 227, 188, 251, 99, 15, 235, 237, 75, 40, 104, 198, 115, - 224, 243, 176, 251, 193, 136, 160, 236, 135, 70, 2, 253, 132, 232, 79, 112, - 163, 253, 151, 78, 132, 217, 170, 209, 232, 223, 210, 38, 155, 8, 100, 214, - 72, 130, 136, 170, 229, 55, 237, 121, 107, 122, 198, 110, 231, 220, 223, 10, - 243, 126, 28, 70, 149, 144, 214, 254, 23, 27, 134, 55, 104, 160, 164, 90, - 18, 182, 92, 192, 199, 70, 200, 137, 199, 208, 14, 18, 17, 221, 200, 123, - 137, 123, 211, 142, 42, 98, 126, 156, 118, 244, 21, 50, 93, 34, 226, 225, - 78, 159, 245, 157, 173, 10, 134, 83, 33, 82, 53, 215, 93, 228, 237, 57, - 129, 54, 125, 99, 195, 215, 51, 70, 247, 53, 100, 160, 156, 232, 142, 181, - 62, 187, 94, 137, 138, 78, 15, 54, 20, 61, 125, 115, 118, 221, 197, 116, - 100, 58, 157, 217, 97, 185, 157, 57, 27, 138, 179, 33, 195, 255, 255, 241, - 143, 134, 226, 56, 211, 79, 6, 23, 144, 34, 92, 0, 129, 24, 228, 82, - 95, 188, 46, 245, 84, 99, 87, 112, 156, 187, 86, 46, 117, 175, 65, 160, - 175, 100, 249, 247, 115, 222, 238, 21, 28, 242, 174, 174, 75, 133, 3, 209, - 2, 137, 227, 103, 64, 81, 225, 148, 122, 198, 22, 84, 215, 202, 105, 32, - 46, 218, 50, 191, 43, 191, 117, 233, 67, 247, 101, 119, 132, 237, 184, 32, - 130, 81, 223, 139, 97, 131, 115, 238, 247, 73, 33, 206, 175, 1, 34, 209, - 66, 216, 233, 84, 160, 28, 98, 225, 10, 49, 8, 128, 46, 36, 80, 66, - 42, 201, 8, 24, 225, 232, 193, 24, 201, 186, 196, 192, 18, 63, 144, 200, - 31, 27, 208, 170, 161, 191, 202, 136, 178, 191, 183, 181, 57, 211, 28, 248, - 67, 39, 154, 156, 58, 193, 228, 228, 196, 18, 42, 122, 194, 250, 130, 118, - 86, 122, 200, 63, 59, 188, 56, 92, 129, 29, 7, 136, 81, 96, 144, 6, - 147, 169, 50, 31, 237, 220, 219, 61, 166, 145, 99, 48, 37, 64, 92, 62, - 249, 59, 156, 133, 127, 178, 191, 210, 119, 217, 129, 66, 100, 162, 193, 48, - 133, 68, 196, 222, 239, 60, 133, 236, 232, 164, 75, 159, 215, 226, 110, 254, - 242, 18, 253, 108, 82, 100, 53, 220, 39, 108, 131, 225, 254, 66, 94, 25, - 113, 154, 117, 147, 34, 237, 200, 161, 57, 197, 248, 35, 167, 78, 18, 137, - 48, 173, 134, 108, 92, 228, 143, 183, 171, 149, 211, 236, 226, 10, 250, 232, - 216, 25, 225, 234, 100, 207, 222, 177, 110, 51, 120, 141, 54, 157, 215, 168, - 67, 163, 114, 104, 60, 31, 65, 195, 20, 226, 132, 6, 178, 26, 49, 59, - 201, 143, 103, 175, 173, 233, 52, 244, 126, 134, 91, 255, 28, 125, 42, 135, - 66, 223, 46, 46, 46, 132, 111, 103, 6, 227, 213, 206, 50, 161, 159, 231, - 179, 2, 172, 127, 158, 21, 255, 167, 162, 125, 10, 221, 52, 225, 206, 130, - 129, 35, 206, 27, 144, 1, 210, 132, 198, 213, 202, 41, 136, 98, 195, 201, - 178, 55, 14, 179, 135, 66, 133, 223, 41, 228, 192, 57, 94, 119, 32, 247, - 239, 84, 92, 178, 150, 196, 21, 65, 165, 255, 3, 16, 78, 195, 165, 240, - 58, 188, 188, 10, 199, 21, 220, 189, 246, 235, 104, 252, 198, 185, 0, 246, - 181, 32, 34, 59, 217, 190, 22, 101, 70, 27, 9, 91, 146, 96, 192, 135, - 89, 151, 201, 50, 112, 118, 4, 221, 99, 23, 121, 9, 226, 225, 240, 56, - 15, 124, 239, 34, 114, 245, 66, 253, 123, 95, 93, 211, 36, 145, 215, 107, - 29, 97, 72, 132, 48, 48, 249, 204, 37, 127, 183, 233, 169, 136, 43, 26, - 146, 91, 177, 140, 76, 3, 251, 119, 29, 130, 111, 78, 193, 229, 250, 11, - 93, 132, 146, 191, 255, 108, 109, 188, 46, 249, 179, 186, 26, 210, 111, 200, - 180, 255, 104, 172, 24, 219, 220, 68, 54, 64, 207, 30, 175, 193, 26, 133, - 123, 216, 208, 157, 102, 255, 46, 112, 120, 227, 97, 204, 5, 98, 130, 16, - 122, 26, 142, 142, 113, 211, 197, 217, 9, 204, 117, 134, 107, 251, 44, 61, - 18, 244, 4, 67, 40, 121, 6, 75, 202, 118, 234, 110, 247, 219, 135, 213, - 60, 242, 55, 253, 142, 167, 215, 176, 170, 77, 49, 182, 205, 231, 53, 232, - 133, 121, 230, 223, 176, 180, 19, 161, 118, 42, 172, 22, 18, 170, 254, 92, - 29, 148, 213, 90, 131, 68, 185, 9, 35, 235, 18, 8, 206, 98, 51, 36, - 18, 87, 118, 121, 119, 162, 157, 51, 178, 154, 103, 226, 5, 97, 218, 154, - 44, 52, 228, 140, 192, 234, 237, 183, 106, 176, 24, 245, 202, 46, 0, 207, - 159, 49, 23, 33, 112, 201, 63, 219, 157, 93, 232, 214, 244, 241, 111, 104, - 105, 79, 92, 253, 213, 104, 218, 187, 252, 99, 248, 199, 240, 236, 15, 219, - 217, 161, 128, 164, 57, 90, 13, 251, 163, 90, 243, 114, 214, 157, 15, 250, - 103, 182, 133, 192, 227, 42, 44, 4, 178, 104, 65, 208, 116, 82, 194, 100, - 255, 28, 49, 62, 7, 39, 216, 158, 182, 15, 216, 158, 159, 51, 209, 117, - 90, 203, 254, 110, 52, 203, 82, 254, 16, 48, 97, 103, 219, 10, 156, 100, - 66, 6, 41, 99, 61, 227, 95, 11, 19, 151, 63, 48, 110, 168, 126, 218, - 232, 250, 2, 206, 119, 22, 132, 192, 72, 112, 56, 25, 19, 126, 56, 112, - 88, 118, 198, 127, 252, 39, 128, 38, 188, 194, 127, 87, 218, 245, 77, 29, - 214, 213, 149, 91, 187, 230, 201, 244, 206, 135, 248, 55, 1, 150, 253, 176, - 245, 234, 228, 191, 60, 203, 111, 194, 112, 52, 111, 193, 166, 198, 159, 247, - 171, 70, 11, 245, 181, 175, 175, 180, 65, 71, 152, 77, 27, 161, 51, 140, - 107, 245, 27, 41, 86, 186, 199, 195, 206, 119, 116, 137, 239, 243, 56, 181, - 82, 56, 147, 91, 73, 247, 241, 206, 232, 6, 254, 75, 231, 139, 221, 219, - 98, 7, 158, 238, 179, 248, 190, 136, 220, 164, 224, 39, 146, 203, 222, 62, - 164, 241, 193, 93, 10, 167, 74, 183, 69, 120, 140, 78, 124, 139, 105, 223, - 35, 214, 218, 163, 251, 232, 155, 71, 172, 223, 109, 82, 111, 82, 176, 93, - 217, 6, 220, 57, 165, 158, 72, 52, 213, 121, 48, 208, 29, 105, 143, 61, - 239, 196, 187, 104, 196, 83, 90, 114, 162, 204, 252, 165, 117, 123, 244, 56, - 244, 138, 238, 158, 71, 44, 96, 254, 199, 237, 60, 218, 80, 130, 139, 233, - 216, 95, 42, 102, 74, 241, 237, 244, 225, 110, 253, 52, 172, 164, 55, 179, - 197, 219, 240, 190, 144, 222, 166, 124, 129, 197, 131, 250, 184, 78, 223, 85, - 43, 131, 183, 39, 165, 169, 198, 214, 169, 74, 86, 74, 199, 221, 171, 84, - 127, 81, 27, 167, 155, 245, 68, 33, 182, 110, 76, 159, 228, 249, 164, 56, - 184, 211, 122, 227, 73, 75, 27, 61, 228, 50, 37, 89, 205, 110, 131, 209, - 177, 87, 220, 198, 22, 179, 187, 167, 82, 124, 83, 239, 60, 105, 249, 102, - 82, 115, 47, 83, 137, 185, 207, 29, 127, 232, 220, 165, 183, 149, 73, 38, - 220, 243, 221, 110, 227, 155, 199, 134, 210, 138, 111, 102, 245, 69, 177, 149, - 140, 245, 75, 138, 210, 27, 249, 227, 146, 246, 144, 241, 204, 31, 90, 143, - 111, 30, 255, 200, 155, 153, 142, 125, 98, 176, 157, 85, 239, 239, 59, 222, - 167, 117, 195, 211, 24, 38, 181, 92, 191, 238, 41, 185, 43, 234, 221, 166, - 149, 236, 134, 179, 165, 218, 108, 226, 147, 58, 177, 240, 38, 165, 141, 21, - 247, 118, 222, 202, 247, 30, 210, 221, 188, 191, 153, 46, 86, 158, 74, 185, - 241, 163, 71, 116, 175, 215, 217, 216, 40, 240, 88, 74, 201, 143, 183, 179, - 70, 54, 150, 236, 229, 75, 218, 100, 82, 147, 86, 105, 41, 181, 200, 222, - 174, 252, 153, 216, 72, 122, 144, 171, 133, 76, 113, 212, 121, 28, 172, 106, - 247, 219, 92, 34, 91, 201, 119, 38, 190, 217, 48, 35, 117, 90, 169, 219, - 236, 60, 175, 22, 189, 143, 189, 192, 246, 161, 55, 155, 151, 18, 171, 196, - 99, 244, 238, 38, 83, 110, 148, 211, 197, 84, 42, 23, 93, 228, 251, 227, - 89, 63, 167, 4, 70, 217, 114, 55, 156, 43, 55, 212, 204, 224, 169, 146, - 137, 246, 114, 201, 188, 164, 148, 147, 169, 78, 86, 73, 149, 210, 165, 222, - 50, 83, 130, 186, 139, 243, 248, 163, 236, 233, 103, 74, 201, 121, 182, 210, - 243, 166, 134, 141, 222, 131, 220, 125, 204, 199, 123, 129, 124, 44, 61, 191, - 149, 82, 195, 116, 52, 144, 185, 143, 86, 147, 241, 72, 68, 89, 212, 231, - 189, 135, 98, 103, 126, 191, 213, 186, 163, 73, 241, 45, 145, 104, 204, 30, - 6, 169, 85, 182, 212, 211, 82, 69, 79, 246, 161, 152, 148, 239, 164, 187, - 193, 99, 161, 227, 206, 140, 122, 79, 153, 193, 93, 245, 81, 202, 6, 51, - 189, 108, 43, 211, 203, 61, 221, 71, 215, 153, 187, 109, 90, 43, 123, 82, - 74, 46, 94, 29, 101, 74, 94, 127, 44, 150, 204, 166, 138, 1, 53, 21, - 109, 5, 167, 211, 142, 239, 113, 88, 205, 21, 138, 169, 248, 253, 38, 25, - 200, 13, 131, 119, 247, 114, 122, 16, 43, 250, 130, 171, 84, 174, 122, 31, - 171, 150, 74, 197, 126, 45, 126, 219, 143, 167, 163, 205, 122, 244, 237, 169, - 244, 176, 25, 207, 219, 179, 187, 73, 125, 90, 142, 245, 188, 49, 37, 159, - 24, 169, 133, 74, 106, 156, 82, 147, 155, 164, 34, 143, 50, 74, 51, 93, - 142, 63, 205, 238, 75, 157, 101, 178, 148, 191, 215, 106, 177, 86, 121, 172, - 133, 235, 106, 175, 30, 43, 55, 252, 15, 241, 98, 16, 198, 188, 156, 126, - 91, 68, 59, 222, 117, 57, 239, 73, 174, 242, 69, 79, 35, 47, 245, 6, - 73, 41, 151, 142, 75, 55, 221, 132, 150, 89, 14, 106, 98, 246, 205, 167, - 20, 71, 181, 59, 81, 27, 87, 231, 119, 35, 105, 88, 80, 154, 111, 143, - 165, 121, 246, 190, 56, 128, 117, 227, 125, 200, 221, 119, 221, 229, 106, 163, - 87, 28, 118, 163, 165, 216, 36, 48, 111, 204, 3, 13, 223, 164, 240, 52, - 201, 148, 122, 79, 119, 153, 178, 167, 89, 78, 13, 138, 245, 135, 120, 169, - 82, 232, 247, 158, 238, 99, 89, 247, 67, 241, 49, 35, 53, 99, 201, 66, - 85, 204, 151, 170, 79, 112, 228, 5, 103, 197, 74, 58, 89, 139, 111, 238, - 210, 229, 185, 146, 47, 201, 177, 136, 54, 25, 204, 166, 229, 65, 45, 153, - 109, 38, 162, 181, 81, 111, 172, 108, 138, 158, 73, 63, 163, 14, 18, 165, - 184, 87, 41, 43, 173, 98, 82, 9, 139, 247, 183, 83, 88, 251, 211, 240, - 114, 94, 78, 183, 235, 90, 106, 244, 80, 86, 155, 190, 216, 176, 40, 175, - 170, 177, 158, 47, 219, 75, 175, 155, 181, 218, 253, 166, 122, 127, 87, 109, - 84, 71, 193, 114, 37, 233, 127, 74, 6, 163, 119, 90, 174, 92, 174, 107, - 176, 183, 87, 190, 123, 175, 90, 236, 5, 194, 201, 214, 125, 48, 144, 241, - 6, 31, 125, 139, 10, 34, 133, 155, 82, 37, 151, 47, 244, 83, 55, 183, - 157, 118, 62, 250, 4, 163, 80, 147, 36, 183, 86, 172, 187, 199, 9, 177, - 46, 87, 3, 141, 222, 72, 113, 47, 213, 96, 96, 28, 143, 221, 45, 253, - 226, 102, 86, 83, 159, 218, 254, 160, 234, 77, 172, 188, 254, 201, 122, 18, - 191, 75, 196, 221, 126, 113, 154, 152, 151, 220, 240, 61, 24, 44, 47, 122, - 241, 182, 223, 215, 122, 43, 247, 220, 190, 219, 250, 219, 227, 64, 157, 183, - 203, 219, 118, 34, 234, 110, 181, 7, 129, 224, 96, 229, 95, 108, 26, 211, - 98, 58, 91, 6, 28, 117, 155, 233, 222, 229, 110, 99, 197, 114, 234, 49, - 213, 31, 246, 83, 189, 193, 109, 99, 237, 189, 205, 142, 102, 219, 85, 46, - 178, 204, 55, 250, 131, 178, 54, 169, 13, 38, 57, 181, 188, 152, 63, 5, - 235, 113, 223, 42, 215, 95, 14, 212, 158, 20, 203, 173, 90, 15, 241, 132, - 251, 182, 127, 55, 201, 23, 138, 217, 135, 116, 47, 18, 191, 235, 221, 230, - 180, 89, 83, 211, 148, 219, 167, 120, 196, 115, 119, 239, 109, 108, 239, 30, - 211, 201, 252, 70, 217, 138, 242, 219, 99, 68, 26, 85, 230, 15, 245, 154, - 111, 185, 72, 61, 122, 125, 137, 160, 91, 9, 14, 221, 109, 127, 102, 21, - 93, 199, 60, 165, 214, 91, 47, 17, 240, 75, 201, 66, 88, 110, 197, 71, - 245, 85, 214, 237, 47, 174, 82, 147, 126, 81, 25, 47, 199, 93, 119, 103, - 184, 154, 118, 130, 235, 219, 226, 0, 198, 241, 105, 182, 222, 14, 51, 189, - 65, 54, 191, 153, 77, 194, 157, 165, 184, 189, 29, 73, 245, 129, 92, 83, - 58, 15, 141, 250, 120, 235, 158, 250, 188, 145, 106, 233, 214, 61, 76, 21, - 30, 115, 237, 224, 170, 51, 90, 223, 165, 26, 203, 89, 99, 50, 108, 213, - 23, 129, 238, 237, 188, 122, 155, 89, 4, 147, 253, 226, 34, 81, 79, 214, - 61, 143, 155, 240, 237, 182, 184, 246, 54, 219, 111, 73, 247, 124, 245, 230, - 13, 120, 130, 133, 244, 168, 236, 29, 181, 55, 205, 76, 60, 32, 79, 180, - 216, 42, 210, 154, 37, 130, 53, 111, 180, 58, 121, 76, 170, 219, 246, 109, - 74, 147, 222, 202, 147, 116, 189, 28, 238, 76, 110, 147, 147, 105, 205, 167, - 40, 146, 188, 94, 77, 75, 173, 251, 155, 220, 36, 234, 157, 55, 123, 5, - 255, 67, 88, 204, 60, 134, 103, 177, 220, 82, 170, 244, 223, 2, 37, 109, - 41, 250, 243, 233, 233, 54, 227, 94, 22, 198, 146, 119, 57, 155, 207, 183, - 209, 92, 192, 211, 108, 61, 41, 82, 189, 166, 36, 230, 169, 85, 163, 86, - 117, 87, 151, 83, 105, 214, 233, 70, 23, 173, 148, 207, 23, 77, 206, 250, - 143, 21, 105, 225, 237, 46, 227, 253, 202, 180, 158, 75, 184, 221, 171, 116, - 56, 27, 46, 205, 38, 79, 165, 70, 84, 41, 12, 186, 153, 219, 108, 170, - 43, 171, 205, 82, 78, 124, 76, 104, 171, 180, 58, 77, 175, 171, 234, 125, - 54, 236, 243, 247, 51, 225, 85, 230, 109, 58, 15, 74, 158, 106, 122, 224, - 235, 249, 123, 254, 154, 39, 115, 159, 188, 149, 187, 147, 78, 65, 113, 143, - 148, 106, 115, 153, 152, 249, 211, 245, 250, 220, 155, 82, 6, 233, 86, 96, - 18, 243, 183, 160, 123, 90, 237, 81, 204, 111, 111, 178, 245, 66, 60, 176, - 28, 110, 159, 124, 197, 213, 186, 177, 140, 13, 34, 163, 246, 32, 211, 105, - 199, 239, 187, 157, 142, 92, 12, 199, 211, 253, 27, 185, 242, 20, 13, 166, - 158, 38, 193, 97, 184, 17, 29, 214, 51, 171, 72, 36, 145, 132, 3, 170, - 235, 14, 100, 211, 158, 122, 184, 58, 141, 143, 188, 241, 197, 112, 83, 106, - 102, 58, 154, 250, 246, 216, 111, 222, 142, 188, 74, 167, 242, 36, 41, 177, - 74, 223, 183, 40, 223, 7, 198, 139, 106, 255, 177, 176, 240, 79, 107, 106, - 58, 208, 24, 166, 19, 125, 117, 254, 168, 165, 115, 254, 86, 234, 254, 110, - 220, 126, 122, 235, 4, 165, 250, 131, 154, 207, 108, 189, 245, 104, 162, 91, - 41, 206, 163, 5, 209, 63, 27, 220, 13, 86, 165, 226, 180, 223, 120, 24, - 87, 106, 74, 236, 62, 91, 93, 69, 198, 62, 192, 35, 245, 181, 123, 177, - 204, 165, 158, 164, 224, 124, 121, 31, 172, 60, 20, 138, 245, 110, 212, 83, - 110, 180, 224, 40, 173, 228, 91, 90, 163, 88, 106, 212, 180, 122, 181, 56, - 173, 188, 165, 203, 201, 112, 176, 238, 121, 104, 12, 199, 173, 104, 49, 92, - 244, 230, 212, 84, 115, 212, 205, 108, 21, 143, 63, 181, 157, 214, 229, 181, - 162, 201, 106, 173, 89, 154, 205, 223, 52, 205, 163, 118, 37, 159, 82, 242, - 171, 177, 209, 91, 238, 118, 49, 245, 181, 229, 229, 124, 93, 157, 172, 43, - 35, 111, 34, 242, 22, 123, 168, 110, 111, 70, 55, 181, 92, 11, 144, 224, - 118, 238, 89, 117, 131, 183, 229, 199, 224, 178, 80, 203, 108, 106, 217, 117, - 48, 91, 10, 168, 235, 76, 189, 153, 79, 189, 101, 58, 227, 219, 219, 74, - 236, 41, 21, 201, 245, 219, 177, 85, 183, 52, 25, 222, 22, 189, 225, 28, - 32, 196, 218, 186, 250, 248, 182, 200, 54, 194, 137, 182, 212, 153, 61, 166, - 210, 143, 237, 230, 64, 26, 220, 75, 11, 119, 189, 54, 25, 170, 55, 213, - 64, 242, 33, 63, 172, 250, 180, 108, 191, 57, 175, 118, 58, 205, 148, 244, - 164, 6, 125, 143, 85, 183, 212, 94, 108, 179, 171, 113, 227, 105, 112, 227, - 201, 193, 105, 19, 171, 133, 111, 223, 90, 221, 116, 69, 244, 21, 83, 81, - 119, 161, 150, 174, 76, 196, 220, 173, 167, 210, 206, 21, 189, 157, 183, 234, - 170, 119, 215, 191, 27, 85, 239, 42, 225, 94, 56, 126, 63, 24, 55, 181, - 89, 177, 91, 244, 122, 114, 169, 27, 207, 74, 14, 102, 30, 19, 235, 108, - 36, 239, 238, 212, 102, 245, 120, 180, 55, 89, 67, 181, 229, 70, 127, 238, - 175, 110, 214, 85, 73, 75, 140, 220, 79, 74, 216, 23, 15, 167, 21, 24, - 144, 97, 108, 116, 243, 24, 29, 247, 253, 201, 186, 26, 158, 109, 239, 239, - 114, 147, 109, 177, 182, 40, 87, 103, 15, 35, 111, 50, 124, 95, 139, 140, - 22, 133, 91, 207, 83, 108, 165, 148, 19, 195, 232, 67, 38, 33, 14, 228, - 205, 242, 201, 243, 150, 90, 77, 220, 3, 113, 92, 79, 173, 147, 243, 88, - 87, 190, 237, 40, 221, 90, 88, 201, 62, 21, 221, 179, 155, 210, 125, 37, - 233, 171, 21, 224, 40, 172, 172, 26, 109, 119, 216, 93, 201, 175, 155, 237, - 66, 252, 173, 150, 239, 73, 181, 92, 37, 39, 231, 223, 202, 170, 39, 146, - 139, 220, 133, 211, 179, 76, 190, 188, 233, 229, 180, 194, 170, 53, 206, 197, - 39, 193, 100, 6, 176, 136, 40, 21, 75, 234, 56, 225, 95, 74, 119, 35, - 57, 53, 125, 203, 223, 122, 50, 233, 96, 214, 29, 11, 102, 23, 241, 130, - 111, 218, 241, 247, 182, 101, 255, 12, 200, 147, 86, 28, 150, 235, 38, 16, - 155, 86, 31, 221, 243, 177, 103, 165, 230, 250, 247, 154, 183, 31, 187, 91, - 136, 189, 204, 157, 220, 75, 183, 70, 35, 245, 118, 174, 53, 234, 169, 104, - 99, 42, 151, 70, 149, 110, 118, 216, 105, 76, 164, 229, 120, 212, 156, 60, - 169, 173, 120, 119, 176, 29, 37, 238, 115, 219, 126, 88, 21, 239, 186, 177, - 137, 183, 253, 184, 105, 78, 124, 254, 209, 205, 195, 54, 167, 40, 79, 15, - 74, 179, 239, 247, 203, 112, 200, 110, 166, 145, 246, 147, 175, 187, 89, 189, - 221, 15, 250, 157, 248, 88, 171, 206, 162, 195, 230, 234, 161, 221, 200, 196, - 194, 237, 88, 33, 81, 30, 15, 163, 171, 64, 218, 39, 45, 187, 242, 112, - 176, 241, 221, 45, 215, 158, 146, 90, 28, 21, 96, 129, 134, 187, 189, 120, - 175, 84, 233, 143, 122, 97, 53, 43, 231, 146, 17, 111, 101, 157, 200, 247, - 226, 235, 114, 183, 248, 176, 42, 222, 220, 190, 249, 38, 226, 98, 155, 28, - 171, 49, 191, 216, 170, 123, 70, 75, 95, 115, 84, 107, 45, 82, 139, 96, - 43, 24, 240, 41, 195, 241, 38, 159, 207, 70, 226, 237, 168, 6, 219, 45, - 179, 120, 104, 170, 157, 84, 240, 177, 119, 63, 28, 104, 121, 159, 92, 136, - 40, 185, 60, 156, 98, 169, 152, 187, 157, 106, 134, 253, 147, 238, 186, 28, - 152, 3, 56, 193, 114, 191, 157, 240, 140, 187, 129, 84, 14, 48, 113, 63, - 18, 46, 106, 197, 167, 133, 127, 224, 29, 39, 163, 233, 251, 94, 79, 238, - 245, 34, 157, 66, 174, 118, 235, 135, 249, 150, 35, 213, 188, 250, 184, 241, - 1, 122, 145, 183, 146, 59, 56, 189, 221, 220, 139, 193, 217, 162, 47, 102, - 3, 139, 68, 94, 109, 213, 203, 219, 84, 101, 91, 149, 226, 77, 37, 60, - 216, 110, 2, 201, 92, 163, 16, 207, 205, 252, 219, 64, 59, 30, 78, 184, - 35, 165, 167, 105, 102, 147, 247, 13, 23, 169, 68, 83, 26, 36, 7, 98, - 36, 209, 170, 69, 23, 93, 95, 190, 55, 127, 72, 60, 133, 215, 27, 121, - 11, 195, 159, 184, 217, 220, 172, 203, 183, 222, 94, 56, 251, 148, 201, 62, - 37, 187, 145, 112, 73, 186, 29, 175, 231, 193, 82, 45, 150, 141, 164, 198, - 165, 69, 54, 188, 233, 52, 23, 158, 73, 165, 241, 160, 122, 212, 246, 125, - 55, 27, 212, 2, 205, 204, 114, 22, 45, 4, 197, 88, 43, 85, 72, 15, - 188, 185, 108, 49, 18, 107, 197, 30, 228, 183, 97, 124, 61, 72, 55, 10, - 163, 146, 124, 175, 206, 124, 163, 187, 96, 63, 220, 41, 143, 130, 235, 232, - 116, 17, 221, 190, 229, 214, 55, 145, 98, 74, 92, 213, 231, 141, 114, 185, - 149, 159, 20, 82, 189, 187, 155, 218, 83, 56, 90, 138, 20, 102, 221, 232, - 109, 184, 146, 188, 201, 13, 230, 146, 223, 39, 245, 1, 165, 220, 22, 6, - 190, 112, 70, 82, 166, 211, 90, 215, 219, 84, 252, 101, 79, 49, 45, 79, - 218, 226, 32, 53, 172, 84, 22, 145, 88, 228, 126, 51, 107, 223, 140, 111, - 83, 225, 183, 84, 126, 154, 90, 191, 117, 111, 210, 89, 95, 229, 254, 41, - 166, 78, 170, 201, 254, 173, 212, 145, 6, 111, 189, 118, 210, 157, 216, 138, - 119, 241, 167, 118, 250, 110, 61, 73, 102, 114, 176, 248, 215, 227, 167, 238, - 90, 235, 221, 141, 58, 18, 28, 199, 242, 42, 162, 173, 50, 147, 155, 202, - 109, 59, 87, 131, 174, 116, 170, 163, 69, 43, 83, 152, 62, 46, 124, 139, - 238, 236, 62, 222, 29, 87, 203, 234, 116, 150, 184, 205, 247, 238, 178, 133, - 91, 17, 54, 244, 250, 177, 23, 11, 167, 214, 13, 49, 21, 44, 180, 125, - 155, 205, 196, 95, 136, 12, 199, 242, 162, 184, 158, 190, 213, 165, 114, 100, - 113, 175, 148, 238, 171, 155, 214, 77, 52, 210, 191, 105, 37, 179, 179, 109, - 62, 16, 31, 220, 223, 204, 50, 237, 154, 88, 42, 61, 186, 195, 94, 175, - 26, 31, 23, 243, 225, 78, 191, 26, 105, 198, 27, 133, 177, 47, 184, 158, - 220, 183, 238, 39, 237, 124, 53, 213, 13, 206, 115, 217, 230, 92, 222, 116, - 138, 125, 165, 217, 169, 20, 219, 205, 245, 109, 165, 24, 174, 137, 30, 127, - 177, 24, 152, 230, 229, 109, 42, 219, 92, 168, 245, 89, 190, 183, 45, 222, - 189, 213, 203, 242, 91, 181, 148, 175, 79, 238, 194, 139, 216, 252, 49, 237, - 237, 192, 34, 42, 220, 184, 55, 209, 167, 242, 68, 206, 151, 239, 243, 205, - 102, 126, 25, 232, 20, 188, 253, 161, 216, 93, 60, 116, 60, 195, 128, 123, - 216, 247, 22, 86, 67, 31, 92, 168, 50, 117, 95, 192, 247, 180, 152, 87, - 11, 225, 228, 77, 44, 55, 246, 110, 122, 145, 170, 231, 190, 48, 143, 221, - 120, 54, 55, 170, 44, 39, 71, 119, 114, 118, 82, 170, 12, 167, 181, 105, - 33, 42, 222, 185, 53, 207, 120, 220, 142, 133, 107, 202, 60, 13, 80, 103, - 243, 153, 155, 190, 18, 151, 155, 93, 143, 63, 23, 153, 70, 123, 129, 108, - 108, 17, 141, 66, 251, 149, 7, 175, 8, 7, 122, 222, 189, 141, 4, 171, - 83, 57, 91, 239, 120, 164, 224, 250, 109, 217, 74, 140, 149, 64, 241, 102, - 53, 234, 20, 199, 247, 147, 222, 186, 180, 122, 43, 12, 3, 5, 185, 208, - 120, 104, 222, 54, 22, 171, 170, 246, 148, 47, 53, 159, 10, 147, 78, 116, - 27, 31, 221, 221, 103, 110, 122, 171, 213, 54, 254, 168, 202, 139, 241, 232, - 110, 149, 77, 172, 225, 174, 112, 95, 202, 164, 221, 229, 199, 206, 188, 161, - 54, 98, 158, 232, 38, 27, 152, 205, 43, 90, 124, 214, 157, 205, 83, 149, - 82, 255, 86, 45, 171, 145, 124, 97, 219, 77, 107, 183, 41, 79, 125, 180, - 28, 213, 186, 209, 122, 190, 10, 181, 184, 55, 119, 137, 76, 43, 23, 208, - 90, 234, 226, 65, 139, 184, 135, 222, 187, 118, 191, 84, 106, 36, 18, 217, - 89, 178, 57, 214, 242, 197, 96, 88, 139, 102, 60, 51, 223, 108, 221, 125, - 42, 151, 250, 69, 121, 184, 74, 120, 35, 183, 101, 159, 79, 187, 137, 188, - 205, 158, 54, 158, 232, 77, 33, 120, 123, 215, 107, 116, 124, 173, 141, 63, - 210, 241, 70, 60, 79, 106, 177, 216, 123, 76, 149, 61, 145, 226, 178, 81, - 206, 247, 22, 237, 74, 80, 12, 76, 134, 155, 122, 123, 186, 233, 119, 251, - 176, 89, 75, 145, 187, 150, 150, 120, 107, 202, 79, 209, 172, 220, 172, 180, - 18, 173, 228, 83, 64, 217, 166, 61, 55, 165, 104, 185, 36, 151, 74, 253, - 167, 66, 175, 239, 221, 220, 134, 215, 221, 77, 85, 18, 31, 103, 245, 204, - 232, 62, 153, 133, 109, 208, 27, 84, 42, 137, 242, 221, 77, 79, 235, 53, - 250, 217, 148, 39, 60, 155, 76, 74, 55, 79, 247, 222, 100, 44, 118, 219, - 126, 107, 223, 140, 130, 225, 102, 196, 31, 133, 195, 165, 160, 101, 110, 252, - 154, 124, 11, 7, 149, 60, 207, 108, 238, 124, 153, 249, 232, 182, 61, 234, - 52, 171, 133, 98, 62, 88, 158, 0, 209, 152, 28, 215, 135, 149, 167, 246, - 214, 211, 120, 186, 25, 251, 159, 20, 239, 86, 157, 205, 82, 131, 82, 101, - 122, 231, 149, 194, 119, 139, 110, 253, 166, 178, 212, 186, 249, 238, 96, 62, - 138, 122, 182, 242, 54, 153, 44, 119, 166, 79, 241, 220, 83, 56, 220, 10, - 198, 31, 166, 121, 77, 83, 151, 89, 127, 179, 114, 183, 236, 15, 221, 131, - 244, 172, 156, 120, 11, 2, 113, 170, 186, 85, 41, 32, 69, 151, 203, 216, - 210, 19, 152, 62, 138, 143, 227, 210, 114, 216, 246, 47, 61, 82, 186, 90, - 237, 223, 38, 187, 222, 199, 224, 189, 90, 233, 199, 170, 177, 228, 173, 84, - 125, 75, 150, 125, 15, 197, 229, 32, 171, 141, 35, 139, 196, 230, 169, 209, - 75, 63, 46, 122, 233, 218, 56, 239, 46, 15, 219, 111, 190, 198, 91, 167, - 26, 123, 156, 68, 195, 145, 85, 202, 183, 129, 229, 226, 213, 34, 165, 212, - 168, 89, 184, 155, 214, 110, 59, 227, 252, 66, 206, 222, 213, 91, 158, 117, - 123, 0, 131, 215, 172, 148, 167, 173, 244, 91, 33, 232, 47, 62, 182, 11, - 143, 98, 38, 61, 123, 140, 123, 125, 3, 160, 84, 253, 165, 122, 58, 242, - 24, 29, 244, 124, 157, 225, 160, 121, 87, 234, 39, 125, 249, 252, 122, 84, - 139, 47, 171, 202, 234, 126, 154, 126, 116, 55, 195, 181, 91, 32, 213, 7, - 5, 184, 33, 204, 115, 243, 224, 44, 232, 143, 61, 102, 224, 170, 229, 94, - 78, 86, 119, 225, 73, 219, 223, 205, 223, 228, 238, 30, 194, 197, 146, 47, - 209, 24, 118, 243, 225, 113, 39, 252, 180, 168, 36, 123, 213, 226, 104, 144, - 121, 16, 221, 15, 178, 52, 242, 87, 196, 206, 96, 49, 45, 140, 221, 1, - 177, 235, 149, 197, 126, 75, 241, 166, 3, 131, 77, 32, 95, 120, 152, 191, - 169, 213, 105, 209, 147, 175, 73, 25, 191, 239, 45, 156, 234, 150, 86, 91, - 101, 158, 43, 170, 193, 66, 241, 238, 190, 93, 137, 205, 70, 105, 119, 246, - 45, 235, 107, 123, 178, 238, 100, 81, 138, 54, 139, 29, 183, 123, 116, 247, - 150, 188, 11, 223, 175, 243, 218, 240, 182, 18, 25, 21, 148, 82, 233, 46, - 217, 155, 69, 10, 241, 198, 211, 198, 253, 240, 38, 39, 198, 205, 98, 212, - 239, 91, 184, 219, 178, 59, 236, 27, 15, 103, 90, 163, 162, 61, 36, 22, - 133, 183, 167, 69, 107, 18, 27, 123, 11, 89, 175, 60, 234, 184, 227, 74, - 247, 222, 87, 220, 76, 123, 221, 123, 239, 32, 22, 174, 22, 231, 227, 78, - 47, 144, 222, 22, 106, 53, 213, 191, 120, 155, 213, 180, 190, 199, 59, 186, - 239, 53, 220, 203, 236, 93, 102, 124, 119, 95, 131, 59, 242, 186, 212, 141, - 108, 199, 213, 122, 47, 226, 171, 68, 82, 35, 209, 95, 191, 223, 108, 226, - 227, 194, 48, 86, 78, 61, 132, 59, 219, 180, 146, 90, 229, 252, 177, 229, - 122, 50, 46, 54, 148, 249, 98, 157, 233, 111, 70, 61, 223, 108, 227, 111, - 45, 186, 225, 108, 235, 113, 229, 47, 69, 212, 187, 224, 109, 123, 88, 143, - 54, 151, 181, 68, 99, 50, 136, 150, 110, 59, 57, 109, 216, 236, 101, 203, - 137, 218, 214, 95, 44, 132, 35, 183, 165, 65, 43, 81, 238, 166, 0, 159, - 104, 133, 92, 56, 120, 63, 138, 231, 196, 166, 47, 211, 184, 15, 172, 215, - 233, 7, 249, 46, 178, 94, 12, 183, 169, 182, 242, 216, 124, 75, 121, 31, - 155, 149, 199, 122, 44, 245, 150, 236, 173, 31, 189, 93, 28, 29, 127, 218, - 151, 157, 52, 55, 74, 164, 209, 137, 215, 114, 119, 202, 109, 164, 215, 15, - 42, 133, 82, 186, 88, 191, 107, 100, 123, 190, 152, 55, 28, 142, 141, 179, - 173, 77, 227, 126, 214, 201, 215, 253, 253, 213, 58, 253, 164, 61, 68, 31, - 234, 221, 78, 45, 155, 237, 213, 243, 181, 59, 239, 221, 205, 253, 48, 247, - 148, 44, 184, 139, 169, 82, 191, 94, 26, 230, 10, 183, 141, 241, 44, 160, - 182, 253, 155, 109, 236, 182, 214, 22, 219, 193, 132, 119, 240, 164, 205, 55, - 169, 206, 54, 3, 243, 23, 191, 29, 84, 165, 237, 64, 133, 69, 55, 25, - 62, 221, 228, 31, 99, 241, 108, 56, 119, 183, 245, 150, 155, 119, 173, 194, - 109, 48, 150, 43, 247, 7, 173, 92, 196, 247, 184, 41, 197, 242, 131, 187, - 212, 68, 172, 172, 154, 241, 236, 83, 68, 154, 136, 229, 89, 206, 31, 93, - 139, 253, 82, 98, 184, 142, 247, 148, 50, 220, 62, 179, 165, 94, 84, 123, - 188, 107, 220, 117, 11, 185, 105, 185, 208, 124, 236, 230, 27, 234, 227, 86, - 19, 107, 67, 69, 73, 140, 196, 55, 113, 179, 24, 46, 227, 106, 32, 125, - 211, 125, 123, 139, 122, 162, 111, 1, 237, 45, 94, 120, 12, 138, 99, 255, - 244, 102, 220, 148, 50, 183, 69, 121, 112, 83, 121, 216, 248, 154, 153, 85, - 163, 95, 207, 20, 59, 177, 200, 118, 147, 24, 123, 179, 227, 106, 209, 155, - 172, 190, 245, 180, 85, 167, 211, 247, 47, 55, 226, 40, 183, 78, 46, 71, - 209, 234, 172, 22, 105, 198, 102, 233, 199, 135, 94, 245, 38, 49, 110, 116, - 74, 163, 193, 40, 211, 26, 38, 218, 141, 155, 89, 110, 235, 13, 120, 155, - 181, 109, 111, 229, 13, 84, 23, 203, 114, 84, 141, 134, 31, 195, 25, 121, - 236, 111, 212, 150, 165, 72, 175, 58, 232, 41, 137, 5, 108, 151, 194, 176, - 90, 44, 230, 158, 70, 131, 124, 73, 21, 229, 229, 208, 59, 28, 231, 183, - 189, 126, 211, 247, 144, 43, 231, 70, 235, 100, 63, 31, 6, 202, 200, 223, - 106, 119, 114, 235, 240, 160, 14, 23, 178, 234, 219, 147, 239, 161, 84, 169, - 133, 71, 57, 109, 219, 239, 36, 171, 203, 228, 109, 174, 173, 6, 7, 210, - 48, 184, 218, 228, 31, 111, 10, 201, 128, 39, 18, 112, 171, 254, 135, 100, - 79, 121, 146, 43, 111, 235, 122, 181, 81, 106, 6, 110, 98, 253, 105, 89, - 238, 4, 110, 195, 74, 237, 193, 215, 127, 72, 149, 35, 197, 176, 95, 243, - 231, 188, 210, 67, 68, 27, 37, 11, 205, 135, 114, 49, 23, 223, 4, 115, - 190, 252, 93, 190, 7, 107, 107, 190, 138, 109, 214, 226, 125, 195, 147, 172, - 184, 43, 193, 165, 39, 167, 212, 182, 211, 90, 233, 126, 182, 82, 214, 218, - 77, 252, 161, 155, 247, 104, 213, 154, 40, 85, 196, 105, 179, 180, 141, 47, - 103, 203, 106, 36, 25, 73, 220, 7, 220, 141, 68, 127, 220, 140, 182, 102, - 111, 74, 116, 17, 145, 155, 211, 92, 164, 215, 241, 36, 182, 139, 72, 83, - 188, 15, 148, 229, 70, 166, 12, 180, 27, 108, 150, 85, 211, 19, 76, 23, - 194, 249, 84, 231, 190, 160, 116, 150, 137, 213, 58, 95, 28, 104, 163, 140, - 236, 81, 167, 222, 92, 64, 244, 107, 225, 90, 32, 151, 205, 221, 108, 43, - 209, 226, 98, 57, 77, 71, 102, 1, 121, 58, 131, 67, 64, 10, 120, 2, - 82, 231, 33, 190, 237, 45, 130, 249, 241, 67, 162, 210, 73, 229, 251, 15, - 237, 69, 61, 56, 206, 250, 59, 11, 184, 170, 69, 150, 11, 191, 148, 233, - 6, 210, 19, 127, 25, 110, 76, 219, 241, 170, 235, 47, 7, 83, 238, 117, - 66, 134, 51, 242, 237, 169, 57, 142, 172, 165, 78, 45, 231, 121, 154, 164, - 43, 169, 237, 38, 227, 127, 131, 43, 107, 162, 115, 95, 47, 148, 238, 35, - 241, 198, 131, 127, 186, 174, 108, 35, 101, 169, 166, 45, 210, 158, 97, 109, - 25, 157, 198, 58, 128, 114, 162, 238, 109, 84, 148, 154, 181, 142, 127, 114, - 211, 140, 53, 146, 35, 237, 62, 49, 202, 21, 226, 74, 167, 221, 202, 245, - 103, 227, 123, 233, 177, 145, 43, 250, 226, 197, 222, 125, 46, 239, 75, 220, - 140, 188, 153, 196, 184, 26, 245, 101, 84, 207, 125, 162, 146, 77, 60, 220, - 251, 226, 131, 224, 38, 167, 165, 18, 195, 81, 121, 25, 29, 134, 123, 65, - 177, 82, 159, 223, 251, 212, 118, 182, 174, 44, 170, 114, 43, 47, 182, 219, - 67, 209, 93, 145, 253, 219, 110, 204, 223, 109, 46, 10, 179, 123, 45, 30, - 121, 232, 223, 76, 90, 183, 15, 3, 57, 120, 7, 215, 182, 186, 247, 238, - 118, 40, 183, 222, 100, 41, 48, 202, 72, 112, 127, 153, 22, 178, 85, 239, - 189, 127, 20, 120, 8, 64, 255, 131, 83, 77, 90, 199, 30, 183, 221, 96, - 191, 125, 91, 157, 248, 2, 149, 126, 191, 180, 90, 247, 55, 179, 121, 123, - 51, 40, 105, 115, 45, 155, 10, 86, 146, 181, 135, 245, 186, 15, 36, 202, - 125, 70, 158, 143, 39, 245, 200, 99, 236, 201, 63, 9, 230, 163, 213, 128, - 183, 187, 136, 6, 146, 211, 232, 232, 126, 112, 147, 107, 249, 98, 5, 181, - 212, 169, 212, 251, 147, 108, 171, 235, 43, 119, 203, 202, 164, 159, 236, 245, - 167, 112, 162, 14, 155, 222, 113, 191, 144, 159, 111, 59, 201, 85, 96, 84, - 173, 207, 159, 214, 149, 246, 86, 93, 150, 90, 158, 214, 99, 174, 234, 30, - 76, 164, 118, 165, 26, 116, 63, 249, 202, 222, 245, 64, 186, 141, 20, 211, - 153, 114, 95, 154, 165, 203, 183, 195, 97, 110, 248, 224, 45, 204, 55, 89, - 223, 52, 57, 155, 202, 229, 91, 57, 31, 73, 109, 111, 43, 112, 98, 100, - 239, 61, 235, 72, 254, 233, 38, 23, 174, 192, 157, 236, 110, 243, 248, 56, - 107, 205, 189, 67, 77, 133, 99, 227, 190, 254, 244, 20, 46, 47, 166, 254, - 114, 61, 89, 203, 46, 166, 137, 130, 28, 205, 139, 137, 120, 43, 27, 148, - 10, 209, 176, 47, 49, 157, 175, 203, 149, 170, 248, 152, 169, 244, 182, 163, - 167, 201, 194, 29, 201, 63, 198, 99, 137, 249, 184, 84, 28, 77, 19, 254, - 214, 186, 124, 87, 120, 72, 53, 158, 180, 200, 83, 174, 153, 26, 79, 31, - 138, 171, 192, 237, 189, 71, 189, 25, 133, 239, 199, 249, 225, 116, 27, 88, - 43, 93, 175, 127, 176, 41, 180, 122, 221, 113, 178, 23, 136, 69, 114, 119, - 217, 91, 239, 255, 35, 238, 63, 116, 37, 103, 182, 53, 49, 240, 85, 126, - 156, 1, 90, 221, 160, 186, 233, 147, 76, 233, 222, 51, 160, 247, 222, 19, - 2, 4, 122, 111, 147, 94, 152, 119, 31, 214, 185, 119, 78, 55, 166, 27, - 24, 12, 36, 64, 40, 236, 172, 34, 119, 38, 51, 34, 24, 235, 51, 17, - 139, 171, 132, 103, 120, 191, 93, 64, 23, 50, 140, 50, 210, 99, 94, 107, - 250, 221, 183, 27, 16, 58, 62, 118, 63, 79, 114, 75, 129, 213, 33, 135, - 73, 104, 188, 66, 7, 13, 252, 133, 29, 109, 147, 87, 141, 2, 201, 28, - 10, 225, 210, 94, 203, 63, 38, 29, 101, 42, 111, 149, 92, 3, 109, 143, - 159, 88, 211, 199, 38, 106, 176, 223, 144, 112, 23, 247, 81, 21, 113, 51, - 234, 189, 236, 57, 235, 2, 152, 110, 251, 39, 51, 48, 166, 27, 63, 213, - 207, 123, 239, 175, 145, 124, 95, 53, 252, 241, 32, 72, 161, 62, 154, 46, - 155, 211, 174, 19, 88, 117, 42, 130, 6, 83, 73, 23, 91, 100, 27, 87, - 201, 129, 221, 191, 88, 40, 43, 221, 33, 23, 152, 60, 126, 126, 65, 43, - 29, 56, 239, 57, 23, 250, 223, 67, 218, 26, 221, 94, 240, 40, 89, 24, - 230, 222, 86, 165, 253, 96, 241, 241, 76, 159, 225, 139, 27, 130, 156, 242, - 74, 203, 173, 16, 186, 126, 73, 36, 247, 228, 2, 63, 143, 110, 207, 62, - 142, 208, 169, 189, 27, 196, 220, 54, 118, 74, 81, 112, 231, 186, 198, 250, - 56, 53, 44, 39, 36, 165, 242, 139, 136, 85, 92, 58, 237, 28, 126, 240, - 111, 111, 142, 131, 178, 149, 143, 47, 84, 179, 128, 192, 63, 167, 253, 28, - 155, 190, 97, 23, 250, 1, 224, 248, 71, 104, 126, 132, 110, 207, 118, 254, - 122, 110, 47, 17, 180, 98, 131, 201, 19, 224, 37, 6, 9, 62, 20, 195, - 67, 25, 213, 91, 129, 72, 137, 80, 129, 58, 114, 10, 137, 245, 209, 24, - 142, 113, 78, 207, 122, 221, 151, 189, 225, 38, 172, 155, 109, 213, 203, 111, - 130, 179, 173, 51, 180, 250, 122, 238, 36, 27, 97, 175, 107, 32, 122, 9, - 192, 24, 87, 33, 27, 181, 48, 43, 127, 68, 89, 134, 47, 137, 201, 44, - 203, 67, 4, 66, 77, 53, 223, 214, 242, 16, 140, 37, 62, 169, 168, 167, - 198, 30, 238, 28, 167, 120, 206, 11, 111, 219, 112, 175, 187, 116, 112, 180, - 35, 244, 197, 118, 81, 126, 37, 162, 136, 166, 221, 202, 33, 88, 69, 74, - 151, 31, 7, 152, 82, 117, 117, 124, 157, 80, 170, 239, 125, 237, 26, 54, - 167, 43, 62, 91, 86, 75, 163, 100, 173, 119, 245, 174, 110, 93, 172, 110, - 241, 56, 41, 90, 214, 102, 202, 27, 237, 96, 183, 8, 233, 130, 197, 46, - 81, 165, 229, 208, 103, 199, 210, 159, 167, 173, 36, 77, 99, 253, 16, 94, - 192, 151, 68, 25, 114, 104, 115, 76, 204, 169, 136, 83, 15, 41, 6, 105, - 145, 121, 249, 128, 66, 67, 70, 50, 164, 104, 152, 169, 94, 215, 105, 137, - 229, 22, 39, 161, 253, 23, 62, 141, 201, 229, 142, 97, 192, 226, 93, 250, - 170, 115, 108, 187, 182, 174, 171, 39, 221, 45, 82, 191, 14, 248, 199, 177, - 137, 59, 158, 188, 41, 109, 155, 165, 24, 248, 10, 251, 245, 242, 109, 188, - 14, 203, 255, 62, 137, 115, 187, 200, 119, 151, 211, 179, 72, 124, 31, 41, - 119, 145, 45, 115, 27, 40, 176, 118, 160, 42, 253, 225, 205, 64, 138, 250, - 47, 120, 188, 94, 184, 128, 135, 146, 177, 2, 73, 231, 50, 159, 82, 63, - 64, 77, 250, 239, 55, 149, 42, 121, 158, 222, 141, 201, 139, 202, 179, 125, - 98, 11, 108, 203, 232, 116, 75, 2, 47, 146, 8, 49, 252, 0, 45, 182, - 14, 237, 173, 22, 45, 72, 195, 113, 180, 139, 233, 47, 17, 189, 189, 95, - 247, 47, 3, 5, 53, 68, 186, 202, 71, 252, 108, 81, 206, 83, 43, 166, - 149, 16, 18, 145, 179, 65, 95, 161, 243, 253, 72, 108, 244, 213, 92, 24, - 192, 58, 110, 205, 119, 86, 252, 25, 104, 143, 23, 243, 252, 213, 30, 71, - 213, 237, 216, 13, 104, 68, 62, 221, 12, 146, 94, 53, 188, 151, 75, 159, - 212, 20, 38, 114, 49, 172, 9, 237, 153, 209, 226, 23, 236, 120, 23, 255, - 96, 155, 170, 223, 92, 63, 124, 138, 146, 62, 191, 2, 216, 31, 198, 76, - 106, 23, 12, 39, 142, 246, 209, 76, 214, 37, 233, 109, 219, 159, 117, 106, - 65, 20, 225, 254, 172, 141, 83, 92, 207, 187, 157, 179, 91, 3, 195, 252, - 13, 252, 251, 255, 54, 254, 115, 151, 238, 95, 126, 243, 159, 146, 134, 211, - 90, 252, 91, 117, 202, 127, 253, 219, 188, 175, 115, 95, 252, 237, 239, 255, - 241, 175, 127, 73, 255, 46, 252, 11, 152, 254, 221, 230, 34, 230, 127, 250, - 253, 57, 212, 254, 28, 38, 85, 147, 253, 249, 196, 159, 19, 210, 159, 19, - 255, 40, 137, 240, 30, 48, 127, 14, 166, 97, 222, 183, 102, 172, 254, 250, - 79, 255, 2, 254, 185, 246, 223, 255, 236, 188, 54, 191, 191, 230, 117, 250, - 243, 32, 127, 254, 231, 41, 210, 123, 218, 255, 74, 239, 127, 1, 255, 125, - 87, 240, 255, 245, 63, 218, 51, 252, 143, 255, 167, 247, 12, 255, 209, 115, - 154, 254, 183, 61, 67, 58, 248, 192, 178, 252, 103, 163, 144, 226, 255, 236, - 25, 134, 8, 113, 60, 208, 231, 104, 252, 128, 75, 226, 184, 79, 31, 28, - 116, 15, 116, 95, 207, 75, 43, 248, 144, 67, 154, 108, 216, 105, 207, 37, - 78, 108, 39, 172, 167, 80, 146, 132, 95, 108, 223, 51, 127, 248, 17, 40, - 62, 167, 208, 246, 125, 172, 216, 161, 216, 1, 87, 58, 45, 150, 131, 137, - 16, 236, 137, 223, 118, 203, 146, 100, 9, 12, 80, 110, 59, 82, 165, 200, - 248, 65, 87, 19, 222, 75, 167, 31, 51, 61, 224, 252, 195, 250, 158, 35, - 120, 46, 226, 70, 176, 161, 7, 94, 219, 192, 123, 122, 64, 122, 35, 22, - 83, 162, 230, 232, 195, 85, 98, 64, 230, 200, 98, 69, 60, 99, 132, 16, - 160, 122, 236, 218, 32, 251, 241, 103, 25, 213, 42, 70, 96, 200, 81, 65, - 137, 250, 228, 181, 75, 66, 24, 118, 232, 140, 238, 104, 12, 237, 46, 127, - 235, 196, 184, 126, 16, 42, 65, 246, 41, 225, 139, 58, 226, 190, 168, 251, - 128, 219, 145, 18, 191, 157, 184, 163, 18, 11, 165, 90, 92, 170, 20, 9, - 236, 216, 111, 138, 8, 86, 148, 176, 3, 119, 24, 80, 143, 251, 7, 238, - 103, 102, 154, 13, 166, 116, 49, 92, 52, 113, 159, 228, 225, 171, 171, 2, - 104, 28, 145, 125, 12, 47, 93, 156, 79, 45, 92, 182, 53, 28, 55, 213, - 44, 87, 130, 173, 231, 69, 217, 58, 252, 22, 243, 112, 231, 178, 208, 153, - 50, 100, 119, 210, 160, 40, 222, 207, 74, 111, 191, 90, 116, 7, 247, 39, - 55, 221, 227, 247, 206, 117, 82, 21, 215, 55, 106, 154, 89, 177, 202, 40, - 126, 47, 156, 244, 41, 255, 125, 34, 30, 112, 19, 255, 83, 37, 254, 190, - 198, 112, 194, 68, 124, 210, 69, 61, 255, 13, 184, 91, 14, 160, 157, 13, - 188, 193, 244, 30, 252, 118, 217, 155, 115, 89, 55, 135, 139, 210, 185, 245, - 213, 222, 72, 209, 216, 126, 2, 57, 43, 68, 53, 225, 136, 84, 205, 174, - 214, 203, 76, 90, 71, 192, 154, 242, 136, 21, 114, 27, 225, 65, 118, 227, - 184, 87, 104, 181, 50, 108, 54, 234, 129, 131, 233, 133, 129, 226, 137, 0, - 47, 111, 111, 199, 112, 253, 62, 193, 172, 169, 253, 161, 137, 250, 47, 61, - 152, 153, 96, 146, 126, 89, 186, 118, 222, 237, 26, 111, 138, 50, 4, 154, - 98, 44, 208, 34, 64, 208, 12, 241, 235, 80, 8, 230, 116, 80, 212, 184, - 71, 206, 4, 222, 199, 152, 215, 33, 15, 122, 245, 8, 228, 129, 198, 211, - 219, 38, 131, 39, 38, 243, 91, 149, 123, 85, 30, 67, 100, 206, 239, 56, - 62, 121, 89, 94, 175, 161, 221, 191, 202, 177, 231, 202, 248, 251, 61, 212, - 150, 37, 192, 74, 124, 182, 69, 69, 188, 81, 45, 179, 101, 153, 63, 205, - 210, 8, 173, 18, 92, 131, 242, 154, 175, 152, 240, 199, 120, 72, 155, 57, - 141, 135, 89, 245, 250, 233, 67, 182, 17, 188, 230, 17, 42, 55, 19, 67, - 148, 104, 113, 20, 161, 80, 230, 194, 231, 204, 135, 107, 142, 144, 91, 74, - 133, 229, 202, 144, 23, 39, 125, 189, 243, 186, 175, 106, 185, 219, 199, 113, - 5, 222, 105, 105, 209, 120, 217, 81, 182, 177, 74, 172, 187, 128, 191, 212, - 28, 41, 110, 252, 212, 91, 225, 208, 16, 121, 88, 135, 99, 74, 5, 166, - 75, 128, 97, 84, 62, 102, 247, 121, 226, 89, 209, 231, 234, 53, 182, 21, - 62, 108, 173, 76, 99, 197, 244, 241, 170, 104, 199, 234, 72, 164, 107, 20, - 136, 11, 177, 71, 146, 145, 254, 249, 176, 125, 58, 172, 246, 213, 238, 109, - 48, 155, 138, 144, 46, 211, 121, 0, 167, 254, 105, 104, 255, 78, 233, 98, - 75, 123, 172, 35, 92, 99, 33, 84, 126, 90, 70, 103, 94, 114, 184, 86, - 84, 113, 140, 191, 115, 18, 14, 126, 54, 124, 248, 36, 176, 53, 15, 225, - 137, 208, 143, 89, 219, 155, 11, 219, 141, 93, 141, 190, 42, 205, 46, 146, - 229, 87, 60, 107, 198, 144, 227, 103, 232, 250, 68, 41, 187, 132, 1, 123, - 124, 78, 179, 8, 24, 235, 105, 57, 234, 72, 215, 34, 140, 25, 203, 241, - 66, 83, 244, 149, 255, 104, 97, 100, 232, 43, 187, 5, 62, 11, 4, 186, - 241, 253, 56, 117, 185, 190, 113, 32, 3, 91, 210, 214, 153, 20, 218, 74, - 162, 154, 118, 120, 155, 213, 154, 136, 41, 34, 101, 249, 147, 89, 224, 65, - 61, 103, 249, 118, 116, 98, 72, 64, 251, 117, 146, 92, 173, 136, 133, 172, - 49, 121, 54, 231, 213, 52, 71, 91, 54, 79, 171, 59, 177, 35, 58, 226, - 46, 249, 179, 109, 6, 254, 201, 30, 29, 85, 146, 253, 61, 75, 16, 235, - 242, 190, 150, 41, 26, 34, 96, 245, 205, 83, 212, 40, 232, 3, 100, 43, - 18, 101, 1, 19, 36, 14, 32, 39, 14, 211, 38, 141, 122, 224, 72, 185, - 190, 48, 193, 81, 127, 206, 126, 111, 124, 116, 139, 89, 193, 126, 123, 16, - 40, 27, 147, 95, 79, 246, 11, 66, 32, 223, 54, 34, 167, 161, 91, 19, - 105, 97, 18, 127, 143, 13, 4, 86, 223, 83, 245, 171, 156, 68, 14, 253, - 78, 34, 174, 185, 89, 113, 145, 108, 29, 209, 16, 202, 177, 204, 160, 2, - 207, 7, 208, 93, 211, 119, 182, 64, 109, 129, 203, 164, 38, 97, 19, 1, - 65, 184, 116, 170, 53, 77, 26, 39, 192, 222, 48, 117, 7, 36, 48, 22, - 128, 201, 129, 200, 137, 28, 197, 191, 32, 154, 110, 46, 67, 181, 160, 53, - 157, 62, 13, 169, 211, 174, 10, 199, 152, 230, 0, 9, 34, 244, 73, 100, - 134, 248, 186, 59, 76, 41, 191, 0, 250, 242, 85, 225, 228, 26, 21, 218, - 135, 117, 113, 16, 53, 28, 79, 10, 254, 126, 112, 73, 212, 248, 118, 160, - 246, 138, 131, 101, 201, 62, 25, 4, 62, 217, 6, 118, 49, 98, 105, 148, - 24, 200, 65, 53, 239, 213, 14, 19, 218, 246, 125, 41, 77, 180, 231, 89, - 28, 160, 92, 176, 191, 0, 144, 134, 68, 218, 155, 228, 141, 37, 154, 49, - 101, 56, 35, 96, 26, 24, 218, 221, 1, 128, 127, 152, 173, 126, 60, 176, - 247, 60, 127, 125, 229, 149, 194, 90, 160, 160, 143, 40, 254, 27, 70, 255, - 186, 223, 0, 33, 126, 33, 232, 147, 98, 254, 16, 88, 89, 182, 185, 162, - 54, 240, 38, 211, 180, 67, 226, 138, 91, 160, 47, 8, 137, 36, 6, 25, - 142, 165, 184, 110, 232, 6, 7, 105, 18, 183, 136, 2, 39, 152, 241, 180, - 65, 81, 243, 147, 93, 199, 27, 50, 63, 53, 114, 150, 231, 139, 33, 228, - 243, 66, 45, 188, 172, 70, 8, 18, 167, 244, 229, 165, 207, 73, 234, 169, - 221, 70, 9, 162, 5, 231, 238, 114, 37, 136, 183, 150, 19, 55, 156, 68, - 95, 224, 90, 126, 47, 199, 210, 58, 99, 42, 63, 123, 42, 16, 63, 237, - 37, 28, 252, 234, 97, 99, 225, 175, 142, 43, 12, 48, 4, 183, 2, 144, - 181, 251, 248, 142, 153, 26, 167, 38, 241, 104, 119, 228, 114, 31, 205, 7, - 15, 225, 27, 145, 26, 50, 96, 230, 8, 100, 4, 32, 74, 114, 114, 124, - 189, 140, 42, 25, 84, 175, 127, 194, 99, 12, 93, 109, 176, 76, 247, 133, - 76, 28, 175, 43, 19, 196, 128, 98, 255, 81, 253, 215, 178, 252, 122, 89, - 248, 141, 181, 144, 138, 69, 160, 84, 192, 213, 26, 155, 166, 246, 141, 229, - 107, 162, 46, 233, 87, 24, 203, 167, 62, 173, 215, 56, 81, 65, 175, 54, - 239, 36, 10, 171, 130, 74, 90, 70, 85, 58, 179, 214, 16, 140, 142, 72, - 212, 211, 154, 206, 138, 124, 155, 18, 226, 245, 224, 76, 230, 70, 29, 106, - 146, 109, 74, 97, 17, 83, 81, 39, 250, 126, 210, 161, 147, 154, 172, 200, - 144, 54, 37, 64, 112, 128, 110, 158, 253, 140, 138, 234, 212, 83, 88, 166, - 117, 95, 65, 156, 240, 82, 242, 112, 82, 152, 100, 142, 50, 29, 204, 133, - 64, 224, 79, 188, 163, 44, 174, 206, 30, 53, 16, 157, 204, 6, 62, 253, - 57, 35, 84, 179, 228, 82, 246, 230, 83, 160, 134, 116, 67, 151, 247, 69, - 113, 210, 15, 241, 78, 19, 67, 168, 212, 95, 16, 190, 17, 121, 225, 250, - 131, 58, 197, 160, 77, 237, 144, 1, 90, 69, 159, 218, 94, 38, 13, 9, - 128, 162, 115, 26, 154, 60, 97, 112, 100, 140, 128, 243, 134, 158, 231, 210, - 150, 181, 39, 197, 120, 100, 172, 182, 198, 95, 43, 162, 224, 195, 61, 64, - 109, 34, 240, 210, 35, 39, 81, 161, 79, 133, 60, 202, 58, 153, 236, 15, - 139, 124, 203, 174, 175, 8, 121, 49, 131, 139, 98, 74, 164, 67, 242, 18, - 113, 229, 147, 88, 137, 135, 156, 119, 186, 218, 57, 68, 215, 145, 109, 135, - 224, 93, 77, 67, 255, 74, 51, 197, 127, 35, 129, 105, 249, 18, 249, 201, - 178, 124, 84, 158, 113, 169, 202, 44, 46, 210, 205, 162, 197, 131, 112, 68, - 184, 151, 175, 32, 6, 192, 28, 91, 165, 41, 57, 250, 230, 208, 177, 253, - 39, 3, 254, 175, 50, 127, 50, 231, 207, 17, 190, 72, 99, 23, 173, 93, - 230, 145, 251, 81, 223, 82, 139, 252, 226, 35, 92, 30, 25, 88, 145, 247, - 218, 253, 196, 13, 8, 199, 45, 178, 82, 213, 251, 228, 241, 168, 237, 36, - 18, 182, 155, 109, 14, 220, 29, 177, 133, 243, 122, 151, 123, 216, 180, 96, - 71, 144, 150, 17, 164, 44, 69, 215, 52, 139, 115, 195, 105, 211, 152, 227, - 127, 239, 157, 245, 31, 3, 30, 16, 188, 202, 116, 201, 112, 240, 96, 216, - 84, 82, 117, 86, 80, 70, 22, 175, 198, 167, 2, 179, 57, 10, 97, 116, - 198, 231, 45, 144, 151, 190, 116, 116, 114, 193, 194, 120, 14, 119, 75, 158, - 48, 176, 4, 125, 194, 63, 102, 71, 18, 135, 244, 205, 252, 157, 45, 204, - 209, 45, 178, 254, 197, 252, 84, 24, 46, 6, 219, 184, 234, 115, 117, 49, - 147, 111, 85, 25, 30, 182, 89, 189, 32, 163, 246, 34, 201, 113, 50, 241, - 37, 108, 68, 28, 90, 255, 44, 35, 20, 28, 189, 73, 79, 3, 120, 19, - 215, 7, 232, 213, 140, 191, 157, 30, 58, 27, 62, 144, 122, 68, 95, 19, - 191, 119, 173, 212, 152, 17, 45, 54, 217, 134, 188, 189, 211, 30, 3, 120, - 238, 82, 237, 176, 0, 0, 41, 22, 95, 27, 186, 115, 179, 36, 134, 146, - 56, 109, 237, 155, 167, 77, 12, 156, 48, 25, 210, 0, 34, 45, 168, 5, - 200, 208, 49, 48, 134, 167, 13, 80, 154, 102, 112, 59, 22, 227, 250, 73, - 231, 113, 147, 218, 146, 241, 171, 60, 96, 34, 129, 200, 157, 5, 118, 206, - 141, 68, 62, 41, 95, 157, 16, 71, 255, 212, 225, 202, 168, 248, 162, 130, - 192, 158, 150, 8, 19, 21, 247, 239, 69, 26, 66, 109, 121, 162, 85, 61, - 21, 155, 191, 48, 26, 215, 185, 41, 155, 180, 166, 162, 11, 207, 118, 183, - 26, 153, 221, 218, 243, 207, 79, 138, 15, 142, 138, 40, 40, 237, 38, 230, - 234, 127, 182, 111, 97, 180, 165, 101, 40, 135, 211, 44, 135, 214, 23, 248, - 78, 238, 236, 213, 53, 108, 92, 57, 6, 0, 250, 218, 247, 79, 198, 80, - 235, 113, 74, 75, 193, 163, 103, 177, 71, 246, 92, 201, 65, 66, 177, 197, - 120, 29, 37, 152, 130, 255, 11, 242, 49, 213, 0, 122, 175, 25, 252, 192, - 207, 169, 169, 176, 72, 3, 124, 121, 75, 32, 29, 165, 169, 113, 21, 210, - 146, 175, 247, 133, 110, 233, 130, 189, 196, 175, 179, 196, 170, 64, 233, 33, - 222, 64, 8, 60, 22, 167, 76, 163, 86, 123, 193, 246, 172, 146, 63, 78, - 201, 187, 234, 7, 236, 172, 76, 55, 158, 40, 230, 63, 241, 101, 58, 85, - 137, 156, 154, 45, 233, 146, 126, 224, 220, 50, 39, 158, 228, 235, 57, 53, - 220, 7, 112, 157, 59, 77, 43, 29, 34, 131, 213, 140, 8, 54, 123, 93, - 231, 47, 131, 98, 153, 0, 252, 4, 91, 34, 171, 175, 87, 253, 87, 164, - 3, 8, 154, 174, 69, 153, 118, 219, 93, 173, 151, 160, 19, 231, 105, 181, - 83, 231, 158, 6, 78, 59, 91, 29, 185, 186, 34, 145, 24, 162, 137, 181, - 208, 175, 10, 166, 34, 20, 35, 87, 234, 160, 214, 187, 163, 56, 204, 155, - 164, 89, 199, 249, 158, 145, 219, 92, 234, 133, 46, 104, 35, 2, 178, 4, - 211, 108, 123, 248, 92, 56, 211, 204, 95, 32, 63, 241, 169, 188, 174, 61, - 218, 246, 183, 167, 112, 71, 254, 228, 90, 26, 139, 153, 149, 99, 106, 155, - 20, 195, 206, 10, 148, 78, 73, 202, 60, 59, 120, 165, 188, 110, 160, 233, - 122, 109, 94, 173, 254, 99, 127, 166, 80, 8, 122, 148, 95, 225, 239, 42, - 37, 138, 146, 171, 229, 164, 218, 253, 8, 131, 85, 36, 44, 144, 209, 228, - 214, 243, 196, 134, 78, 125, 1, 52, 25, 64, 96, 78, 26, 213, 84, 234, - 4, 73, 30, 163, 123, 53, 25, 81, 127, 232, 165, 95, 101, 149, 210, 169, - 104, 97, 152, 192, 196, 175, 157, 19, 192, 200, 103, 94, 77, 8, 75, 170, - 207, 141, 228, 40, 124, 103, 186, 251, 161, 71, 77, 162, 231, 67, 253, 38, - 82, 179, 135, 169, 136, 246, 150, 78, 83, 173, 231, 218, 176, 218, 21, 98, - 37, 221, 238, 135, 14, 224, 18, 114, 170, 55, 146, 104, 138, 100, 169, 225, - 126, 197, 152, 223, 180, 115, 55, 210, 81, 90, 127, 28, 212, 21, 34, 162, - 250, 81, 112, 48, 85, 65, 29, 240, 3, 108, 15, 62, 252, 45, 93, 82, - 127, 189, 25, 89, 14, 250, 236, 188, 2, 68, 100, 92, 151, 78, 44, 56, - 61, 150, 80, 189, 26, 234, 130, 214, 233, 174, 34, 201, 132, 32, 254, 94, - 99, 124, 242, 181, 154, 240, 119, 27, 202, 197, 145, 215, 87, 152, 114, 170, - 165, 14, 74, 220, 112, 48, 103, 42, 76, 116, 137, 233, 146, 215, 85, 163, - 139, 40, 61, 170, 148, 15, 32, 145, 80, 246, 147, 121, 229, 104, 187, 132, - 82, 156, 99, 74, 210, 163, 201, 92, 191, 106, 232, 73, 175, 241, 87, 199, - 62, 63, 90, 167, 138, 85, 250, 244, 55, 170, 185, 220, 165, 184, 37, 250, - 81, 57, 162, 70, 26, 75, 201, 73, 200, 245, 220, 161, 47, 53, 46, 219, - 104, 73, 49, 215, 139, 117, 120, 120, 95, 180, 220, 225, 152, 175, 36, 37, - 138, 62, 118, 117, 67, 67, 173, 214, 170, 249, 243, 91, 13, 182, 207, 95, - 105, 21, 250, 135, 43, 212, 1, 160, 46, 195, 236, 164, 37, 224, 70, 98, - 172, 41, 194, 228, 240, 156, 212, 99, 177, 110, 124, 157, 142, 244, 88, 119, - 125, 226, 53, 112, 249, 194, 223, 99, 233, 184, 18, 191, 184, 237, 200, 250, - 249, 83, 93, 133, 205, 190, 222, 177, 177, 101, 124, 151, 195, 246, 247, 88, - 53, 0, 80, 133, 0, 223, 247, 180, 24, 68, 240, 135, 176, 142, 203, 180, - 140, 229, 50, 176, 46, 217, 211, 22, 82, 145, 96, 204, 175, 246, 47, 202, - 229, 7, 44, 191, 85, 194, 100, 230, 126, 135, 247, 24, 209, 180, 37, 66, - 122, 185, 12, 140, 10, 184, 207, 115, 195, 235, 134, 17, 50, 153, 167, 231, - 160, 224, 191, 150, 165, 128, 59, 26, 58, 136, 98, 214, 140, 154, 200, 67, - 82, 192, 195, 74, 110, 55, 195, 3, 47, 76, 150, 116, 190, 241, 98, 18, - 122, 112, 143, 161, 60, 14, 124, 101, 242, 225, 108, 144, 157, 49, 100, 228, - 220, 46, 95, 52, 188, 221, 159, 69, 1, 165, 126, 136, 150, 71, 5, 207, - 220, 57, 147, 78, 209, 99, 34, 49, 88, 198, 94, 139, 117, 240, 159, 166, - 170, 184, 77, 233, 7, 68, 177, 43, 41, 124, 34, 38, 44, 139, 26, 27, - 165, 73, 150, 113, 94, 154, 125, 153, 72, 209, 227, 207, 86, 140, 52, 134, - 96, 247, 97, 127, 46, 201, 223, 220, 79, 234, 27, 198, 246, 46, 140, 252, - 110, 84, 146, 33, 234, 214, 212, 118, 127, 239, 92, 90, 88, 201, 107, 233, - 231, 155, 146, 210, 215, 106, 248, 135, 118, 89, 220, 247, 123, 56, 182, 156, - 52, 0, 236, 146, 171, 25, 159, 34, 213, 185, 191, 161, 70, 174, 45, 137, - 232, 202, 137, 202, 65, 99, 203, 240, 41, 34, 167, 85, 221, 155, 188, 12, - 214, 43, 196, 157, 59, 171, 86, 251, 68, 196, 24, 95, 76, 152, 84, 124, - 46, 230, 104, 249, 106, 37, 69, 246, 223, 105, 27, 133, 59, 128, 21, 230, - 168, 174, 79, 107, 185, 1, 76, 177, 156, 132, 10, 223, 153, 155, 87, 164, - 55, 209, 151, 47, 20, 10, 183, 110, 58, 180, 208, 186, 82, 126, 93, 21, - 21, 169, 220, 226, 221, 52, 198, 200, 212, 175, 35, 193, 55, 181, 63, 38, - 181, 230, 18, 47, 207, 227, 132, 178, 179, 23, 249, 101, 42, 106, 224, 29, - 134, 177, 43, 157, 142, 44, 120, 80, 155, 183, 53, 36, 111, 114, 30, 197, - 21, 208, 85, 39, 197, 0, 222, 238, 114, 230, 165, 216, 144, 95, 207, 52, - 174, 241, 181, 80, 78, 246, 5, 151, 233, 174, 181, 18, 238, 150, 175, 65, - 164, 195, 111, 197, 191, 26, 10, 150, 93, 160, 220, 76, 26, 89, 4, 197, - 49, 180, 252, 58, 110, 54, 112, 228, 62, 143, 154, 77, 198, 76, 250, 131, - 183, 92, 229, 53, 14, 243, 8, 140, 125, 158, 179, 59, 194, 73, 198, 102, - 177, 145, 143, 33, 135, 35, 209, 30, 120, 247, 97, 58, 45, 96, 6, 135, - 6, 43, 72, 89, 98, 9, 202, 22, 112, 237, 254, 162, 126, 151, 64, 125, - 155, 213, 237, 40, 59, 200, 82, 160, 117, 198, 212, 243, 41, 250, 95, 69, - 173, 91, 54, 27, 45, 108, 53, 205, 22, 228, 64, 22, 84, 221, 3, 85, - 124, 149, 134, 105, 138, 52, 235, 98, 122, 3, 242, 245, 6, 121, 1, 93, - 162, 116, 178, 61, 229, 30, 134, 145, 77, 77, 255, 145, 203, 22, 178, 232, - 243, 104, 12, 29, 80, 237, 180, 156, 26, 77, 85, 86, 70, 100, 32, 9, - 89, 83, 175, 205, 170, 8, 69, 184, 55, 33, 166, 1, 152, 70, 204, 21, - 121, 248, 45, 62, 155, 82, 22, 192, 70, 36, 111, 128, 174, 231, 215, 79, - 23, 100, 142, 85, 240, 92, 82, 41, 95, 142, 145, 169, 16, 8, 107, 43, - 254, 56, 100, 60, 111, 173, 79, 236, 169, 245, 7, 219, 27, 97, 87, 109, - 154, 86, 100, 110, 244, 251, 110, 11, 180, 149, 50, 10, 51, 40, 125, 21, - 254, 170, 242, 121, 231, 243, 239, 3, 150, 129, 51, 43, 14, 218, 61, 216, - 55, 58, 250, 30, 174, 186, 222, 5, 94, 170, 216, 169, 248, 145, 117, 235, - 162, 76, 227, 215, 242, 148, 181, 92, 86, 135, 85, 179, 153, 228, 12, 164, - 158, 239, 80, 95, 159, 105, 33, 183, 175, 100, 155, 215, 56, 162, 165, 105, - 7, 222, 24, 116, 11, 14, 123, 111, 75, 187, 198, 26, 142, 101, 5, 84, - 19, 116, 215, 189, 248, 245, 6, 114, 19, 161, 90, 109, 223, 115, 22, 235, - 11, 202, 152, 151, 173, 6, 122, 61, 169, 75, 168, 57, 137, 187, 133, 149, - 62, 129, 151, 182, 247, 14, 3, 240, 155, 243, 99, 21, 238, 147, 195, 80, - 197, 184, 144, 99, 110, 56, 250, 25, 61, 70, 16, 89, 146, 239, 19, 164, - 198, 17, 50, 63, 182, 98, 242, 210, 56, 159, 143, 17, 84, 114, 28, 39, - 125, 63, 58, 64, 11, 20, 205, 182, 208, 20, 45, 186, 237, 225, 6, 190, - 219, 187, 130, 8, 226, 190, 228, 197, 24, 195, 244, 233, 127, 183, 222, 245, - 23, 248, 247, 255, 48, 166, 191, 249, 127, 253, 183, 215, 127, 73, 254, 170, - 215, 162, 252, 215, 127, 62, 10, 176, 253, 178, 122, 31, 230, 98, 237, 139, - 255, 242, 167, 82, 209, 239, 191, 84, 107, 113, 103, 255, 165, 92, 193, 191, - 253, 157, 77, 142, 38, 255, 203, 253, 231, 91, 254, 195, 255, 3, 65, 209, - 255, 245, 95, 192, 228, 239, 127, 253, 183, 23, 253, 183, 215, 191, 254, 60, - 182, 246, 223, 159, 254, 175, 139, 109, 255, 231, 150, 178, 168, 127, 79, 127, - 207, 55, 76, 252, 253, 215, 244, 247, 0, 189, 180, 63, 233, 241, 172, 183, - 200, 19, 75, 157, 220, 43, 173, 84, 126, 152, 30, 126, 145, 78, 129, 182, - 4, 184, 141, 40, 194, 128, 184, 82, 98, 188, 92, 108, 52, 147, 165, 38, - 131, 165, 156, 173, 70, 127, 135, 250, 68, 252, 171, 173, 39, 197, 33, 85, - 198, 210, 96, 221, 61, 19, 225, 130, 28, 182, 130, 82, 209, 225, 68, 186, - 138, 100, 214, 114, 237, 57, 46, 153, 65, 154, 119, 191, 195, 66, 254, 170, - 241, 176, 247, 80, 29, 98, 128, 94, 42, 134, 106, 76, 154, 18, 53, 204, - 76, 136, 145, 144, 215, 64, 19, 202, 122, 217, 153, 66, 145, 122, 117, 174, - 85, 82, 253, 212, 96, 157, 164, 175, 62, 7, 89, 60, 85, 201, 12, 85, - 252, 161, 254, 216, 110, 191, 129, 245, 64, 168, 202, 68, 6, 123, 146, 30, - 111, 183, 250, 132, 7, 97, 62, 236, 92, 194, 127, 168, 8, 158, 123, 183, - 139, 102, 229, 254, 237, 178, 195, 69, 2, 125, 246, 98, 253, 139, 120, 155, - 83, 57, 42, 152, 182, 52, 184, 154, 241, 141, 231, 144, 187, 181, 167, 127, - 197, 71, 173, 25, 143, 47, 26, 172, 214, 201, 13, 118, 203, 183, 244, 246, - 169, 129, 206, 76, 112, 199, 249, 195, 196, 253, 101, 250, 190, 207, 90, 176, - 127, 5, 220, 119, 242, 188, 105, 86, 30, 235, 167, 186, 50, 171, 51, 100, - 35, 221, 222, 42, 213, 223, 49, 29, 62, 106, 26, 216, 113, 32, 24, 66, - 18, 208, 178, 7, 227, 133, 3, 73, 151, 230, 66, 111, 227, 187, 74, 168, - 35, 135, 171, 61, 143, 171, 200, 144, 175, 246, 251, 32, 0, 174, 157, 8, - 110, 198, 118, 162, 155, 130, 185, 22, 155, 180, 8, 62, 113, 33, 32, 126, - 46, 44, 114, 130, 200, 79, 208, 203, 156, 205, 65, 144, 1, 233, 142, 213, - 78, 187, 246, 116, 181, 112, 117, 165, 92, 77, 25, 95, 117, 22, 71, 217, - 180, 229, 117, 168, 9, 229, 141, 7, 197, 180, 205, 89, 151, 222, 98, 187, - 250, 76, 139, 198, 198, 148, 118, 79, 183, 226, 68, 176, 121, 115, 22, 103, - 107, 153, 100, 189, 247, 235, 60, 27, 225, 172, 34, 174, 138, 28, 246, 116, - 182, 125, 93, 202, 101, 89, 149, 73, 54, 142, 62, 68, 188, 114, 152, 195, - 87, 167, 203, 142, 207, 139, 54, 76, 75, 46, 68, 190, 243, 160, 174, 221, - 55, 248, 28, 200, 107, 196, 235, 55, 73, 20, 57, 106, 212, 231, 60, 212, - 91, 235, 231, 24, 104, 222, 1, 136, 252, 218, 116, 225, 154, 127, 127, 136, - 196, 207, 62, 150, 215, 139, 54, 148, 161, 6, 231, 231, 246, 67, 126, 76, - 246, 188, 180, 71, 155, 229, 219, 26, 37, 27, 91, 212, 107, 42, 4, 90, - 203, 222, 251, 157, 73, 103, 43, 142, 49, 203, 204, 209, 188, 167, 225, 124, - 228, 99, 124, 100, 163, 220, 197, 194, 55, 244, 135, 151, 116, 145, 190, 8, - 95, 133, 228, 7, 180, 225, 118, 184, 234, 64, 191, 85, 121, 40, 80, 111, - 48, 66, 189, 167, 67, 183, 167, 82, 162, 173, 78, 185, 56, 75, 56, 23, - 114, 146, 252, 44, 26, 228, 44, 236, 113, 219, 243, 183, 192, 135, 115, 205, - 129, 125, 209, 124, 170, 85, 177, 157, 112, 90, 228, 58, 66, 155, 190, 21, - 253, 52, 24, 133, 180, 22, 240, 49, 9, 124, 43, 64, 2, 41, 67, 104, - 221, 13, 104, 215, 235, 33, 192, 132, 46, 222, 233, 58, 204, 112, 227, 79, - 253, 54, 186, 138, 248, 167, 64, 247, 177, 18, 121, 203, 19, 252, 54, 26, - 4, 54, 133, 175, 41, 236, 253, 60, 240, 41, 192, 225, 105, 234, 157, 172, - 95, 139, 227, 48, 173, 149, 118, 245, 38, 161, 183, 125, 184, 106, 15, 124, - 45, 11, 159, 14, 203, 225, 92, 98, 160, 33, 252, 30, 233, 128, 123, 30, - 82, 232, 57, 162, 191, 99, 189, 9, 78, 3, 97, 54, 29, 221, 166, 109, - 125, 84, 11, 232, 127, 169, 144, 204, 73, 64, 149, 216, 246, 75, 177, 24, - 47, 36, 63, 138, 144, 239, 55, 9, 122, 214, 233, 117, 40, 130, 229, 35, - 132, 190, 182, 195, 209, 154, 245, 224, 140, 249, 96, 160, 243, 206, 236, 85, - 185, 253, 33, 30, 244, 247, 235, 203, 34, 224, 145, 24, 70, 140, 148, 143, - 118, 185, 42, 194, 234, 207, 198, 95, 51, 212, 220, 46, 189, 146, 153, 210, - 130, 238, 223, 151, 177, 136, 219, 13, 145, 218, 241, 236, 71, 52, 99, 156, - 240, 10, 105, 201, 14, 14, 1, 165, 220, 104, 226, 7, 143, 1, 99, 241, - 46, 123, 204, 192, 38, 100, 189, 85, 20, 228, 218, 232, 231, 157, 213, 36, - 157, 28, 40, 96, 134, 46, 89, 240, 144, 228, 219, 178, 125, 40, 217, 21, - 215, 122, 145, 41, 124, 204, 45, 246, 128, 141, 247, 69, 11, 172, 89, 136, - 83, 174, 162, 88, 170, 169, 145, 150, 29, 128, 181, 117, 205, 10, 32, 51, - 176, 111, 9, 16, 248, 104, 128, 56, 24, 126, 194, 111, 77, 66, 164, 1, - 246, 90, 118, 148, 126, 171, 236, 67, 43, 197, 46, 42, 254, 66, 140, 65, - 109, 123, 213, 145, 130, 141, 108, 162, 24, 245, 181, 229, 224, 45, 21, 247, - 204, 21, 176, 53, 148, 33, 254, 251, 197, 149, 105, 143, 137, 208, 184, 178, - 53, 185, 78, 240, 53, 94, 125, 77, 206, 63, 246, 29, 168, 9, 33, 239, - 24, 65, 73, 86, 52, 5, 239, 234, 100, 176, 24, 93, 28, 153, 42, 221, - 196, 28, 142, 191, 43, 249, 100, 249, 183, 233, 205, 125, 104, 29, 244, 138, - 248, 16, 195, 211, 203, 37, 190, 229, 116, 84, 87, 100, 196, 213, 239, 252, - 76, 186, 132, 45, 82, 152, 184, 21, 194, 89, 253, 40, 173, 172, 197, 9, - 44, 90, 214, 217, 195, 67, 133, 177, 234, 168, 48, 136, 146, 33, 195, 218, - 21, 126, 22, 85, 92, 151, 14, 175, 79, 232, 2, 40, 33, 250, 181, 150, - 216, 238, 73, 184, 76, 95, 50, 11, 104, 108, 225, 3, 171, 187, 63, 230, - 83, 200, 242, 80, 123, 75, 210, 167, 171, 220, 127, 32, 234, 98, 16, 157, - 74, 190, 55, 70, 134, 229, 247, 249, 121, 49, 186, 225, 124, 185, 0, 97, - 55, 17, 142, 177, 198, 9, 28, 5, 99, 156, 126, 106, 113, 20, 120, 232, - 240, 181, 188, 168, 53, 115, 58, 45, 47, 12, 90, 111, 50, 41, 245, 249, - 161, 221, 207, 127, 44, 136, 92, 27, 64, 134, 116, 55, 167, 243, 111, 148, - 152, 222, 88, 12, 193, 83, 95, 142, 57, 46, 129, 43, 155, 144, 25, 248, - 89, 234, 231, 110, 187, 237, 11, 38, 3, 134, 44, 94, 174, 50, 75, 130, - 68, 210, 150, 109, 172, 112, 252, 27, 183, 253, 190, 191, 212, 54, 236, 48, - 85, 176, 252, 157, 61, 29, 174, 239, 124, 107, 106, 148, 36, 156, 249, 230, - 204, 208, 102, 181, 123, 186, 206, 172, 21, 226, 73, 32, 108, 22, 179, 221, - 132, 131, 107, 241, 72, 2, 207, 49, 74, 148, 160, 135, 208, 125, 146, 241, - 76, 42, 40, 143, 105, 138, 146, 107, 228, 82, 129, 13, 242, 187, 225, 111, - 60, 16, 14, 182, 155, 52, 24, 209, 191, 175, 105, 187, 27, 94, 83, 2, - 121, 8, 178, 39, 37, 182, 127, 126, 30, 19, 23, 233, 73, 243, 190, 55, - 190, 69, 90, 20, 152, 178, 112, 118, 9, 178, 168, 42, 100, 28, 28, 33, - 251, 27, 72, 141, 55, 132, 227, 5, 182, 66, 75, 154, 125, 136, 239, 248, - 101, 251, 164, 84, 215, 150, 87, 110, 169, 81, 87, 138, 69, 145, 187, 210, - 20, 76, 59, 177, 47, 1, 244, 93, 15, 52, 171, 139, 29, 23, 254, 53, - 138, 100, 129, 157, 162, 160, 84, 226, 139, 123, 208, 254, 1, 208, 170, 11, - 9, 127, 5, 65, 186, 223, 168, 153, 151, 86, 251, 52, 80, 235, 183, 193, - 76, 46, 138, 148, 111, 198, 197, 116, 46, 140, 239, 87, 136, 170, 162, 210, - 99, 86, 115, 149, 249, 97, 139, 167, 18, 186, 96, 155, 228, 39, 112, 18, - 15, 176, 169, 129, 251, 89, 71, 235, 167, 165, 72, 172, 166, 216, 6, 159, - 71, 125, 34, 140, 177, 10, 89, 222, 130, 127, 143, 251, 74, 81, 84, 202, - 212, 244, 11, 90, 89, 183, 23, 81, 63, 78, 79, 178, 70, 82, 171, 157, - 31, 240, 248, 24, 123, 219, 29, 149, 89, 140, 41, 158, 196, 93, 180, 95, - 150, 142, 75, 125, 250, 194, 21, 70, 29, 47, 149, 159, 198, 93, 9, 217, - 113, 105, 99, 60, 160, 126, 158, 253, 252, 243, 193, 121, 252, 172, 216, 140, - 144, 141, 201, 97, 212, 229, 216, 158, 133, 100, 86, 5, 237, 6, 8, 143, - 159, 125, 252, 110, 179, 121, 59, 61, 213, 145, 66, 201, 34, 79, 25, 237, - 236, 44, 200, 120, 39, 139, 130, 216, 109, 145, 39, 139, 20, 151, 248, 154, - 178, 39, 5, 239, 6, 72, 4, 205, 92, 52, 52, 133, 228, 193, 144, 188, - 36, 184, 104, 104, 50, 91, 164, 104, 200, 145, 41, 218, 19, 160, 46, 124, - 61, 175, 50, 205, 138, 57, 227, 200, 120, 142, 153, 151, 95, 19, 230, 238, - 151, 44, 109, 3, 93, 177, 98, 4, 117, 130, 39, 126, 192, 172, 48, 132, - 17, 106, 187, 225, 153, 137, 189, 247, 23, 106, 76, 97, 92, 229, 1, 167, - 0, 114, 245, 245, 75, 201, 49, 87, 221, 70, 139, 63, 161, 68, 93, 137, - 182, 29, 173, 164, 214, 192, 170, 153, 64, 155, 45, 213, 96, 177, 147, 18, - 2, 155, 154, 66, 2, 0, 196, 155, 238, 198, 28, 13, 13, 120, 25, 116, - 123, 53, 224, 86, 159, 9, 172, 6, 209, 193, 249, 232, 32, 183, 47, 195, - 153, 28, 65, 117, 35, 169, 43, 80, 162, 211, 69, 147, 31, 9, 191, 156, - 54, 42, 255, 160, 58, 166, 69, 102, 124, 63, 122, 162, 168, 23, 116, 123, - 145, 54, 231, 182, 132, 139, 139, 108, 24, 135, 174, 209, 247, 184, 154, 101, - 120, 43, 192, 124, 207, 219, 185, 49, 239, 61, 185, 62, 18, 119, 13, 44, - 47, 80, 20, 222, 98, 108, 199, 14, 182, 77, 241, 148, 107, 29, 161, 118, - 99, 94, 213, 107, 29, 55, 168, 11, 17, 193, 108, 29, 175, 42, 44, 61, - 202, 33, 208, 16, 194, 246, 200, 107, 220, 41, 248, 131, 58, 205, 49, 164, - 169, 31, 11, 57, 23, 88, 121, 253, 233, 212, 13, 110, 230, 245, 98, 198, - 63, 178, 76, 169, 33, 139, 138, 194, 45, 160, 94, 137, 93, 124, 168, 96, - 132, 253, 207, 28, 47, 64, 33, 1, 155, 247, 6, 241, 221, 113, 69, 19, - 185, 169, 61, 56, 117, 252, 182, 124, 248, 216, 170, 229, 225, 150, 69, 213, - 20, 52, 220, 208, 76, 49, 51, 205, 72, 244, 51, 86, 212, 86, 249, 100, - 97, 203, 19, 255, 221, 125, 171, 226, 166, 145, 142, 230, 86, 80, 6, 31, - 97, 167, 101, 27, 129, 64, 65, 124, 221, 222, 227, 50, 83, 235, 69, 175, - 194, 179, 97, 74, 5, 206, 171, 96, 173, 174, 3, 114, 91, 202, 164, 54, - 206, 160, 146, 213, 155, 148, 53, 187, 253, 32, 33, 118, 35, 200, 92, 118, - 245, 162, 29, 129, 62, 142, 231, 28, 191, 207, 208, 81, 156, 148, 76, 175, - 204, 239, 170, 86, 183, 114, 58, 25, 29, 149, 143, 52, 41, 58, 191, 231, - 221, 58, 18, 121, 116, 211, 61, 58, 45, 183, 107, 103, 211, 38, 40, 243, - 185, 126, 71, 95, 253, 236, 111, 95, 119, 240, 178, 175, 104, 223, 107, 116, - 245, 107, 12, 205, 114, 97, 131, 50, 213, 112, 3, 15, 249, 166, 60, 193, - 240, 8, 20, 105, 123, 227, 193, 58, 14, 8, 106, 13, 68, 53, 45, 243, - 23, 113, 59, 145, 103, 32, 218, 170, 233, 64, 239, 33, 34, 202, 97, 0, - 188, 160, 28, 121, 94, 102, 26, 248, 241, 22, 34, 121, 11, 23, 217, 119, - 217, 131, 133, 63, 120, 140, 24, 57, 27, 233, 89, 89, 190, 218, 253, 104, - 95, 144, 110, 194, 115, 227, 241, 215, 117, 250, 212, 169, 93, 220, 194, 164, - 164, 51, 107, 2, 255, 118, 77, 207, 157, 238, 227, 80, 109, 44, 37, 210, - 49, 59, 20, 242, 138, 67, 63, 128, 17, 133, 221, 130, 158, 145, 22, 169, - 81, 170, 111, 46, 45, 149, 133, 186, 179, 88, 108, 168, 32, 69, 225, 120, - 144, 36, 9, 62, 224, 115, 222, 73, 22, 48, 143, 223, 110, 171, 245, 165, - 149, 231, 244, 59, 63, 198, 66, 77, 238, 95, 193, 134, 32, 154, 176, 230, - 218, 84, 194, 27, 171, 48, 124, 78, 33, 26, 85, 58, 92, 7, 121, 138, - 98, 213, 78, 100, 115, 121, 198, 43, 181, 129, 240, 216, 198, 43, 32, 191, - 122, 68, 244, 33, 58, 50, 236, 163, 249, 153, 67, 192, 252, 242, 45, 56, - 203, 79, 250, 219, 216, 56, 241, 87, 69, 97, 36, 182, 160, 22, 214, 222, - 163, 192, 254, 147, 221, 190, 6, 0, 91, 37, 46, 61, 244, 175, 236, 86, - 158, 232, 89, 31, 19, 253, 14, 168, 10, 63, 70, 127, 169, 120, 119, 248, - 220, 146, 157, 74, 42, 127, 46, 77, 227, 60, 8, 152, 198, 181, 112, 109, - 90, 158, 187, 91, 79, 87, 201, 169, 237, 97, 113, 84, 96, 139, 130, 173, - 225, 169, 133, 27, 145, 122, 3, 107, 156, 56, 68, 51, 79, 94, 215, 180, - 199, 185, 62, 199, 108, 128, 120, 30, 230, 99, 243, 165, 62, 219, 103, 250, - 125, 34, 182, 227, 94, 184, 168, 42, 175, 67, 60, 198, 164, 106, 70, 173, - 39, 169, 6, 36, 32, 255, 150, 199, 194, 143, 228, 119, 147, 213, 117, 97, - 135, 162, 125, 150, 22, 72, 219, 44, 12, 166, 243, 12, 95, 67, 68, 167, - 136, 195, 12, 116, 168, 181, 30, 23, 242, 180, 80, 180, 10, 135, 40, 148, - 238, 49, 6, 255, 146, 61, 30, 181, 181, 245, 155, 98, 191, 48, 175, 40, - 248, 124, 69, 238, 27, 147, 237, 158, 127, 214, 149, 199, 186, 15, 66, 93, - 172, 151, 40, 172, 13, 126, 162, 105, 10, 53, 104, 210, 233, 72, 75, 28, - 219, 17, 181, 76, 176, 0, 78, 84, 171, 152, 245, 19, 18, 8, 113, 151, - 49, 139, 28, 244, 149, 25, 226, 87, 109, 25, 101, 73, 146, 198, 51, 239, - 57, 115, 48, 132, 250, 245, 111, 212, 85, 85, 147, 232, 80, 118, 36, 72, - 28, 52, 250, 186, 8, 232, 241, 100, 208, 63, 77, 30, 186, 0, 193, 130, - 47, 233, 63, 191, 128, 111, 36, 216, 174, 92, 137, 251, 20, 87, 45, 205, - 61, 208, 133, 63, 46, 209, 153, 80, 243, 191, 244, 48, 180, 42, 219, 76, - 47, 2, 4, 242, 211, 13, 98, 112, 6, 86, 134, 14, 173, 197, 193, 147, - 177, 42, 206, 171, 75, 47, 56, 189, 47, 185, 234, 217, 130, 41, 105, 146, - 128, 206, 19, 28, 115, 49, 74, 236, 218, 148, 15, 125, 83, 12, 155, 145, - 177, 216, 121, 205, 9, 138, 211, 242, 253, 233, 149, 107, 215, 171, 35, 255, - 116, 15, 91, 69, 121, 204, 245, 26, 89, 81, 181, 198, 131, 252, 201, 46, - 86, 80, 179, 12, 207, 81, 25, 61, 225, 126, 193, 190, 239, 255, 102, 119, - 111, 121, 51, 153, 244, 216, 137, 31, 99, 239, 185, 87, 153, 10, 29, 69, - 134, 76, 39, 189, 78, 126, 222, 116, 90, 70, 72, 10, 208, 220, 24, 165, - 253, 119, 90, 73, 157, 155, 75, 221, 233, 199, 150, 212, 174, 216, 7, 167, - 88, 22, 214, 107, 0, 69, 148, 54, 139, 127, 106, 140, 103, 204, 173, 17, - 66, 17, 49, 59, 57, 39, 67, 193, 46, 95, 41, 194, 36, 64, 16, 72, - 125, 158, 244, 242, 248, 36, 31, 134, 243, 151, 182, 164, 225, 52, 149, 6, - 97, 193, 66, 27, 106, 191, 66, 94, 20, 23, 6, 228, 212, 111, 96, 102, - 64, 177, 203, 226, 199, 172, 55, 134, 236, 216, 157, 150, 40, 81, 131, 242, - 94, 234, 207, 59, 241, 171, 178, 217, 16, 192, 145, 39, 66, 136, 6, 64, - 83, 44, 157, 73, 184, 123, 172, 223, 184, 103, 106, 6, 64, 64, 176, 34, - 49, 45, 159, 33, 18, 63, 188, 161, 14, 154, 229, 180, 18, 206, 206, 203, - 237, 123, 185, 43, 136, 103, 165, 83, 91, 192, 58, 2, 159, 157, 232, 215, - 60, 222, 115, 136, 246, 32, 77, 232, 150, 198, 170, 251, 129, 185, 12, 205, - 19, 92, 215, 46, 113, 130, 190, 1, 144, 165, 81, 67, 158, 150, 123, 164, - 221, 228, 103, 217, 41, 91, 254, 126, 109, 207, 92, 36, 224, 27, 133, 49, - 206, 0, 12, 17, 235, 248, 148, 249, 1, 182, 135, 167, 135, 210, 44, 180, - 211, 157, 155, 114, 103, 189, 227, 124, 139, 50, 178, 187, 71, 2, 148, 97, - 142, 60, 24, 201, 246, 27, 1, 190, 216, 132, 15, 99, 3, 12, 47, 52, - 13, 103, 155, 145, 217, 108, 94, 179, 186, 149, 196, 118, 202, 230, 103, 222, - 67, 20, 198, 190, 192, 107, 18, 190, 224, 65, 28, 43, 64, 22, 198, 247, - 67, 28, 118, 194, 16, 231, 246, 73, 238, 63, 169, 147, 236, 79, 199, 108, - 230, 25, 192, 171, 116, 77, 172, 155, 19, 10, 42, 184, 154, 189, 22, 136, - 63, 175, 250, 133, 143, 134, 20, 184, 105, 15, 6, 190, 165, 195, 201, 245, - 10, 161, 94, 17, 104, 156, 215, 196, 207, 225, 104, 135, 22, 216, 179, 89, - 236, 3, 111, 3, 70, 240, 193, 206, 111, 139, 190, 42, 159, 250, 217, 167, - 174, 122, 86, 161, 109, 122, 176, 162, 97, 66, 163, 69, 16, 253, 162, 99, - 129, 163, 144, 177, 146, 187, 127, 152, 98, 5, 101, 86, 255, 179, 27, 20, - 22, 245, 112, 4, 201, 24, 29, 157, 143, 57, 234, 16, 112, 16, 195, 83, - 20, 104, 234, 223, 232, 7, 124, 229, 226, 251, 113, 27, 68, 175, 6, 211, - 224, 148, 24, 101, 210, 73, 212, 21, 82, 2, 20, 8, 158, 24, 64, 195, - 124, 55, 191, 13, 148, 185, 234, 133, 95, 85, 45, 244, 39, 208, 102, 221, - 23, 36, 198, 224, 216, 231, 250, 217, 12, 210, 24, 243, 5, 45, 119, 19, - 181, 94, 77, 195, 110, 35, 73, 144, 195, 175, 233, 50, 132, 4, 203, 106, - 103, 31, 211, 95, 6, 128, 164, 210, 110, 246, 76, 68, 138, 136, 172, 112, - 171, 79, 13, 159, 207, 4, 95, 205, 103, 33, 189, 195, 204, 183, 155, 252, - 54, 113, 5, 147, 108, 21, 143, 82, 237, 65, 99, 219, 67, 184, 113, 33, - 241, 81, 20, 24, 79, 140, 95, 206, 152, 189, 45, 72, 18, 219, 137, 179, - 248, 79, 102, 198, 56, 224, 186, 93, 119, 215, 42, 182, 233, 92, 213, 192, - 83, 175, 82, 88, 146, 30, 65, 189, 126, 22, 203, 16, 119, 186, 181, 58, - 62, 105, 57, 9, 160, 193, 124, 62, 161, 171, 68, 177, 254, 1, 74, 77, - 151, 198, 10, 105, 252, 57, 223, 91, 102, 234, 101, 183, 152, 22, 38, 137, - 25, 131, 251, 121, 182, 251, 184, 20, 36, 78, 200, 26, 81, 162, 117, 22, - 46, 60, 197, 130, 125, 132, 199, 97, 88, 234, 67, 164, 156, 90, 156, 138, - 81, 130, 166, 123, 220, 17, 94, 175, 130, 185, 136, 119, 53, 248, 23, 223, - 141, 198, 29, 242, 206, 106, 238, 81, 251, 122, 86, 197, 163, 125, 146, 87, - 68, 235, 22, 217, 188, 221, 140, 22, 38, 96, 226, 139, 124, 162, 213, 202, - 24, 7, 52, 183, 225, 53, 186, 150, 48, 127, 200, 89, 178, 9, 254, 197, - 89, 233, 157, 77, 63, 6, 231, 59, 218, 14, 173, 24, 107, 88, 81, 13, - 36, 200, 206, 24, 242, 106, 199, 186, 248, 28, 139, 104, 47, 157, 35, 168, - 40, 80, 190, 244, 16, 115, 101, 78, 198, 160, 183, 144, 93, 170, 112, 165, - 34, 166, 149, 91, 70, 235, 112, 40, 94, 224, 208, 179, 83, 195, 17, 12, - 242, 80, 44, 93, 195, 163, 62, 174, 164, 13, 59, 245, 162, 96, 151, 176, - 149, 56, 206, 15, 145, 31, 57, 148, 108, 62, 241, 9, 157, 46, 221, 75, - 144, 204, 40, 216, 199, 228, 135, 229, 151, 149, 119, 127, 253, 32, 155, 161, - 199, 34, 121, 229, 6, 213, 119, 248, 69, 51, 146, 182, 221, 62, 202, 214, - 156, 141, 130, 25, 157, 151, 236, 236, 50, 148, 148, 227, 122, 34, 71, 58, - 211, 101, 144, 32, 166, 75, 186, 66, 161, 194, 206, 74, 173, 221, 228, 60, - 156, 249, 163, 76, 231, 184, 131, 142, 177, 138, 194, 106, 153, 88, 229, 201, - 229, 163, 133, 150, 190, 35, 200, 198, 105, 179, 192, 107, 150, 7, 205, 0, - 203, 210, 196, 145, 70, 159, 141, 59, 150, 168, 133, 117, 87, 113, 154, 44, - 180, 41, 231, 11, 215, 145, 85, 243, 31, 77, 174, 28, 176, 105, 27, 162, - 111, 98, 193, 9, 27, 105, 90, 116, 155, 81, 189, 201, 69, 235, 92, 22, - 180, 106, 228, 183, 135, 244, 212, 207, 253, 133, 244, 152, 248, 12, 44, 12, - 178, 194, 71, 40, 86, 189, 32, 153, 44, 93, 161, 201, 237, 47, 95, 234, - 111, 75, 46, 59, 178, 77, 143, 114, 89, 6, 102, 155, 96, 247, 207, 19, - 169, 13, 59, 189, 10, 67, 218, 249, 209, 240, 90, 225, 181, 82, 224, 75, - 54, 63, 176, 120, 189, 102, 12, 55, 215, 177, 197, 82, 248, 10, 178, 192, - 226, 63, 184, 233, 112, 115, 253, 39, 61, 168, 158, 146, 211, 108, 146, 51, - 63, 29, 151, 213, 212, 171, 178, 169, 95, 21, 26, 148, 28, 198, 17, 22, - 204, 150, 127, 73, 5, 117, 163, 62, 30, 200, 156, 52, 10, 26, 72, 193, - 64, 156, 203, 90, 115, 82, 251, 197, 191, 2, 224, 213, 42, 155, 212, 100, - 186, 205, 57, 142, 64, 203, 244, 70, 55, 168, 15, 85, 145, 21, 137, 117, - 158, 105, 222, 226, 203, 94, 151, 208, 126, 168, 50, 140, 230, 245, 163, 32, - 97, 187, 238, 54, 201, 5, 135, 12, 255, 74, 253, 33, 75, 102, 42, 198, - 209, 117, 20, 158, 112, 45, 120, 42, 51, 29, 150, 10, 133, 19, 50, 184, - 57, 136, 170, 170, 60, 175, 33, 206, 250, 5, 163, 38, 201, 190, 131, 222, - 90, 45, 229, 86, 211, 76, 42, 91, 59, 58, 186, 141, 165, 39, 54, 94, - 151, 168, 250, 140, 166, 248, 148, 253, 227, 225, 44, 197, 131, 212, 82, 120, - 233, 116, 153, 50, 99, 125, 125, 76, 53, 2, 45, 0, 21, 126, 56, 149, - 44, 245, 8, 69, 233, 30, 49, 224, 64, 182, 173, 7, 103, 158, 152, 76, - 141, 225, 210, 50, 136, 93, 147, 114, 216, 151, 128, 85, 195, 222, 198, 188, - 190, 109, 18, 191, 124, 102, 215, 206, 167, 251, 255, 123, 233, 181, 156, 246, - 181, 184, 127, 255, 253, 178, 171, 243, 111, 235, 172, 105, 242, 219, 154, 98, - 252, 139, 255, 199, 251, 254, 172, 186, 254, 51, 105, 240, 79, 90, 225, 127, - 250, 231, 202, 234, 190, 246, 127, 253, 235, 159, 26, 123, 221, 255, 241, 183, - 255, 248, 151, 164, 81, 2, 247, 151, 91, 36, 195, 95, 224, 95, 194, 159, - 244, 197, 191, 212, 36, 157, 214, 100, 155, 214, 251, 175, 255, 252, 23, 163, - 219, 206, 95, 158, 102, 255, 245, 129, 8, 228, 175, 255, 244, 183, 255, 249, - 159, 13, 58, 207, 243, 191, 54, 227, 255, 57, 39, 85, 241, 191, 55, 249, - 191, 98, 24, 250, 31, 250, 100, 172, 254, 181, 24, 255, 246, 63, 76, 86, - 252, 63, 254, 246, 223, 164, 84, 254, 163, 116, 205, 220, 239, 213, 127, 110, - 198, 191, 222, 127, 254, 89, 220, 205, 255, 154, 198, 191, 222, 78, 252, 53, - 205, 197, 248, 159, 255, 173, 94, 254, 219, 220, 116, 77, 214, 166, 248, 71, - 106, 229, 63, 170, 169, 252, 73, 160, 252, 199, 34, 242, 159, 108, 74, 105, - 168, 254, 113, 252, 31, 25, 0, 120, 59, 51, 204, 127, 106, 207, 253, 251, - 127, 64, 101, 174, 83, 86, 252, 126, 127, 242, 44, 213, 127, 92, 229, 254, - 79, 255, 243, 63, 27, 240, 207, 98, 66, 127, 37, 219, 255, 242, 63, 110, - 240, 255, 69, 217, 149, 20, 248, 239, 217, 149, 227, 249, 16, 216, 127, 83, - 145, 133, 161, 254, 108, 122, 88, 28, 75, 87, 153, 201, 93, 150, 196, 90, - 152, 194, 211, 153, 192, 156, 167, 37, 216, 63, 83, 114, 218, 171, 190, 179, - 201, 129, 95, 176, 118, 137, 181, 98, 184, 206, 132, 170, 23, 90, 26, 195, - 127, 194, 38, 119, 100, 204, 184, 170, 80, 160, 43, 52, 20, 58, 87, 101, - 173, 148, 59, 177, 66, 180, 47, 38, 65, 171, 251, 157, 251, 137, 72, 131, - 123, 86, 59, 162, 121, 245, 145, 223, 235, 167, 126, 117, 185, 104, 111, 186, - 82, 235, 122, 17, 85, 135, 230, 146, 33, 71, 141, 199, 136, 28, 117, 219, - 181, 86, 233, 53, 72, 45, 4, 90, 204, 77, 176, 211, 61, 97, 218, 88, - 173, 228, 80, 131, 212, 80, 153, 240, 90, 140, 54, 158, 92, 238, 210, 64, - 233, 53, 174, 39, 225, 142, 117, 80, 110, 13, 212, 84, 110, 27, 13, 242, - 163, 244, 126, 243, 204, 217, 253, 178, 200, 98, 76, 118, 93, 74, 177, 77, - 182, 82, 67, 15, 218, 101, 45, 242, 189, 240, 115, 242, 245, 213, 171, 174, - 107, 137, 28, 164, 123, 156, 208, 23, 211, 15, 121, 145, 27, 241, 232, 22, - 225, 217, 219, 32, 221, 187, 190, 192, 11, 152, 161, 237, 251, 230, 198, 143, - 68, 132, 130, 14, 218, 142, 76, 155, 45, 212, 72, 204, 11, 75, 54, 156, - 68, 136, 83, 249, 116, 143, 143, 74, 214, 72, 55, 207, 201, 181, 157, 169, - 21, 193, 30, 10, 49, 46, 34, 122, 172, 8, 210, 199, 208, 242, 139, 32, - 183, 136, 93, 184, 51, 156, 98, 117, 110, 197, 181, 27, 177, 66, 245, 226, - 5, 153, 28, 247, 221, 143, 249, 83, 119, 117, 37, 182, 55, 0, 156, 87, - 251, 234, 144, 65, 107, 128, 219, 159, 183, 80, 157, 6, 107, 193, 161, 86, - 107, 31, 203, 159, 87, 135, 125, 156, 188, 237, 167, 22, 255, 237, 218, 171, - 91, 203, 128, 251, 248, 254, 117, 57, 12, 98, 153, 182, 225, 101, 124, 97, - 166, 190, 35, 183, 83, 235, 94, 4, 2, 61, 121, 200, 38, 143, 41, 236, - 43, 133, 120, 48, 146, 190, 152, 124, 167, 65, 221, 6, 112, 212, 189, 227, - 57, 202, 140, 206, 107, 176, 251, 228, 23, 138, 20, 87, 117, 235, 143, 86, - 139, 23, 129, 247, 141, 72, 140, 183, 136, 181, 13, 175, 105, 176, 183, 105, - 13, 136, 119, 13, 59, 151, 14, 24, 175, 211, 249, 170, 236, 18, 106, 106, - 16, 121, 146, 175, 108, 119, 33, 249, 186, 194, 36, 108, 191, 156, 197, 146, - 171, 218, 172, 91, 97, 163, 99, 118, 61, 31, 210, 72, 31, 248, 199, 194, - 103, 220, 122, 19, 198, 210, 109, 208, 219, 186, 95, 125, 20, 136, 253, 12, - 142, 137, 214, 246, 245, 211, 175, 2, 244, 236, 20, 255, 108, 196, 176, 207, - 235, 118, 196, 109, 189, 98, 253, 146, 32, 213, 173, 222, 4, 212, 54, 227, - 89, 93, 32, 92, 209, 199, 124, 125, 192, 253, 82, 210, 231, 86, 194, 103, - 147, 220, 108, 137, 104, 37, 19, 225, 225, 165, 156, 193, 22, 230, 202, 240, - 95, 29, 10, 157, 128, 254, 248, 184, 213, 184, 123, 214, 48, 131, 71, 131, - 228, 82, 63, 101, 92, 191, 54, 211, 54, 63, 184, 110, 86, 231, 140, 166, - 155, 60, 98, 119, 180, 26, 147, 164, 210, 93, 168, 18, 119, 64, 88, 237, - 112, 37, 122, 31, 27, 46, 55, 211, 106, 55, 94, 45, 219, 29, 10, 171, - 90, 241, 235, 246, 82, 27, 255, 38, 19, 12, 135, 145, 139, 94, 34, 140, - 229, 161, 126, 103, 2, 24, 12, 8, 110, 155, 72, 201, 52, 2, 163, 164, - 253, 73, 248, 240, 93, 231, 189, 191, 133, 190, 204, 105, 62, 237, 122, 28, - 144, 39, 221, 141, 103, 93, 119, 91, 29, 239, 219, 15, 136, 79, 12, 202, - 4, 141, 114, 222, 42, 98, 191, 186, 9, 186, 146, 6, 152, 48, 130, 128, - 177, 244, 158, 81, 184, 139, 6, 225, 40, 123, 184, 12, 125, 244, 179, 251, - 235, 48, 240, 54, 18, 116, 201, 29, 61, 78, 232, 48, 178, 172, 57, 2, - 236, 214, 101, 128, 3, 38, 7, 111, 42, 129, 204, 230, 112, 76, 243, 21, - 136, 223, 192, 65, 147, 188, 66, 249, 200, 133, 15, 226, 7, 65, 128, 225, - 133, 196, 202, 202, 93, 139, 15, 235, 27, 125, 78, 34, 124, 247, 36, 72, - 211, 220, 21, 125, 102, 235, 196, 63, 224, 80, 142, 255, 168, 200, 194, 82, - 86, 87, 243, 246, 100, 170, 77, 11, 248, 45, 1, 56, 37, 1, 128, 7, - 142, 38, 174, 45, 14, 232, 220, 133, 37, 241, 5, 85, 231, 183, 72, 53, - 102, 154, 127, 126, 135, 146, 127, 222, 240, 164, 72, 82, 119, 127, 142, 255, - 253, 199, 124, 80, 114, 15, 233, 21, 255, 88, 30, 248, 223, 156, 47, 209, - 15, 169, 163, 209, 69, 20, 99, 23, 109, 231, 63, 207, 31, 207, 140, 239, - 166, 182, 19, 59, 250, 147, 247, 48, 19, 226, 252, 31, 149, 93, 246, 103, - 194, 13, 181, 66, 191, 239, 55, 232, 161, 119, 127, 144, 170, 26, 66, 46, - 26, 241, 232, 109, 54, 15, 254, 91, 70, 168, 116, 1, 136, 231, 251, 84, - 234, 217, 142, 208, 127, 17, 93, 134, 160, 106, 167, 11, 133, 79, 254, 228, - 125, 254, 249, 179, 13, 2, 164, 56, 87, 35, 88, 17, 3, 25, 182, 181, - 67, 182, 63, 101, 77, 247, 155, 137, 209, 71, 191, 208, 219, 71, 27, 168, - 32, 196, 175, 140, 17, 93, 191, 56, 155, 13, 238, 49, 222, 196, 248, 10, - 203, 146, 42, 65, 226, 73, 111, 246, 235, 186, 2, 205, 24, 181, 134, 68, - 55, 193, 218, 75, 244, 216, 19, 32, 146, 140, 248, 209, 42, 193, 134, 58, - 56, 47, 63, 216, 98, 137, 19, 65, 34, 65, 220, 53, 49, 176, 214, 128, - 54, 243, 10, 245, 77, 56, 69, 202, 83, 74, 5, 40, 85, 190, 81, 163, - 51, 192, 237, 135, 56, 165, 226, 215, 83, 202, 59, 218, 247, 1, 108, 220, - 152, 211, 215, 37, 183, 60, 80, 201, 71, 212, 146, 146, 132, 191, 100, 191, - 228, 33, 119, 221, 8, 97, 80, 85, 69, 197, 72, 183, 172, 37, 202, 148, - 130, 244, 216, 21, 143, 157, 148, 251, 108, 169, 197, 162, 155, 210, 89, 26, - 138, 67, 92, 242, 9, 153, 79, 192, 128, 35, 128, 117, 53, 60, 203, 39, - 28, 227, 182, 237, 245, 82, 165, 145, 184, 216, 69, 48, 74, 107, 145, 192, - 48, 214, 21, 209, 250, 145, 120, 70, 53, 111, 188, 181, 123, 75, 143, 117, - 49, 79, 167, 245, 233, 151, 178, 228, 47, 206, 98, 112, 222, 163, 241, 236, - 60, 193, 212, 25, 197, 39, 71, 175, 96, 84, 137, 232, 58, 195, 217, 162, - 187, 126, 138, 7, 10, 109, 209, 12, 197, 76, 22, 147, 99, 34, 53, 126, - 62, 138, 211, 69, 122, 89, 173, 124, 233, 26, 47, 233, 169, 191, 254, 6, - 46, 64, 26, 8, 226, 250, 197, 166, 69, 90, 128, 244, 99, 169, 237, 60, - 166, 179, 237, 150, 174, 193, 53, 142, 237, 187, 249, 97, 90, 158, 239, 216, - 187, 172, 90, 234, 155, 166, 192, 162, 86, 112, 141, 26, 91, 12, 40, 177, - 192, 244, 29, 184, 19, 157, 140, 230, 176, 85, 115, 166, 137, 171, 54, 71, - 123, 254, 189, 3, 195, 75, 36, 40, 229, 60, 149, 109, 217, 216, 39, 51, - 203, 112, 144, 107, 234, 89, 25, 226, 78, 201, 1, 239, 64, 67, 126, 174, - 162, 98, 218, 17, 180, 224, 126, 8, 34, 78, 237, 201, 109, 27, 3, 76, - 192, 72, 136, 122, 194, 19, 202, 51, 80, 31, 131, 87, 3, 18, 43, 120, - 194, 197, 65, 236, 14, 180, 232, 84, 6, 24, 147, 153, 63, 210, 163, 145, - 123, 179, 51, 216, 238, 195, 73, 131, 97, 22, 59, 115, 80, 43, 240, 54, - 8, 103, 97, 32, 15, 42, 56, 234, 25, 172, 7, 158, 249, 41, 49, 166, - 68, 241, 206, 157, 47, 221, 247, 235, 129, 114, 166, 73, 220, 213, 215, 242, - 252, 170, 202, 194, 138, 180, 78, 38, 5, 170, 50, 50, 105, 145, 237, 87, - 182, 53, 106, 1, 204, 136, 48, 110, 160, 212, 54, 94, 113, 31, 128, 193, - 153, 136, 50, 79, 156, 215, 186, 45, 76, 41, 146, 97, 124, 246, 83, 26, - 97, 122, 86, 156, 180, 54, 245, 11, 196, 235, 104, 86, 20, 87, 190, 81, - 195, 208, 28, 183, 70, 226, 73, 219, 146, 71, 163, 153, 253, 81, 45, 196, - 245, 89, 1, 236, 191, 153, 30, 54, 156, 203, 91, 13, 207, 235, 0, 63, - 85, 98, 186, 204, 178, 109, 5, 171, 197, 161, 40, 57, 67, 43, 87, 143, - 125, 132, 86, 15, 115, 52, 84, 45, 215, 21, 136, 54, 49, 211, 112, 138, - 221, 86, 187, 217, 98, 95, 246, 115, 194, 110, 117, 205, 215, 115, 82, 215, - 162, 55, 43, 130, 190, 114, 83, 207, 166, 134, 9, 52, 135, 38, 137, 116, - 164, 122, 121, 166, 93, 101, 99, 251, 243, 231, 71, 96, 28, 188, 92, 230, - 81, 104, 253, 104, 98, 54, 82, 245, 143, 6, 74, 25, 208, 166, 48, 254, - 147, 180, 9, 229, 74, 231, 31, 57, 208, 133, 85, 224, 132, 203, 183, 133, - 32, 173, 92, 44, 216, 101, 45, 68, 188, 56, 104, 196, 234, 6, 250, 102, - 55, 252, 11, 1, 157, 131, 9, 58, 137, 205, 57, 151, 214, 92, 130, 126, - 196, 157, 195, 105, 126, 67, 35, 191, 210, 136, 251, 54, 214, 79, 28, 0, - 27, 164, 232, 171, 217, 40, 191, 99, 61, 212, 85, 39, 37, 252, 92, 246, - 244, 137, 34, 236, 192, 63, 153, 224, 14, 95, 253, 110, 2, 115, 101, 48, - 213, 217, 2, 238, 253, 87, 65, 224, 163, 106, 59, 208, 109, 35, 195, 35, - 56, 54, 53, 120, 92, 103, 61, 50, 174, 6, 64, 192, 51, 59, 102, 246, - 60, 53, 241, 218, 136, 219, 33, 106, 23, 51, 169, 240, 117, 209, 43, 70, - 248, 14, 87, 149, 104, 223, 75, 142, 219, 253, 102, 28, 154, 109, 209, 87, - 200, 179, 213, 182, 79, 19, 158, 201, 52, 39, 181, 227, 145, 161, 31, 219, - 253, 92, 230, 149, 176, 29, 110, 216, 180, 117, 109, 223, 31, 222, 62, 84, - 126, 114, 246, 130, 223, 179, 38, 85, 172, 124, 106, 108, 69, 236, 29, 208, - 142, 48, 210, 250, 207, 163, 122, 48, 58, 227, 22, 130, 7, 136, 217, 203, - 221, 253, 180, 214, 42, 255, 236, 89, 60, 107, 136, 77, 75, 5, 42, 104, - 129, 202, 124, 204, 13, 244, 54, 31, 107, 242, 149, 59, 205, 220, 172, 230, - 129, 18, 56, 208, 123, 250, 253, 142, 234, 114, 64, 89, 121, 95, 87, 97, - 125, 179, 182, 27, 129, 125, 179, 63, 17, 170, 159, 223, 95, 90, 186, 106, - 55, 37, 92, 192, 160, 239, 133, 71, 53, 157, 235, 134, 26, 70, 146, 214, - 51, 202, 18, 144, 50, 205, 88, 132, 188, 217, 177, 117, 126, 162, 50, 251, - 192, 177, 14, 128, 131, 75, 76, 27, 69, 154, 101, 5, 185, 208, 82, 82, - 76, 69, 116, 1, 0, 85, 59, 155, 243, 163, 99, 89, 59, 60, 56, 183, - 248, 206, 29, 223, 206, 38, 40, 241, 108, 182, 177, 38, 110, 174, 106, 237, - 149, 119, 134, 113, 169, 96, 200, 36, 240, 53, 178, 24, 159, 198, 41, 111, - 155, 173, 50, 248, 179, 42, 183, 119, 16, 38, 130, 248, 95, 227, 55, 22, - 89, 76, 155, 92, 64, 134, 233, 212, 153, 148, 64, 211, 173, 25, 136, 65, - 228, 226, 16, 242, 140, 110, 4, 31, 221, 192, 73, 74, 91, 59, 80, 205, - 199, 89, 180, 125, 217, 72, 245, 40, 78, 228, 74, 30, 51, 195, 121, 2, - 243, 142, 250, 109, 217, 117, 243, 214, 87, 232, 175, 175, 246, 16, 192, 53, - 228, 169, 184, 69, 244, 12, 125, 167, 215, 54, 190, 56, 49, 39, 200, 134, - 30, 12, 35, 175, 11, 144, 233, 231, 197, 157, 162, 208, 85, 44, 197, 37, - 193, 102, 36, 169, 97, 172, 3, 186, 84, 164, 216, 10, 91, 244, 61, 254, - 100, 240, 21, 232, 38, 154, 80, 68, 22, 78, 213, 60, 8, 39, 24, 66, - 70, 49, 14, 99, 187, 158, 206, 86, 243, 245, 123, 117, 95, 234, 226, 188, - 84, 83, 97, 61, 28, 237, 30, 122, 41, 68, 248, 139, 225, 26, 214, 108, - 61, 213, 51, 90, 77, 94, 83, 141, 57, 87, 202, 84, 185, 79, 50, 25, - 197, 53, 184, 114, 232, 195, 133, 145, 60, 187, 117, 214, 156, 192, 169, 145, - 137, 113, 26, 135, 160, 11, 125, 235, 235, 96, 58, 223, 108, 23, 91, 24, - 90, 66, 242, 135, 160, 29, 142, 147, 64, 6, 194, 155, 251, 97, 213, 74, - 103, 162, 90, 114, 56, 230, 202, 142, 176, 133, 31, 160, 118, 133, 196, 62, - 105, 115, 48, 139, 94, 78, 154, 250, 72, 152, 90, 192, 100, 150, 155, 85, - 103, 35, 72, 121, 107, 61, 49, 18, 3, 0, 87, 28, 232, 253, 29, 132, - 122, 37, 140, 230, 98, 36, 175, 40, 166, 137, 132, 115, 215, 112, 30, 134, - 120, 34, 59, 60, 195, 229, 3, 43, 38, 95, 113, 198, 107, 81, 36, 76, - 194, 126, 152, 196, 42, 27, 125, 137, 82, 25, 101, 136, 55, 222, 50, 238, - 213, 212, 168, 57, 239, 186, 76, 133, 101, 131, 102, 216, 83, 208, 170, 2, - 170, 106, 81, 127, 4, 158, 92, 75, 128, 173, 17, 95, 160, 72, 33, 97, - 195, 244, 98, 89, 208, 226, 240, 50, 144, 181, 14, 23, 99, 1, 207, 69, - 201, 179, 197, 35, 172, 241, 252, 53, 129, 90, 125, 80, 187, 155, 29, 12, - 225, 39, 56, 45, 236, 82, 16, 10, 136, 102, 231, 138, 131, 114, 223, 10, - 174, 172, 164, 210, 110, 213, 84, 125, 65, 200, 153, 39, 172, 35, 122, 167, - 132, 14, 255, 10, 120, 153, 38, 95, 158, 82, 39, 21, 10, 20, 181, 251, - 12, 108, 133, 25, 243, 58, 71, 6, 87, 86, 166, 217, 146, 148, 72, 8, - 219, 52, 52, 69, 112, 145, 255, 48, 57, 142, 231, 27, 182, 242, 66, 169, - 36, 253, 235, 255, 79, 75, 251, 255, 41, 44, 250, 183, 191, 255, 127, 157, - 249, 191, 37, 103, 232, 191, 51, 104, 255, 254, 248, 219, 63, 74, 102, 254, - 17, 89, 4, 177, 131, 223, 247, 111, 242, 21, 87, 24, 113, 184, 8, 110, - 148, 16, 6, 36, 81, 26, 170, 16, 90, 176, 175, 184, 122, 46, 100, 123, - 200, 47, 120, 124, 191, 224, 248, 37, 77, 145, 29, 63, 227, 15, 51, 70, - 107, 83, 151, 95, 61, 29, 36, 105, 154, 32, 9, 186, 56, 172, 187, 216, - 167, 56, 30, 172, 56, 170, 93, 29, 250, 40, 24, 241, 143, 201, 86, 167, - 246, 231, 57, 173, 35, 156, 63, 59, 20, 9, 32, 211, 198, 129, 151, 227, - 236, 6, 111, 139, 27, 10, 129, 20, 4, 234, 5, 21, 106, 15, 233, 43, - 149, 141, 163, 84, 68, 236, 249, 94, 191, 191, 182, 18, 199, 10, 244, 129, - 129, 240, 7, 229, 224, 250, 232, 199, 131, 3, 4, 244, 94, 31, 69, 139, - 118, 67, 10, 51, 63, 72, 226, 216, 136, 177, 90, 150, 123, 202, 166, 49, - 158, 23, 103, 242, 250, 249, 52, 249, 49, 191, 114, 177, 250, 165, 174, 48, - 173, 34, 59, 124, 30, 173, 194, 66, 58, 21, 77, 51, 17, 150, 214, 240, - 2, 72, 247, 220, 235, 209, 193, 246, 248, 154, 78, 79, 152, 90, 139, 125, - 158, 40, 24, 74, 151, 63, 94, 177, 73, 68, 71, 214, 238, 167, 166, 26, - 63, 245, 25, 142, 117, 129, 27, 28, 12, 218, 184, 64, 99, 4, 153, 236, - 238, 227, 89, 29, 138, 127, 143, 146, 32, 64, 119, 223, 183, 180, 219, 53, - 48, 93, 127, 166, 181, 168, 107, 184, 171, 161, 54, 167, 225, 186, 166, 204, - 149, 70, 239, 108, 23, 147, 37, 16, 12, 206, 66, 84, 214, 133, 11, 210, - 246, 128, 72, 101, 239, 78, 101, 151, 119, 68, 89, 152, 0, 213, 234, 71, - 142, 193, 178, 18, 208, 164, 52, 64, 183, 36, 80, 53, 143, 74, 137, 161, - 84, 62, 5, 126, 56, 30, 90, 134, 46, 142, 135, 178, 92, 20, 184, 122, - 40, 40, 142, 5, 7, 169, 227, 59, 153, 9, 237, 148, 204, 182, 159, 79, - 169, 174, 215, 134, 254, 46, 189, 60, 145, 60, 93, 142, 205, 204, 247, 223, - 81, 94, 153, 25, 76, 234, 168, 116, 203, 2, 52, 56, 81, 215, 177, 232, - 150, 145, 51, 199, 147, 66, 22, 227, 242, 122, 133, 100, 15, 133, 227, 243, - 41, 158, 47, 170, 19, 203, 163, 167, 235, 157, 181, 114, 23, 127, 174, 66, - 86, 221, 38, 22, 217, 70, 26, 192, 42, 114, 174, 226, 15, 158, 135, 123, - 30, 136, 37, 19, 9, 175, 15, 16, 250, 143, 53, 208, 160, 14, 39, 184, - 11, 7, 135, 229, 51, 63, 173, 253, 22, 226, 243, 64, 215, 23, 60, 79, - 125, 37, 159, 12, 244, 55, 205, 172, 199, 196, 252, 13, 139, 24, 245, 138, - 232, 143, 51, 66, 12, 241, 253, 45, 101, 37, 138, 38, 167, 207, 209, 91, - 13, 194, 129, 115, 81, 129, 11, 133, 59, 246, 249, 69, 48, 60, 192, 212, - 187, 134, 172, 240, 167, 235, 230, 195, 238, 229, 166, 169, 95, 207, 92, 99, - 183, 154, 136, 47, 178, 160, 99, 154, 142, 124, 175, 121, 175, 85, 129, 250, - 75, 245, 70, 12, 219, 136, 117, 219, 88, 165, 158, 195, 186, 139, 153, 164, - 152, 146, 35, 14, 157, 246, 189, 103, 148, 131, 52, 97, 136, 20, 143, 135, - 8, 166, 219, 47, 132, 216, 138, 31, 120, 31, 55, 88, 3, 155, 85, 219, - 181, 108, 18, 202, 96, 0, 82, 23, 25, 122, 47, 72, 240, 128, 71, 231, - 95, 70, 128, 11, 241, 170, 192, 207, 189, 150, 210, 254, 212, 210, 88, 22, - 152, 211, 166, 152, 154, 148, 98, 250, 37, 95, 150, 131, 180, 163, 154, 53, - 147, 110, 146, 82, 29, 113, 160, 41, 226, 0, 236, 98, 33, 204, 162, 189, - 136, 167, 194, 138, 5, 196, 176, 16, 163, 9, 3, 69, 182, 121, 155, 84, - 31, 32, 147, 90, 17, 127, 246, 176, 222, 116, 243, 187, 17, 143, 51, 46, - 129, 87, 98, 159, 46, 137, 96, 194, 232, 194, 47, 156, 183, 192, 165, 9, - 191, 54, 118, 183, 26, 23, 120, 195, 197, 109, 190, 21, 4, 238, 78, 219, - 235, 247, 16, 167, 214, 118, 63, 82, 196, 87, 66, 212, 214, 100, 149, 171, - 69, 108, 39, 185, 62, 216, 102, 220, 49, 125, 13, 218, 145, 208, 171, 208, - 168, 13, 24, 217, 93, 254, 81, 146, 72, 62, 196, 103, 190, 109, 174, 103, - 40, 122, 59, 175, 15, 251, 39, 111, 136, 146, 197, 127, 43, 155, 9, 206, - 110, 252, 249, 100, 164, 128, 219, 219, 45, 51, 228, 122, 18, 230, 56, 59, - 86, 233, 184, 154, 87, 186, 125, 175, 129, 220, 241, 1, 60, 194, 104, 43, - 180, 215, 73, 94, 154, 129, 63, 120, 195, 123, 255, 110, 150, 112, 199, 75, - 162, 127, 228, 29, 241, 3, 54, 7, 74, 63, 205, 205, 66, 99, 64, 253, - 160, 120, 28, 96, 45, 191, 247, 187, 251, 107, 91, 111, 143, 19, 100, 54, - 230, 197, 55, 254, 152, 98, 220, 143, 220, 58, 230, 149, 93, 181, 45, 207, - 211, 236, 155, 177, 95, 218, 141, 61, 111, 160, 93, 136, 146, 54, 107, 132, - 166, 166, 79, 19, 134, 152, 3, 142, 19, 215, 195, 7, 139, 30, 44, 219, - 241, 197, 156, 241, 217, 170, 178, 254, 217, 22, 169, 56, 13, 99, 55, 167, - 18, 21, 166, 208, 122, 0, 215, 179, 52, 248, 132, 73, 176, 220, 156, 203, - 69, 92, 149, 168, 178, 45, 177, 84, 162, 234, 241, 176, 173, 194, 227, 147, - 183, 250, 117, 135, 61, 66, 23, 175, 239, 248, 183, 27, 236, 76, 75, 80, - 80, 123, 107, 244, 1, 88, 31, 83, 95, 116, 51, 68, 22, 175, 63, 42, - 201, 252, 94, 121, 227, 220, 183, 161, 161, 116, 39, 50, 157, 213, 198, 169, - 113, 199, 108, 78, 2, 233, 22, 55, 170, 41, 159, 88, 105, 28, 235, 81, - 41, 63, 186, 164, 139, 244, 126, 111, 230, 4, 75, 49, 75, 91, 5, 239, - 61, 210, 151, 201, 141, 67, 44, 136, 2, 69, 54, 250, 41, 247, 184, 195, - 50, 243, 88, 76, 33, 187, 65, 225, 71, 195, 191, 36, 116, 118, 185, 85, - 44, 86, 72, 188, 164, 30, 145, 109, 120, 21, 25, 186, 18, 175, 199, 255, - 28, 151, 182, 252, 38, 123, 154, 64, 237, 207, 231, 0, 123, 99, 171, 239, - 145, 84, 146, 130, 249, 220, 162, 59, 87, 239, 105, 49, 67, 57, 191, 138, - 194, 68, 8, 236, 241, 67, 38, 89, 157, 84, 191, 185, 139, 93, 145, 114, - 118, 94, 138, 255, 94, 164, 20, 85, 70, 61, 41, 68, 56, 123, 241, 52, - 132, 51, 166, 45, 94, 182, 162, 228, 210, 73, 90, 92, 176, 254, 4, 138, - 244, 224, 130, 227, 151, 181, 61, 188, 182, 223, 180, 122, 205, 15, 40, 87, - 228, 230, 214, 28, 138, 9, 33, 31, 184, 140, 205, 24, 174, 22, 219, 154, - 92, 77, 154, 55, 117, 180, 19, 74, 31, 176, 204, 202, 6, 12, 207, 182, - 188, 92, 207, 63, 61, 194, 75, 54, 56, 237, 51, 106, 130, 235, 83, 254, - 198, 68, 217, 33, 209, 121, 97, 88, 73, 122, 18, 213, 231, 228, 199, 198, - 27, 234, 167, 119, 84, 215, 181, 76, 151, 48, 111, 92, 161, 16, 99, 48, - 245, 80, 81, 121, 107, 145, 124, 235, 190, 247, 55, 104, 203, 49, 51, 235, - 203, 160, 47, 100, 186, 131, 158, 227, 247, 31, 251, 67, 50, 125, 192, 36, - 138, 117, 131, 73, 55, 247, 220, 152, 161, 148, 229, 226, 58, 147, 157, 31, - 203, 201, 211, 216, 134, 33, 96, 5, 106, 120, 157, 7, 255, 105, 245, 111, - 120, 176, 163, 102, 224, 160, 174, 204, 233, 143, 8, 217, 31, 105, 192, 246, - 135, 239, 117, 213, 152, 213, 186, 34, 53, 129, 149, 241, 63, 198, 113, 216, - 180, 99, 115, 123, 36, 84, 155, 204, 247, 62, 97, 179, 118, 112, 26, 108, - 103, 209, 18, 25, 125, 243, 181, 38, 73, 74, 35, 99, 29, 176, 44, 165, - 61, 14, 36, 86, 50, 35, 62, 112, 24, 193, 99, 151, 194, 61, 34, 31, - 17, 56, 204, 84, 20, 68, 91, 245, 43, 116, 187, 148, 226, 43, 110, 153, - 173, 133, 216, 148, 31, 66, 44, 210, 218, 77, 113, 91, 250, 31, 9, 178, - 79, 215, 25, 209, 198, 142, 185, 115, 182, 72, 66, 17, 66, 15, 16, 9, - 22, 49, 234, 24, 27, 167, 131, 123, 120, 170, 162, 55, 242, 212, 173, 236, - 49, 212, 57, 23, 206, 156, 186, 174, 182, 153, 130, 207, 19, 111, 182, 181, - 185, 246, 108, 218, 65, 149, 49, 173, 65, 181, 29, 170, 28, 181, 105, 72, - 178, 182, 145, 232, 206, 171, 48, 128, 181, 236, 109, 57, 104, 166, 255, 142, - 64, 137, 217, 86, 158, 164, 65, 62, 1, 85, 31, 127, 110, 35, 89, 157, - 80, 147, 130, 188, 164, 53, 68, 45, 111, 16, 119, 95, 191, 209, 146, 64, - 167, 116, 113, 84, 210, 159, 169, 226, 203, 6, 59, 201, 141, 184, 135, 60, - 11, 58, 27, 238, 224, 114, 179, 211, 210, 187, 19, 85, 177, 179, 75, 178, - 149, 116, 78, 178, 28, 117, 157, 167, 210, 81, 26, 95, 248, 149, 37, 171, - 223, 235, 249, 15, 95, 124, 252, 237, 98, 209, 20, 101, 93, 75, 62, 154, - 255, 54, 6, 135, 102, 90, 158, 209, 22, 162, 126, 185, 153, 145, 71, 224, - 76, 58, 131, 233, 212, 24, 141, 209, 143, 132, 112, 106, 178, 198, 232, 161, - 23, 175, 50, 79, 140, 109, 127, 100, 200, 224, 33, 248, 53, 139, 176, 157, - 99, 90, 209, 237, 29, 112, 110, 78, 165, 61, 102, 8, 120, 2, 251, 1, - 6, 255, 146, 209, 14, 122, 135, 240, 242, 38, 51, 61, 118, 202, 115, 168, - 122, 7, 97, 130, 132, 122, 145, 221, 15, 31, 193, 188, 119, 232, 71, 248, - 250, 101, 96, 124, 239, 17, 75, 105, 223, 90, 31, 103, 255, 156, 35, 82, - 154, 181, 126, 83, 124, 71, 73, 211, 107, 207, 213, 114, 33, 190, 221, 219, - 57, 109, 147, 94, 193, 196, 220, 89, 152, 7, 64, 78, 193, 41, 246, 117, - 206, 128, 87, 230, 107, 197, 81, 9, 95, 246, 207, 174, 95, 106, 16, 23, - 33, 14, 46, 153, 253, 181, 40, 179, 160, 138, 97, 63, 198, 115, 23, 214, - 202, 43, 21, 137, 40, 38, 50, 156, 190, 222, 212, 143, 84, 64, 205, 77, - 244, 178, 51, 243, 1, 179, 41, 153, 97, 4, 248, 83, 160, 44, 1, 30, - 228, 198, 182, 106, 239, 102, 95, 247, 151, 13, 159, 78, 28, 45, 208, 217, - 67, 57, 100, 211, 46, 54, 222, 0, 239, 14, 156, 122, 3, 24, 24, 97, - 90, 245, 170, 230, 192, 129, 145, 131, 182, 168, 180, 158, 20, 150, 166, 142, - 142, 176, 39, 60, 129, 62, 70, 31, 152, 51, 82, 127, 127, 181, 5, 87, - 92, 122, 190, 72, 231, 183, 88, 140, 158, 139, 120, 137, 193, 147, 64, 175, - 226, 185, 139, 39, 114, 29, 255, 38, 230, 217, 35, 93, 217, 42, 236, 229, - 10, 106, 192, 202, 110, 137, 145, 40, 95, 231, 172, 24, 178, 106, 41, 63, - 105, 246, 4, 208, 245, 78, 254, 223, 236, 189, 233, 126, 226, 72, 242, 40, - 250, 157, 167, 200, 102, 168, 110, 187, 16, 160, 133, 181, 186, 93, 253, 199, - 187, 93, 222, 241, 90, 213, 53, 62, 2, 37, 32, 35, 36, 172, 197, 128, - 61, 190, 191, 251, 253, 190, 229, 125, 146, 27, 145, 153, 18, 18, 8, 219, - 229, 62, 179, 221, 211, 61, 83, 88, 202, 76, 229, 26, 25, 91, 70, 70, - 80, 99, 106, 29, 108, 119, 107, 193, 230, 212, 13, 174, 42, 87, 187, 84, - 29, 238, 168, 235, 101, 89, 255, 66, 187, 235, 181, 175, 35, 221, 48, 148, - 241, 222, 245, 163, 186, 255, 245, 225, 241, 218, 31, 108, 181, 74, 95, 128, - 87, 91, 111, 226, 61, 151, 158, 53, 60, 157, 220, 239, 94, 55, 38, 87, - 198, 174, 105, 216, 39, 53, 122, 94, 62, 109, 26, 218, 217, 169, 69, 205, - 227, 139, 131, 114, 117, 99, 120, 221, 170, 237, 186, 27, 135, 123, 135, 215, - 189, 135, 29, 189, 75, 253, 238, 86, 55, 127, 211, 157, 184, 230, 122, 107, - 108, 234, 222, 213, 70, 243, 252, 168, 233, 244, 154, 91, 199, 103, 151, 7, - 211, 154, 54, 222, 169, 104, 114, 231, 232, 60, 127, 94, 171, 94, 186, 149, - 250, 245, 163, 188, 126, 246, 104, 118, 79, 108, 181, 12, 72, 237, 244, 65, - 215, 14, 39, 7, 151, 189, 187, 61, 43, 191, 217, 92, 111, 239, 239, 110, - 247, 110, 186, 149, 203, 173, 65, 107, 172, 61, 186, 61, 227, 168, 58, 157, - 2, 255, 216, 184, 147, 171, 154, 161, 31, 29, 56, 135, 247, 235, 173, 233, - 77, 183, 173, 88, 198, 161, 239, 230, 173, 173, 205, 19, 106, 63, 62, 228, - 45, 99, 235, 220, 110, 156, 172, 111, 85, 247, 31, 31, 140, 242, 245, 93, - 245, 104, 251, 176, 220, 27, 244, 118, 155, 222, 122, 253, 232, 204, 210, 143, - 174, 141, 74, 190, 114, 111, 117, 242, 151, 106, 112, 83, 241, 175, 107, 15, - 163, 203, 47, 103, 151, 147, 11, 255, 210, 174, 85, 70, 15, 87, 180, 105, - 79, 206, 157, 7, 221, 29, 172, 151, 242, 187, 155, 106, 169, 190, 101, 56, - 110, 251, 180, 87, 217, 173, 213, 100, 235, 164, 36, 15, 156, 125, 245, 240, - 81, 87, 155, 167, 253, 211, 141, 109, 181, 250, 21, 80, 238, 176, 209, 241, - 148, 243, 187, 246, 213, 153, 107, 143, 172, 67, 99, 207, 189, 175, 92, 5, - 154, 114, 173, 76, 70, 167, 27, 62, 160, 26, 181, 91, 218, 169, 231, 187, - 199, 174, 178, 219, 112, 183, 129, 106, 238, 127, 109, 230, 119, 180, 70, 139, - 14, 135, 219, 250, 209, 253, 110, 227, 222, 220, 248, 162, 7, 181, 86, 237, - 160, 235, 182, 221, 13, 99, 191, 49, 168, 248, 78, 69, 249, 10, 67, 246, - 143, 14, 236, 122, 169, 175, 159, 117, 59, 135, 39, 45, 239, 160, 229, 158, - 151, 238, 186, 165, 199, 135, 83, 16, 21, 251, 249, 238, 195, 69, 125, 72, - 91, 167, 247, 67, 205, 186, 42, 201, 94, 99, 243, 116, 112, 4, 123, 203, - 188, 191, 81, 183, 198, 147, 195, 170, 81, 173, 5, 181, 227, 233, 214, 206, - 125, 253, 110, 125, 107, 255, 34, 56, 106, 142, 71, 202, 3, 176, 126, 86, - 31, 36, 196, 246, 177, 89, 235, 4, 154, 230, 200, 123, 23, 143, 174, 165, - 214, 234, 189, 59, 95, 238, 42, 123, 234, 215, 105, 112, 237, 239, 221, 53, - 180, 174, 191, 3, 66, 246, 214, 201, 206, 86, 176, 213, 236, 245, 54, 214, - 55, 14, 243, 119, 3, 181, 125, 244, 120, 125, 55, 57, 13, 142, 55, 131, - 182, 213, 27, 4, 102, 111, 122, 182, 223, 242, 55, 212, 210, 195, 213, 238, - 99, 127, 60, 26, 30, 229, 123, 251, 250, 253, 181, 57, 120, 168, 150, 204, - 209, 141, 90, 111, 105, 118, 163, 85, 106, 109, 122, 167, 27, 189, 187, 224, - 224, 174, 211, 217, 105, 1, 251, 90, 187, 236, 13, 170, 151, 227, 193, 94, - 243, 126, 179, 119, 220, 156, 236, 108, 54, 142, 182, 183, 190, 238, 244, 157, - 252, 73, 207, 233, 94, 239, 90, 195, 122, 173, 51, 233, 84, 180, 147, 251, - 193, 227, 166, 221, 255, 178, 253, 112, 164, 211, 135, 243, 113, 217, 161, 119, - 189, 221, 202, 134, 185, 217, 175, 212, 78, 107, 126, 181, 209, 62, 82, 3, - 227, 204, 172, 93, 79, 191, 42, 238, 209, 168, 94, 242, 245, 47, 74, 109, - 253, 164, 74, 167, 141, 124, 181, 253, 216, 57, 173, 28, 127, 113, 30, 123, - 116, 172, 127, 113, 170, 205, 139, 203, 147, 86, 207, 185, 238, 194, 246, 9, - 148, 171, 157, 209, 238, 53, 8, 132, 95, 46, 44, 223, 216, 170, 126, 241, - 206, 153, 143, 210, 131, 139, 209, 224, 70, 169, 76, 131, 203, 139, 221, 135, - 170, 225, 91, 135, 91, 215, 135, 149, 35, 125, 216, 240, 246, 207, 206, 2, - 87, 175, 28, 92, 234, 178, 114, 117, 87, 82, 190, 52, 75, 14, 160, 74, - 115, 99, 211, 57, 189, 86, 43, 93, 69, 46, 219, 218, 97, 249, 161, 81, - 175, 60, 104, 199, 91, 7, 249, 241, 208, 155, 90, 222, 17, 122, 149, 223, - 171, 122, 39, 138, 165, 182, 239, 174, 190, 118, 119, 237, 205, 222, 105, 103, - 247, 196, 87, 203, 157, 54, 213, 30, 250, 155, 235, 174, 175, 30, 88, 214, - 174, 122, 223, 28, 231, 173, 211, 201, 70, 119, 251, 113, 116, 97, 88, 103, - 84, 14, 238, 170, 135, 45, 219, 62, 109, 28, 155, 206, 249, 198, 137, 123, - 51, 218, 60, 168, 157, 148, 219, 78, 77, 61, 185, 190, 84, 174, 233, 216, - 80, 235, 64, 255, 239, 122, 245, 251, 78, 219, 40, 187, 251, 151, 199, 95, - 172, 211, 254, 193, 250, 89, 251, 160, 181, 143, 158, 242, 124, 122, 220, 58, - 24, 238, 61, 110, 208, 81, 171, 125, 186, 167, 127, 165, 15, 215, 155, 149, - 253, 173, 250, 232, 200, 91, 223, 58, 222, 1, 226, 125, 108, 149, 71, 155, - 215, 15, 246, 217, 195, 213, 113, 185, 92, 58, 177, 141, 254, 215, 131, 243, - 251, 141, 135, 139, 138, 97, 208, 45, 218, 220, 25, 111, 184, 181, 224, 102, - 175, 44, 223, 13, 246, 30, 14, 246, 119, 148, 238, 36, 127, 57, 253, 122, - 172, 124, 113, 244, 59, 89, 214, 182, 245, 139, 97, 103, 28, 140, 234, 155, - 205, 205, 252, 197, 195, 150, 221, 190, 214, 52, 173, 244, 32, 27, 213, 73, - 169, 219, 48, 218, 151, 251, 170, 183, 159, 87, 43, 74, 247, 164, 87, 222, - 237, 53, 143, 111, 174, 155, 23, 166, 123, 247, 37, 255, 176, 222, 191, 188, - 186, 186, 28, 181, 75, 221, 241, 240, 236, 203, 206, 227, 105, 125, 247, 190, - 71, 119, 239, 58, 55, 250, 113, 117, 195, 169, 84, 123, 251, 19, 237, 209, - 115, 156, 245, 222, 246, 117, 61, 191, 235, 152, 202, 253, 150, 229, 110, 223, - 215, 12, 255, 97, 36, 87, 143, 118, 207, 79, 55, 148, 230, 122, 77, 233, - 171, 29, 218, 246, 78, 125, 109, 199, 156, 180, 131, 73, 233, 234, 240, 162, - 175, 24, 189, 199, 29, 71, 209, 239, 101, 121, 119, 104, 229, 75, 237, 94, - 121, 171, 233, 3, 188, 109, 31, 187, 235, 214, 241, 110, 96, 87, 186, 103, - 245, 175, 67, 79, 85, 190, 94, 41, 219, 19, 231, 116, 127, 235, 112, 103, - 187, 226, 180, 252, 243, 199, 187, 205, 109, 251, 64, 238, 108, 6, 131, 113, - 191, 214, 58, 166, 231, 167, 126, 103, 188, 111, 217, 91, 91, 37, 239, 132, - 150, 26, 15, 15, 13, 63, 48, 79, 187, 245, 62, 136, 29, 205, 214, 198, - 233, 121, 91, 110, 2, 198, 114, 15, 47, 65, 124, 160, 118, 183, 188, 183, - 7, 91, 175, 119, 191, 53, 110, 93, 79, 242, 199, 227, 179, 245, 47, 189, - 59, 253, 113, 160, 29, 200, 129, 54, 186, 217, 220, 124, 120, 108, 158, 174, - 59, 7, 131, 211, 83, 247, 176, 180, 211, 87, 191, 228, 239, 142, 13, 251, - 202, 189, 119, 111, 42, 178, 113, 164, 158, 186, 244, 192, 115, 198, 37, 205, - 30, 202, 59, 189, 253, 61, 133, 54, 43, 231, 95, 172, 205, 81, 229, 250, - 198, 152, 236, 93, 149, 175, 191, 84, 14, 149, 81, 25, 184, 163, 35, 221, - 61, 63, 236, 54, 218, 227, 227, 163, 77, 163, 214, 218, 218, 62, 25, 175, - 55, 100, 221, 169, 26, 142, 114, 224, 30, 87, 228, 230, 117, 251, 196, 63, - 117, 174, 125, 205, 61, 218, 109, 238, 174, 59, 121, 186, 255, 165, 213, 169, - 245, 182, 228, 102, 126, 247, 235, 89, 80, 145, 191, 156, 42, 95, 186, 231, - 251, 253, 47, 147, 225, 246, 200, 109, 107, 157, 70, 109, 60, 146, 207, 218, - 157, 221, 230, 224, 36, 223, 221, 155, 92, 119, 111, 42, 245, 134, 218, 222, - 24, 118, 122, 110, 53, 239, 213, 236, 125, 203, 111, 79, 239, 135, 119, 163, - 251, 177, 94, 162, 45, 116, 171, 35, 159, 154, 163, 205, 173, 238, 117, 251, - 178, 110, 107, 238, 241, 238, 222, 215, 45, 85, 93, 247, 239, 167, 117, 175, - 125, 209, 46, 223, 213, 215, 39, 142, 221, 234, 220, 60, 82, 122, 190, 113, - 53, 158, 52, 122, 21, 247, 98, 29, 224, 234, 176, 238, 42, 251, 170, 113, - 89, 51, 202, 27, 206, 250, 249, 254, 217, 233, 206, 94, 229, 202, 52, 167, - 202, 229, 84, 94, 63, 105, 78, 180, 234, 225, 198, 190, 235, 237, 119, 186, - 247, 170, 178, 181, 219, 170, 92, 251, 249, 147, 74, 71, 110, 172, 215, 232, - 186, 234, 182, 42, 198, 185, 114, 115, 184, 111, 63, 156, 236, 78, 31, 174, - 27, 71, 101, 179, 113, 216, 222, 129, 190, 149, 41, 48, 44, 119, 103, 103, - 59, 253, 157, 234, 254, 213, 225, 181, 89, 122, 168, 30, 149, 206, 190, 86, - 215, 119, 173, 233, 86, 254, 234, 114, 219, 165, 250, 221, 110, 179, 190, 107, - 211, 202, 117, 107, 235, 166, 49, 192, 163, 10, 213, 245, 244, 43, 229, 114, - 107, 223, 244, 246, 141, 107, 71, 185, 105, 185, 206, 232, 230, 2, 86, 230, - 224, 112, 183, 183, 179, 175, 15, 47, 55, 245, 246, 233, 168, 92, 239, 93, - 158, 183, 106, 195, 218, 222, 120, 167, 58, 186, 159, 250, 238, 214, 216, 222, - 60, 51, 15, 15, 143, 27, 227, 192, 24, 155, 205, 205, 253, 252, 246, 158, - 57, 249, 234, 180, 110, 90, 254, 120, 60, 108, 88, 154, 127, 113, 144, 63, - 50, 175, 220, 221, 59, 115, 164, 251, 71, 192, 109, 202, 215, 55, 237, 77, - 229, 254, 52, 184, 114, 78, 91, 151, 187, 198, 245, 168, 209, 2, 28, 231, - 237, 61, 94, 125, 29, 222, 180, 215, 245, 173, 211, 218, 186, 51, 30, 155, - 155, 219, 221, 171, 139, 90, 205, 106, 42, 85, 235, 97, 171, 125, 58, 176, - 202, 103, 7, 147, 218, 165, 247, 208, 176, 199, 235, 222, 246, 70, 231, 241, - 166, 122, 115, 113, 208, 54, 122, 199, 163, 211, 135, 179, 233, 229, 84, 187, - 216, 8, 64, 74, 105, 64, 19, 109, 13, 56, 120, 231, 240, 52, 176, 143, - 58, 70, 141, 62, 156, 93, 182, 118, 78, 46, 14, 174, 238, 143, 174, 52, - 101, 120, 127, 209, 63, 184, 154, 92, 86, 27, 206, 254, 120, 189, 87, 134, - 142, 89, 230, 120, 122, 227, 30, 104, 104, 174, 171, 29, 194, 38, 4, 78, - 248, 196, 106, 220, 43, 143, 215, 227, 233, 160, 43, 159, 184, 213, 205, 154, - 182, 119, 82, 57, 112, 141, 206, 205, 209, 233, 229, 246, 87, 253, 170, 238, - 221, 111, 238, 63, 110, 13, 183, 247, 55, 129, 55, 43, 1, 19, 181, 221, - 220, 51, 174, 46, 7, 55, 131, 251, 205, 129, 119, 54, 153, 86, 182, 247, - 101, 218, 186, 184, 118, 140, 45, 235, 56, 127, 127, 186, 110, 108, 109, 54, - 122, 205, 163, 233, 142, 161, 77, 104, 179, 167, 2, 131, 181, 127, 118, 226, - 107, 214, 113, 189, 185, 151, 247, 252, 158, 223, 173, 245, 172, 118, 163, 230, - 107, 249, 202, 246, 105, 243, 234, 104, 255, 228, 238, 241, 84, 57, 186, 184, - 242, 148, 254, 185, 113, 218, 235, 218, 91, 55, 3, 121, 239, 230, 78, 254, - 234, 7, 147, 51, 247, 164, 121, 178, 51, 62, 238, 119, 38, 192, 30, 141, - 143, 101, 185, 234, 1, 135, 97, 214, 186, 155, 234, 133, 213, 245, 101, 237, - 174, 219, 248, 186, 211, 216, 176, 70, 119, 123, 167, 157, 155, 147, 189, 147, - 117, 239, 210, 241, 47, 221, 251, 203, 93, 119, 183, 117, 161, 12, 246, 247, - 15, 54, 180, 205, 253, 182, 241, 96, 105, 218, 101, 103, 125, 56, 124, 212, - 54, 219, 119, 61, 249, 177, 121, 83, 186, 28, 193, 214, 163, 103, 230, 250, - 245, 69, 183, 167, 143, 142, 169, 115, 217, 184, 14, 46, 174, 65, 166, 88, - 87, 123, 59, 155, 227, 241, 174, 122, 124, 113, 122, 47, 111, 28, 77, 155, - 234, 168, 183, 35, 79, 55, 141, 43, 85, 83, 203, 109, 229, 132, 142, 79, - 219, 199, 237, 205, 189, 182, 249, 80, 219, 157, 140, 234, 215, 234, 253, 233, - 253, 238, 153, 190, 215, 223, 42, 143, 140, 173, 27, 175, 118, 179, 126, 3, - 187, 162, 103, 62, 246, 157, 189, 243, 195, 234, 118, 159, 222, 148, 154, 202, - 23, 247, 193, 211, 15, 55, 46, 55, 54, 79, 171, 229, 245, 205, 155, 27, - 175, 242, 216, 111, 140, 119, 228, 173, 43, 245, 230, 38, 47, 31, 149, 246, - 43, 103, 247, 219, 167, 190, 93, 185, 1, 108, 8, 34, 67, 126, 243, 104, - 122, 126, 216, 186, 60, 176, 30, 183, 7, 245, 131, 141, 252, 229, 85, 247, - 126, 208, 165, 135, 119, 205, 254, 69, 123, 243, 230, 254, 252, 177, 29, 156, - 168, 55, 215, 199, 7, 206, 110, 126, 167, 122, 221, 155, 60, 60, 232, 143, - 90, 119, 186, 189, 63, 60, 54, 187, 128, 96, 141, 161, 178, 85, 191, 7, - 102, 118, 218, 216, 248, 98, 111, 156, 239, 30, 208, 210, 233, 240, 225, 98, - 208, 27, 232, 32, 24, 140, 243, 35, 189, 213, 43, 25, 214, 225, 246, 227, - 137, 85, 239, 87, 143, 221, 47, 149, 202, 201, 99, 197, 147, 27, 74, 231, - 96, 247, 180, 233, 93, 59, 119, 119, 95, 183, 186, 27, 199, 119, 90, 123, - 191, 114, 185, 239, 238, 158, 78, 122, 245, 227, 139, 147, 47, 32, 158, 218, - 157, 218, 245, 222, 118, 243, 178, 209, 173, 183, 46, 143, 155, 106, 163, 225, - 212, 239, 247, 44, 171, 213, 56, 191, 186, 56, 191, 92, 63, 190, 159, 152, - 230, 142, 122, 105, 29, 28, 3, 209, 127, 236, 203, 173, 123, 239, 235, 110, - 253, 162, 91, 82, 91, 215, 141, 206, 176, 233, 52, 175, 119, 174, 173, 150, - 214, 60, 186, 182, 247, 110, 182, 15, 111, 148, 147, 189, 171, 141, 245, 198, - 201, 212, 215, 149, 182, 95, 173, 126, 189, 232, 158, 27, 181, 203, 122, 115, - 255, 204, 115, 175, 39, 32, 211, 209, 221, 99, 251, 112, 251, 65, 115, 157, - 157, 139, 218, 190, 169, 184, 167, 93, 181, 81, 235, 54, 191, 154, 214, 49, - 72, 146, 157, 177, 126, 114, 85, 62, 220, 245, 239, 142, 191, 140, 122, 39, - 237, 110, 99, 215, 57, 187, 240, 39, 116, 115, 76, 61, 237, 252, 236, 96, - 119, 163, 60, 62, 249, 218, 189, 108, 159, 143, 170, 104, 99, 114, 115, 105, - 229, 207, 235, 74, 215, 24, 223, 148, 79, 218, 165, 198, 169, 102, 202, 77, - 247, 110, 247, 206, 216, 222, 102, 81, 145, 214, 247, 207, 46, 42, 91, 238, - 96, 191, 215, 235, 173, 189, 172, 160, 254, 84, 42, 117, 204, 97, 111, 166, - 159, 158, 37, 36, 140, 171, 86, 95, 53, 114, 218, 235, 50, 47, 110, 250, - 104, 228, 210, 142, 137, 134, 73, 113, 27, 38, 137, 103, 186, 148, 140, 169, - 213, 113, 134, 20, 189, 190, 121, 24, 44, 45, 240, 136, 78, 108, 179, 67, - 49, 210, 187, 15, 130, 163, 65, 186, 174, 51, 196, 242, 46, 25, 89, 122, - 135, 74, 104, 181, 132, 214, 93, 49, 31, 117, 67, 221, 178, 62, 255, 230, - 251, 75, 174, 227, 74, 127, 216, 145, 129, 151, 9, 141, 114, 147, 175, 149, - 132, 153, 215, 170, 68, 182, 238, 3, 115, 36, 44, 168, 164, 88, 253, 164, - 74, 214, 13, 98, 4, 228, 80, 119, 121, 133, 157, 190, 110, 145, 253, 192, - 180, 177, 102, 165, 44, 87, 100, 178, 161, 83, 155, 108, 80, 131, 78, 72, - 137, 108, 187, 186, 221, 161, 197, 223, 74, 208, 165, 223, 74, 188, 123, 137, - 46, 159, 136, 193, 121, 108, 212, 24, 52, 12, 131, 119, 13, 117, 223, 236, - 64, 217, 41, 97, 211, 204, 2, 149, 253, 102, 126, 222, 118, 77, 40, 228, - 145, 93, 200, 194, 248, 101, 219, 250, 144, 98, 180, 45, 242, 105, 149, 252, - 20, 85, 153, 125, 206, 116, 39, 183, 150, 211, 115, 194, 216, 105, 90, 34, - 2, 230, 133, 109, 98, 58, 116, 92, 216, 158, 61, 103, 51, 238, 144, 120, - 107, 217, 157, 63, 202, 53, 88, 152, 108, 24, 182, 236, 201, 198, 16, 96, - 79, 191, 228, 188, 95, 158, 87, 159, 121, 188, 197, 167, 255, 197, 226, 132, - 229, 115, 159, 37, 145, 241, 191, 120, 160, 206, 138, 198, 34, 23, 179, 72, - 106, 69, 162, 177, 160, 141, 110, 145, 84, 48, 22, 94, 69, 196, 104, 150, - 52, 210, 134, 188, 15, 228, 243, 26, 230, 124, 200, 24, 166, 231, 179, 25, - 34, 10, 249, 109, 13, 227, 54, 102, 190, 21, 148, 239, 19, 141, 140, 251, - 166, 107, 121, 223, 10, 229, 66, 65, 253, 78, 164, 140, 155, 251, 188, 246, - 20, 172, 200, 197, 178, 164, 172, 62, 147, 94, 248, 170, 178, 215, 118, 248, - 90, 197, 215, 204, 71, 12, 119, 74, 114, 79, 240, 209, 51, 249, 88, 44, - 22, 225, 185, 39, 158, 225, 17, 74, 63, 103, 244, 176, 238, 14, 177, 139, - 34, 30, 34, 70, 193, 100, 193, 34, 163, 104, 149, 60, 16, 32, 188, 87, - 10, 248, 62, 201, 68, 241, 41, 85, 54, 164, 114, 20, 231, 79, 201, 180, - 113, 89, 170, 101, 233, 9, 170, 248, 152, 115, 181, 103, 241, 212, 139, 158, - 218, 218, 51, 185, 131, 198, 138, 82, 25, 195, 193, 179, 64, 147, 94, 159, - 215, 72, 120, 204, 216, 34, 169, 177, 152, 140, 97, 80, 183, 98, 198, 192, - 208, 110, 94, 95, 55, 156, 49, 150, 100, 225, 133, 63, 176, 176, 130, 201, - 112, 156, 108, 1, 176, 247, 98, 9, 202, 216, 57, 34, 166, 115, 86, 57, - 31, 55, 27, 91, 52, 76, 17, 195, 80, 53, 166, 124, 89, 88, 64, 72, - 117, 54, 74, 30, 66, 19, 118, 29, 64, 48, 143, 21, 73, 60, 248, 219, - 201, 216, 108, 162, 149, 10, 159, 61, 27, 103, 90, 169, 71, 47, 4, 163, - 127, 138, 249, 20, 115, 157, 8, 133, 200, 58, 74, 48, 198, 43, 155, 68, - 18, 190, 87, 88, 108, 74, 241, 111, 30, 152, 213, 87, 129, 57, 25, 184, - 213, 119, 110, 221, 94, 155, 240, 185, 10, 33, 60, 14, 177, 150, 222, 166, - 86, 49, 83, 21, 0, 10, 59, 214, 40, 70, 67, 26, 57, 166, 13, 31, - 202, 100, 168, 143, 112, 225, 216, 146, 209, 201, 8, 10, 221, 78, 166, 108, - 61, 100, 132, 105, 21, 3, 151, 170, 8, 24, 106, 24, 117, 180, 74, 188, - 123, 72, 100, 177, 54, 171, 176, 190, 182, 0, 178, 204, 88, 119, 71, 183, - 128, 148, 188, 17, 237, 248, 208, 125, 140, 188, 90, 97, 161, 110, 17, 40, - 176, 66, 175, 111, 118, 177, 85, 140, 152, 156, 137, 98, 153, 2, 114, 53, - 61, 86, 186, 46, 169, 100, 13, 183, 11, 2, 44, 76, 56, 201, 183, 173, - 192, 189, 197, 208, 209, 58, 235, 7, 212, 86, 198, 232, 158, 8, 207, 216, - 247, 201, 183, 130, 134, 139, 206, 160, 77, 37, 43, 242, 175, 138, 90, 95, - 197, 62, 179, 40, 175, 249, 16, 16, 134, 166, 205, 119, 0, 14, 51, 9, - 94, 10, 159, 173, 124, 8, 73, 26, 219, 76, 172, 236, 124, 192, 213, 204, - 29, 2, 2, 212, 252, 180, 130, 241, 133, 199, 207, 133, 241, 106, 73, 125, - 150, 106, 149, 15, 97, 76, 95, 104, 32, 12, 112, 46, 192, 149, 5, 70, - 87, 235, 100, 248, 0, 35, 228, 177, 31, 127, 250, 172, 192, 150, 101, 81, - 54, 97, 223, 67, 67, 2, 45, 229, 126, 42, 40, 184, 145, 88, 200, 205, - 167, 149, 113, 225, 73, 134, 70, 88, 19, 79, 43, 125, 124, 235, 179, 55, - 86, 151, 194, 226, 20, 98, 123, 28, 30, 230, 192, 73, 121, 35, 56, 1, - 201, 48, 157, 181, 167, 113, 169, 255, 44, 162, 212, 179, 4, 5, 171, 4, - 236, 169, 40, 117, 169, 92, 102, 51, 228, 199, 192, 76, 147, 10, 213, 217, - 198, 116, 227, 211, 4, 211, 144, 72, 80, 163, 125, 192, 131, 134, 178, 64, - 246, 109, 162, 192, 198, 52, 61, 199, 11, 220, 46, 208, 60, 205, 96, 251, - 179, 227, 88, 240, 4, 8, 79, 128, 41, 70, 107, 92, 246, 146, 241, 70, - 125, 234, 226, 151, 117, 194, 190, 43, 190, 241, 67, 146, 199, 178, 181, 26, - 12, 1, 31, 73, 7, 95, 221, 7, 205, 200, 24, 109, 120, 5, 40, 197, - 78, 0, 6, 38, 158, 7, 15, 74, 17, 246, 14, 22, 225, 163, 40, 104, - 176, 159, 49, 25, 224, 239, 35, 75, 134, 129, 168, 26, 139, 6, 204, 246, - 217, 29, 38, 2, 140, 192, 120, 36, 141, 197, 75, 5, 108, 138, 112, 151, - 10, 120, 49, 132, 32, 48, 40, 194, 150, 154, 128, 45, 6, 180, 124, 187, - 235, 8, 43, 200, 36, 220, 194, 144, 29, 151, 240, 168, 189, 44, 238, 55, - 70, 189, 21, 248, 38, 134, 89, 73, 85, 170, 74, 42, 67, 124, 44, 78, - 51, 91, 221, 219, 113, 255, 15, 18, 246, 57, 199, 146, 158, 25, 124, 51, - 28, 17, 210, 12, 30, 86, 151, 148, 24, 18, 128, 30, 176, 173, 232, 234, - 134, 169, 91, 12, 5, 66, 1, 216, 240, 20, 241, 161, 38, 51, 154, 8, - 163, 134, 255, 199, 137, 7, 91, 235, 56, 102, 228, 64, 250, 50, 108, 2, - 203, 1, 255, 125, 195, 220, 2, 143, 109, 250, 156, 37, 223, 159, 179, 18, - 11, 106, 157, 83, 0, 118, 187, 166, 133, 145, 69, 111, 65, 188, 235, 223, - 186, 157, 103, 52, 49, 24, 76, 89, 221, 197, 145, 221, 3, 200, 186, 101, - 69, 20, 6, 229, 248, 200, 127, 121, 104, 83, 235, 219, 119, 98, 146, 121, - 131, 5, 96, 3, 75, 115, 245, 16, 71, 124, 44, 34, 228, 134, 213, 202, - 132, 5, 202, 229, 161, 198, 115, 34, 53, 51, 40, 178, 24, 208, 100, 49, - 144, 246, 124, 194, 39, 12, 135, 205, 112, 1, 227, 68, 88, 174, 75, 49, - 180, 43, 5, 248, 132, 49, 207, 222, 215, 178, 240, 156, 229, 91, 115, 46, - 35, 139, 123, 148, 195, 84, 24, 15, 54, 54, 101, 185, 68, 105, 182, 34, - 79, 204, 195, 241, 74, 255, 111, 114, 9, 131, 186, 179, 93, 205, 163, 86, - 3, 176, 206, 197, 150, 150, 9, 11, 106, 14, 240, 200, 67, 166, 87, 158, - 5, 120, 97, 144, 245, 24, 150, 195, 142, 45, 27, 201, 60, 78, 18, 237, - 35, 63, 83, 145, 180, 98, 185, 177, 10, 163, 205, 230, 212, 44, 175, 229, - 109, 165, 21, 92, 253, 76, 12, 225, 81, 140, 169, 27, 2, 86, 118, 9, - 52, 45, 128, 19, 64, 19, 225, 255, 165, 124, 49, 87, 24, 198, 84, 16, - 131, 34, 217, 236, 223, 178, 241, 81, 102, 191, 103, 5, 135, 186, 225, 216, - 190, 107, 182, 129, 191, 193, 16, 185, 111, 137, 10, 155, 141, 82, 175, 64, - 80, 112, 2, 203, 32, 150, 57, 96, 178, 130, 223, 215, 237, 1, 65, 198, - 11, 120, 100, 104, 118, 68, 157, 17, 192, 225, 184, 239, 96, 228, 122, 222, - 14, 247, 37, 157, 184, 58, 97, 218, 4, 137, 194, 88, 159, 18, 192, 14, - 58, 180, 2, 56, 178, 24, 53, 211, 36, 109, 179, 71, 250, 65, 15, 63, - 252, 68, 146, 66, 6, 124, 94, 96, 149, 0, 71, 222, 154, 90, 0, 173, - 164, 105, 209, 9, 160, 4, 151, 115, 227, 66, 12, 89, 25, 233, 157, 129, - 222, 51, 237, 158, 68, 124, 234, 49, 95, 215, 63, 235, 195, 209, 175, 34, - 92, 177, 183, 26, 74, 4, 233, 117, 159, 232, 46, 140, 142, 172, 235, 189, - 78, 223, 76, 175, 248, 149, 26, 54, 117, 219, 164, 22, 57, 41, 146, 117, - 234, 2, 206, 234, 133, 78, 137, 222, 81, 215, 220, 69, 155, 117, 39, 232, - 89, 52, 152, 36, 234, 50, 104, 59, 232, 189, 161, 174, 125, 94, 151, 139, - 242, 30, 84, 132, 55, 102, 168, 155, 168, 41, 57, 95, 29, 12, 91, 252, - 114, 149, 27, 150, 30, 24, 80, 91, 0, 60, 208, 187, 198, 215, 12, 132, - 72, 103, 153, 76, 126, 155, 26, 244, 125, 21, 161, 200, 135, 53, 41, 191, - 2, 183, 6, 192, 110, 89, 32, 222, 165, 13, 238, 213, 229, 7, 232, 237, - 12, 8, 147, 100, 95, 152, 156, 183, 1, 211, 161, 62, 49, 97, 182, 55, - 117, 211, 155, 38, 42, 195, 185, 21, 53, 189, 173, 95, 219, 98, 158, 12, - 177, 136, 102, 135, 108, 82, 216, 255, 182, 190, 88, 241, 43, 85, 237, 233, - 176, 15, 183, 169, 219, 11, 60, 207, 73, 206, 246, 219, 70, 117, 238, 180, - 77, 221, 35, 219, 22, 53, 65, 210, 255, 179, 48, 116, 230, 180, 169, 11, - 27, 126, 27, 55, 203, 208, 241, 58, 250, 187, 0, 32, 14, 221, 172, 42, - 215, 76, 235, 151, 68, 226, 83, 143, 216, 16, 24, 134, 215, 6, 220, 68, - 36, 163, 179, 106, 169, 235, 44, 175, 246, 181, 221, 210, 119, 1, 54, 183, - 77, 106, 88, 115, 147, 214, 235, 78, 126, 12, 17, 132, 55, 238, 98, 117, - 48, 52, 91, 56, 245, 37, 242, 181, 233, 250, 241, 97, 242, 72, 224, 142, - 141, 130, 202, 43, 205, 236, 80, 219, 183, 232, 80, 183, 219, 180, 215, 211, - 221, 119, 0, 7, 87, 1, 237, 56, 99, 40, 250, 142, 253, 7, 24, 133, - 122, 100, 215, 177, 134, 240, 253, 28, 116, 190, 121, 185, 16, 156, 118, 3, - 199, 159, 135, 129, 183, 142, 192, 38, 7, 212, 180, 77, 151, 156, 7, 64, - 12, 92, 157, 236, 83, 219, 155, 67, 76, 111, 197, 186, 231, 206, 144, 124, - 161, 166, 149, 14, 53, 162, 71, 63, 14, 143, 83, 168, 212, 50, 230, 54, - 255, 123, 80, 84, 19, 232, 0, 249, 50, 214, 249, 232, 86, 244, 174, 75, - 87, 255, 92, 133, 64, 86, 44, 135, 28, 232, 67, 253, 133, 206, 109, 125, - 217, 4, 118, 192, 167, 61, 198, 223, 219, 175, 109, 110, 167, 143, 42, 196, - 193, 64, 247, 222, 177, 160, 45, 159, 111, 30, 96, 241, 129, 251, 128, 109, - 97, 233, 228, 192, 180, 131, 9, 117, 77, 58, 183, 168, 158, 217, 123, 173, - 51, 135, 186, 59, 72, 142, 12, 104, 143, 103, 189, 101, 28, 135, 122, 255, - 97, 142, 82, 38, 167, 229, 173, 29, 0, 52, 116, 250, 206, 62, 156, 1, - 146, 181, 201, 161, 137, 210, 148, 254, 206, 58, 206, 157, 128, 28, 15, 205, - 233, 123, 191, 63, 212, 3, 215, 33, 167, 1, 117, 59, 230, 123, 235, 56, - 233, 59, 190, 179, 225, 12, 205, 235, 244, 173, 21, 171, 233, 135, 224, 119, - 71, 119, 221, 41, 57, 246, 122, 142, 147, 100, 0, 12, 167, 19, 12, 1, - 63, 254, 120, 149, 251, 20, 32, 143, 156, 232, 61, 154, 138, 18, 223, 78, - 43, 57, 33, 242, 200, 9, 0, 180, 218, 248, 181, 111, 189, 147, 130, 239, - 235, 67, 192, 178, 39, 192, 69, 244, 151, 176, 73, 63, 54, 101, 129, 105, - 1, 31, 0, 148, 247, 76, 127, 236, 185, 230, 227, 59, 151, 244, 139, 238, - 122, 62, 80, 183, 51, 152, 9, 27, 232, 254, 28, 149, 140, 88, 129, 183, - 79, 24, 108, 149, 14, 84, 231, 60, 204, 83, 163, 142, 21, 248, 4, 77, - 246, 223, 192, 204, 147, 22, 76, 18, 206, 120, 249, 215, 119, 14, 236, 38, - 112, 161, 150, 62, 18, 86, 243, 125, 100, 164, 101, 130, 200, 227, 144, 29, - 215, 129, 37, 127, 95, 13, 62, 29, 1, 254, 27, 56, 222, 123, 55, 125, - 223, 225, 203, 147, 117, 124, 223, 201, 18, 168, 208, 247, 223, 201, 247, 31, - 4, 128, 202, 201, 249, 131, 107, 36, 41, 216, 23, 215, 244, 245, 31, 32, - 12, 176, 190, 208, 5, 114, 229, 88, 221, 238, 159, 6, 99, 16, 215, 108, - 131, 124, 165, 192, 178, 251, 143, 239, 26, 214, 161, 238, 251, 125, 228, 141, - 191, 210, 209, 40, 157, 49, 126, 161, 134, 200, 23, 192, 166, 51, 182, 45, - 71, 55, 200, 214, 196, 71, 22, 223, 2, 9, 2, 166, 229, 19, 129, 204, - 91, 67, 100, 222, 66, 37, 183, 8, 193, 18, 75, 182, 157, 80, 137, 179, - 162, 44, 57, 31, 100, 158, 15, 248, 84, 144, 177, 9, 194, 123, 88, 21, - 147, 228, 105, 216, 22, 214, 137, 197, 0, 67, 4, 232, 26, 161, 61, 37, - 30, 114, 213, 33, 175, 226, 116, 195, 147, 49, 33, 217, 195, 32, 67, 127, - 10, 43, 144, 10, 229, 134, 132, 14, 3, 14, 84, 152, 45, 97, 97, 203, - 236, 245, 125, 98, 81, 125, 224, 69, 105, 176, 200, 166, 40, 65, 253, 78, - 177, 88, 140, 187, 73, 128, 181, 96, 189, 52, 109, 207, 23, 170, 134, 33, - 129, 185, 69, 29, 190, 137, 128, 232, 139, 94, 2, 54, 102, 231, 147, 136, - 203, 136, 225, 50, 221, 126, 179, 203, 79, 240, 96, 196, 14, 124, 192, 186, - 194, 143, 61, 199, 142, 253, 139, 79, 108, 10, 35, 211, 177, 46, 216, 147, - 80, 85, 212, 44, 194, 158, 107, 83, 100, 160, 109, 27, 79, 10, 160, 118, - 221, 158, 14, 29, 151, 50, 253, 133, 107, 96, 189, 14, 78, 13, 159, 22, - 49, 29, 156, 201, 22, 115, 84, 92, 226, 214, 97, 201, 194, 0, 4, 240, - 64, 95, 76, 109, 186, 150, 117, 169, 145, 253, 124, 165, 187, 128, 44, 122, - 159, 68, 156, 46, 6, 98, 77, 4, 22, 203, 241, 177, 81, 92, 38, 150, - 200, 38, 169, 77, 163, 213, 228, 75, 230, 207, 22, 187, 200, 125, 94, 116, - 160, 1, 95, 31, 80, 24, 182, 229, 192, 214, 240, 81, 52, 253, 41, 214, - 83, 143, 142, 160, 75, 240, 171, 51, 87, 28, 177, 222, 110, 59, 232, 16, - 195, 165, 133, 8, 50, 217, 169, 112, 171, 3, 5, 59, 125, 248, 232, 182, - 237, 56, 214, 138, 188, 250, 134, 186, 94, 31, 121, 211, 98, 144, 136, 135, - 52, 100, 5, 150, 39, 208, 173, 85, 2, 123, 178, 239, 24, 241, 217, 248, - 195, 222, 235, 74, 44, 210, 25, 172, 15, 65, 186, 232, 216, 158, 20, 30, - 85, 71, 254, 61, 2, 155, 249, 218, 128, 37, 115, 41, 200, 246, 32, 52, - 11, 8, 199, 17, 224, 202, 237, 137, 21, 231, 224, 129, 179, 20, 223, 23, - 81, 191, 161, 121, 143, 198, 55, 7, 239, 153, 53, 5, 166, 25, 79, 205, - 209, 219, 7, 180, 83, 124, 52, 71, 172, 192, 42, 209, 125, 190, 10, 186, - 1, 84, 219, 243, 72, 220, 217, 71, 220, 35, 202, 188, 170, 23, 255, 70, - 187, 27, 235, 91, 230, 213, 228, 6, 250, 59, 12, 60, 108, 6, 208, 178, - 65, 59, 206, 112, 196, 90, 194, 237, 194, 59, 137, 234, 56, 216, 99, 0, - 19, 48, 27, 188, 55, 110, 167, 143, 51, 203, 122, 7, 187, 218, 177, 44, - 103, 140, 168, 210, 114, 58, 108, 155, 124, 138, 169, 221, 10, 97, 36, 185, - 11, 219, 156, 224, 164, 23, 152, 10, 208, 155, 194, 254, 27, 122, 81, 128, - 58, 177, 122, 109, 43, 160, 89, 102, 8, 144, 219, 61, 62, 220, 42, 21, - 161, 245, 174, 201, 245, 214, 165, 240, 52, 158, 7, 157, 91, 108, 225, 202, - 180, 97, 222, 61, 6, 210, 175, 214, 255, 161, 121, 114, 178, 217, 60, 111, - 46, 86, 29, 63, 144, 95, 10, 140, 82, 98, 87, 102, 5, 138, 110, 6, - 176, 198, 238, 167, 153, 20, 187, 232, 87, 220, 252, 92, 228, 106, 217, 3, - 29, 241, 57, 185, 24, 193, 26, 81, 246, 137, 42, 43, 229, 146, 82, 45, - 201, 101, 86, 44, 68, 243, 217, 213, 76, 42, 214, 38, 159, 50, 168, 232, - 103, 124, 72, 215, 1, 224, 28, 134, 106, 124, 120, 98, 250, 123, 166, 182, - 183, 145, 83, 187, 101, 120, 114, 45, 247, 84, 184, 237, 78, 110, 57, 106, - 165, 60, 241, 57, 115, 11, 160, 36, 10, 204, 3, 18, 182, 131, 181, 12, - 145, 52, 120, 212, 247, 50, 248, 208, 53, 39, 162, 60, 251, 189, 205, 220, - 2, 234, 23, 41, 104, 109, 242, 24, 111, 153, 97, 109, 68, 218, 97, 235, - 44, 225, 150, 161, 113, 209, 246, 172, 72, 106, 251, 81, 246, 172, 245, 217, - 23, 188, 237, 217, 251, 98, 251, 78, 207, 89, 11, 207, 61, 116, 183, 71, - 111, 13, 74, 31, 116, 67, 18, 105, 108, 146, 231, 210, 120, 185, 33, 147, - 181, 146, 229, 146, 105, 128, 56, 219, 212, 229, 197, 231, 210, 88, 113, 201, - 117, 12, 67, 84, 39, 158, 89, 186, 24, 54, 246, 44, 229, 148, 102, 54, - 74, 44, 32, 6, 136, 143, 11, 99, 243, 128, 55, 97, 7, 69, 133, 91, - 241, 44, 102, 84, 100, 188, 84, 185, 40, 194, 255, 136, 37, 20, 105, 120, - 194, 20, 107, 197, 160, 67, 62, 131, 236, 201, 227, 45, 176, 196, 151, 234, - 103, 5, 120, 181, 236, 81, 116, 222, 94, 147, 51, 183, 71, 107, 225, 113, - 202, 28, 132, 74, 185, 52, 200, 73, 166, 194, 76, 36, 18, 120, 167, 87, - 159, 51, 35, 215, 233, 49, 228, 5, 45, 164, 238, 24, 216, 45, 162, 21, - 101, 121, 137, 88, 171, 47, 149, 98, 189, 120, 161, 0, 239, 213, 139, 69, - 112, 90, 176, 64, 212, 111, 69, 94, 214, 115, 216, 235, 9, 219, 158, 220, - 83, 108, 2, 114, 10, 90, 249, 132, 239, 236, 216, 144, 47, 1, 100, 228, - 158, 160, 248, 31, 132, 217, 253, 204, 127, 244, 92, 132, 20, 92, 31, 120, - 206, 60, 144, 60, 161, 208, 169, 108, 68, 160, 179, 185, 176, 52, 121, 32, - 5, 126, 178, 175, 102, 201, 63, 254, 65, 178, 63, 153, 30, 230, 173, 196, - 78, 40, 163, 194, 171, 207, 236, 252, 17, 178, 16, 76, 160, 234, 210, 172, - 30, 135, 164, 125, 17, 195, 92, 136, 182, 240, 212, 47, 154, 146, 39, 152, - 147, 143, 185, 91, 187, 148, 187, 61, 2, 216, 182, 243, 107, 10, 55, 237, - 225, 152, 121, 155, 243, 162, 155, 76, 233, 241, 163, 135, 82, 201, 147, 37, - 160, 107, 54, 38, 161, 3, 47, 158, 194, 28, 113, 141, 102, 142, 184, 152, - 193, 195, 216, 113, 7, 200, 14, 5, 192, 40, 152, 54, 32, 95, 3, 178, - 226, 85, 162, 171, 179, 130, 1, 243, 143, 36, 83, 112, 115, 226, 236, 138, - 157, 123, 37, 125, 135, 141, 64, 26, 51, 129, 187, 40, 38, 206, 170, 206, - 29, 224, 32, 128, 57, 228, 12, 5, 227, 52, 225, 219, 14, 112, 40, 62, - 50, 95, 75, 99, 186, 18, 207, 159, 194, 254, 205, 130, 8, 100, 153, 157, - 236, 231, 34, 110, 204, 121, 178, 198, 14, 124, 77, 193, 241, 2, 217, 225, - 148, 150, 49, 225, 64, 202, 145, 57, 93, 113, 88, 70, 72, 34, 63, 148, - 112, 76, 162, 46, 40, 5, 252, 172, 32, 181, 171, 179, 163, 183, 61, 63, - 98, 35, 161, 155, 6, 161, 58, 176, 117, 140, 65, 68, 30, 33, 54, 98, - 75, 15, 236, 78, 159, 26, 18, 158, 224, 141, 145, 237, 16, 178, 192, 25, - 237, 194, 146, 247, 177, 137, 168, 214, 118, 0, 130, 34, 8, 5, 129, 109, - 8, 115, 58, 52, 96, 116, 241, 44, 19, 152, 238, 85, 54, 131, 8, 39, - 212, 40, 98, 15, 24, 43, 211, 198, 41, 130, 169, 1, 26, 7, 140, 157, - 215, 49, 77, 54, 100, 41, 228, 100, 112, 41, 177, 38, 224, 118, 44, 157, - 243, 245, 184, 246, 198, 140, 129, 199, 157, 27, 233, 105, 34, 113, 37, 148, - 94, 86, 198, 32, 98, 162, 20, 107, 138, 174, 199, 193, 8, 207, 196, 2, - 128, 155, 85, 60, 225, 156, 77, 9, 48, 112, 116, 214, 0, 131, 3, 116, - 15, 231, 49, 62, 124, 230, 206, 13, 128, 118, 25, 231, 31, 131, 219, 173, - 137, 201, 69, 211, 176, 71, 104, 135, 169, 91, 56, 237, 83, 18, 66, 30, - 3, 180, 177, 62, 157, 173, 208, 21, 116, 27, 191, 210, 67, 9, 142, 241, - 175, 158, 224, 192, 77, 59, 57, 16, 151, 222, 7, 38, 76, 45, 23, 81, - 188, 1, 12, 4, 32, 30, 214, 35, 170, 15, 249, 92, 24, 90, 143, 218, - 32, 29, 33, 23, 203, 236, 117, 160, 158, 7, 234, 78, 73, 151, 142, 145, - 57, 133, 241, 204, 153, 122, 46, 3, 93, 182, 196, 248, 197, 90, 150, 51, - 194, 217, 207, 91, 19, 134, 68, 217, 28, 145, 7, 0, 105, 3, 225, 100, - 6, 136, 8, 10, 83, 18, 114, 244, 203, 230, 13, 185, 61, 158, 113, 56, - 37, 180, 219, 5, 145, 12, 138, 12, 167, 183, 252, 89, 154, 61, 50, 46, - 240, 245, 106, 62, 145, 150, 217, 27, 234, 144, 211, 5, 68, 233, 175, 168, - 104, 53, 32, 175, 190, 250, 117, 212, 14, 249, 36, 14, 237, 153, 249, 23, - 201, 41, 196, 22, 54, 41, 19, 199, 125, 177, 154, 40, 245, 192, 113, 6, - 33, 3, 14, 200, 158, 186, 212, 238, 160, 0, 23, 87, 48, 162, 252, 139, - 249, 225, 161, 0, 158, 174, 163, 117, 8, 136, 12, 28, 102, 122, 192, 197, - 227, 26, 2, 251, 46, 33, 80, 2, 213, 115, 109, 130, 130, 234, 12, 106, - 214, 167, 172, 14, 128, 164, 153, 205, 47, 180, 5, 184, 3, 160, 156, 161, - 37, 52, 147, 161, 28, 155, 48, 187, 223, 14, 108, 66, 0, 172, 16, 56, - 199, 166, 223, 71, 171, 96, 225, 31, 17, 150, 62, 24, 122, 51, 33, 29, - 121, 119, 134, 71, 153, 125, 7, 195, 145, 54, 208, 36, 34, 204, 15, 216, - 238, 139, 3, 102, 241, 77, 236, 121, 138, 148, 180, 34, 75, 217, 111, 202, - 119, 33, 102, 47, 153, 179, 152, 167, 200, 144, 167, 137, 74, 22, 189, 190, - 63, 180, 178, 75, 235, 86, 195, 186, 97, 75, 153, 35, 182, 213, 194, 153, - 79, 169, 54, 204, 42, 1, 38, 165, 147, 215, 234, 214, 190, 39, 212, 3, - 196, 23, 222, 34, 211, 42, 22, 89, 108, 155, 68, 53, 166, 153, 32, 199, - 232, 37, 176, 229, 93, 94, 98, 153, 97, 248, 15, 109, 220, 86, 48, 26, - 57, 46, 46, 255, 107, 155, 19, 215, 182, 32, 52, 19, 161, 237, 70, 207, - 129, 101, 231, 56, 18, 192, 85, 244, 139, 153, 134, 120, 162, 94, 14, 215, - 64, 154, 239, 96, 55, 45, 241, 128, 9, 123, 46, 70, 72, 14, 129, 13, - 2, 48, 245, 201, 149, 99, 247, 102, 208, 215, 52, 96, 13, 208, 42, 2, - 200, 204, 208, 162, 211, 89, 206, 9, 76, 144, 165, 19, 16, 144, 227, 229, - 23, 140, 237, 241, 64, 182, 13, 28, 19, 208, 32, 144, 85, 135, 165, 172, - 56, 163, 93, 231, 105, 104, 116, 31, 171, 147, 226, 218, 237, 58, 99, 180, - 16, 145, 226, 125, 179, 240, 64, 5, 201, 147, 245, 224, 204, 50, 88, 85, - 62, 118, 112, 219, 165, 102, 159, 186, 46, 121, 192, 130, 186, 213, 65, 254, - 35, 42, 119, 228, 224, 17, 220, 249, 212, 133, 77, 99, 205, 146, 119, 0, - 103, 83, 236, 74, 112, 31, 160, 57, 79, 172, 69, 179, 143, 220, 214, 186, - 14, 100, 71, 183, 157, 135, 89, 206, 153, 99, 117, 201, 145, 73, 71, 46, - 80, 206, 254, 96, 150, 113, 233, 88, 131, 33, 16, 212, 29, 234, 13, 104, - 172, 38, 106, 219, 14, 57, 191, 115, 168, 53, 160, 238, 146, 137, 66, 240, - 108, 3, 223, 4, 187, 179, 221, 55, 239, 40, 245, 229, 74, 177, 13, 44, - 180, 55, 114, 124, 54, 109, 163, 146, 222, 118, 2, 191, 48, 164, 69, 182, - 17, 62, 55, 69, 65, 232, 61, 126, 151, 156, 199, 133, 202, 209, 171, 107, - 27, 143, 72, 96, 151, 218, 212, 47, 13, 112, 42, 7, 62, 204, 171, 66, - 101, 29, 106, 115, 45, 10, 76, 244, 1, 245, 108, 147, 142, 189, 129, 158, - 172, 239, 200, 236, 192, 12, 194, 124, 233, 157, 142, 211, 142, 141, 110, 151, - 90, 67, 144, 174, 15, 65, 120, 175, 168, 191, 246, 209, 92, 129, 218, 113, - 24, 9, 96, 18, 131, 206, 32, 1, 57, 243, 48, 130, 157, 235, 2, 59, - 54, 112, 217, 80, 109, 58, 30, 154, 3, 58, 205, 126, 62, 68, 69, 200, - 58, 108, 153, 100, 111, 142, 45, 243, 193, 4, 56, 57, 160, 29, 221, 29, - 198, 122, 179, 101, 140, 81, 63, 185, 103, 131, 16, 51, 124, 185, 189, 94, - 224, 21, 128, 12, 91, 122, 175, 104, 208, 18, 127, 42, 53, 97, 231, 88, - 80, 51, 186, 223, 245, 105, 23, 64, 134, 157, 107, 170, 245, 95, 13, 16, - 120, 220, 194, 1, 247, 192, 27, 7, 19, 96, 212, 44, 24, 38, 32, 244, - 216, 218, 182, 30, 139, 23, 177, 55, 164, 33, 95, 92, 189, 235, 207, 210, - 0, 92, 1, 39, 152, 3, 178, 101, 141, 169, 27, 203, 216, 71, 86, 186, - 131, 43, 225, 128, 28, 99, 188, 178, 164, 168, 139, 110, 7, 61, 54, 109, - 67, 58, 4, 177, 186, 244, 5, 224, 237, 43, 176, 126, 48, 125, 248, 72, - 129, 182, 180, 204, 33, 112, 105, 111, 128, 144, 216, 34, 140, 240, 232, 207, - 43, 41, 74, 185, 161, 85, 149, 170, 246, 63, 71, 114, 165, 132, 43, 98, - 57, 30, 217, 48, 131, 193, 220, 68, 232, 182, 101, 58, 176, 95, 92, 199, - 138, 237, 79, 126, 168, 76, 199, 58, 99, 134, 7, 230, 242, 53, 25, 82, - 195, 212, 7, 176, 75, 5, 146, 216, 52, 13, 182, 196, 230, 112, 14, 20, - 127, 254, 155, 86, 87, 126, 157, 246, 32, 3, 64, 216, 35, 231, 58, 16, - 90, 47, 222, 19, 152, 192, 33, 183, 117, 89, 214, 30, 163, 6, 64, 117, - 131, 54, 107, 13, 144, 178, 94, 232, 251, 217, 207, 187, 166, 235, 120, 125, - 19, 234, 28, 208, 129, 62, 158, 107, 25, 214, 12, 16, 30, 82, 68, 228, - 111, 95, 220, 203, 233, 147, 89, 110, 168, 245, 178, 44, 55, 96, 46, 203, - 48, 196, 45, 11, 181, 134, 100, 55, 0, 238, 18, 96, 124, 110, 129, 240, - 28, 18, 97, 175, 242, 171, 71, 90, 206, 208, 233, 77, 95, 26, 77, 122, - 131, 32, 25, 4, 174, 217, 241, 178, 159, 247, 81, 115, 75, 54, 29, 119, - 110, 76, 128, 60, 76, 164, 121, 119, 70, 48, 112, 30, 204, 206, 11, 77, - 12, 245, 209, 200, 244, 250, 188, 126, 60, 103, 21, 24, 41, 192, 234, 129, - 109, 35, 27, 206, 176, 237, 145, 18, 172, 0, 43, 248, 2, 188, 161, 223, - 235, 133, 206, 182, 65, 106, 129, 157, 146, 253, 188, 126, 206, 30, 94, 129, - 215, 138, 44, 143, 38, 124, 249, 70, 142, 129, 82, 167, 101, 176, 109, 139, - 187, 109, 221, 69, 158, 59, 89, 67, 43, 240, 116, 216, 15, 100, 71, 111, - 3, 193, 180, 18, 208, 40, 172, 143, 54, 28, 32, 16, 186, 109, 198, 161, - 9, 8, 235, 121, 223, 25, 38, 208, 218, 230, 29, 133, 157, 59, 29, 244, - 97, 252, 73, 100, 160, 3, 54, 216, 64, 162, 129, 202, 192, 248, 62, 0, - 97, 207, 28, 226, 121, 30, 64, 245, 76, 66, 152, 209, 175, 205, 160, 141, - 71, 125, 113, 168, 218, 47, 66, 85, 32, 185, 5, 203, 32, 45, 68, 101, - 54, 8, 32, 232, 73, 155, 114, 207, 225, 199, 131, 129, 153, 28, 250, 166, - 238, 154, 129, 247, 8, 141, 12, 245, 151, 235, 226, 218, 59, 177, 7, 67, - 83, 138, 120, 85, 91, 64, 49, 97, 130, 119, 17, 181, 120, 94, 12, 169, - 175, 91, 65, 183, 219, 242, 225, 231, 196, 138, 147, 222, 180, 86, 208, 26, - 13, 109, 35, 96, 190, 108, 224, 200, 178, 120, 44, 200, 18, 96, 66, 116, - 123, 30, 197, 34, 205, 214, 73, 171, 131, 44, 200, 203, 245, 50, 72, 26, - 129, 160, 232, 224, 8, 178, 159, 25, 249, 105, 233, 193, 3, 125, 5, 152, - 12, 221, 5, 98, 216, 70, 179, 44, 15, 79, 115, 12, 96, 209, 14, 116, - 224, 205, 15, 77, 36, 219, 115, 179, 73, 97, 86, 96, 79, 38, 121, 137, - 180, 254, 0, 87, 1, 44, 119, 0, 168, 190, 175, 119, 144, 71, 182, 208, - 36, 6, 9, 48, 244, 141, 142, 128, 182, 233, 244, 81, 95, 210, 55, 18, - 171, 8, 184, 20, 219, 153, 22, 124, 192, 235, 190, 199, 199, 198, 64, 118, - 74, 78, 204, 7, 116, 182, 1, 255, 94, 222, 111, 134, 99, 161, 145, 51, - 124, 91, 12, 6, 81, 84, 207, 99, 150, 248, 202, 228, 192, 48, 113, 62, - 75, 128, 80, 97, 204, 217, 207, 252, 239, 203, 205, 97, 167, 117, 59, 48, - 116, 147, 205, 101, 147, 61, 38, 63, 225, 6, 18, 45, 224, 232, 108, 253, - 101, 206, 104, 4, 0, 85, 236, 57, 14, 112, 206, 12, 50, 131, 146, 92, - 106, 3, 105, 170, 149, 203, 138, 170, 213, 26, 117, 160, 208, 154, 172, 40, - 154, 82, 135, 84, 181, 82, 174, 85, 107, 213, 122, 165, 166, 169, 178, 90, - 175, 151, 203, 117, 142, 169, 16, 30, 128, 58, 145, 109, 192, 186, 176, 213, - 146, 189, 57, 8, 204, 158, 9, 64, 6, 139, 14, 227, 125, 129, 80, 33, - 87, 86, 28, 233, 190, 129, 19, 200, 120, 41, 172, 215, 15, 173, 89, 19, - 35, 12, 96, 99, 239, 163, 68, 121, 230, 0, 27, 221, 11, 232, 35, 185, - 4, 18, 50, 43, 129, 152, 5, 104, 216, 190, 62, 112, 218, 179, 212, 47, - 128, 41, 214, 145, 3, 134, 222, 14, 233, 248, 229, 89, 238, 232, 35, 60, - 197, 27, 58, 40, 162, 113, 208, 104, 5, 134, 185, 200, 167, 32, 106, 58, - 1, 250, 230, 15, 98, 29, 104, 2, 239, 104, 152, 192, 179, 90, 93, 199, - 126, 137, 219, 0, 254, 117, 234, 89, 69, 64, 179, 6, 211, 39, 9, 20, - 209, 210, 219, 72, 195, 90, 157, 62, 231, 147, 186, 76, 151, 247, 26, 100, - 188, 204, 182, 172, 7, 32, 129, 29, 255, 114, 229, 56, 198, 92, 93, 48, - 151, 62, 159, 44, 108, 81, 31, 197, 161, 102, 211, 25, 154, 54, 48, 84, - 87, 40, 141, 198, 240, 15, 90, 45, 15, 200, 97, 231, 64, 15, 122, 125, - 216, 127, 47, 140, 81, 109, 232, 197, 78, 31, 70, 181, 15, 188, 151, 71, - 174, 244, 222, 2, 17, 137, 190, 193, 97, 152, 19, 29, 16, 171, 137, 195, - 248, 127, 255, 239, 255, 39, 251, 249, 210, 129, 45, 133, 130, 138, 121, 205, - 50, 230, 89, 36, 119, 0, 244, 86, 55, 226, 172, 240, 1, 114, 47, 64, - 127, 123, 86, 16, 159, 254, 3, 74, 17, 211, 154, 128, 242, 98, 24, 22, - 79, 108, 129, 189, 221, 4, 164, 98, 119, 128, 15, 139, 9, 37, 58, 154, - 43, 238, 192, 226, 56, 118, 1, 164, 26, 212, 80, 196, 217, 98, 224, 165, - 224, 51, 3, 205, 174, 95, 96, 193, 64, 208, 30, 185, 166, 13, 24, 198, - 113, 123, 48, 13, 59, 32, 202, 194, 110, 241, 31, 133, 197, 118, 114, 60, - 95, 61, 199, 242, 129, 213, 133, 189, 21, 167, 52, 204, 48, 127, 23, 40, - 109, 12, 202, 184, 88, 183, 78, 237, 158, 143, 214, 84, 177, 226, 38, 237, - 57, 228, 8, 169, 28, 236, 200, 89, 250, 21, 8, 102, 166, 62, 36, 231, - 99, 74, 141, 216, 116, 181, 250, 58, 72, 141, 192, 51, 57, 110, 172, 22, - 52, 187, 65, 235, 175, 195, 192, 6, 145, 236, 21, 2, 55, 245, 216, 13, - 100, 83, 179, 11, 99, 188, 83, 200, 118, 204, 33, 75, 109, 178, 212, 43, - 58, 47, 77, 129, 24, 162, 35, 135, 11, 131, 136, 205, 234, 140, 118, 175, - 211, 0, 141, 180, 99, 196, 224, 28, 77, 25, 214, 131, 68, 111, 54, 157, - 160, 3, 112, 136, 147, 234, 196, 110, 100, 160, 249, 20, 69, 235, 147, 126, - 76, 98, 97, 188, 10, 72, 148, 192, 102, 46, 35, 49, 203, 185, 190, 62, - 181, 7, 32, 223, 1, 75, 9, 28, 45, 60, 147, 47, 236, 101, 142, 189, - 116, 97, 161, 96, 67, 185, 134, 30, 155, 201, 13, 228, 223, 209, 20, 23, - 63, 136, 193, 215, 156, 105, 244, 110, 160, 199, 101, 150, 180, 121, 190, 3, - 28, 225, 249, 238, 116, 64, 93, 129, 42, 80, 178, 129, 165, 98, 73, 201, - 190, 156, 193, 47, 224, 223, 101, 76, 195, 242, 145, 122, 58, 202, 239, 64, - 87, 117, 223, 129, 22, 206, 216, 3, 16, 124, 76, 125, 23, 22, 210, 45, - 218, 149, 179, 159, 17, 96, 93, 242, 85, 239, 1, 39, 55, 120, 11, 161, - 3, 70, 219, 4, 26, 169, 251, 72, 234, 216, 11, 185, 52, 59, 38, 159, - 53, 155, 108, 195, 46, 159, 35, 152, 151, 166, 141, 138, 122, 220, 212, 195, - 248, 26, 207, 160, 170, 229, 59, 32, 108, 255, 184, 196, 166, 85, 53, 185, - 86, 173, 40, 66, 202, 56, 227, 6, 136, 184, 251, 64, 196, 66, 21, 110, - 130, 151, 113, 139, 161, 12, 191, 175, 187, 122, 240, 250, 254, 225, 148, 228, - 14, 137, 119, 155, 118, 6, 98, 255, 8, 250, 178, 78, 231, 177, 196, 124, - 29, 136, 71, 44, 144, 109, 105, 209, 15, 134, 109, 43, 4, 14, 232, 37, - 58, 11, 112, 152, 220, 59, 55, 85, 59, 166, 135, 138, 166, 3, 199, 89, - 46, 213, 47, 99, 19, 242, 12, 253, 159, 211, 158, 63, 164, 83, 88, 96, - 116, 185, 0, 242, 10, 39, 10, 81, 242, 60, 183, 140, 172, 209, 23, 192, - 72, 238, 82, 173, 69, 56, 255, 83, 224, 43, 128, 115, 231, 237, 121, 208, - 192, 192, 238, 140, 124, 5, 217, 59, 174, 201, 234, 205, 13, 70, 92, 168, - 194, 60, 106, 250, 32, 195, 46, 35, 72, 208, 0, 172, 155, 133, 135, 12, - 118, 113, 76, 219, 208, 2, 72, 114, 200, 225, 163, 240, 85, 162, 32, 98, - 129, 216, 83, 80, 10, 248, 90, 128, 22, 35, 173, 8, 176, 48, 243, 2, - 192, 124, 205, 32, 233, 249, 142, 219, 101, 55, 187, 166, 49, 69, 147, 14, - 68, 140, 101, 1, 200, 178, 188, 57, 17, 138, 43, 69, 216, 216, 126, 116, - 33, 54, 205, 161, 9, 84, 196, 241, 78, 188, 105, 167, 239, 244, 224, 9, - 165, 124, 145, 72, 102, 169, 175, 112, 163, 243, 149, 231, 97, 195, 249, 230, - 65, 0, 140, 20, 219, 124, 62, 226, 18, 103, 94, 107, 176, 24, 242, 126, - 140, 71, 84, 28, 252, 238, 232, 20, 149, 152, 32, 145, 27, 64, 69, 153, - 66, 147, 156, 3, 118, 188, 209, 231, 177, 166, 224, 215, 182, 172, 46, 224, - 54, 39, 6, 140, 151, 128, 57, 108, 31, 89, 161, 117, 103, 218, 137, 81, - 137, 29, 10, 180, 20, 8, 150, 142, 230, 79, 126, 28, 200, 80, 36, 67, - 170, 18, 103, 199, 184, 106, 244, 139, 237, 76, 150, 175, 157, 239, 12, 125, - 148, 176, 237, 30, 219, 241, 140, 31, 141, 86, 144, 9, 128, 162, 151, 231, - 188, 212, 156, 134, 181, 143, 164, 117, 68, 206, 200, 87, 19, 248, 136, 97, - 66, 224, 164, 76, 145, 170, 219, 29, 199, 244, 102, 20, 10, 83, 30, 177, - 184, 75, 227, 56, 26, 32, 217, 243, 16, 74, 28, 2, 136, 247, 49, 70, - 189, 207, 61, 224, 246, 129, 234, 120, 253, 23, 248, 104, 38, 7, 58, 19, - 151, 118, 56, 10, 89, 103, 207, 228, 192, 55, 94, 71, 184, 99, 199, 234, - 246, 96, 113, 0, 91, 141, 169, 249, 24, 145, 152, 43, 145, 142, 220, 33, - 207, 120, 189, 46, 188, 16, 101, 15, 185, 169, 126, 136, 140, 146, 230, 251, - 9, 180, 237, 160, 22, 151, 172, 187, 186, 241, 162, 74, 115, 1, 74, 145, - 204, 59, 95, 1, 197, 102, 153, 193, 180, 67, 240, 249, 229, 222, 165, 215, - 113, 78, 13, 221, 50, 204, 176, 26, 241, 250, 114, 77, 157, 41, 187, 255, - 213, 115, 117, 188, 49, 207, 231, 27, 68, 18, 224, 182, 145, 211, 76, 126, - 11, 204, 2, 122, 46, 1, 88, 134, 93, 185, 110, 233, 254, 35, 144, 179, - 56, 43, 128, 202, 68, 38, 167, 39, 56, 185, 93, 234, 98, 27, 168, 122, - 183, 232, 203, 51, 62, 20, 22, 188, 133, 71, 102, 193, 139, 250, 215, 236, - 162, 89, 111, 188, 79, 51, 162, 120, 136, 219, 166, 211, 137, 107, 104, 138, - 228, 172, 56, 199, 101, 31, 152, 246, 11, 124, 46, 219, 49, 67, 10, 219, - 177, 79, 123, 230, 112, 36, 184, 93, 166, 216, 71, 5, 141, 237, 184, 254, - 15, 34, 33, 144, 58, 181, 74, 77, 174, 215, 43, 114, 165, 92, 175, 215, - 42, 213, 186, 170, 133, 196, 70, 240, 196, 168, 168, 116, 94, 94, 167, 30, - 181, 77, 64, 235, 93, 95, 0, 34, 208, 108, 64, 231, 118, 175, 111, 218, - 120, 143, 224, 13, 60, 13, 218, 102, 88, 122, 219, 43, 154, 92, 46, 69, - 121, 247, 4, 65, 100, 81, 226, 77, 23, 108, 17, 165, 12, 241, 112, 160, - 23, 1, 138, 201, 41, 243, 134, 227, 206, 43, 131, 222, 48, 47, 149, 70, - 69, 171, 86, 171, 106, 173, 81, 145, 27, 141, 74, 67, 173, 212, 179, 11, - 119, 35, 126, 176, 206, 106, 181, 2, 34, 191, 82, 174, 42, 114, 185, 166, - 1, 195, 83, 174, 113, 0, 2, 126, 214, 126, 11, 231, 23, 231, 154, 216, - 181, 106, 32, 7, 116, 48, 160, 86, 73, 208, 128, 75, 234, 62, 80, 239, - 37, 40, 88, 206, 147, 122, 94, 63, 24, 209, 82, 164, 139, 108, 225, 235, - 91, 106, 2, 182, 195, 233, 24, 29, 166, 83, 24, 155, 3, 19, 170, 216, - 102, 137, 168, 6, 4, 177, 209, 4, 17, 14, 53, 97, 27, 125, 192, 220, - 175, 224, 14, 198, 150, 186, 254, 24, 133, 22, 131, 117, 15, 173, 248, 61, - 0, 172, 238, 240, 119, 124, 52, 214, 20, 185, 161, 192, 90, 28, 76, 45, - 74, 190, 0, 219, 111, 97, 141, 51, 172, 143, 246, 3, 111, 58, 64, 254, - 51, 199, 160, 161, 147, 168, 208, 71, 212, 219, 15, 67, 175, 232, 47, 15, - 120, 176, 223, 161, 230, 3, 101, 209, 2, 203, 101, 150, 49, 138, 252, 78, - 49, 235, 141, 132, 201, 6, 144, 232, 126, 224, 1, 150, 241, 209, 106, 131, - 116, 245, 152, 28, 150, 252, 15, 205, 126, 59, 236, 62, 126, 155, 134, 54, - 44, 229, 10, 194, 42, 154, 206, 178, 206, 146, 79, 171, 239, 63, 179, 29, - 205, 13, 156, 172, 224, 80, 108, 223, 154, 206, 198, 212, 53, 93, 207, 95, - 37, 111, 58, 189, 93, 216, 53, 161, 147, 51, 244, 105, 17, 54, 86, 147, - 139, 119, 163, 94, 54, 186, 128, 125, 197, 68, 90, 182, 95, 200, 202, 69, - 171, 185, 250, 194, 46, 76, 171, 175, 218, 224, 245, 161, 138, 107, 68, 182, - 105, 219, 229, 136, 155, 172, 156, 160, 144, 11, 196, 179, 116, 72, 1, 155, - 118, 244, 31, 174, 185, 206, 107, 14, 133, 151, 29, 139, 26, 236, 26, 22, - 86, 126, 68, 199, 29, 88, 66, 0, 219, 96, 4, 164, 200, 159, 218, 180, - 180, 5, 240, 4, 212, 250, 135, 219, 169, 137, 17, 48, 132, 180, 175, 143, - 157, 144, 119, 38, 43, 87, 38, 72, 193, 35, 218, 43, 109, 232, 182, 110, - 252, 248, 16, 170, 98, 178, 157, 177, 133, 222, 4, 176, 74, 238, 52, 237, - 135, 107, 170, 240, 154, 4, 239, 177, 233, 208, 54, 181, 120, 133, 187, 58, - 154, 163, 217, 165, 29, 118, 199, 98, 250, 195, 53, 151, 231, 1, 34, 152, - 1, 196, 58, 198, 28, 112, 74, 173, 145, 110, 218, 63, 92, 177, 198, 43, - 110, 209, 197, 248, 165, 100, 69, 176, 24, 143, 239, 238, 182, 202, 107, 231, - 130, 218, 25, 125, 112, 68, 197, 231, 176, 99, 29, 16, 195, 74, 239, 156, - 104, 133, 215, 187, 99, 6, 22, 195, 186, 54, 125, 96, 247, 155, 25, 72, - 67, 99, 122, 105, 207, 215, 173, 31, 239, 175, 216, 119, 235, 110, 96, 59, - 156, 197, 104, 235, 157, 190, 168, 23, 246, 9, 158, 34, 187, 238, 180, 180, - 7, 143, 63, 12, 104, 21, 177, 11, 25, 185, 97, 38, 13, 206, 88, 128, - 27, 48, 50, 228, 10, 126, 250, 165, 115, 144, 58, 189, 210, 59, 246, 120, - 69, 236, 68, 46, 207, 30, 81, 157, 159, 165, 144, 149, 214, 20, 249, 199, - 82, 51, 240, 208, 218, 240, 29, 221, 22, 91, 79, 28, 189, 125, 99, 119, - 77, 187, 208, 247, 239, 188, 254, 119, 205, 116, 69, 108, 58, 126, 193, 244, - 172, 24, 221, 49, 21, 120, 3, 240, 186, 59, 120, 215, 52, 136, 61, 184, - 31, 160, 97, 33, 57, 1, 126, 234, 177, 75, 45, 81, 243, 59, 225, 184, - 34, 182, 223, 21, 222, 141, 113, 201, 33, 158, 13, 254, 185, 10, 181, 23, - 246, 243, 25, 8, 133, 239, 131, 223, 138, 216, 111, 236, 166, 231, 129, 25, - 226, 7, 106, 245, 204, 96, 248, 195, 149, 137, 77, 246, 21, 224, 158, 158, - 253, 25, 188, 88, 9, 183, 21, 154, 144, 110, 20, 223, 77, 198, 202, 98, - 3, 133, 74, 172, 243, 226, 159, 233, 85, 185, 254, 194, 26, 28, 160, 45, - 212, 15, 111, 149, 114, 184, 85, 6, 131, 41, 249, 182, 3, 34, 11, 116, - 212, 23, 251, 228, 221, 27, 176, 92, 153, 13, 27, 71, 205, 148, 6, 127, - 10, 252, 202, 33, 57, 49, 209, 139, 71, 225, 230, 129, 138, 250, 246, 44, - 230, 19, 96, 29, 132, 201, 119, 162, 230, 178, 128, 236, 109, 125, 104, 2, - 143, 180, 171, 15, 117, 238, 22, 133, 161, 125, 23, 109, 118, 222, 219, 105, - 1, 143, 32, 107, 57, 166, 79, 118, 244, 224, 145, 162, 181, 176, 109, 68, - 170, 16, 114, 224, 60, 134, 67, 217, 117, 6, 129, 167, 155, 165, 125, 29, - 248, 212, 31, 110, 75, 64, 44, 106, 93, 207, 208, 248, 195, 5, 249, 61, - 104, 219, 225, 64, 90, 212, 50, 65, 6, 4, 226, 104, 248, 239, 29, 143, - 22, 66, 51, 187, 255, 127, 136, 234, 53, 219, 225, 213, 227, 17, 134, 243, - 240, 78, 36, 160, 213, 150, 33, 171, 67, 144, 45, 45, 88, 142, 119, 247, - 88, 32, 237, 164, 79, 17, 54, 217, 212, 2, 73, 1, 36, 161, 109, 211, - 126, 15, 123, 167, 105, 105, 107, 203, 235, 222, 128, 61, 3, 82, 138, 13, - 68, 253, 29, 56, 67, 147, 195, 62, 199, 207, 79, 67, 178, 139, 54, 4, - 100, 195, 244, 89, 164, 245, 63, 213, 142, 42, 86, 147, 9, 223, 54, 69, - 235, 38, 52, 124, 138, 56, 225, 0, 49, 1, 200, 173, 173, 177, 233, 63, - 162, 17, 219, 143, 79, 146, 90, 11, 1, 38, 180, 246, 64, 166, 196, 245, - 177, 174, 119, 117, 89, 44, 103, 120, 194, 113, 6, 76, 153, 21, 1, 11, - 58, 17, 126, 39, 14, 80, 5, 122, 57, 252, 29, 254, 19, 160, 23, 216, - 230, 251, 1, 79, 13, 145, 74, 145, 52, 173, 182, 233, 136, 46, 238, 235, - 29, 253, 125, 108, 175, 42, 8, 101, 232, 55, 99, 239, 58, 162, 36, 30, - 94, 252, 124, 223, 206, 83, 67, 182, 52, 152, 146, 19, 199, 124, 212, 253, - 112, 42, 219, 20, 249, 232, 233, 123, 231, 83, 192, 240, 30, 32, 28, 211, - 103, 119, 36, 93, 178, 110, 162, 143, 102, 116, 163, 224, 155, 3, 20, 217, - 89, 10, 187, 213, 27, 193, 92, 159, 233, 250, 122, 239, 157, 118, 37, 228, - 165, 168, 110, 23, 4, 245, 185, 162, 237, 182, 104, 96, 39, 208, 13, 10, - 108, 252, 232, 189, 108, 188, 82, 14, 133, 58, 115, 40, 234, 92, 103, 135, - 172, 142, 29, 174, 235, 159, 87, 115, 28, 234, 83, 113, 183, 23, 175, 109, - 183, 41, 183, 226, 159, 58, 193, 79, 220, 75, 117, 104, 148, 253, 233, 109, - 94, 86, 111, 251, 84, 119, 253, 186, 60, 169, 105, 4, 64, 197, 162, 218, - 4, 125, 168, 162, 11, 81, 254, 147, 116, 161, 154, 201, 127, 44, 146, 154, - 76, 242, 232, 169, 86, 81, 248, 3, 247, 89, 203, 61, 68, 51, 223, 196, - 204, 41, 113, 228, 178, 147, 148, 67, 127, 157, 204, 91, 103, 138, 67, 208, - 167, 241, 179, 244, 212, 127, 126, 197, 33, 168, 34, 169, 111, 114, 9, 90, - 121, 163, 71, 80, 165, 172, 73, 117, 153, 143, 144, 187, 50, 118, 41, 197, - 203, 1, 168, 46, 193, 107, 32, 104, 144, 47, 252, 206, 226, 171, 152, 217, - 159, 178, 146, 42, 21, 84, 73, 173, 225, 167, 153, 20, 239, 189, 220, 97, - 42, 188, 68, 78, 123, 191, 141, 255, 86, 208, 10, 240, 163, 74, 125, 124, - 130, 31, 245, 59, 250, 88, 21, 110, 45, 51, 51, 175, 150, 241, 5, 249, - 148, 41, 203, 82, 77, 19, 93, 68, 243, 160, 17, 44, 160, 10, 109, 171, - 232, 220, 86, 229, 95, 43, 100, 228, 88, 211, 158, 3, 211, 43, 213, 36, - 173, 38, 149, 85, 169, 166, 226, 47, 239, 34, 201, 15, 77, 180, 156, 34, - 19, 88, 153, 137, 128, 171, 29, 118, 37, 22, 200, 196, 25, 222, 125, 5, - 48, 3, 208, 225, 215, 100, 165, 217, 99, 232, 117, 34, 166, 228, 246, 58, - 142, 207, 221, 184, 3, 76, 118, 250, 142, 217, 1, 168, 20, 149, 173, 180, - 167, 100, 147, 221, 214, 93, 205, 74, 241, 68, 142, 225, 99, 137, 220, 115, - 199, 21, 187, 143, 59, 87, 130, 247, 39, 158, 246, 195, 155, 4, 29, 15, - 152, 159, 121, 83, 184, 205, 194, 91, 132, 184, 109, 248, 101, 199, 238, 226, - 245, 176, 33, 27, 26, 30, 74, 179, 11, 135, 132, 221, 6, 102, 220, 88, - 7, 248, 104, 226, 3, 127, 228, 178, 155, 14, 3, 219, 25, 123, 164, 239, - 140, 81, 169, 102, 56, 240, 97, 207, 236, 196, 246, 245, 146, 198, 117, 94, - 133, 68, 204, 34, 0, 75, 87, 247, 124, 137, 192, 151, 22, 231, 248, 168, - 69, 123, 192, 36, 73, 228, 14, 239, 201, 233, 222, 98, 255, 152, 207, 55, - 168, 231, 83, 12, 135, 52, 153, 163, 130, 41, 239, 130, 169, 163, 135, 132, - 212, 230, 121, 151, 133, 111, 9, 40, 209, 51, 135, 88, 192, 227, 241, 2, - 176, 253, 190, 24, 181, 97, 186, 120, 11, 10, 147, 56, 184, 3, 207, 139, - 158, 7, 96, 95, 224, 225, 172, 211, 141, 218, 102, 222, 21, 16, 14, 14, - 177, 241, 193, 47, 120, 157, 232, 17, 13, 199, 241, 242, 32, 115, 154, 129, - 135, 62, 102, 39, 202, 238, 186, 78, 111, 233, 13, 58, 222, 109, 182, 246, - 137, 73, 227, 110, 68, 197, 226, 8, 15, 90, 212, 32, 232, 231, 219, 236, - 10, 135, 254, 93, 39, 114, 231, 223, 100, 186, 102, 179, 67, 74, 8, 215, - 166, 101, 6, 220, 33, 142, 184, 155, 51, 127, 97, 233, 15, 251, 229, 254, - 204, 77, 35, 206, 74, 90, 71, 251, 250, 3, 98, 98, 188, 176, 5, 221, - 21, 151, 65, 13, 86, 220, 112, 245, 177, 141, 46, 59, 82, 221, 67, 172, - 100, 17, 198, 145, 230, 120, 2, 218, 197, 173, 161, 20, 163, 216, 37, 176, - 14, 141, 44, 241, 60, 17, 83, 82, 145, 149, 217, 182, 140, 85, 207, 44, - 9, 93, 44, 192, 155, 96, 244, 131, 239, 124, 64, 61, 5, 119, 200, 111, - 22, 43, 107, 107, 242, 51, 17, 24, 129, 223, 198, 39, 246, 144, 100, 113, - 43, 173, 240, 41, 90, 69, 63, 186, 97, 97, 37, 42, 204, 251, 255, 98, - 97, 53, 42, 204, 111, 231, 207, 23, 38, 63, 11, 52, 177, 202, 93, 245, - 18, 118, 87, 127, 86, 138, 173, 196, 106, 86, 120, 229, 77, 162, 45, 24, - 196, 24, 40, 223, 51, 233, 175, 1, 117, 33, 137, 241, 36, 47, 101, 39, - 125, 57, 199, 253, 14, 20, 249, 229, 120, 152, 216, 180, 43, 245, 165, 229, - 95, 196, 231, 227, 245, 198, 194, 149, 126, 123, 99, 137, 47, 226, 243, 249, - 82, 99, 113, 15, 8, 111, 107, 44, 229, 11, 238, 49, 57, 165, 145, 152, - 27, 133, 87, 42, 95, 44, 41, 28, 90, 71, 23, 207, 103, 79, 108, 213, - 115, 8, 217, 78, 44, 21, 185, 23, 21, 0, 33, 215, 23, 192, 127, 38, - 188, 36, 31, 193, 182, 248, 97, 39, 200, 5, 220, 215, 170, 44, 55, 74, - 178, 82, 82, 52, 182, 171, 63, 145, 208, 181, 53, 108, 120, 165, 168, 21, - 101, 238, 69, 209, 180, 77, 223, 156, 185, 108, 14, 175, 67, 174, 22, 19, - 142, 79, 88, 125, 138, 92, 194, 42, 83, 235, 43, 243, 250, 210, 190, 82, - 74, 114, 13, 254, 159, 246, 85, 101, 249, 87, 229, 146, 92, 47, 169, 114, - 218, 87, 213, 229, 95, 85, 161, 123, 37, 181, 146, 246, 85, 109, 249, 87, - 208, 189, 74, 73, 109, 44, 126, 165, 22, 229, 151, 190, 98, 19, 146, 246, - 149, 178, 252, 171, 122, 73, 86, 75, 74, 74, 15, 213, 162, 250, 226, 87, - 213, 146, 170, 164, 125, 165, 165, 126, 181, 236, 244, 240, 51, 175, 143, 67, - 70, 106, 125, 229, 98, 133, 67, 198, 70, 224, 186, 40, 120, 122, 204, 162, - 127, 181, 184, 232, 16, 231, 7, 47, 198, 62, 101, 47, 17, 141, 225, 109, - 5, 244, 187, 201, 124, 103, 7, 35, 52, 200, 178, 123, 64, 19, 239, 128, - 240, 133, 61, 89, 81, 17, 54, 86, 99, 183, 78, 13, 211, 235, 4, 158, - 87, 28, 153, 19, 203, 43, 6, 94, 201, 47, 57, 118, 1, 8, 101, 193, - 117, 116, 163, 224, 59, 5, 181, 80, 41, 200, 75, 168, 7, 107, 216, 226, - 142, 112, 134, 104, 153, 16, 235, 197, 10, 142, 249, 181, 182, 196, 182, 40, - 56, 221, 2, 238, 124, 104, 172, 252, 182, 198, 216, 176, 18, 141, 201, 239, - 104, 76, 142, 53, 118, 226, 154, 15, 122, 103, 138, 168, 1, 111, 65, 191, - 13, 55, 156, 135, 238, 32, 96, 139, 15, 245, 233, 204, 111, 84, 48, 194, - 185, 67, 215, 64, 33, 91, 193, 46, 246, 155, 220, 35, 65, 228, 121, 106, - 241, 222, 23, 199, 127, 217, 207, 226, 129, 9, 136, 30, 158, 247, 187, 201, - 139, 248, 123, 126, 200, 172, 118, 16, 161, 49, 71, 12, 236, 72, 54, 114, - 208, 64, 116, 230, 1, 13, 253, 92, 81, 175, 31, 58, 81, 19, 126, 208, - 144, 237, 24, 81, 215, 4, 254, 135, 241, 71, 81, 189, 76, 80, 100, 223, - 220, 7, 212, 134, 249, 24, 3, 123, 214, 15, 157, 5, 120, 212, 15, 221, - 38, 48, 155, 104, 20, 131, 80, 186, 2, 166, 45, 102, 133, 70, 209, 55, - 154, 11, 194, 86, 120, 68, 173, 143, 241, 138, 57, 243, 168, 144, 244, 56, - 101, 218, 176, 153, 134, 252, 186, 59, 206, 31, 243, 62, 193, 125, 116, 205, - 220, 45, 68, 179, 197, 231, 1, 125, 183, 120, 204, 225, 210, 222, 73, 228, - 89, 75, 48, 235, 29, 244, 34, 238, 255, 74, 216, 196, 179, 251, 243, 230, - 140, 147, 103, 67, 242, 252, 95, 19, 30, 42, 128, 139, 30, 83, 228, 225, - 25, 59, 223, 199, 51, 41, 15, 149, 146, 61, 137, 221, 86, 134, 250, 240, - 178, 50, 236, 246, 94, 159, 85, 178, 123, 126, 126, 130, 55, 151, 125, 167, - 227, 88, 216, 137, 236, 5, 142, 181, 217, 131, 118, 179, 108, 135, 131, 104, - 102, 80, 119, 214, 123, 147, 90, 192, 239, 242, 105, 4, 222, 180, 227, 154, - 109, 202, 87, 174, 139, 87, 9, 4, 244, 132, 91, 20, 250, 1, 189, 24, - 71, 222, 41, 198, 204, 83, 7, 140, 195, 183, 104, 84, 231, 10, 45, 246, - 64, 20, 13, 29, 240, 21, 78, 185, 118, 100, 103, 239, 240, 132, 168, 197, - 58, 96, 42, 230, 221, 150, 84, 203, 164, 109, 250, 30, 188, 35, 26, 84, - 144, 229, 249, 155, 82, 151, 53, 89, 97, 138, 133, 213, 36, 72, 33, 81, - 12, 23, 9, 96, 107, 126, 109, 60, 199, 162, 22, 91, 34, 230, 20, 16, - 27, 4, 236, 135, 73, 192, 128, 163, 127, 188, 96, 118, 249, 220, 195, 235, - 248, 220, 148, 29, 11, 141, 28, 143, 122, 111, 187, 249, 255, 170, 99, 174, - 165, 126, 176, 95, 242, 203, 85, 71, 2, 198, 71, 29, 247, 203, 197, 123, - 113, 11, 255, 1, 254, 110, 186, 174, 62, 13, 29, 49, 159, 155, 204, 72, - 187, 29, 2, 10, 203, 36, 223, 182, 209, 185, 222, 119, 46, 8, 235, 152, - 116, 219, 133, 20, 41, 249, 154, 230, 134, 241, 186, 192, 106, 132, 113, 153, - 54, 122, 156, 80, 208, 227, 68, 148, 123, 243, 98, 238, 117, 225, 184, 219, - 197, 157, 183, 242, 97, 53, 114, 90, 193, 164, 122, 57, 81, 199, 91, 74, - 225, 0, 240, 86, 147, 155, 44, 199, 53, 28, 11, 5, 183, 96, 7, 197, - 139, 53, 22, 138, 29, 114, 165, 65, 40, 229, 175, 100, 143, 0, 89, 2, - 26, 190, 46, 52, 39, 166, 7, 15, 55, 225, 195, 53, 62, 81, 47, 38, - 162, 180, 204, 71, 92, 232, 219, 240, 211, 86, 31, 246, 221, 32, 43, 145, - 236, 22, 11, 244, 132, 79, 103, 220, 107, 210, 183, 67, 58, 116, 220, 41, - 198, 176, 240, 2, 36, 108, 63, 125, 207, 190, 224, 106, 240, 159, 228, 221, - 77, 6, 110, 166, 164, 168, 243, 80, 148, 88, 124, 174, 82, 123, 202, 213, - 126, 6, 9, 39, 82, 169, 116, 77, 194, 83, 63, 207, 82, 167, 200, 158, - 198, 62, 204, 41, 82, 78, 149, 114, 21, 41, 87, 149, 114, 245, 12, 139, - 69, 69, 10, 57, 237, 131, 84, 200, 149, 121, 0, 39, 53, 147, 10, 104, - 60, 190, 200, 98, 85, 154, 148, 43, 135, 21, 214, 36, 57, 9, 202, 124, - 229, 230, 160, 153, 119, 77, 154, 79, 72, 131, 232, 61, 159, 134, 206, 119, - 56, 216, 42, 255, 68, 176, 229, 125, 62, 68, 237, 70, 4, 106, 234, 75, - 80, 38, 101, 213, 69, 128, 219, 227, 76, 57, 234, 168, 17, 169, 205, 128, - 246, 216, 53, 1, 7, 51, 63, 31, 2, 160, 175, 103, 143, 55, 76, 223, - 228, 35, 69, 105, 200, 128, 193, 123, 197, 89, 2, 198, 0, 75, 166, 168, - 53, 145, 50, 107, 150, 67, 115, 4, 238, 204, 81, 102, 87, 7, 129, 101, - 86, 100, 195, 117, 70, 98, 6, 112, 42, 23, 198, 255, 159, 2, 225, 2, - 116, 69, 120, 164, 220, 83, 109, 77, 196, 9, 202, 85, 152, 72, 31, 2, - 124, 40, 107, 86, 152, 236, 30, 2, 124, 44, 85, 3, 73, 59, 156, 211, - 88, 114, 57, 74, 134, 153, 141, 165, 87, 162, 116, 152, 223, 80, 12, 172, - 241, 150, 203, 76, 243, 0, 212, 56, 24, 2, 44, 202, 18, 186, 28, 43, - 228, 106, 207, 31, 194, 239, 203, 172, 107, 46, 106, 183, 210, 115, 161, 139, - 143, 44, 84, 85, 148, 153, 90, 76, 195, 98, 176, 135, 75, 42, 22, 8, - 255, 242, 130, 243, 207, 34, 6, 80, 184, 137, 85, 220, 196, 90, 184, 137, - 19, 115, 137, 123, 21, 118, 105, 117, 126, 146, 211, 54, 119, 236, 147, 216, - 246, 150, 97, 119, 39, 247, 54, 94, 184, 115, 134, 184, 179, 249, 119, 46, - 123, 151, 18, 111, 241, 189, 220, 2, 34, 10, 60, 111, 146, 72, 85, 48, - 252, 151, 188, 80, 232, 230, 197, 66, 155, 204, 199, 49, 223, 95, 201, 234, - 106, 47, 148, 188, 121, 177, 228, 191, 25, 248, 83, 102, 22, 195, 203, 56, - 174, 151, 64, 157, 204, 67, 169, 52, 247, 190, 156, 5, 152, 159, 184, 151, - 167, 245, 120, 164, 119, 240, 192, 54, 66, 144, 60, 112, 225, 127, 204, 28, - 37, 71, 61, 243, 118, 152, 251, 137, 88, 197, 12, 135, 215, 89, 144, 71, - 126, 92, 227, 59, 188, 244, 16, 176, 122, 145, 96, 80, 57, 239, 153, 71, - 70, 196, 240, 137, 57, 126, 82, 242, 164, 192, 190, 121, 142, 2, 37, 102, - 152, 131, 65, 22, 170, 144, 196, 220, 8, 134, 139, 195, 157, 198, 197, 151, - 37, 182, 32, 255, 193, 92, 217, 95, 92, 212, 12, 132, 0, 120, 210, 89, - 31, 78, 11, 82, 217, 170, 74, 42, 91, 21, 226, 201, 24, 106, 93, 196, - 169, 11, 200, 52, 4, 41, 230, 120, 16, 227, 232, 112, 96, 194, 87, 188, - 86, 26, 127, 137, 64, 74, 94, 205, 207, 72, 121, 31, 47, 233, 251, 179, - 197, 172, 72, 217, 13, 230, 82, 13, 150, 111, 29, 48, 30, 44, 192, 38, - 176, 27, 62, 46, 103, 244, 112, 128, 225, 114, 152, 36, 127, 64, 241, 230, - 23, 166, 93, 224, 85, 147, 185, 52, 214, 45, 248, 187, 129, 118, 199, 173, - 128, 127, 124, 168, 163, 27, 157, 233, 176, 237, 88, 113, 200, 224, 173, 66, - 99, 204, 135, 57, 182, 187, 70, 124, 58, 241, 159, 178, 164, 232, 28, 199, - 213, 44, 77, 224, 125, 166, 30, 200, 124, 45, 60, 220, 13, 249, 185, 170, - 84, 7, 48, 213, 86, 83, 138, 13, 29, 199, 239, 163, 139, 141, 8, 166, - 149, 202, 60, 80, 183, 166, 54, 90, 147, 191, 90, 235, 25, 245, 2, 203, - 39, 231, 211, 81, 146, 185, 187, 234, 155, 62, 186, 84, 196, 107, 62, 157, - 1, 78, 30, 254, 101, 222, 43, 49, 7, 39, 1, 209, 7, 136, 162, 177, - 50, 177, 164, 115, 140, 107, 0, 192, 140, 130, 249, 91, 220, 146, 239, 232, - 195, 152, 83, 64, 140, 164, 41, 197, 122, 153, 50, 100, 12, 130, 44, 75, - 149, 216, 132, 51, 170, 16, 219, 198, 219, 40, 224, 243, 84, 228, 72, 103, - 143, 218, 236, 177, 60, 123, 172, 207, 30, 149, 88, 97, 165, 26, 61, 71, - 77, 205, 255, 151, 221, 65, 225, 21, 231, 153, 53, 196, 222, 88, 59, 225, - 83, 57, 122, 170, 71, 79, 202, 172, 32, 180, 193, 31, 223, 50, 83, 199, - 129, 63, 10, 124, 177, 69, 182, 77, 107, 198, 214, 202, 11, 133, 182, 185, - 75, 82, 40, 192, 157, 147, 46, 86, 179, 29, 106, 235, 161, 12, 130, 231, - 74, 150, 187, 63, 23, 155, 172, 232, 79, 94, 92, 63, 41, 113, 84, 182, - 129, 55, 94, 8, 6, 94, 229, 126, 225, 129, 23, 247, 117, 104, 192, 16, - 170, 151, 17, 227, 55, 152, 66, 104, 230, 29, 63, 121, 224, 213, 19, 22, - 140, 236, 184, 11, 183, 183, 239, 140, 204, 78, 113, 212, 31, 253, 222, 93, - 83, 235, 63, 251, 107, 0, 230, 229, 218, 191, 1, 115, 150, 75, 106, 141, - 29, 20, 44, 98, 78, 49, 89, 51, 206, 92, 145, 215, 158, 49, 32, 169, - 162, 172, 241, 200, 164, 138, 186, 246, 156, 141, 211, 229, 111, 185, 207, 223, - 133, 21, 66, 70, 31, 141, 172, 233, 109, 143, 237, 0, 248, 244, 239, 192, - 249, 146, 54, 201, 213, 63, 132, 158, 45, 227, 135, 124, 120, 79, 123, 77, - 132, 197, 140, 29, 231, 241, 100, 34, 43, 115, 39, 119, 81, 186, 170, 149, - 43, 213, 90, 189, 17, 207, 215, 162, 124, 189, 221, 49, 104, 183, 215, 55, - 239, 6, 214, 208, 118, 70, 247, 174, 231, 7, 15, 227, 201, 244, 49, 94, - 190, 28, 149, 111, 174, 111, 108, 110, 109, 239, 236, 238, 237, 127, 57, 56, - 60, 58, 62, 57, 61, 107, 157, 95, 92, 94, 93, 223, 124, 141, 151, 175, - 68, 229, 127, 250, 67, 46, 171, 127, 203, 125, 248, 25, 254, 214, 86, 86, - 63, 230, 165, 66, 177, 52, 235, 212, 167, 95, 127, 91, 251, 252, 251, 255, - 44, 175, 245, 15, 69, 211, 254, 248, 3, 126, 43, 127, 191, 253, 67, 41, - 203, 203, 251, 251, 135, 82, 211, 254, 1, 63, 229, 255, 43, 222, 147, 106, - 212, 147, 63, 148, 42, 228, 254, 161, 202, 127, 168, 137, 185, 170, 205, 74, - 168, 50, 100, 202, 10, 252, 83, 225, 159, 6, 255, 202, 240, 175, 2, 255, - 170, 240, 15, 190, 85, 240, 99, 200, 87, 32, 95, 129, 124, 5, 242, 21, - 200, 135, 170, 85, 172, 27, 43, 87, 33, 95, 133, 124, 21, 242, 85, 200, - 87, 33, 95, 133, 124, 21, 242, 53, 200, 215, 120, 168, 82, 214, 124, 149, - 45, 161, 77, 123, 92, 99, 205, 228, 171, 130, 70, 242, 230, 176, 167, 114, - 31, 188, 57, 236, 27, 167, 147, 31, 144, 80, 102, 115, 5, 53, 91, 130, - 95, 69, 156, 185, 46, 47, 139, 173, 140, 251, 107, 185, 167, 231, 168, 49, - 0, 163, 65, 49, 2, 46, 49, 7, 188, 19, 152, 206, 251, 177, 152, 173, - 254, 227, 31, 248, 71, 123, 206, 184, 24, 253, 53, 55, 238, 115, 133, 212, - 7, 73, 225, 85, 55, 62, 227, 52, 90, 200, 221, 160, 113, 150, 136, 61, - 205, 179, 62, 64, 206, 125, 128, 151, 71, 31, 89, 198, 19, 243, 196, 13, - 201, 146, 42, 105, 82, 25, 233, 18, 48, 121, 213, 213, 130, 242, 204, 76, - 105, 240, 244, 16, 203, 125, 83, 190, 75, 248, 143, 183, 68, 62, 138, 180, - 104, 44, 42, 158, 26, 127, 19, 177, 102, 33, 91, 153, 25, 56, 113, 41, - 144, 49, 173, 140, 93, 77, 97, 30, 146, 204, 50, 110, 202, 248, 121, 116, - 98, 115, 3, 171, 130, 219, 78, 202, 61, 105, 133, 6, 154, 5, 117, 29, - 7, 255, 101, 64, 36, 28, 75, 185, 104, 46, 226, 166, 88, 179, 182, 57, - 182, 218, 0, 146, 140, 86, 222, 192, 62, 48, 198, 166, 19, 189, 75, 201, - 215, 24, 115, 51, 83, 10, 178, 3, 6, 193, 113, 34, 53, 175, 98, 232, - 237, 138, 162, 198, 232, 36, 237, 56, 51, 101, 71, 122, 25, 94, 141, 96, - 140, 103, 26, 143, 180, 122, 94, 46, 212, 100, 1, 55, 18, 108, 117, 253, - 71, 164, 38, 222, 17, 70, 92, 145, 106, 51, 137, 45, 10, 87, 189, 208, - 151, 100, 185, 88, 100, 236, 100, 233, 20, 106, 112, 34, 150, 58, 201, 227, - 48, 246, 0, 112, 243, 182, 227, 50, 199, 144, 187, 142, 107, 62, 50, 39, - 162, 177, 196, 75, 234, 50, 53, 58, 242, 63, 192, 226, 44, 22, 140, 82, - 99, 37, 55, 131, 17, 208, 65, 220, 66, 231, 206, 40, 241, 126, 64, 187, - 126, 34, 129, 187, 78, 77, 36, 157, 161, 7, 253, 68, 74, 162, 193, 89, - 114, 172, 69, 0, 43, 140, 214, 69, 141, 248, 51, 217, 179, 241, 88, 131, - 102, 99, 83, 224, 193, 199, 184, 158, 35, 135, 201, 185, 176, 160, 98, 194, - 229, 217, 63, 100, 36, 165, 255, 28, 5, 64, 98, 91, 192, 118, 13, 67, - 157, 199, 18, 129, 188, 22, 148, 242, 115, 38, 117, 7, 193, 39, 48, 142, - 91, 54, 242, 40, 45, 155, 172, 53, 247, 17, 183, 117, 65, 43, 0, 242, - 17, 227, 6, 190, 157, 217, 40, 64, 65, 3, 31, 165, 232, 41, 190, 37, - 129, 123, 118, 172, 64, 232, 51, 67, 127, 214, 73, 73, 53, 182, 23, 85, - 196, 114, 213, 242, 28, 203, 202, 20, 171, 214, 12, 48, 149, 144, 215, 102, - 93, 200, 134, 172, 120, 248, 198, 59, 198, 14, 10, 67, 118, 251, 40, 64, - 7, 53, 75, 50, 91, 166, 65, 95, 100, 44, 255, 73, 203, 169, 49, 118, - 169, 154, 178, 156, 6, 159, 218, 16, 241, 86, 201, 147, 250, 49, 167, 62, - 75, 252, 15, 97, 249, 185, 207, 28, 109, 50, 44, 175, 125, 80, 67, 234, - 248, 173, 80, 133, 69, 98, 100, 133, 5, 20, 184, 101, 150, 0, 97, 170, - 194, 97, 23, 65, 88, 173, 71, 255, 100, 102, 134, 18, 150, 201, 169, 68, - 15, 159, 39, 81, 92, 136, 220, 79, 176, 244, 140, 0, 48, 69, 71, 62, - 65, 195, 220, 135, 111, 138, 164, 194, 223, 111, 80, 241, 119, 17, 85, 65, - 41, 229, 66, 173, 99, 244, 34, 40, 128, 58, 35, 116, 80, 188, 10, 29, - 64, 101, 10, 52, 140, 71, 230, 54, 208, 41, 102, 52, 171, 16, 23, 85, - 44, 57, 245, 35, 124, 196, 116, 154, 226, 41, 131, 18, 49, 130, 145, 42, - 253, 98, 118, 87, 58, 210, 84, 154, 172, 254, 194, 149, 51, 104, 49, 91, - 100, 89, 176, 89, 81, 49, 163, 97, 127, 73, 30, 112, 208, 136, 217, 177, - 194, 224, 209, 248, 182, 88, 20, 83, 247, 27, 167, 143, 48, 10, 166, 183, - 17, 6, 90, 140, 136, 170, 64, 88, 213, 136, 176, 194, 32, 101, 86, 23, - 179, 191, 21, 207, 67, 144, 13, 77, 96, 78, 19, 116, 148, 25, 247, 178, - 85, 146, 1, 158, 132, 201, 43, 139, 18, 47, 177, 127, 69, 85, 252, 224, - 121, 21, 114, 16, 172, 172, 18, 47, 171, 86, 96, 150, 42, 41, 101, 103, - 69, 106, 144, 93, 75, 43, 194, 171, 83, 209, 70, 128, 215, 203, 187, 194, - 147, 181, 89, 114, 162, 177, 212, 154, 146, 141, 165, 246, 135, 215, 90, 14, - 107, 213, 18, 141, 85, 102, 201, 137, 198, 82, 103, 33, 217, 88, 250, 68, - 9, 212, 195, 12, 18, 15, 185, 163, 5, 129, 130, 48, 233, 86, 248, 94, - 144, 22, 82, 210, 180, 107, 7, 250, 148, 198, 149, 90, 138, 135, 84, 69, - 69, 149, 84, 86, 115, 241, 183, 236, 247, 225, 183, 194, 126, 171, 236, 183, - 198, 126, 235, 236, 183, 193, 126, 21, 153, 255, 81, 248, 31, 149, 255, 209, - 248, 31, 94, 129, 194, 107, 80, 176, 138, 24, 115, 224, 121, 78, 199, 100, - 70, 150, 41, 20, 126, 86, 238, 171, 227, 12, 35, 220, 89, 80, 56, 249, - 137, 235, 249, 54, 40, 94, 68, 71, 115, 133, 184, 18, 175, 146, 162, 235, - 123, 107, 201, 144, 111, 9, 103, 38, 58, 68, 154, 29, 48, 197, 78, 150, - 82, 142, 148, 78, 128, 117, 69, 69, 195, 131, 110, 5, 20, 58, 29, 63, - 41, 235, 121, 114, 148, 35, 127, 226, 255, 171, 176, 255, 203, 201, 98, 202, - 219, 138, 169, 111, 43, 166, 189, 173, 88, 249, 109, 197, 42, 111, 43, 86, - 125, 91, 177, 218, 219, 138, 213, 223, 86, 172, 241, 198, 233, 125, 235, 50, - 188, 113, 29, 148, 55, 46, 132, 242, 198, 149, 80, 222, 184, 20, 202, 27, - 214, 226, 101, 146, 254, 20, 146, 244, 223, 218, 159, 209, 200, 228, 83, 204, - 176, 226, 19, 137, 7, 165, 140, 162, 150, 232, 196, 119, 70, 196, 98, 24, - 100, 33, 238, 139, 103, 34, 91, 33, 48, 15, 22, 114, 48, 148, 171, 8, - 156, 162, 163, 121, 21, 165, 5, 52, 94, 193, 251, 30, 35, 30, 131, 194, - 48, 187, 44, 14, 132, 207, 145, 128, 87, 228, 78, 52, 116, 155, 135, 206, - 67, 183, 220, 61, 155, 69, 189, 137, 58, 198, 91, 247, 29, 12, 151, 200, - 219, 224, 167, 27, 179, 80, 62, 216, 29, 209, 141, 248, 157, 29, 193, 106, - 252, 235, 195, 207, 213, 209, 254, 16, 45, 46, 147, 28, 207, 237, 60, 182, - 6, 214, 199, 110, 223, 178, 241, 121, 107, 79, 192, 103, 160, 90, 22, 25, - 144, 85, 46, 161, 255, 148, 139, 178, 159, 51, 204, 161, 238, 90, 182, 25, - 174, 8, 78, 4, 159, 26, 88, 183, 161, 41, 98, 43, 57, 110, 92, 165, - 134, 115, 52, 196, 72, 147, 192, 235, 99, 196, 37, 180, 152, 194, 97, 76, - 127, 202, 114, 213, 130, 66, 144, 37, 30, 243, 8, 151, 17, 83, 156, 99, - 109, 161, 9, 88, 224, 218, 156, 81, 224, 41, 60, 67, 136, 211, 35, 68, - 126, 18, 254, 200, 236, 87, 97, 191, 42, 251, 213, 216, 111, 153, 253, 86, - 216, 111, 149, 253, 214, 216, 111, 157, 253, 54, 248, 87, 226, 99, 254, 181, - 194, 63, 87, 248, 247, 10, 175, 64, 169, 172, 229, 158, 26, 5, 181, 34, - 244, 22, 202, 79, 107, 57, 214, 248, 115, 102, 229, 233, 23, 22, 154, 203, - 203, 41, 207, 191, 60, 175, 66, 151, 71, 192, 49, 227, 57, 214, 47, 159, - 126, 1, 70, 242, 23, 233, 151, 103, 2, 249, 183, 103, 88, 211, 237, 14, - 251, 93, 103, 191, 143, 64, 111, 216, 195, 164, 195, 200, 5, 123, 158, 198, - 158, 117, 164, 14, 208, 114, 240, 7, 121, 242, 159, 159, 25, 179, 195, 204, - 169, 255, 100, 125, 106, 161, 142, 118, 223, 25, 222, 237, 181, 28, 171, 238, - 19, 251, 179, 195, 255, 172, 243, 63, 88, 35, 127, 18, 85, 242, 151, 105, - 252, 133, 85, 154, 65, 59, 175, 192, 91, 251, 3, 230, 230, 143, 103, 248, - 229, 61, 228, 85, 242, 63, 235, 81, 58, 214, 26, 189, 136, 138, 163, 247, - 233, 220, 59, 171, 158, 189, 69, 21, 123, 114, 244, 52, 75, 83, 163, 39, - 45, 122, 42, 71, 79, 149, 232, 169, 26, 61, 213, 162, 167, 122, 244, 212, - 152, 213, 28, 107, 100, 214, 138, 50, 107, 70, 153, 181, 163, 204, 26, 82, - 160, 165, 76, 103, 141, 132, 154, 156, 104, 251, 144, 25, 160, 124, 94, 14, - 40, 103, 192, 244, 239, 192, 191, 117, 248, 135, 211, 4, 127, 196, 4, 193, - 211, 52, 122, 98, 147, 146, 251, 28, 3, 13, 64, 72, 222, 90, 14, 127, - 115, 157, 220, 19, 84, 243, 12, 82, 228, 14, 255, 3, 149, 65, 129, 53, - 9, 225, 71, 88, 79, 124, 123, 194, 64, 114, 207, 32, 64, 52, 64, 100, - 120, 18, 245, 65, 61, 76, 210, 225, 114, 45, 50, 230, 66, 194, 253, 246, - 119, 212, 177, 69, 99, 97, 55, 204, 202, 210, 55, 211, 238, 74, 248, 175, - 16, 254, 0, 39, 47, 3, 39, 47, 127, 207, 116, 241, 235, 108, 166, 77, - 123, 128, 83, 58, 225, 113, 200, 55, 146, 101, 125, 204, 146, 239, 171, 191, - 102, 16, 85, 172, 160, 180, 41, 75, 196, 250, 45, 59, 171, 63, 43, 145, - 124, 222, 146, 50, 123, 107, 107, 252, 211, 111, 218, 71, 75, 210, 190, 255, - 190, 130, 219, 111, 101, 242, 155, 185, 130, 119, 227, 44, 174, 223, 2, 28, - 154, 124, 135, 26, 39, 80, 61, 22, 157, 38, 138, 42, 115, 69, 21, 44, - 58, 21, 69, 39, 159, 227, 89, 234, 92, 81, 53, 81, 107, 162, 168, 54, - 87, 84, 139, 106, 133, 68, 69, 154, 72, 83, 76, 176, 72, 158, 40, 191, - 102, 86, 241, 255, 100, 47, 155, 241, 1, 159, 183, 109, 221, 180, 214, 100, - 210, 70, 193, 81, 119, 77, 234, 173, 201, 2, 43, 102, 172, 53, 92, 34, - 69, 32, 28, 235, 183, 181, 56, 38, 230, 105, 210, 248, 115, 255, 153, 228, - 65, 162, 156, 124, 203, 89, 176, 150, 43, 114, 46, 196, 160, 183, 99, 211, - 240, 251, 191, 207, 39, 124, 42, 3, 247, 89, 170, 62, 11, 69, 45, 19, - 70, 23, 62, 237, 83, 212, 251, 252, 190, 144, 18, 126, 28, 73, 188, 120, - 201, 82, 220, 247, 100, 98, 133, 129, 176, 82, 4, 160, 41, 146, 236, 223, - 178, 57, 156, 14, 152, 21, 96, 67, 4, 24, 21, 51, 40, 248, 21, 180, - 216, 224, 21, 196, 67, 249, 46, 124, 208, 65, 111, 59, 177, 169, 128, 57, - 83, 126, 37, 151, 200, 28, 3, 201, 88, 153, 64, 77, 83, 248, 87, 145, - 42, 48, 129, 184, 10, 72, 173, 46, 87, 215, 214, 134, 250, 4, 254, 66, - 91, 230, 106, 54, 35, 180, 118, 12, 202, 86, 81, 78, 213, 64, 152, 141, - 102, 46, 207, 20, 186, 10, 200, 147, 36, 212, 22, 195, 255, 166, 191, 67, - 231, 63, 201, 40, 139, 51, 219, 2, 50, 97, 193, 160, 3, 188, 166, 57, - 125, 236, 76, 128, 128, 141, 240, 102, 38, 195, 191, 11, 27, 59, 51, 129, - 142, 72, 83, 252, 153, 64, 87, 224, 73, 159, 172, 61, 129, 48, 188, 135, - 42, 92, 65, 70, 77, 160, 141, 221, 149, 28, 22, 93, 205, 146, 159, 127, - 102, 145, 23, 89, 210, 116, 49, 9, 171, 89, 40, 5, 73, 207, 153, 73, - 135, 161, 1, 216, 249, 79, 76, 177, 251, 113, 229, 27, 171, 83, 98, 213, - 124, 207, 127, 99, 223, 74, 172, 248, 247, 66, 117, 21, 133, 248, 210, 183, - 177, 212, 255, 46, 86, 124, 86, 1, 200, 55, 106, 25, 39, 159, 237, 120, - 177, 46, 49, 64, 84, 194, 19, 1, 243, 240, 179, 252, 156, 50, 108, 0, - 208, 220, 103, 152, 80, 146, 62, 126, 245, 159, 49, 126, 3, 106, 102, 217, - 5, 86, 21, 180, 158, 49, 166, 144, 52, 101, 73, 83, 145, 100, 143, 37, - 187, 191, 134, 27, 132, 105, 100, 24, 160, 140, 75, 57, 99, 34, 245, 225, - 119, 186, 250, 241, 27, 62, 195, 211, 247, 210, 138, 146, 215, 62, 174, 228, - 158, 56, 174, 125, 46, 129, 188, 247, 119, 117, 117, 21, 79, 21, 112, 91, - 228, 160, 170, 156, 157, 80, 167, 63, 173, 48, 219, 174, 167, 8, 45, 63, - 175, 126, 120, 142, 82, 167, 241, 212, 176, 18, 222, 88, 88, 73, 53, 212, - 123, 96, 30, 94, 9, 14, 215, 32, 196, 181, 51, 236, 137, 184, 209, 4, - 28, 242, 107, 198, 82, 24, 10, 41, 32, 10, 1, 92, 32, 255, 190, 247, - 105, 133, 1, 30, 150, 224, 184, 71, 108, 68, 64, 48, 211, 148, 116, 5, - 210, 221, 9, 226, 48, 168, 4, 63, 132, 87, 212, 135, 227, 157, 222, 41, - 123, 101, 187, 236, 111, 48, 103, 19, 201, 157, 138, 155, 198, 12, 207, 35, - 202, 98, 231, 67, 179, 91, 199, 136, 163, 98, 59, 53, 174, 166, 97, 151, - 165, 195, 131, 163, 104, 159, 103, 12, 49, 52, 226, 2, 206, 97, 39, 54, - 79, 5, 100, 252, 34, 236, 212, 127, 206, 220, 97, 122, 81, 210, 224, 127, - 252, 224, 162, 86, 201, 224, 150, 11, 79, 161, 148, 69, 170, 10, 147, 134, - 168, 134, 83, 51, 9, 87, 5, 254, 126, 144, 112, 33, 216, 131, 130, 183, - 161, 89, 69, 76, 91, 4, 53, 13, 176, 145, 142, 56, 79, 10, 72, 142, - 51, 46, 153, 20, 198, 120, 145, 89, 206, 125, 148, 228, 133, 146, 49, 229, - 110, 234, 23, 138, 96, 254, 183, 38, 190, 171, 119, 124, 114, 220, 198, 88, - 103, 66, 159, 75, 121, 226, 173, 195, 19, 165, 148, 180, 52, 133, 10, 170, - 250, 249, 197, 35, 244, 180, 96, 135, 70, 69, 92, 149, 254, 178, 198, 124, - 78, 225, 123, 238, 88, 148, 121, 47, 8, 245, 194, 28, 151, 87, 23, 207, - 78, 206, 251, 120, 123, 196, 177, 140, 152, 121, 234, 162, 66, 227, 16, 196, - 51, 144, 54, 64, 94, 164, 49, 19, 138, 162, 54, 111, 31, 97, 219, 48, - 54, 243, 129, 31, 202, 132, 218, 143, 3, 103, 156, 149, 178, 187, 64, 107, - 98, 26, 142, 200, 198, 32, 102, 219, 36, 75, 89, 52, 148, 133, 194, 45, - 218, 155, 197, 252, 123, 203, 176, 195, 227, 135, 157, 0, 149, 209, 80, 136, - 153, 43, 252, 27, 12, 232, 42, 37, 85, 43, 201, 75, 140, 12, 147, 215, - 126, 69, 112, 92, 58, 25, 89, 60, 128, 59, 154, 53, 204, 108, 21, 94, - 183, 83, 168, 53, 228, 10, 87, 120, 207, 1, 151, 240, 251, 80, 193, 75, - 91, 183, 58, 172, 217, 90, 174, 242, 129, 223, 161, 140, 82, 170, 236, 252, - 51, 126, 50, 249, 91, 196, 24, 102, 236, 225, 154, 216, 201, 108, 67, 222, - 162, 253, 198, 115, 226, 220, 18, 81, 182, 242, 225, 227, 202, 152, 9, 149, - 136, 173, 85, 120, 235, 179, 55, 30, 204, 253, 105, 15, 112, 62, 16, 45, - 33, 115, 230, 106, 236, 198, 109, 94, 48, 200, 194, 146, 48, 167, 9, 178, - 238, 184, 130, 227, 0, 130, 29, 248, 14, 162, 173, 91, 188, 115, 14, 251, - 27, 67, 66, 16, 118, 210, 28, 118, 30, 45, 222, 213, 72, 179, 62, 134, - 90, 31, 217, 129, 175, 34, 153, 43, 64, 9, 229, 85, 64, 221, 226, 89, - 137, 61, 107, 177, 231, 50, 116, 203, 6, 198, 121, 228, 120, 43, 75, 190, - 91, 149, 216, 229, 226, 156, 61, 204, 146, 44, 82, 189, 213, 140, 80, 78, - 51, 45, 125, 120, 108, 93, 99, 151, 123, 95, 29, 86, 38, 159, 50, 46, - 134, 50, 23, 71, 246, 214, 146, 74, 108, 14, 136, 61, 100, 22, 31, 108, - 64, 179, 225, 44, 31, 204, 76, 211, 14, 128, 16, 158, 47, 151, 73, 183, - 3, 147, 205, 71, 129, 243, 51, 251, 234, 91, 59, 66, 79, 104, 86, 152, - 56, 244, 94, 130, 220, 0, 14, 39, 178, 52, 149, 1, 152, 20, 73, 125, - 126, 29, 40, 43, 11, 64, 249, 121, 6, 148, 140, 75, 144, 19, 48, 55, - 149, 151, 3, 221, 235, 144, 150, 54, 207, 175, 65, 218, 100, 218, 113, 28, - 215, 240, 214, 126, 20, 216, 208, 165, 2, 19, 200, 216, 74, 134, 213, 72, - 28, 137, 202, 225, 49, 243, 178, 98, 64, 238, 38, 219, 226, 191, 25, 107, - 206, 57, 140, 144, 8, 3, 213, 100, 187, 96, 252, 156, 37, 98, 33, 208, - 75, 9, 178, 234, 120, 154, 3, 13, 205, 157, 105, 51, 170, 201, 22, 165, - 158, 65, 207, 184, 64, 62, 113, 70, 57, 67, 195, 158, 216, 137, 250, 100, - 91, 230, 255, 99, 210, 192, 75, 5, 69, 57, 232, 33, 175, 15, 151, 11, - 103, 125, 18, 150, 93, 86, 223, 146, 130, 177, 250, 0, 46, 58, 166, 219, - 177, 176, 44, 52, 41, 49, 14, 128, 13, 68, 38, 139, 25, 177, 185, 90, - 176, 144, 216, 113, 1, 173, 127, 219, 208, 93, 192, 222, 166, 110, 11, 107, - 98, 22, 77, 188, 7, 89, 82, 226, 109, 37, 113, 82, 16, 59, 105, 85, - 100, 156, 216, 228, 241, 192, 139, 217, 255, 254, 67, 238, 104, 80, 72, 30, - 162, 103, 102, 31, 155, 152, 154, 93, 58, 209, 123, 142, 173, 91, 243, 83, - 3, 2, 163, 200, 145, 150, 164, 199, 41, 110, 226, 228, 26, 231, 68, 99, - 7, 215, 106, 61, 193, 4, 176, 229, 159, 113, 20, 10, 55, 109, 137, 31, - 165, 248, 102, 161, 105, 153, 58, 83, 67, 254, 59, 233, 186, 162, 166, 220, - 48, 76, 159, 134, 20, 155, 31, 220, 101, 26, 113, 137, 202, 142, 111, 133, - 140, 138, 167, 162, 200, 6, 167, 212, 192, 151, 37, 252, 42, 60, 249, 140, - 142, 127, 19, 86, 71, 241, 197, 59, 199, 128, 185, 113, 51, 249, 89, 229, - 126, 148, 37, 45, 203, 136, 131, 251, 137, 142, 70, 201, 24, 75, 222, 240, - 251, 51, 176, 174, 39, 151, 48, 44, 181, 203, 116, 9, 97, 177, 250, 178, - 98, 73, 11, 25, 96, 248, 18, 166, 39, 113, 131, 19, 215, 193, 176, 241, - 248, 20, 180, 145, 43, 218, 164, 168, 148, 71, 40, 128, 151, 61, 59, 122, - 89, 132, 166, 229, 118, 60, 137, 46, 253, 235, 32, 71, 174, 51, 71, 14, - 47, 64, 206, 108, 5, 22, 65, 135, 155, 212, 220, 58, 130, 97, 183, 102, - 10, 188, 76, 106, 5, 104, 171, 162, 61, 243, 11, 76, 149, 10, 138, 79, - 229, 2, 170, 134, 16, 92, 116, 144, 145, 230, 225, 230, 16, 245, 248, 45, - 170, 15, 49, 162, 6, 249, 182, 105, 118, 187, 44, 216, 183, 128, 31, 84, - 243, 223, 122, 34, 91, 90, 72, 73, 147, 99, 182, 238, 3, 188, 133, 71, - 201, 129, 128, 137, 37, 215, 34, 22, 87, 96, 129, 159, 15, 111, 238, 133, - 59, 63, 246, 245, 57, 51, 251, 13, 11, 70, 48, 165, 73, 225, 237, 10, - 117, 162, 224, 65, 235, 68, 101, 207, 248, 171, 77, 52, 60, 149, 158, 148, - 95, 182, 86, 249, 203, 156, 235, 159, 104, 206, 149, 122, 88, 152, 56, 36, - 236, 83, 107, 132, 215, 211, 241, 96, 240, 1, 251, 12, 136, 159, 133, 175, - 55, 109, 20, 25, 71, 2, 149, 176, 27, 253, 80, 73, 8, 137, 172, 158, - 21, 189, 56, 40, 234, 145, 235, 131, 85, 118, 33, 34, 112, 105, 241, 223, - 120, 106, 7, 34, 97, 57, 69, 36, 156, 223, 73, 75, 136, 134, 66, 242, - 109, 242, 164, 2, 81, 44, 228, 148, 82, 69, 126, 254, 64, 10, 194, 66, - 149, 243, 234, 79, 58, 76, 18, 106, 44, 196, 193, 231, 51, 201, 39, 201, - 131, 152, 140, 71, 122, 11, 171, 136, 17, 240, 34, 69, 201, 178, 205, 12, - 93, 9, 214, 184, 249, 44, 178, 142, 10, 55, 160, 93, 125, 38, 15, 81, - 170, 194, 56, 75, 150, 154, 102, 253, 198, 79, 25, 213, 231, 5, 124, 65, - 114, 31, 197, 181, 30, 32, 108, 252, 134, 78, 54, 23, 160, 5, 251, 67, - 22, 50, 22, 172, 228, 230, 176, 19, 208, 145, 78, 191, 176, 174, 123, 209, - 197, 102, 110, 164, 149, 64, 80, 201, 164, 84, 67, 87, 44, 17, 55, 156, - 211, 212, 121, 5, 9, 107, 41, 94, 164, 1, 163, 141, 155, 214, 173, 51, - 47, 130, 177, 2, 184, 19, 226, 5, 120, 35, 73, 36, 162, 32, 237, 178, - 169, 11, 3, 62, 70, 207, 204, 217, 87, 177, 166, 34, 255, 133, 55, 255, - 194, 155, 255, 103, 226, 77, 198, 117, 167, 224, 205, 228, 6, 95, 130, 56, - 43, 49, 196, 89, 121, 23, 226, 156, 107, 6, 25, 171, 242, 115, 28, 121, - 166, 35, 154, 24, 246, 172, 165, 98, 207, 218, 219, 176, 103, 245, 121, 17, - 153, 197, 208, 103, 237, 77, 232, 211, 180, 77, 207, 7, 64, 21, 204, 92, - 248, 42, 37, 222, 210, 152, 56, 110, 242, 139, 166, 53, 209, 181, 55, 4, - 229, 58, 246, 188, 156, 42, 229, 173, 140, 38, 161, 6, 25, 239, 4, 84, - 231, 240, 169, 73, 59, 2, 229, 198, 10, 130, 152, 144, 192, 153, 188, 212, - 134, 51, 28, 89, 116, 194, 213, 200, 105, 151, 115, 207, 168, 101, 210, 46, - 105, 14, 113, 222, 2, 131, 206, 97, 203, 68, 195, 162, 172, 64, 212, 113, - 213, 117, 220, 172, 206, 48, 136, 50, 154, 196, 36, 210, 121, 180, 249, 47, - 132, 250, 114, 186, 160, 57, 156, 173, 101, 26, 192, 63, 177, 115, 99, 60, - 54, 38, 204, 228, 39, 167, 74, 227, 213, 208, 221, 47, 122, 201, 11, 83, - 251, 171, 236, 172, 119, 81, 172, 200, 228, 249, 133, 109, 125, 84, 68, 190, - 195, 180, 13, 58, 193, 19, 210, 140, 56, 254, 103, 126, 100, 241, 138, 247, - 55, 245, 59, 51, 47, 230, 94, 111, 241, 45, 87, 38, 249, 111, 48, 241, - 223, 197, 197, 29, 45, 155, 101, 186, 33, 254, 55, 147, 239, 97, 234, 100, - 10, 223, 252, 180, 22, 158, 199, 202, 36, 207, 78, 196, 126, 49, 87, 38, - 121, 69, 154, 230, 149, 213, 2, 60, 74, 211, 213, 95, 88, 41, 173, 192, - 75, 21, 254, 33, 158, 51, 143, 226, 52, 138, 157, 216, 141, 11, 104, 209, - 221, 47, 8, 189, 98, 141, 20, 113, 84, 121, 118, 185, 152, 29, 97, 179, - 11, 230, 5, 37, 186, 92, 78, 218, 104, 12, 93, 253, 152, 211, 74, 149, - 103, 98, 67, 30, 250, 78, 169, 100, 96, 188, 33, 94, 96, 247, 124, 216, - 72, 194, 243, 176, 26, 89, 91, 251, 198, 186, 241, 49, 66, 14, 110, 145, - 196, 102, 4, 133, 120, 188, 11, 52, 195, 27, 113, 246, 106, 126, 139, 189, - 126, 29, 104, 182, 204, 185, 143, 63, 114, 243, 39, 97, 206, 27, 55, 228, - 125, 193, 132, 55, 252, 102, 142, 98, 3, 16, 59, 217, 240, 90, 51, 218, - 249, 98, 252, 242, 229, 178, 250, 44, 157, 223, 212, 143, 229, 138, 132, 133, - 75, 203, 188, 78, 18, 94, 88, 190, 92, 217, 93, 97, 134, 28, 187, 176, - 213, 47, 87, 16, 49, 174, 198, 125, 254, 30, 82, 183, 135, 228, 44, 233, - 33, 6, 152, 169, 166, 197, 124, 193, 226, 145, 17, 94, 142, 53, 226, 45, - 69, 198, 186, 165, 232, 134, 242, 146, 123, 66, 39, 186, 97, 48, 171, 222, - 25, 98, 18, 38, 254, 111, 57, 123, 226, 124, 222, 75, 223, 242, 18, 175, - 222, 67, 90, 222, 196, 226, 69, 40, 173, 186, 96, 111, 124, 169, 187, 102, - 228, 177, 103, 201, 149, 169, 23, 14, 14, 167, 168, 67, 61, 224, 86, 77, - 225, 56, 10, 11, 183, 159, 206, 40, 178, 22, 194, 246, 251, 216, 229, 119, - 127, 25, 174, 124, 249, 108, 47, 219, 98, 65, 215, 248, 135, 120, 167, 157, - 219, 253, 135, 45, 190, 233, 144, 111, 9, 55, 132, 30, 228, 221, 128, 93, - 130, 247, 24, 87, 148, 240, 233, 184, 233, 216, 191, 48, 247, 105, 61, 234, - 163, 217, 34, 94, 55, 19, 142, 130, 247, 24, 95, 196, 143, 156, 139, 197, - 34, 243, 238, 230, 136, 27, 196, 220, 59, 155, 5, 124, 36, 18, 91, 0, - 86, 238, 224, 119, 24, 118, 219, 140, 125, 203, 172, 35, 25, 167, 21, 26, - 139, 38, 122, 112, 206, 91, 19, 144, 207, 45, 44, 89, 91, 56, 194, 33, - 139, 108, 4, 76, 156, 99, 163, 167, 53, 60, 61, 21, 222, 254, 224, 147, - 112, 123, 250, 83, 140, 225, 103, 50, 111, 200, 30, 31, 70, 90, 133, 113, - 31, 125, 232, 224, 205, 35, 109, 221, 19, 254, 145, 117, 225, 246, 46, 110, - 109, 75, 39, 35, 116, 174, 199, 32, 198, 11, 64, 218, 209, 189, 79, 177, - 158, 163, 187, 115, 248, 175, 136, 109, 237, 174, 232, 82, 123, 149, 207, 144, - 139, 9, 151, 179, 4, 140, 2, 96, 16, 168, 105, 196, 14, 127, 169, 240, - 198, 172, 219, 164, 63, 67, 12, 88, 228, 33, 68, 10, 67, 138, 81, 105, - 241, 150, 246, 216, 33, 109, 203, 233, 12, 60, 172, 83, 103, 213, 49, 7, - 203, 230, 231, 118, 114, 68, 241, 206, 156, 173, 232, 172, 101, 137, 55, 237, - 137, 171, 224, 13, 185, 128, 102, 244, 194, 22, 206, 136, 92, 238, 65, 59, - 58, 111, 37, 106, 164, 72, 46, 60, 182, 40, 103, 97, 93, 97, 179, 103, - 179, 148, 46, 51, 85, 245, 128, 24, 194, 22, 194, 170, 89, 25, 181, 22, - 111, 6, 231, 46, 189, 147, 135, 233, 157, 188, 46, 12, 133, 99, 174, 55, - 245, 239, 48, 217, 29, 157, 220, 164, 126, 31, 125, 151, 112, 248, 87, 192, - 0, 128, 137, 122, 67, 63, 143, 122, 104, 225, 139, 209, 191, 40, 97, 53, - 219, 192, 139, 196, 204, 174, 103, 192, 65, 76, 223, 163, 86, 55, 9, 212, - 7, 177, 239, 61, 28, 34, 32, 5, 30, 242, 208, 252, 44, 147, 149, 200, - 186, 123, 54, 185, 204, 69, 164, 240, 138, 29, 119, 77, 249, 162, 101, 245, - 139, 119, 255, 125, 32, 83, 128, 242, 172, 217, 153, 57, 143, 34, 170, 251, - 204, 169, 53, 11, 101, 201, 125, 226, 86, 152, 227, 205, 66, 184, 61, 251, - 254, 208, 90, 114, 40, 159, 39, 240, 37, 117, 82, 234, 158, 15, 184, 61, - 70, 5, 193, 239, 15, 107, 230, 97, 89, 125, 152, 168, 106, 111, 220, 251, - 247, 248, 12, 80, 211, 133, 164, 200, 228, 133, 187, 12, 200, 230, 158, 212, - 181, 230, 115, 86, 24, 128, 255, 244, 44, 204, 176, 145, 171, 65, 183, 242, - 242, 218, 53, 115, 47, 175, 176, 171, 255, 236, 81, 93, 219, 101, 127, 181, - 181, 75, 246, 183, 188, 214, 100, 127, 43, 107, 235, 226, 238, 215, 218, 154, - 242, 243, 207, 185, 242, 111, 64, 81, 161, 62, 224, 48, 245, 9, 158, 17, - 228, 202, 31, 65, 192, 93, 197, 43, 103, 11, 41, 241, 35, 140, 240, 166, - 37, 211, 115, 149, 137, 251, 16, 121, 124, 81, 180, 15, 216, 197, 225, 195, - 183, 240, 89, 48, 131, 225, 109, 111, 69, 249, 199, 63, 114, 10, 94, 61, - 139, 184, 41, 97, 3, 139, 42, 115, 204, 207, 7, 43, 5, 40, 33, 193, - 191, 85, 126, 225, 59, 52, 22, 138, 204, 120, 158, 112, 52, 57, 5, 143, - 201, 187, 43, 56, 26, 236, 168, 164, 230, 177, 211, 248, 88, 192, 163, 40, - 248, 56, 167, 84, 164, 63, 50, 76, 44, 203, 101, 179, 181, 15, 106, 138, - 143, 154, 108, 182, 30, 75, 71, 47, 53, 36, 11, 223, 8, 183, 102, 204, - 32, 55, 155, 5, 145, 46, 27, 86, 84, 193, 187, 238, 252, 61, 156, 57, - 9, 138, 148, 11, 234, 199, 149, 92, 37, 159, 171, 98, 203, 179, 244, 74, - 34, 61, 154, 69, 252, 156, 137, 136, 4, 189, 0, 194, 255, 159, 106, 5, - 69, 142, 170, 29, 231, 213, 143, 185, 10, 242, 201, 226, 97, 145, 145, 100, - 69, 185, 148, 64, 176, 125, 214, 88, 124, 153, 8, 183, 233, 87, 42, 204, - 166, 63, 58, 51, 15, 105, 159, 201, 37, 88, 234, 199, 108, 69, 72, 246, - 155, 160, 93, 223, 179, 153, 69, 22, 244, 45, 48, 25, 231, 138, 255, 183, - 0, 27, 59, 38, 127, 15, 168, 255, 183, 64, 169, 252, 79, 133, 81, 66, - 254, 4, 148, 118, 197, 53, 148, 138, 38, 97, 209, 49, 200, 160, 37, 109, - 53, 172, 120, 25, 252, 178, 38, 223, 10, 193, 132, 176, 248, 45, 127, 252, - 13, 122, 193, 141, 35, 115, 93, 47, 188, 24, 201, 60, 101, 221, 78, 166, - 104, 56, 44, 147, 111, 176, 72, 19, 13, 13, 131, 203, 133, 130, 138, 118, - 131, 97, 248, 150, 39, 13, 27, 233, 122, 64, 54, 158, 137, 142, 178, 175, - 212, 33, 119, 161, 147, 136, 39, 24, 23, 14, 13, 15, 215, 248, 95, 110, - 79, 137, 119, 92, 177, 25, 102, 132, 24, 237, 166, 112, 4, 105, 123, 234, - 197, 233, 248, 167, 143, 163, 34, 44, 72, 82, 122, 206, 118, 187, 205, 247, - 158, 205, 55, 31, 112, 1, 120, 118, 192, 156, 129, 170, 6, 202, 163, 79, - 185, 126, 65, 129, 209, 171, 146, 42, 118, 149, 137, 223, 115, 203, 107, 28, - 166, 38, 169, 101, 24, 5, 171, 116, 203, 243, 205, 33, 35, 250, 88, 13, - 236, 252, 236, 19, 183, 223, 101, 215, 154, 237, 113, 41, 55, 134, 157, 154, - 5, 40, 77, 102, 244, 75, 185, 62, 110, 97, 84, 204, 43, 85, 126, 161, - 152, 183, 80, 101, 45, 200, 25, 157, 132, 110, 173, 79, 130, 199, 71, 75, - 72, 190, 35, 246, 44, 205, 30, 211, 228, 222, 52, 82, 12, 146, 68, 120, - 74, 29, 49, 230, 92, 158, 72, 177, 227, 155, 119, 246, 167, 74, 90, 204, - 111, 197, 188, 179, 191, 100, 238, 70, 224, 62, 232, 168, 92, 157, 23, 72, - 139, 139, 182, 148, 168, 120, 155, 9, 178, 9, 177, 46, 181, 44, 147, 1, - 219, 166, 149, 112, 139, 193, 46, 58, 252, 152, 124, 21, 159, 21, 118, 208, - 129, 205, 191, 62, 45, 161, 174, 45, 205, 153, 150, 198, 46, 81, 204, 23, - 133, 190, 251, 174, 238, 205, 159, 119, 36, 100, 206, 80, 41, 183, 212, 71, - 151, 182, 88, 118, 161, 94, 102, 42, 244, 86, 121, 123, 201, 76, 156, 81, - 102, 40, 230, 49, 55, 239, 111, 152, 142, 164, 218, 65, 156, 228, 84, 228, - 249, 2, 203, 4, 247, 180, 43, 197, 145, 247, 50, 165, 62, 39, 218, 191, - 93, 9, 208, 234, 7, 221, 46, 148, 101, 202, 214, 200, 88, 54, 94, 149, - 97, 176, 33, 130, 168, 182, 92, 33, 42, 164, 252, 45, 29, 4, 71, 174, - 182, 69, 247, 230, 100, 51, 186, 136, 25, 222, 15, 95, 112, 29, 246, 175, - 227, 141, 229, 106, 186, 42, 117, 36, 16, 198, 188, 1, 108, 34, 84, 140, - 48, 178, 16, 101, 185, 30, 46, 233, 77, 48, 147, 111, 23, 129, 110, 1, - 49, 34, 32, 16, 78, 166, 51, 85, 35, 211, 46, 214, 164, 92, 45, 82, - 38, 178, 162, 117, 44, 106, 115, 223, 12, 31, 185, 114, 18, 164, 75, 76, - 121, 66, 0, 45, 228, 26, 171, 220, 104, 67, 65, 55, 68, 172, 166, 78, - 194, 65, 151, 252, 19, 122, 39, 67, 166, 130, 115, 22, 248, 163, 225, 79, - 25, 127, 144, 92, 3, 98, 206, 228, 11, 88, 171, 165, 183, 169, 117, 219, - 237, 161, 83, 134, 60, 26, 51, 242, 103, 232, 193, 111, 204, 151, 2, 41, - 252, 131, 133, 38, 35, 107, 107, 232, 111, 243, 99, 120, 13, 192, 48, 81, - 98, 237, 208, 34, 75, 229, 58, 84, 16, 118, 0, 206, 251, 212, 96, 254, - 59, 209, 253, 3, 175, 158, 213, 23, 217, 71, 154, 135, 120, 81, 35, 207, - 53, 166, 185, 207, 25, 97, 42, 153, 123, 138, 25, 90, 98, 74, 241, 15, - 34, 135, 70, 187, 57, 158, 68, 30, 139, 197, 232, 217, 125, 8, 231, 241, - 35, 235, 224, 71, 30, 82, 45, 186, 201, 211, 201, 76, 240, 178, 12, 30, - 166, 40, 146, 248, 104, 53, 207, 169, 199, 184, 4, 140, 20, 153, 134, 249, - 234, 124, 126, 31, 243, 185, 225, 100, 104, 200, 43, 24, 59, 207, 113, 129, - 135, 133, 193, 147, 188, 20, 132, 119, 29, 148, 234, 2, 140, 8, 101, 58, - 114, 95, 69, 104, 94, 145, 243, 176, 26, 31, 129, 143, 3, 250, 14, 92, - 207, 135, 208, 149, 49, 44, 151, 10, 89, 90, 152, 245, 28, 178, 209, 17, - 25, 39, 194, 13, 85, 103, 178, 246, 20, 239, 125, 103, 26, 190, 243, 222, - 122, 125, 70, 250, 136, 248, 126, 22, 108, 14, 59, 201, 29, 101, 9, 243, - 93, 113, 219, 162, 8, 52, 250, 105, 146, 251, 237, 185, 144, 235, 76, 144, - 93, 121, 154, 242, 151, 105, 20, 109, 142, 209, 253, 217, 221, 143, 153, 54, - 153, 93, 69, 77, 212, 250, 228, 61, 39, 221, 152, 176, 41, 40, 190, 97, - 14, 138, 111, 152, 132, 226, 219, 103, 161, 184, 124, 26, 222, 59, 110, 126, - 208, 103, 138, 219, 59, 220, 24, 58, 97, 218, 156, 100, 34, 184, 103, 209, - 16, 37, 160, 87, 32, 216, 172, 161, 79, 209, 115, 253, 62, 48, 109, 206, - 134, 248, 236, 89, 154, 61, 46, 247, 75, 59, 239, 15, 249, 101, 111, 201, - 103, 116, 232, 60, 80, 118, 138, 31, 211, 216, 139, 163, 123, 230, 240, 10, - 221, 141, 234, 236, 15, 247, 102, 252, 38, 221, 170, 32, 199, 9, 159, 22, - 9, 98, 185, 238, 48, 101, 239, 121, 223, 236, 12, 24, 9, 78, 184, 192, - 152, 39, 87, 162, 244, 140, 122, 68, 122, 241, 248, 29, 148, 32, 197, 94, - 239, 135, 244, 226, 194, 93, 115, 139, 2, 123, 25, 51, 194, 168, 84, 180, - 151, 29, 118, 253, 147, 200, 141, 146, 22, 132, 34, 130, 0, 238, 90, 74, - 39, 11, 246, 125, 120, 164, 6, 16, 173, 16, 81, 46, 73, 100, 62, 196, - 197, 162, 249, 67, 31, 4, 3, 140, 51, 68, 206, 132, 54, 146, 67, 31, - 223, 125, 183, 190, 200, 149, 82, 210, 210, 216, 226, 36, 147, 81, 174, 204, - 159, 51, 28, 234, 19, 115, 24, 12, 249, 89, 234, 182, 142, 44, 103, 116, - 142, 43, 39, 160, 52, 205, 161, 191, 28, 89, 152, 76, 10, 58, 119, 119, - 60, 13, 31, 38, 248, 196, 253, 250, 135, 143, 63, 188, 128, 75, 13, 35, - 76, 60, 77, 198, 251, 68, 60, 44, 75, 56, 3, 145, 6, 151, 248, 180, - 211, 183, 205, 251, 128, 70, 1, 92, 12, 12, 215, 135, 18, 1, 83, 207, - 223, 4, 34, 72, 162, 255, 233, 149, 59, 61, 223, 194, 15, 190, 147, 13, - 238, 67, 34, 212, 70, 71, 173, 10, 59, 12, 47, 169, 89, 28, 225, 119, - 211, 160, 216, 209, 75, 161, 234, 209, 99, 87, 128, 74, 11, 235, 22, 126, - 255, 175, 135, 112, 165, 164, 2, 67, 85, 73, 129, 240, 185, 78, 138, 11, - 72, 194, 194, 43, 244, 107, 15, 148, 36, 167, 49, 239, 139, 236, 154, 199, - 220, 39, 0, 245, 49, 5, 7, 58, 168, 98, 88, 127, 57, 228, 66, 35, - 86, 10, 96, 227, 177, 169, 99, 119, 117, 211, 98, 250, 170, 121, 31, 20, - 217, 61, 251, 65, 183, 96, 240, 204, 120, 150, 9, 165, 89, 182, 173, 98, - 59, 202, 88, 190, 157, 188, 249, 189, 228, 189, 236, 3, 190, 190, 20, 177, - 207, 231, 38, 55, 159, 178, 176, 249, 174, 11, 173, 190, 142, 177, 130, 194, - 34, 154, 84, 80, 229, 57, 202, 241, 106, 145, 52, 215, 206, 197, 122, 242, - 30, 223, 191, 255, 170, 66, 124, 126, 99, 30, 249, 18, 201, 136, 31, 17, - 81, 18, 3, 25, 75, 143, 15, 156, 59, 36, 69, 148, 249, 33, 177, 158, - 71, 104, 214, 16, 69, 6, 97, 139, 106, 139, 164, 248, 186, 206, 165, 189, - 224, 75, 254, 229, 181, 93, 200, 14, 47, 80, 94, 162, 159, 157, 164, 100, - 30, 167, 116, 12, 193, 46, 20, 123, 139, 232, 42, 161, 99, 114, 116, 253, - 182, 226, 173, 198, 78, 200, 217, 17, 57, 30, 98, 156, 237, 172, 55, 201, - 55, 152, 225, 239, 252, 37, 249, 140, 113, 98, 194, 231, 158, 75, 169, 29, - 189, 181, 161, 35, 223, 99, 223, 143, 250, 58, 190, 30, 0, 225, 214, 93, - 18, 175, 40, 158, 36, 234, 139, 39, 69, 213, 198, 19, 195, 218, 111, 54, - 218, 27, 46, 249, 22, 249, 196, 139, 165, 97, 145, 2, 30, 119, 117, 250, - 174, 35, 178, 189, 185, 252, 120, 94, 44, 107, 238, 171, 88, 14, 235, 204, - 124, 222, 129, 222, 134, 46, 160, 85, 32, 110, 143, 40, 69, 111, 23, 230, - 155, 230, 233, 133, 180, 239, 219, 11, 169, 32, 30, 127, 235, 244, 23, 235, - 96, 233, 169, 165, 251, 243, 169, 187, 173, 75, 72, 13, 102, 207, 30, 234, - 143, 24, 44, 71, 73, 204, 131, 19, 127, 219, 35, 223, 0, 8, 169, 237, - 153, 254, 148, 167, 28, 204, 13, 108, 227, 240, 230, 11, 180, 62, 213, 237, - 217, 27, 162, 67, 219, 215, 103, 9, 83, 138, 97, 220, 102, 239, 3, 202, - 106, 187, 217, 59, 101, 43, 165, 71, 47, 172, 183, 186, 247, 31, 20, 108, - 224, 118, 113, 47, 207, 5, 173, 16, 183, 42, 4, 42, 97, 120, 196, 102, - 40, 165, 76, 244, 209, 8, 232, 65, 34, 107, 62, 44, 69, 106, 245, 122, - 135, 100, 211, 26, 230, 118, 131, 89, 9, 253, 127, 36, 104, 140, 96, 94, - 209, 96, 73, 92, 28, 103, 198, 75, 49, 124, 20, 123, 95, 142, 139, 208, - 39, 165, 164, 45, 197, 69, 11, 217, 105, 86, 115, 243, 252, 251, 188, 107, - 93, 37, 169, 113, 252, 247, 83, 136, 216, 204, 196, 8, 68, 60, 53, 228, - 162, 69, 20, 161, 223, 148, 248, 41, 140, 87, 36, 29, 22, 134, 164, 44, - 212, 231, 76, 211, 50, 91, 97, 100, 80, 226, 107, 117, 18, 234, 250, 18, - 36, 100, 52, 75, 141, 83, 145, 197, 228, 255, 125, 139, 183, 109, 178, 176, - 140, 100, 59, 176, 59, 115, 81, 174, 56, 98, 133, 77, 121, 26, 232, 6, - 98, 135, 206, 127, 206, 134, 76, 157, 149, 144, 75, 204, 220, 139, 14, 207, - 182, 12, 187, 253, 198, 52, 17, 22, 27, 213, 124, 22, 170, 11, 132, 98, - 44, 190, 76, 123, 158, 99, 197, 214, 199, 100, 175, 241, 165, 73, 164, 164, - 94, 238, 92, 182, 35, 110, 94, 43, 112, 93, 16, 66, 239, 82, 161, 248, - 230, 213, 18, 95, 40, 44, 19, 95, 255, 22, 76, 138, 27, 233, 93, 149, - 185, 50, 188, 162, 23, 74, 253, 235, 68, 2, 20, 122, 203, 105, 183, 219, - 226, 83, 157, 114, 173, 45, 188, 214, 205, 109, 181, 189, 72, 249, 195, 252, - 186, 72, 253, 213, 143, 168, 93, 98, 171, 189, 90, 194, 73, 122, 38, 222, - 116, 45, 231, 77, 184, 69, 235, 172, 252, 24, 157, 227, 70, 5, 66, 141, - 209, 71, 16, 31, 120, 162, 80, 228, 85, 73, 27, 62, 97, 117, 34, 150, - 135, 140, 54, 84, 215, 22, 213, 65, 30, 72, 43, 152, 82, 102, 182, 177, - 100, 34, 21, 160, 173, 197, 187, 120, 100, 138, 25, 83, 226, 242, 195, 40, - 116, 206, 155, 207, 181, 167, 179, 179, 230, 248, 185, 164, 78, 166, 49, 137, - 221, 37, 162, 244, 228, 249, 67, 228, 166, 104, 241, 147, 201, 130, 101, 103, - 20, 192, 146, 199, 220, 140, 121, 87, 92, 119, 6, 180, 207, 97, 189, 141, - 143, 82, 244, 244, 178, 73, 55, 59, 119, 8, 113, 140, 54, 239, 79, 26, - 157, 42, 206, 240, 74, 93, 202, 242, 75, 165, 44, 246, 8, 7, 56, 230, - 8, 90, 31, 58, 204, 215, 235, 9, 178, 13, 61, 7, 195, 214, 139, 171, - 195, 120, 187, 165, 227, 59, 252, 105, 147, 118, 68, 26, 198, 165, 68, 110, - 194, 116, 59, 120, 83, 49, 126, 110, 244, 231, 245, 56, 113, 139, 64, 22, - 0, 243, 165, 19, 171, 153, 129, 209, 38, 103, 147, 194, 169, 224, 126, 114, - 227, 214, 227, 186, 97, 6, 73, 101, 23, 147, 150, 146, 7, 33, 76, 143, - 21, 47, 83, 158, 223, 217, 236, 214, 15, 78, 173, 17, 63, 246, 155, 179, - 66, 95, 122, 192, 21, 179, 37, 157, 187, 221, 138, 23, 205, 241, 86, 46, - 106, 214, 228, 249, 82, 155, 166, 55, 18, 70, 98, 179, 250, 106, 63, 66, - 202, 227, 179, 186, 245, 242, 41, 224, 159, 154, 83, 230, 160, 230, 181, 73, - 85, 23, 112, 110, 218, 172, 42, 175, 206, 233, 139, 51, 170, 212, 224, 115, - 13, 133, 102, 73, 81, 222, 54, 163, 202, 235, 193, 218, 254, 186, 26, 245, - 95, 17, 33, 160, 130, 97, 230, 83, 239, 106, 183, 57, 166, 205, 220, 50, - 151, 179, 107, 192, 130, 8, 181, 173, 182, 224, 68, 39, 213, 121, 14, 250, - 101, 73, 38, 67, 194, 115, 134, 147, 1, 78, 11, 180, 204, 10, 222, 213, - 86, 180, 231, 95, 65, 100, 40, 23, 84, 237, 121, 85, 216, 25, 125, 86, - 89, 232, 60, 238, 111, 131, 59, 240, 210, 226, 174, 82, 148, 76, 30, 227, - 95, 2, 63, 251, 153, 220, 134, 189, 197, 195, 189, 167, 191, 115, 255, 162, - 226, 188, 171, 152, 240, 233, 178, 42, 137, 219, 31, 120, 52, 189, 42, 97, - 160, 190, 21, 175, 131, 162, 241, 170, 132, 110, 100, 114, 240, 179, 154, 113, - 31, 24, 7, 45, 231, 110, 29, 118, 226, 123, 139, 229, 88, 132, 23, 28, - 11, 51, 229, 13, 221, 118, 113, 143, 56, 201, 146, 220, 61, 252, 220, 185, - 74, 212, 71, 244, 239, 206, 102, 244, 22, 77, 72, 145, 185, 211, 102, 153, - 232, 208, 29, 25, 0, 62, 96, 101, 150, 161, 70, 95, 25, 156, 10, 225, - 12, 68, 185, 90, 148, 59, 114, 172, 41, 144, 30, 172, 164, 34, 149, 43, - 179, 34, 229, 180, 34, 213, 68, 145, 74, 90, 145, 122, 162, 72, 53, 173, - 8, 0, 110, 188, 76, 109, 97, 128, 177, 204, 122, 148, 25, 186, 48, 81, - 50, 243, 4, 60, 61, 186, 68, 98, 45, 228, 136, 234, 39, 227, 76, 220, - 198, 224, 214, 101, 56, 87, 1, 254, 104, 45, 52, 57, 2, 22, 233, 195, - 175, 110, 94, 41, 172, 184, 31, 80, 211, 202, 139, 168, 88, 36, 39, 138, - 23, 86, 194, 167, 143, 57, 237, 195, 106, 178, 52, 146, 108, 13, 167, 158, - 124, 212, 12, 30, 225, 113, 252, 44, 225, 159, 62, 158, 137, 69, 173, 231, - 248, 158, 33, 97, 85, 92, 32, 19, 173, 125, 198, 144, 64, 203, 138, 170, - 60, 36, 65, 130, 65, 250, 24, 158, 59, 74, 204, 175, 177, 164, 20, 128, - 153, 3, 110, 174, 16, 30, 14, 35, 251, 102, 246, 134, 58, 243, 214, 152, - 171, 124, 248, 56, 134, 206, 22, 209, 144, 172, 242, 49, 199, 114, 152, 49, - 217, 236, 37, 242, 118, 41, 46, 214, 224, 65, 61, 203, 10, 207, 234, 81, - 202, 240, 70, 174, 9, 8, 67, 51, 240, 104, 155, 5, 53, 192, 67, 68, - 245, 123, 198, 42, 102, 32, 149, 69, 90, 208, 248, 224, 75, 90, 228, 142, - 18, 227, 48, 76, 50, 6, 250, 202, 146, 63, 226, 193, 62, 155, 54, 16, - 56, 209, 248, 175, 90, 200, 25, 120, 70, 89, 205, 195, 95, 150, 193, 118, - 108, 174, 38, 210, 107, 177, 116, 72, 174, 139, 228, 58, 75, 142, 140, 190, - 38, 164, 83, 12, 67, 110, 162, 153, 255, 148, 109, 179, 204, 157, 102, 132, - 230, 94, 28, 189, 62, 229, 26, 194, 180, 64, 226, 17, 28, 48, 162, 145, - 224, 34, 221, 0, 5, 231, 169, 96, 36, 197, 155, 20, 127, 73, 187, 68, - 189, 204, 92, 8, 63, 121, 139, 113, 76, 146, 205, 172, 1, 33, 99, 148, - 136, 219, 141, 3, 21, 57, 15, 109, 200, 81, 253, 24, 186, 69, 250, 17, - 206, 115, 139, 199, 67, 128, 167, 29, 61, 240, 208, 217, 207, 140, 9, 221, - 5, 161, 210, 79, 112, 160, 32, 54, 198, 185, 174, 57, 154, 30, 227, 157, - 65, 12, 12, 89, 103, 12, 125, 20, 63, 209, 12, 245, 183, 243, 225, 145, - 18, 183, 129, 66, 93, 48, 191, 11, 249, 97, 117, 166, 230, 157, 103, 111, - 102, 141, 30, 187, 102, 232, 15, 47, 82, 13, 176, 171, 165, 241, 251, 230, - 193, 227, 227, 52, 201, 60, 74, 201, 88, 7, 75, 120, 161, 120, 17, 126, - 249, 60, 201, 166, 148, 163, 131, 187, 109, 144, 232, 112, 5, 116, 119, 64, - 109, 166, 203, 133, 210, 236, 137, 113, 50, 243, 213, 180, 124, 151, 218, 61, - 230, 61, 38, 206, 205, 198, 166, 245, 199, 3, 223, 190, 110, 195, 7, 147, - 243, 54, 107, 181, 144, 79, 141, 243, 152, 218, 2, 143, 137, 150, 100, 120, - 183, 103, 195, 193, 171, 7, 220, 167, 98, 42, 167, 25, 91, 163, 215, 11, - 239, 32, 134, 67, 43, 169, 180, 3, 153, 249, 101, 99, 215, 155, 208, 96, - 48, 165, 112, 101, 174, 240, 137, 11, 192, 229, 78, 223, 108, 48, 150, 202, - 209, 170, 111, 93, 132, 144, 169, 227, 155, 254, 223, 167, 134, 168, 226, 53, - 136, 84, 53, 68, 59, 66, 110, 156, 34, 133, 175, 185, 143, 25, 79, 94, - 147, 11, 5, 141, 0, 89, 84, 0, 151, 18, 160, 125, 240, 174, 102, 128, - 141, 123, 242, 120, 52, 196, 223, 229, 79, 44, 252, 225, 239, 202, 39, 245, - 249, 153, 223, 34, 21, 53, 124, 251, 59, 190, 21, 241, 156, 254, 9, 200, - 204, 51, 59, 166, 111, 160, 45, 12, 252, 67, 174, 69, 69, 94, 13, 15, - 169, 202, 236, 2, 65, 14, 125, 240, 43, 53, 248, 87, 103, 46, 187, 25, - 154, 190, 77, 246, 240, 104, 237, 73, 46, 54, 62, 230, 202, 161, 71, 122, - 198, 103, 69, 158, 3, 139, 196, 44, 10, 46, 48, 228, 25, 129, 14, 113, - 63, 173, 130, 250, 113, 71, 173, 232, 142, 21, 168, 216, 145, 4, 255, 151, - 129, 165, 74, 4, 114, 140, 170, 67, 2, 241, 167, 43, 4, 246, 14, 205, - 20, 202, 36, 242, 92, 135, 21, 98, 125, 31, 164, 134, 248, 135, 204, 91, - 34, 38, 100, 130, 121, 195, 122, 147, 33, 32, 231, 152, 170, 35, 169, 146, - 12, 249, 184, 144, 95, 77, 6, 98, 92, 200, 175, 39, 195, 48, 198, 121, - 174, 185, 214, 235, 225, 112, 122, 130, 100, 0, 89, 135, 17, 224, 63, 57, - 86, 172, 241, 156, 224, 234, 226, 53, 160, 153, 6, 207, 235, 83, 22, 213, - 239, 8, 121, 95, 60, 20, 40, 70, 60, 188, 176, 156, 146, 153, 2, 8, - 248, 48, 113, 87, 65, 98, 12, 15, 107, 127, 129, 43, 1, 6, 132, 234, - 56, 87, 53, 194, 45, 9, 133, 29, 97, 38, 133, 74, 115, 197, 42, 244, - 230, 55, 149, 59, 92, 206, 253, 4, 108, 56, 227, 35, 105, 34, 246, 124, - 246, 138, 5, 199, 32, 29, 126, 149, 144, 213, 67, 86, 218, 156, 14, 179, - 80, 24, 225, 53, 46, 118, 245, 112, 68, 59, 102, 215, 164, 6, 90, 66, - 16, 139, 162, 121, 45, 222, 224, 19, 55, 65, 80, 17, 41, 2, 124, 24, - 105, 1, 35, 48, 80, 68, 113, 207, 230, 201, 24, 247, 88, 66, 97, 32, - 245, 114, 230, 47, 241, 171, 153, 191, 136, 75, 153, 63, 97, 120, 83, 22, - 57, 2, 61, 149, 39, 183, 50, 51, 9, 107, 44, 236, 240, 216, 38, 98, - 54, 139, 137, 125, 192, 131, 86, 161, 20, 197, 128, 251, 73, 150, 248, 53, - 134, 113, 169, 130, 119, 26, 194, 215, 62, 123, 197, 96, 88, 17, 51, 40, - 220, 164, 51, 151, 198, 36, 230, 51, 29, 121, 176, 184, 11, 117, 113, 46, - 33, 124, 167, 51, 28, 153, 149, 202, 161, 71, 70, 37, 242, 75, 38, 163, - 50, 84, 47, 102, 238, 66, 156, 162, 34, 36, 132, 97, 33, 146, 131, 88, - 50, 134, 232, 188, 2, 29, 27, 58, 76, 1, 222, 225, 79, 60, 238, 35, - 127, 78, 99, 227, 82, 104, 138, 54, 79, 128, 250, 186, 59, 162, 118, 220, - 4, 157, 75, 233, 229, 56, 161, 220, 50, 240, 38, 121, 228, 79, 56, 166, - 181, 73, 30, 97, 136, 114, 161, 29, 217, 114, 158, 139, 171, 92, 22, 152, - 8, 133, 241, 8, 218, 124, 185, 83, 30, 17, 77, 143, 121, 28, 100, 206, - 42, 226, 154, 167, 191, 52, 51, 255, 173, 154, 153, 23, 98, 55, 38, 65, - 59, 93, 94, 22, 133, 210, 226, 48, 110, 112, 209, 187, 217, 246, 152, 15, - 219, 232, 240, 136, 147, 135, 91, 125, 150, 46, 165, 39, 255, 160, 247, 148, - 184, 188, 144, 212, 148, 138, 27, 66, 47, 113, 199, 245, 215, 21, 198, 184, - 45, 227, 231, 133, 22, 30, 140, 241, 65, 166, 57, 198, 198, 2, 241, 88, - 234, 0, 80, 233, 5, 67, 19, 26, 58, 27, 210, 27, 184, 189, 191, 182, - 215, 127, 197, 246, 42, 151, 128, 133, 78, 141, 165, 185, 8, 239, 41, 46, - 76, 218, 104, 120, 53, 115, 31, 19, 121, 143, 137, 169, 32, 98, 78, 100, - 202, 179, 43, 3, 57, 37, 227, 142, 92, 167, 135, 87, 205, 129, 168, 125, - 102, 161, 45, 114, 226, 18, 129, 204, 46, 17, 120, 3, 106, 81, 223, 177, - 81, 199, 164, 242, 235, 96, 18, 139, 167, 242, 244, 63, 181, 103, 212, 189, - 20, 161, 19, 60, 220, 102, 198, 69, 95, 52, 192, 143, 39, 180, 48, 25, - 133, 39, 96, 240, 207, 15, 60, 81, 97, 156, 152, 72, 230, 73, 101, 30, - 86, 68, 229, 33, 160, 57, 239, 43, 116, 41, 81, 52, 207, 41, 158, 17, - 48, 93, 151, 34, 237, 173, 228, 62, 175, 62, 207, 141, 234, 78, 51, 102, - 10, 43, 180, 156, 87, 242, 120, 101, 17, 135, 143, 214, 235, 154, 248, 190, - 200, 239, 51, 136, 210, 97, 113, 20, 36, 162, 242, 60, 42, 9, 240, 44, - 25, 206, 141, 199, 152, 241, 40, 180, 196, 0, 245, 79, 252, 108, 51, 31, - 6, 254, 132, 54, 126, 195, 203, 31, 166, 61, 66, 65, 120, 182, 0, 10, - 99, 30, 162, 248, 160, 200, 201, 132, 71, 163, 181, 48, 18, 55, 99, 134, - 162, 229, 128, 165, 72, 154, 194, 47, 71, 125, 203, 67, 224, 46, 66, 79, - 26, 10, 14, 218, 166, 55, 20, 104, 151, 61, 75, 179, 199, 52, 244, 186, - 7, 44, 101, 66, 25, 50, 175, 198, 152, 33, 214, 184, 61, 123, 28, 183, - 46, 50, 32, 202, 252, 25, 84, 82, 132, 110, 44, 184, 93, 89, 68, 207, - 53, 137, 51, 245, 175, 98, 232, 191, 226, 73, 255, 255, 0, 105, 106, 232, - 88, 34, 29, 105, 10, 128, 158, 161, 57, 34, 146, 48, 76, 27, 6, 2, - 142, 246, 84, 2, 198, 151, 239, 35, 241, 117, 218, 222, 241, 209, 147, 146, - 216, 59, 248, 44, 205, 30, 95, 102, 77, 14, 232, 3, 98, 140, 80, 149, - 153, 188, 165, 202, 184, 244, 22, 154, 206, 155, 41, 26, 58, 109, 174, 224, - 182, 105, 80, 107, 198, 201, 148, 231, 182, 227, 140, 119, 248, 139, 105, 248, - 15, 131, 127, 239, 149, 13, 16, 58, 198, 217, 209, 209, 87, 34, 186, 34, - 112, 223, 112, 239, 82, 91, 182, 47, 56, 176, 190, 193, 199, 117, 102, 72, - 13, 83, 183, 209, 102, 166, 144, 211, 158, 51, 97, 192, 107, 118, 216, 137, - 183, 25, 249, 45, 74, 40, 133, 199, 170, 240, 135, 31, 51, 10, 186, 119, - 219, 103, 92, 236, 83, 14, 50, 56, 217, 71, 85, 9, 18, 187, 114, 156, - 216, 165, 56, 197, 94, 216, 59, 47, 236, 73, 54, 152, 212, 208, 238, 194, - 135, 54, 57, 7, 58, 132, 188, 178, 8, 243, 46, 146, 125, 158, 42, 165, - 37, 166, 137, 232, 113, 39, 139, 49, 93, 181, 34, 207, 221, 186, 73, 88, - 168, 85, 230, 110, 91, 205, 66, 193, 147, 184, 211, 215, 67, 199, 118, 152, - 1, 47, 59, 39, 113, 245, 169, 135, 182, 65, 120, 142, 50, 83, 103, 35, - 144, 226, 215, 41, 206, 214, 197, 89, 196, 92, 91, 203, 21, 198, 76, 149, - 48, 39, 247, 207, 219, 79, 52, 109, 211, 115, 124, 215, 25, 45, 181, 63, - 125, 73, 123, 62, 127, 232, 193, 151, 224, 45, 106, 142, 191, 48, 209, 127, - 43, 37, 174, 150, 148, 70, 73, 145, 83, 48, 206, 252, 246, 74, 243, 191, - 216, 95, 123, 18, 209, 244, 242, 11, 197, 115, 79, 21, 12, 171, 138, 110, - 53, 209, 41, 230, 135, 140, 225, 3, 251, 47, 28, 85, 168, 21, 144, 85, - 208, 63, 144, 138, 55, 155, 126, 211, 126, 207, 105, 159, 100, 120, 45, 71, - 30, 107, 52, 188, 57, 139, 23, 54, 67, 220, 134, 183, 167, 153, 63, 142, - 98, 104, 253, 167, 133, 129, 214, 56, 167, 206, 84, 199, 194, 51, 173, 60, - 115, 232, 161, 160, 67, 143, 242, 51, 247, 52, 137, 22, 139, 3, 230, 238, - 18, 213, 197, 227, 200, 61, 164, 154, 228, 215, 151, 161, 150, 165, 24, 109, - 113, 244, 139, 184, 141, 31, 170, 66, 153, 136, 99, 167, 177, 20, 105, 62, - 33, 13, 157, 133, 71, 84, 194, 14, 44, 161, 40, 76, 232, 63, 90, 64, - 111, 48, 26, 221, 66, 81, 101, 177, 104, 154, 233, 220, 252, 217, 88, 42, - 195, 158, 56, 194, 155, 11, 72, 130, 166, 145, 218, 114, 169, 130, 235, 230, - 149, 23, 189, 107, 252, 133, 67, 254, 75, 112, 200, 114, 13, 35, 77, 128, - 124, 38, 241, 154, 123, 250, 187, 252, 60, 95, 232, 213, 141, 150, 172, 98, - 113, 147, 109, 83, 203, 39, 39, 84, 104, 34, 187, 240, 54, 162, 92, 253, - 40, 158, 211, 182, 213, 226, 189, 14, 45, 84, 210, 191, 38, 25, 191, 182, - 149, 230, 79, 164, 23, 55, 210, 28, 129, 102, 66, 193, 114, 187, 205, 184, - 240, 157, 230, 34, 231, 175, 93, 244, 223, 186, 139, 212, 18, 16, 197, 84, - 74, 44, 32, 55, 133, 249, 207, 67, 46, 176, 133, 134, 55, 160, 126, 167, - 223, 30, 179, 27, 83, 66, 13, 198, 104, 35, 193, 92, 118, 129, 141, 80, - 23, 24, 216, 91, 167, 227, 163, 214, 43, 65, 237, 230, 118, 198, 210, 189, - 23, 246, 35, 109, 219, 161, 142, 138, 203, 169, 159, 240, 32, 79, 188, 72, - 177, 231, 184, 228, 186, 73, 125, 188, 101, 204, 196, 232, 229, 58, 250, 31, - 182, 96, 73, 191, 196, 30, 120, 255, 31, 123, 95, 222, 223, 182, 173, 172, - 253, 247, 213, 167, 64, 84, 166, 149, 44, 74, 226, 162, 53, 142, 220, 95, - 236, 180, 110, 110, 147, 28, 31, 39, 221, 174, 235, 232, 80, 18, 109, 177, - 214, 86, 82, 178, 173, 234, 232, 187, 191, 51, 3, 128, 4, 23, 89, 114, - 227, 46, 233, 235, 54, 150, 68, 96, 0, 130, 32, 48, 24, 12, 102, 158, - 129, 253, 204, 104, 58, 199, 141, 59, 183, 189, 99, 228, 242, 23, 224, 185, - 233, 165, 59, 65, 133, 152, 139, 80, 157, 136, 89, 186, 24, 205, 117, 22, - 76, 153, 191, 152, 208, 169, 157, 135, 7, 181, 136, 244, 121, 131, 218, 254, - 75, 196, 152, 69, 72, 219, 65, 136, 213, 195, 203, 4, 236, 73, 134, 153, - 76, 198, 208, 185, 19, 150, 115, 64, 221, 2, 67, 151, 59, 211, 11, 64, - 221, 11, 245, 56, 184, 146, 143, 57, 191, 111, 15, 117, 9, 220, 195, 110, - 252, 53, 240, 154, 245, 12, 187, 18, 222, 140, 111, 144, 101, 188, 163, 65, - 203, 25, 181, 58, 136, 245, 100, 194, 39, 206, 178, 191, 198, 211, 254, 23, - 179, 153, 63, 69, 19, 55, 113, 200, 154, 68, 118, 138, 246, 152, 163, 152, - 249, 216, 225, 8, 56, 44, 226, 67, 221, 12, 189, 57, 110, 46, 127, 192, - 111, 76, 232, 97, 78, 94, 161, 152, 43, 71, 81, 41, 106, 53, 83, 150, - 228, 247, 12, 235, 126, 92, 68, 62, 253, 69, 100, 179, 40, 22, 91, 38, - 158, 225, 185, 147, 29, 70, 151, 173, 173, 83, 208, 42, 165, 248, 178, 194, - 61, 66, 17, 84, 69, 71, 127, 176, 228, 210, 34, 87, 19, 5, 133, 244, - 142, 242, 226, 190, 159, 155, 107, 54, 113, 47, 241, 53, 72, 212, 207, 38, - 89, 69, 249, 49, 187, 170, 154, 234, 124, 58, 164, 198, 217, 4, 1, 102, - 33, 4, 216, 202, 34, 235, 96, 214, 151, 150, 188, 120, 86, 35, 208, 152, - 100, 149, 246, 174, 85, 90, 25, 213, 112, 139, 153, 44, 118, 180, 113, 157, - 140, 63, 122, 122, 177, 196, 128, 206, 188, 227, 14, 71, 211, 169, 216, 11, - 14, 101, 98, 183, 135, 137, 122, 70, 90, 22, 31, 228, 43, 105, 16, 217, - 122, 168, 106, 174, 118, 202, 210, 36, 36, 143, 225, 235, 53, 82, 112, 10, - 25, 108, 49, 77, 20, 61, 71, 20, 1, 59, 219, 10, 148, 240, 4, 239, - 118, 72, 122, 228, 57, 159, 42, 207, 105, 96, 148, 182, 180, 224, 186, 107, - 51, 72, 84, 115, 65, 156, 2, 201, 116, 232, 4, 172, 135, 0, 19, 30, - 44, 86, 100, 13, 215, 91, 62, 219, 0, 24, 68, 229, 36, 226, 15, 130, - 14, 189, 115, 123, 48, 204, 60, 40, 125, 188, 88, 58, 232, 45, 140, 10, - 248, 19, 103, 238, 163, 152, 69, 207, 38, 132, 167, 0, 164, 167, 153, 119, - 59, 10, 42, 139, 160, 138, 14, 143, 104, 225, 81, 13, 103, 91, 153, 102, - 91, 25, 74, 151, 103, 195, 233, 124, 10, 146, 223, 2, 79, 97, 113, 233, - 46, 67, 214, 85, 85, 176, 212, 248, 244, 220, 77, 57, 95, 10, 104, 106, - 49, 141, 7, 22, 70, 161, 215, 212, 173, 92, 153, 194, 197, 56, 227, 25, - 122, 211, 14, 166, 140, 83, 85, 120, 232, 25, 120, 217, 26, 100, 161, 49, - 93, 197, 20, 230, 142, 112, 93, 238, 212, 13, 92, 187, 71, 136, 152, 7, - 215, 7, 60, 74, 248, 220, 155, 184, 183, 21, 102, 54, 244, 145, 211, 195, - 81, 81, 103, 191, 144, 226, 204, 8, 29, 26, 106, 79, 185, 206, 223, 1, - 126, 151, 143, 80, 23, 70, 83, 140, 49, 192, 109, 114, 235, 121, 44, 222, - 29, 229, 246, 200, 135, 194, 124, 10, 117, 135, 144, 138, 217, 218, 255, 13, - 236, 106, 51, 159, 76, 244, 95, 22, 171, 156, 194, 212, 63, 153, 6, 40, - 199, 115, 224, 0, 250, 221, 29, 66, 186, 158, 184, 86, 216, 99, 41, 210, - 119, 59, 227, 177, 163, 26, 115, 219, 170, 90, 106, 131, 106, 219, 122, 228, - 75, 255, 0, 190, 100, 87, 141, 102, 213, 204, 4, 49, 141, 6, 205, 110, - 147, 214, 153, 205, 70, 203, 238, 37, 141, 165, 149, 105, 124, 208, 76, 114, - 75, 12, 43, 209, 172, 13, 83, 34, 99, 120, 110, 156, 14, 177, 10, 179, - 166, 194, 226, 114, 24, 223, 52, 97, 74, 124, 215, 164, 166, 236, 104, 178, - 106, 10, 235, 209, 59, 182, 77, 116, 92, 214, 84, 143, 213, 164, 82, 153, - 171, 160, 140, 152, 149, 106, 218, 144, 181, 181, 21, 37, 37, 181, 167, 122, - 220, 15, 61, 242, 128, 135, 1, 217, 104, 101, 227, 238, 197, 166, 10, 223, - 16, 153, 242, 128, 155, 111, 70, 26, 27, 54, 70, 177, 130, 104, 149, 2, - 219, 143, 157, 118, 68, 25, 5, 197, 157, 50, 182, 66, 141, 135, 223, 10, - 53, 30, 102, 43, 148, 197, 99, 54, 175, 241, 241, 135, 78, 179, 181, 111, - 23, 55, 14, 244, 155, 195, 89, 218, 149, 184, 210, 213, 139, 44, 70, 150, - 97, 199, 150, 64, 123, 141, 179, 168, 184, 33, 253, 142, 32, 112, 49, 4, - 184, 23, 10, 234, 155, 250, 251, 84, 65, 128, 59, 142, 33, 192, 29, 198, - 16, 224, 94, 100, 33, 192, 189, 72, 35, 192, 157, 166, 17, 224, 142, 179, - 16, 224, 14, 227, 8, 112, 175, 51, 16, 224, 144, 164, 124, 138, 70, 204, - 217, 8, 112, 152, 175, 230, 41, 89, 137, 82, 74, 14, 53, 38, 153, 71, - 8, 110, 175, 179, 16, 224, 146, 183, 22, 8, 112, 89, 229, 123, 169, 84, - 129, 0, 151, 170, 131, 35, 192, 101, 81, 15, 147, 169, 4, 241, 246, 141, - 130, 0, 247, 46, 141, 0, 247, 125, 12, 1, 238, 85, 10, 1, 46, 246, - 96, 28, 210, 237, 40, 134, 0, 247, 38, 137, 0, 247, 83, 2, 1, 238, - 91, 5, 1, 238, 181, 138, 0, 119, 148, 70, 128, 227, 16, 134, 47, 146, - 32, 85, 194, 145, 244, 136, 2, 10, 134, 102, 97, 143, 171, 212, 63, 98, - 149, 178, 205, 236, 85, 234, 42, 228, 142, 4, 146, 23, 25, 69, 134, 25, - 8, 227, 73, 35, 131, 192, 153, 114, 25, 108, 115, 35, 111, 142, 234, 72, - 179, 101, 224, 52, 161, 95, 251, 136, 126, 235, 209, 207, 108, 69, 84, 92, - 102, 172, 165, 85, 237, 228, 135, 23, 115, 133, 74, 200, 157, 27, 172, 181, - 210, 85, 33, 31, 76, 35, 237, 25, 9, 65, 148, 168, 224, 253, 247, 189, - 32, 242, 108, 178, 82, 94, 229, 89, 230, 93, 134, 158, 127, 183, 232, 113, - 203, 235, 107, 156, 118, 60, 176, 195, 245, 142, 243, 237, 68, 88, 130, 227, - 109, 127, 160, 13, 250, 169, 56, 79, 146, 65, 29, 30, 205, 56, 255, 202, - 120, 224, 202, 81, 97, 34, 238, 95, 12, 253, 58, 96, 232, 190, 62, 189, - 153, 68, 64, 216, 78, 116, 38, 231, 178, 9, 30, 12, 58, 163, 75, 120, - 218, 249, 112, 204, 102, 254, 20, 246, 112, 240, 24, 34, 6, 230, 141, 219, - 155, 193, 194, 16, 214, 254, 220, 97, 176, 53, 186, 232, 200, 3, 60, 62, - 153, 42, 99, 55, 127, 144, 76, 121, 94, 117, 14, 146, 177, 48, 121, 96, - 74, 135, 253, 186, 192, 61, 12, 12, 47, 104, 92, 223, 45, 15, 220, 177, - 195, 241, 165, 120, 179, 233, 248, 114, 134, 62, 166, 46, 6, 44, 156, 57, - 115, 143, 239, 128, 96, 213, 142, 78, 53, 227, 149, 191, 154, 99, 0, 205, - 5, 197, 187, 132, 45, 17, 1, 228, 245, 92, 68, 203, 230, 229, 112, 255, - 235, 241, 7, 35, 238, 196, 33, 160, 3, 86, 248, 124, 52, 223, 55, 13, - 171, 86, 140, 98, 17, 254, 5, 241, 206, 113, 155, 95, 181, 178, 118, 250, - 35, 193, 198, 50, 227, 156, 55, 89, 119, 224, 246, 22, 151, 29, 147, 161, - 60, 94, 190, 240, 230, 28, 196, 231, 103, 38, 204, 218, 240, 36, 61, 127, - 38, 134, 226, 57, 59, 254, 226, 205, 171, 163, 103, 130, 55, 98, 212, 240, - 156, 168, 95, 34, 102, 62, 141, 206, 56, 98, 106, 128, 56, 219, 20, 78, - 198, 79, 180, 85, 158, 80, 141, 250, 56, 254, 187, 50, 40, 165, 101, 54, - 242, 107, 53, 158, 91, 54, 243, 150, 119, 94, 153, 101, 12, 167, 149, 102, - 224, 203, 145, 251, 203, 213, 23, 1, 11, 97, 29, 56, 47, 167, 228, 238, - 76, 36, 234, 25, 105, 59, 137, 219, 100, 71, 22, 195, 173, 87, 28, 85, - 118, 144, 200, 107, 9, 137, 252, 200, 153, 92, 59, 9, 143, 146, 199, 243, - 129, 191, 143, 116, 195, 141, 221, 113, 80, 177, 111, 253, 233, 104, 164, 26, - 184, 255, 94, 196, 48, 203, 174, 26, 169, 163, 202, 44, 85, 255, 215, 156, - 31, 127, 117, 59, 27, 193, 24, 133, 30, 64, 155, 137, 252, 238, 134, 16, - 166, 241, 249, 188, 99, 53, 172, 154, 96, 10, 241, 241, 158, 193, 29, 38, - 227, 206, 202, 208, 39, 235, 92, 105, 196, 34, 153, 171, 199, 140, 74, 179, - 206, 22, 147, 0, 77, 177, 233, 2, 186, 180, 82, 107, 75, 189, 184, 10, - 131, 75, 254, 111, 82, 139, 79, 182, 9, 21, 171, 65, 200, 4, 205, 92, - 133, 226, 244, 240, 200, 236, 49, 200, 136, 17, 71, 133, 225, 96, 74, 106, - 198, 165, 15, 141, 37, 196, 48, 142, 91, 32, 69, 183, 10, 227, 241, 46, - 208, 79, 14, 3, 130, 47, 8, 239, 181, 79, 147, 137, 240, 16, 106, 240, - 44, 76, 155, 140, 19, 252, 40, 123, 198, 111, 148, 20, 147, 61, 150, 33, - 48, 198, 217, 76, 140, 191, 100, 48, 150, 210, 29, 124, 163, 158, 64, 213, - 204, 62, 179, 180, 200, 70, 181, 158, 20, 227, 226, 174, 238, 181, 59, 53, - 159, 210, 26, 36, 237, 175, 207, 129, 17, 31, 29, 117, 63, 9, 54, 164, - 99, 210, 139, 201, 165, 59, 154, 2, 167, 25, 59, 59, 178, 166, 159, 39, - 155, 34, 117, 180, 50, 216, 146, 50, 140, 153, 136, 193, 170, 173, 106, 29, - 180, 89, 95, 213, 225, 43, 197, 66, 230, 211, 46, 119, 234, 197, 125, 5, - 161, 150, 216, 122, 128, 72, 187, 177, 211, 5, 255, 90, 113, 116, 139, 33, - 160, 211, 89, 28, 130, 158, 232, 13, 189, 174, 115, 11, 111, 51, 156, 192, - 156, 177, 116, 29, 233, 239, 1, 172, 142, 48, 114, 247, 52, 11, 15, 9, - 113, 233, 69, 211, 122, 75, 92, 183, 244, 182, 33, 28, 128, 77, 194, 207, - 48, 27, 20, 92, 214, 131, 169, 237, 244, 40, 142, 20, 119, 163, 229, 168, - 41, 225, 15, 42, 36, 112, 134, 241, 174, 238, 37, 202, 192, 93, 37, 166, - 25, 201, 1, 20, 132, 74, 242, 58, 173, 38, 238, 99, 230, 252, 107, 110, - 117, 31, 59, 17, 217, 149, 231, 220, 201, 108, 96, 138, 190, 244, 157, 155, - 136, 223, 184, 147, 238, 128, 39, 232, 137, 235, 108, 174, 147, 141, 228, 190, - 69, 71, 248, 56, 211, 63, 9, 117, 202, 29, 72, 234, 209, 176, 128, 113, - 39, 127, 113, 236, 200, 140, 33, 179, 121, 108, 42, 245, 100, 13, 79, 142, - 159, 132, 214, 176, 103, 47, 221, 145, 179, 152, 56, 203, 115, 121, 126, 45, - 179, 96, 239, 193, 115, 244, 13, 233, 119, 105, 89, 238, 86, 143, 160, 65, - 98, 18, 231, 44, 22, 98, 108, 129, 190, 33, 158, 27, 71, 18, 110, 166, - 8, 55, 186, 134, 40, 218, 19, 68, 193, 224, 138, 141, 200, 51, 238, 80, - 28, 168, 253, 32, 78, 221, 68, 52, 53, 61, 255, 130, 123, 231, 132, 154, - 236, 12, 183, 184, 88, 112, 180, 244, 185, 97, 24, 164, 116, 75, 228, 179, - 23, 192, 59, 202, 47, 70, 158, 19, 240, 198, 61, 174, 227, 255, 148, 217, - 221, 162, 216, 164, 89, 202, 210, 140, 57, 116, 7, 122, 126, 228, 188, 198, - 195, 34, 154, 120, 50, 86, 167, 64, 204, 17, 192, 60, 97, 5, 143, 223, - 0, 165, 55, 214, 189, 55, 64, 219, 227, 142, 176, 218, 248, 77, 174, 36, - 65, 170, 46, 133, 83, 101, 151, 99, 149, 93, 34, 52, 154, 197, 46, 42, - 44, 255, 228, 150, 253, 247, 191, 236, 201, 18, 63, 111, 59, 157, 155, 178, - 137, 191, 150, 157, 206, 176, 108, 126, 89, 88, 124, 64, 232, 166, 231, 8, - 16, 251, 44, 188, 48, 159, 126, 233, 61, 51, 138, 121, 182, 242, 130, 146, - 185, 22, 230, 62, 23, 21, 168, 237, 160, 231, 94, 122, 147, 2, 246, 179, - 81, 220, 103, 222, 151, 133, 87, 103, 159, 149, 77, 189, 84, 154, 157, 67, - 218, 217, 173, 190, 60, 223, 159, 21, 159, 25, 249, 156, 236, 128, 74, 133, - 31, 39, 214, 241, 48, 51, 87, 186, 64, 103, 57, 3, 107, 131, 234, 246, - 160, 130, 28, 86, 246, 170, 240, 153, 9, 245, 157, 24, 248, 251, 236, 51, - 75, 71, 128, 187, 115, 72, 48, 163, 4, 147, 18, 172, 40, 193, 130, 132, - 220, 15, 248, 202, 167, 163, 107, 183, 112, 118, 98, 32, 154, 199, 137, 73, - 159, 22, 125, 26, 232, 150, 7, 41, 38, 165, 152, 231, 92, 44, 56, 215, - 177, 161, 240, 93, 220, 207, 193, 157, 203, 38, 157, 184, 45, 230, 133, 31, - 160, 208, 30, 164, 24, 80, 178, 200, 74, 236, 7, 40, 34, 174, 77, 126, - 109, 201, 107, 171, 40, 38, 252, 126, 174, 184, 255, 42, 47, 79, 56, 235, - 228, 55, 248, 224, 79, 25, 182, 178, 160, 180, 78, 105, 152, 108, 83, 177, - 106, 167, 218, 99, 65, 123, 112, 88, 32, 250, 173, 18, 87, 86, 132, 124, - 21, 128, 212, 4, 85, 43, 246, 144, 98, 124, 86, 248, 228, 67, 210, 177, - 51, 163, 96, 174, 33, 174, 89, 88, 225, 19, 30, 127, 150, 131, 162, 68, - 8, 37, 101, 59, 148, 218, 16, 60, 133, 0, 75, 56, 13, 14, 79, 142, - 121, 70, 33, 92, 37, 10, 10, 129, 236, 17, 30, 26, 69, 30, 247, 158, - 116, 126, 1, 102, 137, 67, 149, 126, 162, 101, 70, 30, 186, 21, 132, 76, - 25, 78, 49, 105, 81, 214, 120, 186, 214, 43, 60, 192, 45, 214, 126, 85, - 201, 133, 147, 74, 117, 179, 100, 169, 32, 161, 155, 215, 189, 59, 12, 101, - 210, 243, 124, 203, 42, 252, 213, 4, 246, 206, 233, 53, 56, 185, 244, 110, - 113, 52, 224, 6, 174, 130, 17, 110, 177, 170, 73, 45, 93, 18, 188, 246, - 133, 239, 58, 119, 144, 253, 88, 86, 78, 65, 98, 94, 155, 49, 60, 182, - 159, 118, 35, 219, 121, 189, 124, 92, 15, 255, 132, 245, 240, 79, 119, 254, - 105, 155, 205, 218, 95, 224, 251, 131, 122, 189, 13, 2, 120, 52, 39, 159, - 229, 148, 11, 174, 64, 95, 105, 246, 7, 107, 45, 34, 132, 35, 255, 104, - 39, 205, 111, 56, 235, 227, 49, 195, 117, 19, 248, 159, 84, 144, 25, 172, - 252, 95, 249, 219, 143, 3, 179, 214, 80, 4, 0, 137, 212, 229, 27, 114, - 10, 188, 173, 11, 100, 124, 130, 158, 109, 234, 90, 75, 215, 218, 92, 227, - 38, 144, 162, 34, 3, 30, 110, 245, 146, 102, 18, 59, 176, 167, 108, 174, - 68, 198, 172, 92, 68, 87, 77, 90, 93, 76, 209, 147, 9, 153, 202, 120, - 138, 191, 153, 5, 73, 157, 185, 19, 200, 48, 200, 107, 100, 19, 198, 195, - 129, 36, 237, 250, 54, 161, 79, 198, 213, 112, 68, 133, 210, 183, 19, 9, - 223, 155, 120, 29, 239, 11, 137, 60, 41, 189, 1, 195, 128, 199, 245, 77, - 148, 153, 213, 63, 158, 24, 252, 3, 88, 218, 0, 249, 13, 180, 112, 186, - 36, 166, 38, 108, 243, 205, 90, 179, 122, 57, 246, 250, 229, 137, 123, 83, - 230, 229, 202, 124, 146, 148, 105, 146, 252, 94, 22, 183, 43, 130, 15, 167, - 56, 197, 102, 109, 247, 226, 181, 141, 59, 141, 142, 93, 62, 241, 185, 120, - 196, 122, 132, 82, 225, 131, 88, 64, 224, 215, 200, 108, 98, 116, 104, 37, - 216, 92, 39, 139, 239, 106, 74, 44, 234, 216, 196, 132, 132, 183, 174, 36, - 143, 228, 33, 113, 181, 171, 1, 49, 141, 156, 86, 90, 1, 113, 55, 58, - 60, 29, 24, 68, 149, 36, 76, 65, 98, 224, 159, 166, 149, 240, 114, 79, - 200, 82, 97, 216, 171, 218, 221, 250, 132, 84, 27, 54, 33, 115, 62, 114, - 145, 127, 128, 162, 160, 177, 209, 161, 126, 22, 13, 255, 93, 172, 255, 43, - 140, 252, 114, 204, 59, 252, 114, 86, 2, 32, 19, 145, 40, 173, 61, 205, - 94, 111, 242, 207, 9, 39, 60, 237, 159, 240, 252, 144, 182, 76, 1, 108, - 249, 44, 248, 99, 10, 18, 104, 141, 97, 34, 230, 228, 8, 18, 84, 238, - 184, 196, 206, 142, 67, 121, 145, 52, 131, 192, 149, 144, 34, 16, 188, 42, - 130, 208, 150, 187, 61, 117, 255, 40, 64, 47, 73, 138, 42, 144, 238, 126, - 159, 4, 161, 125, 250, 13, 155, 89, 129, 155, 35, 232, 43, 81, 116, 24, - 190, 215, 84, 5, 171, 149, 161, 7, 180, 19, 204, 218, 10, 34, 192, 118, - 20, 87, 38, 5, 150, 121, 151, 187, 196, 110, 66, 150, 124, 133, 25, 236, - 13, 195, 120, 206, 125, 23, 134, 180, 227, 123, 194, 108, 129, 24, 221, 175, - 34, 67, 87, 47, 178, 160, 254, 226, 214, 96, 34, 118, 31, 6, 158, 127, - 231, 185, 254, 12, 86, 187, 192, 99, 47, 221, 192, 187, 84, 162, 165, 132, - 71, 160, 202, 114, 148, 180, 62, 67, 91, 25, 224, 101, 53, 163, 173, 108, - 210, 190, 153, 142, 167, 136, 67, 144, 6, 11, 180, 210, 252, 44, 226, 118, - 181, 59, 166, 84, 22, 82, 130, 26, 145, 14, 248, 17, 251, 66, 182, 91, - 158, 180, 124, 193, 166, 147, 209, 114, 83, 108, 186, 13, 216, 67, 118, 92, - 252, 219, 12, 60, 148, 60, 175, 221, 128, 85, 166, 178, 112, 104, 13, 176, - 56, 231, 226, 241, 32, 246, 159, 196, 151, 155, 85, 115, 3, 248, 167, 156, - 145, 48, 235, 241, 216, 84, 159, 201, 217, 163, 15, 163, 41, 162, 79, 249, - 76, 208, 69, 80, 44, 241, 109, 233, 225, 97, 40, 144, 192, 200, 233, 142, - 112, 228, 116, 208, 64, 170, 181, 206, 141, 89, 190, 251, 43, 130, 125, 6, - 67, 102, 179, 5, 91, 221, 28, 152, 159, 127, 62, 60, 48, 191, 244, 174, - 247, 10, 55, 123, 195, 226, 135, 188, 166, 220, 37, 255, 172, 108, 84, 204, - 53, 187, 130, 5, 32, 159, 117, 184, 139, 108, 249, 202, 117, 103, 93, 229, - 94, 43, 13, 155, 253, 164, 99, 229, 81, 117, 150, 215, 162, 44, 161, 4, - 172, 208, 121, 40, 54, 164, 176, 26, 132, 225, 196, 246, 207, 240, 101, 12, - 202, 38, 254, 157, 163, 205, 153, 182, 90, 23, 195, 155, 134, 189, 64, 48, - 209, 139, 241, 36, 224, 251, 91, 54, 233, 172, 150, 111, 184, 35, 231, 173, - 161, 47, 13, 253, 214, 212, 151, 166, 62, 194, 125, 84, 103, 133, 113, 74, - 128, 79, 104, 19, 92, 101, 138, 235, 220, 109, 95, 134, 120, 45, 104, 183, - 102, 73, 187, 53, 138, 85, 171, 184, 102, 75, 37, 125, 9, 233, 75, 158, - 14, 244, 80, 91, 223, 236, 172, 206, 180, 219, 190, 174, 45, 251, 231, 200, - 96, 169, 114, 72, 212, 232, 71, 9, 82, 14, 141, 14, 212, 5, 4, 240, - 135, 101, 128, 210, 132, 101, 76, 68, 73, 209, 14, 113, 33, 130, 39, 174, - 176, 67, 163, 210, 209, 121, 57, 19, 159, 144, 26, 126, 104, 118, 120, 245, - 88, 58, 93, 216, 12, 11, 155, 89, 133, 45, 113, 235, 190, 188, 117, 172, - 176, 21, 22, 182, 178, 10, 219, 226, 206, 125, 113, 231, 88, 89, 59, 44, - 107, 103, 148, 197, 229, 44, 241, 242, 9, 166, 26, 58, 27, 254, 225, 138, - 124, 81, 193, 71, 39, 226, 2, 60, 198, 62, 180, 6, 254, 236, 34, 6, - 205, 14, 33, 178, 81, 151, 11, 171, 106, 25, 131, 236, 105, 19, 36, 52, - 246, 239, 36, 150, 248, 213, 20, 173, 27, 65, 189, 197, 172, 102, 193, 212, - 135, 235, 146, 14, 18, 11, 182, 20, 70, 86, 103, 229, 193, 219, 31, 150, - 77, 180, 57, 224, 228, 229, 144, 62, 39, 117, 197, 164, 40, 135, 242, 165, - 64, 70, 74, 18, 0, 118, 152, 225, 156, 25, 116, 243, 190, 136, 2, 215, - 88, 135, 193, 119, 35, 28, 242, 213, 112, 173, 142, 190, 104, 220, 29, 232, - 53, 26, 119, 81, 167, 134, 163, 132, 122, 27, 229, 19, 30, 237, 35, 84, - 14, 47, 49, 230, 27, 215, 44, 83, 76, 60, 180, 108, 212, 14, 162, 48, - 140, 192, 99, 198, 11, 4, 245, 235, 47, 127, 187, 77, 60, 131, 205, 117, - 215, 28, 223, 92, 147, 145, 22, 115, 120, 8, 115, 144, 11, 35, 236, 20, - 64, 146, 210, 79, 80, 111, 47, 35, 56, 234, 36, 112, 145, 114, 63, 215, - 165, 179, 129, 19, 99, 31, 126, 225, 25, 192, 137, 137, 191, 240, 120, 224, - 140, 117, 249, 153, 6, 124, 227, 169, 6, 59, 199, 28, 91, 228, 24, 34, - 199, 18, 57, 66, 3, 84, 248, 12, 239, 86, 211, 129, 0, 254, 76, 248, - 179, 224, 207, 78, 220, 25, 79, 12, 114, 252, 96, 7, 19, 168, 202, 80, - 65, 203, 240, 144, 228, 4, 143, 35, 246, 115, 63, 206, 144, 63, 159, 144, - 218, 30, 174, 38, 19, 186, 178, 232, 10, 74, 82, 193, 147, 179, 134, 110, - 159, 243, 146, 251, 216, 21, 5, 224, 66, 156, 95, 230, 159, 119, 12, 93, - 233, 137, 207, 12, 29, 106, 212, 161, 30, 120, 1, 80, 30, 110, 212, 45, - 224, 40, 43, 222, 69, 53, 5, 178, 100, 46, 43, 177, 232, 46, 72, 202, - 202, 106, 130, 172, 29, 143, 123, 194, 147, 17, 254, 130, 76, 249, 130, 118, - 120, 196, 31, 39, 51, 122, 68, 72, 197, 238, 6, 82, 209, 219, 63, 206, - 38, 60, 99, 54, 163, 12, 200, 231, 25, 112, 91, 51, 163, 87, 32, 217, - 82, 147, 27, 53, 76, 125, 47, 146, 218, 231, 250, 201, 153, 105, 40, 159, - 188, 50, 215, 67, 85, 19, 124, 22, 222, 195, 131, 56, 2, 224, 220, 129, - 142, 176, 10, 144, 122, 86, 63, 215, 241, 171, 118, 94, 220, 51, 91, 70, - 117, 230, 241, 238, 47, 16, 229, 65, 199, 192, 104, 66, 244, 251, 121, 219, - 160, 147, 21, 126, 81, 110, 195, 75, 9, 199, 11, 12, 99, 209, 221, 74, - 151, 155, 197, 253, 44, 138, 9, 124, 11, 10, 75, 125, 119, 113, 210, 73, - 130, 52, 93, 25, 82, 96, 133, 81, 101, 225, 155, 66, 142, 67, 175, 231, - 99, 135, 231, 143, 253, 62, 78, 48, 62, 86, 32, 11, 86, 152, 253, 220, - 41, 37, 209, 219, 132, 1, 195, 223, 30, 101, 100, 15, 102, 60, 190, 200, - 203, 240, 150, 249, 189, 83, 168, 96, 175, 35, 19, 204, 252, 253, 223, 160, - 34, 126, 22, 128, 247, 99, 14, 12, 156, 98, 53, 188, 48, 240, 233, 252, - 189, 78, 68, 10, 50, 66, 116, 145, 191, 199, 48, 136, 166, 195, 129, 161, - 51, 14, 98, 200, 167, 79, 191, 175, 159, 234, 190, 78, 53, 201, 41, 6, - 183, 77, 146, 196, 167, 148, 31, 191, 84, 10, 243, 87, 199, 205, 203, 69, - 62, 242, 127, 236, 99, 146, 25, 40, 199, 27, 175, 241, 212, 214, 27, 96, - 48, 54, 202, 121, 10, 123, 50, 113, 48, 136, 18, 143, 114, 70, 183, 152, - 244, 167, 99, 244, 48, 192, 229, 48, 151, 177, 109, 218, 184, 69, 11, 165, - 185, 140, 29, 218, 233, 20, 246, 153, 184, 61, 160, 109, 153, 47, 174, 116, - 245, 34, 107, 91, 182, 131, 217, 214, 134, 232, 4, 102, 202, 202, 51, 142, - 250, 96, 164, 109, 65, 51, 34, 71, 18, 218, 162, 122, 188, 118, 113, 129, - 129, 183, 226, 74, 174, 214, 38, 117, 153, 220, 184, 165, 140, 86, 227, 187, - 77, 83, 132, 137, 244, 243, 50, 76, 164, 127, 183, 130, 243, 209, 117, 245, - 209, 117, 245, 209, 117, 245, 113, 51, 175, 110, 230, 239, 60, 151, 129, 93, - 187, 59, 13, 177, 147, 226, 39, 48, 75, 88, 53, 22, 61, 151, 142, 95, - 110, 156, 121, 127, 248, 229, 117, 231, 244, 200, 104, 126, 255, 221, 236, 183, - 155, 227, 254, 31, 125, 212, 2, 11, 67, 245, 216, 27, 207, 128, 167, 205, - 119, 139, 34, 98, 103, 40, 18, 252, 112, 121, 225, 110, 179, 242, 146, 224, - 81, 245, 102, 132, 234, 208, 16, 10, 93, 102, 70, 135, 194, 104, 46, 93, - 67, 203, 25, 238, 10, 96, 11, 135, 14, 225, 227, 145, 23, 135, 197, 25, - 43, 213, 198, 149, 48, 186, 127, 122, 37, 164, 96, 206, 33, 34, 120, 32, - 174, 116, 245, 34, 211, 130, 57, 17, 4, 218, 210, 21, 37, 229, 123, 120, - 173, 40, 18, 224, 111, 17, 191, 12, 7, 97, 24, 253, 57, 22, 242, 89, - 252, 194, 232, 206, 68, 79, 1, 45, 149, 215, 124, 232, 3, 63, 26, 134, - 129, 155, 155, 24, 232, 180, 113, 215, 122, 107, 84, 236, 4, 144, 107, 50, - 162, 110, 34, 26, 208, 86, 52, 215, 147, 48, 32, 49, 190, 121, 217, 160, - 208, 246, 63, 108, 130, 58, 144, 232, 158, 60, 1, 198, 253, 130, 187, 101, - 142, 150, 52, 3, 32, 155, 63, 38, 229, 83, 55, 7, 89, 62, 72, 137, - 115, 230, 173, 42, 200, 232, 229, 160, 171, 138, 10, 62, 177, 37, 212, 181, - 109, 37, 13, 119, 98, 161, 174, 101, 8, 188, 4, 205, 11, 100, 212, 97, - 231, 70, 230, 183, 48, 96, 221, 75, 60, 88, 5, 81, 68, 254, 108, 135, - 191, 94, 76, 150, 106, 44, 113, 220, 139, 210, 211, 241, 104, 20, 48, 61, - 212, 99, 247, 132, 250, 58, 233, 154, 19, 55, 52, 78, 233, 172, 119, 0, - 87, 69, 86, 124, 73, 234, 167, 123, 90, 39, 61, 224, 193, 243, 118, 59, - 154, 102, 221, 48, 62, 15, 188, 65, 167, 222, 171, 181, 236, 118, 179, 221, - 178, 26, 109, 195, 238, 181, 46, 90, 23, 253, 214, 197, 192, 185, 48, 155, - 141, 230, 192, 217, 178, 166, 253, 65, 198, 54, 166, 153, 173, 78, 13, 66, - 214, 178, 73, 129, 89, 138, 89, 174, 82, 120, 92, 211, 126, 202, 62, 224, - 183, 197, 100, 224, 24, 184, 106, 208, 193, 147, 122, 248, 99, 133, 117, 54, - 114, 97, 12, 53, 12, 34, 71, 219, 140, 210, 1, 238, 193, 181, 3, 60, - 53, 170, 196, 140, 115, 28, 17, 144, 173, 159, 11, 160, 234, 206, 202, 187, - 40, 104, 141, 231, 29, 147, 204, 112, 154, 165, 130, 214, 42, 107, 205, 226, - 158, 118, 80, 133, 244, 178, 89, 44, 10, 140, 28, 164, 126, 110, 174, 89, - 207, 119, 157, 43, 121, 164, 84, 71, 208, 27, 202, 90, 235, 225, 47, 214, - 85, 158, 93, 51, 43, 116, 136, 142, 72, 62, 214, 96, 9, 23, 72, 195, - 3, 65, 208, 79, 157, 62, 55, 148, 193, 253, 80, 137, 31, 124, 185, 183, - 51, 224, 44, 221, 219, 165, 124, 16, 116, 123, 153, 132, 230, 71, 60, 70, - 206, 74, 51, 13, 108, 164, 12, 62, 65, 230, 195, 21, 84, 227, 145, 179, - 31, 106, 210, 194, 32, 113, 121, 152, 121, 87, 176, 88, 248, 30, 188, 212, - 168, 82, 232, 62, 37, 24, 118, 94, 15, 67, 251, 53, 224, 17, 11, 218, - 65, 201, 44, 202, 235, 156, 26, 147, 206, 228, 42, 178, 168, 254, 118, 51, - 71, 70, 162, 42, 21, 19, 15, 35, 226, 102, 208, 45, 227, 97, 51, 246, - 240, 189, 225, 142, 27, 21, 213, 158, 220, 54, 70, 104, 65, 23, 125, 82, - 229, 197, 35, 115, 199, 44, 167, 238, 8, 131, 151, 92, 208, 196, 130, 9, - 93, 48, 81, 22, 204, 124, 14, 13, 176, 225, 111, 211, 139, 84, 3, 5, - 179, 3, 120, 32, 164, 157, 132, 112, 69, 41, 235, 175, 10, 67, 189, 144, - 33, 125, 154, 42, 117, 24, 142, 57, 181, 110, 3, 26, 114, 65, 79, 205, - 29, 187, 246, 98, 185, 102, 100, 170, 198, 108, 108, 151, 46, 246, 138, 79, - 213, 15, 221, 204, 44, 108, 65, 97, 53, 104, 54, 91, 221, 136, 136, 202, - 89, 212, 118, 72, 45, 34, 124, 223, 77, 94, 67, 114, 88, 183, 237, 1, - 195, 232, 227, 123, 182, 8, 198, 236, 77, 232, 92, 161, 106, 173, 49, 82, - 34, 190, 176, 138, 46, 250, 148, 164, 28, 11, 250, 13, 183, 249, 153, 149, - 214, 163, 74, 107, 15, 86, 105, 35, 170, 180, 254, 64, 85, 54, 163, 42, - 201, 122, 48, 179, 90, 223, 30, 72, 123, 63, 205, 190, 251, 38, 145, 60, - 230, 207, 66, 175, 212, 80, 42, 243, 103, 97, 40, 70, 61, 157, 148, 105, - 41, 131, 200, 11, 184, 130, 199, 220, 86, 209, 57, 78, 181, 100, 225, 59, - 166, 56, 13, 151, 69, 27, 217, 203, 240, 134, 165, 246, 81, 45, 240, 168, - 22, 248, 219, 170, 5, 30, 183, 247, 159, 234, 89, 125, 163, 106, 25, 85, - 163, 157, 45, 92, 42, 12, 48, 220, 104, 147, 51, 96, 23, 26, 57, 192, - 225, 74, 27, 110, 123, 157, 23, 200, 84, 217, 76, 115, 227, 182, 57, 113, - 139, 172, 205, 179, 130, 134, 26, 3, 66, 189, 11, 3, 53, 10, 227, 153, - 161, 225, 181, 19, 155, 53, 220, 22, 147, 23, 114, 124, 15, 91, 171, 39, - 53, 189, 60, 255, 20, 246, 221, 10, 35, 111, 165, 21, 194, 115, 127, 122, - 133, 131, 142, 192, 218, 147, 214, 145, 9, 216, 116, 68, 31, 74, 27, 111, - 155, 149, 230, 246, 240, 92, 6, 157, 245, 86, 236, 204, 157, 86, 200, 15, - 54, 175, 39, 233, 128, 93, 205, 132, 253, 78, 102, 60, 194, 228, 190, 63, - 101, 226, 147, 10, 28, 182, 67, 116, 193, 163, 41, 110, 237, 112, 56, 133, - 246, 235, 201, 93, 228, 116, 10, 67, 87, 244, 109, 70, 112, 141, 133, 127, - 13, 115, 47, 158, 255, 8, 54, 251, 200, 44, 31, 220, 51, 181, 158, 109, - 251, 173, 224, 204, 242, 93, 98, 61, 27, 91, 54, 22, 199, 201, 172, 237, - 134, 43, 155, 44, 36, 111, 145, 1, 42, 107, 214, 31, 30, 85, 214, 172, - 63, 8, 172, 236, 206, 136, 178, 119, 129, 201, 114, 102, 146, 148, 222, 5, - 86, 70, 76, 124, 143, 167, 109, 177, 116, 191, 219, 75, 254, 212, 189, 92, - 140, 156, 208, 57, 69, 197, 16, 124, 37, 209, 57, 112, 220, 11, 87, 197, - 242, 148, 86, 29, 26, 234, 168, 63, 139, 174, 55, 86, 153, 6, 187, 77, - 29, 105, 30, 187, 211, 177, 59, 247, 227, 182, 148, 117, 149, 159, 115, 16, - 157, 216, 138, 83, 127, 180, 115, 255, 7, 176, 157, 6, 57, 196, 167, 34, - 109, 165, 71, 249, 110, 214, 238, 210, 20, 61, 238, 246, 94, 226, 126, 239, - 21, 116, 124, 79, 250, 187, 63, 239, 0, 155, 168, 27, 101, 13, 241, 172, - 69, 20, 233, 48, 32, 170, 140, 206, 170, 153, 79, 57, 70, 30, 153, 115, - 73, 203, 246, 45, 17, 37, 54, 76, 211, 205, 188, 33, 241, 192, 25, 44, - 226, 123, 183, 15, 47, 35, 1, 87, 117, 77, 137, 113, 212, 170, 68, 90, - 150, 57, 66, 114, 82, 181, 19, 98, 201, 227, 156, 250, 91, 207, 169, 13, - 8, 80, 117, 138, 92, 215, 202, 152, 79, 137, 33, 145, 161, 87, 47, 141, - 164, 210, 2, 149, 233, 20, 129, 221, 92, 147, 118, 144, 44, 169, 6, 99, - 231, 22, 218, 90, 54, 247, 217, 132, 255, 52, 246, 115, 120, 100, 81, 192, - 117, 195, 208, 89, 169, 52, 121, 222, 105, 233, 132, 87, 224, 248, 151, 133, - 137, 94, 38, 153, 26, 191, 76, 241, 187, 184, 159, 251, 85, 205, 46, 139, - 12, 113, 126, 9, 217, 184, 87, 40, 252, 82, 152, 233, 191, 10, 131, 79, - 179, 200, 202, 204, 43, 126, 176, 184, 53, 210, 224, 0, 27, 162, 139, 214, - 12, 194, 198, 76, 116, 252, 81, 204, 21, 243, 66, 163, 171, 234, 134, 227, - 170, 220, 13, 179, 99, 227, 204, 76, 118, 93, 198, 204, 252, 193, 241, 97, - 159, 3, 47, 249, 134, 126, 232, 226, 91, 157, 112, 63, 150, 223, 123, 209, - 193, 154, 157, 56, 141, 250, 233, 206, 220, 44, 127, 217, 44, 167, 179, 104, - 143, 71, 46, 101, 127, 31, 252, 34, 209, 75, 67, 207, 31, 197, 193, 175, - 16, 137, 168, 123, 131, 233, 122, 252, 114, 183, 192, 137, 143, 177, 184, 62, - 49, 190, 245, 187, 160, 175, 162, 81, 177, 85, 12, 136, 72, 233, 172, 103, - 47, 189, 46, 167, 135, 216, 230, 200, 232, 209, 125, 51, 230, 124, 23, 254, - 123, 222, 59, 224, 219, 232, 207, 157, 241, 108, 159, 209, 174, 25, 143, 253, - 5, 73, 42, 143, 15, 122, 218, 71, 59, 147, 1, 109, 159, 245, 84, 138, - 178, 92, 151, 20, 177, 122, 144, 138, 57, 107, 181, 219, 113, 133, 4, 18, - 101, 1, 95, 37, 120, 5, 87, 26, 39, 107, 171, 183, 18, 234, 13, 78, - 182, 67, 125, 164, 185, 78, 86, 103, 154, 181, 120, 117, 68, 181, 67, 109, - 155, 77, 19, 14, 125, 169, 250, 77, 184, 198, 150, 241, 228, 113, 123, 228, - 190, 44, 66, 30, 100, 107, 27, 213, 55, 139, 164, 55, 110, 154, 38, 82, - 101, 111, 37, 221, 252, 136, 199, 8, 150, 202, 10, 136, 102, 48, 189, 9, - 226, 238, 191, 86, 172, 221, 156, 240, 141, 55, 152, 195, 192, 222, 129, 50, - 140, 120, 184, 157, 246, 61, 110, 210, 191, 190, 27, 239, 158, 83, 198, 15, - 127, 200, 58, 38, 85, 89, 156, 235, 30, 59, 139, 32, 240, 28, 52, 219, - 249, 110, 226, 129, 252, 128, 220, 239, 157, 51, 154, 243, 136, 119, 238, 108, - 70, 198, 163, 39, 83, 47, 8, 166, 147, 187, 116, 75, 97, 206, 107, 10, - 253, 22, 190, 113, 181, 53, 234, 18, 24, 195, 112, 54, 17, 207, 182, 110, - 90, 25, 35, 38, 99, 136, 214, 118, 30, 162, 39, 129, 187, 24, 76, 203, - 240, 232, 75, 246, 210, 155, 15, 93, 63, 178, 80, 73, 216, 207, 126, 23, - 184, 220, 158, 102, 49, 166, 30, 15, 61, 5, 47, 28, 180, 134, 127, 92, - 209, 62, 249, 21, 205, 166, 19, 136, 172, 21, 45, 198, 239, 213, 69, 45, - 55, 170, 164, 96, 86, 153, 196, 106, 11, 42, 172, 143, 49, 13, 43, 4, - 191, 64, 223, 214, 83, 10, 114, 8, 91, 211, 30, 126, 213, 240, 18, 109, - 75, 208, 28, 166, 241, 52, 87, 146, 214, 27, 85, 10, 132, 88, 210, 236, - 146, 166, 40, 196, 114, 206, 224, 151, 69, 48, 231, 224, 50, 1, 7, 200, - 50, 215, 186, 18, 72, 202, 180, 254, 251, 95, 205, 180, 241, 163, 182, 142, - 140, 104, 216, 25, 84, 122, 107, 229, 38, 48, 77, 93, 108, 8, 153, 126, - 152, 77, 209, 42, 179, 129, 70, 13, 232, 129, 13, 21, 64, 122, 72, 168, - 210, 133, 100, 72, 101, 67, 170, 45, 168, 20, 34, 73, 131, 36, 104, 182, - 81, 67, 224, 186, 9, 218, 156, 212, 80, 43, 215, 147, 143, 167, 153, 117, - 120, 242, 179, 114, 67, 47, 219, 231, 12, 126, 212, 244, 178, 69, 63, 200, - 54, 5, 251, 161, 198, 173, 88, 228, 147, 35, 140, 216, 117, 36, 29, 68, - 232, 215, 28, 221, 162, 197, 146, 161, 37, 33, 13, 26, 208, 214, 53, 144, - 57, 173, 167, 132, 134, 45, 252, 193, 177, 128, 101, 169, 30, 226, 148, 98, - 226, 123, 155, 17, 63, 184, 68, 118, 0, 41, 186, 41, 32, 121, 50, 215, - 251, 141, 114, 72, 124, 180, 100, 136, 34, 135, 36, 98, 252, 192, 222, 205, - 221, 73, 223, 27, 9, 221, 33, 191, 144, 167, 74, 242, 42, 75, 176, 206, - 56, 168, 73, 250, 38, 108, 194, 9, 179, 19, 171, 228, 70, 75, 73, 101, - 121, 140, 173, 252, 143, 140, 238, 211, 103, 116, 155, 69, 247, 112, 216, 145, - 197, 139, 252, 77, 70, 47, 156, 193, 32, 107, 201, 56, 78, 136, 241, 192, - 92, 21, 133, 121, 156, 91, 41, 171, 46, 168, 168, 150, 153, 106, 163, 11, - 40, 242, 128, 62, 27, 6, 215, 168, 20, 164, 96, 152, 234, 110, 64, 204, - 197, 212, 204, 216, 172, 162, 139, 30, 32, 61, 7, 143, 134, 142, 223, 159, - 58, 98, 242, 245, 197, 149, 174, 94, 100, 77, 61, 144, 20, 38, 164, 47, - 167, 3, 75, 124, 181, 13, 66, 169, 141, 133, 12, 154, 222, 112, 201, 141, - 29, 249, 83, 16, 139, 96, 108, 176, 147, 41, 135, 160, 33, 187, 230, 148, - 209, 105, 36, 236, 109, 40, 98, 166, 203, 240, 131, 72, 69, 140, 74, 30, - 69, 158, 186, 100, 110, 200, 33, 188, 80, 243, 243, 175, 217, 156, 164, 151, - 175, 120, 4, 228, 244, 225, 228, 139, 1, 218, 173, 56, 163, 43, 181, 65, - 233, 138, 165, 193, 112, 140, 72, 140, 242, 68, 35, 165, 1, 114, 138, 52, - 227, 121, 162, 67, 227, 56, 132, 32, 80, 233, 226, 47, 162, 6, 182, 225, - 102, 82, 211, 44, 139, 232, 104, 102, 206, 213, 202, 171, 106, 217, 71, 16, - 158, 127, 14, 87, 51, 171, 102, 51, 195, 71, 227, 46, 211, 255, 87, 50, - 246, 247, 133, 63, 29, 83, 32, 165, 144, 45, 112, 99, 110, 12, 246, 13, - 181, 143, 189, 254, 20, 255, 38, 100, 197, 255, 108, 75, 12, 17, 97, 235, - 13, 131, 204, 11, 230, 254, 146, 192, 19, 43, 83, 255, 178, 58, 153, 14, - 220, 170, 85, 55, 154, 45, 206, 109, 251, 33, 15, 218, 229, 180, 4, 154, - 128, 49, 159, 186, 210, 200, 150, 141, 157, 219, 220, 77, 7, 205, 54, 135, - 29, 244, 141, 231, 102, 202, 104, 148, 170, 98, 11, 235, 13, 41, 226, 212, - 152, 251, 235, 130, 100, 164, 74, 100, 195, 138, 167, 186, 194, 253, 4, 196, - 199, 61, 123, 141, 248, 184, 81, 108, 82, 68, 240, 241, 124, 70, 192, 133, - 84, 143, 79, 138, 26, 60, 93, 17, 174, 159, 38, 8, 168, 157, 142, 128, - 193, 245, 114, 229, 255, 230, 74, 123, 220, 112, 215, 96, 242, 151, 201, 248, - 143, 118, 46, 178, 79, 102, 49, 168, 68, 38, 65, 125, 80, 148, 68, 25, - 212, 38, 241, 17, 33, 93, 117, 45, 2, 117, 221, 112, 120, 147, 228, 216, - 27, 151, 132, 176, 199, 179, 86, 4, 108, 7, 65, 184, 162, 209, 138, 136, - 199, 38, 112, 92, 251, 34, 175, 235, 69, 89, 250, 166, 12, 121, 71, 133, - 9, 205, 160, 79, 5, 251, 232, 74, 254, 33, 165, 192, 19, 12, 252, 14, - 34, 231, 108, 152, 151, 70, 138, 243, 56, 90, 121, 186, 244, 42, 47, 91, - 59, 16, 12, 190, 96, 194, 172, 88, 186, 126, 81, 26, 124, 4, 28, 212, - 70, 77, 231, 148, 37, 137, 64, 86, 176, 120, 86, 144, 149, 247, 102, 49, - 154, 123, 101, 153, 31, 97, 243, 124, 143, 93, 25, 3, 132, 149, 77, 50, - 245, 252, 59, 138, 216, 85, 248, 218, 65, 196, 36, 172, 245, 141, 11, 155, - 120, 228, 79, 184, 0, 176, 194, 187, 209, 244, 134, 103, 0, 243, 89, 50, - 158, 248, 213, 53, 170, 173, 68, 78, 116, 35, 19, 38, 56, 15, 133, 55, - 157, 192, 11, 59, 113, 70, 24, 37, 140, 21, 42, 151, 179, 17, 170, 68, - 186, 23, 222, 200, 245, 38, 202, 102, 222, 2, 134, 126, 191, 18, 252, 161, - 231, 83, 92, 214, 123, 98, 33, 33, 86, 80, 168, 204, 38, 151, 217, 101, - 238, 13, 128, 244, 50, 114, 12, 17, 97, 224, 84, 143, 166, 48, 4, 156, - 131, 70, 143, 1, 54, 230, 215, 133, 215, 191, 130, 87, 39, 199, 22, 140, - 119, 57, 86, 40, 24, 26, 131, 86, 142, 248, 56, 137, 98, 161, 113, 199, - 20, 17, 14, 14, 157, 146, 48, 142, 56, 177, 43, 238, 133, 244, 175, 111, - 233, 162, 183, 128, 5, 99, 130, 33, 215, 208, 161, 7, 110, 54, 197, 153, - 143, 101, 40, 226, 24, 83, 134, 49, 187, 241, 38, 3, 32, 66, 69, 15, - 90, 63, 207, 153, 51, 32, 29, 19, 159, 176, 125, 148, 60, 166, 35, 190, - 20, 4, 81, 67, 126, 192, 40, 110, 203, 233, 226, 11, 223, 165, 249, 169, - 51, 247, 22, 214, 12, 188, 69, 186, 242, 103, 72, 233, 243, 26, 97, 40, - 195, 182, 6, 134, 29, 228, 193, 40, 234, 185, 220, 152, 233, 194, 245, 49, - 171, 135, 170, 89, 104, 47, 214, 51, 68, 201, 39, 152, 94, 204, 97, 229, - 116, 43, 177, 176, 122, 175, 46, 176, 70, 114, 196, 130, 247, 192, 2, 216, - 193, 4, 23, 24, 79, 238, 198, 155, 15, 169, 48, 191, 7, 121, 115, 125, - 7, 77, 96, 208, 182, 194, 209, 251, 211, 215, 165, 255, 43, 114, 55, 47, - 124, 222, 190, 236, 205, 120, 79, 226, 97, 155, 115, 137, 106, 50, 104, 201, - 120, 138, 78, 237, 242, 1, 212, 206, 96, 3, 247, 130, 130, 71, 17, 35, - 152, 46, 130, 209, 50, 234, 159, 247, 83, 168, 29, 13, 145, 113, 170, 196, - 203, 233, 209, 125, 197, 91, 132, 137, 230, 206, 149, 23, 199, 156, 30, 200, - 134, 81, 101, 25, 224, 89, 71, 84, 249, 145, 168, 248, 132, 55, 168, 35, - 202, 163, 222, 88, 17, 84, 81, 112, 20, 16, 175, 220, 249, 235, 26, 141, - 121, 11, 177, 229, 59, 85, 19, 167, 41, 239, 228, 157, 182, 97, 74, 132, - 12, 22, 134, 98, 114, 78, 160, 158, 13, 159, 254, 98, 138, 19, 2, 199, - 155, 32, 100, 222, 100, 195, 40, 162, 183, 225, 76, 240, 57, 162, 225, 36, - 45, 90, 158, 37, 194, 46, 194, 237, 81, 140, 130, 215, 183, 192, 176, 133, - 212, 45, 228, 250, 215, 247, 93, 20, 43, 96, 182, 77, 128, 197, 101, 12, - 114, 86, 128, 148, 49, 244, 63, 12, 17, 28, 212, 1, 29, 47, 194, 16, - 47, 86, 146, 119, 32, 33, 44, 125, 11, 40, 127, 229, 46, 145, 224, 71, - 126, 141, 114, 190, 147, 184, 203, 192, 5, 190, 5, 237, 72, 70, 78, 220, - 165, 218, 19, 186, 118, 38, 203, 27, 114, 81, 35, 223, 163, 25, 12, 169, - 128, 238, 18, 178, 55, 234, 70, 124, 239, 169, 59, 188, 161, 186, 161, 180, - 59, 194, 170, 116, 81, 119, 128, 121, 52, 75, 28, 223, 71, 54, 181, 152, - 85, 161, 227, 249, 237, 127, 155, 66, 149, 180, 196, 122, 147, 234, 116, 145, - 110, 54, 21, 28, 39, 107, 134, 140, 119, 223, 188, 250, 250, 125, 41, 76, - 195, 155, 81, 253, 252, 150, 212, 213, 156, 227, 193, 171, 199, 187, 192, 148, - 194, 251, 196, 111, 240, 45, 127, 244, 119, 39, 47, 142, 190, 162, 90, 22, - 36, 22, 6, 244, 148, 238, 45, 48, 145, 217, 20, 125, 164, 6, 178, 7, - 60, 119, 52, 200, 172, 226, 253, 139, 67, 170, 0, 150, 99, 116, 105, 133, - 49, 133, 216, 8, 1, 127, 54, 132, 145, 9, 50, 139, 29, 190, 56, 250, - 54, 186, 187, 124, 125, 120, 247, 17, 78, 176, 248, 219, 5, 30, 234, 102, - 223, 253, 228, 197, 241, 87, 236, 59, 254, 6, 189, 9, 142, 198, 0, 71, - 1, 61, 127, 95, 108, 243, 54, 23, 124, 249, 175, 31, 222, 138, 251, 223, - 163, 232, 41, 21, 65, 155, 48, 63, 168, 34, 159, 14, 68, 39, 9, 225, - 140, 158, 58, 85, 50, 26, 13, 47, 99, 173, 149, 211, 17, 247, 157, 119, - 20, 58, 138, 181, 115, 199, 66, 188, 165, 62, 242, 195, 96, 123, 145, 175, - 222, 29, 133, 131, 236, 223, 114, 104, 97, 250, 219, 247, 95, 137, 103, 222, - 188, 40, 221, 201, 94, 119, 220, 205, 252, 4, 139, 80, 223, 65, 163, 73, - 88, 77, 198, 176, 184, 193, 125, 240, 244, 68, 4, 117, 157, 192, 26, 70, - 108, 107, 65, 220, 46, 146, 2, 104, 218, 110, 219, 96, 40, 32, 193, 95, - 4, 98, 225, 62, 82, 121, 222, 9, 143, 124, 179, 21, 237, 216, 170, 25, - 28, 237, 24, 197, 137, 50, 36, 150, 85, 214, 249, 23, 120, 152, 54, 170, - 166, 85, 53, 154, 25, 154, 169, 44, 65, 155, 137, 240, 104, 121, 140, 143, - 198, 195, 163, 225, 103, 163, 179, 206, 231, 222, 118, 96, 47, 133, 193, 21, - 39, 24, 48, 77, 138, 171, 157, 21, 218, 178, 160, 98, 29, 79, 147, 116, - 142, 145, 105, 212, 90, 176, 224, 173, 49, 124, 97, 254, 236, 56, 191, 250, - 143, 221, 254, 207, 58, 15, 157, 122, 30, 238, 9, 56, 206, 141, 214, 238, - 116, 202, 166, 64, 220, 107, 61, 233, 220, 136, 159, 237, 39, 157, 225, 154, - 161, 43, 66, 87, 76, 246, 46, 95, 208, 59, 156, 3, 103, 229, 104, 104, - 177, 3, 155, 15, 220, 51, 97, 91, 115, 208, 176, 238, 140, 139, 172, 102, - 199, 128, 45, 31, 110, 168, 38, 227, 10, 212, 95, 203, 35, 31, 235, 172, - 110, 209, 65, 143, 112, 117, 2, 103, 236, 22, 206, 190, 208, 32, 249, 139, - 115, 253, 11, 16, 112, 191, 32, 203, 156, 226, 26, 161, 89, 23, 243, 46, - 164, 240, 130, 177, 106, 81, 159, 13, 131, 239, 194, 241, 70, 88, 19, 237, - 161, 112, 147, 167, 18, 197, 75, 156, 173, 180, 39, 208, 74, 66, 86, 85, - 50, 172, 68, 11, 235, 191, 183, 133, 245, 88, 11, 173, 93, 90, 104, 197, - 75, 36, 91, 8, 59, 169, 94, 207, 245, 19, 13, 108, 196, 27, 200, 83, - 248, 65, 13, 83, 75, 153, 155, 110, 46, 8, 98, 196, 234, 173, 229, 6, - 254, 45, 122, 10, 206, 23, 248, 130, 163, 65, 139, 91, 250, 159, 73, 141, - 26, 13, 69, 50, 81, 84, 251, 58, 118, 37, 242, 196, 157, 214, 220, 227, - 246, 234, 204, 40, 175, 180, 183, 120, 75, 62, 30, 45, 196, 53, 139, 43, - 99, 159, 71, 94, 184, 240, 18, 202, 246, 90, 135, 79, 216, 227, 70, 251, - 101, 97, 76, 109, 29, 144, 125, 118, 162, 108, 41, 171, 112, 20, 239, 5, - 181, 6, 136, 197, 139, 14, 203, 81, 141, 178, 62, 91, 198, 28, 228, 7, - 84, 103, 228, 173, 108, 213, 27, 122, 75, 0, 62, 137, 0, 161, 164, 56, - 152, 224, 76, 212, 120, 103, 33, 112, 32, 239, 181, 50, 29, 185, 44, 216, - 207, 43, 205, 252, 121, 13, 159, 22, 125, 218, 248, 137, 227, 153, 127, 215, - 197, 119, 131, 190, 13, 252, 88, 221, 64, 99, 135, 107, 162, 230, 117, 253, - 188, 222, 196, 55, 34, 53, 193, 102, 254, 65, 48, 194, 89, 62, 195, 111, - 167, 76, 252, 254, 121, 194, 152, 115, 13, 131, 197, 233, 141, 128, 221, 234, - 249, 194, 81, 124, 27, 64, 114, 190, 59, 40, 230, 63, 242, 129, 202, 80, - 146, 251, 145, 99, 123, 38, 211, 176, 49, 58, 118, 106, 82, 123, 17, 233, - 19, 2, 161, 189, 240, 93, 217, 11, 122, 252, 50, 203, 210, 52, 133, 35, - 133, 166, 4, 42, 20, 68, 150, 167, 141, 21, 63, 26, 18, 58, 139, 4, - 180, 241, 27, 12, 42, 171, 90, 133, 84, 133, 182, 1, 77, 10, 72, 177, - 152, 149, 247, 17, 219, 140, 8, 214, 67, 221, 104, 79, 92, 119, 0, 226, - 217, 205, 20, 196, 51, 212, 110, 224, 50, 124, 51, 245, 175, 40, 168, 58, - 172, 84, 203, 10, 144, 131, 124, 77, 170, 85, 78, 195, 198, 11, 88, 170, - 122, 169, 157, 184, 46, 48, 183, 65, 142, 8, 219, 50, 159, 206, 68, 33, - 228, 248, 176, 87, 148, 34, 213, 12, 33, 110, 72, 48, 116, 162, 45, 110, - 76, 62, 5, 41, 215, 193, 168, 231, 176, 213, 190, 113, 150, 172, 128, 160, - 250, 229, 129, 135, 32, 136, 48, 138, 176, 157, 23, 88, 140, 228, 218, 201, - 220, 243, 165, 16, 207, 94, 204, 69, 226, 64, 15, 219, 129, 219, 224, 75, - 119, 78, 130, 63, 134, 148, 159, 187, 20, 113, 93, 110, 181, 121, 201, 223, - 47, 224, 60, 4, 152, 68, 163, 106, 100, 185, 176, 68, 227, 51, 82, 140, - 174, 112, 36, 106, 79, 8, 46, 22, 167, 166, 205, 128, 195, 30, 32, 100, - 65, 9, 248, 19, 205, 141, 160, 131, 184, 12, 7, 28, 158, 129, 146, 49, - 106, 250, 153, 6, 179, 192, 191, 62, 131, 241, 121, 30, 199, 241, 148, 231, - 244, 149, 92, 24, 7, 43, 166, 117, 173, 112, 28, 242, 208, 74, 253, 172, - 108, 211, 41, 53, 94, 194, 148, 111, 201, 235, 136, 57, 226, 153, 180, 194, - 42, 17, 185, 162, 132, 223, 108, 143, 64, 206, 227, 16, 24, 72, 142, 174, - 47, 38, 139, 98, 156, 74, 44, 116, 86, 198, 98, 185, 82, 104, 218, 46, - 160, 82, 185, 13, 1, 1, 7, 113, 116, 129, 14, 199, 188, 128, 122, 120, - 64, 172, 138, 140, 141, 74, 192, 166, 154, 185, 215, 50, 120, 80, 214, 6, - 7, 136, 13, 81, 94, 251, 24, 33, 172, 101, 145, 157, 130, 180, 144, 175, - 136, 158, 197, 235, 97, 112, 205, 13, 24, 152, 39, 145, 54, 162, 211, 58, - 19, 18, 237, 120, 34, 186, 182, 135, 39, 120, 206, 217, 7, 67, 57, 201, - 67, 155, 8, 129, 195, 158, 147, 26, 219, 52, 15, 66, 96, 132, 216, 187, - 39, 107, 192, 219, 20, 123, 35, 69, 206, 145, 128, 174, 23, 12, 174, 119, - 147, 96, 113, 106, 66, 74, 29, 251, 215, 217, 165, 69, 65, 32, 184, 74, - 120, 135, 227, 39, 245, 228, 145, 6, 15, 158, 197, 112, 36, 64, 201, 87, - 191, 11, 92, 191, 252, 146, 171, 156, 66, 71, 65, 96, 22, 63, 196, 156, - 3, 33, 65, 6, 203, 124, 231, 206, 60, 7, 191, 167, 228, 249, 163, 186, - 4, 146, 102, 134, 248, 17, 238, 35, 226, 39, 94, 166, 158, 127, 139, 11, - 90, 48, 15, 21, 213, 168, 108, 94, 244, 200, 233, 232, 181, 51, 233, 255, - 54, 85, 249, 53, 53, 212, 191, 198, 135, 245, 8, 159, 64, 233, 248, 157, - 14, 222, 50, 209, 154, 22, 7, 244, 188, 82, 197, 38, 231, 20, 110, 154, - 22, 7, 25, 27, 167, 200, 7, 87, 90, 109, 73, 120, 69, 37, 180, 40, - 42, 155, 201, 140, 238, 14, 100, 32, 84, 47, 199, 104, 106, 54, 16, 232, - 201, 147, 73, 219, 79, 144, 153, 245, 150, 110, 218, 77, 221, 108, 181, 227, - 148, 53, 24, 200, 49, 74, 11, 118, 35, 102, 27, 38, 147, 213, 138, 83, - 214, 83, 148, 209, 153, 104, 156, 178, 177, 51, 101, 115, 103, 202, 214, 206, - 148, 143, 135, 167, 159, 234, 225, 233, 102, 147, 16, 149, 149, 210, 122, 140, - 106, 185, 208, 212, 131, 159, 43, 198, 109, 169, 40, 24, 165, 177, 206, 21, - 180, 85, 187, 92, 182, 214, 69, 60, 147, 172, 33, 152, 29, 247, 44, 97, - 33, 184, 246, 242, 183, 254, 173, 18, 192, 18, 182, 41, 5, 170, 232, 131, - 250, 25, 142, 178, 88, 164, 75, 26, 132, 198, 135, 228, 103, 130, 208, 166, - 26, 107, 48, 173, 204, 186, 110, 194, 132, 53, 219, 13, 221, 170, 213, 176, - 106, 67, 111, 97, 122, 27, 38, 102, 77, 183, 108, 188, 93, 29, 73, 155, - 64, 85, 67, 181, 64, 88, 99, 242, 175, 200, 1, 139, 161, 102, 187, 222, - 254, 0, 15, 69, 127, 50, 19, 159, 22, 55, 61, 248, 176, 53, 221, 14, - 227, 98, 138, 213, 48, 12, 92, 73, 109, 108, 96, 79, 197, 75, 152, 178, - 253, 13, 190, 187, 139, 213, 166, 228, 89, 137, 188, 122, 100, 45, 71, 242, - 80, 44, 179, 17, 222, 177, 73, 181, 202, 70, 69, 107, 253, 16, 93, 102, - 47, 42, 236, 182, 122, 19, 54, 53, 17, 90, 101, 116, 246, 1, 127, 69, - 142, 71, 73, 123, 68, 68, 96, 16, 6, 122, 206, 140, 19, 139, 199, 205, - 94, 146, 55, 155, 208, 169, 131, 78, 91, 125, 48, 214, 155, 143, 107, 197, - 145, 41, 59, 131, 73, 48, 45, 99, 144, 104, 33, 21, 56, 112, 141, 2, - 115, 87, 28, 150, 233, 89, 137, 89, 70, 62, 105, 64, 4, 117, 97, 111, - 167, 156, 88, 36, 189, 92, 222, 165, 217, 92, 210, 190, 70, 26, 206, 156, - 186, 151, 20, 91, 46, 10, 41, 213, 162, 197, 70, 197, 58, 156, 142, 92, - 159, 250, 24, 79, 39, 157, 153, 10, 234, 171, 154, 54, 111, 96, 175, 178, - 79, 74, 209, 14, 75, 57, 20, 254, 171, 20, 123, 153, 14, 235, 201, 23, - 146, 97, 12, 49, 25, 119, 224, 229, 227, 72, 161, 141, 85, 119, 226, 140, - 93, 216, 6, 4, 93, 130, 1, 235, 172, 2, 152, 12, 255, 253, 111, 64, - 113, 135, 145, 33, 201, 28, 140, 192, 193, 161, 168, 67, 82, 111, 252, 220, - 180, 90, 159, 127, 238, 189, 57, 128, 239, 181, 140, 91, 20, 43, 21, 233, - 64, 120, 236, 11, 114, 108, 231, 241, 112, 69, 56, 35, 84, 101, 200, 185, - 54, 170, 132, 123, 20, 179, 164, 33, 144, 155, 211, 159, 195, 86, 228, 67, - 89, 123, 190, 206, 77, 110, 58, 136, 19, 229, 220, 130, 244, 196, 67, 95, - 220, 236, 105, 72, 129, 104, 115, 147, 97, 50, 115, 24, 101, 150, 184, 165, - 197, 228, 70, 215, 38, 67, 17, 154, 153, 12, 85, 147, 166, 174, 21, 166, - 163, 210, 172, 132, 240, 100, 20, 43, 170, 221, 174, 32, 94, 90, 113, 253, - 148, 158, 139, 207, 206, 92, 128, 182, 255, 214, 237, 25, 191, 132, 109, 76, - 248, 171, 130, 216, 91, 226, 138, 71, 181, 188, 150, 134, 184, 56, 233, 163, - 72, 194, 58, 153, 49, 51, 216, 79, 40, 123, 22, 185, 243, 32, 69, 155, - 184, 23, 73, 249, 60, 106, 20, 149, 226, 117, 192, 131, 98, 82, 103, 149, - 63, 233, 156, 221, 190, 209, 151, 111, 206, 247, 189, 194, 103, 112, 171, 147, - 98, 217, 204, 11, 52, 1, 251, 0, 166, 248, 1, 218, 63, 219, 123, 193, - 175, 62, 236, 250, 236, 226, 58, 50, 13, 206, 108, 0, 231, 199, 130, 175, - 210, 54, 232, 45, 188, 234, 55, 124, 52, 188, 205, 149, 113, 51, 21, 96, - 228, 227, 68, 52, 100, 61, 127, 112, 246, 11, 30, 101, 194, 68, 89, 20, - 76, 27, 24, 184, 85, 47, 234, 11, 156, 102, 149, 38, 253, 168, 212, 224, - 103, 187, 120, 158, 207, 69, 252, 27, 95, 85, 24, 52, 89, 139, 61, 156, - 112, 142, 196, 129, 161, 198, 194, 146, 219, 31, 110, 50, 35, 71, 218, 154, - 244, 57, 32, 204, 139, 113, 77, 135, 45, 21, 54, 70, 211, 139, 25, 2, - 136, 122, 185, 56, 193, 132, 208, 232, 180, 201, 56, 207, 228, 219, 203, 199, - 157, 37, 55, 177, 183, 12, 7, 210, 172, 185, 135, 44, 188, 38, 45, 137, - 174, 42, 124, 99, 13, 219, 55, 238, 163, 169, 54, 44, 186, 235, 38, 118, - 252, 142, 20, 25, 60, 125, 114, 153, 52, 164, 145, 237, 35, 117, 71, 95, - 16, 233, 219, 73, 178, 249, 181, 184, 119, 66, 225, 116, 236, 78, 16, 205, - 128, 176, 114, 6, 211, 113, 89, 176, 64, 50, 106, 65, 72, 132, 72, 247, - 34, 108, 63, 222, 205, 166, 243, 0, 79, 103, 222, 43, 48, 42, 32, 71, - 134, 69, 104, 137, 193, 19, 246, 137, 144, 30, 69, 65, 158, 191, 43, 91, - 85, 117, 84, 199, 163, 105, 15, 150, 132, 75, 9, 170, 48, 11, 1, 104, - 55, 69, 199, 146, 171, 205, 75, 160, 234, 167, 252, 151, 218, 41, 208, 136, - 151, 30, 76, 125, 127, 16, 150, 59, 94, 120, 3, 55, 107, 7, 150, 213, - 66, 52, 9, 13, 8, 204, 38, 224, 38, 20, 14, 218, 84, 160, 101, 120, - 120, 158, 58, 132, 5, 97, 114, 201, 205, 2, 200, 234, 183, 224, 86, 128, - 91, 204, 22, 62, 26, 91, 12, 138, 216, 159, 116, 44, 47, 7, 89, 100, - 233, 114, 137, 77, 33, 213, 85, 236, 200, 222, 25, 93, 194, 197, 124, 56, - 230, 183, 188, 246, 252, 249, 194, 225, 198, 18, 80, 79, 144, 165, 181, 18, - 26, 71, 177, 178, 190, 4, 41, 105, 236, 17, 138, 111, 135, 117, 239, 183, - 211, 76, 198, 46, 67, 43, 12, 26, 62, 130, 185, 145, 53, 6, 206, 212, - 59, 67, 152, 189, 113, 174, 92, 50, 176, 127, 9, 179, 110, 50, 160, 65, - 37, 26, 39, 76, 45, 20, 144, 218, 180, 189, 172, 24, 142, 170, 13, 62, - 169, 98, 107, 41, 3, 91, 33, 82, 240, 2, 42, 218, 18, 7, 239, 216, - 5, 223, 246, 238, 135, 231, 47, 57, 192, 153, 177, 219, 163, 139, 182, 15, - 185, 67, 26, 31, 155, 145, 232, 242, 187, 222, 3, 12, 221, 137, 24, 235, - 219, 231, 199, 87, 232, 152, 70, 103, 237, 167, 56, 179, 239, 70, 84, 137, - 136, 229, 61, 174, 149, 238, 67, 167, 51, 69, 51, 62, 163, 176, 120, 240, - 142, 36, 168, 86, 97, 118, 27, 85, 222, 48, 146, 66, 220, 59, 247, 114, - 140, 28, 100, 83, 9, 43, 93, 34, 186, 5, 71, 249, 42, 12, 220, 203, - 164, 232, 25, 3, 249, 226, 5, 78, 113, 73, 74, 161, 31, 103, 132, 49, - 141, 139, 158, 155, 162, 86, 112, 184, 231, 119, 238, 232, 130, 43, 132, 2, - 183, 47, 49, 97, 126, 119, 112, 60, 67, 136, 160, 168, 179, 17, 204, 46, - 31, 37, 249, 212, 174, 64, 73, 25, 165, 44, 33, 31, 20, 5, 158, 12, - 192, 222, 241, 235, 158, 19, 204, 61, 119, 194, 190, 6, 238, 226, 46, 127, - 103, 56, 222, 22, 129, 35, 103, 225, 215, 221, 189, 160, 193, 202, 220, 221, - 78, 164, 237, 225, 198, 153, 36, 143, 237, 85, 42, 139, 62, 247, 10, 131, - 45, 95, 30, 163, 2, 229, 181, 39, 207, 45, 46, 117, 220, 56, 254, 68, - 37, 205, 191, 80, 78, 46, 136, 237, 42, 19, 31, 4, 104, 54, 246, 130, - 128, 47, 209, 144, 74, 38, 11, 49, 158, 77, 178, 75, 94, 96, 69, 133, - 128, 77, 29, 12, 80, 183, 245, 198, 226, 168, 133, 223, 144, 183, 224, 190, - 55, 4, 137, 100, 151, 94, 164, 29, 42, 218, 24, 175, 234, 180, 149, 220, - 161, 204, 134, 62, 116, 125, 31, 154, 181, 177, 215, 196, 146, 185, 235, 99, - 108, 234, 176, 240, 46, 31, 209, 69, 216, 55, 176, 45, 224, 207, 217, 229, - 18, 184, 102, 214, 63, 88, 235, 112, 227, 162, 153, 95, 154, 207, 180, 39, - 120, 52, 63, 192, 147, 107, 199, 191, 252, 153, 153, 165, 39, 79, 240, 200, - 250, 185, 206, 13, 21, 64, 106, 196, 236, 115, 12, 17, 43, 251, 170, 195, - 59, 6, 74, 27, 104, 63, 1, 69, 227, 187, 52, 42, 34, 137, 207, 215, - 176, 71, 136, 167, 200, 89, 206, 251, 248, 9, 136, 254, 216, 4, 161, 80, - 144, 149, 27, 207, 16, 94, 108, 220, 135, 235, 40, 83, 159, 68, 181, 201, - 141, 140, 208, 67, 72, 77, 199, 19, 58, 145, 246, 199, 103, 86, 89, 40, - 48, 206, 228, 125, 119, 219, 60, 86, 82, 187, 199, 55, 101, 111, 124, 208, - 168, 101, 239, 27, 35, 244, 107, 44, 198, 247, 139, 161, 174, 164, 34, 247, - 145, 88, 12, 183, 55, 176, 42, 239, 21, 204, 178, 102, 61, 37, 211, 147, - 138, 28, 51, 185, 46, 133, 251, 187, 114, 151, 253, 233, 212, 31, 96, 47, - 148, 77, 210, 167, 157, 9, 10, 120, 208, 17, 58, 2, 244, 160, 102, 31, - 113, 198, 87, 109, 4, 99, 211, 181, 248, 91, 70, 200, 108, 218, 148, 77, - 220, 155, 174, 172, 156, 58, 70, 212, 87, 226, 45, 138, 170, 69, 212, 52, - 144, 223, 196, 185, 88, 174, 84, 62, 83, 138, 158, 179, 136, 80, 130, 142, - 91, 49, 156, 118, 91, 199, 83, 54, 174, 187, 62, 79, 6, 235, 53, 99, - 129, 122, 169, 29, 220, 2, 32, 124, 80, 216, 229, 93, 156, 133, 87, 231, - 44, 31, 6, 166, 42, 155, 122, 225, 85, 145, 194, 125, 193, 77, 8, 179, - 81, 63, 35, 157, 159, 142, 129, 179, 94, 229, 177, 98, 165, 36, 89, 26, - 84, 194, 101, 38, 84, 125, 153, 164, 98, 20, 167, 125, 103, 154, 28, 54, - 114, 43, 165, 203, 31, 185, 139, 112, 111, 156, 199, 13, 170, 137, 43, 240, - 139, 231, 112, 71, 24, 139, 184, 251, 46, 156, 234, 199, 37, 163, 98, 235, - 135, 240, 217, 192, 22, 168, 219, 100, 84, 4, 192, 230, 147, 182, 152, 43, - 49, 90, 131, 18, 5, 160, 195, 16, 103, 175, 206, 240, 129, 188, 243, 82, - 231, 140, 189, 42, 124, 150, 23, 237, 200, 23, 97, 163, 124, 142, 85, 225, - 177, 155, 190, 42, 99, 17, 86, 13, 93, 98, 71, 241, 151, 177, 135, 39, - 135, 37, 102, 34, 92, 150, 249, 148, 246, 229, 38, 240, 131, 9, 169, 223, - 114, 241, 35, 69, 157, 14, 255, 88, 34, 56, 51, 108, 68, 73, 1, 18, - 190, 86, 190, 139, 254, 37, 122, 205, 241, 59, 14, 188, 96, 142, 35, 57, - 202, 71, 12, 247, 240, 162, 108, 230, 220, 95, 227, 37, 12, 38, 123, 37, - 145, 46, 34, 75, 199, 199, 43, 15, 51, 157, 69, 204, 14, 42, 41, 226, - 61, 149, 74, 42, 40, 195, 199, 222, 48, 112, 169, 35, 162, 231, 149, 39, - 187, 21, 190, 17, 129, 61, 125, 172, 156, 142, 10, 157, 86, 181, 190, 198, - 98, 225, 25, 41, 105, 24, 98, 116, 57, 57, 201, 132, 246, 67, 225, 229, - 235, 191, 101, 119, 222, 46, 187, 189, 203, 206, 74, 232, 96, 214, 127, 84, - 247, 194, 68, 163, 26, 195, 201, 20, 12, 195, 159, 138, 238, 185, 197, 143, - 188, 121, 160, 0, 201, 220, 213, 250, 9, 26, 106, 236, 14, 60, 216, 117, - 39, 170, 192, 226, 145, 82, 29, 214, 3, 153, 25, 123, 29, 127, 211, 81, - 253, 39, 189, 6, 106, 109, 186, 169, 37, 16, 23, 200, 78, 40, 62, 152, - 129, 45, 43, 119, 60, 67, 101, 25, 176, 89, 2, 230, 139, 188, 199, 208, - 110, 82, 184, 144, 213, 12, 146, 7, 240, 65, 110, 223, 196, 227, 68, 88, - 76, 232, 220, 8, 144, 236, 204, 211, 23, 176, 43, 65, 109, 167, 173, 107, - 141, 98, 177, 138, 28, 124, 81, 64, 141, 165, 85, 183, 116, 173, 89, 164, - 157, 42, 38, 159, 231, 115, 252, 68, 2, 158, 196, 153, 16, 174, 190, 45, - 44, 24, 134, 129, 199, 141, 49, 248, 169, 4, 161, 41, 212, 113, 229, 2, - 209, 14, 177, 18, 74, 50, 135, 107, 233, 114, 82, 75, 199, 27, 25, 169, - 231, 164, 250, 206, 136, 107, 236, 226, 125, 17, 14, 171, 88, 170, 50, 182, - 112, 101, 81, 164, 33, 45, 20, 103, 34, 33, 70, 83, 200, 233, 180, 44, - 23, 55, 166, 200, 247, 97, 223, 51, 7, 1, 111, 193, 131, 153, 119, 152, - 185, 207, 254, 23, 215, 133, 168, 96, 94, 55, 139, 79, 58, 175, 18, 137, - 20, 219, 51, 69, 105, 100, 211, 230, 115, 98, 117, 143, 222, 80, 25, 86, - 210, 240, 32, 232, 162, 79, 217, 216, 27, 244, 208, 155, 21, 143, 124, 171, - 134, 118, 238, 66, 199, 2, 111, 11, 241, 24, 86, 242, 233, 105, 169, 243, - 84, 43, 63, 16, 222, 138, 73, 101, 103, 36, 30, 202, 57, 27, 215, 107, - 102, 107, 63, 19, 226, 163, 180, 38, 36, 145, 6, 5, 250, 237, 10, 214, - 68, 13, 170, 78, 147, 155, 191, 144, 179, 165, 42, 216, 37, 132, 28, 236, - 68, 98, 86, 60, 216, 7, 145, 192, 210, 29, 158, 164, 69, 29, 108, 73, - 137, 74, 30, 33, 164, 237, 40, 65, 198, 15, 240, 16, 32, 88, 71, 162, - 34, 234, 253, 37, 239, 164, 22, 227, 57, 0, 121, 112, 112, 94, 6, 5, - 128, 92, 24, 175, 138, 219, 134, 119, 197, 155, 74, 41, 46, 172, 1, 138, - 75, 21, 52, 233, 110, 71, 170, 24, 72, 191, 163, 30, 11, 109, 164, 226, - 253, 164, 28, 133, 36, 114, 46, 60, 209, 150, 120, 122, 110, 146, 172, 161, - 197, 15, 76, 56, 163, 87, 243, 244, 216, 48, 144, 111, 36, 87, 10, 220, - 145, 219, 23, 199, 139, 103, 82, 154, 227, 54, 165, 225, 89, 44, 154, 64, - 1, 155, 248, 37, 113, 179, 136, 92, 149, 64, 217, 85, 162, 141, 74, 79, - 192, 224, 185, 138, 141, 71, 222, 217, 127, 84, 239, 200, 177, 22, 167, 254, - 93, 175, 150, 201, 247, 186, 107, 207, 166, 186, 97, 39, 125, 254, 137, 63, - 157, 57, 151, 60, 248, 67, 182, 50, 63, 91, 125, 159, 97, 99, 26, 87, - 219, 244, 14, 184, 155, 41, 3, 233, 157, 0, 152, 72, 179, 23, 51, 74, - 66, 221, 174, 32, 146, 10, 165, 149, 84, 40, 9, 173, 125, 73, 182, 52, - 242, 162, 149, 199, 159, 156, 34, 159, 164, 255, 74, 181, 189, 20, 103, 3, - 91, 107, 201, 46, 151, 214, 68, 135, 173, 85, 221, 99, 61, 174, 211, 35, - 67, 216, 65, 49, 126, 4, 177, 165, 9, 89, 55, 253, 115, 30, 40, 117, - 76, 18, 176, 23, 209, 107, 40, 228, 255, 53, 113, 195, 243, 145, 247, 55, - 83, 241, 228, 120, 49, 196, 144, 188, 225, 37, 106, 215, 148, 43, 244, 223, - 8, 175, 222, 121, 183, 202, 133, 139, 30, 193, 225, 229, 87, 228, 244, 22, - 94, 190, 245, 38, 74, 193, 247, 42, 101, 216, 18, 180, 48, 97, 162, 183, - 169, 201, 155, 50, 185, 58, 116, 39, 27, 227, 44, 40, 188, 138, 81, 223, - 138, 137, 179, 213, 54, 25, 93, 133, 102, 254, 180, 231, 244, 96, 102, 162, - 113, 50, 158, 140, 112, 214, 71, 238, 167, 163, 17, 105, 36, 185, 138, 135, - 188, 66, 249, 124, 224, 214, 203, 220, 49, 117, 38, 221, 138, 200, 235, 204, - 189, 136, 121, 123, 97, 12, 194, 232, 125, 83, 129, 142, 56, 145, 73, 234, - 173, 128, 43, 160, 125, 19, 170, 98, 19, 53, 136, 177, 179, 161, 180, 244, - 31, 98, 133, 30, 217, 71, 223, 160, 191, 149, 18, 139, 160, 152, 168, 45, - 99, 196, 137, 154, 35, 87, 228, 75, 113, 122, 55, 80, 111, 116, 1, 69, - 132, 158, 39, 238, 248, 11, 93, 250, 3, 215, 44, 242, 131, 129, 48, 3, - 173, 244, 203, 236, 229, 148, 252, 129, 125, 52, 130, 158, 79, 167, 192, 10, - 251, 67, 217, 95, 130, 65, 233, 232, 10, 236, 5, 202, 187, 128, 2, 78, - 191, 79, 135, 93, 236, 73, 162, 66, 140, 60, 123, 141, 25, 162, 239, 227, - 15, 37, 186, 211, 193, 115, 31, 87, 180, 31, 135, 93, 192, 135, 29, 229, - 86, 185, 32, 37, 60, 139, 225, 126, 30, 247, 93, 30, 58, 215, 244, 150, - 29, 54, 154, 242, 254, 158, 94, 68, 126, 6, 108, 236, 142, 167, 32, 38, - 70, 237, 217, 205, 134, 251, 1, 131, 24, 162, 63, 217, 46, 129, 12, 27, - 205, 63, 84, 121, 255, 222, 27, 195, 132, 228, 137, 48, 102, 60, 225, 40, - 125, 127, 205, 189, 93, 53, 219, 217, 97, 13, 147, 107, 153, 84, 6, 147, - 110, 54, 10, 139, 192, 183, 251, 152, 198, 167, 45, 58, 154, 161, 217, 3, - 55, 75, 87, 147, 80, 208, 230, 70, 233, 50, 245, 60, 84, 77, 25, 107, - 69, 115, 128, 134, 95, 215, 49, 77, 2, 227, 33, 246, 162, 36, 161, 219, - 68, 115, 13, 10, 30, 40, 245, 90, 198, 121, 210, 142, 157, 27, 161, 243, - 120, 124, 17, 198, 26, 42, 178, 208, 69, 103, 194, 109, 52, 162, 253, 32, - 200, 172, 186, 140, 50, 232, 21, 140, 226, 129, 7, 107, 247, 154, 182, 90, - 168, 115, 162, 202, 64, 172, 193, 93, 66, 143, 64, 236, 84, 11, 118, 177, - 103, 34, 147, 11, 233, 163, 100, 80, 75, 141, 243, 208, 146, 128, 172, 241, - 35, 113, 4, 184, 78, 167, 28, 154, 189, 9, 167, 38, 89, 0, 51, 13, - 37, 207, 146, 121, 152, 161, 22, 194, 254, 184, 62, 131, 46, 78, 103, 213, - 214, 210, 5, 128, 178, 172, 80, 35, 104, 127, 254, 57, 74, 66, 7, 216, - 68, 46, 139, 65, 199, 140, 189, 219, 8, 100, 165, 208, 168, 215, 237, 6, - 121, 49, 1, 159, 231, 133, 160, 129, 64, 63, 152, 230, 188, 55, 29, 88, - 215, 133, 161, 9, 136, 137, 111, 14, 72, 175, 218, 233, 80, 72, 74, 239, - 13, 227, 218, 118, 47, 88, 75, 135, 90, 145, 1, 111, 32, 87, 74, 132, - 15, 164, 168, 21, 184, 247, 8, 205, 111, 228, 246, 65, 177, 218, 71, 85, - 147, 134, 181, 226, 35, 112, 231, 19, 121, 95, 26, 110, 124, 183, 95, 17, - 13, 125, 142, 237, 124, 74, 182, 52, 194, 31, 34, 116, 167, 64, 35, 24, - 38, 91, 250, 92, 105, 104, 178, 89, 216, 213, 188, 97, 108, 167, 134, 133, - 145, 54, 240, 45, 161, 211, 69, 48, 5, 33, 112, 4, 131, 139, 149, 244, - 73, 180, 7, 65, 53, 229, 29, 226, 34, 119, 7, 72, 77, 64, 13, 181, - 17, 154, 141, 81, 158, 56, 103, 137, 80, 59, 57, 64, 53, 93, 186, 3, - 1, 163, 23, 93, 102, 217, 141, 252, 181, 0, 181, 187, 64, 239, 197, 235, - 73, 34, 216, 254, 14, 112, 222, 71, 131, 236, 79, 222, 32, 59, 26, 211, - 187, 225, 70, 69, 230, 186, 217, 246, 186, 61, 140, 171, 27, 85, 202, 89, - 71, 77, 184, 54, 215, 215, 172, 154, 13, 229, 103, 201, 0, 173, 53, 125, - 165, 213, 159, 174, 9, 149, 73, 122, 252, 200, 13, 101, 26, 206, 59, 53, - 33, 55, 195, 121, 71, 207, 153, 129, 214, 244, 213, 4, 150, 170, 107, 129, - 208, 237, 242, 11, 93, 249, 157, 53, 223, 55, 68, 255, 78, 195, 126, 95, - 132, 8, 113, 113, 35, 147, 12, 116, 226, 29, 131, 154, 213, 83, 216, 205, - 137, 128, 214, 91, 3, 145, 161, 137, 112, 45, 19, 4, 84, 101, 18, 181, - 20, 151, 144, 150, 31, 138, 181, 49, 112, 36, 92, 207, 98, 150, 39, 95, - 163, 96, 205, 183, 67, 1, 124, 143, 167, 215, 206, 232, 62, 108, 101, 67, - 223, 242, 141, 71, 47, 132, 223, 219, 212, 159, 4, 61, 72, 180, 177, 48, - 221, 100, 109, 18, 81, 253, 155, 135, 137, 142, 195, 146, 146, 249, 138, 218, - 51, 210, 244, 72, 6, 26, 143, 193, 56, 199, 57, 111, 25, 149, 82, 113, - 131, 154, 221, 97, 193, 95, 239, 188, 122, 108, 222, 85, 98, 220, 247, 242, - 139, 40, 240, 123, 228, 106, 245, 210, 11, 80, 222, 71, 38, 118, 107, 86, - 234, 248, 101, 225, 135, 253, 24, 192, 237, 239, 194, 222, 249, 54, 229, 245, - 18, 132, 176, 111, 49, 30, 101, 122, 255, 113, 47, 174, 111, 192, 70, 4, - 49, 168, 205, 122, 6, 215, 119, 37, 191, 203, 93, 132, 32, 22, 102, 13, - 79, 16, 42, 232, 203, 102, 23, 215, 57, 191, 179, 210, 46, 246, 208, 27, - 187, 132, 214, 223, 185, 164, 111, 127, 166, 25, 61, 244, 78, 16, 79, 134, - 4, 110, 9, 209, 34, 161, 143, 246, 43, 201, 61, 5, 95, 89, 110, 134, - 29, 225, 165, 158, 195, 205, 4, 135, 98, 174, 49, 31, 163, 209, 24, 123, - 218, 197, 250, 169, 30, 253, 34, 131, 235, 112, 183, 212, 60, 0, 201, 84, - 169, 62, 231, 140, 97, 202, 207, 59, 43, 100, 165, 37, 205, 42, 42, 230, - 41, 117, 92, 162, 124, 182, 152, 16, 80, 33, 252, 164, 131, 89, 216, 7, - 136, 136, 78, 124, 113, 225, 142, 175, 4, 70, 141, 209, 33, 77, 29, 59, - 67, 67, 8, 3, 252, 174, 173, 115, 7, 29, 106, 23, 158, 18, 61, 141, - 172, 177, 169, 37, 185, 152, 103, 46, 138, 196, 61, 146, 139, 109, 246, 156, - 190, 155, 136, 181, 200, 165, 217, 208, 113, 231, 57, 60, 128, 56, 218, 227, - 103, 212, 140, 110, 212, 216, 195, 112, 233, 210, 75, 7, 159, 178, 211, 129, - 109, 215, 38, 74, 202, 197, 74, 73, 179, 27, 245, 160, 118, 35, 109, 254, - 147, 75, 105, 100, 42, 3, 29, 103, 102, 190, 151, 141, 35, 100, 219, 11, - 194, 149, 157, 222, 81, 143, 55, 177, 141, 59, 90, 178, 97, 236, 134, 91, - 60, 150, 110, 37, 65, 51, 170, 32, 24, 166, 33, 78, 212, 225, 117, 160, - 27, 178, 129, 126, 200, 252, 53, 73, 165, 118, 0, 143, 83, 226, 232, 227, - 124, 79, 137, 224, 229, 32, 69, 148, 48, 197, 126, 170, 74, 19, 137, 231, - 159, 208, 238, 15, 117, 223, 133, 1, 2, 52, 77, 138, 58, 142, 100, 60, - 101, 42, 234, 48, 120, 11, 26, 124, 20, 145, 12, 55, 183, 34, 71, 57, - 88, 82, 137, 98, 138, 239, 180, 240, 144, 20, 176, 96, 18, 101, 200, 42, - 147, 49, 8, 12, 83, 69, 246, 64, 215, 101, 164, 27, 163, 158, 151, 207, - 170, 64, 17, 96, 146, 170, 246, 175, 97, 108, 92, 45, 67, 100, 1, 146, - 104, 46, 40, 173, 43, 182, 49, 225, 85, 202, 151, 249, 221, 220, 23, 134, - 165, 119, 122, 40, 253, 107, 48, 72, 45, 84, 233, 96, 60, 127, 221, 126, - 232, 113, 33, 251, 84, 247, 41, 245, 170, 189, 33, 108, 115, 56, 104, 119, - 219, 166, 112, 245, 85, 174, 228, 222, 206, 96, 9, 237, 222, 46, 25, 72, - 110, 76, 181, 39, 168, 145, 29, 193, 1, 134, 21, 235, 63, 233, 212, 116, - 79, 207, 157, 98, 44, 49, 175, 112, 91, 50, 245, 37, 1, 63, 99, 240, - 177, 194, 173, 184, 216, 207, 157, 46, 121, 190, 190, 36, 51, 134, 116, 62, - 138, 145, 167, 183, 31, 44, 86, 98, 167, 75, 12, 90, 118, 28, 175, 209, - 84, 75, 96, 192, 179, 227, 120, 141, 233, 124, 172, 241, 152, 215, 120, 76, - 53, 30, 198, 107, 180, 212, 18, 22, 148, 56, 140, 215, 152, 206, 199, 26, - 15, 121, 141, 135, 84, 35, 38, 152, 110, 185, 14, 9, 104, 78, 113, 58, - 209, 143, 39, 250, 225, 164, 248, 33, 191, 210, 128, 135, 230, 247, 115, 92, - 120, 55, 120, 12, 182, 211, 201, 65, 7, 154, 245, 249, 231, 12, 127, 29, - 78, 244, 156, 172, 222, 46, 210, 227, 87, 39, 251, 232, 190, 209, 57, 93, - 86, 49, 19, 138, 28, 3, 225, 41, 21, 57, 206, 42, 114, 28, 22, 57, - 230, 69, 212, 204, 195, 48, 243, 16, 50, 139, 69, 106, 13, 6, 122, 139, - 222, 165, 13, 239, 50, 118, 220, 237, 57, 120, 8, 238, 57, 107, 50, 126, - 227, 134, 114, 30, 239, 135, 178, 124, 181, 121, 122, 253, 158, 236, 29, 30, - 136, 14, 82, 75, 161, 77, 225, 200, 65, 29, 155, 231, 76, 8, 182, 99, - 232, 123, 147, 43, 24, 71, 168, 174, 196, 85, 197, 115, 66, 212, 227, 220, - 47, 50, 86, 164, 60, 28, 134, 213, 231, 233, 154, 67, 100, 36, 246, 200, - 118, 185, 190, 222, 176, 153, 77, 177, 229, 141, 123, 217, 104, 46, 100, 108, - 101, 95, 77, 174, 216, 15, 78, 32, 130, 139, 99, 163, 111, 224, 74, 87, - 47, 54, 238, 98, 177, 44, 18, 72, 148, 65, 21, 127, 33, 230, 104, 2, - 50, 17, 58, 143, 212, 148, 173, 71, 58, 60, 155, 157, 220, 164, 238, 4, - 185, 83, 224, 220, 75, 158, 95, 220, 120, 1, 250, 236, 4, 210, 101, 7, - 1, 145, 232, 164, 197, 11, 88, 48, 119, 103, 106, 11, 17, 125, 233, 197, - 104, 196, 254, 133, 91, 125, 140, 135, 49, 219, 20, 86, 71, 185, 31, 43, - 228, 191, 123, 219, 167, 91, 206, 167, 12, 122, 86, 30, 197, 224, 97, 206, - 148, 106, 202, 232, 141, 109, 39, 123, 174, 159, 25, 103, 60, 177, 175, 15, - 105, 113, 251, 14, 12, 122, 42, 125, 176, 148, 18, 137, 64, 90, 81, 245, - 211, 139, 121, 60, 40, 96, 197, 74, 134, 87, 191, 163, 149, 176, 210, 99, - 4, 122, 5, 241, 95, 174, 137, 111, 97, 60, 10, 231, 52, 4, 24, 236, - 171, 191, 133, 94, 35, 44, 245, 198, 9, 16, 2, 228, 141, 51, 89, 200, - 40, 76, 241, 126, 138, 119, 244, 251, 41, 139, 117, 111, 48, 2, 177, 206, - 151, 248, 193, 208, 128, 192, 101, 95, 36, 42, 251, 98, 183, 48, 80, 111, - 179, 70, 96, 34, 8, 20, 16, 197, 70, 49, 70, 99, 111, 212, 98, 249, - 111, 93, 92, 122, 123, 83, 127, 56, 157, 14, 202, 25, 58, 209, 122, 66, - 61, 128, 55, 230, 113, 38, 179, 168, 173, 164, 54, 225, 254, 11, 41, 1, - 112, 29, 77, 199, 222, 143, 219, 33, 235, 141, 122, 70, 60, 93, 121, 107, - 229, 204, 206, 32, 233, 102, 129, 208, 173, 48, 224, 7, 136, 3, 188, 224, - 160, 79, 2, 213, 106, 224, 5, 125, 12, 213, 53, 157, 68, 7, 117, 119, - 30, 210, 153, 198, 231, 243, 78, 219, 172, 241, 197, 90, 50, 154, 221, 214, - 106, 40, 48, 19, 177, 53, 42, 60, 58, 8, 103, 163, 209, 249, 200, 154, - 166, 160, 55, 89, 132, 120, 115, 54, 157, 3, 41, 145, 115, 37, 142, 24, - 180, 136, 53, 12, 93, 171, 233, 90, 93, 215, 26, 176, 93, 49, 9, 178, - 200, 54, 116, 58, 135, 210, 121, 88, 82, 51, 9, 97, 144, 114, 131, 182, - 244, 134, 14, 59, 157, 154, 12, 246, 35, 239, 220, 164, 67, 163, 173, 228, - 220, 120, 133, 79, 147, 110, 112, 51, 166, 83, 48, 152, 206, 166, 165, 84, - 100, 211, 35, 164, 234, 210, 90, 186, 214, 214, 97, 163, 3, 127, 220, 179, - 216, 200, 101, 235, 64, 249, 187, 61, 81, 2, 255, 204, 212, 184, 63, 179, - 59, 194, 254, 36, 248, 185, 29, 87, 108, 165, 39, 83, 35, 165, 115, 124, - 140, 248, 243, 255, 169, 148, 110, 19, 163, 73, 197, 198, 80, 6, 28, 76, - 252, 217, 223, 50, 222, 79, 114, 70, 108, 148, 177, 102, 119, 68, 251, 17, - 243, 237, 100, 234, 195, 244, 134, 183, 164, 76, 188, 238, 76, 36, 198, 102, - 160, 146, 154, 57, 21, 201, 22, 88, 58, 117, 38, 34, 221, 167, 233, 184, - 47, 103, 168, 176, 182, 82, 110, 156, 105, 196, 145, 152, 131, 176, 186, 147, - 23, 124, 56, 46, 161, 152, 106, 85, 35, 37, 28, 14, 34, 217, 52, 219, - 186, 245, 56, 139, 255, 46, 179, 152, 43, 141, 255, 215, 25, 59, 253, 218, - 213, 71, 106, 140, 121, 8, 241, 13, 198, 43, 169, 129, 188, 219, 218, 94, - 234, 49, 235, 41, 124, 18, 226, 195, 192, 187, 70, 15, 125, 194, 247, 136, - 92, 217, 84, 129, 129, 76, 153, 205, 70, 147, 175, 149, 58, 137, 191, 66, - 174, 21, 11, 172, 145, 43, 1, 61, 136, 214, 131, 224, 10, 37, 88, 148, - 25, 90, 176, 246, 88, 176, 210, 183, 218, 80, 194, 130, 245, 210, 172, 212, - 26, 36, 65, 32, 109, 72, 135, 24, 138, 136, 119, 216, 194, 117, 21, 143, - 253, 141, 138, 97, 211, 157, 26, 164, 228, 229, 223, 112, 51, 46, 34, 24, - 57, 197, 186, 132, 235, 6, 115, 25, 246, 38, 216, 72, 53, 157, 2, 83, - 185, 19, 180, 41, 72, 70, 17, 212, 133, 90, 130, 149, 46, 250, 12, 157, - 70, 155, 107, 129, 133, 129, 225, 39, 168, 224, 134, 189, 225, 70, 54, 178, - 133, 127, 169, 239, 43, 131, 145, 189, 155, 131, 56, 207, 68, 192, 64, 248, - 169, 135, 191, 50, 35, 112, 35, 92, 133, 202, 83, 146, 222, 219, 106, 94, - 24, 193, 235, 190, 70, 6, 239, 120, 252, 32, 53, 252, 108, 50, 212, 32, - 143, 45, 187, 209, 146, 225, 45, 90, 78, 163, 65, 104, 234, 196, 47, 121, - 62, 246, 187, 221, 207, 31, 153, 217, 31, 199, 204, 224, 37, 57, 62, 183, - 100, 36, 203, 188, 55, 206, 240, 218, 155, 220, 139, 183, 177, 59, 89, 28, - 34, 197, 102, 9, 47, 1, 159, 13, 187, 176, 181, 172, 179, 170, 38, 243, - 19, 177, 178, 232, 240, 131, 194, 154, 50, 77, 156, 115, 176, 233, 60, 88, - 32, 146, 26, 55, 231, 59, 232, 96, 20, 87, 113, 70, 226, 93, 20, 180, - 38, 157, 175, 152, 69, 58, 107, 66, 127, 26, 30, 76, 43, 66, 197, 203, - 57, 24, 64, 166, 219, 95, 32, 20, 166, 201, 93, 17, 12, 184, 149, 173, - 99, 84, 63, 203, 106, 75, 87, 134, 176, 77, 177, 195, 31, 30, 132, 139, - 251, 22, 108, 182, 171, 136, 177, 128, 59, 34, 34, 98, 127, 109, 14, 142, - 46, 45, 113, 67, 243, 217, 23, 189, 96, 46, 2, 181, 40, 38, 255, 93, - 39, 74, 214, 51, 83, 51, 101, 166, 140, 144, 164, 9, 78, 66, 65, 201, - 195, 152, 207, 184, 130, 100, 31, 58, 196, 128, 167, 43, 208, 153, 143, 28, - 225, 239, 194, 17, 62, 46, 128, 95, 187, 106, 26, 155, 236, 112, 213, 241, - 181, 211, 156, 23, 126, 52, 48, 81, 97, 22, 227, 121, 227, 175, 220, 124, - 196, 21, 24, 202, 116, 40, 203, 12, 246, 1, 15, 122, 229, 100, 221, 16, - 96, 110, 211, 0, 223, 28, 105, 46, 213, 228, 172, 64, 192, 176, 172, 245, - 217, 11, 210, 56, 227, 41, 107, 192, 39, 89, 76, 5, 173, 167, 82, 254, - 70, 128, 198, 168, 80, 216, 70, 115, 15, 139, 154, 199, 185, 251, 169, 206, - 221, 6, 173, 209, 89, 219, 144, 248, 121, 202, 179, 212, 249, 138, 89, 174, - 203, 16, 230, 155, 6, 250, 198, 73, 150, 168, 43, 99, 130, 241, 32, 185, - 67, 159, 43, 195, 145, 51, 112, 192, 112, 76, 239, 246, 41, 93, 79, 38, - 100, 121, 172, 69, 218, 53, 117, 12, 167, 197, 101, 233, 104, 227, 244, 163, - 209, 186, 202, 255, 116, 212, 59, 242, 89, 225, 37, 133, 12, 235, 207, 209, - 243, 75, 36, 189, 241, 110, 185, 39, 216, 107, 167, 23, 39, 160, 4, 145, - 125, 167, 103, 199, 227, 12, 249, 84, 102, 72, 59, 59, 180, 145, 58, 246, - 118, 220, 163, 139, 149, 45, 10, 228, 18, 98, 89, 200, 240, 4, 149, 208, - 251, 194, 226, 104, 191, 38, 163, 205, 186, 21, 186, 241, 135, 142, 242, 33, - 40, 11, 247, 87, 25, 82, 228, 2, 197, 219, 95, 0, 88, 66, 165, 241, - 120, 1, 2, 117, 19, 174, 150, 253, 94, 223, 175, 168, 254, 30, 15, 114, - 71, 170, 214, 146, 168, 27, 191, 196, 240, 100, 162, 3, 219, 236, 21, 59, - 107, 66, 111, 134, 27, 86, 223, 192, 38, 54, 82, 254, 218, 25, 184, 42, - 251, 184, 128, 107, 61, 126, 153, 90, 154, 211, 90, 249, 228, 137, 95, 140, - 57, 125, 141, 209, 249, 162, 57, 76, 76, 130, 243, 130, 71, 171, 207, 127, - 0, 15, 32, 140, 56, 43, 107, 149, 140, 134, 80, 6, 82, 107, 220, 75, - 72, 34, 98, 32, 24, 47, 26, 242, 129, 24, 181, 87, 208, 64, 120, 54, - 138, 31, 140, 74, 125, 29, 89, 57, 196, 252, 196, 65, 220, 101, 191, 229, - 156, 62, 203, 7, 236, 183, 48, 180, 106, 55, 242, 250, 18, 174, 91, 56, - 248, 243, 142, 127, 201, 208, 198, 82, 167, 41, 216, 197, 15, 29, 230, 63, - 200, 179, 249, 117, 46, 99, 158, 169, 99, 127, 203, 44, 163, 103, 164, 19, - 134, 52, 164, 55, 55, 16, 193, 99, 245, 190, 75, 200, 102, 98, 211, 201, - 211, 161, 50, 153, 174, 103, 39, 103, 173, 220, 127, 157, 112, 188, 131, 234, - 236, 123, 2, 77, 125, 33, 77, 8, 18, 7, 250, 71, 139, 57, 255, 20, - 135, 248, 97, 248, 16, 72, 85, 127, 135, 90, 60, 133, 73, 188, 158, 222, - 136, 218, 55, 106, 221, 40, 252, 114, 156, 198, 52, 82, 84, 9, 155, 123, - 194, 197, 36, 88, 249, 152, 251, 192, 87, 156, 119, 199, 144, 207, 83, 10, - 190, 204, 172, 205, 22, 2, 60, 94, 199, 169, 51, 185, 84, 121, 26, 154, - 139, 204, 49, 7, 30, 28, 45, 253, 167, 55, 248, 235, 141, 55, 40, 191, - 23, 169, 248, 92, 164, 154, 85, 205, 26, 120, 101, 89, 7, 254, 59, 91, - 96, 136, 225, 89, 8, 138, 241, 230, 192, 45, 79, 143, 15, 95, 176, 51, - 248, 125, 206, 47, 226, 191, 79, 221, 65, 248, 251, 216, 119, 221, 73, 120, - 117, 8, 157, 127, 174, 148, 159, 13, 29, 188, 228, 206, 214, 76, 173, 72, - 77, 18, 245, 169, 73, 97, 181, 106, 162, 172, 157, 203, 154, 103, 175, 165, - 2, 95, 73, 67, 146, 242, 41, 58, 97, 227, 50, 196, 179, 131, 68, 190, - 154, 167, 100, 37, 74, 41, 57, 212, 152, 100, 30, 202, 179, 103, 161, 203, - 68, 152, 226, 244, 202, 201, 91, 243, 244, 114, 86, 249, 94, 42, 181, 63, - 100, 103, 253, 97, 186, 14, 74, 207, 164, 30, 38, 83, 191, 121, 247, 61, - 59, 251, 102, 17, 253, 142, 118, 172, 97, 18, 77, 19, 126, 245, 138, 7, - 136, 39, 255, 30, 158, 242, 58, 241, 96, 71, 111, 126, 250, 150, 157, 29, - 45, 157, 73, 116, 245, 198, 185, 132, 13, 190, 19, 37, 252, 228, 34, 200, - 106, 116, 253, 173, 75, 181, 253, 244, 234, 223, 244, 166, 156, 240, 130, 11, - 8, 104, 184, 252, 40, 1, 124, 242, 18, 192, 6, 183, 190, 110, 230, 114, - 150, 185, 91, 70, 143, 61, 242, 186, 14, 67, 173, 160, 177, 13, 164, 52, - 158, 234, 90, 243, 105, 44, 74, 138, 146, 30, 73, 5, 106, 116, 20, 76, - 77, 23, 172, 173, 153, 231, 71, 37, 185, 179, 111, 104, 125, 211, 122, 210, - 1, 214, 191, 14, 181, 105, 100, 253, 130, 234, 52, 161, 172, 110, 43, 130, - 188, 72, 50, 13, 21, 253, 114, 211, 179, 42, 98, 79, 34, 20, 27, 250, - 129, 75, 84, 74, 174, 198, 246, 231, 221, 177, 119, 139, 206, 3, 186, 102, - 90, 32, 214, 84, 88, 126, 67, 39, 114, 251, 36, 242, 25, 22, 22, 70, - 90, 83, 15, 13, 118, 64, 8, 49, 109, 221, 228, 198, 255, 3, 89, 169, - 112, 178, 120, 194, 157, 202, 105, 119, 113, 225, 137, 200, 38, 215, 232, 70, - 31, 42, 6, 55, 202, 32, 155, 53, 131, 25, 77, 76, 111, 57, 142, 164, - 3, 250, 92, 34, 170, 196, 100, 161, 192, 226, 110, 5, 122, 70, 90, 106, - 19, 194, 213, 250, 49, 157, 68, 1, 151, 28, 206, 123, 56, 139, 251, 11, - 98, 130, 212, 171, 240, 47, 59, 216, 111, 252, 129, 210, 110, 24, 217, 33, - 65, 152, 186, 45, 230, 136, 10, 20, 234, 175, 159, 243, 147, 38, 40, 118, - 184, 145, 68, 143, 28, 238, 82, 18, 249, 138, 228, 207, 128, 181, 156, 23, - 117, 114, 50, 113, 6, 131, 34, 84, 96, 222, 81, 65, 165, 206, 146, 238, - 38, 249, 179, 75, 90, 146, 227, 149, 88, 155, 43, 49, 177, 10, 43, 94, - 69, 15, 23, 29, 181, 6, 21, 32, 130, 118, 222, 253, 241, 18, 155, 94, - 150, 22, 56, 191, 247, 121, 251, 184, 88, 137, 59, 97, 212, 65, 238, 124, - 250, 187, 158, 123, 44, 86, 186, 204, 218, 238, 217, 1, 75, 190, 72, 102, - 84, 85, 226, 230, 67, 116, 108, 150, 126, 88, 2, 93, 75, 61, 100, 207, - 9, 220, 172, 186, 66, 61, 198, 48, 184, 38, 87, 55, 234, 68, 189, 108, - 109, 232, 71, 68, 161, 196, 254, 198, 112, 73, 38, 129, 87, 102, 116, 40, - 206, 57, 121, 51, 110, 86, 176, 165, 55, 205, 140, 190, 164, 160, 10, 178, - 22, 186, 40, 230, 66, 123, 41, 221, 140, 34, 91, 38, 29, 153, 54, 176, - 132, 236, 48, 32, 201, 233, 166, 237, 165, 148, 80, 192, 133, 242, 159, 229, - 209, 239, 238, 128, 3, 219, 214, 108, 189, 41, 144, 20, 149, 27, 35, 54, - 63, 51, 249, 106, 64, 191, 109, 241, 50, 156, 25, 134, 65, 232, 206, 189, - 17, 72, 225, 122, 54, 218, 24, 59, 116, 70, 228, 167, 206, 117, 44, 252, - 162, 123, 137, 123, 45, 61, 149, 146, 98, 114, 111, 221, 5, 108, 222, 70, - 73, 251, 39, 171, 165, 139, 191, 44, 83, 106, 90, 85, 31, 173, 10, 254, - 57, 242, 149, 89, 53, 204, 13, 90, 86, 117, 244, 108, 83, 179, 42, 120, - 228, 37, 137, 155, 99, 68, 97, 208, 140, 243, 92, 188, 58, 46, 152, 165, - 163, 225, 145, 195, 98, 232, 185, 24, 234, 76, 178, 6, 242, 102, 181, 73, - 252, 78, 25, 162, 2, 159, 60, 35, 79, 132, 128, 120, 198, 199, 126, 15, - 19, 162, 227, 121, 186, 76, 31, 29, 134, 165, 18, 3, 27, 93, 27, 156, - 201, 148, 7, 10, 21, 23, 208, 155, 24, 179, 225, 37, 204, 52, 12, 78, - 38, 50, 195, 75, 145, 253, 222, 247, 162, 146, 226, 66, 100, 189, 224, 42, - 214, 249, 116, 22, 80, 110, 120, 77, 249, 143, 243, 239, 175, 154, 127, 153, - 192, 116, 138, 145, 88, 20, 60, 59, 240, 198, 11, 4, 56, 11, 152, 92, - 64, 231, 108, 14, 175, 36, 64, 184, 176, 104, 156, 209, 136, 186, 246, 208, - 29, 161, 18, 214, 243, 23, 6, 155, 110, 84, 45, 35, 195, 209, 34, 115, - 110, 100, 79, 196, 136, 110, 227, 20, 188, 88, 140, 96, 62, 77, 123, 82, - 82, 23, 105, 221, 30, 166, 233, 233, 164, 157, 228, 116, 83, 207, 7, 92, - 84, 143, 52, 59, 169, 19, 1, 5, 51, 35, 190, 252, 197, 134, 132, 130, - 78, 226, 193, 211, 57, 75, 106, 109, 232, 182, 179, 203, 58, 168, 240, 13, - 40, 105, 134, 131, 208, 66, 3, 38, 225, 170, 193, 255, 87, 60, 19, 66, - 172, 148, 248, 128, 85, 104, 213, 182, 137, 154, 19, 207, 193, 145, 137, 35, - 42, 154, 11, 83, 170, 149, 196, 162, 66, 25, 35, 139, 242, 127, 187, 182, - 223, 10, 155, 212, 124, 224, 230, 91, 137, 230, 115, 196, 218, 7, 110, 62, - 179, 213, 54, 53, 31, 178, 253, 118, 170, 253, 137, 40, 82, 15, 210, 254, - 90, 212, 38, 189, 141, 171, 235, 131, 181, 191, 150, 49, 124, 254, 136, 55, - 80, 255, 195, 158, 160, 158, 57, 1, 30, 254, 29, 52, 254, 176, 39, 104, - 100, 206, 129, 135, 127, 130, 230, 31, 246, 4, 205, 13, 163, 232, 225, 159, - 161, 245, 135, 61, 67, 43, 99, 38, 63, 244, 44, 104, 255, 97, 173, 111, - 103, 188, 1, 220, 205, 169, 46, 160, 15, 242, 8, 166, 241, 135, 61, 3, - 84, 157, 126, 136, 70, 45, 190, 35, 125, 152, 135, 48, 255, 184, 135, 72, - 46, 200, 252, 45, 252, 1, 83, 193, 180, 254, 184, 135, 72, 46, 203, 252, - 45, 60, 236, 67, 196, 196, 87, 85, 114, 238, 59, 19, 214, 115, 217, 34, - 224, 0, 207, 125, 223, 37, 156, 224, 69, 128, 113, 189, 102, 206, 200, 157, - 207, 101, 140, 205, 75, 15, 1, 176, 57, 132, 112, 48, 116, 6, 110, 80, - 97, 175, 230, 108, 232, 160, 223, 53, 228, 120, 147, 96, 230, 225, 230, 160, - 183, 100, 207, 29, 54, 244, 221, 139, 14, 249, 252, 6, 207, 170, 85, 223, - 13, 64, 76, 236, 15, 43, 206, 96, 218, 115, 201, 245, 119, 230, 79, 127, - 113, 251, 243, 42, 202, 124, 32, 125, 150, 197, 221, 202, 206, 164, 236, 97, - 120, 63, 242, 240, 118, 203, 34, 180, 162, 239, 245, 203, 116, 239, 242, 216, - 187, 117, 253, 242, 5, 252, 114, 96, 151, 18, 204, 131, 106, 254, 224, 5, - 214, 250, 69, 192, 78, 120, 93, 236, 132, 215, 245, 188, 234, 28, 84, 254, - 2, 29, 114, 171, 106, 180, 178, 45, 42, 226, 178, 54, 8, 245, 111, 59, - 166, 149, 235, 135, 34, 182, 222, 187, 60, 133, 191, 99, 248, 59, 132, 191, - 23, 250, 128, 11, 197, 93, 137, 29, 160, 255, 156, 187, 53, 244, 165, 161, - 251, 240, 229, 195, 247, 169, 161, 31, 27, 250, 161, 161, 207, 186, 183, 248, - 177, 196, 15, 159, 126, 98, 54, 144, 155, 250, 210, 4, 114, 248, 131, 239, - 83, 83, 63, 54, 245, 67, 19, 201, 241, 99, 105, 18, 57, 125, 194, 111, - 32, 183, 244, 165, 5, 228, 240, 7, 223, 167, 150, 126, 108, 233, 135, 22, - 146, 227, 199, 210, 34, 114, 250, 132, 223, 64, 110, 235, 75, 27, 200, 225, - 15, 190, 79, 109, 253, 216, 214, 15, 109, 36, 199, 143, 165, 77, 228, 244, - 9, 191, 129, 188, 166, 47, 107, 64, 14, 127, 240, 125, 90, 211, 143, 107, - 250, 97, 13, 201, 241, 99, 89, 35, 114, 250, 132, 223, 64, 94, 215, 151, - 117, 32, 135, 63, 248, 62, 173, 235, 199, 117, 253, 176, 142, 228, 248, 177, - 172, 19, 57, 125, 194, 111, 32, 111, 232, 203, 6, 144, 195, 31, 124, 159, - 54, 244, 227, 134, 126, 216, 64, 114, 252, 88, 54, 136, 156, 62, 225, 55, - 144, 55, 245, 101, 19, 200, 225, 15, 190, 79, 155, 250, 113, 83, 63, 108, - 34, 57, 126, 44, 155, 68, 78, 159, 240, 27, 200, 91, 250, 178, 5, 228, - 240, 7, 223, 167, 45, 253, 184, 165, 31, 182, 144, 28, 63, 150, 45, 34, - 167, 79, 248, 13, 228, 109, 125, 217, 6, 114, 248, 131, 239, 211, 182, 126, - 220, 214, 15, 219, 72, 142, 31, 203, 54, 145, 211, 39, 252, 198, 215, 4, - 175, 213, 196, 247, 138, 31, 248, 235, 20, 254, 142, 225, 239, 208, 164, 151, - 75, 159, 75, 147, 191, 94, 254, 133, 87, 88, 18, 223, 48, 189, 98, 122, - 199, 248, 146, 241, 45, 227, 107, 230, 239, 153, 191, 104, 241, 166, 197, 171, - 198, 119, 221, 209, 242, 123, 121, 30, 157, 196, 208, 186, 94, 184, 247, 91, - 179, 228, 176, 235, 24, 17, 164, 52, 157, 237, 145, 101, 95, 63, 232, 132, - 22, 126, 253, 128, 204, 239, 58, 138, 29, 158, 2, 19, 29, 35, 31, 57, - 17, 57, 218, 239, 17, 57, 84, 143, 17, 71, 58, 24, 121, 231, 70, 31, - 22, 247, 207, 2, 61, 56, 71, 181, 110, 13, 99, 62, 199, 61, 117, 77, - 183, 220, 10, 117, 101, 111, 115, 254, 173, 118, 0, 79, 174, 29, 96, 20, - 111, 152, 205, 103, 121, 109, 117, 139, 58, 97, 109, 5, 137, 235, 252, 249, - 62, 59, 21, 201, 190, 72, 247, 101, 198, 84, 22, 128, 142, 226, 89, 208, - 87, 97, 94, 167, 115, 70, 76, 246, 252, 203, 19, 86, 98, 103, 168, 190, - 56, 127, 118, 242, 164, 51, 61, 249, 242, 20, 18, 78, 88, 25, 136, 158, - 157, 138, 48, 225, 79, 188, 96, 226, 76, 10, 252, 230, 197, 117, 14, 241, - 103, 252, 91, 104, 153, 126, 170, 31, 235, 135, 208, 58, 30, 86, 231, 6, - 215, 196, 194, 13, 20, 54, 139, 79, 247, 25, 79, 28, 82, 226, 144, 149, - 41, 45, 207, 67, 175, 159, 241, 186, 246, 110, 76, 241, 44, 123, 67, 252, - 229, 71, 137, 126, 148, 122, 202, 219, 127, 204, 191, 14, 225, 235, 156, 3, - 240, 169, 193, 220, 41, 82, 156, 118, 91, 214, 160, 97, 218, 18, 190, 150, - 197, 162, 4, 97, 99, 5, 237, 244, 131, 118, 252, 65, 59, 44, 50, 77, - 188, 178, 10, 19, 109, 255, 16, 198, 23, 68, 196, 155, 189, 220, 204, 189, - 157, 21, 40, 110, 236, 237, 115, 235, 203, 130, 79, 184, 161, 230, 62, 155, - 33, 178, 208, 237, 7, 107, 159, 65, 82, 169, 83, 54, 43, 102, 211, 106, - 89, 123, 179, 91, 204, 219, 235, 220, 138, 12, 163, 210, 104, 217, 150, 101, - 166, 50, 202, 70, 197, 52, 13, 187, 110, 67, 78, 241, 153, 177, 159, 227, - 253, 131, 43, 164, 89, 177, 246, 242, 5, 205, 47, 230, 247, 115, 24, 35, - 139, 56, 55, 60, 207, 109, 57, 175, 221, 230, 245, 37, 124, 45, 243, 197, - 170, 191, 159, 187, 193, 69, 24, 91, 136, 100, 197, 253, 220, 47, 133, 207, - 196, 26, 92, 100, 165, 14, 187, 217, 203, 107, 167, 121, 53, 25, 65, 147, - 68, 198, 113, 60, 195, 10, 51, 14, 33, 195, 131, 215, 126, 179, 159, 163, - 0, 150, 28, 226, 143, 142, 93, 48, 90, 81, 181, 130, 232, 61, 140, 119, - 165, 38, 70, 56, 239, 49, 36, 201, 239, 245, 220, 75, 24, 221, 61, 116, - 25, 60, 99, 121, 13, 121, 189, 134, 204, 94, 67, 110, 15, 31, 47, 242, - 236, 188, 184, 207, 188, 194, 103, 102, 241, 185, 81, 169, 127, 217, 187, 124, - 118, 70, 221, 79, 209, 11, 243, 236, 138, 144, 184, 195, 113, 159, 30, 115, - 34, 76, 103, 114, 250, 254, 77, 134, 98, 223, 243, 251, 35, 151, 105, 56, - 242, 240, 148, 169, 210, 2, 121, 232, 246, 107, 241, 159, 190, 186, 238, 56, - 215, 151, 133, 190, 63, 157, 225, 8, 181, 113, 124, 226, 129, 78, 179, 88, - 60, 0, 145, 232, 75, 227, 25, 244, 194, 254, 217, 181, 142, 255, 99, 135, - 32, 24, 99, 127, 238, 144, 31, 187, 124, 32, 28, 125, 121, 24, 220, 121, - 249, 48, 75, 158, 176, 132, 132, 179, 219, 50, 172, 110, 240, 119, 91, 130, - 239, 146, 117, 158, 95, 223, 221, 8, 159, 90, 225, 111, 109, 6, 133, 59, - 230, 143, 69, 243, 202, 95, 114, 191, 227, 219, 175, 13, 254, 63, 169, 222, - 55, 82, 9, 162, 175, 229, 128, 227, 118, 13, 52, 186, 224, 21, 199, 88, - 115, 110, 193, 126, 94, 105, 145, 192, 240, 243, 26, 46, 211, 3, 137, 146, - 147, 163, 0, 18, 115, 144, 12, 178, 129, 182, 52, 136, 2, 229, 4, 104, - 6, 191, 0, 73, 66, 3, 81, 66, 59, 228, 151, 156, 76, 87, 105, 168, - 52, 188, 222, 165, 41, 74, 155, 152, 195, 47, 64, 176, 208, 64, 178, 208, - 14, 249, 37, 39, 211, 85, 26, 42, 109, 65, 178, 37, 74, 91, 152, 195, - 47, 64, 206, 208, 64, 208, 208, 14, 249, 37, 39, 211, 85, 26, 42, 141, - 67, 194, 22, 165, 233, 197, 240, 11, 16, 59, 52, 144, 59, 180, 67, 126, - 201, 201, 116, 149, 134, 74, 215, 32, 185, 38, 74, 215, 48, 135, 95, 128, - 20, 162, 129, 24, 162, 29, 242, 75, 78, 166, 171, 52, 84, 186, 14, 201, - 117, 81, 186, 142, 57, 252, 2, 132, 18, 13, 164, 18, 237, 144, 95, 114, - 50, 93, 165, 161, 210, 13, 72, 110, 136, 210, 13, 204, 225, 23, 32, 163, - 104, 32, 164, 104, 135, 252, 146, 147, 233, 42, 13, 149, 110, 66, 114, 83, - 148, 110, 98, 14, 191, 0, 145, 69, 3, 153, 69, 59, 228, 151, 156, 76, - 87, 105, 168, 116, 11, 146, 91, 162, 116, 11, 115, 248, 5, 72, 48, 26, - 136, 48, 218, 33, 191, 228, 100, 186, 74, 67, 165, 219, 144, 220, 22, 165, - 219, 152, 195, 47, 64, 160, 209, 64, 162, 209, 14, 249, 37, 39, 211, 85, - 26, 62, 90, 112, 20, 153, 114, 180, 153, 52, 148, 196, 37, 202, 55, 26, - 10, 56, 48, 102, 196, 144, 19, 212, 122, 156, 148, 87, 68, 3, 42, 28, - 120, 124, 84, 201, 161, 71, 99, 143, 6, 159, 28, 125, 156, 90, 143, 145, - 230, 132, 153, 79, 166, 190, 27, 35, 94, 71, 211, 172, 99, 230, 252, 49, - 91, 113, 113, 68, 147, 169, 221, 27, 111, 48, 31, 234, 209, 245, 144, 96, - 158, 138, 85, 43, 146, 86, 204, 12, 49, 95, 219, 83, 53, 242, 99, 103, - 166, 232, 226, 225, 74, 87, 126, 103, 171, 223, 177, 136, 84, 190, 159, 153, - 122, 254, 197, 192, 153, 225, 238, 136, 12, 113, 3, 126, 206, 243, 14, 24, - 225, 0, 207, 139, 208, 18, 182, 40, 76, 4, 229, 111, 84, 211, 7, 81, - 206, 116, 30, 254, 62, 154, 78, 71, 225, 197, 255, 186, 81, 198, 215, 35, - 231, 50, 162, 90, 192, 46, 145, 95, 156, 43, 10, 123, 25, 229, 32, 230, - 58, 123, 239, 253, 22, 108, 154, 190, 198, 136, 47, 226, 161, 200, 61, 91, - 108, 65, 101, 183, 4, 60, 24, 205, 51, 220, 82, 101, 96, 82, 189, 93, - 140, 123, 176, 155, 157, 94, 8, 139, 90, 110, 17, 108, 91, 186, 21, 55, - 8, 190, 95, 131, 126, 111, 27, 194, 19, 124, 108, 4, 236, 228, 117, 69, - 167, 98, 162, 231, 215, 93, 202, 47, 43, 125, 92, 146, 165, 225, 179, 253, - 44, 178, 88, 77, 181, 249, 112, 155, 198, 191, 158, 65, 146, 80, 232, 54, - 82, 36, 25, 122, 235, 102, 38, 81, 162, 166, 214, 134, 246, 196, 136, 30, - 15, 89, 63, 93, 35, 7, 171, 153, 29, 27, 162, 31, 114, 189, 45, 110, - 100, 34, 38, 161, 33, 195, 15, 145, 15, 153, 55, 25, 184, 183, 40, 63, - 67, 66, 217, 90, 19, 244, 74, 220, 228, 172, 128, 24, 40, 86, 107, 93, - 100, 191, 81, 8, 75, 123, 79, 171, 225, 41, 168, 143, 152, 158, 171, 155, - 170, 205, 141, 131, 202, 38, 70, 187, 26, 47, 208, 224, 115, 249, 91, 255, - 150, 161, 53, 169, 205, 17, 22, 116, 59, 186, 79, 133, 110, 193, 189, 184, - 208, 6, 203, 89, 204, 167, 97, 38, 90, 108, 90, 58, 97, 44, 216, 207, - 59, 54, 185, 108, 23, 105, 101, 161, 72, 152, 41, 247, 108, 133, 165, 223, - 237, 149, 141, 253, 179, 209, 140, 2, 241, 17, 185, 129, 183, 80, 139, 137, - 88, 135, 99, 72, 231, 197, 117, 134, 117, 79, 166, 217, 235, 7, 123, 67, - 26, 52, 22, 6, 254, 43, 152, 182, 48, 246, 119, 20, 151, 0, 95, 113, - 9, 184, 140, 185, 4, 244, 132, 161, 185, 106, 200, 239, 164, 125, 0, 252, - 180, 15, 192, 101, 150, 15, 64, 47, 238, 3, 48, 202, 240, 1, 64, 146, - 50, 78, 131, 126, 182, 15, 0, 230, 171, 121, 74, 86, 162, 148, 146, 67, - 141, 73, 230, 113, 203, 126, 241, 48, 248, 123, 148, 229, 15, 144, 108, 134, - 240, 7, 200, 170, 171, 151, 74, 69, 11, 127, 121, 7, 225, 27, 144, 170, - 143, 251, 6, 100, 149, 28, 38, 83, 201, 248, 95, 212, 71, 191, 135, 138, - 159, 64, 144, 246, 19, 184, 142, 249, 9, 132, 5, 225, 183, 151, 242, 25, - 8, 115, 95, 39, 58, 130, 59, 4, 244, 99, 254, 3, 227, 164, 255, 192, - 50, 225, 63, 112, 165, 248, 15, 140, 84, 255, 129, 126, 218, 127, 224, 221, - 12, 90, 237, 140, 128, 235, 142, 208, 114, 135, 236, 13, 186, 74, 52, 141, - 12, 151, 230, 12, 210, 122, 146, 114, 179, 86, 92, 4, 197, 124, 51, 37, - 71, 72, 57, 51, 12, 196, 33, 13, 174, 96, 12, 121, 248, 120, 121, 25, - 207, 18, 231, 218, 78, 24, 162, 91, 99, 43, 170, 10, 120, 248, 117, 116, - 242, 29, 109, 85, 113, 18, 92, 234, 44, 152, 162, 58, 30, 195, 254, 1, - 163, 28, 185, 232, 249, 69, 250, 247, 90, 9, 168, 80, 203, 82, 128, 198, - 192, 16, 95, 244, 5, 248, 41, 98, 71, 80, 88, 60, 151, 41, 138, 115, - 40, 52, 25, 76, 111, 40, 108, 227, 12, 227, 55, 46, 102, 80, 126, 12, - 15, 76, 99, 163, 88, 201, 48, 124, 217, 208, 242, 144, 239, 64, 35, 233, - 9, 148, 8, 135, 223, 5, 188, 21, 23, 83, 124, 241, 40, 11, 10, 66, - 104, 203, 29, 77, 234, 45, 188, 209, 128, 7, 108, 236, 135, 189, 203, 158, - 197, 130, 39, 150, 49, 124, 34, 46, 185, 108, 60, 197, 30, 233, 45, 96, - 177, 157, 80, 15, 142, 157, 43, 126, 91, 94, 152, 150, 67, 126, 242, 128, - 137, 156, 252, 198, 161, 52, 25, 161, 18, 111, 80, 73, 214, 78, 139, 245, - 239, 171, 126, 49, 217, 229, 6, 111, 188, 193, 96, 228, 166, 239, 0, 101, - 96, 106, 80, 19, 232, 26, 207, 71, 230, 129, 210, 23, 241, 154, 190, 229, - 180, 239, 78, 94, 28, 125, 37, 203, 195, 245, 251, 23, 135, 116, 53, 159, - 94, 94, 162, 9, 43, 173, 40, 104, 149, 11, 131, 100, 232, 140, 46, 170, - 176, 5, 25, 149, 199, 124, 52, 35, 227, 157, 170, 221, 93, 76, 221, 35, - 192, 74, 143, 222, 159, 190, 46, 189, 164, 122, 189, 9, 30, 8, 5, 225, - 139, 195, 161, 118, 71, 161, 35, 42, 52, 112, 239, 85, 40, 246, 252, 91, - 139, 124, 245, 142, 110, 162, 227, 239, 127, 43, 61, 241, 213, 219, 247, 95, - 241, 154, 220, 91, 111, 190, 97, 224, 253, 245, 70, 95, 134, 137, 38, 95, - 32, 44, 101, 217, 130, 70, 139, 57, 72, 10, 253, 0, 53, 233, 58, 252, - 117, 125, 250, 188, 164, 207, 158, 62, 194, 228, 17, 79, 31, 241, 140, 17, - 207, 225, 94, 177, 75, 213, 59, 86, 254, 148, 63, 194, 148, 75, 116, 156, - 37, 231, 217, 145, 112, 161, 229, 95, 244, 9, 191, 251, 67, 252, 235, 246, - 233, 115, 168, 255, 140, 246, 221, 58, 252, 193, 111, 252, 12, 232, 19, 83, - 60, 252, 235, 226, 231, 8, 255, 160, 186, 254, 120, 9, 143, 193, 191, 198, - 252, 107, 201, 191, 174, 244, 165, 247, 43, 54, 16, 62, 189, 95, 83, 222, - 19, 2, 212, 110, 50, 238, 172, 38, 107, 248, 98, 105, 95, 138, 92, 41, - 214, 77, 26, 70, 20, 249, 25, 125, 130, 97, 143, 223, 15, 214, 220, 165, - 70, 196, 10, 227, 46, 72, 33, 186, 59, 5, 195, 70, 28, 173, 49, 198, - 103, 167, 56, 150, 73, 115, 111, 196, 194, 146, 102, 114, 244, 187, 171, 140, - 33, 61, 59, 121, 23, 115, 185, 85, 204, 173, 5, 23, 70, 190, 252, 242, - 101, 86, 120, 186, 112, 235, 57, 90, 241, 165, 188, 146, 142, 223, 124, 66, - 243, 4, 35, 184, 58, 236, 27, 103, 52, 56, 122, 253, 221, 123, 17, 63, - 56, 90, 192, 100, 144, 38, 172, 108, 122, 131, 43, 6, 146, 229, 185, 11, - 106, 120, 169, 160, 136, 32, 18, 24, 123, 79, 190, 215, 40, 135, 146, 75, - 172, 240, 249, 15, 235, 124, 11, 156, 69, 116, 80, 76, 14, 37, 221, 0, - 37, 203, 51, 106, 168, 235, 165, 123, 1, 194, 158, 234, 248, 27, 235, 21, - 126, 132, 173, 44, 209, 48, 187, 137, 199, 70, 231, 219, 98, 189, 167, 191, - 178, 132, 39, 187, 255, 229, 71, 44, 215, 47, 163, 160, 179, 201, 53, 79, - 93, 191, 29, 92, 246, 200, 31, 138, 0, 213, 4, 123, 229, 227, 4, 1, - 230, 105, 137, 35, 65, 34, 208, 113, 73, 28, 59, 147, 165, 98, 165, 26, - 41, 114, 131, 136, 59, 241, 72, 184, 34, 14, 48, 34, 217, 97, 205, 60, - 230, 174, 143, 215, 255, 250, 150, 46, 248, 114, 34, 81, 207, 161, 5, 83, - 132, 120, 139, 66, 21, 167, 25, 96, 64, 170, 21, 114, 84, 227, 43, 48, - 174, 215, 202, 34, 204, 155, 29, 53, 228, 135, 161, 75, 79, 240, 133, 239, - 210, 68, 209, 35, 238, 58, 70, 232, 68, 122, 46, 81, 247, 51, 94, 17, - 172, 62, 222, 133, 7, 203, 13, 12, 180, 197, 8, 69, 151, 209, 8, 45, - 12, 164, 107, 63, 25, 8, 56, 28, 36, 31, 235, 25, 34, 20, 14, 194, - 86, 194, 46, 220, 141, 7, 79, 254, 23, 202, 117, 120, 247, 107, 140, 87, - 59, 23, 173, 211, 9, 206, 31, 237, 22, 2, 12, 106, 3, 117, 140, 113, - 97, 134, 105, 200, 189, 214, 168, 207, 122, 7, 24, 186, 13, 110, 113, 1, - 52, 4, 29, 39, 122, 75, 118, 86, 4, 81, 62, 135, 45, 65, 244, 196, - 239, 167, 172, 63, 194, 109, 138, 140, 17, 32, 198, 37, 46, 242, 188, 163, - 68, 35, 250, 137, 119, 116, 138, 19, 83, 121, 45, 136, 133, 126, 237, 222, - 111, 197, 249, 147, 229, 48, 26, 181, 48, 30, 241, 29, 70, 131, 64, 186, - 203, 239, 44, 139, 225, 179, 242, 110, 17, 230, 35, 200, 156, 38, 192, 46, - 196, 152, 82, 59, 146, 100, 215, 241, 148, 116, 124, 56, 150, 16, 88, 232, - 18, 163, 81, 23, 119, 21, 205, 248, 221, 98, 117, 14, 220, 145, 139, 119, - 245, 230, 169, 74, 54, 182, 56, 115, 8, 179, 96, 72, 189, 66, 189, 229, - 209, 94, 132, 103, 47, 38, 115, 111, 36, 95, 44, 204, 125, 223, 69, 185, - 220, 29, 220, 163, 209, 217, 55, 116, 6, 3, 236, 173, 43, 193, 255, 136, - 141, 192, 124, 17, 236, 227, 2, 121, 240, 12, 198, 25, 238, 103, 177, 51, - 51, 133, 194, 211, 228, 91, 16, 178, 84, 178, 59, 254, 33, 242, 93, 127, - 52, 21, 67, 29, 158, 150, 120, 232, 223, 70, 184, 107, 87, 173, 22, 10, - 119, 153, 22, 253, 41, 201, 1, 132, 60, 144, 67, 196, 230, 146, 103, 231, - 165, 76, 84, 99, 221, 238, 109, 191, 223, 61, 210, 14, 58, 202, 114, 198, - 228, 145, 32, 137, 55, 154, 137, 225, 161, 207, 25, 169, 191, 202, 230, 186, - 200, 2, 86, 70, 45, 87, 36, 88, 69, 181, 172, 180, 3, 253, 3, 143, - 118, 198, 252, 49, 147, 1, 143, 241, 172, 218, 102, 68, 197, 125, 9, 224, - 197, 118, 132, 88, 5, 55, 41, 153, 107, 20, 59, 81, 124, 35, 17, 78, - 8, 124, 40, 234, 93, 115, 9, 18, 4, 69, 18, 41, 215, 76, 162, 11, - 138, 193, 59, 130, 141, 43, 215, 159, 37, 50, 194, 218, 205, 123, 212, 158, - 91, 176, 60, 148, 88, 175, 52, 11, 254, 236, 53, 253, 206, 107, 226, 249, - 104, 217, 151, 23, 166, 122, 97, 169, 23, 182, 122, 81, 203, 175, 243, 194, - 123, 92, 179, 114, 92, 21, 93, 100, 5, 99, 95, 124, 87, 233, 219, 63, - 35, 109, 220, 57, 163, 163, 4, 12, 45, 205, 47, 251, 42, 144, 149, 143, - 174, 232, 60, 26, 55, 254, 217, 8, 135, 83, 97, 53, 163, 221, 208, 233, - 3, 245, 139, 20, 73, 28, 6, 46, 100, 52, 106, 58, 255, 39, 8, 235, - 166, 165, 227, 159, 32, 131, 54, 197, 123, 172, 194, 251, 82, 28, 94, 109, - 148, 64, 69, 108, 234, 244, 56, 211, 56, 14, 181, 182, 170, 169, 122, 69, - 58, 219, 64, 213, 1, 201, 144, 66, 232, 21, 105, 221, 254, 104, 49, 215, - 83, 41, 10, 144, 77, 41, 37, 187, 177, 87, 147, 11, 144, 220, 112, 205, - 86, 33, 104, 50, 176, 91, 94, 79, 97, 229, 252, 110, 226, 161, 176, 201, - 222, 57, 136, 69, 165, 68, 25, 93, 25, 186, 68, 154, 105, 41, 130, 97, - 1, 183, 175, 71, 83, 127, 226, 250, 1, 30, 72, 89, 205, 40, 19, 46, - 27, 181, 216, 165, 105, 213, 99, 215, 150, 217, 136, 93, 219, 53, 91, 185, - 94, 235, 41, 29, 212, 169, 123, 185, 24, 57, 126, 28, 97, 134, 180, 80, - 246, 125, 133, 74, 53, 240, 236, 241, 104, 218, 163, 0, 68, 190, 207, 35, - 244, 108, 138, 60, 251, 143, 1, 207, 60, 65, 140, 178, 16, 22, 136, 221, - 7, 105, 71, 236, 121, 142, 176, 179, 130, 217, 116, 66, 210, 42, 141, 214, - 204, 189, 14, 76, 161, 91, 248, 227, 219, 33, 184, 198, 169, 119, 139, 31, - 34, 37, 97, 77, 155, 60, 80, 90, 181, 244, 63, 227, 72, 105, 251, 97, - 144, 220, 215, 225, 48, 125, 201, 159, 183, 240, 53, 188, 223, 162, 154, 0, - 143, 208, 247, 2, 87, 5, 97, 164, 140, 173, 129, 24, 238, 61, 100, 197, - 250, 20, 190, 4, 156, 225, 193, 198, 128, 201, 28, 51, 234, 51, 147, 169, - 174, 98, 175, 46, 39, 83, 159, 111, 71, 97, 230, 191, 3, 81, 179, 143, - 87, 167, 46, 6, 70, 115, 69, 2, 10, 241, 239, 97, 101, 112, 231, 120, - 224, 37, 210, 248, 205, 121, 117, 202, 97, 169, 46, 40, 55, 229, 239, 240, - 180, 178, 165, 214, 195, 182, 212, 202, 60, 181, 77, 182, 55, 78, 101, 226, - 18, 161, 218, 221, 111, 111, 181, 173, 156, 131, 126, 116, 155, 237, 45, 189, - 155, 204, 191, 71, 59, 107, 15, 217, 206, 218, 150, 118, 38, 243, 239, 209, - 206, 250, 67, 182, 179, 190, 165, 157, 201, 252, 123, 180, 179, 241, 144, 237, - 108, 108, 105, 103, 50, 255, 30, 237, 108, 62, 100, 59, 155, 91, 218, 153, - 204, 191, 71, 59, 91, 15, 217, 206, 214, 150, 118, 38, 243, 239, 209, 206, - 246, 67, 182, 179, 189, 165, 157, 201, 252, 123, 180, 147, 60, 150, 30, 172, - 161, 188, 182, 187, 248, 126, 146, 224, 62, 77, 53, 31, 180, 169, 91, 151, - 168, 143, 88, 163, 76, 235, 65, 155, 106, 109, 107, 106, 146, 224, 62, 77, - 125, 208, 149, 201, 220, 182, 52, 165, 8, 238, 211, 212, 7, 93, 156, 204, - 109, 171, 83, 138, 224, 62, 77, 125, 208, 245, 201, 220, 182, 64, 165, 8, - 238, 211, 212, 7, 93, 162, 204, 109, 107, 84, 138, 224, 62, 77, 125, 208, - 85, 202, 220, 182, 76, 165, 8, 238, 211, 212, 7, 93, 168, 204, 109, 43, - 85, 138, 224, 62, 77, 125, 208, 181, 202, 220, 182, 88, 165, 8, 238, 35, - 251, 63, 232, 106, 101, 109, 91, 173, 82, 4, 247, 105, 234, 131, 174, 86, - 214, 182, 213, 42, 69, 112, 159, 166, 62, 232, 106, 101, 109, 91, 173, 82, - 4, 247, 105, 234, 131, 174, 86, 214, 182, 213, 42, 69, 112, 159, 166, 62, - 232, 106, 101, 109, 91, 173, 82, 4, 127, 186, 57, 105, 163, 106, 214, 178, - 99, 119, 196, 149, 146, 236, 25, 119, 131, 154, 64, 251, 11, 90, 247, 109, - 113, 205, 222, 118, 26, 53, 30, 23, 235, 109, 7, 82, 16, 36, 243, 173, - 217, 89, 105, 111, 81, 253, 169, 189, 213, 249, 191, 154, 80, 253, 46, 184, - 38, 178, 139, 142, 98, 190, 215, 91, 80, 127, 175, 10, 8, 52, 94, 252, - 96, 175, 117, 91, 42, 229, 87, 55, 107, 126, 226, 84, 169, 176, 21, 247, - 137, 210, 222, 154, 123, 175, 208, 144, 181, 136, 38, 166, 43, 216, 205, 243, - 75, 184, 146, 170, 118, 138, 18, 160, 117, 160, 117, 178, 30, 171, 150, 67, - 27, 29, 174, 102, 95, 153, 118, 169, 185, 167, 61, 95, 115, 23, 60, 204, - 200, 5, 190, 204, 171, 137, 60, 22, 92, 202, 164, 122, 152, 212, 147, 73, - 13, 89, 195, 60, 44, 216, 148, 84, 243, 176, 96, 43, 76, 10, 11, 182, - 101, 193, 219, 229, 111, 29, 241, 72, 248, 76, 164, 251, 222, 59, 211, 2, - 95, 215, 130, 75, 248, 235, 161, 247, 22, 127, 118, 166, 1, 49, 62, 44, - 181, 181, 211, 177, 190, 60, 211, 230, 64, 55, 7, 186, 121, 239, 252, 89, - 172, 212, 90, 55, 35, 63, 57, 4, 47, 20, 198, 25, 230, 115, 211, 48, - 214, 185, 18, 246, 57, 5, 111, 100, 166, 240, 64, 252, 128, 232, 241, 213, - 130, 81, 49, 234, 165, 218, 158, 102, 62, 133, 247, 73, 175, 242, 2, 241, - 206, 208, 126, 131, 163, 204, 79, 198, 21, 230, 133, 26, 103, 132, 63, 133, - 186, 33, 187, 67, 184, 104, 222, 100, 230, 64, 99, 187, 120, 208, 190, 32, - 188, 39, 140, 210, 32, 220, 71, 129, 15, 163, 35, 99, 95, 66, 207, 226, - 141, 195, 170, 84, 88, 123, 252, 176, 245, 51, 116, 157, 251, 237, 60, 130, - 170, 253, 5, 234, 138, 66, 62, 152, 122, 165, 82, 201, 97, 240, 8, 91, - 47, 91, 231, 18, 144, 246, 137, 102, 175, 25, 26, 255, 226, 24, 61, 251, - 128, 103, 6, 21, 113, 2, 32, 70, 147, 246, 4, 135, 99, 41, 180, 125, - 37, 123, 232, 82, 88, 4, 175, 160, 213, 229, 10, 35, 64, 68, 121, 166, - 99, 163, 157, 239, 192, 29, 80, 27, 44, 189, 206, 207, 132, 88, 9, 136, - 68, 20, 139, 74, 78, 198, 169, 77, 194, 244, 214, 202, 45, 25, 212, 134, - 67, 226, 222, 109, 141, 61, 17, 126, 141, 8, 148, 152, 12, 129, 203, 241, - 115, 197, 203, 52, 178, 79, 65, 234, 97, 23, 99, 137, 192, 131, 33, 118, - 243, 193, 196, 88, 0, 104, 120, 13, 215, 58, 125, 136, 99, 15, 66, 176, - 21, 61, 196, 39, 205, 198, 243, 7, 49, 229, 53, 211, 124, 222, 92, 179, - 13, 54, 213, 113, 38, 129, 80, 120, 237, 53, 189, 48, 248, 105, 225, 65, - 8, 98, 236, 70, 134, 228, 102, 167, 211, 92, 163, 207, 207, 198, 178, 166, - 82, 54, 42, 118, 208, 105, 173, 115, 221, 183, 29, 254, 187, 253, 101, 163, - 246, 204, 182, 214, 185, 171, 40, 210, 23, 187, 193, 24, 127, 108, 216, 193, - 40, 127, 165, 157, 170, 167, 241, 108, 162, 253, 58, 176, 47, 93, 254, 217, - 100, 193, 142, 147, 176, 63, 154, 46, 6, 54, 140, 129, 41, 126, 32, 212, - 240, 232, 236, 252, 247, 176, 51, 238, 144, 105, 15, 216, 202, 16, 238, 193, - 112, 163, 144, 163, 25, 149, 102, 29, 23, 1, 188, 201, 138, 94, 164, 224, - 110, 146, 183, 81, 212, 245, 79, 129, 187, 69, 204, 173, 251, 54, 206, 220, - 144, 177, 253, 150, 206, 6, 230, 85, 68, 63, 100, 233, 179, 10, 93, 4, - 124, 79, 215, 126, 139, 119, 202, 78, 60, 48, 228, 128, 52, 17, 251, 139, - 30, 214, 182, 199, 203, 243, 251, 173, 249, 139, 68, 228, 90, 81, 179, 193, - 102, 248, 101, 114, 172, 198, 146, 61, 56, 195, 129, 113, 14, 60, 56, 112, - 49, 163, 94, 49, 141, 6, 206, 180, 138, 81, 107, 27, 24, 220, 182, 105, - 193, 248, 176, 205, 70, 197, 52, 235, 58, 52, 221, 104, 153, 245, 102, 163, - 169, 215, 42, 237, 102, 179, 97, 65, 94, 165, 222, 182, 240, 71, 205, 172, - 52, 141, 118, 13, 83, 106, 70, 163, 85, 135, 194, 237, 186, 101, 90, 64, - 106, 54, 154, 80, 105, 217, 52, 91, 149, 150, 105, 10, 215, 18, 4, 162, - 166, 209, 126, 115, 160, 193, 16, 246, 173, 193, 45, 135, 121, 13, 7, 205, - 77, 213, 130, 110, 156, 79, 201, 203, 249, 208, 189, 32, 225, 132, 66, 24, - 160, 123, 5, 246, 24, 102, 66, 137, 252, 139, 139, 57, 30, 206, 196, 243, - 28, 94, 221, 146, 69, 192, 182, 218, 80, 196, 171, 231, 40, 184, 214, 96, - 153, 184, 229, 240, 65, 110, 121, 203, 111, 169, 221, 40, 208, 183, 248, 186, - 130, 137, 51, 11, 134, 211, 185, 24, 249, 102, 197, 220, 147, 184, 4, 48, - 83, 43, 150, 46, 207, 112, 25, 58, 135, 160, 175, 48, 113, 106, 184, 246, - 169, 0, 58, 220, 223, 232, 218, 77, 249, 6, 232, 197, 245, 16, 30, 170, - 76, 229, 37, 192, 46, 143, 76, 204, 74, 88, 16, 90, 91, 97, 228, 107, - 193, 207, 126, 18, 205, 101, 171, 255, 80, 247, 127, 217, 253, 226, 246, 139, - 103, 221, 47, 150, 95, 252, 135, 198, 21, 151, 202, 94, 186, 104, 217, 141, - 118, 17, 33, 64, 55, 29, 232, 14, 100, 122, 8, 166, 171, 103, 39, 111, - 240, 26, 193, 72, 128, 65, 36, 119, 54, 117, 97, 200, 200, 237, 21, 165, - 237, 34, 218, 49, 254, 244, 221, 247, 161, 213, 162, 158, 255, 241, 167, 255, - 75, 216, 51, 198, 76, 31, 127, 122, 245, 239, 244, 153, 81, 36, 221, 134, - 79, 67, 34, 173, 252, 157, 54, 219, 231, 129, 147, 93, 9, 68, 222, 97, - 221, 228, 217, 226, 171, 9, 112, 216, 129, 27, 158, 138, 73, 75, 201, 29, - 144, 117, 255, 228, 104, 91, 233, 87, 34, 229, 90, 205, 146, 8, 174, 124, - 57, 113, 184, 56, 36, 214, 22, 24, 2, 25, 32, 228, 48, 226, 38, 235, - 92, 28, 59, 182, 27, 216, 157, 23, 172, 27, 212, 58, 47, 8, 216, 63, - 125, 71, 205, 68, 126, 46, 176, 186, 67, 25, 198, 129, 73, 194, 109, 102, - 249, 226, 156, 141, 113, 30, 53, 130, 150, 99, 119, 174, 228, 146, 104, 177, - 250, 207, 127, 160, 138, 117, 158, 160, 54, 186, 1, 1, 108, 228, 133, 171, - 148, 138, 18, 77, 243, 61, 236, 3, 131, 77, 122, 253, 206, 202, 46, 21, - 200, 213, 203, 0, 97, 112, 210, 131, 181, 22, 82, 75, 90, 109, 45, 204, - 87, 228, 130, 134, 103, 244, 218, 147, 42, 228, 22, 209, 50, 198, 40, 35, - 33, 44, 167, 231, 56, 221, 233, 162, 143, 87, 32, 203, 96, 7, 248, 217, - 29, 192, 66, 63, 46, 5, 83, 95, 21, 220, 66, 140, 234, 128, 221, 234, - 80, 39, 251, 200, 202, 9, 31, 194, 203, 30, 4, 155, 16, 178, 159, 159, - 199, 222, 103, 246, 0, 226, 33, 6, 76, 140, 32, 30, 142, 164, 139, 64, - 174, 117, 146, 159, 237, 153, 245, 167, 136, 18, 18, 86, 15, 108, 19, 95, - 152, 120, 75, 122, 29, 184, 149, 118, 17, 232, 4, 34, 98, 73, 41, 225, - 34, 168, 154, 245, 98, 145, 75, 2, 34, 28, 185, 19, 127, 147, 9, 112, - 237, 236, 49, 103, 192, 236, 235, 6, 70, 231, 20, 62, 205, 206, 49, 124, - 90, 157, 195, 13, 180, 38, 208, 10, 60, 244, 22, 21, 250, 134, 10, 189, - 163, 66, 223, 111, 40, 100, 133, 133, 70, 233, 66, 175, 55, 20, 178, 195, - 66, 94, 186, 208, 171, 13, 133, 106, 162, 208, 114, 33, 154, 247, 19, 21, - 250, 238, 206, 230, 213, 101, 33, 180, 114, 82, 74, 29, 245, 168, 216, 145, - 191, 161, 92, 67, 148, 131, 189, 24, 191, 217, 143, 84, 236, 39, 42, 245, - 127, 27, 10, 53, 69, 161, 145, 211, 227, 133, 94, 83, 33, 135, 10, 245, - 54, 20, 106, 201, 66, 253, 161, 90, 168, 79, 133, 134, 27, 10, 181, 69, - 161, 254, 120, 185, 251, 235, 53, 162, 66, 87, 84, 234, 136, 74, 189, 161, - 82, 248, 100, 118, 231, 219, 77, 101, 229, 216, 88, 122, 191, 170, 157, 255, - 138, 202, 254, 59, 151, 61, 37, 13, 244, 249, 207, 204, 193, 234, 112, 152, - 33, 178, 209, 6, 18, 139, 72, 70, 119, 145, 216, 68, 226, 221, 69, 130, - 131, 6, 7, 204, 29, 36, 56, 68, 194, 152, 131, 27, 104, 112, 56, 224, - 80, 184, 131, 4, 95, 62, 190, 248, 59, 72, 240, 85, 227, 107, 190, 131, - 4, 95, 44, 188, 159, 59, 40, 232, 53, 226, 43, 188, 139, 6, 251, 23, - 95, 21, 209, 72, 25, 102, 238, 246, 231, 236, 221, 149, 55, 145, 194, 11, - 38, 116, 3, 72, 208, 19, 215, 89, 17, 213, 168, 224, 87, 193, 220, 27, - 59, 113, 121, 194, 68, 127, 190, 201, 130, 108, 107, 96, 5, 231, 97, 13, - 119, 114, 228, 83, 189, 11, 55, 152, 211, 100, 69, 83, 35, 26, 197, 165, - 61, 12, 132, 198, 54, 69, 24, 63, 241, 93, 197, 70, 234, 21, 89, 8, - 223, 7, 247, 120, 131, 233, 14, 127, 108, 230, 134, 157, 178, 201, 104, 60, - 24, 121, 3, 20, 161, 66, 79, 130, 57, 87, 6, 58, 1, 27, 47, 250, - 67, 134, 125, 206, 102, 222, 45, 174, 42, 144, 38, 12, 240, 43, 25, 6, - 64, 63, 150, 143, 166, 83, 127, 224, 77, 156, 185, 18, 92, 50, 101, 2, - 248, 211, 110, 100, 33, 156, 98, 228, 218, 105, 221, 133, 21, 144, 18, 17, - 185, 103, 103, 52, 16, 78, 252, 105, 207, 233, 121, 35, 20, 6, 223, 56, - 232, 220, 15, 162, 225, 175, 11, 151, 70, 79, 30, 129, 225, 157, 73, 0, - 213, 161, 89, 49, 37, 61, 2, 19, 124, 250, 192, 4, 181, 170, 97, 87, - 13, 51, 83, 234, 14, 89, 10, 44, 5, 34, 78, 207, 152, 199, 108, 138, - 231, 161, 160, 89, 103, 241, 160, 7, 74, 20, 143, 80, 37, 198, 212, 98, - 154, 197, 101, 245, 120, 154, 46, 34, 88, 233, 90, 139, 28, 210, 222, 116, - 86, 222, 155, 53, 235, 129, 36, 251, 148, 237, 49, 82, 34, 107, 111, 170, - 152, 182, 135, 98, 127, 159, 235, 208, 242, 169, 24, 41, 164, 195, 203, 149, - 146, 141, 117, 164, 113, 114, 27, 3, 69, 4, 67, 238, 249, 182, 7, 27, - 84, 19, 183, 154, 168, 142, 19, 56, 110, 212, 184, 68, 241, 184, 12, 183, - 152, 0, 235, 30, 163, 211, 80, 138, 44, 147, 33, 111, 132, 56, 136, 117, - 129, 138, 114, 32, 69, 71, 46, 161, 154, 17, 70, 88, 212, 73, 176, 5, - 182, 117, 1, 93, 66, 202, 203, 12, 18, 83, 133, 240, 82, 105, 9, 115, - 107, 165, 53, 202, 70, 197, 130, 126, 109, 173, 159, 234, 43, 173, 25, 187, - 106, 148, 98, 121, 202, 149, 169, 135, 88, 39, 177, 202, 74, 119, 84, 86, - 222, 181, 178, 112, 247, 46, 162, 84, 194, 124, 124, 247, 61, 95, 250, 208, - 185, 82, 134, 43, 243, 245, 84, 74, 106, 183, 46, 103, 225, 33, 188, 169, - 16, 49, 255, 194, 129, 215, 187, 11, 179, 68, 139, 95, 44, 25, 45, 79, - 45, 50, 116, 110, 168, 80, 181, 152, 255, 3, 162, 31, 133, 84, 53, 212, - 125, 199, 136, 176, 162, 119, 67, 239, 98, 206, 84, 139, 96, 168, 12, 254, - 50, 141, 135, 143, 66, 59, 104, 181, 132, 81, 105, 183, 117, 252, 136, 202, - 240, 120, 160, 59, 147, 63, 62, 235, 255, 111, 207, 186, 101, 225, 248, 95, - 190, 82, 248, 211, 177, 203, 190, 118, 125, 223, 241, 189, 109, 126, 218, 176, - 108, 32, 168, 77, 114, 213, 144, 55, 92, 248, 35, 184, 31, 48, 132, 43, - 88, 240, 185, 39, 161, 123, 59, 27, 57, 232, 247, 202, 134, 46, 157, 206, - 34, 248, 241, 179, 106, 245, 230, 230, 166, 114, 129, 238, 130, 62, 225, 30, - 99, 72, 140, 89, 80, 189, 28, 123, 253, 234, 192, 11, 250, 139, 32, 168, - 54, 45, 84, 214, 90, 245, 102, 187, 85, 183, 237, 90, 203, 226, 235, 83, - 108, 214, 103, 68, 201, 18, 74, 32, 177, 41, 102, 1, 112, 254, 18, 65, - 77, 122, 23, 5, 167, 23, 20, 188, 178, 102, 21, 159, 107, 118, 213, 250, - 175, 188, 44, 227, 155, 141, 39, 149, 194, 36, 2, 179, 73, 85, 209, 132, - 204, 86, 68, 223, 20, 85, 168, 73, 165, 48, 41, 187, 10, 19, 155, 97, - 42, 55, 53, 101, 67, 226, 137, 165, 40, 81, 84, 52, 151, 194, 243, 25, - 240, 207, 115, 102, 84, 12, 147, 237, 17, 38, 43, 92, 193, 247, 249, 173, - 197, 175, 237, 115, 254, 93, 19, 223, 245, 243, 255, 249, 204, 96, 17, 24, - 10, 185, 190, 146, 115, 49, 142, 18, 238, 138, 27, 92, 229, 74, 123, 103, - 80, 18, 150, 89, 248, 1, 69, 181, 54, 254, 168, 195, 15, 19, 146, 248, - 125, 244, 178, 125, 158, 163, 223, 240, 76, 79, 241, 193, 160, 149, 34, 206, - 229, 1, 134, 149, 231, 117, 148, 65, 64, 160, 21, 149, 95, 226, 41, 166, - 89, 210, 234, 69, 60, 207, 185, 240, 112, 233, 53, 229, 121, 153, 44, 85, - 195, 82, 176, 97, 146, 197, 106, 97, 49, 216, 29, 164, 203, 133, 119, 171, - 83, 185, 232, 118, 245, 168, 92, 252, 126, 123, 209, 19, 176, 15, 103, 4, - 100, 203, 235, 106, 196, 26, 222, 200, 104, 120, 35, 163, 1, 102, 188, 225, - 102, 86, 195, 205, 140, 114, 141, 120, 195, 27, 89, 13, 111, 220, 209, 112, - 139, 26, 238, 143, 207, 108, 189, 6, 47, 150, 145, 246, 30, 135, 67, 159, - 137, 184, 115, 113, 228, 165, 204, 213, 18, 230, 207, 168, 162, 68, 97, 76, - 45, 171, 91, 98, 114, 234, 34, 172, 39, 133, 230, 132, 225, 1, 127, 64, - 99, 54, 184, 202, 50, 99, 42, 2, 19, 179, 235, 237, 34, 30, 9, 84, - 42, 250, 106, 101, 232, 195, 117, 213, 52, 56, 24, 149, 205, 42, 20, 168, - 239, 127, 62, 19, 152, 235, 176, 243, 130, 38, 244, 96, 148, 230, 126, 193, - 49, 6, 175, 2, 152, 117, 219, 124, 202, 126, 193, 99, 12, 232, 226, 240, - 210, 82, 47, 241, 228, 153, 102, 195, 63, 109, 234, 151, 255, 43, 157, 237, - 74, 120, 52, 102, 219, 136, 175, 107, 194, 247, 255, 124, 102, 210, 100, 70, - 209, 10, 6, 10, 13, 14, 58, 161, 150, 99, 65, 4, 69, 77, 139, 87, - 175, 202, 223, 188, 123, 93, 14, 197, 44, 249, 230, 113, 24, 232, 201, 132, - 80, 199, 96, 40, 206, 110, 25, 224, 14, 184, 173, 76, 98, 57, 40, 27, - 81, 113, 242, 176, 197, 37, 142, 175, 131, 135, 35, 151, 59, 57, 169, 193, - 209, 213, 168, 18, 226, 84, 102, 27, 217, 230, 101, 82, 10, 138, 176, 247, - 157, 169, 78, 119, 97, 112, 247, 99, 223, 93, 74, 196, 163, 251, 3, 231, - 63, 239, 29, 28, 142, 96, 227, 186, 201, 61, 8, 5, 137, 127, 93, 92, - 160, 51, 255, 142, 146, 68, 6, 181, 170, 126, 225, 253, 182, 133, 104, 247, - 198, 191, 69, 207, 255, 222, 167, 252, 4, 47, 29, 255, 138, 93, 194, 75, - 252, 84, 31, 224, 141, 87, 30, 124, 250, 207, 64, 160, 79, 159, 248, 35, - 148, 9, 253, 237, 147, 126, 138, 215, 159, 252, 19, 32, 100, 15, 189, 135, - 141, 46, 151, 127, 247, 39, 248, 97, 232, 9, 220, 187, 191, 115, 227, 31, - 85, 185, 127, 158, 42, 55, 216, 162, 203, 37, 225, 46, 164, 56, 117, 175, - 167, 203, 29, 2, 238, 192, 142, 189, 157, 161, 226, 85, 69, 58, 14, 171, - 166, 173, 242, 142, 127, 201, 65, 195, 20, 192, 137, 252, 122, 11, 56, 45, - 5, 216, 21, 58, 226, 54, 143, 54, 173, 255, 156, 91, 229, 191, 135, 167, - 60, 211, 86, 141, 178, 109, 60, 179, 215, 231, 123, 51, 175, 10, 131, 119, - 159, 157, 245, 167, 65, 225, 251, 162, 30, 120, 19, 248, 194, 80, 3, 218, - 10, 4, 104, 19, 136, 212, 114, 173, 178, 109, 97, 57, 25, 230, 34, 192, - 116, 4, 72, 129, 66, 251, 57, 196, 29, 42, 92, 65, 138, 161, 179, 171, - 231, 193, 247, 58, 43, 149, 174, 244, 220, 53, 186, 18, 92, 85, 131, 239, - 247, 115, 215, 20, 171, 225, 170, 100, 22, 233, 242, 251, 179, 171, 243, 189, - 78, 1, 191, 14, 140, 47, 11, 38, 43, 179, 107, 163, 248, 236, 218, 132, - 202, 138, 251, 236, 251, 60, 193, 226, 162, 129, 38, 127, 2, 51, 23, 12, - 43, 204, 102, 189, 10, 89, 82, 160, 229, 101, 133, 229, 207, 152, 51, 119, - 38, 86, 225, 88, 63, 45, 238, 193, 211, 84, 103, 158, 126, 168, 191, 208, - 13, 118, 158, 87, 48, 213, 96, 48, 228, 74, 184, 229, 209, 250, 65, 165, - 194, 74, 9, 180, 181, 61, 186, 17, 35, 147, 129, 10, 26, 195, 226, 70, - 168, 130, 91, 105, 75, 218, 170, 166, 11, 105, 171, 126, 176, 70, 49, 190, - 82, 225, 118, 47, 185, 61, 174, 180, 238, 121, 24, 226, 213, 119, 70, 100, - 203, 11, 91, 180, 149, 69, 54, 32, 209, 253, 171, 156, 240, 23, 34, 16, - 131, 54, 86, 31, 90, 203, 192, 19, 246, 80, 128, 102, 206, 104, 54, 116, - 244, 149, 102, 61, 93, 243, 221, 99, 204, 200, 53, 57, 118, 226, 182, 167, - 90, 125, 203, 72, 26, 179, 149, 81, 105, 237, 157, 9, 83, 153, 16, 63, - 126, 184, 62, 231, 6, 96, 63, 231, 242, 90, 189, 211, 49, 191, 204, 21, - 190, 129, 23, 248, 14, 95, 49, 188, 30, 248, 90, 86, 11, 195, 178, 89, - 44, 62, 227, 57, 183, 123, 176, 49, 170, 22, 110, 32, 105, 159, 200, 68, - 126, 156, 120, 63, 119, 246, 141, 254, 78, 255, 254, 60, 159, 139, 30, 24, - 159, 55, 91, 29, 31, 155, 21, 49, 125, 60, 63, 232, 64, 203, 211, 84, - 203, 83, 134, 107, 161, 6, 251, 13, 134, 228, 98, 103, 104, 222, 37, 129, - 137, 189, 219, 46, 65, 186, 168, 23, 153, 248, 33, 71, 75, 103, 194, 190, - 118, 250, 115, 194, 5, 143, 206, 71, 213, 109, 15, 146, 164, 20, 144, 41, - 232, 112, 78, 150, 113, 32, 155, 56, 109, 221, 188, 61, 122, 195, 225, 108, - 183, 52, 71, 82, 109, 111, 81, 72, 249, 49, 141, 250, 137, 32, 117, 183, - 180, 73, 16, 109, 111, 146, 36, 252, 152, 22, 33, 240, 212, 221, 205, 65, - 138, 237, 109, 33, 170, 143, 105, 8, 7, 251, 63, 117, 38, 151, 234, 162, - 253, 98, 52, 98, 115, 204, 129, 149, 238, 221, 208, 65, 164, 51, 248, 133, - 18, 237, 123, 145, 26, 73, 85, 249, 100, 101, 25, 237, 177, 182, 181, 231, - 81, 124, 248, 68, 78, 130, 121, 192, 237, 44, 159, 34, 201, 162, 226, 74, - 246, 74, 66, 4, 240, 175, 133, 221, 101, 5, 203, 16, 142, 34, 150, 100, - 66, 35, 152, 147, 214, 75, 80, 174, 194, 250, 168, 196, 68, 149, 178, 137, - 138, 100, 252, 97, 177, 30, 255, 97, 63, 133, 69, 13, 86, 41, 84, 59, - 211, 55, 172, 110, 244, 221, 160, 12, 166, 53, 49, 157, 105, 45, 76, 102, - 90, 27, 83, 209, 223, 2, 53, 97, 168, 118, 237, 145, 209, 255, 211, 156, - 3, 213, 113, 56, 170, 208, 226, 134, 90, 134, 118, 119, 162, 93, 92, 225, - 249, 228, 73, 199, 94, 99, 243, 113, 141, 19, 234, 49, 213, 190, 49, 131, - 73, 111, 60, 202, 13, 187, 42, 3, 173, 94, 44, 4, 223, 188, 251, 94, - 89, 7, 164, 118, 77, 252, 206, 92, 5, 112, 35, 112, 55, 75, 217, 237, - 16, 138, 168, 62, 134, 165, 40, 91, 141, 187, 219, 163, 16, 166, 155, 21, - 51, 17, 82, 8, 63, 166, 101, 124, 107, 115, 119, 163, 56, 205, 221, 237, - 17, 52, 127, 12, 223, 125, 255, 200, 119, 31, 249, 238, 61, 249, 46, 223, - 153, 253, 46, 182, 75, 135, 50, 57, 113, 232, 194, 185, 46, 43, 203, 237, - 5, 136, 168, 130, 205, 154, 130, 205, 90, 130, 205, 218, 130, 205, 214, 56, - 155, 173, 115, 54, 219, 224, 108, 182, 73, 92, 182, 69, 76, 22, 56, 239, - 83, 44, 1, 34, 56, 43, 41, 245, 178, 126, 120, 161, 155, 10, 42, 160, - 60, 130, 72, 112, 97, 227, 94, 92, 56, 190, 219, 216, 204, 132, 83, 178, - 123, 140, 7, 191, 118, 122, 10, 15, 70, 52, 69, 229, 119, 38, 15, 126, - 29, 66, 206, 165, 153, 12, 72, 252, 102, 69, 17, 221, 34, 218, 20, 179, - 161, 161, 151, 73, 249, 49, 44, 231, 69, 153, 31, 126, 220, 205, 255, 36, - 85, 90, 246, 196, 9, 144, 65, 247, 49, 77, 58, 220, 169, 73, 135, 59, - 54, 233, 240, 33, 154, 244, 200, 152, 31, 25, 243, 195, 49, 102, 140, 211, - 187, 123, 200, 38, 210, 22, 64, 123, 71, 35, 119, 212, 157, 66, 55, 140, - 156, 25, 121, 231, 117, 149, 234, 144, 95, 81, 132, 38, 244, 38, 193, 147, - 246, 134, 174, 181, 139, 235, 156, 226, 23, 67, 55, 17, 28, 177, 27, 107, - 201, 70, 230, 15, 217, 82, 228, 254, 104, 126, 175, 48, 115, 140, 77, 156, - 197, 204, 211, 124, 244, 78, 62, 45, 159, 59, 155, 79, 159, 28, 189, 80, - 248, 244, 172, 239, 232, 202, 239, 76, 62, 125, 226, 123, 99, 199, 79, 109, - 193, 81, 206, 75, 178, 105, 73, 186, 125, 47, 46, 41, 223, 223, 240, 176, - 186, 155, 69, 236, 59, 100, 103, 183, 63, 197, 16, 132, 59, 53, 45, 34, - 222, 222, 184, 136, 246, 99, 154, 247, 30, 39, 239, 142, 173, 11, 105, 183, - 55, 46, 36, 253, 152, 182, 189, 228, 161, 90, 197, 9, 255, 139, 91, 55, - 52, 227, 84, 119, 18, 115, 71, 9, 145, 64, 113, 169, 249, 63, 101, 97, - 187, 190, 132, 58, 174, 29, 223, 19, 126, 11, 81, 56, 133, 140, 255, 31, - 89, 248, 167, 207, 194, 91, 85, 163, 89, 53, 91, 27, 88, 56, 240, 144, - 173, 44, 124, 20, 97, 21, 144, 156, 122, 166, 173, 76, 179, 108, 214, 214, - 231, 157, 14, 119, 247, 11, 112, 224, 21, 138, 103, 32, 216, 156, 131, 44, - 104, 22, 215, 172, 235, 92, 163, 239, 189, 89, 47, 155, 205, 53, 59, 194, - 159, 173, 178, 213, 88, 99, 116, 137, 249, 34, 232, 112, 171, 168, 146, 239, - 91, 131, 16, 22, 2, 213, 241, 72, 153, 239, 135, 35, 84, 128, 83, 84, - 168, 190, 60, 69, 24, 207, 117, 187, 162, 142, 4, 226, 119, 13, 254, 234, - 240, 215, 128, 191, 38, 252, 181, 224, 175, 141, 72, 224, 198, 122, 149, 95, - 109, 106, 105, 158, 112, 194, 161, 118, 93, 59, 202, 99, 109, 88, 116, 101, - 181, 116, 171, 189, 230, 8, 224, 23, 44, 207, 3, 115, 231, 128, 138, 81, - 48, 120, 106, 205, 249, 126, 206, 245, 48, 1, 62, 11, 144, 120, 148, 63, - 87, 79, 100, 108, 60, 145, 49, 45, 248, 44, 117, 224, 55, 16, 157, 93, - 157, 63, 55, 190, 236, 79, 103, 203, 2, 191, 210, 233, 75, 183, 207, 247, - 58, 104, 161, 136, 106, 250, 147, 57, 175, 240, 204, 214, 219, 112, 3, 12, - 62, 79, 161, 49, 102, 133, 147, 57, 80, 236, 231, 16, 221, 120, 188, 24, - 21, 78, 116, 252, 28, 120, 206, 101, 193, 52, 62, 156, 161, 109, 90, 77, - 215, 154, 231, 69, 157, 8, 137, 246, 20, 207, 126, 252, 233, 188, 192, 43, - 180, 207, 117, 141, 146, 45, 37, 185, 65, 201, 13, 76, 182, 149, 228, 54, - 37, 183, 149, 27, 158, 154, 116, 199, 83, 139, 127, 217, 250, 123, 126, 27, - 186, 19, 244, 71, 55, 16, 172, 16, 123, 169, 4, 139, 235, 158, 188, 43, - 94, 213, 247, 228, 205, 240, 170, 181, 39, 239, 177, 143, 67, 170, 144, 143, - 197, 176, 206, 235, 185, 215, 216, 207, 204, 210, 129, 237, 26, 231, 123, 193, - 175, 62, 200, 205, 110, 185, 14, 101, 177, 160, 1, 5, 225, 166, 238, 237, - 188, 240, 69, 23, 135, 72, 208, 249, 66, 191, 158, 79, 131, 130, 8, 69, - 78, 111, 170, 204, 94, 195, 200, 13, 91, 161, 231, 120, 195, 50, 18, 145, - 210, 60, 15, 91, 24, 81, 166, 18, 145, 210, 58, 15, 91, 31, 81, 42, - 137, 236, 188, 88, 164, 211, 180, 92, 172, 99, 74, 236, 253, 94, 225, 21, - 212, 0, 73, 197, 124, 78, 184, 109, 100, 28, 45, 177, 5, 211, 228, 24, - 207, 165, 215, 250, 84, 32, 226, 112, 62, 164, 236, 127, 55, 203, 28, 56, - 239, 83, 231, 58, 32, 186, 208, 124, 204, 56, 218, 1, 238, 149, 43, 104, - 188, 175, 201, 98, 209, 214, 27, 217, 65, 51, 97, 174, 222, 34, 136, 136, - 20, 147, 86, 55, 159, 25, 85, 107, 205, 193, 10, 16, 209, 190, 47, 115, - 132, 155, 131, 143, 46, 224, 34, 9, 107, 52, 4, 106, 131, 144, 56, 244, - 154, 110, 81, 97, 70, 102, 143, 32, 175, 33, 178, 66, 77, 16, 133, 43, - 63, 30, 85, 54, 99, 116, 72, 102, 182, 5, 157, 92, 132, 129, 204, 142, - 85, 71, 56, 251, 53, 194, 99, 73, 184, 182, 40, 47, 33, 38, 144, 157, - 30, 31, 42, 2, 25, 198, 39, 80, 126, 103, 10, 100, 167, 176, 106, 220, - 189, 9, 68, 138, 237, 146, 4, 81, 125, 204, 246, 239, 152, 194, 91, 222, - 221, 20, 78, 179, 189, 49, 130, 238, 163, 54, 200, 219, 21, 150, 135, 153, - 250, 202, 84, 99, 14, 31, 85, 150, 143, 98, 213, 223, 100, 103, 28, 109, - 65, 159, 133, 214, 228, 230, 154, 149, 232, 200, 17, 77, 41, 66, 69, 97, - 79, 254, 208, 172, 167, 24, 73, 132, 95, 224, 142, 116, 143, 44, 33, 80, - 247, 135, 27, 209, 39, 74, 56, 99, 43, 81, 147, 189, 181, 166, 141, 85, - 217, 233, 170, 172, 123, 85, 197, 81, 41, 228, 206, 55, 246, 180, 123, 178, - 101, 242, 97, 227, 143, 176, 39, 235, 205, 200, 182, 179, 178, 225, 86, 114, - 193, 140, 152, 237, 199, 105, 133, 203, 21, 244, 208, 252, 3, 212, 2, 37, - 94, 113, 136, 31, 247, 17, 170, 94, 101, 69, 185, 83, 133, 128, 157, 177, - 89, 133, 64, 176, 59, 202, 154, 69, 104, 1, 122, 236, 42, 91, 225, 43, - 161, 231, 182, 48, 233, 136, 110, 59, 167, 86, 104, 63, 122, 233, 56, 162, - 24, 193, 187, 172, 32, 130, 114, 199, 133, 68, 82, 127, 76, 3, 113, 173, - 222, 169, 125, 10, 225, 110, 18, 192, 67, 180, 238, 113, 181, 123, 92, 237, - 30, 78, 15, 204, 193, 105, 62, 250, 136, 142, 170, 33, 156, 180, 63, 133, - 47, 71, 160, 41, 31, 117, 26, 23, 99, 159, 119, 50, 105, 222, 77, 25, - 108, 154, 34, 243, 80, 48, 63, 194, 162, 99, 85, 198, 1, 235, 36, 114, - 25, 15, 190, 133, 0, 151, 72, 212, 21, 71, 117, 106, 66, 202, 227, 91, - 198, 70, 194, 154, 79, 221, 96, 58, 90, 8, 247, 217, 48, 48, 18, 134, - 66, 186, 197, 216, 98, 121, 30, 10, 9, 46, 240, 75, 153, 215, 81, 192, - 174, 233, 133, 80, 60, 82, 52, 46, 55, 30, 115, 42, 13, 203, 177, 147, - 27, 238, 42, 79, 198, 223, 48, 94, 60, 12, 169, 24, 69, 76, 133, 39, - 255, 146, 227, 144, 108, 8, 169, 234, 187, 191, 46, 60, 140, 83, 27, 198, - 63, 159, 223, 76, 17, 210, 21, 30, 120, 196, 123, 108, 62, 101, 55, 83, - 255, 138, 205, 252, 41, 14, 242, 165, 26, 76, 240, 21, 226, 150, 4, 139, - 177, 203, 129, 74, 134, 14, 143, 54, 201, 203, 207, 167, 51, 94, 7, 197, - 8, 165, 128, 130, 104, 109, 236, 48, 12, 124, 23, 229, 240, 176, 218, 1, - 98, 159, 204, 241, 17, 98, 196, 97, 126, 15, 24, 34, 162, 130, 97, 112, - 195, 9, 15, 139, 26, 192, 102, 87, 132, 120, 236, 45, 68, 224, 246, 233, - 36, 140, 11, 75, 106, 47, 10, 203, 25, 54, 183, 48, 95, 206, 144, 149, - 140, 150, 209, 93, 134, 14, 98, 177, 192, 246, 107, 218, 155, 115, 143, 98, - 26, 61, 225, 141, 23, 97, 164, 83, 53, 110, 43, 60, 220, 116, 84, 172, - 108, 236, 87, 122, 15, 46, 70, 38, 29, 33, 126, 156, 196, 133, 113, 233, - 161, 166, 52, 160, 2, 10, 174, 137, 85, 134, 209, 133, 209, 9, 129, 247, - 198, 148, 247, 5, 197, 185, 197, 251, 135, 57, 34, 188, 101, 86, 23, 94, - 122, 216, 48, 10, 248, 42, 159, 46, 163, 129, 240, 111, 17, 184, 23, 139, - 17, 187, 17, 17, 103, 197, 107, 19, 141, 153, 199, 99, 19, 247, 220, 249, - 13, 246, 14, 13, 11, 17, 90, 151, 154, 134, 5, 49, 42, 59, 62, 29, - 162, 14, 93, 99, 128, 222, 9, 198, 162, 45, 243, 232, 188, 20, 37, 179, - 183, 152, 192, 123, 133, 49, 15, 175, 207, 149, 193, 121, 163, 240, 145, 127, - 118, 216, 72, 169, 195, 181, 234, 89, 88, 215, 10, 19, 144, 18, 248, 147, - 231, 32, 97, 187, 190, 15, 29, 147, 127, 177, 113, 138, 56, 192, 95, 38, - 174, 59, 112, 41, 14, 174, 191, 152, 168, 147, 176, 146, 87, 144, 3, 57, - 18, 49, 193, 202, 145, 80, 78, 8, 127, 151, 49, 128, 191, 74, 101, 157, - 11, 195, 22, 214, 24, 185, 120, 230, 15, 94, 21, 62, 147, 128, 112, 240, - 211, 44, 238, 21, 110, 62, 179, 202, 102, 145, 32, 84, 139, 165, 206, 217, - 169, 126, 172, 31, 234, 230, 249, 62, 123, 149, 23, 112, 177, 200, 246, 245, - 178, 141, 64, 199, 183, 192, 175, 89, 85, 110, 36, 8, 184, 57, 151, 13, - 220, 220, 172, 63, 213, 205, 92, 4, 22, 109, 224, 6, 106, 85, 230, 158, - 195, 22, 34, 68, 223, 206, 208, 112, 189, 2, 188, 24, 94, 142, 87, 248, - 140, 12, 164, 47, 246, 94, 177, 18, 43, 152, 229, 139, 226, 158, 64, 113, - 222, 131, 166, 113, 99, 234, 60, 153, 130, 115, 208, 150, 140, 0, 142, 216, - 61, 112, 143, 160, 115, 51, 28, 124, 48, 42, 245, 253, 179, 64, 15, 132, - 237, 118, 25, 214, 179, 107, 232, 38, 234, 5, 236, 158, 2, 205, 20, 232, - 230, 47, 242, 218, 100, 156, 255, 2, 42, 143, 20, 77, 120, 139, 46, 159, - 94, 93, 132, 139, 149, 232, 43, 27, 88, 124, 236, 45, 227, 91, 0, 17, - 103, 2, 211, 45, 90, 110, 126, 255, 59, 247, 221, 249, 194, 159, 100, 220, - 28, 86, 76, 205, 18, 195, 254, 212, 157, 3, 203, 185, 229, 171, 146, 207, - 47, 116, 229, 119, 166, 99, 236, 187, 185, 239, 78, 46, 129, 217, 169, 43, - 71, 179, 158, 237, 231, 154, 112, 207, 49, 27, 132, 141, 210, 80, 44, 185, - 239, 118, 179, 85, 130, 165, 67, 131, 28, 159, 113, 84, 82, 254, 201, 49, - 72, 21, 27, 108, 111, 194, 142, 22, 241, 232, 136, 102, 178, 93, 111, 156, - 219, 237, 68, 169, 152, 144, 17, 42, 149, 109, 237, 178, 58, 190, 70, 195, - 107, 96, 245, 17, 228, 149, 89, 135, 71, 135, 53, 90, 109, 46, 249, 14, - 198, 201, 240, 28, 49, 78, 134, 130, 122, 130, 200, 170, 167, 168, 30, 5, - 242, 191, 72, 32, 71, 95, 226, 169, 112, 123, 139, 175, 193, 40, 95, 141, - 93, 140, 104, 42, 2, 135, 19, 140, 109, 64, 111, 146, 203, 96, 98, 254, - 113, 79, 168, 209, 37, 60, 239, 124, 56, 214, 17, 119, 109, 64, 33, 233, - 123, 240, 52, 30, 66, 185, 221, 129, 73, 178, 82, 177, 71, 188, 217, 116, - 84, 241, 198, 213, 217, 162, 87, 5, 185, 156, 34, 20, 87, 77, 88, 113, - 254, 130, 149, 174, 81, 53, 237, 170, 145, 229, 168, 229, 75, 182, 147, 58, - 229, 40, 201, 44, 4, 103, 8, 93, 110, 108, 225, 114, 35, 34, 5, 163, - 158, 30, 255, 72, 8, 71, 95, 43, 14, 225, 176, 106, 134, 167, 31, 13, - 228, 166, 18, 57, 31, 237, 78, 26, 200, 8, 197, 41, 129, 60, 18, 95, - 105, 230, 83, 126, 10, 25, 59, 191, 145, 27, 130, 4, 11, 220, 184, 29, - 8, 91, 156, 222, 12, 192, 235, 245, 167, 236, 107, 7, 22, 2, 201, 97, - 253, 233, 5, 92, 234, 177, 171, 148, 196, 255, 10, 125, 159, 120, 68, 119, - 30, 141, 214, 194, 233, 158, 66, 7, 144, 185, 176, 146, 197, 184, 210, 177, - 143, 193, 199, 99, 24, 63, 119, 203, 244, 143, 172, 226, 211, 217, 187, 215, - 97, 58, 103, 79, 41, 62, 152, 118, 50, 1, 200, 149, 46, 64, 0, 147, - 116, 102, 174, 52, 153, 122, 129, 75, 240, 232, 118, 180, 169, 70, 188, 115, - 111, 50, 112, 111, 113, 191, 142, 125, 16, 186, 243, 229, 96, 51, 118, 233, - 163, 126, 104, 165, 29, 236, 193, 224, 170, 34, 156, 27, 205, 156, 171, 10, - 155, 136, 233, 20, 18, 1, 193, 6, 183, 187, 212, 28, 184, 107, 154, 137, - 7, 204, 152, 104, 239, 220, 145, 219, 159, 151, 101, 80, 28, 206, 92, 105, - 202, 5, 148, 195, 77, 15, 244, 100, 130, 34, 222, 68, 210, 141, 55, 246, - 112, 229, 135, 158, 122, 23, 151, 74, 12, 18, 59, 206, 94, 156, 39, 228, - 15, 68, 46, 199, 81, 69, 167, 104, 56, 222, 65, 238, 201, 19, 218, 36, - 246, 55, 74, 46, 82, 79, 42, 50, 217, 231, 176, 245, 222, 143, 20, 128, - 60, 147, 116, 114, 84, 50, 242, 34, 136, 105, 230, 146, 0, 165, 86, 106, - 179, 190, 131, 30, 241, 107, 111, 52, 130, 217, 50, 114, 37, 243, 160, 161, - 173, 10, 100, 188, 47, 177, 109, 212, 139, 25, 49, 110, 227, 122, 76, 161, - 158, 120, 17, 196, 122, 42, 94, 11, 105, 33, 101, 202, 27, 39, 184, 162, - 78, 251, 37, 65, 17, 166, 132, 20, 244, 58, 5, 69, 94, 149, 206, 40, - 3, 215, 214, 140, 86, 242, 39, 186, 11, 59, 244, 145, 223, 125, 34, 252, - 206, 168, 90, 237, 170, 105, 37, 249, 93, 55, 49, 143, 227, 231, 85, 194, - 188, 41, 118, 72, 165, 64, 54, 145, 212, 16, 63, 163, 138, 48, 232, 149, - 244, 154, 146, 110, 42, 233, 117, 37, 221, 82, 210, 27, 235, 16, 181, 63, - 204, 183, 149, 252, 102, 186, 21, 217, 55, 110, 221, 69, 8, 187, 39, 133, - 180, 29, 35, 69, 39, 129, 204, 26, 77, 99, 51, 157, 41, 142, 254, 18, - 253, 89, 208, 234, 31, 180, 198, 7, 173, 249, 65, 107, 21, 89, 178, 195, - 73, 145, 75, 191, 58, 171, 15, 92, 134, 74, 46, 58, 18, 236, 179, 148, - 122, 89, 176, 222, 168, 215, 103, 252, 124, 82, 215, 232, 74, 196, 63, 40, - 193, 246, 214, 193, 117, 200, 96, 207, 59, 81, 8, 174, 26, 198, 20, 42, - 174, 101, 204, 39, 225, 252, 109, 203, 109, 118, 143, 234, 178, 217, 228, 44, - 52, 73, 225, 232, 168, 132, 1, 22, 12, 101, 200, 17, 246, 121, 133, 157, - 69, 7, 149, 109, 26, 54, 92, 103, 17, 37, 193, 168, 41, 99, 61, 184, - 18, 238, 225, 143, 178, 121, 103, 21, 182, 168, 130, 149, 121, 17, 160, 231, - 134, 113, 85, 89, 75, 105, 143, 71, 34, 41, 81, 117, 232, 220, 39, 127, - 89, 225, 47, 155, 137, 31, 6, 115, 16, 196, 77, 42, 188, 203, 28, 19, - 175, 132, 111, 139, 12, 92, 98, 203, 104, 214, 162, 182, 113, 37, 141, 191, - 140, 77, 139, 169, 119, 237, 178, 151, 174, 130, 169, 167, 44, 167, 144, 215, - 29, 40, 121, 250, 230, 172, 44, 248, 238, 83, 247, 2, 152, 209, 36, 92, - 168, 179, 194, 168, 71, 214, 178, 178, 50, 149, 79, 39, 106, 0, 22, 135, - 231, 93, 168, 133, 77, 230, 168, 22, 181, 66, 109, 33, 151, 70, 59, 177, - 52, 166, 246, 252, 225, 242, 24, 215, 30, 120, 227, 197, 88, 245, 244, 83, - 150, 15, 212, 220, 190, 66, 45, 13, 174, 23, 120, 145, 110, 168, 172, 128, - 212, 35, 143, 152, 211, 255, 128, 69, 10, 36, 242, 122, 118, 164, 151, 236, - 41, 145, 33, 161, 3, 179, 228, 211, 49, 83, 84, 239, 135, 104, 133, 57, - 226, 72, 200, 100, 38, 83, 96, 54, 240, 155, 152, 203, 202, 116, 203, 141, - 146, 247, 230, 255, 177, 247, 229, 253, 105, 35, 201, 223, 255, 243, 42, 52, - 44, 217, 216, 150, 112, 35, 9, 129, 148, 172, 179, 31, 219, 216, 198, 241, - 133, 111, 108, 111, 146, 31, 135, 4, 194, 32, 97, 9, 196, 225, 245, 123, - 127, 170, 186, 117, 130, 176, 51, 179, 199, 204, 236, 227, 221, 137, 145, 90, - 213, 173, 86, 31, 85, 213, 221, 85, 223, 10, 162, 199, 48, 118, 69, 163, - 120, 32, 136, 38, 172, 142, 129, 103, 242, 152, 200, 88, 18, 247, 101, 139, - 102, 83, 54, 114, 202, 203, 7, 106, 144, 193, 56, 102, 224, 95, 71, 205, - 132, 253, 232, 48, 131, 147, 173, 231, 7, 115, 32, 152, 39, 223, 162, 216, - 47, 209, 2, 251, 65, 250, 70, 35, 23, 249, 65, 16, 45, 16, 13, 131, - 19, 198, 118, 203, 148, 237, 110, 248, 88, 148, 62, 167, 44, 83, 102, 187, - 150, 19, 191, 231, 164, 239, 57, 121, 61, 136, 216, 177, 201, 106, 253, 108, - 194, 95, 202, 73, 67, 99, 18, 12, 199, 226, 177, 66, 130, 112, 113, 12, - 1, 176, 31, 161, 65, 46, 45, 44, 94, 231, 70, 111, 240, 198, 165, 30, - 75, 229, 146, 67, 179, 17, 48, 69, 184, 20, 194, 171, 84, 251, 139, 29, - 39, 244, 141, 139, 111, 60, 162, 231, 64, 97, 65, 139, 223, 133, 41, 227, - 224, 158, 239, 91, 132, 7, 20, 154, 252, 45, 170, 119, 198, 242, 103, 101, - 44, 43, 180, 223, 96, 156, 193, 32, 102, 191, 139, 177, 31, 197, 188, 252, - 18, 96, 226, 48, 155, 165, 196, 184, 124, 101, 240, 99, 105, 41, 99, 157, - 134, 74, 0, 65, 22, 108, 59, 61, 220, 4, 103, 155, 86, 163, 239, 27, - 35, 141, 124, 154, 208, 138, 54, 158, 176, 194, 148, 54, 69, 222, 170, 11, - 59, 236, 53, 60, 112, 117, 64, 23, 137, 140, 141, 194, 193, 190, 73, 141, - 82, 18, 180, 45, 211, 77, 158, 141, 139, 24, 56, 119, 2, 163, 128, 197, - 220, 240, 237, 94, 224, 7, 6, 203, 140, 110, 173, 103, 87, 42, 38, 177, - 21, 109, 150, 141, 75, 118, 138, 15, 185, 97, 28, 251, 215, 49, 127, 156, - 118, 27, 163, 108, 56, 249, 138, 110, 208, 131, 220, 93, 4, 121, 194, 189, - 184, 17, 76, 250, 67, 11, 55, 245, 40, 111, 193, 249, 186, 20, 191, 236, - 109, 32, 207, 168, 118, 241, 131, 18, 31, 204, 243, 122, 152, 247, 231, 18, - 92, 5, 51, 134, 85, 58, 120, 224, 223, 177, 135, 239, 252, 225, 247, 226, - 15, 207, 177, 131, 131, 67, 28, 32, 99, 10, 135, 238, 46, 6, 108, 201, - 39, 14, 19, 130, 217, 228, 70, 166, 0, 46, 61, 215, 182, 130, 115, 248, - 145, 205, 53, 16, 13, 7, 30, 211, 195, 110, 119, 115, 185, 48, 19, 15, - 253, 225, 189, 93, 180, 253, 154, 209, 19, 11, 125, 10, 12, 201, 196, 173, - 148, 70, 223, 127, 153, 192, 193, 39, 15, 26, 51, 174, 169, 115, 99, 168, - 33, 53, 34, 0, 229, 4, 190, 7, 218, 15, 231, 108, 31, 116, 19, 27, - 205, 18, 240, 236, 221, 106, 235, 78, 242, 93, 21, 219, 250, 56, 66, 227, - 15, 12, 44, 3, 52, 120, 2, 232, 31, 129, 28, 198, 206, 48, 55, 55, - 55, 233, 201, 135, 61, 164, 12, 192, 55, 45, 232, 67, 151, 99, 166, 65, - 195, 66, 211, 138, 153, 61, 118, 18, 39, 159, 241, 87, 133, 92, 241, 191, - 127, 186, 1, 42, 95, 17, 254, 75, 97, 206, 113, 198, 23, 133, 26, 113, - 116, 99, 235, 217, 52, 96, 13, 43, 160, 148, 198, 128, 150, 49, 186, 135, - 239, 57, 32, 0, 213, 142, 254, 8, 8, 119, 44, 48, 165, 239, 89, 250, - 190, 86, 228, 65, 81, 122, 193, 67, 142, 194, 226, 11, 86, 30, 37, 15, - 29, 60, 91, 15, 217, 251, 45, 59, 89, 254, 148, 21, 128, 121, 253, 139, - 6, 56, 241, 195, 229, 229, 207, 26, 26, 24, 52, 112, 216, 24, 117, 127, - 140, 6, 195, 23, 196, 190, 199, 11, 206, 102, 223, 198, 229, 134, 198, 178, - 252, 9, 190, 63, 107, 114, 89, 32, 200, 46, 10, 16, 95, 3, 166, 115, - 15, 149, 192, 5, 111, 151, 34, 250, 18, 227, 238, 245, 47, 65, 116, 150, - 18, 183, 100, 241, 64, 131, 38, 103, 120, 12, 48, 74, 3, 119, 118, 137, - 140, 219, 34, 155, 17, 99, 21, 36, 223, 63, 133, 5, 240, 224, 168, 63, - 203, 38, 135, 169, 177, 91, 230, 216, 194, 160, 213, 169, 50, 235, 159, 43, - 41, 130, 18, 40, 185, 37, 186, 125, 224, 167, 35, 26, 248, 228, 37, 63, - 201, 151, 94, 132, 82, 140, 66, 142, 229, 100, 136, 225, 249, 46, 208, 48, - 141, 55, 37, 111, 156, 198, 71, 183, 75, 196, 105, 94, 33, 171, 171, 166, - 59, 178, 59, 80, 245, 69, 65, 221, 13, 30, 8, 233, 201, 233, 16, 110, - 108, 223, 104, 205, 93, 79, 26, 155, 178, 61, 241, 109, 238, 1, 174, 253, - 13, 242, 228, 245, 133, 222, 14, 175, 233, 78, 121, 120, 135, 91, 226, 223, - 98, 249, 135, 221, 198, 183, 196, 121, 127, 88, 80, 60, 201, 47, 47, 158, - 20, 22, 27, 79, 12, 74, 167, 123, 245, 220, 67, 168, 70, 196, 210, 144, - 36, 191, 184, 27, 191, 240, 60, 254, 44, 246, 104, 33, 87, 236, 9, 243, - 169, 89, 120, 118, 220, 104, 66, 21, 130, 149, 64, 152, 210, 104, 230, 23, - 95, 205, 210, 243, 105, 249, 155, 75, 169, 173, 46, 247, 208, 234, 46, 151, - 65, 211, 83, 169, 187, 139, 169, 8, 148, 254, 80, 29, 71, 215, 209, 6, - 71, 152, 68, 183, 44, 216, 221, 33, 247, 128, 10, 141, 229, 194, 50, 149, - 165, 28, 47, 124, 24, 2, 4, 114, 15, 136, 211, 23, 221, 249, 24, 121, - 81, 2, 67, 168, 139, 238, 143, 116, 90, 218, 221, 225, 57, 237, 169, 70, - 120, 195, 12, 165, 161, 224, 119, 189, 229, 143, 160, 183, 80, 131, 7, 14, - 245, 135, 152, 113, 159, 142, 70, 146, 168, 36, 51, 125, 164, 133, 31, 98, - 90, 76, 97, 113, 66, 221, 213, 119, 2, 94, 97, 183, 136, 22, 77, 11, - 178, 104, 149, 20, 130, 21, 120, 170, 86, 17, 87, 41, 32, 19, 240, 43, - 52, 178, 25, 4, 17, 132, 19, 170, 196, 31, 65, 145, 80, 137, 40, 18, - 41, 205, 30, 123, 153, 37, 51, 117, 130, 54, 33, 53, 47, 43, 44, 219, - 245, 49, 41, 103, 13, 10, 44, 50, 48, 103, 13, 196, 173, 103, 17, 99, - 4, 99, 176, 51, 54, 44, 224, 227, 184, 57, 231, 160, 13, 221, 243, 195, - 228, 47, 32, 86, 254, 130, 70, 2, 46, 252, 45, 124, 123, 201, 162, 141, - 28, 125, 32, 194, 3, 145, 62, 192, 120, 40, 136, 220, 49, 207, 52, 90, - 97, 49, 203, 245, 195, 13, 121, 208, 48, 231, 32, 158, 197, 140, 79, 21, - 139, 43, 70, 19, 50, 204, 152, 46, 7, 85, 68, 187, 58, 145, 94, 138, - 201, 253, 236, 213, 194, 232, 167, 91, 192, 164, 129, 53, 224, 95, 106, 113, - 161, 99, 148, 72, 183, 148, 160, 202, 92, 202, 154, 24, 91, 233, 49, 174, - 107, 68, 149, 100, 163, 36, 177, 220, 99, 166, 221, 176, 18, 183, 7, 63, - 66, 43, 86, 33, 45, 49, 225, 3, 146, 247, 221, 47, 243, 204, 97, 37, - 207, 81, 9, 8, 195, 108, 164, 79, 71, 207, 89, 51, 54, 36, 83, 200, - 67, 50, 142, 231, 180, 194, 198, 218, 148, 76, 214, 55, 16, 141, 216, 36, - 98, 97, 125, 33, 111, 90, 153, 172, 180, 180, 39, 201, 242, 99, 15, 86, - 87, 144, 217, 252, 5, 225, 45, 23, 183, 199, 253, 165, 106, 104, 193, 183, - 253, 235, 163, 78, 252, 7, 247, 84, 22, 59, 41, 84, 221, 27, 81, 52, - 104, 10, 152, 156, 19, 179, 212, 180, 149, 99, 144, 140, 52, 52, 13, 181, - 71, 205, 73, 248, 0, 159, 24, 20, 251, 49, 155, 147, 179, 248, 4, 31, - 21, 179, 62, 141, 130, 23, 240, 91, 202, 198, 55, 73, 227, 232, 142, 129, - 175, 89, 98, 195, 52, 246, 46, 180, 147, 101, 6, 26, 145, 165, 70, 48, - 158, 91, 76, 123, 140, 21, 103, 133, 174, 107, 102, 38, 230, 241, 192, 218, - 253, 7, 252, 15, 216, 57, 238, 56, 194, 50, 203, 141, 49, 116, 72, 242, - 236, 190, 231, 27, 46, 181, 252, 59, 33, 126, 147, 102, 61, 113, 164, 59, - 160, 29, 198, 250, 124, 151, 182, 42, 30, 208, 128, 136, 194, 245, 156, 60, - 149, 99, 119, 202, 84, 137, 221, 149, 167, 229, 216, 157, 54, 213, 178, 24, - 198, 83, 159, 152, 163, 81, 190, 30, 187, 198, 248, 242, 151, 118, 83, 239, - 211, 84, 118, 133, 105, 23, 246, 200, 180, 60, 154, 232, 95, 222, 81, 165, - 9, 173, 5, 204, 134, 69, 147, 155, 32, 76, 185, 93, 199, 70, 179, 148, - 197, 4, 244, 159, 56, 28, 12, 199, 208, 132, 174, 95, 181, 240, 150, 213, - 45, 188, 197, 202, 197, 92, 205, 240, 120, 18, 113, 97, 226, 59, 51, 21, - 211, 49, 91, 221, 190, 142, 50, 254, 84, 7, 109, 198, 122, 35, 198, 232, - 155, 214, 133, 135, 6, 174, 193, 97, 17, 130, 162, 18, 198, 51, 107, 109, - 42, 240, 64, 132, 186, 108, 177, 13, 233, 172, 209, 49, 157, 46, 229, 199, - 88, 97, 186, 109, 64, 211, 57, 214, 129, 204, 139, 228, 145, 117, 88, 219, - 231, 97, 52, 42, 236, 38, 13, 22, 75, 185, 182, 75, 109, 234, 93, 29, - 22, 113, 192, 114, 45, 26, 18, 54, 172, 179, 139, 75, 124, 152, 28, 46, - 2, 126, 143, 28, 115, 138, 194, 125, 60, 176, 88, 38, 199, 158, 184, 105, - 209, 212, 88, 229, 162, 145, 130, 92, 100, 45, 139, 242, 167, 240, 89, 20, - 242, 69, 65, 252, 76, 111, 254, 197, 182, 242, 203, 247, 229, 190, 201, 124, - 34, 124, 207, 3, 234, 165, 65, 221, 15, 18, 205, 201, 184, 151, 131, 158, - 116, 105, 109, 58, 90, 21, 31, 142, 229, 91, 240, 192, 131, 1, 176, 75, - 207, 1, 195, 96, 191, 217, 165, 105, 114, 18, 85, 46, 110, 137, 172, 188, - 174, 147, 189, 47, 193, 222, 151, 96, 239, 75, 176, 255, 31, 151, 96, 255, - 62, 53, 72, 38, 133, 82, 186, 19, 104, 43, 18, 252, 238, 163, 57, 4, - 77, 229, 89, 6, 5, 36, 203, 20, 255, 56, 1, 219, 146, 251, 7, 104, - 57, 255, 64, 21, 25, 20, 14, 229, 5, 46, 242, 197, 76, 130, 236, 147, - 239, 120, 19, 79, 204, 137, 15, 223, 88, 96, 192, 53, 60, 2, 102, 123, - 118, 207, 191, 228, 138, 47, 232, 237, 147, 163, 225, 6, 2, 218, 135, 2, - 213, 123, 54, 209, 107, 133, 237, 245, 249, 246, 165, 172, 0, 223, 118, 155, - 243, 119, 196, 226, 111, 193, 200, 243, 212, 191, 135, 19, 233, 121, 57, 11, - 131, 224, 142, 7, 9, 42, 9, 168, 20, 65, 121, 131, 74, 6, 170, 178, - 80, 126, 131, 170, 8, 84, 154, 160, 189, 65, 165, 160, 43, 160, 72, 247, - 75, 63, 39, 126, 214, 19, 100, 37, 70, 38, 82, 129, 8, 255, 255, 28, - 65, 192, 197, 201, 202, 177, 210, 112, 135, 52, 47, 165, 150, 166, 50, 50, - 41, 81, 154, 180, 68, 166, 1, 89, 3, 150, 142, 24, 202, 120, 77, 202, - 83, 180, 38, 105, 125, 253, 133, 107, 98, 34, 164, 249, 41, 184, 213, 11, - 157, 215, 192, 55, 229, 26, 159, 115, 77, 122, 209, 252, 28, 164, 36, 75, - 21, 11, 191, 182, 88, 40, 16, 138, 245, 107, 10, 247, 80, 118, 74, 177, - 216, 195, 107, 203, 170, 195, 2, 149, 228, 183, 208, 231, 229, 86, 17, 101, - 191, 4, 108, 142, 197, 124, 197, 216, 248, 113, 176, 247, 253, 56, 42, 81, - 84, 12, 180, 144, 110, 57, 246, 240, 149, 206, 22, 149, 68, 41, 48, 58, - 126, 83, 41, 165, 68, 41, 34, 20, 33, 254, 108, 57, 41, 42, 251, 210, - 228, 78, 63, 16, 126, 101, 170, 139, 47, 203, 174, 207, 99, 199, 67, 137, - 21, 172, 25, 130, 91, 33, 113, 151, 106, 115, 253, 54, 222, 0, 186, 118, - 93, 5, 241, 97, 23, 172, 155, 23, 156, 187, 150, 201, 82, 162, 48, 110, - 55, 169, 35, 181, 238, 43, 111, 62, 0, 99, 140, 224, 84, 239, 52, 168, - 17, 92, 120, 20, 252, 230, 137, 237, 187, 244, 251, 147, 72, 191, 215, 54, - 1, 194, 49, 252, 51, 110, 20, 120, 46, 197, 153, 186, 238, 11, 166, 70, - 211, 165, 146, 139, 217, 179, 202, 31, 252, 8, 59, 22, 14, 37, 122, 68, - 99, 173, 4, 138, 203, 164, 205, 145, 149, 150, 26, 81, 53, 115, 207, 223, - 11, 203, 83, 177, 98, 26, 193, 126, 171, 109, 112, 7, 141, 177, 235, 194, - 250, 215, 71, 31, 104, 219, 29, 193, 255, 77, 179, 206, 20, 161, 185, 110, - 34, 80, 81, 127, 6, 109, 34, 163, 137, 153, 101, 74, 176, 194, 75, 161, - 82, 146, 84, 233, 51, 182, 168, 253, 154, 105, 118, 98, 91, 118, 171, 75, - 195, 121, 47, 195, 164, 190, 207, 193, 255, 189, 57, 8, 227, 18, 6, 62, - 254, 205, 137, 48, 141, 164, 112, 26, 225, 166, 28, 155, 94, 242, 7, 225, - 25, 216, 121, 62, 39, 191, 124, 8, 148, 194, 165, 73, 150, 28, 226, 43, - 231, 18, 125, 209, 138, 89, 196, 156, 208, 253, 51, 85, 186, 39, 72, 39, - 142, 159, 46, 196, 111, 210, 228, 90, 32, 91, 176, 245, 69, 73, 93, 244, - 75, 57, 209, 71, 142, 217, 138, 198, 168, 68, 187, 179, 57, 115, 187, 186, - 151, 69, 75, 97, 171, 219, 24, 141, 232, 190, 213, 222, 184, 213, 55, 219, - 58, 189, 190, 124, 26, 55, 160, 195, 243, 81, 90, 108, 58, 165, 111, 189, - 74, 203, 155, 17, 80, 190, 221, 30, 247, 237, 184, 251, 52, 77, 72, 212, - 26, 1, 22, 223, 157, 105, 254, 55, 102, 156, 136, 200, 19, 169, 22, 43, - 193, 24, 254, 57, 161, 23, 82, 83, 173, 144, 237, 98, 203, 116, 23, 187, - 149, 220, 185, 150, 233, 206, 117, 40, 243, 112, 181, 246, 33, 182, 126, 11, - 49, 58, 151, 4, 225, 226, 156, 90, 61, 119, 195, 170, 164, 78, 224, 189, - 118, 71, 247, 133, 158, 222, 166, 208, 33, 193, 213, 79, 106, 161, 139, 222, - 115, 41, 170, 165, 178, 176, 97, 247, 174, 55, 254, 239, 206, 160, 213, 50, - 75, 103, 35, 205, 63, 49, 226, 80, 47, 252, 192, 177, 196, 64, 128, 201, - 233, 34, 42, 49, 28, 87, 14, 116, 191, 168, 87, 70, 57, 3, 218, 136, - 141, 246, 31, 54, 75, 17, 22, 19, 254, 115, 99, 63, 0, 169, 192, 158, - 43, 46, 24, 242, 94, 117, 205, 214, 163, 255, 2, 42, 15, 177, 248, 210, - 251, 188, 121, 159, 55, 193, 184, 140, 75, 159, 140, 237, 110, 61, 187, 47, - 25, 26, 253, 238, 3, 215, 113, 26, 109, 83, 183, 70, 63, 80, 7, 220, - 228, 190, 108, 109, 82, 72, 83, 247, 81, 239, 235, 35, 219, 162, 167, 154, - 33, 98, 144, 24, 68, 161, 21, 185, 15, 52, 210, 45, 146, 83, 103, 24, - 144, 87, 114, 62, 87, 92, 127, 241, 183, 27, 149, 23, 127, 78, 82, 239, - 193, 224, 164, 148, 139, 27, 24, 64, 1, 182, 155, 73, 66, 197, 165, 77, - 166, 87, 103, 110, 248, 133, 43, 38, 240, 116, 132, 150, 225, 28, 12, 77, - 189, 67, 235, 206, 182, 246, 125, 115, 113, 223, 110, 79, 103, 84, 63, 140, - 144, 74, 160, 54, 11, 150, 189, 132, 31, 177, 15, 141, 216, 213, 29, 4, - 238, 218, 226, 126, 196, 22, 94, 241, 32, 20, 253, 164, 155, 91, 94, 78, - 130, 72, 248, 110, 221, 39, 104, 100, 17, 204, 172, 103, 217, 63, 34, 58, - 164, 168, 103, 107, 56, 207, 242, 84, 57, 134, 17, 4, 171, 205, 25, 71, - 160, 209, 169, 93, 252, 122, 54, 73, 74, 7, 4, 53, 36, 94, 36, 241, - 41, 120, 110, 199, 180, 240, 8, 21, 157, 191, 185, 53, 201, 7, 204, 11, - 203, 137, 53, 14, 144, 194, 220, 244, 111, 98, 148, 49, 59, 4, 102, 47, - 191, 140, 149, 247, 44, 130, 254, 140, 227, 15, 42, 223, 112, 71, 172, 18, - 39, 122, 219, 28, 227, 84, 165, 72, 59, 107, 151, 125, 123, 194, 30, 132, - 62, 2, 220, 218, 158, 135, 8, 217, 254, 147, 87, 140, 132, 194, 39, 43, - 44, 167, 42, 20, 215, 133, 90, 39, 45, 26, 124, 199, 237, 160, 26, 120, - 40, 67, 141, 158, 158, 198, 192, 55, 251, 51, 206, 239, 126, 46, 234, 126, - 206, 110, 162, 191, 188, 203, 0, 227, 154, 81, 147, 152, 22, 7, 10, 219, - 19, 158, 73, 66, 243, 46, 98, 158, 237, 2, 147, 121, 12, 140, 173, 97, - 126, 110, 35, 90, 26, 51, 154, 162, 167, 160, 103, 71, 244, 166, 57, 6, - 254, 101, 185, 236, 68, 24, 43, 98, 15, 117, 150, 199, 140, 134, 38, 55, - 49, 173, 54, 60, 166, 135, 196, 8, 4, 201, 53, 218, 109, 28, 118, 177, - 90, 226, 179, 88, 229, 208, 44, 204, 177, 251, 140, 79, 197, 170, 117, 235, - 163, 193, 125, 116, 116, 58, 209, 4, 248, 98, 115, 180, 226, 133, 159, 152, - 89, 184, 223, 38, 136, 153, 23, 189, 111, 130, 8, 7, 77, 61, 180, 78, - 66, 126, 73, 65, 233, 70, 54, 45, 173, 107, 99, 228, 109, 219, 24, 1, - 115, 215, 147, 0, 117, 135, 6, 133, 149, 163, 208, 90, 54, 16, 193, 12, - 113, 13, 83, 111, 51, 108, 63, 102, 199, 230, 142, 251, 35, 129, 107, 5, - 141, 152, 108, 64, 84, 69, 27, 29, 68, 95, 65, 3, 118, 187, 109, 26, - 51, 86, 211, 228, 87, 135, 199, 237, 116, 226, 218, 99, 183, 63, 139, 26, - 226, 10, 109, 234, 7, 54, 66, 226, 193, 135, 36, 51, 198, 94, 236, 247, - 30, 12, 114, 125, 20, 235, 48, 174, 209, 132, 172, 175, 26, 182, 29, 163, - 101, 29, 155, 116, 151, 176, 18, 228, 98, 129, 99, 22, 156, 208, 224, 189, - 53, 86, 225, 40, 16, 205, 175, 135, 134, 140, 121, 59, 248, 253, 152, 226, - 237, 128, 22, 7, 248, 73, 134, 141, 35, 31, 135, 144, 79, 136, 163, 121, - 197, 168, 131, 54, 110, 142, 77, 80, 72, 226, 131, 1, 167, 251, 0, 89, - 200, 167, 68, 215, 230, 209, 237, 1, 133, 52, 116, 203, 216, 213, 253, 214, - 98, 144, 134, 14, 247, 168, 83, 68, 198, 125, 122, 223, 114, 116, 138, 148, - 8, 178, 97, 130, 169, 209, 216, 98, 143, 227, 61, 194, 173, 65, 110, 214, - 89, 22, 14, 88, 119, 132, 85, 135, 225, 187, 190, 185, 248, 114, 42, 253, - 95, 123, 251, 78, 234, 219, 163, 169, 243, 47, 189, 253, 132, 190, 119, 210, - 213, 209, 94, 164, 249, 69, 240, 223, 235, 226, 179, 221, 171, 139, 99, 190, - 225, 160, 193, 6, 119, 93, 35, 149, 179, 219, 83, 250, 174, 185, 13, 124, - 133, 10, 50, 211, 34, 246, 120, 148, 44, 244, 136, 213, 250, 178, 182, 189, - 187, 199, 144, 42, 169, 204, 103, 150, 38, 11, 157, 145, 154, 243, 106, 155, - 125, 241, 200, 238, 116, 250, 62, 114, 164, 63, 135, 233, 75, 81, 252, 186, - 169, 57, 79, 18, 249, 6, 13, 7, 180, 162, 183, 242, 236, 108, 239, 30, - 69, 117, 109, 163, 226, 224, 215, 181, 143, 243, 33, 217, 174, 192, 197, 244, - 118, 106, 49, 181, 237, 131, 61, 104, 36, 90, 136, 105, 97, 103, 185, 201, - 170, 251, 75, 229, 213, 153, 195, 230, 109, 235, 191, 34, 123, 212, 81, 149, - 196, 187, 131, 185, 224, 194, 76, 126, 37, 211, 110, 226, 141, 63, 153, 233, - 130, 102, 66, 7, 188, 209, 219, 57, 246, 46, 119, 217, 192, 130, 235, 243, - 96, 100, 99, 250, 233, 213, 222, 133, 239, 105, 180, 146, 159, 255, 33, 12, - 113, 139, 168, 165, 166, 226, 149, 45, 171, 94, 190, 187, 205, 47, 185, 95, - 94, 18, 206, 48, 129, 198, 177, 245, 220, 112, 58, 107, 20, 186, 76, 17, - 37, 80, 187, 165, 34, 104, 224, 69, 21, 88, 236, 75, 114, 143, 229, 111, - 104, 172, 187, 229, 135, 105, 137, 80, 56, 95, 32, 149, 203, 62, 28, 100, - 159, 255, 79, 214, 254, 239, 37, 123, 114, 184, 251, 141, 139, 41, 133, 113, - 125, 104, 47, 156, 108, 145, 77, 97, 94, 252, 231, 63, 115, 202, 47, 91, - 19, 248, 41, 253, 178, 213, 125, 225, 126, 224, 11, 252, 97, 254, 131, 137, - 147, 45, 118, 132, 158, 246, 196, 71, 83, 195, 175, 242, 35, 210, 228, 158, - 209, 67, 180, 131, 158, 98, 255, 224, 114, 209, 167, 190, 100, 220, 46, 39, - 115, 190, 166, 78, 223, 47, 125, 41, 188, 128, 66, 222, 167, 154, 245, 179, - 200, 75, 27, 57, 132, 49, 101, 187, 66, 210, 223, 10, 8, 105, 74, 117, - 235, 103, 49, 207, 158, 249, 167, 247, 177, 109, 35, 90, 168, 15, 28, 74, - 93, 93, 194, 61, 37, 32, 119, 25, 176, 168, 179, 73, 177, 56, 4, 246, - 71, 40, 114, 33, 84, 39, 69, 234, 68, 77, 114, 221, 183, 49, 166, 9, - 57, 107, 176, 30, 43, 72, 126, 201, 108, 66, 229, 153, 57, 37, 199, 7, - 144, 40, 52, 8, 172, 192, 150, 13, 114, 20, 191, 0, 43, 1, 196, 139, - 180, 148, 148, 98, 148, 192, 210, 33, 31, 15, 120, 16, 100, 144, 209, 166, - 33, 143, 192, 215, 20, 5, 4, 147, 177, 193, 131, 211, 90, 214, 233, 232, - 108, 159, 25, 218, 110, 33, 129, 199, 10, 9, 144, 254, 2, 92, 201, 21, - 151, 30, 136, 223, 94, 50, 177, 175, 69, 52, 82, 238, 33, 26, 162, 223, - 96, 117, 8, 100, 107, 57, 44, 117, 61, 147, 108, 6, 160, 140, 152, 78, - 156, 18, 228, 123, 34, 116, 14, 182, 149, 133, 99, 57, 199, 134, 193, 250, - 23, 4, 198, 25, 115, 255, 120, 206, 137, 255, 120, 129, 191, 18, 253, 43, - 211, 191, 69, 252, 251, 60, 121, 17, 158, 187, 47, 52, 129, 229, 249, 199, - 11, 27, 103, 99, 46, 155, 141, 28, 149, 14, 252, 53, 29, 221, 179, 102, - 75, 156, 196, 50, 79, 88, 74, 249, 141, 27, 23, 204, 20, 13, 183, 47, - 35, 207, 97, 138, 86, 26, 15, 2, 248, 239, 62, 95, 126, 223, 206, 248, - 255, 113, 59, 35, 49, 92, 65, 70, 208, 243, 225, 100, 226, 119, 46, 39, - 249, 71, 88, 185, 226, 234, 19, 226, 85, 99, 127, 229, 62, 67, 242, 45, - 233, 27, 13, 225, 148, 195, 117, 97, 98, 198, 73, 129, 215, 126, 60, 225, - 55, 206, 183, 127, 247, 84, 58, 115, 176, 66, 108, 183, 226, 12, 45, 119, - 223, 141, 53, 222, 103, 91, 102, 97, 172, 46, 78, 54, 154, 150, 43, 254, - 132, 45, 198, 138, 65, 255, 230, 68, 99, 111, 72, 157, 103, 135, 174, 61, - 236, 218, 163, 224, 236, 201, 12, 110, 133, 196, 93, 218, 244, 58, 214, 61, - 4, 101, 11, 176, 48, 22, 176, 178, 87, 76, 190, 152, 24, 67, 120, 71, - 182, 237, 23, 153, 161, 71, 27, 116, 56, 126, 124, 180, 197, 247, 153, 241, - 191, 60, 51, 204, 104, 0, 178, 179, 167, 204, 200, 30, 162, 227, 219, 176, - 107, 182, 126, 12, 26, 67, 255, 236, 150, 226, 211, 53, 49, 26, 75, 148, - 35, 23, 32, 2, 46, 13, 212, 149, 83, 34, 150, 57, 117, 62, 132, 30, - 56, 108, 62, 244, 131, 91, 33, 113, 247, 7, 17, 55, 239, 150, 129, 239, - 83, 42, 101, 74, 245, 163, 49, 204, 36, 77, 152, 240, 107, 141, 255, 210, - 198, 252, 202, 169, 21, 189, 118, 197, 212, 178, 161, 245, 19, 42, 18, 155, - 98, 152, 252, 195, 142, 146, 133, 212, 212, 52, 251, 191, 183, 133, 204, 31, - 98, 173, 244, 238, 5, 245, 238, 5, 245, 238, 5, 245, 206, 237, 255, 67, - 240, 210, 75, 172, 242, 231, 13, 194, 99, 230, 10, 241, 252, 18, 122, 212, - 14, 251, 250, 84, 26, 218, 125, 96, 10, 8, 22, 12, 140, 252, 147, 244, - 109, 65, 102, 164, 217, 178, 166, 219, 201, 165, 85, 50, 112, 211, 90, 126, - 22, 128, 136, 10, 185, 98, 22, 177, 164, 164, 212, 34, 222, 150, 72, 203, - 5, 167, 74, 166, 19, 219, 1, 165, 176, 111, 119, 112, 196, 224, 194, 4, - 207, 181, 89, 220, 82, 250, 228, 135, 39, 9, 137, 187, 52, 253, 111, 187, - 149, 48, 100, 125, 206, 238, 57, 54, 34, 252, 225, 176, 244, 45, 24, 178, - 8, 181, 175, 35, 184, 21, 14, 197, 190, 237, 178, 43, 16, 137, 29, 224, - 42, 125, 46, 207, 45, 231, 129, 196, 224, 121, 146, 116, 169, 164, 149, 148, - 107, 62, 41, 199, 115, 62, 233, 58, 145, 146, 249, 252, 178, 162, 147, 140, - 69, 239, 248, 66, 96, 204, 139, 69, 183, 70, 141, 142, 205, 94, 179, 107, - 58, 20, 102, 13, 47, 153, 255, 124, 60, 62, 193, 60, 48, 177, 130, 46, - 20, 74, 177, 198, 74, 155, 35, 181, 184, 131, 51, 230, 13, 60, 155, 225, - 51, 216, 65, 130, 193, 142, 253, 35, 159, 113, 223, 39, 252, 231, 125, 183, - 169, 41, 215, 103, 142, 249, 97, 113, 244, 46, 155, 34, 221, 125, 177, 30, - 7, 54, 180, 91, 168, 102, 36, 44, 72, 222, 133, 255, 187, 240, 255, 19, - 9, 127, 182, 72, 92, 96, 83, 33, 212, 9, 51, 186, 71, 228, 241, 81, - 171, 251, 174, 50, 252, 15, 168, 12, 37, 34, 73, 43, 162, 231, 6, 114, - 44, 38, 132, 163, 52, 31, 149, 247, 31, 217, 92, 145, 186, 80, 42, 249, - 18, 138, 204, 178, 144, 83, 51, 105, 66, 112, 117, 244, 217, 87, 138, 76, - 122, 101, 178, 211, 86, 122, 204, 185, 246, 252, 17, 33, 104, 62, 190, 172, - 83, 240, 153, 53, 243, 203, 214, 143, 143, 133, 143, 220, 95, 255, 202, 153, - 127, 131, 75, 237, 227, 58, 247, 207, 127, 114, 230, 22, 92, 11, 31, 195, - 203, 207, 31, 255, 110, 126, 202, 139, 89, 52, 174, 108, 193, 248, 161, 199, - 152, 107, 207, 35, 40, 198, 113, 164, 54, 69, 81, 68, 187, 74, 169, 40, - 76, 72, 105, 253, 69, 136, 238, 187, 244, 30, 122, 137, 251, 226, 199, 112, - 68, 53, 198, 7, 212, 217, 76, 64, 41, 70, 80, 197, 241, 228, 69, 192, - 197, 24, 160, 113, 239, 225, 59, 141, 99, 79, 225, 26, 105, 242, 102, 89, - 241, 15, 137, 93, 29, 119, 175, 126, 44, 244, 199, 191, 243, 251, 91, 76, - 60, 110, 65, 51, 112, 225, 153, 181, 68, 253, 31, 6, 92, 118, 48, 251, - 65, 207, 182, 63, 177, 35, 110, 46, 151, 205, 66, 126, 246, 128, 157, 136, - 127, 242, 79, 198, 217, 163, 224, 56, 90, 162, 135, 222, 203, 5, 252, 176, - 91, 163, 87, 10, 137, 30, 199, 10, 146, 82, 11, 106, 129, 82, 241, 90, - 73, 209, 115, 214, 140, 177, 34, 208, 71, 58, 155, 243, 63, 60, 187, 206, - 10, 244, 59, 129, 162, 113, 102, 226, 37, 46, 82, 179, 212, 4, 185, 239, - 240, 143, 177, 73, 194, 102, 243, 205, 133, 62, 113, 225, 91, 115, 114, 54, - 30, 196, 36, 141, 48, 104, 202, 4, 165, 244, 90, 145, 43, 115, 201, 175, - 150, 191, 170, 86, 197, 165, 92, 124, 252, 101, 249, 108, 50, 114, 76, 10, - 109, 244, 10, 199, 75, 210, 151, 94, 47, 59, 204, 187, 185, 244, 166, 242, - 27, 111, 10, 138, 217, 76, 123, 173, 250, 107, 94, 27, 149, 75, 163, 121, - 39, 75, 14, 194, 133, 113, 4, 166, 63, 123, 137, 171, 255, 138, 194, 87, - 149, 29, 124, 112, 20, 215, 54, 12, 32, 200, 172, 114, 160, 229, 146, 139, - 51, 4, 191, 10, 222, 137, 235, 180, 6, 34, 101, 37, 194, 182, 42, 220, - 235, 203, 59, 182, 38, 67, 107, 139, 196, 50, 12, 75, 142, 16, 238, 130, - 26, 10, 97, 205, 133, 240, 181, 190, 168, 186, 100, 38, 52, 137, 152, 42, - 52, 229, 199, 4, 200, 29, 183, 171, 183, 133, 212, 212, 180, 229, 17, 186, - 126, 164, 236, 177, 81, 231, 121, 229, 213, 45, 61, 49, 185, 165, 247, 174, - 99, 191, 235, 216, 127, 106, 29, 59, 13, 101, 235, 93, 203, 254, 179, 106, - 217, 175, 69, 190, 88, 96, 139, 156, 15, 101, 146, 123, 46, 130, 138, 64, - 53, 111, 122, 160, 185, 76, 152, 19, 179, 108, 247, 43, 181, 156, 159, 136, - 142, 177, 84, 96, 234, 190, 215, 165, 239, 148, 228, 51, 119, 255, 78, 136, - 223, 164, 29, 187, 156, 232, 208, 102, 237, 216, 78, 87, 232, 125, 78, 61, - 85, 208, 29, 229, 170, 107, 90, 116, 203, 137, 186, 168, 196, 221, 80, 126, - 226, 152, 244, 125, 50, 252, 89, 39, 195, 106, 191, 109, 55, 28, 106, 25, - 230, 50, 18, 104, 43, 244, 76, 255, 3, 247, 101, 139, 83, 10, 31, 124, - 252, 173, 81, 48, 122, 252, 176, 116, 161, 239, 116, 129, 115, 187, 13, 7, - 189, 123, 68, 4, 106, 130, 76, 104, 79, 27, 211, 172, 120, 166, 239, 163, - 78, 4, 90, 156, 15, 176, 235, 111, 66, 155, 153, 13, 46, 8, 50, 179, - 48, 186, 87, 207, 164, 160, 218, 43, 38, 208, 24, 218, 38, 95, 51, 167, - 104, 9, 195, 38, 17, 166, 12, 105, 130, 176, 112, 159, 30, 194, 53, 220, - 34, 21, 75, 66, 49, 17, 56, 57, 8, 58, 19, 179, 6, 21, 105, 215, - 74, 106, 68, 180, 20, 127, 25, 67, 183, 139, 75, 65, 235, 19, 86, 54, - 23, 160, 255, 197, 129, 78, 19, 232, 160, 78, 91, 119, 56, 63, 32, 108, - 66, 5, 19, 151, 168, 146, 33, 241, 194, 69, 239, 251, 68, 254, 243, 79, - 228, 50, 34, 125, 139, 105, 123, 71, 177, 1, 157, 22, 20, 221, 197, 24, - 105, 125, 208, 8, 93, 104, 153, 77, 127, 227, 39, 136, 148, 217, 236, 235, - 232, 125, 215, 109, 64, 38, 31, 57, 151, 46, 179, 248, 65, 99, 72, 99, - 87, 4, 33, 49, 20, 206, 64, 19, 240, 172, 249, 203, 86, 15, 7, 31, - 219, 242, 192, 27, 28, 135, 89, 4, 203, 22, 240, 31, 26, 210, 27, 244, - 53, 165, 124, 24, 96, 180, 1, 139, 174, 158, 31, 111, 147, 253, 63, 167, - 8, 104, 41, 255, 184, 201, 182, 93, 224, 34, 105, 57, 158, 62, 79, 87, - 51, 133, 88, 19, 164, 243, 5, 20, 127, 113, 72, 7, 100, 104, 49, 92, - 135, 232, 246, 29, 220, 225, 125, 118, 254, 59, 117, 206, 104, 100, 249, 182, - 63, 11, 14, 233, 40, 50, 81, 220, 198, 36, 44, 219, 134, 144, 95, 210, - 205, 127, 150, 135, 234, 202, 105, 17, 123, 119, 250, 172, 240, 33, 188, 43, - 58, 226, 19, 49, 161, 21, 135, 241, 110, 56, 240, 169, 104, 62, 180, 128, - 97, 228, 163, 157, 183, 163, 108, 66, 122, 114, 92, 71, 173, 231, 111, 65, - 81, 96, 246, 165, 12, 252, 125, 109, 194, 119, 215, 137, 84, 224, 54, 56, - 4, 157, 159, 109, 72, 5, 210, 141, 107, 166, 119, 175, 101, 113, 77, 107, - 109, 138, 89, 38, 73, 164, 250, 62, 155, 100, 81, 206, 69, 216, 47, 234, - 8, 133, 199, 232, 201, 37, 33, 134, 67, 211, 27, 14, 246, 237, 169, 14, - 227, 184, 73, 35, 174, 178, 61, 130, 87, 209, 186, 229, 69, 43, 89, 191, - 24, 184, 170, 233, 142, 105, 183, 205, 22, 92, 158, 152, 142, 147, 8, 41, - 251, 251, 15, 205, 229, 254, 10, 61, 211, 20, 202, 186, 27, 92, 124, 147, - 44, 195, 51, 0, 133, 77, 31, 140, 94, 244, 193, 232, 165, 108, 38, 130, - 144, 231, 128, 161, 12, 41, 171, 167, 171, 37, 100, 244, 204, 5, 107, 9, - 62, 30, 207, 169, 251, 75, 240, 88, 45, 154, 186, 24, 2, 97, 33, 49, - 109, 9, 180, 171, 99, 183, 250, 1, 45, 147, 44, 34, 30, 61, 24, 102, - 222, 216, 13, 41, 202, 202, 18, 69, 61, 31, 0, 145, 48, 54, 78, 63, - 172, 148, 80, 224, 238, 222, 38, 185, 156, 13, 6, 250, 40, 62, 74, 130, - 29, 135, 67, 203, 53, 219, 244, 204, 126, 60, 162, 87, 127, 184, 129, 185, - 28, 50, 208, 239, 170, 159, 66, 208, 251, 79, 33, 14, 171, 164, 32, 166, - 141, 225, 133, 161, 145, 30, 31, 151, 6, 19, 119, 182, 158, 219, 211, 173, - 53, 68, 241, 16, 215, 55, 214, 38, 121, 113, 253, 195, 231, 246, 12, 82, - 138, 249, 156, 4, 41, 93, 154, 130, 131, 124, 173, 61, 21, 218, 51, 31, - 234, 195, 143, 178, 208, 178, 173, 246, 86, 214, 92, 171, 11, 119, 194, 92, - 104, 9, 57, 85, 200, 105, 235, 217, 100, 164, 5, 159, 200, 88, 59, 253, - 91, 54, 7, 221, 180, 72, 46, 152, 235, 254, 70, 118, 68, 249, 101, 53, - 37, 218, 82, 115, 217, 107, 104, 207, 41, 151, 231, 38, 27, 32, 61, 62, - 103, 110, 224, 118, 6, 183, 221, 13, 144, 27, 159, 51, 167, 216, 3, 8, - 128, 123, 189, 113, 205, 241, 220, 205, 198, 205, 58, 36, 226, 42, 224, 20, - 136, 176, 236, 207, 153, 58, 45, 129, 7, 53, 110, 227, 212, 217, 184, 38, - 167, 159, 51, 119, 180, 20, 72, 42, 97, 210, 13, 38, 101, 115, 88, 169, - 164, 22, 182, 106, 234, 65, 59, 167, 181, 126, 110, 131, 45, 24, 11, 25, - 60, 227, 227, 124, 207, 84, 63, 207, 143, 73, 151, 158, 234, 45, 233, 168, - 211, 130, 48, 43, 108, 61, 63, 80, 35, 163, 111, 27, 107, 15, 19, 161, - 251, 13, 59, 227, 229, 55, 117, 26, 171, 21, 151, 131, 98, 115, 179, 130, - 240, 156, 115, 64, 226, 225, 49, 224, 116, 223, 255, 95, 236, 60, 112, 153, - 152, 255, 105, 226, 156, 179, 72, 136, 17, 200, 99, 70, 87, 193, 50, 215, - 231, 120, 182, 69, 57, 109, 159, 59, 105, 12, 125, 61, 180, 21, 164, 161, - 97, 189, 43, 44, 39, 165, 110, 247, 52, 134, 195, 184, 163, 198, 179, 26, - 216, 250, 160, 103, 239, 0, 214, 168, 48, 175, 231, 240, 111, 109, 14, 173, - 67, 214, 230, 188, 136, 91, 64, 40, 100, 231, 120, 129, 162, 147, 94, 192, - 26, 158, 93, 232, 211, 33, 187, 232, 219, 29, 118, 81, 49, 129, 19, 193, - 4, 20, 201, 90, 113, 99, 254, 93, 202, 211, 34, 46, 71, 13, 152, 199, - 121, 101, 99, 109, 254, 93, 38, 114, 126, 78, 138, 104, 185, 20, 201, 223, - 189, 233, 16, 190, 25, 209, 5, 46, 244, 70, 63, 10, 46, 44, 46, 177, - 200, 136, 18, 225, 36, 40, 124, 75, 50, 22, 113, 146, 60, 249, 125, 129, - 66, 0, 188, 113, 109, 77, 220, 20, 97, 32, 155, 27, 115, 82, 130, 143, - 21, 55, 11, 69, 24, 248, 236, 118, 253, 123, 105, 83, 250, 41, 200, 149, - 123, 196, 43, 136, 189, 190, 24, 7, 188, 217, 182, 58, 49, 126, 143, 149, - 83, 97, 28, 171, 113, 91, 51, 119, 168, 183, 70, 32, 95, 128, 119, 39, - 8, 23, 100, 75, 215, 52, 70, 241, 231, 74, 252, 32, 229, 238, 141, 231, - 255, 54, 22, 191, 109, 141, 204, 252, 118, 223, 108, 184, 108, 24, 5, 193, - 234, 229, 159, 1, 232, 184, 132, 47, 69, 108, 146, 0, 39, 118, 20, 192, - 253, 248, 91, 39, 75, 209, 105, 253, 199, 183, 102, 123, 212, 197, 231, 190, - 225, 87, 65, 42, 102, 151, 136, 170, 58, 69, 186, 88, 69, 245, 95, 92, - 109, 43, 164, 144, 170, 52, 37, 102, 39, 67, 109, 107, 100, 96, 254, 56, - 133, 45, 52, 19, 160, 151, 226, 22, 76, 63, 122, 37, 109, 101, 233, 244, - 35, 116, 42, 178, 52, 121, 43, 152, 138, 244, 182, 184, 21, 76, 72, 122, - 171, 108, 5, 211, 146, 222, 150, 182, 130, 201, 73, 111, 203, 91, 193, 20, - 165, 183, 234, 86, 54, 62, 65, 105, 154, 182, 149, 93, 154, 160, 104, 196, - 144, 123, 198, 167, 57, 241, 229, 227, 203, 58, 178, 224, 126, 163, 165, 255, - 112, 71, 24, 175, 107, 3, 6, 201, 198, 70, 118, 33, 149, 64, 42, 33, - 139, 169, 223, 33, 245, 251, 247, 197, 84, 172, 35, 178, 24, 250, 187, 240, - 12, 43, 140, 207, 232, 239, 194, 51, 108, 8, 124, 70, 127, 23, 158, 97, - 171, 224, 51, 250, 187, 240, 12, 155, 8, 159, 209, 95, 250, 217, 104, 83, - 65, 113, 0, 22, 165, 203, 164, 187, 245, 156, 19, 165, 191, 131, 120, 1, - 149, 84, 44, 126, 251, 68, 229, 203, 75, 230, 25, 49, 22, 68, 16, 43, - 15, 185, 9, 220, 227, 54, 29, 238, 93, 162, 82, 219, 212, 129, 35, 173, - 101, 90, 172, 159, 96, 120, 173, 153, 115, 248, 251, 192, 229, 231, 15, 226, - 55, 97, 142, 71, 185, 223, 62, 115, 107, 244, 123, 77, 160, 224, 57, 122, - 153, 135, 107, 34, 173, 131, 4, 110, 177, 62, 253, 137, 172, 249, 165, 172, - 172, 255, 113, 150, 179, 66, 8, 241, 43, 242, 57, 211, 140, 88, 0, 72, - 217, 207, 25, 115, 65, 103, 20, 63, 99, 236, 3, 24, 207, 6, 220, 160, - 57, 13, 124, 234, 122, 152, 86, 8, 18, 89, 216, 54, 120, 96, 98, 213, - 128, 151, 125, 251, 156, 129, 59, 172, 232, 154, 180, 241, 192, 77, 133, 25, - 247, 13, 106, 246, 192, 65, 126, 238, 219, 58, 49, 216, 67, 199, 6, 117, - 55, 87, 90, 223, 152, 195, 125, 30, 191, 10, 180, 21, 46, 167, 193, 23, - 101, 230, 100, 235, 129, 19, 11, 223, 215, 114, 10, 234, 21, 101, 152, 155, - 112, 7, 55, 223, 252, 130, 179, 57, 236, 167, 44, 190, 213, 224, 214, 64, - 216, 115, 152, 60, 255, 254, 253, 129, 154, 22, 127, 91, 143, 222, 17, 188, - 2, 110, 41, 194, 191, 81, 216, 152, 67, 161, 65, 188, 57, 36, 61, 92, - 131, 107, 156, 7, 48, 28, 160, 255, 252, 222, 19, 36, 28, 3, 155, 11, - 74, 76, 170, 68, 245, 85, 152, 228, 124, 246, 237, 162, 178, 212, 204, 249, - 89, 201, 139, 162, 31, 13, 61, 144, 225, 12, 3, 133, 201, 110, 122, 45, - 132, 87, 9, 219, 227, 1, 174, 198, 199, 237, 72, 106, 200, 148, 193, 198, - 93, 87, 246, 49, 126, 46, 181, 91, 101, 171, 150, 248, 142, 114, 156, 238, - 79, 183, 228, 68, 93, 157, 72, 169, 220, 211, 111, 190, 21, 166, 23, 114, - 180, 236, 164, 209, 116, 225, 223, 115, 150, 141, 221, 137, 8, 213, 156, 252, - 37, 47, 230, 197, 207, 28, 75, 234, 98, 82, 23, 146, 96, 160, 66, 226, - 3, 87, 16, 38, 184, 47, 62, 97, 22, 95, 93, 17, 254, 131, 193, 7, - 226, 223, 161, 214, 102, 149, 173, 28, 140, 109, 156, 251, 31, 62, 63, 224, - 52, 168, 208, 29, 203, 117, 129, 93, 139, 120, 77, 217, 128, 36, 200, 208, - 34, 166, 139, 134, 36, 34, 234, 171, 176, 158, 221, 20, 224, 63, 246, 40, - 92, 226, 162, 209, 50, 218, 192, 196, 131, 233, 250, 141, 141, 7, 112, 182, - 51, 226, 142, 245, 16, 57, 157, 165, 252, 232, 67, 138, 176, 152, 16, 215, - 238, 150, 135, 78, 97, 83, 92, 208, 36, 86, 169, 27, 208, 106, 63, 169, - 210, 252, 220, 122, 121, 121, 232, 21, 254, 216, 67, 15, 4, 183, 154, 46, - 184, 227, 205, 29, 238, 115, 148, 162, 1, 7, 31, 234, 247, 153, 207, 3, - 114, 197, 15, 66, 78, 129, 127, 165, 160, 79, 49, 60, 198, 109, 35, 116, - 69, 104, 35, 0, 11, 61, 209, 21, 146, 183, 105, 58, 251, 138, 152, 99, - 151, 184, 245, 206, 117, 116, 155, 110, 23, 80, 96, 179, 20, 211, 121, 74, - 21, 59, 50, 202, 82, 235, 247, 246, 216, 97, 142, 5, 62, 94, 31, 200, - 44, 60, 117, 2, 57, 112, 5, 21, 165, 192, 134, 177, 50, 42, 204, 12, - 35, 178, 243, 89, 226, 51, 225, 230, 72, 100, 8, 20, 83, 62, 41, 96, - 127, 211, 236, 199, 203, 80, 83, 202, 192, 147, 44, 238, 82, 167, 17, 35, - 3, 189, 82, 44, 201, 106, 241, 245, 182, 8, 125, 13, 92, 218, 249, 172, - 178, 44, 10, 29, 34, 213, 209, 170, 133, 183, 177, 186, 80, 167, 3, 52, - 159, 162, 84, 244, 229, 46, 188, 156, 37, 59, 58, 70, 109, 107, 179, 152, - 109, 38, 5, 220, 139, 90, 142, 29, 123, 176, 144, 175, 20, 173, 51, 165, - 225, 127, 62, 120, 28, 181, 106, 137, 66, 194, 185, 171, 186, 242, 66, 55, - 2, 112, 179, 80, 50, 208, 77, 236, 56, 230, 12, 22, 149, 92, 115, 200, - 184, 174, 148, 227, 14, 27, 168, 134, 227, 105, 100, 160, 118, 175, 146, 30, - 33, 93, 104, 137, 179, 234, 16, 49, 164, 100, 188, 129, 45, 13, 18, 160, - 55, 191, 165, 97, 96, 236, 34, 248, 215, 219, 45, 227, 19, 38, 62, 135, - 198, 178, 79, 172, 75, 124, 170, 229, 143, 89, 170, 98, 80, 94, 202, 225, - 205, 102, 121, 161, 84, 92, 203, 32, 198, 157, 159, 39, 34, 44, 40, 63, - 189, 44, 74, 123, 143, 184, 144, 221, 95, 229, 52, 92, 152, 33, 180, 8, - 221, 7, 32, 13, 215, 77, 191, 195, 238, 154, 66, 36, 52, 19, 72, 227, - 153, 33, 75, 3, 142, 121, 186, 133, 97, 114, 115, 129, 113, 248, 233, 223, - 182, 40, 22, 23, 240, 121, 46, 187, 157, 18, 116, 25, 103, 31, 106, 56, - 38, 158, 231, 80, 32, 70, 211, 101, 19, 45, 27, 223, 87, 62, 5, 13, - 128, 22, 252, 37, 47, 190, 124, 227, 104, 240, 97, 26, 122, 120, 5, 174, - 153, 57, 232, 100, 92, 7, 103, 124, 78, 97, 155, 77, 153, 97, 195, 69, - 168, 43, 174, 64, 153, 249, 38, 23, 2, 108, 81, 99, 4, 138, 197, 133, - 166, 12, 32, 198, 163, 99, 74, 223, 42, 156, 69, 63, 98, 70, 13, 33, - 28, 24, 168, 144, 166, 181, 69, 81, 127, 81, 244, 230, 228, 141, 53, 49, - 15, 226, 0, 99, 78, 129, 170, 56, 141, 63, 138, 32, 217, 196, 66, 188, - 4, 202, 138, 228, 118, 136, 29, 44, 65, 222, 13, 25, 205, 222, 65, 72, - 35, 202, 21, 252, 224, 118, 88, 166, 7, 137, 209, 209, 168, 95, 49, 170, - 83, 52, 129, 56, 135, 85, 225, 215, 114, 248, 218, 60, 189, 89, 223, 200, - 125, 33, 218, 203, 7, 186, 147, 150, 60, 85, 197, 56, 78, 152, 145, 234, - 33, 248, 213, 34, 46, 103, 76, 104, 181, 77, 198, 236, 50, 124, 243, 129, - 94, 124, 227, 196, 15, 44, 186, 171, 92, 160, 143, 245, 190, 238, 209, 53, - 68, 166, 243, 16, 94, 127, 227, 166, 179, 88, 120, 88, 14, 9, 241, 240, - 42, 195, 111, 60, 224, 239, 55, 238, 25, 127, 64, 66, 110, 4, 75, 13, - 2, 95, 79, 227, 176, 5, 239, 161, 208, 110, 202, 135, 12, 143, 90, 211, - 3, 116, 30, 218, 222, 211, 240, 83, 88, 213, 77, 90, 166, 19, 242, 196, - 168, 100, 208, 234, 226, 240, 108, 72, 31, 171, 73, 204, 131, 112, 51, 211, - 128, 129, 89, 222, 24, 154, 32, 250, 113, 159, 22, 110, 243, 184, 92, 202, - 53, 160, 201, 93, 188, 195, 85, 20, 222, 101, 6, 38, 168, 160, 225, 224, - 88, 123, 198, 110, 21, 11, 208, 162, 173, 6, 244, 72, 120, 231, 194, 157, - 184, 142, 17, 114, 89, 160, 16, 245, 133, 213, 131, 181, 152, 152, 137, 125, - 30, 109, 218, 161, 61, 114, 19, 101, 251, 223, 176, 6, 229, 10, 80, 218, - 122, 198, 242, 83, 208, 167, 33, 248, 66, 191, 136, 12, 239, 226, 166, 79, - 80, 224, 51, 212, 65, 164, 21, 250, 32, 248, 215, 110, 131, 246, 54, 190, - 57, 31, 189, 153, 246, 47, 107, 94, 57, 172, 153, 223, 211, 192, 195, 50, - 97, 79, 195, 146, 55, 246, 156, 117, 65, 132, 104, 183, 241, 192, 232, 191, - 81, 124, 185, 240, 3, 130, 68, 140, 108, 198, 13, 188, 240, 158, 22, 17, - 220, 196, 0, 225, 252, 164, 44, 40, 211, 48, 195, 215, 26, 104, 158, 187, - 46, 248, 22, 69, 107, 184, 254, 222, 192, 145, 177, 78, 183, 75, 30, 162, - 14, 255, 6, 213, 77, 220, 210, 118, 230, 99, 149, 87, 62, 36, 81, 241, - 160, 50, 113, 122, 9, 43, 20, 79, 136, 85, 42, 150, 156, 172, 88, 38, - 250, 78, 236, 59, 255, 51, 161, 38, 254, 109, 1, 79, 182, 232, 0, 133, - 119, 251, 105, 184, 169, 139, 223, 206, 238, 226, 159, 30, 136, 77, 246, 104, - 101, 19, 104, 126, 11, 56, 30, 251, 56, 129, 13, 131, 6, 29, 14, 130, - 255, 189, 173, 112, 120, 96, 119, 52, 253, 107, 58, 131, 224, 229, 236, 46, - 246, 238, 224, 40, 57, 124, 43, 36, 152, 214, 64, 119, 58, 58, 190, 200, - 215, 114, 69, 80, 115, 145, 147, 210, 116, 31, 50, 16, 70, 46, 11, 163, - 190, 136, 216, 71, 163, 154, 211, 216, 231, 102, 38, 85, 171, 93, 37, 10, - 240, 13, 48, 201, 241, 16, 59, 58, 133, 254, 181, 130, 33, 194, 195, 100, - 172, 61, 93, 74, 196, 56, 62, 61, 87, 92, 144, 85, 185, 141, 165, 207, - 141, 125, 35, 253, 58, 198, 241, 23, 87, 161, 191, 166, 152, 112, 91, 127, - 143, 126, 9, 110, 218, 80, 235, 48, 68, 22, 62, 133, 94, 113, 242, 247, - 186, 133, 208, 207, 12, 128, 61, 73, 36, 89, 72, 49, 167, 4, 194, 27, - 207, 19, 59, 255, 9, 68, 245, 108, 240, 42, 142, 112, 236, 101, 184, 167, - 111, 47, 214, 232, 119, 128, 67, 85, 86, 131, 246, 175, 254, 208, 48, 218, - 103, 44, 77, 90, 160, 103, 230, 73, 175, 21, 18, 245, 75, 16, 226, 136, - 203, 115, 53, 234, 53, 207, 122, 34, 72, 102, 174, 244, 66, 74, 218, 175, - 63, 87, 246, 189, 52, 185, 125, 96, 55, 118, 34, 32, 243, 166, 152, 176, - 19, 74, 13, 246, 253, 91, 22, 212, 190, 129, 76, 236, 252, 252, 167, 236, - 137, 254, 219, 33, 26, 146, 13, 27, 174, 187, 139, 209, 186, 155, 89, 151, - 209, 199, 82, 72, 30, 68, 239, 98, 86, 4, 126, 167, 47, 148, 149, 36, - 9, 187, 125, 223, 116, 187, 249, 189, 25, 221, 163, 131, 75, 125, 134, 161, - 182, 216, 197, 207, 246, 107, 210, 102, 114, 97, 89, 92, 94, 6, 125, 90, - 218, 176, 65, 29, 78, 250, 195, 244, 131, 223, 46, 52, 254, 0, 155, 3, - 6, 189, 22, 162, 203, 223, 110, 81, 17, 125, 60, 9, 151, 172, 43, 141, - 43, 106, 250, 168, 17, 34, 212, 149, 208, 5, 51, 126, 76, 68, 227, 92, - 36, 246, 66, 255, 252, 91, 161, 171, 167, 134, 225, 247, 135, 63, 35, 202, - 209, 140, 104, 4, 77, 42, 52, 176, 65, 233, 9, 56, 61, 0, 199, 131, - 111, 122, 238, 253, 249, 33, 118, 224, 45, 228, 27, 192, 8, 165, 181, 246, - 76, 104, 79, 215, 55, 64, 9, 38, 67, 243, 219, 75, 198, 127, 65, 46, - 42, 46, 167, 128, 170, 14, 19, 134, 22, 43, 132, 243, 167, 156, 89, 26, - 7, 108, 111, 60, 40, 97, 35, 211, 55, 45, 61, 54, 225, 40, 252, 40, - 59, 251, 46, 176, 255, 195, 66, 102, 37, 141, 79, 178, 79, 207, 197, 89, - 7, 28, 53, 250, 186, 217, 182, 221, 150, 61, 212, 209, 115, 10, 196, 170, - 222, 246, 99, 149, 56, 246, 200, 14, 158, 9, 139, 9, 63, 51, 64, 19, - 231, 182, 84, 104, 92, 153, 125, 61, 140, 29, 132, 19, 188, 44, 189, 177, - 112, 95, 136, 69, 249, 63, 52, 238, 226, 173, 153, 106, 239, 21, 127, 158, - 224, 177, 184, 29, 154, 218, 127, 84, 186, 250, 189, 247, 24, 123, 34, 44, - 38, 252, 186, 222, 171, 231, 127, 134, 37, 220, 253, 20, 149, 207, 196, 119, - 199, 209, 233, 122, 26, 124, 31, 101, 96, 73, 162, 255, 97, 22, 20, 239, - 154, 52, 70, 68, 23, 166, 1, 218, 48, 51, 130, 225, 18, 121, 194, 225, - 129, 140, 5, 25, 73, 218, 232, 8, 108, 225, 252, 1, 226, 178, 91, 115, - 30, 27, 35, 11, 105, 9, 107, 205, 69, 119, 138, 34, 76, 223, 120, 172, - 161, 69, 219, 140, 133, 109, 210, 127, 91, 119, 133, 38, 125, 151, 160, 132, - 196, 247, 226, 3, 51, 234, 200, 244, 26, 13, 101, 38, 141, 225, 239, 208, - 215, 50, 117, 247, 73, 51, 148, 91, 104, 226, 176, 187, 229, 101, 75, 79, - 49, 3, 2, 2, 86, 120, 18, 15, 178, 4, 119, 155, 252, 45, 44, 17, - 3, 172, 103, 194, 130, 116, 220, 84, 19, 240, 31, 10, 20, 100, 17, 5, - 225, 217, 52, 214, 114, 197, 95, 182, 36, 106, 251, 249, 229, 131, 4, 25, - 98, 167, 98, 208, 190, 244, 224, 10, 13, 116, 233, 96, 192, 77, 161, 31, - 195, 40, 85, 72, 75, 76, 90, 17, 39, 251, 91, 220, 44, 203, 11, 39, - 91, 119, 249, 37, 115, 157, 196, 243, 196, 177, 24, 211, 208, 127, 242, 92, - 44, 169, 23, 134, 236, 233, 109, 214, 244, 43, 244, 25, 233, 207, 202, 76, - 22, 123, 45, 28, 97, 234, 18, 67, 65, 29, 164, 28, 48, 148, 165, 124, - 49, 168, 49, 202, 88, 212, 96, 240, 80, 173, 127, 193, 94, 56, 102, 152, - 24, 174, 230, 22, 210, 226, 195, 167, 198, 2, 146, 68, 147, 215, 55, 43, - 11, 75, 165, 22, 186, 108, 101, 197, 68, 134, 63, 151, 3, 1, 226, 43, - 185, 217, 95, 171, 38, 135, 139, 8, 102, 199, 238, 112, 60, 119, 65, 196, - 194, 6, 110, 84, 54, 54, 148, 184, 9, 123, 48, 122, 25, 101, 35, 246, - 228, 127, 72, 244, 44, 244, 81, 218, 129, 108, 4, 242, 145, 89, 164, 166, - 230, 25, 217, 156, 146, 141, 116, 205, 82, 2, 237, 99, 41, 199, 69, 222, - 17, 26, 73, 106, 87, 95, 162, 106, 108, 92, 144, 53, 105, 99, 104, 174, - 11, 206, 6, 254, 146, 139, 120, 158, 112, 141, 121, 62, 110, 180, 29, 170, - 69, 179, 81, 248, 20, 222, 11, 201, 219, 180, 117, 213, 149, 61, 204, 211, - 96, 82, 232, 4, 163, 79, 147, 35, 71, 80, 2, 70, 35, 36, 28, 89, - 48, 19, 11, 2, 149, 146, 75, 83, 4, 137, 229, 243, 45, 80, 227, 12, - 6, 157, 116, 86, 103, 45, 21, 4, 141, 101, 45, 21, 209, 143, 49, 201, - 226, 252, 220, 171, 106, 91, 12, 51, 227, 91, 23, 222, 252, 7, 179, 102, - 79, 58, 80, 137, 56, 205, 135, 212, 249, 159, 29, 201, 161, 59, 20, 172, - 2, 126, 31, 139, 133, 2, 17, 211, 68, 246, 83, 108, 148, 101, 26, 163, - 248, 253, 226, 50, 139, 217, 41, 48, 182, 154, 83, 225, 223, 179, 150, 23, - 97, 226, 164, 14, 198, 149, 230, 55, 144, 35, 177, 45, 35, 138, 28, 159, - 172, 71, 110, 35, 2, 111, 98, 86, 116, 212, 34, 6, 232, 161, 167, 103, - 29, 219, 122, 128, 9, 136, 51, 240, 239, 226, 167, 194, 203, 55, 174, 40, - 188, 85, 83, 122, 194, 139, 11, 67, 54, 121, 197, 47, 91, 82, 96, 193, - 141, 27, 188, 65, 118, 212, 250, 10, 220, 114, 186, 28, 77, 150, 120, 46, - 255, 101, 75, 185, 252, 116, 57, 154, 42, 241, 92, 126, 213, 150, 114, 249, - 233, 114, 98, 150, 196, 51, 250, 223, 178, 148, 209, 79, 151, 227, 51, 36, - 228, 83, 226, 151, 194, 139, 191, 25, 29, 112, 187, 95, 16, 127, 40, 211, - 70, 119, 5, 232, 8, 44, 34, 198, 105, 32, 65, 252, 134, 129, 41, 199, - 253, 17, 67, 183, 98, 224, 86, 25, 190, 193, 77, 185, 6, 181, 226, 227, - 102, 220, 106, 195, 123, 57, 243, 248, 240, 28, 55, 255, 251, 194, 110, 68, - 184, 17, 215, 255, 94, 248, 132, 59, 235, 137, 227, 0, 54, 23, 46, 26, - 166, 133, 219, 226, 104, 200, 228, 4, 215, 66, 116, 249, 186, 221, 155, 186, - 100, 247, 182, 104, 137, 130, 26, 88, 66, 88, 222, 54, 60, 189, 175, 91, - 29, 106, 46, 156, 186, 163, 118, 162, 59, 29, 180, 79, 184, 28, 233, 195, - 96, 97, 80, 88, 48, 163, 248, 111, 77, 96, 137, 72, 106, 202, 4, 14, - 218, 142, 154, 164, 124, 226, 152, 151, 149, 224, 255, 190, 222, 100, 203, 139, - 206, 63, 196, 14, 226, 133, 57, 28, 82, 137, 231, 208, 11, 193, 255, 253, - 181, 223, 178, 3, 77, 50, 241, 109, 193, 67, 83, 36, 49, 57, 68, 152, - 89, 84, 92, 41, 222, 233, 219, 200, 223, 175, 28, 147, 206, 6, 84, 203, - 76, 43, 248, 225, 179, 161, 15, 253, 79, 47, 12, 83, 84, 115, 229, 247, - 104, 114, 145, 72, 232, 222, 180, 162, 201, 117, 163, 175, 183, 34, 184, 39, - 135, 221, 11, 177, 235, 184, 106, 17, 90, 207, 179, 111, 82, 150, 55, 56, - 70, 35, 221, 26, 55, 18, 230, 71, 203, 75, 160, 4, 138, 128, 136, 27, - 102, 160, 38, 136, 90, 33, 1, 134, 128, 147, 212, 77, 51, 86, 92, 124, - 39, 35, 76, 131, 145, 162, 187, 108, 177, 34, 23, 23, 119, 232, 63, 145, - 116, 179, 94, 92, 219, 229, 229, 77, 121, 153, 106, 223, 78, 248, 231, 149, - 23, 124, 181, 147, 11, 192, 77, 196, 103, 120, 29, 34, 225, 191, 189, 67, - 199, 58, 54, 17, 210, 58, 4, 63, 228, 49, 210, 102, 96, 152, 32, 6, - 134, 9, 3, 170, 246, 108, 2, 251, 167, 71, 151, 155, 28, 3, 135, 4, - 194, 86, 198, 120, 200, 23, 191, 33, 110, 225, 198, 26, 70, 153, 203, 149, - 214, 153, 219, 87, 78, 94, 39, 144, 144, 205, 24, 232, 138, 159, 242, 188, - 24, 61, 79, 123, 172, 176, 199, 104, 150, 81, 204, 83, 179, 12, 52, 140, - 248, 184, 214, 253, 158, 147, 242, 51, 248, 179, 78, 240, 242, 99, 100, 183, - 49, 203, 196, 76, 58, 152, 93, 7, 53, 112, 16, 165, 141, 181, 41, 153, - 228, 11, 24, 84, 109, 53, 201, 140, 116, 87, 144, 100, 65, 117, 137, 138, - 192, 250, 105, 17, 57, 222, 138, 98, 54, 67, 240, 51, 161, 1, 241, 7, - 45, 101, 54, 240, 226, 57, 47, 11, 147, 151, 12, 9, 170, 200, 7, 207, - 184, 231, 238, 75, 170, 95, 43, 85, 179, 23, 93, 90, 131, 120, 124, 92, - 33, 97, 45, 126, 169, 55, 6, 173, 134, 19, 236, 118, 184, 193, 173, 144, - 184, 75, 91, 36, 48, 103, 153, 248, 150, 166, 170, 48, 95, 247, 165, 217, - 158, 52, 30, 47, 44, 82, 157, 52, 166, 38, 250, 156, 97, 93, 92, 14, - 198, 103, 180, 165, 150, 204, 170, 44, 78, 92, 12, 171, 27, 90, 146, 162, - 205, 90, 3, 180, 105, 211, 166, 248, 39, 52, 208, 246, 242, 137, 35, 58, - 22, 53, 34, 191, 162, 55, 45, 218, 210, 76, 66, 227, 81, 127, 79, 225, - 254, 83, 204, 37, 29, 56, 128, 61, 230, 90, 13, 203, 143, 130, 12, 85, - 26, 69, 139, 2, 80, 145, 134, 204, 200, 128, 27, 117, 27, 35, 22, 205, - 185, 171, 247, 135, 52, 114, 40, 182, 119, 30, 27, 156, 6, 8, 238, 119, - 240, 67, 186, 3, 60, 174, 31, 226, 174, 0, 246, 18, 176, 61, 144, 206, - 45, 157, 5, 81, 70, 58, 26, 0, 155, 115, 71, 206, 184, 53, 26, 3, - 217, 167, 88, 252, 210, 127, 88, 28, 151, 231, 42, 78, 99, 130, 38, 13, - 13, 215, 183, 48, 117, 124, 235, 83, 40, 120, 161, 48, 168, 197, 96, 243, - 173, 236, 29, 68, 132, 11, 10, 8, 107, 150, 154, 213, 182, 62, 210, 152, - 222, 29, 144, 99, 141, 190, 107, 99, 14, 148, 105, 126, 120, 103, 186, 194, - 241, 141, 46, 96, 172, 211, 50, 67, 51, 76, 164, 53, 41, 65, 19, 248, - 114, 96, 154, 225, 135, 185, 102, 129, 196, 255, 125, 129, 85, 93, 202, 244, - 14, 26, 8, 48, 210, 178, 219, 186, 19, 183, 218, 253, 173, 1, 87, 11, - 43, 176, 116, 221, 104, 210, 49, 152, 19, 95, 183, 254, 155, 20, 154, 43, - 134, 195, 152, 6, 123, 94, 11, 135, 205, 58, 130, 155, 15, 76, 23, 135, - 239, 47, 212, 74, 241, 71, 188, 64, 84, 142, 163, 210, 195, 149, 13, 219, - 166, 10, 1, 248, 163, 181, 85, 104, 101, 132, 110, 200, 232, 91, 250, 69, - 112, 243, 80, 139, 0, 251, 177, 21, 161, 58, 44, 49, 131, 148, 202, 51, - 25, 128, 125, 244, 147, 31, 32, 224, 118, 130, 8, 171, 149, 152, 89, 205, - 210, 7, 45, 185, 75, 109, 61, 79, 94, 184, 238, 22, 242, 191, 85, 31, - 75, 87, 17, 57, 25, 165, 234, 75, 240, 217, 193, 199, 226, 135, 210, 175, - 132, 178, 125, 169, 197, 57, 92, 110, 34, 228, 66, 31, 157, 132, 229, 101, - 184, 216, 8, 90, 227, 199, 66, 31, 14, 60, 186, 150, 250, 37, 211, 223, - 204, 184, 192, 137, 31, 233, 74, 39, 243, 5, 87, 67, 248, 228, 151, 45, - 102, 9, 148, 199, 31, 76, 220, 192, 11, 140, 153, 202, 33, 188, 84, 137, - 190, 34, 248, 76, 180, 33, 18, 95, 64, 36, 97, 151, 108, 10, 45, 214, - 23, 78, 56, 183, 46, 135, 93, 221, 241, 217, 245, 160, 49, 252, 225, 210, - 123, 33, 121, 187, 154, 97, 111, 113, 63, 232, 54, 14, 134, 237, 21, 138, - 5, 173, 148, 162, 155, 173, 164, 88, 48, 52, 208, 176, 153, 138, 137, 133, - 147, 217, 79, 170, 110, 75, 54, 207, 75, 250, 211, 194, 145, 154, 143, 19, - 181, 2, 208, 70, 42, 44, 147, 222, 46, 106, 234, 175, 4, 88, 140, 182, - 85, 65, 44, 234, 157, 77, 208, 202, 181, 240, 74, 84, 195, 75, 169, 236, - 95, 198, 23, 5, 97, 20, 235, 168, 148, 228, 126, 207, 9, 218, 133, 80, - 221, 52, 150, 111, 31, 218, 44, 110, 167, 190, 88, 61, 255, 121, 176, 158, - 136, 55, 219, 107, 86, 221, 255, 73, 52, 182, 212, 189, 158, 104, 112, 161, - 218, 103, 143, 208, 50, 252, 57, 167, 110, 104, 5, 134, 213, 84, 138, 233, - 130, 116, 23, 29, 20, 20, 218, 92, 107, 19, 34, 173, 191, 4, 62, 234, - 28, 15, 74, 251, 120, 96, 161, 134, 136, 230, 172, 184, 185, 84, 88, 223, - 0, 26, 106, 223, 202, 199, 19, 168, 26, 197, 117, 26, 99, 23, 49, 94, - 112, 75, 103, 83, 220, 96, 241, 119, 65, 193, 161, 15, 233, 31, 80, 130, - 100, 166, 223, 113, 49, 71, 40, 57, 227, 210, 65, 196, 176, 62, 74, 184, - 111, 73, 167, 17, 179, 72, 142, 191, 156, 25, 60, 195, 11, 169, 61, 165, - 95, 249, 124, 90, 237, 227, 26, 85, 116, 90, 160, 124, 8, 191, 46, 128, - 114, 192, 22, 209, 226, 200, 36, 168, 20, 51, 46, 75, 227, 58, 83, 131, - 225, 34, 100, 64, 176, 216, 220, 151, 173, 231, 239, 212, 7, 12, 41, 4, - 250, 7, 97, 170, 2, 48, 186, 76, 240, 190, 88, 31, 36, 206, 32, 96, - 117, 1, 10, 228, 210, 75, 215, 114, 207, 172, 248, 151, 117, 110, 182, 201, - 90, 39, 249, 6, 126, 241, 13, 169, 92, 132, 217, 90, 196, 94, 238, 7, - 65, 22, 114, 207, 9, 100, 59, 124, 136, 167, 110, 76, 149, 244, 239, 132, - 248, 77, 26, 95, 242, 153, 74, 92, 211, 83, 150, 118, 100, 208, 124, 109, - 97, 187, 101, 113, 77, 21, 99, 25, 139, 7, 237, 191, 226, 244, 44, 252, - 39, 150, 147, 197, 191, 238, 201, 182, 196, 214, 128, 55, 106, 111, 239, 53, - 75, 175, 237, 53, 35, 100, 66, 211, 108, 165, 108, 21, 31, 56, 102, 251, - 119, 180, 166, 163, 27, 194, 5, 57, 77, 179, 9, 135, 64, 134, 42, 240, - 91, 207, 232, 96, 91, 2, 57, 29, 60, 96, 98, 58, 185, 217, 74, 73, - 253, 104, 1, 45, 208, 247, 34, 157, 99, 97, 216, 64, 177, 173, 169, 208, - 154, 109, 229, 158, 139, 130, 194, 248, 142, 198, 117, 176, 53, 160, 28, 133, - 157, 245, 226, 191, 194, 102, 137, 65, 236, 155, 137, 90, 5, 126, 115, 80, - 72, 174, 53, 19, 16, 2, 46, 54, 124, 105, 172, 26, 84, 94, 124, 52, - 25, 54, 140, 105, 170, 143, 35, 34, 44, 165, 68, 139, 152, 184, 221, 107, - 20, 250, 38, 42, 46, 203, 2, 223, 208, 109, 82, 255, 93, 255, 65, 100, - 157, 127, 151, 19, 100, 108, 231, 195, 183, 28, 77, 206, 173, 60, 174, 231, - 22, 142, 148, 127, 146, 112, 133, 241, 76, 30, 230, 125, 114, 238, 175, 176, - 159, 89, 38, 252, 201, 241, 127, 133, 214, 220, 108, 1, 1, 171, 167, 97, - 95, 71, 224, 91, 151, 46, 43, 6, 62, 110, 137, 49, 182, 90, 204, 164, - 163, 173, 187, 45, 199, 108, 198, 236, 192, 135, 176, 68, 16, 184, 230, 140, - 134, 21, 218, 228, 246, 109, 171, 131, 51, 225, 83, 138, 195, 216, 216, 193, - 48, 66, 125, 211, 122, 92, 203, 118, 71, 163, 225, 39, 66, 92, 52, 12, - 166, 214, 248, 155, 205, 190, 221, 65, 139, 252, 205, 150, 61, 32, 212, 36, - 185, 160, 17, 191, 6, 121, 54, 188, 242, 35, 59, 207, 198, 219, 102, 119, - 52, 232, 255, 94, 135, 63, 114, 33, 109, 174, 199, 231, 1, 106, 193, 136, - 12, 207, 188, 253, 133, 0, 4, 64, 48, 96, 44, 76, 233, 223, 153, 96, - 27, 198, 20, 255, 224, 244, 21, 243, 229, 23, 255, 76, 39, 160, 141, 78, - 118, 154, 13, 87, 223, 242, 189, 170, 23, 225, 3, 178, 57, 150, 146, 13, - 32, 3, 98, 120, 3, 217, 176, 172, 240, 41, 190, 147, 62, 193, 139, 236, - 135, 88, 242, 44, 72, 158, 69, 201, 180, 182, 28, 34, 196, 126, 207, 175, - 101, 115, 244, 54, 251, 97, 61, 254, 120, 150, 124, 60, 139, 61, 158, 72, - 254, 62, 63, 170, 12, 65, 98, 55, 72, 236, 98, 98, 214, 255, 102, 108, - 171, 151, 12, 112, 47, 252, 212, 172, 79, 58, 114, 81, 249, 150, 54, 40, - 86, 18, 150, 128, 176, 74, 107, 210, 198, 148, 80, 84, 33, 244, 33, 95, - 223, 96, 85, 228, 233, 135, 49, 164, 37, 160, 152, 17, 138, 50, 20, 81, - 204, 24, 197, 12, 202, 192, 247, 95, 127, 151, 128, 22, 175, 110, 240, 234, - 90, 26, 208, 27, 120, 150, 231, 110, 36, 134, 190, 68, 81, 12, 232, 171, - 169, 235, 24, 106, 106, 88, 35, 10, 217, 68, 51, 172, 99, 249, 9, 130, - 252, 34, 193, 58, 67, 109, 90, 85, 212, 13, 228, 120, 181, 168, 24, 1, - 20, 181, 86, 231, 183, 224, 123, 182, 38, 248, 24, 202, 132, 148, 59, 150, - 210, 13, 83, 14, 17, 148, 202, 71, 172, 138, 218, 179, 254, 102, 195, 221, - 189, 221, 112, 64, 81, 103, 125, 209, 104, 186, 107, 34, 123, 227, 198, 221, - 119, 138, 128, 129, 13, 127, 183, 252, 180, 206, 158, 174, 93, 47, 213, 252, - 102, 185, 230, 215, 194, 13, 67, 208, 242, 229, 15, 12, 107, 61, 136, 98, - 140, 209, 195, 122, 241, 125, 245, 33, 187, 255, 225, 198, 169, 132, 149, 79, - 82, 143, 245, 99, 134, 248, 193, 2, 166, 66, 189, 20, 34, 155, 146, 159, - 52, 27, 89, 212, 148, 150, 180, 185, 69, 83, 107, 200, 86, 142, 27, 14, - 44, 229, 243, 97, 56, 89, 136, 112, 138, 2, 14, 235, 175, 5, 1, 146, - 208, 199, 232, 145, 63, 97, 128, 158, 220, 78, 127, 188, 40, 112, 146, 71, - 109, 203, 11, 211, 5, 5, 142, 137, 194, 88, 203, 248, 104, 120, 245, 252, - 246, 212, 68, 27, 155, 187, 224, 162, 238, 95, 253, 7, 196, 239, 49, 250, - 33, 249, 237, 190, 197, 121, 24, 24, 96, 209, 228, 244, 191, 136, 144, 177, - 2, 150, 59, 117, 188, 225, 102, 144, 251, 195, 100, 131, 72, 104, 209, 79, - 152, 250, 191, 51, 193, 105, 180, 27, 86, 103, 234, 255, 194, 189, 14, 237, - 228, 8, 125, 167, 9, 253, 38, 180, 253, 190, 17, 216, 25, 65, 36, 60, - 236, 160, 28, 255, 130, 9, 14, 81, 242, 157, 186, 252, 167, 191, 108, 229, - 2, 194, 44, 98, 254, 102, 253, 7, 179, 232, 193, 236, 37, 211, 214, 251, - 163, 198, 84, 160, 63, 51, 68, 114, 11, 234, 228, 95, 204, 190, 193, 106, - 43, 124, 97, 152, 241, 27, 44, 203, 146, 149, 199, 188, 33, 89, 64, 5, - 235, 40, 255, 5, 236, 23, 243, 225, 250, 16, 86, 201, 99, 119, 235, 31, - 207, 185, 168, 113, 254, 241, 242, 143, 231, 165, 2, 104, 226, 98, 141, 88, - 34, 109, 42, 122, 201, 154, 139, 94, 6, 77, 70, 111, 88, 179, 209, 203, - 160, 233, 86, 188, 36, 99, 5, 239, 176, 94, 253, 26, 10, 162, 3, 203, - 151, 141, 181, 244, 118, 90, 202, 129, 64, 132, 150, 57, 10, 132, 118, 66, - 38, 71, 159, 254, 247, 176, 126, 159, 164, 80, 66, 175, 196, 7, 106, 71, - 83, 86, 250, 158, 13, 63, 57, 204, 232, 87, 130, 190, 35, 232, 255, 15, - 27, 107, 183, 192, 207, 147, 36, 179, 24, 201, 12, 73, 170, 49, 18, 255, - 243, 40, 73, 208, 58, 65, 49, 20, 248, 136, 22, 156, 164, 158, 197, 169, - 195, 18, 67, 234, 89, 64, 125, 193, 249, 192, 135, 126, 185, 223, 81, 16, - 250, 185, 190, 71, 42, 2, 40, 158, 163, 6, 2, 31, 49, 47, 137, 112, - 146, 176, 76, 33, 217, 208, 148, 168, 122, 48, 52, 63, 211, 136, 84, 63, - 86, 242, 126, 54, 32, 128, 89, 48, 101, 35, 155, 197, 224, 82, 44, 109, - 198, 249, 198, 29, 144, 200, 130, 78, 177, 244, 105, 242, 129, 28, 61, 0, - 133, 44, 187, 194, 26, 103, 89, 115, 195, 5, 25, 27, 177, 156, 191, 69, - 228, 223, 226, 126, 76, 64, 192, 198, 113, 38, 242, 155, 22, 126, 153, 254, - 243, 159, 211, 173, 45, 16, 214, 108, 247, 37, 125, 231, 168, 185, 201, 193, - 144, 99, 185, 3, 127, 97, 142, 111, 110, 198, 147, 51, 14, 221, 221, 161, - 14, 220, 136, 232, 29, 119, 62, 23, 5, 4, 244, 198, 173, 87, 255, 37, - 249, 180, 29, 30, 191, 146, 209, 168, 101, 21, 85, 88, 101, 241, 50, 187, - 225, 247, 200, 45, 135, 128, 63, 133, 160, 131, 170, 28, 130, 253, 20, 16, - 166, 18, 39, 67, 54, 67, 59, 22, 237, 36, 89, 7, 243, 220, 20, 58, - 79, 34, 147, 207, 25, 232, 38, 84, 64, 102, 164, 203, 212, 129, 117, 236, - 85, 10, 38, 117, 177, 129, 190, 224, 240, 28, 250, 221, 233, 226, 134, 195, - 218, 218, 5, 100, 157, 175, 19, 248, 205, 195, 239, 250, 119, 220, 30, 36, - 193, 124, 88, 223, 184, 96, 10, 92, 48, 31, 96, 136, 117, 109, 106, 182, - 73, 223, 235, 235, 100, 193, 84, 96, 79, 241, 29, 193, 83, 10, 83, 197, - 180, 168, 55, 135, 148, 207, 107, 152, 186, 245, 211, 212, 207, 227, 173, 66, - 238, 135, 25, 226, 90, 253, 125, 0, 175, 71, 95, 252, 79, 33, 254, 215, - 195, 88, 24, 67, 251, 186, 223, 94, 22, 154, 55, 209, 184, 81, 211, 50, - 188, 208, 216, 252, 100, 104, 161, 177, 41, 24, 52, 62, 155, 84, 119, 66, - 29, 177, 201, 88, 210, 218, 90, 157, 78, 69, 212, 229, 200, 5, 252, 249, - 30, 52, 102, 208, 7, 107, 148, 18, 181, 66, 194, 46, 121, 14, 89, 6, - 235, 182, 6, 197, 60, 35, 23, 235, 209, 75, 214, 88, 107, 162, 26, 75, - 251, 122, 125, 3, 198, 5, 129, 206, 94, 255, 64, 7, 136, 223, 223, 48, - 58, 54, 176, 111, 225, 9, 148, 136, 253, 190, 254, 129, 142, 24, 218, 7, - 52, 171, 128, 93, 79, 181, 194, 199, 205, 88, 28, 174, 40, 8, 215, 202, - 86, 167, 195, 54, 214, 202, 190, 187, 147, 223, 66, 31, 66, 102, 253, 33, - 96, 229, 211, 240, 106, 246, 65, 96, 136, 35, 145, 183, 84, 92, 193, 195, - 221, 152, 223, 82, 88, 232, 86, 21, 225, 147, 34, 140, 17, 151, 99, 114, - 113, 165, 50, 17, 219, 238, 137, 125, 207, 150, 184, 90, 251, 200, 109, 4, - 74, 116, 100, 251, 159, 244, 229, 88, 112, 227, 72, 221, 137, 172, 161, 170, - 202, 137, 41, 234, 110, 128, 155, 186, 184, 41, 200, 114, 72, 11, 106, 110, - 94, 140, 155, 211, 45, 101, 122, 27, 171, 243, 223, 166, 80, 46, 128, 242, - 7, 30, 34, 24, 199, 195, 26, 153, 110, 112, 27, 219, 68, 69, 75, 242, - 192, 127, 228, 247, 218, 95, 4, 221, 179, 148, 126, 8, 17, 115, 237, 72, - 177, 199, 246, 157, 17, 77, 215, 106, 88, 107, 57, 121, 253, 239, 57, 229, - 19, 155, 254, 212, 39, 81, 240, 49, 122, 153, 255, 97, 194, 79, 36, 60, - 60, 244, 29, 15, 159, 75, 121, 245, 37, 147, 58, 96, 216, 102, 120, 60, - 239, 198, 171, 80, 194, 99, 193, 219, 122, 102, 53, 139, 87, 204, 71, 3, - 73, 169, 223, 231, 7, 106, 114, 143, 57, 214, 5, 100, 53, 236, 242, 219, - 75, 58, 42, 177, 48, 21, 133, 153, 184, 245, 124, 179, 245, 144, 27, 11, - 57, 239, 219, 103, 80, 218, 158, 97, 252, 225, 246, 60, 254, 124, 227, 65, - 106, 21, 10, 27, 15, 55, 66, 254, 230, 219, 58, 3, 47, 22, 34, 0, - 99, 54, 179, 3, 192, 96, 40, 45, 55, 19, 147, 94, 145, 209, 244, 93, - 73, 27, 231, 27, 75, 230, 153, 87, 250, 20, 77, 19, 218, 220, 65, 191, - 225, 6, 225, 45, 252, 180, 31, 29, 76, 19, 150, 147, 210, 194, 92, 192, - 98, 108, 201, 154, 171, 184, 116, 8, 121, 247, 83, 84, 245, 252, 219, 113, - 3, 239, 126, 130, 134, 6, 41, 76, 179, 90, 91, 240, 175, 160, 116, 135, - 150, 209, 31, 83, 196, 242, 68, 48, 195, 120, 12, 14, 68, 245, 227, 2, - 248, 246, 8, 158, 236, 213, 89, 248, 30, 131, 227, 79, 17, 131, 67, 70, - 24, 171, 84, 190, 150, 28, 250, 41, 230, 239, 9, 164, 33, 42, 233, 203, - 220, 16, 104, 7, 13, 118, 152, 8, 183, 20, 130, 0, 81, 157, 152, 98, - 12, 252, 176, 3, 154, 241, 140, 193, 23, 100, 248, 68, 76, 15, 84, 140, - 249, 0, 157, 167, 196, 125, 223, 228, 242, 64, 179, 193, 236, 207, 2, 48, - 27, 20, 214, 168, 84, 255, 152, 206, 2, 43, 51, 22, 96, 110, 99, 147, - 129, 68, 229, 68, 234, 120, 135, 27, 96, 230, 96, 93, 160, 191, 39, 235, - 176, 22, 68, 227, 180, 156, 180, 226, 97, 100, 178, 150, 9, 77, 214, 124, - 176, 165, 36, 40, 106, 58, 63, 88, 29, 75, 36, 217, 134, 185, 141, 229, - 16, 59, 19, 211, 233, 251, 236, 7, 47, 133, 240, 234, 117, 116, 75, 113, - 1, 229, 250, 183, 34, 83, 254, 121, 125, 161, 88, 195, 45, 67, 99, 176, - 7, 244, 44, 58, 112, 160, 240, 171, 29, 160, 80, 250, 232, 147, 244, 231, - 215, 194, 207, 254, 140, 69, 110, 82, 153, 42, 82, 125, 75, 253, 29, 230, - 118, 137, 26, 78, 44, 157, 147, 4, 141, 65, 13, 44, 39, 13, 52, 172, - 196, 191, 111, 140, 55, 214, 18, 49, 27, 145, 16, 135, 55, 50, 16, 41, - 38, 253, 13, 126, 243, 185, 246, 31, 194, 112, 255, 214, 180, 218, 108, 98, - 78, 224, 74, 8, 46, 210, 116, 128, 120, 115, 225, 87, 74, 75, 118, 241, - 111, 152, 213, 167, 202, 234, 205, 114, 114, 242, 166, 68, 29, 94, 178, 220, - 73, 30, 249, 138, 32, 185, 26, 14, 200, 37, 148, 153, 14, 138, 56, 253, - 141, 73, 252, 30, 130, 248, 61, 4, 241, 123, 8, 226, 119, 85, 244, 247, - 137, 186, 74, 145, 24, 210, 188, 228, 41, 43, 142, 80, 87, 162, 16, 111, - 24, 124, 152, 62, 197, 83, 152, 34, 198, 106, 163, 136, 26, 41, 148, 11, - 236, 123, 165, 202, 198, 74, 91, 86, 212, 168, 255, 11, 21, 7, 115, 184, - 18, 130, 139, 184, 212, 92, 192, 49, 131, 101, 212, 102, 33, 9, 100, 246, - 243, 56, 9, 127, 58, 12, 241, 213, 154, 218, 156, 182, 92, 160, 168, 101, - 185, 191, 254, 21, 227, 160, 253, 77, 140, 84, 54, 74, 1, 26, 27, 40, - 232, 31, 94, 224, 175, 252, 1, 247, 41, 66, 189, 45, 12, 184, 135, 235, - 133, 165, 128, 123, 244, 156, 245, 193, 7, 45, 242, 225, 82, 232, 18, 193, - 199, 185, 19, 22, 19, 210, 182, 217, 34, 9, 30, 63, 177, 149, 22, 78, - 108, 127, 18, 214, 14, 99, 251, 46, 153, 9, 39, 212, 129, 208, 104, 110, - 28, 223, 214, 122, 29, 197, 56, 77, 52, 151, 133, 132, 112, 110, 196, 4, - 114, 252, 218, 137, 9, 231, 78, 66, 56, 55, 19, 194, 185, 145, 38, 156, - 27, 203, 194, 217, 89, 22, 206, 157, 52, 225, 220, 76, 10, 231, 126, 138, - 112, 70, 146, 60, 50, 171, 86, 186, 112, 198, 231, 241, 103, 177, 71, 11, - 185, 98, 79, 104, 101, 22, 159, 81, 225, 218, 79, 19, 206, 139, 175, 246, - 133, 115, 90, 254, 230, 82, 170, 47, 156, 151, 202, 96, 194, 57, 141, 186, - 187, 152, 74, 165, 111, 55, 38, 156, 221, 101, 225, 236, 37, 132, 179, 185, - 36, 156, 251, 203, 194, 185, 149, 16, 206, 131, 69, 225, 60, 91, 16, 206, - 143, 49, 225, 220, 143, 11, 231, 214, 127, 84, 56, 255, 135, 144, 52, 113, - 241, 147, 182, 171, 17, 103, 4, 8, 16, 128, 193, 235, 227, 73, 49, 207, - 251, 48, 72, 55, 13, 107, 82, 242, 33, 223, 210, 56, 9, 219, 127, 77, - 150, 179, 225, 111, 114, 208, 237, 201, 2, 93, 136, 210, 189, 18, 188, 160, - 166, 244, 137, 253, 73, 110, 53, 89, 180, 229, 233, 111, 117, 74, 104, 218, - 141, 127, 153, 91, 200, 138, 178, 82, 201, 98, 101, 133, 54, 62, 140, 127, - 238, 244, 129, 7, 199, 185, 103, 179, 31, 136, 185, 232, 246, 173, 181, 79, - 12, 32, 127, 165, 149, 242, 66, 128, 132, 148, 192, 223, 139, 190, 18, 67, - 157, 14, 150, 248, 130, 164, 141, 138, 206, 73, 99, 74, 5, 158, 21, 27, - 96, 71, 186, 3, 60, 50, 70, 122, 62, 110, 184, 102, 254, 192, 183, 215, - 7, 250, 216, 229, 142, 141, 5, 196, 156, 163, 25, 110, 192, 40, 97, 223, - 28, 14, 99, 182, 1, 154, 118, 6, 177, 109, 153, 174, 61, 114, 236, 225, - 140, 91, 177, 209, 250, 246, 241, 74, 98, 26, 132, 97, 29, 112, 56, 211, - 188, 212, 245, 203, 116, 89, 76, 134, 6, 131, 252, 153, 116, 117, 139, 17, - 4, 175, 71, 170, 191, 118, 70, 159, 11, 191, 126, 145, 247, 46, 73, 222, - 37, 201, 239, 33, 73, 222, 151, 107, 127, 214, 229, 154, 66, 10, 114, 122, - 208, 160, 72, 96, 128, 96, 180, 135, 91, 185, 231, 108, 195, 233, 112, 34, - 159, 43, 10, 60, 198, 141, 18, 96, 200, 102, 3, 91, 235, 242, 11, 23, - 74, 97, 150, 41, 12, 39, 134, 221, 129, 241, 196, 74, 47, 194, 116, 6, - 151, 26, 51, 242, 192, 216, 116, 126, 52, 186, 192, 162, 71, 197, 192, 87, - 153, 159, 41, 135, 139, 17, 60, 231, 68, 26, 164, 162, 188, 142, 7, 147, - 210, 18, 49, 123, 103, 224, 88, 134, 33, 13, 232, 107, 156, 120, 232, 180, - 152, 91, 38, 23, 186, 166, 154, 153, 84, 185, 185, 114, 209, 25, 175, 244, - 242, 210, 147, 73, 232, 138, 62, 28, 117, 243, 182, 145, 223, 55, 245, 126, - 59, 46, 170, 219, 182, 33, 196, 111, 210, 22, 56, 180, 140, 148, 13, 238, - 133, 21, 14, 37, 131, 209, 215, 50, 93, 166, 218, 81, 240, 87, 4, 29, - 142, 163, 88, 36, 171, 146, 156, 168, 207, 113, 9, 123, 237, 234, 78, 190, - 66, 157, 206, 219, 220, 26, 155, 61, 204, 51, 62, 142, 221, 70, 7, 190, - 111, 48, 251, 19, 39, 252, 233, 50, 51, 114, 127, 15, 222, 207, 181, 131, - 106, 26, 88, 205, 85, 17, 116, 94, 89, 212, 21, 146, 107, 242, 125, 211, - 65, 11, 186, 164, 195, 169, 188, 228, 3, 122, 169, 99, 68, 224, 183, 233, - 150, 247, 132, 19, 26, 193, 242, 50, 18, 21, 43, 245, 95, 89, 68, 190, - 213, 114, 180, 187, 218, 126, 119, 253, 92, 235, 29, 52, 6, 131, 198, 74, - 11, 230, 180, 247, 4, 88, 4, 174, 31, 17, 117, 102, 67, 183, 219, 147, - 197, 238, 98, 32, 2, 2, 67, 80, 128, 186, 53, 217, 224, 161, 14, 219, - 88, 23, 31, 100, 96, 210, 181, 93, 157, 11, 245, 1, 78, 183, 208, 85, - 158, 121, 206, 208, 2, 209, 213, 159, 211, 27, 32, 46, 135, 230, 84, 239, - 71, 238, 249, 9, 32, 128, 145, 141, 177, 20, 176, 58, 20, 6, 160, 153, - 128, 1, 160, 175, 107, 217, 131, 166, 157, 111, 218, 83, 74, 219, 120, 212, - 153, 231, 13, 3, 78, 240, 53, 50, 124, 85, 12, 9, 224, 183, 135, 198, - 250, 151, 153, 115, 145, 72, 43, 66, 177, 6, 76, 2, 13, 153, 114, 5, - 202, 35, 197, 2, 221, 110, 17, 165, 76, 10, 19, 65, 186, 120, 54, 88, - 216, 252, 72, 22, 19, 64, 162, 46, 197, 16, 247, 209, 208, 24, 50, 151, - 97, 50, 105, 246, 195, 143, 237, 1, 52, 133, 111, 25, 22, 24, 104, 109, - 178, 49, 225, 187, 27, 221, 245, 239, 192, 69, 95, 184, 11, 26, 154, 134, - 70, 239, 97, 145, 113, 156, 45, 244, 234, 141, 18, 50, 163, 45, 140, 12, - 18, 4, 175, 25, 111, 61, 211, 208, 53, 163, 245, 23, 206, 219, 122, 166, - 129, 107, 224, 58, 211, 23, 161, 104, 150, 107, 77, 212, 243, 42, 159, 187, - 88, 95, 255, 46, 189, 112, 125, 105, 241, 129, 67, 31, 208, 160, 56, 125, - 144, 9, 185, 49, 220, 242, 185, 190, 4, 151, 30, 205, 210, 132, 39, 227, - 141, 156, 7, 9, 125, 144, 24, 125, 140, 76, 212, 10, 168, 189, 136, 122, - 76, 203, 73, 6, 225, 249, 88, 223, 90, 155, 230, 115, 202, 198, 132, 250, - 246, 146, 208, 194, 240, 110, 107, 109, 150, 207, 149, 54, 186, 11, 233, 198, - 86, 174, 177, 81, 223, 168, 243, 210, 70, 174, 9, 23, 119, 124, 174, 181, - 113, 183, 113, 247, 153, 134, 60, 53, 190, 231, 112, 183, 109, 83, 89, 255, - 152, 201, 163, 235, 62, 70, 199, 129, 159, 124, 78, 228, 6, 238, 214, 179, - 57, 120, 225, 78, 240, 247, 228, 197, 7, 164, 203, 240, 176, 66, 192, 85, - 161, 220, 70, 66, 234, 179, 156, 163, 129, 215, 251, 24, 92, 41, 66, 89, - 91, 162, 83, 22, 233, 16, 199, 13, 232, 128, 32, 47, 161, 127, 115, 230, - 7, 142, 6, 28, 47, 56, 34, 24, 156, 26, 154, 13, 13, 92, 33, 119, - 226, 226, 30, 94, 20, 61, 74, 230, 48, 108, 19, 58, 67, 47, 133, 109, - 218, 244, 129, 225, 54, 19, 184, 113, 113, 99, 63, 30, 38, 224, 16, 230, - 122, 44, 20, 17, 207, 253, 178, 69, 93, 159, 209, 82, 18, 178, 202, 153, - 30, 90, 210, 110, 38, 98, 59, 161, 221, 45, 198, 102, 241, 237, 7, 168, - 69, 194, 155, 117, 14, 240, 220, 252, 17, 252, 200, 34, 187, 0, 35, 106, - 69, 246, 143, 1, 36, 221, 47, 95, 64, 80, 135, 12, 104, 51, 48, 2, - 254, 78, 225, 134, 160, 171, 164, 151, 5, 24, 5, 30, 3, 107, 230, 190, - 208, 120, 86, 240, 211, 165, 49, 116, 161, 113, 250, 190, 227, 115, 114, 158, - 224, 44, 89, 172, 111, 158, 85, 24, 231, 44, 214, 54, 81, 45, 102, 179, - 128, 95, 25, 32, 226, 113, 217, 74, 146, 179, 174, 197, 121, 105, 28, 252, - 130, 251, 37, 43, 208, 16, 162, 50, 139, 35, 202, 84, 153, 196, 219, 97, - 190, 91, 56, 54, 16, 152, 67, 196, 175, 161, 246, 202, 144, 18, 235, 231, - 231, 130, 224, 242, 208, 40, 238, 86, 33, 6, 143, 204, 111, 109, 209, 65, - 69, 193, 142, 133, 220, 223, 132, 220, 23, 152, 67, 77, 24, 86, 31, 168, - 255, 59, 230, 13, 250, 45, 47, 98, 183, 37, 2, 117, 209, 217, 148, 23, - 105, 176, 98, 203, 165, 64, 203, 52, 192, 61, 134, 179, 207, 125, 161, 193, - 162, 125, 172, 229, 38, 246, 214, 51, 53, 114, 207, 89, 238, 119, 41, 159, - 131, 63, 8, 185, 225, 110, 193, 61, 115, 43, 71, 140, 39, 225, 57, 143, - 213, 228, 72, 20, 40, 137, 129, 100, 196, 181, 174, 64, 153, 240, 245, 173, - 192, 241, 159, 182, 133, 176, 148, 146, 106, 32, 150, 102, 251, 181, 168, 119, - 165, 89, 145, 45, 250, 11, 165, 149, 179, 72, 147, 26, 41, 101, 167, 15, - 171, 158, 216, 129, 193, 251, 9, 240, 251, 9, 240, 251, 9, 240, 251, 150, - 194, 31, 110, 75, 97, 197, 25, 226, 143, 69, 54, 11, 66, 168, 201, 49, - 217, 71, 69, 176, 244, 5, 149, 196, 72, 251, 220, 228, 92, 110, 198, 53, - 169, 80, 47, 130, 212, 158, 49, 241, 24, 1, 165, 132, 72, 217, 114, 74, - 206, 41, 230, 148, 89, 206, 105, 90, 206, 148, 234, 224, 206, 195, 114, 53, - 99, 128, 40, 89, 22, 238, 97, 41, 239, 155, 91, 3, 11, 37, 174, 218, - 29, 56, 192, 105, 230, 203, 40, 184, 20, 130, 139, 159, 219, 178, 47, 45, - 136, 145, 247, 77, 227, 247, 77, 227, 63, 240, 166, 241, 187, 100, 120, 151, - 12, 193, 126, 6, 50, 57, 159, 1, 211, 203, 156, 152, 101, 76, 55, 179, - 192, 1, 87, 115, 88, 154, 109, 21, 99, 101, 12, 37, 190, 221, 218, 167, - 41, 194, 194, 125, 42, 186, 65, 195, 194, 81, 191, 184, 21, 184, 140, 238, - 124, 230, 64, 251, 116, 108, 171, 209, 95, 164, 245, 193, 234, 254, 165, 125, - 195, 37, 243, 147, 255, 204, 42, 225, 93, 26, 188, 75, 131, 119, 105, 240, - 46, 13, 126, 79, 105, 16, 99, 200, 113, 235, 30, 63, 133, 153, 24, 110, - 228, 68, 186, 139, 76, 21, 115, 229, 21, 43, 159, 36, 99, 127, 253, 240, - 46, 120, 195, 42, 49, 130, 108, 189, 209, 143, 139, 17, 135, 166, 8, 11, - 247, 175, 27, 39, 174, 218, 62, 122, 55, 76, 124, 151, 5, 239, 178, 224, - 207, 111, 152, 200, 120, 64, 156, 115, 249, 41, 63, 103, 150, 152, 100, 33, - 49, 171, 196, 160, 148, 63, 141, 81, 34, 219, 14, 4, 161, 197, 109, 55, - 117, 39, 176, 16, 164, 204, 179, 21, 60, 250, 209, 136, 30, 9, 43, 159, - 164, 109, 128, 212, 28, 115, 128, 234, 111, 50, 102, 199, 82, 248, 176, 122, - 254, 146, 130, 178, 68, 166, 139, 121, 177, 148, 240, 123, 190, 123, 147, 98, - 245, 25, 60, 51, 19, 88, 174, 198, 82, 52, 178, 160, 26, 107, 195, 105, - 18, 124, 44, 189, 46, 111, 144, 189, 107, 61, 127, 86, 173, 71, 33, 5, - 37, 221, 63, 38, 117, 224, 195, 244, 239, 63, 124, 67, 192, 101, 180, 130, - 90, 231, 214, 24, 130, 196, 58, 55, 227, 90, 156, 29, 1, 144, 227, 1, - 35, 191, 193, 78, 65, 121, 138, 2, 255, 108, 186, 47, 92, 254, 65, 20, - 100, 122, 38, 38, 125, 75, 144, 227, 153, 111, 203, 177, 93, 87, 110, 99, - 64, 179, 239, 47, 194, 243, 247, 23, 40, 116, 138, 27, 173, 153, 19, 132, - 141, 246, 195, 75, 160, 101, 198, 137, 105, 121, 52, 201, 25, 36, 32, 229, - 67, 35, 129, 145, 253, 131, 142, 251, 52, 235, 128, 129, 57, 165, 224, 253, - 185, 19, 196, 176, 79, 156, 170, 75, 156, 209, 66, 184, 238, 156, 150, 167, - 33, 87, 16, 169, 59, 39, 22, 242, 52, 192, 202, 11, 13, 60, 66, 207, - 130, 145, 212, 119, 228, 78, 205, 94, 204, 231, 180, 32, 187, 146, 135, 18, - 162, 236, 226, 219, 217, 243, 241, 252, 249, 197, 2, 164, 100, 1, 13, 248, - 132, 232, 139, 160, 93, 216, 25, 115, 242, 80, 57, 22, 221, 224, 85, 118, - 182, 82, 27, 77, 31, 11, 41, 122, 105, 197, 116, 160, 157, 41, 75, 109, - 227, 165, 16, 94, 253, 220, 158, 177, 156, 226, 124, 106, 217, 244, 245, 250, - 111, 87, 28, 223, 143, 26, 223, 143, 26, 223, 143, 26, 223, 133, 233, 127, - 193, 64, 174, 152, 142, 123, 210, 102, 124, 49, 60, 210, 99, 247, 40, 69, - 165, 151, 44, 59, 204, 203, 44, 114, 202, 149, 220, 56, 202, 204, 114, 7, - 44, 248, 71, 236, 69, 139, 184, 42, 237, 214, 136, 139, 11, 27, 106, 49, - 131, 246, 56, 238, 250, 11, 180, 130, 233, 162, 149, 20, 136, 149, 204, 22, - 181, 126, 162, 173, 187, 201, 133, 38, 85, 153, 13, 206, 196, 34, 2, 73, - 178, 136, 124, 180, 223, 55, 135, 220, 95, 27, 131, 225, 103, 238, 130, 89, - 54, 99, 148, 64, 95, 185, 54, 224, 33, 26, 34, 183, 92, 33, 113, 151, - 142, 124, 116, 137, 110, 49, 190, 190, 25, 68, 153, 23, 37, 53, 161, 147, - 190, 69, 66, 171, 19, 135, 35, 9, 65, 110, 27, 1, 200, 109, 35, 4, - 185, 109, 76, 245, 56, 200, 173, 95, 255, 248, 46, 118, 62, 138, 157, 178, - 20, 78, 229, 93, 24, 189, 11, 163, 63, 129, 48, 122, 23, 42, 127, 86, - 161, 130, 91, 59, 164, 160, 165, 8, 149, 136, 147, 166, 199, 145, 206, 41, - 92, 32, 111, 98, 164, 33, 168, 129, 226, 219, 173, 166, 61, 78, 6, 31, - 254, 177, 248, 50, 52, 115, 89, 203, 201, 31, 164, 245, 192, 243, 254, 139, - 248, 130, 86, 46, 2, 181, 23, 14, 16, 117, 27, 20, 85, 55, 160, 254, - 34, 6, 212, 18, 163, 158, 1, 181, 20, 1, 246, 162, 73, 77, 96, 66, - 83, 252, 101, 75, 140, 138, 142, 101, 203, 4, 217, 78, 183, 48, 254, 146, - 255, 70, 88, 32, 230, 126, 33, 185, 211, 151, 76, 99, 200, 101, 3, 223, - 26, 92, 136, 137, 235, 24, 184, 41, 11, 233, 67, 248, 158, 31, 35, 19, - 189, 45, 115, 39, 66, 238, 212, 119, 168, 89, 22, 71, 43, 229, 110, 188, - 149, 150, 151, 62, 95, 107, 123, 7, 220, 182, 51, 210, 17, 94, 223, 151, - 124, 189, 161, 222, 249, 209, 8, 210, 132, 229, 164, 52, 17, 248, 86, 40, - 15, 215, 28, 140, 209, 54, 153, 249, 35, 208, 215, 162, 25, 179, 3, 172, - 4, 53, 77, 40, 219, 244, 95, 55, 166, 246, 183, 149, 221, 43, 238, 105, - 220, 176, 70, 230, 156, 129, 1, 193, 127, 234, 84, 229, 232, 151, 164, 249, - 19, 156, 143, 65, 37, 5, 45, 130, 237, 252, 251, 51, 66, 124, 51, 12, - 242, 59, 63, 249, 83, 240, 147, 242, 202, 29, 159, 228, 208, 68, 123, 184, - 134, 171, 151, 138, 146, 57, 232, 112, 217, 147, 203, 157, 65, 243, 64, 235, - 182, 119, 119, 220, 70, 253, 162, 208, 60, 184, 49, 238, 111, 149, 199, 198, - 237, 254, 120, 183, 215, 233, 156, 237, 110, 75, 167, 187, 219, 211, 195, 221, - 147, 217, 73, 239, 112, 182, 107, 153, 45, 229, 198, 213, 158, 20, 113, 127, - 111, 183, 84, 120, 60, 26, 221, 158, 220, 13, 27, 187, 166, 115, 119, 180, - 107, 31, 150, 75, 101, 243, 162, 116, 109, 95, 54, 172, 206, 168, 125, 66, - 246, 182, 79, 164, 253, 78, 163, 41, 237, 119, 27, 183, 237, 206, 225, 117, - 253, 236, 233, 230, 76, 117, 235, 123, 213, 157, 155, 202, 190, 217, 40, 61, - 118, 118, 119, 26, 187, 231, 151, 179, 49, 175, 76, 212, 150, 108, 121, 202, - 80, 81, 118, 58, 188, 60, 190, 28, 28, 184, 162, 102, 213, 164, 123, 233, - 126, 84, 86, 164, 154, 172, 145, 230, 87, 114, 160, 214, 170, 251, 10, 255, - 84, 17, 103, 69, 175, 92, 230, 103, 167, 183, 51, 125, 220, 215, 59, 181, - 219, 153, 214, 108, 222, 242, 218, 240, 107, 121, 174, 213, 171, 37, 151, 24, - 242, 209, 180, 125, 188, 163, 95, 56, 82, 183, 87, 105, 22, 44, 227, 130, - 47, 158, 221, 207, 166, 147, 254, 68, 189, 110, 86, 47, 139, 134, 104, 233, - 221, 209, 206, 85, 167, 84, 50, 228, 199, 237, 217, 217, 181, 84, 18, 207, - 140, 202, 149, 185, 77, 244, 238, 222, 141, 38, 118, 26, 234, 149, 84, 80, - 249, 86, 165, 223, 81, 190, 158, 30, 213, 204, 71, 203, 187, 80, 103, 143, - 198, 209, 228, 120, 124, 209, 183, 203, 179, 194, 163, 86, 170, 233, 157, 75, - 245, 100, 234, 238, 168, 133, 139, 109, 235, 226, 108, 231, 226, 110, 87, 187, - 40, 108, 223, 143, 166, 251, 69, 197, 22, 39, 124, 171, 62, 215, 140, 170, - 55, 31, 93, 89, 181, 242, 172, 108, 121, 229, 185, 130, 149, 115, 44, 241, - 212, 187, 234, 142, 228, 50, 41, 43, 53, 177, 124, 62, 34, 253, 51, 183, - 86, 59, 127, 154, 212, 157, 166, 62, 234, 150, 42, 164, 84, 245, 228, 125, - 201, 232, 75, 132, 231, 111, 235, 79, 39, 53, 99, 166, 119, 230, 131, 201, - 253, 188, 40, 107, 186, 86, 86, 20, 163, 58, 105, 158, 120, 87, 211, 94, - 245, 105, 178, 127, 190, 211, 31, 149, 78, 78, 238, 122, 39, 55, 68, 221, - 39, 39, 157, 230, 227, 228, 43, 223, 60, 56, 232, 119, 142, 27, 210, 215, - 81, 121, 123, 191, 60, 185, 232, 157, 116, 8, 223, 173, 200, 222, 129, 108, - 13, 14, 166, 78, 225, 78, 33, 151, 188, 62, 174, 29, 232, 164, 126, 243, - 149, 220, 31, 237, 240, 94, 127, 231, 113, 251, 190, 169, 119, 203, 229, 214, - 168, 94, 114, 116, 98, 136, 123, 165, 219, 93, 85, 222, 62, 25, 218, 231, - 26, 127, 223, 230, 121, 251, 166, 196, 171, 183, 87, 195, 187, 227, 121, 107, - 123, 54, 128, 34, 11, 188, 81, 235, 235, 58, 209, 165, 249, 83, 171, 214, - 154, 77, 238, 183, 15, 110, 101, 251, 172, 244, 149, 111, 212, 38, 69, 185, - 220, 211, 199, 95, 181, 169, 199, 159, 42, 83, 239, 100, 183, 66, 218, 162, - 183, 189, 83, 59, 150, 207, 91, 237, 155, 94, 111, 216, 108, 221, 20, 157, - 38, 47, 213, 14, 142, 212, 158, 219, 158, 78, 229, 243, 158, 115, 191, 235, - 125, 213, 189, 179, 190, 180, 45, 147, 86, 185, 119, 245, 228, 170, 109, 175, - 249, 117, 116, 244, 216, 57, 42, 67, 119, 93, 243, 142, 123, 178, 119, 96, - 87, 206, 134, 95, 117, 218, 223, 119, 231, 243, 131, 98, 143, 127, 28, 222, - 238, 141, 231, 135, 3, 197, 61, 111, 222, 78, 134, 79, 143, 45, 245, 84, - 119, 119, 13, 183, 82, 247, 246, 234, 206, 190, 37, 219, 7, 7, 46, 191, - 115, 114, 182, 227, 157, 153, 199, 53, 115, 94, 235, 212, 120, 99, 222, 185, - 149, 15, 220, 177, 90, 158, 52, 139, 131, 233, 85, 79, 145, 13, 115, 218, - 51, 244, 202, 212, 230, 159, 154, 146, 59, 222, 37, 18, 127, 47, 242, 227, - 166, 54, 174, 139, 87, 186, 49, 59, 27, 91, 237, 203, 3, 82, 237, 79, - 247, 141, 158, 113, 49, 30, 86, 91, 125, 207, 150, 139, 109, 203, 150, 11, - 35, 111, 120, 122, 127, 170, 95, 88, 118, 179, 116, 35, 30, 150, 21, 171, - 96, 193, 80, 58, 183, 156, 178, 113, 223, 47, 214, 103, 205, 203, 177, 114, - 172, 79, 61, 87, 82, 155, 69, 197, 187, 244, 134, 101, 67, 23, 213, 227, - 226, 109, 193, 25, 95, 202, 86, 217, 216, 229, 181, 242, 215, 27, 181, 160, - 218, 183, 23, 199, 51, 71, 25, 14, 119, 189, 3, 207, 58, 154, 237, 235, - 55, 198, 190, 113, 216, 47, 138, 106, 67, 191, 58, 190, 116, 138, 35, 229, - 192, 237, 213, 85, 242, 216, 224, 141, 114, 233, 174, 87, 178, 141, 106, 207, - 56, 59, 45, 65, 227, 31, 144, 187, 178, 117, 208, 34, 206, 201, 232, 190, - 255, 213, 184, 217, 177, 231, 202, 68, 175, 59, 219, 151, 218, 57, 16, 57, - 219, 71, 135, 252, 169, 58, 234, 137, 157, 155, 61, 99, 92, 153, 25, 71, - 45, 254, 148, 119, 119, 237, 138, 212, 124, 234, 20, 173, 146, 93, 51, 27, - 226, 182, 62, 190, 154, 56, 226, 101, 227, 154, 63, 58, 61, 175, 238, 145, - 155, 11, 251, 74, 153, 65, 113, 109, 173, 191, 107, 220, 232, 246, 92, 156, - 24, 55, 237, 251, 90, 243, 242, 171, 183, 237, 149, 246, 118, 221, 237, 94, - 75, 241, 158, 136, 125, 118, 95, 231, 197, 154, 213, 154, 202, 214, 216, 29, - 138, 243, 199, 175, 114, 255, 88, 228, 135, 114, 185, 83, 111, 53, 218, 229, - 131, 122, 179, 168, 21, 128, 163, 76, 36, 81, 58, 185, 51, 9, 41, 214, - 91, 167, 173, 193, 105, 205, 59, 109, 55, 119, 7, 86, 17, 155, 85, 244, - 180, 39, 227, 108, 164, 86, 171, 101, 241, 134, 148, 157, 249, 229, 184, 223, - 241, 238, 166, 165, 243, 105, 127, 36, 123, 70, 71, 46, 181, 118, 166, 214, - 125, 5, 198, 30, 239, 149, 246, 233, 216, 179, 196, 161, 87, 222, 55, 230, - 79, 68, 26, 106, 176, 82, 41, 77, 11, 214, 228, 164, 126, 223, 27, 182, - 206, 26, 229, 185, 60, 114, 174, 91, 219, 183, 37, 163, 116, 213, 217, 63, - 246, 10, 229, 157, 74, 207, 107, 94, 156, 78, 42, 123, 48, 15, 12, 165, - 221, 113, 170, 197, 249, 84, 233, 239, 233, 205, 93, 235, 107, 167, 217, 144, - 182, 71, 206, 89, 127, 118, 196, 15, 235, 106, 137, 214, 8, 122, 241, 92, - 42, 244, 59, 134, 94, 157, 63, 242, 23, 71, 133, 99, 185, 48, 30, 169, - 179, 166, 211, 240, 20, 209, 40, 95, 159, 185, 23, 213, 195, 121, 169, 85, - 125, 188, 47, 157, 158, 29, 95, 153, 39, 218, 174, 238, 206, 30, 187, 202, - 158, 222, 53, 206, 39, 133, 193, 137, 89, 59, 119, 134, 183, 215, 86, 13, - 198, 203, 117, 225, 233, 236, 201, 232, 221, 66, 141, 213, 82, 149, 88, 219, - 202, 93, 101, 222, 220, 189, 53, 246, 107, 71, 23, 170, 50, 184, 152, 43, - 115, 111, 54, 173, 138, 231, 124, 173, 202, 183, 47, 74, 119, 101, 190, 129, - 13, 236, 92, 183, 21, 105, 214, 245, 14, 248, 27, 224, 83, 147, 194, 172, - 63, 238, 121, 149, 250, 209, 109, 233, 76, 181, 46, 251, 222, 46, 127, 51, - 178, 155, 147, 113, 255, 180, 117, 165, 220, 74, 125, 175, 122, 163, 212, 103, - 150, 103, 134, 223, 114, 50, 228, 167, 37, 222, 238, 152, 215, 198, 117, 193, - 184, 217, 62, 239, 111, 143, 111, 141, 206, 190, 234, 108, 143, 33, 169, 214, - 212, 142, 218, 142, 213, 39, 67, 89, 218, 43, 147, 155, 177, 59, 169, 55, - 190, 106, 178, 231, 29, 29, 57, 187, 222, 77, 249, 188, 219, 30, 16, 96, - 240, 134, 84, 45, 151, 155, 109, 73, 227, 7, 37, 109, 116, 50, 188, 186, - 80, 188, 59, 99, 58, 62, 36, 252, 153, 250, 164, 238, 105, 157, 242, 77, - 173, 112, 44, 237, 212, 164, 29, 79, 210, 15, 45, 190, 123, 83, 83, 21, - 155, 168, 219, 218, 249, 244, 254, 86, 235, 202, 229, 113, 235, 188, 205, 139, - 198, 163, 174, 151, 61, 221, 158, 104, 87, 199, 59, 119, 219, 51, 233, 73, - 185, 112, 10, 87, 146, 214, 30, 236, 147, 107, 69, 105, 75, 187, 100, 60, - 47, 54, 96, 192, 31, 28, 17, 178, 23, 227, 51, 227, 114, 221, 235, 24, - 85, 125, 82, 46, 238, 205, 139, 59, 55, 197, 29, 187, 180, 115, 203, 239, - 136, 93, 210, 80, 36, 77, 119, 186, 117, 73, 187, 29, 245, 234, 131, 157, - 154, 161, 241, 157, 178, 44, 89, 173, 187, 107, 177, 110, 156, 106, 189, 227, - 243, 202, 81, 99, 239, 196, 152, 14, 182, 93, 226, 156, 30, 75, 19, 101, - 238, 92, 52, 121, 179, 93, 223, 173, 21, 247, 96, 40, 145, 187, 61, 210, - 56, 168, 221, 30, 121, 103, 228, 220, 59, 174, 21, 42, 245, 51, 254, 220, - 40, 84, 238, 53, 30, 186, 104, 214, 106, 150, 212, 39, 190, 106, 117, 85, - 165, 250, 120, 44, 13, 228, 29, 50, 245, 70, 252, 158, 92, 86, 29, 103, - 86, 225, 39, 7, 90, 79, 156, 92, 212, 159, 234, 214, 221, 141, 54, 247, - 198, 219, 158, 219, 7, 17, 113, 233, 93, 54, 180, 35, 189, 111, 92, 74, - 133, 158, 103, 26, 231, 200, 87, 122, 222, 185, 231, 205, 202, 115, 181, 204, - 219, 135, 164, 120, 117, 188, 63, 58, 110, 182, 187, 77, 126, 167, 93, 172, - 202, 167, 109, 229, 148, 108, 215, 238, 142, 37, 173, 219, 148, 93, 185, 92, - 227, 173, 187, 109, 94, 237, 95, 119, 235, 5, 249, 241, 104, 86, 51, 230, - 173, 39, 94, 27, 240, 231, 238, 196, 43, 27, 173, 170, 220, 126, 188, 210, - 10, 213, 94, 223, 154, 246, 228, 19, 94, 145, 107, 39, 90, 177, 62, 168, - 27, 208, 164, 103, 253, 35, 125, 159, 127, 218, 57, 175, 22, 166, 199, 252, - 212, 46, 220, 158, 203, 210, 169, 126, 163, 216, 87, 83, 217, 184, 169, 180, - 78, 249, 115, 190, 58, 126, 170, 92, 88, 98, 71, 220, 54, 230, 133, 30, - 191, 51, 190, 209, 43, 70, 241, 184, 212, 56, 186, 227, 79, 198, 118, 197, - 158, 151, 238, 250, 117, 181, 179, 119, 121, 38, 31, 223, 86, 155, 7, 53, - 105, 234, 12, 249, 67, 107, 110, 28, 92, 78, 20, 245, 113, 218, 59, 214, - 247, 134, 167, 218, 129, 218, 244, 230, 228, 86, 187, 168, 77, 85, 73, 238, - 149, 219, 222, 65, 185, 168, 137, 228, 250, 74, 53, 118, 10, 229, 251, 230, - 180, 224, 220, 187, 119, 87, 228, 198, 187, 215, 110, 73, 211, 152, 243, 183, - 167, 237, 218, 244, 100, 44, 247, 154, 167, 222, 65, 73, 37, 162, 7, 196, - 245, 147, 158, 55, 152, 238, 56, 133, 175, 106, 255, 241, 138, 140, 188, 106, - 249, 78, 44, 144, 189, 43, 98, 156, 142, 74, 124, 148, 15, 121, 221, 37, - 169, 205, 229, 241, 253, 57, 176, 77, 239, 6, 94, 200, 202, 208, 172, 86, - 171, 166, 25, 210, 72, 181, 187, 187, 103, 242, 188, 91, 83, 187, 218, 182, - 106, 147, 66, 109, 151, 116, 202, 35, 190, 120, 165, 85, 13, 187, 222, 175, - 74, 186, 90, 225, 247, 72, 167, 218, 55, 10, 189, 59, 185, 180, 175, 89, - 229, 93, 114, 78, 248, 93, 215, 85, 175, 136, 109, 156, 215, 74, 21, 181, - 50, 177, 202, 103, 229, 43, 111, 143, 220, 35, 201, 185, 102, 89, 187, 100, - 90, 41, 237, 40, 87, 228, 240, 118, 159, 116, 201, 189, 54, 241, 138, 56, - 124, 142, 106, 143, 164, 88, 45, 28, 147, 78, 237, 144, 124, 61, 155, 123, - 133, 99, 165, 38, 157, 242, 93, 163, 80, 189, 87, 38, 22, 57, 231, 59, - 48, 255, 74, 213, 110, 173, 208, 150, 188, 214, 87, 30, 73, 102, 189, 114, - 237, 108, 159, 236, 194, 216, 155, 121, 208, 183, 199, 90, 133, 159, 43, 93, - 163, 104, 240, 59, 183, 183, 198, 87, 50, 169, 217, 117, 109, 155, 191, 80, - 47, 161, 125, 110, 108, 209, 80, 182, 103, 67, 222, 33, 135, 213, 137, 103, - 221, 144, 209, 149, 178, 231, 237, 207, 247, 155, 90, 157, 63, 63, 121, 50, - 158, 200, 108, 71, 61, 86, 246, 200, 99, 165, 104, 60, 210, 60, 94, 44, - 207, 205, 113, 105, 123, 214, 85, 15, 197, 130, 183, 55, 23, 235, 106, 125, - 124, 93, 123, 170, 153, 26, 166, 41, 5, 204, 116, 101, 93, 170, 87, 181, - 155, 230, 84, 87, 206, 121, 155, 63, 150, 143, 170, 226, 142, 178, 109, 14, - 201, 225, 254, 196, 218, 187, 210, 48, 211, 13, 180, 13, 100, 130, 180, 175, - 19, 242, 120, 165, 158, 91, 166, 122, 81, 19, 13, 200, 116, 13, 178, 2, - 50, 89, 218, 182, 114, 62, 182, 49, 19, 235, 218, 186, 119, 99, 148, 182, - 205, 17, 86, 99, 31, 51, 241, 231, 213, 14, 223, 191, 231, 141, 217, 177, - 90, 131, 121, 222, 175, 137, 21, 105, 76, 14, 107, 95, 79, 139, 70, 247, - 76, 61, 190, 169, 42, 252, 161, 167, 242, 163, 51, 237, 134, 88, 178, 73, - 174, 171, 118, 181, 96, 170, 181, 73, 207, 216, 47, 245, 84, 24, 24, 188, - 97, 116, 248, 243, 218, 99, 109, 111, 12, 201, 222, 156, 159, 214, 198, 21, - 181, 42, 237, 204, 92, 173, 166, 156, 242, 213, 242, 228, 244, 154, 229, 61, - 184, 147, 21, 173, 104, 76, 119, 249, 99, 177, 162, 240, 119, 150, 202, 107, - 192, 77, 73, 177, 114, 223, 84, 29, 82, 168, 96, 249, 69, 239, 177, 210, - 7, 137, 56, 43, 171, 53, 121, 251, 210, 33, 53, 175, 202, 31, 158, 204, - 189, 171, 242, 132, 236, 158, 170, 245, 167, 218, 28, 62, 84, 209, 248, 138, - 178, 205, 159, 171, 151, 152, 76, 106, 229, 61, 190, 88, 155, 24, 119, 213, - 163, 57, 180, 161, 92, 52, 160, 123, 159, 8, 205, 3, 253, 106, 194, 100, - 45, 26, 160, 123, 76, 118, 204, 131, 94, 211, 204, 254, 102, 141, 254, 236, - 106, 79, 70, 141, 190, 119, 227, 78, 123, 179, 230, 254, 222, 77, 225, 235, - 78, 209, 172, 204, 170, 237, 187, 110, 119, 251, 235, 225, 220, 218, 217, 54, - 47, 47, 75, 247, 205, 157, 199, 166, 124, 119, 89, 236, 244, 171, 103, 192, - 108, 246, 78, 103, 231, 227, 202, 213, 153, 11, 52, 23, 7, 59, 123, 179, - 90, 185, 109, 242, 165, 214, 145, 173, 204, 238, 239, 138, 95, 53, 165, 50, - 152, 30, 237, 118, 15, 47, 246, 238, 78, 250, 150, 114, 86, 177, 69, 114, - 246, 84, 111, 107, 71, 192, 76, 239, 231, 117, 185, 124, 213, 226, 157, 167, - 167, 126, 93, 107, 60, 241, 118, 233, 172, 167, 123, 14, 127, 197, 59, 94, - 191, 75, 110, 170, 218, 180, 52, 238, 150, 197, 146, 168, 106, 237, 178, 214, - 34, 99, 75, 107, 141, 117, 113, 56, 177, 249, 51, 66, 134, 99, 82, 239, - 78, 52, 2, 243, 69, 225, 79, 188, 146, 228, 89, 250, 136, 120, 243, 170, - 165, 156, 55, 229, 242, 20, 102, 34, 100, 244, 92, 66, 142, 29, 190, 104, - 170, 228, 128, 180, 21, 85, 145, 171, 37, 135, 39, 237, 114, 91, 213, 220, - 3, 103, 199, 48, 246, 52, 82, 185, 175, 145, 178, 92, 236, 245, 122, 167, - 101, 157, 63, 30, 106, 170, 6, 90, 92, 241, 171, 101, 205, 74, 167, 213, - 94, 209, 214, 170, 154, 78, 78, 207, 140, 158, 60, 239, 212, 52, 245, 74, - 110, 213, 228, 113, 113, 202, 223, 240, 178, 97, 28, 141, 13, 195, 112, 202, - 157, 50, 217, 118, 207, 182, 137, 60, 173, 92, 243, 60, 191, 79, 154, 195, - 139, 186, 231, 77, 39, 147, 43, 121, 98, 85, 59, 183, 214, 97, 219, 49, - 182, 65, 35, 54, 172, 125, 224, 182, 147, 98, 127, 170, 150, 201, 76, 28, - 150, 46, 140, 17, 41, 170, 206, 149, 86, 211, 249, 51, 133, 135, 23, 79, - 72, 173, 215, 59, 211, 136, 58, 127, 26, 223, 150, 219, 213, 146, 210, 109, - 234, 186, 218, 32, 3, 165, 3, 195, 188, 86, 179, 186, 55, 248, 125, 226, - 88, 190, 184, 26, 41, 138, 115, 6, 226, 236, 80, 180, 120, 173, 53, 159, - 23, 198, 164, 233, 137, 188, 83, 231, 45, 175, 46, 59, 141, 201, 190, 94, - 51, 120, 215, 210, 120, 111, 122, 95, 172, 121, 39, 219, 167, 87, 85, 82, - 214, 188, 51, 177, 94, 128, 2, 120, 79, 106, 84, 90, 6, 41, 244, 38, - 181, 246, 164, 169, 239, 147, 146, 234, 226, 179, 17, 72, 114, 171, 118, 168, - 16, 221, 184, 30, 195, 90, 193, 220, 209, 52, 187, 62, 47, 149, 181, 91, - 199, 214, 134, 167, 163, 74, 211, 51, 202, 219, 134, 218, 28, 148, 229, 234, - 184, 85, 49, 202, 55, 149, 235, 170, 186, 99, 156, 90, 234, 113, 235, 236, - 212, 27, 119, 165, 163, 41, 40, 209, 229, 193, 213, 124, 52, 217, 150, 45, - 199, 107, 218, 183, 29, 181, 184, 163, 120, 77, 82, 188, 45, 110, 55, 249, - 166, 173, 155, 234, 121, 69, 213, 44, 104, 220, 121, 205, 218, 38, 228, 116, - 222, 86, 43, 167, 100, 71, 62, 155, 77, 26, 192, 47, 73, 73, 111, 122, - 157, 11, 79, 46, 213, 239, 239, 78, 119, 74, 64, 2, 175, 156, 222, 22, - 59, 77, 210, 188, 107, 239, 23, 183, 107, 197, 178, 36, 15, 70, 211, 178, - 116, 167, 239, 244, 106, 219, 100, 34, 159, 58, 147, 83, 69, 25, 21, 15, - 106, 205, 237, 150, 92, 146, 138, 23, 5, 254, 196, 216, 155, 148, 15, 247, - 203, 181, 118, 111, 50, 242, 74, 234, 221, 248, 107, 87, 130, 204, 90, 125, - 218, 129, 117, 234, 100, 222, 49, 120, 117, 34, 122, 37, 121, 223, 43, 74, - 213, 187, 109, 210, 53, 36, 99, 251, 136, 184, 240, 176, 188, 93, 45, 123, - 242, 99, 183, 111, 148, 140, 155, 187, 171, 138, 122, 162, 79, 119, 201, 94, - 189, 104, 18, 213, 152, 30, 145, 189, 99, 181, 111, 116, 154, 234, 141, 97, - 238, 243, 71, 222, 244, 20, 24, 13, 38, 87, 213, 46, 121, 108, 194, 51, - 72, 222, 246, 166, 115, 114, 246, 213, 152, 1, 99, 245, 32, 247, 215, 122, - 241, 6, 201, 104, 57, 93, 242, 213, 0, 245, 244, 176, 94, 220, 229, 79, - 13, 173, 50, 63, 240, 230, 21, 254, 96, 124, 74, 138, 131, 186, 186, 11, - 163, 254, 196, 40, 90, 117, 183, 65, 78, 106, 197, 38, 40, 249, 215, 199, - 64, 119, 80, 3, 201, 117, 69, 106, 247, 100, 94, 83, 167, 22, 217, 155, - 145, 158, 33, 33, 61, 203, 231, 20, 167, 228, 206, 152, 121, 230, 208, 152, - 122, 115, 16, 220, 80, 71, 190, 161, 78, 136, 88, 31, 88, 210, 177, 218, - 51, 166, 245, 65, 13, 180, 47, 133, 136, 167, 80, 131, 59, 163, 228, 204, - 171, 228, 134, 223, 241, 20, 103, 94, 33, 55, 250, 29, 41, 73, 228, 209, - 83, 143, 213, 83, 85, 149, 225, 91, 248, 91, 165, 71, 64, 191, 49, 180, - 43, 99, 38, 67, 250, 13, 220, 155, 222, 158, 172, 142, 128, 115, 237, 67, - 134, 66, 147, 191, 47, 23, 219, 109, 179, 66, 118, 141, 126, 117, 86, 213, - 78, 201, 181, 204, 55, 248, 115, 114, 104, 168, 34, 228, 83, 28, 165, 74, - 186, 181, 121, 29, 94, 250, 88, 155, 85, 145, 206, 179, 30, 9, 63, 224, - 245, 43, 162, 56, 165, 1, 153, 88, 202, 49, 48, 211, 93, 227, 169, 73, - 142, 140, 199, 154, 118, 171, 14, 121, 219, 83, 251, 228, 136, 244, 61, 208, - 140, 139, 117, 98, 149, 249, 237, 33, 145, 103, 167, 228, 130, 204, 142, 219, - 252, 99, 137, 215, 27, 166, 85, 36, 142, 71, 154, 243, 58, 95, 174, 117, - 189, 147, 145, 60, 61, 32, 123, 53, 114, 40, 214, 9, 204, 3, 121, 168, - 121, 154, 55, 154, 87, 93, 243, 192, 107, 212, 165, 30, 153, 53, 245, 130, - 81, 170, 105, 83, 101, 80, 220, 215, 20, 195, 59, 58, 43, 88, 234, 14, - 79, 248, 137, 116, 102, 214, 96, 2, 128, 28, 189, 24, 22, 143, 39, 83, - 82, 85, 206, 200, 33, 41, 239, 215, 128, 117, 20, 171, 146, 57, 157, 18, - 221, 213, 199, 238, 197, 188, 60, 86, 207, 117, 117, 48, 86, 239, 72, 249, - 68, 63, 247, 38, 21, 135, 135, 197, 194, 145, 102, 136, 82, 169, 38, 141, - 197, 11, 222, 40, 138, 243, 102, 91, 37, 210, 157, 214, 245, 90, 53, 253, - 112, 175, 169, 31, 104, 94, 185, 64, 118, 52, 178, 125, 47, 131, 38, 68, - 148, 91, 82, 158, 90, 124, 217, 50, 143, 166, 32, 132, 60, 24, 255, 42, - 140, 255, 157, 22, 95, 211, 231, 100, 199, 168, 206, 166, 211, 38, 244, 31, - 116, 27, 235, 147, 226, 174, 49, 110, 26, 219, 163, 249, 118, 79, 238, 93, - 234, 39, 21, 227, 196, 80, 111, 149, 17, 52, 83, 197, 115, 183, 61, 152, - 11, 50, 136, 158, 147, 221, 154, 113, 212, 155, 238, 213, 14, 136, 234, 25, - 176, 54, 85, 110, 245, 194, 149, 186, 75, 230, 143, 150, 118, 220, 51, 122, - 213, 233, 201, 217, 100, 135, 156, 93, 146, 75, 175, 124, 5, 243, 8, 167, - 6, 136, 17, 229, 162, 29, 204, 35, 208, 39, 161, 237, 235, 108, 110, 244, - 106, 167, 206, 236, 134, 28, 89, 152, 239, 66, 109, 146, 153, 70, 246, 110, - 136, 217, 228, 31, 171, 60, 140, 241, 42, 15, 243, 225, 88, 133, 129, 78, - 7, 245, 19, 217, 147, 97, 174, 192, 124, 232, 145, 71, 7, 198, 29, 60, - 187, 50, 76, 7, 255, 192, 28, 129, 63, 48, 39, 38, 163, 162, 69, 250, - 101, 121, 124, 224, 205, 84, 73, 159, 76, 202, 23, 53, 24, 180, 251, 116, - 172, 195, 56, 158, 212, 167, 150, 118, 225, 29, 206, 201, 196, 51, 189, 94, - 141, 255, 218, 39, 251, 56, 7, 110, 96, 14, 76, 79, 188, 226, 113, 177, - 172, 206, 136, 217, 134, 21, 52, 217, 229, 119, 213, 11, 50, 29, 65, 127, - 193, 248, 27, 52, 249, 93, 98, 213, 113, 92, 55, 165, 58, 191, 199, 55, - 136, 104, 116, 155, 82, 77, 59, 169, 217, 23, 70, 239, 88, 173, 246, 96, - 188, 159, 210, 241, 174, 117, 201, 188, 174, 28, 236, 152, 167, 94, 65, 39, - 19, 184, 129, 57, 242, 72, 235, 198, 159, 56, 240, 37, 252, 35, 204, 215, - 89, 93, 219, 199, 113, 125, 11, 83, 220, 44, 137, 178, 84, 83, 143, 120, - 13, 122, 102, 88, 33, 79, 30, 12, 219, 125, 227, 171, 49, 49, 196, 125, - 15, 36, 129, 167, 148, 165, 175, 61, 245, 70, 171, 27, 202, 177, 182, 75, - 250, 174, 73, 156, 182, 122, 103, 140, 128, 87, 212, 238, 69, 75, 171, 121, - 38, 48, 13, 67, 185, 184, 43, 24, 106, 213, 56, 32, 202, 181, 215, 112, - 180, 29, 222, 150, 73, 173, 212, 209, 202, 218, 53, 40, 141, 218, 208, 219, - 190, 36, 189, 123, 237, 238, 170, 124, 172, 237, 171, 83, 185, 103, 104, 247, - 21, 179, 6, 140, 100, 86, 131, 117, 76, 249, 180, 47, 79, 201, 125, 79, - 218, 215, 102, 186, 83, 227, 231, 55, 199, 211, 42, 105, 16, 254, 84, 63, - 168, 242, 123, 103, 119, 181, 114, 147, 223, 167, 60, 0, 199, 144, 116, 80, - 55, 129, 13, 16, 87, 159, 159, 84, 249, 241, 252, 43, 204, 225, 138, 229, - 62, 142, 174, 13, 109, 252, 84, 135, 114, 119, 44, 50, 157, 22, 170, 188, - 83, 51, 118, 100, 90, 247, 209, 41, 140, 135, 198, 33, 95, 241, 76, 34, - 215, 174, 60, 229, 132, 156, 94, 148, 96, 136, 28, 151, 38, 98, 89, 219, - 131, 106, 170, 13, 21, 84, 201, 161, 135, 253, 142, 12, 206, 235, 192, 59, - 119, 235, 102, 185, 216, 35, 243, 130, 76, 230, 222, 211, 176, 81, 17, 53, - 203, 24, 246, 46, 44, 114, 247, 36, 170, 38, 25, 25, 252, 45, 114, 176, - 17, 240, 0, 98, 24, 19, 239, 73, 118, 107, 197, 145, 83, 229, 171, 213, - 203, 99, 30, 215, 61, 106, 83, 125, 170, 187, 48, 216, 60, 179, 238, 212, - 74, 147, 27, 120, 29, 8, 119, 181, 222, 238, 144, 171, 138, 210, 37, 37, - 153, 223, 247, 238, 200, 227, 132, 191, 216, 159, 97, 158, 158, 193, 87, 71, - 208, 159, 87, 202, 126, 245, 177, 251, 52, 39, 174, 120, 9, 227, 66, 27, - 149, 38, 6, 172, 229, 43, 100, 164, 21, 145, 223, 76, 235, 192, 167, 142, - 167, 167, 236, 153, 105, 136, 243, 59, 67, 85, 121, 79, 135, 149, 222, 78, - 221, 131, 185, 82, 229, 45, 107, 96, 40, 77, 16, 128, 77, 99, 118, 90, - 183, 14, 136, 104, 149, 60, 224, 61, 103, 149, 39, 168, 139, 222, 147, 197, - 65, 177, 86, 58, 228, 143, 201, 101, 133, 212, 52, 40, 249, 235, 120, 88, - 111, 41, 165, 29, 109, 102, 92, 146, 82, 77, 57, 191, 185, 32, 214, 87, - 167, 212, 129, 206, 183, 206, 218, 54, 225, 141, 169, 81, 186, 52, 238, 97, - 109, 226, 237, 212, 174, 143, 39, 158, 56, 131, 89, 250, 8, 234, 250, 252, - 156, 55, 249, 113, 237, 90, 220, 33, 215, 205, 153, 39, 74, 82, 179, 216, - 84, 12, 24, 207, 5, 181, 32, 107, 87, 222, 188, 108, 123, 218, 181, 30, - 209, 158, 93, 107, 173, 118, 69, 236, 170, 131, 170, 125, 167, 29, 122, 192, - 212, 106, 167, 39, 68, 149, 149, 233, 117, 149, 92, 25, 147, 18, 209, 122, - 55, 65, 61, 168, 108, 178, 238, 159, 160, 50, 143, 221, 187, 30, 45, 87, - 146, 85, 7, 219, 119, 226, 117, 188, 100, 29, 248, 150, 44, 214, 207, 202, - 138, 115, 91, 155, 150, 225, 155, 135, 202, 200, 211, 6, 164, 63, 30, 89, - 182, 164, 238, 157, 89, 164, 96, 76, 58, 79, 61, 80, 199, 138, 245, 185, - 84, 178, 172, 39, 82, 238, 169, 117, 254, 209, 146, 140, 82, 83, 17, 235, - 82, 173, 212, 36, 199, 237, 61, 222, 82, 11, 181, 98, 239, 169, 50, 31, - 123, 240, 6, 222, 174, 41, 135, 106, 141, 60, 158, 33, 159, 232, 171, 167, - 134, 77, 136, 108, 244, 181, 142, 167, 90, 242, 116, 159, 28, 202, 160, 109, - 85, 100, 190, 77, 90, 245, 61, 111, 226, 5, 60, 246, 196, 171, 122, 48, - 30, 202, 94, 129, 76, 12, 237, 84, 157, 18, 19, 166, 194, 238, 87, 163, - 136, 249, 165, 253, 157, 26, 48, 72, 205, 151, 73, 234, 213, 99, 173, 24, - 150, 219, 4, 41, 212, 133, 73, 10, 172, 82, 246, 211, 145, 94, 171, 145, - 251, 178, 58, 36, 7, 147, 131, 90, 121, 206, 159, 242, 109, 121, 102, 20, - 61, 144, 85, 71, 176, 152, 40, 150, 246, 238, 136, 87, 43, 202, 154, 104, - 92, 214, 42, 68, 60, 211, 238, 73, 177, 119, 59, 41, 53, 121, 213, 232, - 25, 86, 91, 181, 120, 16, 177, 228, 105, 224, 130, 132, 11, 211, 229, 27, - 237, 80, 61, 230, 39, 164, 47, 222, 145, 105, 243, 214, 147, 142, 159, 234, - 177, 186, 148, 160, 142, 188, 163, 207, 200, 64, 26, 16, 175, 238, 151, 191, - 75, 120, 107, 212, 7, 177, 174, 20, 106, 231, 164, 234, 241, 176, 30, 117, - 247, 72, 105, 12, 90, 137, 92, 83, 246, 106, 87, 68, 238, 193, 202, 191, - 232, 125, 173, 117, 137, 216, 243, 92, 163, 88, 215, 202, 146, 83, 138, 202, - 214, 44, 16, 51, 252, 168, 92, 37, 251, 109, 144, 99, 222, 220, 43, 155, - 234, 35, 40, 180, 178, 49, 44, 159, 147, 146, 161, 95, 25, 114, 175, 83, - 85, 65, 237, 6, 97, 169, 84, 104, 90, 83, 31, 87, 117, 152, 29, 123, - 222, 19, 57, 155, 107, 181, 82, 141, 191, 50, 74, 125, 228, 130, 135, 133, - 166, 170, 146, 54, 105, 87, 11, 61, 88, 1, 203, 226, 188, 51, 186, 170, - 77, 103, 115, 227, 17, 238, 161, 138, 181, 35, 24, 103, 4, 136, 71, 3, - 219, 16, 27, 240, 241, 78, 201, 43, 187, 228, 241, 180, 2, 211, 180, 94, - 187, 189, 210, 206, 137, 52, 123, 50, 38, 205, 146, 55, 119, 201, 21, 223, - 35, 125, 99, 40, 219, 164, 168, 241, 109, 195, 150, 149, 50, 15, 223, 84, - 251, 10, 159, 7, 42, 95, 217, 174, 42, 231, 250, 236, 170, 96, 200, 109, - 104, 142, 10, 57, 226, 91, 208, 162, 103, 181, 89, 19, 198, 222, 184, 58, - 132, 119, 242, 231, 123, 199, 164, 169, 128, 108, 62, 61, 175, 77, 119, 136, - 68, 180, 170, 95, 143, 50, 40, 11, 163, 41, 136, 172, 83, 114, 226, 93, - 17, 77, 214, 58, 119, 87, 188, 60, 239, 145, 129, 119, 93, 81, 68, 237, - 84, 17, 249, 29, 50, 134, 207, 156, 214, 74, 132, 191, 48, 230, 61, 222, - 170, 14, 202, 3, 43, 172, 7, 176, 131, 102, 187, 53, 168, 61, 237, 240, - 151, 124, 11, 6, 249, 92, 45, 94, 241, 53, 190, 213, 182, 170, 170, 161, - 30, 0, 63, 148, 13, 121, 103, 122, 92, 34, 202, 20, 100, 192, 211, 14, - 72, 105, 137, 192, 184, 189, 117, 202, 77, 201, 208, 230, 160, 66, 127, 133, - 15, 149, 13, 183, 103, 87, 52, 168, 239, 224, 152, 204, 249, 122, 109, 38, - 3, 47, 84, 100, 88, 145, 55, 129, 141, 218, 148, 55, 149, 47, 161, 127, - 60, 88, 239, 56, 179, 19, 141, 144, 22, 95, 23, 65, 193, 228, 71, 213, - 50, 240, 214, 87, 242, 218, 115, 173, 200, 79, 198, 248, 30, 120, 72, 122, - 228, 10, 251, 152, 220, 193, 67, 167, 91, 156, 243, 197, 179, 2, 140, 147, - 38, 244, 64, 73, 237, 213, 12, 72, 238, 107, 119, 30, 169, 57, 23, 252, - 140, 119, 107, 58, 121, 252, 10, 239, 33, 125, 248, 50, 207, 51, 10, 164, - 45, 151, 12, 144, 141, 243, 82, 17, 249, 223, 174, 236, 41, 21, 44, 75, - 41, 104, 119, 229, 51, 50, 34, 101, 111, 194, 187, 6, 177, 196, 142, 122, - 79, 90, 213, 102, 189, 216, 43, 214, 148, 39, 224, 99, 158, 87, 51, 10, - 124, 193, 131, 142, 189, 59, 176, 137, 221, 27, 236, 23, 45, 131, 148, 173, - 185, 42, 205, 137, 215, 48, 12, 224, 29, 100, 84, 81, 207, 197, 11, 96, - 35, 187, 199, 83, 126, 78, 199, 227, 200, 35, 152, 177, 7, 149, 191, 171, - 218, 30, 100, 236, 171, 143, 134, 71, 172, 185, 203, 207, 137, 161, 235, 70, - 23, 50, 106, 160, 39, 236, 67, 198, 218, 217, 241, 20, 22, 130, 240, 29, - 192, 135, 136, 94, 224, 65, 134, 93, 145, 70, 21, 248, 74, 79, 234, 242, - 143, 70, 15, 150, 20, 46, 153, 147, 166, 161, 147, 161, 54, 172, 65, 198, - 201, 41, 100, 172, 158, 30, 131, 94, 14, 25, 45, 69, 179, 120, 200, 72, - 88, 70, 21, 121, 151, 201, 95, 215, 77, 77, 134, 17, 81, 153, 55, 13, - 30, 50, 42, 32, 124, 248, 66, 237, 162, 118, 3, 25, 97, 105, 223, 185, - 106, 75, 157, 243, 173, 108, 198, 10, 80, 162, 184, 118, 107, 36, 160, 17, - 85, 198, 124, 56, 255, 198, 33, 0, 162, 136, 135, 170, 2, 34, 33, 22, - 133, 98, 65, 80, 68, 161, 36, 126, 22, 37, 1, 255, 43, 10, 162, 38, - 72, 37, 65, 81, 133, 18, 60, 82, 62, 99, 138, 28, 35, 46, 11, 37, - 77, 80, 74, 52, 189, 44, 72, 146, 32, 105, 88, 130, 90, 22, 212, 130, - 80, 146, 62, 139, 42, 38, 202, 101, 160, 17, 74, 42, 188, 72, 131, 127, - 178, 80, 46, 127, 134, 2, 100, 5, 138, 20, 74, 69, 65, 197, 42, 64, - 9, 80, 180, 38, 125, 46, 106, 152, 86, 86, 177, 20, 36, 22, 37, 52, - 172, 194, 147, 74, 241, 115, 89, 2, 10, 65, 83, 4, 13, 10, 195, 26, - 22, 10, 148, 70, 211, 214, 51, 198, 38, 231, 71, 68, 190, 228, 182, 184, - 156, 248, 55, 165, 240, 119, 165, 80, 40, 144, 156, 248, 73, 42, 20, 242, - 232, 30, 247, 153, 67, 40, 50, 81, 96, 177, 104, 215, 46, 55, 76, 94, - 41, 172, 19, 90, 12, 180, 207, 250, 122, 54, 14, 105, 37, 191, 248, 208, - 85, 50, 5, 4, 67, 203, 109, 110, 34, 132, 24, 157, 156, 195, 61, 79, - 248, 181, 252, 228, 131, 88, 90, 127, 17, 158, 187, 112, 221, 101, 215, 33, - 132, 166, 204, 57, 157, 166, 52, 107, 53, 91, 14, 231, 114, 45, 206, 9, - 58, 66, 137, 194, 220, 10, 18, 195, 154, 98, 33, 72, 131, 10, 200, 25, - 106, 66, 97, 80, 91, 242, 108, 83, 239, 152, 214, 90, 44, 212, 179, 244, - 153, 115, 168, 31, 155, 167, 99, 108, 134, 82, 113, 109, 125, 253, 51, 218, - 45, 172, 253, 178, 54, 253, 160, 174, 163, 181, 194, 47, 107, 51, 184, 18, - 50, 174, 211, 194, 179, 112, 199, 30, 174, 77, 133, 153, 0, 45, 11, 164, - 8, 233, 183, 134, 128, 210, 5, 129, 235, 255, 77, 21, 56, 158, 71, 159, - 61, 76, 125, 100, 169, 143, 44, 245, 81, 224, 108, 195, 128, 164, 71, 142, - 231, 212, 141, 62, 125, 241, 3, 36, 125, 195, 163, 226, 241, 96, 13, 138, - 223, 160, 133, 255, 37, 155, 107, 99, 124, 123, 60, 87, 134, 231, 248, 34, - 1, 218, 20, 43, 214, 134, 213, 253, 218, 95, 242, 208, 242, 186, 43, 96, - 37, 144, 134, 85, 100, 253, 51, 135, 65, 143, 105, 11, 100, 120, 7, 199, - 165, 15, 34, 22, 226, 204, 97, 64, 98, 66, 195, 165, 49, 178, 120, 216, - 180, 205, 63, 79, 227, 152, 175, 183, 78, 54, 247, 37, 187, 186, 125, 6, - 155, 172, 141, 152, 37, 37, 90, 196, 244, 31, 190, 211, 129, 9, 227, 48, - 247, 156, 135, 129, 77, 195, 96, 210, 32, 207, 212, 246, 158, 142, 58, 9, - 141, 242, 253, 225, 133, 240, 174, 66, 14, 1, 94, 101, 161, 192, 6, 91, - 100, 95, 227, 12, 30, 2, 230, 32, 156, 127, 91, 62, 138, 127, 211, 50, - 101, 225, 228, 62, 197, 58, 229, 216, 30, 216, 204, 38, 165, 15, 87, 66, - 112, 145, 230, 25, 122, 99, 118, 44, 125, 52, 210, 57, 106, 102, 185, 58, - 44, 212, 187, 9, 200, 239, 106, 2, 226, 82, 131, 142, 175, 204, 232, 131, - 250, 71, 236, 216, 227, 62, 130, 67, 56, 20, 216, 29, 99, 40, 255, 102, - 35, 17, 9, 35, 211, 22, 74, 41, 70, 34, 125, 58, 144, 128, 83, 14, - 108, 79, 15, 61, 107, 82, 28, 112, 96, 240, 103, 248, 0, 104, 8, 97, - 11, 11, 249, 156, 248, 242, 65, 8, 175, 2, 80, 195, 13, 234, 135, 99, - 32, 135, 255, 40, 41, 202, 6, 70, 138, 93, 91, 51, 243, 104, 209, 75, - 240, 207, 71, 120, 40, 250, 15, 211, 158, 73, 105, 25, 17, 100, 247, 35, - 117, 143, 9, 92, 27, 197, 140, 21, 194, 238, 47, 90, 49, 47, 76, 135, - 149, 19, 141, 126, 125, 202, 244, 98, 209, 76, 31, 182, 219, 109, 19, 65, - 91, 125, 151, 108, 106, 87, 45, 132, 87, 63, 25, 233, 96, 9, 211, 151, - 21, 190, 48, 167, 226, 128, 200, 150, 9, 236, 17, 199, 246, 101, 163, 63, - 162, 29, 95, 211, 135, 67, 26, 161, 173, 6, 121, 93, 219, 122, 55, 83, - 126, 55, 83, 254, 51, 152, 41, 167, 251, 204, 136, 194, 187, 215, 204, 31, - 92, 26, 253, 71, 128, 55, 40, 215, 140, 121, 205, 176, 123, 10, 128, 23, - 56, 205, 252, 136, 145, 45, 10, 161, 101, 231, 79, 46, 86, 2, 151, 226, - 40, 185, 200, 169, 87, 202, 1, 191, 156, 149, 130, 224, 18, 136, 27, 1, - 158, 190, 75, 111, 132, 232, 50, 221, 241, 229, 166, 225, 152, 97, 212, 26, - 63, 204, 235, 18, 90, 235, 79, 16, 189, 51, 248, 119, 6, 255, 39, 99, - 240, 239, 236, 253, 255, 71, 246, 206, 152, 161, 207, 223, 253, 155, 4, 115, - 95, 98, 152, 43, 249, 113, 144, 123, 153, 33, 159, 245, 219, 249, 19, 27, - 8, 185, 203, 145, 99, 14, 117, 223, 51, 195, 101, 55, 63, 152, 135, 122, - 120, 151, 182, 30, 94, 14, 74, 189, 140, 181, 247, 206, 115, 223, 121, 238, - 59, 207, 125, 231, 185, 127, 124, 158, 27, 112, 186, 128, 237, 134, 247, 9, - 140, 211, 37, 134, 184, 154, 243, 70, 5, 164, 50, 95, 168, 185, 109, 247, - 57, 181, 105, 6, 78, 113, 244, 82, 8, 175, 210, 148, 97, 26, 21, 49, - 218, 122, 84, 22, 189, 207, 42, 230, 168, 171, 59, 232, 220, 22, 208, 168, - 126, 107, 23, 226, 100, 199, 186, 167, 247, 131, 24, 144, 52, 224, 148, 164, - 188, 163, 22, 253, 15, 140, 111, 145, 20, 164, 116, 160, 5, 127, 156, 189, - 177, 63, 153, 153, 108, 61, 79, 94, 184, 238, 214, 115, 247, 37, 227, 199, - 103, 21, 63, 4, 71, 71, 82, 134, 143, 98, 63, 249, 187, 135, 155, 28, - 172, 24, 237, 145, 59, 198, 136, 53, 37, 174, 217, 135, 69, 99, 112, 158, - 4, 36, 80, 58, 52, 32, 48, 237, 66, 134, 194, 189, 183, 2, 143, 75, - 29, 81, 223, 131, 83, 1, 118, 198, 180, 25, 30, 5, 176, 67, 150, 228, - 54, 100, 98, 78, 172, 156, 117, 236, 51, 83, 102, 92, 13, 227, 81, 113, - 151, 182, 51, 98, 147, 141, 198, 167, 114, 225, 86, 72, 220, 197, 244, 28, - 62, 205, 241, 244, 57, 22, 192, 11, 11, 195, 169, 54, 12, 2, 136, 186, - 201, 184, 93, 81, 204, 181, 51, 167, 173, 199, 66, 170, 138, 48, 4, 245, - 22, 40, 102, 232, 134, 10, 195, 237, 208, 10, 111, 98, 27, 160, 83, 211, - 141, 205, 180, 20, 132, 6, 122, 193, 93, 97, 96, 210, 187, 228, 83, 150, - 232, 103, 137, 113, 15, 191, 194, 187, 142, 57, 194, 32, 230, 113, 161, 119, - 65, 7, 62, 85, 57, 112, 74, 130, 96, 164, 21, 243, 5, 52, 10, 253, - 160, 231, 169, 118, 228, 139, 105, 148, 219, 148, 50, 146, 245, 89, 26, 37, - 214, 28, 140, 113, 74, 158, 64, 13, 216, 213, 69, 195, 106, 195, 44, 253, - 149, 241, 210, 226, 205, 125, 210, 112, 31, 127, 174, 185, 145, 146, 219, 89, - 0, 92, 142, 133, 195, 195, 25, 30, 52, 1, 94, 3, 95, 176, 199, 142, - 155, 86, 203, 99, 123, 2, 61, 71, 11, 188, 234, 58, 186, 219, 181, 49, - 164, 207, 135, 56, 230, 219, 130, 198, 91, 133, 182, 121, 61, 139, 88, 88, - 202, 68, 169, 47, 7, 182, 61, 234, 82, 200, 208, 197, 55, 196, 99, 248, - 178, 248, 125, 52, 199, 114, 252, 190, 128, 73, 173, 120, 252, 171, 27, 253, - 20, 238, 63, 197, 226, 191, 127, 226, 226, 30, 215, 230, 96, 216, 215, 7, - 160, 144, 97, 172, 92, 157, 67, 86, 73, 253, 168, 13, 234, 129, 221, 232, - 119, 128, 235, 142, 186, 3, 174, 173, 187, 45, 199, 108, 2, 63, 133, 166, - 193, 29, 169, 160, 176, 148, 206, 27, 59, 120, 198, 217, 55, 173, 199, 181, - 108, 119, 52, 26, 126, 34, 196, 109, 140, 102, 13, 103, 212, 221, 28, 232, - 4, 189, 184, 91, 125, 221, 37, 116, 202, 230, 93, 54, 164, 201, 239, 128, - 46, 89, 162, 254, 194, 105, 248, 3, 33, 55, 241, 195, 185, 69, 247, 8, - 34, 160, 190, 8, 133, 133, 228, 79, 241, 19, 254, 181, 92, 113, 107, 171, - 176, 254, 18, 225, 21, 60, 231, 100, 72, 121, 225, 120, 118, 122, 196, 69, - 65, 185, 10, 65, 92, 44, 32, 16, 211, 8, 196, 24, 129, 148, 70, 32, - 197, 8, 100, 32, 88, 12, 252, 197, 241, 49, 130, 34, 16, 132, 18, 32, - 150, 174, 68, 37, 163, 105, 65, 215, 5, 94, 159, 254, 138, 210, 171, 148, - 241, 207, 41, 191, 74, 25, 255, 46, 53, 173, 218, 80, 201, 24, 137, 150, - 74, 210, 152, 50, 164, 135, 68, 0, 57, 206, 105, 224, 185, 52, 157, 160, - 153, 16, 118, 129, 182, 255, 176, 225, 98, 37, 57, 60, 46, 219, 12, 74, - 47, 210, 150, 143, 223, 98, 59, 119, 16, 4, 20, 38, 198, 15, 164, 69, - 116, 61, 250, 34, 126, 161, 236, 38, 136, 188, 242, 7, 206, 116, 88, 36, - 182, 231, 92, 137, 47, 108, 22, 196, 151, 15, 20, 165, 66, 229, 24, 230, - 16, 171, 68, 78, 227, 30, 55, 185, 13, 142, 158, 207, 97, 97, 225, 240, - 161, 40, 130, 255, 151, 19, 255, 254, 227, 35, 255, 241, 211, 143, 143, 249, - 143, 255, 247, 34, 64, 130, 4, 149, 254, 251, 199, 233, 199, 79, 120, 37, - 254, 63, 246, 190, 188, 79, 109, 35, 105, 248, 127, 62, 69, 155, 149, 99, - 24, 196, 33, 1, 115, 216, 198, 249, 249, 136, 19, 191, 235, 235, 241, 100, - 179, 246, 142, 199, 60, 2, 52, 131, 98, 64, 44, 130, 1, 50, 203, 119, - 127, 171, 170, 187, 165, 110, 169, 197, 224, 216, 137, 157, 125, 216, 236, 24, - 169, 250, 84, 31, 85, 213, 213, 117, 124, 127, 103, 205, 159, 92, 128, 193, - 227, 157, 245, 10, 243, 157, 57, 231, 54, 94, 20, 98, 212, 53, 221, 185, - 133, 137, 44, 102, 23, 244, 129, 216, 119, 111, 188, 96, 34, 28, 29, 157, - 78, 48, 72, 0, 146, 213, 25, 0, 109, 249, 96, 188, 229, 211, 188, 235, - 31, 182, 13, 177, 186, 79, 167, 62, 224, 13, 77, 194, 208, 86, 57, 94, - 78, 160, 52, 140, 217, 206, 224, 215, 140, 159, 127, 212, 223, 104, 230, 5, - 214, 36, 229, 14, 53, 38, 58, 231, 149, 180, 144, 235, 123, 110, 249, 175, - 207, 45, 183, 241, 52, 104, 188, 204, 199, 245, 154, 190, 56, 185, 127, 206, - 38, 227, 14, 176, 149, 200, 121, 82, 52, 191, 238, 4, 24, 17, 37, 254, - 36, 27, 213, 10, 252, 2, 164, 217, 104, 72, 151, 96, 172, 199, 96, 193, - 20, 250, 226, 166, 191, 185, 225, 121, 11, 149, 7, 29, 214, 130, 50, 196, - 49, 167, 88, 101, 205, 201, 57, 134, 85, 2, 46, 188, 0, 232, 138, 77, - 68, 157, 222, 116, 58, 90, 119, 47, 105, 213, 90, 237, 194, 100, 204, 176, - 43, 37, 107, 50, 46, 219, 227, 112, 224, 151, 128, 222, 2, 39, 87, 182, - 5, 159, 95, 2, 212, 114, 128, 110, 216, 203, 194, 47, 232, 149, 190, 209, - 213, 253, 105, 230, 173, 211, 119, 72, 114, 144, 172, 3, 54, 187, 146, 31, - 65, 141, 218, 214, 97, 114, 115, 148, 225, 195, 57, 135, 133, 222, 209, 7, - 105, 201, 35, 130, 228, 177, 217, 206, 64, 118, 147, 64, 54, 51, 14, 89, - 94, 37, 222, 84, 53, 134, 80, 91, 227, 241, 202, 86, 16, 139, 55, 251, - 168, 187, 111, 175, 29, 235, 72, 35, 230, 130, 19, 204, 80, 107, 234, 89, - 246, 226, 207, 189, 248, 115, 47, 254, 220, 19, 188, 111, 132, 224, 109, 17, - 127, 170, 168, 86, 138, 64, 53, 152, 57, 188, 158, 17, 69, 231, 203, 68, - 245, 26, 179, 82, 154, 211, 190, 55, 65, 186, 39, 73, 130, 124, 181, 181, - 183, 29, 195, 236, 101, 66, 202, 63, 2, 218, 179, 12, 6, 243, 97, 34, - 65, 69, 189, 83, 45, 156, 60, 210, 225, 100, 5, 55, 80, 20, 18, 246, - 97, 206, 127, 158, 5, 30, 50, 171, 40, 235, 8, 38, 242, 167, 98, 146, - 25, 100, 67, 70, 53, 15, 85, 130, 116, 113, 17, 249, 115, 150, 27, 21, - 100, 79, 51, 246, 52, 99, 79, 51, 246, 52, 227, 27, 161, 25, 173, 186, - 115, 98, 190, 82, 136, 18, 100, 205, 233, 69, 252, 142, 98, 174, 246, 70, - 9, 152, 146, 65, 221, 249, 36, 34, 169, 196, 64, 30, 252, 209, 5, 251, - 17, 138, 244, 135, 40, 9, 230, 52, 2, 96, 221, 75, 9, 179, 179, 32, - 211, 193, 225, 197, 98, 52, 15, 160, 109, 146, 202, 199, 193, 59, 218, 170, - 156, 245, 81, 224, 169, 161, 155, 170, 24, 39, 68, 163, 38, 47, 253, 75, - 238, 15, 57, 45, 100, 125, 5, 131, 139, 83, 162, 226, 234, 1, 174, 1, - 104, 21, 254, 125, 56, 193, 231, 87, 40, 133, 126, 27, 114, 85, 228, 37, - 34, 98, 159, 150, 5, 227, 111, 47, 194, 129, 2, 195, 55, 149, 70, 97, - 228, 145, 215, 184, 86, 50, 107, 70, 249, 198, 108, 220, 193, 166, 93, 252, - 151, 63, 11, 139, 73, 216, 65, 104, 28, 165, 224, 131, 160, 79, 98, 123, - 116, 56, 186, 215, 136, 222, 83, 162, 191, 2, 37, 218, 83, 148, 191, 42, - 69, 57, 174, 55, 142, 129, 168, 152, 40, 138, 134, 184, 21, 5, 231, 84, - 2, 210, 151, 35, 164, 47, 199, 5, 67, 234, 221, 194, 133, 180, 191, 43, - 68, 34, 98, 84, 137, 204, 35, 209, 235, 49, 12, 70, 245, 140, 206, 47, - 231, 229, 219, 247, 10, 220, 58, 51, 10, 46, 145, 157, 177, 154, 223, 87, - 157, 187, 142, 132, 42, 214, 123, 214, 17, 26, 189, 21, 174, 60, 188, 156, - 194, 220, 7, 165, 146, 251, 193, 130, 250, 126, 45, 81, 27, 101, 86, 97, - 150, 11, 89, 248, 245, 205, 247, 37, 204, 90, 97, 65, 249, 110, 129, 174, - 8, 56, 224, 32, 6, 184, 28, 240, 93, 12, 104, 114, 192, 127, 98, 64, - 235, 251, 21, 76, 2, 192, 108, 9, 105, 83, 150, 15, 242, 245, 240, 251, - 82, 240, 1, 0, 226, 245, 136, 82, 111, 99, 106, 41, 184, 141, 240, 66, - 249, 182, 219, 62, 188, 87, 40, 102, 199, 246, 102, 58, 156, 26, 113, 3, - 49, 158, 207, 124, 239, 99, 172, 53, 8, 207, 118, 252, 164, 209, 90, 188, - 138, 52, 6, 255, 210, 233, 233, 233, 28, 214, 95, 250, 226, 179, 185, 53, - 20, 175, 118, 174, 122, 61, 11, 167, 222, 101, 74, 208, 215, 76, 118, 110, - 178, 219, 113, 59, 7, 131, 96, 230, 19, 27, 11, 131, 126, 70, 193, 26, - 207, 13, 112, 186, 146, 189, 1, 237, 252, 65, 222, 136, 29, 183, 238, 230, - 104, 42, 209, 184, 103, 60, 155, 243, 219, 50, 143, 110, 172, 110, 89, 173, - 13, 123, 99, 255, 104, 63, 178, 31, 118, 26, 140, 46, 140, 228, 43, 247, - 100, 206, 46, 2, 86, 129, 89, 134, 143, 21, 49, 161, 26, 182, 245, 198, - 182, 126, 180, 173, 71, 182, 245, 144, 223, 123, 29, 209, 165, 96, 132, 23, - 112, 240, 87, 171, 225, 93, 212, 5, 252, 20, 229, 190, 153, 211, 112, 112, - 3, 102, 171, 125, 251, 0, 72, 74, 9, 118, 26, 26, 144, 242, 28, 158, - 152, 52, 235, 240, 96, 26, 212, 157, 227, 134, 76, 24, 172, 112, 28, 161, - 252, 65, 63, 140, 74, 148, 45, 46, 52, 88, 203, 180, 8, 234, 147, 105, - 100, 43, 27, 160, 197, 110, 217, 126, 102, 23, 130, 21, 218, 184, 242, 127, - 238, 177, 96, 141, 15, 252, 159, 123, 108, 132, 191, 13, 128, 66, 17, 235, - 232, 65, 199, 177, 217, 114, 24, 64, 71, 74, 84, 222, 134, 178, 29, 110, - 111, 189, 186, 40, 219, 80, 86, 188, 173, 47, 202, 101, 50, 172, 189, 184, - 7, 53, 87, 59, 3, 168, 121, 141, 191, 107, 50, 214, 93, 245, 176, 177, - 158, 108, 17, 31, 248, 63, 208, 98, 79, 109, 241, 150, 161, 197, 158, 108, - 177, 135, 45, 202, 183, 117, 79, 180, 216, 131, 22, 123, 21, 222, 34, 254, - 82, 139, 56, 1, 141, 239, 159, 149, 160, 52, 150, 193, 157, 126, 132, 200, - 4, 33, 23, 216, 111, 1, 1, 108, 50, 186, 184, 63, 234, 169, 9, 73, - 41, 196, 8, 163, 222, 1, 252, 63, 73, 6, 220, 52, 186, 56, 128, 255, - 43, 217, 234, 144, 235, 131, 11, 31, 255, 1, 17, 89, 185, 168, 174, 1, - 92, 2, 81, 188, 6, 232, 254, 51, 21, 234, 228, 151, 32, 10, 122, 240, - 193, 255, 132, 85, 12, 7, 192, 153, 64, 13, 75, 249, 218, 189, 226, 25, - 108, 35, 84, 101, 160, 127, 246, 87, 136, 179, 231, 240, 115, 93, 124, 255, - 222, 109, 59, 236, 199, 59, 47, 158, 61, 86, 53, 106, 82, 119, 114, 141, - 90, 203, 166, 91, 189, 218, 137, 130, 81, 184, 157, 174, 116, 212, 222, 212, - 99, 161, 232, 232, 196, 109, 167, 241, 137, 162, 142, 161, 199, 7, 111, 155, - 175, 0, 20, 229, 30, 248, 46, 210, 50, 121, 52, 195, 116, 255, 6, 158, - 250, 79, 22, 245, 101, 134, 30, 123, 245, 49, 152, 178, 34, 32, 134, 14, - 219, 20, 11, 217, 28, 197, 88, 9, 146, 46, 163, 14, 49, 72, 2, 255, - 162, 127, 2, 226, 100, 189, 53, 139, 217, 65, 57, 235, 179, 105, 183, 183, - 238, 198, 33, 74, 109, 35, 212, 108, 240, 243, 212, 235, 243, 227, 147, 28, - 245, 70, 203, 174, 30, 218, 90, 248, 197, 155, 243, 228, 235, 186, 188, 173, - 166, 100, 112, 176, 46, 210, 212, 232, 221, 14, 121, 242, 91, 120, 28, 206, - 102, 62, 198, 34, 24, 200, 19, 83, 28, 222, 87, 249, 82, 28, 179, 217, - 52, 28, 101, 47, 167, 196, 249, 12, 206, 152, 176, 128, 122, 116, 74, 228, - 135, 154, 226, 13, 231, 187, 159, 41, 22, 32, 20, 158, 204, 247, 199, 188, - 253, 49, 111, 127, 204, 219, 31, 243, 190, 98, 124, 30, 215, 172, 31, 151, - 33, 3, 34, 114, 206, 45, 235, 104, 131, 30, 18, 60, 100, 49, 228, 209, - 47, 155, 57, 117, 250, 203, 169, 205, 106, 51, 56, 6, 78, 2, 250, 174, - 217, 216, 45, 17, 251, 91, 190, 199, 254, 95, 169, 52, 9, 170, 86, 179, - 124, 96, 57, 54, 61, 182, 224, 209, 197, 80, 201, 40, 174, 4, 182, 135, - 184, 101, 40, 252, 43, 58, 77, 144, 25, 149, 124, 73, 78, 30, 42, 39, - 151, 172, 229, 158, 174, 12, 31, 149, 61, 96, 117, 225, 127, 247, 123, 15, - 158, 248, 115, 47, 24, 69, 138, 18, 166, 128, 176, 31, 254, 189, 32, 57, - 251, 140, 211, 92, 95, 188, 118, 7, 60, 221, 54, 1, 77, 20, 247, 145, - 7, 223, 171, 155, 22, 32, 159, 227, 40, 164, 142, 55, 153, 202, 148, 97, - 135, 76, 235, 8, 190, 224, 113, 232, 161, 20, 51, 194, 194, 186, 206, 174, - 194, 243, 197, 170, 178, 186, 102, 237, 118, 126, 44, 63, 139, 142, 28, 92, - 91, 245, 11, 241, 40, 64, 210, 60, 227, 251, 47, 184, 184, 88, 160, 214, - 170, 210, 151, 31, 81, 177, 69, 17, 253, 182, 236, 214, 39, 111, 31, 84, - 88, 246, 7, 193, 98, 252, 127, 238, 179, 79, 241, 225, 255, 220, 87, 63, - 197, 136, 235, 255, 181, 31, 109, 226, 7, 29, 224, 83, 85, 150, 208, 83, - 216, 64, 245, 121, 166, 176, 132, 151, 26, 75, 216, 211, 88, 66, 207, 196, - 18, 122, 89, 150, 112, 150, 101, 9, 47, 77, 44, 97, 79, 103, 9, 71, - 6, 150, 16, 179, 84, 145, 180, 246, 205, 44, 33, 166, 171, 105, 74, 82, - 170, 148, 146, 66, 157, 73, 167, 17, 75, 55, 50, 177, 132, 233, 166, 5, - 75, 104, 42, 223, 203, 64, 5, 75, 152, 169, 131, 179, 132, 166, 220, 195, - 52, 148, 120, 190, 161, 194, 18, 70, 89, 150, 240, 74, 99, 9, 131, 12, - 75, 56, 202, 178, 132, 125, 141, 37, 28, 167, 89, 194, 117, 138, 37, 252, - 168, 176, 132, 35, 149, 37, 236, 255, 177, 119, 208, 240, 56, 26, 249, 35, - 20, 30, 246, 49, 78, 28, 89, 206, 197, 7, 158, 197, 28, 47, 203, 94, - 193, 206, 198, 205, 235, 33, 59, 246, 243, 50, 20, 47, 17, 241, 149, 139, - 153, 242, 250, 3, 142, 131, 242, 126, 26, 172, 230, 184, 24, 36, 4, 90, - 60, 157, 194, 208, 122, 35, 246, 10, 120, 185, 145, 55, 21, 226, 137, 166, - 75, 103, 203, 189, 13, 222, 55, 197, 247, 254, 65, 62, 196, 218, 117, 199, - 49, 220, 168, 119, 13, 220, 154, 65, 202, 203, 153, 73, 153, 222, 182, 175, - 81, 248, 138, 162, 47, 203, 65, 135, 143, 241, 155, 91, 222, 20, 186, 166, - 58, 209, 101, 152, 117, 221, 172, 30, 110, 236, 227, 156, 28, 46, 230, 56, - 170, 58, 141, 141, 221, 202, 201, 210, 196, 44, 142, 83, 117, 90, 27, 219, - 205, 201, 211, 162, 60, 237, 170, 115, 188, 177, 157, 66, 197, 16, 36, 217, - 88, 14, 62, 122, 30, 211, 74, 11, 131, 44, 43, 54, 48, 61, 120, 114, - 15, 172, 118, 221, 221, 104, 182, 47, 60, 143, 251, 160, 177, 41, 140, 59, - 215, 193, 120, 131, 177, 47, 131, 23, 27, 238, 76, 13, 91, 149, 38, 54, - 184, 98, 44, 183, 222, 46, 67, 101, 146, 76, 50, 7, 6, 178, 13, 213, - 110, 120, 191, 244, 4, 200, 126, 187, 93, 198, 212, 194, 65, 13, 195, 103, - 190, 168, 90, 99, 242, 164, 182, 97, 149, 26, 179, 198, 100, 56, 129, 135, - 134, 136, 200, 51, 117, 177, 13, 131, 215, 168, 193, 190, 174, 29, 147, 186, - 92, 27, 15, 53, 7, 168, 5, 254, 193, 194, 56, 162, 198, 239, 198, 67, - 15, 158, 24, 166, 2, 47, 117, 67, 129, 38, 222, 23, 141, 35, 133, 71, - 33, 24, 221, 247, 40, 156, 195, 57, 71, 15, 17, 206, 9, 60, 52, 76, - 13, 220, 120, 44, 201, 214, 159, 61, 149, 200, 67, 7, 123, 30, 194, 166, - 101, 63, 5, 209, 60, 188, 156, 121, 227, 40, 117, 8, 25, 97, 114, 119, - 24, 39, 219, 91, 83, 141, 198, 206, 243, 153, 63, 185, 132, 225, 84, 47, - 133, 142, 218, 25, 219, 185, 112, 160, 243, 65, 111, 60, 212, 160, 248, 137, - 95, 244, 156, 134, 128, 170, 12, 134, 32, 113, 120, 108, 5, 231, 158, 6, - 151, 170, 21, 72, 163, 145, 70, 202, 111, 252, 75, 192, 2, 51, 25, 47, - 52, 182, 177, 70, 209, 177, 171, 102, 27, 44, 250, 128, 239, 188, 81, 24, - 139, 253, 182, 27, 140, 24, 249, 171, 195, 61, 127, 181, 231, 175, 190, 2, - 127, 181, 103, 61, 190, 62, 235, 241, 187, 53, 43, 156, 122, 211, 164, 171, - 151, 139, 120, 49, 154, 109, 163, 83, 228, 30, 64, 139, 172, 231, 116, 138, - 156, 230, 172, 225, 197, 237, 20, 35, 192, 159, 180, 252, 138, 25, 78, 164, - 34, 69, 116, 249, 149, 35, 125, 58, 68, 81, 221, 17, 80, 113, 110, 36, - 100, 93, 247, 44, 23, 24, 21, 203, 185, 189, 73, 133, 210, 222, 214, 201, - 10, 154, 62, 181, 29, 71, 248, 13, 38, 31, 203, 5, 161, 228, 145, 209, - 214, 136, 53, 56, 94, 146, 82, 135, 162, 229, 65, 248, 189, 100, 29, 126, - 239, 220, 37, 101, 16, 96, 149, 42, 86, 171, 124, 175, 176, 196, 155, 150, - 121, 226, 159, 185, 237, 184, 37, 233, 116, 57, 118, 175, 28, 65, 231, 74, - 34, 103, 153, 187, 90, 150, 5, 207, 62, 158, 115, 205, 144, 177, 247, 160, - 211, 248, 222, 95, 77, 75, 213, 232, 223, 179, 210, 199, 58, 193, 202, 229, - 187, 14, 171, 178, 44, 184, 64, 222, 148, 129, 225, 152, 232, 109, 55, 100, - 227, 125, 222, 120, 255, 126, 132, 13, 246, 237, 194, 47, 76, 186, 134, 134, - 10, 95, 218, 107, 250, 183, 97, 247, 109, 247, 224, 101, 197, 17, 255, 194, - 127, 230, 222, 255, 34, 251, 205, 85, 89, 126, 129, 126, 223, 43, 12, 2, - 242, 23, 237, 245, 34, 210, 65, 169, 2, 88, 100, 174, 187, 231, 162, 119, - 136, 164, 206, 43, 29, 249, 185, 88, 228, 252, 158, 232, 125, 180, 24, 211, - 237, 183, 169, 65, 44, 43, 219, 132, 124, 149, 14, 85, 134, 173, 138, 7, - 70, 78, 169, 227, 81, 168, 119, 72, 155, 192, 175, 182, 109, 0, 3, 240, - 53, 100, 120, 6, 109, 96, 101, 175, 203, 164, 74, 131, 32, 42, 253, 250, - 172, 113, 126, 126, 143, 53, 202, 119, 147, 116, 151, 167, 159, 41, 57, 108, - 249, 236, 156, 159, 179, 116, 254, 230, 246, 252, 241, 179, 107, 40, 219, 218, - 189, 108, 252, 220, 148, 245, 192, 167, 21, 11, 49, 123, 202, 69, 214, 100, - 90, 92, 75, 24, 211, 26, 171, 213, 144, 125, 188, 118, 43, 200, 156, 2, - 11, 249, 177, 182, 117, 63, 239, 206, 227, 101, 55, 107, 150, 217, 123, 138, - 170, 38, 235, 88, 224, 76, 28, 222, 5, 193, 52, 33, 179, 14, 186, 201, - 60, 3, 241, 38, 26, 94, 168, 186, 63, 154, 92, 57, 235, 70, 236, 25, - 14, 134, 244, 238, 72, 78, 107, 160, 252, 94, 100, 181, 103, 169, 254, 194, - 44, 213, 94, 244, 180, 231, 255, 242, 253, 215, 231, 51, 128, 82, 248, 244, - 218, 155, 207, 130, 254, 71, 70, 57, 111, 226, 12, 155, 117, 247, 168, 222, - 200, 168, 3, 237, 218, 65, 114, 250, 226, 95, 92, 0, 123, 194, 134, 94, - 196, 122, 184, 180, 144, 111, 99, 23, 33, 238, 10, 88, 188, 119, 149, 234, - 84, 31, 46, 84, 116, 14, 203, 121, 134, 107, 239, 2, 182, 6, 211, 122, - 14, 227, 45, 220, 188, 244, 70, 225, 101, 13, 214, 232, 0, 193, 53, 12, - 72, 74, 29, 111, 184, 117, 152, 162, 171, 96, 82, 29, 66, 91, 235, 101, - 24, 14, 170, 156, 224, 84, 5, 193, 169, 66, 218, 101, 48, 158, 214, 134, - 243, 241, 72, 72, 210, 116, 146, 100, 144, 163, 201, 247, 102, 161, 198, 42, - 85, 244, 94, 213, 102, 7, 53, 86, 117, 226, 20, 71, 37, 195, 150, 107, - 95, 59, 181, 246, 1, 240, 174, 66, 68, 164, 122, 186, 186, 10, 160, 203, - 132, 82, 132, 41, 188, 224, 161, 121, 80, 12, 205, 212, 62, 211, 177, 27, - 100, 62, 169, 252, 200, 81, 55, 73, 224, 131, 42, 204, 69, 244, 6, 42, - 156, 2, 100, 43, 191, 145, 23, 72, 215, 109, 10, 143, 129, 66, 30, 41, - 77, 231, 98, 15, 225, 194, 95, 8, 216, 57, 31, 97, 27, 96, 187, 153, - 105, 34, 250, 81, 213, 238, 52, 9, 205, 33, 144, 249, 67, 133, 206, 75, - 125, 168, 33, 44, 2, 211, 117, 25, 10, 135, 90, 106, 115, 220, 163, 130, - 41, 43, 197, 237, 80, 243, 62, 198, 51, 2, 249, 52, 160, 11, 134, 207, - 145, 220, 236, 217, 140, 61, 155, 241, 173, 176, 25, 123, 202, 253, 87, 144, - 220, 108, 243, 245, 175, 33, 85, 3, 37, 67, 2, 146, 206, 165, 88, 235, - 35, 165, 32, 2, 129, 246, 152, 133, 148, 79, 127, 35, 194, 222, 226, 221, - 63, 213, 74, 30, 193, 80, 120, 90, 17, 91, 137, 87, 47, 161, 182, 9, - 104, 50, 212, 52, 220, 242, 202, 139, 93, 224, 121, 197, 81, 182, 248, 201, - 119, 6, 58, 29, 193, 219, 12, 221, 65, 95, 198, 137, 140, 32, 201, 25, - 47, 83, 71, 237, 220, 219, 1, 53, 111, 54, 72, 148, 24, 161, 68, 61, - 248, 217, 100, 128, 76, 4, 124, 209, 104, 109, 208, 21, 222, 145, 244, 28, - 237, 41, 207, 158, 242, 236, 41, 207, 158, 242, 124, 202, 157, 129, 91, 119, - 143, 141, 17, 205, 116, 252, 12, 100, 161, 31, 142, 241, 178, 128, 31, 56, - 208, 8, 108, 236, 116, 138, 82, 162, 136, 14, 128, 57, 165, 97, 106, 142, - 142, 117, 13, 255, 90, 252, 138, 222, 58, 100, 8, 42, 162, 39, 224, 162, - 5, 143, 69, 116, 0, 92, 36, 155, 162, 180, 162, 3, 84, 217, 185, 230, - 86, 82, 40, 18, 62, 182, 241, 95, 52, 46, 59, 176, 154, 183, 203, 229, - 13, 191, 128, 128, 34, 239, 139, 188, 42, 56, 21, 21, 173, 136, 211, 6, - 241, 11, 100, 176, 117, 27, 255, 240, 14, 66, 200, 88, 43, 194, 39, 99, - 114, 188, 67, 149, 136, 154, 125, 141, 90, 5, 13, 140, 196, 134, 194, 214, - 122, 107, 195, 102, 99, 178, 118, 226, 71, 58, 194, 133, 144, 201, 213, 238, - 45, 182, 208, 177, 45, 193, 210, 82, 3, 107, 160, 163, 47, 188, 203, 160, - 175, 11, 94, 199, 8, 138, 229, 174, 105, 192, 142, 78, 113, 82, 54, 149, - 82, 38, 164, 11, 96, 155, 41, 173, 67, 174, 113, 149, 18, 210, 182, 83, - 225, 117, 126, 24, 92, 250, 201, 241, 170, 138, 202, 193, 213, 166, 234, 12, - 205, 116, 8, 251, 125, 33, 122, 220, 61, 153, 219, 147, 185, 61, 153, 219, - 147, 185, 79, 188, 26, 119, 26, 6, 50, 167, 97, 81, 197, 231, 128, 14, - 87, 92, 218, 56, 133, 108, 114, 246, 84, 86, 73, 116, 200, 120, 244, 8, - 221, 39, 112, 173, 134, 170, 99, 78, 97, 26, 46, 107, 232, 54, 24, 47, - 141, 155, 53, 167, 106, 181, 238, 86, 249, 239, 134, 220, 3, 183, 81, 129, - 205, 177, 175, 157, 10, 82, 208, 106, 13, 35, 14, 83, 168, 225, 38, 9, - 30, 77, 74, 117, 121, 148, 33, 151, 30, 165, 190, 212, 64, 140, 112, 213, - 164, 174, 1, 199, 4, 211, 174, 1, 117, 208, 142, 226, 191, 204, 217, 76, - 182, 242, 112, 12, 164, 95, 177, 191, 212, 157, 242, 202, 92, 55, 70, 196, - 144, 249, 84, 226, 195, 111, 16, 117, 26, 183, 151, 237, 237, 73, 207, 158, - 244, 236, 73, 207, 31, 225, 65, 173, 129, 46, 111, 76, 250, 222, 58, 198, - 68, 53, 39, 161, 65, 108, 17, 11, 110, 147, 133, 93, 173, 205, 170, 120, - 66, 65, 15, 237, 21, 175, 23, 213, 200, 1, 13, 80, 1, 161, 225, 252, - 1, 8, 136, 91, 197, 139, 41, 212, 78, 182, 94, 212, 17, 24, 7, 163, - 175, 12, 164, 253, 15, 174, 223, 112, 22, 225, 201, 71, 169, 59, 38, 92, - 45, 161, 189, 76, 77, 185, 231, 48, 100, 156, 156, 28, 32, 224, 186, 106, - 57, 117, 84, 119, 46, 152, 122, 29, 147, 76, 61, 129, 59, 26, 161, 171, - 42, 71, 189, 165, 50, 211, 137, 124, 242, 148, 170, 213, 224, 138, 70, 68, - 178, 62, 123, 226, 163, 235, 108, 17, 94, 116, 64, 47, 118, 242, 104, 162, - 72, 41, 207, 240, 233, 3, 73, 86, 241, 36, 35, 201, 251, 57, 24, 251, - 220, 121, 141, 38, 237, 107, 155, 173, 182, 116, 23, 244, 42, 1, 202, 40, - 23, 39, 238, 0, 126, 14, 62, 14, 195, 73, 120, 5, 187, 224, 133, 239, - 77, 216, 227, 197, 236, 10, 241, 21, 30, 116, 127, 14, 97, 255, 176, 56, - 252, 233, 167, 219, 245, 239, 41, 218, 158, 162, 125, 51, 20, 237, 27, 81, - 138, 113, 91, 123, 165, 152, 255, 22, 242, 155, 127, 181, 198, 169, 194, 118, - 21, 12, 145, 135, 31, 255, 228, 97, 235, 61, 105, 52, 91, 199, 226, 56, - 152, 33, 48, 185, 164, 76, 214, 182, 133, 132, 253, 24, 98, 96, 86, 31, - 16, 224, 72, 208, 177, 197, 132, 98, 173, 117, 47, 33, 101, 76, 9, 182, - 25, 108, 52, 162, 209, 109, 90, 136, 234, 59, 219, 8, 28, 157, 160, 148, - 91, 173, 135, 253, 190, 63, 18, 121, 148, 122, 28, 85, 178, 247, 8, 63, - 74, 37, 88, 63, 172, 166, 192, 58, 76, 112, 103, 21, 21, 195, 100, 69, - 217, 98, 49, 151, 151, 92, 243, 217, 194, 223, 19, 173, 61, 209, 218, 19, - 173, 61, 209, 250, 47, 36, 90, 210, 136, 24, 126, 90, 173, 123, 105, 75, - 226, 27, 116, 54, 79, 234, 141, 166, 129, 112, 101, 81, 255, 141, 106, 132, - 217, 34, 64, 133, 82, 116, 44, 39, 223, 221, 130, 160, 110, 90, 89, 113, - 153, 38, 163, 28, 145, 249, 171, 12, 79, 196, 221, 226, 228, 19, 168, 60, - 242, 104, 236, 100, 62, 169, 20, 115, 202, 98, 15, 23, 130, 96, 138, 208, - 164, 221, 128, 167, 227, 1, 216, 206, 129, 239, 38, 164, 68, 239, 129, 122, - 156, 136, 12, 217, 116, 73, 240, 184, 167, 99, 123, 58, 182, 167, 99, 123, - 58, 246, 95, 72, 199, 254, 128, 136, 67, 105, 100, 188, 253, 36, 38, 229, - 148, 174, 12, 61, 141, 26, 250, 146, 252, 160, 164, 18, 169, 25, 106, 59, - 22, 81, 239, 209, 201, 105, 99, 151, 24, 69, 153, 126, 109, 35, 66, 175, - 250, 115, 239, 202, 151, 239, 176, 103, 82, 167, 182, 144, 210, 237, 44, 40, - 55, 190, 187, 230, 158, 64, 11, 18, 188, 10, 96, 0, 211, 34, 203, 180, - 30, 70, 234, 222, 44, 173, 203, 97, 118, 67, 181, 221, 175, 233, 222, 33, - 232, 222, 33, 168, 36, 92, 223, 162, 67, 208, 61, 225, 218, 19, 174, 63, - 141, 112, 233, 88, 124, 59, 205, 74, 229, 85, 180, 242, 223, 139, 232, 72, - 226, 118, 44, 151, 58, 228, 210, 169, 116, 213, 91, 72, 212, 155, 160, 15, - 143, 131, 40, 156, 84, 159, 47, 250, 235, 20, 129, 154, 197, 169, 35, 72, - 180, 243, 147, 100, 243, 191, 95, 182, 152, 85, 172, 255, 99, 37, 135, 251, - 189, 246, 95, 36, 236, 208, 23, 99, 34, 149, 72, 193, 133, 100, 162, 181, - 139, 100, 194, 188, 190, 111, 220, 114, 153, 22, 243, 183, 222, 233, 48, 236, - 127, 100, 79, 131, 17, 108, 133, 40, 37, 158, 136, 48, 205, 206, 64, 118, - 19, 73, 56, 36, 147, 104, 53, 82, 10, 184, 38, 246, 142, 110, 154, 27, - 181, 35, 197, 253, 167, 208, 68, 51, 95, 76, 31, 167, 57, 70, 210, 27, - 48, 229, 117, 50, 151, 216, 70, 71, 13, 191, 67, 46, 178, 231, 45, 247, - 188, 229, 158, 183, 220, 243, 150, 223, 56, 189, 251, 163, 132, 34, 68, 8, - 118, 19, 135, 180, 21, 113, 72, 204, 93, 102, 228, 34, 250, 109, 181, 145, - 222, 220, 40, 17, 225, 157, 218, 70, 237, 48, 112, 207, 98, 230, 167, 232, - 220, 156, 67, 109, 3, 108, 171, 219, 71, 85, 243, 87, 241, 1, 144, 18, - 127, 180, 82, 206, 23, 247, 222, 21, 247, 130, 247, 191, 154, 224, 125, 143, - 182, 255, 10, 104, 251, 176, 238, 54, 204, 1, 77, 82, 88, 77, 13, 92, - 153, 74, 65, 61, 34, 119, 35, 36, 212, 166, 12, 6, 67, 146, 89, 56, - 26, 161, 89, 33, 124, 237, 0, 215, 61, 218, 147, 8, 181, 224, 26, 42, - 5, 163, 218, 175, 133, 222, 5, 141, 166, 32, 57, 24, 247, 70, 108, 31, - 247, 120, 11, 190, 255, 7, 63, 16, 81, 136, 71, 93, 170, 160, 137, 17, - 76, 72, 62, 22, 151, 167, 86, 189, 147, 19, 199, 32, 107, 178, 152, 162, - 3, 78, 205, 77, 75, 194, 227, 210, 153, 188, 141, 148, 211, 153, 148, 204, - 220, 221, 77, 102, 174, 154, 153, 120, 179, 143, 116, 52, 122, 238, 95, 249, - 163, 60, 210, 149, 132, 139, 219, 154, 237, 198, 67, 20, 133, 158, 14, 174, - 124, 246, 3, 119, 201, 244, 187, 221, 5, 236, 143, 89, 251, 99, 214, 183, - 113, 204, 218, 147, 192, 207, 33, 129, 10, 189, 187, 46, 190, 159, 188, 159, - 36, 129, 105, 94, 134, 68, 193, 146, 232, 81, 136, 206, 130, 136, 93, 144, - 76, 138, 193, 83, 48, 137, 166, 1, 118, 166, 183, 102, 243, 161, 207, 224, - 83, 46, 3, 12, 127, 251, 227, 179, 23, 175, 145, 246, 169, 104, 158, 60, - 208, 241, 178, 54, 91, 6, 192, 166, 123, 131, 65, 32, 226, 229, 226, 132, - 142, 125, 20, 117, 213, 226, 198, 98, 74, 185, 249, 86, 206, 89, 138, 154, - 147, 70, 110, 229, 211, 49, 143, 37, 224, 80, 188, 129, 10, 26, 97, 186, - 92, 136, 88, 209, 253, 193, 89, 77, 20, 39, 86, 185, 65, 102, 141, 85, - 173, 86, 129, 92, 11, 212, 216, 131, 14, 90, 110, 222, 102, 51, 105, 172, - 201, 77, 113, 80, 46, 121, 194, 157, 204, 97, 201, 74, 31, 125, 191, 58, - 141, 198, 109, 214, 175, 33, 16, 158, 236, 6, 164, 215, 208, 77, 2, 18, - 245, 35, 86, 137, 205, 120, 164, 171, 185, 190, 116, 24, 75, 238, 247, 198, - 87, 240, 26, 211, 250, 228, 171, 36, 255, 33, 33, 41, 127, 64, 116, 245, - 0, 71, 66, 219, 58, 193, 136, 1, 13, 253, 6, 98, 71, 57, 168, 145, - 53, 160, 197, 43, 141, 46, 5, 73, 16, 199, 65, 53, 112, 69, 151, 123, - 83, 200, 129, 155, 56, 134, 151, 139, 113, 15, 214, 107, 120, 193, 105, 103, - 226, 33, 206, 181, 149, 160, 174, 134, 80, 102, 78, 58, 142, 180, 217, 116, - 212, 73, 81, 116, 25, 97, 86, 11, 149, 132, 202, 209, 91, 253, 21, 40, - 254, 125, 248, 120, 253, 19, 182, 72, 184, 152, 51, 26, 137, 221, 8, 245, - 31, 100, 132, 230, 186, 245, 70, 203, 196, 188, 102, 199, 159, 182, 197, 56, - 188, 242, 187, 33, 31, 5, 157, 41, 189, 31, 123, 79, 132, 93, 130, 115, - 31, 117, 174, 173, 102, 165, 100, 185, 60, 90, 222, 131, 122, 112, 81, 130, - 20, 247, 65, 195, 198, 31, 219, 65, 103, 29, 221, 156, 185, 70, 33, 62, - 172, 245, 168, 16, 45, 122, 28, 132, 54, 206, 232, 216, 48, 229, 60, 113, - 91, 5, 34, 130, 160, 229, 60, 232, 52, 106, 206, 134, 225, 174, 117, 40, - 38, 135, 2, 111, 180, 55, 12, 230, 185, 101, 31, 193, 159, 115, 15, 254, - 96, 245, 28, 226, 191, 173, 123, 71, 248, 212, 114, 240, 223, 35, 61, 37, - 46, 80, 230, 49, 62, 160, 6, 248, 162, 123, 46, 128, 220, 123, 244, 92, - 198, 221, 156, 248, 198, 138, 22, 128, 2, 250, 225, 228, 42, 28, 93, 249, - 248, 45, 232, 71, 68, 132, 10, 220, 178, 216, 13, 172, 127, 206, 236, 112, - 187, 58, 161, 128, 169, 79, 212, 217, 7, 196, 17, 212, 79, 17, 14, 156, - 60, 152, 188, 236, 80, 216, 147, 232, 223, 179, 121, 201, 186, 85, 46, 111, - 216, 75, 233, 90, 197, 186, 85, 183, 94, 146, 191, 240, 13, 155, 185, 131, - 53, 70, 40, 105, 0, 104, 115, 59, 221, 29, 64, 52, 120, 40, 168, 177, - 226, 223, 138, 104, 143, 254, 96, 83, 100, 232, 97, 5, 198, 0, 85, 85, - 80, 220, 84, 25, 16, 134, 172, 177, 182, 108, 30, 141, 7, 127, 197, 67, - 10, 60, 216, 60, 120, 34, 94, 92, 144, 129, 33, 20, 248, 136, 73, 201, - 20, 139, 66, 236, 2, 233, 8, 195, 170, 27, 226, 185, 105, 55, 169, 128, - 55, 133, 99, 195, 160, 59, 15, 80, 79, 198, 206, 4, 161, 78, 225, 31, - 121, 148, 48, 162, 160, 75, 145, 104, 192, 66, 50, 105, 59, 34, 210, 180, - 117, 14, 109, 140, 47, 125, 51, 38, 114, 141, 214, 233, 91, 81, 145, 1, - 71, 200, 35, 152, 52, 138, 4, 28, 37, 151, 209, 215, 195, 49, 109, 194, - 49, 166, 240, 3, 230, 209, 205, 160, 25, 150, 222, 0, 19, 244, 30, 84, - 69, 42, 52, 242, 214, 254, 172, 59, 129, 165, 176, 41, 76, 195, 72, 7, - 3, 96, 147, 10, 140, 36, 9, 30, 16, 206, 15, 176, 196, 28, 247, 152, - 245, 233, 137, 203, 69, 105, 237, 39, 88, 236, 22, 96, 49, 54, 25, 159, - 241, 101, 125, 206, 138, 227, 112, 224, 151, 46, 209, 27, 232, 216, 159, 93, - 250, 56, 98, 208, 116, 177, 100, 77, 198, 69, 118, 70, 113, 254, 88, 49, - 217, 7, 231, 144, 1, 58, 81, 42, 90, 240, 111, 177, 92, 228, 75, 114, - 66, 94, 134, 138, 106, 73, 56, 71, 146, 143, 183, 116, 129, 194, 236, 42, - 117, 108, 223, 186, 30, 119, 193, 21, 241, 40, 199, 55, 162, 210, 81, 19, - 71, 18, 110, 251, 16, 80, 3, 155, 240, 55, 206, 83, 252, 95, 197, 19, - 255, 244, 128, 165, 240, 231, 145, 17, 79, 44, 69, 162, 1, 79, 200, 164, - 79, 194, 19, 174, 134, 39, 30, 14, 6, 130, 57, 136, 93, 1, 206, 67, - 61, 222, 234, 115, 92, 228, 88, 190, 187, 195, 206, 150, 152, 225, 73, 130, - 25, 94, 239, 142, 25, 204, 39, 138, 212, 105, 2, 15, 19, 218, 33, 98, - 224, 247, 195, 49, 44, 100, 248, 72, 88, 111, 1, 202, 75, 241, 91, 67, - 168, 249, 138, 228, 47, 124, 188, 120, 124, 76, 24, 199, 5, 93, 163, 137, - 193, 99, 222, 28, 86, 152, 114, 98, 120, 54, 103, 17, 240, 76, 163, 1, - 160, 180, 16, 240, 144, 207, 162, 96, 12, 235, 101, 6, 232, 33, 90, 140, - 230, 52, 64, 112, 80, 73, 142, 24, 30, 27, 206, 252, 139, 142, 116, 36, - 61, 243, 47, 131, 104, 62, 91, 215, 200, 41, 116, 56, 187, 172, 79, 96, - 59, 215, 29, 231, 168, 229, 22, 31, 136, 185, 134, 1, 18, 157, 102, 175, - 71, 139, 203, 106, 48, 185, 95, 247, 146, 51, 82, 9, 14, 67, 47, 188, - 89, 63, 100, 111, 66, 188, 245, 11, 202, 223, 196, 145, 230, 176, 238, 54, - 205, 106, 18, 230, 133, 249, 7, 163, 88, 216, 164, 108, 118, 5, 167, 20, - 194, 33, 2, 201, 198, 232, 68, 96, 89, 68, 62, 46, 197, 117, 230, 105, - 137, 175, 183, 4, 241, 34, 218, 248, 82, 72, 183, 182, 35, 202, 221, 130, - 111, 211, 251, 122, 23, 124, 27, 15, 57, 142, 11, 125, 116, 115, 143, 113, - 19, 140, 251, 51, 30, 87, 95, 64, 166, 216, 41, 236, 216, 155, 118, 231, - 0, 21, 206, 131, 228, 155, 9, 151, 154, 180, 90, 200, 113, 144, 162, 211, - 226, 141, 21, 101, 180, 70, 237, 72, 79, 222, 201, 5, 67, 70, 240, 218, - 228, 158, 28, 246, 130, 213, 189, 96, 117, 47, 88, 253, 191, 40, 88, 253, - 250, 42, 33, 49, 94, 20, 82, 189, 228, 61, 215, 189, 78, 26, 147, 110, - 113, 252, 22, 215, 149, 21, 229, 105, 8, 251, 236, 169, 23, 205, 207, 83, - 120, 187, 123, 1, 64, 59, 11, 218, 193, 207, 78, 51, 117, 196, 125, 29, - 46, 253, 89, 62, 114, 223, 91, 83, 238, 149, 58, 246, 74, 29, 123, 196, - 187, 53, 100, 210, 107, 111, 49, 98, 47, 61, 56, 39, 124, 126, 140, 110, - 244, 21, 90, 111, 28, 110, 195, 199, 132, 234, 210, 72, 153, 3, 73, 248, - 68, 74, 30, 110, 182, 200, 238, 88, 89, 84, 118, 253, 161, 177, 201, 96, - 231, 46, 252, 15, 206, 227, 79, 131, 209, 152, 253, 48, 94, 140, 104, 119, - 40, 183, 124, 40, 86, 248, 145, 162, 217, 240, 176, 204, 148, 197, 239, 210, - 233, 202, 206, 64, 76, 24, 27, 102, 47, 242, 231, 241, 210, 189, 46, 190, - 154, 45, 67, 246, 242, 181, 219, 168, 254, 248, 228, 13, 204, 249, 223, 195, - 129, 247, 145, 253, 252, 226, 225, 91, 214, 106, 52, 116, 64, 211, 85, 33, - 111, 158, 85, 223, 50, 231, 144, 64, 255, 152, 124, 156, 132, 203, 137, 114, - 118, 126, 68, 238, 181, 245, 48, 206, 132, 200, 1, 249, 66, 1, 254, 21, - 47, 240, 68, 88, 228, 97, 157, 185, 30, 5, 188, 188, 18, 145, 74, 121, - 152, 231, 24, 204, 75, 188, 154, 140, 214, 197, 236, 125, 78, 66, 99, 220, - 212, 9, 33, 37, 171, 197, 75, 35, 93, 90, 251, 56, 28, 133, 184, 196, - 121, 253, 66, 154, 178, 139, 48, 229, 209, 44, 86, 252, 80, 163, 66, 52, - 108, 188, 243, 211, 13, 98, 30, 195, 150, 155, 225, 180, 223, 148, 145, 159, - 119, 110, 202, 5, 236, 235, 141, 121, 18, 182, 246, 198, 172, 123, 60, 151, - 197, 115, 153, 43, 63, 190, 60, 30, 142, 144, 127, 186, 121, 145, 252, 97, - 130, 162, 134, 107, 112, 58, 153, 222, 248, 128, 132, 186, 221, 12, 208, 186, - 246, 102, 151, 239, 25, 119, 58, 140, 152, 39, 147, 101, 131, 96, 23, 22, - 200, 6, 49, 121, 33, 91, 197, 221, 194, 130, 113, 212, 2, 147, 29, 118, - 39, 83, 183, 97, 243, 247, 143, 136, 19, 186, 243, 177, 183, 2, 172, 145, - 129, 33, 226, 208, 129, 179, 96, 133, 168, 67, 0, 23, 28, 125, 100, 62, - 100, 59, 86, 205, 244, 47, 78, 34, 198, 183, 234, 102, 191, 64, 169, 240, - 179, 70, 200, 221, 152, 202, 223, 45, 244, 198, 141, 14, 191, 206, 235, 141, - 157, 78, 34, 245, 130, 87, 183, 131, 230, 69, 34, 156, 220, 184, 217, 17, - 193, 228, 224, 185, 213, 137, 227, 49, 195, 91, 155, 87, 64, 178, 166, 235, - 238, 212, 155, 15, 187, 179, 254, 198, 114, 106, 253, 96, 124, 249, 27, 11, - 76, 80, 126, 135, 25, 48, 20, 149, 70, 119, 235, 245, 203, 113, 208, 175, - 249, 139, 58, 172, 29, 175, 123, 1, 212, 4, 191, 27, 240, 126, 84, 143, - 235, 9, 107, 198, 138, 50, 98, 60, 20, 69, 145, 138, 2, 31, 124, 121, - 35, 137, 94, 75, 163, 245, 132, 235, 19, 6, 191, 249, 53, 118, 221, 160, - 80, 14, 14, 33, 151, 131, 101, 221, 106, 149, 55, 182, 14, 28, 18, 80, - 6, 108, 208, 138, 67, 249, 37, 100, 31, 110, 210, 240, 36, 193, 59, 35, - 90, 121, 206, 250, 36, 108, 164, 22, 151, 212, 196, 112, 195, 45, 16, 111, - 219, 237, 68, 147, 194, 27, 252, 186, 0, 186, 220, 71, 244, 30, 225, 199, - 30, 226, 194, 166, 198, 29, 23, 5, 97, 244, 85, 120, 67, 131, 99, 199, - 3, 255, 113, 152, 117, 221, 27, 83, 52, 107, 188, 240, 118, 239, 119, 90, - 164, 216, 9, 29, 135, 102, 133, 180, 179, 159, 8, 209, 232, 30, 152, 35, - 130, 71, 223, 121, 227, 233, 189, 127, 162, 101, 216, 56, 210, 73, 52, 77, - 66, 111, 105, 27, 96, 74, 132, 164, 74, 62, 157, 126, 9, 77, 21, 237, - 56, 189, 248, 240, 242, 194, 99, 15, 95, 3, 5, 38, 2, 28, 191, 186, - 109, 196, 197, 139, 95, 3, 246, 210, 135, 201, 154, 72, 10, 173, 130, 30, - 246, 103, 97, 36, 10, 62, 27, 93, 132, 128, 139, 159, 248, 163, 185, 103, - 2, 9, 154, 175, 193, 90, 42, 232, 233, 235, 22, 202, 218, 161, 62, 108, - 58, 233, 160, 72, 254, 233, 117, 155, 39, 107, 133, 126, 122, 125, 202, 142, - 85, 192, 107, 232, 214, 83, 158, 177, 173, 128, 223, 190, 118, 99, 134, 227, - 209, 63, 177, 14, 246, 248, 101, 12, 249, 233, 217, 15, 172, 244, 211, 41, - 96, 237, 139, 153, 87, 78, 56, 147, 234, 11, 111, 37, 190, 69, 133, 240, - 79, 73, 122, 168, 166, 105, 188, 206, 44, 168, 74, 238, 231, 117, 56, 242, - 102, 33, 160, 234, 195, 195, 150, 254, 122, 164, 189, 30, 97, 63, 223, 132, - 163, 145, 31, 176, 103, 111, 68, 97, 241, 254, 106, 6, 104, 159, 79, 140, - 128, 188, 241, 231, 179, 16, 123, 136, 231, 113, 34, 71, 90, 194, 113, 35, - 218, 118, 11, 145, 53, 170, 208, 227, 92, 101, 156, 217, 254, 215, 112, 42, - 113, 156, 48, 206, 181, 69, 10, 107, 194, 247, 71, 17, 246, 77, 85, 24, - 117, 209, 252, 68, 115, 229, 21, 88, 135, 225, 182, 243, 93, 178, 251, 34, - 127, 49, 8, 171, 64, 243, 215, 236, 73, 48, 31, 250, 51, 110, 33, 134, - 39, 29, 18, 30, 239, 153, 167, 175, 126, 72, 76, 221, 91, 250, 140, 48, - 61, 123, 254, 143, 159, 35, 182, 136, 160, 59, 64, 144, 231, 120, 157, 25, - 249, 60, 220, 220, 16, 45, 234, 121, 140, 91, 31, 125, 109, 115, 221, 72, - 168, 38, 21, 115, 183, 7, 44, 216, 11, 56, 18, 64, 5, 23, 33, 243, - 230, 119, 13, 161, 117, 147, 88, 184, 215, 69, 253, 180, 38, 48, 55, 93, - 209, 254, 120, 231, 197, 179, 199, 69, 30, 10, 87, 37, 203, 132, 248, 125, - 89, 162, 30, 76, 6, 254, 170, 22, 81, 156, 219, 223, 121, 249, 40, 207, - 202, 169, 224, 193, 159, 119, 92, 190, 153, 219, 20, 20, 12, 185, 169, 20, - 148, 78, 203, 130, 157, 34, 14, 192, 182, 128, 130, 18, 79, 101, 53, 4, - 23, 85, 229, 209, 163, 174, 45, 167, 200, 190, 251, 142, 21, 173, 147, 13, - 94, 99, 77, 105, 243, 93, 226, 222, 179, 78, 108, 82, 170, 76, 215, 206, - 219, 92, 48, 15, 168, 94, 215, 155, 174, 186, 136, 41, 226, 23, 183, 109, - 95, 0, 181, 235, 78, 136, 218, 117, 137, 207, 84, 1, 30, 146, 63, 42, - 18, 16, 149, 233, 14, 144, 170, 101, 1, 196, 181, 106, 144, 86, 2, 184, - 152, 182, 186, 83, 32, 87, 93, 32, 123, 246, 251, 130, 128, 14, 167, 109, - 14, 85, 114, 14, 167, 81, 247, 56, 121, 197, 30, 92, 240, 76, 237, 24, - 184, 154, 186, 54, 231, 140, 129, 31, 128, 178, 221, 254, 68, 188, 15, 3, - 191, 91, 26, 70, 221, 128, 104, 156, 0, 206, 171, 48, 166, 212, 97, 245, - 157, 250, 251, 190, 160, 130, 90, 73, 22, 32, 106, 252, 125, 42, 136, 86, - 23, 72, 154, 250, 114, 164, 188, 28, 185, 246, 140, 40, 82, 55, 152, 81, - 33, 241, 22, 34, 41, 195, 1, 22, 239, 51, 164, 87, 216, 17, 148, 109, - 120, 35, 29, 12, 100, 204, 176, 88, 110, 148, 148, 164, 39, 218, 32, 197, - 38, 102, 230, 45, 16, 170, 137, 137, 205, 194, 185, 94, 81, 98, 16, 100, - 25, 46, 53, 245, 119, 178, 94, 209, 60, 64, 25, 198, 227, 145, 23, 69, - 65, 159, 223, 125, 113, 226, 19, 162, 21, 7, 251, 41, 80, 94, 78, 231, - 3, 254, 118, 69, 133, 126, 241, 71, 248, 176, 39, 239, 127, 62, 121, 223, - 83, 230, 191, 26, 101, 62, 157, 47, 188, 217, 156, 157, 226, 61, 82, 111, - 253, 59, 72, 51, 226, 9, 162, 207, 167, 129, 66, 160, 195, 11, 84, 103, - 40, 234, 49, 234, 35, 222, 72, 109, 236, 215, 17, 69, 84, 17, 89, 84, - 163, 184, 88, 117, 42, 139, 125, 22, 137, 78, 127, 209, 231, 210, 232, 163, - 186, 211, 52, 107, 103, 230, 34, 189, 207, 160, 214, 25, 58, 156, 170, 119, - 193, 136, 206, 114, 72, 23, 240, 171, 135, 168, 178, 123, 229, 218, 41, 120, - 159, 163, 206, 46, 221, 186, 248, 221, 43, 39, 157, 1, 70, 27, 200, 245, - 37, 144, 63, 67, 105, 153, 24, 205, 7, 152, 250, 190, 144, 77, 191, 50, - 54, 123, 69, 200, 23, 18, 182, 14, 208, 167, 81, 40, 109, 8, 12, 180, - 234, 217, 36, 154, 123, 147, 57, 59, 195, 80, 244, 139, 177, 47, 3, 153, - 104, 149, 4, 60, 83, 183, 47, 242, 100, 201, 86, 58, 199, 239, 35, 93, - 241, 129, 245, 245, 91, 68, 191, 255, 248, 165, 130, 168, 118, 192, 170, 85, - 245, 52, 155, 78, 204, 79, 219, 82, 170, 178, 45, 109, 123, 98, 229, 134, - 46, 255, 211, 155, 141, 115, 187, 204, 19, 243, 211, 182, 148, 202, 233, 21, - 79, 219, 158, 152, 219, 229, 195, 227, 70, 182, 171, 4, 204, 194, 12, 185, - 210, 173, 18, 108, 107, 99, 230, 249, 76, 82, 114, 18, 242, 242, 155, 58, - 96, 158, 67, 37, 197, 219, 214, 65, 243, 236, 37, 41, 57, 9, 121, 249, - 77, 221, 136, 103, 204, 220, 139, 35, 195, 148, 28, 101, 103, 228, 40, 61, - 33, 71, 217, 249, 56, 106, 100, 7, 130, 96, 219, 26, 55, 79, 209, 81, - 206, 12, 29, 25, 39, 232, 40, 103, 126, 142, 148, 233, 201, 237, 128, 121, - 10, 142, 114, 102, 224, 200, 56, 1, 71, 57, 227, 127, 180, 125, 248, 41, - 176, 210, 191, 124, 96, 142, 75, 63, 172, 200, 66, 177, 12, 61, 209, 154, - 52, 103, 185, 49, 199, 13, 25, 110, 42, 95, 185, 49, 195, 238, 31, 36, - 38, 248, 198, 62, 27, 22, 66, 126, 182, 93, 114, 237, 207, 21, 251, 115, - 197, 254, 92, 177, 151, 248, 253, 177, 18, 191, 52, 47, 250, 37, 79, 20, - 134, 186, 23, 44, 22, 76, 77, 87, 184, 187, 23, 87, 21, 188, 215, 27, - 116, 171, 85, 59, 55, 41, 47, 37, 183, 68, 37, 63, 101, 91, 82, 5, - 206, 31, 134, 84, 216, 178, 227, 156, 254, 241, 164, 188, 148, 220, 18, 198, - 78, 240, 148, 109, 73, 233, 254, 1, 127, 148, 238, 23, 129, 210, 144, 76, - 142, 74, 22, 98, 170, 219, 52, 49, 9, 220, 8, 54, 231, 205, 182, 103, - 154, 12, 5, 222, 245, 70, 115, 67, 135, 76, 51, 145, 192, 141, 96, 115, - 222, 108, 195, 114, 244, 245, 70, 143, 50, 3, 124, 148, 30, 223, 163, 70, - 58, 189, 146, 1, 24, 32, 134, 150, 76, 195, 125, 100, 28, 237, 35, 195, - 96, 31, 25, 199, 250, 40, 25, 234, 76, 123, 166, 209, 60, 50, 14, 230, - 145, 97, 44, 143, 140, 67, 121, 100, 28, 201, 57, 240, 56, 221, 223, 128, - 199, 233, 150, 124, 193, 227, 64, 195, 74, 27, 230, 12, 55, 164, 111, 77, - 222, 94, 182, 114, 67, 242, 141, 189, 23, 115, 117, 67, 23, 51, 51, 154, - 159, 233, 230, 60, 55, 226, 238, 79, 19, 118, 100, 176, 243, 54, 129, 7, - 112, 80, 219, 100, 29, 211, 89, 152, 47, 230, 64, 17, 207, 239, 146, 112, - 112, 145, 223, 107, 68, 130, 125, 206, 90, 235, 144, 20, 32, 157, 94, 201, - 0, 12, 16, 47, 11, 170, 228, 246, 225, 113, 24, 142, 12, 29, 225, 96, - 19, 212, 152, 51, 211, 11, 14, 205, 111, 54, 246, 38, 149, 109, 58, 73, - 202, 75, 201, 45, 145, 233, 70, 146, 178, 45, 41, 51, 96, 74, 154, 241, - 19, 154, 141, 70, 163, 167, 119, 93, 128, 210, 144, 76, 142, 74, 22, 98, - 2, 109, 105, 246, 167, 199, 249, 105, 230, 97, 77, 167, 229, 38, 229, 151, - 201, 246, 209, 60, 180, 153, 180, 45, 31, 146, 120, 20, 243, 102, 163, 181, - 241, 244, 122, 120, 216, 78, 29, 64, 9, 146, 2, 164, 211, 43, 25, 128, - 249, 108, 140, 73, 218, 168, 24, 83, 242, 224, 108, 135, 74, 245, 185, 82, - 242, 156, 100, 62, 235, 36, 221, 131, 147, 116, 122, 37, 3, 48, 64, 242, - 58, 117, 98, 58, 205, 39, 96, 19, 212, 152, 51, 167, 254, 147, 180, 204, - 138, 32, 41, 64, 58, 189, 146, 1, 228, 215, 110, 234, 253, 137, 73, 36, - 37, 161, 198, 156, 153, 22, 183, 9, 163, 48, 221, 32, 138, 74, 192, 38, - 168, 49, 103, 166, 89, 41, 130, 218, 203, 67, 246, 242, 144, 189, 60, 100, - 47, 15, 249, 83, 228, 33, 192, 180, 254, 17, 162, 16, 94, 173, 184, 91, - 189, 152, 18, 7, 133, 7, 4, 253, 93, 123, 213, 211, 42, 169, 215, 204, - 59, 157, 156, 83, 176, 138, 188, 87, 149, 160, 62, 112, 156, 153, 102, 57, - 48, 11, 51, 228, 170, 152, 96, 153, 86, 38, 130, 178, 103, 90, 74, 18, - 204, 240, 156, 220, 149, 60, 120, 126, 66, 118, 52, 148, 68, 181, 195, 196, - 101, 169, 29, 21, 0, 253, 61, 149, 90, 73, 191, 103, 1, 105, 200, 176, - 159, 105, 212, 52, 76, 233, 148, 156, 132, 188, 252, 233, 86, 77, 67, 149, - 73, 201, 77, 242, 145, 229, 84, 15, 196, 192, 182, 105, 167, 90, 122, 215, - 94, 245, 180, 74, 234, 181, 146, 174, 76, 249, 80, 35, 220, 12, 77, 215, - 27, 195, 105, 144, 149, 164, 147, 84, 111, 79, 244, 118, 78, 244, 180, 74, - 234, 53, 243, 94, 73, 215, 158, 57, 230, 39, 192, 44, 204, 144, 75, 175, - 240, 68, 151, 57, 209, 187, 246, 170, 167, 85, 82, 175, 153, 202, 178, 189, - 59, 201, 10, 149, 36, 204, 144, 171, 98, 130, 101, 90, 201, 8, 147, 18, - 96, 22, 102, 200, 85, 49, 193, 42, 219, 240, 243, 239, 19, 119, 32, 6, - 54, 72, 58, 226, 83, 200, 25, 241, 81, 38, 97, 71, 188, 188, 136, 54, - 103, 229, 29, 122, 250, 103, 152, 130, 252, 99, 4, 12, 39, 231, 231, 84, - 147, 144, 95, 2, 248, 2, 230, 38, 38, 32, 167, 11, 32, 127, 129, 17, - 244, 211, 143, 154, 177, 136, 4, 191, 241, 189, 145, 52, 13, 209, 18, 222, - 86, 127, 134, 38, 143, 77, 70, 21, 63, 192, 176, 250, 100, 224, 240, 246, - 245, 155, 87, 69, 91, 3, 243, 78, 170, 182, 164, 42, 92, 181, 196, 120, - 29, 206, 240, 171, 160, 87, 236, 229, 99, 19, 244, 23, 132, 62, 15, 199, - 168, 46, 60, 29, 174, 161, 175, 3, 238, 81, 8, 187, 187, 231, 253, 247, - 188, 255, 158, 247, 223, 243, 254, 127, 40, 239, 175, 35, 240, 47, 201, 254, - 103, 106, 22, 246, 14, 11, 196, 244, 130, 94, 196, 118, 15, 87, 136, 231, - 187, 174, 180, 116, 136, 56, 138, 206, 2, 134, 151, 138, 61, 132, 4, 206, - 16, 195, 83, 93, 26, 120, 85, 197, 134, 142, 21, 163, 2, 31, 241, 52, - 169, 251, 175, 80, 122, 175, 2, 121, 127, 220, 216, 222, 64, 133, 38, 86, - 8, 83, 66, 221, 216, 133, 238, 164, 159, 133, 93, 245, 237, 81, 140, 204, - 161, 91, 28, 153, 99, 131, 55, 140, 251, 167, 145, 245, 212, 200, 110, 165, - 236, 47, 253, 229, 86, 186, 62, 241, 13, 70, 157, 106, 234, 167, 208, 116, - 78, 95, 97, 36, 30, 203, 103, 24, 186, 159, 228, 51, 204, 196, 191, 228, - 115, 98, 93, 105, 32, 139, 105, 144, 129, 164, 30, 239, 224, 219, 161, 165, - 209, 208, 56, 42, 69, 226, 204, 225, 121, 184, 132, 34, 167, 192, 34, 13, - 0, 41, 195, 227, 79, 128, 77, 197, 143, 63, 219, 201, 210, 110, 79, 127, - 247, 244, 119, 79, 127, 247, 244, 247, 243, 233, 239, 196, 223, 205, 14, 177, - 117, 96, 57, 21, 203, 173, 54, 117, 34, 220, 188, 129, 8, 243, 234, 133, - 16, 14, 112, 108, 44, 113, 195, 231, 228, 73, 74, 81, 248, 115, 44, 44, - 2, 84, 58, 148, 5, 240, 57, 121, 146, 5, 248, 115, 92, 0, 240, 243, - 111, 178, 0, 62, 39, 79, 178, 0, 127, 142, 11, 40, 6, 136, 162, 88, - 2, 73, 191, 203, 42, 84, 72, 37, 38, 242, 10, 61, 174, 102, 72, 116, - 150, 102, 87, 12, 160, 76, 101, 104, 210, 152, 170, 44, 195, 20, 96, 158, - 138, 1, 148, 169, 236, 56, 91, 217, 113, 186, 178, 227, 108, 101, 199, 122, - 101, 115, 105, 50, 25, 215, 21, 67, 210, 239, 113, 77, 10, 68, 169, 72, - 90, 86, 38, 21, 197, 182, 150, 233, 28, 149, 44, 36, 43, 174, 48, 113, - 15, 159, 200, 216, 76, 124, 163, 221, 100, 194, 214, 188, 26, 13, 182, 178, - 53, 40, 213, 217, 154, 186, 19, 91, 211, 176, 53, 198, 198, 228, 88, 34, - 207, 85, 133, 20, 50, 24, 228, 14, 173, 44, 232, 216, 80, 240, 208, 36, - 152, 216, 77, 162, 144, 230, 158, 12, 121, 17, 250, 15, 35, 20, 106, 216, - 115, 77, 123, 174, 105, 207, 53, 237, 185, 166, 111, 159, 107, 66, 237, 140, - 63, 144, 107, 226, 213, 11, 174, 41, 227, 92, 33, 197, 169, 40, 94, 23, - 114, 242, 87, 114, 19, 98, 62, 72, 113, 250, 32, 171, 207, 243, 3, 65, - 121, 42, 6, 80, 92, 153, 148, 132, 56, 73, 101, 10, 40, 3, 144, 149, - 105, 160, 76, 101, 173, 108, 101, 173, 116, 101, 173, 108, 101, 45, 99, 101, - 199, 217, 202, 142, 211, 149, 29, 103, 43, 59, 54, 127, 230, 161, 225, 59, - 51, 210, 34, 117, 216, 116, 152, 145, 135, 156, 244, 13, 108, 164, 81, 250, - 51, 233, 155, 152, 201, 73, 63, 167, 226, 43, 99, 197, 87, 70, 177, 146, - 169, 226, 43, 83, 197, 56, 202, 217, 30, 115, 168, 9, 102, 226, 88, 141, - 61, 198, 132, 133, 177, 226, 133, 161, 226, 133, 177, 226, 69, 94, 197, 217, - 161, 224, 80, 19, 204, 84, 49, 13, 197, 86, 36, 241, 59, 249, 80, 220, - 255, 6, 62, 244, 117, 208, 199, 48, 180, 79, 223, 26, 88, 208, 41, 79, - 187, 88, 101, 249, 207, 56, 233, 119, 222, 147, 77, 188, 81, 120, 9, 141, - 86, 217, 195, 201, 36, 100, 206, 49, 55, 150, 12, 103, 57, 185, 128, 73, - 6, 86, 107, 61, 242, 217, 51, 188, 79, 51, 38, 108, 73, 121, 150, 83, - 237, 169, 63, 13, 60, 217, 176, 150, 128, 254, 78, 121, 234, 179, 252, 20, - 173, 218, 31, 97, 132, 41, 199, 107, 127, 70, 156, 230, 233, 98, 130, 163, - 208, 112, 198, 1, 198, 218, 205, 77, 111, 111, 79, 119, 26, 148, 110, 104, - 232, 116, 74, 206, 176, 122, 51, 223, 255, 205, 87, 107, 224, 204, 38, 176, - 15, 90, 186, 169, 134, 197, 24, 85, 199, 135, 190, 55, 55, 149, 55, 167, - 254, 20, 166, 146, 146, 138, 127, 246, 251, 195, 9, 114, 57, 188, 26, 224, - 182, 184, 47, 69, 30, 199, 70, 205, 249, 175, 96, 4, 236, 14, 207, 38, - 124, 245, 157, 226, 5, 114, 240, 27, 81, 117, 104, 79, 201, 65, 94, 229, - 56, 191, 164, 64, 127, 1, 166, 8, 35, 225, 136, 242, 251, 75, 198, 61, - 187, 190, 103, 215, 179, 236, 186, 8, 242, 36, 217, 117, 12, 186, 196, 222, - 132, 232, 243, 52, 194, 218, 108, 226, 114, 97, 119, 177, 11, 192, 19, 163, - 53, 243, 174, 188, 96, 228, 245, 0, 111, 222, 196, 188, 151, 138, 9, 245, - 168, 50, 143, 42, 96, 63, 121, 163, 193, 99, 232, 23, 244, 100, 94, 140, - 253, 186, 44, 151, 203, 218, 32, 184, 12, 250, 51, 223, 171, 245, 252, 250, - 16, 114, 245, 71, 139, 121, 21, 114, 85, 35, 196, 210, 85, 175, 58, 242, - 170, 147, 224, 99, 21, 93, 176, 194, 172, 251, 219, 215, 221, 77, 220, 188, - 254, 157, 159, 207, 204, 187, 232, 178, 252, 38, 102, 62, 38, 139, 95, 242, - 246, 81, 173, 116, 1, 159, 129, 164, 8, 242, 120, 64, 56, 187, 72, 56, - 133, 66, 203, 251, 66, 156, 132, 92, 2, 13, 106, 55, 176, 77, 192, 28, - 104, 160, 214, 17, 33, 137, 19, 85, 39, 64, 152, 26, 145, 18, 152, 161, - 88, 199, 37, 84, 138, 156, 1, 167, 99, 192, 153, 34, 29, 235, 18, 29, - 180, 115, 210, 218, 249, 105, 68, 255, 146, 90, 57, 81, 235, 114, 162, 38, - 139, 244, 8, 93, 155, 211, 56, 169, 234, 34, 169, 74, 103, 207, 166, 12, - 67, 29, 252, 190, 48, 151, 36, 13, 203, 73, 130, 214, 21, 17, 154, 223, - 23, 126, 35, 122, 132, 105, 221, 37, 12, 68, 66, 193, 236, 56, 37, 16, - 212, 43, 129, 92, 113, 202, 133, 101, 242, 151, 208, 167, 241, 121, 201, 34, - 49, 49, 121, 48, 44, 243, 92, 95, 184, 56, 104, 115, 3, 139, 135, 224, - 79, 191, 50, 109, 182, 157, 6, 43, 161, 135, 157, 249, 168, 63, 10, 166, - 101, 83, 194, 216, 203, 192, 23, 209, 84, 100, 79, 217, 208, 64, 122, 51, - 175, 194, 102, 78, 133, 205, 156, 10, 185, 132, 208, 109, 30, 103, 106, 204, - 166, 136, 42, 181, 132, 109, 117, 158, 228, 214, 121, 146, 87, 231, 137, 86, - 231, 158, 127, 217, 243, 47, 123, 254, 229, 38, 254, 229, 255, 45, 60, 140, - 86, 1, 136, 214, 251, 124, 246, 37, 198, 139, 138, 4, 146, 250, 4, 83, - 204, 158, 132, 203, 9, 172, 203, 65, 194, 197, 252, 10, 109, 143, 169, 233, - 90, 63, 28, 215, 188, 69, 157, 144, 36, 119, 80, 23, 75, 36, 171, 192, - 215, 68, 213, 139, 112, 86, 29, 136, 26, 234, 159, 199, 202, 104, 159, 252, - 39, 137, 37, 233, 195, 190, 40, 23, 35, 42, 228, 18, 72, 68, 250, 100, - 186, 204, 177, 165, 157, 130, 1, 158, 84, 64, 2, 67, 10, 25, 25, 162, - 119, 67, 209, 102, 182, 104, 83, 45, 74, 146, 22, 68, 227, 106, 217, 52, - 16, 11, 43, 176, 76, 233, 19, 83, 233, 19, 67, 233, 147, 164, 180, 121, - 104, 63, 145, 186, 211, 224, 25, 40, 251, 233, 8, 227, 183, 230, 43, 61, - 115, 159, 251, 152, 41, 75, 224, 147, 180, 207, 80, 118, 134, 92, 253, 32, - 210, 46, 7, 201, 41, 43, 2, 158, 74, 200, 211, 215, 248, 26, 107, 82, - 113, 15, 172, 90, 14, 1, 106, 25, 65, 111, 227, 11, 69, 12, 66, 37, - 218, 74, 113, 9, 138, 50, 181, 84, 116, 38, 56, 119, 242, 202, 61, 217, - 255, 232, 79, 32, 79, 159, 233, 189, 76, 39, 36, 189, 75, 167, 136, 186, - 82, 205, 203, 44, 72, 212, 185, 19, 69, 70, 14, 234, 85, 248, 71, 246, - 195, 199, 185, 76, 69, 93, 236, 95, 78, 99, 54, 224, 7, 36, 122, 236, - 199, 183, 169, 44, 73, 122, 126, 73, 174, 171, 205, 211, 140, 30, 245, 181, - 28, 173, 140, 154, 247, 15, 232, 45, 81, 85, 84, 231, 137, 202, 151, 184, - 57, 224, 182, 9, 74, 159, 173, 168, 128, 191, 69, 66, 44, 150, 104, 170, - 123, 185, 182, 191, 186, 229, 44, 62, 240, 202, 247, 220, 209, 158, 59, 218, - 115, 71, 251, 203, 216, 63, 150, 235, 73, 72, 226, 151, 100, 125, 180, 90, - 133, 234, 248, 148, 211, 205, 228, 242, 146, 251, 231, 133, 215, 11, 105, 199, - 215, 77, 204, 71, 133, 27, 221, 36, 85, 0, 90, 6, 192, 74, 220, 7, - 18, 173, 164, 250, 83, 119, 139, 174, 84, 26, 39, 168, 112, 196, 11, 139, - 249, 146, 19, 172, 174, 222, 29, 29, 156, 116, 68, 135, 139, 90, 120, 107, - 50, 229, 99, 76, 26, 186, 135, 45, 91, 133, 126, 236, 250, 49, 85, 163, - 187, 217, 171, 72, 42, 171, 35, 146, 235, 94, 174, 82, 25, 236, 27, 74, - 113, 21, 119, 158, 162, 250, 222, 215, 18, 18, 53, 48, 14, 246, 145, 252, - 37, 218, 251, 60, 73, 233, 180, 107, 4, 182, 179, 48, 248, 58, 69, 89, - 126, 133, 14, 170, 187, 156, 177, 226, 125, 201, 49, 86, 84, 77, 1, 167, - 49, 165, 219, 178, 40, 63, 141, 105, 84, 150, 157, 129, 115, 252, 71, 228, - 207, 170, 79, 252, 139, 0, 145, 71, 150, 113, 4, 180, 51, 27, 240, 212, - 44, 231, 168, 36, 26, 89, 199, 211, 41, 44, 238, 139, 117, 34, 11, 126, - 168, 80, 38, 215, 46, 2, 110, 135, 109, 186, 198, 27, 161, 34, 71, 227, - 241, 43, 96, 32, 159, 162, 203, 43, 52, 83, 214, 34, 211, 144, 36, 194, - 99, 48, 81, 72, 255, 141, 104, 245, 73, 136, 137, 12, 142, 101, 151, 192, - 213, 206, 67, 148, 79, 3, 82, 245, 17, 65, 60, 155, 76, 23, 115, 54, - 194, 46, 112, 89, 113, 56, 37, 252, 23, 92, 176, 117, 184, 128, 156, 35, - 188, 143, 131, 140, 216, 113, 202, 198, 115, 205, 16, 38, 62, 32, 6, 215, - 12, 56, 118, 207, 178, 236, 89, 150, 255, 46, 150, 229, 175, 198, 85, 252, - 161, 161, 30, 211, 72, 17, 59, 247, 49, 152, 178, 34, 176, 4, 157, 77, - 81, 132, 214, 185, 239, 138, 32, 59, 183, 224, 137, 33, 2, 135, 165, 52, - 193, 11, 139, 24, 133, 43, 136, 136, 45, 3, 192, 10, 49, 238, 3, 230, - 111, 28, 68, 17, 228, 46, 178, 153, 15, 187, 109, 130, 209, 120, 96, 96, - 58, 20, 27, 207, 129, 157, 6, 179, 184, 97, 24, 220, 22, 47, 214, 206, - 62, 88, 144, 120, 206, 206, 248, 207, 108, 204, 31, 40, 196, 94, 97, 84, - 104, 176, 201, 184, 6, 253, 115, 139, 12, 168, 96, 231, 122, 181, 161, 224, - 121, 216, 189, 179, 59, 22, 128, 238, 156, 119, 58, 119, 250, 139, 158, 127, - 103, 3, 19, 5, 189, 234, 226, 11, 149, 144, 33, 14, 233, 25, 58, 17, - 78, 46, 188, 96, 100, 254, 32, 78, 9, 2, 24, 146, 248, 75, 46, 36, - 22, 231, 232, 120, 49, 25, 200, 47, 42, 96, 36, 191, 66, 242, 5, 24, - 222, 175, 22, 247, 43, 120, 241, 192, 109, 183, 55, 172, 14, 167, 207, 54, - 126, 188, 33, 26, 17, 131, 213, 28, 235, 194, 237, 64, 181, 114, 39, 202, - 252, 53, 47, 67, 38, 159, 19, 49, 163, 228, 205, 199, 225, 192, 87, 231, - 102, 7, 10, 173, 46, 25, 152, 194, 247, 48, 162, 239, 139, 188, 255, 110, - 54, 36, 241, 47, 222, 44, 8, 23, 166, 27, 156, 43, 158, 146, 37, 212, - 34, 225, 147, 110, 113, 14, 27, 119, 34, 241, 195, 74, 23, 222, 128, 59, - 236, 86, 94, 153, 55, 154, 35, 232, 225, 40, 128, 3, 8, 197, 62, 71, - 212, 8, 252, 203, 71, 70, 170, 24, 236, 159, 67, 96, 175, 8, 230, 3, - 83, 3, 71, 147, 169, 199, 145, 55, 6, 87, 31, 135, 147, 80, 21, 5, - 112, 249, 67, 9, 88, 195, 33, 93, 225, 96, 19, 242, 151, 149, 68, 91, - 242, 141, 174, 28, 21, 0, 178, 112, 254, 216, 87, 32, 87, 1, 236, 113, - 124, 23, 222, 184, 121, 167, 53, 128, 100, 186, 56, 144, 42, 16, 229, 53, - 177, 146, 183, 88, 177, 32, 209, 60, 65, 253, 23, 127, 18, 63, 176, 18, - 191, 69, 44, 43, 16, 217, 146, 124, 199, 79, 85, 223, 175, 130, 222, 204, - 155, 240, 34, 20, 50, 158, 143, 69, 241, 167, 112, 114, 201, 254, 14, 255, - 160, 252, 132, 20, 102, 74, 189, 81, 184, 156, 148, 133, 60, 69, 237, 214, - 11, 40, 194, 230, 24, 144, 29, 59, 245, 98, 1, 191, 236, 130, 186, 78, - 47, 44, 26, 6, 68, 117, 94, 18, 73, 30, 41, 3, 242, 18, 40, 169, - 55, 186, 12, 208, 211, 226, 43, 232, 199, 165, 207, 230, 130, 226, 2, 154, - 150, 149, 188, 94, 204, 166, 35, 124, 160, 0, 136, 248, 27, 206, 145, 254, - 148, 198, 216, 84, 89, 1, 36, 95, 147, 244, 238, 116, 28, 2, 129, 102, - 125, 100, 100, 171, 65, 132, 202, 244, 2, 36, 170, 39, 245, 169, 248, 153, - 174, 75, 197, 113, 87, 1, 12, 56, 4, 3, 57, 114, 13, 165, 248, 33, - 94, 16, 167, 139, 201, 100, 45, 127, 117, 40, 43, 161, 247, 9, 189, 91, - 28, 46, 215, 24, 9, 11, 217, 146, 187, 48, 75, 94, 212, 12, 24, 252, - 241, 41, 10, 30, 127, 225, 95, 153, 60, 97, 99, 176, 240, 203, 42, 164, - 47, 88, 46, 29, 40, 7, 65, 235, 138, 208, 90, 162, 140, 92, 127, 73, - 118, 62, 126, 231, 11, 203, 159, 33, 80, 248, 89, 35, 39, 106, 165, 33, - 192, 71, 114, 209, 113, 208, 218, 31, 193, 74, 217, 95, 30, 238, 121, 205, - 61, 175, 249, 173, 240, 154, 209, 13, 204, 166, 20, 101, 101, 100, 92, 95, - 128, 11, 189, 146, 76, 194, 151, 19, 95, 37, 85, 46, 216, 97, 227, 250, - 127, 155, 39, 255, 187, 137, 236, 248, 169, 75, 76, 65, 250, 157, 60, 119, - 17, 162, 236, 18, 135, 96, 247, 144, 63, 232, 194, 151, 119, 151, 200, 29, - 192, 59, 242, 6, 93, 206, 27, 192, 219, 194, 239, 34, 53, 180, 223, 23, - 184, 68, 6, 81, 177, 205, 171, 78, 42, 20, 79, 196, 5, 136, 23, 193, - 1, 136, 55, 34, 118, 182, 240, 187, 76, 61, 137, 95, 36, 213, 183, 213, - 18, 40, 27, 3, 58, 159, 232, 232, 92, 18, 169, 22, 63, 66, 81, 72, - 190, 81, 1, 241, 76, 125, 21, 207, 130, 16, 218, 244, 161, 60, 101, 8, - 196, 188, 251, 17, 254, 177, 185, 190, 16, 145, 115, 18, 18, 65, 139, 152, - 163, 203, 73, 184, 77, 84, 149, 215, 140, 143, 93, 34, 223, 246, 132, 19, - 111, 241, 57, 19, 73, 184, 237, 144, 200, 54, 70, 120, 244, 237, 41, 172, - 119, 94, 112, 74, 36, 219, 166, 80, 143, 246, 140, 168, 115, 151, 234, 149, - 47, 178, 131, 239, 11, 17, 17, 227, 46, 145, 38, 160, 76, 182, 120, 167, - 106, 72, 141, 75, 60, 9, 58, 44, 244, 191, 82, 239, 174, 205, 85, 164, - 196, 15, 205, 76, 132, 20, 150, 255, 155, 188, 115, 103, 81, 208, 42, 189, - 208, 140, 146, 16, 146, 195, 147, 71, 153, 132, 161, 42, 47, 86, 182, 236, - 174, 248, 237, 210, 50, 138, 223, 36, 173, 77, 0, 242, 99, 222, 23, 132, - 98, 149, 45, 21, 172, 176, 39, 177, 178, 149, 160, 170, 54, 53, 78, 205, - 198, 244, 148, 191, 114, 90, 154, 183, 165, 62, 77, 248, 38, 55, 141, 38, - 121, 203, 108, 201, 187, 60, 8, 122, 1, 207, 59, 252, 60, 165, 133, 124, - 231, 231, 145, 147, 219, 112, 30, 233, 121, 35, 111, 210, 247, 187, 151, 72, - 71, 207, 172, 7, 231, 204, 166, 3, 32, 102, 104, 222, 7, 170, 183, 97, - 149, 248, 228, 132, 201, 53, 246, 43, 255, 181, 27, 226, 63, 200, 120, 155, - 31, 243, 232, 0, 167, 231, 198, 211, 20, 198, 80, 47, 96, 58, 70, 87, - 87, 99, 182, 51, 235, 186, 85, 61, 222, 216, 60, 156, 59, 239, 212, 3, - 7, 234, 226, 157, 181, 110, 81, 108, 250, 84, 96, 122, 54, 57, 107, 156, - 243, 8, 240, 204, 211, 194, 180, 67, 245, 28, 175, 2, 102, 195, 171, 235, - 17, 76, 79, 116, 142, 152, 77, 192, 245, 232, 237, 85, 38, 242, 152, 239, - 183, 71, 52, 185, 75, 155, 142, 108, 147, 216, 173, 88, 140, 186, 159, 141, - 177, 232, 41, 114, 1, 146, 87, 104, 59, 174, 237, 28, 2, 49, 114, 91, - 42, 43, 51, 90, 140, 39, 17, 74, 8, 227, 6, 121, 156, 233, 22, 28, - 42, 143, 147, 140, 207, 189, 158, 63, 146, 21, 98, 58, 85, 165, 115, 30, - 175, 22, 115, 60, 201, 171, 114, 207, 226, 207, 120, 92, 36, 54, 125, 52, - 15, 96, 195, 114, 153, 103, 180, 147, 152, 80, 33, 54, 215, 57, 183, 70, - 112, 4, 229, 90, 137, 108, 25, 140, 70, 12, 53, 109, 161, 140, 199, 196, - 16, 177, 240, 2, 14, 110, 35, 229, 224, 138, 178, 75, 62, 208, 68, 148, - 104, 65, 198, 116, 16, 15, 186, 72, 57, 227, 30, 160, 196, 116, 24, 46, - 73, 32, 138, 191, 64, 232, 96, 17, 137, 92, 120, 248, 69, 129, 47, 202, - 83, 71, 97, 248, 17, 27, 131, 140, 51, 22, 224, 224, 215, 216, 179, 57, - 239, 148, 55, 138, 66, 38, 181, 98, 168, 59, 253, 112, 6, 85, 76, 195, - 201, 0, 77, 21, 248, 189, 151, 140, 239, 24, 183, 93, 226, 7, 108, 15, - 26, 240, 62, 194, 17, 7, 47, 155, 209, 205, 62, 240, 3, 212, 228, 69, - 48, 3, 122, 57, 91, 76, 202, 181, 184, 76, 76, 35, 255, 124, 129, 81, - 179, 238, 30, 239, 160, 44, 156, 172, 93, 192, 3, 31, 113, 179, 204, 195, - 238, 236, 178, 135, 98, 103, 162, 208, 75, 123, 88, 126, 96, 193, 62, 67, - 192, 242, 193, 16, 54, 156, 59, 88, 1, 190, 96, 180, 129, 225, 101, 141, - 47, 23, 1, 5, 102, 158, 244, 250, 29, 203, 101, 221, 17, 46, 207, 110, - 4, 203, 179, 99, 53, 89, 55, 164, 149, 216, 157, 3, 135, 218, 177, 90, - 204, 116, 57, 69, 203, 3, 249, 128, 108, 200, 223, 116, 36, 129, 100, 47, - 110, 13, 162, 40, 63, 45, 27, 76, 241, 175, 191, 73, 255, 160, 173, 24, - 199, 106, 144, 99, 117, 190, 223, 149, 95, 115, 87, 26, 162, 31, 125, 147, - 123, 52, 221, 207, 45, 59, 54, 39, 10, 72, 250, 139, 41, 26, 200, 126, - 159, 222, 180, 79, 97, 152, 246, 91, 244, 155, 216, 162, 220, 43, 247, 55, - 189, 59, 161, 139, 25, 207, 47, 26, 45, 205, 215, 223, 164, 79, 77, 59, - 175, 221, 111, 207, 156, 237, 153, 248, 213, 161, 145, 218, 239, 208, 175, 186, - 67, 51, 142, 51, 191, 201, 77, 170, 247, 114, 219, 62, 205, 113, 65, 153, - 249, 92, 114, 69, 185, 223, 163, 55, 238, 81, 24, 167, 253, 14, 253, 54, - 118, 40, 247, 170, 247, 109, 239, 79, 232, 227, 182, 221, 153, 227, 73, 45, - 243, 169, 228, 81, 109, 191, 59, 111, 220, 157, 48, 78, 251, 221, 249, 109, - 236, 78, 238, 189, 233, 219, 222, 157, 208, 199, 172, 87, 153, 93, 132, 183, - 138, 159, 153, 253, 174, 204, 217, 149, 175, 96, 49, 11, 229, 212, 253, 110, - 252, 82, 187, 177, 85, 119, 218, 245, 70, 107, 215, 221, 168, 58, 98, 248, - 38, 183, 98, 220, 65, 147, 225, 255, 78, 59, 145, 187, 2, 216, 239, 194, - 253, 46, 252, 118, 119, 161, 48, 36, 254, 54, 119, 32, 118, 78, 55, 206, - 253, 20, 49, 143, 106, 174, 187, 223, 132, 57, 155, 80, 216, 60, 239, 229, - 59, 95, 159, 63, 213, 44, 219, 190, 201, 13, 153, 244, 208, 108, 152, 199, - 9, 98, 193, 234, 120, 179, 75, 156, 189, 203, 25, 170, 61, 54, 164, 30, - 134, 245, 183, 2, 95, 39, 29, 82, 157, 186, 182, 30, 84, 156, 205, 166, - 80, 25, 193, 183, 102, 234, 195, 239, 119, 108, 139, 23, 176, 185, 98, 101, - 252, 95, 161, 116, 125, 71, 36, 221, 217, 148, 81, 117, 98, 228, 245, 97, - 125, 93, 223, 233, 222, 217, 216, 77, 151, 93, 212, 96, 144, 74, 171, 78, - 167, 81, 100, 223, 125, 199, 138, 193, 131, 78, 247, 142, 119, 71, 188, 220, - 135, 151, 223, 238, 216, 65, 165, 123, 231, 225, 157, 42, 38, 216, 65, 25, - 86, 210, 124, 228, 119, 174, 231, 92, 173, 99, 30, 214, 152, 69, 32, 219, - 133, 255, 44, 101, 28, 225, 213, 33, 229, 13, 82, 177, 143, 191, 243, 186, - 228, 84, 172, 7, 229, 3, 232, 107, 221, 250, 219, 134, 107, 128, 204, 67, - 252, 144, 226, 171, 89, 112, 25, 76, 188, 17, 223, 8, 197, 252, 42, 113, - 106, 111, 89, 234, 44, 109, 216, 197, 12, 53, 252, 29, 200, 209, 16, 207, - 109, 187, 77, 170, 32, 85, 82, 223, 247, 166, 83, 232, 73, 119, 142, 123, - 5, 86, 74, 48, 41, 89, 56, 251, 182, 117, 171, 188, 97, 21, 169, 225, - 175, 235, 189, 239, 194, 192, 196, 154, 240, 123, 236, 185, 103, 97, 190, 5, - 181, 205, 86, 221, 61, 169, 55, 142, 118, 69, 168, 137, 174, 229, 55, 137, - 77, 69, 247, 228, 0, 119, 225, 127, 176, 36, 159, 226, 6, 39, 103, 130, - 2, 254, 100, 22, 70, 115, 177, 77, 7, 244, 108, 39, 143, 138, 49, 138, - 105, 173, 227, 164, 96, 4, 2, 90, 24, 157, 247, 197, 153, 63, 120, 95, - 124, 240, 15, 192, 23, 179, 234, 200, 191, 152, 67, 66, 56, 131, 165, 131, - 131, 205, 80, 27, 24, 50, 171, 202, 192, 111, 27, 241, 206, 118, 51, 154, - 237, 239, 182, 37, 222, 188, 88, 212, 126, 225, 50, 159, 204, 189, 184, 111, - 220, 101, 234, 77, 157, 115, 226, 246, 143, 179, 157, 115, 190, 88, 231, 80, - 157, 22, 122, 246, 60, 92, 238, 220, 51, 119, 91, 207, 182, 37, 126, 90, - 207, 250, 107, 111, 18, 247, 108, 167, 249, 108, 110, 155, 207, 230, 167, 116, - 44, 161, 2, 128, 50, 9, 231, 69, 18, 105, 3, 82, 119, 148, 162, 111, - 171, 167, 168, 135, 187, 213, 184, 224, 221, 14, 121, 30, 78, 46, 71, 190, - 146, 163, 97, 55, 15, 149, 228, 127, 133, 225, 56, 49, 196, 176, 27, 53, - 199, 110, 39, 169, 47, 130, 217, 12, 112, 99, 198, 102, 225, 109, 245, 225, - 42, 64, 251, 132, 119, 242, 225, 45, 62, 249, 42, 241, 120, 132, 118, 117, - 222, 108, 205, 212, 112, 23, 63, 207, 188, 9, 12, 239, 204, 39, 115, 150, - 151, 62, 60, 69, 248, 244, 218, 135, 93, 61, 32, 187, 32, 222, 166, 82, - 209, 147, 153, 183, 68, 60, 253, 34, 28, 36, 22, 14, 215, 197, 55, 156, - 125, 33, 51, 33, 122, 98, 165, 211, 161, 55, 155, 250, 220, 6, 230, 145, - 63, 12, 38, 3, 122, 24, 133, 75, 5, 33, 255, 130, 202, 178, 64, 15, - 71, 193, 4, 166, 251, 213, 100, 132, 61, 236, 133, 225, 168, 244, 233, 102, - 1, 159, 205, 236, 186, 117, 199, 169, 55, 14, 13, 184, 121, 32, 16, 88, - 204, 6, 222, 18, 166, 129, 135, 157, 14, 160, 95, 152, 227, 219, 54, 255, - 7, 254, 187, 179, 186, 147, 134, 172, 239, 48, 239, 172, 234, 218, 104, 193, - 216, 71, 100, 44, 235, 57, 41, 172, 26, 157, 235, 25, 206, 78, 201, 114, - 14, 150, 117, 92, 46, 27, 182, 78, 128, 238, 193, 80, 0, 87, 78, 12, - 108, 38, 57, 19, 96, 75, 230, 44, 172, 220, 24, 216, 78, 114, 38, 192, - 195, 164, 206, 102, 12, 60, 74, 114, 38, 192, 227, 184, 78, 245, 139, 224, - 67, 154, 238, 209, 225, 17, 155, 134, 163, 245, 101, 56, 169, 177, 150, 109, - 173, 26, 182, 181, 134, 191, 21, 176, 188, 107, 248, 91, 1, 123, 184, 134, - 191, 85, 19, 126, 155, 80, 170, 122, 216, 110, 55, 219, 133, 104, 88, 99, - 13, 228, 110, 239, 0, 123, 27, 116, 58, 28, 108, 175, 26, 205, 14, 212, - 81, 41, 173, 171, 80, 77, 185, 94, 130, 66, 244, 116, 80, 130, 42, 170, - 144, 84, 190, 183, 114, 92, 200, 227, 240, 60, 14, 229, 113, 233, 9, 243, - 192, 211, 202, 41, 223, 43, 173, 170, 80, 21, 164, 65, 102, 122, 58, 40, - 45, 171, 78, 25, 184, 227, 59, 196, 20, 99, 243, 78, 182, 249, 117, 195, - 233, 64, 107, 21, 40, 142, 77, 65, 213, 43, 135, 158, 160, 234, 181, 67, - 29, 185, 183, 110, 66, 243, 235, 38, 207, 211, 164, 60, 46, 61, 29, 136, - 142, 52, 161, 249, 117, 21, 170, 130, 52, 200, 76, 79, 7, 165, 161, 218, - 252, 138, 20, 250, 59, 215, 203, 3, 203, 105, 212, 73, 79, 123, 45, 64, - 67, 0, 57, 28, 228, 141, 166, 67, 175, 115, 93, 181, 28, 247, 96, 26, - 212, 157, 99, 128, 245, 1, 208, 15, 163, 146, 69, 137, 229, 186, 229, 52, - 55, 44, 2, 96, 132, 220, 178, 10, 92, 194, 76, 47, 235, 238, 134, 13, - 225, 97, 8, 15, 5, 229, 115, 105, 226, 236, 192, 126, 219, 9, 74, 43, - 123, 141, 71, 145, 114, 213, 90, 186, 247, 222, 197, 0, 7, 0, 67, 247, - 30, 20, 232, 195, 233, 195, 134, 68, 248, 74, 234, 100, 229, 237, 129, 213, - 247, 170, 239, 14, 172, 200, 179, 33, 15, 124, 115, 12, 143, 188, 202, 59, - 76, 45, 151, 239, 136, 205, 209, 130, 210, 208, 197, 244, 124, 243, 30, 172, - 228, 144, 176, 204, 140, 240, 12, 235, 120, 204, 252, 81, 92, 159, 179, 165, - 62, 152, 230, 234, 239, 169, 211, 253, 156, 62, 14, 147, 70, 185, 26, 253, - 231, 117, 79, 173, 78, 170, 243, 59, 135, 104, 128, 188, 4, 108, 90, 171, - 145, 250, 62, 199, 59, 141, 141, 109, 57, 237, 184, 225, 66, 69, 201, 225, - 200, 164, 90, 130, 167, 96, 97, 204, 174, 36, 18, 130, 186, 129, 255, 159, - 12, 228, 59, 45, 159, 88, 231, 95, 197, 109, 90, 173, 14, 245, 30, 178, - 141, 175, 240, 43, 41, 115, 134, 145, 227, 86, 12, 112, 4, 116, 142, 54, - 9, 155, 199, 172, 3, 206, 149, 10, 156, 129, 40, 195, 185, 109, 91, 46, - 252, 53, 225, 175, 5, 127, 109, 248, 59, 132, 191, 35, 248, 59, 190, 13, - 244, 175, 41, 78, 203, 226, 252, 183, 123, 81, 32, 158, 171, 167, 226, 127, - 73, 29, 48, 80, 163, 96, 10, 125, 144, 197, 155, 118, 147, 190, 11, 210, - 226, 118, 242, 242, 108, 175, 80, 244, 67, 175, 16, 255, 213, 170, 76, 229, - 218, 94, 165, 248, 164, 56, 179, 169, 194, 116, 158, 173, 21, 138, 177, 73, - 42, 20, 213, 233, 85, 166, 115, 153, 170, 228, 148, 153, 248, 124, 118, 246, - 104, 180, 144, 66, 76, 58, 218, 119, 129, 219, 228, 241, 212, 147, 87, 149, - 185, 79, 140, 12, 249, 57, 89, 181, 218, 108, 102, 184, 54, 105, 123, 184, - 75, 222, 124, 14, 239, 241, 44, 156, 106, 124, 151, 110, 224, 10, 61, 76, - 206, 255, 148, 154, 36, 190, 65, 74, 72, 198, 175, 90, 121, 133, 169, 155, - 78, 129, 109, 225, 102, 235, 143, 184, 89, 142, 129, 137, 145, 41, 60, 95, - 135, 51, 192, 37, 199, 61, 182, 197, 95, 214, 76, 149, 31, 195, 51, 252, - 30, 154, 237, 206, 251, 104, 74, 253, 195, 191, 23, 100, 206, 186, 147, 201, - 136, 224, 178, 82, 194, 14, 27, 13, 51, 179, 153, 244, 94, 42, 235, 68, - 231, 137, 61, 56, 201, 39, 236, 56, 50, 188, 218, 208, 189, 187, 57, 139, - 200, 192, 141, 194, 181, 81, 198, 5, 218, 206, 100, 140, 13, 140, 115, 39, - 243, 109, 245, 49, 48, 180, 62, 133, 186, 136, 51, 213, 218, 250, 156, 189, - 219, 37, 83, 154, 91, 175, 2, 29, 182, 225, 239, 207, 231, 76, 91, 117, - 231, 164, 222, 112, 12, 156, 105, 178, 197, 84, 238, 84, 216, 95, 113, 113, - 65, 33, 90, 117, 0, 157, 223, 62, 144, 34, 3, 160, 119, 107, 128, 184, - 10, 164, 80, 153, 177, 235, 101, 197, 138, 86, 27, 251, 122, 8, 191, 235, - 13, 29, 129, 128, 221, 107, 178, 222, 25, 80, 8, 192, 91, 100, 156, 118, - 152, 50, 61, 195, 164, 235, 163, 234, 201, 38, 54, 63, 115, 26, 68, 56, - 38, 152, 36, 81, 106, 156, 224, 234, 9, 98, 1, 35, 196, 109, 31, 18, - 103, 124, 85, 248, 13, 95, 175, 173, 38, 112, 46, 183, 237, 248, 23, 58, - 83, 205, 62, 23, 248, 55, 98, 63, 168, 123, 64, 245, 58, 215, 78, 197, - 169, 91, 109, 36, 235, 88, 19, 126, 5, 209, 90, 167, 90, 242, 122, 81, - 105, 85, 95, 86, 97, 174, 203, 31, 172, 89, 5, 223, 215, 245, 161, 124, - 47, 127, 40, 65, 201, 25, 112, 48, 87, 29, 146, 66, 6, 37, 96, 164, - 128, 67, 178, 3, 228, 34, 109, 96, 166, 232, 17, 96, 156, 171, 131, 85, - 129, 48, 24, 192, 126, 141, 89, 87, 208, 219, 171, 10, 212, 85, 79, 134, - 26, 152, 99, 254, 173, 130, 114, 70, 56, 23, 234, 100, 20, 102, 244, 185, - 56, 248, 98, 236, 113, 232, 91, 28, 219, 226, 146, 172, 181, 11, 129, 252, - 14, 201, 129, 55, 217, 69, 159, 15, 61, 112, 185, 78, 107, 195, 56, 53, - 7, 194, 35, 104, 57, 206, 189, 87, 19, 67, 242, 45, 142, 3, 55, 69, - 165, 111, 112, 73, 46, 204, 199, 225, 172, 113, 110, 227, 159, 28, 1, 203, - 57, 1, 42, 220, 40, 84, 250, 67, 111, 50, 1, 6, 34, 254, 146, 30, - 52, 228, 0, 177, 106, 176, 62, 86, 45, 108, 152, 105, 101, 56, 199, 229, - 205, 237, 184, 197, 2, 177, 168, 53, 38, 206, 52, 200, 121, 183, 111, 151, - 97, 172, 249, 59, 178, 221, 135, 248, 78, 3, 206, 234, 53, 86, 197, 110, - 86, 144, 67, 59, 56, 195, 93, 127, 206, 121, 37, 193, 36, 197, 118, 139, - 58, 21, 124, 188, 232, 249, 68, 5, 105, 67, 162, 115, 28, 91, 121, 86, - 233, 223, 19, 127, 58, 31, 38, 84, 12, 133, 0, 6, 244, 165, 226, 29, - 215, 118, 179, 168, 43, 55, 3, 154, 254, 3, 150, 135, 243, 249, 171, 89, - 128, 50, 169, 12, 25, 65, 242, 18, 31, 238, 171, 111, 147, 199, 119, 10, - 244, 157, 66, 85, 200, 83, 192, 23, 174, 147, 196, 100, 95, 184, 78, 18, - 35, 125, 225, 58, 191, 20, 142, 183, 145, 158, 248, 163, 16, 48, 252, 216, - 187, 89, 20, 225, 154, 16, 190, 182, 226, 158, 46, 126, 251, 109, 173, 49, - 94, 23, 8, 177, 83, 239, 42, 19, 178, 141, 245, 106, 239, 206, 121, 101, - 178, 82, 87, 116, 234, 141, 187, 169, 165, 18, 250, 27, 41, 124, 46, 207, - 161, 243, 29, 127, 22, 205, 109, 224, 20, 56, 110, 46, 205, 165, 193, 205, - 18, 221, 12, 181, 197, 131, 120, 154, 222, 210, 153, 92, 169, 5, 232, 174, - 13, 52, 151, 92, 61, 29, 111, 242, 80, 12, 95, 157, 218, 140, 143, 9, - 100, 167, 1, 55, 203, 212, 133, 148, 158, 225, 53, 0, 93, 31, 21, 141, - 171, 68, 247, 12, 147, 187, 66, 182, 103, 187, 113, 198, 122, 15, 248, 61, - 28, 240, 2, 151, 147, 49, 108, 219, 29, 123, 212, 222, 173, 71, 217, 108, - 59, 244, 136, 15, 207, 32, 16, 110, 64, 162, 33, 240, 138, 31, 129, 93, - 76, 119, 141, 176, 173, 130, 138, 219, 234, 146, 230, 120, 51, 47, 245, 31, - 211, 220, 36, 225, 68, 50, 47, 57, 159, 203, 151, 238, 87, 94, 9, 163, - 123, 205, 37, 78, 237, 40, 197, 225, 254, 89, 123, 233, 184, 222, 56, 174, - 187, 38, 53, 2, 117, 213, 26, 54, 19, 114, 122, 21, 23, 40, 180, 224, - 250, 240, 25, 57, 64, 193, 155, 22, 11, 228, 105, 31, 14, 91, 177, 120, - 187, 121, 79, 192, 194, 139, 139, 21, 188, 151, 150, 172, 202, 150, 127, 3, - 46, 229, 0, 142, 223, 74, 34, 102, 46, 13, 33, 113, 200, 19, 91, 113, - 226, 69, 119, 196, 39, 213, 253, 96, 181, 19, 224, 76, 76, 38, 64, 15, - 19, 232, 98, 202, 65, 71, 9, 168, 39, 39, 15, 192, 199, 247, 10, 216, - 139, 21, 180, 131, 29, 186, 87, 192, 102, 215, 252, 109, 13, 105, 247, 27, - 223, 151, 86, 7, 157, 42, 111, 179, 124, 183, 176, 122, 208, 193, 222, 2, - 20, 50, 226, 19, 228, 197, 63, 209, 254, 65, 105, 37, 191, 167, 12, 149, - 97, 241, 53, 21, 95, 76, 161, 240, 250, 65, 103, 72, 133, 177, 149, 161, - 90, 152, 247, 233, 160, 180, 150, 31, 12, 165, 159, 149, 224, 193, 94, 217, - 235, 114, 177, 240, 177, 150, 56, 100, 72, 207, 139, 34, 216, 73, 207, 207, - 50, 178, 135, 192, 209, 158, 1, 82, 59, 223, 164, 177, 16, 138, 124, 150, - 3, 123, 56, 144, 25, 10, 179, 153, 59, 96, 150, 172, 175, 187, 12, 6, - 243, 161, 157, 188, 15, 125, 26, 226, 229, 212, 30, 78, 227, 50, 178, 9, - 11, 30, 172, 97, 116, 126, 0, 79, 83, 120, 154, 158, 215, 225, 105, 0, - 79, 3, 200, 69, 183, 70, 144, 13, 134, 181, 83, 138, 115, 84, 227, 82, - 101, 40, 214, 180, 173, 214, 249, 237, 123, 103, 144, 199, 134, 191, 74, 156, - 8, 44, 222, 166, 160, 59, 171, 208, 5, 248, 214, 9, 155, 249, 253, 185, - 135, 7, 66, 96, 59, 121, 99, 36, 15, 19, 28, 34, 94, 178, 23, 226, - 44, 113, 14, 190, 227, 86, 79, 27, 252, 63, 226, 70, 115, 115, 137, 76, - 154, 232, 198, 76, 8, 94, 123, 193, 100, 14, 184, 72, 35, 5, 83, 1, - 180, 179, 32, 19, 57, 200, 16, 245, 44, 222, 206, 158, 181, 107, 45, 29, - 127, 24, 136, 250, 97, 138, 159, 77, 81, 117, 183, 77, 158, 159, 28, 119, - 39, 177, 205, 47, 232, 203, 124, 62, 79, 9, 45, 220, 148, 208, 34, 206, - 149, 233, 112, 75, 58, 51, 219, 169, 181, 39, 62, 198, 25, 139, 178, 213, - 16, 1, 105, 59, 110, 54, 235, 19, 244, 170, 61, 95, 111, 25, 68, 153, - 83, 251, 2, 39, 37, 99, 138, 51, 101, 199, 147, 75, 37, 118, 27, 174, - 83, 244, 231, 61, 98, 47, 23, 227, 30, 157, 15, 232, 42, 211, 109, 182, - 218, 135, 98, 20, 180, 129, 224, 139, 201, 139, 96, 237, 190, 132, 205, 77, - 10, 39, 80, 168, 75, 146, 171, 11, 111, 20, 249, 95, 227, 10, 174, 113, - 100, 190, 130, 211, 87, 180, 244, 148, 211, 82, 48, 146, 186, 101, 91, 76, - 207, 95, 19, 226, 92, 46, 48, 190, 110, 85, 15, 55, 92, 86, 124, 125, - 92, 117, 154, 128, 152, 98, 201, 56, 157, 155, 217, 172, 198, 106, 53, 27, - 254, 159, 58, 137, 179, 113, 156, 81, 136, 191, 73, 166, 157, 234, 220, 246, - 182, 208, 85, 105, 222, 14, 133, 239, 250, 164, 186, 82, 104, 1, 54, 193, - 108, 146, 194, 10, 4, 179, 51, 16, 19, 78, 248, 153, 212, 175, 196, 186, - 105, 160, 8, 88, 89, 46, 162, 118, 253, 6, 89, 113, 220, 125, 234, 143, - 46, 184, 62, 149, 194, 29, 221, 120, 179, 78, 113, 208, 102, 240, 177, 186, - 42, 22, 95, 132, 95, 129, 83, 105, 193, 169, 203, 236, 86, 77, 27, 61, - 113, 199, 97, 185, 255, 249, 143, 117, 139, 196, 93, 114, 29, 54, 153, 158, - 17, 189, 172, 181, 148, 165, 146, 147, 239, 236, 67, 227, 28, 243, 162, 236, - 67, 228, 103, 250, 66, 209, 102, 13, 215, 73, 186, 75, 214, 181, 83, 109, - 110, 108, 71, 95, 20, 111, 252, 203, 197, 200, 211, 78, 13, 201, 98, 216, - 118, 62, 32, 145, 57, 14, 247, 216, 135, 234, 73, 23, 67, 99, 124, 223, - 86, 79, 231, 222, 76, 122, 122, 196, 185, 53, 136, 98, 127, 152, 12, 148, - 12, 6, 223, 146, 239, 110, 174, 229, 221, 205, 181, 236, 204, 207, 111, 249, - 158, 127, 34, 51, 162, 53, 147, 110, 229, 39, 206, 158, 108, 203, 162, 83, - 187, 152, 144, 231, 74, 225, 249, 150, 200, 234, 7, 110, 23, 194, 127, 147, - 7, 98, 88, 146, 66, 22, 155, 248, 1, 43, 252, 38, 16, 111, 83, 92, - 215, 181, 110, 115, 252, 134, 96, 188, 164, 68, 23, 132, 40, 193, 108, 111, - 248, 185, 185, 157, 145, 82, 31, 170, 162, 82, 89, 54, 62, 46, 31, 85, - 157, 198, 70, 189, 141, 212, 215, 62, 30, 11, 52, 116, 72, 34, 63, 59, - 245, 174, 177, 69, 168, 181, 146, 102, 104, 106, 142, 46, 202, 72, 179, 78, - 89, 69, 36, 35, 33, 167, 137, 78, 93, 105, 232, 218, 64, 78, 222, 74, - 202, 157, 124, 186, 186, 226, 159, 187, 253, 122, 43, 213, 24, 239, 76, 42, - 207, 195, 49, 242, 192, 11, 37, 95, 51, 197, 168, 124, 35, 107, 141, 207, - 91, 76, 44, 249, 27, 226, 191, 99, 242, 145, 7, 236, 186, 114, 47, 2, - 88, 149, 100, 216, 39, 39, 176, 224, 42, 214, 9, 58, 185, 132, 163, 128, - 131, 194, 101, 231, 118, 162, 87, 44, 22, 13, 159, 58, 109, 213, 112, 175, - 136, 118, 26, 160, 174, 155, 47, 130, 61, 12, 87, 141, 53, 247, 43, 29, - 217, 15, 235, 110, 142, 21, 142, 58, 4, 59, 200, 191, 76, 183, 77, 250, - 233, 170, 65, 115, 214, 140, 111, 110, 154, 155, 63, 252, 154, 130, 221, 239, - 224, 61, 5, 241, 98, 52, 237, 18, 165, 56, 133, 96, 66, 188, 87, 119, - 16, 92, 92, 44, 34, 96, 93, 80, 241, 246, 204, 57, 143, 251, 219, 38, - 159, 136, 137, 251, 194, 62, 83, 47, 197, 95, 141, 6, 236, 245, 48, 156, - 243, 232, 47, 124, 21, 97, 80, 229, 41, 194, 108, 237, 77, 93, 63, 201, - 73, 71, 58, 101, 78, 144, 75, 134, 136, 196, 153, 95, 0, 223, 244, 198, - 27, 4, 139, 100, 197, 24, 100, 98, 113, 110, 111, 149, 206, 125, 156, 17, - 229, 126, 253, 29, 30, 143, 15, 44, 174, 43, 217, 119, 206, 220, 176, 56, - 77, 244, 55, 142, 12, 71, 227, 28, 187, 116, 85, 95, 212, 81, 230, 91, - 92, 165, 189, 92, 76, 173, 34, 75, 46, 188, 81, 242, 184, 153, 60, 153, - 171, 111, 188, 130, 209, 15, 105, 153, 171, 239, 108, 22, 3, 141, 104, 166, - 36, 226, 139, 217, 21, 122, 126, 205, 37, 18, 250, 13, 181, 107, 186, 162, - 206, 95, 88, 237, 79, 90, 87, 71, 159, 180, 174, 78, 190, 218, 186, 2, - 188, 213, 48, 159, 32, 167, 241, 90, 81, 151, 213, 49, 114, 16, 44, 78, - 67, 118, 221, 101, 3, 224, 125, 187, 17, 159, 64, 93, 197, 136, 241, 123, - 75, 102, 29, 17, 226, 226, 95, 247, 243, 2, 175, 38, 249, 26, 156, 211, - 179, 157, 60, 154, 174, 254, 164, 225, 136, 126, 137, 226, 245, 231, 97, 114, - 173, 135, 19, 105, 159, 156, 40, 171, 129, 95, 251, 113, 2, 162, 184, 213, - 86, 24, 71, 33, 188, 82, 168, 199, 13, 26, 13, 39, 13, 251, 228, 171, - 104, 218, 186, 168, 108, 107, 152, 164, 185, 24, 202, 130, 120, 160, 249, 184, - 109, 95, 159, 89, 215, 77, 187, 181, 57, 191, 141, 142, 169, 219, 112, 12, - 22, 125, 142, 23, 33, 13, 190, 156, 87, 91, 125, 73, 54, 92, 122, 7, - 28, 101, 118, 192, 78, 11, 127, 167, 245, 126, 227, 73, 224, 79, 28, 235, - 150, 217, 132, 47, 222, 5, 42, 17, 23, 38, 38, 156, 150, 75, 134, 94, - 147, 141, 22, 58, 200, 109, 203, 194, 53, 137, 154, 209, 167, 111, 229, 162, - 79, 190, 129, 143, 80, 215, 144, 109, 187, 53, 143, 77, 69, 252, 127, 47, - 252, 73, 63, 208, 236, 69, 30, 121, 147, 1, 186, 1, 231, 147, 218, 19, - 111, 182, 250, 18, 139, 47, 148, 33, 127, 14, 187, 85, 86, 184, 102, 185, - 236, 240, 79, 192, 135, 25, 242, 237, 118, 172, 124, 204, 213, 16, 74, 81, - 89, 185, 85, 126, 72, 238, 253, 223, 252, 248, 232, 33, 59, 131, 231, 115, - 254, 162, 63, 191, 241, 7, 241, 51, 5, 251, 136, 223, 48, 10, 202, 185, - 82, 30, 134, 235, 156, 2, 127, 76, 124, 111, 198, 212, 138, 84, 144, 168, - 79, 5, 197, 213, 170, 64, 89, 251, 187, 199, 189, 199, 51, 118, 246, 124, - 1, 124, 18, 170, 239, 40, 48, 204, 82, 133, 250, 120, 96, 88, 158, 28, - 165, 210, 213, 52, 37, 41, 85, 74, 73, 225, 1, 77, 82, 105, 207, 189, - 30, 116, 65, 70, 147, 136, 33, 94, 175, 154, 110, 154, 195, 171, 166, 242, - 189, 12, 180, 63, 100, 103, 253, 97, 182, 14, 130, 27, 115, 15, 211, 208, - 159, 78, 127, 97, 103, 63, 45, 146, 231, 36, 172, 68, 12, 250, 197, 27, - 201, 12, 207, 216, 217, 51, 192, 198, 36, 252, 229, 144, 231, 169, 15, 123, - 252, 226, 221, 223, 217, 217, 227, 181, 55, 73, 222, 94, 112, 27, 161, 4, - 240, 142, 60, 140, 39, 239, 127, 247, 169, 182, 119, 207, 254, 135, 102, 202, - 139, 95, 168, 183, 30, 84, 172, 144, 95, 236, 13, 123, 216, 215, 53, 28, - 92, 91, 170, 9, 62, 94, 144, 85, 135, 12, 121, 177, 15, 92, 241, 245, - 3, 87, 252, 129, 76, 115, 47, 70, 153, 25, 45, 64, 253, 98, 139, 44, - 149, 189, 62, 43, 198, 37, 132, 162, 115, 145, 78, 197, 45, 142, 169, 53, - 7, 237, 5, 3, 222, 205, 245, 122, 159, 84, 155, 141, 49, 249, 52, 92, - 204, 2, 96, 97, 30, 78, 188, 209, 58, 10, 4, 126, 31, 4, 80, 139, - 183, 238, 94, 92, 204, 237, 212, 251, 215, 144, 0, 231, 143, 177, 210, 177, - 88, 216, 197, 20, 96, 234, 43, 201, 188, 234, 2, 246, 159, 16, 37, 112, - 176, 173, 60, 155, 100, 240, 128, 35, 38, 92, 6, 83, 135, 115, 164, 23, - 41, 86, 86, 142, 93, 124, 53, 17, 150, 193, 172, 148, 44, 121, 180, 176, - 82, 18, 228, 162, 71, 240, 207, 203, 80, 90, 18, 39, 70, 87, 79, 130, - 168, 143, 251, 49, 177, 255, 234, 199, 102, 87, 59, 15, 184, 217, 6, 153, - 235, 66, 207, 21, 75, 228, 16, 149, 158, 225, 44, 119, 41, 194, 107, 14, - 2, 188, 0, 101, 79, 159, 254, 108, 147, 1, 45, 165, 123, 151, 120, 3, - 160, 228, 130, 113, 193, 125, 201, 230, 114, 12, 107, 6, 107, 222, 36, 206, - 75, 169, 248, 120, 132, 38, 184, 67, 216, 212, 100, 163, 237, 1, 127, 50, - 240, 67, 54, 95, 64, 207, 3, 66, 0, 24, 231, 229, 110, 189, 190, 92, - 46, 107, 235, 112, 49, 95, 244, 252, 90, 63, 28, 215, 151, 222, 188, 63, - 252, 254, 170, 211, 116, 154, 71, 131, 39, 222, 225, 235, 214, 86, 15, 252, - 127, 156, 130, 196, 97, 221, 49, 222, 123, 137, 213, 36, 34, 211, 97, 96, - 186, 6, 23, 114, 185, 48, 74, 227, 16, 29, 109, 137, 173, 141, 118, 25, - 222, 101, 208, 239, 20, 127, 124, 241, 236, 49, 140, 112, 177, 16, 116, 26, - 52, 30, 215, 86, 112, 223, 186, 181, 97, 147, 160, 3, 143, 21, 84, 207, - 29, 227, 147, 61, 129, 186, 162, 110, 0, 171, 183, 131, 74, 150, 220, 204, - 253, 204, 10, 132, 146, 229, 168, 198, 160, 74, 123, 220, 176, 95, 52, 236, - 177, 99, 191, 112, 58, 214, 245, 226, 61, 187, 158, 111, 184, 213, 241, 217, - 29, 11, 50, 80, 116, 64, 139, 26, 199, 248, 128, 162, 66, 178, 60, 22, - 209, 0, 9, 153, 200, 208, 125, 183, 44, 145, 101, 195, 42, 179, 112, 249, - 165, 218, 115, 13, 237, 73, 173, 228, 164, 201, 194, 150, 38, 63, 161, 177, - 102, 222, 199, 201, 134, 200, 226, 38, 30, 91, 249, 161, 147, 116, 179, 159, - 248, 141, 166, 102, 69, 240, 195, 212, 103, 142, 240, 19, 11, 240, 72, 103, - 91, 86, 169, 161, 66, 235, 40, 188, 132, 95, 117, 120, 175, 207, 130, 241, - 223, 26, 118, 240, 2, 255, 25, 255, 205, 193, 39, 231, 28, 181, 180, 229, - 61, 103, 18, 228, 195, 33, 131, 46, 116, 92, 65, 221, 178, 45, 168, 200, - 130, 154, 44, 168, 202, 122, 225, 220, 217, 0, 77, 100, 235, 26, 236, 190, - 85, 108, 96, 69, 151, 99, 55, 20, 241, 216, 154, 95, 142, 101, 242, 137, - 244, 179, 106, 147, 250, 178, 214, 114, 168, 53, 200, 222, 174, 113, 36, 38, - 99, 102, 77, 198, 220, 183, 5, 217, 70, 233, 243, 2, 29, 82, 23, 58, - 26, 84, 5, 246, 178, 138, 122, 122, 4, 88, 217, 174, 236, 126, 92, 6, - 18, 227, 101, 195, 11, 12, 147, 2, 107, 42, 128, 151, 123, 60, 139, 77, - 211, 156, 100, 195, 62, 225, 116, 216, 124, 239, 157, 243, 80, 40, 226, 19, - 185, 62, 188, 248, 26, 230, 175, 166, 152, 86, 37, 223, 33, 44, 136, 167, - 175, 47, 53, 230, 241, 155, 112, 178, 43, 29, 138, 76, 89, 100, 255, 249, - 15, 43, 202, 126, 62, 112, 191, 119, 238, 186, 194, 111, 71, 150, 206, 136, - 91, 115, 19, 226, 24, 100, 233, 215, 63, 1, 63, 1, 243, 56, 251, 200, - 233, 215, 82, 190, 38, 148, 172, 59, 129, 118, 186, 201, 245, 177, 191, 66, - 198, 105, 14, 63, 215, 197, 82, 191, 44, 66, 108, 37, 8, 91, 17, 170, - 181, 155, 182, 211, 212, 205, 94, 118, 138, 118, 146, 9, 230, 204, 184, 239, - 139, 16, 118, 211, 71, 159, 104, 71, 220, 81, 160, 1, 81, 128, 110, 46, - 188, 11, 128, 32, 11, 10, 103, 200, 69, 196, 115, 221, 73, 51, 35, 119, - 4, 197, 170, 177, 140, 194, 237, 183, 192, 124, 100, 134, 31, 38, 51, 11, - 43, 90, 78, 17, 5, 88, 186, 76, 90, 28, 182, 159, 139, 128, 214, 241, - 57, 251, 33, 234, 91, 10, 254, 128, 79, 50, 105, 96, 118, 121, 228, 107, - 59, 13, 200, 120, 79, 121, 40, 245, 53, 83, 231, 134, 6, 28, 102, 131, - 203, 96, 64, 231, 143, 73, 149, 63, 223, 112, 57, 118, 148, 210, 44, 2, - 6, 198, 143, 180, 42, 97, 112, 49, 254, 36, 124, 96, 17, 35, 65, 54, - 225, 175, 5, 127, 109, 248, 59, 132, 191, 35, 248, 59, 86, 117, 214, 145, - 133, 152, 203, 175, 251, 122, 86, 229, 249, 83, 170, 142, 45, 103, 40, 73, - 88, 132, 129, 99, 209, 227, 16, 122, 220, 24, 123, 48, 243, 195, 216, 22, - 71, 179, 9, 185, 64, 81, 11, 34, 100, 116, 203, 65, 12, 211, 92, 86, - 70, 22, 230, 234, 22, 231, 218, 50, 176, 239, 47, 131, 8, 214, 12, 110, - 92, 116, 231, 51, 16, 65, 117, 81, 195, 4, 175, 4, 173, 166, 84, 82, - 16, 249, 180, 76, 215, 77, 84, 190, 20, 250, 43, 166, 133, 193, 181, 18, - 180, 207, 34, 249, 157, 221, 224, 178, 160, 174, 63, 184, 132, 73, 133, 150, - 10, 217, 62, 199, 7, 151, 107, 196, 15, 214, 173, 186, 91, 38, 139, 213, - 107, 247, 192, 122, 176, 177, 233, 135, 144, 167, 34, 69, 122, 68, 18, 166, - 179, 135, 80, 15, 42, 143, 160, 152, 68, 200, 140, 168, 57, 143, 195, 161, - 71, 92, 32, 155, 129, 234, 210, 58, 224, 133, 251, 250, 42, 142, 222, 252, - 248, 72, 147, 167, 112, 25, 196, 206, 136, 193, 200, 36, 39, 248, 82, 97, - 147, 209, 173, 77, 196, 198, 210, 251, 143, 24, 19, 47, 226, 193, 150, 137, - 83, 22, 253, 70, 236, 5, 52, 255, 244, 230, 112, 245, 192, 79, 15, 161, - 32, 84, 23, 215, 27, 40, 89, 191, 17, 7, 99, 78, 142, 190, 77, 102, - 178, 4, 245, 146, 34, 74, 175, 240, 178, 3, 47, 55, 109, 147, 238, 101, - 175, 123, 177, 68, 193, 126, 161, 2, 71, 42, 235, 37, 65, 122, 28, 130, - 110, 113, 68, 122, 178, 255, 10, 10, 227, 146, 57, 75, 15, 17, 177, 178, - 8, 218, 119, 225, 143, 162, 81, 43, 7, 229, 132, 233, 113, 119, 41, 11, - 15, 35, 47, 83, 137, 232, 84, 239, 83, 59, 133, 213, 69, 191, 179, 83, - 208, 141, 164, 79, 166, 74, 226, 91, 114, 177, 229, 126, 192, 157, 172, 109, - 54, 218, 219, 118, 234, 189, 180, 229, 118, 34, 165, 129, 96, 164, 10, 199, - 250, 133, 216, 231, 225, 244, 221, 119, 227, 196, 247, 7, 17, 155, 195, 225, - 89, 108, 68, 216, 74, 203, 16, 56, 138, 233, 44, 196, 181, 189, 254, 47, - 218, 127, 174, 99, 182, 44, 85, 49, 182, 17, 55, 227, 2, 178, 175, 5, - 82, 22, 55, 248, 87, 120, 60, 169, 40, 69, 37, 95, 142, 76, 231, 184, - 6, 103, 143, 172, 219, 1, 27, 253, 85, 165, 174, 7, 196, 42, 195, 24, - 220, 218, 34, 163, 112, 148, 250, 171, 42, 178, 72, 199, 48, 119, 80, 12, - 26, 113, 241, 33, 71, 226, 40, 253, 11, 102, 125, 84, 137, 163, 152, 201, - 87, 40, 42, 253, 187, 127, 49, 71, 118, 67, 25, 255, 87, 23, 23, 188, - 166, 196, 248, 87, 93, 172, 176, 88, 38, 89, 155, 112, 221, 174, 57, 165, - 71, 212, 70, 183, 0, 233, 28, 62, 105, 25, 167, 151, 241, 77, 203, 220, - 68, 173, 118, 160, 85, 234, 86, 120, 63, 17, 43, 72, 249, 36, 77, 61, - 174, 135, 158, 122, 152, 55, 243, 145, 99, 30, 96, 192, 220, 113, 8, 157, - 21, 238, 222, 178, 107, 55, 25, 58, 7, 178, 189, 150, 21, 229, 142, 160, - 11, 243, 123, 115, 174, 230, 108, 151, 92, 55, 127, 24, 138, 144, 96, 206, - 197, 87, 193, 70, 167, 143, 66, 201, 136, 216, 195, 124, 153, 208, 238, 229, - 159, 184, 237, 11, 159, 138, 218, 228, 89, 7, 221, 178, 180, 14, 166, 193, - 193, 170, 190, 44, 179, 3, 134, 30, 89, 232, 125, 93, 31, 170, 161, 184, - 247, 184, 232, 179, 112, 17, 238, 118, 169, 120, 43, 149, 110, 231, 139, 217, - 4, 217, 93, 141, 121, 110, 37, 84, 255, 72, 149, 92, 36, 198, 197, 128, - 24, 44, 199, 41, 114, 110, 183, 171, 181, 0, 216, 200, 58, 182, 45, 84, - 22, 107, 160, 30, 184, 90, 168, 73, 210, 133, 26, 187, 174, 2, 18, 172, - 186, 104, 82, 4, 156, 169, 120, 70, 223, 153, 205, 242, 166, 80, 173, 161, - 98, 176, 120, 61, 224, 137, 100, 23, 141, 2, 129, 91, 40, 14, 224, 118, - 244, 192, 219, 126, 16, 190, 88, 132, 229, 58, 170, 127, 213, 152, 35, 101, - 9, 240, 22, 92, 192, 244, 90, 173, 130, 244, 215, 66, 61, 20, 252, 56, - 73, 156, 98, 102, 230, 168, 32, 207, 124, 250, 231, 56, 48, 129, 218, 119, - 123, 29, 203, 65, 167, 66, 238, 61, 182, 58, 192, 149, 235, 149, 89, 133, - 173, 15, 112, 209, 122, 229, 98, 170, 184, 155, 42, 222, 96, 29, 232, 33, - 126, 179, 83, 113, 202, 7, 237, 6, 26, 102, 149, 44, 87, 190, 160, 60, - 124, 142, 151, 106, 248, 29, 122, 85, 205, 207, 168, 138, 29, 192, 160, 54, - 106, 13, 28, 83, 52, 168, 132, 126, 215, 82, 213, 183, 210, 31, 90, 42, - 173, 170, 203, 3, 172, 29, 213, 197, 96, 38, 214, 213, 225, 1, 214, 79, - 175, 229, 219, 168, 30, 113, 176, 60, 0, 152, 83, 107, 80, 205, 101, 248, - 124, 141, 254, 188, 240, 7, 129, 55, 209, 40, 208, 152, 64, 118, 26, 112, - 19, 122, 254, 83, 15, 19, 28, 101, 0, 185, 30, 249, 104, 198, 242, 151, - 193, 29, 187, 122, 220, 124, 134, 183, 5, 79, 253, 217, 229, 34, 138, 194, - 201, 14, 206, 51, 14, 115, 46, 205, 148, 9, 196, 8, 233, 201, 81, 65, - 77, 81, 15, 12, 218, 234, 56, 245, 189, 241, 8, 175, 123, 213, 245, 17, - 9, 160, 157, 5, 25, 175, 123, 130, 21, 16, 34, 225, 77, 47, 77, 231, - 159, 1, 143, 49, 99, 192, 4, 105, 110, 74, 12, 234, 226, 217, 92, 174, - 89, 33, 229, 139, 172, 74, 181, 101, 58, 156, 70, 176, 138, 40, 213, 79, - 120, 150, 238, 31, 203, 155, 127, 171, 139, 123, 235, 157, 212, 192, 159, 123, - 193, 8, 230, 123, 224, 71, 253, 89, 192, 59, 16, 94, 168, 247, 101, 181, - 228, 166, 234, 50, 24, 79, 251, 67, 111, 78, 215, 84, 184, 110, 230, 225, - 52, 232, 215, 166, 195, 233, 247, 23, 29, 247, 248, 187, 121, 199, 105, 184, - 141, 150, 50, 83, 106, 227, 21, 246, 139, 118, 3, 198, 156, 155, 239, 192, - 94, 46, 170, 167, 206, 79, 227, 87, 143, 47, 127, 216, 181, 86, 247, 230, - 90, 127, 139, 126, 186, 252, 159, 119, 135, 13, 183, 253, 108, 215, 90, 155, - 55, 215, 234, 250, 135, 79, 131, 143, 255, 124, 241, 209, 251, 159, 175, 32, - 167, 109, 213, 27, 240, 255, 118, 46, 78, 145, 91, 30, 79, 78, 87, 9, - 98, 105, 33, 159, 226, 145, 173, 207, 140, 254, 85, 8, 22, 9, 46, 148, - 203, 251, 105, 24, 117, 172, 107, 188, 100, 167, 149, 216, 133, 119, 60, 177, - 163, 87, 155, 224, 130, 71, 105, 167, 107, 35, 11, 18, 200, 121, 9, 147, - 190, 219, 172, 118, 161, 146, 234, 134, 80, 163, 179, 154, 183, 83, 130, 65, - 97, 190, 250, 81, 252, 194, 1, 46, 90, 244, 186, 116, 46, 139, 245, 158, - 249, 29, 74, 126, 141, 138, 192, 2, 89, 149, 60, 180, 199, 165, 131, 233, - 106, 174, 157, 106, 107, 19, 107, 82, 74, 204, 10, 116, 127, 224, 205, 6, - 42, 102, 85, 16, 106, 90, 14, 173, 59, 35, 61, 180, 139, 15, 7, 40, - 123, 38, 85, 42, 252, 37, 215, 163, 66, 72, 136, 10, 41, 163, 5, 253, - 0, 235, 88, 148, 7, 68, 121, 66, 64, 245, 17, 111, 246, 209, 199, 148, - 39, 193, 197, 133, 143, 183, 227, 144, 59, 110, 11, 160, 120, 181, 140, 201, - 225, 128, 170, 35, 81, 8, 254, 174, 250, 35, 82, 24, 71, 229, 152, 153, - 239, 255, 134, 137, 63, 146, 109, 219, 15, 171, 249, 204, 235, 207, 227, 247, - 23, 64, 187, 120, 170, 79, 45, 253, 132, 215, 241, 207, 185, 86, 75, 210, - 18, 65, 129, 64, 96, 6, 234, 49, 170, 28, 205, 240, 62, 104, 206, 91, - 161, 18, 126, 252, 132, 199, 205, 4, 149, 139, 207, 19, 111, 162, 242, 98, - 172, 255, 165, 54, 36, 156, 142, 175, 201, 11, 236, 165, 172, 253, 21, 158, - 144, 95, 193, 168, 193, 250, 67, 175, 176, 208, 111, 89, 203, 27, 82, 163, - 121, 227, 95, 140, 124, 250, 170, 68, 89, 74, 173, 22, 78, 184, 83, 159, - 61, 156, 249, 30, 170, 76, 98, 54, 13, 208, 72, 65, 130, 73, 6, 160, - 100, 137, 103, 79, 123, 111, 100, 219, 227, 60, 91, 156, 145, 191, 38, 21, - 169, 205, 104, 45, 168, 93, 228, 189, 83, 106, 14, 47, 230, 114, 64, 233, - 89, 206, 61, 189, 200, 81, 57, 237, 139, 233, 132, 229, 59, 70, 173, 166, - 211, 69, 79, 206, 59, 105, 107, 225, 47, 174, 158, 184, 196, 219, 112, 166, - 144, 147, 215, 179, 176, 143, 123, 66, 119, 12, 191, 12, 171, 189, 117, 21, - 126, 32, 63, 247, 153, 195, 245, 60, 128, 100, 32, 105, 139, 77, 48, 137, - 198, 60, 28, 141, 248, 30, 162, 133, 64, 222, 112, 180, 220, 66, 187, 221, - 88, 32, 43, 169, 211, 205, 195, 51, 140, 135, 212, 152, 194, 58, 56, 43, - 16, 11, 43, 182, 169, 145, 40, 234, 237, 180, 243, 210, 167, 105, 167, 238, - 162, 219, 130, 122, 139, 78, 39, 112, 138, 134, 3, 138, 246, 222, 251, 148, - 51, 53, 48, 81, 172, 175, 109, 113, 96, 205, 238, 207, 231, 15, 188, 251, - 117, 248, 151, 179, 148, 240, 208, 227, 175, 232, 138, 30, 214, 116, 112, 229, - 143, 214, 12, 143, 31, 137, 148, 224, 10, 167, 48, 226, 244, 154, 88, 138, - 30, 106, 231, 16, 114, 190, 47, 120, 83, 153, 64, 88, 140, 167, 0, 133, - 72, 22, 18, 137, 241, 129, 29, 24, 248, 23, 176, 45, 73, 170, 66, 181, - 178, 153, 55, 193, 128, 48, 48, 192, 231, 38, 77, 151, 175, 193, 59, 61, - 9, 177, 114, 252, 122, 82, 202, 9, 89, 116, 51, 51, 197, 197, 43, 159, - 195, 82, 169, 108, 1, 224, 23, 142, 126, 217, 20, 239, 61, 112, 30, 232, - 70, 153, 203, 16, 145, 219, 197, 211, 126, 36, 120, 133, 136, 88, 166, 249, - 112, 209, 35, 62, 97, 48, 231, 36, 189, 126, 57, 14, 250, 85, 128, 140, - 23, 19, 88, 211, 245, 101, 240, 49, 168, 63, 18, 21, 84, 121, 5, 127, - 62, 255, 112, 84, 111, 52, 183, 92, 123, 0, 169, 196, 158, 241, 32, 35, - 239, 25, 156, 77, 29, 219, 27, 12, 108, 46, 47, 133, 177, 181, 197, 189, - 136, 141, 158, 221, 237, 30, 96, 38, 155, 47, 242, 174, 88, 228, 246, 128, - 168, 152, 61, 136, 105, 152, 253, 190, 48, 32, 210, 101, 15, 16, 121, 217, - 92, 94, 239, 75, 162, 101, 95, 16, 201, 178, 47, 145, 64, 249, 156, 94, - 241, 151, 49, 18, 43, 120, 4, 220, 102, 15, 129, 36, 141, 16, 121, 65, - 109, 248, 60, 14, 86, 246, 16, 122, 16, 168, 148, 201, 30, 113, 186, 196, - 127, 145, 42, 217, 35, 162, 66, 212, 79, 254, 200, 43, 25, 73, 106, 4, - 213, 137, 181, 178, 182, 39, 130, 4, 217, 225, 204, 14, 57, 249, 177, 167, - 193, 132, 151, 152, 249, 3, 248, 35, 186, 99, 71, 49, 213, 129, 226, 17, - 34, 110, 216, 91, 222, 216, 91, 217, 234, 75, 67, 121, 11, 38, 218, 75, - 35, 46, 39, 70, 83, 125, 17, 229, 196, 121, 95, 121, 142, 75, 197, 213, - 81, 85, 252, 73, 54, 78, 13, 67, 62, 160, 15, 244, 213, 248, 192, 199, - 29, 159, 248, 183, 68, 68, 47, 236, 8, 169, 133, 29, 9, 90, 97, 19, - 66, 128, 162, 87, 56, 89, 60, 227, 10, 163, 16, 143, 89, 81, 176, 63, - 250, 76, 35, 139, 84, 99, 239, 139, 136, 64, 131, 191, 53, 234, 110, 187, - 125, 143, 245, 232, 197, 225, 47, 240, 207, 65, 127, 49, 47, 149, 172, 118, - 153, 238, 92, 222, 23, 139, 194, 124, 157, 196, 98, 55, 201, 246, 99, 85, - 126, 11, 23, 37, 122, 100, 188, 189, 201, 222, 47, 65, 93, 14, 15, 78, - 99, 221, 122, 224, 72, 143, 132, 146, 201, 85, 138, 2, 167, 58, 195, 216, - 56, 74, 65, 215, 80, 80, 92, 76, 43, 229, 28, 233, 22, 121, 49, 193, - 253, 140, 200, 212, 56, 34, 133, 52, 163, 168, 112, 158, 204, 42, 30, 208, - 199, 91, 45, 61, 232, 140, 157, 24, 130, 242, 147, 50, 162, 49, 85, 53, - 130, 171, 186, 242, 248, 65, 118, 26, 96, 58, 218, 115, 11, 144, 159, 195, - 17, 44, 39, 238, 19, 86, 179, 187, 58, 212, 12, 74, 130, 241, 98, 44, - 29, 119, 0, 133, 17, 39, 235, 248, 52, 45, 34, 201, 184, 169, 114, 193, - 36, 0, 212, 193, 217, 37, 141, 88, 167, 73, 53, 234, 78, 244, 209, 160, - 63, 93, 49, 81, 235, 79, 212, 193, 185, 57, 252, 204, 192, 135, 9, 130, - 115, 9, 140, 171, 55, 225, 33, 96, 240, 19, 144, 134, 224, 230, 26, 73, - 170, 227, 123, 253, 33, 91, 2, 210, 134, 195, 113, 20, 144, 113, 18, 15, - 0, 83, 97, 104, 69, 30, 5, 131, 133, 204, 204, 74, 48, 105, 222, 100, - 253, 109, 196, 197, 106, 211, 181, 117, 211, 128, 191, 213, 85, 145, 82, 218, - 20, 26, 195, 105, 131, 217, 201, 24, 240, 124, 53, 57, 232, 77, 188, 177, - 15, 219, 61, 152, 116, 17, 77, 117, 132, 99, 75, 20, 84, 194, 46, 40, - 75, 71, 69, 162, 5, 174, 95, 97, 201, 220, 168, 250, 134, 229, 75, 214, - 100, 92, 22, 203, 28, 107, 246, 196, 252, 43, 10, 34, 154, 122, 183, 105, - 45, 27, 108, 123, 43, 233, 15, 228, 199, 55, 54, 160, 251, 248, 172, 251, - 89, 38, 8, 216, 181, 83, 185, 117, 11, 181, 56, 226, 40, 82, 64, 180, - 255, 86, 68, 8, 138, 106, 91, 77, 251, 136, 59, 205, 86, 111, 156, 51, - 33, 163, 208, 37, 53, 230, 145, 86, 73, 250, 254, 205, 58, 75, 194, 235, - 2, 117, 7, 163, 148, 88, 213, 109, 82, 222, 179, 129, 161, 144, 160, 85, - 121, 36, 27, 148, 102, 9, 99, 81, 247, 83, 140, 26, 255, 91, 100, 90, - 127, 148, 167, 159, 86, 142, 163, 149, 100, 90, 226, 219, 158, 251, 110, 238, - 101, 207, 205, 154, 82, 30, 251, 141, 205, 20, 247, 64, 215, 165, 1, 121, - 124, 115, 128, 186, 73, 31, 199, 17, 251, 173, 96, 94, 18, 95, 166, 15, - 31, 137, 183, 103, 168, 130, 226, 138, 177, 126, 30, 207, 48, 247, 187, 115, - 87, 91, 208, 92, 251, 78, 1, 152, 72, 204, 219, 170, 234, 178, 39, 67, - 87, 222, 109, 79, 54, 205, 43, 28, 198, 128, 38, 0, 66, 78, 174, 130, - 109, 156, 49, 178, 31, 100, 99, 223, 155, 68, 248, 138, 248, 100, 12, 172, - 87, 223, 236, 161, 244, 155, 208, 174, 51, 140, 157, 244, 24, 193, 209, 74, - 236, 242, 95, 67, 36, 132, 81, 197, 119, 188, 8, 103, 211, 161, 134, 67, - 198, 8, 201, 15, 39, 183, 19, 214, 208, 52, 93, 186, 170, 169, 174, 171, - 29, 174, 251, 65, 196, 109, 187, 226, 60, 142, 158, 231, 219, 87, 113, 164, - 225, 18, 138, 91, 91, 148, 21, 5, 101, 228, 185, 5, 73, 107, 202, 57, - 64, 20, 22, 161, 58, 40, 123, 53, 245, 233, 67, 132, 174, 42, 218, 154, - 116, 199, 113, 178, 109, 2, 154, 118, 77, 194, 102, 197, 90, 166, 220, 32, - 27, 3, 255, 237, 228, 103, 13, 93, 22, 225, 249, 147, 202, 235, 174, 96, - 218, 105, 103, 1, 63, 240, 163, 106, 54, 43, 151, 168, 104, 121, 81, 91, - 150, 11, 236, 52, 51, 238, 148, 186, 195, 27, 31, 63, 141, 223, 246, 8, - 49, 81, 19, 165, 154, 97, 95, 83, 115, 89, 244, 40, 132, 211, 115, 96, - 62, 127, 139, 194, 173, 167, 92, 5, 161, 124, 69, 231, 249, 202, 144, 81, - 116, 194, 68, 220, 73, 87, 100, 194, 208, 49, 189, 200, 197, 248, 238, 212, - 115, 145, 119, 167, 15, 16, 121, 63, 231, 59, 184, 180, 34, 94, 181, 92, - 192, 85, 42, 106, 74, 202, 68, 79, 78, 211, 243, 41, 141, 56, 183, 78, - 170, 54, 167, 207, 195, 254, 199, 116, 117, 64, 90, 78, 195, 197, 172, 47, - 77, 195, 190, 30, 134, 56, 172, 55, 27, 102, 126, 57, 189, 97, 37, 207, - 92, 4, 214, 178, 217, 217, 20, 117, 174, 242, 254, 121, 97, 217, 232, 92, - 47, 55, 108, 8, 63, 195, 77, 129, 23, 143, 248, 62, 46, 90, 78, 179, - 104, 39, 55, 19, 232, 50, 246, 131, 213, 218, 216, 200, 133, 162, 62, 6, - 234, 96, 53, 237, 182, 125, 88, 222, 112, 162, 126, 252, 159, 255, 148, 172, - 147, 239, 190, 179, 142, 111, 117, 44, 7, 79, 190, 120, 65, 195, 184, 102, - 105, 236, 197, 138, 220, 117, 118, 174, 173, 147, 239, 173, 227, 74, 9, 242, - 85, 173, 99, 224, 31, 30, 144, 123, 123, 235, 37, 237, 206, 187, 214, 241, - 70, 58, 181, 167, 187, 25, 42, 84, 144, 142, 220, 132, 183, 66, 250, 105, - 163, 215, 229, 142, 181, 108, 216, 214, 176, 193, 131, 226, 16, 32, 102, 32, - 72, 127, 155, 89, 0, 148, 172, 4, 125, 0, 84, 160, 244, 95, 170, 123, - 64, 222, 101, 92, 22, 198, 69, 62, 67, 53, 248, 25, 74, 200, 178, 254, - 138, 127, 195, 33, 126, 67, 163, 106, 29, 102, 191, 225, 16, 234, 93, 243, - 92, 71, 152, 203, 169, 90, 71, 217, 92, 71, 27, 110, 252, 233, 207, 245, - 187, 41, 24, 208, 7, 118, 201, 90, 86, 151, 80, 166, 143, 161, 36, 232, - 125, 88, 29, 226, 251, 90, 216, 165, 104, 7, 143, 60, 124, 109, 56, 124, - 152, 22, 11, 157, 230, 95, 118, 72, 116, 17, 253, 123, 134, 242, 11, 244, - 238, 243, 50, 14, 96, 118, 171, 110, 189, 196, 65, 44, 111, 120, 56, 204, - 107, 10, 109, 251, 50, 9, 28, 81, 224, 99, 174, 140, 126, 65, 159, 125, - 209, 250, 151, 28, 60, 152, 91, 222, 150, 202, 41, 194, 128, 193, 223, 186, - 208, 32, 44, 81, 99, 112, 62, 186, 198, 104, 188, 155, 34, 43, 210, 41, - 201, 109, 137, 51, 82, 133, 188, 82, 251, 53, 22, 31, 133, 208, 130, 232, - 87, 121, 95, 231, 10, 206, 198, 177, 207, 220, 115, 42, 240, 145, 164, 45, - 59, 156, 172, 110, 56, 81, 189, 246, 250, 194, 24, 104, 10, 79, 182, 124, - 48, 209, 216, 87, 179, 1, 32, 156, 71, 74, 192, 65, 215, 46, 146, 147, - 44, 188, 205, 242, 197, 253, 135, 20, 124, 60, 9, 198, 104, 75, 79, 215, - 78, 40, 204, 80, 240, 218, 207, 120, 55, 129, 152, 236, 145, 207, 78, 255, - 189, 240, 102, 38, 69, 9, 224, 90, 1, 201, 125, 170, 61, 107, 90, 143, - 225, 177, 18, 121, 242, 105, 48, 74, 252, 80, 102, 99, 247, 62, 13, 71, - 3, 238, 45, 245, 130, 158, 126, 183, 8, 69, 179, 1, 152, 5, 62, 125, - 42, 14, 42, 197, 198, 85, 79, 109, 92, 128, 18, 203, 73, 72, 168, 98, - 179, 229, 16, 59, 58, 159, 173, 5, 190, 31, 163, 72, 8, 205, 172, 240, - 136, 232, 143, 167, 192, 70, 160, 92, 64, 57, 243, 81, 139, 112, 156, 4, - 10, 59, 102, 61, 31, 203, 189, 124, 93, 69, 97, 174, 77, 133, 188, 209, - 101, 8, 236, 199, 112, 12, 221, 194, 161, 47, 1, 159, 212, 7, 42, 18, - 249, 104, 168, 7, 71, 217, 9, 48, 41, 120, 208, 132, 254, 227, 129, 214, - 102, 189, 5, 58, 212, 158, 251, 19, 230, 245, 251, 254, 116, 78, 196, 59, - 10, 71, 11, 121, 24, 37, 253, 6, 252, 40, 108, 76, 52, 253, 233, 215, - 28, 95, 90, 122, 99, 186, 189, 159, 242, 21, 46, 41, 80, 27, 9, 16, - 87, 109, 38, 186, 32, 16, 121, 75, 193, 14, 147, 177, 245, 64, 187, 167, - 71, 241, 11, 191, 168, 151, 184, 191, 223, 232, 20, 151, 69, 214, 119, 58, - 197, 33, 252, 184, 157, 162, 244, 132, 6, 111, 77, 72, 59, 24, 22, 11, - 212, 50, 242, 189, 215, 125, 139, 12, 20, 201, 159, 181, 117, 205, 181, 5, - 99, 63, 183, 60, 74, 206, 200, 199, 86, 160, 135, 109, 186, 222, 160, 110, - 215, 230, 43, 216, 82, 214, 131, 56, 25, 11, 147, 94, 118, 156, 159, 72, - 77, 15, 150, 195, 71, 84, 211, 142, 67, 189, 221, 154, 16, 117, 145, 217, - 202, 155, 164, 138, 108, 11, 140, 108, 25, 207, 99, 161, 49, 47, 203, 187, - 75, 113, 13, 0, 79, 114, 106, 139, 6, 59, 182, 76, 217, 176, 53, 135, - 187, 41, 56, 198, 65, 47, 114, 223, 175, 69, 5, 229, 149, 96, 244, 113, - 104, 55, 197, 242, 93, 248, 78, 64, 141, 235, 247, 147, 59, 155, 50, 39, - 168, 30, 91, 177, 144, 205, 188, 229, 221, 184, 215, 246, 162, 15, 107, 152, - 205, 198, 177, 137, 228, 100, 204, 138, 36, 11, 227, 108, 152, 88, 127, 101, - 27, 136, 21, 158, 133, 203, 54, 30, 221, 75, 19, 114, 144, 81, 46, 22, - 82, 200, 44, 142, 98, 119, 75, 61, 245, 47, 57, 239, 65, 172, 7, 180, - 60, 242, 7, 157, 134, 178, 24, 4, 8, 201, 158, 197, 159, 43, 48, 185, - 155, 152, 218, 241, 73, 22, 231, 27, 187, 81, 224, 2, 62, 204, 146, 248, - 206, 36, 23, 233, 75, 96, 13, 208, 47, 30, 217, 137, 46, 41, 30, 185, - 221, 226, 194, 47, 10, 198, 254, 148, 42, 135, 145, 17, 116, 14, 168, 200, - 129, 104, 177, 110, 97, 173, 229, 13, 134, 112, 3, 28, 223, 82, 79, 186, - 5, 143, 173, 73, 28, 193, 119, 220, 233, 124, 22, 126, 20, 174, 147, 34, - 122, 182, 147, 71, 147, 135, 29, 192, 29, 253, 143, 116, 112, 45, 77, 87, - 210, 143, 97, 147, 200, 210, 161, 154, 107, 230, 71, 67, 192, 139, 55, 68, - 97, 80, 206, 193, 162, 186, 92, 93, 122, 213, 186, 16, 8, 9, 39, 4, - 164, 162, 225, 141, 67, 82, 239, 32, 223, 137, 106, 160, 90, 242, 51, 160, - 249, 70, 113, 80, 131, 2, 205, 64, 81, 175, 97, 49, 167, 167, 93, 240, - 54, 133, 229, 77, 159, 220, 128, 17, 75, 187, 132, 195, 232, 191, 202, 184, - 160, 199, 183, 246, 97, 90, 34, 179, 83, 182, 29, 142, 158, 59, 250, 7, - 21, 167, 152, 29, 115, 63, 3, 34, 60, 72, 59, 158, 229, 171, 71, 167, - 129, 187, 100, 187, 145, 222, 138, 229, 199, 207, 38, 175, 244, 137, 138, 189, - 190, 160, 127, 152, 164, 228, 223, 125, 168, 84, 202, 144, 117, 151, 209, 95, - 235, 104, 211, 70, 255, 90, 70, 135, 115, 145, 216, 94, 164, 244, 197, 82, - 231, 24, 114, 192, 48, 217, 8, 36, 227, 30, 138, 27, 176, 246, 6, 77, - 192, 61, 96, 194, 86, 24, 187, 29, 56, 180, 32, 226, 30, 55, 157, 142, - 56, 43, 36, 233, 122, 178, 67, 225, 197, 52, 103, 47, 149, 81, 173, 208, - 3, 234, 197, 15, 59, 135, 15, 58, 24, 93, 150, 199, 195, 66, 15, 118, - 214, 177, 72, 184, 69, 9, 192, 76, 32, 122, 179, 175, 49, 144, 60, 163, - 112, 154, 135, 220, 67, 103, 19, 223, 57, 187, 170, 121, 67, 199, 107, 132, - 216, 190, 254, 115, 106, 81, 187, 4, 175, 15, 216, 245, 201, 73, 237, 228, - 164, 202, 253, 182, 214, 208, 117, 43, 28, 206, 110, 23, 164, 74, 56, 131, - 163, 28, 16, 69, 56, 187, 125, 176, 240, 140, 231, 56, 31, 240, 248, 38, - 148, 253, 241, 22, 17, 248, 239, 38, 192, 90, 240, 215, 134, 191, 67, 197, - 71, 192, 10, 213, 250, 45, 135, 95, 61, 64, 175, 250, 50, 52, 25, 146, - 247, 90, 13, 138, 186, 80, 157, 235, 194, 31, 84, 225, 182, 202, 88, 217, - 17, 84, 114, 12, 127, 208, 160, 219, 40, 51, 161, 177, 127, 37, 61, 19, - 64, 81, 244, 82, 80, 229, 245, 143, 61, 30, 51, 149, 223, 88, 170, 238, - 8, 60, 46, 7, 238, 19, 85, 143, 231, 142, 241, 240, 50, 52, 167, 146, - 201, 112, 219, 220, 156, 42, 117, 81, 163, 225, 102, 243, 41, 73, 172, 59, - 235, 0, 91, 190, 8, 67, 58, 172, 209, 45, 190, 16, 185, 101, 24, 123, - 46, 38, 86, 47, 60, 249, 58, 74, 36, 209, 244, 228, 234, 146, 241, 124, - 73, 116, 51, 237, 219, 240, 221, 246, 100, 193, 191, 203, 94, 252, 228, 93, - 193, 182, 86, 92, 117, 126, 213, 152, 4, 249, 210, 77, 211, 160, 192, 148, - 40, 99, 23, 19, 251, 248, 210, 202, 36, 127, 78, 14, 97, 2, 137, 166, - 15, 98, 98, 150, 194, 137, 159, 185, 150, 158, 35, 208, 85, 110, 181, 84, - 128, 137, 134, 39, 210, 79, 94, 159, 156, 18, 87, 167, 185, 228, 149, 29, - 50, 189, 8, 6, 85, 53, 227, 113, 59, 237, 200, 16, 189, 179, 27, 50, - 58, 89, 239, 138, 185, 225, 45, 148, 60, 164, 180, 169, 8, 194, 30, 1, - 166, 159, 173, 73, 187, 206, 67, 163, 189, 175, 162, 235, 155, 227, 9, 89, - 29, 106, 156, 247, 43, 111, 212, 177, 92, 230, 227, 47, 93, 219, 210, 212, - 99, 136, 71, 221, 223, 70, 90, 164, 85, 137, 245, 96, 96, 203, 199, 166, - 150, 150, 131, 158, 179, 48, 176, 37, 212, 215, 0, 166, 18, 235, 175, 148, - 44, 172, 190, 74, 47, 36, 92, 0, 220, 68, 6, 70, 240, 238, 152, 51, - 149, 80, 143, 163, 44, 50, 98, 157, 149, 96, 70, 140, 37, 214, 107, 227, - 191, 142, 176, 64, 58, 32, 115, 39, 10, 173, 216, 82, 2, 40, 242, 115, - 67, 10, 200, 49, 158, 136, 105, 207, 37, 59, 164, 214, 129, 159, 160, 161, - 44, 211, 130, 228, 26, 25, 218, 248, 89, 7, 244, 241, 66, 66, 115, 75, - 4, 124, 226, 79, 66, 76, 226, 22, 190, 192, 46, 146, 206, 48, 80, 4, - 17, 177, 239, 188, 241, 244, 158, 8, 46, 171, 185, 160, 68, 134, 159, 43, - 31, 47, 68, 248, 12, 124, 48, 161, 190, 172, 215, 244, 140, 44, 153, 11, - 255, 149, 192, 197, 206, 150, 27, 161, 68, 133, 163, 181, 119, 69, 185, 119, - 69, 249, 151, 117, 69, 185, 119, 68, 249, 223, 235, 136, 146, 59, 21, 206, - 152, 234, 118, 5, 154, 52, 69, 138, 83, 36, 39, 21, 20, 186, 40, 254, - 169, 128, 164, 112, 175, 108, 220, 70, 118, 88, 69, 211, 94, 32, 55, 46, - 143, 26, 146, 85, 167, 32, 98, 212, 188, 93, 248, 149, 184, 236, 107, 126, - 229, 80, 119, 201, 22, 23, 111, 27, 208, 68, 148, 116, 5, 149, 38, 132, - 81, 31, 147, 42, 165, 150, 163, 147, 41, 209, 111, 116, 141, 25, 127, 6, - 119, 109, 92, 132, 163, 134, 109, 181, 11, 41, 26, 144, 239, 2, 147, 23, - 253, 208, 216, 100, 60, 96, 198, 161, 197, 78, 151, 1, 32, 251, 23, 94, - 36, 4, 234, 125, 145, 208, 141, 150, 99, 102, 167, 33, 91, 207, 181, 113, - 10, 197, 240, 64, 17, 46, 85, 171, 68, 75, 131, 65, 219, 26, 196, 195, - 36, 161, 102, 165, 98, 220, 89, 170, 15, 117, 148, 168, 118, 174, 159, 11, - 28, 186, 208, 132, 7, 100, 240, 81, 245, 238, 132, 178, 83, 96, 82, 255, - 33, 28, 109, 81, 97, 148, 223, 135, 97, 226, 236, 32, 197, 202, 235, 237, - 254, 99, 210, 199, 125, 65, 10, 223, 90, 31, 236, 199, 89, 56, 85, 187, - 147, 24, 71, 219, 8, 100, 129, 19, 247, 79, 141, 88, 37, 113, 169, 174, - 76, 249, 57, 91, 140, 194, 65, 60, 6, 20, 255, 246, 166, 109, 229, 80, - 244, 169, 156, 176, 191, 186, 114, 252, 83, 126, 103, 224, 175, 166, 35, 143, - 108, 9, 208, 206, 80, 55, 155, 219, 106, 64, 120, 242, 221, 188, 115, 124, - 216, 226, 140, 172, 182, 250, 118, 242, 32, 171, 176, 172, 34, 202, 60, 198, - 90, 129, 3, 44, 57, 179, 195, 208, 62, 170, 134, 49, 45, 25, 10, 246, - 77, 17, 222, 133, 58, 113, 162, 76, 142, 126, 167, 178, 110, 103, 249, 103, - 63, 65, 181, 85, 17, 76, 129, 251, 139, 77, 156, 243, 219, 169, 119, 253, - 68, 154, 138, 192, 208, 188, 57, 72, 67, 54, 139, 137, 51, 75, 123, 165, - 185, 49, 76, 195, 227, 112, 134, 134, 188, 143, 102, 146, 42, 231, 101, 76, - 43, 27, 52, 236, 230, 225, 87, 193, 238, 142, 9, 187, 235, 99, 13, 235, - 228, 128, 85, 29, 86, 65, 253, 242, 216, 29, 60, 187, 70, 109, 115, 171, - 189, 177, 143, 27, 246, 9, 156, 40, 226, 44, 5, 45, 168, 130, 115, 59, - 190, 164, 199, 235, 20, 17, 84, 225, 80, 9, 170, 160, 206, 123, 243, 73, - 102, 234, 155, 131, 244, 228, 55, 7, 102, 193, 196, 77, 65, 15, 222, 221, - 152, 227, 95, 55, 231, 8, 245, 104, 189, 36, 33, 214, 229, 195, 41, 143, - 50, 142, 93, 77, 69, 111, 120, 119, 115, 150, 215, 192, 35, 8, 243, 36, - 21, 191, 235, 39, 247, 29, 14, 217, 198, 224, 4, 38, 211, 174, 87, 147, - 209, 154, 197, 155, 228, 107, 137, 88, 155, 245, 6, 6, 134, 220, 190, 30, - 155, 131, 52, 230, 194, 147, 117, 55, 147, 201, 58, 208, 233, 190, 113, 5, - 25, 170, 34, 213, 141, 38, 51, 87, 136, 7, 100, 99, 91, 233, 56, 8, - 154, 60, 47, 91, 224, 110, 129, 184, 61, 120, 34, 204, 192, 102, 77, 116, - 8, 194, 245, 3, 196, 91, 131, 14, 189, 232, 79, 137, 191, 225, 59, 224, - 207, 69, 231, 26, 195, 27, 29, 151, 55, 236, 138, 63, 158, 192, 227, 146, - 63, 194, 250, 224, 12, 17, 73, 162, 251, 252, 224, 24, 113, 71, 180, 136, - 166, 131, 113, 167, 19, 188, 80, 47, 186, 42, 23, 236, 206, 219, 142, 136, - 189, 116, 239, 93, 71, 68, 93, 186, 247, 176, 83, 178, 142, 170, 86, 235, - 192, 58, 170, 227, 2, 63, 176, 150, 245, 210, 219, 3, 107, 81, 121, 119, - 96, 93, 85, 172, 35, 0, 148, 239, 5, 23, 165, 135, 247, 161, 89, 255, - 216, 126, 88, 190, 83, 168, 28, 212, 216, 29, 81, 195, 29, 118, 0, 76, - 219, 29, 81, 243, 29, 242, 75, 123, 13, 79, 85, 171, 93, 39, 241, 113, - 69, 190, 31, 242, 119, 204, 142, 172, 35, 122, 0, 65, 133, 159, 88, 230, - 192, 128, 151, 39, 103, 169, 53, 26, 131, 6, 125, 96, 143, 89, 199, 183, - 217, 132, 225, 120, 185, 140, 75, 115, 99, 25, 113, 25, 184, 74, 100, 24, - 107, 36, 140, 86, 164, 23, 124, 65, 255, 240, 239, 5, 157, 80, 52, 106, - 227, 11, 160, 74, 113, 82, 176, 221, 132, 2, 55, 179, 17, 251, 179, 207, - 159, 119, 246, 225, 174, 70, 158, 162, 101, 78, 24, 68, 236, 71, 224, 126, - 34, 24, 30, 213, 203, 200, 23, 61, 25, 101, 87, 141, 129, 207, 170, 112, - 62, 73, 32, 140, 196, 80, 76, 115, 144, 150, 191, 254, 114, 15, 36, 233, - 150, 201, 73, 172, 126, 48, 121, 54, 226, 12, 29, 180, 238, 62, 17, 55, - 174, 180, 254, 131, 56, 161, 75, 134, 109, 238, 192, 54, 66, 149, 77, 80, - 217, 170, 97, 126, 191, 39, 236, 22, 234, 226, 30, 144, 204, 34, 228, 80, - 169, 140, 56, 102, 210, 246, 194, 117, 241, 148, 43, 191, 188, 154, 122, 255, - 94, 248, 188, 155, 17, 67, 27, 117, 161, 252, 83, 99, 143, 126, 68, 189, - 34, 105, 246, 64, 132, 14, 150, 88, 110, 206, 71, 48, 183, 112, 4, 152, - 198, 18, 10, 122, 81, 252, 192, 241, 171, 202, 84, 55, 226, 209, 226, 42, - 75, 55, 85, 194, 63, 229, 199, 69, 246, 210, 20, 111, 96, 51, 98, 114, - 186, 228, 124, 132, 198, 197, 252, 106, 212, 139, 68, 13, 184, 137, 47, 121, - 176, 195, 172, 122, 19, 149, 210, 84, 160, 130, 137, 236, 254, 167, 58, 247, - 87, 39, 139, 134, 46, 103, 142, 164, 1, 154, 98, 181, 159, 19, 220, 202, - 164, 251, 148, 56, 118, 131, 173, 35, 171, 162, 229, 68, 58, 75, 180, 23, - 97, 111, 134, 200, 131, 120, 156, 233, 129, 79, 194, 188, 114, 122, 251, 98, - 122, 169, 16, 55, 129, 225, 42, 83, 168, 218, 97, 210, 48, 146, 248, 229, - 9, 52, 219, 159, 39, 11, 195, 160, 86, 60, 11, 73, 251, 190, 206, 158, - 4, 220, 172, 85, 231, 239, 110, 226, 185, 80, 10, 173, 220, 232, 211, 18, - 73, 69, 248, 66, 254, 78, 187, 250, 184, 186, 132, 230, 48, 186, 212, 63, - 121, 172, 200, 28, 210, 241, 198, 143, 149, 171, 226, 37, 217, 178, 137, 78, - 176, 210, 233, 8, 173, 254, 49, 246, 131, 219, 104, 29, 195, 143, 211, 112, - 201, 77, 178, 131, 174, 90, 220, 54, 186, 74, 118, 92, 76, 56, 108, 177, - 210, 83, 15, 221, 252, 150, 183, 233, 96, 221, 184, 153, 149, 189, 144, 179, - 76, 164, 185, 181, 238, 168, 3, 45, 35, 196, 126, 209, 124, 89, 196, 110, - 20, 164, 147, 5, 238, 205, 35, 118, 203, 161, 120, 171, 16, 46, 25, 18, - 39, 21, 154, 63, 6, 213, 171, 134, 230, 120, 67, 209, 68, 48, 120, 58, - 56, 202, 184, 78, 122, 56, 238, 5, 232, 229, 90, 205, 213, 52, 113, 249, - 79, 40, 102, 164, 174, 230, 223, 202, 48, 215, 167, 192, 194, 163, 3, 202, - 108, 54, 77, 165, 228, 116, 8, 91, 66, 91, 83, 199, 187, 197, 153, 117, - 117, 102, 255, 41, 44, 223, 204, 213, 66, 83, 209, 28, 55, 26, 28, 164, - 63, 237, 185, 127, 133, 44, 163, 18, 163, 249, 80, 173, 2, 6, 185, 250, - 86, 57, 147, 164, 207, 209, 60, 199, 187, 56, 71, 53, 47, 203, 191, 180, - 131, 141, 154, 30, 75, 144, 153, 186, 228, 118, 57, 150, 40, 211, 237, 79, - 184, 89, 129, 192, 39, 18, 31, 116, 80, 137, 113, 30, 78, 148, 188, 255, - 231, 185, 177, 29, 105, 197, 205, 214, 192, 177, 177, 24, 228, 2, 76, 62, - 24, 68, 44, 80, 103, 16, 213, 90, 39, 44, 228, 52, 157, 227, 127, 233, - 32, 3, 133, 181, 204, 227, 97, 96, 136, 172, 205, 89, 47, 38, 130, 95, - 83, 133, 244, 24, 47, 133, 29, 147, 249, 98, 150, 53, 66, 85, 66, 164, - 74, 221, 57, 44, 37, 251, 125, 33, 36, 162, 44, 223, 62, 2, 221, 238, - 242, 244, 222, 37, 188, 11, 62, 138, 23, 142, 0, 32, 189, 93, 116, 201, - 20, 30, 138, 115, 156, 213, 17, 170, 5, 71, 34, 148, 241, 33, 252, 29, - 233, 153, 21, 255, 17, 122, 37, 92, 233, 49, 246, 211, 32, 28, 17, 112, - 255, 4, 232, 103, 66, 56, 143, 136, 93, 50, 208, 29, 168, 20, 156, 39, - 124, 105, 34, 192, 75, 28, 69, 108, 244, 15, 250, 174, 115, 77, 86, 253, - 116, 124, 86, 62, 60, 185, 229, 190, 85, 181, 180, 18, 220, 68, 44, 59, - 138, 220, 170, 226, 64, 250, 28, 136, 182, 86, 129, 173, 105, 32, 88, 18, - 163, 142, 245, 0, 16, 155, 48, 184, 160, 87, 84, 131, 5, 214, 27, 94, - 206, 133, 34, 150, 86, 72, 232, 100, 37, 147, 247, 160, 227, 110, 10, 230, - 238, 113, 49, 0, 201, 60, 127, 119, 29, 116, 41, 47, 171, 185, 169, 47, - 247, 59, 120, 147, 159, 219, 25, 186, 134, 199, 81, 218, 218, 84, 28, 54, - 70, 95, 117, 60, 170, 72, 195, 234, 6, 241, 141, 253, 45, 108, 238, 82, - 179, 250, 192, 165, 68, 245, 104, 139, 43, 149, 41, 246, 51, 6, 249, 148, - 96, 4, 180, 42, 248, 55, 149, 160, 29, 177, 50, 104, 209, 118, 26, 134, - 230, 59, 29, 71, 218, 236, 24, 134, 229, 150, 150, 119, 195, 40, 36, 78, - 90, 235, 137, 52, 175, 184, 168, 6, 13, 34, 68, 212, 28, 205, 197, 249, - 214, 147, 13, 122, 136, 84, 58, 228, 232, 155, 58, 111, 27, 7, 9, 181, - 161, 29, 11, 219, 181, 234, 110, 217, 35, 134, 114, 230, 99, 88, 215, 148, - 19, 230, 93, 168, 143, 105, 45, 168, 91, 197, 17, 222, 61, 170, 206, 121, - 14, 186, 130, 117, 49, 187, 98, 186, 129, 51, 32, 225, 223, 76, 167, 203, - 8, 200, 10, 240, 207, 109, 97, 91, 13, 231, 202, 170, 122, 175, 70, 43, - 208, 124, 40, 53, 54, 204, 203, 223, 52, 19, 218, 39, 195, 172, 168, 171, - 167, 177, 101, 90, 248, 4, 228, 12, 254, 151, 193, 38, 21, 137, 78, 164, - 121, 81, 206, 14, 165, 253, 224, 216, 168, 239, 223, 172, 30, 110, 72, 130, - 85, 44, 90, 39, 40, 218, 187, 118, 156, 170, 211, 222, 224, 251, 181, 115, - 88, 117, 79, 240, 177, 193, 195, 164, 99, 103, 233, 114, 19, 43, 144, 65, - 138, 52, 220, 2, 20, 20, 211, 208, 171, 255, 69, 141, 1, 171, 47, 67, - 68, 113, 27, 179, 139, 96, 206, 209, 253, 123, 38, 180, 52, 185, 250, 182, - 125, 216, 106, 108, 10, 75, 200, 212, 208, 115, 9, 51, 180, 166, 152, 97, - 158, 167, 99, 81, 206, 148, 149, 90, 179, 16, 213, 88, 223, 174, 54, 217, - 45, 138, 17, 59, 170, 213, 208, 115, 23, 116, 161, 14, 255, 30, 177, 8, - 19, 93, 120, 225, 151, 61, 137, 252, 13, 221, 14, 242, 146, 133, 146, 115, - 216, 192, 184, 64, 247, 224, 15, 120, 204, 6, 202, 236, 24, 234, 191, 31, - 226, 67, 173, 102, 215, 72, 122, 135, 188, 97, 161, 137, 28, 51, 54, 206, - 250, 193, 172, 63, 66, 139, 40, 232, 5, 173, 197, 54, 93, 27, 227, 61, - 113, 139, 171, 44, 57, 90, 208, 249, 166, 125, 38, 21, 160, 27, 231, 228, - 52, 131, 83, 68, 152, 50, 225, 100, 41, 97, 51, 56, 153, 228, 62, 17, - 197, 51, 222, 119, 45, 207, 80, 53, 31, 191, 30, 185, 225, 107, 44, 89, - 58, 187, 62, 176, 23, 48, 168, 7, 246, 213, 230, 188, 122, 70, 201, 231, - 116, 49, 93, 60, 35, 43, 132, 115, 147, 160, 165, 88, 232, 47, 102, 17, - 28, 12, 27, 133, 85, 195, 94, 55, 236, 112, 101, 135, 107, 59, 236, 217, - 33, 53, 247, 91, 7, 246, 132, 120, 114, 89, 31, 189, 138, 162, 221, 65, - 97, 16, 22, 86, 54, 16, 103, 123, 188, 236, 80, 251, 216, 252, 138, 154, - 95, 111, 206, 15, 206, 150, 246, 240, 188, 142, 176, 37, 193, 134, 155, 115, - 250, 237, 209, 191, 213, 112, 35, 235, 188, 70, 231, 64, 22, 127, 169, 54, - 106, 205, 131, 40, 184, 156, 148, 172, 241, 178, 92, 41, 89, 235, 198, 131, - 78, 227, 251, 230, 1, 60, 85, 225, 165, 92, 31, 150, 41, 84, 76, 75, - 162, 227, 213, 253, 198, 134, 65, 63, 120, 23, 188, 9, 236, 178, 255, 220, - 43, 57, 149, 51, 244, 214, 230, 212, 90, 7, 30, 26, 93, 160, 119, 233, - 70, 237, 184, 77, 111, 231, 101, 209, 57, 119, 147, 196, 103, 235, 113, 172, - 95, 178, 122, 223, 197, 168, 190, 39, 208, 187, 37, 62, 26, 26, 194, 1, - 234, 144, 61, 72, 76, 39, 123, 18, 204, 81, 7, 125, 200, 138, 207, 148, - 232, 85, 179, 214, 62, 40, 185, 7, 103, 214, 170, 190, 132, 146, 245, 225, - 121, 85, 182, 113, 102, 193, 104, 91, 48, 220, 22, 140, 183, 37, 6, 252, - 252, 86, 231, 140, 218, 176, 45, 0, 10, 216, 134, 220, 159, 24, 182, 114, - 178, 118, 206, 89, 139, 54, 48, 109, 105, 103, 203, 150, 134, 71, 75, 244, - 147, 255, 174, 101, 51, 192, 211, 157, 136, 237, 94, 249, 245, 44, 89, 133, - 92, 204, 29, 91, 246, 209, 106, 228, 214, 125, 24, 87, 161, 80, 153, 185, - 131, 213, 153, 113, 165, 158, 179, 235, 248, 217, 62, 174, 136, 118, 14, 74, - 203, 42, 94, 22, 252, 90, 227, 58, 20, 252, 123, 97, 209, 138, 137, 17, - 13, 213, 208, 205, 184, 216, 168, 5, 212, 201, 88, 38, 251, 29, 72, 68, - 141, 241, 131, 251, 93, 86, 42, 94, 255, 239, 255, 94, 119, 185, 57, 202, - 89, 206, 199, 157, 227, 210, 41, 111, 54, 197, 114, 17, 125, 25, 193, 166, - 46, 44, 129, 203, 70, 4, 181, 244, 130, 57, 115, 27, 156, 62, 227, 11, - 78, 165, 92, 235, 86, 79, 242, 86, 189, 239, 128, 123, 74, 13, 204, 25, - 126, 164, 121, 112, 254, 156, 113, 89, 214, 226, 79, 144, 28, 21, 236, 176, - 199, 63, 191, 121, 254, 252, 135, 167, 63, 111, 190, 251, 14, 247, 219, 147, - 205, 134, 33, 206, 184, 118, 96, 49, 234, 187, 146, 17, 74, 85, 64, 226, - 107, 179, 149, 60, 150, 149, 52, 106, 71, 191, 191, 150, 55, 162, 22, 129, - 196, 161, 203, 18, 227, 116, 228, 170, 47, 112, 195, 66, 40, 188, 17, 123, - 16, 10, 254, 112, 250, 88, 121, 251, 159, 13, 208, 2, 116, 125, 50, 102, - 250, 149, 214, 167, 158, 128, 46, 223, 216, 151, 63, 218, 151, 143, 236, 203, - 135, 6, 70, 138, 222, 101, 1, 69, 188, 137, 46, 227, 130, 9, 111, 129, - 124, 31, 153, 206, 78, 3, 33, 187, 147, 46, 219, 186, 81, 44, 48, 193, - 147, 21, 156, 248, 186, 23, 36, 148, 131, 183, 165, 207, 87, 201, 21, 240, - 177, 222, 10, 0, 179, 88, 206, 150, 127, 10, 131, 39, 143, 75, 135, 168, - 53, 18, 255, 96, 99, 66, 196, 67, 237, 10, 49, 14, 60, 243, 245, 166, - 245, 225, 66, 72, 103, 40, 85, 8, 98, 240, 153, 196, 45, 178, 200, 74, - 62, 172, 229, 195, 111, 240, 48, 145, 2, 145, 174, 122, 156, 54, 243, 158, - 10, 84, 156, 12, 157, 106, 19, 184, 30, 197, 10, 69, 225, 35, 58, 137, - 187, 42, 224, 96, 228, 125, 97, 141, 95, 24, 62, 64, 210, 94, 43, 0, - 151, 227, 247, 133, 35, 40, 220, 43, 128, 229, 96, 34, 45, 152, 73, 11, - 166, 210, 186, 124, 88, 24, 95, 33, 220, 186, 197, 170, 114, 163, 100, 24, - 22, 140, 226, 176, 189, 161, 3, 89, 150, 74, 234, 51, 142, 118, 30, 149, - 127, 47, 188, 201, 28, 7, 1, 33, 181, 76, 158, 15, 156, 198, 112, 246, - 226, 58, 66, 246, 151, 234, 69, 211, 141, 164, 226, 8, 171, 2, 118, 169, - 216, 243, 47, 129, 82, 61, 100, 29, 114, 63, 246, 155, 95, 58, 131, 15, - 43, 65, 177, 114, 61, 98, 231, 118, 100, 55, 203, 229, 123, 207, 42, 15, - 139, 196, 49, 212, 100, 204, 6, 12, 77, 64, 150, 145, 94, 207, 31, 209, - 173, 44, 213, 246, 107, 201, 41, 223, 234, 4, 72, 216, 126, 197, 107, 88, - 124, 41, 162, 57, 236, 4, 150, 196, 37, 198, 53, 232, 16, 163, 116, 128, - 156, 205, 151, 26, 81, 151, 70, 212, 43, 68, 169, 47, 198, 139, 212, 26, - 19, 172, 22, 59, 237, 136, 195, 64, 133, 124, 244, 213, 161, 218, 83, 83, - 109, 205, 77, 50, 47, 234, 180, 136, 202, 10, 248, 153, 207, 58, 157, 43, - 31, 119, 81, 171, 212, 40, 127, 127, 70, 156, 27, 252, 9, 14, 235, 252, - 238, 51, 224, 112, 226, 169, 109, 136, 96, 153, 233, 106, 177, 46, 142, 59, - 181, 195, 156, 56, 247, 234, 59, 219, 176, 96, 155, 27, 126, 170, 227, 231, - 59, 98, 120, 99, 59, 249, 38, 159, 151, 238, 5, 6, 63, 109, 176, 104, - 134, 55, 124, 13, 118, 13, 99, 24, 188, 32, 39, 80, 196, 18, 222, 89, - 193, 186, 255, 254, 140, 200, 200, 249, 93, 120, 113, 190, 63, 83, 204, 228, - 206, 239, 46, 74, 218, 123, 249, 14, 55, 244, 169, 137, 88, 28, 48, 139, - 100, 68, 143, 12, 45, 93, 164, 203, 15, 74, 157, 218, 185, 140, 203, 69, - 236, 3, 235, 149, 236, 103, 21, 84, 131, 98, 123, 27, 133, 246, 118, 219, - 33, 127, 127, 52, 150, 135, 192, 111, 217, 86, 10, 69, 93, 91, 18, 191, - 221, 62, 144, 38, 197, 232, 116, 33, 141, 234, 48, 156, 6, 51, 245, 197, - 53, 12, 164, 244, 197, 152, 174, 100, 195, 198, 47, 40, 90, 44, 140, 25, - 16, 155, 75, 188, 205, 26, 16, 71, 158, 201, 74, 108, 54, 178, 221, 214, - 248, 5, 182, 11, 3, 99, 41, 184, 54, 30, 22, 133, 12, 16, 34, 200, - 233, 159, 149, 71, 2, 96, 198, 197, 17, 98, 34, 44, 184, 96, 117, 227, - 240, 203, 69, 48, 73, 108, 21, 184, 196, 104, 140, 253, 238, 250, 179, 89, - 152, 4, 69, 45, 62, 134, 101, 24, 206, 89, 63, 156, 144, 59, 37, 79, - 28, 6, 112, 114, 73, 54, 201, 176, 239, 52, 213, 69, 150, 76, 172, 216, - 43, 218, 55, 100, 199, 243, 62, 143, 28, 139, 87, 118, 128, 35, 26, 128, - 37, 176, 50, 151, 183, 80, 35, 36, 17, 148, 254, 86, 117, 203, 223, 63, - 187, 171, 110, 156, 243, 162, 118, 144, 223, 250, 241, 240, 209, 202, 210, 19, - 223, 30, 127, 179, 169, 67, 128, 122, 86, 107, 245, 0, 102, 220, 248, 172, - 202, 207, 143, 245, 26, 63, 189, 213, 196, 241, 77, 226, 30, 60, 166, 67, - 255, 15, 10, 28, 105, 22, 96, 0, 163, 57, 187, 72, 174, 27, 138, 150, - 124, 41, 222, 19, 169, 31, 61, 130, 11, 154, 89, 188, 29, 195, 7, 4, - 23, 20, 84, 129, 243, 122, 36, 61, 77, 18, 60, 97, 39, 132, 11, 85, - 16, 216, 184, 145, 49, 224, 85, 198, 221, 38, 22, 5, 91, 87, 44, 199, - 137, 203, 161, 76, 198, 253, 130, 7, 212, 123, 156, 166, 2, 244, 140, 21, - 199, 206, 129, 228, 94, 227, 199, 181, 93, 149, 245, 176, 115, 168, 200, 27, - 3, 93, 165, 236, 136, 44, 170, 69, 53, 17, 26, 154, 113, 35, 168, 191, - 53, 190, 47, 21, 94, 83, 54, 247, 96, 85, 167, 134, 161, 53, 219, 61, - 88, 39, 47, 13, 44, 243, 156, 212, 58, 177, 11, 85, 246, 26, 94, 235, - 29, 92, 32, 165, 231, 80, 215, 47, 120, 247, 192, 219, 163, 180, 95, 68, - 218, 47, 144, 246, 18, 210, 170, 103, 44, 104, 216, 129, 99, 199, 227, 14, - 245, 189, 20, 153, 94, 66, 166, 55, 144, 201, 61, 24, 132, 243, 210, 75, - 251, 121, 249, 224, 37, 84, 243, 92, 118, 17, 102, 163, 2, 67, 79, 169, - 207, 237, 151, 24, 8, 232, 99, 68, 168, 4, 33, 111, 236, 95, 224, 172, - 87, 254, 64, 67, 13, 31, 118, 183, 113, 175, 112, 134, 116, 17, 59, 173, - 161, 116, 185, 254, 164, 37, 37, 95, 116, 105, 110, 71, 196, 42, 142, 217, - 156, 77, 65, 197, 40, 180, 216, 211, 69, 72, 209, 59, 13, 188, 45, 183, - 70, 92, 147, 56, 226, 179, 15, 53, 52, 31, 250, 80, 45, 37, 73, 183, - 201, 157, 65, 129, 35, 163, 130, 44, 200, 47, 179, 36, 235, 80, 147, 16, - 146, 25, 136, 60, 102, 238, 42, 182, 127, 226, 154, 172, 114, 7, 201, 253, - 151, 236, 40, 97, 244, 169, 72, 114, 13, 123, 120, 147, 138, 196, 44, 67, - 121, 139, 194, 252, 82, 131, 14, 88, 236, 199, 145, 212, 72, 162, 225, 184, - 28, 9, 93, 164, 248, 205, 100, 235, 247, 36, 165, 202, 220, 204, 92, 32, - 230, 25, 47, 41, 94, 230, 244, 75, 219, 227, 248, 214, 85, 94, 207, 166, - 98, 29, 200, 216, 6, 218, 237, 107, 126, 228, 2, 229, 54, 55, 185, 198, - 85, 34, 11, 104, 14, 246, 133, 95, 125, 238, 76, 63, 123, 139, 171, 199, - 141, 220, 174, 237, 176, 183, 158, 218, 91, 79, 125, 27, 214, 83, 123, 77, - 192, 191, 170, 21, 148, 67, 1, 11, 51, 150, 225, 93, 21, 45, 103, 93, - 249, 55, 249, 117, 42, 191, 109, 85, 189, 238, 115, 71, 251, 201, 165, 170, - 217, 169, 126, 124, 41, 43, 239, 99, 99, 119, 248, 137, 99, 121, 242, 40, - 79, 142, 228, 55, 138, 255, 183, 10, 180, 50, 64, 182, 171, 203, 207, 174, - 15, 58, 68, 46, 27, 85, 203, 73, 69, 219, 251, 128, 198, 87, 72, 212, - 170, 78, 66, 240, 84, 31, 240, 86, 11, 207, 162, 172, 17, 171, 36, 170, - 223, 43, 77, 168, 18, 24, 119, 19, 93, 20, 70, 84, 25, 146, 149, 171, - 184, 168, 212, 112, 144, 81, 89, 228, 116, 241, 185, 239, 125, 140, 20, 194, - 216, 29, 33, 192, 78, 189, 155, 84, 116, 177, 164, 220, 97, 82, 169, 229, - 72, 37, 141, 55, 122, 126, 124, 91, 213, 13, 123, 201, 165, 132, 110, 95, - 178, 53, 29, 208, 212, 214, 250, 13, 116, 45, 101, 88, 204, 227, 37, 233, - 20, 218, 253, 19, 181, 170, 212, 16, 73, 106, 184, 155, 237, 97, 143, 226, - 16, 74, 60, 172, 145, 26, 61, 40, 75, 219, 111, 140, 49, 183, 87, 170, - 254, 106, 168, 212, 232, 198, 110, 129, 110, 255, 209, 178, 14, 113, 155, 56, - 214, 208, 38, 100, 128, 59, 61, 52, 112, 241, 174, 188, 96, 68, 94, 226, - 0, 49, 221, 221, 26, 5, 230, 186, 248, 60, 28, 135, 234, 94, 47, 106, - 54, 110, 83, 180, 173, 139, 134, 225, 84, 198, 142, 139, 106, 203, 168, 62, - 8, 151, 19, 216, 49, 131, 168, 62, 14, 251, 31, 23, 211, 168, 10, 168, - 111, 58, 12, 250, 81, 125, 4, 213, 85, 169, 83, 85, 234, 84, 253, 171, - 248, 159, 67, 51, 63, 147, 61, 139, 130, 178, 208, 69, 130, 116, 195, 70, - 96, 132, 118, 173, 235, 226, 20, 35, 61, 206, 73, 137, 251, 112, 83, 235, - 7, 227, 203, 223, 184, 127, 229, 238, 212, 155, 15, 187, 179, 254, 38, 241, - 248, 22, 24, 193, 92, 70, 16, 176, 56, 108, 206, 56, 232, 215, 252, 69, - 29, 231, 167, 27, 183, 21, 213, 147, 122, 194, 154, 185, 34, 56, 171, 164, - 168, 219, 209, 151, 87, 46, 82, 98, 216, 196, 81, 82, 242, 194, 212, 136, - 16, 55, 24, 147, 70, 9, 15, 35, 72, 33, 145, 172, 140, 46, 68, 195, - 70, 167, 115, 247, 55, 231, 133, 10, 185, 197, 184, 118, 232, 6, 197, 177, - 233, 106, 188, 105, 183, 133, 91, 87, 164, 137, 36, 41, 20, 151, 204, 252, - 144, 219, 68, 53, 22, 58, 215, 182, 132, 12, 249, 206, 210, 237, 44, 235, - 238, 189, 161, 219, 25, 194, 207, 219, 206, 170, 186, 116, 209, 132, 166, 58, - 116, 239, 5, 165, 165, 91, 121, 91, 7, 38, 96, 232, 86, 222, 213, 45, - 188, 47, 236, 163, 245, 74, 249, 14, 185, 10, 84, 14, 208, 232, 95, 232, - 178, 231, 14, 35, 232, 117, 52, 68, 98, 91, 169, 17, 16, 72, 55, 0, - 93, 72, 172, 201, 195, 234, 49, 143, 34, 113, 169, 123, 33, 116, 206, 81, - 192, 95, 75, 34, 66, 216, 226, 156, 89, 186, 182, 14, 15, 208, 186, 70, - 56, 193, 35, 162, 94, 86, 100, 226, 220, 227, 7, 5, 98, 113, 120, 252, - 118, 78, 246, 15, 117, 135, 68, 60, 142, 139, 153, 212, 110, 39, 234, 98, - 141, 35, 99, 80, 109, 111, 236, 134, 66, 221, 187, 153, 125, 176, 232, 20, - 139, 210, 105, 202, 145, 67, 22, 75, 220, 237, 224, 2, 14, 247, 139, 142, - 181, 192, 224, 45, 248, 112, 189, 216, 152, 182, 74, 209, 122, 0, 91, 133, - 119, 121, 193, 172, 133, 198, 64, 188, 198, 128, 146, 42, 3, 49, 69, 128, - 157, 122, 55, 159, 170, 9, 143, 218, 174, 221, 84, 83, 97, 121, 167, 20, - 114, 143, 116, 162, 29, 31, 47, 18, 85, 87, 180, 208, 222, 187, 251, 216, - 31, 88, 255, 170, 7, 214, 63, 217, 241, 150, 178, 49, 119, 51, 87, 199, - 35, 137, 90, 72, 186, 229, 66, 215, 14, 249, 166, 231, 28, 65, 188, 241, - 214, 234, 1, 99, 6, 175, 182, 246, 166, 114, 160, 105, 137, 91, 86, 101, - 159, 187, 158, 23, 186, 255, 58, 43, 166, 29, 78, 38, 151, 243, 97, 158, - 5, 200, 195, 57, 172, 128, 69, 202, 42, 37, 237, 116, 200, 228, 14, 249, - 171, 28, 146, 49, 212, 157, 201, 32, 46, 30, 64, 152, 195, 228, 89, 113, - 223, 206, 221, 110, 32, 125, 59, 84, 124, 102, 205, 104, 146, 85, 109, 174, - 107, 116, 184, 26, 109, 42, 37, 254, 123, 27, 253, 184, 75, 231, 187, 252, - 115, 95, 199, 182, 228, 98, 42, 167, 177, 213, 45, 159, 76, 229, 221, 116, - 86, 60, 157, 207, 244, 9, 65, 253, 139, 109, 62, 158, 218, 41, 227, 133, - 215, 97, 52, 175, 38, 22, 12, 59, 25, 100, 237, 143, 46, 127, 182, 61, - 232, 139, 112, 118, 233, 77, 24, 30, 113, 151, 97, 248, 5, 172, 65, 121, - 156, 71, 163, 167, 233, 100, 193, 237, 134, 194, 106, 43, 183, 16, 59, 221, - 168, 213, 132, 79, 13, 120, 8, 240, 22, 5, 248, 182, 248, 106, 182, 87, - 35, 223, 57, 108, 130, 191, 144, 202, 117, 87, 184, 227, 73, 197, 251, 205, - 216, 91, 9, 223, 214, 147, 228, 74, 195, 128, 11, 205, 187, 35, 151, 189, - 83, 63, 204, 32, 181, 121, 227, 143, 2, 255, 66, 160, 86, 133, 235, 154, - 17, 220, 78, 3, 116, 155, 106, 110, 134, 149, 229, 159, 26, 181, 166, 110, - 243, 20, 155, 88, 153, 242, 166, 34, 237, 196, 121, 133, 179, 73, 53, 155, - 179, 141, 175, 51, 112, 117, 121, 158, 220, 148, 174, 189, 125, 87, 125, 46, - 110, 27, 83, 216, 63, 246, 201, 75, 119, 192, 13, 221, 196, 240, 95, 113, - 41, 51, 130, 249, 87, 74, 214, 196, 201, 65, 51, 43, 76, 242, 34, 198, - 253, 239, 227, 245, 118, 150, 44, 8, 159, 186, 6, 187, 178, 148, 159, 137, - 111, 133, 11, 224, 235, 4, 150, 99, 15, 72, 135, 115, 155, 105, 80, 60, - 95, 192, 241, 226, 250, 204, 58, 180, 173, 163, 243, 219, 27, 88, 142, 199, - 85, 167, 33, 87, 163, 176, 244, 87, 206, 0, 210, 164, 58, 62, 4, 168, - 0, 45, 194, 65, 70, 56, 119, 180, 191, 116, 218, 243, 240, 123, 30, 126, - 199, 221, 171, 238, 171, 221, 153, 120, 173, 20, 249, 49, 112, 243, 249, 247, - 83, 52, 78, 97, 180, 104, 67, 226, 202, 249, 14, 71, 104, 119, 20, 67, - 109, 19, 48, 19, 218, 77, 169, 69, 231, 199, 28, 187, 40, 130, 209, 227, - 150, 193, 37, 242, 255, 217, 251, 242, 199, 182, 109, 100, 255, 223, 245, 87, - 160, 122, 204, 70, 7, 37, 243, 144, 100, 59, 169, 178, 47, 113, 154, 180, - 111, 155, 54, 47, 201, 219, 166, 235, 56, 254, 82, 18, 109, 113, 163, 107, - 73, 201, 71, 181, 250, 223, 191, 51, 3, 128, 4, 72, 232, 72, 154, 171, - 93, 181, 177, 77, 130, 32, 8, 130, 192, 92, 152, 249, 140, 92, 36, 210, - 254, 78, 190, 15, 107, 45, 219, 148, 237, 253, 60, 107, 140, 240, 200, 248, - 31, 148, 133, 144, 28, 43, 55, 153, 101, 66, 79, 187, 141, 213, 21, 164, - 0, 40, 227, 109, 136, 191, 250, 197, 15, 9, 242, 228, 163, 234, 82, 152, - 103, 69, 112, 250, 170, 201, 138, 139, 128, 144, 87, 40, 241, 137, 59, 12, - 82, 111, 10, 103, 207, 33, 36, 213, 68, 133, 69, 16, 123, 181, 78, 167, - 85, 0, 23, 150, 77, 61, 129, 121, 52, 148, 201, 189, 54, 181, 183, 189, - 226, 251, 14, 138, 199, 7, 5, 55, 172, 198, 209, 128, 224, 109, 119, 25, - 25, 111, 215, 145, 41, 190, 181, 97, 104, 80, 122, 248, 10, 199, 198, 231, - 99, 51, 132, 21, 241, 94, 131, 227, 179, 66, 150, 98, 227, 216, 24, 94, - 219, 52, 56, 199, 222, 215, 56, 56, 173, 108, 112, 72, 126, 217, 105, 100, - 90, 187, 142, 76, 241, 157, 13, 35, 195, 161, 72, 118, 24, 153, 76, 28, - 220, 58, 54, 107, 170, 126, 198, 212, 12, 222, 129, 115, 108, 98, 62, 57, - 114, 79, 12, 104, 19, 70, 183, 68, 57, 60, 55, 221, 108, 213, 56, 98, - 63, 163, 124, 45, 248, 163, 160, 84, 145, 159, 88, 14, 196, 127, 13, 179, - 41, 246, 34, 159, 134, 108, 135, 110, 44, 45, 159, 103, 117, 167, 16, 193, - 212, 199, 154, 28, 193, 165, 159, 167, 143, 238, 182, 154, 9, 197, 69, 165, - 131, 97, 118, 2, 222, 235, 184, 169, 93, 110, 105, 32, 102, 89, 43, 222, - 42, 243, 57, 173, 55, 217, 113, 39, 75, 166, 128, 229, 5, 180, 51, 195, - 184, 243, 148, 13, 212, 229, 186, 200, 26, 126, 158, 246, 186, 142, 206, 167, - 190, 124, 160, 75, 221, 206, 160, 39, 149, 114, 232, 72, 61, 193, 237, 146, - 81, 208, 59, 106, 50, 197, 55, 81, 116, 174, 208, 52, 170, 191, 105, 62, - 167, 58, 207, 44, 215, 95, 196, 87, 4, 83, 137, 48, 180, 237, 134, 117, - 216, 112, 154, 46, 134, 252, 88, 92, 49, 179, 58, 244, 103, 105, 117, 234, - 214, 81, 93, 92, 67, 55, 109, 71, 110, 196, 28, 27, 155, 194, 132, 113, - 174, 151, 54, 230, 58, 188, 181, 99, 209, 154, 235, 214, 45, 215, 55, 182, - 231, 154, 251, 230, 66, 231, 220, 172, 119, 174, 232, 158, 43, 251, 231, 66, - 7, 93, 115, 15, 93, 115, 23, 61, 232, 162, 151, 117, 209, 19, 93, 244, - 92, 209, 162, 7, 125, 244, 138, 125, 132, 89, 6, 13, 192, 88, 98, 20, - 129, 88, 224, 2, 97, 29, 148, 170, 121, 24, 79, 52, 84, 117, 194, 51, - 18, 208, 165, 247, 104, 123, 171, 135, 69, 118, 118, 168, 234, 162, 41, 253, - 17, 77, 101, 2, 143, 131, 62, 130, 131, 198, 83, 225, 211, 64, 58, 136, - 60, 161, 191, 168, 145, 164, 199, 143, 116, 193, 139, 144, 146, 78, 120, 2, - 243, 15, 70, 70, 250, 84, 146, 177, 24, 168, 233, 13, 12, 211, 156, 94, - 158, 163, 208, 79, 111, 46, 248, 185, 173, 159, 154, 220, 62, 83, 88, 38, - 110, 208, 144, 41, 55, 124, 213, 169, 19, 51, 239, 233, 85, 8, 128, 70, - 169, 178, 6, 239, 39, 195, 248, 192, 76, 228, 104, 52, 19, 77, 97, 184, - 12, 89, 204, 230, 211, 44, 99, 52, 250, 207, 163, 150, 194, 130, 201, 45, - 213, 32, 244, 94, 244, 14, 72, 40, 135, 83, 98, 194, 185, 253, 97, 18, - 205, 35, 104, 49, 111, 76, 231, 9, 144, 63, 186, 137, 123, 45, 112, 201, - 48, 72, 88, 15, 21, 81, 226, 203, 8, 168, 149, 204, 34, 180, 80, 246, - 110, 233, 21, 40, 51, 251, 244, 130, 253, 79, 128, 133, 175, 130, 184, 7, - 26, 153, 205, 6, 97, 210, 143, 163, 30, 194, 151, 76, 168, 222, 12, 228, - 238, 123, 91, 240, 124, 21, 159, 6, 36, 85, 163, 240, 38, 186, 64, 123, - 41, 168, 144, 205, 73, 56, 63, 184, 132, 123, 195, 248, 246, 96, 28, 244, - 135, 232, 237, 126, 0, 83, 64, 204, 144, 31, 198, 151, 7, 95, 64, 181, - 243, 15, 156, 142, 57, 241, 81, 54, 59, 209, 44, 147, 157, 112, 56, 109, - 219, 23, 68, 55, 77, 121, 22, 206, 70, 1, 176, 5, 10, 124, 98, 50, - 142, 147, 19, 32, 153, 202, 129, 67, 2, 20, 167, 189, 241, 1, 238, 135, - 61, 128, 15, 224, 73, 48, 158, 46, 46, 70, 168, 42, 113, 100, 238, 244, - 220, 214, 79, 11, 150, 127, 92, 68, 199, 24, 213, 170, 44, 34, 13, 54, - 9, 227, 121, 180, 37, 118, 50, 29, 114, 199, 134, 204, 88, 40, 12, 217, - 218, 142, 17, 117, 27, 213, 39, 14, 26, 231, 59, 118, 171, 99, 251, 126, - 190, 134, 151, 214, 56, 108, 219, 199, 142, 221, 41, 32, 190, 250, 105, 13, - 247, 240, 216, 118, 143, 224, 199, 61, 204, 87, 106, 49, 21, 157, 206, 131, - 71, 185, 237, 163, 207, 63, 189, 58, 7, 30, 34, 128, 26, 166, 87, 95, - 249, 66, 187, 216, 13, 82, 150, 239, 176, 152, 45, 175, 235, 110, 7, 113, - 15, 232, 15, 79, 130, 202, 227, 193, 48, 26, 57, 24, 207, 186, 150, 15, - 242, 10, 227, 225, 6, 108, 137, 25, 168, 218, 192, 16, 225, 74, 149, 96, - 26, 24, 28, 53, 186, 109, 71, 164, 222, 92, 226, 149, 7, 148, 85, 75, - 164, 112, 106, 178, 35, 54, 97, 46, 65, 180, 162, 146, 157, 118, 209, 5, - 198, 139, 16, 121, 56, 221, 190, 69, 215, 203, 186, 247, 214, 122, 176, 66, - 200, 186, 0, 166, 135, 204, 223, 234, 96, 162, 172, 113, 147, 11, 77, 117, - 142, 193, 17, 204, 152, 67, 246, 124, 96, 213, 215, 40, 200, 181, 68, 204, - 90, 25, 174, 119, 79, 173, 101, 11, 195, 203, 207, 238, 195, 217, 169, 95, - 187, 177, 253, 179, 114, 73, 131, 75, 160, 38, 155, 50, 49, 21, 133, 171, - 173, 53, 155, 156, 4, 147, 171, 32, 145, 179, 31, 143, 237, 236, 208, 196, - 111, 116, 213, 166, 247, 224, 73, 20, 195, 231, 28, 164, 25, 248, 136, 178, - 170, 122, 76, 33, 232, 224, 176, 128, 126, 166, 123, 95, 182, 104, 179, 237, - 72, 67, 71, 11, 226, 153, 102, 160, 110, 57, 98, 71, 104, 93, 207, 222, - 76, 80, 223, 10, 251, 83, 248, 218, 74, 231, 88, 190, 119, 169, 150, 197, - 171, 170, 153, 4, 137, 195, 204, 227, 133, 130, 93, 255, 254, 47, 227, 250, - 31, 248, 54, 251, 61, 194, 63, 170, 167, 248, 122, 51, 104, 95, 44, 54, - 149, 144, 53, 69, 206, 215, 202, 18, 49, 52, 44, 175, 54, 139, 14, 112, - 186, 172, 222, 46, 17, 71, 67, 41, 168, 50, 30, 120, 235, 161, 53, 121, - 10, 43, 94, 46, 122, 208, 134, 136, 128, 17, 136, 129, 229, 242, 213, 159, - 224, 44, 11, 49, 20, 42, 75, 122, 39, 31, 210, 201, 63, 164, 179, 195, - 67, 228, 51, 232, 33, 220, 51, 77, 62, 3, 30, 114, 8, 15, 145, 218, - 96, 93, 42, 196, 160, 207, 137, 248, 223, 223, 243, 118, 133, 151, 51, 191, - 155, 212, 63, 117, 95, 117, 157, 144, 173, 221, 200, 20, 95, 198, 176, 135, - 41, 8, 228, 171, 240, 134, 80, 255, 239, 81, 198, 238, 69, 140, 177, 98, - 146, 94, 230, 75, 42, 27, 99, 174, 60, 46, 141, 40, 136, 138, 79, 162, - 30, 48, 143, 164, 0, 41, 170, 110, 249, 125, 55, 238, 77, 181, 141, 205, - 206, 214, 13, 168, 207, 175, 201, 156, 196, 64, 69, 36, 51, 161, 99, 59, - 59, 220, 20, 179, 150, 3, 219, 204, 121, 209, 136, 109, 100, 35, 69, 94, - 159, 236, 212, 245, 54, 11, 50, 251, 253, 185, 253, 254, 220, 87, 187, 63, - 183, 103, 245, 127, 8, 86, 15, 122, 139, 99, 118, 238, 239, 11, 82, 72, - 27, 153, 226, 132, 59, 34, 46, 45, 184, 171, 141, 160, 80, 75, 31, 253, - 21, 224, 184, 140, 72, 117, 5, 66, 185, 158, 89, 137, 230, 12, 204, 42, - 190, 77, 96, 204, 37, 5, 166, 19, 91, 57, 222, 37, 110, 120, 99, 238, - 238, 181, 142, 53, 223, 13, 46, 195, 68, 231, 113, 238, 94, 156, 253, 51, - 204, 241, 246, 129, 123, 108, 246, 233, 236, 203, 217, 182, 139, 98, 158, 116, - 151, 201, 42, 23, 150, 200, 163, 18, 43, 20, 150, 232, 87, 15, 218, 105, - 136, 252, 44, 186, 33, 131, 62, 69, 44, 34, 68, 1, 90, 3, 45, 183, - 102, 249, 119, 48, 217, 253, 50, 74, 86, 172, 198, 83, 203, 9, 248, 65, - 220, 129, 72, 162, 203, 113, 208, 133, 169, 137, 104, 121, 117, 68, 19, 160, - 18, 70, 191, 107, 93, 120, 80, 29, 51, 75, 151, 16, 52, 145, 7, 58, - 208, 206, 0, 202, 153, 10, 192, 23, 70, 117, 252, 210, 141, 42, 8, 183, - 247, 155, 109, 37, 148, 225, 228, 151, 111, 17, 209, 195, 253, 247, 191, 127, - 121, 208, 69, 187, 36, 20, 245, 191, 181, 18, 59, 58, 248, 5, 164, 176, - 234, 93, 30, 251, 79, 105, 85, 200, 72, 222, 139, 49, 224, 144, 146, 93, - 99, 55, 74, 255, 204, 20, 254, 20, 185, 204, 59, 35, 20, 27, 129, 190, - 229, 42, 166, 11, 132, 117, 161, 29, 28, 163, 131, 94, 110, 45, 111, 32, - 19, 252, 243, 108, 160, 19, 74, 146, 1, 149, 100, 156, 43, 128, 136, 230, - 226, 204, 124, 139, 168, 83, 200, 91, 83, 187, 151, 147, 179, 62, 155, 100, - 60, 175, 0, 187, 254, 34, 152, 12, 166, 99, 80, 195, 195, 129, 98, 162, - 238, 180, 219, 190, 98, 216, 50, 33, 184, 167, 70, 180, 162, 76, 248, 165, - 172, 253, 29, 208, 104, 214, 88, 179, 10, 3, 185, 219, 226, 249, 169, 187, - 244, 8, 170, 195, 183, 57, 232, 94, 197, 90, 150, 17, 55, 41, 140, 251, - 232, 37, 105, 121, 229, 213, 95, 91, 181, 235, 97, 205, 242, 238, 193, 28, - 175, 114, 192, 67, 80, 211, 208, 100, 84, 206, 99, 25, 149, 57, 114, 146, - 184, 134, 219, 181, 132, 64, 195, 177, 146, 64, 167, 122, 198, 51, 26, 19, - 196, 16, 243, 108, 235, 39, 197, 172, 133, 117, 96, 97, 54, 172, 103, 148, - 131, 209, 175, 209, 1, 80, 174, 209, 237, 229, 148, 84, 193, 159, 236, 229, - 91, 184, 210, 176, 90, 119, 16, 160, 8, 158, 178, 146, 17, 68, 25, 74, - 207, 90, 131, 212, 247, 193, 232, 2, 253, 5, 248, 132, 28, 138, 51, 91, - 61, 217, 98, 150, 170, 160, 89, 74, 124, 75, 238, 6, 51, 147, 201, 39, - 146, 44, 2, 145, 12, 65, 74, 112, 109, 150, 175, 77, 157, 93, 38, 116, - 252, 52, 29, 225, 182, 138, 79, 131, 49, 80, 159, 109, 181, 62, 134, 251, - 101, 250, 190, 233, 232, 237, 240, 202, 230, 228, 224, 237, 156, 217, 250, 165, - 220, 199, 65, 159, 88, 173, 230, 145, 237, 233, 122, 108, 90, 149, 15, 230, - 150, 202, 132, 253, 158, 230, 180, 104, 219, 229, 151, 180, 73, 132, 188, 52, - 10, 198, 83, 242, 102, 58, 33, 168, 215, 178, 188, 198, 42, 192, 59, 155, - 213, 172, 74, 86, 192, 107, 202, 243, 213, 102, 217, 197, 205, 237, 126, 237, - 133, 147, 63, 170, 112, 226, 29, 120, 190, 89, 0, 31, 166, 116, 164, 20, - 12, 254, 185, 72, 4, 214, 94, 34, 247, 141, 178, 92, 226, 61, 52, 191, - 109, 36, 194, 37, 217, 24, 33, 57, 47, 219, 141, 227, 85, 169, 192, 150, - 243, 212, 105, 45, 95, 78, 123, 102, 96, 204, 223, 131, 182, 63, 23, 22, - 148, 33, 29, 219, 217, 225, 46, 210, 187, 71, 230, 232, 189, 225, 99, 111, - 248, 216, 27, 62, 246, 116, 247, 11, 236, 113, 12, 5, 5, 35, 195, 135, - 56, 17, 190, 219, 5, 66, 182, 158, 68, 138, 251, 12, 64, 48, 193, 85, - 32, 66, 137, 224, 200, 150, 7, 38, 210, 248, 28, 198, 124, 17, 247, 100, - 228, 36, 151, 66, 96, 192, 218, 27, 101, 175, 130, 102, 162, 135, 218, 228, - 237, 242, 197, 205, 188, 226, 158, 254, 126, 154, 255, 81, 167, 185, 71, 126, - 9, 198, 120, 86, 154, 135, 59, 232, 110, 4, 48, 154, 229, 35, 96, 179, - 81, 0, 237, 96, 162, 87, 215, 70, 120, 120, 11, 49, 98, 249, 14, 23, - 98, 78, 240, 12, 175, 248, 15, 129, 237, 142, 29, 86, 43, 233, 38, 147, - 84, 129, 146, 9, 76, 209, 95, 192, 47, 137, 45, 49, 102, 14, 113, 206, - 173, 146, 245, 112, 13, 248, 86, 134, 85, 247, 44, 136, 17, 193, 133, 214, - 221, 152, 142, 237, 236, 48, 23, 78, 150, 203, 103, 199, 67, 211, 212, 101, - 41, 252, 251, 12, 121, 239, 76, 213, 182, 164, 201, 54, 96, 26, 22, 214, - 95, 113, 141, 54, 91, 122, 156, 222, 195, 73, 148, 76, 231, 241, 116, 150, - 9, 82, 249, 13, 182, 135, 2, 131, 84, 185, 170, 209, 1, 178, 52, 101, - 105, 195, 221, 220, 245, 147, 197, 156, 253, 168, 100, 31, 47, 26, 45, 160, - 194, 247, 232, 47, 191, 193, 176, 241, 1, 233, 232, 227, 176, 7, 179, 226, - 229, 20, 254, 196, 151, 31, 78, 213, 199, 98, 2, 236, 98, 172, 16, 117, - 45, 247, 0, 115, 85, 121, 244, 219, 231, 241, 221, 54, 133, 230, 217, 214, - 145, 109, 29, 223, 65, 223, 216, 59, 235, 13, 1, 207, 130, 223, 210, 25, - 247, 155, 156, 111, 191, 101, 179, 237, 4, 4, 15, 213, 165, 209, 107, 241, - 228, 38, 138, 199, 224, 48, 234, 203, 48, 78, 50, 77, 229, 32, 185, 48, - 126, 134, 251, 174, 75, 250, 251, 19, 60, 30, 197, 88, 232, 11, 106, 198, - 19, 174, 244, 98, 174, 203, 68, 43, 254, 101, 24, 205, 67, 81, 174, 197, - 235, 36, 97, 124, 21, 138, 133, 240, 56, 26, 163, 116, 149, 249, 146, 184, - 234, 163, 161, 223, 57, 226, 79, 207, 250, 5, 198, 28, 159, 197, 159, 192, - 207, 62, 63, 221, 115, 41, 9, 183, 201, 153, 126, 76, 95, 37, 63, 13, - 74, 215, 93, 76, 219, 60, 236, 98, 214, 230, 152, 219, 109, 15, 16, 105, - 206, 206, 142, 68, 222, 24, 79, 245, 91, 199, 164, 53, 186, 159, 186, 136, - 116, 38, 176, 33, 120, 20, 60, 47, 121, 215, 68, 187, 147, 196, 247, 230, - 88, 117, 18, 119, 246, 27, 171, 157, 222, 195, 82, 15, 111, 202, 93, 97, - 91, 67, 59, 35, 187, 154, 119, 186, 152, 96, 160, 98, 196, 152, 191, 117, - 154, 4, 81, 95, 76, 53, 94, 118, 62, 166, 50, 187, 80, 178, 73, 245, - 202, 165, 90, 20, 25, 82, 21, 181, 204, 219, 40, 120, 184, 57, 163, 15, - 134, 171, 134, 69, 48, 2, 78, 22, 244, 208, 13, 170, 185, 133, 80, 126, - 70, 79, 81, 19, 78, 98, 97, 36, 13, 180, 68, 196, 59, 212, 123, 104, - 131, 76, 194, 203, 49, 50, 189, 235, 0, 141, 88, 67, 132, 31, 71, 167, - 58, 66, 51, 44, 113, 248, 127, 135, 213, 191, 197, 13, 4, 203, 67, 224, - 127, 225, 89, 39, 93, 222, 24, 135, 231, 47, 213, 47, 144, 9, 223, 69, - 131, 61, 76, 57, 251, 198, 190, 173, 222, 205, 192, 143, 88, 157, 199, 203, - 139, 51, 2, 55, 15, 120, 132, 31, 78, 216, 82, 227, 180, 225, 115, 220, - 237, 49, 238, 25, 120, 103, 106, 180, 1, 92, 167, 24, 137, 238, 210, 106, - 11, 63, 150, 149, 64, 111, 194, 4, 230, 228, 241, 66, 21, 120, 66, 118, - 186, 228, 210, 37, 242, 125, 81, 47, 229, 35, 22, 154, 172, 174, 164, 124, - 24, 77, 251, 8, 32, 142, 92, 13, 33, 26, 27, 72, 75, 91, 165, 58, - 16, 77, 197, 152, 170, 206, 108, 117, 70, 243, 153, 156, 29, 238, 234, 135, - 81, 220, 7, 220, 219, 18, 246, 182, 132, 189, 45, 97, 175, 100, 125, 252, - 237, 178, 99, 179, 13, 55, 229, 20, 104, 75, 216, 44, 121, 242, 170, 60, - 211, 158, 46, 78, 74, 211, 131, 78, 253, 214, 170, 64, 226, 153, 6, 37, - 232, 231, 25, 240, 116, 129, 99, 34, 146, 14, 165, 71, 38, 162, 154, 219, - 225, 112, 225, 19, 45, 18, 248, 234, 2, 211, 52, 221, 180, 72, 210, 253, - 141, 36, 219, 217, 192, 195, 87, 113, 20, 32, 83, 199, 227, 108, 46, 160, - 72, 16, 205, 168, 80, 206, 4, 165, 232, 145, 144, 31, 185, 33, 185, 76, - 56, 234, 244, 172, 135, 113, 60, 189, 230, 173, 46, 250, 195, 16, 102, 90, - 218, 81, 217, 15, 86, 249, 121, 49, 71, 48, 253, 106, 214, 35, 173, 76, - 246, 77, 43, 76, 123, 169, 149, 10, 67, 182, 214, 34, 246, 68, 43, 225, - 125, 82, 138, 178, 125, 155, 108, 115, 138, 236, 47, 169, 8, 223, 193, 125, - 36, 5, 60, 79, 203, 143, 46, 37, 36, 194, 109, 204, 234, 252, 99, 10, - 131, 158, 230, 99, 63, 39, 101, 1, 170, 40, 238, 129, 185, 32, 42, 197, - 18, 212, 214, 244, 133, 155, 98, 173, 99, 39, 95, 237, 37, 16, 194, 126, - 52, 202, 145, 29, 7, 35, 215, 128, 104, 176, 191, 4, 227, 217, 125, 174, - 65, 112, 46, 135, 19, 1, 183, 38, 202, 170, 178, 137, 97, 84, 82, 162, - 147, 132, 203, 97, 131, 240, 178, 9, 213, 143, 211, 35, 16, 57, 248, 161, - 178, 173, 135, 210, 48, 38, 203, 44, 106, 29, 15, 39, 24, 106, 21, 5, - 9, 215, 122, 182, 238, 143, 175, 113, 250, 47, 70, 82, 101, 38, 128, 11, - 118, 59, 93, 48, 4, 126, 229, 193, 80, 98, 23, 18, 151, 58, 173, 7, - 37, 104, 76, 172, 6, 158, 176, 21, 203, 109, 186, 71, 34, 128, 206, 185, - 52, 150, 32, 198, 236, 0, 111, 161, 20, 45, 216, 40, 58, 135, 224, 108, - 32, 126, 19, 65, 141, 235, 8, 84, 193, 94, 150, 73, 58, 72, 210, 14, - 225, 13, 240, 172, 108, 58, 37, 52, 157, 68, 55, 102, 226, 233, 120, 1, - 250, 29, 179, 8, 53, 183, 38, 123, 60, 157, 220, 157, 227, 86, 230, 37, - 190, 200, 148, 222, 39, 24, 37, 212, 237, 31, 48, 111, 138, 210, 107, 241, - 54, 240, 201, 228, 25, 244, 36, 89, 196, 161, 218, 135, 36, 148, 79, 194, - 109, 204, 89, 144, 136, 119, 34, 232, 92, 10, 64, 107, 166, 213, 119, 203, - 116, 253, 31, 207, 220, 190, 128, 102, 131, 172, 106, 13, 188, 9, 78, 212, - 123, 60, 230, 118, 99, 116, 249, 3, 153, 124, 250, 144, 231, 190, 22, 183, - 90, 53, 86, 35, 165, 86, 40, 195, 135, 164, 12, 235, 44, 142, 171, 71, - 200, 226, 18, 138, 246, 150, 13, 251, 74, 67, 106, 226, 108, 86, 59, 117, - 80, 99, 225, 201, 74, 232, 176, 175, 68, 112, 235, 79, 39, 52, 92, 194, - 225, 243, 239, 240, 19, 244, 86, 66, 87, 166, 154, 30, 217, 157, 229, 25, - 250, 230, 219, 174, 5, 122, 23, 37, 88, 58, 61, 3, 46, 50, 29, 143, - 209, 129, 228, 174, 229, 220, 5, 42, 56, 29, 107, 115, 126, 28, 37, 68, - 118, 162, 9, 187, 171, 173, 252, 187, 140, 178, 14, 87, 202, 160, 199, 213, - 221, 85, 153, 133, 55, 179, 176, 63, 199, 101, 76, 88, 210, 201, 220, 102, - 101, 235, 155, 50, 155, 197, 83, 196, 251, 29, 84, 155, 228, 173, 162, 230, - 44, 134, 183, 131, 187, 129, 85, 227, 246, 236, 56, 128, 23, 203, 74, 242, - 121, 87, 78, 161, 152, 18, 92, 42, 57, 128, 225, 53, 70, 233, 29, 24, - 0, 93, 183, 30, 172, 206, 74, 28, 58, 95, 177, 109, 144, 101, 129, 15, - 18, 197, 100, 121, 232, 214, 102, 181, 200, 53, 135, 59, 230, 88, 215, 7, - 215, 85, 225, 164, 99, 13, 15, 134, 232, 137, 19, 59, 80, 41, 169, 89, - 237, 59, 208, 128, 203, 143, 59, 119, 50, 180, 126, 143, 197, 221, 165, 184, - 37, 118, 224, 209, 53, 248, 235, 54, 224, 184, 122, 80, 193, 46, 65, 35, - 148, 151, 56, 102, 117, 14, 136, 104, 197, 54, 252, 147, 153, 120, 185, 55, - 15, 79, 103, 35, 60, 109, 78, 27, 252, 45, 153, 149, 216, 86, 34, 107, - 146, 204, 135, 6, 217, 102, 187, 4, 212, 20, 164, 159, 24, 184, 80, 114, - 42, 235, 122, 182, 117, 148, 125, 106, 210, 121, 229, 40, 138, 60, 205, 186, - 180, 35, 103, 124, 97, 138, 171, 230, 32, 179, 152, 37, 103, 158, 8, 226, - 180, 113, 87, 189, 225, 173, 120, 78, 232, 88, 154, 111, 138, 221, 54, 78, - 196, 7, 248, 1, 119, 248, 158, 106, 183, 234, 235, 59, 193, 179, 172, 102, - 70, 164, 13, 189, 208, 199, 136, 190, 3, 190, 47, 16, 207, 137, 26, 184, - 90, 126, 150, 206, 254, 140, 121, 124, 83, 46, 241, 12, 64, 231, 42, 9, - 33, 35, 191, 54, 229, 138, 51, 14, 29, 25, 93, 167, 90, 251, 156, 51, - 47, 235, 228, 210, 114, 225, 109, 79, 249, 44, 76, 118, 154, 124, 218, 224, - 113, 232, 4, 52, 193, 136, 106, 181, 244, 168, 225, 98, 240, 144, 56, 161, - 236, 76, 202, 52, 21, 243, 147, 102, 28, 70, 119, 166, 249, 159, 113, 88, - 152, 54, 142, 14, 12, 36, 79, 84, 199, 147, 69, 35, 85, 206, 174, 186, - 112, 21, 125, 177, 93, 142, 133, 161, 92, 241, 212, 43, 192, 64, 82, 252, - 239, 52, 99, 6, 189, 233, 183, 136, 67, 113, 224, 173, 148, 59, 125, 188, - 211, 179, 5, 106, 248, 221, 155, 250, 237, 183, 93, 175, 134, 35, 117, 87, - 169, 213, 18, 181, 138, 79, 110, 139, 39, 123, 133, 43, 29, 12, 123, 6, - 94, 67, 41, 196, 209, 0, 68, 134, 167, 236, 250, 97, 250, 174, 180, 107, - 202, 58, 109, 156, 50, 233, 235, 121, 236, 65, 23, 135, 74, 185, 227, 40, - 189, 3, 222, 41, 214, 199, 230, 24, 181, 45, 20, 203, 253, 1, 147, 158, - 170, 92, 194, 189, 99, 183, 144, 216, 192, 88, 0, 217, 133, 171, 46, 171, - 193, 111, 88, 252, 125, 127, 192, 95, 157, 253, 211, 231, 73, 2, 229, 151, - 33, 156, 67, 188, 189, 68, 33, 105, 245, 113, 132, 188, 130, 221, 18, 30, - 135, 242, 61, 240, 115, 97, 142, 74, 160, 255, 13, 152, 118, 136, 233, 90, - 178, 94, 218, 240, 143, 242, 42, 191, 238, 222, 28, 84, 174, 97, 50, 34, - 176, 250, 65, 101, 136, 71, 113, 55, 232, 37, 8, 124, 216, 72, 254, 21, - 207, 43, 175, 223, 122, 245, 95, 223, 122, 213, 234, 253, 160, 27, 192, 135, - 242, 42, 183, 246, 13, 212, 250, 214, 105, 186, 136, 115, 113, 88, 163, 186, - 240, 213, 44, 175, 90, 67, 243, 155, 87, 11, 170, 229, 146, 236, 210, 77, - 161, 79, 56, 73, 212, 9, 5, 60, 18, 24, 19, 240, 183, 115, 168, 139, - 129, 196, 245, 48, 70, 190, 229, 179, 134, 122, 155, 167, 221, 230, 238, 122, - 155, 175, 221, 230, 237, 122, 91, 75, 187, 205, 223, 245, 182, 182, 118, 219, - 225, 174, 183, 117, 180, 219, 142, 118, 189, 237, 80, 187, 237, 120, 227, 109, - 92, 166, 123, 142, 122, 210, 75, 177, 234, 57, 132, 47, 148, 72, 58, 96, - 19, 137, 157, 76, 11, 176, 109, 107, 116, 70, 132, 91, 119, 59, 6, 101, - 143, 54, 246, 115, 110, 201, 110, 46, 101, 154, 73, 17, 243, 237, 114, 81, - 1, 83, 181, 178, 135, 147, 91, 69, 62, 125, 137, 114, 71, 10, 31, 133, - 16, 251, 29, 173, 63, 32, 201, 247, 163, 36, 115, 82, 56, 204, 57, 80, - 175, 87, 203, 76, 27, 88, 178, 176, 44, 240, 225, 130, 68, 200, 227, 220, - 236, 160, 244, 235, 151, 104, 64, 251, 10, 52, 70, 46, 122, 125, 82, 62, - 210, 172, 194, 247, 114, 135, 118, 109, 141, 13, 8, 27, 9, 41, 134, 111, - 38, 152, 201, 48, 243, 69, 5, 73, 154, 30, 171, 162, 237, 242, 199, 240, - 146, 24, 189, 146, 65, 173, 27, 144, 172, 63, 157, 140, 110, 217, 245, 48, - 156, 144, 10, 135, 26, 32, 189, 26, 85, 37, 161, 49, 74, 24, 79, 164, - 27, 14, 154, 111, 38, 105, 183, 26, 4, 87, 162, 40, 146, 98, 42, 193, - 16, 103, 133, 66, 54, 5, 37, 12, 39, 23, 19, 41, 42, 194, 180, 114, - 192, 85, 216, 4, 83, 98, 204, 163, 113, 104, 2, 47, 81, 65, 61, 78, - 48, 127, 57, 67, 140, 7, 242, 129, 13, 24, 10, 171, 160, 225, 137, 92, - 37, 101, 45, 149, 9, 40, 155, 243, 69, 47, 68, 248, 143, 131, 107, 196, - 55, 252, 235, 85, 183, 55, 187, 60, 60, 121, 250, 253, 225, 213, 201, 179, - 47, 162, 221, 120, 45, 51, 194, 135, 186, 246, 132, 196, 215, 145, 26, 192, - 122, 249, 95, 206, 205, 56, 252, 215, 34, 138, 249, 120, 146, 52, 207, 230, - 215, 83, 77, 14, 98, 223, 176, 202, 12, 47, 193, 183, 71, 53, 15, 134, - 29, 234, 222, 229, 122, 246, 143, 66, 71, 128, 47, 221, 159, 198, 24, 156, - 15, 83, 2, 212, 113, 161, 4, 228, 243, 123, 100, 219, 72, 65, 78, 123, - 170, 127, 211, 37, 248, 35, 212, 138, 206, 88, 147, 108, 132, 1, 124, 155, - 126, 60, 69, 188, 5, 37, 207, 5, 215, 22, 194, 241, 12, 116, 5, 167, - 129, 106, 83, 62, 89, 117, 118, 218, 104, 1, 253, 226, 169, 70, 212, 97, - 18, 247, 113, 68, 90, 145, 142, 214, 184, 217, 245, 81, 122, 201, 161, 200, - 248, 190, 58, 72, 44, 76, 251, 96, 162, 15, 152, 111, 68, 244, 26, 43, - 59, 246, 210, 177, 19, 144, 117, 83, 138, 11, 51, 69, 9, 114, 166, 207, - 62, 67, 176, 38, 121, 100, 178, 112, 238, 119, 127, 246, 187, 63, 251, 221, - 159, 175, 213, 64, 246, 199, 216, 253, 89, 239, 115, 68, 100, 71, 108, 254, - 100, 16, 11, 84, 90, 70, 76, 251, 60, 101, 90, 143, 82, 79, 13, 25, - 118, 116, 158, 143, 130, 72, 68, 190, 205, 240, 240, 156, 63, 38, 180, 243, - 5, 90, 42, 65, 160, 39, 27, 54, 201, 51, 33, 244, 33, 223, 21, 17, - 222, 73, 250, 134, 67, 138, 118, 183, 205, 189, 141, 46, 191, 8, 38, 151, - 185, 29, 7, 173, 214, 118, 32, 250, 151, 194, 61, 48, 3, 89, 216, 201, - 77, 245, 19, 57, 23, 185, 157, 53, 121, 18, 212, 49, 223, 236, 101, 196, - 120, 60, 41, 237, 31, 89, 238, 29, 4, 132, 111, 223, 145, 192, 32, 40, - 160, 100, 54, 36, 43, 177, 189, 82, 157, 231, 245, 226, 86, 78, 82, 75, - 101, 102, 175, 84, 132, 64, 27, 14, 83, 234, 45, 45, 191, 110, 181, 106, - 21, 235, 65, 221, 149, 230, 144, 149, 122, 107, 6, 116, 146, 154, 130, 206, - 74, 7, 76, 162, 84, 43, 14, 25, 207, 167, 163, 119, 1, 123, 60, 157, - 167, 25, 73, 224, 252, 124, 48, 157, 203, 132, 36, 242, 84, 67, 5, 86, - 183, 153, 138, 185, 101, 10, 145, 31, 104, 97, 201, 169, 47, 28, 156, 233, - 231, 139, 11, 220, 192, 216, 16, 224, 205, 193, 143, 182, 214, 43, 78, 86, - 13, 216, 232, 97, 182, 181, 164, 228, 37, 192, 62, 233, 190, 74, 122, 21, - 55, 95, 37, 15, 182, 159, 195, 1, 44, 34, 126, 124, 49, 204, 217, 13, - 180, 43, 253, 162, 48, 141, 165, 168, 167, 20, 46, 49, 152, 25, 93, 35, - 29, 196, 1, 240, 212, 156, 25, 60, 16, 150, 191, 229, 119, 163, 81, 52, - 75, 164, 18, 76, 111, 124, 30, 138, 50, 187, 88, 100, 78, 78, 132, 228, - 135, 35, 76, 249, 142, 30, 114, 59, 136, 22, 25, 197, 56, 202, 57, 224, - 22, 115, 30, 224, 151, 114, 240, 215, 87, 53, 212, 250, 16, 192, 112, 231, - 10, 100, 250, 39, 57, 190, 97, 114, 59, 1, 197, 14, 115, 193, 167, 2, - 239, 233, 147, 39, 175, 206, 240, 109, 224, 146, 228, 52, 28, 42, 94, 41, - 48, 229, 10, 146, 58, 244, 57, 15, 125, 246, 90, 168, 35, 31, 185, 199, - 158, 65, 139, 222, 80, 231, 59, 233, 204, 173, 231, 253, 216, 163, 40, 124, - 126, 49, 103, 231, 61, 111, 13, 61, 116, 30, 227, 62, 244, 124, 10, 234, - 110, 67, 153, 95, 1, 131, 59, 198, 17, 104, 111, 120, 71, 67, 114, 182, - 202, 101, 116, 5, 92, 42, 224, 169, 83, 185, 46, 76, 59, 207, 85, 6, - 35, 49, 101, 193, 132, 77, 121, 194, 128, 74, 18, 6, 99, 144, 34, 64, - 195, 162, 10, 236, 58, 130, 249, 6, 215, 131, 184, 23, 205, 227, 32, 230, - 64, 171, 217, 230, 241, 15, 115, 158, 147, 21, 168, 205, 16, 53, 234, 152, - 200, 73, 244, 27, 143, 130, 153, 135, 253, 225, 36, 250, 215, 2, 38, 55, - 60, 60, 195, 46, 141, 38, 155, 51, 179, 86, 202, 207, 240, 37, 26, 114, - 189, 188, 164, 87, 76, 224, 253, 123, 183, 236, 57, 61, 232, 133, 250, 32, - 221, 216, 17, 1, 225, 107, 70, 227, 131, 217, 162, 119, 0, 98, 207, 1, - 201, 0, 151, 151, 227, 243, 120, 54, 81, 193, 76, 77, 132, 67, 29, 100, - 124, 92, 144, 100, 80, 171, 18, 146, 21, 40, 196, 163, 120, 49, 153, 178, - 167, 193, 40, 140, 39, 33, 247, 37, 128, 210, 95, 65, 61, 101, 79, 167, - 139, 4, 70, 113, 161, 154, 156, 254, 39, 12, 38, 13, 120, 165, 97, 136, - 238, 191, 113, 56, 50, 227, 89, 25, 23, 220, 70, 155, 207, 32, 156, 7, - 209, 8, 186, 200, 199, 118, 70, 163, 14, 93, 156, 103, 175, 209, 204, 6, - 231, 50, 26, 207, 64, 43, 159, 147, 25, 8, 167, 240, 124, 58, 139, 250, - 205, 217, 112, 246, 215, 139, 174, 119, 244, 151, 121, 215, 117, 220, 150, 251, - 161, 214, 160, 100, 11, 189, 77, 71, 131, 23, 197, 184, 99, 251, 104, 186, - 24, 161, 180, 25, 111, 35, 200, 173, 3, 231, 248, 192, 105, 153, 118, 195, - 21, 154, 105, 16, 226, 120, 26, 170, 122, 143, 45, 61, 50, 201, 251, 7, - 109, 103, 117, 135, 53, 196, 158, 51, 187, 232, 99, 254, 89, 225, 132, 43, - 130, 118, 155, 32, 152, 73, 111, 87, 66, 42, 80, 31, 65, 4, 62, 7, - 186, 110, 32, 219, 107, 213, 3, 173, 177, 12, 8, 157, 18, 6, 230, 243, - 89, 153, 120, 7, 37, 20, 106, 60, 194, 153, 153, 231, 33, 231, 99, 188, - 166, 228, 23, 50, 95, 219, 202, 89, 132, 241, 117, 19, 99, 49, 86, 89, - 99, 17, 39, 50, 168, 90, 160, 41, 195, 138, 18, 75, 145, 55, 65, 83, - 234, 113, 20, 219, 148, 58, 104, 43, 87, 61, 177, 84, 51, 182, 81, 7, - 217, 51, 185, 63, 41, 147, 155, 8, 22, 38, 217, 27, 231, 84, 156, 147, - 177, 94, 116, 121, 137, 83, 144, 243, 51, 126, 169, 98, 230, 98, 213, 140, - 141, 61, 10, 225, 147, 132, 182, 74, 55, 145, 252, 255, 107, 129, 81, 49, - 9, 238, 201, 64, 227, 232, 52, 191, 152, 135, 223, 236, 230, 48, 245, 225, - 116, 114, 107, 218, 137, 34, 214, 203, 249, 246, 197, 190, 134, 52, 30, 42, - 164, 241, 240, 3, 72, 163, 234, 227, 176, 166, 7, 42, 145, 91, 114, 250, - 150, 162, 103, 167, 90, 115, 107, 141, 219, 197, 78, 47, 102, 32, 180, 187, - 140, 8, 101, 136, 38, 39, 144, 28, 221, 133, 247, 4, 62, 41, 211, 182, - 197, 242, 212, 214, 206, 54, 68, 236, 106, 81, 95, 124, 199, 87, 205, 233, - 36, 194, 190, 94, 55, 30, 222, 68, 232, 34, 251, 171, 60, 120, 141, 71, - 161, 26, 129, 101, 118, 238, 244, 222, 199, 185, 243, 51, 218, 89, 188, 3, - 199, 55, 112, 232, 56, 27, 79, 101, 14, 230, 220, 214, 50, 103, 53, 17, - 172, 69, 158, 41, 217, 173, 150, 123, 7, 247, 252, 53, 183, 53, 30, 195, - 197, 39, 211, 250, 170, 232, 125, 166, 55, 214, 148, 85, 120, 230, 17, 53, - 12, 199, 41, 25, 66, 183, 94, 130, 148, 57, 17, 158, 216, 120, 104, 167, - 71, 42, 11, 45, 96, 83, 121, 14, 76, 107, 13, 23, 84, 177, 156, 105, - 160, 82, 57, 235, 217, 70, 84, 170, 245, 212, 149, 34, 250, 116, 123, 133, - 83, 180, 86, 112, 118, 184, 30, 200, 52, 151, 166, 39, 14, 113, 9, 167, - 32, 68, 59, 100, 66, 200, 168, 234, 103, 1, 57, 106, 180, 77, 245, 190, - 95, 132, 219, 161, 144, 210, 109, 134, 173, 85, 183, 37, 93, 50, 166, 118, - 80, 115, 58, 124, 27, 176, 97, 28, 94, 116, 73, 22, 79, 64, 24, 191, - 64, 108, 254, 198, 108, 154, 204, 155, 3, 32, 71, 193, 4, 77, 180, 36, - 153, 163, 206, 66, 51, 78, 234, 63, 13, 56, 124, 250, 195, 179, 231, 141, - 86, 231, 216, 63, 236, 248, 126, 249, 1, 49, 42, 185, 215, 251, 237, 65, - 240, 128, 93, 128, 60, 205, 30, 243, 150, 48, 110, 0, 212, 50, 114, 131, - 206, 158, 67, 43, 243, 67, 153, 214, 239, 32, 12, 135, 7, 64, 27, 60, - 83, 192, 69, 194, 215, 85, 169, 130, 17, 102, 71, 111, 49, 96, 247, 248, - 45, 198, 236, 186, 206, 91, 220, 95, 116, 221, 42, 163, 204, 59, 240, 67, - 8, 205, 94, 187, 67, 62, 58, 45, 4, 157, 135, 114, 188, 216, 52, 237, - 202, 102, 224, 98, 10, 66, 255, 5, 115, 50, 100, 177, 44, 70, 158, 123, - 253, 244, 194, 75, 88, 206, 165, 135, 240, 250, 139, 202, 41, 172, 154, 51, - 251, 244, 218, 30, 158, 161, 247, 79, 233, 145, 177, 244, 39, 40, 37, 104, - 63, 116, 90, 58, 171, 85, 30, 177, 6, 123, 8, 229, 143, 161, 252, 33, - 176, 201, 159, 238, 151, 78, 224, 240, 17, 63, 12, 122, 125, 28, 238, 233, - 232, 42, 172, 156, 62, 132, 91, 30, 193, 207, 9, 252, 60, 182, 209, 245, - 213, 73, 23, 160, 115, 6, 109, 192, 191, 193, 116, 94, 129, 155, 236, 83, - 132, 6, 116, 207, 170, 229, 82, 154, 0, 169, 209, 96, 65, 47, 41, 17, - 137, 234, 81, 66, 222, 92, 212, 62, 133, 168, 166, 193, 251, 228, 195, 230, - 177, 92, 132, 31, 179, 145, 129, 163, 115, 56, 198, 9, 170, 240, 253, 20, - 84, 104, 123, 76, 67, 50, 66, 89, 192, 245, 27, 238, 225, 42, 131, 248, - 151, 56, 107, 146, 78, 10, 235, 1, 123, 181, 136, 123, 139, 17, 101, 159, - 224, 84, 83, 92, 56, 159, 167, 23, 236, 53, 229, 155, 209, 172, 221, 124, - 120, 191, 97, 47, 130, 208, 64, 91, 170, 105, 49, 198, 145, 201, 165, 52, - 207, 91, 147, 105, 233, 204, 243, 250, 132, 107, 32, 81, 42, 167, 111, 169, - 215, 145, 162, 242, 160, 109, 37, 224, 225, 203, 196, 196, 122, 107, 116, 229, - 226, 120, 155, 246, 61, 134, 40, 212, 217, 228, 13, 58, 46, 89, 215, 40, - 159, 45, 163, 139, 10, 172, 76, 31, 70, 100, 37, 64, 249, 248, 220, 130, - 203, 18, 164, 207, 242, 69, 88, 106, 195, 106, 213, 92, 7, 78, 208, 25, - 86, 22, 214, 211, 66, 86, 79, 162, 9, 6, 161, 38, 48, 227, 178, 116, - 102, 232, 201, 201, 15, 93, 31, 87, 165, 239, 164, 81, 220, 14, 250, 245, - 113, 217, 144, 245, 40, 40, 123, 154, 125, 211, 102, 73, 135, 114, 47, 105, - 8, 238, 116, 159, 231, 208, 156, 37, 31, 91, 163, 135, 45, 137, 19, 237, - 111, 80, 156, 136, 130, 238, 50, 10, 86, 176, 150, 173, 40, 0, 33, 194, - 106, 195, 250, 197, 67, 77, 48, 144, 34, 176, 92, 98, 98, 1, 12, 167, - 125, 12, 170, 191, 146, 54, 244, 4, 11, 174, 241, 220, 214, 79, 11, 222, - 100, 134, 185, 94, 80, 85, 17, 209, 225, 9, 122, 184, 136, 164, 68, 235, - 234, 101, 117, 244, 173, 188, 157, 112, 114, 247, 94, 22, 123, 47, 139, 189, - 151, 197, 127, 136, 101, 230, 19, 113, 160, 22, 162, 50, 20, 183, 207, 206, - 53, 18, 8, 156, 103, 208, 159, 231, 228, 48, 151, 113, 23, 250, 38, 185, - 131, 83, 40, 133, 79, 104, 30, 75, 203, 173, 3, 117, 86, 175, 130, 220, - 67, 206, 235, 53, 22, 65, 67, 41, 60, 65, 254, 33, 232, 208, 145, 123, - 50, 15, 193, 40, 35, 172, 129, 145, 42, 175, 55, 222, 42, 109, 20, 29, - 60, 94, 206, 166, 19, 153, 219, 43, 161, 99, 59, 59, 52, 198, 236, 102, - 246, 77, 215, 7, 230, 234, 237, 115, 188, 239, 73, 243, 158, 52, 239, 73, - 243, 151, 240, 108, 72, 4, 245, 34, 130, 41, 78, 50, 40, 69, 157, 136, - 173, 39, 144, 226, 62, 3, 113, 156, 7, 20, 45, 253, 116, 4, 26, 167, - 160, 145, 188, 232, 252, 18, 139, 236, 66, 137, 137, 98, 110, 75, 252, 96, - 116, 248, 209, 125, 72, 94, 13, 163, 9, 168, 170, 98, 160, 119, 202, 211, - 90, 220, 84, 42, 222, 148, 102, 125, 53, 194, 51, 125, 57, 192, 239, 253, - 82, 253, 163, 46, 85, 23, 129, 253, 141, 22, 117, 109, 153, 236, 134, 11, - 41, 208, 174, 244, 59, 83, 103, 37, 213, 82, 212, 98, 18, 236, 145, 48, - 206, 68, 230, 107, 129, 39, 101, 19, 30, 154, 72, 200, 6, 197, 100, 154, - 43, 21, 12, 69, 157, 198, 209, 186, 124, 18, 198, 37, 190, 158, 158, 232, - 253, 53, 146, 149, 56, 35, 39, 113, 74, 70, 226, 100, 35, 120, 154, 248, - 198, 106, 141, 153, 2, 123, 230, 228, 44, 242, 74, 182, 99, 207, 62, 210, - 141, 250, 143, 98, 224, 227, 67, 37, 254, 203, 215, 118, 187, 85, 88, 64, - 73, 147, 252, 163, 130, 163, 226, 118, 88, 126, 179, 201, 222, 117, 114, 47, - 242, 249, 192, 74, 81, 198, 55, 165, 157, 72, 248, 39, 217, 50, 43, 227, - 171, 18, 175, 200, 247, 98, 84, 208, 70, 220, 40, 60, 108, 28, 175, 40, - 189, 57, 101, 47, 42, 197, 87, 70, 212, 70, 185, 63, 38, 190, 63, 157, - 216, 202, 177, 137, 133, 228, 28, 17, 243, 27, 118, 107, 190, 132, 106, 116, - 44, 236, 244, 28, 21, 3, 249, 242, 190, 169, 185, 9, 245, 251, 247, 245, - 222, 63, 65, 245, 158, 236, 255, 33, 200, 254, 6, 9, 77, 206, 118, 97, - 175, 204, 246, 73, 229, 149, 148, 160, 139, 29, 210, 54, 7, 246, 40, 94, - 69, 95, 61, 185, 60, 121, 102, 163, 166, 172, 214, 76, 235, 81, 194, 36, - 244, 60, 95, 139, 90, 232, 148, 178, 252, 151, 18, 16, 179, 243, 190, 201, - 177, 57, 211, 145, 89, 145, 125, 167, 102, 181, 40, 29, 50, 5, 249, 151, - 138, 139, 121, 3, 179, 16, 239, 89, 100, 19, 175, 194, 121, 28, 9, 62, - 49, 167, 99, 59, 59, 212, 84, 114, 37, 227, 54, 65, 59, 121, 95, 213, - 20, 152, 139, 247, 40, 137, 3, 203, 149, 47, 200, 113, 182, 196, 27, 242, - 19, 91, 57, 94, 247, 142, 190, 151, 199, 177, 77, 233, 163, 116, 187, 234, - 180, 54, 82, 199, 60, 146, 168, 78, 94, 92, 68, 226, 138, 3, 177, 152, - 79, 22, 241, 21, 172, 78, 3, 83, 19, 196, 136, 3, 209, 78, 39, 140, - 8, 97, 89, 18, 68, 9, 130, 91, 182, 179, 26, 25, 1, 156, 171, 245, - 244, 98, 229, 76, 109, 36, 87, 44, 31, 198, 189, 74, 191, 136, 243, 196, - 186, 140, 228, 115, 249, 93, 11, 219, 52, 25, 218, 172, 172, 35, 214, 109, - 139, 35, 138, 40, 4, 160, 198, 26, 174, 66, 18, 16, 190, 20, 101, 194, - 156, 233, 77, 169, 225, 231, 107, 40, 215, 90, 188, 189, 245, 21, 218, 198, - 10, 244, 12, 173, 27, 157, 21, 71, 77, 69, 132, 9, 182, 140, 158, 213, - 93, 158, 53, 221, 87, 55, 152, 180, 141, 73, 32, 7, 40, 5, 16, 98, - 235, 100, 13, 26, 233, 47, 72, 155, 224, 211, 93, 227, 95, 155, 255, 89, - 31, 169, 208, 201, 185, 30, 22, 165, 181, 78, 17, 162, 31, 116, 204, 77, - 216, 218, 69, 29, 180, 173, 43, 131, 79, 162, 30, 6, 34, 155, 193, 196, - 53, 255, 11, 81, 115, 7, 233, 112, 45, 122, 155, 231, 53, 219, 242, 184, - 149, 30, 117, 14, 101, 105, 214, 196, 235, 6, 46, 207, 128, 156, 234, 84, - 141, 82, 149, 83, 127, 221, 161, 206, 103, 68, 200, 58, 50, 164, 10, 20, - 211, 96, 24, 197, 35, 65, 240, 175, 233, 216, 206, 14, 55, 167, 182, 225, - 46, 169, 190, 14, 184, 110, 216, 103, 206, 125, 1, 116, 191, 49, 100, 173, - 212, 98, 249, 164, 13, 32, 67, 110, 71, 209, 209, 223, 56, 118, 38, 171, - 175, 11, 100, 85, 53, 252, 6, 138, 177, 87, 61, 142, 21, 195, 239, 165, - 102, 248, 237, 105, 134, 223, 192, 100, 248, 13, 138, 134, 223, 184, 104, 248, - 189, 52, 25, 126, 123, 186, 225, 119, 100, 48, 252, 98, 149, 6, 138, 103, - 125, 179, 225, 23, 175, 171, 215, 148, 75, 185, 187, 148, 43, 212, 153, 252, - 53, 50, 220, 142, 76, 134, 223, 252, 163, 133, 225, 215, 116, 127, 175, 80, - 42, 12, 191, 133, 54, 184, 225, 215, 84, 123, 152, 47, 37, 203, 238, 80, - 49, 252, 38, 69, 195, 239, 149, 102, 248, 141, 10, 134, 223, 81, 209, 240, - 219, 215, 12, 191, 227, 188, 225, 247, 54, 103, 248, 125, 167, 24, 126, 71, - 170, 225, 183, 191, 55, 252, 254, 39, 168, 21, 215, 130, 84, 146, 225, 87, - 156, 72, 21, 0, 164, 9, 144, 165, 219, 165, 2, 233, 92, 43, 132, 203, - 6, 8, 8, 162, 32, 135, 159, 195, 127, 223, 246, 30, 188, 128, 215, 141, - 98, 5, 203, 243, 17, 2, 111, 176, 23, 24, 25, 154, 160, 56, 67, 158, - 56, 247, 88, 15, 139, 209, 198, 180, 22, 133, 231, 233, 193, 51, 157, 56, - 159, 11, 182, 157, 203, 136, 241, 226, 224, 145, 230, 126, 249, 60, 142, 64, - 87, 152, 5, 163, 234, 238, 247, 240, 192, 213, 32, 190, 85, 238, 105, 229, - 238, 249, 194, 159, 147, 119, 227, 113, 136, 116, 34, 70, 229, 11, 186, 52, - 200, 206, 136, 7, 42, 231, 38, 70, 248, 112, 116, 9, 43, 98, 62, 28, - 43, 139, 249, 229, 60, 192, 23, 199, 5, 240, 108, 138, 223, 166, 113, 50, - 133, 206, 78, 128, 94, 105, 226, 252, 158, 60, 252, 249, 200, 195, 64, 157, - 76, 37, 245, 204, 97, 201, 187, 104, 6, 75, 253, 173, 179, 42, 153, 39, - 214, 90, 50, 161, 182, 99, 208, 215, 127, 224, 233, 21, 216, 233, 247, 211, - 17, 240, 85, 46, 199, 137, 156, 11, 231, 67, 44, 179, 11, 37, 234, 36, - 150, 224, 201, 90, 90, 12, 76, 217, 210, 118, 85, 105, 31, 110, 139, 9, - 103, 79, 219, 81, 210, 68, 240, 147, 41, 72, 95, 64, 143, 174, 184, 112, - 152, 169, 181, 63, 78, 175, 145, 7, 195, 132, 249, 2, 10, 99, 235, 192, - 59, 52, 163, 26, 104, 67, 130, 166, 34, 237, 124, 105, 185, 111, 221, 38, - 166, 131, 87, 130, 148, 211, 193, 126, 54, 141, 103, 80, 111, 122, 137, 51, - 59, 55, 232, 99, 186, 102, 23, 139, 76, 225, 100, 132, 5, 38, 117, 251, - 243, 13, 177, 243, 84, 241, 49, 38, 91, 225, 174, 151, 231, 210, 235, 125, - 75, 194, 212, 173, 145, 68, 63, 204, 9, 174, 107, 30, 79, 65, 49, 186, - 101, 201, 226, 242, 18, 70, 145, 195, 32, 7, 179, 25, 20, 169, 193, 62, - 4, 253, 5, 29, 8, 4, 192, 23, 118, 38, 224, 25, 147, 49, 244, 51, - 14, 47, 41, 158, 117, 42, 211, 126, 216, 4, 211, 140, 138, 38, 143, 10, - 18, 241, 174, 209, 248, 247, 135, 7, 253, 190, 232, 160, 182, 57, 127, 152, - 254, 197, 12, 198, 132, 23, 93, 203, 101, 79, 187, 150, 199, 30, 117, 65, - 185, 126, 216, 181, 90, 2, 57, 248, 97, 153, 253, 229, 47, 172, 92, 73, - 186, 93, 175, 204, 254, 253, 111, 86, 134, 163, 86, 53, 15, 23, 92, 231, - 137, 209, 107, 34, 215, 57, 170, 233, 47, 186, 14, 52, 233, 64, 139, 100, - 230, 171, 243, 241, 228, 3, 204, 231, 4, 234, 248, 2, 16, 244, 212, 122, - 97, 91, 79, 109, 235, 145, 109, 61, 60, 75, 243, 73, 203, 52, 60, 75, - 183, 238, 213, 48, 249, 14, 154, 11, 181, 119, 105, 54, 49, 86, 169, 164, - 187, 36, 175, 157, 163, 240, 230, 197, 209, 64, 81, 165, 181, 178, 225, 25, - 240, 132, 194, 146, 64, 160, 182, 6, 89, 204, 242, 11, 66, 15, 182, 44, - 22, 155, 22, 134, 33, 68, 50, 157, 242, 234, 174, 145, 105, 126, 87, 16, - 102, 110, 61, 186, 56, 94, 34, 11, 18, 15, 14, 94, 0, 107, 131, 105, - 217, 231, 149, 48, 84, 152, 207, 235, 170, 97, 130, 106, 17, 153, 212, 159, - 227, 156, 221, 47, 123, 166, 178, 249, 129, 56, 55, 210, 150, 120, 158, 26, - 76, 53, 91, 8, 133, 114, 106, 45, 183, 115, 139, 155, 99, 30, 254, 188, - 192, 101, 152, 6, 126, 66, 221, 98, 14, 171, 79, 76, 82, 36, 151, 126, - 30, 79, 65, 141, 76, 40, 182, 244, 151, 97, 132, 128, 56, 139, 201, 68, - 237, 213, 123, 4, 134, 152, 72, 147, 124, 16, 70, 40, 92, 128, 50, 56, - 2, 250, 146, 192, 52, 99, 227, 224, 54, 163, 88, 28, 58, 176, 249, 117, - 147, 147, 44, 200, 207, 72, 82, 58, 72, 82, 14, 145, 164, 28, 33, 73, - 57, 254, 242, 36, 197, 117, 114, 52, 197, 117, 86, 114, 15, 194, 117, 75, - 87, 81, 178, 56, 199, 224, 208, 174, 181, 188, 136, 230, 73, 31, 237, 9, - 167, 103, 101, 86, 94, 58, 54, 250, 196, 59, 246, 144, 64, 121, 218, 4, - 201, 179, 42, 93, 187, 152, 131, 62, 189, 13, 102, 89, 249, 84, 124, 223, - 51, 246, 244, 238, 179, 31, 78, 238, 101, 180, 132, 64, 31, 27, 180, 30, - 207, 8, 141, 153, 71, 169, 56, 172, 56, 158, 156, 172, 217, 2, 78, 111, - 61, 117, 51, 133, 67, 154, 63, 16, 54, 117, 204, 169, 28, 188, 179, 237, - 228, 9, 93, 46, 174, 92, 105, 164, 72, 227, 180, 39, 110, 160, 34, 135, - 57, 42, 242, 227, 116, 250, 110, 49, 75, 171, 8, 27, 88, 222, 6, 43, - 106, 101, 41, 52, 84, 87, 30, 119, 29, 109, 145, 6, 53, 79, 223, 105, - 229, 149, 94, 13, 97, 137, 129, 100, 51, 80, 154, 51, 53, 246, 56, 236, - 7, 183, 234, 35, 157, 118, 222, 125, 72, 60, 85, 163, 222, 133, 141, 162, - 47, 67, 212, 128, 114, 245, 81, 81, 237, 221, 194, 67, 167, 125, 202, 51, - 33, 135, 71, 234, 93, 104, 138, 7, 177, 245, 176, 141, 191, 219, 116, 236, - 209, 177, 75, 199, 116, 232, 209, 249, 157, 15, 16, 107, 49, 100, 26, 33, - 53, 69, 100, 26, 138, 84, 67, 30, 61, 189, 72, 66, 77, 226, 234, 7, - 19, 204, 92, 113, 65, 11, 24, 33, 45, 238, 109, 1, 60, 165, 197, 36, - 167, 43, 14, 167, 250, 16, 152, 122, 49, 62, 152, 8, 221, 93, 24, 1, - 144, 97, 21, 228, 11, 58, 133, 73, 59, 192, 203, 205, 73, 72, 160, 32, - 45, 12, 147, 185, 12, 231, 216, 88, 131, 11, 123, 24, 105, 135, 40, 25, - 141, 203, 113, 212, 111, 68, 233, 179, 154, 195, 249, 120, 244, 169, 113, 49, - 72, 101, 9, 225, 21, 162, 228, 246, 3, 73, 243, 121, 126, 141, 154, 201, - 242, 49, 146, 101, 23, 169, 40, 208, 60, 36, 204, 174, 247, 21, 80, 102, - 63, 79, 153, 125, 85, 220, 147, 4, 145, 60, 193, 107, 150, 183, 178, 9, - 88, 13, 211, 33, 88, 238, 138, 176, 244, 143, 54, 16, 202, 117, 163, 65, - 79, 110, 149, 122, 73, 23, 19, 57, 32, 45, 26, 71, 147, 202, 181, 61, - 172, 214, 130, 248, 146, 144, 239, 91, 228, 99, 115, 216, 70, 109, 29, 33, - 155, 129, 188, 216, 30, 144, 142, 59, 208, 113, 104, 170, 92, 28, 116, 210, - 103, 123, 9, 253, 112, 94, 129, 63, 112, 55, 223, 120, 55, 221, 160, 135, - 29, 175, 35, 181, 58, 113, 207, 232, 186, 235, 9, 194, 142, 121, 5, 156, - 2, 105, 231, 187, 157, 211, 120, 222, 120, 12, 66, 197, 2, 37, 155, 28, - 137, 31, 200, 114, 219, 88, 106, 146, 100, 215, 196, 50, 31, 22, 182, 203, - 94, 132, 151, 139, 81, 16, 75, 80, 32, 85, 133, 254, 129, 167, 193, 141, - 250, 104, 90, 9, 71, 193, 98, 18, 220, 54, 120, 184, 30, 89, 83, 208, - 219, 51, 59, 95, 219, 164, 41, 242, 58, 215, 137, 207, 169, 144, 126, 212, - 92, 101, 142, 57, 146, 175, 240, 137, 204, 43, 189, 133, 43, 189, 141, 11, - 189, 131, 235, 252, 240, 163, 47, 115, 117, 129, 195, 250, 86, 214, 53, 223, - 127, 62, 90, 229, 86, 245, 145, 166, 195, 165, 221, 79, 151, 183, 240, 5, - 211, 87, 178, 26, 219, 177, 118, 114, 234, 139, 35, 27, 24, 92, 32, 135, - 124, 125, 28, 101, 208, 58, 131, 198, 119, 183, 33, 123, 56, 159, 135, 147, - 69, 32, 172, 205, 113, 56, 56, 15, 111, 67, 91, 30, 40, 187, 194, 153, - 248, 176, 110, 154, 27, 118, 8, 125, 218, 248, 85, 229, 130, 84, 166, 89, - 35, 210, 124, 21, 214, 227, 23, 132, 204, 192, 190, 159, 206, 217, 115, 76, - 126, 37, 118, 81, 5, 96, 195, 112, 58, 167, 148, 88, 220, 0, 151, 47, - 52, 25, 148, 105, 73, 169, 46, 148, 185, 189, 213, 226, 232, 22, 221, 51, - 247, 134, 229, 47, 111, 88, 254, 32, 224, 174, 245, 118, 229, 252, 212, 33, - 10, 150, 43, 226, 96, 91, 27, 230, 217, 90, 251, 114, 177, 41, 131, 239, - 240, 116, 20, 1, 157, 184, 21, 238, 163, 226, 236, 124, 62, 176, 115, 231, - 127, 124, 254, 151, 114, 180, 3, 246, 93, 60, 85, 210, 63, 96, 154, 225, - 92, 238, 120, 242, 226, 158, 5, 125, 221, 139, 43, 225, 110, 168, 217, 46, - 255, 126, 219, 231, 171, 196, 208, 82, 93, 153, 82, 109, 43, 206, 54, 86, - 19, 54, 87, 156, 223, 184, 101, 155, 52, 69, 4, 214, 34, 188, 172, 5, - 121, 46, 7, 162, 30, 138, 141, 25, 51, 13, 228, 230, 96, 147, 253, 95, - 18, 94, 44, 70, 220, 116, 142, 22, 71, 186, 57, 97, 67, 96, 72, 120, - 59, 214, 157, 13, 209, 153, 130, 220, 87, 222, 55, 225, 224, 39, 146, 167, - 156, 195, 53, 200, 8, 217, 98, 55, 72, 82, 105, 246, 132, 33, 234, 48, - 152, 200, 128, 113, 251, 116, 134, 78, 114, 17, 145, 135, 26, 249, 178, 150, - 68, 176, 4, 250, 230, 145, 20, 212, 122, 224, 96, 230, 138, 233, 32, 21, - 131, 90, 43, 158, 201, 42, 19, 142, 26, 188, 84, 180, 35, 251, 211, 100, - 138, 72, 116, 37, 0, 139, 104, 96, 121, 158, 7, 89, 79, 169, 38, 172, - 89, 237, 12, 33, 133, 229, 149, 11, 3, 105, 91, 239, 84, 171, 140, 140, - 137, 134, 114, 183, 221, 211, 135, 147, 72, 18, 51, 161, 91, 112, 135, 222, - 243, 32, 187, 96, 155, 139, 141, 155, 208, 5, 223, 184, 78, 17, 66, 156, - 96, 198, 115, 46, 87, 135, 184, 176, 84, 183, 56, 241, 24, 21, 89, 216, - 215, 133, 174, 167, 2, 59, 197, 232, 102, 215, 236, 228, 221, 91, 9, 101, - 194, 232, 8, 219, 204, 187, 194, 190, 4, 21, 13, 45, 20, 69, 176, 66, - 167, 201, 67, 64, 180, 174, 18, 81, 55, 84, 246, 201, 172, 174, 162, 149, - 80, 52, 168, 161, 166, 71, 141, 42, 234, 12, 6, 138, 198, 179, 233, 40, - 199, 123, 28, 187, 252, 83, 136, 9, 119, 231, 236, 39, 196, 117, 236, 77, - 227, 148, 182, 163, 83, 216, 2, 88, 123, 227, 111, 139, 249, 60, 40, 171, - 194, 43, 84, 127, 56, 155, 197, 83, 220, 91, 21, 13, 230, 45, 90, 5, - 94, 68, 174, 165, 123, 200, 137, 125, 92, 243, 62, 174, 121, 47, 200, 124, - 82, 208, 163, 163, 53, 40, 99, 5, 134, 99, 224, 240, 106, 202, 119, 215, - 149, 193, 40, 138, 23, 28, 143, 76, 179, 121, 218, 35, 235, 216, 166, 157, - 36, 158, 239, 221, 245, 204, 150, 138, 245, 156, 110, 61, 179, 45, 246, 117, - 35, 207, 21, 9, 182, 243, 28, 87, 20, 219, 166, 194, 221, 184, 109, 65, - 139, 65, 85, 68, 209, 212, 53, 248, 194, 162, 7, 188, 137, 145, 30, 233, - 27, 51, 251, 165, 246, 71, 93, 106, 29, 4, 244, 115, 141, 113, 201, 185, - 185, 102, 88, 104, 245, 84, 151, 224, 112, 93, 9, 35, 225, 134, 22, 153, - 95, 170, 107, 56, 118, 205, 38, 69, 160, 33, 190, 93, 77, 68, 159, 169, - 224, 94, 228, 203, 116, 224, 175, 8, 197, 203, 69, 45, 214, 118, 89, 97, - 7, 96, 221, 252, 223, 190, 6, 229, 75, 108, 88, 129, 143, 72, 124, 143, - 83, 103, 41, 113, 111, 79, 22, 219, 166, 66, 35, 18, 140, 144, 20, 255, - 14, 90, 189, 230, 144, 86, 92, 92, 92, 246, 43, 84, 60, 204, 215, 43, - 90, 5, 246, 146, 216, 94, 18, 219, 75, 98, 123, 246, 240, 201, 83, 123, - 30, 130, 48, 182, 158, 61, 164, 132, 16, 59, 197, 29, 136, 219, 93, 202, - 76, 212, 129, 63, 154, 40, 230, 179, 172, 50, 9, 99, 82, 230, 106, 153, - 218, 219, 149, 180, 43, 109, 174, 39, 237, 79, 23, 209, 32, 117, 133, 17, - 55, 94, 82, 153, 93, 40, 217, 8, 51, 144, 38, 5, 222, 182, 91, 68, - 24, 1, 170, 123, 242, 94, 151, 222, 83, 240, 61, 5, 223, 83, 240, 47, - 16, 92, 112, 188, 6, 218, 69, 165, 122, 187, 144, 111, 81, 115, 45, 237, - 214, 233, 231, 54, 194, 45, 91, 91, 79, 181, 243, 14, 46, 226, 70, 221, - 191, 37, 95, 104, 20, 200, 191, 118, 219, 242, 43, 116, 22, 123, 57, 167, - 41, 145, 130, 99, 163, 147, 210, 251, 224, 212, 236, 25, 200, 158, 129, 252, - 161, 24, 8, 28, 142, 70, 225, 72, 186, 186, 114, 183, 218, 116, 150, 46, - 230, 83, 104, 239, 231, 9, 183, 84, 5, 72, 132, 95, 93, 79, 197, 73, - 66, 220, 100, 17, 43, 167, 223, 81, 46, 140, 236, 252, 101, 116, 51, 199, - 143, 42, 75, 224, 137, 82, 49, 255, 249, 10, 131, 213, 102, 82, 149, 166, - 176, 79, 21, 53, 101, 207, 237, 254, 168, 220, 110, 171, 190, 162, 250, 216, - 33, 119, 67, 22, 53, 19, 19, 241, 124, 42, 230, 197, 155, 178, 180, 25, - 99, 254, 10, 205, 108, 236, 72, 163, 240, 155, 50, 55, 30, 195, 159, 67, - 83, 251, 187, 178, 65, 197, 183, 109, 61, 39, 124, 134, 73, 7, 83, 176, - 14, 157, 29, 142, 225, 90, 95, 94, 178, 215, 93, 48, 177, 197, 34, 215, - 241, 157, 109, 92, 7, 195, 46, 85, 248, 180, 191, 133, 112, 187, 82, 43, - 72, 216, 99, 10, 118, 65, 62, 249, 35, 70, 124, 167, 160, 156, 23, 193, - 40, 9, 247, 236, 106, 207, 174, 246, 236, 106, 207, 174, 246, 236, 106, 39, - 118, 165, 209, 240, 205, 44, 75, 39, 247, 23, 24, 179, 132, 140, 11, 119, - 99, 84, 158, 133, 59, 159, 57, 189, 205, 200, 40, 182, 241, 45, 189, 103, - 27, 121, 215, 32, 10, 38, 121, 158, 133, 101, 118, 161, 100, 171, 237, 205, - 207, 197, 102, 21, 221, 141, 121, 32, 192, 182, 156, 238, 123, 78, 179, 231, - 52, 95, 47, 167, 217, 19, 239, 63, 2, 241, 222, 128, 237, 170, 210, 52, - 65, 181, 197, 9, 169, 19, 101, 114, 237, 92, 67, 251, 182, 19, 94, 222, - 208, 122, 138, 251, 211, 143, 13, 84, 24, 114, 158, 36, 147, 17, 146, 108, - 205, 143, 68, 20, 153, 168, 174, 22, 255, 155, 162, 35, 225, 222, 188, 97, - 163, 251, 81, 48, 25, 92, 139, 164, 211, 92, 73, 0, 58, 173, 0, 225, - 189, 154, 78, 114, 181, 210, 253, 112, 87, 83, 55, 248, 83, 161, 243, 9, - 199, 36, 20, 83, 223, 39, 90, 120, 209, 248, 105, 26, 227, 220, 251, 209, - 77, 143, 188, 244, 72, 18, 68, 162, 155, 98, 1, 115, 106, 188, 121, 177, - 237, 57, 193, 158, 19, 124, 189, 156, 96, 175, 115, 236, 217, 214, 214, 24, - 46, 248, 211, 106, 221, 127, 159, 64, 174, 54, 226, 253, 59, 27, 28, 44, - 5, 103, 48, 198, 88, 47, 19, 194, 33, 22, 85, 50, 191, 202, 198, 121, - 225, 126, 80, 51, 40, 50, 98, 131, 218, 178, 91, 51, 168, 185, 160, 195, - 38, 199, 47, 84, 35, 32, 138, 181, 29, 28, 76, 80, 121, 130, 94, 194, - 198, 193, 141, 161, 134, 171, 212, 168, 27, 174, 123, 20, 154, 19, 143, 13, - 151, 124, 184, 68, 99, 240, 0, 113, 149, 179, 132, 180, 182, 199, 82, 96, - 84, 30, 13, 66, 88, 238, 208, 213, 98, 27, 173, 245, 109, 200, 24, 20, - 38, 50, 117, 168, 41, 111, 183, 180, 218, 230, 49, 179, 102, 214, 190, 69, - 166, 72, 63, 194, 122, 161, 162, 8, 41, 34, 238, 205, 16, 69, 212, 130, - 247, 246, 139, 195, 248, 9, 167, 32, 10, 188, 71, 85, 45, 40, 213, 211, - 210, 175, 233, 80, 37, 220, 135, 67, 175, 33, 154, 48, 67, 51, 43, 160, - 39, 251, 176, 137, 189, 24, 178, 23, 67, 246, 98, 200, 94, 12, 249, 228, - 166, 79, 137, 242, 178, 65, 118, 144, 194, 201, 33, 27, 132, 147, 105, 148, - 132, 197, 32, 15, 45, 144, 3, 165, 8, 138, 246, 192, 189, 187, 252, 163, - 118, 213, 191, 21, 88, 152, 77, 156, 242, 249, 201, 67, 3, 159, 156, 245, - 131, 2, 171, 132, 50, 35, 183, 156, 199, 225, 228, 82, 209, 150, 91, 57, - 88, 193, 2, 219, 59, 220, 202, 246, 92, 55, 87, 69, 174, 179, 151, 1, - 70, 141, 208, 178, 150, 88, 95, 238, 230, 101, 182, 103, 88, 123, 134, 245, - 245, 50, 172, 61, 15, 248, 116, 60, 192, 12, 132, 249, 40, 132, 65, 9, - 109, 13, 23, 110, 145, 132, 9, 11, 24, 244, 233, 86, 197, 214, 133, 123, - 111, 153, 72, 126, 112, 21, 102, 48, 4, 8, 45, 39, 9, 57, 7, 32, - 104, 178, 151, 83, 27, 72, 56, 62, 151, 90, 24, 5, 17, 66, 247, 78, - 217, 120, 1, 179, 23, 148, 168, 219, 233, 2, 81, 10, 66, 54, 66, 169, - 125, 14, 68, 137, 29, 65, 205, 56, 76, 210, 183, 9, 174, 130, 8, 84, - 169, 81, 72, 200, 6, 8, 1, 172, 226, 252, 222, 203, 94, 251, 247, 130, - 25, 236, 10, 14, 247, 65, 216, 43, 157, 3, 175, 181, 38, 129, 164, 206, - 75, 4, 203, 20, 3, 153, 21, 115, 100, 92, 201, 10, 101, 34, 128, 53, - 140, 104, 39, 38, 72, 173, 110, 224, 131, 97, 12, 223, 186, 241, 44, 24, - 69, 239, 114, 172, 144, 174, 140, 241, 130, 109, 46, 54, 49, 196, 191, 53, - 114, 136, 75, 69, 124, 239, 162, 71, 203, 86, 55, 202, 246, 222, 161, 101, - 207, 36, 255, 51, 153, 228, 94, 171, 219, 115, 244, 143, 31, 109, 208, 49, - 195, 76, 23, 105, 252, 102, 221, 78, 101, 6, 220, 153, 133, 199, 21, 83, - 78, 60, 69, 159, 203, 172, 194, 155, 248, 200, 86, 126, 166, 116, 107, 3, - 75, 123, 201, 19, 10, 128, 184, 241, 52, 88, 192, 138, 201, 251, 181, 36, - 242, 186, 109, 42, 220, 61, 90, 95, 117, 113, 209, 179, 164, 243, 252, 115, - 74, 224, 66, 10, 94, 156, 133, 166, 237, 45, 145, 123, 158, 181, 231, 89, - 123, 158, 181, 231, 89, 31, 199, 18, 153, 18, 240, 221, 172, 145, 45, 214, - 27, 45, 98, 229, 174, 52, 5, 115, 222, 22, 105, 224, 93, 5, 102, 177, - 141, 115, 41, 143, 217, 192, 183, 222, 69, 121, 78, 5, 37, 118, 238, 220, - 132, 140, 105, 26, 113, 208, 251, 73, 199, 114, 185, 230, 143, 141, 103, 41, - 73, 12, 200, 239, 84, 225, 187, 100, 158, 237, 152, 101, 57, 210, 127, 162, - 48, 194, 242, 179, 96, 178, 160, 25, 245, 80, 166, 58, 81, 179, 163, 23, - 50, 59, 113, 46, 104, 6, 240, 84, 83, 25, 171, 170, 97, 17, 152, 54, - 23, 132, 7, 115, 149, 188, 137, 64, 8, 248, 45, 100, 63, 16, 124, 98, - 113, 115, 239, 117, 227, 100, 58, 141, 7, 64, 87, 97, 96, 78, 121, 191, - 207, 50, 230, 93, 64, 248, 248, 245, 61, 235, 11, 119, 215, 98, 77, 34, - 56, 239, 9, 42, 89, 248, 100, 30, 255, 100, 232, 147, 187, 24, 139, 108, - 50, 124, 6, 0, 37, 53, 124, 58, 220, 239, 77, 211, 194, 152, 83, 165, - 62, 1, 86, 156, 171, 194, 147, 165, 58, 205, 163, 205, 49, 242, 121, 128, - 189, 172, 74, 33, 237, 180, 20, 183, 144, 242, 201, 128, 255, 77, 156, 98, - 167, 193, 240, 249, 96, 60, 14, 231, 65, 52, 74, 88, 56, 25, 226, 36, - 27, 3, 3, 51, 140, 196, 83, 180, 60, 101, 47, 88, 204, 37, 177, 190, - 15, 146, 8, 62, 14, 230, 65, 250, 86, 203, 54, 176, 27, 92, 24, 136, - 168, 76, 4, 93, 142, 52, 46, 7, 254, 125, 248, 168, 86, 126, 142, 163, - 75, 76, 45, 83, 45, 92, 225, 67, 22, 14, 240, 74, 246, 29, 80, 210, - 226, 73, 104, 104, 18, 111, 54, 103, 237, 153, 212, 199, 102, 82, 106, 162, - 139, 147, 17, 102, 178, 192, 148, 24, 60, 145, 19, 3, 6, 21, 78, 211, - 116, 23, 229, 52, 171, 197, 245, 245, 117, 243, 118, 186, 152, 47, 122, 97, - 179, 63, 29, 31, 92, 163, 129, 237, 175, 87, 221, 239, 143, 102, 255, 123, - 241, 175, 198, 109, 239, 164, 191, 89, 50, 250, 84, 172, 209, 217, 232, 226, - 138, 108, 163, 8, 12, 149, 131, 158, 31, 97, 238, 112, 14, 187, 42, 208, - 76, 235, 189, 96, 132, 107, 237, 252, 50, 24, 143, 3, 230, 122, 71, 182, - 248, 225, 94, 46, 120, 3, 135, 62, 93, 90, 110, 183, 235, 100, 94, 50, - 136, 97, 127, 209, 100, 46, 19, 169, 199, 93, 202, 128, 206, 185, 15, 245, - 6, 33, 166, 4, 28, 171, 94, 8, 236, 246, 14, 240, 91, 248, 57, 186, - 131, 141, 63, 235, 46, 163, 103, 43, 214, 131, 107, 254, 29, 86, 107, 66, - 99, 207, 14, 176, 4, 14, 81, 197, 196, 20, 23, 110, 137, 191, 201, 128, - 147, 8, 236, 86, 203, 182, 142, 239, 224, 30, 226, 157, 82, 253, 92, 31, - 136, 83, 239, 12, 120, 61, 198, 92, 184, 165, 127, 226, 73, 211, 118, 196, - 255, 174, 221, 196, 172, 231, 18, 248, 10, 159, 230, 58, 111, 41, 45, 70, - 61, 133, 153, 35, 167, 38, 4, 230, 55, 122, 55, 137, 161, 86, 198, 164, - 7, 71, 222, 193, 209, 234, 14, 135, 143, 165, 43, 222, 3, 103, 85, 26, - 195, 171, 141, 87, 76, 188, 161, 76, 174, 46, 62, 210, 18, 39, 55, 220, - 215, 174, 174, 20, 64, 22, 255, 142, 189, 108, 215, 160, 59, 244, 88, 189, - 28, 106, 223, 105, 87, 225, 98, 169, 198, 224, 228, 89, 195, 26, 87, 15, - 160, 69, 236, 187, 53, 70, 119, 44, 252, 103, 20, 37, 100, 135, 27, 30, - 246, 216, 36, 201, 240, 9, 177, 126, 62, 92, 68, 76, 121, 229, 139, 13, - 95, 222, 244, 225, 139, 223, 93, 142, 74, 143, 127, 118, 182, 132, 23, 169, - 201, 47, 207, 50, 219, 130, 34, 75, 137, 7, 226, 59, 184, 198, 119, 128, - 182, 142, 239, 152, 111, 240, 140, 55, 104, 179, 74, 153, 82, 236, 29, 76, - 147, 201, 166, 14, 248, 239, 223, 94, 126, 14, 137, 41, 186, 249, 57, 173, - 247, 125, 142, 177, 57, 152, 149, 155, 133, 87, 234, 143, 42, 183, 42, 171, - 30, 206, 4, 209, 232, 71, 113, 31, 216, 157, 242, 33, 109, 46, 98, 80, - 176, 143, 249, 50, 40, 104, 55, 79, 196, 127, 105, 205, 17, 242, 200, 165, - 213, 105, 192, 237, 109, 204, 95, 1, 179, 219, 58, 212, 206, 58, 117, 237, - 154, 114, 134, 168, 135, 216, 140, 222, 84, 125, 67, 83, 141, 221, 154, 130, - 119, 214, 197, 245, 87, 32, 141, 177, 71, 241, 34, 25, 190, 47, 252, 242, - 71, 129, 93, 62, 222, 1, 26, 163, 211, 218, 29, 27, 195, 47, 226, 93, - 108, 194, 198, 112, 246, 192, 203, 91, 237, 118, 70, 35, 157, 0, 245, 87, - 34, 33, 200, 174, 245, 151, 96, 60, 187, 143, 89, 82, 152, 154, 222, 94, - 94, 85, 202, 72, 110, 212, 106, 253, 81, 141, 49, 218, 110, 245, 155, 73, - 110, 191, 154, 161, 216, 79, 136, 250, 73, 56, 231, 104, 249, 25, 68, 107, - 170, 13, 49, 124, 211, 49, 176, 146, 24, 113, 240, 19, 214, 195, 190, 100, - 169, 103, 123, 183, 236, 249, 112, 58, 159, 158, 192, 88, 189, 254, 56, 153, - 29, 179, 246, 118, 8, 61, 234, 172, 77, 249, 146, 82, 145, 233, 92, 58, - 219, 206, 11, 32, 58, 243, 43, 91, 59, 123, 15, 124, 128, 205, 192, 148, - 20, 211, 211, 218, 111, 168, 238, 141, 211, 123, 227, 244, 87, 67, 15, 247, - 122, 255, 159, 214, 56, 61, 191, 218, 108, 149, 6, 210, 254, 62, 88, 0, - 25, 39, 216, 102, 120, 134, 7, 111, 176, 56, 255, 18, 92, 133, 163, 112, - 158, 139, 65, 29, 6, 65, 108, 231, 206, 141, 156, 103, 171, 177, 214, 204, - 119, 252, 117, 27, 163, 46, 1, 74, 239, 55, 62, 247, 188, 101, 207, 91, - 246, 188, 229, 79, 199, 91, 140, 30, 165, 228, 110, 250, 137, 184, 14, 18, - 238, 44, 199, 159, 48, 244, 110, 98, 67, 210, 29, 149, 110, 148, 174, 60, - 91, 120, 145, 202, 29, 182, 113, 35, 222, 110, 145, 31, 253, 223, 140, 111, - 114, 21, 192, 68, 23, 252, 2, 220, 31, 196, 115, 187, 80, 98, 226, 74, - 191, 8, 240, 130, 121, 120, 51, 175, 148, 61, 76, 190, 157, 93, 252, 62, - 164, 37, 181, 230, 170, 193, 210, 225, 229, 252, 124, 140, 102, 150, 156, 149, - 165, 104, 173, 41, 110, 32, 126, 121, 248, 11, 109, 32, 225, 195, 113, 43, - 30, 211, 139, 249, 166, 184, 155, 198, 234, 168, 201, 86, 140, 95, 66, 221, - 102, 40, 213, 227, 102, 218, 2, 136, 6, 100, 51, 188, 254, 118, 217, 240, - 236, 235, 213, 191, 255, 61, 164, 163, 225, 138, 114, 72, 179, 131, 38, 107, - 149, 28, 54, 111, 178, 242, 227, 233, 245, 4, 155, 70, 234, 25, 37, 111, - 38, 232, 86, 30, 32, 157, 14, 7, 223, 148, 209, 83, 24, 190, 8, 101, - 121, 110, 51, 120, 64, 179, 105, 195, 63, 122, 0, 223, 236, 195, 159, 82, - 227, 223, 210, 138, 79, 246, 205, 223, 154, 77, 182, 108, 59, 141, 182, 83, - 227, 143, 63, 184, 70, 115, 95, 86, 50, 92, 29, 12, 121, 73, 189, 80, - 167, 174, 213, 161, 222, 230, 95, 191, 153, 139, 105, 226, 27, 19, 52, 80, - 81, 105, 124, 133, 251, 33, 100, 178, 207, 77, 119, 146, 126, 188, 27, 41, - 126, 225, 217, 228, 198, 86, 142, 141, 33, 71, 98, 104, 82, 63, 107, 73, - 185, 111, 152, 7, 132, 238, 134, 249, 244, 187, 69, 191, 59, 244, 251, 136, - 126, 31, 211, 111, 151, 87, 114, 249, 21, 151, 95, 242, 14, 149, 101, 64, - 233, 40, 123, 184, 211, 169, 26, 209, 184, 221, 138, 132, 11, 46, 8, 148, - 223, 203, 146, 163, 72, 141, 106, 146, 196, 70, 52, 158, 141, 104, 55, 55, - 33, 167, 127, 249, 221, 179, 112, 131, 65, 152, 244, 227, 168, 7, 132, 59, - 192, 105, 186, 33, 12, 64, 221, 210, 19, 27, 118, 9, 31, 224, 102, 2, - 140, 181, 31, 94, 76, 227, 203, 16, 147, 209, 175, 235, 186, 232, 184, 177, - 175, 112, 180, 224, 249, 23, 113, 143, 16, 36, 223, 232, 55, 154, 160, 60, - 7, 227, 124, 8, 189, 163, 16, 7, 138, 163, 184, 128, 149, 64, 25, 154, - 179, 0, 135, 74, 216, 188, 108, 2, 119, 30, 132, 55, 240, 46, 252, 182, - 106, 19, 68, 100, 108, 25, 196, 18, 220, 200, 25, 221, 226, 51, 40, 72, - 130, 162, 32, 98, 52, 253, 81, 51, 50, 212, 226, 163, 133, 65, 124, 26, - 72, 29, 62, 107, 183, 237, 53, 138, 77, 48, 2, 40, 192, 16, 250, 219, - 126, 175, 31, 227, 182, 29, 229, 170, 135, 3, 185, 199, 65, 91, 51, 50, - 202, 254, 72, 171, 161, 111, 60, 138, 239, 92, 202, 118, 157, 92, 81, 232, - 171, 133, 94, 90, 211, 112, 135, 159, 222, 97, 184, 216, 42, 220, 105, 168, - 212, 206, 181, 160, 61, 187, 83, 104, 222, 208, 194, 225, 218, 199, 24, 42, - 31, 21, 30, 103, 168, 116, 188, 166, 18, 244, 77, 14, 33, 255, 16, 244, - 17, 16, 213, 160, 48, 254, 56, 246, 242, 2, 220, 163, 239, 125, 22, 105, - 21, 124, 253, 223, 88, 203, 185, 99, 227, 79, 135, 255, 168, 147, 131, 103, - 24, 206, 51, 254, 147, 147, 31, 128, 16, 102, 116, 240, 124, 208, 239, 71, - 158, 66, 12, 69, 129, 137, 34, 234, 179, 28, 166, 117, 20, 115, 55, 39, - 16, 140, 79, 22, 189, 168, 15, 36, 109, 114, 53, 29, 45, 120, 238, 94, - 117, 159, 0, 39, 49, 74, 130, 235, 253, 66, 12, 90, 110, 211, 69, 23, - 94, 69, 139, 253, 238, 102, 6, 99, 49, 153, 43, 14, 190, 29, 245, 234, - 28, 115, 136, 186, 179, 27, 184, 126, 78, 54, 212, 223, 37, 9, 60, 133, - 154, 151, 97, 127, 58, 88, 31, 143, 196, 50, 12, 17, 215, 132, 33, 242, - 245, 18, 238, 235, 232, 93, 52, 67, 240, 172, 38, 16, 107, 225, 121, 145, - 0, 37, 15, 39, 77, 237, 210, 1, 158, 29, 40, 95, 250, 156, 190, 244, - 185, 242, 165, 207, 181, 47, 109, 126, 235, 116, 124, 95, 13, 213, 24, 55, - 120, 83, 10, 125, 67, 236, 123, 164, 196, 225, 100, 20, 196, 151, 10, 189, - 191, 30, 70, 48, 109, 131, 171, 105, 52, 48, 251, 100, 153, 158, 1, 130, - 66, 116, 1, 92, 59, 177, 25, 49, 131, 100, 30, 68, 113, 31, 25, 109, - 122, 101, 203, 71, 170, 100, 31, 41, 155, 151, 125, 80, 130, 226, 41, 250, - 70, 13, 46, 195, 83, 148, 147, 98, 244, 228, 32, 25, 119, 17, 135, 167, - 67, 144, 121, 177, 72, 108, 223, 111, 125, 132, 120, 64, 58, 169, 211, 246, - 69, 131, 244, 28, 150, 72, 41, 87, 182, 191, 107, 187, 191, 4, 241, 4, - 198, 236, 30, 195, 251, 128, 227, 133, 55, 192, 122, 34, 156, 73, 193, 168, - 217, 52, 113, 20, 177, 244, 89, 154, 253, 192, 237, 226, 26, 196, 4, 8, - 94, 151, 254, 248, 232, 183, 144, 71, 193, 209, 253, 91, 180, 150, 48, 204, - 14, 232, 61, 146, 50, 205, 175, 67, 35, 105, 57, 138, 67, 116, 205, 107, - 223, 177, 241, 231, 144, 255, 228, 169, 19, 40, 55, 226, 221, 207, 225, 63, - 88, 71, 47, 112, 14, 197, 52, 69, 96, 41, 81, 150, 116, 44, 240, 149, - 84, 14, 110, 11, 55, 209, 9, 115, 173, 187, 172, 184, 117, 203, 109, 85, - 107, 22, 80, 228, 33, 41, 43, 74, 153, 183, 42, 77, 224, 206, 62, 252, - 140, 225, 103, 73, 204, 176, 98, 185, 126, 117, 197, 46, 252, 65, 119, 9, - 146, 111, 109, 28, 220, 84, 44, 106, 205, 182, 120, 11, 213, 131, 121, 48, - 169, 88, 135, 181, 89, 116, 224, 119, 156, 234, 170, 4, 149, 153, 133, 191, - 70, 216, 140, 117, 84, 195, 147, 149, 189, 180, 142, 211, 35, 215, 225, 135, - 44, 193, 58, 148, 161, 49, 161, 3, 175, 48, 206, 53, 106, 196, 55, 61, - 25, 152, 55, 92, 228, 190, 53, 203, 134, 213, 145, 231, 40, 172, 195, 121, - 155, 159, 115, 209, 29, 206, 91, 171, 146, 222, 0, 90, 11, 65, 138, 47, - 253, 211, 31, 144, 164, 223, 6, 118, 2, 63, 152, 115, 174, 153, 230, 136, - 134, 254, 140, 130, 126, 120, 78, 146, 18, 61, 172, 225, 138, 127, 28, 103, - 148, 254, 39, 167, 38, 183, 85, 138, 51, 149, 4, 180, 63, 68, 243, 97, - 125, 187, 225, 179, 122, 147, 185, 97, 163, 205, 14, 80, 204, 56, 117, 207, - 88, 13, 15, 80, 201, 128, 89, 162, 163, 25, 241, 47, 236, 63, 102, 143, - 70, 211, 254, 187, 132, 75, 239, 61, 58, 246, 121, 174, 34, 121, 162, 110, - 23, 191, 8, 19, 201, 130, 4, 0, 14, 117, 194, 219, 236, 127, 73, 208, - 54, 106, 160, 201, 40, 188, 146, 27, 210, 18, 113, 160, 225, 230, 246, 226, - 85, 64, 64, 151, 188, 112, 125, 85, 133, 189, 84, 188, 64, 41, 7, 18, - 206, 10, 101, 67, 113, 52, 215, 157, 17, 142, 85, 71, 210, 159, 255, 158, - 61, 25, 25, 157, 122, 241, 36, 68, 138, 139, 100, 146, 103, 171, 84, 236, - 41, 187, 184, 96, 190, 110, 252, 40, 212, 115, 249, 238, 240, 102, 5, 79, - 93, 189, 14, 40, 112, 134, 90, 255, 200, 215, 194, 26, 244, 75, 115, 89, - 8, 251, 228, 134, 144, 218, 13, 55, 184, 46, 203, 186, 47, 135, 17, 80, - 175, 98, 150, 18, 101, 128, 255, 15, 8, 186, 124, 124, 222, 103, 32, 77, - 32, 202, 77, 131, 249, 203, 63, 47, 230, 228, 178, 66, 42, 24, 170, 95, - 248, 183, 34, 188, 211, 212, 153, 242, 249, 66, 197, 64, 220, 119, 76, 178, - 190, 156, 226, 134, 140, 147, 147, 113, 215, 90, 146, 141, 105, 132, 59, 199, - 231, 147, 96, 140, 254, 173, 191, 116, 151, 215, 43, 246, 125, 119, 57, 36, - 175, 55, 36, 23, 215, 246, 16, 200, 17, 217, 5, 30, 64, 105, 236, 13, - 80, 62, 228, 14, 98, 112, 130, 73, 214, 209, 11, 240, 154, 238, 28, 210, - 157, 227, 252, 157, 150, 143, 185, 222, 199, 81, 28, 195, 144, 221, 146, 71, - 34, 242, 232, 180, 127, 100, 196, 186, 83, 106, 32, 9, 89, 90, 215, 7, - 30, 146, 183, 33, 252, 97, 23, 221, 165, 213, 66, 183, 178, 138, 53, 174, - 85, 188, 134, 229, 118, 170, 64, 178, 106, 68, 29, 109, 248, 183, 180, 46, - 106, 65, 47, 169, 0, 113, 179, 220, 3, 156, 97, 234, 35, 51, 210, 229, - 30, 57, 248, 220, 140, 214, 97, 46, 248, 244, 42, 208, 61, 78, 124, 58, - 108, 233, 193, 227, 224, 249, 252, 143, 107, 227, 218, 229, 111, 107, 61, 179, - 225, 159, 40, 65, 79, 61, 73, 207, 175, 243, 212, 155, 73, 234, 93, 226, - 212, 91, 82, 106, 36, 218, 110, 118, 232, 233, 244, 219, 151, 244, 187, 197, - 137, 41, 16, 55, 242, 193, 66, 231, 48, 162, 206, 209, 5, 112, 146, 54, - 144, 91, 175, 186, 178, 201, 169, 114, 8, 20, 17, 72, 36, 81, 70, 244, - 183, 36, 131, 203, 184, 73, 239, 226, 57, 165, 166, 221, 212, 200, 115, 190, - 69, 242, 28, 71, 119, 74, 80, 27, 64, 216, 185, 185, 133, 179, 186, 176, - 202, 16, 66, 90, 147, 125, 211, 109, 50, 135, 204, 68, 68, 139, 249, 47, - 219, 167, 71, 59, 228, 226, 233, 30, 210, 35, 169, 47, 188, 224, 40, 45, - 240, 120, 193, 49, 21, 252, 19, 169, 117, 230, 202, 9, 186, 139, 67, 222, - 143, 186, 75, 39, 159, 88, 99, 161, 201, 108, 96, 28, 142, 206, 54, 58, - 44, 102, 130, 247, 208, 55, 242, 240, 19, 9, 201, 129, 77, 198, 12, 103, - 120, 197, 154, 140, 171, 38, 46, 65, 139, 25, 4, 201, 159, 123, 255, 4, - 97, 149, 115, 139, 62, 47, 155, 82, 145, 96, 26, 185, 50, 83, 160, 135, - 102, 171, 95, 186, 118, 249, 57, 136, 116, 228, 67, 52, 189, 129, 223, 207, - 111, 227, 96, 28, 161, 185, 251, 187, 209, 40, 154, 37, 83, 58, 126, 53, - 141, 23, 184, 125, 240, 244, 54, 230, 5, 191, 132, 81, 76, 54, 241, 197, - 76, 145, 194, 117, 154, 163, 120, 119, 110, 193, 233, 214, 216, 14, 76, 94, - 157, 134, 250, 185, 235, 222, 150, 235, 254, 250, 235, 175, 27, 58, 235, 106, - 31, 230, 89, 215, 175, 185, 26, 45, 55, 95, 227, 31, 185, 26, 94, 161, - 198, 70, 6, 247, 33, 28, 234, 171, 227, 79, 169, 76, 154, 217, 247, 90, - 118, 249, 241, 116, 142, 147, 228, 23, 208, 168, 46, 208, 165, 10, 183, 123, - 64, 115, 18, 127, 26, 47, 135, 193, 128, 54, 82, 158, 78, 23, 113, 176, - 192, 163, 231, 195, 233, 228, 178, 188, 51, 111, 251, 92, 44, 11, 8, 117, - 231, 192, 105, 231, 89, 214, 121, 113, 133, 101, 86, 111, 195, 69, 203, 181, - 60, 144, 206, 59, 141, 163, 21, 46, 9, 164, 112, 160, 103, 52, 218, 171, - 210, 160, 135, 116, 190, 100, 108, 207, 244, 148, 242, 57, 110, 120, 184, 141, - 150, 141, 141, 165, 30, 222, 214, 55, 184, 1, 82, 87, 116, 2, 228, 79, - 15, 236, 107, 36, 223, 15, 236, 225, 138, 66, 207, 150, 199, 180, 79, 130, - 244, 206, 231, 254, 239, 109, 238, 213, 141, 68, 175, 55, 130, 59, 129, 229, - 18, 73, 13, 112, 227, 186, 68, 164, 7, 175, 173, 39, 40, 107, 187, 41, - 174, 127, 238, 238, 210, 53, 67, 143, 206, 17, 35, 116, 134, 4, 14, 89, - 41, 178, 229, 116, 59, 193, 88, 29, 1, 67, 123, 211, 155, 124, 101, 203, - 55, 214, 70, 248, 208, 25, 167, 151, 196, 169, 119, 185, 7, 113, 69, 147, - 25, 6, 138, 100, 15, 113, 137, 155, 123, 156, 169, 251, 43, 227, 125, 136, - 37, 58, 71, 42, 76, 28, 24, 153, 19, 74, 33, 184, 220, 219, 142, 120, - 172, 159, 110, 93, 152, 26, 104, 67, 3, 151, 68, 190, 161, 5, 175, 181, - 67, 87, 59, 112, 199, 53, 210, 121, 184, 193, 247, 118, 184, 225, 16, 110, - 232, 47, 102, 248, 98, 222, 209, 14, 245, 229, 100, 121, 207, 143, 36, 111, - 123, 191, 143, 37, 239, 250, 144, 143, 38, 239, 253, 208, 143, 39, 239, 255, - 221, 31, 81, 54, 164, 125, 204, 247, 25, 106, 245, 155, 186, 187, 124, 83, - 121, 99, 246, 109, 59, 249, 185, 147, 74, 41, 153, 98, 73, 2, 74, 40, - 79, 133, 112, 162, 156, 155, 4, 147, 28, 232, 143, 100, 103, 5, 71, 118, - 115, 4, 232, 70, 159, 159, 194, 206, 238, 57, 247, 21, 242, 90, 246, 17, - 168, 198, 199, 138, 165, 53, 221, 222, 93, 95, 69, 211, 141, 201, 53, 125, - 147, 136, 225, 181, 183, 137, 24, 5, 245, 121, 47, 97, 24, 37, 12, 239, - 139, 75, 24, 102, 68, 180, 135, 131, 1, 11, 96, 93, 207, 24, 233, 170, - 28, 221, 236, 2, 117, 112, 190, 138, 164, 209, 243, 227, 56, 143, 127, 212, - 13, 183, 115, 125, 89, 102, 138, 56, 240, 106, 84, 111, 81, 25, 183, 151, - 227, 8, 180, 199, 7, 117, 88, 239, 192, 192, 171, 43, 14, 14, 110, 125, - 67, 123, 62, 117, 2, 170, 230, 74, 17, 154, 188, 80, 133, 243, 81, 181, - 153, 224, 25, 104, 81, 164, 252, 186, 168, 19, 99, 193, 50, 137, 46, 39, - 252, 188, 135, 231, 150, 87, 82, 158, 47, 237, 102, 160, 94, 161, 166, 149, - 234, 65, 40, 46, 149, 10, 93, 205, 119, 30, 37, 14, 84, 201, 21, 11, - 41, 138, 91, 20, 109, 100, 164, 62, 28, 72, 187, 216, 132, 189, 68, 137, - 4, 197, 145, 101, 91, 113, 49, 65, 10, 119, 51, 143, 69, 86, 65, 162, - 104, 120, 58, 8, 37, 125, 147, 103, 38, 234, 246, 56, 156, 229, 19, 98, - 32, 113, 217, 96, 219, 107, 187, 94, 161, 210, 218, 132, 180, 254, 135, 81, - 63, 119, 59, 245, 203, 87, 201, 81, 191, 189, 130, 245, 159, 163, 96, 253, - 57, 201, 159, 92, 181, 187, 18, 191, 244, 134, 76, 4, 186, 147, 82, 68, - 184, 109, 206, 55, 26, 104, 131, 129, 105, 70, 255, 76, 235, 83, 31, 170, - 119, 66, 108, 43, 233, 68, 172, 149, 18, 177, 60, 137, 17, 36, 44, 119, - 187, 66, 192, 58, 58, 1, 227, 104, 23, 170, 25, 137, 44, 157, 154, 17, - 73, 43, 121, 47, 19, 210, 201, 162, 23, 106, 54, 164, 151, 36, 44, 111, - 51, 32, 97, 8, 93, 47, 122, 183, 105, 94, 236, 105, 216, 158, 134, 125, - 101, 70, 162, 13, 52, 69, 91, 65, 153, 137, 40, 239, 209, 84, 168, 74, - 6, 35, 19, 189, 200, 55, 88, 124, 8, 89, 136, 220, 28, 221, 240, 36, - 221, 48, 46, 105, 104, 71, 221, 21, 49, 181, 169, 152, 115, 114, 109, 95, - 219, 214, 208, 150, 148, 169, 112, 43, 169, 244, 84, 34, 244, 122, 67, 21, - 87, 86, 233, 3, 213, 48, 214, 240, 210, 70, 164, 190, 110, 168, 228, 203, - 74, 169, 98, 222, 105, 217, 190, 103, 168, 169, 106, 223, 184, 4, 124, 71, - 170, 222, 42, 201, 54, 220, 152, 55, 157, 108, 169, 158, 179, 155, 108, 169, - 173, 27, 77, 182, 84, 62, 146, 47, 27, 35, 193, 132, 123, 218, 118, 219, - 80, 77, 53, 172, 108, 249, 10, 170, 49, 101, 243, 215, 80, 13, 40, 91, - 191, 138, 106, 49, 209, 191, 142, 219, 177, 143, 54, 220, 240, 193, 31, 105, - 141, 105, 164, 143, 119, 77, 240, 215, 142, 247, 231, 44, 36, 59, 222, 165, - 153, 71, 118, 188, 167, 240, 49, 125, 219, 71, 223, 228, 140, 91, 3, 221, - 161, 8, 101, 98, 212, 35, 126, 34, 152, 116, 122, 102, 98, 208, 5, 93, - 226, 176, 179, 139, 42, 225, 233, 72, 90, 207, 130, 155, 252, 78, 127, 135, - 179, 177, 77, 212, 246, 75, 114, 234, 130, 37, 229, 189, 77, 45, 133, 10, - 123, 54, 189, 87, 53, 62, 150, 88, 144, 174, 217, 93, 85, 13, 188, 33, - 83, 52, 238, 160, 177, 245, 61, 21, 13, 245, 145, 122, 23, 54, 40, 26, - 114, 55, 186, 124, 10, 52, 72, 220, 113, 86, 174, 218, 179, 105, 130, 11, - 164, 106, 143, 167, 131, 176, 66, 187, 47, 213, 146, 137, 22, 113, 173, 36, - 255, 172, 245, 90, 201, 139, 96, 50, 152, 142, 133, 90, 34, 156, 161, 98, - 42, 19, 212, 78, 158, 172, 213, 66, 42, 82, 247, 56, 225, 56, 131, 39, - 183, 35, 244, 147, 143, 139, 58, 136, 106, 146, 161, 216, 63, 105, 110, 33, - 135, 3, 205, 210, 172, 210, 158, 124, 66, 234, 127, 52, 94, 96, 240, 149, - 102, 174, 118, 244, 251, 255, 35, 73, 135, 255, 49, 72, 199, 207, 194, 225, - 82, 51, 240, 127, 53, 18, 190, 50, 31, 13, 158, 75, 154, 23, 37, 186, - 24, 113, 231, 155, 118, 209, 249, 70, 184, 78, 118, 82, 135, 155, 195, 244, - 232, 72, 243, 188, 57, 150, 142, 55, 142, 212, 36, 42, 114, 41, 45, 177, - 122, 178, 170, 98, 240, 147, 151, 42, 24, 94, 169, 2, 106, 249, 127, 59, - 80, 94, 71, 4, 50, 251, 191, 93, 14, 119, 230, 99, 61, 152, 28, 36, - 236, 203, 151, 0, 209, 126, 249, 118, 197, 165, 149, 152, 111, 105, 145, 115, - 229, 162, 194, 121, 225, 10, 90, 91, 192, 196, 130, 79, 0, 13, 214, 120, - 131, 206, 138, 25, 74, 113, 123, 23, 90, 192, 80, 169, 134, 103, 191, 133, - 190, 225, 15, 84, 195, 144, 166, 22, 250, 114, 166, 126, 52, 98, 67, 28, - 46, 162, 111, 8, 213, 210, 15, 56, 138, 42, 52, 119, 138, 106, 204, 25, - 251, 39, 183, 15, 167, 30, 156, 208, 69, 129, 112, 69, 190, 70, 239, 40, - 232, 64, 3, 84, 147, 47, 232, 164, 27, 133, 150, 171, 93, 64, 161, 23, - 141, 209, 124, 244, 250, 83, 218, 129, 196, 46, 91, 110, 38, 188, 201, 202, - 158, 94, 89, 16, 152, 13, 55, 104, 187, 133, 64, 193, 61, 237, 106, 75, - 105, 206, 215, 118, 5, 229, 183, 224, 211, 253, 17, 204, 58, 78, 17, 123, - 112, 100, 203, 3, 83, 16, 131, 128, 20, 21, 145, 240, 232, 121, 147, 151, - 249, 52, 58, 144, 219, 195, 58, 50, 209, 0, 205, 13, 52, 87, 9, 214, - 241, 244, 58, 187, 74, 132, 68, 121, 152, 238, 12, 196, 221, 104, 55, 187, - 1, 125, 74, 104, 5, 35, 86, 125, 143, 198, 182, 68, 127, 144, 197, 46, - 219, 141, 67, 114, 9, 111, 180, 132, 151, 222, 55, 15, 96, 229, 240, 232, - 187, 9, 250, 124, 177, 50, 113, 70, 252, 40, 156, 31, 150, 151, 20, 49, - 88, 171, 156, 90, 203, 6, 44, 249, 243, 235, 225, 234, 172, 113, 10, 11, - 255, 172, 186, 42, 87, 203, 34, 155, 103, 254, 222, 50, 227, 80, 122, 234, - 167, 228, 92, 147, 119, 166, 166, 60, 62, 190, 146, 46, 111, 220, 251, 65, - 156, 16, 255, 101, 41, 166, 216, 9, 7, 71, 123, 24, 75, 247, 48, 58, - 63, 151, 65, 175, 217, 233, 26, 6, 234, 218, 101, 206, 134, 9, 124, 32, - 73, 130, 127, 78, 97, 46, 37, 179, 72, 71, 96, 205, 152, 166, 248, 236, - 237, 53, 192, 182, 107, 25, 204, 179, 233, 96, 49, 154, 138, 89, 122, 132, - 112, 13, 29, 93, 104, 108, 60, 92, 47, 53, 10, 73, 225, 132, 71, 180, - 237, 32, 85, 166, 87, 214, 0, 196, 102, 175, 154, 193, 64, 145, 176, 105, - 8, 69, 56, 89, 196, 87, 24, 106, 174, 101, 107, 163, 1, 80, 157, 147, - 121, 173, 45, 106, 197, 51, 224, 173, 208, 124, 97, 176, 236, 70, 59, 167, - 130, 25, 171, 193, 152, 234, 21, 95, 55, 30, 71, 9, 44, 9, 13, 223, - 204, 213, 23, 228, 175, 59, 212, 121, 157, 229, 222, 225, 112, 100, 122, 42, - 186, 95, 55, 95, 254, 140, 217, 39, 60, 115, 216, 122, 54, 205, 5, 34, - 229, 55, 22, 110, 9, 194, 242, 141, 67, 208, 12, 38, 58, 218, 104, 73, - 196, 63, 120, 181, 138, 229, 189, 5, 10, 86, 5, 102, 135, 4, 186, 201, - 144, 177, 177, 186, 225, 24, 125, 129, 125, 22, 156, 82, 244, 249, 25, 187, - 229, 209, 193, 228, 80, 236, 218, 34, 156, 194, 171, 89, 135, 216, 212, 220, - 233, 34, 47, 247, 144, 247, 187, 71, 24, 95, 50, 189, 78, 40, 172, 23, - 177, 77, 239, 198, 221, 155, 131, 202, 53, 136, 250, 247, 231, 93, 172, 83, - 187, 57, 176, 188, 251, 209, 69, 229, 22, 58, 103, 87, 226, 183, 192, 219, - 170, 181, 62, 80, 25, 107, 238, 212, 45, 215, 175, 205, 171, 54, 191, 236, - 242, 203, 94, 181, 150, 160, 210, 64, 151, 91, 120, 25, 251, 1, 140, 209, - 135, 55, 58, 174, 3, 127, 113, 26, 214, 113, 181, 22, 87, 225, 191, 187, - 232, 176, 58, 106, 150, 230, 240, 38, 9, 208, 174, 144, 37, 236, 6, 125, - 133, 201, 254, 87, 138, 144, 68, 85, 150, 119, 79, 126, 24, 131, 204, 126, - 151, 59, 180, 160, 180, 62, 172, 150, 234, 117, 228, 233, 240, 246, 167, 141, - 150, 221, 240, 206, 88, 132, 138, 71, 4, 131, 64, 164, 136, 7, 66, 224, - 160, 116, 104, 80, 110, 74, 46, 154, 7, 81, 142, 104, 179, 244, 208, 171, - 221, 178, 58, 121, 2, 167, 163, 119, 195, 126, 195, 225, 104, 151, 124, 89, - 201, 205, 234, 67, 207, 110, 65, 221, 187, 37, 174, 174, 59, 145, 113, 133, - 9, 197, 136, 4, 132, 45, 59, 245, 230, 22, 142, 185, 28, 107, 20, 251, - 159, 240, 215, 72, 86, 172, 94, 227, 242, 131, 149, 112, 23, 94, 43, 177, - 173, 36, 45, 93, 90, 9, 232, 97, 56, 64, 40, 102, 224, 62, 182, 119, - 166, 8, 26, 152, 78, 17, 214, 48, 54, 239, 157, 149, 238, 32, 112, 44, - 61, 164, 195, 162, 102, 206, 243, 152, 209, 60, 17, 177, 219, 232, 214, 4, - 211, 179, 73, 50, 21, 11, 255, 181, 32, 204, 241, 38, 58, 66, 119, 216, - 36, 173, 165, 209, 245, 100, 24, 192, 155, 94, 133, 24, 161, 71, 46, 225, - 87, 138, 88, 131, 126, 110, 18, 231, 149, 191, 165, 234, 85, 44, 194, 81, - 82, 158, 240, 29, 60, 144, 172, 64, 207, 71, 211, 57, 38, 172, 36, 10, - 23, 71, 125, 17, 46, 30, 138, 235, 231, 179, 244, 138, 189, 166, 60, 163, - 16, 149, 57, 198, 101, 160, 166, 189, 44, 227, 228, 155, 87, 107, 149, 240, - 102, 86, 193, 121, 58, 175, 86, 27, 30, 205, 88, 156, 140, 13, 186, 12, - 18, 116, 245, 109, 187, 170, 168, 226, 191, 170, 77, 240, 219, 222, 183, 9, - 160, 159, 141, 188, 98, 148, 247, 20, 2, 226, 169, 212, 89, 231, 79, 84, - 176, 149, 161, 1, 10, 62, 183, 239, 29, 118, 20, 105, 71, 134, 85, 108, - 81, 77, 64, 247, 81, 243, 112, 58, 57, 2, 249, 114, 142, 148, 73, 151, - 140, 8, 97, 83, 13, 207, 153, 12, 12, 142, 212, 90, 149, 212, 29, 92, - 116, 234, 189, 131, 68, 30, 135, 253, 105, 188, 14, 148, 242, 243, 201, 101, - 248, 207, 36, 151, 25, 230, 159, 65, 211, 82, 55, 47, 226, 113, 201, 106, - 115, 42, 99, 223, 45, 207, 187, 150, 95, 191, 1, 18, 216, 2, 114, 93, - 61, 0, 237, 11, 137, 44, 80, 206, 62, 18, 86, 50, 166, 84, 203, 119, - 75, 10, 214, 52, 8, 231, 21, 235, 8, 149, 137, 183, 148, 57, 214, 3, - 226, 138, 53, 253, 42, 2, 68, 112, 48, 7, 106, 222, 135, 21, 142, 209, - 92, 3, 96, 165, 163, 224, 86, 237, 33, 223, 19, 65, 168, 88, 164, 197, - 110, 211, 113, 92, 160, 158, 135, 54, 198, 68, 88, 110, 167, 224, 215, 159, - 91, 157, 191, 118, 47, 42, 175, 171, 133, 149, 9, 215, 236, 66, 73, 102, - 99, 128, 91, 210, 165, 244, 186, 214, 175, 187, 14, 173, 157, 215, 245, 126, - 125, 161, 46, 152, 215, 141, 103, 10, 174, 61, 134, 123, 21, 109, 9, 80, - 39, 184, 81, 125, 84, 138, 85, 10, 171, 5, 107, 120, 57, 53, 227, 68, - 230, 178, 151, 89, 218, 117, 192, 46, 122, 93, 93, 248, 204, 18, 68, 32, - 238, 21, 1, 21, 97, 154, 90, 142, 94, 26, 196, 170, 213, 6, 193, 121, - 194, 155, 220, 253, 78, 122, 255, 115, 140, 23, 195, 219, 78, 226, 105, 130, - 105, 41, 93, 229, 24, 113, 43, 184, 156, 44, 202, 197, 49, 150, 191, 132, - 241, 141, 67, 42, 22, 135, 222, 239, 73, 60, 128, 70, 75, 178, 89, 102, - 97, 203, 24, 212, 117, 133, 40, 157, 152, 162, 18, 170, 188, 166, 235, 209, - 36, 153, 135, 193, 0, 225, 73, 161, 236, 70, 148, 81, 64, 116, 208, 155, - 130, 36, 41, 63, 60, 197, 227, 6, 239, 66, 214, 199, 206, 65, 117, 172, - 242, 186, 49, 142, 38, 7, 192, 255, 16, 226, 116, 14, 139, 93, 193, 119, - 248, 187, 242, 172, 62, 181, 27, 135, 23, 136, 194, 137, 13, 97, 118, 204, - 69, 76, 216, 156, 98, 25, 176, 201, 98, 220, 11, 99, 243, 253, 139, 220, - 253, 1, 91, 76, 162, 139, 105, 60, 30, 221, 50, 88, 10, 48, 255, 123, - 11, 68, 75, 229, 218, 45, 188, 38, 226, 141, 193, 107, 156, 194, 252, 57, - 107, 42, 211, 103, 176, 232, 135, 8, 125, 33, 103, 17, 180, 213, 195, 55, - 133, 199, 192, 33, 170, 65, 234, 152, 227, 104, 135, 236, 50, 14, 102, 67, - 68, 197, 152, 195, 183, 54, 198, 55, 127, 121, 139, 144, 182, 60, 119, 32, - 86, 45, 162, 38, 64, 179, 202, 175, 187, 150, 7, 146, 154, 223, 0, 162, - 4, 18, 32, 18, 45, 32, 86, 150, 91, 46, 13, 46, 229, 62, 107, 135, - 232, 8, 121, 219, 230, 169, 72, 10, 200, 124, 122, 50, 141, 39, 240, 121, - 4, 5, 233, 211, 217, 249, 165, 184, 108, 27, 202, 114, 170, 186, 203, 42, - 255, 55, 59, 64, 36, 45, 198, 155, 170, 106, 218, 187, 252, 209, 130, 8, - 249, 157, 30, 221, 73, 248, 90, 198, 91, 11, 249, 59, 249, 109, 62, 171, - 112, 152, 46, 243, 67, 5, 152, 183, 233, 206, 86, 122, 167, 249, 161, 226, - 129, 91, 237, 13, 92, 143, 4, 150, 174, 43, 194, 137, 64, 88, 78, 49, - 248, 10, 112, 53, 95, 126, 194, 229, 190, 37, 203, 130, 193, 15, 77, 145, - 236, 215, 195, 174, 176, 25, 226, 244, 171, 32, 15, 108, 223, 39, 86, 231, - 191, 37, 236, 252, 251, 156, 225, 181, 222, 162, 130, 115, 120, 31, 205, 106, - 192, 184, 222, 162, 225, 238, 232, 62, 55, 180, 129, 32, 115, 126, 217, 59, - 191, 184, 70, 59, 213, 97, 9, 161, 153, 174, 135, 82, 236, 244, 233, 90, - 79, 92, 219, 48, 75, 23, 9, 124, 55, 180, 30, 205, 66, 57, 85, 169, - 40, 55, 85, 245, 178, 247, 73, 89, 132, 45, 51, 145, 46, 105, 58, 89, - 167, 204, 243, 20, 127, 236, 209, 45, 43, 192, 235, 61, 14, 226, 119, 236, - 121, 116, 3, 44, 12, 249, 79, 76, 83, 44, 61, 7, 9, 240, 95, 8, - 39, 206, 207, 55, 251, 102, 230, 225, 208, 11, 64, 32, 5, 84, 47, 137, - 39, 199, 223, 162, 40, 156, 109, 96, 55, 34, 75, 19, 222, 152, 176, 235, - 104, 62, 100, 116, 153, 1, 117, 158, 190, 131, 162, 113, 112, 203, 70, 200, - 106, 128, 208, 70, 19, 152, 63, 8, 124, 193, 196, 192, 238, 70, 86, 183, - 117, 35, 253, 204, 219, 141, 41, 63, 17, 183, 65, 62, 150, 26, 115, 72, - 250, 206, 225, 119, 158, 220, 246, 71, 161, 234, 234, 175, 39, 172, 255, 249, - 226, 2, 177, 189, 215, 14, 39, 26, 41, 185, 8, 44, 238, 39, 171, 168, - 134, 107, 248, 3, 48, 191, 184, 96, 213, 113, 10, 77, 129, 176, 189, 83, - 61, 137, 167, 248, 140, 75, 133, 170, 140, 115, 50, 12, 123, 183, 201, 48, - 188, 42, 83, 38, 172, 97, 48, 159, 83, 170, 163, 239, 22, 253, 81, 52, - 8, 3, 21, 97, 132, 19, 186, 124, 35, 2, 67, 235, 251, 151, 127, 47, - 144, 36, 218, 87, 97, 8, 155, 136, 31, 248, 73, 20, 39, 153, 166, 145, - 159, 69, 114, 150, 165, 223, 75, 84, 81, 95, 3, 145, 168, 210, 235, 15, - 241, 19, 156, 115, 200, 187, 223, 51, 65, 120, 135, 104, 211, 54, 34, 84, - 215, 181, 182, 54, 172, 56, 14, 102, 69, 43, 37, 166, 239, 122, 76, 187, - 190, 184, 117, 4, 66, 85, 156, 158, 106, 47, 40, 75, 179, 166, 50, 157, - 172, 211, 110, 251, 10, 103, 112, 147, 188, 82, 230, 20, 121, 150, 87, 208, - 203, 140, 172, 205, 143, 77, 213, 12, 156, 172, 5, 211, 200, 92, 177, 192, - 185, 218, 133, 170, 142, 185, 98, 103, 77, 197, 220, 163, 15, 13, 213, 12, - 12, 243, 168, 80, 109, 109, 72, 239, 177, 241, 101, 12, 109, 186, 142, 241, - 217, 95, 8, 115, 217, 1, 5, 212, 49, 49, 87, 51, 247, 145, 76, 182, - 12, 92, 182, 221, 93, 149, 11, 92, 22, 77, 50, 45, 158, 47, 40, 215, - 132, 75, 155, 224, 110, 107, 101, 151, 129, 173, 82, 120, 36, 109, 130, 179, - 122, 24, 79, 7, 33, 238, 1, 53, 164, 5, 168, 62, 160, 180, 60, 77, - 214, 70, 75, 25, 47, 235, 179, 73, 51, 3, 78, 204, 53, 78, 118, 45, - 99, 243, 104, 68, 35, 235, 146, 8, 150, 36, 211, 87, 177, 129, 245, 119, - 11, 136, 47, 12, 250, 55, 189, 150, 115, 186, 238, 201, 164, 55, 47, 29, - 208, 155, 27, 110, 7, 116, 103, 244, 64, 106, 49, 218, 16, 22, 59, 140, - 76, 4, 220, 31, 217, 80, 109, 216, 240, 68, 136, 167, 230, 201, 96, 232, - 106, 254, 27, 152, 122, 181, 166, 79, 34, 71, 145, 251, 160, 235, 252, 229, - 47, 147, 32, 190, 172, 208, 245, 234, 10, 212, 121, 16, 165, 46, 227, 174, - 181, 108, 0, 249, 30, 158, 95, 70, 227, 217, 74, 54, 151, 148, 112, 247, - 7, 131, 119, 203, 19, 153, 55, 240, 252, 34, 130, 97, 133, 151, 97, 111, - 176, 141, 55, 229, 242, 138, 156, 38, 168, 149, 101, 143, 94, 133, 77, 23, - 243, 217, 98, 142, 69, 112, 179, 120, 196, 129, 37, 171, 53, 225, 135, 119, - 144, 6, 185, 217, 100, 21, 231, 45, 253, 95, 205, 190, 251, 205, 58, 195, - 167, 105, 142, 173, 159, 7, 165, 58, 106, 105, 136, 221, 132, 117, 92, 202, - 11, 164, 21, 57, 84, 84, 67, 99, 55, 171, 83, 29, 252, 99, 139, 205, - 218, 113, 119, 105, 29, 223, 169, 193, 119, 138, 198, 43, 130, 222, 192, 108, - 64, 116, 254, 108, 181, 42, 53, 232, 193, 99, 142, 119, 179, 116, 237, 202, - 117, 195, 67, 179, 11, 101, 144, 90, 137, 246, 74, 18, 120, 15, 4, 145, - 25, 125, 249, 156, 93, 211, 248, 33, 239, 73, 244, 4, 140, 195, 35, 149, - 105, 233, 30, 53, 218, 157, 21, 131, 117, 62, 94, 224, 42, 185, 253, 173, - 127, 195, 39, 54, 175, 225, 179, 4, 213, 80, 142, 252, 64, 70, 123, 110, - 101, 21, 96, 63, 52, 195, 200, 236, 188, 68, 187, 208, 138, 63, 192, 71, - 113, 118, 233, 57, 78, 205, 234, 172, 200, 150, 106, 19, 2, 114, 233, 220, - 212, 173, 38, 79, 174, 116, 84, 74, 134, 209, 197, 28, 13, 68, 220, 242, - 127, 93, 195, 189, 64, 235, 240, 14, 1, 96, 16, 81, 229, 22, 238, 229, - 245, 129, 151, 166, 74, 218, 220, 100, 76, 57, 195, 242, 253, 96, 133, 39, - 105, 79, 193, 119, 50, 54, 171, 100, 18, 67, 60, 195, 33, 223, 125, 64, - 60, 196, 97, 114, 69, 190, 67, 57, 112, 67, 81, 35, 193, 42, 240, 211, - 148, 216, 137, 77, 185, 56, 177, 127, 150, 87, 19, 246, 176, 150, 237, 155, - 30, 0, 141, 139, 187, 215, 61, 0, 154, 204, 218, 79, 210, 186, 248, 30, - 38, 234, 121, 175, 212, 99, 136, 193, 162, 108, 222, 192, 247, 12, 12, 168, - 144, 209, 179, 7, 209, 184, 238, 123, 4, 10, 219, 100, 15, 186, 124, 82, - 58, 78, 195, 242, 101, 10, 53, 92, 156, 20, 184, 54, 161, 228, 111, 116, - 91, 240, 0, 190, 221, 138, 125, 75, 245, 49, 103, 24, 77, 169, 220, 237, - 140, 39, 65, 83, 65, 34, 115, 224, 200, 188, 221, 111, 187, 216, 132, 246, - 230, 198, 122, 15, 186, 249, 174, 209, 91, 73, 203, 36, 71, 79, 209, 42, - 165, 198, 253, 76, 165, 186, 136, 65, 161, 66, 101, 85, 232, 83, 104, 57, - 211, 181, 41, 173, 196, 164, 75, 145, 97, 26, 5, 101, 178, 159, 105, 216, - 75, 50, 177, 157, 144, 118, 52, 67, 181, 249, 14, 97, 53, 164, 187, 58, - 173, 162, 176, 240, 50, 192, 140, 85, 170, 84, 94, 148, 162, 83, 57, 91, - 118, 65, 247, 11, 221, 174, 6, 129, 86, 48, 226, 109, 128, 52, 12, 252, - 158, 216, 60, 30, 199, 160, 248, 33, 96, 94, 202, 80, 68, 181, 62, 72, - 163, 243, 56, 64, 243, 161, 73, 23, 122, 57, 149, 150, 251, 68, 17, 199, - 31, 79, 39, 119, 231, 116, 13, 53, 197, 91, 202, 190, 116, 50, 29, 115, - 216, 59, 94, 36, 80, 244, 245, 66, 142, 199, 175, 151, 105, 9, 157, 100, - 21, 45, 107, 147, 124, 64, 190, 48, 117, 235, 82, 250, 251, 34, 36, 140, - 242, 77, 34, 254, 246, 76, 166, 249, 155, 221, 223, 171, 31, 124, 34, 73, - 174, 141, 102, 18, 167, 99, 144, 228, 180, 153, 175, 202, 14, 142, 148, 29, - 244, 26, 194, 243, 66, 10, 7, 206, 71, 16, 14, 156, 223, 35, 28, 56, - 101, 1, 51, 36, 228, 204, 152, 34, 71, 200, 226, 210, 105, 9, 219, 75, - 42, 42, 25, 151, 185, 193, 24, 41, 56, 33, 113, 190, 99, 86, 55, 141, - 2, 18, 58, 204, 231, 201, 243, 223, 89, 238, 29, 225, 128, 10, 63, 45, - 100, 75, 206, 205, 19, 135, 255, 111, 231, 212, 150, 245, 119, 136, 27, 158, - 216, 169, 118, 197, 183, 118, 21, 87, 151, 84, 102, 4, 250, 109, 19, 186, - 29, 188, 164, 38, 53, 202, 91, 185, 244, 120, 234, 158, 161, 104, 137, 55, - 13, 87, 141, 214, 17, 31, 90, 77, 132, 44, 190, 221, 189, 82, 48, 63, - 215, 122, 233, 164, 253, 116, 88, 204, 104, 51, 31, 83, 195, 89, 237, 170, - 224, 193, 124, 119, 183, 52, 102, 229, 139, 16, 179, 74, 132, 232, 58, 150, - 82, 105, 248, 72, 217, 21, 79, 189, 226, 170, 87, 124, 245, 138, 167, 94, - 225, 81, 15, 228, 218, 55, 74, 169, 128, 114, 189, 157, 93, 79, 209, 142, - 215, 60, 164, 179, 177, 170, 246, 212, 195, 172, 170, 100, 247, 146, 219, 107, - 239, 134, 211, 228, 176, 16, 189, 84, 23, 173, 224, 165, 43, 220, 167, 103, - 9, 146, 200, 186, 125, 195, 208, 205, 1, 19, 120, 202, 111, 32, 188, 46, - 44, 196, 192, 178, 58, 217, 128, 250, 242, 194, 145, 4, 95, 187, 97, 6, - 254, 198, 237, 176, 10, 115, 11, 226, 34, 123, 11, 12, 118, 237, 148, 171, - 109, 85, 238, 5, 47, 219, 81, 31, 127, 121, 29, 204, 114, 62, 72, 26, - 192, 191, 22, 27, 88, 192, 127, 120, 130, 118, 26, 190, 19, 188, 214, 110, - 69, 117, 112, 39, 120, 3, 139, 220, 209, 158, 237, 252, 49, 236, 217, 185, - 111, 168, 216, 179, 141, 200, 172, 5, 123, 246, 91, 203, 123, 107, 249, 111, - 173, 86, 149, 85, 172, 246, 91, 171, 243, 214, 58, 124, 107, 29, 85, 5, - 145, 203, 156, 232, 144, 156, 162, 225, 90, 177, 101, 251, 165, 11, 24, 111, - 209, 5, 198, 13, 225, 168, 35, 121, 138, 77, 123, 211, 206, 11, 186, 103, - 97, 14, 119, 225, 184, 142, 39, 250, 4, 205, 149, 125, 225, 9, 250, 177, - 38, 32, 199, 234, 44, 2, 117, 74, 113, 241, 143, 61, 85, 215, 203, 20, - 185, 175, 169, 76, 213, 214, 39, 159, 170, 173, 82, 234, 109, 196, 186, 77, - 210, 228, 145, 203, 186, 160, 175, 72, 117, 30, 61, 172, 206, 113, 66, 203, - 153, 172, 204, 226, 214, 198, 89, 140, 123, 183, 233, 44, 198, 147, 252, 44, - 214, 202, 12, 62, 161, 25, 38, 173, 238, 119, 28, 134, 131, 245, 214, 215, - 29, 54, 78, 248, 180, 127, 196, 209, 167, 77, 214, 200, 175, 46, 118, 160, - 115, 224, 28, 29, 56, 173, 181, 177, 3, 170, 52, 178, 70, 60, 203, 252, - 202, 164, 65, 195, 43, 133, 87, 193, 8, 248, 55, 12, 70, 101, 210, 117, - 160, 239, 223, 90, 174, 205, 234, 245, 137, 93, 66, 207, 13, 110, 27, 88, - 144, 83, 97, 245, 126, 233, 86, 41, 26, 242, 162, 168, 114, 99, 223, 226, - 122, 117, 241, 248, 191, 28, 27, 78, 73, 173, 83, 170, 226, 210, 173, 106, - 151, 221, 205, 151, 189, 205, 151, 125, 188, 108, 29, 214, 80, 106, 171, 179, - 138, 219, 176, 14, 171, 181, 92, 245, 106, 153, 139, 129, 135, 223, 8, 51, - 130, 64, 14, 149, 86, 79, 41, 215, 117, 9, 239, 147, 174, 231, 204, 20, - 8, 43, 58, 153, 161, 254, 118, 62, 144, 57, 128, 160, 22, 73, 136, 52, - 144, 28, 64, 142, 84, 123, 233, 66, 151, 12, 83, 115, 8, 55, 65, 104, - 249, 201, 155, 20, 17, 213, 225, 102, 201, 252, 186, 225, 58, 87, 22, 157, - 41, 79, 109, 237, 76, 10, 225, 38, 197, 85, 141, 113, 123, 58, 154, 194, - 163, 215, 110, 155, 101, 126, 60, 217, 182, 217, 203, 121, 28, 6, 239, 228, - 190, 153, 87, 68, 148, 33, 63, 52, 78, 156, 249, 82, 56, 166, 101, 213, - 222, 228, 206, 227, 181, 209, 247, 77, 215, 181, 57, 93, 208, 51, 61, 231, - 253, 218, 76, 9, 158, 219, 185, 69, 156, 45, 223, 52, 156, 40, 231, 26, - 190, 43, 119, 219, 72, 78, 118, 218, 147, 82, 199, 254, 7, 220, 138, 10, - 104, 159, 20, 6, 116, 221, 192, 191, 254, 181, 113, 50, 157, 198, 192, 133, - 113, 185, 23, 152, 158, 254, 34, 92, 4, 172, 12, 194, 203, 42, 83, 157, - 20, 143, 28, 61, 51, 245, 171, 97, 212, 127, 71, 195, 86, 153, 221, 84, - 197, 59, 117, 200, 108, 162, 140, 219, 104, 17, 43, 131, 230, 237, 10, 247, - 179, 230, 117, 31, 46, 110, 162, 81, 20, 196, 183, 226, 133, 215, 78, 53, - 116, 24, 19, 251, 171, 234, 44, 242, 10, 30, 255, 232, 53, 102, 168, 216, - 41, 8, 12, 216, 162, 48, 236, 104, 243, 146, 118, 138, 242, 45, 26, 42, - 114, 25, 196, 203, 55, 201, 71, 251, 49, 44, 52, 238, 40, 165, 143, 187, - 47, 224, 149, 245, 214, 55, 223, 211, 42, 220, 147, 125, 169, 28, 78, 29, - 229, 126, 183, 41, 14, 74, 255, 98, 197, 122, 110, 174, 154, 100, 85, 134, - 22, 157, 92, 213, 207, 232, 89, 191, 38, 86, 102, 148, 209, 59, 157, 97, - 125, 123, 166, 136, 36, 35, 32, 210, 240, 54, 25, 192, 246, 1, 2, 95, - 123, 119, 86, 169, 77, 222, 77, 239, 118, 133, 226, 255, 45, 26, 81, 163, - 174, 83, 154, 132, 215, 231, 163, 240, 42, 28, 117, 93, 113, 140, 51, 160, - 107, 249, 116, 118, 35, 106, 220, 138, 191, 1, 126, 193, 46, 137, 52, 104, - 55, 141, 186, 75, 201, 82, 92, 155, 123, 227, 87, 40, 142, 182, 102, 117, - 170, 232, 140, 207, 91, 94, 90, 145, 253, 223, 13, 111, 85, 226, 183, 243, - 83, 140, 121, 237, 157, 211, 98, 78, 168, 40, 58, 237, 156, 173, 74, 51, - 217, 100, 197, 74, 47, 55, 188, 106, 109, 1, 50, 220, 33, 10, 93, 71, - 119, 176, 225, 172, 219, 75, 139, 254, 214, 221, 149, 218, 127, 26, 11, 207, - 46, 54, 101, 205, 120, 91, 199, 104, 132, 112, 238, 84, 101, 99, 55, 162, - 15, 71, 117, 24, 187, 217, 217, 74, 188, 54, 47, 60, 86, 11, 229, 75, - 208, 223, 58, 180, 229, 161, 111, 43, 116, 49, 186, 168, 44, 208, 158, 77, - 110, 244, 213, 149, 52, 171, 103, 31, 209, 202, 58, 200, 243, 141, 241, 208, - 63, 129, 61, 158, 182, 77, 225, 124, 188, 242, 13, 47, 190, 45, 213, 57, - 252, 35, 126, 103, 130, 123, 67, 59, 140, 204, 174, 144, 74, 163, 212, 142, - 43, 156, 230, 155, 205, 18, 109, 105, 194, 66, 195, 157, 163, 118, 173, 130, - 80, 225, 158, 255, 0, 42, 97, 31, 157, 234, 91, 60, 173, 85, 172, 116, - 44, 81, 90, 129, 126, 247, 96, 37, 241, 1, 196, 21, 81, 167, 60, 22, - 157, 170, 184, 191, 245, 0, 125, 79, 219, 116, 115, 171, 112, 51, 220, 45, - 76, 237, 93, 138, 172, 70, 81, 153, 0, 189, 107, 21, 15, 239, 104, 155, - 238, 144, 59, 175, 150, 236, 47, 3, 161, 192, 194, 94, 8, 81, 132, 67, - 136, 75, 27, 62, 116, 12, 55, 201, 220, 179, 146, 210, 214, 253, 108, 248, - 148, 141, 188, 219, 210, 44, 158, 94, 198, 72, 65, 150, 21, 235, 65, 13, - 9, 227, 1, 124, 124, 250, 60, 36, 87, 96, 4, 35, 171, 17, 70, 58, - 197, 98, 232, 97, 5, 23, 125, 190, 187, 119, 216, 56, 166, 172, 35, 34, - 42, 226, 74, 223, 44, 45, 8, 30, 166, 8, 85, 109, 30, 212, 208, 122, - 163, 109, 17, 231, 44, 103, 217, 178, 31, 157, 194, 123, 42, 1, 34, 4, - 97, 10, 47, 176, 170, 98, 188, 135, 203, 40, 243, 99, 19, 51, 16, 187, - 172, 191, 24, 47, 248, 80, 246, 40, 238, 84, 108, 95, 57, 20, 224, 33, - 94, 202, 181, 111, 149, 208, 17, 63, 13, 29, 89, 14, 113, 239, 153, 156, - 185, 89, 253, 162, 201, 138, 97, 35, 165, 86, 214, 134, 91, 82, 162, 68, - 164, 108, 38, 131, 186, 132, 108, 38, 78, 109, 237, 108, 35, 98, 134, 136, - 2, 56, 114, 143, 189, 93, 120, 237, 235, 70, 14, 169, 226, 152, 196, 226, - 244, 250, 175, 91, 174, 255, 163, 81, 136, 54, 223, 13, 209, 244, 117, 227, - 217, 98, 52, 143, 102, 163, 40, 204, 56, 8, 65, 146, 106, 79, 55, 84, - 58, 204, 85, 250, 135, 169, 146, 147, 171, 180, 169, 35, 38, 95, 44, 181, - 15, 155, 175, 255, 99, 203, 245, 77, 79, 254, 228, 40, 32, 155, 114, 123, - 73, 185, 64, 189, 185, 93, 208, 93, 183, 10, 181, 159, 17, 219, 124, 141, - 98, 58, 202, 86, 77, 33, 249, 158, 220, 49, 16, 134, 12, 74, 255, 99, - 136, 114, 111, 101, 9, 130, 210, 214, 120, 84, 51, 230, 125, 61, 34, 71, - 230, 99, 30, 19, 225, 104, 12, 199, 245, 153, 56, 117, 121, 92, 55, 19, - 145, 232, 142, 205, 77, 24, 196, 115, 232, 137, 150, 39, 146, 107, 66, 79, - 232, 220, 23, 169, 53, 229, 121, 139, 58, 37, 98, 54, 248, 37, 232, 143, - 136, 55, 119, 137, 85, 53, 181, 48, 114, 133, 81, 149, 84, 35, 202, 3, - 220, 147, 111, 221, 1, 138, 143, 177, 111, 92, 243, 204, 37, 154, 104, 169, - 137, 38, 218, 249, 68, 19, 157, 124, 162, 137, 44, 21, 133, 175, 166, 162, - 168, 167, 201, 37, 114, 74, 230, 51, 144, 153, 194, 81, 47, 158, 206, 89, - 131, 253, 207, 2, 196, 118, 220, 216, 20, 100, 109, 156, 94, 180, 245, 211, - 130, 210, 249, 218, 129, 105, 68, 62, 249, 149, 134, 74, 22, 204, 197, 175, - 221, 180, 88, 173, 108, 44, 93, 163, 99, 60, 137, 65, 56, 0, 149, 10, - 157, 247, 214, 169, 23, 178, 206, 75, 90, 243, 114, 67, 53, 123, 227, 178, - 93, 166, 55, 86, 76, 127, 134, 100, 240, 136, 25, 212, 201, 171, 128, 64, - 141, 81, 69, 172, 208, 253, 138, 6, 214, 244, 221, 67, 116, 105, 209, 9, - 179, 185, 170, 227, 231, 106, 238, 14, 88, 35, 29, 14, 183, 235, 240, 154, - 235, 171, 139, 12, 199, 115, 90, 235, 178, 57, 241, 120, 233, 156, 247, 170, - 162, 11, 243, 13, 122, 28, 138, 157, 67, 114, 53, 152, 29, 32, 39, 151, - 65, 209, 101, 58, 235, 247, 63, 166, 24, 122, 205, 141, 190, 134, 76, 215, - 42, 101, 211, 32, 74, 240, 182, 156, 142, 67, 74, 147, 78, 255, 177, 214, - 15, 20, 143, 182, 152, 207, 167, 19, 133, 198, 166, 143, 44, 92, 161, 155, - 126, 94, 204, 77, 215, 30, 243, 8, 45, 166, 106, 237, 59, 236, 129, 127, - 34, 178, 11, 52, 183, 3, 186, 149, 129, 236, 102, 235, 86, 134, 44, 211, - 230, 179, 117, 158, 128, 68, 80, 93, 49, 250, 171, 100, 44, 34, 171, 240, - 152, 241, 235, 54, 255, 83, 82, 26, 161, 196, 11, 148, 74, 97, 105, 181, - 255, 122, 234, 18, 185, 61, 58, 187, 119, 74, 159, 9, 20, 135, 84, 19, - 99, 64, 139, 221, 44, 102, 85, 26, 218, 208, 191, 231, 184, 6, 20, 58, - 139, 120, 163, 111, 141, 116, 14, 102, 53, 17, 79, 159, 137, 4, 17, 69, - 170, 131, 72, 67, 162, 203, 24, 154, 188, 108, 92, 98, 166, 112, 129, 121, - 118, 77, 180, 24, 223, 18, 253, 211, 216, 191, 255, 77, 84, 146, 254, 28, - 194, 76, 187, 113, 236, 91, 199, 190, 1, 193, 208, 237, 46, 203, 207, 145, - 62, 157, 194, 251, 216, 222, 234, 236, 62, 27, 60, 231, 167, 190, 221, 90, - 157, 1, 61, 124, 238, 220, 103, 39, 80, 4, 213, 234, 84, 13, 228, 78, - 127, 117, 118, 167, 54, 120, 126, 159, 253, 70, 234, 73, 23, 9, 120, 13, - 179, 18, 253, 213, 189, 7, 79, 250, 171, 115, 15, 40, 29, 52, 133, 247, - 33, 179, 24, 60, 175, 85, 92, 104, 11, 4, 178, 163, 26, 221, 3, 87, - 79, 79, 160, 100, 112, 98, 159, 64, 187, 131, 147, 51, 232, 23, 240, 132, - 249, 34, 233, 190, 89, 90, 55, 206, 155, 21, 252, 185, 229, 127, 110, 92, - 126, 198, 255, 180, 233, 119, 135, 126, 31, 210, 239, 35, 250, 125, 76, 191, - 93, 126, 139, 75, 117, 105, 217, 240, 243, 22, 254, 113, 244, 95, 192, 24, - 222, 128, 254, 121, 99, 207, 110, 187, 109, 135, 43, 184, 234, 216, 240, 111, - 44, 187, 37, 42, 202, 17, 40, 113, 104, 9, 117, 74, 192, 189, 208, 101, - 27, 250, 11, 127, 221, 20, 215, 250, 198, 137, 161, 205, 24, 26, 133, 191, - 46, 40, 90, 101, 28, 151, 211, 178, 5, 13, 90, 179, 219, 50, 140, 229, - 181, 50, 88, 215, 202, 88, 97, 58, 193, 251, 194, 230, 43, 199, 139, 241, - 1, 131, 19, 247, 12, 99, 15, 49, 190, 128, 212, 32, 236, 64, 140, 61, - 136, 177, 11, 120, 4, 191, 8, 77, 104, 189, 23, 193, 46, 55, 27, 28, - 10, 200, 153, 239, 8, 253, 124, 202, 39, 56, 125, 42, 172, 12, 247, 151, - 153, 13, 127, 111, 225, 111, 245, 205, 228, 196, 149, 229, 174, 40, 135, 191, - 213, 50, 18, 95, 224, 37, 184, 188, 22, 204, 226, 67, 43, 200, 196, 79, - 33, 232, 5, 57, 131, 239, 4, 202, 114, 86, 95, 189, 72, 115, 150, 161, - 228, 209, 155, 82, 218, 189, 112, 214, 239, 197, 61, 6, 114, 130, 4, 140, - 236, 84, 27, 154, 200, 18, 39, 237, 178, 91, 188, 102, 251, 134, 112, 176, - 218, 174, 194, 248, 158, 142, 20, 152, 23, 142, 1, 213, 222, 36, 0, 251, - 182, 158, 240, 126, 253, 147, 115, 206, 229, 190, 99, 31, 153, 100, 103, 3, - 108, 69, 145, 127, 188, 34, 84, 131, 32, 14, 39, 253, 91, 182, 171, 14, - 241, 201, 182, 14, 125, 199, 188, 117, 168, 79, 17, 32, 149, 3, 52, 136, - 248, 184, 53, 82, 220, 56, 212, 4, 77, 1, 109, 32, 235, 28, 194, 226, - 149, 134, 17, 164, 179, 215, 32, 37, 215, 17, 104, 9, 225, 41, 208, 148, - 193, 110, 181, 235, 67, 219, 242, 180, 235, 165, 27, 55, 119, 127, 139, 174, - 131, 132, 222, 225, 247, 187, 185, 251, 219, 218, 245, 210, 2, 218, 71, 136, - 40, 202, 105, 199, 174, 180, 179, 133, 171, 93, 83, 207, 74, 47, 212, 102, - 113, 181, 47, 56, 76, 197, 0, 149, 130, 186, 53, 160, 198, 159, 154, 42, - 185, 188, 146, 43, 43, 61, 50, 85, 242, 120, 37, 79, 86, 74, 102, 220, - 211, 231, 6, 134, 17, 40, 0, 252, 90, 224, 175, 43, 252, 117, 131, 238, - 63, 183, 248, 107, 129, 191, 174, 92, 28, 105, 235, 133, 109, 61, 181, 173, - 71, 182, 203, 205, 50, 60, 185, 103, 9, 115, 87, 51, 255, 142, 166, 32, - 112, 119, 233, 62, 252, 6, 34, 95, 199, 220, 159, 43, 80, 35, 132, 157, - 40, 249, 87, 60, 7, 209, 30, 205, 31, 71, 184, 251, 164, 22, 179, 137, - 52, 11, 113, 158, 139, 118, 36, 161, 2, 52, 5, 26, 4, 6, 206, 114, - 121, 187, 148, 144, 20, 200, 104, 194, 83, 122, 24, 12, 145, 178, 157, 210, - 1, 79, 168, 247, 150, 212, 20, 145, 94, 175, 100, 78, 72, 203, 87, 192, - 115, 66, 163, 224, 244, 139, 35, 83, 216, 217, 161, 230, 194, 66, 216, 66, - 58, 132, 143, 178, 230, 31, 133, 243, 96, 61, 185, 122, 73, 249, 184, 21, - 124, 31, 13, 28, 8, 247, 146, 184, 169, 35, 47, 138, 229, 86, 112, 254, - 242, 123, 236, 1, 127, 62, 93, 218, 131, 117, 238, 27, 214, 249, 76, 142, - 180, 116, 13, 64, 207, 0, 228, 187, 232, 32, 192, 129, 59, 228, 46, 47, - 185, 25, 11, 55, 44, 225, 14, 213, 34, 129, 76, 204, 13, 40, 19, 173, - 73, 184, 249, 116, 251, 82, 219, 173, 20, 153, 198, 196, 32, 252, 239, 2, - 200, 50, 140, 217, 236, 150, 135, 47, 210, 55, 255, 23, 22, 158, 247, 101, - 161, 109, 40, 211, 62, 72, 120, 131, 34, 20, 7, 23, 120, 243, 198, 107, - 187, 236, 233, 221, 103, 63, 156, 40, 42, 129, 130, 117, 225, 29, 130, 240, - 97, 138, 14, 222, 26, 68, 156, 193, 88, 72, 80, 33, 101, 247, 235, 249, - 52, 137, 132, 93, 46, 131, 24, 252, 191, 89, 3, 67, 134, 203, 116, 68, - 33, 192, 148, 192, 16, 35, 130, 229, 5, 113, 198, 47, 42, 207, 146, 70, - 38, 158, 101, 93, 207, 140, 251, 115, 140, 59, 242, 129, 254, 56, 215, 46, - 55, 142, 29, 54, 8, 47, 155, 208, 108, 122, 80, 207, 202, 234, 152, 188, - 147, 142, 191, 38, 135, 170, 220, 135, 69, 229, 130, 2, 61, 24, 133, 11, - 129, 248, 93, 230, 198, 21, 116, 215, 64, 174, 128, 155, 0, 44, 88, 204, - 167, 253, 120, 58, 227, 53, 99, 242, 125, 39, 135, 204, 58, 98, 26, 173, - 132, 163, 165, 56, 225, 9, 58, 157, 52, 99, 85, 68, 41, 95, 160, 125, - 55, 223, 190, 155, 53, 236, 242, 134, 49, 23, 12, 8, 246, 74, 195, 174, - 218, 176, 171, 54, 204, 184, 85, 158, 238, 113, 121, 149, 18, 136, 181, 88, - 68, 84, 114, 121, 236, 212, 136, 135, 160, 41, 93, 9, 151, 241, 68, 192, - 207, 17, 134, 11, 176, 127, 138, 252, 162, 199, 248, 143, 39, 248, 236, 240, - 252, 158, 148, 108, 102, 36, 171, 186, 105, 213, 229, 117, 195, 109, 112, 119, - 84, 235, 120, 181, 229, 54, 79, 125, 2, 90, 176, 27, 220, 39, 21, 239, - 52, 220, 6, 107, 222, 252, 148, 109, 183, 2, 57, 64, 60, 58, 79, 198, - 205, 208, 16, 136, 105, 247, 34, 136, 38, 189, 233, 181, 244, 224, 161, 19, - 91, 57, 78, 103, 39, 197, 219, 43, 43, 75, 152, 141, 11, 164, 156, 71, - 215, 239, 80, 145, 26, 124, 57, 154, 206, 20, 184, 192, 67, 190, 188, 10, - 205, 109, 173, 6, 34, 229, 36, 47, 81, 54, 93, 123, 131, 147, 15, 239, - 208, 241, 241, 215, 180, 254, 98, 249, 49, 214, 203, 117, 140, 11, 39, 77, - 138, 190, 162, 34, 76, 97, 238, 175, 132, 212, 135, 158, 201, 88, 198, 253, - 167, 221, 18, 188, 235, 84, 152, 76, 101, 80, 134, 203, 68, 33, 206, 162, - 149, 122, 65, 17, 84, 28, 20, 81, 68, 162, 89, 17, 247, 36, 4, 78, - 222, 197, 243, 209, 98, 206, 234, 169, 227, 113, 147, 87, 231, 155, 102, 14, - 237, 183, 131, 216, 87, 93, 41, 206, 56, 89, 88, 98, 73, 88, 4, 100, - 90, 95, 152, 171, 223, 194, 77, 60, 206, 71, 228, 111, 236, 28, 80, 137, - 240, 224, 49, 239, 53, 241, 239, 38, 98, 152, 167, 61, 97, 226, 76, 240, - 188, 7, 167, 182, 118, 102, 50, 63, 166, 159, 148, 238, 206, 28, 105, 216, - 61, 67, 48, 135, 65, 229, 241, 140, 24, 134, 156, 75, 184, 57, 125, 108, - 145, 98, 39, 113, 215, 27, 82, 153, 212, 26, 127, 15, 71, 211, 162, 23, - 218, 78, 58, 145, 233, 149, 56, 164, 224, 150, 119, 122, 145, 65, 247, 96, - 2, 98, 95, 3, 234, 205, 122, 226, 229, 47, 253, 166, 116, 50, 119, 73, - 135, 8, 205, 93, 236, 103, 207, 115, 114, 215, 148, 136, 107, 193, 68, 143, - 236, 242, 211, 56, 184, 77, 80, 52, 68, 132, 29, 152, 153, 131, 128, 18, - 192, 136, 80, 118, 1, 246, 243, 61, 217, 125, 79, 64, 244, 67, 243, 111, - 40, 64, 131, 47, 101, 110, 153, 207, 191, 190, 189, 181, 219, 37, 233, 108, - 132, 21, 158, 121, 203, 35, 214, 96, 209, 161, 175, 155, 149, 249, 138, 255, - 67, 220, 37, 180, 168, 54, 65, 54, 117, 106, 8, 0, 60, 175, 214, 209, - 65, 174, 205, 129, 253, 160, 236, 8, 203, 86, 165, 160, 187, 172, 248, 29, - 135, 195, 253, 241, 122, 62, 198, 8, 214, 172, 7, 213, 20, 94, 48, 184, - 233, 34, 218, 221, 3, 44, 0, 117, 208, 154, 175, 74, 125, 40, 194, 93, - 243, 99, 142, 35, 24, 220, 84, 235, 86, 44, 142, 171, 213, 26, 230, 50, - 47, 245, 111, 101, 29, 106, 93, 212, 225, 199, 80, 7, 19, 157, 3, 199, - 194, 108, 208, 184, 187, 219, 191, 177, 173, 254, 45, 15, 238, 160, 208, 137, - 134, 43, 85, 165, 121, 29, 211, 161, 223, 17, 251, 217, 217, 226, 254, 11, - 223, 212, 70, 211, 12, 153, 16, 41, 229, 56, 70, 179, 166, 206, 254, 47, - 23, 240, 73, 16, 79, 104, 49, 18, 250, 73, 162, 148, 216, 249, 130, 175, - 105, 235, 118, 125, 203, 207, 20, 163, 189, 186, 137, 250, 147, 171, 45, 57, - 79, 191, 152, 165, 183, 110, 23, 47, 102, 185, 173, 143, 10, 23, 255, 48, - 59, 164, 254, 198, 29, 82, 17, 46, 184, 67, 218, 240, 207, 190, 67, 154, - 104, 179, 244, 35, 108, 146, 170, 13, 138, 125, 210, 101, 171, 129, 226, 173, - 186, 55, 234, 104, 123, 163, 199, 218, 214, 232, 209, 78, 59, 163, 31, 188, - 251, 233, 238, 190, 251, 233, 229, 119, 63, 253, 252, 238, 103, 43, 191, 251, - 217, 222, 188, 251, 249, 106, 17, 247, 22, 32, 45, 128, 186, 79, 36, 97, - 158, 158, 219, 250, 105, 145, 111, 171, 104, 47, 186, 87, 236, 207, 253, 121, - 112, 21, 74, 222, 78, 193, 72, 202, 26, 122, 28, 140, 103, 104, 152, 131, - 207, 34, 106, 166, 141, 181, 114, 62, 25, 143, 163, 139, 139, 48, 166, 222, - 61, 139, 110, 212, 112, 86, 2, 206, 211, 234, 62, 155, 14, 212, 92, 5, - 217, 139, 97, 90, 130, 236, 45, 17, 135, 78, 110, 139, 254, 132, 206, 52, - 242, 124, 129, 104, 143, 39, 163, 233, 98, 144, 112, 238, 25, 15, 22, 9, - 50, 199, 231, 97, 128, 198, 229, 217, 239, 226, 140, 207, 227, 176, 23, 78, - 160, 29, 248, 19, 95, 126, 184, 196, 59, 87, 190, 87, 62, 218, 89, 185, - 102, 45, 223, 58, 210, 130, 112, 14, 255, 33, 102, 83, 248, 175, 5, 94, - 75, 112, 231, 17, 155, 10, 16, 30, 121, 30, 230, 129, 55, 208, 142, 226, - 74, 59, 10, 230, 145, 232, 90, 170, 221, 84, 88, 86, 174, 49, 243, 12, - 92, 225, 166, 21, 126, 134, 232, 107, 105, 20, 218, 144, 18, 207, 116, 225, - 136, 106, 136, 83, 12, 208, 72, 13, 48, 73, 147, 221, 216, 30, 191, 78, - 98, 107, 195, 114, 155, 232, 219, 196, 240, 128, 216, 184, 148, 129, 197, 214, - 28, 95, 122, 8, 96, 143, 231, 195, 212, 243, 32, 3, 200, 226, 120, 196, - 45, 74, 6, 191, 24, 79, 18, 242, 97, 135, 69, 152, 158, 19, 148, 43, - 41, 6, 240, 192, 12, 2, 130, 17, 210, 22, 190, 134, 109, 241, 190, 102, - 88, 175, 3, 14, 105, 192, 213, 8, 190, 160, 219, 217, 2, 205, 246, 69, - 230, 211, 38, 163, 137, 3, 179, 198, 39, 150, 237, 163, 105, 78, 0, 35, - 192, 181, 239, 38, 32, 141, 129, 22, 225, 181, 184, 14, 122, 180, 82, 170, - 148, 56, 4, 186, 178, 54, 181, 116, 207, 167, 15, 249, 231, 26, 136, 224, - 17, 249, 245, 242, 25, 160, 13, 229, 198, 76, 208, 40, 231, 82, 64, 49, - 223, 227, 39, 27, 162, 142, 196, 52, 3, 141, 37, 72, 148, 154, 249, 240, - 100, 165, 78, 52, 82, 170, 20, 155, 121, 50, 29, 13, 104, 119, 249, 252, - 130, 142, 214, 121, 80, 191, 153, 152, 252, 244, 25, 109, 150, 171, 110, 13, - 31, 45, 141, 245, 71, 73, 86, 253, 169, 242, 40, 23, 135, 38, 141, 101, - 219, 48, 56, 239, 151, 58, 219, 255, 253, 169, 179, 255, 3, 243, 57, 21, - 191, 140, 136, 29, 252, 184, 223, 197, 109, 181, 182, 124, 24, 189, 70, 254, - 203, 248, 157, 98, 157, 63, 255, 199, 249, 242, 102, 41, 3, 13, 150, 220, - 181, 140, 236, 117, 197, 227, 189, 49, 52, 155, 99, 24, 116, 203, 86, 235, - 224, 114, 28, 245, 213, 91, 154, 51, 160, 6, 156, 59, 102, 245, 40, 169, - 69, 49, 43, 119, 187, 209, 65, 119, 123, 122, 172, 154, 111, 202, 46, 163, - 55, 243, 17, 242, 113, 212, 6, 201, 194, 90, 182, 223, 148, 178, 98, 207, - 105, 120, 162, 152, 239, 125, 44, 255, 223, 255, 179, 228, 243, 86, 107, 222, - 198, 0, 214, 69, 111, 165, 32, 176, 174, 235, 164, 65, 240, 80, 251, 107, - 93, 3, 33, 180, 134, 229, 124, 135, 149, 114, 165, 199, 32, 156, 35, 120, - 171, 194, 47, 211, 228, 225, 107, 249, 165, 150, 79, 188, 80, 250, 167, 227, - 149, 134, 164, 232, 154, 115, 219, 71, 203, 137, 254, 169, 88, 233, 71, 73, - 148, 183, 103, 165, 95, 43, 181, 254, 42, 88, 169, 137, 81, 154, 190, 205, - 158, 149, 126, 49, 86, 154, 101, 115, 223, 145, 145, 166, 41, 228, 55, 179, - 81, 37, 173, 59, 102, 166, 90, 199, 68, 143, 26, 199, 196, 68, 221, 134, - 135, 90, 177, 235, 8, 46, 42, 202, 61, 183, 225, 203, 242, 109, 108, 180, - 152, 95, 126, 11, 19, 205, 119, 241, 61, 88, 168, 214, 93, 149, 135, 42, - 253, 45, 48, 81, 45, 129, 253, 58, 62, 90, 204, 105, 111, 188, 242, 167, - 227, 167, 26, 86, 238, 18, 177, 114, 49, 239, 179, 220, 60, 129, 83, 158, - 177, 185, 152, 20, 19, 216, 19, 165, 76, 70, 70, 134, 185, 143, 233, 150, - 25, 252, 126, 129, 169, 137, 149, 39, 124, 148, 164, 190, 95, 53, 35, 221, - 146, 98, 184, 125, 184, 141, 145, 182, 220, 109, 156, 212, 43, 212, 248, 243, - 83, 235, 143, 192, 74, 119, 249, 50, 155, 89, 105, 203, 113, 183, 178, 82, - 175, 88, 229, 207, 255, 117, 190, 30, 94, 170, 17, 232, 93, 249, 169, 118, - 211, 102, 158, 170, 183, 95, 62, 47, 99, 232, 243, 26, 190, 218, 225, 217, - 32, 143, 201, 24, 106, 29, 9, 174, 42, 74, 221, 227, 134, 39, 138, 183, - 48, 85, 35, 207, 217, 198, 88, 243, 253, 148, 1, 20, 212, 223, 221, 153, - 172, 218, 119, 149, 247, 102, 157, 47, 112, 88, 242, 250, 35, 80, 207, 62, - 110, 56, 136, 173, 23, 40, 228, 97, 235, 84, 40, 184, 106, 161, 180, 16, - 121, 166, 179, 83, 66, 44, 212, 52, 60, 68, 94, 87, 220, 12, 43, 101, - 238, 96, 152, 85, 64, 212, 117, 173, 194, 139, 105, 255, 93, 242, 205, 230, - 188, 11, 174, 238, 174, 154, 115, 67, 68, 151, 22, 47, 7, 175, 133, 176, - 249, 151, 20, 205, 192, 182, 70, 106, 190, 110, 240, 212, 167, 153, 71, 133, - 110, 183, 253, 117, 203, 117, 145, 56, 117, 123, 191, 95, 114, 87, 68, 132, - 234, 200, 137, 37, 199, 185, 29, 229, 207, 231, 13, 225, 184, 7, 206, 177, - 105, 239, 39, 63, 21, 216, 189, 210, 47, 52, 167, 191, 167, 141, 149, 103, - 18, 75, 193, 85, 246, 67, 41, 97, 95, 169, 120, 107, 217, 194, 157, 48, - 203, 135, 169, 218, 146, 91, 151, 92, 190, 100, 114, 183, 243, 176, 102, 61, - 227, 59, 172, 45, 199, 113, 24, 207, 120, 206, 198, 254, 64, 117, 175, 200, - 34, 238, 59, 78, 205, 122, 112, 96, 185, 25, 238, 195, 131, 26, 112, 96, - 42, 169, 199, 60, 7, 160, 203, 183, 91, 57, 238, 129, 245, 204, 134, 127, - 46, 237, 149, 164, 232, 6, 202, 166, 169, 64, 53, 144, 62, 120, 103, 44, - 96, 191, 165, 78, 142, 232, 21, 46, 221, 123, 19, 40, 135, 46, 141, 130, - 126, 120, 78, 19, 139, 182, 117, 27, 174, 248, 39, 115, 8, 160, 63, 55, - 57, 72, 184, 236, 167, 46, 226, 124, 230, 246, 150, 181, 119, 169, 183, 248, - 235, 252, 36, 178, 54, 234, 129, 2, 18, 41, 224, 168, 225, 34, 190, 124, - 150, 229, 12, 35, 185, 234, 147, 240, 146, 135, 229, 203, 237, 37, 10, 113, - 77, 177, 177, 5, 38, 187, 138, 227, 128, 163, 2, 47, 207, 65, 152, 180, - 84, 180, 121, 47, 174, 52, 187, 230, 47, 15, 172, 239, 225, 219, 122, 131, - 27, 102, 253, 194, 105, 49, 156, 220, 50, 235, 251, 44, 1, 103, 251, 1, - 194, 126, 156, 46, 113, 66, 91, 238, 129, 87, 93, 157, 49, 237, 236, 6, - 43, 17, 64, 55, 33, 125, 58, 89, 1, 15, 112, 90, 75, 125, 120, 34, - 221, 226, 180, 2, 33, 83, 153, 88, 89, 186, 95, 26, 40, 164, 138, 30, - 33, 167, 187, 124, 83, 173, 68, 82, 168, 128, 170, 15, 102, 51, 120, 203, - 243, 57, 201, 243, 158, 237, 41, 228, 146, 138, 56, 145, 68, 7, 246, 72, - 217, 239, 82, 11, 76, 9, 155, 127, 192, 184, 198, 70, 65, 229, 240, 243, - 105, 217, 94, 9, 53, 66, 58, 147, 116, 180, 172, 174, 155, 174, 190, 110, - 188, 152, 166, 14, 205, 156, 128, 186, 101, 245, 230, 141, 151, 255, 81, 188, - 236, 40, 151, 159, 76, 133, 167, 191, 116, 194, 228, 176, 207, 158, 182, 209, - 245, 221, 132, 146, 123, 109, 73, 72, 248, 30, 97, 170, 18, 226, 57, 211, - 122, 134, 81, 130, 172, 30, 99, 68, 39, 97, 56, 72, 216, 252, 122, 202, - 70, 193, 173, 200, 85, 118, 61, 141, 223, 49, 88, 62, 72, 230, 110, 155, - 20, 111, 140, 233, 207, 128, 162, 253, 48, 65, 37, 140, 215, 36, 120, 232, - 233, 76, 38, 37, 131, 69, 51, 128, 110, 143, 57, 36, 2, 230, 50, 203, - 170, 102, 249, 204, 12, 65, 178, 159, 209, 49, 205, 55, 231, 192, 85, 103, - 29, 46, 5, 84, 206, 15, 75, 90, 169, 140, 36, 128, 181, 208, 194, 5, - 209, 198, 95, 157, 50, 186, 147, 172, 153, 182, 18, 71, 254, 27, 114, 144, - 134, 87, 61, 191, 14, 98, 13, 104, 164, 252, 44, 74, 232, 235, 42, 67, - 85, 86, 210, 238, 138, 126, 188, 227, 62, 219, 90, 119, 90, 107, 123, 243, - 238, 20, 72, 228, 89, 137, 28, 209, 149, 125, 109, 250, 227, 148, 200, 141, - 188, 80, 140, 4, 171, 20, 176, 27, 14, 68, 188, 97, 79, 156, 127, 178, - 71, 127, 9, 198, 179, 251, 191, 176, 231, 225, 164, 31, 141, 214, 218, 20, - 102, 116, 185, 119, 109, 155, 10, 77, 139, 123, 71, 75, 194, 86, 51, 194, - 71, 181, 33, 100, 56, 239, 235, 213, 46, 49, 16, 194, 152, 32, 100, 152, - 166, 175, 203, 38, 15, 17, 194, 125, 190, 24, 40, 142, 220, 69, 112, 174, - 181, 74, 223, 123, 62, 221, 217, 254, 244, 78, 225, 225, 95, 143, 78, 35, - 103, 201, 174, 234, 140, 172, 191, 94, 147, 145, 10, 75, 58, 41, 203, 124, - 7, 75, 217, 62, 219, 170, 150, 228, 231, 110, 190, 119, 6, 37, 99, 211, - 227, 114, 171, 233, 229, 124, 243, 114, 74, 230, 166, 245, 148, 150, 254, 14, - 211, 220, 215, 183, 160, 190, 27, 92, 134, 134, 220, 111, 46, 237, 168, 108, - 241, 9, 201, 215, 249, 144, 37, 245, 59, 158, 239, 229, 235, 124, 61, 171, - 42, 157, 43, 187, 46, 171, 244, 134, 237, 235, 42, 155, 157, 31, 176, 176, - 10, 147, 120, 135, 149, 181, 241, 129, 98, 240, 79, 96, 166, 77, 55, 236, - 30, 247, 249, 117, 219, 80, 246, 135, 225, 79, 194, 198, 189, 97, 50, 115, - 101, 254, 127, 23, 1, 8, 148, 191, 169, 97, 24, 152, 57, 80, 179, 45, - 124, 160, 57, 216, 180, 157, 220, 214, 93, 190, 65, 131, 143, 129, 22, 170, - 62, 159, 158, 227, 228, 195, 152, 214, 47, 59, 87, 91, 82, 162, 94, 1, - 71, 170, 153, 131, 46, 230, 111, 142, 176, 175, 122, 10, 194, 188, 97, 244, - 131, 76, 173, 197, 183, 246, 255, 72, 239, 252, 245, 144, 37, 177, 226, 118, - 37, 74, 162, 250, 118, 146, 36, 87, 55, 89, 32, 17, 155, 5, 197, 100, - 162, 17, 174, 219, 112, 219, 252, 124, 11, 101, 202, 81, 131, 29, 232, 210, - 46, 79, 21, 31, 1, 63, 105, 178, 222, 181, 5, 175, 218, 133, 146, 63, - 17, 97, 250, 9, 13, 43, 209, 85, 184, 30, 119, 255, 195, 164, 135, 29, - 224, 209, 119, 101, 240, 31, 34, 60, 124, 248, 227, 253, 175, 87, 118, 160, - 185, 183, 243, 110, 61, 86, 222, 190, 64, 113, 55, 156, 38, 121, 186, 71, - 208, 214, 246, 225, 183, 47, 79, 109, 69, 236, 176, 56, 183, 63, 81, 91, - 154, 64, 148, 158, 68, 177, 136, 165, 184, 128, 35, 101, 81, 102, 167, 166, - 21, 201, 239, 95, 187, 123, 244, 112, 14, 210, 203, 34, 152, 111, 6, 104, - 89, 203, 88, 53, 48, 153, 252, 36, 42, 162, 77, 175, 143, 52, 202, 112, - 213, 116, 18, 66, 216, 232, 199, 106, 116, 112, 186, 238, 168, 34, 75, 33, - 212, 115, 65, 196, 252, 234, 75, 252, 12, 162, 41, 174, 101, 110, 156, 210, - 50, 119, 150, 158, 184, 182, 252, 100, 49, 194, 152, 198, 39, 211, 248, 58, - 136, 7, 236, 251, 105, 28, 253, 54, 157, 204, 3, 181, 240, 239, 148, 226, - 158, 138, 112, 67, 162, 88, 49, 45, 85, 106, 62, 94, 128, 46, 220, 199, - 25, 248, 106, 58, 211, 206, 5, 18, 66, 86, 192, 49, 17, 180, 34, 9, - 158, 144, 149, 104, 15, 204, 138, 149, 39, 158, 12, 195, 254, 187, 48, 166, - 221, 248, 244, 152, 253, 48, 161, 132, 99, 101, 101, 8, 40, 57, 31, 51, - 64, 197, 57, 217, 143, 67, 88, 38, 159, 159, 72, 184, 8, 200, 230, 152, - 0, 217, 178, 181, 128, 214, 179, 236, 4, 65, 183, 14, 87, 44, 190, 42, - 25, 23, 12, 84, 70, 179, 24, 79, 72, 152, 26, 197, 212, 251, 165, 209, - 205, 194, 109, 48, 171, 99, 163, 63, 206, 146, 32, 109, 37, 185, 253, 49, - 184, 10, 224, 215, 120, 198, 23, 233, 8, 78, 71, 112, 38, 180, 228, 236, - 212, 180, 72, 179, 217, 255, 183, 240, 54, 103, 84, 198, 64, 142, 182, 177, - 174, 201, 4, 237, 23, 88, 46, 95, 187, 236, 199, 233, 116, 198, 5, 192, - 2, 207, 93, 191, 42, 53, 39, 206, 84, 171, 204, 133, 84, 107, 91, 253, - 222, 38, 189, 244, 92, 146, 14, 39, 39, 42, 102, 240, 49, 115, 125, 59, - 239, 75, 65, 254, 173, 159, 97, 217, 135, 148, 144, 127, 214, 55, 43, 134, - 59, 142, 247, 97, 84, 222, 118, 90, 247, 221, 206, 91, 215, 59, 186, 239, - 84, 49, 246, 7, 189, 94, 185, 231, 171, 207, 83, 102, 229, 240, 215, 153, - 30, 107, 165, 237, 37, 215, 99, 134, 240, 1, 2, 66, 192, 118, 216, 105, - 195, 165, 141, 20, 74, 209, 27, 76, 6, 167, 111, 41, 251, 171, 43, 85, - 80, 58, 183, 218, 98, 59, 202, 199, 252, 25, 248, 200, 241, 52, 158, 13, - 249, 53, 143, 230, 110, 169, 80, 63, 230, 135, 184, 155, 44, 96, 5, 123, - 84, 226, 58, 152, 69, 243, 45, 183, 224, 178, 26, 29, 17, 194, 155, 184, - 170, 238, 93, 253, 147, 202, 208, 218, 203, 225, 174, 120, 31, 10, 57, 221, - 248, 152, 225, 98, 204, 109, 147, 105, 233, 64, 83, 196, 238, 211, 183, 184, - 101, 69, 24, 5, 122, 82, 50, 227, 162, 226, 219, 71, 202, 55, 34, 96, - 56, 14, 144, 66, 8, 182, 135, 12, 161, 186, 229, 146, 77, 81, 115, 215, - 137, 190, 58, 252, 116, 161, 244, 171, 246, 66, 219, 53, 187, 196, 110, 186, - 245, 110, 161, 218, 159, 24, 75, 251, 51, 35, 102, 127, 106, 92, 236, 207, - 16, 219, 253, 233, 48, 174, 215, 206, 166, 237, 22, 139, 253, 92, 218, 207, - 165, 47, 139, 6, 80, 160, 228, 187, 42, 148, 233, 13, 59, 41, 149, 25, - 251, 32, 211, 176, 231, 73, 219, 176, 231, 55, 90, 206, 118, 115, 116, 129, - 209, 236, 166, 89, 110, 125, 172, 35, 62, 197, 139, 233, 32, 26, 69, 27, - 248, 95, 44, 42, 216, 166, 194, 175, 154, 251, 241, 169, 168, 7, 239, 187, - 160, 20, 5, 49, 168, 60, 132, 90, 3, 202, 19, 28, 253, 94, 19, 143, - 105, 51, 53, 39, 3, 23, 215, 141, 91, 4, 94, 68, 19, 173, 110, 195, - 149, 56, 176, 102, 144, 187, 12, 225, 200, 211, 180, 90, 19, 149, 56, 250, - 157, 118, 164, 175, 252, 29, 221, 163, 194, 91, 126, 61, 230, 42, 185, 88, - 118, 37, 48, 178, 254, 118, 250, 146, 174, 205, 223, 99, 86, 206, 175, 229, - 29, 8, 204, 78, 207, 21, 95, 226, 229, 244, 98, 206, 65, 136, 215, 81, - 152, 203, 209, 84, 223, 71, 198, 130, 175, 154, 178, 124, 44, 58, 129, 147, - 246, 232, 99, 47, 76, 95, 111, 244, 235, 89, 7, 248, 89, 119, 93, 3, - 88, 119, 251, 252, 167, 153, 83, 150, 115, 175, 179, 117, 170, 171, 19, 107, - 135, 105, 158, 111, 94, 206, 232, 89, 64, 25, 7, 95, 165, 78, 80, 124, - 62, 39, 188, 92, 113, 192, 178, 205, 197, 166, 185, 157, 217, 116, 30, 14, - 6, 225, 160, 56, 215, 243, 153, 35, 134, 1, 77, 13, 53, 193, 94, 129, - 220, 42, 61, 132, 250, 170, 65, 243, 80, 66, 172, 194, 199, 188, 37, 110, - 248, 106, 58, 75, 143, 79, 22, 9, 94, 122, 194, 161, 141, 8, 216, 77, - 177, 42, 42, 182, 68, 16, 23, 49, 72, 1, 67, 141, 40, 171, 110, 153, - 130, 150, 224, 227, 43, 76, 85, 111, 140, 73, 68, 90, 4, 49, 187, 169, - 221, 30, 84, 220, 78, 221, 247, 106, 15, 171, 85, 117, 86, 55, 254, 142, - 216, 201, 235, 36, 221, 245, 154, 136, 217, 124, 11, 92, 95, 25, 138, 103, - 1, 26, 90, 95, 69, 99, 52, 123, 162, 163, 62, 70, 84, 9, 8, 27, - 118, 211, 210, 206, 58, 218, 217, 81, 217, 240, 164, 104, 156, 15, 115, 113, - 139, 181, 100, 242, 149, 47, 192, 160, 218, 7, 176, 54, 205, 128, 88, 133, - 153, 201, 238, 165, 233, 107, 99, 102, 45, 27, 227, 224, 6, 147, 62, 168, - 206, 121, 18, 46, 54, 193, 9, 213, 109, 184, 76, 0, 96, 117, 185, 135, - 161, 143, 104, 173, 18, 88, 213, 239, 242, 116, 176, 88, 211, 81, 10, 189, - 85, 122, 23, 58, 13, 42, 87, 124, 229, 10, 66, 216, 221, 212, 16, 10, - 107, 22, 29, 96, 246, 130, 58, 116, 130, 38, 138, 114, 67, 43, 119, 195, - 173, 188, 97, 184, 230, 134, 182, 114, 67, 48, 15, 38, 94, 229, 182, 49, - 60, 240, 236, 155, 198, 245, 129, 87, 189, 83, 169, 184, 141, 135, 213, 154, - 7, 77, 212, 157, 166, 227, 184, 218, 205, 29, 229, 230, 23, 93, 124, 18, - 2, 130, 87, 174, 107, 215, 245, 97, 109, 88, 189, 79, 103, 188, 193, 234, - 91, 175, 94, 225, 141, 190, 197, 118, 169, 177, 250, 139, 26, 181, 175, 53, - 122, 184, 82, 114, 5, 115, 176, 232, 38, 57, 46, 47, 143, 14, 16, 216, - 175, 93, 93, 49, 152, 130, 193, 8, 116, 89, 68, 240, 242, 90, 37, 225, - 134, 205, 83, 141, 136, 30, 85, 87, 18, 186, 140, 236, 119, 229, 135, 93, - 171, 125, 191, 44, 175, 74, 108, 164, 134, 200, 219, 216, 33, 84, 221, 119, - 167, 22, 125, 157, 51, 152, 115, 241, 56, 69, 166, 22, 125, 131, 58, 110, - 153, 253, 229, 47, 64, 35, 15, 169, 122, 60, 78, 235, 83, 82, 93, 83, - 53, 55, 87, 13, 109, 109, 74, 197, 149, 226, 202, 122, 250, 86, 86, 147, - 245, 5, 1, 183, 14, 107, 60, 183, 94, 190, 169, 70, 195, 189, 231, 113, - 0, 222, 205, 237, 192, 195, 106, 30, 136, 33, 158, 218, 130, 68, 120, 147, - 78, 236, 223, 60, 128, 206, 202, 249, 206, 253, 197, 189, 59, 182, 119, 71, - 186, 244, 235, 126, 227, 54, 25, 49, 183, 62, 153, 222, 160, 68, 249, 85, - 162, 210, 4, 198, 20, 154, 173, 100, 119, 84, 237, 25, 16, 62, 218, 51, - 49, 124, 65, 182, 96, 229, 165, 229, 174, 150, 150, 7, 63, 254, 106, 249, - 166, 156, 126, 193, 242, 155, 50, 148, 181, 225, 167, 3, 63, 135, 171, 37, - 168, 113, 194, 10, 186, 158, 197, 8, 11, 117, 197, 242, 191, 77, 63, 210, - 55, 223, 250, 213, 50, 102, 109, 41, 67, 241, 131, 172, 212, 171, 114, 215, - 224, 89, 140, 89, 152, 211, 61, 144, 95, 184, 167, 240, 189, 178, 13, 68, - 83, 113, 214, 142, 97, 78, 70, 49, 12, 204, 120, 26, 235, 30, 214, 69, - 183, 109, 205, 147, 216, 72, 120, 112, 123, 198, 95, 113, 31, 98, 225, 218, - 239, 10, 82, 41, 81, 198, 162, 209, 112, 186, 8, 231, 115, 129, 51, 198, - 47, 2, 141, 123, 22, 37, 125, 164, 110, 162, 228, 100, 49, 139, 68, 220, - 83, 31, 15, 237, 244, 168, 16, 223, 84, 200, 177, 124, 88, 216, 175, 220, - 57, 189, 249, 86, 147, 199, 239, 242, 161, 255, 168, 169, 140, 92, 179, 231, - 121, 159, 15, 92, 137, 19, 253, 46, 174, 15, 231, 175, 167, 25, 23, 56, - 187, 119, 42, 246, 50, 206, 86, 165, 107, 27, 106, 188, 236, 158, 90, 252, - 226, 89, 205, 114, 239, 220, 63, 197, 208, 160, 151, 8, 139, 237, 86, 109, - 126, 140, 249, 187, 171, 80, 31, 179, 79, 210, 10, 17, 143, 129, 41, 121, - 248, 87, 239, 158, 91, 173, 81, 158, 33, 220, 118, 224, 169, 133, 172, 67, - 30, 121, 210, 230, 56, 106, 124, 89, 46, 61, 2, 72, 92, 221, 177, 179, - 35, 135, 245, 152, 229, 221, 97, 53, 196, 132, 227, 187, 69, 125, 9, 112, - 44, 34, 121, 180, 28, 28, 152, 132, 19, 3, 145, 252, 70, 27, 183, 1, - 101, 40, 12, 38, 227, 164, 157, 191, 112, 126, 78, 211, 247, 28, 87, 44, - 43, 127, 31, 34, 218, 90, 238, 18, 172, 93, 14, 214, 88, 73, 95, 188, - 113, 10, 67, 113, 6, 125, 167, 12, 150, 132, 180, 86, 202, 79, 56, 190, - 39, 193, 95, 220, 170, 137, 20, 17, 98, 171, 196, 166, 40, 28, 65, 40, - 249, 100, 120, 10, 143, 230, 19, 248, 18, 142, 108, 121, 240, 33, 211, 55, - 19, 43, 95, 133, 33, 185, 96, 145, 56, 137, 59, 34, 106, 76, 119, 6, - 6, 167, 37, 108, 46, 52, 39, 50, 99, 111, 146, 57, 127, 152, 76, 224, - 129, 2, 202, 81, 173, 217, 42, 90, 3, 254, 115, 214, 214, 37, 125, 210, - 79, 189, 180, 232, 41, 75, 204, 181, 82, 88, 90, 136, 204, 0, 19, 95, - 70, 169, 173, 91, 98, 157, 116, 137, 117, 228, 18, 235, 208, 18, 67, 24, - 211, 221, 215, 24, 165, 185, 221, 190, 198, 112, 162, 127, 248, 18, 83, 215, - 4, 95, 97, 244, 254, 59, 44, 48, 90, 219, 124, 133, 13, 241, 208, 78, - 143, 246, 44, 98, 227, 52, 30, 242, 129, 251, 212, 243, 152, 63, 230, 207, - 206, 34, 180, 9, 199, 39, 48, 127, 241, 29, 102, 240, 203, 40, 140, 103, - 209, 36, 121, 23, 129, 146, 31, 241, 76, 107, 220, 8, 145, 94, 176, 245, - 83, 29, 116, 187, 191, 160, 140, 92, 25, 144, 174, 62, 95, 49, 176, 251, - 117, 131, 114, 47, 166, 115, 186, 93, 160, 223, 88, 235, 215, 92, 173, 66, - 37, 12, 1, 207, 55, 101, 172, 148, 111, 201, 144, 5, 205, 143, 139, 109, - 173, 169, 182, 67, 107, 107, 23, 165, 98, 10, 204, 101, 170, 112, 183, 216, - 33, 62, 187, 109, 45, 251, 190, 6, 68, 107, 221, 157, 98, 132, 179, 71, - 73, 94, 145, 222, 217, 20, 190, 81, 165, 58, 204, 126, 204, 119, 69, 89, - 86, 128, 224, 139, 104, 98, 153, 150, 2, 248, 70, 33, 146, 152, 123, 117, - 96, 214, 170, 60, 252, 243, 57, 116, 253, 167, 0, 177, 143, 21, 217, 252, - 17, 232, 18, 201, 40, 188, 101, 79, 194, 88, 88, 205, 122, 162, 232, 252, - 2, 138, 236, 66, 137, 201, 86, 150, 243, 205, 123, 8, 239, 25, 78, 162, - 197, 152, 61, 28, 192, 82, 152, 47, 198, 141, 159, 162, 203, 120, 129, 174, - 114, 175, 134, 225, 232, 118, 6, 234, 74, 52, 8, 250, 97, 160, 230, 32, - 144, 89, 36, 52, 137, 199, 225, 187, 26, 5, 145, 71, 241, 138, 109, 224, - 102, 131, 182, 213, 32, 103, 201, 102, 105, 39, 135, 147, 14, 87, 15, 143, - 236, 28, 144, 193, 195, 193, 0, 77, 211, 1, 251, 9, 40, 2, 89, 227, - 222, 207, 91, 75, 155, 125, 186, 178, 134, 232, 18, 9, 133, 206, 166, 31, - 1, 199, 23, 245, 94, 68, 172, 182, 217, 32, 76, 250, 113, 212, 11, 7, - 12, 193, 133, 238, 41, 35, 181, 136, 71, 208, 232, 40, 154, 188, 171, 148, - 135, 243, 249, 44, 185, 119, 112, 16, 78, 154, 215, 209, 187, 104, 22, 194, - 144, 55, 167, 241, 229, 1, 158, 29, 60, 82, 63, 221, 23, 200, 247, 208, - 193, 237, 94, 215, 49, 44, 20, 109, 82, 229, 215, 202, 183, 146, 241, 208, - 197, 37, 207, 168, 71, 66, 19, 198, 209, 251, 54, 165, 69, 128, 249, 47, - 179, 180, 105, 60, 195, 62, 229, 250, 234, 89, 73, 225, 24, 89, 134, 21, - 238, 236, 4, 226, 144, 18, 115, 15, 13, 30, 81, 78, 32, 158, 74, 104, - 50, 110, 178, 50, 217, 9, 180, 245, 81, 181, 197, 210, 173, 148, 5, 250, - 130, 117, 84, 131, 167, 226, 157, 213, 85, 181, 12, 74, 124, 250, 196, 146, - 230, 96, 181, 110, 17, 113, 38, 163, 15, 5, 174, 253, 163, 85, 186, 31, - 252, 114, 50, 189, 190, 24, 5, 239, 36, 59, 145, 167, 182, 118, 182, 145, - 153, 80, 30, 227, 157, 105, 232, 14, 84, 248, 43, 32, 179, 217, 168, 152, - 242, 6, 112, 100, 8, 3, 185, 229, 179, 42, 187, 91, 157, 90, 46, 43, - 76, 35, 148, 59, 206, 36, 136, 195, 178, 114, 122, 253, 95, 142, 61, 252, - 47, 7, 5, 136, 255, 114, 225, 200, 61, 171, 30, 120, 60, 79, 144, 229, - 1, 45, 230, 158, 108, 235, 73, 48, 55, 156, 252, 61, 136, 163, 233, 66, - 53, 154, 8, 147, 252, 9, 110, 141, 159, 254, 136, 56, 0, 103, 210, 96, - 130, 23, 224, 125, 6, 161, 157, 59, 55, 57, 173, 158, 240, 189, 117, 194, - 22, 112, 237, 114, 110, 100, 222, 76, 222, 76, 152, 176, 175, 225, 81, 125, - 16, 162, 41, 139, 121, 14, 158, 209, 114, 16, 190, 181, 62, 86, 109, 164, - 221, 199, 179, 55, 27, 201, 199, 166, 169, 113, 194, 17, 51, 42, 73, 53, - 229, 17, 203, 242, 79, 232, 50, 88, 121, 56, 26, 77, 175, 19, 70, 190, - 58, 13, 110, 171, 170, 226, 46, 6, 249, 118, 191, 120, 250, 232, 33, 59, - 133, 227, 51, 126, 162, 31, 191, 8, 7, 233, 241, 211, 56, 12, 39, 233, - 217, 163, 209, 34, 60, 83, 238, 135, 245, 125, 38, 114, 226, 128, 54, 162, - 54, 164, 22, 137, 246, 212, 162, 180, 89, 181, 80, 182, 254, 235, 73, 239, - 36, 134, 143, 37, 211, 60, 41, 101, 88, 165, 241, 2, 83, 12, 12, 227, - 169, 184, 156, 228, 174, 171, 215, 148, 75, 185, 187, 148, 43, 212, 153, 252, - 181, 31, 131, 30, 116, 65, 130, 87, 165, 37, 65, 175, 145, 127, 52, 47, - 111, 152, 238, 239, 21, 74, 251, 67, 118, 218, 31, 22, 219, 160, 114, 99, - 237, 97, 190, 244, 251, 151, 127, 103, 167, 223, 47, 178, 227, 151, 40, 122, - 144, 73, 35, 45, 162, 45, 37, 126, 246, 3, 59, 69, 215, 105, 18, 0, - 120, 201, 143, 185, 23, 59, 121, 246, 235, 223, 216, 233, 201, 109, 48, 201, - 206, 158, 5, 151, 232, 151, 144, 21, 252, 26, 226, 132, 202, 206, 255, 22, - 82, 107, 191, 254, 240, 191, 244, 165, 130, 244, 132, 122, 27, 36, 103, 202, - 22, 23, 223, 224, 122, 216, 215, 211, 21, 210, 68, 165, 29, 56, 116, 235, - 255, 9, 243, 48, 161, 217, 95, 21, 91, 68, 98, 244, 199, 97, 111, 113, - 201, 126, 152, 92, 76, 49, 52, 36, 219, 103, 202, 239, 102, 243, 122, 79, - 166, 147, 185, 116, 211, 206, 128, 228, 95, 69, 147, 91, 220, 224, 66, 74, - 151, 62, 142, 190, 83, 124, 185, 37, 93, 147, 113, 163, 109, 73, 113, 18, - 185, 117, 246, 99, 186, 206, 254, 252, 209, 19, 171, 108, 96, 94, 126, 244, - 232, 137, 2, 142, 10, 91, 11, 164, 210, 15, 38, 44, 188, 1, 198, 12, - 55, 7, 147, 91, 134, 190, 50, 211, 11, 224, 206, 201, 60, 94, 244, 185, - 99, 205, 130, 36, 194, 249, 116, 58, 96, 189, 91, 142, 169, 210, 123, 64, - 0, 94, 216, 44, 27, 129, 82, 185, 64, 180, 206, 8, 99, 12, 128, 248, - 195, 239, 12, 58, 229, 123, 120, 109, 155, 221, 78, 23, 244, 40, 184, 25, - 126, 33, 67, 77, 166, 160, 24, 247, 167, 99, 76, 95, 158, 176, 30, 18, - 124, 56, 143, 129, 45, 160, 73, 3, 234, 199, 108, 122, 61, 225, 137, 72, - 25, 231, 46, 89, 117, 204, 154, 58, 27, 45, 46, 27, 209, 132, 141, 195, - 201, 2, 24, 218, 60, 142, 194, 164, 137, 236, 32, 219, 82, 29, 133, 1, - 8, 77, 163, 233, 244, 29, 11, 56, 24, 204, 96, 218, 95, 140, 211, 220, - 159, 113, 40, 51, 187, 92, 135, 61, 54, 195, 119, 184, 103, 128, 122, 49, - 73, 181, 232, 123, 208, 12, 23, 7, 105, 19, 205, 100, 56, 31, 143, 214, - 185, 136, 137, 239, 145, 94, 156, 79, 25, 116, 14, 132, 42, 218, 18, 9, - 122, 83, 244, 52, 185, 10, 162, 17, 129, 232, 104, 195, 43, 95, 250, 171, - 64, 163, 233, 28, 56, 190, 65, 108, 54, 8, 11, 60, 144, 242, 61, 164, - 5, 247, 43, 144, 22, 246, 50, 193, 94, 38, 216, 203, 4, 123, 153, 96, - 47, 19, 236, 101, 130, 189, 76, 240, 251, 100, 2, 157, 205, 43, 78, 148, - 110, 183, 65, 135, 246, 170, 92, 26, 179, 242, 121, 78, 30, 72, 230, 124, - 203, 205, 114, 185, 211, 103, 171, 116, 62, 233, 157, 71, 147, 174, 245, 77, - 233, 124, 16, 141, 241, 176, 92, 198, 247, 194, 63, 121, 27, 139, 172, 97, - 137, 3, 11, 234, 149, 79, 203, 214, 131, 242, 25, 188, 120, 121, 121, 189, - 186, 89, 14, 225, 103, 0, 63, 201, 170, 108, 195, 4, 101, 167, 229, 229, - 57, 55, 155, 157, 70, 99, 59, 122, 118, 134, 105, 168, 171, 171, 242, 153, - 120, 10, 200, 12, 138, 197, 68, 184, 71, 121, 165, 160, 191, 174, 243, 248, - 103, 190, 72, 206, 225, 11, 118, 173, 37, 60, 101, 105, 121, 152, 182, 217, - 242, 185, 91, 208, 78, 119, 149, 20, 199, 56, 185, 23, 165, 57, 198, 9, - 31, 44, 218, 216, 138, 148, 161, 162, 251, 197, 88, 225, 241, 218, 193, 202, - 170, 88, 242, 232, 147, 12, 215, 98, 34, 230, 43, 51, 190, 120, 201, 44, - 16, 174, 153, 49, 106, 208, 235, 168, 116, 126, 217, 159, 157, 3, 191, 233, - 150, 229, 116, 233, 144, 103, 82, 62, 58, 91, 159, 139, 150, 188, 141, 246, - 186, 27, 24, 242, 146, 6, 104, 115, 47, 226, 45, 245, 241, 173, 166, 147, - 11, 88, 155, 165, 48, 142, 167, 241, 249, 56, 185, 164, 111, 22, 199, 222, - 64, 132, 198, 122, 182, 91, 50, 56, 73, 189, 188, 5, 74, 115, 195, 232, - 54, 244, 148, 66, 23, 228, 180, 141, 21, 16, 118, 187, 229, 240, 237, 63, - 254, 69, 185, 85, 216, 95, 177, 59, 204, 107, 119, 82, 88, 213, 20, 40, - 122, 12, 29, 124, 128, 206, 141, 252, 89, 34, 174, 39, 42, 37, 209, 111, - 78, 215, 245, 25, 252, 117, 187, 238, 33, 254, 245, 186, 238, 49, 254, 245, - 187, 158, 71, 173, 156, 222, 181, 148, 73, 119, 247, 140, 92, 247, 212, 105, - 88, 9, 199, 179, 249, 109, 149, 158, 10, 178, 66, 183, 204, 145, 52, 9, - 180, 58, 185, 199, 202, 255, 101, 241, 181, 137, 223, 252, 77, 73, 174, 185, - 50, 137, 217, 111, 74, 101, 225, 31, 159, 171, 14, 13, 171, 245, 249, 169, - 118, 3, 239, 1, 220, 160, 118, 175, 228, 176, 121, 147, 225, 112, 97, 87, - 132, 109, 115, 9, 175, 99, 181, 87, 34, 193, 97, 120, 51, 131, 89, 118, - 126, 115, 219, 100, 109, 219, 1, 197, 0, 104, 39, 98, 224, 250, 170, 153, - 29, 63, 17, 15, 20, 86, 220, 86, 17, 234, 53, 38, 236, 95, 248, 39, - 125, 88, 57, 62, 44, 213, 45, 29, 240, 91, 60, 185, 223, 74, 129, 198, - 233, 118, 43, 185, 240, 9, 151, 28, 242, 198, 38, 116, 60, 144, 158, 198, - 83, 129, 25, 75, 190, 234, 3, 60, 183, 245, 211, 162, 31, 65, 56, 10, - 243, 114, 157, 231, 180, 142, 80, 136, 25, 97, 26, 234, 239, 6, 17, 144, - 115, 60, 133, 69, 216, 71, 206, 248, 8, 72, 46, 230, 84, 56, 153, 130, - 238, 210, 159, 55, 158, 0, 167, 68, 225, 8, 81, 64, 190, 187, 184, 128, - 34, 113, 134, 190, 118, 9, 29, 39, 195, 198, 119, 183, 234, 85, 184, 5, - 67, 18, 159, 144, 8, 0, 141, 162, 92, 27, 76, 166, 17, 200, 70, 215, - 232, 234, 157, 246, 175, 252, 125, 4, 43, 227, 50, 14, 198, 228, 238, 189, - 184, 28, 114, 239, 113, 212, 193, 160, 228, 127, 130, 235, 30, 112, 108, 30, - 56, 245, 247, 40, 158, 47, 130, 17, 240, 13, 96, 86, 253, 96, 22, 242, - 141, 54, 26, 36, 20, 41, 126, 140, 46, 66, 25, 95, 149, 245, 229, 25, - 212, 14, 71, 189, 120, 10, 101, 55, 179, 17, 112, 67, 108, 203, 255, 255, - 237, 93, 109, 119, 219, 182, 146, 222, 207, 254, 21, 172, 170, 212, 113, 76, - 83, 34, 245, 98, 59, 215, 118, 215, 177, 147, 212, 167, 73, 155, 117, 188, - 205, 221, 141, 123, 117, 40, 137, 150, 24, 83, 162, 66, 82, 145, 21, 31, - 241, 183, 239, 60, 51, 0, 73, 201, 146, 35, 183, 185, 233, 221, 115, 110, - 114, 44, 146, 32, 48, 28, 0, 131, 121, 3, 48, 56, 53, 94, 123, 137, - 219, 86, 117, 125, 141, 80, 247, 19, 143, 56, 218, 28, 114, 148, 76, 228, - 134, 0, 62, 73, 31, 107, 204, 221, 14, 49, 30, 190, 161, 81, 152, 45, - 58, 207, 191, 5, 51, 169, 24, 100, 76, 62, 116, 238, 93, 169, 78, 80, - 207, 227, 54, 22, 71, 201, 113, 36, 208, 121, 245, 153, 224, 184, 31, 113, - 252, 81, 221, 43, 57, 42, 84, 14, 155, 61, 174, 124, 47, 128, 190, 119, - 225, 145, 58, 130, 2, 23, 126, 103, 231, 194, 165, 191, 208, 19, 232, 239, - 112, 80, 109, 41, 63, 18, 246, 93, 223, 143, 130, 181, 156, 218, 203, 228, - 121, 49, 118, 238, 156, 90, 135, 53, 150, 97, 236, 97, 210, 48, 238, 135, - 147, 14, 244, 32, 234, 3, 86, 186, 88, 77, 163, 175, 35, 174, 145, 162, - 82, 130, 101, 76, 34, 31, 49, 95, 48, 211, 40, 74, 23, 38, 254, 70, - 201, 50, 189, 227, 126, 37, 231, 87, 104, 53, 164, 57, 40, 216, 90, 245, - 27, 19, 10, 80, 193, 174, 189, 105, 59, 132, 118, 78, 136, 69, 9, 41, - 158, 80, 119, 78, 46, 206, 95, 109, 159, 114, 53, 72, 53, 234, 134, 99, - 168, 65, 200, 61, 241, 135, 8, 172, 30, 243, 130, 27, 136, 21, 157, 249, - 68, 103, 238, 133, 70, 155, 20, 126, 220, 162, 0, 233, 229, 61, 178, 246, - 2, 46, 178, 149, 35, 127, 28, 196, 33, 13, 71, 207, 11, 140, 43, 178, - 88, 145, 93, 99, 52, 8, 113, 215, 30, 147, 218, 63, 68, 99, 240, 132, - 232, 212, 112, 35, 180, 25, 154, 132, 94, 119, 81, 64, 29, 236, 76, 234, - 167, 225, 50, 197, 252, 75, 232, 100, 117, 94, 202, 191, 44, 128, 123, 206, - 121, 112, 158, 125, 56, 136, 15, 193, 92, 204, 54, 88, 139, 217, 86, 28, - 197, 236, 8, 39, 169, 155, 136, 107, 194, 63, 204, 58, 232, 46, 166, 102, - 160, 20, 97, 23, 102, 31, 44, 194, 236, 107, 142, 96, 246, 193, 15, 204, - 15, 25, 15, 48, 3, 61, 242, 77, 82, 93, 240, 131, 83, 109, 47, 55, - 6, 217, 16, 55, 7, 122, 80, 215, 186, 230, 32, 31, 212, 184, 199, 72, - 110, 141, 104, 36, 155, 35, 30, 199, 116, 33, 66, 53, 101, 229, 187, 249, - 81, 134, 173, 7, 63, 144, 25, 101, 35, 150, 192, 92, 110, 68, 60, 96, - 233, 54, 214, 35, 213, 140, 121, 156, 154, 177, 30, 146, 244, 50, 225, 33, - 105, 146, 117, 150, 224, 52, 87, 207, 156, 96, 36, 154, 19, 140, 63, 180, - 13, 137, 116, 18, 250, 151, 198, 173, 189, 93, 134, 250, 134, 230, 154, 233, - 21, 225, 36, 42, 99, 47, 56, 172, 202, 190, 35, 220, 66, 76, 110, 147, - 102, 69, 247, 191, 27, 164, 217, 94, 133, 33, 117, 249, 77, 171, 132, 130, - 6, 158, 136, 78, 114, 101, 8, 9, 44, 232, 151, 202, 3, 204, 31, 14, - 242, 237, 76, 36, 171, 208, 16, 173, 100, 48, 154, 229, 153, 173, 142, 63, - 232, 125, 102, 77, 65, 231, 204, 239, 68, 149, 9, 222, 255, 110, 44, 26, - 40, 84, 168, 178, 8, 196, 8, 11, 48, 4, 45, 127, 227, 250, 125, 217, - 102, 177, 25, 145, 69, 142, 147, 188, 141, 129, 59, 226, 40, 237, 148, 86, - 8, 142, 145, 137, 4, 227, 152, 134, 217, 52, 246, 33, 245, 90, 67, 210, - 255, 90, 44, 238, 186, 226, 118, 104, 101, 132, 178, 124, 67, 211, 73, 64, - 74, 151, 23, 233, 233, 97, 210, 119, 120, 227, 94, 241, 20, 192, 245, 92, - 118, 143, 255, 237, 149, 251, 183, 87, 238, 91, 121, 229, 254, 138, 197, 43, - 14, 113, 247, 230, 18, 238, 126, 103, 160, 97, 9, 38, 89, 8, 154, 147, - 17, 35, 115, 72, 107, 13, 76, 104, 182, 38, 51, 206, 94, 187, 21, 241, - 111, 143, 127, 57, 197, 109, 185, 196, 68, 3, 188, 15, 36, 67, 32, 57, - 2, 201, 114, 185, 49, 237, 180, 59, 81, 107, 106, 202, 21, 63, 217, 173, - 190, 201, 82, 122, 128, 229, 182, 91, 129, 137, 95, 183, 45, 23, 254, 5, - 168, 160, 211, 111, 117, 250, 38, 95, 248, 183, 79, 137, 253, 248, 19, 93, - 241, 27, 243, 239, 39, 250, 245, 91, 36, 106, 226, 128, 224, 92, 110, 116, - 6, 211, 107, 202, 206, 151, 129, 92, 166, 114, 185, 6, 118, 254, 71, 224, - 70, 191, 254, 199, 217, 70, 203, 237, 180, 202, 104, 5, 48, 101, 60, 16, - 139, 37, 1, 135, 173, 31, 100, 97, 140, 116, 234, 149, 242, 37, 114, 234, - 149, 78, 109, 107, 199, 33, 39, 183, 23, 23, 117, 108, 20, 225, 21, 160, - 128, 73, 234, 19, 57, 200, 126, 140, 55, 238, 246, 140, 222, 131, 85, 182, - 85, 156, 122, 8, 150, 152, 76, 123, 217, 114, 19, 243, 150, 181, 12, 6, - 101, 153, 143, 141, 36, 68, 119, 54, 24, 145, 198, 100, 156, 186, 137, 43, - 134, 134, 207, 9, 114, 174, 144, 201, 70, 225, 48, 188, 123, 92, 143, 102, - 244, 135, 44, 97, 252, 97, 49, 186, 158, 118, 27, 47, 89, 87, 188, 184, - 239, 248, 33, 30, 69, 65, 140, 29, 138, 140, 156, 209, 5, 206, 164, 38, - 252, 17, 15, 226, 25, 89, 149, 195, 78, 48, 238, 146, 58, 235, 221, 132, - 36, 193, 121, 187, 157, 155, 196, 80, 213, 120, 156, 188, 33, 25, 27, 194, - 207, 120, 114, 54, 232, 153, 198, 217, 48, 82, 109, 114, 252, 219, 89, 229, - 245, 155, 231, 47, 141, 199, 217, 198, 164, 23, 47, 56, 1, 30, 78, 170, - 144, 215, 165, 129, 107, 89, 86, 97, 57, 226, 95, 170, 204, 173, 94, 109, - 84, 236, 236, 57, 127, 201, 172, 4, 237, 193, 55, 224, 22, 225, 163, 105, - 216, 101, 149, 185, 140, 88, 51, 232, 228, 254, 35, 69, 75, 196, 8, 163, - 216, 215, 132, 164, 158, 204, 226, 195, 29, 74, 90, 251, 244, 142, 12, 184, - 15, 3, 132, 148, 190, 126, 216, 101, 153, 31, 133, 157, 190, 151, 84, 126, - 30, 146, 169, 1, 99, 118, 226, 39, 125, 202, 49, 204, 180, 2, 172, 153, - 26, 71, 49, 251, 158, 72, 53, 235, 224, 173, 106, 116, 210, 208, 97, 166, - 80, 166, 169, 27, 229, 78, 94, 250, 4, 171, 231, 68, 18, 134, 231, 162, - 0, 145, 89, 14, 202, 90, 78, 163, 240, 51, 179, 117, 244, 211, 197, 235, - 87, 6, 92, 242, 48, 194, 169, 148, 107, 208, 120, 29, 245, 49, 22, 137, - 128, 5, 5, 42, 23, 135, 129, 23, 76, 243, 47, 37, 0, 54, 26, 71, - 48, 178, 30, 68, 54, 249, 2, 56, 113, 127, 156, 18, 77, 146, 58, 26, - 77, 11, 33, 5, 74, 165, 59, 217, 24, 77, 140, 100, 100, 147, 83, 91, - 116, 55, 89, 11, 126, 231, 213, 159, 124, 237, 222, 248, 131, 241, 64, 157, - 183, 169, 230, 120, 244, 17, 204, 139, 202, 151, 206, 92, 8, 43, 200, 197, - 178, 72, 184, 45, 181, 103, 200, 153, 59, 156, 38, 15, 121, 128, 217, 140, - 249, 205, 214, 216, 75, 46, 147, 45, 184, 213, 115, 42, 122, 199, 185, 188, - 81, 79, 242, 50, 7, 139, 40, 133, 112, 9, 128, 144, 114, 197, 239, 156, - 44, 67, 226, 39, 116, 97, 135, 72, 48, 30, 12, 241, 44, 119, 107, 53, - 9, 150, 214, 158, 144, 142, 142, 0, 131, 199, 32, 28, 162, 59, 110, 235, - 55, 168, 235, 146, 85, 182, 122, 210, 230, 141, 62, 186, 233, 238, 66, 225, - 251, 35, 155, 254, 211, 246, 115, 87, 247, 151, 7, 38, 244, 179, 145, 174, - 118, 113, 23, 92, 195, 67, 152, 61, 144, 27, 249, 6, 6, 8, 186, 153, - 177, 45, 2, 15, 82, 74, 31, 236, 117, 4, 199, 164, 248, 60, 107, 88, - 254, 90, 101, 19, 136, 23, 57, 146, 161, 96, 112, 108, 193, 219, 201, 81, - 185, 62, 227, 152, 124, 249, 27, 132, 198, 228, 8, 135, 240, 35, 195, 152, - 32, 147, 222, 187, 81, 150, 197, 70, 149, 23, 186, 150, 135, 3, 227, 241, - 237, 230, 109, 123, 182, 57, 219, 50, 174, 44, 99, 211, 191, 122, 124, 99, - 250, 38, 93, 252, 163, 195, 253, 221, 31, 126, 240, 15, 14, 109, 199, 49, - 253, 157, 26, 253, 108, 109, 109, 138, 100, 33, 153, 29, 139, 213, 116, 155, - 204, 10, 43, 208, 9, 88, 233, 224, 187, 211, 95, 79, 46, 254, 231, 205, - 115, 3, 67, 196, 120, 243, 223, 207, 94, 157, 157, 24, 151, 165, 157, 74, - 229, 93, 237, 164, 82, 57, 189, 56, 53, 254, 206, 189, 109, 91, 213, 66, - 88, 4, 55, 168, 84, 158, 255, 114, 9, 79, 229, 198, 37, 207, 248, 144, - 61, 53, 153, 76, 172, 73, 141, 23, 53, 95, 156, 87, 110, 0, 209, 6, - 4, 117, 187, 147, 20, 138, 91, 221, 164, 123, 89, 58, 66, 249, 3, 254, - 244, 205, 32, 24, 198, 135, 203, 96, 217, 251, 251, 251, 2, 226, 178, 132, - 108, 79, 33, 11, 41, 167, 55, 164, 231, 194, 189, 2, 70, 18, 244, 232, - 160, 34, 151, 118, 216, 157, 26, 237, 30, 183, 51, 229, 250, 254, 197, 139, - 23, 167, 47, 94, 80, 214, 131, 142, 7, 57, 122, 116, 112, 133, 185, 92, - 248, 65, 232, 245, 142, 157, 1, 113, 142, 74, 229, 249, 198, 43, 25, 143, - 75, 183, 85, 19, 51, 0, 85, 179, 63, 43, 109, 209, 55, 28, 201, 157, - 240, 140, 84, 59, 140, 136, 51, 17, 152, 42, 161, 213, 33, 181, 121, 228, - 118, 17, 105, 130, 82, 246, 240, 197, 132, 190, 150, 116, 215, 44, 81, 103, - 76, 74, 212, 211, 170, 247, 113, 132, 151, 234, 78, 233, 202, 54, 211, 208, - 198, 176, 141, 69, 180, 241, 225, 173, 77, 168, 101, 218, 152, 74, 221, 144, - 138, 211, 187, 179, 199, 229, 163, 173, 217, 198, 249, 33, 244, 94, 226, 52, - 101, 126, 179, 53, 51, 94, 74, 138, 147, 167, 60, 147, 148, 90, 150, 2, - 66, 41, 223, 118, 189, 142, 211, 247, 110, 200, 250, 47, 159, 63, 105, 54, - 26, 181, 230, 118, 249, 229, 19, 178, 73, 183, 203, 207, 102, 76, 146, 59, - 150, 113, 187, 89, 221, 156, 33, 118, 103, 147, 183, 210, 219, 234, 24, 181, - 170, 177, 173, 222, 109, 16, 221, 10, 189, 182, 54, 221, 77, 217, 65, 77, - 84, 219, 218, 252, 188, 105, 250, 219, 173, 205, 227, 205, 29, 188, 32, 234, - 221, 232, 43, 228, 19, 169, 104, 125, 207, 172, 57, 234, 160, 55, 26, 12, - 252, 82, 228, 53, 118, 49, 201, 190, 255, 236, 140, 35, 35, 68, 139, 217, - 21, 18, 254, 121, 155, 205, 90, 229, 35, 132, 70, 97, 112, 76, 252, 170, - 75, 224, 47, 99, 73, 104, 96, 166, 7, 98, 250, 160, 130, 100, 252, 249, - 131, 158, 17, 71, 157, 67, 236, 39, 95, 2, 171, 68, 61, 87, 201, 179, - 127, 95, 42, 11, 218, 37, 73, 170, 208, 23, 84, 55, 178, 146, 202, 95, - 173, 112, 239, 83, 122, 86, 140, 51, 196, 74, 44, 16, 187, 41, 81, 7, - 176, 151, 165, 49, 51, 47, 89, 18, 4, 196, 250, 47, 75, 234, 33, 2, - 231, 231, 39, 37, 10, 178, 183, 234, 89, 101, 32, 33, 75, 70, 133, 23, - 20, 33, 54, 103, 38, 201, 2, 83, 241, 255, 153, 154, 35, 234, 250, 81, - 245, 176, 116, 97, 252, 240, 253, 94, 99, 191, 254, 55, 227, 89, 9, 73, - 246, 97, 233, 89, 150, 116, 161, 34, 202, 72, 214, 87, 89, 250, 185, 206, - 122, 158, 37, 189, 226, 237, 245, 148, 170, 168, 109, 219, 121, 82, 110, 108, - 35, 122, 170, 80, 3, 255, 210, 127, 34, 173, 237, 220, 129, 178, 177, 189, - 68, 177, 210, 91, 108, 204, 102, 77, 166, 31, 44, 158, 176, 176, 44, 67, - 79, 251, 19, 28, 29, 122, 67, 79, 106, 48, 69, 232, 135, 121, 186, 152, - 123, 5, 0, 122, 147, 206, 70, 66, 48, 75, 231, 94, 60, 14, 146, 146, - 160, 216, 156, 59, 53, 43, 161, 215, 191, 70, 234, 0, 231, 144, 212, 33, - 160, 183, 52, 231, 220, 55, 156, 185, 143, 132, 214, 82, 186, 60, 6, 41, - 109, 44, 167, 217, 103, 252, 110, 129, 107, 223, 229, 31, 25, 127, 89, 77, - 177, 199, 139, 4, 91, 225, 34, 95, 42, 246, 108, 105, 49, 69, 196, 119, - 83, 20, 185, 203, 110, 67, 70, 118, 132, 1, 70, 90, 132, 226, 252, 60, - 91, 79, 220, 55, 102, 133, 248, 160, 29, 17, 92, 168, 107, 172, 148, 50, - 47, 35, 134, 9, 142, 8, 39, 27, 221, 219, 184, 231, 131, 36, 251, 172, - 251, 81, 210, 243, 33, 107, 168, 10, 14, 111, 187, 33, 251, 4, 141, 80, - 209, 144, 232, 118, 164, 112, 1, 49, 230, 136, 228, 1, 91, 161, 125, 201, - 180, 64, 169, 172, 7, 95, 233, 114, 227, 135, 97, 59, 30, 253, 237, 143, - 253, 18, 252, 66, 12, 54, 13, 156, 7, 97, 9, 106, 151, 190, 207, 145, - 67, 207, 206, 247, 42, 4, 65, 140, 189, 16, 44, 8, 150, 138, 134, 188, - 231, 237, 92, 78, 180, 10, 195, 231, 189, 4, 39, 230, 128, 197, 219, 178, - 161, 194, 152, 222, 177, 213, 217, 115, 123, 244, 200, 153, 25, 3, 31, 83, - 174, 150, 113, 195, 83, 155, 131, 67, 34, 128, 25, 218, 119, 4, 253, 173, - 21, 17, 86, 136, 234, 129, 14, 1, 103, 175, 86, 31, 21, 249, 39, 34, - 244, 248, 189, 33, 97, 147, 132, 35, 116, 66, 251, 40, 171, 115, 9, 60, - 231, 104, 54, 199, 84, 23, 243, 19, 189, 17, 175, 40, 211, 223, 172, 148, - 177, 68, 77, 70, 135, 36, 254, 232, 175, 27, 110, 80, 169, 67, 18, 189, - 254, 251, 178, 79, 218, 151, 191, 125, 168, 2, 178, 80, 250, 17, 38, 106, - 195, 78, 135, 146, 120, 65, 1, 110, 111, 119, 240, 102, 54, 95, 44, 43, - 113, 64, 5, 240, 70, 185, 171, 1, 77, 45, 28, 160, 212, 237, 67, 146, - 253, 92, 67, 49, 144, 158, 114, 141, 232, 69, 73, 117, 40, 193, 87, 52, - 78, 144, 203, 254, 65, 127, 198, 148, 110, 26, 154, 220, 134, 26, 187, 239, - 30, 151, 135, 143, 246, 182, 228, 61, 211, 122, 78, 147, 100, 57, 81, 195, - 106, 8, 90, 54, 204, 75, 13, 125, 200, 234, 141, 176, 211, 239, 184, 149, - 10, 94, 15, 188, 97, 239, 180, 236, 113, 93, 148, 47, 208, 110, 8, 158, - 82, 118, 144, 2, 141, 72, 228, 13, 21, 53, 66, 35, 114, 39, 79, 193, - 117, 112, 66, 232, 24, 22, 29, 65, 154, 223, 16, 181, 200, 146, 151, 41, - 201, 107, 170, 194, 58, 142, 76, 145, 84, 51, 58, 45, 110, 234, 177, 77, - 40, 183, 211, 71, 142, 57, 125, 50, 217, 158, 236, 216, 59, 55, 124, 119, - 179, 117, 80, 222, 123, 50, 233, 87, 40, 223, 166, 241, 68, 190, 168, 118, - 6, 29, 216, 245, 170, 250, 36, 221, 153, 252, 39, 90, 117, 54, 15, 110, - 216, 115, 31, 50, 58, 126, 212, 9, 160, 59, 52, 153, 135, 243, 151, 55, - 92, 26, 10, 19, 156, 124, 43, 76, 251, 118, 82, 169, 203, 236, 186, 67, - 239, 27, 40, 249, 200, 80, 135, 243, 202, 17, 185, 150, 97, 153, 2, 129, - 131, 141, 113, 0, 28, 168, 24, 133, 249, 246, 200, 178, 22, 54, 45, 85, - 243, 255, 86, 163, 48, 31, 175, 119, 202, 21, 15, 154, 93, 210, 92, 118, - 161, 143, 90, 243, 22, 140, 44, 137, 81, 193, 105, 104, 108, 179, 214, 13, - 35, 60, 63, 131, 182, 24, 106, 202, 230, 216, 66, 194, 0, 64, 76, 89, - 170, 147, 165, 78, 11, 169, 181, 60, 239, 84, 199, 3, 250, 110, 229, 231, - 212, 214, 56, 119, 128, 179, 68, 207, 148, 91, 70, 31, 243, 221, 138, 57, - 221, 92, 76, 184, 227, 84, 145, 85, 22, 5, 155, 22, 174, 44, 76, 174, - 31, 143, 40, 123, 204, 203, 25, 163, 54, 89, 143, 108, 28, 187, 73, 172, - 140, 100, 245, 110, 156, 16, 241, 95, 5, 88, 156, 121, 66, 18, 141, 164, - 51, 79, 129, 159, 112, 248, 181, 19, 23, 38, 245, 9, 213, 239, 10, 171, - 20, 97, 88, 226, 26, 246, 120, 205, 98, 231, 154, 46, 207, 221, 94, 128, - 169, 233, 231, 129, 71, 189, 193, 211, 230, 207, 73, 90, 96, 62, 253, 69, - 176, 184, 26, 224, 69, 52, 246, 25, 1, 204, 46, 116, 80, 236, 229, 120, - 48, 152, 202, 218, 128, 24, 207, 103, 100, 3, 117, 121, 154, 191, 176, 10, - 224, 149, 231, 94, 241, 101, 232, 202, 37, 228, 73, 18, 158, 112, 199, 252, - 127, 228, 243, 4, 206, 107, 18, 160, 8, 189, 238, 202, 253, 181, 55, 229, - 185, 124, 234, 15, 254, 166, 28, 34, 41, 119, 35, 50, 140, 113, 119, 30, - 134, 152, 68, 226, 59, 124, 63, 71, 245, 237, 199, 49, 73, 74, 158, 138, - 239, 118, 167, 60, 19, 223, 227, 140, 239, 100, 5, 235, 59, 23, 237, 38, - 247, 255, 235, 5, 93, 119, 249, 164, 118, 102, 160, 159, 244, 233, 83, 144, - 172, 196, 46, 171, 204, 41, 225, 6, 42, 196, 178, 38, 51, 252, 157, 223, - 77, 250, 114, 230, 108, 132, 231, 159, 60, 168, 170, 156, 48, 240, 136, 112, - 144, 70, 134, 126, 56, 32, 1, 218, 89, 190, 172, 254, 169, 193, 64, 140, - 194, 209, 36, 243, 110, 25, 129, 185, 250, 253, 183, 242, 55, 236, 86, 176, - 22, 208, 94, 234, 167, 204, 169, 93, 70, 108, 217, 54, 226, 145, 33, 231, - 19, 200, 113, 25, 106, 30, 117, 100, 252, 168, 158, 113, 26, 129, 142, 128, - 176, 108, 184, 16, 160, 194, 98, 48, 156, 48, 190, 248, 165, 178, 109, 222, - 150, 39, 71, 229, 254, 143, 229, 201, 211, 234, 140, 30, 250, 71, 229, 201, - 143, 229, 62, 61, 232, 161, 26, 6, 159, 60, 227, 181, 251, 89, 111, 99, - 197, 115, 107, 64, 207, 230, 252, 227, 178, 125, 10, 11, 142, 45, 113, 251, - 168, 37, 187, 197, 227, 110, 116, 112, 206, 59, 185, 246, 27, 230, 126, 241, - 32, 248, 101, 71, 231, 44, 30, 127, 81, 8, 158, 43, 71, 126, 216, 95, - 8, 32, 50, 183, 72, 152, 107, 186, 176, 45, 30, 113, 142, 141, 119, 106, - 93, 205, 187, 190, 79, 164, 33, 79, 127, 69, 20, 238, 85, 7, 207, 231, - 61, 81, 220, 89, 187, 177, 141, 112, 116, 150, 113, 116, 104, 33, 200, 135, - 226, 206, 54, 201, 69, 125, 254, 57, 81, 145, 72, 24, 99, 187, 77, 198, - 85, 227, 17, 9, 28, 146, 77, 158, 77, 54, 186, 54, 49, 138, 75, 13, - 48, 203, 253, 136, 183, 115, 147, 158, 82, 147, 19, 53, 170, 27, 249, 249, - 226, 68, 144, 134, 150, 115, 136, 21, 82, 88, 52, 6, 163, 74, 159, 175, - 62, 119, 20, 188, 136, 86, 113, 16, 160, 71, 36, 236, 13, 219, 78, 75, - 242, 101, 134, 85, 102, 69, 145, 58, 236, 143, 98, 47, 71, 141, 168, 139, - 1, 22, 0, 229, 121, 20, 210, 75, 242, 228, 155, 192, 7, 217, 6, 244, - 106, 166, 247, 220, 165, 117, 106, 105, 57, 34, 157, 87, 56, 233, 143, 235, - 15, 80, 125, 111, 78, 212, 63, 245, 21, 141, 69, 150, 183, 198, 146, 223, - 254, 210, 235, 234, 141, 157, 87, 51, 171, 193, 170, 194, 11, 175, 165, 240, - 247, 255, 217, 9, 136, 82, 217, 125, 171, 13, 175, 151, 152, 204, 137, 166, - 34, 136, 99, 149, 165, 39, 137, 45, 18, 34, 238, 84, 39, 170, 169, 0, - 44, 25, 159, 26, 93, 239, 10, 235, 80, 100, 101, 148, 119, 195, 188, 36, - 230, 137, 0, 20, 81, 243, 5, 177, 242, 249, 123, 106, 101, 148, 2, 203, - 43, 198, 173, 12, 106, 89, 92, 88, 214, 135, 81, 143, 143, 223, 130, 104, - 104, 181, 131, 113, 100, 212, 16, 61, 2, 33, 241, 197, 162, 118, 246, 178, - 63, 164, 205, 5, 254, 225, 99, 73, 178, 120, 154, 164, 108, 181, 196, 203, - 81, 226, 208, 175, 233, 123, 192, 251, 189, 84, 248, 166, 98, 127, 9, 196, - 155, 73, 122, 85, 104, 14, 88, 118, 154, 93, 18, 240, 166, 7, 241, 174, - 162, 24, 114, 27, 22, 238, 49, 78, 6, 216, 194, 64, 138, 203, 113, 246, - 157, 215, 146, 82, 90, 85, 173, 209, 248, 243, 103, 2, 201, 20, 103, 41, - 178, 181, 248, 116, 123, 186, 58, 92, 9, 113, 131, 103, 255, 51, 208, 111, - 184, 104, 233, 78, 223, 36, 126, 76, 2, 241, 129, 189, 35, 133, 254, 76, - 7, 121, 195, 94, 228, 146, 64, 64, 53, 234, 132, 232, 174, 213, 164, 78, - 105, 88, 142, 118, 226, 84, 51, 207, 7, 188, 124, 112, 147, 147, 130, 69, - 18, 71, 197, 51, 212, 213, 122, 46, 112, 86, 182, 88, 59, 188, 246, 250, - 212, 226, 124, 134, 68, 149, 46, 117, 110, 49, 110, 45, 132, 171, 166, 63, - 196, 14, 193, 105, 215, 214, 46, 114, 136, 91, 5, 218, 182, 189, 75, 87, - 73, 177, 177, 1, 196, 178, 139, 36, 241, 12, 128, 87, 126, 118, 175, 77, - 186, 26, 49, 67, 2, 206, 94, 156, 188, 220, 175, 1, 169, 102, 164, 207, - 4, 41, 231, 89, 1, 33, 63, 228, 138, 15, 135, 227, 179, 223, 44, 80, - 41, 97, 99, 180, 174, 70, 241, 97, 51, 111, 2, 228, 75, 195, 97, 138, - 82, 43, 49, 234, 146, 30, 58, 198, 68, 27, 86, 110, 96, 18, 201, 6, - 249, 67, 168, 113, 197, 208, 216, 181, 2, 154, 167, 58, 123, 170, 242, 175, - 6, 28, 121, 238, 32, 150, 243, 172, 106, 194, 157, 173, 61, 38, 204, 61, - 52, 99, 189, 8, 20, 89, 83, 201, 11, 151, 200, 202, 209, 235, 5, 201, - 200, 27, 26, 136, 68, 223, 168, 10, 138, 232, 134, 185, 33, 73, 121, 82, - 202, 180, 28, 72, 47, 33, 85, 47, 162, 134, 194, 58, 54, 35, 27, 208, - 244, 191, 222, 200, 199, 247, 252, 24, 39, 140, 188, 40, 229, 18, 43, 49, - 227, 249, 73, 191, 211, 26, 134, 159, 188, 224, 234, 38, 128, 167, 207, 108, - 130, 143, 200, 88, 108, 18, 217, 212, 133, 102, 249, 3, 187, 212, 6, 214, - 190, 147, 81, 178, 157, 189, 193, 11, 103, 47, 251, 250, 47, 0, 152, 190, - 248, 251, 202, 47, 147, 154, 62, 142, 19, 89, 149, 211, 226, 93, 53, 133, - 145, 158, 129, 57, 43, 228, 74, 145, 107, 37, 188, 96, 26, 120, 31, 174, - 91, 92, 93, 232, 76, 28, 187, 189, 206, 59, 157, 50, 104, 175, 56, 79, - 170, 243, 172, 102, 75, 26, 8, 181, 3, 85, 14, 135, 201, 74, 183, 229, - 220, 231, 139, 32, 216, 150, 192, 172, 168, 221, 224, 145, 106, 155, 153, 87, - 55, 135, 162, 51, 173, 4, 67, 134, 71, 55, 193, 10, 83, 153, 81, 37, - 84, 170, 124, 212, 176, 85, 195, 152, 39, 22, 67, 131, 127, 127, 14, 230, - 127, 169, 18, 233, 39, 55, 242, 229, 128, 131, 149, 208, 63, 241, 108, 113, - 94, 221, 125, 171, 182, 91, 0, 245, 27, 191, 190, 211, 92, 154, 215, 182, - 73, 255, 184, 38, 139, 107, 2, 197, 239, 65, 12, 151, 75, 238, 80, 209, - 29, 46, 251, 231, 4, 163, 231, 94, 19, 46, 19, 99, 191, 232, 63, 46, - 72, 58, 188, 79, 213, 169, 243, 43, 91, 162, 200, 190, 121, 199, 28, 49, - 86, 13, 108, 129, 117, 175, 203, 169, 123, 157, 174, 48, 119, 47, 233, 244, - 13, 219, 6, 49, 58, 24, 249, 124, 164, 128, 185, 103, 53, 148, 8, 87, - 76, 38, 23, 154, 249, 62, 225, 20, 101, 87, 211, 24, 27, 177, 45, 172, - 228, 136, 92, 63, 161, 54, 0, 157, 57, 122, 180, 218, 245, 186, 185, 187, - 79, 34, 161, 72, 113, 92, 36, 213, 69, 238, 69, 94, 240, 38, 22, 109, - 55, 8, 197, 93, 66, 114, 175, 193, 156, 171, 193, 50, 166, 33, 45, 211, - 64, 173, 28, 213, 56, 86, 77, 154, 42, 251, 94, 118, 94, 231, 92, 77, - 52, 5, 177, 238, 250, 48, 77, 74, 226, 224, 252, 9, 130, 97, 0, 45, - 183, 13, 174, 34, 187, 37, 88, 56, 67, 128, 230, 104, 179, 45, 148, 22, - 50, 221, 35, 143, 105, 12, 183, 58, 188, 164, 15, 36, 88, 157, 19, 169, - 244, 46, 149, 119, 164, 94, 248, 201, 116, 37, 24, 34, 146, 40, 188, 114, - 187, 30, 166, 65, 154, 76, 123, 25, 152, 115, 188, 75, 241, 114, 101, 241, - 228, 186, 245, 201, 23, 229, 11, 36, 198, 253, 180, 139, 78, 194, 188, 15, - 40, 97, 215, 116, 224, 119, 147, 46, 114, 106, 196, 215, 64, 38, 187, 196, - 146, 44, 34, 203, 125, 68, 27, 67, 51, 236, 73, 59, 200, 186, 3, 165, - 140, 241, 1, 171, 5, 166, 32, 223, 73, 227, 100, 122, 87, 253, 146, 13, - 245, 194, 117, 30, 212, 173, 133, 130, 127, 184, 115, 245, 145, 13, 165, 43, - 229, 107, 42, 213, 100, 167, 43, 206, 209, 204, 238, 107, 77, 122, 178, 217, - 239, 184, 168, 120, 168, 114, 171, 41, 103, 200, 72, 6, 100, 234, 140, 98, - 99, 143, 73, 189, 244, 248, 177, 109, 217, 198, 182, 225, 63, 249, 92, 105, - 110, 85, 232, 169, 90, 55, 118, 212, 227, 214, 63, 154, 150, 83, 42, 232, - 175, 226, 206, 44, 129, 151, 151, 212, 165, 64, 116, 10, 126, 10, 248, 203, - 209, 136, 195, 241, 8, 19, 246, 164, 165, 64, 118, 80, 61, 234, 210, 87, - 249, 36, 114, 38, 154, 133, 109, 237, 23, 211, 170, 119, 114, 85, 231, 168, - 30, 124, 126, 28, 142, 227, 84, 192, 175, 110, 138, 136, 55, 195, 74, 155, - 214, 114, 0, 156, 124, 143, 202, 22, 39, 88, 117, 70, 134, 5, 244, 64, - 103, 159, 41, 204, 169, 153, 217, 54, 229, 130, 186, 198, 89, 83, 100, 189, - 71, 83, 11, 71, 173, 9, 124, 111, 50, 65, 233, 152, 123, 210, 198, 181, - 134, 170, 61, 107, 38, 142, 214, 142, 16, 87, 149, 229, 39, 43, 136, 171, - 117, 240, 83, 130, 155, 50, 220, 123, 198, 43, 239, 26, 48, 88, 45, 128, - 54, 13, 141, 27, 227, 168, 201, 218, 18, 235, 102, 59, 53, 26, 61, 187, - 120, 40, 12, 229, 108, 123, 208, 42, 200, 49, 251, 26, 91, 226, 112, 55, - 170, 115, 221, 149, 183, 143, 120, 36, 211, 36, 76, 37, 227, 106, 206, 224, - 221, 32, 64, 98, 183, 213, 11, 220, 56, 6, 181, 212, 53, 17, 56, 243, - 156, 90, 101, 76, 57, 227, 18, 163, 16, 11, 63, 197, 38, 172, 145, 206, - 206, 199, 125, 18, 56, 25, 67, 121, 13, 57, 125, 145, 45, 92, 233, 189, - 97, 15, 226, 9, 127, 130, 201, 67, 124, 117, 162, 196, 176, 89, 45, 101, - 237, 61, 59, 223, 128, 119, 67, 102, 20, 123, 126, 145, 198, 227, 246, 206, - 200, 191, 241, 130, 123, 40, 205, 143, 146, 41, 147, 187, 185, 72, 167, 209, - 61, 92, 93, 41, 39, 93, 47, 113, 253, 32, 102, 29, 142, 201, 5, 68, - 234, 220, 85, 82, 84, 190, 229, 224, 62, 120, 31, 188, 214, 80, 47, 177, - 37, 141, 185, 67, 140, 136, 117, 60, 108, 57, 199, 8, 50, 27, 11, 227, - 153, 195, 174, 165, 58, 79, 170, 11, 187, 247, 210, 223, 0, 46, 225, 2, - 206, 13, 118, 61, 41, 180, 115, 29, 133, 115, 45, 98, 172, 251, 123, 228, - 98, 34, 225, 129, 34, 64, 21, 250, 51, 221, 78, 42, 205, 208, 104, 242, - 224, 111, 176, 129, 171, 52, 171, 149, 35, 253, 156, 10, 164, 172, 26, 166, - 136, 160, 87, 108, 148, 122, 21, 67, 165, 42, 33, 123, 137, 227, 185, 131, - 112, 124, 21, 64, 194, 238, 155, 74, 133, 35, 122, 168, 55, 77, 210, 196, - 137, 177, 96, 232, 211, 135, 73, 223, 178, 247, 232, 207, 222, 21, 15, 12, - 189, 183, 27, 185, 85, 116, 146, 65, 185, 167, 147, 217, 91, 24, 27, 13, - 153, 240, 202, 138, 114, 234, 61, 28, 121, 138, 37, 200, 82, 74, 20, 178, - 2, 91, 230, 119, 247, 213, 78, 114, 240, 154, 117, 117, 44, 50, 236, 39, - 21, 135, 154, 120, 229, 2, 168, 52, 207, 184, 154, 144, 220, 8, 147, 244, - 172, 137, 42, 207, 14, 124, 21, 77, 254, 179, 197, 59, 93, 45, 80, 20, - 103, 191, 135, 44, 135, 94, 4, 209, 27, 198, 174, 223, 49, 216, 159, 33, - 74, 74, 129, 38, 57, 75, 42, 89, 86, 51, 88, 4, 76, 140, 161, 245, - 97, 130, 30, 231, 94, 211, 165, 73, 76, 66, 187, 106, 10, 190, 141, 81, - 202, 225, 151, 87, 182, 91, 140, 0, 19, 134, 83, 228, 210, 11, 145, 183, - 11, 238, 216, 157, 5, 25, 247, 22, 133, 239, 3, 238, 185, 131, 0, 171, - 10, 136, 47, 183, 199, 1, 135, 150, 176, 27, 90, 215, 174, 21, 122, 229, - 173, 202, 153, 230, 57, 239, 169, 126, 136, 125, 9, 159, 60, 246, 152, 216, - 218, 104, 202, 97, 225, 125, 202, 25, 238, 193, 13, 204, 84, 14, 1, 145, - 73, 171, 136, 250, 132, 15, 199, 73, 182, 158, 60, 246, 110, 70, 143, 113, - 246, 82, 178, 181, 181, 227, 60, 193, 93, 253, 73, 178, 181, 195, 175, 43, - 182, 179, 245, 143, 6, 194, 178, 72, 142, 53, 115, 11, 29, 242, 9, 174, - 104, 106, 150, 178, 85, 229, 244, 84, 202, 79, 110, 152, 41, 220, 210, 81, - 16, 38, 233, 251, 28, 195, 223, 87, 85, 232, 103, 63, 73, 166, 231, 36, - 159, 98, 131, 125, 106, 194, 165, 217, 73, 204, 191, 220, 135, 25, 124, 202, - 237, 134, 215, 110, 26, 143, 136, 121, 176, 27, 99, 129, 159, 46, 180, 213, - 208, 131, 135, 131, 247, 19, 177, 79, 65, 41, 59, 13, 101, 66, 41, 94, - 181, 139, 30, 173, 105, 203, 74, 180, 150, 220, 155, 226, 193, 253, 1, 16, - 247, 249, 28, 112, 34, 53, 169, 165, 13, 209, 50, 115, 49, 64, 201, 75, - 228, 185, 242, 236, 6, 56, 68, 76, 238, 151, 156, 17, 148, 31, 10, 4, - 169, 89, 56, 149, 134, 93, 138, 191, 27, 239, 107, 191, 207, 41, 211, 118, - 254, 217, 60, 243, 253, 67, 209, 143, 7, 36, 25, 225, 20, 172, 73, 203, - 55, 32, 28, 247, 216, 44, 22, 205, 173, 184, 44, 45, 39, 83, 41, 186, - 40, 122, 106, 93, 137, 67, 252, 80, 101, 163, 118, 106, 100, 5, 31, 40, - 130, 114, 253, 40, 148, 214, 196, 29, 65, 227, 109, 198, 138, 22, 10, 77, - 87, 235, 26, 236, 250, 107, 124, 161, 213, 106, 115, 172, 21, 91, 26, 237, - 125, 71, 171, 116, 173, 124, 94, 137, 224, 209, 112, 40, 49, 142, 60, 119, - 221, 185, 142, 191, 43, 161, 123, 176, 238, 207, 89, 206, 145, 100, 106, 192, - 222, 191, 243, 253, 218, 105, 10, 248, 105, 14, 127, 177, 133, 97, 248, 41, - 37, 226, 65, 45, 44, 123, 77, 10, 165, 31, 214, 188, 29, 55, 226, 40, - 32, 2, 0, 128, 220, 40, 154, 14, 121, 2, 27, 81, 30, 70, 227, 132, - 67, 90, 28, 146, 49, 86, 200, 166, 221, 110, 236, 109, 198, 192, 176, 196, - 135, 225, 136, 243, 133, 134, 157, 173, 236, 32, 232, 79, 120, 170, 201, 89, - 161, 104, 32, 54, 164, 115, 243, 144, 236, 248, 244, 55, 119, 152, 190, 12, - 123, 253, 167, 233, 91, 70, 32, 253, 133, 55, 23, 124, 25, 223, 94, 228, - 78, 217, 147, 247, 13, 145, 125, 29, 98, 61, 132, 59, 124, 154, 190, 164, - 175, 167, 23, 244, 249, 53, 48, 157, 242, 70, 70, 50, 5, 218, 216, 43, - 250, 13, 209, 253, 217, 197, 116, 119, 124, 61, 125, 154, 202, 102, 74, 108, - 100, 221, 193, 142, 213, 53, 176, 14, 124, 44, 99, 105, 187, 83, 55, 9, - 220, 142, 31, 38, 238, 55, 165, 139, 103, 145, 251, 113, 236, 61, 77, 95, - 49, 26, 233, 51, 106, 110, 55, 73, 95, 185, 233, 9, 163, 178, 78, 5, - 188, 79, 190, 219, 29, 147, 202, 238, 17, 109, 127, 252, 182, 77, 159, 161, - 239, 165, 191, 49, 22, 169, 155, 6, 155, 207, 5, 145, 181, 168, 219, 115, - 19, 40, 13, 223, 18, 233, 159, 194, 235, 49, 169, 122, 79, 211, 139, 190, - 71, 20, 78, 24, 164, 239, 22, 60, 178, 10, 93, 79, 45, 72, 82, 103, - 136, 89, 22, 239, 100, 239, 187, 73, 7, 243, 54, 188, 212, 253, 94, 188, - 149, 186, 177, 2, 235, 234, 50, 172, 87, 225, 140, 111, 26, 167, 145, 59, - 89, 144, 228, 89, 195, 254, 63, 64, 178, 45, 75, 198, 190, 38, 63, 182, - 255, 249, 252, 56, 153, 199, 119, 60, 24, 32, 190, 222, 192, 219, 119, 215, - 65, 216, 49, 115, 143, 210, 124, 187, 58, 115, 232, 218, 247, 227, 251, 38, - 36, 198, 214, 185, 38, 116, 179, 239, 167, 191, 132, 233, 254, 241, 26, 40, - 255, 139, 15, 178, 110, 216, 155, 67, 183, 19, 34, 60, 97, 143, 237, 150, - 111, 136, 112, 214, 194, 39, 249, 247, 215, 192, 214, 143, 124, 132, 184, 249, - 75, 72, 247, 140, 191, 189, 76, 71, 87, 11, 26, 231, 48, 37, 149, 9, - 233, 97, 240, 5, 186, 213, 118, 103, 109, 41, 221, 254, 49, 249, 0, 34, - 120, 45, 31, 95, 130, 174, 248, 46, 231, 144, 13, 101, 145, 127, 48, 66, - 248, 196, 113, 228, 245, 220, 168, 235, 13, 221, 161, 219, 163, 55, 107, 13, - 60, 66, 221, 97, 252, 209, 226, 152, 140, 158, 171, 70, 13, 243, 159, 197, - 154, 52, 84, 77, 86, 233, 24, 129, 71, 213, 80, 91, 15, 130, 244, 141, - 66, 43, 125, 201, 120, 165, 199, 10, 177, 229, 246, 18, 153, 66, 177, 59, - 207, 69, 184, 198, 49, 182, 30, 19, 185, 119, 56, 114, 100, 71, 92, 178, - 95, 160, 165, 186, 170, 156, 141, 138, 57, 95, 71, 119, 138, 135, 208, 157, - 196, 55, 28, 167, 64, 10, 131, 64, 97, 69, 154, 8, 163, 181, 110, 213, - 72, 255, 239, 123, 60, 203, 19, 94, 93, 187, 126, 20, 142, 221, 225, 151, - 170, 228, 124, 213, 42, 113, 87, 157, 13, 83, 194, 131, 184, 59, 33, 146, - 134, 87, 84, 81, 65, 101, 61, 242, 27, 133, 193, 116, 212, 15, 135, 83, - 103, 61, 82, 251, 170, 168, 191, 209, 31, 79, 157, 245, 176, 157, 244, 137, - 189, 146, 32, 37, 11, 142, 108, 209, 240, 74, 100, 212, 55, 197, 156, 76, - 6, 47, 121, 154, 190, 203, 49, 73, 119, 210, 231, 195, 46, 154, 94, 68, - 214, 186, 13, 47, 51, 204, 93, 111, 224, 37, 159, 121, 41, 202, 90, 220, - 202, 90, 165, 191, 60, 172, 26, 167, 94, 224, 142, 135, 238, 20, 157, 32, - 136, 164, 93, 226, 92, 26, 149, 251, 198, 192, 156, 246, 149, 135, 155, 98, - 159, 197, 189, 53, 144, 101, 133, 220, 19, 245, 66, 21, 170, 127, 180, 39, - 242, 96, 118, 42, 190, 91, 250, 214, 91, 166, 217, 44, 211, 198, 200, 122, - 251, 178, 177, 41, 77, 238, 88, 188, 239, 254, 107, 90, 155, 207, 63, 121, - 112, 117, 253, 45, 37, 251, 109, 149, 213, 185, 2, 235, 137, 235, 199, 73, - 39, 252, 146, 241, 166, 185, 103, 19, 18, 192, 222, 205, 176, 175, 54, 179, - 53, 143, 187, 92, 13, 103, 17, 125, 44, 19, 193, 36, 224, 234, 97, 11, - 164, 223, 105, 52, 214, 198, 60, 246, 162, 79, 161, 31, 33, 12, 157, 219, - 245, 60, 234, 183, 111, 170, 244, 248, 29, 55, 142, 67, 17, 208, 231, 26, - 153, 53, 145, 119, 3, 34, 126, 178, 246, 67, 130, 48, 88, 11, 107, 161, - 245, 59, 56, 47, 109, 240, 53, 244, 159, 99, 70, 32, 125, 38, 24, 172, - 137, 117, 22, 32, 14, 241, 177, 200, 182, 155, 120, 209, 104, 45, 69, 158, - 233, 197, 106, 54, 190, 166, 217, 172, 113, 73, 129, 12, 105, 17, 140, 205, - 154, 21, 97, 174, 207, 145, 229, 88, 141, 224, 189, 131, 107, 212, 163, 102, - 237, 53, 87, 232, 161, 164, 20, 53, 212, 36, 239, 98, 61, 150, 19, 126, - 222, 21, 204, 248, 211, 23, 192, 70, 41, 16, 192, 231, 238, 194, 157, 174, - 39, 53, 122, 232, 234, 29, 236, 103, 216, 185, 26, 63, 116, 154, 111, 49, - 16, 157, 250, 120, 133, 56, 118, 236, 126, 8, 199, 177, 133, 55, 8, 223, - 184, 232, 208, 124, 165, 115, 148, 214, 0, 151, 132, 209, 56, 174, 117, 87, - 2, 131, 119, 20, 89, 214, 129, 37, 145, 7, 231, 65, 57, 185, 3, 91, - 5, 24, 93, 3, 80, 76, 36, 17, 4, 112, 1, 172, 130, 245, 86, 231, - 88, 7, 92, 54, 110, 22, 106, 233, 20, 38, 12, 244, 118, 171, 53, 192, - 21, 36, 228, 28, 188, 124, 210, 51, 23, 100, 165, 255, 248, 63, 155, 115, - 159, 42 }; + 49, 32, 117, 110, 115, 105, 103, 110, 101, 100, 95, 99, 104, 97, 114, 32, + 108, 105, 116, 116, 108, 101, 95, 101, 110, 100, 105, 97, 110, 10, 49, 32, + 49, 55, 57, 51, 54, 51, 49, 32, 49, 32, 49, 32, 35, 53, 50, 55, + 52, 57, 54, 10, 120, 156, 172, 187, 215, 174, 196, 202, 146, 37, 246, 62, + 95, 113, 116, 27, 24, 245, 128, 163, 75, 87, 44, 22, 219, 97, 232, 189, + 247, 124, 105, 208, 123, 239, 249, 245, 226, 233, 219, 45, 72, 51, 35, 65, + 128, 68, 160, 184, 185, 89, 153, 201, 200, 204, 136, 21, 107, 101, 22, 255, + 238, 191, 149, 125, 157, 254, 167, 191, 251, 79, 127, 247, 199, 31, 92, 221, + 229, 127, 252, 199, 241, 15, 127, 236, 83, 22, 111, 57, 66, 32, 127, 253, + 91, 145, 63, 254, 251, 227, 239, 255, 224, 255, 87, 85, 164, 255, 72, 199, + 190, 143, 135, 236, 143, 226, 207, 250, 255, 229, 111, 109, 49, 249, 154, 46, + 245, 180, 213, 227, 240, 103, 91, 238, 191, 181, 245, 183, 18, 197, 184, 252, + 95, 43, 174, 127, 252, 123, 237, 45, 95, 214, 63, 254, 254, 207, 239, 211, + 125, 89, 242, 97, 251, 227, 120, 239, 252, 217, 4, 242, 87, 226, 175, 200, + 127, 249, 235, 255, 212, 136, 106, 219, 166, 245, 31, 64, 240, 79, 43, 255, + 154, 239, 255, 97, 129, 82, 167, 249, 176, 230, 255, 209, 27, 58, 167, 69, + 69, 249, 227, 64, 254, 10, 255, 63, 182, 146, 230, 105, 221, 117, 127, 173, + 135, 98, 4, 187, 63, 155, 72, 243, 21, 84, 254, 118, 241, 175, 127, 107, + 228, 95, 189, 183, 145, 255, 45, 31, 254, 90, 109, 125, 247, 31, 143, 227, + 243, 33, 95, 222, 62, 102, 127, 188, 230, 254, 195, 31, 8, 132, 64, 32, + 68, 128, 16, 250, 95, 255, 128, 145, 127, 192, 176, 63, 75, 253, 183, 114, + 175, 255, 248, 167, 250, 95, 200, 100, 220, 183, 127, 2, 235, 127, 249, 247, + 91, 255, 249, 239, 136, 31, 66, 252, 227, 31, 246, 62, 77, 227, 178, 253, + 225, 174, 127, 252, 47, 255, 113, 243, 31, 254, 117, 24, 135, 252, 95, 255, + 107, 113, 253, 235, 250, 183, 175, 255, 117, 95, 255, 189, 222, 63, 252, 235, + 63, 15, 227, 150, 255, 253, 95, 254, 233, 53, 239, 29, 188, 127, 249, 167, + 248, 143, 106, 201, 139, 127, 254, 203, 127, 55, 38, 127, 249, 151, 127, 170, + 251, 242, 143, 117, 73, 255, 249, 47, 239, 68, 196, 255, 80, 247, 113, 153, + 131, 211, 80, 254, 99, 18, 175, 249, 247, 243, 95, 107, 143, 210, 173, 19, + 146, 249, 114, 36, 223, 67, 179, 221, 138, 117, 203, 247, 202, 62, 223, 19, + 21, 208, 164, 250, 254, 165, 37, 53, 108, 174, 63, 11, 4, 30, 165, 122, + 108, 0, 128, 199, 39, 213, 161, 21, 215, 221, 207, 105, 12, 108, 45, 217, + 205, 254, 5, 230, 122, 94, 104, 181, 139, 118, 116, 255, 81, 123, 49, 10, + 25, 10, 112, 76, 136, 72, 150, 242, 116, 141, 141, 36, 202, 67, 40, 19, + 113, 44, 91, 110, 161, 159, 238, 142, 102, 129, 69, 167, 93, 68, 109, 28, + 172, 146, 224, 203, 187, 254, 231, 57, 159, 152, 192, 205, 90, 143, 67, 55, + 254, 246, 179, 147, 21, 15, 130, 213, 8, 2, 120, 215, 51, 143, 124, 56, + 47, 213, 134, 189, 166, 248, 86, 219, 177, 166, 103, 125, 144, 253, 142, 147, + 168, 168, 101, 138, 230, 184, 208, 165, 25, 166, 196, 157, 89, 172, 160, 2, + 4, 85, 60, 219, 41, 155, 189, 144, 9, 34, 34, 248, 7, 224, 218, 227, + 24, 110, 24, 179, 160, 244, 153, 239, 70, 196, 5, 124, 217, 64, 172, 31, + 130, 28, 36, 188, 173, 176, 129, 35, 75, 16, 216, 197, 213, 28, 172, 180, + 36, 233, 140, 103, 7, 191, 233, 195, 174, 96, 136, 18, 74, 239, 128, 141, + 139, 126, 105, 8, 192, 193, 9, 212, 143, 32, 143, 11, 220, 70, 1, 60, + 105, 77, 152, 216, 181, 207, 238, 61, 60, 143, 130, 53, 10, 7, 16, 136, + 242, 55, 203, 53, 193, 176, 3, 4, 1, 175, 180, 170, 161, 223, 76, 228, + 247, 15, 78, 108, 138, 69, 208, 29, 32, 129, 93, 135, 26, 138, 74, 201, + 137, 20, 36, 245, 148, 248, 192, 48, 19, 74, 25, 15, 136, 11, 166, 221, + 207, 3, 63, 206, 131, 46, 191, 5, 168, 88, 89, 221, 65, 130, 102, 232, + 133, 177, 183, 76, 121, 112, 75, 14, 24, 190, 187, 1, 245, 114, 168, 57, + 106, 212, 79, 117, 75, 40, 111, 125, 66, 24, 92, 247, 83, 31, 5, 111, + 47, 126, 44, 215, 151, 151, 252, 13, 57, 95, 189, 41, 17, 186, 99, 62, + 115, 206, 17, 152, 13, 225, 103, 156, 59, 67, 30, 74, 128, 126, 139, 250, + 62, 193, 145, 147, 173, 52, 99, 133, 112, 183, 9, 119, 11, 168, 15, 239, + 217, 6, 72, 8, 202, 9, 99, 210, 217, 168, 27, 95, 60, 23, 216, 176, + 202, 121, 43, 116, 51, 161, 133, 123, 129, 36, 75, 185, 79, 87, 134, 226, + 111, 169, 190, 163, 184, 81, 52, 223, 1, 160, 211, 8, 4, 142, 89, 13, + 49, 97, 166, 8, 124, 202, 216, 219, 203, 208, 55, 6, 243, 210, 151, 67, + 195, 226, 1, 186, 185, 229, 32, 128, 133, 37, 122, 116, 124, 240, 135, 193, + 174, 238, 186, 143, 154, 165, 38, 193, 170, 61, 64, 158, 205, 82, 32, 159, + 81, 204, 21, 242, 34, 115, 96, 56, 145, 173, 46, 230, 223, 111, 146, 7, + 204, 64, 19, 215, 73, 211, 104, 126, 232, 47, 81, 66, 67, 10, 21, 120, + 241, 137, 66, 180, 67, 117, 197, 172, 71, 211, 205, 156, 53, 1, 243, 29, + 242, 65, 203, 150, 247, 95, 125, 174, 75, 176, 11, 130, 127, 200, 107, 179, + 35, 94, 87, 102, 57, 138, 227, 159, 52, 67, 178, 203, 202, 161, 21, 185, + 26, 241, 51, 173, 108, 181, 117, 88, 52, 29, 228, 147, 137, 158, 167, 121, + 165, 25, 48, 227, 175, 137, 125, 201, 36, 44, 158, 206, 148, 173, 204, 163, + 102, 35, 107, 228, 75, 21, 27, 53, 151, 247, 66, 47, 37, 180, 238, 243, + 149, 29, 233, 200, 102, 61, 92, 100, 229, 229, 214, 243, 8, 135, 250, 126, + 101, 205, 27, 98, 233, 151, 233, 117, 184, 193, 170, 56, 159, 203, 86, 185, + 114, 44, 39, 246, 203, 156, 234, 12, 100, 179, 105, 12, 13, 18, 227, 248, + 235, 12, 107, 0, 195, 252, 141, 126, 24, 177, 139, 213, 118, 255, 178, 37, + 167, 224, 229, 35, 33, 194, 145, 236, 16, 37, 47, 171, 60, 67, 184, 44, + 23, 117, 2, 202, 48, 6, 237, 186, 57, 70, 79, 157, 122, 254, 2, 177, + 159, 24, 13, 120, 132, 140, 212, 170, 228, 79, 80, 121, 210, 177, 235, 158, + 92, 121, 246, 122, 71, 252, 113, 107, 160, 48, 237, 249, 223, 250, 124, 227, + 144, 82, 13, 21, 40, 236, 14, 118, 89, 250, 241, 238, 171, 73, 217, 129, + 99, 108, 164, 198, 5, 58, 60, 9, 121, 40, 204, 189, 181, 97, 101, 204, + 16, 81, 121, 74, 120, 116, 10, 199, 240, 65, 166, 161, 244, 45, 79, 12, + 79, 142, 221, 104, 225, 184, 24, 101, 194, 206, 215, 31, 165, 47, 101, 62, + 169, 219, 88, 128, 24, 113, 249, 213, 64, 4, 154, 129, 87, 118, 115, 77, + 51, 223, 73, 189, 78, 142, 156, 183, 202, 103, 156, 38, 176, 124, 47, 158, + 91, 78, 201, 46, 184, 26, 220, 178, 69, 117, 123, 115, 52, 191, 2, 67, + 15, 246, 123, 26, 75, 207, 85, 251, 202, 128, 186, 69, 194, 15, 55, 125, + 232, 148, 23, 178, 111, 244, 248, 152, 81, 139, 151, 192, 195, 193, 118, 13, + 95, 167, 236, 193, 183, 196, 215, 54, 47, 161, 125, 141, 179, 187, 166, 239, + 59, 194, 208, 55, 190, 137, 221, 13, 134, 156, 86, 67, 28, 145, 242, 22, + 42, 215, 208, 248, 233, 250, 43, 161, 66, 206, 10, 113, 4, 48, 251, 240, + 74, 175, 154, 100, 229, 241, 43, 249, 70, 19, 162, 92, 29, 81, 54, 17, + 6, 18, 168, 125, 241, 135, 191, 242, 225, 212, 77, 164, 34, 37, 30, 107, + 225, 92, 145, 197, 93, 91, 86, 156, 69, 178, 130, 130, 60, 243, 156, 212, + 120, 71, 213, 168, 124, 186, 240, 13, 220, 196, 83, 12, 75, 202, 167, 41, + 88, 249, 39, 95, 66, 101, 222, 141, 208, 102, 98, 81, 241, 236, 38, 26, + 59, 156, 25, 93, 195, 248, 126, 3, 147, 86, 213, 54, 84, 169, 196, 26, + 40, 143, 141, 72, 20, 51, 20, 239, 41, 151, 159, 50, 255, 142, 142, 178, + 138, 120, 87, 4, 51, 236, 204, 100, 46, 67, 222, 229, 250, 137, 53, 32, + 213, 155, 76, 214, 165, 92, 92, 171, 34, 224, 60, 71, 23, 160, 125, 225, + 105, 150, 187, 40, 102, 0, 255, 206, 240, 173, 95, 254, 90, 190, 211, 180, + 158, 51, 77, 95, 217, 236, 89, 225, 182, 48, 242, 198, 45, 149, 20, 13, + 154, 174, 0, 108, 86, 124, 188, 193, 49, 120, 146, 138, 32, 60, 32, 90, + 101, 166, 60, 18, 147, 147, 145, 91, 60, 20, 220, 21, 180, 161, 34, 255, + 107, 75, 226, 56, 119, 168, 38, 125, 186, 164, 63, 163, 133, 125, 159, 219, + 121, 95, 73, 30, 115, 36, 65, 157, 169, 41, 203, 107, 218, 82, 42, 28, + 20, 7, 251, 114, 159, 244, 46, 156, 135, 89, 85, 228, 228, 53, 104, 81, + 4, 96, 94, 52, 198, 169, 213, 58, 211, 229, 31, 86, 144, 235, 18, 99, + 136, 170, 164, 252, 84, 157, 252, 218, 42, 40, 247, 198, 116, 19, 36, 98, + 78, 101, 33, 239, 117, 114, 207, 162, 0, 156, 59, 13, 5, 140, 224, 34, + 104, 107, 69, 241, 172, 63, 179, 171, 254, 59, 197, 142, 91, 232, 115, 77, + 103, 1, 100, 9, 0, 125, 254, 244, 160, 133, 11, 83, 68, 12, 242, 55, + 7, 201, 165, 93, 205, 204, 85, 241, 202, 96, 122, 141, 44, 143, 186, 194, + 78, 44, 25, 34, 250, 22, 74, 40, 241, 205, 237, 52, 127, 150, 133, 233, + 85, 10, 206, 93, 217, 111, 183, 198, 116, 117, 62, 115, 129, 68, 232, 147, + 145, 167, 17, 99, 49, 253, 25, 146, 102, 163, 18, 220, 97, 101, 165, 222, + 178, 241, 25, 67, 191, 235, 26, 14, 17, 18, 142, 116, 99, 76, 185, 79, + 179, 58, 154, 207, 171, 213, 147, 220, 169, 43, 10, 214, 48, 80, 58, 63, + 253, 115, 72, 148, 175, 67, 143, 12, 101, 150, 67, 228, 106, 193, 241, 247, + 151, 128, 162, 193, 152, 32, 119, 235, 238, 17, 178, 43, 206, 80, 26, 70, + 11, 141, 100, 151, 58, 235, 1, 24, 34, 227, 226, 8, 126, 228, 15, 181, + 223, 65, 169, 232, 46, 82, 94, 161, 122, 200, 180, 246, 137, 232, 143, 44, + 176, 130, 230, 198, 231, 82, 69, 150, 49, 73, 246, 5, 177, 40, 155, 78, + 71, 25, 87, 246, 124, 118, 114, 217, 231, 12, 6, 148, 110, 240, 136, 178, + 73, 27, 166, 225, 224, 79, 236, 62, 128, 32, 38, 155, 255, 116, 140, 139, + 132, 200, 28, 255, 28, 233, 129, 183, 90, 248, 128, 108, 24, 45, 204, 158, + 128, 58, 174, 93, 207, 193, 170, 160, 40, 117, 243, 180, 220, 134, 108, 10, + 159, 0, 204, 179, 236, 169, 233, 213, 39, 39, 20, 135, 49, 20, 78, 23, + 81, 254, 158, 188, 124, 104, 213, 90, 200, 44, 149, 70, 95, 242, 220, 231, + 85, 48, 113, 21, 11, 27, 168, 59, 16, 91, 71, 46, 58, 92, 78, 98, + 84, 232, 50, 78, 191, 57, 130, 232, 215, 153, 232, 247, 98, 230, 69, 46, + 250, 112, 97, 49, 149, 227, 3, 186, 5, 101, 60, 165, 179, 59, 159, 54, + 142, 211, 203, 15, 242, 93, 135, 193, 95, 20, 184, 71, 88, 47, 214, 126, + 234, 204, 165, 0, 162, 15, 21, 81, 174, 150, 159, 60, 123, 195, 1, 102, + 101, 249, 242, 3, 147, 86, 156, 160, 235, 87, 171, 44, 7, 86, 236, 199, + 76, 23, 202, 183, 40, 75, 238, 2, 183, 216, 204, 143, 58, 127, 129, 179, + 170, 216, 109, 52, 252, 230, 212, 23, 226, 219, 159, 91, 139, 41, 11, 139, + 117, 51, 213, 67, 153, 47, 12, 131, 201, 48, 60, 45, 170, 27, 233, 84, + 146, 58, 145, 178, 204, 236, 32, 114, 52, 119, 169, 90, 165, 111, 117, 73, + 189, 87, 238, 62, 8, 53, 11, 59, 197, 169, 73, 174, 111, 179, 122, 214, + 109, 101, 26, 61, 229, 103, 252, 28, 8, 185, 175, 159, 100, 196, 117, 40, + 122, 248, 71, 92, 52, 161, 231, 55, 175, 216, 181, 81, 135, 237, 131, 229, + 23, 217, 242, 69, 102, 29, 102, 223, 213, 98, 133, 19, 35, 174, 29, 75, + 175, 182, 186, 101, 28, 209, 155, 180, 225, 238, 25, 52, 251, 117, 129, 126, + 178, 207, 5, 29, 216, 223, 146, 113, 92, 189, 146, 253, 126, 188, 62, 157, + 127, 3, 4, 132, 188, 218, 94, 225, 146, 141, 225, 62, 167, 49, 224, 92, + 56, 77, 208, 194, 188, 251, 6, 150, 91, 193, 198, 172, 222, 135, 191, 138, + 11, 19, 214, 87, 46, 247, 13, 209, 15, 242, 111, 203, 176, 5, 151, 196, + 112, 157, 249, 196, 64, 251, 83, 62, 78, 86, 38, 184, 239, 6, 44, 63, + 114, 63, 194, 71, 245, 148, 97, 183, 6, 112, 48, 210, 139, 249, 110, 171, + 42, 218, 94, 189, 159, 152, 172, 112, 190, 78, 99, 158, 55, 102, 230, 89, + 197, 161, 194, 238, 59, 82, 103, 41, 8, 165, 93, 205, 238, 9, 1, 119, + 189, 42, 204, 132, 181, 133, 185, 115, 177, 201, 18, 4, 53, 221, 71, 3, + 205, 76, 102, 155, 159, 238, 134, 123, 35, 65, 93, 24, 99, 202, 116, 111, + 131, 190, 203, 121, 47, 138, 115, 222, 55, 252, 214, 138, 225, 34, 221, 176, + 210, 252, 99, 13, 140, 184, 186, 117, 101, 75, 31, 70, 191, 146, 211, 0, + 70, 127, 211, 121, 94, 98, 164, 223, 232, 42, 75, 54, 17, 111, 154, 208, + 162, 105, 16, 139, 10, 142, 201, 252, 86, 152, 29, 226, 117, 24, 93, 4, + 71, 47, 5, 17, 209, 176, 141, 199, 158, 75, 104, 7, 121, 109, 159, 0, + 107, 86, 177, 174, 185, 203, 71, 164, 212, 113, 223, 184, 211, 186, 60, 148, + 132, 167, 184, 88, 127, 171, 240, 217, 177, 150, 168, 238, 162, 35, 12, 57, + 175, 55, 97, 76, 211, 161, 234, 124, 94, 172, 202, 61, 225, 65, 235, 173, + 38, 228, 148, 211, 186, 56, 238, 173, 208, 253, 242, 221, 242, 187, 229, 48, + 114, 217, 7, 242, 136, 113, 112, 186, 184, 149, 194, 59, 152, 134, 46, 177, + 160, 109, 75, 218, 100, 54, 25, 65, 9, 205, 3, 246, 162, 209, 209, 253, + 46, 42, 129, 160, 191, 89, 222, 20, 239, 173, 95, 62, 29, 84, 29, 21, + 231, 122, 9, 233, 255, 180, 46, 212, 76, 132, 229, 242, 38, 6, 31, 212, + 103, 212, 198, 180, 202, 162, 233, 148, 120, 147, 229, 235, 147, 172, 93, 158, + 51, 9, 223, 129, 44, 67, 52, 163, 91, 186, 136, 72, 117, 245, 77, 189, + 228, 67, 92, 72, 102, 209, 150, 111, 174, 230, 74, 237, 114, 235, 207, 155, + 125, 157, 33, 223, 84, 122, 87, 220, 114, 243, 83, 103, 114, 202, 109, 66, + 60, 215, 190, 36, 19, 97, 222, 89, 183, 215, 161, 32, 60, 95, 134, 31, + 184, 55, 215, 206, 23, 184, 15, 248, 49, 211, 97, 18, 202, 47, 73, 55, + 96, 161, 247, 61, 211, 189, 233, 238, 50, 20, 183, 168, 212, 136, 217, 181, + 83, 208, 42, 243, 9, 225, 11, 157, 74, 87, 251, 105, 86, 187, 172, 89, + 119, 196, 197, 26, 226, 223, 175, 207, 119, 20, 61, 83, 237, 68, 228, 123, + 76, 188, 142, 50, 161, 27, 217, 225, 98, 50, 146, 111, 198, 135, 96, 31, + 148, 91, 150, 195, 162, 46, 130, 109, 45, 6, 75, 37, 1, 59, 130, 208, + 78, 217, 143, 252, 133, 6, 86, 47, 27, 225, 250, 11, 193, 162, 70, 135, + 76, 241, 230, 205, 46, 185, 71, 41, 168, 126, 50, 247, 137, 123, 153, 171, + 64, 248, 218, 190, 17, 151, 131, 56, 31, 108, 174, 173, 158, 226, 56, 201, + 191, 112, 96, 45, 173, 115, 144, 249, 83, 223, 53, 192, 32, 43, 184, 45, + 197, 27, 19, 241, 58, 254, 194, 160, 103, 40, 27, 87, 95, 90, 9, 209, + 247, 135, 106, 158, 174, 115, 134, 225, 161, 245, 1, 20, 241, 215, 4, 102, + 165, 103, 136, 23, 171, 42, 48, 214, 40, 132, 130, 63, 251, 85, 101, 193, + 246, 11, 62, 76, 176, 102, 98, 18, 6, 46, 95, 182, 223, 212, 16, 1, + 126, 106, 229, 243, 30, 55, 62, 100, 187, 111, 120, 85, 64, 78, 84, 104, + 49, 78, 204, 90, 152, 17, 253, 194, 166, 205, 250, 222, 156, 152, 243, 66, + 133, 148, 149, 84, 165, 206, 123, 160, 240, 221, 87, 21, 63, 4, 40, 102, + 88, 172, 148, 20, 114, 96, 215, 242, 37, 223, 228, 139, 33, 195, 215, 60, + 159, 207, 66, 182, 77, 94, 2, 63, 48, 145, 156, 111, 76, 115, 141, 4, + 5, 63, 177, 241, 45, 247, 98, 120, 11, 8, 29, 133, 228, 177, 23, 195, + 152, 151, 26, 214, 253, 46, 193, 205, 42, 169, 55, 54, 52, 26, 78, 158, + 122, 30, 158, 150, 240, 61, 158, 99, 90, 23, 65, 215, 175, 82, 89, 174, + 13, 151, 87, 26, 51, 188, 82, 94, 198, 85, 105, 190, 52, 144, 151, 125, + 95, 148, 105, 32, 246, 178, 92, 121, 107, 226, 134, 3, 73, 241, 120, 124, + 232, 209, 229, 66, 118, 20, 90, 41, 238, 115, 20, 248, 56, 45, 241, 134, + 30, 187, 248, 140, 187, 147, 233, 154, 213, 184, 129, 144, 243, 218, 3, 134, + 49, 220, 30, 169, 175, 139, 113, 202, 18, 53, 145, 233, 76, 14, 36, 150, + 170, 141, 234, 251, 148, 62, 223, 159, 4, 4, 168, 88, 146, 229, 95, 223, + 109, 70, 61, 172, 89, 236, 81, 161, 185, 40, 52, 61, 165, 173, 71, 154, + 69, 155, 64, 16, 194, 29, 251, 116, 209, 92, 180, 251, 81, 164, 105, 29, + 250, 39, 158, 112, 115, 196, 11, 27, 1, 148, 163, 27, 150, 96, 115, 198, + 112, 51, 72, 223, 11, 10, 145, 85, 82, 162, 143, 44, 65, 80, 71, 98, + 111, 66, 32, 243, 57, 77, 87, 254, 144, 32, 112, 83, 173, 11, 178, 247, + 85, 246, 101, 58, 69, 182, 240, 219, 53, 16, 40, 238, 135, 252, 211, 205, + 184, 58, 99, 5, 230, 195, 24, 222, 4, 51, 64, 55, 69, 146, 21, 188, + 230, 89, 49, 54, 65, 174, 224, 233, 88, 23, 33, 40, 189, 44, 196, 176, + 62, 113, 195, 159, 33, 125, 149, 173, 85, 232, 1, 65, 139, 214, 254, 53, + 181, 254, 156, 253, 135, 166, 211, 170, 179, 162, 24, 245, 107, 12, 179, 125, + 80, 55, 25, 132, 40, 211, 44, 58, 40, 41, 92, 86, 113, 162, 237, 221, + 13, 73, 193, 210, 112, 120, 43, 69, 223, 151, 24, 222, 29, 201, 253, 82, + 124, 249, 164, 101, 144, 116, 201, 235, 99, 164, 153, 19, 162, 112, 69, 24, + 160, 124, 245, 236, 101, 54, 158, 112, 104, 107, 77, 214, 56, 245, 109, 189, + 129, 105, 71, 30, 135, 222, 199, 97, 159, 196, 21, 178, 252, 92, 215, 154, + 45, 104, 251, 169, 106, 228, 21, 66, 55, 195, 249, 51, 205, 61, 219, 67, + 137, 115, 95, 3, 19, 253, 29, 212, 48, 234, 91, 242, 155, 13, 133, 118, + 71, 112, 21, 91, 84, 167, 17, 198, 116, 200, 120, 226, 40, 243, 235, 187, + 143, 76, 213, 75, 240, 153, 236, 72, 137, 137, 55, 138, 117, 144, 62, 253, + 67, 21, 159, 215, 7, 171, 174, 231, 66, 218, 226, 114, 190, 190, 54, 39, + 187, 49, 172, 111, 215, 136, 200, 79, 137, 49, 118, 216, 249, 4, 83, 154, + 130, 182, 147, 227, 146, 157, 209, 34, 249, 206, 30, 99, 18, 184, 78, 115, + 94, 20, 95, 219, 240, 128, 23, 110, 25, 36, 210, 242, 237, 235, 198, 13, + 62, 241, 220, 248, 146, 54, 205, 80, 156, 91, 206, 146, 50, 82, 152, 32, + 84, 184, 202, 97, 227, 182, 142, 133, 19, 108, 37, 179, 190, 224, 12, 135, + 43, 140, 164, 101, 211, 241, 156, 136, 19, 212, 170, 138, 62, 78, 150, 79, + 116, 55, 224, 166, 36, 81, 95, 124, 1, 53, 101, 251, 177, 112, 5, 153, + 160, 143, 93, 88, 69, 91, 42, 73, 201, 119, 141, 130, 26, 217, 30, 97, + 174, 67, 121, 85, 68, 91, 5, 23, 76, 22, 136, 58, 92, 194, 34, 78, + 174, 169, 90, 167, 208, 30, 138, 195, 172, 175, 91, 253, 197, 183, 85, 4, + 95, 178, 139, 203, 159, 175, 161, 58, 55, 233, 248, 217, 221, 31, 213, 241, + 252, 58, 8, 24, 87, 33, 219, 9, 155, 42, 59, 199, 132, 79, 210, 9, + 40, 69, 234, 158, 2, 163, 124, 187, 93, 219, 220, 94, 121, 43, 169, 109, + 215, 154, 140, 31, 35, 207, 160, 106, 191, 84, 249, 115, 219, 47, 91, 157, + 182, 114, 143, 18, 83, 243, 83, 238, 144, 191, 235, 36, 51, 46, 156, 199, + 28, 188, 148, 202, 241, 124, 116, 100, 243, 14, 185, 29, 214, 176, 125, 133, + 229, 64, 219, 5, 247, 19, 94, 181, 92, 247, 89, 212, 154, 40, 229, 5, + 210, 33, 186, 230, 101, 94, 47, 167, 7, 24, 147, 164, 214, 163, 33, 72, + 130, 43, 41, 191, 46, 200, 45, 101, 218, 79, 235, 57, 46, 80, 187, 243, + 184, 106, 167, 228, 53, 27, 236, 114, 77, 177, 174, 220, 45, 51, 100, 188, + 97, 188, 55, 214, 25, 228, 171, 153, 27, 8, 116, 209, 190, 202, 213, 81, + 132, 149, 248, 73, 74, 72, 245, 69, 244, 49, 49, 35, 24, 245, 25, 81, + 175, 15, 198, 80, 110, 245, 162, 36, 245, 50, 246, 40, 18, 152, 125, 247, + 106, 124, 52, 229, 225, 20, 73, 141, 126, 9, 161, 194, 97, 235, 7, 73, + 232, 46, 27, 177, 60, 173, 99, 135, 87, 188, 168, 105, 91, 192, 173, 176, + 64, 51, 9, 47, 172, 45, 176, 67, 203, 130, 67, 216, 99, 205, 32, 172, + 96, 162, 176, 130, 144, 74, 113, 65, 157, 62, 184, 29, 22, 18, 46, 140, + 185, 161, 231, 125, 170, 162, 41, 200, 127, 134, 12, 114, 100, 217, 77, 79, + 100, 80, 84, 48, 15, 157, 78, 249, 201, 223, 42, 158, 143, 26, 35, 81, + 63, 239, 56, 60, 55, 69, 209, 29, 111, 224, 208, 91, 38, 180, 61, 219, + 171, 168, 210, 243, 81, 65, 138, 127, 57, 81, 131, 45, 38, 164, 243, 116, + 179, 164, 162, 44, 188, 2, 161, 174, 233, 185, 77, 252, 219, 19, 31, 97, + 225, 210, 92, 164, 3, 119, 121, 2, 118, 251, 244, 37, 103, 223, 202, 129, + 110, 82, 236, 9, 242, 101, 84, 43, 169, 217, 187, 95, 132, 172, 167, 218, + 191, 143, 237, 199, 137, 129, 159, 80, 0, 207, 53, 200, 120, 177, 178, 252, + 86, 189, 221, 94, 7, 7, 198, 39, 62, 71, 124, 251, 149, 52, 7, 97, + 93, 253, 102, 131, 84, 148, 225, 222, 167, 11, 177, 126, 243, 114, 175, 209, + 24, 65, 85, 137, 25, 190, 132, 220, 243, 190, 15, 112, 170, 40, 43, 111, + 15, 150, 186, 126, 123, 133, 77, 249, 220, 94, 174, 40, 252, 169, 103, 182, + 145, 161, 45, 251, 156, 218, 92, 102, 74, 119, 223, 70, 171, 45, 50, 224, + 62, 93, 246, 74, 127, 206, 44, 178, 79, 238, 119, 32, 127, 11, 98, 243, + 234, 23, 154, 115, 100, 30, 66, 40, 198, 119, 215, 87, 68, 88, 221, 42, + 147, 250, 23, 222, 127, 2, 60, 35, 53, 153, 47, 175, 62, 43, 63, 157, + 195, 79, 130, 75, 182, 211, 29, 111, 3, 210, 84, 90, 44, 172, 158, 148, + 57, 108, 10, 236, 25, 173, 109, 134, 132, 9, 173, 42, 146, 47, 176, 15, + 189, 122, 155, 229, 234, 49, 82, 152, 132, 89, 144, 187, 81, 236, 233, 195, + 19, 42, 89, 150, 205, 116, 231, 16, 206, 243, 235, 81, 252, 35, 59, 152, + 51, 28, 218, 136, 112, 41, 179, 85, 6, 217, 243, 170, 203, 92, 226, 133, + 234, 245, 178, 235, 216, 53, 114, 240, 100, 164, 223, 21, 124, 227, 28, 154, + 24, 97, 231, 112, 169, 206, 22, 49, 97, 115, 159, 16, 184, 237, 35, 179, + 135, 221, 33, 2, 22, 199, 233, 20, 97, 158, 175, 122, 193, 173, 192, 152, + 197, 6, 37, 254, 50, 184, 8, 245, 124, 193, 139, 202, 4, 39, 127, 221, + 67, 170, 178, 207, 209, 48, 242, 120, 74, 99, 207, 140, 163, 133, 94, 46, + 100, 204, 154, 49, 196, 199, 203, 80, 244, 23, 203, 47, 252, 18, 48, 159, + 80, 93, 184, 44, 77, 41, 24, 17, 174, 117, 178, 97, 187, 93, 25, 53, + 207, 195, 164, 181, 190, 182, 220, 126, 199, 35, 52, 33, 195, 239, 115, 30, + 138, 60, 175, 60, 93, 87, 71, 251, 3, 245, 122, 189, 232, 212, 201, 3, + 110, 44, 249, 245, 195, 211, 48, 88, 87, 1, 75, 164, 199, 232, 89, 213, + 234, 128, 211, 174, 136, 88, 254, 241, 61, 14, 102, 190, 85, 38, 210, 48, + 190, 189, 164, 26, 80, 108, 82, 94, 140, 207, 67, 125, 103, 158, 243, 119, + 232, 183, 80, 251, 179, 39, 12, 3, 12, 163, 68, 223, 45, 192, 224, 37, + 50, 141, 165, 131, 230, 113, 206, 33, 195, 186, 59, 63, 181, 77, 140, 51, + 118, 6, 133, 80, 249, 130, 57, 121, 255, 75, 85, 138, 6, 125, 3, 192, + 98, 152, 173, 60, 102, 219, 254, 28, 249, 239, 206, 44, 120, 6, 110, 223, + 195, 123, 138, 243, 181, 11, 229, 162, 143, 157, 6, 124, 137, 209, 168, 201, + 251, 220, 79, 227, 170, 169, 239, 128, 44, 119, 252, 132, 229, 172, 176, 118, + 130, 234, 34, 230, 253, 60, 174, 138, 130, 178, 31, 2, 43, 108, 143, 90, + 157, 123, 124, 81, 196, 125, 38, 14, 30, 196, 193, 14, 52, 170, 29, 116, + 141, 49, 181, 70, 91, 236, 59, 129, 7, 170, 39, 183, 2, 57, 24, 233, + 57, 90, 93, 134, 172, 97, 29, 190, 120, 56, 76, 120, 101, 18, 161, 203, + 179, 237, 194, 250, 62, 82, 15, 169, 30, 40, 163, 107, 18, 47, 198, 44, + 211, 16, 43, 104, 252, 105, 14, 140, 78, 7, 190, 94, 196, 245, 199, 211, + 168, 27, 133, 17, 141, 86, 103, 229, 249, 164, 124, 13, 165, 39, 132, 183, + 59, 105, 224, 52, 112, 119, 63, 71, 113, 134, 192, 194, 119, 222, 132, 107, + 206, 36, 13, 16, 11, 36, 245, 216, 45, 57, 50, 91, 210, 4, 239, 66, + 26, 242, 2, 227, 212, 242, 44, 1, 62, 34, 206, 156, 140, 227, 213, 242, + 137, 16, 20, 94, 93, 165, 60, 242, 189, 199, 235, 3, 120, 131, 118, 138, + 217, 212, 195, 77, 86, 126, 223, 142, 43, 169, 184, 106, 230, 200, 43, 248, + 20, 238, 100, 111, 252, 148, 153, 176, 43, 66, 47, 14, 51, 185, 44, 248, + 149, 13, 33, 153, 208, 191, 51, 89, 102, 152, 103, 50, 132, 12, 8, 237, + 126, 91, 210, 78, 210, 52, 35, 5, 62, 3, 184, 225, 227, 206, 178, 114, + 200, 208, 86, 57, 24, 3, 33, 78, 40, 218, 98, 249, 237, 50, 253, 211, + 28, 253, 174, 64, 111, 77, 225, 1, 57, 206, 31, 23, 112, 242, 83, 29, + 248, 47, 153, 31, 2, 243, 209, 224, 251, 19, 47, 246, 56, 255, 248, 216, + 238, 31, 134, 171, 117, 208, 224, 15, 134, 69, 3, 173, 244, 28, 191, 15, + 24, 46, 10, 154, 41, 17, 230, 234, 154, 197, 68, 226, 39, 3, 25, 70, + 199, 83, 38, 8, 47, 128, 3, 167, 171, 41, 252, 253, 180, 65, 2, 63, + 54, 167, 167, 26, 93, 39, 218, 114, 174, 159, 199, 153, 27, 95, 90, 236, + 13, 138, 252, 44, 131, 78, 23, 195, 55, 182, 110, 56, 45, 138, 120, 158, + 237, 167, 78, 142, 190, 137, 235, 94, 206, 4, 107, 103, 158, 158, 179, 26, + 197, 47, 159, 166, 41, 184, 219, 66, 66, 247, 123, 115, 1, 101, 142, 240, + 65, 119, 27, 152, 44, 3, 203, 250, 75, 126, 154, 104, 151, 122, 99, 142, + 92, 177, 106, 229, 6, 250, 205, 234, 52, 79, 113, 235, 211, 243, 99, 67, + 125, 183, 223, 223, 75, 167, 231, 134, 22, 76, 53, 131, 113, 230, 35, 212, + 51, 126, 223, 132, 52, 138, 240, 81, 226, 32, 207, 189, 222, 176, 29, 62, + 86, 149, 236, 52, 251, 66, 123, 38, 166, 207, 52, 72, 2, 191, 210, 171, + 202, 62, 147, 199, 236, 191, 218, 0, 59, 232, 122, 84, 144, 26, 125, 102, + 106, 128, 77, 208, 144, 29, 65, 25, 149, 178, 245, 164, 160, 2, 30, 69, + 156, 163, 0, 22, 188, 186, 226, 56, 217, 225, 159, 37, 173, 66, 16, 94, + 100, 253, 217, 44, 199, 238, 148, 219, 218, 54, 23, 109, 83, 156, 24, 237, + 207, 228, 20, 24, 239, 164, 198, 197, 164, 68, 61, 64, 87, 110, 56, 79, + 13, 17, 30, 6, 15, 160, 127, 41, 211, 111, 219, 17, 171, 255, 248, 164, + 11, 50, 62, 165, 226, 211, 239, 222, 157, 229, 157, 155, 61, 4, 175, 249, + 0, 53, 100, 222, 11, 140, 20, 226, 246, 224, 145, 9, 243, 209, 114, 130, + 14, 217, 133, 176, 223, 144, 48, 59, 62, 52, 53, 37, 96, 156, 47, 206, + 137, 190, 68, 150, 203, 47, 221, 37, 233, 241, 108, 113, 64, 147, 179, 7, + 203, 157, 192, 85, 229, 203, 61, 29, 190, 186, 159, 67, 243, 29, 176, 175, + 180, 220, 144, 167, 100, 110, 187, 254, 58, 39, 165, 124, 138, 165, 124, 163, + 104, 103, 12, 116, 119, 212, 87, 127, 10, 71, 231, 191, 144, 22, 194, 184, + 195, 113, 33, 246, 213, 48, 36, 202, 113, 233, 190, 28, 189, 21, 232, 175, + 55, 71, 243, 33, 82, 191, 209, 151, 172, 175, 207, 34, 48, 144, 242, 75, + 235, 80, 64, 105, 99, 245, 128, 212, 188, 82, 243, 57, 140, 192, 70, 73, + 43, 172, 248, 167, 81, 250, 30, 73, 119, 156, 124, 207, 232, 105, 82, 151, + 119, 194, 65, 138, 116, 225, 225, 91, 155, 255, 18, 84, 84, 126, 249, 241, + 27, 213, 120, 205, 46, 232, 25, 197, 72, 12, 30, 94, 0, 23, 4, 237, + 222, 51, 116, 31, 11, 26, 5, 114, 103, 160, 175, 115, 192, 209, 110, 114, + 182, 210, 226, 231, 82, 227, 242, 134, 254, 190, 109, 220, 200, 211, 247, 97, + 176, 92, 128, 126, 20, 212, 238, 113, 30, 15, 88, 218, 169, 136, 2, 50, + 243, 137, 175, 198, 55, 109, 114, 168, 32, 17, 129, 93, 207, 51, 75, 184, + 210, 17, 135, 240, 187, 68, 37, 220, 154, 205, 55, 60, 79, 249, 39, 210, + 84, 233, 232, 91, 27, 196, 165, 100, 126, 138, 81, 158, 152, 202, 231, 45, + 166, 234, 249, 170, 238, 175, 176, 220, 202, 88, 22, 170, 202, 75, 108, 16, + 240, 238, 36, 190, 142, 87, 82, 155, 162, 10, 73, 204, 62, 19, 235, 154, + 219, 104, 241, 74, 73, 97, 41, 41, 118, 103, 120, 68, 186, 5, 175, 173, + 248, 5, 76, 223, 193, 133, 83, 69, 137, 169, 196, 139, 189, 229, 171, 191, + 45, 30, 205, 175, 240, 203, 100, 160, 238, 167, 72, 173, 175, 146, 219, 65, + 205, 216, 23, 196, 191, 154, 42, 238, 241, 60, 14, 42, 210, 183, 207, 172, + 146, 233, 122, 66, 87, 220, 11, 60, 128, 27, 194, 164, 90, 78, 0, 94, + 248, 90, 67, 128, 211, 44, 5, 41, 123, 49, 134, 233, 116, 62, 60, 129, + 117, 124, 78, 85, 69, 155, 198, 11, 141, 65, 21, 103, 206, 196, 220, 95, + 134, 189, 18, 120, 61, 37, 5, 98, 28, 53, 157, 252, 121, 173, 31, 31, + 225, 31, 125, 44, 224, 40, 243, 240, 208, 111, 239, 48, 224, 190, 171, 125, + 170, 148, 206, 29, 21, 122, 196, 191, 31, 138, 40, 52, 191, 242, 226, 61, + 137, 224, 253, 96, 207, 241, 171, 167, 52, 51, 124, 114, 129, 170, 162, 241, + 62, 208, 201, 5, 129, 135, 204, 98, 95, 126, 205, 99, 169, 134, 179, 120, + 68, 99, 17, 162, 210, 34, 137, 117, 203, 52, 231, 19, 214, 85, 18, 216, + 37, 236, 94, 161, 144, 80, 106, 99, 104, 163, 207, 9, 174, 54, 63, 194, + 139, 226, 222, 247, 214, 207, 23, 106, 227, 236, 22, 21, 24, 78, 62, 248, + 3, 63, 171, 255, 10, 198, 113, 198, 210, 80, 135, 245, 43, 188, 195, 52, + 56, 85, 243, 116, 28, 11, 93, 137, 152, 189, 172, 82, 240, 191, 8, 60, + 161, 56, 230, 109, 68, 141, 103, 57, 160, 42, 242, 117, 169, 40, 191, 26, + 81, 32, 57, 130, 206, 32, 224, 176, 22, 63, 106, 222, 28, 157, 143, 44, + 122, 8, 74, 138, 146, 230, 11, 192, 206, 4, 170, 104, 239, 62, 213, 87, + 182, 169, 177, 147, 207, 68, 155, 121, 243, 253, 76, 0, 156, 49, 110, 165, + 90, 84, 248, 132, 66, 222, 110, 108, 197, 72, 234, 21, 52, 175, 101, 223, + 169, 146, 211, 152, 11, 3, 113, 117, 73, 234, 110, 92, 76, 67, 239, 36, + 57, 124, 94, 187, 75, 136, 26, 119, 162, 12, 172, 197, 167, 6, 189, 253, + 60, 137, 102, 167, 172, 44, 86, 40, 95, 157, 108, 67, 177, 31, 221, 215, + 87, 69, 145, 135, 206, 168, 207, 139, 83, 103, 103, 255, 126, 8, 74, 60, + 110, 213, 190, 120, 160, 228, 148, 36, 168, 144, 210, 78, 115, 184, 94, 147, + 133, 165, 88, 137, 104, 173, 92, 182, 72, 239, 90, 87, 180, 236, 148, 237, + 97, 12, 26, 225, 136, 250, 148, 23, 218, 63, 64, 162, 68, 5, 162, 225, + 215, 45, 69, 183, 203, 187, 221, 48, 114, 236, 171, 225, 101, 97, 120, 83, + 13, 163, 223, 93, 217, 45, 68, 227, 7, 213, 236, 130, 86, 149, 28, 88, + 224, 35, 21, 134, 119, 131, 215, 125, 164, 33, 157, 15, 189, 20, 121, 24, + 53, 228, 207, 27, 101, 94, 24, 248, 110, 122, 125, 102, 84, 177, 164, 166, + 34, 68, 170, 187, 97, 170, 139, 88, 15, 226, 251, 47, 195, 101, 47, 99, + 235, 193, 42, 93, 201, 250, 40, 153, 107, 32, 180, 19, 158, 47, 154, 210, + 30, 245, 27, 242, 14, 205, 131, 110, 85, 168, 34, 133, 113, 136, 221, 53, + 23, 57, 110, 4, 76, 223, 251, 194, 171, 41, 241, 132, 154, 232, 23, 47, + 109, 82, 66, 92, 58, 121, 248, 232, 156, 216, 30, 9, 89, 202, 162, 208, + 191, 207, 66, 255, 248, 34, 23, 83, 214, 100, 141, 242, 149, 136, 179, 106, + 89, 166, 99, 165, 35, 53, 185, 172, 226, 72, 94, 158, 185, 12, 162, 117, + 211, 236, 133, 145, 178, 87, 118, 222, 232, 101, 49, 232, 134, 222, 78, 133, + 30, 254, 14, 107, 78, 55, 205, 96, 108, 209, 5, 66, 208, 60, 55, 190, + 245, 111, 243, 139, 254, 84, 7, 91, 118, 65, 198, 95, 98, 216, 50, 78, + 233, 183, 191, 66, 224, 44, 253, 209, 139, 161, 183, 164, 243, 32, 253, 65, + 39, 142, 241, 195, 30, 2, 75, 215, 144, 141, 214, 45, 252, 249, 0, 23, + 88, 90, 126, 19, 175, 88, 243, 138, 241, 116, 233, 224, 73, 4, 40, 136, + 58, 214, 115, 211, 176, 16, 197, 74, 163, 141, 229, 204, 205, 253, 69, 118, + 187, 69, 93, 82, 103, 212, 40, 155, 49, 37, 128, 150, 216, 252, 83, 87, + 161, 208, 201, 225, 183, 172, 72, 76, 175, 132, 160, 115, 84, 171, 49, 178, + 97, 25, 248, 95, 70, 172, 41, 122, 8, 107, 177, 248, 201, 59, 115, 175, + 39, 252, 32, 233, 2, 185, 79, 4, 194, 254, 180, 180, 87, 6, 17, 200, + 215, 73, 51, 60, 111, 0, 46, 70, 143, 170, 62, 63, 24, 38, 198, 223, + 79, 102, 48, 218, 237, 20, 211, 39, 229, 125, 22, 195, 240, 15, 152, 60, + 152, 67, 220, 156, 194, 60, 128, 16, 178, 57, 145, 179, 116, 11, 84, 68, + 28, 60, 3, 92, 228, 179, 83, 197, 93, 242, 171, 94, 128, 127, 248, 32, + 56, 111, 47, 19, 136, 249, 182, 165, 168, 53, 30, 48, 40, 4, 16, 75, + 192, 223, 15, 20, 179, 180, 48, 46, 1, 144, 32, 197, 19, 255, 220, 78, + 38, 109, 215, 211, 45, 25, 163, 67, 81, 252, 231, 191, 128, 255, 242, 79, + 96, 252, 126, 254, 125, 87, 251, 47, 255, 229, 255, 110, 191, 187, 94, 255, + 152, 150, 113, 26, 215, 60, 251, 99, 27, 255, 184, 199, 253, 143, 228, 254, + 127, 81, 239, 127, 216, 39, 223, 214, 180, 218, 251, 41, 95, 186, 252, 175, + 251, 154, 47, 235, 95, 203, 37, 191, 211, 191, 22, 11, 248, 255, 97, 239, + 156, 253, 243, 95, 138, 250, 219, 222, 57, 229, 127, 97, 73, 122, 47, 24, + 146, 251, 183, 189, 115, 4, 63, 30, 232, 123, 212, 158, 207, 198, 81, 212, + 189, 35, 11, 58, 7, 186, 47, 231, 165, 230, 92, 192, 34, 117, 218, 239, + 148, 235, 224, 231, 103, 199, 205, 39, 151, 227, 152, 155, 45, 207, 53, 86, + 236, 240, 101, 143, 149, 41, 235, 77, 73, 159, 67, 182, 124, 182, 176, 155, + 79, 6, 198, 188, 191, 199, 94, 211, 206, 115, 156, 198, 48, 64, 58, 205, + 64, 22, 2, 237, 249, 109, 133, 187, 12, 248, 124, 141, 228, 128, 179, 47, + 227, 185, 54, 239, 58, 136, 19, 194, 186, 230, 187, 77, 13, 239, 201, 1, + 105, 181, 144, 143, 177, 146, 161, 15, 251, 66, 220, 47, 67, 102, 51, 228, + 104, 61, 128, 0, 197, 101, 150, 26, 217, 143, 116, 152, 114, 51, 31, 128, + 62, 67, 121, 57, 236, 226, 48, 236, 222, 57, 110, 209, 9, 221, 209, 8, + 218, 29, 238, 214, 240, 97, 249, 34, 100, 140, 236, 99, 204, 229, 85, 200, + 18, 168, 243, 128, 219, 145, 224, 235, 142, 223, 97, 241, 9, 196, 74, 152, + 203, 4, 241, 173, 200, 171, 243, 16, 150, 229, 160, 5, 119, 24, 80, 142, + 123, 5, 247, 51, 53, 140, 250, 35, 183, 17, 156, 215, 81, 23, 103, 65, + 139, 68, 62, 52, 12, 200, 62, 4, 151, 38, 76, 167, 26, 204, 219, 18, + 12, 155, 98, 20, 11, 206, 84, 211, 44, 111, 45, 118, 11, 89, 176, 179, + 105, 96, 143, 41, 178, 219, 137, 159, 231, 111, 93, 241, 237, 87, 131, 238, + 224, 254, 100, 134, 115, 172, 75, 182, 255, 20, 97, 89, 250, 166, 158, 100, + 179, 8, 163, 183, 225, 215, 81, 185, 23, 37, 56, 192, 137, 189, 239, 159, + 155, 211, 75, 4, 199, 116, 200, 197, 109, 216, 189, 108, 143, 189, 37, 31, + 218, 95, 45, 216, 27, 238, 131, 221, 14, 115, 179, 14, 227, 100, 112, 94, + 216, 183, 182, 88, 219, 79, 208, 183, 149, 255, 77, 50, 94, 142, 24, 34, + 150, 147, 163, 118, 18, 157, 84, 33, 176, 36, 28, 98, 6, 236, 134, 187, + 144, 85, 219, 206, 21, 152, 141, 4, 27, 181, 114, 96, 96, 114, 125, 64, + 225, 68, 128, 160, 120, 182, 163, 191, 214, 175, 63, 169, 74, 119, 168, 130, + 182, 38, 7, 61, 225, 116, 220, 205, 115, 219, 76, 187, 85, 97, 117, 94, + 4, 64, 157, 15, 57, 154, 251, 8, 154, 34, 94, 21, 240, 254, 148, 244, + 178, 18, 117, 200, 25, 195, 251, 16, 113, 26, 228, 66, 213, 226, 64, 175, + 226, 127, 58, 203, 160, 177, 216, 160, 215, 69, 190, 23, 249, 209, 5, 250, + 36, 134, 225, 201, 138, 226, 34, 100, 116, 39, 228, 99, 207, 228, 97, 93, + 31, 114, 75, 227, 151, 52, 126, 183, 89, 65, 220, 65, 41, 210, 121, 158, + 190, 245, 92, 243, 141, 236, 95, 189, 44, 99, 125, 132, 123, 67, 212, 255, + 249, 59, 132, 168, 159, 20, 183, 27, 191, 191, 38, 132, 151, 44, 68, 165, + 122, 164, 241, 2, 205, 143, 60, 224, 139, 140, 255, 158, 89, 127, 77, 33, + 114, 139, 9, 63, 95, 41, 18, 89, 142, 167, 181, 110, 75, 40, 166, 179, + 125, 109, 135, 231, 236, 134, 18, 116, 251, 55, 75, 214, 167, 20, 170, 214, + 231, 46, 37, 67, 242, 27, 59, 181, 134, 63, 84, 68, 234, 151, 254, 24, + 19, 158, 110, 99, 160, 31, 228, 175, 209, 126, 159, 104, 146, 181, 169, 140, + 37, 160, 196, 250, 173, 145, 168, 79, 62, 126, 221, 50, 220, 63, 47, 198, + 81, 21, 10, 68, 185, 208, 33, 241, 64, 173, 30, 108, 157, 54, 163, 18, + 234, 189, 245, 70, 93, 226, 226, 101, 216, 15, 96, 87, 171, 138, 118, 175, + 75, 231, 91, 210, 125, 90, 220, 209, 103, 92, 225, 198, 121, 176, 167, 57, + 131, 43, 89, 17, 134, 136, 152, 226, 160, 247, 210, 254, 203, 197, 190, 165, + 186, 8, 135, 7, 94, 196, 88, 238, 148, 91, 78, 228, 168, 212, 85, 170, + 86, 30, 207, 107, 254, 44, 41, 253, 27, 190, 125, 219, 197, 114, 209, 198, + 52, 216, 97, 83, 146, 134, 192, 240, 114, 132, 163, 10, 53, 53, 252, 208, + 67, 49, 92, 104, 130, 94, 73, 136, 230, 122, 138, 250, 112, 202, 115, 169, + 207, 83, 181, 231, 69, 137, 195, 118, 181, 13, 233, 159, 57, 105, 236, 81, + 166, 204, 56, 172, 40, 155, 179, 24, 181, 14, 233, 60, 148, 231, 23, 15, + 94, 14, 253, 111, 191, 95, 9, 207, 15, 226, 83, 94, 21, 199, 87, 35, + 124, 2, 70, 31, 93, 139, 117, 171, 151, 20, 155, 22, 71, 41, 59, 190, + 35, 26, 226, 204, 217, 179, 109, 58, 246, 77, 31, 13, 149, 227, 253, 189, + 139, 227, 203, 252, 158, 139, 4, 13, 16, 176, 36, 178, 4, 213, 115, 234, + 0, 153, 242, 135, 50, 128, 1, 226, 7, 144, 225, 135, 97, 253, 244, 170, + 103, 127, 82, 117, 125, 120, 91, 89, 237, 253, 222, 184, 240, 22, 210, 156, + 33, 58, 16, 40, 106, 131, 91, 78, 134, 0, 33, 144, 107, 106, 129, 85, + 209, 173, 14, 213, 32, 142, 136, 99, 3, 129, 197, 115, 21, 237, 42, 70, + 129, 69, 137, 81, 192, 84, 39, 205, 175, 31, 83, 133, 20, 132, 178, 12, + 221, 43, 192, 243, 5, 52, 199, 240, 236, 205, 87, 26, 224, 50, 200, 145, + 223, 4, 128, 231, 47, 141, 108, 12, 131, 194, 112, 176, 211, 13, 205, 6, + 241, 15, 3, 192, 191, 30, 207, 240, 12, 197, 8, 16, 77, 54, 135, 38, + 27, 208, 28, 79, 143, 130, 148, 113, 87, 248, 99, 72, 50, 224, 7, 34, + 212, 137, 167, 186, 240, 96, 191, 143, 92, 16, 0, 10, 124, 218, 220, 206, + 84, 50, 176, 14, 243, 98, 33, 178, 63, 158, 4, 92, 87, 184, 192, 43, + 108, 59, 80, 107, 193, 192, 162, 96, 158, 20, 2, 159, 116, 3, 219, 8, + 49, 85, 82, 240, 37, 191, 156, 246, 114, 135, 113, 117, 35, 156, 20, 18, + 172, 105, 18, 122, 40, 227, 45, 2, 0, 146, 0, 79, 58, 227, 247, 74, + 78, 85, 31, 83, 140, 230, 63, 42, 24, 88, 237, 1, 128, 138, 118, 179, + 213, 227, 130, 157, 235, 122, 11, 105, 201, 50, 99, 130, 188, 54, 160, 216, + 218, 15, 222, 117, 191, 1, 130, 175, 1, 232, 253, 132, 236, 193, 63, 69, + 209, 100, 178, 82, 195, 155, 68, 81, 246, 15, 147, 157, 28, 125, 65, 72, + 248, 125, 32, 221, 54, 101, 199, 9, 28, 255, 248, 25, 248, 45, 160, 192, + 9, 166, 28, 165, 147, 228, 244, 164, 215, 241, 134, 204, 170, 132, 246, 252, + 16, 31, 228, 247, 188, 80, 11, 207, 139, 30, 128, 248, 41, 18, 156, 248, + 61, 127, 90, 98, 53, 97, 140, 168, 254, 185, 59, 108, 1, 98, 141, 105, + 71, 53, 43, 82, 23, 184, 20, 196, 101, 155, 106, 251, 146, 231, 239, 158, + 240, 248, 170, 190, 9, 7, 187, 58, 88, 159, 185, 171, 101, 115, 29, 12, + 192, 45, 7, 36, 245, 62, 136, 33, 85, 162, 196, 192, 31, 245, 14, 29, + 246, 171, 122, 224, 193, 19, 225, 79, 69, 250, 143, 49, 0, 41, 14, 8, + 162, 20, 31, 132, 155, 146, 5, 141, 106, 213, 250, 50, 242, 190, 173, 116, + 134, 110, 9, 200, 192, 94, 105, 106, 128, 31, 32, 223, 87, 178, 35, 76, + 211, 171, 230, 153, 219, 24, 19, 41, 25, 4, 74, 120, 76, 169, 62, 227, + 216, 188, 177, 124, 141, 228, 37, 174, 185, 62, 127, 171, 211, 36, 231, 156, + 244, 59, 165, 126, 157, 40, 40, 115, 50, 110, 104, 69, 110, 141, 74, 69, + 62, 84, 248, 67, 93, 181, 110, 205, 208, 179, 72, 62, 90, 14, 214, 160, + 111, 212, 38, 71, 201, 34, 101, 6, 49, 100, 101, 124, 117, 72, 210, 183, + 98, 157, 230, 41, 210, 36, 56, 8, 246, 208, 205, 49, 223, 65, 86, 236, + 106, 12, 138, 164, 234, 74, 136, 229, 223, 4, 222, 159, 228, 71, 52, 6, + 137, 242, 167, 156, 199, 177, 39, 218, 81, 6, 83, 38, 151, 236, 241, 86, + 98, 124, 143, 250, 158, 33, 170, 154, 82, 33, 185, 211, 201, 147, 125, 178, + 161, 243, 123, 146, 237, 228, 139, 191, 110, 162, 243, 165, 178, 250, 193, 27, + 145, 23, 166, 61, 168, 157, 247, 234, 216, 244, 41, 160, 150, 212, 169, 238, + 69, 92, 255, 0, 80, 176, 79, 93, 149, 198, 15, 28, 234, 3, 96, 191, + 161, 231, 58, 148, 105, 190, 162, 110, 56, 82, 70, 93, 34, 194, 12, 73, + 248, 112, 14, 80, 29, 113, 172, 112, 127, 163, 32, 83, 175, 128, 59, 138, + 42, 30, 173, 47, 131, 16, 69, 219, 149, 184, 52, 27, 254, 69, 210, 5, + 210, 34, 89, 129, 56, 210, 137, 47, 248, 243, 155, 118, 170, 220, 89, 68, + 211, 144, 109, 135, 224, 253, 229, 224, 222, 149, 164, 178, 247, 70, 2, 221, + 112, 5, 178, 74, 146, 116, 148, 174, 126, 41, 242, 36, 204, 226, 205, 160, + 249, 131, 176, 120, 176, 23, 218, 222, 1, 96, 246, 89, 196, 49, 62, 186, + 250, 208, 62, 251, 42, 1, 222, 90, 26, 171, 196, 122, 83, 136, 205, 226, + 208, 134, 75, 155, 186, 191, 253, 168, 110, 177, 65, 214, 232, 8, 230, 71, + 2, 22, 228, 109, 187, 27, 217, 30, 97, 217, 89, 146, 203, 106, 31, 93, + 14, 181, 236, 88, 252, 236, 70, 147, 1, 119, 139, 111, 193, 180, 220, 197, + 30, 212, 13, 216, 226, 63, 83, 247, 19, 134, 164, 42, 138, 193, 216, 254, + 180, 168, 143, 237, 17, 247, 206, 120, 143, 14, 247, 8, 86, 166, 154, 168, + 219, 152, 223, 111, 202, 79, 177, 23, 80, 66, 102, 183, 194, 198, 252, 99, + 177, 36, 66, 107, 180, 199, 153, 32, 39, 18, 84, 120, 178, 254, 76, 187, + 54, 123, 139, 46, 223, 51, 56, 117, 194, 43, 189, 35, 177, 253, 243, 140, + 236, 245, 22, 250, 104, 103, 73, 35, 62, 94, 194, 247, 23, 253, 217, 216, + 242, 123, 181, 17, 157, 109, 101, 17, 28, 150, 81, 190, 32, 163, 116, 194, + 143, 101, 37, 156, 192, 45, 68, 232, 27, 239, 44, 66, 20, 28, 220, 81, + 75, 124, 120, 19, 150, 7, 232, 148, 148, 187, 237, 14, 58, 107, 206, 23, + 59, 68, 91, 98, 175, 115, 204, 68, 159, 16, 53, 50, 152, 250, 119, 187, + 167, 53, 248, 240, 212, 38, 234, 97, 2, 0, 146, 207, 158, 218, 183, 231, + 102, 138, 52, 41, 178, 234, 210, 213, 79, 19, 235, 24, 110, 208, 63, 29, + 8, 85, 191, 226, 33, 93, 251, 128, 17, 60, 110, 128, 92, 215, 189, 211, + 50, 31, 182, 27, 53, 14, 51, 200, 45, 30, 8, 249, 1, 99, 17, 68, + 238, 212, 183, 50, 118, 192, 179, 81, 38, 52, 252, 149, 63, 167, 6, 151, + 122, 201, 229, 37, 4, 118, 148, 136, 27, 168, 176, 19, 215, 79, 231, 43, + 211, 21, 204, 242, 41, 153, 236, 133, 209, 168, 202, 12, 201, 160, 84, 5, + 157, 57, 166, 189, 149, 208, 104, 151, 142, 123, 86, 49, 58, 88, 50, 36, + 161, 164, 29, 233, 171, 91, 45, 207, 252, 80, 166, 154, 162, 44, 70, 49, + 44, 90, 93, 224, 235, 220, 233, 203, 107, 152, 168, 180, 117, 0, 244, 84, + 130, 208, 91, 179, 113, 89, 185, 33, 225, 193, 53, 153, 35, 125, 174, 248, + 248, 65, 145, 73, 187, 45, 201, 27, 188, 183, 250, 217, 144, 168, 0, 181, + 87, 52, 118, 96, 231, 88, 151, 159, 80, 5, 60, 105, 139, 33, 13, 165, + 200, 97, 225, 147, 130, 171, 246, 153, 106, 168, 156, 185, 4, 194, 158, 35, + 133, 39, 181, 0, 171, 33, 4, 30, 242, 83, 162, 80, 179, 185, 96, 107, + 82, 126, 43, 43, 103, 109, 185, 2, 59, 35, 81, 181, 43, 8, 217, 42, + 188, 153, 78, 145, 67, 187, 98, 10, 170, 160, 30, 56, 51, 141, 145, 251, + 113, 213, 148, 232, 206, 3, 56, 246, 171, 80, 75, 13, 250, 249, 139, 17, + 226, 76, 234, 242, 240, 154, 66, 145, 132, 3, 94, 252, 153, 67, 179, 171, + 22, 109, 205, 147, 30, 4, 13, 199, 36, 13, 171, 105, 175, 198, 141, 209, + 145, 117, 213, 202, 174, 50, 87, 5, 199, 157, 41, 143, 76, 89, 144, 80, + 8, 208, 216, 156, 169, 151, 5, 147, 33, 250, 249, 45, 228, 65, 46, 119, + 75, 178, 31, 119, 20, 39, 13, 227, 58, 90, 106, 50, 177, 123, 229, 87, + 19, 226, 144, 201, 27, 70, 211, 193, 231, 204, 26, 70, 246, 2, 249, 137, + 141, 197, 117, 237, 225, 182, 191, 61, 133, 219, 223, 42, 85, 226, 144, 79, + 140, 20, 145, 219, 40, 235, 86, 154, 163, 84, 242, 35, 141, 179, 133, 23, + 210, 109, 123, 138, 170, 150, 250, 229, 234, 43, 179, 26, 124, 206, 107, 97, + 118, 5, 235, 85, 188, 26, 69, 42, 231, 147, 108, 246, 35, 240, 23, 1, + 55, 65, 90, 149, 26, 215, 21, 106, 42, 241, 120, 208, 160, 1, 158, 62, + 41, 84, 85, 200, 19, 252, 113, 31, 170, 83, 226, 1, 245, 250, 78, 92, + 75, 179, 16, 79, 89, 13, 130, 24, 198, 215, 102, 138, 1, 61, 155, 56, + 37, 198, 77, 177, 58, 183, 31, 75, 98, 59, 221, 222, 15, 53, 188, 42, + 118, 58, 20, 34, 22, 235, 61, 72, 4, 180, 51, 53, 138, 108, 92, 199, + 130, 149, 54, 23, 74, 241, 118, 190, 148, 15, 23, 144, 93, 190, 145, 68, + 145, 63, 134, 236, 239, 151, 140, 121, 117, 51, 181, 3, 21, 38, 213, 215, + 70, 29, 62, 196, 203, 149, 132, 253, 177, 244, 43, 159, 235, 97, 171, 247, + 96, 162, 112, 126, 218, 244, 83, 127, 69, 175, 77, 246, 75, 64, 4, 218, + 113, 168, 216, 132, 147, 99, 14, 148, 171, 38, 47, 104, 25, 239, 50, 20, + 13, 8, 226, 238, 37, 194, 70, 79, 173, 112, 111, 183, 160, 76, 24, 56, + 109, 129, 73, 187, 156, 43, 191, 192, 116, 251, 99, 143, 185, 129, 206, 17, + 85, 112, 154, 162, 183, 33, 169, 133, 165, 252, 5, 196, 31, 148, 174, 18, + 39, 31, 77, 27, 147, 178, 125, 140, 113, 114, 212, 169, 227, 149, 53, 53, + 106, 21, 246, 242, 216, 103, 165, 52, 50, 95, 196, 111, 119, 163, 170, 195, + 94, 178, 83, 160, 95, 133, 197, 43, 164, 54, 229, 236, 7, 57, 174, 211, + 119, 133, 202, 166, 27, 37, 202, 198, 114, 49, 54, 7, 239, 179, 154, 217, + 44, 77, 136, 98, 44, 107, 67, 91, 213, 20, 212, 168, 141, 146, 61, 235, + 162, 51, 93, 246, 82, 171, 192, 59, 28, 190, 242, 1, 101, 238, 39, 59, + 41, 0, 39, 20, 34, 85, 230, 71, 155, 99, 197, 238, 19, 105, 58, 97, + 183, 63, 151, 113, 150, 39, 90, 124, 135, 203, 189, 61, 18, 143, 43, 246, + 242, 219, 10, 205, 213, 27, 171, 50, 168, 247, 229, 142, 244, 45, 229, 218, + 12, 182, 136, 99, 81, 1, 64, 225, 125, 108, 223, 147, 188, 23, 192, 21, + 97, 108, 135, 110, 104, 211, 161, 97, 77, 180, 198, 45, 32, 67, 94, 159, + 94, 238, 159, 23, 243, 10, 204, 235, 34, 126, 36, 250, 126, 135, 247, 24, + 208, 164, 193, 3, 106, 190, 244, 15, 233, 179, 223, 231, 134, 151, 237, 131, + 75, 191, 44, 57, 123, 25, 91, 27, 134, 4, 238, 176, 111, 33, 146, 94, + 82, 114, 252, 29, 162, 12, 30, 102, 124, 59, 41, 230, 187, 65, 60, 39, + 211, 141, 229, 35, 223, 129, 123, 4, 101, 145, 239, 201, 163, 7, 167, 189, + 100, 15, 1, 45, 101, 86, 241, 162, 225, 237, 172, 38, 9, 20, 218, 33, + 152, 46, 233, 63, 83, 107, 143, 26, 73, 13, 177, 72, 127, 82, 230, 154, + 205, 131, 251, 214, 101, 201, 110, 114, 215, 35, 178, 85, 138, 193, 19, 210, + 65, 145, 87, 159, 65, 28, 37, 9, 227, 196, 201, 147, 240, 4, 61, 166, + 204, 101, 196, 33, 0, 219, 47, 179, 58, 63, 238, 102, 87, 177, 171, 105, + 203, 189, 62, 63, 98, 35, 227, 20, 81, 182, 186, 178, 186, 123, 103, 147, + 220, 140, 127, 234, 53, 221, 164, 152, 188, 82, 195, 59, 212, 203, 100, 9, + 226, 176, 45, 41, 174, 1, 216, 249, 45, 70, 116, 10, 100, 235, 172, 125, + 133, 92, 91, 28, 82, 165, 29, 22, 189, 202, 20, 193, 147, 135, 118, 163, + 56, 247, 239, 210, 25, 55, 23, 118, 246, 44, 27, 245, 27, 226, 67, 116, + 209, 65, 92, 114, 153, 144, 161, 197, 203, 149, 100, 201, 123, 221, 54, 12, + 118, 224, 147, 27, 131, 178, 60, 141, 233, 248, 48, 201, 176, 34, 202, 19, + 19, 59, 45, 72, 103, 160, 111, 190, 144, 73, 204, 188, 169, 192, 68, 171, + 82, 94, 219, 50, 204, 19, 169, 193, 218, 113, 136, 144, 177, 91, 6, 156, + 171, 43, 111, 136, 43, 213, 193, 223, 60, 143, 225, 242, 206, 92, 63, 130, + 46, 201, 158, 179, 105, 218, 42, 53, 42, 52, 225, 94, 169, 95, 107, 126, + 156, 193, 186, 36, 155, 67, 87, 21, 231, 61, 120, 59, 243, 153, 21, 66, + 253, 35, 92, 67, 191, 134, 87, 66, 217, 41, 1, 206, 227, 93, 169, 5, + 220, 206, 132, 142, 39, 253, 186, 96, 132, 138, 130, 69, 235, 203, 55, 157, + 132, 38, 78, 178, 52, 37, 189, 138, 155, 241, 109, 169, 203, 194, 122, 147, + 62, 6, 245, 197, 26, 182, 116, 107, 155, 126, 120, 218, 58, 207, 201, 25, + 224, 56, 101, 210, 72, 207, 134, 128, 197, 144, 112, 247, 221, 251, 48, 236, + 6, 48, 252, 67, 133, 101, 164, 40, 62, 49, 202, 228, 112, 229, 172, 97, + 183, 139, 160, 182, 77, 202, 118, 20, 45, 100, 202, 208, 50, 125, 148, 243, + 201, 187, 181, 36, 151, 45, 157, 244, 6, 54, 235, 122, 243, 51, 32, 245, + 203, 246, 129, 74, 174, 76, 130, 36, 65, 234, 101, 54, 220, 30, 33, 220, + 94, 154, 65, 7, 47, 236, 116, 79, 216, 135, 166, 37, 67, 213, 214, 223, + 188, 5, 12, 250, 60, 42, 77, 249, 100, 51, 206, 167, 74, 145, 165, 153, + 226, 41, 248, 131, 204, 177, 83, 39, 69, 128, 66, 204, 29, 17, 67, 7, + 12, 61, 98, 243, 44, 32, 242, 239, 38, 23, 57, 176, 225, 241, 27, 160, + 203, 73, 120, 201, 140, 76, 145, 2, 158, 115, 34, 102, 243, 49, 208, 37, + 2, 125, 154, 146, 59, 14, 9, 203, 26, 243, 27, 185, 74, 245, 253, 236, + 53, 191, 43, 22, 69, 201, 18, 59, 120, 93, 187, 249, 234, 66, 234, 185, + 225, 23, 158, 2, 19, 138, 116, 222, 217, 180, 126, 193, 194, 183, 39, 217, + 70, 219, 231, 67, 132, 71, 215, 193, 101, 219, 57, 192, 155, 42, 118, 50, + 122, 36, 205, 188, 72, 67, 95, 27, 142, 52, 231, 203, 108, 63, 229, 100, + 196, 25, 13, 41, 231, 59, 212, 215, 119, 156, 127, 27, 33, 90, 198, 53, + 12, 104, 97, 88, 190, 59, 248, 237, 140, 193, 238, 107, 105, 91, 155, 253, + 49, 47, 128, 98, 128, 206, 178, 231, 107, 167, 35, 55, 30, 40, 229, 70, + 156, 147, 80, 93, 80, 74, 191, 217, 170, 167, 150, 147, 188, 248, 138, 21, + 217, 155, 95, 168, 19, 120, 211, 246, 222, 126, 0, 236, 102, 189, 72, 129, + 187, 248, 208, 21, 33, 202, 165, 136, 237, 143, 110, 66, 143, 1, 68, 230, + 152, 120, 252, 68, 63, 2, 122, 101, 74, 58, 43, 244, 243, 249, 234, 126, + 41, 69, 81, 220, 117, 131, 13, 52, 64, 94, 111, 51, 69, 82, 130, 211, + 28, 142, 239, 57, 157, 195, 11, 32, 230, 137, 110, 244, 161, 233, 46, 249, + 183, 5, 45, 182, 227, 156, 214, 222, 205, 158, 166, 255, 242, 7, 248, 47, + 255, 249, 239, 224, 47, 244, 143, 127, 59, 255, 193, 196, 71, 157, 253, 225, + 252, 31, 107, 78, 255, 249, 239, 16, 20, 253, 199, 63, 215, 188, 254, 248, + 63, 151, 251, 247, 210, 127, 190, 28, 243, 63, 185, 253, 63, 172, 97, 21, + 227, 190, 228, 247, 250, 255, 251, 250, 21, 249, 239, 239, 126, 100, 219, 71, + 88, 255, 188, 0, 255, 237, 221, 15, 31, 189, 84, 243, 207, 229, 44, 119, + 150, 70, 134, 60, 217, 151, 79, 41, 92, 63, 62, 220, 44, 158, 60, 101, + 242, 112, 19, 146, 184, 14, 177, 133, 72, 187, 153, 80, 171, 6, 67, 142, + 58, 67, 218, 91, 133, 174, 135, 242, 132, 220, 75, 168, 71, 217, 254, 41, + 180, 169, 194, 154, 115, 198, 252, 5, 217, 76, 9, 37, 130, 205, 10, 84, + 25, 74, 140, 233, 88, 83, 84, 208, 189, 56, 237, 94, 251, 9, 184, 171, + 194, 130, 206, 69, 53, 136, 6, 58, 49, 239, 203, 33, 174, 11, 84, 55, + 82, 62, 66, 2, 78, 5, 13, 40, 237, 36, 123, 12, 4, 242, 37, 183, + 102, 65, 118, 99, 253, 105, 69, 109, 241, 88, 200, 228, 200, 82, 162, 201, + 252, 207, 124, 31, 89, 13, 225, 155, 15, 132, 42, 116, 168, 51, 231, 207, + 229, 172, 70, 27, 49, 63, 200, 250, 157, 141, 185, 47, 25, 194, 83, 231, + 180, 225, 36, 223, 235, 46, 217, 108, 200, 83, 103, 39, 84, 107, 200, 89, + 172, 194, 146, 254, 184, 37, 254, 85, 15, 111, 16, 7, 236, 173, 62, 221, + 203, 56, 42, 85, 127, 60, 65, 103, 212, 86, 170, 63, 183, 116, 139, 111, + 159, 106, 232, 76, 121, 103, 152, 190, 116, 212, 93, 134, 231, 121, 140, 9, + 123, 151, 207, 18, 163, 235, 142, 147, 252, 152, 171, 226, 72, 140, 70, 255, + 106, 241, 118, 23, 177, 34, 134, 164, 255, 42, 137, 111, 69, 62, 175, 243, + 177, 79, 73, 46, 140, 229, 54, 36, 94, 170, 3, 189, 198, 183, 37, 95, + 133, 54, 91, 185, 46, 91, 254, 2, 174, 220, 239, 3, 7, 216, 102, 196, + 217, 233, 179, 227, 237, 232, 79, 149, 80, 39, 185, 255, 141, 114, 30, 241, + 50, 126, 150, 98, 68, 122, 252, 78, 98, 45, 22, 130, 116, 72, 179, 205, + 102, 220, 213, 167, 173, 248, 171, 45, 164, 114, 76, 185, 178, 53, 89, 210, + 162, 76, 183, 69, 13, 40, 171, 93, 40, 162, 44, 214, 188, 180, 230, 179, + 43, 207, 56, 171, 76, 68, 170, 247, 120, 203, 118, 8, 27, 55, 107, 178, + 150, 154, 138, 230, 59, 95, 231, 89, 243, 103, 25, 178, 101, 104, 51, 167, + 189, 237, 203, 92, 204, 243, 34, 143, 146, 126, 116, 1, 226, 22, 253, 20, + 188, 228, 92, 178, 61, 78, 176, 96, 74, 116, 160, 223, 235, 7, 85, 229, + 188, 17, 103, 67, 110, 45, 92, 235, 40, 146, 191, 65, 37, 191, 231, 161, + 220, 106, 55, 69, 64, 253, 14, 64, 232, 85, 134, 3, 87, 220, 251, 193, + 99, 47, 253, 154, 110, 39, 88, 80, 138, 234, 172, 151, 89, 207, 239, 107, + 48, 231, 165, 62, 234, 36, 221, 230, 32, 90, 159, 89, 185, 198, 156, 167, + 212, 244, 157, 239, 84, 60, 27, 97, 136, 24, 122, 10, 167, 61, 9, 166, + 35, 27, 162, 35, 29, 164, 54, 226, 137, 192, 235, 223, 76, 139, 116, 121, + 240, 210, 34, 207, 167, 116, 167, 197, 20, 27, 90, 23, 249, 33, 65, 173, + 254, 224, 202, 61, 30, 154, 53, 22, 34, 101, 182, 242, 197, 154, 252, 57, + 255, 70, 209, 75, 195, 94, 74, 131, 14, 179, 92, 111, 243, 61, 56, 83, + 109, 216, 19, 140, 167, 92, 100, 203, 14, 198, 89, 170, 66, 180, 238, 26, + 193, 75, 252, 129, 79, 42, 30, 27, 98, 223, 51, 125, 196, 23, 83, 132, + 210, 28, 159, 114, 220, 14, 2, 12, 232, 226, 236, 182, 253, 232, 78, 244, + 173, 94, 163, 203, 144, 123, 114, 116, 31, 74, 129, 51, 93, 222, 107, 194, + 158, 103, 18, 248, 26, 131, 206, 203, 124, 143, 4, 108, 142, 34, 95, 103, + 37, 76, 150, 253, 168, 141, 184, 43, 247, 15, 122, 237, 195, 20, 171, 231, + 42, 137, 255, 182, 159, 12, 206, 68, 26, 234, 3, 226, 72, 122, 204, 117, + 145, 92, 203, 16, 237, 29, 235, 141, 183, 107, 232, 99, 81, 225, 109, 88, + 230, 87, 49, 129, 110, 77, 248, 120, 138, 125, 178, 248, 108, 107, 242, 137, + 176, 92, 244, 194, 16, 33, 136, 216, 239, 24, 187, 211, 160, 16, 150, 142, + 0, 34, 44, 155, 165, 84, 243, 193, 104, 227, 249, 128, 246, 235, 217, 139, + 124, 123, 125, 212, 107, 239, 227, 139, 220, 231, 144, 8, 70, 244, 132, 11, + 119, 169, 204, 131, 50, 8, 1, 163, 238, 43, 118, 23, 95, 158, 76, 170, + 126, 251, 239, 107, 87, 248, 237, 4, 72, 101, 187, 214, 35, 24, 17, 134, + 187, 185, 56, 167, 7, 139, 128, 98, 166, 215, 209, 131, 69, 128, 62, 187, + 151, 53, 164, 96, 29, 48, 238, 34, 240, 82, 165, 119, 211, 206, 168, 162, + 246, 235, 73, 96, 130, 46, 137, 119, 145, 152, 104, 152, 46, 16, 173, 146, + 109, 220, 208, 224, 191, 198, 22, 185, 192, 198, 121, 130, 9, 86, 12, 196, + 202, 87, 158, 207, 229, 88, 139, 243, 14, 192, 234, 178, 164, 57, 144, 234, + 31, 162, 0, 112, 108, 208, 65, 12, 12, 190, 1, 81, 253, 160, 159, 14, + 118, 106, 122, 20, 94, 35, 239, 125, 35, 70, 14, 42, 172, 193, 135, 70, + 45, 107, 209, 144, 156, 9, 45, 60, 31, 180, 165, 97, 225, 45, 17, 246, + 212, 225, 63, 75, 32, 65, 28, 65, 96, 242, 184, 71, 120, 160, 95, 233, + 18, 95, 39, 248, 170, 173, 174, 250, 77, 43, 243, 14, 212, 136, 252, 238, + 8, 65, 127, 140, 96, 240, 238, 213, 74, 96, 62, 56, 24, 50, 150, 154, + 241, 177, 89, 238, 46, 165, 147, 225, 94, 211, 235, 251, 80, 91, 232, 101, + 238, 193, 7, 75, 46, 7, 39, 138, 241, 40, 175, 80, 143, 202, 245, 252, + 142, 154, 248, 153, 197, 32, 118, 74, 132, 53, 187, 65, 92, 24, 147, 229, + 25, 180, 168, 210, 135, 131, 114, 125, 209, 80, 190, 23, 68, 93, 130, 213, + 43, 248, 206, 138, 176, 204, 45, 86, 157, 208, 5, 144, 124, 184, 54, 166, + 208, 236, 113, 48, 143, 196, 47, 245, 169, 207, 204, 249, 102, 123, 127, 141, + 39, 151, 164, 190, 114, 231, 184, 75, 22, 169, 251, 66, 228, 69, 35, 26, + 25, 19, 247, 231, 23, 20, 196, 179, 186, 17, 186, 97, 92, 49, 3, 65, + 59, 226, 182, 190, 68, 49, 28, 250, 67, 148, 124, 43, 97, 224, 57, 232, + 240, 212, 44, 175, 84, 99, 60, 77, 55, 240, 27, 119, 52, 72, 229, 89, + 209, 118, 245, 30, 19, 250, 45, 53, 32, 65, 154, 147, 81, 25, 17, 198, + 134, 59, 228, 189, 255, 84, 151, 109, 12, 179, 239, 72, 6, 100, 248, 94, + 154, 120, 153, 211, 108, 251, 252, 145, 0, 93, 18, 46, 71, 158, 68, 94, + 252, 81, 166, 165, 47, 112, 180, 14, 219, 126, 223, 4, 185, 245, 59, 76, + 230, 12, 119, 167, 79, 139, 105, 59, 215, 24, 42, 41, 242, 103, 182, 217, + 19, 180, 153, 205, 158, 44, 19, 99, 6, 88, 236, 243, 155, 73, 111, 55, + 110, 99, 106, 52, 252, 128, 231, 24, 68, 146, 215, 2, 232, 62, 127, 209, + 244, 147, 81, 238, 163, 202, 114, 166, 254, 230, 18, 172, 145, 245, 134, 137, + 168, 199, 237, 207, 110, 80, 96, 72, 173, 132, 97, 57, 27, 86, 145, 252, + 239, 224, 37, 87, 140, 45, 239, 252, 62, 6, 38, 80, 163, 234, 18, 55, + 182, 133, 106, 232, 27, 18, 127, 182, 49, 50, 43, 10, 164, 31, 44, 46, + 121, 27, 72, 14, 55, 132, 97, 249, 103, 129, 230, 36, 253, 226, 196, 64, + 48, 93, 92, 40, 75, 195, 201, 183, 88, 43, 11, 201, 160, 200, 93, 170, + 242, 71, 61, 63, 4, 14, 116, 109, 7, 212, 139, 243, 57, 46, 140, 208, + 243, 120, 134, 237, 60, 39, 21, 156, 192, 92, 104, 255, 2, 104, 217, 6, + 184, 183, 128, 32, 213, 109, 228, 196, 137, 139, 117, 234, 168, 185, 110, 48, + 157, 9, 2, 233, 25, 81, 62, 158, 51, 237, 121, 37, 162, 40, 168, 248, + 24, 229, 84, 166, 94, 208, 96, 137, 136, 206, 159, 77, 244, 98, 56, 142, + 122, 216, 80, 193, 253, 172, 194, 229, 219, 144, 191, 79, 69, 50, 53, 54, + 13, 218, 136, 235, 67, 25, 48, 156, 9, 175, 143, 243, 242, 79, 84, 76, + 149, 132, 0, 205, 180, 221, 243, 176, 27, 198, 39, 94, 66, 177, 81, 207, + 47, 120, 124, 245, 189, 105, 143, 210, 200, 135, 4, 139, 163, 54, 220, 47, + 83, 195, 196, 46, 121, 225, 234, 67, 30, 111, 42, 63, 245, 187, 228, 211, + 227, 82, 135, 168, 71, 189, 44, 93, 189, 243, 193, 56, 236, 44, 153, 20, + 151, 244, 209, 166, 149, 249, 216, 158, 249, 71, 47, 50, 218, 246, 16, 22, + 61, 251, 64, 108, 147, 113, 219, 29, 217, 254, 248, 130, 65, 158, 34, 220, + 153, 137, 151, 176, 86, 18, 120, 161, 221, 66, 87, 18, 72, 54, 246, 84, + 121, 143, 115, 206, 241, 145, 16, 154, 216, 176, 175, 115, 209, 133, 33, 105, + 142, 49, 65, 87, 37, 38, 79, 208, 128, 253, 37, 104, 135, 131, 26, 79, + 184, 110, 105, 24, 37, 125, 70, 161, 254, 28, 19, 39, 189, 202, 203, 217, + 47, 73, 220, 122, 170, 100, 132, 16, 106, 121, 87, 248, 130, 105, 174, 243, + 3, 212, 180, 253, 51, 225, 123, 231, 205, 228, 144, 192, 152, 194, 1, 118, + 14, 100, 202, 43, 146, 226, 99, 42, 219, 141, 18, 86, 190, 64, 29, 145, + 178, 108, 181, 32, 23, 223, 172, 104, 95, 157, 76, 69, 103, 62, 39, 201, + 251, 22, 57, 6, 56, 0, 8, 55, 213, 14, 25, 26, 232, 240, 220, 107, + 214, 162, 195, 141, 54, 225, 159, 10, 68, 123, 251, 171, 129, 236, 62, 247, + 103, 124, 248, 229, 141, 36, 14, 79, 10, 118, 27, 142, 94, 200, 175, 25, + 165, 151, 222, 65, 182, 116, 131, 76, 216, 126, 116, 120, 94, 205, 232, 246, + 34, 109, 198, 110, 49, 27, 229, 105, 63, 244, 109, 173, 237, 81, 57, 73, + 240, 150, 131, 217, 158, 53, 83, 109, 220, 123, 124, 125, 69, 246, 234, 25, + 142, 39, 73, 172, 249, 48, 45, 211, 91, 22, 201, 145, 142, 121, 4, 234, + 253, 113, 203, 78, 109, 217, 94, 153, 241, 16, 102, 170, 104, 81, 96, 241, + 145, 15, 158, 130, 16, 166, 67, 94, 181, 78, 194, 95, 212, 174, 143, 62, + 73, 188, 136, 207, 88, 223, 204, 170, 111, 171, 108, 112, 61, 45, 23, 61, + 252, 73, 203, 228, 10, 50, 201, 48, 216, 124, 242, 229, 213, 249, 151, 244, + 7, 216, 251, 78, 209, 12, 228, 34, 176, 185, 111, 16, 223, 45, 155, 215, + 161, 147, 88, 189, 93, 69, 175, 229, 253, 215, 82, 76, 23, 51, 77, 178, + 34, 161, 254, 134, 38, 146, 158, 40, 90, 164, 158, 161, 36, 183, 210, 251, + 229, 150, 52, 114, 196, 238, 153, 37, 59, 14, 84, 56, 53, 188, 220, 123, + 8, 51, 206, 219, 0, 248, 50, 226, 105, 214, 30, 21, 169, 82, 205, 90, + 25, 156, 53, 93, 200, 112, 86, 250, 75, 121, 29, 144, 211, 144, 6, 185, + 177, 58, 25, 47, 238, 40, 47, 233, 237, 249, 49, 190, 235, 126, 234, 48, + 139, 27, 238, 8, 244, 181, 93, 251, 88, 191, 125, 75, 178, 98, 60, 190, + 220, 190, 45, 27, 205, 204, 168, 120, 176, 21, 46, 84, 197, 240, 36, 206, + 187, 177, 197, 223, 209, 142, 247, 96, 55, 236, 174, 158, 117, 19, 163, 244, + 247, 90, 143, 174, 92, 45, 162, 171, 90, 120, 222, 23, 180, 235, 84, 170, + 92, 107, 93, 53, 29, 88, 39, 13, 37, 216, 192, 67, 186, 73, 151, 215, + 93, 28, 69, 154, 78, 127, 62, 45, 11, 248, 149, 10, 162, 170, 154, 122, + 179, 176, 157, 200, 211, 227, 77, 89, 183, 160, 251, 224, 33, 105, 211, 0, + 150, 147, 182, 52, 205, 19, 5, 172, 156, 137, 136, 238, 204, 134, 214, 93, + 116, 96, 238, 245, 46, 45, 132, 246, 246, 115, 205, 52, 91, 172, 110, 176, + 46, 72, 51, 224, 169, 118, 185, 235, 58, 61, 242, 84, 47, 118, 166, 147, + 159, 61, 169, 60, 247, 118, 77, 203, 236, 246, 107, 147, 77, 36, 198, 226, + 49, 217, 36, 242, 146, 67, 207, 135, 17, 153, 217, 252, 142, 22, 103, 177, + 150, 75, 34, 19, 231, 210, 68, 157, 73, 200, 55, 148, 23, 195, 96, 56, + 126, 191, 31, 248, 128, 207, 121, 199, 169, 79, 63, 94, 179, 45, 38, 65, + 201, 207, 233, 181, 94, 244, 9, 84, 169, 123, 9, 27, 130, 168, 252, 146, + 169, 99, 1, 111, 140, 76, 115, 25, 137, 168, 100, 97, 179, 45, 228, 202, + 178, 89, 217, 161, 197, 102, 41, 39, 87, 58, 194, 125, 54, 78, 6, 185, + 197, 197, 195, 47, 222, 254, 130, 46, 156, 158, 41, 0, 12, 130, 107, 192, + 73, 122, 146, 117, 99, 162, 216, 91, 100, 153, 22, 153, 156, 156, 25, 107, + 15, 125, 139, 241, 104, 103, 241, 1, 166, 140, 29, 170, 239, 94, 218, 45, + 63, 225, 179, 60, 6, 74, 244, 168, 2, 63, 122, 119, 41, 88, 123, 120, + 236, 156, 158, 114, 34, 125, 47, 85, 101, 93, 8, 24, 135, 37, 119, 44, + 74, 154, 218, 91, 75, 22, 209, 174, 172, 126, 182, 21, 96, 11, 253, 173, + 230, 200, 153, 29, 144, 106, 3, 43, 12, 63, 4, 35, 139, 95, 169, 180, + 71, 153, 54, 69, 140, 143, 184, 238, 199, 251, 76, 151, 242, 108, 223, 113, + 253, 134, 76, 203, 190, 112, 81, 150, 110, 139, 184, 180, 65, 86, 180, 82, + 141, 98, 5, 136, 64, 70, 20, 199, 204, 13, 63, 98, 147, 148, 101, 102, + 250, 188, 121, 230, 6, 72, 154, 52, 240, 199, 243, 12, 94, 201, 68, 37, + 136, 77, 247, 84, 160, 54, 46, 27, 112, 20, 159, 55, 50, 139, 200, 164, + 230, 210, 58, 247, 38, 123, 44, 108, 42, 115, 29, 35, 47, 55, 174, 208, + 255, 18, 2, 75, 68, 191, 102, 207, 190, 203, 194, 125, 218, 47, 66, 94, + 140, 27, 203, 140, 5, 126, 195, 113, 12, 84, 104, 212, 168, 80, 141, 109, + 203, 22, 212, 148, 55, 1, 86, 80, 202, 136, 241, 226, 31, 16, 96, 14, + 109, 228, 25, 232, 201, 19, 196, 45, 234, 60, 72, 162, 40, 14, 103, 214, + 177, 70, 175, 243, 21, 8, 110, 228, 85, 150, 163, 96, 147, 86, 200, 139, + 44, 52, 120, 154, 0, 104, 209, 168, 83, 171, 42, 245, 173, 143, 124, 124, + 226, 231, 61, 171, 207, 213, 34, 108, 149, 142, 200, 126, 243, 171, 18, 167, + 14, 104, 131, 149, 141, 53, 58, 80, 61, 130, 234, 251, 70, 97, 234, 241, + 69, 0, 95, 122, 218, 94, 240, 79, 223, 76, 209, 190, 49, 89, 120, 212, + 23, 217, 126, 121, 233, 5, 39, 247, 37, 149, 29, 147, 211, 5, 245, 195, + 161, 243, 4, 135, 76, 8, 99, 171, 50, 164, 67, 219, 100, 221, 162, 165, + 79, 100, 191, 226, 4, 197, 40, 233, 254, 118, 242, 181, 107, 229, 145, 125, + 219, 135, 41, 195, 44, 98, 59, 245, 87, 146, 149, 202, 129, 220, 201, 204, + 166, 95, 49, 52, 199, 146, 41, 53, 98, 94, 206, 188, 229, 137, 244, 238, + 76, 119, 250, 197, 221, 231, 196, 142, 161, 115, 157, 171, 72, 248, 150, 252, + 5, 116, 43, 190, 242, 125, 218, 52, 74, 66, 126, 36, 160, 58, 17, 74, + 121, 175, 91, 137, 173, 147, 137, 237, 233, 69, 166, 216, 44, 159, 47, 70, + 50, 12, 172, 85, 0, 138, 200, 77, 26, 173, 74, 132, 165, 244, 173, 226, + 124, 30, 210, 251, 111, 138, 251, 156, 153, 9, 49, 252, 136, 0, 207, 255, + 180, 105, 212, 138, 227, 27, 127, 105, 214, 155, 155, 130, 130, 147, 68, 236, + 249, 249, 19, 88, 80, 67, 240, 89, 158, 95, 31, 32, 35, 215, 158, 158, + 0, 217, 42, 242, 149, 94, 238, 15, 178, 127, 238, 164, 64, 241, 10, 148, + 246, 66, 123, 94, 199, 47, 139, 122, 67, 0, 91, 26, 113, 62, 236, 1, + 85, 54, 53, 58, 102, 239, 161, 122, 227, 158, 174, 104, 0, 1, 193, 242, + 247, 81, 179, 9, 250, 97, 135, 219, 87, 126, 61, 159, 102, 204, 90, 89, + 177, 17, 151, 179, 128, 88, 90, 216, 149, 9, 44, 3, 240, 221, 241, 110, + 201, 162, 61, 131, 40, 23, 82, 249, 118, 174, 205, 170, 235, 233, 75, 87, + 93, 222, 113, 172, 2, 195, 169, 27, 0, 25, 10, 213, 165, 113, 190, 7, + 202, 137, 87, 211, 74, 152, 98, 93, 155, 142, 190, 126, 128, 167, 231, 250, + 48, 1, 48, 132, 47, 195, 83, 100, 7, 216, 28, 174, 22, 136, 19, 223, + 140, 119, 102, 72, 173, 249, 142, 243, 45, 72, 200, 238, 28, 49, 80, 4, + 25, 242, 124, 126, 76, 183, 225, 224, 139, 77, 88, 63, 212, 64, 255, 66, + 83, 127, 54, 233, 47, 157, 140, 107, 82, 182, 2, 223, 78, 201, 248, 78, + 123, 128, 194, 31, 2, 120, 69, 2, 1, 30, 248, 177, 0, 191, 92, 39, + 190, 248, 97, 197, 52, 126, 110, 223, 248, 166, 125, 40, 102, 86, 237, 99, + 209, 79, 15, 94, 133, 99, 124, 218, 41, 38, 161, 156, 173, 152, 107, 134, + 184, 243, 170, 94, 248, 168, 127, 60, 59, 238, 126, 207, 53, 84, 48, 58, + 110, 206, 87, 11, 2, 13, 211, 18, 123, 25, 28, 238, 208, 12, 187, 22, + 243, 249, 194, 91, 255, 193, 57, 127, 231, 182, 89, 91, 228, 111, 245, 236, + 99, 91, 62, 11, 223, 212, 255, 59, 123, 111, 222, 35, 187, 147, 92, 139, + 125, 149, 126, 99, 192, 150, 192, 145, 138, 107, 145, 20, 70, 99, 112, 95, + 138, 59, 139, 43, 6, 48, 184, 175, 197, 125, 23, 252, 221, 205, 190, 191, + 209, 104, 164, 121, 122, 178, 253, 12, 255, 213, 184, 232, 219, 44, 22, 153, + 76, 146, 153, 17, 231, 68, 71, 198, 105, 31, 5, 13, 225, 42, 45, 62, + 16, 18, 233, 50, 12, 1, 245, 137, 88, 221, 205, 16, 11, 48, 49, 219, + 217, 170, 16, 72, 212, 252, 238, 65, 132, 72, 103, 63, 141, 78, 3, 129, + 13, 255, 92, 89, 134, 196, 238, 137, 60, 31, 55, 92, 188, 79, 183, 30, + 200, 81, 161, 42, 20, 227, 157, 76, 216, 145, 50, 129, 47, 15, 1, 188, + 43, 4, 16, 63, 93, 13, 178, 2, 147, 183, 114, 96, 71, 81, 10, 237, + 14, 212, 73, 67, 62, 240, 206, 219, 214, 161, 188, 22, 157, 208, 187, 116, + 68, 242, 213, 64, 204, 27, 211, 176, 75, 71, 224, 196, 103, 174, 154, 4, + 38, 30, 121, 177, 178, 151, 225, 142, 31, 128, 160, 226, 102, 112, 12, 88, + 10, 240, 36, 123, 23, 207, 18, 218, 175, 30, 58, 170, 231, 72, 56, 155, + 145, 46, 39, 65, 86, 97, 1, 17, 108, 17, 118, 82, 233, 128, 93, 221, + 130, 152, 126, 192, 225, 150, 101, 40, 143, 119, 36, 167, 15, 206, 226, 69, + 145, 101, 135, 73, 248, 157, 142, 209, 125, 48, 205, 42, 155, 99, 18, 235, + 120, 40, 74, 224, 42, 39, 201, 207, 9, 7, 167, 110, 62, 139, 38, 240, + 187, 63, 213, 50, 220, 105, 57, 242, 192, 143, 113, 61, 253, 247, 43, 8, + 181, 39, 144, 171, 154, 212, 21, 112, 229, 14, 233, 90, 51, 125, 43, 191, + 179, 126, 100, 162, 144, 209, 185, 217, 177, 222, 215, 155, 2, 197, 30, 158, + 2, 74, 52, 247, 236, 13, 245, 161, 96, 109, 254, 182, 233, 166, 114, 225, + 49, 167, 100, 251, 75, 207, 31, 198, 123, 59, 3, 172, 156, 4, 99, 20, + 207, 226, 227, 30, 124, 211, 233, 167, 207, 219, 147, 177, 6, 245, 205, 89, + 95, 14, 237, 18, 252, 75, 52, 79, 145, 77, 235, 69, 175, 33, 28, 194, + 73, 248, 25, 76, 102, 194, 216, 15, 99, 249, 220, 68, 215, 20, 134, 39, + 49, 72, 22, 206, 223, 118, 86, 186, 71, 211, 204, 96, 124, 67, 91, 190, + 25, 162, 21, 43, 42, 158, 4, 90, 9, 67, 28, 117, 87, 102, 207, 109, + 20, 173, 177, 177, 5, 5, 1, 242, 219, 61, 132, 92, 158, 18, 225, 195, + 25, 137, 38, 126, 113, 249, 75, 140, 139, 119, 30, 76, 159, 237, 229, 120, + 54, 61, 216, 37, 20, 64, 15, 30, 12, 165, 227, 115, 41, 215, 91, 82, + 63, 43, 117, 91, 193, 38, 98, 11, 177, 27, 46, 60, 221, 82, 48, 90, + 92, 252, 233, 219, 77, 188, 230, 15, 34, 161, 32, 23, 149, 47, 150, 31, + 39, 254, 61, 183, 31, 217, 240, 29, 22, 78, 139, 183, 87, 144, 159, 57, + 24, 224, 184, 110, 214, 78, 54, 135, 164, 19, 140, 96, 63, 100, 123, 149, + 193, 40, 239, 166, 29, 222, 226, 129, 206, 189, 8, 54, 222, 196, 91, 200, + 20, 200, 158, 168, 169, 233, 237, 139, 51, 102, 202, 176, 183, 211, 107, 24, + 51, 203, 204, 154, 9, 21, 158, 24, 159, 170, 111, 106, 43, 12, 47, 156, + 58, 8, 188, 106, 58, 224, 0, 176, 44, 141, 111, 113, 240, 92, 184, 109, + 12, 106, 72, 123, 191, 236, 42, 241, 45, 202, 38, 161, 50, 48, 75, 254, + 169, 202, 133, 253, 168, 234, 10, 111, 171, 80, 176, 253, 74, 234, 71, 205, + 98, 20, 167, 127, 35, 101, 42, 11, 106, 209, 241, 203, 69, 56, 202, 243, + 36, 65, 45, 196, 159, 31, 22, 122, 176, 194, 83, 200, 38, 45, 35, 152, + 36, 158, 192, 254, 221, 30, 174, 212, 158, 166, 156, 55, 68, 29, 111, 249, + 56, 126, 152, 165, 135, 222, 181, 230, 73, 21, 219, 223, 8, 67, 90, 249, + 78, 119, 106, 225, 166, 82, 143, 219, 217, 204, 143, 236, 230, 154, 33, 84, + 29, 219, 18, 74, 254, 13, 200, 60, 147, 127, 98, 134, 205, 13, 229, 119, + 78, 80, 217, 71, 187, 81, 69, 123, 186, 219, 111, 86, 85, 142, 194, 162, + 230, 194, 215, 41, 217, 15, 3, 212, 27, 76, 247, 144, 50, 234, 68, 92, + 204, 147, 57, 169, 19, 212, 7, 5, 1, 97, 42, 171, 213, 78, 173, 7, + 127, 3, 128, 27, 171, 44, 82, 149, 104, 22, 103, 219, 2, 45, 211, 11, + 93, 33, 46, 88, 4, 102, 32, 150, 105, 162, 58, 163, 43, 59, 77, 68, + 187, 190, 194, 48, 170, 211, 118, 130, 132, 174, 218, 187, 138, 14, 200, 103, + 248, 27, 234, 127, 146, 104, 160, 66, 12, 153, 58, 225, 242, 167, 140, 167, + 18, 195, 102, 41, 95, 216, 65, 157, 27, 188, 160, 40, 242, 253, 248, 132, + 73, 59, 162, 84, 47, 89, 167, 215, 154, 147, 249, 58, 149, 56, 145, 242, + 218, 10, 182, 102, 97, 233, 158, 13, 167, 49, 40, 158, 157, 33, 94, 121, + 123, 57, 24, 75, 241, 15, 106, 204, 156, 184, 63, 12, 153, 49, 73, 23, + 85, 116, 79, 245, 30, 47, 254, 179, 191, 146, 216, 193, 95, 175, 230, 18, + 61, 238, 193, 214, 229, 199, 30, 122, 38, 81, 66, 40, 55, 117, 124, 85, + 165, 20, 114, 37, 96, 82, 209, 187, 51, 55, 111, 235, 69, 146, 79, 172, + 210, 126, 54, 255, 101, 188, 213, 254, 45, 192, 26, 71, 243, 82, 101, 221, + 23, 255, 43, 80, 250, 159, 166, 24, 182, 85, 215, 252, 203, 239, 254, 238, + 75, 82, 41, 129, 251, 122, 103, 209, 231, 235, 241, 37, 88, 92, 192, 124, + 41, 81, 220, 79, 209, 210, 79, 231, 215, 63, 124, 49, 154, 101, 127, 57, + 170, 245, 245, 4, 113, 248, 235, 239, 127, 247, 251, 191, 68, 98, 247, 125, + 255, 183, 248, 235, 255, 62, 68, 69, 246, 127, 84, 233, 63, 163, 40, 242, + 191, 182, 81, 87, 252, 115, 214, 253, 238, 255, 252, 143, 153, 137, 127, 234, + 164, 252, 87, 254, 98, 52, 12, 211, 247, 114, 175, 37, 251, 218, 203, 104, + 249, 218, 179, 175, 180, 255, 174, 41, 244, 135, 248, 143, 191, 170, 38, 253, + 225, 17, 255, 241, 87, 76, 120, 143, 186, 229, 59, 235, 177, 204, 218, 225, + 107, 157, 191, 62, 81, 213, 45, 247, 79, 213, 21, 191, 190, 79, 179, 45, + 107, 251, 225, 251, 227, 82, 126, 103, 74, 86, 89, 146, 125, 245, 249, 215, + 220, 231, 203, 30, 77, 217, 239, 191, 134, 54, 139, 230, 236, 43, 233, 187, + 185, 74, 179, 233, 111, 99, 202, 109, 21, 79, 89, 52, 45, 191, 213, 67, + 202, 186, 199, 48, 245, 117, 150, 44, 243, 175, 202, 66, 191, 251, 227, 125, + 209, 230, 215, 245, 238, 78, 118, 209, 119, 181, 167, 239, 199, 250, 223, 254, + 212, 253, 169, 251, 155, 236, 203, 255, 52, 249, 242, 191, 186, 200, 255, 235, + 248, 181, 242, 107, 100, 236, 127, 142, 95, 11, 176, 201, 128, 223, 27, 64, + 251, 29, 191, 118, 241, 12, 89, 205, 70, 254, 117, 140, 202, 82, 55, 221, + 151, 202, 212, 111, 159, 196, 54, 129, 211, 235, 92, 62, 225, 39, 156, 99, + 225, 188, 45, 7, 248, 145, 171, 240, 72, 124, 30, 200, 187, 167, 86, 7, + 208, 247, 185, 208, 13, 245, 193, 84, 180, 174, 239, 8, 101, 41, 217, 241, + 7, 91, 137, 77, 57, 225, 5, 15, 209, 76, 44, 159, 89, 55, 32, 41, + 146, 185, 109, 232, 57, 173, 108, 167, 93, 8, 109, 49, 12, 160, 171, 82, + 69, 159, 97, 210, 175, 25, 243, 93, 40, 187, 102, 92, 27, 34, 239, 35, + 150, 104, 182, 76, 17, 148, 221, 125, 96, 11, 84, 91, 98, 15, 238, 134, + 103, 118, 111, 235, 228, 125, 98, 240, 145, 139, 233, 54, 68, 251, 133, 31, + 227, 21, 119, 207, 71, 126, 220, 77, 187, 119, 31, 247, 77, 171, 173, 229, + 154, 150, 245, 254, 1, 193, 24, 171, 78, 60, 4, 79, 252, 198, 233, 120, + 140, 220, 238, 224, 184, 240, 11, 126, 24, 19, 118, 111, 199, 167, 34, 145, + 195, 192, 119, 151, 114, 3, 18, 101, 57, 79, 188, 237, 47, 165, 188, 64, + 5, 185, 128, 71, 119, 2, 91, 249, 57, 111, 11, 126, 247, 21, 120, 102, + 244, 124, 197, 19, 253, 92, 197, 27, 20, 35, 30, 145, 45, 247, 117, 38, + 232, 62, 46, 37, 128, 135, 77, 232, 211, 135, 220, 52, 24, 140, 73, 219, + 105, 149, 158, 124, 216, 11, 74, 22, 99, 46, 236, 171, 231, 138, 53, 153, + 11, 24, 70, 62, 5, 104, 14, 239, 199, 183, 159, 106, 173, 236, 64, 158, + 246, 247, 40, 111, 200, 92, 49, 112, 160, 92, 142, 201, 162, 155, 94, 89, + 129, 60, 159, 1, 35, 214, 240, 53, 23, 112, 221, 138, 106, 73, 154, 11, + 68, 201, 73, 131, 193, 159, 26, 9, 64, 170, 54, 12, 216, 146, 221, 200, + 53, 238, 67, 195, 33, 244, 117, 195, 180, 207, 132, 46, 25, 4, 47, 50, + 10, 78, 100, 179, 62, 135, 207, 28, 105, 225, 128, 149, 218, 71, 234, 70, + 242, 225, 193, 216, 114, 134, 72, 2, 208, 80, 98, 1, 75, 212, 160, 117, + 7, 46, 165, 111, 165, 247, 195, 55, 29, 158, 181, 112, 224, 115, 97, 233, + 58, 160, 75, 244, 65, 83, 175, 70, 53, 219, 132, 231, 85, 131, 147, 225, + 9, 206, 66, 120, 224, 100, 62, 201, 71, 59, 12, 109, 61, 132, 117, 64, + 100, 215, 11, 215, 189, 39, 74, 142, 49, 146, 50, 14, 76, 64, 4, 72, + 188, 248, 115, 58, 198, 109, 132, 180, 46, 0, 201, 6, 149, 182, 10, 105, + 245, 119, 131, 115, 79, 192, 144, 48, 64, 64, 145, 37, 42, 144, 229, 213, + 64, 201, 248, 130, 213, 210, 152, 7, 20, 104, 36, 10, 173, 197, 253, 170, + 197, 141, 195, 82, 120, 129, 23, 97, 128, 136, 167, 122, 196, 131, 55, 98, + 131, 215, 135, 50, 245, 145, 82, 190, 13, 130, 179, 65, 8, 164, 234, 6, + 207, 189, 13, 226, 51, 211, 15, 44, 29, 123, 36, 125, 165, 200, 34, 236, + 208, 12, 244, 23, 145, 5, 39, 193, 223, 239, 2, 27, 174, 184, 221, 78, + 37, 98, 247, 216, 99, 55, 92, 195, 54, 133, 145, 214, 137, 222, 167, 167, + 54, 77, 79, 158, 159, 134, 150, 27, 101, 75, 239, 7, 217, 238, 122, 2, + 170, 252, 102, 42, 16, 57, 10, 96, 158, 181, 185, 220, 37, 110, 227, 129, + 3, 107, 10, 171, 103, 117, 37, 158, 125, 37, 244, 114, 42, 110, 126, 78, + 214, 190, 227, 218, 181, 189, 48, 112, 137, 202, 112, 137, 228, 102, 142, 228, + 190, 69, 49, 174, 147, 150, 180, 70, 93, 167, 234, 169, 171, 18, 211, 56, + 245, 169, 41, 247, 192, 49, 19, 218, 119, 252, 105, 155, 72, 72, 171, 239, + 65, 28, 8, 212, 39, 112, 29, 196, 131, 44, 211, 229, 213, 222, 231, 101, + 201, 129, 56, 192, 168, 241, 247, 19, 136, 2, 72, 173, 244, 139, 120, 9, + 55, 34, 215, 47, 149, 209, 78, 28, 235, 247, 137, 198, 231, 103, 217, 116, + 33, 127, 51, 23, 154, 235, 3, 146, 237, 3, 204, 233, 36, 20, 186, 27, + 171, 139, 238, 200, 139, 110, 38, 19, 47, 185, 167, 89, 15, 248, 80, 3, + 189, 157, 2, 51, 89, 116, 54, 234, 57, 55, 174, 226, 82, 47, 181, 121, + 85, 237, 8, 70, 142, 255, 61, 233, 21, 223, 178, 223, 173, 154, 110, 5, + 165, 131, 212, 199, 164, 54, 4, 105, 168, 250, 68, 136, 29, 82, 105, 99, + 133, 38, 25, 141, 171, 123, 90, 171, 54, 177, 190, 70, 57, 117, 201, 144, + 219, 110, 4, 45, 235, 86, 46, 184, 142, 81, 62, 39, 22, 200, 241, 187, + 41, 241, 158, 225, 223, 113, 240, 30, 185, 239, 175, 40, 228, 181, 156, 57, + 149, 150, 219, 187, 229, 161, 160, 76, 40, 140, 146, 144, 102, 249, 183, 179, + 200, 182, 41, 50, 123, 255, 154, 207, 58, 102, 171, 128, 50, 111, 43, 33, + 21, 176, 78, 190, 105, 220, 216, 171, 78, 10, 197, 237, 42, 158, 156, 153, + 204, 35, 21, 36, 149, 153, 248, 117, 57, 156, 140, 212, 30, 197, 129, 168, + 74, 133, 51, 160, 79, 199, 245, 51, 166, 224, 194, 225, 63, 242, 39, 92, + 179, 130, 182, 227, 189, 16, 40, 249, 158, 46, 9, 130, 111, 116, 159, 244, + 106, 114, 49, 151, 40, 248, 6, 126, 131, 159, 56, 210, 45, 66, 5, 100, + 74, 85, 175, 114, 15, 243, 141, 49, 116, 86, 84, 47, 3, 70, 232, 122, + 28, 155, 108, 11, 56, 136, 165, 217, 41, 153, 180, 197, 186, 58, 119, 253, + 14, 28, 114, 14, 102, 52, 4, 212, 71, 58, 171, 134, 176, 46, 158, 12, + 193, 123, 15, 233, 32, 30, 220, 206, 220, 38, 5, 127, 101, 99, 212, 101, + 18, 149, 123, 225, 39, 246, 116, 88, 106, 120, 137, 211, 177, 207, 138, 70, + 133, 196, 15, 13, 181, 235, 218, 177, 138, 238, 97, 7, 125, 148, 225, 51, + 192, 17, 82, 117, 168, 119, 199, 118, 26, 86, 19, 195, 163, 86, 252, 172, + 119, 6, 4, 245, 61, 229, 79, 213, 109, 173, 167, 42, 242, 231, 38, 237, + 86, 155, 249, 85, 208, 239, 212, 44, 153, 28, 154, 235, 74, 226, 175, 229, + 119, 159, 220, 197, 60, 92, 53, 218, 172, 130, 186, 154, 192, 228, 192, 16, + 127, 5, 26, 77, 137, 32, 210, 3, 180, 158, 218, 115, 186, 66, 169, 100, + 117, 177, 90, 5, 237, 108, 154, 118, 218, 59, 81, 21, 152, 35, 64, 83, + 102, 75, 214, 137, 68, 153, 107, 29, 208, 239, 23, 232, 19, 230, 96, 177, + 196, 222, 144, 100, 58, 230, 79, 142, 4, 161, 126, 190, 145, 135, 215, 30, + 128, 153, 10, 98, 248, 73, 215, 56, 164, 145, 7, 224, 85, 184, 207, 135, + 205, 46, 23, 56, 65, 0, 207, 220, 153, 204, 106, 122, 184, 196, 165, 188, + 182, 25, 216, 47, 74, 68, 29, 113, 124, 159, 123, 227, 156, 168, 173, 240, + 208, 246, 152, 71, 43, 59, 21, 0, 15, 196, 194, 176, 215, 180, 237, 186, + 226, 243, 208, 66, 233, 146, 253, 107, 63, 4, 50, 202, 68, 229, 5, 202, + 233, 131, 33, 1, 153, 48, 20, 143, 82, 237, 215, 19, 32, 89, 128, 55, + 76, 90, 122, 227, 85, 132, 79, 94, 203, 5, 6, 188, 185, 99, 245, 121, + 67, 94, 15, 177, 217, 208, 140, 99, 13, 140, 60, 171, 159, 219, 210, 108, + 237, 71, 115, 94, 188, 121, 120, 12, 160, 233, 248, 14, 141, 189, 194, 45, + 216, 89, 156, 12, 234, 159, 224, 17, 219, 83, 137, 147, 77, 60, 44, 182, + 229, 72, 167, 11, 189, 205, 128, 149, 100, 216, 89, 178, 213, 247, 128, 70, + 79, 48, 20, 83, 38, 255, 154, 129, 240, 137, 143, 25, 70, 220, 151, 83, + 130, 36, 187, 157, 17, 77, 234, 156, 212, 224, 208, 208, 67, 8, 186, 181, + 66, 221, 150, 120, 87, 237, 2, 9, 111, 26, 24, 132, 168, 133, 202, 183, + 35, 143, 125, 76, 177, 79, 244, 188, 189, 68, 183, 138, 250, 211, 192, 82, + 157, 121, 18, 222, 121, 220, 238, 35, 176, 131, 140, 85, 63, 145, 61, 226, + 149, 61, 108, 6, 243, 10, 236, 162, 90, 178, 83, 16, 50, 1, 79, 115, + 144, 67, 169, 186, 75, 21, 153, 75, 40, 172, 118, 112, 167, 214, 195, 208, + 20, 90, 116, 162, 158, 158, 241, 84, 164, 73, 80, 99, 150, 89, 59, 230, + 216, 15, 55, 153, 213, 241, 82, 183, 231, 1, 161, 65, 83, 190, 143, 186, + 94, 6, 249, 212, 3, 150, 232, 253, 240, 130, 63, 197, 217, 165, 243, 195, + 205, 203, 137, 23, 205, 72, 76, 68, 82, 107, 226, 125, 55, 51, 147, 191, + 17, 142, 103, 65, 48, 155, 68, 171, 205, 157, 161, 173, 51, 16, 149, 130, + 216, 254, 1, 174, 170, 227, 129, 133, 145, 17, 8, 163, 97, 193, 248, 94, + 87, 150, 133, 131, 136, 3, 125, 203, 160, 42, 206, 13, 120, 253, 14, 86, + 83, 54, 119, 39, 145, 154, 141, 125, 219, 210, 106, 136, 99, 115, 120, 90, + 159, 16, 228, 176, 23, 58, 192, 25, 99, 78, 229, 205, 36, 16, 230, 252, + 105, 230, 9, 129, 149, 205, 139, 120, 6, 181, 230, 50, 1, 52, 80, 223, + 232, 231, 190, 149, 38, 178, 37, 169, 128, 244, 214, 199, 196, 173, 92, 127, + 248, 149, 69, 82, 224, 12, 153, 197, 107, 33, 100, 155, 40, 102, 164, 54, + 155, 51, 186, 231, 162, 44, 13, 247, 116, 229, 204, 123, 172, 248, 116, 22, + 222, 14, 60, 95, 242, 129, 232, 241, 226, 64, 173, 149, 44, 229, 231, 181, + 148, 142, 43, 12, 65, 26, 85, 207, 162, 105, 148, 222, 81, 138, 245, 216, + 45, 15, 9, 170, 147, 47, 131, 34, 218, 5, 156, 167, 37, 55, 149, 156, + 27, 144, 75, 92, 0, 123, 140, 49, 27, 36, 66, 17, 108, 94, 137, 179, + 83, 207, 181, 64, 191, 235, 55, 109, 189, 202, 132, 159, 137, 222, 89, 74, + 169, 163, 184, 177, 239, 69, 1, 42, 146, 184, 196, 17, 50, 117, 175, 32, + 125, 6, 12, 219, 165, 154, 10, 63, 116, 128, 127, 64, 154, 166, 68, 135, + 102, 241, 42, 123, 188, 145, 119, 49, 209, 230, 74, 94, 175, 105, 181, 101, + 237, 99, 85, 73, 84, 12, 186, 52, 232, 160, 204, 190, 134, 56, 106, 190, + 227, 41, 210, 100, 250, 239, 227, 69, 15, 206, 244, 22, 228, 73, 220, 198, + 193, 138, 230, 23, 68, 242, 192, 206, 78, 114, 200, 108, 40, 189, 29, 116, + 134, 146, 32, 246, 129, 155, 241, 125, 124, 16, 82, 217, 131, 245, 146, 175, + 203, 35, 14, 18, 104, 183, 8, 135, 65, 179, 113, 130, 36, 4, 30, 153, + 128, 81, 2, 90, 72, 132, 196, 125, 72, 247, 224, 114, 155, 134, 142, 221, + 69, 137, 135, 75, 243, 159, 33, 204, 116, 194, 186, 249, 218, 233, 179, 128, + 83, 222, 228, 251, 12, 94, 68, 243, 252, 196, 82, 246, 116, 61, 139, 127, + 76, 147, 29, 60, 154, 121, 102, 155, 181, 226, 25, 192, 35, 82, 165, 46, + 199, 130, 218, 236, 53, 144, 154, 33, 56, 243, 143, 125, 142, 248, 19, 2, + 48, 171, 105, 175, 230, 37, 183, 57, 39, 104, 162, 13, 46, 47, 35, 37, + 131, 71, 110, 160, 21, 78, 231, 100, 255, 18, 164, 36, 203, 193, 241, 243, + 100, 210, 128, 225, 60, 131, 11, 166, 150, 20, 82, 150, 220, 210, 86, 108, + 60, 132, 214, 98, 126, 206, 215, 81, 181, 135, 25, 167, 18, 226, 149, 145, + 1, 223, 151, 140, 164, 209, 214, 109, 68, 198, 248, 67, 54, 172, 131, 58, + 62, 166, 149, 187, 163, 205, 188, 209, 179, 103, 37, 98, 241, 219, 46, 187, + 118, 68, 8, 214, 173, 147, 113, 151, 144, 124, 215, 113, 102, 48, 167, 221, + 251, 224, 193, 30, 182, 50, 249, 185, 247, 243, 241, 171, 245, 249, 235, 115, + 56, 249, 109, 88, 104, 14, 115, 11, 28, 216, 199, 7, 173, 38, 204, 14, + 60, 79, 216, 246, 224, 186, 17, 222, 82, 242, 169, 139, 76, 33, 183, 247, + 28, 178, 123, 37, 47, 247, 184, 74, 249, 161, 104, 117, 49, 96, 94, 184, + 128, 88, 215, 7, 113, 36, 163, 223, 153, 152, 127, 125, 174, 130, 167, 38, + 9, 46, 161, 207, 139, 129, 242, 22, 176, 88, 20, 115, 75, 103, 198, 123, + 153, 45, 232, 44, 145, 203, 170, 24, 153, 36, 114, 142, 254, 140, 179, 57, + 152, 69, 18, 157, 204, 0, 21, 229, 203, 98, 110, 210, 95, 20, 219, 241, + 30, 5, 61, 240, 76, 80, 152, 192, 146, 93, 155, 19, 160, 238, 75, 189, + 111, 26, 138, 47, 165, 8, 233, 31, 102, 246, 251, 85, 154, 212, 213, 123, + 49, 190, 141, 20, 129, 94, 229, 53, 228, 208, 53, 73, 118, 163, 20, 213, + 160, 219, 184, 167, 205, 16, 134, 150, 190, 43, 57, 122, 129, 199, 116, 222, + 86, 129, 106, 220, 79, 79, 187, 97, 131, 145, 221, 186, 130, 96, 242, 116, + 194, 220, 106, 66, 112, 17, 157, 39, 99, 247, 151, 150, 80, 245, 181, 215, + 103, 166, 165, 154, 118, 42, 6, 6, 159, 251, 202, 129, 193, 155, 55, 233, + 246, 122, 190, 198, 220, 93, 88, 71, 96, 224, 242, 36, 6, 109, 156, 160, + 38, 67, 156, 98, 186, 33, 83, 34, 170, 143, 20, 126, 199, 140, 234, 54, + 211, 59, 37, 106, 239, 149, 175, 162, 73, 129, 251, 197, 174, 146, 22, 110, + 72, 72, 112, 130, 65, 126, 156, 230, 253, 126, 140, 197, 155, 141, 20, 77, + 115, 214, 129, 42, 52, 225, 245, 6, 49, 135, 38, 13, 48, 174, 160, 125, + 154, 183, 161, 57, 186, 114, 247, 247, 138, 238, 16, 127, 192, 247, 83, 74, + 175, 120, 166, 116, 104, 87, 88, 115, 18, 101, 70, 203, 82, 147, 223, 98, + 122, 22, 95, 122, 111, 156, 3, 87, 157, 159, 101, 218, 212, 49, 195, 117, + 90, 165, 165, 30, 90, 235, 218, 232, 147, 157, 88, 76, 49, 217, 31, 230, + 9, 237, 241, 107, 111, 97, 79, 67, 155, 10, 198, 52, 139, 29, 122, 235, + 105, 12, 103, 2, 242, 133, 218, 151, 197, 193, 234, 175, 253, 37, 37, 198, + 197, 237, 232, 43, 84, 93, 28, 173, 212, 212, 228, 10, 77, 130, 26, 206, + 163, 17, 72, 80, 163, 94, 215, 51, 187, 172, 18, 53, 191, 210, 245, 189, + 131, 210, 195, 67, 251, 231, 91, 68, 200, 64, 76, 221, 71, 39, 117, 217, + 186, 48, 245, 237, 22, 252, 92, 144, 246, 221, 200, 110, 64, 138, 122, 140, + 116, 123, 113, 88, 28, 201, 171, 180, 100, 102, 164, 47, 117, 231, 26, 177, + 37, 22, 224, 116, 0, 168, 122, 72, 105, 145, 19, 236, 67, 72, 165, 64, + 42, 240, 143, 176, 57, 123, 124, 123, 110, 255, 65, 177, 107, 24, 147, 32, + 141, 68, 18, 19, 191, 81, 155, 218, 159, 72, 50, 110, 25, 128, 144, 82, + 202, 173, 116, 204, 48, 228, 110, 202, 203, 125, 190, 17, 228, 41, 88, 82, + 57, 118, 218, 210, 204, 202, 176, 207, 13, 86, 159, 177, 82, 83, 228, 155, + 109, 90, 24, 154, 62, 5, 122, 165, 131, 22, 50, 96, 124, 100, 187, 105, + 127, 210, 149, 88, 83, 24, 42, 183, 150, 89, 87, 249, 135, 240, 30, 233, + 110, 34, 235, 3, 25, 80, 23, 186, 225, 215, 146, 204, 47, 117, 82, 192, + 156, 69, 135, 7, 87, 208, 115, 238, 33, 153, 231, 112, 31, 70, 188, 128, + 64, 57, 13, 233, 149, 88, 189, 22, 204, 55, 240, 179, 19, 227, 147, 160, + 34, 37, 242, 134, 172, 135, 50, 123, 233, 197, 223, 196, 22, 126, 91, 155, + 248, 31, 194, 5, 127, 247, 59, 161, 255, 166, 226, 75, 153, 253, 133, 8, + 127, 125, 243, 254, 191, 10, 10, 252, 23, 44, 247, 175, 90, 156, 179, 33, + 250, 21, 101, 248, 187, 255, 64, 161, 255, 229, 119, 127, 234, 254, 93, 24, + 160, 207, 243, 42, 169, 162, 182, 61, 191, 190, 139, 125, 254, 22, 157, 200, + 230, 175, 189, 90, 202, 239, 128, 129, 34, 41, 212, 175, 3, 255, 238, 15, + 213, 31, 127, 167, 124, 247, 224, 87, 209, 229, 236, 171, 253, 223, 168, 105, + 249, 221, 119, 13, 226, 191, 255, 253, 205, 222, 249, 41, 235, 146, 242, 171, + 235, 187, 127, 184, 187, 149, 87, 203, 87, 63, 21, 81, 87, 93, 191, 110, + 229, 247, 95, 251, 61, 94, 202, 239, 181, 150, 159, 254, 187, 253, 251, 220, + 223, 138, 54, 223, 27, 213, 252, 189, 125, 95, 51, 107, 219, 239, 223, 81, + 146, 100, 243, 252, 235, 105, 100, 73, 217, 85, 201, 111, 71, 54, 93, 191, + 183, 89, 90, 252, 86, 255, 249, 102, 23, 211, 217, 119, 217, 63, 254, 169, + 251, 250, 195, 60, 68, 221, 119, 255, 251, 233, 159, 127, 247, 191, 112, 28, + 134, 129, 224, 77, 250, 255, 170, 247, 223, 247, 246, 253, 164, 254, 242, 108, + 231, 191, 196, 61, 254, 42, 200, 241, 215, 79, 230, 31, 255, 54, 194, 242, + 255, 95, 216, 65, 14, 190, 63, 159, 255, 90, 50, 217, 89, 164, 239, 3, + 232, 20, 250, 181, 236, 243, 241, 120, 16, 149, 200, 216, 175, 24, 19, 129, + 71, 142, 191, 78, 117, 186, 136, 237, 189, 227, 185, 144, 87, 145, 23, 21, + 79, 86, 219, 83, 10, 211, 216, 149, 152, 84, 246, 131, 234, 149, 158, 202, + 94, 113, 187, 10, 226, 97, 192, 101, 245, 204, 55, 28, 32, 145, 4, 169, + 240, 53, 62, 30, 185, 68, 237, 175, 75, 65, 201, 71, 13, 17, 15, 7, + 85, 175, 9, 7, 30, 27, 66, 230, 185, 188, 37, 200, 19, 200, 71, 176, + 159, 42, 231, 254, 52, 63, 117, 176, 151, 206, 41, 134, 151, 203, 61, 201, + 146, 54, 56, 227, 196, 31, 70, 143, 2, 31, 38, 71, 141, 1, 203, 182, + 16, 212, 54, 113, 157, 39, 118, 73, 110, 211, 68, 120, 91, 167, 24, 235, + 115, 125, 36, 80, 138, 243, 11, 81, 89, 153, 92, 25, 233, 16, 215, 232, + 170, 239, 221, 228, 77, 31, 133, 249, 52, 209, 154, 125, 134, 149, 201, 125, + 168, 244, 160, 249, 121, 51, 11, 125, 39, 5, 108, 140, 97, 100, 152, 86, + 104, 80, 134, 51, 246, 32, 214, 120, 35, 45, 2, 228, 21, 12, 188, 243, + 155, 80, 100, 208, 202, 82, 179, 170, 195, 67, 188, 158, 189, 18, 249, 173, + 252, 94, 112, 29, 121, 159, 105, 108, 30, 169, 142, 44, 113, 54, 12, 227, + 61, 246, 70, 217, 117, 248, 240, 101, 113, 230, 44, 87, 248, 134, 27, 108, + 4, 46, 8, 187, 39, 175, 186, 30, 63, 82, 41, 37, 160, 114, 5, 141, + 88, 197, 39, 145, 43, 111, 48, 213, 31, 91, 252, 236, 219, 215, 211, 203, + 195, 35, 114, 221, 82, 181, 192, 45, 184, 200, 77, 56, 146, 8, 31, 113, + 224, 156, 240, 215, 242, 153, 36, 64, 103, 137, 78, 178, 187, 9, 91, 207, + 189, 139, 237, 121, 28, 207, 168, 197, 214, 160, 13, 51, 53, 25, 116, 173, + 10, 14, 48, 70, 148, 0, 34, 171, 177, 29, 129, 166, 31, 189, 178, 27, + 121, 40, 241, 195, 33, 20, 202, 218, 135, 229, 212, 227, 49, 235, 205, 161, + 231, 175, 148, 193, 51, 249, 136, 37, 110, 92, 201, 211, 172, 67, 113, 199, + 13, 30, 74, 53, 102, 189, 199, 0, 143, 254, 235, 82, 63, 0, 14, 1, + 55, 143, 76, 154, 21, 75, 248, 41, 123, 175, 117, 240, 6, 227, 67, 209, + 150, 165, 20, 188, 21, 81, 107, 79, 59, 246, 248, 210, 98, 124, 251, 192, + 208, 148, 78, 120, 188, 61, 208, 235, 115, 206, 78, 161, 2, 185, 26, 0, + 249, 90, 35, 37, 6, 135, 136, 223, 201, 50, 190, 94, 225, 203, 216, 125, + 40, 119, 182, 85, 29, 137, 153, 123, 56, 179, 190, 140, 64, 177, 10, 178, + 66, 214, 252, 60, 240, 193, 105, 186, 193, 68, 199, 33, 151, 228, 182, 244, + 60, 14, 208, 148, 8, 94, 224, 35, 240, 121, 54, 42, 172, 55, 139, 16, + 55, 54, 118, 38, 13, 109, 219, 144, 144, 156, 50, 34, 21, 151, 227, 211, + 173, 71, 224, 96, 180, 248, 130, 206, 251, 12, 183, 122, 136, 173, 110, 231, + 234, 213, 232, 155, 51, 155, 109, 250, 120, 34, 209, 239, 59, 177, 126, 102, + 228, 30, 20, 25, 201, 160, 57, 49, 7, 169, 179, 92, 125, 34, 37, 105, + 158, 160, 89, 70, 62, 95, 221, 218, 83, 145, 15, 101, 4, 187, 40, 170, + 54, 6, 46, 19, 11, 55, 119, 34, 69, 215, 168, 216, 77, 239, 231, 114, + 121, 9, 83, 160, 199, 39, 226, 140, 178, 60, 215, 73, 15, 203, 88, 205, + 187, 170, 252, 121, 111, 128, 196, 38, 130, 91, 243, 55, 245, 28, 219, 195, + 36, 73, 136, 240, 79, 235, 225, 113, 246, 13, 138, 125, 21, 176, 218, 84, + 151, 99, 39, 24, 40, 147, 242, 134, 125, 82, 69, 69, 62, 21, 193, 205, + 223, 159, 246, 51, 105, 20, 167, 21, 51, 243, 222, 183, 13, 193, 193, 140, + 95, 103, 28, 97, 16, 140, 77, 83, 31, 156, 26, 215, 27, 75, 120, 89, + 84, 212, 59, 65, 80, 137, 85, 37, 168, 59, 207, 79, 178, 53, 1, 185, + 35, 120, 187, 66, 146, 245, 71, 71, 190, 130, 1, 161, 44, 27, 74, 177, + 27, 118, 170, 175, 80, 26, 65, 203, 229, 109, 215, 113, 69, 225, 245, 44, + 121, 229, 53, 7, 22, 52, 93, 169, 29, 176, 102, 87, 76, 11, 221, 79, + 243, 107, 111, 94, 129, 50, 176, 1, 89, 68, 201, 166, 196, 176, 22, 145, + 198, 141, 195, 95, 25, 126, 101, 143, 120, 254, 40, 2, 95, 186, 66, 253, + 82, 79, 77, 195, 149, 85, 34, 253, 231, 155, 38, 146, 250, 205, 195, 146, + 24, 119, 158, 186, 83, 239, 105, 52, 110, 204, 113, 195, 203, 32, 81, 120, + 187, 22, 159, 51, 119, 186, 199, 0, 237, 47, 251, 232, 163, 195, 114, 96, + 237, 170, 95, 228, 39, 101, 206, 86, 144, 136, 32, 97, 3, 25, 98, 53, + 186, 97, 62, 220, 245, 80, 32, 178, 108, 112, 16, 216, 74, 171, 168, 180, + 119, 80, 238, 159, 45, 86, 146, 93, 156, 158, 111, 53, 51, 196, 73, 13, + 229, 220, 67, 65, 0, 197, 95, 20, 102, 85, 122, 137, 85, 148, 114, 92, + 246, 3, 65, 200, 189, 220, 220, 45, 84, 163, 23, 74, 171, 80, 8, 138, + 236, 148, 88, 176, 232, 73, 40, 212, 104, 44, 25, 48, 110, 244, 8, 44, + 126, 120, 161, 207, 34, 86, 4, 7, 198, 193, 234, 6, 135, 190, 82, 41, + 54, 94, 37, 76, 225, 64, 234, 122, 200, 221, 130, 103, 8, 48, 6, 154, + 76, 41, 192, 164, 69, 49, 35, 62, 106, 62, 25, 135, 44, 32, 6, 220, + 173, 68, 103, 235, 250, 154, 15, 83, 186, 122, 238, 157, 95, 22, 15, 102, + 118, 76, 2, 169, 50, 55, 32, 97, 4, 246, 118, 195, 155, 133, 6, 190, + 66, 7, 128, 59, 179, 236, 112, 113, 112, 205, 73, 197, 106, 91, 119, 89, + 92, 90, 250, 52, 75, 233, 100, 143, 194, 143, 129, 210, 3, 103, 35, 108, + 246, 113, 106, 37, 126, 69, 115, 66, 133, 195, 141, 37, 159, 161, 12, 38, + 80, 57, 106, 68, 26, 121, 99, 19, 218, 48, 38, 17, 152, 130, 196, 197, + 59, 168, 61, 94, 131, 139, 147, 92, 247, 247, 244, 36, 106, 201, 214, 102, + 244, 56, 122, 117, 40, 193, 53, 56, 147, 115, 114, 9, 237, 0, 20, 118, + 39, 212, 18, 244, 250, 25, 75, 213, 1, 42, 179, 225, 213, 198, 56, 163, + 166, 79, 32, 156, 134, 62, 126, 34, 5, 202, 135, 5, 85, 89, 182, 160, + 133, 0, 70, 189, 219, 56, 73, 158, 32, 220, 93, 241, 55, 24, 83, 210, + 169, 15, 221, 234, 121, 9, 207, 217, 191, 25, 157, 216, 193, 210, 115, 7, + 102, 46, 218, 80, 163, 206, 224, 211, 154, 139, 120, 164, 129, 185, 101, 23, + 224, 48, 161, 164, 131, 219, 220, 157, 115, 51, 27, 235, 235, 48, 239, 1, + 199, 59, 142, 203, 190, 3, 130, 84, 6, 104, 196, 69, 46, 202, 212, 206, + 126, 124, 212, 180, 89, 199, 178, 114, 5, 21, 66, 41, 119, 222, 249, 80, + 58, 171, 213, 61, 169, 238, 130, 221, 149, 147, 75, 107, 114, 162, 8, 115, + 63, 99, 182, 128, 208, 16, 34, 227, 135, 27, 132, 194, 85, 3, 242, 158, + 248, 131, 253, 225, 83, 1, 165, 72, 161, 184, 36, 0, 110, 22, 55, 72, + 165, 118, 88, 55, 254, 69, 35, 125, 7, 197, 76, 192, 151, 194, 78, 38, + 199, 240, 250, 136, 16, 192, 203, 125, 206, 55, 198, 3, 221, 95, 53, 213, + 123, 1, 249, 241, 19, 209, 126, 33, 143, 138, 35, 230, 104, 130, 194, 160, + 122, 202, 239, 166, 181, 107, 170, 28, 207, 170, 96, 94, 149, 27, 67, 30, + 68, 6, 25, 59, 163, 129, 34, 204, 176, 52, 158, 74, 151, 84, 61, 200, + 18, 209, 214, 61, 197, 9, 78, 200, 224, 166, 194, 40, 192, 54, 81, 76, + 75, 86, 74, 186, 44, 84, 109, 231, 9, 236, 64, 241, 170, 3, 40, 144, + 35, 228, 105, 209, 160, 99, 240, 105, 80, 63, 202, 51, 219, 151, 21, 24, + 111, 112, 25, 68, 104, 49, 31, 180, 130, 16, 175, 131, 69, 136, 170, 137, + 228, 117, 179, 20, 111, 63, 19, 66, 208, 46, 62, 92, 115, 156, 95, 125, + 176, 245, 163, 84, 56, 182, 181, 0, 229, 18, 141, 74, 243, 228, 87, 121, + 113, 6, 44, 130, 221, 171, 36, 71, 140, 22, 230, 249, 134, 221, 130, 209, + 33, 15, 211, 45, 89, 138, 199, 68, 110, 199, 158, 192, 8, 165, 22, 23, + 110, 207, 44, 153, 66, 68, 244, 89, 14, 204, 70, 20, 117, 99, 202, 218, + 101, 152, 220, 140, 122, 226, 139, 70, 33, 232, 137, 157, 83, 230, 88, 116, + 244, 193, 191, 131, 211, 247, 198, 165, 94, 77, 143, 26, 237, 188, 114, 69, + 133, 223, 53, 101, 27, 60, 130, 138, 72, 76, 16, 52, 164, 123, 142, 140, + 190, 101, 67, 80, 26, 24, 202, 153, 79, 96, 177, 53, 79, 42, 93, 137, + 52, 54, 42, 27, 119, 99, 105, 166, 167, 204, 63, 5, 45, 103, 160, 45, + 118, 33, 2, 181, 104, 31, 121, 176, 86, 181, 179, 208, 71, 215, 140, 103, + 37, 65, 111, 126, 23, 210, 216, 33, 97, 243, 4, 108, 36, 180, 251, 219, + 238, 126, 58, 47, 56, 62, 57, 63, 64, 143, 167, 233, 63, 32, 165, 80, + 159, 15, 81, 4, 242, 14, 219, 60, 114, 170, 36, 167, 120, 4, 10, 228, + 209, 192, 48, 183, 17, 126, 15, 110, 214, 215, 244, 74, 176, 103, 76, 127, + 119, 161, 82, 24, 96, 254, 242, 115, 238, 17, 183, 7, 83, 99, 244, 186, + 40, 72, 147, 240, 200, 28, 21, 254, 13, 248, 142, 176, 89, 57, 50, 116, + 184, 205, 225, 92, 60, 37, 43, 252, 225, 139, 247, 187, 41, 55, 185, 95, + 142, 123, 68, 87, 100, 88, 189, 111, 187, 152, 171, 190, 94, 146, 54, 6, + 207, 239, 118, 177, 94, 220, 194, 135, 106, 128, 155, 83, 244, 106, 8, 88, + 189, 200, 234, 51, 150, 110, 77, 16, 10, 211, 184, 200, 128, 196, 104, 231, + 231, 144, 179, 77, 41, 2, 216, 135, 119, 132, 27, 174, 123, 150, 99, 245, + 242, 61, 245, 117, 197, 122, 204, 94, 252, 132, 95, 161, 198, 171, 244, 249, + 124, 119, 105, 207, 34, 145, 156, 251, 175, 13, 8, 49, 33, 185, 71, 119, + 235, 141, 28, 100, 49, 56, 139, 46, 236, 97, 94, 118, 178, 195, 253, 150, + 78, 212, 53, 185, 157, 174, 233, 147, 68, 85, 71, 106, 9, 88, 205, 221, + 220, 11, 206, 70, 228, 1, 88, 87, 174, 70, 159, 24, 232, 0, 83, 219, + 1, 129, 159, 33, 25, 188, 100, 181, 73, 65, 122, 38, 113, 107, 127, 173, + 151, 170, 209, 32, 111, 182, 84, 179, 30, 31, 34, 145, 90, 107, 23, 250, + 182, 50, 175, 30, 74, 184, 249, 48, 35, 231, 37, 232, 164, 181, 144, 121, + 17, 230, 183, 175, 86, 12, 243, 215, 178, 9, 217, 114, 48, 110, 106, 190, + 195, 193, 255, 252, 207, 191, 177, 134, 255, 91, 32, 255, 70, 170, 243, 231, + 134, 244, 127, 164, 214, 165, 236, 167, 127, 250, 22, 12, 249, 207, 22, 140, + 84, 127, 252, 199, 191, 93, 25, 242, 183, 255, 43, 223, 164, 96, 249, 179, + 8, 203, 175, 6, 97, 16, 250, 214, 38, 121, 64, 200, 175, 70, 254, 240, + 248, 237, 146, 127, 233, 224, 47, 133, 146, 223, 84, 90, 254, 85, 128, 228, + 183, 95, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, + 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, + 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, + 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, + 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, + 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, + 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, + 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, + 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, + 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, + 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, + 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, + 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, 35, 63, 202, + 35, 63, 202, 35, 63, 202, 35, 255, 243, 202, 35, 223, 37, 69, 191, 222, + 191, 228, 65, 218, 181, 248, 135, 170, 251, 186, 55, 191, 163, 179, 233, 183, + 230, 200, 221, 221, 175, 126, 200, 186, 127, 152, 239, 173, 36, 251, 250, 46, + 153, 25, 77, 85, 54, 255, 173, 26, 201, 189, 131, 145, 62, 197, 111, 213, + 70, 25, 0, 184, 187, 255, 25, 218, 111, 25, 19, 233, 59, 234, 251, 101, + 76, 253, 119, 93, 208, 239, 66, 157, 202, 175, 86, 206, 239, 194, 163, 91, + 84, 181, 81, 220, 102, 95, 209, 242, 79, 127, 83, 178, 243, 47, 57, 147, + 255, 83, 81, 100, 234, 241, 231, 44, 200, 110, 191, 112, 244, 223, 162, 200, + 14, 67, 125, 255, 113, 194, 228, 88, 186, 72, 12, 238, 48, 37, 214, 68, + 95, 60, 157, 8, 204, 190, 155, 130, 53, 27, 146, 93, 31, 229, 153, 244, + 54, 116, 219, 215, 55, 62, 21, 12, 215, 24, 96, 113, 91, 131, 74, 119, + 47, 191, 74, 109, 25, 213, 143, 194, 23, 232, 2, 241, 133, 230, 173, 176, + 102, 204, 237, 104, 38, 90, 7, 19, 33, 197, 121, 15, 215, 72, 164, 31, + 107, 82, 218, 162, 113, 180, 129, 219, 106, 187, 118, 52, 169, 104, 45, 218, + 171, 212, 180, 44, 40, 54, 245, 77, 248, 28, 213, 109, 29, 188, 149, 117, + 83, 155, 185, 83, 193, 165, 224, 169, 33, 215, 67, 118, 115, 249, 113, 101, + 214, 146, 77, 125, 164, 138, 74, 132, 155, 21, 212, 97, 255, 230, 14, 245, + 33, 221, 92, 115, 199, 223, 93, 233, 229, 75, 5, 86, 197, 187, 14, 62, + 242, 245, 106, 221, 234, 26, 146, 243, 54, 252, 163, 222, 91, 101, 46, 133, + 22, 81, 75, 21, 253, 81, 15, 115, 148, 207, 145, 31, 34, 210, 85, 142, + 178, 44, 37, 226, 35, 157, 93, 143, 220, 102, 120, 147, 71, 185, 18, 183, + 102, 20, 174, 181, 246, 226, 181, 105, 51, 44, 131, 24, 218, 58, 79, 174, + 123, 74, 184, 47, 104, 15, 203, 150, 105, 163, 6, 43, 137, 185, 45, 137, + 5, 69, 1, 108, 23, 46, 221, 98, 221, 43, 169, 164, 147, 255, 46, 49, + 151, 40, 5, 206, 110, 47, 188, 27, 69, 100, 155, 96, 184, 13, 193, 113, + 14, 192, 119, 22, 190, 161, 70, 183, 179, 201, 62, 95, 111, 171, 18, 11, + 68, 203, 110, 187, 144, 98, 238, 251, 105, 204, 202, 170, 76, 248, 114, 15, + 114, 251, 134, 171, 26, 168, 211, 42, 240, 110, 247, 83, 40, 118, 157, 53, + 33, 95, 45, 213, 167, 233, 14, 147, 205, 94, 118, 90, 183, 125, 141, 205, + 171, 122, 67, 205, 220, 227, 158, 174, 123, 28, 54, 3, 155, 134, 165, 59, + 9, 159, 25, 177, 107, 203, 117, 95, 191, 15, 28, 6, 175, 212, 103, 163, + 203, 16, 214, 137, 130, 29, 8, 142, 111, 51, 122, 198, 94, 89, 123, 80, + 208, 220, 207, 179, 147, 25, 141, 87, 161, 247, 149, 30, 8, 156, 29, 197, + 169, 93, 106, 41, 30, 56, 214, 86, 34, 222, 157, 34, 90, 87, 188, 170, + 66, 206, 162, 86, 15, 172, 169, 216, 33, 183, 31, 225, 212, 239, 55, 48, + 206, 193, 170, 124, 192, 87, 68, 202, 86, 227, 19, 55, 145, 139, 252, 154, + 228, 76, 150, 152, 148, 234, 87, 85, 169, 46, 57, 174, 39, 161, 199, 23, + 52, 179, 208, 30, 214, 78, 143, 178, 116, 237, 181, 150, 230, 22, 207, 23, + 200, 62, 63, 182, 129, 148, 214, 49, 107, 71, 246, 112, 172, 24, 123, 46, + 248, 103, 29, 166, 101, 11, 235, 114, 66, 219, 49, 130, 139, 83, 57, 113, + 176, 174, 186, 189, 56, 30, 80, 65, 111, 195, 241, 124, 172, 199, 43, 190, + 206, 151, 127, 45, 210, 59, 25, 3, 250, 149, 136, 208, 231, 246, 18, 31, + 75, 24, 10, 221, 189, 161, 35, 184, 3, 218, 229, 98, 102, 245, 94, 147, + 138, 249, 56, 244, 131, 24, 203, 43, 15, 203, 155, 25, 90, 198, 19, 211, + 140, 98, 31, 144, 120, 145, 59, 244, 12, 38, 189, 151, 20, 186, 241, 21, + 252, 244, 112, 179, 254, 28, 145, 214, 134, 250, 155, 27, 104, 165, 233, 142, + 154, 109, 182, 23, 171, 152, 225, 77, 208, 98, 11, 35, 163, 30, 130, 252, + 224, 141, 28, 34, 132, 166, 190, 118, 38, 194, 195, 251, 192, 152, 101, 192, + 57, 83, 9, 204, 43, 110, 119, 220, 133, 206, 50, 109, 221, 197, 119, 101, + 78, 117, 233, 183, 195, 1, 105, 212, 156, 88, 210, 52, 167, 217, 240, 174, + 117, 61, 176, 158, 65, 24, 175, 122, 237, 167, 2, 91, 55, 212, 1, 143, + 168, 2, 122, 20, 199, 33, 52, 62, 7, 4, 106, 130, 143, 176, 229, 45, + 148, 251, 46, 242, 92, 221, 233, 243, 225, 45, 216, 107, 162, 51, 184, 108, + 223, 102, 100, 89, 181, 5, 232, 93, 230, 30, 6, 24, 28, 180, 40, 56, + 60, 24, 159, 173, 31, 14, 79, 36, 61, 27, 137, 210, 2, 225, 131, 55, + 180, 225, 51, 8, 2, 186, 227, 227, 19, 43, 55, 53, 246, 153, 238, 217, + 103, 71, 2, 185, 70, 94, 28, 167, 111, 209, 101, 150, 70, 252, 54, 14, + 121, 247, 75, 3, 132, 165, 204, 166, 228, 173, 222, 80, 170, 26, 112, 107, + 28, 176, 243, 239, 26, 186, 24, 18, 189, 45, 241, 131, 12, 141, 159, 227, + 228, 67, 177, 231, 81, 42, 81, 195, 248, 85, 95, 151, 248, 62, 224, 138, + 225, 168, 108, 190, 63, 255, 249, 199, 184, 16, 98, 245, 233, 9, 123, 154, + 206, 227, 175, 246, 231, 200, 147, 208, 144, 224, 192, 179, 174, 9, 150, 253, + 47, 251, 183, 107, 192, 86, 67, 93, 241, 21, 153, 229, 213, 79, 132, 48, + 253, 222, 79, 174, 87, 143, 233, 74, 129, 144, 247, 21, 52, 223, 57, 159, + 112, 81, 124, 124, 46, 232, 176, 239, 234, 194, 252, 227, 183, 204, 77, 233, + 0, 96, 199, 117, 169, 216, 177, 108, 161, 37, 97, 77, 6, 193, 98, 165, + 179, 23, 31, 125, 231, 103, 126, 255, 91, 62, 2, 248, 178, 143, 74, 48, + 3, 6, 212, 45, 115, 5, 45, 183, 79, 170, 102, 30, 240, 206, 69, 72, + 240, 190, 71, 11, 40, 64, 216, 45, 244, 14, 153, 72, 140, 77, 62, 239, + 173, 59, 241, 238, 198, 130, 57, 149, 63, 240, 43, 62, 89, 242, 253, 22, + 104, 70, 47, 85, 56, 56, 113, 214, 26, 131, 203, 234, 1, 145, 96, 196, + 167, 90, 8, 22, 216, 64, 105, 254, 68, 71, 83, 236, 113, 2, 246, 194, + 166, 10, 129, 169, 4, 212, 129, 127, 81, 100, 196, 189, 164, 52, 166, 20, + 128, 82, 228, 19, 209, 27, 253, 177, 204, 176, 157, 191, 220, 178, 143, 121, + 91, 37, 47, 192, 194, 244, 33, 190, 137, 109, 205, 3, 133, 188, 5, 53, + 33, 73, 216, 237, 159, 199, 212, 231, 142, 19, 198, 117, 170, 40, 168, 16, + 110, 198, 41, 71, 152, 92, 144, 46, 171, 224, 209, 157, 122, 95, 75, 108, + 178, 223, 122, 58, 166, 138, 96, 32, 23, 61, 125, 230, 233, 49, 143, 14, + 64, 155, 18, 26, 228, 29, 10, 49, 203, 114, 90, 169, 80, 9, 76, 108, + 2, 8, 161, 213, 64, 96, 24, 243, 8, 104, 109, 139, 28, 189, 24, 22, + 222, 92, 157, 177, 69, 155, 144, 167, 227, 114, 119, 115, 89, 114, 71, 123, + 212, 57, 231, 82, 121, 118, 232, 33, 106, 15, 194, 157, 163, 167, 71, 80, + 136, 200, 52, 64, 201, 168, 189, 221, 24, 243, 94, 180, 73, 51, 20, 211, + 155, 76, 138, 138, 84, 247, 124, 190, 236, 38, 208, 242, 98, 226, 243, 183, + 126, 187, 57, 101, 110, 79, 224, 0, 164, 15, 142, 31, 115, 104, 152, 132, + 9, 72, 51, 75, 45, 251, 214, 239, 117, 51, 54, 21, 166, 114, 108, 219, + 12, 23, 83, 243, 124, 195, 158, 121, 81, 83, 100, 28, 3, 163, 82, 64, + 37, 162, 47, 33, 240, 10, 5, 166, 109, 30, 43, 222, 200, 72, 10, 153, + 37, 103, 24, 152, 98, 113, 180, 227, 158, 43, 240, 185, 29, 9, 66, 217, + 87, 97, 153, 22, 250, 76, 140, 220, 255, 200, 37, 117, 77, 12, 126, 198, + 196, 7, 107, 30, 186, 124, 29, 89, 193, 212, 221, 195, 132, 218, 143, 23, + 112, 74, 75, 44, 75, 231, 161, 2, 74, 128, 212, 229, 239, 96, 154, 60, + 180, 206, 187, 97, 27, 62, 61, 118, 40, 219, 240, 213, 6, 71, 141, 74, + 0, 189, 55, 210, 75, 186, 84, 98, 173, 86, 6, 93, 93, 40, 170, 80, + 212, 100, 7, 14, 172, 5, 222, 122, 64, 137, 239, 201, 31, 229, 209, 105, + 9, 164, 121, 142, 241, 204, 81, 38, 71, 176, 230, 61, 28, 154, 235, 150, + 31, 202, 238, 123, 113, 85, 110, 150, 50, 23, 133, 137, 102, 113, 25, 245, + 47, 176, 72, 136, 168, 134, 151, 57, 175, 75, 196, 4, 152, 14, 102, 222, + 222, 171, 180, 176, 130, 123, 2, 12, 198, 4, 148, 177, 99, 188, 218, 44, + 126, 76, 17, 12, 227, 178, 207, 92, 247, 227, 189, 224, 164, 169, 42, 111, + 67, 60, 117, 70, 65, 113, 249, 61, 107, 24, 154, 227, 166, 64, 220, 105, + 75, 114, 104, 228, 123, 233, 152, 9, 191, 93, 86, 120, 180, 100, 162, 249, + 21, 247, 230, 205, 138, 231, 53, 128, 239, 11, 49, 30, 7, 217, 50, 189, + 201, 228, 16, 132, 24, 192, 137, 43, 187, 54, 64, 138, 139, 217, 42, 170, + 148, 203, 226, 129, 84, 33, 83, 113, 47, 171, 46, 86, 163, 70, 73, 246, + 185, 67, 239, 226, 24, 142, 107, 167, 142, 81, 171, 38, 24, 185, 17, 162, + 150, 244, 21, 227, 169, 54, 77, 224, 113, 71, 181, 242, 64, 191, 95, 11, + 219, 238, 179, 27, 60, 66, 239, 246, 101, 14, 133, 148, 151, 42, 38, 29, + 85, 206, 52, 144, 203, 128, 218, 251, 225, 119, 114, 37, 152, 190, 26, 119, + 75, 129, 198, 47, 60, 219, 31, 201, 26, 4, 213, 124, 52, 161, 55, 107, + 194, 226, 193, 129, 29, 90, 86, 32, 153, 156, 208, 236, 3, 26, 7, 225, + 116, 20, 26, 67, 42, 77, 169, 4, 206, 248, 153, 66, 113, 122, 130, 29, + 63, 209, 240, 251, 238, 172, 27, 217, 0, 250, 145, 2, 82, 181, 16, 126, + 69, 91, 176, 41, 118, 74, 152, 223, 236, 238, 226, 153, 223, 60, 190, 51, + 182, 109, 190, 152, 79, 28, 125, 203, 143, 88, 99, 51, 168, 117, 111, 4, + 129, 117, 138, 101, 131, 167, 5, 127, 46, 193, 182, 168, 143, 195, 53, 230, + 37, 99, 138, 7, 120, 60, 179, 162, 70, 203, 83, 61, 175, 118, 152, 229, + 35, 86, 54, 16, 47, 190, 204, 218, 151, 238, 223, 143, 171, 136, 84, 242, + 144, 195, 122, 61, 25, 155, 102, 107, 228, 198, 222, 108, 177, 172, 125, 143, + 37, 50, 205, 73, 117, 247, 93, 91, 220, 122, 63, 15, 227, 136, 216, 6, + 211, 45, 218, 60, 22, 114, 198, 234, 139, 74, 119, 206, 26, 177, 115, 80, + 165, 130, 149, 119, 149, 45, 240, 181, 1, 234, 14, 130, 107, 247, 186, 20, + 7, 66, 6, 204, 132, 49, 15, 54, 90, 185, 57, 175, 218, 156, 228, 217, + 26, 196, 189, 4, 217, 56, 127, 129, 25, 45, 80, 137, 139, 190, 61, 173, + 78, 187, 146, 184, 225, 78, 53, 84, 147, 177, 33, 56, 6, 180, 142, 118, + 222, 79, 117, 220, 192, 36, 63, 143, 35, 51, 201, 164, 110, 58, 96, 93, + 172, 103, 128, 104, 59, 57, 199, 249, 91, 105, 250, 136, 243, 24, 228, 110, + 184, 83, 226, 161, 172, 168, 79, 71, 208, 90, 66, 153, 2, 156, 199, 9, + 11, 19, 39, 219, 213, 246, 44, 190, 6, 23, 216, 166, 15, 96, 99, 18, + 83, 7, 129, 106, 154, 94, 42, 212, 148, 20, 82, 1, 157, 1, 64, 81, + 15, 198, 112, 105, 104, 82, 127, 46, 140, 27, 93, 251, 12, 79, 123, 17, + 94, 225, 96, 212, 161, 42, 46, 111, 197, 92, 11, 103, 247, 195, 252, 133, + 194, 189, 192, 151, 240, 168, 63, 43, 59, 63, 45, 182, 72, 160, 231, 244, + 58, 157, 13, 55, 96, 216, 37, 245, 185, 203, 146, 144, 54, 56, 143, 240, + 227, 190, 49, 40, 129, 166, 107, 195, 19, 189, 224, 141, 129, 240, 213, 189, + 3, 104, 107, 62, 156, 244, 170, 75, 27, 44, 249, 48, 9, 22, 146, 13, + 20, 135, 226, 68, 46, 231, 81, 195, 31, 250, 71, 218, 80, 243, 146, 28, + 39, 111, 146, 66, 123, 144, 234, 133, 3, 199, 39, 141, 197, 37, 160, 7, + 144, 236, 111, 166, 119, 219, 137, 33, 130, 23, 100, 99, 24, 121, 26, 129, + 68, 219, 15, 110, 23, 133, 166, 96, 41, 46, 242, 22, 61, 138, 117, 125, + 250, 32, 99, 65, 136, 181, 176, 4, 228, 246, 157, 105, 151, 33, 139, 104, + 128, 1, 145, 217, 69, 117, 193, 156, 160, 11, 9, 197, 216, 140, 245, 118, + 52, 182, 24, 142, 249, 198, 125, 241, 27, 227, 165, 146, 242, 203, 207, 86, + 175, 190, 19, 131, 184, 59, 234, 111, 221, 28, 204, 171, 184, 58, 179, 74, + 75, 170, 50, 134, 226, 213, 23, 239, 43, 234, 245, 236, 248, 188, 229, 111, + 93, 59, 61, 186, 86, 115, 47, 57, 129, 83, 2, 3, 229, 84, 14, 70, + 70, 250, 212, 166, 143, 97, 147, 201, 42, 214, 16, 56, 250, 196, 12, 35, + 13, 134, 17, 64, 242, 128, 150, 247, 147, 85, 10, 141, 9, 74, 201, 230, + 152, 35, 217, 252, 26, 186, 128, 242, 45, 68, 214, 78, 27, 31, 35, 107, + 229, 168, 42, 183, 136, 41, 5, 84, 102, 185, 65, 177, 23, 156, 144, 151, + 218, 17, 3, 209, 3, 176, 151, 13, 222, 223, 129, 136, 147, 67, 72, 42, + 6, 242, 132, 160, 170, 136, 219, 103, 9, 165, 190, 143, 69, 178, 205, 51, + 92, 250, 97, 197, 136, 20, 7, 172, 20, 69, 220, 192, 173, 139, 137, 204, + 188, 210, 198, 32, 150, 17, 6, 191, 231, 91, 194, 221, 152, 26, 49, 134, + 85, 147, 41, 63, 175, 144, 4, 189, 50, 90, 121, 61, 20, 37, 43, 159, + 2, 79, 76, 57, 192, 150, 176, 43, 80, 132, 16, 177, 126, 124, 176, 236, + 195, 228, 176, 220, 147, 213, 6, 19, 67, 1, 75, 69, 201, 177, 196, 205, + 47, 177, 244, 38, 120, 106, 185, 81, 235, 59, 217, 24, 220, 141, 48, 90, + 88, 37, 207, 23, 96, 213, 74, 95, 54, 194, 145, 5, 84, 152, 81, 161, + 158, 138, 161, 184, 130, 144, 50, 151, 95, 6, 244, 74, 9, 13, 70, 10, + 88, 30, 71, 36, 79, 41, 189, 2, 122, 47, 165, 185, 73, 127, 129, 234, + 195, 52, 4, 58, 151, 23, 134, 81, 19, 148, 136, 11, 75, 255, 169, 50, + 239, 32, 254, 118, 21, 219, 127, 96, 161, 255, 89, 109, 214, 199, 239, 254, + 248, 31, 246, 252, 63, 77, 4, 250, 255, 150, 152, 253, 121, 121, 154, 243, + 189, 249, 13, 174, 112, 124, 125, 144, 247, 111, 226, 6, 85, 40, 190, 189, + 97, 76, 207, 65, 20, 136, 130, 216, 87, 64, 36, 99, 111, 80, 117, 29, + 240, 114, 17, 228, 99, 35, 201, 71, 71, 18, 134, 200, 118, 207, 110, 70, + 245, 206, 92, 148, 113, 46, 251, 141, 32, 12, 227, 65, 60, 222, 24, 164, + 189, 209, 103, 182, 93, 104, 182, 21, 171, 242, 105, 3, 175, 195, 158, 6, + 91, 236, 234, 247, 58, 170, 205, 31, 158, 43, 24, 8, 15, 166, 14, 61, + 39, 197, 216, 5, 90, 198, 183, 47, 120, 146, 231, 41, 7, 152, 41, 45, + 168, 77, 84, 210, 117, 82, 22, 176, 251, 221, 126, 123, 44, 57, 134, 102, + 200, 5, 1, 254, 12, 166, 143, 233, 210, 182, 11, 3, 112, 240, 110, 31, + 65, 178, 122, 129, 51, 35, 221, 8, 124, 91, 240, 174, 24, 199, 179, 79, + 250, 46, 28, 70, 187, 119, 218, 97, 55, 248, 46, 61, 82, 177, 152, 227, + 183, 208, 79, 34, 251, 121, 94, 106, 129, 250, 116, 44, 26, 70, 36, 140, + 181, 238, 120, 160, 230, 188, 143, 75, 123, 212, 27, 105, 216, 45, 110, 168, + 53, 250, 188, 2, 239, 147, 191, 249, 237, 6, 153, 120, 176, 37, 245, 186, + 171, 138, 62, 43, 215, 103, 155, 70, 168, 194, 30, 94, 29, 102, 72, 8, + 195, 189, 213, 60, 29, 179, 65, 48, 114, 203, 113, 252, 241, 94, 215, 37, + 110, 86, 245, 17, 79, 179, 97, 142, 202, 228, 175, 138, 175, 14, 177, 63, + 77, 49, 115, 196, 193, 61, 202, 197, 104, 244, 4, 157, 51, 97, 133, 125, + 67, 25, 97, 57, 64, 160, 176, 103, 163, 176, 227, 253, 68, 89, 8, 127, + 40, 197, 76, 116, 222, 56, 225, 96, 255, 170, 128, 102, 140, 192, 98, 232, + 94, 57, 138, 80, 105, 239, 185, 126, 183, 169, 9, 50, 218, 14, 194, 114, + 129, 247, 214, 124, 225, 101, 155, 144, 23, 219, 174, 157, 24, 224, 74, 201, + 108, 253, 124, 230, 223, 101, 167, 144, 249, 208, 242, 29, 78, 227, 113, 91, + 140, 116, 157, 183, 252, 72, 12, 175, 87, 186, 87, 51, 142, 64, 133, 225, + 101, 25, 138, 239, 60, 176, 135, 176, 127, 17, 89, 55, 222, 28, 33, 90, + 125, 97, 123, 62, 179, 139, 68, 52, 124, 188, 180, 120, 58, 147, 90, 110, + 194, 231, 145, 201, 202, 187, 10, 69, 182, 146, 62, 143, 34, 176, 143, 236, + 219, 142, 251, 107, 234, 137, 57, 19, 8, 55, 254, 23, 218, 167, 249, 161, + 31, 26, 20, 97, 111, 200, 219, 76, 151, 153, 213, 154, 204, 196, 235, 2, + 15, 242, 177, 239, 218, 68, 92, 201, 195, 93, 84, 163, 236, 34, 99, 254, + 140, 98, 208, 190, 68, 183, 27, 96, 252, 19, 158, 100, 46, 191, 130, 160, + 183, 219, 20, 57, 21, 207, 255, 112, 111, 68, 224, 124, 225, 12, 93, 126, + 20, 116, 7, 48, 180, 166, 34, 10, 236, 106, 154, 97, 179, 90, 185, 170, + 202, 155, 43, 151, 232, 169, 68, 226, 109, 81, 144, 46, 142, 59, 190, 85, + 157, 155, 162, 128, 237, 161, 56, 29, 138, 46, 248, 180, 44, 236, 171, 28, + 252, 178, 9, 153, 40, 235, 163, 45, 244, 237, 250, 126, 103, 148, 13, 87, + 190, 15, 103, 151, 3, 11, 198, 187, 29, 113, 177, 22, 159, 208, 218, 45, + 144, 250, 168, 38, 117, 85, 147, 94, 200, 189, 15, 16, 191, 225, 79, 235, + 120, 17, 230, 241, 200, 48, 39, 248, 99, 196, 111, 244, 247, 60, 167, 92, + 90, 175, 82, 234, 242, 12, 181, 235, 24, 85, 162, 92, 140, 73, 226, 246, + 110, 160, 186, 21, 131, 106, 208, 85, 148, 43, 29, 6, 84, 89, 232, 61, + 154, 80, 240, 147, 96, 205, 194, 62, 51, 67, 1, 214, 77, 88, 175, 124, + 239, 37, 91, 188, 69, 40, 23, 144, 72, 181, 136, 93, 171, 95, 46, 154, + 65, 46, 248, 101, 127, 215, 28, 204, 209, 103, 19, 5, 16, 174, 55, 62, + 9, 165, 53, 112, 168, 194, 92, 135, 239, 165, 196, 4, 94, 127, 99, 22, + 95, 11, 2, 119, 198, 245, 49, 95, 248, 174, 214, 205, 76, 136, 216, 132, + 139, 234, 20, 77, 114, 49, 138, 117, 47, 151, 27, 91, 117, 43, 170, 77, + 94, 221, 225, 90, 225, 235, 165, 14, 193, 235, 155, 191, 94, 81, 32, 111, + 226, 53, 156, 22, 215, 50, 20, 189, 236, 199, 147, 253, 78, 241, 161, 100, + 241, 23, 57, 163, 30, 195, 59, 124, 62, 19, 66, 192, 172, 229, 148, 25, + 98, 218, 113, 163, 27, 108, 51, 183, 223, 170, 147, 191, 219, 86, 125, 112, + 219, 19, 112, 112, 189, 46, 144, 86, 35, 120, 105, 0, 190, 237, 13, 239, + 252, 153, 36, 97, 182, 19, 5, 191, 82, 132, 248, 15, 58, 120, 175, 111, + 197, 152, 145, 70, 129, 242, 66, 176, 208, 67, 107, 126, 109, 215, 247, 92, + 215, 206, 26, 70, 240, 160, 15, 163, 171, 127, 147, 97, 204, 13, 222, 101, + 200, 191, 86, 197, 50, 29, 71, 181, 78, 198, 186, 221, 109, 232, 56, 31, + 250, 13, 82, 210, 98, 118, 96, 95, 181, 113, 196, 224, 131, 199, 113, 226, + 180, 185, 143, 172, 125, 228, 117, 119, 219, 156, 238, 90, 138, 188, 156, 45, + 147, 120, 217, 21, 99, 85, 251, 43, 200, 12, 161, 118, 0, 174, 101, 233, + 199, 229, 71, 222, 120, 114, 111, 46, 224, 138, 72, 145, 45, 137, 165, 34, + 69, 11, 63, 203, 36, 92, 46, 113, 42, 228, 251, 179, 6, 200, 232, 180, + 13, 127, 223, 6, 59, 208, 18, 232, 149, 206, 20, 60, 1, 214, 69, 149, + 219, 186, 233, 34, 139, 149, 79, 133, 96, 230, 27, 214, 216, 231, 169, 171, + 8, 221, 136, 76, 99, 214, 97, 172, 159, 33, 155, 18, 64, 188, 132, 149, + 98, 200, 59, 154, 235, 219, 180, 21, 175, 153, 206, 233, 44, 62, 239, 151, + 217, 67, 82, 200, 210, 102, 198, 59, 151, 68, 50, 169, 190, 137, 25, 158, + 33, 240, 66, 95, 249, 26, 54, 104, 98, 108, 163, 33, 36, 231, 67, 152, + 105, 104, 142, 124, 123, 149, 235, 151, 201, 10, 145, 19, 149, 29, 188, 124, + 110, 36, 134, 76, 248, 205, 237, 159, 219, 161, 142, 115, 111, 245, 253, 67, + 253, 62, 15, 176, 22, 182, 32, 183, 168, 144, 94, 168, 203, 141, 154, 125, + 180, 142, 26, 50, 148, 61, 23, 20, 42, 130, 143, 22, 219, 100, 130, 213, + 8, 133, 76, 223, 232, 17, 188, 246, 198, 137, 177, 249, 182, 148, 162, 194, + 40, 59, 5, 11, 123, 43, 238, 186, 176, 135, 180, 201, 203, 102, 16, 29, + 26, 65, 139, 35, 218, 238, 64, 22, 111, 156, 183, 205, 73, 221, 66, 83, + 77, 198, 197, 77, 122, 30, 114, 65, 44, 239, 146, 67, 80, 193, 231, 189, + 55, 99, 49, 250, 91, 13, 45, 85, 46, 122, 213, 233, 27, 218, 246, 165, + 231, 35, 79, 242, 234, 225, 239, 117, 126, 188, 29, 119, 119, 112, 39, 90, + 160, 184, 77, 168, 30, 42, 119, 153, 12, 241, 188, 129, 131, 253, 64, 209, + 156, 112, 36, 170, 77, 137, 167, 133, 85, 212, 172, 53, 84, 211, 212, 76, + 19, 49, 247, 188, 66, 64, 70, 103, 202, 79, 65, 165, 181, 73, 240, 245, + 251, 126, 191, 94, 157, 119, 137, 81, 30, 58, 125, 192, 253, 233, 181, 28, + 191, 206, 236, 12, 39, 218, 7, 149, 40, 246, 237, 245, 154, 177, 166, 250, + 0, 198, 44, 23, 150, 137, 108, 207, 44, 39, 247, 93, 237, 251, 128, 233, + 41, 254, 177, 111, 252, 179, 214, 72, 127, 99, 59, 85, 199, 30, 218, 107, + 136, 103, 220, 103, 103, 66, 135, 172, 39, 223, 106, 138, 62, 40, 101, 65, + 168, 2, 43, 99, 223, 132, 241, 179, 168, 219, 242, 110, 97, 95, 169, 18, + 215, 121, 250, 213, 212, 64, 177, 183, 236, 89, 141, 39, 244, 201, 151, 170, + 36, 189, 42, 25, 109, 128, 113, 204, 173, 238, 67, 160, 57, 211, 97, 31, + 14, 197, 121, 244, 120, 113, 151, 200, 7, 56, 6, 49, 5, 5, 210, 102, + 121, 3, 220, 38, 166, 248, 130, 27, 7, 115, 196, 151, 215, 12, 227, 163, + 52, 53, 125, 88, 231, 238, 83, 2, 173, 253, 109, 119, 72, 101, 133, 220, + 62, 152, 4, 254, 18, 124, 7, 16, 113, 22, 214, 203, 16, 237, 250, 141, + 187, 120, 170, 160, 23, 98, 215, 204, 228, 210, 149, 33, 21, 246, 148, 58, + 142, 186, 234, 189, 231, 21, 46, 150, 185, 188, 173, 193, 176, 188, 34, 97, + 106, 157, 170, 27, 228, 181, 149, 134, 46, 201, 234, 66, 32, 43, 175, 64, + 0, 90, 179, 167, 105, 35, 137, 54, 111, 222, 43, 100, 107, 185, 151, 62, + 242, 14, 40, 90, 55, 191, 43, 201, 108, 132, 146, 16, 228, 49, 46, 65, + 106, 188, 39, 113, 67, 186, 149, 26, 121, 26, 165, 137, 221, 43, 158, 13, + 5, 27, 23, 200, 142, 78, 248, 189, 201, 131, 160, 177, 254, 250, 24, 79, + 182, 31, 219, 119, 79, 21, 236, 240, 38, 216, 66, 218, 123, 89, 14, 154, + 198, 81, 232, 32, 14, 15, 236, 72, 162, 201, 109, 181, 116, 198, 70, 23, + 187, 111, 49, 171, 178, 188, 44, 37, 23, 73, 231, 133, 193, 192, 129, 150, + 7, 164, 6, 169, 57, 53, 18, 98, 243, 236, 94, 99, 80, 141, 234, 130, + 46, 152, 9, 16, 163, 122, 179, 11, 46, 122, 116, 10, 99, 71, 217, 122, + 38, 124, 6, 243, 31, 164, 145, 249, 245, 16, 210, 47, 205, 90, 1, 251, + 228, 20, 218, 97, 62, 30, 143, 163, 51, 160, 243, 183, 51, 90, 31, 206, + 38, 220, 126, 147, 233, 47, 43, 230, 57, 68, 57, 61, 63, 130, 125, 45, + 75, 206, 139, 15, 32, 222, 217, 180, 205, 191, 121, 50, 208, 221, 239, 136, + 165, 84, 178, 212, 186, 193, 221, 135, 128, 144, 6, 181, 93, 94, 174, 253, + 138, 227, 99, 77, 149, 124, 196, 201, 230, 190, 57, 117, 145, 110, 192, 196, + 156, 137, 159, 122, 64, 74, 65, 49, 74, 218, 187, 199, 191, 134, 99, 194, + 16, 9, 27, 215, 231, 170, 29, 138, 23, 102, 62, 246, 24, 19, 139, 52, + 41, 35, 163, 178, 207, 186, 117, 251, 42, 76, 133, 147, 191, 36, 60, 235, + 9, 191, 39, 157, 190, 237, 40, 143, 26, 170, 224, 246, 206, 204, 243, 145, + 244, 209, 0, 193, 192, 174, 62, 207, 8, 184, 224, 19, 93, 138, 181, 25, + 92, 205, 29, 23, 172, 223, 49, 36, 67, 6, 7, 225, 224, 69, 61, 216, + 112, 1, 156, 211, 179, 203, 5, 96, 32, 152, 169, 149, 163, 24, 60, 27, + 130, 55, 218, 164, 226, 178, 127, 177, 52, 181, 53, 184, 213, 99, 17, 248, + 212, 91, 207, 24, 224, 146, 156, 75, 19, 42, 184, 120, 191, 45, 157, 91, + 163, 33, 178, 143, 226, 33, 122, 87, 4, 222, 136, 231, 204, 174, 224, 109, + 187, 39, 62, 12, 14, 241, 150, 205, 204, 26, 15, 175, 4, 204, 228, 148, + 24, 137, 114, 53, 206, 12, 65, 179, 148, 210, 157, 102, 119, 0, 153, 206, + 40, 75, 207, 86, 225, 115, 124, 101, 207, 105, 245, 48, 79, 204, 224, 143, + 0, 211, 40, 24, 189, 178, 156, 198, 195, 33, 74, 83, 104, 151, 252, 11, + 150, 195, 237, 242, 151, 134, 179, 31, 175, 27, 171, 209, 212, 247, 58, 148, + 162, 253, 152, 199, 40, 250, 228, 225, 165, 98, 149, 118, 6, 158, 189, 81, + 147, 74, 17, 203, 108, 179, 74, 119, 20, 244, 201, 124, 124, 27, 23, 39, + 70, 149, 84, 191, 216, 132, 40, 207, 150, 156, 203, 129, 32, 63, 166, 138, + 182, 247, 42, 154, 61, 134, 122, 107, 84, 95, 80, 156, 110, 185, 202, 137, + 35, 187, 128, 33, 96, 162, 189, 129, 55, 254, 116, 39, 140, 240, 47, 144, + 182, 174, 42, 55, 58, 24, 189, 141, 154, 185, 69, 136, 122, 40, 110, 81, + 75, 45, 192, 82, 116, 44, 139, 124, 17, 228, 152, 203, 53, 246, 142, 92, + 83, 145, 106, 207, 243, 188, 241, 35, 89, 131, 79, 36, 141, 52, 165, 87, + 71, 218, 62, 131, 60, 134, 218, 84, 93, 38, 160, 229, 88, 35, 235, 174, + 13, 104, 83, 238, 221, 145, 6, 205, 61, 229, 107, 75, 81, 191, 126, 106, + 188, 138, 22, 77, 33, 82, 51, 77, 104, 86, 27, 105, 126, 138, 1, 216, + 216, 38, 128, 11, 175, 1, 182, 248, 248, 54, 184, 47, 203, 61, 156, 197, + 237, 112, 108, 216, 188, 140, 234, 142, 119, 191, 69, 83, 67, 63, 0, 145, + 133, 31, 4, 151, 246, 83, 108, 22, 152, 136, 227, 96, 107, 60, 192, 166, + 151, 97, 245, 138, 96, 202, 44, 77, 134, 135, 159, 225, 109, 114, 63, 100, + 50, 67, 239, 58, 246, 172, 169, 27, 90, 53, 149, 166, 17, 243, 86, 4, + 242, 161, 99, 48, 153, 229, 54, 53, 112, 254, 16, 8, 32, 215, 39, 72, + 36, 39, 254, 246, 154, 114, 72, 1, 2, 66, 218, 217, 231, 195, 71, 218, + 40, 146, 99, 197, 188, 162, 21, 183, 113, 37, 159, 226, 137, 73, 101, 178, + 193, 150, 30, 131, 194, 251, 150, 23, 77, 233, 136, 71, 25, 89, 121, 162, + 26, 246, 172, 216, 211, 251, 81, 231, 143, 107, 51, 111, 138, 88, 2, 249, + 230, 16, 159, 204, 54, 199, 15, 210, 122, 15, 112, 38, 89, 179, 209, 238, + 185, 85, 141, 1, 204, 237, 135, 250, 76, 159, 248, 138, 235, 39, 39, 140, + 68, 77, 115, 178, 179, 106, 212, 62, 64, 219, 13, 253, 218, 242, 102, 134, + 177, 94, 225, 201, 138, 32, 61, 40, 57, 215, 212, 194, 56, 81, 212, 11, + 152, 67, 18, 28, 158, 171, 191, 72, 53, 137, 228, 139, 112, 147, 107, 206, + 16, 184, 149, 163, 138, 130, 161, 25, 21, 168, 27, 56, 214, 46, 191, 62, + 204, 85, 103, 215, 184, 45, 154, 181, 42, 78, 75, 182, 23, 6, 126, 108, + 158, 120, 149, 251, 240, 209, 128, 66, 142, 70, 191, 106, 182, 231, 163, 26, + 2, 152, 176, 145, 142, 180, 31, 54, 59, 155, 76, 81, 175, 74, 157, 36, + 130, 125, 195, 87, 220, 45, 154, 167, 187, 55, 18, 53, 178, 133, 78, 29, + 2, 75, 106, 60, 23, 10, 101, 15, 24, 69, 159, 251, 98, 251, 33, 240, + 228, 72, 48, 196, 24, 155, 139, 237, 202, 23, 191, 105, 81, 182, 189, 119, + 180, 207, 234, 66, 196, 152, 138, 45, 49, 220, 196, 151, 39, 25, 107, 240, + 154, 90, 21, 238, 159, 33, 52, 105, 3, 241, 88, 162, 23, 132, 211, 198, + 51, 59, 73, 224, 25, 95, 137, 137, 233, 175, 254, 42, 178, 61, 122, 245, + 79, 202, 113, 13, 187, 232, 253, 252, 158, 62, 43, 228, 9, 131, 232, 223, + 68, 240, 229, 180, 75, 202, 61, 95, 243, 155, 214, 65, 120, 82, 156, 161, + 9, 32, 236, 92, 93, 71, 220, 158, 233, 210, 170, 156, 175, 98, 90, 244, + 33, 103, 217, 178, 214, 41, 194, 20, 55, 2, 33, 175, 126, 64, 47, 234, + 209, 223, 166, 178, 98, 216, 222, 244, 97, 44, 135, 64, 180, 67, 84, 116, + 35, 9, 108, 67, 116, 78, 1, 246, 207, 124, 182, 179, 54, 44, 249, 44, + 61, 103, 3, 106, 225, 184, 246, 194, 92, 236, 216, 194, 76, 68, 99, 129, + 209, 36, 206, 144, 173, 100, 233, 105, 129, 149, 182, 21, 225, 145, 218, 129, + 214, 60, 152, 156, 191, 6, 39, 109, 173, 12, 92, 235, 167, 106, 119, 157, + 73, 234, 85, 255, 102, 140, 41, 24, 88, 5, 55, 190, 75, 99, 195, 134, + 239, 66, 126, 182, 167, 48, 113, 251, 255, 186, 32, 198, 36, 78, 209, 73, + 118, 245, 87, 107, 150, 10, 109, 197, 138, 45, 103, 103, 242, 90, 50, 221, + 86, 62, 210, 197, 100, 131, 29, 155, 82, 20, 102, 155, 207, 98, 50, 71, + 12, 218, 76, 115, 186, 112, 59, 111, 189, 69, 7, 214, 223, 58, 107, 243, + 116, 20, 125, 24, 93, 90, 134, 202, 123, 100, 54, 7, 75, 211, 140, 203, + 40, 97, 103, 38, 124, 13, 36, 20, 172, 27, 105, 83, 100, 1, 202, 15, + 192, 61, 67, 29, 122, 245, 81, 13, 130, 8, 31, 57, 159, 100, 95, 7, + 130, 165, 88, 192, 217, 184, 46, 246, 17, 4, 121, 108, 96, 250, 60, 30, + 57, 153, 198, 174, 12, 207, 50, 0, 99, 80, 110, 20, 168, 88, 80, 122, + 224, 83, 78, 53, 213, 47, 96, 163, 75, 215, 243, 220, 33, 126, 228, 251, + 199, 122, 9, 151, 73, 136, 99, 145, 137, 117, 18, 68, 250, 147, 233, 177, + 103, 33, 31, 200, 53, 247, 61, 93, 240, 62, 1, 136, 125, 5, 141, 92, + 59, 241, 35, 158, 46, 219, 0, 62, 53, 241, 109, 50, 16, 69, 227, 80, + 9, 39, 89, 60, 155, 11, 34, 84, 71, 188, 30, 15, 79, 117, 74, 40, + 45, 46, 161, 135, 162, 17, 4, 197, 79, 11, 60, 226, 2, 229, 168, 229, + 30, 111, 188, 62, 209, 173, 46, 174, 29, 150, 91, 68, 248, 153, 97, 40, + 244, 32, 254, 232, 77, 153, 83, 5, 30, 235, 237, 229, 125, 213, 44, 223, + 41, 96, 194, 174, 205, 94, 226, 182, 158, 189, 205, 37, 217, 229, 182, 227, + 184, 199, 108, 100, 15, 114, 219, 200, 101, 173, 204, 156, 40, 111, 218, 65, + 217, 140, 249, 142, 65, 234, 182, 88, 147, 234, 222, 244, 33, 235, 114, 84, + 146, 238, 169, 87, 140, 220, 110, 251, 7, 160, 239, 22, 253, 42, 234, 232, + 106, 16, 5, 92, 145, 33, 96, 217, 237, 162, 76, 186, 87, 26, 211, 156, + 212, 135, 80, 194, 47, 160, 214, 211, 206, 155, 198, 41, 192, 192, 84, 131, + 205, 41, 83, 230, 126, 127, 32, 221, 7, 20, 10, 89, 130, 50, 10, 123, + 191, 90, 118, 192, 252, 32, 61, 36, 15, 245, 95, 152, 10, 13, 232, 141, + 142, 180, 104, 122, 171, 57, 25, 239, 186, 198, 166, 184, 205, 241, 198, 78, + 147, 96, 212, 63, 211, 30, 82, 38, 29, 3, 41, 63, 54, 22, 179, 247, + 23, 100, 210, 68, 74, 164, 123, 32, 147, 95, 118, 130, 23, 28, 72, 1, + 98, 104, 173, 24, 248, 50, 161, 87, 254, 150, 203, 215, 241, 225, 135, 41, + 70, 18, 18, 223, 7, 208, 138, 19, 145, 106, 12, 32, 151, 14, 63, 15, + 48, 130, 132, 99, 230, 147, 20, 211, 19, 152, 241, 78, 110, 151, 248, 28, + 63, 245, 48, 238, 209, 35, 179, 191, 203, 222, 128, 102, 53, 176, 92, 238, + 199, 46, 209, 33, 147, 46, 74, 33, 7, 195, 244, 50, 158, 196, 28, 59, + 49, 90, 19, 244, 209, 119, 118, 18, 92, 89, 246, 102, 188, 253, 32, 11, + 108, 114, 232, 123, 92, 169, 196, 4, 201, 112, 234, 226, 41, 202, 244, 244, + 91, 182, 76, 65, 194, 188, 170, 58, 33, 247, 4, 105, 131, 58, 144, 167, + 202, 200, 211, 44, 39, 249, 8, 67, 156, 104, 99, 254, 2, 24, 88, 2, + 146, 52, 158, 209, 240, 100, 99, 233, 27, 10, 84, 185, 219, 12, 241, 220, + 124, 82, 67, 43, 82, 141, 133, 187, 111, 104, 118, 3, 150, 218, 178, 132, + 82, 120, 202, 158, 234, 87, 143, 237, 169, 61, 172, 240, 73, 139, 237, 201, + 1, 158, 203, 79, 89, 84, 139, 20, 33, 118, 25, 230, 219, 92, 64, 54, + 223, 127, 162, 128, 167, 57, 242, 32, 151, 147, 171, 89, 78, 253, 30, 10, + 236, 169, 31, 2, 231, 126, 51, 138, 42, 22, 130, 28, 125, 92, 54, 138, + 205, 1, 37, 10, 247, 109, 227, 31, 92, 218, 133, 231, 48, 158, 203, 196, + 237, 29, 107, 85, 170, 170, 147, 251, 154, 238, 21, 197, 202, 0, 47, 85, + 71, 216, 219, 129, 189, 236, 251, 135, 108, 145, 197, 81, 0, 173, 242, 38, + 177, 174, 134, 104, 209, 110, 180, 9, 250, 65, 204, 66, 163, 185, 122, 189, + 105, 187, 98, 234, 15, 164, 125, 219, 184, 89, 186, 188, 240, 19, 196, 116, + 196, 153, 56, 221, 239, 123, 197, 242, 185, 231, 224, 120, 75, 65, 207, 118, + 227, 98, 179, 105, 81, 75, 57, 112, 119, 222, 200, 110, 167, 103, 158, 73, + 174, 224, 25, 56, 74, 156, 22, 250, 96, 110, 214, 233, 158, 136, 195, 172, + 55, 75, 33, 239, 75, 196, 200, 141, 224, 123, 213, 92, 59, 237, 187, 222, + 212, 102, 185, 182, 96, 56, 138, 55, 106, 30, 2, 125, 70, 167, 84, 188, + 195, 125, 146, 189, 188, 211, 5, 122, 119, 172, 173, 246, 51, 152, 20, 228, + 59, 179, 22, 81, 239, 73, 120, 35, 97, 163, 37, 71, 232, 242, 247, 179, + 201, 65, 99, 122, 178, 56, 34, 25, 152, 50, 165, 73, 160, 153, 46, 31, + 70, 30, 49, 143, 172, 124, 113, 31, 94, 102, 111, 108, 246, 184, 65, 20, + 79, 73, 169, 231, 54, 65, 51, 178, 205, 108, 29, 39, 198, 203, 96, 102, + 59, 126, 159, 114, 173, 14, 140, 38, 157, 114, 44, 89, 80, 218, 41, 164, + 200, 145, 81, 5, 124, 3, 44, 217, 50, 22, 164, 213, 9, 74, 2, 230, + 165, 88, 114, 188, 104, 99, 18, 95, 16, 0, 227, 77, 202, 211, 100, 163, + 190, 76, 72, 115, 188, 25, 42, 223, 169, 89, 228, 29, 23, 52, 160, 20, + 212, 96, 184, 172, 135, 53, 25, 148, 33, 236, 122, 153, 28, 55, 60, 218, + 117, 16, 124, 206, 55, 194, 168, 240, 156, 133, 157, 54, 95, 64, 164, 206, + 201, 80, 32, 153, 118, 168, 37, 51, 9, 12, 201, 160, 103, 183, 95, 220, + 105, 116, 197, 73, 180, 29, 168, 145, 101, 133, 65, 88, 57, 78, 183, 22, + 65, 220, 132, 254, 124, 46, 132, 141, 235, 2, 188, 168, 224, 225, 14, 247, + 212, 203, 172, 138, 246, 157, 188, 136, 6, 61, 235, 93, 210, 95, 29, 255, + 230, 20, 52, 92, 8, 236, 190, 139, 176, 238, 152, 35, 200, 104, 39, 5, + 15, 133, 0, 158, 108, 234, 193, 8, 140, 198, 144, 145, 237, 102, 172, 199, + 172, 20, 87, 27, 46, 30, 3, 225, 195, 163, 57, 138, 86, 36, 149, 28, + 58, 164, 92, 48, 227, 1, 29, 220, 179, 162, 168, 174, 178, 151, 222, 234, + 147, 47, 179, 224, 65, 65, 175, 105, 155, 35, 149, 113, 25, 214, 124, 162, + 52, 27, 4, 51, 118, 149, 228, 46, 128, 156, 7, 7, 1, 0, 106, 15, + 25, 179, 70, 222, 92, 58, 44, 184, 173, 225, 77, 25, 128, 239, 242, 97, + 170, 237, 42, 237, 197, 55, 132, 194, 0, 174, 151, 143, 77, 158, 169, 53, + 85, 58, 49, 27, 140, 239, 43, 94, 13, 56, 240, 117, 165, 23, 1, 225, + 233, 23, 199, 182, 69, 23, 146, 159, 188, 252, 209, 171, 252, 54, 176, 233, + 7, 226, 136, 241, 6, 179, 39, 201, 188, 58, 230, 45, 42, 217, 195, 252, + 108, 78, 83, 52, 209, 77, 12, 118, 96, 136, 236, 226, 145, 182, 42, 127, + 25, 45, 81, 62, 245, 233, 133, 97, 198, 133, 205, 32, 9, 37, 138, 104, + 82, 179, 223, 215, 117, 200, 229, 140, 94, 35, 177, 140, 185, 242, 36, 154, + 71, 65, 232, 142, 241, 186, 233, 105, 151, 224, 190, 196, 83, 46, 153, 19, + 182, 171, 83, 48, 73, 246, 196, 40, 181, 173, 77, 190, 61, 231, 237, 210, + 250, 120, 84, 149, 0, 187, 173, 162, 223, 78, 255, 42, 65, 123, 156, 67, + 145, 112, 242, 7, 108, 251, 100, 242, 161, 122, 202, 23, 252, 214, 70, 40, + 205, 239, 164, 128, 87, 3, 200, 144, 60, 134, 38, 141, 115, 137, 160, 120, + 121, 62, 67, 39, 127, 167, 184, 75, 80, 178, 53, 79, 254, 113, 115, 186, + 76, 212, 59, 149, 223, 144, 169, 23, 28, 92, 174, 160, 201, 204, 97, 18, + 207, 169, 176, 106, 245, 155, 73, 38, 123, 100, 120, 168, 42, 46, 181, 254, + 26, 10, 35, 206, 73, 177, 183, 156, 229, 200, 216, 61, 155, 145, 183, 165, + 136, 12, 186, 27, 97, 238, 198, 239, 225, 249, 157, 91, 18, 184, 45, 240, + 38, 160, 60, 221, 3, 212, 136, 31, 164, 137, 84, 32, 53, 213, 98, 157, + 242, 252, 127, 71, 5, 237, 127, 24, 152, 254, 167, 199, 35, 169, 62, 197, + 191, 197, 165, 255, 109, 199, 191, 75, 152, 250, 239, 104, 34, 127, 73, 249, + 175, 10, 108, 209, 48, 76, 223, 5, 171, 151, 236, 223, 229, 39, 253, 254, + 183, 47, 167, 236, 91, 163, 56, 233, 63, 217, 119, 197, 182, 57, 235, 210, + 175, 117, 254, 138, 190, 186, 42, 201, 190, 134, 126, 94, 110, 170, 152, 126, + 229, 83, 255, 249, 62, 126, 250, 26, 218, 40, 201, 126, 255, 157, 153, 244, + 167, 238, 151, 76, 241, 47, 137, 180, 63, 44, 203, 127, 34, 199, 246, 251, + 251, 160, 127, 77, 211, 170, 238, 139, 253, 150, 184, 245, 119, 255, 46, 89, + 235, 239, 127, 255, 197, 141, 107, 53, 252, 57, 43, 234, 251, 148, 231, 23, + 157, 126, 165, 235, 151, 26, 77, 191, 181, 147, 148, 81, 251, 37, 175, 85, + 247, 253, 45, 132, 130, 24, 248, 197, 68, 89, 247, 197, 100, 105, 118, 124, + 61, 190, 248, 41, 234, 146, 236, 31, 255, 240, 184, 123, 242, 23, 225, 182, + 191, 73, 235, 50, 254, 124, 67, 243, 175, 59, 205, 166, 251, 78, 215, 165, + 255, 68, 75, 149, 252, 210, 139, 254, 245, 48, 127, 9, 86, 255, 161, 250, + 35, 63, 85, 247, 65, 243, 151, 120, 127, 245, 213, 231, 95, 124, 244, 201, + 190, 133, 225, 190, 254, 233, 239, 191, 254, 219, 159, 186, 224, 126, 124, 159, + 232, 252, 138, 218, 185, 255, 74, 250, 110, 174, 238, 6, 255, 118, 25, 240, + 127, 37, 168, 252, 137, 154, 239, 244, 175, 232, 47, 50, 206, 223, 239, 245, + 191, 253, 165, 235, 76, 223, 45, 83, 21, 223, 189, 156, 230, 255, 145, 232, + 220, 191, 252, 238, 203, 187, 95, 101, 191, 182, 233, 87, 91, 53, 217, 111, + 194, 219, 81, 215, 124, 125, 247, 254, 190, 163, 249, 126, 157, 89, 63, 180, + 247, 65, 229, 175, 254, 254, 214, 236, 111, 149, 250, 254, 93, 226, 90, 213, + 125, 221, 237, 127, 237, 247, 189, 245, 211, 255, 197, 222, 155, 112, 183, 141, + 35, 139, 194, 127, 133, 215, 247, 221, 105, 251, 139, 246, 205, 114, 102, 146, + 251, 188, 219, 241, 18, 199, 242, 18, 167, 103, 78, 14, 36, 66, 18, 34, + 138, 80, 184, 88, 150, 231, 188, 255, 254, 85, 21, 64, 18, 164, 72, 217, + 206, 76, 247, 77, 247, 117, 47, 22, 9, 130, 32, 150, 218, 81, 85, 176, + 24, 180, 62, 230, 94, 197, 218, 182, 250, 98, 100, 141, 195, 17, 190, 240, + 214, 82, 203, 15, 213, 203, 244, 18, 204, 87, 111, 225, 220, 11, 110, 109, + 59, 252, 129, 185, 182, 167, 230, 74, 3, 200, 250, 140, 13, 38, 108, 4, + 35, 45, 89, 120, 236, 30, 14, 249, 47, 214, 80, 56, 48, 223, 254, 70, + 180, 96, 233, 246, 46, 96, 214, 198, 204, 218, 97, 163, 193, 88, 228, 55, + 86, 240, 230, 30, 115, 5, 119, 172, 139, 138, 181, 195, 61, 0, 140, 81, + 114, 52, 224, 179, 219, 200, 56, 41, 238, 200, 112, 228, 240, 240, 33, 213, + 134, 205, 251, 225, 104, 69, 27, 31, 84, 27, 30, 98, 23, 52, 128, 222, + 134, 220, 75, 181, 144, 204, 197, 64, 218, 188, 160, 153, 93, 135, 133, 54, + 180, 16, 58, 194, 125, 209, 24, 182, 67, 141, 61, 142, 32, 84, 89, 216, + 252, 101, 13, 32, 86, 97, 11, 245, 191, 74, 225, 3, 44, 58, 14, 32, + 79, 222, 0, 10, 151, 16, 160, 108, 48, 81, 17, 246, 5, 3, 95, 13, + 4, 103, 236, 65, 192, 236, 237, 49, 225, 47, 82, 13, 224, 124, 193, 219, + 171, 191, 127, 160, 199, 111, 235, 133, 16, 3, 107, 15, 79, 89, 119, 217, + 114, 99, 5, 77, 28, 51, 192, 135, 3, 238, 141, 66, 223, 151, 233, 217, + 91, 221, 243, 43, 217, 23, 204, 183, 14, 28, 46, 128, 38, 254, 200, 186, + 95, 202, 62, 247, 0, 217, 14, 16, 136, 167, 210, 31, 176, 23, 45, 158, + 9, 125, 212, 132, 39, 242, 250, 80, 178, 162, 169, 68, 34, 35, 128, 156, + 21, 65, 19, 34, 53, 163, 166, 184, 39, 139, 155, 42, 130, 226, 177, 7, + 48, 116, 32, 184, 237, 100, 38, 99, 52, 124, 120, 30, 18, 70, 158, 194, + 198, 187, 68, 182, 202, 159, 130, 146, 245, 101, 219, 11, 162, 161, 80, 41, + 80, 49, 64, 152, 162, 238, 28, 2, 173, 119, 248, 148, 185, 125, 62, 26, + 49, 239, 5, 11, 171, 24, 221, 161, 156, 67, 149, 23, 224, 2, 96, 49, + 7, 102, 34, 157, 41, 188, 151, 129, 164, 39, 167, 30, 193, 224, 40, 148, + 65, 118, 13, 159, 234, 41, 48, 95, 46, 92, 225, 89, 87, 33, 16, 83, + 143, 89, 31, 184, 235, 103, 136, 192, 83, 84, 236, 10, 120, 255, 9, 23, + 78, 254, 138, 235, 30, 60, 15, 126, 22, 208, 144, 99, 103, 144, 239, 185, + 164, 96, 27, 232, 167, 117, 50, 103, 170, 247, 235, 108, 232, 241, 141, 151, + 55, 2, 36, 216, 145, 32, 146, 76, 89, 65, 39, 246, 79, 246, 128, 5, + 6, 124, 228, 17, 59, 46, 66, 46, 57, 70, 193, 102, 50, 97, 254, 11, + 22, 164, 23, 40, 128, 158, 1, 103, 230, 22, 128, 170, 195, 172, 83, 225, + 134, 15, 28, 100, 141, 204, 162, 248, 98, 84, 244, 113, 144, 138, 38, 233, + 222, 3, 157, 246, 157, 85, 253, 61, 99, 227, 251, 12, 247, 72, 134, 252, + 212, 199, 0, 221, 63, 189, 240, 123, 151, 64, 176, 92, 235, 76, 64, 69, + 155, 189, 240, 221, 43, 144, 172, 62, 78, 197, 226, 165, 239, 157, 177, 208, + 147, 214, 167, 144, 123, 32, 238, 190, 240, 221, 139, 177, 12, 228, 174, 156, + 138, 207, 249, 96, 110, 180, 240, 36, 140, 29, 50, 207, 91, 88, 31, 253, + 145, 148, 105, 166, 103, 203, 65, 56, 5, 186, 243, 188, 102, 62, 112, 128, + 18, 235, 2, 36, 226, 92, 50, 179, 154, 119, 40, 98, 237, 91, 23, 0, + 112, 141, 173, 191, 142, 157, 23, 114, 175, 15, 32, 236, 194, 219, 192, 49, + 199, 5, 44, 255, 233, 105, 8, 133, 3, 124, 15, 184, 207, 37, 123, 28, + 121, 226, 241, 133, 75, 114, 194, 60, 63, 0, 170, 127, 9, 163, 116, 129, + 215, 101, 184, 70, 204, 254, 86, 79, 4, 128, 239, 0, 154, 144, 247, 89, + 106, 61, 112, 194, 192, 66, 23, 157, 21, 66, 164, 213, 131, 193, 227, 12, + 182, 254, 250, 194, 206, 223, 133, 30, 188, 61, 70, 6, 35, 94, 70, 110, + 123, 2, 196, 104, 105, 29, 122, 18, 150, 236, 101, 111, 6, 124, 6, 116, + 101, 34, 253, 151, 34, 220, 88, 170, 169, 94, 147, 65, 32, 215, 44, 104, + 40, 8, 94, 40, 107, 158, 134, 64, 10, 173, 171, 123, 207, 78, 83, 247, + 19, 79, 4, 236, 25, 4, 21, 214, 9, 62, 105, 221, 74, 103, 56, 252, + 33, 112, 3, 81, 31, 148, 215, 47, 28, 196, 197, 224, 241, 69, 93, 63, + 99, 65, 48, 70, 89, 237, 11, 159, 205, 242, 5, 181, 156, 55, 99, 21, + 109, 79, 206, 93, 71, 50, 219, 218, 127, 8, 80, 180, 116, 64, 90, 13, + 216, 91, 120, 244, 213, 214, 143, 190, 194, 171, 95, 17, 214, 74, 88, 234, + 202, 175, 160, 146, 131, 174, 52, 95, 175, 47, 41, 238, 20, 118, 164, 70, + 106, 205, 5, 232, 110, 81, 27, 164, 200, 241, 232, 19, 216, 24, 86, 3, + 36, 13, 49, 46, 169, 191, 176, 124, 20, 244, 34, 118, 12, 250, 170, 86, + 99, 181, 98, 7, 99, 138, 130, 153, 214, 81, 26, 145, 14, 40, 119, 135, + 30, 179, 97, 116, 248, 180, 68, 139, 40, 70, 227, 0, 68, 6, 54, 241, + 227, 50, 168, 163, 64, 161, 100, 241, 96, 80, 169, 84, 48, 68, 9, 102, + 154, 58, 39, 92, 63, 208, 10, 230, 212, 130, 25, 132, 233, 243, 5, 130, + 82, 160, 59, 7, 116, 142, 236, 6, 72, 69, 44, 219, 19, 247, 28, 52, + 201, 161, 210, 178, 97, 160, 18, 94, 32, 168, 80, 230, 136, 185, 116, 127, + 9, 44, 151, 195, 128, 24, 182, 5, 216, 131, 77, 33, 244, 120, 46, 71, + 241, 206, 117, 65, 119, 70, 234, 201, 220, 197, 84, 122, 156, 180, 85, 15, + 53, 111, 144, 144, 96, 38, 212, 44, 232, 209, 43, 49, 80, 79, 73, 101, + 41, 148, 106, 57, 31, 125, 255, 253, 223, 124, 64, 33, 248, 14, 204, 206, + 187, 181, 255, 220, 223, 111, 183, 107, 181, 181, 247, 183, 204, 3, 52, 30, + 189, 5, 40, 128, 199, 239, 9, 112, 182, 17, 20, 28, 25, 224, 199, 112, + 53, 168, 144, 38, 165, 207, 227, 69, 227, 118, 69, 5, 146, 13, 160, 213, + 128, 129, 94, 206, 44, 71, 2, 52, 7, 168, 213, 252, 135, 25, 231, 230, + 3, 242, 82, 48, 91, 210, 175, 3, 137, 241, 101, 151, 188, 28, 131, 24, + 25, 98, 122, 3, 168, 55, 24, 191, 251, 218, 151, 210, 89, 175, 173, 110, + 35, 130, 171, 194, 177, 109, 59, 4, 82, 1, 44, 141, 181, 14, 19, 30, + 50, 103, 195, 2, 28, 26, 75, 219, 28, 239, 223, 221, 227, 33, 72, 123, + 100, 17, 88, 88, 200, 91, 164, 235, 151, 34, 163, 80, 28, 37, 23, 186, + 20, 185, 6, 139, 225, 113, 208, 253, 64, 217, 210, 160, 138, 29, 199, 53, + 57, 214, 107, 169, 22, 28, 167, 37, 5, 224, 240, 89, 159, 155, 208, 173, + 122, 228, 44, 64, 224, 67, 187, 20, 198, 202, 65, 251, 149, 71, 49, 163, + 10, 27, 22, 11, 20, 40, 49, 27, 56, 158, 239, 91, 169, 144, 57, 12, + 30, 92, 95, 114, 241, 196, 223, 24, 37, 177, 169, 229, 163, 9, 200, 186, + 19, 250, 216, 54, 208, 69, 155, 15, 228, 116, 70, 205, 99, 39, 85, 207, + 208, 134, 2, 168, 1, 176, 10, 67, 87, 93, 240, 6, 99, 156, 70, 234, + 18, 224, 34, 232, 203, 114, 142, 180, 203, 145, 3, 130, 242, 183, 127, 119, + 173, 50, 77, 34, 44, 199, 181, 43, 30, 112, 102, 203, 100, 175, 241, 23, + 128, 54, 83, 232, 190, 149, 90, 166, 190, 19, 242, 53, 178, 175, 253, 159, + 163, 143, 103, 251, 213, 202, 128, 129, 50, 73, 35, 168, 70, 198, 46, 92, + 34, 179, 225, 91, 225, 194, 156, 250, 4, 144, 79, 54, 251, 95, 219, 23, + 23, 123, 219, 87, 219, 203, 77, 90, 79, 64, 103, 140, 53, 138, 50, 110, + 135, 176, 118, 222, 219, 68, 67, 90, 78, 168, 39, 222, 87, 150, 29, 102, + 151, 255, 158, 50, 164, 186, 214, 245, 12, 150, 135, 83, 131, 141, 90, 189, + 85, 173, 119, 170, 181, 22, 53, 18, 27, 248, 162, 190, 28, 40, 122, 185, + 71, 114, 236, 19, 102, 178, 180, 173, 11, 22, 141, 204, 88, 24, 208, 169, + 74, 40, 48, 115, 150, 4, 102, 14, 65, 247, 230, 115, 233, 77, 16, 147, + 67, 0, 121, 225, 130, 232, 128, 100, 19, 223, 195, 236, 126, 101, 155, 15, + 9, 14, 52, 165, 209, 86, 52, 178, 192, 165, 99, 72, 103, 192, 211, 5, + 224, 71, 133, 172, 103, 87, 18, 96, 31, 8, 150, 66, 5, 162, 122, 240, + 206, 0, 112, 43, 64, 58, 161, 22, 12, 214, 20, 56, 167, 12, 93, 251, + 221, 218, 44, 244, 102, 14, 95, 179, 252, 96, 225, 240, 119, 107, 192, 88, + 29, 52, 33, 86, 112, 233, 162, 69, 67, 216, 68, 128, 36, 196, 132, 169, + 83, 96, 67, 244, 31, 224, 17, 9, 229, 186, 164, 7, 209, 194, 255, 87, + 21, 199, 160, 219, 128, 90, 64, 91, 53, 0, 109, 84, 172, 227, 32, 38, + 105, 208, 45, 219, 226, 0, 125, 138, 118, 33, 128, 27, 35, 115, 88, 232, + 2, 96, 218, 37, 180, 25, 206, 17, 103, 52, 251, 185, 228, 160, 167, 249, + 99, 106, 186, 31, 130, 120, 1, 252, 39, 116, 109, 109, 102, 69, 243, 181, + 7, 236, 12, 229, 150, 13, 154, 33, 68, 50, 164, 154, 240, 101, 194, 191, + 62, 78, 5, 76, 65, 232, 48, 120, 5, 248, 31, 141, 176, 20, 97, 31, + 46, 3, 54, 4, 24, 234, 48, 197, 74, 124, 98, 79, 98, 10, 83, 21, + 11, 219, 49, 67, 140, 248, 227, 250, 28, 228, 18, 20, 121, 132, 238, 169, + 9, 21, 104, 168, 11, 1, 12, 54, 208, 132, 154, 204, 0, 80, 24, 181, + 68, 248, 130, 3, 108, 14, 27, 77, 162, 117, 1, 218, 114, 152, 204, 26, + 136, 5, 66, 73, 48, 209, 183, 209, 232, 206, 28, 156, 207, 133, 21, 129, + 14, 65, 202, 156, 45, 42, 214, 45, 116, 76, 89, 132, 181, 20, 64, 164, + 211, 87, 52, 31, 187, 155, 234, 170, 199, 191, 135, 2, 230, 76, 241, 61, + 127, 2, 93, 5, 16, 133, 137, 38, 210, 10, 157, 30, 113, 23, 88, 44, + 18, 80, 27, 173, 186, 240, 62, 72, 194, 11, 107, 200, 231, 22, 90, 71, + 252, 138, 182, 227, 23, 193, 26, 173, 21, 214, 124, 183, 166, 104, 239, 218, + 251, 253, 7, 134, 147, 75, 163, 183, 238, 1, 6, 109, 92, 232, 4, 130, + 112, 77, 23, 86, 196, 60, 114, 142, 125, 1, 26, 163, 138, 206, 22, 22, + 31, 14, 129, 163, 3, 125, 154, 46, 190, 170, 235, 82, 114, 73, 228, 40, + 219, 192, 63, 141, 6, 222, 90, 61, 49, 154, 50, 235, 157, 53, 4, 22, + 18, 172, 55, 74, 181, 82, 189, 182, 161, 222, 91, 90, 10, 124, 47, 110, + 219, 66, 98, 140, 255, 188, 1, 98, 232, 89, 255, 167, 110, 185, 86, 173, + 212, 104, 183, 173, 7, 233, 229, 126, 24, 214, 242, 84, 202, 73, 68, 222, + 61, 62, 228, 30, 119, 7, 200, 237, 77, 189, 14, 161, 15, 159, 71, 246, + 16, 52, 184, 251, 8, 48, 238, 68, 173, 253, 8, 120, 4, 174, 13, 48, + 135, 18, 130, 147, 195, 65, 188, 176, 80, 154, 169, 88, 59, 11, 122, 23, + 32, 33, 217, 160, 129, 111, 0, 50, 3, 60, 18, 240, 249, 99, 44, 35, + 244, 166, 77, 154, 1, 96, 9, 0, 72, 4, 92, 115, 17, 140, 113, 11, + 71, 7, 170, 195, 146, 134, 83, 95, 49, 110, 34, 92, 62, 118, 145, 136, + 147, 139, 200, 228, 113, 248, 186, 207, 9, 63, 76, 192, 170, 60, 77, 253, + 137, 183, 214, 74, 107, 191, 214, 255, 161, 37, 173, 130, 25, 49, 66, 241, + 35, 14, 28, 215, 172, 248, 227, 96, 234, 100, 227, 253, 169, 217, 70, 212, + 44, 192, 190, 152, 17, 78, 68, 83, 154, 211, 98, 244, 168, 10, 180, 139, + 63, 172, 104, 182, 249, 143, 148, 92, 8, 52, 69, 133, 228, 231, 181, 169, + 31, 17, 104, 39, 204, 38, 103, 95, 40, 226, 57, 195, 135, 175, 67, 245, + 56, 11, 58, 127, 119, 95, 132, 99, 189, 112, 54, 147, 30, 174, 104, 49, + 30, 225, 130, 149, 181, 44, 26, 237, 205, 140, 36, 172, 165, 34, 81, 0, + 115, 186, 47, 180, 229, 227, 235, 22, 21, 112, 234, 93, 168, 183, 57, 216, + 9, 24, 76, 182, 218, 64, 64, 119, 65, 21, 4, 145, 219, 43, 89, 122, + 79, 101, 7, 6, 13, 212, 55, 86, 153, 14, 194, 193, 24, 192, 107, 105, + 219, 11, 115, 46, 176, 112, 4, 176, 25, 250, 109, 208, 17, 60, 149, 251, + 118, 219, 233, 51, 218, 76, 241, 0, 156, 112, 167, 43, 243, 42, 188, 137, + 122, 17, 232, 185, 21, 144, 184, 170, 51, 180, 202, 84, 59, 237, 102, 189, + 182, 185, 213, 1, 202, 227, 136, 71, 214, 7, 217, 20, 38, 127, 49, 101, + 174, 106, 225, 92, 128, 84, 3, 125, 57, 1, 57, 163, 221, 248, 171, 251, + 232, 96, 135, 207, 196, 132, 65, 135, 65, 116, 31, 141, 75, 214, 161, 144, + 247, 204, 5, 141, 126, 7, 70, 5, 140, 10, 248, 112, 201, 250, 32, 251, + 64, 191, 80, 188, 243, 172, 47, 115, 230, 46, 119, 134, 251, 51, 228, 178, + 142, 0, 14, 9, 66, 43, 140, 224, 148, 133, 30, 234, 36, 251, 201, 19, + 213, 11, 52, 202, 197, 173, 29, 122, 226, 219, 172, 100, 69, 251, 31, 183, + 44, 196, 165, 204, 153, 167, 153, 28, 76, 120, 112, 255, 13, 135, 187, 70, + 198, 138, 50, 154, 110, 148, 196, 100, 29, 50, 96, 134, 94, 254, 60, 225, + 12, 15, 129, 255, 79, 188, 100, 170, 252, 170, 239, 251, 227, 112, 198, 161, + 163, 176, 114, 72, 102, 122, 120, 171, 123, 8, 51, 98, 221, 121, 223, 160, + 241, 86, 231, 175, 40, 149, 53, 186, 127, 45, 88, 59, 159, 172, 16, 35, + 50, 66, 80, 251, 107, 89, 195, 132, 30, 51, 159, 88, 39, 97, 95, 12, + 216, 147, 61, 116, 249, 124, 10, 146, 238, 2, 134, 137, 2, 239, 14, 41, + 158, 121, 35, 155, 137, 135, 254, 66, 127, 20, 68, 73, 220, 82, 116, 184, + 27, 127, 113, 4, 31, 13, 172, 91, 137, 102, 185, 109, 80, 41, 9, 160, + 64, 176, 152, 58, 124, 129, 83, 62, 229, 14, 12, 19, 48, 108, 180, 220, + 244, 0, 1, 187, 15, 10, 7, 0, 128, 254, 130, 218, 151, 216, 81, 101, + 234, 35, 23, 28, 9, 195, 145, 156, 227, 14, 36, 125, 211, 65, 99, 38, + 74, 28, 206, 61, 136, 107, 9, 122, 28, 120, 92, 140, 185, 231, 89, 247, + 88, 129, 57, 3, 146, 16, 207, 37, 154, 170, 175, 22, 30, 80, 87, 7, + 97, 207, 65, 125, 1, 160, 254, 123, 8, 84, 207, 193, 149, 24, 131, 212, + 128, 200, 196, 0, 31, 228, 125, 201, 186, 148, 206, 16, 0, 153, 207, 60, + 6, 98, 243, 164, 100, 221, 72, 103, 50, 5, 145, 231, 144, 251, 19, 68, + 56, 64, 67, 105, 93, 125, 147, 220, 153, 32, 116, 47, 45, 90, 31, 36, + 84, 160, 209, 253, 177, 248, 198, 121, 80, 107, 87, 250, 142, 28, 249, 51, + 25, 40, 232, 168, 178, 190, 12, 131, 242, 148, 87, 136, 48, 190, 223, 214, + 21, 161, 87, 248, 94, 206, 66, 68, 144, 208, 71, 51, 36, 16, 106, 4, + 255, 9, 78, 193, 4, 176, 217, 169, 243, 26, 131, 86, 60, 135, 131, 166, + 118, 202, 125, 32, 14, 115, 127, 194, 76, 132, 132, 113, 179, 193, 64, 246, + 161, 247, 71, 220, 153, 130, 72, 114, 166, 16, 116, 140, 91, 98, 220, 197, + 181, 10, 97, 18, 194, 193, 132, 86, 238, 163, 35, 0, 247, 61, 104, 109, + 192, 188, 41, 188, 181, 111, 207, 209, 106, 112, 236, 142, 64, 4, 207, 7, + 47, 32, 48, 101, 144, 103, 28, 54, 170, 216, 188, 170, 174, 170, 219, 64, + 229, 16, 47, 21, 18, 12, 137, 138, 41, 96, 183, 3, 32, 13, 229, 83, + 149, 109, 6, 151, 1, 40, 129, 3, 221, 0, 14, 10, 115, 218, 123, 172, + 92, 195, 95, 196, 154, 19, 143, 13, 65, 16, 129, 229, 5, 108, 22, 19, + 107, 223, 153, 115, 15, 10, 62, 32, 225, 24, 224, 136, 165, 11, 125, 43, + 152, 50, 147, 132, 77, 249, 180, 15, 93, 57, 129, 245, 251, 2, 66, 46, + 64, 63, 94, 34, 9, 235, 137, 41, 8, 166, 43, 102, 126, 25, 187, 235, + 245, 214, 86, 179, 83, 239, 52, 255, 239, 121, 173, 93, 69, 68, 114, 164, + 111, 237, 138, 112, 18, 97, 135, 235, 0, 138, 238, 48, 15, 212, 60, 164, + 111, 184, 73, 193, 129, 178, 161, 56, 63, 17, 203, 115, 56, 229, 182, 96, + 19, 128, 214, 8, 221, 132, 77, 75, 32, 166, 122, 41, 255, 242, 159, 205, + 110, 253, 175, 139, 17, 20, 192, 210, 251, 214, 21, 144, 63, 230, 227, 151, + 96, 34, 166, 106, 111, 50, 219, 46, 177, 80, 16, 67, 194, 62, 181, 10, + 44, 141, 149, 199, 193, 218, 251, 35, 1, 164, 99, 44, 160, 141, 9, 159, + 176, 185, 254, 2, 204, 49, 32, 44, 10, 13, 40, 146, 231, 194, 118, 254, + 100, 180, 182, 26, 221, 86, 173, 182, 5, 115, 209, 170, 34, 111, 64, 101, + 220, 58, 10, 65, 76, 6, 210, 162, 39, 86, 19, 211, 70, 251, 175, 190, + 213, 147, 83, 57, 90, 228, 245, 54, 255, 3, 160, 171, 132, 64, 190, 253, + 181, 247, 31, 208, 218, 97, 237, 73, 79, 247, 25, 144, 70, 160, 0, 240, + 205, 14, 39, 242, 94, 12, 114, 154, 156, 178, 217, 76, 248, 99, 213, 30, + 218, 240, 53, 6, 134, 216, 28, 72, 160, 214, 174, 156, 246, 125, 171, 10, + 51, 73, 21, 243, 73, 225, 114, 167, 250, 160, 47, 1, 132, 174, 189, 223, + 185, 162, 139, 2, 248, 105, 215, 106, 179, 7, 53, 253, 51, 105, 163, 254, + 234, 216, 49, 79, 216, 241, 80, 41, 80, 111, 246, 66, 31, 248, 34, 7, + 86, 211, 7, 97, 193, 33, 40, 209, 59, 189, 187, 18, 8, 24, 176, 125, + 92, 109, 16, 34, 174, 198, 114, 74, 104, 187, 247, 13, 136, 254, 254, 98, + 50, 134, 241, 40, 36, 66, 70, 187, 139, 196, 12, 52, 17, 142, 112, 7, + 106, 162, 152, 162, 240, 0, 208, 20, 24, 244, 114, 47, 236, 163, 105, 25, + 87, 249, 67, 5, 94, 1, 246, 22, 102, 87, 60, 66, 109, 23, 52, 26, + 242, 158, 81, 162, 195, 199, 201, 68, 168, 46, 239, 49, 79, 132, 254, 35, + 52, 54, 45, 224, 58, 83, 218, 237, 210, 48, 29, 109, 125, 225, 171, 251, + 64, 137, 97, 2, 142, 16, 5, 125, 31, 136, 206, 142, 19, 14, 135, 189, + 0, 254, 92, 56, 97, 150, 65, 199, 20, 208, 67, 27, 186, 13, 227, 116, + 65, 44, 92, 67, 83, 51, 21, 192, 192, 34, 25, 228, 76, 32, 173, 103, + 86, 111, 128, 172, 40, 191, 29, 90, 193, 25, 232, 138, 82, 113, 123, 34, + 127, 61, 22, 222, 243, 130, 69, 180, 65, 164, 8, 80, 183, 156, 2, 133, + 2, 9, 196, 230, 40, 127, 128, 144, 127, 38, 144, 13, 232, 217, 224, 48, + 58, 128, 109, 197, 107, 242, 190, 11, 92, 7, 4, 248, 16, 72, 217, 152, + 13, 80, 236, 118, 112, 203, 17, 9, 58, 244, 129, 207, 128, 21, 51, 254, + 200, 50, 125, 176, 140, 6, 128, 123, 185, 114, 81, 14, 128, 126, 5, 190, + 234, 59, 129, 200, 194, 186, 16, 247, 24, 60, 1, 255, 231, 195, 175, 45, + 129, 168, 115, 4, 224, 74, 56, 81, 236, 28, 180, 197, 143, 84, 88, 48, + 104, 24, 6, 206, 79, 21, 8, 11, 140, 105, 237, 189, 250, 45, 150, 129, + 152, 27, 218, 76, 208, 220, 108, 211, 165, 170, 170, 54, 176, 122, 192, 177, + 93, 150, 207, 49, 103, 176, 224, 149, 145, 148, 32, 111, 19, 164, 132, 213, + 90, 181, 15, 36, 118, 179, 213, 170, 55, 154, 155, 91, 93, 224, 24, 205, + 90, 189, 222, 172, 119, 161, 180, 209, 110, 109, 118, 54, 59, 221, 246, 102, + 179, 81, 107, 116, 187, 173, 86, 87, 97, 52, 174, 35, 80, 91, 235, 0, + 168, 15, 128, 182, 250, 250, 105, 40, 70, 2, 128, 1, 22, 11, 198, 147, + 67, 120, 145, 59, 87, 102, 44, 176, 113, 66, 180, 104, 9, 210, 98, 228, + 41, 67, 35, 8, 1, 97, 62, 160, 234, 120, 41, 65, 204, 25, 133, 252, + 209, 186, 1, 82, 89, 34, 76, 4, 90, 252, 129, 77, 100, 191, 100, 157, + 0, 166, 237, 160, 164, 2, 189, 152, 242, 121, 254, 44, 13, 216, 12, 45, + 188, 83, 137, 90, 153, 90, 194, 94, 104, 139, 132, 15, 34, 10, 95, 0, + 125, 14, 38, 240, 129, 109, 144, 9, 108, 1, 178, 135, 51, 148, 110, 30, + 151, 3, 57, 100, 225, 59, 21, 32, 43, 54, 89, 108, 34, 17, 145, 245, + 145, 6, 247, 6, 99, 197, 111, 135, 100, 13, 43, 90, 185, 213, 108, 114, + 39, 4, 245, 234, 227, 47, 183, 82, 218, 186, 13, 152, 139, 64, 13, 26, + 191, 192, 102, 164, 150, 200, 169, 112, 129, 65, 223, 162, 66, 233, 151, 200, + 15, 112, 98, 157, 13, 64, 76, 31, 141, 1, 206, 115, 250, 222, 216, 98, + 149, 193, 24, 122, 251, 1, 120, 184, 15, 178, 249, 200, 93, 2, 70, 236, + 158, 120, 96, 64, 104, 132, 154, 172, 27, 9, 112, 139, 82, 160, 248, 76, + 165, 134, 204, 191, 131, 118, 126, 32, 37, 168, 25, 48, 96, 10, 35, 39, + 196, 57, 59, 229, 28, 201, 141, 0, 122, 80, 66, 63, 52, 148, 23, 208, + 66, 9, 90, 47, 48, 109, 144, 248, 24, 250, 67, 28, 194, 12, 74, 183, + 12, 34, 34, 234, 255, 40, 243, 0, 3, 134, 106, 54, 234, 13, 57, 252, + 26, 180, 219, 153, 7, 234, 187, 95, 145, 222, 8, 198, 112, 8, 218, 36, + 128, 94, 240, 168, 85, 13, 213, 175, 47, 190, 116, 2, 144, 103, 0, 64, + 99, 205, 237, 8, 200, 60, 139, 100, 219, 29, 238, 142, 2, 220, 18, 134, + 199, 130, 143, 164, 117, 142, 164, 24, 192, 183, 100, 221, 130, 180, 42, 216, + 212, 186, 154, 115, 110, 195, 176, 122, 99, 6, 162, 49, 48, 86, 233, 65, + 109, 220, 99, 196, 109, 233, 179, 208, 5, 57, 181, 128, 250, 46, 124, 114, + 168, 20, 77, 183, 60, 231, 204, 211, 186, 13, 149, 110, 83, 233, 45, 143, + 68, 78, 210, 73, 64, 108, 129, 78, 113, 83, 176, 222, 225, 33, 122, 77, + 1, 69, 187, 194, 93, 158, 157, 144, 190, 182, 39, 195, 1, 44, 46, 14, + 90, 122, 21, 156, 254, 1, 199, 237, 182, 241, 84, 51, 50, 16, 155, 65, + 134, 200, 210, 193, 98, 22, 63, 230, 238, 4, 132, 90, 144, 23, 64, 60, + 129, 107, 235, 132, 110, 180, 236, 224, 193, 196, 1, 212, 121, 54, 170, 134, + 187, 40, 84, 161, 255, 12, 86, 128, 245, 203, 248, 38, 29, 133, 12, 5, + 196, 188, 249, 248, 6, 8, 226, 7, 222, 98, 194, 61, 141, 39, 40, 70, + 194, 84, 82, 145, 250, 214, 37, 168, 224, 64, 52, 138, 84, 233, 28, 69, + 15, 21, 113, 31, 136, 57, 3, 13, 121, 237, 253, 37, 93, 0, 55, 193, + 210, 23, 161, 28, 115, 248, 176, 182, 246, 30, 1, 3, 180, 96, 54, 2, + 54, 62, 89, 69, 109, 65, 42, 18, 64, 160, 89, 128, 244, 150, 110, 172, + 27, 49, 16, 106, 54, 64, 35, 66, 253, 88, 189, 127, 35, 92, 180, 239, + 34, 240, 79, 113, 77, 76, 171, 130, 4, 205, 224, 249, 98, 111, 179, 211, + 172, 109, 118, 218, 117, 45, 234, 93, 42, 175, 4, 132, 98, 144, 95, 7, + 218, 144, 176, 7, 16, 161, 21, 141, 15, 160, 9, 133, 197, 240, 169, 200, + 221, 55, 228, 16, 125, 62, 152, 104, 248, 212, 68, 112, 135, 15, 10, 198, + 143, 248, 229, 128, 224, 207, 43, 65, 56, 237, 59, 209, 98, 66, 111, 208, + 167, 88, 146, 82, 160, 135, 126, 8, 10, 14, 250, 246, 72, 185, 172, 186, + 20, 241, 158, 55, 68, 187, 174, 248, 40, 152, 242, 5, 44, 12, 122, 95, + 131, 176, 168, 40, 90, 92, 28, 137, 64, 200, 71, 79, 0, 99, 61, 36, + 61, 185, 243, 184, 0, 230, 4, 226, 150, 106, 223, 135, 6, 39, 238, 96, + 22, 212, 145, 231, 43, 245, 118, 164, 59, 171, 61, 118, 177, 140, 139, 0, + 4, 253, 28, 67, 8, 204, 183, 131, 166, 102, 183, 50, 231, 125, 104, 17, + 196, 98, 20, 203, 80, 178, 173, 114, 144, 95, 65, 198, 44, 215, 203, 120, + 91, 134, 47, 196, 170, 28, 240, 191, 72, 106, 91, 182, 243, 12, 64, 235, + 26, 146, 171, 240, 194, 208, 86, 65, 173, 188, 161, 71, 0, 74, 244, 76, + 203, 169, 74, 147, 163, 190, 63, 119, 66, 247, 196, 84, 0, 85, 148, 254, + 133, 191, 24, 140, 229, 8, 174, 80, 197, 209, 133, 86, 82, 90, 32, 138, + 100, 27, 125, 3, 0, 31, 136, 211, 16, 184, 47, 1, 127, 128, 56, 43, + 167, 121, 178, 15, 157, 98, 62, 199, 45, 6, 5, 38, 223, 248, 2, 45, + 18, 160, 166, 216, 64, 245, 201, 58, 97, 93, 1, 117, 185, 99, 17, 181, + 209, 76, 125, 223, 25, 2, 173, 144, 0, 52, 55, 128, 153, 110, 128, 252, + 116, 71, 46, 208, 233, 254, 144, 3, 205, 7, 66, 204, 112, 255, 52, 136, + 228, 96, 164, 158, 200, 179, 149, 29, 227, 196, 149, 15, 203, 115, 29, 200, + 105, 128, 106, 134, 59, 34, 140, 34, 225, 35, 158, 113, 146, 174, 245, 215, + 175, 84, 45, 109, 6, 25, 35, 43, 152, 89, 151, 214, 23, 1, 124, 107, + 74, 82, 59, 39, 171, 7, 232, 107, 82, 248, 21, 186, 122, 196, 199, 30, + 71, 218, 5, 144, 228, 251, 184, 106, 210, 2, 130, 244, 8, 220, 228, 202, + 7, 145, 12, 168, 42, 232, 125, 5, 194, 181, 124, 240, 248, 64, 161, 224, + 14, 93, 91, 167, 129, 93, 76, 128, 230, 210, 25, 142, 96, 210, 0, 187, + 231, 92, 60, 198, 36, 245, 86, 151, 163, 104, 160, 30, 20, 183, 129, 222, + 180, 238, 84, 249, 166, 69, 72, 156, 246, 87, 35, 242, 37, 209, 212, 2, + 202, 18, 179, 157, 37, 36, 203, 131, 14, 100, 71, 242, 11, 144, 30, 101, + 200, 147, 22, 94, 23, 152, 184, 114, 223, 189, 226, 54, 115, 108, 17, 189, + 174, 111, 243, 91, 24, 44, 200, 57, 120, 228, 177, 217, 152, 107, 22, 11, + 114, 34, 136, 78, 40, 121, 168, 119, 128, 153, 249, 32, 180, 3, 12, 1, + 180, 239, 56, 44, 120, 4, 114, 141, 172, 11, 45, 15, 164, 188, 144, 4, + 112, 196, 61, 108, 11, 237, 87, 104, 219, 205, 87, 168, 148, 189, 183, 252, + 72, 46, 50, 104, 108, 89, 91, 246, 155, 193, 111, 38, 68, 254, 12, 193, + 115, 48, 64, 245, 177, 98, 93, 86, 180, 180, 116, 42, 220, 28, 185, 134, + 32, 114, 202, 1, 172, 199, 124, 36, 166, 51, 45, 221, 144, 85, 12, 181, + 72, 87, 122, 121, 230, 226, 60, 36, 5, 81, 189, 217, 222, 172, 117, 187, + 237, 90, 187, 213, 237, 110, 182, 59, 221, 70, 51, 34, 166, 90, 22, 66, + 43, 134, 204, 159, 215, 17, 119, 5, 144, 179, 97, 160, 1, 3, 120, 12, + 144, 49, 119, 52, 22, 46, 58, 195, 173, 224, 173, 184, 133, 12, 42, 176, + 95, 17, 74, 152, 71, 165, 224, 2, 151, 48, 81, 11, 242, 181, 0, 68, + 201, 41, 90, 214, 70, 241, 66, 10, 197, 81, 64, 3, 23, 69, 26, 254, + 242, 184, 219, 91, 237, 102, 167, 211, 105, 108, 110, 181, 107, 91, 91, 237, + 173, 70, 187, 187, 182, 228, 200, 247, 204, 182, 58, 157, 54, 232, 63, 245, + 86, 167, 94, 107, 109, 54, 129, 1, 183, 54, 213, 130, 131, 60, 228, 174, + 146, 48, 76, 238, 77, 241, 38, 64, 6, 249, 100, 194, 157, 170, 166, 125, + 55, 220, 187, 231, 126, 129, 241, 95, 181, 0, 204, 77, 14, 236, 1, 169, + 69, 115, 49, 17, 240, 234, 1, 21, 162, 197, 0, 132, 109, 1, 2, 50, + 42, 219, 187, 99, 160, 75, 5, 24, 70, 194, 138, 23, 204, 81, 180, 180, + 169, 59, 232, 96, 230, 195, 178, 14, 167, 255, 141, 151, 246, 187, 122, 109, + 171, 14, 51, 116, 186, 112, 184, 117, 2, 194, 157, 131, 45, 85, 44, 220, + 195, 124, 166, 235, 195, 11, 55, 117, 162, 240, 163, 40, 250, 168, 104, 107, + 231, 159, 198, 214, 206, 45, 255, 229, 30, 247, 26, 7, 28, 212, 55, 202, + 40, 221, 234, 208, 131, 89, 28, 203, 68, 27, 196, 169, 93, 97, 224, 27, + 227, 208, 7, 212, 12, 112, 99, 216, 26, 130, 12, 142, 60, 199, 26, 80, + 124, 80, 159, 71, 91, 222, 173, 77, 4, 9, 116, 19, 161, 14, 89, 111, + 55, 150, 99, 166, 158, 222, 101, 154, 101, 134, 101, 173, 99, 119, 221, 192, + 89, 36, 253, 30, 10, 207, 15, 54, 172, 165, 124, 214, 255, 164, 253, 166, + 37, 128, 140, 130, 222, 224, 167, 26, 53, 191, 217, 172, 124, 155, 141, 8, + 35, 65, 116, 19, 46, 200, 204, 62, 106, 215, 148, 159, 109, 253, 2, 40, + 132, 63, 5, 145, 103, 92, 189, 238, 109, 111, 228, 0, 121, 110, 155, 13, + 213, 102, 228, 46, 123, 11, 108, 12, 70, 209, 15, 189, 145, 34, 104, 214, + 250, 142, 68, 55, 150, 234, 33, 121, 163, 45, 158, 221, 112, 77, 53, 156, + 236, 0, 185, 129, 86, 134, 173, 245, 23, 116, 176, 179, 165, 218, 65, 59, + 192, 204, 58, 224, 125, 47, 234, 215, 5, 42, 65, 192, 172, 170, 103, 28, + 168, 227, 128, 61, 187, 197, 174, 106, 49, 18, 162, 15, 29, 110, 251, 42, + 236, 204, 90, 63, 231, 243, 1, 64, 13, 32, 68, 56, 3, 22, 17, 44, + 92, 94, 221, 7, 224, 5, 174, 248, 236, 246, 55, 117, 143, 137, 240, 124, + 96, 115, 25, 201, 128, 214, 250, 173, 0, 237, 105, 198, 71, 213, 93, 230, + 50, 251, 249, 93, 238, 232, 201, 148, 115, 7, 67, 176, 176, 41, 21, 240, + 247, 236, 22, 218, 170, 5, 205, 211, 247, 36, 239, 115, 13, 56, 71, 12, + 189, 98, 220, 151, 46, 112, 167, 149, 93, 224, 48, 89, 224, 29, 76, 128, + 37, 171, 189, 25, 19, 238, 179, 27, 212, 224, 221, 227, 203, 137, 241, 173, + 117, 205, 202, 31, 95, 220, 77, 13, 224, 74, 97, 184, 228, 247, 82, 55, + 120, 5, 164, 64, 130, 90, 80, 125, 225, 68, 214, 85, 123, 135, 34, 116, + 136, 30, 187, 252, 158, 130, 82, 8, 36, 225, 35, 172, 122, 28, 48, 231, + 249, 253, 211, 120, 178, 227, 133, 174, 84, 172, 190, 207, 6, 227, 8, 167, + 93, 27, 183, 104, 60, 111, 81, 61, 134, 203, 103, 3, 76, 91, 99, 13, + 217, 187, 105, 255, 77, 206, 53, 216, 0, 153, 176, 110, 225, 207, 184, 122, + 5, 90, 143, 255, 18, 98, 209, 214, 152, 163, 244, 167, 115, 206, 148, 225, + 214, 90, 239, 45, 80, 238, 170, 110, 135, 62, 58, 51, 189, 160, 155, 155, + 38, 245, 177, 126, 165, 32, 132, 33, 244, 245, 31, 170, 221, 23, 205, 100, + 91, 35, 137, 138, 62, 184, 172, 196, 1, 8, 26, 175, 129, 1, 120, 147, + 23, 13, 87, 227, 204, 135, 16, 221, 151, 172, 11, 144, 99, 30, 135, 220, + 209, 45, 190, 16, 14, 219, 26, 93, 110, 209, 249, 211, 179, 206, 184, 136, + 232, 216, 75, 27, 106, 174, 192, 187, 75, 80, 98, 94, 6, 127, 109, 141, + 31, 20, 38, 112, 42, 34, 252, 229, 206, 72, 132, 211, 103, 55, 162, 145, + 226, 11, 192, 43, 191, 252, 17, 250, 212, 142, 208, 0, 93, 205, 118, 43, + 47, 102, 19, 45, 13, 240, 145, 17, 227, 170, 242, 35, 189, 104, 117, 87, + 204, 237, 41, 110, 156, 63, 27, 180, 91, 17, 104, 79, 38, 11, 235, 215, + 67, 16, 233, 161, 99, 129, 134, 235, 23, 35, 74, 171, 157, 12, 15, 71, + 71, 202, 234, 15, 129, 79, 43, 34, 219, 2, 195, 24, 203, 119, 247, 92, + 183, 115, 236, 80, 64, 214, 14, 40, 73, 47, 36, 137, 45, 13, 145, 7, + 32, 148, 128, 200, 115, 196, 166, 76, 197, 123, 18, 153, 245, 112, 35, 250, + 165, 157, 172, 199, 146, 142, 20, 129, 117, 200, 66, 80, 103, 57, 57, 150, + 69, 170, 183, 117, 42, 31, 163, 174, 31, 201, 73, 232, 51, 81, 253, 192, + 64, 152, 124, 246, 55, 52, 196, 161, 213, 236, 18, 119, 78, 61, 208, 55, + 195, 190, 27, 117, 188, 199, 29, 1, 186, 16, 48, 29, 59, 120, 105, 255, + 155, 17, 52, 82, 64, 214, 25, 154, 91, 92, 169, 154, 69, 83, 175, 188, + 127, 33, 146, 54, 55, 139, 136, 199, 25, 232, 86, 14, 76, 247, 139, 123, + 168, 137, 101, 58, 176, 146, 38, 147, 59, 32, 174, 131, 206, 113, 32, 220, + 151, 136, 61, 205, 102, 222, 154, 169, 54, 119, 1, 214, 65, 69, 112, 129, + 57, 190, 0, 167, 155, 181, 168, 143, 230, 102, 76, 196, 198, 112, 67, 208, + 218, 21, 1, 29, 125, 243, 67, 237, 55, 244, 42, 145, 146, 233, 114, 220, + 210, 199, 93, 254, 88, 18, 12, 17, 99, 65, 111, 235, 205, 69, 240, 136, + 158, 21, 207, 159, 140, 198, 102, 4, 0, 209, 214, 171, 18, 208, 177, 141, + 23, 117, 81, 47, 83, 100, 73, 190, 4, 161, 197, 137, 23, 31, 19, 64, + 188, 16, 87, 27, 26, 253, 207, 254, 27, 254, 209, 32, 20, 186, 226, 229, + 0, 212, 136, 144, 190, 98, 109, 59, 125, 33, 117, 151, 62, 176, 1, 123, + 153, 216, 215, 208, 12, 40, 10, 64, 60, 254, 28, 83, 110, 31, 131, 6, + 94, 134, 41, 141, 72, 60, 11, 23, 214, 133, 20, 143, 202, 201, 14, 167, + 170, 207, 81, 126, 92, 188, 116, 190, 52, 12, 30, 3, 33, 16, 65, 24, + 144, 31, 233, 142, 192, 148, 25, 24, 219, 22, 136, 9, 234, 185, 84, 66, + 225, 30, 49, 236, 140, 201, 166, 52, 122, 233, 180, 214, 35, 153, 131, 51, + 183, 172, 169, 253, 45, 239, 247, 117, 195, 135, 33, 104, 255, 32, 182, 206, + 94, 42, 182, 214, 91, 145, 82, 34, 166, 186, 173, 29, 218, 60, 146, 110, + 180, 94, 90, 241, 255, 127, 207, 84, 252, 207, 216, 66, 7, 121, 96, 140, + 14, 168, 212, 228, 120, 187, 144, 97, 18, 212, 115, 56, 5, 38, 138, 248, + 121, 41, 109, 123, 241, 118, 248, 240, 117, 68, 37, 165, 248, 42, 138, 3, + 139, 154, 7, 20, 28, 200, 64, 165, 65, 121, 55, 24, 75, 49, 0, 5, + 89, 55, 179, 222, 95, 88, 123, 28, 164, 109, 27, 207, 182, 50, 10, 21, + 146, 25, 133, 127, 193, 61, 188, 62, 122, 250, 167, 158, 82, 47, 82, 101, + 207, 25, 171, 138, 28, 18, 239, 85, 219, 56, 69, 81, 224, 4, 142, 222, + 101, 73, 180, 85, 202, 2, 49, 165, 145, 224, 134, 12, 197, 88, 88, 20, + 176, 65, 28, 108, 0, 50, 133, 21, 0, 111, 241, 200, 45, 117, 226, 202, + 185, 111, 141, 229, 28, 237, 9, 182, 132, 23, 71, 98, 80, 177, 138, 62, + 202, 212, 171, 37, 75, 84, 120, 197, 26, 130, 166, 84, 178, 224, 13, 71, + 113, 71, 238, 240, 17, 48, 152, 146, 245, 13, 67, 7, 152, 191, 220, 47, + 74, 16, 0, 237, 188, 133, 245, 222, 166, 232, 162, 133, 250, 164, 96, 24, + 206, 148, 251, 89, 213, 69, 29, 234, 5, 53, 70, 98, 138, 21, 124, 149, + 70, 7, 191, 59, 214, 163, 180, 133, 135, 158, 229, 88, 164, 92, 111, 65, + 30, 192, 200, 33, 230, 162, 215, 181, 158, 39, 90, 221, 51, 252, 230, 228, + 23, 244, 215, 126, 36, 71, 50, 169, 2, 34, 14, 209, 158, 43, 6, 241, + 227, 161, 39, 71, 57, 65, 5, 170, 159, 180, 162, 169, 217, 81, 201, 90, + 244, 236, 235, 184, 110, 110, 91, 254, 140, 15, 196, 80, 39, 185, 25, 202, + 56, 197, 205, 54, 153, 196, 196, 192, 170, 34, 140, 10, 71, 132, 42, 116, + 84, 187, 70, 103, 125, 194, 255, 238, 230, 184, 11, 231, 205, 152, 62, 251, + 108, 169, 139, 99, 244, 230, 236, 163, 7, 78, 31, 58, 170, 67, 93, 108, + 170, 110, 123, 108, 238, 98, 24, 227, 146, 211, 246, 26, 130, 43, 98, 189, + 175, 1, 87, 123, 106, 231, 248, 250, 44, 245, 14, 90, 94, 62, 75, 206, + 208, 133, 173, 245, 4, 165, 140, 54, 201, 43, 195, 195, 10, 170, 221, 104, + 254, 47, 60, 113, 207, 6, 11, 235, 92, 194, 164, 241, 213, 129, 70, 241, + 249, 113, 160, 59, 97, 158, 160, 56, 204, 45, 156, 149, 3, 89, 198, 216, + 166, 104, 158, 41, 8, 68, 168, 56, 149, 56, 80, 174, 232, 128, 130, 181, + 247, 230, 185, 4, 62, 90, 83, 61, 21, 196, 113, 28, 68, 104, 57, 96, + 62, 87, 81, 56, 100, 119, 139, 163, 115, 44, 70, 161, 151, 24, 142, 199, + 253, 113, 20, 189, 169, 3, 48, 113, 21, 102, 220, 19, 0, 8, 10, 80, + 136, 162, 81, 221, 239, 33, 119, 97, 216, 115, 128, 204, 113, 20, 88, 226, + 243, 32, 10, 158, 33, 207, 1, 119, 228, 3, 252, 51, 180, 104, 131, 128, + 206, 49, 24, 211, 179, 252, 113, 100, 113, 100, 115, 12, 91, 160, 120, 154, + 116, 108, 28, 230, 69, 242, 166, 42, 116, 2, 231, 137, 66, 141, 84, 232, + 160, 157, 204, 134, 26, 167, 133, 123, 86, 20, 17, 118, 124, 17, 7, 252, + 105, 180, 26, 96, 146, 155, 224, 175, 22, 77, 44, 197, 96, 136, 132, 54, + 209, 16, 252, 64, 69, 113, 3, 93, 152, 115, 164, 70, 68, 152, 198, 104, + 17, 240, 81, 68, 29, 149, 200, 73, 30, 218, 65, 31, 121, 79, 134, 163, + 49, 189, 124, 116, 117, 117, 129, 14, 243, 129, 28, 72, 7, 63, 190, 118, + 141, 99, 219, 6, 241, 56, 88, 163, 22, 199, 156, 161, 249, 116, 40, 64, + 61, 46, 233, 105, 2, 228, 27, 120, 162, 207, 213, 138, 12, 209, 155, 69, + 67, 3, 134, 162, 83, 160, 136, 143, 95, 159, 199, 49, 72, 115, 10, 187, + 130, 126, 163, 253, 109, 157, 87, 96, 34, 215, 162, 0, 222, 242, 39, 197, + 123, 15, 143, 207, 46, 172, 70, 165, 11, 92, 133, 18, 71, 88, 157, 150, + 213, 23, 129, 15, 247, 141, 74, 163, 82, 71, 142, 242, 159, 245, 110, 173, + 89, 171, 43, 59, 182, 2, 13, 0, 216, 120, 242, 1, 70, 178, 115, 238, + 75, 135, 59, 52, 245, 20, 76, 140, 31, 154, 133, 30, 22, 1, 69, 193, + 64, 91, 192, 61, 31, 131, 57, 148, 99, 7, 62, 4, 206, 202, 125, 232, + 224, 243, 248, 229, 114, 140, 96, 97, 106, 151, 31, 15, 17, 236, 86, 107, + 205, 170, 26, 247, 114, 136, 224, 165, 10, 116, 161, 153, 120, 42, 147, 86, + 25, 137, 87, 163, 86, 219, 130, 214, 170, 245, 38, 145, 174, 183, 241, 178, + 193, 199, 234, 149, 102, 165, 166, 210, 144, 16, 226, 50, 39, 142, 133, 211, + 1, 53, 56, 239, 81, 59, 245, 90, 21, 155, 202, 109, 167, 165, 218, 49, + 107, 215, 171, 181, 77, 248, 47, 175, 118, 123, 185, 118, 171, 90, 235, 86, + 27, 181, 188, 218, 157, 229, 218, 29, 156, 162, 70, 59, 175, 246, 230, 114, + 109, 232, 70, 187, 218, 216, 90, 174, 221, 168, 212, 242, 106, 211, 64, 243, + 106, 215, 151, 107, 195, 98, 53, 170, 245, 156, 158, 32, 24, 231, 213, 238, + 84, 27, 245, 188, 218, 205, 188, 218, 216, 147, 86, 94, 237, 156, 249, 198, + 165, 41, 232, 73, 206, 124, 67, 237, 86, 193, 156, 228, 204, 247, 22, 174, + 78, 61, 183, 39, 57, 243, 189, 85, 173, 55, 10, 250, 221, 93, 170, 221, + 168, 209, 90, 118, 243, 106, 111, 165, 106, 23, 109, 81, 189, 143, 219, 201, + 135, 78, 108, 167, 161, 160, 124, 55, 244, 40, 234, 197, 39, 119, 212, 141, + 74, 18, 117, 252, 36, 1, 80, 60, 247, 6, 164, 92, 11, 29, 104, 49, + 253, 14, 165, 144, 11, 103, 232, 70, 2, 12, 96, 202, 190, 1, 189, 137, + 190, 187, 14, 235, 105, 30, 222, 106, 11, 127, 16, 250, 126, 101, 38, 30, + 28, 191, 18, 250, 213, 160, 42, 221, 50, 144, 203, 178, 7, 204, 20, 57, + 105, 179, 92, 203, 134, 124, 235, 239, 57, 138, 74, 76, 113, 251, 216, 248, + 248, 58, 12, 236, 137, 79, 104, 44, 46, 203, 97, 25, 185, 109, 185, 81, + 222, 122, 226, 27, 52, 136, 212, 55, 158, 26, 198, 242, 55, 106, 198, 72, + 190, 194, 226, 108, 123, 30, 91, 96, 106, 165, 43, 65, 94, 93, 253, 247, + 250, 33, 61, 176, 126, 61, 192, 4, 3, 255, 64, 197, 130, 97, 193, 215, + 33, 220, 151, 82, 119, 57, 137, 38, 62, 151, 169, 181, 119, 194, 197, 112, + 201, 58, 134, 75, 70, 143, 238, 138, 31, 125, 46, 127, 28, 14, 145, 229, + 175, 255, 215, 198, 59, 21, 107, 89, 163, 88, 75, 243, 237, 39, 171, 96, + 135, 209, 39, 215, 51, 43, 117, 107, 244, 169, 76, 173, 125, 224, 224, 73, + 157, 173, 108, 157, 51, 129, 110, 193, 90, 71, 90, 95, 59, 7, 58, 14, + 179, 253, 185, 188, 253, 32, 124, 184, 184, 139, 46, 62, 227, 21, 247, 19, + 33, 176, 39, 30, 249, 187, 175, 209, 123, 189, 49, 240, 253, 9, 212, 219, + 127, 152, 161, 172, 8, 90, 18, 159, 129, 80, 106, 253, 122, 198, 167, 120, + 174, 240, 46, 200, 100, 33, 130, 233, 127, 252, 227, 167, 10, 135, 175, 1, + 13, 2, 106, 145, 207, 235, 52, 120, 168, 57, 74, 65, 200, 148, 138, 74, + 153, 251, 28, 40, 57, 14, 116, 98, 14, 5, 13, 245, 223, 2, 26, 84, + 55, 207, 64, 35, 139, 214, 177, 177, 106, 9, 75, 107, 141, 165, 213, 60, + 86, 220, 23, 13, 29, 208, 215, 24, 28, 62, 122, 2, 4, 45, 138, 19, + 85, 147, 96, 125, 78, 46, 239, 72, 23, 14, 80, 76, 220, 170, 129, 74, + 13, 250, 85, 92, 0, 146, 83, 166, 164, 177, 169, 75, 226, 111, 42, 80, + 177, 20, 32, 81, 10, 142, 33, 115, 128, 227, 71, 207, 119, 61, 57, 163, + 81, 227, 196, 101, 199, 252, 7, 1, 29, 116, 78, 150, 211, 127, 188, 85, + 80, 226, 209, 93, 201, 188, 49, 64, 165, 167, 142, 193, 54, 233, 74, 27, + 192, 165, 81, 203, 214, 184, 43, 174, 177, 71, 105, 118, 148, 64, 106, 54, + 180, 89, 92, 237, 174, 184, 218, 31, 106, 146, 45, 74, 197, 227, 27, 72, + 74, 57, 58, 74, 233, 219, 2, 2, 158, 153, 198, 21, 51, 252, 113, 198, + 6, 34, 88, 68, 168, 88, 105, 35, 96, 254, 225, 102, 76, 229, 129, 72, + 230, 42, 153, 165, 159, 139, 209, 189, 178, 167, 85, 139, 233, 15, 4, 46, + 105, 64, 203, 136, 55, 232, 58, 111, 92, 199, 139, 89, 219, 120, 19, 83, + 213, 49, 198, 210, 4, 209, 148, 182, 75, 107, 187, 148, 248, 0, 230, 100, + 7, 72, 2, 204, 197, 30, 208, 252, 0, 39, 53, 190, 56, 197, 28, 157, + 100, 11, 57, 229, 232, 137, 139, 101, 215, 232, 170, 152, 41, 163, 14, 193, + 239, 46, 250, 195, 244, 66, 245, 242, 25, 195, 24, 205, 197, 180, 47, 29, + 99, 125, 212, 71, 225, 91, 148, 133, 10, 62, 251, 14, 115, 146, 172, 175, + 89, 21, 249, 177, 150, 84, 219, 6, 230, 179, 240, 65, 211, 238, 129, 186, + 204, 21, 11, 237, 148, 186, 0, 35, 205, 156, 58, 83, 41, 131, 49, 6, + 164, 105, 104, 170, 183, 51, 224, 212, 91, 184, 232, 106, 181, 186, 189, 75, + 238, 135, 78, 96, 93, 45, 102, 38, 63, 189, 29, 139, 0, 115, 147, 160, + 255, 231, 0, 65, 137, 126, 41, 203, 11, 62, 193, 81, 35, 125, 1, 173, + 223, 168, 99, 20, 93, 97, 246, 56, 128, 38, 180, 117, 172, 134, 176, 67, + 54, 157, 178, 24, 31, 202, 205, 82, 210, 181, 165, 17, 214, 42, 152, 169, + 163, 157, 76, 43, 209, 192, 24, 95, 14, 208, 90, 162, 202, 144, 237, 39, + 151, 205, 228, 178, 149, 92, 118, 147, 203, 186, 81, 185, 222, 73, 174, 15, + 81, 146, 198, 185, 163, 246, 232, 142, 154, 139, 174, 90, 241, 85, 55, 190, + 170, 39, 21, 161, 41, 117, 185, 122, 10, 62, 134, 193, 44, 12, 52, 128, + 31, 0, 137, 89, 202, 209, 165, 107, 28, 80, 42, 158, 119, 95, 85, 74, + 158, 165, 6, 240, 85, 52, 173, 191, 251, 170, 160, 75, 37, 172, 210, 216, + 81, 9, 30, 158, 90, 138, 200, 114, 186, 139, 206, 152, 214, 24, 55, 143, + 41, 115, 151, 101, 243, 128, 65, 219, 182, 182, 78, 205, 130, 216, 46, 29, + 103, 157, 171, 164, 77, 161, 35, 189, 117, 79, 134, 80, 68, 202, 64, 206, + 196, 160, 50, 27, 207, 254, 123, 248, 174, 209, 253, 75, 240, 14, 0, 181, + 181, 249, 83, 81, 31, 80, 208, 55, 73, 163, 205, 163, 62, 187, 152, 252, + 161, 47, 1, 213, 145, 252, 12, 226, 187, 82, 234, 206, 32, 65, 177, 90, + 66, 166, 84, 34, 208, 136, 127, 157, 22, 48, 142, 118, 189, 145, 0, 57, + 31, 200, 72, 46, 204, 173, 160, 26, 80, 188, 35, 22, 14, 115, 90, 88, + 81, 99, 27, 29, 73, 77, 158, 211, 125, 46, 135, 87, 31, 39, 124, 120, + 167, 36, 138, 255, 172, 209, 63, 195, 97, 246, 251, 169, 74, 67, 253, 207, + 234, 245, 189, 80, 179, 149, 34, 62, 132, 197, 0, 76, 7, 210, 163, 56, + 254, 35, 233, 137, 71, 202, 161, 96, 20, 222, 112, 143, 76, 138, 72, 152, + 128, 246, 44, 87, 140, 75, 141, 154, 123, 225, 12, 0, 27, 165, 243, 43, + 57, 75, 221, 159, 242, 97, 144, 42, 80, 153, 33, 82, 69, 151, 152, 228, + 48, 85, 146, 250, 96, 82, 108, 124, 17, 128, 6, 19, 144, 114, 219, 188, + 182, 142, 93, 180, 90, 240, 181, 165, 105, 232, 65, 19, 193, 187, 153, 36, + 57, 12, 86, 16, 151, 170, 6, 210, 88, 242, 63, 165, 41, 250, 90, 251, + 137, 144, 102, 37, 203, 6, 126, 199, 125, 196, 23, 27, 47, 74, 209, 133, + 129, 29, 192, 125, 164, 19, 146, 22, 22, 165, 98, 74, 201, 85, 49, 90, + 52, 90, 192, 183, 58, 173, 52, 233, 39, 45, 208, 137, 32, 167, 30, 113, + 41, 250, 236, 90, 196, 196, 162, 59, 250, 85, 187, 19, 17, 163, 58, 15, + 49, 150, 173, 224, 97, 79, 216, 252, 41, 202, 253, 251, 206, 117, 147, 8, + 84, 167, 96, 174, 105, 39, 236, 76, 5, 4, 208, 156, 99, 193, 87, 29, + 33, 80, 202, 22, 24, 146, 175, 245, 214, 250, 255, 162, 1, 157, 178, 5, + 79, 4, 208, 186, 143, 16, 223, 32, 17, 178, 233, 225, 223, 86, 48, 134, + 191, 109, 250, 219, 161, 191, 155, 244, 183, 75, 127, 183, 232, 111, 189, 166, + 126, 234, 234, 167, 161, 126, 154, 234, 71, 53, 80, 87, 45, 212, 177, 137, + 132, 74, 249, 190, 164, 19, 71, 236, 60, 130, 19, 87, 251, 34, 229, 84, + 3, 75, 185, 174, 81, 34, 17, 195, 119, 233, 48, 14, 52, 16, 38, 98, + 118, 123, 89, 20, 127, 86, 53, 69, 54, 163, 201, 136, 85, 252, 68, 253, + 55, 244, 254, 101, 133, 255, 235, 187, 123, 230, 132, 28, 58, 185, 84, 84, + 123, 171, 254, 109, 211, 127, 181, 215, 231, 255, 107, 158, 63, 77, 67, 254, + 214, 127, 143, 155, 77, 111, 201, 176, 110, 166, 245, 141, 115, 246, 49, 11, + 132, 41, 203, 65, 76, 93, 206, 103, 232, 11, 164, 93, 26, 201, 177, 146, + 196, 124, 213, 58, 93, 32, 195, 141, 98, 206, 203, 184, 141, 135, 25, 225, + 102, 42, 131, 155, 45, 134, 148, 87, 45, 80, 121, 62, 125, 29, 245, 193, + 92, 149, 198, 20, 115, 182, 140, 92, 149, 196, 81, 125, 53, 144, 152, 144, + 86, 181, 77, 175, 24, 25, 40, 177, 27, 250, 243, 232, 27, 147, 161, 82, + 63, 3, 25, 237, 226, 254, 28, 238, 197, 228, 145, 209, 253, 135, 192, 99, + 3, 144, 183, 250, 116, 220, 14, 18, 82, 174, 138, 190, 74, 85, 84, 90, + 46, 202, 49, 35, 160, 0, 162, 54, 78, 208, 163, 202, 85, 90, 191, 98, + 237, 64, 102, 86, 79, 135, 226, 109, 87, 210, 225, 228, 173, 164, 248, 31, + 137, 2, 237, 78, 86, 110, 3, 16, 193, 77, 121, 80, 8, 98, 227, 225, + 18, 29, 59, 3, 0, 129, 81, 130, 238, 204, 99, 77, 171, 210, 204, 104, + 82, 42, 69, 242, 61, 138, 130, 17, 197, 3, 69, 24, 40, 219, 17, 8, + 62, 201, 250, 197, 186, 74, 108, 110, 168, 129, 108, 227, 145, 64, 213, 227, + 163, 36, 123, 223, 243, 36, 191, 195, 16, 185, 236, 59, 82, 119, 126, 42, + 187, 82, 187, 218, 104, 86, 107, 5, 114, 77, 172, 41, 233, 12, 178, 252, + 97, 230, 168, 156, 190, 168, 52, 37, 154, 208, 211, 90, 208, 230, 86, 173, + 157, 120, 126, 121, 48, 140, 95, 119, 65, 89, 3, 52, 102, 46, 217, 171, + 40, 177, 236, 8, 30, 148, 204, 155, 117, 147, 229, 197, 50, 18, 112, 195, + 70, 74, 238, 191, 91, 241, 236, 39, 152, 227, 149, 178, 163, 154, 140, 35, + 254, 192, 70, 210, 101, 78, 122, 50, 190, 142, 163, 242, 82, 126, 177, 1, + 76, 134, 136, 137, 19, 209, 36, 9, 179, 209, 53, 33, 154, 226, 237, 34, + 196, 168, 163, 212, 93, 73, 80, 99, 219, 13, 68, 121, 219, 17, 12, 227, + 241, 126, 74, 72, 197, 237, 223, 2, 255, 5, 53, 139, 87, 152, 238, 46, + 177, 129, 38, 243, 21, 196, 15, 74, 5, 229, 6, 164, 93, 48, 180, 124, + 97, 158, 95, 59, 24, 71, 64, 213, 77, 205, 101, 84, 229, 136, 163, 182, + 164, 234, 116, 11, 234, 152, 74, 31, 208, 144, 148, 54, 101, 234, 80, 152, + 56, 80, 105, 80, 97, 31, 113, 107, 143, 35, 167, 193, 197, 128, 155, 99, + 55, 190, 201, 46, 104, 158, 66, 218, 125, 25, 47, 254, 205, 87, 174, 214, + 37, 151, 141, 188, 149, 59, 195, 180, 239, 61, 206, 166, 24, 28, 111, 253, + 186, 7, 60, 154, 178, 176, 210, 10, 78, 225, 225, 87, 95, 63, 44, 101, + 11, 114, 216, 209, 254, 247, 16, 247, 187, 64, 213, 165, 133, 201, 55, 63, + 175, 164, 212, 209, 230, 216, 187, 140, 105, 234, 138, 12, 67, 186, 86, 180, + 158, 205, 82, 100, 188, 110, 60, 212, 81, 80, 126, 104, 208, 53, 254, 109, + 62, 52, 81, 145, 120, 104, 61, 147, 69, 188, 26, 7, 254, 237, 198, 129, + 127, 62, 41, 108, 142, 185, 51, 67, 135, 47, 20, 48, 239, 177, 207, 32, + 96, 82, 242, 96, 225, 34, 251, 159, 105, 28, 38, 95, 56, 104, 36, 130, + 60, 106, 103, 157, 85, 38, 21, 22, 59, 5, 110, 80, 254, 237, 208, 227, + 9, 140, 255, 168, 247, 215, 111, 196, 232, 91, 133, 140, 62, 131, 132, 23, + 152, 76, 187, 188, 195, 124, 189, 59, 78, 73, 222, 83, 120, 152, 46, 201, + 51, 7, 98, 133, 196, 218, 215, 108, 100, 196, 58, 250, 68, 242, 124, 171, + 212, 52, 173, 30, 59, 14, 55, 109, 133, 184, 230, 198, 83, 213, 182, 137, + 47, 117, 164, 144, 46, 247, 0, 196, 62, 98, 80, 214, 218, 106, 130, 80, + 175, 189, 146, 132, 87, 146, 240, 74, 18, 170, 36, 84, 21, 144, 4, 80, + 166, 252, 0, 214, 134, 248, 112, 116, 83, 50, 111, 114, 248, 175, 178, 52, + 162, 178, 173, 247, 172, 112, 205, 186, 32, 146, 55, 18, 244, 77, 4, 85, + 107, 125, 246, 176, 17, 239, 6, 116, 210, 4, 66, 240, 129, 34, 32, 73, + 45, 16, 176, 76, 58, 160, 170, 236, 74, 76, 183, 255, 128, 10, 93, 206, + 134, 245, 37, 230, 186, 29, 90, 219, 83, 132, 161, 208, 230, 41, 10, 96, + 126, 79, 87, 36, 154, 99, 234, 142, 201, 216, 182, 109, 219, 170, 207, 30, + 172, 72, 144, 126, 254, 249, 50, 191, 227, 130, 182, 10, 69, 100, 195, 100, + 106, 24, 75, 87, 155, 73, 245, 59, 105, 66, 4, 131, 144, 107, 209, 6, + 179, 117, 74, 230, 145, 181, 98, 193, 54, 41, 87, 126, 10, 198, 83, 93, + 144, 104, 231, 102, 147, 180, 117, 252, 207, 181, 155, 245, 163, 117, 92, 133, + 210, 17, 44, 237, 13, 144, 215, 214, 198, 134, 17, 155, 115, 198, 61, 58, + 229, 204, 244, 147, 2, 110, 0, 122, 12, 134, 118, 160, 178, 142, 219, 154, + 70, 152, 67, 98, 17, 173, 234, 237, 226, 252, 29, 161, 11, 102, 211, 41, + 38, 49, 240, 17, 149, 49, 228, 251, 252, 51, 137, 136, 53, 21, 190, 163, + 30, 175, 222, 102, 202, 109, 55, 187, 179, 213, 236, 100, 204, 183, 214, 13, + 3, 93, 70, 185, 164, 229, 111, 128, 229, 155, 96, 22, 3, 120, 151, 172, + 225, 190, 238, 113, 185, 209, 110, 227, 65, 15, 6, 102, 32, 25, 84, 149, + 128, 23, 226, 206, 44, 129, 254, 10, 91, 201, 90, 79, 29, 68, 68, 239, + 160, 183, 64, 232, 4, 98, 22, 127, 233, 89, 102, 50, 147, 82, 99, 128, + 157, 23, 146, 83, 129, 255, 86, 157, 183, 100, 149, 173, 61, 58, 15, 107, + 136, 105, 191, 2, 117, 62, 119, 16, 133, 238, 28, 19, 173, 38, 43, 158, + 95, 169, 84, 212, 209, 45, 122, 63, 87, 133, 19, 56, 192, 219, 44, 161, + 14, 1, 167, 192, 155, 105, 212, 71, 97, 188, 75, 27, 195, 68, 253, 35, + 91, 31, 125, 249, 74, 125, 69, 195, 171, 178, 16, 170, 67, 196, 24, 174, + 48, 178, 17, 60, 190, 203, 197, 16, 129, 1, 157, 29, 69, 225, 38, 120, + 154, 154, 198, 168, 96, 49, 83, 71, 90, 10, 95, 245, 91, 230, 54, 168, + 207, 199, 130, 255, 250, 204, 215, 129, 39, 76, 199, 99, 152, 70, 81, 254, + 64, 137, 70, 41, 70, 198, 15, 65, 178, 98, 62, 30, 224, 161, 207, 240, + 168, 96, 219, 71, 235, 172, 212, 223, 80, 51, 65, 71, 220, 220, 36, 5, + 24, 252, 104, 91, 208, 194, 140, 140, 99, 92, 199, 65, 49, 215, 26, 39, + 216, 139, 85, 238, 35, 204, 157, 114, 76, 182, 134, 123, 227, 115, 105, 245, + 29, 57, 152, 248, 216, 166, 58, 88, 146, 2, 156, 196, 251, 190, 26, 129, + 217, 137, 203, 117, 182, 161, 78, 75, 163, 79, 250, 122, 227, 125, 171, 86, + 182, 249, 168, 98, 121, 228, 85, 104, 199, 238, 206, 116, 134, 10, 181, 30, + 55, 94, 177, 174, 125, 117, 116, 78, 212, 86, 244, 185, 203, 164, 4, 91, + 197, 209, 84, 208, 101, 17, 155, 166, 58, 141, 77, 243, 51, 56, 87, 233, + 206, 157, 229, 119, 238, 115, 121, 170, 93, 69, 159, 213, 175, 179, 116, 55, + 152, 117, 151, 251, 126, 252, 30, 69, 160, 148, 49, 125, 80, 170, 189, 40, + 144, 136, 105, 91, 52, 29, 220, 65, 71, 142, 91, 46, 80, 126, 195, 248, + 157, 172, 189, 37, 2, 159, 59, 67, 5, 163, 167, 209, 107, 180, 229, 231, + 147, 91, 177, 202, 133, 36, 222, 215, 172, 245, 216, 182, 158, 204, 33, 133, + 32, 233, 160, 51, 51, 212, 201, 176, 111, 47, 29, 30, 182, 228, 67, 145, + 57, 132, 36, 55, 153, 175, 10, 204, 104, 83, 204, 86, 57, 66, 172, 220, + 35, 73, 214, 222, 88, 240, 18, 151, 57, 205, 102, 147, 56, 206, 81, 163, + 248, 239, 251, 119, 226, 172, 213, 184, 127, 104, 52, 70, 243, 209, 79, 101, + 142, 111, 85, 27, 141, 66, 105, 235, 34, 124, 124, 116, 136, 55, 207, 232, + 170, 20, 95, 21, 30, 134, 104, 238, 164, 68, 182, 166, 152, 252, 40, 42, + 185, 108, 208, 77, 123, 71, 54, 74, 77, 211, 136, 90, 248, 104, 55, 244, + 238, 25, 202, 177, 105, 94, 89, 89, 178, 171, 131, 196, 103, 197, 12, 214, + 228, 67, 121, 21, 137, 99, 245, 133, 99, 120, 101, 160, 76, 246, 210, 93, + 36, 210, 21, 145, 6, 62, 57, 248, 72, 196, 91, 118, 183, 66, 65, 175, + 153, 173, 7, 93, 13, 60, 230, 7, 25, 145, 177, 109, 242, 61, 50, 192, + 21, 248, 111, 53, 151, 42, 102, 90, 68, 70, 155, 110, 241, 153, 67, 190, + 164, 3, 247, 164, 79, 65, 145, 79, 143, 219, 20, 115, 180, 234, 219, 174, + 165, 159, 22, 136, 15, 75, 155, 196, 177, 255, 90, 189, 155, 150, 46, 158, + 41, 132, 244, 198, 225, 112, 8, 21, 73, 116, 247, 179, 34, 52, 72, 216, + 52, 36, 224, 47, 5, 66, 182, 22, 53, 246, 113, 143, 78, 137, 255, 24, + 41, 104, 237, 197, 59, 123, 106, 99, 255, 5, 103, 63, 254, 126, 232, 95, + 235, 20, 202, 230, 87, 12, 147, 199, 34, 250, 7, 116, 85, 138, 175, 10, + 60, 118, 55, 139, 61, 155, 51, 143, 46, 249, 84, 130, 252, 129, 207, 179, + 14, 183, 228, 244, 132, 142, 160, 140, 126, 148, 195, 245, 19, 52, 83, 225, + 134, 233, 73, 96, 194, 239, 142, 58, 108, 20, 100, 150, 193, 4, 241, 193, + 244, 58, 200, 192, 147, 174, 26, 173, 115, 44, 45, 27, 59, 127, 225, 178, + 121, 251, 121, 210, 178, 118, 29, 239, 113, 110, 39, 246, 163, 118, 187, 249, + 50, 68, 251, 237, 143, 108, 44, 142, 199, 196, 229, 162, 99, 243, 46, 181, + 168, 130, 176, 161, 164, 163, 175, 129, 126, 86, 90, 46, 202, 97, 22, 38, + 222, 182, 218, 25, 213, 225, 140, 61, 136, 105, 56, 85, 106, 246, 1, 67, + 186, 172, 21, 237, 154, 9, 67, 203, 161, 40, 181, 210, 10, 175, 237, 69, + 28, 145, 242, 176, 200, 56, 112, 255, 75, 158, 1, 241, 161, 133, 42, 104, + 56, 26, 116, 44, 206, 89, 1, 31, 140, 93, 241, 61, 228, 113, 120, 49, + 29, 253, 139, 12, 146, 100, 242, 187, 80, 39, 37, 8, 222, 22, 239, 117, + 254, 26, 213, 253, 135, 181, 171, 182, 250, 35, 169, 52, 254, 160, 182, 1, + 249, 105, 97, 100, 134, 239, 45, 194, 202, 128, 197, 199, 173, 249, 180, 53, + 90, 93, 90, 165, 232, 253, 159, 9, 30, 235, 213, 6, 16, 168, 118, 49, + 60, 218, 69, 192, 232, 103, 32, 209, 95, 17, 142, 209, 205, 39, 90, 153, + 71, 38, 208, 214, 179, 64, 251, 185, 220, 27, 51, 91, 206, 245, 243, 38, + 104, 172, 181, 52, 49, 92, 253, 124, 217, 161, 188, 210, 77, 57, 9, 252, + 4, 139, 177, 114, 203, 88, 45, 198, 57, 198, 168, 71, 177, 93, 184, 34, + 174, 46, 48, 22, 37, 83, 84, 20, 254, 177, 98, 97, 178, 207, 34, 31, + 139, 27, 116, 0, 50, 197, 54, 131, 11, 16, 85, 201, 212, 121, 166, 172, + 131, 89, 151, 93, 238, 172, 251, 27, 177, 49, 135, 172, 57, 40, 247, 95, + 30, 238, 108, 91, 191, 194, 245, 63, 212, 77, 250, 250, 146, 219, 241, 245, + 161, 199, 185, 27, 223, 237, 64, 47, 254, 97, 188, 63, 27, 51, 188, 61, + 5, 230, 194, 60, 203, 108, 200, 44, 210, 237, 153, 69, 113, 179, 102, 97, + 212, 250, 221, 110, 127, 215, 179, 126, 61, 197, 120, 19, 244, 102, 49, 202, + 176, 74, 249, 18, 221, 253, 198, 158, 212, 143, 253, 204, 115, 243, 153, 241, + 40, 243, 150, 241, 132, 58, 147, 125, 118, 202, 250, 208, 5, 180, 200, 35, + 120, 199, 37, 172, 95, 206, 126, 90, 149, 151, 243, 222, 239, 47, 149, 130, + 176, 245, 235, 96, 188, 220, 6, 149, 231, 214, 30, 103, 75, 143, 122, 55, + 214, 175, 71, 97, 114, 221, 67, 133, 130, 96, 55, 46, 34, 120, 81, 119, + 199, 214, 175, 120, 20, 182, 11, 34, 238, 66, 149, 156, 102, 6, 182, 123, + 118, 119, 98, 253, 186, 187, 96, 110, 114, 119, 198, 48, 233, 4, 75, 10, + 238, 240, 184, 156, 121, 114, 127, 194, 169, 181, 187, 227, 79, 180, 82, 44, + 190, 161, 222, 50, 106, 248, 242, 206, 128, 172, 59, 3, 178, 240, 58, 105, + 144, 110, 213, 226, 255, 193, 8, 71, 36, 29, 141, 197, 80, 57, 126, 249, + 120, 149, 16, 13, 227, 182, 128, 96, 212, 49, 222, 184, 153, 79, 48, 178, + 207, 150, 45, 239, 25, 65, 48, 237, 152, 95, 255, 67, 5, 222, 233, 29, + 192, 72, 1, 51, 136, 241, 44, 41, 51, 232, 241, 114, 233, 191, 97, 134, + 15, 4, 229, 151, 177, 14, 66, 119, 144, 138, 243, 85, 100, 10, 96, 245, + 83, 200, 108, 196, 181, 193, 31, 13, 84, 143, 125, 233, 196, 83, 42, 232, + 198, 152, 205, 84, 193, 178, 171, 88, 1, 188, 221, 173, 124, 250, 185, 172, + 20, 147, 2, 173, 229, 110, 245, 227, 19, 206, 103, 42, 29, 129, 213, 251, + 30, 50, 143, 103, 253, 168, 168, 130, 106, 162, 168, 202, 79, 176, 50, 117, + 82, 77, 10, 78, 147, 87, 169, 23, 84, 178, 27, 35, 233, 194, 142, 156, + 240, 49, 46, 83, 31, 47, 74, 209, 197, 202, 61, 66, 50, 61, 40, 160, + 110, 102, 226, 33, 208, 105, 55, 2, 228, 110, 105, 77, 121, 118, 81, 124, + 154, 154, 53, 138, 101, 192, 83, 41, 112, 143, 231, 2, 169, 254, 136, 142, + 82, 214, 142, 116, 232, 8, 0, 218, 140, 186, 218, 227, 3, 93, 134, 201, + 21, 144, 25, 8, 111, 128, 78, 95, 134, 105, 232, 223, 162, 49, 194, 204, + 80, 250, 134, 103, 89, 163, 246, 20, 119, 83, 163, 71, 148, 78, 237, 70, + 50, 27, 15, 47, 49, 210, 64, 160, 132, 154, 178, 131, 144, 114, 156, 84, + 104, 101, 64, 145, 252, 33, 240, 120, 42, 187, 104, 63, 179, 192, 108, 149, + 236, 86, 165, 52, 111, 187, 97, 55, 218, 53, 86, 75, 63, 181, 246, 132, + 63, 83, 70, 237, 184, 145, 205, 23, 147, 112, 152, 183, 253, 103, 218, 240, + 94, 54, 107, 228, 77, 188, 114, 218, 26, 89, 2, 176, 60, 111, 245, 213, + 179, 182, 98, 206, 24, 235, 226, 33, 17, 252, 233, 57, 171, 63, 35, 224, + 252, 213, 43, 36, 53, 13, 127, 196, 40, 178, 54, 166, 117, 42, 242, 132, + 220, 241, 66, 20, 189, 40, 21, 102, 95, 95, 151, 140, 235, 28, 47, 171, + 28, 107, 56, 86, 126, 134, 73, 216, 164, 175, 155, 0, 1, 180, 132, 241, + 126, 45, 44, 121, 124, 125, 201, 7, 65, 68, 123, 159, 77, 114, 241, 104, + 191, 153, 143, 175, 28, 178, 208, 71, 47, 239, 132, 250, 30, 129, 80, 18, + 152, 164, 23, 24, 124, 66, 129, 210, 136, 96, 240, 10, 96, 218, 138, 85, + 96, 224, 168, 97, 38, 140, 180, 205, 116, 100, 169, 185, 235, 30, 233, 172, + 202, 153, 36, 65, 253, 44, 247, 78, 62, 246, 17, 211, 83, 6, 102, 134, + 23, 116, 43, 49, 124, 88, 14, 194, 199, 199, 133, 73, 58, 211, 241, 89, + 185, 68, 194, 120, 78, 154, 76, 10, 145, 91, 177, 65, 237, 0, 100, 26, + 156, 106, 230, 77, 184, 75, 202, 38, 212, 165, 43, 194, 245, 76, 27, 189, + 192, 195, 195, 10, 199, 41, 18, 158, 204, 223, 191, 158, 215, 130, 118, 151, + 132, 251, 34, 158, 102, 76, 114, 51, 75, 95, 113, 15, 4, 247, 211, 119, + 37, 110, 26, 98, 216, 71, 30, 149, 53, 22, 224, 137, 154, 135, 30, 16, + 125, 180, 252, 47, 155, 117, 50, 107, 66, 30, 4, 161, 151, 179, 95, 211, + 78, 215, 188, 240, 0, 92, 188, 133, 245, 172, 45, 143, 28, 98, 222, 120, + 62, 45, 39, 116, 253, 9, 37, 192, 14, 110, 86, 22, 73, 128, 24, 185, + 33, 65, 38, 31, 168, 95, 10, 13, 87, 151, 57, 36, 106, 105, 178, 155, + 153, 101, 25, 51, 111, 198, 221, 100, 191, 80, 81, 238, 150, 1, 50, 251, + 54, 186, 32, 69, 241, 63, 9, 227, 78, 105, 65, 186, 146, 222, 120, 40, + 162, 39, 138, 1, 103, 144, 166, 78, 104, 209, 204, 84, 2, 165, 9, 160, + 94, 167, 78, 138, 221, 216, 12, 105, 227, 149, 73, 255, 57, 153, 244, 74, + 189, 20, 85, 7, 192, 250, 237, 190, 79, 145, 113, 90, 53, 29, 80, 233, + 87, 150, 148, 150, 114, 75, 95, 226, 49, 105, 176, 56, 83, 232, 109, 103, + 82, 189, 101, 41, 124, 247, 9, 25, 31, 113, 203, 48, 29, 56, 168, 102, + 171, 65, 45, 133, 167, 225, 83, 51, 195, 9, 128, 71, 78, 173, 200, 14, + 205, 163, 1, 60, 135, 154, 189, 162, 201, 31, 30, 77, 90, 85, 204, 151, + 90, 16, 165, 191, 27, 246, 133, 63, 37, 212, 160, 171, 82, 124, 245, 116, + 54, 189, 140, 172, 20, 1, 191, 185, 229, 108, 192, 127, 150, 228, 215, 51, + 42, 159, 201, 196, 183, 178, 174, 147, 89, 228, 1, 213, 181, 82, 171, 63, + 133, 63, 79, 24, 5, 94, 97, 251, 15, 15, 219, 77, 244, 78, 43, 134, + 109, 16, 96, 3, 5, 219, 120, 85, 138, 175, 86, 146, 247, 83, 126, 207, + 157, 72, 131, 73, 185, 87, 145, 232, 210, 195, 221, 109, 177, 36, 172, 55, + 211, 181, 14, 132, 205, 157, 136, 21, 180, 210, 136, 18, 19, 226, 87, 10, + 252, 83, 65, 169, 255, 4, 152, 70, 254, 171, 135, 208, 218, 136, 227, 17, + 12, 30, 21, 255, 43, 174, 70, 205, 226, 252, 41, 82, 218, 202, 211, 208, + 166, 171, 18, 20, 126, 117, 101, 142, 228, 14, 83, 51, 16, 42, 235, 112, + 177, 58, 247, 148, 166, 155, 85, 222, 150, 30, 43, 109, 48, 43, 221, 43, + 145, 220, 84, 19, 144, 82, 131, 142, 16, 49, 8, 99, 63, 63, 86, 239, + 3, 79, 78, 16, 160, 12, 209, 126, 51, 187, 55, 29, 173, 247, 133, 39, + 71, 145, 215, 236, 237, 24, 79, 200, 184, 12, 233, 236, 122, 237, 59, 246, + 51, 105, 99, 152, 131, 122, 179, 90, 235, 22, 37, 31, 210, 17, 179, 214, + 21, 112, 74, 4, 55, 202, 63, 164, 11, 3, 85, 86, 202, 41, 203, 89, + 114, 51, 52, 39, 94, 243, 122, 45, 61, 223, 198, 246, 73, 59, 237, 177, + 149, 36, 43, 50, 162, 225, 206, 164, 43, 7, 184, 189, 74, 214, 32, 35, + 209, 156, 161, 227, 175, 233, 164, 122, 75, 193, 205, 58, 189, 110, 234, 43, + 185, 11, 66, 106, 100, 74, 243, 203, 152, 84, 183, 93, 225, 75, 128, 144, + 89, 254, 78, 99, 177, 25, 33, 99, 218, 81, 147, 188, 92, 45, 163, 214, + 190, 210, 220, 63, 167, 100, 208, 169, 98, 30, 250, 90, 65, 82, 21, 178, + 122, 10, 60, 70, 156, 100, 95, 110, 220, 151, 50, 247, 185, 4, 87, 217, + 157, 212, 54, 134, 105, 231, 72, 81, 92, 74, 67, 183, 84, 175, 190, 84, + 111, 121, 123, 39, 67, 83, 115, 164, 95, 211, 4, 151, 202, 23, 129, 251, + 115, 137, 44, 146, 150, 201, 169, 225, 74, 253, 41, 215, 237, 87, 232, 255, + 195, 67, 255, 74, 211, 200, 1, 119, 2, 235, 130, 147, 65, 100, 8, 215, + 51, 78, 86, 16, 125, 153, 3, 239, 89, 215, 144, 102, 100, 249, 91, 169, + 252, 173, 132, 241, 250, 106, 8, 79, 211, 124, 148, 168, 139, 182, 1, 19, + 181, 50, 39, 30, 226, 21, 188, 255, 156, 224, 221, 168, 54, 218, 133, 196, + 253, 0, 109, 120, 164, 95, 189, 29, 198, 151, 165, 228, 210, 16, 25, 247, + 40, 143, 172, 210, 248, 10, 12, 115, 255, 146, 35, 116, 232, 243, 248, 196, + 53, 149, 112, 222, 162, 132, 108, 116, 234, 252, 136, 187, 104, 78, 225, 24, + 12, 134, 65, 112, 161, 19, 148, 240, 152, 123, 79, 201, 183, 80, 108, 5, + 115, 0, 78, 107, 142, 230, 189, 17, 6, 39, 98, 12, 100, 146, 28, 77, + 189, 227, 91, 255, 241, 236, 172, 102, 191, 111, 58, 221, 102, 231, 167, 114, + 99, 106, 33, 208, 20, 109, 149, 28, 81, 206, 236, 9, 15, 6, 228, 27, + 131, 71, 202, 251, 116, 215, 159, 151, 50, 247, 127, 48, 2, 121, 192, 96, + 38, 182, 103, 51, 79, 226, 246, 43, 109, 146, 100, 130, 110, 114, 82, 151, + 182, 114, 18, 108, 23, 167, 224, 54, 77, 207, 75, 181, 205, 135, 169, 196, + 220, 73, 219, 175, 244, 250, 79, 78, 175, 87, 138, 35, 152, 207, 207, 161, + 61, 242, 29, 71, 74, 146, 199, 199, 81, 209, 215, 62, 22, 149, 150, 139, + 114, 144, 80, 17, 115, 63, 222, 52, 76, 159, 187, 147, 222, 169, 140, 235, + 26, 17, 119, 157, 172, 9, 98, 9, 39, 151, 106, 36, 93, 143, 114, 29, + 230, 110, 163, 99, 40, 225, 42, 87, 166, 87, 176, 255, 115, 130, 125, 7, + 83, 57, 21, 137, 41, 171, 59, 72, 82, 4, 7, 78, 63, 8, 172, 49, + 243, 213, 105, 163, 2, 8, 41, 165, 83, 237, 47, 222, 46, 199, 67, 209, + 43, 81, 64, 19, 134, 83, 245, 120, 116, 44, 225, 97, 184, 160, 147, 29, + 209, 128, 121, 193, 2, 15, 249, 63, 13, 120, 45, 57, 218, 43, 62, 210, + 11, 253, 34, 113, 151, 177, 26, 163, 92, 153, 80, 174, 12, 111, 151, 103, + 120, 190, 51, 200, 35, 33, 110, 149, 34, 51, 41, 195, 163, 73, 114, 100, + 233, 145, 156, 113, 235, 130, 142, 245, 38, 239, 106, 186, 250, 58, 134, 210, + 82, 250, 54, 239, 112, 140, 151, 28, 189, 208, 76, 219, 186, 94, 81, 232, + 207, 137, 66, 77, 180, 168, 214, 11, 130, 47, 143, 232, 108, 83, 67, 106, + 195, 251, 148, 216, 102, 22, 60, 199, 231, 165, 174, 253, 80, 138, 228, 54, + 50, 177, 110, 26, 118, 88, 101, 217, 81, 170, 103, 205, 116, 115, 201, 26, + 202, 187, 171, 195, 41, 178, 18, 221, 171, 76, 246, 138, 89, 191, 121, 236, + 64, 183, 48, 140, 244, 36, 156, 51, 208, 121, 24, 98, 213, 68, 95, 151, + 140, 235, 28, 92, 90, 114, 14, 72, 71, 183, 155, 136, 146, 242, 7, 123, + 102, 120, 225, 107, 108, 225, 107, 108, 225, 31, 34, 182, 144, 6, 96, 109, + 167, 35, 188, 180, 203, 240, 46, 37, 96, 139, 247, 255, 95, 137, 236, 159, + 159, 200, 54, 235, 133, 68, 22, 40, 136, 142, 34, 112, 232, 170, 20, 95, + 229, 106, 183, 166, 28, 210, 90, 178, 31, 193, 27, 204, 54, 156, 115, 211, + 82, 76, 238, 126, 241, 82, 35, 72, 210, 172, 76, 152, 103, 45, 45, 214, + 80, 149, 216, 225, 32, 58, 9, 39, 237, 198, 191, 188, 187, 92, 43, 173, + 245, 194, 190, 114, 174, 188, 71, 68, 80, 9, 100, 238, 159, 139, 1, 255, + 162, 19, 192, 43, 34, 253, 102, 136, 244, 207, 53, 211, 248, 173, 83, 164, + 165, 114, 129, 248, 22, 250, 141, 200, 185, 155, 164, 5, 97, 137, 129, 153, + 91, 46, 154, 184, 153, 51, 130, 81, 6, 227, 169, 53, 243, 36, 104, 137, + 234, 208, 62, 124, 60, 231, 253, 25, 38, 79, 251, 27, 179, 64, 162, 30, + 190, 139, 172, 208, 10, 81, 42, 83, 190, 246, 62, 91, 242, 183, 42, 123, + 95, 73, 58, 34, 48, 1, 236, 247, 16, 69, 95, 128, 33, 58, 195, 181, + 108, 243, 41, 83, 129, 108, 170, 155, 100, 120, 159, 209, 65, 214, 152, 203, + 109, 198, 2, 242, 49, 160, 100, 128, 137, 61, 94, 53, 122, 28, 96, 174, + 192, 144, 82, 252, 129, 4, 77, 17, 162, 125, 58, 132, 81, 213, 103, 51, + 152, 95, 53, 0, 66, 120, 139, 210, 216, 251, 214, 250, 95, 156, 224, 175, + 245, 90, 163, 181, 81, 121, 250, 184, 241, 223, 147, 72, 161, 130, 69, 167, + 210, 231, 18, 169, 133, 195, 191, 77, 126, 241, 173, 40, 184, 132, 232, 21, + 21, 126, 157, 233, 162, 210, 114, 209, 211, 2, 34, 237, 131, 155, 185, 107, + 18, 239, 235, 39, 4, 200, 86, 90, 128, 220, 101, 238, 61, 75, 121, 149, + 190, 218, 214, 126, 26, 206, 170, 124, 234, 16, 136, 172, 19, 79, 58, 142, + 233, 71, 183, 2, 150, 127, 220, 167, 238, 69, 231, 164, 236, 23, 156, 147, + 242, 228, 22, 87, 189, 246, 151, 224, 93, 163, 211, 72, 18, 132, 155, 232, + 97, 226, 69, 14, 66, 188, 41, 2, 249, 118, 58, 182, 58, 207, 72, 221, + 32, 223, 144, 204, 137, 163, 41, 95, 188, 36, 104, 96, 57, 124, 74, 35, + 199, 82, 80, 143, 10, 163, 125, 141, 8, 248, 249, 113, 167, 132, 69, 219, + 238, 136, 59, 210, 58, 101, 83, 246, 92, 124, 250, 187, 91, 148, 75, 170, + 91, 136, 45, 23, 0, 24, 120, 138, 95, 4, 213, 220, 165, 35, 251, 34, + 192, 78, 110, 115, 97, 59, 47, 157, 200, 83, 106, 255, 43, 108, 253, 225, + 53, 158, 149, 91, 125, 23, 210, 89, 140, 164, 139, 49, 72, 191, 238, 113, + 135, 133, 46, 91, 252, 67, 237, 19, 68, 15, 190, 218, 186, 188, 148, 95, + 92, 172, 26, 173, 210, 108, 112, 131, 60, 29, 68, 106, 38, 56, 12, 209, + 77, 79, 112, 51, 33, 193, 230, 210, 217, 213, 249, 94, 122, 70, 202, 112, + 225, 56, 168, 145, 36, 14, 181, 145, 101, 53, 50, 191, 234, 188, 141, 160, + 253, 192, 122, 131, 72, 24, 27, 145, 150, 143, 10, 90, 113, 8, 100, 238, + 105, 66, 75, 233, 22, 95, 126, 72, 212, 43, 238, 253, 225, 113, 175, 75, + 169, 75, 11, 172, 13, 38, 238, 237, 187, 220, 27, 101, 49, 47, 131, 112, + 171, 188, 92, 212, 78, 183, 158, 144, 85, 219, 41, 207, 56, 249, 47, 39, + 179, 207, 210, 33, 188, 245, 108, 2, 145, 187, 103, 212, 121, 30, 162, 188, + 226, 194, 239, 135, 11, 191, 163, 251, 217, 86, 125, 243, 169, 195, 123, 126, + 247, 141, 204, 21, 89, 197, 105, 95, 220, 34, 46, 101, 108, 155, 115, 188, + 47, 101, 238, 243, 52, 107, 52, 48, 44, 71, 58, 44, 249, 153, 228, 198, + 231, 119, 114, 107, 153, 121, 117, 50, 59, 155, 249, 1, 252, 41, 173, 132, + 170, 32, 11, 98, 17, 7, 42, 192, 117, 53, 112, 29, 188, 175, 253, 48, + 227, 12, 195, 237, 130, 106, 57, 13, 191, 106, 253, 127, 2, 172, 166, 115, + 7, 160, 115, 114, 65, 120, 173, 253, 80, 234, 173, 77, 117, 254, 128, 203, + 231, 101, 245, 94, 89, 225, 67, 153, 240, 225, 71, 176, 252, 185, 145, 126, + 170, 198, 37, 118, 233, 95, 52, 75, 52, 170, 205, 90, 161, 31, 67, 4, + 222, 60, 193, 253, 152, 31, 235, 155, 103, 57, 47, 208, 18, 118, 179, 98, + 239, 170, 168, 64, 178, 90, 228, 123, 156, 26, 89, 14, 234, 141, 180, 91, + 125, 138, 139, 231, 156, 251, 182, 44, 197, 102, 191, 155, 159, 139, 224, 21, + 127, 255, 236, 18, 106, 103, 149, 227, 62, 102, 191, 12, 60, 110, 158, 78, + 128, 8, 241, 93, 23, 151, 140, 235, 156, 0, 110, 115, 191, 73, 231, 30, + 196, 188, 223, 61, 193, 189, 25, 80, 40, 95, 88, 123, 28, 207, 13, 95, + 139, 147, 94, 197, 54, 187, 212, 220, 26, 59, 91, 104, 172, 7, 200, 111, + 213, 182, 18, 169, 242, 72, 78, 37, 122, 238, 103, 227, 191, 27, 89, 232, + 143, 17, 163, 245, 34, 2, 245, 183, 254, 123, 0, 91, 235, 151, 168, 143, + 145, 253, 240, 23, 58, 165, 168, 32, 157, 83, 110, 64, 90, 250, 64, 237, + 162, 104, 180, 140, 61, 49, 55, 250, 210, 192, 108, 60, 41, 233, 148, 179, + 225, 171, 173, 240, 127, 9, 198, 110, 226, 217, 131, 69, 49, 234, 151, 210, + 22, 14, 0, 147, 202, 51, 175, 174, 75, 198, 117, 222, 49, 7, 79, 216, + 5, 115, 211, 132, 212, 179, 38, 107, 211, 17, 52, 58, 35, 212, 48, 145, + 100, 179, 194, 81, 88, 152, 161, 25, 14, 135, 62, 15, 82, 60, 177, 155, + 203, 87, 35, 20, 206, 216, 219, 179, 135, 216, 81, 10, 56, 111, 45, 74, + 1, 231, 61, 33, 146, 188, 58, 55, 189, 58, 55, 189, 58, 55, 189, 178, + 134, 127, 145, 53, 20, 232, 93, 47, 61, 134, 237, 114, 183, 182, 121, 115, + 61, 123, 156, 31, 254, 80, 214, 241, 231, 170, 82, 192, 42, 170, 135, 98, + 58, 3, 226, 23, 252, 139, 186, 148, 74, 250, 211, 204, 103, 73, 148, 48, + 85, 135, 245, 251, 250, 186, 100, 92, 231, 237, 85, 165, 146, 172, 54, 74, + 134, 244, 24, 165, 179, 198, 107, 157, 124, 13, 23, 60, 206, 174, 154, 74, + 169, 106, 228, 174, 166, 250, 116, 70, 100, 50, 167, 59, 30, 144, 138, 113, + 124, 248, 83, 211, 76, 149, 177, 156, 15, 177, 153, 14, 67, 93, 117, 174, + 232, 170, 104, 212, 56, 229, 61, 157, 250, 24, 117, 33, 222, 73, 140, 191, + 107, 46, 21, 125, 75, 21, 0, 84, 133, 202, 25, 71, 159, 52, 25, 159, + 125, 169, 142, 163, 196, 137, 243, 115, 246, 217, 83, 38, 154, 231, 72, 138, + 70, 134, 241, 246, 19, 105, 99, 155, 141, 140, 161, 215, 76, 27, 27, 31, + 63, 108, 86, 216, 70, 146, 166, 179, 132, 38, 219, 51, 53, 80, 8, 70, + 104, 130, 0, 230, 31, 93, 110, 197, 87, 219, 174, 113, 222, 173, 153, 212, + 166, 94, 42, 183, 75, 169, 60, 53, 134, 198, 144, 217, 193, 55, 183, 157, + 178, 106, 194, 83, 17, 159, 72, 198, 70, 30, 238, 77, 189, 204, 118, 253, + 111, 50, 200, 60, 109, 98, 221, 108, 215, 106, 127, 241, 133, 253, 174, 221, + 111, 117, 155, 91, 155, 91, 221, 70, 103, 171, 214, 236, 119, 135, 221, 225, + 160, 59, 180, 217, 176, 190, 217, 217, 180, 217, 83, 156, 224, 247, 182, 195, + 214, 235, 133, 242, 44, 201, 150, 113, 206, 72, 77, 66, 188, 89, 156, 25, + 178, 180, 84, 146, 103, 151, 65, 239, 49, 4, 71, 195, 109, 3, 51, 128, + 25, 6, 20, 197, 70, 211, 199, 253, 165, 115, 231, 36, 96, 149, 15, 61, + 175, 130, 229, 171, 96, 249, 103, 18, 44, 95, 101, 196, 63, 167, 249, 160, + 83, 197, 164, 104, 91, 5, 228, 54, 142, 220, 51, 131, 246, 86, 196, 235, + 173, 72, 252, 222, 76, 75, 13, 241, 241, 30, 75, 199, 42, 46, 103, 6, + 191, 4, 17, 47, 166, 195, 221, 37, 115, 64, 78, 182, 186, 230, 146, 201, + 161, 56, 63, 222, 230, 19, 201, 156, 106, 232, 170, 15, 242, 94, 14, 227, + 183, 98, 68, 46, 224, 2, 217, 244, 78, 155, 105, 99, 94, 78, 174, 181, + 140, 80, 153, 49, 246, 101, 83, 75, 61, 149, 60, 45, 155, 52, 176, 147, + 17, 97, 164, 244, 3, 157, 238, 111, 41, 233, 68, 232, 221, 3, 176, 155, + 15, 95, 163, 31, 95, 233, 210, 239, 232, 42, 211, 46, 220, 143, 83, 96, + 159, 150, 3, 169, 40, 45, 8, 166, 139, 86, 238, 208, 173, 242, 44, 187, + 228, 35, 60, 227, 40, 202, 96, 159, 132, 204, 28, 43, 228, 20, 3, 92, + 39, 237, 254, 86, 86, 132, 143, 150, 6, 181, 139, 228, 190, 160, 61, 43, + 27, 151, 153, 181, 167, 30, 114, 9, 10, 162, 103, 218, 251, 219, 6, 129, + 33, 23, 100, 147, 236, 181, 95, 119, 233, 254, 236, 200, 209, 33, 63, 178, + 130, 76, 73, 189, 96, 225, 232, 173, 106, 95, 93, 150, 146, 203, 8, 9, + 18, 230, 185, 136, 117, 238, 127, 214, 34, 155, 8, 181, 193, 173, 245, 248, + 244, 154, 141, 181, 236, 35, 243, 156, 27, 124, 186, 227, 177, 239, 33, 116, + 240, 148, 185, 182, 63, 96, 51, 110, 145, 30, 177, 237, 6, 115, 238, 205, + 204, 10, 176, 88, 130, 217, 225, 192, 250, 11, 27, 121, 236, 158, 255, 213, + 58, 253, 101, 223, 199, 67, 186, 185, 89, 77, 4, 1, 124, 103, 135, 45, + 44, 134, 135, 145, 91, 187, 2, 207, 197, 53, 106, 92, 141, 185, 117, 134, + 30, 155, 14, 51, 240, 239, 173, 117, 43, 160, 108, 238, 91, 31, 201, 111, + 94, 76, 67, 39, 96, 46, 151, 161, 239, 44, 82, 245, 46, 164, 7, 116, + 65, 4, 214, 30, 180, 195, 131, 71, 16, 70, 104, 143, 224, 72, 78, 66, + 159, 9, 245, 129, 67, 60, 184, 216, 186, 101, 20, 20, 119, 66, 33, 73, + 254, 4, 94, 214, 22, 40, 107, 46, 128, 14, 129, 108, 49, 0, 28, 247, + 196, 192, 74, 108, 80, 70, 101, 37, 89, 163, 154, 84, 70, 169, 26, 31, + 58, 28, 70, 176, 7, 109, 143, 201, 168, 115, 32, 188, 164, 248, 88, 5, + 86, 169, 137, 6, 81, 234, 132, 9, 144, 54, 232, 224, 31, 85, 65, 203, + 86, 142, 117, 129, 1, 81, 120, 16, 203, 33, 96, 29, 71, 199, 27, 134, + 97, 90, 44, 174, 137, 62, 133, 179, 177, 116, 23, 86, 35, 46, 67, 189, + 235, 150, 9, 63, 24, 72, 154, 207, 19, 71, 76, 3, 53, 218, 19, 225, + 99, 215, 207, 164, 107, 163, 93, 237, 45, 140, 108, 58, 147, 62, 29, 37, + 111, 9, 23, 95, 45, 235, 193, 232, 129, 36, 85, 247, 239, 233, 236, 145, + 191, 82, 251, 87, 160, 193, 165, 158, 98, 186, 90, 163, 148, 195, 7, 123, + 204, 181, 14, 133, 244, 70, 66, 194, 58, 142, 224, 7, 6, 2, 147, 189, + 23, 250, 147, 164, 214, 45, 67, 71, 146, 83, 225, 44, 96, 48, 100, 210, + 139, 30, 140, 97, 246, 0, 108, 6, 19, 223, 42, 91, 251, 48, 137, 120, + 182, 81, 56, 157, 210, 34, 158, 133, 46, 8, 174, 52, 168, 222, 0, 214, + 16, 201, 202, 5, 16, 136, 190, 96, 111, 173, 107, 219, 21, 92, 23, 248, + 190, 68, 152, 244, 97, 49, 166, 82, 248, 48, 56, 188, 254, 101, 251, 94, + 140, 92, 178, 22, 198, 149, 122, 120, 132, 53, 76, 29, 40, 83, 169, 114, + 252, 198, 37, 247, 185, 119, 47, 133, 7, 93, 1, 10, 21, 48, 4, 170, + 253, 190, 39, 177, 162, 132, 9, 27, 76, 112, 50, 145, 6, 141, 80, 28, + 51, 139, 85, 159, 3, 49, 229, 150, 22, 159, 183, 182, 225, 249, 13, 78, + 143, 28, 193, 32, 182, 29, 52, 102, 98, 242, 37, 248, 222, 52, 245, 232, + 216, 131, 46, 251, 169, 34, 26, 50, 8, 215, 222, 194, 58, 215, 212, 51, + 121, 72, 147, 6, 208, 198, 29, 91, 131, 174, 7, 168, 146, 4, 187, 145, + 197, 67, 67, 94, 32, 161, 98, 96, 93, 49, 232, 114, 96, 25, 238, 156, + 154, 103, 180, 113, 47, 1, 203, 225, 29, 220, 163, 47, 173, 213, 107, 255, + 5, 127, 27, 244, 183, 73, 127, 219, 244, 119, 179, 253, 95, 244, 148, 110, + 234, 109, 93, 75, 253, 180, 117, 109, 248, 217, 72, 17, 37, 195, 201, 32, + 187, 145, 1, 26, 172, 245, 249, 174, 124, 128, 27, 240, 250, 118, 171, 246, + 23, 155, 35, 240, 233, 131, 181, 163, 242, 86, 59, 91, 190, 196, 0, 138, + 99, 87, 127, 32, 127, 245, 223, 250, 239, 255, 6, 162, 171, 107, 145, 73, + 240, 221, 90, 31, 209, 228, 61, 13, 168, 170, 103, 50, 177, 248, 226, 217, + 233, 80, 247, 125, 190, 207, 64, 148, 161, 30, 23, 66, 191, 186, 126, 32, + 64, 88, 9, 54, 82, 218, 70, 123, 229, 27, 187, 146, 1, 219, 75, 222, + 105, 228, 191, 97, 74, 66, 233, 143, 52, 159, 126, 33, 251, 141, 194, 126, + 41, 83, 68, 32, 86, 228, 85, 249, 241, 73, 86, 78, 150, 103, 184, 107, + 130, 122, 229, 115, 167, 153, 94, 208, 94, 78, 192, 59, 64, 133, 76, 44, + 208, 231, 48, 68, 5, 218, 148, 249, 8, 184, 145, 195, 20, 246, 30, 1, + 253, 4, 176, 97, 83, 165, 172, 12, 137, 232, 92, 236, 110, 39, 183, 25, + 63, 45, 80, 42, 99, 62, 11, 45, 247, 46, 15, 119, 82, 214, 182, 200, + 250, 21, 91, 193, 214, 209, 136, 83, 85, 51, 182, 145, 42, 180, 208, 201, + 99, 35, 169, 168, 234, 196, 165, 167, 172, 175, 205, 93, 169, 38, 204, 50, + 179, 110, 230, 253, 152, 20, 208, 1, 171, 74, 235, 210, 102, 203, 8, 15, + 255, 169, 141, 150, 177, 61, 144, 94, 181, 214, 169, 59, 27, 57, 15, 224, + 43, 36, 64, 24, 54, 54, 253, 36, 122, 35, 231, 17, 190, 243, 255, 150, + 5, 245, 148, 34, 108, 184, 197, 56, 190, 84, 107, 111, 69, 9, 200, 253, + 92, 129, 249, 199, 225, 107, 219, 190, 199, 254, 217, 207, 134, 172, 99, 87, + 4, 149, 180, 152, 189, 131, 178, 28, 117, 19, 6, 125, 12, 44, 59, 0, + 76, 88, 139, 34, 79, 64, 62, 179, 179, 175, 47, 211, 221, 122, 105, 173, + 59, 123, 64, 74, 218, 161, 159, 102, 131, 126, 58, 45, 85, 216, 80, 15, + 27, 109, 124, 154, 105, 12, 193, 155, 210, 249, 37, 147, 68, 179, 93, 224, + 4, 120, 65, 243, 73, 135, 253, 225, 14, 5, 72, 23, 206, 194, 23, 137, + 199, 134, 105, 14, 79, 87, 237, 45, 92, 16, 97, 94, 88, 151, 40, 15, + 115, 54, 244, 254, 91, 234, 157, 196, 176, 68, 179, 199, 13, 50, 21, 39, + 182, 207, 51, 67, 197, 181, 19, 26, 21, 103, 1, 52, 15, 191, 185, 224, + 174, 114, 119, 84, 157, 187, 228, 51, 30, 136, 84, 44, 52, 58, 193, 212, + 210, 84, 131, 200, 76, 114, 182, 67, 15, 215, 31, 62, 123, 236, 91, 152, + 211, 19, 228, 226, 252, 92, 15, 138, 201, 30, 128, 74, 106, 68, 134, 118, + 219, 165, 58, 144, 66, 35, 56, 116, 34, 102, 150, 26, 163, 121, 188, 47, + 117, 228, 103, 218, 175, 217, 170, 214, 234, 133, 30, 131, 55, 28, 7, 153, + 138, 189, 189, 167, 162, 84, 8, 110, 166, 40, 199, 41, 41, 173, 230, 110, + 165, 231, 243, 85, 203, 253, 169, 181, 220, 130, 200, 214, 54, 101, 251, 45, + 56, 138, 227, 150, 121, 99, 233, 188, 157, 211, 79, 73, 253, 20, 28, 240, + 158, 57, 239, 250, 174, 248, 209, 211, 39, 172, 36, 161, 218, 20, 160, 216, + 121, 2, 198, 126, 162, 192, 77, 16, 92, 61, 199, 12, 6, 198, 200, 223, + 175, 115, 44, 45, 165, 238, 158, 145, 28, 249, 53, 253, 233, 31, 11, 193, + 126, 27, 136, 194, 211, 233, 149, 185, 254, 47, 202, 230, 110, 30, 81, 111, + 150, 211, 41, 203, 88, 0, 50, 204, 28, 11, 74, 217, 2, 131, 160, 199, + 46, 61, 104, 37, 72, 167, 117, 111, 108, 109, 165, 52, 1, 172, 241, 212, + 25, 50, 106, 167, 56, 221, 78, 187, 155, 222, 35, 81, 117, 158, 106, 137, + 54, 170, 211, 13, 213, 235, 173, 84, 67, 84, 229, 169, 118, 114, 151, 117, + 199, 139, 182, 119, 83, 33, 23, 101, 64, 178, 167, 114, 17, 231, 212, 82, + 186, 200, 202, 42, 71, 33, 95, 93, 33, 217, 162, 94, 93, 47, 119, 56, + 32, 60, 10, 148, 119, 198, 12, 13, 109, 102, 8, 137, 41, 82, 233, 90, + 103, 194, 14, 64, 109, 127, 170, 90, 156, 169, 249, 137, 138, 87, 208, 22, + 200, 78, 197, 153, 180, 84, 53, 211, 117, 35, 45, 50, 233, 102, 76, 170, + 101, 156, 172, 125, 237, 10, 144, 73, 145, 122, 244, 152, 19, 168, 124, 188, + 124, 54, 83, 234, 157, 20, 190, 47, 221, 39, 246, 158, 78, 37, 124, 218, + 138, 86, 210, 232, 130, 193, 77, 140, 92, 57, 245, 14, 48, 169, 118, 189, + 177, 12, 3, 75, 144, 214, 122, 142, 216, 227, 243, 208, 150, 101, 50, 183, + 237, 129, 180, 207, 189, 200, 45, 42, 237, 38, 125, 237, 163, 170, 252, 32, + 166, 225, 148, 166, 84, 135, 11, 12, 153, 227, 243, 87, 186, 255, 39, 167, + 251, 77, 218, 243, 47, 160, 251, 59, 127, 185, 181, 122, 1, 119, 7, 194, + 81, 91, 8, 116, 169, 119, 254, 163, 155, 28, 41, 98, 105, 99, 61, 19, + 55, 144, 31, 123, 222, 76, 209, 172, 2, 255, 201, 132, 88, 153, 52, 247, + 21, 76, 255, 228, 96, 186, 250, 248, 232, 49, 243, 6, 146, 17, 140, 14, + 244, 117, 201, 184, 206, 129, 80, 32, 138, 46, 109, 188, 234, 83, 63, 59, + 237, 76, 52, 230, 169, 156, 43, 22, 132, 102, 113, 32, 245, 48, 151, 214, + 5, 78, 153, 178, 72, 20, 30, 46, 144, 95, 191, 190, 244, 130, 114, 183, + 136, 89, 67, 198, 225, 226, 146, 251, 104, 128, 80, 102, 76, 52, 140, 124, + 156, 5, 68, 159, 247, 41, 203, 124, 214, 26, 189, 109, 163, 251, 28, 115, + 38, 201, 249, 12, 75, 81, 154, 145, 227, 173, 81, 67, 3, 64, 186, 99, + 145, 11, 111, 166, 222, 242, 0, 18, 207, 151, 84, 210, 134, 33, 253, 147, + 216, 123, 165, 199, 243, 170, 41, 255, 88, 195, 38, 5, 19, 22, 88, 70, + 163, 85, 43, 121, 245, 53, 226, 244, 127, 7, 150, 215, 171, 245, 205, 194, + 96, 129, 108, 95, 142, 163, 3, 22, 134, 158, 156, 210, 46, 105, 68, 7, + 44, 229, 50, 141, 199, 42, 64, 187, 83, 49, 144, 248, 191, 75, 94, 240, + 111, 139, 243, 204, 105, 103, 106, 0, 58, 225, 7, 222, 130, 18, 87, 84, + 164, 55, 170, 186, 210, 230, 213, 70, 187, 182, 217, 77, 72, 14, 66, 49, + 165, 103, 65, 183, 47, 157, 43, 149, 114, 180, 12, 244, 147, 175, 34, 121, + 80, 42, 40, 207, 238, 192, 31, 187, 179, 48, 80, 0, 252, 53, 54, 19, + 3, 15, 190, 192, 131, 28, 70, 30, 155, 141, 227, 125, 130, 32, 149, 135, + 40, 251, 218, 63, 215, 162, 14, 218, 154, 136, 172, 215, 141, 221, 123, 181, + 193, 161, 108, 235, 70, 185, 170, 249, 38, 218, 0, 89, 111, 168, 71, 126, + 222, 179, 179, 208, 9, 68, 57, 122, 30, 27, 231, 111, 16, 244, 12, 59, + 117, 212, 159, 58, 8, 209, 148, 95, 115, 93, 155, 67, 113, 95, 150, 131, + 228, 59, 165, 13, 148, 209, 24, 84, 8, 71, 206, 213, 3, 0, 250, 133, + 50, 77, 175, 227, 78, 178, 21, 61, 137, 191, 82, 199, 83, 146, 40, 43, + 173, 116, 113, 235, 27, 228, 251, 0, 144, 101, 189, 114, 56, 115, 54, 222, + 125, 29, 10, 135, 11, 55, 1, 226, 6, 144, 147, 23, 84, 87, 67, 13, + 36, 26, 198, 251, 122, 219, 131, 96, 108, 189, 114, 225, 142, 114, 94, 88, + 157, 114, 53, 222, 71, 216, 75, 92, 249, 117, 2, 214, 84, 242, 85, 134, + 123, 233, 116, 216, 216, 247, 80, 12, 38, 176, 54, 17, 200, 88, 140, 36, + 49, 74, 77, 106, 65, 103, 28, 5, 1, 21, 75, 133, 13, 232, 228, 171, + 24, 12, 50, 155, 57, 148, 252, 192, 82, 209, 31, 31, 79, 232, 166, 31, + 2, 1, 114, 49, 241, 41, 134, 86, 192, 7, 36, 186, 67, 224, 59, 135, + 191, 156, 29, 239, 90, 6, 68, 90, 115, 242, 152, 32, 101, 199, 71, 183, + 76, 139, 217, 148, 122, 149, 250, 2, 127, 129, 95, 73, 199, 34, 178, 226, + 87, 112, 15, 217, 197, 131, 206, 126, 241, 184, 101, 131, 234, 80, 178, 248, + 3, 30, 133, 6, 77, 47, 55, 250, 22, 107, 122, 170, 37, 128, 75, 117, + 34, 154, 58, 48, 173, 15, 243, 173, 55, 203, 232, 200, 20, 52, 41, 64, + 63, 177, 157, 49, 242, 73, 95, 14, 3, 160, 192, 188, 66, 73, 107, 143, + 135, 116, 184, 26, 6, 188, 192, 28, 91, 62, 136, 131, 254, 16, 179, 184, + 210, 54, 54, 190, 20, 157, 208, 6, 115, 112, 13, 159, 198, 227, 217, 214, + 119, 175, 46, 79, 223, 124, 217, 80, 225, 52, 56, 190, 65, 52, 123, 233, + 153, 195, 189, 42, 54, 66, 197, 16, 122, 48, 149, 182, 24, 46, 162, 142, + 155, 131, 183, 108, 62, 164, 108, 148, 132, 195, 228, 82, 82, 1, 94, 0, + 173, 226, 46, 30, 130, 122, 186, 126, 41, 249, 158, 94, 45, 116, 20, 8, + 140, 5, 178, 88, 31, 196, 134, 138, 21, 83, 168, 24, 222, 119, 169, 205, + 93, 221, 30, 137, 21, 192, 223, 233, 37, 52, 114, 24, 48, 71, 39, 214, + 161, 76, 188, 84, 86, 126, 214, 190, 170, 9, 175, 49, 101, 195, 216, 126, + 13, 176, 168, 43, 98, 247, 135, 232, 177, 128, 246, 69, 75, 87, 64, 151, + 144, 252, 101, 167, 105, 100, 46, 194, 110, 178, 254, 145, 195, 219, 91, 157, + 133, 24, 62, 135, 124, 19, 230, 59, 196, 172, 190, 52, 52, 138, 137, 66, + 135, 13, 224, 20, 128, 2, 46, 80, 150, 28, 40, 180, 214, 161, 100, 10, + 19, 7, 107, 138, 208, 231, 147, 39, 49, 192, 226, 70, 37, 106, 153, 184, + 237, 114, 211, 240, 222, 132, 47, 176, 194, 103, 117, 143, 50, 27, 203, 180, + 110, 115, 32, 22, 240, 253, 40, 161, 240, 115, 154, 187, 160, 123, 230, 46, + 230, 20, 209, 195, 29, 76, 13, 32, 208, 57, 133, 233, 17, 196, 44, 139, + 112, 58, 110, 249, 140, 218, 132, 183, 184, 131, 77, 148, 116, 155, 62, 62, + 35, 240, 101, 30, 250, 104, 88, 225, 172, 10, 19, 171, 62, 251, 40, 241, + 160, 66, 36, 187, 194, 173, 202, 48, 233, 38, 189, 48, 205, 182, 8, 15, + 122, 71, 199, 7, 87, 111, 226, 50, 252, 8, 181, 171, 62, 69, 83, 169, + 72, 13, 44, 41, 182, 14, 48, 142, 237, 171, 134, 79, 212, 16, 123, 23, + 219, 187, 251, 244, 118, 72, 28, 220, 167, 209, 240, 7, 192, 226, 153, 116, + 200, 57, 70, 143, 20, 253, 75, 82, 175, 94, 109, 239, 208, 139, 192, 209, + 48, 88, 15, 96, 3, 3, 178, 125, 53, 6, 192, 55, 238, 167, 170, 239, + 108, 239, 158, 36, 95, 139, 150, 3, 191, 230, 160, 101, 36, 189, 90, 64, + 172, 120, 250, 107, 23, 219, 135, 251, 214, 181, 90, 17, 225, 34, 52, 225, + 49, 143, 106, 124, 3, 45, 125, 47, 191, 176, 247, 241, 246, 92, 127, 239, + 25, 175, 92, 82, 85, 244, 236, 244, 252, 42, 18, 64, 95, 15, 222, 227, + 51, 135, 1, 57, 193, 81, 197, 111, 36, 171, 185, 151, 234, 85, 132, 46, + 40, 249, 231, 84, 222, 77, 245, 231, 137, 202, 170, 71, 30, 18, 24, 191, + 184, 234, 126, 111, 55, 6, 138, 79, 17, 40, 96, 249, 249, 213, 190, 30, + 83, 49, 53, 207, 163, 83, 207, 17, 33, 239, 128, 114, 15, 0, 85, 129, + 120, 218, 48, 49, 30, 182, 141, 102, 54, 157, 103, 220, 5, 130, 79, 36, + 35, 36, 74, 147, 176, 71, 66, 165, 21, 210, 155, 145, 254, 231, 23, 95, + 51, 182, 93, 147, 212, 92, 168, 44, 142, 79, 230, 48, 106, 180, 106, 42, + 135, 17, 178, 217, 50, 20, 150, 77, 138, 245, 83, 197, 199, 117, 64, 37, + 174, 214, 54, 11, 180, 226, 88, 68, 77, 196, 71, 159, 68, 84, 143, 71, + 146, 69, 41, 117, 151, 179, 217, 154, 201, 175, 128, 246, 85, 35, 84, 115, + 57, 36, 161, 145, 178, 198, 104, 201, 52, 149, 237, 229, 12, 221, 222, 44, + 195, 10, 94, 213, 50, 37, 218, 89, 81, 103, 201, 125, 246, 82, 222, 149, + 127, 196, 171, 203, 185, 13, 180, 99, 46, 129, 118, 160, 224, 138, 112, 54, + 151, 222, 132, 18, 217, 195, 154, 32, 7, 7, 96, 239, 43, 127, 86, 170, + 99, 77, 67, 152, 246, 126, 74, 6, 43, 1, 65, 69, 223, 48, 68, 140, + 64, 206, 116, 69, 36, 13, 32, 53, 68, 184, 63, 211, 222, 6, 193, 152, + 37, 66, 78, 138, 64, 2, 121, 101, 152, 117, 30, 132, 172, 57, 3, 73, + 28, 51, 100, 149, 109, 80, 105, 6, 240, 116, 3, 251, 54, 196, 215, 136, + 176, 186, 129, 240, 34, 110, 97, 109, 7, 186, 208, 46, 145, 32, 132, 206, + 93, 200, 89, 48, 101, 127, 192, 41, 211, 125, 36, 100, 169, 55, 126, 12, + 83, 127, 251, 224, 206, 78, 181, 86, 224, 213, 159, 0, 175, 246, 170, 117, + 144, 68, 204, 8, 124, 251, 243, 52, 0, 155, 247, 89, 141, 234, 119, 223, + 109, 73, 146, 101, 145, 50, 247, 44, 203, 69, 228, 128, 131, 14, 36, 152, + 235, 36, 66, 21, 16, 182, 188, 242, 158, 18, 51, 215, 162, 128, 25, 0, + 139, 116, 144, 12, 20, 68, 129, 49, 61, 62, 35, 135, 223, 158, 164, 152, + 2, 110, 250, 252, 0, 252, 19, 224, 33, 41, 52, 77, 36, 160, 153, 157, + 115, 244, 95, 14, 98, 221, 18, 85, 196, 176, 79, 161, 12, 167, 204, 29, + 60, 202, 180, 167, 36, 186, 183, 226, 240, 4, 69, 206, 38, 51, 252, 172, + 177, 102, 221, 171, 194, 247, 52, 202, 72, 152, 30, 69, 83, 1, 200, 27, + 230, 248, 81, 37, 222, 60, 106, 167, 34, 114, 41, 74, 82, 251, 162, 110, + 136, 207, 10, 3, 177, 81, 27, 52, 43, 52, 250, 245, 173, 230, 166, 81, + 161, 233, 165, 43, 108, 241, 238, 86, 223, 54, 42, 180, 0, 34, 205, 10, + 188, 214, 31, 242, 150, 81, 161, 157, 169, 48, 28, 102, 172, 98, 157, 167, + 42, 108, 62, 85, 161, 251, 84, 133, 87, 27, 217, 159, 211, 70, 182, 218, + 18, 30, 145, 77, 109, 36, 178, 126, 133, 222, 200, 50, 166, 187, 38, 210, + 201, 224, 14, 153, 202, 87, 109, 66, 40, 229, 148, 229, 88, 203, 151, 2, + 38, 179, 199, 245, 102, 73, 41, 86, 142, 40, 161, 113, 140, 181, 145, 0, + 78, 91, 163, 47, 249, 136, 178, 132, 70, 201, 9, 187, 100, 101, 54, 114, + 109, 72, 135, 123, 228, 62, 138, 246, 24, 54, 75, 28, 223, 140, 221, 207, + 92, 168, 142, 102, 224, 77, 34, 94, 24, 118, 175, 159, 79, 140, 43, 138, + 111, 91, 94, 210, 30, 137, 12, 170, 220, 29, 165, 141, 142, 209, 26, 146, + 88, 81, 42, 124, 146, 187, 198, 250, 59, 41, 105, 237, 48, 58, 247, 94, + 121, 165, 150, 245, 20, 146, 221, 15, 102, 116, 63, 145, 103, 180, 161, 172, + 55, 147, 160, 114, 100, 2, 55, 227, 216, 33, 244, 196, 71, 128, 68, 131, + 134, 171, 145, 94, 191, 168, 158, 191, 140, 121, 244, 223, 31, 58, 178, 15, + 96, 52, 210, 113, 113, 214, 204, 244, 199, 205, 115, 196, 141, 160, 115, 15, + 42, 13, 50, 62, 15, 91, 217, 104, 191, 61, 225, 15, 144, 166, 69, 47, + 29, 134, 34, 62, 121, 35, 155, 210, 37, 150, 62, 113, 51, 198, 167, 72, + 89, 29, 18, 196, 208, 66, 133, 155, 150, 177, 82, 60, 6, 32, 114, 71, + 22, 25, 102, 172, 70, 187, 13, 178, 95, 101, 84, 177, 102, 24, 190, 227, + 161, 236, 39, 93, 101, 43, 209, 139, 102, 216, 6, 71, 216, 5, 18, 255, + 82, 118, 148, 228, 76, 38, 250, 228, 189, 240, 240, 208, 35, 146, 73, 161, + 29, 63, 71, 2, 212, 178, 185, 70, 192, 61, 238, 136, 169, 192, 121, 211, + 167, 116, 189, 144, 141, 171, 68, 136, 104, 212, 34, 56, 81, 157, 83, 137, + 106, 80, 249, 93, 149, 15, 241, 140, 77, 128, 180, 195, 68, 236, 241, 25, + 136, 180, 4, 60, 186, 87, 148, 36, 198, 72, 184, 178, 180, 73, 165, 97, + 46, 217, 19, 214, 103, 156, 101, 182, 180, 52, 177, 81, 181, 147, 56, 109, + 21, 98, 153, 221, 216, 122, 217, 120, 213, 130, 250, 8, 245, 207, 26, 173, + 238, 241, 152, 188, 86, 226, 147, 200, 159, 229, 101, 183, 220, 7, 128, 75, + 87, 67, 241, 147, 128, 143, 81, 81, 100, 57, 4, 84, 14, 248, 170, 24, + 215, 164, 102, 212, 254, 125, 60, 91, 232, 160, 146, 40, 135, 51, 202, 28, + 11, 139, 161, 35, 238, 173, 245, 217, 67, 212, 172, 62, 127, 221, 136, 242, + 231, 35, 60, 79, 172, 160, 122, 99, 169, 122, 210, 184, 138, 252, 95, 183, + 249, 40, 205, 116, 204, 192, 127, 85, 251, 18, 119, 11, 51, 105, 122, 150, + 83, 225, 154, 76, 167, 32, 113, 161, 202, 66, 212, 227, 206, 144, 224, 5, + 164, 7, 101, 230, 252, 225, 76, 154, 53, 205, 126, 128, 6, 68, 65, 188, + 107, 73, 145, 234, 145, 111, 148, 44, 237, 242, 252, 251, 178, 124, 145, 89, + 188, 167, 238, 163, 67, 199, 15, 128, 74, 240, 197, 170, 116, 202, 255, 66, + 244, 54, 38, 241, 41, 200, 42, 177, 204, 221, 46, 64, 21, 103, 35, 149, + 49, 37, 143, 181, 229, 50, 181, 101, 195, 69, 60, 51, 253, 247, 106, 147, + 202, 146, 158, 77, 30, 80, 132, 31, 166, 102, 132, 100, 80, 213, 201, 46, + 150, 230, 102, 111, 226, 213, 40, 101, 197, 10, 85, 99, 45, 91, 127, 223, + 212, 243, 53, 207, 124, 178, 149, 252, 247, 150, 246, 249, 116, 87, 205, 157, + 53, 161, 16, 132, 76, 43, 246, 70, 154, 47, 63, 241, 253, 188, 47, 254, + 150, 163, 137, 249, 207, 146, 232, 224, 91, 219, 73, 116, 223, 71, 64, 230, + 72, 98, 184, 154, 75, 61, 104, 188, 25, 99, 210, 225, 248, 22, 225, 214, + 184, 67, 243, 100, 124, 215, 19, 15, 198, 13, 199, 157, 196, 248, 118, 159, + 108, 248, 241, 237, 185, 112, 141, 23, 175, 204, 154, 113, 79, 44, 192, 34, + 75, 79, 53, 117, 184, 232, 161, 66, 230, 39, 48, 55, 39, 138, 169, 214, + 126, 110, 244, 91, 190, 165, 11, 45, 171, 51, 15, 228, 161, 190, 179, 32, + 83, 23, 202, 11, 62, 119, 128, 116, 209, 22, 151, 62, 208, 13, 221, 73, + 244, 14, 148, 130, 125, 101, 11, 83, 155, 95, 179, 200, 10, 75, 6, 118, + 208, 210, 208, 98, 140, 121, 228, 146, 133, 165, 138, 239, 180, 124, 66, 99, + 39, 145, 67, 49, 66, 225, 218, 168, 148, 33, 49, 211, 111, 106, 224, 40, + 120, 43, 178, 177, 90, 235, 104, 93, 195, 158, 37, 98, 227, 134, 110, 33, + 7, 140, 116, 107, 201, 22, 230, 72, 203, 169, 182, 217, 248, 16, 94, 209, + 146, 136, 218, 56, 132, 233, 186, 101, 30, 198, 115, 42, 46, 105, 65, 153, + 85, 182, 246, 36, 237, 35, 122, 104, 58, 11, 164, 180, 166, 225, 96, 28, + 205, 129, 166, 44, 37, 220, 66, 20, 190, 49, 191, 18, 79, 150, 28, 144, + 88, 103, 253, 135, 110, 8, 115, 109, 222, 99, 129, 158, 199, 116, 231, 245, + 20, 49, 148, 112, 184, 238, 39, 130, 141, 175, 192, 134, 158, 146, 247, 129, + 118, 85, 160, 60, 126, 66, 237, 117, 130, 196, 72, 43, 198, 44, 71, 170, + 185, 148, 67, 139, 221, 51, 225, 64, 111, 184, 53, 229, 83, 9, 210, 239, + 127, 60, 223, 38, 255, 59, 30, 239, 177, 217, 238, 108, 254, 102, 124, 236, + 74, 76, 1, 143, 84, 33, 0, 131, 208, 59, 170, 255, 246, 51, 1, 154, + 85, 140, 110, 42, 72, 69, 23, 123, 215, 82, 180, 5, 221, 112, 91, 185, + 73, 38, 119, 57, 58, 215, 255, 132, 47, 248, 147, 126, 149, 43, 78, 2, + 248, 33, 135, 247, 87, 155, 211, 159, 219, 230, 180, 239, 82, 234, 14, 4, + 125, 174, 46, 75, 201, 101, 14, 208, 47, 171, 49, 169, 16, 18, 36, 68, + 218, 237, 175, 64, 147, 73, 229, 196, 95, 157, 101, 171, 157, 13, 28, 72, + 37, 249, 92, 157, 31, 11, 77, 81, 173, 28, 159, 230, 85, 71, 215, 229, + 28, 182, 81, 6, 165, 38, 165, 216, 28, 32, 87, 210, 2, 63, 252, 78, + 229, 61, 115, 94, 128, 78, 121, 90, 32, 178, 149, 126, 236, 58, 89, 48, + 109, 228, 36, 74, 85, 141, 108, 165, 164, 206, 196, 85, 62, 133, 204, 13, + 34, 139, 157, 161, 25, 25, 211, 160, 53, 215, 56, 210, 182, 157, 75, 91, + 202, 152, 154, 45, 165, 159, 61, 51, 198, 228, 244, 121, 4, 49, 119, 102, + 210, 199, 232, 25, 25, 223, 133, 143, 76, 18, 241, 243, 115, 189, 210, 198, + 31, 204, 128, 242, 185, 249, 154, 57, 236, 39, 33, 92, 191, 239, 193, 195, + 53, 224, 229, 24, 246, 80, 47, 56, 124, 239, 0, 144, 119, 178, 192, 237, + 94, 164, 105, 67, 186, 251, 170, 184, 121, 124, 179, 156, 59, 201, 211, 38, + 141, 98, 195, 248, 71, 219, 206, 64, 246, 82, 116, 229, 239, 46, 16, 188, + 2, 254, 159, 147, 99, 183, 241, 8, 171, 34, 163, 203, 177, 59, 177, 110, + 153, 79, 201, 60, 65, 13, 248, 58, 135, 235, 146, 113, 157, 195, 172, 241, + 21, 124, 20, 249, 91, 25, 102, 9, 195, 72, 91, 171, 80, 152, 100, 146, + 184, 96, 41, 156, 184, 153, 225, 199, 43, 167, 138, 214, 38, 210, 128, 230, + 194, 71, 187, 182, 31, 153, 181, 209, 233, 139, 116, 52, 80, 76, 252, 128, + 207, 140, 14, 97, 182, 4, 76, 248, 243, 17, 69, 111, 12, 96, 154, 21, + 132, 180, 169, 207, 92, 159, 15, 232, 67, 160, 45, 3, 122, 71, 42, 28, + 42, 127, 146, 26, 88, 30, 242, 10, 141, 158, 123, 214, 114, 38, 207, 188, + 100, 226, 250, 8, 65, 76, 57, 164, 119, 34, 146, 234, 233, 88, 211, 164, + 97, 57, 12, 204, 144, 245, 74, 163, 253, 12, 129, 1, 73, 147, 74, 107, + 163, 99, 77, 178, 25, 148, 194, 64, 37, 226, 49, 175, 65, 26, 139, 105, + 204, 25, 83, 73, 184, 152, 27, 70, 209, 140, 153, 217, 80, 243, 120, 37, + 173, 212, 236, 249, 142, 176, 209, 240, 166, 220, 142, 225, 171, 62, 183, 126, + 201, 180, 242, 203, 83, 17, 148, 231, 214, 18, 12, 165, 227, 39, 161, 134, + 1, 129, 152, 212, 212, 56, 220, 12, 30, 158, 115, 164, 16, 125, 233, 141, + 165, 180, 203, 203, 199, 172, 167, 197, 27, 252, 158, 58, 240, 119, 185, 106, + 35, 35, 10, 189, 16, 205, 201, 11, 107, 87, 78, 197, 231, 127, 81, 21, + 173, 211, 145, 10, 5, 25, 255, 34, 213, 190, 70, 84, 57, 68, 47, 83, + 0, 106, 27, 125, 139, 67, 229, 54, 164, 125, 161, 108, 225, 15, 66, 202, + 116, 181, 246, 188, 60, 242, 245, 26, 29, 213, 153, 156, 212, 121, 17, 7, + 6, 206, 140, 184, 192, 89, 113, 88, 96, 138, 82, 164, 115, 73, 101, 23, + 185, 147, 21, 220, 95, 35, 2, 95, 57, 220, 243, 15, 22, 81, 160, 25, + 167, 117, 76, 96, 244, 235, 76, 23, 153, 192, 106, 20, 230, 65, 109, 81, + 78, 233, 118, 109, 169, 146, 153, 192, 186, 222, 200, 110, 82, 21, 230, 157, + 78, 83, 241, 108, 210, 233, 180, 89, 56, 21, 69, 183, 85, 107, 13, 235, + 79, 108, 93, 190, 194, 250, 239, 171, 198, 124, 96, 83, 54, 104, 77, 126, + 91, 29, 70, 37, 205, 41, 182, 72, 246, 2, 54, 157, 169, 152, 109, 184, + 40, 69, 23, 121, 25, 95, 208, 31, 35, 129, 200, 204, 254, 102, 242, 32, + 14, 22, 125, 137, 65, 144, 68, 33, 202, 5, 106, 18, 239, 76, 130, 134, + 162, 99, 71, 57, 238, 2, 222, 243, 140, 141, 34, 173, 229, 191, 30, 108, + 248, 243, 33, 0, 172, 16, 243, 212, 30, 6, 153, 232, 207, 216, 248, 94, + 184, 255, 30, 124, 40, 192, 4, 244, 36, 46, 96, 5, 95, 35, 11, 153, + 111, 36, 173, 137, 178, 133, 99, 40, 94, 180, 159, 28, 39, 7, 135, 194, + 82, 94, 225, 179, 142, 245, 77, 195, 63, 37, 145, 137, 211, 198, 53, 114, + 117, 120, 211, 119, 190, 82, 171, 191, 138, 46, 63, 11, 52, 255, 150, 97, + 206, 91, 133, 105, 242, 40, 18, 17, 183, 206, 185, 135, 193, 170, 187, 167, + 215, 87, 228, 185, 137, 197, 95, 199, 204, 177, 7, 78, 168, 252, 54, 83, + 37, 121, 121, 149, 122, 51, 62, 192, 232, 197, 35, 168, 131, 237, 24, 27, + 236, 141, 210, 154, 233, 148, 103, 102, 240, 166, 125, 116, 135, 187, 108, 106, + 76, 119, 220, 68, 244, 232, 221, 114, 16, 108, 241, 193, 102, 122, 131, 117, + 40, 41, 15, 45, 237, 74, 7, 79, 237, 65, 107, 181, 63, 217, 191, 190, + 138, 34, 45, 140, 0, 215, 29, 35, 82, 163, 80, 31, 42, 208, 137, 51, + 230, 186, 122, 237, 127, 220, 24, 247, 111, 203, 212, 180, 116, 98, 119, 70, + 229, 7, 228, 41, 39, 103, 63, 98, 54, 35, 63, 72, 21, 192, 188, 142, + 95, 173, 227, 127, 118, 58, 4, 76, 179, 81, 152, 118, 113, 7, 4, 172, + 129, 181, 109, 127, 11, 253, 0, 253, 246, 232, 220, 96, 70, 183, 138, 53, + 210, 225, 193, 169, 130, 255, 241, 224, 155, 223, 54, 213, 217, 43, 196, 255, + 9, 32, 158, 206, 203, 40, 128, 120, 149, 146, 199, 200, 75, 78, 209, 102, + 88, 250, 117, 64, 165, 165, 204, 253, 170, 35, 179, 13, 0, 91, 82, 155, + 34, 111, 42, 35, 15, 120, 148, 192, 123, 143, 2, 216, 7, 129, 145, 211, + 251, 76, 60, 40, 175, 62, 202, 208, 109, 86, 160, 2, 253, 120, 181, 195, + 207, 43, 236, 254, 25, 96, 119, 171, 48, 216, 151, 96, 183, 124, 192, 108, + 158, 192, 236, 16, 238, 74, 169, 187, 44, 129, 206, 90, 93, 51, 219, 9, + 38, 42, 88, 7, 112, 29, 67, 78, 148, 158, 30, 243, 203, 191, 18, 205, + 63, 57, 224, 145, 3, 119, 163, 128, 104, 234, 243, 0, 112, 27, 107, 128, + 7, 103, 40, 31, 184, 129, 42, 5, 120, 139, 74, 75, 185, 165, 57, 4, + 244, 119, 23, 26, 158, 178, 97, 61, 125, 140, 58, 252, 181, 254, 98, 153, + 242, 179, 121, 29, 155, 208, 18, 104, 56, 149, 115, 139, 154, 45, 48, 125, + 81, 238, 35, 179, 194, 178, 114, 146, 114, 213, 161, 208, 140, 118, 39, 115, + 146, 242, 254, 247, 48, 19, 127, 151, 53, 174, 45, 151, 231, 130, 27, 133, + 218, 234, 147, 23, 141, 179, 106, 85, 8, 46, 140, 80, 39, 127, 197, 61, + 66, 97, 151, 163, 210, 36, 129, 220, 90, 166, 165, 167, 146, 111, 191, 158, + 151, 251, 122, 94, 238, 235, 121, 185, 175, 140, 241, 103, 103, 140, 79, 37, + 37, 165, 131, 114, 208, 220, 165, 130, 73, 12, 198, 232, 55, 148, 193, 171, + 180, 92, 148, 149, 209, 150, 142, 12, 90, 95, 83, 71, 4, 1, 232, 42, + 12, 249, 169, 98, 153, 219, 85, 248, 111, 101, 74, 154, 232, 228, 36, 18, + 84, 213, 229, 215, 17, 178, 233, 82, 182, 32, 59, 21, 231, 60, 4, 150, + 239, 164, 19, 137, 118, 107, 248, 111, 142, 183, 11, 25, 190, 94, 247, 135, + 254, 87, 96, 98, 29, 15, 158, 121, 2, 234, 28, 161, 66, 67, 223, 18, + 224, 244, 241, 54, 222, 230, 161, 187, 37, 243, 85, 244, 70, 26, 50, 208, + 97, 139, 185, 82, 101, 90, 209, 55, 240, 65, 117, 160, 100, 136, 105, 178, + 162, 135, 241, 173, 126, 124, 229, 137, 228, 77, 125, 163, 31, 109, 43, 131, + 66, 32, 103, 62, 61, 141, 239, 233, 249, 43, 252, 254, 79, 195, 111, 97, + 74, 41, 31, 15, 21, 69, 144, 180, 108, 49, 28, 114, 74, 119, 16, 192, + 66, 248, 24, 53, 149, 192, 22, 129, 209, 61, 29, 14, 101, 36, 78, 251, + 153, 8, 183, 58, 252, 189, 192, 171, 76, 161, 144, 74, 79, 228, 39, 59, + 166, 51, 85, 80, 202, 22, 228, 109, 70, 157, 94, 95, 249, 214, 5, 0, + 84, 100, 241, 170, 183, 0, 204, 251, 98, 196, 132, 99, 29, 74, 247, 145, + 57, 252, 209, 90, 111, 212, 209, 176, 181, 237, 240, 7, 235, 131, 244, 108, + 230, 90, 235, 93, 42, 218, 5, 225, 90, 185, 38, 174, 119, 211, 247, 87, + 24, 104, 226, 192, 171, 91, 84, 142, 9, 35, 49, 14, 20, 191, 101, 173, + 55, 155, 20, 15, 139, 231, 177, 238, 227, 137, 92, 125, 208, 61, 161, 184, + 222, 194, 226, 3, 90, 67, 76, 191, 4, 130, 118, 166, 253, 15, 149, 171, + 138, 213, 227, 152, 83, 43, 170, 126, 178, 192, 35, 189, 142, 164, 227, 224, + 62, 54, 40, 101, 234, 128, 187, 64, 12, 23, 149, 51, 168, 181, 73, 89, + 109, 229, 189, 128, 113, 180, 168, 145, 143, 160, 25, 89, 23, 0, 21, 193, + 163, 126, 252, 241, 188, 110, 164, 243, 93, 88, 235, 91, 212, 202, 133, 24, + 128, 220, 203, 15, 62, 67, 179, 52, 140, 139, 227, 207, 167, 189, 202, 117, + 15, 70, 64, 195, 191, 8, 61, 232, 73, 189, 14, 207, 27, 120, 127, 9, + 195, 224, 65, 47, 160, 209, 52, 219, 27, 74, 13, 3, 197, 202, 181, 182, + 251, 125, 230, 11, 152, 15, 85, 138, 43, 121, 180, 103, 97, 191, 0, 71, + 165, 156, 68, 61, 65, 159, 82, 80, 178, 59, 91, 134, 241, 48, 157, 129, + 170, 174, 14, 206, 252, 117, 23, 135, 60, 34, 25, 92, 43, 190, 59, 14, + 206, 25, 30, 142, 169, 246, 15, 81, 85, 57, 194, 92, 147, 209, 205, 49, + 29, 141, 184, 203, 60, 209, 231, 241, 106, 197, 23, 116, 4, 173, 190, 108, + 38, 151, 173, 228, 178, 157, 92, 158, 75, 225, 165, 22, 28, 67, 21, 15, + 28, 137, 103, 49, 238, 177, 69, 235, 92, 101, 195, 218, 167, 29, 83, 243, + 33, 44, 239, 148, 220, 90, 15, 194, 111, 194, 58, 218, 187, 132, 203, 67, + 80, 196, 65, 65, 58, 100, 244, 206, 25, 11, 60, 241, 64, 171, 230, 74, + 34, 185, 220, 170, 167, 111, 177, 167, 31, 29, 219, 186, 85, 25, 178, 122, + 3, 129, 49, 66, 214, 129, 24, 168, 116, 128, 9, 29, 121, 238, 220, 41, + 83, 130, 165, 181, 18, 171, 86, 79, 202, 80, 175, 83, 247, 246, 61, 60, + 196, 124, 32, 245, 86, 27, 103, 104, 123, 164, 14, 38, 5, 192, 54, 114, + 205, 95, 242, 1, 102, 45, 93, 208, 116, 237, 56, 156, 131, 228, 179, 179, + 152, 49, 32, 54, 164, 8, 46, 149, 42, 69, 69, 125, 131, 214, 105, 143, + 121, 147, 232, 90, 235, 241, 250, 41, 217, 97, 84, 51, 81, 137, 156, 187, + 194, 199, 28, 212, 68, 15, 134, 161, 99, 213, 26, 181, 45, 186, 119, 135, + 64, 184, 3, 85, 49, 54, 205, 204, 163, 51, 6, 117, 119, 19, 95, 103, + 163, 214, 194, 218, 30, 226, 210, 201, 76, 105, 52, 0, 202, 167, 31, 217, + 151, 172, 221, 11, 171, 222, 172, 229, 22, 183, 114, 75, 219, 185, 165, 157, + 220, 210, 110, 94, 105, 51, 175, 48, 247, 91, 29, 2, 72, 111, 18, 77, + 90, 35, 125, 95, 143, 110, 47, 40, 41, 40, 77, 213, 30, 158, 71, 108, + 37, 87, 93, 236, 46, 154, 113, 49, 106, 53, 240, 164, 170, 149, 42, 104, + 104, 200, 182, 106, 91, 221, 205, 232, 26, 46, 183, 162, 235, 120, 194, 99, + 23, 110, 124, 130, 81, 103, 52, 113, 170, 51, 141, 90, 163, 29, 223, 108, + 71, 107, 162, 111, 141, 245, 208, 246, 4, 189, 190, 113, 1, 224, 157, 234, + 154, 113, 219, 136, 111, 15, 9, 40, 212, 245, 177, 107, 75, 138, 149, 215, + 231, 51, 105, 1, 224, 136, 121, 254, 24, 223, 139, 175, 123, 161, 11, 232, + 179, 102, 26, 142, 210, 0, 163, 90, 178, 244, 105, 211, 104, 67, 139, 1, + 205, 40, 195, 156, 172, 212, 179, 8, 191, 212, 55, 140, 187, 204, 99, 125, + 34, 244, 25, 134, 80, 11, 174, 206, 188, 150, 174, 154, 64, 85, 83, 250, + 129, 179, 136, 190, 113, 22, 6, 17, 146, 158, 39, 117, 40, 151, 250, 37, + 137, 40, 209, 37, 57, 59, 233, 151, 62, 206, 184, 222, 118, 84, 8, 136, + 69, 30, 218, 211, 8, 255, 8, 154, 204, 251, 205, 204, 61, 82, 237, 164, + 232, 218, 181, 129, 163, 60, 204, 164, 79, 223, 211, 115, 100, 226, 25, 117, + 9, 187, 16, 175, 100, 82, 20, 79, 0, 221, 16, 208, 233, 91, 132, 46, + 194, 113, 179, 32, 69, 165, 84, 145, 73, 67, 122, 113, 102, 35, 61, 210, + 40, 57, 85, 12, 120, 189, 176, 79, 135, 183, 235, 199, 234, 46, 194, 109, + 221, 84, 187, 189, 147, 220, 40, 216, 174, 255, 8, 101, 221, 227, 156, 68, + 82, 49, 69, 19, 17, 1, 205, 190, 139, 250, 117, 64, 51, 5, 56, 112, + 47, 176, 240, 0, 48, 87, 21, 245, 198, 130, 222, 188, 118, 160, 191, 234, + 128, 241, 181, 210, 173, 152, 241, 31, 249, 188, 50, 216, 97, 136, 40, 34, + 108, 66, 67, 175, 56, 40, 173, 106, 241, 146, 194, 91, 70, 71, 75, 169, + 212, 222, 84, 67, 191, 68, 13, 168, 98, 61, 105, 153, 18, 69, 46, 240, + 72, 94, 253, 156, 174, 9, 80, 116, 163, 84, 64, 70, 100, 99, 33, 168, + 208, 252, 16, 21, 224, 27, 81, 129, 34, 51, 209, 218, 208, 47, 6, 221, + 196, 36, 217, 44, 212, 175, 164, 238, 169, 99, 71, 168, 47, 164, 71, 28, + 233, 237, 249, 165, 102, 15, 148, 101, 88, 141, 53, 185, 85, 148, 35, 126, + 81, 151, 166, 91, 51, 7, 70, 231, 7, 80, 179, 81, 247, 160, 144, 238, + 105, 146, 204, 241, 152, 31, 143, 175, 105, 28, 116, 167, 251, 24, 221, 42, + 18, 165, 241, 156, 74, 240, 179, 63, 36, 3, 184, 0, 163, 138, 59, 179, + 132, 59, 215, 151, 74, 26, 75, 37, 205, 165, 18, 226, 69, 64, 108, 28, + 30, 83, 87, 37, 175, 71, 30, 180, 196, 171, 132, 63, 139, 97, 206, 19, + 112, 77, 41, 157, 137, 241, 72, 5, 73, 148, 23, 197, 30, 45, 172, 125, + 204, 177, 73, 240, 224, 56, 73, 78, 152, 3, 57, 26, 37, 231, 200, 31, + 132, 128, 248, 184, 21, 61, 176, 176, 55, 19, 234, 251, 82, 97, 35, 175, + 176, 153, 87, 136, 131, 0, 85, 208, 51, 8, 60, 170, 129, 49, 83, 136, + 105, 114, 76, 119, 113, 67, 82, 19, 247, 75, 77, 127, 18, 234, 10, 48, + 50, 225, 248, 8, 99, 166, 104, 220, 234, 236, 110, 2, 147, 136, 166, 161, + 44, 24, 149, 165, 1, 73, 83, 218, 122, 230, 190, 145, 185, 111, 210, 61, + 145, 26, 131, 199, 167, 75, 26, 75, 37, 203, 111, 181, 126, 8, 132, 238, + 201, 86, 54, 214, 226, 56, 232, 1, 189, 128, 176, 230, 136, 59, 66, 210, + 14, 204, 194, 246, 216, 64, 122, 116, 72, 249, 98, 230, 74, 95, 96, 241, + 137, 112, 28, 63, 192, 72, 86, 194, 194, 41, 87, 197, 106, 86, 149, 96, + 143, 171, 113, 1, 205, 219, 68, 46, 123, 148, 219, 66, 149, 194, 245, 12, + 38, 143, 134, 224, 121, 74, 100, 191, 17, 120, 102, 239, 34, 38, 225, 62, + 30, 242, 247, 35, 67, 66, 17, 95, 57, 30, 197, 55, 94, 4, 209, 120, + 183, 171, 22, 140, 174, 247, 60, 22, 43, 20, 86, 118, 209, 150, 10, 35, + 125, 195, 186, 17, 125, 40, 137, 91, 36, 140, 248, 17, 82, 111, 72, 199, + 49, 122, 93, 202, 169, 62, 18, 126, 215, 11, 253, 177, 201, 106, 172, 29, + 194, 88, 80, 243, 92, 26, 220, 7, 204, 42, 125, 129, 101, 139, 8, 212, + 19, 94, 125, 203, 144, 195, 59, 161, 74, 201, 11, 45, 105, 48, 233, 133, + 211, 41, 33, 102, 4, 192, 187, 114, 56, 228, 36, 148, 168, 188, 3, 2, + 253, 87, 24, 148, 9, 151, 105, 161, 233, 108, 65, 72, 166, 212, 199, 4, + 157, 206, 161, 87, 204, 25, 9, 6, 90, 155, 171, 16, 101, 134, 139, 12, + 106, 34, 229, 199, 193, 245, 149, 140, 122, 126, 8, 4, 157, 6, 169, 40, + 134, 162, 49, 99, 210, 245, 126, 96, 226, 78, 142, 104, 129, 224, 167, 161, + 126, 154, 234, 167, 165, 126, 218, 234, 167, 163, 126, 54, 213, 79, 87, 253, + 108, 233, 215, 107, 63, 242, 221, 35, 64, 16, 88, 29, 165, 42, 30, 113, + 202, 5, 166, 175, 67, 84, 231, 245, 141, 176, 97, 172, 209, 53, 158, 97, + 163, 46, 241, 48, 176, 64, 163, 17, 40, 205, 160, 57, 255, 24, 128, 43, + 227, 64, 61, 190, 106, 196, 87, 205, 248, 170, 21, 95, 181, 227, 171, 78, + 124, 181, 25, 95, 117, 227, 171, 173, 164, 229, 90, 114, 153, 124, 165, 158, + 124, 166, 158, 124, 167, 158, 124, 168, 158, 124, 169, 158, 124, 170, 158, 124, + 171, 158, 124, 172, 158, 124, 173, 145, 124, 173, 97, 140, 41, 249, 90, 35, + 249, 90, 35, 249, 90, 35, 249, 90, 35, 249, 90, 35, 249, 90, 35, 249, + 90, 35, 249, 90, 51, 249, 90, 51, 249, 90, 211, 152, 194, 228, 107, 205, + 228, 107, 205, 228, 107, 205, 228, 107, 205, 228, 107, 205, 228, 107, 205, 228, + 107, 173, 228, 107, 173, 228, 107, 173, 228, 107, 45, 99, 197, 146, 175, 181, + 146, 175, 181, 146, 175, 181, 146, 175, 181, 186, 63, 68, 24, 81, 2, 236, + 9, 116, 215, 33, 103, 28, 210, 44, 73, 193, 248, 104, 37, 130, 185, 162, + 15, 4, 74, 90, 206, 142, 249, 161, 226, 123, 6, 15, 189, 242, 194, 56, + 239, 90, 151, 104, 56, 16, 148, 145, 34, 136, 32, 92, 253, 144, 248, 221, + 40, 247, 2, 20, 45, 180, 74, 140, 60, 234, 123, 200, 244, 143, 234, 109, + 162, 212, 32, 17, 5, 34, 135, 231, 179, 78, 22, 107, 74, 120, 246, 99, + 86, 166, 147, 193, 148, 235, 75, 37, 141, 165, 146, 230, 82, 73, 107, 169, + 164, 189, 84, 210, 89, 42, 217, 92, 42, 233, 46, 149, 108, 45, 247, 144, + 140, 17, 202, 86, 84, 139, 120, 15, 217, 169, 202, 233, 187, 70, 234, 174, + 153, 186, 107, 165, 238, 218, 169, 187, 78, 234, 110, 51, 117, 215, 77, 221, + 109, 165, 191, 78, 29, 115, 64, 66, 68, 27, 41, 174, 127, 178, 2, 240, + 100, 31, 244, 52, 149, 66, 92, 57, 143, 173, 41, 249, 95, 157, 123, 165, + 184, 26, 105, 98, 23, 30, 102, 2, 85, 102, 8, 227, 158, 36, 59, 76, + 151, 131, 250, 193, 148, 219, 177, 114, 16, 139, 146, 234, 46, 134, 192, 83, + 248, 186, 63, 96, 51, 181, 166, 201, 93, 35, 117, 215, 76, 221, 181, 82, + 119, 237, 212, 93, 39, 117, 183, 153, 186, 235, 166, 238, 182, 210, 95, 199, + 105, 57, 21, 67, 14, 10, 0, 96, 8, 198, 185, 35, 214, 12, 4, 115, + 84, 207, 242, 31, 53, 138, 31, 53, 139, 31, 181, 138, 31, 181, 139, 31, + 117, 138, 31, 109, 22, 63, 234, 22, 63, 218, 90, 49, 100, 69, 231, 164, + 189, 40, 215, 227, 171, 70, 124, 213, 140, 175, 90, 241, 85, 59, 190, 234, + 196, 87, 155, 241, 85, 55, 190, 218, 74, 90, 198, 143, 156, 51, 178, 103, + 2, 222, 8, 199, 118, 160, 55, 244, 193, 229, 210, 70, 110, 105, 51, 183, + 180, 149, 91, 218, 206, 45, 237, 228, 150, 110, 230, 150, 118, 115, 75, 183, + 242, 71, 129, 131, 83, 104, 133, 96, 31, 197, 28, 211, 232, 226, 155, 134, + 121, 211, 52, 111, 90, 230, 77, 219, 188, 233, 152, 55, 155, 230, 77, 215, + 188, 217, 50, 110, 168, 47, 74, 214, 35, 174, 96, 251, 250, 71, 227, 125, + 100, 0, 38, 175, 173, 32, 180, 5, 48, 141, 73, 116, 146, 118, 111, 204, + 212, 225, 214, 17, 47, 80, 84, 237, 199, 212, 91, 230, 200, 209, 193, 103, + 204, 137, 232, 186, 18, 228, 135, 205, 90, 156, 52, 211, 120, 136, 134, 245, + 30, 1, 229, 113, 225, 131, 21, 79, 50, 143, 232, 248, 139, 188, 207, 144, + 18, 168, 158, 102, 95, 49, 158, 224, 35, 84, 9, 233, 129, 22, 240, 181, + 84, 188, 3, 180, 140, 156, 249, 150, 158, 43, 150, 123, 196, 89, 96, 62, + 61, 146, 133, 143, 46, 184, 135, 71, 184, 70, 182, 132, 90, 125, 74, 122, + 66, 225, 243, 246, 234, 231, 245, 90, 230, 121, 97, 143, 211, 253, 185, 226, + 131, 177, 139, 27, 172, 106, 52, 192, 209, 148, 197, 83, 109, 137, 65, 133, + 47, 194, 185, 231, 158, 122, 138, 199, 64, 171, 35, 69, 34, 181, 194, 120, + 122, 236, 14, 61, 166, 76, 34, 70, 105, 4, 67, 240, 238, 15, 1, 208, + 20, 195, 46, 71, 30, 153, 102, 147, 155, 55, 107, 148, 163, 36, 156, 186, + 38, 171, 179, 78, 153, 189, 176, 118, 132, 103, 167, 74, 207, 248, 131, 24, + 200, 53, 109, 116, 39, 182, 132, 103, 238, 192, 196, 69, 66, 16, 102, 61, + 199, 221, 102, 223, 39, 126, 183, 255, 160, 14, 20, 237, 108, 173, 69, 198, + 48, 109, 121, 85, 55, 196, 250, 214, 72, 9, 240, 162, 119, 34, 85, 44, + 230, 115, 103, 40, 138, 205, 164, 35, 148, 37, 25, 244, 12, 151, 76, 154, + 56, 54, 62, 247, 103, 26, 199, 206, 53, 120, 33, 223, 4, 121, 105, 20, + 55, 120, 225, 169, 3, 232, 99, 139, 41, 38, 174, 13, 4, 244, 29, 62, + 197, 30, 149, 185, 18, 189, 92, 72, 143, 235, 205, 225, 215, 218, 9, 251, + 125, 135, 143, 232, 48, 77, 85, 114, 200, 29, 22, 4, 56, 248, 43, 38, + 70, 228, 111, 192, 60, 52, 6, 172, 225, 185, 246, 19, 87, 206, 233, 132, + 251, 199, 62, 135, 153, 9, 39, 99, 230, 177, 248, 254, 12, 106, 10, 117, + 88, 150, 42, 232, 129, 166, 237, 13, 80, 41, 69, 226, 192, 97, 141, 3, + 114, 82, 32, 11, 152, 94, 232, 53, 125, 28, 141, 167, 196, 34, 31, 22, + 189, 241, 210, 69, 63, 148, 8, 185, 42, 17, 233, 45, 115, 38, 84, 36, + 109, 67, 39, 61, 103, 104, 202, 251, 136, 27, 112, 215, 51, 76, 123, 111, + 93, 41, 59, 218, 5, 35, 127, 98, 107, 135, 84, 89, 220, 134, 23, 100, + 223, 211, 182, 194, 30, 19, 142, 106, 1, 141, 231, 174, 192, 124, 112, 169, + 27, 146, 168, 175, 189, 62, 195, 189, 142, 121, 95, 146, 109, 144, 255, 2, + 253, 236, 145, 130, 141, 185, 117, 119, 225, 225, 158, 180, 142, 131, 31, 2, + 104, 143, 245, 1, 214, 148, 46, 182, 125, 207, 172, 14, 233, 95, 219, 143, + 30, 227, 142, 181, 69, 50, 172, 12, 189, 62, 12, 170, 67, 226, 43, 229, + 172, 38, 37, 110, 119, 204, 167, 136, 169, 160, 155, 145, 188, 231, 176, 5, + 158, 22, 73, 234, 206, 174, 131, 138, 56, 11, 173, 54, 137, 144, 178, 47, + 212, 126, 21, 153, 56, 133, 163, 180, 31, 58, 204, 7, 198, 184, 133, 112, + 189, 247, 13, 24, 129, 84, 74, 216, 30, 186, 98, 194, 77, 189, 149, 108, + 59, 145, 174, 114, 32, 157, 17, 44, 101, 27, 217, 201, 65, 72, 150, 170, + 110, 151, 32, 223, 129, 158, 147, 62, 46, 189, 62, 90, 183, 104, 20, 167, + 220, 149, 15, 160, 116, 145, 104, 21, 14, 38, 11, 53, 134, 179, 193, 137, + 0, 234, 239, 90, 155, 36, 50, 8, 71, 146, 74, 123, 206, 177, 104, 147, + 88, 149, 178, 49, 33, 127, 104, 171, 85, 132, 62, 184, 76, 169, 147, 23, + 34, 96, 11, 166, 148, 211, 75, 14, 104, 160, 84, 181, 75, 62, 93, 40, + 117, 178, 135, 142, 228, 19, 128, 246, 70, 83, 217, 221, 196, 8, 187, 132, + 149, 174, 200, 17, 131, 212, 214, 171, 57, 166, 66, 222, 172, 19, 99, 243, + 184, 84, 186, 223, 23, 40, 35, 221, 241, 11, 159, 112, 84, 252, 126, 200, + 92, 5, 170, 24, 9, 228, 100, 135, 81, 122, 224, 30, 218, 114, 72, 145, + 196, 157, 22, 4, 230, 243, 152, 218, 184, 82, 248, 92, 233, 113, 92, 105, + 152, 123, 120, 154, 82, 64, 150, 72, 213, 175, 61, 58, 255, 139, 114, 67, + 146, 246, 76, 214, 89, 37, 74, 95, 161, 224, 77, 243, 189, 15, 200, 78, + 135, 162, 208, 132, 232, 45, 109, 77, 81, 40, 71, 148, 167, 212, 83, 253, + 164, 39, 221, 133, 106, 93, 27, 41, 113, 70, 143, 216, 108, 182, 32, 183, + 148, 58, 65, 210, 209, 233, 33, 169, 146, 199, 174, 29, 2, 185, 197, 163, + 157, 180, 66, 77, 200, 167, 77, 16, 30, 204, 184, 84, 70, 2, 245, 189, + 19, 124, 86, 111, 41, 37, 212, 15, 212, 59, 106, 35, 89, 61, 163, 169, + 0, 58, 167, 84, 249, 171, 177, 39, 208, 13, 67, 153, 69, 67, 111, 34, + 240, 37, 82, 171, 35, 142, 81, 239, 96, 19, 183, 128, 248, 184, 147, 136, + 19, 211, 248, 33, 139, 207, 246, 76, 2, 210, 44, 102, 48, 227, 228, 176, + 67, 187, 2, 103, 114, 170, 172, 151, 59, 229, 29, 185, 80, 6, 152, 29, + 217, 199, 179, 198, 145, 121, 160, 144, 108, 29, 10, 58, 157, 3, 64, 72, + 153, 108, 164, 235, 9, 114, 108, 232, 169, 99, 59, 128, 13, 80, 142, 171, + 61, 54, 37, 94, 136, 71, 198, 145, 35, 193, 128, 200, 94, 126, 71, 255, + 89, 220, 209, 78, 237, 23, 95, 255, 88, 235, 24, 166, 67, 193, 94, 198, + 173, 181, 237, 4, 202, 43, 6, 83, 245, 39, 27, 251, 134, 26, 186, 150, + 217, 20, 88, 211, 187, 81, 232, 200, 96, 50, 197, 114, 70, 69, 173, 165, + 181, 210, 154, 34, 30, 184, 121, 176, 14, 227, 25, 111, 68, 100, 33, 38, + 15, 235, 76, 245, 37, 186, 35, 81, 202, 40, 192, 19, 238, 248, 148, 27, + 37, 247, 48, 157, 58, 41, 189, 98, 175, 52, 168, 84, 1, 230, 199, 246, + 164, 136, 83, 215, 243, 105, 180, 29, 69, 63, 225, 131, 18, 50, 148, 11, + 152, 2, 234, 4, 186, 215, 251, 36, 138, 109, 24, 37, 209, 7, 162, 123, + 88, 39, 105, 222, 223, 43, 35, 240, 70, 140, 17, 122, 154, 142, 36, 44, + 239, 137, 36, 70, 113, 236, 250, 1, 212, 41, 239, 34, 177, 163, 160, 134, + 88, 166, 57, 145, 54, 83, 222, 33, 4, 50, 136, 6, 235, 125, 224, 254, + 46, 249, 3, 201, 169, 92, 83, 30, 36, 132, 177, 212, 103, 181, 105, 172, + 7, 132, 55, 32, 108, 11, 242, 150, 35, 125, 2, 112, 45, 153, 166, 200, + 52, 139, 102, 98, 109, 47, 185, 210, 97, 219, 194, 157, 68, 141, 24, 66, + 62, 200, 27, 248, 43, 3, 4, 202, 245, 41, 126, 106, 195, 40, 48, 6, + 171, 138, 236, 228, 202, 90, 31, 160, 165, 122, 35, 225, 148, 187, 56, 172, + 242, 49, 109, 153, 233, 162, 104, 111, 14, 69, 229, 248, 90, 29, 48, 23, + 11, 219, 81, 129, 78, 49, 139, 80, 21, 91, 171, 181, 224, 25, 65, 14, + 200, 95, 238, 34, 250, 77, 151, 90, 235, 115, 16, 41, 140, 219, 8, 6, + 123, 33, 38, 74, 215, 219, 87, 201, 141, 89, 1, 13, 96, 7, 159, 137, + 142, 68, 22, 126, 125, 133, 223, 0, 196, 217, 48, 75, 162, 115, 92, 211, + 133, 209, 216, 55, 18, 114, 100, 16, 166, 168, 171, 241, 189, 2, 60, 117, + 102, 185, 238, 155, 234, 213, 56, 218, 138, 223, 136, 139, 22, 36, 31, 110, + 172, 253, 191, 132, 62, 92, 141, 195, 105, 223, 69, 46, 77, 137, 209, 200, + 95, 177, 174, 66, 97, 26, 173, 141, 175, 245, 215, 12, 6, 175, 25, 12, + 126, 110, 191, 89, 125, 218, 56, 136, 250, 111, 86, 206, 180, 113, 24, 139, + 233, 69, 27, 157, 136, 64, 174, 161, 120, 4, 43, 122, 180, 168, 131, 196, + 129, 95, 227, 112, 70, 120, 170, 193, 0, 176, 210, 167, 35, 179, 223, 254, + 61, 117, 172, 70, 252, 249, 218, 155, 165, 47, 13, 232, 56, 230, 247, 127, + 19, 211, 145, 229, 123, 131, 119, 107, 54, 11, 216, 91, 58, 14, 181, 58, + 115, 71, 120, 240, 13, 239, 180, 74, 226, 102, 231, 227, 229, 188, 118, 114, + 56, 146, 219, 240, 207, 121, 239, 122, 188, 127, 61, 130, 171, 29, 186, 31, + 237, 110, 159, 225, 239, 166, 253, 101, 212, 132, 223, 189, 237, 131, 157, 179, + 155, 253, 107, 44, 59, 220, 25, 221, 205, 143, 22, 215, 7, 59, 219, 159, + 206, 246, 182, 231, 225, 81, 239, 236, 211, 222, 168, 251, 230, 244, 234, 236, + 120, 119, 123, 212, 248, 208, 11, 246, 206, 174, 134, 211, 176, 61, 58, 217, + 25, 13, 253, 14, 191, 31, 249, 237, 61, 49, 147, 179, 227, 243, 199, 90, + 231, 164, 87, 13, 30, 61, 215, 13, 153, 119, 61, 61, 124, 232, 125, 218, + 191, 57, 250, 120, 181, 223, 250, 176, 56, 63, 58, 126, 24, 141, 246, 225, + 83, 187, 163, 214, 249, 206, 252, 91, 99, 107, 248, 121, 250, 208, 189, 8, + 107, 222, 163, 92, 120, 23, 206, 226, 244, 72, 62, 156, 60, 142, 130, 147, + 43, 219, 107, 87, 103, 247, 179, 199, 111, 225, 221, 38, 159, 181, 60, 17, + 28, 127, 235, 75, 249, 121, 52, 187, 187, 26, 5, 119, 23, 3, 183, 117, + 177, 237, 220, 93, 124, 113, 143, 143, 238, 166, 238, 230, 249, 228, 168, 215, + 17, 159, 123, 155, 163, 67, 126, 63, 168, 79, 63, 222, 92, 143, 111, 46, + 175, 197, 237, 109, 237, 240, 168, 247, 237, 12, 190, 95, 123, 115, 186, 240, + 7, 135, 59, 173, 171, 221, 79, 19, 185, 51, 159, 52, 118, 71, 223, 194, + 77, 190, 249, 88, 63, 223, 11, 31, 7, 223, 220, 135, 110, 255, 251, 227, + 217, 103, 183, 214, 175, 58, 15, 253, 123, 224, 38, 32, 173, 183, 47, 28, + 255, 203, 233, 157, 119, 119, 239, 126, 151, 225, 221, 183, 99, 119, 234, 221, + 125, 254, 246, 189, 89, 29, 184, 71, 85, 248, 110, 85, 124, 63, 122, 188, + 114, 154, 143, 195, 217, 145, 203, 220, 35, 23, 52, 1, 246, 102, 242, 121, + 87, 140, 220, 189, 67, 49, 189, 63, 26, 223, 222, 223, 136, 198, 151, 55, + 95, 26, 253, 179, 201, 237, 109, 147, 59, 29, 199, 118, 154, 151, 67, 231, + 113, 123, 228, 136, 86, 31, 24, 208, 103, 231, 210, 251, 124, 115, 126, 127, + 227, 124, 148, 108, 242, 230, 254, 174, 182, 53, 190, 174, 5, 119, 151, 147, + 112, 124, 91, 59, 255, 120, 113, 125, 254, 165, 119, 189, 243, 230, 234, 177, + 125, 125, 185, 55, 107, 92, 62, 222, 12, 62, 237, 221, 124, 191, 16, 237, + 197, 199, 69, 251, 246, 92, 140, 143, 78, 23, 219, 246, 193, 195, 192, 219, + 29, 159, 239, 30, 110, 183, 216, 238, 167, 217, 120, 119, 251, 219, 188, 19, + 186, 222, 98, 235, 104, 241, 120, 230, 121, 15, 167, 213, 249, 67, 127, 24, + 46, 188, 211, 99, 175, 3, 125, 255, 126, 235, 207, 190, 127, 118, 239, 217, + 85, 48, 255, 190, 231, 6, 237, 234, 52, 152, 125, 115, 188, 246, 183, 254, + 247, 89, 127, 232, 221, 85, 135, 193, 221, 253, 193, 180, 197, 219, 211, 187, + 219, 219, 97, 235, 232, 78, 222, 237, 237, 139, 102, 120, 49, 106, 186, 135, + 211, 230, 183, 187, 111, 159, 175, 246, 39, 159, 143, 62, 138, 230, 225, 129, + 253, 121, 111, 239, 219, 180, 122, 53, 190, 125, 211, 225, 141, 55, 247, 195, + 219, 199, 158, 115, 232, 178, 201, 237, 244, 209, 190, 21, 95, 6, 141, 225, + 71, 209, 184, 56, 228, 141, 163, 221, 113, 61, 148, 236, 38, 104, 220, 213, + 197, 23, 86, 31, 238, 216, 206, 151, 214, 205, 193, 199, 227, 207, 206, 65, + 191, 231, 236, 94, 223, 238, 47, 142, 110, 247, 199, 211, 94, 141, 245, 174, + 106, 183, 59, 151, 123, 211, 139, 222, 227, 248, 254, 211, 183, 15, 236, 98, + 215, 105, 126, 218, 29, 79, 207, 133, 232, 236, 11, 33, 14, 22, 119, 181, + 227, 222, 225, 167, 253, 157, 55, 253, 221, 7, 127, 126, 180, 227, 12, 246, + 30, 198, 205, 221, 203, 227, 209, 222, 206, 254, 227, 254, 167, 205, 81, 243, + 252, 113, 0, 255, 135, 173, 160, 15, 64, 114, 49, 175, 159, 110, 246, 22, + 167, 205, 43, 239, 251, 227, 245, 247, 246, 148, 77, 63, 184, 187, 179, 246, + 103, 248, 255, 234, 203, 236, 3, 40, 41, 210, 253, 228, 220, 125, 150, 110, + 171, 247, 102, 44, 63, 126, 24, 221, 93, 124, 119, 63, 55, 7, 206, 209, + 227, 182, 115, 244, 125, 199, 62, 234, 247, 229, 209, 213, 206, 200, 189, 186, + 115, 63, 31, 190, 25, 54, 15, 30, 190, 76, 223, 116, 190, 53, 234, 157, + 187, 67, 247, 116, 124, 59, 188, 30, 53, 110, 157, 193, 180, 247, 56, 56, + 236, 221, 178, 198, 121, 243, 203, 244, 98, 95, 220, 52, 143, 185, 35, 62, + 124, 62, 184, 109, 240, 250, 209, 137, 125, 112, 56, 189, 185, 57, 236, 221, + 237, 47, 14, 97, 205, 229, 213, 117, 56, 98, 251, 223, 253, 187, 235, 217, + 252, 102, 255, 251, 248, 110, 127, 220, 190, 169, 125, 217, 188, 174, 245, 143, + 239, 174, 63, 126, 186, 187, 62, 175, 158, 92, 159, 31, 95, 76, 78, 14, + 175, 246, 182, 238, 63, 61, 46, 62, 124, 250, 54, 155, 93, 236, 141, 111, + 63, 94, 221, 126, 57, 219, 221, 220, 62, 220, 173, 125, 255, 176, 24, 15, + 79, 23, 151, 54, 192, 69, 245, 120, 7, 240, 245, 97, 52, 255, 48, 30, + 220, 31, 95, 14, 252, 253, 177, 125, 112, 114, 217, 219, 221, 187, 188, 60, + 222, 157, 183, 123, 187, 219, 15, 223, 110, 106, 243, 115, 164, 7, 135, 251, + 206, 254, 167, 155, 79, 242, 177, 209, 60, 223, 185, 126, 232, 223, 93, 110, + 31, 117, 63, 110, 125, 248, 92, 127, 115, 224, 120, 222, 248, 236, 152, 109, + 126, 236, 94, 28, 14, 206, 235, 243, 157, 209, 67, 243, 33, 120, 180, 119, + 62, 219, 205, 195, 79, 237, 71, 187, 73, 255, 86, 79, 7, 211, 197, 233, + 233, 253, 100, 226, 221, 87, 79, 219, 131, 189, 45, 247, 248, 195, 247, 254, + 65, 247, 108, 20, 30, 222, 125, 57, 30, 125, 188, 156, 76, 231, 95, 250, + 147, 111, 95, 218, 87, 19, 103, 118, 59, 154, 58, 222, 253, 253, 135, 111, + 222, 237, 238, 155, 131, 79, 211, 195, 253, 173, 187, 201, 245, 225, 225, 221, + 229, 213, 221, 35, 171, 45, 216, 217, 200, 61, 235, 61, 220, 124, 233, 126, + 178, 239, 14, 187, 53, 121, 182, 251, 56, 218, 106, 127, 56, 62, 59, 190, + 57, 152, 221, 156, 58, 187, 195, 147, 179, 139, 155, 214, 183, 209, 225, 193, + 233, 254, 100, 177, 127, 176, 243, 225, 3, 155, 126, 90, 220, 216, 155, 103, + 251, 141, 197, 67, 179, 125, 240, 253, 146, 29, 124, 186, 61, 63, 177, 123, + 226, 75, 255, 90, 192, 156, 93, 117, 62, 156, 207, 221, 227, 147, 203, 69, + 167, 250, 237, 116, 235, 234, 58, 56, 239, 30, 127, 223, 226, 245, 187, 187, + 233, 214, 167, 70, 253, 220, 190, 184, 247, 79, 191, 117, 123, 119, 123, 33, + 171, 31, 125, 248, 190, 249, 200, 54, 133, 156, 125, 63, 241, 231, 206, 151, + 122, 125, 235, 234, 182, 241, 205, 110, 182, 219, 139, 155, 246, 131, 252, 112, + 248, 109, 248, 176, 248, 116, 51, 125, 216, 237, 52, 246, 93, 127, 192, 31, + 219, 223, 38, 118, 176, 251, 56, 121, 56, 248, 208, 177, 3, 62, 227, 59, + 85, 246, 120, 60, 157, 31, 176, 47, 245, 219, 198, 201, 98, 114, 255, 249, + 212, 227, 31, 246, 30, 228, 238, 192, 254, 50, 24, 206, 106, 151, 181, 206, + 206, 214, 238, 108, 209, 63, 216, 253, 36, 102, 199, 223, 231, 111, 206, 239, + 30, 62, 214, 167, 221, 199, 81, 245, 155, 12, 133, 12, 46, 6, 31, 197, + 158, 235, 29, 213, 63, 241, 55, 117, 246, 165, 119, 115, 115, 58, 56, 219, + 27, 119, 223, 92, 223, 118, 123, 7, 236, 196, 243, 14, 236, 255, 159, 189, + 247, 218, 129, 158, 201, 214, 243, 110, 197, 216, 167, 132, 212, 204, 236, 6, + 180, 7, 96, 206, 57, 243, 196, 96, 206, 57, 243, 234, 205, 239, 159, 217, + 210, 216, 150, 108, 200, 22, 188, 117, 224, 110, 20, 216, 129, 100, 21, 43, + 172, 245, 188, 197, 170, 98, 222, 243, 34, 139, 37, 8, 194, 199, 112, 53, + 206, 138, 236, 33, 81, 190, 127, 95, 145, 10, 73, 248, 184, 39, 37, 106, + 223, 141, 10, 158, 134, 113, 108, 72, 180, 128, 220, 211, 63, 63, 66, 91, + 161, 166, 243, 185, 209, 245, 158, 81, 124, 27, 53, 65, 3, 5, 97, 216, + 228, 224, 87, 36, 130, 193, 21, 74, 68, 37, 153, 66, 12, 248, 253, 152, + 174, 240, 185, 20, 22, 123, 172, 189, 64, 14, 82, 60, 19, 201, 216, 12, + 159, 165, 203, 39, 234, 21, 73, 159, 166, 120, 39, 46, 213, 187, 170, 105, + 154, 162, 54, 66, 190, 130, 88, 78, 115, 42, 0, 234, 54, 26, 146, 49, + 21, 153, 227, 157, 41, 103, 33, 201, 189, 200, 112, 240, 104, 52, 69, 233, + 237, 142, 6, 235, 222, 78, 58, 252, 27, 51, 198, 131, 125, 190, 7, 90, + 85, 169, 225, 215, 67, 133, 100, 125, 246, 171, 247, 105, 102, 80, 117, 102, + 0, 49, 116, 14, 135, 174, 44, 154, 235, 73, 34, 226, 207, 174, 236, 137, + 168, 150, 176, 154, 40, 110, 71, 112, 42, 118, 154, 136, 201, 21, 129, 40, + 218, 211, 241, 91, 82, 113, 92, 59, 3, 5, 202, 57, 67, 172, 41, 228, + 242, 96, 193, 82, 242, 84, 153, 34, 2, 156, 233, 187, 213, 96, 71, 12, + 190, 242, 251, 48, 29, 157, 26, 155, 232, 103, 246, 98, 26, 15, 185, 74, + 130, 195, 228, 179, 126, 227, 85, 227, 52, 28, 170, 174, 68, 200, 243, 2, + 239, 71, 16, 106, 93, 53, 44, 205, 243, 172, 28, 215, 239, 35, 167, 33, + 168, 56, 171, 96, 62, 156, 106, 15, 86, 130, 38, 96, 18, 122, 121, 51, + 215, 227, 50, 194, 0, 20, 13, 209, 87, 160, 226, 134, 165, 77, 94, 23, + 231, 26, 157, 135, 63, 165, 204, 163, 185, 96, 125, 99, 248, 128, 27, 241, + 83, 51, 164, 91, 6, 164, 101, 10, 100, 186, 94, 130, 99, 253, 196, 218, + 171, 214, 168, 127, 44, 40, 34, 187, 21, 167, 107, 221, 84, 218, 31, 73, + 147, 166, 60, 113, 228, 206, 90, 102, 210, 91, 41, 18, 217, 118, 50, 106, + 140, 78, 98, 84, 9, 124, 95, 63, 79, 202, 164, 89, 209, 172, 248, 32, + 168, 38, 52, 24, 117, 137, 222, 210, 253, 250, 179, 172, 195, 89, 166, 54, + 142, 84, 205, 222, 162, 63, 63, 247, 144, 66, 178, 188, 229, 70, 228, 166, + 33, 100, 138, 0, 249, 136, 3, 160, 173, 38, 252, 1, 139, 2, 85, 190, + 39, 176, 146, 123, 113, 87, 193, 143, 3, 236, 143, 122, 35, 31, 255, 249, + 241, 103, 15, 96, 139, 43, 58, 223, 55, 37, 127, 94, 108, 199, 57, 173, + 189, 155, 61, 77, 255, 203, 231, 111, 255, 60, 43, 231, 63, 197, 255, 75, + 181, 228, 197, 191, 254, 181, 24, 243, 250, 143, 167, 43, 197, 127, 159, 32, + 83, 254, 99, 126, 204, 95, 11, 51, 255, 203, 223, 254, 79, 211, 102, 254, + 195, 159, 135, 22, 172, 213, 31, 144, 250, 79, 159, 248, 111, 255, 233, 243, + 15, 252, 249, 255, 138, 150, 254, 126, 109, 255, 160, 37, 138, 157, 196, 133, + 255, 47, 180, 20, 184, 144, 230, 120, 96, 90, 56, 160, 26, 104, 119, 130, + 23, 253, 72, 188, 223, 143, 0, 252, 214, 240, 182, 60, 49, 180, 49, 239, + 103, 196, 125, 222, 74, 113, 17, 161, 205, 92, 130, 255, 30, 147, 64, 63, + 67, 189, 215, 70, 190, 18, 252, 187, 203, 115, 54, 72, 144, 106, 185, 141, + 14, 102, 131, 252, 100, 195, 235, 36, 10, 234, 92, 17, 234, 76, 7, 231, + 249, 22, 250, 157, 10, 226, 169, 4, 236, 142, 3, 213, 128, 83, 173, 239, + 101, 148, 193, 188, 135, 210, 135, 11, 1, 76, 0, 105, 130, 3, 102, 130, + 120, 103, 76, 4, 165, 136, 241, 168, 251, 239, 88, 251, 223, 235, 225, 204, + 39, 85, 164, 107, 149, 161, 45, 229, 209, 93, 101, 156, 71, 65, 196, 147, + 64, 244, 91, 57, 148, 147, 24, 180, 83, 6, 214, 57, 222, 129, 109, 238, + 163, 14, 251, 97, 217, 176, 141, 145, 31, 173, 126, 55, 121, 174, 167, 121, + 142, 123, 137, 38, 168, 226, 26, 147, 118, 18, 157, 86, 34, 109, 150, 66, + 245, 205, 4, 10, 125, 9, 49, 240, 97, 192, 177, 158, 239, 39, 132, 212, + 65, 190, 223, 124, 184, 22, 68, 58, 151, 70, 191, 146, 28, 222, 20, 125, + 93, 20, 69, 60, 229, 187, 153, 228, 135, 219, 231, 153, 216, 226, 26, 91, + 113, 91, 171, 81, 32, 239, 69, 56, 237, 196, 90, 41, 5, 232, 73, 133, + 237, 61, 169, 116, 37, 129, 132, 134, 29, 20, 217, 96, 101, 90, 96, 185, + 137, 181, 27, 114, 215, 168, 209, 231, 83, 161, 64, 98, 62, 43, 140, 238, + 105, 224, 189, 38, 192, 122, 84, 251, 92, 191, 142, 120, 46, 139, 115, 47, + 253, 190, 44, 141, 122, 41, 1, 119, 44, 246, 181, 42, 206, 123, 125, 242, + 56, 39, 114, 55, 201, 175, 78, 198, 27, 225, 144, 115, 163, 153, 250, 168, + 151, 98, 191, 157, 104, 177, 10, 111, 187, 9, 119, 189, 22, 227, 168, 9, + 125, 177, 12, 117, 186, 16, 246, 161, 20, 106, 167, 8, 40, 36, 13, 40, + 56, 230, 101, 38, 134, 174, 193, 237, 56, 215, 98, 43, 228, 45, 236, 71, + 121, 84, 76, 121, 72, 92, 170, 203, 241, 109, 187, 17, 103, 21, 6, 184, + 33, 5, 146, 29, 244, 245, 107, 28, 112, 75, 216, 235, 231, 56, 224, 143, + 39, 142, 245, 195, 93, 111, 154, 15, 21, 110, 230, 53, 145, 175, 101, 39, + 246, 36, 190, 150, 24, 7, 23, 60, 31, 39, 60, 175, 70, 57, 198, 230, + 104, 246, 90, 108, 78, 186, 200, 239, 250, 201, 224, 183, 17, 207, 186, 113, + 110, 58, 49, 38, 11, 84, 79, 75, 97, 246, 115, 164, 167, 50, 164, 66, + 18, 127, 87, 211, 126, 102, 82, 62, 154, 67, 159, 138, 61, 104, 103, 66, + 79, 67, 223, 138, 80, 56, 45, 182, 121, 238, 136, 235, 14, 22, 153, 12, + 164, 26, 204, 68, 106, 140, 38, 42, 244, 209, 227, 59, 82, 99, 251, 98, + 65, 26, 226, 67, 91, 34, 63, 154, 225, 190, 69, 123, 110, 43, 161, 220, + 234, 193, 156, 169, 97, 223, 4, 112, 173, 203, 14, 236, 139, 63, 207, 242, + 135, 220, 230, 59, 238, 231, 71, 95, 230, 249, 187, 204, 61, 49, 205, 77, + 124, 199, 5, 115, 200, 62, 178, 204, 239, 245, 73, 192, 51, 79, 192, 62, + 77, 31, 113, 193, 234, 99, 146, 242, 183, 2, 229, 175, 115, 180, 165, 122, + 178, 239, 183, 140, 209, 54, 220, 143, 26, 173, 157, 122, 192, 173, 42, 152, + 143, 18, 169, 237, 116, 224, 182, 152, 7, 194, 130, 199, 170, 208, 159, 131, + 212, 183, 246, 200, 183, 126, 81, 207, 171, 9, 76, 85, 1, 183, 203, 33, + 215, 61, 129, 87, 141, 62, 100, 197, 158, 39, 85, 14, 43, 233, 38, 40, + 137, 70, 243, 27, 204, 7, 89, 9, 128, 96, 238, 31, 140, 157, 217, 12, + 92, 191, 129, 58, 18, 24, 93, 151, 36, 188, 103, 28, 89, 113, 124, 121, + 55, 230, 129, 215, 191, 89, 118, 162, 107, 150, 231, 1, 87, 184, 125, 66, + 148, 29, 203, 215, 5, 139, 243, 6, 75, 154, 11, 189, 153, 114, 188, 231, + 97, 204, 235, 18, 141, 137, 57, 164, 139, 102, 164, 147, 26, 153, 219, 90, + 168, 176, 248, 53, 22, 169, 175, 125, 130, 94, 147, 109, 168, 103, 3, 246, + 154, 173, 86, 219, 95, 2, 159, 81, 152, 239, 255, 216, 131, 95, 251, 23, + 45, 161, 55, 24, 88, 145, 247, 242, 138, 245, 8, 223, 240, 21, 3, 212, + 246, 60, 164, 155, 172, 166, 248, 226, 22, 9, 67, 39, 88, 55, 129, 221, + 116, 130, 133, 76, 24, 4, 102, 88, 241, 15, 88, 66, 178, 236, 58, 127, + 197, 246, 1, 140, 61, 251, 60, 15, 104, 216, 108, 39, 157, 177, 159, 235, + 18, 31, 225, 121, 224, 97, 122, 139, 125, 6, 32, 31, 38, 76, 11, 58, + 44, 63, 213, 65, 138, 139, 30, 40, 63, 7, 66, 100, 237, 115, 254, 144, + 172, 200, 148, 98, 106, 101, 108, 255, 2, 36, 89, 109, 161, 98, 236, 155, + 75, 228, 241, 69, 149, 132, 194, 173, 48, 209, 253, 156, 87, 246, 100, 35, + 110, 52, 232, 72, 255, 142, 5, 255, 213, 97, 127, 61, 133, 117, 121, 93, + 120, 190, 180, 141, 39, 96, 236, 141, 33, 170, 51, 100, 196, 140, 73, 147, + 202, 12, 248, 59, 121, 241, 254, 37, 62, 209, 90, 158, 74, 125, 9, 121, + 71, 174, 44, 109, 192, 76, 247, 121, 154, 25, 29, 218, 229, 78, 17, 86, + 129, 244, 14, 167, 171, 20, 34, 70, 127, 201, 11, 143, 41, 57, 114, 228, + 233, 231, 59, 237, 198, 247, 38, 237, 234, 26, 153, 108, 34, 46, 82, 48, + 244, 248, 219, 243, 57, 231, 54, 29, 206, 6, 241, 32, 9, 4, 114, 106, + 2, 165, 30, 23, 133, 159, 142, 172, 98, 5, 173, 141, 98, 18, 81, 143, + 188, 46, 75, 207, 188, 243, 120, 185, 175, 250, 144, 189, 203, 145, 137, 38, + 86, 192, 80, 165, 178, 57, 93, 43, 5, 126, 138, 168, 153, 190, 104, 112, + 83, 227, 217, 106, 36, 141, 51, 26, 137, 124, 31, 85, 223, 196, 81, 32, + 137, 45, 253, 21, 187, 33, 156, 95, 12, 82, 168, 205, 130, 195, 175, 94, + 162, 175, 66, 66, 52, 34, 157, 82, 178, 92, 55, 14, 235, 35, 190, 154, + 67, 134, 68, 32, 30, 27, 124, 120, 171, 208, 204, 87, 80, 171, 22, 44, + 98, 213, 191, 239, 206, 109, 123, 155, 254, 200, 112, 205, 40, 96, 149, 152, + 11, 198, 245, 32, 198, 15, 233, 14, 104, 8, 176, 99, 72, 38, 52, 203, + 9, 196, 167, 72, 74, 27, 201, 236, 42, 63, 195, 108, 83, 201, 231, 135, + 238, 125, 45, 14, 236, 167, 74, 190, 88, 60, 21, 57, 64, 192, 68, 238, + 99, 167, 74, 169, 164, 34, 133, 145, 221, 188, 96, 245, 189, 99, 194, 22, + 128, 160, 182, 7, 32, 24, 74, 121, 202, 19, 73, 135, 116, 116, 121, 197, + 169, 214, 177, 37, 239, 115, 85, 37, 73, 245, 119, 104, 125, 83, 154, 89, + 19, 57, 82, 48, 18, 235, 192, 195, 209, 202, 204, 46, 112, 143, 231, 210, + 32, 47, 113, 240, 29, 53, 146, 209, 94, 122, 236, 143, 22, 37, 20, 112, + 249, 70, 185, 59, 57, 173, 154, 175, 220, 125, 235, 192, 139, 26, 223, 71, + 32, 181, 135, 182, 119, 41, 254, 69, 97, 219, 212, 109, 82, 96, 209, 29, + 138, 27, 200, 160, 68, 233, 139, 26, 141, 26, 185, 67, 238, 103, 6, 36, + 225, 83, 235, 161, 143, 40, 34, 86, 9, 82, 109, 157, 108, 88, 174, 52, + 234, 77, 154, 31, 226, 116, 89, 114, 226, 194, 161, 87, 245, 170, 49, 200, + 23, 245, 222, 191, 177, 59, 242, 154, 245, 85, 134, 89, 239, 19, 223, 65, + 240, 2, 26, 67, 80, 48, 124, 247, 35, 40, 159, 161, 14, 58, 176, 42, + 19, 129, 95, 0, 27, 87, 242, 152, 147, 75, 27, 244, 130, 186, 138, 231, + 39, 88, 160, 25, 147, 111, 148, 42, 56, 74, 92, 13, 132, 166, 66, 223, + 191, 47, 248, 195, 39, 72, 171, 181, 175, 59, 92, 131, 86, 167, 217, 107, + 182, 34, 32, 102, 78, 238, 117, 224, 25, 112, 201, 98, 199, 38, 33, 203, + 206, 98, 115, 224, 44, 192, 0, 197, 74, 72, 19, 92, 113, 48, 51, 34, + 215, 110, 116, 149, 73, 74, 37, 1, 235, 187, 175, 116, 144, 176, 209, 222, + 203, 240, 229, 103, 102, 79, 143, 206, 149, 166, 10, 108, 111, 146, 67, 157, + 187, 2, 142, 7, 74, 230, 65, 164, 120, 187, 225, 223, 134, 58, 148, 168, + 72, 191, 57, 33, 8, 21, 52, 115, 178, 228, 52, 193, 186, 210, 14, 123, + 240, 117, 225, 175, 228, 36, 83, 35, 59, 96, 105, 151, 68, 186, 87, 61, + 61, 90, 99, 81, 253, 24, 71, 125, 189, 10, 101, 85, 173, 121, 119, 140, + 208, 134, 132, 107, 255, 12, 164, 191, 13, 62, 120, 204, 221, 130, 210, 65, + 79, 109, 146, 104, 231, 45, 141, 88, 180, 105, 255, 236, 218, 213, 164, 175, + 31, 250, 196, 14, 154, 234, 23, 212, 251, 172, 203, 217, 68, 150, 92, 254, + 62, 118, 193, 218, 109, 42, 87, 248, 79, 1, 0, 164, 217, 177, 120, 189, + 3, 128, 26, 57, 9, 124, 10, 108, 158, 65, 238, 71, 134, 18, 237, 179, + 61, 206, 128, 16, 190, 123, 59, 72, 141, 238, 159, 6, 94, 61, 249, 144, + 111, 160, 162, 176, 44, 219, 7, 146, 167, 184, 27, 51, 201, 83, 142, 21, + 8, 145, 244, 0, 232, 0, 33, 50, 173, 108, 24, 99, 170, 255, 89, 50, + 63, 242, 84, 155, 31, 91, 239, 201, 167, 10, 24, 67, 245, 141, 93, 10, + 240, 224, 174, 10, 0, 224, 24, 109, 82, 227, 43, 184, 54, 237, 221, 59, + 253, 102, 190, 211, 187, 167, 154, 175, 7, 72, 194, 56, 70, 54, 220, 161, + 40, 59, 162, 134, 124, 175, 27, 163, 73, 179, 217, 82, 20, 216, 64, 63, + 216, 107, 35, 127, 235, 1, 130, 44, 65, 222, 7, 198, 214, 158, 166, 212, + 153, 11, 167, 132, 156, 153, 30, 108, 206, 159, 61, 187, 59, 47, 249, 153, + 144, 231, 123, 25, 80, 204, 88, 31, 146, 219, 107, 15, 115, 95, 228, 197, + 145, 255, 94, 170, 44, 254, 128, 98, 183, 111, 235, 95, 44, 185, 175, 249, + 178, 126, 160, 23, 41, 255, 105, 198, 245, 255, 40, 154, 252, 231, 168, 255, + 196, 92, 95, 91, 149, 79, 127, 38, 63, 255, 21, 247, 155, 146, 252, 63, + 164, 255, 249, 222, 211, 159, 52, 253, 203, 223, 184, 63, 143, 247, 253, 167, + 145, 29, 255, 94, 68, 203, 180, 255, 68, 180, 47, 236, 220, 127, 253, 64, + 255, 254, 222, 255, 247, 2, 189, 24, 136, 142, 90, 136, 142, 155, 138, 142, + 89, 136, 79, 88, 137, 206, 171, 214, 25, 141, 82, 133, 68, 54, 234, 143, + 32, 179, 136, 160, 180, 6, 47, 15, 63, 74, 65, 12, 81, 109, 62, 146, + 206, 4, 146, 222, 40, 130, 4, 57, 178, 69, 35, 130, 20, 92, 139, 46, + 22, 162, 52, 68, 156, 210, 191, 199, 112, 143, 32, 131, 133, 108, 48, 140, + 32, 193, 239, 255, 112, 32, 106, 204, 35, 105, 206, 32, 155, 54, 193, 41, + 163, 52, 25, 65, 216, 75, 110, 89, 75, 44, 155, 139, 205, 34, 105, 79, + 186, 72, 140, 35, 219, 54, 33, 155, 55, 116, 233, 227, 6, 153, 98, 86, + 107, 162, 229, 171, 2, 36, 171, 66, 199, 41, 136, 187, 75, 29, 217, 139, + 77, 162, 5, 142, 47, 91, 24, 207, 89, 19, 245, 53, 67, 12, 54, 194, + 173, 215, 194, 132, 83, 71, 43, 83, 71, 65, 144, 16, 140, 48, 133, 201, + 80, 144, 41, 211, 223, 22, 160, 10, 238, 36, 129, 223, 84, 124, 8, 53, + 96, 30, 45, 116, 50, 89, 106, 18, 217, 164, 9, 246, 61, 78, 80, 66, + 170, 208, 4, 200, 81, 133, 41, 214, 132, 206, 211, 132, 232, 141, 83, 226, + 149, 65, 162, 21, 126, 17, 228, 191, 130, 192, 57, 80, 184, 136, 205, 14, + 104, 79, 161, 121, 76, 32, 91, 140, 251, 200, 142, 23, 43, 140, 162, 56, + 12, 109, 217, 145, 76, 89, 18, 77, 91, 226, 192, 123, 97, 180, 27, 161, + 5, 152, 161, 116, 27, 8, 33, 74, 193, 34, 74, 136, 102, 170, 3, 251, + 85, 124, 152, 179, 224, 65, 116, 224, 68, 144, 219, 142, 22, 65, 117, 150, + 90, 65, 247, 153, 66, 212, 81, 110, 208, 67, 42, 84, 133, 223, 108, 8, + 119, 96, 7, 83, 163, 15, 3, 37, 33, 17, 108, 6, 82, 162, 34, 156, + 170, 192, 190, 235, 240, 234, 35, 119, 4, 37, 115, 237, 38, 119, 37, 40, + 115, 37, 44, 115, 82, 43, 121, 18, 169, 188, 246, 194, 118, 241, 175, 204, + 18, 162, 10, 174, 143, 220, 142, 187, 228, 230, 138, 228, 6, 162, 201, 42, + 170, 203, 172, 145, 248, 244, 187, 199, 212, 133, 203, 212, 129, 242, 84, 128, + 249, 228, 154, 237, 68, 138, 234, 196, 145, 29, 73, 95, 19, 61, 36, 103, + 204, 1, 77, 76, 100, 91, 212, 95, 224, 127, 227, 10, 224, 214, 17, 230, + 85, 25, 22, 197, 14, 178, 195, 24, 34, 87, 69, 168, 67, 235, 127, 165, + 206, 223, 154, 237, 111, 190, 198, 111, 138, 226, 239, 156, 202, 167, 168, 194, + 231, 174, 12, 231, 47, 64, 102, 183, 230, 219, 132, 203, 83, 129, 10, 147, + 31, 185, 251, 72, 134, 135, 137, 170, 183, 33, 18, 215, 207, 158, 103, 55, + 170, 123, 255, 124, 54, 81, 188, 86, 71, 148, 86, 90, 223, 186, 1, 73, + 44, 35, 25, 15, 248, 21, 155, 22, 18, 159, 168, 209, 29, 23, 80, 28, + 159, 87, 29, 67, 117, 29, 69, 50, 25, 234, 163, 53, 116, 169, 219, 192, + 199, 164, 241, 214, 22, 1, 193, 10, 231, 200, 66, 115, 212, 20, 115, 200, + 29, 227, 213, 65, 249, 175, 26, 82, 144, 33, 204, 188, 62, 20, 156, 59, + 248, 182, 62, 248, 177, 42, 56, 162, 50, 48, 146, 14, 127, 100, 171, 135, + 97, 217, 191, 7, 27, 158, 59, 197, 159, 115, 27, 174, 6, 181, 47, 68, + 5, 166, 59, 9, 194, 89, 213, 235, 116, 5, 234, 209, 119, 131, 40, 156, + 124, 72, 221, 27, 55, 11, 63, 62, 123, 21, 26, 120, 168, 158, 59, 127, + 20, 55, 194, 165, 214, 121, 181, 34, 163, 216, 14, 188, 107, 12, 236, 57, + 205, 192, 4, 77, 141, 122, 127, 250, 49, 153, 40, 214, 30, 111, 210, 25, + 27, 122, 211, 186, 26, 97, 94, 24, 168, 252, 6, 238, 209, 134, 26, 150, + 134, 28, 119, 7, 189, 181, 16, 126, 214, 4, 106, 86, 3, 122, 119, 96, + 95, 148, 120, 170, 147, 187, 251, 114, 187, 94, 53, 185, 70, 144, 161, 88, + 148, 60, 63, 179, 33, 123, 123, 179, 195, 82, 65, 204, 147, 88, 236, 49, + 64, 159, 150, 88, 41, 20, 65, 202, 17, 159, 135, 243, 29, 187, 215, 30, + 65, 112, 104, 130, 51, 105, 172, 113, 28, 171, 251, 99, 103, 15, 247, 31, + 4, 139, 7, 78, 246, 18, 108, 106, 57, 100, 154, 17, 57, 82, 109, 141, + 251, 101, 177, 150, 106, 21, 13, 38, 25, 170, 172, 111, 213, 167, 217, 76, + 202, 108, 187, 86, 105, 182, 157, 69, 187, 238, 101, 36, 131, 108, 242, 149, + 114, 217, 240, 119, 156, 253, 236, 198, 47, 9, 72, 147, 249, 204, 66, 113, + 124, 170, 97, 56, 208, 195, 56, 202, 132, 154, 221, 103, 214, 96, 118, 227, + 171, 15, 70, 162, 205, 144, 210, 116, 204, 158, 178, 220, 92, 208, 10, 75, + 26, 106, 184, 247, 254, 249, 110, 254, 170, 153, 246, 100, 3, 136, 64, 79, + 156, 56, 217, 114, 205, 208, 254, 184, 30, 129, 71, 160, 179, 41, 161, 248, + 151, 208, 153, 151, 93, 67, 232, 176, 4, 6, 172, 7, 245, 116, 78, 113, + 48, 172, 238, 129, 211, 103, 141, 191, 234, 209, 206, 36, 223, 57, 97, 153, + 230, 42, 207, 43, 6, 91, 26, 110, 37, 218, 108, 13, 22, 69, 66, 171, + 99, 160, 207, 103, 80, 231, 40, 25, 208, 254, 161, 82, 186, 100, 81, 27, + 57, 206, 118, 199, 222, 185, 234, 221, 179, 247, 158, 93, 34, 109, 138, 213, + 7, 4, 255, 115, 83, 4, 151, 155, 216, 228, 40, 33, 193, 162, 128, 138, + 43, 30, 15, 21, 147, 231, 125, 177, 89, 9, 62, 84, 130, 118, 192, 127, + 54, 87, 121, 25, 109, 158, 106, 194, 19, 251, 28, 118, 119, 186, 143, 140, + 152, 124, 175, 158, 25, 119, 177, 150, 28, 57, 84, 172, 214, 169, 49, 61, + 121, 117, 109, 90, 144, 35, 235, 137, 177, 68, 182, 201, 190, 64, 217, 14, + 227, 197, 1, 227, 227, 50, 87, 121, 43, 199, 178, 65, 110, 231, 232, 136, + 160, 98, 189, 34, 2, 211, 31, 23, 161, 193, 152, 181, 212, 40, 99, 6, + 233, 2, 168, 215, 178, 137, 44, 18, 17, 66, 206, 29, 49, 147, 31, 193, + 129, 148, 103, 90, 18, 200, 199, 59, 48, 87, 112, 161, 44, 178, 248, 112, + 38, 31, 23, 34, 158, 6, 183, 194, 68, 95, 204, 154, 140, 194, 213, 180, + 67, 62, 144, 62, 155, 55, 122, 97, 192, 25, 204, 124, 31, 233, 224, 173, + 215, 7, 232, 41, 99, 212, 23, 92, 3, 88, 84, 188, 181, 221, 179, 222, + 102, 229, 218, 145, 245, 178, 165, 191, 53, 196, 9, 246, 102, 86, 39, 252, + 48, 174, 243, 47, 177, 222, 102, 67, 222, 177, 99, 58, 225, 117, 44, 159, + 110, 149, 193, 96, 248, 132, 188, 98, 117, 186, 165, 2, 188, 142, 3, 219, + 139, 248, 140, 166, 115, 41, 15, 91, 114, 237, 191, 246, 41, 105, 112, 125, + 64, 63, 118, 249, 22, 132, 231, 174, 98, 252, 145, 79, 243, 8, 64, 105, + 32, 47, 67, 71, 92, 14, 171, 195, 58, 4, 167, 251, 17, 61, 72, 101, + 166, 183, 249, 217, 75, 252, 179, 101, 53, 48, 113, 195, 198, 247, 116, 241, + 39, 33, 4, 62, 126, 127, 135, 232, 182, 114, 223, 161, 96, 65, 20, 178, + 213, 251, 67, 230, 138, 187, 27, 79, 159, 2, 143, 104, 92, 149, 40, 51, + 125, 111, 22, 18, 195, 4, 177, 238, 55, 154, 220, 155, 24, 208, 190, 198, + 195, 184, 164, 88, 248, 46, 118, 201, 54, 79, 161, 242, 253, 78, 64, 109, + 168, 64, 236, 173, 112, 106, 0, 252, 233, 197, 153, 39, 248, 210, 92, 91, + 128, 187, 85, 253, 61, 177, 17, 192, 209, 210, 188, 169, 42, 195, 33, 181, + 127, 87, 165, 127, 66, 253, 85, 135, 214, 151, 255, 166, 170, 111, 29, 10, + 135, 231, 91, 0, 209, 241, 217, 18, 235, 248, 133, 169, 72, 244, 111, 119, + 170, 201, 112, 202, 218, 245, 67, 232, 122, 51, 227, 43, 129, 55, 134, 222, + 66, 101, 246, 157, 61, 134, 202, 196, 212, 235, 151, 248, 94, 212, 19, 234, + 200, 219, 39, 71, 212, 142, 115, 163, 140, 244, 173, 221, 45, 204, 158, 31, + 206, 235, 137, 167, 67, 84, 244, 213, 107, 64, 4, 200, 129, 61, 36, 252, + 210, 10, 200, 1, 49, 189, 100, 247, 250, 165, 16, 62, 212, 96, 206, 0, + 124, 234, 179, 131, 165, 173, 244, 216, 249, 107, 150, 195, 8, 67, 47, 152, + 222, 61, 242, 51, 145, 223, 145, 244, 136, 250, 69, 114, 239, 34, 24, 22, + 13, 80, 102, 240, 149, 190, 187, 98, 156, 226, 240, 182, 226, 186, 117, 114, + 55, 6, 206, 40, 36, 151, 58, 33, 98, 23, 222, 19, 221, 253, 138, 191, + 142, 57, 22, 11, 14, 180, 191, 158, 112, 8, 18, 13, 40, 30, 50, 187, + 53, 200, 174, 65, 40, 152, 62, 21, 9, 226, 155, 90, 59, 194, 22, 4, + 26, 187, 59, 27, 155, 248, 102, 217, 235, 182, 68, 53, 31, 198, 3, 81, + 13, 22, 121, 141, 120, 244, 69, 129, 34, 64, 14, 13, 51, 83, 14, 41, + 48, 226, 0, 79, 108, 151, 149, 37, 131, 28, 80, 136, 48, 67, 107, 123, + 209, 53, 131, 146, 48, 65, 116, 39, 182, 166, 26, 111, 202, 120, 94, 242, + 197, 183, 25, 86, 136, 76, 104, 236, 116, 149, 220, 112, 93, 53, 254, 124, + 237, 125, 134, 238, 80, 228, 28, 212, 34, 127, 192, 236, 137, 212, 169, 83, + 151, 232, 231, 172, 99, 145, 220, 171, 202, 103, 213, 247, 22, 187, 162, 148, + 194, 78, 238, 211, 153, 4, 195, 207, 42, 203, 220, 151, 195, 104, 102, 250, + 190, 54, 156, 115, 36, 225, 88, 34, 248, 55, 227, 9, 118, 232, 173, 218, + 251, 64, 42, 72, 131, 47, 48, 188, 34, 71, 152, 237, 248, 93, 55, 215, + 105, 87, 150, 138, 43, 33, 132, 85, 138, 170, 213, 116, 190, 18, 47, 213, + 117, 1, 131, 35, 60, 36, 208, 77, 236, 227, 45, 114, 125, 26, 16, 44, + 103, 54, 253, 48, 172, 108, 99, 64, 1, 82, 69, 44, 68, 91, 112, 195, + 214, 207, 129, 241, 87, 74, 141, 216, 18, 231, 116, 67, 87, 71, 176, 233, + 143, 30, 188, 150, 87, 230, 186, 1, 222, 30, 242, 229, 139, 126, 249, 162, + 36, 245, 122, 144, 202, 252, 246, 249, 118, 34, 60, 95, 8, 112, 80, 97, + 43, 209, 153, 225, 239, 146, 66, 233, 82, 106, 233, 102, 177, 88, 211, 252, + 8, 72, 187, 74, 129, 37, 233, 183, 54, 225, 180, 60, 13, 149, 185, 238, + 165, 194, 240, 7, 201, 95, 149, 253, 160, 4, 175, 175, 11, 204, 126, 85, + 161, 79, 5, 199, 65, 108, 207, 109, 34, 182, 79, 12, 203, 139, 252, 172, + 185, 220, 203, 144, 74, 136, 87, 46, 2, 182, 208, 94, 179, 193, 248, 216, + 97, 215, 243, 82, 21, 232, 219, 63, 86, 10, 60, 25, 11, 211, 52, 155, + 232, 66, 4, 112, 91, 153, 90, 207, 80, 190, 41, 173, 244, 21, 60, 176, + 122, 141, 109, 8, 95, 16, 34, 92, 177, 150, 170, 33, 102, 248, 49, 140, + 250, 80, 152, 234, 150, 59, 44, 224, 100, 52, 46, 142, 111, 247, 33, 234, + 52, 221, 145, 13, 192, 69, 163, 223, 207, 63, 200, 73, 73, 150, 139, 177, + 75, 43, 149, 101, 249, 175, 255, 250, 135, 230, 135, 100, 157, 254, 91, 52, + 255, 131, 160, 237, 207, 26, 69, 127, 6, 49, 255, 5, 213, 8, 184, 253, + 181, 28, 210, 191, 45, 197, 244, 47, 127, 67, 192, 127, 226, 233, 127, 172, + 149, 244, 215, 160, 138, 127, 159, 158, 98, 241, 159, 123, 138, 73, 215, 91, + 136, 191, 184, 26, 250, 139, 171, 95, 191, 35, 252, 24, 18, 249, 1, 38, + 89, 73, 116, 59, 201, 127, 186, 119, 254, 4, 70, 189, 84, 90, 122, 125, + 49, 139, 106, 55, 43, 6, 114, 218, 27, 183, 56, 107, 182, 240, 5, 75, + 215, 145, 150, 233, 43, 40, 108, 47, 129, 104, 161, 179, 229, 35, 129, 108, + 173, 48, 110, 165, 214, 223, 74, 172, 147, 111, 92, 57, 208, 84, 145, 244, + 93, 6, 216, 117, 154, 220, 154, 133, 137, 36, 187, 141, 210, 124, 75, 205, + 233, 10, 177, 62, 97, 249, 150, 10, 159, 194, 70, 255, 66, 190, 37, 85, + 209, 118, 86, 139, 60, 177, 221, 252, 188, 186, 2, 238, 60, 172, 52, 172, + 108, 136, 254, 36, 16, 204, 44, 119, 249, 106, 207, 130, 64, 12, 9, 72, + 111, 221, 197, 222, 120, 100, 154, 248, 94, 55, 251, 88, 213, 7, 217, 168, + 6, 89, 168, 148, 92, 206, 144, 59, 78, 107, 1, 75, 118, 134, 14, 150, + 42, 55, 150, 26, 191, 39, 147, 42, 168, 35, 201, 215, 202, 207, 198, 192, + 142, 70, 199, 15, 159, 150, 69, 210, 200, 227, 126, 47, 255, 143, 135, 212, + 132, 171, 98, 163, 151, 88, 111, 142, 84, 167, 179, 88, 135, 149, 93, 43, + 88, 79, 179, 128, 81, 115, 47, 179, 113, 162, 101, 83, 190, 75, 125, 240, + 131, 34, 190, 13, 181, 179, 41, 213, 10, 155, 217, 96, 247, 169, 59, 200, + 155, 215, 151, 78, 146, 251, 111, 221, 115, 117, 165, 35, 226, 213, 44, 9, + 201, 186, 24, 120, 107, 88, 154, 233, 80, 230, 75, 46, 39, 75, 78, 126, + 201, 54, 58, 168, 244, 130, 127, 235, 244, 144, 107, 141, 82, 108, 73, 84, + 95, 255, 239, 219, 148, 101, 219, 84, 105, 95, 31, 2, 183, 160, 46, 178, + 110, 183, 169, 138, 111, 70, 69, 37, 120, 54, 8, 97, 170, 212, 78, 202, + 45, 90, 114, 95, 232, 100, 169, 57, 189, 21, 99, 109, 233, 60, 109, 80, + 19, 79, 118, 61, 26, 124, 29, 19, 83, 59, 40, 43, 41, 208, 51, 169, + 175, 70, 217, 155, 54, 209, 45, 19, 239, 193, 108, 201, 33, 126, 141, 147, + 97, 63, 26, 18, 36, 251, 248, 125, 232, 166, 132, 239, 248, 23, 219, 145, + 163, 222, 242, 103, 167, 217, 162, 184, 201, 34, 174, 48, 195, 175, 112, 151, + 191, 80, 208, 173, 64, 48, 172, 118, 166, 176, 186, 183, 16, 26, 220, 125, + 211, 131, 152, 81, 252, 148, 206, 246, 51, 121, 6, 126, 219, 208, 163, 199, + 153, 173, 203, 174, 165, 165, 244, 146, 145, 212, 249, 5, 219, 85, 13, 183, + 36, 41, 29, 79, 137, 60, 33, 6, 147, 94, 222, 78, 1, 223, 65, 110, + 110, 149, 3, 167, 91, 110, 242, 6, 21, 51, 35, 63, 50, 12, 118, 76, + 51, 25, 13, 55, 77, 84, 227, 52, 124, 161, 17, 161, 12, 9, 94, 118, + 165, 111, 83, 205, 231, 88, 137, 3, 33, 201, 203, 28, 185, 115, 11, 5, + 178, 226, 183, 62, 8, 83, 43, 64, 140, 131, 18, 210, 243, 220, 117, 179, + 116, 69, 227, 22, 198, 163, 64, 184, 77, 148, 143, 125, 124, 139, 250, 207, + 160, 249, 70, 155, 108, 235, 33, 104, 157, 180, 108, 153, 146, 104, 57, 200, + 109, 190, 148, 105, 126, 109, 111, 138, 107, 107, 6, 161, 111, 106, 211, 169, + 47, 224, 81, 111, 27, 176, 10, 23, 180, 18, 254, 188, 34, 53, 121, 37, + 77, 123, 113, 87, 99, 62, 95, 184, 124, 25, 144, 44, 80, 164, 180, 248, + 219, 100, 215, 53, 23, 131, 67, 131, 50, 123, 83, 145, 88, 163, 121, 77, + 13, 233, 86, 53, 219, 100, 65, 153, 106, 169, 78, 97, 169, 0, 67, 41, + 40, 99, 209, 76, 57, 33, 201, 105, 254, 98, 162, 140, 246, 17, 174, 74, + 237, 4, 234, 113, 24, 92, 172, 80, 78, 151, 32, 58, 81, 63, 82, 91, + 95, 70, 78, 207, 128, 206, 115, 231, 220, 99, 226, 240, 13, 77, 8, 61, + 245, 208, 61, 213, 87, 157, 5, 123, 29, 216, 232, 173, 39, 161, 173, 219, + 46, 173, 40, 213, 133, 41, 222, 133, 91, 4, 133, 16, 67, 117, 253, 130, + 235, 149, 43, 212, 10, 100, 213, 68, 130, 86, 23, 22, 214, 240, 85, 47, + 214, 29, 78, 164, 251, 150, 177, 126, 159, 113, 253, 148, 62, 132, 149, 106, + 119, 149, 138, 48, 24, 35, 254, 199, 40, 124, 2, 203, 118, 58, 227, 247, + 41, 144, 255, 63, 252, 15, 12, 39, 237, 250, 203, 159, 12, 6, 35, 201, + 98, 57, 87, 87, 55, 8, 68, 218, 47, 136, 176, 233, 245, 225, 185, 68, + 209, 166, 222, 241, 161, 169, 22, 20, 169, 31, 109, 245, 234, 250, 37, 143, + 247, 209, 212, 49, 43, 55, 199, 46, 59, 59, 119, 178, 64, 228, 83, 76, + 143, 128, 180, 242, 219, 250, 138, 236, 131, 188, 97, 16, 16, 8, 64, 174, + 175, 241, 5, 243, 227, 192, 0, 227, 7, 20, 4, 204, 10, 99, 12, 212, + 96, 236, 105, 154, 11, 105, 93, 120, 211, 145, 66, 215, 38, 139, 147, 112, + 39, 147, 46, 77, 210, 128, 209, 16, 144, 95, 232, 229, 117, 76, 253, 244, + 49, 75, 103, 37, 203, 18, 164, 232, 143, 164, 52, 40, 196, 25, 247, 159, + 85, 203, 218, 209, 192, 84, 218, 108, 219, 74, 174, 197, 95, 34, 8, 217, + 151, 230, 167, 44, 11, 196, 104, 148, 73, 74, 133, 165, 57, 206, 148, 91, + 10, 143, 38, 209, 145, 245, 121, 13, 198, 29, 95, 186, 50, 0, 74, 239, + 224, 149, 51, 229, 127, 238, 76, 250, 3, 104, 179, 123, 200, 72, 17, 29, + 7, 135, 217, 118, 108, 230, 157, 104, 74, 126, 184, 225, 96, 160, 21, 243, + 21, 61, 172, 190, 27, 66, 134, 36, 91, 238, 110, 199, 204, 180, 106, 233, + 120, 48, 155, 42, 240, 57, 134, 1, 49, 186, 245, 106, 190, 57, 209, 0, + 56, 186, 155, 236, 13, 50, 252, 148, 150, 223, 106, 198, 217, 231, 99, 192, + 73, 204, 36, 105, 225, 220, 121, 27, 177, 214, 175, 42, 25, 221, 42, 145, + 244, 2, 179, 22, 154, 126, 17, 86, 89, 94, 156, 22, 48, 242, 72, 213, + 186, 119, 132, 201, 93, 95, 190, 243, 189, 93, 147, 119, 239, 1, 192, 192, + 183, 247, 20, 109, 219, 51, 12, 214, 106, 73, 203, 72, 200, 180, 238, 140, + 159, 128, 49, 206, 162, 100, 1, 129, 206, 250, 6, 248, 168, 87, 142, 238, + 189, 248, 104, 197, 216, 138, 45, 159, 5, 21, 153, 212, 168, 89, 17, 121, + 115, 163, 181, 85, 244, 246, 249, 251, 113, 250, 102, 138, 239, 113, 252, 42, + 226, 171, 30, 4, 73, 141, 181, 231, 65, 127, 249, 170, 10, 19, 222, 72, + 224, 169, 20, 233, 193, 61, 204, 112, 232, 92, 112, 111, 90, 82, 111, 46, + 240, 151, 28, 206, 54, 100, 217, 250, 61, 90, 187, 78, 29, 183, 83, 213, + 170, 2, 74, 132, 54, 237, 70, 52, 126, 94, 94, 155, 101, 138, 114, 106, + 239, 188, 202, 83, 102, 105, 163, 251, 217, 120, 77, 106, 52, 77, 219, 63, + 69, 38, 246, 87, 55, 69, 40, 30, 7, 184, 127, 56, 82, 168, 77, 63, + 99, 98, 58, 121, 234, 216, 10, 134, 6, 245, 179, 191, 182, 129, 11, 53, + 137, 141, 246, 109, 177, 17, 232, 139, 171, 248, 126, 220, 130, 192, 204, 213, + 149, 37, 94, 116, 84, 86, 104, 155, 235, 65, 166, 67, 242, 202, 208, 107, + 45, 245, 248, 62, 150, 41, 195, 226, 189, 60, 203, 104, 255, 48, 233, 54, + 121, 98, 173, 17, 26, 95, 212, 15, 236, 23, 187, 82, 49, 33, 150, 64, + 98, 189, 47, 36, 10, 104, 165, 71, 142, 209, 188, 61, 103, 173, 121, 43, + 173, 252, 206, 79, 32, 82, 156, 7, 131, 65, 120, 48, 217, 147, 174, 79, + 190, 147, 154, 96, 131, 153, 223, 151, 253, 187, 35, 137, 82, 227, 12, 67, + 16, 187, 53, 76, 31, 133, 194, 144, 22, 82, 25, 10, 11, 128, 140, 192, + 1, 13, 228, 45, 77, 47, 191, 233, 150, 168, 204, 150, 146, 32, 191, 250, + 61, 183, 88, 126, 181, 158, 72, 253, 77, 137, 128, 92, 11, 60, 201, 172, + 233, 70, 223, 62, 187, 16, 66, 79, 93, 23, 64, 124, 79, 120, 46, 92, + 191, 216, 114, 57, 220, 53, 39, 126, 32, 37, 29, 150, 203, 135, 80, 99, + 58, 34, 33, 52, 246, 136, 252, 244, 37, 60, 207, 31, 193, 158, 191, 181, + 242, 102, 136, 250, 153, 122, 88, 44, 211, 164, 244, 25, 30, 248, 162, 88, + 87, 151, 60, 72, 171, 10, 206, 127, 193, 90, 123, 82, 6, 7, 30, 15, + 80, 63, 142, 224, 200, 197, 116, 156, 7, 91, 186, 44, 164, 223, 172, 52, + 85, 177, 213, 91, 60, 38, 220, 31, 106, 23, 63, 203, 135, 180, 56, 168, + 1, 32, 136, 22, 221, 13, 140, 31, 121, 214, 110, 185, 86, 246, 160, 235, + 174, 240, 145, 43, 101, 228, 248, 88, 79, 40, 85, 254, 65, 139, 90, 210, + 55, 0, 205, 254, 87, 87, 32, 152, 9, 93, 217, 195, 108, 149, 155, 169, + 140, 185, 227, 114, 88, 64, 250, 109, 97, 12, 57, 124, 141, 81, 117, 216, + 71, 189, 213, 70, 124, 84, 84, 39, 161, 104, 114, 40, 178, 250, 213, 42, + 85, 122, 157, 222, 133, 28, 57, 121, 116, 113, 50, 83, 226, 246, 53, 151, + 217, 225, 147, 254, 213, 41, 109, 187, 158, 110, 201, 24, 29, 138, 226, 191, + 254, 223, 245, 74, 47, 241, 57, 229, 89, 29, 255, 199, 247, 195, 159, 117, + 41, 227, 41, 207, 255, 226, 217, 63, 83, 231, 254, 87, 251, 239, 139, 172, + 254, 153, 122, 248, 55, 43, 62, 157, 127, 236, 240, 247, 165, 194, 254, 203, + 159, 255, 19, 13, 125, 248, 7, 208, 6, 175, 5, 33, 190, 159, 2, 29, + 228, 63, 210, 243, 207, 246, 89, 39, 197, 185, 36, 179, 53, 59, 233, 169, + 144, 49, 235, 158, 33, 51, 111, 21, 100, 87, 229, 57, 59, 153, 113, 223, + 223, 25, 252, 83, 224, 193, 117, 244, 238, 89, 248, 226, 182, 239, 220, 186, + 87, 191, 233, 7, 18, 122, 203, 94, 106, 115, 194, 234, 227, 46, 178, 253, + 57, 222, 253, 140, 195, 224, 213, 61, 199, 233, 37, 215, 246, 110, 197, 206, + 192, 155, 98, 7, 132, 108, 11, 76, 33, 13, 12, 49, 157, 1, 123, 153, + 73, 71, 249, 113, 107, 137, 9, 224, 79, 1, 167, 239, 121, 131, 29, 0, + 228, 34, 208, 133, 204, 7, 220, 204, 175, 153, 212, 207, 205, 212, 183, 217, + 24, 150, 174, 168, 231, 126, 81, 119, 77, 129, 87, 109, 190, 103, 185, 174, + 39, 241, 54, 68, 254, 140, 54, 99, 12, 144, 34, 13, 150, 252, 232, 205, + 185, 40, 206, 218, 203, 206, 184, 42, 77, 89, 75, 246, 199, 250, 29, 8, + 133, 191, 70, 241, 62, 224, 238, 54, 14, 28, 248, 76, 71, 191, 81, 107, + 187, 110, 154, 199, 91, 67, 0, 65, 120, 196, 93, 80, 0, 85, 188, 205, + 101, 177, 199, 113, 149, 11, 189, 121, 11, 94, 212, 27, 114, 167, 29, 15, + 149, 165, 56, 131, 57, 1, 221, 105, 47, 229, 73, 39, 249, 201, 7, 232, + 192, 27, 240, 192, 203, 231, 192, 199, 199, 192, 55, 176, 128, 139, 251, 131, + 136, 68, 113, 44, 132, 14, 43, 91, 190, 125, 102, 64, 122, 243, 232, 135, + 143, 111, 237, 110, 211, 104, 106, 82, 175, 171, 87, 169, 168, 146, 171, 202, + 66, 108, 204, 71, 56, 111, 66, 42, 9, 224, 223, 152, 248, 24, 17, 122, + 93, 17, 112, 89, 231, 119, 22, 18, 112, 218, 107, 19, 175, 209, 101, 55, + 229, 77, 195, 166, 128, 149, 99, 181, 38, 172, 185, 226, 250, 150, 205, 162, + 180, 28, 103, 53, 223, 67, 105, 116, 24, 41, 240, 21, 62, 240, 11, 42, + 136, 244, 117, 176, 213, 235, 4, 8, 212, 128, 79, 228, 115, 155, 219, 126, + 179, 11, 224, 157, 253, 38, 157, 13, 177, 75, 67, 12, 141, 101, 236, 135, + 67, 180, 45, 165, 180, 65, 85, 184, 85, 201, 168, 97, 101, 72, 29, 217, + 0, 251, 213, 176, 197, 81, 48, 101, 49, 210, 173, 25, 162, 25, 1, 15, + 193, 9, 223, 17, 9, 28, 203, 201, 43, 141, 19, 94, 195, 162, 94, 39, + 99, 238, 167, 185, 222, 84, 122, 80, 102, 120, 80, 228, 250, 158, 228, 188, + 217, 19, 216, 109, 151, 216, 109, 164, 189, 105, 133, 52, 103, 37, 52, 39, + 4, 85, 134, 125, 203, 154, 71, 224, 131, 120, 43, 32, 156, 95, 69, 157, + 158, 159, 218, 125, 237, 40, 252, 5, 136, 16, 209, 62, 27, 166, 221, 218, + 186, 45, 2, 148, 85, 224, 240, 43, 34, 232, 23, 188, 141, 156, 216, 225, + 47, 87, 215, 43, 151, 148, 73, 21, 21, 138, 253, 188, 149, 172, 155, 102, + 70, 217, 166, 250, 55, 75, 62, 58, 134, 176, 219, 141, 16, 81, 133, 85, + 146, 136, 113, 91, 35, 191, 38, 22, 58, 53, 8, 242, 189, 19, 60, 198, + 235, 175, 247, 26, 186, 61, 234, 173, 37, 236, 190, 132, 237, 253, 194, 144, + 195, 146, 0, 218, 234, 160, 243, 6, 207, 253, 110, 90, 59, 241, 22, 152, + 113, 166, 27, 66, 58, 200, 69, 214, 243, 69, 244, 167, 98, 117, 167, 24, + 63, 6, 49, 124, 12, 164, 123, 195, 248, 41, 158, 27, 40, 150, 47, 112, + 200, 35, 248, 17, 174, 111, 14, 164, 103, 254, 164, 24, 48, 119, 96, 190, + 64, 196, 6, 151, 215, 15, 134, 64, 237, 78, 247, 236, 190, 31, 205, 112, + 192, 76, 78, 182, 20, 195, 71, 21, 151, 231, 47, 242, 224, 234, 253, 242, + 252, 204, 76, 170, 206, 15, 11, 82, 63, 203, 93, 45, 51, 241, 242, 42, + 156, 143, 242, 78, 55, 216, 133, 85, 211, 193, 175, 209, 228, 103, 210, 92, + 119, 152, 60, 246, 97, 252, 116, 163, 172, 231, 129, 108, 84, 2, 175, 166, + 240, 230, 251, 253, 58, 123, 240, 92, 20, 126, 116, 37, 126, 148, 69, 61, + 207, 70, 48, 9, 155, 221, 228, 6, 94, 79, 197, 94, 77, 70, 157, 122, + 235, 157, 52, 146, 53, 55, 252, 185, 133, 244, 176, 255, 232, 44, 190, 97, + 39, 242, 234, 216, 181, 28, 65, 249, 212, 192, 42, 242, 168, 30, 182, 158, + 40, 147, 9, 163, 183, 190, 246, 131, 72, 127, 165, 182, 189, 137, 250, 31, + 122, 65, 217, 175, 201, 150, 63, 195, 95, 254, 122, 31, 205, 9, 224, 202, + 167, 249, 164, 0, 32, 32, 250, 39, 79, 177, 231, 49, 40, 107, 69, 146, + 177, 54, 106, 244, 152, 32, 2, 58, 0, 36, 108, 170, 99, 211, 6, 7, + 251, 225, 187, 93, 153, 119, 166, 249, 219, 226, 180, 96, 87, 154, 47, 161, + 5, 252, 165, 254, 238, 97, 243, 208, 207, 249, 69, 54, 66, 150, 242, 94, + 147, 54, 196, 216, 137, 112, 4, 115, 227, 114, 143, 114, 181, 28, 118, 65, + 1, 133, 48, 51, 108, 191, 4, 38, 28, 48, 44, 71, 142, 7, 17, 17, + 183, 69, 227, 8, 2, 37, 102, 124, 3, 117, 67, 57, 185, 37, 194, 53, + 212, 40, 66, 144, 194, 245, 241, 112, 35, 244, 40, 236, 46, 165, 122, 157, + 91, 253, 199, 53, 35, 174, 55, 99, 43, 81, 138, 22, 253, 180, 220, 118, + 126, 16, 3, 114, 228, 194, 16, 233, 248, 105, 99, 223, 124, 241, 95, 227, + 21, 232, 68, 179, 102, 148, 53, 18, 14, 146, 76, 71, 2, 113, 234, 164, + 215, 83, 86, 121, 114, 197, 179, 55, 65, 201, 198, 107, 55, 241, 67, 29, + 107, 252, 166, 244, 173, 8, 183, 179, 96, 78, 30, 76, 50, 153, 33, 92, + 215, 40, 156, 163, 71, 84, 248, 17, 158, 150, 98, 84, 210, 106, 14, 104, + 29, 130, 13, 216, 68, 97, 244, 172, 84, 78, 168, 187, 177, 189, 238, 236, + 57, 243, 192, 227, 103, 87, 3, 211, 244, 94, 92, 160, 247, 32, 89, 67, + 127, 167, 73, 61, 205, 84, 212, 242, 232, 51, 206, 176, 218, 250, 249, 21, + 233, 193, 66, 149, 222, 188, 98, 38, 205, 193, 238, 130, 87, 248, 3, 236, + 130, 41, 96, 169, 105, 210, 137, 39, 251, 150, 67, 175, 100, 106, 245, 232, + 24, 32, 163, 44, 73, 99, 10, 96, 102, 67, 31, 231, 217, 30, 4, 111, + 59, 146, 27, 63, 248, 6, 222, 94, 4, 105, 132, 145, 57, 201, 236, 39, + 189, 26, 239, 62, 109, 35, 111, 20, 223, 163, 114, 10, 214, 92, 161, 33, + 73, 210, 75, 228, 67, 163, 167, 97, 52, 38, 125, 28, 235, 79, 236, 195, + 159, 223, 217, 180, 37, 184, 232, 55, 231, 212, 139, 248, 222, 165, 170, 18, + 79, 201, 158, 180, 78, 125, 6, 178, 250, 198, 42, 53, 102, 172, 164, 216, + 237, 84, 117, 10, 160, 3, 200, 194, 29, 190, 220, 157, 36, 203, 170, 0, + 170, 224, 214, 200, 75, 146, 61, 170, 51, 216, 137, 6, 71, 30, 189, 228, + 19, 73, 70, 185, 14, 185, 126, 41, 159, 193, 70, 84, 100, 0, 240, 107, + 194, 19, 168, 218, 144, 124, 4, 216, 35, 93, 183, 91, 0, 191, 170, 79, + 78, 128, 84, 119, 149, 209, 79, 209, 16, 2, 169, 93, 140, 185, 235, 43, + 87, 175, 58, 176, 172, 229, 202, 91, 135, 135, 101, 161, 59, 84, 203, 161, + 169, 155, 98, 224, 220, 201, 239, 153, 114, 162, 198, 65, 238, 53, 239, 58, + 25, 192, 48, 191, 100, 203, 178, 44, 240, 245, 92, 123, 110, 231, 126, 76, + 248, 136, 155, 211, 129, 14, 23, 189, 37, 128, 183, 170, 171, 84, 86, 218, + 133, 147, 93, 40, 238, 212, 145, 3, 158, 117, 74, 117, 157, 108, 143, 137, + 119, 38, 145, 187, 248, 195, 123, 53, 71, 254, 33, 20, 203, 166, 113, 99, + 160, 183, 33, 125, 236, 123, 0, 134, 9, 79, 179, 86, 78, 69, 79, 215, + 234, 74, 201, 134, 40, 247, 237, 141, 59, 96, 220, 193, 157, 10, 230, 237, + 254, 167, 222, 41, 176, 90, 90, 12, 101, 25, 243, 81, 199, 160, 169, 205, + 14, 131, 133, 177, 183, 182, 101, 81, 124, 219, 223, 92, 246, 172, 217, 65, + 189, 182, 244, 92, 6, 135, 59, 58, 223, 246, 66, 166, 35, 221, 198, 166, + 157, 60, 229, 155, 153, 154, 240, 22, 61, 24, 215, 50, 0, 162, 5, 129, + 182, 121, 182, 101, 252, 6, 140, 142, 118, 162, 62, 153, 106, 69, 120, 230, + 104, 244, 15, 199, 79, 52, 53, 209, 160, 134, 22, 80, 242, 27, 144, 4, + 117, 181, 222, 17, 191, 139, 79, 188, 36, 70, 177, 206, 45, 95, 96, 97, + 219, 60, 42, 192, 152, 80, 61, 70, 229, 167, 47, 221, 24, 254, 177, 55, + 75, 171, 176, 253, 43, 91, 72, 228, 204, 73, 211, 40, 225, 74, 0, 67, + 153, 153, 243, 241, 51, 225, 136, 141, 175, 26, 156, 195, 92, 101, 174, 50, + 13, 219, 154, 240, 148, 17, 170, 52, 22, 152, 139, 38, 40, 79, 101, 128, + 123, 209, 220, 119, 203, 24, 47, 93, 54, 199, 229, 213, 95, 174, 194, 206, + 20, 137, 233, 163, 73, 105, 188, 253, 97, 135, 211, 7, 125, 59, 118, 177, + 31, 25, 65, 48, 222, 90, 64, 215, 75, 31, 39, 132, 42, 4, 57, 205, + 145, 54, 230, 154, 18, 94, 62, 65, 91, 165, 178, 191, 109, 162, 170, 242, + 174, 187, 159, 98, 143, 20, 53, 248, 138, 159, 174, 63, 47, 212, 100, 89, + 178, 53, 71, 150, 165, 66, 71, 177, 10, 6, 140, 42, 31, 90, 59, 78, + 123, 32, 177, 79, 64, 20, 46, 232, 129, 174, 72, 170, 14, 74, 71, 50, + 110, 153, 228, 198, 103, 116, 133, 212, 41, 177, 169, 157, 95, 67, 210, 27, + 26, 110, 109, 10, 224, 187, 193, 135, 204, 94, 150, 116, 119, 98, 56, 234, + 207, 255, 147, 193, 176, 69, 156, 230, 201, 56, 182, 127, 129, 97, 190, 212, + 233, 127, 204, 255, 243, 146, 238, 99, 255, 47, 127, 251, 63, 174, 242, 254, + 239, 61, 42, 86, 90, 255, 121, 14, 209, 189, 30, 227, 95, 157, 159, 15, + 244, 111, 115, 136, 152, 207, 231, 243, 35, 77, 150, 49, 65, 141, 230, 170, + 208, 125, 117, 49, 202, 82, 164, 243, 22, 11, 94, 143, 179, 210, 98, 186, + 83, 163, 187, 2, 255, 142, 80, 166, 203, 101, 193, 129, 141, 120, 77, 50, + 1, 124, 214, 63, 183, 218, 6, 233, 206, 95, 38, 185, 210, 128, 187, 188, + 247, 181, 196, 240, 1, 254, 140, 63, 40, 16, 188, 190, 3, 95, 23, 249, + 30, 103, 185, 252, 211, 175, 170, 220, 223, 29, 222, 150, 248, 126, 127, 124, + 27, 14, 244, 164, 136, 145, 33, 25, 152, 10, 212, 131, 2, 70, 85, 134, + 60, 197, 189, 160, 247, 30, 178, 191, 212, 10, 132, 189, 84, 139, 239, 251, + 141, 134, 245, 222, 63, 44, 214, 122, 93, 112, 33, 188, 18, 167, 127, 109, + 59, 54, 68, 112, 250, 168, 143, 122, 40, 247, 7, 250, 21, 175, 131, 89, + 227, 114, 148, 233, 151, 95, 45, 52, 23, 42, 219, 237, 148, 151, 86, 124, + 182, 18, 45, 217, 110, 199, 247, 82, 134, 30, 219, 147, 16, 214, 26, 253, + 89, 177, 57, 238, 39, 205, 113, 255, 140, 222, 229, 182, 196, 7, 59, 201, + 246, 157, 173, 174, 255, 154, 103, 69, 255, 53, 82, 208, 10, 79, 0, 14, + 226, 192, 120, 109, 30, 205, 255, 78, 88, 191, 124, 161, 110, 25, 171, 60, + 41, 82, 180, 136, 234, 160, 185, 98, 255, 3, 193, 144, 230, 214, 140, 204, + 169, 184, 195, 96, 38, 179, 126, 5, 64, 18, 253, 117, 48, 8, 126, 20, + 68, 233, 220, 35, 162, 104, 16, 115, 12, 38, 176, 160, 118, 238, 109, 94, + 1, 135, 101, 205, 78, 8, 41, 143, 236, 6, 40, 46, 81, 107, 86, 174, + 2, 104, 30, 187, 115, 194, 88, 98, 245, 232, 126, 89, 14, 100, 207, 123, + 214, 91, 11, 29, 200, 107, 180, 18, 223, 42, 62, 129, 147, 156, 216, 228, + 104, 151, 102, 184, 111, 78, 54, 151, 12, 158, 243, 147, 66, 23, 92, 206, + 174, 135, 102, 159, 148, 88, 200, 222, 194, 77, 243, 245, 228, 150, 200, 10, + 42, 69, 178, 185, 107, 155, 161, 34, 248, 162, 88, 68, 188, 67, 111, 78, + 185, 189, 233, 116, 79, 19, 14, 208, 65, 76, 139, 207, 142, 128, 118, 200, + 49, 87, 249, 167, 49, 24, 9, 178, 91, 1, 99, 246, 66, 64, 68, 225, + 96, 125, 201, 199, 128, 151, 186, 43, 81, 197, 55, 7, 169, 250, 234, 145, + 184, 110, 23, 87, 125, 208, 57, 156, 177, 128, 58, 199, 46, 15, 160, 100, + 140, 130, 225, 228, 15, 203, 189, 232, 71, 205, 91, 53, 220, 48, 163, 197, + 53, 15, 38, 172, 85, 123, 229, 50, 18, 25, 85, 5, 34, 95, 83, 219, + 107, 138, 71, 168, 71, 25, 223, 75, 60, 176, 203, 63, 107, 6, 69, 67, + 79, 253, 17, 202, 92, 85, 175, 19, 200, 86, 216, 144, 218, 2, 170, 245, + 150, 198, 109, 39, 86, 114, 221, 135, 196, 3, 246, 204, 126, 86, 120, 12, + 83, 135, 123, 225, 127, 62, 197, 208, 224, 107, 228, 163, 82, 142, 101, 141, + 135, 3, 118, 208, 79, 212, 222, 220, 175, 171, 213, 232, 237, 225, 28, 218, + 242, 8, 116, 31, 21, 58, 83, 137, 7, 200, 249, 82, 170, 8, 124, 22, + 179, 167, 233, 52, 249, 34, 204, 5, 216, 27, 35, 94, 35, 153, 92, 223, + 204, 223, 46, 116, 81, 98, 34, 247, 228, 220, 248, 49, 10, 98, 26, 187, + 213, 243, 206, 123, 205, 16, 191, 32, 234, 233, 33, 166, 248, 33, 135, 24, + 75, 253, 174, 202, 230, 96, 203, 21, 83, 218, 154, 218, 45, 100, 253, 248, + 205, 139, 178, 73, 141, 26, 192, 43, 124, 110, 224, 175, 73, 125, 14, 0, + 85, 216, 217, 229, 26, 229, 163, 87, 58, 107, 16, 184, 125, 209, 50, 49, + 242, 105, 130, 63, 21, 56, 6, 130, 54, 168, 229, 231, 23, 104, 37, 52, + 205, 27, 36, 165, 189, 126, 61, 244, 111, 165, 133, 192, 94, 250, 150, 148, + 228, 20, 253, 158, 90, 78, 77, 115, 82, 129, 105, 133, 52, 209, 134, 247, + 73, 16, 89, 54, 49, 246, 226, 79, 156, 60, 25, 121, 157, 251, 186, 117, + 71, 81, 249, 211, 180, 97, 231, 86, 240, 234, 33, 233, 141, 109, 57, 242, + 242, 64, 218, 41, 227, 54, 150, 84, 43, 98, 140, 81, 54, 214, 72, 182, + 248, 32, 11, 41, 69, 154, 176, 4, 130, 62, 220, 79, 95, 72, 104, 135, + 113, 137, 72, 174, 183, 13, 232, 198, 84, 1, 194, 47, 116, 26, 134, 142, + 211, 122, 38, 131, 164, 139, 2, 156, 108, 19, 125, 137, 209, 205, 127, 146, + 185, 168, 191, 178, 235, 9, 152, 12, 58, 160, 121, 193, 136, 80, 249, 32, + 4, 188, 232, 191, 153, 70, 4, 239, 7, 41, 165, 207, 79, 251, 224, 40, + 151, 100, 102, 133, 152, 158, 211, 114, 184, 9, 118, 182, 117, 202, 167, 247, + 105, 90, 11, 76, 228, 75, 69, 171, 88, 161, 149, 254, 147, 62, 122, 155, + 109, 167, 122, 19, 110, 82, 216, 19, 234, 238, 85, 14, 154, 65, 3, 84, + 174, 140, 200, 165, 98, 73, 16, 66, 21, 175, 255, 246, 187, 146, 99, 108, + 185, 222, 253, 185, 122, 240, 7, 152, 66, 136, 201, 158, 222, 107, 181, 224, + 116, 68, 176, 142, 103, 223, 179, 35, 42, 42, 125, 88, 246, 106, 63, 188, + 195, 69, 50, 44, 162, 113, 67, 204, 12, 197, 238, 194, 200, 223, 134, 63, + 46, 164, 136, 242, 198, 43, 228, 247, 196, 34, 179, 231, 102, 165, 255, 214, + 186, 146, 32, 14, 2, 9, 122, 35, 232, 201, 1, 28, 240, 61, 124, 178, + 6, 243, 158, 158, 16, 190, 230, 246, 121, 218, 253, 41, 33, 167, 62, 205, + 255, 250, 61, 178, 255, 203, 17, 111, 127, 45, 105, 84, 254, 121, 202, 199, + 127, 107, 220, 217, 127, 56, 234, 44, 31, 255, 67, 158, 213, 91, 61, 148, + 159, 127, 249, 219, 63, 63, 25, 228, 191, 50, 36, 237, 175, 135, 139, 252, + 207, 212, 221, 240, 241, 254, 242, 41, 44, 121, 54, 59, 14, 252, 153, 113, + 48, 28, 132, 254, 229, 168, 114, 20, 153, 171, 217, 49, 96, 52, 88, 43, + 21, 105, 243, 43, 208, 36, 200, 83, 231, 169, 176, 84, 107, 113, 214, 103, + 199, 115, 16, 179, 57, 23, 55, 218, 240, 209, 193, 208, 230, 174, 175, 202, + 94, 160, 192, 88, 161, 78, 155, 80, 28, 244, 233, 164, 179, 105, 169, 56, + 163, 68, 95, 156, 224, 64, 175, 219, 230, 220, 205, 112, 207, 85, 119, 221, + 74, 101, 192, 80, 160, 83, 135, 167, 89, 153, 181, 142, 13, 211, 179, 37, + 21, 162, 44, 236, 95, 105, 4, 103, 182, 223, 107, 178, 231, 83, 166, 215, + 253, 94, 71, 130, 126, 28, 104, 252, 217, 80, 138, 88, 30, 251, 88, 28, + 251, 24, 175, 243, 214, 92, 181, 83, 65, 114, 86, 157, 51, 19, 239, 85, + 102, 42, 151, 167, 47, 227, 77, 219, 193, 108, 74, 5, 230, 2, 180, 197, + 48, 22, 4, 190, 167, 7, 188, 167, 121, 28, 36, 185, 222, 166, 186, 220, + 248, 177, 32, 246, 50, 89, 240, 48, 216, 118, 214, 90, 241, 214, 93, 182, + 144, 159, 178, 145, 159, 112, 150, 31, 177, 150, 29, 177, 148, 108, 208, 230, + 170, 51, 227, 174, 213, 100, 42, 85, 161, 203, 79, 116, 173, 141, 184, 127, + 25, 113, 87, 102, 96, 85, 116, 108, 81, 248, 115, 146, 95, 79, 49, 218, + 78, 37, 82, 175, 172, 229, 166, 152, 135, 186, 200, 223, 34, 31, 214, 148, + 247, 58, 28, 223, 251, 153, 30, 247, 250, 45, 142, 196, 205, 246, 207, 108, + 148, 22, 121, 227, 93, 223, 176, 107, 175, 220, 49, 92, 118, 84, 154, 49, + 145, 28, 181, 151, 105, 116, 17, 105, 183, 124, 131, 199, 211, 34, 44, 218, + 100, 201, 87, 168, 201, 81, 72, 15, 111, 175, 231, 213, 20, 239, 92, 13, + 253, 248, 234, 196, 154, 12, 250, 150, 40, 226, 170, 240, 200, 40, 193, 125, + 143, 221, 97, 139, 37, 198, 16, 201, 239, 33, 221, 247, 213, 23, 120, 30, + 72, 103, 130, 72, 125, 204, 99, 81, 216, 119, 158, 239, 235, 98, 8, 115, + 242, 155, 38, 198, 129, 38, 210, 225, 106, 217, 135, 66, 194, 242, 120, 52, + 116, 231, 55, 41, 44, 170, 53, 107, 42, 59, 105, 38, 51, 214, 169, 51, + 100, 46, 53, 20, 247, 114, 182, 195, 223, 230, 248, 158, 248, 226, 171, 182, + 124, 115, 207, 101, 44, 198, 57, 85, 71, 57, 82, 25, 221, 84, 254, 88, + 136, 71, 222, 20, 251, 152, 101, 28, 153, 227, 35, 95, 240, 133, 156, 241, + 249, 181, 146, 249, 52, 202, 124, 208, 205, 52, 54, 78, 192, 211, 71, 186, + 215, 74, 242, 210, 77, 130, 220, 161, 55, 85, 138, 193, 235, 104, 97, 41, + 15, 174, 45, 19, 42, 48, 19, 162, 51, 29, 236, 190, 24, 164, 49, 9, + 164, 49, 70, 24, 54, 247, 175, 60, 132, 175, 33, 244, 43, 59, 224, 253, + 34, 134, 121, 48, 243, 0, 52, 241, 240, 59, 233, 96, 243, 21, 11, 81, + 0, 245, 112, 4, 249, 148, 207, 89, 152, 11, 209, 150, 215, 98, 188, 213, + 98, 157, 201, 114, 190, 1, 178, 151, 214, 92, 136, 249, 84, 137, 238, 164, + 176, 226, 112, 186, 234, 80, 133, 70, 131, 129, 72, 159, 153, 112, 143, 144, + 100, 167, 128, 112, 129, 232, 11, 37, 62, 71, 13, 43, 170, 43, 19, 162, + 1, 159, 61, 13, 200, 141, 32, 212, 125, 121, 204, 253, 229, 233, 53, 30, + 184, 121, 126, 147, 39, 39, 230, 34, 251, 191, 89, 246, 231, 81, 86, 232, + 73, 122, 162, 9, 155, 139, 14, 27, 184, 113, 170, 209, 30, 123, 193, 3, + 243, 203, 118, 18, 138, 247, 58, 137, 54, 244, 211, 10, 245, 195, 42, 228, + 190, 69, 0, 48, 69, 128, 75, 197, 0, 163, 229, 176, 125, 138, 97, 31, + 94, 76, 202, 227, 33, 183, 242, 193, 159, 243, 65, 166, 211, 65, 110, 243, + 128, 10, 35, 152, 160, 42, 255, 85, 187, 61, 34, 23, 240, 237, 68, 125, + 116, 135, 189, 85, 133, 189, 6, 71, 188, 180, 7, 48, 253, 73, 187, 75, + 118, 186, 121, 142, 187, 42, 116, 88, 20, 176, 218, 241, 103, 178, 211, 97, + 187, 49, 229, 180, 46, 172, 187, 156, 166, 61, 225, 87, 121, 164, 88, 181, + 199, 88, 188, 221, 145, 179, 44, 99, 23, 25, 251, 15, 59, 17, 255, 54, + 70, 13, 244, 205, 16, 177, 26, 215, 178, 57, 130, 184, 129, 14, 205, 91, + 51, 87, 65, 39, 147, 194, 36, 50, 116, 72, 136, 147, 217, 135, 158, 132, + 218, 32, 157, 136, 54, 248, 79, 120, 18, 31, 225, 250, 104, 243, 147, 207, + 206, 124, 118, 32, 11, 129, 252, 250, 154, 238, 171, 39, 25, 242, 170, 213, + 1, 12, 158, 29, 177, 74, 55, 110, 182, 64, 3, 51, 254, 106, 58, 80, + 77, 94, 136, 19, 64, 165, 70, 100, 186, 16, 159, 172, 111, 191, 237, 240, + 130, 40, 225, 57, 199, 89, 152, 55, 77, 43, 233, 160, 167, 79, 62, 3, + 84, 11, 104, 32, 14, 19, 0, 131, 51, 8, 205, 146, 162, 89, 178, 84, + 220, 222, 23, 177, 47, 59, 92, 12, 27, 122, 252, 50, 5, 91, 54, 146, + 21, 135, 80, 209, 33, 210, 237, 247, 162, 39, 212, 199, 141, 228, 242, 6, + 247, 172, 32, 54, 182, 1, 227, 163, 121, 235, 15, 51, 18, 131, 77, 176, + 148, 212, 70, 59, 81, 191, 109, 249, 185, 30, 209, 251, 120, 198, 144, 117, + 63, 123, 203, 246, 218, 195, 179, 171, 186, 21, 226, 119, 99, 227, 125, 128, + 100, 236, 209, 220, 249, 67, 102, 191, 31, 219, 180, 5, 241, 225, 218, 159, + 137, 176, 50, 119, 70, 38, 217, 97, 149, 14, 149, 232, 66, 216, 26, 196, + 25, 105, 126, 238, 166, 137, 50, 99, 179, 74, 217, 239, 227, 206, 199, 220, + 61, 19, 118, 101, 251, 220, 218, 150, 234, 72, 183, 133, 10, 249, 23, 140, + 246, 43, 12, 201, 222, 223, 219, 26, 138, 250, 236, 85, 231, 237, 233, 51, + 80, 121, 39, 72, 110, 196, 153, 214, 99, 175, 248, 213, 172, 237, 220, 77, + 231, 61, 247, 53, 114, 225, 200, 137, 49, 174, 39, 171, 82, 174, 48, 175, + 24, 65, 169, 40, 192, 80, 95, 56, 144, 23, 43, 186, 5, 251, 225, 94, + 133, 158, 11, 126, 196, 244, 147, 80, 161, 5, 195, 139, 178, 105, 46, 134, + 159, 192, 190, 31, 204, 159, 200, 167, 188, 68, 216, 118, 144, 216, 6, 53, + 24, 116, 123, 89, 106, 242, 136, 253, 230, 132, 160, 242, 89, 165, 210, 69, + 41, 62, 201, 152, 37, 133, 222, 12, 213, 42, 102, 219, 192, 134, 195, 1, + 0, 217, 61, 74, 180, 75, 141, 59, 199, 223, 139, 208, 84, 138, 87, 150, + 142, 154, 152, 197, 255, 90, 56, 168, 183, 231, 21, 17, 138, 173, 5, 13, + 84, 126, 147, 23, 199, 66, 129, 85, 24, 159, 235, 231, 2, 98, 38, 82, + 102, 204, 168, 175, 127, 235, 182, 137, 67, 187, 29, 200, 199, 39, 172, 30, + 147, 151, 225, 1, 11, 182, 124, 61, 252, 12, 150, 121, 82, 29, 243, 132, + 225, 97, 200, 29, 117, 244, 228, 119, 22, 32, 41, 40, 60, 151, 185, 225, + 56, 145, 125, 151, 169, 206, 52, 234, 72, 189, 38, 147, 27, 225, 75, 6, + 242, 80, 21, 198, 47, 194, 59, 78, 6, 66, 3, 110, 158, 126, 113, 137, + 95, 243, 204, 16, 163, 173, 55, 59, 109, 244, 68, 113, 107, 26, 228, 243, + 11, 15, 7, 255, 65, 246, 124, 124, 232, 189, 208, 242, 4, 3, 158, 100, + 135, 4, 140, 0, 237, 20, 149, 94, 193, 100, 171, 46, 245, 171, 132, 134, + 36, 21, 161, 111, 86, 160, 134, 238, 211, 38, 125, 198, 220, 14, 55, 177, + 214, 139, 112, 221, 160, 238, 173, 48, 34, 234, 150, 222, 147, 222, 62, 73, + 230, 152, 220, 53, 136, 6, 64, 38, 61, 250, 242, 177, 108, 227, 57, 14, + 33, 101, 94, 196, 141, 172, 78, 99, 242, 176, 41, 109, 192, 72, 39, 117, + 251, 177, 94, 184, 208, 21, 201, 122, 68, 132, 105, 67, 22, 153, 161, 217, + 209, 206, 121, 178, 55, 64, 80, 122, 17, 240, 53, 155, 32, 218, 127, 95, + 111, 177, 38, 36, 101, 214, 87, 67, 100, 31, 40, 33, 209, 82, 146, 95, + 129, 226, 155, 203, 199, 228, 8, 26, 170, 218, 133, 26, 245, 176, 96, 190, + 197, 169, 168, 2, 131, 142, 165, 93, 210, 146, 131, 46, 186, 122, 124, 205, + 2, 90, 235, 218, 215, 204, 120, 184, 30, 138, 85, 73, 193, 168, 86, 139, + 19, 102, 105, 70, 201, 153, 13, 245, 222, 255, 34, 30, 233, 173, 253, 216, + 113, 222, 61, 178, 37, 122, 32, 175, 12, 82, 230, 181, 97, 61, 83, 171, + 76, 154, 252, 169, 237, 49, 146, 213, 132, 24, 109, 218, 116, 194, 211, 146, + 212, 172, 19, 68, 186, 124, 135, 42, 128, 24, 58, 146, 232, 155, 161, 52, + 255, 173, 92, 42, 85, 66, 13, 53, 167, 68, 219, 6, 167, 185, 20, 192, + 137, 45, 167, 192, 25, 124, 72, 253, 88, 193, 38, 142, 251, 75, 176, 63, + 199, 196, 205, 115, 208, 23, 112, 179, 86, 250, 227, 4, 96, 210, 15, 180, + 21, 107, 169, 209, 214, 230, 36, 55, 19, 25, 125, 91, 42, 160, 137, 158, + 34, 121, 156, 156, 34, 82, 235, 17, 0, 28, 159, 67, 104, 34, 140, 71, + 231, 154, 227, 220, 250, 107, 3, 22, 73, 227, 253, 169, 148, 225, 181, 187, + 184, 231, 57, 13, 22, 131, 164, 156, 125, 177, 153, 75, 151, 186, 150, 70, + 134, 57, 68, 4, 18, 201, 157, 7, 175, 164, 91, 71, 69, 81, 80, 244, + 147, 212, 186, 198, 239, 141, 137, 96, 203, 71, 94, 200, 80, 226, 57, 192, + 228, 86, 118, 37, 175, 206, 43, 123, 86, 166, 110, 183, 232, 94, 178, 253, + 132, 35, 56, 55, 165, 235, 201, 247, 44, 127, 79, 118, 174, 235, 217, 228, + 184, 55, 89, 157, 138, 126, 60, 175, 137, 164, 30, 90, 84, 209, 167, 206, + 159, 148, 136, 189, 138, 158, 60, 123, 110, 3, 67, 127, 146, 31, 153, 169, + 136, 16, 106, 36, 52, 45, 243, 255, 144, 153, 21, 48, 248, 47, 127, 251, + 231, 71, 201, 253, 123, 247, 73, 208, 225, 159, 239, 253, 191, 205, 107, 64, + 175, 254, 207, 205, 58, 90, 253, 59, 63, 42, 92, 45, 42, 220, 205, 234, + 188, 173, 74, 156, 253, 110, 111, 83, 127, 185, 78, 121, 249, 197, 17, 238, + 86, 249, 243, 153, 171, 190, 210, 27, 180, 119, 63, 83, 176, 67, 91, 168, + 83, 87, 180, 199, 247, 187, 168, 241, 182, 251, 238, 99, 250, 34, 253, 103, + 122, 146, 90, 201, 143, 153, 72, 246, 183, 87, 157, 81, 230, 108, 241, 229, + 16, 54, 18, 111, 208, 18, 236, 180, 82, 156, 50, 146, 234, 111, 32, 214, + 231, 31, 30, 49, 249, 90, 157, 212, 103, 77, 94, 43, 19, 74, 14, 41, + 115, 181, 137, 154, 109, 9, 190, 92, 218, 41, 79, 153, 203, 141, 169, 189, + 241, 222, 134, 107, 22, 10, 147, 6, 127, 157, 167, 94, 77, 129, 110, 125, + 254, 182, 220, 160, 31, 27, 229, 105, 27, 197, 9, 29, 145, 6, 13, 254, + 78, 243, 63, 29, 198, 196, 167, 145, 225, 252, 174, 214, 53, 18, 61, 159, + 99, 156, 110, 68, 76, 16, 37, 172, 118, 61, 244, 86, 220, 117, 150, 221, + 180, 231, 59, 105, 205, 119, 80, 31, 52, 151, 29, 53, 150, 30, 209, 225, + 109, 214, 228, 110, 33, 199, 13, 199, 67, 117, 130, 129, 128, 131, 133, 128, + 24, 0, 117, 71, 128, 118, 131, 126, 54, 220, 91, 53, 62, 91, 20, 216, + 232, 100, 173, 42, 164, 107, 206, 208, 104, 76, 3, 20, 176, 61, 19, 183, + 58, 18, 49, 221, 114, 211, 219, 180, 123, 185, 54, 144, 232, 111, 44, 188, + 132, 131, 27, 138, 131, 22, 138, 137, 236, 143, 10, 231, 139, 5, 1, 58, + 246, 232, 250, 113, 105, 247, 122, 108, 54, 59, 173, 112, 179, 165, 179, 54, + 175, 53, 57, 166, 121, 58, 17, 213, 88, 197, 22, 208, 196, 210, 93, 140, + 157, 29, 143, 153, 18, 14, 56, 147, 5, 80, 155, 10, 219, 16, 33, 86, + 20, 241, 63, 201, 231, 33, 197, 247, 61, 195, 247, 85, 196, 225, 213, 219, + 0, 33, 222, 98, 203, 89, 123, 69, 162, 198, 146, 141, 234, 124, 99, 217, + 201, 56, 237, 97, 51, 201, 110, 31, 185, 78, 3, 225, 22, 90, 162, 72, + 120, 228, 72, 52, 196, 112, 124, 212, 16, 84, 196, 96, 6, 76, 159, 225, + 7, 88, 104, 80, 143, 193, 59, 131, 215, 75, 131, 235, 35, 187, 241, 91, + 91, 148, 251, 23, 31, 199, 138, 143, 219, 218, 59, 139, 218, 247, 203, 74, + 187, 211, 74, 17, 93, 146, 97, 237, 107, 192, 134, 249, 227, 237, 82, 207, + 53, 88, 183, 150, 82, 23, 190, 145, 49, 85, 196, 189, 92, 13, 167, 181, + 120, 29, 133, 184, 171, 37, 26, 125, 211, 144, 102, 146, 33, 123, 57, 41, + 162, 253, 65, 171, 67, 255, 139, 185, 254, 79, 247, 94, 113, 255, 50, 209, + 226, 251, 182, 148, 245, 90, 237, 247, 156, 233, 66, 152, 226, 64, 87, 240, + 106, 135, 203, 226, 198, 175, 221, 101, 166, 5, 174, 131, 6, 142, 111, 125, + 200, 28, 199, 53, 81, 189, 181, 70, 7, 100, 115, 133, 193, 68, 139, 1, + 119, 197, 73, 111, 205, 241, 124, 227, 17, 95, 40, 33, 9, 149, 70, 87, + 153, 126, 147, 68, 143, 173, 104, 27, 66, 224, 186, 127, 212, 20, 131, 253, + 231, 89, 169, 190, 77, 5, 69, 162, 82, 22, 63, 92, 86, 50, 77, 67, + 173, 72, 23, 88, 218, 209, 212, 226, 39, 152, 112, 197, 222, 75, 125, 244, + 111, 111, 62, 32, 178, 97, 86, 40, 35, 146, 141, 176, 131, 126, 14, 36, + 170, 168, 161, 82, 159, 48, 165, 248, 12, 44, 133, 138, 142, 224, 214, 113, + 24, 105, 243, 165, 226, 128, 225, 15, 172, 248, 159, 187, 83, 94, 47, 154, + 169, 32, 156, 209, 36, 138, 77, 147, 60, 127, 22, 24, 64, 168, 73, 195, + 105, 142, 175, 197, 47, 72, 141, 159, 174, 108, 198, 157, 163, 4, 39, 138, + 44, 128, 152, 31, 225, 83, 162, 105, 39, 58, 99, 249, 236, 192, 225, 29, + 106, 75, 173, 113, 89, 106, 53, 64, 172, 16, 150, 45, 249, 28, 159, 22, + 168, 173, 253, 79, 54, 191, 8, 5, 29, 110, 74, 206, 36, 244, 77, 240, + 10, 42, 94, 236, 37, 93, 70, 187, 129, 18, 32, 74, 141, 78, 126, 159, + 104, 172, 228, 249, 246, 202, 200, 131, 165, 244, 135, 254, 90, 230, 139, 243, + 153, 244, 25, 200, 92, 105, 130, 0, 185, 0, 233, 24, 220, 86, 171, 141, + 86, 84, 199, 70, 234, 31, 141, 90, 33, 154, 110, 195, 95, 85, 188, 222, + 29, 80, 122, 104, 207, 232, 234, 41, 232, 241, 98, 72, 117, 145, 224, 192, + 85, 73, 148, 104, 64, 165, 88, 156, 13, 11, 63, 65, 12, 198, 105, 255, + 83, 194, 103, 52, 58, 81, 204, 58, 167, 231, 184, 46, 150, 235, 74, 36, + 226, 46, 7, 112, 246, 40, 64, 227, 137, 46, 34, 84, 9, 210, 106, 122, + 54, 255, 133, 10, 54, 101, 134, 138, 79, 45, 36, 50, 2, 25, 230, 168, + 251, 77, 117, 34, 251, 125, 136, 245, 170, 104, 44, 57, 82, 230, 142, 90, + 87, 46, 9, 98, 29, 26, 100, 1, 166, 178, 163, 121, 39, 58, 145, 177, + 138, 36, 52, 212, 3, 164, 235, 58, 83, 147, 226, 161, 56, 128, 163, 195, + 95, 174, 140, 68, 149, 236, 134, 53, 145, 114, 82, 53, 158, 234, 135, 229, + 43, 30, 82, 64, 177, 183, 22, 67, 17, 254, 206, 145, 205, 143, 167, 201, + 166, 106, 86, 170, 35, 175, 52, 51, 28, 105, 6, 12, 206, 91, 33, 128, + 190, 64, 160, 139, 157, 137, 206, 52, 11, 100, 106, 146, 133, 100, 87, 177, + 202, 51, 212, 250, 143, 122, 143, 123, 98, 72, 197, 104, 177, 170, 200, 90, + 147, 32, 217, 75, 13, 46, 124, 83, 157, 112, 152, 229, 15, 13, 185, 126, + 18, 112, 155, 7, 196, 126, 85, 213, 139, 168, 78, 238, 162, 170, 97, 26, + 125, 250, 113, 52, 53, 94, 105, 208, 79, 177, 119, 108, 247, 72, 137, 86, + 207, 37, 19, 153, 141, 166, 79, 162, 6, 23, 136, 240, 112, 31, 52, 106, + 174, 31, 145, 94, 95, 47, 42, 75, 118, 122, 37, 140, 59, 91, 17, 210, + 191, 228, 40, 12, 80, 127, 167, 198, 19, 7, 33, 174, 165, 166, 173, 209, + 45, 105, 190, 172, 181, 225, 88, 240, 169, 31, 240, 163, 195, 204, 181, 214, + 129, 178, 140, 185, 3, 136, 123, 241, 86, 7, 232, 209, 212, 57, 3, 110, + 234, 200, 17, 127, 55, 96, 225, 135, 66, 196, 3, 156, 111, 226, 205, 82, + 163, 64, 2, 130, 79, 18, 255, 245, 168, 251, 182, 13, 103, 122, 84, 128, + 77, 59, 172, 105, 200, 21, 173, 101, 17, 35, 122, 51, 215, 121, 198, 211, + 147, 239, 168, 195, 48, 248, 8, 124, 134, 179, 211, 60, 170, 60, 108, 132, + 103, 224, 102, 81, 42, 151, 189, 162, 65, 110, 141, 148, 151, 240, 21, 221, + 215, 7, 200, 212, 207, 74, 63, 114, 153, 105, 58, 190, 47, 23, 35, 251, + 90, 173, 153, 0, 29, 107, 38, 152, 231, 59, 215, 203, 177, 11, 51, 53, + 52, 80, 56, 184, 44, 194, 68, 64, 82, 85, 66, 64, 41, 203, 241, 132, + 178, 218, 36, 88, 151, 3, 207, 121, 231, 40, 184, 90, 127, 95, 23, 66, + 219, 182, 77, 59, 104, 249, 221, 128, 249, 135, 78, 50, 20, 175, 180, 185, + 142, 210, 145, 178, 172, 142, 107, 149, 106, 84, 78, 117, 177, 236, 65, 160, + 72, 30, 219, 144, 67, 188, 186, 178, 181, 66, 126, 226, 232, 179, 140, 249, + 82, 166, 84, 97, 185, 180, 200, 104, 188, 254, 225, 66, 245, 184, 211, 179, + 221, 70, 211, 123, 246, 48, 230, 3, 26, 13, 30, 198, 59, 23, 66, 219, + 173, 84, 190, 165, 153, 192, 218, 143, 59, 52, 172, 120, 194, 116, 22, 226, + 73, 71, 74, 247, 239, 147, 123, 10, 185, 150, 111, 241, 134, 238, 112, 30, + 164, 88, 56, 213, 150, 188, 226, 109, 13, 78, 20, 105, 86, 27, 102, 202, + 137, 127, 77, 140, 230, 237, 126, 21, 133, 40, 37, 169, 33, 164, 216, 208, + 182, 69, 237, 138, 35, 20, 60, 99, 232, 193, 213, 233, 209, 12, 135, 134, + 172, 208, 133, 45, 44, 229, 245, 97, 53, 66, 180, 141, 68, 242, 214, 76, + 9, 8, 37, 69, 111, 163, 126, 13, 116, 65, 228, 147, 118, 147, 19, 33, + 209, 80, 188, 100, 123, 123, 232, 243, 146, 234, 87, 83, 156, 118, 175, 252, + 207, 65, 232, 151, 247, 224, 102, 56, 184, 141, 41, 184, 229, 121, 96, 183, + 41, 75, 101, 67, 156, 252, 168, 43, 241, 71, 146, 76, 208, 47, 34, 43, + 243, 55, 15, 151, 47, 67, 179, 103, 5, 114, 5, 36, 193, 32, 167, 238, + 148, 42, 174, 136, 213, 145, 219, 209, 204, 39, 133, 39, 51, 254, 53, 35, + 246, 230, 61, 2, 109, 118, 211, 187, 159, 14, 61, 200, 87, 224, 17, 229, + 250, 34, 251, 172, 30, 99, 130, 24, 116, 38, 13, 150, 80, 253, 157, 47, + 254, 187, 198, 250, 172, 121, 215, 21, 247, 95, 144, 52, 125, 108, 126, 224, + 63, 255, 242, 183, 255, 253, 163, 117, 33, 240, 31, 157, 110, 255, 110, 152, + 36, 254, 117, 203, 198, 255, 59, 38, 49, 46, 174, 1, 127, 205, 7, 213, + 186, 255, 188, 252, 219, 255, 139, 215, 159, 219, 62, 223, 63, 221, 119, 2, + 120, 42, 204, 95, 148, 41, 252, 25, 250, 170, 146, 7, 200, 20, 3, 74, + 27, 196, 23, 56, 68, 134, 42, 83, 142, 52, 81, 133, 60, 169, 63, 221, + 158, 227, 244, 215, 240, 77, 91, 205, 189, 206, 235, 111, 244, 38, 85, 43, + 229, 84, 109, 127, 237, 174, 0, 60, 31, 199, 44, 85, 219, 158, 240, 99, + 181, 42, 210, 65, 69, 210, 188, 70, 74, 117, 235, 174, 131, 202, 140, 206, + 62, 17, 176, 58, 113, 41, 162, 53, 143, 229, 219, 102, 62, 219, 146, 244, + 250, 68, 122, 16, 80, 161, 163, 25, 192, 187, 203, 225, 19, 119, 35, 20, + 235, 206, 194, 10, 130, 11, 120, 143, 76, 22, 229, 68, 148, 237, 44, 150, + 138, 125, 214, 157, 143, 88, 253, 44, 241, 52, 76, 108, 83, 217, 253, 60, + 177, 215, 124, 192, 218, 139, 88, 121, 34, 189, 232, 84, 41, 37, 2, 80, + 199, 162, 216, 210, 241, 100, 252, 70, 90, 102, 92, 91, 229, 154, 245, 29, + 49, 116, 169, 210, 225, 151, 168, 186, 247, 235, 180, 209, 203, 163, 197, 99, + 48, 161, 122, 135, 102, 197, 54, 57, 22, 73, 85, 85, 249, 244, 38, 137, + 58, 186, 158, 254, 152, 106, 147, 248, 170, 101, 90, 97, 40, 174, 207, 188, + 244, 81, 73, 73, 96, 218, 148, 147, 254, 221, 207, 84, 131, 163, 176, 116, + 74, 56, 72, 175, 231, 217, 62, 87, 135, 247, 79, 221, 233, 211, 178, 14, + 161, 160, 159, 135, 63, 74, 65, 172, 255, 104, 23, 157, 219, 28, 80, 193, + 10, 7, 192, 133, 77, 233, 133, 209, 132, 42, 90, 128, 186, 250, 38, 200, + 120, 100, 74, 244, 229, 138, 123, 103, 52, 51, 181, 1, 200, 207, 123, 124, + 246, 83, 213, 217, 75, 169, 26, 166, 234, 230, 181, 171, 227, 86, 195, 149, + 159, 69, 23, 45, 234, 40, 34, 67, 61, 181, 124, 134, 15, 240, 49, 95, + 185, 11, 174, 181, 141, 244, 205, 87, 134, 60, 32, 13, 165, 99, 193, 96, + 88, 237, 76, 9, 73, 248, 74, 15, 95, 110, 153, 186, 148, 209, 152, 54, + 118, 103, 53, 111, 104, 67, 197, 8, 216, 217, 210, 254, 11, 120, 90, 132, + 255, 138, 15, 77, 19, 230, 67, 56, 188, 40, 2, 35, 207, 153, 65, 236, + 249, 75, 6, 168, 126, 249, 35, 71, 217, 7, 6, 236, 167, 157, 225, 98, + 93, 28, 121, 215, 52, 38, 195, 6, 21, 24, 48, 121, 52, 134, 251, 161, + 83, 0, 50, 144, 38, 5, 4, 149, 145, 167, 46, 154, 72, 251, 235, 134, + 209, 200, 5, 213, 101, 145, 10, 38, 75, 192, 219, 152, 137, 19, 156, 61, + 222, 115, 228, 81, 234, 61, 72, 183, 45, 211, 50, 56, 112, 195, 82, 167, + 86, 246, 121, 202, 77, 15, 77, 126, 116, 192, 30, 178, 196, 2, 126, 53, + 236, 223, 162, 253, 28, 57, 129, 163, 43, 109, 115, 200, 170, 156, 184, 85, + 48, 18, 2, 191, 165, 83, 74, 101, 146, 48, 64, 205, 255, 88, 7, 27, + 97, 74, 225, 125, 252, 225, 140, 237, 168, 14, 48, 163, 63, 83, 203, 138, + 106, 80, 237, 24, 123, 71, 121, 227, 75, 242, 175, 141, 185, 95, 36, 214, + 139, 123, 2, 246, 128, 131, 183, 218, 57, 171, 204, 234, 41, 239, 73, 126, + 213, 70, 230, 185, 145, 62, 213, 7, 234, 144, 52, 74, 58, 238, 80, 201, + 206, 27, 157, 106, 140, 214, 144, 96, 34, 245, 20, 226, 242, 107, 13, 29, + 204, 189, 220, 253, 16, 175, 144, 224, 220, 217, 249, 240, 228, 250, 218, 228, + 37, 128, 112, 148, 169, 96, 101, 95, 218, 18, 90, 248, 133, 103, 154, 47, + 100, 198, 115, 182, 248, 234, 183, 15, 133, 201, 86, 226, 123, 76, 212, 211, + 43, 72, 207, 126, 128, 120, 97, 202, 115, 217, 176, 147, 233, 146, 178, 25, + 232, 120, 38, 67, 144, 61, 254, 55, 246, 222, 132, 75, 113, 28, 89, 20, + 254, 43, 62, 117, 207, 123, 83, 53, 144, 233, 29, 67, 223, 233, 254, 14, + 155, 217, 193, 236, 75, 191, 185, 117, 188, 130, 193, 27, 94, 0, 51, 231, + 254, 247, 79, 146, 13, 24, 48, 100, 118, 117, 245, 244, 50, 121, 42, 179, + 210, 10, 133, 228, 176, 20, 138, 8, 73, 161, 208, 120, 223, 182, 51, 82, + 81, 108, 225, 218, 92, 56, 74, 37, 61, 95, 232, 180, 55, 227, 202, 47, + 157, 254, 25, 209, 69, 224, 166, 26, 109, 48, 192, 137, 32, 16, 108, 151, + 235, 193, 145, 68, 251, 181, 2, 45, 186, 68, 42, 170, 229, 59, 156, 202, + 127, 52, 109, 45, 20, 168, 79, 63, 37, 47, 47, 255, 221, 167, 173, 233, + 219, 30, 198, 57, 28, 103, 233, 184, 161, 157, 145, 58, 209, 214, 121, 1, + 76, 105, 2, 186, 79, 23, 92, 167, 32, 76, 201, 3, 71, 229, 142, 242, + 112, 236, 54, 125, 198, 160, 241, 57, 167, 181, 183, 108, 111, 237, 23, 132, + 209, 174, 160, 9, 86, 65, 144, 156, 188, 6, 202, 100, 240, 21, 23, 228, + 114, 199, 78, 143, 13, 243, 77, 127, 109, 13, 14, 155, 153, 178, 89, 153, + 134, 165, 155, 220, 32, 135, 215, 101, 14, 111, 91, 5, 77, 178, 242, 66, + 101, 155, 239, 225, 176, 44, 168, 71, 24, 48, 221, 157, 197, 169, 199, 101, + 46, 115, 236, 209, 138, 78, 135, 249, 22, 21, 182, 115, 12, 168, 107, 225, + 229, 90, 115, 79, 228, 73, 99, 22, 6, 244, 174, 178, 165, 20, 220, 102, + 3, 215, 0, 191, 1, 40, 107, 23, 118, 154, 153, 199, 103, 160, 206, 50, + 40, 147, 1, 101, 107, 116, 232, 149, 55, 193, 214, 55, 117, 147, 180, 117, + 10, 39, 132, 201, 190, 232, 245, 56, 51, 175, 117, 74, 110, 64, 211, 61, + 114, 83, 219, 170, 180, 155, 199, 251, 45, 183, 71, 83, 2, 239, 58, 249, + 221, 136, 21, 248, 245, 177, 71, 186, 116, 151, 156, 55, 156, 204, 49, 236, + 25, 22, 209, 229, 37, 43, 84, 234, 86, 94, 107, 151, 24, 188, 88, 114, + 123, 76, 215, 81, 143, 148, 48, 217, 145, 61, 94, 129, 91, 240, 235, 130, + 208, 31, 216, 170, 199, 111, 51, 68, 219, 9, 246, 125, 59, 216, 57, 187, + 142, 88, 94, 218, 237, 227, 98, 70, 14, 199, 70, 171, 192, 10, 53, 130, + 222, 149, 152, 163, 90, 24, 236, 84, 102, 225, 245, 152, 186, 211, 219, 79, + 44, 213, 53, 15, 133, 114, 97, 223, 169, 135, 50, 179, 222, 75, 141, 46, + 116, 67, 152, 228, 240, 150, 65, 9, 53, 143, 86, 11, 226, 62, 195, 44, + 189, 128, 105, 184, 42, 179, 243, 84, 162, 227, 170, 100, 209, 83, 247, 131, + 173, 10, 202, 103, 60, 209, 12, 236, 133, 145, 177, 44, 58, 16, 166, 148, + 226, 122, 126, 167, 98, 251, 82, 198, 218, 230, 142, 254, 122, 145, 171, 235, + 141, 117, 32, 55, 164, 112, 104, 206, 8, 129, 36, 231, 83, 126, 157, 235, + 241, 35, 186, 99, 180, 61, 208, 7, 81, 251, 105, 163, 32, 191, 19, 86, + 121, 77, 40, 177, 90, 141, 102, 240, 154, 65, 225, 181, 62, 169, 213, 36, + 82, 168, 105, 212, 174, 100, 31, 50, 236, 238, 208, 99, 199, 251, 128, 219, + 0, 133, 48, 242, 122, 180, 149, 83, 15, 3, 64, 75, 101, 171, 30, 87, + 108, 102, 51, 52, 85, 75, 102, 50, 163, 237, 161, 195, 185, 126, 190, 237, + 57, 220, 108, 191, 217, 246, 84, 48, 227, 246, 86, 142, 57, 216, 44, 90, + 197, 229, 188, 190, 155, 89, 210, 126, 90, 231, 173, 5, 165, 29, 7, 166, + 64, 244, 205, 210, 100, 50, 153, 209, 93, 99, 198, 118, 39, 109, 182, 77, + 112, 107, 64, 143, 154, 23, 192, 140, 70, 107, 122, 161, 86, 171, 132, 66, + 217, 163, 131, 76, 229, 24, 20, 150, 251, 76, 161, 190, 11, 152, 66, 16, + 176, 74, 16, 144, 253, 64, 37, 65, 95, 146, 173, 32, 115, 104, 250, 234, + 222, 116, 213, 16, 39, 51, 158, 103, 247, 108, 197, 10, 236, 209, 166, 183, + 94, 51, 234, 172, 67, 170, 163, 33, 217, 107, 139, 116, 1, 223, 80, 93, + 110, 78, 21, 142, 210, 209, 183, 12, 162, 171, 173, 143, 93, 193, 11, 188, + 33, 29, 72, 174, 11, 180, 59, 25, 180, 215, 150, 219, 214, 15, 158, 219, + 54, 157, 118, 45, 112, 115, 153, 192, 221, 226, 158, 181, 61, 218, 96, 94, + 179, 211, 29, 106, 106, 54, 215, 7, 109, 81, 247, 180, 69, 185, 189, 158, + 211, 174, 216, 40, 21, 52, 139, 11, 230, 179, 245, 97, 92, 115, 195, 209, + 116, 77, 2, 158, 98, 132, 137, 149, 19, 120, 165, 61, 220, 216, 125, 146, + 220, 205, 224, 128, 236, 197, 118, 75, 109, 63, 83, 8, 46, 32, 244, 198, + 160, 222, 220, 113, 133, 156, 58, 210, 25, 127, 61, 211, 107, 121, 181, 214, + 207, 119, 240, 221, 206, 161, 21, 107, 76, 182, 51, 96, 26, 96, 150, 148, + 218, 161, 220, 31, 172, 51, 0, 206, 229, 50, 174, 69, 217, 211, 242, 210, + 220, 247, 42, 35, 187, 93, 213, 9, 80, 115, 43, 28, 142, 7, 165, 73, + 101, 221, 94, 40, 93, 99, 90, 240, 251, 124, 81, 219, 243, 101, 221, 8, + 42, 61, 153, 153, 9, 26, 181, 234, 135, 227, 45, 79, 56, 42, 109, 79, + 118, 242, 84, 57, 172, 130, 61, 69, 48, 69, 102, 46, 152, 200, 115, 210, + 207, 152, 195, 41, 91, 27, 18, 194, 142, 84, 216, 227, 110, 99, 177, 161, + 200, 242, 92, 83, 172, 30, 52, 191, 214, 227, 130, 154, 202, 204, 235, 146, + 92, 159, 218, 180, 238, 151, 9, 123, 200, 118, 11, 190, 52, 145, 228, 227, + 220, 62, 52, 54, 101, 119, 218, 159, 229, 10, 162, 72, 15, 149, 77, 199, + 242, 114, 211, 234, 97, 53, 99, 240, 86, 91, 145, 122, 190, 155, 15, 66, + 125, 34, 133, 157, 209, 102, 75, 15, 58, 22, 95, 148, 134, 237, 9, 171, + 183, 123, 149, 158, 173, 218, 222, 113, 164, 140, 154, 205, 96, 7, 180, 74, + 126, 71, 244, 166, 154, 185, 52, 253, 222, 52, 196, 247, 59, 63, 31, 148, + 250, 94, 78, 24, 59, 221, 194, 92, 145, 121, 199, 152, 4, 252, 106, 234, + 205, 73, 165, 93, 89, 6, 12, 85, 102, 55, 148, 82, 228, 51, 65, 179, + 128, 231, 104, 195, 33, 248, 130, 87, 38, 119, 220, 222, 17, 187, 116, 216, + 32, 216, 158, 49, 56, 218, 14, 233, 168, 234, 128, 170, 46, 231, 135, 204, + 50, 220, 85, 74, 59, 167, 80, 80, 36, 74, 159, 147, 197, 173, 49, 88, + 152, 229, 206, 186, 184, 149, 155, 213, 126, 41, 8, 107, 140, 171, 21, 132, + 157, 192, 248, 189, 252, 161, 58, 82, 123, 131, 190, 105, 131, 81, 95, 46, + 13, 115, 64, 226, 42, 158, 62, 166, 2, 66, 84, 66, 207, 119, 171, 195, + 98, 163, 177, 41, 13, 74, 85, 94, 152, 5, 242, 160, 208, 180, 164, 134, + 172, 172, 11, 211, 35, 197, 172, 3, 160, 240, 9, 50, 20, 181, 141, 179, + 171, 181, 194, 41, 46, 16, 85, 174, 80, 92, 28, 51, 33, 111, 219, 199, + 206, 177, 70, 118, 115, 133, 213, 242, 208, 36, 116, 109, 100, 204, 102, 173, + 73, 198, 192, 185, 176, 195, 111, 231, 163, 182, 189, 40, 215, 139, 75, 124, + 172, 81, 185, 234, 154, 176, 183, 21, 183, 48, 56, 174, 11, 85, 182, 217, + 172, 120, 101, 215, 111, 180, 184, 98, 189, 239, 109, 152, 182, 14, 140, 157, + 245, 210, 157, 53, 51, 254, 106, 211, 46, 119, 75, 109, 113, 180, 244, 170, + 181, 69, 175, 81, 63, 236, 234, 205, 118, 71, 243, 248, 26, 89, 153, 8, + 243, 113, 102, 190, 179, 180, 246, 152, 31, 140, 187, 165, 114, 171, 189, 104, + 182, 75, 37, 183, 5, 3, 243, 77, 22, 19, 7, 47, 11, 185, 190, 207, + 113, 158, 199, 231, 23, 254, 106, 217, 169, 149, 219, 116, 153, 119, 135, 229, + 118, 158, 235, 76, 180, 106, 94, 210, 248, 158, 185, 27, 170, 13, 81, 58, + 204, 103, 21, 74, 27, 218, 130, 222, 109, 172, 74, 115, 181, 155, 175, 110, + 88, 123, 27, 140, 55, 205, 14, 187, 49, 14, 195, 113, 160, 244, 14, 35, + 147, 51, 139, 160, 23, 77, 97, 80, 110, 15, 90, 45, 158, 37, 149, 86, + 105, 189, 175, 120, 77, 220, 16, 55, 251, 18, 23, 236, 45, 171, 81, 118, + 53, 170, 90, 26, 120, 84, 151, 162, 108, 17, 119, 131, 74, 91, 222, 108, + 42, 65, 173, 190, 238, 224, 69, 125, 232, 113, 93, 220, 47, 213, 186, 248, + 176, 55, 159, 119, 181, 221, 166, 163, 206, 166, 121, 97, 15, 196, 171, 232, + 116, 164, 82, 183, 191, 43, 137, 163, 80, 106, 52, 228, 96, 199, 169, 172, + 178, 168, 102, 90, 227, 169, 219, 192, 217, 205, 100, 65, 239, 36, 213, 91, + 111, 122, 173, 122, 199, 108, 122, 165, 137, 180, 48, 105, 47, 79, 177, 54, + 187, 16, 51, 181, 114, 208, 89, 152, 204, 76, 170, 174, 150, 64, 8, 228, + 4, 35, 168, 137, 134, 153, 175, 88, 121, 24, 247, 161, 226, 20, 86, 181, + 190, 217, 43, 106, 61, 31, 175, 31, 189, 217, 88, 118, 133, 131, 105, 181, + 7, 133, 218, 76, 37, 11, 120, 171, 50, 41, 6, 58, 49, 44, 23, 132, + 74, 174, 208, 168, 173, 233, 226, 116, 71, 212, 131, 205, 178, 49, 164, 113, + 121, 209, 206, 255, 226, 169, 31, 244, 226, 179, 45, 242, 236, 134, 1, 141, + 166, 23, 48, 137, 221, 64, 83, 169, 215, 37, 35, 35, 73, 128, 33, 130, + 150, 174, 8, 236, 239, 95, 31, 0, 232, 38, 8, 17, 164, 64, 209, 151, + 186, 236, 170, 226, 171, 4, 140, 15, 93, 134, 23, 186, 105, 135, 79, 63, + 9, 209, 99, 116, 107, 89, 68, 73, 93, 52, 20, 56, 9, 197, 134, 170, + 255, 54, 21, 212, 247, 183, 123, 170, 200, 221, 165, 24, 47, 215, 43, 62, + 83, 71, 62, 133, 108, 20, 88, 243, 52, 143, 108, 14, 199, 86, 7, 140, + 187, 86, 232, 185, 240, 204, 31, 12, 90, 8, 143, 254, 65, 33, 184, 7, + 182, 74, 46, 179, 115, 45, 54, 163, 20, 180, 25, 53, 49, 22, 179, 48, + 191, 107, 13, 55, 78, 171, 190, 98, 84, 218, 231, 84, 120, 180, 39, 143, + 11, 71, 96, 2, 249, 148, 98, 45, 128, 254, 246, 251, 99, 190, 194, 102, + 52, 139, 0, 118, 210, 22, 8, 237, 53, 147, 17, 198, 100, 119, 232, 108, + 69, 83, 52, 29, 23, 250, 33, 194, 16, 209, 208, 157, 111, 64, 40, 245, + 202, 30, 24, 68, 59, 14, 188, 41, 151, 209, 237, 109, 171, 178, 100, 186, + 96, 52, 206, 122, 71, 143, 171, 29, 128, 100, 3, 134, 198, 182, 165, 219, + 181, 210, 82, 100, 3, 201, 52, 65, 69, 48, 72, 95, 14, 252, 183, 2, + 10, 29, 186, 48, 2, 20, 248, 58, 122, 201, 244, 42, 128, 176, 28, 248, + 140, 233, 193, 147, 106, 46, 32, 64, 88, 51, 133, 157, 68, 21, 140, 197, + 116, 50, 155, 144, 74, 185, 191, 105, 64, 151, 200, 226, 190, 83, 134, 46, + 144, 128, 84, 246, 40, 211, 29, 182, 55, 50, 108, 177, 182, 132, 231, 149, + 214, 141, 176, 179, 168, 13, 54, 163, 234, 161, 163, 130, 143, 29, 171, 182, + 11, 61, 79, 43, 165, 234, 197, 189, 144, 165, 219, 98, 191, 52, 228, 57, + 166, 33, 218, 203, 213, 164, 223, 88, 171, 58, 65, 209, 21, 81, 100, 14, + 52, 96, 17, 154, 12, 39, 220, 110, 94, 106, 133, 157, 178, 96, 172, 84, + 186, 105, 46, 235, 157, 192, 220, 100, 220, 157, 84, 116, 139, 35, 99, 208, + 239, 48, 122, 51, 179, 236, 20, 7, 85, 166, 191, 168, 239, 202, 135, 10, + 111, 239, 121, 99, 191, 144, 235, 155, 182, 223, 45, 236, 13, 182, 91, 179, + 217, 121, 179, 81, 117, 182, 161, 54, 105, 230, 54, 194, 184, 60, 204, 180, + 219, 124, 102, 184, 91, 229, 252, 241, 188, 209, 225, 143, 199, 106, 222, 177, + 86, 13, 173, 120, 108, 174, 189, 109, 215, 205, 29, 151, 69, 178, 96, 134, + 198, 98, 117, 88, 174, 246, 226, 184, 59, 33, 215, 115, 106, 101, 120, 13, + 123, 198, 73, 249, 73, 85, 222, 229, 138, 221, 109, 119, 36, 30, 168, 126, + 163, 91, 224, 156, 61, 213, 24, 219, 2, 115, 104, 59, 56, 95, 15, 119, + 154, 37, 2, 41, 89, 43, 24, 69, 46, 87, 20, 138, 205, 245, 190, 185, + 203, 228, 39, 249, 253, 142, 40, 57, 59, 186, 10, 104, 94, 214, 247, 110, + 176, 31, 231, 153, 1, 59, 85, 123, 251, 242, 138, 156, 214, 59, 141, 98, + 166, 58, 29, 155, 21, 229, 48, 50, 24, 119, 220, 116, 87, 205, 170, 215, + 175, 6, 149, 97, 223, 25, 215, 243, 139, 92, 127, 45, 237, 170, 195, 149, + 86, 46, 110, 14, 98, 175, 155, 49, 169, 198, 182, 111, 145, 43, 187, 95, + 91, 22, 71, 117, 185, 100, 87, 71, 249, 174, 87, 29, 44, 91, 154, 86, + 28, 152, 229, 96, 189, 175, 245, 235, 243, 210, 116, 174, 244, 71, 139, 217, + 126, 89, 218, 251, 74, 125, 185, 175, 244, 247, 66, 134, 119, 141, 254, 178, + 179, 153, 90, 37, 182, 213, 42, 211, 238, 176, 150, 241, 115, 225, 126, 89, + 110, 155, 221, 157, 66, 22, 154, 222, 124, 90, 89, 100, 154, 1, 48, 132, + 5, 185, 38, 51, 60, 187, 206, 85, 90, 126, 211, 36, 58, 120, 183, 95, + 172, 207, 8, 124, 35, 116, 10, 133, 138, 218, 81, 252, 250, 116, 239, 213, + 192, 212, 190, 217, 173, 173, 100, 175, 40, 6, 196, 212, 201, 51, 60, 77, + 180, 73, 102, 185, 44, 233, 67, 189, 194, 78, 10, 108, 144, 177, 119, 44, + 149, 31, 143, 10, 155, 86, 190, 174, 31, 204, 218, 108, 91, 5, 58, 175, + 212, 29, 152, 126, 96, 244, 138, 6, 55, 156, 23, 189, 86, 96, 20, 61, + 185, 50, 48, 135, 238, 129, 179, 121, 109, 95, 45, 178, 147, 197, 177, 94, + 147, 137, 109, 203, 45, 78, 230, 155, 208, 155, 183, 91, 227, 80, 110, 84, + 121, 192, 95, 90, 94, 181, 75, 65, 173, 191, 175, 213, 230, 202, 161, 212, + 42, 78, 118, 174, 55, 222, 149, 141, 138, 46, 145, 141, 204, 158, 164, 69, + 127, 223, 3, 179, 226, 195, 76, 87, 199, 189, 98, 201, 89, 248, 161, 60, + 236, 85, 135, 149, 109, 70, 237, 230, 56, 81, 91, 77, 182, 248, 104, 38, + 151, 3, 165, 46, 44, 132, 166, 45, 52, 221, 53, 183, 96, 103, 158, 31, + 20, 108, 119, 83, 31, 55, 54, 13, 99, 177, 233, 148, 218, 84, 191, 211, + 155, 16, 124, 88, 84, 74, 139, 62, 49, 178, 107, 125, 189, 47, 8, 196, + 112, 33, 119, 137, 82, 151, 63, 230, 139, 78, 99, 237, 20, 115, 101, 155, + 60, 78, 216, 242, 161, 84, 235, 24, 203, 137, 220, 87, 246, 107, 188, 52, + 196, 151, 149, 190, 43, 77, 197, 125, 177, 164, 47, 224, 49, 159, 97, 153, + 214, 182, 96, 80, 85, 130, 226, 113, 19, 132, 162, 87, 45, 49, 45, 118, + 90, 90, 114, 141, 145, 39, 229, 215, 21, 182, 71, 8, 206, 81, 220, 50, + 108, 145, 63, 20, 140, 185, 129, 203, 69, 115, 95, 234, 239, 165, 9, 209, + 233, 141, 171, 65, 171, 232, 84, 104, 18, 31, 212, 44, 149, 245, 74, 163, + 105, 176, 92, 31, 26, 248, 146, 239, 251, 67, 130, 37, 166, 181, 162, 86, + 107, 247, 55, 22, 79, 205, 183, 115, 91, 229, 230, 77, 217, 11, 218, 131, + 126, 191, 56, 83, 188, 74, 183, 187, 170, 209, 250, 224, 168, 87, 56, 81, + 55, 155, 187, 150, 193, 85, 71, 250, 92, 171, 26, 27, 139, 24, 236, 103, + 118, 35, 172, 212, 42, 110, 179, 9, 88, 53, 55, 152, 142, 188, 188, 87, + 216, 55, 102, 155, 73, 222, 29, 150, 36, 125, 216, 108, 108, 135, 78, 121, + 57, 44, 91, 61, 10, 158, 136, 96, 203, 253, 246, 129, 20, 200, 38, 151, + 223, 40, 181, 166, 150, 227, 240, 125, 174, 95, 181, 4, 58, 212, 182, 60, + 78, 110, 214, 184, 232, 212, 247, 163, 101, 241, 151, 187, 21, 42, 186, 39, + 7, 158, 247, 234, 232, 7, 195, 123, 13, 60, 220, 199, 87, 170, 225, 188, + 248, 246, 11, 84, 46, 190, 250, 34, 190, 120, 170, 255, 98, 107, 47, 8, + 229, 37, 240, 94, 208, 125, 23, 113, 164, 59, 161, 49, 107, 15, 95, 199, + 67, 12, 221, 190, 162, 75, 129, 111, 187, 127, 164, 201, 117, 113, 129, 22, + 59, 103, 100, 126, 103, 133, 156, 32, 6, 170, 60, 36, 150, 249, 181, 207, + 10, 130, 203, 104, 245, 35, 183, 91, 7, 44, 62, 50, 41, 149, 107, 56, + 192, 216, 223, 101, 132, 125, 78, 155, 217, 84, 38, 179, 215, 58, 179, 142, + 171, 184, 96, 230, 16, 120, 138, 39, 108, 105, 188, 76, 235, 114, 144, 91, + 203, 84, 168, 229, 53, 37, 236, 105, 227, 64, 173, 84, 173, 194, 204, 32, + 3, 90, 61, 246, 214, 226, 65, 157, 13, 125, 31, 47, 153, 74, 43, 15, + 12, 130, 21, 209, 115, 5, 207, 167, 76, 169, 157, 51, 68, 151, 144, 13, + 171, 6, 99, 112, 149, 230, 68, 188, 95, 199, 78, 71, 212, 98, 91, 105, + 20, 67, 126, 37, 129, 249, 110, 166, 57, 245, 89, 139, 214, 242, 155, 146, + 63, 177, 93, 153, 172, 6, 153, 70, 37, 223, 44, 203, 77, 158, 207, 119, + 247, 58, 152, 201, 11, 7, 139, 181, 155, 139, 94, 65, 33, 15, 199, 74, + 195, 108, 128, 169, 203, 0, 24, 230, 199, 112, 44, 77, 129, 130, 209, 215, + 35, 220, 175, 247, 37, 137, 6, 195, 182, 231, 214, 251, 27, 35, 119, 84, + 104, 121, 44, 239, 10, 71, 15, 159, 5, 2, 229, 88, 246, 122, 89, 151, + 218, 11, 2, 88, 75, 129, 60, 233, 136, 38, 39, 154, 52, 177, 89, 224, + 97, 32, 245, 235, 43, 124, 49, 89, 20, 42, 173, 238, 216, 37, 183, 147, + 131, 224, 44, 28, 130, 105, 44, 148, 254, 196, 12, 164, 205, 113, 81, 105, + 23, 151, 252, 32, 148, 22, 46, 165, 215, 89, 191, 87, 175, 14, 229, 117, + 175, 53, 88, 141, 199, 115, 105, 116, 224, 152, 94, 191, 165, 27, 228, 174, + 205, 239, 20, 198, 155, 86, 202, 165, 149, 154, 153, 50, 149, 242, 90, 29, + 29, 58, 196, 234, 184, 235, 237, 38, 165, 18, 207, 116, 84, 98, 204, 141, + 43, 227, 61, 62, 109, 216, 67, 210, 240, 249, 93, 81, 95, 58, 225, 74, + 91, 118, 171, 244, 182, 205, 239, 215, 220, 184, 40, 151, 194, 202, 161, 108, + 86, 154, 249, 125, 121, 214, 227, 205, 98, 93, 245, 242, 249, 218, 158, 31, + 150, 155, 188, 160, 138, 165, 237, 84, 145, 154, 251, 82, 181, 215, 47, 193, + 59, 52, 85, 38, 87, 239, 22, 213, 241, 50, 236, 178, 157, 250, 174, 175, + 84, 75, 237, 53, 73, 119, 151, 149, 86, 83, 40, 194, 160, 156, 106, 183, + 164, 79, 149, 226, 36, 95, 202, 29, 38, 141, 86, 115, 95, 39, 75, 139, + 138, 177, 88, 231, 155, 237, 137, 207, 20, 45, 134, 197, 75, 249, 156, 92, + 235, 232, 160, 187, 44, 87, 183, 231, 77, 87, 217, 173, 200, 85, 125, 217, + 236, 14, 3, 191, 49, 109, 10, 222, 113, 30, 246, 22, 243, 78, 168, 211, + 139, 144, 47, 151, 205, 76, 189, 158, 207, 183, 86, 124, 161, 72, 211, 245, + 205, 55, 12, 72, 7, 93, 137, 69, 94, 172, 203, 211, 26, 156, 16, 103, + 68, 171, 88, 191, 126, 17, 238, 219, 47, 149, 97, 18, 3, 173, 24, 90, + 235, 21, 188, 68, 162, 72, 78, 78, 103, 133, 129, 221, 179, 100, 42, 197, + 189, 0, 15, 120, 244, 171, 37, 104, 129, 25, 131, 241, 132, 7, 6, 19, + 7, 77, 52, 96, 205, 149, 129, 117, 213, 132, 43, 50, 197, 101, 163, 12, + 172, 55, 5, 24, 100, 240, 180, 157, 11, 15, 139, 0, 43, 15, 200, 32, + 113, 12, 140, 185, 60, 60, 189, 49, 175, 149, 214, 192, 200, 171, 3, 131, + 206, 157, 145, 5, 21, 30, 254, 240, 93, 145, 84, 103, 6, 11, 140, 174, + 37, 176, 182, 8, 191, 61, 36, 54, 205, 242, 136, 2, 236, 15, 204, 175, + 97, 83, 159, 27, 123, 185, 94, 130, 7, 66, 224, 161, 146, 14, 48, 159, + 160, 181, 5, 45, 42, 171, 25, 202, 99, 190, 52, 130, 214, 31, 12, 235, + 14, 45, 63, 96, 225, 65, 3, 51, 7, 140, 196, 237, 96, 179, 224, 225, + 205, 33, 128, 64, 48, 77, 40, 23, 193, 207, 26, 20, 177, 248, 131, 60, + 133, 150, 161, 108, 53, 15, 48, 240, 29, 176, 226, 102, 240, 32, 9, 180, + 24, 161, 149, 55, 53, 156, 5, 168, 210, 3, 6, 165, 6, 138, 135, 22, + 200, 132, 7, 71, 242, 90, 253, 32, 78, 141, 109, 99, 188, 200, 192, 24, + 22, 37, 99, 19, 95, 184, 193, 76, 71, 36, 221, 114, 59, 165, 1, 191, + 24, 123, 229, 229, 158, 95, 169, 75, 101, 173, 91, 252, 78, 150, 72, 48, + 15, 230, 54, 248, 49, 239, 52, 155, 34, 183, 112, 27, 106, 183, 166, 152, + 162, 56, 58, 122, 21, 197, 158, 237, 248, 77, 78, 224, 71, 249, 131, 219, + 151, 154, 135, 69, 105, 193, 25, 245, 137, 216, 45, 31, 212, 238, 196, 53, + 204, 62, 83, 154, 28, 231, 248, 96, 73, 204, 55, 245, 169, 176, 175, 204, + 36, 115, 81, 47, 187, 199, 153, 226, 16, 203, 134, 53, 221, 246, 198, 102, + 73, 237, 102, 60, 199, 43, 119, 170, 124, 175, 126, 80, 11, 69, 101, 60, + 97, 234, 179, 189, 90, 156, 102, 106, 10, 183, 229, 203, 254, 88, 170, 29, + 27, 181, 242, 146, 179, 90, 71, 32, 131, 14, 5, 74, 6, 54, 104, 216, + 166, 3, 182, 71, 45, 105, 48, 16, 181, 174, 21, 168, 147, 217, 182, 48, + 171, 103, 76, 115, 72, 106, 155, 170, 2, 12, 80, 114, 63, 95, 204, 237, + 225, 193, 155, 14, 101, 182, 203, 181, 103, 109, 181, 70, 201, 237, 92, 190, + 69, 115, 197, 49, 173, 249, 37, 127, 58, 221, 186, 10, 140, 255, 43, 173, + 39, 51, 249, 56, 156, 135, 150, 76, 238, 240, 158, 210, 200, 24, 6, 45, + 132, 218, 94, 95, 109, 154, 11, 151, 12, 186, 53, 190, 108, 14, 11, 205, + 197, 193, 246, 42, 227, 21, 63, 116, 67, 189, 162, 87, 43, 165, 153, 199, + 238, 61, 124, 55, 104, 243, 92, 151, 44, 29, 243, 187, 194, 65, 48, 152, + 74, 133, 24, 230, 136, 18, 189, 154, 233, 64, 27, 75, 21, 218, 101, 183, + 86, 81, 41, 182, 66, 161, 111, 236, 136, 131, 34, 42, 133, 141, 91, 160, + 197, 60, 169, 52, 26, 225, 90, 104, 52, 119, 93, 190, 104, 201, 110, 216, + 219, 110, 234, 192, 82, 105, 230, 141, 126, 65, 84, 200, 230, 122, 85, 175, + 212, 74, 140, 182, 183, 6, 157, 129, 181, 169, 216, 252, 97, 84, 156, 239, + 122, 66, 33, 227, 237, 153, 161, 126, 172, 77, 171, 185, 249, 84, 40, 109, + 101, 59, 111, 116, 74, 179, 141, 191, 234, 231, 186, 141, 37, 113, 24, 54, + 143, 150, 196, 249, 5, 86, 236, 114, 211, 121, 171, 34, 12, 184, 126, 173, + 96, 250, 142, 224, 204, 237, 138, 169, 55, 189, 96, 27, 12, 74, 163, 138, + 66, 78, 102, 29, 145, 113, 51, 213, 160, 180, 219, 23, 169, 85, 217, 216, + 53, 153, 26, 152, 0, 252, 114, 1, 2, 231, 134, 209, 141, 162, 158, 15, + 254, 92, 228, 136, 168, 129, 97, 255, 162, 106, 240, 226, 101, 239, 229, 28, + 112, 11, 167, 217, 151, 179, 156, 121, 209, 128, 102, 143, 244, 59, 60, 106, + 160, 91, 203, 232, 80, 1, 20, 64, 3, 84, 233, 16, 86, 138, 209, 236, + 69, 8, 161, 235, 65, 163, 235, 22, 107, 81, 153, 63, 144, 254, 143, 67, + 24, 76, 218, 221, 250, 161, 213, 154, 30, 214, 179, 86, 105, 212, 99, 4, + 55, 103, 45, 236, 249, 118, 54, 85, 205, 102, 175, 203, 148, 186, 109, 107, + 226, 75, 219, 227, 64, 36, 11, 226, 120, 161, 54, 218, 27, 183, 217, 8, + 197, 126, 174, 208, 85, 38, 44, 24, 245, 243, 112, 44, 218, 130, 151, 163, + 183, 141, 57, 237, 180, 218, 180, 37, 46, 169, 254, 177, 206, 91, 51, 153, + 92, 27, 214, 166, 112, 236, 111, 200, 17, 63, 86, 236, 206, 136, 156, 29, + 90, 5, 79, 108, 173, 119, 116, 174, 180, 24, 178, 51, 61, 215, 172, 108, + 115, 204, 168, 42, 209, 146, 190, 153, 226, 171, 149, 185, 27, 42, 211, 182, + 202, 144, 206, 182, 199, 175, 151, 226, 164, 193, 214, 54, 102, 175, 122, 172, + 55, 251, 122, 144, 231, 87, 108, 192, 118, 123, 21, 54, 175, 108, 201, 252, + 68, 223, 231, 97, 68, 91, 220, 160, 164, 131, 15, 230, 122, 91, 179, 69, + 42, 99, 22, 183, 115, 44, 231, 228, 156, 238, 98, 216, 228, 167, 253, 57, + 55, 163, 236, 195, 184, 207, 24, 124, 119, 46, 250, 202, 44, 179, 89, 205, + 66, 73, 178, 116, 82, 162, 103, 38, 85, 47, 49, 19, 138, 29, 181, 204, + 220, 112, 54, 165, 152, 133, 105, 234, 243, 169, 90, 155, 212, 68, 101, 92, + 43, 169, 205, 90, 169, 81, 231, 183, 181, 161, 97, 53, 23, 147, 213, 132, + 159, 180, 251, 162, 193, 251, 141, 42, 46, 204, 198, 198, 164, 85, 213, 241, + 126, 85, 90, 31, 54, 83, 191, 3, 76, 90, 134, 168, 41, 189, 74, 102, + 216, 28, 29, 152, 230, 49, 176, 235, 235, 181, 220, 169, 40, 13, 190, 210, + 98, 107, 97, 160, 85, 203, 195, 66, 163, 68, 21, 115, 133, 99, 125, 239, + 233, 163, 124, 155, 243, 88, 119, 16, 178, 34, 61, 231, 182, 66, 205, 219, + 182, 202, 166, 19, 148, 212, 197, 100, 160, 52, 219, 245, 227, 220, 26, 153, + 140, 213, 88, 49, 98, 83, 110, 52, 39, 179, 250, 110, 197, 90, 64, 150, + 213, 93, 115, 71, 207, 140, 28, 69, 47, 149, 90, 15, 151, 77, 129, 159, + 85, 201, 78, 187, 74, 143, 150, 85, 119, 181, 172, 26, 181, 126, 85, 173, + 246, 8, 89, 175, 85, 149, 102, 141, 16, 12, 121, 220, 170, 215, 171, 149, + 230, 228, 152, 99, 155, 21, 90, 19, 42, 43, 131, 63, 86, 198, 237, 161, + 85, 110, 15, 167, 149, 99, 175, 102, 18, 138, 15, 198, 127, 73, 37, 219, + 170, 152, 151, 202, 117, 78, 170, 12, 119, 219, 92, 87, 203, 109, 121, 58, + 167, 9, 225, 118, 214, 93, 111, 155, 219, 213, 182, 154, 235, 111, 75, 148, + 194, 154, 129, 222, 92, 55, 89, 103, 186, 54, 155, 252, 112, 213, 44, 21, + 136, 121, 230, 16, 48, 134, 57, 97, 172, 41, 99, 15, 134, 93, 107, 221, + 220, 214, 219, 93, 101, 86, 219, 42, 166, 94, 239, 78, 103, 10, 67, 141, + 116, 114, 218, 53, 122, 211, 118, 109, 70, 213, 194, 9, 31, 82, 11, 48, + 194, 39, 164, 51, 236, 25, 238, 108, 74, 90, 230, 134, 31, 83, 109, 163, + 109, 123, 70, 185, 55, 216, 228, 252, 65, 149, 100, 187, 213, 157, 225, 16, + 174, 49, 171, 218, 220, 156, 80, 167, 221, 241, 68, 17, 170, 165, 77, 125, + 116, 92, 142, 142, 214, 176, 59, 178, 58, 205, 145, 54, 26, 148, 169, 125, + 61, 20, 202, 92, 193, 28, 7, 249, 225, 214, 203, 247, 182, 22, 87, 32, + 182, 220, 66, 217, 182, 193, 139, 185, 233, 209, 149, 160, 79, 91, 166, 226, + 183, 252, 80, 17, 85, 101, 159, 155, 58, 238, 226, 168, 175, 89, 69, 59, + 46, 132, 202, 206, 206, 1, 174, 103, 183, 11, 102, 214, 223, 215, 57, 222, + 170, 251, 185, 233, 108, 67, 116, 105, 96, 249, 90, 35, 227, 56, 13, 9, + 179, 118, 176, 218, 211, 163, 175, 79, 109, 155, 167, 156, 234, 130, 178, 54, + 135, 169, 204, 52, 167, 83, 70, 159, 10, 234, 222, 192, 59, 3, 18, 159, + 91, 60, 89, 233, 79, 244, 121, 203, 16, 123, 115, 114, 166, 185, 68, 176, + 94, 174, 243, 82, 103, 13, 207, 116, 179, 116, 69, 87, 135, 84, 91, 23, + 245, 220, 134, 153, 230, 36, 153, 94, 20, 150, 251, 133, 217, 90, 54, 43, + 7, 183, 193, 29, 183, 141, 208, 32, 27, 190, 223, 159, 79, 196, 181, 93, + 238, 172, 172, 112, 58, 175, 59, 243, 49, 229, 46, 93, 83, 237, 109, 204, + 169, 211, 174, 85, 122, 27, 146, 155, 235, 19, 151, 111, 79, 0, 111, 27, + 117, 160, 215, 166, 140, 188, 94, 116, 154, 235, 226, 114, 178, 178, 15, 254, + 170, 93, 69, 203, 79, 196, 57, 132, 193, 96, 49, 25, 137, 227, 193, 186, + 230, 50, 237, 70, 173, 82, 236, 23, 7, 85, 190, 89, 149, 22, 80, 159, + 151, 53, 201, 51, 125, 186, 23, 40, 156, 167, 88, 11, 154, 228, 182, 104, + 9, 94, 61, 224, 20, 143, 203, 28, 199, 145, 154, 5, 196, 57, 183, 182, + 232, 210, 194, 160, 50, 117, 65, 90, 251, 179, 129, 216, 172, 139, 204, 192, + 163, 57, 63, 119, 244, 233, 230, 90, 81, 195, 65, 35, 12, 166, 99, 126, + 49, 53, 150, 181, 130, 97, 173, 220, 169, 27, 82, 5, 175, 62, 194, 199, + 93, 122, 179, 199, 249, 3, 63, 11, 92, 230, 168, 184, 110, 40, 135, 249, + 85, 99, 121, 40, 30, 5, 62, 167, 241, 126, 110, 3, 175, 100, 26, 151, + 250, 99, 165, 199, 22, 181, 201, 33, 148, 154, 61, 226, 8, 166, 181, 196, + 182, 76, 115, 211, 94, 183, 224, 112, 153, 77, 25, 76, 221, 198, 250, 166, + 181, 18, 215, 21, 178, 111, 49, 20, 223, 247, 188, 253, 150, 169, 57, 214, + 246, 176, 235, 105, 195, 70, 239, 48, 5, 22, 197, 112, 223, 58, 184, 115, + 188, 193, 13, 26, 185, 140, 233, 111, 220, 226, 208, 175, 52, 253, 194, 209, + 89, 242, 96, 242, 2, 116, 72, 187, 178, 204, 169, 149, 67, 163, 193, 153, + 96, 144, 41, 237, 209, 52, 52, 75, 210, 82, 55, 165, 49, 238, 76, 55, + 71, 70, 37, 235, 104, 213, 106, 192, 209, 76, 105, 192, 242, 29, 134, 85, + 6, 150, 67, 244, 143, 91, 69, 50, 87, 118, 169, 221, 102, 50, 83, 113, + 199, 56, 236, 108, 6, 108, 34, 209, 146, 195, 230, 200, 228, 130, 9, 17, + 228, 221, 69, 96, 15, 2, 177, 214, 52, 231, 181, 14, 191, 92, 118, 138, + 202, 222, 200, 180, 135, 20, 27, 50, 180, 58, 81, 122, 83, 174, 53, 180, + 183, 170, 59, 162, 171, 211, 176, 51, 170, 21, 205, 78, 105, 213, 153, 172, + 22, 253, 150, 70, 54, 129, 61, 200, 106, 245, 202, 68, 158, 73, 91, 161, + 146, 175, 86, 253, 138, 2, 12, 159, 112, 3, 148, 236, 178, 215, 44, 110, + 155, 86, 166, 71, 155, 25, 81, 159, 108, 27, 187, 129, 98, 104, 61, 62, + 60, 48, 37, 119, 186, 232, 13, 121, 99, 52, 38, 59, 197, 69, 177, 218, + 56, 118, 136, 194, 68, 211, 236, 177, 198, 116, 51, 71, 53, 223, 83, 106, + 188, 86, 106, 57, 179, 69, 121, 144, 171, 245, 43, 198, 176, 176, 42, 7, + 210, 113, 91, 230, 128, 117, 193, 217, 27, 127, 52, 203, 73, 61, 122, 200, + 113, 106, 134, 172, 134, 27, 167, 178, 92, 232, 29, 1, 215, 133, 109, 126, + 86, 240, 54, 106, 145, 37, 186, 228, 182, 123, 44, 77, 58, 165, 206, 188, + 91, 82, 246, 56, 21, 150, 55, 123, 114, 88, 247, 55, 122, 85, 59, 22, + 138, 132, 175, 84, 29, 147, 242, 119, 243, 128, 111, 229, 251, 46, 211, 28, + 210, 251, 202, 209, 100, 85, 230, 104, 52, 27, 77, 190, 161, 246, 171, 189, + 213, 184, 165, 225, 38, 239, 49, 37, 222, 206, 217, 126, 221, 54, 23, 229, + 67, 95, 24, 216, 171, 128, 115, 26, 139, 214, 88, 224, 7, 58, 232, 72, + 86, 57, 22, 10, 84, 91, 172, 49, 157, 70, 126, 230, 213, 242, 220, 32, + 168, 22, 130, 98, 107, 82, 82, 182, 221, 32, 220, 42, 142, 56, 44, 118, + 220, 246, 186, 79, 218, 20, 213, 26, 181, 129, 101, 61, 56, 236, 181, 18, + 179, 159, 200, 252, 248, 80, 166, 199, 226, 92, 242, 148, 97, 69, 222, 44, + 87, 123, 185, 109, 43, 146, 151, 151, 196, 189, 159, 11, 212, 99, 127, 183, + 102, 61, 99, 204, 83, 120, 123, 179, 24, 73, 19, 33, 39, 79, 189, 140, + 174, 246, 59, 61, 67, 220, 173, 196, 157, 231, 52, 55, 150, 57, 217, 132, + 220, 96, 239, 76, 37, 70, 31, 118, 117, 107, 43, 214, 77, 53, 24, 183, + 122, 135, 154, 86, 154, 44, 218, 165, 86, 64, 100, 152, 254, 166, 196, 180, + 72, 48, 66, 246, 45, 83, 44, 248, 57, 96, 122, 186, 211, 206, 222, 9, + 229, 137, 208, 173, 204, 235, 227, 122, 189, 197, 134, 108, 208, 242, 123, 28, + 49, 110, 89, 147, 173, 100, 145, 182, 200, 155, 139, 157, 40, 213, 22, 235, + 217, 113, 239, 28, 75, 254, 206, 165, 139, 229, 109, 127, 207, 82, 44, 5, + 175, 204, 211, 87, 178, 89, 42, 6, 198, 210, 228, 247, 171, 165, 49, 172, + 172, 228, 94, 101, 205, 112, 19, 183, 176, 89, 86, 234, 214, 56, 60, 230, + 220, 112, 194, 201, 220, 186, 60, 15, 218, 194, 204, 92, 152, 44, 176, 238, + 219, 125, 106, 49, 244, 236, 86, 247, 200, 22, 215, 14, 152, 118, 52, 247, + 77, 26, 216, 128, 19, 14, 63, 234, 243, 89, 192, 10, 77, 203, 221, 83, + 110, 179, 53, 13, 54, 220, 220, 81, 249, 213, 106, 86, 213, 54, 157, 86, + 227, 112, 48, 220, 69, 110, 160, 224, 236, 65, 225, 26, 70, 99, 177, 16, + 154, 187, 90, 103, 216, 215, 104, 59, 35, 84, 152, 246, 1, 47, 138, 181, + 254, 188, 70, 104, 148, 199, 47, 189, 85, 75, 230, 90, 135, 73, 105, 81, + 234, 105, 115, 103, 186, 159, 6, 142, 152, 243, 139, 163, 10, 125, 40, 54, + 242, 189, 101, 117, 160, 45, 150, 97, 67, 167, 187, 116, 179, 93, 110, 13, + 14, 163, 156, 235, 101, 60, 67, 49, 253, 234, 164, 187, 238, 90, 189, 125, + 93, 219, 86, 166, 141, 46, 59, 31, 40, 5, 15, 232, 207, 82, 191, 84, + 28, 212, 123, 203, 220, 174, 220, 203, 53, 166, 109, 215, 216, 234, 123, 179, + 107, 105, 130, 149, 43, 238, 231, 171, 217, 82, 227, 196, 46, 16, 171, 3, + 171, 200, 180, 138, 57, 150, 9, 150, 61, 92, 146, 57, 223, 12, 187, 68, + 119, 53, 43, 172, 138, 195, 74, 115, 43, 177, 106, 41, 220, 12, 187, 133, + 22, 175, 204, 248, 162, 203, 15, 71, 251, 57, 45, 150, 52, 149, 106, 182, + 121, 126, 225, 244, 51, 86, 197, 162, 153, 101, 96, 108, 248, 169, 3, 20, + 227, 36, 167, 137, 212, 220, 44, 123, 179, 177, 54, 169, 75, 213, 22, 137, + 131, 233, 88, 43, 160, 51, 149, 134, 63, 107, 113, 135, 2, 147, 35, 169, + 190, 220, 17, 143, 139, 111, 52, 85, 175, 194, 33, 120, 43, 48, 11, 132, + 241, 177, 134, 209, 3, 86, 148, 128, 217, 167, 255, 238, 142, 27, 213, 211, + 148, 23, 29, 220, 157, 206, 230, 34, 220, 177, 168, 209, 227, 104, 1, 126, + 165, 210, 83, 113, 30, 78, 200, 193, 166, 158, 239, 226, 242, 84, 228, 138, + 199, 178, 94, 110, 232, 157, 96, 88, 154, 210, 69, 95, 92, 206, 219, 253, + 169, 238, 59, 125, 145, 155, 76, 196, 227, 96, 217, 105, 75, 85, 189, 26, + 232, 254, 118, 48, 16, 115, 211, 229, 96, 124, 224, 71, 3, 109, 173, 119, + 68, 123, 82, 11, 186, 125, 147, 108, 136, 226, 186, 93, 226, 166, 45, 73, + 30, 82, 69, 192, 200, 126, 165, 2, 79, 19, 41, 172, 204, 201, 25, 124, + 84, 81, 51, 121, 174, 176, 103, 43, 196, 142, 26, 225, 184, 176, 18, 80, + 84, 29, 107, 39, 227, 156, 32, 111, 114, 221, 142, 155, 211, 10, 174, 232, + 30, 202, 91, 173, 86, 220, 30, 235, 35, 113, 131, 119, 241, 186, 217, 30, + 208, 42, 222, 114, 182, 108, 168, 72, 126, 3, 95, 76, 228, 5, 78, 211, + 156, 98, 248, 11, 240, 250, 80, 242, 68, 71, 8, 73, 186, 151, 43, 173, + 43, 109, 166, 73, 109, 118, 161, 146, 47, 14, 149, 124, 67, 235, 118, 43, + 129, 95, 31, 86, 200, 57, 83, 107, 230, 134, 67, 75, 93, 83, 83, 111, + 34, 12, 12, 169, 91, 145, 91, 228, 68, 236, 108, 25, 198, 161, 56, 145, + 212, 214, 195, 110, 241, 16, 168, 203, 225, 65, 94, 175, 171, 190, 181, 98, + 189, 61, 219, 218, 142, 192, 8, 80, 43, 108, 134, 222, 179, 243, 21, 175, + 9, 92, 215, 230, 70, 180, 56, 232, 186, 210, 118, 106, 28, 41, 155, 41, + 173, 105, 62, 191, 229, 112, 175, 45, 185, 59, 169, 66, 108, 215, 170, 53, + 229, 250, 140, 213, 164, 107, 189, 201, 138, 46, 84, 234, 221, 118, 99, 26, + 20, 248, 177, 31, 170, 155, 238, 168, 176, 146, 70, 93, 177, 45, 12, 15, + 115, 188, 106, 236, 76, 155, 117, 155, 162, 155, 177, 54, 164, 52, 153, 213, + 248, 41, 143, 139, 5, 170, 174, 26, 26, 187, 156, 120, 93, 191, 192, 149, + 39, 173, 169, 49, 40, 29, 140, 252, 202, 150, 151, 35, 119, 221, 22, 138, + 163, 113, 173, 83, 54, 183, 225, 145, 175, 117, 60, 121, 235, 242, 114, 171, + 110, 117, 23, 147, 153, 18, 170, 154, 184, 81, 38, 4, 55, 167, 101, 106, + 70, 4, 50, 46, 238, 229, 214, 212, 175, 107, 7, 166, 62, 222, 153, 226, + 194, 208, 133, 209, 66, 116, 217, 201, 200, 29, 150, 230, 97, 29, 136, 18, + 220, 110, 205, 139, 174, 84, 108, 185, 74, 159, 245, 7, 226, 98, 235, 87, + 186, 254, 90, 119, 234, 3, 73, 9, 232, 5, 119, 164, 187, 69, 169, 217, + 210, 233, 176, 220, 18, 23, 181, 25, 12, 15, 148, 203, 209, 135, 170, 218, + 41, 243, 68, 177, 60, 234, 78, 173, 195, 204, 178, 22, 102, 195, 13, 59, + 253, 17, 53, 15, 216, 141, 145, 91, 146, 180, 83, 203, 148, 25, 246, 88, + 86, 214, 158, 50, 56, 76, 106, 70, 21, 247, 132, 193, 164, 81, 176, 250, + 126, 167, 183, 152, 129, 246, 146, 218, 157, 41, 30, 140, 134, 147, 74, 69, + 202, 131, 41, 0, 187, 90, 180, 71, 35, 62, 67, 231, 6, 171, 78, 93, + 176, 201, 90, 206, 93, 79, 118, 148, 212, 52, 233, 129, 168, 245, 132, 53, + 208, 180, 18, 181, 20, 58, 110, 83, 159, 243, 124, 143, 158, 133, 141, 66, + 97, 84, 57, 142, 39, 20, 71, 120, 52, 75, 238, 194, 166, 182, 22, 37, + 109, 182, 238, 214, 131, 49, 67, 153, 212, 68, 24, 77, 69, 147, 227, 247, + 128, 251, 41, 155, 88, 89, 234, 112, 218, 221, 133, 78, 101, 215, 245, 59, + 93, 19, 152, 155, 204, 160, 103, 2, 139, 108, 184, 119, 59, 187, 118, 43, + 175, 78, 53, 60, 156, 111, 51, 182, 182, 225, 87, 243, 189, 181, 239, 249, + 125, 90, 29, 21, 185, 153, 211, 53, 76, 231, 184, 46, 73, 129, 7, 52, + 53, 181, 60, 24, 123, 120, 23, 135, 118, 216, 144, 164, 63, 239, 109, 23, + 59, 71, 213, 40, 183, 76, 150, 136, 250, 118, 63, 179, 12, 113, 182, 5, + 3, 141, 167, 215, 163, 69, 103, 151, 17, 212, 188, 184, 11, 195, 81, 183, + 165, 251, 249, 131, 236, 239, 157, 162, 39, 42, 149, 157, 56, 221, 115, 142, + 27, 208, 170, 239, 231, 103, 86, 111, 110, 76, 249, 195, 160, 37, 86, 237, + 89, 75, 233, 119, 117, 110, 93, 21, 133, 102, 198, 105, 128, 206, 59, 82, + 109, 55, 39, 171, 179, 149, 215, 247, 109, 118, 96, 185, 51, 34, 87, 153, + 214, 166, 110, 223, 6, 179, 148, 74, 167, 183, 60, 244, 195, 253, 209, 104, + 0, 81, 92, 150, 221, 21, 179, 62, 182, 181, 226, 164, 94, 168, 234, 57, + 120, 131, 137, 172, 20, 204, 6, 13, 116, 209, 56, 55, 29, 203, 163, 33, + 179, 223, 171, 92, 168, 76, 86, 100, 139, 97, 39, 147, 230, 94, 164, 194, + 102, 73, 8, 114, 194, 1, 111, 208, 5, 198, 28, 49, 142, 96, 183, 137, + 13, 174, 119, 173, 195, 184, 205, 176, 121, 131, 175, 77, 240, 125, 168, 173, + 88, 125, 84, 26, 234, 213, 117, 87, 95, 172, 247, 243, 32, 180, 55, 18, + 211, 239, 203, 97, 79, 111, 237, 25, 161, 49, 204, 208, 194, 66, 107, 119, + 213, 254, 248, 160, 213, 15, 227, 177, 185, 171, 10, 74, 93, 146, 107, 71, + 93, 194, 135, 102, 117, 215, 16, 185, 89, 173, 33, 50, 100, 184, 155, 82, + 228, 186, 46, 76, 123, 52, 176, 197, 88, 135, 53, 215, 199, 14, 91, 162, + 65, 135, 174, 143, 179, 233, 65, 229, 128, 97, 233, 40, 185, 166, 72, 117, + 234, 249, 213, 130, 9, 27, 158, 191, 87, 242, 230, 174, 177, 63, 214, 168, + 160, 214, 28, 54, 92, 121, 177, 16, 197, 233, 65, 178, 154, 243, 133, 216, + 154, 152, 3, 79, 58, 40, 75, 240, 183, 172, 119, 198, 98, 117, 215, 92, + 206, 53, 165, 58, 217, 16, 157, 70, 103, 212, 170, 106, 117, 97, 99, 31, + 123, 97, 67, 238, 179, 85, 141, 215, 203, 237, 234, 190, 17, 48, 65, 110, + 49, 145, 166, 196, 144, 152, 84, 45, 80, 197, 72, 107, 28, 240, 250, 138, + 105, 150, 77, 201, 42, 216, 171, 53, 75, 216, 128, 251, 5, 102, 181, 24, + 50, 133, 254, 56, 183, 27, 88, 221, 13, 81, 182, 234, 93, 157, 29, 178, + 161, 129, 175, 172, 133, 223, 43, 4, 132, 61, 89, 109, 155, 163, 92, 173, + 118, 104, 40, 125, 198, 103, 103, 29, 81, 111, 109, 76, 77, 80, 221, 238, + 132, 241, 50, 65, 102, 99, 216, 195, 60, 233, 110, 122, 238, 84, 15, 60, + 133, 154, 133, 123, 162, 183, 24, 53, 155, 2, 144, 212, 224, 19, 90, 205, + 220, 156, 89, 20, 172, 78, 129, 222, 56, 252, 140, 27, 117, 58, 222, 174, + 211, 116, 9, 75, 10, 233, 230, 96, 59, 0, 98, 122, 206, 10, 57, 105, + 178, 173, 26, 67, 125, 222, 54, 246, 86, 67, 106, 119, 139, 141, 61, 123, + 48, 240, 70, 229, 112, 148, 64, 185, 209, 126, 212, 11, 59, 58, 19, 244, + 230, 181, 113, 203, 211, 231, 203, 118, 223, 90, 110, 72, 217, 163, 121, 188, + 197, 247, 77, 190, 178, 43, 81, 92, 195, 108, 74, 245, 102, 47, 231, 207, + 247, 92, 223, 92, 181, 105, 222, 173, 129, 137, 181, 164, 29, 246, 214, 96, + 86, 56, 72, 147, 218, 97, 183, 88, 131, 254, 28, 109, 6, 229, 69, 208, + 170, 25, 244, 97, 102, 52, 203, 229, 253, 124, 222, 98, 43, 45, 156, 84, + 187, 10, 219, 21, 44, 209, 94, 28, 194, 142, 48, 88, 242, 60, 107, 4, + 65, 176, 169, 172, 243, 122, 167, 185, 219, 73, 108, 173, 47, 17, 135, 78, + 70, 180, 109, 199, 113, 117, 122, 111, 78, 44, 131, 234, 115, 45, 125, 133, + 19, 108, 215, 52, 183, 102, 165, 221, 208, 245, 128, 33, 233, 181, 38, 119, + 188, 99, 147, 173, 26, 146, 92, 111, 202, 134, 44, 245, 247, 171, 154, 222, + 219, 17, 179, 170, 51, 228, 3, 157, 89, 78, 194, 177, 149, 11, 115, 20, + 187, 41, 23, 8, 222, 109, 28, 90, 214, 162, 58, 99, 27, 222, 97, 88, + 29, 218, 38, 169, 149, 103, 252, 76, 111, 245, 218, 130, 86, 151, 212, 202, + 36, 36, 6, 69, 184, 145, 221, 196, 133, 18, 35, 12, 27, 211, 85, 189, + 212, 157, 200, 251, 131, 155, 19, 157, 65, 175, 203, 53, 149, 46, 238, 168, + 37, 169, 60, 161, 72, 113, 171, 205, 72, 191, 223, 19, 107, 25, 122, 196, + 211, 225, 116, 133, 111, 53, 255, 232, 182, 182, 110, 181, 185, 165, 193, 228, + 85, 47, 29, 229, 141, 92, 110, 111, 243, 83, 110, 162, 76, 3, 57, 32, + 114, 78, 123, 157, 39, 123, 178, 36, 202, 52, 213, 171, 240, 98, 142, 56, + 174, 137, 140, 220, 88, 236, 166, 153, 230, 116, 227, 42, 243, 190, 70, 21, + 248, 245, 186, 238, 182, 135, 185, 209, 172, 57, 217, 106, 106, 121, 199, 14, + 114, 114, 134, 168, 169, 34, 53, 33, 87, 227, 25, 153, 103, 200, 209, 74, + 157, 115, 83, 222, 175, 239, 74, 179, 13, 27, 238, 72, 214, 41, 13, 56, + 163, 35, 79, 71, 7, 93, 235, 7, 84, 105, 162, 181, 143, 27, 189, 182, + 207, 24, 228, 172, 112, 4, 242, 169, 112, 212, 140, 252, 110, 221, 211, 142, + 253, 224, 208, 40, 183, 85, 189, 19, 46, 87, 141, 53, 51, 50, 92, 43, + 12, 116, 91, 222, 250, 25, 111, 164, 235, 108, 87, 170, 245, 205, 29, 97, + 104, 131, 220, 156, 224, 66, 150, 242, 106, 179, 122, 107, 49, 32, 107, 199, + 67, 67, 238, 229, 91, 150, 70, 85, 217, 210, 136, 108, 148, 214, 235, 110, + 101, 67, 80, 42, 73, 244, 86, 238, 110, 73, 14, 68, 111, 156, 39, 230, + 68, 143, 87, 187, 116, 102, 179, 39, 230, 155, 201, 130, 164, 119, 218, 226, + 32, 233, 150, 102, 23, 194, 61, 152, 252, 77, 106, 82, 161, 230, 120, 138, + 177, 200, 172, 9, 75, 247, 150, 178, 184, 144, 6, 254, 218, 45, 173, 213, + 33, 63, 236, 247, 22, 93, 191, 49, 202, 120, 179, 114, 184, 171, 40, 11, + 177, 86, 15, 183, 53, 209, 183, 142, 98, 111, 169, 117, 241, 242, 206, 119, + 109, 39, 51, 242, 161, 221, 90, 109, 236, 212, 249, 102, 177, 36, 171, 244, + 161, 109, 54, 69, 220, 212, 38, 18, 141, 31, 250, 108, 129, 173, 3, 211, + 152, 234, 13, 231, 192, 232, 114, 44, 119, 227, 238, 229, 145, 216, 147, 24, + 121, 177, 17, 131, 242, 129, 146, 107, 45, 28, 136, 53, 114, 182, 22, 247, + 157, 233, 80, 153, 80, 59, 103, 108, 226, 11, 174, 162, 247, 203, 214, 34, + 99, 229, 247, 185, 99, 55, 95, 218, 49, 37, 47, 35, 12, 143, 3, 133, + 94, 140, 191, 205, 217, 198, 51, 69, 195, 88, 41, 200, 68, 4, 191, 102, + 96, 233, 126, 136, 155, 246, 78, 87, 95, 12, 96, 59, 122, 47, 138, 189, + 183, 12, 91, 84, 128, 229, 8, 113, 235, 149, 104, 121, 18, 58, 26, 171, + 88, 27, 160, 188, 51, 214, 73, 210, 249, 197, 83, 29, 209, 21, 125, 219, + 253, 252, 229, 206, 160, 68, 20, 253, 84, 12, 252, 149, 237, 254, 128, 253, + 67, 255, 169, 34, 238, 116, 5, 27, 121, 242, 42, 48, 29, 213, 53, 254, + 239, 127, 81, 52, 253, 223, 255, 192, 245, 159, 94, 177, 228, 247, 189, 231, + 255, 54, 92, 150, 245, 177, 177, 3, 172, 84, 21, 213, 78, 17, 100, 1, + 39, 9, 156, 36, 81, 141, 255, 192, 163, 247, 159, 63, 1, 173, 190, 106, + 129, 129, 149, 12, 91, 242, 126, 208, 14, 95, 229, 24, 242, 85, 130, 144, + 236, 29, 4, 222, 172, 0, 218, 102, 127, 250, 50, 84, 131, 231, 0, 99, + 252, 71, 121, 101, 235, 178, 250, 153, 204, 126, 26, 14, 106, 165, 79, 217, + 79, 109, 221, 82, 69, 23, 139, 19, 162, 116, 105, 185, 18, 104, 212, 165, + 107, 7, 150, 18, 145, 240, 35, 122, 201, 231, 255, 146, 243, 240, 31, 65, + 156, 17, 43, 186, 231, 24, 98, 136, 232, 139, 182, 138, 109, 195, 251, 17, + 216, 253, 198, 103, 242, 203, 211, 38, 71, 37, 200, 31, 29, 91, 183, 252, + 207, 20, 155, 5, 63, 36, 248, 71, 196, 255, 216, 51, 226, 64, 84, 128, + 168, 143, 17, 89, 144, 3, 179, 147, 136, 95, 137, 235, 58, 175, 73, 214, + 52, 130, 72, 16, 124, 226, 137, 23, 50, 123, 250, 121, 155, 78, 42, 126, + 59, 247, 29, 201, 164, 174, 201, 36, 8, 72, 232, 175, 35, 19, 163, 47, + 175, 231, 190, 23, 157, 244, 45, 157, 144, 210, 95, 73, 39, 115, 122, 125, + 182, 64, 192, 66, 223, 131, 78, 230, 182, 219, 191, 67, 123, 178, 191, 1, + 157, 236, 61, 123, 254, 234, 246, 204, 253, 6, 116, 230, 238, 249, 243, 87, + 211, 201, 253, 6, 116, 114, 247, 253, 254, 171, 233, 204, 255, 6, 116, 230, + 239, 199, 209, 175, 230, 207, 194, 111, 64, 103, 225, 182, 61, 243, 4, 243, + 107, 233, 36, 137, 223, 128, 80, 146, 184, 165, 148, 33, 242, 191, 154, 82, + 242, 183, 160, 244, 70, 37, 193, 22, 253, 213, 60, 74, 82, 191, 5, 165, + 55, 90, 9, 182, 232, 175, 161, 244, 100, 87, 141, 86, 186, 135, 69, 145, + 238, 48, 89, 180, 48, 73, 197, 2, 79, 85, 48, 223, 198, 34, 111, 52, + 76, 14, 60, 223, 54, 49, 71, 52, 192, 140, 94, 245, 176, 189, 238, 175, + 176, 165, 190, 83, 45, 12, 209, 130, 121, 43, 81, 81, 189, 87, 172, 225, + 99, 43, 209, 3, 53, 128, 28, 221, 242, 28, 221, 5, 245, 72, 33, 118, + 31, 180, 95, 245, 128, 117, 35, 175, 94, 69, 197, 150, 162, 216, 122, 142, + 107, 175, 85, 217, 199, 161, 201, 2, 44, 166, 151, 248, 109, 47, 162, 245, + 162, 67, 219, 81, 148, 125, 240, 198, 23, 248, 25, 166, 234, 187, 186, 28, + 111, 153, 155, 250, 65, 117, 209, 22, 186, 232, 250, 186, 135, 220, 118, 176, + 34, 172, 246, 111, 30, 38, 68, 149, 1, 67, 20, 85, 6, 109, 209, 215, + 79, 239, 107, 150, 95, 100, 110, 126, 179, 133, 153, 199, 137, 60, 78, 229, + 158, 88, 152, 166, 232, 156, 109, 75, 240, 156, 77, 60, 167, 218, 147, 0, + 30, 91, 147, 255, 162, 178, 159, 138, 138, 232, 192, 118, 3, 70, 100, 25, + 245, 34, 120, 24, 250, 162, 165, 136, 174, 130, 1, 211, 46, 247, 5, 0, + 234, 195, 201, 249, 25, 218, 157, 222, 37, 199, 246, 207, 207, 101, 96, 56, + 158, 19, 77, 245, 146, 193, 27, 226, 242, 130, 21, 0, 254, 137, 18, 255, + 123, 49, 68, 225, 197, 12, 186, 181, 252, 81, 3, 243, 5, 255, 51, 100, + 242, 55, 152, 179, 27, 152, 18, 224, 71, 91, 195, 70, 54, 32, 232, 71, + 56, 70, 104, 42, 11, 254, 129, 154, 47, 3, 227, 130, 22, 217, 210, 8, + 47, 15, 208, 242, 9, 36, 18, 180, 122, 154, 124, 191, 96, 80, 183, 182, + 116, 172, 169, 46, 24, 180, 123, 135, 113, 83, 7, 3, 198, 68, 154, 213, + 120, 193, 96, 239, 49, 144, 125, 113, 193, 200, 221, 98, 196, 150, 210, 5, + 131, 187, 199, 184, 169, 35, 159, 70, 7, 194, 120, 62, 205, 18, 34, 94, + 194, 70, 161, 115, 158, 142, 124, 226, 3, 195, 128, 61, 108, 187, 123, 200, + 48, 117, 219, 213, 143, 96, 34, 33, 38, 129, 19, 21, 140, 59, 25, 129, + 224, 212, 228, 30, 241, 12, 77, 96, 86, 2, 199, 0, 143, 64, 184, 140, + 108, 231, 42, 221, 86, 53, 255, 10, 80, 178, 253, 136, 111, 47, 160, 129, + 190, 92, 93, 35, 93, 189, 240, 2, 78, 188, 177, 188, 82, 229, 141, 10, + 4, 82, 242, 25, 107, 88, 59, 213, 245, 212, 79, 119, 205, 48, 4, 85, + 248, 55, 194, 153, 200, 82, 196, 229, 23, 240, 112, 178, 103, 254, 0, 194, + 132, 196, 41, 14, 39, 169, 39, 194, 4, 235, 136, 222, 6, 251, 185, 113, + 17, 168, 255, 132, 194, 197, 4, 208, 72, 170, 100, 1, 234, 87, 203, 78, + 149, 44, 88, 7, 201, 221, 31, 191, 158, 38, 171, 116, 246, 19, 152, 159, + 98, 63, 23, 13, 227, 159, 159, 226, 231, 129, 170, 156, 159, 107, 46, 80, + 4, 231, 84, 9, 104, 167, 127, 94, 205, 108, 207, 37, 147, 160, 184, 130, + 36, 232, 92, 79, 18, 120, 170, 110, 94, 150, 202, 46, 246, 115, 59, 48, + 117, 75, 180, 228, 36, 12, 162, 188, 128, 250, 176, 242, 202, 181, 227, 108, + 239, 38, 63, 153, 151, 200, 114, 175, 75, 37, 114, 150, 144, 152, 219, 60, + 48, 65, 199, 126, 22, 227, 143, 129, 207, 6, 228, 80, 32, 184, 188, 75, + 174, 244, 114, 75, 70, 4, 127, 73, 171, 75, 186, 131, 202, 171, 203, 27, + 224, 179, 188, 186, 175, 15, 193, 83, 75, 174, 110, 161, 80, 230, 159, 234, + 67, 207, 171, 224, 2, 247, 68, 63, 112, 209, 197, 56, 103, 16, 50, 46, + 162, 84, 35, 81, 16, 60, 67, 237, 108, 121, 186, 31, 70, 144, 118, 34, + 183, 125, 211, 16, 229, 206, 188, 5, 40, 12, 69, 235, 146, 130, 251, 129, + 96, 220, 94, 0, 161, 106, 24, 246, 254, 146, 222, 168, 168, 230, 121, 163, + 15, 106, 11, 76, 241, 156, 144, 225, 23, 137, 160, 226, 243, 112, 27, 58, + 128, 104, 209, 0, 50, 197, 0, 252, 13, 190, 244, 199, 175, 177, 198, 137, + 134, 235, 197, 2, 141, 24, 250, 14, 143, 189, 65, 75, 29, 212, 189, 192, + 119, 2, 31, 235, 216, 138, 122, 30, 11, 68, 246, 19, 28, 90, 80, 162, + 192, 15, 66, 234, 242, 52, 222, 222, 101, 112, 252, 235, 36, 35, 254, 33, + 253, 212, 5, 233, 31, 254, 129, 75, 63, 97, 73, 219, 12, 60, 149, 133, + 49, 176, 184, 44, 15, 242, 250, 50, 139, 121, 54, 180, 212, 48, 221, 199, + 68, 31, 51, 84, 17, 8, 4, 100, 154, 49, 25, 128, 229, 66, 53, 14, + 40, 0, 156, 28, 200, 42, 6, 52, 48, 230, 233, 71, 21, 234, 74, 248, + 156, 176, 169, 64, 33, 75, 177, 247, 208, 224, 243, 28, 21, 124, 66, 224, + 128, 242, 38, 248, 70, 196, 2, 95, 46, 178, 228, 127, 31, 211, 124, 22, + 41, 128, 60, 68, 251, 255, 179, 176, 177, 23, 189, 87, 179, 97, 143, 2, + 146, 177, 24, 1, 188, 253, 9, 17, 82, 160, 27, 10, 22, 218, 129, 27, + 155, 151, 80, 60, 97, 63, 252, 63, 11, 84, 249, 130, 129, 119, 65, 21, + 129, 153, 54, 252, 118, 41, 0, 202, 193, 66, 109, 101, 138, 155, 232, 117, + 81, 33, 36, 186, 35, 243, 19, 2, 35, 244, 189, 136, 96, 208, 121, 18, + 1, 65, 197, 175, 167, 90, 145, 82, 249, 182, 106, 3, 235, 89, 197, 29, + 93, 81, 12, 245, 190, 102, 128, 11, 120, 27, 189, 26, 165, 163, 107, 87, + 19, 223, 28, 213, 208, 138, 112, 134, 66, 177, 92, 61, 149, 3, 233, 81, + 177, 132, 82, 190, 189, 92, 26, 160, 175, 145, 214, 50, 1, 79, 130, 110, + 95, 137, 134, 6, 3, 68, 25, 47, 102, 196, 148, 80, 98, 218, 201, 230, + 252, 114, 174, 219, 131, 149, 149, 71, 131, 118, 166, 130, 234, 211, 45, 104, + 245, 123, 231, 14, 129, 76, 147, 130, 92, 70, 200, 138, 250, 46, 228, 171, + 239, 123, 136, 90, 29, 162, 74, 179, 240, 185, 159, 248, 210, 106, 119, 84, + 141, 106, 80, 15, 128, 215, 211, 25, 231, 21, 75, 227, 210, 223, 87, 37, + 19, 64, 33, 19, 224, 135, 228, 30, 168, 228, 192, 221, 169, 209, 202, 49, + 122, 250, 154, 248, 172, 108, 42, 244, 237, 21, 228, 79, 209, 138, 49, 16, + 157, 177, 0, 141, 196, 116, 36, 142, 35, 97, 30, 47, 40, 35, 205, 112, + 210, 107, 159, 110, 165, 155, 128, 122, 11, 3, 179, 57, 241, 114, 150, 181, + 45, 134, 170, 123, 150, 121, 159, 42, 186, 39, 74, 6, 20, 118, 109, 123, + 15, 229, 13, 68, 130, 239, 0, 35, 233, 156, 60, 87, 92, 116, 28, 35, + 132, 215, 8, 91, 158, 6, 167, 41, 80, 18, 96, 60, 16, 225, 151, 10, + 187, 128, 133, 163, 70, 185, 182, 81, 208, 188, 2, 129, 145, 121, 6, 6, + 18, 168, 169, 162, 106, 192, 28, 80, 210, 182, 20, 238, 32, 145, 88, 71, + 191, 47, 209, 20, 251, 91, 146, 191, 104, 226, 8, 24, 183, 162, 122, 178, + 171, 59, 240, 67, 79, 34, 49, 41, 208, 69, 40, 21, 61, 40, 241, 68, + 212, 52, 209, 232, 140, 58, 29, 3, 109, 131, 36, 32, 242, 151, 241, 178, + 80, 98, 154, 162, 21, 98, 138, 174, 105, 192, 114, 181, 252, 8, 29, 245, + 61, 152, 121, 151, 129, 193, 187, 129, 133, 224, 232, 0, 172, 135, 26, 27, + 114, 29, 26, 67, 250, 79, 189, 22, 74, 68, 210, 7, 206, 208, 141, 72, + 214, 218, 142, 26, 149, 169, 253, 173, 211, 40, 167, 140, 43, 208, 255, 96, + 114, 228, 249, 96, 114, 29, 9, 102, 40, 198, 19, 178, 57, 34, 247, 21, + 155, 174, 84, 68, 241, 223, 92, 21, 83, 192, 148, 45, 123, 25, 172, 166, + 8, 136, 71, 223, 17, 215, 249, 67, 84, 1, 16, 86, 186, 166, 3, 233, + 4, 120, 37, 48, 160, 238, 50, 12, 184, 250, 224, 35, 22, 81, 93, 180, + 120, 0, 230, 14, 144, 78, 88, 207, 202, 6, 195, 203, 179, 53, 31, 76, + 38, 160, 232, 0, 205, 217, 3, 186, 27, 189, 21, 208, 11, 217, 53, 162, + 38, 11, 65, 104, 45, 195, 19, 119, 72, 120, 155, 80, 94, 195, 123, 173, + 61, 72, 62, 106, 35, 233, 167, 162, 130, 22, 57, 52, 128, 227, 33, 241, + 18, 181, 206, 169, 113, 160, 226, 138, 58, 202, 7, 38, 223, 43, 48, 22, + 48, 217, 128, 230, 167, 28, 109, 165, 68, 170, 32, 242, 196, 143, 26, 36, + 126, 185, 124, 211, 23, 3, 56, 146, 18, 205, 143, 137, 146, 189, 83, 19, + 2, 235, 151, 218, 7, 223, 73, 215, 34, 214, 3, 76, 5, 59, 230, 210, + 163, 250, 49, 26, 153, 111, 234, 91, 248, 33, 209, 55, 199, 235, 68, 80, + 84, 88, 96, 4, 199, 140, 145, 108, 37, 100, 137, 152, 224, 171, 1, 55, + 65, 198, 240, 224, 101, 9, 160, 6, 245, 203, 91, 234, 55, 122, 203, 85, + 93, 138, 106, 168, 240, 109, 186, 255, 250, 38, 133, 169, 252, 135, 121, 43, + 244, 245, 168, 85, 116, 100, 49, 70, 217, 129, 229, 235, 198, 169, 151, 192, + 64, 117, 85, 104, 85, 169, 202, 59, 136, 76, 127, 145, 168, 40, 176, 85, + 128, 154, 143, 72, 135, 99, 29, 48, 121, 60, 198, 53, 23, 174, 170, 1, + 102, 1, 140, 142, 26, 237, 74, 225, 15, 110, 91, 57, 214, 159, 167, 207, + 254, 147, 233, 110, 217, 176, 99, 22, 5, 95, 131, 4, 216, 31, 88, 113, + 23, 112, 42, 15, 21, 55, 243, 72, 113, 195, 165, 52, 104, 77, 67, 21, + 23, 41, 240, 24, 242, 85, 54, 2, 63, 123, 7, 57, 41, 238, 207, 228, + 151, 243, 50, 76, 235, 196, 21, 13, 75, 3, 90, 10, 138, 178, 207, 255, + 231, 203, 105, 141, 140, 184, 157, 178, 180, 225, 25, 160, 177, 165, 67, 229, + 137, 13, 69, 211, 49, 224, 138, 90, 188, 212, 7, 230, 31, 93, 48, 156, + 128, 162, 204, 99, 167, 122, 129, 33, 8, 237, 190, 178, 237, 90, 170, 235, + 193, 197, 57, 138, 187, 100, 130, 100, 142, 185, 74, 146, 20, 123, 149, 166, + 200, 220, 85, 154, 102, 232, 68, 250, 127, 111, 39, 93, 3, 117, 25, 24, + 226, 73, 126, 160, 149, 56, 52, 237, 162, 127, 177, 222, 172, 25, 182, 4, + 42, 4, 115, 24, 87, 149, 207, 218, 243, 94, 92, 150, 220, 211, 228, 50, + 209, 112, 80, 105, 19, 183, 147, 61, 32, 62, 224, 236, 232, 41, 86, 77, + 52, 77, 241, 57, 74, 61, 80, 159, 35, 12, 207, 19, 231, 231, 120, 2, + 80, 101, 47, 93, 104, 5, 25, 128, 67, 162, 61, 249, 247, 205, 58, 203, + 176, 81, 60, 199, 182, 144, 34, 134, 236, 151, 102, 143, 177, 36, 117, 0, + 191, 145, 193, 6, 210, 12, 81, 200, 29, 224, 127, 49, 228, 217, 170, 223, + 191, 242, 217, 127, 199, 186, 223, 219, 43, 118, 39, 179, 19, 178, 94, 5, + 125, 42, 246, 153, 7, 221, 248, 37, 9, 0, 31, 32, 235, 158, 154, 88, + 109, 70, 240, 30, 176, 139, 116, 63, 60, 245, 192, 43, 251, 246, 146, 243, + 61, 31, 150, 99, 69, 118, 106, 113, 56, 68, 189, 7, 188, 88, 68, 140, + 138, 253, 23, 153, 112, 229, 104, 44, 45, 48, 13, 71, 230, 49, 24, 186, + 67, 160, 98, 101, 152, 26, 168, 142, 1, 172, 182, 24, 0, 45, 147, 145, + 232, 46, 85, 63, 177, 142, 17, 229, 68, 239, 135, 85, 166, 238, 75, 70, + 165, 222, 194, 74, 253, 214, 19, 181, 212, 247, 167, 150, 122, 176, 219, 123, + 77, 109, 2, 75, 102, 242, 239, 164, 150, 62, 79, 114, 190, 19, 173, 244, + 187, 90, 246, 17, 214, 83, 90, 153, 239, 77, 43, 243, 46, 90, 31, 97, + 61, 165, 149, 253, 222, 180, 178, 239, 162, 245, 17, 214, 83, 90, 115, 223, + 155, 214, 220, 187, 104, 125, 132, 245, 148, 86, 238, 123, 211, 202, 189, 139, + 214, 71, 88, 79, 105, 205, 127, 111, 90, 243, 239, 162, 245, 17, 214, 83, + 90, 11, 223, 155, 214, 194, 187, 104, 125, 132, 245, 148, 86, 146, 248, 222, + 196, 194, 26, 223, 163, 15, 30, 161, 61, 39, 151, 252, 238, 228, 190, 83, + 125, 125, 147, 254, 34, 169, 239, 78, 46, 245, 62, 114, 31, 161, 61, 39, + 247, 187, 107, 48, 242, 125, 42, 236, 33, 218, 115, 114, 191, 187, 18, 35, + 223, 167, 197, 30, 162, 61, 39, 247, 187, 235, 49, 242, 125, 138, 236, 33, + 218, 115, 114, 191, 187, 42, 35, 223, 167, 203, 30, 162, 61, 39, 247, 187, + 107, 51, 242, 125, 234, 236, 33, 218, 115, 114, 191, 187, 66, 35, 223, 167, + 209, 30, 162, 61, 39, 247, 187, 235, 52, 242, 125, 74, 237, 33, 218, 243, + 121, 195, 119, 215, 106, 212, 251, 180, 218, 67, 180, 231, 228, 126, 119, 173, + 70, 189, 79, 171, 61, 68, 123, 78, 238, 119, 215, 106, 212, 251, 180, 218, + 67, 180, 231, 228, 126, 119, 173, 70, 189, 79, 171, 61, 68, 123, 78, 238, + 119, 215, 106, 212, 251, 180, 218, 67, 180, 223, 123, 185, 147, 34, 200, 28, + 78, 50, 56, 241, 192, 15, 177, 162, 66, 119, 0, 184, 124, 91, 94, 137, + 150, 165, 26, 104, 207, 82, 57, 65, 191, 202, 49, 52, 155, 10, 77, 247, + 37, 42, 137, 158, 238, 157, 58, 130, 203, 198, 219, 150, 209, 238, 228, 105, + 167, 18, 238, 90, 206, 199, 147, 243, 30, 101, 246, 211, 108, 190, 184, 217, + 189, 188, 218, 232, 156, 55, 250, 183, 43, 50, 231, 190, 62, 127, 4, 234, + 224, 211, 243, 157, 83, 71, 96, 248, 58, 188, 109, 15, 173, 147, 121, 63, + 126, 189, 89, 154, 107, 88, 178, 17, 40, 234, 105, 125, 41, 222, 17, 125, + 207, 153, 154, 127, 123, 127, 22, 112, 226, 193, 190, 115, 69, 245, 85, 217, + 199, 134, 27, 221, 138, 58, 18, 38, 191, 122, 32, 153, 189, 78, 38, 86, + 173, 207, 156, 15, 192, 88, 213, 243, 245, 104, 3, 55, 177, 126, 212, 17, + 173, 0, 173, 219, 129, 79, 179, 209, 133, 215, 111, 108, 108, 93, 188, 111, + 210, 87, 233, 134, 166, 109, 251, 43, 184, 188, 123, 133, 112, 241, 160, 30, + 193, 93, 230, 149, 109, 40, 73, 191, 210, 196, 34, 171, 171, 94, 214, 88, + 35, 191, 156, 111, 233, 41, 232, 193, 129, 62, 13, 83, 207, 159, 125, 187, + 235, 230, 25, 186, 2, 216, 229, 178, 175, 234, 71, 35, 95, 244, 48, 51, + 144, 87, 24, 108, 76, 204, 209, 15, 96, 56, 64, 88, 188, 61, 121, 223, + 51, 63, 204, 94, 202, 182, 237, 42, 186, 5, 250, 50, 254, 42, 246, 118, + 35, 96, 254, 14, 156, 216, 185, 252, 226, 213, 68, 177, 207, 63, 58, 233, + 212, 116, 233, 83, 193, 181, 37, 81, 210, 13, 200, 234, 29, 17, 58, 106, + 2, 198, 223, 6, 42, 226, 29, 144, 66, 187, 249, 160, 46, 184, 157, 131, + 64, 207, 95, 242, 225, 99, 122, 213, 12, 127, 70, 31, 83, 160, 37, 104, + 156, 120, 112, 36, 178, 186, 13, 162, 193, 6, 228, 56, 148, 44, 43, 111, + 247, 85, 141, 97, 110, 246, 22, 112, 171, 24, 78, 205, 82, 18, 45, 37, + 62, 167, 168, 137, 134, 167, 62, 231, 41, 184, 39, 3, 75, 156, 100, 64, + 30, 237, 57, 229, 46, 67, 1, 102, 98, 83, 93, 241, 87, 49, 10, 3, + 143, 89, 36, 49, 96, 21, 195, 149, 174, 249, 137, 13, 27, 80, 13, 153, + 88, 151, 78, 108, 236, 148, 207, 219, 82, 23, 116, 226, 181, 80, 200, 194, + 255, 206, 5, 38, 34, 114, 46, 125, 23, 238, 199, 119, 253, 5, 190, 235, + 241, 48, 108, 70, 227, 206, 181, 77, 21, 227, 85, 215, 21, 93, 253, 253, + 103, 148, 83, 189, 202, 192, 40, 132, 238, 222, 233, 131, 16, 80, 98, 232, + 214, 6, 8, 214, 200, 123, 69, 61, 0, 107, 22, 122, 74, 97, 43, 21, + 25, 187, 137, 251, 12, 52, 232, 170, 226, 162, 243, 55, 240, 72, 177, 227, + 225, 75, 83, 151, 79, 1, 170, 113, 142, 34, 89, 46, 71, 177, 92, 33, + 207, 210, 52, 147, 167, 210, 70, 122, 227, 5, 216, 107, 47, 241, 136, 63, + 13, 110, 56, 210, 179, 55, 233, 179, 53, 65, 92, 246, 192, 239, 29, 216, + 200, 123, 127, 181, 139, 146, 138, 173, 174, 103, 219, 228, 81, 71, 150, 12, + 21, 237, 144, 158, 187, 145, 200, 230, 152, 47, 87, 111, 125, 3, 231, 169, + 2, 3, 186, 208, 185, 236, 190, 127, 62, 237, 189, 215, 92, 53, 60, 185, + 254, 254, 178, 99, 70, 192, 200, 40, 129, 57, 199, 230, 193, 238, 34, 228, + 248, 158, 166, 121, 234, 251, 88, 254, 14, 53, 97, 85, 69, 237, 243, 12, + 227, 157, 244, 118, 161, 47, 148, 244, 39, 35, 186, 34, 186, 27, 108, 9, + 186, 233, 79, 68, 115, 71, 127, 81, 254, 148, 100, 35, 183, 231, 63, 31, + 213, 47, 232, 204, 194, 159, 141, 240, 246, 159, 145, 104, 232, 41, 140, 90, + 251, 145, 91, 197, 31, 145, 232, 233, 74, 143, 207, 103, 252, 17, 233, 253, + 152, 99, 253, 187, 230, 88, 222, 27, 147, 44, 228, 57, 125, 198, 24, 168, + 59, 59, 252, 53, 118, 95, 116, 90, 24, 24, 127, 133, 116, 187, 175, 3, + 15, 66, 99, 63, 195, 165, 176, 232, 80, 159, 126, 248, 42, 155, 225, 38, + 155, 120, 78, 115, 67, 44, 135, 162, 133, 241, 162, 12, 62, 56, 177, 142, + 146, 48, 150, 96, 254, 141, 185, 77, 177, 48, 218, 10, 123, 131, 115, 183, + 94, 115, 189, 30, 147, 218, 178, 157, 232, 248, 215, 51, 2, 78, 40, 111, + 208, 112, 70, 251, 22, 50, 230, 232, 208, 217, 51, 42, 98, 140, 55, 136, + 56, 97, 125, 11, 13, 208, 239, 247, 9, 1, 48, 251, 141, 183, 35, 148, + 111, 121, 53, 58, 100, 141, 13, 68, 107, 121, 145, 25, 69, 195, 136, 14, + 95, 131, 129, 54, 92, 137, 208, 97, 28, 60, 65, 253, 120, 130, 94, 164, + 247, 167, 155, 154, 238, 136, 160, 222, 65, 196, 135, 228, 250, 211, 175, 14, + 229, 224, 129, 167, 71, 219, 8, 177, 128, 2, 51, 186, 179, 124, 138, 103, + 137, 241, 99, 154, 116, 130, 10, 245, 201, 160, 120, 199, 82, 0, 66, 249, + 150, 65, 145, 208, 211, 79, 40, 72, 96, 221, 18, 146, 92, 203, 78, 96, + 125, 11, 45, 145, 49, 240, 132, 140, 8, 225, 9, 5, 49, 194, 135, 116, + 248, 144, 14, 127, 100, 233, 208, 22, 165, 179, 116, 48, 68, 41, 123, 121, + 76, 147, 14, 237, 243, 1, 128, 219, 161, 241, 202, 102, 201, 215, 139, 102, + 188, 32, 222, 12, 17, 212, 118, 105, 104, 223, 50, 80, 138, 47, 209, 202, + 210, 147, 113, 122, 66, 185, 213, 228, 176, 207, 238, 145, 190, 133, 136, 210, + 219, 68, 148, 222, 67, 68, 233, 215, 16, 241, 33, 50, 62, 68, 198, 191, + 75, 100, 8, 229, 226, 89, 100, 56, 178, 152, 189, 60, 166, 137, 12, 193, + 213, 77, 209, 189, 177, 180, 161, 174, 188, 145, 24, 39, 188, 55, 76, 238, + 19, 218, 104, 175, 123, 79, 140, 144, 19, 26, 58, 100, 244, 248, 92, 80, + 186, 29, 162, 202, 54, 12, 216, 244, 54, 205, 23, 204, 55, 168, 190, 32, + 190, 65, 247, 5, 241, 91, 40, 31, 65, 94, 125, 15, 225, 103, 196, 55, + 232, 62, 227, 189, 65, 246, 25, 239, 91, 168, 62, 197, 77, 141, 196, 95, + 241, 160, 166, 4, 77, 125, 22, 107, 237, 114, 230, 60, 229, 223, 135, 196, + 250, 139, 75, 172, 60, 78, 112, 56, 153, 127, 42, 177, 6, 181, 210, 89, + 98, 185, 203, 179, 145, 3, 30, 211, 36, 22, 140, 96, 244, 68, 153, 195, + 236, 55, 134, 13, 66, 249, 22, 53, 142, 34, 47, 61, 123, 121, 132, 240, + 198, 235, 99, 164, 111, 50, 102, 222, 152, 246, 148, 82, 102, 61, 183, 175, + 47, 125, 76, 124, 62, 100, 194, 31, 222, 138, 65, 46, 142, 103, 169, 16, + 202, 146, 236, 102, 147, 137, 212, 233, 207, 41, 232, 217, 179, 33, 114, 65, + 122, 99, 156, 36, 16, 191, 121, 168, 162, 40, 99, 79, 87, 115, 147, 104, + 239, 25, 184, 39, 212, 111, 33, 233, 28, 251, 237, 41, 69, 9, 172, 119, + 200, 209, 95, 67, 207, 135, 60, 249, 144, 39, 191, 185, 60, 65, 231, 223, + 81, 104, 145, 34, 188, 124, 22, 123, 193, 74, 170, 102, 187, 39, 151, 102, + 20, 173, 2, 70, 164, 128, 40, 95, 163, 21, 150, 100, 250, 214, 43, 47, + 197, 49, 244, 236, 32, 143, 106, 140, 98, 206, 197, 7, 245, 27, 150, 7, + 122, 2, 67, 129, 156, 206, 17, 163, 32, 103, 195, 64, 60, 8, 34, 122, + 216, 43, 10, 18, 11, 108, 235, 87, 193, 90, 98, 188, 110, 220, 251, 97, + 35, 212, 129, 234, 217, 128, 178, 132, 155, 49, 147, 37, 115, 48, 204, 63, + 157, 203, 50, 133, 108, 142, 201, 230, 201, 40, 56, 19, 5, 254, 50, 48, + 183, 144, 165, 208, 133, 5, 185, 47, 95, 169, 167, 61, 22, 191, 136, 183, + 13, 5, 198, 180, 210, 208, 223, 207, 95, 190, 146, 47, 183, 24, 128, 62, + 75, 52, 213, 31, 191, 250, 234, 193, 255, 252, 201, 70, 224, 87, 25, 124, + 195, 39, 128, 254, 60, 170, 234, 37, 180, 199, 41, 70, 109, 20, 186, 67, + 77, 134, 172, 56, 123, 239, 190, 65, 242, 57, 18, 16, 220, 131, 22, 125, + 24, 161, 198, 79, 196, 147, 2, 157, 252, 255, 69, 126, 201, 55, 129, 166, + 92, 117, 27, 232, 48, 32, 215, 57, 76, 160, 191, 183, 49, 221, 130, 95, + 103, 32, 166, 128, 46, 203, 123, 219, 221, 96, 142, 107, 67, 38, 13, 97, + 116, 151, 6, 244, 95, 246, 2, 83, 141, 28, 150, 87, 98, 20, 190, 39, + 42, 231, 219, 78, 84, 22, 69, 82, 66, 17, 94, 224, 118, 167, 136, 193, + 107, 221, 46, 57, 81, 140, 58, 15, 250, 64, 251, 144, 228, 43, 228, 115, + 190, 4, 164, 24, 160, 18, 6, 104, 130, 158, 196, 200, 163, 26, 180, 120, + 28, 75, 71, 10, 226, 184, 134, 182, 117, 142, 146, 181, 19, 93, 93, 140, + 226, 27, 125, 246, 67, 7, 14, 125, 35, 188, 212, 126, 142, 66, 109, 75, + 126, 228, 251, 134, 6, 196, 249, 133, 193, 57, 14, 212, 85, 208, 45, 31, + 76, 243, 190, 188, 222, 181, 31, 106, 103, 21, 198, 109, 50, 84, 216, 82, + 177, 31, 184, 138, 62, 34, 98, 7, 15, 69, 41, 130, 85, 157, 131, 165, + 65, 247, 134, 232, 235, 237, 232, 219, 81, 148, 47, 248, 222, 115, 78, 28, + 55, 40, 173, 201, 96, 120, 109, 47, 10, 127, 117, 250, 170, 4, 97, 224, + 39, 240, 84, 24, 217, 122, 31, 199, 221, 138, 187, 39, 38, 194, 191, 142, + 178, 38, 169, 254, 30, 182, 6, 234, 246, 56, 160, 24, 34, 9, 22, 132, + 161, 11, 225, 87, 185, 96, 170, 191, 131, 97, 201, 44, 24, 145, 235, 37, + 138, 73, 134, 194, 15, 73, 129, 5, 250, 15, 48, 176, 13, 227, 56, 199, + 53, 188, 98, 191, 87, 188, 30, 236, 193, 93, 45, 48, 146, 246, 131, 19, + 15, 3, 213, 7, 92, 112, 128, 178, 207, 141, 30, 179, 151, 199, 52, 191, + 196, 161, 239, 170, 214, 18, 240, 220, 101, 148, 114, 183, 193, 65, 83, 28, + 52, 128, 116, 34, 145, 240, 57, 225, 60, 245, 111, 76, 68, 226, 75, 222, + 246, 18, 253, 127, 19, 150, 175, 163, 91, 88, 57, 72, 134, 176, 33, 111, + 200, 233, 136, 135, 55, 48, 110, 34, 244, 92, 14, 7, 208, 212, 115, 147, + 161, 13, 183, 180, 193, 16, 59, 29, 55, 32, 225, 5, 38, 44, 73, 37, + 168, 67, 190, 94, 73, 28, 184, 34, 115, 133, 3, 205, 152, 43, 12, 138, + 189, 69, 249, 176, 87, 126, 39, 123, 229, 113, 208, 89, 168, 171, 76, 21, + 6, 147, 138, 163, 217, 161, 19, 82, 30, 236, 198, 88, 159, 197, 99, 43, + 242, 120, 49, 150, 224, 123, 253, 149, 153, 133, 122, 94, 65, 241, 15, 37, + 240, 53, 58, 60, 49, 243, 200, 79, 57, 225, 143, 172, 59, 182, 241, 170, + 155, 184, 19, 72, 184, 232, 250, 40, 4, 23, 78, 18, 28, 254, 135, 10, + 218, 159, 195, 73, 26, 39, 30, 184, 225, 128, 230, 112, 109, 48, 221, 80, + 212, 88, 218, 184, 182, 6, 18, 217, 100, 226, 214, 198, 106, 192, 208, 124, + 72, 155, 161, 176, 89, 20, 28, 23, 183, 238, 202, 81, 22, 176, 126, 146, + 163, 181, 230, 2, 237, 150, 116, 147, 127, 115, 113, 243, 99, 52, 253, 21, + 172, 127, 22, 12, 138, 116, 246, 27, 170, 134, 42, 251, 47, 39, 11, 29, + 177, 14, 100, 68, 15, 193, 227, 32, 239, 55, 233, 132, 2, 60, 235, 63, + 221, 212, 161, 170, 240, 67, 208, 68, 9, 237, 69, 32, 245, 244, 115, 241, + 159, 55, 122, 10, 158, 169, 132, 77, 142, 150, 250, 32, 51, 0, 213, 248, + 9, 157, 22, 131, 14, 251, 80, 195, 157, 22, 23, 226, 76, 236, 255, 98, + 183, 145, 217, 161, 78, 68, 165, 46, 206, 18, 201, 9, 239, 245, 97, 65, + 234, 214, 239, 255, 173, 9, 57, 15, 163, 139, 214, 65, 45, 209, 64, 66, + 221, 156, 80, 212, 81, 187, 169, 169, 247, 64, 36, 162, 88, 197, 115, 130, + 162, 151, 104, 144, 235, 162, 104, 30, 127, 130, 160, 240, 223, 176, 109, 214, + 55, 24, 103, 200, 25, 3, 245, 87, 140, 241, 41, 161, 178, 17, 28, 74, + 224, 180, 251, 39, 174, 238, 127, 249, 24, 237, 127, 197, 209, 78, 224, 84, + 225, 225, 165, 14, 17, 163, 193, 144, 174, 21, 245, 18, 180, 255, 50, 222, + 97, 200, 104, 37, 145, 147, 125, 152, 147, 114, 212, 119, 160, 162, 72, 195, + 39, 41, 242, 32, 174, 219, 249, 197, 201, 229, 129, 171, 130, 160, 111, 224, + 34, 23, 156, 198, 221, 230, 92, 134, 95, 108, 111, 199, 99, 151, 190, 30, + 187, 41, 161, 37, 163, 142, 75, 26, 191, 186, 25, 192, 184, 152, 167, 15, + 186, 176, 59, 156, 249, 53, 224, 164, 21, 242, 55, 76, 220, 211, 119, 42, + 142, 76, 250, 143, 67, 172, 127, 245, 49, 5, 212, 39, 251, 240, 116, 252, + 80, 117, 116, 49, 26, 66, 224, 33, 123, 122, 72, 91, 127, 255, 183, 7, + 32, 253, 96, 200, 191, 38, 67, 62, 23, 242, 64, 52, 25, 176, 77, 128, + 9, 99, 34, 198, 140, 1, 95, 193, 36, 205, 204, 222, 2, 82, 125, 252, + 65, 38, 152, 153, 133, 167, 16, 175, 159, 208, 97, 67, 96, 131, 161, 179, + 44, 240, 190, 174, 47, 209, 226, 173, 15, 23, 131, 126, 46, 163, 59, 70, + 84, 247, 159, 216, 103, 150, 185, 202, 17, 92, 27, 0, 115, 121, 116, 239, + 87, 176, 214, 177, 25, 10, 1, 128, 53, 26, 13, 236, 51, 137, 106, 233, + 170, 75, 17, 169, 164, 159, 145, 116, 5, 232, 36, 125, 13, 239, 170, 123, + 0, 165, 11, 215, 208, 158, 161, 0, 40, 131, 222, 39, 184, 48, 46, 50, + 252, 94, 48, 178, 72, 10, 130, 134, 48, 196, 194, 165, 78, 42, 121, 193, + 88, 116, 89, 193, 233, 227, 200, 72, 223, 64, 84, 67, 92, 162, 219, 3, + 226, 243, 153, 197, 165, 38, 98, 69, 97, 134, 129, 49, 149, 76, 82, 236, + 233, 115, 186, 170, 237, 136, 22, 6, 58, 138, 184, 1, 21, 101, 215, 246, + 226, 130, 13, 67, 179, 193, 168, 168, 168, 134, 47, 166, 129, 104, 234, 30, + 198, 36, 65, 188, 192, 96, 130, 17, 128, 250, 208, 171, 99, 104, 93, 96, + 35, 232, 21, 110, 93, 24, 98, 249, 36, 64, 128, 231, 53, 34, 68, 54, + 1, 158, 9, 20, 72, 180, 108, 69, 220, 96, 165, 41, 172, 3, 43, 119, + 207, 144, 122, 163, 138, 125, 174, 15, 97, 172, 105, 87, 252, 114, 6, 143, + 94, 224, 178, 81, 244, 9, 73, 72, 252, 5, 73, 16, 147, 132, 184, 250, + 203, 44, 134, 8, 54, 80, 205, 54, 24, 18, 185, 28, 115, 157, 228, 174, + 146, 28, 36, 111, 0, 250, 68, 213, 177, 198, 32, 46, 28, 167, 123, 46, + 24, 94, 81, 55, 196, 144, 104, 26, 13, 8, 131, 155, 99, 72, 12, 92, + 101, 228, 9, 239, 211, 255, 94, 150, 203, 223, 203, 0, 103, 106, 132, 25, + 148, 173, 227, 73, 6, 154, 0, 10, 246, 242, 242, 44, 243, 113, 222, 147, + 82, 153, 103, 121, 207, 51, 31, 228, 78, 69, 215, 124, 72, 105, 148, 249, + 56, 239, 73, 169, 103, 175, 123, 74, 203, 61, 165, 185, 60, 113, 79, 33, + 2, 222, 195, 82, 176, 210, 170, 75, 125, 71, 122, 167, 93, 114, 30, 100, + 60, 194, 127, 248, 138, 199, 47, 207, 100, 196, 148, 172, 244, 46, 186, 228, + 60, 200, 120, 132, 159, 246, 246, 244, 110, 225, 82, 218, 157, 187, 111, 118, + 238, 182, 213, 185, 251, 70, 231, 82, 218, 28, 193, 82, 128, 233, 253, 192, + 61, 232, 6, 46, 181, 23, 184, 7, 157, 192, 61, 234, 3, 238, 81, 59, + 115, 15, 154, 153, 75, 109, 101, 238, 65, 35, 115, 169, 109, 60, 210, 77, + 21, 91, 168, 64, 244, 124, 174, 30, 208, 197, 166, 95, 0, 1, 47, 111, + 163, 188, 137, 241, 6, 194, 91, 229, 223, 164, 242, 237, 239, 136, 123, 241, + 77, 82, 83, 122, 251, 49, 218, 123, 176, 128, 8, 39, 126, 169, 8, 71, + 58, 153, 23, 160, 32, 146, 35, 98, 174, 33, 55, 128, 219, 252, 207, 162, + 225, 127, 185, 5, 102, 238, 0, 41, 16, 241, 30, 116, 135, 133, 238, 72, + 189, 39, 42, 2, 167, 65, 83, 49, 211, 171, 189, 127, 219, 217, 118, 186, + 127, 227, 37, 235, 81, 206, 195, 18, 143, 95, 243, 132, 130, 148, 230, 73, + 228, 37, 203, 209, 4, 65, 72, 215, 20, 199, 160, 91, 200, 29, 198, 125, + 53, 41, 53, 167, 189, 173, 94, 190, 3, 165, 183, 221, 109, 222, 195, 172, + 199, 101, 238, 223, 158, 222, 126, 119, 121, 79, 50, 171, 162, 107, 132, 215, + 182, 21, 123, 51, 16, 17, 228, 6, 112, 155, 159, 185, 3, 220, 65, 174, + 62, 61, 53, 231, 97, 137, 199, 117, 161, 230, 79, 100, 21, 238, 104, 47, + 220, 190, 175, 112, 155, 159, 185, 3, 164, 64, 238, 64, 41, 18, 235, 2, + 78, 131, 166, 98, 94, 87, 91, 184, 85, 181, 8, 114, 3, 184, 205, 191, + 171, 34, 115, 7, 73, 163, 181, 144, 166, 73, 79, 208, 84, 204, 244, 106, + 239, 223, 150, 162, 65, 47, 224, 52, 104, 42, 102, 122, 181, 224, 109, 143, + 4, 251, 231, 39, 147, 51, 56, 193, 58, 253, 205, 212, 206, 79, 131, 243, + 211, 28, 161, 121, 190, 14, 101, 77, 217, 16, 61, 79, 151, 163, 29, 4, + 152, 209, 177, 45, 59, 254, 131, 74, 163, 135, 193, 233, 1, 149, 5, 179, + 87, 200, 149, 88, 93, 79, 36, 134, 190, 18, 165, 118, 168, 94, 180, 252, + 3, 254, 78, 84, 3, 2, 190, 124, 195, 135, 192, 105, 229, 216, 240, 93, + 49, 222, 33, 77, 204, 54, 39, 58, 152, 72, 99, 212, 101, 118, 57, 12, + 28, 213, 213, 83, 65, 245, 218, 213, 60, 244, 4, 30, 168, 162, 113, 154, + 117, 94, 101, 204, 94, 192, 92, 60, 158, 42, 70, 211, 180, 234, 198, 23, + 221, 171, 217, 93, 213, 128, 243, 125, 56, 173, 154, 9, 131, 222, 13, 56, + 162, 150, 186, 67, 143, 224, 201, 249, 159, 96, 187, 240, 243, 0, 121, 88, + 183, 156, 6, 157, 64, 104, 219, 54, 237, 165, 43, 58, 171, 16, 238, 245, + 68, 123, 198, 144, 152, 71, 109, 250, 150, 214, 7, 21, 151, 47, 50, 25, + 166, 174, 114, 50, 215, 169, 115, 18, 16, 94, 191, 20, 131, 169, 171, 156, + 107, 188, 75, 49, 208, 144, 139, 75, 49, 152, 186, 202, 185, 198, 187, 20, + 75, 204, 229, 95, 238, 97, 41, 88, 105, 37, 81, 117, 119, 141, 250, 146, + 2, 76, 195, 75, 45, 124, 95, 37, 92, 33, 184, 171, 50, 165, 151, 33, + 94, 106, 225, 251, 42, 243, 105, 85, 230, 239, 171, 204, 167, 85, 153, 127, + 88, 101, 253, 194, 99, 163, 151, 78, 113, 134, 150, 39, 18, 47, 186, 0, + 211, 240, 50, 169, 192, 84, 232, 201, 58, 140, 51, 6, 141, 104, 149, 35, + 249, 170, 19, 44, 5, 43, 147, 6, 75, 3, 70, 175, 249, 6, 25, 153, + 228, 147, 203, 82, 211, 29, 163, 93, 173, 66, 61, 40, 115, 203, 118, 201, + 172, 115, 94, 98, 57, 236, 242, 146, 199, 107, 100, 8, 47, 181, 240, 165, + 202, 147, 180, 34, 147, 85, 38, 128, 105, 120, 169, 133, 239, 171, 100, 210, + 170, 100, 238, 171, 100, 210, 170, 100, 82, 171, 204, 167, 85, 153, 191, 175, + 50, 159, 86, 101, 62, 253, 195, 115, 169, 95, 158, 34, 233, 175, 155, 243, + 26, 154, 58, 198, 187, 229, 84, 25, 241, 64, 70, 119, 203, 233, 146, 162, + 91, 126, 80, 253, 228, 65, 245, 147, 7, 42, 32, 189, 250, 73, 90, 245, + 176, 245, 211, 168, 143, 224, 15, 176, 31, 213, 146, 94, 253, 248, 65, 245, + 227, 212, 234, 199, 15, 170, 31, 63, 170, 62, 173, 113, 34, 248, 3, 236, + 71, 181, 128, 234, 191, 85, 65, 210, 44, 9, 132, 11, 92, 189, 247, 13, + 217, 208, 157, 47, 105, 25, 166, 120, 7, 15, 60, 231, 22, 157, 126, 84, + 15, 253, 160, 30, 250, 186, 158, 232, 203, 40, 58, 127, 87, 209, 125, 78, + 92, 211, 85, 70, 74, 85, 133, 135, 85, 21, 30, 85, 85, 184, 170, 234, + 91, 140, 82, 104, 180, 69, 119, 204, 93, 73, 39, 100, 133, 66, 0, 127, + 130, 240, 2, 76, 158, 45, 146, 200, 158, 188, 194, 136, 65, 76, 42, 104, + 118, 30, 230, 170, 229, 165, 75, 66, 234, 98, 181, 33, 120, 100, 161, 70, + 123, 0, 53, 213, 2, 56, 50, 118, 77, 220, 109, 198, 133, 168, 219, 156, + 184, 174, 235, 28, 216, 138, 50, 50, 175, 49, 180, 180, 159, 132, 71, 198, + 101, 156, 11, 197, 241, 100, 120, 177, 26, 225, 2, 0, 86, 155, 221, 160, + 92, 153, 165, 15, 74, 70, 246, 102, 148, 151, 98, 136, 70, 25, 204, 93, + 70, 245, 0, 6, 80, 210, 216, 142, 50, 19, 31, 64, 61, 0, 179, 105, + 80, 244, 181, 9, 235, 117, 246, 2, 39, 11, 209, 14, 20, 117, 187, 233, + 113, 61, 85, 189, 158, 250, 193, 135, 168, 206, 228, 152, 30, 173, 2, 83, + 178, 68, 221, 192, 134, 240, 246, 71, 180, 81, 73, 70, 71, 119, 40, 230, + 203, 87, 242, 233, 198, 100, 138, 103, 242, 125, 16, 212, 63, 239, 205, 152, + 151, 128, 237, 177, 215, 227, 77, 136, 213, 171, 160, 238, 168, 169, 147, 55, + 105, 2, 64, 201, 246, 87, 31, 30, 28, 191, 251, 134, 249, 141, 71, 241, + 233, 160, 69, 123, 60, 242, 208, 33, 19, 219, 67, 110, 193, 87, 7, 88, + 100, 56, 246, 208, 65, 13, 120, 188, 195, 14, 224, 13, 201, 170, 138, 121, + 232, 178, 13, 15, 75, 117, 33, 190, 125, 233, 223, 209, 11, 255, 33, 98, + 43, 87, 213, 126, 68, 190, 197, 222, 15, 56, 238, 138, 123, 71, 85, 116, + 241, 21, 60, 192, 67, 12, 162, 163, 170, 40, 236, 49, 220, 99, 254, 26, + 239, 176, 67, 135, 195, 159, 6, 226, 126, 20, 35, 160, 13, 104, 236, 146, + 249, 15, 92, 76, 143, 183, 252, 78, 34, 28, 209, 87, 160, 243, 192, 171, + 165, 34, 215, 102, 26, 30, 89, 128, 91, 246, 47, 234, 233, 21, 47, 78, + 116, 211, 242, 139, 110, 189, 192, 80, 204, 47, 75, 221, 116, 94, 87, 190, + 105, 124, 250, 73, 16, 125, 44, 114, 62, 64, 116, 85, 175, 200, 74, 189, + 77, 252, 29, 116, 1, 178, 36, 195, 94, 190, 122, 246, 94, 117, 165, 240, + 213, 84, 113, 13, 40, 132, 23, 68, 150, 167, 39, 232, 178, 1, 72, 245, + 62, 253, 20, 105, 187, 235, 150, 129, 154, 5, 101, 255, 154, 38, 2, 164, + 172, 3, 209, 50, 85, 32, 60, 69, 216, 57, 175, 98, 128, 59, 208, 19, + 224, 229, 166, 145, 140, 0, 180, 16, 152, 181, 188, 40, 246, 222, 2, 146, + 68, 193, 65, 235, 156, 93, 6, 34, 38, 3, 99, 22, 171, 196, 217, 143, + 91, 232, 119, 247, 252, 40, 224, 4, 245, 240, 216, 10, 242, 173, 208, 192, + 200, 136, 100, 33, 246, 243, 228, 116, 236, 73, 52, 208, 81, 97, 63, 70, + 56, 69, 17, 72, 166, 147, 126, 32, 216, 15, 216, 223, 159, 56, 211, 229, + 175, 207, 128, 32, 227, 8, 222, 56, 126, 118, 218, 61, 201, 235, 87, 234, + 234, 134, 142, 200, 48, 130, 181, 124, 189, 88, 82, 109, 123, 143, 236, 39, + 40, 146, 63, 69, 167, 87, 63, 193, 229, 52, 55, 196, 208, 243, 35, 255, + 194, 139, 168, 143, 196, 224, 249, 236, 32, 16, 155, 183, 215, 22, 23, 21, + 5, 222, 189, 225, 190, 84, 84, 13, 29, 239, 66, 214, 31, 116, 134, 135, + 183, 94, 55, 46, 87, 221, 127, 185, 187, 193, 229, 169, 70, 0, 36, 1, + 157, 13, 106, 137, 197, 33, 153, 37, 35, 97, 24, 29, 4, 70, 191, 36, + 149, 207, 50, 215, 22, 250, 135, 54, 249, 237, 181, 9, 116, 65, 114, 3, + 20, 155, 223, 59, 93, 191, 242, 114, 117, 86, 229, 196, 252, 222, 229, 96, + 159, 135, 78, 173, 89, 167, 211, 117, 190, 141, 129, 218, 80, 54, 58, 202, + 230, 69, 151, 216, 87, 108, 235, 111, 62, 60, 62, 9, 175, 108, 1, 56, + 158, 234, 159, 78, 187, 52, 18, 135, 36, 95, 95, 95, 209, 33, 23, 219, + 65, 34, 47, 62, 188, 103, 128, 102, 135, 133, 76, 209, 130, 135, 21, 67, + 160, 172, 174, 142, 86, 194, 87, 252, 33, 37, 15, 139, 19, 12, 248, 121, + 167, 228, 169, 235, 158, 15, 205, 97, 243, 90, 238, 172, 78, 224, 108, 42, + 244, 145, 12, 138, 239, 145, 250, 236, 125, 73, 158, 131, 255, 132, 206, 20, + 20, 177, 159, 193, 115, 124, 192, 224, 250, 121, 160, 42, 231, 103, 116, 210, + 224, 156, 130, 71, 10, 254, 153, 40, 239, 172, 68, 152, 188, 156, 171, 59, + 87, 148, 4, 197, 245, 37, 65, 231, 106, 147, 192, 83, 237, 232, 172, 3, + 246, 243, 89, 44, 38, 96, 16, 229, 229, 246, 68, 195, 77, 126, 50, 47, + 145, 117, 83, 42, 145, 19, 5, 78, 185, 201, 107, 139, 18, 32, 225, 100, + 223, 159, 33, 162, 244, 114, 251, 234, 8, 254, 146, 86, 94, 186, 131, 202, + 43, 236, 103, 121, 117, 95, 7, 130, 167, 98, 175, 110, 161, 245, 225, 4, + 48, 74, 112, 121, 190, 24, 253, 103, 16, 242, 176, 142, 82, 13, 236, 103, + 40, 169, 193, 116, 215, 15, 35, 72, 251, 230, 195, 96, 44, 99, 48, 43, + 15, 69, 235, 146, 138, 195, 252, 94, 0, 81, 200, 221, 75, 186, 165, 162, + 218, 230, 141, 62, 234, 41, 241, 156, 136, 34, 55, 160, 138, 7, 243, 4, + 103, 205, 19, 156, 5, 159, 47, 21, 162, 100, 212, 249, 223, 67, 107, 125, + 168, 158, 63, 167, 234, 65, 19, 25, 236, 238, 108, 164, 165, 170, 202, 205, + 153, 250, 71, 167, 233, 177, 97, 186, 74, 73, 234, 19, 80, 8, 72, 69, + 120, 140, 214, 60, 93, 66, 119, 165, 71, 254, 144, 90, 4, 198, 161, 32, + 113, 146, 126, 167, 22, 57, 133, 234, 59, 107, 138, 56, 94, 95, 50, 253, + 161, 51, 62, 116, 198, 135, 206, 248, 208, 25, 31, 58, 227, 63, 82, 103, + 36, 167, 245, 40, 86, 81, 0, 230, 18, 230, 215, 115, 68, 147, 108, 10, + 236, 50, 206, 20, 48, 157, 139, 36, 224, 11, 134, 196, 231, 11, 134, 4, + 251, 143, 81, 236, 30, 61, 57, 38, 111, 113, 17, 206, 191, 62, 233, 88, + 6, 43, 16, 127, 255, 124, 192, 247, 95, 254, 46, 219, 222, 103, 29, 7, + 12, 112, 57, 108, 2, 10, 222, 215, 134, 234, 185, 7, 159, 171, 189, 130, + 62, 160, 40, 138, 39, 114, 90, 203, 190, 62, 196, 24, 175, 126, 159, 3, + 132, 20, 255, 72, 29, 250, 252, 248, 210, 87, 48, 26, 224, 62, 3, 152, + 24, 123, 112, 60, 196, 96, 0, 218, 217, 198, 14, 69, 73, 144, 227, 231, + 108, 226, 57, 229, 80, 122, 75, 117, 129, 1, 112, 110, 147, 50, 226, 2, + 208, 30, 69, 48, 182, 225, 220, 155, 62, 208, 137, 20, 123, 96, 19, 41, + 238, 192, 37, 82, 133, 3, 218, 181, 113, 213, 189, 238, 251, 47, 179, 196, + 51, 188, 77, 120, 104, 75, 170, 129, 160, 209, 19, 132, 13, 108, 95, 183, + 118, 8, 24, 63, 206, 145, 94, 132, 199, 179, 117, 209, 66, 96, 9, 134, + 190, 42, 187, 182, 231, 97, 228, 45, 0, 30, 126, 105, 152, 78, 96, 120, + 170, 23, 147, 118, 78, 70, 180, 157, 147, 144, 184, 11, 7, 217, 1, 138, + 191, 155, 216, 170, 172, 232, 174, 46, 175, 12, 21, 74, 198, 174, 10, 180, + 149, 245, 214, 189, 171, 207, 214, 230, 27, 26, 6, 241, 77, 21, 138, 39, + 208, 157, 81, 35, 35, 33, 3, 196, 150, 23, 173, 136, 0, 120, 212, 218, + 16, 158, 197, 116, 31, 134, 31, 138, 215, 89, 16, 28, 139, 186, 13, 5, + 235, 194, 54, 168, 10, 76, 137, 215, 230, 208, 165, 184, 175, 232, 174, 92, + 217, 54, 129, 54, 69, 33, 134, 60, 213, 212, 225, 26, 141, 133, 110, 196, + 61, 19, 237, 193, 117, 24, 204, 133, 241, 133, 76, 209, 119, 245, 3, 92, + 200, 9, 76, 43, 42, 228, 218, 251, 84, 161, 22, 17, 135, 197, 12, 18, + 141, 44, 24, 14, 131, 248, 111, 50, 251, 194, 100, 201, 255, 70, 137, 95, + 209, 74, 81, 205, 39, 41, 171, 71, 65, 161, 226, 16, 76, 40, 44, 21, + 138, 195, 116, 213, 144, 209, 112, 118, 97, 176, 191, 180, 214, 244, 31, 220, + 222, 24, 21, 187, 138, 17, 8, 250, 188, 140, 78, 47, 95, 246, 185, 110, + 198, 196, 233, 222, 106, 64, 88, 34, 246, 15, 251, 198, 170, 231, 135, 69, + 253, 97, 81, 255, 73, 45, 234, 143, 125, 221, 191, 230, 65, 104, 26, 39, + 114, 143, 35, 91, 6, 238, 14, 242, 114, 100, 51, 156, 18, 217, 100, 34, + 45, 148, 205, 27, 65, 82, 97, 100, 181, 219, 155, 228, 111, 253, 41, 224, + 249, 215, 187, 219, 230, 239, 188, 46, 138, 18, 138, 87, 169, 70, 97, 36, + 126, 188, 217, 120, 58, 31, 135, 136, 231, 128, 191, 100, 95, 234, 131, 163, + 255, 180, 28, 253, 212, 54, 174, 232, 218, 105, 101, 192, 214, 176, 154, 24, + 120, 30, 48, 38, 81, 140, 86, 197, 94, 102, 163, 63, 41, 161, 89, 72, + 240, 26, 180, 23, 124, 217, 155, 37, 95, 25, 168, 242, 207, 40, 20, 48, + 151, 238, 80, 216, 43, 148, 52, 174, 103, 10, 239, 101, 88, 120, 172, 34, + 242, 109, 186, 191, 30, 225, 131, 149, 255, 3, 89, 25, 134, 136, 0, 140, + 60, 58, 205, 202, 17, 23, 199, 208, 108, 226, 57, 69, 70, 71, 2, 19, + 45, 97, 81, 249, 104, 1, 235, 194, 103, 42, 152, 6, 200, 39, 150, 161, + 80, 235, 74, 161, 183, 82, 119, 159, 96, 224, 30, 107, 37, 250, 62, 154, + 128, 85, 3, 25, 122, 232, 161, 231, 225, 54, 16, 65, 251, 191, 92, 96, + 119, 30, 102, 87, 19, 108, 234, 222, 196, 134, 7, 135, 148, 192, 176, 19, + 49, 56, 81, 26, 187, 16, 75, 83, 40, 220, 39, 251, 193, 249, 127, 113, + 206, 39, 225, 165, 30, 143, 246, 202, 171, 202, 82, 69, 34, 91, 133, 15, + 217, 211, 195, 123, 76, 145, 155, 24, 117, 119, 38, 6, 123, 61, 139, 251, + 48, 33, 254, 35, 185, 239, 169, 220, 69, 220, 23, 71, 33, 62, 115, 225, + 87, 59, 74, 103, 111, 210, 191, 1, 79, 70, 17, 125, 97, 115, 50, 215, + 94, 100, 163, 149, 46, 111, 80, 189, 209, 214, 4, 168, 53, 247, 193, 201, + 31, 156, 252, 152, 147, 161, 19, 191, 12, 67, 242, 187, 234, 210, 133, 235, + 158, 209, 210, 68, 236, 202, 135, 54, 142, 213, 8, 231, 171, 118, 198, 201, + 130, 162, 95, 45, 251, 54, 164, 46, 175, 138, 208, 195, 75, 183, 150, 63, + 126, 77, 88, 183, 231, 239, 174, 232, 70, 50, 152, 224, 11, 125, 21, 87, + 247, 254, 210, 131, 127, 209, 241, 178, 86, 3, 197, 164, 255, 12, 249, 238, + 5, 153, 58, 160, 73, 129, 1, 31, 98, 56, 70, 70, 155, 119, 95, 62, + 93, 163, 162, 38, 64, 177, 227, 111, 81, 98, 140, 12, 86, 210, 45, 120, + 91, 25, 12, 6, 138, 125, 166, 226, 155, 26, 206, 245, 36, 26, 4, 160, + 2, 94, 141, 19, 9, 204, 243, 238, 196, 36, 218, 23, 60, 95, 156, 240, + 245, 114, 114, 104, 8, 155, 27, 80, 46, 122, 126, 68, 65, 71, 85, 244, + 0, 242, 45, 10, 205, 253, 121, 104, 64, 31, 96, 152, 113, 118, 214, 196, + 62, 87, 119, 240, 234, 166, 56, 231, 23, 5, 124, 255, 135, 244, 83, 5, + 5, 128, 70, 91, 85, 39, 151, 189, 228, 102, 152, 8, 87, 120, 208, 206, + 215, 54, 0, 178, 194, 8, 177, 184, 123, 177, 75, 247, 98, 182, 4, 35, + 165, 122, 145, 95, 184, 116, 249, 120, 48, 107, 183, 29, 113, 11, 215, 74, + 65, 67, 158, 98, 210, 151, 193, 176, 218, 156, 92, 243, 0, 207, 21, 97, + 20, 251, 104, 199, 12, 45, 202, 246, 90, 40, 33, 5, 96, 196, 90, 94, + 180, 52, 13, 9, 176, 29, 53, 42, 163, 95, 24, 14, 219, 235, 150, 2, + 178, 209, 106, 181, 47, 186, 62, 38, 42, 10, 140, 223, 159, 160, 14, 230, + 37, 136, 146, 225, 121, 10, 219, 192, 208, 168, 4, 228, 76, 227, 232, 252, + 127, 115, 85, 76, 177, 45, 53, 11, 190, 80, 247, 31, 188, 232, 135, 200, + 121, 48, 110, 3, 120, 103, 193, 229, 61, 123, 24, 189, 86, 82, 207, 62, + 142, 80, 50, 160, 203, 1, 124, 27, 213, 182, 178, 193, 88, 243, 108, 205, + 7, 98, 76, 141, 46, 10, 104, 104, 40, 188, 63, 72, 99, 160, 95, 48, + 15, 176, 187, 167, 233, 170, 18, 221, 165, 0, 11, 1, 193, 30, 24, 126, + 22, 147, 79, 141, 118, 221, 96, 208, 152, 23, 151, 162, 142, 182, 25, 77, + 91, 209, 181, 48, 162, 240, 250, 43, 207, 235, 252, 104, 4, 218, 129, 7, + 247, 46, 71, 240, 62, 1, 211, 134, 87, 18, 0, 194, 175, 11, 36, 94, + 24, 247, 210, 0, 250, 188, 39, 58, 6, 19, 37, 80, 52, 125, 247, 242, + 124, 187, 222, 29, 236, 229, 141, 25, 232, 249, 250, 140, 132, 79, 105, 220, + 7, 9, 159, 82, 184, 77, 1, 201, 210, 108, 200, 157, 176, 187, 99, 132, + 232, 180, 66, 42, 135, 128, 246, 145, 2, 221, 80, 174, 58, 16, 238, 132, + 152, 112, 64, 255, 128, 186, 227, 5, 222, 227, 0, 85, 7, 104, 202, 192, + 83, 227, 47, 141, 174, 129, 112, 177, 141, 138, 110, 175, 224, 81, 90, 118, + 85, 168, 26, 68, 204, 2, 99, 25, 64, 47, 124, 16, 101, 39, 91, 19, + 251, 12, 74, 71, 13, 109, 65, 230, 242, 124, 72, 50, 96, 181, 47, 175, + 167, 151, 34, 93, 244, 236, 173, 165, 212, 183, 94, 216, 250, 155, 222, 218, + 65, 239, 219, 175, 84, 184, 153, 36, 253, 148, 141, 223, 231, 193, 188, 242, + 104, 208, 206, 136, 46, 220, 205, 193, 198, 2, 94, 233, 77, 187, 232, 29, + 71, 27, 158, 253, 128, 18, 76, 183, 112, 59, 240, 163, 202, 90, 17, 149, + 67, 161, 88, 174, 70, 183, 119, 32, 157, 18, 109, 63, 221, 52, 246, 85, + 137, 81, 49, 250, 50, 223, 94, 46, 141, 248, 54, 141, 120, 60, 161, 151, + 0, 158, 86, 189, 171, 18, 157, 43, 124, 83, 116, 129, 14, 126, 132, 91, + 42, 150, 91, 23, 154, 20, 213, 80, 79, 52, 25, 112, 107, 255, 186, 189, + 128, 228, 80, 149, 171, 226, 66, 177, 86, 5, 31, 143, 10, 235, 22, 108, + 124, 239, 154, 68, 59, 138, 157, 125, 95, 232, 220, 92, 138, 250, 142, 98, + 151, 6, 175, 92, 189, 235, 196, 187, 30, 152, 235, 166, 32, 151, 175, 222, + 240, 6, 242, 0, 33, 163, 147, 43, 143, 49, 171, 195, 114, 196, 8, 224, + 185, 127, 226, 64, 8, 239, 142, 170, 81, 5, 79, 100, 99, 66, 22, 252, + 78, 183, 142, 164, 218, 51, 12, 180, 103, 30, 221, 4, 80, 115, 69, 69, + 135, 129, 187, 187, 241, 98, 200, 50, 6, 0, 115, 37, 242, 99, 184, 2, + 124, 131, 109, 30, 237, 142, 129, 222, 62, 159, 207, 64, 119, 148, 36, 46, + 86, 253, 126, 139, 219, 31, 22, 251, 135, 197, 254, 144, 195, 129, 9, 150, + 100, 112, 42, 62, 142, 148, 76, 127, 3, 123, 127, 63, 230, 237, 185, 144, + 140, 232, 168, 90, 207, 50, 194, 143, 189, 153, 15, 230, 126, 139, 185, 27, + 158, 237, 172, 0, 49, 104, 81, 69, 63, 37, 178, 201, 68, 10, 79, 183, + 213, 157, 106, 120, 241, 169, 186, 235, 187, 160, 82, 217, 253, 34, 170, 225, + 5, 21, 112, 186, 122, 113, 250, 184, 76, 47, 97, 223, 197, 119, 71, 124, + 48, 229, 127, 50, 83, 158, 29, 206, 32, 83, 26, 167, 68, 54, 153, 248, + 93, 5, 237, 199, 22, 248, 7, 71, 255, 66, 142, 182, 65, 59, 96, 9, + 5, 141, 56, 27, 2, 191, 218, 23, 96, 54, 13, 152, 178, 49, 254, 134, + 140, 253, 125, 205, 225, 15, 127, 187, 15, 127, 187, 15, 127, 187, 15, 209, + 252, 103, 17, 205, 29, 219, 5, 118, 174, 97, 47, 97, 123, 192, 208, 26, + 190, 138, 238, 146, 51, 147, 240, 236, 45, 32, 197, 254, 40, 202, 9, 95, + 139, 127, 125, 170, 186, 54, 12, 26, 1, 155, 61, 222, 133, 249, 4, 175, + 138, 83, 45, 96, 254, 194, 166, 54, 108, 47, 122, 2, 90, 97, 9, 6, + 154, 129, 189, 96, 247, 101, 0, 240, 148, 127, 141, 122, 87, 211, 67, 204, + 207, 49, 42, 150, 193, 98, 212, 47, 56, 117, 93, 46, 174, 235, 188, 232, + 116, 125, 6, 129, 56, 121, 154, 192, 122, 101, 95, 92, 198, 119, 85, 148, + 117, 87, 134, 65, 54, 224, 99, 116, 74, 225, 162, 161, 206, 33, 159, 178, + 84, 54, 71, 60, 234, 119, 33, 233, 74, 14, 203, 156, 124, 200, 1, 233, + 209, 194, 152, 22, 237, 104, 92, 252, 242, 99, 191, 251, 20, 159, 242, 52, + 247, 120, 180, 33, 251, 223, 88, 228, 37, 143, 161, 212, 167, 59, 237, 22, + 169, 181, 4, 167, 219, 50, 140, 41, 149, 220, 247, 250, 208, 124, 31, 154, + 239, 175, 172, 249, 162, 243, 24, 87, 18, 236, 124, 28, 43, 114, 25, 131, + 17, 217, 124, 249, 35, 232, 216, 95, 94, 89, 230, 112, 138, 122, 232, 156, + 62, 84, 151, 102, 114, 10, 227, 69, 233, 175, 123, 80, 129, 235, 173, 84, + 37, 155, 6, 76, 81, 150, 208, 161, 231, 110, 2, 130, 124, 214, 217, 199, + 211, 28, 242, 106, 154, 243, 33, 131, 63, 100, 240, 127, 150, 12, 78, 57, + 25, 247, 33, 133, 255, 154, 82, 248, 249, 93, 137, 27, 184, 15, 31, 75, + 224, 248, 57, 155, 120, 78, 89, 50, 234, 168, 128, 92, 229, 60, 57, 57, + 251, 177, 35, 71, 41, 232, 13, 53, 90, 233, 22, 154, 37, 32, 15, 169, + 132, 23, 212, 91, 203, 170, 31, 28, 248, 215, 228, 192, 167, 222, 224, 40, + 90, 243, 139, 160, 31, 84, 3, 237, 28, 121, 48, 237, 160, 100, 246, 58, + 153, 122, 237, 122, 60, 57, 36, 115, 89, 38, 155, 187, 184, 43, 158, 130, + 54, 158, 183, 250, 73, 212, 48, 84, 254, 140, 209, 128, 46, 19, 200, 81, + 41, 158, 93, 146, 73, 127, 219, 235, 184, 35, 36, 16, 179, 162, 165, 36, + 15, 207, 39, 79, 156, 187, 10, 152, 118, 198, 87, 183, 39, 236, 11, 242, + 22, 229, 234, 90, 104, 130, 248, 184, 144, 252, 63, 130, 251, 57, 28, 12, + 0, 242, 129, 21, 12, 101, 229, 229, 64, 132, 15, 82, 151, 83, 17, 151, + 212, 199, 209, 136, 15, 102, 252, 55, 69, 30, 169, 168, 240, 40, 90, 36, + 24, 147, 209, 71, 68, 23, 212, 166, 139, 214, 245, 113, 181, 56, 176, 140, + 114, 41, 148, 77, 133, 38, 204, 135, 217, 203, 84, 4, 2, 221, 90, 198, + 225, 99, 62, 239, 51, 171, 47, 56, 69, 96, 127, 199, 96, 240, 152, 240, + 239, 20, 129, 175, 18, 70, 195, 252, 49, 190, 167, 91, 159, 15, 16, 127, + 127, 21, 110, 198, 136, 24, 251, 84, 236, 230, 176, 37, 242, 97, 117, 108, + 227, 234, 56, 27, 9, 35, 131, 136, 46, 108, 175, 174, 10, 56, 71, 66, + 183, 220, 71, 211, 171, 199, 177, 69, 232, 91, 151, 131, 184, 14, 240, 36, + 168, 174, 110, 43, 58, 188, 78, 177, 163, 187, 174, 253, 86, 132, 170, 63, + 16, 23, 192, 181, 88, 227, 230, 88, 162, 140, 96, 55, 65, 133, 110, 96, + 41, 166, 98, 89, 133, 141, 141, 2, 216, 95, 15, 147, 11, 202, 64, 84, + 244, 192, 139, 179, 57, 246, 54, 123, 246, 18, 157, 151, 137, 132, 216, 11, + 149, 125, 1, 154, 62, 161, 167, 231, 111, 228, 15, 67, 211, 84, 253, 75, + 151, 157, 102, 65, 13, 48, 163, 83, 208, 42, 116, 224, 163, 167, 63, 14, + 127, 36, 130, 149, 157, 130, 160, 161, 150, 126, 215, 169, 225, 127, 123, 244, + 129, 60, 78, 144, 15, 248, 200, 182, 208, 248, 55, 176, 142, 232, 120, 113, + 216, 162, 8, 242, 213, 4, 144, 236, 29, 36, 109, 178, 33, 58, 206, 197, + 201, 231, 95, 249, 211, 254, 0, 60, 227, 1, 195, 155, 131, 246, 131, 215, + 140, 125, 62, 190, 144, 95, 240, 207, 199, 12, 9, 39, 32, 101, 32, 71, + 142, 232, 14, 116, 32, 32, 208, 195, 72, 140, 31, 170, 7, 39, 122, 104, + 219, 203, 232, 161, 162, 131, 206, 6, 95, 68, 226, 159, 153, 191, 31, 255, + 135, 122, 65, 85, 12, 125, 17, 52, 219, 11, 251, 247, 207, 199, 255, 161, + 113, 250, 101, 129, 51, 112, 171, 227, 44, 101, 64, 61, 128, 145, 160, 99, + 55, 188, 94, 238, 124, 177, 196, 45, 251, 93, 208, 224, 201, 21, 116, 104, + 37, 121, 151, 195, 21, 238, 245, 135, 69, 210, 14, 240, 221, 231, 207, 228, + 43, 137, 101, 48, 253, 239, 71, 60, 7, 190, 145, 124, 37, 24, 236, 37, + 78, 126, 249, 159, 220, 43, 245, 134, 135, 239, 194, 182, 205, 203, 59, 153, + 196, 153, 158, 162, 181, 60, 15, 29, 72, 78, 30, 140, 188, 124, 98, 23, + 202, 115, 84, 217, 199, 6, 112, 36, 36, 176, 174, 71, 231, 74, 215, 252, + 75, 38, 155, 88, 84, 155, 63, 203, 252, 62, 67, 165, 104, 249, 250, 75, + 209, 208, 69, 184, 251, 20, 159, 76, 34, 178, 244, 243, 33, 50, 4, 95, + 5, 143, 102, 156, 98, 9, 248, 88, 124, 122, 9, 77, 38, 110, 195, 159, + 199, 121, 83, 93, 241, 87, 63, 126, 141, 183, 130, 8, 138, 249, 116, 139, + 81, 135, 114, 193, 79, 71, 249, 3, 12, 85, 96, 133, 178, 56, 241, 72, + 228, 35, 167, 117, 52, 68, 209, 83, 246, 252, 148, 220, 148, 52, 161, 189, + 19, 40, 39, 142, 161, 81, 91, 39, 92, 60, 120, 87, 221, 6, 232, 104, + 87, 242, 170, 149, 219, 155, 86, 254, 42, 58, 20, 10, 62, 156, 122, 114, + 184, 223, 118, 125, 96, 169, 198, 193, 41, 162, 244, 87, 3, 164, 179, 55, + 233, 132, 180, 187, 109, 98, 226, 149, 188, 30, 112, 233, 67, 146, 202, 82, + 239, 24, 237, 239, 80, 198, 183, 157, 67, 252, 89, 59, 7, 112, 123, 254, + 33, 183, 87, 92, 219, 1, 214, 97, 188, 57, 175, 128, 84, 180, 191, 144, + 189, 74, 165, 40, 163, 251, 3, 123, 195, 149, 232, 168, 216, 82, 181, 145, + 145, 129, 142, 68, 221, 239, 38, 35, 164, 75, 12, 83, 180, 41, 172, 4, + 110, 180, 185, 30, 31, 201, 83, 151, 232, 200, 148, 109, 97, 41, 49, 77, + 43, 209, 250, 243, 105, 107, 227, 118, 72, 197, 38, 212, 101, 227, 227, 34, + 102, 81, 64, 19, 73, 55, 46, 165, 243, 247, 165, 225, 194, 6, 54, 84, + 85, 229, 44, 65, 201, 28, 157, 103, 30, 125, 246, 121, 167, 221, 67, 189, + 23, 209, 22, 197, 185, 131, 71, 211, 16, 49, 231, 100, 130, 0, 180, 229, + 14, 207, 255, 33, 44, 244, 82, 15, 188, 52, 2, 187, 42, 140, 14, 167, + 68, 177, 225, 116, 116, 178, 238, 210, 78, 152, 135, 90, 16, 97, 194, 115, + 69, 169, 23, 166, 188, 235, 128, 37, 90, 185, 191, 132, 157, 243, 30, 244, + 24, 48, 189, 226, 67, 82, 39, 89, 135, 38, 118, 231, 252, 168, 154, 164, + 250, 164, 225, 244, 154, 78, 184, 39, 64, 45, 3, 87, 160, 34, 173, 242, + 64, 24, 158, 145, 206, 123, 12, 169, 203, 71, 103, 180, 104, 8, 67, 93, + 119, 117, 126, 229, 151, 182, 2, 96, 72, 120, 228, 232, 205, 102, 136, 241, + 18, 95, 64, 188, 82, 236, 149, 134, 141, 81, 110, 233, 191, 37, 236, 84, + 211, 221, 162, 197, 43, 119, 93, 31, 84, 202, 240, 28, 92, 84, 224, 140, + 69, 176, 239, 208, 235, 247, 149, 147, 215, 197, 98, 77, 45, 122, 128, 219, + 81, 113, 53, 62, 15, 28, 107, 253, 63, 148, 109, 205, 226, 20, 92, 55, + 125, 112, 244, 123, 27, 232, 46, 208, 4, 162, 133, 150, 57, 225, 129, 202, + 46, 24, 120, 238, 203, 66, 181, 116, 127, 133, 78, 126, 95, 163, 80, 22, + 204, 63, 162, 236, 236, 243, 236, 164, 249, 125, 57, 208, 253, 249, 211, 40, + 126, 9, 134, 99, 209, 107, 160, 97, 109, 223, 210, 242, 135, 210, 3, 236, + 211, 243, 243, 167, 88, 55, 192, 156, 70, 55, 208, 161, 102, 59, 1, 41, + 56, 7, 68, 58, 225, 6, 244, 203, 230, 183, 177, 179, 3, 198, 3, 121, + 98, 39, 130, 77, 2, 205, 78, 62, 182, 138, 238, 14, 51, 188, 75, 241, + 198, 43, 85, 151, 169, 251, 187, 86, 245, 254, 64, 75, 15, 188, 238, 173, + 94, 170, 33, 176, 68, 193, 131, 26, 2, 59, 52, 250, 251, 174, 38, 191, + 10, 44, 116, 165, 19, 185, 59, 175, 251, 27, 59, 11, 138, 91, 234, 207, + 211, 74, 40, 186, 0, 100, 86, 13, 61, 101, 207, 79, 223, 182, 4, 115, + 110, 13, 48, 176, 35, 157, 246, 104, 53, 70, 80, 125, 49, 62, 172, 147, + 203, 82, 73, 141, 24, 197, 83, 185, 186, 170, 240, 47, 106, 247, 63, 237, + 154, 150, 104, 168, 186, 98, 123, 178, 13, 204, 194, 159, 75, 192, 188, 87, + 84, 5, 5, 226, 112, 109, 223, 62, 229, 100, 111, 210, 111, 118, 87, 114, + 198, 142, 228, 253, 8, 222, 29, 23, 109, 124, 65, 206, 231, 168, 103, 90, + 240, 58, 136, 221, 127, 98, 71, 32, 233, 142, 186, 97, 147, 128, 103, 111, + 210, 239, 239, 134, 217, 203, 155, 252, 62, 127, 27, 37, 146, 81, 88, 57, + 240, 207, 246, 225, 157, 160, 130, 195, 241, 10, 227, 99, 88, 253, 124, 90, + 211, 69, 29, 234, 69, 9, 253, 120, 233, 211, 27, 80, 114, 237, 255, 122, + 207, 151, 1, 67, 39, 17, 196, 230, 122, 57, 236, 218, 156, 255, 62, 237, + 124, 162, 28, 152, 212, 74, 98, 70, 120, 218, 253, 186, 236, 152, 193, 21, + 200, 189, 232, 252, 161, 122, 136, 70, 187, 248, 15, 22, 123, 145, 235, 251, + 125, 248, 33, 228, 232, 254, 53, 17, 158, 32, 155, 6, 188, 141, 69, 212, + 13, 76, 9, 140, 62, 91, 195, 120, 56, 67, 241, 78, 59, 252, 116, 116, + 225, 239, 237, 66, 249, 229, 86, 197, 120, 149, 24, 6, 39, 180, 69, 96, + 9, 193, 139, 122, 181, 115, 248, 158, 8, 246, 41, 113, 215, 34, 175, 71, + 119, 129, 131, 63, 16, 213, 187, 15, 219, 243, 75, 34, 165, 128, 142, 72, + 185, 118, 239, 254, 82, 79, 20, 50, 37, 25, 94, 4, 133, 244, 17, 21, + 5, 135, 17, 66, 240, 56, 14, 140, 108, 187, 128, 161, 28, 27, 104, 16, + 184, 7, 176, 81, 195, 56, 124, 12, 200, 116, 31, 6, 86, 89, 137, 126, + 20, 251, 70, 116, 28, 192, 145, 89, 20, 246, 7, 57, 31, 128, 87, 196, + 17, 75, 96, 89, 212, 7, 96, 34, 25, 133, 190, 249, 7, 224, 99, 43, + 186, 1, 240, 199, 79, 255, 85, 173, 178, 44, 65, 124, 66, 51, 69, 116, + 149, 44, 238, 139, 232, 170, 191, 56, 236, 78, 60, 89, 4, 69, 126, 122, + 35, 82, 203, 15, 24, 188, 120, 18, 198, 71, 57, 145, 15, 87, 56, 228, + 192, 69, 203, 174, 40, 6, 17, 90, 17, 64, 31, 172, 251, 167, 8, 55, + 232, 174, 65, 24, 29, 229, 141, 144, 44, 168, 122, 212, 104, 143, 235, 191, + 10, 7, 82, 169, 182, 171, 163, 106, 34, 150, 134, 169, 43, 232, 50, 144, + 187, 138, 43, 40, 60, 201, 185, 218, 7, 129, 85, 226, 74, 174, 35, 183, + 252, 128, 141, 80, 60, 148, 248, 30, 222, 184, 241, 222, 104, 232, 134, 245, + 34, 169, 254, 30, 186, 82, 62, 107, 229, 206, 237, 171, 160, 147, 234, 242, + 210, 157, 152, 175, 155, 106, 54, 138, 253, 68, 192, 46, 39, 95, 223, 232, + 32, 20, 74, 232, 186, 60, 44, 7, 172, 134, 55, 40, 134, 247, 70, 199, + 180, 122, 41, 196, 94, 135, 148, 57, 19, 122, 238, 39, 23, 41, 191, 171, + 118, 61, 7, 54, 249, 1, 19, 12, 49, 196, 61, 223, 118, 0, 255, 158, + 27, 70, 180, 244, 104, 55, 249, 170, 212, 32, 249, 29, 231, 81, 114, 133, + 210, 138, 80, 134, 43, 123, 255, 255, 179, 247, 38, 236, 109, 27, 73, 254, + 240, 87, 233, 213, 254, 223, 68, 78, 192, 11, 36, 37, 217, 51, 206, 62, + 178, 100, 217, 158, 177, 98, 141, 165, 196, 114, 156, 140, 30, 144, 108, 146, + 88, 129, 0, 131, 195, 18, 61, 207, 126, 247, 183, 170, 186, 1, 116, 55, + 14, 82, 62, 105, 7, 187, 19, 11, 104, 52, 64, 160, 143, 186, 235, 87, + 157, 57, 214, 36, 47, 118, 83, 17, 87, 228, 180, 254, 75, 190, 138, 204, + 225, 152, 38, 158, 7, 27, 146, 214, 43, 2, 175, 180, 217, 86, 81, 231, + 251, 88, 157, 178, 42, 202, 4, 88, 18, 25, 142, 93, 81, 62, 4, 56, + 204, 242, 106, 153, 183, 89, 37, 109, 154, 199, 94, 229, 140, 189, 246, 126, + 95, 55, 44, 191, 110, 25, 142, 36, 245, 162, 98, 143, 22, 90, 239, 38, + 6, 105, 77, 149, 75, 133, 173, 53, 130, 214, 134, 122, 135, 253, 77, 10, + 72, 36, 224, 234, 46, 123, 197, 47, 159, 26, 50, 140, 38, 101, 138, 169, + 130, 113, 108, 84, 138, 201, 159, 71, 14, 115, 97, 91, 16, 66, 171, 148, + 79, 228, 89, 170, 55, 238, 108, 48, 181, 166, 134, 46, 130, 58, 66, 246, + 35, 123, 217, 233, 117, 169, 126, 144, 243, 195, 80, 225, 193, 98, 109, 9, + 175, 154, 243, 87, 139, 197, 248, 87, 226, 76, 176, 34, 138, 71, 251, 246, + 207, 236, 204, 210, 206, 74, 212, 254, 139, 96, 217, 34, 138, 143, 225, 77, + 252, 86, 157, 9, 107, 152, 110, 49, 75, 69, 133, 195, 59, 4, 155, 45, + 220, 114, 31, 43, 163, 209, 77, 162, 84, 154, 186, 187, 48, 240, 170, 234, + 190, 189, 174, 117, 95, 220, 183, 55, 160, 186, 106, 234, 182, 150, 183, 150, + 191, 228, 32, 187, 51, 45, 203, 150, 255, 230, 214, 4, 104, 168, 97, 112, + 61, 220, 33, 75, 10, 173, 23, 86, 102, 12, 106, 3, 14, 185, 85, 75, + 109, 31, 118, 88, 167, 87, 33, 193, 191, 116, 128, 151, 135, 193, 50, 122, + 16, 166, 71, 86, 118, 84, 227, 6, 62, 48, 221, 192, 199, 134, 39, 64, + 247, 101, 188, 114, 222, 130, 104, 229, 207, 226, 121, 169, 237, 237, 148, 135, + 51, 148, 67, 206, 99, 190, 140, 50, 127, 148, 189, 85, 38, 76, 187, 99, + 31, 212, 12, 35, 122, 182, 30, 136, 216, 55, 75, 252, 169, 25, 189, 130, + 66, 191, 5, 223, 87, 75, 145, 94, 186, 203, 37, 80, 163, 144, 254, 88, + 226, 207, 93, 190, 239, 17, 140, 207, 13, 5, 83, 100, 222, 204, 158, 182, + 124, 200, 91, 170, 112, 235, 71, 94, 128, 155, 240, 2, 43, 51, 32, 143, + 161, 168, 158, 244, 207, 143, 59, 89, 100, 246, 70, 106, 124, 65, 84, 24, + 110, 215, 208, 247, 58, 54, 198, 84, 85, 12, 61, 159, 122, 124, 156, 230, + 203, 133, 226, 204, 202, 15, 21, 242, 47, 131, 81, 196, 119, 14, 11, 86, + 165, 56, 230, 126, 226, 40, 254, 205, 130, 104, 166, 70, 170, 239, 113, 167, + 59, 226, 131, 174, 182, 135, 35, 86, 8, 86, 48, 126, 69, 244, 42, 102, + 222, 145, 61, 50, 255, 169, 75, 83, 122, 236, 105, 113, 204, 186, 112, 217, + 234, 183, 251, 133, 46, 39, 129, 18, 2, 184, 175, 135, 65, 171, 226, 103, + 27, 99, 252, 215, 36, 253, 109, 209, 78, 59, 231, 206, 98, 236, 132, 66, + 100, 143, 210, 19, 75, 61, 41, 97, 252, 20, 168, 164, 24, 29, 15, 134, + 34, 38, 217, 88, 26, 90, 136, 78, 215, 232, 114, 234, 220, 186, 24, 183, + 135, 111, 16, 49, 248, 88, 150, 25, 206, 212, 251, 134, 198, 132, 163, 89, + 35, 139, 94, 64, 47, 171, 3, 202, 147, 27, 96, 18, 6, 33, 53, 155, + 222, 40, 140, 222, 114, 210, 224, 173, 247, 112, 192, 106, 5, 231, 94, 7, + 9, 27, 131, 166, 42, 192, 117, 225, 167, 227, 156, 177, 51, 84, 36, 169, + 194, 167, 98, 32, 153, 115, 111, 73, 214, 6, 28, 205, 22, 14, 39, 97, + 215, 122, 51, 124, 225, 249, 2, 149, 224, 37, 74, 197, 48, 204, 168, 16, + 2, 29, 31, 115, 129, 209, 139, 253, 132, 237, 66, 152, 122, 18, 232, 246, + 0, 20, 73, 248, 31, 40, 147, 199, 161, 115, 131, 241, 12, 78, 36, 227, + 24, 66, 25, 227, 0, 15, 52, 30, 2, 191, 190, 104, 87, 221, 54, 195, + 188, 202, 244, 198, 236, 77, 180, 91, 2, 255, 123, 130, 126, 70, 219, 140, + 227, 69, 1, 246, 140, 202, 139, 160, 182, 219, 109, 122, 86, 94, 113, 15, + 250, 138, 210, 167, 35, 84, 228, 243, 162, 170, 132, 229, 75, 208, 21, 31, + 86, 13, 53, 162, 69, 254, 196, 193, 100, 153, 113, 48, 225, 161, 26, 255, + 81, 179, 153, 216, 123, 239, 166, 65, 167, 91, 147, 110, 188, 156, 115, 81, + 8, 107, 225, 44, 175, 34, 58, 179, 180, 179, 170, 205, 244, 240, 138, 196, + 230, 30, 214, 46, 25, 116, 239, 239, 153, 68, 182, 234, 178, 230, 130, 188, + 79, 104, 234, 170, 148, 148, 226, 169, 151, 7, 76, 24, 52, 81, 119, 63, + 200, 116, 162, 210, 20, 16, 187, 91, 232, 247, 74, 103, 183, 149, 72, 143, + 153, 250, 215, 101, 199, 124, 214, 6, 214, 122, 63, 59, 234, 29, 100, 135, + 246, 190, 60, 84, 120, 122, 138, 166, 155, 199, 10, 104, 98, 245, 41, 58, + 217, 137, 167, 228, 55, 157, 56, 19, 37, 144, 197, 120, 43, 113, 145, 9, + 89, 64, 29, 161, 53, 49, 32, 95, 32, 175, 173, 74, 16, 164, 5, 231, + 190, 19, 212, 91, 30, 91, 202, 113, 201, 114, 147, 218, 116, 78, 98, 135, + 166, 108, 141, 209, 4, 154, 236, 108, 176, 194, 124, 73, 24, 126, 167, 77, + 173, 46, 121, 25, 236, 125, 237, 193, 53, 17, 135, 198, 82, 133, 149, 126, + 127, 141, 178, 102, 215, 41, 107, 24, 225, 61, 2, 189, 171, 160, 110, 61, + 9, 221, 201, 22, 6, 52, 144, 82, 213, 173, 40, 206, 44, 192, 110, 144, + 172, 138, 24, 126, 90, 12, 212, 38, 211, 39, 44, 179, 33, 227, 193, 74, + 228, 77, 134, 154, 147, 63, 104, 71, 96, 230, 120, 212, 36, 33, 117, 62, + 133, 134, 252, 17, 35, 64, 47, 91, 34, 6, 70, 91, 153, 45, 148, 62, + 116, 115, 222, 38, 189, 74, 29, 176, 45, 216, 41, 218, 110, 41, 245, 193, + 22, 122, 109, 178, 134, 212, 42, 12, 46, 200, 189, 28, 81, 41, 4, 120, + 249, 66, 100, 40, 176, 105, 226, 75, 220, 251, 9, 85, 113, 24, 241, 137, + 64, 192, 135, 59, 151, 192, 3, 45, 54, 90, 17, 254, 80, 155, 157, 4, + 254, 12, 215, 203, 131, 50, 254, 234, 185, 254, 245, 238, 206, 60, 142, 151, + 15, 58, 157, 8, 99, 171, 40, 246, 175, 61, 242, 130, 89, 180, 12, 226, + 246, 56, 88, 116, 40, 180, 169, 123, 191, 35, 127, 188, 37, 214, 78, 43, + 14, 90, 98, 49, 181, 231, 241, 194, 219, 62, 219, 67, 191, 91, 177, 77, + 96, 92, 121, 48, 11, 157, 229, 220, 29, 163, 197, 253, 127, 115, 61, 103, + 41, 206, 174, 34, 181, 143, 85, 117, 161, 204, 20, 150, 69, 67, 165, 204, + 233, 152, 226, 213, 114, 163, 230, 38, 118, 75, 147, 56, 154, 68, 91, 15, + 157, 129, 123, 246, 85, 51, 155, 121, 147, 204, 69, 100, 132, 126, 75, 169, + 242, 19, 62, 187, 87, 165, 3, 145, 141, 172, 35, 82, 26, 177, 242, 122, + 104, 16, 119, 187, 90, 172, 208, 73, 181, 216, 167, 102, 46, 20, 104, 96, + 183, 46, 154, 116, 95, 167, 7, 151, 242, 232, 163, 147, 5, 225, 78, 213, + 165, 153, 45, 88, 156, 7, 181, 9, 234, 105, 56, 1, 215, 226, 13, 244, + 80, 131, 50, 118, 126, 70, 142, 174, 94, 97, 37, 73, 35, 170, 201, 98, + 69, 119, 91, 91, 65, 24, 252, 159, 155, 64, 205, 59, 214, 228, 239, 124, + 156, 73, 211, 146, 125, 211, 0, 6, 204, 131, 7, 237, 45, 74, 79, 115, + 1, 4, 189, 2, 34, 186, 97, 251, 88, 245, 1, 22, 203, 173, 146, 215, + 46, 248, 45, 106, 114, 19, 246, 196, 115, 34, 145, 141, 45, 91, 174, 102, + 216, 98, 21, 90, 74, 178, 178, 97, 43, 25, 86, 145, 129, 41, 248, 191, + 94, 223, 229, 178, 181, 6, 175, 232, 245, 186, 14, 132, 137, 84, 52, 243, + 232, 30, 24, 234, 244, 204, 159, 122, 152, 180, 147, 190, 140, 81, 236, 247, + 231, 192, 197, 104, 236, 172, 102, 153, 200, 14, 168, 159, 212, 38, 77, 92, + 27, 134, 175, 49, 77, 188, 143, 193, 231, 149, 59, 229, 198, 13, 61, 218, + 32, 120, 96, 165, 7, 53, 121, 76, 61, 61, 249, 239, 61, 50, 145, 190, + 77, 247, 30, 166, 168, 23, 131, 166, 200, 21, 111, 196, 76, 153, 109, 101, + 236, 166, 42, 28, 170, 247, 241, 194, 161, 54, 50, 202, 193, 11, 180, 210, + 26, 87, 89, 164, 69, 85, 162, 141, 136, 103, 37, 221, 14, 87, 2, 72, + 43, 42, 249, 57, 130, 141, 24, 36, 97, 238, 9, 234, 171, 97, 218, 159, + 56, 56, 75, 13, 202, 154, 232, 241, 64, 31, 41, 10, 75, 65, 72, 64, + 61, 162, 189, 81, 56, 85, 22, 48, 165, 7, 39, 213, 68, 73, 221, 41, + 152, 169, 42, 34, 170, 46, 122, 230, 174, 145, 62, 231, 79, 159, 157, 92, + 104, 177, 82, 88, 82, 46, 197, 153, 45, 198, 109, 173, 137, 241, 41, 148, + 75, 202, 75, 36, 125, 181, 161, 60, 85, 78, 32, 145, 183, 40, 242, 21, + 233, 223, 187, 100, 232, 174, 117, 198, 168, 18, 229, 128, 36, 206, 131, 173, + 146, 224, 246, 200, 226, 86, 161, 69, 162, 195, 9, 70, 6, 8, 38, 254, + 83, 199, 142, 196, 184, 228, 214, 198, 52, 113, 57, 51, 53, 14, 52, 167, + 244, 251, 153, 204, 182, 96, 184, 234, 153, 15, 16, 43, 98, 55, 240, 215, + 146, 127, 203, 176, 168, 179, 193, 35, 250, 108, 58, 77, 235, 188, 173, 37, + 2, 104, 123, 95, 99, 243, 5, 216, 206, 66, 113, 1, 197, 12, 6, 124, + 236, 152, 42, 204, 161, 36, 24, 34, 173, 227, 235, 120, 125, 131, 225, 217, + 96, 120, 54, 24, 158, 141, 62, 246, 181, 235, 99, 160, 140, 245, 43, 147, + 129, 49, 198, 1, 9, 57, 86, 3, 181, 228, 95, 133, 251, 105, 153, 167, + 160, 222, 183, 187, 90, 234, 233, 134, 81, 184, 223, 12, 52, 196, 6, 8, + 104, 88, 134, 175, 128, 128, 134, 162, 247, 19, 12, 136, 35, 43, 160, 139, + 24, 61, 49, 199, 138, 125, 174, 0, 76, 213, 90, 74, 248, 168, 17, 98, + 251, 34, 188, 9, 216, 207, 103, 118, 183, 245, 228, 248, 37, 140, 212, 63, + 131, 137, 115, 205, 46, 78, 15, 47, 217, 160, 219, 213, 27, 250, 182, 218, + 242, 242, 89, 235, 146, 193, 231, 97, 211, 47, 254, 181, 31, 220, 248, 138, + 161, 22, 83, 14, 153, 193, 53, 137, 77, 65, 111, 122, 125, 134, 33, 118, + 72, 68, 158, 226, 198, 125, 46, 247, 219, 11, 216, 44, 158, 131, 118, 189, + 243, 0, 52, 143, 180, 89, 220, 129, 21, 0, 21, 188, 27, 13, 232, 178, + 219, 182, 245, 124, 103, 37, 22, 167, 71, 158, 22, 205, 37, 77, 78, 96, + 46, 71, 210, 168, 150, 80, 186, 56, 4, 163, 47, 120, 52, 11, 30, 33, + 212, 20, 67, 172, 35, 91, 219, 235, 137, 179, 88, 56, 245, 93, 128, 175, + 212, 119, 200, 153, 77, 125, 191, 134, 22, 175, 167, 197, 98, 125, 29, 122, + 192, 214, 54, 89, 12, 159, 93, 217, 176, 43, 245, 48, 114, 195, 188, 145, + 249, 184, 100, 182, 25, 65, 203, 149, 4, 65, 176, 140, 243, 18, 115, 77, + 158, 117, 157, 175, 34, 91, 119, 230, 108, 2, 47, 48, 119, 194, 165, 89, + 190, 171, 219, 45, 14, 116, 146, 219, 228, 215, 216, 75, 138, 50, 243, 190, + 213, 72, 205, 141, 212, 252, 23, 147, 154, 63, 55, 80, 9, 146, 155, 10, + 131, 187, 160, 53, 143, 60, 144, 235, 114, 74, 51, 242, 164, 184, 151, 159, + 213, 106, 239, 10, 176, 80, 121, 88, 143, 142, 28, 85, 128, 199, 54, 194, + 198, 150, 156, 198, 43, 87, 171, 39, 72, 242, 79, 157, 91, 146, 250, 20, + 137, 68, 47, 0, 181, 243, 175, 196, 137, 220, 214, 19, 39, 137, 16, 77, + 22, 69, 140, 252, 240, 81, 128, 119, 43, 145, 222, 34, 253, 37, 86, 163, + 129, 178, 233, 19, 78, 169, 130, 155, 241, 208, 119, 163, 32, 14, 131, 229, + 170, 212, 231, 181, 198, 101, 154, 78, 186, 86, 77, 138, 238, 73, 203, 73, + 17, 64, 85, 106, 238, 157, 115, 95, 116, 72, 127, 19, 123, 125, 55, 139, + 255, 214, 189, 179, 93, 162, 161, 177, 13, 141, 253, 74, 104, 108, 35, 216, + 126, 155, 70, 134, 97, 167, 219, 175, 4, 77, 20, 60, 232, 152, 47, 227, + 121, 235, 197, 180, 117, 226, 114, 111, 146, 51, 163, 73, 48, 181, 148, 227, + 18, 113, 151, 238, 47, 56, 40, 116, 121, 151, 250, 228, 238, 75, 137, 250, + 96, 171, 117, 29, 244, 23, 80, 87, 219, 127, 84, 78, 242, 75, 196, 195, + 214, 177, 244, 65, 238, 138, 37, 32, 242, 18, 20, 119, 38, 77, 158, 8, + 168, 122, 159, 96, 149, 191, 143, 126, 74, 127, 145, 77, 232, 181, 130, 105, + 107, 138, 175, 85, 1, 167, 87, 41, 206, 119, 53, 75, 203, 137, 27, 70, + 49, 211, 162, 199, 251, 102, 100, 247, 57, 31, 7, 160, 231, 215, 119, 50, + 77, 243, 42, 163, 51, 245, 6, 148, 11, 14, 10, 171, 248, 14, 90, 67, + 113, 112, 104, 14, 82, 63, 240, 70, 3, 68, 218, 121, 121, 228, 154, 241, + 248, 52, 219, 35, 146, 88, 190, 171, 0, 86, 78, 112, 99, 78, 132, 112, + 37, 90, 34, 23, 5, 94, 105, 36, 22, 2, 37, 59, 144, 123, 80, 164, + 113, 220, 204, 131, 136, 51, 47, 229, 105, 140, 251, 152, 176, 16, 73, 23, + 45, 60, 144, 106, 71, 114, 7, 72, 62, 85, 34, 105, 235, 169, 23, 113, + 128, 168, 148, 248, 26, 148, 120, 49, 210, 18, 47, 232, 103, 198, 193, 98, + 20, 180, 70, 193, 45, 245, 117, 174, 185, 8, 11, 21, 41, 41, 74, 121, + 74, 37, 247, 226, 67, 82, 47, 62, 25, 133, 24, 116, 236, 106, 16, 97, + 65, 33, 210, 45, 65, 180, 97, 38, 79, 136, 48, 88, 102, 67, 89, 252, + 84, 49, 58, 202, 160, 17, 197, 8, 43, 35, 2, 178, 248, 4, 163, 67, + 9, 214, 222, 35, 15, 120, 140, 98, 195, 108, 156, 74, 141, 232, 246, 77, + 138, 110, 141, 83, 169, 145, 247, 54, 243, 132, 72, 106, 142, 107, 137, 40, + 57, 28, 88, 242, 239, 6, 102, 134, 189, 13, 146, 246, 27, 29, 184, 33, + 164, 13, 33, 109, 8, 233, 95, 130, 144, 10, 58, 146, 43, 204, 30, 157, + 91, 250, 105, 89, 242, 18, 198, 82, 250, 134, 58, 88, 0, 213, 120, 17, + 194, 247, 205, 2, 12, 158, 212, 58, 202, 172, 226, 247, 212, 9, 77, 95, + 210, 39, 16, 156, 27, 138, 223, 80, 252, 134, 226, 55, 20, 255, 27, 164, + 248, 72, 136, 29, 47, 167, 248, 33, 157, 91, 250, 105, 93, 92, 64, 185, + 253, 163, 137, 9, 104, 40, 119, 67, 185, 155, 152, 0, 49, 52, 64, 114, + 217, 225, 136, 135, 210, 85, 79, 21, 220, 210, 11, 87, 78, 126, 193, 170, + 186, 80, 26, 168, 232, 46, 64, 202, 211, 171, 85, 79, 167, 88, 173, 90, + 177, 194, 170, 181, 253, 202, 170, 114, 214, 93, 46, 47, 223, 67, 46, 141, + 194, 15, 99, 137, 236, 226, 15, 179, 221, 229, 109, 101, 33, 197, 215, 27, + 244, 105, 24, 243, 183, 201, 152, 135, 157, 238, 176, 50, 80, 250, 216, 13, + 227, 149, 40, 199, 7, 7, 86, 122, 176, 129, 61, 171, 95, 204, 75, 241, + 3, 218, 80, 155, 149, 101, 109, 92, 6, 13, 247, 252, 203, 115, 207, 134, + 188, 126, 245, 228, 117, 208, 177, 7, 149, 184, 0, 39, 158, 187, 100, 223, + 177, 151, 65, 76, 131, 234, 5, 227, 72, 20, 169, 114, 151, 24, 159, 56, + 142, 44, 237, 172, 20, 62, 3, 107, 13, 10, 198, 157, 22, 104, 233, 217, + 7, 42, 103, 175, 189, 142, 111, 160, 32, 6, 212, 227, 219, 112, 5, 223, + 70, 188, 179, 98, 216, 106, 229, 208, 119, 5, 52, 188, 134, 212, 55, 164, + 254, 155, 36, 245, 13, 213, 254, 54, 169, 54, 106, 145, 157, 238, 253, 114, + 170, 253, 143, 179, 199, 79, 216, 97, 24, 243, 169, 51, 142, 137, 96, 255, + 239, 146, 207, 174, 156, 180, 197, 42, 180, 148, 16, 238, 26, 184, 188, 52, + 49, 78, 132, 83, 209, 175, 141, 131, 5, 2, 218, 98, 144, 31, 131, 167, + 186, 226, 119, 88, 130, 64, 192, 236, 248, 232, 130, 253, 153, 56, 126, 236, + 190, 19, 73, 86, 240, 191, 131, 219, 3, 70, 60, 163, 36, 44, 234, 95, + 137, 131, 213, 133, 201, 34, 38, 39, 165, 215, 228, 97, 253, 5, 86, 245, + 126, 157, 170, 247, 60, 88, 4, 184, 150, 61, 248, 107, 201, 191, 37, 198, + 214, 95, 221, 153, 207, 99, 24, 58, 165, 198, 113, 1, 131, 160, 89, 64, + 95, 116, 1, 9, 32, 233, 127, 136, 37, 131, 26, 55, 124, 34, 80, 20, + 127, 246, 25, 32, 165, 17, 79, 186, 18, 82, 250, 20, 147, 82, 111, 220, + 120, 206, 30, 185, 130, 114, 46, 160, 229, 10, 91, 174, 70, 174, 160, 156, + 122, 139, 89, 232, 174, 24, 52, 43, 66, 71, 151, 2, 168, 6, 200, 97, + 69, 164, 44, 66, 44, 101, 106, 151, 105, 129, 40, 5, 1, 46, 160, 181, + 159, 38, 94, 236, 194, 172, 241, 80, 4, 90, 83, 190, 247, 26, 3, 89, + 241, 125, 101, 73, 237, 181, 47, 252, 146, 227, 194, 65, 192, 103, 5, 142, + 86, 136, 231, 226, 18, 167, 65, 84, 79, 87, 177, 42, 161, 195, 85, 2, + 145, 39, 176, 204, 243, 24, 216, 198, 189, 28, 144, 110, 88, 222, 237, 177, + 63, 17, 157, 196, 199, 231, 189, 100, 10, 115, 1, 4, 127, 237, 174, 111, + 132, 251, 70, 184, 111, 132, 251, 134, 139, 109, 145, 24, 116, 31, 133, 251, + 170, 194, 127, 2, 190, 243, 205, 225, 100, 226, 102, 240, 130, 62, 182, 89, + 233, 193, 38, 57, 163, 102, 98, 137, 120, 170, 182, 102, 212, 220, 27, 223, + 149, 53, 227, 206, 29, 47, 38, 246, 124, 198, 151, 75, 130, 109, 58, 131, + 59, 163, 192, 111, 76, 40, 13, 149, 253, 54, 169, 108, 153, 181, 60, 23, + 117, 26, 123, 249, 95, 140, 56, 215, 198, 9, 73, 226, 124, 6, 191, 229, + 250, 57, 105, 198, 42, 172, 158, 0, 21, 82, 207, 75, 235, 133, 96, 229, + 51, 118, 206, 249, 36, 147, 133, 247, 134, 195, 254, 157, 165, 248, 30, 188, + 120, 132, 233, 244, 21, 210, 123, 145, 35, 80, 76, 81, 47, 207, 207, 163, + 100, 124, 181, 236, 148, 33, 77, 95, 118, 94, 183, 140, 26, 34, 106, 149, + 216, 13, 223, 211, 6, 94, 114, 151, 247, 92, 247, 150, 131, 79, 242, 150, + 253, 240, 227, 190, 165, 253, 73, 222, 114, 0, 122, 235, 199, 124, 203, 222, + 71, 120, 203, 34, 227, 183, 155, 48, 179, 134, 245, 127, 54, 214, 223, 240, + 227, 111, 156, 31, 147, 178, 100, 87, 20, 250, 144, 252, 248, 28, 24, 173, + 35, 176, 13, 34, 58, 180, 178, 163, 82, 151, 245, 175, 78, 232, 74, 164, + 156, 156, 171, 104, 9, 201, 235, 122, 52, 74, 80, 67, 9, 183, 140, 18, + 54, 33, 67, 13, 201, 253, 12, 42, 208, 11, 111, 210, 58, 13, 224, 219, + 216, 121, 28, 186, 75, 78, 94, 148, 72, 28, 94, 81, 132, 102, 118, 82, + 162, 255, 152, 184, 237, 155, 21, 211, 110, 8, 107, 67, 88, 27, 194, 218, + 16, 214, 111, 157, 176, 194, 143, 5, 129, 199, 14, 70, 210, 57, 125, 144, + 250, 164, 15, 84, 87, 180, 34, 202, 170, 208, 205, 246, 208, 136, 162, 57, + 118, 99, 172, 91, 155, 85, 236, 61, 72, 29, 166, 74, 31, 170, 102, 24, + 229, 184, 93, 107, 253, 201, 205, 42, 252, 234, 87, 97, 15, 65, 146, 171, + 34, 130, 207, 16, 45, 139, 157, 7, 97, 76, 149, 60, 241, 44, 130, 19, + 75, 61, 81, 248, 250, 143, 213, 214, 42, 124, 6, 250, 244, 151, 41, 48, + 103, 84, 97, 182, 122, 129, 101, 150, 212, 138, 33, 28, 235, 45, 97, 228, + 193, 14, 214, 251, 204, 78, 114, 59, 215, 173, 27, 101, 107, 175, 36, 84, + 152, 14, 216, 5, 66, 125, 190, 214, 175, 138, 198, 75, 163, 84, 102, 250, + 166, 71, 161, 27, 35, 16, 126, 78, 168, 95, 210, 58, 32, 190, 138, 43, + 20, 72, 57, 189, 146, 228, 66, 200, 217, 82, 222, 78, 34, 128, 228, 69, + 200, 156, 168, 103, 206, 208, 118, 8, 98, 213, 93, 36, 184, 66, 79, 157, + 91, 121, 36, 204, 193, 119, 75, 97, 131, 161, 77, 195, 37, 214, 14, 45, + 118, 100, 143, 180, 244, 127, 5, 88, 15, 151, 120, 250, 201, 120, 44, 43, + 119, 149, 188, 215, 115, 44, 43, 70, 81, 26, 44, 171, 255, 98, 84, 52, + 213, 0, 217, 97, 36, 234, 250, 23, 67, 55, 168, 107, 101, 41, 108, 5, + 227, 86, 0, 0, 98, 119, 19, 0, 48, 221, 146, 101, 215, 54, 28, 215, + 159, 225, 156, 70, 146, 85, 84, 15, 6, 190, 205, 40, 42, 6, 131, 28, + 167, 20, 30, 233, 120, 51, 32, 42, 241, 124, 161, 20, 17, 198, 218, 244, + 12, 182, 219, 218, 90, 193, 78, 188, 114, 194, 120, 222, 94, 240, 14, 70, + 85, 142, 61, 30, 117, 104, 155, 181, 34, 177, 38, 59, 91, 149, 222, 184, + 71, 241, 123, 21, 81, 169, 47, 17, 23, 254, 59, 118, 238, 7, 55, 72, + 58, 210, 42, 11, 21, 181, 21, 84, 84, 139, 189, 97, 17, 214, 247, 124, + 137, 46, 18, 69, 73, 80, 202, 207, 30, 139, 237, 103, 86, 93, 87, 215, + 147, 129, 169, 129, 150, 238, 188, 14, 189, 10, 90, 216, 211, 202, 70, 233, + 133, 18, 122, 90, 142, 118, 195, 14, 191, 77, 118, 56, 68, 161, 172, 42, + 96, 48, 245, 215, 205, 157, 137, 174, 240, 98, 67, 170, 233, 90, 102, 195, + 6, 138, 111, 223, 140, 121, 126, 17, 186, 168, 168, 24, 94, 104, 109, 134, + 178, 121, 201, 119, 130, 19, 94, 171, 176, 1, 237, 3, 109, 161, 103, 28, + 41, 171, 29, 215, 215, 174, 55, 202, 118, 163, 108, 55, 202, 118, 67, 215, + 191, 73, 186, 94, 171, 108, 131, 226, 236, 35, 130, 151, 32, 230, 233, 137, + 165, 158, 108, 130, 153, 104, 2, 65, 63, 2, 118, 113, 227, 78, 226, 121, + 22, 7, 208, 211, 171, 121, 206, 157, 124, 61, 117, 81, 163, 8, 176, 230, + 150, 82, 63, 225, 92, 20, 244, 197, 63, 63, 150, 8, 226, 117, 181, 27, + 95, 76, 167, 88, 174, 170, 28, 65, 166, 33, 245, 13, 169, 111, 72, 125, + 67, 234, 191, 73, 82, 63, 232, 244, 238, 87, 90, 180, 206, 185, 55, 101, + 79, 224, 163, 198, 115, 76, 118, 65, 18, 15, 45, 87, 179, 180, 197, 42, + 180, 148, 136, 239, 74, 234, 77, 22, 27, 53, 180, 212, 36, 22, 39, 199, + 238, 106, 201, 242, 194, 121, 244, 53, 159, 97, 174, 186, 97, 148, 168, 42, + 200, 147, 224, 172, 29, 250, 120, 252, 2, 109, 52, 151, 129, 136, 195, 190, + 217, 201, 83, 109, 196, 217, 105, 48, 81, 218, 240, 76, 225, 52, 136, 167, + 115, 134, 211, 88, 137, 58, 102, 162, 67, 246, 173, 157, 223, 120, 24, 236, + 124, 72, 101, 200, 134, 165, 52, 44, 229, 43, 101, 41, 13, 119, 248, 54, + 185, 195, 65, 167, 123, 0, 12, 162, 130, 59, 196, 33, 119, 174, 101, 12, + 3, 28, 89, 217, 145, 74, 253, 209, 58, 93, 2, 174, 54, 157, 230, 244, + 54, 230, 75, 195, 106, 221, 47, 183, 118, 154, 98, 251, 89, 24, 44, 157, + 153, 102, 248, 233, 231, 171, 35, 95, 81, 184, 100, 220, 137, 27, 114, 146, + 121, 28, 15, 54, 33, 162, 70, 254, 81, 210, 78, 118, 244, 117, 43, 251, + 115, 167, 126, 247, 236, 142, 93, 161, 141, 253, 234, 70, 238, 200, 227, 236, + 21, 220, 0, 66, 91, 72, 243, 113, 147, 158, 92, 189, 21, 151, 173, 178, + 70, 133, 159, 94, 240, 219, 248, 97, 12, 255, 236, 238, 252, 254, 187, 61, + 236, 177, 39, 223, 159, 62, 59, 170, 174, 130, 59, 176, 200, 48, 220, 190, + 159, 79, 34, 166, 230, 166, 136, 4, 125, 13, 167, 70, 157, 65, 123, 104, + 76, 97, 238, 184, 208, 80, 156, 115, 1, 32, 55, 196, 41, 110, 46, 248, + 10, 242, 193, 136, 122, 185, 252, 43, 170, 185, 252, 10, 214, 29, 27, 173, + 88, 70, 228, 197, 124, 133, 203, 171, 209, 234, 202, 77, 27, 173, 178, 198, + 210, 120, 76, 173, 222, 117, 183, 221, 29, 88, 173, 61, 75, 69, 7, 92, + 211, 161, 116, 188, 46, 91, 154, 66, 12, 147, 105, 40, 235, 175, 215, 117, + 40, 23, 112, 130, 48, 228, 136, 142, 129, 172, 157, 100, 157, 66, 65, 67, + 28, 150, 112, 25, 120, 166, 49, 87, 74, 85, 236, 103, 14, 19, 62, 34, + 169, 78, 200, 34, 59, 117, 34, 217, 199, 170, 217, 221, 72, 102, 141, 100, + 214, 72, 102, 141, 100, 182, 69, 76, 70, 148, 235, 174, 144, 204, 174, 254, + 62, 250, 233, 152, 199, 142, 235, 81, 69, 54, 217, 42, 91, 216, 227, 63, + 19, 50, 238, 132, 200, 122, 184, 60, 185, 154, 136, 171, 86, 73, 91, 9, + 227, 121, 228, 68, 178, 38, 109, 234, 70, 214, 49, 39, 196, 111, 105, 61, + 76, 198, 94, 140, 33, 56, 10, 28, 84, 198, 235, 242, 180, 178, 144, 8, + 45, 124, 162, 70, 154, 168, 186, 174, 173, 125, 91, 47, 204, 235, 34, 143, + 10, 197, 242, 114, 167, 211, 4, 99, 22, 212, 186, 125, 174, 255, 65, 185, + 104, 167, 124, 226, 38, 139, 111, 254, 51, 207, 241, 224, 155, 255, 202, 19, + 224, 187, 223, 216, 71, 22, 165, 157, 94, 175, 73, 76, 108, 4, 158, 175, + 67, 224, 249, 136, 222, 13, 104, 240, 60, 238, 177, 179, 12, 239, 41, 23, + 255, 147, 24, 141, 189, 47, 96, 243, 227, 6, 119, 80, 210, 184, 184, 9, + 228, 73, 68, 34, 83, 18, 42, 167, 143, 113, 220, 148, 243, 115, 247, 54, + 198, 197, 147, 182, 40, 209, 91, 48, 33, 142, 199, 94, 128, 176, 226, 57, + 75, 210, 169, 251, 54, 169, 87, 77, 124, 241, 54, 73, 117, 95, 6, 163, + 109, 216, 233, 245, 42, 253, 53, 169, 100, 199, 158, 7, 48, 100, 236, 169, + 27, 197, 193, 44, 116, 22, 145, 38, 233, 121, 120, 241, 106, 158, 93, 180, + 234, 46, 150, 69, 206, 199, 160, 80, 207, 226, 185, 98, 179, 219, 47, 224, + 173, 5, 19, 149, 87, 189, 116, 208, 231, 242, 84, 152, 226, 206, 131, 169, + 82, 59, 75, 134, 27, 102, 0, 199, 249, 34, 63, 119, 103, 121, 172, 97, + 183, 107, 108, 129, 151, 124, 6, 99, 30, 74, 220, 76, 5, 136, 161, 111, + 43, 125, 38, 201, 24, 150, 150, 227, 5, 239, 91, 249, 165, 183, 215, 176, + 190, 134, 245, 125, 29, 172, 175, 225, 10, 95, 158, 43, 124, 34, 47, 76, + 175, 211, 175, 194, 161, 71, 135, 203, 42, 85, 238, 9, 130, 158, 90, 84, + 133, 94, 111, 169, 141, 206, 194, 113, 193, 208, 171, 92, 79, 87, 117, 248, + 66, 206, 233, 51, 84, 59, 68, 178, 127, 138, 171, 217, 104, 23, 13, 137, + 253, 139, 145, 216, 70, 81, 104, 88, 66, 13, 154, 115, 53, 79, 72, 85, + 133, 51, 39, 14, 221, 241, 53, 163, 158, 31, 168, 33, 244, 59, 246, 126, + 167, 91, 225, 126, 172, 127, 119, 74, 221, 226, 211, 41, 31, 199, 108, 238, + 68, 108, 132, 11, 111, 130, 153, 91, 211, 0, 119, 5, 6, 129, 21, 51, + 178, 232, 174, 24, 214, 121, 136, 203, 113, 10, 219, 140, 105, 223, 3, 179, + 32, 147, 182, 70, 94, 48, 107, 195, 178, 157, 96, 115, 219, 231, 113, 135, + 222, 183, 107, 119, 96, 226, 222, 186, 126, 107, 14, 63, 179, 186, 9, 130, + 73, 75, 176, 172, 150, 100, 89, 45, 184, 54, 115, 23, 203, 246, 60, 94, + 228, 57, 28, 66, 203, 73, 213, 121, 162, 52, 2, 87, 78, 234, 247, 66, + 153, 177, 138, 77, 27, 196, 39, 227, 70, 218, 43, 36, 69, 225, 18, 217, + 3, 30, 183, 151, 51, 185, 212, 35, 57, 135, 183, 102, 5, 107, 30, 234, + 69, 3, 229, 87, 96, 9, 2, 5, 43, 246, 35, 24, 118, 165, 227, 17, + 112, 212, 24, 243, 191, 24, 145, 204, 247, 214, 94, 26, 214, 218, 176, 214, + 175, 154, 181, 54, 172, 234, 107, 215, 94, 106, 195, 97, 4, 9, 207, 229, + 38, 81, 197, 66, 144, 232, 180, 205, 42, 105, 43, 43, 37, 108, 154, 124, + 83, 43, 47, 200, 84, 210, 186, 165, 8, 79, 27, 216, 176, 116, 202, 78, + 165, 184, 148, 52, 108, 51, 7, 81, 72, 97, 102, 98, 237, 126, 174, 71, + 233, 6, 43, 21, 241, 210, 84, 170, 228, 112, 100, 65, 50, 176, 30, 38, + 46, 76, 12, 124, 132, 183, 218, 40, 63, 187, 169, 96, 220, 48, 130, 134, + 17, 52, 140, 96, 171, 24, 193, 1, 10, 250, 246, 65, 69, 121, 25, 103, + 230, 142, 85, 43, 214, 2, 27, 84, 35, 150, 214, 176, 73, 134, 161, 30, + 71, 156, 170, 203, 170, 57, 171, 175, 251, 218, 133, 235, 80, 179, 119, 13, + 117, 236, 202, 199, 147, 25, 79, 69, 246, 22, 6, 180, 180, 250, 74, 78, + 120, 81, 170, 127, 47, 228, 75, 187, 161, 213, 13, 173, 110, 96, 128, 27, + 186, 251, 49, 221, 7, 189, 110, 5, 221, 197, 49, 211, 220, 7, 11, 106, + 209, 40, 175, 214, 178, 137, 241, 196, 20, 165, 211, 208, 195, 195, 69, 144, + 248, 89, 212, 184, 134, 31, 147, 118, 169, 199, 101, 75, 59, 229, 148, 86, + 184, 29, 52, 58, 222, 24, 71, 26, 58, 187, 125, 116, 182, 145, 137, 27, + 218, 92, 146, 126, 221, 197, 28, 187, 138, 4, 59, 76, 82, 131, 173, 248, + 230, 152, 143, 188, 36, 36, 144, 246, 9, 29, 90, 217, 81, 9, 53, 214, + 0, 188, 12, 17, 212, 244, 215, 154, 166, 135, 11, 119, 129, 96, 77, 124, + 169, 218, 38, 134, 117, 225, 170, 109, 131, 248, 26, 113, 57, 121, 10, 207, + 133, 123, 61, 15, 252, 224, 45, 76, 230, 41, 119, 128, 192, 36, 225, 91, + 220, 169, 104, 160, 185, 8, 96, 25, 176, 12, 57, 254, 206, 233, 56, 13, + 41, 111, 72, 249, 215, 77, 202, 183, 198, 133, 108, 15, 26, 23, 242, 95, + 130, 245, 212, 131, 60, 165, 172, 231, 73, 128, 160, 245, 28, 104, 153, 71, + 252, 39, 241, 35, 188, 116, 53, 131, 246, 5, 53, 91, 165, 173, 101, 113, + 163, 106, 60, 167, 133, 214, 147, 94, 37, 99, 34, 193, 63, 183, 157, 31, + 142, 199, 220, 147, 29, 178, 39, 244, 20, 211, 11, 236, 49, 21, 7, 247, + 241, 237, 50, 240, 97, 151, 187, 52, 153, 89, 166, 68, 206, 65, 146, 88, + 216, 209, 227, 48, 225, 13, 179, 105, 152, 77, 195, 108, 26, 102, 211, 48, + 27, 61, 177, 1, 254, 12, 6, 127, 51, 179, 27, 222, 159, 225, 244, 9, + 45, 182, 191, 134, 225, 200, 207, 102, 89, 30, 219, 31, 18, 52, 22, 47, + 95, 185, 226, 234, 4, 46, 90, 229, 205, 27, 152, 167, 16, 162, 66, 195, + 22, 52, 152, 143, 77, 86, 167, 134, 45, 52, 108, 225, 175, 197, 22, 26, + 50, 251, 215, 144, 233, 9, 145, 143, 114, 150, 53, 218, 186, 200, 154, 173, + 210, 214, 205, 82, 193, 122, 166, 237, 63, 53, 8, 105, 168, 243, 133, 152, + 151, 134, 200, 54, 68, 182, 33, 178, 13, 145, 221, 126, 34, 107, 119, 201, + 159, 90, 81, 86, 53, 35, 178, 47, 198, 177, 243, 150, 167, 231, 160, 98, + 105, 230, 147, 128, 174, 90, 133, 150, 170, 66, 85, 74, 130, 172, 90, 249, + 229, 214, 133, 95, 103, 154, 193, 223, 136, 88, 209, 60, 174, 70, 188, 75, + 25, 52, 197, 122, 16, 175, 6, 11, 171, 33, 200, 223, 18, 65, 174, 54, + 134, 160, 172, 209, 152, 67, 26, 22, 242, 165, 228, 244, 151, 238, 24, 14, + 39, 81, 224, 183, 158, 39, 227, 149, 198, 64, 194, 236, 154, 7, 151, 172, + 202, 43, 41, 67, 121, 31, 35, 124, 33, 200, 253, 211, 89, 217, 155, 53, + 253, 23, 50, 241, 157, 207, 131, 241, 53, 59, 161, 18, 113, 145, 166, 130, + 70, 120, 197, 50, 27, 54, 48, 233, 245, 200, 166, 55, 232, 234, 161, 186, + 172, 32, 225, 80, 180, 66, 183, 189, 159, 117, 123, 18, 130, 240, 4, 107, + 184, 152, 146, 39, 42, 66, 169, 226, 18, 240, 187, 32, 44, 118, 236, 153, + 33, 16, 37, 73, 241, 119, 55, 39, 54, 82, 85, 35, 85, 125, 197, 82, + 85, 67, 207, 255, 26, 50, 10, 34, 135, 39, 161, 110, 72, 140, 69, 155, + 85, 108, 170, 49, 33, 42, 65, 193, 121, 114, 181, 166, 217, 14, 116, 112, + 167, 6, 192, 169, 33, 165, 219, 71, 74, 27, 178, 248, 141, 147, 197, 189, + 14, 26, 0, 171, 74, 98, 164, 100, 241, 23, 161, 140, 81, 69, 101, 85, + 111, 83, 21, 181, 18, 90, 152, 25, 11, 181, 21, 210, 171, 0, 123, 45, + 216, 18, 52, 114, 217, 107, 219, 134, 45, 48, 187, 211, 232, 216, 213, 177, + 46, 52, 147, 161, 189, 129, 201, 80, 201, 207, 144, 69, 85, 97, 129, 189, + 229, 94, 41, 73, 207, 54, 97, 77, 159, 122, 1, 154, 74, 66, 185, 111, + 57, 123, 76, 72, 37, 239, 153, 16, 221, 48, 133, 134, 41, 52, 242, 245, + 95, 151, 145, 8, 158, 241, 187, 255, 187, 111, 20, 177, 103, 197, 42, 246, + 17, 115, 253, 104, 233, 226, 43, 140, 86, 84, 186, 30, 62, 96, 230, 98, + 197, 160, 39, 207, 78, 207, 144, 51, 168, 4, 159, 144, 157, 196, 189, 22, + 187, 113, 227, 57, 115, 38, 19, 87, 150, 24, 194, 169, 92, 112, 180, 124, + 180, 75, 171, 220, 127, 113, 6, 87, 47, 247, 227, 64, 103, 149, 4, 36, + 221, 35, 217, 31, 47, 100, 41, 130, 14, 182, 91, 229, 205, 37, 124, 239, + 231, 100, 49, 130, 113, 14, 166, 130, 39, 164, 56, 75, 182, 149, 23, 17, + 42, 20, 28, 232, 25, 117, 162, 202, 242, 7, 123, 58, 119, 146, 85, 140, + 152, 130, 135, 142, 113, 198, 235, 50, 180, 211, 69, 246, 10, 102, 50, 72, + 98, 70, 31, 189, 17, 215, 249, 220, 185, 68, 182, 221, 233, 86, 249, 37, + 245, 137, 75, 229, 137, 146, 185, 155, 201, 75, 197, 233, 75, 175, 212, 206, + 160, 226, 174, 220, 179, 176, 16, 212, 154, 41, 180, 203, 210, 59, 171, 231, + 176, 116, 156, 83, 177, 43, 189, 223, 245, 153, 156, 180, 45, 156, 166, 33, + 77, 83, 85, 197, 77, 125, 154, 94, 57, 176, 29, 120, 28, 149, 76, 211, + 141, 188, 84, 156, 166, 244, 202, 230, 211, 100, 171, 211, 116, 56, 153, 136, + 37, 158, 227, 207, 196, 1, 83, 11, 122, 176, 231, 206, 10, 232, 215, 195, + 171, 77, 6, 247, 163, 204, 205, 127, 118, 12, 34, 93, 160, 209, 19, 62, + 14, 22, 203, 32, 226, 17, 115, 124, 230, 46, 16, 101, 13, 62, 46, 96, + 17, 150, 248, 4, 186, 43, 70, 71, 148, 106, 136, 44, 150, 160, 163, 143, + 201, 161, 98, 78, 28, 6, 9, 16, 228, 103, 49, 3, 233, 54, 241, 38, + 108, 25, 6, 48, 245, 156, 69, 238, 2, 164, 230, 144, 129, 216, 155, 120, + 49, 13, 5, 210, 255, 191, 59, 12, 36, 225, 233, 195, 20, 217, 46, 228, + 51, 55, 138, 195, 85, 155, 80, 234, 130, 112, 214, 241, 131, 9, 239, 244, + 122, 251, 3, 123, 231, 39, 57, 141, 48, 6, 242, 37, 217, 153, 151, 204, + 90, 174, 255, 247, 142, 243, 19, 219, 5, 158, 114, 234, 132, 227, 128, 189, + 12, 208, 255, 232, 222, 83, 56, 195, 255, 109, 209, 202, 5, 213, 167, 95, + 105, 221, 191, 64, 152, 192, 83, 103, 185, 148, 40, 78, 11, 103, 121, 21, + 7, 178, 50, 120, 118, 82, 178, 38, 139, 54, 250, 161, 86, 106, 245, 137, + 179, 200, 60, 86, 221, 246, 190, 118, 109, 125, 58, 162, 161, 74, 244, 155, + 226, 222, 141, 182, 208, 104, 11, 141, 182, 240, 181, 153, 157, 106, 165, 114, + 149, 246, 178, 55, 39, 78, 20, 255, 161, 145, 224, 171, 41, 52, 89, 133, + 150, 117, 185, 227, 125, 93, 244, 58, 11, 110, 242, 26, 222, 6, 145, 110, + 194, 119, 27, 74, 218, 80, 210, 134, 146, 126, 108, 232, 236, 51, 39, 241, + 216, 207, 14, 72, 237, 159, 188, 178, 14, 98, 36, 117, 186, 123, 213, 21, + 21, 79, 208, 112, 163, 21, 84, 12, 131, 8, 238, 71, 44, 14, 58, 178, + 178, 163, 18, 120, 210, 252, 35, 151, 160, 160, 80, 45, 236, 135, 191, 239, + 192, 232, 254, 190, 243, 211, 47, 75, 248, 138, 150, 7, 115, 10, 23, 130, + 112, 2, 59, 13, 94, 144, 129, 150, 131, 157, 21, 243, 208, 25, 142, 52, + 251, 239, 174, 28, 114, 27, 199, 24, 135, 24, 195, 118, 113, 232, 55, 213, + 115, 213, 87, 88, 136, 125, 150, 189, 6, 149, 84, 222, 236, 61, 122, 242, + 61, 14, 140, 247, 88, 27, 68, 92, 254, 38, 35, 216, 128, 240, 26, 207, + 145, 207, 220, 229, 53, 236, 252, 53, 14, 196, 107, 116, 177, 0, 245, 251, + 190, 198, 24, 200, 80, 246, 26, 155, 79, 74, 63, 159, 148, 236, 45, 112, + 56, 214, 190, 69, 189, 183, 227, 178, 117, 62, 119, 167, 113, 230, 111, 105, + 97, 41, 36, 53, 40, 239, 245, 186, 14, 117, 21, 212, 127, 11, 130, 133, + 18, 13, 168, 214, 253, 16, 149, 145, 205, 18, 106, 151, 173, 195, 91, 23, + 3, 91, 95, 167, 7, 151, 120, 196, 149, 200, 86, 179, 16, 115, 239, 189, + 10, 49, 31, 135, 14, 226, 205, 51, 165, 146, 212, 127, 118, 94, 242, 165, + 231, 140, 241, 61, 228, 17, 219, 21, 246, 133, 40, 190, 135, 52, 148, 207, + 93, 159, 170, 189, 115, 32, 236, 185, 238, 252, 43, 210, 170, 23, 73, 236, + 1, 171, 143, 216, 11, 127, 67, 20, 221, 207, 43, 225, 217, 88, 217, 171, + 138, 254, 16, 237, 33, 22, 37, 96, 128, 166, 120, 126, 149, 66, 1, 229, + 103, 10, 193, 201, 137, 189, 9, 94, 220, 55, 147, 175, 82, 6, 176, 182, + 99, 185, 152, 23, 6, 75, 101, 121, 21, 2, 70, 149, 2, 177, 138, 160, + 137, 139, 196, 44, 123, 153, 47, 217, 229, 210, 91, 177, 35, 220, 144, 236, + 145, 227, 161, 220, 97, 206, 152, 108, 22, 157, 30, 210, 222, 221, 253, 239, + 131, 46, 254, 127, 110, 238, 82, 75, 3, 152, 43, 25, 3, 79, 226, 241, + 28, 142, 138, 240, 208, 165, 223, 41, 23, 16, 13, 146, 242, 81, 10, 58, + 82, 218, 67, 123, 167, 41, 253, 159, 182, 159, 157, 73, 112, 147, 249, 87, + 91, 61, 109, 96, 94, 175, 185, 46, 174, 150, 68, 33, 90, 106, 113, 93, + 217, 235, 8, 230, 63, 4, 73, 191, 98, 122, 46, 91, 71, 28, 11, 174, + 99, 204, 123, 185, 92, 255, 122, 109, 15, 157, 186, 180, 122, 64, 251, 122, + 7, 91, 181, 177, 6, 157, 222, 253, 74, 131, 171, 220, 88, 71, 201, 8, + 99, 152, 104, 31, 141, 225, 216, 202, 15, 149, 45, 117, 204, 151, 89, 160, + 82, 95, 119, 63, 164, 67, 153, 143, 132, 173, 128, 27, 190, 174, 189, 138, + 194, 28, 172, 170, 9, 103, 47, 66, 140, 69, 53, 151, 43, 46, 226, 140, + 66, 182, 46, 243, 195, 215, 74, 235, 107, 165, 164, 30, 177, 206, 143, 248, + 64, 18, 12, 62, 230, 3, 137, 183, 126, 204, 7, 126, 148, 101, 102, 49, + 88, 204, 192, 57, 216, 115, 103, 225, 124, 160, 52, 105, 83, 36, 116, 253, + 162, 59, 73, 222, 189, 91, 41, 228, 124, 138, 231, 150, 126, 170, 80, 188, + 106, 130, 110, 166, 220, 86, 209, 115, 179, 31, 189, 128, 74, 67, 140, 42, + 36, 107, 136, 76, 9, 153, 83, 8, 221, 22, 236, 252, 90, 163, 137, 156, + 4, 177, 152, 148, 89, 88, 80, 131, 101, 156, 215, 73, 244, 82, 53, 96, + 17, 140, 54, 121, 38, 118, 202, 230, 76, 43, 30, 80, 49, 95, 53, 125, + 234, 135, 115, 244, 211, 51, 114, 121, 0, 31, 155, 249, 11, 216, 80, 155, + 188, 199, 112, 131, 247, 40, 244, 89, 247, 30, 98, 40, 38, 24, 106, 4, + 91, 186, 19, 205, 129, 119, 92, 163, 79, 64, 127, 33, 164, 121, 57, 53, + 28, 42, 171, 138, 168, 87, 249, 165, 95, 150, 229, 237, 66, 249, 45, 191, + 86, 171, 198, 167, 30, 225, 252, 123, 187, 237, 253, 13, 44, 91, 159, 29, + 192, 247, 160, 99, 87, 0, 248, 202, 101, 124, 230, 128, 238, 144, 102, 153, + 138, 133, 187, 148, 77, 86, 161, 165, 100, 49, 23, 235, 91, 232, 211, 110, + 74, 18, 237, 65, 189, 35, 198, 64, 95, 215, 72, 5, 239, 141, 15, 246, + 15, 234, 71, 248, 87, 88, 199, 60, 142, 53, 105, 203, 214, 165, 173, 172, + 139, 241, 110, 3, 105, 118, 88, 183, 104, 143, 57, 134, 143, 69, 230, 237, + 180, 226, 135, 61, 187, 208, 239, 88, 88, 176, 170, 70, 40, 237, 166, 188, + 176, 225, 139, 202, 122, 20, 189, 86, 70, 164, 94, 185, 39, 149, 83, 129, + 45, 225, 195, 21, 170, 162, 221, 31, 12, 247, 228, 199, 170, 223, 43, 22, + 133, 19, 49, 135, 253, 12, 203, 156, 252, 181, 210, 93, 59, 117, 188, 104, + 77, 50, 214, 231, 214, 123, 186, 251, 235, 244, 158, 51, 7, 230, 57, 244, + 181, 197, 77, 45, 150, 217, 80, 178, 180, 47, 220, 212, 211, 13, 115, 214, + 87, 87, 165, 124, 172, 170, 168, 6, 75, 49, 90, 168, 32, 112, 111, 202, + 136, 172, 230, 100, 171, 94, 87, 207, 171, 118, 9, 106, 76, 75, 225, 106, + 147, 210, 93, 159, 29, 117, 182, 87, 137, 58, 43, 135, 92, 194, 118, 228, + 67, 158, 13, 117, 57, 11, 68, 45, 80, 9, 110, 98, 6, 189, 7, 181, + 39, 118, 194, 152, 72, 12, 142, 92, 81, 21, 121, 236, 79, 178, 171, 189, + 174, 121, 253, 245, 154, 251, 95, 175, 185, 127, 51, 182, 85, 253, 254, 175, + 220, 137, 132, 57, 41, 197, 205, 125, 202, 73, 230, 174, 188, 174, 209, 63, + 177, 89, 21, 81, 73, 211, 44, 115, 64, 243, 141, 20, 203, 175, 79, 226, + 34, 213, 95, 217, 202, 33, 158, 91, 250, 169, 202, 153, 208, 192, 163, 115, + 150, 118, 79, 147, 82, 117, 214, 85, 128, 150, 169, 10, 18, 208, 181, 101, + 213, 66, 214, 43, 159, 183, 194, 128, 163, 121, 67, 124, 85, 141, 253, 131, + 105, 79, 23, 63, 173, 119, 48, 147, 25, 13, 152, 134, 175, 100, 90, 197, + 48, 43, 243, 26, 81, 131, 101, 156, 43, 51, 251, 129, 123, 170, 96, 66, + 18, 1, 239, 91, 69, 105, 247, 58, 246, 176, 50, 38, 239, 133, 55, 97, + 103, 243, 32, 14, 102, 161, 179, 156, 227, 192, 5, 222, 228, 106, 137, 45, + 150, 122, 162, 12, 89, 46, 22, 233, 105, 83, 194, 213, 162, 154, 154, 179, + 158, 167, 192, 142, 116, 132, 144, 130, 216, 159, 117, 117, 110, 245, 174, 7, + 166, 198, 184, 5, 67, 90, 187, 22, 207, 2, 224, 89, 129, 59, 193, 193, + 92, 202, 99, 75, 57, 86, 134, 82, 44, 219, 156, 228, 10, 221, 87, 217, + 187, 164, 84, 228, 29, 108, 179, 131, 97, 201, 67, 163, 142, 38, 196, 189, + 94, 115, 189, 64, 151, 250, 186, 118, 157, 226, 163, 151, 91, 72, 21, 179, + 155, 93, 98, 119, 171, 90, 40, 195, 205, 215, 201, 254, 230, 235, 228, 254, + 22, 174, 19, 145, 168, 83, 33, 87, 94, 36, 24, 153, 128, 171, 36, 166, + 35, 43, 59, 42, 152, 251, 114, 224, 29, 69, 190, 118, 198, 240, 101, 233, + 38, 65, 95, 207, 253, 251, 249, 196, 145, 169, 143, 232, 150, 226, 25, 205, + 121, 185, 208, 57, 115, 162, 85, 103, 78, 189, 223, 181, 238, 111, 213, 168, + 218, 24, 189, 218, 171, 176, 107, 165, 11, 4, 199, 245, 173, 60, 182, 148, + 227, 108, 229, 235, 107, 114, 223, 92, 147, 235, 151, 226, 250, 21, 88, 47, + 113, 109, 199, 72, 14, 42, 203, 242, 8, 127, 51, 255, 51, 225, 254, 216, + 213, 156, 206, 143, 28, 127, 178, 116, 34, 42, 213, 51, 146, 199, 150, 114, + 92, 18, 212, 243, 60, 184, 97, 233, 195, 86, 21, 146, 202, 83, 224, 181, + 133, 78, 27, 138, 209, 77, 184, 100, 19, 228, 243, 149, 6, 249, 136, 146, + 127, 122, 233, 88, 219, 74, 93, 132, 71, 9, 185, 171, 179, 74, 178, 155, + 25, 21, 155, 216, 160, 111, 51, 202, 18, 145, 190, 92, 96, 236, 135, 190, + 227, 173, 34, 151, 40, 240, 196, 141, 150, 158, 179, 186, 154, 78, 41, 190, + 82, 57, 221, 46, 139, 207, 70, 31, 70, 81, 26, 83, 88, 237, 164, 195, + 137, 70, 43, 63, 44, 49, 173, 193, 246, 245, 73, 115, 101, 29, 208, 100, + 156, 40, 139, 212, 232, 9, 204, 52, 50, 165, 177, 221, 124, 109, 97, 148, + 134, 114, 33, 93, 93, 216, 140, 176, 106, 34, 177, 36, 15, 220, 56, 70, + 228, 89, 88, 247, 121, 252, 200, 88, 134, 110, 220, 109, 116, 181, 180, 17, + 17, 92, 16, 43, 201, 35, 1, 6, 18, 196, 1, 155, 241, 152, 178, 59, + 38, 110, 200, 199, 49, 59, 57, 185, 176, 40, 228, 140, 174, 59, 51, 52, + 236, 41, 189, 66, 46, 144, 202, 227, 116, 216, 138, 35, 11, 239, 225, 185, + 254, 245, 238, 206, 17, 108, 167, 107, 54, 135, 29, 195, 160, 39, 115, 24, + 38, 151, 4, 44, 78, 224, 173, 5, 124, 150, 76, 36, 185, 185, 185, 105, + 175, 130, 36, 78, 70, 188, 61, 14, 22, 157, 27, 39, 30, 207, 255, 231, + 237, 195, 126, 175, 191, 63, 57, 118, 246, 206, 6, 209, 71, 246, 122, 126, + 176, 111, 98, 175, 211, 171, 178, 222, 202, 133, 245, 10, 211, 206, 23, 78, + 120, 141, 11, 235, 38, 61, 201, 150, 216, 149, 15, 228, 246, 42, 51, 215, + 242, 219, 248, 33, 226, 133, 252, 103, 103, 119, 124, 143, 61, 249, 254, 244, + 217, 81, 190, 34, 50, 117, 108, 216, 183, 122, 152, 94, 182, 198, 143, 80, + 177, 16, 100, 146, 103, 192, 22, 206, 53, 167, 217, 204, 94, 11, 166, 38, + 114, 71, 30, 76, 248, 20, 90, 144, 236, 82, 186, 144, 232, 245, 189, 73, + 4, 190, 151, 107, 232, 107, 76, 230, 68, 33, 83, 236, 56, 69, 190, 60, + 68, 15, 162, 220, 136, 56, 93, 228, 81, 188, 242, 232, 220, 50, 206, 83, + 138, 192, 30, 176, 31, 50, 5, 38, 245, 64, 106, 124, 176, 11, 236, 215, + 157, 185, 19, 98, 167, 126, 75, 28, 215, 89, 232, 140, 60, 31, 145, 173, + 150, 63, 76, 226, 50, 246, 224, 63, 27, 254, 235, 195, 127, 3, 248, 111, + 8, 255, 237, 193, 127, 251, 240, 223, 129, 18, 16, 129, 59, 53, 78, 211, + 214, 182, 46, 244, 75, 34, 202, 86, 40, 85, 143, 60, 14, 36, 232, 205, + 33, 166, 177, 205, 64, 86, 241, 68, 33, 158, 17, 54, 95, 57, 162, 21, + 102, 133, 84, 216, 66, 163, 58, 51, 164, 17, 1, 21, 29, 171, 179, 114, + 14, 34, 177, 38, 31, 11, 153, 242, 110, 139, 184, 50, 43, 47, 134, 221, + 21, 49, 130, 16, 95, 194, 142, 18, 171, 6, 253, 82, 174, 191, 76, 98, + 162, 173, 242, 101, 113, 119, 45, 218, 236, 92, 210, 86, 24, 151, 103, 212, + 197, 147, 235, 211, 253, 137, 5, 75, 148, 210, 144, 2, 131, 190, 49, 129, + 199, 101, 207, 117, 149, 174, 91, 186, 17, 251, 20, 221, 87, 225, 114, 145, + 83, 76, 213, 165, 149, 201, 229, 120, 110, 233, 167, 176, 112, 213, 57, 213, + 141, 9, 186, 109, 185, 2, 209, 110, 248, 241, 182, 69, 229, 188, 251, 156, + 79, 34, 22, 3, 71, 151, 83, 14, 147, 118, 19, 0, 109, 93, 134, 1, + 142, 232, 234, 155, 158, 105, 187, 87, 25, 249, 35, 103, 250, 196, 153, 112, + 101, 162, 167, 112, 106, 105, 103, 32, 223, 192, 52, 255, 168, 200, 212, 17, + 143, 21, 63, 229, 81, 18, 9, 145, 94, 108, 92, 148, 200, 221, 112, 140, + 14, 59, 56, 196, 116, 83, 248, 243, 79, 208, 3, 144, 108, 230, 163, 243, + 98, 58, 197, 199, 228, 193, 122, 202, 106, 129, 233, 243, 205, 120, 76, 3, + 153, 70, 185, 108, 228, 205, 167, 65, 184, 230, 34, 170, 93, 97, 69, 122, + 180, 9, 53, 162, 169, 204, 64, 27, 96, 213, 105, 94, 187, 17, 6, 254, + 50, 16, 20, 145, 99, 79, 48, 217, 120, 17, 192, 12, 45, 105, 252, 148, + 21, 147, 61, 176, 7, 87, 207, 210, 251, 203, 71, 198, 134, 25, 91, 211, + 165, 31, 174, 237, 82, 250, 230, 40, 53, 194, 164, 201, 215, 134, 253, 67, + 111, 141, 18, 162, 220, 26, 98, 158, 105, 83, 136, 111, 40, 249, 132, 19, + 241, 16, 41, 51, 141, 131, 104, 119, 240, 195, 210, 253, 225, 182, 115, 115, + 143, 253, 192, 34, 215, 23, 231, 171, 206, 252, 158, 154, 78, 220, 236, 228, + 143, 177, 147, 79, 249, 36, 133, 81, 16, 187, 119, 65, 13, 150, 113, 110, + 144, 237, 47, 192, 138, 197, 68, 58, 48, 228, 220, 129, 47, 221, 234, 25, + 141, 214, 76, 105, 154, 7, 244, 12, 53, 178, 19, 30, 206, 146, 40, 10, + 252, 15, 140, 216, 28, 128, 26, 83, 41, 42, 203, 217, 62, 231, 206, 194, + 67, 115, 86, 62, 223, 145, 108, 178, 10, 45, 138, 190, 172, 206, 253, 169, + 123, 11, 123, 156, 210, 26, 12, 130, 248, 12, 8, 112, 200, 128, 55, 40, + 209, 214, 197, 64, 0, 179, 75, 161, 216, 250, 71, 92, 92, 240, 115, 36, + 167, 69, 176, 36, 232, 226, 221, 176, 31, 190, 250, 181, 89, 161, 188, 11, + 44, 9, 152, 197, 9, 143, 198, 161, 43, 126, 53, 152, 170, 54, 133, 118, + 174, 210, 35, 36, 196, 120, 238, 196, 164, 207, 227, 130, 136, 131, 165, 59, + 110, 47, 231, 203, 255, 153, 62, 180, 15, 190, 139, 31, 246, 64, 5, 24, + 20, 141, 6, 63, 178, 95, 53, 43, 1, 235, 173, 183, 19, 252, 156, 180, + 206, 123, 79, 23, 47, 142, 102, 143, 55, 120, 160, 189, 254, 129, 239, 162, + 167, 179, 127, 189, 222, 235, 218, 195, 103, 27, 60, 176, 191, 254, 129, 54, + 223, 59, 113, 175, 95, 157, 94, 59, 255, 218, 42, 106, 63, 232, 116, 225, + 127, 195, 250, 253, 31, 59, 152, 218, 52, 201, 247, 127, 190, 237, 75, 116, + 97, 37, 119, 105, 23, 97, 72, 39, 168, 255, 146, 59, 3, 255, 82, 166, + 146, 84, 235, 208, 200, 235, 37, 244, 39, 9, 253, 157, 84, 192, 99, 146, + 183, 163, 73, 214, 9, 175, 57, 94, 193, 194, 120, 28, 45, 97, 156, 78, + 208, 144, 132, 7, 193, 132, 158, 66, 58, 4, 254, 189, 29, 123, 84, 62, + 15, 237, 204, 33, 231, 239, 240, 226, 19, 138, 77, 123, 124, 27, 135, 206, + 56, 206, 206, 79, 129, 128, 138, 171, 156, 126, 224, 41, 90, 220, 158, 75, + 3, 49, 157, 0, 201, 194, 67, 122, 63, 52, 242, 135, 232, 78, 143, 197, + 195, 169, 35, 207, 142, 80, 70, 204, 233, 140, 252, 24, 121, 150, 62, 51, + 243, 184, 96, 44, 191, 216, 161, 43, 74, 11, 155, 165, 15, 125, 129, 98, + 172, 168, 140, 128, 87, 206, 224, 45, 211, 155, 95, 146, 253, 249, 37, 159, + 122, 156, 190, 33, 247, 74, 224, 201, 220, 89, 130, 138, 28, 114, 7, 125, + 212, 133, 134, 174, 209, 226, 154, 247, 184, 190, 210, 37, 155, 25, 237, 60, + 239, 32, 88, 191, 113, 170, 92, 86, 158, 174, 61, 88, 125, 179, 244, 165, + 130, 105, 156, 14, 22, 29, 167, 211, 73, 39, 233, 167, 159, 143, 229, 12, + 193, 50, 92, 160, 205, 255, 60, 25, 165, 83, 73, 142, 12, 252, 139, 11, + 34, 187, 227, 82, 205, 168, 147, 5, 46, 216, 97, 102, 72, 65, 155, 107, + 235, 209, 170, 5, 127, 160, 179, 200, 242, 16, 150, 217, 103, 17, 17, 217, + 44, 28, 146, 8, 223, 161, 231, 137, 141, 64, 51, 76, 41, 28, 90, 111, + 25, 49, 81, 122, 131, 233, 254, 214, 98, 141, 77, 46, 151, 186, 16, 240, + 126, 193, 130, 162, 141, 172, 190, 250, 166, 145, 2, 113, 175, 99, 179, 22, + 235, 117, 6, 63, 160, 104, 12, 130, 176, 115, 79, 63, 31, 109, 40, 22, + 63, 243, 217, 88, 252, 128, 20, 219, 35, 139, 253, 61, 142, 127, 114, 254, + 222, 129, 127, 133, 76, 2, 7, 35, 113, 10, 210, 250, 18, 86, 168, 251, + 150, 123, 43, 22, 33, 221, 200, 228, 250, 183, 56, 87, 145, 96, 24, 196, + 200, 70, 136, 140, 69, 204, 233, 239, 82, 184, 73, 47, 16, 217, 17, 87, + 128, 46, 9, 107, 52, 106, 55, 19, 62, 133, 61, 69, 10, 14, 61, 141, + 133, 136, 222, 207, 222, 192, 56, 254, 81, 106, 134, 254, 76, 220, 249, 56, + 96, 240, 80, 252, 82, 178, 146, 35, 252, 210, 90, 118, 45, 148, 159, 247, + 98, 218, 130, 11, 1, 49, 16, 4, 17, 52, 193, 153, 224, 209, 100, 53, + 102, 52, 124, 152, 68, 186, 0, 66, 28, 73, 214, 20, 17, 75, 142, 231, + 201, 136, 216, 210, 36, 22, 92, 164, 51, 91, 184, 227, 22, 180, 44, 18, + 31, 214, 103, 231, 198, 189, 118, 59, 143, 228, 3, 90, 226, 1, 219, 196, + 174, 246, 59, 221, 126, 165, 65, 73, 136, 128, 56, 166, 185, 33, 87, 128, + 132, 81, 64, 132, 2, 26, 38, 206, 75, 92, 59, 34, 249, 242, 34, 192, + 178, 219, 152, 126, 169, 133, 15, 229, 21, 106, 168, 6, 85, 178, 96, 57, + 178, 152, 148, 25, 165, 156, 72, 161, 85, 136, 48, 166, 221, 228, 250, 84, + 184, 138, 136, 174, 66, 8, 12, 50, 128, 70, 222, 49, 134, 21, 235, 143, + 36, 74, 176, 201, 84, 124, 4, 212, 48, 185, 208, 185, 51, 158, 75, 36, + 71, 84, 168, 103, 176, 56, 105, 224, 216, 143, 208, 0, 59, 221, 157, 36, + 105, 103, 182, 235, 78, 225, 97, 171, 109, 5, 241, 26, 146, 33, 178, 2, + 196, 11, 237, 82, 202, 146, 65, 75, 148, 98, 250, 87, 78, 21, 105, 39, + 51, 82, 145, 100, 208, 18, 40, 9, 15, 175, 100, 76, 157, 125, 231, 176, + 176, 175, 79, 75, 248, 204, 217, 18, 131, 202, 109, 255, 60, 27, 14, 202, + 121, 120, 224, 0, 71, 7, 201, 52, 198, 19, 242, 221, 40, 231, 21, 218, + 233, 101, 43, 79, 151, 48, 247, 250, 235, 154, 107, 198, 40, 0, 11, 102, + 163, 0, 246, 75, 110, 155, 179, 240, 11, 40, 220, 137, 45, 184, 227, 71, + 120, 234, 192, 14, 95, 128, 240, 54, 46, 255, 158, 109, 24, 240, 90, 15, + 218, 105, 16, 46, 231, 202, 134, 89, 224, 121, 186, 99, 160, 195, 149, 31, + 148, 233, 5, 27, 236, 20, 197, 120, 127, 165, 70, 10, 218, 170, 144, 52, + 118, 81, 194, 207, 59, 244, 180, 14, 91, 238, 245, 90, 51, 178, 89, 217, + 89, 246, 98, 201, 233, 61, 31, 136, 21, 236, 173, 140, 74, 181, 102, 91, + 9, 51, 43, 197, 189, 28, 224, 144, 175, 169, 181, 70, 73, 39, 40, 65, + 8, 224, 75, 37, 203, 96, 104, 68, 3, 63, 22, 146, 134, 217, 79, 8, + 183, 106, 71, 244, 127, 10, 133, 72, 137, 2, 213, 109, 197, 47, 57, 126, + 136, 82, 137, 174, 143, 234, 97, 48, 214, 236, 253, 201, 136, 112, 51, 158, + 3, 119, 126, 23, 5, 235, 132, 147, 47, 149, 234, 255, 216, 119, 208, 151, + 158, 107, 141, 100, 251, 162, 112, 43, 99, 69, 202, 1, 92, 255, 162, 178, + 227, 250, 247, 149, 29, 223, 231, 181, 133, 252, 152, 174, 60, 210, 36, 118, + 119, 84, 135, 50, 40, 157, 62, 77, 182, 50, 75, 105, 216, 88, 237, 84, + 169, 51, 245, 28, 235, 96, 233, 207, 66, 226, 125, 30, 36, 225, 88, 242, + 225, 45, 220, 183, 123, 157, 126, 183, 82, 130, 56, 115, 198, 20, 229, 1, + 90, 30, 21, 242, 194, 191, 21, 172, 230, 69, 56, 129, 61, 249, 104, 165, + 196, 221, 81, 70, 8, 154, 26, 184, 84, 96, 83, 241, 242, 216, 93, 96, + 104, 33, 41, 249, 40, 53, 162, 185, 0, 168, 103, 62, 148, 23, 168, 101, + 226, 224, 61, 226, 236, 252, 207, 4, 116, 36, 83, 99, 4, 150, 4, 131, + 90, 23, 73, 132, 200, 183, 34, 113, 239, 185, 3, 74, 137, 57, 244, 39, + 129, 31, 179, 52, 41, 101, 121, 155, 237, 112, 76, 192, 220, 27, 40, 129, + 108, 212, 81, 136, 224, 138, 203, 238, 213, 220, 141, 57, 3, 193, 227, 145, + 7, 99, 66, 203, 4, 254, 98, 3, 93, 217, 89, 23, 9, 39, 133, 224, + 35, 5, 139, 232, 4, 216, 113, 193, 18, 43, 251, 157, 4, 222, 4, 147, + 62, 167, 244, 247, 110, 242, 178, 230, 194, 15, 93, 78, 3, 139, 51, 201, + 48, 164, 64, 149, 146, 132, 180, 156, 9, 197, 36, 65, 91, 236, 102, 14, + 47, 6, 119, 174, 228, 130, 94, 160, 188, 143, 89, 90, 40, 146, 241, 197, + 18, 212, 127, 152, 1, 7, 100, 44, 250, 37, 16, 219, 128, 70, 44, 64, + 17, 196, 254, 63, 159, 181, 176, 126, 161, 69, 157, 29, 111, 22, 0, 157, + 156, 131, 206, 237, 226, 4, 239, 2, 9, 31, 195, 246, 136, 248, 61, 248, + 85, 16, 21, 125, 160, 166, 40, 208, 193, 123, 163, 192, 104, 177, 17, 188, + 91, 48, 141, 185, 207, 156, 241, 152, 47, 99, 34, 63, 81, 224, 37, 169, + 208, 71, 70, 90, 252, 24, 252, 49, 249, 211, 237, 173, 20, 213, 177, 148, + 94, 101, 222, 247, 121, 28, 6, 215, 20, 105, 31, 209, 145, 149, 29, 149, + 98, 236, 186, 99, 81, 152, 131, 22, 46, 33, 225, 18, 90, 215, 158, 210, + 69, 194, 240, 214, 37, 255, 231, 82, 137, 186, 3, 138, 190, 226, 60, 240, + 7, 54, 181, 216, 142, 100, 172, 116, 22, 1, 89, 61, 41, 117, 75, 193, + 122, 162, 120, 59, 37, 4, 183, 135, 118, 70, 12, 189, 66, 51, 96, 18, + 211, 81, 253, 10, 70, 32, 43, 131, 237, 246, 172, 190, 145, 173, 227, 78, + 227, 124, 0, 48, 31, 103, 184, 103, 8, 184, 235, 251, 212, 139, 9, 245, + 249, 130, 146, 33, 213, 119, 122, 6, 116, 110, 98, 164, 122, 118, 187, 70, + 130, 55, 12, 202, 6, 189, 234, 232, 136, 88, 63, 210, 88, 247, 66, 29, + 249, 44, 92, 24, 3, 139, 179, 219, 254, 201, 249, 18, 193, 90, 68, 217, + 3, 37, 191, 121, 251, 24, 212, 16, 51, 43, 42, 51, 127, 80, 133, 81, + 44, 35, 194, 12, 146, 169, 72, 116, 96, 235, 74, 174, 194, 34, 84, 245, + 168, 111, 36, 5, 189, 174, 185, 38, 153, 79, 250, 219, 79, 169, 52, 120, + 150, 127, 182, 165, 153, 249, 107, 49, 103, 13, 11, 19, 33, 203, 218, 185, + 189, 64, 61, 175, 5, 163, 167, 103, 201, 113, 179, 53, 82, 66, 57, 223, + 208, 227, 212, 157, 180, 242, 94, 7, 38, 200, 32, 230, 126, 23, 122, 245, + 10, 121, 69, 21, 192, 11, 121, 7, 81, 218, 33, 21, 231, 30, 193, 82, + 15, 87, 100, 120, 119, 48, 178, 102, 155, 230, 6, 93, 85, 149, 137, 165, + 20, 216, 137, 114, 74, 196, 190, 99, 34, 9, 81, 75, 33, 2, 121, 147, + 28, 88, 137, 0, 80, 192, 191, 37, 107, 221, 76, 75, 54, 197, 107, 181, + 74, 67, 223, 44, 21, 92, 10, 29, 52, 168, 31, 193, 38, 143, 168, 201, + 35, 250, 134, 242, 136, 154, 44, 162, 191, 104, 22, 145, 200, 236, 172, 136, + 27, 75, 209, 134, 216, 249, 141, 11, 98, 52, 214, 139, 66, 90, 60, 150, + 205, 87, 209, 205, 194, 50, 206, 215, 73, 87, 4, 34, 129, 218, 18, 62, + 44, 199, 74, 210, 107, 187, 215, 142, 75, 246, 82, 248, 4, 50, 180, 211, + 243, 252, 180, 210, 158, 116, 85, 194, 62, 185, 86, 162, 246, 175, 221, 37, + 10, 0, 191, 200, 220, 8, 186, 23, 53, 240, 32, 72, 35, 65, 77, 145, + 70, 252, 218, 47, 254, 24, 39, 158, 28, 117, 218, 47, 91, 71, 197, 118, + 122, 218, 134, 172, 151, 34, 25, 178, 119, 81, 80, 123, 82, 130, 82, 26, + 39, 125, 199, 21, 67, 136, 13, 71, 64, 225, 46, 63, 108, 149, 244, 8, + 132, 167, 98, 149, 100, 190, 77, 81, 37, 157, 241, 219, 165, 231, 144, 199, + 23, 195, 144, 244, 32, 155, 218, 248, 162, 251, 223, 197, 15, 15, 246, 242, + 224, 162, 99, 244, 167, 9, 145, 64, 2, 87, 47, 177, 72, 47, 156, 90, + 250, 169, 38, 244, 106, 64, 6, 253, 53, 64, 7, 133, 235, 37, 21, 211, + 245, 64, 244, 122, 168, 131, 163, 32, 196, 184, 184, 71, 97, 202, 4, 214, + 2, 34, 152, 40, 199, 91, 65, 19, 122, 213, 52, 65, 153, 20, 214, 63, + 54, 230, 165, 63, 177, 204, 134, 82, 197, 164, 22, 57, 224, 117, 253, 229, + 223, 214, 92, 14, 84, 116, 61, 19, 95, 250, 178, 165, 197, 149, 247, 172, + 150, 14, 120, 240, 122, 205, 245, 51, 160, 252, 50, 84, 162, 188, 232, 232, + 90, 177, 189, 68, 11, 30, 231, 121, 97, 25, 216, 159, 239, 173, 228, 40, + 111, 161, 210, 218, 239, 116, 17, 9, 173, 124, 129, 164, 8, 197, 202, 206, + 229, 178, 73, 217, 189, 70, 211, 6, 34, 253, 6, 132, 176, 145, 71, 62, + 151, 60, 34, 162, 158, 79, 48, 220, 34, 112, 35, 246, 4, 216, 95, 4, + 195, 243, 201, 11, 31, 212, 138, 43, 207, 60, 143, 244, 26, 24, 52, 251, + 152, 145, 105, 15, 87, 159, 155, 53, 227, 98, 91, 114, 155, 136, 84, 177, + 85, 89, 131, 63, 86, 124, 60, 98, 151, 146, 69, 185, 35, 227, 60, 200, + 243, 95, 200, 114, 16, 125, 180, 85, 120, 46, 140, 206, 47, 150, 206, 159, + 9, 23, 239, 22, 49, 140, 26, 148, 86, 254, 54, 123, 244, 36, 15, 49, + 148, 198, 50, 152, 220, 202, 158, 143, 96, 84, 177, 142, 78, 38, 174, 211, + 137, 105, 57, 211, 222, 33, 27, 31, 225, 155, 88, 243, 4, 241, 17, 79, + 146, 130, 233, 110, 58, 53, 0, 74, 200, 220, 70, 21, 19, 133, 133, 206, + 137, 152, 184, 25, 119, 205, 140, 48, 210, 76, 247, 5, 221, 162, 250, 55, + 48, 58, 76, 188, 243, 123, 230, 76, 139, 233, 46, 157, 142, 52, 132, 39, + 143, 158, 44, 5, 202, 49, 158, 153, 229, 200, 224, 210, 75, 31, 65, 75, + 133, 28, 2, 180, 212, 97, 233, 7, 72, 169, 29, 226, 8, 248, 13, 216, + 55, 157, 195, 177, 156, 67, 186, 73, 196, 115, 8, 127, 4, 70, 104, 149, + 200, 81, 233, 190, 61, 134, 95, 29, 199, 217, 228, 23, 156, 143, 97, 128, + 222, 37, 88, 131, 199, 18, 185, 86, 229, 119, 181, 204, 8, 81, 155, 114, + 243, 48, 45, 0, 13, 30, 168, 167, 227, 209, 30, 190, 157, 193, 175, 32, + 126, 205, 43, 174, 32, 221, 234, 148, 248, 37, 79, 61, 22, 105, 66, 253, + 192, 34, 162, 203, 118, 207, 61, 12, 188, 196, 132, 121, 187, 59, 56, 128, + 63, 189, 174, 77, 169, 175, 61, 12, 230, 182, 135, 152, 254, 218, 179, 241, + 194, 222, 128, 237, 98, 45, 40, 236, 125, 39, 183, 6, 238, 72, 101, 89, + 151, 47, 128, 52, 52, 78, 45, 208, 128, 97, 12, 57, 120, 119, 30, 25, + 156, 5, 174, 166, 97, 173, 34, 18, 58, 11, 105, 86, 130, 128, 101, 16, + 108, 30, 251, 171, 69, 192, 106, 161, 201, 106, 244, 114, 190, 71, 11, 225, + 165, 251, 102, 126, 196, 225, 98, 132, 144, 227, 122, 157, 131, 130, 84, 131, + 97, 214, 152, 245, 157, 247, 26, 152, 229, 74, 207, 65, 106, 193, 148, 59, + 179, 143, 234, 118, 56, 159, 195, 42, 87, 86, 203, 193, 6, 232, 132, 182, + 38, 220, 156, 192, 122, 52, 236, 104, 253, 220, 131, 92, 18, 72, 96, 124, + 136, 82, 82, 151, 126, 123, 79, 185, 25, 6, 178, 117, 153, 87, 26, 208, + 197, 118, 113, 249, 181, 188, 220, 170, 184, 254, 155, 34, 179, 41, 23, 51, + 115, 7, 83, 151, 210, 70, 114, 215, 11, 44, 23, 74, 1, 3, 146, 4, + 100, 245, 66, 19, 224, 248, 126, 35, 154, 24, 162, 201, 7, 5, 213, 101, + 17, 88, 208, 107, 133, 117, 170, 35, 230, 42, 19, 134, 250, 188, 227, 179, + 64, 176, 88, 65, 169, 211, 216, 227, 0, 249, 167, 35, 224, 47, 68, 109, + 23, 54, 202, 152, 211, 118, 6, 115, 29, 160, 213, 188, 87, 21, 61, 71, + 158, 253, 39, 158, 144, 175, 61, 60, 155, 121, 66, 178, 206, 78, 74, 220, + 24, 58, 44, 116, 161, 100, 74, 185, 21, 61, 143, 210, 82, 201, 231, 65, + 70, 255, 82, 66, 105, 164, 110, 164, 169, 26, 26, 29, 172, 206, 200, 80, + 232, 106, 78, 80, 149, 212, 9, 45, 185, 64, 230, 20, 136, 68, 2, 147, + 158, 106, 25, 228, 119, 46, 251, 215, 152, 241, 27, 51, 254, 87, 97, 198, + 111, 52, 224, 111, 211, 34, 223, 163, 76, 238, 10, 79, 182, 160, 251, 207, + 185, 115, 29, 101, 132, 255, 202, 195, 83, 75, 63, 45, 49, 168, 224, 93, + 98, 97, 164, 242, 213, 126, 85, 225, 181, 66, 224, 225, 101, 75, 175, 115, + 175, 65, 201, 191, 174, 187, 8, 219, 176, 250, 177, 5, 138, 173, 123, 109, + 69, 38, 163, 202, 117, 236, 207, 40, 179, 107, 201, 139, 74, 250, 90, 125, + 102, 98, 150, 229, 40, 82, 16, 181, 148, 63, 147, 95, 173, 201, 88, 110, + 172, 93, 95, 124, 175, 171, 226, 103, 130, 169, 55, 232, 176, 153, 194, 106, + 99, 180, 215, 24, 237, 53, 6, 219, 215, 193, 228, 49, 231, 173, 3, 26, + 57, 225, 113, 197, 84, 124, 177, 194, 81, 242, 60, 88, 4, 234, 86, 222, + 209, 124, 36, 132, 163, 29, 205, 131, 101, 154, 169, 28, 181, 111, 162, 206, + 36, 184, 241, 97, 151, 76, 162, 206, 34, 24, 95, 39, 203, 168, 69, 72, + 220, 238, 56, 234, 120, 240, 184, 22, 189, 79, 139, 222, 167, 179, 85, 114, + 236, 144, 124, 71, 21, 198, 98, 49, 8, 103, 152, 110, 157, 211, 179, 37, + 158, 90, 250, 105, 137, 16, 75, 19, 109, 217, 106, 145, 12, 220, 241, 53, + 208, 92, 207, 13, 175, 140, 141, 110, 199, 38, 210, 163, 17, 17, 255, 74, + 34, 226, 22, 197, 229, 137, 221, 255, 210, 89, 229, 194, 76, 8, 39, 150, + 122, 162, 97, 156, 171, 218, 107, 193, 58, 85, 142, 101, 174, 19, 0, 21, + 202, 91, 55, 99, 30, 198, 48, 189, 137, 102, 78, 53, 98, 200, 138, 225, + 248, 91, 229, 148, 235, 81, 146, 109, 133, 107, 228, 44, 115, 218, 70, 162, + 220, 64, 234, 160, 141, 44, 253, 180, 172, 220, 150, 142, 128, 94, 168, 58, + 166, 10, 127, 70, 109, 168, 179, 32, 138, 91, 153, 121, 109, 35, 203, 126, + 35, 213, 124, 94, 31, 222, 105, 16, 206, 28, 159, 161, 228, 123, 19, 4, + 159, 222, 131, 39, 114, 193, 43, 160, 75, 94, 114, 207, 229, 83, 65, 23, + 114, 121, 32, 164, 86, 203, 56, 215, 92, 197, 194, 74, 110, 242, 247, 110, + 91, 47, 83, 145, 25, 193, 139, 29, 245, 124, 197, 172, 163, 82, 32, 205, + 172, 126, 96, 202, 26, 69, 73, 99, 93, 225, 219, 203, 215, 45, 234, 103, + 146, 171, 180, 20, 183, 40, 12, 222, 213, 92, 58, 191, 201, 91, 74, 183, + 219, 111, 154, 34, 38, 232, 87, 110, 127, 79, 221, 13, 160, 111, 136, 204, + 160, 133, 179, 44, 192, 58, 137, 88, 249, 130, 157, 255, 235, 170, 242, 35, + 195, 83, 50, 177, 50, 141, 49, 72, 229, 74, 245, 92, 89, 70, 166, 54, + 186, 223, 216, 15, 27, 225, 176, 17, 14, 191, 212, 38, 6, 222, 9, 108, + 24, 151, 104, 128, 35, 75, 27, 25, 219, 174, 188, 172, 205, 42, 105, 75, + 37, 152, 140, 20, 103, 87, 52, 153, 162, 151, 225, 89, 165, 8, 115, 10, + 210, 147, 10, 15, 85, 110, 180, 57, 140, 30, 94, 229, 79, 162, 16, 78, + 241, 135, 79, 204, 58, 140, 101, 18, 141, 173, 221, 195, 126, 84, 66, 37, + 160, 77, 60, 64, 254, 213, 47, 110, 50, 125, 42, 150, 136, 24, 197, 30, + 249, 210, 118, 165, 140, 119, 239, 65, 49, 133, 16, 195, 193, 223, 162, 168, + 34, 111, 48, 101, 181, 44, 107, 140, 134, 67, 129, 85, 208, 18, 91, 244, + 14, 123, 3, 51, 167, 37, 125, 200, 9, 119, 226, 185, 72, 135, 174, 121, + 210, 154, 94, 119, 26, 1, 91, 140, 0, 162, 247, 44, 220, 9, 101, 251, + 108, 48, 12, 246, 6, 195, 80, 248, 202, 194, 56, 32, 27, 223, 154, 129, + 232, 139, 129, 152, 99, 13, 157, 59, 140, 68, 223, 128, 178, 41, 25, 136, + 226, 103, 22, 71, 226, 190, 189, 61, 35, 49, 200, 71, 130, 228, 202, 77, + 134, 97, 176, 193, 48, 20, 190, 177, 48, 12, 40, 219, 173, 31, 134, 92, + 244, 170, 31, 136, 242, 126, 91, 64, 222, 135, 88, 127, 171, 123, 191, 58, + 239, 75, 214, 180, 213, 75, 70, 97, 4, 153, 136, 36, 127, 16, 206, 70, + 246, 8, 27, 172, 236, 72, 145, 85, 179, 49, 51, 74, 227, 118, 9, 120, + 175, 149, 66, 4, 146, 64, 147, 158, 208, 223, 150, 192, 229, 19, 199, 143, + 52, 234, 78, 113, 105, 50, 29, 126, 251, 106, 225, 214, 242, 203, 71, 193, + 45, 140, 91, 140, 35, 66, 9, 115, 193, 237, 84, 156, 89, 218, 89, 73, + 84, 64, 22, 31, 151, 214, 171, 192, 140, 208, 190, 226, 246, 71, 96, 3, + 245, 58, 5, 14, 217, 85, 131, 160, 197, 111, 32, 184, 17, 106, 153, 242, + 17, 88, 118, 158, 84, 204, 56, 200, 33, 118, 48, 110, 195, 35, 44, 108, + 127, 69, 61, 50, 244, 185, 136, 210, 177, 163, 146, 0, 141, 103, 190, 27, + 35, 136, 167, 110, 19, 50, 75, 150, 126, 168, 201, 166, 50, 20, 101, 238, + 32, 126, 55, 200, 180, 68, 61, 48, 122, 49, 90, 186, 168, 200, 143, 86, + 162, 66, 7, 66, 60, 5, 83, 246, 15, 7, 27, 47, 156, 112, 4, 178, + 152, 37, 49, 88, 71, 24, 144, 226, 83, 63, 4, 129, 171, 113, 20, 40, + 94, 1, 4, 255, 242, 248, 173, 59, 69, 139, 2, 8, 162, 109, 159, 199, + 157, 25, 220, 198, 195, 85, 103, 225, 140, 231, 24, 185, 213, 129, 121, 150, + 107, 224, 217, 98, 182, 93, 126, 128, 62, 86, 95, 169, 202, 116, 62, 114, + 22, 65, 50, 245, 112, 52, 48, 161, 40, 59, 179, 180, 51, 221, 226, 132, + 43, 241, 62, 230, 224, 230, 43, 81, 137, 31, 235, 217, 232, 26, 200, 47, + 29, 5, 115, 225, 204, 51, 145, 28, 13, 48, 98, 16, 125, 100, 156, 107, + 143, 219, 220, 54, 65, 230, 236, 244, 234, 96, 52, 116, 6, 230, 213, 126, + 122, 117, 212, 31, 77, 246, 141, 160, 127, 96, 30, 121, 30, 253, 222, 253, + 173, 74, 159, 222, 235, 216, 123, 149, 5, 254, 142, 28, 255, 173, 19, 137, + 137, 193, 35, 43, 59, 42, 33, 38, 106, 157, 106, 55, 132, 31, 154, 164, + 128, 9, 102, 153, 106, 51, 218, 104, 223, 140, 71, 84, 125, 210, 3, 178, + 57, 30, 168, 193, 138, 58, 202, 255, 160, 43, 13, 99, 197, 87, 249, 221, + 71, 158, 207, 199, 129, 63, 81, 223, 134, 25, 175, 147, 113, 122, 209, 51, + 7, 122, 32, 194, 17, 135, 9, 127, 191, 87, 239, 245, 223, 235, 221, 27, + 219, 232, 183, 24, 221, 81, 203, 194, 197, 70, 99, 88, 85, 42, 9, 249, + 131, 152, 254, 98, 146, 140, 220, 119, 102, 195, 110, 117, 232, 158, 109, 130, + 222, 157, 184, 35, 208, 32, 35, 35, 24, 92, 49, 30, 62, 94, 140, 2, + 197, 32, 186, 247, 33, 121, 135, 159, 127, 228, 66, 88, 192, 130, 68, 209, + 145, 149, 29, 85, 71, 65, 234, 65, 213, 70, 189, 110, 50, 49, 151, 236, + 252, 18, 60, 148, 117, 248, 92, 141, 141, 176, 177, 17, 126, 75, 54, 194, + 134, 11, 125, 245, 92, 72, 212, 27, 175, 136, 201, 57, 10, 87, 17, 12, + 143, 32, 166, 116, 104, 229, 135, 107, 131, 202, 107, 112, 184, 42, 156, 109, + 84, 6, 64, 101, 91, 107, 81, 120, 155, 21, 248, 213, 175, 192, 97, 7, + 33, 227, 170, 112, 39, 196, 90, 83, 236, 222, 202, 98, 188, 202, 19, 55, + 172, 210, 214, 204, 68, 128, 89, 57, 72, 143, 165, 66, 216, 213, 173, 26, + 69, 41, 160, 80, 157, 230, 165, 227, 79, 130, 5, 40, 4, 124, 146, 217, + 61, 246, 134, 195, 126, 174, 216, 109, 82, 33, 64, 136, 12, 219, 103, 77, + 2, 133, 239, 160, 82, 231, 123, 234, 120, 83, 180, 13, 227, 192, 207, 229, + 177, 165, 28, 215, 107, 126, 242, 3, 132, 255, 66, 41, 121, 150, 153, 58, + 116, 213, 43, 135, 75, 80, 6, 178, 36, 61, 44, 3, 218, 168, 237, 245, + 196, 89, 44, 156, 250, 46, 31, 230, 224, 206, 190, 47, 29, 164, 13, 62, + 177, 12, 64, 108, 168, 91, 40, 206, 83, 203, 23, 70, 22, 40, 221, 14, + 12, 68, 250, 172, 159, 24, 182, 186, 158, 10, 186, 225, 127, 134, 165, 232, + 134, 88, 138, 207, 163, 64, 101, 186, 198, 118, 129, 202, 180, 239, 229, 93, + 242, 6, 209, 51, 61, 255, 191, 26, 242, 222, 51, 205, 131, 13, 9, 255, + 22, 73, 184, 221, 177, 251, 149, 66, 196, 83, 208, 39, 98, 82, 200, 230, + 116, 100, 101, 71, 107, 37, 8, 155, 108, 41, 141, 78, 213, 232, 84, 141, + 78, 213, 144, 195, 175, 134, 28, 214, 71, 58, 59, 111, 29, 10, 104, 132, + 191, 150, 252, 91, 66, 8, 207, 96, 196, 146, 112, 36, 162, 144, 5, 71, + 135, 15, 173, 1, 5, 53, 37, 86, 13, 231, 82, 183, 239, 153, 70, 231, + 130, 251, 163, 89, 152, 223, 230, 194, 180, 201, 183, 83, 161, 106, 157, 58, + 225, 200, 35, 41, 127, 65, 71, 86, 118, 148, 169, 81, 36, 196, 107, 0, + 32, 34, 176, 84, 89, 182, 194, 1, 95, 68, 9, 41, 233, 83, 135, 125, + 86, 200, 63, 55, 151, 168, 185, 134, 219, 3, 29, 18, 215, 119, 163, 32, + 14, 131, 101, 42, 74, 24, 86, 108, 1, 153, 171, 92, 82, 183, 135, 59, + 91, 164, 215, 122, 162, 58, 137, 162, 120, 96, 69, 167, 12, 52, 174, 160, + 224, 193, 213, 167, 240, 229, 149, 26, 224, 93, 81, 251, 66, 62, 2, 182, + 125, 30, 192, 159, 112, 246, 41, 11, 151, 56, 239, 228, 212, 191, 147, 19, + 255, 46, 155, 246, 35, 96, 98, 185, 199, 223, 30, 20, 32, 216, 37, 74, + 187, 208, 173, 245, 156, 79, 140, 105, 43, 169, 53, 241, 146, 251, 88, 69, + 33, 240, 133, 134, 131, 64, 60, 145, 214, 44, 202, 14, 136, 118, 117, 235, + 69, 60, 124, 203, 37, 142, 119, 86, 93, 193, 212, 168, 241, 99, 116, 50, + 69, 191, 242, 10, 190, 24, 127, 69, 60, 91, 156, 109, 147, 22, 222, 35, + 44, 181, 138, 32, 153, 83, 144, 33, 177, 180, 215, 105, 16, 57, 238, 152, + 166, 74, 180, 92, 45, 168, 197, 42, 180, 84, 74, 213, 58, 22, 11, 129, + 32, 41, 226, 182, 93, 205, 98, 122, 6, 192, 221, 28, 235, 110, 25, 57, + 33, 98, 201, 107, 1, 77, 212, 109, 203, 129, 14, 251, 148, 154, 88, 89, + 47, 41, 27, 243, 124, 172, 233, 104, 35, 151, 82, 193, 14, 218, 232, 49, + 141, 30, 211, 232, 49, 141, 184, 184, 237, 226, 226, 30, 89, 230, 43, 204, + 58, 47, 150, 192, 158, 99, 153, 83, 179, 20, 101, 40, 196, 81, 9, 81, + 212, 204, 143, 189, 172, 78, 180, 192, 56, 200, 44, 138, 120, 36, 140, 143, + 120, 36, 205, 142, 120, 120, 17, 186, 14, 242, 15, 60, 206, 103, 6, 89, + 143, 187, 164, 198, 116, 94, 148, 166, 71, 146, 219, 11, 243, 211, 14, 65, + 5, 209, 111, 29, 134, 97, 112, 35, 158, 154, 140, 231, 60, 206, 127, 158, + 237, 190, 72, 98, 15, 136, 220, 189, 252, 69, 180, 182, 244, 149, 180, 198, + 236, 229, 180, 86, 241, 179, 250, 19, 241, 5, 180, 22, 241, 42, 74, 83, + 102, 75, 45, 45, 253, 38, 42, 146, 230, 73, 234, 10, 222, 94, 202, 124, + 65, 250, 82, 48, 106, 169, 188, 140, 132, 245, 163, 130, 125, 54, 92, 207, + 33, 102, 181, 104, 79, 69, 139, 28, 170, 242, 219, 173, 217, 229, 126, 215, + 232, 115, 14, 4, 107, 236, 122, 218, 78, 239, 166, 133, 162, 190, 147, 117, + 162, 136, 15, 225, 80, 163, 11, 68, 9, 181, 162, 104, 79, 33, 28, 164, + 68, 162, 203, 142, 249, 12, 43, 209, 223, 207, 142, 122, 7, 242, 48, 183, + 162, 75, 144, 239, 66, 53, 44, 31, 131, 65, 93, 7, 75, 59, 189, 39, + 126, 164, 82, 59, 121, 202, 86, 65, 146, 85, 3, 206, 108, 251, 184, 63, + 104, 73, 43, 1, 172, 114, 73, 231, 21, 59, 69, 41, 168, 137, 132, 14, + 137, 37, 246, 35, 98, 71, 76, 168, 186, 148, 179, 20, 15, 117, 111, 57, + 86, 167, 18, 84, 31, 171, 86, 221, 184, 32, 111, 143, 114, 196, 50, 39, + 74, 139, 130, 230, 171, 130, 74, 6, 70, 242, 231, 151, 105, 89, 171, 128, + 222, 55, 20, 5, 173, 176, 172, 177, 255, 189, 89, 213, 216, 241, 162, 160, + 180, 190, 168, 248, 10, 152, 143, 244, 12, 222, 32, 74, 66, 2, 38, 79, + 235, 60, 71, 84, 197, 121, 233, 68, 242, 27, 8, 2, 131, 194, 96, 55, + 174, 59, 218, 176, 133, 109, 161, 238, 253, 14, 18, 248, 10, 145, 23, 11, + 226, 1, 207, 10, 97, 235, 70, 105, 97, 188, 171, 72, 156, 27, 37, 66, + 107, 73, 22, 162, 106, 244, 138, 37, 148, 75, 234, 82, 234, 8, 172, 37, + 116, 161, 111, 237, 20, 233, 129, 74, 36, 14, 253, 149, 2, 243, 143, 238, + 88, 153, 27, 210, 179, 90, 64, 58, 149, 215, 200, 139, 144, 226, 229, 125, + 221, 27, 92, 58, 53, 69, 61, 150, 201, 166, 29, 153, 184, 5, 187, 84, + 173, 36, 159, 191, 9, 85, 7, 20, 131, 209, 67, 47, 159, 133, 8, 168, + 217, 85, 145, 127, 91, 121, 185, 156, 58, 69, 68, 158, 126, 247, 89, 139, + 157, 229, 254, 70, 152, 86, 250, 45, 53, 113, 91, 60, 94, 180, 132, 136, + 67, 75, 101, 186, 66, 10, 59, 247, 86, 236, 102, 206, 9, 168, 246, 231, + 128, 170, 36, 192, 231, 136, 74, 183, 1, 104, 108, 110, 4, 4, 195, 35, + 248, 217, 54, 253, 20, 6, 240, 43, 228, 76, 44, 6, 84, 214, 243, 198, + 188, 178, 49, 213, 221, 203, 74, 20, 167, 157, 29, 65, 72, 35, 172, 33, + 21, 131, 250, 94, 83, 66, 224, 8, 246, 214, 53, 213, 13, 32, 15, 167, + 195, 16, 76, 9, 72, 142, 68, 194, 217, 209, 128, 114, 128, 234, 197, 201, + 136, 83, 45, 129, 27, 204, 229, 253, 159, 183, 15, 71, 203, 217, 254, 209, + 147, 167, 251, 111, 143, 78, 183, 108, 223, 213, 212, 249, 58, 3, 30, 17, + 102, 97, 159, 180, 241, 160, 193, 74, 15, 74, 68, 171, 70, 111, 108, 244, + 198, 70, 111, 252, 230, 4, 132, 175, 89, 111, 172, 181, 52, 159, 121, 142, + 75, 65, 92, 88, 26, 102, 114, 37, 2, 217, 201, 230, 172, 53, 168, 104, + 133, 64, 62, 170, 76, 105, 185, 208, 65, 178, 130, 16, 58, 116, 45, 39, + 75, 14, 172, 245, 55, 16, 38, 255, 75, 80, 228, 52, 53, 71, 237, 178, + 6, 194, 131, 28, 18, 60, 213, 196, 250, 197, 156, 162, 45, 152, 152, 30, + 138, 124, 85, 136, 43, 103, 129, 119, 237, 128, 206, 16, 75, 92, 32, 56, + 187, 154, 4, 177, 132, 5, 74, 207, 212, 12, 232, 92, 39, 44, 32, 48, + 25, 113, 28, 112, 185, 109, 148, 150, 164, 140, 32, 173, 196, 74, 49, 94, + 84, 164, 223, 212, 119, 50, 103, 85, 205, 174, 57, 76, 21, 65, 5, 6, + 165, 173, 150, 44, 71, 219, 180, 122, 189, 103, 92, 215, 113, 64, 244, 140, + 194, 250, 74, 8, 91, 48, 219, 181, 219, 80, 6, 52, 138, 116, 180, 199, + 158, 231, 46, 35, 33, 233, 211, 7, 93, 113, 217, 98, 21, 90, 74, 80, + 184, 168, 132, 66, 87, 38, 62, 169, 49, 147, 19, 55, 201, 16, 228, 117, + 31, 160, 9, 176, 130, 3, 223, 197, 127, 182, 42, 109, 185, 126, 4, 121, + 180, 242, 65, 154, 141, 49, 8, 79, 74, 108, 236, 205, 201, 201, 197, 31, + 15, 240, 66, 154, 160, 67, 118, 49, 229, 188, 4, 86, 75, 104, 8, 87, + 34, 52, 213, 30, 160, 18, 112, 208, 187, 159, 107, 36, 82, 71, 168, 238, + 144, 21, 218, 81, 17, 129, 154, 248, 233, 47, 203, 109, 255, 179, 54, 117, + 56, 43, 82, 30, 242, 150, 178, 150, 168, 66, 248, 194, 29, 135, 1, 222, + 209, 146, 12, 145, 237, 206, 220, 183, 88, 31, 92, 88, 131, 68, 249, 16, + 50, 244, 220, 3, 29, 76, 2, 222, 11, 68, 146, 221, 136, 59, 11, 96, + 134, 209, 61, 209, 129, 221, 184, 241, 28, 175, 59, 225, 200, 141, 67, 39, + 20, 185, 213, 109, 246, 44, 22, 80, 166, 14, 3, 33, 63, 226, 44, 36, + 162, 224, 190, 147, 32, 250, 124, 60, 247, 221, 63, 19, 110, 225, 143, 230, + 9, 203, 174, 95, 130, 142, 144, 170, 109, 167, 248, 222, 173, 116, 59, 156, + 211, 87, 69, 240, 201, 163, 21, 59, 163, 223, 120, 169, 254, 134, 174, 197, + 185, 192, 102, 218, 238, 162, 179, 76, 70, 29, 224, 217, 29, 226, 88, 179, + 217, 226, 42, 92, 250, 90, 6, 115, 37, 48, 43, 254, 144, 19, 229, 73, + 213, 105, 242, 53, 108, 231, 71, 97, 226, 7, 236, 137, 227, 241, 208, 231, + 194, 62, 7, 173, 175, 65, 121, 98, 79, 130, 36, 130, 33, 75, 84, 197, + 249, 31, 220, 241, 91, 240, 49, 115, 142, 62, 215, 144, 123, 149, 21, 239, + 74, 23, 64, 133, 14, 59, 225, 177, 227, 122, 240, 126, 98, 52, 151, 52, + 206, 84, 166, 48, 251, 134, 118, 62, 38, 181, 37, 242, 236, 131, 239, 226, + 135, 189, 110, 111, 208, 123, 31, 237, 54, 90, 67, 51, 179, 97, 16, 77, + 32, 237, 227, 150, 76, 60, 20, 144, 194, 15, 196, 125, 3, 237, 247, 126, + 101, 17, 224, 114, 170, 74, 248, 93, 45, 44, 44, 52, 209, 169, 235, 213, + 2, 175, 228, 112, 94, 229, 151, 234, 105, 174, 180, 187, 84, 146, 220, 178, + 235, 165, 198, 46, 163, 80, 9, 189, 116, 30, 56, 97, 152, 153, 178, 74, + 52, 89, 7, 180, 129, 41, 214, 253, 220, 72, 85, 38, 110, 54, 36, 255, + 155, 34, 249, 190, 36, 232, 41, 177, 23, 116, 91, 208, 117, 54, 114, 103, + 51, 92, 108, 130, 186, 139, 75, 187, 229, 52, 253, 94, 155, 61, 226, 48, + 7, 220, 82, 105, 10, 210, 197, 63, 19, 140, 122, 137, 208, 172, 10, 15, + 69, 12, 137, 36, 230, 255, 85, 70, 200, 191, 184, 216, 69, 104, 49, 85, + 233, 40, 47, 129, 120, 1, 81, 20, 112, 126, 97, 122, 98, 169, 39, 153, + 116, 111, 132, 64, 170, 113, 73, 110, 24, 162, 244, 158, 225, 118, 201, 192, + 164, 203, 214, 225, 173, 139, 206, 193, 215, 233, 193, 37, 30, 113, 37, 82, + 168, 204, 221, 101, 111, 232, 238, 218, 130, 193, 5, 29, 208, 238, 116, 251, + 21, 72, 107, 192, 149, 169, 200, 122, 132, 7, 86, 122, 160, 208, 77, 35, + 149, 10, 52, 187, 1, 130, 83, 150, 104, 201, 106, 38, 148, 174, 41, 87, + 39, 81, 149, 142, 15, 5, 111, 149, 20, 203, 84, 180, 45, 1, 178, 89, + 146, 145, 173, 244, 193, 64, 37, 36, 200, 105, 234, 208, 70, 40, 48, 159, + 54, 31, 9, 75, 138, 22, 58, 61, 77, 248, 154, 148, 165, 204, 20, 88, + 223, 175, 118, 177, 149, 66, 216, 168, 216, 53, 127, 119, 216, 60, 228, 211, + 135, 36, 140, 68, 32, 141, 76, 17, 50, 165, 181, 12, 162, 184, 61, 1, + 210, 233, 248, 104, 87, 33, 209, 4, 101, 53, 90, 57, 169, 220, 215, 130, + 195, 39, 207, 78, 207, 90, 131, 189, 251, 253, 253, 189, 126, 127, 231, 39, + 162, 70, 169, 241, 254, 239, 29, 231, 39, 54, 5, 161, 130, 29, 139, 39, + 29, 134, 36, 137, 146, 99, 53, 255, 29, 90, 163, 91, 181, 121, 246, 59, + 88, 148, 163, 34, 34, 226, 92, 74, 221, 236, 34, 9, 71, 137, 135, 159, + 65, 91, 73, 54, 95, 197, 89, 179, 85, 222, 92, 3, 226, 208, 51, 226, + 108, 11, 198, 40, 74, 151, 29, 40, 10, 118, 136, 56, 184, 122, 77, 64, + 221, 56, 66, 67, 31, 235, 242, 69, 175, 176, 160, 21, 242, 57, 80, 46, + 162, 213, 64, 68, 107, 102, 126, 246, 173, 178, 116, 137, 186, 180, 21, 50, + 230, 249, 60, 24, 99, 56, 232, 91, 97, 241, 136, 240, 244, 6, 207, 44, + 237, 204, 116, 112, 22, 230, 196, 20, 183, 158, 3, 111, 61, 9, 57, 104, + 76, 8, 50, 85, 209, 41, 235, 160, 89, 27, 55, 203, 118, 110, 124, 61, + 141, 175, 167, 241, 245, 52, 170, 200, 22, 17, 218, 1, 6, 78, 87, 2, + 247, 46, 3, 95, 224, 184, 69, 116, 100, 101, 71, 101, 49, 130, 169, 30, + 220, 235, 91, 125, 203, 110, 224, 182, 27, 82, 216, 144, 194, 134, 20, 126, + 61, 164, 176, 30, 195, 60, 118, 40, 152, 243, 137, 231, 68, 66, 234, 20, + 13, 87, 51, 108, 176, 204, 134, 18, 250, 88, 11, 142, 83, 226, 200, 212, + 156, 105, 160, 238, 249, 105, 109, 185, 77, 17, 109, 83, 19, 163, 217, 89, + 130, 226, 150, 37, 19, 125, 118, 248, 142, 102, 47, 125, 155, 123, 169, 135, + 136, 52, 149, 86, 42, 12, 164, 151, 123, 40, 76, 247, 78, 24, 85, 39, + 188, 153, 37, 208, 143, 249, 50, 47, 98, 164, 219, 166, 50, 224, 99, 219, + 58, 208, 12, 91, 143, 66, 96, 82, 243, 44, 172, 181, 175, 90, 250, 243, + 20, 200, 172, 218, 204, 129, 25, 105, 176, 6, 103, 166, 96, 187, 218, 27, + 140, 15, 234, 151, 249, 231, 206, 29, 70, 65, 175, 194, 40, 43, 109, 162, + 98, 78, 232, 208, 202, 15, 75, 104, 153, 22, 26, 96, 152, 102, 75, 71, + 74, 49, 125, 24, 22, 200, 131, 66, 228, 176, 30, 243, 161, 79, 239, 7, + 216, 110, 239, 140, 32, 221, 144, 161, 175, 158, 12, 213, 178, 244, 11, 30, + 135, 46, 209, 161, 152, 142, 172, 236, 72, 213, 106, 50, 128, 106, 74, 206, + 177, 183, 202, 74, 86, 255, 121, 34, 61, 138, 190, 79, 28, 90, 249, 97, + 233, 23, 246, 109, 35, 53, 92, 110, 243, 212, 185, 185, 55, 168, 222, 228, + 70, 110, 177, 81, 159, 229, 28, 164, 5, 185, 66, 143, 146, 240, 45, 87, + 170, 159, 72, 194, 41, 183, 151, 200, 237, 14, 124, 70, 91, 122, 39, 221, + 218, 105, 70, 249, 142, 149, 247, 200, 247, 115, 172, 246, 211, 155, 149, 51, + 245, 33, 70, 115, 250, 99, 34, 182, 97, 171, 44, 214, 189, 58, 56, 239, + 95, 131, 48, 240, 3, 252, 153, 251, 127, 195, 121, 126, 75, 231, 174, 149, + 31, 150, 208, 238, 139, 121, 200, 163, 121, 224, 77, 210, 153, 219, 51, 51, + 190, 179, 30, 236, 133, 175, 76, 226, 25, 101, 58, 145, 250, 134, 142, 181, + 39, 33, 172, 14, 28, 64, 217, 82, 195, 0, 68, 249, 69, 101, 201, 37, + 163, 200, 65, 107, 172, 63, 187, 115, 158, 245, 137, 231, 100, 158, 162, 44, + 177, 36, 157, 192, 146, 249, 221, 73, 139, 240, 228, 166, 117, 145, 173, 199, + 76, 224, 131, 174, 18, 116, 154, 246, 41, 113, 91, 41, 187, 64, 212, 169, + 140, 152, 178, 79, 108, 67, 44, 144, 61, 74, 92, 91, 246, 26, 241, 0, + 51, 225, 90, 25, 55, 204, 115, 47, 47, 123, 108, 215, 15, 68, 2, 226, + 101, 175, 61, 196, 63, 54, 253, 3, 199, 91, 228, 6, 70, 92, 210, 65, + 167, 95, 177, 116, 95, 113, 231, 45, 127, 112, 131, 255, 90, 244, 111, 69, + 92, 226, 158, 30, 117, 97, 74, 106, 123, 5, 216, 28, 42, 140, 84, 17, + 79, 97, 106, 89, 122, 85, 189, 19, 119, 132, 83, 85, 6, 93, 162, 238, + 14, 217, 109, 157, 64, 88, 145, 19, 105, 195, 44, 165, 199, 131, 236, 104, + 111, 63, 109, 205, 238, 191, 108, 33, 165, 68, 243, 137, 90, 117, 93, 145, + 72, 95, 175, 235, 240, 229, 151, 0, 230, 168, 29, 84, 98, 131, 194, 102, + 13, 61, 226, 191, 55, 116, 100, 101, 71, 53, 192, 114, 34, 18, 167, 175, + 225, 189, 20, 124, 105, 250, 76, 20, 74, 73, 235, 213, 31, 205, 10, 146, + 189, 54, 138, 164, 253, 250, 97, 44, 154, 47, 123, 88, 134, 172, 177, 96, + 54, 22, 204, 198, 130, 217, 168, 59, 219, 168, 15, 96, 153, 174, 151, 240, + 134, 110, 88, 40, 210, 245, 18, 19, 53, 34, 84, 13, 112, 157, 63, 160, + 242, 92, 118, 56, 27, 85, 100, 10, 63, 233, 156, 170, 236, 239, 74, 178, + 98, 29, 104, 235, 101, 231, 17, 83, 131, 137, 206, 66, 23, 84, 247, 165, + 227, 221, 219, 240, 6, 145, 61, 226, 132, 171, 236, 134, 129, 126, 195, 182, + 15, 248, 49, 71, 84, 128, 16, 68, 83, 254, 96, 146, 31, 35, 155, 83, + 78, 75, 120, 221, 161, 55, 131, 213, 28, 207, 23, 217, 54, 60, 143, 29, + 28, 10, 92, 186, 167, 1, 206, 81, 235, 40, 128, 143, 240, 35, 120, 151, + 117, 149, 36, 155, 125, 253, 109, 239, 235, 103, 62, 236, 105, 80, 195, 222, + 60, 13, 60, 224, 119, 40, 79, 185, 162, 233, 106, 142, 45, 150, 217, 160, + 214, 139, 147, 240, 32, 10, 136, 24, 194, 195, 13, 149, 66, 92, 23, 112, + 11, 154, 78, 141, 114, 52, 106, 69, 44, 144, 132, 176, 226, 18, 138, 103, + 185, 182, 248, 60, 184, 65, 126, 8, 19, 186, 85, 250, 244, 160, 99, 239, + 87, 166, 208, 101, 67, 121, 26, 132, 75, 24, 171, 96, 134, 107, 76, 27, + 210, 5, 93, 177, 10, 45, 37, 33, 234, 4, 43, 32, 20, 191, 171, 170, + 52, 51, 234, 115, 236, 122, 34, 144, 235, 170, 180, 36, 223, 93, 65, 79, + 98, 74, 253, 143, 65, 255, 159, 121, 43, 22, 37, 179, 25, 12, 131, 0, + 252, 112, 150, 75, 111, 165, 69, 22, 19, 140, 64, 224, 51, 71, 130, 5, + 96, 84, 162, 67, 224, 251, 148, 128, 17, 242, 25, 165, 146, 4, 76, 126, + 174, 69, 64, 36, 160, 175, 201, 16, 100, 153, 106, 226, 46, 148, 88, 228, + 109, 154, 239, 97, 199, 30, 86, 66, 102, 230, 243, 141, 64, 7, 162, 228, + 186, 62, 219, 90, 118, 66, 177, 181, 100, 214, 55, 201, 44, 48, 162, 205, + 119, 101, 105, 197, 10, 120, 152, 188, 188, 34, 37, 161, 36, 64, 52, 97, + 212, 199, 162, 19, 166, 164, 136, 105, 187, 87, 140, 5, 55, 50, 24, 238, + 235, 54, 188, 252, 231, 114, 147, 60, 67, 248, 2, 195, 230, 169, 106, 208, + 148, 245, 160, 166, 60, 104, 107, 85, 160, 126, 188, 72, 112, 97, 165, 249, + 17, 69, 112, 199, 232, 218, 52, 135, 212, 110, 138, 77, 247, 68, 74, 224, + 207, 194, 96, 22, 130, 4, 225, 10, 123, 31, 166, 5, 39, 190, 143, 111, + 114, 245, 161, 117, 35, 211, 159, 192, 228, 154, 41, 232, 12, 30, 236, 143, + 8, 150, 14, 91, 56, 171, 124, 199, 9, 56, 141, 205, 115, 141, 182, 111, + 59, 104, 233, 58, 202, 194, 47, 236, 4, 109, 19, 148, 172, 186, 171, 52, + 113, 70, 89, 118, 207, 131, 224, 58, 89, 202, 235, 169, 9, 82, 183, 242, + 200, 46, 41, 242, 85, 121, 69, 80, 101, 41, 166, 143, 33, 205, 126, 104, + 244, 200, 237, 157, 87, 138, 161, 198, 232, 116, 204, 199, 206, 42, 255, 165, + 238, 208, 240, 191, 203, 31, 19, 59, 250, 170, 204, 29, 80, 186, 246, 175, + 170, 23, 255, 7, 176, 4, 88, 225, 99, 20, 145, 71, 43, 248, 165, 96, + 76, 184, 81, 98, 28, 82, 241, 14, 182, 236, 255, 7, 220, 119, 127, 136, + 255, 14, 233, 216, 166, 227, 30, 29, 211, 161, 77, 231, 255, 223, 29, 151, + 39, 230, 161, 140, 175, 179, 72, 112, 100, 29, 115, 145, 146, 146, 68, 92, + 227, 44, 99, 199, 71, 12, 170, 41, 241, 18, 204, 161, 171, 169, 142, 250, + 228, 251, 211, 103, 71, 233, 250, 67, 171, 176, 250, 124, 88, 79, 33, 254, + 38, 237, 135, 239, 225, 179, 129, 47, 43, 89, 118, 116, 10, 11, 113, 130, + 151, 169, 150, 170, 8, 107, 179, 59, 51, 78, 245, 83, 91, 130, 159, 97, + 80, 59, 102, 228, 181, 102, 11, 119, 220, 114, 179, 223, 106, 207, 227, 133, + 247, 41, 115, 240, 72, 200, 226, 240, 250, 110, 180, 250, 192, 212, 187, 205, + 182, 175, 176, 126, 7, 97, 220, 58, 6, 82, 148, 32, 37, 212, 183, 241, + 132, 91, 250, 105, 9, 31, 43, 77, 4, 217, 47, 212, 213, 225, 179, 196, + 115, 66, 153, 14, 170, 136, 127, 207, 4, 124, 179, 59, 70, 177, 157, 123, + 78, 226, 59, 171, 150, 8, 106, 39, 73, 29, 163, 97, 242, 243, 138, 231, + 177, 98, 182, 138, 254, 243, 159, 79, 196, 250, 244, 80, 141, 221, 154, 156, + 202, 73, 235, 241, 138, 179, 195, 56, 230, 126, 66, 223, 241, 0, 116, 156, + 43, 190, 226, 150, 252, 91, 229, 220, 41, 76, 88, 193, 88, 218, 39, 43, + 184, 66, 200, 36, 213, 45, 39, 186, 91, 48, 84, 107, 146, 250, 23, 193, + 91, 212, 26, 99, 70, 238, 42, 50, 47, 135, 212, 8, 202, 79, 76, 96, + 125, 164, 17, 153, 109, 101, 197, 180, 113, 225, 40, 149, 180, 53, 163, 115, + 193, 139, 102, 198, 168, 52, 186, 248, 151, 215, 197, 171, 179, 159, 63, 81, + 144, 96, 224, 185, 32, 253, 173, 40, 142, 70, 30, 95, 197, 84, 220, 76, + 57, 253, 90, 137, 109, 74, 67, 89, 135, 61, 14, 131, 40, 151, 205, 91, + 182, 14, 177, 79, 241, 133, 75, 103, 172, 69, 0, 136, 152, 156, 220, 35, + 209, 88, 173, 190, 248, 78, 169, 204, 114, 14, 115, 123, 112, 196, 98, 37, + 86, 66, 152, 3, 72, 224, 196, 148, 103, 202, 100, 78, 208, 63, 205, 28, + 217, 15, 165, 142, 73, 42, 117, 48, 39, 181, 100, 182, 217, 47, 17, 159, + 38, 158, 176, 55, 160, 30, 75, 55, 71, 108, 14, 28, 2, 111, 199, 190, + 203, 185, 211, 26, 11, 199, 218, 198, 120, 164, 159, 155, 77, 119, 247, 171, + 211, 210, 104, 19, 179, 55, 89, 237, 10, 119, 76, 98, 87, 68, 237, 87, + 78, 222, 108, 149, 182, 150, 89, 130, 13, 95, 244, 222, 218, 58, 26, 221, + 246, 190, 165, 150, 228, 44, 20, 210, 232, 182, 251, 26, 71, 207, 194, 56, + 74, 194, 54, 246, 140, 160, 30, 238, 71, 48, 115, 197, 216, 159, 182, 89, + 89, 0, 196, 113, 20, 222, 77, 8, 132, 110, 91, 132, 85, 170, 175, 71, + 36, 168, 208, 179, 79, 134, 7, 37, 219, 145, 124, 110, 133, 110, 54, 61, + 46, 87, 211, 208, 23, 23, 46, 3, 79, 35, 144, 93, 107, 231, 103, 142, + 88, 208, 49, 251, 25, 97, 33, 70, 65, 152, 81, 34, 116, 144, 37, 192, + 21, 90, 255, 76, 226, 216, 217, 81, 132, 32, 232, 125, 184, 92, 134, 1, + 26, 72, 243, 218, 241, 149, 137, 212, 70, 221, 140, 38, 231, 165, 241, 24, + 55, 30, 227, 134, 71, 111, 187, 103, 169, 223, 233, 30, 84, 39, 196, 103, + 12, 77, 98, 178, 235, 236, 76, 54, 90, 37, 109, 27, 176, 50, 83, 184, + 69, 25, 53, 183, 213, 105, 101, 120, 215, 169, 176, 196, 86, 172, 53, 40, + 20, 205, 98, 253, 234, 23, 43, 214, 62, 235, 244, 170, 146, 74, 228, 98, + 125, 132, 90, 10, 150, 81, 82, 23, 235, 40, 109, 180, 74, 218, 202, 114, + 89, 165, 0, 243, 171, 131, 197, 33, 198, 149, 136, 1, 66, 42, 49, 122, + 237, 27, 157, 76, 189, 170, 145, 20, 26, 73, 161, 145, 20, 26, 226, 251, + 117, 17, 223, 62, 5, 78, 28, 212, 19, 223, 39, 137, 59, 145, 62, 67, + 73, 101, 103, 212, 98, 153, 13, 37, 52, 151, 238, 101, 135, 81, 30, 244, + 196, 189, 41, 140, 39, 204, 161, 44, 201, 0, 179, 93, 90, 161, 193, 72, + 83, 169, 55, 119, 83, 66, 153, 18, 223, 210, 232, 113, 13, 117, 110, 168, + 115, 67, 157, 191, 110, 234, 124, 159, 252, 135, 85, 110, 9, 73, 157, 117, + 111, 176, 164, 199, 153, 177, 214, 42, 105, 43, 47, 5, 183, 125, 6, 199, + 11, 116, 176, 159, 199, 124, 153, 195, 173, 13, 213, 66, 106, 107, 114, 142, + 27, 42, 223, 80, 249, 111, 159, 202, 67, 131, 231, 113, 180, 202, 83, 248, + 144, 90, 14, 11, 168, 83, 0, 207, 122, 225, 11, 19, 140, 131, 148, 242, + 226, 38, 144, 39, 17, 145, 252, 36, 84, 78, 31, 19, 96, 103, 126, 126, + 238, 222, 198, 184, 14, 210, 150, 130, 38, 253, 226, 45, 134, 187, 47, 211, + 18, 212, 93, 45, 207, 184, 225, 74, 223, 38, 87, 218, 72, 103, 56, 69, + 164, 246, 44, 149, 81, 101, 77, 11, 184, 50, 78, 47, 88, 21, 237, 101, + 25, 206, 6, 55, 0, 153, 191, 142, 27, 96, 196, 187, 130, 79, 241, 79, + 206, 151, 106, 68, 172, 19, 177, 227, 172, 64, 154, 168, 120, 42, 124, 65, + 83, 199, 139, 120, 195, 67, 26, 30, 210, 240, 144, 134, 135, 52, 60, 228, + 203, 242, 144, 137, 235, 248, 58, 239, 192, 22, 203, 108, 168, 198, 50, 18, + 49, 126, 189, 186, 24, 63, 123, 56, 52, 114, 159, 26, 162, 223, 16, 253, + 111, 159, 232, 55, 68, 244, 107, 39, 162, 245, 81, 171, 146, 136, 254, 252, + 188, 133, 178, 184, 230, 229, 247, 61, 20, 182, 85, 31, 191, 108, 41, 33, + 164, 74, 222, 79, 150, 175, 221, 30, 150, 197, 133, 61, 114, 252, 201, 77, + 86, 86, 121, 128, 96, 124, 57, 222, 198, 69, 224, 107, 93, 50, 215, 107, + 79, 149, 225, 197, 143, 193, 251, 98, 141, 115, 5, 9, 8, 40, 219, 180, + 245, 115, 16, 226, 178, 120, 222, 203, 142, 236, 236, 40, 37, 111, 68, 5, + 229, 118, 20, 180, 117, 205, 54, 104, 200, 122, 67, 214, 191, 41, 178, 222, + 200, 242, 13, 27, 90, 159, 59, 1, 127, 6, 131, 191, 125, 188, 4, 138, + 33, 226, 144, 118, 215, 68, 156, 153, 9, 168, 146, 247, 228, 117, 226, 148, + 243, 187, 133, 239, 96, 244, 113, 215, 100, 35, 155, 246, 83, 146, 129, 108, + 21, 225, 94, 77, 105, 21, 94, 104, 237, 178, 188, 185, 12, 48, 44, 79, + 139, 109, 34, 142, 27, 158, 213, 240, 172, 134, 103, 53, 60, 107, 187, 84, + 167, 141, 236, 79, 130, 95, 157, 29, 29, 22, 184, 213, 114, 236, 152, 12, + 11, 154, 202, 120, 86, 28, 114, 127, 150, 233, 59, 3, 29, 49, 164, 80, + 139, 180, 150, 255, 244, 122, 250, 245, 116, 1, 159, 75, 208, 213, 172, 158, + 105, 111, 205, 250, 109, 248, 71, 195, 63, 190, 41, 254, 209, 208, 227, 79, + 69, 143, 203, 107, 231, 150, 21, 179, 149, 37, 203, 225, 157, 86, 42, 136, + 20, 220, 187, 98, 174, 88, 104, 111, 121, 158, 58, 138, 216, 34, 19, 238, + 7, 110, 36, 203, 234, 70, 109, 118, 30, 88, 108, 18, 48, 248, 93, 122, + 130, 231, 184, 136, 81, 21, 176, 69, 2, 11, 222, 157, 178, 85, 144, 96, + 102, 41, 103, 84, 207, 49, 6, 42, 198, 14, 160, 103, 136, 63, 252, 214, + 113, 61, 103, 228, 137, 146, 222, 136, 113, 165, 2, 89, 61, 184, 199, 138, + 48, 74, 95, 71, 89, 238, 189, 142, 61, 168, 46, 185, 145, 50, 42, 30, + 194, 72, 183, 78, 29, 207, 189, 214, 120, 21, 181, 47, 176, 217, 42, 109, + 45, 225, 88, 255, 108, 105, 80, 17, 5, 96, 56, 211, 13, 95, 31, 147, + 53, 108, 188, 240, 13, 23, 107, 184, 88, 163, 5, 53, 92, 119, 11, 181, + 160, 1, 149, 161, 168, 0, 158, 74, 153, 203, 185, 64, 144, 4, 182, 251, + 196, 73, 96, 89, 234, 30, 249, 40, 189, 106, 149, 180, 109, 152, 48, 106, + 235, 249, 162, 122, 129, 137, 60, 6, 89, 65, 94, 28, 234, 86, 178, 198, + 134, 214, 112, 143, 134, 123, 52, 220, 163, 225, 30, 91, 103, 67, 59, 191, + 118, 117, 126, 1, 231, 150, 126, 90, 130, 156, 85, 132, 52, 66, 141, 131, + 245, 132, 250, 137, 207, 204, 17, 114, 139, 144, 66, 116, 253, 113, 20, 167, + 30, 151, 188, 164, 220, 207, 129, 143, 33, 2, 167, 142, 159, 208, 44, 29, + 166, 176, 187, 74, 65, 57, 3, 25, 91, 150, 57, 170, 206, 61, 236, 105, + 40, 5, 5, 4, 57, 61, 165, 5, 230, 155, 98, 22, 168, 132, 39, 163, + 18, 70, 166, 67, 232, 178, 117, 20, 4, 225, 4, 136, 26, 172, 168, 55, + 226, 85, 255, 168, 42, 166, 244, 250, 46, 157, 69, 76, 92, 161, 27, 109, + 215, 250, 221, 90, 49, 31, 182, 152, 15, 140, 211, 75, 22, 18, 185, 88, + 76, 44, 144, 159, 226, 188, 160, 231, 79, 194, 16, 151, 150, 116, 57, 193, + 218, 76, 234, 117, 81, 212, 165, 219, 62, 168, 30, 253, 202, 50, 133, 204, + 40, 86, 150, 10, 47, 72, 33, 82, 140, 128, 187, 161, 80, 165, 95, 221, + 23, 95, 125, 204, 99, 199, 245, 34, 198, 253, 57, 46, 151, 5, 240, 132, + 226, 39, 63, 113, 220, 28, 38, 169, 128, 63, 91, 75, 25, 143, 157, 216, + 73, 11, 68, 13, 129, 6, 227, 162, 70, 240, 66, 34, 113, 233, 64, 226, + 98, 22, 163, 79, 167, 108, 247, 69, 232, 206, 16, 195, 248, 94, 225, 138, + 24, 26, 62, 193, 43, 249, 72, 35, 143, 17, 104, 199, 162, 158, 86, 189, + 121, 164, 161, 218, 159, 132, 106, 11, 184, 220, 35, 15, 241, 112, 17, 83, + 87, 64, 130, 51, 32, 217, 60, 200, 64, 115, 119, 50, 108, 220, 155, 155, + 155, 246, 42, 72, 226, 100, 196, 219, 227, 96, 209, 185, 65, 55, 194, 255, + 188, 125, 248, 244, 96, 249, 175, 233, 159, 173, 213, 232, 104, 124, 183, 149, + 253, 233, 25, 69, 119, 109, 156, 26, 213, 66, 126, 20, 38, 209, 252, 78, + 240, 106, 31, 8, 171, 118, 127, 93, 150, 227, 222, 96, 195, 52, 199, 126, + 33, 123, 177, 58, 205, 209, 40, 42, 214, 0, 171, 149, 104, 99, 18, 89, + 82, 9, 236, 35, 5, 230, 59, 102, 170, 56, 233, 21, 165, 141, 136, 154, + 214, 235, 107, 150, 158, 197, 86, 253, 221, 55, 44, 241, 12, 185, 16, 225, + 59, 70, 60, 22, 216, 141, 217, 174, 200, 185, 48, 195, 111, 93, 112, 42, + 87, 56, 119, 34, 54, 194, 55, 201, 171, 71, 140, 86, 236, 108, 30, 196, + 193, 17, 12, 212, 229, 135, 131, 219, 231, 207, 250, 224, 200, 214, 189, 245, + 20, 35, 136, 211, 104, 160, 216, 72, 127, 142, 223, 90, 234, 201, 166, 217, + 100, 53, 248, 62, 20, 169, 58, 104, 44, 217, 141, 45, 162, 177, 69, 52, + 182, 136, 70, 170, 253, 26, 109, 17, 175, 156, 183, 220, 227, 177, 150, 10, + 49, 119, 156, 208, 210, 79, 55, 169, 174, 172, 11, 112, 101, 188, 162, 95, + 106, 184, 134, 75, 118, 99, 155, 110, 248, 65, 195, 15, 26, 126, 208, 240, + 131, 154, 122, 14, 20, 83, 83, 195, 41, 222, 63, 162, 166, 150, 85, 252, + 178, 20, 86, 76, 3, 85, 41, 17, 205, 192, 37, 156, 48, 182, 204, 134, + 18, 134, 241, 138, 146, 220, 98, 126, 27, 239, 238, 216, 88, 182, 41, 187, + 242, 20, 117, 234, 184, 244, 82, 105, 201, 107, 181, 24, 85, 209, 60, 161, + 91, 39, 76, 251, 70, 193, 2, 188, 5, 156, 186, 54, 105, 49, 27, 126, + 98, 153, 246, 173, 224, 212, 120, 236, 223, 90, 249, 97, 89, 160, 45, 92, + 65, 117, 87, 6, 47, 165, 187, 246, 146, 217, 176, 200, 47, 89, 159, 254, + 29, 208, 191, 123, 244, 239, 1, 253, 123, 159, 254, 237, 137, 78, 61, 113, + 165, 39, 46, 217, 251, 249, 204, 80, 241, 139, 145, 19, 113, 197, 72, 34, + 12, 20, 196, 139, 4, 223, 216, 41, 140, 104, 185, 206, 110, 20, 101, 104, + 185, 139, 165, 71, 230, 227, 136, 2, 215, 34, 249, 37, 121, 168, 220, 132, + 71, 227, 208, 29, 193, 30, 117, 98, 246, 160, 180, 134, 130, 176, 32, 74, + 251, 96, 36, 6, 175, 29, 1, 229, 28, 243, 105, 16, 206, 56, 86, 208, + 50, 223, 47, 139, 237, 211, 94, 8, 142, 18, 81, 212, 1, 141, 144, 32, + 246, 184, 239, 240, 109, 100, 97, 135, 120, 14, 175, 64, 49, 120, 20, 232, + 55, 5, 242, 64, 21, 154, 34, 182, 203, 219, 179, 54, 115, 253, 9, 191, + 133, 23, 21, 221, 239, 181, 101, 221, 74, 96, 74, 104, 111, 247, 86, 248, + 108, 138, 222, 163, 48, 189, 48, 225, 233, 237, 105, 12, 224, 135, 196, 233, + 125, 225, 53, 123, 124, 116, 244, 76, 93, 178, 87, 147, 241, 216, 181, 243, + 117, 43, 207, 75, 22, 111, 246, 53, 240, 250, 110, 40, 220, 90, 192, 185, + 142, 146, 145, 59, 102, 71, 129, 255, 54, 240, 18, 81, 204, 69, 53, 216, + 225, 235, 172, 225, 188, 5, 185, 181, 221, 195, 208, 137, 92, 52, 125, 124, + 187, 12, 124, 88, 122, 89, 84, 197, 158, 114, 41, 198, 234, 120, 189, 229, + 237, 123, 149, 88, 84, 166, 228, 9, 116, 157, 241, 113, 48, 73, 163, 33, + 233, 255, 180, 145, 102, 121, 34, 89, 175, 58, 145, 236, 139, 109, 172, 27, + 247, 218, 93, 34, 212, 68, 27, 54, 211, 142, 48, 196, 71, 176, 211, 184, + 223, 214, 46, 117, 240, 172, 163, 204, 225, 21, 205, 225, 149, 50, 135, 87, + 218, 28, 22, 63, 77, 126, 216, 197, 92, 13, 150, 133, 207, 162, 24, 218, + 9, 188, 42, 238, 28, 238, 123, 78, 56, 83, 246, 229, 13, 149, 196, 116, + 222, 6, 238, 164, 212, 245, 102, 60, 29, 152, 150, 59, 5, 74, 25, 89, + 140, 182, 109, 20, 59, 110, 56, 70, 175, 82, 118, 101, 147, 209, 207, 129, + 221, 199, 32, 112, 132, 1, 122, 195, 38, 51, 254, 6, 4, 68, 30, 254, + 129, 33, 190, 200, 230, 146, 144, 191, 153, 3, 211, 195, 166, 145, 227, 161, + 60, 92, 243, 112, 249, 232, 116, 97, 230, 79, 150, 143, 162, 95, 96, 81, + 202, 233, 210, 39, 175, 127, 226, 43, 39, 196, 122, 161, 15, 24, 222, 1, + 148, 136, 223, 2, 121, 112, 113, 121, 56, 94, 187, 93, 85, 89, 29, 134, + 60, 164, 17, 205, 138, 171, 247, 143, 169, 62, 227, 53, 21, 33, 27, 209, + 81, 159, 160, 112, 211, 99, 197, 234, 253, 146, 71, 114, 218, 69, 130, 33, + 161, 132, 219, 53, 238, 76, 202, 30, 84, 194, 161, 60, 254, 86, 152, 211, + 211, 252, 145, 86, 79, 119, 29, 228, 121, 249, 61, 114, 84, 247, 21, 105, + 97, 150, 57, 82, 9, 31, 183, 191, 167, 154, 63, 189, 88, 117, 147, 220, + 87, 188, 176, 47, 126, 77, 127, 13, 9, 130, 114, 229, 8, 43, 77, 225, + 104, 16, 142, 191, 34, 16, 214, 19, 134, 203, 22, 169, 45, 217, 23, 194, + 39, 152, 78, 108, 181, 67, 107, 88, 210, 229, 55, 189, 11, 94, 166, 127, + 84, 39, 10, 31, 147, 111, 36, 211, 145, 170, 28, 248, 105, 199, 243, 185, + 11, 11, 194, 196, 188, 204, 7, 240, 23, 216, 14, 226, 87, 13, 95, 70, + 86, 57, 161, 164, 16, 238, 139, 36, 246, 208, 185, 170, 213, 194, 237, 210, + 255, 29, 108, 149, 28, 54, 168, 195, 22, 133, 53, 78, 31, 0, 228, 230, + 197, 232, 127, 129, 152, 225, 90, 31, 139, 150, 128, 26, 196, 146, 55, 154, + 74, 34, 57, 12, 47, 252, 25, 108, 127, 242, 229, 4, 183, 240, 239, 217, + 42, 116, 22, 46, 213, 50, 243, 60, 119, 25, 5, 116, 124, 17, 132, 9, + 106, 118, 79, 86, 161, 104, 120, 197, 221, 144, 116, 149, 100, 105, 136, 100, + 233, 0, 31, 116, 241, 255, 149, 242, 144, 165, 3, 140, 155, 165, 213, 211, + 150, 69, 95, 191, 104, 215, 93, 236, 87, 92, 188, 108, 169, 91, 109, 184, + 111, 108, 181, 215, 218, 229, 65, 207, 184, 252, 155, 118, 217, 54, 47, 87, + 239, 198, 59, 110, 171, 45, 217, 84, 25, 69, 77, 23, 197, 0, 148, 212, + 32, 198, 249, 126, 5, 108, 115, 138, 206, 42, 212, 168, 129, 61, 202, 63, + 45, 208, 106, 38, 164, 171, 62, 1, 121, 214, 73, 240, 232, 108, 30, 248, + 179, 157, 141, 54, 228, 22, 108, 181, 94, 7, 75, 140, 85, 84, 167, 135, + 173, 150, 81, 121, 220, 101, 60, 61, 17, 59, 76, 57, 45, 217, 93, 90, + 170, 70, 58, 127, 166, 211, 187, 44, 96, 105, 157, 9, 82, 232, 175, 178, + 36, 178, 61, 176, 14, 128, 43, 221, 207, 101, 67, 169, 196, 86, 94, 87, + 216, 146, 40, 227, 82, 181, 91, 236, 97, 237, 110, 49, 217, 214, 95, 125, + 179, 216, 91, 176, 89, 180, 76, 176, 195, 201, 4, 139, 4, 6, 75, 230, + 161, 207, 83, 100, 117, 77, 145, 1, 10, 158, 144, 74, 109, 219, 89, 55, + 189, 86, 175, 195, 141, 121, 11, 42, 106, 148, 110, 76, 60, 153, 112, 185, + 45, 211, 147, 146, 77, 121, 204, 151, 58, 192, 17, 238, 144, 42, 145, 112, + 216, 179, 205, 30, 21, 8, 218, 253, 187, 237, 216, 222, 154, 29, 219, 171, + 217, 177, 13, 127, 251, 182, 248, 219, 95, 104, 203, 82, 20, 163, 34, 180, + 146, 126, 172, 138, 172, 90, 195, 230, 2, 43, 232, 241, 92, 147, 88, 207, + 151, 24, 169, 183, 78, 92, 197, 120, 169, 145, 123, 189, 102, 8, 155, 189, + 219, 236, 221, 45, 221, 79, 112, 19, 134, 145, 225, 86, 242, 196, 161, 216, + 70, 217, 73, 201, 22, 50, 88, 220, 254, 222, 90, 14, 103, 107, 49, 244, + 167, 206, 45, 211, 172, 23, 123, 98, 229, 173, 25, 184, 207, 181, 139, 76, + 161, 244, 46, 34, 171, 121, 181, 217, 66, 13, 251, 251, 152, 219, 245, 165, + 227, 79, 130, 133, 228, 127, 100, 161, 12, 169, 69, 108, 218, 244, 184, 130, + 221, 165, 76, 238, 72, 100, 201, 28, 173, 60, 116, 231, 132, 69, 102, 167, + 136, 186, 20, 159, 240, 80, 90, 2, 49, 215, 191, 212, 54, 105, 64, 48, + 255, 214, 122, 137, 78, 94, 69, 111, 237, 106, 119, 126, 243, 187, 162, 255, + 17, 118, 197, 139, 165, 51, 198, 177, 87, 148, 250, 175, 102, 165, 62, 130, + 51, 50, 159, 195, 95, 75, 254, 173, 7, 241, 238, 217, 7, 5, 46, 162, + 205, 147, 102, 110, 56, 40, 153, 35, 197, 82, 174, 247, 128, 145, 14, 110, + 52, 35, 122, 254, 27, 154, 149, 113, 58, 237, 174, 181, 49, 126, 129, 176, + 183, 170, 4, 238, 35, 55, 28, 123, 156, 29, 134, 194, 122, 75, 103, 87, + 50, 126, 33, 63, 171, 144, 123, 5, 33, 161, 72, 175, 40, 114, 254, 55, + 72, 34, 118, 190, 116, 181, 156, 169, 116, 243, 103, 197, 153, 202, 178, 205, + 42, 182, 206, 105, 48, 73, 188, 64, 150, 109, 178, 85, 196, 42, 36, 246, + 173, 195, 10, 106, 47, 201, 27, 205, 74, 244, 158, 172, 32, 255, 160, 60, + 52, 158, 88, 67, 145, 224, 99, 253, 18, 12, 195, 81, 16, 188, 232, 51, + 21, 143, 135, 232, 82, 199, 226, 79, 129, 54, 192, 115, 153, 62, 30, 86, + 107, 168, 75, 60, 37, 125, 96, 204, 180, 94, 151, 173, 99, 55, 130, 165, + 163, 100, 116, 244, 180, 213, 250, 122, 93, 135, 203, 20, 220, 69, 228, 96, + 104, 96, 100, 175, 107, 174, 109, 193, 82, 31, 116, 108, 187, 50, 108, 231, + 241, 159, 137, 64, 250, 57, 243, 130, 24, 129, 219, 104, 98, 67, 119, 76, + 222, 120, 46, 175, 94, 45, 179, 118, 171, 188, 57, 27, 167, 221, 248, 30, + 133, 232, 252, 103, 7, 150, 33, 156, 252, 176, 203, 111, 151, 187, 227, 32, + 130, 227, 123, 45, 251, 7, 60, 26, 252, 16, 223, 107, 209, 101, 160, 115, + 247, 254, 61, 188, 151, 199, 44, 188, 206, 239, 23, 247, 220, 241, 126, 88, + 51, 173, 11, 141, 135, 25, 70, 93, 88, 48, 89, 135, 10, 187, 175, 33, + 133, 163, 172, 11, 59, 173, 111, 239, 239, 229, 180, 47, 245, 86, 213, 241, + 18, 96, 84, 57, 6, 93, 87, 95, 23, 231, 49, 80, 16, 221, 215, 53, + 32, 95, 87, 214, 227, 177, 63, 97, 134, 171, 70, 187, 158, 185, 153, 196, + 155, 220, 197, 213, 118, 204, 199, 65, 88, 154, 108, 180, 5, 203, 181, 223, + 193, 255, 85, 80, 102, 99, 185, 190, 126, 56, 221, 189, 188, 103, 44, 85, + 184, 98, 153, 13, 153, 124, 4, 221, 229, 242, 186, 252, 97, 252, 99, 175, + 75, 235, 233, 242, 199, 241, 143, 137, 178, 136, 46, 91, 167, 89, 242, 41, + 186, 141, 11, 162, 16, 116, 112, 110, 115, 67, 101, 225, 186, 177, 130, 240, + 178, 173, 179, 96, 25, 169, 156, 215, 217, 80, 162, 158, 233, 219, 84, 174, + 146, 231, 95, 99, 244, 48, 197, 110, 34, 110, 161, 200, 224, 114, 66, 69, + 172, 196, 88, 69, 126, 171, 221, 220, 205, 110, 62, 67, 191, 51, 222, 115, + 20, 6, 17, 130, 142, 245, 148, 99, 12, 228, 18, 124, 79, 182, 203, 99, + 108, 63, 135, 161, 12, 57, 53, 203, 67, 251, 206, 9, 192, 168, 71, 144, + 26, 241, 128, 161, 123, 248, 45, 38, 31, 33, 234, 24, 92, 186, 164, 118, + 215, 143, 98, 238, 76, 48, 31, 11, 218, 110, 101, 27, 197, 159, 56, 163, + 0, 88, 69, 58, 161, 20, 29, 225, 92, 115, 54, 198, 55, 129, 238, 216, + 229, 178, 181, 112, 253, 206, 2, 244, 223, 136, 199, 49, 172, 249, 168, 45, + 18, 156, 228, 111, 140, 233, 121, 32, 49, 98, 58, 23, 62, 0, 129, 206, + 146, 144, 146, 142, 198, 98, 46, 152, 159, 44, 70, 60, 212, 239, 75, 140, + 251, 28, 150, 248, 238, 52, 8, 23, 222, 138, 77, 220, 8, 72, 223, 40, + 193, 116, 48, 161, 32, 192, 103, 97, 60, 54, 188, 246, 27, 88, 16, 127, + 180, 49, 229, 46, 25, 115, 12, 6, 75, 3, 145, 224, 25, 35, 252, 34, + 120, 60, 28, 82, 152, 168, 28, 63, 206, 102, 161, 179, 156, 99, 124, 88, + 12, 19, 87, 30, 71, 242, 197, 183, 103, 173, 116, 154, 37, 121, 190, 57, + 10, 66, 31, 134, 236, 15, 225, 254, 198, 227, 171, 153, 188, 104, 21, 155, + 52, 154, 198, 122, 108, 247, 151, 101, 7, 99, 120, 153, 120, 204, 189, 92, + 142, 196, 255, 59, 48, 136, 32, 179, 233, 6, 10, 232, 45, 222, 129, 68, + 83, 145, 61, 197, 29, 125, 182, 43, 66, 130, 75, 127, 6, 111, 40, 185, + 105, 144, 221, 84, 250, 83, 226, 135, 214, 137, 185, 66, 2, 3, 174, 161, + 202, 140, 231, 50, 103, 51, 203, 13, 40, 198, 69, 126, 53, 19, 159, 68, + 88, 146, 26, 116, 131, 165, 40, 94, 55, 166, 6, 125, 246, 245, 166, 205, + 96, 44, 240, 129, 76, 2, 36, 5, 126, 133, 220, 41, 32, 151, 216, 163, + 149, 25, 38, 127, 236, 132, 215, 236, 204, 189, 5, 146, 139, 68, 51, 164, + 9, 204, 206, 129, 139, 255, 137, 89, 191, 226, 188, 218, 218, 102, 164, 31, + 155, 65, 130, 102, 208, 112, 22, 7, 142, 239, 94, 100, 181, 213, 166, 22, + 186, 33, 98, 55, 110, 60, 103, 116, 153, 1, 165, 9, 174, 161, 105, 225, + 172, 152, 135, 100, 18, 136, 135, 235, 195, 54, 194, 128, 57, 38, 7, 240, + 125, 73, 6, 252, 118, 54, 129, 107, 69, 251, 159, 137, 74, 34, 221, 149, + 202, 132, 168, 89, 162, 37, 231, 28, 173, 144, 119, 100, 66, 145, 6, 172, + 251, 98, 58, 5, 18, 93, 49, 98, 168, 82, 162, 192, 34, 239, 36, 213, + 85, 205, 58, 120, 6, 132, 58, 52, 244, 138, 174, 249, 16, 144, 136, 214, + 119, 74, 147, 28, 78, 73, 124, 85, 56, 237, 209, 156, 143, 86, 209, 156, + 191, 221, 33, 184, 147, 185, 19, 199, 132, 125, 241, 56, 25, 123, 238, 132, + 59, 74, 228, 161, 32, 11, 250, 19, 100, 116, 243, 211, 243, 95, 205, 61, + 76, 134, 9, 134, 137, 12, 56, 121, 39, 110, 24, 165, 2, 160, 177, 50, + 210, 101, 147, 206, 201, 67, 35, 136, 244, 28, 163, 136, 179, 9, 59, 140, + 30, 94, 137, 152, 248, 59, 79, 186, 120, 127, 50, 226, 185, 148, 132, 85, + 165, 205, 97, 191, 133, 179, 52, 145, 65, 16, 147, 229, 152, 76, 128, 104, + 101, 1, 182, 30, 102, 167, 234, 199, 164, 141, 44, 125, 78, 38, 16, 239, + 13, 135, 253, 92, 75, 235, 69, 113, 89, 244, 151, 66, 81, 109, 83, 38, + 46, 144, 247, 126, 88, 232, 97, 208, 242, 1, 236, 169, 66, 15, 141, 110, + 15, 205, 30, 130, 174, 43, 61, 246, 202, 122, 104, 191, 178, 95, 236, 97, + 112, 135, 3, 179, 71, 33, 20, 235, 126, 241, 77, 141, 103, 244, 186, 101, + 63, 163, 169, 9, 91, 192, 57, 250, 157, 46, 72, 244, 221, 117, 156, 99, + 26, 2, 223, 64, 22, 72, 108, 3, 229, 91, 141, 105, 104, 13, 37, 44, + 131, 52, 42, 12, 177, 36, 49, 87, 9, 180, 20, 89, 55, 72, 71, 8, + 69, 70, 85, 176, 202, 186, 75, 89, 158, 110, 217, 27, 96, 208, 169, 134, + 226, 154, 97, 134, 87, 17, 22, 73, 119, 210, 95, 214, 60, 37, 181, 52, + 159, 199, 64, 217, 241, 94, 36, 15, 48, 114, 52, 96, 120, 28, 2, 83, + 195, 8, 227, 244, 227, 211, 110, 99, 216, 177, 113, 232, 160, 80, 95, 66, + 248, 207, 131, 84, 193, 140, 50, 218, 116, 28, 248, 223, 131, 78, 10, 87, + 144, 9, 174, 4, 34, 68, 176, 16, 1, 195, 162, 73, 230, 6, 234, 141, + 34, 203, 80, 111, 211, 0, 38, 210, 46, 26, 146, 68, 250, 3, 102, 99, + 94, 103, 74, 81, 152, 40, 133, 170, 146, 228, 213, 102, 155, 233, 55, 245, + 62, 50, 157, 252, 196, 155, 99, 136, 98, 85, 119, 111, 221, 230, 16, 162, + 97, 182, 51, 156, 176, 176, 55, 156, 162, 56, 157, 109, 137, 122, 170, 42, + 55, 66, 61, 81, 60, 191, 1, 250, 175, 154, 15, 213, 236, 42, 197, 19, + 110, 134, 165, 157, 32, 211, 163, 23, 169, 96, 249, 212, 1, 94, 161, 114, + 67, 109, 40, 70, 119, 191, 41, 49, 26, 237, 153, 142, 247, 135, 240, 67, + 225, 161, 54, 223, 70, 211, 103, 158, 239, 15, 159, 82, 17, 15, 111, 6, + 195, 167, 84, 250, 27, 157, 249, 13, 119, 186, 176, 212, 255, 145, 123, 32, + 141, 153, 215, 154, 76, 143, 66, 158, 43, 161, 249, 123, 56, 159, 84, 200, + 92, 235, 84, 28, 33, 34, 62, 18, 201, 39, 186, 164, 146, 203, 219, 219, + 237, 79, 219, 235, 116, 15, 58, 221, 65, 249, 184, 11, 94, 148, 198, 105, + 164, 39, 150, 122, 146, 202, 26, 53, 202, 147, 23, 140, 64, 149, 184, 131, + 234, 132, 213, 77, 156, 107, 161, 59, 217, 133, 72, 71, 52, 26, 211, 230, + 16, 35, 122, 159, 230, 100, 88, 105, 94, 4, 5, 9, 212, 47, 77, 208, + 16, 139, 200, 68, 251, 219, 171, 158, 118, 225, 190, 83, 38, 62, 157, 242, + 204, 47, 171, 187, 161, 214, 16, 143, 234, 5, 183, 161, 106, 242, 12, 53, + 18, 135, 244, 94, 24, 168, 138, 241, 188, 84, 65, 28, 35, 131, 156, 104, + 175, 75, 44, 138, 237, 78, 248, 236, 158, 226, 28, 56, 232, 106, 208, 95, + 23, 115, 119, 124, 77, 8, 136, 187, 203, 219, 123, 244, 254, 123, 36, 4, + 230, 131, 226, 37, 97, 54, 34, 246, 250, 208, 210, 226, 119, 29, 38, 183, + 174, 231, 58, 225, 74, 126, 89, 213, 82, 57, 117, 125, 38, 52, 101, 101, + 33, 216, 166, 167, 16, 227, 125, 10, 189, 246, 76, 106, 139, 207, 18, 82, + 169, 186, 168, 4, 126, 180, 254, 172, 66, 47, 65, 186, 109, 227, 97, 98, + 52, 143, 97, 87, 8, 131, 172, 58, 174, 148, 48, 165, 142, 106, 22, 147, + 84, 113, 195, 192, 188, 33, 159, 6, 45, 72, 191, 5, 35, 62, 132, 73, + 83, 102, 21, 167, 163, 208, 169, 167, 247, 145, 196, 169, 248, 172, 174, 222, + 111, 11, 8, 213, 160, 206, 39, 157, 57, 95, 5, 161, 146, 39, 150, 122, + 82, 29, 72, 38, 93, 88, 7, 189, 251, 118, 253, 7, 95, 182, 180, 96, + 46, 29, 228, 239, 117, 221, 197, 223, 90, 70, 212, 202, 186, 68, 137, 203, + 214, 105, 226, 197, 46, 40, 83, 60, 157, 22, 202, 119, 80, 127, 175, 208, + 99, 95, 239, 241, 91, 177, 71, 87, 239, 81, 241, 211, 69, 35, 148, 242, + 171, 53, 23, 127, 171, 187, 88, 241, 91, 159, 42, 2, 174, 34, 111, 89, + 110, 30, 229, 166, 161, 193, 206, 43, 201, 246, 22, 236, 129, 94, 167, 87, + 205, 172, 79, 129, 171, 113, 111, 20, 6, 49, 107, 177, 127, 36, 64, 71, + 81, 107, 166, 29, 177, 200, 46, 89, 218, 89, 145, 121, 147, 139, 102, 183, + 165, 46, 145, 202, 166, 250, 22, 147, 182, 159, 132, 64, 99, 128, 103, 161, + 149, 172, 130, 172, 167, 93, 224, 181, 51, 165, 60, 255, 42, 16, 90, 233, + 171, 242, 254, 5, 124, 36, 140, 190, 220, 51, 88, 42, 108, 90, 224, 183, + 108, 151, 238, 205, 248, 91, 187, 223, 219, 183, 90, 182, 190, 127, 203, 250, + 117, 251, 122, 183, 187, 24, 15, 23, 206, 242, 46, 102, 226, 30, 82, 33, + 187, 59, 40, 205, 227, 21, 33, 45, 186, 189, 55, 19, 36, 132, 241, 6, + 191, 251, 110, 177, 21, 104, 98, 129, 101, 58, 115, 106, 156, 6, 191, 5, + 24, 25, 67, 42, 73, 17, 172, 5, 126, 55, 251, 79, 13, 134, 195, 123, + 52, 158, 66, 236, 73, 163, 21, 216, 229, 153, 255, 112, 148, 196, 113, 224, + 43, 10, 140, 248, 37, 179, 153, 186, 191, 72, 226, 194, 5, 140, 76, 241, + 156, 21, 83, 68, 157, 141, 204, 35, 159, 119, 227, 194, 174, 221, 3, 254, + 85, 190, 113, 127, 230, 192, 244, 53, 81, 219, 135, 22, 93, 222, 214, 91, + 84, 51, 14, 129, 113, 84, 102, 78, 191, 236, 86, 104, 161, 199, 240, 146, + 56, 92, 36, 112, 84, 221, 220, 211, 4, 157, 181, 102, 135, 66, 216, 230, + 176, 151, 111, 28, 80, 3, 110, 114, 121, 217, 210, 193, 205, 117, 178, 220, + 215, 241, 105, 170, 21, 221, 76, 229, 178, 135, 93, 133, 173, 9, 181, 172, + 16, 179, 84, 88, 131, 23, 160, 47, 130, 174, 28, 114, 127, 188, 218, 156, + 103, 125, 110, 189, 184, 223, 173, 212, 139, 127, 230, 55, 176, 25, 152, 164, + 155, 98, 229, 96, 203, 213, 84, 180, 88, 133, 150, 207, 65, 241, 151, 142, + 47, 224, 87, 30, 238, 252, 247, 227, 199, 195, 97, 183, 187, 83, 197, 0, + 160, 171, 66, 106, 30, 223, 194, 219, 69, 145, 142, 173, 47, 92, 166, 64, + 252, 127, 251, 247, 191, 109, 224, 108, 61, 113, 216, 207, 15, 135, 249, 225, + 30, 251, 145, 233, 23, 15, 160, 165, 55, 252, 225, 221, 191, 255, 61, 160, + 198, 220, 62, 186, 251, 46, 13, 118, 1, 230, 178, 11, 28, 3, 59, 225, + 157, 239, 240, 135, 224, 174, 157, 255, 187, 234, 101, 189, 191, 79, 187, 239, + 238, 244, 127, 120, 39, 94, 197, 254, 225, 221, 206, 61, 181, 143, 210, 105, + 239, 135, 119, 216, 67, 189, 14, 91, 110, 140, 70, 140, 83, 14, 43, 102, + 162, 58, 184, 249, 216, 33, 195, 177, 152, 79, 116, 144, 129, 192, 202, 209, + 119, 202, 67, 69, 235, 1, 93, 193, 96, 121, 136, 146, 5, 108, 67, 211, + 143, 75, 208, 153, 173, 222, 198, 12, 172, 98, 242, 178, 80, 227, 242, 153, + 163, 29, 167, 4, 34, 247, 200, 148, 45, 189, 221, 249, 180, 10, 11, 119, + 246, 13, 226, 148, 192, 233, 62, 43, 107, 44, 26, 201, 108, 130, 198, 35, + 207, 228, 115, 233, 159, 84, 128, 199, 158, 38, 156, 161, 102, 103, 106, 126, + 48, 56, 102, 47, 152, 34, 165, 215, 176, 216, 43, 51, 239, 27, 79, 180, + 107, 187, 106, 143, 29, 148, 252, 120, 241, 147, 250, 4, 37, 85, 252, 46, + 105, 250, 203, 111, 69, 31, 164, 68, 208, 43, 134, 84, 97, 72, 25, 214, + 148, 192, 197, 153, 214, 151, 80, 154, 9, 78, 45, 191, 0, 79, 253, 81, + 95, 82, 121, 161, 199, 170, 149, 117, 225, 46, 5, 108, 147, 92, 45, 60, + 91, 45, 145, 186, 214, 126, 247, 97, 59, 165, 177, 71, 17, 6, 31, 185, + 93, 203, 237, 145, 115, 40, 138, 241, 53, 210, 10, 141, 33, 7, 34, 131, + 13, 152, 146, 7, 44, 46, 92, 161, 237, 41, 142, 210, 96, 40, 151, 150, + 31, 159, 136, 98, 144, 252, 54, 141, 108, 210, 126, 129, 126, 192, 22, 97, + 86, 2, 230, 199, 207, 214, 165, 155, 195, 51, 135, 252, 207, 196, 13, 37, + 122, 206, 56, 64, 168, 187, 25, 71, 32, 154, 194, 195, 222, 169, 207, 210, + 127, 89, 68, 50, 136, 224, 40, 232, 249, 134, 209, 151, 177, 63, 240, 14, + 241, 160, 147, 196, 31, 139, 31, 132, 235, 75, 32, 50, 22, 155, 224, 31, + 122, 38, 85, 137, 28, 253, 52, 177, 243, 150, 144, 211, 207, 40, 67, 137, + 0, 89, 233, 91, 98, 1, 75, 52, 113, 99, 23, 201, 22, 202, 0, 178, + 100, 16, 30, 251, 239, 94, 26, 114, 234, 132, 179, 221, 214, 187, 123, 64, + 23, 187, 133, 78, 182, 236, 180, 235, 118, 129, 118, 186, 189, 123, 29, 187, + 180, 95, 95, 246, 235, 117, 127, 216, 117, 237, 127, 119, 219, 3, 237, 121, + 103, 65, 20, 155, 171, 177, 251, 254, 171, 49, 179, 133, 132, 217, 94, 202, + 247, 81, 73, 104, 226, 17, 162, 2, 33, 232, 124, 109, 175, 39, 206, 98, + 225, 212, 119, 65, 98, 80, 219, 33, 71, 233, 172, 239, 39, 191, 173, 216, + 83, 239, 166, 135, 183, 231, 219, 248, 18, 217, 224, 101, 175, 61, 196, 63, + 4, 71, 103, 139, 99, 66, 174, 235, 211, 241, 160, 18, 219, 72, 207, 112, + 194, 159, 72, 131, 102, 113, 37, 59, 75, 52, 45, 76, 24, 188, 216, 20, + 107, 131, 192, 110, 144, 76, 2, 154, 188, 149, 69, 21, 87, 225, 162, 20, + 57, 74, 195, 111, 132, 20, 1, 148, 204, 110, 125, 24, 131, 42, 234, 49, + 58, 135, 250, 88, 106, 76, 137, 229, 180, 218, 102, 250, 177, 148, 156, 151, + 28, 141, 152, 191, 194, 32, 110, 162, 255, 224, 152, 167, 222, 223, 87, 174, + 143, 89, 40, 21, 49, 52, 231, 201, 40, 74, 61, 246, 5, 210, 191, 102, + 213, 92, 14, 182, 202, 127, 116, 191, 211, 237, 117, 186, 247, 203, 229, 228, + 51, 207, 129, 22, 148, 143, 151, 116, 100, 101, 71, 170, 163, 22, 241, 139, + 181, 121, 206, 53, 148, 71, 60, 118, 42, 118, 158, 40, 44, 148, 101, 156, + 168, 137, 42, 232, 101, 64, 179, 159, 161, 143, 106, 106, 135, 113, 109, 19, + 143, 210, 22, 140, 118, 15, 75, 175, 84, 149, 15, 254, 87, 130, 5, 103, + 142, 130, 229, 138, 168, 46, 14, 251, 159, 216, 116, 53, 78, 155, 172, 98, + 147, 58, 62, 192, 32, 164, 20, 253, 251, 239, 246, 176, 199, 158, 124, 127, + 250, 236, 72, 137, 221, 72, 179, 6, 236, 125, 171, 215, 215, 128, 207, 74, + 44, 120, 170, 43, 78, 38, 3, 164, 153, 40, 138, 204, 28, 68, 174, 90, + 172, 4, 132, 167, 95, 150, 45, 9, 148, 11, 71, 41, 28, 174, 136, 112, + 77, 47, 200, 51, 113, 49, 255, 21, 97, 3, 21, 200, 135, 26, 236, 218, + 139, 16, 189, 146, 90, 85, 20, 16, 148, 91, 247, 187, 236, 152, 207, 218, + 240, 192, 236, 224, 199, 188, 237, 71, 32, 40, 226, 120, 155, 22, 64, 173, + 163, 254, 165, 227, 250, 163, 224, 70, 56, 105, 233, 208, 202, 15, 51, 233, + 22, 67, 139, 179, 113, 151, 38, 238, 66, 105, 49, 17, 137, 186, 166, 23, + 61, 234, 220, 11, 150, 89, 38, 222, 190, 24, 121, 243, 65, 245, 125, 176, + 84, 144, 110, 133, 104, 247, 148, 132, 62, 221, 145, 43, 94, 226, 254, 253, + 175, 102, 82, 100, 128, 101, 48, 34, 139, 112, 132, 103, 35, 56, 177, 212, + 147, 138, 215, 198, 155, 212, 130, 47, 15, 138, 156, 188, 96, 250, 81, 249, + 168, 146, 111, 41, 42, 172, 42, 102, 40, 41, 4, 229, 218, 44, 41, 54, + 233, 229, 95, 185, 23, 152, 222, 243, 187, 17, 66, 145, 72, 87, 255, 242, + 47, 211, 108, 149, 86, 207, 106, 245, 213, 4, 219, 85, 166, 67, 235, 237, + 239, 178, 23, 210, 219, 213, 116, 81, 253, 202, 248, 54, 23, 19, 212, 11, + 89, 212, 167, 36, 8, 7, 214, 206, 147, 208, 89, 69, 178, 136, 218, 57, + 170, 54, 14, 225, 126, 72, 229, 77, 102, 182, 60, 37, 131, 56, 112, 125, + 68, 222, 254, 7, 151, 9, 190, 179, 20, 82, 100, 155, 150, 165, 93, 231, + 181, 56, 79, 224, 103, 48, 101, 36, 241, 136, 65, 71, 202, 185, 101, 156, + 127, 81, 23, 94, 233, 227, 78, 51, 227, 131, 98, 126, 252, 185, 167, 172, + 14, 91, 187, 146, 2, 1, 14, 11, 87, 82, 20, 192, 3, 243, 202, 54, + 250, 205, 250, 53, 126, 51, 12, 210, 93, 143, 153, 184, 69, 126, 179, 243, + 213, 66, 100, 105, 50, 251, 88, 228, 22, 208, 58, 76, 91, 145, 58, 46, + 185, 77, 64, 7, 133, 198, 178, 72, 219, 100, 52, 113, 223, 146, 1, 46, + 37, 121, 218, 124, 150, 234, 32, 61, 77, 7, 81, 37, 154, 84, 69, 210, + 45, 243, 34, 100, 160, 35, 18, 40, 179, 71, 245, 55, 126, 84, 127, 173, + 117, 157, 208, 113, 101, 248, 111, 47, 255, 9, 155, 8, 120, 250, 104, 169, + 59, 13, 42, 238, 179, 211, 251, 246, 172, 129, 125, 135, 251, 250, 233, 125, + 182, 5, 255, 107, 109, 126, 227, 224, 125, 111, 28, 190, 239, 141, 123, 155, + 223, 88, 238, 50, 9, 157, 27, 84, 152, 79, 131, 137, 154, 59, 32, 37, + 85, 36, 251, 39, 174, 231, 169, 41, 3, 117, 208, 1, 105, 56, 135, 105, + 168, 220, 50, 172, 126, 12, 244, 235, 244, 42, 188, 97, 23, 33, 167, 13, + 24, 195, 95, 75, 254, 221, 40, 7, 170, 220, 52, 80, 22, 125, 70, 166, + 129, 114, 111, 231, 75, 62, 78, 200, 103, 196, 4, 220, 30, 169, 10, 148, + 163, 147, 239, 35, 137, 22, 144, 153, 152, 49, 61, 186, 24, 202, 117, 217, + 122, 137, 146, 141, 98, 28, 208, 194, 40, 106, 46, 174, 251, 180, 147, 147, + 110, 119, 56, 220, 73, 77, 51, 217, 215, 80, 144, 60, 140, 176, 242, 126, + 105, 144, 60, 60, 163, 75, 93, 224, 120, 129, 217, 161, 110, 156, 38, 101, + 58, 17, 187, 225, 158, 247, 254, 201, 81, 229, 227, 126, 17, 38, 254, 117, + 253, 88, 43, 17, 101, 138, 201, 220, 88, 174, 84, 147, 182, 188, 167, 9, + 239, 146, 135, 177, 181, 21, 131, 218, 125, 13, 133, 250, 131, 190, 41, 91, + 28, 245, 223, 117, 248, 118, 198, 30, 97, 173, 231, 121, 158, 9, 97, 11, + 132, 124, 53, 197, 125, 82, 232, 36, 64, 70, 246, 180, 7, 145, 110, 83, + 242, 101, 173, 65, 225, 219, 176, 187, 208, 115, 74, 250, 23, 187, 227, 27, + 148, 116, 236, 25, 184, 221, 226, 37, 40, 242, 77, 152, 194, 148, 57, 216, + 55, 195, 228, 240, 153, 85, 157, 205, 88, 57, 124, 176, 25, 205, 166, 62, + 219, 236, 143, 207, 174, 233, 111, 155, 253, 63, 104, 170, 133, 63, 5, 56, + 172, 36, 169, 107, 86, 50, 46, 118, 61, 100, 220, 6, 89, 84, 163, 205, + 162, 207, 38, 20, 250, 57, 119, 166, 6, 248, 193, 222, 193, 184, 63, 86, + 30, 70, 93, 54, 121, 150, 176, 39, 145, 193, 58, 91, 100, 3, 61, 162, + 37, 125, 76, 109, 167, 47, 207, 53, 200, 224, 212, 177, 43, 132, 184, 139, + 36, 28, 37, 30, 186, 94, 136, 119, 100, 103, 150, 118, 102, 40, 164, 106, + 30, 165, 230, 66, 125, 49, 142, 157, 183, 178, 180, 26, 161, 204, 229, 3, + 113, 236, 44, 150, 84, 255, 148, 135, 76, 116, 75, 55, 152, 30, 213, 151, + 86, 237, 28, 163, 235, 240, 86, 217, 227, 38, 212, 190, 202, 249, 119, 242, + 207, 64, 80, 172, 236, 132, 112, 6, 82, 255, 249, 207, 129, 27, 241, 244, + 60, 65, 231, 211, 145, 23, 36, 162, 104, 85, 12, 170, 98, 18, 161, 50, + 120, 198, 29, 118, 30, 168, 200, 230, 119, 173, 185, 26, 242, 17, 247, 225, + 25, 240, 39, 156, 125, 66, 195, 4, 22, 68, 56, 231, 127, 38, 248, 161, + 145, 94, 16, 33, 67, 176, 102, 111, 14, 17, 237, 38, 230, 19, 10, 253, + 119, 196, 137, 9, 106, 93, 210, 92, 6, 110, 141, 146, 64, 148, 2, 246, + 145, 205, 86, 51, 17, 46, 147, 24, 153, 98, 218, 173, 8, 196, 159, 118, + 112, 189, 236, 122, 225, 1, 39, 228, 187, 127, 120, 53, 165, 191, 197, 241, + 254, 221, 47, 139, 140, 103, 228, 187, 80, 235, 31, 127, 56, 14, 247, 7, + 66, 110, 127, 18, 172, 104, 109, 20, 178, 188, 156, 234, 113, 216, 24, 247, + 187, 255, 33, 184, 223, 223, 58, 136, 162, 54, 234, 50, 205, 233, 99, 141, + 121, 111, 48, 168, 27, 116, 237, 178, 62, 234, 253, 189, 66, 135, 111, 111, + 224, 191, 52, 243, 220, 28, 146, 188, 138, 210, 170, 40, 229, 133, 198, 175, + 155, 202, 22, 128, 213, 213, 64, 162, 143, 128, 171, 254, 177, 41, 240, 199, + 192, 62, 109, 40, 240, 95, 136, 2, 151, 144, 216, 226, 184, 55, 20, 120, + 123, 16, 230, 43, 136, 112, 1, 116, 190, 244, 194, 215, 77, 140, 63, 49, + 78, 254, 7, 130, 121, 111, 31, 45, 110, 112, 249, 191, 4, 53, 94, 59, + 234, 53, 212, 120, 208, 237, 213, 83, 99, 187, 112, 253, 219, 27, 249, 173, + 39, 199, 24, 132, 36, 124, 60, 99, 180, 174, 144, 85, 9, 154, 174, 150, + 89, 147, 32, 193, 133, 70, 51, 195, 66, 165, 189, 136, 152, 163, 73, 151, + 8, 234, 164, 132, 59, 25, 129, 78, 8, 232, 164, 92, 125, 137, 117, 32, + 255, 171, 6, 128, 173, 167, 197, 172, 105, 22, 196, 241, 193, 68, 181, 31, + 34, 206, 214, 44, 12, 18, 127, 82, 153, 238, 120, 217, 210, 16, 172, 109, + 221, 170, 240, 186, 246, 170, 184, 198, 214, 188, 224, 185, 8, 133, 194, 0, + 109, 141, 65, 221, 215, 221, 233, 91, 176, 88, 236, 186, 224, 66, 92, 44, + 200, 23, 133, 211, 202, 241, 69, 172, 146, 92, 29, 202, 121, 9, 16, 57, + 213, 108, 109, 25, 220, 185, 111, 128, 169, 210, 195, 179, 56, 131, 61, 21, + 150, 185, 242, 210, 101, 235, 101, 32, 3, 205, 196, 218, 81, 18, 95, 94, + 215, 92, 251, 205, 188, 214, 85, 140, 81, 1, 69, 58, 166, 225, 79, 2, + 7, 202, 214, 65, 121, 41, 218, 253, 163, 214, 85, 80, 107, 239, 250, 156, + 79, 34, 22, 223, 4, 162, 198, 2, 65, 142, 222, 4, 225, 53, 91, 134, + 1, 78, 245, 170, 77, 46, 48, 140, 107, 135, 121, 123, 230, 163, 84, 34, + 122, 146, 31, 44, 88, 166, 24, 163, 115, 199, 159, 192, 139, 46, 68, 122, + 52, 66, 146, 230, 93, 219, 165, 245, 122, 183, 96, 9, 34, 82, 88, 5, + 78, 245, 163, 239, 94, 177, 51, 238, 143, 93, 175, 66, 114, 92, 210, 197, + 209, 141, 85, 210, 86, 178, 46, 55, 145, 23, 235, 133, 197, 15, 151, 20, + 115, 196, 178, 74, 150, 44, 63, 153, 68, 198, 212, 205, 214, 215, 72, 204, + 33, 6, 55, 199, 201, 68, 175, 9, 161, 123, 137, 138, 66, 192, 93, 126, + 177, 187, 230, 23, 247, 222, 199, 45, 245, 69, 107, 40, 192, 90, 58, 143, + 235, 22, 83, 20, 151, 172, 166, 172, 241, 61, 213, 143, 45, 88, 78, 143, + 177, 2, 116, 161, 180, 185, 240, 50, 215, 48, 93, 163, 195, 221, 22, 212, + 251, 253, 166, 93, 248, 205, 237, 94, 83, 71, 48, 246, 65, 165, 109, 113, + 44, 174, 90, 197, 166, 45, 37, 77, 82, 137, 173, 158, 85, 225, 117, 253, + 87, 226, 0, 39, 124, 151, 199, 183, 34, 14, 172, 42, 253, 221, 89, 241, + 43, 90, 26, 135, 90, 140, 226, 57, 150, 47, 231, 190, 18, 118, 208, 237, + 26, 65, 206, 85, 11, 174, 167, 174, 39, 217, 201, 0, 203, 104, 235, 224, + 85, 226, 35, 17, 171, 73, 133, 146, 53, 84, 163, 59, 234, 88, 230, 7, + 246, 183, 254, 243, 182, 123, 227, 225, 151, 70, 85, 38, 125, 188, 102, 153, + 13, 95, 235, 150, 251, 153, 99, 246, 215, 91, 94, 129, 202, 119, 87, 94, + 176, 14, 249, 109, 35, 186, 125, 55, 86, 240, 94, 63, 217, 255, 202, 56, + 129, 88, 144, 136, 89, 224, 134, 20, 170, 49, 133, 191, 249, 82, 204, 207, + 74, 214, 33, 221, 91, 97, 81, 56, 140, 65, 254, 16, 21, 16, 178, 30, + 6, 218, 67, 5, 245, 84, 97, 40, 244, 177, 45, 0, 138, 149, 14, 110, + 158, 175, 174, 238, 19, 130, 173, 187, 175, 164, 135, 100, 107, 142, 122, 165, + 208, 118, 122, 10, 9, 93, 98, 231, 215, 238, 82, 60, 164, 187, 1, 14, + 70, 154, 202, 167, 21, 92, 59, 73, 60, 76, 11, 56, 9, 194, 27, 39, + 156, 176, 167, 65, 232, 190, 11, 252, 216, 81, 27, 127, 165, 66, 10, 212, + 132, 214, 128, 98, 199, 172, 85, 233, 121, 156, 128, 116, 59, 198, 106, 12, + 23, 193, 82, 59, 151, 41, 81, 121, 131, 72, 142, 210, 154, 210, 44, 170, + 188, 69, 251, 193, 188, 89, 249, 197, 163, 57, 31, 95, 243, 144, 44, 168, + 217, 49, 123, 230, 19, 34, 238, 78, 97, 24, 176, 244, 71, 92, 76, 240, + 236, 230, 255, 209, 158, 202, 51, 131, 183, 96, 195, 244, 48, 28, 182, 91, + 17, 14, 251, 220, 121, 235, 192, 63, 139, 165, 40, 149, 249, 214, 241, 224, + 88, 136, 222, 249, 89, 201, 102, 201, 151, 229, 63, 249, 74, 51, 49, 244, + 129, 130, 15, 203, 58, 22, 173, 17, 125, 147, 218, 139, 61, 196, 158, 7, + 1, 6, 65, 21, 200, 125, 233, 96, 42, 30, 212, 76, 122, 213, 147, 128, + 20, 211, 170, 93, 41, 249, 94, 165, 155, 182, 171, 243, 233, 60, 155, 50, + 102, 138, 89, 107, 251, 48, 128, 234, 167, 57, 171, 30, 86, 206, 172, 53, + 76, 187, 66, 227, 246, 185, 124, 234, 70, 123, 35, 89, 119, 131, 4, 159, + 79, 3, 199, 247, 121, 144, 247, 62, 17, 200, 222, 167, 203, 11, 250, 132, + 208, 121, 27, 40, 6, 205, 106, 248, 203, 172, 134, 47, 159, 16, 118, 26, + 184, 225, 119, 220, 25, 39, 49, 255, 27, 19, 212, 24, 99, 254, 17, 57, + 17, 174, 80, 72, 49, 29, 40, 84, 247, 71, 246, 128, 253, 144, 139, 122, + 161, 187, 228, 172, 60, 219, 91, 147, 120, 50, 57, 39, 27, 6, 97, 180, + 214, 16, 2, 178, 210, 41, 124, 233, 57, 99, 206, 94, 33, 90, 204, 171, + 185, 27, 163, 167, 249, 37, 23, 117, 14, 146, 49, 234, 96, 193, 66, 0, + 63, 32, 31, 17, 148, 93, 73, 75, 79, 73, 118, 8, 223, 35, 31, 250, + 31, 219, 218, 57, 71, 153, 19, 8, 61, 253, 50, 60, 241, 112, 192, 58, + 108, 127, 200, 206, 206, 158, 165, 103, 192, 58, 240, 148, 237, 226, 175, 45, + 22, 232, 3, 159, 220, 203, 46, 14, 187, 106, 223, 190, 232, 155, 195, 200, + 96, 137, 161, 150, 172, 244, 85, 144, 149, 13, 182, 243, 220, 241, 39, 209, + 184, 164, 28, 208, 169, 19, 206, 116, 184, 164, 13, 212, 158, 179, 16, 51, + 180, 132, 80, 45, 126, 57, 82, 38, 226, 216, 141, 208, 91, 65, 17, 4, + 203, 84, 124, 197, 67, 61, 215, 159, 105, 185, 254, 204, 200, 245, 39, 44, + 234, 244, 115, 210, 31, 81, 94, 115, 184, 177, 118, 246, 159, 181, 41, 9, + 207, 228, 60, 75, 100, 164, 44, 29, 225, 119, 255, 119, 95, 115, 147, 8, + 24, 150, 136, 214, 49, 207, 23, 112, 100, 225, 52, 131, 130, 115, 227, 163, + 2, 246, 119, 135, 129, 190, 51, 125, 184, 51, 143, 227, 101, 244, 160, 211, + 185, 185, 185, 105, 175, 130, 36, 78, 70, 188, 13, 211, 220, 185, 113, 226, + 241, 252, 127, 222, 62, 156, 14, 151, 222, 241, 232, 234, 31, 47, 255, 28, + 236, 252, 20, 227, 239, 192, 126, 228, 193, 223, 59, 14, 161, 19, 93, 200, + 140, 34, 42, 69, 151, 254, 22, 195, 4, 72, 24, 221, 7, 244, 114, 223, + 141, 64, 31, 249, 27, 123, 196, 167, 1, 188, 80, 152, 248, 126, 6, 63, + 68, 111, 108, 49, 238, 71, 9, 129, 22, 57, 32, 116, 120, 30, 163, 64, + 138, 136, 128, 140, 28, 207, 157, 97, 121, 28, 196, 246, 153, 99, 205, 10, + 188, 47, 194, 225, 142, 8, 8, 28, 219, 151, 84, 130, 14, 166, 115, 69, + 88, 74, 1, 138, 46, 136, 230, 113, 239, 191, 242, 95, 127, 153, 248, 202, + 79, 182, 217, 179, 24, 49, 108, 194, 124, 69, 163, 99, 232, 154, 243, 165, + 129, 246, 36, 95, 229, 59, 47, 254, 219, 195, 189, 118, 254, 60, 177, 186, + 196, 19, 177, 88, 145, 40, 251, 189, 187, 64, 4, 168, 137, 188, 235, 30, + 14, 180, 195, 96, 99, 140, 60, 199, 191, 6, 6, 183, 196, 175, 133, 143, + 148, 219, 164, 244, 121, 17, 238, 233, 73, 246, 64, 39, 186, 206, 159, 19, + 43, 210, 110, 52, 231, 60, 174, 120, 218, 113, 232, 136, 17, 86, 111, 16, + 79, 12, 222, 114, 1, 148, 5, 143, 163, 23, 18, 85, 84, 112, 205, 24, + 147, 200, 167, 83, 62, 142, 219, 44, 223, 204, 95, 158, 116, 139, 52, 144, + 110, 21, 242, 68, 48, 113, 61, 183, 82, 138, 14, 229, 101, 171, 164, 109, + 219, 100, 104, 89, 62, 75, 207, 11, 197, 66, 109, 84, 57, 157, 66, 49, + 84, 112, 192, 187, 26, 184, 138, 158, 49, 157, 84, 153, 28, 190, 87, 82, + 140, 44, 92, 170, 166, 218, 52, 247, 72, 249, 194, 156, 3, 230, 169, 208, + 138, 65, 163, 40, 186, 28, 188, 175, 241, 108, 235, 62, 167, 119, 80, 252, + 160, 47, 189, 119, 214, 0, 132, 4, 211, 152, 33, 74, 107, 197, 230, 153, + 121, 129, 230, 241, 195, 243, 109, 219, 52, 31, 186, 11, 112, 206, 14, 62, + 210, 18, 236, 27, 207, 218, 242, 217, 151, 21, 255, 46, 178, 136, 21, 66, + 65, 16, 173, 74, 28, 139, 85, 218, 90, 178, 14, 114, 89, 239, 112, 130, + 220, 213, 88, 23, 6, 92, 167, 168, 108, 88, 3, 112, 151, 191, 151, 44, + 24, 41, 137, 226, 126, 46, 168, 33, 119, 75, 197, 57, 121, 44, 49, 37, + 79, 4, 126, 200, 78, 149, 248, 13, 178, 171, 63, 195, 200, 53, 148, 168, + 169, 122, 208, 14, 133, 158, 194, 24, 169, 85, 219, 213, 103, 41, 101, 184, + 111, 127, 88, 117, 118, 123, 123, 63, 246, 237, 31, 14, 239, 41, 133, 146, + 15, 91, 4, 109, 90, 170, 154, 109, 108, 203, 5, 162, 175, 124, 250, 169, + 131, 86, 215, 11, 119, 129, 54, 80, 12, 250, 197, 72, 88, 153, 59, 199, + 46, 7, 218, 217, 158, 118, 118, 80, 180, 149, 226, 99, 42, 34, 249, 114, + 96, 190, 45, 90, 191, 195, 14, 44, 225, 42, 165, 141, 178, 8, 93, 15, + 100, 63, 30, 199, 90, 30, 33, 92, 56, 117, 163, 177, 210, 114, 148, 44, + 221, 137, 168, 190, 10, 7, 86, 122, 96, 70, 238, 25, 133, 102, 246, 77, + 119, 192, 70, 213, 129, 42, 181, 224, 15, 141, 146, 250, 244, 136, 229, 189, + 202, 120, 163, 39, 220, 9, 113, 252, 102, 240, 215, 146, 127, 239, 58, 122, + 57, 125, 184, 0, 49, 86, 34, 45, 96, 114, 141, 18, 110, 157, 231, 127, + 214, 32, 4, 200, 28, 246, 74, 202, 33, 170, 162, 138, 148, 95, 13, 69, + 183, 153, 78, 249, 46, 79, 97, 250, 8, 166, 111, 142, 7, 86, 122, 208, + 236, 135, 77, 7, 240, 220, 229, 225, 210, 245, 163, 107, 132, 47, 113, 29, + 92, 144, 196, 61, 179, 102, 75, 59, 211, 112, 172, 36, 164, 68, 154, 108, + 174, 141, 24, 134, 7, 95, 138, 42, 78, 169, 65, 193, 92, 181, 216, 229, + 181, 214, 197, 236, 129, 81, 196, 151, 107, 123, 232, 207, 40, 2, 9, 96, + 233, 216, 203, 13, 250, 172, 123, 78, 201, 34, 200, 133, 187, 237, 46, 149, + 182, 54, 139, 253, 103, 196, 244, 229, 10, 163, 121, 228, 132, 126, 228, 241, + 21, 59, 225, 33, 201, 83, 35, 217, 112, 53, 133, 6, 203, 108, 40, 145, + 162, 52, 183, 238, 97, 180, 244, 184, 239, 38, 11, 16, 169, 96, 149, 197, + 201, 162, 245, 179, 59, 11, 19, 244, 178, 94, 204, 185, 183, 90, 130, 92, + 234, 78, 156, 49, 119, 20, 215, 168, 132, 230, 43, 192, 68, 20, 160, 83, + 242, 144, 130, 2, 144, 109, 17, 106, 162, 64, 62, 245, 170, 138, 206, 200, + 214, 208, 47, 64, 6, 68, 161, 222, 193, 146, 5, 66, 58, 219, 204, 121, + 152, 206, 112, 153, 125, 11, 141, 21, 217, 8, 227, 248, 165, 104, 214, 22, + 155, 240, 104, 28, 186, 35, 144, 146, 48, 75, 232, 129, 170, 38, 123, 174, + 127, 189, 155, 25, 189, 184, 223, 190, 113, 175, 221, 37, 135, 1, 109, 7, + 225, 172, 131, 103, 157, 71, 234, 172, 108, 85, 24, 240, 30, 26, 174, 171, + 170, 5, 159, 251, 193, 205, 212, 115, 174, 5, 241, 73, 79, 44, 245, 164, + 154, 244, 16, 76, 254, 70, 91, 177, 110, 11, 111, 193, 16, 173, 221, 166, + 47, 96, 225, 132, 170, 132, 136, 198, 50, 144, 49, 8, 42, 18, 135, 110, + 66, 231, 99, 60, 181, 244, 211, 234, 225, 51, 67, 50, 215, 32, 67, 127, + 197, 227, 75, 72, 203, 118, 69, 50, 196, 21, 14, 48, 226, 222, 7, 73, + 164, 73, 220, 164, 59, 29, 5, 19, 206, 222, 136, 88, 174, 63, 132, 0, + 142, 237, 87, 99, 104, 183, 244, 211, 18, 90, 136, 119, 139, 180, 4, 80, + 138, 66, 190, 228, 78, 204, 254, 223, 127, 49, 239, 205, 255, 251, 233, 15, + 178, 51, 179, 56, 184, 10, 103, 35, 60, 250, 113, 130, 198, 230, 5, 179, + 187, 120, 54, 2, 178, 57, 17, 113, 69, 172, 143, 93, 225, 212, 99, 147, + 192, 231, 120, 242, 251, 186, 45, 46, 193, 235, 119, 163, 123, 169, 223, 132, + 48, 178, 217, 238, 161, 231, 5, 55, 17, 35, 247, 94, 139, 168, 90, 68, + 126, 17, 138, 190, 121, 249, 228, 209, 33, 123, 3, 199, 127, 136, 19, 253, + 248, 37, 159, 100, 199, 84, 85, 58, 59, 195, 90, 209, 127, 40, 247, 47, + 231, 206, 31, 90, 245, 214, 236, 65, 106, 147, 124, 158, 218, 148, 61, 86, + 109, 76, 159, 254, 250, 104, 116, 20, 178, 55, 89, 157, 106, 165, 13, 187, + 180, 140, 218, 212, 145, 113, 93, 189, 166, 92, 50, 238, 82, 174, 200, 202, + 217, 250, 181, 231, 206, 8, 139, 55, 203, 172, 178, 172, 197, 25, 181, 204, + 159, 22, 237, 173, 178, 251, 71, 133, 214, 241, 156, 189, 25, 207, 139, 207, + 160, 246, 210, 222, 115, 179, 245, 233, 249, 175, 236, 205, 211, 36, 63, 206, + 241, 250, 179, 38, 210, 238, 197, 217, 51, 246, 6, 163, 103, 136, 209, 138, + 150, 231, 198, 135, 29, 157, 190, 254, 39, 123, 115, 180, 114, 252, 252, 236, + 20, 20, 120, 63, 118, 242, 134, 215, 28, 23, 84, 126, 254, 79, 78, 79, + 123, 253, 236, 95, 52, 83, 78, 118, 66, 111, 235, 192, 131, 51, 99, 3, + 189, 12, 59, 28, 171, 238, 198, 20, 201, 253, 136, 28, 123, 74, 97, 132, + 76, 52, 144, 224, 241, 199, 124, 148, 204, 216, 51, 127, 26, 40, 216, 241, + 102, 8, 141, 232, 116, 18, 248, 177, 128, 157, 204, 241, 96, 46, 92, 127, + 133, 198, 6, 36, 5, 217, 15, 209, 244, 132, 179, 117, 80, 180, 37, 54, + 143, 255, 80, 252, 90, 229, 238, 250, 246, 163, 218, 254, 207, 28, 156, 79, + 18, 213, 150, 166, 89, 177, 66, 158, 213, 216, 241, 25, 191, 229, 232, 0, + 103, 142, 191, 98, 88, 124, 0, 235, 158, 40, 14, 72, 150, 144, 12, 22, + 7, 193, 132, 141, 86, 34, 229, 106, 244, 19, 229, 47, 210, 227, 60, 80, + 130, 18, 76, 104, 119, 49, 168, 12, 104, 57, 249, 220, 158, 194, 103, 90, + 108, 21, 36, 244, 19, 112, 19, 252, 131, 12, 38, 10, 22, 84, 20, 5, + 43, 19, 70, 108, 36, 252, 132, 227, 16, 8, 60, 26, 5, 161, 127, 200, + 208, 107, 73, 143, 103, 130, 73, 228, 221, 201, 1, 232, 37, 179, 150, 235, + 179, 5, 247, 19, 6, 123, 42, 116, 121, 212, 38, 158, 112, 230, 113, 68, + 16, 244, 130, 224, 26, 61, 101, 248, 162, 147, 96, 156, 44, 82, 75, 62, + 35, 215, 33, 217, 200, 110, 248, 136, 45, 241, 157, 75, 32, 162, 77, 185, + 113, 182, 112, 199, 109, 158, 116, 178, 187, 219, 209, 60, 94, 120, 69, 127, + 140, 28, 108, 244, 177, 193, 155, 128, 140, 186, 192, 111, 115, 70, 228, 163, + 124, 235, 184, 94, 90, 32, 38, 31, 187, 244, 203, 182, 52, 19, 109, 15, + 29, 112, 85, 34, 168, 198, 232, 159, 99, 198, 224, 166, 124, 190, 219, 240, + 249, 134, 207, 55, 124, 190, 225, 243, 13, 159, 111, 248, 124, 195, 231, 183, + 156, 207, 63, 190, 93, 6, 97, 140, 172, 166, 53, 220, 27, 146, 179, 30, + 249, 124, 64, 238, 249, 43, 104, 178, 174, 124, 32, 74, 87, 89, 84, 0, + 116, 240, 49, 241, 229, 10, 214, 30, 135, 110, 187, 59, 240, 15, 244, 107, + 3, 35, 87, 227, 124, 105, 103, 48, 116, 182, 59, 162, 24, 139, 25, 1, + 176, 46, 150, 184, 28, 58, 32, 66, 60, 87, 177, 194, 34, 238, 241, 49, + 214, 255, 19, 225, 80, 100, 149, 12, 157, 155, 236, 91, 240, 5, 219, 236, + 159, 24, 9, 134, 43, 205, 133, 101, 71, 113, 105, 184, 156, 69, 0, 26, + 134, 75, 45, 56, 185, 175, 168, 160, 32, 33, 55, 77, 220, 5, 242, 5, + 88, 105, 238, 148, 250, 222, 56, 24, 207, 133, 125, 189, 192, 153, 40, 61, + 241, 7, 152, 51, 133, 215, 66, 2, 165, 34, 122, 124, 249, 89, 199, 240, + 170, 97, 101, 101, 167, 39, 34, 20, 14, 248, 200, 34, 32, 188, 11, 220, + 30, 87, 19, 60, 179, 180, 179, 130, 235, 136, 198, 92, 101, 89, 88, 204, + 19, 201, 180, 135, 181, 101, 30, 79, 92, 248, 100, 138, 178, 76, 252, 49, + 210, 130, 71, 240, 187, 136, 170, 116, 20, 192, 42, 24, 199, 173, 19, 152, + 57, 36, 255, 24, 209, 248, 152, 194, 210, 228, 25, 226, 63, 68, 116, 28, + 205, 91, 143, 87, 234, 85, 184, 197, 133, 41, 58, 161, 21, 0, 15, 69, + 126, 237, 248, 129, 11, 212, 255, 134, 162, 3, 158, 186, 64, 97, 102, 161, + 179, 160, 192, 128, 100, 54, 23, 209, 15, 40, 80, 66, 203, 63, 156, 155, + 17, 144, 38, 17, 111, 245, 171, 27, 198, 137, 227, 177, 44, 66, 85, 152, + 220, 105, 68, 144, 102, 62, 119, 167, 60, 13, 203, 202, 95, 65, 41, 201, + 14, 27, 198, 3, 138, 128, 207, 234, 31, 99, 9, 88, 103, 36, 63, 241, + 20, 145, 114, 110, 96, 185, 209, 69, 56, 131, 85, 130, 153, 142, 241, 28, + 131, 16, 156, 49, 208, 8, 58, 112, 169, 68, 172, 136, 74, 200, 127, 2, + 133, 61, 53, 209, 88, 60, 255, 37, 159, 202, 1, 151, 231, 201, 8, 87, + 171, 64, 23, 67, 22, 158, 86, 252, 193, 99, 172, 255, 198, 243, 57, 128, + 238, 24, 57, 51, 117, 185, 135, 108, 235, 2, 11, 94, 96, 191, 11, 119, + 220, 186, 112, 224, 191, 128, 139, 94, 175, 112, 79, 237, 228, 192, 196, 175, + 230, 110, 232, 221, 109, 49, 87, 238, 87, 68, 244, 8, 34, 12, 1, 165, + 136, 213, 49, 210, 118, 24, 102, 98, 32, 196, 106, 224, 39, 49, 219, 83, + 172, 61, 138, 25, 189, 9, 93, 76, 2, 196, 13, 45, 24, 8, 186, 0, + 150, 113, 84, 138, 108, 175, 133, 220, 190, 64, 106, 13, 59, 65, 62, 44, + 229, 91, 73, 36, 130, 77, 175, 249, 106, 20, 160, 40, 1, 111, 18, 198, + 192, 45, 145, 140, 31, 93, 188, 124, 254, 227, 113, 138, 169, 63, 9, 18, + 36, 239, 216, 251, 134, 42, 238, 41, 193, 169, 105, 231, 163, 180, 243, 44, + 96, 35, 144, 78, 240, 16, 111, 0, 33, 98, 70, 229, 19, 241, 150, 123, + 109, 118, 232, 69, 129, 197, 166, 156, 99, 24, 44, 39, 114, 147, 190, 201, + 2, 203, 2, 51, 81, 2, 80, 132, 243, 66, 235, 138, 194, 100, 131, 41, + 126, 59, 85, 249, 132, 27, 100, 205, 28, 224, 153, 204, 161, 101, 80, 86, + 224, 243, 203, 83, 155, 222, 128, 66, 58, 42, 108, 201, 217, 246, 100, 135, + 48, 60, 171, 200, 141, 30, 8, 166, 66, 70, 121, 33, 210, 94, 205, 211, + 78, 165, 161, 71, 71, 30, 8, 17, 92, 22, 17, 182, 135, 123, 20, 142, + 102, 175, 169, 201, 81, 80, 3, 119, 27, 77, 175, 209, 244, 62, 151, 166, + 7, 203, 228, 181, 178, 178, 94, 43, 43, 11, 143, 243, 7, 210, 169, 152, + 252, 45, 18, 32, 64, 108, 180, 171, 11, 214, 63, 91, 144, 216, 120, 236, + 196, 84, 236, 203, 165, 83, 1, 95, 105, 193, 117, 216, 222, 5, 248, 180, + 84, 112, 68, 169, 201, 85, 10, 159, 102, 106, 110, 49, 88, 68, 16, 247, + 223, 253, 141, 20, 32, 241, 14, 164, 255, 72, 65, 14, 94, 14, 139, 72, + 223, 69, 225, 193, 100, 2, 127, 236, 37, 19, 224, 88, 252, 54, 0, 245, + 15, 107, 45, 47, 156, 56, 66, 34, 45, 240, 244, 177, 220, 10, 170, 69, + 71, 207, 22, 51, 11, 116, 192, 80, 124, 54, 59, 252, 245, 89, 231, 244, + 236, 241, 19, 182, 43, 171, 73, 71, 236, 228, 132, 26, 80, 17, 115, 176, + 250, 207, 61, 139, 181, 219, 109, 2, 177, 218, 74, 50, 94, 235, 114, 149, + 115, 110, 170, 10, 132, 185, 133, 154, 194, 218, 153, 22, 152, 157, 2, 143, + 236, 160, 171, 32, 146, 73, 180, 78, 113, 101, 79, 189, 82, 162, 71, 108, + 93, 66, 112, 189, 168, 13, 196, 199, 9, 35, 87, 108, 19, 121, 108, 41, + 199, 230, 62, 169, 19, 172, 210, 103, 81, 209, 102, 208, 157, 225, 171, 38, + 196, 29, 195, 96, 60, 231, 113, 231, 159, 62, 72, 78, 40, 117, 83, 33, + 114, 71, 73, 126, 65, 39, 116, 18, 130, 168, 1, 154, 208, 205, 220, 29, + 227, 85, 57, 110, 32, 135, 160, 212, 5, 157, 86, 168, 238, 186, 74, 137, + 113, 238, 96, 71, 216, 66, 249, 35, 218, 250, 190, 67, 149, 159, 132, 187, + 167, 23, 167, 207, 25, 206, 21, 42, 78, 208, 219, 97, 192, 203, 151, 115, + 54, 158, 59, 176, 102, 196, 79, 194, 125, 81, 224, 113, 111, 149, 255, 2, + 165, 33, 45, 147, 16, 101, 196, 77, 181, 103, 25, 58, 126, 12, 59, 12, + 171, 42, 172, 178, 232, 241, 255, 159, 186, 55, 95, 111, 219, 74, 30, 68, + 255, 215, 83, 32, 140, 211, 34, 37, 112, 147, 108, 39, 150, 67, 247, 40, + 118, 146, 246, 116, 188, 76, 236, 78, 39, 45, 41, 108, 16, 4, 41, 196, + 36, 192, 6, 64, 73, 180, 162, 121, 157, 249, 230, 53, 230, 190, 216, 173, + 237, 172, 0, 37, 37, 157, 158, 251, 187, 201, 103, 145, 4, 206, 126, 234, + 212, 169, 189, 90, 53, 39, 57, 26, 21, 194, 227, 104, 204, 192, 165, 86, + 189, 231, 51, 255, 77, 57, 1, 163, 171, 116, 185, 94, 74, 64, 95, 157, + 172, 22, 35, 135, 123, 212, 135, 42, 105, 185, 224, 83, 29, 9, 97, 50, + 22, 147, 200, 3, 59, 178, 159, 49, 106, 71, 41, 145, 109, 37, 252, 251, + 189, 216, 208, 157, 31, 89, 18, 0, 11, 227, 109, 8, 52, 44, 224, 63, + 248, 32, 46, 108, 177, 94, 102, 248, 155, 191, 221, 177, 2, 104, 236, 243, + 156, 220, 170, 170, 224, 24, 193, 0, 160, 135, 150, 244, 45, 204, 174, 102, + 247, 163, 132, 95, 111, 11, 160, 227, 188, 28, 79, 255, 21, 179, 151, 193, + 153, 125, 178, 213, 143, 255, 29, 166, 211, 78, 120, 31, 249, 134, 131, 47, + 99, 74, 178, 77, 154, 15, 251, 183, 127, 132, 201, 3, 83, 203, 70, 57, + 139, 23, 106, 25, 86, 80, 182, 36, 145, 38, 92, 253, 64, 248, 211, 215, + 98, 2, 171, 64, 59, 26, 81, 248, 97, 220, 89, 41, 6, 236, 1, 144, + 255, 11, 20, 213, 62, 7, 124, 10, 180, 49, 113, 144, 207, 201, 188, 253, + 57, 69, 38, 126, 142, 238, 48, 248, 185, 72, 103, 51, 222, 224, 188, 152, + 173, 73, 142, 137, 75, 134, 159, 249, 156, 164, 154, 84, 238, 235, 104, 78, + 174, 146, 95, 47, 18, 32, 94, 137, 17, 253, 26, 224, 16, 57, 212, 111, + 22, 194, 77, 127, 83, 172, 83, 26, 202, 183, 75, 104, 124, 19, 180, 95, + 36, 201, 69, 68, 142, 162, 234, 201, 171, 232, 252, 34, 205, 172, 39, 127, + 10, 254, 158, 46, 38, 84, 29, 201, 73, 74, 123, 243, 237, 122, 185, 220, + 48, 71, 78, 121, 110, 94, 2, 13, 54, 37, 230, 218, 226, 189, 49, 1, + 18, 125, 100, 17, 127, 228, 68, 21, 19, 191, 139, 92, 119, 145, 18, 197, + 254, 42, 207, 34, 140, 173, 16, 241, 119, 224, 228, 136, 149, 46, 10, 142, + 217, 204, 225, 252, 248, 219, 10, 224, 131, 190, 193, 101, 85, 68, 105, 53, + 176, 190, 15, 173, 239, 7, 214, 247, 67, 235, 251, 67, 235, 251, 35, 235, + 251, 99, 235, 251, 231, 214, 247, 47, 172, 239, 79, 144, 156, 203, 167, 211, + 13, 125, 230, 200, 178, 208, 55, 154, 255, 187, 127, 173, 35, 138, 116, 253, + 238, 146, 246, 241, 125, 194, 5, 223, 167, 115, 246, 119, 88, 47, 210, 21, + 69, 160, 102, 177, 252, 223, 35, 220, 126, 254, 254, 15, 224, 225, 35, 155, + 84, 112, 115, 227, 158, 67, 95, 136, 75, 116, 122, 56, 196, 173, 150, 23, + 62, 0, 60, 93, 190, 28, 62, 179, 192, 223, 124, 231, 210, 131, 101, 18, + 101, 84, 6, 93, 124, 209, 101, 48, 166, 51, 209, 128, 143, 173, 168, 219, + 124, 160, 45, 36, 104, 135, 220, 174, 189, 252, 47, 112, 220, 63, 239, 163, + 36, 116, 184, 205, 103, 106, 113, 145, 4, 175, 162, 143, 108, 114, 135, 191, + 198, 75, 248, 21, 58, 191, 154, 178, 132, 58, 104, 156, 80, 158, 136, 253, + 173, 128, 68, 202, 229, 200, 43, 242, 228, 81, 248, 196, 138, 162, 91, 15, + 107, 228, 5, 72, 209, 174, 111, 28, 253, 101, 120, 139, 77, 246, 192, 246, + 119, 195, 105, 185, 113, 133, 208, 253, 48, 248, 187, 200, 173, 200, 5, 93, + 126, 253, 87, 218, 176, 225, 182, 96, 189, 241, 2, 198, 114, 20, 72, 40, + 177, 55, 20, 13, 182, 220, 129, 167, 192, 118, 68, 197, 60, 56, 218, 185, + 8, 6, 72, 99, 140, 47, 42, 116, 121, 159, 143, 30, 176, 72, 115, 30, + 196, 234, 107, 28, 100, 234, 107, 22, 20, 234, 107, 17, 140, 117, 51, 163, + 161, 162, 103, 118, 246, 147, 147, 179, 0, 248, 144, 19, 44, 116, 22, 188, + 206, 181, 200, 63, 148, 96, 180, 37, 158, 42, 98, 56, 86, 69, 142, 110, + 213, 211, 94, 107, 39, 157, 5, 215, 123, 225, 250, 230, 217, 64, 90, 144, + 250, 237, 10, 246, 34, 104, 61, 184, 142, 111, 90, 187, 248, 40, 56, 79, + 22, 171, 221, 214, 131, 172, 69, 98, 165, 164, 162, 7, 161, 83, 132, 100, + 90, 186, 204, 34, 90, 103, 64, 81, 209, 195, 14, 116, 149, 44, 202, 228, + 119, 117, 130, 149, 103, 233, 14, 146, 234, 227, 53, 45, 255, 232, 193, 245, + 120, 21, 85, 231, 227, 34, 190, 225, 39, 15, 198, 178, 16, 61, 108, 103, + 7, 163, 247, 170, 178, 215, 173, 159, 130, 17, 78, 28, 93, 140, 158, 6, + 175, 212, 143, 33, 252, 120, 161, 126, 28, 192, 143, 41, 69, 131, 92, 23, + 228, 191, 60, 10, 126, 218, 59, 4, 22, 98, 63, 120, 181, 119, 56, 132, + 143, 23, 79, 119, 76, 59, 225, 110, 235, 186, 255, 192, 26, 17, 76, 192, + 105, 187, 185, 192, 142, 233, 111, 75, 11, 52, 6, 18, 218, 55, 13, 192, + 25, 97, 215, 20, 126, 54, 250, 28, 16, 47, 236, 229, 3, 107, 226, 238, + 90, 19, 220, 226, 9, 215, 154, 160, 30, 44, 235, 2, 74, 56, 165, 79, + 139, 109, 229, 143, 112, 163, 230, 55, 173, 119, 235, 56, 134, 78, 146, 233, + 39, 176, 79, 59, 121, 54, 139, 210, 197, 253, 42, 23, 55, 173, 111, 160, + 176, 212, 68, 115, 9, 220, 86, 5, 184, 45, 58, 29, 37, 226, 42, 56, + 29, 124, 130, 166, 164, 30, 62, 10, 218, 251, 250, 76, 145, 58, 250, 2, + 89, 2, 126, 185, 204, 167, 73, 79, 191, 252, 59, 170, 255, 34, 41, 49, + 13, 137, 165, 102, 1, 173, 197, 66, 7, 19, 116, 196, 7, 150, 0, 64, + 102, 131, 127, 38, 72, 217, 163, 248, 148, 85, 74, 192, 43, 76, 167, 228, + 3, 7, 71, 119, 145, 207, 117, 235, 80, 167, 140, 208, 222, 131, 85, 109, + 64, 129, 112, 179, 36, 80, 173, 112, 76, 57, 251, 253, 151, 146, 73, 93, + 26, 12, 218, 101, 53, 133, 175, 29, 51, 80, 226, 80, 36, 72, 52, 179, + 51, 64, 17, 209, 149, 56, 5, 118, 114, 129, 33, 166, 233, 188, 146, 78, + 135, 120, 90, 96, 63, 40, 204, 65, 0, 179, 46, 145, 126, 39, 37, 143, + 37, 24, 144, 182, 207, 161, 245, 228, 95, 61, 172, 185, 75, 199, 169, 183, + 3, 143, 118, 240, 107, 240, 160, 181, 215, 82, 197, 240, 247, 145, 218, 32, + 92, 227, 44, 7, 62, 106, 110, 22, 90, 41, 242, 169, 100, 155, 199, 10, + 248, 109, 67, 163, 44, 87, 73, 156, 206, 82, 96, 145, 84, 11, 121, 182, + 216, 116, 104, 21, 147, 171, 180, 50, 51, 109, 235, 193, 236, 194, 252, 165, + 219, 242, 67, 10, 163, 185, 30, 142, 90, 173, 155, 240, 193, 245, 193, 104, + 72, 224, 155, 193, 0, 218, 173, 7, 195, 86, 167, 21, 252, 233, 79, 65, + 43, 45, 17, 186, 219, 39, 187, 112, 84, 248, 192, 195, 66, 21, 55, 187, + 103, 29, 130, 220, 180, 130, 63, 214, 139, 128, 161, 49, 80, 160, 5, 45, + 214, 91, 40, 226, 126, 19, 202, 208, 141, 198, 233, 114, 254, 241, 232, 246, + 194, 2, 246, 129, 63, 136, 45, 197, 157, 113, 89, 131, 243, 167, 75, 191, + 165, 41, 117, 114, 58, 216, 201, 142, 247, 48, 240, 44, 149, 120, 16, 215, + 217, 77, 240, 161, 167, 58, 43, 150, 112, 193, 104, 155, 36, 121, 74, 189, + 7, 220, 251, 39, 80, 27, 32, 103, 141, 190, 12, 233, 206, 6, 216, 225, + 205, 206, 254, 152, 225, 100, 24, 62, 56, 8, 62, 156, 12, 206, 244, 48, + 31, 92, 223, 116, 2, 122, 11, 79, 97, 235, 110, 194, 65, 96, 159, 94, + 236, 239, 95, 59, 227, 134, 253, 117, 111, 58, 234, 217, 76, 60, 24, 167, + 229, 56, 185, 34, 30, 101, 52, 8, 198, 220, 64, 84, 198, 105, 138, 45, + 174, 131, 86, 203, 26, 100, 123, 23, 43, 237, 2, 152, 1, 21, 24, 23, + 249, 170, 23, 92, 239, 118, 119, 9, 118, 174, 255, 27, 180, 254, 217, 205, + 104, 52, 222, 61, 219, 21, 240, 249, 4, 126, 156, 236, 6, 139, 94, 80, + 6, 221, 240, 26, 190, 223, 208, 172, 2, 181, 12, 178, 160, 163, 235, 234, + 6, 186, 235, 237, 124, 40, 7, 163, 214, 160, 21, 124, 40, 97, 232, 88, + 146, 110, 72, 88, 11, 30, 24, 250, 170, 1, 23, 63, 166, 241, 193, 196, + 161, 133, 34, 24, 134, 215, 231, 251, 195, 27, 202, 57, 206, 70, 20, 195, + 157, 50, 216, 135, 238, 90, 124, 6, 90, 15, 164, 155, 86, 112, 212, 130, + 17, 108, 121, 121, 219, 59, 88, 96, 158, 229, 131, 79, 70, 163, 33, 193, + 233, 50, 104, 205, 242, 60, 56, 50, 165, 118, 4, 42, 134, 143, 3, 96, + 244, 213, 83, 218, 254, 29, 44, 10, 15, 225, 67, 193, 110, 123, 23, 54, + 17, 150, 146, 87, 166, 5, 87, 15, 80, 71, 168, 142, 66, 82, 59, 192, + 177, 80, 119, 207, 134, 65, 121, 50, 60, 131, 66, 135, 79, 96, 237, 224, + 219, 50, 45, 225, 244, 47, 22, 232, 59, 135, 235, 54, 195, 157, 98, 176, + 214, 192, 98, 149, 233, 56, 21, 252, 126, 96, 67, 133, 238, 177, 235, 40, + 170, 167, 181, 27, 252, 25, 206, 134, 5, 103, 114, 193, 60, 151, 185, 233, + 234, 133, 154, 174, 85, 245, 60, 42, 3, 64, 106, 236, 159, 67, 232, 171, + 101, 119, 210, 234, 1, 112, 189, 135, 27, 0, 26, 185, 22, 138, 235, 166, + 69, 231, 181, 123, 222, 178, 218, 65, 124, 55, 103, 66, 14, 129, 0, 174, + 77, 23, 50, 241, 52, 23, 75, 4, 43, 56, 66, 1, 5, 101, 25, 83, + 184, 127, 212, 117, 142, 57, 230, 11, 92, 21, 184, 208, 195, 193, 78, 89, + 229, 171, 217, 34, 154, 143, 6, 59, 14, 236, 239, 140, 149, 13, 9, 247, + 236, 129, 218, 96, 167, 118, 230, 103, 193, 249, 179, 199, 12, 233, 24, 163, + 166, 125, 114, 253, 243, 205, 89, 184, 75, 176, 179, 139, 164, 125, 129, 166, + 78, 143, 81, 166, 241, 153, 62, 49, 112, 96, 90, 129, 0, 19, 157, 143, + 163, 221, 29, 1, 129, 35, 218, 117, 191, 160, 253, 224, 168, 225, 61, 54, + 4, 232, 117, 16, 86, 128, 66, 71, 163, 147, 93, 181, 19, 187, 103, 254, + 148, 166, 73, 188, 136, 88, 13, 194, 243, 34, 136, 30, 43, 85, 167, 222, + 228, 0, 254, 83, 27, 176, 84, 123, 51, 185, 177, 78, 138, 222, 157, 224, + 157, 210, 147, 226, 46, 197, 62, 88, 44, 229, 115, 98, 122, 65, 155, 155, + 129, 217, 93, 216, 205, 117, 224, 189, 181, 246, 21, 137, 214, 64, 111, 217, + 80, 61, 226, 165, 165, 200, 146, 159, 209, 74, 142, 104, 37, 237, 146, 84, + 12, 119, 184, 130, 5, 43, 210, 104, 49, 218, 105, 220, 3, 172, 249, 96, + 215, 110, 176, 121, 175, 164, 28, 175, 17, 161, 165, 115, 64, 5, 130, 232, + 248, 101, 0, 93, 173, 139, 197, 200, 55, 40, 82, 35, 232, 143, 213, 18, + 178, 101, 17, 207, 206, 234, 237, 65, 211, 254, 223, 213, 40, 109, 189, 52, + 72, 39, 1, 81, 139, 172, 175, 217, 188, 214, 123, 41, 111, 54, 79, 29, + 93, 232, 230, 1, 119, 2, 232, 104, 227, 174, 153, 172, 35, 193, 137, 57, + 45, 65, 138, 167, 13, 110, 3, 134, 21, 235, 63, 184, 28, 120, 86, 126, + 137, 86, 195, 144, 190, 230, 214, 142, 204, 75, 24, 192, 56, 155, 88, 135, + 18, 38, 100, 159, 210, 161, 253, 122, 31, 70, 151, 34, 70, 52, 243, 61, + 249, 244, 129, 85, 224, 172, 101, 250, 157, 195, 192, 248, 142, 37, 86, 166, + 126, 52, 52, 146, 146, 163, 193, 197, 60, 248, 67, 100, 251, 224, 250, 67, + 121, 253, 224, 147, 79, 70, 131, 155, 27, 190, 200, 112, 117, 84, 153, 128, + 236, 72, 176, 28, 225, 125, 193, 84, 59, 114, 177, 30, 237, 192, 181, 193, + 87, 89, 201, 54, 27, 112, 129, 56, 191, 199, 15, 134, 193, 105, 235, 65, + 171, 53, 60, 133, 106, 186, 52, 242, 217, 44, 45, 87, 229, 245, 19, 183, + 134, 115, 79, 62, 24, 2, 237, 194, 79, 214, 72, 57, 195, 47, 198, 53, + 114, 157, 194, 232, 79, 131, 35, 185, 148, 119, 156, 21, 65, 26, 164, 5, + 164, 88, 191, 21, 14, 164, 9, 89, 213, 82, 183, 9, 183, 89, 213, 208, + 11, 207, 242, 91, 164, 250, 143, 96, 246, 106, 195, 231, 55, 223, 158, 62, + 252, 28, 158, 234, 195, 191, 243, 91, 184, 238, 165, 250, 186, 220, 241, 151, + 164, 197, 0, 6, 108, 236, 131, 235, 137, 92, 33, 39, 114, 210, 134, 193, + 9, 220, 136, 195, 241, 48, 164, 143, 131, 176, 215, 59, 59, 11, 122, 61, + 93, 224, 53, 21, 120, 205, 5, 94, 75, 1, 100, 129, 119, 78, 179, 29, + 134, 222, 93, 230, 188, 176, 93, 124, 177, 139, 28, 3, 89, 115, 172, 146, + 172, 91, 230, 235, 34, 118, 56, 1, 197, 28, 64, 173, 46, 174, 194, 77, + 75, 107, 18, 67, 212, 169, 16, 160, 117, 39, 17, 42, 56, 86, 5, 25, + 52, 44, 225, 62, 148, 206, 180, 210, 17, 88, 60, 178, 49, 157, 42, 227, + 17, 128, 209, 116, 78, 154, 19, 225, 69, 54, 136, 112, 97, 71, 174, 68, + 155, 9, 141, 197, 192, 34, 81, 120, 205, 20, 110, 89, 52, 54, 98, 190, + 10, 216, 25, 20, 211, 148, 61, 233, 228, 101, 69, 250, 208, 73, 162, 173, + 72, 226, 28, 13, 85, 171, 48, 128, 53, 73, 87, 235, 5, 116, 28, 42, + 21, 14, 54, 113, 145, 150, 107, 82, 193, 90, 154, 211, 50, 129, 107, 117, + 9, 144, 134, 99, 66, 104, 231, 198, 145, 61, 65, 157, 28, 220, 215, 195, + 23, 253, 131, 23, 248, 224, 240, 5, 103, 224, 233, 34, 227, 82, 225, 43, + 106, 134, 6, 36, 213, 136, 37, 51, 150, 155, 174, 69, 167, 114, 242, 45, + 201, 252, 135, 130, 157, 37, 241, 121, 134, 166, 183, 65, 177, 6, 160, 12, + 230, 24, 235, 76, 7, 155, 107, 88, 123, 53, 247, 99, 50, 52, 210, 81, + 105, 81, 204, 198, 118, 64, 75, 96, 182, 148, 33, 31, 198, 180, 171, 2, + 52, 33, 156, 38, 21, 49, 205, 129, 194, 137, 100, 79, 138, 22, 57, 213, + 145, 180, 40, 204, 245, 86, 12, 141, 236, 182, 123, 232, 91, 111, 104, 125, + 22, 64, 72, 101, 168, 117, 106, 53, 193, 116, 55, 56, 102, 93, 117, 149, + 46, 147, 208, 158, 18, 236, 81, 196, 177, 213, 147, 96, 145, 150, 100, 201, + 203, 138, 60, 24, 103, 155, 119, 92, 179, 139, 168, 103, 157, 118, 0, 34, + 174, 146, 133, 64, 29, 175, 125, 168, 134, 15, 171, 156, 22, 168, 115, 3, + 36, 134, 45, 164, 25, 1, 214, 26, 247, 126, 153, 44, 115, 160, 209, 218, + 235, 12, 31, 161, 206, 6, 26, 211, 187, 214, 13, 222, 235, 160, 120, 12, + 23, 2, 251, 52, 42, 36, 0, 211, 108, 10, 240, 41, 39, 104, 192, 199, + 7, 7, 8, 123, 61, 77, 80, 84, 72, 170, 247, 93, 22, 66, 33, 193, + 143, 37, 122, 212, 172, 196, 198, 179, 219, 85, 35, 166, 230, 155, 155, 24, + 114, 19, 44, 123, 168, 206, 211, 194, 121, 123, 112, 102, 134, 80, 162, 101, + 188, 53, 21, 157, 86, 0, 198, 156, 198, 18, 146, 176, 34, 245, 37, 173, + 73, 132, 166, 86, 105, 14, 239, 0, 76, 54, 71, 186, 205, 174, 116, 201, + 192, 91, 170, 227, 186, 136, 154, 22, 69, 47, 186, 174, 173, 134, 36, 213, + 0, 167, 224, 65, 89, 178, 56, 3, 246, 61, 169, 98, 92, 143, 53, 106, + 102, 189, 197, 125, 168, 118, 210, 159, 125, 32, 84, 24, 247, 112, 40, 15, + 39, 121, 117, 174, 186, 103, 100, 130, 157, 84, 205, 75, 77, 189, 88, 171, + 115, 204, 128, 36, 101, 240, 172, 76, 48, 96, 35, 44, 34, 45, 87, 228, + 109, 3, 22, 86, 59, 1, 195, 22, 0, 192, 167, 60, 150, 53, 26, 252, + 97, 55, 168, 253, 141, 98, 178, 219, 77, 42, 145, 113, 157, 68, 221, 143, + 199, 221, 127, 12, 186, 79, 198, 10, 21, 211, 160, 153, 157, 74, 144, 173, + 168, 248, 8, 187, 106, 236, 158, 40, 85, 51, 178, 93, 21, 12, 71, 150, + 238, 24, 73, 32, 42, 75, 9, 47, 201, 199, 106, 153, 147, 214, 114, 186, + 46, 12, 246, 229, 45, 168, 227, 209, 160, 93, 38, 137, 77, 223, 226, 36, + 205, 108, 124, 61, 181, 125, 66, 172, 115, 59, 77, 102, 140, 147, 149, 249, + 253, 5, 123, 79, 187, 134, 239, 229, 122, 82, 86, 105, 69, 33, 144, 225, + 252, 193, 2, 101, 105, 185, 36, 184, 66, 173, 224, 165, 123, 25, 168, 129, + 171, 171, 96, 11, 230, 103, 156, 193, 232, 17, 198, 169, 176, 134, 130, 31, + 2, 111, 146, 199, 205, 160, 17, 146, 115, 33, 140, 171, 198, 127, 18, 51, + 201, 52, 43, 225, 146, 224, 229, 92, 230, 23, 114, 25, 224, 41, 55, 0, + 142, 43, 93, 20, 128, 116, 213, 85, 145, 23, 83, 140, 132, 41, 171, 42, + 85, 84, 203, 109, 132, 158, 139, 116, 186, 38, 92, 133, 156, 94, 145, 175, + 87, 100, 6, 67, 156, 156, 109, 168, 83, 229, 243, 4, 253, 249, 195, 64, + 44, 2, 45, 161, 161, 101, 111, 93, 242, 153, 49, 59, 240, 110, 77, 198, + 12, 122, 47, 113, 38, 188, 21, 8, 57, 201, 165, 114, 63, 176, 118, 74, + 237, 116, 219, 160, 196, 40, 32, 25, 151, 98, 246, 101, 252, 216, 33, 140, + 21, 203, 22, 73, 151, 110, 83, 99, 238, 45, 6, 231, 9, 197, 27, 83, + 53, 101, 177, 23, 232, 72, 83, 152, 65, 33, 239, 158, 224, 2, 69, 197, + 166, 215, 242, 239, 11, 134, 235, 23, 56, 104, 142, 14, 22, 81, 190, 200, + 2, 8, 135, 124, 145, 207, 55, 91, 46, 144, 151, 153, 53, 169, 144, 141, + 53, 120, 161, 0, 6, 80, 116, 139, 23, 27, 13, 114, 248, 34, 12, 14, + 224, 223, 33, 93, 215, 15, 95, 4, 184, 135, 27, 178, 195, 133, 59, 22, + 70, 79, 65, 194, 96, 105, 215, 89, 138, 230, 78, 139, 141, 198, 36, 41, + 92, 205, 73, 5, 164, 193, 148, 67, 151, 162, 205, 69, 196, 49, 214, 250, + 56, 158, 197, 2, 186, 89, 81, 220, 141, 24, 142, 239, 50, 74, 51, 255, + 2, 161, 139, 86, 25, 213, 139, 116, 21, 13, 88, 104, 12, 136, 134, 225, + 226, 65, 194, 1, 176, 51, 64, 137, 193, 250, 71, 134, 124, 232, 41, 28, + 115, 137, 10, 72, 235, 14, 48, 22, 46, 60, 243, 152, 204, 26, 74, 216, + 90, 164, 102, 162, 69, 110, 72, 6, 168, 189, 123, 181, 219, 141, 174, 210, + 18, 27, 232, 244, 252, 182, 207, 73, 129, 121, 75, 227, 196, 70, 110, 105, + 121, 115, 91, 203, 83, 76, 76, 127, 75, 195, 229, 130, 174, 164, 45, 77, + 127, 108, 104, 154, 78, 23, 163, 10, 104, 26, 55, 60, 249, 23, 154, 181, + 3, 26, 225, 90, 67, 82, 244, 32, 234, 90, 35, 109, 199, 65, 136, 249, + 8, 70, 27, 220, 245, 4, 32, 66, 142, 107, 125, 192, 76, 200, 173, 151, + 183, 173, 52, 27, 215, 110, 29, 117, 124, 219, 168, 85, 251, 28, 185, 215, + 218, 125, 111, 22, 135, 52, 11, 60, 14, 252, 251, 161, 55, 43, 126, 250, + 253, 183, 95, 121, 229, 208, 64, 151, 30, 241, 180, 173, 105, 26, 192, 68, + 175, 30, 248, 151, 97, 22, 73, 160, 35, 22, 233, 50, 149, 152, 160, 90, + 211, 32, 65, 161, 141, 199, 7, 207, 146, 78, 154, 134, 232, 30, 70, 18, + 100, 19, 63, 32, 109, 67, 251, 174, 217, 178, 207, 40, 76, 81, 171, 39, + 247, 24, 90, 76, 21, 147, 20, 136, 103, 192, 210, 212, 47, 222, 125, 26, + 243, 46, 81, 29, 98, 174, 3, 138, 238, 171, 125, 145, 152, 138, 243, 78, + 157, 117, 92, 194, 192, 64, 182, 181, 70, 26, 40, 169, 243, 76, 205, 16, + 29, 185, 114, 178, 212, 40, 24, 125, 72, 144, 72, 235, 8, 135, 104, 207, + 197, 86, 242, 22, 145, 236, 129, 13, 209, 48, 145, 207, 24, 160, 92, 18, + 238, 41, 69, 243, 68, 136, 140, 4, 103, 217, 216, 12, 45, 244, 215, 139, + 41, 174, 12, 25, 244, 147, 81, 188, 234, 11, 80, 46, 108, 152, 194, 109, + 128, 211, 132, 93, 193, 121, 120, 221, 93, 228, 64, 23, 151, 189, 224, 21, + 55, 226, 115, 15, 250, 102, 190, 76, 23, 168, 101, 74, 227, 15, 180, 238, + 102, 157, 1, 62, 97, 37, 162, 160, 157, 244, 96, 208, 30, 137, 48, 89, + 172, 11, 33, 190, 224, 155, 186, 252, 72, 89, 99, 157, 7, 181, 126, 114, + 180, 174, 54, 31, 169, 14, 156, 14, 23, 36, 237, 217, 227, 189, 100, 184, + 33, 235, 150, 132, 41, 79, 214, 51, 162, 68, 115, 77, 120, 145, 185, 0, + 15, 132, 17, 121, 208, 62, 60, 8, 0, 154, 96, 133, 233, 65, 64, 55, + 182, 187, 87, 64, 57, 246, 30, 126, 125, 248, 69, 184, 207, 159, 103, 124, + 82, 145, 123, 20, 167, 3, 30, 0, 41, 226, 124, 14, 148, 41, 15, 58, + 43, 68, 163, 209, 8, 52, 199, 165, 58, 98, 240, 135, 229, 255, 218, 92, + 77, 196, 169, 4, 85, 244, 129, 41, 196, 44, 56, 60, 192, 129, 246, 229, + 64, 192, 66, 95, 197, 0, 152, 120, 99, 178, 47, 70, 23, 248, 146, 56, + 37, 179, 66, 53, 115, 116, 222, 82, 125, 76, 208, 118, 61, 161, 124, 181, + 83, 161, 246, 152, 242, 4, 138, 9, 206, 71, 37, 230, 136, 180, 17, 0, + 69, 112, 115, 39, 150, 17, 36, 185, 163, 60, 126, 232, 140, 64, 78, 164, + 5, 220, 64, 78, 68, 0, 87, 246, 102, 61, 151, 35, 130, 221, 213, 118, + 161, 75, 139, 62, 229, 185, 150, 58, 38, 186, 27, 149, 28, 234, 34, 127, + 107, 102, 119, 137, 171, 193, 94, 156, 22, 201, 186, 157, 249, 23, 188, 35, + 135, 7, 168, 164, 190, 16, 75, 102, 115, 234, 172, 47, 50, 121, 196, 107, + 219, 243, 51, 240, 69, 54, 3, 80, 108, 130, 110, 112, 51, 226, 214, 209, + 5, 147, 117, 9, 30, 168, 181, 23, 233, 135, 68, 61, 71, 83, 64, 185, + 44, 228, 9, 146, 254, 238, 19, 244, 123, 226, 7, 72, 193, 245, 122, 230, + 90, 32, 233, 0, 18, 216, 90, 13, 187, 17, 37, 232, 6, 167, 156, 86, + 124, 212, 73, 117, 47, 122, 93, 90, 173, 53, 173, 200, 203, 254, 27, 163, + 120, 215, 164, 39, 146, 244, 138, 194, 194, 1, 44, 111, 90, 100, 151, 215, + 23, 211, 208, 183, 148, 106, 184, 74, 147, 82, 115, 104, 53, 127, 79, 171, + 67, 178, 178, 240, 233, 182, 42, 89, 150, 108, 236, 250, 214, 108, 208, 91, + 217, 160, 251, 81, 109, 26, 241, 54, 241, 37, 196, 4, 171, 0, 104, 17, + 179, 22, 18, 7, 22, 239, 20, 234, 94, 89, 241, 42, 43, 119, 181, 0, + 128, 118, 98, 155, 1, 219, 13, 128, 243, 38, 98, 153, 235, 33, 162, 55, + 114, 173, 169, 40, 151, 201, 135, 24, 163, 222, 3, 197, 76, 87, 79, 50, + 171, 20, 243, 90, 224, 37, 162, 23, 216, 185, 244, 232, 125, 114, 69, 34, + 4, 140, 56, 108, 40, 55, 37, 188, 107, 205, 196, 42, 188, 247, 203, 106, + 78, 248, 50, 56, 12, 7, 128, 231, 41, 19, 100, 48, 68, 189, 0, 221, + 123, 7, 131, 193, 103, 232, 33, 253, 153, 162, 253, 201, 140, 3, 190, 99, + 69, 87, 116, 103, 177, 92, 112, 226, 210, 169, 197, 4, 192, 233, 207, 145, + 92, 71, 217, 9, 62, 176, 144, 43, 77, 223, 58, 202, 132, 156, 188, 247, + 108, 96, 93, 86, 130, 78, 34, 146, 71, 36, 41, 242, 39, 240, 92, 0, + 92, 20, 38, 48, 36, 188, 200, 20, 211, 165, 238, 8, 46, 4, 124, 0, + 9, 186, 8, 200, 52, 109, 160, 154, 80, 107, 194, 109, 228, 216, 54, 129, + 189, 166, 108, 56, 159, 53, 143, 3, 11, 217, 195, 38, 11, 74, 179, 193, + 165, 58, 102, 167, 167, 70, 74, 32, 238, 108, 255, 90, 231, 104, 165, 173, + 10, 180, 184, 128, 39, 36, 20, 166, 137, 161, 35, 70, 111, 248, 148, 36, + 110, 4, 72, 72, 180, 168, 209, 231, 180, 12, 106, 160, 102, 0, 189, 6, + 152, 192, 28, 223, 60, 252, 82, 221, 154, 8, 226, 139, 228, 244, 148, 122, + 170, 9, 52, 78, 229, 61, 189, 149, 145, 106, 92, 143, 41, 203, 100, 152, + 86, 242, 8, 93, 60, 84, 2, 3, 134, 125, 192, 242, 105, 213, 112, 106, + 105, 77, 209, 115, 37, 160, 3, 188, 237, 156, 206, 212, 110, 144, 37, 134, + 15, 32, 209, 106, 5, 216, 162, 20, 100, 73, 254, 247, 0, 0, 184, 94, + 106, 83, 67, 185, 135, 10, 36, 112, 115, 182, 0, 52, 152, 86, 131, 66, + 129, 190, 238, 209, 84, 78, 32, 243, 224, 44, 198, 160, 51, 149, 77, 93, + 10, 148, 192, 172, 173, 237, 233, 209, 209, 4, 96, 63, 201, 244, 41, 93, + 147, 131, 165, 39, 136, 98, 56, 178, 193, 109, 215, 190, 205, 222, 201, 94, + 170, 2, 122, 175, 186, 181, 253, 233, 246, 80, 162, 73, 79, 201, 16, 71, + 164, 35, 150, 89, 142, 115, 23, 149, 40, 98, 91, 106, 51, 57, 148, 3, + 104, 230, 58, 47, 98, 134, 188, 73, 194, 92, 179, 172, 118, 172, 0, 85, + 247, 68, 120, 152, 253, 112, 132, 18, 211, 163, 17, 164, 176, 139, 167, 71, + 63, 92, 241, 105, 217, 173, 201, 50, 115, 20, 177, 48, 80, 243, 140, 237, + 3, 86, 42, 193, 23, 51, 250, 101, 13, 105, 144, 40, 157, 68, 134, 214, + 94, 161, 140, 193, 185, 72, 133, 36, 210, 55, 237, 84, 115, 215, 183, 237, + 105, 141, 217, 69, 57, 91, 169, 188, 173, 207, 252, 57, 90, 175, 174, 94, + 211, 203, 35, 184, 89, 104, 60, 67, 44, 246, 26, 0, 111, 149, 38, 124, + 59, 45, 208, 9, 106, 99, 32, 212, 72, 231, 5, 67, 43, 174, 79, 181, + 201, 189, 225, 106, 20, 9, 206, 3, 193, 139, 236, 92, 140, 240, 223, 21, + 244, 52, 223, 183, 202, 144, 128, 239, 73, 252, 166, 221, 199, 111, 185, 116, + 245, 40, 44, 234, 216, 90, 20, 98, 105, 78, 62, 59, 11, 199, 204, 213, + 208, 87, 226, 101, 232, 155, 98, 65, 232, 7, 47, 252, 201, 213, 235, 51, + 119, 137, 100, 46, 175, 157, 13, 211, 103, 221, 76, 138, 57, 219, 108, 170, + 201, 106, 180, 93, 51, 20, 223, 103, 122, 18, 145, 21, 53, 128, 173, 169, + 119, 129, 184, 136, 81, 195, 97, 100, 174, 30, 159, 140, 216, 203, 116, 133, + 188, 114, 72, 116, 113, 102, 221, 190, 70, 202, 188, 171, 168, 118, 17, 2, + 239, 162, 131, 113, 182, 177, 48, 148, 25, 129, 32, 118, 146, 223, 26, 103, + 106, 119, 187, 17, 134, 168, 101, 37, 199, 21, 185, 61, 209, 228, 200, 76, + 9, 58, 17, 247, 103, 103, 212, 52, 216, 142, 154, 150, 6, 43, 51, 20, + 106, 216, 33, 0, 230, 78, 119, 90, 206, 192, 235, 234, 92, 71, 250, 150, + 181, 73, 29, 225, 36, 92, 98, 135, 110, 90, 125, 171, 133, 60, 15, 211, + 43, 93, 167, 128, 49, 206, 19, 50, 105, 7, 152, 53, 4, 10, 185, 92, + 19, 34, 193, 75, 130, 112, 0, 97, 117, 89, 25, 114, 48, 134, 127, 195, + 240, 48, 60, 185, 10, 55, 225, 240, 224, 11, 57, 130, 132, 121, 77, 39, + 198, 1, 10, 202, 95, 193, 63, 114, 229, 181, 164, 14, 214, 149, 68, 92, + 96, 41, 9, 18, 68, 196, 80, 8, 222, 159, 147, 15, 174, 146, 10, 244, + 110, 63, 87, 175, 236, 73, 125, 173, 39, 117, 203, 153, 218, 178, 12, 205, + 39, 172, 125, 49, 12, 47, 80, 85, 218, 185, 229, 228, 160, 100, 85, 78, + 15, 129, 171, 217, 252, 26, 226, 235, 5, 28, 235, 72, 27, 148, 155, 217, + 165, 196, 69, 5, 156, 214, 232, 60, 41, 141, 96, 223, 217, 213, 160, 205, + 114, 61, 211, 68, 71, 115, 21, 79, 165, 68, 129, 190, 250, 245, 215, 125, + 166, 32, 218, 36, 122, 177, 10, 4, 246, 48, 164, 236, 207, 170, 51, 225, + 4, 77, 105, 159, 180, 49, 75, 168, 23, 109, 24, 30, 132, 135, 79, 31, + 134, 143, 194, 199, 79, 63, 15, 191, 8, 159, 116, 4, 172, 21, 132, 88, + 50, 176, 195, 171, 67, 220, 146, 34, 189, 130, 253, 101, 9, 44, 173, 101, + 71, 40, 24, 65, 55, 42, 193, 22, 45, 240, 16, 55, 246, 73, 227, 126, + 237, 242, 253, 181, 123, 114, 52, 77, 72, 86, 148, 20, 103, 191, 111, 239, + 184, 161, 16, 79, 23, 220, 185, 11, 139, 15, 13, 204, 125, 37, 248, 210, + 213, 239, 96, 8, 184, 82, 232, 110, 197, 131, 115, 107, 61, 54, 28, 214, + 157, 232, 173, 209, 131, 21, 184, 77, 22, 11, 177, 254, 117, 59, 69, 153, + 50, 6, 87, 208, 250, 98, 251, 242, 236, 5, 47, 84, 51, 30, 232, 92, + 201, 110, 42, 19, 89, 7, 160, 52, 1, 197, 50, 84, 230, 239, 195, 26, + 68, 108, 26, 219, 96, 144, 51, 48, 246, 177, 177, 20, 67, 94, 71, 93, + 218, 200, 49, 8, 44, 186, 229, 126, 54, 164, 138, 116, 238, 174, 87, 160, + 215, 9, 199, 235, 98, 59, 119, 68, 30, 208, 91, 61, 255, 108, 9, 114, + 45, 216, 77, 173, 75, 1, 182, 145, 213, 52, 46, 73, 169, 96, 236, 186, + 9, 200, 110, 12, 148, 53, 34, 170, 119, 182, 178, 235, 123, 212, 228, 59, + 244, 60, 209, 128, 140, 166, 210, 140, 201, 59, 218, 94, 145, 190, 110, 96, + 191, 175, 26, 49, 212, 224, 14, 224, 86, 244, 227, 114, 85, 201, 14, 42, + 85, 152, 197, 215, 100, 185, 8, 163, 144, 28, 183, 86, 255, 107, 172, 165, + 32, 29, 201, 115, 34, 7, 73, 168, 7, 112, 88, 80, 140, 142, 56, 142, + 8, 127, 90, 244, 229, 203, 218, 45, 66, 62, 208, 116, 148, 121, 12, 108, + 161, 71, 151, 5, 14, 18, 213, 131, 36, 191, 245, 213, 167, 204, 9, 146, + 62, 83, 138, 10, 35, 74, 109, 105, 217, 100, 238, 112, 29, 170, 53, 68, + 182, 210, 46, 83, 242, 203, 53, 208, 16, 42, 238, 200, 125, 244, 177, 116, + 31, 193, 81, 202, 114, 125, 14, 155, 180, 177, 182, 242, 88, 79, 101, 106, + 116, 88, 200, 65, 47, 46, 163, 77, 9, 236, 77, 204, 50, 125, 26, 129, + 56, 88, 40, 54, 89, 196, 125, 36, 206, 73, 69, 239, 91, 122, 162, 12, + 14, 93, 22, 83, 140, 49, 35, 207, 224, 209, 143, 197, 166, 224, 101, 198, + 124, 58, 74, 244, 66, 108, 73, 249, 33, 16, 21, 20, 197, 36, 91, 17, + 209, 18, 234, 135, 85, 255, 105, 118, 145, 127, 48, 52, 31, 32, 31, 186, + 145, 154, 134, 10, 35, 0, 134, 187, 45, 214, 170, 106, 206, 54, 143, 65, + 60, 227, 133, 189, 254, 106, 66, 140, 49, 129, 25, 54, 115, 209, 103, 121, + 60, 182, 78, 167, 215, 58, 47, 35, 204, 0, 5, 37, 72, 43, 44, 115, + 131, 147, 109, 17, 29, 146, 248, 165, 218, 58, 196, 130, 248, 160, 143, 187, + 60, 217, 24, 57, 183, 186, 81, 0, 144, 149, 242, 174, 81, 249, 173, 94, + 58, 199, 181, 174, 7, 15, 40, 2, 251, 101, 42, 75, 94, 36, 136, 170, + 189, 13, 231, 161, 241, 230, 48, 239, 62, 69, 182, 220, 178, 204, 208, 178, + 80, 53, 105, 77, 4, 176, 189, 255, 212, 220, 55, 204, 220, 6, 68, 42, + 104, 30, 78, 171, 193, 181, 70, 91, 22, 118, 127, 36, 168, 73, 185, 156, + 24, 148, 221, 85, 175, 202, 245, 164, 42, 56, 180, 142, 121, 187, 167, 222, + 46, 37, 223, 111, 28, 185, 5, 250, 35, 65, 229, 168, 222, 46, 157, 87, + 159, 233, 186, 249, 116, 189, 200, 59, 161, 55, 168, 63, 169, 247, 147, 180, + 194, 149, 195, 61, 51, 181, 127, 245, 223, 218, 180, 204, 207, 234, 229, 10, + 61, 117, 205, 243, 47, 191, 28, 185, 124, 58, 60, 123, 246, 204, 111, 137, + 68, 121, 164, 202, 70, 182, 73, 31, 237, 243, 116, 86, 149, 53, 2, 71, + 224, 96, 150, 231, 104, 23, 153, 231, 251, 163, 67, 62, 104, 119, 33, 188, + 222, 200, 72, 171, 118, 17, 221, 162, 241, 72, 70, 20, 144, 185, 209, 20, + 191, 105, 149, 20, 104, 17, 222, 120, 43, 110, 180, 250, 151, 92, 204, 137, + 41, 204, 56, 147, 13, 194, 113, 162, 12, 62, 42, 251, 40, 186, 55, 79, + 133, 192, 178, 72, 96, 7, 104, 100, 18, 195, 16, 255, 34, 9, 220, 163, + 111, 175, 109, 52, 110, 152, 240, 91, 138, 2, 5, 141, 31, 252, 156, 190, + 190, 118, 206, 210, 37, 235, 31, 245, 128, 53, 16, 171, 25, 143, 28, 166, + 168, 224, 148, 193, 196, 246, 208, 77, 199, 20, 144, 76, 202, 156, 0, 45, + 253, 214, 66, 18, 115, 12, 108, 68, 245, 131, 62, 105, 164, 71, 85, 214, + 97, 154, 207, 66, 70, 159, 101, 34, 189, 224, 111, 165, 133, 30, 168, 24, + 179, 188, 124, 65, 153, 51, 75, 164, 164, 195, 249, 145, 198, 138, 44, 214, + 116, 125, 230, 181, 30, 168, 90, 212, 210, 68, 41, 109, 150, 28, 78, 75, + 238, 127, 75, 222, 101, 140, 46, 96, 18, 53, 129, 222, 173, 98, 134, 45, + 182, 119, 53, 121, 158, 18, 242, 162, 241, 81, 164, 5, 97, 240, 211, 22, + 202, 218, 210, 34, 99, 100, 85, 54, 138, 132, 213, 34, 44, 45, 213, 35, + 218, 250, 245, 130, 111, 147, 140, 236, 3, 55, 161, 65, 204, 42, 206, 215, + 109, 154, 54, 34, 141, 108, 33, 140, 150, 33, 106, 85, 176, 210, 64, 54, + 26, 121, 125, 159, 196, 112, 165, 89, 55, 90, 41, 97, 16, 225, 90, 178, + 136, 62, 38, 27, 218, 60, 35, 49, 111, 241, 84, 199, 100, 208, 47, 250, + 66, 23, 111, 168, 141, 166, 70, 188, 147, 197, 2, 254, 154, 68, 177, 176, + 236, 235, 180, 212, 1, 215, 94, 140, 46, 176, 22, 174, 132, 196, 63, 179, + 233, 142, 6, 155, 30, 20, 90, 209, 172, 240, 23, 158, 9, 178, 59, 82, + 210, 199, 38, 169, 124, 79, 59, 188, 232, 199, 76, 52, 77, 146, 186, 76, + 72, 52, 242, 89, 114, 37, 168, 79, 128, 85, 117, 143, 218, 7, 105, 208, + 163, 213, 13, 41, 9, 115, 212, 161, 87, 150, 10, 137, 153, 190, 81, 98, + 167, 177, 51, 11, 183, 181, 113, 17, 145, 73, 18, 93, 104, 234, 9, 55, + 69, 117, 168, 194, 175, 108, 89, 27, 66, 38, 8, 193, 20, 57, 147, 168, + 90, 146, 95, 201, 198, 2, 193, 158, 84, 202, 40, 192, 61, 133, 200, 21, + 106, 136, 91, 173, 146, 76, 139, 194, 154, 68, 149, 138, 220, 179, 224, 161, + 23, 136, 79, 64, 201, 40, 30, 53, 54, 76, 228, 35, 246, 48, 168, 207, + 19, 67, 194, 186, 53, 9, 71, 165, 101, 109, 98, 121, 20, 96, 124, 13, + 67, 216, 209, 212, 100, 119, 108, 179, 75, 158, 144, 146, 166, 113, 101, 255, + 192, 52, 118, 132, 169, 46, 15, 111, 239, 75, 142, 159, 52, 62, 56, 11, + 197, 100, 211, 58, 58, 39, 220, 196, 214, 94, 14, 187, 143, 127, 75, 31, + 220, 154, 49, 152, 57, 225, 218, 65, 59, 237, 177, 85, 49, 23, 10, 79, + 30, 194, 191, 71, 181, 193, 60, 62, 107, 48, 88, 178, 70, 243, 104, 240, + 89, 23, 189, 102, 238, 94, 98, 49, 50, 61, 143, 22, 179, 58, 232, 220, + 178, 166, 221, 135, 93, 37, 210, 188, 173, 121, 219, 10, 57, 202, 166, 70, + 58, 74, 214, 101, 174, 64, 187, 222, 75, 247, 201, 209, 111, 220, 57, 111, + 85, 159, 156, 177, 138, 78, 9, 243, 170, 100, 133, 179, 60, 180, 100, 58, + 245, 255, 112, 15, 122, 141, 96, 17, 224, 150, 4, 106, 175, 172, 253, 120, + 114, 199, 126, 224, 76, 14, 30, 221, 177, 29, 191, 111, 46, 208, 236, 255, + 253, 217, 116, 135, 71, 119, 28, 223, 250, 141, 38, 20, 220, 5, 50, 140, + 108, 203, 125, 11, 120, 29, 116, 31, 134, 8, 196, 219, 97, 172, 225, 208, + 30, 192, 63, 62, 51, 122, 70, 141, 80, 126, 235, 122, 201, 127, 247, 60, + 8, 63, 3, 118, 217, 58, 66, 50, 195, 225, 81, 10, 187, 108, 142, 4, + 92, 222, 91, 27, 181, 232, 211, 173, 109, 91, 118, 223, 165, 77, 109, 15, + 107, 28, 5, 181, 227, 19, 225, 202, 154, 62, 205, 44, 189, 141, 16, 220, + 196, 252, 151, 121, 33, 22, 246, 105, 134, 162, 80, 38, 106, 216, 104, 152, + 52, 212, 58, 218, 186, 101, 152, 111, 24, 220, 50, 38, 83, 47, 159, 204, + 176, 250, 82, 23, 208, 97, 119, 24, 14, 181, 53, 188, 109, 34, 63, 36, + 239, 225, 195, 80, 187, 7, 192, 232, 72, 149, 236, 72, 186, 60, 98, 229, + 68, 183, 213, 67, 182, 222, 141, 3, 77, 190, 162, 145, 119, 59, 155, 187, + 28, 201, 60, 34, 215, 148, 113, 71, 72, 140, 107, 84, 163, 135, 176, 157, + 94, 15, 125, 201, 120, 100, 11, 140, 223, 133, 179, 4, 142, 185, 199, 209, + 229, 43, 37, 76, 165, 53, 51, 86, 221, 116, 97, 70, 70, 140, 1, 235, + 22, 159, 167, 112, 42, 166, 214, 53, 13, 108, 14, 44, 110, 90, 145, 232, + 170, 177, 49, 75, 168, 235, 152, 121, 211, 25, 243, 132, 2, 5, 199, 226, + 243, 175, 122, 199, 42, 74, 36, 37, 245, 237, 81, 7, 48, 172, 185, 70, + 52, 122, 51, 224, 30, 161, 11, 135, 21, 12, 23, 3, 228, 50, 189, 122, + 158, 164, 20, 95, 222, 240, 176, 236, 95, 90, 134, 174, 49, 169, 180, 218, + 179, 132, 163, 248, 179, 87, 235, 183, 39, 207, 182, 81, 179, 150, 189, 159, + 170, 221, 54, 108, 32, 62, 62, 233, 245, 120, 228, 29, 77, 41, 250, 202, + 121, 187, 180, 154, 60, 249, 194, 160, 40, 67, 205, 32, 192, 48, 216, 162, + 185, 51, 82, 224, 141, 21, 238, 195, 80, 138, 205, 182, 131, 154, 182, 23, + 201, 22, 109, 37, 234, 128, 182, 81, 106, 116, 88, 1, 45, 164, 137, 143, + 108, 108, 207, 150, 128, 208, 127, 221, 40, 206, 236, 181, 146, 78, 147, 171, + 143, 70, 184, 218, 160, 207, 115, 33, 214, 86, 9, 74, 30, 143, 97, 66, + 110, 109, 83, 181, 104, 243, 177, 111, 241, 12, 49, 33, 170, 143, 227, 249, + 102, 133, 43, 167, 4, 61, 150, 142, 182, 129, 36, 38, 241, 26, 49, 209, + 18, 216, 208, 152, 0, 96, 204, 16, 58, 237, 113, 62, 207, 128, 113, 81, + 19, 215, 85, 137, 221, 36, 233, 53, 162, 53, 22, 15, 71, 200, 162, 117, + 145, 11, 176, 172, 255, 49, 20, 15, 10, 184, 248, 24, 210, 166, 16, 179, + 140, 33, 177, 147, 197, 162, 115, 23, 79, 179, 226, 89, 42, 65, 88, 132, + 217, 19, 0, 179, 34, 251, 173, 88, 124, 145, 48, 43, 247, 25, 224, 149, + 144, 215, 238, 146, 212, 192, 216, 207, 160, 188, 134, 196, 229, 37, 153, 117, + 194, 97, 193, 213, 142, 74, 95, 185, 111, 41, 136, 110, 179, 89, 104, 180, + 167, 70, 110, 210, 18, 76, 110, 86, 12, 72, 26, 44, 69, 74, 203, 98, + 141, 117, 166, 98, 179, 218, 252, 184, 241, 182, 116, 8, 127, 158, 234, 87, + 235, 116, 81, 117, 217, 139, 141, 90, 100, 106, 134, 186, 134, 118, 208, 150, + 187, 139, 202, 40, 88, 227, 117, 22, 51, 219, 151, 162, 153, 159, 66, 112, + 182, 51, 39, 202, 97, 233, 12, 110, 164, 129, 181, 165, 17, 97, 19, 82, + 54, 5, 153, 164, 25, 90, 102, 99, 195, 44, 67, 131, 145, 207, 34, 60, + 23, 117, 254, 254, 205, 82, 162, 112, 98, 208, 110, 57, 172, 34, 224, 198, + 221, 167, 55, 166, 151, 137, 55, 31, 37, 132, 88, 161, 255, 71, 69, 129, + 118, 140, 73, 44, 30, 78, 99, 196, 98, 120, 70, 190, 112, 17, 97, 114, + 29, 75, 157, 225, 98, 52, 61, 2, 37, 232, 229, 40, 244, 195, 65, 24, + 62, 18, 77, 9, 97, 14, 98, 206, 38, 6, 107, 232, 114, 186, 16, 25, + 54, 197, 22, 69, 195, 219, 243, 220, 77, 246, 97, 54, 71, 201, 126, 93, + 187, 26, 227, 208, 4, 75, 168, 151, 2, 57, 118, 178, 2, 240, 82, 135, + 88, 211, 210, 123, 6, 140, 116, 169, 141, 31, 183, 128, 81, 40, 60, 195, + 154, 36, 224, 112, 128, 38, 168, 106, 160, 120, 135, 108, 221, 234, 111, 130, + 221, 147, 217, 78, 189, 220, 222, 102, 122, 195, 36, 75, 86, 181, 123, 219, + 53, 199, 117, 131, 140, 25, 143, 40, 12, 49, 82, 65, 24, 30, 248, 242, + 70, 245, 222, 224, 109, 107, 19, 148, 84, 212, 2, 71, 173, 28, 178, 238, + 4, 123, 133, 8, 106, 148, 218, 207, 221, 31, 20, 102, 213, 119, 210, 65, + 84, 236, 48, 133, 58, 40, 198, 126, 209, 116, 74, 88, 5, 19, 191, 248, + 41, 95, 68, 26, 208, 188, 59, 142, 234, 208, 166, 145, 150, 55, 173, 99, + 54, 184, 209, 217, 200, 204, 88, 118, 141, 242, 144, 189, 120, 81, 136, 141, + 73, 137, 107, 123, 41, 202, 44, 50, 137, 153, 78, 141, 44, 167, 189, 206, + 22, 232, 179, 70, 54, 210, 57, 224, 172, 219, 64, 40, 16, 87, 112, 131, + 1, 18, 193, 15, 48, 233, 38, 219, 224, 45, 182, 198, 205, 242, 72, 187, + 79, 212, 129, 47, 36, 57, 73, 52, 237, 163, 1, 79, 226, 96, 153, 120, + 129, 178, 215, 88, 25, 97, 217, 214, 113, 228, 236, 135, 225, 171, 97, 209, + 28, 220, 121, 240, 194, 56, 254, 244, 217, 60, 133, 188, 233, 142, 196, 58, + 23, 77, 230, 194, 160, 247, 203, 42, 193, 143, 121, 58, 131, 191, 171, 108, + 9, 127, 43, 250, 62, 89, 174, 40, 116, 53, 174, 188, 110, 244, 240, 69, + 112, 129, 118, 25, 152, 88, 34, 246, 218, 155, 198, 88, 249, 124, 10, 103, + 175, 151, 165, 41, 54, 23, 101, 240, 55, 205, 10, 106, 250, 67, 189, 57, + 12, 155, 151, 123, 205, 44, 121, 64, 209, 5, 182, 176, 204, 47, 224, 111, + 62, 199, 39, 179, 197, 69, 189, 5, 146, 172, 194, 80, 208, 235, 26, 207, + 141, 96, 109, 146, 67, 187, 237, 206, 151, 31, 161, 58, 134, 163, 146, 15, + 252, 57, 93, 224, 152, 163, 50, 198, 17, 206, 240, 123, 17, 93, 226, 18, + 92, 85, 56, 151, 218, 228, 115, 202, 194, 225, 181, 156, 207, 102, 170, 160, + 28, 21, 82, 231, 79, 147, 104, 161, 35, 51, 219, 94, 73, 142, 239, 247, + 92, 137, 134, 105, 239, 209, 209, 6, 119, 159, 133, 218, 226, 22, 89, 242, + 116, 214, 218, 202, 130, 36, 248, 154, 20, 54, 230, 71, 100, 4, 219, 76, + 35, 90, 48, 198, 222, 230, 202, 221, 74, 205, 169, 100, 153, 1, 94, 213, + 90, 104, 24, 9, 213, 66, 211, 37, 79, 50, 26, 172, 24, 99, 53, 80, + 160, 26, 135, 30, 91, 139, 133, 49, 160, 217, 235, 146, 236, 217, 145, 90, + 82, 182, 61, 150, 33, 140, 173, 167, 39, 126, 133, 43, 227, 204, 67, 185, + 199, 141, 86, 82, 93, 135, 196, 212, 168, 72, 122, 215, 48, 240, 57, 134, + 153, 32, 141, 198, 83, 178, 99, 43, 159, 6, 196, 4, 197, 248, 109, 85, + 160, 17, 3, 48, 10, 240, 157, 22, 12, 62, 115, 74, 230, 140, 180, 194, + 141, 45, 164, 19, 34, 29, 38, 161, 205, 33, 69, 36, 111, 124, 69, 50, + 37, 180, 231, 153, 41, 183, 80, 207, 212, 178, 73, 215, 90, 98, 174, 176, + 195, 169, 193, 105, 162, 172, 86, 142, 102, 90, 223, 105, 22, 145, 32, 64, + 201, 144, 23, 27, 155, 128, 252, 10, 176, 211, 37, 211, 50, 81, 37, 94, + 114, 54, 130, 80, 251, 137, 9, 88, 152, 79, 37, 122, 113, 26, 173, 36, + 24, 5, 43, 130, 148, 235, 145, 167, 90, 176, 53, 59, 33, 18, 220, 177, + 131, 47, 201, 239, 155, 92, 68, 148, 11, 12, 239, 166, 56, 238, 212, 184, + 120, 56, 214, 76, 38, 113, 49, 26, 242, 165, 177, 84, 36, 83, 2, 58, + 13, 202, 66, 154, 156, 89, 31, 59, 238, 58, 194, 96, 71, 162, 133, 193, + 35, 40, 54, 193, 60, 111, 114, 237, 18, 74, 151, 125, 115, 243, 210, 246, + 165, 179, 44, 79, 88, 215, 229, 222, 1, 93, 109, 148, 76, 173, 1, 98, + 17, 35, 75, 131, 72, 148, 124, 77, 249, 249, 224, 44, 112, 253, 108, 51, + 111, 227, 230, 131, 196, 1, 194, 80, 129, 172, 58, 243, 120, 188, 12, 94, + 204, 140, 110, 240, 78, 109, 81, 232, 56, 162, 224, 14, 246, 181, 130, 34, + 97, 206, 202, 222, 226, 6, 162, 249, 7, 11, 181, 210, 112, 223, 160, 120, + 173, 92, 79, 186, 179, 130, 212, 61, 182, 11, 160, 54, 188, 20, 80, 225, + 197, 15, 45, 148, 195, 122, 48, 67, 202, 212, 41, 25, 229, 236, 1, 235, + 21, 158, 144, 164, 106, 76, 61, 157, 132, 40, 181, 85, 223, 81, 246, 120, + 118, 166, 88, 225, 119, 73, 165, 248, 25, 83, 104, 52, 234, 14, 141, 70, + 33, 33, 135, 52, 165, 158, 113, 205, 196, 88, 28, 92, 72, 30, 39, 124, + 66, 23, 138, 211, 46, 118, 168, 91, 27, 224, 31, 178, 66, 199, 185, 99, + 188, 23, 52, 89, 212, 43, 197, 150, 233, 166, 15, 46, 208, 143, 23, 232, + 88, 2, 84, 190, 120, 167, 20, 20, 153, 91, 76, 194, 145, 58, 136, 29, + 251, 91, 177, 192, 48, 107, 39, 134, 241, 247, 89, 60, 188, 245, 198, 179, + 85, 25, 82, 130, 213, 56, 28, 163, 255, 216, 24, 199, 49, 186, 134, 209, + 255, 26, 12, 25, 79, 237, 106, 85, 47, 149, 211, 36, 122, 20, 60, 236, + 162, 193, 140, 104, 44, 77, 71, 132, 134, 90, 58, 174, 201, 81, 191, 127, + 121, 121, 217, 67, 81, 122, 28, 247, 242, 98, 222, 167, 118, 202, 222, 234, + 156, 86, 203, 182, 97, 27, 24, 60, 101, 153, 206, 241, 196, 245, 48, 244, + 56, 61, 115, 47, 54, 241, 147, 64, 23, 178, 16, 214, 130, 43, 160, 254, + 128, 220, 14, 86, 103, 116, 168, 117, 77, 200, 150, 10, 188, 26, 141, 112, + 175, 14, 237, 116, 161, 159, 124, 60, 171, 1, 60, 134, 222, 210, 97, 24, + 186, 70, 202, 65, 21, 228, 98, 147, 205, 219, 2, 244, 122, 46, 22, 29, + 95, 219, 55, 34, 43, 94, 15, 194, 215, 67, 87, 242, 212, 80, 32, 188, + 26, 132, 87, 82, 76, 183, 125, 123, 241, 13, 214, 8, 55, 247, 107, 27, + 10, 127, 148, 242, 225, 199, 161, 98, 40, 238, 223, 19, 84, 142, 77, 253, + 48, 30, 106, 145, 31, 55, 240, 206, 200, 167, 148, 192, 101, 104, 32, 36, + 39, 87, 44, 184, 151, 83, 177, 0, 169, 136, 30, 87, 192, 179, 148, 180, + 9, 218, 237, 143, 46, 13, 125, 180, 26, 142, 72, 211, 120, 97, 163, 79, + 66, 229, 188, 120, 230, 152, 77, 40, 117, 43, 31, 114, 11, 232, 196, 11, + 21, 42, 24, 31, 125, 105, 193, 110, 64, 247, 171, 104, 10, 140, 223, 6, + 231, 110, 77, 167, 234, 215, 64, 62, 214, 36, 190, 131, 47, 234, 115, 141, + 113, 190, 127, 13, 248, 47, 254, 120, 252, 144, 127, 210, 39, 93, 144, 240, + 41, 206, 89, 55, 14, 103, 101, 65, 49, 230, 50, 20, 10, 214, 2, 228, + 151, 110, 146, 194, 82, 92, 81, 220, 89, 233, 91, 94, 155, 220, 208, 77, + 131, 64, 141, 91, 101, 58, 176, 72, 218, 32, 144, 19, 64, 36, 234, 253, + 81, 60, 180, 98, 173, 255, 73, 72, 14, 26, 240, 41, 238, 25, 33, 251, + 102, 132, 48, 226, 147, 16, 136, 99, 64, 136, 103, 103, 6, 233, 191, 156, + 81, 24, 73, 107, 58, 133, 133, 115, 45, 163, 97, 182, 150, 199, 107, 220, + 56, 82, 165, 30, 9, 121, 65, 9, 65, 120, 2, 53, 224, 226, 241, 244, + 130, 183, 184, 74, 22, 78, 194, 229, 194, 237, 38, 116, 237, 174, 153, 50, + 59, 171, 225, 236, 59, 22, 193, 59, 36, 183, 129, 152, 229, 84, 193, 7, + 195, 69, 97, 154, 142, 105, 196, 115, 155, 245, 197, 173, 160, 81, 51, 99, + 112, 192, 32, 12, 180, 162, 173, 153, 18, 176, 246, 225, 15, 36, 9, 96, + 208, 12, 35, 26, 66, 98, 74, 153, 53, 70, 227, 3, 180, 15, 128, 38, + 79, 194, 251, 209, 12, 181, 37, 174, 55, 229, 44, 182, 58, 199, 15, 15, + 240, 250, 124, 120, 112, 128, 127, 31, 62, 244, 200, 125, 101, 129, 77, 116, + 89, 24, 112, 155, 129, 213, 38, 69, 87, 209, 33, 136, 92, 120, 249, 13, + 247, 59, 172, 68, 211, 228, 61, 181, 138, 181, 223, 192, 139, 207, 26, 169, + 56, 115, 149, 113, 0, 4, 138, 98, 22, 152, 226, 247, 189, 213, 110, 3, + 113, 20, 4, 140, 173, 109, 9, 199, 102, 91, 194, 177, 166, 172, 108, 201, + 217, 157, 199, 6, 71, 24, 142, 213, 185, 64, 58, 103, 169, 93, 116, 198, + 132, 181, 57, 216, 43, 206, 39, 196, 48, 212, 227, 73, 58, 199, 74, 122, + 87, 45, 65, 170, 101, 94, 195, 183, 82, 51, 198, 39, 94, 225, 18, 41, + 201, 168, 212, 161, 2, 212, 0, 57, 167, 210, 31, 125, 116, 13, 121, 166, + 123, 106, 188, 102, 52, 124, 102, 148, 173, 94, 249, 37, 0, 144, 46, 62, + 94, 194, 95, 20, 207, 8, 172, 170, 38, 189, 69, 162, 78, 61, 96, 31, + 140, 0, 195, 218, 141, 13, 71, 155, 26, 139, 171, 103, 234, 45, 114, 99, + 99, 170, 9, 211, 232, 214, 75, 108, 158, 58, 16, 123, 156, 145, 21, 206, + 52, 208, 207, 245, 49, 138, 46, 126, 47, 70, 65, 113, 21, 144, 201, 207, + 6, 97, 54, 25, 163, 14, 181, 84, 28, 133, 192, 129, 210, 96, 203, 219, + 209, 64, 243, 0, 152, 6, 129, 66, 95, 145, 221, 186, 29, 177, 37, 162, + 145, 58, 253, 82, 101, 12, 96, 195, 209, 10, 108, 250, 119, 146, 156, 3, + 182, 64, 79, 161, 134, 53, 160, 109, 179, 22, 225, 189, 1, 75, 12, 119, + 147, 86, 155, 250, 125, 221, 6, 94, 245, 179, 78, 248, 251, 24, 7, 96, + 128, 195, 67, 153, 100, 251, 156, 114, 120, 171, 185, 6, 135, 131, 207, 116, + 175, 220, 100, 71, 3, 211, 112, 96, 228, 251, 214, 236, 154, 230, 180, 204, + 226, 45, 83, 226, 240, 164, 180, 173, 196, 157, 146, 166, 43, 99, 121, 62, + 214, 248, 157, 115, 130, 14, 67, 137, 124, 90, 37, 128, 40, 1, 138, 240, + 217, 86, 92, 201, 226, 198, 120, 133, 114, 203, 115, 250, 27, 211, 125, 215, + 59, 223, 50, 110, 29, 255, 66, 135, 150, 147, 244, 210, 191, 17, 173, 215, + 232, 128, 255, 216, 245, 79, 177, 80, 221, 201, 148, 137, 229, 196, 29, 177, + 137, 241, 122, 169, 221, 172, 109, 41, 157, 39, 162, 23, 76, 245, 157, 144, + 136, 37, 133, 85, 115, 73, 67, 150, 165, 160, 156, 223, 50, 237, 67, 85, + 162, 14, 196, 32, 114, 126, 39, 165, 226, 11, 74, 37, 97, 59, 248, 248, + 88, 79, 194, 183, 244, 167, 105, 201, 113, 92, 68, 153, 227, 99, 128, 250, + 193, 135, 5, 56, 9, 97, 64, 99, 202, 87, 49, 198, 78, 12, 107, 220, + 112, 143, 178, 179, 144, 165, 255, 74, 174, 170, 35, 225, 138, 88, 59, 56, + 73, 230, 41, 251, 72, 144, 21, 165, 54, 4, 118, 220, 206, 225, 124, 29, + 185, 206, 244, 204, 98, 56, 170, 45, 99, 82, 18, 216, 146, 124, 54, 221, + 33, 107, 117, 92, 185, 75, 138, 115, 68, 118, 13, 20, 202, 134, 242, 9, + 96, 72, 106, 12, 2, 201, 11, 109, 144, 130, 145, 62, 9, 72, 105, 103, + 124, 79, 108, 228, 58, 225, 235, 12, 150, 58, 118, 40, 139, 1, 69, 41, + 82, 174, 87, 43, 178, 210, 9, 49, 154, 152, 240, 218, 218, 174, 21, 48, + 227, 92, 210, 171, 106, 145, 235, 34, 154, 139, 34, 215, 12, 28, 207, 186, + 21, 127, 7, 181, 48, 90, 101, 108, 173, 138, 10, 194, 83, 215, 152, 52, + 56, 139, 221, 173, 44, 241, 131, 85, 200, 186, 60, 112, 84, 103, 120, 113, + 221, 88, 118, 37, 170, 35, 132, 180, 100, 134, 226, 206, 73, 130, 242, 17, + 43, 28, 138, 22, 5, 150, 38, 160, 138, 30, 31, 74, 102, 45, 246, 191, + 82, 254, 69, 58, 226, 35, 43, 28, 148, 23, 183, 173, 69, 74, 178, 139, + 180, 200, 201, 228, 223, 218, 50, 1, 171, 7, 38, 230, 164, 37, 31, 126, + 112, 141, 143, 173, 241, 147, 237, 146, 51, 9, 62, 46, 28, 234, 73, 57, + 155, 107, 160, 97, 11, 175, 150, 248, 91, 179, 221, 189, 205, 246, 181, 113, + 231, 40, 177, 21, 12, 29, 232, 73, 117, 248, 182, 123, 178, 117, 136, 109, + 163, 107, 80, 251, 94, 112, 62, 128, 138, 97, 65, 69, 28, 128, 150, 67, + 91, 86, 239, 184, 30, 54, 77, 225, 28, 24, 2, 76, 4, 133, 78, 164, + 20, 173, 181, 37, 97, 80, 166, 9, 185, 115, 170, 217, 217, 209, 74, 101, + 135, 173, 160, 164, 194, 85, 106, 9, 47, 21, 59, 39, 106, 15, 149, 235, + 58, 54, 199, 157, 195, 113, 86, 148, 187, 121, 243, 206, 222, 195, 160, 105, + 65, 57, 154, 0, 121, 15, 16, 230, 72, 181, 18, 133, 52, 208, 168, 49, + 37, 23, 67, 150, 202, 217, 81, 144, 236, 8, 21, 90, 70, 108, 60, 44, + 72, 221, 93, 36, 74, 83, 123, 95, 203, 137, 192, 50, 13, 124, 240, 137, + 24, 2, 190, 183, 28, 220, 188, 48, 117, 142, 41, 88, 175, 169, 145, 103, + 117, 32, 253, 210, 106, 215, 88, 250, 245, 167, 137, 54, 250, 227, 96, 193, + 202, 166, 136, 19, 126, 181, 101, 8, 168, 240, 98, 215, 180, 142, 233, 47, + 168, 89, 202, 121, 166, 114, 181, 1, 205, 115, 229, 135, 226, 74, 43, 219, + 108, 43, 201, 230, 117, 149, 56, 84, 116, 28, 12, 109, 8, 96, 160, 18, + 117, 153, 18, 14, 167, 200, 179, 218, 28, 140, 65, 215, 238, 121, 83, 103, + 227, 27, 34, 106, 86, 4, 190, 73, 227, 210, 245, 27, 214, 31, 77, 131, + 80, 54, 22, 127, 0, 146, 21, 63, 172, 16, 77, 78, 196, 131, 18, 198, + 112, 110, 236, 52, 251, 62, 195, 101, 186, 249, 181, 161, 27, 134, 230, 182, + 64, 61, 27, 101, 178, 65, 43, 7, 115, 136, 130, 37, 250, 124, 139, 141, + 171, 209, 88, 160, 14, 162, 104, 236, 229, 231, 166, 94, 40, 229, 19, 82, + 151, 11, 76, 182, 212, 88, 111, 28, 175, 214, 165, 85, 215, 206, 83, 139, + 161, 169, 133, 76, 224, 32, 120, 90, 3, 5, 143, 54, 104, 237, 189, 68, + 75, 199, 172, 121, 121, 199, 171, 116, 218, 48, 40, 29, 158, 118, 138, 225, + 176, 1, 45, 22, 172, 49, 202, 232, 200, 204, 183, 76, 15, 211, 253, 21, + 64, 5, 70, 101, 34, 109, 162, 254, 10, 30, 118, 229, 105, 201, 120, 100, + 74, 225, 156, 25, 176, 173, 183, 129, 113, 1, 217, 108, 150, 203, 233, 212, + 223, 174, 128, 173, 115, 96, 231, 113, 122, 118, 155, 54, 102, 69, 212, 196, + 241, 56, 6, 205, 163, 148, 108, 72, 202, 194, 55, 56, 236, 78, 211, 57, + 90, 98, 200, 178, 86, 156, 146, 69, 66, 65, 84, 238, 94, 169, 124, 189, + 219, 49, 137, 51, 94, 77, 6, 205, 117, 191, 218, 38, 175, 62, 178, 243, + 188, 172, 244, 176, 84, 52, 173, 218, 104, 176, 148, 246, 76, 253, 173, 227, + 32, 182, 122, 145, 250, 247, 253, 60, 93, 174, 90, 183, 140, 140, 210, 37, + 201, 208, 222, 241, 234, 10, 11, 68, 215, 76, 202, 233, 142, 81, 77, 205, + 182, 4, 18, 134, 184, 52, 46, 119, 154, 62, 194, 148, 198, 238, 166, 90, + 94, 177, 165, 221, 246, 192, 149, 182, 218, 128, 198, 9, 174, 44, 200, 197, + 39, 13, 102, 51, 156, 233, 216, 8, 58, 72, 89, 235, 16, 105, 76, 200, + 219, 227, 105, 35, 44, 240, 225, 135, 9, 188, 121, 215, 101, 42, 15, 0, + 96, 203, 226, 232, 156, 95, 119, 143, 135, 140, 128, 136, 156, 181, 120, 18, + 190, 169, 21, 47, 131, 69, 244, 99, 119, 19, 127, 215, 192, 108, 131, 36, + 2, 44, 21, 121, 141, 45, 87, 153, 148, 213, 74, 118, 150, 49, 180, 109, + 155, 3, 44, 175, 244, 211, 77, 94, 220, 170, 187, 45, 228, 216, 189, 233, + 49, 206, 141, 199, 25, 33, 216, 110, 168, 153, 54, 83, 83, 109, 50, 187, + 98, 251, 57, 52, 101, 217, 248, 132, 3, 5, 149, 206, 125, 219, 51, 55, + 148, 17, 83, 32, 100, 7, 86, 54, 204, 240, 250, 180, 213, 85, 22, 120, + 167, 173, 27, 205, 251, 55, 76, 70, 233, 79, 163, 106, 45, 123, 70, 187, + 76, 122, 56, 33, 166, 44, 247, 51, 103, 150, 214, 252, 124, 179, 191, 102, + 131, 8, 234, 68, 81, 154, 95, 215, 216, 191, 7, 138, 152, 39, 114, 202, + 213, 41, 249, 107, 201, 120, 206, 31, 118, 125, 41, 174, 255, 249, 79, 94, + 85, 105, 186, 173, 115, 72, 104, 207, 125, 244, 77, 229, 64, 122, 157, 134, + 53, 82, 30, 116, 18, 180, 148, 10, 78, 3, 11, 53, 123, 73, 14, 252, + 152, 43, 13, 67, 234, 59, 35, 186, 109, 91, 18, 138, 5, 216, 212, 221, + 125, 250, 105, 140, 236, 33, 203, 48, 73, 170, 75, 226, 238, 216, 182, 122, + 251, 252, 45, 24, 177, 226, 54, 233, 112, 13, 59, 20, 31, 198, 198, 0, + 108, 7, 204, 113, 26, 203, 198, 161, 134, 30, 241, 83, 15, 136, 210, 11, + 222, 42, 237, 142, 126, 230, 104, 144, 92, 15, 76, 45, 174, 188, 61, 110, + 138, 241, 183, 55, 183, 74, 96, 238, 109, 207, 160, 214, 98, 147, 174, 119, + 103, 121, 190, 187, 117, 191, 164, 212, 112, 112, 16, 14, 135, 67, 252, 87, + 67, 46, 220, 194, 209, 83, 110, 99, 199, 169, 244, 20, 42, 60, 85, 149, + 26, 182, 145, 13, 97, 102, 64, 40, 175, 139, 164, 97, 47, 155, 96, 214, + 24, 183, 112, 53, 215, 198, 187, 229, 135, 9, 235, 121, 235, 74, 111, 28, + 113, 150, 138, 222, 165, 108, 73, 20, 101, 103, 63, 34, 87, 80, 147, 164, + 134, 244, 110, 201, 98, 77, 138, 9, 39, 50, 175, 19, 75, 219, 139, 133, + 102, 123, 4, 56, 222, 97, 100, 154, 172, 227, 87, 43, 85, 51, 250, 204, + 2, 195, 129, 79, 120, 166, 122, 42, 239, 252, 168, 4, 82, 192, 153, 22, + 251, 220, 111, 225, 169, 38, 54, 235, 195, 246, 78, 48, 120, 225, 253, 208, + 107, 66, 11, 145, 148, 43, 70, 197, 156, 30, 222, 228, 116, 175, 162, 151, + 185, 150, 237, 52, 222, 125, 179, 90, 31, 82, 159, 86, 179, 161, 66, 86, + 171, 64, 35, 16, 83, 33, 25, 156, 189, 217, 200, 31, 19, 243, 110, 44, + 253, 88, 252, 213, 56, 158, 202, 106, 158, 40, 36, 185, 147, 140, 208, 131, + 26, 85, 129, 172, 172, 136, 221, 94, 200, 168, 166, 198, 175, 106, 99, 55, + 130, 47, 92, 81, 166, 188, 76, 224, 83, 115, 9, 17, 144, 236, 246, 118, + 181, 173, 191, 158, 121, 227, 44, 232, 128, 7, 71, 146, 144, 198, 160, 45, + 237, 3, 163, 67, 55, 54, 6, 158, 11, 27, 121, 175, 255, 102, 156, 168, + 119, 235, 77, 59, 235, 226, 6, 7, 85, 190, 239, 6, 13, 82, 67, 164, + 166, 117, 232, 166, 251, 12, 6, 99, 3, 178, 204, 93, 65, 144, 13, 214, + 238, 33, 137, 76, 4, 131, 45, 129, 226, 248, 174, 47, 203, 60, 78, 237, + 164, 85, 158, 150, 56, 8, 234, 40, 67, 197, 21, 108, 184, 46, 196, 40, + 143, 34, 25, 151, 65, 130, 107, 194, 20, 108, 155, 45, 36, 104, 145, 252, + 8, 3, 78, 111, 117, 209, 240, 245, 32, 188, 220, 63, 191, 245, 202, 44, + 215, 75, 133, 48, 72, 13, 77, 35, 100, 85, 180, 122, 110, 121, 27, 187, + 4, 235, 111, 14, 198, 215, 96, 163, 78, 65, 130, 182, 172, 179, 187, 205, + 86, 232, 32, 64, 67, 86, 20, 36, 193, 84, 118, 220, 32, 99, 26, 161, + 9, 234, 10, 120, 42, 157, 99, 44, 162, 115, 77, 12, 37, 139, 131, 235, + 124, 232, 150, 75, 13, 88, 234, 91, 175, 52, 180, 27, 238, 13, 31, 14, + 31, 61, 145, 91, 150, 147, 3, 168, 234, 170, 182, 211, 221, 157, 77, 29, + 60, 126, 116, 248, 232, 139, 39, 159, 63, 57, 108, 224, 226, 142, 27, 97, + 90, 93, 120, 212, 154, 33, 214, 56, 197, 132, 9, 159, 162, 195, 58, 179, + 203, 89, 61, 130, 157, 58, 146, 206, 128, 85, 218, 39, 97, 53, 52, 94, + 83, 139, 174, 241, 158, 5, 198, 53, 10, 204, 222, 244, 45, 112, 236, 155, + 200, 58, 59, 241, 207, 19, 139, 118, 56, 251, 231, 93, 132, 6, 144, 18, + 134, 192, 192, 134, 154, 68, 107, 215, 255, 100, 163, 153, 47, 218, 143, 31, + 117, 84, 147, 166, 141, 99, 249, 111, 27, 209, 177, 119, 15, 234, 20, 35, + 36, 77, 82, 82, 56, 82, 34, 111, 155, 60, 229, 153, 86, 58, 231, 207, + 101, 154, 77, 243, 75, 133, 70, 6, 78, 130, 168, 118, 77, 21, 205, 182, + 152, 164, 142, 166, 78, 148, 53, 85, 3, 55, 119, 189, 119, 66, 2, 200, + 51, 69, 33, 13, 41, 52, 143, 252, 120, 125, 31, 122, 73, 47, 159, 69, + 55, 73, 218, 9, 105, 166, 188, 215, 180, 62, 37, 57, 0, 121, 144, 202, + 3, 45, 223, 166, 116, 90, 26, 96, 44, 168, 255, 94, 211, 47, 46, 149, + 226, 196, 78, 221, 66, 159, 92, 202, 85, 100, 6, 131, 88, 143, 73, 19, + 254, 46, 163, 214, 137, 151, 0, 85, 136, 99, 128, 222, 74, 158, 65, 227, + 45, 122, 238, 181, 47, 184, 148, 59, 112, 17, 235, 239, 236, 225, 210, 239, + 130, 135, 125, 229, 117, 217, 84, 85, 73, 3, 101, 7, 182, 206, 221, 188, + 159, 39, 205, 226, 135, 196, 109, 233, 150, 89, 222, 221, 214, 52, 105, 26, + 214, 149, 219, 118, 83, 197, 181, 212, 195, 172, 76, 64, 171, 201, 116, 180, + 19, 23, 2, 146, 136, 80, 148, 132, 74, 154, 68, 255, 135, 198, 161, 92, + 184, 45, 170, 105, 253, 59, 77, 174, 47, 154, 70, 121, 229, 118, 113, 27, + 209, 170, 21, 19, 120, 83, 45, 210, 143, 140, 79, 73, 57, 223, 124, 192, + 110, 35, 81, 101, 180, 112, 142, 23, 191, 165, 186, 34, 66, 127, 236, 26, + 11, 86, 85, 125, 153, 163, 63, 63, 43, 169, 144, 94, 129, 147, 220, 29, + 210, 217, 181, 227, 7, 218, 192, 222, 184, 78, 27, 233, 226, 167, 255, 92, + 23, 138, 55, 33, 196, 235, 182, 61, 89, 87, 21, 106, 56, 174, 1, 123, + 98, 108, 184, 46, 60, 232, 1, 46, 61, 24, 81, 128, 56, 245, 243, 225, + 104, 153, 78, 167, 139, 132, 127, 223, 52, 117, 146, 111, 239, 228, 242, 60, + 105, 214, 1, 124, 80, 39, 26, 112, 221, 146, 242, 83, 77, 109, 25, 58, + 233, 39, 62, 36, 27, 114, 122, 205, 54, 97, 48, 96, 106, 22, 165, 170, + 77, 205, 41, 209, 41, 230, 33, 193, 212, 231, 237, 1, 178, 58, 195, 142, + 22, 55, 167, 205, 136, 89, 115, 61, 114, 149, 20, 73, 76, 234, 168, 166, + 62, 10, 175, 143, 251, 54, 205, 113, 175, 110, 111, 123, 249, 59, 219, 198, + 60, 125, 91, 90, 190, 157, 3, 176, 196, 102, 138, 246, 135, 229, 166, 93, + 80, 98, 79, 178, 65, 138, 163, 85, 90, 193, 254, 44, 146, 10, 121, 173, + 78, 216, 64, 208, 59, 116, 5, 145, 88, 106, 26, 146, 189, 68, 39, 229, + 145, 115, 141, 27, 203, 192, 98, 238, 114, 181, 233, 120, 153, 139, 42, 100, + 90, 179, 81, 235, 233, 100, 133, 36, 53, 16, 199, 120, 232, 208, 114, 250, + 143, 93, 167, 255, 38, 174, 190, 77, 194, 39, 177, 123, 64, 51, 140, 14, + 89, 137, 47, 214, 229, 185, 45, 163, 163, 255, 92, 30, 13, 195, 206, 32, + 103, 176, 76, 166, 41, 249, 94, 9, 243, 137, 196, 53, 167, 170, 41, 101, + 102, 109, 140, 228, 192, 11, 12, 211, 45, 67, 57, 16, 62, 47, 39, 216, + 137, 218, 117, 210, 65, 97, 52, 59, 55, 91, 100, 170, 60, 115, 51, 116, + 211, 87, 33, 227, 36, 184, 10, 41, 12, 149, 180, 206, 73, 251, 65, 75, + 24, 188, 201, 148, 127, 5, 165, 176, 198, 221, 224, 215, 50, 26, 242, 95, + 34, 246, 192, 237, 19, 19, 23, 38, 36, 154, 161, 124, 175, 106, 133, 79, + 91, 135, 251, 95, 4, 31, 230, 193, 40, 56, 109, 93, 195, 247, 155, 211, + 22, 252, 148, 132, 29, 104, 61, 65, 33, 242, 156, 244, 35, 18, 93, 94, + 58, 140, 56, 43, 113, 150, 146, 119, 124, 68, 97, 200, 196, 0, 72, 216, + 52, 51, 140, 210, 100, 202, 212, 147, 149, 96, 104, 38, 173, 162, 89, 186, + 55, 153, 101, 209, 189, 173, 77, 171, 201, 92, 173, 159, 66, 173, 206, 184, + 41, 26, 54, 73, 88, 5, 140, 61, 33, 216, 53, 115, 97, 242, 235, 198, + 215, 68, 137, 41, 138, 17, 87, 248, 43, 121, 10, 203, 247, 240, 244, 244, + 230, 244, 148, 84, 200, 217, 233, 195, 207, 43, 248, 46, 140, 132, 132, 189, + 172, 89, 203, 108, 101, 59, 239, 180, 153, 57, 143, 196, 6, 97, 146, 160, + 55, 116, 19, 227, 79, 62, 245, 5, 19, 164, 74, 213, 164, 198, 179, 211, + 246, 19, 84, 119, 154, 156, 218, 37, 178, 251, 164, 160, 228, 49, 174, 21, + 14, 41, 52, 16, 118, 215, 11, 94, 10, 55, 56, 4, 26, 75, 96, 34, + 4, 146, 186, 241, 96, 117, 24, 5, 199, 12, 11, 67, 148, 27, 246, 80, + 54, 159, 76, 183, 69, 53, 71, 146, 41, 210, 216, 225, 33, 199, 44, 61, + 210, 43, 69, 103, 145, 9, 169, 21, 192, 147, 74, 14, 151, 100, 42, 236, + 200, 208, 149, 37, 160, 151, 221, 244, 206, 177, 28, 19, 203, 103, 139, 41, + 56, 167, 6, 96, 162, 204, 196, 220, 35, 191, 87, 87, 103, 198, 60, 25, + 62, 83, 138, 42, 17, 150, 180, 37, 2, 200, 12, 198, 56, 53, 122, 115, + 53, 36, 146, 167, 103, 62, 42, 121, 79, 190, 54, 181, 253, 21, 137, 66, + 37, 43, 239, 164, 71, 17, 182, 70, 34, 104, 80, 254, 22, 149, 107, 150, + 243, 97, 136, 77, 138, 197, 114, 140, 101, 236, 127, 35, 159, 83, 19, 148, + 151, 102, 198, 139, 244, 235, 175, 124, 175, 44, 242, 57, 141, 131, 130, 219, + 242, 171, 63, 253, 201, 125, 197, 81, 113, 165, 26, 191, 114, 66, 226, 74, + 45, 247, 13, 85, 50, 232, 149, 203, 124, 50, 10, 131, 17, 252, 251, 18, + 254, 61, 195, 79, 248, 128, 191, 95, 74, 127, 24, 21, 87, 213, 167, 96, + 184, 186, 241, 103, 207, 184, 8, 145, 67, 91, 202, 116, 195, 96, 63, 12, + 246, 194, 160, 111, 245, 251, 25, 215, 83, 1, 128, 3, 91, 216, 168, 99, + 247, 202, 224, 220, 89, 103, 185, 105, 250, 127, 186, 115, 163, 87, 254, 220, + 246, 247, 249, 144, 202, 96, 186, 246, 47, 14, 251, 170, 223, 57, 191, 246, + 156, 95, 125, 231, 215, 103, 206, 175, 63, 57, 191, 126, 117, 126, 253, 236, + 252, 146, 136, 195, 234, 167, 4, 37, 70, 34, 130, 195, 208, 24, 144, 176, + 141, 164, 93, 168, 161, 227, 162, 161, 206, 6, 157, 104, 82, 182, 145, 248, + 136, 115, 253, 121, 78, 95, 138, 185, 124, 124, 168, 212, 131, 101, 116, 101, + 190, 113, 69, 179, 112, 248, 52, 205, 212, 123, 160, 185, 165, 225, 82, 30, + 194, 39, 183, 3, 231, 66, 125, 30, 168, 47, 252, 230, 130, 186, 68, 26, + 7, 63, 227, 73, 81, 209, 103, 146, 46, 156, 158, 100, 168, 106, 164, 241, + 154, 138, 1, 50, 192, 143, 25, 92, 6, 244, 153, 78, 114, 250, 92, 0, + 11, 128, 95, 230, 209, 186, 164, 122, 105, 70, 5, 210, 50, 227, 129, 192, + 151, 245, 146, 191, 164, 217, 204, 233, 9, 159, 72, 97, 53, 42, 0, 25, + 192, 58, 252, 13, 165, 248, 252, 109, 154, 22, 170, 5, 252, 148, 37, 3, + 232, 147, 143, 3, 249, 28, 14, 240, 11, 175, 163, 233, 70, 175, 38, 220, + 157, 83, 250, 224, 102, 204, 42, 102, 178, 29, 171, 34, 167, 2, 5, 14, + 198, 61, 104, 240, 172, 146, 104, 218, 62, 52, 23, 184, 2, 222, 153, 51, + 197, 185, 12, 182, 9, 120, 11, 27, 199, 0, 72, 252, 169, 62, 98, 249, + 164, 89, 149, 255, 226, 125, 41, 171, 169, 51, 139, 178, 0, 52, 209, 134, + 155, 148, 242, 80, 151, 188, 166, 178, 217, 106, 139, 1, 191, 225, 199, 149, + 26, 144, 5, 176, 54, 213, 206, 176, 177, 9, 175, 58, 90, 100, 68, 102, + 131, 198, 172, 198, 42, 216, 150, 66, 90, 161, 108, 226, 201, 40, 43, 33, + 87, 31, 56, 55, 57, 44, 248, 154, 124, 222, 127, 190, 191, 223, 200, 230, + 97, 184, 25, 0, 175, 15, 97, 22, 98, 243, 99, 10, 133, 160, 18, 144, + 144, 73, 149, 232, 88, 141, 165, 21, 87, 81, 161, 133, 103, 138, 7, 224, + 123, 136, 131, 64, 232, 40, 85, 116, 27, 248, 114, 254, 185, 240, 235, 170, + 116, 211, 184, 24, 152, 175, 194, 49, 236, 213, 50, 10, 199, 105, 57, 86, + 60, 61, 172, 62, 143, 143, 175, 67, 199, 98, 69, 77, 31, 207, 74, 247, + 234, 231, 131, 126, 251, 96, 175, 252, 249, 160, 211, 233, 183, 157, 22, 254, + 76, 123, 124, 176, 183, 74, 247, 168, 3, 40, 114, 52, 236, 104, 89, 165, + 63, 26, 60, 129, 116, 157, 134, 0, 177, 33, 64, 179, 59, 2, 37, 57, + 39, 227, 107, 10, 131, 196, 121, 83, 85, 104, 72, 169, 36, 225, 51, 245, + 93, 13, 143, 221, 203, 27, 202, 240, 131, 219, 24, 86, 58, 41, 209, 152, + 165, 144, 209, 248, 181, 55, 20, 119, 175, 140, 8, 217, 192, 140, 248, 117, + 112, 151, 175, 181, 212, 179, 6, 162, 208, 77, 26, 114, 71, 91, 250, 17, + 93, 174, 36, 3, 214, 164, 22, 63, 142, 198, 105, 141, 7, 147, 166, 5, + 33, 89, 58, 115, 126, 168, 65, 221, 122, 72, 24, 171, 254, 176, 170, 63, + 100, 4, 38, 12, 28, 218, 136, 226, 16, 109, 209, 207, 60, 189, 72, 50, + 7, 90, 140, 146, 217, 201, 240, 68, 65, 122, 136, 212, 226, 169, 12, 130, + 246, 12, 88, 130, 164, 227, 110, 215, 16, 216, 193, 98, 157, 116, 182, 79, + 147, 240, 231, 46, 106, 106, 119, 101, 96, 109, 100, 9, 173, 18, 136, 87, + 237, 2, 29, 189, 192, 247, 238, 26, 217, 25, 226, 214, 153, 133, 116, 29, + 246, 249, 222, 226, 125, 33, 167, 87, 101, 142, 229, 39, 30, 84, 35, 147, + 156, 100, 5, 209, 145, 27, 114, 224, 7, 2, 162, 121, 122, 128, 62, 47, + 66, 3, 138, 153, 7, 34, 191, 125, 6, 70, 133, 198, 39, 74, 78, 243, + 133, 160, 55, 206, 156, 232, 76, 46, 85, 225, 85, 137, 236, 100, 169, 133, + 232, 88, 118, 1, 2, 27, 79, 115, 154, 209, 233, 84, 39, 58, 124, 21, + 114, 232, 163, 100, 60, 193, 27, 2, 40, 212, 164, 252, 119, 167, 226, 234, + 128, 28, 101, 14, 79, 109, 33, 129, 229, 92, 68, 17, 190, 58, 83, 109, + 163, 77, 124, 59, 62, 79, 98, 140, 250, 199, 165, 52, 31, 127, 6, 5, + 79, 168, 96, 58, 107, 66, 127, 245, 249, 136, 231, 218, 182, 147, 78, 247, + 185, 123, 160, 20, 185, 83, 127, 138, 151, 123, 83, 89, 186, 202, 155, 138, + 55, 189, 64, 82, 200, 125, 212, 48, 6, 107, 0, 77, 42, 168, 134, 145, + 52, 15, 195, 27, 131, 60, 68, 82, 196, 45, 199, 212, 135, 251, 140, 168, + 0, 239, 145, 198, 94, 182, 9, 14, 93, 253, 244, 212, 21, 3, 177, 238, + 9, 77, 181, 117, 28, 198, 204, 202, 217, 110, 33, 107, 226, 231, 250, 226, + 139, 238, 68, 235, 244, 183, 236, 162, 121, 207, 46, 154, 55, 237, 162, 121, + 215, 46, 182, 110, 219, 197, 214, 125, 187, 104, 216, 184, 139, 166, 145, 220, + 177, 117, 23, 77, 227, 217, 50, 152, 45, 35, 105, 216, 191, 139, 166, 13, + 188, 104, 216, 193, 139, 45, 91, 184, 101, 15, 85, 140, 72, 161, 207, 74, + 75, 222, 76, 206, 47, 154, 243, 144, 44, 108, 180, 131, 138, 1, 191, 117, + 35, 153, 38, 101, 76, 68, 223, 1, 31, 115, 246, 201, 144, 145, 48, 19, + 176, 54, 46, 138, 152, 144, 85, 152, 196, 120, 9, 170, 242, 66, 189, 121, + 190, 114, 129, 113, 18, 238, 14, 71, 85, 222, 69, 115, 228, 18, 195, 73, + 12, 240, 87, 150, 96, 134, 169, 138, 164, 168, 240, 83, 249, 211, 212, 229, + 168, 50, 240, 69, 82, 172, 218, 81, 56, 9, 43, 111, 120, 50, 154, 104, + 175, 61, 236, 86, 157, 96, 63, 152, 236, 25, 79, 51, 191, 149, 242, 50, + 162, 86, 24, 119, 226, 175, 210, 248, 207, 148, 206, 197, 221, 16, 190, 214, + 48, 129, 110, 234, 42, 106, 108, 146, 192, 4, 149, 231, 75, 87, 92, 95, + 36, 100, 167, 50, 206, 130, 253, 44, 210, 233, 52, 201, 182, 144, 233, 11, + 17, 174, 47, 146, 108, 110, 52, 126, 150, 57, 139, 82, 235, 215, 18, 163, + 214, 212, 21, 142, 19, 139, 213, 130, 68, 161, 74, 21, 173, 113, 50, 8, + 23, 98, 158, 214, 168, 208, 148, 230, 28, 21, 100, 67, 115, 164, 252, 80, + 185, 56, 6, 46, 85, 121, 171, 46, 214, 85, 72, 254, 17, 45, 43, 69, + 42, 133, 243, 248, 35, 27, 86, 134, 220, 42, 115, 235, 31, 217, 182, 82, + 217, 72, 246, 44, 71, 65, 245, 71, 180, 175, 21, 211, 42, 128, 51, 201, + 251, 149, 190, 115, 187, 162, 243, 242, 124, 122, 119, 69, 212, 111, 227, 98, + 111, 105, 160, 188, 127, 11, 168, 123, 85, 171, 203, 10, 107, 207, 229, 75, + 78, 106, 227, 28, 211, 165, 71, 162, 191, 242, 126, 71, 222, 239, 11, 159, + 164, 247, 126, 175, 228, 62, 81, 191, 99, 239, 189, 210, 2, 127, 111, 199, + 242, 38, 149, 98, 154, 97, 72, 151, 80, 197, 118, 65, 81, 76, 82, 224, + 214, 57, 248, 145, 132, 147, 28, 96, 14, 203, 224, 101, 178, 142, 43, 18, + 90, 192, 115, 33, 220, 240, 186, 248, 238, 160, 139, 188, 228, 93, 0, 225, + 154, 128, 221, 31, 56, 174, 188, 133, 219, 120, 191, 63, 122, 191, 99, 165, + 4, 36, 127, 11, 138, 87, 97, 7, 79, 82, 122, 85, 94, 4, 55, 25, + 32, 253, 39, 68, 244, 31, 1, 215, 87, 222, 30, 111, 188, 223, 31, 189, + 223, 241, 171, 123, 13, 93, 66, 242, 252, 103, 134, 126, 204, 33, 11, 203, + 196, 243, 152, 116, 13, 29, 91, 18, 136, 67, 20, 170, 38, 1, 177, 50, + 67, 33, 17, 164, 8, 200, 219, 51, 201, 29, 180, 20, 27, 4, 103, 208, + 146, 6, 175, 236, 152, 108, 162, 120, 61, 36, 226, 30, 143, 30, 96, 245, + 224, 208, 199, 217, 230, 50, 218, 136, 143, 215, 146, 14, 169, 184, 97, 171, + 74, 46, 48, 167, 70, 10, 175, 145, 26, 233, 147, 219, 104, 53, 132, 73, + 122, 181, 232, 105, 45, 62, 125, 122, 22, 150, 89, 153, 211, 230, 75, 32, + 82, 243, 80, 164, 28, 101, 36, 121, 151, 56, 52, 185, 145, 190, 234, 219, + 211, 167, 186, 46, 219, 99, 236, 219, 123, 122, 238, 62, 5, 94, 82, 29, + 240, 210, 126, 227, 18, 100, 118, 44, 120, 187, 148, 74, 130, 160, 67, 222, + 58, 74, 88, 246, 254, 213, 187, 220, 136, 180, 4, 30, 61, 7, 64, 168, + 198, 208, 41, 190, 144, 132, 11, 133, 147, 203, 217, 86, 50, 82, 146, 143, + 54, 38, 126, 254, 24, 198, 52, 162, 78, 29, 68, 221, 109, 250, 189, 39, + 45, 85, 217, 219, 95, 99, 92, 88, 137, 105, 169, 253, 142, 183, 13, 255, + 62, 3, 127, 173, 7, 94, 227, 98, 127, 243, 57, 83, 228, 32, 15, 86, + 199, 149, 50, 254, 147, 53, 30, 120, 16, 62, 217, 74, 253, 124, 239, 66, + 206, 183, 238, 207, 175, 106, 244, 252, 177, 60, 193, 72, 251, 77, 41, 21, + 210, 129, 119, 131, 120, 177, 241, 210, 131, 90, 147, 233, 161, 34, 119, 205, + 29, 211, 52, 212, 151, 30, 28, 185, 60, 129, 191, 45, 255, 62, 26, 11, + 2, 207, 33, 86, 216, 72, 163, 216, 147, 196, 18, 38, 193, 166, 127, 149, + 171, 36, 226, 238, 181, 69, 186, 74, 238, 254, 101, 48, 10, 78, 130, 239, + 195, 111, 195, 175, 2, 137, 48, 98, 89, 129, 124, 255, 237, 87, 44, 146, + 160, 132, 212, 53, 219, 11, 84, 96, 98, 4, 16, 89, 31, 60, 178, 34, + 171, 203, 105, 138, 42, 244, 166, 147, 4, 53, 154, 228, 23, 18, 209, 186, + 42, 48, 73, 137, 24, 181, 152, 144, 32, 52, 2, 239, 170, 229, 137, 105, + 63, 127, 1, 44, 232, 176, 150, 179, 11, 109, 142, 73, 235, 75, 9, 28, + 62, 96, 164, 193, 36, 43, 125, 219, 113, 67, 176, 124, 42, 126, 225, 192, + 50, 88, 38, 16, 214, 249, 96, 178, 194, 245, 255, 183, 83, 80, 89, 125, + 55, 223, 159, 91, 209, 143, 68, 170, 251, 3, 105, 208, 205, 214, 190, 48, + 37, 250, 31, 216, 209, 199, 173, 29, 113, 114, 245, 63, 176, 171, 120, 251, + 250, 9, 138, 252, 3, 59, 83, 134, 130, 146, 169, 54, 149, 40, 121, 36, + 90, 181, 3, 68, 24, 131, 1, 14, 48, 168, 211, 253, 72, 242, 93, 167, + 203, 101, 18, 249, 58, 141, 101, 84, 178, 159, 10, 22, 111, 150, 225, 41, + 179, 80, 13, 120, 137, 36, 94, 225, 166, 15, 122, 159, 15, 191, 56, 248, + 194, 13, 123, 110, 215, 95, 165, 126, 3, 171, 212, 105, 65, 155, 215, 111, + 111, 67, 153, 152, 70, 136, 208, 167, 185, 144, 107, 218, 182, 72, 227, 247, + 161, 40, 66, 172, 124, 20, 193, 58, 75, 41, 141, 229, 52, 69, 9, 246, + 100, 93, 185, 180, 135, 209, 11, 53, 246, 225, 182, 69, 186, 35, 36, 216, + 237, 198, 116, 114, 88, 60, 207, 67, 23, 197, 21, 249, 122, 126, 206, 105, + 88, 100, 144, 221, 199, 161, 151, 225, 206, 185, 122, 201, 183, 60, 95, 68, + 90, 218, 114, 228, 158, 120, 21, 220, 203, 41, 200, 177, 255, 136, 214, 146, + 108, 140, 108, 249, 101, 209, 21, 238, 190, 155, 48, 146, 92, 68, 98, 197, + 24, 131, 10, 177, 70, 86, 118, 43, 110, 111, 182, 216, 31, 9, 69, 147, + 210, 201, 237, 196, 138, 148, 137, 78, 42, 44, 54, 241, 189, 79, 208, 210, + 169, 121, 16, 232, 151, 130, 119, 11, 71, 220, 86, 51, 119, 187, 208, 142, + 37, 22, 156, 55, 218, 156, 178, 184, 122, 115, 219, 146, 170, 50, 72, 157, + 115, 110, 230, 242, 142, 53, 165, 101, 116, 7, 116, 255, 53, 173, 119, 247, + 255, 135, 133, 245, 165, 99, 66, 10, 68, 139, 120, 189, 88, 139, 117, 4, + 231, 251, 48, 198, 57, 42, 17, 140, 138, 239, 79, 249, 164, 26, 196, 153, + 201, 34, 241, 165, 112, 246, 30, 158, 4, 209, 32, 140, 68, 37, 244, 186, + 59, 12, 206, 212, 141, 201, 129, 190, 34, 91, 241, 216, 213, 33, 71, 49, + 137, 183, 21, 131, 85, 66, 250, 199, 121, 50, 155, 193, 218, 18, 249, 34, + 114, 197, 15, 219, 160, 135, 235, 191, 110, 115, 255, 122, 0, 194, 23, 232, + 32, 43, 37, 69, 241, 209, 71, 203, 110, 149, 163, 57, 73, 154, 54, 164, + 205, 146, 34, 205, 167, 42, 1, 147, 171, 105, 161, 232, 167, 81, 48, 75, + 88, 198, 168, 55, 123, 251, 200, 218, 159, 190, 14, 239, 53, 182, 200, 228, + 98, 39, 200, 22, 18, 39, 208, 188, 167, 117, 187, 88, 139, 233, 244, 252, + 50, 51, 194, 105, 203, 200, 46, 172, 207, 89, 122, 226, 49, 210, 48, 150, + 101, 178, 184, 160, 112, 34, 20, 250, 205, 74, 197, 141, 92, 34, 146, 107, + 206, 74, 136, 135, 55, 55, 224, 12, 2, 9, 82, 217, 73, 129, 26, 183, + 107, 10, 29, 35, 219, 206, 47, 126, 100, 10, 178, 212, 244, 158, 237, 150, + 244, 227, 201, 135, 90, 244, 86, 233, 100, 61, 233, 58, 237, 156, 4, 63, + 158, 172, 206, 66, 248, 179, 95, 158, 193, 106, 211, 151, 189, 246, 191, 96, + 201, 207, 132, 116, 109, 163, 198, 5, 216, 97, 169, 241, 47, 230, 121, 182, + 12, 201, 101, 217, 182, 13, 111, 21, 254, 43, 44, 27, 134, 248, 181, 132, + 77, 236, 195, 9, 80, 17, 20, 145, 46, 135, 235, 168, 68, 252, 165, 110, + 72, 180, 237, 80, 251, 0, 157, 80, 68, 55, 142, 33, 168, 143, 169, 244, + 53, 26, 213, 24, 147, 79, 70, 245, 142, 41, 162, 155, 28, 95, 227, 177, + 173, 249, 116, 27, 200, 114, 29, 4, 153, 177, 230, 145, 61, 101, 69, 92, + 21, 121, 89, 182, 127, 12, 127, 82, 202, 108, 122, 160, 228, 100, 29, 205, + 54, 77, 243, 202, 46, 53, 205, 171, 122, 25, 146, 68, 252, 40, 172, 125, + 91, 186, 214, 232, 160, 19, 54, 116, 143, 25, 33, 161, 93, 180, 5, 49, + 129, 162, 194, 113, 124, 190, 206, 62, 140, 201, 167, 68, 58, 196, 130, 218, + 161, 177, 52, 125, 74, 30, 194, 246, 177, 81, 198, 211, 3, 157, 213, 208, + 238, 212, 178, 136, 52, 131, 70, 19, 190, 246, 113, 56, 102, 133, 64, 168, + 20, 172, 155, 177, 185, 141, 140, 86, 169, 105, 10, 112, 192, 161, 254, 87, + 225, 56, 155, 160, 154, 167, 164, 217, 160, 240, 102, 140, 140, 7, 133, 46, + 83, 131, 147, 53, 209, 16, 131, 54, 13, 46, 57, 242, 141, 39, 223, 65, + 153, 228, 219, 246, 154, 145, 239, 90, 233, 141, 28, 51, 158, 239, 222, 58, + 146, 75, 75, 43, 77, 189, 213, 36, 150, 208, 234, 91, 11, 53, 70, 10, + 227, 172, 51, 52, 162, 98, 132, 128, 108, 60, 163, 18, 133, 160, 140, 17, + 51, 176, 106, 52, 10, 118, 95, 181, 27, 4, 0, 151, 156, 99, 225, 14, + 141, 236, 128, 188, 118, 148, 60, 234, 214, 137, 138, 32, 235, 56, 196, 15, + 88, 66, 155, 240, 185, 109, 83, 44, 21, 154, 184, 86, 24, 139, 43, 87, + 190, 164, 14, 131, 76, 67, 4, 9, 94, 140, 148, 58, 121, 215, 51, 243, + 182, 94, 237, 218, 136, 214, 82, 194, 97, 176, 94, 119, 197, 151, 201, 50, + 103, 98, 163, 194, 96, 54, 164, 156, 163, 144, 190, 168, 150, 51, 42, 186, + 131, 145, 98, 52, 127, 13, 14, 71, 24, 15, 133, 194, 201, 63, 28, 205, + 139, 20, 29, 33, 30, 141, 38, 105, 188, 134, 127, 193, 175, 78, 251, 143, + 71, 11, 160, 127, 63, 230, 18, 195, 55, 180, 45, 198, 26, 86, 173, 113, + 220, 131, 209, 52, 45, 210, 248, 124, 145, 84, 50, 170, 245, 18, 56, 43, + 26, 149, 186, 48, 189, 110, 15, 71, 203, 180, 40, 96, 53, 235, 218, 68, + 127, 103, 129, 72, 152, 242, 1, 81, 113, 84, 198, 164, 57, 131, 223, 48, + 199, 248, 156, 194, 69, 55, 152, 34, 177, 122, 237, 18, 77, 155, 220, 203, + 201, 191, 25, 88, 70, 33, 166, 36, 72, 241, 59, 111, 143, 121, 89, 218, + 250, 65, 87, 135, 117, 178, 171, 51, 229, 183, 51, 195, 37, 51, 92, 195, + 177, 207, 48, 192, 127, 199, 174, 81, 212, 177, 189, 162, 68, 110, 57, 30, + 198, 42, 210, 5, 207, 134, 171, 40, 65, 137, 231, 200, 44, 124, 221, 54, + 42, 74, 133, 5, 166, 160, 138, 37, 231, 123, 69, 147, 123, 37, 244, 193, + 141, 55, 98, 95, 244, 103, 94, 225, 114, 199, 152, 123, 200, 153, 128, 190, + 45, 250, 198, 48, 187, 73, 161, 191, 183, 167, 238, 4, 233, 72, 184, 92, + 76, 209, 75, 8, 93, 21, 236, 247, 189, 130, 211, 244, 34, 45, 157, 34, + 63, 255, 44, 215, 130, 42, 2, 20, 12, 161, 226, 180, 102, 255, 105, 15, + 96, 228, 53, 12, 100, 204, 172, 187, 125, 24, 141, 197, 155, 6, 51, 114, + 71, 227, 194, 23, 86, 242, 135, 167, 239, 75, 99, 182, 96, 173, 11, 26, + 119, 175, 75, 187, 84, 49, 175, 149, 82, 76, 70, 71, 107, 187, 98, 56, + 151, 191, 52, 25, 39, 232, 58, 88, 96, 61, 7, 50, 205, 106, 155, 140, + 134, 189, 182, 205, 112, 23, 86, 73, 178, 229, 245, 74, 194, 51, 160, 81, + 170, 243, 101, 99, 112, 197, 152, 236, 148, 189, 42, 240, 12, 208, 145, 213, + 110, 169, 13, 65, 172, 165, 118, 139, 88, 54, 174, 186, 72, 133, 50, 225, + 172, 106, 222, 235, 152, 77, 163, 189, 42, 231, 155, 21, 225, 92, 192, 63, + 77, 163, 216, 82, 97, 66, 21, 168, 248, 54, 21, 67, 204, 214, 189, 219, + 107, 171, 193, 54, 158, 209, 87, 91, 89, 157, 218, 33, 149, 10, 240, 145, + 221, 180, 130, 43, 155, 186, 71, 197, 76, 145, 94, 213, 15, 174, 171, 89, + 210, 135, 248, 254, 7, 87, 166, 197, 237, 43, 100, 185, 237, 216, 0, 219, + 106, 200, 167, 41, 70, 215, 67, 163, 157, 204, 38, 254, 210, 104, 222, 254, + 65, 17, 118, 248, 139, 166, 204, 205, 187, 168, 133, 141, 132, 185, 71, 211, + 64, 146, 206, 77, 23, 240, 35, 201, 152, 142, 235, 243, 119, 166, 143, 173, + 226, 155, 164, 173, 72, 157, 118, 6, 139, 150, 73, 176, 70, 10, 142, 142, + 157, 54, 195, 16, 231, 181, 70, 98, 174, 204, 129, 221, 81, 70, 207, 178, + 14, 156, 246, 186, 180, 64, 8, 86, 68, 83, 110, 113, 190, 40, 191, 114, + 43, 116, 165, 158, 191, 112, 77, 93, 175, 202, 100, 61, 205, 205, 0, 164, + 69, 111, 40, 134, 108, 5, 114, 122, 29, 94, 132, 151, 97, 132, 156, 150, + 234, 23, 179, 202, 137, 137, 187, 153, 168, 85, 197, 41, 124, 240, 194, 25, + 72, 173, 162, 161, 177, 97, 0, 205, 243, 228, 177, 33, 229, 40, 4, 71, + 185, 41, 209, 213, 240, 184, 247, 99, 48, 10, 190, 106, 158, 106, 121, 49, + 181, 103, 168, 219, 130, 139, 157, 160, 148, 37, 24, 211, 132, 227, 121, 165, + 46, 176, 85, 232, 3, 102, 96, 65, 86, 152, 158, 118, 106, 254, 144, 166, + 78, 86, 162, 118, 21, 186, 245, 123, 53, 13, 112, 17, 32, 74, 245, 253, + 172, 72, 104, 153, 180, 168, 171, 248, 128, 10, 157, 170, 13, 188, 157, 126, + 181, 74, 165, 101, 194, 64, 54, 58, 234, 2, 11, 244, 75, 251, 157, 26, + 212, 187, 240, 133, 250, 250, 34, 228, 228, 17, 104, 35, 78, 17, 100, 233, + 11, 82, 168, 83, 104, 90, 6, 143, 181, 201, 180, 62, 82, 152, 128, 251, + 123, 199, 156, 116, 230, 133, 164, 69, 27, 94, 58, 254, 148, 5, 72, 102, + 222, 145, 58, 47, 104, 140, 200, 150, 90, 42, 49, 47, 150, 30, 13, 151, + 187, 150, 236, 207, 202, 117, 156, 53, 196, 44, 210, 246, 24, 126, 43, 169, + 83, 228, 137, 141, 124, 127, 54, 207, 61, 143, 248, 110, 53, 4, 114, 230, + 99, 172, 133, 54, 0, 174, 26, 210, 137, 131, 180, 197, 147, 142, 179, 178, + 166, 194, 243, 92, 158, 231, 139, 196, 216, 177, 176, 182, 81, 91, 240, 41, + 253, 0, 181, 219, 46, 61, 48, 214, 190, 125, 229, 42, 34, 57, 156, 109, + 157, 96, 107, 77, 217, 10, 156, 99, 199, 202, 52, 116, 82, 109, 10, 31, + 140, 198, 102, 150, 244, 229, 57, 93, 10, 209, 85, 42, 65, 147, 61, 168, + 66, 150, 176, 65, 146, 247, 142, 35, 208, 64, 243, 233, 106, 205, 204, 5, + 75, 243, 158, 235, 104, 52, 108, 1, 94, 186, 169, 147, 179, 169, 14, 154, + 1, 11, 175, 100, 12, 117, 255, 139, 23, 9, 138, 187, 40, 218, 153, 150, + 18, 112, 154, 40, 146, 66, 2, 203, 84, 148, 86, 242, 79, 171, 47, 79, + 26, 168, 132, 129, 42, 68, 96, 96, 98, 58, 241, 43, 245, 130, 30, 243, + 56, 13, 215, 197, 17, 118, 100, 143, 149, 241, 165, 31, 112, 199, 13, 139, + 72, 255, 25, 214, 140, 151, 43, 246, 86, 133, 5, 63, 74, 163, 137, 163, + 192, 168, 121, 138, 164, 247, 78, 242, 73, 96, 5, 205, 9, 26, 180, 1, + 220, 196, 120, 87, 247, 194, 45, 217, 108, 73, 155, 197, 95, 29, 160, 238, + 171, 100, 75, 40, 79, 51, 72, 123, 100, 227, 221, 99, 53, 176, 219, 208, + 205, 227, 71, 245, 113, 29, 115, 227, 8, 172, 104, 74, 114, 78, 121, 240, + 236, 36, 17, 20, 12, 148, 26, 151, 13, 60, 10, 126, 208, 6, 151, 20, + 148, 212, 142, 82, 175, 183, 178, 97, 19, 121, 136, 184, 67, 219, 68, 251, + 223, 212, 172, 66, 208, 141, 17, 7, 214, 96, 127, 187, 134, 145, 58, 239, + 196, 13, 67, 5, 94, 34, 227, 105, 10, 121, 77, 191, 141, 107, 180, 179, + 68, 186, 135, 41, 10, 34, 116, 155, 183, 139, 20, 202, 42, 191, 104, 67, + 187, 117, 198, 51, 45, 199, 216, 95, 172, 12, 93, 201, 196, 167, 172, 5, + 157, 52, 13, 21, 141, 18, 32, 7, 46, 248, 218, 147, 244, 3, 202, 17, + 255, 214, 241, 93, 84, 64, 108, 227, 182, 208, 101, 202, 113, 154, 209, 59, + 234, 99, 77, 180, 33, 103, 72, 137, 55, 141, 188, 77, 100, 24, 28, 37, + 145, 187, 174, 107, 176, 13, 52, 186, 41, 107, 173, 224, 85, 18, 155, 129, + 121, 214, 122, 36, 53, 124, 226, 139, 34, 131, 192, 186, 96, 121, 240, 34, + 156, 170, 9, 69, 48, 83, 94, 183, 72, 166, 235, 152, 98, 58, 12, 70, + 184, 225, 191, 6, 207, 6, 35, 184, 21, 45, 155, 5, 9, 85, 125, 183, + 72, 33, 137, 207, 115, 220, 217, 97, 8, 127, 14, 72, 54, 6, 95, 94, + 235, 123, 53, 69, 229, 130, 248, 125, 139, 160, 91, 230, 203, 118, 199, 178, + 189, 218, 252, 216, 83, 3, 168, 170, 94, 52, 231, 38, 8, 195, 118, 218, + 227, 79, 97, 43, 194, 173, 227, 81, 185, 145, 173, 157, 108, 10, 246, 231, + 94, 22, 183, 13, 188, 175, 56, 254, 91, 204, 167, 223, 9, 190, 208, 156, + 130, 45, 166, 64, 110, 99, 75, 128, 168, 167, 162, 169, 179, 128, 64, 66, + 12, 2, 97, 64, 119, 33, 131, 165, 246, 122, 161, 56, 216, 151, 152, 139, + 186, 82, 65, 23, 147, 44, 206, 215, 40, 45, 67, 221, 210, 22, 187, 51, + 199, 24, 163, 14, 113, 195, 167, 7, 79, 69, 129, 237, 170, 219, 35, 141, + 117, 228, 117, 19, 97, 54, 210, 234, 70, 177, 60, 193, 36, 233, 115, 206, + 180, 17, 252, 160, 45, 2, 211, 172, 209, 21, 30, 23, 137, 116, 65, 69, + 34, 230, 112, 176, 222, 152, 75, 220, 139, 212, 166, 8, 22, 125, 247, 22, + 162, 26, 65, 69, 159, 107, 190, 206, 198, 135, 128, 177, 186, 90, 38, 172, + 178, 138, 164, 70, 65, 232, 155, 103, 17, 247, 111, 123, 33, 56, 123, 68, + 65, 50, 248, 150, 93, 114, 228, 111, 145, 5, 208, 90, 77, 22, 137, 171, + 37, 226, 36, 62, 117, 215, 74, 36, 176, 71, 200, 246, 95, 117, 158, 30, + 238, 85, 63, 31, 236, 31, 236, 85, 251, 126, 110, 79, 252, 239, 189, 103, + 80, 89, 192, 194, 105, 73, 25, 90, 158, 113, 160, 4, 49, 69, 106, 90, + 89, 81, 131, 137, 145, 35, 171, 71, 17, 165, 115, 168, 141, 186, 66, 215, + 108, 123, 35, 24, 217, 123, 169, 232, 34, 217, 83, 213, 227, 146, 2, 228, + 92, 36, 154, 19, 87, 2, 109, 26, 42, 144, 138, 176, 244, 213, 38, 52, + 49, 133, 137, 210, 253, 144, 108, 46, 129, 38, 108, 148, 83, 96, 125, 33, + 162, 57, 95, 76, 221, 196, 201, 33, 97, 169, 2, 220, 212, 57, 112, 84, + 171, 180, 255, 240, 169, 8, 207, 107, 118, 94, 124, 156, 36, 72, 60, 239, + 150, 105, 87, 89, 217, 137, 81, 169, 74, 111, 173, 197, 243, 38, 112, 132, + 219, 240, 115, 99, 220, 170, 237, 96, 57, 6, 70, 12, 19, 199, 237, 67, + 119, 74, 162, 18, 108, 219, 86, 157, 246, 131, 214, 242, 191, 191, 124, 79, + 208, 149, 46, 56, 57, 130, 70, 53, 239, 157, 64, 17, 188, 192, 117, 165, + 148, 38, 40, 56, 6, 11, 111, 212, 22, 244, 179, 110, 27, 87, 220, 188, + 176, 158, 218, 78, 186, 71, 38, 108, 198, 237, 102, 41, 202, 67, 215, 56, + 246, 121, 142, 187, 122, 240, 30, 167, 117, 95, 219, 149, 217, 193, 58, 101, + 87, 159, 6, 202, 39, 61, 152, 217, 239, 142, 112, 51, 80, 62, 128, 97, + 231, 1, 117, 3, 26, 246, 52, 46, 44, 49, 202, 146, 121, 132, 8, 194, + 101, 90, 48, 10, 42, 153, 65, 228, 169, 73, 223, 65, 225, 55, 210, 56, + 233, 162, 96, 35, 66, 15, 246, 156, 57, 173, 195, 3, 204, 139, 206, 181, + 92, 165, 160, 78, 20, 64, 67, 112, 217, 48, 30, 69, 25, 112, 208, 78, + 76, 220, 172, 45, 121, 42, 228, 57, 117, 26, 144, 70, 11, 154, 246, 56, + 10, 199, 147, 112, 28, 135, 227, 169, 167, 192, 25, 115, 70, 199, 173, 90, + 28, 189, 161, 134, 144, 82, 204, 156, 155, 160, 53, 8, 108, 19, 87, 29, + 17, 77, 184, 54, 244, 93, 138, 67, 54, 27, 254, 99, 236, 47, 155, 84, + 63, 227, 90, 222, 54, 163, 71, 81, 250, 156, 12, 93, 46, 38, 121, 65, + 234, 20, 173, 204, 57, 24, 177, 6, 199, 39, 112, 76, 71, 13, 43, 180, + 165, 167, 251, 104, 108, 182, 107, 105, 224, 191, 55, 34, 1, 177, 185, 95, + 60, 164, 182, 246, 2, 86, 37, 45, 180, 157, 142, 178, 189, 33, 106, 147, + 139, 26, 131, 89, 167, 109, 134, 136, 171, 48, 0, 204, 250, 49, 12, 226, + 48, 168, 217, 87, 89, 44, 135, 109, 35, 116, 11, 145, 224, 73, 51, 80, + 52, 16, 12, 122, 143, 246, 218, 105, 251, 106, 127, 216, 233, 194, 71, 119, + 216, 209, 129, 21, 224, 45, 236, 4, 101, 152, 36, 64, 248, 177, 59, 133, + 133, 185, 160, 163, 197, 57, 29, 27, 100, 16, 18, 81, 39, 94, 32, 193, + 128, 23, 151, 164, 130, 156, 166, 51, 32, 5, 40, 110, 115, 25, 195, 181, + 214, 232, 198, 255, 75, 123, 60, 5, 230, 98, 186, 129, 127, 31, 225, 95, + 252, 27, 79, 129, 107, 52, 162, 195, 149, 255, 166, 35, 112, 181, 15, 67, + 216, 236, 195, 24, 62, 238, 195, 32, 226, 253, 41, 219, 172, 7, 109, 199, + 36, 169, 72, 22, 188, 16, 114, 89, 139, 109, 165, 71, 125, 104, 192, 104, + 54, 153, 59, 225, 12, 206, 141, 51, 58, 171, 235, 243, 234, 231, 218, 158, + 72, 45, 67, 132, 125, 44, 184, 35, 161, 6, 155, 207, 117, 48, 89, 227, + 22, 89, 122, 190, 129, 82, 243, 113, 109, 210, 78, 175, 171, 110, 62, 235, + 210, 120, 155, 39, 245, 203, 61, 38, 85, 223, 38, 36, 24, 185, 147, 45, + 11, 219, 176, 137, 219, 164, 78, 226, 100, 208, 140, 98, 201, 207, 99, 12, + 64, 6, 48, 246, 145, 80, 237, 125, 21, 229, 141, 162, 220, 95, 164, 193, + 91, 193, 246, 183, 54, 154, 158, 80, 163, 119, 175, 163, 109, 130, 127, 143, + 101, 39, 155, 44, 160, 80, 124, 117, 166, 45, 216, 80, 87, 156, 128, 185, + 99, 51, 168, 108, 174, 238, 111, 74, 222, 232, 4, 208, 255, 239, 247, 25, + 107, 163, 169, 8, 212, 245, 119, 240, 222, 118, 14, 211, 220, 128, 156, 75, + 197, 171, 37, 236, 223, 7, 118, 155, 7, 6, 117, 255, 13, 208, 34, 105, + 178, 166, 200, 132, 195, 21, 167, 29, 151, 179, 70, 137, 176, 88, 143, 49, + 141, 236, 25, 102, 53, 121, 34, 8, 222, 170, 156, 75, 94, 95, 241, 17, + 231, 102, 106, 242, 80, 176, 77, 140, 120, 114, 158, 149, 17, 74, 106, 101, + 6, 37, 197, 126, 180, 220, 148, 85, 16, 10, 99, 24, 210, 4, 44, 141, + 230, 234, 192, 83, 176, 251, 146, 187, 154, 254, 25, 187, 143, 73, 139, 45, + 59, 109, 98, 61, 99, 52, 6, 211, 225, 198, 177, 231, 21, 133, 135, 155, + 139, 208, 160, 25, 194, 17, 69, 82, 37, 109, 211, 76, 197, 76, 100, 187, + 122, 0, 10, 82, 174, 77, 53, 59, 142, 12, 156, 21, 153, 58, 120, 238, + 246, 44, 193, 234, 169, 15, 166, 87, 27, 16, 28, 135, 218, 39, 138, 151, + 132, 90, 141, 65, 133, 166, 87, 232, 182, 186, 193, 63, 31, 241, 79, 204, + 34, 249, 99, 29, 249, 102, 70, 194, 20, 139, 130, 129, 70, 177, 57, 77, + 244, 90, 138, 158, 10, 253, 196, 17, 139, 160, 161, 135, 67, 239, 47, 39, + 233, 124, 141, 118, 149, 46, 231, 134, 59, 73, 27, 137, 227, 134, 253, 155, + 110, 140, 131, 29, 242, 102, 139, 116, 74, 158, 114, 177, 21, 227, 61, 53, + 145, 3, 154, 93, 167, 139, 72, 124, 230, 194, 119, 161, 172, 71, 232, 195, + 70, 190, 138, 226, 20, 216, 210, 241, 171, 112, 140, 138, 163, 87, 10, 9, + 64, 101, 90, 176, 21, 165, 143, 181, 213, 69, 105, 214, 188, 219, 174, 93, + 1, 29, 204, 237, 251, 126, 247, 94, 7, 148, 168, 231, 190, 55, 87, 192, + 156, 173, 236, 175, 156, 40, 107, 232, 141, 219, 171, 121, 93, 99, 128, 235, + 70, 122, 85, 25, 221, 35, 239, 62, 181, 69, 106, 178, 130, 192, 191, 150, + 31, 140, 14, 158, 233, 1, 10, 170, 131, 67, 2, 218, 48, 62, 215, 147, + 120, 183, 237, 68, 3, 10, 220, 204, 115, 241, 73, 68, 13, 31, 50, 113, + 192, 117, 149, 33, 173, 68, 105, 237, 23, 33, 35, 111, 179, 144, 80, 69, + 203, 99, 110, 197, 227, 184, 110, 57, 162, 255, 222, 70, 185, 0, 94, 217, + 202, 9, 179, 125, 148, 122, 71, 3, 21, 27, 253, 82, 42, 46, 211, 131, + 53, 93, 221, 147, 200, 40, 14, 238, 94, 172, 238, 173, 171, 181, 138, 48, + 142, 112, 214, 188, 108, 64, 171, 45, 72, 162, 243, 95, 113, 225, 130, 134, + 244, 106, 180, 112, 50, 37, 207, 199, 246, 143, 94, 100, 12, 8, 189, 42, + 19, 89, 228, 171, 56, 220, 196, 97, 17, 77, 211, 117, 57, 12, 199, 252, + 229, 0, 238, 55, 236, 234, 126, 192, 41, 13, 254, 127, 178, 198, 222, 50, + 218, 224, 121, 207, 169, 119, 213, 220, 187, 219, 39, 127, 27, 172, 185, 176, + 165, 1, 79, 186, 250, 79, 46, 68, 99, 156, 10, 203, 165, 251, 50, 28, + 159, 147, 56, 165, 84, 228, 88, 35, 225, 0, 179, 130, 27, 36, 198, 61, + 70, 98, 35, 214, 132, 4, 95, 133, 202, 8, 209, 39, 198, 154, 34, 159, + 120, 187, 161, 77, 156, 68, 103, 236, 88, 199, 146, 137, 67, 143, 163, 236, + 174, 75, 142, 136, 236, 233, 54, 213, 93, 24, 98, 186, 86, 12, 79, 129, + 25, 206, 149, 23, 190, 178, 185, 87, 33, 193, 219, 89, 158, 117, 149, 72, + 179, 35, 235, 169, 71, 80, 234, 62, 220, 137, 76, 55, 89, 180, 116, 140, + 224, 101, 33, 239, 229, 155, 174, 174, 229, 198, 167, 142, 183, 186, 182, 196, + 185, 116, 155, 104, 34, 150, 46, 207, 157, 6, 109, 86, 7, 163, 117, 220, + 223, 189, 61, 174, 201, 111, 27, 25, 195, 89, 91, 3, 67, 136, 252, 208, + 24, 90, 2, 88, 167, 175, 137, 10, 111, 102, 196, 108, 154, 21, 183, 244, + 123, 84, 197, 23, 188, 234, 6, 26, 166, 90, 203, 15, 239, 183, 170, 135, + 196, 173, 10, 169, 48, 24, 81, 192, 181, 144, 101, 110, 35, 19, 110, 175, + 185, 207, 29, 151, 142, 243, 49, 148, 73, 16, 231, 114, 253, 165, 81, 83, + 165, 106, 93, 149, 183, 151, 54, 226, 56, 207, 23, 83, 21, 158, 156, 162, + 50, 0, 130, 64, 57, 167, 210, 199, 108, 145, 255, 115, 51, 127, 214, 139, + 118, 114, 164, 135, 44, 92, 22, 42, 235, 56, 176, 182, 177, 199, 185, 143, + 34, 140, 226, 152, 169, 216, 220, 58, 16, 182, 45, 240, 130, 157, 190, 250, + 108, 56, 24, 141, 6, 225, 193, 163, 71, 97, 90, 135, 47, 42, 134, 101, + 254, 156, 30, 65, 17, 94, 68, 187, 67, 178, 6, 64, 204, 23, 76, 22, + 81, 246, 33, 224, 155, 7, 195, 250, 147, 55, 23, 44, 16, 186, 80, 108, + 130, 225, 0, 163, 16, 104, 23, 101, 133, 68, 26, 137, 218, 188, 109, 69, + 91, 52, 136, 73, 227, 33, 244, 190, 42, 109, 149, 142, 27, 18, 213, 77, + 46, 182, 27, 172, 179, 42, 93, 52, 131, 145, 199, 6, 101, 41, 37, 193, + 70, 76, 236, 84, 242, 91, 212, 37, 57, 81, 106, 51, 132, 166, 165, 195, + 213, 108, 207, 53, 70, 19, 209, 61, 28, 89, 199, 240, 245, 151, 7, 225, + 235, 48, 27, 189, 238, 14, 159, 126, 51, 24, 13, 158, 126, 51, 28, 13, + 159, 194, 250, 124, 115, 48, 250, 102, 176, 255, 13, 61, 197, 191, 195, 209, + 55, 7, 80, 46, 51, 34, 203, 166, 216, 167, 216, 17, 6, 131, 112, 100, + 103, 223, 164, 147, 60, 139, 226, 56, 213, 201, 228, 66, 203, 18, 228, 245, + 179, 209, 192, 24, 197, 168, 160, 160, 15, 31, 31, 62, 254, 66, 115, 213, + 82, 114, 116, 240, 208, 55, 53, 49, 128, 238, 238, 169, 191, 165, 162, 242, + 85, 10, 58, 63, 105, 167, 109, 21, 86, 5, 152, 192, 1, 19, 198, 52, + 44, 99, 22, 80, 60, 68, 45, 236, 36, 187, 42, 221, 153, 220, 45, 232, + 53, 69, 33, 74, 108, 113, 34, 105, 154, 155, 16, 153, 181, 237, 141, 42, + 155, 188, 104, 163, 80, 215, 76, 9, 136, 3, 52, 25, 155, 174, 139, 36, + 156, 228, 154, 201, 99, 31, 127, 119, 134, 117, 69, 53, 54, 37, 151, 70, + 117, 238, 197, 34, 149, 4, 241, 20, 179, 200, 180, 179, 171, 164, 222, 83, + 137, 241, 219, 102, 45, 148, 227, 121, 166, 71, 36, 144, 105, 103, 130, 98, + 253, 204, 206, 221, 199, 3, 51, 135, 39, 5, 239, 136, 132, 122, 2, 172, + 247, 49, 41, 114, 242, 68, 21, 229, 40, 154, 18, 177, 214, 8, 14, 134, + 206, 105, 175, 188, 213, 188, 52, 156, 181, 219, 87, 7, 164, 113, 227, 106, + 102, 81, 198, 72, 221, 202, 127, 125, 159, 13, 212, 171, 114, 27, 146, 188, + 235, 248, 225, 22, 195, 17, 52, 7, 144, 15, 90, 216, 116, 6, 59, 13, + 230, 247, 245, 128, 184, 175, 37, 32, 238, 255, 181, 115, 104, 5, 247, 194, + 128, 179, 238, 237, 206, 243, 54, 178, 136, 228, 42, 138, 43, 137, 139, 37, + 2, 194, 91, 160, 221, 111, 161, 70, 140, 171, 172, 164, 74, 147, 171, 177, + 53, 133, 120, 17, 171, 65, 74, 128, 210, 172, 148, 87, 91, 137, 201, 69, + 26, 44, 194, 208, 78, 41, 205, 214, 150, 65, 152, 21, 218, 139, 42, 49, + 123, 165, 202, 149, 142, 32, 93, 229, 134, 159, 44, 242, 216, 149, 109, 32, + 234, 8, 105, 128, 1, 25, 226, 3, 220, 38, 217, 69, 90, 228, 100, 247, + 209, 156, 73, 149, 40, 237, 93, 149, 5, 117, 215, 19, 192, 85, 53, 217, + 133, 78, 15, 171, 171, 212, 228, 43, 187, 221, 33, 157, 87, 138, 192, 171, + 73, 13, 10, 204, 219, 44, 16, 2, 164, 208, 6, 230, 164, 8, 157, 168, + 194, 246, 24, 176, 72, 128, 69, 80, 19, 109, 20, 67, 108, 18, 196, 181, + 0, 137, 96, 127, 228, 112, 169, 2, 253, 134, 181, 157, 85, 250, 20, 108, + 75, 217, 48, 24, 205, 61, 170, 21, 55, 172, 169, 28, 142, 150, 176, 250, + 231, 164, 79, 156, 2, 150, 64, 85, 34, 126, 194, 66, 92, 38, 201, 7, + 114, 76, 3, 56, 41, 200, 49, 109, 9, 187, 4, 195, 242, 253, 210, 202, + 4, 97, 78, 185, 165, 145, 44, 215, 216, 177, 85, 150, 57, 232, 214, 85, + 25, 227, 56, 155, 246, 196, 132, 192, 174, 45, 138, 130, 147, 54, 25, 164, + 36, 29, 90, 60, 215, 178, 164, 173, 107, 149, 122, 254, 115, 156, 125, 175, + 215, 131, 97, 227, 1, 194, 136, 29, 164, 251, 46, 37, 94, 205, 175, 193, + 231, 48, 79, 96, 8, 121, 86, 165, 149, 91, 208, 31, 58, 153, 159, 209, + 221, 57, 164, 179, 70, 246, 96, 53, 147, 6, 46, 101, 177, 1, 150, 213, + 154, 131, 101, 154, 46, 213, 178, 6, 117, 202, 201, 76, 71, 209, 233, 120, + 118, 108, 118, 12, 236, 134, 94, 216, 110, 171, 57, 247, 168, 81, 169, 9, + 86, 167, 52, 45, 120, 25, 88, 100, 97, 167, 110, 29, 199, 51, 162, 149, + 208, 84, 3, 37, 106, 210, 19, 85, 70, 159, 156, 249, 187, 166, 44, 104, + 50, 17, 86, 118, 62, 18, 161, 205, 11, 100, 96, 174, 103, 71, 146, 43, + 35, 217, 253, 11, 176, 244, 185, 10, 203, 221, 8, 118, 201, 100, 61, 111, + 215, 112, 172, 12, 153, 3, 60, 32, 87, 140, 197, 104, 181, 17, 60, 20, + 186, 180, 50, 251, 50, 7, 65, 204, 232, 212, 247, 8, 109, 136, 45, 103, + 165, 212, 241, 201, 140, 182, 189, 109, 40, 185, 148, 76, 184, 77, 131, 231, + 132, 96, 237, 241, 143, 225, 216, 8, 14, 106, 144, 167, 138, 89, 176, 167, + 82, 137, 9, 188, 84, 36, 90, 87, 209, 155, 216, 139, 88, 42, 255, 88, + 191, 50, 16, 60, 60, 61, 73, 135, 229, 99, 81, 202, 129, 40, 215, 56, + 71, 206, 106, 213, 19, 2, 220, 196, 174, 231, 112, 174, 249, 69, 202, 137, + 165, 2, 246, 151, 117, 109, 192, 179, 104, 85, 158, 231, 58, 122, 158, 189, + 116, 22, 138, 39, 146, 133, 103, 66, 54, 53, 196, 86, 55, 222, 76, 201, + 60, 205, 234, 187, 108, 221, 81, 192, 216, 214, 223, 223, 77, 236, 150, 108, + 55, 88, 167, 116, 157, 59, 46, 98, 120, 161, 81, 48, 150, 129, 142, 49, + 117, 153, 76, 207, 98, 145, 12, 97, 26, 176, 23, 69, 90, 122, 89, 143, + 241, 10, 160, 208, 38, 58, 4, 145, 169, 174, 12, 58, 128, 9, 69, 125, + 39, 31, 9, 147, 109, 138, 56, 197, 211, 214, 51, 94, 14, 182, 80, 27, + 116, 158, 6, 251, 251, 240, 93, 178, 119, 53, 71, 100, 202, 87, 155, 54, + 28, 198, 42, 44, 139, 152, 140, 151, 147, 69, 69, 18, 170, 152, 77, 127, + 226, 177, 17, 243, 106, 151, 245, 85, 42, 60, 49, 92, 235, 69, 34, 251, + 76, 247, 248, 7, 95, 249, 99, 196, 162, 216, 176, 172, 190, 4, 41, 9, + 148, 49, 183, 206, 72, 1, 247, 80, 172, 208, 153, 18, 220, 20, 28, 53, + 138, 99, 223, 91, 226, 44, 52, 9, 201, 234, 225, 27, 245, 241, 47, 21, + 49, 79, 215, 37, 105, 11, 185, 87, 11, 239, 104, 202, 31, 102, 91, 215, + 100, 227, 228, 27, 8, 155, 89, 94, 15, 32, 111, 141, 134, 21, 87, 60, + 19, 82, 153, 37, 69, 227, 189, 136, 81, 107, 93, 241, 145, 115, 49, 162, + 97, 55, 180, 25, 151, 206, 85, 155, 104, 170, 137, 175, 9, 105, 75, 11, + 50, 119, 41, 44, 148, 125, 218, 235, 154, 184, 19, 168, 27, 166, 175, 194, + 52, 10, 211, 139, 240, 106, 25, 110, 150, 225, 199, 101, 24, 47, 195, 171, + 87, 225, 230, 85, 248, 241, 85, 24, 195, 219, 50, 76, 87, 42, 26, 199, + 240, 225, 109, 161, 100, 139, 100, 198, 198, 239, 145, 158, 136, 152, 216, 148, + 205, 140, 164, 208, 46, 218, 22, 157, 220, 94, 28, 187, 75, 69, 221, 108, + 229, 253, 214, 25, 246, 138, 26, 100, 115, 37, 227, 38, 20, 249, 166, 180, + 251, 87, 209, 244, 156, 216, 146, 42, 102, 117, 121, 123, 248, 111, 162, 96, + 105, 11, 219, 70, 192, 151, 20, 228, 230, 37, 217, 210, 18, 9, 224, 192, + 59, 111, 42, 4, 237, 53, 74, 143, 203, 210, 196, 178, 137, 23, 41, 75, + 93, 103, 232, 33, 215, 212, 223, 216, 190, 96, 127, 65, 213, 89, 58, 207, + 114, 204, 63, 156, 86, 214, 80, 209, 97, 44, 69, 228, 4, 93, 204, 214, + 11, 194, 203, 116, 141, 193, 217, 159, 55, 111, 208, 58, 107, 239, 174, 210, + 85, 130, 114, 33, 69, 150, 38, 87, 73, 188, 174, 163, 64, 75, 108, 165, + 106, 80, 102, 59, 242, 174, 187, 140, 74, 21, 43, 191, 201, 210, 215, 162, + 218, 44, 62, 121, 171, 201, 175, 113, 238, 40, 208, 33, 112, 23, 182, 135, + 8, 113, 251, 206, 227, 16, 28, 176, 198, 156, 71, 82, 198, 78, 78, 130, + 179, 164, 208, 68, 117, 100, 5, 85, 20, 216, 57, 110, 145, 163, 46, 1, + 87, 84, 67, 17, 80, 224, 18, 3, 42, 163, 174, 18, 227, 40, 203, 254, + 210, 161, 18, 152, 177, 86, 66, 3, 142, 84, 125, 32, 67, 101, 240, 12, + 222, 159, 175, 37, 120, 15, 13, 101, 130, 14, 147, 94, 184, 176, 232, 2, + 232, 13, 106, 194, 78, 244, 234, 251, 221, 113, 6, 75, 246, 118, 178, 188, + 255, 180, 180, 28, 213, 242, 107, 142, 189, 68, 18, 197, 38, 204, 71, 203, + 41, 115, 15, 201, 160, 131, 249, 8, 14, 161, 214, 208, 107, 35, 200, 224, + 236, 68, 51, 99, 5, 111, 217, 234, 199, 194, 203, 130, 95, 153, 71, 184, + 221, 71, 204, 243, 166, 179, 28, 198, 248, 244, 219, 246, 14, 177, 175, 166, + 249, 131, 117, 52, 101, 82, 217, 115, 37, 50, 86, 153, 146, 36, 66, 220, + 254, 27, 131, 250, 141, 246, 23, 141, 87, 116, 65, 166, 104, 73, 251, 101, + 120, 249, 50, 60, 127, 25, 78, 95, 134, 229, 203, 240, 175, 225, 229, 95, + 195, 243, 191, 134, 211, 191, 134, 229, 95, 183, 232, 146, 156, 180, 74, 24, + 140, 135, 162, 44, 142, 49, 24, 138, 75, 124, 152, 255, 198, 87, 152, 116, + 54, 41, 194, 241, 70, 125, 249, 168, 190, 92, 209, 133, 13, 111, 228, 243, + 163, 124, 94, 37, 104, 34, 179, 161, 191, 31, 241, 239, 214, 182, 113, 125, + 161, 111, 108, 129, 191, 124, 84, 95, 174, 166, 169, 50, 79, 218, 152, 175, + 31, 213, 215, 6, 1, 135, 115, 95, 170, 85, 34, 5, 21, 92, 14, 57, + 33, 169, 200, 128, 106, 168, 32, 76, 14, 255, 203, 150, 235, 199, 127, 238, + 63, 152, 250, 15, 74, 121, 208, 229, 224, 52, 182, 34, 241, 101, 205, 62, + 195, 143, 97, 118, 249, 87, 191, 63, 255, 193, 212, 127, 80, 254, 213, 233, + 239, 67, 82, 96, 132, 76, 126, 247, 87, 234, 176, 77, 167, 89, 24, 92, + 153, 30, 103, 217, 113, 137, 114, 95, 210, 167, 69, 75, 38, 73, 103, 13, + 218, 132, 102, 12, 222, 177, 157, 94, 45, 92, 53, 166, 121, 37, 119, 244, + 158, 29, 172, 218, 246, 11, 168, 17, 74, 114, 87, 234, 180, 193, 212, 2, + 199, 127, 116, 237, 253, 95, 106, 171, 34, 107, 182, 150, 187, 66, 87, 158, + 255, 13, 110, 99, 149, 60, 2, 176, 26, 6, 188, 58, 146, 157, 176, 15, + 210, 115, 184, 74, 129, 190, 164, 2, 245, 0, 91, 150, 187, 73, 228, 163, + 198, 208, 66, 189, 198, 241, 232, 86, 173, 210, 72, 200, 48, 199, 247, 57, + 207, 209, 174, 166, 3, 84, 57, 185, 231, 4, 251, 193, 6, 168, 115, 73, + 254, 57, 66, 151, 146, 246, 48, 60, 192, 124, 28, 248, 245, 32, 60, 236, + 212, 9, 159, 247, 197, 70, 60, 204, 36, 51, 6, 122, 194, 76, 214, 233, + 162, 234, 194, 208, 245, 246, 56, 220, 178, 9, 113, 210, 33, 3, 45, 96, + 215, 146, 217, 12, 206, 131, 211, 242, 27, 104, 111, 145, 115, 108, 70, 94, + 69, 134, 94, 101, 42, 93, 89, 142, 125, 6, 176, 96, 183, 21, 17, 212, + 11, 190, 151, 36, 30, 196, 3, 57, 203, 162, 2, 221, 193, 245, 227, 236, + 148, 57, 32, 4, 140, 77, 61, 0, 7, 24, 71, 197, 148, 201, 31, 213, + 142, 167, 184, 36, 171, 110, 159, 176, 120, 229, 237, 52, 158, 1, 113, 183, + 49, 46, 229, 58, 106, 60, 79, 153, 64, 206, 98, 232, 181, 195, 147, 113, + 166, 39, 219, 37, 86, 124, 123, 119, 123, 46, 230, 99, 31, 4, 88, 150, + 98, 126, 174, 167, 66, 247, 186, 28, 69, 137, 224, 39, 219, 79, 55, 159, + 129, 45, 244, 61, 115, 57, 102, 140, 97, 99, 132, 16, 158, 46, 203, 129, + 48, 132, 47, 132, 173, 171, 167, 193, 71, 100, 0, 159, 18, 52, 237, 239, + 251, 94, 168, 66, 196, 60, 148, 167, 56, 89, 159, 163, 225, 40, 185, 124, + 137, 57, 217, 190, 14, 234, 128, 73, 138, 29, 43, 111, 120, 40, 27, 236, + 9, 6, 216, 21, 65, 66, 21, 0, 203, 15, 111, 208, 11, 173, 196, 220, + 153, 113, 178, 170, 200, 155, 67, 193, 1, 46, 71, 211, 233, 250, 84, 99, + 26, 101, 112, 254, 11, 155, 152, 145, 255, 22, 74, 38, 103, 149, 120, 242, + 235, 232, 5, 120, 123, 251, 203, 182, 69, 62, 86, 63, 175, 87, 123, 27, + 94, 198, 225, 190, 62, 150, 254, 66, 62, 17, 229, 15, 75, 32, 173, 149, + 64, 243, 94, 105, 18, 235, 119, 246, 218, 210, 66, 39, 20, 205, 79, 179, + 245, 115, 211, 56, 62, 221, 219, 124, 122, 231, 72, 62, 191, 199, 72, 160, + 250, 222, 97, 131, 68, 224, 181, 89, 249, 82, 66, 112, 145, 116, 94, 48, + 179, 191, 167, 26, 225, 0, 69, 183, 166, 24, 156, 228, 41, 74, 220, 136, + 18, 189, 40, 79, 246, 93, 15, 162, 197, 9, 181, 148, 132, 63, 18, 200, + 67, 89, 124, 67, 11, 113, 67, 98, 111, 56, 38, 254, 24, 0, 239, 173, + 179, 53, 166, 152, 117, 81, 14, 130, 90, 41, 40, 216, 201, 202, 13, 196, + 70, 251, 53, 46, 231, 201, 238, 203, 96, 145, 126, 72, 130, 215, 159, 238, + 158, 61, 213, 48, 237, 221, 47, 175, 80, 16, 211, 229, 200, 206, 201, 212, + 187, 148, 84, 2, 92, 122, 108, 36, 53, 190, 55, 220, 203, 25, 218, 203, + 40, 177, 46, 241, 7, 145, 242, 217, 10, 146, 12, 131, 27, 83, 163, 104, + 84, 67, 238, 141, 37, 234, 236, 1, 239, 60, 127, 251, 183, 210, 176, 13, + 42, 175, 3, 14, 154, 244, 67, 81, 229, 29, 217, 58, 55, 177, 138, 74, + 101, 68, 111, 11, 138, 124, 41, 98, 154, 193, 165, 172, 68, 59, 76, 12, + 56, 126, 186, 41, 182, 84, 32, 215, 183, 112, 9, 59, 190, 27, 181, 180, + 202, 230, 132, 37, 120, 182, 27, 127, 68, 73, 123, 220, 16, 220, 182, 59, + 236, 145, 63, 54, 137, 127, 68, 32, 225, 91, 29, 148, 70, 30, 38, 158, + 27, 154, 125, 243, 82, 107, 1, 255, 235, 204, 130, 101, 109, 98, 77, 18, + 45, 9, 110, 209, 105, 29, 55, 167, 202, 213, 29, 65, 70, 4, 75, 116, + 112, 135, 243, 116, 25, 21, 188, 7, 42, 44, 20, 197, 49, 112, 183, 192, + 18, 253, 74, 212, 16, 146, 173, 127, 210, 209, 177, 87, 188, 121, 182, 45, + 131, 33, 103, 194, 29, 218, 52, 186, 86, 180, 160, 65, 210, 0, 228, 43, + 87, 162, 74, 113, 72, 5, 255, 169, 181, 17, 138, 197, 101, 44, 41, 41, + 8, 222, 59, 44, 174, 19, 214, 48, 23, 191, 229, 140, 130, 232, 18, 20, + 70, 181, 40, 125, 133, 120, 55, 99, 120, 63, 197, 180, 168, 181, 255, 164, + 227, 65, 251, 86, 243, 1, 177, 37, 183, 247, 251, 153, 191, 223, 95, 26, + 5, 252, 150, 200, 203, 141, 12, 21, 101, 63, 62, 57, 11, 131, 95, 26, + 180, 148, 191, 156, 56, 46, 76, 94, 250, 50, 113, 57, 34, 132, 105, 100, + 23, 18, 162, 198, 227, 100, 82, 202, 104, 0, 160, 48, 13, 218, 206, 12, + 40, 19, 231, 36, 138, 63, 56, 239, 190, 212, 239, 166, 137, 120, 220, 47, + 45, 140, 66, 122, 87, 199, 134, 198, 167, 211, 221, 64, 245, 76, 91, 167, + 37, 162, 131, 169, 3, 97, 183, 70, 54, 136, 139, 148, 8, 153, 54, 45, + 33, 122, 75, 213, 207, 20, 137, 130, 204, 32, 68, 62, 166, 42, 48, 105, + 204, 246, 174, 30, 210, 161, 208, 250, 72, 218, 112, 30, 156, 109, 18, 250, + 113, 117, 151, 140, 190, 169, 196, 253, 164, 244, 177, 103, 197, 160, 98, 2, + 41, 65, 169, 12, 178, 141, 250, 42, 62, 75, 27, 141, 99, 113, 208, 101, + 167, 89, 140, 79, 11, 163, 69, 249, 158, 168, 190, 46, 214, 111, 140, 42, + 149, 20, 148, 201, 148, 133, 71, 161, 130, 97, 37, 196, 74, 22, 11, 142, + 215, 131, 197, 196, 102, 6, 41, 78, 45, 109, 82, 129, 72, 40, 68, 172, + 40, 202, 8, 175, 54, 232, 131, 221, 37, 82, 93, 133, 146, 244, 128, 146, + 40, 113, 62, 3, 186, 100, 144, 108, 46, 207, 201, 70, 87, 88, 50, 199, + 27, 252, 107, 107, 133, 245, 25, 19, 59, 93, 237, 8, 211, 25, 209, 248, + 92, 59, 203, 95, 110, 47, 166, 179, 131, 157, 140, 45, 215, 178, 51, 171, + 136, 153, 153, 115, 132, 183, 21, 39, 227, 234, 200, 73, 255, 67, 224, 104, + 120, 151, 133, 114, 234, 32, 170, 214, 22, 161, 59, 234, 60, 145, 141, 221, + 106, 30, 220, 232, 173, 152, 26, 150, 69, 83, 169, 182, 132, 71, 204, 29, + 49, 71, 124, 74, 188, 185, 27, 241, 126, 190, 200, 39, 110, 228, 170, 62, + 207, 178, 12, 218, 54, 170, 76, 45, 70, 219, 113, 183, 131, 199, 103, 138, + 168, 204, 11, 237, 182, 136, 68, 194, 22, 143, 208, 154, 167, 169, 237, 203, + 227, 116, 250, 75, 115, 167, 191, 88, 157, 246, 36, 152, 132, 125, 40, 217, + 164, 108, 71, 240, 173, 84, 50, 123, 166, 65, 173, 75, 56, 145, 20, 214, + 181, 4, 44, 86, 52, 18, 107, 201, 101, 74, 54, 17, 96, 238, 206, 107, + 107, 12, 55, 2, 111, 50, 105, 21, 187, 73, 9, 116, 181, 134, 87, 170, + 30, 60, 122, 28, 14, 15, 190, 32, 35, 250, 224, 250, 146, 107, 179, 235, + 49, 122, 153, 161, 209, 70, 0, 101, 174, 176, 12, 15, 85, 204, 237, 57, + 6, 63, 193, 29, 188, 239, 181, 118, 198, 231, 201, 98, 53, 46, 57, 217, + 103, 208, 122, 73, 133, 113, 237, 94, 32, 117, 241, 67, 154, 0, 217, 80, + 170, 98, 72, 145, 204, 139, 104, 117, 30, 180, 132, 234, 84, 3, 68, 110, + 189, 228, 0, 225, 5, 154, 118, 101, 211, 77, 144, 0, 129, 62, 157, 234, + 248, 89, 23, 41, 82, 190, 18, 230, 129, 35, 151, 178, 211, 1, 219, 46, + 13, 95, 16, 45, 15, 183, 6, 5, 71, 181, 133, 60, 171, 69, 94, 9, + 200, 168, 5, 26, 190, 232, 31, 188, 232, 31, 190, 144, 100, 153, 129, 95, + 69, 180, 177, 114, 163, 225, 11, 40, 171, 18, 202, 111, 41, 124, 56, 85, + 32, 66, 22, 106, 24, 148, 76, 95, 223, 164, 9, 137, 72, 165, 22, 92, + 192, 162, 232, 251, 216, 200, 78, 53, 193, 236, 193, 139, 149, 77, 196, 226, + 239, 141, 128, 61, 181, 18, 110, 88, 61, 36, 28, 98, 83, 6, 160, 50, + 167, 180, 129, 250, 43, 19, 64, 146, 9, 199, 242, 59, 10, 254, 145, 231, + 75, 168, 220, 207, 215, 90, 74, 162, 10, 127, 253, 238, 57, 151, 121, 190, + 64, 241, 54, 140, 97, 154, 95, 250, 133, 158, 191, 255, 254, 187, 253, 23, + 92, 238, 37, 251, 40, 170, 162, 36, 43, 111, 44, 47, 237, 190, 72, 238, + 89, 254, 123, 46, 255, 125, 130, 232, 239, 174, 194, 223, 112, 225, 247, 249, + 28, 29, 86, 102, 107, 184, 118, 160, 155, 68, 130, 98, 55, 213, 120, 199, + 53, 222, 225, 85, 161, 115, 100, 165, 152, 77, 161, 212, 60, 58, 146, 221, + 104, 168, 180, 59, 95, 166, 241, 248, 10, 254, 235, 37, 87, 213, 110, 99, + 123, 111, 236, 246, 128, 130, 213, 22, 9, 184, 47, 83, 218, 228, 240, 158, + 109, 11, 32, 28, 203, 214, 235, 24, 37, 130, 25, 8, 142, 85, 24, 66, + 218, 245, 187, 64, 185, 72, 26, 192, 226, 187, 100, 6, 32, 139, 160, 129, + 100, 114, 197, 38, 153, 176, 239, 130, 11, 50, 71, 208, 175, 148, 190, 31, + 25, 114, 48, 233, 94, 13, 116, 94, 165, 211, 41, 6, 127, 241, 154, 12, + 77, 60, 19, 90, 168, 69, 115, 191, 175, 208, 112, 201, 177, 217, 214, 237, + 82, 89, 130, 95, 66, 223, 186, 185, 183, 199, 47, 94, 236, 247, 187, 119, + 194, 244, 113, 129, 249, 164, 62, 36, 27, 157, 121, 68, 117, 21, 224, 96, + 250, 5, 38, 51, 236, 175, 87, 125, 0, 177, 172, 113, 115, 143, 185, 143, + 175, 51, 60, 125, 125, 33, 80, 37, 142, 39, 138, 121, 226, 13, 16, 95, + 231, 152, 238, 119, 177, 58, 143, 84, 170, 167, 78, 99, 91, 175, 101, 157, + 207, 41, 12, 164, 210, 93, 88, 25, 122, 218, 34, 181, 221, 197, 192, 235, + 72, 118, 112, 25, 230, 33, 164, 233, 238, 100, 211, 149, 175, 187, 205, 221, + 188, 123, 123, 252, 252, 107, 251, 8, 33, 168, 52, 150, 252, 81, 32, 23, + 198, 223, 63, 39, 153, 235, 149, 49, 115, 115, 74, 254, 131, 75, 254, 37, + 95, 76, 251, 112, 9, 211, 49, 142, 200, 108, 32, 32, 217, 221, 61, 128, + 23, 80, 42, 74, 196, 151, 232, 75, 19, 255, 251, 64, 76, 195, 122, 203, + 195, 122, 139, 70, 65, 31, 187, 192, 131, 145, 141, 70, 48, 43, 56, 152, + 21, 133, 44, 205, 161, 147, 198, 57, 253, 224, 207, 30, 71, 136, 120, 0, + 69, 246, 121, 133, 82, 117, 130, 15, 0, 253, 172, 185, 133, 251, 175, 95, + 29, 19, 127, 155, 7, 91, 224, 238, 221, 95, 94, 126, 243, 190, 185, 134, + 1, 90, 191, 210, 107, 14, 253, 21, 192, 201, 168, 157, 138, 160, 13, 103, + 133, 239, 181, 37, 37, 181, 59, 167, 180, 83, 116, 164, 245, 93, 212, 230, + 168, 118, 53, 144, 250, 234, 248, 249, 95, 107, 16, 69, 200, 0, 61, 228, + 147, 251, 109, 60, 223, 165, 119, 108, 183, 186, 81, 183, 108, 56, 47, 72, + 103, 191, 93, 67, 35, 178, 62, 223, 231, 148, 42, 89, 119, 231, 207, 68, + 55, 192, 187, 218, 208, 2, 173, 217, 221, 245, 151, 117, 116, 215, 81, 144, + 144, 194, 216, 182, 182, 240, 205, 16, 115, 140, 6, 223, 60, 118, 238, 44, + 37, 132, 52, 84, 61, 198, 87, 6, 238, 44, 225, 136, 171, 168, 65, 174, + 181, 244, 121, 255, 155, 47, 220, 107, 181, 159, 170, 251, 120, 150, 171, 157, + 113, 170, 60, 145, 49, 18, 90, 7, 104, 72, 151, 86, 246, 136, 218, 72, + 7, 91, 74, 195, 238, 154, 120, 150, 26, 100, 13, 128, 144, 32, 172, 95, + 86, 249, 202, 84, 186, 13, 179, 58, 199, 111, 235, 249, 249, 74, 10, 3, + 69, 10, 220, 175, 90, 49, 67, 22, 161, 120, 98, 78, 201, 233, 27, 171, + 127, 107, 93, 209, 122, 119, 232, 82, 222, 122, 37, 3, 159, 210, 124, 221, + 127, 231, 143, 91, 28, 49, 27, 11, 43, 4, 133, 134, 153, 154, 216, 128, + 17, 160, 29, 105, 64, 98, 35, 216, 229, 162, 177, 234, 251, 198, 41, 179, + 160, 2, 240, 198, 26, 166, 221, 69, 117, 3, 17, 171, 141, 64, 226, 96, + 57, 220, 22, 107, 27, 153, 180, 135, 234, 57, 142, 127, 85, 191, 58, 155, + 17, 28, 116, 69, 186, 120, 18, 158, 231, 87, 183, 221, 21, 222, 149, 249, + 177, 203, 145, 111, 40, 252, 130, 192, 118, 157, 163, 56, 158, 82, 211, 162, + 212, 124, 46, 174, 101, 91, 56, 138, 215, 128, 171, 99, 46, 169, 157, 208, + 84, 130, 11, 98, 37, 68, 227, 133, 118, 157, 161, 198, 122, 242, 4, 239, + 9, 139, 37, 225, 241, 251, 173, 33, 80, 148, 142, 126, 22, 208, 156, 22, + 36, 19, 200, 164, 236, 46, 189, 164, 172, 138, 64, 199, 209, 211, 144, 243, + 129, 176, 172, 134, 172, 140, 68, 62, 40, 92, 242, 68, 139, 57, 181, 194, + 153, 154, 28, 163, 58, 231, 72, 117, 48, 54, 26, 64, 95, 148, 88, 47, + 129, 88, 149, 28, 17, 44, 139, 2, 123, 212, 21, 15, 97, 189, 114, 156, + 247, 48, 228, 169, 232, 2, 201, 132, 38, 94, 172, 209, 94, 5, 87, 108, + 183, 116, 39, 202, 43, 244, 224, 47, 111, 94, 125, 221, 239, 225, 57, 17, + 225, 65, 22, 252, 45, 195, 0, 223, 70, 181, 199, 37, 63, 59, 126, 251, + 246, 197, 241, 251, 227, 207, 250, 216, 154, 91, 227, 239, 68, 212, 151, 204, + 95, 7, 207, 191, 123, 9, 119, 69, 190, 80, 138, 30, 85, 116, 215, 27, + 94, 177, 214, 246, 16, 142, 129, 144, 90, 147, 69, 202, 17, 116, 69, 58, + 49, 83, 58, 89, 107, 25, 158, 59, 27, 44, 65, 47, 41, 144, 3, 130, + 132, 21, 180, 57, 81, 193, 64, 78, 162, 238, 199, 227, 238, 63, 6, 221, + 39, 99, 19, 131, 88, 130, 67, 82, 111, 42, 24, 23, 99, 18, 123, 201, + 51, 45, 18, 15, 90, 173, 79, 169, 211, 36, 171, 148, 129, 154, 150, 126, + 234, 92, 46, 81, 13, 154, 21, 132, 137, 178, 216, 128, 180, 181, 133, 108, + 96, 172, 121, 93, 2, 60, 12, 248, 45, 42, 21, 209, 36, 82, 243, 10, + 77, 201, 0, 95, 214, 187, 100, 225, 180, 31, 43, 241, 65, 215, 18, 62, + 240, 34, 144, 193, 110, 156, 207, 51, 50, 223, 32, 171, 80, 163, 144, 115, + 110, 111, 89, 130, 7, 173, 214, 233, 158, 150, 27, 217, 218, 59, 76, 63, + 227, 48, 78, 181, 248, 198, 182, 226, 188, 87, 107, 248, 180, 181, 39, 86, + 192, 255, 94, 203, 33, 31, 87, 146, 150, 27, 121, 146, 96, 218, 127, 173, + 243, 202, 190, 247, 204, 172, 62, 221, 214, 53, 107, 173, 56, 125, 60, 167, + 213, 129, 222, 62, 100, 64, 241, 217, 230, 142, 130, 17, 204, 200, 44, 164, + 101, 70, 145, 23, 42, 208, 66, 228, 198, 185, 83, 2, 1, 119, 27, 59, + 77, 3, 85, 154, 130, 230, 145, 146, 88, 10, 45, 222, 92, 17, 5, 12, + 60, 101, 73, 122, 84, 177, 116, 117, 66, 215, 144, 149, 137, 202, 149, 32, + 107, 45, 155, 14, 56, 211, 52, 150, 63, 111, 223, 47, 114, 98, 96, 9, + 177, 206, 144, 213, 48, 11, 206, 16, 168, 242, 145, 232, 192, 247, 20, 32, + 122, 197, 214, 4, 181, 126, 211, 154, 176, 239, 193, 117, 42, 226, 48, 132, + 104, 114, 57, 110, 88, 27, 209, 137, 254, 44, 222, 117, 150, 95, 143, 236, + 99, 111, 231, 181, 68, 195, 212, 11, 86, 139, 99, 171, 123, 236, 254, 98, + 117, 25, 137, 75, 37, 187, 79, 72, 28, 95, 211, 231, 47, 170, 79, 180, + 90, 42, 43, 211, 161, 181, 34, 131, 166, 181, 52, 253, 202, 28, 226, 58, + 230, 171, 47, 208, 117, 58, 18, 232, 186, 185, 13, 86, 180, 75, 142, 189, + 174, 65, 219, 96, 92, 86, 25, 109, 200, 182, 37, 131, 91, 218, 142, 25, + 107, 73, 247, 5, 223, 75, 151, 114, 199, 41, 71, 76, 214, 52, 249, 175, + 69, 67, 25, 5, 54, 78, 66, 66, 238, 50, 89, 44, 26, 192, 254, 26, + 135, 159, 220, 62, 29, 45, 225, 86, 145, 146, 69, 137, 207, 37, 104, 197, + 180, 17, 66, 168, 212, 94, 51, 219, 96, 223, 146, 235, 171, 182, 184, 223, + 222, 93, 1, 164, 97, 255, 174, 15, 186, 221, 131, 250, 0, 229, 60, 96, + 204, 121, 43, 232, 136, 103, 25, 107, 16, 137, 216, 153, 16, 250, 38, 143, + 96, 165, 230, 89, 176, 83, 115, 210, 179, 20, 31, 118, 239, 63, 15, 76, + 223, 149, 103, 237, 34, 35, 104, 234, 79, 105, 24, 209, 48, 200, 140, 12, + 240, 217, 191, 122, 86, 154, 123, 232, 96, 79, 95, 199, 238, 92, 76, 83, + 132, 86, 84, 196, 96, 211, 151, 235, 65, 100, 67, 252, 232, 34, 42, 110, + 219, 80, 4, 52, 180, 104, 133, 101, 47, 214, 194, 149, 18, 2, 35, 153, + 55, 219, 35, 49, 178, 143, 172, 36, 105, 6, 146, 253, 64, 231, 158, 129, + 189, 150, 249, 23, 10, 163, 180, 81, 38, 157, 90, 89, 156, 209, 71, 15, + 239, 6, 201, 221, 0, 100, 78, 202, 70, 101, 58, 75, 146, 49, 113, 103, + 37, 150, 28, 208, 58, 34, 189, 140, 216, 78, 90, 18, 95, 24, 87, 2, + 162, 55, 74, 247, 114, 180, 34, 77, 223, 70, 219, 152, 94, 254, 93, 34, + 135, 245, 35, 86, 242, 167, 109, 20, 3, 69, 64, 243, 200, 27, 147, 189, + 65, 148, 33, 214, 94, 178, 0, 145, 109, 25, 180, 205, 137, 115, 25, 163, + 19, 248, 146, 194, 153, 235, 156, 201, 83, 32, 92, 34, 54, 243, 209, 214, + 236, 26, 80, 224, 106, 136, 86, 74, 171, 17, 17, 203, 88, 194, 225, 208, + 222, 166, 167, 167, 76, 52, 3, 95, 206, 230, 9, 170, 87, 219, 82, 39, + 100, 3, 28, 50, 243, 64, 11, 32, 25, 82, 32, 67, 18, 178, 130, 236, + 182, 140, 181, 150, 59, 148, 182, 99, 181, 3, 228, 203, 41, 167, 238, 97, + 113, 158, 172, 171, 157, 207, 70, 31, 20, 101, 158, 241, 33, 165, 48, 118, + 52, 109, 109, 153, 87, 39, 229, 38, 27, 137, 146, 171, 13, 247, 52, 58, + 179, 73, 103, 141, 213, 196, 156, 168, 193, 84, 139, 236, 65, 130, 48, 60, + 148, 21, 82, 65, 121, 93, 43, 56, 161, 80, 170, 134, 104, 188, 33, 251, + 230, 171, 110, 85, 232, 180, 234, 156, 147, 4, 75, 22, 107, 219, 92, 149, + 233, 124, 147, 181, 196, 139, 55, 227, 222, 102, 109, 178, 214, 209, 80, 34, + 93, 235, 195, 237, 168, 239, 74, 27, 249, 13, 221, 251, 206, 222, 129, 151, + 51, 196, 154, 70, 64, 160, 91, 211, 134, 57, 76, 94, 186, 35, 89, 166, + 101, 153, 72, 216, 189, 53, 185, 195, 5, 9, 133, 54, 38, 236, 90, 32, + 241, 199, 72, 202, 98, 150, 20, 37, 207, 97, 139, 10, 76, 109, 86, 231, + 140, 191, 19, 250, 236, 86, 158, 56, 56, 70, 252, 166, 165, 34, 173, 134, + 40, 45, 100, 159, 5, 109, 225, 248, 49, 47, 120, 40, 81, 132, 45, 218, + 115, 137, 17, 215, 216, 240, 81, 76, 9, 226, 243, 156, 136, 26, 229, 255, + 166, 102, 235, 89, 65, 138, 53, 15, 49, 17, 27, 49, 179, 11, 156, 203, + 84, 224, 237, 87, 129, 163, 99, 43, 15, 147, 77, 82, 146, 25, 165, 148, + 21, 130, 143, 59, 70, 58, 88, 89, 90, 153, 230, 198, 70, 31, 77, 164, + 31, 26, 182, 242, 117, 72, 71, 4, 47, 95, 130, 26, 177, 164, 34, 39, + 119, 227, 102, 214, 18, 151, 7, 252, 33, 241, 214, 153, 123, 151, 214, 233, + 133, 53, 6, 17, 49, 8, 225, 78, 193, 6, 166, 38, 189, 165, 109, 172, + 197, 198, 153, 47, 45, 99, 150, 208, 198, 7, 138, 148, 53, 174, 35, 180, + 140, 184, 178, 104, 222, 32, 50, 2, 154, 194, 37, 218, 185, 136, 229, 19, + 162, 189, 158, 37, 134, 88, 70, 197, 7, 133, 214, 164, 229, 246, 190, 177, + 90, 71, 32, 118, 188, 3, 148, 89, 53, 161, 101, 5, 23, 189, 224, 117, + 94, 113, 232, 123, 238, 150, 141, 122, 49, 148, 15, 235, 76, 233, 55, 240, + 36, 23, 108, 91, 191, 88, 0, 220, 43, 223, 97, 101, 174, 163, 93, 211, + 0, 43, 198, 180, 171, 226, 52, 88, 24, 117, 7, 237, 47, 119, 193, 233, + 176, 212, 141, 137, 129, 130, 248, 242, 17, 131, 47, 54, 91, 210, 158, 178, + 108, 161, 140, 40, 48, 75, 88, 89, 174, 236, 187, 44, 4, 210, 118, 40, + 36, 229, 238, 163, 186, 14, 168, 19, 161, 224, 196, 32, 76, 93, 175, 37, + 101, 95, 160, 64, 245, 64, 176, 202, 164, 93, 51, 110, 81, 120, 136, 169, + 133, 142, 117, 170, 215, 194, 32, 174, 228, 42, 90, 178, 213, 32, 138, 229, + 212, 81, 149, 167, 101, 112, 180, 51, 31, 61, 24, 147, 172, 17, 80, 153, + 250, 26, 7, 153, 250, 154, 249, 167, 255, 107, 85, 21, 118, 242, 111, 101, + 210, 116, 248, 107, 194, 19, 146, 76, 81, 82, 23, 173, 111, 17, 227, 63, + 54, 181, 207, 23, 58, 96, 74, 102, 243, 82, 17, 76, 123, 202, 132, 70, + 82, 109, 118, 200, 11, 170, 18, 131, 4, 162, 198, 72, 79, 13, 139, 164, + 231, 67, 136, 196, 90, 7, 99, 215, 183, 46, 149, 49, 26, 226, 63, 232, + 242, 200, 32, 216, 31, 72, 231, 170, 25, 79, 94, 242, 35, 11, 47, 198, + 60, 27, 146, 130, 12, 123, 147, 229, 138, 190, 29, 244, 126, 89, 37, 115, + 156, 162, 37, 214, 81, 25, 11, 50, 99, 192, 144, 52, 53, 69, 230, 160, + 212, 20, 75, 61, 149, 240, 243, 151, 149, 223, 162, 50, 140, 168, 233, 172, + 196, 157, 151, 244, 74, 218, 212, 98, 123, 95, 203, 213, 156, 48, 33, 170, + 80, 189, 78, 207, 167, 133, 63, 13, 50, 134, 146, 142, 230, 24, 36, 144, + 108, 188, 1, 126, 111, 159, 140, 42, 74, 14, 81, 110, 155, 47, 146, 44, + 71, 110, 202, 137, 64, 220, 216, 26, 105, 96, 97, 33, 224, 254, 228, 42, + 135, 131, 112, 56, 80, 99, 150, 135, 211, 134, 165, 226, 176, 8, 148, 67, + 94, 206, 13, 27, 207, 162, 43, 7, 106, 230, 240, 248, 2, 59, 184, 224, + 48, 108, 91, 251, 30, 82, 231, 244, 245, 128, 190, 82, 13, 221, 138, 140, + 131, 30, 54, 13, 227, 107, 101, 158, 26, 121, 46, 14, 38, 2, 79, 67, + 207, 152, 162, 41, 56, 109, 161, 231, 10, 102, 61, 233, 252, 124, 176, 143, + 105, 99, 229, 251, 232, 122, 203, 139, 27, 150, 56, 153, 222, 223, 46, 114, + 180, 204, 58, 120, 161, 109, 199, 155, 122, 27, 14, 6, 176, 166, 240, 255, + 65, 32, 94, 237, 63, 142, 14, 247, 218, 87, 221, 71, 131, 65, 167, 15, + 127, 158, 254, 248, 243, 193, 30, 246, 115, 184, 7, 223, 58, 251, 24, 49, + 15, 131, 168, 173, 219, 131, 176, 59, 236, 132, 56, 156, 31, 247, 134, 131, + 78, 231, 180, 21, 40, 75, 151, 218, 40, 14, 95, 160, 27, 250, 133, 147, + 77, 15, 79, 182, 100, 33, 33, 64, 104, 60, 105, 195, 131, 47, 66, 250, + 23, 30, 134, 167, 45, 236, 20, 240, 37, 119, 21, 149, 203, 8, 198, 31, + 30, 194, 14, 172, 139, 224, 97, 80, 194, 173, 133, 33, 153, 112, 78, 131, + 224, 244, 244, 84, 51, 21, 220, 55, 244, 121, 56, 61, 233, 14, 207, 96, + 150, 187, 63, 142, 96, 146, 143, 31, 118, 250, 143, 159, 254, 52, 106, 111, + 228, 43, 84, 221, 195, 52, 193, 221, 54, 76, 118, 255, 39, 152, 112, 255, + 112, 208, 217, 67, 199, 30, 154, 104, 135, 150, 226, 167, 78, 103, 183, 113, + 185, 233, 50, 44, 243, 114, 77, 94, 199, 204, 146, 107, 45, 115, 211, 244, + 80, 75, 114, 56, 13, 30, 209, 151, 41, 125, 99, 242, 29, 190, 14, 172, + 166, 224, 39, 140, 249, 10, 198, 180, 129, 127, 56, 156, 143, 157, 159, 241, + 227, 225, 30, 185, 56, 237, 109, 246, 62, 238, 29, 210, 176, 152, 36, 54, + 3, 251, 158, 116, 27, 156, 248, 70, 209, 94, 48, 166, 69, 62, 207, 155, + 70, 52, 96, 157, 193, 183, 176, 124, 15, 63, 135, 210, 225, 0, 254, 127, + 116, 72, 48, 2, 255, 35, 240, 162, 152, 255, 10, 195, 220, 133, 3, 94, + 250, 97, 96, 95, 104, 176, 134, 193, 190, 108, 207, 160, 247, 16, 53, 31, + 206, 102, 72, 21, 107, 79, 130, 238, 160, 55, 212, 75, 240, 208, 29, 255, + 183, 146, 4, 140, 151, 82, 201, 72, 129, 26, 73, 211, 166, 241, 115, 200, + 188, 224, 96, 128, 69, 214, 37, 180, 55, 124, 4, 192, 77, 16, 166, 119, + 255, 122, 221, 126, 204, 144, 116, 19, 110, 249, 14, 32, 102, 15, 122, 79, + 234, 14, 122, 143, 96, 17, 224, 166, 134, 70, 30, 60, 251, 12, 143, 29, + 39, 144, 77, 84, 1, 88, 165, 65, 248, 100, 0, 199, 9, 103, 46, 79, + 63, 31, 240, 15, 167, 77, 85, 47, 192, 37, 134, 181, 253, 130, 173, 203, + 213, 58, 28, 26, 232, 48, 48, 177, 237, 78, 32, 45, 43, 223, 3, 104, + 85, 166, 1, 103, 27, 208, 209, 66, 55, 2, 216, 1, 65, 251, 166, 127, + 192, 176, 126, 176, 183, 65, 76, 243, 241, 231, 131, 238, 225, 110, 56, 56, + 69, 97, 35, 210, 162, 184, 176, 189, 71, 206, 124, 128, 43, 213, 139, 240, + 8, 15, 104, 150, 240, 242, 15, 31, 185, 107, 52, 36, 160, 130, 53, 98, + 79, 87, 121, 106, 86, 11, 206, 116, 239, 192, 105, 218, 222, 190, 225, 23, + 176, 90, 143, 104, 155, 204, 243, 131, 51, 66, 21, 24, 218, 113, 96, 158, + 30, 158, 5, 248, 4, 223, 200, 6, 120, 87, 145, 132, 111, 1, 212, 199, + 73, 215, 46, 147, 73, 28, 45, 145, 105, 78, 162, 198, 27, 14, 46, 206, + 197, 102, 12, 101, 0, 38, 113, 132, 173, 125, 73, 20, 115, 21, 168, 111, + 27, 130, 248, 105, 122, 17, 60, 196, 2, 110, 143, 223, 69, 128, 253, 144, + 217, 23, 137, 144, 207, 108, 137, 5, 221, 52, 89, 230, 141, 248, 144, 94, + 72, 147, 138, 230, 58, 71, 127, 153, 98, 28, 149, 113, 154, 2, 37, 55, + 174, 63, 221, 81, 116, 219, 104, 16, 140, 203, 21, 236, 247, 112, 212, 106, + 201, 215, 131, 81, 43, 168, 49, 119, 127, 43, 145, 197, 104, 106, 11, 122, + 184, 8, 6, 59, 112, 4, 30, 140, 225, 30, 83, 182, 55, 176, 100, 230, + 215, 8, 211, 166, 20, 73, 87, 189, 36, 157, 132, 85, 186, 213, 105, 5, + 24, 245, 211, 175, 213, 130, 157, 216, 129, 103, 163, 22, 206, 28, 166, 205, + 196, 231, 132, 39, 127, 20, 124, 251, 253, 215, 63, 61, 63, 221, 45, 131, + 87, 209, 28, 201, 48, 88, 109, 182, 248, 124, 174, 236, 170, 143, 90, 138, + 96, 213, 156, 68, 151, 99, 70, 171, 88, 16, 150, 180, 87, 149, 157, 183, + 218, 231, 85, 181, 42, 143, 250, 125, 252, 221, 75, 214, 29, 211, 140, 83, + 94, 6, 180, 188, 177, 134, 246, 131, 40, 5, 112, 43, 97, 236, 64, 28, + 220, 60, 112, 230, 101, 55, 101, 181, 246, 60, 95, 109, 216, 240, 163, 29, + 119, 0, 97, 13, 190, 232, 30, 12, 14, 6, 97, 240, 34, 186, 72, 167, + 193, 251, 50, 62, 95, 47, 87, 64, 106, 252, 63, 255, 59, 232, 243, 212, + 225, 243, 249, 235, 239, 223, 245, 26, 230, 16, 155, 57, 92, 94, 94, 246, + 230, 69, 178, 137, 123, 179, 194, 76, 100, 103, 63, 57, 57, 11, 112, 100, + 238, 94, 59, 187, 170, 30, 238, 143, 134, 59, 215, 25, 112, 194, 237, 107, + 160, 226, 135, 173, 221, 27, 192, 142, 124, 5, 92, 239, 118, 119, 111, 184, + 49, 220, 37, 213, 254, 82, 62, 39, 15, 84, 27, 173, 94, 0, 53, 165, + 164, 90, 62, 130, 56, 213, 178, 46, 138, 205, 223, 92, 87, 55, 122, 165, + 16, 184, 139, 101, 207, 103, 42, 156, 177, 114, 195, 15, 246, 20, 236, 206, + 114, 224, 23, 139, 134, 34, 122, 140, 133, 26, 99, 107, 111, 15, 110, 56, + 186, 223, 40, 21, 132, 240, 85, 199, 95, 189, 123, 243, 221, 223, 222, 127, + 253, 221, 79, 193, 235, 55, 193, 223, 143, 191, 255, 254, 248, 245, 251, 159, + 158, 74, 200, 15, 12, 97, 85, 2, 51, 6, 188, 199, 81, 224, 193, 75, + 176, 183, 215, 242, 56, 37, 57, 51, 231, 213, 114, 225, 45, 238, 232, 63, + 121, 122, 100, 16, 163, 214, 151, 125, 88, 235, 236, 89, 75, 158, 192, 153, + 250, 18, 31, 64, 165, 205, 34, 25, 33, 129, 9, 72, 242, 40, 56, 253, + 244, 9, 146, 75, 128, 216, 117, 209, 249, 173, 69, 159, 216, 69, 151, 247, + 47, 26, 111, 45, 58, 24, 60, 114, 139, 78, 252, 162, 179, 60, 171, 186, + 151, 152, 26, 12, 150, 126, 146, 47, 166, 86, 97, 150, 115, 234, 214, 73, + 118, 4, 85, 128, 243, 31, 35, 179, 91, 43, 233, 207, 238, 212, 26, 201, + 193, 224, 16, 70, 130, 27, 14, 253, 205, 162, 101, 186, 216, 28, 193, 117, + 153, 229, 4, 182, 88, 244, 153, 2, 232, 47, 63, 121, 241, 230, 249, 251, + 159, 222, 126, 29, 208, 14, 191, 253, 219, 87, 223, 1, 48, 157, 182, 186, + 253, 254, 223, 15, 159, 247, 251, 47, 222, 191, 8, 126, 252, 203, 251, 87, + 223, 193, 53, 57, 8, 222, 163, 121, 102, 202, 146, 160, 126, 255, 235, 215, + 167, 128, 11, 90, 8, 67, 114, 92, 47, 15, 123, 121, 49, 239, 191, 255, + 190, 127, 133, 205, 13, 177, 186, 124, 237, 86, 86, 221, 222, 180, 194, 185, + 195, 249, 255, 242, 147, 110, 247, 83, 49, 143, 32, 230, 18, 230, 204, 32, + 215, 195, 106, 112, 79, 119, 187, 84, 14, 47, 162, 116, 10, 111, 49, 96, + 212, 152, 197, 81, 210, 132, 126, 85, 229, 171, 49, 218, 162, 224, 106, 89, + 79, 129, 16, 28, 195, 43, 120, 248, 189, 146, 163, 124, 217, 135, 215, 207, + 248, 175, 211, 4, 95, 229, 245, 250, 248, 188, 72, 48, 6, 123, 145, 75, + 183, 231, 7, 207, 222, 226, 253, 10, 36, 205, 151, 125, 248, 129, 207, 214, + 11, 250, 88, 164, 207, 72, 49, 161, 164, 53, 98, 106, 32, 81, 7, 167, + 193, 154, 104, 89, 20, 86, 126, 25, 5, 231, 176, 199, 35, 103, 25, 231, + 217, 154, 214, 113, 145, 66, 183, 192, 232, 247, 103, 211, 69, 119, 216, 59, + 236, 85, 87, 21, 116, 254, 237, 235, 191, 5, 223, 20, 73, 18, 188, 112, + 132, 65, 223, 113, 233, 47, 251, 209, 179, 80, 171, 120, 177, 214, 151, 208, + 144, 26, 214, 113, 96, 122, 228, 3, 165, 150, 164, 183, 154, 206, 160, 113, + 252, 80, 181, 177, 41, 45, 100, 176, 231, 162, 37, 161, 78, 219, 47, 41, + 229, 107, 169, 173, 34, 48, 135, 45, 10, 93, 3, 90, 181, 41, 43, 140, + 80, 36, 164, 112, 214, 170, 200, 1, 31, 46, 151, 72, 12, 255, 25, 165, + 31, 25, 227, 37, 96, 73, 11, 111, 101, 44, 36, 213, 175, 214, 72, 54, + 71, 139, 178, 143, 38, 83, 40, 132, 31, 79, 162, 197, 2, 136, 100, 24, + 63, 144, 141, 95, 201, 211, 224, 43, 124, 26, 188, 151, 226, 52, 27, 82, + 225, 125, 98, 143, 250, 239, 146, 151, 178, 92, 207, 231, 168, 9, 70, 217, + 21, 249, 126, 145, 153, 129, 73, 172, 10, 243, 48, 67, 82, 67, 232, 147, + 136, 178, 87, 50, 172, 62, 83, 143, 131, 21, 114, 235, 212, 225, 100, 83, + 223, 99, 163, 213, 129, 47, 61, 104, 190, 143, 187, 26, 21, 197, 38, 120, + 83, 206, 243, 124, 202, 123, 200, 66, 36, 137, 141, 135, 105, 24, 49, 112, + 197, 172, 72, 129, 19, 90, 80, 150, 102, 32, 77, 57, 148, 25, 122, 57, + 231, 165, 142, 143, 167, 214, 119, 18, 149, 24, 10, 172, 29, 5, 19, 90, + 212, 106, 202, 226, 226, 117, 69, 197, 161, 17, 202, 97, 211, 49, 187, 216, + 23, 0, 6, 112, 134, 81, 203, 161, 138, 97, 116, 239, 57, 10, 209, 76, + 135, 7, 196, 33, 54, 128, 189, 153, 235, 167, 114, 77, 32, 70, 252, 193, + 192, 147, 189, 244, 245, 194, 67, 40, 76, 52, 155, 83, 244, 182, 230, 15, + 160, 198, 27, 18, 166, 47, 120, 108, 87, 213, 221, 221, 28, 66, 37, 166, + 184, 44, 59, 47, 210, 235, 38, 5, 64, 35, 224, 209, 249, 230, 238, 86, + 30, 98, 43, 172, 42, 155, 145, 125, 133, 150, 1, 170, 24, 88, 119, 183, + 241, 8, 219, 200, 72, 14, 132, 158, 62, 164, 121, 187, 187, 214, 99, 168, + 245, 92, 217, 131, 208, 8, 200, 80, 72, 249, 21, 220, 163, 133, 207, 85, + 191, 125, 17, 255, 72, 42, 220, 52, 185, 71, 229, 47, 160, 242, 59, 219, + 203, 190, 64, 39, 162, 187, 235, 61, 129, 122, 175, 154, 69, 72, 247, 168, + 61, 28, 232, 93, 35, 139, 20, 92, 47, 113, 209, 185, 71, 101, 132, 44, + 49, 130, 244, 180, 165, 78, 229, 254, 109, 176, 54, 68, 96, 83, 250, 162, + 198, 234, 205, 181, 209, 98, 65, 131, 247, 183, 236, 186, 247, 102, 117, 231, + 78, 233, 106, 7, 122, 179, 222, 208, 102, 221, 171, 210, 161, 26, 235, 171, + 40, 75, 87, 107, 142, 114, 116, 175, 154, 15, 253, 109, 122, 163, 220, 168, + 239, 85, 29, 65, 250, 7, 54, 248, 248, 205, 93, 51, 96, 163, 20, 237, + 183, 215, 69, 144, 254, 54, 201, 81, 166, 188, 249, 237, 181, 17, 166, 191, + 33, 254, 25, 64, 228, 94, 53, 16, 154, 191, 73, 162, 106, 141, 177, 246, + 190, 190, 170, 10, 118, 44, 187, 87, 93, 11, 150, 95, 20, 209, 229, 125, + 187, 36, 40, 134, 173, 41, 210, 43, 225, 21, 239, 63, 65, 2, 94, 184, + 29, 95, 37, 152, 7, 225, 126, 85, 14, 105, 59, 240, 246, 94, 4, 223, + 44, 242, 203, 251, 213, 66, 248, 57, 46, 138, 104, 83, 134, 239, 211, 133, + 36, 75, 250, 134, 92, 71, 238, 215, 192, 35, 106, 128, 35, 89, 222, 175, + 6, 194, 205, 223, 163, 2, 243, 21, 223, 179, 15, 132, 150, 23, 9, 202, + 247, 163, 251, 31, 196, 33, 66, 201, 87, 34, 111, 231, 105, 145, 71, 254, + 253, 42, 63, 209, 123, 254, 78, 180, 27, 188, 52, 63, 160, 181, 248, 61, + 49, 1, 194, 205, 235, 100, 141, 186, 227, 215, 73, 117, 153, 23, 31, 238, + 89, 113, 200, 91, 121, 145, 100, 41, 41, 18, 149, 195, 255, 61, 171, 211, + 53, 75, 122, 217, 151, 150, 124, 231, 121, 19, 14, 220, 218, 6, 66, 19, + 116, 155, 1, 149, 147, 37, 221, 239, 224, 126, 188, 39, 70, 57, 120, 104, + 221, 119, 239, 206, 243, 162, 138, 215, 213, 111, 193, 219, 216, 179, 173, 233, + 91, 151, 73, 99, 109, 33, 121, 44, 202, 5, 41, 33, 77, 189, 32, 85, + 4, 213, 176, 36, 220, 91, 207, 190, 68, 254, 138, 165, 116, 196, 151, 172, + 137, 239, 152, 60, 35, 33, 207, 151, 253, 201, 179, 123, 8, 122, 128, 244, + 194, 86, 158, 57, 50, 21, 37, 138, 241, 58, 64, 35, 7, 238, 97, 171, + 140, 166, 133, 221, 74, 147, 225, 86, 209, 204, 142, 47, 154, 249, 83, 18, + 97, 84, 207, 167, 102, 8, 237, 173, 228, 55, 140, 192, 123, 130, 107, 210, + 161, 101, 196, 85, 217, 217, 42, 132, 115, 196, 53, 13, 2, 5, 148, 214, + 8, 87, 122, 94, 104, 166, 121, 66, 129, 48, 186, 192, 192, 29, 5, 195, + 213, 85, 80, 230, 152, 118, 241, 244, 211, 56, 142, 159, 158, 182, 250, 207, + 52, 181, 170, 54, 157, 9, 214, 47, 211, 37, 156, 208, 69, 53, 66, 51, + 160, 128, 27, 129, 239, 176, 167, 59, 101, 17, 195, 55, 120, 223, 71, 83, + 37, 100, 13, 123, 171, 108, 14, 165, 250, 207, 254, 148, 77, 202, 213, 83, + 254, 75, 16, 226, 66, 68, 203, 72, 133, 160, 139, 7, 67, 77, 4, 215, + 244, 198, 246, 252, 218, 187, 215, 255, 252, 231, 117, 31, 101, 60, 55, 55, + 187, 157, 29, 201, 176, 61, 134, 157, 235, 5, 173, 221, 214, 117, 95, 9, + 191, 110, 194, 7, 142, 52, 96, 123, 209, 185, 87, 116, 238, 22, 213, 18, + 168, 221, 86, 168, 5, 58, 110, 99, 228, 58, 30, 194, 199, 159, 38, 235, + 197, 226, 105, 208, 170, 189, 239, 201, 251, 79, 159, 124, 62, 56, 104, 42, + 48, 214, 5, 30, 63, 122, 136, 5, 162, 233, 116, 12, 116, 239, 7, 154, + 125, 47, 208, 219, 137, 112, 209, 186, 174, 110, 90, 12, 34, 182, 80, 76, + 196, 93, 214, 114, 113, 29, 132, 167, 73, 209, 71, 104, 111, 62, 6, 255, + 174, 236, 107, 59, 131, 89, 135, 240, 96, 111, 143, 183, 154, 14, 22, 158, + 49, 2, 247, 170, 226, 79, 37, 69, 168, 139, 19, 120, 118, 53, 112, 84, + 16, 136, 92, 98, 159, 203, 160, 222, 149, 64, 176, 161, 185, 6, 25, 73, + 172, 142, 182, 39, 38, 105, 40, 42, 237, 91, 229, 60, 137, 59, 154, 64, + 95, 201, 226, 51, 86, 25, 25, 252, 242, 219, 100, 124, 167, 167, 191, 71, + 198, 247, 127, 254, 215, 233, 41, 25, 245, 161, 167, 217, 234, 244, 244, 121, + 156, 253, 159, 255, 101, 73, 209, 234, 239, 39, 230, 125, 209, 244, 190, 48, + 239, 231, 77, 239, 231, 230, 125, 124, 71, 251, 75, 24, 173, 146, 19, 159, + 42, 33, 8, 137, 231, 78, 162, 135, 171, 8, 208, 103, 56, 28, 244, 30, + 173, 170, 16, 174, 99, 180, 175, 58, 187, 158, 228, 249, 135, 27, 216, 141, + 211, 211, 53, 26, 105, 197, 31, 96, 159, 175, 207, 55, 80, 20, 224, 45, + 156, 69, 89, 188, 57, 159, 22, 33, 33, 138, 52, 190, 10, 163, 101, 89, + 110, 150, 19, 252, 68, 13, 123, 72, 1, 102, 194, 101, 244, 33, 73, 167, + 87, 225, 130, 141, 170, 48, 127, 38, 156, 0, 110, 87, 170, 150, 152, 251, + 227, 250, 26, 81, 217, 13, 191, 32, 193, 3, 98, 206, 107, 234, 6, 206, + 107, 154, 241, 155, 5, 238, 246, 201, 233, 169, 121, 126, 125, 115, 125, 122, + 138, 12, 243, 100, 6, 159, 231, 9, 214, 189, 57, 187, 174, 21, 33, 56, + 67, 99, 40, 233, 163, 104, 110, 9, 221, 71, 169, 84, 67, 19, 126, 47, + 220, 80, 140, 160, 121, 205, 223, 203, 164, 2, 186, 106, 14, 211, 225, 210, + 151, 233, 180, 58, 191, 185, 126, 172, 134, 111, 191, 95, 97, 144, 185, 41, + 108, 195, 205, 245, 96, 21, 215, 223, 231, 211, 41, 110, 4, 12, 102, 14, + 213, 175, 135, 143, 112, 123, 234, 197, 208, 6, 246, 150, 114, 20, 153, 46, + 41, 174, 225, 62, 153, 38, 43, 28, 204, 80, 222, 45, 242, 213, 106, 35, + 227, 102, 203, 74, 218, 154, 235, 56, 186, 185, 46, 230, 19, 24, 85, 239, + 11, 212, 13, 54, 148, 152, 168, 18, 225, 160, 119, 0, 255, 30, 55, 148, + 137, 173, 50, 143, 26, 91, 153, 234, 126, 30, 135, 242, 79, 151, 34, 240, + 135, 217, 233, 33, 57, 111, 38, 230, 205, 196, 125, 51, 55, 111, 98, 247, + 77, 108, 222, 76, 221, 55, 153, 126, 51, 129, 139, 225, 131, 253, 146, 216, + 99, 120, 141, 30, 86, 69, 66, 98, 223, 98, 115, 29, 222, 0, 56, 132, + 82, 46, 75, 46, 133, 137, 134, 114, 207, 163, 155, 147, 225, 153, 108, 190, + 89, 206, 79, 135, 141, 133, 39, 245, 194, 147, 173, 133, 227, 122, 225, 120, + 107, 225, 105, 189, 240, 212, 42, 92, 165, 0, 63, 8, 223, 147, 252, 138, + 33, 145, 191, 88, 32, 123, 122, 74, 33, 161, 174, 89, 148, 124, 115, 122, + 122, 65, 98, 247, 189, 235, 131, 120, 9, 141, 156, 10, 122, 86, 71, 248, + 132, 170, 141, 134, 240, 246, 236, 154, 49, 30, 6, 33, 160, 11, 1, 42, + 227, 127, 170, 129, 33, 52, 0, 205, 255, 101, 61, 71, 76, 203, 103, 234, + 26, 141, 198, 254, 2, 131, 23, 164, 3, 255, 65, 17, 142, 64, 103, 84, + 122, 140, 204, 61, 90, 177, 161, 117, 120, 4, 204, 141, 26, 250, 141, 76, + 58, 90, 87, 64, 116, 67, 179, 223, 81, 252, 65, 152, 224, 172, 166, 221, + 59, 61, 221, 77, 4, 61, 36, 102, 69, 113, 182, 211, 228, 10, 237, 53, + 175, 95, 42, 87, 45, 37, 57, 225, 226, 132, 230, 240, 21, 99, 169, 178, + 130, 163, 119, 205, 105, 7, 203, 17, 134, 29, 153, 45, 146, 43, 178, 126, + 101, 113, 166, 168, 59, 216, 84, 3, 239, 99, 110, 134, 215, 92, 225, 103, + 211, 52, 109, 24, 111, 29, 138, 48, 243, 153, 18, 96, 50, 6, 58, 143, + 86, 48, 211, 189, 107, 37, 201, 87, 167, 159, 136, 188, 189, 107, 145, 169, + 227, 211, 224, 126, 18, 125, 179, 49, 183, 139, 233, 111, 92, 25, 253, 169, + 152, 9, 124, 175, 36, 207, 56, 243, 64, 20, 0, 36, 150, 44, 49, 68, + 21, 220, 40, 197, 226, 250, 158, 170, 130, 27, 106, 245, 127, 170, 166, 143, + 51, 12, 216, 135, 74, 100, 203, 255, 203, 17, 237, 235, 196, 111, 198, 210, + 57, 170, 142, 24, 74, 84, 191, 182, 32, 222, 232, 14, 72, 0, 126, 211, + 115, 23, 239, 85, 14, 76, 34, 115, 215, 180, 128, 120, 20, 175, 133, 102, + 187, 97, 43, 74, 156, 101, 119, 198, 66, 20, 138, 63, 150, 117, 37, 9, + 6, 133, 154, 64, 254, 150, 72, 55, 223, 202, 50, 220, 178, 248, 207, 147, + 231, 47, 191, 251, 110, 103, 134, 203, 94, 230, 179, 234, 146, 173, 178, 121, + 109, 112, 12, 237, 239, 190, 125, 251, 93, 151, 130, 120, 2, 8, 246, 161, + 105, 252, 141, 18, 126, 24, 40, 76, 152, 195, 14, 137, 204, 189, 212, 118, + 218, 148, 193, 70, 235, 222, 75, 241, 182, 138, 217, 58, 178, 191, 84, 194, + 166, 164, 207, 38, 24, 125, 21, 101, 41, 241, 236, 68, 81, 104, 137, 81, + 186, 66, 178, 209, 213, 73, 76, 48, 234, 82, 28, 41, 15, 139, 136, 3, + 188, 29, 190, 216, 175, 180, 29, 100, 73, 50, 126, 138, 3, 72, 198, 178, + 5, 71, 47, 245, 141, 40, 161, 225, 115, 98, 239, 25, 201, 96, 7, 7, + 47, 108, 3, 69, 50, 52, 37, 144, 248, 118, 23, 73, 103, 127, 98, 18, + 34, 66, 157, 39, 20, 46, 195, 44, 248, 84, 224, 143, 96, 151, 225, 187, + 170, 8, 87, 221, 236, 134, 164, 232, 177, 44, 20, 200, 254, 149, 210, 15, + 36, 114, 30, 156, 93, 247, 205, 101, 103, 74, 130, 166, 178, 185, 0, 101, + 186, 32, 203, 0, 101, 222, 13, 235, 85, 209, 150, 187, 45, 41, 159, 141, + 68, 114, 114, 4, 90, 51, 66, 187, 153, 137, 174, 9, 135, 64, 60, 55, + 177, 224, 31, 208, 140, 252, 91, 193, 188, 252, 100, 71, 195, 73, 185, 78, + 37, 233, 116, 109, 174, 139, 116, 98, 166, 75, 200, 53, 12, 86, 121, 81, + 69, 98, 149, 143, 10, 163, 110, 25, 205, 88, 52, 189, 116, 34, 192, 2, + 31, 190, 191, 95, 159, 56, 52, 89, 96, 178, 89, 14, 60, 138, 92, 147, + 138, 84, 150, 22, 211, 46, 170, 136, 200, 210, 127, 33, 249, 247, 216, 66, + 248, 101, 181, 91, 42, 167, 248, 227, 183, 47, 217, 203, 177, 212, 138, 52, + 202, 109, 145, 147, 225, 14, 226, 127, 119, 193, 244, 74, 179, 45, 117, 90, + 4, 232, 52, 161, 103, 175, 50, 255, 45, 209, 191, 50, 153, 193, 169, 3, + 28, 217, 142, 130, 231, 212, 145, 139, 20, 44, 175, 192, 218, 82, 17, 92, + 117, 255, 71, 197, 107, 181, 90, 172, 231, 24, 105, 28, 103, 73, 70, 111, + 238, 152, 226, 104, 21, 77, 210, 69, 138, 122, 7, 181, 91, 188, 82, 64, + 51, 228, 48, 18, 37, 103, 91, 1, 37, 137, 80, 96, 118, 235, 219, 151, + 175, 222, 210, 171, 191, 22, 41, 71, 251, 10, 94, 229, 20, 115, 52, 202, + 130, 71, 131, 129, 88, 67, 73, 156, 175, 5, 238, 197, 198, 142, 140, 91, + 194, 4, 197, 17, 17, 14, 238, 28, 115, 17, 181, 149, 208, 49, 12, 190, + 66, 122, 6, 6, 251, 39, 212, 194, 85, 9, 202, 82, 80, 42, 141, 159, + 25, 12, 12, 190, 237, 188, 72, 116, 178, 53, 14, 173, 104, 139, 19, 67, + 248, 69, 220, 166, 212, 68, 160, 155, 18, 20, 179, 32, 52, 12, 190, 67, + 227, 93, 252, 36, 1, 13, 246, 84, 158, 71, 232, 188, 31, 6, 111, 57, + 87, 57, 183, 250, 189, 10, 234, 16, 194, 87, 88, 134, 34, 52, 226, 195, + 48, 0, 50, 181, 215, 188, 15, 238, 66, 191, 33, 204, 207, 123, 114, 153, + 76, 200, 225, 32, 141, 41, 236, 45, 193, 16, 33, 130, 146, 237, 194, 140, + 7, 135, 5, 174, 209, 2, 150, 8, 64, 100, 89, 74, 98, 185, 180, 216, + 81, 40, 71, 167, 10, 145, 51, 140, 29, 32, 155, 94, 178, 71, 91, 109, + 104, 255, 128, 117, 230, 161, 252, 143, 170, 11, 183, 122, 50, 53, 40, 136, + 208, 61, 108, 214, 162, 139, 92, 144, 61, 2, 204, 213, 66, 113, 53, 216, + 172, 77, 18, 199, 105, 28, 202, 54, 111, 20, 9, 157, 139, 81, 140, 9, + 238, 31, 105, 26, 11, 149, 213, 111, 162, 25, 220, 128, 56, 12, 201, 153, + 7, 168, 31, 61, 221, 160, 71, 29, 252, 147, 149, 192, 87, 90, 181, 87, + 178, 227, 29, 223, 0, 180, 59, 250, 22, 160, 95, 51, 165, 75, 64, 24, + 221, 81, 247, 1, 254, 86, 55, 130, 14, 158, 231, 162, 117, 239, 166, 80, + 46, 142, 42, 130, 4, 209, 79, 0, 127, 137, 131, 213, 57, 46, 47, 233, + 177, 81, 101, 189, 163, 70, 203, 145, 163, 75, 29, 120, 76, 137, 157, 161, + 226, 225, 139, 246, 126, 213, 177, 111, 144, 217, 34, 143, 42, 149, 74, 79, + 247, 47, 228, 67, 243, 5, 78, 225, 94, 51, 115, 89, 31, 201, 242, 177, + 159, 216, 2, 238, 184, 53, 197, 31, 22, 207, 158, 171, 138, 108, 204, 89, + 84, 35, 106, 56, 167, 209, 46, 250, 227, 84, 137, 246, 59, 135, 35, 160, + 51, 4, 144, 79, 27, 58, 61, 91, 65, 251, 148, 79, 2, 29, 116, 140, + 225, 74, 121, 10, 96, 209, 190, 98, 135, 213, 203, 104, 227, 223, 27, 10, + 21, 32, 29, 8, 72, 133, 162, 140, 160, 46, 51, 202, 48, 177, 169, 24, + 52, 238, 160, 80, 67, 59, 205, 221, 114, 22, 8, 55, 105, 144, 104, 47, + 53, 6, 66, 235, 237, 206, 246, 197, 195, 72, 141, 228, 240, 207, 160, 166, + 214, 132, 239, 20, 68, 136, 148, 119, 7, 160, 91, 60, 216, 215, 20, 181, + 214, 10, 101, 4, 188, 117, 133, 248, 7, 58, 149, 160, 31, 33, 197, 11, + 9, 49, 143, 193, 155, 119, 128, 19, 94, 214, 136, 84, 188, 84, 208, 61, + 214, 35, 151, 52, 129, 20, 180, 249, 65, 247, 185, 34, 142, 248, 55, 37, + 244, 64, 170, 2, 69, 200, 42, 166, 248, 20, 72, 35, 96, 132, 77, 164, + 2, 150, 108, 191, 135, 163, 169, 237, 16, 200, 216, 15, 182, 42, 39, 245, + 225, 134, 114, 9, 63, 143, 146, 255, 151, 189, 119, 223, 115, 219, 70, 22, + 6, 255, 215, 83, 192, 52, 51, 146, 90, 148, 196, 139, 212, 119, 182, 143, + 47, 73, 38, 191, 141, 19, 175, 147, 57, 147, 25, 117, 143, 142, 110, 221, + 98, 172, 155, 69, 169, 37, 89, 209, 121, 157, 125, 143, 125, 178, 173, 11, + 0, 130, 20, 165, 182, 39, 153, 249, 190, 61, 187, 73, 91, 36, 10, 32, + 174, 133, 66, 85, 161, 80, 152, 212, 129, 8, 146, 71, 125, 160, 190, 32, + 60, 192, 72, 243, 249, 191, 120, 208, 153, 247, 134, 56, 150, 136, 76, 68, + 135, 38, 242, 228, 245, 96, 212, 79, 46, 211, 73, 198, 162, 128, 27, 247, + 128, 172, 17, 222, 29, 11, 242, 65, 156, 225, 65, 165, 8, 180, 75, 6, + 161, 163, 213, 17, 196, 193, 92, 238, 62, 71, 75, 191, 51, 6, 82, 254, + 135, 82, 168, 202, 62, 97, 250, 15, 137, 90, 135, 149, 241, 249, 146, 148, + 98, 218, 205, 194, 74, 185, 92, 248, 174, 188, 51, 69, 153, 45, 105, 219, + 119, 89, 45, 188, 82, 242, 209, 25, 87, 129, 182, 144, 134, 174, 245, 191, + 153, 197, 151, 73, 183, 182, 183, 219, 215, 103, 31, 251, 94, 202, 155, 137, + 154, 140, 153, 71, 144, 229, 164, 238, 106, 215, 226, 51, 194, 120, 32, 47, + 252, 191, 255, 175, 59, 149, 50, 49, 172, 100, 26, 109, 124, 145, 68, 176, + 164, 71, 183, 68, 165, 117, 198, 166, 222, 82, 43, 141, 65, 38, 159, 19, + 171, 192, 18, 37, 53, 205, 134, 10, 126, 92, 2, 31, 96, 255, 247, 215, + 236, 155, 89, 73, 60, 132, 45, 114, 129, 208, 178, 99, 70, 61, 10, 216, + 153, 42, 164, 246, 243, 159, 181, 230, 217, 187, 157, 212, 126, 250, 179, 248, + 225, 229, 219, 175, 111, 39, 100, 217, 124, 123, 91, 21, 239, 96, 41, 131, + 74, 239, 19, 14, 227, 90, 208, 228, 138, 24, 149, 151, 38, 162, 53, 172, + 19, 102, 251, 231, 175, 191, 127, 71, 246, 209, 74, 81, 122, 123, 123, 255, + 222, 208, 139, 66, 240, 149, 161, 6, 53, 52, 158, 134, 114, 19, 18, 125, + 151, 210, 101, 26, 234, 217, 48, 223, 202, 90, 21, 215, 110, 255, 96, 148, + 214, 110, 155, 133, 25, 161, 158, 10, 253, 179, 214, 217, 41, 68, 77, 186, + 251, 203, 173, 120, 169, 173, 105, 203, 93, 236, 178, 67, 102, 184, 73, 81, + 35, 200, 0, 221, 98, 156, 88, 233, 253, 25, 193, 93, 238, 112, 87, 100, + 35, 94, 81, 196, 171, 253, 136, 239, 40, 226, 187, 189, 8, 0, 223, 202, + 255, 50, 113, 152, 63, 71, 226, 8, 103, 162, 94, 169, 168, 108, 81, 88, + 134, 140, 250, 78, 78, 152, 173, 235, 44, 118, 208, 90, 244, 66, 62, 74, + 207, 23, 110, 110, 142, 149, 177, 109, 157, 88, 5, 224, 127, 218, 143, 11, + 60, 245, 114, 201, 58, 127, 10, 24, 184, 23, 4, 45, 247, 10, 254, 31, + 27, 88, 192, 192, 192, 187, 106, 94, 140, 13, 244, 147, 96, 223, 4, 143, + 53, 184, 105, 130, 123, 26, 124, 106, 130, 187, 12, 246, 0, 112, 31, 21, + 158, 255, 7, 222, 131, 40, 213, 22, 50, 116, 169, 143, 61, 104, 95, 179, + 146, 24, 171, 3, 195, 228, 5, 142, 156, 151, 170, 152, 220, 83, 5, 173, + 59, 108, 239, 51, 215, 110, 163, 163, 171, 201, 20, 16, 77, 40, 140, 162, + 125, 138, 71, 68, 146, 116, 217, 232, 164, 23, 173, 166, 234, 130, 45, 114, + 36, 92, 30, 168, 184, 20, 242, 104, 69, 155, 200, 208, 77, 232, 210, 37, + 169, 236, 61, 243, 6, 2, 72, 68, 85, 16, 35, 129, 54, 162, 104, 214, + 38, 85, 96, 10, 50, 36, 107, 97, 0, 65, 166, 165, 74, 89, 183, 253, + 59, 186, 83, 146, 207, 32, 207, 181, 154, 66, 250, 231, 36, 126, 216, 112, + 110, 66, 117, 169, 233, 111, 233, 4, 122, 81, 87, 40, 12, 93, 121, 119, + 130, 172, 62, 243, 215, 130, 206, 29, 19, 153, 208, 151, 233, 18, 247, 73, + 53, 67, 226, 53, 209, 231, 121, 147, 188, 223, 164, 188, 19, 92, 138, 162, + 217, 17, 80, 144, 40, 41, 230, 144, 35, 202, 142, 89, 19, 15, 125, 179, + 26, 157, 131, 31, 144, 83, 161, 84, 7, 133, 233, 206, 73, 229, 74, 215, + 14, 170, 234, 0, 203, 188, 128, 58, 89, 248, 36, 15, 112, 150, 211, 6, + 38, 67, 94, 31, 134, 3, 209, 131, 8, 60, 7, 70, 30, 14, 67, 188, + 0, 125, 50, 165, 235, 207, 55, 208, 141, 187, 220, 222, 102, 214, 230, 188, + 121, 42, 76, 30, 241, 245, 247, 127, 249, 57, 86, 87, 2, 24, 119, 249, + 74, 159, 184, 176, 168, 1, 85, 215, 249, 21, 117, 141, 138, 138, 55, 222, + 10, 31, 183, 220, 162, 89, 85, 93, 36, 242, 155, 56, 117, 229, 111, 251, + 30, 21, 9, 230, 123, 187, 3, 141, 253, 77, 250, 178, 110, 99, 33, 192, + 205, 182, 93, 47, 129, 205, 33, 17, 135, 251, 120, 243, 50, 246, 151, 215, + 104, 6, 8, 120, 184, 239, 180, 59, 179, 117, 27, 39, 187, 17, 244, 155, + 42, 4, 45, 235, 69, 113, 199, 76, 0, 157, 11, 195, 72, 50, 135, 9, + 6, 193, 6, 202, 245, 37, 128, 140, 249, 30, 97, 96, 96, 92, 70, 209, + 195, 175, 139, 65, 220, 70, 111, 102, 232, 142, 188, 77, 185, 143, 96, 102, + 46, 166, 72, 189, 6, 3, 106, 192, 40, 26, 76, 218, 15, 228, 88, 26, + 66, 99, 60, 231, 140, 170, 140, 84, 160, 130, 161, 73, 103, 52, 125, 184, + 95, 183, 209, 121, 74, 219, 59, 63, 115, 185, 50, 102, 212, 116, 212, 111, + 147, 126, 184, 29, 29, 0, 31, 132, 167, 34, 226, 193, 44, 234, 236, 103, + 143, 170, 7, 25, 23, 29, 130, 115, 4, 74, 174, 240, 156, 161, 191, 208, + 205, 12, 8, 43, 42, 178, 218, 212, 11, 227, 41, 169, 143, 33, 22, 56, + 18, 249, 32, 20, 156, 210, 169, 253, 118, 191, 51, 255, 128, 224, 57, 136, + 1, 61, 24, 1, 31, 3, 203, 197, 114, 76, 253, 243, 216, 105, 159, 122, + 13, 126, 3, 233, 10, 120, 101, 124, 255, 52, 239, 12, 70, 237, 11, 28, + 219, 110, 119, 186, 249, 212, 198, 143, 160, 163, 65, 40, 1, 82, 179, 193, + 0, 170, 51, 168, 24, 82, 103, 104, 8, 250, 124, 224, 64, 127, 208, 198, + 27, 14, 6, 28, 68, 31, 62, 237, 238, 6, 239, 2, 210, 97, 14, 182, + 189, 44, 192, 207, 2, 130, 44, 160, 193, 128, 129, 206, 83, 15, 120, 26, + 186, 193, 235, 217, 87, 140, 181, 104, 78, 131, 67, 208, 39, 124, 87, 0, + 217, 59, 244, 62, 36, 55, 177, 50, 128, 186, 12, 249, 138, 7, 29, 212, + 187, 84, 169, 36, 89, 82, 115, 166, 64, 112, 166, 243, 62, 189, 46, 231, + 93, 152, 44, 167, 84, 69, 98, 207, 185, 110, 242, 11, 134, 0, 233, 27, + 201, 241, 73, 128, 171, 206, 124, 172, 67, 186, 61, 104, 156, 16, 197, 67, + 124, 93, 113, 87, 193, 195, 229, 167, 207, 143, 128, 31, 13, 126, 52, 249, + 113, 202, 143, 51, 126, 156, 243, 227, 2, 31, 168, 37, 106, 123, 152, 21, + 80, 138, 254, 8, 36, 77, 148, 33, 48, 4, 98, 29, 214, 7, 144, 96, + 140, 102, 154, 109, 239, 244, 156, 130, 64, 253, 7, 92, 255, 30, 208, 166, + 113, 71, 191, 80, 13, 228, 107, 144, 188, 54, 146, 215, 102, 242, 58, 153, + 70, 115, 29, 90, 68, 189, 170, 151, 14, 185, 169, 160, 159, 10, 5, 169, + 80, 35, 21, 106, 166, 66, 167, 169, 208, 89, 42, 116, 158, 10, 93, 152, + 33, 179, 121, 20, 244, 211, 193, 84, 5, 112, 176, 219, 247, 48, 87, 83, + 64, 64, 249, 77, 187, 27, 17, 26, 36, 208, 241, 96, 29, 245, 166, 4, + 90, 108, 104, 56, 216, 139, 75, 143, 145, 32, 153, 168, 28, 179, 89, 0, + 242, 4, 84, 26, 32, 252, 156, 19, 73, 132, 237, 141, 16, 65, 59, 203, + 118, 147, 58, 96, 218, 141, 184, 211, 167, 32, 194, 15, 218, 13, 6, 2, + 126, 243, 151, 136, 156, 251, 16, 66, 33, 130, 145, 210, 55, 162, 90, 249, + 12, 131, 70, 205, 241, 128, 128, 12, 220, 47, 71, 208, 13, 238, 133, 10, + 79, 148, 227, 60, 12, 79, 238, 225, 219, 133, 236, 53, 52, 232, 4, 129, + 185, 29, 52, 117, 40, 6, 124, 142, 22, 67, 69, 184, 135, 139, 24, 214, + 0, 224, 16, 153, 81, 79, 82, 109, 218, 100, 39, 49, 153, 102, 160, 10, + 255, 123, 115, 224, 201, 0, 255, 200, 41, 155, 12, 202, 137, 194, 239, 164, + 231, 163, 208, 52, 166, 50, 112, 169, 107, 247, 102, 109, 47, 112, 115, 193, + 141, 92, 104, 51, 23, 122, 154, 11, 61, 207, 131, 6, 121, 192, 220, 178, + 56, 211, 101, 60, 140, 168, 129, 75, 32, 203, 176, 98, 92, 96, 63, 3, + 46, 208, 0, 33, 85, 162, 225, 138, 219, 72, 113, 151, 19, 53, 71, 41, + 66, 210, 19, 63, 29, 214, 223, 49, 59, 239, 114, 120, 49, 104, 7, 148, + 115, 103, 211, 110, 76, 152, 82, 227, 59, 98, 240, 68, 101, 58, 24, 204, + 228, 67, 97, 13, 189, 83, 110, 178, 179, 9, 128, 131, 217, 86, 99, 164, + 128, 38, 134, 18, 0, 191, 72, 0, 180, 221, 128, 87, 93, 78, 40, 72, + 174, 41, 230, 140, 124, 128, 179, 46, 1, 145, 23, 106, 63, 32, 82, 6, + 56, 65, 250, 176, 218, 77, 98, 198, 19, 214, 4, 163, 128, 219, 246, 177, + 139, 251, 191, 194, 92, 153, 50, 103, 209, 39, 101, 237, 20, 185, 16, 12, + 33, 143, 201, 189, 64, 111, 231, 12, 156, 206, 100, 255, 128, 4, 191, 224, + 209, 71, 160, 34, 221, 48, 47, 0, 75, 97, 210, 13, 218, 221, 233, 148, + 90, 53, 232, 63, 108, 6, 196, 240, 255, 134, 135, 241, 31, 16, 245, 218, + 1, 14, 250, 96, 130, 254, 252, 23, 196, 56, 161, 239, 167, 73, 199, 164, + 4, 131, 245, 12, 157, 77, 181, 79, 47, 140, 128, 236, 7, 21, 156, 77, + 71, 157, 57, 222, 167, 134, 32, 96, 89, 104, 89, 151, 105, 240, 1, 53, + 209, 168, 175, 88, 52, 102, 207, 26, 103, 250, 149, 57, 53, 249, 78, 60, + 131, 14, 166, 51, 237, 167, 243, 106, 147, 34, 67, 135, 230, 131, 197, 124, + 202, 120, 146, 2, 248, 26, 240, 24, 61, 70, 186, 6, 163, 233, 244, 3, + 189, 143, 70, 236, 150, 130, 2, 203, 53, 96, 40, 240, 214, 115, 174, 234, + 3, 18, 62, 218, 86, 79, 66, 115, 137, 102, 28, 68, 218, 163, 3, 125, + 224, 197, 58, 58, 132, 152, 36, 153, 22, 47, 15, 232, 107, 224, 35, 110, + 117, 77, 146, 76, 37, 146, 222, 71, 163, 113, 219, 189, 56, 63, 83, 239, + 240, 122, 161, 222, 179, 200, 75, 64, 234, 17, 217, 7, 70, 216, 151, 97, + 110, 198, 168, 179, 104, 19, 49, 129, 183, 71, 154, 180, 247, 211, 135, 135, + 141, 154, 62, 247, 211, 209, 3, 160, 116, 147, 82, 224, 238, 53, 22, 51, + 30, 244, 55, 20, 158, 198, 140, 47, 242, 173, 139, 92, 204, 44, 234, 77, + 56, 235, 229, 175, 17, 80, 25, 55, 245, 222, 174, 164, 67, 233, 96, 85, + 133, 130, 166, 135, 28, 43, 200, 81, 35, 144, 1, 102, 57, 224, 113, 39, + 3, 93, 198, 179, 76, 210, 32, 63, 135, 32, 55, 135, 96, 47, 135, 134, + 235, 14, 205, 247, 164, 234, 28, 74, 7, 117, 213, 207, 93, 247, 147, 249, + 158, 124, 198, 161, 116, 80, 127, 6, 227, 22, 145, 8, 209, 86, 59, 30, + 217, 136, 123, 5, 185, 159, 1, 63, 145, 116, 171, 12, 38, 229, 104, 64, + 14, 36, 7, 164, 166, 156, 9, 173, 238, 1, 246, 32, 57, 95, 245, 112, + 51, 59, 7, 182, 95, 53, 134, 230, 131, 247, 74, 98, 232, 30, 216, 88, + 178, 115, 225, 251, 165, 38, 49, 199, 162, 142, 197, 229, 181, 90, 71, 31, + 172, 97, 186, 242, 129, 235, 186, 221, 108, 56, 85, 89, 9, 201, 3, 237, + 195, 246, 178, 206, 41, 173, 61, 236, 237, 129, 114, 186, 47, 29, 145, 83, + 165, 252, 14, 220, 139, 59, 18, 185, 95, 181, 35, 157, 148, 196, 13, 200, + 83, 169, 142, 110, 155, 248, 63, 236, 207, 213, 235, 100, 48, 157, 117, 38, + 72, 75, 220, 28, 80, 210, 160, 20, 48, 23, 90, 205, 0, 233, 254, 106, + 41, 202, 19, 156, 140, 94, 114, 39, 108, 18, 115, 159, 1, 53, 114, 65, + 107, 5, 138, 145, 49, 232, 152, 133, 196, 203, 25, 228, 124, 8, 148, 180, + 39, 5, 204, 133, 86, 247, 128, 167, 57, 121, 158, 230, 102, 122, 154, 159, + 235, 105, 94, 182, 254, 126, 174, 0, 106, 175, 161, 185, 89, 120, 99, 63, + 105, 35, 175, 252, 70, 110, 241, 141, 188, 210, 207, 247, 179, 60, 207, 203, + 242, 60, 55, 203, 243, 188, 44, 135, 15, 185, 93, 133, 123, 238, 185, 227, + 178, 198, 163, 251, 102, 69, 30, 7, 163, 3, 136, 34, 99, 154, 58, 233, + 154, 78, 253, 163, 126, 133, 241, 237, 16, 188, 242, 112, 48, 102, 126, 48, + 102, 51, 200, 139, 194, 197, 37, 7, 174, 196, 56, 22, 143, 115, 18, 72, + 181, 65, 30, 56, 183, 118, 20, 145, 87, 57, 138, 200, 173, 27, 160, 12, + 18, 0, 224, 109, 142, 68, 198, 139, 126, 126, 236, 99, 110, 187, 72, 239, + 148, 3, 231, 161, 160, 8, 228, 205, 219, 231, 231, 244, 142, 170, 91, 180, + 112, 65, 253, 204, 7, 230, 219, 50, 48, 63, 7, 22, 228, 192, 144, 53, + 127, 152, 226, 225, 123, 100, 170, 59, 32, 71, 140, 62, 16, 104, 212, 39, + 30, 150, 95, 218, 154, 159, 148, 97, 201, 61, 203, 144, 236, 116, 25, 34, + 22, 141, 212, 105, 128, 85, 237, 70, 144, 196, 196, 211, 201, 134, 165, 13, + 9, 72, 88, 74, 6, 60, 116, 22, 42, 219, 251, 181, 44, 180, 29, 35, + 127, 248, 0, 161, 193, 224, 83, 78, 236, 18, 13, 166, 112, 43, 96, 145, + 196, 13, 167, 7, 34, 96, 46, 160, 105, 1, 74, 119, 241, 0, 121, 208, + 113, 52, 57, 28, 219, 60, 22, 235, 185, 169, 216, 3, 181, 204, 214, 98, + 218, 135, 222, 154, 147, 37, 4, 4, 89, 134, 108, 234, 87, 223, 245, 147, + 64, 71, 137, 237, 50, 104, 136, 236, 12, 81, 226, 20, 135, 148, 122, 64, + 3, 80, 226, 36, 38, 219, 8, 250, 58, 248, 208, 38, 37, 3, 7, 208, + 244, 128, 180, 164, 28, 84, 130, 47, 135, 212, 232, 82, 128, 149, 123, 42, + 24, 197, 9, 119, 191, 49, 129, 10, 63, 204, 48, 225, 233, 176, 211, 251, + 128, 38, 54, 52, 206, 195, 206, 108, 182, 153, 160, 132, 238, 145, 246, 101, + 216, 153, 247, 51, 106, 58, 0, 193, 231, 80, 119, 253, 206, 221, 143, 65, + 16, 115, 137, 22, 13, 7, 120, 44, 76, 102, 57, 88, 142, 208, 157, 45, + 7, 162, 62, 32, 149, 122, 207, 215, 137, 12, 35, 220, 71, 224, 36, 35, + 160, 169, 92, 203, 41, 12, 229, 135, 41, 13, 210, 112, 138, 142, 180, 164, + 136, 62, 156, 174, 70, 50, 241, 6, 228, 168, 30, 26, 138, 224, 59, 208, + 92, 82, 219, 209, 241, 144, 24, 253, 196, 51, 124, 54, 153, 198, 81, 204, + 175, 115, 37, 144, 71, 35, 212, 91, 182, 65, 76, 95, 40, 82, 157, 2, + 5, 126, 62, 140, 214, 139, 28, 104, 62, 184, 154, 133, 54, 204, 92, 129, + 87, 105, 180, 103, 163, 37, 116, 61, 161, 156, 4, 15, 103, 237, 76, 200, + 44, 148, 195, 89, 64, 53, 19, 166, 92, 83, 133, 13, 103, 177, 92, 121, + 36, 0, 57, 151, 123, 78, 216, 52, 192, 235, 25, 209, 45, 198, 70, 165, + 21, 129, 16, 250, 77, 141, 0, 43, 8, 73, 248, 182, 128, 5, 174, 86, + 232, 71, 124, 134, 178, 29, 98, 199, 7, 86, 40, 60, 226, 245, 24, 32, + 183, 126, 152, 246, 59, 122, 149, 248, 48, 164, 97, 197, 135, 203, 79, 159, + 31, 1, 63, 26, 252, 104, 242, 227, 148, 31, 103, 252, 56, 231, 7, 78, + 150, 15, 209, 104, 68, 219, 106, 72, 34, 177, 0, 160, 179, 193, 121, 70, + 156, 219, 131, 179, 60, 103, 130, 19, 129, 78, 65, 47, 14, 100, 114, 145, + 159, 201, 69, 78, 38, 168, 140, 134, 97, 239, 77, 52, 100, 80, 165, 197, + 125, 221, 30, 124, 88, 200, 190, 144, 232, 38, 227, 83, 224, 246, 99, 124, + 56, 198, 96, 17, 146, 20, 243, 116, 110, 56, 49, 40, 185, 100, 170, 76, + 176, 204, 204, 223, 75, 47, 35, 26, 251, 17, 164, 26, 205, 249, 128, 224, + 251, 233, 7, 116, 116, 223, 216, 216, 226, 200, 97, 52, 104, 15, 99, 86, + 151, 104, 96, 130, 27, 169, 2, 76, 112, 51, 15, 74, 251, 11, 57, 208, + 189, 222, 65, 3, 176, 57, 177, 162, 57, 32, 154, 81, 251, 192, 92, 104, + 53, 15, 56, 201, 43, 8, 160, 249, 25, 79, 122, 7, 242, 158, 244, 242, + 179, 127, 204, 205, 254, 241, 64, 246, 143, 135, 178, 127, 204, 201, 222, 28, + 182, 4, 180, 159, 177, 102, 173, 247, 160, 121, 89, 230, 116, 8, 67, 243, + 51, 206, 237, 16, 25, 145, 155, 253, 50, 55, 251, 229, 129, 236, 151, 135, + 178, 95, 30, 200, 126, 191, 191, 25, 154, 159, 125, 110, 127, 203, 136, 189, + 236, 207, 247, 251, 251, 60, 175, 191, 207, 115, 251, 251, 60, 175, 191, 17, + 56, 76, 106, 188, 168, 142, 59, 235, 212, 140, 99, 72, 224, 239, 129, 204, + 193, 95, 236, 167, 81, 16, 163, 118, 6, 44, 15, 88, 205, 129, 177, 30, + 68, 66, 231, 81, 53, 83, 172, 130, 152, 133, 36, 176, 60, 96, 53, 7, + 166, 10, 153, 119, 145, 103, 35, 245, 54, 50, 29, 100, 28, 71, 11, 141, + 17, 114, 83, 65, 63, 21, 10, 82, 161, 116, 54, 205, 84, 232, 52, 21, + 58, 75, 133, 206, 83, 161, 11, 10, 1, 19, 165, 216, 197, 85, 7, 13, + 69, 209, 247, 184, 140, 209, 12, 212, 168, 199, 149, 237, 201, 90, 246, 184, + 122, 61, 174, 87, 143, 43, 212, 227, 154, 244, 184, 10, 61, 46, 187, 199, + 133, 246, 184, 180, 193, 100, 10, 189, 79, 219, 10, 163, 232, 126, 208, 126, + 136, 30, 145, 21, 70, 227, 0, 2, 33, 155, 222, 29, 225, 49, 5, 8, + 77, 199, 83, 249, 32, 235, 173, 13, 90, 56, 208, 85, 169, 18, 137, 140, + 152, 53, 26, 81, 180, 227, 81, 212, 87, 116, 26, 247, 149, 245, 86, 151, + 228, 15, 16, 246, 97, 32, 89, 221, 209, 178, 247, 97, 195, 116, 26, 90, + 60, 36, 254, 147, 89, 112, 128, 40, 251, 10, 230, 38, 141, 16, 127, 171, + 1, 100, 55, 147, 132, 53, 203, 43, 1, 188, 245, 71, 97, 114, 225, 2, + 47, 189, 15, 209, 100, 2, 226, 217, 25, 246, 213, 120, 0, 28, 126, 68, + 156, 57, 154, 100, 79, 103, 211, 17, 177, 128, 227, 104, 52, 165, 206, 4, + 185, 33, 66, 7, 197, 241, 162, 215, 129, 172, 34, 118, 255, 133, 17, 83, + 24, 41, 224, 140, 162, 17, 149, 15, 124, 55, 109, 160, 144, 42, 27, 67, + 106, 73, 78, 7, 125, 10, 78, 251, 27, 25, 65, 111, 174, 126, 77, 162, + 3, 253, 214, 208, 111, 77, 253, 118, 170, 223, 206, 244, 219, 185, 126, 187, + 224, 55, 189, 39, 166, 223, 101, 223, 65, 112, 30, 209, 70, 190, 20, 111, + 100, 126, 192, 59, 247, 166, 188, 167, 199, 206, 202, 212, 176, 161, 131, 248, + 79, 178, 198, 244, 230, 38, 175, 6, 212, 79, 94, 131, 228, 181, 145, 188, + 54, 147, 215, 211, 228, 245, 44, 121, 61, 79, 94, 47, 244, 107, 146, 173, + 159, 148, 235, 39, 229, 250, 70, 130, 164, 92, 63, 41, 215, 79, 202, 245, + 147, 114, 253, 164, 92, 63, 41, 215, 79, 202, 77, 242, 10, 146, 114, 131, + 164, 220, 32, 41, 55, 48, 210, 38, 229, 6, 73, 185, 65, 82, 110, 144, + 148, 27, 36, 229, 6, 73, 185, 73, 6, 141, 164, 220, 70, 82, 110, 35, + 41, 183, 145, 148, 219, 48, 62, 75, 202, 109, 36, 229, 54, 146, 114, 27, + 73, 185, 73, 210, 36, 101, 146, 48, 73, 71, 213, 91, 46, 208, 190, 3, + 239, 5, 230, 128, 52, 119, 226, 87, 41, 70, 142, 55, 168, 176, 152, 45, + 231, 232, 249, 69, 81, 175, 73, 103, 72, 191, 11, 116, 163, 163, 119, 205, + 38, 120, 61, 11, 77, 183, 201, 0, 39, 228, 153, 75, 175, 75, 60, 147, + 145, 17, 45, 21, 212, 220, 58, 157, 12, 86, 49, 121, 3, 192, 247, 4, + 189, 39, 146, 134, 161, 20, 219, 208, 97, 52, 109, 7, 92, 76, 18, 196, + 179, 141, 122, 71, 227, 61, 166, 51, 32, 1, 46, 58, 163, 135, 168, 3, + 66, 229, 192, 4, 224, 34, 58, 89, 145, 65, 6, 62, 92, 126, 250, 252, + 8, 248, 209, 224, 71, 147, 31, 167, 252, 56, 227, 199, 57, 63, 176, 23, + 113, 23, 119, 53, 32, 10, 63, 197, 141, 211, 229, 12, 93, 233, 182, 23, + 108, 193, 4, 51, 149, 200, 172, 241, 74, 38, 16, 114, 38, 106, 115, 230, + 132, 210, 25, 86, 76, 212, 94, 51, 124, 150, 9, 203, 45, 74, 9, 66, + 25, 44, 9, 209, 25, 133, 193, 26, 239, 63, 232, 107, 40, 14, 206, 172, + 51, 194, 131, 84, 201, 27, 218, 130, 53, 41, 24, 67, 39, 79, 58, 60, + 25, 209, 158, 136, 180, 42, 216, 111, 51, 116, 73, 34, 199, 105, 22, 45, + 58, 155, 14, 207, 126, 181, 189, 219, 62, 37, 186, 111, 4, 51, 177, 44, + 203, 166, 1, 123, 144, 234, 30, 96, 15, 98, 236, 80, 228, 194, 247, 139, + 73, 109, 51, 228, 199, 16, 79, 101, 68, 157, 165, 131, 23, 153, 96, 182, + 140, 139, 189, 166, 92, 200, 13, 143, 20, 168, 186, 7, 216, 131, 200, 189, + 226, 61, 216, 126, 137, 4, 205, 253, 62, 155, 237, 153, 159, 10, 94, 184, + 153, 96, 38, 239, 11, 55, 219, 154, 11, 55, 83, 16, 2, 246, 32, 123, + 85, 151, 176, 253, 236, 25, 154, 15, 206, 205, 54, 167, 52, 185, 255, 189, + 7, 219, 47, 141, 161, 249, 224, 220, 108, 51, 165, 225, 139, 214, 101, 36, + 208, 53, 202, 247, 203, 199, 202, 94, 187, 211, 49, 233, 250, 100, 227, 142, + 71, 30, 139, 173, 30, 139, 59, 16, 153, 237, 179, 116, 204, 161, 154, 230, + 244, 223, 94, 228, 177, 216, 35, 149, 217, 175, 233, 233, 185, 187, 15, 217, + 171, 25, 193, 242, 128, 57, 217, 229, 150, 145, 55, 104, 10, 156, 91, 90, + 254, 112, 25, 49, 82, 44, 201, 141, 61, 84, 129, 252, 170, 229, 140, 146, + 2, 231, 86, 45, 127, 124, 116, 204, 161, 34, 246, 11, 63, 203, 118, 253, + 217, 126, 207, 159, 229, 116, 60, 193, 114, 128, 251, 249, 231, 149, 153, 55, + 20, 103, 7, 70, 226, 236, 208, 64, 156, 29, 232, 233, 179, 67, 29, 125, + 150, 219, 207, 103, 7, 186, 249, 236, 80, 47, 159, 29, 232, 228, 179, 220, + 62, 70, 142, 160, 253, 105, 0, 98, 149, 52, 142, 58, 26, 153, 174, 69, + 78, 244, 19, 241, 199, 139, 126, 170, 106, 16, 255, 68, 130, 236, 184, 229, + 167, 120, 170, 26, 57, 195, 115, 48, 17, 167, 66, 69, 72, 180, 32, 225, + 37, 9, 184, 102, 200, 55, 3, 129, 25, 104, 152, 129, 166, 25, 56, 53, + 3, 103, 102, 224, 220, 12, 16, 39, 128, 158, 2, 212, 118, 130, 220, 206, + 48, 173, 62, 137, 105, 157, 205, 151, 192, 61, 117, 38, 138, 207, 155, 197, + 131, 101, 31, 191, 35, 102, 138, 152, 105, 253, 66, 21, 38, 190, 80, 169, + 13, 56, 15, 4, 105, 1, 153, 2, 100, 230, 167, 130, 152, 179, 102, 26, + 81, 144, 151, 15, 201, 100, 43, 91, 112, 6, 15, 30, 165, 69, 223, 124, + 48, 222, 176, 44, 133, 126, 198, 89, 208, 33, 51, 56, 245, 108, 147, 1, + 182, 42, 5, 1, 169, 163, 17, 12, 146, 59, 107, 250, 227, 148, 221, 249, + 124, 58, 26, 13, 162, 118, 164, 52, 197, 50, 12, 125, 56, 148, 118, 140, + 18, 194, 159, 162, 214, 122, 65, 23, 35, 102, 34, 206, 233, 236, 6, 223, + 23, 211, 38, 153, 36, 9, 38, 155, 151, 12, 72, 162, 0, 93, 208, 212, + 20, 194, 49, 137, 39, 8, 145, 131, 16, 119, 72, 55, 50, 155, 163, 79, + 21, 228, 160, 199, 36, 249, 199, 61, 242, 231, 9, 162, 191, 218, 151, 138, + 241, 128, 112, 68, 187, 106, 49, 157, 64, 103, 201, 3, 222, 103, 124, 242, + 0, 79, 11, 77, 208, 227, 2, 118, 78, 231, 83, 68, 124, 55, 91, 202, + 179, 100, 66, 226, 31, 26, 188, 82, 4, 128, 136, 57, 199, 246, 196, 227, + 206, 124, 97, 154, 229, 197, 227, 233, 7, 66, 11, 120, 153, 46, 134, 108, + 186, 108, 4, 145, 245, 96, 123, 120, 9, 145, 108, 184, 12, 241, 214, 160, + 22, 172, 36, 52, 238, 68, 35, 222, 231, 148, 128, 180, 248, 69, 231, 45, + 84, 62, 236, 14, 98, 44, 147, 227, 52, 196, 171, 16, 245, 225, 141, 12, + 132, 176, 149, 55, 92, 147, 205, 84, 180, 88, 238, 125, 24, 192, 220, 35, + 121, 26, 100, 49, 22, 188, 245, 33, 149, 120, 177, 236, 71, 211, 182, 238, + 9, 60, 86, 192, 146, 94, 188, 236, 46, 96, 14, 168, 33, 226, 144, 178, + 226, 148, 65, 141, 230, 90, 157, 36, 17, 144, 87, 221, 152, 60, 162, 202, + 167, 9, 83, 214, 221, 28, 144, 20, 159, 140, 50, 246, 3, 73, 90, 196, + 189, 123, 84, 45, 197, 43, 168, 124, 187, 187, 236, 118, 71, 131, 135, 229, + 88, 67, 30, 6, 163, 206, 98, 129, 51, 102, 209, 137, 30, 58, 244, 156, + 227, 6, 8, 190, 25, 198, 193, 244, 110, 42, 110, 16, 32, 103, 211, 3, + 147, 207, 196, 216, 51, 21, 32, 242, 150, 49, 4, 53, 130, 1, 5, 123, + 195, 9, 30, 90, 192, 237, 248, 78, 239, 3, 43, 132, 248, 32, 63, 69, + 71, 15, 168, 32, 61, 167, 119, 50, 46, 78, 172, 166, 83, 0, 63, 11, + 8, 178, 128, 6, 1, 230, 115, 62, 231, 176, 24, 194, 108, 68, 237, 91, + 143, 240, 121, 49, 156, 71, 48, 105, 25, 47, 22, 211, 14, 218, 124, 62, + 116, 230, 108, 193, 176, 192, 83, 133, 172, 6, 90, 204, 151, 114, 3, 41, + 38, 154, 10, 115, 243, 67, 132, 36, 136, 212, 31, 11, 232, 216, 126, 251, + 12, 43, 199, 199, 164, 86, 29, 110, 7, 74, 177, 19, 190, 85, 218, 12, + 80, 105, 203, 201, 135, 9, 107, 54, 151, 243, 110, 7, 119, 225, 87, 221, + 41, 34, 194, 242, 83, 119, 240, 1, 6, 238, 3, 222, 94, 170, 195, 48, + 241, 230, 81, 135, 122, 154, 1, 113, 7, 64, 120, 36, 4, 65, 104, 237, + 49, 96, 195, 23, 58, 101, 68, 56, 161, 246, 208, 17, 168, 41, 142, 124, + 107, 211, 193, 43, 35, 108, 204, 105, 13, 74, 38, 239, 35, 80, 23, 244, + 144, 130, 111, 180, 75, 154, 188, 181, 189, 211, 192, 8, 49, 2, 171, 16, + 155, 90, 80, 95, 40, 144, 22, 71, 20, 0, 235, 186, 224, 109, 214, 71, + 88, 49, 167, 172, 147, 146, 40, 78, 13, 33, 109, 129, 105, 45, 96, 42, + 94, 244, 59, 229, 64, 33, 189, 158, 41, 128, 84, 216, 168, 160, 180, 195, + 96, 38, 134, 32, 136, 158, 234, 61, 105, 33, 5, 245, 244, 69, 151, 55, + 237, 152, 244, 183, 116, 136, 106, 206, 103, 169, 16, 141, 248, 88, 3, 21, + 169, 78, 37, 173, 162, 25, 61, 166, 83, 52, 87, 33, 107, 121, 82, 24, + 202, 181, 166, 217, 236, 38, 1, 54, 132, 246, 52, 32, 150, 186, 144, 205, + 116, 217, 134, 17, 110, 247, 167, 237, 8, 219, 130, 100, 140, 244, 124, 159, + 6, 31, 228, 65, 129, 79, 17, 12, 252, 28, 103, 209, 170, 45, 105, 157, + 210, 9, 235, 40, 195, 226, 91, 195, 244, 0, 173, 140, 99, 142, 123, 135, + 55, 147, 195, 146, 97, 227, 92, 29, 197, 76, 29, 153, 244, 138, 201, 217, + 79, 155, 15, 92, 50, 117, 43, 200, 195, 151, 189, 225, 160, 247, 65, 88, + 81, 60, 89, 142, 75, 246, 214, 135, 140, 118, 101, 241, 167, 63, 9, 219, + 191, 113, 241, 25, 197, 221, 233, 116, 4, 81, 65, 232, 237, 202, 86, 97, + 49, 109, 227, 167, 120, 56, 146, 28, 4, 208, 101, 191, 161, 189, 221, 137, + 81, 235, 174, 48, 104, 253, 3, 47, 79, 179, 248, 248, 45, 158, 186, 196, + 251, 89, 233, 108, 103, 145, 93, 104, 36, 117, 134, 34, 106, 86, 1, 93, + 100, 82, 142, 232, 212, 148, 3, 32, 18, 15, 200, 177, 105, 20, 163, 147, + 152, 82, 171, 184, 173, 219, 91, 157, 112, 71, 167, 51, 41, 211, 90, 47, + 26, 63, 124, 218, 21, 239, 202, 34, 18, 199, 146, 224, 57, 97, 60, 53, + 253, 204, 122, 22, 194, 64, 194, 192, 95, 219, 62, 62, 135, 242, 217, 135, + 39, 158, 66, 199, 84, 116, 150, 221, 198, 251, 210, 218, 63, 253, 237, 167, + 159, 191, 126, 219, 126, 247, 242, 231, 63, 151, 5, 172, 238, 88, 192, 114, + 18, 173, 195, 189, 232, 2, 249, 81, 53, 147, 212, 151, 241, 188, 62, 138, + 186, 245, 135, 104, 60, 171, 251, 53, 183, 46, 189, 45, 197, 117, 60, 52, + 77, 9, 1, 63, 23, 110, 104, 235, 138, 39, 80, 47, 180, 57, 175, 121, + 47, 1, 250, 186, 147, 48, 207, 93, 146, 159, 78, 17, 28, 72, 193, 71, + 191, 1, 212, 254, 184, 48, 146, 55, 66, 219, 168, 114, 65, 94, 107, 216, + 36, 231, 60, 106, 84, 116, 98, 251, 102, 199, 249, 96, 68, 92, 123, 24, + 127, 162, 131, 249, 182, 78, 44, 166, 147, 123, 224, 13, 232, 108, 187, 160, + 238, 22, 93, 50, 170, 128, 230, 226, 165, 131, 116, 144, 219, 126, 86, 136, + 178, 23, 91, 101, 178, 21, 211, 212, 96, 102, 202, 132, 204, 62, 180, 236, + 173, 53, 25, 247, 133, 231, 48, 118, 237, 238, 120, 120, 97, 116, 241, 112, + 253, 239, 43, 64, 246, 2, 212, 30, 242, 4, 228, 179, 111, 156, 9, 224, + 88, 24, 182, 138, 84, 88, 241, 78, 64, 5, 110, 238, 116, 227, 132, 106, + 28, 87, 128, 46, 62, 111, 185, 213, 106, 19, 102, 130, 242, 139, 94, 180, + 221, 226, 165, 248, 139, 92, 85, 104, 102, 208, 28, 210, 211, 163, 70, 71, + 233, 177, 167, 6, 232, 30, 104, 78, 231, 155, 176, 83, 109, 223, 161, 63, + 42, 32, 16, 52, 177, 69, 143, 239, 116, 134, 69, 177, 61, 127, 232, 98, + 7, 79, 107, 71, 103, 0, 224, 39, 124, 111, 173, 110, 36, 222, 203, 103, + 31, 158, 150, 152, 235, 66, 156, 192, 241, 177, 18, 147, 177, 176, 90, 88, + 203, 75, 33, 43, 120, 103, 137, 15, 181, 2, 185, 45, 64, 46, 114, 194, + 29, 38, 46, 245, 156, 127, 141, 80, 110, 153, 244, 78, 84, 35, 207, 14, + 102, 125, 141, 190, 29, 97, 23, 66, 57, 225, 118, 66, 147, 221, 66, 151, + 9, 33, 238, 250, 13, 230, 120, 101, 56, 76, 123, 40, 121, 108, 157, 192, + 236, 190, 130, 42, 77, 250, 37, 72, 225, 20, 23, 179, 251, 118, 181, 173, + 143, 4, 118, 218, 197, 114, 24, 186, 22, 145, 31, 196, 47, 158, 189, 144, + 170, 44, 224, 7, 102, 59, 180, 166, 84, 228, 141, 9, 4, 23, 203, 5, + 248, 69, 167, 21, 88, 246, 98, 39, 96, 210, 19, 194, 50, 137, 248, 220, + 106, 64, 29, 232, 126, 117, 224, 70, 170, 143, 31, 138, 229, 155, 255, 53, + 117, 152, 15, 122, 237, 51, 247, 226, 196, 168, 64, 9, 176, 116, 92, 44, + 139, 79, 53, 232, 243, 237, 170, 234, 121, 187, 47, 43, 38, 83, 10, 57, + 143, 25, 162, 121, 227, 99, 52, 192, 77, 1, 179, 199, 141, 194, 188, 115, + 188, 148, 245, 171, 180, 11, 140, 228, 144, 53, 158, 177, 70, 230, 135, 79, + 88, 91, 142, 117, 228, 252, 117, 198, 143, 70, 119, 218, 69, 51, 50, 248, + 70, 157, 13, 206, 36, 192, 221, 105, 222, 156, 70, 153, 0, 210, 101, 183, + 171, 51, 233, 89, 88, 147, 178, 26, 137, 106, 240, 77, 158, 4, 151, 249, + 142, 47, 93, 33, 238, 20, 62, 48, 153, 85, 235, 119, 117, 113, 198, 58, + 120, 191, 127, 51, 126, 69, 170, 109, 244, 96, 2, 107, 239, 239, 40, 147, + 108, 31, 168, 36, 160, 3, 6, 92, 233, 74, 114, 162, 176, 154, 57, 96, + 54, 242, 51, 43, 189, 165, 90, 239, 156, 109, 241, 164, 184, 203, 84, 94, + 80, 213, 211, 48, 180, 15, 4, 240, 122, 230, 103, 34, 208, 238, 16, 34, + 134, 179, 166, 165, 72, 199, 185, 152, 132, 91, 175, 2, 139, 81, 166, 83, + 44, 27, 40, 137, 213, 174, 96, 254, 149, 172, 39, 22, 25, 89, 197, 200, + 234, 129, 72, 224, 141, 49, 26, 31, 249, 9, 94, 62, 145, 224, 4, 98, + 79, 44, 94, 234, 66, 190, 111, 23, 38, 68, 206, 40, 153, 76, 20, 244, + 20, 166, 0, 14, 234, 11, 6, 207, 16, 208, 114, 6, 68, 185, 62, 200, + 137, 98, 235, 229, 156, 8, 197, 122, 62, 133, 123, 213, 67, 152, 247, 228, + 192, 183, 31, 219, 190, 236, 161, 44, 220, 203, 133, 231, 2, 187, 237, 21, + 214, 160, 187, 202, 68, 252, 9, 160, 25, 144, 164, 141, 60, 91, 32, 128, + 239, 89, 66, 80, 133, 142, 194, 185, 143, 143, 172, 243, 158, 28, 68, 149, + 206, 59, 40, 71, 249, 110, 153, 67, 157, 233, 23, 92, 70, 161, 67, 184, + 143, 8, 45, 178, 235, 31, 14, 249, 124, 112, 95, 2, 97, 110, 86, 122, + 238, 58, 252, 63, 94, 132, 61, 68, 15, 74, 101, 231, 61, 140, 251, 126, + 130, 70, 146, 224, 219, 220, 4, 205, 36, 193, 43, 72, 240, 62, 12, 191, + 69, 110, 254, 219, 48, 124, 245, 194, 187, 116, 173, 2, 158, 189, 157, 0, + 207, 138, 215, 32, 227, 130, 159, 84, 113, 6, 168, 129, 78, 214, 236, 217, + 53, 240, 106, 147, 177, 27, 110, 237, 25, 112, 64, 5, 118, 186, 51, 175, + 138, 159, 200, 15, 156, 232, 47, 103, 242, 60, 50, 165, 111, 89, 246, 204, + 186, 3, 228, 37, 140, 117, 129, 225, 63, 240, 159, 85, 248, 136, 89, 86, + 188, 29, 151, 243, 145, 203, 1, 216, 71, 135, 121, 1, 100, 180, 198, 174, + 98, 185, 198, 197, 187, 130, 186, 222, 245, 70, 124, 67, 252, 132, 46, 27, + 139, 253, 8, 197, 86, 111, 196, 143, 32, 205, 70, 168, 235, 243, 214, 22, + 86, 121, 184, 179, 28, 242, 130, 67, 225, 143, 24, 38, 134, 228, 177, 5, + 145, 246, 199, 59, 24, 165, 22, 60, 152, 115, 255, 136, 171, 177, 226, 83, + 103, 24, 160, 55, 116, 67, 218, 70, 139, 30, 81, 113, 38, 0, 234, 133, + 86, 202, 121, 205, 109, 226, 189, 230, 246, 11, 221, 215, 64, 93, 172, 195, + 30, 108, 44, 144, 85, 190, 216, 133, 13, 122, 38, 75, 50, 205, 115, 99, + 99, 137, 120, 48, 11, 173, 223, 96, 189, 234, 246, 66, 255, 60, 15, 33, + 159, 217, 215, 156, 106, 151, 220, 148, 44, 44, 36, 112, 232, 170, 124, 48, + 43, 196, 56, 25, 194, 45, 58, 243, 1, 250, 132, 190, 244, 128, 60, 237, + 48, 199, 74, 104, 83, 36, 241, 170, 16, 190, 246, 188, 115, 234, 53, 27, + 253, 183, 237, 236, 45, 196, 237, 168, 195, 13, 40, 221, 129, 62, 121, 110, + 201, 88, 172, 24, 18, 120, 202, 104, 151, 198, 77, 227, 35, 179, 165, 255, + 156, 100, 108, 230, 144, 18, 142, 17, 75, 148, 135, 41, 27, 10, 147, 34, + 244, 24, 210, 13, 62, 214, 208, 41, 107, 81, 58, 192, 44, 214, 82, 142, + 159, 36, 20, 61, 76, 225, 93, 43, 253, 65, 119, 249, 128, 242, 253, 20, + 7, 31, 71, 94, 0, 105, 36, 225, 138, 72, 255, 111, 36, 166, 180, 226, + 59, 16, 84, 254, 242, 254, 123, 8, 35, 249, 7, 38, 196, 18, 187, 172, + 67, 169, 49, 238, 19, 8, 246, 10, 157, 185, 33, 47, 235, 80, 10, 243, + 119, 4, 102, 136, 190, 167, 40, 195, 68, 11, 80, 82, 45, 0, 202, 110, + 250, 60, 226, 2, 208, 29, 149, 202, 149, 28, 243, 106, 95, 158, 218, 137, + 44, 109, 36, 16, 230, 233, 78, 16, 209, 228, 113, 202, 126, 144, 15, 184, + 154, 130, 33, 201, 116, 72, 90, 51, 65, 72, 140, 46, 245, 117, 23, 226, + 189, 40, 16, 165, 111, 59, 239, 147, 59, 95, 97, 91, 150, 103, 137, 10, + 68, 182, 220, 59, 16, 84, 213, 155, 215, 44, 104, 169, 137, 28, 253, 93, + 22, 96, 32, 31, 80, 183, 63, 90, 160, 186, 26, 245, 131, 227, 49, 121, + 150, 207, 68, 20, 6, 80, 69, 32, 74, 51, 32, 93, 238, 85, 97, 53, + 132, 238, 19, 165, 217, 245, 208, 41, 124, 4, 16, 45, 145, 207, 171, 158, + 211, 46, 222, 78, 138, 206, 172, 252, 213, 240, 10, 104, 100, 248, 241, 69, + 165, 50, 187, 44, 21, 162, 214, 12, 232, 84, 187, 248, 188, 248, 162, 36, + 158, 11, 188, 55, 75, 160, 223, 158, 133, 188, 242, 166, 35, 32, 42, 161, + 208, 174, 51, 3, 178, 220, 44, 59, 189, 57, 208, 229, 222, 252, 89, 88, + 124, 254, 31, 15, 203, 168, 136, 228, 89, 6, 161, 87, 204, 224, 106, 208, + 45, 190, 192, 27, 101, 74, 88, 150, 3, 85, 249, 88, 5, 234, 9, 217, + 184, 229, 43, 40, 242, 253, 0, 88, 115, 186, 7, 149, 124, 23, 81, 155, + 202, 80, 179, 81, 186, 246, 207, 177, 242, 87, 133, 17, 122, 43, 131, 204, + 71, 215, 31, 73, 191, 211, 26, 129, 244, 118, 13, 13, 16, 208, 0, 213, + 250, 168, 85, 173, 142, 36, 20, 75, 41, 200, 226, 71, 21, 79, 86, 0, + 190, 226, 10, 20, 224, 207, 165, 95, 236, 192, 143, 162, 34, 60, 10, 149, + 129, 17, 138, 226, 30, 200, 71, 162, 234, 21, 58, 203, 197, 20, 219, 95, + 19, 91, 234, 199, 29, 245, 122, 77, 88, 39, 133, 8, 123, 15, 64, 88, + 155, 95, 91, 222, 157, 12, 190, 40, 69, 165, 114, 88, 245, 146, 124, 106, + 152, 81, 242, 25, 215, 142, 218, 240, 204, 204, 161, 106, 100, 81, 192, 5, + 166, 132, 21, 243, 28, 136, 154, 221, 113, 146, 217, 93, 242, 49, 134, 228, + 247, 142, 128, 33, 133, 46, 229, 198, 150, 202, 216, 210, 25, 181, 50, 83, + 9, 57, 219, 151, 115, 88, 30, 112, 178, 163, 125, 39, 148, 129, 20, 126, + 24, 145, 218, 211, 11, 227, 225, 116, 181, 55, 141, 127, 66, 32, 124, 67, + 169, 198, 164, 139, 148, 185, 220, 147, 159, 56, 188, 33, 84, 250, 115, 67, + 125, 112, 95, 186, 208, 91, 177, 11, 217, 100, 198, 40, 173, 130, 190, 83, + 20, 134, 236, 30, 200, 220, 166, 44, 72, 42, 229, 21, 57, 63, 27, 60, + 120, 67, 250, 117, 195, 107, 28, 47, 34, 50, 226, 240, 28, 198, 118, 26, + 51, 183, 111, 16, 68, 89, 70, 134, 32, 170, 146, 161, 143, 126, 105, 125, + 117, 71, 190, 243, 254, 166, 94, 254, 174, 94, 6, 235, 104, 209, 70, 195, + 182, 201, 230, 195, 96, 147, 208, 202, 76, 231, 41, 135, 130, 73, 55, 145, + 119, 59, 186, 205, 120, 194, 46, 170, 229, 197, 119, 124, 239, 168, 40, 41, + 39, 247, 7, 58, 2, 9, 7, 116, 27, 250, 72, 30, 244, 203, 57, 52, + 178, 159, 166, 145, 47, 231, 15, 228, 130, 52, 22, 197, 95, 138, 78, 241, + 111, 240, 239, 239, 69, 188, 183, 138, 174, 165, 85, 69, 69, 210, 81, 177, + 26, 25, 172, 140, 67, 227, 17, 188, 217, 191, 17, 224, 112, 103, 255, 18, + 254, 45, 252, 187, 118, 177, 151, 233, 35, 215, 36, 159, 182, 234, 109, 119, + 127, 64, 48, 33, 194, 165, 227, 198, 56, 180, 236, 23, 150, 120, 132, 105, + 218, 150, 41, 252, 62, 242, 175, 233, 1, 115, 159, 236, 116, 229, 143, 158, + 106, 43, 216, 9, 172, 84, 110, 231, 117, 164, 11, 61, 89, 80, 153, 127, + 126, 109, 252, 28, 20, 243, 251, 216, 36, 140, 121, 34, 23, 175, 208, 134, + 100, 109, 58, 203, 151, 73, 171, 35, 66, 47, 251, 157, 13, 116, 45, 221, + 25, 126, 255, 112, 111, 248, 71, 176, 144, 177, 44, 175, 55, 124, 68, 44, + 13, 39, 15, 226, 106, 221, 139, 208, 247, 44, 59, 190, 87, 78, 19, 187, + 27, 29, 171, 167, 153, 88, 161, 151, 72, 25, 162, 123, 36, 250, 123, 8, + 245, 221, 125, 102, 212, 248, 82, 143, 44, 10, 58, 2, 79, 218, 137, 24, + 221, 76, 75, 151, 212, 152, 41, 187, 91, 239, 32, 39, 216, 193, 157, 110, + 5, 215, 217, 203, 73, 84, 90, 206, 176, 81, 158, 171, 58, 66, 178, 154, + 73, 54, 113, 132, 107, 109, 103, 50, 0, 122, 55, 218, 240, 173, 17, 171, + 206, 166, 236, 240, 2, 25, 111, 38, 184, 233, 52, 193, 109, 96, 52, 32, + 54, 155, 64, 190, 48, 247, 251, 20, 171, 201, 179, 150, 61, 99, 222, 79, + 113, 95, 134, 124, 127, 179, 123, 35, 98, 94, 164, 115, 248, 193, 165, 49, + 133, 171, 226, 251, 193, 253, 66, 146, 222, 238, 114, 177, 152, 78, 128, 154, + 206, 7, 216, 64, 28, 62, 233, 136, 93, 205, 93, 236, 243, 79, 83, 224, + 174, 160, 14, 83, 17, 45, 106, 70, 70, 111, 163, 126, 127, 52, 72, 101, + 229, 32, 109, 127, 253, 243, 251, 239, 43, 163, 253, 82, 222, 226, 34, 205, + 140, 142, 153, 11, 165, 129, 209, 28, 140, 240, 227, 119, 47, 223, 188, 169, + 212, 171, 151, 226, 239, 92, 106, 157, 28, 164, 38, 201, 95, 2, 59, 180, + 18, 64, 1, 98, 51, 67, 129, 197, 213, 105, 51, 175, 190, 156, 213, 161, + 135, 38, 230, 71, 88, 35, 64, 242, 151, 151, 226, 235, 9, 50, 115, 117, + 24, 27, 98, 234, 72, 227, 4, 195, 59, 152, 244, 54, 162, 132, 43, 86, + 157, 86, 166, 206, 104, 54, 236, 8, 41, 34, 150, 115, 178, 122, 141, 228, + 170, 55, 167, 75, 229, 228, 144, 160, 52, 144, 147, 242, 13, 10, 55, 159, + 149, 242, 27, 152, 9, 211, 135, 135, 17, 95, 174, 131, 215, 82, 193, 216, + 227, 138, 147, 147, 246, 7, 24, 180, 33, 237, 108, 167, 40, 15, 37, 23, + 37, 137, 129, 197, 9, 136, 12, 69, 88, 74, 138, 156, 136, 94, 101, 163, + 170, 221, 77, 85, 190, 22, 243, 26, 248, 35, 172, 213, 157, 199, 1, 221, + 158, 50, 219, 104, 89, 139, 182, 181, 228, 172, 161, 91, 77, 216, 153, 173, + 100, 186, 69, 145, 104, 204, 154, 254, 195, 173, 132, 98, 78, 206, 239, 47, + 129, 97, 67, 75, 247, 238, 20, 144, 223, 232, 18, 66, 54, 92, 44, 114, + 62, 250, 73, 87, 135, 251, 5, 134, 74, 95, 39, 175, 253, 235, 210, 58, + 243, 84, 173, 102, 147, 135, 188, 90, 253, 244, 238, 229, 235, 175, 85, 205, + 14, 84, 226, 23, 230, 95, 36, 138, 172, 205, 121, 170, 211, 252, 253, 82, + 252, 121, 58, 234, 215, 213, 141, 131, 29, 186, 55, 65, 144, 29, 186, 94, + 0, 14, 208, 110, 219, 149, 68, 59, 73, 149, 236, 79, 202, 93, 72, 47, + 116, 121, 127, 50, 138, 97, 74, 210, 142, 165, 167, 55, 44, 67, 23, 229, + 54, 183, 90, 13, 64, 118, 251, 9, 121, 240, 20, 237, 80, 171, 63, 244, + 155, 162, 150, 150, 188, 125, 51, 182, 106, 86, 97, 44, 44, 90, 23, 248, + 222, 16, 233, 103, 25, 68, 196, 155, 240, 92, 44, 129, 111, 45, 181, 32, + 116, 114, 87, 110, 185, 78, 227, 238, 242, 246, 22, 68, 248, 91, 81, 171, + 129, 216, 109, 70, 226, 23, 213, 134, 74, 193, 202, 133, 82, 241, 214, 194, + 232, 91, 171, 88, 22, 82, 161, 4, 156, 48, 240, 15, 59, 39, 240, 49, + 115, 210, 25, 213, 64, 216, 5, 57, 100, 79, 38, 47, 21, 65, 248, 134, + 47, 161, 62, 113, 72, 82, 68, 249, 138, 53, 119, 192, 214, 215, 138, 14, + 9, 226, 113, 25, 184, 85, 96, 151, 111, 92, 82, 66, 85, 125, 167, 187, + 171, 225, 99, 189, 227, 59, 30, 53, 20, 119, 172, 176, 176, 9, 186, 64, + 127, 32, 137, 127, 5, 35, 80, 5, 126, 14, 199, 65, 111, 217, 65, 68, + 255, 198, 115, 147, 253, 172, 83, 115, 63, 43, 89, 141, 149, 183, 101, 38, + 69, 120, 117, 130, 181, 237, 131, 84, 79, 43, 74, 236, 224, 130, 48, 1, + 116, 133, 207, 48, 222, 188, 131, 33, 181, 52, 16, 218, 197, 188, 13, 22, + 197, 44, 159, 33, 40, 220, 66, 45, 118, 4, 194, 99, 84, 168, 155, 39, + 116, 10, 183, 174, 243, 38, 108, 173, 156, 225, 221, 213, 184, 179, 46, 189, + 41, 215, 129, 11, 131, 199, 245, 233, 174, 48, 238, 108, 218, 67, 152, 49, + 109, 34, 101, 225, 54, 14, 67, 255, 183, 223, 226, 155, 176, 177, 43, 16, + 136, 50, 115, 16, 139, 249, 45, 161, 57, 28, 166, 34, 232, 149, 62, 246, + 224, 227, 48, 12, 208, 177, 185, 235, 216, 123, 117, 41, 164, 200, 144, 252, + 108, 123, 178, 123, 241, 236, 217, 246, 196, 153, 236, 46, 109, 127, 87, 128, + 245, 104, 237, 192, 207, 6, 7, 108, 141, 63, 27, 108, 67, 11, 245, 117, + 216, 10, 106, 35, 80, 5, 144, 237, 219, 120, 95, 129, 179, 66, 179, 64, + 178, 6, 115, 198, 107, 103, 188, 113, 166, 227, 46, 240, 203, 56, 204, 248, + 231, 22, 214, 176, 82, 185, 206, 134, 126, 241, 221, 163, 119, 207, 129, 238, + 142, 238, 229, 205, 68, 97, 97, 149, 170, 156, 27, 82, 141, 10, 120, 55, + 27, 34, 142, 163, 94, 218, 244, 85, 72, 88, 111, 246, 191, 133, 179, 203, + 122, 102, 111, 171, 8, 237, 244, 166, 49, 233, 232, 250, 208, 163, 136, 145, + 144, 219, 114, 87, 95, 221, 96, 182, 143, 187, 58, 144, 52, 200, 12, 10, + 153, 135, 20, 115, 226, 214, 26, 231, 87, 164, 115, 41, 181, 230, 206, 252, + 100, 88, 95, 221, 149, 37, 74, 154, 73, 31, 41, 169, 171, 147, 158, 0, + 161, 113, 230, 152, 20, 53, 64, 184, 121, 217, 191, 14, 27, 242, 19, 123, + 123, 31, 45, 120, 184, 96, 10, 58, 78, 163, 249, 149, 156, 106, 249, 241, + 129, 251, 21, 105, 146, 114, 98, 109, 130, 65, 167, 58, 23, 238, 177, 76, + 232, 251, 108, 223, 36, 230, 2, 68, 57, 80, 171, 19, 151, 5, 237, 138, + 39, 0, 145, 204, 231, 21, 2, 108, 232, 43, 251, 198, 129, 41, 143, 58, + 45, 33, 157, 193, 99, 51, 129, 205, 107, 71, 49, 172, 238, 14, 190, 221, + 227, 73, 71, 21, 136, 98, 188, 23, 23, 175, 70, 226, 208, 124, 128, 99, + 6, 12, 16, 5, 113, 50, 58, 168, 179, 83, 180, 3, 47, 29, 117, 250, + 187, 252, 250, 173, 236, 27, 116, 69, 191, 61, 129, 90, 172, 118, 47, 90, + 132, 78, 119, 151, 45, 238, 138, 187, 29, 162, 248, 86, 86, 21, 230, 113, + 201, 218, 174, 118, 235, 237, 16, 254, 245, 225, 95, 188, 179, 64, 28, 230, + 126, 250, 140, 140, 38, 227, 220, 28, 170, 207, 45, 251, 166, 96, 182, 185, + 22, 162, 114, 209, 218, 158, 64, 132, 229, 160, 162, 103, 103, 21, 204, 126, + 72, 39, 168, 26, 41, 116, 231, 164, 146, 232, 72, 238, 171, 126, 250, 251, + 185, 138, 198, 190, 75, 71, 173, 33, 10, 59, 211, 97, 29, 240, 24, 215, + 31, 52, 163, 188, 68, 74, 141, 164, 198, 178, 117, 173, 173, 50, 169, 34, + 85, 29, 147, 43, 56, 204, 154, 67, 2, 93, 69, 153, 11, 80, 42, 149, + 139, 140, 144, 57, 233, 234, 238, 23, 39, 35, 84, 66, 172, 56, 39, 130, + 17, 54, 210, 33, 28, 211, 176, 46, 215, 156, 182, 171, 149, 179, 26, 134, + 91, 53, 62, 149, 214, 185, 211, 112, 239, 244, 116, 46, 232, 233, 108, 175, + 86, 55, 60, 159, 237, 213, 176, 48, 93, 59, 83, 32, 85, 114, 102, 98, + 73, 174, 67, 233, 170, 254, 9, 164, 44, 59, 26, 244, 184, 171, 194, 7, + 229, 187, 186, 95, 134, 210, 92, 64, 142, 170, 162, 86, 240, 103, 67, 70, + 246, 116, 83, 88, 121, 153, 136, 45, 196, 84, 32, 167, 29, 69, 147, 122, + 56, 93, 38, 151, 6, 41, 100, 33, 88, 238, 240, 75, 75, 193, 8, 40, + 105, 3, 37, 13, 89, 175, 172, 168, 202, 151, 181, 144, 10, 87, 109, 196, + 30, 173, 132, 186, 204, 207, 175, 12, 124, 73, 17, 126, 222, 23, 208, 233, + 60, 38, 64, 240, 130, 188, 47, 87, 67, 38, 139, 123, 61, 101, 214, 61, + 216, 175, 123, 169, 127, 115, 250, 34, 184, 244, 203, 169, 54, 248, 208, 8, + 63, 220, 250, 39, 45, 153, 57, 160, 134, 172, 249, 221, 191, 164, 141, 88, + 36, 197, 236, 53, 78, 182, 126, 213, 200, 111, 53, 51, 37, 77, 177, 106, + 230, 102, 201, 221, 66, 105, 78, 197, 234, 52, 63, 115, 95, 167, 57, 19, + 171, 179, 252, 114, 146, 52, 231, 98, 117, 126, 160, 44, 74, 196, 127, 52, + 18, 43, 38, 134, 95, 74, 10, 173, 12, 133, 57, 145, 196, 47, 135, 172, + 64, 92, 85, 71, 102, 72, 202, 73, 30, 249, 56, 65, 58, 151, 34, 22, + 46, 49, 88, 233, 101, 66, 42, 33, 201, 168, 201, 229, 157, 150, 117, 52, + 1, 206, 2, 127, 224, 205, 195, 55, 96, 189, 161, 17, 200, 176, 72, 102, + 5, 13, 244, 38, 157, 73, 41, 234, 148, 45, 180, 37, 178, 144, 39, 191, + 47, 69, 227, 116, 240, 109, 153, 148, 182, 168, 108, 179, 78, 10, 116, 247, + 80, 105, 237, 138, 80, 172, 174, 196, 6, 159, 195, 43, 177, 246, 224, 185, + 193, 31, 224, 96, 175, 10, 242, 203, 50, 102, 35, 203, 40, 191, 232, 205, + 35, 180, 247, 25, 149, 10, 235, 235, 181, 251, 130, 243, 88, 67, 234, 205, + 245, 6, 130, 148, 213, 6, 130, 235, 155, 181, 7, 177, 158, 138, 189, 217, + 64, 144, 242, 222, 176, 182, 26, 86, 219, 210, 124, 57, 41, 21, 243, 218, + 88, 116, 214, 174, 3, 140, 185, 179, 225, 199, 218, 227, 144, 135, 58, 96, + 28, 107, 220, 177, 68, 154, 42, 251, 126, 167, 217, 35, 57, 132, 95, 255, + 244, 218, 82, 192, 82, 73, 131, 81, 62, 250, 254, 235, 111, 126, 198, 56, + 236, 156, 84, 196, 251, 239, 190, 253, 51, 196, 148, 249, 51, 29, 245, 87, + 0, 17, 203, 145, 48, 163, 133, 9, 113, 145, 19, 98, 35, 39, 196, 71, + 78, 136, 145, 180, 9, 110, 19, 220, 38, 56, 254, 110, 212, 64, 43, 218, + 190, 2, 138, 142, 177, 215, 240, 62, 228, 247, 77, 33, 201, 13, 232, 8, + 63, 152, 154, 216, 84, 194, 9, 167, 165, 175, 203, 87, 45, 155, 146, 87, + 75, 148, 176, 74, 73, 54, 229, 186, 207, 223, 223, 201, 221, 61, 89, 77, + 252, 156, 179, 92, 155, 89, 110, 78, 184, 42, 148, 177, 202, 114, 205, 89, + 174, 57, 203, 181, 202, 114, 125, 167, 57, 175, 107, 217, 63, 4, 190, 89, + 61, 119, 141, 240, 230, 102, 248, 28, 36, 159, 3, 189, 179, 101, 38, 251, + 185, 235, 64, 170, 187, 157, 105, 144, 40, 11, 119, 184, 89, 14, 103, 206, + 143, 205, 221, 179, 176, 117, 160, 99, 239, 114, 217, 249, 35, 121, 21, 230, + 227, 9, 222, 129, 54, 32, 190, 145, 169, 70, 98, 43, 166, 34, 202, 133, + 18, 23, 184, 165, 71, 133, 74, 4, 1, 151, 160, 155, 43, 130, 110, 8, + 186, 1, 232, 188, 5, 2, 29, 26, 223, 249, 142, 47, 58, 42, 208, 43, + 204, 65, 184, 196, 53, 19, 38, 234, 238, 174, 226, 161, 212, 226, 59, 1, + 91, 132, 193, 20, 166, 9, 92, 245, 119, 108, 75, 88, 19, 72, 170, 80, + 249, 143, 182, 222, 51, 224, 77, 159, 85, 65, 222, 170, 40, 11, 1, 156, + 184, 44, 166, 32, 211, 18, 56, 49, 76, 81, 232, 66, 76, 91, 3, 241, + 151, 204, 13, 188, 61, 206, 88, 164, 40, 12, 100, 40, 42, 44, 15, 182, + 0, 0, 25, 146, 5, 143, 204, 164, 101, 171, 194, 239, 56, 55, 102, 140, + 161, 65, 146, 62, 85, 177, 89, 100, 196, 11, 114, 107, 13, 203, 138, 111, + 74, 118, 34, 199, 189, 104, 92, 6, 101, 165, 175, 138, 201, 238, 205, 140, + 133, 245, 110, 39, 233, 57, 204, 72, 156, 245, 55, 225, 253, 104, 58, 157, + 115, 95, 171, 105, 135, 17, 215, 6, 156, 59, 191, 44, 169, 25, 125, 232, + 29, 250, 208, 187, 14, 115, 190, 148, 9, 160, 208, 77, 166, 208, 141, 250, + 118, 147, 46, 84, 142, 109, 82, 232, 38, 83, 168, 249, 97, 170, 80, 253, + 37, 147, 140, 125, 129, 20, 228, 115, 39, 122, 75, 18, 39, 189, 221, 73, + 33, 140, 193, 108, 78, 138, 104, 89, 35, 115, 112, 166, 185, 150, 29, 141, + 173, 75, 69, 142, 95, 148, 162, 107, 87, 194, 224, 247, 173, 85, 190, 140, + 44, 53, 57, 115, 36, 224, 208, 43, 196, 67, 26, 141, 184, 106, 14, 151, + 108, 65, 90, 70, 127, 225, 95, 122, 229, 221, 19, 120, 164, 177, 168, 38, + 236, 27, 49, 169, 73, 43, 216, 95, 107, 128, 137, 132, 58, 0, 5, 20, + 97, 252, 97, 173, 135, 74, 195, 200, 195, 60, 95, 110, 101, 253, 63, 174, + 178, 253, 147, 88, 124, 114, 122, 200, 105, 223, 124, 213, 119, 72, 83, 117, + 83, 239, 227, 180, 193, 50, 236, 79, 14, 254, 245, 146, 202, 169, 58, 179, + 88, 37, 115, 137, 57, 241, 77, 78, 50, 77, 62, 8, 221, 174, 93, 185, + 166, 32, 26, 152, 1, 137, 136, 55, 33, 209, 74, 157, 132, 49, 229, 38, + 4, 90, 88, 64, 179, 37, 101, 183, 217, 91, 116, 38, 15, 35, 212, 76, + 189, 12, 171, 38, 225, 187, 59, 33, 146, 81, 111, 153, 4, 240, 234, 85, + 248, 178, 210, 82, 52, 53, 47, 69, 213, 187, 106, 245, 6, 209, 168, 244, + 178, 236, 48, 162, 190, 130, 46, 64, 171, 164, 194, 137, 36, 86, 170, 25, + 73, 127, 131, 80, 54, 157, 247, 227, 240, 95, 90, 7, 22, 141, 210, 99, + 154, 116, 5, 221, 93, 119, 218, 16, 70, 143, 216, 92, 43, 36, 164, 56, + 14, 53, 145, 36, 6, 220, 51, 72, 47, 173, 126, 56, 110, 100, 15, 246, + 121, 89, 186, 123, 25, 86, 84, 134, 172, 20, 204, 233, 165, 146, 231, 159, + 59, 222, 169, 123, 5, 255, 28, 120, 47, 99, 30, 1, 80, 121, 31, 239, + 221, 131, 175, 99, 164, 185, 115, 162, 208, 252, 71, 121, 3, 30, 57, 110, + 173, 137, 255, 16, 187, 100, 53, 105, 254, 72, 82, 78, 4, 216, 169, 73, + 124, 107, 85, 3, 26, 38, 154, 54, 168, 7, 75, 87, 149, 126, 2, 29, + 235, 231, 197, 58, 46, 27, 148, 215, 146, 213, 15, 151, 66, 181, 12, 106, + 13, 133, 169, 180, 42, 23, 18, 221, 87, 232, 210, 104, 201, 35, 42, 233, + 84, 152, 145, 9, 105, 63, 220, 175, 11, 211, 251, 216, 185, 7, 4, 226, + 108, 211, 234, 173, 242, 11, 55, 3, 185, 12, 252, 29, 48, 3, 5, 87, + 44, 0, 241, 255, 235, 191, 82, 37, 236, 152, 168, 220, 203, 129, 79, 42, + 155, 201, 149, 149, 166, 220, 15, 91, 213, 76, 199, 42, 173, 158, 87, 189, + 27, 183, 118, 118, 178, 34, 163, 123, 14, 249, 205, 147, 97, 153, 169, 202, + 125, 124, 227, 5, 146, 194, 64, 181, 111, 66, 128, 236, 84, 3, 176, 88, + 146, 255, 189, 192, 145, 204, 211, 125, 92, 247, 224, 251, 114, 153, 213, 197, + 217, 242, 176, 184, 107, 183, 22, 64, 113, 144, 229, 144, 67, 88, 156, 42, + 237, 250, 180, 145, 148, 118, 157, 83, 26, 172, 240, 167, 141, 164, 180, 147, + 116, 105, 128, 218, 25, 109, 33, 164, 145, 109, 71, 237, 26, 25, 143, 120, + 204, 126, 172, 42, 158, 239, 12, 43, 231, 60, 225, 25, 177, 36, 226, 25, + 147, 64, 89, 78, 170, 73, 226, 174, 191, 145, 255, 25, 199, 27, 106, 132, + 61, 123, 227, 156, 210, 114, 218, 191, 113, 253, 112, 154, 252, 118, 147, 26, + 196, 138, 135, 136, 156, 253, 252, 78, 24, 40, 230, 165, 114, 15, 121, 177, + 72, 112, 52, 197, 170, 49, 155, 214, 82, 189, 206, 39, 79, 198, 120, 141, + 32, 178, 132, 99, 226, 9, 199, 192, 114, 50, 181, 73, 145, 48, 144, 170, + 33, 222, 30, 35, 49, 51, 137, 84, 93, 51, 107, 101, 82, 2, 235, 13, + 200, 118, 167, 61, 155, 194, 242, 129, 12, 172, 205, 218, 94, 215, 38, 125, + 47, 218, 70, 50, 200, 147, 32, 239, 206, 80, 247, 81, 218, 178, 146, 77, + 242, 178, 44, 244, 1, 180, 118, 240, 23, 249, 99, 206, 170, 42, 11, 225, + 12, 171, 178, 168, 221, 129, 41, 101, 78, 166, 212, 52, 178, 196, 171, 233, + 90, 148, 132, 5, 243, 105, 219, 66, 164, 82, 249, 82, 41, 101, 226, 36, + 57, 115, 89, 20, 208, 100, 16, 140, 202, 162, 42, 44, 75, 127, 7, 168, + 159, 253, 14, 65, 121, 223, 161, 45, 159, 248, 9, 119, 209, 66, 85, 110, + 167, 27, 67, 239, 115, 43, 233, 1, 253, 15, 139, 54, 38, 119, 160, 148, + 239, 7, 147, 135, 197, 16, 146, 91, 219, 54, 178, 3, 165, 84, 210, 50, + 90, 37, 98, 158, 47, 17, 79, 57, 85, 7, 144, 214, 231, 100, 27, 78, + 182, 46, 159, 120, 231, 110, 125, 22, 129, 140, 237, 159, 186, 194, 226, 237, + 1, 34, 23, 222, 62, 177, 248, 50, 50, 209, 248, 247, 146, 137, 198, 191, + 132, 76, 228, 19, 8, 205, 208, 84, 250, 17, 122, 46, 132, 149, 75, 156, + 160, 101, 21, 179, 58, 231, 174, 177, 0, 166, 87, 70, 248, 43, 40, 110, + 207, 78, 111, 151, 252, 183, 164, 49, 231, 77, 181, 106, 38, 19, 83, 114, + 74, 20, 144, 45, 163, 224, 117, 34, 68, 210, 172, 77, 71, 111, 174, 145, + 67, 74, 102, 190, 154, 84, 196, 72, 229, 206, 169, 125, 237, 59, 189, 190, + 11, 191, 43, 113, 129, 14, 103, 12, 124, 106, 249, 170, 4, 3, 233, 113, + 110, 208, 201, 13, 57, 91, 177, 111, 121, 115, 243, 93, 217, 0, 189, 43, + 235, 186, 225, 88, 191, 43, 95, 135, 208, 129, 187, 194, 112, 176, 38, 3, + 221, 80, 220, 62, 183, 168, 176, 255, 178, 250, 209, 67, 180, 40, 173, 203, + 56, 23, 214, 215, 158, 251, 162, 93, 116, 139, 162, 34, 214, 151, 237, 226, + 75, 122, 129, 121, 230, 185, 229, 171, 119, 144, 226, 187, 146, 149, 173, 154, + 5, 34, 185, 224, 76, 222, 129, 244, 119, 115, 211, 40, 59, 73, 240, 79, + 94, 179, 236, 196, 215, 254, 11, 247, 82, 1, 61, 78, 147, 5, 202, 148, + 129, 1, 244, 85, 202, 52, 80, 166, 108, 24, 192, 64, 165, 76, 3, 49, + 165, 184, 179, 254, 11, 141, 145, 153, 91, 150, 61, 64, 103, 224, 190, 148, + 76, 189, 195, 81, 67, 130, 193, 93, 96, 57, 114, 224, 145, 164, 132, 162, + 133, 186, 24, 99, 75, 248, 150, 71, 179, 157, 51, 152, 72, 86, 240, 198, + 108, 174, 204, 31, 73, 6, 188, 167, 200, 64, 251, 143, 165, 3, 222, 255, + 11, 232, 128, 119, 148, 12, 216, 55, 38, 29, 80, 242, 210, 218, 69, 149, + 222, 218, 115, 54, 30, 44, 119, 82, 91, 206, 227, 88, 77, 214, 232, 241, + 166, 170, 164, 13, 181, 36, 167, 229, 137, 178, 147, 243, 105, 197, 75, 125, + 92, 241, 14, 127, 94, 149, 203, 180, 189, 198, 197, 214, 189, 9, 207, 149, + 60, 143, 203, 45, 134, 21, 17, 233, 3, 183, 253, 194, 187, 68, 89, 146, + 247, 2, 60, 146, 7, 9, 231, 241, 101, 251, 41, 68, 233, 242, 170, 245, + 201, 249, 148, 18, 49, 73, 189, 155, 136, 25, 107, 92, 43, 113, 9, 133, + 74, 110, 136, 21, 91, 55, 229, 127, 192, 154, 63, 145, 242, 165, 252, 143, + 15, 111, 26, 221, 169, 36, 18, 181, 129, 254, 71, 212, 26, 45, 151, 107, + 72, 178, 113, 84, 225, 151, 37, 22, 100, 26, 129, 43, 116, 93, 252, 71, + 245, 56, 146, 142, 83, 1, 247, 232, 202, 84, 152, 98, 195, 41, 240, 229, + 96, 110, 185, 233, 140, 220, 246, 219, 110, 174, 9, 105, 236, 90, 143, 195, + 125, 158, 231, 106, 253, 54, 220, 231, 104, 174, 54, 50, 109, 138, 169, 185, + 218, 200, 180, 105, 104, 171, 181, 30, 75, 92, 221, 140, 159, 192, 83, 167, + 181, 126, 91, 241, 84, 106, 245, 122, 56, 61, 225, 229, 191, 22, 243, 64, + 20, 57, 142, 112, 110, 237, 226, 179, 145, 147, 211, 230, 163, 39, 77, 47, + 236, 185, 27, 238, 101, 177, 198, 161, 9, 233, 211, 181, 171, 124, 1, 108, + 56, 5, 245, 173, 128, 156, 97, 228, 48, 99, 40, 68, 165, 160, 60, 158, + 133, 156, 137, 154, 166, 18, 70, 159, 101, 136, 74, 9, 176, 166, 194, 156, + 180, 171, 104, 202, 70, 7, 96, 242, 31, 28, 44, 227, 75, 207, 252, 210, + 123, 234, 203, 63, 102, 208, 228, 132, 202, 237, 226, 64, 254, 167, 103, 84, + 126, 178, 215, 242, 191, 60, 66, 161, 53, 132, 25, 1, 174, 50, 207, 145, + 202, 12, 110, 79, 234, 245, 64, 150, 124, 94, 245, 171, 43, 178, 170, 98, + 137, 124, 27, 127, 156, 47, 74, 188, 177, 233, 85, 75, 246, 111, 213, 180, + 98, 64, 173, 65, 82, 241, 160, 76, 53, 242, 149, 117, 90, 51, 77, 226, + 28, 42, 220, 86, 246, 77, 45, 163, 71, 92, 213, 68, 210, 146, 68, 114, + 36, 33, 82, 166, 192, 183, 6, 35, 15, 238, 182, 161, 39, 6, 122, 217, + 153, 202, 12, 175, 128, 190, 70, 128, 104, 209, 99, 19, 74, 129, 240, 139, + 247, 117, 160, 37, 184, 115, 228, 140, 187, 210, 54, 104, 60, 13, 183, 95, + 180, 219, 180, 115, 182, 39, 54, 91, 142, 116, 29, 160, 17, 78, 117, 202, + 122, 177, 146, 61, 238, 254, 73, 177, 163, 16, 146, 69, 73, 93, 54, 70, + 122, 229, 178, 192, 171, 62, 80, 216, 197, 199, 134, 30, 188, 33, 194, 47, + 155, 80, 78, 162, 45, 177, 26, 208, 66, 173, 151, 68, 46, 123, 88, 245, + 78, 119, 34, 189, 112, 3, 155, 206, 202, 89, 72, 235, 157, 102, 35, 61, + 213, 247, 184, 247, 38, 183, 56, 119, 25, 126, 219, 89, 177, 65, 146, 189, + 114, 230, 208, 233, 54, 237, 199, 98, 168, 239, 12, 158, 214, 44, 75, 99, + 22, 76, 143, 19, 141, 199, 94, 161, 238, 31, 177, 227, 164, 216, 31, 169, + 194, 61, 100, 127, 149, 218, 39, 226, 30, 73, 141, 128, 30, 203, 55, 106, + 159, 81, 143, 99, 127, 119, 173, 223, 151, 217, 200, 129, 17, 249, 136, 221, + 67, 175, 216, 100, 109, 100, 33, 99, 137, 206, 48, 47, 247, 5, 221, 150, + 124, 171, 187, 46, 165, 84, 177, 180, 29, 240, 95, 217, 232, 21, 197, 117, + 235, 112, 63, 232, 189, 239, 55, 226, 179, 187, 228, 117, 78, 151, 220, 40, + 38, 214, 232, 9, 128, 61, 217, 1, 245, 63, 188, 3, 180, 201, 244, 23, + 118, 192, 235, 207, 239, 128, 247, 214, 238, 32, 41, 73, 219, 26, 230, 182, + 130, 173, 21, 24, 65, 211, 117, 103, 203, 224, 47, 172, 248, 123, 145, 221, + 244, 36, 189, 123, 186, 234, 72, 79, 212, 235, 250, 134, 141, 26, 201, 142, + 49, 220, 254, 18, 166, 119, 103, 211, 10, 180, 212, 78, 109, 162, 66, 187, + 146, 138, 55, 94, 29, 144, 185, 250, 5, 164, 86, 156, 138, 85, 160, 91, + 142, 9, 246, 238, 112, 118, 34, 248, 142, 7, 250, 89, 142, 246, 172, 100, + 79, 137, 228, 137, 3, 214, 150, 204, 31, 240, 122, 237, 24, 239, 60, 78, + 102, 134, 226, 192, 87, 137, 174, 226, 58, 4, 202, 199, 155, 225, 64, 205, + 169, 129, 245, 211, 198, 206, 84, 85, 186, 98, 141, 39, 18, 156, 13, 254, + 134, 138, 100, 174, 201, 254, 114, 181, 171, 122, 103, 252, 125, 229, 51, 191, + 87, 69, 111, 116, 209, 27, 85, 244, 230, 243, 138, 222, 220, 208, 54, 190, + 42, 121, 243, 5, 37, 167, 148, 252, 90, 225, 74, 249, 62, 147, 11, 205, + 30, 167, 77, 91, 246, 134, 150, 146, 52, 161, 82, 17, 42, 245, 160, 212, + 34, 207, 32, 213, 106, 7, 204, 160, 221, 184, 249, 149, 152, 58, 127, 222, + 148, 49, 45, 27, 114, 8, 254, 103, 233, 57, 29, 86, 75, 30, 209, 182, + 150, 43, 30, 155, 60, 152, 189, 37, 198, 93, 232, 86, 232, 145, 211, 93, + 74, 51, 125, 8, 39, 245, 106, 41, 233, 194, 203, 247, 239, 127, 252, 43, + 115, 4, 89, 252, 210, 11, 252, 139, 198, 165, 119, 10, 140, 83, 206, 32, + 167, 178, 145, 252, 67, 22, 207, 190, 56, 159, 191, 188, 147, 153, 24, 24, + 247, 197, 153, 188, 249, 241, 175, 63, 168, 108, 42, 95, 148, 77, 62, 1, + 253, 17, 9, 104, 136, 36, 48, 57, 167, 77, 78, 164, 30, 198, 159, 128, + 214, 136, 73, 5, 24, 107, 214, 95, 164, 220, 147, 237, 208, 11, 217, 254, + 90, 145, 50, 122, 224, 21, 66, 144, 167, 38, 226, 79, 153, 113, 156, 202, + 216, 237, 110, 127, 201, 160, 83, 31, 175, 167, 179, 205, 37, 158, 69, 223, + 238, 18, 218, 250, 227, 209, 102, 252, 116, 168, 25, 179, 201, 195, 239, 104, + 134, 222, 244, 56, 220, 22, 35, 201, 193, 6, 253, 164, 15, 177, 236, 53, + 235, 167, 227, 205, 194, 99, 42, 159, 189, 196, 165, 75, 126, 61, 192, 179, + 32, 226, 63, 209, 164, 221, 40, 15, 115, 60, 90, 230, 15, 88, 94, 142, + 121, 127, 41, 199, 138, 160, 226, 149, 191, 10, 50, 5, 67, 70, 177, 27, + 190, 145, 71, 174, 98, 47, 228, 67, 88, 34, 246, 195, 91, 75, 190, 191, + 174, 117, 55, 181, 215, 183, 150, 88, 66, 175, 197, 86, 78, 206, 192, 216, + 0, 107, 243, 131, 9, 55, 90, 241, 195, 231, 115, 8, 47, 45, 243, 4, + 68, 184, 125, 102, 236, 42, 127, 102, 205, 101, 37, 13, 27, 9, 170, 220, + 75, 12, 27, 149, 122, 249, 249, 149, 250, 6, 42, 149, 57, 129, 129, 53, + 203, 128, 152, 23, 203, 0, 205, 239, 86, 164, 106, 148, 140, 128, 113, 140, + 172, 141, 71, 24, 199, 241, 81, 243, 44, 22, 22, 156, 37, 240, 198, 100, + 208, 116, 148, 216, 219, 123, 121, 211, 247, 118, 182, 46, 40, 172, 30, 55, + 183, 196, 254, 87, 58, 180, 93, 14, 227, 245, 196, 24, 100, 58, 131, 7, + 226, 27, 13, 52, 70, 227, 155, 207, 31, 141, 95, 172, 61, 246, 208, 168, + 113, 82, 95, 105, 166, 165, 130, 97, 170, 45, 121, 205, 248, 51, 158, 28, + 131, 54, 208, 49, 120, 133, 69, 234, 11, 137, 68, 107, 116, 166, 165, 107, + 253, 139, 72, 179, 5, 7, 106, 252, 119, 197, 247, 231, 28, 205, 49, 79, + 242, 60, 51, 76, 41, 115, 107, 248, 94, 158, 91, 131, 74, 226, 57, 54, + 85, 201, 228, 43, 89, 75, 62, 214, 246, 30, 193, 210, 206, 62, 73, 114, + 88, 38, 52, 169, 19, 169, 19, 84, 51, 255, 158, 55, 56, 198, 110, 21, + 139, 228, 202, 38, 108, 159, 127, 102, 163, 47, 201, 189, 178, 100, 254, 180, + 132, 46, 89, 105, 199, 80, 49, 100, 120, 161, 112, 75, 55, 248, 172, 67, + 40, 31, 85, 221, 156, 241, 137, 92, 240, 137, 225, 188, 162, 20, 27, 76, + 177, 145, 41, 54, 50, 197, 134, 237, 59, 175, 90, 182, 42, 187, 202, 217, + 57, 10, 176, 97, 0, 90, 141, 30, 89, 231, 223, 189, 124, 243, 211, 95, + 94, 41, 85, 70, 201, 236, 23, 123, 60, 189, 118, 203, 134, 136, 158, 203, + 231, 29, 225, 217, 152, 34, 212, 125, 73, 19, 224, 69, 139, 236, 218, 158, + 64, 9, 5, 88, 183, 114, 170, 162, 32, 160, 32, 211, 238, 190, 216, 23, + 83, 210, 194, 137, 127, 249, 207, 8, 50, 95, 40, 194, 16, 211, 120, 184, + 169, 45, 110, 1, 112, 155, 248, 160, 58, 210, 152, 40, 48, 115, 98, 50, + 182, 238, 214, 206, 154, 84, 4, 246, 135, 105, 13, 76, 49, 101, 102, 109, + 135, 233, 184, 141, 140, 147, 59, 28, 71, 148, 38, 169, 138, 165, 148, 36, + 234, 88, 134, 44, 237, 198, 151, 90, 35, 254, 216, 87, 22, 149, 38, 114, + 188, 124, 243, 230, 16, 114, 220, 184, 229, 255, 189, 71, 236, 243, 135, 11, + 187, 246, 228, 232, 152, 201, 161, 80, 9, 205, 42, 150, 19, 35, 106, 202, + 128, 230, 73, 213, 173, 53, 229, 92, 102, 146, 21, 110, 169, 190, 6, 124, + 167, 236, 37, 201, 204, 48, 204, 249, 34, 157, 218, 40, 131, 167, 94, 18, + 187, 17, 146, 164, 12, 211, 101, 108, 204, 50, 54, 102, 25, 250, 139, 116, + 106, 46, 227, 127, 153, 217, 54, 149, 45, 49, 1, 203, 145, 234, 92, 126, + 110, 238, 244, 122, 69, 251, 209, 32, 181, 1, 125, 102, 93, 248, 7, 64, + 136, 204, 121, 60, 244, 64, 81, 22, 43, 125, 188, 196, 206, 28, 213, 76, + 76, 154, 242, 21, 215, 172, 180, 113, 77, 53, 53, 133, 121, 30, 177, 243, + 57, 177, 28, 11, 62, 83, 168, 207, 19, 38, 103, 9, 181, 42, 213, 97, + 118, 62, 241, 180, 5, 95, 153, 135, 161, 31, 113, 83, 182, 223, 186, 83, + 158, 49, 130, 28, 199, 28, 1, 57, 230, 160, 24, 121, 6, 110, 235, 133, + 59, 7, 207, 104, 187, 59, 139, 124, 5, 67, 51, 232, 148, 112, 27, 250, + 32, 164, 57, 156, 132, 81, 100, 39, 157, 48, 198, 109, 109, 51, 202, 146, + 7, 65, 208, 0, 208, 43, 67, 42, 233, 104, 88, 38, 118, 169, 222, 170, + 159, 48, 43, 202, 222, 204, 193, 177, 233, 176, 106, 10, 70, 183, 144, 217, + 158, 240, 160, 165, 65, 191, 77, 39, 227, 120, 105, 142, 23, 48, 48, 53, + 6, 163, 255, 251, 7, 118, 98, 43, 207, 249, 80, 238, 176, 142, 139, 201, + 20, 115, 1, 168, 233, 66, 4, 218, 111, 3, 56, 237, 66, 132, 58, 165, + 221, 74, 242, 226, 90, 220, 29, 245, 125, 115, 48, 238, 176, 59, 146, 224, + 141, 152, 118, 127, 133, 247, 127, 169, 87, 156, 32, 229, 190, 100, 207, 249, + 218, 126, 51, 195, 146, 244, 101, 82, 62, 236, 205, 198, 236, 169, 255, 47, + 162, 143, 237, 50, 222, 24, 120, 116, 137, 187, 60, 48, 90, 115, 35, 23, + 39, 211, 117, 182, 39, 93, 67, 63, 179, 159, 9, 237, 252, 64, 33, 134, + 198, 7, 209, 186, 171, 89, 120, 159, 202, 114, 62, 17, 137, 64, 162, 93, + 12, 140, 106, 236, 106, 1, 74, 117, 11, 178, 123, 176, 199, 209, 163, 231, + 118, 87, 220, 149, 69, 44, 42, 206, 182, 104, 21, 101, 178, 226, 165, 176, + 138, 59, 241, 161, 38, 198, 241, 131, 244, 121, 201, 228, 131, 221, 5, 228, + 184, 10, 224, 143, 108, 72, 175, 156, 99, 162, 239, 103, 49, 233, 62, 58, + 147, 238, 44, 220, 222, 251, 203, 168, 20, 181, 78, 29, 31, 181, 177, 3, + 229, 65, 59, 167, 45, 22, 158, 120, 45, 225, 17, 18, 199, 110, 65, 226, + 196, 237, 164, 85, 20, 37, 120, 118, 31, 45, 188, 105, 97, 193, 14, 8, + 16, 48, 67, 111, 138, 209, 56, 194, 153, 16, 151, 107, 228, 207, 107, 214, + 94, 68, 139, 209, 32, 148, 7, 243, 158, 254, 140, 89, 253, 237, 73, 234, + 92, 53, 141, 61, 83, 241, 244, 193, 114, 25, 229, 120, 116, 248, 47, 41, + 175, 160, 41, 245, 22, 141, 125, 90, 82, 234, 188, 203, 38, 83, 248, 66, + 160, 212, 194, 192, 71, 248, 141, 133, 35, 245, 33, 157, 110, 194, 16, 82, + 118, 87, 137, 195, 133, 146, 52, 194, 189, 114, 217, 28, 247, 138, 45, 189, + 221, 178, 194, 87, 88, 252, 6, 65, 223, 88, 32, 145, 171, 184, 239, 224, + 213, 18, 97, 211, 117, 154, 116, 204, 39, 110, 39, 34, 39, 44, 31, 237, + 79, 221, 229, 253, 253, 96, 142, 175, 40, 201, 5, 125, 124, 155, 46, 23, + 184, 87, 236, 208, 30, 30, 32, 109, 52, 121, 232, 78, 215, 148, 6, 111, + 200, 93, 12, 100, 162, 71, 144, 7, 167, 88, 193, 123, 195, 72, 24, 36, + 102, 148, 162, 218, 243, 1, 94, 50, 25, 54, 56, 212, 151, 193, 45, 14, + 202, 181, 239, 54, 206, 95, 216, 70, 178, 75, 60, 178, 68, 225, 100, 170, + 48, 21, 200, 204, 159, 23, 103, 151, 129, 76, 137, 151, 249, 78, 22, 220, + 161, 62, 131, 100, 245, 240, 224, 202, 108, 64, 183, 105, 170, 240, 61, 58, + 171, 30, 132, 231, 46, 212, 110, 13, 172, 220, 6, 254, 173, 61, 120, 122, + 97, 33, 99, 59, 156, 217, 13, 73, 109, 254, 114, 31, 137, 134, 235, 240, + 159, 239, 58, 191, 56, 127, 115, 254, 14, 228, 160, 55, 29, 5, 125, 105, + 16, 5, 65, 152, 145, 152, 178, 3, 211, 0, 102, 52, 122, 45, 185, 167, + 30, 70, 41, 114, 184, 19, 29, 0, 209, 116, 195, 253, 109, 206, 21, 237, + 218, 72, 252, 101, 20, 97, 252, 132, 202, 38, 123, 88, 178, 57, 137, 5, + 163, 26, 3, 226, 90, 184, 39, 69, 230, 92, 154, 234, 56, 150, 178, 50, + 93, 124, 29, 8, 137, 94, 48, 122, 129, 163, 166, 101, 38, 149, 195, 109, + 194, 83, 10, 138, 217, 203, 14, 85, 24, 136, 192, 241, 9, 9, 44, 62, + 197, 112, 218, 192, 63, 207, 59, 117, 46, 78, 97, 18, 14, 230, 120, 75, + 19, 80, 169, 13, 240, 158, 104, 96, 110, 20, 43, 157, 226, 215, 14, 229, + 221, 72, 242, 86, 39, 28, 32, 235, 223, 157, 109, 51, 201, 246, 156, 143, + 77, 156, 186, 206, 5, 188, 252, 206, 124, 79, 241, 56, 31, 229, 235, 121, + 148, 33, 252, 193, 27, 102, 35, 59, 5, 179, 72, 231, 105, 156, 235, 96, + 162, 97, 103, 87, 159, 204, 7, 180, 159, 190, 170, 9, 62, 151, 161, 82, + 17, 183, 203, 84, 22, 240, 41, 133, 9, 10, 90, 46, 84, 122, 65, 31, + 153, 132, 9, 162, 235, 9, 254, 108, 141, 177, 182, 19, 170, 113, 226, 214, + 78, 155, 39, 36, 68, 58, 67, 137, 133, 123, 51, 15, 143, 148, 60, 98, + 38, 210, 230, 222, 32, 24, 80, 5, 137, 184, 6, 80, 84, 82, 41, 106, + 98, 74, 179, 166, 22, 52, 185, 45, 102, 164, 168, 64, 92, 77, 212, 160, + 4, 101, 71, 40, 45, 66, 116, 27, 19, 196, 79, 55, 151, 97, 229, 130, + 45, 169, 226, 147, 51, 104, 4, 44, 76, 7, 72, 78, 138, 112, 156, 148, + 140, 143, 94, 248, 238, 9, 153, 170, 208, 45, 116, 18, 88, 214, 7, 201, + 82, 4, 8, 152, 18, 186, 114, 12, 122, 40, 192, 107, 46, 232, 24, 74, + 191, 3, 13, 49, 177, 70, 167, 246, 204, 212, 76, 223, 143, 164, 246, 211, + 169, 49, 189, 78, 141, 158, 121, 59, 107, 167, 223, 217, 192, 191, 79, 104, + 198, 128, 138, 0, 183, 118, 142, 248, 117, 113, 118, 119, 2, 41, 119, 133, + 188, 210, 214, 185, 53, 222, 228, 150, 245, 9, 11, 131, 254, 30, 159, 8, + 66, 70, 199, 147, 182, 62, 1, 109, 37, 84, 210, 43, 146, 217, 95, 116, + 208, 67, 186, 75, 1, 158, 225, 31, 108, 231, 51, 102, 90, 207, 164, 79, + 46, 12, 114, 197, 184, 52, 151, 137, 93, 193, 96, 78, 239, 8, 97, 228, + 224, 83, 47, 93, 155, 214, 222, 41, 76, 42, 103, 208, 174, 165, 16, 232, + 238, 40, 254, 65, 37, 43, 220, 136, 86, 42, 2, 88, 133, 89, 225, 87, + 128, 114, 233, 119, 208, 114, 18, 88, 191, 98, 137, 245, 43, 234, 39, 217, + 135, 188, 242, 36, 38, 181, 42, 195, 164, 6, 144, 151, 68, 79, 185, 240, + 22, 182, 156, 175, 60, 170, 79, 19, 190, 234, 97, 129, 116, 30, 108, 191, + 40, 123, 236, 108, 115, 166, 166, 191, 35, 235, 90, 181, 198, 203, 170, 36, + 71, 131, 161, 221, 226, 89, 72, 46, 81, 181, 5, 111, 51, 107, 170, 27, + 136, 95, 141, 102, 42, 2, 12, 24, 229, 144, 141, 85, 193, 136, 77, 157, + 64, 163, 211, 103, 190, 60, 125, 6, 20, 237, 169, 238, 250, 178, 54, 200, + 227, 160, 137, 79, 31, 185, 134, 170, 222, 229, 32, 245, 173, 244, 15, 220, + 155, 130, 188, 132, 203, 48, 158, 6, 177, 213, 114, 108, 177, 247, 245, 150, + 160, 85, 27, 214, 237, 59, 7, 22, 114, 244, 97, 208, 242, 130, 187, 27, + 87, 57, 238, 133, 244, 20, 227, 4, 28, 119, 145, 142, 171, 4, 102, 172, + 223, 204, 196, 158, 38, 177, 86, 6, 111, 128, 45, 195, 227, 126, 195, 106, + 211, 37, 219, 56, 156, 174, 251, 152, 99, 30, 104, 74, 112, 133, 40, 87, + 97, 170, 115, 179, 213, 94, 161, 142, 68, 6, 5, 249, 190, 73, 183, 125, + 63, 71, 239, 65, 225, 22, 109, 7, 131, 83, 183, 158, 166, 116, 9, 147, + 161, 62, 189, 1, 190, 90, 125, 5, 101, 28, 206, 221, 45, 152, 220, 160, + 155, 217, 182, 251, 113, 185, 64, 231, 98, 255, 137, 145, 151, 183, 147, 55, + 211, 201, 224, 153, 37, 21, 35, 201, 103, 116, 151, 202, 177, 239, 190, 153, + 211, 141, 85, 91, 179, 134, 21, 111, 87, 55, 234, 104, 26, 43, 254, 143, + 59, 146, 168, 215, 231, 127, 219, 161, 196, 164, 196, 255, 255, 88, 226, 191, + 237, 88, 98, 190, 157, 109, 66, 98, 247, 203, 195, 101, 253, 226, 191, 157, + 230, 231, 218, 213, 50, 49, 86, 25, 154, 22, 182, 104, 35, 171, 197, 209, + 180, 160, 152, 17, 107, 149, 70, 147, 150, 235, 132, 151, 146, 164, 36, 109, + 51, 116, 208, 228, 86, 153, 146, 105, 14, 140, 224, 190, 254, 34, 173, 40, + 81, 38, 128, 206, 135, 93, 202, 195, 97, 42, 7, 188, 196, 48, 154, 44, + 73, 130, 150, 86, 181, 93, 20, 79, 209, 58, 182, 187, 83, 54, 183, 232, + 217, 207, 81, 22, 182, 114, 227, 65, 66, 200, 52, 102, 183, 147, 206, 86, + 170, 223, 40, 161, 84, 46, 199, 105, 73, 246, 109, 232, 94, 141, 67, 147, + 61, 185, 90, 117, 226, 46, 48, 8, 97, 138, 131, 185, 118, 175, 90, 111, + 157, 241, 179, 240, 237, 139, 146, 76, 240, 162, 234, 93, 190, 45, 95, 234, + 224, 219, 75, 114, 202, 177, 103, 179, 71, 12, 144, 120, 51, 93, 196, 150, + 208, 124, 160, 206, 54, 133, 93, 181, 208, 18, 21, 60, 183, 105, 41, 52, + 147, 156, 17, 207, 103, 108, 141, 127, 188, 53, 222, 191, 167, 53, 127, 141, + 96, 193, 69, 138, 253, 71, 52, 41, 56, 222, 36, 255, 223, 211, 164, 111, + 128, 117, 250, 35, 90, 211, 56, 222, 154, 224, 223, 215, 154, 234, 79, 195, + 78, 127, 208, 255, 35, 26, 213, 60, 222, 168, 198, 191, 167, 81, 223, 78, + 151, 243, 206, 178, 255, 7, 182, 235, 244, 120, 187, 154, 255, 158, 118, 189, + 27, 78, 39, 15, 127, 96, 171, 206, 118, 106, 135, 150, 185, 207, 27, 88, + 65, 153, 68, 62, 147, 16, 54, 85, 80, 204, 169, 212, 171, 249, 174, 235, + 242, 14, 22, 3, 170, 33, 124, 183, 111, 61, 246, 13, 69, 162, 22, 89, + 178, 241, 185, 117, 56, 87, 198, 32, 50, 17, 89, 13, 113, 109, 184, 32, + 89, 104, 186, 113, 73, 238, 223, 77, 238, 45, 179, 50, 21, 170, 204, 241, + 154, 28, 236, 144, 139, 93, 90, 181, 184, 45, 165, 164, 113, 180, 24, 131, + 105, 59, 113, 157, 137, 231, 76, 124, 103, 18, 132, 214, 47, 213, 151, 235, + 8, 111, 152, 251, 155, 122, 249, 187, 122, 249, 229, 111, 248, 10, 98, 71, + 166, 58, 47, 41, 55, 116, 129, 253, 22, 50, 199, 106, 109, 39, 169, 114, + 118, 249, 181, 243, 220, 93, 70, 213, 201, 204, 157, 83, 74, 179, 247, 88, + 205, 139, 114, 22, 137, 146, 82, 127, 194, 196, 151, 226, 23, 43, 253, 89, + 82, 18, 217, 217, 209, 18, 170, 84, 192, 41, 169, 126, 251, 204, 96, 0, + 64, 98, 251, 141, 123, 4, 216, 248, 251, 123, 104, 246, 143, 147, 131, 13, + 150, 109, 53, 190, 222, 215, 233, 40, 139, 25, 181, 46, 191, 228, 138, 144, + 136, 167, 138, 166, 192, 238, 169, 98, 131, 55, 100, 161, 100, 20, 42, 191, + 203, 235, 221, 87, 57, 42, 233, 82, 86, 223, 135, 61, 91, 202, 83, 84, + 159, 95, 158, 149, 83, 136, 225, 76, 26, 206, 164, 233, 76, 78, 157, 201, + 89, 104, 189, 26, 65, 82, 168, 227, 95, 241, 150, 99, 120, 126, 59, 239, + 108, 248, 209, 71, 233, 87, 220, 62, 247, 210, 65, 63, 29, 12, 32, 248, + 26, 247, 114, 6, 243, 238, 180, 67, 183, 43, 254, 5, 106, 80, 125, 195, + 247, 77, 89, 153, 161, 126, 165, 43, 102, 34, 87, 82, 221, 157, 220, 40, + 215, 154, 68, 221, 11, 175, 245, 145, 12, 103, 181, 187, 241, 252, 115, 29, + 28, 82, 80, 237, 132, 156, 39, 103, 220, 178, 120, 150, 123, 112, 98, 79, + 209, 126, 168, 2, 111, 204, 10, 92, 99, 65, 228, 30, 211, 168, 134, 2, + 62, 242, 158, 202, 22, 197, 139, 195, 181, 201, 61, 199, 242, 217, 181, 249, + 102, 151, 222, 68, 145, 248, 151, 0, 180, 32, 109, 184, 193, 55, 140, 19, + 69, 106, 247, 168, 105, 108, 31, 17, 185, 60, 142, 190, 137, 101, 96, 130, + 193, 70, 201, 159, 221, 136, 111, 15, 88, 23, 79, 239, 239, 159, 182, 46, + 166, 11, 155, 208, 232, 247, 9, 83, 103, 93, 218, 247, 187, 66, 162, 219, + 146, 253, 37, 67, 79, 78, 216, 31, 57, 93, 210, 92, 253, 97, 222, 140, + 253, 241, 247, 24, 127, 127, 113, 187, 222, 237, 148, 122, 89, 60, 10, 88, + 254, 248, 142, 187, 27, 220, 233, 124, 7, 96, 246, 64, 176, 253, 7, 186, + 22, 192, 205, 91, 45, 91, 195, 167, 239, 119, 108, 112, 154, 236, 243, 61, + 121, 94, 231, 179, 7, 247, 167, 223, 99, 58, 110, 40, 147, 242, 123, 98, + 223, 246, 91, 23, 252, 115, 206, 198, 156, 34, 152, 6, 76, 25, 89, 75, + 202, 136, 107, 241, 124, 197, 20, 12, 169, 148, 124, 125, 51, 93, 118, 129, + 143, 248, 41, 34, 198, 38, 131, 20, 73, 102, 38, 53, 51, 202, 200, 223, + 172, 160, 157, 10, 67, 241, 122, 96, 205, 255, 207, 93, 74, 163, 181, 77, + 137, 169, 230, 26, 136, 202, 174, 188, 158, 238, 60, 70, 79, 247, 244, 158, + 54, 45, 76, 117, 230, 47, 210, 157, 188, 214, 58, 203, 122, 24, 144, 39, + 39, 207, 43, 153, 22, 89, 190, 100, 6, 165, 114, 72, 109, 24, 233, 194, + 255, 78, 133, 75, 157, 171, 44, 88, 134, 158, 44, 244, 239, 213, 87, 148, + 48, 41, 80, 127, 153, 94, 216, 229, 1, 83, 40, 110, 190, 19, 105, 100, + 206, 226, 186, 18, 246, 19, 111, 48, 227, 174, 161, 59, 193, 77, 82, 145, + 221, 214, 213, 230, 177, 252, 100, 186, 155, 137, 212, 78, 152, 181, 22, 142, + 178, 74, 239, 166, 238, 237, 23, 103, 180, 140, 0, 215, 102, 141, 144, 246, + 25, 102, 238, 233, 195, 178, 20, 222, 120, 101, 179, 241, 220, 0, 117, 108, + 78, 31, 168, 51, 182, 101, 112, 121, 80, 42, 235, 149, 79, 254, 139, 112, + 245, 179, 234, 254, 149, 132, 14, 21, 116, 104, 66, 223, 227, 37, 120, 181, + 224, 140, 183, 237, 44, 185, 4, 90, 101, 21, 191, 116, 73, 251, 13, 213, + 180, 68, 21, 114, 86, 240, 71, 9, 223, 16, 124, 168, 225, 75, 79, 166, + 247, 50, 233, 37, 124, 227, 169, 244, 19, 204, 129, 28, 49, 45, 93, 231, + 17, 47, 150, 155, 80, 97, 19, 247, 230, 253, 139, 165, 123, 242, 190, 62, + 113, 47, 151, 46, 128, 31, 53, 248, 81, 130, 31, 17, 188, 66, 176, 161, + 191, 122, 255, 15, 31, 178, 134, 76, 248, 249, 8, 207, 50, 230, 234, 233, + 114, 60, 231, 209, 163, 114, 8, 228, 97, 57, 30, 102, 232, 93, 46, 61, + 44, 71, 131, 31, 37, 248, 17, 193, 43, 47, 191, 28, 79, 150, 227, 113, + 57, 75, 252, 24, 42, 136, 233, 1, 188, 130, 55, 252, 252, 17, 193, 24, + 88, 122, 92, 59, 76, 112, 85, 88, 169, 212, 9, 152, 10, 211, 117, 117, + 30, 157, 21, 228, 218, 18, 244, 230, 84, 59, 49, 140, 207, 164, 14, 133, + 43, 31, 84, 226, 206, 74, 214, 147, 177, 114, 176, 152, 49, 238, 144, 184, + 72, 40, 134, 8, 236, 169, 13, 66, 195, 188, 220, 56, 144, 41, 17, 171, + 156, 24, 133, 132, 26, 173, 102, 107, 53, 180, 85, 196, 135, 10, 237, 200, + 176, 99, 223, 175, 44, 53, 206, 179, 141, 26, 231, 42, 34, 7, 37, 218, + 176, 67, 97, 74, 180, 92, 148, 90, 144, 211, 9, 8, 88, 117, 137, 162, + 14, 124, 164, 195, 67, 92, 252, 88, 25, 91, 134, 230, 29, 169, 190, 95, + 192, 77, 103, 188, 57, 20, 77, 209, 221, 42, 77, 154, 58, 124, 183, 43, + 24, 59, 210, 161, 141, 47, 133, 147, 244, 254, 25, 194, 132, 158, 143, 153, + 141, 191, 147, 156, 205, 59, 250, 32, 153, 218, 70, 125, 76, 186, 4, 180, + 94, 213, 9, 169, 212, 116, 87, 247, 254, 165, 181, 73, 147, 71, 94, 56, + 208, 45, 56, 83, 9, 168, 194, 215, 63, 41, 102, 60, 123, 172, 31, 34, + 255, 186, 43, 179, 141, 106, 98, 4, 170, 43, 177, 111, 130, 148, 50, 91, + 221, 143, 206, 88, 163, 102, 205, 71, 59, 251, 214, 163, 237, 206, 124, 142, + 247, 7, 22, 48, 242, 240, 205, 110, 156, 76, 216, 39, 105, 3, 75, 9, + 190, 20, 237, 85, 212, 95, 12, 241, 246, 221, 225, 0, 239, 195, 186, 217, + 191, 202, 46, 185, 176, 109, 255, 102, 177, 24, 175, 226, 194, 187, 195, 162, + 245, 96, 36, 38, 152, 69, 119, 58, 31, 78, 167, 125, 125, 177, 217, 96, + 61, 27, 193, 148, 234, 31, 177, 128, 164, 58, 132, 94, 32, 173, 29, 185, + 38, 33, 65, 19, 75, 71, 85, 229, 252, 155, 144, 160, 129, 237, 108, 219, + 248, 50, 36, 52, 139, 244, 130, 221, 141, 178, 114, 223, 250, 161, 237, 65, + 176, 176, 103, 253, 103, 123, 107, 219, 23, 252, 245, 244, 94, 182, 137, 43, + 201, 247, 67, 238, 93, 129, 212, 95, 119, 213, 77, 2, 182, 87, 39, 35, + 148, 242, 78, 244, 215, 247, 225, 214, 246, 170, 48, 135, 33, 193, 174, 208, + 223, 36, 169, 252, 36, 213, 6, 83, 249, 148, 106, 211, 221, 229, 221, 44, + 188, 186, 214, 226, 223, 16, 95, 197, 92, 144, 27, 83, 252, 167, 119, 91, + 204, 45, 25, 242, 219, 4, 28, 210, 6, 127, 86, 225, 118, 181, 19, 195, + 112, 59, 4, 230, 23, 104, 111, 8, 2, 208, 5, 203, 114, 0, 54, 1, + 143, 59, 218, 63, 195, 18, 111, 66, 27, 211, 50, 109, 27, 66, 8, 19, + 22, 38, 108, 121, 56, 174, 9, 235, 59, 186, 181, 200, 42, 110, 241, 186, + 164, 245, 174, 104, 225, 229, 114, 139, 233, 84, 140, 0, 243, 7, 64, 140, + 228, 129, 32, 50, 177, 197, 11, 184, 150, 221, 42, 223, 226, 102, 21, 42, + 12, 173, 9, 95, 64, 53, 183, 81, 11, 15, 49, 108, 232, 205, 67, 23, + 217, 56, 243, 163, 86, 112, 87, 229, 152, 33, 135, 27, 24, 38, 119, 59, + 99, 182, 191, 177, 39, 56, 95, 43, 159, 18, 223, 42, 232, 192, 26, 73, + 234, 170, 234, 237, 224, 21, 9, 231, 16, 95, 93, 237, 178, 91, 59, 5, + 150, 243, 252, 64, 67, 215, 94, 8, 51, 111, 67, 191, 61, 15, 58, 113, + 202, 144, 41, 131, 166, 61, 124, 20, 214, 62, 165, 162, 223, 158, 79, 169, + 124, 78, 197, 143, 158, 79, 169, 2, 74, 69, 191, 189, 128, 82, 5, 156, + 138, 31, 61, 124, 20, 122, 46, 197, 140, 57, 6, 31, 5, 99, 95, 136, + 55, 171, 245, 205, 84, 56, 74, 184, 109, 67, 70, 110, 133, 41, 124, 107, + 247, 92, 133, 57, 13, 226, 115, 110, 52, 249, 162, 203, 104, 24, 229, 215, + 240, 142, 247, 216, 174, 236, 27, 32, 48, 16, 162, 154, 241, 163, 103, 223, + 232, 109, 35, 186, 153, 102, 186, 35, 24, 72, 18, 91, 120, 238, 42, 113, + 244, 48, 41, 201, 152, 114, 249, 171, 152, 15, 169, 211, 217, 54, 248, 220, + 248, 144, 117, 86, 106, 131, 7, 0, 95, 255, 240, 243, 215, 239, 77, 64, + 114, 30, 122, 15, 138, 7, 147, 51, 5, 123, 199, 10, 123, 245, 242, 245, + 255, 177, 87, 160, 62, 182, 189, 7, 252, 203, 187, 116, 230, 213, 220, 204, + 181, 59, 36, 232, 218, 103, 216, 183, 136, 4, 244, 240, 249, 17, 208, 3, + 167, 217, 152, 54, 186, 0, 125, 233, 101, 35, 157, 148, 141, 245, 105, 26, + 0, 118, 119, 127, 242, 4, 57, 82, 26, 11, 242, 150, 52, 214, 158, 146, + 178, 233, 96, 66, 248, 156, 206, 63, 154, 174, 33, 0, 135, 40, 93, 112, + 32, 93, 201, 6, 100, 66, 39, 76, 99, 201, 18, 3, 82, 161, 255, 165, + 177, 185, 2, 165, 144, 10, 57, 202, 146, 5, 31, 192, 84, 26, 91, 101, + 75, 103, 234, 61, 195, 75, 76, 20, 107, 189, 161, 224, 70, 5, 215, 62, + 197, 170, 243, 70, 27, 10, 110, 84, 112, 29, 80, 108, 160, 98, 41, 184, + 9, 10, 53, 153, 51, 138, 21, 72, 59, 201, 173, 27, 18, 73, 129, 52, + 146, 156, 186, 33, 49, 20, 235, 1, 197, 85, 32, 238, 30, 226, 6, 20, + 7, 161, 205, 253, 46, 237, 229, 170, 11, 149, 134, 127, 235, 1, 60, 7, + 236, 50, 139, 140, 39, 201, 173, 210, 225, 132, 169, 45, 234, 228, 11, 213, + 114, 63, 169, 159, 159, 170, 159, 159, 170, 159, 159, 170, 159, 255, 121, 245, + 195, 178, 2, 255, 139, 42, 104, 124, 162, 106, 24, 36, 53, 12, 82, 53, + 12, 82, 53, 12, 82, 53, 12, 62, 191, 134, 254, 190, 67, 177, 39, 42, + 200, 95, 176, 149, 36, 34, 214, 106, 199, 134, 54, 124, 218, 29, 41, 28, + 226, 45, 146, 56, 64, 51, 221, 14, 47, 133, 184, 136, 98, 26, 225, 166, + 132, 113, 26, 225, 128, 246, 226, 148, 4, 201, 14, 40, 63, 20, 161, 81, + 199, 73, 240, 6, 119, 210, 123, 120, 63, 146, 66, 29, 39, 193, 27, 142, + 59, 254, 241, 129, 15, 11, 237, 52, 111, 161, 100, 5, 58, 76, 96, 160, + 207, 202, 131, 172, 177, 221, 67, 233, 118, 171, 26, 192, 52, 83, 243, 139, + 221, 127, 245, 176, 13, 120, 137, 13, 247, 10, 185, 89, 163, 229, 5, 34, + 105, 125, 193, 74, 154, 120, 152, 244, 14, 78, 49, 61, 225, 166, 52, 227, + 244, 132, 131, 53, 7, 123, 199, 79, 122, 199, 79, 26, 232, 27, 189, 227, + 59, 9, 226, 58, 9, 214, 114, 220, 241, 143, 15, 124, 120, 188, 119, 12, + 220, 93, 249, 199, 186, 199, 135, 238, 241, 169, 123, 252, 164, 123, 144, 40, + 250, 180, 174, 66, 36, 45, 172, 88, 75, 115, 18, 36, 221, 131, 52, 70, + 83, 156, 41, 145, 156, 141, 14, 246, 48, 216, 11, 146, 238, 9, 146, 22, + 6, 70, 247, 4, 78, 50, 107, 156, 100, 202, 112, 220, 241, 143, 15, 124, + 248, 116, 247, 240, 204, 89, 5, 199, 122, 39, 128, 222, 9, 168, 119, 130, + 164, 119, 112, 41, 8, 136, 159, 128, 72, 98, 40, 176, 146, 79, 202, 50, + 16, 250, 63, 147, 119, 47, 29, 229, 153, 113, 126, 58, 206, 55, 227, 130, + 116, 92, 0, 113, 36, 15, 137, 21, 176, 24, 32, 196, 187, 168, 72, 129, + 159, 64, 184, 134, 136, 212, 206, 114, 233, 5, 230, 208, 144, 69, 235, 213, + 144, 71, 187, 184, 184, 216, 51, 137, 116, 232, 78, 201, 93, 161, 50, 90, + 142, 163, 73, 103, 130, 215, 129, 206, 105, 40, 188, 19, 191, 129, 253, 237, + 227, 83, 60, 204, 35, 204, 106, 139, 226, 48, 48, 249, 95, 57, 252, 230, + 239, 190, 146, 86, 146, 76, 51, 253, 198, 9, 121, 244, 243, 240, 62, 47, + 162, 155, 10, 226, 19, 132, 105, 103, 183, 130, 89, 50, 229, 164, 119, 131, + 28, 62, 65, 15, 109, 24, 174, 134, 99, 55, 53, 83, 239, 59, 155, 7, + 29, 240, 156, 245, 67, 97, 129, 245, 132, 33, 142, 74, 246, 250, 1, 114, + 120, 40, 67, 51, 154, 21, 8, 112, 139, 224, 117, 195, 175, 94, 64, 214, + 159, 219, 36, 37, 110, 3, 189, 112, 47, 201, 161, 49, 245, 42, 253, 36, + 183, 15, 72, 81, 239, 254, 126, 145, 35, 55, 2, 20, 133, 42, 138, 76, + 157, 196, 195, 152, 140, 148, 152, 64, 18, 113, 240, 126, 186, 156, 71, 131, + 57, 95, 134, 140, 199, 29, 81, 86, 202, 92, 119, 46, 175, 170, 238, 145, + 11, 17, 128, 142, 166, 15, 213, 241, 180, 191, 28, 241, 173, 189, 29, 121, + 49, 124, 222, 97, 57, 172, 158, 113, 90, 206, 150, 87, 64, 255, 58, 123, + 64, 175, 183, 73, 181, 140, 119, 213, 14, 219, 45, 180, 211, 96, 45, 226, + 189, 151, 218, 197, 188, 186, 83, 1, 246, 139, 207, 172, 178, 149, 21, 212, + 4, 20, 53, 155, 130, 244, 35, 42, 132, 197, 240, 33, 60, 39, 210, 83, + 111, 71, 172, 147, 83, 162, 34, 22, 107, 199, 87, 125, 252, 144, 51, 56, + 15, 243, 206, 140, 100, 222, 135, 228, 50, 95, 190, 197, 23, 153, 116, 188, + 182, 151, 142, 247, 17, 221, 163, 83, 127, 246, 54, 128, 137, 225, 216, 219, + 6, 128, 225, 209, 228, 199, 41, 63, 206, 248, 113, 142, 15, 200, 231, 34, + 92, 87, 59, 235, 40, 222, 161, 227, 102, 152, 26, 225, 70, 6, 147, 126, + 163, 10, 160, 204, 92, 61, 199, 79, 46, 48, 165, 231, 90, 25, 188, 224, + 84, 90, 123, 16, 38, 234, 3, 124, 5, 121, 127, 209, 94, 108, 102, 3, + 167, 141, 167, 195, 6, 107, 25, 88, 195, 220, 197, 223, 206, 218, 105, 111, + 232, 125, 67, 239, 235, 81, 167, 59, 24, 65, 136, 158, 122, 232, 229, 152, + 113, 89, 152, 167, 184, 159, 79, 199, 217, 59, 218, 251, 157, 69, 39, 65, + 151, 162, 46, 187, 168, 244, 15, 91, 225, 134, 120, 179, 53, 158, 5, 13, + 113, 43, 43, 134, 55, 63, 132, 134, 200, 247, 32, 236, 194, 224, 237, 140, + 76, 140, 90, 231, 103, 67, 222, 203, 41, 31, 39, 192, 27, 134, 227, 152, + 114, 106, 56, 205, 176, 23, 205, 123, 35, 10, 157, 58, 103, 97, 252, 113, + 217, 153, 67, 200, 204, 29, 187, 161, 232, 20, 177, 31, 224, 177, 225, 16, + 246, 68, 81, 224, 30, 20, 221, 81, 141, 87, 157, 0, 161, 91, 192, 167, + 242, 218, 234, 190, 190, 31, 126, 141, 163, 102, 222, 38, 13, 107, 33, 250, + 215, 136, 238, 35, 136, 101, 101, 74, 17, 47, 71, 151, 138, 148, 34, 74, + 232, 69, 183, 72, 119, 191, 235, 59, 219, 209, 247, 63, 192, 169, 196, 169, + 24, 118, 70, 92, 140, 220, 64, 141, 83, 119, 142, 31, 80, 216, 96, 150, + 74, 89, 67, 239, 186, 243, 67, 15, 131, 70, 55, 50, 0, 91, 30, 98, + 187, 67, 108, 117, 136, 109, 6, 172, 46, 117, 150, 139, 105, 153, 226, 9, + 1, 66, 139, 177, 212, 146, 234, 160, 141, 132, 110, 36, 212, 36, 14, 164, + 10, 161, 255, 139, 189, 105, 92, 90, 215, 61, 183, 178, 44, 23, 19, 82, + 193, 216, 211, 112, 93, 39, 192, 127, 133, 44, 6, 31, 159, 99, 133, 127, + 235, 28, 107, 255, 47, 172, 92, 150, 82, 178, 46, 44, 59, 247, 112, 178, + 25, 36, 51, 135, 24, 226, 33, 85, 215, 145, 251, 129, 158, 86, 186, 249, + 55, 192, 9, 56, 67, 62, 126, 43, 149, 157, 16, 220, 242, 245, 169, 62, + 172, 119, 124, 125, 42, 95, 60, 70, 81, 124, 159, 197, 202, 9, 2, 121, + 143, 197, 16, 95, 241, 114, 13, 220, 212, 182, 129, 159, 11, 118, 136, 167, + 225, 118, 117, 50, 60, 225, 219, 3, 236, 102, 24, 218, 167, 130, 240, 204, + 21, 132, 105, 91, 244, 99, 80, 181, 225, 35, 105, 10, 64, 145, 100, 34, + 109, 55, 29, 155, 156, 157, 81, 58, 42, 67, 66, 36, 131, 121, 6, 185, + 157, 11, 194, 213, 109, 52, 174, 150, 162, 183, 213, 104, 92, 174, 251, 46, + 138, 253, 248, 77, 244, 182, 98, 2, 41, 255, 77, 146, 255, 153, 99, 159, + 151, 85, 90, 202, 95, 66, 80, 213, 128, 85, 195, 146, 171, 54, 214, 8, + 245, 129, 200, 104, 16, 0, 179, 216, 21, 150, 120, 100, 155, 12, 102, 112, + 163, 155, 82, 57, 244, 133, 229, 108, 209, 58, 220, 178, 87, 86, 221, 107, + 236, 240, 128, 246, 253, 61, 100, 71, 167, 9, 29, 123, 137, 202, 197, 193, + 104, 209, 145, 32, 159, 64, 217, 236, 136, 0, 83, 121, 58, 187, 161, 145, + 221, 102, 63, 187, 77, 42, 187, 135, 21, 84, 119, 85, 13, 96, 196, 30, + 96, 180, 236, 33, 191, 62, 160, 134, 229, 97, 69, 29, 94, 174, 151, 116, + 231, 195, 23, 0, 118, 236, 135, 33, 241, 115, 40, 14, 16, 179, 6, 44, + 28, 215, 245, 4, 162, 235, 192, 61, 35, 51, 199, 197, 1, 100, 8, 144, + 13, 64, 74, 120, 126, 68, 246, 84, 217, 76, 249, 48, 172, 82, 220, 134, + 59, 173, 156, 124, 131, 22, 243, 166, 159, 101, 218, 198, 140, 159, 87, 125, + 60, 253, 85, 242, 124, 188, 5, 10, 207, 147, 186, 101, 121, 29, 19, 68, + 93, 135, 129, 40, 249, 24, 133, 127, 87, 240, 203, 129, 43, 10, 99, 160, + 204, 219, 151, 37, 90, 220, 233, 14, 41, 191, 121, 42, 41, 80, 32, 198, + 157, 25, 234, 54, 63, 193, 15, 177, 174, 198, 185, 198, 245, 230, 19, 221, + 56, 69, 108, 61, 162, 66, 224, 196, 101, 101, 83, 175, 174, 82, 243, 233, + 68, 204, 125, 77, 29, 142, 145, 162, 165, 126, 211, 71, 83, 228, 133, 103, + 207, 171, 1, 221, 74, 69, 183, 158, 209, 92, 173, 209, 169, 48, 201, 126, + 210, 234, 202, 3, 205, 42, 159, 255, 112, 233, 22, 67, 144, 29, 200, 143, + 16, 22, 89, 229, 203, 3, 13, 230, 81, 249, 119, 119, 149, 122, 153, 206, + 85, 10, 6, 43, 144, 121, 79, 151, 167, 60, 93, 155, 58, 105, 25, 137, + 149, 86, 25, 106, 109, 53, 31, 196, 72, 223, 245, 133, 16, 90, 213, 132, + 129, 232, 233, 38, 52, 136, 127, 103, 117, 87, 52, 1, 130, 194, 233, 233, + 120, 71, 54, 157, 119, 154, 120, 37, 135, 168, 107, 149, 120, 203, 26, 98, + 250, 61, 246, 209, 198, 44, 193, 172, 209, 150, 244, 202, 252, 187, 255, 145, + 81, 146, 249, 17, 53, 218, 72, 92, 25, 204, 167, 125, 186, 189, 1, 79, + 131, 241, 13, 105, 123, 135, 192, 104, 40, 211, 119, 140, 121, 198, 25, 47, + 50, 233, 134, 143, 0, 251, 78, 17, 51, 229, 21, 29, 184, 154, 232, 226, + 170, 136, 190, 250, 71, 185, 7, 47, 177, 118, 166, 186, 42, 51, 225, 37, + 37, 13, 58, 152, 166, 15, 171, 30, 97, 153, 204, 13, 150, 165, 131, 217, + 209, 238, 57, 84, 161, 122, 161, 178, 246, 101, 230, 144, 221, 144, 50, 55, + 50, 148, 222, 85, 18, 94, 184, 39, 245, 241, 146, 179, 28, 230, 112, 195, + 195, 40, 94, 76, 1, 175, 199, 200, 17, 15, 143, 110, 115, 233, 164, 194, + 182, 78, 178, 236, 106, 18, 121, 136, 101, 237, 141, 150, 49, 240, 253, 49, + 110, 132, 193, 184, 181, 137, 211, 105, 125, 117, 7, 161, 206, 218, 8, 197, + 195, 233, 74, 30, 43, 87, 222, 69, 208, 39, 201, 12, 120, 188, 24, 13, + 126, 179, 204, 107, 71, 221, 178, 89, 237, 110, 170, 242, 85, 232, 234, 36, + 201, 191, 219, 19, 161, 4, 222, 180, 7, 64, 96, 162, 58, 35, 193, 254, + 36, 137, 131, 147, 91, 150, 104, 102, 2, 252, 27, 80, 24, 148, 99, 6, + 125, 218, 161, 234, 140, 70, 34, 154, 224, 57, 46, 121, 237, 99, 194, 117, + 38, 149, 36, 126, 176, 3, 196, 10, 50, 67, 155, 208, 30, 228, 159, 196, + 138, 101, 12, 153, 193, 40, 36, 50, 18, 22, 154, 116, 33, 241, 0, 88, + 216, 99, 20, 47, 147, 13, 204, 217, 114, 142, 123, 230, 121, 34, 221, 208, + 20, 232, 254, 183, 97, 86, 213, 144, 135, 64, 193, 49, 172, 135, 61, 116, + 191, 162, 176, 26, 120, 180, 102, 38, 72, 50, 248, 158, 246, 203, 162, 186, + 45, 140, 138, 79, 8, 173, 73, 15, 54, 61, 31, 185, 209, 66, 14, 122, + 30, 216, 220, 68, 148, 206, 65, 245, 39, 56, 68, 14, 4, 216, 64, 218, + 254, 148, 252, 34, 48, 138, 95, 49, 167, 136, 13, 99, 102, 209, 35, 246, + 240, 44, 140, 14, 178, 130, 199, 240, 88, 179, 132, 201, 230, 168, 212, 0, + 216, 129, 80, 253, 236, 8, 232, 225, 104, 188, 28, 243, 200, 8, 187, 81, + 192, 62, 132, 110, 54, 129, 205, 167, 120, 202, 109, 20, 183, 1, 233, 81, + 78, 191, 133, 60, 118, 98, 140, 188, 153, 98, 195, 78, 16, 194, 150, 71, + 161, 221, 80, 132, 57, 253, 77, 115, 39, 222, 166, 191, 105, 202, 111, 222, + 134, 54, 237, 161, 194, 236, 142, 129, 183, 196, 155, 129, 101, 85, 98, 168, + 202, 22, 183, 106, 111, 118, 119, 16, 241, 201, 104, 59, 46, 182, 99, 199, + 126, 11, 83, 234, 147, 225, 16, 10, 102, 190, 184, 71, 39, 43, 219, 179, + 42, 44, 22, 32, 204, 60, 98, 169, 111, 49, 223, 79, 121, 155, 189, 89, + 110, 57, 205, 44, 31, 228, 149, 109, 244, 152, 226, 64, 125, 129, 40, 55, + 181, 194, 9, 239, 66, 213, 138, 70, 197, 27, 224, 114, 130, 174, 15, 236, + 199, 183, 172, 12, 75, 150, 19, 197, 4, 224, 93, 154, 66, 30, 147, 180, + 79, 141, 219, 78, 229, 162, 134, 13, 85, 223, 55, 146, 19, 149, 246, 56, + 189, 28, 27, 9, 92, 189, 60, 190, 205, 95, 133, 247, 210, 26, 151, 27, + 205, 249, 162, 205, 220, 197, 80, 93, 184, 169, 239, 69, 53, 251, 254, 147, + 224, 245, 198, 0, 166, 151, 4, 242, 66, 58, 88, 204, 163, 94, 174, 17, + 132, 163, 236, 94, 219, 211, 89, 167, 23, 45, 54, 90, 149, 129, 22, 225, + 203, 152, 22, 13, 50, 76, 92, 68, 64, 3, 59, 64, 51, 205, 21, 1, + 98, 250, 131, 222, 20, 189, 106, 166, 224, 199, 53, 29, 254, 27, 36, 132, + 193, 27, 97, 84, 174, 183, 156, 195, 50, 0, 96, 82, 57, 192, 100, 154, + 46, 251, 241, 103, 40, 66, 94, 211, 119, 82, 79, 209, 153, 67, 52, 219, + 169, 139, 78, 204, 134, 13, 164, 88, 232, 0, 183, 138, 69, 234, 41, 205, + 116, 203, 92, 150, 144, 206, 114, 217, 92, 12, 158, 249, 235, 68, 147, 88, + 140, 167, 115, 244, 139, 213, 153, 192, 56, 169, 3, 238, 142, 232, 244, 251, + 17, 174, 7, 176, 166, 40, 160, 44, 154, 114, 42, 189, 119, 190, 117, 94, + 149, 209, 121, 203, 116, 78, 171, 200, 160, 211, 27, 10, 238, 219, 84, 185, + 197, 204, 0, 220, 120, 188, 38, 8, 9, 199, 245, 128, 114, 193, 54, 245, + 122, 164, 47, 121, 160, 117, 11, 23, 6, 189, 194, 112, 206, 156, 50, 70, + 162, 157, 172, 136, 153, 2, 170, 30, 173, 61, 180, 252, 65, 39, 97, 54, + 157, 222, 2, 86, 56, 209, 159, 119, 86, 152, 185, 76, 248, 228, 82, 3, + 244, 221, 88, 108, 120, 137, 115, 246, 202, 11, 3, 67, 71, 194, 88, 197, + 11, 83, 6, 173, 160, 221, 197, 20, 62, 121, 255, 164, 170, 196, 245, 27, + 204, 106, 59, 197, 69, 184, 174, 55, 220, 171, 232, 190, 212, 11, 1, 147, + 209, 54, 110, 81, 118, 80, 131, 178, 40, 151, 79, 74, 176, 172, 149, 100, + 160, 234, 159, 224, 91, 227, 100, 81, 174, 82, 178, 186, 231, 151, 255, 209, + 44, 23, 243, 102, 18, 46, 108, 240, 47, 85, 168, 235, 202, 66, 151, 165, + 170, 231, 178, 101, 154, 248, 184, 196, 22, 194, 162, 14, 53, 18, 147, 105, + 4, 20, 206, 243, 19, 132, 1, 198, 80, 84, 148, 125, 212, 64, 105, 82, + 103, 51, 152, 38, 64, 85, 15, 23, 12, 66, 159, 231, 156, 23, 114, 231, + 184, 177, 82, 66, 74, 88, 15, 213, 82, 73, 198, 64, 28, 104, 236, 169, + 86, 3, 185, 80, 166, 87, 73, 83, 137, 114, 158, 232, 80, 98, 55, 180, + 38, 83, 97, 161, 55, 92, 203, 18, 83, 151, 126, 225, 93, 225, 41, 174, + 173, 255, 64, 106, 155, 94, 90, 141, 122, 62, 161, 112, 145, 171, 42, 20, + 59, 221, 218, 193, 141, 183, 219, 89, 106, 58, 72, 172, 194, 35, 251, 16, + 241, 194, 14, 170, 222, 165, 29, 160, 121, 160, 156, 2, 140, 98, 176, 100, + 162, 167, 174, 109, 188, 181, 155, 207, 160, 185, 59, 75, 227, 26, 162, 56, + 98, 17, 199, 158, 114, 172, 68, 59, 228, 109, 247, 22, 230, 130, 90, 152, + 197, 15, 137, 18, 6, 119, 128, 74, 197, 215, 223, 141, 31, 208, 237, 157, + 168, 96, 24, 77, 147, 208, 132, 71, 148, 236, 31, 174, 236, 31, 232, 68, + 91, 140, 126, 134, 12, 207, 24, 1, 59, 233, 49, 133, 32, 223, 184, 40, + 26, 157, 207, 65, 231, 108, 98, 58, 137, 198, 238, 166, 211, 176, 109, 124, + 13, 107, 191, 121, 169, 61, 237, 150, 147, 100, 45, 214, 196, 37, 236, 196, + 90, 174, 193, 40, 145, 208, 173, 211, 100, 191, 129, 49, 155, 76, 12, 136, + 241, 50, 230, 147, 17, 147, 22, 232, 161, 20, 212, 231, 71, 176, 56, 161, + 183, 176, 43, 220, 121, 254, 1, 22, 181, 50, 45, 92, 190, 99, 255, 32, + 21, 3, 122, 143, 75, 129, 188, 194, 134, 92, 82, 245, 130, 62, 250, 5, + 66, 51, 69, 65, 150, 25, 94, 97, 11, 179, 210, 62, 117, 248, 88, 153, + 237, 85, 3, 191, 12, 15, 220, 29, 74, 69, 248, 28, 225, 147, 18, 129, + 162, 204, 222, 192, 82, 33, 6, 151, 231, 19, 246, 62, 132, 182, 94, 167, + 25, 231, 66, 167, 226, 123, 180, 1, 243, 78, 72, 55, 229, 81, 110, 180, + 135, 134, 99, 101, 127, 239, 192, 31, 91, 151, 101, 84, 41, 106, 69, 7, + 118, 3, 83, 250, 56, 92, 190, 148, 228, 233, 33, 100, 161, 228, 105, 207, + 198, 113, 102, 173, 184, 172, 138, 79, 108, 26, 250, 229, 128, 175, 91, 254, + 157, 211, 132, 143, 154, 82, 217, 16, 144, 18, 4, 86, 118, 255, 78, 40, + 239, 182, 192, 43, 166, 179, 128, 60, 159, 254, 92, 237, 19, 7, 128, 174, + 240, 13, 186, 7, 187, 199, 79, 138, 81, 117, 83, 196, 36, 192, 228, 162, + 185, 153, 40, 161, 226, 197, 187, 242, 105, 248, 144, 193, 82, 163, 136, 145, + 129, 12, 154, 67, 9, 112, 104, 122, 243, 14, 198, 76, 170, 2, 180, 110, + 2, 38, 31, 124, 215, 160, 239, 26, 206, 176, 30, 112, 100, 53, 5, 85, + 159, 72, 238, 14, 170, 210, 192, 170, 52, 146, 210, 176, 233, 155, 196, 107, + 153, 106, 172, 107, 54, 150, 70, 29, 202, 115, 112, 178, 195, 15, 14, 184, + 246, 160, 62, 150, 238, 83, 109, 114, 48, 163, 62, 146, 3, 228, 171, 17, + 60, 45, 172, 123, 136, 2, 205, 147, 146, 189, 30, 87, 236, 245, 91, 212, + 87, 106, 208, 6, 64, 155, 183, 100, 210, 168, 83, 189, 69, 53, 92, 185, + 142, 232, 196, 74, 75, 153, 244, 45, 170, 224, 36, 156, 204, 163, 236, 117, + 15, 183, 201, 121, 210, 65, 160, 66, 1, 156, 111, 246, 6, 99, 54, 60, + 233, 32, 128, 91, 229, 187, 125, 133, 80, 162, 73, 113, 160, 88, 7, 138, + 64, 109, 77, 90, 17, 148, 81, 3, 25, 41, 76, 21, 208, 1, 214, 243, + 64, 242, 205, 216, 84, 253, 80, 217, 71, 213, 62, 111, 175, 179, 201, 255, + 101, 10, 31, 65, 196, 195, 63, 23, 50, 212, 116, 224, 207, 208, 254, 156, + 253, 161, 218, 159, 243, 63, 74, 249, 35, 189, 94, 228, 50, 228, 179, 28, + 197, 15, 174, 136, 163, 209, 96, 132, 122, 159, 217, 81, 189, 143, 74, 41, + 188, 28, 6, 31, 35, 246, 246, 175, 137, 225, 204, 240, 206, 232, 252, 21, + 96, 248, 205, 98, 144, 50, 115, 78, 59, 123, 205, 211, 110, 204, 80, 187, + 177, 87, 157, 3, 146, 188, 87, 216, 175, 185, 105, 168, 76, 252, 199, 190, + 101, 178, 218, 162, 134, 122, 170, 207, 96, 57, 158, 205, 241, 14, 101, 228, + 13, 201, 55, 242, 120, 6, 235, 116, 23, 87, 66, 11, 183, 28, 67, 49, + 186, 6, 9, 255, 138, 184, 236, 210, 7, 60, 168, 226, 136, 15, 215, 35, + 71, 84, 42, 31, 28, 1, 73, 254, 20, 150, 86, 207, 63, 132, 161, 116, + 51, 3, 111, 228, 97, 166, 143, 111, 30, 190, 197, 248, 22, 151, 241, 36, + 129, 60, 99, 153, 46, 169, 240, 67, 104, 63, 75, 184, 2, 94, 214, 91, + 197, 173, 125, 3, 76, 65, 241, 238, 10, 216, 254, 126, 41, 118, 218, 197, + 90, 17, 29, 71, 15, 74, 113, 153, 236, 15, 203, 48, 191, 144, 119, 128, + 116, 104, 133, 8, 143, 181, 148, 192, 53, 20, 103, 77, 169, 8, 8, 83, + 188, 188, 42, 179, 125, 3, 157, 204, 104, 85, 129, 60, 34, 71, 64, 85, + 153, 144, 35, 34, 20, 247, 84, 183, 250, 232, 53, 205, 246, 72, 200, 78, + 146, 132, 137, 87, 153, 103, 208, 41, 232, 158, 89, 244, 105, 80, 18, 23, + 175, 128, 229, 232, 18, 22, 120, 121, 64, 253, 103, 107, 233, 78, 170, 84, + 118, 90, 173, 162, 211, 111, 21, 239, 156, 199, 5, 112, 194, 27, 222, 28, + 40, 67, 171, 238, 138, 119, 101, 75, 132, 200, 95, 64, 233, 189, 206, 28, + 29, 155, 9, 188, 92, 153, 253, 187, 214, 10, 99, 97, 181, 219, 132, 225, + 122, 180, 45, 27, 18, 8, 130, 162, 207, 104, 120, 22, 114, 12, 254, 103, + 238, 145, 89, 65, 238, 127, 49, 197, 231, 204, 11, 247, 192, 188, 216, 183, + 243, 255, 61, 19, 131, 25, 83, 224, 69, 165, 30, 39, 117, 184, 33, 119, + 214, 184, 121, 211, 230, 159, 109, 19, 153, 95, 104, 57, 62, 240, 181, 32, + 143, 175, 74, 238, 98, 35, 132, 251, 104, 52, 106, 191, 151, 207, 111, 229, + 243, 149, 211, 6, 121, 111, 209, 105, 199, 139, 206, 124, 161, 2, 64, 170, + 158, 18, 217, 185, 100, 22, 210, 63, 195, 58, 193, 172, 138, 97, 89, 48, + 191, 118, 195, 254, 20, 4, 117, 226, 238, 37, 163, 94, 157, 139, 223, 200, + 230, 64, 75, 188, 191, 137, 249, 141, 203, 38, 12, 149, 189, 228, 105, 11, + 6, 106, 21, 137, 29, 70, 49, 85, 15, 115, 195, 40, 200, 138, 4, 241, + 144, 2, 148, 77, 34, 50, 179, 108, 190, 123, 90, 204, 117, 221, 99, 98, + 110, 178, 237, 207, 93, 30, 114, 143, 243, 227, 21, 58, 150, 192, 56, 163, + 219, 67, 3, 0, 189, 27, 6, 167, 238, 63, 39, 233, 6, 82, 230, 244, + 156, 162, 91, 11, 42, 120, 131, 24, 202, 176, 158, 123, 50, 139, 78, 214, + 245, 85, 185, 92, 89, 150, 220, 90, 195, 20, 98, 105, 28, 149, 24, 217, + 64, 110, 150, 77, 243, 92, 55, 157, 177, 206, 121, 253, 143, 160, 238, 13, + 60, 55, 155, 7, 154, 26, 52, 40, 25, 144, 58, 7, 185, 52, 175, 121, + 2, 77, 217, 21, 178, 216, 106, 74, 164, 46, 16, 254, 192, 55, 69, 210, + 192, 223, 223, 224, 135, 218, 176, 60, 10, 236, 51, 9, 164, 118, 51, 181, + 201, 143, 197, 60, 181, 205, 159, 39, 127, 82, 133, 142, 138, 158, 123, 138, + 93, 133, 147, 192, 136, 119, 200, 87, 55, 224, 17, 35, 78, 137, 44, 223, + 112, 31, 253, 152, 42, 247, 45, 111, 136, 227, 216, 68, 111, 249, 150, 183, + 104, 140, 238, 178, 78, 80, 82, 105, 156, 147, 164, 194, 34, 73, 221, 126, + 187, 3, 94, 184, 180, 181, 207, 96, 0, 235, 222, 185, 187, 187, 218, 86, + 237, 115, 21, 160, 109, 88, 188, 226, 156, 57, 244, 66, 5, 36, 89, 16, + 208, 166, 49, 176, 37, 39, 172, 63, 60, 161, 205, 77, 144, 8, 180, 64, + 185, 70, 153, 117, 184, 35, 182, 132, 172, 109, 98, 230, 222, 11, 166, 236, + 90, 35, 201, 21, 132, 86, 7, 133, 214, 202, 167, 22, 167, 188, 67, 141, + 68, 65, 203, 114, 126, 34, 214, 21, 65, 174, 168, 84, 80, 172, 132, 130, + 130, 42, 23, 20, 242, 214, 46, 169, 81, 3, 149, 210, 53, 100, 65, 177, + 105, 85, 79, 41, 113, 71, 189, 108, 168, 98, 108, 73, 69, 195, 163, 93, + 85, 50, 211, 105, 217, 13, 165, 224, 111, 170, 151, 83, 50, 10, 201, 169, + 63, 72, 20, 21, 196, 160, 108, 27, 170, 158, 172, 22, 238, 88, 167, 154, + 20, 80, 237, 140, 118, 121, 21, 179, 101, 141, 164, 101, 228, 142, 52, 213, + 50, 53, 252, 41, 97, 247, 51, 26, 136, 40, 36, 37, 23, 89, 197, 194, + 150, 196, 95, 50, 239, 164, 167, 178, 28, 56, 32, 181, 214, 142, 201, 172, + 199, 123, 141, 92, 125, 182, 178, 213, 73, 75, 150, 62, 137, 29, 80, 189, + 189, 100, 90, 208, 148, 18, 32, 176, 112, 251, 25, 202, 1, 76, 231, 233, + 41, 121, 141, 62, 124, 198, 135, 173, 113, 50, 128, 52, 7, 130, 100, 34, + 243, 230, 229, 36, 182, 50, 37, 113, 75, 159, 85, 34, 153, 247, 27, 50, + 98, 94, 114, 226, 214, 81, 48, 123, 43, 133, 185, 67, 130, 25, 76, 194, + 201, 91, 192, 171, 201, 91, 250, 39, 131, 82, 60, 251, 35, 247, 184, 77, + 153, 167, 182, 47, 244, 168, 45, 239, 224, 143, 221, 242, 206, 201, 238, 247, + 109, 121, 43, 174, 229, 99, 14, 111, 247, 113, 9, 76, 213, 28, 25, 187, + 143, 71, 121, 32, 78, 183, 127, 158, 83, 194, 129, 7, 162, 99, 252, 124, + 96, 22, 247, 49, 58, 243, 249, 116, 69, 64, 222, 232, 70, 26, 45, 111, + 247, 2, 238, 98, 60, 157, 76, 123, 67, 32, 247, 108, 215, 168, 245, 71, + 100, 34, 41, 25, 129, 44, 207, 147, 221, 168, 134, 53, 194, 127, 35, 30, + 7, 88, 98, 140, 170, 243, 14, 160, 227, 96, 212, 151, 17, 84, 129, 56, + 143, 7, 252, 120, 244, 90, 12, 163, 29, 161, 71, 59, 180, 73, 83, 66, + 175, 214, 148, 140, 128, 209, 32, 239, 208, 22, 172, 182, 26, 199, 69, 142, + 28, 250, 180, 136, 128, 109, 12, 71, 215, 120, 0, 156, 142, 129, 25, 58, + 199, 222, 124, 58, 19, 167, 100, 251, 115, 129, 6, 132, 201, 102, 46, 119, + 55, 170, 100, 156, 66, 118, 8, 158, 62, 160, 170, 7, 203, 96, 1, 188, + 83, 67, 39, 13, 205, 83, 27, 184, 81, 76, 134, 233, 184, 141, 187, 35, + 135, 163, 68, 95, 248, 229, 58, 244, 247, 183, 107, 247, 251, 158, 215, 243, + 252, 117, 156, 182, 214, 185, 151, 209, 48, 157, 191, 96, 40, 222, 225, 49, + 193, 202, 117, 230, 15, 183, 194, 171, 216, 129, 147, 160, 139, 147, 168, 26, + 105, 4, 118, 150, 192, 49, 200, 81, 18, 147, 34, 191, 38, 234, 104, 239, + 78, 186, 203, 65, 245, 212, 137, 222, 74, 111, 164, 104, 193, 143, 135, 30, + 224, 65, 158, 214, 183, 150, 119, 125, 141, 199, 220, 109, 114, 210, 142, 162, + 39, 137, 100, 48, 51, 11, 221, 193, 3, 48, 5, 232, 62, 152, 111, 225, + 41, 181, 128, 172, 220, 57, 241, 115, 60, 80, 235, 188, 70, 47, 2, 80, + 219, 42, 26, 54, 180, 71, 81, 23, 47, 65, 25, 40, 143, 0, 126, 233, + 187, 210, 218, 217, 96, 154, 206, 228, 1, 128, 192, 221, 76, 124, 144, 239, + 208, 87, 165, 139, 223, 171, 87, 183, 172, 60, 4, 92, 21, 222, 145, 79, + 25, 188, 78, 201, 129, 31, 183, 233, 160, 179, 135, 228, 213, 199, 87, 159, + 94, 209, 74, 139, 32, 10, 128, 70, 251, 152, 170, 202, 103, 115, 221, 166, + 184, 131, 252, 78, 128, 183, 59, 177, 253, 19, 168, 216, 85, 225, 23, 200, + 93, 181, 164, 180, 174, 64, 194, 242, 201, 234, 185, 87, 95, 57, 165, 13, + 135, 134, 16, 26, 222, 177, 236, 252, 174, 76, 29, 2, 159, 85, 194, 241, + 114, 84, 122, 231, 0, 53, 42, 85, 161, 53, 101, 2, 71, 120, 9, 88, + 224, 144, 199, 4, 100, 158, 60, 190, 69, 11, 74, 15, 176, 184, 178, 78, + 2, 194, 189, 83, 120, 77, 45, 131, 254, 59, 121, 36, 138, 126, 167, 64, + 195, 248, 209, 159, 63, 116, 75, 45, 152, 94, 15, 48, 32, 143, 226, 174, + 236, 16, 253, 134, 250, 151, 233, 47, 173, 80, 8, 88, 161, 80, 136, 208, + 159, 4, 26, 8, 126, 0, 140, 39, 171, 54, 167, 129, 101, 122, 41, 48, + 50, 28, 206, 41, 194, 253, 20, 28, 184, 110, 248, 59, 135, 8, 88, 140, + 54, 15, 211, 73, 233, 57, 174, 246, 191, 180, 34, 200, 232, 14, 159, 158, + 124, 250, 248, 244, 96, 184, 177, 46, 226, 59, 58, 11, 83, 219, 87, 43, + 65, 27, 242, 78, 205, 35, 24, 169, 172, 140, 78, 110, 206, 65, 219, 110, + 190, 61, 199, 38, 110, 59, 192, 167, 117, 132, 18, 83, 14, 246, 246, 31, + 238, 14, 213, 9, 236, 164, 111, 187, 75, 110, 169, 73, 211, 103, 89, 158, + 225, 1, 172, 253, 254, 219, 87, 76, 142, 15, 18, 88, 72, 241, 82, 83, + 217, 71, 105, 78, 148, 184, 32, 195, 173, 91, 181, 181, 148, 228, 155, 71, + 105, 169, 213, 199, 136, 109, 94, 181, 66, 8, 241, 166, 113, 81, 148, 204, + 114, 15, 29, 207, 152, 176, 177, 16, 160, 244, 112, 58, 234, 19, 137, 109, + 0, 115, 217, 29, 45, 231, 20, 8, 180, 90, 96, 64, 225, 3, 251, 122, + 88, 217, 66, 166, 223, 254, 137, 113, 66, 154, 123, 120, 116, 218, 7, 11, + 200, 201, 92, 222, 165, 4, 73, 67, 188, 68, 41, 239, 98, 36, 140, 75, + 95, 140, 4, 16, 190, 96, 168, 145, 208, 230, 100, 64, 19, 66, 204, 35, + 11, 49, 166, 63, 158, 146, 125, 130, 226, 19, 233, 196, 62, 63, 147, 12, + 122, 24, 56, 97, 25, 102, 163, 90, 24, 227, 93, 56, 121, 130, 16, 247, + 227, 204, 170, 211, 70, 94, 154, 93, 187, 239, 209, 238, 77, 203, 62, 145, + 183, 61, 114, 162, 18, 222, 227, 1, 252, 217, 21, 25, 227, 159, 162, 63, + 31, 250, 22, 45, 19, 249, 21, 239, 240, 195, 127, 104, 167, 66, 199, 242, + 29, 159, 85, 194, 148, 159, 135, 242, 32, 110, 185, 81, 164, 248, 85, 125, + 145, 112, 133, 184, 199, 131, 168, 66, 238, 54, 238, 35, 195, 136, 144, 61, + 75, 227, 181, 163, 92, 109, 53, 235, 242, 14, 62, 45, 6, 147, 24, 56, + 20, 156, 253, 139, 163, 60, 150, 76, 184, 207, 100, 169, 136, 125, 46, 107, + 48, 26, 69, 179, 120, 240, 187, 248, 44, 173, 169, 66, 249, 225, 105, 158, + 75, 85, 102, 143, 225, 146, 117, 201, 101, 185, 22, 95, 200, 114, 153, 237, + 34, 166, 203, 73, 113, 92, 190, 100, 194, 148, 175, 57, 255, 0, 7, 214, + 143, 238, 239, 151, 104, 38, 167, 42, 141, 27, 245, 32, 92, 200, 229, 207, + 239, 175, 69, 224, 39, 220, 149, 74, 117, 218, 112, 12, 99, 2, 187, 176, + 55, 14, 79, 179, 90, 201, 144, 253, 126, 94, 75, 25, 9, 248, 124, 252, + 226, 48, 227, 181, 246, 245, 232, 124, 1, 235, 37, 251, 250, 159, 103, 190, + 104, 44, 18, 197, 76, 14, 47, 118, 34, 182, 37, 224, 62, 232, 224, 99, + 93, 235, 95, 198, 82, 255, 242, 22, 245, 47, 159, 193, 144, 221, 27, 220, + 216, 107, 131, 135, 49, 184, 177, 43, 241, 122, 106, 196, 184, 38, 188, 5, + 175, 162, 42, 60, 188, 132, 204, 14, 94, 192, 87, 151, 238, 62, 235, 134, + 204, 17, 48, 33, 192, 147, 137, 187, 74, 72, 220, 144, 237, 93, 21, 126, + 38, 38, 229, 189, 35, 190, 165, 191, 87, 200, 149, 124, 13, 176, 65, 244, + 80, 250, 25, 114, 153, 35, 187, 241, 53, 20, 8, 175, 62, 189, 122, 119, + 105, 150, 239, 235, 86, 112, 231, 124, 13, 36, 37, 97, 243, 142, 177, 78, + 115, 175, 94, 34, 158, 173, 252, 229, 28, 148, 127, 66, 60, 84, 117, 238, + 215, 231, 199, 57, 41, 24, 254, 15, 72, 55, 68, 181, 250, 65, 99, 2, + 178, 64, 191, 56, 208, 162, 138, 248, 112, 98, 55, 28, 104, 144, 124, 99, + 214, 44, 225, 158, 94, 59, 175, 167, 84, 191, 131, 236, 208, 42, 135, 32, + 174, 58, 243, 25, 82, 195, 213, 81, 106, 136, 169, 246, 73, 33, 65, 129, + 14, 246, 160, 174, 76, 245, 14, 211, 44, 160, 73, 152, 28, 237, 75, 104, + 142, 228, 82, 166, 213, 65, 202, 4, 132, 73, 151, 18, 122, 205, 20, 137, + 73, 180, 173, 190, 83, 92, 135, 235, 234, 170, 238, 95, 109, 194, 77, 117, + 8, 207, 121, 72, 110, 199, 214, 39, 235, 202, 230, 100, 83, 190, 234, 132, + 140, 1, 27, 103, 93, 190, 106, 158, 160, 57, 211, 188, 238, 185, 229, 147, + 22, 170, 135, 59, 101, 178, 131, 234, 148, 239, 140, 227, 99, 212, 76, 47, + 49, 213, 229, 102, 63, 77, 118, 100, 247, 152, 52, 167, 137, 54, 184, 123, + 68, 35, 219, 55, 123, 84, 2, 155, 46, 73, 130, 151, 51, 163, 1, 33, + 251, 207, 66, 233, 35, 33, 126, 22, 250, 5, 190, 79, 80, 150, 146, 189, + 83, 144, 199, 28, 93, 54, 67, 215, 70, 106, 151, 162, 101, 109, 237, 103, + 85, 251, 6, 237, 84, 239, 112, 67, 104, 12, 212, 11, 168, 117, 44, 172, + 45, 122, 24, 179, 182, 67, 250, 237, 211, 47, 234, 145, 251, 83, 88, 132, + 38, 211, 5, 222, 173, 10, 147, 28, 93, 228, 118, 176, 45, 230, 58, 36, + 53, 2, 204, 123, 236, 177, 19, 168, 247, 36, 83, 19, 151, 143, 194, 123, + 194, 100, 7, 176, 154, 138, 15, 240, 148, 169, 170, 103, 248, 218, 18, 39, + 194, 56, 60, 48, 237, 209, 225, 92, 234, 58, 196, 74, 190, 133, 21, 86, + 222, 78, 220, 139, 34, 88, 100, 187, 157, 120, 8, 143, 225, 98, 140, 123, + 31, 114, 17, 253, 77, 160, 157, 233, 154, 12, 54, 233, 150, 202, 25, 144, + 31, 167, 189, 154, 71, 139, 1, 252, 34, 99, 58, 207, 185, 69, 244, 245, + 124, 128, 155, 97, 170, 80, 54, 127, 135, 38, 215, 168, 244, 158, 236, 113, + 116, 55, 25, 139, 210, 104, 138, 158, 194, 113, 145, 158, 119, 86, 162, 184, + 236, 13, 59, 243, 162, 172, 0, 80, 3, 160, 241, 201, 198, 11, 215, 250, + 200, 250, 44, 155, 69, 141, 34, 75, 65, 93, 235, 208, 82, 27, 35, 233, + 218, 123, 197, 218, 237, 68, 103, 248, 245, 186, 51, 158, 141, 112, 27, 22, + 13, 241, 241, 156, 0, 172, 143, 235, 133, 246, 166, 201, 45, 72, 247, 38, + 118, 153, 19, 141, 31, 10, 217, 78, 150, 155, 19, 94, 104, 81, 125, 44, + 230, 155, 45, 139, 249, 102, 111, 167, 46, 217, 76, 118, 88, 145, 187, 108, + 63, 46, 200, 195, 57, 218, 57, 183, 138, 150, 237, 89, 197, 187, 48, 44, + 114, 147, 208, 248, 146, 19, 176, 19, 52, 183, 64, 219, 183, 184, 101, 208, + 229, 45, 232, 103, 55, 158, 20, 24, 218, 147, 193, 10, 23, 58, 222, 208, + 128, 228, 104, 43, 51, 22, 219, 250, 118, 177, 219, 137, 241, 96, 14, 61, + 67, 87, 0, 211, 102, 20, 142, 10, 212, 61, 174, 137, 88, 84, 1, 5, + 97, 166, 154, 205, 105, 15, 7, 48, 76, 243, 182, 237, 161, 147, 216, 160, + 208, 142, 151, 221, 24, 208, 23, 13, 251, 33, 237, 128, 251, 13, 95, 229, + 240, 226, 43, 112, 156, 70, 4, 143, 130, 237, 91, 133, 15, 104, 7, 8, + 77, 252, 128, 102, 128, 200, 178, 90, 133, 135, 105, 27, 114, 242, 114, 205, + 190, 41, 142, 58, 100, 120, 115, 70, 187, 238, 208, 228, 82, 139, 28, 217, + 222, 57, 69, 26, 187, 162, 211, 36, 126, 164, 20, 181, 154, 208, 93, 237, + 162, 40, 210, 29, 173, 50, 116, 89, 68, 151, 16, 168, 233, 57, 101, 125, + 62, 158, 168, 37, 229, 213, 182, 104, 225, 189, 163, 153, 202, 66, 177, 209, + 51, 250, 78, 55, 8, 47, 4, 194, 174, 129, 15, 248, 166, 82, 50, 153, + 146, 219, 218, 144, 205, 37, 128, 104, 242, 237, 103, 157, 238, 201, 254, 160, + 55, 234, 176, 197, 32, 116, 39, 239, 187, 83, 213, 216, 244, 136, 202, 14, + 101, 217, 73, 47, 99, 241, 70, 170, 253, 82, 224, 179, 86, 17, 134, 150, + 176, 197, 122, 153, 88, 25, 127, 139, 91, 194, 243, 141, 32, 191, 100, 184, + 61, 200, 125, 205, 119, 65, 139, 76, 229, 146, 2, 177, 110, 202, 25, 105, + 94, 97, 84, 71, 187, 120, 188, 82, 102, 175, 122, 186, 87, 237, 162, 80, + 80, 116, 72, 139, 194, 166, 154, 96, 161, 77, 120, 98, 19, 90, 219, 42, + 21, 178, 200, 217, 110, 148, 81, 186, 11, 247, 122, 57, 238, 205, 163, 153, + 209, 18, 245, 7, 83, 242, 67, 12, 228, 156, 204, 55, 13, 221, 243, 124, + 156, 205, 227, 126, 58, 93, 152, 56, 159, 59, 35, 152, 128, 170, 217, 238, + 21, 240, 4, 212, 124, 1, 252, 96, 184, 55, 135, 140, 206, 149, 95, 209, + 20, 174, 144, 159, 230, 219, 201, 45, 178, 179, 156, 114, 46, 159, 93, 235, + 4, 254, 131, 69, 198, 117, 22, 59, 235, 82, 69, 79, 32, 181, 117, 12, + 175, 204, 236, 17, 49, 96, 170, 32, 90, 148, 42, 229, 34, 154, 22, 143, + 144, 156, 206, 67, 24, 35, 105, 135, 193, 182, 37, 70, 140, 246, 113, 5, + 244, 132, 105, 17, 79, 58, 204, 200, 41, 90, 146, 41, 177, 138, 206, 89, + 153, 48, 160, 38, 206, 210, 40, 0, 194, 106, 177, 6, 83, 194, 12, 19, + 78, 24, 144, 224, 34, 233, 45, 59, 233, 55, 106, 108, 18, 3, 228, 233, + 131, 25, 107, 198, 233, 26, 27, 9, 108, 13, 76, 210, 85, 164, 65, 172, + 238, 107, 1, 255, 169, 222, 28, 219, 91, 217, 219, 59, 42, 218, 222, 234, + 28, 204, 62, 23, 137, 197, 224, 179, 2, 112, 54, 66, 254, 103, 21, 54, + 98, 157, 16, 174, 170, 39, 74, 208, 210, 223, 172, 98, 89, 116, 128, 134, + 201, 205, 84, 70, 177, 140, 126, 33, 139, 31, 179, 81, 180, 144, 99, 119, + 238, 102, 178, 188, 197, 255, 38, 118, 140, 157, 184, 159, 51, 122, 209, 160, + 182, 201, 218, 246, 236, 152, 219, 34, 43, 111, 240, 187, 100, 109, 135, 189, + 64, 108, 199, 145, 105, 99, 34, 145, 110, 175, 37, 186, 72, 189, 1, 255, + 224, 5, 200, 55, 87, 75, 36, 157, 129, 51, 30, 213, 247, 32, 123, 77, + 96, 180, 12, 180, 177, 138, 154, 153, 181, 28, 188, 185, 149, 140, 246, 105, + 5, 207, 164, 75, 173, 235, 144, 216, 11, 202, 184, 193, 189, 22, 137, 135, + 101, 164, 44, 11, 192, 164, 121, 212, 25, 149, 143, 117, 228, 197, 41, 160, + 178, 216, 240, 184, 133, 161, 114, 68, 107, 46, 179, 118, 170, 206, 216, 239, + 163, 78, 15, 68, 250, 197, 92, 72, 76, 7, 174, 46, 73, 128, 45, 80, + 136, 165, 184, 25, 171, 128, 215, 89, 7, 23, 66, 22, 131, 230, 220, 62, + 218, 121, 107, 28, 147, 40, 86, 188, 220, 148, 217, 144, 85, 199, 77, 8, + 6, 149, 132, 5, 58, 165, 133, 162, 113, 183, 183, 221, 216, 54, 232, 232, + 14, 81, 0, 112, 0, 191, 209, 88, 176, 97, 150, 175, 35, 219, 201, 141, + 75, 55, 36, 195, 43, 65, 139, 208, 91, 122, 172, 234, 144, 204, 129, 189, + 148, 26, 135, 14, 231, 247, 217, 217, 29, 202, 237, 219, 226, 219, 239, 94, + 91, 142, 250, 236, 97, 39, 33, 249, 169, 75, 147, 41, 106, 198, 203, 169, + 15, 52, 80, 127, 67, 252, 149, 209, 117, 134, 119, 107, 99, 184, 205, 129, + 187, 9, 131, 66, 132, 204, 11, 158, 35, 66, 123, 127, 32, 226, 236, 247, + 211, 98, 247, 195, 16, 73, 254, 135, 225, 105, 93, 137, 225, 115, 76, 204, + 166, 128, 17, 191, 67, 78, 100, 43, 88, 130, 80, 197, 47, 235, 72, 29, + 166, 4, 5, 153, 192, 43, 95, 55, 206, 153, 111, 25, 43, 8, 154, 185, + 168, 11, 204, 228, 244, 64, 135, 86, 64, 49, 32, 222, 217, 218, 148, 209, + 238, 14, 175, 71, 47, 5, 23, 192, 143, 168, 41, 143, 151, 170, 151, 182, + 9, 86, 237, 160, 89, 101, 105, 31, 141, 173, 170, 132, 236, 24, 140, 121, + 25, 246, 128, 133, 185, 93, 3, 166, 5, 5, 137, 124, 124, 43, 251, 237, + 182, 184, 147, 23, 180, 223, 238, 224, 245, 15, 234, 28, 207, 15, 158, 232, + 29, 207, 111, 30, 104, 170, 110, 216, 3, 52, 12, 50, 42, 163, 143, 130, + 166, 99, 182, 247, 159, 108, 108, 75, 183, 245, 238, 143, 107, 234, 133, 247, + 68, 75, 47, 130, 167, 26, 10, 3, 234, 92, 120, 208, 206, 139, 224, 247, + 53, 147, 255, 146, 197, 135, 23, 138, 24, 237, 72, 97, 249, 103, 175, 99, + 249, 204, 149, 90, 2, 242, 25, 163, 44, 235, 35, 185, 141, 100, 45, 46, + 192, 74, 168, 4, 108, 5, 139, 113, 249, 122, 130, 49, 170, 9, 185, 66, + 209, 14, 104, 54, 49, 228, 163, 75, 136, 91, 119, 186, 97, 73, 177, 21, + 121, 243, 69, 238, 26, 15, 111, 177, 230, 58, 208, 3, 172, 101, 66, 18, + 142, 226, 38, 197, 112, 105, 221, 144, 2, 61, 152, 95, 17, 143, 114, 163, + 87, 91, 171, 136, 174, 143, 83, 139, 45, 173, 145, 234, 219, 158, 213, 18, + 63, 79, 23, 192, 156, 79, 150, 227, 238, 96, 142, 194, 177, 92, 72, 232, + 38, 32, 37, 115, 88, 226, 46, 161, 102, 71, 214, 184, 75, 40, 76, 144, + 115, 98, 24, 133, 136, 93, 43, 39, 254, 146, 189, 186, 143, 145, 168, 187, + 45, 69, 37, 118, 187, 124, 83, 70, 159, 131, 193, 185, 211, 240, 157, 70, + 224, 52, 26, 78, 227, 212, 105, 156, 57, 205, 115, 167, 121, 225, 156, 6, + 206, 5, 110, 55, 54, 96, 169, 82, 142, 154, 111, 146, 107, 14, 25, 101, + 208, 189, 48, 96, 46, 26, 78, 73, 19, 41, 180, 145, 178, 137, 197, 86, + 46, 132, 109, 47, 205, 68, 174, 174, 61, 87, 24, 38, 102, 251, 12, 136, + 228, 170, 73, 29, 145, 198, 44, 238, 199, 231, 133, 219, 201, 115, 33, 94, + 97, 60, 218, 89, 143, 6, 124, 143, 198, 114, 36, 125, 80, 23, 49, 155, + 98, 13, 147, 81, 210, 159, 135, 81, 76, 242, 187, 24, 118, 98, 209, 197, + 227, 240, 15, 131, 201, 128, 78, 10, 18, 47, 42, 79, 248, 143, 54, 244, + 141, 120, 51, 37, 181, 205, 0, 228, 167, 103, 57, 153, 192, 136, 47, 71, + 125, 52, 23, 237, 77, 103, 209, 160, 95, 159, 147, 220, 210, 71, 69, 69, + 177, 190, 140, 231, 245, 120, 216, 153, 15, 234, 216, 128, 106, 82, 193, 122, + 242, 26, 215, 83, 53, 132, 191, 182, 197, 242, 142, 85, 42, 67, 104, 11, + 255, 110, 23, 35, 188, 4, 12, 237, 102, 197, 108, 62, 120, 20, 211, 217, + 2, 79, 115, 142, 99, 138, 132, 62, 69, 227, 81, 81, 93, 136, 118, 52, + 1, 52, 48, 122, 226, 166, 222, 31, 60, 214, 39, 203, 209, 232, 138, 60, + 4, 208, 7, 183, 139, 189, 116, 85, 220, 248, 135, 117, 134, 181, 15, 148, + 138, 56, 100, 78, 254, 250, 199, 183, 239, 222, 127, 253, 238, 251, 191, 133, + 84, 39, 4, 65, 93, 194, 91, 152, 43, 24, 213, 254, 235, 143, 239, 223, + 252, 212, 162, 215, 215, 248, 126, 183, 187, 181, 100, 58, 172, 239, 225, 132, + 48, 238, 42, 233, 125, 100, 145, 116, 29, 135, 133, 54, 44, 220, 134, 226, + 192, 20, 161, 38, 93, 74, 114, 76, 152, 98, 100, 57, 198, 202, 230, 167, + 80, 84, 238, 208, 247, 137, 60, 165, 82, 96, 85, 108, 85, 37, 41, 167, + 112, 168, 194, 242, 173, 133, 199, 10, 164, 106, 226, 10, 8, 88, 12, 82, + 23, 233, 145, 72, 29, 65, 33, 253, 54, 165, 11, 133, 147, 160, 126, 147, + 61, 161, 195, 99, 122, 51, 50, 35, 165, 84, 146, 227, 34, 147, 101, 58, + 122, 186, 40, 162, 86, 148, 70, 57, 181, 12, 100, 5, 67, 144, 111, 236, + 235, 59, 61, 191, 37, 39, 235, 255, 11, 197, 191, 84, 116, 181, 184, 251, + 39, 196, 65, 123, 11, 28, 161, 63, 28, 172, 111, 81, 49, 186, 216, 145, + 19, 244, 172, 224, 39, 105, 144, 214, 229, 216, 38, 190, 113, 254, 212, 25, + 174, 195, 221, 49, 28, 140, 102, 69, 66, 74, 194, 135, 84, 114, 203, 198, + 225, 190, 181, 68, 181, 42, 0, 203, 97, 86, 88, 198, 217, 9, 232, 47, + 224, 217, 111, 138, 101, 193, 93, 173, 120, 214, 214, 63, 92, 92, 145, 128, + 77, 110, 91, 251, 240, 34, 178, 207, 240, 95, 49, 39, 238, 214, 146, 145, + 240, 130, 55, 121, 87, 171, 36, 87, 40, 49, 16, 211, 108, 14, 84, 149, + 58, 132, 132, 60, 21, 77, 157, 103, 244, 24, 54, 125, 7, 125, 152, 251, + 253, 206, 156, 150, 216, 145, 251, 212, 90, 50, 2, 57, 212, 26, 202, 224, + 185, 45, 244, 242, 204, 19, 69, 232, 24, 170, 8, 189, 202, 69, 152, 102, + 215, 141, 228, 72, 228, 178, 185, 160, 164, 208, 246, 84, 106, 236, 11, 149, + 0, 73, 99, 104, 151, 6, 189, 225, 20, 224, 183, 106, 120, 0, 249, 129, + 42, 223, 90, 176, 160, 222, 222, 150, 90, 255, 16, 119, 183, 183, 149, 219, + 219, 50, 6, 61, 81, 197, 31, 2, 192, 59, 6, 46, 31, 110, 145, 203, + 214, 186, 152, 69, 15, 157, 244, 35, 25, 67, 122, 6, 36, 11, 8, 124, + 178, 185, 96, 116, 12, 207, 250, 16, 85, 181, 91, 141, 95, 192, 59, 20, + 121, 254, 63, 163, 25, 143, 74, 203, 103, 52, 197, 229, 27, 206, 89, 5, + 228, 87, 203, 122, 70, 115, 44, 118, 36, 193, 144, 26, 77, 13, 149, 228, + 194, 57, 77, 170, 9, 212, 150, 122, 198, 44, 151, 154, 126, 107, 85, 15, + 128, 15, 192, 43, 123, 224, 50, 83, 115, 98, 162, 44, 99, 57, 16, 118, + 9, 87, 17, 88, 67, 69, 245, 175, 130, 139, 215, 216, 195, 95, 138, 242, + 149, 82, 106, 187, 87, 87, 164, 102, 72, 169, 63, 18, 70, 205, 236, 59, + 147, 39, 251, 226, 206, 99, 165, 192, 54, 131, 232, 237, 12, 127, 182, 43, + 239, 245, 156, 89, 170, 217, 117, 121, 240, 67, 17, 149, 125, 120, 249, 243, + 59, 237, 64, 85, 143, 117, 164, 106, 196, 32, 238, 244, 110, 121, 237, 62, + 82, 152, 141, 51, 196, 36, 88, 148, 243, 30, 35, 129, 236, 77, 63, 154, + 31, 100, 32, 100, 124, 150, 83, 192, 162, 112, 14, 138, 106, 114, 233, 88, + 44, 252, 36, 151, 125, 142, 194, 172, 224, 61, 86, 203, 222, 66, 173, 118, + 170, 82, 208, 202, 219, 201, 14, 254, 73, 110, 5, 170, 247, 141, 208, 60, + 82, 186, 28, 164, 66, 123, 154, 80, 201, 67, 210, 94, 150, 214, 129, 218, + 158, 20, 42, 174, 159, 189, 249, 241, 245, 207, 127, 123, 247, 53, 111, 118, + 189, 251, 203, 171, 239, 191, 123, 141, 195, 91, 175, 255, 53, 120, 93, 175, + 191, 249, 249, 141, 248, 229, 207, 63, 191, 253, 94, 120, 53, 87, 252, 140, + 78, 158, 164, 42, 189, 94, 255, 250, 7, 228, 93, 172, 225, 98, 49, 187, + 172, 215, 87, 171, 85, 109, 21, 212, 166, 243, 135, 250, 207, 239, 235, 107, + 204, 206, 195, 207, 229, 107, 117, 97, 124, 91, 235, 47, 250, 183, 214, 13, + 180, 234, 26, 171, 71, 47, 204, 159, 208, 8, 0, 133, 195, 69, 187, 254, + 107, 231, 177, 195, 96, 24, 176, 120, 222, 3, 248, 48, 122, 24, 198, 163, + 168, 63, 168, 235, 183, 218, 175, 48, 158, 55, 215, 117, 78, 73, 121, 33, + 218, 0, 174, 140, 224, 131, 120, 177, 1, 102, 120, 56, 24, 96, 30, 102, + 230, 189, 24, 209, 96, 56, 31, 220, 31, 200, 150, 19, 212, 63, 167, 114, + 152, 102, 24, 215, 232, 76, 76, 212, 139, 223, 0, 226, 132, 162, 152, 100, + 170, 34, 234, 197, 43, 78, 41, 55, 220, 94, 143, 58, 113, 252, 3, 30, + 205, 13, 233, 152, 212, 160, 218, 157, 206, 97, 180, 40, 89, 170, 69, 117, + 221, 79, 221, 105, 127, 131, 47, 52, 1, 198, 194, 130, 57, 128, 123, 152, + 251, 236, 30, 222, 206, 142, 93, 111, 113, 170, 251, 251, 67, 201, 238, 239, + 147, 116, 131, 188, 220, 6, 235, 84, 94, 131, 220, 188, 48, 145, 206, 137, + 93, 218, 196, 61, 189, 241, 149, 101, 100, 15, 87, 23, 144, 148, 196, 102, + 153, 67, 97, 9, 72, 218, 157, 215, 111, 36, 99, 129, 193, 153, 160, 81, + 133, 145, 24, 3, 221, 136, 38, 213, 209, 224, 126, 113, 217, 116, 103, 107, + 152, 164, 48, 54, 85, 144, 90, 31, 38, 151, 8, 69, 204, 88, 44, 110, + 140, 26, 229, 173, 220, 169, 126, 200, 171, 64, 29, 242, 184, 174, 207, 110, + 82, 45, 163, 109, 130, 101, 190, 234, 56, 233, 50, 35, 187, 193, 186, 64, + 201, 117, 67, 176, 93, 215, 139, 78, 23, 69, 169, 3, 45, 2, 20, 228, + 243, 115, 183, 214, 69, 243, 43, 8, 117, 31, 216, 220, 242, 214, 122, 206, + 238, 195, 17, 70, 88, 163, 224, 93, 188, 187, 86, 67, 1, 224, 193, 60, + 69, 195, 128, 25, 186, 219, 153, 60, 0, 164, 1, 209, 8, 137, 209, 13, + 8, 65, 92, 232, 41, 203, 186, 94, 204, 161, 66, 116, 168, 15, 162, 38, + 0, 247, 211, 69, 186, 244, 31, 246, 42, 222, 1, 40, 20, 124, 133, 215, + 228, 34, 180, 123, 35, 119, 141, 81, 138, 95, 198, 131, 203, 235, 122, 23, + 122, 14, 19, 195, 99, 209, 199, 159, 185, 236, 70, 192, 138, 188, 193, 48, + 16, 105, 175, 239, 224, 107, 236, 173, 36, 3, 87, 119, 102, 222, 40, 24, + 98, 145, 65, 255, 88, 227, 179, 173, 34, 30, 239, 224, 137, 115, 99, 103, + 93, 15, 231, 122, 16, 184, 231, 170, 64, 201, 47, 133, 55, 91, 139, 120, + 138, 214, 15, 183, 207, 123, 189, 222, 213, 173, 85, 191, 193, 105, 136, 67, + 55, 244, 111, 174, 59, 138, 134, 60, 7, 238, 29, 187, 32, 26, 63, 136, + 206, 104, 1, 16, 232, 118, 61, 6, 174, 38, 97, 16, 95, 71, 91, 203, + 54, 100, 143, 183, 126, 18, 145, 185, 174, 119, 110, 254, 52, 233, 198, 179, + 43, 254, 133, 161, 232, 136, 168, 143, 4, 76, 183, 1, 136, 190, 17, 216, + 27, 131, 231, 175, 212, 216, 200, 29, 50, 221, 237, 29, 248, 7, 85, 61, + 186, 73, 150, 94, 31, 14, 238, 145, 1, 192, 58, 188, 71, 70, 123, 32, + 19, 104, 168, 11, 73, 127, 147, 211, 246, 127, 224, 198, 153, 98, 14, 181, + 189, 1, 228, 118, 0, 171, 24, 79, 62, 31, 181, 174, 103, 55, 106, 228, + 229, 48, 242, 196, 196, 233, 40, 122, 184, 94, 64, 12, 32, 28, 13, 30, + 207, 56, 61, 220, 56, 211, 48, 29, 13, 185, 149, 180, 192, 50, 49, 139, + 127, 161, 12, 85, 35, 68, 146, 234, 138, 142, 229, 94, 74, 147, 107, 64, + 92, 133, 212, 137, 254, 141, 57, 14, 133, 225, 9, 46, 71, 61, 64, 31, + 236, 222, 20, 50, 235, 113, 151, 252, 217, 81, 162, 77, 85, 184, 239, 140, + 163, 209, 230, 82, 160, 225, 34, 210, 165, 193, 21, 163, 54, 200, 40, 207, + 47, 0, 177, 47, 220, 20, 117, 23, 146, 188, 91, 169, 45, 162, 81, 107, + 235, 85, 208, 237, 30, 22, 63, 188, 105, 156, 139, 212, 94, 137, 131, 255, + 11, 75, 104, 77, 36, 247, 107, 94, 205, 170, 94, 173, 57, 24, 155, 179, + 137, 186, 150, 221, 29, 93, 135, 184, 95, 110, 236, 35, 202, 220, 104, 137, + 160, 169, 97, 236, 42, 30, 223, 88, 52, 39, 222, 191, 106, 183, 48, 213, + 7, 183, 48, 67, 29, 181, 166, 230, 237, 59, 65, 92, 150, 180, 112, 255, + 67, 103, 124, 123, 219, 56, 131, 68, 154, 180, 116, 179, 121, 36, 187, 81, + 214, 161, 60, 84, 18, 153, 137, 85, 128, 101, 137, 16, 136, 250, 162, 38, + 188, 255, 241, 123, 85, 184, 21, 176, 63, 163, 123, 211, 62, 174, 161, 86, + 177, 76, 241, 18, 223, 32, 244, 63, 96, 215, 170, 192, 155, 57, 153, 249, + 182, 55, 191, 243, 9, 1, 117, 74, 122, 159, 43, 233, 30, 220, 1, 250, + 127, 216, 123, 211, 246, 180, 149, 101, 81, 248, 59, 191, 66, 81, 88, 7, + 48, 98, 144, 24, 12, 73, 240, 186, 158, 237, 196, 83, 108, 39, 30, 226, + 44, 174, 0, 1, 178, 65, 194, 146, 152, 195, 254, 237, 183, 170, 186, 91, + 3, 96, 39, 107, 58, 247, 61, 239, 115, 247, 94, 49, 82, 171, 231, 174, + 174, 174, 170, 174, 33, 246, 255, 135, 139, 174, 229, 253, 146, 207, 151, 216, + 126, 145, 35, 87, 95, 226, 88, 151, 255, 218, 221, 151, 240, 204, 194, 224, + 147, 207, 197, 59, 210, 224, 66, 233, 153, 239, 66, 42, 164, 189, 244, 46, + 116, 220, 134, 149, 158, 8, 187, 71, 54, 191, 128, 98, 216, 252, 236, 136, + 106, 195, 86, 117, 101, 255, 108, 4, 84, 41, 142, 196, 200, 177, 245, 142, + 116, 111, 66, 74, 41, 145, 188, 44, 99, 204, 247, 238, 245, 111, 40, 40, + 160, 190, 168, 66, 14, 190, 212, 239, 63, 221, 157, 204, 11, 216, 210, 22, + 229, 42, 11, 209, 238, 155, 91, 56, 48, 200, 104, 110, 5, 130, 209, 164, + 249, 161, 158, 216, 78, 48, 37, 92, 115, 171, 158, 184, 79, 240, 8, 213, + 230, 155, 90, 49, 239, 63, 66, 255, 34, 181, 113, 202, 80, 204, 84, 228, + 227, 156, 77, 208, 58, 106, 154, 137, 245, 163, 244, 157, 208, 87, 195, 67, + 210, 87, 3, 225, 137, 146, 55, 244, 134, 78, 175, 134, 124, 189, 11, 140, + 61, 197, 76, 55, 134, 57, 161, 96, 146, 171, 71, 73, 130, 172, 139, 117, + 179, 46, 133, 192, 36, 190, 6, 106, 126, 90, 53, 173, 52, 175, 80, 156, + 209, 68, 83, 225, 100, 114, 222, 68, 176, 67, 26, 50, 49, 68, 11, 32, + 38, 161, 64, 60, 72, 156, 232, 146, 135, 161, 69, 145, 254, 174, 3, 39, + 100, 61, 5, 92, 190, 28, 103, 237, 35, 17, 19, 91, 71, 197, 152, 86, + 219, 14, 81, 49, 192, 174, 196, 62, 32, 207, 242, 139, 117, 110, 75, 98, + 32, 210, 0, 21, 165, 141, 137, 233, 122, 236, 34, 206, 235, 146, 3, 82, + 154, 181, 44, 163, 200, 3, 102, 72, 0, 198, 155, 112, 28, 122, 95, 11, + 144, 194, 209, 3, 219, 221, 182, 109, 9, 55, 10, 169, 172, 146, 145, 25, + 170, 82, 123, 18, 166, 71, 23, 93, 178, 165, 160, 184, 82, 65, 232, 102, + 120, 98, 216, 199, 220, 49, 230, 44, 233, 207, 77, 107, 203, 28, 133, 120, + 29, 57, 168, 31, 229, 126, 98, 159, 248, 18, 15, 32, 32, 109, 171, 217, + 51, 155, 79, 180, 123, 72, 104, 215, 117, 179, 198, 4, 246, 75, 43, 137, + 147, 145, 122, 105, 13, 250, 122, 199, 34, 170, 53, 66, 78, 98, 251, 171, + 205, 100, 154, 58, 17, 81, 130, 14, 246, 169, 96, 234, 45, 255, 235, 175, + 98, 228, 232, 121, 137, 228, 92, 67, 97, 70, 171, 230, 4, 182, 191, 122, + 176, 249, 67, 40, 40, 139, 247, 26, 75, 36, 51, 146, 157, 210, 154, 214, + 5, 205, 221, 176, 123, 173, 21, 90, 23, 81, 205, 82, 61, 188, 109, 73, + 254, 89, 131, 217, 127, 182, 193, 236, 79, 27, 252, 246, 207, 54, 248, 109, + 185, 193, 244, 186, 41, 77, 255, 139, 83, 186, 210, 96, 246, 159, 109, 112, + 101, 74, 87, 26, 252, 246, 207, 54, 184, 60, 165, 203, 185, 144, 92, 255, + 199, 26, 251, 176, 60, 186, 229, 140, 138, 188, 110, 55, 254, 197, 214, 56, + 121, 129, 39, 32, 119, 30, 184, 254, 94, 142, 157, 128, 175, 232, 231, 44, + 41, 152, 255, 121, 117, 29, 198, 190, 252, 138, 150, 206, 171, 60, 177, 70, + 98, 191, 16, 99, 187, 172, 203, 19, 37, 20, 59, 24, 213, 128, 161, 169, + 136, 4, 233, 79, 168, 246, 16, 13, 230, 179, 99, 120, 54, 172, 104, 243, + 192, 192, 221, 102, 207, 119, 85, 183, 174, 35, 13, 224, 56, 73, 60, 176, + 117, 37, 232, 173, 54, 217, 156, 115, 163, 162, 144, 168, 76, 142, 67, 101, + 36, 217, 88, 211, 148, 140, 8, 63, 129, 52, 147, 96, 51, 25, 175, 186, + 194, 104, 71, 40, 132, 136, 212, 229, 101, 97, 195, 138, 216, 76, 244, 186, + 177, 245, 203, 106, 72, 33, 153, 166, 140, 103, 42, 116, 76, 193, 134, 21, + 56, 80, 21, 236, 73, 148, 163, 13, 44, 187, 76, 183, 97, 219, 189, 36, + 115, 221, 152, 10, 73, 46, 98, 245, 72, 9, 210, 135, 142, 171, 10, 191, + 90, 121, 229, 43, 82, 81, 108, 98, 234, 75, 109, 242, 107, 30, 78, 184, + 200, 171, 20, 12, 147, 216, 17, 253, 143, 134, 40, 137, 69, 68, 144, 2, + 165, 81, 37, 14, 169, 183, 36, 240, 45, 223, 88, 158, 239, 72, 120, 64, + 122, 90, 5, 150, 142, 151, 37, 194, 206, 69, 251, 15, 124, 77, 133, 95, + 190, 7, 47, 64, 204, 250, 201, 15, 145, 18, 31, 160, 101, 36, 10, 177, + 1, 162, 255, 184, 243, 231, 4, 129, 1, 240, 56, 72, 146, 11, 190, 4, + 189, 16, 145, 49, 58, 253, 69, 26, 60, 68, 147, 48, 50, 12, 40, 50, + 26, 170, 188, 133, 61, 198, 242, 104, 59, 195, 21, 57, 136, 70, 95, 127, + 67, 198, 205, 188, 34, 24, 34, 48, 49, 138, 9, 197, 181, 140, 116, 200, + 53, 166, 36, 78, 91, 11, 3, 49, 238, 209, 207, 11, 67, 14, 133, 116, + 224, 122, 110, 11, 110, 200, 49, 103, 58, 108, 11, 25, 173, 173, 72, 78, + 198, 233, 190, 132, 111, 2, 13, 221, 38, 122, 26, 169, 60, 119, 32, 13, + 12, 171, 105, 162, 15, 126, 230, 64, 192, 51, 92, 143, 178, 106, 45, 52, + 105, 100, 12, 155, 157, 13, 89, 80, 163, 132, 246, 85, 113, 184, 24, 44, + 161, 65, 49, 52, 191, 171, 206, 66, 222, 216, 144, 174, 88, 94, 73, 38, + 41, 96, 72, 244, 252, 78, 216, 96, 100, 253, 18, 48, 154, 159, 88, 97, + 248, 211, 187, 78, 120, 250, 138, 124, 204, 239, 233, 11, 140, 77, 100, 36, + 1, 107, 19, 50, 36, 11, 233, 63, 250, 75, 1, 231, 171, 111, 80, 35, + 127, 15, 15, 67, 242, 141, 32, 229, 64, 159, 58, 122, 242, 132, 114, 39, + 208, 172, 148, 88, 178, 95, 161, 223, 67, 109, 70, 73, 249, 24, 35, 229, + 13, 88, 86, 163, 22, 255, 129, 84, 186, 159, 149, 167, 206, 235, 228, 155, + 33, 25, 255, 145, 137, 83, 10, 186, 137, 81, 83, 139, 159, 211, 254, 177, + 16, 237, 239, 215, 202, 23, 221, 249, 183, 231, 69, 164, 245, 161, 134, 36, + 237, 64, 51, 176, 236, 177, 226, 115, 26, 202, 66, 118, 125, 221, 84, 57, + 149, 13, 212, 60, 95, 60, 204, 215, 109, 86, 190, 208, 25, 233, 155, 180, + 221, 99, 114, 217, 55, 210, 119, 52, 37, 122, 233, 82, 156, 25, 116, 134, + 110, 197, 133, 50, 193, 131, 200, 78, 44, 199, 55, 189, 56, 208, 7, 134, + 163, 168, 249, 108, 105, 224, 41, 222, 216, 118, 129, 251, 248, 62, 7, 108, + 254, 132, 119, 243, 15, 15, 67, 244, 122, 218, 124, 130, 78, 205, 187, 83, + 200, 10, 40, 73, 105, 235, 86, 115, 218, 109, 57, 10, 191, 254, 157, 40, + 122, 223, 117, 167, 253, 6, 254, 162, 237, 186, 130, 99, 119, 149, 190, 254, + 100, 152, 173, 9, 55, 206, 167, 234, 196, 133, 49, 154, 127, 205, 231, 50, + 179, 3, 147, 23, 236, 35, 242, 150, 116, 188, 205, 169, 5, 32, 180, 76, + 139, 125, 233, 225, 184, 190, 61, 60, 4, 233, 243, 197, 252, 225, 1, 121, + 154, 70, 27, 126, 187, 6, 150, 93, 124, 159, 175, 100, 113, 144, 244, 130, + 179, 242, 137, 183, 225, 172, 175, 9, 143, 81, 202, 181, 166, 138, 229, 86, + 88, 69, 77, 92, 176, 57, 123, 6, 16, 7, 184, 236, 192, 144, 88, 110, + 98, 57, 23, 243, 82, 182, 178, 89, 18, 67, 8, 231, 25, 232, 142, 105, + 181, 96, 21, 22, 243, 252, 160, 185, 250, 221, 110, 181, 112, 29, 216, 17, + 191, 152, 171, 37, 92, 157, 213, 108, 198, 8, 237, 147, 95, 204, 215, 132, + 109, 5, 32, 53, 247, 236, 102, 203, 24, 96, 135, 84, 254, 173, 103, 15, + 6, 83, 222, 119, 230, 219, 134, 150, 104, 222, 212, 23, 115, 167, 131, 6, + 82, 217, 10, 250, 28, 89, 147, 163, 33, 114, 40, 204, 203, 83, 121, 77, + 158, 102, 40, 79, 105, 109, 45, 45, 191, 157, 178, 194, 255, 249, 185, 30, + 30, 118, 155, 14, 140, 206, 239, 82, 228, 75, 35, 248, 210, 136, 126, 233, + 4, 95, 154, 209, 47, 205, 224, 75, 43, 250, 197, 242, 191, 208, 221, 114, + 248, 35, 237, 127, 248, 140, 182, 159, 14, 41, 211, 234, 206, 116, 174, 44, + 0, 36, 20, 158, 207, 50, 198, 28, 75, 64, 190, 93, 125, 1, 231, 57, + 7, 128, 96, 58, 223, 170, 107, 51, 55, 86, 51, 55, 94, 204, 220, 92, + 205, 220, 124, 49, 115, 107, 53, 115, 43, 148, 217, 49, 130, 236, 15, 15, + 8, 133, 19, 196, 112, 243, 99, 124, 10, 31, 240, 44, 59, 109, 97, 252, + 68, 111, 228, 235, 98, 46, 80, 8, 203, 65, 247, 214, 118, 187, 73, 78, + 77, 128, 145, 8, 43, 195, 195, 44, 118, 245, 1, 194, 224, 137, 233, 70, + 200, 135, 197, 207, 148, 50, 8, 131, 253, 92, 43, 131, 103, 251, 147, 106, + 25, 161, 38, 86, 110, 226, 73, 7, 211, 191, 124, 23, 99, 102, 242, 162, + 197, 175, 220, 239, 191, 84, 45, 28, 86, 43, 213, 252, 242, 45, 127, 8, + 161, 75, 225, 193, 70, 11, 8, 230, 148, 114, 71, 89, 8, 153, 33, 5, + 170, 109, 206, 169, 156, 197, 171, 116, 205, 11, 77, 190, 124, 137, 254, 170, + 149, 169, 65, 86, 132, 56, 7, 237, 222, 208, 237, 34, 190, 133, 131, 211, + 200, 215, 228, 255, 252, 231, 63, 108, 206, 127, 241, 62, 253, 213, 49, 255, + 143, 186, 108, 127, 101, 32, 104, 131, 250, 211, 203, 120, 178, 38, 134, 85, + 245, 193, 4, 207, 132, 254, 160, 43, 214, 151, 239, 111, 127, 185, 23, 82, + 248, 238, 124, 241, 240, 48, 34, 217, 224, 198, 60, 147, 207, 110, 26, 64, + 200, 44, 93, 109, 211, 186, 136, 243, 143, 176, 214, 124, 155, 171, 51, 2, + 231, 184, 88, 136, 205, 17, 90, 209, 23, 238, 172, 93, 105, 170, 100, 202, + 121, 73, 248, 46, 0, 70, 136, 107, 56, 63, 60, 100, 72, 141, 90, 154, + 174, 227, 96, 214, 0, 180, 12, 29, 1, 34, 3, 232, 32, 234, 208, 195, + 67, 151, 15, 2, 206, 154, 102, 127, 17, 135, 78, 13, 123, 61, 195, 139, + 35, 88, 97, 215, 61, 47, 152, 128, 5, 144, 120, 198, 154, 91, 238, 159, + 94, 102, 71, 8, 170, 127, 235, 54, 219, 165, 72, 73, 168, 107, 194, 118, + 132, 68, 218, 211, 190, 194, 214, 10, 55, 17, 157, 157, 127, 241, 2, 12, + 217, 86, 153, 5, 69, 82, 228, 5, 61, 8, 192, 192, 217, 93, 134, 202, + 21, 176, 192, 51, 204, 39, 164, 252, 213, 120, 135, 117, 112, 24, 139, 46, + 162, 88, 226, 216, 11, 171, 201, 214, 114, 5, 157, 68, 111, 143, 152, 228, + 196, 229, 115, 249, 250, 85, 27, 97, 141, 202, 207, 177, 70, 106, 29, 22, + 137, 45, 183, 152, 228, 219, 144, 193, 194, 66, 10, 65, 108, 116, 8, 194, + 183, 221, 95, 188, 60, 163, 246, 86, 110, 205, 120, 47, 66, 23, 103, 129, + 134, 224, 11, 172, 230, 18, 187, 240, 183, 46, 209, 30, 30, 254, 251, 174, + 209, 80, 138, 144, 76, 240, 139, 42, 64, 35, 145, 43, 211, 58, 89, 84, + 212, 241, 74, 116, 242, 34, 242, 241, 209, 143, 206, 172, 251, 67, 178, 93, + 81, 94, 116, 138, 29, 111, 76, 88, 19, 153, 235, 176, 86, 135, 20, 194, + 156, 33, 109, 156, 255, 248, 192, 127, 29, 190, 72, 3, 36, 202, 192, 31, + 234, 159, 251, 23, 110, 28, 144, 99, 209, 67, 247, 191, 241, 14, 237, 23, + 169, 10, 139, 157, 48, 205, 222, 176, 101, 8, 190, 238, 219, 147, 1, 76, + 18, 250, 242, 241, 136, 140, 168, 121, 206, 208, 80, 120, 108, 132, 114, 179, + 175, 240, 219, 184, 128, 77, 250, 62, 15, 223, 185, 45, 24, 41, 224, 99, + 122, 100, 178, 44, 96, 140, 201, 243, 147, 63, 137, 66, 21, 51, 196, 210, + 255, 231, 221, 98, 101, 123, 173, 163, 169, 56, 155, 189, 204, 32, 255, 29, + 99, 86, 170, 235, 215, 196, 227, 47, 9, 190, 67, 120, 46, 225, 143, 2, + 121, 138, 249, 138, 180, 123, 177, 72, 188, 34, 240, 254, 143, 233, 74, 33, + 196, 230, 217, 255, 121, 181, 66, 33, 152, 134, 74, 179, 108, 230, 197, 113, + 24, 150, 26, 48, 230, 28, 163, 236, 8, 86, 128, 224, 27, 58, 237, 66, + 227, 142, 17, 255, 207, 190, 69, 222, 174, 196, 232, 209, 234, 17, 203, 32, + 126, 246, 185, 5, 90, 13, 0, 50, 95, 150, 252, 26, 152, 193, 210, 44, + 233, 118, 113, 251, 40, 130, 0, 96, 213, 220, 30, 90, 35, 45, 233, 104, + 213, 121, 166, 250, 82, 250, 111, 60, 253, 183, 165, 244, 183, 126, 186, 180, + 244, 191, 183, 210, 37, 203, 40, 37, 222, 38, 162, 133, 254, 8, 245, 132, + 12, 115, 209, 59, 61, 140, 107, 169, 238, 56, 207, 22, 95, 74, 127, 152, + 11, 75, 175, 249, 242, 151, 133, 248, 178, 88, 250, 242, 95, 252, 195, 127, + 45, 165, 255, 128, 244, 255, 196, 127, 196, 255, 179, 148, 142, 183, 94, 241, + 135, 15, 203, 77, 111, 81, 242, 214, 74, 143, 86, 166, 53, 195, 219, 203, + 44, 229, 68, 45, 195, 57, 195, 88, 132, 225, 87, 25, 8, 46, 127, 130, + 237, 19, 118, 150, 195, 132, 94, 200, 0, 180, 47, 133, 143, 218, 6, 189, + 238, 136, 87, 228, 19, 248, 99, 39, 120, 108, 70, 51, 245, 233, 203, 43, + 14, 122, 120, 132, 232, 151, 118, 42, 117, 43, 226, 141, 71, 218, 216, 0, + 180, 209, 62, 22, 190, 119, 120, 15, 95, 230, 138, 130, 42, 254, 159, 199, + 157, 23, 61, 238, 252, 143, 240, 180, 99, 113, 23, 43, 175, 185, 217, 97, + 238, 117, 254, 138, 91, 157, 0, 78, 194, 67, 251, 153, 91, 157, 191, 227, + 253, 230, 23, 61, 202, 172, 12, 119, 153, 244, 89, 227, 68, 6, 235, 202, + 195, 58, 186, 120, 226, 183, 143, 151, 190, 179, 61, 243, 170, 219, 152, 215, + 42, 88, 87, 222, 71, 247, 97, 79, 143, 191, 238, 208, 130, 77, 254, 250, + 147, 127, 9, 53, 189, 226, 242, 98, 13, 50, 97, 199, 82, 4, 230, 110, + 226, 91, 181, 249, 120, 33, 29, 225, 111, 119, 33, 237, 225, 111, 107, 33, + 93, 225, 175, 187, 144, 142, 175, 234, 5, 76, 3, 146, 9, 87, 163, 208, + 138, 120, 35, 91, 227, 8, 111, 206, 75, 0, 2, 161, 104, 168, 232, 67, + 62, 83, 201, 211, 27, 133, 43, 87, 224, 197, 181, 244, 1, 108, 66, 175, + 64, 23, 101, 220, 11, 53, 186, 134, 168, 168, 85, 77, 154, 65, 70, 120, + 80, 37, 98, 118, 186, 44, 145, 92, 184, 241, 116, 32, 120, 45, 230, 119, + 60, 26, 49, 60, 205, 157, 10, 122, 228, 181, 81, 99, 85, 98, 196, 100, + 201, 169, 205, 217, 53, 13, 190, 109, 0, 74, 202, 141, 49, 204, 48, 134, + 47, 96, 174, 7, 227, 206, 111, 10, 254, 11, 133, 214, 36, 146, 104, 205, + 16, 93, 84, 31, 117, 164, 57, 250, 215, 37, 231, 186, 5, 30, 255, 51, + 156, 228, 135, 87, 29, 127, 168, 117, 25, 170, 236, 126, 208, 74, 101, 201, + 209, 90, 83, 9, 30, 40, 106, 40, 14, 239, 67, 109, 44, 252, 78, 240, + 239, 19, 254, 125, 165, 130, 173, 146, 170, 177, 10, 48, 190, 213, 106, 5, + 226, 251, 132, 127, 103, 21, 116, 81, 37, 218, 97, 110, 59, 225, 73, 212, + 74, 137, 69, 206, 53, 34, 171, 229, 71, 166, 204, 243, 184, 148, 69, 12, + 161, 5, 115, 28, 76, 48, 70, 10, 244, 109, 165, 207, 248, 148, 224, 168, + 209, 77, 56, 15, 235, 67, 147, 190, 201, 2, 202, 159, 109, 169, 124, 17, + 84, 138, 203, 66, 238, 253, 30, 36, 44, 246, 14, 178, 23, 20, 181, 196, + 230, 14, 190, 69, 18, 97, 246, 249, 73, 19, 192, 19, 213, 144, 44, 180, + 30, 36, 187, 241, 8, 71, 98, 42, 8, 240, 66, 189, 196, 122, 88, 158, + 248, 28, 192, 122, 49, 137, 207, 143, 216, 207, 30, 251, 1, 152, 94, 44, + 21, 66, 255, 229, 70, 135, 162, 193, 88, 89, 238, 202, 30, 227, 35, 149, + 139, 82, 83, 188, 51, 239, 228, 217, 24, 143, 66, 35, 130, 208, 100, 74, + 65, 12, 26, 140, 40, 74, 224, 242, 194, 96, 98, 65, 132, 18, 223, 177, + 200, 52, 52, 175, 25, 41, 240, 161, 239, 67, 111, 90, 18, 211, 73, 128, + 193, 242, 56, 4, 27, 194, 153, 59, 15, 146, 132, 161, 41, 74, 44, 191, + 191, 230, 225, 34, 12, 164, 75, 229, 151, 139, 188, 74, 249, 3, 218, 8, + 14, 82, 30, 57, 109, 34, 1, 95, 42, 5, 187, 195, 98, 247, 255, 81, + 27, 99, 134, 160, 169, 178, 30, 74, 208, 211, 138, 37, 208, 53, 22, 27, + 163, 227, 22, 210, 24, 192, 179, 59, 40, 167, 172, 229, 14, 148, 101, 186, + 191, 22, 110, 204, 68, 135, 165, 107, 8, 128, 104, 58, 21, 52, 23, 49, + 225, 75, 49, 234, 132, 20, 198, 137, 81, 74, 144, 29, 117, 164, 36, 83, + 42, 207, 163, 119, 215, 22, 139, 183, 137, 218, 225, 82, 151, 165, 147, 146, + 249, 123, 225, 26, 27, 95, 96, 82, 186, 100, 112, 32, 2, 66, 165, 222, + 3, 175, 78, 95, 48, 29, 253, 100, 215, 225, 216, 70, 39, 159, 204, 147, + 171, 17, 114, 230, 140, 142, 1, 18, 89, 116, 165, 156, 78, 197, 176, 35, + 64, 52, 196, 55, 100, 204, 142, 26, 4, 153, 172, 163, 143, 21, 114, 59, + 75, 96, 198, 43, 64, 111, 2, 239, 164, 190, 225, 186, 168, 214, 202, 10, + 11, 47, 177, 231, 100, 137, 31, 242, 75, 43, 178, 217, 22, 90, 76, 75, + 228, 96, 88, 98, 246, 250, 107, 60, 57, 27, 137, 84, 216, 231, 172, 207, + 83, 146, 55, 104, 212, 62, 72, 98, 136, 43, 107, 154, 146, 92, 143, 20, + 42, 112, 206, 184, 123, 98, 140, 62, 136, 242, 34, 248, 210, 124, 146, 136, + 128, 69, 29, 125, 215, 3, 90, 215, 143, 69, 135, 211, 106, 54, 209, 191, + 61, 27, 198, 47, 143, 152, 184, 109, 232, 146, 47, 4, 224, 3, 251, 233, + 200, 21, 190, 193, 208, 75, 179, 201, 244, 207, 253, 44, 108, 30, 168, 206, + 208, 100, 184, 102, 223, 196, 160, 122, 254, 10, 209, 40, 215, 150, 66, 143, + 17, 134, 222, 79, 177, 225, 136, 62, 138, 120, 20, 90, 13, 87, 126, 33, + 211, 32, 231, 90, 6, 208, 5, 80, 81, 56, 82, 192, 21, 113, 117, 121, + 132, 174, 215, 194, 32, 156, 254, 210, 254, 194, 208, 248, 170, 210, 98, 80, + 80, 17, 150, 51, 201, 170, 74, 253, 116, 80, 60, 191, 109, 173, 84, 17, + 90, 56, 255, 19, 1, 143, 24, 171, 232, 237, 47, 173, 96, 123, 104, 17, + 252, 168, 45, 232, 75, 254, 67, 205, 237, 3, 205, 210, 181, 96, 24, 31, + 106, 128, 85, 242, 232, 62, 125, 154, 87, 38, 42, 61, 96, 60, 192, 172, + 50, 177, 232, 37, 128, 198, 99, 203, 53, 28, 84, 21, 67, 150, 126, 104, + 15, 93, 73, 221, 243, 107, 230, 250, 62, 254, 20, 245, 248, 221, 221, 147, + 49, 29, 216, 166, 5, 232, 44, 57, 121, 82, 166, 79, 193, 86, 49, 129, + 152, 215, 45, 244, 160, 157, 39, 151, 241, 147, 167, 212, 119, 204, 36, 233, + 142, 33, 13, 108, 180, 142, 31, 177, 176, 169, 29, 195, 113, 95, 13, 189, + 224, 143, 166, 166, 114, 79, 206, 147, 124, 109, 154, 175, 229, 35, 254, 206, + 67, 147, 160, 178, 243, 8, 227, 82, 41, 69, 56, 111, 242, 202, 38, 61, + 87, 48, 254, 185, 239, 192, 156, 69, 117, 68, 23, 233, 5, 32, 151, 34, + 115, 24, 118, 78, 46, 34, 32, 196, 213, 15, 40, 247, 228, 190, 157, 53, + 22, 88, 178, 0, 63, 126, 228, 200, 99, 244, 222, 241, 194, 4, 138, 192, + 6, 254, 88, 16, 66, 113, 44, 161, 25, 228, 64, 140, 18, 96, 84, 147, + 9, 141, 155, 162, 67, 193, 60, 146, 3, 254, 184, 138, 193, 8, 252, 220, + 120, 122, 41, 115, 140, 206, 48, 206, 177, 144, 247, 24, 95, 51, 134, 7, + 4, 156, 13, 83, 58, 82, 200, 63, 60, 240, 45, 102, 59, 105, 158, 226, + 186, 171, 105, 44, 128, 225, 37, 243, 41, 46, 172, 36, 113, 154, 211, 135, + 211, 94, 120, 251, 66, 166, 39, 150, 110, 75, 9, 10, 99, 254, 152, 100, + 148, 38, 77, 109, 42, 131, 175, 153, 224, 29, 152, 93, 96, 76, 39, 18, + 116, 20, 189, 129, 101, 243, 170, 148, 195, 0, 118, 8, 165, 89, 58, 159, + 168, 1, 126, 208, 101, 124, 127, 207, 221, 183, 121, 120, 129, 245, 196, 222, + 65, 149, 241, 45, 140, 178, 206, 95, 85, 246, 58, 81, 131, 175, 105, 36, + 47, 167, 106, 240, 29, 19, 98, 168, 189, 0, 3, 76, 198, 167, 106, 38, + 62, 205, 179, 0, 14, 216, 9, 37, 62, 129, 148, 9, 14, 114, 58, 224, + 181, 106, 88, 235, 70, 60, 152, 222, 116, 18, 242, 4, 175, 248, 13, 235, + 195, 34, 106, 80, 4, 26, 250, 165, 66, 166, 160, 138, 161, 89, 28, 44, + 244, 247, 49, 72, 162, 99, 12, 122, 67, 254, 185, 145, 68, 54, 49, 56, + 251, 35, 197, 114, 137, 111, 17, 113, 246, 152, 137, 155, 31, 80, 39, 119, + 14, 67, 193, 206, 139, 170, 255, 152, 139, 135, 252, 31, 249, 20, 99, 178, + 113, 14, 160, 157, 57, 182, 150, 250, 3, 35, 248, 177, 167, 194, 226, 61, + 13, 158, 222, 85, 255, 139, 74, 95, 176, 177, 185, 182, 1, 25, 33, 181, + 176, 33, 202, 6, 233, 170, 72, 167, 146, 41, 0, 182, 105, 254, 61, 76, + 46, 252, 27, 224, 195, 64, 77, 197, 76, 107, 4, 248, 2, 22, 183, 223, + 31, 246, 124, 250, 43, 43, 53, 125, 103, 37, 58, 250, 44, 34, 158, 178, + 175, 15, 144, 206, 35, 148, 21, 56, 185, 87, 96, 140, 121, 22, 112, 158, + 2, 149, 50, 34, 144, 127, 43, 72, 60, 100, 83, 218, 125, 134, 111, 233, + 141, 16, 173, 199, 130, 108, 54, 37, 63, 13, 64, 175, 41, 165, 197, 7, + 63, 204, 3, 199, 14, 102, 136, 38, 96, 30, 118, 178, 145, 115, 157, 210, + 32, 229, 27, 186, 188, 120, 247, 93, 156, 129, 65, 10, 87, 77, 253, 114, + 121, 130, 105, 254, 113, 253, 125, 82, 183, 26, 117, 242, 6, 231, 110, 97, + 84, 234, 57, 51, 44, 217, 202, 127, 251, 237, 187, 244, 67, 250, 198, 156, + 208, 143, 191, 75, 48, 157, 146, 136, 187, 28, 253, 216, 229, 31, 73, 27, + 103, 233, 91, 139, 127, 99, 162, 243, 97, 127, 233, 179, 139, 159, 235, 115, + 134, 40, 85, 165, 78, 191, 26, 34, 119, 200, 67, 14, 241, 135, 61, 61, + 33, 45, 112, 172, 44, 207, 92, 249, 241, 254, 71, 238, 199, 31, 11, 150, + 213, 127, 133, 34, 223, 222, 205, 39, 63, 166, 63, 102, 63, 154, 63, 68, + 234, 119, 116, 133, 159, 95, 162, 128, 248, 41, 161, 75, 64, 222, 113, 154, + 195, 211, 159, 12, 126, 64, 232, 62, 1, 129, 1, 184, 120, 18, 70, 11, + 199, 179, 2, 152, 108, 50, 18, 34, 82, 129, 5, 87, 32, 217, 241, 119, + 197, 175, 29, 10, 153, 172, 129, 160, 250, 165, 16, 204, 173, 32, 2, 3, + 162, 79, 118, 74, 100, 165, 43, 168, 181, 135, 98, 53, 188, 24, 0, 120, + 155, 162, 163, 62, 187, 111, 122, 20, 25, 40, 56, 229, 252, 121, 129, 34, + 84, 231, 20, 187, 35, 60, 242, 0, 170, 75, 240, 30, 96, 245, 112, 150, + 247, 7, 222, 148, 7, 37, 88, 67, 208, 161, 75, 55, 73, 152, 248, 190, + 118, 134, 249, 112, 194, 194, 62, 243, 203, 15, 90, 244, 154, 88, 94, 255, + 116, 99, 139, 181, 116, 188, 49, 32, 245, 181, 94, 87, 190, 36, 49, 206, + 71, 225, 125, 81, 41, 41, 229, 247, 155, 74, 69, 169, 254, 81, 133, 191, + 155, 239, 203, 144, 82, 124, 95, 192, 240, 114, 169, 112, 41, 95, 127, 118, + 181, 100, 74, 74, 2, 11, 243, 135, 170, 85, 254, 40, 23, 83, 161, 72, + 34, 5, 37, 1, 71, 200, 100, 11, 78, 26, 5, 67, 6, 110, 52, 19, + 225, 32, 68, 161, 237, 84, 47, 149, 75, 97, 122, 146, 111, 12, 69, 108, + 2, 197, 49, 0, 125, 184, 6, 134, 179, 54, 117, 139, 157, 114, 43, 241, + 36, 56, 180, 5, 1, 195, 5, 76, 97, 196, 136, 203, 195, 157, 12, 182, + 130, 109, 0, 25, 234, 49, 10, 156, 221, 58, 224, 35, 210, 40, 47, 199, + 77, 89, 211, 62, 78, 120, 184, 243, 190, 34, 59, 133, 62, 210, 88, 216, + 35, 109, 43, 28, 15, 169, 32, 98, 33, 241, 68, 174, 242, 94, 100, 42, + 239, 81, 194, 96, 185, 207, 82, 34, 142, 192, 16, 4, 60, 138, 107, 147, + 120, 129, 29, 254, 152, 249, 29, 134, 128, 80, 134, 196, 102, 209, 69, 101, + 81, 98, 157, 149, 120, 26, 178, 192, 80, 72, 137, 23, 248, 161, 42, 165, + 183, 182, 164, 146, 244, 95, 89, 169, 92, 144, 210, 255, 5, 136, 160, 160, + 74, 91, 91, 136, 17, 84, 149, 71, 122, 134, 254, 84, 164, 13, 72, 41, + 226, 214, 148, 194, 104, 146, 134, 222, 28, 54, 16, 243, 201, 254, 245, 27, + 6, 236, 34, 84, 95, 87, 91, 245, 102, 15, 88, 215, 58, 48, 239, 133, + 86, 176, 92, 217, 229, 245, 218, 61, 249, 114, 29, 89, 174, 44, 213, 234, + 227, 134, 228, 118, 203, 134, 119, 202, 70, 51, 193, 162, 119, 188, 22, 229, + 102, 125, 23, 84, 127, 197, 120, 183, 125, 234, 76, 93, 38, 203, 88, 99, + 216, 29, 127, 238, 25, 153, 101, 122, 116, 219, 6, 164, 93, 27, 214, 250, + 3, 5, 144, 192, 181, 124, 83, 83, 243, 191, 227, 219, 59, 83, 22, 161, + 49, 40, 84, 75, 62, 70, 132, 109, 141, 238, 106, 218, 73, 22, 203, 5, + 246, 74, 50, 165, 224, 169, 158, 122, 31, 107, 1, 161, 70, 241, 142, 136, + 58, 194, 152, 70, 45, 32, 72, 40, 133, 69, 119, 193, 20, 179, 15, 9, + 180, 238, 192, 16, 191, 143, 49, 61, 126, 246, 28, 137, 125, 196, 216, 228, + 39, 133, 72, 6, 200, 207, 3, 49, 17, 139, 76, 237, 1, 21, 214, 125, + 251, 4, 205, 34, 162, 165, 36, 12, 42, 5, 92, 242, 147, 2, 191, 188, + 84, 228, 51, 79, 195, 56, 114, 65, 53, 82, 70, 226, 233, 68, 162, 188, + 143, 209, 45, 4, 38, 41, 9, 152, 187, 186, 186, 87, 191, 58, 190, 223, + 151, 18, 138, 170, 165, 126, 79, 70, 91, 99, 228, 140, 246, 61, 90, 159, + 138, 193, 55, 249, 16, 93, 207, 30, 37, 197, 252, 208, 216, 213, 247, 49, + 193, 233, 3, 9, 174, 248, 228, 33, 182, 157, 122, 183, 212, 122, 225, 159, + 110, 189, 176, 166, 245, 224, 207, 74, 31, 246, 206, 79, 183, 143, 207, 234, + 167, 199, 103, 216, 5, 245, 133, 46, 168, 203, 93, 80, 57, 52, 32, 220, + 68, 123, 193, 36, 30, 109, 248, 97, 45, 32, 164, 45, 175, 33, 253, 98, + 198, 180, 180, 92, 51, 164, 138, 170, 213, 127, 175, 106, 109, 185, 234, 181, + 115, 178, 125, 251, 23, 230, 68, 159, 252, 107, 115, 2, 85, 255, 91, 115, + 2, 85, 175, 153, 147, 100, 12, 37, 92, 209, 212, 55, 166, 107, 233, 22, + 18, 94, 169, 223, 91, 182, 148, 4, 220, 1, 128, 198, 118, 121, 58, 141, + 117, 192, 167, 23, 251, 133, 226, 177, 252, 239, 196, 136, 37, 255, 116, 55, + 87, 59, 163, 212, 147, 228, 37, 33, 245, 94, 10, 245, 43, 37, 98, 173, + 125, 195, 197, 86, 112, 116, 223, 223, 203, 139, 24, 197, 146, 28, 24, 64, + 39, 121, 134, 52, 157, 53, 73, 143, 236, 91, 156, 176, 222, 247, 55, 181, + 111, 34, 246, 36, 252, 255, 123, 12, 144, 38, 11, 119, 199, 176, 34, 57, + 193, 101, 89, 229, 239, 62, 38, 164, 119, 40, 87, 8, 80, 33, 75, 42, + 176, 36, 163, 7, 103, 69, 77, 162, 79, 25, 9, 11, 81, 191, 146, 199, + 252, 45, 181, 1, 244, 72, 142, 178, 113, 141, 46, 22, 227, 138, 201, 101, + 229, 241, 22, 115, 69, 193, 93, 80, 8, 63, 21, 113, 77, 230, 156, 239, + 24, 221, 95, 52, 129, 59, 201, 34, 135, 50, 3, 150, 153, 113, 163, 161, + 191, 116, 26, 82, 228, 77, 58, 12, 98, 43, 7, 99, 187, 103, 71, 206, + 197, 229, 67, 207, 30, 144, 55, 105, 9, 242, 141, 163, 135, 31, 150, 12, + 206, 190, 145, 137, 212, 107, 182, 111, 182, 90, 61, 163, 49, 116, 166, 89, + 163, 53, 92, 58, 6, 67, 45, 46, 29, 99, 145, 86, 214, 30, 103, 1, + 233, 0, 121, 116, 143, 199, 222, 209, 242, 240, 127, 53, 171, 149, 56, 13, + 145, 229, 50, 237, 232, 167, 181, 241, 209, 252, 206, 36, 222, 73, 7, 98, + 24, 216, 32, 208, 59, 228, 49, 91, 151, 88, 196, 52, 127, 160, 89, 57, + 100, 145, 148, 230, 113, 130, 52, 169, 169, 3, 65, 38, 81, 175, 148, 33, + 144, 79, 210, 88, 233, 214, 230, 127, 48, 33, 63, 229, 42, 176, 139, 19, + 148, 104, 196, 199, 74, 188, 203, 168, 154, 8, 40, 134, 215, 165, 179, 204, + 216, 213, 59, 61, 187, 129, 52, 65, 135, 46, 90, 211, 232, 36, 91, 36, + 75, 40, 71, 139, 172, 40, 165, 190, 147, 6, 58, 48, 9, 206, 138, 32, + 204, 231, 64, 124, 99, 55, 160, 64, 112, 230, 125, 23, 148, 94, 23, 136, + 78, 88, 176, 102, 151, 137, 9, 125, 30, 133, 42, 230, 213, 174, 227, 26, + 58, 9, 127, 141, 89, 31, 98, 43, 253, 172, 71, 62, 251, 161, 241, 24, + 16, 160, 28, 152, 5, 81, 11, 117, 33, 220, 40, 44, 207, 70, 130, 162, + 203, 97, 166, 130, 66, 85, 226, 61, 19, 234, 133, 213, 105, 222, 226, 178, + 92, 195, 128, 191, 226, 182, 65, 150, 223, 74, 24, 33, 9, 210, 152, 134, + 46, 187, 104, 192, 158, 116, 36, 140, 15, 60, 236, 195, 108, 118, 216, 13, + 84, 13, 175, 172, 94, 131, 22, 90, 135, 119, 210, 153, 205, 58, 199, 98, + 248, 137, 121, 67, 242, 38, 218, 209, 32, 40, 52, 47, 62, 232, 133, 152, + 135, 208, 202, 68, 5, 181, 254, 166, 162, 64, 175, 89, 44, 53, 208, 123, + 134, 231, 9, 102, 129, 36, 207, 161, 42, 151, 54, 83, 164, 4, 223, 71, + 52, 111, 33, 186, 112, 67, 246, 67, 125, 169, 5, 161, 77, 40, 85, 149, + 130, 38, 136, 66, 178, 168, 64, 63, 229, 203, 215, 154, 248, 189, 160, 197, + 132, 187, 29, 174, 51, 73, 140, 3, 233, 16, 164, 34, 41, 234, 74, 138, + 134, 41, 18, 175, 62, 206, 126, 223, 83, 73, 133, 114, 43, 148, 131, 216, + 128, 62, 80, 165, 220, 96, 146, 68, 120, 225, 224, 86, 82, 146, 151, 77, + 73, 225, 144, 93, 28, 209, 189, 188, 187, 188, 149, 221, 69, 222, 197, 97, + 66, 189, 149, 153, 36, 79, 18, 254, 156, 139, 105, 20, 184, 104, 67, 102, + 34, 235, 200, 26, 83, 120, 189, 95, 88, 228, 104, 213, 193, 114, 251, 251, + 115, 221, 14, 243, 130, 29, 198, 218, 249, 107, 253, 93, 138, 149, 135, 225, + 22, 252, 176, 111, 15, 78, 98, 65, 87, 91, 223, 254, 128, 106, 55, 72, + 23, 246, 225, 129, 120, 135, 71, 140, 225, 253, 38, 252, 158, 86, 41, 26, + 221, 131, 149, 0, 34, 137, 200, 251, 1, 156, 119, 154, 2, 159, 6, 223, + 89, 150, 193, 247, 15, 53, 193, 124, 224, 219, 27, 150, 31, 137, 255, 65, + 234, 61, 73, 81, 146, 38, 240, 24, 64, 238, 15, 136, 74, 6, 6, 83, + 244, 38, 163, 46, 119, 213, 15, 235, 247, 79, 244, 153, 191, 107, 244, 254, + 54, 50, 132, 194, 63, 56, 4, 182, 140, 150, 225, 141, 109, 231, 9, 47, + 106, 88, 136, 232, 140, 90, 131, 76, 104, 82, 212, 2, 126, 51, 95, 3, + 24, 160, 231, 113, 206, 150, 208, 168, 16, 239, 73, 126, 72, 91, 225, 15, + 97, 240, 225, 57, 48, 156, 164, 1, 108, 100, 203, 101, 18, 177, 144, 76, + 107, 159, 202, 229, 120, 35, 18, 198, 165, 204, 32, 202, 207, 136, 174, 176, + 75, 58, 20, 237, 59, 192, 51, 12, 108, 118, 221, 197, 107, 14, 129, 159, + 224, 90, 41, 226, 48, 28, 142, 137, 53, 93, 13, 98, 185, 218, 161, 253, + 197, 93, 124, 71, 229, 146, 252, 174, 104, 69, 48, 169, 240, 32, 158, 117, + 155, 244, 138, 220, 23, 46, 41, 151, 226, 98, 235, 104, 82, 77, 114, 57, + 113, 146, 49, 219, 127, 142, 71, 147, 225, 59, 24, 127, 35, 217, 175, 133, + 158, 141, 246, 34, 81, 75, 14, 45, 102, 209, 215, 10, 198, 200, 194, 18, + 48, 121, 74, 72, 166, 176, 94, 250, 83, 107, 235, 72, 219, 97, 24, 112, + 212, 17, 14, 9, 130, 94, 30, 211, 178, 84, 197, 253, 211, 34, 159, 72, + 31, 151, 157, 23, 104, 81, 73, 14, 239, 7, 53, 31, 255, 125, 93, 251, + 68, 25, 101, 229, 101, 173, 142, 180, 56, 18, 154, 240, 127, 166, 2, 145, + 11, 228, 49, 57, 146, 199, 144, 192, 59, 214, 112, 123, 92, 96, 67, 79, + 82, 73, 74, 251, 106, 31, 109, 171, 22, 159, 251, 211, 136, 78, 189, 213, + 7, 89, 137, 111, 201, 11, 166, 241, 1, 223, 153, 36, 131, 169, 121, 104, + 171, 2, 35, 155, 80, 92, 188, 109, 9, 193, 18, 55, 153, 102, 90, 5, + 166, 91, 7, 188, 135, 100, 124, 62, 186, 128, 43, 82, 161, 23, 87, 6, + 229, 44, 60, 242, 122, 32, 245, 137, 74, 124, 4, 149, 27, 169, 123, 121, + 138, 49, 43, 155, 225, 159, 206, 42, 87, 38, 137, 245, 196, 53, 75, 114, + 188, 209, 221, 104, 165, 254, 72, 170, 185, 66, 138, 221, 111, 81, 202, 155, + 90, 188, 247, 71, 129, 223, 210, 7, 36, 75, 60, 15, 164, 10, 117, 45, + 33, 207, 209, 158, 155, 2, 198, 152, 60, 14, 112, 72, 224, 44, 39, 133, + 50, 210, 188, 5, 255, 220, 69, 42, 203, 133, 112, 61, 133, 253, 87, 8, + 211, 171, 205, 201, 116, 38, 229, 132, 194, 201, 159, 93, 64, 91, 106, 245, + 250, 184, 82, 120, 162, 19, 49, 66, 207, 156, 0, 153, 39, 20, 12, 243, + 165, 197, 242, 112, 144, 103, 233, 83, 67, 119, 89, 36, 205, 121, 131, 145, + 212, 76, 13, 182, 38, 63, 188, 229, 129, 121, 91, 82, 99, 250, 78, 34, + 207, 151, 82, 114, 201, 160, 34, 245, 96, 201, 242, 245, 241, 245, 201, 62, + 121, 169, 23, 149, 201, 15, 100, 81, 134, 212, 33, 78, 16, 114, 74, 248, + 22, 22, 201, 200, 241, 158, 159, 103, 15, 143, 212, 150, 221, 215, 77, 74, + 8, 73, 77, 242, 217, 188, 248, 23, 254, 178, 125, 75, 206, 214, 249, 191, + 112, 83, 116, 58, 179, 171, 81, 242, 28, 129, 226, 130, 100, 34, 206, 6, + 69, 94, 232, 208, 124, 9, 216, 15, 54, 69, 191, 2, 197, 47, 178, 112, + 203, 64, 28, 225, 178, 24, 44, 11, 222, 230, 215, 24, 184, 112, 131, 203, + 144, 29, 174, 252, 23, 33, 60, 70, 156, 210, 55, 248, 251, 125, 17, 195, + 177, 89, 0, 45, 168, 249, 23, 133, 53, 54, 71, 62, 63, 151, 226, 206, + 69, 136, 149, 74, 17, 251, 133, 239, 200, 122, 49, 222, 144, 27, 216, 253, + 37, 224, 20, 104, 132, 85, 244, 107, 243, 223, 233, 56, 225, 59, 1, 188, + 129, 111, 153, 168, 31, 21, 33, 0, 95, 198, 245, 89, 172, 64, 20, 18, + 97, 164, 15, 143, 79, 47, 66, 135, 212, 113, 27, 120, 210, 32, 19, 141, + 4, 142, 98, 159, 32, 80, 144, 176, 133, 132, 22, 44, 90, 19, 207, 62, + 228, 237, 144, 125, 243, 35, 61, 199, 34, 189, 13, 180, 77, 22, 175, 29, + 3, 171, 93, 11, 47, 104, 108, 5, 101, 57, 64, 134, 207, 9, 41, 45, + 132, 122, 36, 96, 14, 134, 200, 244, 0, 105, 144, 210, 47, 58, 139, 73, + 209, 72, 88, 20, 101, 223, 91, 138, 74, 123, 159, 214, 36, 153, 128, 93, + 143, 102, 75, 112, 118, 181, 147, 147, 26, 211, 89, 48, 183, 128, 2, 211, + 153, 60, 27, 73, 179, 89, 66, 49, 51, 152, 146, 70, 187, 50, 197, 4, + 126, 131, 97, 140, 144, 29, 19, 57, 204, 147, 113, 86, 165, 67, 62, 158, + 7, 11, 253, 246, 163, 99, 32, 204, 253, 96, 1, 15, 210, 93, 160, 74, + 74, 232, 22, 63, 230, 122, 186, 227, 213, 230, 245, 248, 86, 142, 190, 147, + 138, 52, 188, 39, 233, 234, 92, 164, 193, 174, 129, 52, 82, 40, 136, 83, + 137, 116, 28, 178, 161, 219, 94, 24, 55, 94, 182, 31, 115, 37, 128, 152, + 83, 67, 94, 20, 239, 183, 241, 83, 106, 33, 117, 88, 130, 230, 39, 52, + 88, 66, 193, 79, 208, 89, 66, 81, 36, 160, 119, 39, 106, 4, 253, 65, + 65, 203, 248, 99, 88, 244, 227, 224, 159, 14, 254, 105, 224, 31, 125, 125, + 26, 160, 43, 82, 41, 18, 186, 109, 223, 200, 104, 114, 226, 239, 24, 196, + 62, 175, 237, 24, 248, 46, 118, 204, 207, 118, 136, 183, 66, 13, 10, 118, + 11, 63, 113, 99, 7, 23, 0, 224, 119, 89, 34, 201, 70, 40, 83, 88, + 180, 17, 78, 94, 195, 93, 189, 188, 185, 86, 249, 44, 119, 29, 65, 72, + 4, 108, 164, 145, 53, 125, 139, 231, 153, 16, 173, 30, 205, 232, 139, 49, + 194, 251, 71, 40, 255, 187, 242, 106, 47, 196, 30, 178, 67, 247, 97, 33, + 70, 146, 92, 5, 68, 39, 205, 194, 9, 179, 94, 153, 48, 75, 138, 111, + 68, 166, 202, 138, 160, 36, 102, 205, 244, 243, 217, 138, 196, 143, 139, 82, + 210, 76, 200, 97, 90, 28, 139, 3, 49, 71, 107, 222, 179, 237, 193, 218, + 25, 181, 130, 25, 93, 223, 113, 152, 77, 232, 115, 61, 200, 130, 224, 247, + 182, 70, 1, 180, 69, 240, 236, 185, 120, 124, 160, 153, 7, 24, 228, 38, + 160, 175, 100, 209, 152, 241, 235, 207, 23, 133, 45, 133, 28, 247, 15, 78, + 182, 38, 241, 37, 232, 178, 7, 43, 203, 49, 192, 229, 24, 188, 178, 28, + 131, 229, 229, 192, 58, 6, 14, 176, 17, 191, 178, 10, 44, 35, 36, 33, + 97, 79, 36, 26, 187, 251, 53, 29, 224, 115, 204, 142, 105, 133, 229, 117, + 235, 230, 126, 240, 26, 127, 195, 106, 7, 180, 41, 150, 103, 253, 64, 34, + 203, 51, 8, 46, 33, 213, 154, 92, 151, 125, 219, 105, 137, 230, 185, 248, + 58, 240, 83, 207, 49, 94, 31, 90, 131, 98, 32, 64, 226, 172, 148, 96, + 156, 141, 169, 216, 18, 180, 184, 191, 80, 167, 233, 185, 43, 53, 174, 173, + 48, 18, 33, 206, 166, 67, 10, 205, 42, 218, 139, 184, 138, 191, 141, 69, + 22, 127, 38, 220, 202, 130, 47, 217, 120, 101, 197, 199, 56, 91, 227, 87, + 86, 124, 28, 89, 238, 241, 207, 86, 25, 58, 104, 195, 234, 142, 29, 147, + 20, 71, 150, 22, 87, 140, 104, 221, 218, 142, 131, 125, 181, 190, 63, 145, + 133, 27, 243, 125, 245, 183, 150, 234, 111, 174, 203, 203, 171, 96, 69, 167, + 125, 178, 50, 237, 19, 156, 246, 201, 43, 211, 62, 89, 222, 104, 84, 199, + 196, 99, 188, 141, 170, 212, 253, 103, 77, 169, 163, 130, 104, 144, 112, 166, + 8, 60, 14, 220, 62, 222, 255, 213, 69, 135, 215, 168, 108, 188, 176, 140, + 76, 203, 1, 15, 73, 228, 44, 66, 120, 178, 193, 61, 39, 158, 1, 163, + 213, 110, 3, 18, 5, 242, 201, 111, 121, 237, 158, 157, 188, 182, 103, 95, + 234, 104, 192, 232, 175, 159, 164, 8, 44, 96, 150, 56, 74, 199, 209, 89, + 67, 15, 200, 102, 12, 217, 5, 20, 21, 188, 45, 213, 202, 28, 218, 1, + 250, 79, 198, 51, 106, 74, 10, 103, 159, 115, 21, 17, 72, 231, 193, 198, + 51, 168, 127, 235, 63, 127, 168, 169, 139, 213, 26, 225, 3, 82, 11, 103, + 181, 121, 252, 109, 38, 30, 170, 111, 129, 129, 70, 208, 17, 132, 203, 212, + 53, 207, 164, 159, 34, 110, 143, 77, 120, 176, 235, 95, 88, 4, 90, 3, + 127, 206, 165, 68, 34, 150, 68, 20, 54, 64, 98, 25, 104, 233, 224, 203, + 192, 177, 71, 102, 11, 197, 59, 226, 130, 39, 228, 101, 61, 50, 14, 145, + 40, 122, 31, 251, 233, 142, 248, 107, 157, 101, 17, 42, 128, 20, 91, 32, + 219, 30, 159, 3, 121, 190, 16, 216, 241, 191, 163, 205, 224, 162, 101, 69, + 250, 31, 144, 252, 80, 178, 22, 185, 88, 129, 201, 193, 52, 224, 255, 12, + 7, 163, 13, 38, 191, 37, 226, 72, 235, 125, 79, 189, 199, 244, 90, 2, + 189, 34, 254, 248, 33, 158, 141, 78, 2, 243, 103, 107, 104, 154, 223, 70, + 193, 33, 208, 201, 109, 52, 164, 4, 164, 140, 5, 25, 110, 8, 100, 254, + 126, 84, 202, 208, 10, 252, 20, 39, 253, 237, 249, 254, 231, 91, 248, 191, + 55, 187, 47, 76, 172, 127, 77, 53, 208, 93, 114, 239, 72, 33, 127, 91, + 117, 96, 50, 60, 46, 170, 198, 199, 33, 138, 90, 129, 44, 68, 105, 181, + 101, 91, 25, 150, 75, 74, 162, 0, 60, 69, 226, 77, 158, 242, 67, 210, + 106, 122, 11, 253, 122, 143, 140, 21, 177, 116, 88, 249, 141, 223, 65, 14, + 116, 194, 143, 228, 88, 107, 66, 10, 248, 186, 212, 28, 186, 64, 138, 250, + 158, 103, 1, 149, 234, 18, 139, 33, 108, 88, 35, 211, 177, 45, 102, 125, + 255, 231, 140, 78, 244, 208, 119, 97, 92, 66, 52, 45, 114, 202, 209, 94, + 4, 85, 239, 76, 37, 238, 105, 70, 74, 250, 163, 226, 35, 165, 25, 74, + 41, 171, 68, 156, 99, 112, 133, 75, 22, 73, 89, 143, 20, 192, 181, 132, + 22, 161, 94, 22, 155, 185, 97, 244, 108, 43, 208, 125, 132, 227, 0, 251, + 35, 166, 35, 233, 247, 57, 37, 116, 0, 155, 67, 135, 245, 117, 101, 146, + 86, 166, 8, 15, 229, 177, 209, 235, 5, 227, 185, 158, 14, 72, 80, 51, + 116, 141, 144, 159, 50, 160, 11, 97, 241, 19, 216, 106, 211, 112, 44, 34, + 5, 96, 220, 174, 217, 161, 169, 138, 182, 196, 111, 104, 81, 69, 54, 204, + 60, 8, 143, 73, 161, 182, 66, 62, 243, 93, 113, 123, 46, 180, 24, 89, + 235, 225, 187, 7, 110, 231, 35, 86, 132, 1, 221, 203, 167, 98, 4, 76, + 181, 136, 94, 169, 24, 149, 172, 227, 165, 0, 89, 60, 225, 248, 226, 178, + 172, 74, 122, 171, 197, 4, 30, 223, 72, 173, 218, 232, 3, 37, 70, 143, + 232, 160, 30, 149, 43, 152, 203, 141, 223, 165, 116, 223, 36, 153, 234, 84, + 74, 243, 106, 144, 83, 70, 95, 182, 124, 187, 244, 136, 191, 173, 227, 111, + 29, 47, 51, 148, 58, 170, 243, 25, 19, 254, 50, 65, 253, 19, 248, 171, + 79, 148, 250, 148, 158, 167, 244, 108, 76, 76, 15, 221, 178, 1, 120, 62, + 25, 211, 128, 218, 8, 43, 242, 42, 117, 152, 23, 187, 55, 196, 117, 71, + 211, 134, 215, 27, 249, 83, 109, 132, 119, 227, 30, 179, 26, 89, 1, 96, + 212, 115, 102, 61, 33, 240, 181, 200, 164, 197, 209, 155, 4, 252, 35, 211, + 0, 36, 36, 37, 17, 130, 112, 157, 208, 236, 71, 7, 80, 227, 38, 40, + 128, 17, 173, 22, 16, 203, 56, 89, 0, 233, 246, 192, 8, 223, 157, 32, + 7, 34, 134, 2, 224, 6, 85, 55, 12, 105, 206, 80, 10, 187, 36, 33, + 125, 61, 66, 34, 104, 249, 205, 158, 11, 181, 134, 238, 132, 117, 50, 19, + 161, 73, 88, 95, 13, 183, 63, 129, 122, 148, 66, 173, 233, 216, 174, 75, + 53, 21, 149, 82, 13, 253, 88, 244, 232, 173, 172, 108, 214, 152, 107, 15, + 55, 82, 59, 206, 106, 66, 73, 224, 188, 194, 207, 148, 189, 225, 204, 38, + 232, 202, 140, 237, 79, 219, 1, 168, 213, 81, 51, 155, 239, 203, 192, 168, + 109, 50, 205, 232, 147, 23, 111, 109, 220, 240, 36, 48, 221, 233, 208, 112, + 88, 2, 246, 160, 134, 237, 215, 176, 245, 26, 182, 13, 180, 90, 18, 57, + 244, 20, 215, 168, 94, 90, 227, 64, 179, 58, 204, 177, 146, 55, 147, 165, + 43, 56, 74, 91, 127, 191, 134, 241, 51, 80, 218, 75, 40, 210, 90, 134, + 139, 85, 227, 49, 118, 235, 128, 182, 99, 240, 180, 238, 174, 45, 196, 139, + 162, 123, 73, 131, 252, 32, 78, 80, 231, 31, 64, 149, 253, 76, 84, 246, + 134, 63, 75, 189, 186, 70, 20, 195, 202, 161, 17, 184, 34, 177, 107, 57, + 18, 79, 116, 28, 189, 209, 192, 107, 200, 168, 42, 125, 104, 93, 20, 154, + 39, 174, 123, 111, 122, 126, 173, 171, 90, 213, 76, 23, 59, 172, 91, 205, + 70, 142, 82, 20, 56, 145, 135, 142, 193, 183, 219, 45, 244, 145, 246, 227, + 157, 120, 184, 23, 15, 47, 109, 57, 133, 185, 55, 50, 6, 117, 31, 147, + 191, 184, 31, 143, 131, 109, 214, 19, 187, 18, 237, 15, 88, 31, 132, 202, + 78, 116, 175, 254, 229, 125, 24, 30, 89, 100, 15, 209, 214, 97, 39, 186, + 209, 161, 83, 4, 119, 163, 3, 173, 234, 100, 143, 128, 251, 17, 206, 20, + 115, 0, 13, 135, 118, 141, 239, 50, 79, 74, 220, 194, 118, 185, 131, 127, + 247, 9, 56, 68, 96, 72, 125, 212, 51, 96, 125, 100, 204, 97, 112, 16, + 35, 54, 81, 232, 120, 46, 236, 73, 35, 64, 121, 125, 195, 115, 204, 38, + 31, 93, 248, 44, 49, 240, 4, 113, 76, 99, 132, 34, 41, 62, 35, 166, + 56, 86, 32, 141, 174, 52, 176, 18, 210, 93, 38, 10, 32, 50, 198, 26, + 108, 145, 20, 145, 18, 152, 177, 220, 226, 25, 3, 152, 93, 46, 240, 134, + 10, 224, 65, 172, 67, 191, 25, 159, 238, 183, 28, 130, 179, 87, 182, 249, + 109, 237, 174, 118, 31, 190, 67, 198, 189, 189, 178, 113, 217, 126, 94, 5, + 147, 96, 75, 3, 8, 195, 180, 161, 70, 31, 58, 8, 213, 225, 200, 35, + 112, 68, 145, 171, 221, 31, 0, 250, 114, 141, 86, 24, 228, 224, 184, 134, + 65, 16, 51, 250, 34, 176, 93, 249, 117, 250, 32, 37, 206, 101, 159, 52, + 130, 45, 12, 196, 11, 51, 67, 161, 68, 177, 5, 217, 30, 36, 218, 38, + 232, 1, 29, 26, 33, 8, 19, 29, 13, 65, 23, 34, 48, 232, 13, 51, + 246, 252, 33, 241, 31, 126, 109, 251, 67, 18, 191, 67, 6, 129, 236, 47, + 190, 148, 139, 236, 149, 126, 217, 245, 204, 15, 32, 160, 134, 168, 219, 16, + 130, 65, 110, 254, 18, 110, 26, 9, 193, 94, 111, 101, 219, 116, 225, 76, + 39, 155, 11, 20, 88, 195, 144, 217, 146, 73, 20, 38, 204, 209, 113, 173, + 36, 26, 60, 208, 133, 158, 217, 28, 162, 29, 172, 63, 239, 97, 123, 80, + 138, 6, 137, 89, 1, 198, 205, 62, 206, 38, 66, 73, 31, 200, 10, 103, + 138, 126, 198, 60, 194, 182, 203, 112, 236, 162, 74, 139, 111, 50, 212, 213, + 57, 109, 45, 44, 71, 69, 111, 160, 254, 111, 116, 175, 254, 157, 64, 4, + 103, 17, 99, 88, 227, 84, 186, 250, 72, 192, 60, 222, 214, 179, 138, 236, + 182, 223, 206, 208, 66, 226, 13, 17, 34, 76, 177, 139, 158, 187, 177, 61, + 215, 6, 180, 0, 179, 193, 181, 48, 124, 37, 199, 166, 217, 239, 124, 155, + 125, 199, 221, 145, 237, 244, 103, 196, 198, 68, 239, 159, 18, 33, 144, 34, + 37, 73, 58, 8, 1, 195, 227, 113, 37, 192, 147, 29, 28, 67, 215, 96, + 4, 36, 171, 138, 14, 20, 50, 162, 198, 26, 216, 21, 40, 12, 140, 77, + 81, 176, 251, 108, 40, 225, 140, 77, 142, 204, 252, 30, 189, 110, 69, 225, + 134, 160, 172, 134, 176, 133, 251, 43, 186, 43, 132, 1, 82, 120, 75, 168, + 81, 43, 36, 223, 106, 40, 29, 236, 51, 6, 161, 233, 161, 229, 39, 33, + 145, 40, 182, 99, 87, 31, 24, 117, 70, 71, 16, 199, 4, 159, 225, 16, + 88, 82, 247, 210, 37, 109, 79, 226, 153, 26, 38, 186, 85, 102, 5, 151, + 143, 44, 44, 253, 10, 153, 139, 202, 190, 37, 53, 74, 224, 70, 58, 160, + 196, 150, 250, 19, 178, 244, 133, 130, 104, 235, 187, 108, 182, 163, 75, 113, + 117, 18, 87, 215, 245, 14, 85, 198, 124, 39, 40, 113, 85, 88, 210, 154, + 14, 250, 103, 103, 62, 37, 157, 15, 26, 254, 85, 240, 31, 51, 121, 36, + 230, 156, 236, 117, 33, 45, 167, 165, 210, 248, 251, 27, 90, 238, 174, 75, + 148, 106, 89, 174, 176, 71, 127, 80, 93, 10, 142, 150, 166, 1, 169, 210, + 7, 248, 54, 79, 154, 233, 124, 182, 152, 202, 185, 207, 142, 151, 132, 2, + 49, 78, 139, 103, 249, 53, 149, 233, 8, 175, 82, 188, 74, 178, 180, 68, + 155, 75, 197, 183, 196, 36, 117, 110, 50, 248, 21, 6, 149, 19, 201, 175, + 102, 250, 114, 53, 84, 193, 188, 75, 117, 5, 182, 193, 145, 138, 40, 20, + 31, 221, 82, 126, 11, 86, 152, 38, 239, 187, 28, 133, 144, 225, 192, 108, + 253, 12, 64, 40, 207, 191, 3, 31, 84, 181, 15, 30, 188, 51, 127, 2, + 58, 86, 186, 246, 58, 112, 0, 12, 160, 16, 164, 92, 212, 112, 243, 66, + 117, 167, 230, 206, 76, 63, 172, 78, 91, 187, 59, 174, 126, 123, 153, 111, + 28, 126, 109, 223, 223, 148, 158, 244, 155, 131, 225, 238, 227, 126, 231, 244, + 241, 116, 124, 122, 181, 61, 57, 222, 219, 239, 28, 207, 142, 181, 179, 189, + 207, 159, 140, 143, 19, 181, 127, 222, 43, 244, 246, 191, 220, 76, 250, 105, + 171, 172, 95, 109, 30, 127, 185, 250, 124, 249, 249, 243, 254, 193, 118, 97, + 243, 192, 123, 58, 248, 122, 176, 189, 191, 51, 57, 186, 223, 183, 63, 109, + 239, 142, 47, 63, 239, 127, 57, 250, 146, 111, 31, 158, 150, 42, 83, 89, + 190, 159, 232, 213, 89, 201, 172, 110, 31, 236, 108, 119, 183, 239, 63, 141, + 59, 149, 231, 237, 221, 211, 211, 242, 238, 94, 231, 254, 248, 248, 115, 245, + 211, 36, 191, 219, 223, 62, 122, 158, 61, 231, 134, 218, 244, 178, 146, 223, + 174, 170, 214, 208, 40, 181, 0, 165, 222, 244, 75, 94, 67, 235, 219, 103, + 59, 87, 87, 79, 219, 230, 192, 219, 181, 159, 171, 151, 207, 215, 182, 94, + 30, 20, 206, 190, 246, 79, 189, 105, 207, 212, 6, 51, 163, 57, 80, 143, + 143, 110, 190, 60, 25, 229, 203, 66, 94, 150, 199, 143, 211, 157, 106, 183, + 221, 205, 219, 213, 205, 237, 211, 227, 177, 170, 238, 85, 158, 62, 231, 251, + 123, 183, 151, 29, 189, 252, 117, 112, 210, 187, 113, 237, 109, 53, 127, 82, + 30, 126, 158, 13, 62, 87, 243, 213, 219, 175, 211, 242, 176, 220, 125, 26, + 246, 174, 7, 229, 222, 199, 167, 169, 222, 31, 171, 135, 221, 235, 195, 102, + 161, 208, 208, 204, 195, 163, 163, 187, 203, 244, 229, 117, 229, 242, 235, 232, + 248, 203, 165, 113, 221, 253, 212, 56, 46, 164, 143, 114, 249, 113, 187, 119, + 184, 7, 43, 39, 203, 79, 215, 105, 91, 47, 236, 235, 151, 94, 254, 116, + 179, 223, 219, 215, 173, 131, 251, 226, 173, 246, 249, 185, 117, 125, 98, 158, + 220, 86, 218, 189, 79, 233, 146, 153, 118, 110, 172, 66, 217, 104, 228, 79, + 239, 158, 207, 167, 251, 206, 245, 166, 177, 51, 168, 56, 183, 90, 103, 86, + 217, 127, 172, 30, 21, 204, 195, 241, 184, 112, 87, 26, 221, 95, 118, 114, + 159, 103, 222, 72, 127, 62, 29, 218, 19, 181, 224, 109, 143, 6, 219, 173, + 211, 219, 194, 199, 243, 252, 199, 244, 238, 109, 97, 123, 120, 40, 203, 189, + 106, 190, 56, 158, 122, 195, 209, 249, 193, 215, 234, 244, 228, 238, 160, 52, + 238, 28, 86, 14, 166, 213, 201, 167, 242, 163, 122, 85, 52, 111, 118, 70, + 205, 157, 19, 173, 208, 59, 25, 220, 62, 29, 21, 158, 76, 187, 176, 211, + 82, 175, 159, 61, 53, 239, 30, 183, 154, 205, 217, 249, 211, 151, 19, 239, + 100, 236, 230, 247, 135, 197, 195, 217, 120, 127, 58, 104, 53, 46, 62, 182, + 39, 147, 202, 85, 65, 223, 85, 171, 121, 83, 211, 111, 46, 58, 70, 218, + 28, 230, 205, 214, 77, 209, 145, 229, 225, 199, 189, 118, 243, 116, 180, 125, + 57, 52, 158, 210, 219, 143, 174, 190, 233, 93, 107, 197, 243, 106, 111, 167, + 80, 152, 13, 247, 11, 141, 162, 211, 186, 83, 251, 158, 51, 46, 204, 14, + 47, 14, 188, 235, 251, 70, 63, 253, 169, 154, 251, 60, 74, 247, 79, 213, + 75, 163, 108, 94, 28, 124, 234, 105, 240, 252, 121, 80, 189, 84, 239, 38, + 45, 245, 236, 227, 109, 229, 224, 246, 14, 86, 120, 239, 147, 182, 223, 206, + 247, 75, 211, 182, 233, 117, 188, 230, 116, 243, 217, 61, 59, 5, 64, 50, + 55, 205, 147, 187, 234, 241, 161, 123, 122, 163, 238, 142, 38, 37, 125, 218, + 235, 87, 139, 183, 135, 237, 187, 171, 206, 32, 239, 26, 7, 229, 113, 85, + 63, 157, 222, 156, 124, 242, 202, 71, 23, 155, 229, 163, 198, 85, 247, 224, + 110, 119, 162, 239, 237, 222, 238, 94, 223, 93, 143, 238, 159, 159, 220, 187, + 231, 98, 123, 144, 87, 63, 141, 183, 11, 106, 235, 211, 227, 237, 126, 185, + 221, 46, 95, 120, 221, 251, 234, 208, 158, 78, 156, 171, 147, 205, 237, 115, + 167, 240, 233, 108, 250, 121, 175, 218, 153, 201, 242, 78, 250, 186, 163, 237, + 30, 24, 234, 244, 252, 240, 72, 191, 110, 23, 47, 122, 142, 51, 170, 236, + 156, 221, 93, 62, 111, 26, 247, 166, 122, 254, 229, 249, 234, 44, 189, 57, + 251, 8, 83, 182, 187, 119, 56, 248, 56, 44, 123, 173, 179, 219, 89, 127, + 239, 226, 249, 178, 91, 214, 143, 46, 174, 186, 86, 229, 116, 239, 232, 246, + 115, 41, 125, 109, 86, 26, 123, 249, 94, 225, 104, 106, 222, 234, 197, 97, + 161, 213, 186, 159, 52, 7, 215, 154, 209, 170, 94, 76, 190, 120, 71, 219, + 183, 165, 203, 79, 178, 220, 222, 46, 222, 231, 74, 234, 151, 143, 183, 79, + 253, 209, 199, 65, 250, 232, 238, 115, 110, 91, 79, 239, 28, 105, 31, 43, + 167, 133, 155, 221, 219, 79, 23, 237, 157, 244, 225, 197, 151, 89, 163, 163, + 55, 239, 174, 39, 253, 179, 155, 51, 247, 240, 238, 232, 249, 170, 213, 191, + 105, 20, 70, 59, 150, 250, 120, 220, 28, 217, 131, 226, 113, 243, 126, 246, + 169, 253, 169, 241, 233, 170, 53, 80, 175, 91, 105, 173, 81, 213, 31, 221, + 105, 47, 183, 219, 115, 119, 53, 237, 168, 146, 59, 115, 62, 217, 198, 88, + 150, 7, 233, 193, 201, 103, 175, 50, 209, 158, 102, 87, 123, 198, 117, 185, + 55, 83, 207, 52, 187, 125, 243, 184, 215, 115, 135, 70, 165, 251, 49, 61, + 200, 125, 222, 49, 238, 111, 97, 131, 205, 76, 125, 127, 170, 89, 173, 219, + 201, 230, 78, 127, 187, 224, 122, 213, 158, 161, 126, 188, 185, 152, 185, 94, + 255, 220, 222, 185, 184, 187, 213, 110, 96, 14, 142, 26, 237, 139, 115, 103, + 124, 93, 62, 25, 126, 154, 125, 190, 210, 103, 215, 233, 86, 227, 80, 31, + 62, 235, 215, 205, 201, 77, 249, 74, 150, 71, 95, 142, 114, 221, 175, 119, + 247, 222, 222, 197, 89, 243, 169, 241, 197, 24, 127, 189, 127, 244, 238, 12, + 251, 172, 177, 111, 12, 158, 39, 179, 134, 94, 185, 204, 117, 70, 246, 238, + 77, 241, 115, 201, 188, 57, 113, 62, 95, 20, 12, 207, 222, 190, 51, 79, + 187, 189, 79, 149, 81, 57, 127, 103, 105, 183, 55, 233, 205, 251, 195, 47, + 237, 123, 35, 125, 127, 117, 49, 154, 154, 31, 15, 143, 111, 63, 237, 157, + 159, 183, 158, 191, 54, 111, 135, 31, 91, 78, 190, 251, 113, 115, 23, 218, + 25, 157, 193, 150, 113, 10, 123, 71, 7, 128, 66, 138, 147, 203, 203, 125, + 231, 108, 51, 127, 158, 190, 200, 183, 210, 221, 65, 69, 205, 125, 62, 106, + 91, 182, 118, 190, 191, 223, 26, 236, 53, 236, 253, 220, 215, 180, 115, 87, + 234, 13, 102, 121, 239, 116, 84, 201, 221, 205, 246, 63, 30, 57, 199, 179, + 219, 94, 225, 166, 95, 254, 122, 170, 93, 63, 141, 62, 238, 229, 46, 63, + 230, 225, 187, 149, 215, 219, 238, 222, 65, 163, 99, 85, 134, 67, 251, 169, + 233, 229, 14, 114, 143, 185, 241, 125, 123, 207, 253, 42, 203, 214, 221, 189, + 97, 157, 125, 190, 60, 191, 187, 243, 122, 51, 179, 100, 63, 246, 111, 218, + 213, 75, 179, 184, 83, 208, 159, 180, 51, 175, 154, 187, 80, 119, 70, 7, + 173, 235, 226, 164, 169, 222, 140, 157, 162, 118, 54, 59, 114, 14, 102, 221, + 73, 103, 112, 157, 27, 148, 110, 74, 165, 244, 108, 239, 241, 73, 219, 121, + 172, 152, 155, 151, 219, 23, 211, 35, 163, 125, 91, 222, 111, 93, 62, 218, + 207, 207, 215, 185, 182, 247, 113, 55, 247, 249, 98, 118, 126, 122, 81, 105, + 107, 179, 207, 157, 118, 69, 150, 211, 218, 232, 233, 38, 221, 27, 92, 109, + 78, 111, 219, 229, 252, 213, 180, 253, 105, 59, 119, 249, 37, 93, 56, 27, + 105, 179, 227, 235, 244, 87, 207, 46, 206, 180, 116, 233, 201, 186, 250, 82, + 206, 143, 158, 181, 243, 106, 255, 112, 191, 171, 118, 211, 142, 123, 120, 209, + 156, 29, 86, 122, 35, 103, 60, 53, 78, 53, 117, 183, 97, 106, 105, 207, + 42, 84, 204, 35, 91, 191, 43, 60, 221, 52, 74, 195, 231, 118, 185, 125, + 214, 201, 207, 188, 227, 70, 122, 208, 46, 31, 158, 63, 182, 123, 178, 92, + 200, 93, 118, 221, 221, 81, 171, 208, 207, 89, 103, 102, 163, 177, 247, 117, + 84, 41, 244, 75, 214, 133, 249, 201, 125, 44, 24, 102, 35, 93, 53, 30, + 175, 203, 187, 218, 211, 209, 69, 222, 41, 79, 219, 69, 203, 107, 95, 87, + 191, 142, 78, 52, 109, 54, 107, 158, 238, 21, 63, 142, 70, 195, 237, 246, + 197, 253, 229, 78, 97, 214, 218, 109, 91, 247, 37, 103, 112, 247, 184, 125, + 209, 190, 236, 26, 247, 71, 211, 163, 205, 207, 135, 7, 19, 167, 221, 184, + 56, 43, 60, 22, 250, 198, 35, 140, 244, 166, 112, 120, 166, 118, 91, 55, + 154, 214, 114, 26, 70, 186, 225, 28, 149, 170, 185, 201, 89, 225, 254, 250, + 233, 75, 123, 112, 167, 30, 238, 182, 7, 151, 158, 59, 186, 252, 122, 119, + 59, 182, 93, 107, 116, 210, 213, 26, 207, 55, 222, 229, 245, 248, 107, 225, + 243, 87, 189, 242, 56, 251, 116, 216, 250, 184, 109, 156, 183, 238, 71, 141, + 129, 122, 240, 244, 201, 121, 188, 200, 57, 13, 221, 80, 135, 135, 215, 159, + 171, 238, 176, 191, 87, 248, 84, 112, 46, 78, 212, 97, 87, 255, 98, 151, + 210, 178, 124, 57, 158, 246, 199, 207, 23, 197, 118, 62, 237, 94, 94, 119, + 219, 23, 23, 185, 157, 146, 87, 104, 12, 210, 94, 90, 181, 78, 182, 7, + 179, 143, 135, 94, 233, 56, 253, 37, 189, 167, 94, 93, 23, 63, 182, 221, + 86, 241, 122, 183, 177, 171, 182, 39, 143, 21, 103, 150, 214, 47, 58, 205, + 225, 118, 177, 105, 231, 134, 174, 245, 120, 216, 183, 103, 199, 250, 12, 48, + 235, 117, 161, 250, 216, 29, 142, 118, 238, 43, 251, 103, 135, 131, 150, 53, + 62, 46, 216, 95, 218, 157, 175, 157, 167, 42, 52, 58, 234, 118, 154, 207, + 39, 195, 251, 209, 102, 247, 41, 111, 220, 121, 229, 221, 89, 235, 179, 54, + 41, 230, 142, 247, 103, 154, 55, 42, 52, 11, 69, 117, 167, 153, 251, 216, + 30, 79, 71, 211, 61, 75, 43, 126, 62, 208, 103, 163, 254, 213, 94, 239, + 238, 178, 57, 177, 174, 174, 203, 30, 76, 98, 190, 116, 59, 117, 236, 175, + 154, 59, 62, 26, 62, 119, 175, 191, 156, 246, 156, 139, 243, 65, 191, 91, + 44, 127, 46, 21, 238, 181, 199, 65, 190, 127, 61, 152, 122, 71, 23, 246, + 185, 37, 203, 94, 222, 121, 44, 94, 14, 221, 66, 85, 183, 239, 206, 247, + 242, 133, 155, 143, 207, 135, 141, 116, 231, 218, 106, 61, 61, 219, 55, 143, + 238, 236, 163, 217, 239, 86, 170, 159, 103, 55, 95, 206, 187, 167, 163, 251, + 199, 199, 180, 97, 231, 180, 175, 95, 75, 230, 215, 189, 201, 208, 30, 57, + 39, 95, 243, 147, 225, 233, 77, 121, 250, 245, 188, 173, 229, 116, 107, 244, + 37, 175, 29, 55, 190, 220, 12, 135, 79, 221, 175, 229, 235, 195, 115, 237, + 172, 108, 126, 253, 168, 222, 141, 174, 46, 79, 171, 39, 125, 192, 189, 215, + 87, 95, 158, 123, 133, 139, 138, 235, 121, 197, 244, 230, 151, 153, 83, 120, + 44, 86, 238, 43, 147, 238, 172, 231, 62, 149, 198, 179, 194, 5, 160, 167, + 89, 243, 254, 64, 43, 236, 239, 221, 158, 91, 213, 115, 239, 106, 79, 115, + 43, 79, 23, 110, 165, 82, 29, 159, 61, 95, 52, 43, 213, 231, 235, 254, + 228, 98, 92, 186, 223, 117, 78, 141, 82, 123, 118, 115, 112, 93, 190, 200, + 29, 55, 239, 180, 147, 174, 81, 210, 171, 229, 242, 245, 36, 103, 93, 88, + 183, 23, 213, 170, 81, 132, 125, 90, 76, 183, 111, 225, 232, 184, 152, 222, + 89, 195, 163, 230, 193, 197, 227, 126, 169, 124, 123, 220, 200, 193, 233, 216, + 174, 22, 102, 23, 233, 66, 255, 230, 227, 176, 50, 155, 88, 133, 195, 254, + 151, 189, 220, 230, 197, 176, 101, 92, 24, 165, 210, 100, 115, 123, 178, 89, + 236, 157, 60, 21, 206, 175, 141, 234, 197, 149, 99, 21, 90, 227, 39, 56, + 209, 111, 140, 207, 133, 202, 147, 59, 220, 235, 86, 10, 71, 149, 137, 247, + 49, 61, 249, 82, 24, 21, 15, 218, 173, 207, 195, 211, 131, 244, 129, 44, + 95, 111, 118, 27, 187, 99, 77, 31, 13, 143, 171, 183, 77, 51, 237, 94, + 229, 156, 220, 193, 115, 117, 218, 168, 156, 239, 121, 86, 47, 125, 209, 178, + 210, 159, 172, 201, 115, 187, 248, 245, 182, 168, 158, 159, 228, 210, 119, 79, + 213, 2, 192, 93, 238, 233, 102, 242, 220, 60, 108, 187, 106, 241, 241, 164, + 123, 113, 92, 45, 87, 247, 172, 211, 92, 5, 56, 165, 243, 246, 77, 229, + 90, 159, 246, 251, 59, 165, 147, 235, 67, 245, 99, 185, 175, 1, 93, 214, + 62, 109, 24, 183, 238, 243, 169, 44, 55, 218, 78, 241, 98, 146, 238, 238, + 105, 151, 143, 218, 206, 105, 193, 222, 28, 118, 156, 220, 81, 251, 209, 106, + 62, 86, 135, 234, 222, 145, 214, 111, 109, 118, 62, 143, 26, 173, 211, 115, + 215, 154, 88, 214, 205, 32, 127, 52, 26, 91, 149, 155, 234, 230, 215, 195, + 163, 47, 23, 133, 137, 86, 217, 209, 167, 230, 193, 197, 117, 225, 252, 232, + 113, 220, 121, 110, 158, 55, 183, 175, 55, 219, 229, 156, 229, 158, 220, 28, + 221, 216, 205, 220, 197, 231, 161, 49, 217, 44, 95, 117, 0, 87, 61, 22, + 100, 185, 95, 40, 93, 171, 31, 71, 71, 195, 214, 110, 255, 232, 226, 168, + 52, 171, 126, 28, 221, 90, 251, 205, 222, 163, 118, 115, 4, 71, 88, 175, + 210, 41, 229, 14, 115, 131, 92, 251, 50, 55, 59, 201, 223, 246, 71, 185, + 227, 211, 205, 189, 75, 253, 62, 247, 249, 220, 152, 22, 38, 57, 115, 182, + 171, 245, 114, 199, 185, 27, 32, 45, 92, 55, 127, 211, 175, 150, 207, 102, + 195, 163, 225, 215, 102, 95, 111, 79, 110, 211, 57, 167, 189, 127, 251, 124, + 228, 78, 244, 217, 167, 3, 163, 255, 201, 149, 229, 220, 231, 199, 130, 170, + 30, 54, 139, 95, 134, 227, 110, 195, 202, 77, 140, 47, 7, 51, 103, 242, + 105, 179, 163, 26, 71, 249, 227, 220, 99, 121, 179, 111, 89, 135, 250, 169, + 221, 190, 188, 203, 237, 92, 52, 247, 115, 147, 214, 229, 100, 231, 162, 162, + 221, 27, 7, 249, 220, 233, 168, 250, 88, 222, 217, 47, 91, 31, 31, 75, + 253, 195, 244, 161, 214, 108, 63, 158, 14, 58, 179, 178, 121, 111, 217, 185, + 102, 238, 177, 91, 218, 182, 10, 185, 110, 227, 226, 54, 253, 177, 186, 87, + 205, 95, 220, 200, 114, 115, 162, 181, 188, 205, 107, 253, 235, 197, 240, 177, + 145, 126, 106, 59, 227, 74, 206, 190, 29, 154, 155, 233, 129, 165, 142, 141, + 234, 228, 162, 113, 125, 215, 222, 79, 207, 102, 133, 155, 61, 99, 179, 50, + 107, 245, 43, 112, 136, 20, 111, 172, 114, 105, 188, 153, 206, 21, 198, 79, + 134, 154, 191, 232, 150, 170, 131, 147, 243, 230, 121, 117, 182, 127, 235, 29, + 21, 110, 30, 43, 167, 206, 184, 90, 184, 240, 154, 19, 189, 217, 42, 149, + 78, 172, 82, 123, 87, 27, 122, 165, 226, 199, 6, 208, 189, 95, 11, 23, + 163, 219, 253, 79, 167, 222, 249, 221, 176, 114, 241, 25, 48, 236, 209, 236, + 81, 173, 90, 133, 188, 117, 211, 170, 92, 59, 110, 229, 234, 42, 119, 217, + 234, 125, 153, 61, 94, 95, 148, 211, 7, 221, 92, 179, 161, 183, 199, 205, + 225, 176, 211, 72, 219, 123, 143, 133, 179, 86, 119, 183, 225, 140, 190, 222, + 29, 93, 104, 163, 222, 215, 142, 117, 212, 62, 249, 170, 237, 126, 169, 182, + 129, 9, 248, 154, 127, 222, 107, 244, 47, 134, 102, 110, 251, 227, 112, 50, + 105, 78, 250, 206, 49, 140, 244, 110, 164, 141, 138, 211, 233, 185, 157, 158, + 85, 71, 163, 29, 231, 232, 49, 125, 109, 105, 131, 222, 160, 248, 169, 85, + 201, 141, 213, 210, 205, 184, 208, 29, 182, 238, 47, 6, 95, 74, 247, 110, + 201, 85, 75, 253, 203, 206, 176, 244, 164, 150, 59, 95, 31, 219, 197, 143, + 229, 238, 245, 94, 238, 99, 171, 114, 122, 87, 222, 44, 79, 213, 209, 215, + 222, 108, 52, 58, 62, 43, 23, 157, 74, 171, 219, 80, 71, 187, 6, 160, + 169, 70, 107, 239, 118, 228, 126, 57, 49, 46, 244, 209, 157, 44, 223, 141, + 71, 219, 189, 198, 164, 170, 58, 39, 55, 95, 157, 78, 127, 116, 126, 86, + 158, 110, 95, 223, 246, 115, 167, 238, 201, 233, 168, 181, 125, 126, 92, 154, + 181, 139, 143, 206, 249, 103, 111, 116, 220, 76, 23, 110, 14, 210, 95, 157, + 33, 176, 41, 167, 179, 116, 41, 61, 158, 116, 242, 102, 239, 113, 52, 117, + 154, 135, 135, 233, 155, 226, 177, 113, 169, 245, 198, 219, 234, 65, 171, 252, + 241, 108, 92, 58, 46, 30, 28, 185, 214, 167, 219, 235, 189, 167, 153, 121, + 154, 238, 22, 39, 133, 99, 21, 0, 105, 191, 253, 88, 109, 127, 237, 156, + 2, 38, 79, 127, 217, 191, 42, 221, 182, 102, 150, 89, 57, 108, 21, 46, + 110, 78, 158, 143, 42, 155, 155, 197, 29, 115, 228, 24, 95, 115, 250, 249, + 241, 166, 150, 187, 57, 179, 27, 7, 214, 225, 215, 3, 239, 48, 255, 152, + 206, 23, 187, 155, 173, 252, 246, 129, 189, 127, 96, 237, 194, 226, 86, 143, + 140, 227, 65, 251, 224, 112, 243, 203, 125, 169, 113, 86, 156, 229, 27, 147, + 114, 165, 186, 121, 86, 189, 205, 55, 135, 247, 221, 253, 89, 231, 172, 80, + 134, 45, 243, 180, 125, 114, 246, 100, 62, 223, 166, 79, 93, 75, 5, 192, + 255, 106, 222, 205, 46, 118, 206, 90, 215, 183, 195, 207, 173, 243, 102, 169, + 55, 237, 61, 26, 189, 74, 110, 162, 118, 103, 103, 233, 220, 233, 125, 222, + 59, 31, 62, 21, 199, 230, 227, 205, 108, 187, 248, 177, 250, 169, 178, 151, + 238, 141, 218, 234, 197, 110, 187, 220, 243, 78, 190, 228, 205, 139, 214, 232, + 233, 124, 243, 214, 234, 180, 115, 128, 218, 198, 57, 71, 59, 170, 86, 156, + 98, 123, 182, 87, 53, 110, 218, 133, 123, 160, 240, 75, 135, 95, 71, 197, + 182, 125, 113, 190, 111, 237, 33, 103, 184, 221, 33, 206, 112, 247, 116, 118, + 254, 121, 80, 180, 142, 206, 172, 202, 225, 205, 241, 93, 127, 167, 115, 117, + 216, 62, 190, 111, 118, 159, 174, 14, 245, 227, 251, 217, 238, 246, 231, 199, + 124, 231, 100, 114, 106, 247, 221, 210, 231, 157, 251, 207, 71, 219, 71, 211, + 231, 157, 246, 93, 77, 142, 181, 12, 33, 8, 170, 59, 61, 35, 139, 236, + 125, 88, 110, 81, 146, 184, 20, 160, 88, 201, 75, 13, 244, 240, 165, 161, + 131, 83, 105, 171, 150, 149, 138, 249, 223, 98, 220, 114, 250, 155, 207, 165, + 175, 227, 241, 91, 166, 222, 183, 173, 159, 113, 249, 34, 215, 191, 194, 231, + 139, 202, 5, 167, 31, 116, 233, 215, 121, 253, 117, 29, 252, 191, 43, 10, + 82, 184, 48, 200, 204, 105, 255, 223, 22, 0, 137, 169, 91, 11, 29, 142, + 222, 97, 193, 191, 56, 112, 224, 205, 110, 115, 72, 138, 157, 245, 158, 49, + 50, 122, 148, 70, 23, 43, 235, 224, 102, 143, 149, 135, 18, 163, 191, 10, + 47, 10, 26, 137, 69, 154, 172, 169, 21, 46, 20, 165, 118, 151, 156, 50, + 69, 58, 238, 131, 148, 24, 199, 42, 68, 145, 87, 2, 244, 78, 83, 33, + 248, 242, 141, 11, 208, 141, 224, 75, 208, 22, 30, 22, 215, 80, 242, 251, + 40, 81, 31, 209, 208, 11, 187, 200, 174, 156, 200, 133, 208, 171, 146, 39, + 180, 29, 64, 207, 107, 234, 31, 232, 80, 21, 117, 9, 106, 190, 63, 62, + 168, 42, 237, 187, 116, 216, 149, 106, 210, 241, 55, 57, 14, 57, 228, 239, + 239, 165, 75, 116, 219, 96, 123, 201, 106, 62, 149, 130, 183, 13, 114, 207, + 176, 155, 146, 210, 210, 174, 76, 181, 204, 181, 141, 238, 130, 204, 114, 72, + 91, 6, 141, 221, 50, 89, 230, 215, 205, 212, 23, 240, 12, 16, 170, 47, + 200, 211, 66, 78, 34, 159, 134, 122, 195, 77, 154, 253, 148, 66, 191, 167, + 104, 171, 197, 166, 121, 30, 47, 100, 116, 128, 110, 45, 105, 170, 138, 153, + 79, 109, 168, 149, 124, 110, 96, 46, 164, 118, 86, 116, 78, 244, 70, 142, + 83, 17, 153, 245, 233, 88, 142, 161, 23, 235, 121, 92, 37, 239, 193, 56, + 5, 24, 62, 56, 206, 252, 238, 160, 233, 43, 116, 72, 126, 51, 249, 125, + 96, 247, 166, 48, 175, 201, 183, 232, 253, 10, 141, 14, 166, 41, 248, 81, + 241, 7, 157, 246, 189, 151, 142, 101, 233, 137, 185, 145, 11, 172, 211, 217, + 2, 183, 209, 112, 61, 12, 166, 45, 84, 93, 242, 166, 226, 122, 147, 250, + 163, 228, 63, 212, 234, 246, 64, 111, 194, 7, 244, 194, 201, 238, 213, 240, + 206, 112, 219, 29, 244, 12, 203, 28, 246, 37, 29, 141, 243, 188, 97, 63, + 99, 153, 29, 7, 222, 241, 30, 241, 186, 107, 244, 166, 24, 31, 207, 108, + 233, 77, 67, 55, 34, 222, 176, 124, 88, 223, 209, 29, 203, 237, 25, 83, + 137, 250, 242, 151, 129, 157, 119, 188, 86, 202, 255, 134, 175, 108, 238, 11, + 121, 124, 230, 93, 175, 229, 179, 5, 190, 1, 104, 0, 235, 224, 159, 250, + 32, 160, 159, 79, 206, 203, 176, 15, 109, 137, 87, 174, 57, 9, 224, 95, + 200, 47, 152, 39, 45, 116, 157, 149, 45, 248, 249, 139, 31, 152, 43, 15, + 145, 179, 180, 206, 177, 150, 216, 41, 145, 73, 225, 91, 133, 143, 16, 221, + 100, 249, 251, 131, 134, 195, 199, 7, 77, 252, 210, 118, 65, 133, 204, 185, + 108, 186, 245, 129, 225, 96, 196, 62, 116, 46, 178, 248, 29, 50, 253, 161, + 109, 196, 181, 119, 168, 75, 31, 63, 35, 36, 168, 113, 127, 199, 20, 192, + 41, 94, 170, 1, 68, 196, 218, 106, 224, 14, 10, 93, 164, 151, 37, 216, + 78, 193, 255, 58, 254, 103, 244, 12, 213, 214, 216, 91, 22, 16, 40, 252, + 193, 72, 152, 90, 1, 255, 104, 84, 170, 195, 63, 43, 106, 182, 76, 217, + 11, 244, 14, 89, 85, 244, 63, 173, 85, 20, 81, 168, 136, 249, 59, 5, + 81, 119, 182, 88, 164, 252, 69, 94, 125, 5, 179, 231, 139, 216, 8, 252, + 197, 119, 202, 95, 12, 87, 191, 210, 117, 173, 20, 237, 122, 168, 243, 80, + 79, 49, 210, 255, 124, 161, 68, 35, 160, 17, 83, 91, 172, 44, 31, 1, + 182, 91, 197, 100, 45, 58, 12, 234, 204, 74, 33, 127, 32, 89, 21, 191, + 229, 55, 35, 99, 169, 210, 88, 242, 212, 30, 254, 64, 74, 33, 52, 26, + 74, 213, 200, 59, 247, 119, 242, 44, 51, 153, 70, 102, 28, 239, 192, 45, + 230, 152, 218, 250, 32, 199, 207, 100, 52, 89, 183, 148, 152, 3, 105, 195, + 36, 156, 114, 162, 136, 3, 240, 248, 123, 50, 217, 86, 55, 38, 211, 84, + 186, 214, 81, 83, 239, 98, 144, 86, 193, 52, 141, 167, 105, 44, 77, 45, + 97, 98, 129, 39, 22, 82, 239, 224, 173, 200, 223, 138, 80, 223, 241, 55, + 11, 189, 0, 77, 166, 49, 0, 104, 97, 198, 55, 105, 206, 224, 184, 5, + 20, 165, 161, 191, 62, 116, 199, 41, 95, 214, 16, 203, 101, 226, 5, 196, + 111, 204, 251, 80, 6, 127, 241, 173, 192, 223, 10, 248, 38, 47, 164, 254, + 134, 192, 227, 26, 236, 77, 160, 224, 182, 20, 248, 15, 71, 73, 184, 183, + 207, 2, 144, 144, 57, 10, 195, 146, 166, 3, 104, 50, 70, 90, 12, 205, + 158, 61, 108, 73, 153, 120, 17, 189, 227, 132, 200, 148, 144, 107, 115, 31, + 27, 10, 82, 47, 178, 227, 150, 142, 243, 142, 161, 59, 17, 44, 105, 53, + 234, 158, 97, 144, 23, 64, 196, 141, 204, 19, 32, 75, 130, 217, 202, 179, + 84, 187, 221, 118, 141, 149, 84, 211, 178, 12, 167, 142, 214, 104, 67, 151, + 82, 215, 225, 68, 106, 240, 31, 32, 26, 21, 114, 215, 72, 61, 168, 177, + 215, 112, 87, 107, 26, 67, 143, 161, 126, 6, 106, 9, 161, 110, 214, 138, + 235, 80, 37, 245, 81, 160, 74, 62, 67, 235, 81, 37, 215, 30, 71, 98, + 65, 91, 68, 92, 15, 34, 190, 212, 242, 62, 138, 44, 208, 132, 248, 200, + 51, 130, 58, 41, 61, 134, 104, 179, 24, 124, 40, 209, 135, 151, 144, 232, + 11, 179, 8, 116, 1, 141, 85, 97, 63, 18, 155, 18, 104, 93, 36, 176, + 9, 65, 39, 133, 76, 147, 8, 102, 66, 98, 51, 1, 45, 254, 18, 138, + 229, 64, 23, 227, 39, 179, 52, 151, 99, 164, 98, 32, 137, 213, 0, 88, + 143, 107, 239, 121, 98, 120, 77, 240, 67, 225, 55, 241, 37, 188, 52, 232, + 100, 99, 35, 94, 252, 237, 125, 200, 85, 159, 150, 47, 162, 175, 190, 129, + 231, 166, 248, 214, 55, 185, 79, 250, 15, 228, 76, 11, 63, 40, 49, 244, + 71, 101, 110, 104, 27, 3, 51, 231, 167, 190, 39, 132, 32, 169, 64, 246, + 68, 154, 79, 71, 94, 55, 146, 184, 114, 250, 134, 232, 54, 208, 45, 24, + 19, 192, 127, 135, 210, 225, 46, 166, 126, 67, 63, 117, 80, 253, 55, 147, + 249, 5, 99, 179, 52, 206, 105, 27, 73, 21, 10, 58, 27, 77, 219, 77, + 234, 169, 212, 186, 92, 221, 32, 23, 192, 11, 207, 133, 30, 189, 252, 62, + 231, 52, 28, 41, 32, 57, 153, 104, 116, 162, 229, 75, 252, 34, 54, 43, + 193, 97, 172, 224, 63, 12, 178, 184, 49, 222, 136, 151, 126, 91, 176, 88, + 21, 230, 202, 94, 39, 192, 88, 71, 183, 119, 225, 131, 247, 19, 158, 142, + 229, 249, 87, 56, 58, 86, 181, 216, 83, 162, 51, 191, 206, 205, 173, 118, + 237, 151, 160, 21, 161, 136, 187, 42, 150, 209, 109, 227, 132, 193, 202, 248, + 189, 164, 150, 105, 45, 188, 212, 31, 5, 249, 181, 108, 5, 90, 88, 15, + 253, 182, 149, 232, 81, 219, 160, 23, 141, 94, 10, 236, 5, 31, 139, 240, + 40, 199, 144, 106, 22, 174, 203, 7, 58, 198, 18, 33, 229, 175, 0, 85, + 19, 162, 142, 181, 123, 182, 221, 242, 215, 85, 184, 106, 203, 75, 53, 224, + 15, 243, 49, 97, 225, 43, 22, 149, 13, 126, 221, 170, 138, 93, 184, 132, + 193, 81, 251, 18, 53, 143, 183, 106, 133, 87, 88, 49, 94, 24, 200, 160, + 215, 150, 188, 99, 216, 56, 136, 233, 47, 227, 100, 209, 120, 173, 244, 10, + 79, 198, 15, 192, 242, 210, 56, 48, 82, 199, 188, 144, 22, 1, 52, 98, + 203, 163, 252, 25, 22, 46, 249, 72, 24, 61, 57, 113, 19, 191, 53, 238, + 223, 5, 88, 137, 154, 195, 19, 160, 248, 184, 84, 140, 36, 194, 183, 1, + 177, 218, 249, 69, 222, 237, 253, 28, 193, 104, 129, 188, 215, 60, 9, 188, + 18, 176, 100, 8, 86, 192, 37, 45, 136, 47, 135, 163, 93, 75, 115, 174, + 188, 32, 177, 168, 97, 121, 228, 212, 129, 78, 53, 29, 205, 111, 128, 36, + 12, 139, 88, 26, 134, 153, 69, 88, 203, 102, 41, 210, 85, 136, 56, 32, + 255, 241, 105, 206, 197, 49, 187, 109, 72, 55, 251, 25, 96, 215, 22, 24, + 214, 101, 142, 94, 224, 151, 211, 201, 225, 59, 131, 76, 49, 19, 89, 164, + 193, 177, 146, 63, 168, 91, 33, 47, 221, 33, 120, 140, 107, 25, 49, 113, + 235, 128, 210, 181, 236, 113, 187, 135, 154, 174, 239, 36, 1, 149, 72, 31, + 0, 108, 248, 60, 49, 16, 8, 229, 117, 48, 25, 148, 253, 139, 104, 200, + 13, 3, 36, 131, 191, 72, 187, 0, 149, 175, 192, 97, 208, 60, 66, 98, + 124, 43, 12, 133, 225, 97, 253, 9, 56, 100, 199, 185, 6, 227, 125, 9, + 183, 173, 31, 115, 0, 134, 65, 231, 255, 204, 9, 45, 1, 252, 169, 90, + 254, 189, 86, 204, 167, 164, 13, 128, 0, 1, 121, 33, 48, 10, 66, 242, + 52, 3, 209, 66, 12, 224, 178, 184, 65, 177, 156, 180, 88, 27, 25, 241, + 216, 32, 143, 50, 6, 56, 217, 84, 146, 53, 36, 167, 105, 53, 245, 91, + 23, 142, 43, 68, 150, 201, 1, 30, 181, 131, 124, 42, 87, 128, 28, 125, + 74, 201, 3, 200, 15, 84, 56, 214, 224, 11, 240, 44, 229, 242, 6, 144, + 247, 232, 215, 2, 8, 17, 212, 223, 133, 162, 232, 57, 183, 184, 49, 69, + 18, 251, 45, 0, 231, 19, 59, 48, 7, 249, 149, 4, 168, 202, 91, 78, + 236, 251, 9, 244, 138, 29, 128, 60, 114, 140, 192, 149, 214, 12, 71, 140, + 0, 31, 87, 25, 252, 199, 213, 156, 182, 16, 142, 56, 96, 248, 211, 217, + 196, 135, 121, 248, 140, 222, 98, 2, 144, 95, 57, 86, 131, 37, 90, 11, + 240, 222, 42, 17, 221, 112, 116, 11, 160, 196, 229, 116, 180, 215, 53, 155, + 79, 60, 214, 199, 90, 184, 247, 254, 58, 89, 236, 174, 226, 96, 209, 186, + 143, 131, 253, 246, 145, 113, 175, 172, 219, 2, 213, 240, 96, 8, 15, 199, + 183, 210, 90, 4, 15, 243, 113, 190, 34, 53, 88, 4, 196, 47, 76, 126, + 132, 250, 125, 17, 250, 151, 71, 30, 0, 190, 24, 5, 13, 193, 31, 193, + 175, 202, 206, 176, 226, 66, 139, 185, 222, 70, 255, 124, 24, 147, 77, 106, + 194, 95, 11, 254, 109, 20, 184, 196, 41, 70, 127, 165, 199, 66, 11, 3, + 97, 40, 193, 145, 140, 190, 48, 215, 98, 63, 234, 240, 50, 24, 132, 44, + 20, 152, 25, 207, 146, 137, 2, 183, 151, 122, 39, 49, 83, 1, 102, 34, + 128, 178, 40, 101, 134, 127, 154, 204, 84, 128, 25, 16, 144, 225, 64, 36, + 125, 70, 233, 51, 53, 148, 212, 164, 164, 166, 26, 122, 195, 6, 185, 151, + 251, 245, 70, 106, 188, 19, 141, 33, 154, 240, 114, 99, 181, 164, 61, 240, + 178, 220, 131, 79, 14, 143, 160, 28, 208, 46, 48, 205, 57, 223, 129, 141, + 221, 78, 45, 43, 27, 135, 244, 147, 163, 85, 54, 161, 12, 89, 128, 5, + 90, 236, 141, 41, 83, 169, 70, 251, 37, 180, 84, 253, 137, 229, 91, 50, + 152, 198, 176, 5, 113, 88, 169, 149, 15, 67, 149, 26, 189, 161, 67, 150, + 78, 133, 144, 217, 211, 218, 34, 28, 198, 93, 81, 86, 43, 253, 166, 108, + 150, 112, 153, 1, 199, 51, 17, 250, 55, 38, 80, 15, 219, 79, 5, 182, + 220, 33, 199, 249, 110, 216, 26, 133, 217, 86, 193, 118, 114, 125, 151, 2, + 180, 47, 126, 95, 96, 232, 68, 116, 75, 198, 28, 156, 178, 124, 220, 133, + 185, 194, 131, 194, 72, 35, 41, 195, 0, 119, 190, 128, 137, 65, 243, 207, + 64, 134, 201, 140, 182, 0, 169, 160, 130, 175, 90, 155, 75, 191, 75, 63, + 48, 138, 19, 179, 243, 105, 232, 61, 160, 32, 45, 246, 232, 192, 127, 58, + 62, 217, 58, 25, 8, 53, 108, 207, 227, 217, 134, 232, 191, 179, 77, 70, + 142, 77, 168, 7, 232, 81, 221, 162, 103, 210, 85, 39, 157, 115, 104, 173, + 221, 38, 205, 117, 216, 95, 248, 139, 94, 40, 219, 195, 30, 170, 163, 235, + 35, 179, 69, 106, 233, 29, 252, 59, 164, 239, 134, 206, 76, 38, 0, 34, + 6, 93, 157, 244, 217, 145, 60, 237, 50, 53, 118, 52, 164, 130, 7, 103, + 104, 82, 87, 208, 168, 244, 105, 234, 63, 212, 251, 122, 119, 100, 90, 193, + 251, 216, 236, 53, 168, 68, 199, 49, 140, 38, 86, 219, 25, 246, 251, 88, + 160, 107, 15, 201, 201, 156, 105, 185, 102, 11, 31, 122, 104, 115, 215, 68, + 204, 8, 207, 134, 222, 166, 31, 75, 103, 63, 168, 130, 223, 67, 81, 251, + 15, 9, 225, 204, 65, 149, 112, 120, 68, 226, 214, 116, 117, 246, 248, 100, + 96, 189, 64, 148, 59, 54, 245, 109, 96, 88, 77, 179, 199, 158, 6, 3, + 132, 94, 120, 178, 29, 84, 150, 247, 242, 161, 103, 53, 244, 172, 133, 158, + 11, 161, 231, 98, 232, 185, 20, 122, 46, 135, 158, 55, 67, 207, 149, 208, + 115, 21, 158, 29, 187, 213, 154, 210, 175, 237, 122, 52, 33, 142, 77, 195, + 103, 198, 92, 248, 48, 166, 149, 131, 61, 72, 25, 61, 179, 67, 217, 188, + 33, 154, 173, 192, 195, 88, 167, 33, 143, 117, 92, 112, 246, 60, 51, 122, + 45, 29, 141, 39, 16, 132, 40, 228, 8, 123, 60, 83, 234, 44, 152, 247, + 92, 66, 4, 253, 67, 18, 118, 88, 152, 151, 139, 12, 106, 210, 234, 199, + 16, 126, 89, 57, 194, 208, 207, 39, 135, 217, 203, 195, 29, 174, 189, 207, + 112, 203, 154, 131, 108, 157, 97, 149, 59, 136, 198, 93, 219, 246, 163, 125, + 96, 159, 125, 139, 11, 238, 90, 141, 225, 21, 75, 24, 24, 72, 99, 128, + 222, 46, 170, 237, 143, 184, 241, 166, 232, 13, 185, 138, 89, 79, 241, 177, + 12, 236, 124, 19, 219, 237, 31, 217, 194, 245, 186, 168, 47, 54, 228, 123, + 86, 17, 59, 86, 225, 251, 85, 161, 221, 170, 240, 189, 170, 248, 59, 85, + 241, 247, 41, 60, 57, 240, 207, 83, 104, 103, 42, 180, 79, 21, 177, 59, + 21, 218, 155, 10, 236, 76, 5, 247, 165, 66, 187, 82, 17, 123, 82, 161, + 29, 169, 176, 253, 168, 176, 221, 168, 176, 45, 167, 68, 118, 162, 18, 217, + 135, 10, 219, 133, 10, 237, 65, 133, 118, 160, 194, 246, 159, 226, 239, 62, + 5, 247, 158, 130, 59, 15, 255, 216, 10, 238, 58, 69, 236, 57, 69, 236, + 56, 133, 237, 55, 133, 239, 54, 133, 239, 53, 133, 239, 52, 197, 223, 103, + 254, 147, 234, 63, 105, 254, 83, 193, 127, 42, 250, 79, 37, 255, 169, 236, + 63, 109, 250, 79, 21, 255, 169, 170, 208, 158, 82, 248, 142, 82, 112, 63, + 41, 108, 55, 41, 184, 151, 20, 218, 73, 10, 237, 35, 133, 237, 34, 5, + 247, 144, 226, 239, 32, 133, 246, 79, 44, 88, 75, 242, 55, 220, 134, 245, + 127, 11, 220, 101, 232, 190, 35, 195, 130, 142, 8, 79, 18, 60, 4, 73, + 70, 139, 222, 159, 160, 231, 137, 80, 46, 149, 231, 98, 222, 38, 222, 74, + 55, 68, 228, 28, 5, 27, 37, 203, 221, 75, 0, 9, 118, 83, 131, 218, + 164, 35, 116, 59, 193, 174, 169, 169, 11, 218, 175, 87, 126, 142, 182, 56, + 55, 171, 117, 171, 172, 110, 21, 234, 230, 234, 238, 148, 14, 169, 10, 166, + 160, 11, 57, 230, 174, 56, 146, 76, 4, 17, 243, 188, 193, 230, 198, 165, + 24, 185, 124, 162, 22, 177, 83, 116, 80, 7, 95, 181, 17, 28, 51, 117, + 119, 80, 103, 222, 68, 227, 60, 243, 2, 253, 117, 160, 239, 141, 224, 58, + 243, 44, 134, 239, 81, 255, 0, 110, 29, 168, 191, 22, 123, 101, 46, 60, + 190, 37, 226, 144, 33, 129, 113, 187, 127, 79, 72, 228, 189, 131, 81, 128, + 67, 244, 63, 134, 247, 146, 75, 165, 248, 108, 189, 225, 147, 132, 136, 75, + 150, 126, 252, 144, 228, 55, 124, 162, 8, 149, 137, 78, 156, 74, 220, 3, + 147, 232, 50, 239, 10, 54, 157, 32, 159, 106, 137, 55, 194, 51, 8, 127, + 175, 213, 68, 159, 88, 119, 168, 64, 16, 153, 205, 119, 243, 192, 190, 82, + 123, 191, 65, 71, 129, 231, 231, 206, 63, 95, 239, 154, 196, 39, 42, 28, + 236, 77, 204, 80, 13, 115, 176, 22, 24, 237, 75, 89, 97, 161, 84, 88, + 210, 60, 46, 40, 54, 170, 174, 78, 81, 200, 77, 195, 89, 108, 105, 196, + 225, 21, 88, 196, 66, 78, 169, 50, 3, 221, 235, 214, 155, 58, 80, 227, + 11, 182, 140, 117, 154, 129, 236, 192, 234, 196, 134, 78, 175, 182, 228, 167, + 50, 103, 246, 59, 185, 149, 140, 228, 134, 133, 220, 216, 126, 75, 204, 115, + 190, 99, 170, 69, 226, 123, 42, 228, 166, 202, 247, 139, 49, 143, 172, 230, + 130, 156, 233, 197, 161, 49, 12, 177, 232, 103, 151, 56, 132, 122, 134, 235, + 209, 169, 163, 181, 164, 121, 191, 134, 215, 214, 241, 27, 37, 126, 148, 122, + 223, 223, 202, 255, 222, 127, 87, 204, 231, 89, 252, 102, 182, 32, 43, 245, + 32, 176, 115, 55, 41, 55, 91, 194, 255, 203, 17, 122, 232, 195, 168, 194, + 144, 241, 70, 132, 58, 99, 138, 34, 55, 53, 223, 75, 204, 209, 22, 101, + 154, 66, 166, 163, 165, 76, 91, 161, 60, 228, 224, 52, 7, 105, 221, 28, + 230, 19, 5, 88, 0, 101, 209, 6, 174, 14, 62, 64, 207, 133, 199, 193, + 112, 212, 90, 94, 59, 87, 214, 136, 179, 249, 18, 14, 61, 184, 79, 110, + 126, 238, 209, 9, 44, 92, 165, 38, 85, 158, 32, 207, 199, 139, 9, 112, + 187, 147, 121, 11, 254, 185, 11, 25, 227, 24, 178, 8, 210, 89, 56, 234, + 135, 18, 7, 36, 65, 134, 226, 252, 195, 177, 72, 124, 230, 203, 252, 197, + 149, 129, 129, 147, 172, 22, 240, 19, 29, 195, 130, 227, 203, 35, 7, 198, + 136, 104, 162, 30, 31, 253, 16, 94, 81, 103, 143, 186, 40, 205, 218, 129, + 143, 67, 151, 25, 3, 162, 233, 220, 171, 53, 51, 27, 60, 160, 147, 95, + 50, 29, 5, 36, 100, 162, 127, 103, 70, 72, 99, 0, 182, 208, 59, 11, + 196, 182, 52, 24, 170, 113, 217, 188, 146, 76, 71, 151, 93, 51, 67, 13, + 24, 220, 140, 85, 24, 230, 138, 214, 248, 207, 128, 83, 201, 114, 129, 73, + 114, 152, 33, 38, 14, 204, 47, 201, 12, 187, 49, 151, 107, 115, 14, 36, + 228, 243, 114, 213, 152, 27, 201, 166, 73, 211, 24, 120, 220, 245, 6, 122, + 10, 195, 248, 174, 162, 55, 150, 231, 187, 214, 16, 238, 48, 210, 52, 81, + 161, 176, 120, 9, 49, 205, 81, 179, 72, 223, 58, 86, 116, 110, 157, 115, + 78, 164, 47, 133, 103, 5, 214, 78, 96, 255, 140, 163, 208, 93, 102, 171, + 185, 236, 3, 36, 58, 97, 89, 233, 92, 152, 72, 42, 248, 25, 10, 246, + 135, 46, 113, 143, 58, 70, 135, 179, 166, 209, 78, 16, 97, 199, 154, 13, + 27, 172, 70, 154, 103, 51, 105, 232, 68, 12, 134, 23, 1, 71, 32, 186, + 133, 221, 97, 89, 124, 170, 116, 169, 103, 126, 253, 95, 220, 208, 28, 178, + 24, 110, 113, 145, 43, 129, 245, 52, 28, 97, 72, 77, 19, 28, 120, 68, + 195, 0, 192, 102, 224, 29, 228, 101, 241, 121, 20, 112, 151, 238, 35, 217, + 102, 230, 212, 29, 177, 89, 12, 224, 1, 191, 170, 10, 252, 209, 120, 96, + 185, 56, 61, 227, 95, 33, 94, 10, 35, 68, 216, 30, 34, 180, 155, 31, + 224, 80, 9, 69, 44, 92, 43, 145, 154, 90, 208, 119, 79, 88, 174, 191, + 34, 123, 98, 204, 68, 41, 124, 11, 91, 163, 52, 97, 168, 42, 66, 231, + 21, 34, 99, 11, 119, 16, 10, 199, 162, 29, 94, 22, 50, 249, 50, 166, + 184, 26, 18, 50, 21, 224, 121, 89, 176, 180, 218, 119, 10, 224, 75, 177, + 219, 212, 137, 8, 223, 182, 7, 39, 132, 86, 155, 163, 62, 198, 6, 70, + 234, 66, 49, 144, 134, 113, 52, 73, 32, 132, 215, 250, 241, 130, 34, 199, + 110, 241, 54, 72, 202, 0, 226, 214, 222, 199, 238, 224, 101, 138, 215, 138, + 248, 130, 87, 143, 76, 249, 233, 78, 185, 197, 96, 64, 109, 41, 121, 251, + 7, 198, 46, 191, 251, 67, 251, 80, 147, 227, 212, 130, 140, 198, 206, 27, + 168, 56, 133, 119, 68, 205, 180, 150, 207, 111, 36, 39, 185, 113, 6, 176, + 121, 106, 35, 57, 205, 117, 233, 41, 149, 82, 42, 37, 248, 162, 255, 150, + 132, 30, 109, 64, 70, 21, 210, 80, 229, 64, 136, 229, 139, 138, 134, 145, + 204, 225, 95, 153, 255, 110, 242, 127, 133, 210, 111, 74, 17, 101, 25, 217, + 170, 66, 182, 213, 74, 62, 6, 48, 50, 116, 11, 45, 18, 123, 110, 46, + 20, 146, 126, 226, 165, 3, 74, 185, 88, 80, 160, 76, 37, 207, 132, 98, + 89, 73, 213, 42, 80, 33, 21, 141, 161, 28, 12, 99, 189, 23, 120, 229, + 152, 185, 68, 186, 9, 168, 147, 192, 142, 31, 73, 13, 84, 5, 113, 209, + 216, 36, 251, 194, 176, 97, 63, 36, 32, 25, 90, 124, 247, 192, 210, 227, + 7, 226, 165, 252, 68, 41, 190, 65, 28, 20, 47, 232, 39, 191, 19, 123, + 142, 144, 244, 55, 165, 30, 126, 37, 156, 141, 194, 174, 13, 105, 197, 249, + 11, 5, 41, 32, 215, 4, 166, 240, 138, 20, 242, 164, 17, 117, 250, 147, + 141, 28, 95, 254, 201, 132, 189, 222, 72, 136, 160, 222, 88, 33, 197, 158, + 4, 140, 231, 199, 197, 124, 177, 34, 159, 153, 29, 246, 3, 225, 213, 208, + 50, 209, 230, 187, 142, 154, 160, 142, 217, 32, 23, 56, 144, 215, 106, 48, + 221, 69, 119, 171, 166, 42, 254, 86, 92, 145, 14, 227, 117, 61, 140, 130, + 87, 2, 100, 188, 95, 13, 242, 210, 188, 88, 166, 197, 37, 120, 220, 192, + 94, 253, 254, 135, 248, 20, 222, 113, 107, 123, 82, 46, 42, 5, 22, 168, + 137, 130, 46, 251, 31, 0, 122, 184, 95, 153, 66, 139, 196, 97, 106, 62, + 246, 194, 80, 162, 33, 24, 57, 243, 161, 70, 66, 48, 6, 113, 25, 105, + 187, 6, 187, 149, 143, 47, 174, 190, 48, 196, 184, 182, 102, 112, 113, 13, + 118, 176, 21, 8, 128, 209, 135, 60, 52, 193, 2, 249, 146, 210, 36, 41, + 190, 198, 45, 17, 166, 54, 184, 221, 192, 248, 139, 66, 180, 201, 84, 99, + 73, 211, 54, 110, 109, 248, 65, 109, 85, 72, 193, 61, 160, 6, 20, 152, + 22, 186, 41, 225, 17, 91, 48, 122, 57, 101, 65, 100, 193, 92, 60, 127, + 227, 67, 128, 102, 246, 164, 240, 28, 5, 123, 195, 10, 59, 190, 136, 130, + 239, 165, 209, 36, 255, 239, 116, 92, 184, 33, 175, 21, 220, 75, 10, 47, + 39, 206, 51, 46, 114, 85, 36, 187, 225, 49, 247, 14, 36, 104, 241, 15, + 43, 191, 128, 143, 116, 135, 97, 201, 229, 112, 208, 130, 182, 112, 87, 14, + 68, 20, 38, 150, 228, 103, 14, 189, 192, 57, 72, 175, 129, 239, 43, 159, + 56, 233, 233, 132, 2, 66, 123, 142, 252, 208, 114, 191, 58, 204, 139, 61, + 137, 101, 156, 117, 219, 132, 188, 233, 176, 166, 68, 47, 226, 249, 88, 221, + 79, 241, 189, 39, 254, 213, 246, 31, 138, 155, 161, 30, 200, 232, 93, 18, + 249, 29, 98, 103, 156, 230, 130, 53, 20, 175, 115, 207, 180, 89, 100, 95, + 40, 178, 39, 122, 107, 152, 189, 91, 230, 106, 214, 102, 7, 196, 223, 221, + 218, 100, 116, 62, 197, 221, 251, 54, 255, 99, 241, 93, 73, 188, 253, 95, + 248, 57, 161, 148, 83, 228, 129, 26, 195, 155, 48, 15, 211, 156, 99, 89, + 31, 153, 137, 175, 11, 78, 185, 229, 32, 145, 66, 228, 15, 159, 16, 22, + 182, 139, 49, 224, 125, 170, 146, 79, 94, 29, 125, 229, 64, 151, 97, 202, + 220, 1, 23, 174, 194, 65, 145, 143, 165, 123, 49, 228, 45, 36, 181, 92, + 140, 229, 37, 15, 128, 148, 150, 36, 243, 153, 249, 243, 68, 7, 226, 50, + 113, 24, 213, 50, 41, 158, 176, 60, 73, 62, 64, 60, 127, 51, 0, 198, + 240, 10, 156, 2, 203, 8, 248, 2, 51, 6, 170, 227, 156, 49, 193, 203, + 235, 76, 137, 41, 189, 111, 192, 35, 236, 137, 44, 143, 161, 193, 28, 166, + 103, 57, 151, 51, 71, 118, 166, 90, 130, 253, 22, 203, 16, 218, 209, 121, + 29, 105, 242, 167, 206, 210, 28, 236, 177, 82, 80, 139, 20, 207, 54, 96, + 129, 52, 145, 205, 6, 222, 233, 252, 116, 63, 135, 161, 95, 114, 174, 211, + 164, 53, 202, 161, 147, 177, 161, 211, 52, 92, 122, 21, 179, 146, 109, 244, + 7, 194, 181, 55, 155, 14, 104, 65, 180, 3, 231, 37, 252, 23, 109, 229, + 175, 52, 82, 119, 251, 112, 72, 136, 166, 248, 178, 144, 184, 174, 142, 180, + 157, 225, 185, 245, 174, 215, 239, 73, 171, 209, 75, 84, 166, 46, 59, 146, + 242, 140, 149, 23, 65, 187, 24, 81, 19, 13, 128, 113, 106, 186, 46, 115, + 45, 231, 251, 110, 116, 165, 55, 228, 187, 28, 157, 36, 214, 159, 135, 176, + 231, 189, 105, 109, 19, 104, 128, 238, 176, 223, 224, 146, 94, 181, 34, 222, + 57, 125, 86, 205, 199, 154, 208, 193, 142, 237, 96, 184, 99, 66, 60, 230, + 200, 80, 208, 65, 91, 123, 218, 55, 148, 129, 217, 68, 175, 64, 237, 9, + 60, 77, 122, 238, 208, 85, 200, 157, 137, 171, 52, 198, 10, 247, 203, 132, + 17, 103, 93, 56, 51, 29, 63, 97, 224, 216, 74, 123, 248, 104, 78, 136, + 215, 49, 77, 83, 177, 140, 14, 85, 204, 38, 34, 120, 181, 140, 113, 240, + 98, 247, 90, 10, 57, 149, 97, 210, 77, 183, 103, 182, 12, 209, 187, 41, + 119, 112, 34, 239, 242, 46, 190, 147, 196, 147, 116, 1, 36, 182, 172, 132, + 190, 156, 80, 239, 179, 167, 70, 36, 245, 130, 13, 229, 224, 54, 154, 122, + 124, 123, 114, 149, 253, 114, 21, 73, 36, 126, 196, 133, 164, 3, 179, 215, + 7, 210, 118, 167, 135, 84, 60, 206, 254, 77, 215, 244, 140, 224, 195, 49, + 119, 77, 245, 109, 151, 207, 193, 247, 53, 223, 46, 28, 59, 148, 124, 0, + 19, 35, 221, 94, 227, 204, 72, 199, 199, 199, 193, 135, 51, 62, 15, 88, + 25, 12, 255, 251, 186, 47, 103, 198, 120, 109, 250, 121, 175, 21, 74, 191, + 32, 63, 104, 244, 18, 36, 94, 225, 116, 250, 117, 7, 243, 170, 15, 189, + 46, 134, 44, 147, 47, 245, 241, 53, 12, 91, 31, 24, 56, 192, 240, 28, + 158, 234, 78, 83, 186, 180, 209, 179, 51, 86, 40, 166, 140, 60, 72, 209, + 209, 102, 99, 122, 30, 190, 192, 209, 186, 135, 2, 105, 249, 229, 231, 43, + 111, 136, 90, 76, 87, 40, 146, 110, 76, 95, 201, 24, 126, 254, 56, 212, + 45, 233, 212, 232, 233, 142, 30, 249, 178, 50, 140, 58, 10, 161, 100, 129, + 175, 29, 125, 60, 48, 90, 166, 158, 133, 7, 143, 143, 45, 11, 103, 71, + 14, 231, 164, 126, 101, 162, 35, 64, 60, 43, 160, 78, 81, 132, 65, 126, + 182, 111, 228, 218, 142, 97, 100, 48, 124, 113, 142, 127, 134, 175, 227, 241, + 56, 219, 50, 59, 38, 110, 148, 108, 195, 200, 117, 245, 94, 11, 67, 28, + 103, 96, 95, 3, 130, 156, 246, 140, 140, 158, 233, 233, 25, 203, 124, 202, + 184, 118, 219, 27, 3, 23, 28, 170, 28, 9, 201, 161, 235, 102, 105, 47, + 101, 135, 110, 206, 203, 117, 141, 222, 32, 227, 217, 25, 118, 230, 67, 105, + 172, 201, 110, 103, 40, 75, 102, 232, 102, 104, 47, 80, 63, 104, 138, 121, + 71, 26, 61, 187, 147, 133, 211, 139, 196, 255, 89, 203, 240, 128, 174, 87, + 11, 185, 124, 37, 7, 103, 67, 63, 99, 136, 145, 101, 56, 206, 201, 152, + 86, 6, 177, 84, 166, 99, 246, 7, 89, 68, 64, 242, 255, 140, 186, 92, + 6, 39, 180, 32, 176, 115, 50, 84, 141, 107, 134, 234, 177, 41, 180, 200, + 255, 144, 225, 252, 67, 117, 61, 194, 126, 232, 211, 118, 64, 112, 206, 234, + 195, 28, 33, 206, 204, 82, 77, 8, 53, 25, 56, 223, 51, 45, 123, 108, + 97, 164, 180, 127, 180, 55, 20, 158, 146, 78, 19, 56, 204, 218, 168, 227, + 40, 21, 128, 13, 253, 45, 116, 214, 235, 82, 203, 177, 7, 232, 120, 23, + 61, 246, 161, 154, 124, 65, 90, 114, 14, 204, 226, 224, 248, 134, 114, 116, + 2, 107, 197, 146, 4, 228, 14, 202, 194, 122, 131, 174, 30, 4, 72, 228, + 109, 154, 30, 93, 210, 37, 19, 15, 114, 92, 150, 55, 30, 228, 68, 74, + 92, 8, 214, 129, 76, 201, 74, 15, 114, 253, 65, 86, 30, 100, 120, 88, + 254, 0, 199, 17, 125, 2, 220, 11, 31, 219, 152, 148, 124, 51, 69, 153, + 251, 35, 48, 12, 25, 53, 85, 171, 21, 136, 75, 137, 173, 198, 99, 249, + 125, 136, 215, 86, 228, 166, 216, 76, 189, 131, 122, 164, 161, 196, 162, 177, + 32, 31, 210, 16, 7, 124, 16, 93, 146, 34, 194, 196, 131, 19, 54, 229, + 35, 44, 118, 203, 241, 32, 49, 161, 182, 18, 202, 179, 136, 137, 106, 240, + 54, 165, 61, 225, 49, 212, 69, 142, 233, 34, 212, 82, 186, 54, 167, 38, + 230, 185, 56, 79, 89, 0, 227, 195, 238, 27, 240, 138, 242, 193, 146, 182, + 4, 205, 158, 32, 212, 15, 135, 3, 229, 75, 72, 3, 230, 249, 18, 201, + 63, 57, 14, 164, 3, 99, 39, 248, 229, 12, 29, 118, 114, 60, 104, 73, + 150, 248, 3, 140, 244, 232, 250, 244, 164, 182, 142, 34, 66, 176, 240, 27, + 6, 102, 18, 218, 66, 247, 195, 208, 70, 15, 157, 201, 193, 10, 12, 233, + 12, 134, 58, 38, 146, 220, 179, 164, 76, 219, 69, 161, 56, 212, 39, 231, + 208, 223, 178, 131, 68, 9, 65, 151, 180, 54, 79, 27, 160, 21, 78, 157, + 44, 252, 121, 61, 195, 0, 104, 163, 245, 25, 108, 219, 3, 14, 224, 229, + 38, 88, 200, 170, 87, 50, 60, 62, 15, 13, 103, 154, 81, 179, 170, 154, + 205, 103, 251, 166, 149, 125, 116, 215, 231, 164, 3, 33, 219, 116, 95, 248, + 204, 169, 54, 246, 173, 255, 212, 50, 29, 41, 51, 64, 137, 30, 37, 52, + 145, 193, 235, 32, 240, 173, 20, 235, 228, 96, 243, 218, 69, 210, 104, 201, + 254, 90, 102, 247, 87, 51, 59, 120, 60, 189, 52, 121, 93, 88, 30, 34, + 203, 240, 115, 104, 157, 15, 153, 72, 30, 61, 220, 1, 54, 176, 116, 84, + 167, 96, 220, 42, 131, 166, 172, 204, 47, 185, 96, 140, 201, 132, 136, 7, + 1, 155, 214, 31, 184, 72, 35, 10, 22, 160, 206, 191, 80, 124, 19, 99, + 152, 196, 71, 27, 193, 71, 196, 31, 31, 190, 199, 44, 10, 244, 195, 47, + 153, 112, 59, 125, 88, 196, 130, 232, 106, 232, 29, 220, 15, 182, 22, 255, + 80, 243, 99, 165, 177, 254, 163, 173, 82, 70, 10, 34, 168, 197, 210, 196, + 23, 196, 67, 68, 115, 44, 237, 217, 216, 130, 124, 105, 80, 196, 131, 38, + 156, 232, 69, 5, 35, 36, 101, 180, 202, 66, 209, 80, 42, 64, 216, 143, + 76, 123, 149, 124, 204, 206, 250, 195, 201, 249, 21, 227, 252, 43, 241, 48, + 109, 78, 10, 134, 105, 134, 64, 49, 210, 87, 184, 24, 107, 254, 167, 133, + 241, 242, 8, 187, 22, 15, 211, 244, 36, 199, 232, 178, 200, 119, 107, 174, + 142, 88, 131, 217, 72, 47, 209, 197, 227, 175, 53, 25, 120, 87, 55, 173, + 22, 199, 13, 255, 54, 186, 11, 1, 218, 46, 79, 148, 100, 249, 173, 204, + 234, 146, 49, 210, 149, 200, 44, 83, 240, 57, 31, 212, 232, 122, 209, 175, + 8, 175, 23, 125, 128, 11, 202, 4, 87, 176, 43, 69, 114, 216, 151, 151, + 202, 209, 199, 208, 53, 234, 10, 34, 230, 3, 91, 30, 186, 248, 30, 5, + 64, 150, 26, 163, 58, 249, 11, 176, 216, 130, 101, 142, 185, 181, 57, 249, + 12, 100, 177, 18, 23, 82, 26, 229, 78, 174, 2, 255, 169, 20, 198, 144, + 238, 84, 79, 63, 212, 240, 232, 5, 174, 91, 43, 109, 82, 224, 55, 200, + 20, 233, 174, 232, 29, 93, 195, 82, 32, 239, 117, 187, 106, 174, 109, 96, + 79, 233, 7, 245, 210, 81, 155, 46, 186, 163, 248, 132, 5, 119, 184, 126, + 43, 62, 0, 249, 77, 1, 32, 225, 20, 190, 56, 199, 126, 137, 232, 68, + 99, 92, 195, 213, 60, 50, 36, 83, 156, 242, 190, 62, 32, 72, 97, 220, + 113, 54, 198, 137, 2, 49, 143, 158, 157, 205, 98, 32, 108, 220, 169, 25, + 109, 117, 171, 6, 123, 53, 60, 69, 107, 59, 31, 221, 5, 49, 190, 127, + 36, 123, 125, 65, 190, 141, 94, 44, 238, 244, 185, 192, 36, 38, 172, 118, + 120, 180, 178, 108, 104, 71, 165, 107, 42, 59, 196, 69, 36, 51, 53, 147, + 81, 223, 105, 223, 215, 226, 92, 58, 169, 154, 118, 203, 200, 34, 240, 255, + 173, 157, 136, 154, 3, 75, 233, 156, 241, 142, 242, 225, 80, 199, 207, 183, + 237, 42, 104, 197, 184, 186, 89, 124, 11, 64, 59, 61, 94, 112, 67, 44, + 145, 208, 13, 227, 109, 10, 98, 20, 221, 34, 145, 46, 200, 82, 46, 140, + 182, 147, 9, 57, 246, 225, 205, 222, 249, 238, 245, 221, 197, 62, 155, 146, + 139, 47, 59, 39, 199, 187, 0, 71, 153, 92, 238, 166, 176, 155, 203, 237, + 93, 239, 73, 183, 120, 144, 81, 0, 75, 226, 192, 77, 230, 117, 59, 151, + 219, 63, 195, 208, 153, 177, 135, 48, 163, 55, 46, 100, 109, 167, 147, 187, + 190, 204, 77, 176, 66, 21, 43, 224, 143, 25, 47, 84, 58, 219, 242, 90, + 15, 242, 22, 134, 195, 132, 62, 100, 50, 111, 77, 11, 38, 163, 197, 196, + 116, 53, 168, 50, 160, 40, 128, 98, 204, 100, 182, 48, 159, 219, 116, 204, + 129, 39, 145, 153, 246, 131, 140, 17, 17, 114, 143, 250, 72, 103, 201, 84, + 91, 172, 235, 102, 1, 102, 58, 104, 234, 154, 64, 43, 102, 195, 73, 188, + 199, 162, 57, 150, 137, 170, 65, 223, 254, 102, 11, 106, 0, 122, 190, 201, + 131, 251, 66, 233, 32, 221, 3, 242, 27, 72, 233, 97, 52, 17, 154, 171, + 195, 23, 72, 140, 16, 133, 31, 128, 67, 29, 109, 177, 191, 145, 218, 89, + 243, 171, 117, 96, 186, 131, 82, 71, 207, 177, 89, 167, 63, 12, 182, 182, + 251, 54, 191, 41, 225, 62, 165, 129, 154, 28, 1, 77, 64, 18, 76, 211, + 146, 62, 52, 182, 62, 180, 109, 138, 73, 1, 109, 67, 85, 111, 243, 240, + 191, 114, 25, 42, 224, 114, 218, 15, 57, 252, 14, 29, 105, 108, 41, 146, + 61, 116, 176, 200, 82, 71, 27, 91, 72, 162, 198, 224, 3, 103, 227, 13, + 18, 120, 208, 7, 152, 119, 15, 245, 56, 233, 10, 26, 27, 69, 135, 199, + 131, 65, 143, 221, 35, 219, 67, 10, 69, 150, 225, 158, 171, 177, 110, 234, + 8, 11, 134, 75, 21, 216, 150, 52, 197, 102, 249, 37, 115, 18, 178, 148, + 74, 249, 52, 125, 11, 229, 13, 134, 149, 202, 126, 200, 13, 56, 4, 12, + 182, 118, 140, 158, 61, 86, 176, 10, 210, 86, 180, 128, 38, 237, 48, 234, + 200, 177, 135, 157, 46, 247, 169, 47, 226, 39, 1, 7, 59, 176, 81, 205, + 129, 111, 40, 30, 192, 26, 54, 54, 176, 76, 20, 79, 163, 111, 183, 208, + 247, 51, 187, 199, 71, 201, 24, 221, 103, 217, 125, 65, 173, 199, 184, 54, + 54, 180, 126, 199, 219, 212, 123, 174, 45, 9, 174, 143, 93, 114, 179, 142, + 179, 70, 160, 126, 180, 74, 243, 208, 27, 59, 15, 111, 21, 9, 89, 17, + 251, 160, 75, 93, 199, 104, 215, 34, 27, 2, 8, 95, 168, 182, 167, 235, + 14, 9, 81, 60, 163, 217, 181, 160, 210, 14, 59, 91, 56, 128, 111, 29, + 233, 189, 22, 78, 207, 135, 156, 190, 197, 131, 176, 178, 69, 199, 67, 135, + 173, 15, 115, 125, 172, 224, 186, 160, 118, 47, 198, 248, 196, 169, 35, 209, + 162, 36, 228, 38, 44, 24, 135, 11, 44, 23, 186, 206, 246, 48, 228, 6, + 135, 167, 200, 100, 67, 197, 199, 196, 185, 52, 29, 163, 5, 3, 121, 71, + 77, 92, 133, 180, 95, 92, 138, 68, 50, 102, 158, 177, 27, 232, 170, 191, + 1, 99, 181, 199, 92, 183, 98, 105, 172, 46, 31, 108, 187, 103, 54, 159, + 216, 64, 7, 93, 219, 179, 221, 156, 224, 150, 115, 48, 200, 11, 29, 237, + 249, 158, 152, 24, 10, 71, 170, 96, 111, 126, 177, 34, 244, 199, 218, 3, + 158, 29, 183, 95, 215, 148, 62, 153, 56, 47, 80, 197, 154, 10, 6, 230, + 68, 111, 232, 83, 42, 109, 88, 57, 166, 160, 152, 161, 31, 96, 246, 141, + 94, 11, 159, 7, 134, 213, 232, 13, 13, 207, 200, 20, 10, 165, 106, 53, + 175, 81, 205, 250, 192, 49, 181, 2, 234, 236, 98, 229, 49, 218, 45, 63, + 171, 191, 99, 58, 189, 76, 27, 184, 229, 140, 80, 48, 101, 15, 110, 6, + 189, 133, 187, 30, 240, 255, 90, 185, 90, 174, 22, 55, 177, 9, 115, 164, + 91, 246, 168, 99, 219, 108, 6, 98, 225, 251, 58, 157, 249, 13, 215, 37, + 116, 17, 239, 172, 157, 28, 33, 109, 198, 203, 28, 52, 106, 66, 100, 11, + 115, 101, 88, 174, 225, 230, 26, 211, 140, 171, 231, 180, 108, 158, 198, 178, + 155, 129, 247, 171, 109, 9, 222, 177, 169, 40, 0, 16, 46, 33, 195, 23, + 192, 245, 42, 34, 169, 198, 22, 222, 1, 247, 116, 179, 111, 56, 4, 15, + 31, 26, 78, 142, 176, 147, 185, 133, 126, 202, 1, 123, 183, 140, 190, 238, + 60, 113, 141, 15, 151, 235, 13, 247, 245, 41, 34, 10, 180, 157, 229, 42, + 27, 65, 232, 51, 174, 224, 34, 160, 59, 162, 210, 67, 58, 43, 200, 72, + 135, 194, 76, 232, 61, 105, 48, 116, 112, 103, 187, 49, 244, 129, 158, 69, + 15, 233, 83, 118, 3, 197, 156, 162, 3, 244, 179, 252, 84, 49, 108, 4, + 161, 190, 140, 18, 24, 212, 239, 0, 248, 194, 47, 29, 152, 35, 107, 169, + 97, 24, 11, 133, 197, 13, 20, 89, 160, 223, 142, 61, 129, 143, 104, 214, + 180, 237, 242, 78, 65, 38, 203, 150, 198, 58, 181, 6, 140, 241, 200, 152, + 178, 173, 20, 9, 136, 65, 251, 14, 182, 155, 133, 218, 212, 67, 87, 104, + 178, 44, 79, 147, 18, 27, 227, 6, 234, 97, 168, 2, 86, 11, 217, 112, + 155, 222, 16, 131, 133, 180, 117, 160, 218, 96, 20, 89, 233, 204, 48, 121, + 141, 6, 204, 65, 163, 103, 186, 248, 134, 38, 31, 152, 194, 37, 181, 12, + 59, 183, 97, 172, 38, 6, 187, 134, 1, 209, 189, 37, 100, 2, 170, 8, + 190, 51, 213, 110, 174, 187, 52, 208, 45, 211, 224, 225, 121, 0, 169, 69, + 123, 231, 2, 56, 152, 91, 254, 153, 33, 32, 35, 116, 150, 5, 167, 22, + 99, 255, 17, 70, 144, 5, 214, 123, 30, 164, 193, 161, 236, 58, 77, 120, + 96, 75, 42, 68, 4, 64, 187, 193, 151, 220, 214, 139, 135, 226, 95, 61, + 114, 97, 39, 176, 242, 120, 89, 102, 64, 194, 14, 61, 32, 96, 255, 19, + 7, 176, 135, 7, 210, 214, 7, 207, 97, 111, 45, 114, 133, 223, 177, 88, + 199, 30, 48, 176, 23, 18, 97, 15, 114, 49, 159, 135, 18, 76, 69, 77, + 18, 180, 213, 59, 44, 51, 236, 109, 177, 64, 186, 47, 18, 147, 245, 191, + 73, 77, 214, 87, 201, 201, 181, 185, 67, 82, 253, 80, 240, 190, 249, 34, + 37, 213, 151, 242, 96, 150, 58, 139, 106, 188, 254, 27, 198, 55, 102, 58, + 159, 175, 20, 149, 3, 44, 37, 67, 51, 0, 26, 91, 242, 203, 213, 201, + 184, 100, 20, 240, 236, 181, 206, 255, 164, 227, 53, 89, 94, 223, 173, 90, + 252, 229, 142, 66, 77, 235, 191, 66, 183, 184, 250, 42, 91, 180, 229, 76, + 161, 165, 243, 219, 143, 32, 80, 196, 159, 73, 216, 120, 242, 74, 81, 57, + 197, 183, 152, 204, 91, 248, 150, 8, 242, 160, 54, 54, 188, 7, 175, 72, + 145, 127, 232, 153, 203, 148, 222, 238, 238, 230, 38, 193, 29, 224, 232, 112, + 19, 68, 210, 211, 201, 189, 166, 97, 127, 107, 67, 125, 12, 48, 73, 55, + 88, 180, 16, 94, 50, 191, 236, 34, 36, 202, 112, 73, 92, 253, 214, 223, + 111, 107, 26, 214, 95, 104, 216, 111, 81, 168, 113, 99, 163, 57, 218, 32, + 31, 114, 94, 11, 127, 60, 148, 82, 179, 13, 214, 51, 218, 64, 187, 47, + 109, 56, 177, 197, 194, 10, 185, 239, 232, 64, 226, 167, 82, 104, 167, 133, + 153, 165, 186, 207, 12, 197, 231, 190, 0, 107, 107, 33, 102, 94, 36, 241, + 153, 15, 94, 169, 139, 225, 57, 9, 77, 73, 253, 197, 57, 89, 194, 135, + 40, 185, 68, 20, 69, 81, 64, 24, 13, 240, 142, 47, 222, 251, 7, 57, + 198, 210, 33, 67, 193, 71, 158, 242, 58, 105, 82, 61, 44, 78, 130, 138, + 17, 155, 234, 203, 107, 248, 55, 251, 234, 247, 37, 255, 215, 251, 18, 89, + 93, 182, 172, 57, 64, 160, 240, 135, 144, 41, 190, 254, 19, 167, 73, 108, + 249, 52, 193, 182, 161, 205, 127, 228, 88, 225, 172, 145, 148, 148, 215, 220, + 9, 224, 230, 253, 251, 71, 11, 203, 186, 245, 65, 204, 74, 12, 79, 153, + 15, 52, 95, 84, 97, 104, 47, 250, 43, 16, 48, 233, 50, 63, 82, 129, + 48, 115, 93, 164, 3, 133, 52, 25, 210, 108, 96, 153, 129, 76, 134, 84, + 30, 77, 15, 152, 95, 99, 2, 199, 126, 43, 137, 132, 70, 106, 121, 142, + 99, 107, 86, 125, 73, 122, 186, 218, 176, 88, 113, 54, 248, 149, 110, 100, + 154, 186, 63, 235, 141, 45, 95, 218, 43, 17, 123, 65, 84, 228, 210, 20, + 34, 164, 16, 156, 4, 51, 225, 163, 130, 96, 86, 95, 168, 42, 40, 187, + 122, 214, 254, 25, 41, 98, 50, 193, 159, 195, 119, 96, 168, 88, 85, 168, + 42, 114, 85, 83, 224, 191, 66, 85, 220, 222, 212, 13, 183, 89, 227, 55, + 86, 75, 34, 51, 137, 222, 232, 40, 70, 147, 133, 173, 223, 138, 104, 244, + 64, 143, 18, 219, 22, 14, 3, 88, 116, 36, 138, 9, 240, 206, 222, 152, + 240, 5, 199, 243, 11, 112, 241, 246, 133, 197, 198, 45, 190, 31, 44, 184, + 34, 205, 25, 161, 130, 210, 93, 122, 144, 21, 46, 46, 194, 20, 246, 36, + 75, 139, 20, 135, 204, 159, 98, 132, 159, 202, 234, 2, 32, 161, 165, 125, + 13, 78, 250, 186, 105, 81, 24, 75, 11, 37, 53, 98, 87, 252, 229, 110, + 132, 132, 133, 114, 100, 118, 96, 90, 154, 61, 96, 32, 146, 48, 74, 224, + 33, 250, 104, 136, 135, 74, 24, 240, 41, 144, 21, 189, 195, 233, 202, 98, + 245, 137, 215, 106, 199, 149, 167, 22, 18, 239, 67, 149, 13, 189, 151, 234, + 122, 105, 255, 98, 113, 49, 71, 2, 29, 68, 112, 202, 79, 182, 21, 195, + 82, 140, 73, 7, 110, 76, 142, 19, 216, 201, 72, 193, 199, 190, 133, 143, + 130, 23, 229, 214, 72, 148, 237, 9, 201, 70, 88, 216, 240, 253, 175, 237, + 207, 21, 246, 49, 232, 19, 39, 59, 194, 213, 240, 19, 129, 159, 18, 108, + 235, 138, 163, 35, 22, 57, 52, 252, 249, 249, 247, 152, 17, 126, 124, 172, + 19, 58, 70, 111, 83, 3, 185, 227, 154, 172, 161, 43, 81, 145, 15, 43, + 214, 191, 133, 168, 145, 12, 179, 138, 183, 61, 148, 170, 191, 72, 99, 17, + 90, 9, 11, 174, 87, 164, 206, 106, 148, 69, 8, 95, 49, 174, 171, 54, + 207, 207, 126, 110, 190, 203, 94, 8, 63, 169, 97, 89, 248, 53, 183, 169, + 137, 200, 184, 48, 244, 88, 84, 241, 20, 229, 227, 216, 98, 219, 27, 72, + 109, 146, 106, 201, 241, 67, 248, 94, 63, 57, 63, 60, 62, 147, 223, 241, + 183, 139, 237, 171, 171, 155, 61, 249, 127, 241, 215, 131, 235, 11, 152, 21, + 67, 122, 144, 121, 220, 212, 140, 113, 121, 34, 101, 37, 20, 238, 176, 107, + 239, 136, 118, 159, 244, 94, 122, 30, 154, 128, 24, 136, 76, 14, 110, 225, + 183, 123, 76, 212, 47, 110, 220, 215, 93, 173, 99, 7, 185, 198, 96, 71, + 239, 245, 12, 160, 68, 95, 215, 21, 20, 22, 15, 254, 101, 0, 47, 198, + 46, 247, 169, 165, 64, 253, 118, 108, 52, 92, 211, 195, 203, 119, 216, 250, + 245, 145, 135, 158, 249, 124, 70, 97, 46, 147, 26, 141, 180, 33, 47, 82, + 107, 82, 235, 237, 97, 175, 87, 223, 32, 12, 178, 224, 33, 210, 151, 179, + 48, 116, 250, 122, 30, 129, 86, 252, 108, 108, 49, 1, 180, 242, 138, 236, + 244, 1, 20, 160, 7, 228, 208, 140, 98, 84, 11, 213, 88, 52, 107, 219, + 229, 209, 129, 133, 50, 65, 215, 30, 246, 90, 104, 36, 100, 244, 7, 222, + 244, 141, 204, 45, 247, 126, 65, 57, 225, 255, 169, 38, 252, 41, 213, 132, + 215, 148, 0, 66, 202, 163, 186, 227, 232, 83, 87, 17, 130, 66, 165, 129, + 74, 147, 112, 158, 143, 81, 101, 146, 171, 116, 42, 45, 195, 23, 59, 185, + 10, 147, 211, 155, 86, 71, 25, 232, 104, 246, 14, 73, 133, 86, 223, 112, + 187, 134, 171, 96, 7, 121, 220, 61, 5, 47, 183, 4, 87, 4, 219, 38, + 212, 230, 124, 69, 52, 177, 136, 9, 221, 240, 58, 235, 80, 77, 236, 36, + 191, 127, 240, 195, 254, 214, 219, 48, 159, 252, 145, 237, 109, 133, 110, 7, + 235, 232, 80, 132, 63, 54, 135, 13, 131, 63, 14, 224, 216, 71, 187, 15, + 178, 183, 130, 19, 211, 52, 21, 154, 167, 142, 99, 182, 20, 199, 198, 112, + 205, 64, 82, 161, 25, 223, 8, 165, 114, 48, 34, 197, 27, 162, 129, 65, + 184, 75, 108, 114, 66, 157, 18, 179, 101, 79, 218, 166, 71, 213, 55, 33, + 209, 198, 97, 15, 27, 166, 219, 87, 90, 142, 62, 174, 195, 36, 58, 61, + 236, 71, 211, 35, 101, 126, 165, 171, 3, 26, 67, 116, 226, 62, 25, 94, + 179, 219, 24, 43, 61, 114, 106, 232, 160, 120, 174, 173, 244, 109, 87, 135, + 90, 123, 192, 254, 180, 167, 202, 192, 238, 233, 142, 13, 189, 228, 102, 68, + 88, 193, 128, 236, 225, 235, 93, 123, 96, 160, 137, 188, 217, 51, 135, 56, + 235, 100, 160, 15, 191, 100, 74, 80, 239, 224, 97, 30, 116, 63, 178, 164, + 254, 24, 162, 11, 205, 76, 252, 161, 63, 176, 177, 234, 36, 240, 86, 92, + 99, 96, 234, 65, 45, 12, 20, 252, 226, 28, 50, 240, 98, 193, 161, 145, + 185, 35, 205, 233, 52, 20, 97, 40, 137, 23, 224, 65, 225, 48, 0, 249, + 85, 68, 160, 138, 189, 40, 120, 65, 236, 14, 80, 8, 10, 237, 235, 125, + 152, 212, 17, 60, 97, 2, 54, 226, 141, 113, 62, 199, 186, 51, 64, 31, + 193, 100, 36, 131, 122, 207, 100, 244, 15, 127, 71, 70, 208, 162, 15, 165, + 126, 115, 1, 220, 34, 160, 160, 99, 61, 12, 163, 201, 94, 48, 178, 179, + 120, 70, 143, 154, 122, 79, 233, 224, 109, 144, 219, 135, 221, 221, 85, 26, + 38, 94, 85, 57, 144, 74, 46, 27, 160, 22, 192, 236, 138, 112, 14, 175, + 116, 176, 8, 32, 185, 186, 133, 67, 192, 63, 180, 218, 117, 114, 148, 163, + 160, 211, 26, 152, 94, 156, 42, 19, 111, 132, 130, 62, 138, 253, 227, 119, + 209, 223, 80, 158, 59, 80, 208, 119, 18, 28, 28, 186, 211, 34, 15, 13, + 70, 15, 56, 105, 15, 30, 161, 226, 190, 238, 62, 41, 192, 52, 184, 125, + 93, 9, 92, 66, 43, 75, 158, 206, 20, 215, 52, 156, 129, 105, 185, 79, + 166, 130, 54, 117, 192, 30, 14, 113, 26, 161, 56, 192, 222, 0, 255, 40, + 136, 64, 187, 134, 7, 32, 239, 52, 134, 61, 228, 118, 216, 108, 162, 132, + 182, 62, 50, 93, 19, 104, 34, 101, 108, 68, 166, 86, 236, 118, 191, 219, + 254, 246, 215, 91, 173, 66, 75, 137, 218, 33, 161, 91, 139, 145, 206, 159, + 17, 165, 195, 15, 109, 64, 228, 152, 159, 92, 241, 230, 192, 182, 121, 130, + 23, 216, 24, 61, 195, 163, 204, 108, 217, 97, 10, 225, 25, 32, 220, 5, + 120, 163, 167, 137, 135, 63, 204, 70, 14, 250, 102, 58, 208, 104, 208, 187, + 16, 10, 242, 59, 24, 74, 11, 3, 180, 143, 159, 66, 80, 29, 224, 172, + 129, 217, 4, 244, 200, 253, 127, 172, 113, 244, 193, 221, 123, 144, 99, 143, + 191, 224, 207, 35, 236, 172, 227, 69, 55, 29, 47, 122, 232, 88, 118, 205, + 177, 206, 81, 70, 216, 71, 198, 90, 231, 24, 166, 135, 54, 249, 107, 14, + 93, 241, 0, 19, 215, 234, 153, 13, 102, 41, 211, 55, 156, 14, 192, 14, + 134, 138, 197, 237, 66, 86, 125, 24, 95, 57, 43, 185, 82, 70, 81, 243, + 116, 7, 131, 86, 126, 198, 24, 191, 51, 26, 71, 151, 166, 132, 252, 237, + 158, 91, 43, 132, 229, 101, 1, 242, 87, 44, 120, 94, 37, 57, 211, 232, + 88, 57, 76, 117, 6, 254, 7, 194, 138, 40, 140, 186, 92, 240, 200, 200, + 166, 53, 52, 164, 16, 1, 71, 36, 131, 221, 68, 191, 99, 190, 226, 16, + 48, 92, 117, 26, 92, 195, 175, 132, 39, 0, 1, 141, 135, 35, 7, 16, + 232, 137, 15, 43, 81, 53, 78, 63, 135, 56, 200, 248, 59, 29, 99, 61, + 197, 50, 38, 129, 114, 85, 116, 172, 56, 204, 87, 71, 72, 194, 216, 68, + 173, 22, 18, 202, 74, 94, 139, 218, 175, 201, 200, 9, 53, 58, 190, 84, + 118, 143, 254, 135, 172, 15, 163, 187, 194, 249, 152, 184, 151, 232, 121, 156, + 31, 72, 251, 219, 106, 22, 50, 80, 96, 127, 87, 211, 66, 94, 203, 245, + 172, 81, 181, 160, 172, 0, 70, 79, 18, 28, 141, 144, 133, 40, 31, 192, + 49, 6, 74, 106, 57, 183, 153, 203, 145, 254, 12, 35, 159, 232, 46, 116, + 104, 230, 128, 138, 210, 178, 106, 14, 232, 231, 62, 222, 71, 2, 71, 34, + 232, 171, 161, 137, 148, 19, 117, 4, 234, 230, 154, 28, 140, 107, 243, 239, + 54, 151, 234, 11, 40, 51, 45, 91, 4, 170, 12, 153, 190, 64, 143, 227, + 87, 107, 9, 122, 21, 244, 100, 185, 46, 170, 237, 151, 132, 137, 232, 214, + 244, 37, 97, 34, 187, 82, 231, 200, 108, 137, 233, 148, 255, 130, 236, 16, + 10, 13, 182, 174, 241, 202, 80, 112, 40, 120, 171, 137, 254, 153, 128, 89, + 2, 206, 6, 197, 26, 24, 49, 93, 92, 179, 62, 153, 44, 136, 125, 160, + 65, 98, 181, 152, 231, 7, 179, 25, 232, 119, 132, 181, 74, 176, 20, 180, + 242, 103, 116, 75, 40, 118, 124, 134, 25, 113, 113, 245, 231, 1, 219, 227, + 120, 3, 74, 68, 31, 98, 51, 126, 219, 76, 67, 64, 46, 206, 247, 197, + 176, 170, 88, 192, 139, 7, 119, 151, 187, 39, 199, 228, 155, 202, 193, 75, + 117, 236, 159, 231, 133, 132, 97, 45, 187, 73, 198, 198, 116, 158, 48, 252, + 3, 29, 69, 12, 194, 46, 3, 61, 6, 28, 18, 206, 196, 159, 212, 154, + 33, 245, 91, 93, 152, 213, 138, 240, 244, 24, 240, 135, 88, 100, 95, 99, + 68, 150, 119, 123, 180, 0, 22, 185, 209, 162, 73, 64, 183, 8, 22, 80, + 52, 29, 82, 205, 192, 153, 231, 174, 140, 105, 72, 127, 110, 138, 57, 70, + 203, 32, 34, 135, 241, 15, 121, 52, 117, 238, 173, 194, 159, 236, 228, 7, + 115, 203, 2, 246, 135, 92, 68, 0, 194, 3, 138, 116, 216, 100, 151, 204, + 76, 145, 6, 175, 230, 105, 158, 177, 115, 204, 255, 27, 105, 192, 96, 52, + 107, 32, 138, 201, 2, 86, 150, 245, 102, 211, 102, 134, 218, 220, 211, 4, + 234, 87, 145, 182, 76, 215, 128, 149, 195, 138, 160, 7, 111, 80, 218, 148, + 10, 47, 235, 37, 236, 241, 62, 122, 190, 250, 147, 163, 235, 33, 195, 143, + 181, 50, 101, 34, 166, 53, 132, 23, 212, 28, 154, 204, 129, 129, 3, 7, + 230, 73, 230, 202, 63, 216, 32, 183, 27, 95, 213, 136, 16, 246, 165, 203, + 39, 38, 52, 46, 236, 121, 137, 145, 38, 29, 8, 172, 233, 14, 219, 227, + 213, 137, 93, 193, 29, 164, 25, 186, 107, 162, 118, 79, 11, 189, 129, 232, + 109, 248, 4, 212, 110, 203, 21, 91, 101, 208, 27, 118, 50, 240, 76, 194, + 8, 121, 173, 186, 15, 89, 122, 0, 94, 198, 161, 31, 159, 94, 208, 37, + 217, 203, 185, 159, 28, 211, 211, 121, 246, 79, 248, 28, 81, 212, 160, 89, + 62, 128, 210, 125, 10, 149, 110, 120, 168, 35, 174, 72, 72, 23, 122, 12, + 170, 94, 156, 12, 15, 237, 203, 0, 120, 161, 94, 241, 200, 196, 27, 212, + 33, 221, 149, 198, 184, 180, 220, 71, 204, 114, 231, 194, 21, 57, 66, 12, + 239, 239, 52, 210, 96, 66, 186, 80, 242, 191, 81, 165, 0, 60, 29, 244, + 5, 32, 161, 212, 67, 138, 236, 82, 102, 81, 108, 226, 138, 10, 69, 37, + 90, 9, 54, 208, 0, 13, 66, 129, 33, 195, 124, 116, 108, 214, 241, 125, + 233, 170, 149, 233, 170, 144, 176, 80, 106, 194, 24, 92, 12, 114, 2, 108, + 6, 19, 24, 99, 202, 0, 86, 143, 165, 20, 195, 242, 100, 40, 183, 70, + 142, 201, 228, 243, 113, 56, 187, 25, 167, 27, 154, 9, 150, 192, 134, 253, + 150, 247, 108, 155, 210, 164, 255, 2, 26, 245, 189, 116, 128, 184, 206, 229, + 72, 167, 181, 197, 107, 97, 172, 105, 164, 30, 150, 180, 92, 19, 75, 141, + 22, 143, 112, 133, 161, 58, 34, 233, 209, 138, 118, 168, 51, 55, 209, 122, + 24, 123, 24, 170, 128, 37, 68, 75, 146, 114, 224, 82, 255, 195, 76, 97, + 168, 120, 56, 57, 90, 201, 94, 232, 75, 180, 42, 159, 225, 11, 213, 227, + 167, 69, 43, 57, 16, 201, 209, 26, 4, 63, 22, 170, 64, 36, 69, 203, + 95, 240, 212, 104, 113, 193, 23, 133, 138, 139, 164, 104, 241, 194, 158, 116, + 74, 201, 209, 242, 33, 182, 37, 84, 69, 40, 53, 90, 203, 85, 240, 97, + 121, 49, 124, 174, 38, 178, 34, 126, 234, 242, 178, 180, 124, 139, 162, 160, + 34, 121, 73, 76, 78, 232, 84, 108, 20, 160, 105, 137, 12, 103, 63, 180, + 109, 22, 50, 39, 64, 248, 117, 185, 204, 247, 204, 202, 22, 8, 233, 63, + 199, 67, 196, 181, 160, 195, 185, 59, 58, 73, 230, 244, 50, 255, 76, 126, + 232, 194, 188, 222, 28, 21, 25, 184, 183, 18, 116, 50, 183, 134, 247, 75, + 48, 213, 100, 78, 237, 247, 185, 138, 178, 111, 162, 29, 226, 11, 88, 82, + 192, 22, 72, 223, 184, 221, 66, 46, 220, 69, 249, 123, 86, 148, 177, 208, + 86, 31, 249, 160, 121, 66, 102, 142, 18, 100, 81, 139, 44, 189, 147, 19, + 236, 122, 238, 205, 7, 77, 122, 33, 19, 74, 239, 23, 146, 137, 38, 37, + 201, 196, 131, 5, 252, 76, 96, 163, 207, 109, 29, 168, 56, 160, 46, 75, + 168, 87, 111, 108, 132, 59, 47, 106, 74, 72, 232, 196, 183, 141, 206, 53, + 222, 64, 22, 198, 28, 196, 48, 206, 22, 139, 153, 132, 81, 58, 154, 142, + 61, 72, 190, 205, 168, 41, 5, 88, 117, 116, 127, 3, 85, 212, 164, 252, + 251, 24, 236, 111, 84, 253, 76, 178, 4, 56, 29, 91, 73, 200, 161, 64, + 143, 88, 135, 19, 192, 171, 182, 82, 41, 244, 147, 29, 75, 167, 225, 249, + 125, 12, 190, 127, 131, 135, 116, 249, 251, 155, 90, 61, 241, 46, 33, 253, + 206, 28, 222, 37, 83, 232, 207, 128, 127, 220, 132, 37, 169, 39, 36, 50, + 203, 19, 105, 21, 74, 139, 71, 210, 170, 60, 223, 239, 201, 88, 195, 232, + 96, 124, 16, 232, 72, 90, 82, 161, 107, 70, 180, 75, 117, 156, 37, 5, + 50, 97, 8, 7, 53, 28, 124, 68, 205, 107, 197, 100, 62, 165, 192, 132, + 96, 56, 145, 161, 149, 76, 164, 81, 9, 1, 109, 110, 168, 132, 146, 128, + 255, 67, 117, 44, 142, 7, 252, 39, 191, 71, 117, 253, 252, 119, 100, 238, + 140, 73, 96, 196, 20, 2, 75, 145, 28, 227, 15, 113, 228, 242, 80, 223, + 221, 139, 0, 85, 71, 22, 49, 155, 226, 120, 57, 18, 202, 188, 240, 33, + 133, 109, 45, 1, 215, 106, 90, 158, 39, 49, 67, 186, 178, 17, 71, 86, + 56, 245, 27, 227, 42, 81, 254, 144, 194, 59, 99, 248, 37, 104, 15, 54, + 44, 176, 151, 20, 163, 32, 17, 109, 1, 128, 102, 138, 25, 201, 189, 64, + 13, 197, 247, 48, 87, 232, 103, 61, 225, 251, 82, 78, 224, 210, 201, 11, + 223, 235, 32, 101, 37, 161, 127, 144, 153, 171, 188, 176, 172, 0, 212, 105, + 132, 87, 158, 200, 33, 121, 158, 87, 8, 132, 82, 176, 209, 130, 79, 220, + 91, 222, 155, 45, 21, 221, 253, 169, 223, 69, 89, 81, 138, 119, 40, 15, + 107, 167, 36, 160, 104, 70, 149, 57, 158, 65, 251, 20, 143, 28, 64, 178, + 190, 179, 248, 134, 48, 26, 225, 202, 93, 103, 65, 14, 35, 86, 161, 178, + 63, 42, 89, 121, 133, 128, 8, 57, 51, 148, 185, 23, 75, 25, 197, 249, + 112, 28, 123, 72, 45, 227, 253, 29, 158, 123, 214, 19, 221, 34, 134, 114, + 48, 69, 177, 104, 155, 117, 123, 232, 65, 15, 235, 125, 88, 140, 154, 10, + 13, 203, 177, 30, 74, 64, 252, 129, 134, 44, 101, 113, 162, 226, 31, 216, + 76, 177, 24, 33, 37, 156, 176, 122, 123, 224, 214, 18, 63, 126, 132, 210, + 55, 41, 29, 184, 34, 96, 118, 97, 174, 0, 24, 209, 70, 174, 109, 178, + 56, 82, 24, 237, 143, 188, 95, 252, 137, 150, 42, 88, 163, 152, 138, 196, + 130, 91, 221, 65, 190, 80, 30, 173, 24, 206, 36, 230, 139, 99, 254, 92, + 98, 9, 230, 84, 223, 206, 35, 156, 58, 255, 223, 188, 66, 13, 157, 125, + 116, 51, 80, 231, 255, 14, 156, 79, 134, 115, 202, 217, 108, 14, 254, 11, + 252, 111, 136, 35, 41, 184, 246, 14, 101, 71, 191, 148, 145, 210, 47, 117, + 83, 94, 91, 90, 220, 79, 253, 245, 107, 67, 244, 208, 145, 57, 15, 221, + 23, 10, 75, 171, 135, 7, 188, 232, 94, 51, 66, 25, 191, 136, 123, 68, + 105, 43, 215, 50, 70, 57, 11, 72, 81, 186, 25, 35, 123, 105, 166, 55, + 21, 168, 10, 132, 238, 240, 227, 73, 41, 241, 240, 22, 37, 207, 118, 71, + 198, 221, 12, 120, 60, 149, 101, 239, 73, 12, 21, 104, 88, 144, 128, 90, + 0, 66, 203, 11, 195, 74, 216, 206, 59, 230, 94, 201, 112, 222, 35, 244, + 114, 5, 45, 41, 212, 154, 184, 154, 71, 248, 240, 80, 55, 114, 29, 212, + 51, 101, 170, 100, 2, 33, 30, 177, 136, 20, 218, 123, 75, 48, 40, 92, + 56, 215, 35, 136, 144, 148, 83, 152, 139, 150, 53, 88, 41, 186, 133, 94, + 92, 73, 229, 37, 16, 201, 201, 210, 106, 107, 89, 178, 42, 7, 244, 142, + 14, 242, 6, 142, 129, 130, 8, 102, 251, 169, 248, 175, 220, 84, 169, 88, + 202, 43, 133, 124, 126, 25, 35, 179, 160, 171, 28, 231, 8, 91, 84, 192, + 203, 220, 21, 110, 157, 121, 247, 20, 233, 18, 221, 84, 242, 85, 23, 55, + 162, 181, 200, 5, 56, 47, 89, 95, 248, 23, 166, 216, 14, 98, 168, 160, + 36, 187, 111, 253, 73, 249, 104, 166, 160, 22, 31, 137, 126, 75, 44, 141, + 69, 78, 124, 87, 18, 18, 67, 45, 12, 113, 251, 45, 34, 59, 244, 66, + 59, 116, 63, 76, 181, 119, 204, 246, 82, 31, 95, 237, 154, 95, 6, 61, + 119, 234, 22, 41, 176, 183, 106, 60, 220, 238, 159, 107, 121, 117, 118, 126, + 222, 50, 150, 137, 180, 76, 238, 142, 13, 207, 236, 27, 181, 24, 199, 163, + 97, 107, 199, 176, 195, 90, 214, 6, 130, 37, 119, 9, 29, 2, 129, 129, + 196, 241, 63, 186, 95, 146, 236, 112, 12, 130, 62, 249, 4, 110, 20, 90, + 82, 31, 255, 181, 224, 79, 27, 254, 97, 96, 10, 151, 254, 160, 199, 190, + 124, 182, 194, 189, 174, 162, 79, 68, 214, 159, 248, 15, 137, 160, 148, 189, + 205, 235, 220, 237, 217, 143, 76, 156, 82, 48, 168, 34, 143, 129, 17, 143, + 146, 180, 64, 82, 74, 66, 163, 0, 250, 18, 143, 76, 171, 178, 137, 78, + 253, 152, 143, 5, 160, 237, 68, 62, 102, 172, 167, 8, 19, 189, 111, 99, + 165, 251, 125, 193, 86, 229, 245, 44, 216, 124, 120, 70, 87, 27, 140, 35, + 112, 177, 45, 177, 174, 51, 236, 30, 159, 9, 222, 29, 249, 231, 228, 144, + 44, 37, 9, 177, 152, 232, 167, 138, 147, 70, 144, 3, 167, 100, 33, 187, + 65, 5, 169, 16, 141, 141, 71, 141, 84, 82, 74, 202, 124, 156, 41, 163, + 173, 52, 252, 141, 45, 251, 176, 112, 28, 173, 37, 21, 139, 121, 5, 255, + 193, 190, 95, 113, 102, 161, 173, 14, 150, 202, 104, 5, 56, 197, 10, 172, + 12, 243, 235, 139, 169, 128, 55, 16, 119, 80, 42, 12, 240, 5, 151, 23, + 220, 160, 85, 33, 207, 23, 126, 32, 154, 87, 39, 149, 192, 240, 165, 89, + 101, 31, 203, 121, 238, 116, 44, 12, 165, 177, 0, 40, 253, 37, 165, 158, + 50, 141, 59, 133, 171, 217, 65, 135, 75, 82, 147, 249, 240, 138, 121, 54, + 247, 216, 39, 43, 218, 111, 248, 95, 249, 55, 223, 85, 215, 82, 177, 23, + 125, 105, 173, 224, 62, 232, 222, 255, 184, 21, 89, 153, 227, 200, 104, 96, + 166, 67, 81, 249, 112, 55, 162, 128, 5, 229, 62, 140, 224, 142, 66, 253, + 210, 70, 98, 251, 154, 182, 211, 70, 18, 61, 88, 195, 83, 234, 3, 116, + 244, 119, 53, 187, 89, 122, 167, 166, 82, 225, 59, 44, 178, 166, 158, 251, + 78, 180, 253, 110, 68, 221, 105, 251, 201, 82, 184, 51, 243, 113, 173, 54, + 126, 203, 157, 83, 119, 107, 181, 238, 219, 252, 130, 3, 10, 157, 192, 130, + 184, 23, 5, 164, 53, 199, 86, 100, 36, 194, 152, 30, 175, 178, 122, 191, + 197, 249, 133, 93, 74, 10, 179, 246, 50, 23, 85, 9, 102, 52, 204, 42, + 1, 189, 222, 132, 209, 3, 21, 82, 99, 235, 36, 222, 100, 41, 42, 59, + 211, 72, 109, 110, 75, 254, 54, 39, 27, 245, 92, 184, 150, 239, 114, 200, + 32, 136, 154, 33, 89, 2, 71, 234, 190, 114, 19, 189, 179, 174, 241, 111, + 50, 83, 203, 95, 215, 80, 146, 187, 157, 70, 191, 139, 228, 15, 79, 224, + 151, 212, 218, 182, 66, 244, 166, 216, 114, 33, 154, 114, 57, 139, 28, 150, + 28, 134, 41, 55, 164, 177, 72, 45, 23, 200, 46, 65, 193, 172, 163, 82, + 201, 80, 5, 107, 89, 149, 47, 2, 1, 67, 130, 17, 118, 69, 27, 165, + 133, 165, 229, 142, 112, 169, 75, 144, 178, 16, 20, 210, 207, 115, 98, 243, + 57, 108, 205, 23, 144, 251, 247, 69, 52, 171, 252, 134, 10, 200, 211, 246, + 208, 34, 39, 205, 192, 215, 207, 37, 120, 127, 144, 223, 46, 13, 26, 80, + 53, 159, 135, 228, 28, 13, 198, 236, 115, 160, 90, 223, 73, 109, 189, 231, + 82, 92, 40, 84, 12, 198, 115, 117, 145, 122, 47, 45, 128, 152, 141, 216, + 68, 191, 66, 23, 255, 93, 178, 248, 131, 185, 70, 95, 244, 155, 116, 197, + 174, 144, 112, 50, 164, 239, 254, 240, 77, 97, 96, 16, 178, 151, 33, 130, + 2, 165, 74, 121, 137, 19, 23, 190, 136, 136, 67, 58, 3, 251, 164, 159, + 119, 153, 230, 253, 15, 16, 183, 146, 44, 74, 243, 229, 17, 91, 201, 199, + 236, 145, 253, 38, 73, 164, 157, 45, 212, 117, 255, 182, 66, 246, 156, 33, + 250, 116, 185, 184, 144, 149, 152, 44, 251, 122, 217, 115, 142, 250, 233, 139, + 80, 206, 198, 251, 171, 144, 130, 171, 44, 196, 105, 254, 192, 249, 154, 175, + 85, 151, 142, 162, 88, 204, 38, 203, 191, 164, 9, 253, 2, 110, 254, 85, + 245, 231, 149, 150, 177, 28, 183, 216, 33, 211, 165, 57, 91, 128, 197, 154, + 125, 192, 244, 251, 117, 49, 244, 63, 167, 67, 254, 151, 102, 235, 255, 144, + 247, 238, 253, 109, 219, 200, 254, 240, 255, 122, 21, 8, 163, 86, 146, 77, + 93, 40, 217, 105, 106, 155, 206, 233, 182, 221, 61, 61, 167, 201, 230, 211, + 118, 207, 238, 62, 142, 171, 202, 18, 101, 177, 145, 40, 69, 148, 124, 169, + 162, 247, 254, 155, 239, 12, 64, 130, 20, 37, 203, 73, 186, 221, 115, 158, + 94, 44, 18, 4, 6, 192, 96, 0, 204, 12, 6, 51, 230, 74, 159, 49, + 149, 47, 66, 32, 86, 103, 135, 251, 94, 100, 94, 174, 30, 135, 84, 6, + 246, 120, 84, 102, 70, 65, 235, 114, 243, 86, 228, 250, 120, 121, 151, 25, + 185, 86, 85, 158, 40, 156, 166, 150, 217, 205, 41, 86, 228, 34, 121, 18, + 163, 65, 153, 28, 61, 76, 122, 209, 206, 152, 99, 167, 13, 96, 147, 110, + 173, 229, 252, 191, 59, 129, 254, 47, 83, 241, 191, 45, 77, 193, 171, 85, + 112, 7, 191, 46, 196, 15, 33, 4, 12, 253, 32, 120, 166, 225, 144, 180, + 30, 149, 30, 115, 172, 82, 51, 229, 149, 216, 6, 199, 98, 206, 76, 208, + 151, 221, 165, 242, 31, 228, 208, 69, 31, 165, 20, 157, 178, 124, 234, 75, + 10, 219, 108, 117, 138, 111, 40, 20, 231, 45, 186, 162, 0, 245, 16, 18, + 42, 53, 185, 150, 144, 181, 227, 74, 175, 34, 16, 186, 82, 35, 230, 236, + 9, 230, 190, 215, 10, 18, 209, 249, 95, 116, 161, 192, 212, 183, 121, 149, + 0, 205, 50, 55, 9, 158, 160, 250, 68, 172, 63, 41, 229, 29, 43, 254, + 189, 124, 78, 12, 254, 90, 253, 39, 126, 71, 107, 245, 13, 126, 7, 107, + 245, 35, 126, 227, 181, 250, 238, 199, 110, 7, 105, 112, 224, 19, 194, 24, + 115, 173, 44, 135, 68, 89, 96, 18, 136, 71, 151, 224, 0, 2, 226, 64, + 137, 227, 7, 224, 141, 227, 86, 187, 244, 18, 71, 189, 89, 60, 154, 46, + 40, 237, 168, 165, 195, 112, 34, 226, 205, 249, 115, 239, 203, 182, 250, 141, + 50, 210, 131, 167, 56, 48, 206, 72, 18, 113, 164, 98, 210, 135, 33, 199, + 51, 134, 164, 152, 113, 144, 196, 211, 195, 150, 235, 74, 135, 221, 68, 104, + 101, 248, 56, 172, 81, 73, 52, 80, 188, 29, 144, 44, 215, 188, 37, 217, + 211, 171, 81, 147, 69, 140, 43, 207, 63, 115, 241, 191, 246, 140, 214, 70, + 133, 32, 21, 43, 28, 146, 213, 101, 22, 72, 230, 138, 176, 168, 221, 169, + 117, 36, 162, 15, 165, 31, 145, 236, 121, 125, 213, 147, 14, 102, 178, 72, + 68, 118, 180, 233, 204, 31, 105, 209, 234, 172, 125, 252, 140, 99, 253, 112, + 72, 213, 182, 238, 254, 153, 127, 43, 223, 111, 205, 247, 59, 253, 125, 3, + 192, 249, 179, 182, 68, 23, 82, 207, 216, 141, 85, 30, 128, 249, 126, 167, + 191, 11, 128, 209, 217, 209, 115, 248, 208, 70, 87, 233, 201, 64, 229, 68, + 132, 58, 135, 219, 123, 205, 58, 218, 184, 21, 152, 213, 219, 243, 163, 231, + 45, 9, 71, 53, 194, 99, 77, 203, 223, 207, 73, 254, 126, 222, 114, 117, + 53, 34, 163, 123, 18, 137, 158, 159, 143, 220, 35, 30, 192, 204, 232, 101, + 7, 47, 81, 25, 172, 104, 15, 185, 235, 222, 26, 204, 109, 168, 11, 120, + 51, 150, 220, 201, 120, 235, 79, 220, 21, 224, 205, 0, 3, 234, 180, 248, + 190, 225, 246, 142, 139, 36, 88, 177, 75, 9, 29, 28, 63, 219, 89, 138, + 163, 249, 165, 83, 141, 207, 80, 125, 191, 45, 148, 61, 18, 157, 54, 7, + 248, 82, 119, 201, 237, 149, 9, 109, 140, 176, 2, 250, 10, 165, 245, 181, + 158, 65, 64, 18, 82, 159, 157, 218, 239, 12, 151, 80, 246, 206, 190, 252, + 242, 203, 244, 130, 207, 55, 73, 57, 177, 59, 208, 158, 224, 229, 138, 143, + 172, 73, 198, 87, 123, 217, 107, 56, 172, 99, 224, 181, 115, 211, 201, 189, + 167, 221, 213, 107, 223, 246, 27, 74, 244, 76, 54, 199, 93, 194, 194, 170, + 116, 152, 30, 24, 253, 237, 245, 55, 95, 253, 244, 45, 237, 240, 223, 189, + 250, 243, 95, 127, 120, 249, 213, 79, 223, 253, 245, 21, 159, 56, 199, 105, + 239, 6, 254, 74, 14, 239, 180, 98, 209, 8, 39, 105, 134, 52, 92, 149, + 82, 231, 234, 127, 146, 182, 211, 14, 51, 15, 122, 68, 230, 105, 86, 85, + 63, 87, 63, 32, 24, 18, 236, 186, 76, 50, 108, 22, 136, 13, 24, 14, + 61, 127, 229, 36, 7, 209, 53, 151, 218, 222, 35, 161, 144, 85, 219, 120, + 150, 3, 231, 235, 101, 168, 158, 192, 180, 43, 60, 255, 252, 122, 113, 138, + 255, 85, 81, 63, 68, 104, 187, 58, 175, 212, 228, 100, 179, 140, 10, 206, + 91, 37, 62, 245, 149, 55, 153, 52, 230, 20, 24, 145, 215, 145, 90, 247, + 214, 104, 76, 251, 225, 198, 224, 68, 62, 5, 222, 38, 224, 226, 51, 159, + 225, 180, 15, 219, 107, 169, 0, 199, 38, 83, 61, 68, 204, 254, 232, 129, + 232, 46, 103, 184, 248, 8, 89, 30, 169, 130, 198, 103, 26, 141, 223, 96, + 87, 176, 145, 201, 238, 95, 22, 54, 46, 123, 209, 61, 76, 176, 26, 230, + 186, 20, 207, 47, 61, 178, 58, 46, 195, 137, 156, 178, 138, 1, 1, 109, + 133, 111, 30, 143, 63, 14, 88, 75, 141, 233, 186, 250, 55, 129, 114, 130, + 6, 5, 202, 231, 159, 213, 27, 231, 43, 88, 220, 33, 106, 168, 38, 95, + 177, 203, 20, 35, 80, 170, 45, 177, 185, 11, 207, 19, 147, 181, 208, 178, + 252, 124, 242, 134, 32, 3, 169, 9, 120, 120, 192, 226, 8, 90, 139, 249, + 52, 186, 30, 227, 172, 137, 36, 235, 57, 77, 68, 118, 147, 179, 156, 225, + 142, 133, 182, 212, 211, 117, 186, 165, 171, 123, 49, 69, 3, 133, 177, 191, + 177, 48, 189, 98, 58, 227, 43, 219, 225, 249, 137, 174, 202, 89, 91, 181, + 33, 124, 156, 175, 96, 94, 76, 125, 249, 31, 182, 102, 51, 177, 38, 18, + 0, 175, 225, 175, 7, 46, 135, 243, 51, 205, 248, 231, 50, 246, 104, 235, + 173, 88, 162, 122, 255, 58, 132, 46, 108, 14, 253, 7, 183, 221, 96, 227, + 22, 49, 110, 19, 139, 117, 234, 33, 76, 86, 93, 132, 252, 165, 44, 65, + 143, 214, 33, 6, 197, 174, 115, 110, 131, 210, 45, 113, 187, 71, 95, 72, + 112, 45, 194, 159, 85, 35, 21, 157, 205, 105, 146, 13, 54, 214, 24, 77, + 51, 188, 214, 220, 139, 197, 161, 92, 197, 51, 109, 48, 113, 48, 54, 6, + 227, 79, 136, 201, 49, 15, 174, 97, 121, 232, 202, 87, 165, 125, 48, 25, + 52, 45, 130, 222, 132, 29, 248, 72, 255, 249, 234, 233, 253, 133, 54, 248, + 223, 123, 6, 28, 237, 156, 1, 183, 214, 12, 16, 202, 55, 235, 146, 89, + 150, 245, 72, 152, 136, 30, 233, 234, 12, 221, 45, 60, 190, 47, 170, 253, + 154, 95, 237, 195, 37, 116, 139, 237, 76, 250, 112, 9, 253, 101, 165, 118, + 90, 162, 50, 52, 82, 23, 21, 220, 202, 132, 183, 43, 118, 43, 183, 174, + 92, 158, 150, 160, 37, 66, 12, 141, 154, 239, 31, 75, 16, 28, 13, 139, + 210, 104, 245, 224, 21, 31, 143, 30, 219, 170, 52, 42, 27, 121, 218, 105, + 158, 206, 182, 60, 71, 151, 214, 69, 208, 31, 68, 94, 73, 54, 131, 104, + 9, 179, 214, 148, 113, 29, 216, 84, 205, 177, 87, 202, 30, 174, 42, 240, + 161, 148, 9, 243, 184, 229, 242, 100, 142, 94, 149, 104, 20, 211, 120, 141, + 98, 20, 100, 225, 139, 176, 242, 0, 198, 60, 96, 105, 99, 193, 44, 205, + 232, 107, 188, 152, 226, 231, 85, 198, 154, 232, 9, 82, 93, 254, 110, 45, + 170, 47, 6, 183, 99, 159, 15, 118, 42, 238, 12, 197, 207, 90, 47, 170, + 200, 233, 123, 181, 147, 42, 44, 135, 40, 63, 178, 94, 204, 216, 2, 200, + 61, 166, 90, 147, 118, 194, 96, 72, 143, 5, 30, 11, 199, 2, 31, 218, + 105, 30, 140, 69, 81, 22, 26, 138, 23, 213, 18, 4, 155, 170, 85, 221, + 165, 75, 253, 117, 19, 90, 160, 6, 30, 30, 190, 98, 107, 161, 195, 195, + 153, 49, 28, 202, 117, 169, 41, 231, 214, 77, 221, 171, 22, 114, 156, 83, + 175, 54, 58, 211, 249, 215, 118, 166, 179, 189, 51, 244, 31, 103, 134, 197, + 0, 15, 164, 228, 226, 33, 165, 111, 65, 127, 52, 173, 86, 84, 250, 15, + 237, 234, 21, 247, 149, 91, 81, 211, 190, 172, 39, 125, 102, 103, 16, 89, + 12, 52, 66, 155, 251, 194, 162, 46, 217, 155, 102, 61, 90, 0, 187, 178, + 182, 104, 171, 76, 246, 224, 227, 106, 99, 26, 216, 210, 36, 225, 133, 94, + 35, 115, 26, 254, 79, 47, 106, 105, 132, 32, 235, 82, 1, 24, 43, 120, + 68, 163, 53, 81, 226, 243, 136, 41, 53, 45, 109, 73, 113, 169, 0, 190, + 24, 173, 24, 120, 149, 180, 218, 36, 50, 245, 74, 253, 26, 115, 4, 114, + 196, 111, 66, 124, 111, 142, 198, 241, 222, 196, 238, 121, 175, 126, 67, 252, + 139, 181, 29, 227, 250, 59, 14, 132, 57, 155, 198, 124, 75, 14, 211, 82, + 219, 147, 247, 140, 113, 183, 85, 187, 139, 187, 5, 33, 148, 17, 48, 74, + 54, 190, 218, 134, 211, 241, 120, 122, 203, 81, 201, 140, 217, 99, 18, 102, + 41, 211, 74, 19, 90, 209, 14, 160, 109, 98, 50, 38, 209, 34, 165, 82, + 118, 73, 103, 213, 92, 59, 73, 96, 54, 84, 37, 25, 139, 174, 13, 254, + 68, 125, 149, 196, 158, 18, 119, 109, 252, 81, 172, 179, 81, 68, 162, 214, + 164, 206, 231, 216, 235, 91, 210, 79, 73, 111, 20, 215, 195, 79, 240, 91, + 57, 137, 51, 117, 86, 229, 130, 75, 111, 92, 67, 237, 49, 227, 38, 219, + 8, 209, 202, 145, 144, 9, 3, 118, 175, 1, 132, 47, 96, 113, 157, 180, + 138, 125, 239, 5, 236, 181, 142, 43, 8, 120, 252, 9, 29, 124, 195, 145, + 175, 131, 8, 249, 36, 145, 41, 169, 186, 123, 68, 225, 170, 198, 124, 27, + 175, 6, 200, 180, 211, 110, 105, 250, 98, 30, 94, 95, 19, 177, 110, 111, + 118, 166, 189, 112, 173, 7, 97, 35, 25, 29, 221, 198, 95, 165, 246, 33, + 118, 99, 131, 76, 137, 123, 201, 215, 60, 216, 207, 103, 174, 197, 177, 77, + 104, 255, 169, 125, 2, 154, 104, 148, 40, 148, 68, 31, 101, 40, 153, 250, + 92, 213, 235, 243, 13, 13, 125, 199, 38, 9, 42, 86, 56, 246, 39, 86, + 69, 149, 114, 55, 186, 210, 13, 168, 156, 168, 87, 122, 27, 218, 192, 167, + 21, 52, 15, 69, 136, 99, 91, 134, 132, 25, 29, 67, 19, 1, 220, 245, + 93, 10, 224, 136, 24, 29, 190, 58, 56, 80, 114, 169, 194, 242, 209, 40, + 104, 27, 76, 153, 221, 77, 93, 153, 242, 14, 199, 204, 72, 69, 202, 216, + 200, 192, 117, 4, 198, 152, 30, 218, 55, 79, 255, 76, 115, 229, 207, 21, + 192, 157, 247, 34, 218, 31, 47, 90, 174, 213, 15, 218, 96, 179, 51, 160, + 220, 29, 254, 153, 151, 31, 234, 161, 216, 125, 243, 44, 106, 108, 228, 129, + 4, 134, 60, 56, 32, 197, 243, 102, 14, 190, 224, 107, 193, 145, 119, 85, + 101, 223, 6, 46, 196, 76, 116, 44, 137, 97, 88, 219, 132, 96, 44, 150, + 19, 16, 58, 97, 107, 78, 109, 217, 148, 22, 208, 9, 201, 40, 63, 162, + 242, 223, 166, 211, 201, 176, 7, 147, 217, 74, 26, 24, 20, 137, 74, 82, + 31, 11, 171, 135, 45, 129, 86, 75, 130, 246, 93, 156, 52, 204, 164, 98, + 170, 70, 2, 30, 33, 252, 112, 17, 235, 5, 113, 26, 102, 249, 109, 249, + 124, 78, 136, 184, 191, 254, 98, 78, 76, 241, 186, 160, 22, 62, 38, 19, + 178, 77, 26, 60, 227, 91, 32, 28, 188, 53, 50, 107, 222, 99, 90, 62, + 10, 25, 220, 235, 30, 252, 88, 14, 13, 89, 33, 149, 231, 177, 225, 154, + 117, 122, 21, 236, 52, 143, 51, 71, 243, 211, 68, 230, 138, 59, 139, 125, + 170, 139, 174, 100, 45, 204, 204, 175, 116, 245, 42, 36, 245, 228, 51, 81, + 251, 107, 179, 220, 103, 232, 255, 117, 158, 254, 173, 154, 138, 103, 192, 236, + 181, 153, 4, 175, 19, 232, 91, 230, 193, 235, 46, 46, 100, 101, 114, 34, + 161, 48, 167, 76, 225, 56, 188, 9, 23, 247, 153, 18, 246, 7, 123, 216, + 37, 208, 115, 1, 162, 8, 24, 95, 64, 15, 199, 121, 80, 105, 114, 97, + 41, 184, 102, 238, 93, 139, 197, 63, 194, 106, 37, 111, 6, 115, 179, 125, + 33, 69, 87, 189, 249, 245, 150, 145, 74, 98, 142, 22, 15, 89, 18, 145, + 244, 205, 211, 175, 54, 235, 197, 48, 86, 43, 95, 21, 12, 90, 82, 235, + 214, 81, 235, 125, 69, 13, 250, 202, 128, 231, 56, 190, 86, 3, 146, 89, + 145, 80, 20, 173, 209, 22, 207, 229, 31, 232, 184, 190, 218, 142, 89, 182, + 110, 159, 217, 157, 74, 163, 100, 179, 106, 241, 219, 112, 38, 49, 124, 15, + 214, 46, 130, 247, 114, 166, 117, 42, 182, 8, 171, 102, 86, 106, 195, 126, + 65, 62, 224, 42, 52, 15, 66, 93, 172, 148, 219, 21, 225, 193, 114, 94, + 108, 158, 176, 218, 246, 82, 11, 37, 187, 35, 59, 154, 88, 241, 137, 121, + 142, 20, 215, 71, 119, 148, 192, 86, 171, 106, 219, 53, 117, 209, 196, 155, + 0, 40, 115, 136, 157, 223, 34, 212, 93, 63, 153, 218, 253, 209, 50, 122, + 139, 168, 39, 180, 144, 205, 167, 177, 207, 82, 17, 155, 200, 86, 103, 44, + 21, 85, 187, 125, 95, 56, 252, 139, 217, 101, 237, 44, 185, 208, 208, 237, + 227, 230, 3, 84, 68, 36, 60, 18, 210, 50, 133, 180, 12, 100, 129, 114, + 21, 73, 16, 96, 174, 251, 36, 233, 71, 85, 140, 10, 231, 44, 117, 199, + 70, 156, 96, 238, 24, 226, 67, 119, 204, 242, 67, 119, 198, 2, 149, 210, + 192, 60, 87, 82, 210, 188, 221, 202, 89, 197, 237, 66, 140, 234, 146, 28, + 5, 229, 111, 119, 70, 50, 220, 248, 133, 190, 138, 1, 97, 35, 148, 186, + 46, 186, 179, 67, 239, 146, 74, 92, 81, 137, 74, 88, 97, 145, 194, 124, + 104, 179, 232, 113, 94, 49, 50, 132, 78, 191, 116, 77, 6, 18, 37, 186, + 227, 122, 119, 86, 111, 115, 235, 234, 126, 135, 100, 136, 147, 20, 46, 138, + 55, 43, 38, 118, 108, 53, 133, 187, 165, 194, 206, 67, 21, 30, 153, 10, + 59, 186, 194, 35, 84, 120, 120, 216, 21, 33, 108, 3, 51, 106, 3, 51, + 77, 193, 140, 218, 130, 153, 164, 41, 135, 151, 84, 176, 91, 169, 87, 204, + 189, 16, 71, 164, 227, 178, 208, 3, 76, 76, 136, 191, 233, 178, 223, 138, + 234, 204, 125, 7, 255, 55, 35, 110, 167, 139, 221, 66, 198, 48, 127, 221, + 100, 198, 151, 77, 222, 145, 192, 164, 227, 17, 115, 112, 77, 24, 199, 64, + 120, 70, 12, 91, 235, 165, 211, 230, 80, 180, 111, 156, 138, 192, 70, 211, + 25, 126, 5, 193, 178, 78, 75, 168, 134, 192, 190, 64, 37, 23, 176, 167, + 59, 118, 143, 97, 85, 231, 122, 237, 142, 219, 249, 210, 237, 16, 178, 144, + 199, 189, 232, 28, 225, 221, 107, 31, 187, 71, 30, 12, 131, 239, 27, 214, + 125, 34, 221, 65, 75, 130, 23, 170, 134, 184, 138, 93, 208, 231, 189, 187, + 171, 159, 89, 196, 208, 73, 250, 25, 117, 152, 36, 253, 108, 93, 189, 1, + 24, 46, 223, 66, 30, 254, 147, 81, 7, 204, 206, 88, 196, 212, 117, 90, + 122, 1, 73, 113, 245, 130, 226, 206, 106, 159, 217, 25, 79, 75, 79, 102, + 24, 190, 234, 76, 148, 237, 102, 38, 226, 250, 15, 19, 17, 38, 32, 145, + 145, 212, 72, 109, 56, 244, 143, 105, 62, 154, 249, 138, 28, 93, 38, 204, + 234, 56, 87, 33, 230, 177, 203, 115, 242, 220, 167, 217, 134, 246, 140, 33, + 54, 231, 167, 179, 5, 77, 174, 58, 81, 109, 122, 72, 164, 131, 239, 54, + 0, 159, 20, 116, 99, 190, 145, 11, 55, 153, 54, 178, 209, 138, 161, 113, + 251, 238, 124, 46, 237, 246, 51, 104, 194, 215, 234, 70, 193, 218, 217, 156, + 170, 56, 123, 135, 18, 79, 52, 12, 106, 231, 28, 88, 153, 39, 243, 36, + 89, 142, 234, 245, 121, 141, 87, 154, 100, 246, 185, 73, 39, 221, 121, 157, + 166, 180, 153, 33, 252, 162, 59, 10, 38, 168, 202, 1, 176, 151, 60, 182, + 174, 100, 209, 41, 26, 215, 88, 231, 116, 10, 193, 215, 79, 246, 60, 119, + 51, 133, 184, 182, 118, 61, 45, 161, 155, 170, 19, 234, 117, 183, 52, 78, + 72, 133, 167, 7, 53, 91, 97, 44, 97, 108, 217, 114, 211, 116, 158, 242, + 227, 89, 221, 163, 28, 148, 5, 105, 23, 99, 221, 114, 173, 242, 72, 87, + 222, 211, 18, 183, 130, 102, 85, 181, 52, 142, 54, 22, 224, 205, 42, 41, + 233, 69, 85, 96, 206, 100, 197, 104, 86, 78, 21, 119, 74, 167, 98, 121, + 101, 0, 227, 40, 169, 126, 118, 56, 142, 52, 250, 106, 39, 213, 36, 247, + 70, 190, 72, 178, 216, 138, 153, 167, 45, 119, 214, 186, 164, 169, 235, 206, + 91, 245, 89, 235, 144, 15, 237, 168, 192, 211, 36, 102, 186, 118, 135, 102, + 133, 81, 230, 139, 251, 85, 214, 50, 179, 214, 96, 50, 189, 129, 0, 6, + 7, 48, 53, 158, 112, 68, 15, 135, 184, 54, 87, 59, 177, 136, 100, 147, + 56, 222, 109, 39, 142, 119, 54, 113, 188, 179, 136, 35, 131, 220, 204, 154, + 41, 171, 2, 245, 134, 250, 146, 44, 49, 110, 178, 178, 184, 201, 130, 146, + 91, 66, 204, 155, 94, 156, 232, 71, 167, 232, 245, 8, 63, 58, 69, 79, + 25, 252, 136, 122, 238, 157, 233, 39, 13, 111, 75, 207, 236, 99, 161, 155, + 236, 36, 172, 17, 205, 240, 240, 158, 205, 13, 145, 242, 90, 170, 123, 60, + 166, 33, 24, 215, 145, 131, 129, 95, 224, 217, 116, 120, 99, 156, 172, 97, + 50, 106, 194, 185, 110, 7, 254, 165, 237, 107, 86, 74, 251, 248, 196, 159, + 181, 94, 20, 33, 202, 158, 215, 15, 162, 172, 228, 232, 75, 140, 184, 36, + 34, 90, 218, 39, 126, 229, 160, 226, 148, 60, 37, 251, 24, 78, 109, 137, + 191, 26, 135, 87, 107, 185, 6, 202, 58, 16, 14, 140, 40, 249, 205, 117, + 80, 158, 222, 111, 101, 98, 191, 61, 27, 99, 133, 197, 100, 126, 235, 10, + 202, 210, 98, 104, 66, 245, 233, 219, 154, 20, 60, 107, 189, 24, 244, 230, + 8, 169, 28, 204, 23, 124, 151, 240, 109, 141, 247, 25, 238, 7, 222, 61, + 23, 25, 204, 43, 135, 124, 39, 28, 113, 195, 87, 63, 175, 77, 128, 165, + 177, 218, 84, 193, 148, 219, 54, 255, 87, 138, 174, 132, 91, 195, 45, 205, + 161, 223, 178, 226, 204, 73, 186, 219, 87, 221, 97, 121, 53, 92, 51, 190, + 248, 162, 230, 112, 45, 215, 228, 206, 221, 209, 58, 181, 21, 200, 92, 206, + 35, 124, 105, 102, 246, 169, 122, 53, 141, 234, 194, 7, 51, 71, 41, 102, + 162, 28, 228, 5, 108, 49, 215, 82, 50, 59, 183, 90, 97, 9, 95, 43, + 30, 67, 37, 250, 144, 114, 159, 100, 27, 115, 194, 195, 39, 209, 210, 30, + 209, 17, 248, 230, 53, 43, 214, 39, 201, 169, 104, 158, 73, 50, 178, 116, + 146, 152, 8, 196, 73, 138, 145, 250, 252, 150, 73, 1, 117, 248, 185, 190, + 62, 195, 205, 63, 238, 107, 183, 162, 178, 45, 75, 110, 244, 225, 108, 189, + 93, 251, 133, 77, 203, 103, 201, 117, 210, 150, 203, 145, 185, 120, 220, 228, + 64, 148, 216, 41, 90, 76, 204, 121, 232, 12, 177, 199, 248, 48, 212, 174, + 222, 178, 120, 205, 242, 84, 69, 76, 72, 8, 247, 109, 243, 120, 65, 4, + 232, 201, 228, 249, 191, 197, 60, 248, 154, 121, 192, 65, 130, 202, 100, 218, + 159, 59, 40, 230, 51, 231, 105, 53, 115, 211, 173, 23, 88, 154, 104, 188, + 70, 60, 229, 234, 188, 74, 27, 12, 191, 104, 157, 160, 253, 69, 123, 205, + 132, 184, 247, 121, 110, 5, 170, 101, 183, 159, 215, 80, 137, 47, 166, 216, + 97, 52, 115, 27, 12, 236, 181, 206, 26, 199, 214, 169, 89, 245, 156, 82, + 239, 226, 231, 22, 110, 181, 27, 134, 24, 28, 113, 50, 149, 208, 27, 123, + 54, 225, 221, 76, 40, 190, 96, 223, 42, 209, 242, 134, 29, 159, 17, 31, + 214, 96, 53, 65, 139, 94, 209, 36, 105, 233, 27, 249, 39, 4, 204, 154, + 170, 114, 31, 217, 76, 23, 200, 196, 171, 95, 12, 61, 242, 86, 226, 95, + 92, 84, 28, 190, 145, 140, 91, 117, 173, 75, 218, 221, 173, 45, 141, 179, + 56, 191, 128, 158, 245, 106, 203, 66, 108, 235, 82, 215, 230, 238, 168, 205, + 248, 52, 96, 224, 82, 244, 220, 51, 119, 165, 81, 184, 186, 145, 215, 172, + 12, 133, 69, 96, 0, 112, 72, 69, 52, 42, 5, 121, 181, 20, 134, 181, + 140, 100, 202, 139, 169, 16, 206, 124, 64, 36, 135, 201, 18, 144, 65, 31, + 95, 194, 54, 210, 182, 249, 213, 102, 140, 137, 75, 2, 181, 177, 16, 201, + 85, 110, 203, 226, 209, 146, 184, 205, 85, 174, 254, 197, 211, 242, 240, 50, + 241, 175, 160, 28, 90, 116, 64, 128, 34, 69, 28, 61, 167, 193, 5, 222, + 106, 46, 206, 103, 173, 133, 124, 157, 188, 153, 208, 131, 191, 172, 75, 214, + 1, 131, 239, 193, 134, 70, 217, 41, 180, 235, 21, 159, 69, 148, 219, 235, + 204, 150, 34, 250, 4, 49, 156, 122, 82, 182, 114, 170, 205, 149, 149, 237, + 47, 30, 94, 200, 82, 159, 4, 237, 227, 103, 244, 65, 243, 68, 249, 100, + 40, 211, 50, 201, 207, 142, 143, 59, 248, 96, 148, 72, 154, 133, 48, 13, + 216, 185, 32, 110, 202, 32, 126, 193, 242, 161, 23, 137, 119, 60, 254, 62, + 4, 153, 220, 98, 53, 79, 88, 39, 123, 133, 154, 167, 108, 249, 71, 50, + 137, 60, 185, 37, 119, 101, 49, 161, 126, 93, 87, 76, 102, 89, 66, 68, + 154, 194, 42, 148, 237, 205, 166, 196, 227, 150, 178, 57, 86, 15, 230, 184, + 216, 148, 154, 168, 249, 56, 190, 182, 209, 82, 173, 188, 0, 87, 120, 146, + 73, 92, 33, 113, 93, 161, 101, 243, 178, 242, 65, 88, 202, 232, 65, 121, + 131, 203, 237, 50, 47, 170, 185, 44, 173, 83, 86, 24, 105, 4, 131, 88, + 10, 16, 140, 228, 12, 130, 153, 135, 11, 133, 135, 227, 143, 225, 37, 120, + 184, 48, 121, 195, 70, 149, 48, 114, 58, 173, 102, 118, 150, 178, 140, 9, + 145, 190, 3, 218, 119, 186, 179, 138, 107, 200, 207, 173, 232, 85, 83, 239, + 233, 91, 242, 112, 144, 196, 138, 91, 226, 6, 87, 182, 229, 178, 251, 74, + 185, 237, 215, 148, 18, 242, 123, 98, 127, 147, 160, 69, 105, 42, 93, 231, + 206, 192, 94, 192, 199, 74, 14, 223, 219, 188, 140, 211, 204, 54, 159, 190, + 208, 159, 150, 139, 197, 52, 202, 127, 124, 38, 31, 89, 179, 186, 165, 32, + 14, 175, 194, 141, 130, 207, 211, 143, 211, 229, 98, 91, 81, 150, 213, 242, + 31, 117, 91, 97, 244, 147, 255, 228, 181, 228, 155, 14, 254, 55, 149, 178, + 224, 85, 158, 248, 243, 205, 137, 59, 11, 4, 103, 155, 4, 72, 139, 76, + 58, 79, 205, 210, 98, 145, 210, 44, 208, 180, 100, 190, 93, 72, 74, 102, + 198, 38, 229, 146, 89, 235, 165, 5, 247, 33, 157, 94, 203, 16, 78, 197, + 30, 54, 17, 209, 146, 154, 91, 70, 12, 182, 69, 167, 147, 106, 186, 232, + 205, 221, 194, 142, 155, 53, 99, 238, 102, 103, 188, 91, 52, 227, 255, 109, + 81, 132, 55, 224, 197, 173, 216, 184, 58, 60, 148, 212, 172, 92, 43, 170, + 60, 64, 221, 54, 87, 185, 144, 111, 96, 102, 113, 154, 221, 61, 108, 206, + 216, 226, 121, 89, 147, 107, 210, 69, 119, 220, 130, 42, 215, 195, 159, 54, + 243, 205, 115, 214, 242, 49, 200, 93, 109, 73, 207, 91, 168, 61, 9, 163, + 90, 7, 60, 163, 162, 54, 169, 82, 207, 33, 170, 168, 227, 207, 1, 213, + 179, 11, 180, 117, 234, 67, 176, 47, 52, 152, 195, 195, 249, 229, 229, 134, + 16, 190, 139, 49, 119, 43, 47, 216, 192, 7, 216, 22, 224, 154, 117, 45, + 64, 116, 194, 17, 164, 45, 169, 153, 123, 131, 56, 155, 144, 91, 241, 184, + 63, 98, 251, 210, 40, 165, 135, 211, 126, 121, 8, 191, 25, 121, 233, 85, + 165, 174, 252, 53, 239, 123, 190, 174, 41, 235, 5, 25, 158, 220, 106, 137, + 42, 129, 43, 12, 89, 226, 62, 74, 95, 128, 230, 16, 224, 169, 173, 51, + 183, 137, 9, 181, 161, 244, 209, 125, 150, 67, 91, 233, 155, 247, 235, 12, + 79, 246, 236, 40, 225, 201, 42, 124, 240, 195, 102, 189, 176, 219, 163, 164, + 95, 82, 231, 70, 55, 132, 225, 148, 223, 42, 183, 75, 197, 204, 151, 152, + 215, 156, 168, 165, 106, 89, 57, 140, 176, 111, 190, 198, 211, 249, 162, 203, + 22, 15, 135, 110, 100, 67, 146, 239, 169, 183, 1, 171, 205, 186, 185, 9, + 11, 105, 181, 77, 223, 197, 200, 116, 210, 249, 94, 27, 84, 228, 77, 28, + 78, 18, 183, 3, 14, 27, 56, 38, 131, 148, 142, 94, 233, 80, 67, 188, + 72, 194, 154, 95, 50, 236, 97, 249, 220, 98, 87, 207, 133, 89, 149, 123, + 45, 197, 232, 224, 62, 230, 177, 33, 137, 73, 171, 207, 211, 224, 209, 114, + 178, 230, 242, 209, 26, 114, 233, 195, 53, 185, 94, 227, 28, 28, 28, 40, + 211, 43, 203, 38, 106, 97, 153, 111, 26, 19, 208, 170, 99, 117, 199, 73, + 79, 179, 167, 17, 88, 242, 27, 31, 167, 112, 85, 90, 182, 226, 27, 255, + 102, 49, 141, 171, 55, 181, 211, 155, 51, 175, 245, 226, 130, 87, 128, 248, + 230, 242, 228, 34, 190, 161, 221, 232, 151, 181, 211, 76, 11, 180, 247, 42, + 224, 90, 85, 28, 237, 85, 226, 36, 45, 112, 188, 87, 129, 154, 34, 92, + 24, 243, 84, 96, 38, 143, 23, 151, 73, 76, 14, 250, 49, 96, 39, 38, + 51, 44, 241, 61, 86, 79, 121, 119, 246, 136, 167, 183, 77, 162, 9, 95, + 215, 169, 111, 27, 110, 53, 228, 239, 229, 115, 153, 155, 25, 82, 198, 133, + 3, 3, 234, 86, 69, 16, 153, 66, 228, 230, 184, 80, 44, 225, 68, 25, + 121, 39, 210, 242, 142, 163, 170, 125, 115, 227, 173, 226, 36, 223, 116, 26, + 73, 171, 53, 43, 180, 141, 136, 167, 218, 37, 15, 209, 240, 246, 206, 179, + 139, 132, 171, 96, 1, 159, 154, 227, 251, 15, 199, 193, 167, 233, 183, 233, + 41, 136, 219, 201, 98, 227, 129, 14, 18, 221, 127, 43, 14, 136, 185, 66, + 30, 123, 54, 76, 22, 119, 70, 201, 34, 183, 231, 42, 247, 87, 57, 191, + 46, 88, 228, 138, 39, 177, 54, 21, 196, 52, 246, 172, 44, 38, 249, 161, + 137, 44, 249, 172, 169, 204, 154, 203, 102, 233, 149, 191, 202, 152, 51, 177, + 47, 184, 222, 208, 95, 241, 68, 184, 240, 220, 246, 101, 141, 24, 196, 35, + 215, 187, 212, 55, 128, 244, 148, 250, 172, 93, 91, 23, 172, 90, 238, 48, + 135, 10, 75, 36, 111, 150, 95, 125, 42, 169, 156, 54, 163, 83, 202, 199, + 70, 84, 151, 79, 252, 124, 145, 202, 165, 113, 240, 168, 53, 180, 191, 56, + 165, 120, 222, 103, 3, 99, 135, 75, 57, 176, 50, 30, 4, 172, 62, 186, + 48, 148, 144, 20, 119, 46, 55, 92, 254, 177, 199, 63, 64, 52, 26, 108, + 125, 52, 53, 59, 3, 71, 40, 124, 206, 188, 95, 211, 6, 174, 4, 184, + 38, 12, 207, 188, 207, 91, 63, 82, 192, 227, 105, 97, 203, 112, 154, 90, + 95, 200, 153, 158, 36, 135, 219, 58, 179, 36, 184, 138, 56, 71, 102, 102, + 187, 214, 153, 152, 110, 196, 59, 195, 25, 185, 234, 221, 89, 218, 8, 5, + 254, 194, 100, 119, 85, 42, 181, 207, 251, 114, 126, 245, 174, 166, 181, 136, + 105, 182, 23, 114, 110, 164, 123, 169, 85, 157, 208, 222, 41, 59, 253, 226, + 25, 24, 167, 46, 88, 146, 4, 190, 156, 132, 129, 112, 22, 212, 112, 236, + 114, 190, 122, 34, 134, 203, 244, 238, 86, 126, 146, 212, 166, 112, 97, 93, + 177, 167, 205, 102, 249, 10, 105, 156, 65, 247, 93, 78, 250, 133, 89, 202, + 234, 34, 24, 183, 150, 38, 130, 1, 112, 167, 12, 15, 206, 57, 78, 75, + 193, 180, 111, 242, 152, 78, 129, 251, 126, 130, 244, 247, 239, 141, 73, 219, + 5, 189, 18, 43, 243, 68, 75, 199, 153, 190, 210, 167, 75, 27, 17, 244, + 126, 232, 63, 147, 94, 132, 8, 186, 130, 10, 170, 86, 191, 141, 167, 195, + 92, 191, 169, 101, 103, 173, 26, 42, 53, 221, 215, 66, 64, 166, 162, 4, + 232, 139, 202, 89, 120, 94, 57, 169, 156, 225, 210, 209, 102, 78, 26, 185, + 206, 165, 107, 8, 234, 93, 125, 182, 37, 15, 253, 255, 78, 213, 213, 44, + 11, 25, 183, 42, 34, 0, 111, 94, 157, 139, 81, 73, 134, 223, 55, 104, + 113, 126, 225, 101, 211, 158, 69, 200, 13, 246, 147, 103, 84, 118, 194, 88, + 209, 161, 10, 245, 139, 235, 154, 202, 41, 28, 221, 109, 57, 141, 139, 151, + 76, 110, 101, 199, 175, 93, 101, 78, 20, 8, 180, 62, 90, 232, 230, 191, + 8, 40, 253, 181, 16, 68, 170, 193, 36, 48, 150, 58, 115, 75, 14, 134, + 103, 101, 51, 122, 202, 85, 129, 130, 115, 173, 50, 234, 206, 195, 180, 112, + 146, 86, 216, 164, 68, 213, 73, 245, 165, 106, 79, 71, 157, 40, 167, 32, + 143, 64, 77, 243, 9, 251, 61, 239, 247, 102, 161, 4, 5, 82, 217, 213, + 83, 37, 177, 149, 197, 249, 136, 249, 136, 99, 148, 53, 86, 210, 22, 238, + 119, 49, 197, 59, 101, 193, 156, 195, 39, 146, 85, 39, 155, 215, 169, 153, + 192, 143, 165, 205, 2, 78, 25, 213, 156, 228, 135, 120, 93, 206, 14, 107, + 57, 69, 101, 217, 70, 76, 57, 233, 15, 147, 156, 217, 100, 86, 57, 77, + 233, 218, 157, 101, 244, 93, 174, 37, 255, 137, 140, 148, 208, 104, 121, 53, + 91, 103, 148, 65, 235, 140, 197, 160, 223, 45, 28, 10, 41, 150, 66, 165, + 17, 177, 170, 232, 110, 207, 151, 251, 98, 9, 143, 107, 237, 250, 169, 63, + 154, 134, 253, 128, 221, 10, 103, 243, 66, 45, 179, 102, 23, 195, 146, 165, + 162, 157, 179, 194, 241, 252, 206, 220, 200, 81, 225, 144, 217, 177, 175, 250, + 169, 135, 33, 134, 178, 129, 67, 41, 46, 50, 251, 218, 237, 153, 220, 189, + 33, 174, 127, 244, 72, 2, 26, 15, 167, 211, 113, 62, 127, 175, 188, 234, + 173, 197, 225, 155, 218, 66, 101, 153, 140, 18, 5, 59, 110, 248, 229, 62, + 145, 28, 181, 202, 21, 182, 141, 47, 42, 151, 77, 191, 216, 111, 85, 196, + 134, 138, 121, 220, 155, 6, 118, 220, 35, 29, 60, 110, 75, 198, 94, 107, + 237, 242, 13, 241, 7, 178, 121, 251, 101, 107, 103, 179, 109, 105, 150, 239, + 119, 68, 161, 191, 13, 76, 199, 128, 169, 201, 184, 60, 125, 112, 28, 4, + 93, 196, 174, 44, 122, 87, 224, 76, 84, 86, 25, 66, 127, 58, 248, 115, + 132, 63, 199, 248, 243, 12, 127, 190, 192, 159, 231, 248, 243, 37, 254, 244, + 42, 198, 28, 174, 143, 63, 3, 252, 9, 240, 103, 88, 81, 151, 216, 43, + 34, 98, 123, 110, 8, 188, 83, 56, 108, 206, 41, 213, 75, 245, 95, 84, + 111, 206, 207, 143, 106, 159, 123, 199, 151, 46, 94, 111, 240, 164, 46, 177, + 51, 232, 81, 140, 3, 245, 64, 135, 84, 58, 254, 5, 53, 165, 20, 97, + 110, 157, 126, 58, 112, 196, 56, 123, 136, 50, 214, 22, 230, 79, 179, 121, + 40, 239, 36, 215, 240, 98, 40, 151, 132, 49, 98, 221, 63, 237, 210, 201, + 22, 30, 179, 209, 6, 172, 14, 46, 248, 88, 128, 181, 124, 72, 186, 60, + 73, 139, 172, 54, 138, 172, 77, 145, 85, 82, 100, 141, 34, 23, 124, 46, + 160, 83, 46, 137, 63, 173, 157, 228, 225, 158, 150, 28, 225, 108, 99, 127, + 219, 68, 63, 117, 98, 154, 235, 184, 90, 90, 1, 225, 225, 133, 149, 186, + 230, 37, 213, 226, 154, 20, 209, 51, 235, 147, 199, 238, 30, 83, 55, 183, + 77, 20, 174, 239, 36, 42, 55, 121, 137, 95, 251, 101, 123, 29, 45, 106, + 244, 234, 151, 95, 202, 24, 11, 60, 80, 41, 30, 72, 147, 216, 94, 151, + 211, 85, 147, 215, 122, 43, 80, 104, 206, 115, 197, 114, 49, 124, 222, 230, + 59, 134, 169, 11, 1, 115, 59, 68, 187, 148, 165, 221, 5, 81, 51, 99, + 22, 49, 26, 137, 83, 92, 106, 60, 110, 173, 211, 126, 245, 148, 255, 40, + 92, 110, 8, 146, 59, 103, 39, 250, 22, 150, 147, 24, 4, 59, 141, 164, + 128, 202, 255, 83, 77, 180, 28, 118, 244, 13, 85, 179, 193, 127, 19, 136, + 195, 35, 152, 74, 17, 248, 191, 137, 136, 198, 249, 248, 106, 126, 22, 128, + 92, 57, 51, 170, 20, 190, 1, 96, 110, 5, 152, 27, 155, 52, 79, 235, + 52, 104, 244, 186, 134, 199, 202, 45, 13, 203, 93, 37, 206, 182, 233, 123, + 218, 5, 162, 56, 48, 93, 254, 58, 248, 250, 187, 239, 191, 87, 55, 237, + 134, 247, 16, 184, 126, 208, 15, 199, 227, 6, 238, 103, 53, 199, 128, 2, + 215, 185, 223, 203, 67, 87, 224, 116, 255, 135, 224, 212, 131, 72, 194, 80, + 102, 234, 253, 75, 226, 34, 143, 111, 208, 58, 34, 87, 182, 106, 25, 149, + 206, 255, 90, 29, 144, 238, 168, 137, 216, 254, 84, 125, 143, 25, 162, 254, + 199, 92, 159, 58, 17, 44, 128, 149, 57, 81, 241, 72, 222, 190, 141, 6, + 39, 22, 138, 170, 90, 171, 96, 200, 98, 153, 146, 75, 237, 119, 209, 47, + 100, 118, 120, 219, 16, 127, 237, 8, 87, 232, 148, 61, 71, 252, 209, 45, + 149, 227, 88, 54, 240, 56, 253, 134, 183, 91, 100, 88, 67, 24, 160, 173, + 49, 212, 150, 234, 16, 110, 68, 169, 207, 114, 111, 168, 141, 214, 95, 224, + 227, 73, 232, 32, 239, 221, 103, 237, 23, 233, 161, 96, 88, 59, 89, 206, + 102, 201, 11, 231, 232, 103, 142, 13, 67, 8, 54, 128, 57, 5, 152, 86, + 229, 68, 222, 66, 188, 121, 230, 45, 192, 91, 199, 188, 245, 240, 118, 100, + 222, 98, 188, 29, 155, 183, 5, 222, 190, 48, 111, 87, 120, 123, 78, 111, + 212, 182, 165, 146, 131, 16, 57, 170, 47, 214, 191, 240, 5, 206, 188, 246, + 197, 168, 148, 229, 227, 134, 183, 152, 104, 162, 86, 191, 196, 56, 94, 91, + 69, 107, 49, 246, 152, 249, 201, 86, 65, 114, 161, 222, 133, 216, 222, 233, + 116, 38, 38, 62, 153, 12, 51, 243, 169, 245, 130, 7, 58, 118, 99, 57, + 36, 49, 37, 97, 213, 19, 211, 182, 145, 46, 138, 219, 212, 218, 186, 141, + 15, 232, 137, 144, 43, 171, 240, 93, 193, 241, 17, 220, 45, 225, 42, 135, + 89, 34, 223, 56, 39, 148, 198, 4, 133, 18, 93, 175, 209, 130, 59, 3, + 206, 201, 169, 153, 124, 246, 250, 149, 100, 75, 99, 211, 33, 211, 133, 40, + 211, 244, 202, 215, 77, 2, 246, 21, 40, 168, 254, 48, 165, 83, 139, 237, + 231, 121, 68, 55, 244, 77, 167, 241, 69, 43, 29, 78, 90, 26, 84, 55, + 139, 122, 106, 223, 234, 106, 173, 180, 240, 188, 54, 30, 124, 17, 87, 36, + 215, 103, 173, 208, 18, 221, 214, 142, 60, 44, 170, 97, 173, 190, 4, 66, + 215, 174, 45, 144, 41, 181, 74, 244, 210, 200, 242, 198, 65, 63, 204, 104, + 176, 2, 140, 6, 66, 153, 144, 53, 59, 135, 128, 179, 11, 123, 6, 78, + 253, 162, 14, 165, 160, 54, 255, 82, 191, 53, 224, 239, 228, 182, 222, 94, + 235, 154, 165, 25, 108, 146, 184, 129, 128, 156, 44, 58, 76, 184, 12, 45, + 163, 7, 209, 195, 82, 254, 134, 144, 111, 58, 204, 93, 150, 205, 43, 219, + 91, 174, 70, 119, 119, 220, 67, 104, 6, 73, 215, 220, 140, 124, 208, 155, + 113, 66, 175, 57, 201, 149, 115, 57, 14, 34, 244, 152, 155, 79, 22, 202, + 104, 145, 24, 194, 204, 235, 236, 5, 184, 185, 147, 22, 204, 134, 102, 83, + 216, 11, 237, 146, 93, 115, 248, 177, 24, 177, 85, 57, 203, 136, 193, 153, + 47, 137, 83, 108, 243, 144, 203, 197, 60, 150, 62, 232, 206, 127, 211, 108, + 51, 132, 138, 150, 111, 25, 177, 242, 161, 120, 53, 207, 98, 246, 202, 231, + 112, 91, 158, 222, 23, 89, 225, 94, 200, 6, 29, 243, 82, 73, 16, 216, + 73, 152, 152, 104, 200, 178, 19, 204, 102, 57, 28, 8, 233, 242, 237, 62, + 136, 168, 108, 42, 129, 196, 140, 97, 48, 26, 87, 129, 142, 185, 194, 55, + 52, 43, 138, 91, 219, 18, 103, 86, 91, 114, 226, 6, 167, 206, 168, 189, + 134, 61, 9, 227, 104, 57, 169, 114, 158, 154, 1, 145, 82, 6, 209, 6, + 13, 43, 90, 34, 3, 140, 166, 200, 184, 219, 132, 98, 209, 201, 64, 46, + 186, 153, 47, 0, 168, 191, 208, 184, 38, 211, 136, 158, 225, 247, 110, 237, + 128, 153, 157, 49, 31, 128, 52, 62, 146, 29, 231, 122, 175, 197, 249, 146, + 134, 76, 205, 139, 232, 127, 73, 141, 125, 222, 90, 217, 127, 51, 59, 126, + 146, 110, 152, 172, 252, 170, 162, 67, 182, 153, 203, 88, 149, 245, 243, 195, + 90, 47, 71, 36, 37, 105, 168, 13, 184, 186, 7, 233, 58, 229, 115, 39, + 161, 108, 202, 182, 42, 71, 135, 101, 72, 122, 148, 64, 66, 19, 72, 91, + 6, 113, 11, 186, 4, 222, 99, 16, 166, 95, 183, 226, 76, 38, 147, 110, + 39, 190, 173, 16, 173, 72, 94, 9, 161, 123, 162, 148, 117, 30, 137, 202, + 35, 135, 138, 140, 180, 8, 130, 237, 173, 185, 175, 15, 116, 21, 48, 31, + 73, 26, 241, 99, 72, 67, 183, 206, 248, 140, 75, 250, 115, 10, 105, 13, + 215, 36, 183, 181, 44, 132, 63, 205, 15, 34, 217, 73, 24, 89, 169, 94, + 130, 254, 73, 239, 206, 74, 111, 127, 0, 129, 231, 219, 63, 28, 79, 123, + 219, 123, 192, 95, 255, 237, 250, 96, 83, 20, 152, 238, 138, 232, 116, 242, + 201, 97, 180, 229, 3, 140, 177, 182, 246, 152, 190, 63, 162, 195, 34, 31, + 183, 214, 31, 219, 11, 49, 2, 219, 218, 40, 254, 252, 41, 155, 181, 87, + 171, 88, 107, 81, 146, 0, 109, 117, 79, 54, 54, 248, 202, 242, 177, 16, + 166, 235, 159, 189, 140, 115, 222, 237, 171, 159, 56, 138, 215, 203, 222, 185, + 103, 148, 22, 152, 235, 209, 154, 65, 39, 171, 157, 103, 212, 150, 148, 234, + 102, 242, 105, 131, 154, 178, 84, 70, 75, 178, 60, 140, 131, 225, 66, 182, + 22, 243, 197, 211, 95, 216, 63, 169, 246, 236, 199, 9, 226, 215, 117, 199, + 110, 131, 158, 239, 68, 55, 53, 42, 69, 53, 189, 24, 76, 51, 252, 132, + 188, 241, 146, 167, 129, 13, 44, 179, 58, 104, 91, 67, 240, 81, 32, 35, + 34, 239, 230, 232, 238, 132, 204, 46, 207, 183, 130, 230, 175, 59, 59, 73, + 116, 17, 46, 44, 145, 0, 149, 186, 233, 100, 78, 232, 202, 113, 118, 19, + 124, 123, 179, 105, 169, 218, 107, 91, 243, 146, 28, 15, 225, 15, 136, 217, + 10, 69, 176, 246, 175, 158, 206, 162, 194, 219, 214, 38, 185, 162, 207, 21, + 232, 199, 143, 170, 59, 222, 186, 51, 46, 163, 183, 209, 244, 54, 218, 218, + 255, 12, 64, 227, 154, 56, 129, 117, 41, 188, 249, 218, 178, 176, 216, 91, + 178, 201, 10, 54, 148, 182, 182, 44, 47, 216, 203, 113, 27, 218, 193, 79, + 169, 35, 201, 51, 189, 39, 58, 36, 30, 116, 31, 7, 172, 251, 176, 60, + 240, 83, 165, 132, 21, 4, 232, 122, 227, 228, 210, 35, 78, 143, 242, 201, + 115, 78, 158, 231, 147, 29, 129, 226, 228, 210, 57, 4, 42, 125, 250, 60, + 159, 30, 93, 197, 252, 65, 229, 227, 200, 33, 10, 134, 235, 108, 164, 54, + 139, 147, 175, 138, 51, 23, 39, 199, 147, 222, 120, 92, 92, 192, 250, 100, + 52, 42, 141, 146, 94, 176, 89, 147, 180, 67, 189, 194, 14, 176, 182, 169, + 87, 228, 227, 191, 183, 122, 69, 183, 241, 1, 245, 10, 114, 89, 234, 21, + 49, 241, 59, 123, 113, 55, 25, 27, 101, 47, 98, 249, 66, 153, 162, 94, + 156, 39, 223, 77, 180, 97, 217, 225, 222, 56, 175, 231, 65, 28, 44, 116, + 180, 249, 68, 96, 191, 158, 79, 151, 179, 255, 197, 10, 19, 177, 212, 185, + 42, 82, 141, 112, 215, 118, 233, 69, 146, 12, 45, 165, 113, 134, 176, 35, + 132, 36, 249, 98, 28, 159, 235, 111, 79, 234, 117, 216, 111, 241, 63, 10, + 6, 105, 88, 107, 140, 90, 4, 175, 201, 199, 122, 61, 29, 5, 27, 160, + 25, 137, 68, 151, 82, 48, 18, 162, 55, 201, 42, 66, 48, 254, 187, 20, + 33, 86, 3, 5, 116, 83, 171, 47, 10, 90, 146, 182, 193, 104, 56, 146, + 28, 74, 157, 105, 205, 197, 249, 134, 46, 195, 24, 90, 56, 170, 236, 56, + 7, 103, 205, 36, 227, 190, 202, 10, 166, 244, 237, 202, 10, 116, 227, 15, + 215, 84, 112, 27, 183, 104, 42, 254, 13, 212, 18, 201, 40, 161, 242, 116, + 28, 205, 78, 106, 4, 127, 75, 6, 82, 205, 115, 103, 95, 165, 2, 99, + 248, 211, 106, 20, 180, 36, 13, 117, 130, 212, 9, 149, 130, 191, 77, 159, + 96, 212, 9, 41, 49, 114, 153, 221, 29, 77, 85, 6, 74, 75, 213, 91, + 250, 252, 49, 82, 191, 53, 61, 198, 211, 249, 131, 152, 143, 51, 152, 47, + 146, 214, 69, 38, 180, 100, 223, 164, 6, 135, 179, 58, 251, 141, 46, 137, + 183, 230, 221, 227, 247, 222, 157, 121, 111, 111, 29, 253, 15, 150, 86, 147, + 54, 242, 153, 228, 135, 147, 159, 17, 52, 83, 120, 226, 42, 226, 195, 33, + 254, 255, 64, 72, 76, 144, 133, 190, 110, 162, 10, 45, 194, 59, 253, 226, + 213, 4, 52, 183, 228, 191, 66, 196, 137, 220, 7, 1, 197, 55, 172, 127, + 90, 147, 120, 123, 198, 55, 0, 194, 195, 86, 56, 90, 202, 75, 138, 242, + 251, 102, 43, 141, 48, 151, 140, 104, 34, 201, 21, 131, 181, 36, 180, 4, + 116, 146, 86, 92, 68, 36, 177, 36, 55, 94, 63, 130, 176, 180, 16, 149, + 128, 227, 119, 241, 111, 86, 80, 56, 14, 246, 203, 105, 196, 156, 44, 207, + 193, 188, 128, 217, 106, 228, 52, 35, 195, 25, 212, 138, 121, 20, 155, 67, + 105, 26, 150, 239, 220, 249, 157, 196, 26, 205, 175, 138, 88, 3, 161, 38, + 47, 211, 24, 169, 227, 41, 255, 230, 152, 253, 207, 33, 142, 20, 125, 56, + 195, 135, 241, 98, 35, 29, 98, 1, 92, 196, 231, 211, 89, 230, 249, 252, + 221, 114, 154, 251, 164, 116, 189, 73, 53, 59, 36, 138, 68, 2, 148, 40, + 12, 163, 141, 88, 244, 133, 151, 166, 159, 35, 153, 135, 181, 150, 119, 3, + 225, 137, 231, 7, 118, 215, 144, 113, 255, 240, 249, 211, 212, 155, 116, 226, + 251, 108, 118, 232, 183, 225, 138, 217, 183, 47, 187, 165, 159, 243, 87, 166, + 43, 167, 2, 227, 221, 249, 12, 7, 229, 239, 206, 252, 217, 225, 115, 237, + 79, 41, 234, 69, 85, 106, 146, 31, 47, 166, 55, 38, 63, 137, 32, 198, + 99, 140, 52, 55, 123, 63, 183, 118, 170, 36, 25, 247, 115, 245, 77, 65, + 116, 159, 189, 101, 223, 152, 34, 45, 23, 198, 222, 105, 13, 53, 115, 243, + 110, 145, 188, 209, 47, 123, 131, 163, 223, 51, 191, 117, 215, 106, 125, 49, + 164, 183, 240, 98, 214, 18, 223, 101, 148, 142, 187, 106, 230, 243, 23, 195, + 236, 103, 192, 57, 63, 127, 86, 123, 223, 186, 235, 83, 19, 178, 31, 62, + 111, 221, 117, 134, 248, 244, 188, 101, 193, 24, 14, 11, 97, 120, 109, 228, + 12, 178, 64, 12, 248, 12, 164, 157, 149, 20, 0, 126, 142, 175, 195, 34, + 192, 84, 231, 54, 200, 143, 174, 57, 113, 119, 161, 125, 93, 188, 179, 253, + 245, 108, 92, 174, 172, 57, 37, 203, 119, 27, 135, 5, 73, 44, 157, 178, + 228, 124, 59, 15, 23, 52, 55, 130, 119, 85, 118, 6, 39, 102, 249, 180, + 128, 92, 188, 187, 100, 202, 36, 74, 120, 7, 82, 84, 48, 118, 19, 195, + 21, 26, 90, 219, 25, 17, 123, 214, 176, 139, 197, 238, 88, 74, 141, 79, + 21, 39, 81, 159, 252, 46, 81, 168, 202, 76, 149, 234, 211, 163, 131, 219, + 81, 13, 247, 167, 107, 153, 139, 7, 250, 6, 196, 237, 136, 239, 53, 184, + 37, 220, 8, 167, 126, 95, 18, 169, 85, 195, 207, 129, 15, 190, 190, 169, + 33, 227, 35, 143, 12, 62, 5, 45, 98, 153, 65, 43, 66, 114, 108, 72, + 79, 201, 222, 176, 118, 118, 246, 236, 84, 105, 72, 192, 212, 229, 41, 104, + 239, 189, 206, 64, 136, 62, 181, 81, 145, 0, 28, 10, 192, 32, 7, 16, + 240, 188, 246, 110, 128, 185, 26, 219, 251, 214, 248, 156, 107, 28, 230, 106, + 252, 2, 53, 62, 127, 168, 198, 108, 155, 54, 171, 68, 155, 74, 105, 134, + 206, 131, 109, 226, 255, 228, 142, 48, 33, 220, 173, 208, 31, 220, 13, 126, + 199, 14, 144, 26, 10, 134, 122, 44, 140, 74, 168, 4, 237, 41, 61, 238, + 194, 119, 23, 17, 218, 68, 57, 120, 210, 201, 198, 44, 232, 13, 237, 55, + 142, 211, 246, 215, 180, 223, 69, 147, 129, 234, 184, 148, 226, 56, 30, 189, + 18, 65, 25, 59, 242, 50, 61, 43, 19, 129, 84, 37, 57, 112, 127, 139, + 190, 92, 74, 74, 251, 141, 131, 83, 108, 97, 176, 110, 20, 73, 82, 58, + 70, 195, 27, 231, 235, 94, 4, 191, 182, 220, 18, 173, 101, 52, 94, 51, + 43, 111, 146, 29, 111, 190, 54, 144, 77, 74, 68, 41, 21, 68, 31, 182, + 114, 93, 175, 77, 109, 153, 92, 111, 176, 185, 58, 57, 229, 141, 221, 97, + 199, 92, 214, 248, 75, 15, 113, 65, 224, 143, 105, 222, 252, 42, 90, 132, + 234, 171, 113, 216, 139, 105, 31, 250, 129, 216, 149, 112, 238, 236, 81, 138, + 228, 82, 245, 167, 222, 184, 23, 145, 152, 228, 58, 95, 67, 210, 136, 247, + 40, 247, 181, 54, 95, 132, 197, 223, 159, 198, 203, 249, 99, 234, 252, 118, + 114, 53, 141, 209, 202, 63, 209, 6, 250, 86, 125, 174, 254, 62, 34, 218, + 216, 163, 224, 127, 189, 254, 246, 47, 234, 199, 201, 116, 186, 24, 61, 166, + 190, 87, 176, 6, 98, 243, 209, 63, 49, 171, 27, 5, 92, 251, 222, 125, + 253, 113, 212, 155, 207, 130, 72, 93, 252, 101, 222, 27, 132, 196, 231, 92, + 82, 233, 111, 130, 5, 109, 236, 143, 42, 254, 19, 241, 56, 241, 227, 202, + 254, 20, 76, 102, 80, 204, 45, 231, 193, 135, 140, 210, 223, 162, 119, 203, + 30, 209, 5, 117, 253, 194, 66, 222, 229, 99, 176, 247, 247, 112, 30, 76, + 122, 51, 46, 18, 81, 2, 125, 223, 167, 211, 92, 17, 161, 44, 152, 78, + 130, 197, 60, 236, 215, 95, 6, 131, 176, 23, 61, 92, 53, 252, 219, 254, + 68, 84, 57, 15, 123, 227, 184, 249, 159, 193, 160, 79, 236, 97, 245, 219, + 59, 194, 67, 8, 38, 147, 182, 9, 130, 241, 186, 183, 160, 98, 209, 54, + 36, 124, 215, 11, 35, 245, 231, 96, 126, 189, 140, 227, 105, 212, 252, 182, + 23, 223, 171, 31, 223, 82, 218, 15, 193, 98, 186, 236, 143, 30, 28, 132, + 28, 128, 151, 83, 194, 130, 4, 113, 234, 141, 31, 234, 66, 174, 236, 127, + 246, 198, 195, 5, 226, 187, 19, 33, 204, 130, 248, 209, 141, 255, 81, 226, + 1, 136, 181, 230, 215, 211, 104, 49, 239, 197, 139, 199, 118, 224, 167, 229, + 252, 106, 57, 134, 90, 214, 52, 231, 225, 118, 252, 215, 180, 71, 8, 235, + 189, 13, 154, 223, 4, 73, 188, 131, 184, 249, 183, 49, 181, 224, 150, 104, + 250, 144, 254, 225, 118, 32, 34, 145, 124, 220, 2, 233, 85, 239, 250, 122, + 122, 53, 93, 52, 255, 4, 167, 126, 97, 60, 161, 98, 95, 233, 72, 134, + 91, 138, 16, 134, 153, 6, 162, 230, 159, 137, 170, 88, 161, 172, 215, 153, + 61, 234, 75, 11, 127, 63, 189, 238, 209, 206, 51, 2, 85, 125, 19, 98, + 199, 65, 57, 134, 146, 118, 233, 65, 40, 175, 2, 66, 222, 116, 25, 239, + 49, 9, 126, 236, 77, 126, 109, 126, 53, 159, 247, 238, 99, 90, 217, 126, + 10, 17, 241, 250, 171, 40, 90, 142, 123, 115, 245, 227, 34, 8, 35, 202, + 252, 245, 8, 131, 243, 3, 66, 133, 72, 14, 70, 135, 93, 228, 17, 192, + 209, 74, 122, 120, 120, 56, 117, 97, 193, 58, 181, 137, 4, 171, 120, 244, + 240, 64, 100, 139, 81, 211, 199, 111, 17, 126, 226, 111, 179, 199, 22, 125, + 221, 131, 116, 254, 77, 111, 121, 245, 216, 146, 63, 190, 13, 198, 193, 34, + 124, 187, 103, 57, 131, 7, 34, 219, 40, 156, 236, 137, 152, 164, 208, 143, + 211, 225, 130, 168, 62, 26, 76, 39, 152, 177, 131, 125, 102, 44, 67, 72, + 40, 163, 249, 250, 126, 49, 234, 93, 79, 105, 158, 170, 159, 230, 65, 176, + 47, 213, 164, 0, 126, 36, 182, 98, 56, 166, 153, 167, 218, 143, 47, 252, + 211, 45, 97, 40, 24, 80, 31, 238, 247, 34, 88, 18, 231, 71, 65, 111, + 208, 132, 11, 213, 233, 99, 10, 188, 156, 78, 163, 246, 172, 23, 81, 71, + 39, 189, 253, 166, 84, 82, 246, 199, 89, 56, 167, 229, 236, 135, 191, 252, + 233, 49, 53, 254, 119, 184, 232, 77, 223, 246, 20, 149, 142, 212, 119, 227, + 241, 50, 150, 201, 252, 16, 128, 255, 111, 138, 239, 115, 93, 107, 182, 192, + 114, 162, 172, 50, 165, 44, 199, 201, 135, 100, 226, 226, 253, 111, 252, 97, + 51, 10, 143, 220, 149, 40, 138, 172, 42, 129, 91, 251, 3, 229, 112, 68, + 42, 39, 27, 146, 10, 98, 236, 117, 184, 80, 51, 68, 4, 222, 149, 177, + 142, 67, 143, 101, 4, 15, 88, 153, 34, 213, 246, 151, 45, 183, 253, 165, + 71, 255, 183, 221, 228, 62, 72, 77, 105, 143, 38, 184, 96, 210, 91, 112, + 16, 197, 88, 21, 132, 196, 74, 193, 54, 117, 176, 218, 230, 129, 68, 86, + 228, 34, 224, 151, 221, 162, 72, 90, 230, 161, 27, 47, 6, 227, 240, 74, + 138, 104, 189, 182, 232, 143, 184, 124, 77, 89, 33, 28, 29, 184, 248, 129, + 91, 16, 87, 66, 33, 35, 92, 112, 18, 124, 171, 148, 112, 227, 252, 154, + 48, 231, 214, 205, 79, 147, 36, 234, 185, 251, 241, 77, 24, 116, 123, 227, + 224, 142, 102, 41, 117, 21, 45, 168, 164, 49, 0, 113, 199, 6, 199, 196, + 8, 233, 120, 225, 213, 235, 237, 147, 246, 101, 114, 81, 84, 117, 245, 63, + 148, 67, 83, 199, 25, 238, 22, 235, 98, 225, 57, 38, 147, 220, 59, 198, + 57, 190, 190, 207, 48, 46, 104, 198, 130, 88, 51, 120, 17, 214, 213, 207, + 39, 170, 149, 139, 248, 202, 149, 23, 84, 109, 254, 177, 171, 56, 28, 55, + 68, 119, 118, 112, 144, 30, 198, 102, 194, 216, 49, 157, 193, 37, 191, 114, + 54, 15, 157, 19, 135, 11, 69, 18, 147, 147, 117, 69, 211, 80, 7, 174, + 206, 127, 163, 234, 160, 255, 109, 240, 146, 22, 101, 105, 95, 62, 54, 36, + 192, 213, 238, 72, 5, 236, 129, 119, 160, 56, 224, 87, 80, 237, 192, 99, + 176, 121, 57, 194, 203, 185, 255, 5, 251, 16, 56, 247, 61, 254, 61, 243, + 143, 69, 171, 140, 11, 61, 39, 205, 230, 85, 184, 104, 140, 239, 155, 237, + 175, 39, 163, 127, 60, 59, 78, 20, 222, 190, 185, 239, 99, 190, 255, 61, + 248, 239, 255, 121, 125, 163, 131, 224, 166, 106, 57, 132, 65, 236, 221, 132, + 180, 203, 198, 253, 209, 18, 172, 244, 248, 243, 167, 237, 78, 231, 84, 91, + 23, 208, 247, 52, 14, 186, 81, 99, 111, 45, 210, 59, 231, 98, 73, 80, + 191, 230, 98, 50, 107, 22, 245, 90, 7, 250, 43, 235, 41, 104, 220, 124, + 148, 110, 252, 149, 118, 242, 97, 197, 0, 220, 141, 64, 151, 122, 19, 70, + 122, 60, 202, 55, 146, 230, 89, 229, 119, 52, 34, 87, 198, 4, 147, 102, + 53, 100, 33, 189, 253, 215, 143, 127, 125, 149, 92, 238, 210, 228, 182, 65, + 58, 108, 98, 2, 194, 201, 17, 135, 93, 120, 131, 54, 154, 250, 67, 218, + 68, 128, 121, 52, 134, 138, 193, 184, 38, 245, 70, 94, 247, 233, 170, 38, + 101, 136, 215, 180, 4, 20, 245, 147, 37, 111, 244, 147, 122, 194, 72, 198, + 252, 48, 253, 91, 220, 45, 18, 248, 244, 171, 27, 107, 93, 80, 106, 251, + 142, 179, 38, 10, 43, 175, 58, 126, 75, 238, 42, 241, 226, 232, 148, 219, + 78, 13, 86, 22, 62, 158, 228, 208, 37, 89, 255, 112, 85, 137, 191, 225, + 8, 88, 251, 206, 146, 37, 53, 13, 202, 93, 43, 165, 207, 88, 89, 121, + 41, 70, 252, 238, 150, 179, 46, 89, 209, 186, 51, 223, 60, 243, 237, 207, + 63, 189, 206, 124, 104, 59, 230, 184, 104, 179, 158, 59, 85, 238, 184, 31, + 30, 27, 28, 90, 253, 250, 95, 173, 160, 224, 10, 214, 66, 101, 15, 127, + 85, 125, 202, 111, 78, 153, 122, 203, 86, 68, 167, 37, 137, 20, 174, 206, + 155, 131, 224, 166, 25, 241, 14, 199, 97, 135, 121, 57, 187, 10, 169, 125, + 33, 109, 100, 86, 212, 97, 28, 71, 87, 129, 105, 111, 93, 227, 0, 37, + 179, 57, 239, 53, 184, 49, 138, 200, 197, 97, 68, 251, 158, 231, 34, 153, + 122, 249, 202, 111, 241, 110, 84, 126, 37, 145, 22, 203, 94, 119, 16, 92, + 17, 115, 223, 253, 21, 106, 12, 218, 79, 38, 131, 103, 71, 13, 74, 179, + 111, 22, 190, 130, 161, 89, 113, 49, 170, 38, 88, 244, 71, 133, 229, 118, + 20, 187, 90, 198, 8, 64, 179, 119, 109, 203, 171, 101, 180, 88, 18, 2, + 166, 17, 37, 60, 182, 88, 127, 26, 79, 62, 160, 24, 148, 188, 211, 226, + 82, 187, 138, 5, 36, 48, 110, 41, 181, 171, 216, 16, 146, 237, 35, 106, + 187, 38, 129, 184, 221, 120, 222, 29, 135, 209, 242, 142, 202, 252, 70, 83, + 78, 61, 92, 155, 41, 86, 52, 236, 26, 196, 30, 197, 178, 195, 46, 229, + 182, 23, 243, 90, 133, 227, 254, 80, 177, 231, 133, 195, 254, 96, 35, 169, + 182, 162, 113, 223, 163, 145, 5, 227, 254, 136, 218, 172, 113, 55, 99, 177, + 79, 49, 123, 220, 119, 212, 246, 150, 228, 247, 222, 174, 81, 219, 163, 88, + 209, 168, 237, 81, 172, 96, 208, 118, 22, 219, 49, 106, 123, 20, 43, 24, + 180, 125, 138, 21, 12, 218, 62, 197, 10, 6, 109, 159, 98, 5, 131, 182, + 165, 88, 127, 28, 118, 111, 195, 168, 120, 130, 110, 47, 70, 50, 197, 135, + 20, 75, 136, 107, 123, 217, 61, 138, 5, 119, 193, 35, 138, 61, 223, 213, + 208, 135, 139, 21, 85, 182, 99, 0, 118, 34, 133, 139, 177, 31, 153, 182, + 4, 148, 238, 16, 195, 195, 94, 238, 254, 246, 195, 247, 28, 8, 116, 30, + 112, 52, 237, 129, 74, 246, 210, 106, 217, 171, 169, 225, 124, 58, 17, 135, + 136, 44, 190, 222, 210, 250, 107, 139, 176, 218, 94, 233, 149, 145, 228, 184, + 101, 231, 236, 231, 133, 218, 67, 9, 214, 110, 123, 113, 9, 107, 40, 228, + 112, 233, 219, 218, 248, 105, 161, 103, 29, 150, 197, 119, 232, 121, 48, 189, + 141, 53, 227, 99, 82, 121, 33, 103, 139, 2, 230, 211, 52, 239, 111, 162, + 140, 179, 192, 72, 204, 135, 228, 110, 138, 204, 40, 78, 61, 116, 28, 51, + 118, 65, 110, 58, 173, 217, 209, 45, 221, 157, 70, 197, 157, 117, 74, 139, + 150, 95, 126, 207, 38, 105, 11, 184, 53, 7, 232, 186, 250, 123, 79, 98, + 170, 227, 24, 145, 1, 221, 43, 17, 168, 197, 215, 255, 213, 50, 28, 35, + 32, 247, 96, 186, 3, 83, 176, 1, 194, 75, 245, 162, 178, 146, 214, 195, + 226, 20, 55, 219, 181, 172, 34, 114, 175, 139, 145, 118, 187, 92, 188, 27, + 143, 166, 243, 133, 8, 192, 191, 35, 162, 235, 150, 96, 23, 192, 197, 32, + 126, 157, 10, 7, 29, 205, 199, 122, 151, 81, 32, 94, 74, 35, 182, 41, + 185, 165, 165, 14, 66, 112, 231, 226, 154, 187, 206, 206, 34, 66, 172, 194, + 181, 125, 104, 107, 178, 52, 177, 171, 17, 57, 234, 129, 47, 90, 30, 30, + 159, 205, 176, 18, 211, 24, 182, 191, 58, 163, 49, 68, 227, 170, 229, 197, + 103, 71, 176, 51, 153, 16, 206, 137, 8, 124, 162, 149, 153, 159, 14, 180, + 229, 154, 86, 143, 117, 77, 37, 153, 97, 127, 72, 217, 215, 201, 55, 46, + 204, 151, 23, 141, 143, 218, 2, 18, 227, 198, 194, 121, 86, 2, 199, 145, + 112, 239, 183, 148, 73, 117, 90, 244, 143, 90, 232, 6, 139, 249, 7, 55, + 87, 28, 255, 148, 223, 159, 149, 23, 173, 195, 103, 173, 3, 252, 151, 244, + 69, 233, 122, 16, 162, 34, 236, 141, 149, 32, 40, 230, 54, 168, 234, 34, + 156, 192, 204, 142, 26, 222, 35, 198, 122, 80, 107, 200, 116, 50, 133, 16, + 178, 54, 83, 224, 137, 35, 200, 51, 129, 231, 23, 250, 164, 166, 171, 109, + 0, 140, 182, 236, 235, 105, 68, 211, 106, 145, 56, 138, 48, 249, 100, 189, + 249, 75, 111, 78, 51, 233, 175, 241, 245, 116, 58, 160, 12, 177, 186, 26, + 79, 175, 85, 85, 79, 124, 146, 24, 26, 51, 180, 182, 15, 173, 57, 61, + 52, 72, 76, 172, 185, 140, 33, 219, 117, 43, 166, 47, 194, 192, 75, 248, + 247, 137, 114, 122, 3, 56, 127, 187, 102, 61, 72, 183, 176, 129, 176, 34, + 182, 3, 47, 38, 37, 154, 174, 247, 69, 171, 229, 210, 172, 9, 238, 220, + 110, 151, 127, 211, 175, 36, 161, 133, 253, 216, 61, 106, 217, 69, 174, 130, + 235, 48, 138, 96, 182, 222, 159, 78, 223, 146, 52, 242, 22, 193, 94, 118, + 102, 104, 246, 123, 203, 241, 96, 78, 50, 106, 231, 248, 129, 156, 131, 251, + 112, 16, 14, 135, 172, 225, 124, 24, 174, 157, 187, 137, 227, 145, 37, 220, + 152, 212, 175, 198, 203, 121, 236, 118, 158, 63, 166, 52, 135, 83, 102, 29, + 110, 125, 26, 213, 123, 117, 194, 248, 36, 120, 36, 140, 32, 188, 14, 34, + 54, 230, 137, 235, 189, 104, 80, 151, 119, 54, 207, 136, 221, 118, 231, 49, + 160, 6, 225, 156, 202, 113, 152, 105, 238, 14, 148, 182, 143, 195, 94, 115, + 17, 68, 49, 85, 92, 39, 250, 65, 111, 234, 139, 41, 222, 67, 120, 120, + 173, 247, 71, 8, 83, 29, 93, 7, 3, 247, 249, 163, 128, 114, 151, 8, + 28, 53, 231, 158, 40, 227, 81, 232, 25, 246, 222, 6, 245, 65, 48, 91, + 140, 234, 211, 97, 125, 24, 6, 227, 129, 251, 197, 179, 7, 32, 12, 169, + 166, 96, 62, 195, 33, 10, 80, 224, 181, 31, 162, 137, 121, 111, 50, 139, + 57, 223, 195, 217, 154, 189, 217, 108, 124, 79, 112, 105, 192, 251, 75, 218, + 17, 221, 135, 154, 35, 197, 146, 17, 217, 47, 187, 196, 170, 31, 215, 165, + 105, 237, 135, 16, 46, 133, 216, 193, 30, 147, 17, 45, 143, 227, 125, 59, + 68, 139, 85, 125, 128, 3, 227, 88, 104, 103, 184, 140, 152, 140, 98, 247, + 161, 161, 146, 242, 124, 232, 61, 3, 70, 226, 25, 237, 209, 110, 123, 191, + 106, 57, 194, 215, 254, 8, 193, 49, 234, 195, 13, 162, 229, 183, 30, 223, + 147, 40, 50, 217, 3, 105, 49, 88, 4, 154, 251, 215, 227, 94, 252, 240, + 146, 213, 68, 128, 230, 5, 198, 132, 214, 89, 215, 123, 16, 184, 149, 187, + 137, 185, 68, 200, 193, 174, 194, 195, 35, 239, 146, 193, 125, 144, 60, 11, + 64, 233, 132, 254, 148, 86, 173, 224, 99, 32, 12, 166, 216, 62, 63, 0, + 2, 244, 145, 227, 224, 174, 30, 113, 148, 99, 61, 53, 59, 15, 45, 88, + 25, 48, 102, 134, 214, 111, 67, 154, 223, 183, 189, 27, 90, 3, 177, 155, + 209, 106, 186, 7, 21, 237, 7, 106, 113, 59, 125, 36, 168, 94, 29, 55, + 105, 136, 31, 174, 19, 89, 63, 114, 156, 67, 88, 131, 79, 130, 223, 126, + 155, 166, 24, 14, 6, 161, 44, 67, 143, 130, 212, 227, 78, 212, 211, 126, + 77, 231, 111, 135, 227, 233, 237, 99, 71, 138, 56, 159, 5, 237, 211, 199, + 143, 42, 213, 159, 6, 195, 97, 216, 135, 1, 79, 93, 246, 38, 183, 243, + 145, 0, 210, 209, 56, 122, 20, 30, 182, 66, 26, 205, 131, 96, 143, 41, + 158, 129, 53, 34, 118, 180, 30, 143, 130, 96, 225, 126, 249, 168, 254, 208, + 250, 22, 68, 131, 240, 46, 87, 161, 190, 99, 69, 27, 84, 127, 58, 23, + 78, 32, 183, 225, 134, 19, 250, 27, 231, 6, 77, 18, 169, 107, 209, 175, + 75, 108, 9, 117, 157, 203, 43, 202, 37, 63, 245, 94, 92, 39, 38, 173, + 135, 251, 129, 133, 85, 152, 124, 35, 80, 77, 48, 96, 112, 237, 162, 182, + 94, 47, 17, 159, 242, 184, 176, 31, 252, 173, 201, 119, 104, 136, 248, 163, + 112, 70, 92, 37, 122, 213, 172, 227, 82, 150, 112, 124, 104, 164, 235, 26, + 175, 217, 64, 24, 44, 172, 50, 217, 31, 3, 24, 203, 200, 148, 152, 76, + 226, 46, 104, 0, 198, 241, 167, 135, 63, 198, 73, 251, 236, 83, 195, 77, + 152, 173, 246, 252, 250, 234, 83, 3, 199, 238, 45, 78, 84, 63, 53, 228, + 107, 109, 151, 247, 123, 180, 122, 18, 222, 117, 1, 246, 232, 211, 130, 141, + 73, 36, 238, 47, 52, 58, 58, 31, 14, 123, 24, 176, 113, 96, 61, 144, + 0, 238, 122, 20, 137, 7, 136, 136, 103, 249, 242, 56, 11, 87, 103, 142, + 173, 220, 143, 129, 219, 35, 33, 145, 39, 253, 39, 132, 57, 238, 93, 5, + 196, 211, 117, 62, 28, 40, 159, 200, 193, 200, 163, 126, 133, 11, 163, 96, + 122, 142, 243, 109, 52, 121, 246, 1, 66, 28, 237, 102, 39, 31, 9, 160, + 219, 139, 174, 33, 187, 186, 95, 124, 36, 28, 4, 47, 254, 4, 96, 48, + 63, 136, 39, 251, 88, 48, 66, 180, 33, 73, 7, 157, 60, 101, 61, 22, + 212, 221, 71, 55, 230, 238, 254, 19, 128, 248, 237, 163, 97, 124, 124, 43, + 126, 227, 253, 247, 67, 65, 208, 126, 123, 51, 29, 127, 228, 144, 12, 250, + 34, 96, 133, 244, 192, 44, 221, 7, 3, 162, 95, 98, 72, 62, 14, 134, + 145, 147, 181, 220, 238, 126, 209, 254, 112, 96, 195, 225, 194, 125, 150, 95, + 93, 30, 81, 222, 108, 45, 27, 107, 244, 135, 0, 233, 70, 180, 107, 111, + 46, 118, 31, 2, 9, 190, 40, 163, 5, 111, 13, 44, 159, 124, 40, 192, + 81, 175, 247, 113, 203, 93, 204, 134, 222, 238, 209, 71, 180, 33, 94, 204, + 151, 125, 172, 247, 102, 192, 31, 221, 161, 107, 177, 50, 191, 207, 109, 178, + 44, 93, 231, 55, 131, 194, 188, 219, 0, 51, 255, 89, 31, 204, 123, 183, + 130, 254, 222, 50, 142, 195, 94, 180, 129, 177, 76, 190, 61, 129, 205, 72, + 64, 159, 244, 88, 114, 248, 88, 80, 11, 109, 221, 221, 23, 30, 248, 241, + 224, 160, 98, 137, 235, 226, 252, 35, 102, 14, 130, 90, 119, 191, 217, 205, + 76, 190, 71, 66, 235, 154, 225, 205, 47, 14, 31, 6, 149, 223, 221, 47, + 62, 9, 172, 120, 68, 188, 205, 224, 3, 187, 11, 67, 161, 28, 225, 113, + 48, 215, 231, 57, 104, 27, 249, 182, 1, 156, 244, 22, 243, 240, 142, 133, + 136, 229, 66, 67, 100, 117, 227, 70, 3, 55, 115, 110, 131, 57, 155, 79, + 105, 237, 152, 96, 187, 88, 204, 167, 99, 98, 188, 112, 142, 187, 177, 105, + 228, 178, 237, 13, 109, 48, 117, 159, 125, 34, 80, 225, 240, 147, 181, 74, + 142, 106, 54, 176, 182, 39, 56, 45, 152, 103, 71, 150, 199, 161, 45, 148, + 188, 49, 215, 10, 74, 60, 10, 56, 235, 55, 209, 218, 79, 10, 85, 36, + 220, 60, 78, 63, 22, 42, 164, 207, 79, 13, 147, 183, 199, 47, 62, 61, + 76, 190, 252, 37, 7, 60, 159, 16, 178, 189, 5, 231, 55, 153, 143, 133, + 13, 69, 80, 60, 154, 142, 7, 27, 139, 229, 78, 200, 139, 160, 63, 138, + 16, 187, 174, 14, 47, 10, 113, 19, 230, 188, 230, 254, 21, 243, 119, 56, + 148, 139, 131, 186, 157, 110, 32, 231, 180, 64, 121, 80, 80, 220, 141, 3, + 176, 137, 189, 241, 125, 28, 202, 185, 78, 124, 31, 45, 70, 1, 222, 194, + 168, 206, 102, 166, 89, 149, 92, 30, 136, 182, 59, 23, 113, 152, 181, 235, + 57, 245, 208, 195, 5, 154, 19, 190, 71, 86, 239, 227, 76, 96, 12, 159, + 220, 139, 209, 36, 167, 249, 217, 3, 202, 219, 250, 36, 232, 69, 177, 5, + 2, 13, 177, 96, 192, 84, 67, 51, 30, 113, 78, 203, 105, 127, 226, 19, + 144, 250, 213, 189, 6, 47, 169, 110, 187, 179, 189, 192, 136, 111, 180, 37, + 57, 183, 86, 202, 250, 232, 236, 161, 79, 82, 168, 189, 179, 208, 168, 23, + 206, 113, 207, 202, 100, 231, 131, 45, 113, 204, 16, 41, 117, 160, 94, 207, + 225, 204, 194, 88, 5, 168, 132, 253, 106, 240, 53, 132, 113, 164, 234, 195, + 88, 53, 26, 77, 250, 143, 13, 55, 113, 114, 218, 52, 231, 168, 141, 126, + 76, 31, 119, 229, 196, 157, 109, 190, 103, 41, 17, 22, 118, 230, 29, 246, + 110, 66, 90, 134, 27, 244, 103, 191, 140, 179, 232, 250, 129, 140, 196, 142, + 6, 243, 61, 170, 198, 133, 146, 189, 50, 254, 250, 110, 25, 16, 187, 232, + 53, 60, 175, 209, 106, 76, 66, 24, 29, 239, 46, 17, 47, 238, 199, 193, + 195, 136, 18, 229, 166, 206, 51, 121, 59, 8, 231, 170, 62, 83, 225, 228, + 218, 92, 7, 161, 71, 156, 236, 103, 138, 231, 32, 92, 55, 199, 211, 235, + 233, 81, 227, 215, 153, 193, 203, 99, 202, 197, 31, 80, 110, 30, 199, 214, + 40, 236, 83, 170, 47, 182, 0, 93, 226, 65, 187, 128, 112, 240, 16, 253, + 36, 217, 245, 232, 236, 200, 16, 63, 60, 126, 137, 5, 192, 98, 218, 223, + 135, 46, 136, 116, 227, 49, 173, 204, 200, 230, 121, 46, 254, 115, 59, 136, + 140, 164, 134, 112, 167, 174, 216, 59, 130, 130, 102, 70, 117, 104, 189, 251, + 12, 30, 229, 143, 214, 252, 132, 15, 135, 252, 5, 111, 250, 235, 8, 95, + 233, 75, 169, 167, 238, 212, 20, 232, 106, 82, 75, 186, 18, 113, 157, 113, + 89, 162, 181, 231, 51, 87, 254, 184, 71, 106, 216, 111, 168, 246, 209, 177, + 107, 254, 111, 169, 105, 35, 41, 118, 51, 13, 7, 92, 102, 62, 177, 236, + 195, 187, 175, 106, 170, 251, 74, 252, 117, 181, 18, 47, 83, 221, 87, 37, + 42, 89, 94, 117, 133, 131, 101, 19, 8, 152, 162, 100, 18, 99, 157, 202, + 22, 48, 236, 179, 196, 42, 94, 104, 69, 33, 54, 249, 204, 28, 83, 57, + 4, 199, 27, 5, 152, 239, 250, 37, 7, 215, 221, 168, 31, 41, 212, 29, + 88, 254, 12, 195, 59, 157, 64, 125, 11, 7, 166, 25, 24, 158, 249, 132, + 134, 71, 117, 187, 139, 201, 140, 71, 205, 177, 151, 48, 216, 165, 136, 61, + 74, 67, 66, 18, 111, 177, 247, 208, 6, 249, 176, 194, 119, 28, 212, 115, + 164, 127, 143, 241, 187, 5, 129, 186, 107, 244, 90, 246, 148, 233, 27, 222, + 218, 150, 25, 255, 177, 67, 5, 164, 209, 244, 9, 239, 137, 67, 82, 68, + 36, 169, 169, 88, 213, 221, 85, 165, 89, 225, 8, 213, 229, 39, 86, 230, + 85, 203, 213, 17, 60, 96, 105, 147, 166, 51, 163, 166, 196, 188, 102, 19, + 76, 73, 35, 17, 183, 5, 168, 241, 58, 196, 181, 157, 8, 159, 51, 218, + 247, 211, 147, 243, 182, 14, 26, 118, 209, 226, 112, 145, 245, 74, 54, 107, + 189, 77, 109, 232, 234, 18, 66, 74, 130, 8, 43, 23, 2, 50, 216, 239, + 212, 26, 24, 179, 249, 2, 206, 135, 43, 187, 46, 117, 111, 179, 9, 76, + 69, 214, 181, 2, 167, 220, 1, 182, 50, 132, 193, 72, 235, 56, 122, 2, + 103, 40, 196, 124, 146, 47, 22, 165, 232, 15, 98, 161, 180, 1, 206, 110, + 234, 22, 176, 153, 44, 69, 224, 237, 12, 217, 30, 28, 89, 61, 72, 91, + 121, 164, 91, 9, 170, 97, 19, 204, 45, 100, 88, 194, 165, 37, 99, 216, + 184, 97, 219, 68, 19, 123, 58, 22, 142, 106, 49, 189, 23, 126, 165, 73, + 195, 111, 83, 188, 49, 168, 74, 12, 169, 120, 239, 175, 200, 165, 37, 88, + 190, 105, 23, 80, 8, 234, 253, 3, 56, 187, 224, 38, 216, 200, 67, 211, + 234, 246, 58, 88, 168, 250, 59, 37, 137, 184, 161, 97, 79, 49, 190, 149, + 151, 38, 24, 111, 47, 202, 235, 100, 47, 86, 245, 97, 92, 224, 179, 159, + 247, 96, 78, 28, 225, 155, 156, 91, 215, 52, 71, 112, 183, 45, 7, 237, + 119, 244, 125, 188, 152, 111, 126, 186, 154, 206, 105, 111, 62, 81, 222, 236, + 206, 113, 147, 183, 22, 189, 101, 243, 253, 229, 141, 119, 212, 122, 249, 221, + 215, 148, 73, 27, 133, 229, 50, 124, 253, 234, 167, 239, 225, 48, 225, 167, + 31, 190, 207, 125, 249, 161, 23, 143, 194, 1, 174, 130, 246, 250, 120, 200, + 126, 101, 59, 67, 113, 93, 52, 156, 206, 175, 131, 70, 20, 224, 202, 189, + 54, 63, 44, 200, 220, 29, 4, 67, 157, 65, 95, 140, 204, 101, 250, 143, + 167, 184, 13, 244, 36, 159, 186, 170, 123, 46, 125, 88, 109, 164, 23, 36, + 50, 27, 75, 252, 7, 241, 13, 99, 93, 23, 130, 197, 97, 125, 16, 47, + 156, 127, 249, 238, 37, 161, 224, 191, 127, 248, 231, 19, 246, 192, 73, 115, + 243, 237, 133, 119, 185, 45, 11, 66, 57, 37, 217, 90, 151, 230, 2, 37, + 81, 208, 89, 115, 16, 222, 156, 191, 137, 146, 95, 97, 170, 210, 172, 38, + 90, 217, 217, 147, 111, 254, 250, 245, 79, 255, 124, 253, 45, 59, 54, 62, + 135, 11, 225, 51, 38, 120, 132, 46, 193, 224, 71, 245, 37, 60, 191, 158, + 129, 217, 58, 63, 35, 137, 163, 199, 161, 186, 234, 193, 187, 101, 120, 67, + 25, 190, 102, 45, 239, 162, 254, 19, 123, 110, 86, 125, 121, 245, 197, 123, + 53, 239, 199, 167, 10, 119, 233, 226, 96, 225, 255, 237, 167, 63, 215, 159, + 195, 111, 40, 106, 97, 127, 116, 243, 0, 238, 231, 152, 219, 226, 243, 111, + 130, 160, 239, 242, 217, 220, 170, 41, 34, 113, 206, 20, 187, 251, 212, 21, + 252, 218, 187, 233, 73, 50, 21, 141, 231, 125, 74, 79, 182, 255, 148, 17, + 32, 126, 15, 125, 104, 74, 206, 221, 245, 219, 208, 185, 110, 211, 162, 34, + 184, 146, 161, 185, 87, 243, 56, 211, 40, 110, 92, 207, 123, 179, 81, 216, + 143, 191, 33, 110, 209, 87, 149, 20, 172, 249, 208, 172, 156, 234, 172, 183, + 115, 156, 240, 207, 191, 198, 76, 124, 5, 206, 133, 242, 223, 82, 214, 186, + 76, 40, 201, 151, 237, 214, 3, 141, 40, 105, 28, 201, 58, 214, 31, 68, + 141, 73, 111, 49, 250, 181, 119, 215, 160, 73, 210, 212, 207, 77, 220, 138, + 141, 23, 205, 151, 244, 250, 95, 244, 233, 215, 248, 5, 141, 235, 48, 188, + 246, 127, 10, 254, 81, 255, 234, 229, 143, 245, 151, 47, 191, 239, 254, 231, + 79, 47, 191, 159, 206, 233, 105, 3, 181, 87, 211, 193, 253, 57, 187, 182, + 229, 144, 64, 32, 67, 78, 58, 99, 122, 56, 79, 162, 140, 229, 220, 81, + 195, 240, 9, 206, 2, 88, 62, 108, 106, 163, 213, 38, 156, 84, 111, 95, + 119, 139, 139, 108, 64, 46, 90, 158, 119, 3, 46, 44, 145, 135, 187, 181, + 180, 13, 187, 208, 24, 182, 233, 152, 217, 122, 214, 83, 52, 43, 45, 111, + 211, 216, 253, 207, 207, 91, 178, 251, 95, 172, 86, 229, 243, 186, 183, 118, + 127, 94, 227, 202, 178, 228, 214, 49, 10, 5, 128, 166, 78, 154, 216, 227, + 134, 134, 137, 55, 205, 68, 180, 74, 160, 115, 97, 88, 192, 12, 176, 199, + 203, 154, 196, 81, 58, 122, 206, 23, 23, 37, 195, 194, 118, 132, 108, 146, + 249, 154, 244, 206, 110, 20, 161, 169, 194, 158, 51, 123, 81, 127, 52, 157, + 19, 159, 163, 210, 106, 185, 121, 78, 229, 105, 197, 209, 60, 213, 185, 103, + 242, 61, 69, 11, 210, 182, 10, 15, 34, 14, 247, 210, 242, 182, 15, 94, + 48, 84, 227, 134, 197, 93, 17, 64, 106, 17, 60, 182, 90, 202, 153, 202, + 41, 85, 242, 204, 224, 146, 120, 38, 194, 227, 19, 159, 178, 36, 73, 157, + 36, 9, 171, 1, 55, 32, 97, 173, 132, 9, 49, 161, 71, 13, 162, 116, + 42, 179, 93, 73, 11, 229, 243, 22, 6, 43, 45, 107, 120, 43, 244, 94, + 82, 75, 250, 163, 126, 45, 11, 62, 108, 102, 64, 252, 198, 240, 122, 69, + 156, 128, 149, 137, 40, 65, 10, 5, 3, 182, 177, 119, 52, 12, 230, 20, + 230, 19, 44, 241, 122, 157, 79, 155, 119, 143, 213, 95, 243, 185, 155, 141, + 238, 86, 128, 211, 223, 32, 33, 145, 44, 163, 145, 219, 160, 30, 104, 164, + 250, 229, 149, 185, 235, 250, 70, 241, 64, 201, 126, 34, 104, 208, 61, 113, + 242, 182, 254, 68, 161, 193, 28, 103, 27, 130, 185, 167, 142, 137, 204, 252, + 145, 189, 180, 253, 83, 58, 213, 164, 22, 211, 216, 90, 195, 242, 202, 245, + 48, 62, 204, 56, 124, 186, 81, 80, 150, 55, 49, 167, 26, 77, 169, 97, + 115, 9, 96, 58, 192, 125, 1, 86, 224, 51, 135, 183, 127, 75, 153, 232, + 26, 38, 128, 173, 26, 107, 167, 231, 220, 30, 197, 238, 88, 239, 146, 137, + 44, 226, 0, 37, 214, 248, 11, 95, 64, 73, 124, 73, 191, 81, 248, 98, + 196, 13, 246, 53, 12, 15, 168, 226, 106, 152, 164, 211, 202, 251, 247, 120, + 250, 117, 150, 62, 5, 215, 21, 203, 211, 131, 217, 63, 129, 51, 136, 182, + 229, 227, 46, 46, 61, 235, 246, 200, 135, 132, 240, 135, 235, 213, 213, 154, + 85, 21, 89, 226, 87, 22, 130, 191, 213, 124, 166, 88, 142, 101, 48, 189, + 147, 208, 121, 240, 216, 87, 175, 110, 20, 19, 100, 24, 119, 167, 179, 222, + 187, 101, 224, 183, 74, 241, 108, 28, 46, 240, 218, 135, 11, 14, 94, 120, + 124, 223, 211, 193, 148, 123, 231, 237, 227, 150, 149, 157, 93, 250, 246, 84, + 223, 220, 201, 145, 100, 170, 22, 70, 68, 34, 240, 201, 115, 79, 134, 200, + 150, 252, 59, 36, 249, 35, 205, 146, 253, 213, 213, 152, 230, 134, 234, 141, + 103, 163, 30, 144, 61, 53, 93, 119, 159, 145, 152, 63, 177, 41, 236, 187, + 162, 126, 107, 85, 9, 117, 156, 40, 122, 7, 22, 180, 155, 82, 155, 136, + 109, 228, 254, 153, 62, 74, 177, 185, 17, 45, 138, 208, 220, 112, 148, 185, + 20, 207, 148, 86, 68, 136, 196, 59, 138, 79, 12, 101, 36, 132, 132, 133, + 33, 94, 104, 26, 245, 199, 97, 255, 45, 165, 234, 64, 158, 196, 198, 4, + 119, 51, 106, 124, 117, 49, 10, 227, 218, 27, 135, 99, 105, 92, 180, 220, + 246, 165, 185, 247, 181, 73, 2, 57, 36, 12, 225, 104, 73, 238, 209, 88, + 206, 150, 129, 78, 176, 17, 198, 103, 7, 194, 115, 232, 116, 185, 159, 131, + 143, 102, 151, 133, 82, 238, 17, 219, 44, 84, 98, 14, 54, 50, 68, 126, + 208, 48, 132, 117, 2, 148, 49, 97, 192, 218, 107, 173, 125, 171, 148, 159, + 17, 233, 114, 201, 157, 249, 152, 9, 34, 244, 241, 111, 55, 37, 108, 157, + 154, 126, 110, 209, 132, 0, 241, 151, 62, 106, 186, 148, 246, 153, 46, 159, + 120, 166, 236, 156, 43, 143, 154, 38, 122, 103, 65, 30, 246, 64, 35, 153, + 83, 194, 204, 186, 57, 89, 144, 112, 5, 18, 117, 241, 168, 136, 199, 95, + 140, 136, 214, 218, 199, 207, 192, 92, 179, 66, 121, 35, 63, 177, 213, 179, + 29, 133, 102, 219, 202, 73, 28, 151, 71, 213, 70, 76, 167, 139, 191, 11, + 218, 81, 2, 8, 119, 240, 236, 28, 32, 2, 147, 98, 63, 33, 80, 163, + 64, 7, 245, 135, 10, 148, 36, 28, 63, 213, 126, 144, 248, 26, 30, 22, + 166, 244, 132, 224, 141, 196, 180, 64, 70, 18, 137, 85, 56, 160, 207, 87, + 180, 3, 19, 49, 75, 152, 168, 243, 52, 125, 49, 157, 193, 61, 201, 34, + 155, 72, 213, 119, 233, 11, 37, 26, 231, 134, 34, 93, 203, 223, 44, 100, + 241, 191, 190, 89, 30, 233, 243, 160, 27, 226, 216, 58, 39, 213, 2, 63, + 75, 162, 50, 202, 154, 145, 26, 111, 122, 115, 117, 253, 103, 234, 79, 164, + 5, 192, 242, 179, 202, 105, 86, 222, 42, 232, 249, 134, 202, 220, 234, 127, + 40, 179, 212, 12, 59, 38, 35, 164, 92, 214, 146, 210, 123, 185, 13, 247, + 165, 200, 34, 82, 38, 37, 181, 18, 225, 26, 35, 141, 151, 160, 55, 33, + 145, 57, 134, 63, 29, 206, 42, 144, 45, 124, 164, 29, 23, 213, 131, 166, + 44, 154, 217, 168, 35, 129, 167, 173, 196, 245, 153, 15, 173, 127, 44, 78, + 111, 32, 182, 160, 135, 217, 67, 42, 171, 123, 5, 121, 173, 35, 165, 36, + 35, 237, 66, 76, 185, 29, 166, 92, 190, 158, 185, 194, 217, 231, 225, 178, + 138, 35, 189, 218, 58, 209, 4, 10, 21, 25, 117, 180, 246, 94, 2, 183, + 37, 173, 245, 185, 223, 18, 215, 214, 218, 149, 9, 92, 197, 212, 28, 125, + 141, 219, 10, 101, 61, 212, 227, 231, 151, 61, 246, 129, 158, 250, 206, 66, + 170, 217, 74, 162, 252, 6, 69, 155, 146, 59, 58, 247, 159, 29, 173, 117, + 12, 162, 67, 35, 1, 169, 21, 251, 95, 95, 103, 195, 146, 44, 68, 12, + 114, 224, 146, 249, 162, 242, 61, 75, 241, 138, 68, 100, 90, 84, 77, 192, + 159, 19, 69, 60, 158, 98, 63, 229, 45, 248, 233, 54, 65, 113, 106, 190, + 31, 179, 15, 22, 112, 161, 180, 31, 193, 131, 243, 211, 186, 231, 86, 52, + 19, 95, 169, 81, 95, 249, 50, 51, 92, 39, 217, 25, 240, 110, 101, 208, + 151, 130, 89, 183, 197, 123, 43, 191, 34, 147, 133, 143, 195, 68, 114, 59, + 151, 38, 175, 218, 46, 107, 186, 207, 125, 132, 222, 102, 156, 210, 27, 130, + 125, 127, 169, 223, 60, 14, 2, 220, 208, 111, 237, 76, 206, 118, 154, 147, + 184, 147, 78, 38, 231, 81, 38, 231, 145, 206, 233, 172, 75, 132, 23, 159, + 170, 253, 197, 194, 197, 49, 194, 8, 105, 5, 124, 71, 137, 55, 26, 137, + 36, 77, 219, 119, 123, 45, 220, 31, 202, 101, 147, 45, 73, 144, 247, 2, + 179, 79, 138, 255, 44, 173, 105, 203, 223, 247, 47, 30, 157, 210, 217, 149, + 229, 208, 42, 47, 72, 13, 166, 183, 17, 84, 28, 34, 71, 97, 1, 41, + 83, 121, 71, 28, 91, 193, 97, 90, 77, 55, 29, 232, 226, 74, 101, 177, + 223, 253, 87, 125, 45, 225, 2, 208, 225, 186, 190, 233, 253, 64, 67, 242, + 23, 195, 185, 41, 112, 211, 99, 53, 69, 105, 33, 229, 163, 49, 0, 69, + 149, 208, 152, 174, 247, 235, 239, 38, 215, 93, 233, 58, 188, 41, 252, 139, + 241, 80, 220, 28, 81, 153, 37, 205, 41, 192, 5, 253, 119, 111, 228, 183, + 13, 54, 21, 206, 182, 146, 229, 128, 41, 233, 233, 127, 16, 35, 173, 110, + 104, 197, 9, 222, 53, 152, 139, 33, 12, 93, 77, 227, 160, 210, 160, 180, + 234, 97, 205, 228, 144, 84, 74, 27, 19, 167, 130, 21, 106, 165, 14, 213, + 123, 85, 87, 235, 76, 190, 19, 245, 99, 176, 80, 211, 185, 162, 181, 113, + 30, 192, 29, 107, 115, 16, 232, 39, 190, 148, 45, 128, 192, 14, 50, 160, + 134, 250, 70, 162, 93, 104, 184, 97, 172, 90, 141, 4, 86, 53, 105, 84, + 165, 214, 120, 19, 37, 233, 127, 31, 5, 145, 170, 112, 137, 202, 121, 203, + 213, 110, 26, 112, 55, 124, 66, 219, 5, 159, 150, 195, 112, 65, 27, 20, + 18, 151, 165, 221, 57, 224, 190, 195, 0, 231, 20, 193, 124, 14, 135, 239, + 241, 2, 238, 30, 107, 105, 133, 166, 49, 108, 61, 115, 162, 171, 240, 189, + 138, 201, 193, 11, 248, 137, 26, 4, 4, 22, 237, 35, 105, 155, 152, 149, + 90, 14, 5, 184, 170, 207, 183, 208, 123, 234, 58, 188, 161, 166, 74, 254, + 106, 24, 169, 73, 92, 115, 149, 48, 3, 184, 87, 172, 226, 16, 170, 4, + 180, 141, 164, 156, 133, 34, 81, 125, 204, 29, 70, 69, 149, 180, 93, 4, + 235, 54, 5, 186, 140, 131, 185, 162, 150, 17, 74, 167, 253, 190, 220, 172, + 77, 186, 200, 182, 247, 212, 229, 48, 66, 111, 23, 6, 9, 74, 123, 122, + 72, 97, 86, 184, 85, 196, 209, 246, 34, 248, 168, 88, 169, 179, 150, 207, + 73, 135, 195, 241, 50, 30, 73, 5, 49, 141, 113, 203, 151, 186, 222, 171, + 115, 157, 67, 173, 83, 48, 95, 139, 26, 68, 87, 12, 71, 151, 85, 154, + 21, 189, 232, 190, 38, 232, 142, 185, 209, 197, 173, 129, 195, 117, 68, 71, + 230, 207, 180, 255, 193, 255, 136, 48, 193, 250, 67, 90, 205, 119, 67, 69, + 200, 206, 21, 195, 32, 227, 170, 90, 56, 12, 53, 67, 78, 85, 155, 126, + 17, 41, 73, 68, 151, 155, 192, 101, 212, 104, 133, 13, 130, 2, 208, 24, + 199, 9, 104, 26, 150, 158, 170, 16, 179, 55, 168, 168, 120, 28, 4, 51, + 53, 224, 155, 105, 22, 104, 6, 185, 157, 76, 248, 179, 223, 178, 200, 132, + 54, 160, 19, 213, 165, 158, 19, 119, 123, 19, 198, 33, 173, 61, 254, 138, + 164, 178, 247, 202, 83, 107, 183, 171, 201, 52, 71, 55, 175, 231, 240, 124, + 155, 214, 10, 48, 104, 135, 206, 237, 238, 77, 198, 251, 141, 73, 58, 61, + 152, 236, 232, 11, 177, 28, 241, 242, 10, 97, 216, 30, 26, 144, 91, 107, + 197, 144, 65, 201, 45, 24, 122, 164, 8, 9, 204, 1, 94, 124, 70, 27, + 36, 237, 227, 250, 152, 60, 121, 53, 102, 119, 98, 30, 215, 29, 46, 199, + 99, 226, 57, 131, 128, 158, 105, 240, 186, 119, 148, 81, 158, 238, 249, 105, + 17, 46, 198, 121, 172, 125, 163, 73, 42, 165, 124, 177, 151, 33, 92, 210, + 236, 140, 182, 145, 30, 238, 202, 90, 184, 6, 131, 226, 170, 76, 115, 248, + 120, 195, 77, 234, 73, 219, 198, 177, 14, 153, 220, 184, 61, 5, 235, 213, + 109, 118, 189, 34, 226, 173, 48, 26, 42, 152, 201, 21, 193, 1, 83, 40, + 112, 77, 5, 8, 21, 154, 68, 109, 213, 93, 114, 47, 29, 57, 123, 131, + 95, 151, 236, 175, 151, 178, 35, 171, 116, 195, 94, 33, 100, 160, 208, 145, + 180, 69, 63, 114, 7, 239, 85, 133, 177, 89, 225, 70, 243, 243, 61, 7, + 117, 227, 112, 60, 49, 209, 213, 152, 197, 243, 20, 174, 26, 245, 140, 243, + 26, 184, 6, 77, 106, 77, 16, 150, 212, 208, 159, 18, 255, 30, 70, 216, + 152, 26, 234, 175, 148, 103, 126, 27, 198, 50, 227, 238, 205, 218, 210, 131, + 53, 74, 48, 176, 214, 30, 193, 6, 241, 181, 22, 62, 16, 58, 126, 76, + 155, 76, 204, 53, 21, 15, 155, 5, 34, 51, 86, 214, 50, 86, 247, 252, + 183, 152, 196, 49, 196, 15, 172, 94, 17, 12, 64, 104, 226, 249, 189, 241, + 45, 60, 98, 191, 87, 109, 223, 139, 23, 117, 248, 52, 161, 151, 142, 15, + 238, 214, 94, 210, 42, 233, 80, 239, 134, 203, 80, 239, 169, 193, 86, 225, + 127, 78, 151, 92, 134, 38, 32, 134, 99, 57, 3, 234, 188, 150, 194, 117, + 149, 128, 55, 254, 45, 43, 179, 186, 186, 167, 149, 29, 227, 142, 238, 203, + 205, 114, 66, 60, 251, 217, 136, 172, 229, 170, 114, 75, 108, 102, 85, 7, + 137, 114, 149, 69, 114, 110, 229, 214, 171, 184, 141, 70, 131, 30, 136, 77, + 157, 14, 51, 203, 30, 229, 176, 150, 211, 232, 102, 250, 54, 72, 230, 174, + 204, 6, 234, 80, 186, 98, 16, 204, 9, 60, 75, 91, 52, 161, 23, 50, + 87, 226, 149, 49, 137, 92, 97, 58, 240, 168, 13, 208, 126, 100, 198, 238, + 180, 101, 169, 140, 205, 200, 251, 90, 14, 204, 140, 161, 159, 162, 157, 214, + 6, 77, 171, 60, 195, 252, 234, 50, 98, 79, 202, 193, 160, 150, 118, 226, + 68, 177, 227, 170, 151, 182, 137, 171, 124, 122, 107, 173, 78, 24, 179, 220, + 218, 196, 195, 152, 93, 68, 254, 27, 73, 60, 13, 114, 203, 72, 193, 228, + 126, 91, 177, 150, 218, 178, 228, 99, 165, 26, 171, 187, 212, 29, 195, 191, + 104, 213, 143, 91, 159, 193, 165, 176, 92, 159, 86, 119, 15, 23, 249, 185, + 211, 250, 172, 254, 69, 235, 179, 141, 50, 19, 155, 65, 195, 124, 204, 117, + 72, 226, 157, 36, 1, 204, 104, 169, 204, 117, 239, 37, 50, 228, 23, 200, + 158, 189, 215, 152, 178, 5, 253, 157, 220, 60, 208, 97, 183, 195, 45, 0, + 23, 220, 218, 217, 75, 206, 69, 104, 169, 215, 61, 96, 166, 149, 239, 103, + 52, 177, 250, 201, 30, 148, 179, 253, 100, 229, 196, 137, 226, 72, 205, 158, + 227, 242, 111, 219, 1, 197, 23, 48, 161, 248, 200, 30, 205, 182, 142, 104, + 29, 11, 115, 202, 52, 129, 234, 19, 143, 160, 61, 176, 102, 215, 99, 173, + 148, 227, 229, 140, 150, 225, 5, 175, 196, 113, 76, 235, 230, 32, 51, 185, + 48, 23, 146, 34, 204, 94, 155, 74, 146, 101, 86, 85, 9, 199, 152, 64, + 247, 166, 22, 222, 219, 105, 114, 132, 136, 219, 64, 144, 122, 113, 109, 191, + 198, 77, 166, 115, 76, 76, 90, 101, 176, 180, 233, 22, 194, 51, 83, 210, + 158, 164, 82, 153, 54, 249, 254, 164, 173, 99, 148, 130, 27, 224, 226, 178, + 133, 76, 115, 21, 23, 208, 68, 52, 217, 70, 19, 12, 80, 224, 192, 230, + 249, 130, 31, 47, 85, 59, 205, 92, 214, 143, 115, 123, 180, 231, 65, 1, + 93, 75, 98, 110, 108, 127, 144, 196, 135, 231, 233, 124, 107, 27, 13, 61, + 10, 252, 139, 109, 211, 110, 103, 161, 109, 243, 91, 62, 119, 7, 75, 202, + 142, 248, 223, 113, 190, 225, 233, 151, 148, 83, 201, 177, 238, 146, 140, 139, + 64, 118, 251, 171, 158, 219, 118, 59, 238, 17, 253, 61, 162, 95, 79, 63, + 123, 181, 92, 211, 172, 186, 211, 198, 109, 126, 74, 157, 112, 237, 106, 88, + 210, 40, 246, 115, 108, 216, 193, 242, 139, 70, 234, 244, 239, 137, 203, 102, + 112, 211, 225, 208, 111, 165, 137, 117, 28, 117, 148, 112, 229, 200, 95, 241, + 81, 255, 33, 28, 187, 215, 203, 148, 77, 204, 6, 240, 233, 220, 47, 63, + 81, 28, 85, 142, 245, 53, 245, 11, 206, 233, 242, 55, 194, 236, 21, 177, + 20, 97, 156, 54, 218, 95, 61, 9, 227, 228, 228, 177, 108, 127, 162, 196, + 11, 93, 140, 106, 144, 152, 153, 98, 35, 202, 127, 50, 99, 19, 76, 102, + 139, 251, 252, 176, 112, 226, 206, 17, 209, 3, 98, 3, 217, 68, 98, 30, + 204, 62, 248, 19, 37, 220, 153, 251, 228, 118, 52, 224, 238, 93, 148, 207, + 46, 19, 193, 221, 76, 150, 104, 99, 182, 112, 132, 226, 1, 109, 136, 252, + 49, 223, 18, 221, 6, 206, 163, 42, 229, 3, 156, 74, 32, 222, 85, 217, + 57, 112, 184, 142, 213, 250, 50, 139, 23, 201, 90, 184, 190, 230, 177, 5, + 129, 65, 87, 144, 99, 164, 101, 217, 77, 220, 69, 102, 186, 109, 205, 210, + 111, 166, 104, 219, 148, 29, 99, 177, 135, 188, 105, 6, 222, 98, 4, 109, + 131, 192, 10, 238, 50, 19, 193, 154, 223, 17, 38, 120, 182, 241, 31, 131, + 133, 155, 12, 134, 249, 10, 204, 198, 130, 196, 169, 27, 43, 146, 164, 154, + 61, 116, 247, 174, 147, 182, 127, 143, 125, 85, 87, 120, 81, 111, 187, 212, + 171, 157, 153, 235, 222, 179, 36, 59, 246, 88, 104, 220, 55, 86, 167, 52, + 88, 24, 73, 102, 172, 120, 135, 199, 194, 68, 151, 227, 118, 251, 136, 191, + 54, 79, 89, 41, 218, 75, 169, 72, 50, 140, 27, 60, 68, 191, 207, 236, + 255, 245, 134, 128, 160, 231, 76, 2, 111, 7, 75, 152, 180, 227, 176, 226, + 170, 74, 82, 194, 15, 43, 217, 229, 239, 244, 232, 244, 139, 211, 206, 233, + 151, 167, 109, 126, 122, 198, 207, 222, 105, 139, 126, 59, 167, 109, 179, 12, + 222, 43, 59, 34, 90, 104, 48, 112, 95, 178, 251, 174, 205, 189, 61, 255, + 16, 86, 222, 109, 63, 92, 151, 226, 150, 239, 12, 130, 184, 31, 176, 240, + 229, 168, 216, 243, 157, 94, 242, 154, 208, 85, 6, 29, 122, 50, 99, 162, + 59, 229, 85, 188, 234, 86, 14, 43, 190, 95, 41, 123, 149, 245, 218, 81, + 220, 47, 119, 19, 71, 57, 204, 16, 89, 182, 65, 150, 124, 62, 138, 191, + 120, 71, 248, 219, 74, 105, 74, 139, 231, 47, 167, 128, 71, 239, 245, 202, + 139, 110, 229, 188, 114, 210, 173, 156, 85, 126, 89, 151, 104, 221, 245, 248, + 95, 39, 82, 62, 19, 120, 245, 41, 60, 212, 180, 17, 49, 129, 21, 231, + 145, 219, 170, 125, 70, 9, 199, 14, 244, 26, 145, 191, 10, 95, 74, 200, + 240, 167, 234, 123, 156, 177, 197, 194, 36, 41, 56, 182, 91, 140, 26, 38, + 38, 35, 177, 25, 244, 101, 60, 241, 8, 236, 152, 168, 194, 59, 213, 73, + 0, 66, 105, 78, 25, 15, 14, 2, 243, 205, 251, 147, 89, 53, 106, 185, + 145, 199, 225, 27, 57, 138, 226, 91, 137, 160, 248, 246, 140, 179, 35, 6, + 104, 21, 178, 15, 128, 37, 33, 198, 163, 214, 197, 219, 203, 26, 193, 182, + 146, 60, 36, 213, 16, 116, 241, 45, 117, 0, 69, 106, 236, 237, 189, 255, + 22, 3, 87, 29, 79, 91, 238, 40, 108, 113, 61, 37, 209, 85, 248, 202, + 132, 114, 108, 31, 140, 57, 80, 32, 165, 66, 254, 149, 136, 161, 179, 101, + 60, 170, 6, 227, 69, 203, 165, 63, 210, 64, 206, 113, 145, 228, 147, 248, + 141, 200, 114, 170, 182, 125, 66, 140, 209, 25, 226, 173, 162, 124, 55, 246, + 56, 8, 41, 178, 214, 235, 73, 230, 203, 83, 213, 141, 91, 91, 190, 92, + 208, 39, 151, 10, 94, 214, 116, 147, 76, 79, 146, 208, 172, 73, 238, 243, + 150, 91, 154, 247, 162, 107, 116, 128, 235, 60, 45, 141, 167, 244, 204, 105, + 23, 173, 203, 211, 210, 40, 76, 94, 61, 122, 157, 133, 55, 211, 5, 226, + 41, 70, 139, 42, 193, 165, 105, 60, 10, 107, 205, 182, 14, 116, 41, 52, + 193, 121, 92, 12, 70, 205, 141, 248, 37, 173, 121, 60, 61, 27, 133, 174, + 121, 171, 166, 133, 198, 83, 83, 98, 60, 173, 157, 154, 129, 166, 84, 13, + 225, 172, 197, 35, 133, 143, 5, 165, 9, 166, 46, 77, 205, 73, 74, 75, + 67, 144, 196, 165, 235, 117, 124, 164, 14, 158, 249, 163, 240, 5, 53, 229, + 9, 126, 231, 203, 168, 74, 43, 227, 69, 197, 165, 202, 42, 244, 47, 193, + 170, 92, 34, 14, 40, 106, 59, 53, 165, 232, 63, 154, 40, 85, 131, 24, + 244, 130, 113, 107, 18, 168, 88, 77, 231, 161, 10, 12, 194, 92, 141, 127, + 215, 36, 32, 79, 173, 148, 161, 179, 150, 75, 148, 95, 211, 214, 13, 33, + 248, 147, 116, 159, 174, 226, 168, 172, 220, 94, 215, 228, 82, 73, 239, 162, + 28, 214, 177, 40, 220, 171, 195, 97, 67, 85, 160, 83, 209, 43, 53, 49, + 99, 128, 214, 64, 100, 129, 123, 24, 66, 210, 68, 53, 27, 62, 9, 218, + 147, 242, 185, 15, 88, 209, 154, 35, 74, 194, 204, 146, 114, 99, 85, 41, + 159, 203, 174, 159, 228, 157, 220, 92, 152, 111, 171, 144, 90, 87, 62, 175, + 173, 47, 85, 221, 203, 101, 211, 96, 202, 171, 104, 146, 100, 91, 235, 60, + 98, 202, 133, 187, 7, 201, 18, 216, 29, 211, 174, 138, 251, 6, 106, 229, + 96, 30, 123, 124, 150, 71, 235, 204, 37, 79, 235, 182, 188, 182, 249, 53, + 252, 141, 222, 38, 97, 84, 149, 67, 60, 202, 92, 115, 205, 99, 27, 24, + 36, 88, 148, 163, 238, 233, 48, 170, 161, 44, 0, 225, 25, 74, 226, 198, + 87, 112, 119, 214, 2, 181, 16, 165, 241, 252, 73, 39, 61, 128, 93, 132, + 152, 25, 113, 59, 255, 161, 45, 31, 4, 120, 236, 225, 12, 53, 110, 191, + 240, 78, 226, 54, 63, 122, 47, 90, 39, 117, 137, 56, 203, 21, 188, 72, + 91, 199, 223, 147, 6, 158, 208, 231, 211, 146, 179, 182, 119, 64, 250, 144, + 221, 223, 242, 251, 90, 245, 38, 12, 110, 161, 83, 134, 228, 148, 108, 126, + 11, 236, 82, 113, 13, 203, 61, 240, 215, 159, 106, 99, 106, 89, 233, 27, + 37, 3, 219, 98, 67, 24, 186, 181, 77, 20, 149, 115, 216, 82, 249, 206, + 12, 230, 28, 118, 72, 213, 81, 243, 8, 171, 123, 77, 221, 251, 171, 163, + 3, 220, 120, 74, 233, 112, 12, 6, 177, 116, 56, 135, 214, 168, 124, 239, + 174, 202, 247, 135, 157, 181, 26, 66, 0, 175, 132, 195, 106, 120, 238, 127, + 201, 241, 114, 194, 51, 223, 107, 183, 221, 176, 222, 161, 63, 181, 138, 170, + 55, 84, 167, 173, 250, 48, 203, 125, 214, 81, 196, 92, 223, 171, 3, 146, + 157, 159, 29, 225, 167, 161, 142, 90, 95, 62, 83, 7, 23, 8, 96, 218, + 126, 214, 246, 142, 142, 212, 33, 189, 128, 194, 75, 196, 27, 245, 244, 206, + 74, 155, 234, 157, 146, 186, 91, 10, 63, 108, 112, 35, 166, 156, 236, 166, + 9, 205, 248, 12, 127, 218, 165, 24, 63, 135, 110, 75, 189, 34, 114, 127, + 82, 247, 214, 165, 187, 150, 159, 94, 60, 163, 20, 117, 231, 209, 167, 187, + 214, 225, 106, 5, 249, 96, 237, 142, 136, 108, 15, 127, 3, 76, 74, 165, + 174, 221, 121, 84, 76, 81, 49, 122, 50, 244, 76, 194, 87, 249, 213, 165, + 21, 67, 137, 167, 99, 156, 10, 110, 39, 10, 86, 229, 1, 130, 140, 193, + 250, 241, 175, 28, 28, 115, 58, 55, 178, 24, 9, 22, 57, 22, 238, 107, + 118, 141, 32, 218, 46, 14, 15, 15, 37, 38, 242, 77, 199, 72, 22, 86, + 101, 39, 91, 103, 179, 100, 135, 241, 242, 74, 173, 194, 222, 26, 16, 46, + 178, 140, 27, 124, 150, 200, 190, 93, 233, 79, 227, 106, 187, 117, 112, 215, + 188, 165, 177, 57, 68, 163, 140, 11, 12, 166, 15, 26, 143, 22, 252, 201, + 152, 70, 83, 246, 253, 90, 61, 39, 134, 35, 198, 237, 194, 189, 219, 155, + 220, 126, 135, 38, 218, 227, 170, 118, 52, 123, 185, 168, 82, 155, 15, 91, + 13, 239, 96, 201, 81, 184, 209, 122, 180, 110, 87, 243, 33, 248, 171, 199, + 92, 52, 183, 186, 61, 218, 171, 223, 163, 251, 25, 14, 23, 73, 30, 220, + 11, 5, 135, 22, 183, 223, 27, 12, 114, 156, 62, 165, 208, 187, 4, 33, + 103, 117, 154, 81, 100, 64, 61, 76, 216, 90, 142, 123, 149, 237, 39, 128, + 95, 81, 233, 148, 19, 150, 112, 229, 70, 185, 50, 87, 19, 155, 54, 131, + 187, 36, 64, 238, 98, 154, 111, 107, 122, 250, 64, 197, 250, 133, 189, 142, + 151, 147, 253, 196, 141, 195, 109, 210, 198, 33, 250, 218, 161, 217, 139, 8, + 170, 45, 220, 96, 45, 206, 6, 117, 142, 58, 86, 41, 173, 112, 94, 96, + 10, 179, 28, 22, 9, 69, 197, 0, 188, 242, 188, 117, 0, 98, 167, 31, + 80, 78, 189, 213, 56, 174, 29, 84, 239, 245, 211, 97, 159, 8, 104, 119, + 221, 122, 193, 248, 18, 235, 206, 130, 164, 125, 44, 15, 180, 127, 30, 116, + 158, 241, 149, 89, 190, 64, 75, 255, 235, 109, 153, 106, 132, 93, 144, 103, + 72, 239, 115, 123, 164, 163, 141, 145, 142, 62, 102, 164, 109, 82, 188, 10, + 101, 72, 190, 122, 245, 77, 145, 172, 148, 19, 148, 119, 81, 69, 2, 62, + 165, 14, 119, 7, 9, 4, 239, 150, 65, 196, 94, 219, 119, 55, 161, 128, + 42, 62, 223, 70, 21, 64, 203, 202, 107, 63, 63, 124, 118, 180, 46, 166, + 135, 73, 200, 199, 143, 119, 200, 106, 112, 57, 191, 158, 244, 238, 10, 145, + 35, 159, 138, 26, 133, 123, 136, 203, 249, 134, 206, 53, 129, 194, 120, 99, + 245, 228, 44, 188, 11, 198, 130, 56, 117, 21, 152, 163, 18, 185, 15, 171, + 149, 150, 124, 39, 87, 35, 149, 11, 82, 165, 184, 8, 39, 165, 182, 136, + 219, 61, 142, 156, 11, 187, 8, 119, 12, 84, 199, 239, 150, 56, 90, 62, + 212, 221, 209, 77, 183, 189, 214, 75, 191, 210, 62, 165, 90, 29, 54, 77, + 122, 98, 89, 33, 121, 29, 151, 222, 33, 91, 53, 148, 243, 228, 238, 5, + 199, 170, 15, 171, 53, 247, 130, 152, 220, 240, 105, 229, 210, 229, 184, 246, + 247, 46, 27, 180, 214, 46, 107, 14, 174, 116, 224, 192, 136, 239, 84, 226, + 145, 88, 138, 228, 238, 76, 121, 85, 167, 58, 187, 172, 42, 114, 29, 105, + 65, 21, 150, 41, 115, 135, 74, 190, 109, 64, 137, 126, 33, 201, 151, 153, + 81, 161, 253, 101, 199, 192, 96, 247, 249, 35, 198, 6, 245, 234, 161, 73, + 27, 178, 13, 211, 186, 145, 127, 44, 178, 169, 17, 91, 240, 77, 95, 108, + 148, 135, 209, 86, 124, 19, 35, 248, 175, 71, 182, 220, 8, 253, 224, 137, + 64, 221, 209, 77, 47, 30, 30, 233, 211, 31, 57, 54, 36, 162, 20, 13, + 76, 24, 101, 71, 101, 215, 68, 224, 175, 127, 200, 216, 228, 38, 130, 36, + 108, 195, 244, 191, 193, 68, 224, 70, 108, 193, 183, 61, 17, 98, 16, 204, + 126, 92, 235, 199, 241, 172, 84, 250, 177, 60, 43, 218, 246, 187, 240, 172, + 4, 248, 67, 120, 214, 7, 16, 208, 91, 244, 246, 198, 229, 2, 26, 142, + 168, 72, 103, 251, 32, 58, 91, 238, 115, 174, 106, 59, 54, 143, 32, 179, + 28, 46, 129, 66, 52, 233, 119, 65, 33, 1, 110, 131, 25, 187, 235, 154, + 179, 204, 252, 161, 118, 113, 223, 197, 221, 22, 68, 247, 253, 144, 240, 45, + 230, 108, 238, 160, 39, 140, 105, 38, 93, 211, 52, 16, 13, 0, 42, 184, + 175, 39, 71, 170, 122, 18, 91, 240, 77, 208, 8, 87, 137, 46, 140, 62, + 39, 240, 243, 10, 113, 88, 4, 198, 5, 198, 62, 119, 73, 5, 25, 165, + 119, 157, 117, 0, 244, 115, 234, 33, 108, 16, 107, 55, 129, 225, 35, 61, + 26, 29, 193, 148, 230, 192, 197, 142, 128, 158, 39, 83, 226, 222, 102, 97, + 243, 249, 250, 19, 140, 195, 135, 144, 242, 195, 168, 63, 59, 179, 216, 242, + 171, 120, 156, 99, 203, 41, 229, 19, 179, 229, 227, 96, 184, 80, 241, 40, + 28, 22, 158, 100, 236, 230, 206, 19, 192, 91, 100, 183, 199, 113, 231, 153, + 150, 164, 148, 242, 32, 179, 126, 118, 182, 141, 91, 7, 182, 42, 162, 56, + 234, 96, 114, 186, 173, 2, 153, 234, 252, 60, 131, 241, 249, 6, 198, 231, + 159, 24, 227, 124, 115, 226, 67, 81, 238, 124, 90, 156, 103, 219, 242, 8, + 164, 159, 159, 111, 71, 250, 252, 97, 164, 239, 171, 181, 249, 112, 149, 77, + 203, 93, 181, 15, 102, 33, 174, 79, 239, 208, 218, 136, 162, 137, 23, 237, + 223, 75, 85, 243, 33, 154, 154, 143, 208, 84, 117, 104, 241, 67, 149, 251, + 236, 83, 220, 180, 93, 125, 110, 90, 83, 99, 16, 222, 228, 166, 6, 212, + 9, 31, 62, 53, 190, 9, 111, 224, 39, 44, 79, 254, 87, 247, 143, 215, + 17, 237, 161, 16, 122, 183, 156, 46, 194, 135, 118, 189, 132, 186, 155, 219, + 136, 27, 93, 174, 120, 208, 74, 86, 161, 186, 185, 107, 18, 151, 120, 64, + 99, 85, 189, 199, 83, 173, 178, 125, 120, 88, 35, 4, 166, 213, 83, 135, + 4, 37, 69, 97, 183, 47, 97, 115, 128, 191, 1, 227, 100, 222, 157, 7, + 189, 177, 107, 94, 0, 232, 210, 237, 6, 179, 56, 28, 79, 163, 115, 63, + 37, 200, 215, 193, 28, 120, 6, 148, 144, 117, 101, 25, 27, 37, 152, 48, + 107, 208, 179, 94, 56, 143, 85, 21, 96, 61, 23, 240, 60, 54, 136, 196, + 251, 43, 126, 127, 85, 75, 205, 17, 104, 8, 10, 246, 105, 27, 148, 149, + 183, 186, 181, 201, 22, 6, 191, 139, 178, 45, 17, 179, 94, 148, 208, 67, + 59, 89, 198, 11, 54, 137, 21, 91, 84, 220, 206, 71, 243, 175, 224, 63, + 40, 72, 78, 135, 37, 132, 164, 177, 188, 182, 14, 141, 179, 54, 65, 121, + 59, 116, 141, 56, 223, 11, 234, 207, 43, 141, 82, 22, 229, 114, 165, 12, + 183, 199, 240, 25, 151, 202, 18, 225, 66, 19, 168, 221, 242, 242, 11, 208, + 103, 6, 21, 78, 121, 229, 32, 110, 66, 217, 115, 203, 109, 98, 186, 157, + 181, 163, 170, 34, 247, 72, 189, 170, 220, 169, 165, 118, 45, 56, 147, 44, + 63, 105, 182, 107, 138, 11, 173, 60, 183, 141, 123, 201, 184, 98, 230, 174, + 202, 231, 135, 222, 218, 213, 86, 13, 135, 7, 23, 244, 241, 82, 209, 47, + 77, 201, 75, 85, 55, 230, 14, 7, 96, 105, 112, 15, 252, 128, 249, 27, + 250, 116, 72, 57, 224, 170, 232, 221, 92, 23, 73, 126, 46, 169, 246, 82, + 19, 153, 241, 220, 148, 124, 233, 9, 129, 160, 204, 247, 173, 105, 30, 188, + 203, 205, 242, 224, 221, 167, 218, 255, 166, 211, 113, 64, 140, 49, 237, 66, + 180, 86, 45, 238, 255, 5, 252, 198, 30, 85, 22, 204, 126, 223, 223, 54, + 253, 121, 91, 163, 53, 18, 72, 89, 201, 30, 23, 246, 136, 235, 172, 61, + 164, 12, 12, 222, 25, 108, 222, 229, 141, 108, 139, 55, 3, 202, 71, 3, + 36, 155, 245, 7, 237, 126, 109, 128, 216, 190, 9, 124, 145, 108, 2, 104, + 209, 174, 61, 224, 220, 166, 142, 235, 188, 237, 15, 95, 215, 248, 148, 212, + 81, 185, 166, 117, 97, 17, 204, 49, 148, 60, 108, 108, 210, 89, 121, 36, + 177, 216, 27, 194, 99, 137, 101, 255, 22, 20, 241, 69, 91, 105, 135, 48, + 133, 195, 175, 7, 8, 37, 105, 186, 205, 149, 94, 47, 242, 88, 95, 252, + 94, 88, 255, 16, 100, 127, 204, 204, 124, 176, 226, 34, 28, 111, 69, 241, + 98, 47, 20, 47, 140, 172, 101, 83, 246, 56, 79, 217, 227, 79, 78, 217, + 184, 181, 253, 113, 100, 253, 81, 152, 222, 175, 250, 34, 1, 107, 43, 77, + 143, 247, 162, 233, 177, 161, 105, 91, 182, 29, 231, 105, 122, 252, 201, 105, + 154, 59, 252, 199, 160, 249, 49, 216, 221, 138, 220, 189, 168, 121, 108, 168, + 25, 23, 61, 247, 217, 89, 96, 75, 92, 15, 144, 189, 199, 190, 187, 247, + 223, 94, 112, 132, 232, 161, 224, 62, 219, 10, 154, 179, 107, 91, 161, 239, + 94, 107, 255, 6, 83, 222, 143, 105, 177, 215, 218, 179, 205, 124, 39, 105, + 103, 171, 219, 251, 55, 186, 189, 179, 205, 15, 52, 185, 189, 103, 139, 219, + 59, 27, 204, 71, 116, 159, 100, 90, 241, 145, 225, 114, 66, 76, 249, 226, + 22, 247, 155, 54, 140, 94, 163, 29, 167, 251, 31, 161, 181, 144, 163, 202, + 109, 213, 110, 25, 248, 100, 122, 216, 7, 175, 118, 14, 224, 165, 242, 131, + 95, 77, 78, 222, 127, 110, 31, 146, 16, 55, 210, 207, 181, 159, 233, 247, + 180, 125, 124, 124, 240, 67, 37, 197, 164, 88, 200, 124, 34, 100, 2, 216, + 31, 128, 203, 29, 213, 26, 92, 78, 108, 177, 127, 178, 41, 247, 79, 62, + 78, 240, 207, 226, 1, 49, 88, 50, 2, 108, 210, 40, 254, 214, 15, 226, + 166, 142, 125, 189, 83, 53, 240, 104, 164, 236, 170, 121, 235, 90, 61, 177, + 20, 3, 19, 235, 186, 103, 166, 75, 28, 98, 97, 239, 53, 106, 235, 233, + 34, 224, 103, 141, 247, 77, 45, 105, 13, 127, 212, 81, 23, 181, 96, 227, + 144, 139, 210, 204, 114, 197, 199, 161, 159, 134, 62, 112, 60, 251, 71, 44, + 58, 124, 44, 252, 193, 139, 142, 117, 200, 157, 89, 116, 8, 47, 143, 92, + 116, 244, 137, 231, 167, 66, 230, 31, 178, 232, 236, 172, 214, 224, 242, 51, + 123, 205, 153, 230, 205, 145, 112, 114, 243, 137, 144, 48, 29, 44, 199, 211, + 63, 202, 18, 105, 107, 237, 5, 139, 205, 103, 91, 77, 211, 82, 66, 155, + 14, 138, 9, 141, 208, 245, 72, 66, 59, 176, 241, 79, 248, 204, 15, 0, + 37, 125, 218, 53, 95, 142, 30, 244, 77, 79, 220, 86, 251, 67, 214, 255, + 7, 91, 177, 125, 47, 56, 200, 142, 79, 21, 236, 89, 235, 148, 189, 25, + 157, 194, 252, 174, 85, 195, 237, 156, 246, 105, 167, 70, 35, 70, 53, 232, + 188, 25, 68, 111, 226, 249, 163, 208, 252, 82, 250, 177, 233, 246, 225, 119, + 210, 170, 207, 230, 68, 207, 253, 61, 149, 234, 7, 219, 233, 153, 58, 221, + 126, 192, 216, 49, 185, 231, 121, 236, 62, 115, 191, 112, 159, 155, 115, 95, + 214, 169, 67, 35, 74, 64, 88, 49, 186, 237, 70, 24, 42, 169, 120, 245, + 206, 1, 148, 247, 102, 94, 60, 100, 98, 121, 56, 94, 98, 249, 130, 59, + 154, 40, 184, 134, 141, 37, 170, 59, 76, 71, 147, 158, 146, 64, 213, 102, + 224, 60, 183, 203, 191, 109, 86, 178, 203, 243, 171, 205, 49, 74, 138, 21, + 172, 69, 153, 241, 146, 245, 163, 207, 231, 65, 98, 115, 189, 29, 143, 105, + 99, 136, 4, 27, 199, 244, 255, 243, 82, 182, 141, 9, 59, 81, 216, 16, + 205, 81, 160, 1, 98, 172, 147, 84, 94, 45, 31, 64, 143, 93, 246, 137, + 238, 18, 91, 245, 167, 110, 88, 26, 246, 250, 240, 112, 75, 201, 43, 239, + 176, 90, 62, 255, 172, 252, 180, 182, 46, 240, 166, 86, 14, 207, 226, 181, + 138, 71, 114, 37, 131, 38, 66, 67, 149, 81, 150, 47, 95, 153, 123, 157, + 150, 90, 154, 155, 157, 158, 141, 152, 57, 106, 206, 26, 172, 119, 62, 33, + 217, 56, 21, 217, 156, 212, 255, 234, 179, 145, 7, 154, 252, 47, 63, 33, + 201, 96, 180, 128, 14, 30, 125, 210, 241, 129, 231, 26, 124, 158, 145, 156, + 111, 88, 231, 26, 174, 156, 106, 224, 167, 94, 124, 86, 241, 196, 214, 217, + 69, 27, 135, 21, 209, 39, 63, 173, 8, 163, 63, 224, 188, 98, 103, 165, + 5, 75, 235, 147, 135, 79, 44, 162, 109, 71, 22, 239, 45, 132, 78, 243, + 214, 15, 211, 79, 109, 252, 240, 215, 31, 254, 104, 35, 240, 194, 22, 20, + 224, 244, 253, 54, 148, 82, 101, 94, 251, 249, 3, 156, 89, 50, 248, 63, + 91, 232, 157, 109, 56, 132, 154, 177, 55, 168, 15, 69, 240, 15, 61, 233, + 99, 22, 153, 250, 62, 237, 12, 215, 198, 184, 171, 191, 47, 94, 185, 158, + 61, 47, 119, 255, 188, 235, 92, 29, 215, 38, 14, 129, 16, 218, 183, 120, + 183, 222, 182, 41, 155, 56, 206, 140, 189, 54, 223, 108, 144, 98, 198, 157, + 198, 124, 250, 187, 88, 73, 241, 45, 139, 98, 254, 240, 95, 111, 40, 101, + 53, 38, 221, 145, 246, 17, 83, 129, 156, 7, 237, 115, 230, 159, 124, 226, + 11, 163, 253, 239, 130, 194, 141, 214, 60, 22, 135, 123, 216, 56, 197, 225, + 245, 126, 134, 169, 156, 241, 241, 183, 232, 80, 108, 159, 107, 116, 135, 75, + 152, 245, 114, 37, 187, 52, 197, 251, 154, 36, 127, 180, 65, 214, 78, 147, + 100, 203, 32, 235, 247, 178, 67, 134, 119, 201, 125, 123, 218, 79, 172, 88, + 63, 164, 203, 171, 58, 247, 216, 234, 120, 127, 223, 158, 247, 31, 26, 171, + 71, 219, 148, 125, 148, 69, 25, 42, 220, 199, 162, 140, 27, 182, 179, 229, + 239, 230, 251, 225, 94, 180, 160, 143, 199, 62, 85, 176, 165, 145, 22, 126, + 223, 205, 31, 106, 228, 226, 49, 173, 156, 79, 167, 143, 176, 41, 7, 244, + 125, 154, 184, 216, 217, 198, 186, 197, 87, 208, 146, 144, 227, 43, 176, 72, + 124, 248, 250, 253, 227, 242, 106, 49, 135, 100, 246, 47, 186, 173, 105, 188, + 0, 246, 119, 19, 104, 194, 70, 212, 183, 106, 18, 208, 239, 61, 46, 109, + 38, 108, 26, 229, 55, 10, 132, 98, 237, 60, 193, 171, 132, 213, 219, 102, + 251, 176, 213, 248, 242, 160, 122, 87, 167, 199, 154, 123, 191, 205, 210, 207, + 6, 172, 115, 236, 123, 61, 225, 35, 238, 38, 172, 234, 173, 198, 209, 23, + 178, 212, 152, 39, 181, 243, 174, 130, 181, 216, 252, 94, 119, 21, 62, 196, + 68, 254, 35, 112, 192, 203, 20, 234, 220, 103, 153, 226, 182, 237, 234, 244, + 221, 39, 231, 127, 254, 241, 199, 75, 62, 197, 77, 40, 198, 236, 221, 94, + 82, 206, 93, 202, 151, 157, 168, 255, 17, 119, 0, 5, 158, 39, 123, 179, + 217, 248, 190, 219, 95, 206, 217, 109, 93, 235, 204, 143, 39, 180, 98, 142, + 34, 234, 196, 153, 239, 185, 119, 45, 247, 190, 229, 222, 121, 238, 61, 61, + 183, 221, 123, 209, 155, 221, 189, 114, 239, 83, 173, 217, 87, 51, 214, 80, + 48, 8, 90, 155, 162, 24, 163, 208, 51, 62, 57, 5, 95, 121, 221, 216, + 134, 75, 165, 180, 90, 223, 131, 83, 37, 184, 93, 192, 239, 125, 203, 247, + 90, 173, 202, 22, 26, 179, 91, 207, 122, 93, 151, 16, 131, 181, 133, 255, + 111, 149, 178, 189, 75, 98, 20, 120, 190, 103, 98, 20, 148, 189, 51, 4, + 120, 209, 238, 149, 16, 188, 192, 101, 139, 211, 86, 107, 157, 104, 97, 164, + 131, 8, 9, 26, 177, 35, 112, 129, 39, 228, 145, 52, 155, 32, 241, 49, + 205, 219, 224, 158, 71, 58, 86, 85, 130, 87, 175, 123, 235, 26, 220, 32, + 167, 199, 129, 102, 223, 244, 6, 84, 225, 207, 45, 75, 27, 87, 247, 68, + 41, 131, 74, 227, 70, 67, 245, 137, 198, 102, 210, 134, 134, 235, 177, 46, + 174, 71, 137, 121, 189, 139, 116, 242, 186, 71, 83, 156, 58, 201, 191, 182, + 37, 178, 180, 94, 62, 243, 13, 158, 196, 93, 234, 158, 134, 26, 22, 248, + 118, 41, 91, 153, 54, 209, 245, 108, 219, 92, 169, 239, 47, 200, 81, 207, + 214, 167, 113, 224, 10, 234, 4, 70, 217, 211, 142, 164, 60, 223, 247, 172, + 51, 210, 140, 239, 144, 243, 75, 53, 121, 233, 175, 104, 162, 187, 225, 203, + 203, 181, 138, 104, 3, 241, 72, 124, 95, 121, 205, 178, 135, 215, 242, 228, + 229, 6, 90, 174, 122, 99, 40, 135, 147, 182, 118, 231, 193, 176, 203, 209, + 236, 189, 140, 131, 56, 179, 34, 92, 219, 45, 102, 205, 33, 101, 53, 80, + 54, 39, 167, 238, 5, 46, 68, 81, 42, 163, 51, 89, 42, 236, 152, 107, + 4, 100, 187, 253, 115, 218, 36, 159, 8, 119, 27, 149, 103, 123, 2, 10, + 127, 118, 68, 255, 149, 242, 61, 212, 244, 29, 198, 209, 114, 82, 101, 42, + 111, 63, 71, 220, 141, 236, 200, 60, 216, 207, 236, 48, 229, 250, 162, 170, + 14, 83, 173, 83, 203, 56, 4, 148, 56, 28, 85, 254, 84, 83, 243, 6, + 248, 107, 55, 94, 235, 229, 29, 163, 37, 4, 221, 108, 176, 234, 192, 38, + 249, 38, 143, 47, 52, 12, 63, 243, 211, 106, 60, 189, 174, 174, 254, 163, + 124, 190, 174, 53, 249, 145, 102, 4, 201, 84, 181, 181, 58, 72, 114, 26, + 55, 65, 60, 31, 250, 154, 157, 200, 19, 64, 191, 199, 158, 211, 6, 61, + 146, 36, 105, 31, 235, 74, 216, 91, 55, 121, 151, 176, 61, 41, 29, 32, + 187, 249, 152, 250, 17, 191, 90, 130, 1, 18, 255, 128, 150, 222, 159, 97, + 177, 195, 237, 236, 208, 11, 80, 254, 96, 123, 174, 207, 182, 65, 187, 10, + 206, 181, 196, 114, 221, 188, 68, 40, 31, 245, 94, 233, 159, 101, 60, 130, + 31, 155, 247, 202, 252, 46, 67, 118, 111, 47, 127, 241, 242, 236, 72, 94, + 249, 119, 56, 158, 246, 240, 97, 48, 93, 34, 132, 196, 186, 81, 18, 84, + 164, 214, 10, 187, 186, 90, 126, 33, 157, 133, 115, 37, 102, 233, 196, 217, + 91, 204, 177, 83, 17, 188, 91, 34, 227, 85, 202, 156, 82, 57, 133, 59, + 29, 68, 22, 89, 86, 36, 176, 9, 92, 232, 32, 50, 119, 84, 81, 186, + 204, 50, 130, 132, 27, 12, 186, 206, 234, 151, 76, 193, 36, 204, 10, 181, + 234, 23, 90, 111, 199, 15, 65, 110, 185, 95, 114, 32, 50, 3, 17, 81, + 63, 31, 170, 228, 203, 164, 146, 47, 47, 37, 142, 201, 64, 119, 165, 157, + 116, 101, 240, 96, 87, 6, 197, 181, 12, 30, 234, 202, 86, 200, 69, 93, + 121, 168, 146, 205, 174, 196, 72, 240, 87, 118, 135, 109, 160, 56, 91, 154, + 59, 58, 84, 33, 158, 43, 240, 71, 149, 201, 193, 36, 101, 178, 240, 75, + 229, 69, 59, 151, 135, 8, 203, 228, 160, 71, 253, 196, 84, 86, 121, 113, + 116, 242, 124, 93, 26, 164, 205, 24, 252, 129, 205, 200, 175, 71, 183, 238, + 200, 29, 184, 49, 237, 28, 250, 233, 114, 93, 138, 3, 4, 128, 2, 91, + 90, 102, 142, 65, 71, 145, 126, 19, 149, 111, 223, 168, 242, 136, 254, 31, + 208, 255, 49, 71, 29, 210, 113, 82, 222, 68, 222, 27, 181, 226, 99, 148, + 219, 131, 242, 232, 160, 60, 56, 40, 199, 244, 31, 58, 221, 44, 115, 223, + 107, 235, 55, 202, 195, 127, 17, 135, 56, 131, 3, 170, 52, 84, 24, 251, + 134, 226, 225, 113, 5, 61, 136, 109, 162, 168, 91, 166, 41, 155, 75, 151, + 28, 238, 180, 103, 211, 113, 111, 190, 177, 83, 153, 163, 31, 154, 156, 156, + 33, 229, 186, 30, 225, 241, 105, 56, 92, 100, 171, 49, 142, 224, 216, 136, + 180, 125, 41, 55, 15, 249, 73, 59, 171, 97, 254, 170, 109, 220, 9, 131, + 149, 207, 148, 47, 176, 134, 122, 160, 161, 41, 79, 180, 113, 82, 53, 190, + 88, 181, 225, 67, 204, 229, 159, 67, 111, 77, 8, 213, 87, 134, 73, 150, + 56, 204, 92, 33, 70, 224, 192, 149, 7, 215, 116, 184, 101, 67, 194, 70, + 93, 142, 174, 228, 1, 210, 122, 163, 81, 136, 97, 112, 234, 221, 254, 120, + 201, 190, 69, 97, 66, 197, 225, 41, 206, 91, 110, 183, 119, 115, 157, 190, + 224, 75, 116, 37, 76, 221, 185, 255, 28, 174, 244, 85, 117, 25, 141, 195, + 73, 72, 88, 174, 185, 146, 179, 43, 162, 22, 130, 102, 248, 223, 183, 235, + 124, 175, 12, 222, 246, 7, 193, 120, 209, 251, 182, 235, 125, 249, 197, 51, + 118, 228, 175, 223, 17, 76, 11, 238, 75, 105, 19, 134, 171, 202, 249, 146, + 185, 36, 97, 6, 226, 25, 17, 14, 3, 138, 17, 73, 16, 80, 228, 183, + 237, 143, 123, 87, 40, 181, 152, 223, 119, 231, 87, 195, 238, 48, 156, 199, + 139, 52, 78, 71, 134, 82, 208, 59, 251, 72, 21, 155, 247, 247, 127, 251, + 9, 238, 192, 147, 147, 99, 30, 6, 254, 20, 88, 156, 235, 14, 54, 61, + 193, 146, 239, 53, 218, 199, 96, 208, 19, 84, 249, 173, 198, 23, 156, 34, + 248, 234, 10, 44, 191, 221, 58, 122, 142, 212, 12, 146, 218, 72, 217, 222, + 245, 150, 241, 165, 159, 233, 38, 162, 218, 228, 135, 205, 102, 233, 169, 65, + 235, 115, 97, 234, 193, 200, 83, 107, 244, 107, 24, 51, 97, 17, 91, 143, + 198, 16, 127, 66, 105, 213, 39, 229, 14, 194, 58, 150, 59, 52, 164, 53, + 147, 139, 50, 29, 249, 237, 53, 71, 189, 106, 115, 170, 227, 232, 244, 99, + 136, 6, 105, 122, 18, 219, 236, 25, 201, 18, 22, 143, 149, 96, 62, 65, + 56, 237, 167, 226, 107, 61, 88, 20, 98, 219, 181, 220, 254, 44, 39, 58, + 68, 10, 173, 77, 170, 71, 114, 60, 182, 101, 157, 210, 118, 169, 49, 212, + 104, 147, 209, 2, 128, 227, 223, 184, 229, 198, 180, 9, 181, 65, 124, 63, + 252, 229, 79, 238, 55, 41, 221, 153, 103, 166, 185, 37, 45, 69, 229, 35, + 92, 133, 147, 177, 96, 76, 103, 0, 128, 232, 92, 252, 15, 98, 227, 236, + 199, 200, 158, 142, 15, 187, 95, 207, 142, 30, 205, 225, 27, 213, 42, 37, + 228, 225, 38, 100, 225, 34, 45, 109, 171, 84, 234, 166, 192, 92, 61, 200, + 62, 141, 97, 253, 153, 120, 218, 214, 73, 104, 225, 104, 58, 240, 241, 200, + 49, 198, 244, 251, 140, 67, 216, 109, 136, 8, 209, 196, 95, 93, 49, 128, + 240, 229, 57, 220, 202, 170, 38, 49, 139, 95, 232, 88, 190, 3, 200, 23, + 63, 250, 250, 156, 181, 127, 53, 95, 84, 111, 71, 53, 226, 42, 9, 181, + 63, 186, 242, 31, 7, 224, 172, 179, 39, 110, 14, 125, 249, 38, 58, 80, + 175, 231, 211, 62, 198, 243, 107, 26, 74, 132, 186, 140, 38, 180, 81, 87, + 157, 213, 237, 218, 185, 115, 86, 35, 254, 59, 16, 118, 152, 99, 204, 249, + 126, 7, 241, 214, 146, 240, 105, 248, 87, 118, 31, 175, 230, 251, 86, 178, + 151, 36, 239, 151, 191, 157, 36, 59, 165, 196, 44, 164, 197, 94, 50, 205, + 210, 131, 202, 95, 148, 229, 237, 68, 162, 206, 149, 245, 71, 117, 136, 97, + 109, 99, 72, 185, 127, 158, 251, 156, 90, 176, 138, 15, 59, 235, 212, 141, + 238, 116, 62, 224, 24, 121, 74, 106, 84, 44, 68, 155, 7, 121, 17, 94, + 91, 30, 228, 81, 231, 74, 30, 205, 255, 58, 39, 216, 245, 75, 237, 104, + 51, 245, 180, 11, 54, 70, 234, 171, 53, 59, 236, 66, 215, 45, 189, 166, + 175, 146, 118, 209, 57, 120, 235, 118, 168, 212, 119, 23, 111, 47, 185, 65, + 175, 93, 245, 93, 245, 105, 203, 149, 209, 123, 125, 80, 189, 184, 165, 183, + 17, 253, 63, 120, 218, 186, 172, 123, 181, 38, 213, 83, 171, 169, 203, 18, + 97, 39, 14, 102, 62, 98, 30, 150, 6, 211, 210, 225, 32, 200, 172, 25, + 221, 178, 16, 81, 3, 113, 186, 133, 45, 184, 92, 195, 127, 187, 161, 71, + 49, 215, 53, 88, 171, 55, 100, 139, 153, 66, 216, 144, 56, 119, 26, 141, + 13, 37, 43, 121, 3, 215, 55, 221, 149, 41, 129, 104, 185, 142, 114, 152, + 132, 136, 242, 221, 128, 38, 2, 36, 215, 151, 36, 195, 92, 174, 53, 89, + 205, 157, 50, 181, 209, 65, 84, 85, 56, 222, 187, 120, 234, 64, 92, 34, + 90, 186, 84, 47, 105, 182, 124, 59, 159, 195, 107, 241, 170, 91, 6, 136, + 181, 227, 170, 175, 104, 54, 89, 169, 4, 115, 157, 198, 141, 67, 220, 73, + 234, 176, 136, 209, 40, 113, 230, 151, 147, 137, 40, 236, 38, 23, 161, 228, + 100, 86, 178, 50, 33, 241, 99, 47, 82, 26, 33, 4, 228, 224, 174, 156, + 215, 140, 243, 187, 151, 238, 253, 75, 247, 183, 151, 10, 62, 129, 213, 235, + 3, 194, 112, 243, 2, 206, 187, 136, 114, 159, 182, 8, 231, 174, 188, 140, + 236, 151, 1, 191, 92, 234, 225, 122, 77, 35, 226, 176, 149, 114, 163, 148, + 120, 154, 189, 231, 134, 102, 150, 5, 105, 229, 232, 220, 239, 180, 117, 232, + 225, 138, 30, 39, 220, 248, 164, 249, 95, 177, 231, 62, 124, 120, 194, 37, + 40, 79, 109, 113, 96, 50, 58, 171, 102, 33, 190, 200, 190, 158, 132, 209, + 144, 163, 223, 141, 206, 159, 103, 166, 5, 114, 49, 81, 133, 209, 53, 47, + 90, 230, 133, 54, 16, 152, 105, 181, 218, 58, 92, 239, 246, 140, 200, 70, + 185, 116, 128, 68, 12, 192, 185, 141, 127, 196, 14, 102, 252, 159, 167, 232, + 79, 23, 74, 95, 40, 58, 45, 224, 150, 51, 53, 121, 181, 82, 186, 195, + 234, 188, 233, 218, 90, 182, 27, 130, 188, 104, 4, 28, 55, 17, 155, 146, + 153, 5, 28, 88, 242, 158, 253, 199, 243, 247, 203, 36, 44, 244, 135, 205, + 16, 131, 63, 223, 111, 125, 234, 57, 146, 68, 75, 216, 155, 148, 111, 12, + 101, 113, 229, 220, 63, 29, 79, 97, 99, 186, 253, 16, 76, 120, 186, 193, + 245, 150, 96, 194, 29, 17, 189, 174, 157, 38, 175, 229, 31, 48, 255, 244, + 114, 227, 176, 215, 98, 33, 70, 1, 124, 54, 194, 104, 188, 109, 148, 60, + 19, 216, 217, 115, 121, 102, 97, 102, 212, 78, 213, 107, 66, 218, 193, 179, + 227, 227, 206, 51, 117, 72, 47, 222, 37, 77, 48, 121, 108, 95, 58, 138, + 253, 215, 138, 79, 102, 181, 250, 37, 63, 27, 94, 192, 111, 251, 73, 183, + 82, 175, 252, 178, 78, 220, 53, 83, 37, 165, 197, 148, 199, 80, 98, 209, + 71, 19, 88, 255, 151, 87, 107, 139, 251, 205, 12, 117, 172, 50, 129, 91, + 51, 28, 84, 167, 136, 131, 58, 2, 7, 245, 133, 112, 80, 229, 163, 243, + 231, 28, 36, 150, 131, 43, 33, 74, 99, 245, 162, 178, 106, 66, 67, 176, + 174, 92, 214, 20, 7, 115, 197, 155, 50, 18, 86, 101, 45, 83, 137, 227, + 67, 202, 167, 106, 133, 154, 71, 34, 147, 100, 113, 43, 44, 212, 206, 111, + 54, 92, 7, 39, 145, 98, 113, 233, 65, 199, 10, 55, 105, 42, 184, 35, + 30, 248, 14, 132, 83, 50, 113, 197, 173, 176, 145, 8, 248, 109, 170, 177, + 227, 55, 55, 202, 84, 206, 117, 28, 101, 202, 232, 11, 21, 50, 43, 162, + 0, 98, 171, 70, 22, 124, 251, 123, 165, 62, 80, 230, 247, 101, 142, 152, + 66, 141, 235, 201, 111, 57, 12, 148, 57, 11, 112, 80, 10, 149, 188, 48, + 107, 48, 232, 193, 243, 121, 21, 193, 115, 171, 199, 53, 26, 233, 103, 173, + 3, 121, 59, 194, 27, 63, 181, 107, 7, 237, 35, 184, 168, 30, 102, 114, + 187, 21, 39, 129, 139, 184, 153, 118, 217, 205, 111, 2, 41, 151, 174, 225, + 62, 25, 97, 236, 40, 71, 29, 53, 156, 117, 90, 142, 76, 146, 3, 245, + 35, 84, 224, 232, 4, 184, 28, 131, 61, 240, 58, 204, 249, 244, 198, 180, + 89, 12, 238, 181, 131, 56, 131, 24, 18, 127, 16, 158, 34, 143, 171, 150, + 232, 63, 70, 38, 142, 252, 232, 9, 115, 222, 143, 171, 233, 193, 58, 116, + 208, 80, 189, 238, 230, 51, 148, 90, 106, 218, 208, 232, 55, 75, 74, 234, + 174, 251, 162, 130, 209, 167, 33, 130, 66, 98, 121, 21, 84, 196, 197, 93, + 23, 207, 22, 101, 177, 231, 105, 214, 45, 142, 183, 22, 159, 69, 215, 21, + 68, 148, 79, 10, 237, 199, 100, 202, 84, 120, 8, 35, 203, 232, 109, 52, + 189, 141, 132, 251, 148, 115, 21, 194, 6, 7, 86, 10, 163, 101, 80, 50, + 107, 220, 65, 42, 242, 109, 130, 17, 214, 244, 246, 252, 232, 185, 154, 119, + 6, 119, 138, 126, 169, 156, 196, 159, 47, 45, 216, 167, 141, 45, 85, 145, + 164, 81, 238, 184, 229, 35, 18, 219, 251, 136, 52, 47, 20, 204, 216, 182, + 23, 18, 172, 31, 237, 113, 120, 165, 37, 177, 36, 64, 69, 249, 63, 255, + 250, 242, 219, 230, 237, 116, 254, 182, 25, 207, 251, 28, 27, 183, 73, 192, + 89, 241, 25, 243, 171, 172, 61, 152, 57, 154, 33, 250, 90, 98, 212, 91, + 67, 46, 29, 166, 61, 199, 132, 146, 50, 218, 200, 6, 161, 187, 217, 152, + 205, 38, 205, 198, 226, 78, 226, 139, 126, 125, 120, 168, 116, 59, 168, 167, + 28, 71, 154, 228, 167, 146, 172, 18, 188, 202, 164, 51, 252, 74, 182, 23, + 216, 220, 250, 27, 2, 4, 84, 118, 103, 207, 104, 172, 100, 189, 150, 69, + 251, 25, 107, 175, 135, 161, 232, 46, 102, 136, 242, 194, 22, 187, 254, 42, + 90, 99, 123, 77, 207, 29, 104, 17, 235, 187, 109, 197, 113, 107, 137, 242, + 146, 21, 130, 90, 156, 75, 152, 33, 38, 124, 25, 96, 104, 190, 78, 23, + 246, 55, 234, 148, 193, 115, 94, 83, 49, 231, 107, 239, 221, 48, 238, 94, + 177, 49, 113, 23, 26, 220, 76, 144, 78, 145, 12, 187, 70, 186, 239, 74, + 156, 12, 251, 48, 104, 83, 49, 96, 110, 24, 197, 170, 125, 247, 138, 149, + 194, 201, 237, 14, 87, 135, 247, 251, 225, 251, 111, 105, 86, 94, 79, 249, + 182, 172, 21, 170, 145, 4, 218, 202, 150, 58, 33, 194, 211, 104, 13, 194, + 152, 163, 24, 27, 153, 85, 62, 42, 145, 28, 123, 97, 180, 205, 53, 12, + 84, 13, 185, 126, 26, 157, 192, 246, 10, 183, 216, 131, 241, 85, 132, 54, + 45, 40, 52, 160, 234, 221, 178, 71, 51, 7, 46, 233, 180, 249, 237, 97, + 6, 189, 36, 137, 88, 220, 16, 165, 36, 106, 46, 107, 4, 18, 74, 111, + 173, 211, 35, 23, 217, 31, 113, 126, 40, 155, 99, 155, 176, 238, 112, 136, + 22, 166, 81, 233, 9, 163, 87, 2, 181, 8, 183, 222, 86, 177, 239, 184, + 89, 191, 191, 137, 85, 191, 70, 150, 67, 185, 132, 171, 162, 82, 194, 212, + 228, 84, 13, 230, 98, 64, 193, 104, 113, 144, 151, 39, 101, 111, 189, 46, + 199, 206, 230, 137, 13, 203, 204, 45, 168, 206, 66, 122, 8, 39, 107, 37, + 81, 221, 125, 18, 111, 79, 137, 33, 58, 37, 209, 246, 116, 21, 175, 79, + 203, 225, 228, 116, 85, 246, 158, 32, 150, 121, 157, 24, 156, 9, 113, 143, + 119, 170, 186, 162, 194, 255, 65, 236, 220, 33, 78, 57, 193, 175, 232, 185, + 211, 41, 13, 85, 229, 60, 28, 86, 239, 137, 65, 116, 67, 87, 158, 60, + 252, 134, 213, 59, 183, 69, 235, 38, 253, 30, 18, 231, 92, 163, 165, 208, + 189, 171, 233, 47, 236, 60, 208, 71, 160, 85, 121, 105, 215, 14, 145, 2, + 239, 77, 140, 174, 82, 58, 9, 205, 65, 119, 9, 129, 44, 80, 213, 157, + 239, 183, 165, 170, 59, 174, 116, 88, 253, 149, 36, 231, 58, 224, 209, 138, + 38, 117, 63, 161, 54, 232, 84, 1, 204, 169, 168, 240, 243, 207, 127, 173, + 154, 188, 247, 110, 200, 85, 38, 103, 233, 73, 173, 88, 5, 127, 131, 185, + 220, 109, 189, 189, 6, 71, 237, 118, 204, 173, 76, 104, 35, 235, 30, 66, + 224, 206, 196, 88, 30, 44, 47, 201, 200, 224, 185, 61, 137, 125, 238, 149, + 158, 248, 224, 148, 91, 138, 253, 4, 181, 97, 72, 15, 167, 83, 7, 18, + 187, 227, 160, 1, 0, 154, 241, 187, 55, 112, 145, 166, 145, 137, 48, 25, + 247, 212, 200, 179, 214, 231, 159, 83, 163, 241, 23, 41, 135, 72, 1, 26, + 17, 49, 33, 45, 197, 27, 35, 199, 24, 47, 203, 160, 214, 152, 231, 7, + 71, 24, 77, 54, 245, 161, 75, 24, 78, 44, 64, 223, 43, 170, 254, 61, + 229, 124, 175, 126, 195, 17, 148, 90, 55, 26, 141, 141, 180, 253, 44, 44, + 52, 212, 240, 38, 103, 46, 150, 115, 49, 137, 105, 145, 137, 50, 221, 27, + 79, 181, 27, 90, 43, 90, 242, 221, 86, 93, 246, 136, 86, 82, 132, 168, + 152, 208, 116, 214, 253, 96, 211, 161, 140, 25, 137, 17, 18, 180, 53, 9, + 209, 168, 238, 185, 101, 173, 213, 95, 230, 93, 95, 244, 121, 115, 91, 201, + 178, 212, 130, 193, 201, 123, 109, 112, 66, 152, 37, 89, 89, 95, 43, 178, + 63, 80, 29, 235, 140, 89, 74, 6, 59, 75, 179, 196, 21, 153, 156, 32, + 254, 90, 122, 138, 12, 139, 155, 2, 19, 171, 126, 54, 86, 239, 134, 139, + 2, 109, 100, 197, 24, 216, 97, 104, 133, 158, 181, 143, 63, 115, 191, 56, + 254, 76, 103, 200, 9, 130, 202, 196, 66, 134, 18, 92, 226, 159, 226, 105, + 16, 204, 36, 233, 67, 84, 215, 214, 114, 223, 47, 214, 81, 219, 170, 81, + 9, 137, 220, 249, 134, 185, 129, 100, 59, 162, 13, 42, 188, 163, 108, 63, + 252, 233, 207, 205, 215, 223, 124, 11, 251, 135, 249, 180, 215, 31, 237, 27, + 195, 149, 59, 224, 31, 61, 215, 27, 202, 46, 53, 116, 163, 180, 137, 147, + 220, 146, 239, 249, 70, 165, 92, 246, 178, 194, 82, 219, 47, 123, 201, 110, + 144, 83, 68, 39, 95, 58, 242, 37, 81, 51, 31, 165, 106, 230, 84, 169, + 108, 33, 43, 143, 35, 14, 210, 66, 72, 42, 123, 119, 229, 246, 93, 185, + 147, 69, 85, 162, 215, 77, 148, 186, 150, 254, 247, 33, 133, 110, 254, 52, + 13, 50, 140, 168, 104, 160, 211, 168, 190, 70, 252, 168, 239, 16, 228, 73, + 189, 246, 248, 145, 36, 105, 122, 33, 164, 87, 95, 115, 240, 169, 93, 18, + 110, 77, 103, 108, 213, 206, 249, 151, 214, 98, 39, 143, 236, 238, 108, 16, + 52, 176, 211, 214, 143, 68, 114, 220, 200, 64, 178, 112, 146, 1, 59, 99, + 110, 81, 43, 200, 254, 239, 74, 212, 68, 204, 10, 177, 5, 213, 140, 87, + 97, 68, 134, 67, 164, 212, 104, 17, 204, 113, 116, 150, 141, 106, 154, 55, + 35, 249, 100, 228, 173, 49, 244, 191, 129, 196, 85, 21, 40, 51, 115, 191, + 182, 65, 241, 197, 39, 25, 31, 74, 248, 36, 13, 129, 187, 175, 119, 68, + 183, 69, 149, 224, 170, 101, 249, 200, 64, 119, 214, 98, 139, 2, 41, 233, + 10, 91, 189, 43, 82, 148, 86, 221, 167, 106, 113, 13, 172, 0, 64, 155, + 137, 107, 15, 42, 134, 10, 244, 223, 148, 138, 249, 22, 37, 49, 32, 99, + 49, 28, 94, 178, 221, 49, 173, 209, 149, 93, 103, 138, 159, 142, 122, 5, + 51, 255, 59, 168, 215, 222, 185, 126, 79, 234, 101, 22, 63, 90, 63, 146, + 136, 219, 46, 254, 93, 197, 245, 206, 154, 245, 199, 67, 56, 29, 105, 184, + 248, 215, 227, 243, 34, 48, 150, 206, 85, 112, 77, 56, 225, 139, 194, 180, + 220, 95, 220, 62, 197, 97, 0, 206, 0, 192, 11, 43, 125, 40, 67, 219, + 195, 215, 216, 30, 232, 151, 126, 94, 127, 205, 87, 76, 79, 213, 63, 16, + 23, 80, 159, 230, 0, 66, 237, 180, 244, 93, 245, 105, 219, 253, 71, 237, + 208, 167, 76, 29, 151, 234, 190, 68, 16, 189, 176, 250, 180, 67, 169, 167, + 234, 59, 7, 188, 190, 115, 16, 190, 168, 34, 103, 173, 233, 135, 167, 94, + 237, 164, 197, 162, 20, 73, 36, 196, 104, 227, 204, 31, 55, 83, 177, 87, + 28, 18, 247, 183, 128, 77, 91, 131, 88, 108, 105, 122, 135, 155, 222, 0, + 16, 29, 33, 242, 10, 45, 128, 100, 230, 35, 106, 164, 14, 150, 209, 115, + 175, 120, 255, 226, 231, 218, 57, 126, 174, 106, 47, 122, 39, 87, 210, 198, + 58, 135, 102, 188, 208, 30, 123, 72, 202, 240, 16, 24, 146, 36, 15, 250, + 203, 66, 68, 205, 45, 37, 223, 224, 185, 223, 250, 202, 162, 71, 246, 251, + 70, 14, 201, 163, 46, 157, 146, 184, 134, 151, 197, 95, 14, 81, 244, 224, + 182, 91, 165, 95, 57, 236, 25, 172, 113, 205, 169, 33, 204, 26, 75, 135, + 44, 128, 240, 39, 208, 168, 235, 113, 192, 52, 35, 152, 212, 143, 81, 68, + 127, 56, 164, 87, 230, 136, 155, 18, 65, 77, 46, 120, 23, 195, 85, 111, + 229, 206, 175, 40, 219, 156, 219, 179, 178, 7, 38, 96, 116, 70, 194, 41, + 253, 14, 206, 202, 29, 135, 205, 254, 46, 88, 179, 78, 21, 28, 220, 214, + 92, 126, 38, 66, 58, 24, 233, 231, 14, 61, 15, 106, 151, 107, 81, 174, + 116, 68, 174, 77, 142, 161, 68, 123, 238, 65, 103, 254, 240, 42, 185, 33, + 199, 44, 39, 66, 214, 248, 179, 185, 114, 206, 199, 193, 206, 5, 142, 21, + 31, 218, 155, 197, 22, 189, 71, 22, 154, 101, 238, 98, 193, 179, 192, 192, + 130, 178, 8, 206, 230, 254, 114, 175, 224, 187, 7, 130, 248, 127, 180, 104, + 194, 177, 44, 78, 207, 71, 107, 149, 215, 245, 80, 234, 241, 154, 207, 191, + 212, 51, 81, 248, 235, 176, 210, 86, 174, 210, 225, 185, 143, 72, 245, 87, + 28, 231, 14, 97, 250, 100, 58, 156, 209, 20, 46, 85, 91, 167, 112, 204, + 95, 10, 230, 83, 226, 173, 26, 68, 36, 45, 62, 10, 172, 99, 146, 64, + 238, 180, 228, 199, 195, 51, 24, 186, 72, 1, 74, 7, 95, 130, 18, 156, + 31, 178, 106, 91, 29, 82, 41, 142, 180, 135, 184, 215, 185, 210, 115, 69, + 235, 199, 168, 217, 22, 27, 80, 17, 71, 33, 48, 215, 137, 7, 220, 220, + 97, 89, 78, 173, 124, 253, 221, 228, 186, 51, 128, 14, 155, 197, 228, 198, + 177, 182, 192, 90, 17, 5, 177, 62, 162, 86, 162, 138, 238, 220, 118, 34, + 174, 82, 131, 226, 240, 55, 31, 199, 167, 208, 67, 148, 14, 217, 106, 169, + 209, 96, 3, 225, 58, 98, 4, 122, 124, 62, 196, 235, 130, 250, 205, 60, + 192, 142, 169, 103, 94, 238, 168, 150, 14, 213, 210, 102, 247, 32, 109, 152, + 28, 141, 72, 188, 151, 95, 108, 3, 115, 124, 238, 80, 111, 214, 58, 130, + 1, 175, 91, 148, 88, 154, 95, 208, 92, 233, 40, 235, 132, 199, 83, 247, + 172, 1, 44, 35, 150, 228, 175, 157, 65, 67, 37, 51, 9, 179, 78, 20, + 2, 25, 123, 36, 81, 155, 148, 65, 2, 176, 61, 56, 132, 118, 101, 147, + 7, 208, 136, 165, 125, 127, 211, 143, 197, 166, 204, 94, 32, 178, 175, 221, + 226, 146, 91, 93, 128, 75, 133, 185, 251, 15, 217, 16, 225, 90, 106, 157, + 206, 147, 246, 69, 216, 197, 175, 166, 8, 59, 153, 134, 103, 215, 69, 173, + 219, 70, 169, 164, 63, 141, 232, 15, 246, 49, 8, 251, 186, 138, 84, 250, + 103, 195, 31, 8, 202, 189, 140, 34, 32, 180, 216, 137, 239, 56, 20, 183, + 9, 69, 65, 133, 231, 150, 210, 192, 221, 217, 32, 206, 171, 91, 30, 12, + 50, 32, 17, 46, 156, 227, 226, 196, 186, 246, 108, 188, 141, 76, 65, 87, + 193, 141, 113, 26, 70, 93, 162, 113, 192, 144, 221, 6, 90, 214, 30, 103, + 78, 143, 16, 251, 25, 83, 234, 208, 32, 173, 157, 201, 196, 59, 111, 135, + 255, 61, 146, 127, 173, 172, 198, 99, 30, 245, 42, 136, 218, 184, 144, 96, + 93, 191, 253, 129, 215, 161, 169, 125, 239, 92, 60, 104, 80, 23, 184, 128, + 116, 187, 41, 207, 218, 115, 15, 43, 126, 219, 24, 195, 206, 93, 71, 9, + 68, 194, 123, 48, 30, 216, 218, 150, 114, 201, 174, 49, 19, 181, 220, 212, + 41, 85, 17, 121, 112, 78, 1, 33, 182, 79, 91, 225, 91, 75, 97, 179, + 109, 59, 164, 72, 21, 147, 98, 161, 235, 183, 49, 241, 251, 37, 220, 189, + 107, 240, 142, 6, 226, 197, 11, 77, 165, 120, 212, 80, 135, 28, 15, 148, + 86, 25, 120, 215, 63, 190, 132, 177, 65, 135, 35, 221, 246, 49, 207, 143, + 234, 176, 4, 236, 35, 39, 150, 6, 132, 12, 21, 70, 65, 18, 60, 36, + 136, 163, 11, 204, 205, 70, 234, 247, 66, 155, 241, 250, 207, 164, 250, 241, + 69, 253, 89, 29, 219, 35, 183, 3, 181, 114, 198, 142, 73, 104, 0, 208, + 49, 28, 221, 60, 187, 212, 113, 73, 249, 145, 237, 18, 159, 93, 38, 183, + 55, 0, 72, 154, 247, 177, 128, 98, 228, 237, 151, 234, 122, 103, 111, 192, + 21, 185, 108, 223, 140, 37, 78, 62, 192, 239, 209, 101, 169, 234, 253, 220, + 162, 127, 241, 215, 99, 27, 125, 201, 197, 31, 153, 121, 210, 125, 211, 109, + 211, 7, 84, 80, 129, 94, 180, 234, 104, 27, 52, 206, 19, 102, 203, 203, + 173, 10, 28, 163, 16, 61, 133, 102, 74, 92, 56, 8, 152, 90, 62, 167, + 21, 211, 185, 228, 5, 100, 130, 235, 50, 8, 46, 207, 198, 82, 46, 31, + 176, 187, 108, 44, 69, 127, 99, 226, 100, 7, 211, 32, 46, 69, 211, 5, + 142, 101, 105, 247, 196, 237, 178, 158, 144, 6, 40, 182, 253, 13, 19, 205, + 55, 202, 38, 87, 220, 159, 49, 123, 255, 198, 141, 15, 68, 62, 231, 27, + 125, 221, 196, 182, 189, 56, 238, 61, 239, 210, 146, 155, 175, 238, 108, 106, + 226, 92, 69, 89, 163, 197, 146, 215, 40, 176, 138, 161, 68, 124, 151, 155, + 92, 28, 48, 75, 78, 66, 141, 235, 154, 100, 117, 50, 85, 23, 88, 255, + 255, 142, 6, 254, 26, 1, 236, 153, 228, 55, 22, 15, 163, 171, 238, 152, + 250, 48, 142, 207, 161, 181, 212, 139, 126, 151, 184, 48, 251, 173, 119, 39, + 87, 232, 108, 36, 125, 107, 128, 36, 90, 213, 221, 86, 197, 223, 105, 207, + 71, 162, 175, 196, 226, 103, 45, 191, 192, 141, 110, 149, 220, 8, 163, 207, + 124, 86, 150, 172, 251, 122, 149, 213, 46, 113, 146, 162, 9, 120, 11, 246, + 14, 25, 50, 233, 173, 79, 236, 5, 140, 75, 147, 238, 250, 173, 207, 180, + 44, 153, 244, 25, 183, 187, 62, 219, 118, 217, 198, 224, 112, 247, 87, 117, + 36, 119, 205, 116, 174, 161, 165, 67, 30, 134, 227, 188, 231, 48, 36, 169, + 34, 15, 84, 219, 111, 47, 90, 3, 242, 103, 148, 46, 188, 156, 168, 183, + 49, 156, 151, 203, 157, 141, 44, 41, 10, 234, 112, 204, 72, 228, 76, 155, + 230, 2, 4, 203, 229, 237, 123, 191, 91, 174, 11, 55, 212, 143, 18, 54, + 14, 225, 57, 168, 146, 73, 15, 135, 255, 106, 58, 9, 23, 220, 140, 40, + 109, 111, 129, 142, 122, 152, 189, 6, 76, 155, 152, 32, 33, 227, 41, 44, + 151, 33, 235, 70, 172, 198, 5, 216, 254, 60, 119, 109, 52, 141, 38, 213, + 17, 160, 206, 63, 124, 190, 252, 123, 170, 254, 233, 223, 215, 71, 120, 248, + 193, 135, 221, 119, 245, 31, 63, 183, 15, 255, 249, 115, 155, 132, 199, 158, + 207, 54, 227, 213, 127, 178, 40, 25, 14, 171, 63, 156, 249, 222, 115, 86, + 205, 28, 152, 144, 33, 253, 195, 118, 43, 23, 240, 85, 220, 242, 145, 196, + 246, 252, 152, 190, 244, 62, 171, 34, 30, 27, 101, 196, 153, 84, 205, 177, + 247, 71, 121, 148, 168, 121, 224, 199, 46, 102, 189, 113, 64, 168, 194, 185, + 128, 126, 236, 178, 121, 192, 218, 109, 157, 249, 221, 1, 141, 31, 175, 40, + 184, 101, 73, 68, 57, 235, 234, 76, 233, 129, 110, 142, 12, 190, 99, 208, + 9, 29, 200, 130, 88, 231, 49, 222, 226, 75, 46, 147, 67, 131, 183, 150, + 37, 187, 85, 214, 210, 52, 208, 115, 139, 164, 187, 248, 134, 254, 66, 17, + 25, 227, 109, 138, 180, 254, 116, 58, 166, 159, 95, 131, 5, 175, 67, 189, + 107, 164, 193, 104, 226, 189, 194, 129, 238, 213, 244, 150, 158, 72, 216, 233, + 33, 165, 55, 153, 169, 247, 230, 102, 25, 242, 205, 81, 118, 16, 4, 51, + 254, 25, 211, 42, 140, 223, 40, 198, 87, 40, 140, 80, 77, 143, 53, 159, + 180, 216, 113, 25, 34, 76, 184, 160, 127, 175, 166, 119, 96, 101, 103, 163, + 94, 108, 234, 194, 114, 201, 183, 10, 222, 163, 211, 212, 197, 247, 184, 125, + 69, 201, 11, 98, 198, 166, 120, 35, 12, 227, 68, 149, 158, 166, 146, 176, + 156, 95, 133, 200, 215, 91, 210, 174, 214, 227, 78, 245, 151, 241, 12, 127, + 0, 101, 126, 213, 198, 114, 251, 91, 112, 53, 189, 203, 40, 196, 114, 171, + 77, 50, 120, 214, 169, 116, 58, 128, 91, 111, 171, 10, 113, 176, 148, 80, + 152, 129, 100, 45, 34, 71, 252, 255, 51, 73, 93, 237, 231, 250, 137, 83, + 107, 186, 120, 50, 33, 178, 80, 202, 37, 67, 121, 150, 61, 87, 43, 185, + 228, 218, 38, 42, 203, 88, 173, 119, 112, 80, 237, 148, 48, 244, 177, 95, + 94, 213, 187, 54, 49, 196, 107, 132, 63, 39, 129, 242, 186, 90, 230, 247, + 218, 154, 173, 168, 216, 204, 9, 10, 50, 24, 85, 212, 20, 91, 84, 104, + 17, 29, 222, 229, 188, 207, 156, 242, 43, 167, 230, 58, 101, 13, 132, 25, + 8, 206, 197, 86, 24, 195, 144, 86, 253, 97, 47, 28, 91, 105, 204, 196, + 24, 94, 82, 40, 60, 149, 51, 44, 135, 119, 137, 53, 61, 155, 96, 179, + 85, 139, 62, 54, 79, 198, 66, 241, 6, 64, 125, 37, 30, 65, 247, 6, + 119, 114, 5, 107, 250, 18, 45, 43, 101, 217, 2, 68, 79, 215, 185, 181, + 112, 135, 17, 239, 50, 52, 122, 156, 156, 168, 17, 19, 148, 177, 161, 127, + 151, 45, 88, 98, 106, 254, 11, 71, 221, 144, 184, 214, 213, 229, 84, 249, + 32, 89, 4, 36, 225, 68, 233, 237, 86, 246, 89, 151, 114, 246, 199, 203, + 65, 208, 213, 90, 167, 144, 112, 15, 125, 108, 52, 101, 109, 236, 61, 245, + 218, 38, 186, 5, 238, 149, 234, 237, 241, 118, 4, 22, 219, 18, 91, 54, + 79, 10, 21, 84, 47, 168, 234, 210, 45, 16, 210, 10, 214, 232, 112, 110, + 47, 210, 249, 51, 133, 130, 182, 122, 219, 9, 91, 90, 96, 142, 19, 83, + 4, 236, 141, 196, 114, 11, 248, 235, 166, 37, 217, 202, 194, 145, 18, 98, + 72, 49, 93, 46, 140, 237, 68, 96, 56, 82, 27, 75, 22, 229, 104, 132, + 176, 26, 254, 50, 33, 37, 167, 172, 235, 213, 38, 23, 48, 142, 40, 119, + 136, 17, 77, 251, 168, 116, 183, 7, 5, 106, 154, 137, 79, 228, 244, 210, + 47, 183, 89, 233, 178, 10, 227, 238, 44, 152, 247, 137, 75, 124, 163, 112, + 11, 153, 13, 40, 14, 171, 225, 203, 122, 56, 169, 29, 32, 69, 91, 166, + 101, 115, 182, 215, 4, 35, 147, 179, 205, 57, 135, 13, 67, 55, 213, 208, + 45, 79, 220, 242, 75, 34, 213, 218, 134, 34, 128, 22, 26, 48, 13, 102, + 115, 113, 205, 248, 220, 119, 251, 136, 203, 184, 96, 134, 251, 36, 179, 227, + 108, 203, 147, 241, 78, 74, 96, 31, 216, 57, 178, 55, 198, 49, 171, 112, + 15, 150, 152, 6, 90, 129, 243, 52, 246, 175, 218, 91, 212, 35, 55, 23, + 226, 102, 239, 63, 205, 30, 163, 62, 245, 38, 83, 41, 24, 36, 11, 115, + 45, 127, 16, 206, 195, 254, 104, 204, 200, 241, 252, 40, 88, 146, 40, 22, + 241, 241, 13, 17, 87, 56, 29, 132, 125, 122, 233, 248, 218, 104, 101, 189, + 125, 102, 23, 84, 180, 125, 207, 74, 157, 172, 194, 23, 1, 86, 209, 78, + 113, 70, 168, 94, 239, 251, 87, 253, 57, 159, 93, 138, 245, 65, 31, 158, + 119, 249, 122, 72, 198, 37, 44, 177, 232, 250, 98, 120, 71, 160, 30, 201, + 150, 102, 93, 45, 196, 209, 8, 145, 126, 42, 197, 51, 232, 54, 85, 146, + 101, 6, 203, 37, 153, 16, 59, 237, 176, 204, 22, 216, 193, 58, 34, 135, + 43, 110, 220, 73, 17, 234, 106, 100, 186, 6, 145, 174, 70, 162, 193, 148, + 143, 133, 162, 189, 254, 55, 219, 46, 49, 103, 11, 246, 69, 203, 219, 132, + 222, 34, 157, 178, 233, 136, 147, 30, 120, 164, 131, 159, 221, 47, 45, 151, + 19, 229, 182, 181, 85, 78, 194, 59, 219, 155, 110, 181, 71, 28, 56, 78, + 9, 122, 47, 95, 65, 119, 120, 33, 78, 155, 211, 161, 17, 103, 3, 233, + 154, 162, 157, 58, 211, 34, 178, 195, 185, 238, 86, 167, 218, 86, 221, 218, + 153, 51, 95, 222, 21, 151, 206, 181, 82, 182, 113, 57, 135, 7, 186, 102, + 234, 91, 174, 242, 244, 254, 41, 47, 211, 68, 61, 236, 251, 53, 232, 242, + 161, 131, 231, 172, 197, 97, 170, 71, 204, 184, 220, 44, 16, 135, 29, 153, + 187, 103, 218, 103, 71, 114, 204, 118, 59, 26, 152, 235, 198, 184, 202, 128, + 19, 17, 74, 194, 205, 99, 163, 7, 7, 76, 40, 161, 38, 55, 252, 247, + 64, 43, 127, 89, 189, 76, 159, 243, 186, 13, 107, 8, 196, 205, 49, 33, + 7, 214, 162, 34, 69, 90, 10, 220, 4, 117, 175, 36, 219, 30, 142, 87, + 176, 24, 36, 160, 252, 42, 81, 70, 48, 164, 133, 113, 80, 219, 182, 26, + 72, 11, 74, 73, 67, 204, 38, 237, 249, 238, 90, 142, 225, 216, 247, 132, + 83, 62, 112, 106, 233, 38, 173, 27, 148, 154, 61, 37, 228, 217, 235, 247, + 167, 115, 142, 38, 76, 67, 131, 166, 104, 153, 181, 124, 64, 131, 82, 87, + 43, 0, 90, 171, 3, 165, 205, 165, 31, 6, 153, 217, 182, 235, 226, 79, + 2, 254, 35, 94, 174, 5, 153, 12, 138, 218, 121, 81, 193, 124, 170, 92, + 62, 241, 43, 110, 69, 69, 83, 140, 56, 54, 225, 208, 160, 122, 10, 175, + 60, 212, 193, 197, 160, 59, 8, 110, 66, 86, 94, 208, 82, 194, 108, 28, + 127, 236, 22, 232, 151, 112, 153, 139, 182, 240, 1, 73, 226, 2, 96, 151, + 147, 149, 74, 10, 38, 179, 206, 95, 247, 150, 36, 128, 247, 34, 94, 230, + 151, 81, 56, 148, 155, 196, 109, 63, 238, 141, 23, 159, 207, 2, 90, 24, + 231, 188, 210, 207, 168, 124, 60, 69, 190, 35, 31, 246, 186, 187, 214, 252, + 180, 174, 237, 75, 61, 231, 193, 193, 203, 49, 78, 41, 50, 175, 158, 245, + 234, 181, 220, 98, 135, 224, 29, 109, 88, 135, 101, 93, 46, 4, 233, 18, + 109, 192, 147, 55, 143, 223, 60, 219, 100, 15, 102, 185, 123, 25, 234, 73, + 31, 168, 247, 99, 118, 135, 216, 101, 59, 131, 46, 56, 107, 152, 60, 200, + 219, 125, 230, 237, 55, 243, 134, 187, 1, 119, 250, 247, 94, 255, 254, 102, + 169, 5, 137, 240, 231, 169, 194, 241, 181, 84, 33, 67, 56, 221, 96, 165, + 221, 188, 51, 16, 190, 180, 72, 187, 228, 194, 30, 222, 159, 70, 65, 22, + 80, 24, 167, 167, 24, 125, 101, 60, 111, 136, 3, 33, 201, 146, 30, 144, + 12, 130, 184, 63, 15, 175, 8, 54, 113, 23, 160, 178, 202, 104, 177, 152, + 197, 39, 205, 102, 16, 53, 110, 67, 154, 117, 136, 51, 210, 152, 206, 175, + 155, 120, 107, 74, 69, 66, 152, 149, 29, 106, 50, 141, 50, 95, 35, 75, + 255, 254, 230, 123, 207, 180, 28, 43, 152, 242, 5, 81, 242, 243, 255, 168, + 251, 206, 54, 183, 109, 101, 225, 239, 250, 21, 138, 178, 57, 222, 93, 114, + 87, 236, 34, 237, 200, 121, 212, 123, 239, 242, 217, 236, 75, 117, 170, 75, + 84, 247, 245, 127, 127, 103, 0, 146, 162, 180, 197, 142, 147, 123, 207, 115, + 18, 47, 69, 162, 14, 128, 1, 48, 3, 76, 57, 93, 97, 140, 12, 67, + 34, 91, 195, 124, 49, 36, 172, 231, 106, 132, 220, 202, 217, 138, 75, 53, + 27, 104, 227, 179, 150, 145, 243, 97, 155, 173, 145, 236, 189, 219, 14, 144, + 175, 3, 20, 202, 188, 158, 175, 32, 200, 240, 93, 143, 218, 229, 30, 72, + 90, 74, 108, 50, 241, 15, 34, 10, 43, 163, 71, 13, 104, 30, 9, 146, + 30, 148, 111, 68, 129, 119, 110, 108, 130, 62, 128, 127, 182, 181, 172, 143, + 226, 61, 63, 47, 195, 202, 173, 64, 131, 197, 0, 171, 241, 172, 6, 111, + 50, 124, 64, 160, 200, 10, 28, 4, 200, 172, 166, 176, 178, 200, 242, 154, + 196, 10, 162, 200, 6, 88, 65, 128, 20, 18, 160, 46, 222, 210, 138, 128, + 197, 172, 162, 65, 128, 192, 170, 172, 166, 177, 80, 142, 0, 145, 30, 1, + 239, 13, 33, 7, 100, 132, 4, 16, 175, 66, 120, 128, 229, 5, 12, 148, + 128, 147, 66, 209, 33, 8, 215, 2, 172, 34, 176, 88, 184, 44, 176, 2, + 175, 65, 173, 144, 135, 15, 176, 34, 212, 2, 195, 32, 176, 50, 228, 10, + 192, 183, 200, 170, 42, 148, 11, 21, 240, 146, 198, 2, 153, 165, 98, 4, + 100, 196, 195, 74, 4, 26, 74, 11, 96, 107, 84, 22, 254, 241, 80, 3, + 68, 242, 10, 252, 96, 107, 224, 85, 212, 88, 132, 2, 114, 41, 10, 27, + 192, 98, 32, 135, 12, 33, 208, 92, 143, 138, 181, 242, 208, 56, 104, 139, + 32, 176, 208, 37, 2, 143, 249, 160, 27, 160, 133, 2, 86, 194, 65, 95, + 8, 172, 196, 179, 64, 244, 65, 86, 65, 130, 31, 136, 146, 160, 104, 78, + 128, 210, 68, 86, 150, 88, 5, 37, 161, 88, 5, 74, 83, 112, 79, 132, + 126, 0, 64, 57, 54, 128, 221, 169, 177, 1, 168, 17, 154, 196, 3, 232, + 2, 167, 178, 42, 84, 6, 160, 42, 216, 106, 168, 64, 195, 88, 108, 9, + 188, 67, 54, 30, 218, 203, 203, 26, 171, 194, 171, 130, 149, 32, 12, 144, + 67, 131, 110, 224, 161, 64, 30, 34, 68, 52, 151, 68, 122, 14, 7, 6, + 128, 194, 5, 77, 128, 196, 208, 243, 0, 9, 192, 37, 66, 33, 216, 241, + 88, 17, 73, 32, 179, 42, 140, 21, 68, 242, 144, 141, 67, 64, 96, 128, + 1, 2, 232, 24, 72, 231, 129, 138, 101, 236, 62, 40, 30, 1, 133, 8, + 149, 133, 193, 21, 112, 40, 177, 147, 2, 216, 51, 216, 89, 16, 35, 33, + 128, 120, 165, 135, 125, 32, 99, 111, 3, 130, 96, 111, 65, 211, 17, 103, + 56, 252, 133, 6, 41, 80, 174, 132, 121, 97, 164, 1, 10, 172, 140, 133, + 209, 16, 8, 94, 177, 208, 30, 30, 58, 131, 7, 124, 9, 64, 52, 98, + 158, 128, 200, 6, 213, 7, 32, 88, 69, 68, 128, 119, 14, 194, 120, 196, + 34, 133, 213, 176, 177, 104, 11, 13, 58, 24, 70, 86, 0, 248, 120, 13, + 71, 10, 194, 208, 175, 16, 130, 131, 65, 80, 61, 150, 8, 8, 38, 192, + 176, 169, 48, 114, 16, 2, 195, 38, 64, 47, 11, 18, 98, 45, 188, 194, + 15, 244, 2, 126, 105, 216, 143, 18, 139, 232, 192, 67, 98, 94, 195, 40, + 196, 17, 236, 12, 137, 85, 17, 215, 160, 100, 28, 68, 156, 37, 208, 74, + 232, 109, 9, 223, 32, 63, 36, 195, 77, 3, 241, 12, 81, 10, 122, 26, + 241, 5, 219, 2, 144, 64, 169, 208, 7, 208, 112, 15, 180, 44, 128, 224, + 64, 203, 1, 36, 180, 119, 197, 195, 28, 131, 118, 2, 78, 10, 80, 42, + 98, 13, 178, 16, 42, 135, 154, 229, 75, 50, 73, 93, 147, 150, 117, 79, + 96, 84, 61, 215, 123, 253, 219, 13, 145, 232, 217, 220, 227, 255, 183, 228, + 159, 130, 34, 74, 68, 15, 15, 221, 67, 127, 242, 60, 79, 251, 235, 229, + 237, 134, 181, 164, 127, 200, 23, 188, 179, 40, 153, 180, 236, 206, 22, 61, + 212, 100, 15, 218, 50, 34, 183, 119, 159, 188, 87, 58, 237, 84, 141, 221, + 107, 167, 165, 170, 235, 203, 47, 147, 223, 224, 227, 9, 10, 49, 15, 8, + 41, 42, 50, 61, 125, 66, 201, 142, 37, 126, 155, 135, 47, 212, 166, 207, + 1, 133, 128, 120, 98, 36, 232, 183, 15, 144, 248, 72, 19, 11, 118, 98, + 252, 54, 143, 86, 226, 227, 85, 226, 19, 77, 44, 218, 137, 241, 219, 60, + 89, 137, 79, 151, 137, 15, 40, 183, 123, 35, 125, 242, 28, 201, 139, 252, + 201, 115, 34, 47, 10, 68, 161, 28, 47, 196, 51, 222, 91, 2, 223, 31, + 104, 95, 237, 227, 30, 30, 0, 254, 17, 35, 143, 78, 228, 17, 35, 133, + 143, 35, 120, 64, 228, 9, 35, 79, 78, 228, 9, 35, 197, 143, 61, 120, + 160, 46, 227, 30, 251, 30, 10, 127, 128, 194, 239, 252, 168, 40, 190, 71, + 144, 88, 44, 118, 48, 194, 200, 35, 70, 30, 173, 200, 209, 57, 178, 135, + 145, 39, 140, 60, 89, 145, 61, 59, 210, 247, 210, 141, 69, 239, 51, 255, + 205, 51, 32, 84, 159, 239, 158, 10, 167, 249, 110, 112, 81, 247, 121, 208, + 48, 249, 45, 48, 246, 35, 246, 192, 30, 217, 19, 193, 6, 239, 16, 235, + 198, 192, 127, 241, 242, 39, 239, 112, 11, 95, 195, 209, 239, 234, 31, 135, + 143, 71, 248, 220, 209, 79, 233, 143, 227, 199, 225, 40, 24, 228, 137, 164, + 19, 121, 147, 32, 197, 233, 147, 231, 246, 151, 219, 33, 100, 189, 251, 99, + 184, 253, 248, 48, 220, 34, 42, 209, 32, 1, 130, 118, 16, 180, 187, 187, + 243, 64, 43, 14, 118, 175, 30, 238, 161, 43, 152, 51, 134, 116, 97, 184, + 142, 118, 175, 30, 239, 161, 43, 174, 34, 79, 118, 175, 158, 238, 161, 43, + 46, 35, 61, 6, 150, 59, 152, 2, 241, 113, 123, 192, 59, 141, 163, 243, + 121, 196, 207, 147, 243, 121, 2, 24, 80, 220, 206, 56, 252, 11, 207, 151, + 189, 45, 124, 63, 210, 247, 54, 190, 159, 200, 187, 103, 64, 0, 69, 89, + 180, 3, 32, 55, 1, 12, 63, 160, 47, 6, 4, 16, 252, 128, 102, 99, + 55, 145, 57, 53, 192, 106, 119, 206, 23, 214, 186, 119, 190, 176, 210, 16, + 153, 0, 205, 39, 128, 188, 245, 201, 27, 162, 159, 33, 252, 108, 195, 103, + 152, 126, 226, 4, 164, 65, 30, 26, 210, 180, 67, 32, 79, 152, 230, 9, + 91, 121, 194, 52, 69, 216, 149, 103, 64, 144, 118, 128, 96, 243, 8, 53, + 249, 58, 90, 95, 4, 45, 7, 39, 242, 229, 33, 51, 250, 252, 32, 24, + 1, 245, 135, 158, 216, 193, 129, 29, 28, 89, 0, 153, 245, 88, 161, 97, + 18, 202, 219, 193, 91, 136, 185, 200, 20, 182, 50, 241, 151, 185, 194, 118, + 46, 222, 206, 182, 179, 115, 94, 214, 73, 26, 224, 212, 203, 187, 43, 182, + 163, 172, 202, 249, 87, 42, 119, 229, 230, 175, 178, 135, 25, 222, 13, 3, + 111, 3, 177, 71, 130, 9, 89, 168, 31, 152, 30, 127, 127, 114, 112, 255, + 7, 147, 227, 125, 252, 127, 11, 225, 223, 70, 242, 247, 240, 250, 10, 147, + 95, 224, 233, 123, 88, 248, 202, 240, 91, 99, 231, 26, 54, 123, 204, 94, + 65, 53, 247, 96, 187, 114, 184, 209, 196, 30, 101, 20, 142, 112, 31, 22, + 91, 244, 56, 229, 19, 129, 199, 154, 32, 219, 132, 30, 26, 182, 166, 197, + 25, 161, 113, 5, 234, 230, 240, 25, 15, 65, 103, 203, 141, 249, 153, 187, + 224, 103, 109, 46, 147, 100, 39, 73, 145, 93, 255, 62, 123, 155, 194, 66, + 169, 72, 22, 222, 74, 59, 242, 143, 231, 139, 106, 125, 189, 49, 186, 211, + 190, 215, 23, 71, 115, 132, 69, 171, 158, 40, 214, 83, 177, 235, 1, 130, + 62, 180, 238, 24, 155, 53, 30, 89, 157, 69, 74, 124, 103, 86, 169, 115, + 244, 150, 23, 29, 212, 30, 14, 175, 141, 30, 150, 112, 91, 73, 37, 18, + 229, 80, 49, 249, 1, 40, 198, 192, 91, 87, 28, 200, 14, 209, 174, 8, + 170, 103, 213, 210, 235, 206, 8, 138, 151, 204, 143, 197, 227, 190, 210, 179, + 170, 231, 181, 222, 118, 177, 64, 170, 139, 3, 18, 57, 248, 112, 25, 230, + 124, 179, 159, 45, 97, 251, 23, 198, 83, 41, 228, 182, 205, 89, 244, 152, + 106, 57, 171, 180, 1, 167, 247, 96, 215, 87, 24, 229, 224, 87, 122, 206, + 101, 221, 71, 144, 83, 174, 63, 200, 134, 140, 39, 86, 120, 109, 241, 17, + 24, 50, 79, 15, 69, 80, 97, 55, 253, 67, 252, 56, 130, 167, 240, 145, + 255, 230, 237, 238, 131, 95, 185, 71, 77, 211, 238, 111, 202, 126, 114, 187, + 126, 3, 201, 238, 190, 121, 110, 109, 243, 122, 252, 19, 48, 86, 71, 148, + 71, 250, 250, 165, 219, 55, 166, 183, 41, 255, 77, 119, 127, 247, 244, 141, + 218, 110, 163, 71, 190, 152, 9, 207, 185, 206, 95, 86, 4, 239, 249, 106, + 9, 206, 66, 216, 173, 112, 79, 74, 56, 215, 115, 199, 240, 119, 228, 64, + 205, 165, 156, 141, 15, 129, 8, 133, 23, 131, 95, 200, 190, 254, 244, 128, + 7, 174, 95, 246, 126, 129, 29, 193, 95, 207, 143, 154, 70, 95, 76, 96, + 27, 161, 164, 219, 226, 221, 29, 219, 91, 108, 110, 139, 236, 23, 180, 97, + 35, 224, 223, 253, 232, 87, 72, 243, 4, 125, 229, 156, 213, 89, 39, 117, + 79, 223, 136, 249, 141, 71, 47, 195, 30, 208, 196, 6, 49, 86, 109, 215, + 75, 219, 57, 71, 221, 78, 24, 178, 153, 233, 133, 87, 225, 201, 59, 4, + 28, 196, 87, 241, 201, 26, 16, 18, 33, 61, 121, 245, 46, 209, 130, 132, + 15, 249, 9, 125, 179, 29, 168, 213, 37, 226, 187, 115, 51, 122, 158, 26, + 157, 111, 62, 15, 93, 147, 61, 0, 226, 98, 48, 64, 249, 120, 114, 102, + 126, 11, 44, 168, 27, 90, 239, 19, 219, 251, 85, 160, 131, 67, 126, 97, + 120, 88, 14, 22, 41, 248, 71, 165, 218, 243, 104, 168, 4, 123, 205, 103, + 135, 88, 248, 130, 193, 101, 39, 16, 129, 125, 238, 238, 73, 104, 119, 239, + 4, 191, 50, 13, 144, 62, 20, 236, 120, 122, 68, 7, 43, 106, 238, 87, + 74, 240, 205, 126, 229, 130, 65, 252, 186, 67, 17, 250, 161, 112, 11, 227, + 136, 123, 136, 221, 237, 248, 137, 68, 52, 180, 26, 21, 1, 126, 133, 85, + 120, 10, 195, 142, 175, 176, 60, 246, 244, 245, 179, 129, 182, 16, 55, 40, + 232, 15, 65, 216, 22, 239, 229, 127, 191, 122, 123, 219, 217, 236, 104, 35, + 57, 174, 59, 6, 206, 16, 88, 98, 201, 129, 182, 73, 39, 154, 121, 85, + 216, 246, 22, 138, 187, 67, 98, 241, 178, 48, 212, 146, 196, 125, 15, 45, + 112, 159, 139, 68, 65, 153, 139, 2, 36, 246, 53, 88, 156, 2, 136, 18, + 76, 143, 154, 55, 180, 134, 151, 20, 65, 212, 24, 16, 13, 83, 95, 0, + 6, 254, 201, 111, 245, 243, 221, 29, 209, 50, 120, 171, 8, 130, 58, 221, + 254, 116, 234, 33, 166, 147, 172, 204, 152, 135, 116, 248, 167, 107, 24, 122, + 107, 125, 127, 54, 44, 110, 9, 207, 223, 34, 252, 4, 105, 126, 149, 238, + 96, 129, 247, 148, 113, 160, 0, 150, 237, 69, 204, 3, 223, 127, 64, 115, + 32, 180, 164, 238, 104, 129, 183, 203, 186, 125, 118, 233, 106, 12, 5, 143, + 152, 230, 50, 190, 64, 135, 148, 159, 94, 118, 135, 5, 15, 49, 123, 59, + 178, 236, 239, 80, 185, 56, 88, 122, 104, 247, 122, 170, 68, 65, 16, 90, + 84, 124, 187, 128, 229, 194, 36, 23, 18, 22, 139, 117, 93, 4, 225, 182, + 156, 117, 25, 88, 46, 7, 57, 127, 127, 13, 101, 145, 27, 115, 222, 97, + 74, 193, 182, 0, 48, 72, 247, 208, 19, 180, 252, 252, 45, 106, 89, 60, + 160, 152, 57, 116, 68, 14, 34, 9, 238, 86, 238, 88, 248, 248, 29, 70, + 10, 41, 154, 156, 247, 179, 87, 178, 168, 137, 42, 32, 187, 53, 143, 238, + 189, 149, 79, 120, 140, 124, 139, 90, 13, 205, 187, 223, 137, 70, 36, 190, + 3, 94, 63, 224, 55, 235, 152, 232, 184, 69, 212, 79, 88, 163, 208, 116, + 112, 1, 194, 82, 16, 136, 171, 81, 130, 165, 19, 254, 206, 178, 146, 150, + 65, 142, 242, 19, 76, 254, 49, 221, 89, 9, 127, 153, 161, 54, 211, 112, + 14, 221, 97, 211, 50, 172, 167, 78, 7, 69, 96, 19, 41, 6, 195, 191, + 100, 158, 92, 157, 251, 171, 141, 217, 116, 60, 200, 174, 75, 80, 140, 92, + 130, 192, 100, 33, 240, 215, 233, 158, 68, 90, 78, 198, 167, 254, 132, 240, + 227, 172, 165, 77, 133, 202, 92, 128, 240, 159, 136, 178, 198, 45, 37, 221, + 176, 128, 95, 236, 88, 214, 83, 194, 246, 56, 72, 38, 190, 50, 137, 45, + 136, 6, 56, 101, 89, 130, 48, 243, 254, 222, 66, 177, 203, 153, 219, 124, + 37, 55, 141, 165, 218, 84, 246, 226, 250, 202, 156, 45, 189, 147, 213, 153, + 111, 164, 16, 138, 231, 116, 190, 38, 112, 162, 149, 94, 197, 205, 183, 178, + 99, 111, 210, 185, 218, 124, 107, 150, 190, 50, 79, 173, 14, 36, 171, 181, + 213, 135, 231, 85, 54, 248, 58, 38, 99, 3, 233, 221, 40, 54, 176, 124, + 71, 179, 250, 80, 41, 231, 165, 27, 62, 180, 195, 133, 87, 162, 203, 107, + 187, 31, 47, 29, 17, 100, 151, 212, 78, 41, 121, 160, 7, 203, 203, 123, + 127, 71, 50, 243, 77, 34, 239, 250, 154, 97, 25, 20, 222, 190, 93, 0, + 176, 168, 245, 131, 243, 59, 239, 122, 23, 92, 239, 198, 124, 224, 177, 219, + 241, 194, 170, 121, 80, 112, 212, 249, 130, 220, 165, 229, 77, 108, 162, 171, + 121, 120, 199, 243, 112, 217, 56, 147, 117, 73, 22, 157, 77, 207, 115, 232, + 189, 144, 243, 90, 178, 236, 231, 187, 68, 134, 138, 128, 83, 235, 244, 232, + 42, 249, 189, 20, 2, 233, 200, 243, 55, 180, 226, 245, 60, 48, 200, 84, + 186, 250, 79, 164, 224, 94, 22, 233, 152, 182, 119, 95, 72, 65, 201, 239, + 143, 102, 127, 11, 177, 61, 244, 81, 248, 211, 227, 249, 98, 196, 220, 55, + 237, 164, 212, 151, 70, 126, 191, 15, 192, 117, 159, 163, 143, 159, 87, 26, + 237, 114, 190, 51, 119, 137, 101, 57, 126, 68, 174, 253, 73, 58, 254, 69, + 126, 194, 62, 3, 251, 76, 104, 25, 125, 190, 121, 70, 131, 78, 192, 20, + 193, 206, 227, 125, 203, 104, 67, 214, 152, 247, 245, 245, 244, 232, 170, 243, + 111, 218, 112, 152, 191, 229, 38, 135, 8, 79, 16, 21, 39, 167, 46, 34, + 15, 129, 135, 219, 154, 98, 137, 69, 56, 106, 32, 46, 201, 83, 39, 249, + 51, 144, 93, 231, 187, 96, 7, 224, 87, 5, 136, 117, 239, 22, 200, 32, + 228, 173, 32, 211, 119, 141, 107, 92, 84, 241, 154, 129, 141, 243, 165, 157, + 231, 34, 173, 11, 107, 206, 0, 217, 210, 125, 175, 0, 226, 102, 92, 168, + 123, 128, 175, 16, 28, 36, 55, 185, 230, 183, 79, 198, 224, 22, 62, 127, + 1, 26, 0, 126, 88, 100, 11, 46, 150, 191, 179, 73, 127, 122, 255, 111, + 123, 238, 68, 77, 131, 5, 48, 62, 150, 95, 185, 31, 157, 6, 195, 62, + 26, 192, 198, 233, 64, 132, 90, 136, 194, 194, 181, 136, 193, 155, 85, 156, + 145, 30, 214, 118, 123, 57, 118, 169, 117, 126, 103, 74, 187, 82, 254, 253, + 249, 236, 46, 140, 76, 110, 34, 75, 234, 242, 157, 140, 110, 154, 109, 241, + 82, 216, 245, 137, 174, 132, 173, 9, 227, 194, 55, 119, 57, 239, 45, 7, + 238, 116, 175, 47, 4, 231, 81, 166, 240, 224, 72, 91, 38, 250, 168, 6, + 159, 223, 118, 135, 226, 26, 96, 120, 3, 74, 107, 107, 58, 32, 197, 129, + 104, 234, 235, 221, 209, 11, 7, 29, 182, 247, 29, 188, 248, 39, 89, 172, + 222, 120, 181, 123, 220, 222, 240, 96, 91, 114, 106, 177, 95, 94, 105, 234, + 185, 220, 171, 1, 32, 141, 67, 81, 3, 60, 164, 177, 193, 222, 152, 219, + 43, 189, 12, 7, 142, 164, 190, 238, 61, 108, 70, 192, 238, 141, 22, 211, + 222, 139, 169, 74, 181, 72, 11, 80, 192, 7, 211, 178, 131, 122, 121, 207, + 108, 53, 20, 104, 59, 187, 12, 42, 36, 106, 107, 161, 81, 3, 212, 132, + 158, 119, 252, 84, 59, 26, 23, 48, 66, 219, 119, 182, 244, 75, 205, 138, + 215, 251, 238, 44, 36, 198, 144, 102, 178, 30, 171, 181, 47, 84, 241, 161, + 140, 179, 46, 254, 121, 239, 190, 234, 128, 75, 131, 86, 216, 240, 127, 75, + 1, 187, 233, 214, 9, 8, 108, 156, 231, 149, 137, 66, 248, 154, 233, 134, + 11, 191, 49, 174, 181, 12, 69, 67, 33, 146, 0, 26, 252, 10, 123, 210, + 118, 70, 57, 86, 60, 219, 219, 227, 163, 211, 55, 55, 207, 59, 125, 109, + 144, 134, 89, 223, 27, 66, 155, 83, 58, 125, 67, 41, 243, 205, 239, 123, + 36, 200, 55, 44, 230, 102, 130, 155, 123, 227, 203, 230, 233, 238, 141, 52, + 158, 125, 152, 9, 98, 2, 139, 122, 222, 135, 175, 56, 133, 125, 28, 235, + 31, 245, 204, 95, 31, 4, 96, 78, 246, 97, 59, 97, 156, 245, 218, 180, + 247, 39, 132, 54, 108, 87, 5, 60, 119, 216, 2, 221, 143, 201, 103, 88, + 2, 46, 144, 144, 29, 3, 239, 252, 251, 248, 39, 143, 171, 33, 251, 240, + 253, 62, 126, 127, 11, 185, 30, 188, 179, 248, 221, 159, 2, 173, 194, 78, + 241, 249, 162, 225, 236, 139, 126, 176, 95, 63, 157, 123, 100, 99, 209, 178, + 51, 228, 162, 190, 248, 176, 99, 125, 79, 228, 27, 137, 57, 198, 74, 120, + 127, 139, 1, 196, 52, 0, 141, 185, 243, 211, 123, 160, 59, 223, 55, 226, + 204, 229, 115, 240, 209, 123, 131, 3, 66, 168, 178, 207, 104, 243, 224, 235, + 55, 150, 132, 80, 1, 172, 45, 141, 126, 205, 72, 6, 241, 47, 32, 88, + 14, 7, 94, 172, 170, 150, 247, 129, 197, 217, 35, 193, 251, 30, 19, 46, + 74, 123, 117, 145, 123, 183, 188, 159, 119, 108, 0, 8, 255, 8, 133, 154, + 84, 51, 207, 82, 4, 36, 142, 12, 94, 180, 216, 49, 101, 247, 209, 123, + 94, 83, 80, 153, 100, 210, 239, 47, 169, 72, 151, 233, 182, 14, 104, 165, + 39, 235, 49, 149, 4, 250, 10, 43, 84, 112, 134, 146, 36, 243, 7, 20, + 232, 249, 31, 47, 23, 156, 60, 204, 96, 35, 51, 47, 132, 143, 206, 66, + 170, 37, 187, 206, 31, 230, 8, 220, 192, 240, 214, 57, 235, 75, 72, 222, + 146, 73, 114, 45, 44, 78, 115, 221, 242, 167, 40, 18, 32, 88, 94, 228, + 136, 91, 213, 131, 159, 231, 238, 238, 209, 82, 199, 17, 223, 62, 156, 243, + 33, 38, 42, 151, 159, 210, 229, 167, 120, 249, 41, 120, 92, 61, 124, 185, + 144, 241, 14, 255, 113, 169, 85, 33, 4, 249, 111, 119, 151, 118, 68, 56, + 199, 140, 72, 240, 129, 167, 111, 232, 112, 204, 193, 40, 167, 71, 47, 215, + 60, 88, 221, 232, 136, 18, 227, 254, 250, 122, 248, 111, 47, 207, 252, 114, + 35, 176, 184, 246, 145, 199, 2, 205, 186, 122, 177, 123, 49, 189, 91, 75, + 238, 117, 3, 54, 34, 112, 48, 150, 50, 45, 111, 217, 30, 124, 225, 83, + 11, 106, 165, 86, 17, 241, 248, 19, 183, 54, 239, 215, 27, 254, 193, 246, + 176, 69, 89, 150, 119, 211, 225, 196, 36, 198, 178, 221, 37, 91, 104, 244, + 140, 246, 56, 214, 70, 103, 75, 8, 130, 27, 52, 62, 15, 5, 63, 18, + 223, 93, 132, 171, 166, 230, 8, 108, 169, 83, 187, 40, 134, 136, 184, 162, + 148, 47, 102, 249, 229, 70, 252, 198, 242, 111, 165, 127, 99, 134, 60, 195, + 94, 72, 60, 128, 1, 164, 228, 221, 181, 245, 190, 133, 209, 176, 116, 2, + 69, 65, 206, 159, 8, 109, 49, 152, 234, 168, 167, 58, 68, 216, 71, 184, + 157, 206, 189, 164, 212, 33, 60, 80, 120, 28, 105, 16, 212, 13, 36, 212, + 189, 93, 207, 91, 162, 88, 31, 207, 73, 130, 252, 91, 184, 127, 70, 120, + 47, 211, 153, 110, 215, 94, 171, 211, 9, 117, 198, 92, 180, 141, 74, 85, + 123, 174, 219, 235, 150, 191, 186, 188, 112, 120, 129, 117, 157, 163, 213, 56, + 170, 239, 14, 249, 77, 167, 105, 208, 9, 243, 31, 245, 211, 70, 48, 236, + 51, 208, 61, 120, 40, 79, 143, 179, 67, 238, 131, 108, 142, 189, 53, 209, + 90, 191, 233, 125, 98, 77, 86, 132, 189, 44, 197, 132, 124, 150, 237, 112, + 210, 60, 32, 252, 30, 57, 75, 224, 22, 167, 33, 212, 129, 224, 32, 61, + 200, 121, 127, 127, 68, 43, 138, 189, 133, 7, 15, 62, 6, 212, 144, 139, + 117, 104, 254, 154, 61, 151, 197, 128, 220, 246, 125, 241, 62, 80, 47, 100, + 228, 127, 20, 9, 129, 8, 34, 95, 225, 165, 214, 86, 104, 164, 21, 113, + 242, 158, 61, 32, 208, 72, 140, 128, 37, 22, 226, 240, 32, 28, 175, 69, + 20, 114, 45, 34, 125, 20, 232, 190, 103, 62, 219, 102, 6, 32, 158, 152, + 128, 193, 153, 78, 94, 232, 222, 10, 169, 89, 175, 43, 217, 191, 130, 227, + 91, 60, 91, 166, 201, 80, 132, 217, 74, 216, 123, 37, 161, 101, 17, 198, + 78, 107, 167, 190, 168, 244, 23, 215, 39, 196, 209, 53, 200, 9, 249, 3, + 187, 103, 74, 236, 181, 17, 219, 227, 158, 9, 206, 217, 32, 116, 203, 39, + 15, 206, 74, 250, 101, 204, 7, 215, 126, 26, 172, 86, 91, 14, 26, 80, + 210, 6, 187, 244, 203, 4, 58, 100, 69, 63, 142, 228, 99, 77, 63, 78, + 228, 131, 208, 43, 227, 219, 37, 187, 98, 215, 119, 44, 214, 12, 177, 105, + 60, 39, 163, 65, 180, 78, 8, 195, 81, 191, 133, 232, 135, 32, 66, 103, + 247, 0, 196, 253, 110, 1, 197, 122, 207, 208, 225, 219, 39, 175, 5, 248, + 228, 226, 252, 12, 3, 63, 3, 55, 120, 54, 206, 67, 106, 163, 160, 66, + 220, 19, 75, 1, 181, 95, 79, 244, 21, 114, 67, 30, 158, 20, 244, 209, + 128, 85, 115, 247, 133, 35, 204, 198, 217, 146, 187, 145, 35, 38, 166, 175, + 23, 22, 60, 39, 127, 239, 212, 225, 249, 47, 155, 133, 124, 91, 199, 215, + 58, 147, 183, 136, 118, 107, 45, 157, 18, 243, 160, 116, 53, 165, 202, 184, + 151, 154, 191, 87, 199, 14, 151, 58, 179, 4, 250, 7, 148, 1, 227, 236, + 149, 133, 187, 246, 88, 110, 113, 97, 40, 1, 77, 189, 230, 93, 57, 203, + 43, 91, 241, 215, 138, 87, 239, 112, 162, 182, 249, 139, 59, 47, 99, 151, + 46, 176, 162, 199, 169, 201, 37, 207, 249, 74, 217, 176, 229, 80, 178, 95, + 184, 100, 33, 7, 176, 41, 7, 131, 55, 252, 31, 55, 2, 142, 225, 5, + 244, 207, 120, 0, 7, 203, 254, 89, 169, 249, 5, 252, 104, 231, 3, 82, + 225, 101, 80, 255, 237, 102, 92, 234, 213, 186, 116, 164, 221, 205, 67, 67, + 57, 72, 224, 45, 134, 78, 3, 9, 0, 130, 231, 2, 156, 23, 205, 124, + 3, 4, 215, 202, 236, 242, 225, 140, 210, 99, 86, 171, 129, 78, 24, 220, + 26, 119, 127, 220, 240, 47, 27, 62, 167, 102, 16, 190, 211, 240, 188, 158, + 255, 155, 109, 134, 5, 132, 195, 70, 19, 151, 216, 140, 187, 246, 115, 171, + 9, 44, 175, 182, 250, 178, 126, 155, 117, 126, 167, 197, 80, 212, 91, 45, + 54, 251, 43, 0, 201, 103, 246, 245, 117, 119, 132, 95, 62, 214, 231, 138, + 59, 171, 106, 87, 72, 10, 66, 136, 218, 168, 167, 159, 109, 46, 95, 176, + 199, 63, 128, 204, 159, 228, 51, 58, 19, 24, 124, 68, 133, 29, 42, 15, + 176, 170, 207, 115, 9, 157, 173, 45, 33, 4, 191, 249, 94, 116, 8, 165, + 224, 28, 64, 136, 189, 115, 232, 137, 23, 193, 212, 167, 236, 135, 203, 89, + 48, 55, 217, 57, 234, 157, 80, 37, 36, 254, 142, 165, 47, 150, 255, 217, + 167, 151, 158, 241, 76, 47, 131, 84, 28, 122, 181, 133, 124, 190, 253, 175, + 228, 26, 136, 120, 27, 250, 149, 115, 89, 254, 154, 17, 25, 33, 20, 184, + 24, 193, 198, 129, 116, 246, 221, 47, 193, 47, 55, 252, 147, 143, 90, 148, + 131, 236, 191, 223, 252, 66, 13, 240, 247, 44, 71, 66, 14, 227, 139, 194, + 69, 61, 31, 114, 191, 83, 120, 48, 65, 129, 181, 9, 129, 95, 55, 80, + 20, 181, 254, 54, 250, 117, 115, 15, 53, 244, 252, 88, 203, 29, 117, 23, + 138, 170, 245, 3, 226, 169, 4, 224, 255, 40, 60, 121, 173, 150, 80, 9, + 38, 203, 137, 9, 141, 66, 186, 15, 237, 45, 189, 66, 254, 185, 157, 61, + 184, 80, 99, 179, 118, 163, 6, 124, 125, 7, 53, 54, 107, 75, 16, 229, + 122, 130, 220, 238, 140, 254, 158, 30, 174, 208, 68, 120, 188, 245, 216, 127, + 188, 242, 174, 54, 210, 209, 95, 123, 31, 143, 188, 123, 125, 243, 226, 216, + 247, 246, 131, 47, 217, 159, 78, 23, 68, 137, 16, 88, 237, 209, 98, 79, + 206, 109, 142, 139, 173, 247, 15, 226, 203, 193, 221, 6, 119, 90, 104, 66, + 210, 240, 70, 245, 157, 209, 243, 121, 46, 27, 250, 46, 150, 89, 173, 177, + 177, 203, 249, 124, 137, 85, 47, 155, 119, 243, 135, 229, 243, 213, 65, 233, + 175, 255, 239, 255, 125, 165, 138, 52, 223, 128, 161, 253, 224, 179, 138, 129, + 79, 123, 8, 8, 151, 240, 209, 107, 187, 168, 161, 156, 32, 238, 213, 142, + 215, 26, 71, 143, 230, 117, 59, 84, 101, 82, 194, 155, 167, 237, 46, 117, + 154, 139, 2, 93, 26, 53, 192, 227, 118, 244, 238, 100, 143, 230, 147, 144, + 195, 197, 163, 252, 190, 73, 181, 40, 1, 85, 73, 248, 59, 154, 51, 23, + 197, 190, 173, 60, 99, 241, 67, 110, 215, 236, 174, 232, 217, 118, 234, 253, + 186, 52, 252, 188, 202, 125, 131, 173, 118, 110, 165, 119, 247, 18, 202, 50, + 188, 233, 189, 217, 73, 113, 229, 95, 27, 254, 17, 91, 48, 246, 145, 48, + 53, 164, 125, 229, 184, 156, 148, 249, 118, 3, 73, 244, 85, 195, 120, 244, + 20, 71, 108, 107, 80, 207, 236, 31, 188, 214, 2, 34, 91, 144, 3, 44, + 72, 156, 127, 189, 249, 124, 207, 61, 10, 150, 114, 149, 117, 57, 209, 125, + 195, 125, 187, 171, 153, 175, 249, 141, 46, 219, 209, 127, 195, 77, 180, 199, + 30, 7, 180, 253, 230, 165, 102, 161, 188, 2, 181, 79, 247, 39, 242, 14, + 132, 206, 57, 31, 171, 240, 79, 196, 76, 18, 247, 40, 227, 61, 222, 213, + 250, 17, 116, 93, 66, 153, 253, 107, 195, 224, 232, 206, 207, 50, 233, 194, + 62, 83, 245, 254, 35, 121, 158, 200, 179, 251, 210, 176, 14, 250, 75, 112, + 209, 52, 175, 44, 41, 40, 211, 240, 61, 189, 34, 231, 10, 41, 120, 105, + 6, 60, 53, 120, 61, 39, 89, 80, 22, 219, 13, 90, 48, 162, 242, 25, + 212, 215, 47, 17, 155, 97, 137, 237, 180, 174, 109, 153, 103, 217, 95, 35, + 110, 185, 205, 150, 189, 144, 153, 59, 4, 143, 193, 83, 176, 123, 133, 48, + 2, 43, 144, 30, 161, 140, 20, 190, 161, 201, 125, 250, 38, 82, 255, 207, + 240, 38, 189, 105, 250, 194, 26, 71, 196, 59, 43, 187, 44, 179, 95, 183, + 183, 16, 112, 247, 237, 55, 215, 27, 119, 126, 119, 143, 213, 249, 236, 216, + 26, 19, 106, 111, 193, 124, 54, 23, 131, 141, 219, 164, 138, 235, 220, 220, + 206, 241, 35, 139, 11, 22, 115, 161, 165, 55, 186, 56, 177, 198, 69, 20, + 215, 19, 76, 118, 25, 250, 206, 202, 98, 67, 247, 230, 154, 226, 20, 68, + 181, 240, 126, 123, 25, 114, 105, 2, 196, 221, 9, 206, 129, 21, 146, 82, + 246, 137, 149, 235, 160, 202, 173, 65, 229, 40, 37, 227, 1, 83, 5, 64, + 98, 241, 60, 222, 247, 205, 247, 202, 145, 60, 108, 26, 206, 92, 20, 144, + 42, 179, 216, 111, 220, 123, 28, 237, 6, 143, 45, 34, 134, 206, 111, 169, + 18, 194, 102, 141, 158, 145, 169, 14, 194, 31, 198, 140, 200, 141, 217, 150, + 18, 62, 222, 16, 38, 204, 248, 28, 36, 249, 254, 64, 67, 168, 180, 147, + 60, 198, 239, 193, 7, 59, 144, 177, 2, 57, 42, 201, 236, 69, 147, 27, + 252, 249, 134, 156, 94, 49, 93, 219, 196, 179, 93, 203, 92, 217, 205, 177, + 44, 208, 209, 35, 220, 53, 58, 113, 95, 204, 169, 30, 234, 165, 1, 188, + 139, 66, 47, 14, 130, 105, 177, 238, 210, 160, 119, 160, 56, 119, 1, 87, + 151, 92, 54, 233, 213, 37, 189, 247, 11, 10, 12, 188, 106, 208, 142, 10, + 16, 252, 130, 158, 36, 29, 251, 112, 143, 36, 201, 133, 121, 56, 246, 218, + 44, 220, 149, 197, 54, 233, 127, 199, 98, 27, 185, 97, 125, 223, 98, 219, + 133, 177, 54, 29, 218, 123, 189, 180, 126, 196, 129, 65, 51, 198, 222, 156, + 62, 55, 150, 219, 169, 251, 50, 84, 239, 141, 183, 230, 198, 178, 245, 12, + 112, 1, 171, 138, 22, 147, 58, 107, 52, 16, 141, 246, 218, 126, 71, 3, + 94, 172, 21, 140, 183, 39, 107, 221, 220, 92, 4, 146, 77, 227, 34, 100, + 180, 5, 146, 5, 109, 131, 94, 132, 154, 58, 108, 36, 164, 110, 26, 124, + 182, 146, 230, 50, 145, 230, 224, 82, 145, 46, 143, 208, 228, 225, 116, 209, + 1, 82, 151, 66, 138, 66, 206, 142, 103, 87, 243, 221, 139, 229, 50, 177, + 75, 66, 210, 2, 210, 117, 55, 23, 74, 218, 100, 165, 182, 109, 205, 245, + 137, 160, 86, 135, 236, 18, 95, 206, 80, 57, 64, 61, 193, 70, 240, 56, + 68, 207, 123, 44, 81, 47, 186, 176, 199, 230, 178, 126, 22, 60, 91, 61, + 131, 133, 134, 189, 54, 213, 6, 132, 16, 128, 128, 160, 18, 1, 49, 200, + 129, 74, 54, 63, 178, 36, 90, 126, 81, 207, 228, 240, 72, 223, 93, 241, + 236, 142, 155, 31, 122, 68, 241, 106, 51, 222, 217, 105, 206, 3, 78, 32, + 255, 96, 143, 52, 253, 178, 201, 22, 120, 117, 198, 150, 126, 158, 7, 149, + 126, 159, 59, 227, 220, 23, 111, 174, 185, 151, 200, 135, 132, 11, 225, 132, + 68, 206, 115, 141, 150, 174, 211, 85, 52, 180, 132, 24, 69, 111, 5, 8, + 42, 57, 110, 136, 221, 81, 130, 43, 74, 188, 140, 18, 237, 40, 15, 213, + 128, 117, 69, 73, 174, 92, 242, 101, 148, 76, 162, 124, 182, 75, 34, 84, + 140, 101, 111, 190, 6, 208, 75, 207, 89, 182, 28, 193, 118, 144, 115, 112, + 69, 94, 157, 59, 153, 248, 28, 182, 251, 152, 184, 27, 182, 72, 47, 17, + 24, 19, 228, 65, 177, 135, 209, 22, 179, 247, 220, 193, 0, 1, 178, 75, + 30, 55, 86, 125, 185, 81, 216, 155, 192, 211, 43, 150, 200, 137, 108, 203, + 243, 98, 169, 119, 141, 205, 209, 139, 38, 196, 61, 36, 11, 48, 160, 55, + 74, 48, 120, 19, 32, 109, 130, 55, 238, 15, 235, 242, 224, 35, 53, 39, + 141, 5, 82, 7, 163, 244, 21, 185, 207, 89, 16, 175, 69, 110, 121, 246, + 134, 148, 113, 71, 204, 234, 96, 136, 112, 14, 65, 187, 226, 193, 175, 232, + 183, 148, 56, 39, 237, 195, 154, 121, 147, 123, 184, 65, 161, 245, 7, 239, + 205, 204, 123, 239, 189, 193, 36, 212, 218, 180, 229, 169, 83, 182, 28, 163, + 225, 14, 139, 54, 77, 70, 230, 14, 1, 53, 71, 150, 236, 218, 35, 16, + 189, 210, 61, 255, 168, 82, 79, 98, 52, 156, 39, 225, 183, 55, 242, 111, + 119, 127, 222, 162, 113, 15, 249, 51, 135, 110, 223, 186, 84, 140, 1, 19, + 66, 57, 2, 45, 214, 246, 88, 39, 122, 252, 228, 158, 73, 150, 189, 127, + 18, 98, 154, 231, 254, 124, 184, 189, 17, 127, 131, 140, 247, 86, 140, 157, + 86, 240, 80, 95, 65, 130, 74, 163, 190, 194, 182, 126, 123, 35, 248, 21, + 9, 18, 51, 86, 20, 38, 102, 40, 89, 206, 223, 11, 223, 104, 241, 164, + 133, 52, 9, 180, 184, 75, 126, 73, 255, 156, 23, 102, 219, 154, 168, 123, + 133, 214, 221, 110, 113, 116, 100, 66, 28, 81, 45, 152, 58, 24, 251, 138, + 17, 167, 203, 116, 222, 27, 223, 189, 205, 92, 95, 197, 0, 59, 222, 165, + 59, 147, 143, 186, 130, 118, 162, 236, 117, 151, 18, 165, 150, 121, 44, 98, + 171, 135, 15, 210, 59, 74, 33, 120, 22, 213, 248, 118, 197, 39, 185, 41, + 96, 186, 241, 45, 232, 209, 104, 23, 237, 103, 205, 45, 115, 41, 86, 93, + 183, 230, 29, 177, 140, 251, 82, 116, 228, 53, 114, 91, 191, 114, 187, 19, + 178, 44, 14, 227, 186, 228, 110, 0, 178, 74, 131, 254, 154, 144, 22, 186, + 203, 88, 63, 75, 206, 21, 44, 10, 178, 163, 155, 104, 110, 145, 216, 63, + 198, 253, 192, 41, 245, 43, 57, 24, 251, 31, 196, 60, 180, 28, 244, 197, + 124, 162, 62, 26, 214, 71, 124, 78, 233, 7, 53, 179, 3, 159, 58, 9, + 4, 240, 109, 123, 74, 35, 211, 32, 79, 44, 162, 59, 59, 210, 231, 4, + 179, 24, 43, 55, 41, 218, 90, 108, 9, 40, 250, 212, 92, 120, 103, 250, + 196, 146, 59, 162, 75, 58, 146, 65, 3, 98, 173, 8, 58, 15, 182, 247, + 254, 222, 187, 36, 186, 58, 91, 188, 244, 118, 27, 80, 217, 140, 12, 211, + 221, 68, 183, 82, 14, 16, 241, 196, 222, 228, 139, 238, 209, 77, 43, 140, + 228, 177, 35, 62, 88, 251, 217, 7, 104, 200, 243, 232, 131, 99, 18, 26, + 86, 30, 215, 222, 22, 130, 206, 177, 50, 188, 187, 105, 66, 75, 118, 16, + 224, 156, 140, 91, 187, 228, 187, 102, 68, 63, 218, 59, 133, 133, 122, 111, + 111, 17, 151, 184, 236, 115, 108, 130, 146, 179, 116, 193, 199, 146, 241, 121, + 198, 135, 231, 26, 239, 223, 176, 124, 134, 19, 229, 122, 246, 188, 144, 158, + 185, 184, 76, 118, 118, 13, 225, 236, 13, 28, 173, 11, 1, 244, 207, 68, + 208, 231, 223, 190, 27, 225, 223, 62, 223, 183, 43, 73, 181, 174, 67, 16, + 242, 196, 82, 144, 83, 221, 7, 223, 141, 253, 142, 54, 132, 6, 215, 38, + 211, 96, 61, 191, 253, 112, 227, 255, 112, 231, 53, 122, 193, 175, 163, 32, + 247, 9, 134, 232, 118, 18, 228, 216, 201, 239, 123, 246, 246, 118, 116, 31, + 20, 249, 59, 20, 110, 153, 48, 204, 211, 221, 111, 176, 49, 73, 170, 28, + 80, 238, 232, 58, 137, 112, 221, 156, 5, 96, 189, 248, 189, 36, 190, 43, + 122, 55, 70, 239, 227, 205, 243, 210, 10, 180, 142, 100, 104, 224, 192, 10, + 180, 15, 112, 104, 104, 231, 5, 77, 125, 89, 26, 94, 125, 233, 211, 229, + 72, 39, 30, 209, 5, 186, 176, 195, 155, 244, 205, 54, 151, 79, 98, 137, + 51, 140, 175, 252, 131, 73, 238, 173, 47, 235, 166, 166, 243, 209, 98, 180, + 247, 230, 217, 68, 24, 168, 43, 73, 231, 42, 221, 113, 13, 234, 165, 212, + 186, 72, 196, 127, 237, 48, 203, 53, 233, 251, 181, 185, 26, 101, 87, 119, + 225, 205, 224, 178, 81, 236, 37, 128, 236, 85, 9, 30, 103, 224, 63, 186, + 237, 240, 240, 190, 59, 15, 229, 237, 44, 223, 209, 252, 29, 11, 43, 12, + 250, 83, 208, 89, 203, 191, 200, 243, 154, 60, 135, 228, 73, 66, 244, 103, + 157, 157, 18, 151, 11, 52, 122, 74, 227, 167, 52, 1, 69, 239, 163, 11, + 205, 157, 87, 251, 197, 9, 25, 162, 215, 134, 231, 41, 121, 234, 29, 250, + 67, 158, 240, 222, 29, 1, 178, 211, 31, 242, 28, 177, 100, 238, 147, 167, + 73, 158, 59, 120, 26, 207, 6, 60, 167, 80, 6, 46, 101, 144, 148, 252, + 204, 232, 207, 145, 254, 76, 88, 88, 223, 16, 34, 120, 26, 43, 22, 22, + 75, 252, 195, 118, 193, 243, 72, 158, 29, 143, 37, 65, 100, 217, 214, 194, + 254, 130, 174, 162, 142, 23, 246, 223, 136, 245, 37, 96, 116, 136, 80, 2, + 218, 8, 65, 105, 134, 9, 161, 1, 44, 211, 252, 28, 233, 97, 157, 24, + 242, 125, 70, 135, 207, 222, 231, 1, 121, 118, 200, 19, 53, 82, 136, 67, + 6, 76, 69, 86, 111, 154, 140, 18, 19, 250, 43, 169, 69, 39, 233, 243, + 250, 156, 152, 172, 140, 47, 83, 159, 211, 14, 191, 151, 150, 63, 167, 237, + 124, 47, 173, 112, 78, 251, 61, 128, 29, 112, 191, 11, 43, 235, 148, 74, + 27, 230, 180, 210, 9, 30, 186, 131, 135, 78, 112, 199, 29, 220, 33, 193, + 166, 85, 33, 13, 117, 130, 220, 5, 91, 229, 154, 87, 5, 91, 229, 154, + 87, 5, 91, 229, 78, 223, 106, 8, 113, 33, 2, 127, 180, 65, 182, 63, + 145, 139, 134, 77, 29, 0, 254, 82, 238, 115, 222, 215, 135, 240, 157, 188, + 252, 57, 239, 95, 134, 218, 26, 140, 227, 235, 25, 73, 190, 163, 157, 239, + 104, 23, 226, 26, 197, 227, 91, 109, 125, 59, 171, 147, 241, 248, 215, 50, + 242, 78, 198, 191, 8, 44, 5, 149, 146, 69, 111, 101, 36, 177, 52, 171, + 99, 75, 240, 162, 165, 214, 178, 246, 19, 5, 184, 178, 255, 28, 8, 252, + 5, 8, 221, 183, 91, 255, 118, 9, 238, 252, 63, 1, 193, 69, 253, 111, + 224, 231, 136, 240, 50, 212, 52, 226, 35, 176, 12, 68, 100, 231, 141, 66, + 189, 175, 165, 118, 213, 132, 164, 235, 155, 136, 12, 145, 42, 45, 15, 223, + 94, 153, 128, 184, 165, 252, 68, 118, 39, 243, 207, 84, 206, 187, 42, 215, + 127, 34, 187, 147, 249, 39, 234, 182, 106, 6, 66, 255, 189, 201, 79, 6, + 3, 18, 217, 69, 192, 155, 19, 252, 178, 15, 97, 195, 157, 90, 203, 34, + 233, 79, 39, 244, 159, 168, 133, 119, 213, 210, 253, 7, 138, 115, 10, 251, + 7, 96, 163, 144, 33, 191, 244, 214, 44, 129, 56, 171, 4, 124, 123, 177, + 80, 16, 42, 229, 47, 103, 118, 178, 154, 127, 53, 43, 239, 100, 253, 203, + 32, 219, 0, 27, 239, 100, 52, 156, 140, 198, 107, 109, 53, 222, 109, 235, + 235, 153, 157, 172, 239, 181, 245, 213, 172, 188, 147, 245, 47, 131, 108, 3, + 252, 250, 202, 64, 51, 78, 157, 140, 211, 215, 218, 58, 125, 183, 173, 175, + 103, 118, 178, 190, 215, 214, 87, 179, 242, 78, 214, 191, 12, 50, 5, 24, + 57, 252, 183, 50, 66, 28, 205, 7, 47, 47, 90, 10, 97, 111, 76, 203, + 183, 179, 58, 25, 103, 127, 45, 35, 239, 100, 252, 139, 192, 58, 160, 78, + 222, 203, 55, 113, 50, 78, 92, 205, 20, 157, 188, 239, 183, 243, 213, 220, + 231, 188, 239, 54, 245, 181, 188, 252, 57, 239, 187, 173, 125, 45, 239, 185, + 189, 207, 127, 185, 197, 180, 189, 120, 200, 243, 230, 206, 111, 172, 44, 68, + 194, 183, 151, 196, 15, 242, 79, 127, 57, 179, 147, 245, 175, 87, 204, 187, + 42, 126, 123, 170, 191, 149, 217, 201, 250, 151, 235, 181, 125, 109, 233, 219, + 205, 194, 118, 153, 48, 239, 88, 167, 250, 159, 185, 215, 124, 115, 16, 173, + 35, 114, 18, 121, 161, 43, 193, 59, 186, 18, 231, 83, 200, 31, 244, 209, + 161, 247, 244, 165, 227, 85, 117, 166, 47, 223, 243, 142, 250, 138, 175, 9, + 10, 208, 155, 214, 248, 157, 166, 89, 58, 14, 23, 223, 234, 213, 55, 175, + 120, 220, 93, 241, 134, 158, 195, 197, 117, 198, 249, 190, 1, 109, 243, 95, + 121, 111, 176, 238, 25, 174, 228, 249, 174, 27, 236, 168, 112, 245, 231, 27, + 52, 187, 207, 190, 226, 198, 129, 52, 214, 173, 252, 32, 178, 86, 135, 179, + 231, 113, 248, 230, 179, 21, 226, 94, 213, 122, 216, 127, 30, 121, 201, 15, + 113, 60, 189, 22, 122, 7, 52, 62, 126, 33, 92, 78, 45, 59, 15, 188, + 35, 39, 205, 241, 69, 26, 248, 103, 67, 142, 186, 58, 168, 59, 38, 178, + 156, 199, 233, 68, 8, 68, 215, 18, 120, 208, 255, 133, 127, 169, 169, 211, + 209, 143, 125, 74, 21, 3, 178, 38, 114, 207, 212, 230, 43, 222, 185, 176, + 207, 229, 176, 235, 147, 191, 250, 62, 59, 134, 171, 218, 114, 63, 103, 228, + 42, 39, 194, 15, 97, 44, 217, 50, 134, 224, 32, 24, 185, 211, 198, 115, + 238, 119, 117, 115, 16, 183, 46, 96, 9, 94, 84, 237, 40, 235, 92, 2, + 20, 228, 30, 229, 55, 240, 14, 39, 29, 105, 41, 222, 146, 156, 155, 76, + 4, 250, 30, 101, 143, 187, 19, 44, 244, 225, 1, 125, 88, 170, 53, 195, + 146, 227, 205, 71, 249, 140, 78, 231, 22, 159, 27, 106, 11, 33, 92, 181, + 208, 150, 120, 114, 192, 244, 222, 218, 14, 152, 81, 98, 205, 57, 117, 228, + 188, 215, 40, 210, 63, 44, 161, 145, 207, 7, 239, 87, 159, 224, 101, 188, + 210, 61, 218, 67, 98, 57, 175, 21, 126, 188, 10, 247, 220, 162, 58, 192, + 39, 158, 136, 227, 19, 7, 106, 44, 241, 166, 138, 82, 47, 130, 135, 8, + 27, 61, 122, 110, 185, 71, 65, 198, 38, 179, 248, 114, 135, 135, 211, 187, + 197, 116, 71, 125, 103, 18, 249, 45, 84, 124, 127, 188, 12, 199, 211, 194, + 14, 81, 110, 160, 133, 60, 216, 90, 95, 183, 111, 84, 70, 181, 195, 254, + 70, 101, 211, 45, 48, 187, 143, 56, 207, 200, 235, 225, 17, 47, 164, 110, + 249, 79, 111, 213, 70, 93, 200, 253, 173, 234, 14, 231, 234, 142, 164, 58, + 219, 207, 158, 215, 255, 232, 21, 60, 232, 128, 243, 19, 7, 173, 126, 171, + 185, 216, 43, 18, 209, 70, 62, 187, 247, 35, 166, 223, 1, 171, 30, 137, + 46, 18, 250, 181, 37, 57, 200, 199, 131, 224, 49, 71, 176, 166, 76, 94, + 14, 176, 21, 254, 98, 128, 187, 150, 85, 235, 151, 62, 184, 167, 27, 61, + 230, 117, 196, 247, 201, 182, 176, 54, 186, 100, 91, 160, 145, 207, 188, 22, + 80, 200, 190, 96, 125, 11, 40, 203, 244, 141, 245, 61, 195, 230, 148, 213, + 113, 143, 161, 55, 94, 175, 234, 124, 71, 82, 49, 152, 159, 164, 18, 138, + 218, 232, 177, 162, 191, 38, 66, 191, 157, 254, 102, 223, 239, 191, 20, 64, + 37, 54, 140, 157, 27, 47, 11, 178, 199, 87, 110, 168, 46, 1, 248, 64, + 77, 81, 219, 55, 1, 122, 135, 154, 63, 234, 90, 34, 45, 231, 155, 98, + 91, 85, 129, 26, 75, 241, 66, 17, 103, 79, 125, 239, 121, 164, 199, 165, + 197, 234, 30, 123, 21, 185, 132, 224, 204, 238, 250, 222, 218, 196, 232, 93, + 138, 151, 161, 125, 105, 47, 178, 60, 107, 103, 244, 56, 35, 98, 201, 18, + 190, 98, 190, 223, 247, 82, 57, 207, 231, 242, 43, 99, 23, 245, 237, 165, + 13, 145, 203, 17, 121, 118, 220, 114, 7, 113, 140, 89, 50, 176, 196, 33, + 183, 224, 56, 228, 126, 109, 188, 236, 229, 10, 123, 128, 190, 243, 172, 215, + 231, 35, 139, 21, 237, 16, 215, 117, 140, 248, 129, 248, 97, 160, 254, 6, + 60, 115, 52, 77, 141, 136, 3, 240, 5, 161, 114, 151, 125, 87, 243, 23, + 122, 249, 3, 191, 31, 188, 31, 44, 57, 108, 119, 122, 239, 204, 235, 123, + 182, 112, 208, 10, 129, 206, 21, 125, 94, 230, 50, 148, 186, 148, 126, 205, + 155, 1, 153, 147, 110, 15, 156, 151, 229, 95, 22, 99, 237, 145, 144, 234, + 23, 152, 221, 84, 238, 146, 232, 115, 61, 210, 189, 245, 202, 94, 27, 44, + 204, 110, 155, 103, 180, 40, 142, 187, 77, 161, 205, 171, 95, 121, 24, 33, + 183, 30, 142, 247, 87, 123, 12, 176, 211, 169, 239, 71, 114, 133, 125, 225, + 254, 17, 19, 226, 133, 201, 5, 92, 22, 94, 89, 44, 197, 11, 129, 48, + 58, 106, 151, 248, 252, 154, 57, 15, 34, 23, 19, 201, 181, 112, 138, 192, + 78, 244, 232, 177, 10, 124, 69, 24, 236, 173, 34, 109, 60, 184, 46, 10, + 72, 22, 74, 210, 159, 65, 157, 252, 35, 176, 102, 220, 192, 78, 254, 38, + 180, 25, 23, 184, 47, 69, 217, 188, 140, 31, 93, 65, 203, 50, 113, 6, + 141, 194, 9, 104, 65, 130, 58, 137, 102, 92, 31, 40, 109, 224, 140, 197, + 245, 234, 74, 64, 233, 76, 13, 34, 43, 110, 169, 38, 115, 193, 229, 122, + 177, 209, 231, 139, 165, 161, 147, 85, 213, 250, 156, 233, 211, 35, 145, 2, + 232, 245, 97, 166, 174, 157, 4, 226, 57, 192, 74, 34, 5, 97, 9, 58, + 151, 32, 219, 159, 86, 180, 18, 212, 187, 35, 104, 163, 190, 89, 44, 77, + 146, 34, 112, 14, 33, 105, 206, 116, 125, 197, 160, 238, 166, 173, 78, 35, + 160, 18, 66, 99, 103, 92, 235, 196, 184, 214, 48, 87, 179, 56, 207, 69, + 27, 223, 82, 39, 118, 36, 136, 2, 212, 229, 213, 185, 11, 168, 231, 43, + 87, 31, 64, 128, 16, 244, 185, 59, 1, 66, 68, 87, 136, 149, 72, 2, + 230, 200, 233, 6, 40, 85, 118, 190, 173, 4, 74, 208, 119, 209, 17, 16, + 20, 112, 5, 145, 84, 14, 242, 188, 217, 17, 40, 13, 128, 130, 252, 31, + 136, 83, 45, 212, 1, 184, 52, 127, 130, 145, 92, 16, 232, 7, 89, 9, + 0, 241, 32, 137, 34, 110, 246, 143, 178, 172, 226, 151, 68, 183, 126, 32, + 42, 240, 237, 49, 32, 171, 119, 36, 7, 143, 57, 84, 30, 115, 160, 97, + 117, 204, 33, 98, 206, 71, 5, 75, 33, 57, 120, 66, 144, 168, 1, 153, + 230, 16, 48, 135, 66, 194, 68, 52, 160, 15, 57, 48, 183, 104, 165, 198, + 188, 1, 154, 82, 36, 101, 99, 157, 36, 149, 64, 32, 9, 56, 144, 240, + 4, 18, 213, 134, 68, 194, 212, 26, 22, 203, 201, 86, 10, 210, 6, 108, + 15, 253, 10, 16, 194, 72, 176, 224, 144, 73, 122, 210, 86, 78, 180, 107, + 15, 144, 28, 130, 149, 131, 180, 8, 91, 71, 115, 40, 152, 67, 208, 52, + 44, 69, 37, 45, 230, 165, 79, 63, 16, 66, 115, 7, 72, 187, 121, 108, + 131, 136, 254, 54, 30, 57, 69, 128, 180, 104, 109, 30, 234, 37, 176, 185, + 67, 104, 26, 153, 87, 238, 126, 64, 74, 203, 75, 239, 4, 47, 93, 0, + 221, 124, 197, 106, 209, 205, 217, 155, 50, 68, 14, 183, 119, 97, 161, 128, + 251, 33, 150, 154, 125, 70, 219, 155, 207, 150, 36, 169, 51, 191, 98, 150, + 188, 34, 49, 41, 241, 48, 48, 168, 140, 201, 37, 91, 249, 193, 225, 231, + 63, 156, 249, 75, 180, 160, 122, 201, 156, 95, 115, 71, 40, 158, 239, 178, + 118, 130, 236, 54, 100, 234, 31, 54, 168, 190, 67, 196, 114, 28, 31, 170, + 103, 18, 73, 159, 95, 219, 148, 249, 224, 134, 219, 17, 25, 255, 128, 109, + 221, 162, 100, 240, 134, 56, 17, 227, 131, 29, 212, 189, 234, 162, 162, 53, + 181, 167, 107, 57, 121, 129, 224, 94, 223, 9, 94, 116, 187, 219, 53, 37, + 42, 190, 125, 120, 91, 151, 220, 62, 16, 176, 124, 120, 184, 0, 120, 251, + 148, 192, 97, 104, 233, 33, 129, 251, 83, 189, 252, 228, 21, 183, 144, 185, + 107, 80, 223, 92, 197, 156, 3, 2, 135, 181, 227, 41, 25, 1, 12, 191, + 237, 193, 199, 25, 201, 183, 206, 4, 136, 8, 144, 35, 172, 8, 253, 114, + 105, 8, 225, 253, 179, 0, 42, 9, 253, 162, 174, 193, 22, 5, 136, 236, + 10, 93, 21, 80, 81, 229, 235, 169, 128, 36, 80, 231, 27, 138, 147, 140, + 244, 233, 0, 29, 127, 89, 175, 86, 107, 60, 107, 239, 215, 253, 168, 71, + 93, 59, 17, 234, 134, 122, 23, 66, 66, 136, 121, 118, 25, 46, 160, 138, + 107, 151, 65, 104, 233, 15, 137, 198, 224, 87, 42, 9, 207, 240, 119, 126, + 149, 215, 132, 111, 168, 223, 206, 56, 22, 14, 108, 33, 18, 172, 214, 99, + 113, 68, 95, 129, 14, 254, 102, 105, 219, 1, 208, 3, 203, 162, 229, 237, + 175, 251, 123, 19, 213, 244, 186, 230, 118, 118, 247, 233, 50, 134, 197, 112, + 192, 167, 187, 107, 29, 111, 180, 44, 75, 245, 187, 177, 60, 203, 164, 36, + 234, 113, 147, 100, 93, 154, 172, 251, 59, 20, 140, 201, 186, 240, 142, 214, + 191, 48, 45, 227, 237, 222, 239, 159, 152, 160, 129, 58, 131, 19, 34, 39, + 75, 12, 189, 66, 42, 168, 8, 147, 60, 17, 29, 109, 167, 32, 106, 213, + 246, 178, 184, 107, 104, 44, 47, 10, 80, 0, 4, 145, 114, 0, 22, 252, + 252, 227, 150, 84, 12, 101, 48, 204, 147, 63, 136, 77, 161, 42, 224, 104, + 96, 17, 109, 70, 98, 180, 173, 186, 120, 231, 243, 56, 20, 168, 187, 215, + 24, 180, 169, 135, 118, 3, 62, 19, 107, 151, 6, 64, 255, 5, 13, 147, + 114, 236, 225, 9, 21, 253, 125, 132, 38, 38, 38, 133, 145, 230, 54, 110, + 15, 164, 60, 180, 89, 0, 148, 247, 31, 41, 191, 249, 145, 164, 231, 49, + 189, 151, 131, 12, 68, 232, 146, 82, 189, 68, 205, 136, 14, 169, 145, 243, + 239, 169, 224, 211, 216, 225, 129, 169, 74, 249, 13, 38, 248, 124, 99, 143, + 190, 35, 12, 122, 97, 211, 130, 59, 219, 54, 122, 36, 102, 137, 33, 108, + 79, 44, 18, 235, 222, 35, 177, 74, 236, 125, 96, 15, 222, 245, 98, 111, + 122, 41, 114, 89, 112, 27, 22, 166, 157, 37, 145, 160, 37, 235, 62, 106, + 99, 186, 28, 87, 36, 169, 133, 81, 210, 243, 75, 218, 243, 75, 234, 191, + 98, 201, 122, 111, 147, 150, 36, 23, 53, 54, 192, 177, 75, 52, 20, 11, + 101, 224, 90, 16, 244, 38, 127, 19, 56, 73, 37, 1, 231, 163, 21, 244, + 100, 102, 139, 193, 1, 43, 15, 9, 44, 89, 40, 78, 10, 88, 102, 29, + 44, 131, 207, 216, 192, 3, 6, 19, 244, 197, 34, 125, 159, 125, 175, 89, + 65, 246, 190, 128, 26, 38, 207, 243, 218, 29, 228, 37, 6, 143, 241, 230, + 37, 232, 77, 125, 242, 96, 171, 144, 153, 55, 208, 170, 176, 153, 188, 176, + 70, 154, 164, 22, 19, 136, 229, 81, 151, 9, 167, 115, 227, 147, 180, 245, + 80, 222, 242, 120, 75, 106, 98, 97, 34, 36, 217, 229, 19, 139, 168, 202, + 179, 35, 44, 196, 170, 112, 29, 12, 146, 122, 255, 184, 117, 149, 201, 127, + 114, 25, 104, 130, 127, 191, 216, 113, 127, 184, 237, 147, 38, 89, 146, 147, + 204, 206, 205, 39, 164, 132, 111, 47, 33, 153, 122, 31, 188, 130, 53, 20, + 182, 182, 44, 182, 106, 9, 48, 156, 219, 67, 66, 80, 91, 22, 129, 227, + 136, 47, 106, 253, 139, 64, 142, 68, 142, 238, 131, 152, 201, 163, 131, 96, + 40, 180, 70, 204, 172, 1, 131, 69, 182, 107, 130, 70, 104, 219, 218, 217, + 211, 233, 34, 230, 37, 92, 150, 215, 247, 197, 89, 173, 96, 163, 243, 1, + 199, 229, 3, 108, 63, 239, 241, 231, 197, 236, 163, 7, 57, 78, 215, 183, + 125, 206, 102, 122, 205, 209, 151, 27, 159, 15, 207, 76, 63, 123, 131, 136, + 202, 198, 14, 54, 4, 8, 33, 152, 5, 129, 200, 39, 96, 113, 62, 11, + 63, 80, 254, 202, 85, 20, 231, 172, 201, 60, 44, 173, 29, 86, 15, 126, + 253, 114, 200, 177, 221, 220, 211, 55, 15, 17, 72, 255, 114, 211, 121, 178, + 140, 117, 124, 125, 184, 209, 191, 161, 30, 26, 180, 139, 4, 99, 219, 174, + 19, 221, 232, 44, 241, 223, 250, 245, 166, 195, 238, 63, 3, 245, 98, 146, + 72, 52, 184, 72, 185, 85, 108, 253, 108, 71, 2, 129, 27, 70, 163, 224, + 123, 88, 52, 206, 43, 60, 231, 113, 129, 119, 211, 113, 3, 139, 234, 52, + 100, 249, 182, 88, 210, 181, 109, 217, 156, 216, 41, 135, 62, 63, 16, 177, + 62, 39, 131, 67, 38, 93, 154, 194, 188, 56, 31, 34, 134, 153, 207, 82, + 175, 230, 27, 18, 203, 172, 101, 55, 232, 124, 28, 164, 19, 107, 251, 253, + 141, 209, 181, 44, 18, 34, 150, 49, 236, 3, 187, 88, 163, 86, 55, 250, + 110, 124, 199, 251, 47, 31, 100, 222, 38, 28, 174, 44, 119, 234, 142, 34, + 171, 69, 32, 92, 197, 187, 206, 123, 125, 140, 75, 32, 245, 173, 230, 93, + 42, 40, 56, 192, 91, 134, 0, 94, 240, 160, 163, 51, 146, 160, 209, 52, + 24, 52, 115, 132, 152, 70, 172, 107, 121, 167, 246, 17, 35, 33, 44, 220, + 7, 6, 235, 151, 39, 19, 232, 102, 240, 250, 224, 207, 64, 61, 29, 224, + 241, 174, 24, 115, 122, 78, 4, 108, 241, 123, 108, 185, 16, 61, 231, 119, + 84, 202, 222, 183, 115, 133, 238, 29, 12, 162, 87, 101, 43, 211, 90, 39, + 97, 23, 214, 27, 47, 161, 186, 248, 122, 197, 90, 217, 235, 80, 190, 4, + 142, 144, 65, 231, 211, 114, 188, 207, 120, 133, 32, 34, 103, 66, 200, 249, + 91, 182, 207, 4, 106, 12, 141, 174, 242, 196, 122, 15, 135, 167, 216, 222, + 175, 188, 202, 249, 151, 198, 55, 239, 111, 143, 94, 81, 225, 220, 189, 141, + 255, 163, 255, 75, 72, 78, 141, 7, 24, 179, 95, 130, 70, 142, 238, 25, + 150, 237, 159, 193, 35, 157, 139, 184, 82, 89, 186, 19, 47, 124, 99, 58, + 99, 68, 116, 226, 123, 157, 253, 121, 128, 136, 237, 34, 39, 198, 27, 254, + 87, 195, 139, 246, 44, 95, 63, 56, 121, 3, 211, 29, 193, 238, 115, 5, + 196, 68, 202, 249, 211, 221, 217, 239, 215, 248, 154, 209, 203, 87, 248, 45, + 143, 131, 9, 196, 131, 34, 209, 57, 33, 251, 56, 117, 164, 123, 231, 117, + 238, 156, 8, 77, 227, 156, 172, 92, 119, 201, 192, 173, 190, 129, 138, 220, + 116, 209, 129, 57, 61, 120, 93, 117, 227, 156, 230, 236, 199, 220, 21, 246, + 17, 119, 95, 158, 56, 124, 133, 151, 252, 15, 216, 173, 113, 171, 98, 64, + 9, 175, 104, 84, 12, 186, 111, 25, 193, 101, 92, 53, 19, 247, 193, 151, + 158, 38, 111, 60, 110, 200, 222, 118, 38, 126, 145, 202, 97, 6, 8, 200, + 87, 194, 237, 20, 100, 154, 244, 150, 56, 121, 189, 123, 101, 169, 113, 239, + 106, 28, 217, 210, 0, 73, 169, 22, 18, 115, 243, 153, 165, 249, 44, 93, + 120, 98, 154, 27, 112, 245, 235, 252, 219, 139, 193, 177, 231, 184, 125, 37, + 8, 132, 130, 107, 118, 159, 181, 149, 127, 112, 185, 129, 137, 236, 172, 26, + 239, 225, 246, 43, 250, 199, 238, 106, 223, 212, 119, 184, 0, 247, 76, 231, + 145, 169, 112, 213, 148, 107, 119, 239, 60, 213, 51, 182, 181, 139, 121, 214, + 231, 94, 198, 124, 172, 239, 229, 209, 251, 247, 219, 8, 228, 226, 55, 223, + 197, 148, 162, 84, 205, 43, 70, 239, 120, 39, 151, 187, 169, 94, 107, 175, + 31, 122, 15, 71, 123, 137, 185, 92, 81, 175, 71, 108, 212, 253, 7, 14, + 145, 147, 145, 243, 33, 178, 85, 224, 207, 30, 203, 186, 138, 242, 121, 108, + 217, 7, 47, 80, 105, 132, 8, 190, 45, 251, 21, 238, 238, 55, 133, 186, + 45, 72, 220, 223, 162, 255, 52, 96, 78, 110, 129, 118, 39, 246, 54, 129, + 250, 196, 110, 14, 122, 9, 238, 34, 201, 12, 12, 124, 242, 142, 253, 146, + 96, 155, 44, 247, 196, 126, 105, 178, 9, 242, 203, 193, 111, 147, 252, 66, + 8, 9, 231, 200, 47, 196, 66, 56, 186, 251, 128, 66, 194, 196, 137, 130, + 120, 15, 69, 226, 180, 32, 30, 21, 52, 242, 197, 211, 47, 158, 39, 95, + 2, 112, 131, 192, 166, 223, 222, 194, 7, 19, 156, 221, 221, 7, 157, 185, + 125, 103, 95, 138, 141, 76, 227, 31, 232, 232, 74, 234, 220, 209, 180, 192, + 159, 238, 232, 115, 81, 231, 142, 246, 188, 236, 104, 244, 45, 145, 248, 228, + 65, 151, 14, 225, 79, 30, 116, 170, 102, 247, 57, 118, 58, 113, 192, 7, + 189, 21, 65, 70, 229, 190, 226, 39, 125, 222, 182, 220, 74, 68, 238, 219, + 180, 31, 83, 116, 160, 42, 119, 126, 241, 173, 241, 137, 56, 227, 19, 177, + 198, 39, 226, 140, 79, 196, 26, 31, 252, 141, 216, 227, 115, 238, 107, 241, + 30, 250, 217, 213, 205, 234, 63, 210, 207, 170, 187, 163, 213, 191, 217, 211, + 234, 185, 171, 159, 71, 230, 129, 22, 119, 137, 17, 35, 115, 250, 79, 192, + 157, 117, 129, 61, 253, 123, 80, 103, 255, 10, 126, 100, 41, 126, 32, 30, + 56, 147, 82, 184, 207, 210, 73, 121, 95, 177, 17, 226, 181, 9, 139, 24, + 130, 9, 35, 126, 225, 127, 1, 59, 46, 112, 99, 250, 143, 224, 70, 214, + 141, 27, 211, 191, 137, 27, 217, 55, 112, 99, 122, 129, 27, 187, 127, 2, + 238, 186, 3, 182, 219, 184, 27, 11, 36, 236, 39, 242, 252, 147, 35, 222, + 231, 249, 63, 169, 40, 8, 138, 75, 16, 54, 221, 109, 99, 143, 21, 29, + 104, 172, 223, 159, 111, 122, 253, 175, 32, 88, 253, 140, 96, 245, 239, 227, + 83, 29, 241, 233, 127, 27, 155, 118, 255, 8, 54, 213, 221, 216, 180, 251, + 155, 216, 84, 127, 3, 155, 232, 136, 157, 67, 62, 158, 73, 64, 84, 244, + 70, 106, 157, 67, 89, 21, 238, 49, 192, 169, 162, 40, 218, 26, 224, 24, + 193, 3, 135, 143, 98, 44, 64, 171, 99, 168, 139, 120, 48, 40, 121, 244, + 247, 122, 32, 149, 175, 10, 146, 211, 5, 134, 77, 113, 253, 92, 15, 208, + 194, 208, 37, 182, 78, 21, 149, 173, 235, 93, 114, 146, 245, 194, 164, 210, + 231, 207, 94, 213, 251, 47, 226, 186, 29, 175, 121, 255, 101, 43, 173, 127, + 254, 76, 111, 7, 188, 175, 89, 248, 24, 159, 244, 83, 231, 100, 145, 133, + 64, 113, 83, 182, 134, 152, 226, 9, 70, 101, 66, 224, 6, 163, 138, 76, + 238, 60, 98, 196, 48, 166, 109, 0, 236, 239, 245, 19, 226, 50, 52, 40, + 77, 170, 127, 135, 246, 61, 67, 132, 30, 107, 46, 160, 181, 37, 68, 248, + 32, 251, 205, 231, 153, 126, 121, 242, 94, 42, 84, 146, 230, 160, 205, 2, + 158, 248, 94, 67, 241, 200, 63, 248, 143, 156, 239, 155, 215, 150, 37, 252, + 226, 195, 195, 10, 223, 211, 47, 193, 15, 236, 7, 239, 124, 129, 244, 239, + 192, 160, 249, 4, 124, 91, 204, 7, 186, 49, 181, 98, 172, 96, 236, 193, + 159, 27, 78, 218, 88, 107, 28, 237, 147, 32, 20, 97, 57, 223, 152, 220, + 96, 37, 44, 116, 60, 11, 157, 206, 198, 190, 249, 92, 99, 2, 35, 111, + 181, 255, 112, 60, 1, 73, 76, 251, 129, 228, 184, 28, 76, 136, 250, 71, + 6, 167, 217, 106, 63, 186, 171, 252, 73, 44, 62, 55, 27, 11, 252, 30, + 99, 61, 32, 44, 219, 215, 135, 103, 90, 49, 245, 255, 2, 227, 187, 153, + 225, 209, 171, 129, 158, 236, 104, 129, 207, 61, 14, 8, 57, 180, 2, 12, + 81, 148, 84, 179, 35, 96, 185, 180, 95, 239, 33, 18, 214, 60, 253, 132, + 9, 13, 254, 147, 167, 67, 223, 96, 115, 206, 98, 129, 80, 0, 131, 164, + 175, 168, 42, 156, 204, 73, 162, 16, 224, 101, 81, 187, 199, 244, 24, 206, + 201, 42, 39, 5, 68, 94, 225, 101, 133, 231, 85, 237, 30, 178, 127, 242, + 228, 172, 156, 15, 111, 228, 124, 120, 51, 103, 197, 149, 147, 211, 20, 142, + 215, 4, 73, 224, 4, 69, 196, 20, 118, 86, 21, 211, 195, 63, 40, 87, + 225, 68, 43, 39, 109, 127, 118, 249, 231, 45, 239, 183, 26, 135, 13, 67, + 74, 5, 186, 115, 146, 221, 206, 238, 111, 111, 173, 136, 46, 238, 35, 216, + 112, 191, 19, 34, 98, 71, 60, 216, 95, 194, 221, 157, 171, 156, 249, 157, + 93, 124, 238, 186, 248, 220, 63, 90, 124, 229, 186, 248, 202, 63, 84, 124, + 19, 75, 231, 31, 177, 51, 5, 69, 18, 229, 128, 26, 80, 120, 74, 175, + 61, 114, 48, 12, 154, 32, 242, 130, 172, 201, 98, 224, 62, 71, 199, 85, + 12, 40, 50, 47, 113, 18, 39, 114, 10, 175, 226, 22, 220, 34, 71, 251, + 143, 162, 204, 193, 160, 5, 20, 129, 211, 36, 116, 162, 153, 37, 233, 3, + 80, 44, 12, 139, 38, 106, 16, 41, 203, 80, 10, 25, 65, 69, 22, 85, + 9, 234, 212, 36, 149, 83, 101, 44, 165, 141, 165, 60, 224, 224, 114, 154, + 42, 168, 60, 121, 74, 1, 133, 0, 3, 165, 243, 66, 64, 80, 5, 141, + 147, 5, 145, 11, 72, 4, 26, 254, 81, 22, 132, 128, 162, 0, 158, 136, + 16, 174, 216, 244, 192, 45, 180, 138, 241, 218, 125, 208, 33, 4, 193, 125, + 27, 186, 197, 14, 1, 152, 49, 89, 203, 157, 108, 72, 147, 53, 157, 84, + 67, 202, 230, 180, 151, 159, 60, 95, 188, 77, 182, 197, 182, 189, 79, 126, + 178, 241, 95, 158, 71, 93, 204, 55, 152, 234, 91, 52, 253, 129, 175, 78, + 253, 216, 195, 188, 108, 123, 151, 116, 234, 195, 78, 83, 148, 171, 224, 46, + 58, 214, 21, 37, 65, 242, 75, 128, 230, 215, 145, 2, 222, 0, 73, 188, + 232, 231, 5, 245, 58, 78, 196, 56, 81, 19, 94, 137, 67, 139, 210, 130, + 194, 115, 126, 94, 129, 110, 191, 138, 164, 24, 16, 0, 238, 73, 16, 253, + 162, 112, 21, 219, 163, 163, 34, 95, 131, 210, 227, 72, 54, 69, 208, 100, + 24, 109, 89, 132, 177, 129, 249, 170, 244, 31, 120, 222, 78, 105, 225, 39, + 166, 67, 171, 119, 159, 108, 138, 105, 170, 19, 29, 182, 191, 183, 210, 162, + 108, 33, 44, 140, 217, 238, 232, 209, 99, 21, 248, 179, 203, 172, 171, 40, + 88, 99, 175, 15, 205, 197, 23, 244, 194, 139, 163, 97, 251, 4, 254, 53, + 50, 1, 97, 251, 63, 167, 17, 172, 22, 93, 208, 248, 223, 33, 16, 92, + 172, 0, 236, 161, 50, 247, 137, 60, 255, 124, 0, 74, 255, 19, 62, 240, + 237, 65, 252, 4, 111, 111, 176, 3, 86, 67, 61, 231, 6, 255, 215, 145, + 25, 231, 110, 251, 41, 26, 3, 91, 142, 187, 61, 73, 246, 42, 153, 129, + 41, 204, 255, 20, 54, 152, 255, 49, 116, 48, 255, 187, 241, 193, 252, 59, + 8, 225, 160, 128, 163, 163, 123, 198, 5, 245, 63, 131, 12, 234, 127, 20, + 27, 212, 255, 102, 116, 80, 255, 46, 62, 168, 239, 34, 4, 101, 22, 254, + 3, 107, 3, 97, 88, 126, 16, 25, 206, 112, 254, 55, 142, 160, 213, 218, + 159, 26, 191, 139, 211, 169, 11, 175, 44, 253, 165, 105, 76, 23, 132, 204, + 226, 21, 191, 32, 137, 170, 102, 83, 65, 19, 125, 185, 212, 9, 217, 6, + 129, 126, 33, 240, 201, 131, 227, 72, 60, 176, 60, 74, 188, 32, 201, 138, + 196, 18, 234, 57, 32, 3, 233, 141, 175, 60, 240, 63, 40, 218, 235, 225, + 30, 5, 94, 80, 2, 130, 134, 161, 192, 36, 241, 64, 238, 226, 43, 23, + 16, 248, 0, 0, 233, 65, 71, 50, 154, 40, 138, 36, 1, 16, 217, 192, + 20, 113, 248, 170, 1, 41, 206, 73, 196, 173, 11, 34, 143, 85, 153, 8, + 60, 145, 204, 43, 164, 54, 85, 230, 129, 28, 87, 73, 62, 9, 136, 103, + 158, 167, 245, 9, 130, 164, 170, 18, 71, 43, 84, 52, 78, 84, 72, 217, + 156, 2, 255, 7, 52, 158, 86, 41, 106, 188, 194, 81, 72, 180, 0, 112, + 1, 180, 204, 0, 132, 3, 21, 40, 96, 173, 49, 187, 78, 85, 13, 80, + 145, 93, 158, 83, 84, 142, 8, 7, 115, 80, 20, 31, 192, 146, 120, 100, + 22, 36, 137, 200, 8, 11, 26, 16, 251, 40, 195, 203, 115, 72, 251, 67, + 52, 253, 64, 81, 43, 120, 211, 84, 45, 160, 201, 164, 236, 253, 8, 253, + 72, 0, 249, 238, 35, 195, 229, 11, 6, 133, 63, 98, 31, 157, 15, 254, + 15, 232, 223, 143, 208, 236, 187, 251, 47, 84, 60, 197, 107, 9, 233, 161, + 67, 156, 91, 194, 7, 243, 202, 157, 31, 160, 134, 48, 100, 105, 33, 226, + 1, 248, 90, 63, 64, 6, 33, 7, 194, 238, 250, 101, 14, 19, 14, 142, + 24, 130, 148, 245, 224, 240, 167, 136, 233, 201, 251, 9, 223, 1, 139, 72, + 43, 33, 254, 179, 53, 254, 127, 192, 251, 199, 91, 40, 249, 30, 138, 121, + 32, 213, 144, 225, 103, 61, 6, 247, 153, 188, 221, 219, 41, 111, 1, 18, + 198, 130, 227, 238, 79, 241, 163, 193, 217, 73, 161, 142, 115, 121, 39, 187, + 188, 147, 187, 60, 108, 17, 84, 127, 31, 36, 125, 225, 115, 239, 40, 255, + 177, 13, 229, 175, 236, 39, 46, 72, 255, 27, 215, 16, 245, 239, 80, 137, + 175, 31, 184, 10, 143, 214, 177, 170, 125, 216, 138, 129, 252, 163, 16, 144, + 189, 15, 143, 200, 146, 184, 35, 5, 26, 201, 203, 192, 42, 147, 104, 158, + 115, 142, 100, 189, 23, 68, 135, 141, 25, 221, 145, 112, 86, 24, 250, 217, + 129, 70, 119, 97, 11, 108, 63, 12, 32, 45, 240, 167, 57, 174, 115, 81, + 63, 204, 113, 93, 120, 44, 124, 151, 227, 2, 216, 254, 239, 103, 1, 109, + 209, 95, 154, 4, 14, 156, 255, 125, 115, 192, 105, 237, 207, 209, 65, 22, + 246, 188, 129, 170, 255, 137, 69, 12, 106, 253, 137, 241, 251, 239, 93, 196, + 206, 237, 253, 223, 95, 196, 84, 248, 79, 123, 177, 126, 73, 168, 225, 35, + 145, 229, 77, 4, 26, 4, 22, 51, 215, 26, 102, 77, 141, 11, 196, 176, + 229, 198, 94, 8, 13, 157, 101, 11, 221, 195, 139, 84, 250, 251, 210, 111, + 231, 18, 207, 37, 188, 148, 45, 188, 40, 221, 45, 228, 54, 91, 236, 250, + 142, 22, 145, 109, 160, 233, 85, 119, 129, 104, 231, 30, 165, 56, 189, 182, + 45, 101, 250, 43, 120, 239, 241, 206, 233, 76, 117, 193, 183, 240, 228, 162, + 188, 224, 91, 124, 114, 81, 95, 94, 230, 11, 143, 18, 94, 150, 17, 6, + 52, 203, 105, 254, 18, 228, 169, 110, 205, 220, 82, 236, 6, 92, 57, 175, + 136, 110, 203, 0, 87, 220, 134, 109, 21, 251, 101, 119, 58, 246, 178, 255, + 98, 119, 58, 37, 158, 75, 120, 165, 59, 221, 165, 127, 191, 59, 237, 238, + 179, 52, 153, 189, 174, 6, 221, 123, 137, 225, 107, 216, 50, 190, 121, 95, + 239, 11, 167, 205, 94, 199, 135, 194, 116, 187, 113, 12, 234, 123, 169, 179, + 106, 203, 50, 10, 26, 66, 49, 230, 196, 130, 34, 153, 240, 78, 35, 19, + 253, 57, 10, 232, 162, 171, 36, 236, 131, 179, 54, 15, 138, 65, 18, 203, + 188, 253, 238, 118, 99, 236, 250, 182, 214, 20, 177, 19, 63, 130, 118, 58, + 198, 198, 221, 206, 172, 13, 88, 114, 182, 115, 42, 148, 106, 185, 35, 65, + 101, 117, 75, 154, 176, 235, 53, 187, 11, 40, 118, 166, 31, 140, 153, 229, + 65, 22, 39, 234, 208, 6, 2, 167, 41, 204, 108, 88, 151, 88, 175, 185, + 112, 202, 53, 54, 144, 229, 232, 221, 160, 165, 99, 115, 49, 131, 116, 6, + 60, 0, 196, 249, 133, 182, 24, 84, 142, 128, 189, 163, 214, 238, 36, 38, + 222, 176, 45, 123, 44, 238, 126, 9, 42, 18, 46, 126, 151, 253, 248, 174, + 27, 108, 219, 135, 44, 46, 135, 168, 49, 37, 169, 46, 215, 28, 62, 167, + 123, 17, 176, 7, 167, 204, 203, 174, 182, 20, 167, 172, 14, 70, 160, 208, + 77, 34, 166, 161, 134, 217, 111, 132, 71, 178, 238, 122, 128, 153, 162, 255, + 120, 175, 203, 87, 151, 163, 124, 163, 90, 202, 55, 72, 228, 255, 242, 203, + 237, 228, 95, 168, 245, 114, 180, 63, 4, 248, 56, 217, 31, 18, 124, 24, + 183, 95, 14, 236, 145, 61, 61, 221, 223, 238, 31, 248, 59, 116, 188, 200, + 3, 232, 249, 224, 87, 3, 213, 147, 96, 157, 247, 249, 136, 50, 211, 28, + 69, 62, 57, 226, 178, 16, 151, 10, 148, 236, 5, 22, 57, 71, 101, 249, + 143, 57, 246, 132, 110, 98, 113, 121, 131, 22, 4, 191, 82, 75, 181, 95, + 110, 48, 201, 19, 74, 45, 249, 105, 241, 68, 233, 138, 24, 129, 135, 100, + 119, 159, 131, 55, 130, 55, 136, 102, 31, 72, 66, 111, 158, 9, 90, 146, + 195, 16, 248, 96, 135, 162, 66, 12, 194, 241, 239, 181, 23, 120, 145, 212, + 28, 16, 225, 201, 251, 217, 118, 62, 241, 239, 95, 125, 55, 121, 91, 47, + 39, 255, 251, 13, 239, 249, 140, 112, 34, 248, 68, 72, 89, 36, 74, 42, + 68, 93, 136, 242, 179, 164, 167, 176, 229, 176, 67, 221, 166, 190, 252, 10, + 245, 160, 181, 99, 244, 112, 74, 129, 246, 146, 14, 241, 82, 176, 21, 17, + 245, 50, 38, 143, 158, 60, 23, 148, 129, 74, 59, 156, 41, 55, 170, 130, + 240, 153, 77, 5, 131, 95, 136, 98, 2, 118, 192, 14, 85, 239, 29, 109, + 122, 59, 26, 133, 228, 172, 63, 39, 17, 255, 90, 34, 119, 41, 194, 117, + 2, 50, 227, 93, 9, 196, 151, 9, 184, 139, 42, 36, 146, 128, 250, 117, + 242, 30, 236, 209, 100, 108, 163, 9, 22, 109, 217, 95, 15, 143, 196, 161, + 2, 222, 172, 186, 177, 254, 241, 27, 186, 76, 213, 55, 155, 254, 108, 185, + 49, 209, 75, 1, 135, 168, 224, 26, 140, 194, 18, 38, 33, 25, 141, 10, + 153, 211, 65, 175, 239, 235, 243, 205, 185, 200, 111, 62, 214, 27, 178, 242, + 19, 103, 114, 174, 242, 124, 94, 242, 159, 207, 243, 104, 225, 49, 148, 125, + 235, 153, 112, 206, 64, 108, 129, 178, 200, 115, 62, 150, 32, 206, 39, 207, + 132, 127, 61, 134, 133, 60, 193, 224, 132, 119, 110, 18, 83, 95, 38, 220, + 211, 39, 250, 67, 63, 121, 250, 201, 63, 209, 11, 97, 159, 213, 232, 215, + 26, 140, 18, 167, 52, 246, 179, 171, 29, 94, 119, 47, 209, 119, 239, 228, + 209, 123, 221, 59, 94, 91, 139, 203, 29, 243, 16, 36, 50, 240, 22, 134, + 186, 34, 62, 115, 110, 65, 125, 129, 80, 249, 158, 231, 203, 101, 199, 115, + 22, 182, 103, 125, 159, 173, 243, 150, 60, 185, 111, 114, 92, 176, 114, 159, + 208, 71, 252, 158, 170, 68, 193, 130, 129, 61, 120, 107, 233, 195, 221, 125, + 17, 1, 77, 28, 103, 177, 56, 243, 14, 15, 121, 150, 250, 143, 213, 113, + 141, 64, 231, 12, 7, 38, 79, 250, 210, 165, 86, 56, 33, 174, 91, 39, + 191, 7, 49, 153, 165, 91, 72, 101, 140, 104, 209, 19, 167, 232, 61, 21, + 132, 99, 0, 44, 42, 160, 52, 121, 56, 220, 221, 253, 201, 63, 202, 20, + 66, 38, 232, 221, 223, 19, 55, 177, 152, 255, 1, 151, 52, 172, 30, 65, + 102, 130, 123, 170, 253, 7, 201, 252, 65, 12, 241, 121, 182, 100, 234, 146, + 149, 132, 174, 224, 176, 58, 62, 119, 161, 87, 208, 112, 11, 254, 162, 55, + 86, 31, 190, 60, 207, 245, 89, 255, 108, 137, 37, 7, 171, 232, 89, 96, + 221, 89, 92, 189, 217, 90, 149, 28, 105, 254, 136, 186, 192, 171, 110, 174, + 191, 10, 127, 42, 223, 128, 101, 163, 118, 80, 137, 159, 230, 131, 151, 177, + 193, 178, 204, 154, 120, 206, 96, 58, 235, 62, 66, 116, 134, 1, 22, 247, + 11, 109, 122, 162, 99, 250, 139, 203, 15, 154, 115, 246, 134, 56, 248, 138, + 41, 20, 175, 101, 89, 132, 179, 116, 185, 31, 41, 186, 145, 74, 109, 139, + 216, 206, 210, 123, 187, 191, 31, 221, 247, 200, 93, 184, 104, 45, 187, 36, + 228, 151, 224, 205, 244, 79, 145, 58, 24, 186, 118, 45, 84, 113, 122, 47, + 98, 1, 140, 94, 178, 13, 203, 225, 80, 207, 229, 90, 232, 246, 202, 220, + 246, 29, 53, 65, 242, 232, 189, 153, 178, 244, 31, 58, 102, 123, 223, 38, + 201, 165, 108, 7, 118, 35, 241, 117, 1, 20, 143, 226, 191, 153, 126, 243, + 48, 123, 125, 189, 68, 231, 56, 79, 196, 22, 16, 143, 62, 35, 33, 126, + 182, 195, 229, 93, 167, 93, 220, 245, 58, 166, 68, 206, 76, 178, 27, 119, + 168, 97, 33, 24, 101, 157, 231, 89, 157, 23, 224, 79, 100, 117, 1, 222, + 5, 120, 23, 224, 93, 132, 119, 17, 222, 197, 179, 79, 122, 106, 101, 95, + 60, 136, 46, 124, 154, 233, 128, 16, 7, 139, 161, 112, 41, 143, 255, 152, + 164, 62, 146, 29, 0, 65, 144, 71, 95, 54, 0, 70, 16, 192, 8, 2, + 24, 212, 185, 13, 192, 98, 197, 8, 16, 42, 242, 240, 39, 56, 150, 226, + 0, 176, 183, 21, 192, 237, 246, 113, 150, 193, 36, 199, 233, 167, 91, 209, + 226, 220, 9, 215, 54, 187, 56, 203, 102, 23, 254, 72, 244, 71, 166, 113, + 46, 47, 52, 240, 163, 210, 31, 205, 109, 42, 142, 118, 146, 213, 45, 95, + 16, 89, 96, 47, 191, 17, 189, 159, 188, 55, 18, 186, 148, 185, 81, 240, + 53, 224, 189, 81, 189, 55, 154, 247, 233, 101, 207, 185, 236, 74, 216, 194, + 239, 103, 206, 194, 230, 185, 88, 225, 194, 98, 193, 35, 106, 118, 0, 131, + 240, 237, 19, 0, 252, 160, 224, 79, 224, 65, 3, 50, 204, 86, 65, 180, + 218, 189, 212, 167, 125, 88, 101, 161, 201, 214, 27, 89, 43, 96, 225, 112, + 62, 183, 179, 78, 255, 236, 97, 44, 53, 7, 202, 253, 90, 221, 197, 41, + 5, 64, 66, 154, 20, 85, 185, 136, 195, 12, 219, 255, 30, 154, 234, 119, + 25, 13, 112, 87, 229, 242, 51, 215, 179, 16, 193, 246, 239, 49, 53, 128, + 55, 192, 175, 5, 134, 117, 23, 11, 116, 244, 49, 238, 227, 199, 96, 170, + 163, 15, 186, 238, 182, 131, 176, 162, 215, 165, 206, 98, 79, 160, 94, 111, + 167, 104, 221, 196, 92, 174, 169, 155, 58, 88, 43, 103, 125, 244, 31, 162, + 111, 55, 219, 217, 28, 94, 246, 64, 151, 146, 144, 14, 117, 181, 210, 93, + 44, 151, 228, 123, 105, 204, 209, 123, 200, 110, 136, 5, 232, 211, 161, 142, + 177, 58, 236, 148, 144, 84, 159, 18, 182, 15, 171, 92, 35, 24, 189, 126, + 127, 73, 126, 166, 27, 157, 252, 2, 229, 143, 191, 198, 96, 0, 63, 195, + 181, 142, 70, 87, 70, 58, 54, 1, 94, 12, 146, 117, 134, 251, 25, 86, + 180, 56, 96, 236, 18, 214, 12, 27, 122, 4, 148, 40, 150, 33, 228, 125, + 98, 52, 97, 163, 175, 49, 24, 119, 192, 5, 254, 2, 135, 49, 211, 177, + 234, 205, 130, 6, 108, 215, 29, 163, 71, 26, 6, 43, 148, 78, 250, 169, + 187, 53, 151, 196, 151, 9, 20, 179, 238, 8, 240, 179, 61, 245, 59, 139, + 3, 105, 135, 49, 212, 3, 42, 199, 185, 223, 103, 200, 123, 253, 15, 170, + 70, 207, 245, 195, 110, 97, 244, 220, 254, 10, 237, 65, 133, 193, 240, 56, + 104, 226, 193, 49, 51, 9, 61, 224, 30, 69, 216, 135, 128, 16, 166, 126, + 120, 201, 55, 44, 164, 206, 209, 7, 242, 1, 244, 232, 3, 163, 130, 142, + 3, 190, 219, 27, 254, 55, 32, 79, 124, 119, 172, 239, 198, 42, 132, 172, + 211, 36, 149, 181, 78, 59, 103, 29, 78, 216, 197, 65, 7, 69, 199, 75, + 36, 252, 64, 75, 243, 161, 254, 164, 3, 36, 9, 242, 92, 194, 76, 228, + 115, 44, 164, 67, 15, 12, 44, 65, 56, 22, 208, 141, 69, 100, 99, 1, + 213, 88, 68, 52, 22, 209, 140, 181, 144, 140, 165, 40, 198, 82, 4, 99, + 41, 122, 177, 20, 185, 88, 138, 90, 44, 34, 22, 75, 209, 138, 69, 164, + 98, 1, 165, 88, 130, 80, 44, 160, 19, 107, 33, 19, 139, 168, 196, 34, + 34, 177, 4, 141, 88, 130, 68, 44, 162, 16, 139, 8, 196, 82, 244, 97, + 1, 121, 88, 138, 58, 44, 32, 14, 75, 208, 134, 64, 195, 18, 148, 97, + 9, 194, 160, 203, 242, 57, 75, 144, 133, 181, 80, 133, 69, 68, 97, 41, + 154, 176, 20, 73, 216, 51, 138, 176, 136, 32, 44, 69, 15, 214, 65, 8, + 246, 2, 53, 88, 55, 98, 216, 125, 39, 160, 103, 95, 232, 58, 98, 120, + 131, 248, 224, 96, 216, 249, 75, 237, 177, 215, 108, 69, 204, 134, 66, 7, + 128, 87, 36, 84, 79, 166, 212, 177, 51, 34, 190, 175, 243, 111, 62, 192, + 59, 159, 167, 163, 72, 193, 127, 163, 218, 211, 191, 233, 241, 217, 237, 135, + 27, 8, 250, 112, 231, 5, 158, 2, 138, 225, 53, 8, 249, 55, 254, 55, + 135, 48, 221, 82, 116, 123, 68, 3, 1, 176, 180, 1, 245, 238, 197, 2, + 190, 110, 144, 50, 178, 145, 5, 42, 242, 122, 105, 213, 2, 64, 225, 197, + 204, 62, 44, 213, 7, 191, 110, 45, 111, 27, 26, 123, 41, 250, 232, 129, + 77, 150, 114, 71, 236, 23, 94, 97, 68, 225, 30, 177, 249, 240, 249, 179, + 124, 199, 158, 191, 49, 64, 184, 251, 87, 224, 142, 21, 5, 70, 145, 104, + 154, 127, 137, 119, 79, 231, 18, 137, 9, 110, 119, 105, 135, 123, 81, 214, + 40, 179, 135, 65, 79, 182, 68, 246, 163, 109, 66, 192, 201, 74, 215, 193, + 143, 30, 87, 3, 124, 185, 74, 152, 239, 204, 243, 203, 182, 32, 79, 219, + 113, 109, 172, 39, 226, 199, 84, 226, 176, 236, 37, 203, 102, 187, 174, 77, + 59, 179, 242, 178, 213, 144, 50, 185, 113, 77, 72, 69, 99, 195, 92, 37, + 116, 74, 69, 114, 66, 174, 218, 205, 244, 211, 251, 252, 100, 148, 24, 110, + 249, 80, 235, 80, 85, 91, 209, 162, 84, 138, 134, 165, 216, 144, 9, 103, + 98, 161, 106, 184, 21, 14, 197, 74, 205, 232, 168, 52, 10, 229, 146, 195, + 125, 63, 28, 238, 111, 155, 225, 97, 110, 56, 11, 237, 35, 169, 212, 48, + 146, 74, 135, 99, 161, 82, 113, 184, 197, 244, 149, 232, 190, 17, 221, 183, + 162, 81, 201, 191, 73, 28, 2, 242, 105, 192, 148, 164, 97, 104, 59, 138, + 20, 227, 245, 83, 142, 139, 12, 119, 181, 102, 124, 182, 230, 150, 211, 212, + 114, 18, 22, 50, 251, 134, 212, 89, 46, 215, 188, 162, 231, 134, 229, 211, + 176, 207, 43, 251, 206, 190, 218, 57, 52, 184, 172, 210, 226, 82, 7, 115, + 108, 196, 143, 237, 99, 105, 23, 74, 85, 22, 209, 98, 60, 215, 26, 54, + 166, 243, 106, 45, 229, 207, 73, 29, 115, 58, 45, 48, 41, 57, 199, 37, + 182, 139, 198, 140, 201, 22, 149, 73, 106, 182, 222, 76, 54, 227, 209, 86, + 53, 15, 99, 61, 173, 213, 149, 211, 62, 31, 61, 114, 113, 99, 188, 40, + 119, 167, 139, 242, 41, 177, 27, 142, 58, 209, 106, 200, 40, 48, 109, 213, + 159, 220, 105, 233, 69, 166, 220, 41, 175, 3, 90, 122, 188, 111, 174, 150, + 133, 65, 56, 113, 40, 235, 102, 172, 63, 142, 36, 133, 73, 242, 56, 90, + 111, 35, 201, 137, 48, 110, 166, 229, 195, 100, 152, 136, 247, 198, 197, 225, + 210, 47, 165, 218, 82, 50, 90, 157, 72, 217, 234, 184, 185, 14, 197, 162, + 178, 210, 59, 77, 82, 230, 164, 156, 72, 168, 137, 253, 72, 139, 247, 86, + 213, 145, 218, 153, 228, 134, 75, 142, 73, 39, 180, 77, 135, 57, 52, 151, + 217, 129, 172, 110, 135, 201, 132, 63, 177, 40, 38, 148, 246, 108, 94, 73, + 140, 152, 240, 156, 47, 28, 35, 147, 166, 32, 246, 106, 161, 241, 98, 30, + 144, 197, 232, 232, 88, 77, 111, 71, 70, 68, 63, 116, 143, 170, 222, 29, + 4, 180, 232, 118, 187, 239, 148, 242, 11, 127, 62, 181, 73, 173, 154, 205, + 70, 92, 210, 248, 152, 90, 230, 98, 145, 124, 97, 185, 204, 76, 251, 230, + 120, 170, 103, 212, 189, 153, 90, 45, 51, 251, 172, 88, 74, 239, 231, 163, + 200, 113, 152, 216, 116, 34, 141, 206, 176, 179, 75, 115, 13, 41, 17, 207, + 21, 42, 235, 225, 124, 153, 42, 105, 235, 118, 50, 218, 202, 29, 235, 21, + 65, 225, 123, 49, 190, 198, 135, 253, 163, 73, 45, 53, 95, 25, 53, 191, + 36, 229, 162, 37, 255, 76, 10, 231, 54, 201, 186, 214, 88, 201, 157, 225, + 106, 188, 73, 43, 83, 61, 222, 200, 212, 162, 155, 194, 222, 44, 199, 119, + 122, 46, 187, 171, 132, 218, 157, 228, 152, 217, 106, 11, 255, 150, 51, 54, + 161, 188, 124, 72, 54, 85, 57, 83, 217, 74, 137, 206, 52, 153, 231, 194, + 233, 97, 44, 57, 40, 38, 54, 19, 179, 61, 206, 72, 233, 201, 41, 222, + 226, 67, 187, 73, 42, 87, 141, 165, 195, 205, 192, 166, 32, 37, 35, 113, + 37, 185, 216, 169, 114, 29, 240, 67, 143, 53, 22, 102, 33, 181, 50, 214, + 173, 90, 116, 210, 104, 248, 11, 201, 64, 60, 81, 228, 213, 176, 54, 226, + 198, 99, 83, 210, 54, 199, 237, 36, 214, 170, 100, 90, 70, 187, 58, 142, + 204, 138, 243, 201, 33, 21, 152, 247, 67, 141, 73, 161, 80, 61, 172, 77, + 41, 36, 118, 166, 167, 120, 108, 180, 75, 155, 195, 92, 115, 53, 51, 141, + 238, 97, 88, 78, 228, 226, 198, 52, 176, 144, 247, 21, 49, 185, 77, 181, + 103, 161, 68, 183, 59, 84, 247, 187, 105, 78, 173, 13, 138, 141, 230, 114, + 144, 206, 203, 233, 106, 113, 204, 180, 166, 243, 67, 88, 41, 69, 149, 205, + 46, 49, 235, 69, 181, 69, 237, 176, 8, 175, 27, 93, 113, 54, 80, 71, + 242, 96, 156, 11, 186, 182, 19, 66, 127, 252, 35, 51, 242, 152, 15, 45, + 165, 121, 113, 231, 159, 75, 201, 145, 127, 63, 78, 68, 35, 185, 126, 84, + 74, 167, 18, 177, 80, 46, 148, 20, 203, 197, 77, 200, 93, 51, 33, 121, + 126, 182, 230, 220, 193, 85, 243, 41, 119, 26, 194, 90, 112, 24, 203, 225, + 72, 105, 18, 31, 52, 243, 129, 252, 73, 221, 111, 179, 21, 149, 219, 172, + 27, 243, 229, 172, 154, 158, 171, 253, 117, 126, 187, 87, 122, 219, 121, 117, + 205, 117, 183, 197, 162, 168, 249, 251, 254, 129, 42, 238, 154, 167, 195, 222, + 111, 10, 217, 240, 81, 234, 30, 211, 243, 22, 95, 47, 215, 231, 105, 174, + 155, 236, 159, 198, 173, 89, 97, 181, 58, 46, 214, 71, 243, 20, 63, 68, + 106, 139, 149, 62, 26, 233, 133, 228, 48, 86, 86, 251, 115, 89, 110, 214, + 55, 131, 94, 113, 150, 173, 11, 129, 94, 151, 41, 231, 248, 193, 182, 152, + 12, 104, 204, 96, 176, 203, 10, 76, 95, 204, 78, 21, 109, 107, 48, 157, + 254, 182, 113, 146, 119, 125, 81, 147, 75, 181, 118, 4, 136, 226, 228, 66, + 105, 140, 166, 203, 76, 205, 204, 118, 79, 121, 192, 250, 113, 106, 85, 48, + 59, 141, 211, 38, 16, 174, 213, 166, 237, 81, 187, 145, 159, 183, 114, 141, + 36, 44, 110, 205, 245, 134, 81, 3, 131, 109, 64, 223, 233, 189, 221, 206, + 31, 144, 181, 254, 188, 190, 224, 183, 205, 234, 193, 223, 55, 133, 102, 126, + 50, 158, 86, 251, 252, 110, 125, 220, 101, 43, 146, 153, 85, 197, 62, 183, + 137, 70, 75, 181, 116, 169, 36, 55, 122, 99, 233, 144, 40, 215, 123, 53, + 126, 211, 108, 242, 145, 214, 50, 115, 50, 148, 109, 103, 123, 236, 228, 27, + 235, 209, 81, 82, 149, 104, 250, 232, 239, 246, 139, 81, 213, 63, 232, 249, + 163, 169, 82, 40, 166, 244, 135, 163, 76, 38, 49, 108, 53, 180, 173, 168, + 181, 154, 241, 101, 191, 81, 231, 97, 153, 41, 201, 21, 173, 13, 85, 22, + 37, 173, 80, 239, 140, 121, 89, 99, 118, 141, 129, 182, 136, 148, 242, 242, + 36, 197, 44, 82, 133, 97, 170, 222, 105, 196, 151, 237, 163, 58, 206, 112, + 213, 220, 62, 53, 78, 140, 23, 153, 204, 104, 215, 244, 43, 187, 2, 180, + 101, 203, 5, 250, 187, 206, 106, 94, 129, 182, 236, 142, 179, 18, 23, 10, + 135, 34, 254, 181, 94, 86, 131, 62, 52, 220, 113, 222, 89, 196, 23, 27, + 136, 77, 31, 255, 44, 218, 164, 120, 23, 218, 240, 249, 113, 151, 162, 205, + 182, 51, 141, 49, 209, 121, 92, 206, 148, 106, 245, 112, 163, 166, 13, 42, + 28, 172, 28, 92, 175, 89, 15, 213, 179, 74, 217, 104, 207, 228, 145, 14, + 173, 210, 27, 245, 101, 187, 81, 223, 116, 26, 188, 17, 134, 225, 202, 69, + 211, 43, 49, 188, 207, 173, 51, 156, 153, 205, 53, 226, 90, 182, 220, 90, + 101, 39, 173, 68, 57, 84, 58, 14, 227, 161, 86, 39, 33, 68, 39, 245, + 117, 82, 48, 106, 227, 252, 74, 56, 45, 231, 213, 165, 200, 244, 245, 94, + 152, 211, 6, 187, 93, 115, 193, 244, 118, 197, 162, 63, 192, 248, 253, 59, + 49, 32, 251, 7, 240, 100, 152, 98, 82, 99, 2, 189, 93, 51, 160, 105, + 254, 193, 154, 79, 236, 75, 161, 70, 157, 241, 135, 34, 177, 90, 40, 60, + 27, 136, 1, 77, 97, 182, 209, 6, 223, 204, 205, 163, 140, 216, 219, 206, + 2, 242, 126, 57, 169, 22, 70, 187, 140, 202, 167, 12, 127, 91, 204, 71, + 59, 149, 218, 33, 63, 106, 111, 139, 147, 216, 40, 85, 137, 143, 114, 141, + 169, 92, 46, 215, 249, 108, 157, 211, 66, 199, 220, 56, 198, 231, 178, 141, + 125, 119, 158, 62, 244, 196, 170, 160, 237, 146, 60, 12, 255, 73, 11, 237, + 83, 209, 161, 148, 142, 150, 34, 33, 46, 26, 26, 71, 82, 92, 24, 118, + 133, 242, 164, 23, 59, 152, 165, 121, 90, 135, 158, 40, 247, 27, 124, 85, + 150, 170, 75, 85, 214, 183, 226, 58, 188, 84, 153, 118, 126, 118, 106, 111, + 196, 236, 232, 176, 151, 90, 121, 69, 131, 109, 182, 211, 19, 78, 141, 101, + 46, 20, 174, 14, 204, 100, 178, 186, 92, 137, 157, 30, 19, 208, 251, 12, + 20, 223, 207, 65, 55, 48, 90, 183, 56, 143, 8, 229, 124, 50, 186, 61, + 233, 155, 121, 146, 231, 134, 141, 83, 122, 215, 224, 248, 116, 173, 217, 142, + 116, 146, 163, 221, 70, 46, 108, 160, 179, 229, 97, 43, 209, 95, 70, 135, + 105, 165, 63, 95, 41, 133, 49, 140, 195, 114, 161, 43, 179, 213, 42, 131, + 83, 115, 158, 62, 170, 195, 69, 38, 178, 88, 102, 42, 240, 103, 12, 215, + 199, 238, 58, 91, 153, 108, 83, 195, 97, 242, 200, 248, 39, 233, 72, 41, + 20, 86, 139, 241, 83, 33, 105, 164, 142, 153, 249, 106, 166, 149, 185, 112, + 171, 147, 76, 207, 154, 179, 105, 189, 37, 108, 230, 162, 90, 89, 230, 132, + 78, 113, 86, 237, 249, 247, 221, 116, 220, 144, 187, 102, 163, 211, 86, 133, + 94, 122, 122, 148, 245, 93, 35, 27, 55, 210, 229, 136, 25, 90, 20, 235, + 173, 68, 150, 79, 172, 194, 209, 188, 16, 232, 111, 135, 197, 197, 113, 149, + 155, 159, 120, 198, 207, 48, 195, 67, 46, 82, 134, 209, 155, 157, 122, 61, + 49, 51, 234, 20, 230, 218, 186, 38, 214, 195, 237, 217, 33, 214, 141, 133, + 143, 137, 168, 20, 14, 237, 139, 167, 225, 34, 23, 13, 13, 247, 57, 127, + 145, 215, 118, 85, 78, 19, 123, 124, 111, 158, 22, 55, 235, 140, 152, 31, + 165, 154, 92, 47, 90, 173, 215, 210, 114, 34, 50, 52, 228, 122, 189, 158, + 138, 47, 43, 147, 94, 179, 170, 249, 67, 92, 40, 148, 40, 37, 3, 53, + 190, 215, 108, 240, 195, 180, 92, 11, 9, 49, 62, 95, 173, 229, 123, 37, + 62, 31, 173, 98, 120, 173, 158, 46, 213, 228, 70, 105, 114, 104, 85, 165, + 254, 96, 18, 31, 165, 74, 49, 166, 57, 147, 103, 161, 100, 126, 82, 74, + 250, 125, 158, 239, 76, 51, 139, 249, 252, 185, 89, 150, 31, 151, 112, 134, + 193, 2, 157, 27, 166, 78, 169, 125, 110, 15, 219, 66, 40, 25, 10, 69, + 253, 254, 124, 181, 37, 228, 163, 161, 69, 50, 180, 143, 134, 246, 181, 116, + 116, 20, 171, 198, 195, 165, 74, 44, 180, 79, 135, 247, 173, 68, 120, 56, + 204, 198, 194, 173, 94, 186, 34, 73, 165, 9, 223, 110, 55, 227, 129, 209, + 50, 209, 89, 102, 4, 97, 167, 14, 138, 66, 222, 63, 15, 248, 59, 170, + 223, 15, 139, 172, 127, 44, 104, 131, 166, 192, 68, 184, 83, 161, 170, 197, + 171, 245, 118, 191, 157, 152, 110, 187, 243, 182, 50, 88, 100, 18, 198, 130, + 169, 205, 218, 194, 104, 153, 233, 47, 215, 25, 229, 96, 6, 26, 34, 44, + 123, 234, 174, 163, 248, 119, 48, 225, 118, 1, 133, 217, 117, 142, 234, 54, + 176, 130, 5, 96, 22, 216, 153, 217, 228, 41, 159, 109, 138, 133, 236, 82, + 45, 26, 185, 89, 166, 113, 220, 153, 187, 166, 184, 77, 142, 164, 124, 160, + 43, 108, 198, 13, 62, 95, 196, 149, 161, 120, 234, 174, 19, 251, 181, 34, + 111, 50, 204, 114, 153, 86, 90, 147, 133, 144, 28, 54, 15, 82, 47, 25, + 54, 245, 68, 125, 212, 156, 46, 155, 53, 14, 86, 131, 177, 42, 67, 123, + 205, 76, 36, 55, 72, 140, 106, 165, 116, 70, 155, 45, 135, 193, 239, 47, + 116, 120, 56, 240, 147, 221, 127, 106, 185, 186, 63, 118, 202, 149, 160, 251, + 19, 249, 225, 62, 36, 72, 233, 120, 37, 31, 128, 181, 136, 155, 152, 58, + 35, 232, 59, 49, 217, 145, 246, 107, 177, 89, 244, 107, 227, 225, 198, 15, + 107, 128, 36, 111, 230, 197, 188, 63, 53, 219, 228, 146, 124, 110, 151, 79, + 233, 203, 73, 128, 49, 235, 243, 105, 182, 92, 156, 175, 123, 83, 57, 80, + 204, 70, 123, 1, 230, 160, 23, 79, 178, 188, 9, 196, 247, 218, 166, 113, + 218, 78, 215, 153, 201, 172, 168, 2, 178, 215, 150, 205, 97, 107, 81, 237, + 0, 73, 50, 98, 198, 220, 124, 125, 18, 101, 38, 220, 207, 30, 102, 208, + 243, 178, 26, 48, 147, 243, 246, 169, 16, 80, 246, 203, 242, 62, 123, 216, + 104, 233, 122, 92, 40, 102, 97, 134, 135, 66, 161, 46, 195, 111, 246, 33, + 232, 158, 239, 33, 40, 30, 164, 252, 228, 30, 80, 77, 113, 174, 61, 224, + 144, 143, 198, 96, 15, 56, 141, 227, 229, 76, 179, 222, 203, 150, 242, 213, + 140, 216, 107, 118, 196, 104, 75, 73, 85, 212, 64, 42, 163, 40, 11, 157, + 153, 155, 179, 83, 250, 36, 46, 51, 117, 5, 54, 98, 97, 238, 159, 240, + 169, 6, 108, 203, 146, 127, 48, 16, 25, 69, 241, 251, 249, 80, 45, 183, + 12, 133, 19, 208, 67, 225, 110, 121, 26, 239, 181, 195, 213, 121, 239, 160, + 13, 185, 112, 225, 84, 17, 182, 235, 196, 110, 27, 138, 78, 121, 181, 187, + 230, 27, 98, 103, 91, 20, 179, 199, 98, 206, 88, 174, 165, 112, 193, 95, + 235, 229, 183, 220, 36, 54, 6, 18, 131, 155, 44, 245, 242, 166, 83, 16, + 39, 201, 242, 177, 55, 143, 231, 43, 98, 111, 34, 116, 119, 205, 53, 63, + 61, 201, 177, 83, 157, 81, 213, 254, 160, 200, 103, 247, 33, 216, 5, 142, + 171, 239, 98, 18, 57, 109, 250, 201, 190, 58, 165, 92, 168, 212, 149, 34, + 115, 163, 219, 98, 98, 229, 73, 61, 89, 206, 117, 226, 7, 181, 52, 75, + 87, 186, 147, 229, 202, 34, 177, 142, 237, 197, 166, 47, 41, 221, 109, 51, + 11, 239, 230, 110, 224, 151, 17, 214, 201, 105, 89, 59, 149, 253, 109, 88, + 79, 243, 240, 94, 233, 79, 151, 171, 202, 60, 93, 105, 197, 194, 106, 51, + 113, 200, 245, 226, 229, 73, 57, 185, 236, 248, 195, 128, 2, 201, 109, 203, + 47, 149, 126, 96, 134, 88, 231, 98, 63, 75, 9, 12, 221, 45, 59, 96, + 203, 24, 191, 58, 200, 11, 209, 81, 188, 94, 44, 229, 179, 105, 65, 45, + 241, 217, 99, 228, 184, 234, 108, 103, 189, 205, 44, 58, 93, 110, 248, 228, + 9, 240, 95, 45, 102, 171, 72, 226, 53, 199, 138, 212, 219, 117, 82, 129, + 9, 183, 142, 115, 167, 117, 71, 159, 108, 143, 147, 125, 74, 21, 27, 135, + 252, 38, 93, 139, 21, 242, 211, 80, 41, 154, 49, 162, 131, 252, 247, 91, + 67, 15, 247, 254, 185, 214, 192, 56, 213, 107, 90, 136, 51, 231, 157, 67, + 180, 182, 75, 101, 51, 203, 173, 210, 22, 132, 86, 161, 49, 19, 107, 131, + 66, 115, 190, 219, 171, 155, 226, 110, 185, 238, 108, 35, 117, 216, 190, 167, + 2, 215, 41, 54, 149, 108, 117, 39, 36, 199, 7, 65, 217, 29, 235, 51, + 177, 59, 40, 54, 119, 154, 212, 221, 21, 119, 194, 84, 10, 133, 34, 101, + 198, 144, 114, 223, 109, 141, 117, 66, 249, 179, 173, 113, 47, 96, 165, 163, + 61, 54, 113, 24, 155, 9, 31, 173, 228, 154, 197, 125, 52, 37, 231, 179, + 202, 1, 90, 180, 61, 232, 57, 65, 8, 29, 187, 59, 81, 20, 25, 181, + 218, 141, 86, 135, 161, 144, 158, 236, 206, 132, 253, 15, 44, 36, 214, 17, + 234, 207, 206, 143, 152, 187, 223, 101, 210, 239, 66, 52, 20, 225, 71, 18, + 208, 76, 53, 36, 185, 197, 193, 41, 34, 109, 178, 167, 227, 193, 84, 210, + 230, 161, 181, 77, 102, 199, 167, 73, 97, 158, 221, 240, 138, 191, 184, 62, + 5, 2, 42, 80, 126, 178, 202, 248, 179, 203, 253, 201, 20, 215, 211, 189, + 52, 24, 156, 246, 254, 141, 216, 1, 66, 170, 131, 220, 201, 46, 62, 175, + 166, 119, 117, 126, 83, 173, 1, 169, 28, 75, 164, 151, 210, 247, 231, 7, + 57, 19, 254, 185, 118, 21, 170, 19, 247, 14, 206, 231, 134, 100, 11, 153, + 180, 183, 205, 161, 180, 197, 29, 91, 175, 79, 210, 153, 50, 240, 220, 141, + 122, 111, 80, 67, 50, 63, 63, 78, 136, 155, 108, 251, 212, 77, 166, 15, + 154, 191, 42, 168, 123, 53, 19, 105, 49, 185, 241, 100, 147, 170, 76, 196, + 226, 41, 39, 173, 51, 145, 253, 114, 165, 24, 171, 78, 99, 180, 210, 251, + 59, 51, 176, 228, 246, 221, 238, 138, 75, 116, 138, 243, 211, 148, 145, 218, + 249, 121, 102, 83, 222, 66, 195, 25, 205, 175, 69, 14, 176, 238, 193, 82, + 50, 101, 20, 77, 25, 47, 143, 176, 212, 22, 199, 170, 191, 215, 245, 151, + 103, 25, 51, 146, 18, 82, 70, 77, 203, 156, 186, 227, 116, 246, 184, 218, + 172, 50, 242, 186, 147, 152, 239, 148, 165, 41, 181, 7, 43, 115, 91, 50, + 27, 161, 189, 216, 135, 237, 166, 115, 90, 139, 129, 232, 129, 211, 186, 131, + 117, 142, 105, 109, 128, 7, 17, 164, 65, 127, 192, 236, 129, 162, 152, 175, + 53, 69, 101, 2, 99, 89, 129, 242, 253, 162, 124, 80, 171, 153, 125, 55, + 183, 75, 3, 53, 153, 213, 153, 201, 98, 165, 76, 129, 136, 48, 58, 179, + 230, 60, 18, 173, 182, 243, 199, 144, 84, 140, 66, 229, 213, 201, 38, 38, + 140, 246, 149, 250, 116, 218, 171, 243, 209, 154, 176, 9, 180, 97, 190, 8, + 121, 225, 180, 47, 200, 125, 19, 106, 25, 45, 248, 206, 102, 43, 182, 118, + 205, 129, 127, 95, 41, 38, 187, 241, 69, 56, 148, 174, 46, 38, 235, 210, + 247, 199, 207, 58, 204, 255, 217, 93, 46, 198, 95, 50, 200, 19, 194, 233, + 72, 76, 117, 22, 59, 148, 26, 19, 185, 210, 168, 241, 229, 6, 167, 85, + 203, 249, 83, 230, 96, 102, 51, 124, 79, 236, 240, 106, 49, 149, 143, 132, + 148, 188, 145, 146, 179, 149, 88, 32, 123, 36, 163, 166, 172, 237, 222, 13, + 20, 132, 65, 62, 209, 84, 214, 217, 249, 41, 126, 228, 123, 187, 25, 180, + 114, 194, 3, 101, 127, 234, 3, 101, 95, 226, 202, 5, 160, 132, 21, 105, + 80, 16, 103, 243, 166, 9, 195, 122, 8, 48, 253, 142, 118, 56, 210, 222, + 213, 14, 106, 160, 149, 136, 79, 101, 38, 10, 124, 68, 174, 20, 15, 183, + 234, 19, 57, 82, 153, 46, 235, 205, 122, 188, 93, 6, 206, 11, 230, 12, + 16, 45, 209, 212, 33, 223, 1, 46, 118, 157, 0, 184, 202, 66, 111, 80, + 228, 84, 32, 79, 162, 251, 61, 96, 21, 140, 252, 66, 201, 87, 185, 81, + 166, 10, 152, 117, 204, 173, 211, 153, 227, 208, 204, 26, 2, 192, 121, 220, + 174, 27, 154, 169, 207, 128, 89, 101, 78, 91, 160, 207, 7, 133, 68, 83, + 215, 210, 179, 147, 108, 30, 59, 59, 49, 122, 152, 204, 106, 235, 250, 138, + 111, 111, 1, 41, 150, 6, 140, 16, 227, 215, 97, 132, 6, 195, 90, 1, + 22, 62, 25, 86, 159, 118, 27, 120, 138, 248, 169, 91, 204, 30, 142, 234, + 34, 29, 217, 27, 41, 163, 181, 5, 52, 158, 102, 43, 185, 245, 82, 65, + 70, 227, 104, 172, 86, 250, 118, 161, 79, 226, 189, 84, 130, 25, 234, 137, + 178, 217, 154, 45, 103, 157, 25, 176, 190, 141, 252, 186, 45, 104, 67, 165, + 80, 53, 37, 160, 56, 165, 254, 124, 35, 49, 187, 185, 168, 133, 90, 241, + 240, 94, 143, 91, 171, 3, 112, 84, 205, 228, 33, 210, 154, 167, 51, 250, + 116, 169, 148, 103, 237, 70, 111, 38, 111, 155, 115, 57, 92, 107, 198, 211, + 122, 29, 24, 182, 70, 189, 94, 109, 240, 189, 98, 41, 50, 145, 219, 33, + 243, 187, 88, 67, 110, 126, 126, 154, 50, 186, 60, 84, 137, 214, 16, 103, + 170, 124, 52, 193, 119, 7, 157, 125, 68, 2, 138, 168, 118, 202, 159, 34, + 156, 9, 124, 248, 182, 35, 172, 215, 129, 130, 210, 129, 254, 85, 78, 81, + 196, 7, 185, 189, 153, 103, 249, 237, 80, 232, 108, 4, 32, 147, 154, 187, + 29, 246, 105, 244, 160, 202, 253, 237, 73, 50, 218, 133, 57, 242, 140, 125, + 38, 208, 101, 74, 102, 51, 203, 11, 12, 204, 239, 213, 166, 111, 138, 157, + 141, 162, 12, 6, 187, 130, 216, 4, 254, 119, 172, 73, 76, 49, 90, 150, + 142, 189, 226, 124, 44, 7, 252, 219, 44, 160, 90, 159, 112, 195, 12, 19, + 208, 70, 56, 109, 113, 173, 223, 2, 77, 36, 32, 94, 157, 36, 173, 15, + 249, 78, 154, 223, 239, 135, 159, 227, 194, 92, 40, 21, 130, 7, 237, 89, + 29, 240, 160, 186, 10, 108, 155, 227, 228, 161, 4, 108, 176, 212, 78, 150, + 183, 131, 105, 250, 168, 207, 151, 137, 250, 188, 189, 25, 52, 226, 229, 74, + 131, 116, 53, 223, 17, 181, 170, 206, 245, 184, 98, 175, 151, 53, 218, 149, + 93, 51, 149, 62, 112, 114, 222, 72, 215, 4, 216, 49, 59, 35, 85, 27, + 172, 242, 13, 113, 176, 21, 155, 126, 46, 156, 24, 158, 226, 21, 126, 171, + 39, 14, 43, 189, 65, 241, 77, 233, 11, 157, 92, 50, 89, 129, 173, 160, + 186, 52, 25, 216, 108, 119, 194, 60, 73, 250, 70, 223, 37, 32, 104, 139, + 184, 135, 236, 36, 44, 12, 187, 90, 39, 63, 147, 34, 133, 217, 92, 220, + 13, 1, 247, 100, 78, 26, 148, 97, 217, 30, 1, 102, 106, 178, 159, 41, + 84, 219, 6, 76, 49, 81, 244, 43, 234, 86, 76, 174, 79, 126, 127, 40, + 41, 240, 138, 26, 251, 254, 190, 134, 87, 127, 255, 200, 169, 222, 33, 79, + 206, 214, 78, 1, 63, 51, 152, 243, 156, 31, 246, 35, 205, 175, 110, 163, + 133, 177, 110, 54, 79, 203, 189, 100, 238, 252, 41, 163, 154, 131, 229, 78, + 145, 84, 38, 154, 134, 62, 218, 193, 240, 104, 76, 191, 235, 15, 239, 198, + 7, 181, 215, 28, 11, 114, 175, 144, 236, 25, 66, 219, 76, 192, 244, 78, + 197, 234, 251, 78, 100, 31, 109, 140, 54, 201, 102, 102, 56, 110, 118, 162, + 203, 163, 210, 43, 238, 14, 43, 73, 245, 231, 114, 66, 137, 59, 197, 197, + 110, 177, 155, 53, 90, 203, 226, 177, 59, 220, 100, 51, 130, 169, 87, 66, + 57, 221, 88, 102, 35, 98, 238, 84, 219, 102, 198, 165, 29, 236, 53, 221, + 3, 47, 167, 70, 251, 176, 212, 218, 248, 79, 73, 117, 39, 236, 214, 204, + 178, 145, 149, 185, 192, 58, 32, 12, 23, 39, 142, 203, 244, 170, 197, 88, + 47, 186, 25, 149, 98, 173, 84, 171, 51, 204, 237, 197, 46, 23, 169, 196, + 12, 127, 76, 75, 4, 210, 169, 114, 105, 81, 213, 170, 92, 171, 21, 3, + 14, 36, 109, 46, 71, 13, 36, 62, 93, 164, 12, 185, 61, 253, 73, 86, + 172, 26, 114, 179, 98, 2, 97, 197, 66, 137, 70, 40, 49, 247, 243, 57, + 49, 185, 239, 172, 184, 181, 222, 31, 206, 218, 153, 236, 40, 201, 243, 157, + 70, 189, 91, 227, 38, 76, 238, 56, 236, 199, 135, 42, 114, 196, 169, 200, + 144, 43, 198, 70, 165, 122, 252, 48, 108, 39, 202, 19, 252, 107, 197, 15, + 173, 122, 236, 144, 21, 129, 117, 93, 202, 133, 104, 151, 215, 138, 197, 163, + 58, 136, 237, 179, 71, 105, 211, 73, 108, 96, 101, 50, 230, 64, 149, 3, + 87, 154, 30, 37, 53, 5, 216, 136, 13, 44, 80, 131, 6, 223, 46, 87, + 107, 211, 88, 41, 186, 23, 115, 71, 105, 149, 238, 158, 226, 187, 142, 190, + 91, 101, 18, 250, 68, 18, 18, 195, 228, 146, 235, 204, 70, 227, 38, 191, + 132, 213, 56, 93, 174, 197, 195, 197, 234, 132, 207, 85, 184, 105, 10, 72, + 244, 72, 241, 196, 5, 10, 209, 218, 49, 123, 220, 47, 211, 70, 110, 152, + 12, 79, 234, 252, 82, 85, 179, 251, 31, 160, 215, 241, 250, 249, 103, 15, + 20, 220, 100, 86, 76, 38, 231, 204, 161, 132, 24, 138, 141, 253, 106, 65, + 92, 43, 253, 241, 76, 46, 100, 71, 162, 6, 76, 186, 54, 111, 241, 27, + 224, 189, 145, 73, 55, 79, 217, 99, 119, 12, 28, 70, 49, 188, 11, 8, + 234, 118, 109, 240, 102, 32, 98, 119, 79, 125, 146, 218, 198, 73, 147, 133, + 233, 164, 57, 29, 85, 171, 147, 81, 180, 184, 93, 207, 164, 222, 169, 201, + 153, 98, 106, 31, 0, 6, 63, 27, 89, 47, 87, 137, 238, 44, 93, 40, + 24, 173, 74, 168, 47, 182, 15, 157, 68, 207, 104, 214, 49, 253, 52, 90, + 172, 14, 143, 217, 202, 112, 156, 28, 77, 26, 177, 81, 168, 16, 29, 114, + 240, 39, 225, 95, 62, 90, 218, 103, 35, 195, 249, 74, 206, 7, 90, 156, + 121, 74, 236, 179, 48, 220, 43, 99, 52, 79, 55, 138, 70, 43, 175, 245, + 147, 105, 88, 160, 194, 29, 160, 211, 129, 150, 10, 5, 242, 227, 212, 22, + 54, 178, 89, 58, 82, 154, 164, 35, 181, 89, 218, 232, 46, 50, 149, 201, + 50, 19, 129, 234, 43, 185, 81, 242, 176, 215, 19, 225, 90, 69, 145, 194, + 141, 229, 143, 176, 72, 246, 93, 255, 63, 179, 31, 228, 79, 37, 188, 112, + 11, 235, 251, 68, 205, 63, 26, 234, 201, 176, 52, 76, 25, 185, 105, 218, + 24, 34, 152, 139, 244, 177, 52, 76, 140, 114, 249, 200, 112, 145, 139, 149, + 91, 221, 148, 209, 221, 228, 78, 67, 166, 196, 77, 11, 245, 250, 102, 164, + 39, 100, 126, 144, 202, 164, 39, 105, 189, 183, 80, 102, 251, 205, 250, 20, + 61, 118, 3, 117, 1, 104, 129, 64, 49, 186, 13, 20, 214, 11, 153, 105, + 142, 165, 141, 191, 47, 246, 118, 186, 144, 7, 132, 205, 103, 203, 92, 46, + 144, 63, 170, 235, 20, 236, 150, 209, 125, 55, 194, 236, 178, 43, 192, 242, + 194, 126, 173, 175, 230, 11, 89, 209, 167, 237, 72, 118, 212, 10, 43, 189, + 132, 182, 108, 241, 114, 171, 198, 241, 169, 210, 152, 235, 165, 34, 169, 89, + 38, 98, 110, 115, 209, 156, 0, 59, 177, 191, 84, 171, 167, 171, 241, 120, + 189, 193, 107, 19, 88, 179, 15, 189, 228, 72, 29, 166, 42, 73, 67, 82, + 42, 211, 246, 12, 250, 186, 48, 91, 173, 142, 64, 150, 234, 242, 46, 235, + 143, 28, 186, 243, 220, 73, 43, 54, 132, 141, 56, 146, 251, 115, 83, 41, + 20, 251, 2, 172, 38, 71, 179, 25, 218, 6, 244, 3, 236, 129, 99, 224, + 123, 17, 141, 18, 195, 230, 65, 236, 206, 120, 172, 191, 93, 143, 193, 112, + 70, 37, 25, 102, 216, 34, 117, 80, 97, 187, 207, 193, 132, 3, 116, 160, + 104, 81, 0, 42, 41, 23, 217, 47, 210, 229, 216, 178, 220, 136, 203, 211, + 78, 50, 31, 24, 46, 86, 149, 217, 42, 177, 52, 179, 122, 96, 215, 81, + 52, 122, 46, 181, 85, 0, 27, 241, 108, 10, 254, 86, 240, 190, 85, 241, + 86, 97, 167, 194, 150, 218, 237, 164, 142, 166, 88, 228, 122, 205, 38, 192, + 55, 0, 50, 99, 169, 48, 131, 145, 176, 105, 2, 61, 148, 209, 54, 235, + 200, 138, 156, 75, 181, 182, 137, 129, 56, 229, 128, 226, 54, 154, 241, 118, + 169, 194, 181, 195, 197, 104, 247, 148, 53, 204, 69, 218, 64, 52, 43, 77, + 129, 17, 159, 103, 34, 128, 102, 149, 225, 28, 194, 140, 84, 89, 234, 38, + 70, 221, 122, 108, 165, 3, 253, 210, 253, 1, 74, 21, 5, 73, 254, 145, + 211, 152, 83, 129, 156, 198, 236, 171, 241, 114, 161, 137, 115, 0, 160, 106, + 76, 151, 122, 57, 84, 78, 87, 38, 219, 180, 177, 48, 211, 145, 225, 16, + 248, 136, 89, 182, 18, 217, 46, 149, 246, 188, 179, 245, 111, 147, 7, 101, + 48, 159, 246, 26, 130, 86, 19, 128, 188, 207, 198, 25, 133, 81, 96, 39, + 146, 123, 64, 76, 249, 149, 254, 182, 40, 250, 3, 42, 236, 95, 154, 194, + 244, 139, 192, 187, 51, 253, 65, 243, 200, 116, 10, 115, 216, 158, 180, 109, + 210, 47, 158, 182, 66, 135, 87, 52, 72, 95, 101, 2, 153, 73, 181, 188, + 247, 111, 133, 0, 175, 169, 82, 139, 207, 200, 45, 115, 22, 205, 107, 181, + 169, 54, 175, 136, 124, 93, 175, 197, 5, 125, 126, 168, 173, 178, 76, 211, + 8, 8, 245, 85, 251, 88, 153, 45, 245, 254, 4, 137, 13, 189, 176, 94, + 2, 233, 87, 137, 1, 113, 59, 79, 39, 170, 147, 248, 161, 223, 172, 107, + 53, 113, 211, 180, 79, 152, 27, 129, 17, 119, 208, 87, 124, 226, 212, 222, + 9, 129, 120, 64, 84, 99, 227, 3, 199, 244, 118, 205, 232, 148, 89, 9, + 129, 168, 204, 168, 253, 98, 113, 116, 100, 122, 226, 90, 14, 0, 99, 219, + 228, 247, 219, 217, 56, 236, 239, 153, 98, 96, 52, 99, 106, 153, 97, 178, + 195, 245, 170, 157, 90, 253, 208, 132, 189, 163, 52, 47, 75, 181, 56, 211, + 92, 41, 133, 13, 32, 242, 97, 183, 214, 19, 43, 88, 53, 214, 233, 225, + 92, 154, 164, 134, 254, 253, 108, 159, 27, 172, 1, 71, 70, 129, 190, 57, + 136, 135, 83, 141, 68, 89, 232, 76, 210, 149, 202, 124, 217, 168, 214, 121, + 36, 55, 151, 253, 90, 157, 222, 17, 213, 53, 127, 73, 200, 87, 187, 194, + 166, 83, 230, 171, 155, 145, 186, 46, 183, 187, 7, 160, 212, 58, 245, 173, + 42, 41, 218, 136, 99, 186, 187, 210, 9, 136, 183, 1, 244, 150, 220, 47, + 136, 126, 67, 42, 72, 27, 93, 238, 238, 230, 81, 129, 223, 41, 91, 126, + 209, 89, 169, 219, 72, 72, 204, 28, 115, 155, 116, 117, 178, 204, 85, 98, + 163, 84, 21, 200, 186, 97, 44, 33, 109, 139, 227, 214, 42, 55, 222, 195, + 74, 233, 207, 114, 218, 188, 32, 108, 78, 161, 200, 126, 27, 152, 199, 191, + 139, 107, 68, 90, 233, 39, 183, 145, 168, 155, 171, 141, 241, 5, 186, 141, + 84, 67, 137, 147, 159, 233, 7, 198, 66, 46, 16, 221, 40, 199, 209, 180, + 181, 10, 1, 29, 62, 107, 213, 97, 155, 173, 167, 139, 213, 218, 38, 83, + 137, 181, 99, 37, 46, 30, 42, 2, 169, 89, 172, 114, 76, 145, 11, 135, + 75, 85, 149, 41, 156, 38, 66, 238, 20, 50, 51, 131, 157, 168, 250, 163, + 176, 70, 52, 71, 98, 111, 94, 231, 186, 39, 220, 62, 36, 83, 81, 150, + 176, 70, 181, 38, 64, 59, 15, 69, 13, 215, 168, 85, 59, 46, 183, 107, + 156, 156, 42, 157, 36, 5, 150, 252, 93, 6, 246, 168, 228, 97, 151, 222, + 7, 4, 72, 207, 0, 15, 3, 27, 183, 146, 25, 47, 148, 2, 253, 91, + 101, 70, 139, 52, 211, 155, 167, 183, 250, 172, 221, 111, 76, 219, 149, 234, + 4, 56, 235, 145, 20, 150, 58, 66, 187, 95, 175, 241, 241, 98, 181, 181, + 203, 9, 233, 244, 60, 244, 3, 219, 2, 21, 245, 250, 71, 168, 67, 49, + 127, 10, 145, 9, 27, 3, 164, 138, 145, 73, 91, 105, 76, 218, 20, 169, + 106, 211, 118, 185, 94, 175, 69, 67, 211, 250, 52, 93, 171, 203, 133, 250, + 180, 157, 128, 233, 156, 41, 195, 170, 179, 212, 27, 161, 202, 44, 188, 138, + 199, 171, 188, 22, 197, 253, 186, 14, 101, 113, 249, 113, 227, 4, 204, 232, + 161, 43, 134, 143, 221, 193, 128, 83, 75, 106, 198, 144, 14, 249, 74, 110, + 158, 202, 84, 12, 216, 138, 167, 11, 216, 239, 151, 192, 88, 106, 252, 250, + 0, 244, 119, 127, 219, 232, 104, 178, 160, 42, 90, 120, 47, 1, 99, 208, + 20, 246, 219, 250, 58, 207, 168, 48, 213, 79, 166, 220, 222, 137, 243, 128, + 95, 243, 23, 119, 187, 0, 163, 13, 96, 246, 251, 25, 255, 90, 230, 84, + 114, 139, 166, 14, 118, 77, 67, 232, 21, 129, 241, 11, 116, 183, 98, 113, + 125, 88, 215, 214, 83, 85, 25, 20, 155, 162, 161, 20, 98, 81, 216, 137, + 54, 98, 32, 125, 16, 245, 245, 180, 114, 232, 228, 230, 213, 250, 166, 59, + 215, 138, 101, 97, 51, 110, 214, 235, 114, 183, 22, 47, 148, 103, 75, 163, + 19, 47, 183, 38, 89, 70, 220, 74, 219, 232, 90, 111, 180, 39, 29, 69, + 24, 173, 86, 149, 93, 234, 56, 217, 166, 12, 188, 126, 218, 69, 79, 221, + 38, 112, 149, 98, 116, 15, 172, 108, 128, 9, 1, 171, 221, 73, 173, 210, + 192, 90, 102, 13, 188, 163, 155, 204, 66, 161, 118, 202, 200, 26, 170, 9, + 76, 247, 108, 189, 90, 77, 215, 250, 108, 190, 86, 182, 147, 78, 34, 12, + 172, 101, 122, 217, 105, 196, 87, 209, 98, 191, 58, 147, 250, 226, 58, 121, + 24, 118, 227, 163, 88, 61, 38, 247, 97, 21, 207, 92, 244, 59, 101, 102, + 198, 93, 114, 42, 1, 235, 70, 171, 151, 169, 233, 85, 188, 165, 155, 4, + 6, 76, 210, 88, 118, 55, 205, 117, 124, 117, 2, 246, 34, 81, 173, 195, + 234, 183, 97, 14, 93, 127, 191, 63, 24, 152, 208, 25, 203, 163, 6, 76, + 207, 4, 186, 97, 158, 221, 0, 187, 149, 169, 235, 26, 164, 92, 203, 167, + 128, 154, 192, 197, 10, 208, 253, 164, 105, 27, 33, 89, 229, 25, 198, 63, + 24, 243, 50, 51, 16, 179, 178, 202, 236, 146, 162, 166, 110, 102, 213, 50, + 222, 100, 174, 101, 217, 223, 95, 77, 35, 204, 160, 48, 143, 46, 101, 127, + 97, 60, 26, 238, 7, 66, 160, 55, 211, 186, 106, 95, 88, 183, 129, 241, + 171, 31, 253, 157, 173, 160, 215, 43, 100, 221, 22, 218, 197, 132, 49, 42, + 237, 0, 78, 238, 212, 103, 244, 156, 210, 43, 204, 170, 75, 137, 51, 59, + 204, 110, 19, 216, 174, 205, 128, 176, 89, 118, 102, 135, 133, 174, 8, 219, + 213, 202, 88, 227, 133, 119, 36, 180, 75, 31, 205, 19, 204, 84, 57, 87, + 149, 112, 155, 48, 178, 145, 210, 98, 159, 243, 39, 5, 173, 136, 87, 107, + 101, 113, 211, 209, 185, 205, 169, 118, 200, 141, 66, 85, 174, 151, 45, 113, + 124, 92, 232, 5, 210, 241, 114, 122, 135, 43, 181, 210, 163, 204, 246, 6, + 239, 2, 59, 92, 117, 152, 85, 116, 100, 222, 2, 209, 233, 73, 30, 102, + 195, 59, 96, 226, 100, 19, 218, 45, 68, 195, 195, 69, 45, 139, 12, 221, + 6, 176, 102, 98, 212, 179, 211, 163, 220, 219, 204, 78, 178, 58, 34, 204, + 93, 119, 211, 88, 243, 202, 184, 190, 230, 87, 16, 14, 173, 101, 8, 163, + 119, 106, 109, 147, 201, 170, 108, 242, 157, 205, 76, 138, 142, 204, 216, 182, + 22, 9, 117, 129, 237, 147, 142, 249, 228, 56, 205, 73, 225, 18, 147, 84, + 15, 53, 24, 151, 169, 226, 239, 150, 204, 86, 180, 216, 29, 20, 147, 39, + 142, 193, 219, 82, 165, 95, 4, 74, 222, 223, 215, 182, 179, 94, 101, 219, + 196, 195, 194, 22, 183, 244, 247, 196, 77, 21, 240, 16, 230, 166, 156, 168, + 76, 210, 92, 63, 26, 218, 183, 150, 226, 102, 93, 225, 115, 209, 100, 133, + 231, 97, 226, 181, 51, 181, 105, 57, 5, 59, 4, 144, 58, 133, 252, 184, + 221, 72, 37, 66, 227, 182, 16, 157, 200, 219, 228, 152, 87, 75, 211, 84, + 106, 186, 108, 69, 150, 49, 57, 205, 12, 91, 147, 234, 44, 186, 226, 55, + 217, 58, 47, 197, 194, 157, 6, 188, 85, 120, 32, 101, 121, 62, 95, 47, + 53, 90, 102, 184, 57, 145, 27, 64, 148, 86, 170, 177, 114, 173, 17, 11, + 37, 246, 197, 86, 81, 117, 115, 76, 84, 130, 244, 103, 47, 175, 46, 238, + 14, 169, 72, 73, 114, 163, 6, 84, 125, 154, 83, 187, 133, 64, 94, 81, + 90, 131, 102, 37, 12, 123, 119, 149, 89, 195, 244, 208, 182, 171, 204, 108, + 5, 116, 222, 38, 83, 210, 195, 19, 128, 214, 220, 101, 143, 6, 44, 154, + 71, 115, 153, 73, 197, 167, 253, 232, 50, 181, 200, 230, 198, 192, 10, 200, + 192, 201, 204, 50, 99, 105, 146, 139, 248, 129, 123, 106, 134, 15, 102, 52, + 238, 247, 51, 157, 186, 122, 236, 194, 202, 0, 91, 90, 95, 172, 140, 170, + 57, 160, 11, 196, 254, 78, 28, 52, 55, 166, 8, 99, 121, 64, 2, 160, + 48, 142, 76, 170, 176, 242, 232, 137, 217, 98, 101, 236, 10, 39, 78, 46, + 142, 23, 106, 62, 26, 154, 239, 161, 40, 232, 242, 220, 49, 31, 29, 52, + 184, 124, 188, 82, 143, 39, 42, 211, 52, 204, 246, 50, 222, 188, 151, 74, + 113, 166, 56, 135, 242, 96, 106, 152, 141, 211, 146, 131, 149, 41, 41, 197, + 66, 18, 158, 99, 72, 145, 240, 2, 127, 151, 146, 159, 9, 108, 102, 120, + 115, 30, 29, 5, 212, 141, 49, 26, 192, 188, 232, 76, 143, 129, 214, 46, + 161, 206, 234, 69, 216, 85, 97, 107, 224, 118, 199, 220, 50, 61, 222, 239, + 243, 154, 24, 62, 108, 78, 41, 17, 234, 171, 133, 135, 71, 89, 30, 253, + 200, 189, 34, 17, 235, 253, 89, 90, 173, 116, 114, 45, 253, 28, 180, 156, + 240, 3, 235, 82, 188, 226, 31, 118, 211, 17, 220, 208, 15, 177, 74, 60, + 220, 106, 36, 194, 102, 63, 101, 180, 86, 217, 113, 74, 40, 140, 229, 72, + 185, 54, 205, 215, 234, 229, 86, 19, 202, 111, 207, 54, 187, 238, 188, 45, + 15, 90, 145, 152, 209, 58, 150, 38, 114, 191, 51, 87, 10, 243, 149, 162, + 28, 55, 129, 149, 127, 111, 14, 178, 64, 119, 55, 197, 188, 127, 34, 51, + 187, 45, 244, 14, 175, 13, 154, 156, 218, 247, 155, 74, 191, 99, 136, 218, + 169, 205, 247, 178, 133, 163, 58, 142, 237, 215, 74, 96, 155, 109, 28, 215, + 202, 113, 185, 92, 21, 134, 243, 246, 170, 53, 109, 103, 138, 227, 212, 42, + 57, 74, 197, 153, 65, 114, 42, 192, 86, 178, 213, 133, 17, 176, 205, 124, + 27, 54, 162, 98, 133, 27, 197, 75, 85, 41, 0, 184, 182, 207, 86, 22, + 179, 212, 49, 212, 75, 29, 91, 203, 108, 68, 61, 229, 171, 147, 64, 145, + 75, 199, 43, 177, 77, 190, 22, 207, 215, 27, 241, 77, 191, 149, 200, 207, + 244, 196, 102, 219, 77, 230, 133, 126, 243, 0, 83, 4, 120, 134, 197, 177, + 56, 89, 54, 90, 51, 89, 193, 251, 229, 213, 186, 19, 225, 54, 235, 21, + 179, 207, 85, 147, 71, 213, 95, 230, 123, 227, 174, 200, 20, 103, 74, 255, + 180, 85, 139, 201, 131, 90, 0, 216, 183, 131, 177, 148, 183, 97, 31, 68, + 129, 91, 151, 55, 235, 204, 110, 165, 204, 166, 139, 37, 3, 203, 123, 163, + 2, 139, 65, 122, 180, 40, 132, 6, 205, 165, 216, 75, 198, 183, 157, 196, + 104, 214, 18, 194, 253, 6, 63, 106, 192, 54, 95, 168, 198, 150, 201, 114, + 45, 229, 47, 2, 101, 158, 175, 166, 16, 254, 69, 186, 146, 14, 149, 184, + 94, 166, 58, 141, 215, 8, 188, 141, 50, 192, 187, 52, 59, 115, 216, 66, + 197, 186, 212, 159, 31, 180, 97, 42, 19, 27, 45, 140, 204, 184, 197, 148, + 39, 178, 222, 154, 45, 143, 131, 133, 94, 153, 175, 244, 237, 214, 204, 22, + 132, 109, 118, 203, 236, 187, 213, 4, 174, 162, 220, 166, 217, 18, 52, 191, + 33, 247, 7, 171, 64, 33, 176, 83, 139, 209, 93, 160, 48, 159, 73, 27, + 17, 96, 143, 102, 15, 102, 70, 219, 118, 42, 0, 119, 223, 128, 254, 174, + 79, 90, 66, 106, 148, 10, 171, 61, 49, 15, 76, 91, 111, 220, 36, 252, + 183, 6, 140, 91, 57, 84, 56, 13, 57, 152, 116, 43, 224, 13, 141, 20, + 112, 207, 128, 82, 157, 68, 121, 216, 136, 151, 241, 206, 31, 120, 161, 208, + 34, 21, 30, 199, 76, 65, 153, 124, 31, 119, 137, 44, 250, 89, 242, 148, + 71, 65, 217, 71, 175, 163, 45, 37, 186, 174, 135, 169, 184, 250, 207, 210, + 137, 23, 23, 232, 92, 129, 158, 218, 100, 66, 201, 166, 63, 99, 160, 84, + 217, 208, 72, 28, 74, 69, 88, 105, 139, 177, 17, 48, 98, 145, 218, 50, + 91, 5, 210, 229, 180, 80, 75, 177, 116, 162, 82, 147, 171, 141, 184, 54, + 235, 136, 179, 216, 36, 173, 152, 219, 110, 179, 44, 48, 157, 61, 83, 70, + 158, 89, 157, 229, 162, 211, 112, 37, 166, 33, 31, 58, 213, 27, 242, 169, + 159, 60, 134, 71, 139, 109, 105, 218, 94, 13, 150, 153, 217, 214, 12, 24, + 218, 222, 236, 100, 79, 176, 6, 11, 249, 117, 79, 42, 32, 30, 241, 135, + 193, 226, 216, 94, 232, 153, 1, 48, 105, 245, 201, 50, 82, 192, 211, 2, + 163, 53, 75, 25, 41, 35, 57, 146, 128, 205, 76, 21, 194, 131, 249, 6, + 101, 16, 214, 109, 33, 13, 56, 115, 24, 182, 27, 188, 48, 76, 173, 106, + 129, 106, 47, 20, 253, 145, 35, 3, 227, 111, 28, 23, 132, 228, 151, 50, + 121, 251, 112, 121, 159, 144, 252, 195, 82, 34, 188, 95, 228, 136, 184, 71, + 217, 62, 58, 40, 1, 123, 190, 128, 13, 92, 221, 231, 198, 37, 62, 127, + 26, 202, 133, 177, 9, 216, 6, 228, 245, 88, 122, 249, 119, 210, 66, 165, + 90, 58, 90, 142, 213, 19, 149, 24, 244, 120, 76, 43, 193, 190, 214, 104, + 196, 151, 221, 230, 44, 14, 219, 218, 104, 213, 105, 134, 79, 189, 249, 84, + 29, 72, 133, 132, 177, 0, 182, 126, 185, 26, 0, 185, 104, 154, 217, 138, + 188, 51, 179, 9, 152, 154, 85, 129, 84, 52, 73, 68, 66, 19, 128, 39, + 132, 203, 85, 43, 81, 222, 247, 146, 199, 216, 56, 29, 105, 45, 50, 149, + 253, 38, 123, 138, 157, 242, 209, 174, 84, 24, 239, 25, 24, 210, 88, 153, + 155, 102, 171, 48, 106, 245, 250, 72, 111, 54, 194, 70, 187, 209, 91, 117, + 26, 218, 177, 215, 236, 41, 131, 38, 19, 25, 165, 244, 244, 56, 165, 192, + 212, 130, 37, 97, 41, 32, 55, 15, 83, 235, 184, 51, 59, 21, 156, 90, + 218, 78, 205, 198, 14, 234, 58, 123, 234, 69, 97, 51, 29, 252, 127, 234, + 222, 116, 61, 113, 36, 105, 20, 254, 239, 171, 208, 120, 220, 111, 217, 22, + 182, 246, 133, 234, 118, 245, 195, 190, 152, 125, 135, 154, 26, 63, 66, 8, + 16, 72, 2, 36, 246, 106, 95, 208, 185, 142, 115, 99, 39, 34, 37, 64, + 120, 169, 174, 238, 170, 239, 157, 111, 186, 31, 23, 82, 42, 215, 200, 204, + 216, 50, 50, 162, 199, 71, 65, 100, 7, 46, 78, 54, 214, 75, 181, 2, + 50, 16, 227, 40, 169, 109, 87, 203, 214, 99, 211, 252, 110, 182, 42, 2, + 39, 83, 73, 197, 147, 53, 118, 94, 6, 110, 174, 215, 105, 167, 97, 169, + 112, 7, 149, 69, 110, 146, 163, 27, 214, 220, 214, 29, 249, 113, 58, 95, + 152, 11, 247, 81, 134, 225, 61, 194, 138, 105, 3, 195, 103, 74, 43, 119, + 161, 248, 170, 2, 88, 164, 122, 33, 185, 45, 118, 50, 91, 117, 2, 76, + 210, 186, 8, 12, 104, 5, 112, 119, 157, 141, 86, 90, 220, 114, 216, 229, + 7, 107, 93, 88, 50, 99, 145, 238, 56, 216, 31, 5, 101, 178, 225, 68, + 102, 82, 141, 189, 195, 111, 254, 124, 201, 4, 151, 65, 126, 190, 177, 16, + 51, 220, 171, 52, 179, 150, 233, 181, 3, 211, 63, 228, 163, 195, 198, 30, + 56, 231, 141, 66, 11, 128, 76, 39, 142, 100, 20, 70, 194, 192, 237, 0, + 123, 82, 218, 233, 157, 216, 186, 96, 236, 221, 133, 61, 117, 36, 212, 237, + 45, 210, 163, 236, 146, 211, 51, 115, 171, 155, 158, 183, 154, 169, 121, 186, + 154, 244, 248, 162, 177, 182, 196, 146, 219, 220, 171, 78, 106, 237, 218, 144, + 223, 156, 56, 61, 179, 62, 233, 154, 137, 97, 103, 176, 59, 233, 246, 230, + 153, 234, 4, 4, 180, 125, 17, 144, 44, 81, 150, 152, 136, 227, 136, 125, + 15, 208, 146, 76, 28, 168, 251, 184, 219, 74, 199, 65, 180, 173, 210, 192, + 132, 148, 13, 59, 95, 174, 152, 179, 118, 124, 152, 29, 179, 58, 140, 181, + 215, 206, 15, 65, 176, 238, 182, 44, 212, 186, 230, 235, 77, 174, 132, 50, + 118, 183, 13, 34, 68, 167, 5, 244, 47, 147, 134, 253, 91, 154, 116, 249, + 146, 217, 133, 98, 157, 214, 86, 107, 113, 173, 122, 131, 221, 230, 107, 211, + 34, 83, 105, 73, 3, 249, 123, 4, 58, 188, 133, 243, 115, 140, 234, 75, + 141, 46, 108, 218, 221, 126, 32, 160, 241, 73, 69, 136, 86, 10, 156, 186, + 81, 139, 201, 17, 95, 48, 65, 86, 153, 52, 151, 197, 250, 212, 41, 237, + 138, 251, 242, 174, 174, 206, 64, 54, 115, 93, 25, 143, 194, 150, 107, 45, + 35, 205, 251, 198, 122, 166, 148, 221, 149, 108, 176, 133, 100, 108, 84, 76, + 198, 196, 124, 162, 202, 194, 254, 53, 139, 230, 72, 91, 76, 216, 104, 14, + 54, 111, 185, 129, 71, 105, 42, 147, 219, 23, 221, 50, 16, 169, 66, 97, + 55, 242, 160, 174, 21, 114, 111, 64, 203, 23, 238, 66, 94, 46, 248, 229, + 172, 159, 153, 37, 50, 163, 216, 126, 214, 97, 18, 219, 20, 72, 2, 236, + 110, 80, 114, 4, 123, 159, 70, 126, 91, 238, 87, 4, 102, 60, 243, 128, + 5, 55, 165, 254, 218, 46, 180, 8, 219, 45, 11, 104, 113, 184, 183, 22, + 66, 127, 185, 98, 186, 171, 206, 186, 34, 56, 108, 54, 57, 22, 65, 154, + 104, 204, 60, 180, 62, 148, 88, 90, 167, 21, 117, 220, 197, 67, 164, 93, + 116, 176, 170, 216, 46, 74, 122, 81, 142, 81, 203, 192, 214, 163, 4, 168, + 108, 213, 168, 1, 130, 209, 134, 6, 57, 136, 145, 152, 21, 72, 56, 34, + 154, 105, 114, 104, 149, 217, 90, 112, 250, 58, 103, 196, 210, 169, 228, 150, + 97, 214, 251, 158, 7, 114, 36, 8, 9, 146, 186, 106, 108, 69, 22, 88, + 60, 224, 173, 233, 114, 50, 78, 108, 58, 151, 124, 212, 160, 245, 242, 227, + 54, 177, 169, 86, 83, 74, 50, 149, 148, 220, 12, 108, 206, 81, 190, 190, + 241, 148, 56, 200, 187, 89, 128, 193, 244, 209, 236, 143, 229, 173, 10, 216, + 178, 170, 3, 193, 110, 103, 199, 169, 90, 186, 198, 14, 82, 27, 189, 8, + 147, 52, 149, 242, 141, 230, 178, 210, 96, 247, 192, 221, 162, 86, 116, 93, + 217, 38, 186, 177, 68, 51, 54, 42, 143, 98, 227, 81, 172, 212, 111, 113, + 73, 61, 22, 211, 98, 153, 116, 46, 25, 139, 25, 206, 92, 161, 197, 36, + 237, 108, 26, 59, 102, 179, 27, 49, 52, 124, 220, 36, 103, 140, 218, 26, + 49, 27, 152, 158, 114, 131, 105, 244, 86, 66, 181, 194, 51, 131, 189, 186, + 137, 197, 38, 32, 44, 11, 74, 67, 66, 131, 212, 53, 26, 164, 86, 178, + 50, 72, 38, 149, 198, 88, 232, 173, 59, 32, 226, 49, 195, 97, 97, 182, + 233, 131, 92, 195, 75, 192, 211, 246, 57, 214, 235, 224, 92, 232, 101, 199, + 49, 229, 124, 218, 31, 112, 191, 164, 108, 153, 222, 178, 189, 7, 160, 22, + 98, 101, 209, 137, 242, 131, 145, 8, 243, 14, 115, 12, 248, 169, 63, 22, + 141, 172, 37, 142, 196, 88, 49, 49, 28, 199, 98, 197, 110, 92, 205, 218, + 210, 170, 48, 149, 202, 13, 200, 55, 112, 122, 107, 175, 66, 39, 171, 106, + 33, 33, 198, 166, 163, 202, 36, 53, 127, 108, 76, 185, 116, 189, 25, 79, + 231, 219, 77, 107, 222, 106, 181, 210, 64, 221, 6, 141, 54, 55, 209, 217, + 210, 8, 0, 147, 89, 42, 53, 94, 119, 234, 163, 92, 44, 238, 37, 244, + 85, 7, 164, 215, 110, 204, 30, 229, 59, 49, 248, 207, 26, 165, 248, 126, + 105, 86, 172, 111, 30, 149, 129, 193, 244, 189, 216, 166, 31, 235, 182, 99, + 49, 39, 6, 66, 76, 9, 196, 60, 85, 26, 174, 65, 66, 219, 185, 29, + 23, 45, 59, 215, 176, 254, 179, 230, 40, 230, 140, 82, 73, 49, 217, 220, + 196, 146, 146, 58, 204, 215, 107, 214, 60, 215, 77, 109, 155, 134, 184, 26, + 46, 69, 99, 62, 234, 241, 37, 171, 219, 6, 198, 211, 174, 205, 102, 143, + 180, 59, 147, 203, 203, 133, 102, 143, 221, 133, 182, 88, 44, 30, 61, 52, + 74, 205, 37, 84, 20, 81, 221, 220, 174, 8, 136, 96, 154, 7, 98, 60, + 177, 50, 103, 98, 147, 127, 137, 238, 111, 211, 94, 254, 140, 246, 78, 166, + 132, 246, 86, 70, 217, 56, 179, 48, 61, 194, 226, 245, 97, 5, 120, 192, + 158, 234, 251, 50, 59, 168, 52, 185, 37, 200, 128, 81, 216, 233, 3, 197, + 16, 150, 10, 114, 111, 61, 46, 218, 169, 239, 213, 125, 126, 171, 103, 128, + 197, 107, 111, 221, 71, 96, 241, 230, 102, 99, 210, 53, 226, 134, 208, 90, + 65, 251, 253, 86, 138, 203, 86, 27, 30, 87, 76, 120, 78, 110, 151, 50, + 178, 241, 41, 200, 57, 197, 90, 114, 131, 106, 109, 175, 156, 26, 143, 140, + 124, 157, 229, 42, 211, 65, 181, 221, 206, 47, 244, 206, 152, 25, 231, 22, + 21, 43, 111, 14, 102, 139, 30, 63, 200, 230, 55, 125, 123, 57, 235, 181, + 75, 227, 14, 200, 219, 68, 197, 150, 178, 210, 128, 109, 3, 150, 28, 177, + 45, 224, 75, 83, 247, 89, 242, 201, 140, 1, 246, 182, 208, 224, 74, 29, + 96, 153, 204, 158, 109, 45, 79, 172, 56, 208, 249, 28, 72, 25, 93, 185, + 50, 5, 206, 11, 86, 15, 144, 203, 118, 219, 154, 27, 29, 59, 15, 89, + 123, 182, 102, 207, 225, 223, 158, 217, 177, 230, 245, 250, 52, 39, 23, 205, + 153, 153, 1, 209, 128, 1, 22, 27, 196, 240, 28, 16, 70, 209, 204, 155, + 64, 115, 73, 37, 165, 108, 35, 157, 238, 116, 50, 249, 89, 223, 105, 169, + 35, 113, 81, 7, 94, 122, 230, 42, 6, 189, 45, 174, 171, 220, 114, 61, + 20, 105, 100, 139, 153, 13, 236, 61, 144, 82, 42, 72, 145, 214, 138, 225, + 206, 36, 35, 59, 240, 143, 7, 250, 113, 114, 60, 240, 104, 76, 252, 83, + 166, 93, 118, 228, 108, 5, 189, 189, 180, 58, 214, 184, 86, 111, 230, 36, + 232, 196, 36, 91, 211, 27, 169, 152, 138, 199, 1, 37, 242, 87, 73, 110, + 236, 193, 119, 176, 193, 228, 150, 229, 207, 49, 11, 41, 37, 115, 120, 196, + 175, 208, 32, 2, 239, 80, 13, 182, 143, 202, 70, 133, 49, 132, 198, 74, + 232, 71, 121, 85, 31, 10, 11, 169, 187, 6, 172, 182, 81, 7, 246, 100, + 168, 248, 106, 114, 99, 109, 55, 226, 78, 220, 106, 228, 215, 61, 126, 57, + 233, 183, 91, 243, 110, 83, 178, 181, 233, 22, 151, 195, 112, 33, 150, 163, + 75, 45, 83, 94, 2, 107, 226, 2, 123, 234, 229, 84, 39, 191, 69, 246, + 171, 152, 44, 238, 61, 37, 177, 209, 59, 241, 157, 186, 153, 129, 132, 56, + 206, 215, 83, 14, 200, 235, 83, 98, 190, 189, 144, 65, 112, 207, 229, 98, + 211, 116, 175, 214, 178, 122, 245, 166, 179, 223, 203, 107, 135, 168, 227, 133, + 190, 37, 41, 250, 194, 74, 16, 52, 59, 230, 165, 82, 2, 72, 38, 160, + 236, 193, 110, 59, 28, 172, 218, 136, 128, 93, 139, 22, 6, 30, 191, 176, + 234, 171, 118, 129, 227, 119, 70, 57, 147, 0, 228, 109, 239, 243, 34, 215, + 101, 22, 236, 162, 7, 168, 191, 183, 175, 114, 68, 43, 148, 109, 179, 203, + 109, 23, 196, 149, 65, 187, 149, 214, 58, 121, 115, 104, 75, 124, 15, 230, + 76, 207, 196, 213, 126, 186, 150, 106, 167, 198, 141, 145, 68, 87, 44, 84, + 60, 105, 153, 168, 219, 111, 91, 171, 174, 93, 31, 185, 114, 217, 154, 105, + 154, 249, 152, 80, 93, 102, 152, 29, 44, 80, 162, 143, 238, 162, 198, 176, + 99, 218, 189, 82, 54, 57, 138, 69, 151, 182, 210, 98, 103, 173, 125, 143, + 5, 50, 85, 200, 48, 115, 217, 107, 244, 50, 189, 70, 85, 224, 6, 253, + 38, 215, 234, 53, 91, 146, 214, 182, 242, 122, 43, 61, 174, 118, 36, 186, + 99, 137, 171, 100, 185, 22, 143, 117, 205, 1, 98, 65, 167, 215, 110, 193, + 202, 5, 12, 174, 105, 190, 177, 164, 222, 200, 214, 166, 181, 204, 104, 199, + 11, 181, 210, 108, 221, 43, 38, 217, 172, 232, 214, 55, 201, 237, 76, 142, + 233, 127, 110, 98, 72, 174, 229, 254, 93, 75, 183, 102, 88, 38, 218, 150, + 208, 34, 44, 150, 158, 199, 242, 125, 6, 239, 72, 53, 173, 229, 180, 223, + 233, 1, 23, 41, 183, 156, 199, 140, 227, 22, 50, 220, 202, 69, 186, 54, + 41, 238, 151, 89, 68, 54, 154, 80, 18, 134, 2, 29, 107, 101, 226, 51, + 96, 182, 115, 22, 114, 163, 165, 228, 60, 6, 92, 115, 171, 147, 169, 185, + 186, 176, 74, 154, 82, 89, 247, 109, 189, 39, 32, 51, 117, 86, 32, 173, + 234, 62, 99, 94, 157, 230, 76, 144, 31, 227, 179, 46, 128, 171, 145, 218, + 230, 26, 233, 120, 179, 147, 25, 179, 163, 124, 98, 228, 21, 147, 77, 220, + 188, 57, 59, 218, 92, 88, 223, 99, 64, 236, 223, 77, 254, 249, 7, 9, + 204, 208, 225, 85, 84, 48, 35, 195, 186, 236, 148, 119, 197, 140, 228, 105, + 246, 200, 18, 229, 244, 48, 155, 159, 119, 211, 189, 82, 117, 63, 219, 62, + 38, 98, 189, 212, 72, 44, 36, 70, 155, 114, 42, 94, 60, 28, 239, 119, + 211, 140, 187, 87, 140, 225, 152, 143, 246, 171, 59, 181, 159, 88, 247, 109, + 206, 91, 160, 1, 86, 27, 48, 241, 10, 149, 27, 101, 83, 52, 146, 67, + 97, 41, 232, 188, 4, 60, 102, 188, 223, 178, 210, 192, 132, 230, 162, 229, + 100, 113, 253, 88, 111, 228, 214, 253, 71, 199, 201, 39, 210, 70, 91, 154, + 180, 83, 92, 162, 92, 87, 157, 236, 118, 84, 75, 198, 244, 116, 188, 58, + 2, 113, 160, 218, 5, 113, 192, 204, 215, 1, 214, 187, 141, 87, 72, 108, + 220, 71, 115, 10, 69, 114, 195, 204, 118, 212, 76, 43, 27, 101, 250, 61, + 124, 39, 185, 216, 253, 183, 41, 214, 185, 129, 218, 164, 75, 40, 86, 121, + 147, 77, 49, 99, 93, 203, 154, 48, 233, 187, 233, 18, 38, 86, 173, 178, + 86, 181, 197, 113, 83, 205, 73, 139, 67, 81, 43, 77, 165, 149, 185, 232, + 103, 196, 181, 218, 121, 220, 235, 12, 72, 84, 253, 174, 127, 8, 138, 130, + 242, 122, 165, 86, 26, 32, 250, 172, 97, 26, 38, 172, 90, 6, 225, 97, + 185, 111, 239, 61, 141, 94, 202, 244, 108, 150, 183, 235, 230, 172, 22, 29, + 216, 146, 211, 225, 6, 149, 218, 94, 21, 139, 245, 153, 149, 27, 171, 70, + 182, 182, 209, 50, 53, 189, 153, 218, 198, 202, 9, 192, 78, 137, 170, 87, + 78, 238, 170, 51, 16, 53, 185, 114, 67, 74, 212, 166, 86, 177, 193, 229, + 91, 32, 113, 14, 186, 153, 146, 213, 227, 231, 94, 95, 72, 179, 32, 113, + 42, 190, 50, 75, 110, 218, 115, 218, 90, 40, 9, 126, 93, 4, 14, 116, + 80, 232, 10, 171, 198, 66, 97, 26, 66, 116, 93, 1, 166, 184, 129, 107, + 162, 22, 92, 30, 144, 151, 110, 25, 149, 40, 120, 114, 222, 179, 230, 161, + 121, 181, 165, 69, 47, 147, 214, 91, 92, 169, 92, 159, 182, 226, 149, 198, + 104, 95, 48, 167, 211, 92, 140, 45, 39, 55, 106, 21, 254, 128, 106, 108, + 74, 169, 56, 72, 211, 227, 81, 63, 91, 83, 199, 185, 93, 211, 121, 52, + 61, 144, 28, 171, 66, 153, 77, 231, 128, 67, 50, 97, 199, 193, 7, 190, + 5, 162, 40, 136, 153, 201, 60, 59, 112, 77, 153, 201, 114, 234, 106, 63, + 225, 163, 64, 134, 11, 198, 6, 48, 238, 116, 54, 167, 241, 188, 171, 99, + 229, 31, 43, 147, 238, 42, 63, 22, 219, 169, 209, 12, 40, 164, 179, 85, + 12, 103, 204, 235, 66, 126, 221, 111, 47, 231, 90, 166, 55, 237, 218, 105, + 144, 83, 64, 158, 26, 142, 75, 246, 168, 248, 29, 107, 132, 220, 250, 255, + 219, 228, 106, 119, 78, 174, 200, 149, 223, 120, 51, 150, 89, 3, 31, 46, + 71, 153, 198, 86, 89, 173, 29, 169, 156, 53, 64, 58, 108, 178, 186, 240, + 184, 85, 43, 32, 8, 226, 166, 161, 221, 185, 92, 30, 17, 109, 73, 142, + 207, 143, 187, 241, 40, 153, 97, 158, 216, 183, 180, 154, 205, 109, 174, 186, + 87, 229, 82, 35, 181, 124, 172, 55, 199, 217, 177, 7, 152, 5, 246, 81, + 45, 85, 5, 192, 214, 82, 227, 98, 19, 48, 76, 59, 189, 213, 187, 176, + 49, 65, 232, 243, 250, 153, 173, 167, 103, 227, 27, 248, 35, 207, 253, 204, + 120, 166, 17, 155, 156, 248, 168, 147, 222, 118, 219, 233, 90, 135, 85, 215, + 129, 37, 131, 209, 48, 143, 183, 70, 200, 58, 83, 138, 59, 15, 246, 161, + 94, 73, 108, 10, 116, 116, 165, 44, 196, 165, 210, 102, 61, 55, 179, 118, + 23, 59, 144, 160, 0, 80, 143, 143, 99, 71, 226, 117, 123, 110, 182, 97, + 163, 3, 71, 196, 63, 154, 93, 3, 38, 35, 78, 15, 179, 115, 113, 208, + 41, 109, 251, 60, 71, 206, 151, 186, 118, 220, 0, 225, 178, 211, 106, 149, + 106, 13, 150, 43, 212, 83, 189, 116, 149, 141, 209, 149, 228, 76, 4, 161, + 122, 91, 216, 137, 238, 99, 93, 183, 16, 107, 194, 78, 240, 100, 163, 99, + 10, 203, 117, 55, 208, 156, 166, 55, 46, 244, 193, 53, 88, 216, 23, 222, + 98, 97, 88, 51, 57, 97, 56, 249, 69, 151, 176, 73, 93, 218, 215, 46, + 229, 140, 204, 184, 91, 79, 142, 196, 199, 248, 168, 155, 137, 141, 178, 32, + 248, 56, 18, 61, 236, 108, 85, 224, 25, 161, 202, 177, 56, 64, 165, 96, + 22, 229, 239, 56, 193, 85, 154, 109, 205, 122, 54, 42, 5, 211, 163, 14, + 199, 233, 109, 14, 4, 96, 174, 215, 108, 114, 249, 106, 131, 69, 13, 252, + 60, 87, 99, 123, 233, 90, 76, 169, 204, 138, 223, 97, 199, 124, 112, 23, + 241, 183, 241, 140, 112, 142, 103, 136, 81, 227, 4, 38, 107, 12, 4, 118, + 34, 209, 48, 77, 176, 231, 167, 189, 120, 173, 89, 106, 238, 138, 133, 246, + 110, 192, 100, 55, 137, 42, 48, 133, 57, 169, 2, 242, 104, 17, 4, 221, + 197, 66, 222, 205, 137, 193, 99, 158, 221, 24, 195, 133, 103, 84, 65, 112, + 180, 204, 125, 119, 88, 225, 59, 67, 175, 12, 194, 158, 36, 173, 247, 150, + 166, 12, 87, 21, 103, 194, 42, 69, 114, 107, 19, 68, 33, 101, 71, 146, + 240, 190, 82, 87, 139, 117, 240, 119, 189, 223, 50, 131, 64, 152, 234, 236, + 25, 5, 24, 151, 52, 54, 49, 158, 107, 252, 100, 46, 19, 107, 210, 105, + 63, 3, 130, 221, 180, 1, 93, 46, 104, 192, 83, 26, 128, 102, 252, 171, + 122, 42, 158, 177, 49, 104, 106, 52, 45, 37, 54, 59, 224, 37, 229, 252, + 164, 75, 195, 102, 153, 151, 235, 77, 174, 208, 40, 78, 0, 45, 58, 133, + 125, 66, 36, 102, 170, 174, 182, 93, 105, 252, 126, 174, 228, 167, 59, 163, + 100, 175, 141, 217, 162, 233, 114, 188, 162, 175, 236, 74, 101, 84, 47, 58, + 123, 107, 39, 234, 171, 74, 121, 132, 70, 244, 206, 94, 165, 151, 149, 20, + 187, 236, 231, 133, 186, 190, 169, 36, 186, 243, 156, 76, 179, 43, 55, 51, + 233, 171, 139, 34, 143, 220, 20, 244, 187, 79, 203, 58, 143, 167, 90, 243, + 17, 63, 208, 221, 105, 189, 86, 116, 162, 149, 161, 16, 29, 246, 129, 195, + 7, 230, 202, 173, 11, 203, 126, 151, 45, 237, 59, 77, 142, 171, 1, 247, + 173, 183, 211, 70, 205, 234, 201, 85, 59, 175, 195, 238, 26, 53, 179, 52, + 224, 77, 144, 248, 228, 242, 192, 133, 66, 139, 216, 232, 145, 95, 102, 7, + 117, 171, 154, 3, 6, 108, 102, 100, 106, 155, 92, 204, 77, 175, 250, 220, + 247, 40, 46, 137, 47, 145, 159, 163, 4, 41, 55, 82, 190, 225, 107, 180, + 81, 231, 150, 157, 6, 72, 37, 187, 210, 36, 133, 182, 99, 104, 249, 186, + 93, 226, 53, 93, 97, 176, 209, 99, 213, 56, 98, 3, 67, 240, 148, 242, + 126, 217, 79, 196, 18, 59, 165, 152, 222, 53, 166, 240, 106, 162, 237, 142, + 178, 82, 198, 178, 1, 195, 52, 132, 137, 76, 15, 29, 133, 38, 22, 192, + 117, 216, 85, 181, 76, 141, 109, 224, 149, 226, 233, 92, 238, 77, 37, 186, + 217, 178, 172, 190, 111, 56, 156, 146, 135, 101, 219, 29, 136, 180, 49, 43, + 181, 133, 190, 87, 233, 76, 88, 169, 96, 1, 67, 139, 130, 107, 195, 243, + 13, 44, 25, 144, 60, 82, 133, 68, 108, 150, 79, 136, 171, 156, 57, 179, + 0, 5, 128, 168, 169, 175, 115, 59, 111, 54, 127, 76, 44, 230, 139, 204, + 122, 158, 25, 155, 192, 158, 187, 253, 50, 144, 33, 163, 3, 28, 89, 85, + 203, 214, 154, 253, 44, 218, 126, 244, 218, 13, 39, 93, 171, 3, 10, 105, + 116, 74, 141, 186, 48, 232, 52, 132, 70, 111, 164, 246, 141, 62, 89, 223, + 133, 52, 45, 245, 214, 188, 237, 54, 150, 188, 178, 95, 138, 114, 37, 89, + 235, 170, 192, 125, 39, 183, 28, 237, 237, 123, 58, 173, 195, 34, 70, 139, + 222, 5, 39, 239, 7, 43, 193, 157, 71, 165, 168, 18, 141, 163, 129, 110, + 71, 145, 21, 188, 24, 45, 195, 22, 200, 174, 25, 44, 230, 70, 163, 76, + 61, 101, 39, 221, 116, 169, 221, 108, 21, 179, 113, 177, 30, 159, 245, 51, + 121, 187, 111, 91, 22, 80, 240, 181, 86, 222, 47, 164, 85, 118, 9, 136, + 189, 11, 156, 94, 45, 222, 232, 214, 120, 187, 199, 247, 29, 105, 172, 183, + 45, 169, 135, 215, 173, 219, 37, 156, 149, 108, 139, 141, 14, 107, 69, 187, + 209, 155, 242, 221, 168, 118, 50, 40, 94, 119, 180, 104, 205, 67, 233, 133, + 214, 153, 161, 193, 84, 117, 144, 106, 56, 90, 93, 214, 125, 35, 22, 87, + 146, 21, 189, 87, 154, 86, 90, 35, 30, 146, 135, 21, 193, 86, 134, 94, + 165, 90, 92, 1, 239, 6, 232, 64, 164, 23, 246, 76, 107, 39, 39, 73, + 117, 210, 205, 140, 147, 74, 182, 181, 213, 133, 100, 130, 31, 47, 171, 137, + 216, 166, 88, 44, 78, 114, 139, 146, 217, 93, 85, 204, 148, 20, 236, 183, + 189, 191, 223, 212, 209, 10, 200, 244, 26, 246, 28, 96, 84, 126, 185, 144, + 183, 51, 205, 150, 0, 109, 68, 103, 32, 64, 204, 21, 122, 61, 115, 26, + 249, 13, 219, 171, 187, 185, 226, 176, 216, 46, 164, 103, 137, 129, 190, 227, + 179, 253, 53, 175, 196, 202, 82, 220, 168, 55, 209, 208, 89, 80, 230, 123, + 69, 205, 78, 230, 104, 74, 219, 113, 24, 117, 88, 22, 178, 10, 67, 203, + 171, 81, 207, 158, 143, 251, 252, 114, 164, 172, 64, 122, 165, 55, 64, 113, + 166, 141, 108, 94, 110, 38, 114, 178, 44, 186, 133, 71, 123, 189, 176, 185, + 117, 191, 172, 164, 249, 253, 106, 94, 36, 10, 179, 94, 217, 233, 104, 203, + 12, 218, 94, 211, 221, 98, 167, 66, 148, 103, 61, 143, 54, 96, 51, 175, + 132, 2, 158, 107, 243, 167, 115, 237, 77, 54, 222, 29, 109, 98, 233, 214, + 14, 10, 218, 59, 169, 190, 108, 187, 214, 34, 58, 88, 178, 153, 90, 108, + 52, 40, 11, 169, 199, 76, 37, 27, 179, 99, 131, 236, 186, 87, 103, 151, + 133, 106, 177, 88, 89, 196, 19, 213, 88, 81, 42, 102, 183, 179, 69, 42, + 95, 151, 162, 182, 180, 210, 70, 241, 204, 124, 217, 221, 148, 10, 102, 125, + 18, 75, 142, 114, 122, 39, 185, 85, 153, 28, 16, 40, 59, 215, 104, 238, + 129, 243, 172, 218, 27, 0, 117, 116, 197, 3, 15, 151, 183, 246, 105, 115, + 11, 146, 165, 59, 216, 46, 88, 37, 186, 69, 99, 142, 125, 115, 213, 92, + 118, 250, 81, 73, 82, 99, 213, 88, 107, 148, 95, 75, 231, 214, 185, 129, + 235, 160, 191, 109, 124, 198, 159, 27, 56, 198, 136, 52, 172, 14, 247, 243, + 169, 138, 10, 60, 89, 28, 210, 12, 224, 153, 21, 26, 168, 139, 0, 173, + 133, 69, 110, 164, 128, 100, 92, 1, 210, 222, 40, 163, 34, 81, 214, 135, + 251, 46, 91, 71, 67, 119, 86, 245, 178, 204, 80, 152, 224, 161, 191, 210, + 93, 219, 66, 65, 154, 178, 125, 14, 192, 135, 178, 169, 106, 183, 10, 105, + 147, 239, 150, 248, 97, 123, 95, 6, 233, 153, 101, 60, 133, 22, 230, 178, + 61, 6, 146, 190, 152, 45, 100, 60, 200, 102, 87, 251, 34, 83, 218, 79, + 183, 149, 70, 83, 206, 153, 226, 180, 152, 220, 176, 101, 192, 173, 92, 212, + 169, 193, 30, 213, 88, 96, 27, 120, 96, 133, 184, 210, 178, 1, 44, 44, + 200, 145, 92, 135, 86, 87, 78, 146, 143, 234, 32, 170, 115, 210, 160, 194, + 172, 148, 218, 26, 232, 211, 70, 30, 50, 125, 118, 215, 6, 137, 116, 44, + 116, 87, 194, 218, 137, 46, 0, 107, 47, 182, 253, 117, 39, 39, 109, 115, + 34, 8, 167, 189, 162, 189, 140, 101, 61, 237, 17, 237, 198, 100, 111, 241, + 232, 197, 51, 181, 124, 195, 2, 209, 19, 152, 82, 221, 206, 39, 240, 142, + 94, 43, 3, 226, 112, 102, 12, 152, 57, 17, 91, 131, 112, 179, 148, 128, + 51, 132, 85, 13, 2, 219, 100, 164, 240, 3, 95, 9, 208, 150, 22, 93, + 123, 11, 204, 18, 141, 215, 180, 173, 133, 150, 89, 161, 6, 12, 70, 197, + 60, 18, 251, 153, 178, 189, 231, 38, 242, 162, 65, 3, 202, 228, 45, 79, + 147, 109, 207, 221, 77, 189, 130, 234, 36, 118, 163, 213, 22, 216, 79, 24, + 114, 117, 90, 134, 70, 182, 234, 186, 207, 170, 66, 137, 211, 59, 189, 93, + 188, 55, 74, 149, 0, 203, 114, 128, 123, 129, 241, 74, 101, 98, 117, 175, + 235, 229, 170, 128, 113, 99, 155, 210, 94, 23, 240, 188, 169, 212, 104, 110, + 139, 213, 190, 214, 227, 199, 163, 217, 163, 154, 93, 166, 75, 32, 226, 123, + 13, 237, 145, 215, 0, 186, 143, 222, 184, 80, 237, 77, 208, 6, 105, 26, + 51, 210, 244, 92, 251, 30, 65, 49, 240, 73, 245, 147, 40, 75, 18, 165, + 156, 237, 146, 157, 166, 103, 44, 23, 235, 198, 153, 184, 176, 232, 110, 54, + 90, 178, 159, 208, 82, 25, 89, 171, 139, 13, 161, 152, 18, 23, 121, 119, + 212, 154, 39, 204, 66, 115, 49, 179, 82, 163, 110, 63, 87, 53, 221, 156, + 110, 68, 167, 213, 194, 212, 233, 244, 123, 245, 185, 213, 214, 50, 197, 186, + 102, 52, 187, 237, 38, 11, 168, 172, 154, 100, 59, 253, 116, 65, 211, 60, + 211, 46, 86, 23, 118, 179, 108, 238, 226, 89, 115, 87, 54, 236, 81, 175, + 55, 156, 23, 23, 150, 146, 218, 48, 107, 81, 88, 47, 203, 107, 154, 97, + 170, 37, 70, 218, 237, 13, 53, 138, 90, 238, 158, 164, 210, 116, 118, 95, + 172, 230, 39, 213, 188, 211, 49, 247, 246, 116, 153, 21, 71, 227, 124, 189, + 90, 146, 235, 163, 254, 162, 204, 244, 71, 217, 209, 208, 25, 110, 140, 73, + 119, 147, 81, 213, 1, 55, 94, 44, 7, 230, 58, 181, 169, 183, 122, 92, + 83, 102, 43, 85, 167, 158, 52, 205, 229, 154, 75, 185, 2, 87, 147, 18, + 3, 105, 223, 158, 218, 218, 188, 225, 204, 166, 209, 158, 251, 216, 177, 107, + 165, 193, 50, 199, 155, 195, 188, 102, 245, 141, 105, 210, 44, 151, 70, 76, + 125, 185, 159, 136, 205, 124, 174, 82, 106, 217, 137, 108, 185, 172, 79, 219, + 117, 105, 212, 175, 105, 237, 186, 224, 173, 22, 206, 88, 175, 167, 107, 143, + 90, 170, 173, 45, 74, 187, 124, 173, 61, 92, 39, 86, 169, 146, 48, 92, + 36, 226, 45, 243, 49, 154, 172, 36, 99, 12, 7, 236, 196, 120, 53, 203, + 206, 251, 89, 134, 201, 52, 146, 9, 58, 81, 50, 188, 42, 160, 237, 222, + 40, 30, 175, 239, 167, 203, 204, 170, 183, 223, 244, 6, 177, 89, 49, 9, + 146, 255, 160, 109, 237, 11, 243, 226, 218, 154, 238, 23, 139, 94, 50, 63, + 22, 86, 198, 104, 93, 73, 37, 170, 115, 161, 97, 216, 232, 223, 69, 217, + 102, 162, 230, 10, 152, 179, 125, 89, 43, 78, 182, 211, 66, 102, 198, 60, + 58, 166, 181, 206, 27, 217, 234, 184, 24, 231, 212, 244, 116, 101, 39, 246, + 173, 88, 89, 217, 86, 167, 179, 245, 162, 174, 154, 37, 166, 210, 114, 53, + 171, 91, 111, 215, 214, 5, 122, 88, 171, 53, 214, 28, 171, 47, 118, 214, + 54, 99, 69, 221, 12, 179, 48, 184, 116, 41, 195, 39, 92, 177, 202, 204, + 152, 217, 220, 118, 115, 229, 233, 118, 50, 45, 247, 173, 126, 107, 144, 222, + 212, 105, 35, 21, 223, 103, 114, 227, 241, 100, 83, 44, 240, 213, 186, 87, + 77, 174, 231, 214, 120, 92, 112, 231, 141, 71, 135, 75, 239, 219, 243, 113, + 110, 159, 92, 56, 233, 209, 156, 227, 82, 123, 103, 51, 31, 182, 7, 172, + 162, 173, 183, 169, 9, 144, 54, 45, 199, 51, 90, 118, 40, 85, 42, 202, + 200, 228, 134, 125, 186, 83, 143, 13, 246, 113, 71, 31, 110, 244, 137, 85, + 44, 231, 122, 133, 238, 176, 170, 70, 171, 219, 193, 102, 3, 242, 228, 62, + 51, 75, 187, 201, 40, 189, 239, 106, 149, 212, 154, 217, 103, 216, 109, 123, + 191, 85, 7, 131, 138, 144, 201, 143, 235, 209, 12, 16, 237, 152, 81, 55, + 10, 83, 189, 51, 223, 245, 156, 236, 108, 50, 230, 211, 221, 26, 219, 221, + 143, 93, 213, 172, 206, 54, 131, 188, 189, 174, 44, 138, 218, 98, 39, 149, + 219, 171, 38, 223, 85, 246, 198, 172, 86, 96, 39, 174, 51, 20, 84, 118, + 81, 111, 12, 178, 253, 104, 67, 227, 23, 11, 64, 30, 108, 159, 206, 88, + 192, 18, 174, 55, 226, 206, 117, 153, 189, 11, 2, 80, 119, 210, 29, 76, + 162, 227, 124, 123, 203, 196, 244, 248, 32, 147, 232, 233, 221, 226, 166, 87, + 140, 199, 122, 226, 168, 146, 17, 119, 116, 134, 181, 167, 187, 212, 66, 27, + 118, 198, 153, 76, 53, 31, 29, 41, 0, 137, 212, 90, 202, 138, 102, 58, + 177, 31, 36, 27, 227, 212, 96, 208, 230, 231, 206, 194, 157, 42, 179, 82, + 58, 163, 180, 116, 43, 213, 231, 197, 97, 122, 196, 213, 165, 109, 125, 92, + 216, 153, 195, 161, 177, 105, 56, 21, 45, 61, 203, 231, 43, 99, 177, 4, + 84, 101, 201, 196, 140, 137, 61, 154, 235, 97, 138, 18, 114, 61, 247, 147, + 252, 84, 17, 179, 121, 152, 101, 97, 43, 245, 87, 43, 213, 154, 205, 11, + 43, 105, 200, 90, 94, 75, 178, 179, 83, 165, 189, 5, 52, 59, 117, 115, + 165, 113, 219, 26, 59, 150, 38, 155, 179, 165, 13, 194, 246, 180, 150, 93, + 42, 125, 105, 214, 180, 74, 181, 230, 60, 209, 160, 53, 167, 164, 42, 139, + 71, 113, 178, 95, 26, 139, 229, 94, 100, 54, 131, 73, 171, 54, 236, 148, + 118, 220, 252, 81, 85, 217, 230, 160, 105, 230, 233, 142, 41, 241, 173, 93, + 51, 223, 232, 204, 235, 149, 17, 231, 120, 146, 210, 90, 2, 93, 154, 20, + 50, 13, 35, 59, 151, 250, 233, 54, 191, 158, 173, 93, 87, 88, 164, 91, + 195, 118, 171, 86, 152, 70, 203, 125, 73, 104, 216, 227, 98, 91, 45, 55, + 216, 249, 210, 42, 149, 155, 105, 62, 25, 171, 199, 22, 57, 115, 51, 125, + 140, 197, 42, 219, 192, 122, 113, 167, 103, 233, 104, 197, 237, 109, 164, 85, + 91, 225, 70, 244, 42, 63, 119, 170, 156, 213, 174, 78, 107, 197, 76, 155, + 201, 206, 5, 173, 132, 39, 30, 220, 166, 25, 155, 212, 24, 161, 129, 38, + 76, 243, 65, 219, 75, 238, 211, 59, 224, 102, 4, 71, 96, 86, 229, 108, + 70, 4, 185, 135, 159, 185, 147, 204, 112, 106, 53, 74, 108, 50, 181, 89, + 244, 123, 188, 220, 47, 15, 243, 182, 204, 208, 197, 220, 72, 21, 150, 252, + 176, 183, 224, 52, 27, 216, 85, 57, 99, 46, 114, 213, 21, 59, 154, 241, + 37, 171, 217, 26, 105, 0, 160, 246, 220, 236, 175, 154, 61, 186, 57, 55, + 135, 11, 185, 29, 31, 58, 220, 214, 112, 235, 195, 169, 228, 240, 81, 16, + 153, 150, 201, 184, 160, 171, 229, 242, 110, 182, 153, 21, 88, 111, 48, 174, + 77, 151, 219, 166, 21, 119, 23, 221, 246, 86, 24, 86, 250, 250, 126, 83, + 236, 37, 141, 202, 35, 187, 219, 12, 150, 122, 219, 88, 79, 166, 53, 39, + 189, 49, 186, 59, 33, 169, 243, 209, 76, 67, 177, 117, 55, 55, 140, 58, + 131, 76, 155, 118, 183, 69, 182, 56, 208, 152, 216, 72, 111, 15, 226, 173, + 236, 170, 182, 152, 79, 105, 160, 167, 29, 161, 148, 238, 182, 123, 170, 241, + 152, 152, 121, 137, 216, 48, 185, 213, 179, 101, 41, 105, 75, 116, 199, 238, + 85, 162, 188, 164, 78, 30, 235, 70, 51, 159, 210, 227, 27, 103, 25, 237, + 101, 203, 75, 73, 175, 148, 119, 246, 144, 43, 205, 235, 142, 190, 6, 97, + 115, 52, 5, 6, 126, 53, 161, 211, 146, 54, 176, 86, 101, 59, 167, 143, + 135, 214, 102, 184, 27, 47, 250, 158, 213, 23, 10, 121, 171, 106, 211, 125, + 211, 179, 75, 249, 250, 180, 28, 159, 204, 56, 163, 154, 45, 139, 149, 104, + 129, 153, 79, 204, 86, 3, 246, 224, 132, 49, 54, 157, 6, 63, 154, 153, + 149, 204, 182, 84, 162, 247, 195, 212, 60, 218, 152, 155, 5, 189, 25, 181, + 122, 179, 93, 101, 221, 203, 44, 76, 16, 23, 232, 249, 180, 55, 220, 243, + 81, 15, 248, 183, 109, 222, 53, 203, 220, 58, 198, 172, 122, 180, 238, 140, + 123, 61, 69, 27, 206, 170, 147, 98, 133, 221, 153, 51, 19, 85, 247, 133, + 196, 6, 47, 9, 204, 30, 19, 163, 81, 225, 81, 216, 163, 242, 191, 63, + 19, 22, 28, 90, 201, 14, 202, 78, 111, 38, 200, 210, 210, 142, 118, 87, + 237, 125, 109, 205, 185, 181, 252, 16, 239, 41, 131, 76, 209, 211, 57, 78, + 210, 59, 18, 111, 56, 121, 117, 144, 29, 111, 134, 138, 161, 120, 50, 83, + 81, 56, 137, 89, 39, 203, 203, 234, 50, 27, 165, 5, 109, 237, 56, 81, + 123, 220, 170, 236, 209, 31, 76, 33, 37, 115, 53, 198, 30, 10, 99, 121, + 84, 236, 50, 177, 93, 113, 159, 216, 122, 202, 120, 187, 91, 209, 49, 61, + 198, 107, 221, 166, 181, 57, 227, 0, 137, 119, 200, 159, 178, 83, 217, 50, + 241, 40, 183, 87, 24, 70, 136, 170, 120, 209, 109, 139, 39, 153, 240, 188, + 118, 26, 116, 116, 237, 238, 152, 74, 67, 84, 43, 81, 193, 16, 74, 209, + 65, 199, 218, 14, 157, 94, 70, 143, 213, 89, 6, 24, 167, 233, 124, 223, + 4, 174, 108, 152, 223, 11, 228, 136, 36, 217, 203, 117, 58, 61, 213, 43, + 24, 81, 111, 216, 99, 50, 185, 88, 119, 16, 7, 26, 48, 220, 179, 219, + 149, 21, 205, 72, 131, 226, 88, 93, 13, 59, 81, 122, 168, 0, 80, 24, + 134, 225, 96, 252, 110, 79, 209, 59, 27, 177, 49, 20, 246, 52, 51, 100, + 4, 232, 134, 171, 26, 217, 168, 50, 236, 56, 52, 131, 70, 182, 48, 3, + 67, 166, 180, 91, 228, 218, 99, 169, 218, 238, 153, 173, 116, 92, 240, 68, + 126, 238, 206, 23, 250, 52, 41, 8, 201, 21, 61, 176, 231, 37, 115, 174, + 215, 98, 219, 134, 10, 67, 129, 170, 247, 178, 81, 89, 117, 106, 180, 214, + 30, 239, 39, 139, 122, 139, 25, 172, 249, 249, 162, 202, 117, 103, 124, 101, + 58, 162, 141, 97, 150, 91, 119, 155, 241, 173, 245, 88, 124, 76, 196, 213, + 232, 218, 89, 210, 70, 150, 151, 215, 76, 158, 110, 48, 82, 117, 105, 55, + 202, 99, 207, 77, 236, 31, 235, 179, 217, 99, 124, 226, 38, 87, 133, 153, + 136, 230, 213, 149, 201, 190, 43, 68, 217, 222, 34, 213, 235, 163, 75, 4, + 94, 50, 226, 188, 99, 36, 71, 118, 107, 55, 16, 42, 209, 213, 30, 216, + 41, 89, 238, 10, 163, 30, 191, 126, 164, 93, 183, 102, 103, 24, 158, 89, + 59, 22, 59, 80, 180, 77, 73, 239, 119, 213, 149, 187, 226, 11, 180, 188, + 222, 207, 20, 126, 25, 29, 52, 90, 82, 172, 41, 218, 61, 139, 174, 48, + 227, 77, 183, 153, 204, 108, 123, 69, 45, 49, 206, 37, 178, 177, 77, 179, + 156, 100, 24, 186, 145, 226, 167, 142, 213, 28, 246, 170, 125, 152, 156, 42, + 211, 137, 3, 4, 183, 81, 163, 172, 112, 170, 60, 228, 147, 180, 176, 222, + 111, 233, 10, 23, 139, 39, 215, 12, 51, 22, 117, 33, 7, 192, 28, 236, + 107, 205, 116, 174, 96, 110, 138, 235, 60, 111, 141, 251, 181, 193, 12, 48, + 75, 212, 213, 249, 82, 180, 223, 105, 89, 70, 219, 218, 118, 135, 138, 98, + 225, 33, 191, 139, 55, 67, 26, 182, 188, 42, 120, 82, 121, 60, 98, 246, + 158, 50, 151, 140, 140, 61, 117, 18, 253, 206, 172, 18, 109, 24, 197, 206, + 118, 191, 114, 19, 234, 122, 95, 148, 98, 155, 138, 186, 89, 187, 180, 96, + 203, 229, 210, 170, 151, 89, 141, 221, 71, 125, 30, 27, 49, 105, 117, 245, + 248, 88, 21, 122, 169, 186, 152, 241, 86, 147, 45, 195, 56, 227, 213, 64, + 40, 216, 124, 169, 216, 125, 76, 149, 82, 163, 142, 148, 5, 145, 99, 175, + 70, 151, 206, 160, 92, 207, 26, 181, 117, 95, 22, 87, 123, 149, 161, 179, + 219, 62, 19, 75, 230, 91, 45, 225, 236, 160, 56, 112, 132, 250, 83, 214, + 60, 71, 236, 109, 50, 165, 170, 170, 155, 131, 85, 89, 104, 15, 69, 173, + 134, 40, 38, 49, 174, 137, 213, 84, 106, 149, 78, 237, 82, 35, 155, 171, + 234, 49, 239, 145, 153, 86, 226, 122, 41, 93, 41, 140, 76, 43, 5, 82, + 110, 170, 178, 115, 82, 177, 88, 140, 147, 91, 81, 54, 118, 126, 107, 242, + 232, 163, 245, 39, 117, 115, 95, 36, 68, 52, 149, 174, 238, 6, 35, 171, + 244, 72, 211, 128, 113, 92, 193, 238, 175, 215, 12, 76, 49, 108, 217, 30, + 87, 47, 247, 211, 44, 231, 237, 114, 204, 126, 9, 40, 187, 232, 84, 31, + 27, 166, 181, 180, 21, 201, 148, 100, 167, 223, 103, 20, 122, 44, 38, 134, + 5, 144, 228, 120, 101, 62, 213, 173, 210, 120, 228, 210, 131, 97, 51, 110, + 54, 135, 229, 230, 28, 1, 32, 76, 164, 196, 206, 141, 50, 81, 97, 80, + 84, 150, 157, 189, 177, 153, 53, 54, 75, 174, 216, 235, 183, 244, 205, 184, + 248, 104, 203, 189, 149, 189, 87, 76, 244, 110, 178, 41, 90, 149, 40, 58, + 106, 24, 150, 148, 71, 229, 113, 146, 141, 9, 205, 109, 107, 156, 31, 117, + 51, 201, 233, 116, 169, 73, 76, 119, 93, 153, 229, 19, 123, 125, 176, 94, + 231, 154, 141, 90, 14, 184, 129, 42, 87, 40, 240, 166, 206, 187, 138, 100, + 171, 162, 145, 73, 70, 215, 37, 89, 83, 18, 227, 74, 2, 75, 47, 70, + 236, 72, 76, 152, 211, 78, 41, 167, 89, 142, 50, 201, 183, 149, 198, 132, + 70, 177, 114, 32, 228, 149, 133, 155, 26, 85, 244, 125, 171, 150, 94, 196, + 166, 142, 178, 139, 119, 185, 248, 174, 110, 172, 88, 169, 177, 44, 11, 142, + 27, 149, 0, 18, 125, 150, 94, 103, 75, 50, 171, 167, 242, 209, 206, 98, + 87, 89, 246, 186, 211, 152, 228, 194, 154, 142, 162, 128, 88, 221, 142, 58, + 209, 65, 127, 186, 21, 44, 77, 75, 173, 54, 51, 203, 138, 202, 76, 172, + 149, 46, 110, 134, 93, 195, 17, 211, 243, 84, 66, 214, 59, 251, 62, 107, + 58, 165, 90, 119, 26, 143, 58, 80, 73, 126, 82, 94, 137, 197, 230, 160, + 48, 219, 9, 169, 120, 175, 96, 79, 7, 109, 133, 17, 71, 94, 47, 111, + 42, 186, 190, 30, 246, 213, 45, 3, 130, 179, 172, 14, 132, 126, 94, 108, + 218, 165, 248, 58, 79, 47, 39, 147, 122, 199, 42, 104, 165, 62, 183, 165, + 55, 106, 45, 109, 139, 81, 125, 56, 236, 14, 178, 133, 205, 44, 167, 141, + 87, 98, 205, 110, 117, 0, 210, 125, 134, 143, 155, 162, 74, 87, 197, 2, + 12, 128, 223, 27, 92, 191, 34, 47, 182, 185, 164, 80, 228, 154, 205, 30, + 87, 105, 197, 218, 66, 39, 58, 99, 230, 140, 145, 204, 89, 66, 99, 212, + 155, 198, 178, 173, 169, 44, 109, 75, 75, 81, 246, 236, 104, 90, 119, 226, + 141, 217, 44, 193, 100, 19, 82, 126, 44, 205, 141, 204, 138, 73, 166, 214, + 195, 193, 176, 226, 70, 21, 186, 90, 91, 141, 68, 122, 162, 53, 183, 153, + 68, 189, 177, 235, 40, 28, 205, 24, 125, 142, 222, 1, 134, 157, 85, 226, + 121, 118, 164, 114, 181, 158, 205, 165, 146, 38, 51, 88, 50, 189, 88, 156, + 3, 57, 113, 231, 74, 243, 82, 51, 166, 237, 162, 136, 123, 99, 243, 10, + 208, 200, 199, 216, 114, 163, 142, 236, 66, 93, 141, 39, 245, 117, 133, 97, + 69, 192, 112, 173, 222, 180, 166, 216, 218, 34, 231, 229, 99, 185, 98, 50, + 189, 31, 165, 50, 235, 108, 65, 158, 101, 27, 93, 46, 105, 44, 19, 131, + 22, 108, 101, 187, 104, 108, 186, 111, 110, 19, 219, 15, 43, 243, 51, 110, + 228, 20, 27, 62, 191, 201, 21, 202, 165, 66, 38, 218, 243, 42, 130, 55, + 65, 37, 162, 35, 136, 81, 216, 42, 149, 93, 44, 53, 218, 174, 148, 158, + 164, 101, 203, 133, 89, 167, 48, 24, 171, 162, 103, 15, 25, 30, 4, 121, + 122, 232, 180, 152, 222, 218, 78, 123, 45, 133, 227, 25, 90, 111, 68, 151, + 64, 15, 171, 201, 86, 188, 84, 137, 210, 128, 121, 229, 197, 128, 119, 231, + 19, 205, 54, 4, 39, 51, 79, 247, 74, 182, 187, 244, 68, 73, 156, 72, + 178, 98, 172, 96, 83, 240, 131, 105, 50, 67, 247, 43, 176, 2, 170, 118, + 220, 181, 20, 185, 240, 184, 211, 251, 143, 51, 62, 105, 167, 231, 114, 183, + 29, 101, 37, 221, 80, 118, 13, 236, 147, 34, 109, 12, 232, 223, 174, 207, + 166, 187, 125, 217, 216, 186, 144, 21, 254, 26, 169, 93, 177, 145, 74, 22, + 31, 51, 124, 167, 189, 236, 114, 6, 93, 217, 38, 118, 6, 95, 104, 47, + 220, 66, 85, 217, 21, 163, 70, 85, 202, 12, 198, 221, 120, 162, 209, 28, + 244, 171, 158, 144, 171, 76, 18, 156, 167, 244, 120, 122, 80, 28, 150, 27, + 187, 232, 202, 217, 175, 216, 46, 211, 86, 21, 111, 161, 199, 99, 209, 78, + 125, 203, 10, 78, 52, 169, 39, 218, 94, 185, 211, 223, 51, 76, 73, 16, + 214, 187, 164, 16, 211, 51, 120, 102, 59, 236, 44, 97, 230, 59, 173, 117, + 183, 91, 157, 228, 20, 23, 113, 138, 170, 174, 246, 153, 177, 86, 118, 243, + 251, 222, 148, 206, 47, 221, 199, 212, 228, 113, 209, 154, 101, 122, 147, 14, + 183, 79, 111, 5, 169, 108, 110, 53, 150, 54, 4, 101, 46, 106, 165, 114, + 61, 211, 226, 91, 70, 211, 162, 123, 107, 87, 123, 92, 23, 204, 166, 251, + 248, 184, 152, 244, 226, 137, 106, 135, 75, 209, 218, 146, 119, 28, 147, 203, + 41, 92, 157, 30, 242, 28, 240, 251, 53, 198, 1, 206, 97, 182, 41, 238, + 115, 59, 143, 137, 205, 219, 202, 90, 174, 201, 29, 219, 154, 180, 42, 118, + 161, 180, 224, 233, 78, 131, 222, 107, 203, 246, 36, 49, 95, 53, 170, 147, + 157, 55, 108, 87, 83, 124, 185, 170, 246, 1, 183, 141, 120, 79, 217, 113, + 3, 85, 171, 71, 27, 48, 38, 103, 175, 168, 158, 19, 45, 239, 141, 114, + 191, 229, 73, 11, 153, 221, 108, 151, 165, 4, 11, 112, 155, 101, 58, 182, + 60, 17, 28, 5, 132, 59, 102, 229, 46, 199, 170, 58, 138, 51, 18, 163, + 50, 19, 155, 111, 113, 133, 252, 210, 232, 244, 102, 3, 177, 28, 171, 59, + 173, 97, 163, 216, 46, 204, 233, 40, 227, 100, 93, 133, 78, 228, 43, 180, + 58, 20, 38, 203, 125, 69, 42, 169, 194, 26, 8, 94, 57, 209, 73, 237, + 150, 74, 137, 53, 119, 206, 172, 221, 95, 142, 5, 165, 188, 91, 246, 36, + 88, 31, 238, 118, 7, 155, 62, 174, 180, 189, 78, 35, 35, 46, 27, 27, + 155, 109, 206, 219, 157, 234, 122, 200, 216, 243, 105, 171, 219, 205, 208, 37, + 47, 177, 73, 75, 122, 181, 155, 41, 77, 187, 241, 76, 179, 201, 1, 193, + 73, 15, 91, 203, 170, 153, 223, 151, 185, 238, 178, 226, 154, 83, 93, 216, + 175, 108, 111, 95, 85, 132, 229, 178, 213, 17, 227, 157, 137, 212, 206, 78, + 208, 242, 203, 171, 110, 203, 13, 153, 113, 1, 217, 113, 130, 178, 148, 251, + 173, 29, 109, 84, 250, 115, 78, 153, 36, 171, 49, 137, 181, 18, 3, 197, + 94, 213, 216, 134, 69, 179, 138, 97, 56, 43, 115, 163, 50, 208, 88, 197, + 202, 53, 12, 193, 93, 202, 154, 109, 237, 123, 6, 99, 238, 1, 231, 11, + 64, 230, 153, 154, 202, 42, 221, 152, 153, 40, 142, 101, 157, 169, 168, 106, + 163, 221, 216, 241, 101, 83, 181, 214, 118, 63, 185, 228, 162, 27, 143, 237, + 12, 229, 228, 182, 79, 175, 87, 141, 153, 200, 16, 235, 207, 105, 207, 72, + 212, 91, 209, 158, 144, 20, 247, 101, 167, 209, 163, 233, 213, 36, 231, 228, + 75, 147, 70, 205, 162, 51, 230, 54, 53, 221, 233, 201, 252, 86, 119, 242, + 27, 141, 31, 65, 209, 133, 205, 45, 20, 88, 47, 173, 140, 206, 167, 19, + 141, 76, 109, 104, 74, 237, 248, 202, 221, 109, 198, 59, 111, 31, 139, 55, + 7, 242, 206, 11, 251, 101, 61, 57, 172, 254, 89, 52, 148, 24, 133, 237, + 220, 71, 83, 200, 213, 155, 116, 217, 220, 108, 74, 106, 54, 45, 120, 110, + 145, 229, 0, 54, 3, 166, 88, 48, 89, 161, 84, 64, 103, 36, 61, 81, + 53, 182, 169, 100, 89, 166, 115, 86, 238, 81, 118, 103, 118, 107, 164, 44, + 215, 245, 116, 35, 49, 222, 232, 157, 164, 189, 237, 194, 238, 12, 120, 178, + 120, 124, 84, 206, 50, 115, 222, 16, 246, 99, 65, 91, 57, 133, 213, 182, + 164, 61, 58, 185, 106, 117, 162, 50, 149, 62, 7, 248, 197, 169, 44, 55, + 182, 53, 136, 234, 157, 121, 177, 10, 168, 89, 206, 142, 54, 221, 84, 58, + 89, 181, 98, 217, 6, 44, 216, 252, 164, 223, 238, 185, 211, 158, 220, 92, + 237, 99, 177, 4, 19, 101, 6, 149, 126, 73, 225, 244, 93, 89, 117, 107, + 213, 52, 95, 180, 170, 48, 139, 173, 169, 100, 228, 240, 160, 11, 239, 183, + 117, 216, 6, 8, 7, 217, 26, 204, 71, 58, 151, 24, 119, 166, 113, 99, + 31, 237, 58, 229, 197, 106, 161, 171, 253, 93, 191, 105, 172, 43, 21, 133, + 145, 13, 167, 84, 100, 99, 157, 210, 44, 169, 207, 229, 212, 200, 203, 236, + 27, 194, 184, 220, 81, 20, 65, 85, 215, 76, 123, 57, 179, 165, 172, 57, + 43, 78, 118, 234, 144, 239, 207, 61, 99, 58, 176, 122, 243, 186, 48, 209, + 68, 189, 34, 150, 23, 150, 43, 111, 199, 93, 126, 98, 75, 3, 70, 79, + 213, 188, 174, 229, 182, 215, 237, 181, 51, 65, 173, 176, 173, 244, 214, 25, + 235, 192, 62, 58, 201, 21, 163, 173, 50, 133, 120, 180, 160, 180, 237, 121, + 193, 155, 23, 71, 177, 9, 94, 247, 3, 57, 208, 88, 41, 169, 13, 116, + 155, 51, 165, 126, 49, 91, 170, 39, 1, 201, 208, 251, 133, 166, 121, 179, + 71, 207, 42, 152, 185, 89, 94, 21, 226, 59, 175, 145, 81, 245, 246, 164, + 88, 146, 65, 76, 166, 163, 217, 168, 43, 243, 227, 249, 226, 113, 154, 75, + 232, 32, 73, 138, 139, 66, 113, 82, 217, 137, 194, 10, 240, 211, 48, 107, + 137, 242, 58, 211, 153, 47, 115, 202, 163, 155, 25, 13, 219, 123, 62, 29, + 239, 148, 208, 96, 11, 24, 155, 66, 106, 61, 151, 87, 19, 87, 107, 207, + 129, 39, 105, 152, 233, 121, 186, 197, 238, 13, 145, 137, 45, 202, 117, 157, + 117, 23, 124, 140, 95, 218, 203, 113, 211, 201, 36, 147, 163, 24, 8, 160, + 140, 168, 102, 240, 202, 180, 169, 231, 24, 157, 206, 238, 162, 173, 165, 144, + 69, 155, 214, 161, 59, 152, 203, 42, 138, 18, 89, 53, 73, 215, 98, 241, + 62, 186, 96, 100, 140, 74, 118, 35, 45, 90, 141, 177, 48, 88, 183, 27, + 171, 109, 161, 228, 142, 25, 101, 32, 128, 188, 100, 148, 59, 37, 49, 42, + 247, 90, 9, 126, 80, 150, 51, 227, 209, 155, 188, 219, 162, 162, 56, 114, + 92, 126, 204, 142, 183, 98, 53, 6, 220, 217, 14, 249, 20, 122, 216, 223, + 69, 43, 177, 114, 199, 203, 237, 22, 206, 196, 202, 24, 177, 92, 204, 46, + 183, 11, 125, 34, 252, 97, 184, 76, 23, 40, 230, 97, 179, 192, 6, 41, + 61, 124, 221, 60, 99, 164, 162, 210, 221, 3, 119, 65, 99, 88, 146, 82, + 160, 211, 229, 15, 58, 93, 72, 188, 191, 63, 169, 120, 201, 53, 216, 20, + 166, 93, 12, 82, 218, 122, 20, 25, 164, 48, 214, 207, 215, 207, 166, 22, + 49, 15, 145, 173, 136, 199, 245, 18, 137, 99, 84, 186, 140, 80, 36, 35, + 121, 35, 79, 36, 197, 143, 169, 131, 41, 240, 116, 136, 249, 67, 62, 255, + 198, 222, 43, 210, 37, 134, 9, 11, 190, 254, 198, 221, 243, 210, 5, 134, + 188, 186, 112, 223, 232, 96, 16, 172, 233, 220, 187, 60, 116, 227, 194, 91, + 186, 71, 71, 242, 215, 31, 174, 224, 21, 157, 200, 223, 159, 121, 145, 71, + 31, 242, 24, 69, 230, 31, 159, 248, 51, 95, 242, 67, 147, 12, 196, 196, + 152, 41, 215, 31, 222, 240, 30, 255, 225, 6, 234, 188, 252, 151, 67, 189, + 125, 196, 234, 231, 192, 88, 82, 179, 37, 70, 38, 184, 95, 110, 151, 135, + 144, 27, 158, 177, 26, 204, 252, 107, 57, 20, 6, 74, 122, 50, 29, 221, + 53, 108, 195, 89, 126, 122, 96, 35, 79, 249, 82, 242, 105, 57, 134, 153, + 26, 207, 172, 1, 73, 233, 155, 75, 239, 105, 96, 204, 151, 227, 79, 236, + 235, 80, 116, 161, 250, 206, 131, 164, 157, 162, 116, 28, 27, 32, 145, 82, + 230, 134, 171, 67, 101, 43, 205, 162, 142, 237, 156, 162, 115, 228, 134, 212, + 135, 179, 46, 144, 72, 113, 108, 132, 114, 102, 225, 146, 36, 192, 18, 26, + 85, 46, 61, 74, 115, 13, 74, 155, 207, 45, 104, 234, 27, 97, 93, 206, + 70, 250, 32, 97, 24, 151, 179, 118, 30, 248, 123, 33, 8, 229, 114, 26, + 240, 131, 122, 22, 209, 37, 52, 86, 233, 226, 12, 144, 175, 162, 206, 73, + 167, 152, 115, 44, 121, 248, 202, 99, 11, 207, 193, 235, 33, 163, 240, 160, + 6, 25, 133, 79, 236, 27, 145, 232, 222, 133, 238, 9, 166, 87, 92, 132, + 130, 145, 156, 128, 137, 1, 94, 112, 28, 87, 2, 133, 35, 161, 200, 72, + 238, 47, 47, 130, 136, 67, 252, 191, 175, 132, 155, 32, 230, 90, 228, 195, + 246, 131, 31, 224, 136, 163, 156, 251, 67, 168, 194, 99, 164, 163, 175, 87, + 28, 205, 61, 71, 206, 127, 56, 44, 68, 209, 195, 123, 234, 195, 46, 248, + 221, 3, 224, 62, 223, 9, 119, 126, 168, 31, 88, 145, 95, 73, 12, 163, + 67, 35, 119, 220, 5, 230, 170, 61, 152, 215, 91, 63, 240, 205, 205, 175, + 153, 227, 11, 119, 243, 107, 252, 248, 194, 223, 252, 106, 14, 175, 49, 214, + 85, 45, 146, 137, 196, 111, 160, 108, 196, 188, 249, 112, 1, 83, 111, 175, + 150, 198, 61, 165, 99, 188, 247, 129, 233, 233, 154, 59, 192, 216, 115, 216, + 154, 16, 249, 58, 102, 4, 191, 53, 72, 57, 230, 221, 237, 245, 45, 32, + 16, 210, 29, 140, 205, 248, 11, 229, 99, 19, 140, 86, 67, 7, 113, 123, + 255, 106, 207, 180, 109, 208, 179, 79, 8, 199, 59, 238, 199, 59, 120, 128, + 251, 41, 222, 219, 61, 134, 133, 59, 132, 21, 62, 60, 236, 40, 12, 121, + 113, 79, 209, 145, 173, 63, 99, 136, 129, 54, 128, 79, 184, 11, 12, 91, + 114, 1, 79, 187, 80, 185, 123, 202, 27, 99, 192, 62, 158, 26, 98, 28, + 38, 12, 78, 113, 119, 248, 134, 65, 190, 238, 47, 126, 123, 184, 199, 149, + 114, 11, 227, 223, 210, 220, 135, 83, 159, 89, 18, 200, 25, 227, 121, 33, + 180, 176, 232, 253, 33, 192, 6, 6, 79, 99, 195, 29, 165, 189, 177, 57, + 92, 226, 8, 190, 114, 119, 252, 237, 245, 213, 167, 95, 120, 88, 92, 4, + 122, 111, 55, 136, 157, 55, 109, 210, 161, 190, 107, 104, 83, 92, 103, 216, + 135, 221, 159, 246, 129, 196, 200, 128, 77, 239, 120, 243, 153, 103, 220, 95, + 28, 35, 105, 66, 231, 44, 77, 55, 130, 224, 68, 31, 169, 229, 204, 130, + 221, 227, 232, 198, 231, 95, 190, 32, 6, 243, 236, 217, 108, 57, 198, 72, + 159, 135, 4, 87, 231, 240, 31, 62, 114, 15, 203, 97, 96, 120, 75, 142, + 252, 75, 222, 143, 251, 189, 230, 87, 75, 205, 205, 45, 134, 126, 195, 104, + 181, 12, 6, 40, 59, 143, 62, 132, 129, 183, 190, 47, 104, 25, 125, 222, + 79, 145, 69, 50, 194, 138, 17, 78, 18, 34, 28, 23, 4, 13, 140, 176, + 23, 47, 135, 19, 224, 150, 19, 42, 225, 225, 33, 8, 78, 2, 24, 4, + 118, 29, 160, 16, 192, 15, 148, 71, 233, 48, 223, 80, 140, 195, 200, 93, + 255, 126, 198, 71, 254, 225, 43, 135, 143, 167, 104, 36, 62, 134, 57, 12, + 206, 111, 228, 250, 18, 227, 60, 98, 140, 156, 254, 238, 44, 137, 199, 136, + 193, 199, 104, 104, 17, 31, 247, 28, 225, 139, 209, 164, 16, 211, 156, 0, + 236, 135, 191, 124, 25, 142, 133, 59, 5, 98, 33, 237, 80, 46, 70, 155, + 5, 226, 70, 66, 168, 225, 66, 241, 95, 201, 66, 193, 231, 223, 30, 240, + 223, 171, 67, 144, 201, 135, 195, 119, 11, 31, 48, 4, 247, 255, 248, 145, + 101, 97, 9, 244, 73, 78, 62, 104, 3, 198, 237, 61, 147, 70, 96, 123, + 96, 8, 91, 44, 53, 33, 177, 223, 248, 47, 167, 176, 91, 17, 44, 52, + 197, 14, 188, 12, 217, 13, 200, 207, 116, 140, 45, 210, 70, 66, 58, 158, + 102, 195, 161, 103, 44, 63, 1, 29, 244, 167, 123, 14, 80, 123, 248, 74, + 141, 61, 243, 20, 41, 74, 235, 227, 191, 24, 187, 235, 15, 202, 255, 23, + 132, 103, 221, 165, 96, 35, 252, 246, 64, 98, 185, 234, 171, 229, 111, 24, + 122, 208, 79, 0, 82, 116, 76, 120, 242, 204, 145, 173, 61, 89, 179, 205, + 167, 227, 139, 109, 14, 78, 47, 24, 140, 52, 68, 120, 131, 120, 94, 64, + 219, 204, 59, 216, 44, 150, 113, 236, 178, 102, 141, 102, 46, 204, 143, 141, + 241, 235, 94, 198, 150, 134, 133, 107, 2, 3, 54, 59, 196, 134, 37, 20, + 212, 244, 150, 134, 163, 239, 78, 203, 245, 90, 67, 114, 225, 233, 174, 217, + 39, 116, 155, 4, 209, 154, 99, 12, 173, 241, 114, 57, 255, 200, 48, 155, + 205, 230, 222, 156, 207, 172, 123, 211, 102, 230, 171, 62, 163, 185, 75, 134, + 103, 57, 145, 225, 88, 133, 185, 249, 6, 249, 245, 193, 232, 135, 79, 11, + 1, 18, 0, 136, 41, 1, 136, 252, 207, 1, 120, 252, 151, 35, 116, 30, + 56, 160, 217, 31, 142, 240, 121, 80, 15, 129, 215, 78, 80, 122, 224, 37, + 246, 3, 226, 170, 195, 20, 30, 118, 14, 161, 199, 159, 2, 58, 44, 60, + 112, 7, 42, 124, 37, 144, 57, 240, 211, 197, 80, 186, 24, 74, 151, 160, + 229, 99, 97, 25, 218, 61, 190, 40, 216, 224, 51, 210, 237, 67, 212, 109, + 30, 7, 244, 124, 249, 34, 248, 90, 45, 232, 208, 43, 192, 159, 79, 217, + 249, 38, 243, 163, 201, 250, 96, 35, 52, 254, 4, 53, 234, 195, 21, 15, + 176, 1, 24, 121, 128, 1, 132, 200, 149, 8, 188, 30, 110, 67, 132, 4, + 38, 125, 149, 238, 148, 231, 27, 63, 118, 33, 230, 125, 120, 248, 0, 235, + 245, 3, 101, 207, 6, 8, 114, 243, 201, 244, 67, 54, 31, 191, 173, 143, + 223, 214, 79, 235, 179, 111, 176, 182, 131, 111, 240, 244, 100, 157, 125, 131, + 165, 30, 124, 195, 248, 200, 103, 165, 78, 159, 172, 151, 223, 200, 214, 8, + 62, 146, 231, 167, 29, 161, 96, 126, 172, 67, 100, 130, 249, 47, 47, 35, + 30, 230, 130, 216, 134, 33, 24, 104, 238, 104, 69, 248, 31, 172, 22, 134, + 10, 168, 64, 211, 169, 203, 167, 195, 236, 3, 200, 2, 228, 120, 25, 185, + 194, 198, 46, 142, 159, 62, 94, 220, 81, 95, 77, 251, 238, 138, 123, 166, + 190, 126, 222, 68, 198, 145, 65, 196, 251, 242, 28, 57, 6, 66, 20, 40, + 186, 79, 98, 28, 98, 68, 49, 142, 190, 250, 20, 241, 195, 216, 221, 60, + 83, 52, 243, 153, 37, 52, 13, 73, 18, 70, 205, 38, 47, 4, 129, 248, + 113, 15, 173, 217, 8, 240, 211, 21, 255, 11, 80, 68, 150, 189, 187, 18, + 128, 237, 56, 4, 196, 14, 80, 12, 16, 207, 190, 182, 195, 235, 183, 212, + 147, 183, 132, 45, 4, 50, 17, 94, 199, 117, 30, 14, 88, 230, 105, 228, + 194, 18, 63, 109, 250, 6, 82, 61, 140, 120, 121, 218, 215, 254, 98, 58, + 237, 238, 90, 38, 126, 23, 39, 181, 122, 154, 61, 183, 190, 39, 210, 225, + 139, 182, 131, 253, 20, 238, 192, 123, 241, 12, 79, 67, 0, 114, 21, 26, + 206, 49, 112, 33, 123, 8, 92, 120, 220, 10, 167, 33, 28, 194, 191, 67, + 167, 181, 80, 183, 79, 17, 223, 129, 183, 137, 144, 94, 68, 236, 153, 51, + 211, 199, 64, 120, 141, 231, 75, 10, 187, 20, 161, 72, 167, 209, 137, 56, + 137, 30, 31, 116, 158, 194, 144, 245, 126, 132, 66, 196, 191, 47, 233, 207, + 211, 177, 143, 87, 39, 218, 67, 216, 192, 91, 42, 224, 165, 144, 168, 208, + 36, 132, 241, 41, 28, 215, 177, 20, 139, 168, 145, 139, 176, 191, 2, 254, + 254, 55, 144, 143, 95, 57, 242, 139, 239, 220, 77, 40, 31, 135, 249, 130, + 244, 99, 190, 160, 92, 56, 31, 239, 231, 227, 72, 125, 220, 49, 63, 139, + 249, 195, 249, 132, 67, 125, 220, 89, 62, 206, 175, 239, 180, 154, 116, 123, + 23, 138, 157, 238, 172, 13, 247, 16, 149, 14, 32, 1, 82, 1, 108, 19, + 63, 124, 247, 235, 64, 152, 62, 24, 49, 226, 35, 76, 71, 162, 216, 125, + 123, 194, 131, 70, 252, 80, 160, 148, 126, 113, 120, 15, 7, 85, 255, 118, + 179, 135, 73, 127, 217, 220, 113, 206, 110, 145, 87, 166, 41, 20, 64, 244, + 87, 219, 5, 218, 154, 254, 172, 17, 62, 126, 115, 136, 211, 227, 24, 191, + 39, 19, 44, 24, 203, 250, 12, 66, 59, 139, 18, 40, 6, 158, 212, 41, + 252, 78, 2, 198, 31, 51, 255, 48, 148, 30, 145, 167, 10, 64, 254, 114, + 109, 147, 133, 139, 81, 131, 239, 0, 117, 242, 200, 248, 211, 204, 61, 1, + 35, 225, 160, 111, 137, 12, 66, 63, 60, 32, 79, 125, 20, 122, 152, 67, + 94, 63, 104, 157, 254, 154, 13, 130, 214, 198, 250, 207, 89, 85, 217, 196, + 55, 86, 21, 52, 114, 182, 170, 240, 253, 199, 224, 133, 205, 133, 98, 149, + 14, 169, 203, 139, 98, 16, 82, 217, 151, 220, 126, 189, 72, 192, 123, 145, + 186, 163, 78, 114, 230, 175, 23, 89, 72, 147, 217, 219, 235, 196, 195, 3, + 251, 59, 251, 177, 248, 240, 80, 251, 253, 250, 58, 115, 23, 191, 97, 18, + 55, 191, 200, 152, 144, 249, 253, 58, 126, 87, 131, 119, 154, 255, 120, 93, + 187, 203, 224, 147, 8, 69, 187, 24, 210, 249, 158, 143, 70, 111, 107, 176, + 130, 217, 123, 73, 85, 110, 51, 228, 137, 227, 196, 219, 248, 175, 23, 159, + 169, 108, 36, 193, 32, 127, 223, 197, 127, 169, 47, 151, 97, 48, 123, 230, + 207, 1, 115, 61, 247, 13, 48, 3, 187, 122, 6, 102, 120, 255, 65, 48, + 67, 115, 39, 48, 95, 32, 152, 237, 32, 76, 245, 1, 164, 239, 130, 157, + 68, 149, 134, 23, 4, 23, 2, 42, 254, 46, 248, 33, 247, 139, 9, 192, + 200, 212, 144, 130, 168, 2, 38, 1, 222, 50, 254, 27, 78, 68, 29, 42, + 129, 154, 127, 35, 85, 128, 88, 65, 9, 183, 54, 3, 9, 191, 94, 228, + 252, 47, 204, 181, 128, 209, 226, 111, 252, 41, 161, 234, 17, 42, 247, 106, + 50, 212, 159, 53, 27, 234, 55, 167, 67, 125, 57, 31, 234, 143, 79, 136, + 26, 224, 9, 156, 221, 39, 255, 97, 171, 158, 141, 206, 250, 73, 131, 43, + 124, 107, 108, 214, 159, 226, 80, 204, 67, 31, 112, 168, 54, 24, 124, 70, + 197, 39, 114, 220, 192, 168, 145, 103, 65, 62, 96, 212, 147, 94, 9, 10, + 29, 241, 42, 86, 240, 163, 224, 42, 252, 192, 250, 253, 41, 203, 181, 64, + 240, 134, 116, 123, 109, 67, 66, 241, 6, 81, 131, 191, 134, 11, 15, 15, + 28, 245, 199, 31, 248, 139, 181, 39, 152, 107, 46, 136, 217, 206, 223, 22, + 224, 137, 187, 9, 50, 31, 86, 113, 225, 229, 42, 182, 126, 214, 42, 46, + 124, 115, 21, 91, 47, 87, 177, 245, 227, 171, 184, 112, 90, 197, 214, 59, + 171, 120, 253, 147, 6, 215, 250, 214, 216, 214, 223, 177, 138, 215, 47, 86, + 49, 208, 84, 246, 94, 64, 201, 204, 127, 142, 112, 111, 172, 226, 117, 104, + 21, 175, 127, 24, 92, 173, 151, 171, 248, 7, 136, 221, 95, 199, 182, 197, + 223, 130, 21, 90, 60, 45, 198, 226, 91, 52, 110, 253, 179, 22, 100, 235, + 155, 11, 114, 253, 114, 65, 174, 127, 124, 65, 182, 78, 11, 114, 29, 90, + 144, 199, 39, 104, 224, 200, 148, 93, 28, 2, 162, 35, 227, 197, 222, 43, + 172, 42, 8, 2, 57, 203, 9, 62, 160, 70, 246, 214, 231, 207, 48, 245, + 5, 203, 101, 58, 203, 159, 2, 166, 92, 169, 193, 139, 20, 170, 135, 52, + 247, 29, 109, 228, 161, 185, 224, 247, 7, 161, 116, 222, 224, 73, 16, 195, + 19, 135, 55, 89, 214, 223, 126, 67, 97, 153, 147, 241, 1, 26, 85, 41, + 250, 77, 30, 116, 178, 215, 246, 253, 61, 116, 29, 248, 236, 21, 172, 96, + 205, 89, 62, 124, 165, 216, 135, 164, 132, 145, 196, 185, 135, 164, 44, 193, + 47, 255, 144, 162, 158, 81, 86, 114, 102, 168, 23, 184, 249, 41, 48, 204, + 147, 166, 223, 17, 159, 65, 122, 14, 245, 136, 71, 173, 83, 184, 183, 7, + 125, 16, 247, 16, 121, 190, 60, 133, 34, 119, 86, 118, 16, 138, 28, 11, + 63, 124, 69, 157, 46, 247, 59, 255, 17, 126, 216, 223, 185, 143, 236, 101, + 16, 130, 28, 50, 127, 190, 68, 145, 246, 242, 203, 63, 30, 62, 68, 62, + 80, 206, 12, 99, 150, 15, 77, 191, 28, 31, 142, 76, 78, 190, 4, 201, + 103, 26, 222, 191, 51, 141, 254, 152, 35, 212, 202, 67, 9, 27, 149, 127, + 39, 169, 252, 10, 27, 137, 0, 224, 35, 0, 244, 72, 10, 4, 242, 19, + 4, 130, 13, 130, 71, 31, 36, 27, 5, 79, 1, 52, 66, 147, 137, 122, + 210, 255, 196, 76, 22, 180, 254, 95, 154, 70, 191, 159, 255, 173, 115, 8, + 163, 253, 73, 19, 136, 112, 32, 111, 231, 115, 168, 254, 167, 38, 81, 253, + 238, 89, 124, 15, 225, 145, 222, 135, 9, 68, 48, 156, 255, 226, 185, 86, + 255, 246, 100, 31, 167, 151, 122, 155, 124, 241, 247, 1, 145, 58, 144, 46, + 138, 38, 158, 59, 241, 27, 119, 207, 43, 103, 31, 121, 242, 145, 11, 62, + 114, 82, 148, 141, 190, 69, 224, 44, 125, 252, 159, 89, 61, 250, 248, 199, + 23, 143, 62, 62, 95, 59, 100, 44, 255, 181, 75, 71, 31, 255, 132, 149, + 3, 79, 8, 135, 243, 25, 254, 15, 33, 8, 104, 248, 103, 204, 177, 250, + 114, 146, 255, 171, 17, 4, 116, 255, 239, 79, 51, 44, 240, 191, 134, 32, + 200, 230, 87, 225, 191, 232, 43, 220, 32, 220, 115, 34, 160, 5, 204, 34, + 162, 138, 76, 124, 147, 1, 182, 86, 63, 71, 182, 43, 52, 191, 33, 219, + 65, 35, 231, 115, 188, 250, 81, 49, 12, 155, 123, 125, 236, 77, 31, 72, + 234, 193, 92, 226, 158, 210, 199, 154, 227, 192, 146, 184, 71, 117, 172, 7, + 239, 104, 251, 32, 80, 244, 45, 36, 112, 210, 81, 65, 139, 0, 187, 135, + 36, 196, 169, 198, 157, 10, 153, 224, 69, 164, 48, 87, 148, 98, 64, 152, + 140, 28, 213, 183, 23, 119, 88, 215, 61, 207, 2, 194, 189, 195, 39, 81, + 230, 216, 11, 154, 148, 224, 4, 138, 252, 226, 65, 213, 193, 158, 228, 29, + 101, 175, 187, 235, 255, 20, 192, 215, 186, 241, 247, 1, 15, 141, 156, 1, + 30, 223, 127, 12, 240, 216, 220, 185, 252, 235, 66, 191, 30, 168, 218, 175, + 23, 35, 215, 48, 28, 120, 204, 252, 122, 209, 199, 163, 212, 7, 84, 51, + 110, 198, 230, 210, 8, 212, 60, 144, 51, 66, 50, 69, 240, 59, 8, 180, + 144, 112, 247, 64, 114, 4, 165, 143, 111, 152, 225, 248, 2, 194, 245, 161, + 110, 148, 179, 95, 85, 179, 51, 44, 107, 182, 121, 217, 200, 161, 126, 255, + 235, 177, 129, 195, 43, 150, 245, 207, 149, 201, 7, 64, 31, 215, 152, 196, + 60, 240, 191, 250, 41, 240, 116, 172, 155, 126, 32, 73, 126, 169, 227, 11, + 116, 230, 212, 116, 208, 49, 63, 225, 208, 179, 99, 14, 172, 254, 162, 228, + 231, 243, 107, 63, 126, 34, 221, 188, 125, 40, 29, 218, 34, 143, 88, 158, + 60, 248, 163, 160, 15, 160, 56, 116, 39, 4, 166, 227, 203, 103, 234, 69, + 7, 206, 85, 2, 104, 67, 244, 99, 43, 14, 221, 133, 107, 238, 97, 37, + 120, 240, 235, 179, 239, 88, 243, 223, 93, 86, 111, 212, 121, 137, 171, 10, + 200, 8, 64, 203, 36, 90, 55, 202, 243, 223, 224, 223, 223, 30, 216, 123, + 150, 21, 56, 129, 85, 127, 135, 215, 91, 142, 191, 143, 242, 31, 185, 123, + 86, 146, 110, 225, 253, 223, 176, 27, 57, 89, 150, 21, 234, 14, 54, 38, + 139, 101, 245, 213, 242, 26, 42, 185, 197, 58, 34, 228, 152, 235, 38, 12, + 21, 196, 22, 255, 9, 226, 217, 233, 246, 126, 152, 118, 98, 223, 195, 187, + 219, 31, 203, 127, 43, 229, 4, 136, 252, 45, 194, 137, 22, 77, 164, 15, + 15, 252, 133, 109, 110, 137, 26, 228, 235, 103, 88, 8, 170, 170, 112, 106, + 132, 189, 23, 56, 86, 86, 89, 33, 66, 112, 182, 204, 114, 10, 60, 113, + 138, 204, 179, 162, 8, 79, 42, 199, 71, 85, 17, 211, 88, 142, 85, 57, + 54, 138, 6, 75, 248, 12, 223, 177, 116, 84, 141, 42, 81, 137, 255, 130, + 43, 241, 217, 183, 171, 8, 154, 227, 206, 155, 227, 120, 81, 146, 177, 70, + 65, 82, 36, 69, 230, 176, 21, 149, 21, 5, 69, 194, 150, 57, 94, 86, + 120, 168, 251, 94, 225, 36, 78, 226, 121, 108, 67, 225, 57, 69, 242, 91, + 139, 10, 130, 128, 95, 57, 46, 202, 69, 121, 76, 139, 74, 172, 192, 138, + 220, 177, 93, 207, 56, 111, 78, 144, 89, 65, 226, 100, 108, 79, 149, 56, + 78, 150, 176, 179, 156, 40, 176, 240, 66, 90, 228, 121, 128, 128, 200, 146, + 38, 229, 40, 43, 200, 88, 63, 140, 95, 102, 149, 40, 71, 26, 21, 162, + 156, 204, 146, 158, 68, 21, 86, 230, 72, 101, 10, 164, 242, 42, 127, 24, + 239, 201, 228, 207, 95, 95, 255, 25, 78, 19, 150, 198, 143, 115, 154, 164, + 247, 47, 182, 203, 127, 51, 167, 137, 64, 249, 9, 122, 135, 119, 56, 205, + 55, 24, 205, 23, 105, 190, 90, 85, 0, 246, 147, 83, 249, 183, 88, 203, + 157, 185, 248, 41, 179, 223, 205, 85, 223, 159, 85, 104, 228, 108, 82, 241, + 253, 199, 56, 28, 108, 238, 242, 184, 215, 200, 49, 115, 132, 28, 49, 147, + 237, 137, 27, 92, 138, 74, 176, 165, 34, 119, 240, 77, 17, 69, 73, 192, + 39, 1, 119, 56, 193, 49, 144, 71, 34, 31, 97, 151, 75, 100, 167, 9, + 28, 199, 9, 210, 57, 100, 126, 142, 118, 30, 250, 250, 13, 237, 60, 54, + 243, 18, 56, 63, 170, 157, 247, 161, 115, 152, 222, 87, 139, 199, 87, 89, + 72, 220, 125, 148, 85, 125, 141, 188, 42, 68, 5, 94, 80, 89, 64, 143, + 128, 106, 133, 215, 114, 10, 39, 8, 247, 188, 204, 249, 185, 163, 146, 172, + 0, 178, 18, 21, 30, 112, 49, 199, 138, 111, 174, 43, 180, 97, 251, 57, + 224, 75, 244, 19, 238, 55, 224, 71, 108, 74, 207, 0, 72, 82, 126, 16, + 130, 164, 209, 211, 10, 147, 229, 8, 144, 32, 96, 76, 34, 119, 130, 26, + 185, 83, 196, 8, 199, 241, 228, 239, 46, 42, 130, 8, 161, 190, 113, 216, + 17, 241, 33, 199, 171, 20, 49, 61, 145, 195, 64, 101, 201, 39, 249, 229, + 25, 72, 144, 255, 45, 120, 254, 36, 17, 176, 251, 45, 17, 112, 247, 66, + 4, 220, 253, 176, 8, 216, 37, 34, 96, 152, 38, 190, 220, 169, 119, 72, + 16, 129, 160, 145, 157, 10, 50, 50, 210, 55, 160, 155, 240, 175, 12, 36, + 18, 119, 40, 39, 70, 85, 146, 141, 101, 217, 3, 169, 61, 3, 204, 79, + 218, 166, 205, 111, 29, 162, 97, 51, 47, 97, 243, 195, 219, 180, 121, 60, + 68, 67, 72, 127, 39, 146, 167, 137, 56, 43, 146, 111, 106, 244, 94, 81, + 132, 87, 187, 21, 96, 231, 35, 126, 86, 186, 151, 223, 80, 41, 24, 246, + 108, 109, 60, 205, 230, 154, 110, 46, 79, 214, 76, 53, 146, 76, 5, 201, + 7, 161, 252, 13, 176, 161, 49, 113, 184, 134, 16, 24, 222, 175, 35, 0, + 192, 27, 10, 1, 32, 206, 30, 240, 133, 71, 45, 0, 197, 250, 28, 28, + 36, 138, 161, 196, 8, 143, 140, 142, 99, 83, 95, 157, 103, 234, 149, 176, + 190, 235, 243, 63, 44, 58, 129, 216, 28, 216, 140, 194, 8, 253, 10, 255, + 246, 12, 159, 170, 122, 71, 16, 63, 10, 165, 223, 148, 196, 207, 37, 213, + 176, 40, 238, 127, 121, 87, 22, 255, 19, 153, 247, 40, 170, 67, 59, 231, + 95, 14, 245, 134, 100, 233, 179, 151, 55, 196, 241, 219, 163, 56, 126, 75, + 196, 113, 34, 11, 159, 73, 244, 167, 215, 63, 83, 19, 28, 190, 135, 101, + 113, 191, 44, 115, 248, 116, 146, 197, 131, 54, 191, 33, 138, 7, 173, 191, + 47, 137, 159, 26, 63, 9, 226, 254, 226, 120, 247, 226, 12, 222, 213, 32, + 87, 100, 224, 161, 116, 92, 113, 117, 82, 232, 112, 45, 230, 197, 93, 191, + 192, 44, 249, 123, 175, 196, 156, 117, 0, 164, 131, 208, 125, 152, 83, 129, + 171, 139, 23, 253, 12, 153, 25, 31, 23, 109, 208, 171, 224, 242, 202, 213, + 87, 222, 191, 23, 243, 205, 203, 43, 111, 233, 236, 134, 58, 21, 20, 6, + 161, 29, 239, 163, 80, 191, 61, 64, 214, 87, 74, 51, 207, 152, 155, 218, + 139, 91, 25, 36, 13, 90, 112, 96, 159, 25, 195, 33, 246, 231, 245, 85, + 140, 183, 33, 225, 87, 231, 87, 240, 241, 197, 253, 129, 183, 171, 61, 161, + 153, 107, 54, 34, 34, 153, 150, 34, 32, 112, 69, 184, 168, 28, 225, 69, + 241, 223, 8, 204, 136, 138, 233, 209, 8, 7, 191, 188, 32, 65, 154, 132, + 89, 21, 200, 5, 63, 32, 127, 222, 188, 184, 63, 122, 130, 199, 29, 71, + 32, 66, 148, 134, 132, 26, 28, 113, 96, 192, 187, 195, 42, 97, 191, 224, + 13, 45, 252, 185, 167, 52, 191, 203, 122, 8, 97, 33, 50, 14, 128, 133, + 97, 12, 204, 189, 113, 90, 67, 65, 194, 119, 2, 231, 80, 252, 240, 16, + 2, 209, 177, 166, 19, 60, 142, 29, 36, 134, 247, 200, 102, 224, 181, 73, + 238, 208, 23, 50, 152, 224, 238, 214, 71, 234, 233, 184, 32, 200, 101, 87, + 188, 124, 226, 244, 159, 102, 171, 229, 124, 181, 244, 240, 22, 14, 222, 77, + 209, 92, 67, 11, 221, 193, 169, 19, 234, 248, 18, 179, 106, 30, 36, 1, + 226, 212, 44, 63, 5, 111, 122, 44, 53, 211, 65, 137, 72, 163, 80, 48, + 178, 130, 203, 55, 167, 81, 150, 157, 151, 32, 160, 116, 205, 161, 250, 70, + 64, 129, 161, 78, 152, 13, 123, 230, 45, 253, 123, 49, 167, 174, 125, 120, + 5, 177, 50, 249, 112, 236, 141, 107, 144, 27, 131, 80, 111, 127, 71, 13, + 12, 29, 134, 64, 132, 51, 28, 11, 98, 113, 99, 187, 116, 181, 208, 85, + 2, 215, 24, 1, 126, 247, 200, 37, 128, 177, 6, 164, 13, 250, 161, 13, + 6, 38, 98, 125, 24, 146, 102, 205, 199, 218, 93, 64, 164, 190, 113, 169, + 224, 8, 206, 7, 246, 112, 153, 231, 212, 233, 7, 88, 106, 193, 53, 131, + 3, 88, 95, 92, 177, 61, 77, 250, 98, 5, 242, 33, 78, 172, 20, 24, + 89, 29, 230, 44, 130, 215, 4, 231, 150, 182, 67, 78, 11, 246, 204, 249, + 124, 134, 238, 252, 176, 47, 111, 219, 242, 216, 126, 112, 223, 150, 63, 221, + 7, 82, 33, 31, 119, 186, 180, 227, 207, 238, 129, 200, 225, 172, 134, 166, + 142, 10, 70, 242, 6, 54, 137, 224, 117, 74, 24, 175, 137, 158, 207, 131, + 108, 100, 172, 48, 84, 146, 230, 87, 64, 224, 127, 37, 188, 133, 123, 44, + 173, 15, 44, 4, 90, 141, 145, 27, 147, 36, 43, 222, 173, 60, 94, 76, + 185, 226, 239, 184, 11, 125, 54, 115, 7, 94, 17, 47, 246, 125, 222, 22, + 35, 187, 98, 100, 95, 140, 232, 197, 47, 207, 200, 95, 64, 162, 121, 125, + 21, 100, 185, 249, 237, 74, 120, 62, 93, 179, 36, 237, 227, 213, 192, 220, + 41, 199, 243, 197, 25, 14, 198, 189, 140, 55, 103, 124, 42, 238, 91, 141, + 223, 126, 38, 247, 73, 201, 139, 207, 92, 161, 70, 162, 248, 79, 142, 250, + 7, 185, 152, 199, 82, 246, 154, 92, 194, 251, 7, 245, 79, 96, 173, 60, + 115, 128, 55, 180, 109, 205, 155, 70, 80, 29, 161, 57, 187, 123, 255, 130, + 143, 127, 183, 15, 58, 226, 126, 254, 55, 235, 223, 193, 56, 252, 225, 189, + 61, 154, 123, 70, 151, 0, 136, 122, 158, 145, 201, 195, 60, 108, 228, 171, + 119, 199, 63, 227, 249, 197, 85, 137, 88, 208, 97, 15, 161, 162, 224, 245, + 144, 15, 239, 22, 134, 50, 249, 172, 36, 222, 212, 9, 178, 189, 194, 222, + 97, 140, 246, 98, 95, 7, 211, 4, 19, 119, 192, 120, 115, 205, 133, 169, + 124, 139, 61, 60, 199, 140, 31, 95, 172, 161, 111, 212, 244, 14, 147, 248, + 27, 185, 222, 24, 249, 106, 14, 175, 145, 41, 4, 25, 44, 226, 63, 226, + 233, 77, 228, 206, 187, 185, 121, 205, 17, 30, 110, 227, 254, 239, 234, 194, + 188, 191, 97, 92, 243, 38, 110, 63, 244, 254, 91, 214, 150, 199, 76, 71, + 115, 75, 123, 101, 29, 142, 180, 248, 123, 233, 149, 149, 37, 158, 75, 147, + 19, 134, 16, 112, 254, 235, 52, 107, 222, 15, 90, 244, 144, 177, 19, 51, + 188, 240, 153, 253, 139, 85, 243, 191, 172, 66, 245, 254, 142, 57, 79, 184, + 175, 255, 205, 179, 248, 247, 20, 164, 47, 167, 81, 125, 61, 143, 63, 44, + 16, 30, 58, 121, 58, 255, 186, 63, 181, 251, 55, 37, 195, 55, 234, 36, + 103, 105, 222, 217, 97, 154, 255, 226, 29, 14, 211, 68, 86, 148, 126, 199, + 55, 198, 63, 75, 187, 190, 38, 217, 105, 255, 252, 236, 134, 185, 38, 135, + 107, 55, 55, 255, 230, 239, 197, 211, 105, 218, 235, 195, 52, 144, 68, 79, + 220, 121, 122, 230, 234, 175, 88, 77, 236, 218, 145, 207, 65, 230, 134, 58, + 50, 55, 88, 56, 52, 106, 191, 120, 232, 218, 226, 219, 197, 222, 147, 247, + 185, 63, 254, 128, 127, 133, 176, 128, 255, 213, 123, 38, 254, 25, 128, 184, + 129, 156, 49, 60, 234, 62, 206, 47, 32, 30, 71, 226, 83, 227, 63, 29, + 13, 112, 141, 32, 238, 248, 115, 131, 55, 94, 169, 107, 156, 129, 25, 1, + 125, 236, 230, 254, 116, 39, 234, 27, 67, 123, 89, 199, 59, 163, 250, 36, + 158, 174, 235, 74, 175, 175, 235, 18, 70, 246, 243, 229, 213, 167, 203, 47, + 232, 190, 197, 153, 1, 39, 75, 101, 34, 153, 88, 36, 212, 163, 128, 223, + 189, 190, 4, 104, 92, 30, 161, 131, 215, 150, 15, 74, 17, 158, 114, 131, + 80, 209, 126, 188, 104, 145, 220, 221, 15, 238, 240, 31, 115, 113, 47, 114, + 129, 112, 115, 241, 13, 56, 18, 200, 124, 244, 239, 31, 35, 182, 211, 6, + 218, 124, 105, 194, 132, 34, 202, 203, 16, 132, 151, 137, 193, 143, 240, 128, + 125, 253, 131, 18, 31, 72, 103, 159, 191, 23, 254, 26, 53, 130, 218, 206, + 96, 248, 46, 158, 35, 157, 192, 91, 182, 47, 58, 23, 22, 112, 137, 139, + 4, 28, 37, 228, 65, 71, 48, 193, 161, 31, 135, 224, 9, 146, 180, 83, + 154, 64, 249, 166, 215, 167, 20, 49, 72, 209, 252, 83, 59, 211, 195, 23, + 224, 139, 225, 129, 172, 223, 7, 54, 164, 209, 69, 14, 18, 132, 190, 127, + 120, 176, 102, 63, 137, 207, 254, 36, 255, 127, 50, 189, 216, 12, 78, 241, + 243, 169, 35, 220, 217, 23, 129, 124, 193, 190, 158, 167, 139, 167, 244, 112, + 81, 152, 113, 223, 65, 72, 24, 146, 200, 71, 93, 249, 185, 113, 89, 220, + 208, 87, 135, 18, 161, 179, 196, 3, 92, 191, 115, 126, 51, 181, 88, 247, + 197, 180, 158, 169, 52, 14, 213, 5, 191, 127, 190, 217, 78, 21, 254, 231, + 246, 218, 167, 115, 252, 196, 159, 132, 252, 247, 54, 163, 191, 215, 216, 119, + 118, 154, 191, 42, 255, 2, 68, 99, 1, 72, 15, 101, 191, 15, 108, 177, + 255, 52, 220, 112, 123, 209, 71, 192, 9, 103, 246, 93, 97, 40, 222, 7, + 215, 108, 131, 66, 194, 233, 75, 24, 236, 156, 239, 180, 39, 68, 16, 66, + 72, 238, 219, 249, 222, 158, 134, 215, 206, 190, 188, 165, 49, 39, 138, 14, + 216, 8, 39, 127, 90, 79, 39, 127, 90, 136, 19, 17, 21, 82, 207, 239, + 120, 254, 58, 240, 0, 199, 233, 244, 111, 125, 28, 102, 245, 26, 175, 22, + 75, 210, 151, 59, 130, 227, 6, 55, 56, 97, 126, 55, 238, 78, 110, 172, + 254, 220, 55, 193, 161, 175, 190, 167, 174, 119, 59, 203, 125, 219, 101, 87, + 3, 248, 172, 153, 107, 142, 76, 212, 96, 132, 123, 177, 52, 244, 177, 99, + 46, 86, 6, 208, 114, 15, 22, 20, 224, 107, 168, 206, 157, 13, 86, 186, + 175, 48, 169, 153, 250, 152, 74, 131, 104, 191, 135, 79, 159, 3, 239, 39, + 46, 59, 189, 95, 121, 12, 212, 48, 31, 155, 186, 199, 248, 53, 102, 92, + 99, 119, 63, 94, 218, 214, 151, 83, 195, 169, 237, 210, 112, 188, 128, 43, + 90, 142, 97, 125, 157, 90, 68, 191, 7, 46, 116, 216, 213, 220, 221, 201, + 143, 23, 48, 98, 132, 92, 184, 134, 175, 233, 139, 156, 122, 134, 115, 138, + 125, 74, 106, 107, 115, 64, 53, 60, 125, 188, 178, 1, 28, 214, 255, 253, + 63, 100, 191, 252, 53, 71, 100, 111, 123, 30, 59, 80, 28, 254, 129, 123, + 126, 197, 237, 133, 39, 216, 223, 129, 239, 77, 104, 160, 21, 193, 137, 243, + 124, 253, 234, 105, 213, 30, 57, 213, 176, 83, 179, 43, 46, 242, 149, 191, + 23, 110, 175, 248, 231, 200, 149, 16, 246, 44, 117, 220, 73, 254, 225, 208, + 87, 89, 146, 4, 137, 65, 55, 94, 129, 143, 187, 192, 253, 21, 158, 150, + 156, 220, 94, 29, 93, 107, 109, 245, 221, 158, 28, 50, 134, 61, 104, 205, + 103, 48, 118, 221, 154, 173, 208, 195, 212, 5, 237, 43, 89, 254, 65, 148, + 28, 3, 211, 91, 146, 141, 122, 188, 51, 191, 209, 150, 134, 235, 141, 141, + 1, 49, 160, 36, 14, 180, 208, 217, 86, 72, 65, 26, 220, 114, 34, 167, + 81, 65, 191, 201, 243, 161, 235, 135, 163, 45, 242, 251, 106, 0, 126, 214, + 224, 0, 149, 124, 188, 64, 101, 42, 190, 251, 103, 88, 212, 73, 127, 26, + 208, 244, 239, 196, 167, 136, 191, 142, 216, 244, 156, 129, 127, 7, 151, 30, + 75, 252, 103, 49, 233, 217, 17, 216, 137, 238, 132, 146, 217, 215, 68, 72, + 120, 143, 17, 244, 63, 190, 141, 24, 9, 63, 244, 253, 224, 140, 157, 193, + 243, 59, 136, 211, 169, 204, 127, 18, 162, 103, 52, 93, 32, 68, 67, 120, + 139, 184, 188, 65, 218, 69, 146, 155, 120, 143, 243, 253, 175, 125, 11, 202, + 226, 235, 170, 223, 2, 59, 241, 0, 99, 184, 79, 128, 14, 151, 184, 253, + 109, 128, 253, 103, 215, 128, 36, 3, 118, 222, 19, 25, 206, 151, 8, 170, + 139, 45, 99, 13, 157, 62, 58, 221, 122, 58, 12, 227, 132, 216, 131, 186, + 168, 83, 93, 4, 209, 26, 161, 163, 168, 99, 205, 1, 160, 208, 160, 243, + 189, 211, 134, 216, 209, 155, 80, 224, 164, 41, 104, 144, 120, 159, 36, 213, + 106, 182, 129, 186, 96, 130, 223, 244, 195, 108, 161, 219, 201, 221, 177, 119, + 31, 222, 103, 244, 143, 99, 10, 105, 192, 207, 135, 246, 160, 89, 214, 59, + 42, 50, 116, 19, 70, 254, 128, 135, 189, 92, 93, 127, 198, 243, 26, 222, + 79, 251, 114, 115, 9, 28, 231, 43, 192, 18, 135, 103, 220, 151, 139, 55, + 65, 238, 147, 136, 171, 175, 64, 36, 124, 152, 63, 161, 158, 227, 138, 187, + 124, 190, 60, 120, 170, 228, 88, 94, 124, 62, 146, 133, 75, 164, 22, 236, + 243, 9, 153, 63, 64, 225, 39, 77, 127, 178, 160, 86, 234, 95, 151, 87, + 194, 191, 46, 47, 95, 122, 250, 57, 155, 27, 162, 15, 48, 15, 171, 250, + 235, 229, 92, 243, 60, 244, 251, 134, 109, 126, 241, 125, 147, 5, 103, 116, + 151, 151, 4, 194, 87, 192, 59, 17, 120, 69, 8, 89, 60, 46, 227, 15, + 151, 87, 135, 231, 75, 116, 248, 19, 84, 4, 12, 17, 204, 246, 3, 138, + 213, 184, 248, 206, 100, 128, 43, 252, 132, 155, 238, 243, 135, 99, 217, 15, + 168, 252, 65, 128, 31, 42, 248, 74, 114, 193, 142, 249, 157, 255, 8, 50, + 215, 81, 230, 214, 244, 123, 234, 146, 134, 97, 0, 89, 126, 122, 13, 205, + 167, 227, 26, 187, 140, 28, 43, 39, 93, 32, 190, 168, 222, 0, 255, 21, + 31, 202, 25, 9, 124, 55, 250, 157, 184, 32, 205, 220, 127, 187, 157, 16, + 54, 121, 35, 31, 161, 30, 0, 59, 178, 235, 96, 11, 126, 179, 170, 135, + 183, 62, 3, 106, 187, 250, 174, 14, 224, 121, 186, 247, 79, 54, 226, 253, + 147, 187, 185, 240, 96, 198, 62, 93, 208, 167, 126, 4, 36, 23, 32, 171, + 175, 236, 149, 5, 164, 244, 144, 196, 160, 63, 78, 120, 54, 63, 223, 113, + 17, 254, 203, 51, 154, 12, 125, 61, 188, 92, 12, 225, 235, 229, 237, 5, + 225, 240, 168, 13, 71, 61, 80, 27, 88, 37, 191, 94, 4, 42, 163, 95, + 169, 14, 252, 108, 201, 251, 111, 230, 231, 127, 66, 169, 206, 151, 223, 175, + 47, 144, 225, 192, 239, 192, 217, 116, 24, 60, 152, 247, 61, 250, 94, 119, + 112, 65, 251, 44, 47, 23, 161, 156, 78, 112, 22, 207, 70, 58, 212, 29, + 73, 191, 33, 10, 168, 160, 42, 7, 235, 194, 60, 78, 231, 230, 227, 117, + 168, 78, 124, 132, 106, 111, 160, 226, 206, 239, 215, 107, 29, 147, 131, 198, + 161, 252, 252, 244, 138, 190, 25, 32, 9, 179, 220, 97, 197, 55, 159, 174, + 177, 231, 240, 60, 191, 249, 253, 238, 174, 3, 205, 253, 147, 170, 33, 245, + 55, 157, 209, 5, 52, 18, 238, 249, 245, 6, 189, 60, 116, 110, 206, 6, + 240, 27, 36, 190, 30, 3, 192, 126, 131, 205, 209, 161, 65, 124, 250, 11, + 131, 128, 90, 95, 143, 195, 9, 141, 131, 14, 198, 225, 119, 94, 199, 113, + 56, 193, 144, 126, 167, 233, 151, 227, 248, 245, 194, 180, 255, 121, 39, 64, + 169, 107, 179, 136, 15, 119, 20, 73, 184, 185, 237, 48, 27, 238, 242, 194, + 249, 124, 39, 146, 179, 156, 13, 170, 187, 124, 238, 7, 83, 144, 223, 193, + 223, 251, 251, 139, 233, 103, 192, 103, 95, 46, 94, 156, 27, 31, 23, 226, + 92, 215, 222, 38, 22, 127, 70, 31, 108, 3, 245, 116, 232, 152, 105, 182, + 214, 92, 147, 72, 92, 182, 182, 116, 205, 45, 209, 133, 30, 137, 197, 26, + 232, 194, 204, 13, 132, 150, 255, 95, 145, 142, 63, 33, 19, 190, 183, 55, + 192, 150, 142, 22, 49, 52, 23, 154, 160, 195, 80, 123, 69, 9, 124, 72, + 190, 79, 3, 168, 147, 47, 67, 104, 234, 27, 72, 159, 127, 27, 233, 19, + 128, 251, 208, 124, 7, 238, 127, 133, 24, 252, 32, 242, 247, 59, 119, 164, + 0, 1, 146, 231, 14, 8, 23, 122, 134, 136, 45, 162, 173, 71, 79, 164, + 138, 207, 230, 58, 98, 106, 129, 27, 241, 23, 124, 27, 133, 78, 3, 181, + 103, 234, 150, 250, 234, 45, 92, 16, 161, 130, 210, 140, 185, 70, 191, 128, + 212, 85, 80, 75, 232, 124, 142, 176, 76, 63, 143, 236, 192, 212, 125, 47, + 193, 129, 172, 127, 129, 206, 156, 85, 252, 38, 133, 193, 149, 132, 48, 120, + 77, 88, 206, 202, 62, 156, 127, 56, 39, 38, 231, 173, 248, 152, 190, 111, + 128, 108, 126, 125, 242, 234, 123, 29, 139, 56, 177, 27, 64, 68, 126, 138, + 255, 250, 43, 208, 131, 53, 164, 125, 198, 101, 121, 121, 90, 80, 193, 161, + 63, 46, 241, 39, 116, 236, 14, 252, 203, 151, 95, 47, 124, 103, 239, 152, + 151, 36, 98, 146, 97, 98, 18, 252, 123, 13, 133, 161, 58, 75, 179, 251, + 3, 13, 146, 56, 134, 76, 37, 103, 220, 201, 48, 131, 144, 1, 176, 144, + 247, 5, 45, 171, 128, 227, 126, 192, 67, 198, 235, 129, 169, 141, 174, 253, + 2, 55, 17, 204, 225, 69, 188, 91, 239, 75, 196, 243, 187, 69, 102, 252, + 253, 174, 113, 126, 215, 48, 215, 169, 123, 161, 50, 199, 143, 65, 55, 131, + 79, 65, 87, 241, 237, 216, 221, 224, 19, 233, 112, 144, 51, 212, 219, 224, + 43, 246, 248, 4, 204, 67, 182, 99, 151, 35, 161, 209, 144, 202, 201, 48, + 138, 65, 193, 160, 154, 8, 252, 146, 244, 155, 83, 111, 105, 170, 120, 123, + 157, 67, 39, 68, 235, 209, 205, 229, 91, 24, 154, 200, 153, 212, 231, 37, + 224, 17, 99, 9, 136, 121, 164, 1, 162, 35, 154, 38, 215, 24, 173, 136, + 141, 14, 57, 38, 34, 73, 68, 251, 53, 243, 204, 229, 46, 164, 204, 241, + 252, 220, 163, 62, 148, 240, 102, 214, 234, 152, 27, 112, 84, 40, 215, 73, + 65, 245, 26, 219, 7, 86, 32, 254, 241, 211, 81, 63, 53, 91, 29, 101, + 52, 239, 12, 149, 191, 68, 243, 215, 190, 230, 30, 141, 110, 2, 164, 30, + 114, 105, 251, 129, 140, 232, 3, 53, 48, 150, 134, 11, 221, 55, 124, 236, + 110, 218, 243, 153, 75, 84, 7, 72, 80, 2, 27, 17, 93, 95, 185, 164, + 98, 239, 224, 68, 23, 112, 159, 62, 198, 163, 191, 185, 59, 211, 209, 81, + 242, 53, 251, 224, 160, 144, 15, 253, 225, 30, 198, 171, 145, 17, 110, 234, + 28, 100, 175, 218, 116, 86, 118, 31, 70, 11, 237, 141, 86, 230, 0, 6, + 50, 52, 45, 200, 64, 153, 75, 244, 26, 79, 172, 120, 160, 90, 223, 116, + 245, 96, 71, 227, 159, 209, 249, 230, 99, 33, 234, 245, 225, 237, 169, 248, + 64, 45, 13, 11, 48, 11, 224, 175, 83, 134, 51, 175, 251, 246, 10, 200, + 64, 255, 232, 121, 31, 45, 210, 96, 60, 119, 144, 101, 8, 93, 2, 114, + 72, 70, 124, 244, 146, 29, 106, 241, 124, 58, 67, 45, 133, 172, 141, 198, + 154, 123, 176, 75, 122, 171, 81, 244, 137, 123, 61, 155, 27, 196, 92, 9, + 185, 27, 3, 77, 153, 240, 16, 103, 99, 58, 131, 217, 230, 91, 158, 136, + 201, 52, 62, 176, 247, 194, 135, 200, 11, 56, 63, 168, 168, 107, 124, 27, + 32, 80, 128, 248, 35, 62, 95, 158, 15, 178, 24, 8, 115, 47, 214, 40, + 251, 22, 141, 134, 254, 234, 38, 96, 227, 13, 144, 128, 16, 149, 70, 21, + 146, 79, 165, 131, 187, 94, 23, 47, 54, 213, 209, 164, 137, 199, 110, 31, + 157, 20, 7, 150, 75, 71, 247, 197, 208, 67, 233, 244, 46, 65, 223, 94, + 218, 63, 201, 32, 197, 221, 92, 190, 166, 217, 193, 182, 57, 28, 224, 34, + 219, 126, 34, 195, 120, 2, 141, 142, 133, 31, 184, 123, 41, 68, 27, 2, + 10, 198, 30, 173, 4, 47, 28, 251, 201, 223, 106, 104, 98, 212, 127, 166, + 224, 221, 199, 6, 104, 169, 212, 127, 134, 239, 56, 204, 96, 55, 58, 196, + 22, 200, 255, 126, 65, 63, 157, 1, 195, 207, 18, 9, 80, 9, 200, 51, + 145, 43, 210, 131, 200, 149, 4, 149, 0, 221, 24, 30, 43, 129, 231, 160, + 14, 231, 115, 144, 26, 25, 30, 10, 250, 94, 68, 145, 238, 203, 23, 99, + 246, 225, 43, 127, 251, 245, 54, 178, 126, 102, 132, 103, 106, 227, 193, 123, + 144, 31, 37, 2, 46, 178, 185, 189, 26, 179, 204, 24, 72, 249, 102, 9, + 223, 252, 58, 94, 126, 187, 216, 112, 65, 53, 43, 82, 205, 216, 227, 94, + 84, 51, 190, 189, 218, 112, 204, 6, 170, 25, 47, 185, 23, 213, 28, 191, + 97, 159, 208, 155, 219, 21, 116, 131, 190, 130, 246, 238, 224, 195, 205, 111, + 36, 9, 170, 164, 175, 160, 236, 29, 52, 121, 115, 65, 187, 252, 96, 247, + 10, 32, 99, 22, 29, 20, 7, 2, 21, 123, 47, 253, 130, 74, 78, 52, + 22, 250, 66, 109, 79, 250, 206, 173, 79, 244, 177, 138, 237, 171, 42, 64, + 172, 120, 175, 138, 93, 72, 101, 138, 180, 30, 58, 187, 249, 132, 5, 72, + 69, 7, 201, 14, 222, 253, 111, 227, 79, 216, 31, 210, 207, 195, 55, 120, + 39, 6, 236, 48, 85, 107, 211, 91, 145, 121, 234, 207, 150, 227, 139, 205, + 103, 124, 7, 86, 10, 221, 38, 95, 148, 96, 117, 14, 102, 144, 24, 36, + 68, 46, 63, 103, 62, 20, 115, 137, 47, 84, 108, 48, 160, 18, 100, 247, + 103, 16, 193, 81, 215, 137, 227, 222, 2, 166, 240, 159, 151, 95, 1, 70, + 165, 231, 75, 88, 203, 129, 245, 218, 231, 43, 191, 98, 142, 88, 131, 60, + 60, 96, 220, 133, 112, 132, 1, 180, 65, 56, 228, 249, 138, 97, 85, 158, + 35, 240, 195, 249, 63, 130, 255, 35, 162, 11, 232, 8, 187, 77, 179, 254, + 255, 17, 246, 47, 21, 11, 74, 165, 201, 162, 211, 77, 87, 183, 222, 41, + 42, 29, 206, 176, 169, 111, 229, 18, 32, 215, 33, 34, 192, 171, 124, 161, + 166, 191, 81, 91, 40, 151, 64, 114, 145, 250, 72, 164, 136, 136, 31, 61, + 226, 184, 0, 34, 33, 61, 249, 54, 172, 69, 223, 239, 46, 232, 141, 230, + 206, 63, 95, 225, 4, 98, 116, 26, 63, 188, 13, 136, 108, 168, 149, 191, + 190, 146, 238, 56, 226, 140, 240, 217, 143, 109, 195, 95, 220, 17, 141, 161, + 175, 67, 63, 214, 169, 251, 1, 116, 124, 169, 246, 235, 173, 127, 170, 93, + 194, 239, 129, 197, 222, 139, 70, 201, 146, 9, 99, 126, 180, 26, 180, 253, + 177, 69, 130, 174, 108, 40, 54, 88, 158, 87, 161, 156, 23, 244, 153, 150, + 223, 15, 249, 113, 31, 57, 252, 9, 208, 123, 26, 99, 17, 1, 127, 244, + 116, 58, 99, 160, 195, 93, 245, 205, 75, 117, 114, 44, 115, 192, 42, 128, + 159, 15, 120, 5, 113, 52, 203, 69, 112, 106, 72, 60, 12, 0, 45, 106, + 72, 15, 223, 35, 161, 206, 16, 188, 72, 118, 225, 247, 212, 41, 133, 106, + 249, 226, 95, 1, 57, 101, 13, 87, 240, 18, 97, 158, 16, 94, 128, 40, + 191, 134, 115, 71, 54, 128, 183, 96, 10, 239, 169, 207, 225, 228, 47, 126, + 80, 6, 74, 39, 22, 166, 104, 63, 73, 208, 233, 129, 128, 3, 139, 78, + 131, 124, 254, 164, 3, 165, 251, 124, 232, 196, 253, 97, 94, 14, 89, 94, + 212, 248, 237, 87, 46, 178, 37, 241, 98, 118, 228, 223, 125, 56, 102, 12, + 174, 37, 88, 68, 204, 245, 6, 150, 211, 51, 57, 184, 121, 127, 144, 168, + 72, 120, 38, 206, 48, 238, 201, 192, 14, 51, 247, 170, 57, 180, 18, 249, + 238, 131, 29, 50, 50, 24, 236, 69, 255, 51, 254, 160, 216, 136, 176, 252, + 133, 44, 48, 241, 19, 123, 241, 239, 207, 33, 224, 192, 6, 187, 194, 168, + 7, 104, 154, 122, 150, 140, 222, 150, 207, 83, 96, 36, 195, 243, 148, 239, + 4, 195, 193, 233, 32, 233, 143, 191, 54, 143, 11, 22, 39, 236, 98, 18, + 244, 244, 62, 176, 137, 225, 49, 178, 197, 89, 75, 200, 168, 7, 30, 39, + 253, 188, 184, 172, 94, 207, 107, 80, 15, 130, 0, 152, 155, 39, 103, 70, + 24, 35, 63, 206, 140, 128, 203, 48, 148, 250, 5, 179, 248, 139, 218, 58, + 144, 149, 240, 231, 211, 205, 196, 11, 250, 24, 216, 227, 192, 55, 8, 1, + 199, 122, 79, 172, 127, 165, 136, 228, 31, 110, 210, 228, 221, 95, 138, 136, + 62, 73, 113, 98, 213, 70, 236, 238, 130, 126, 193, 120, 225, 223, 47, 212, + 89, 111, 194, 65, 61, 66, 35, 71, 108, 113, 214, 43, 24, 247, 148, 20, + 15, 123, 120, 127, 193, 104, 161, 53, 225, 91, 246, 227, 68, 37, 126, 47, + 133, 57, 47, 142, 87, 137, 130, 220, 231, 38, 129, 17, 58, 197, 64, 121, + 192, 208, 60, 6, 252, 8, 23, 103, 150, 132, 1, 227, 25, 206, 9, 149, + 146, 172, 120, 71, 225, 77, 11, 195, 144, 21, 186, 144, 164, 214, 192, 118, + 218, 198, 210, 53, 245, 195, 153, 236, 112, 229, 232, 62, 195, 79, 52, 37, + 190, 201, 81, 32, 106, 4, 135, 177, 164, 89, 24, 16, 249, 189, 140, 92, + 132, 130, 181, 92, 94, 157, 94, 46, 9, 31, 123, 98, 109, 225, 35, 188, + 92, 190, 239, 84, 31, 47, 35, 11, 191, 92, 184, 36, 216, 147, 79, 97, + 72, 116, 163, 91, 164, 10, 80, 244, 64, 23, 46, 78, 248, 152, 226, 34, + 248, 229, 244, 15, 53, 4, 206, 121, 120, 109, 70, 204, 127, 251, 253, 139, + 176, 55, 31, 168, 62, 21, 234, 151, 31, 61, 225, 245, 253, 155, 87, 30, + 6, 255, 166, 229, 99, 167, 219, 59, 94, 133, 59, 213, 249, 119, 109, 30, + 131, 218, 2, 223, 145, 175, 206, 254, 94, 216, 157, 15, 137, 185, 253, 215, + 187, 39, 191, 81, 95, 130, 120, 190, 188, 64, 245, 173, 201, 222, 18, 23, + 191, 232, 92, 220, 228, 252, 231, 30, 62, 243, 254, 115, 7, 245, 186, 126, + 59, 79, 253, 91, 212, 60, 95, 31, 222, 136, 135, 224, 219, 30, 148, 13, + 229, 25, 221, 118, 67, 121, 70, 126, 158, 14, 212, 137, 121, 122, 7, 103, + 196, 34, 39, 42, 106, 84, 225, 111, 161, 122, 226, 202, 92, 137, 194, 127, + 183, 93, 255, 141, 229, 68, 89, 84, 217, 219, 222, 220, 87, 26, 224, 69, + 86, 150, 147, 0, 23, 249, 249, 185, 123, 142, 103, 101, 241, 148, 95, 18, + 224, 155, 74, 242, 215, 253, 252, 44, 39, 203, 152, 20, 212, 207, 99, 125, + 236, 33, 191, 44, 171, 34, 52, 72, 242, 47, 109, 236, 216, 117, 129, 1, + 0, 78, 11, 43, 251, 230, 223, 65, 215, 29, 232, 43, 249, 116, 24, 139, + 142, 113, 3, 14, 207, 252, 45, 20, 68, 51, 209, 80, 154, 64, 210, 142, + 21, 156, 42, 47, 190, 85, 121, 241, 39, 85, 94, 127, 171, 242, 250, 143, + 86, 158, 219, 83, 129, 215, 232, 66, 48, 67, 183, 69, 72, 214, 246, 144, + 42, 220, 75, 188, 8, 208, 132, 47, 119, 148, 120, 207, 202, 178, 2, 144, + 46, 6, 249, 68, 30, 223, 234, 144, 185, 191, 39, 85, 112, 209, 40, 171, + 200, 126, 61, 220, 61, 27, 149, 17, 244, 69, 44, 203, 221, 243, 81, 73, + 85, 36, 146, 59, 143, 185, 195, 189, 26, 220, 220, 230, 246, 103, 253, 28, + 64, 194, 13, 148, 59, 188, 178, 120, 231, 48, 191, 143, 104, 251, 8, 180, + 245, 229, 242, 66, 59, 187, 23, 118, 218, 192, 255, 235, 183, 22, 130, 253, + 249, 87, 46, 45, 156, 250, 249, 95, 103, 122, 126, 26, 237, 223, 50, 60, + 63, 115, 43, 29, 104, 106, 253, 147, 57, 99, 238, 153, 214, 12, 15, 140, + 120, 78, 102, 120, 81, 80, 163, 191, 6, 159, 166, 218, 124, 142, 170, 85, + 146, 200, 240, 10, 170, 47, 251, 215, 91, 212, 233, 94, 111, 63, 5, 5, + 127, 215, 251, 238, 18, 18, 63, 94, 111, 111, 253, 2, 176, 4, 229, 27, + 134, 131, 127, 126, 189, 192, 137, 71, 245, 232, 201, 139, 13, 117, 114, 99, + 67, 157, 252, 216, 92, 156, 28, 217, 80, 39, 79, 54, 212, 201, 149, 205, + 197, 201, 151, 13, 117, 114, 102, 67, 29, 189, 217, 160, 210, 21, 87, 91, + 208, 216, 193, 135, 13, 21, 114, 98, 67, 133, 188, 216, 92, 132, 220, 216, + 80, 33, 63, 54, 84, 200, 145, 205, 69, 200, 147, 13, 21, 114, 101, 67, + 157, 124, 217, 96, 171, 169, 67, 155, 239, 123, 5, 186, 248, 182, 91, 160, + 139, 55, 253, 2, 97, 221, 135, 155, 213, 176, 40, 113, 58, 47, 31, 30, + 248, 223, 83, 31, 143, 47, 220, 239, 0, 223, 143, 48, 236, 155, 219, 207, + 148, 47, 2, 124, 33, 186, 222, 173, 75, 200, 14, 67, 202, 3, 101, 250, + 245, 98, 71, 82, 184, 32, 133, 131, 148, 61, 73, 225, 131, 20, 30, 82, + 134, 24, 72, 149, 76, 177, 11, 117, 12, 119, 193, 219, 142, 188, 237, 131, + 183, 189, 75, 66, 46, 160, 185, 62, 0, 227, 22, 114, 1, 146, 145, 125, + 1, 234, 38, 66, 73, 128, 180, 174, 161, 162, 59, 106, 184, 131, 87, 158, + 188, 98, 158, 33, 160, 149, 227, 101, 101, 220, 136, 62, 159, 246, 191, 143, + 48, 8, 123, 240, 23, 16, 134, 223, 207, 255, 86, 132, 1, 163, 253, 137, + 190, 175, 248, 123, 1, 54, 129, 34, 18, 199, 23, 81, 16, 152, 69, 150, + 184, 187, 16, 33, 85, 16, 84, 223, 243, 133, 160, 170, 82, 132, 187, 23, + 121, 73, 96, 137, 79, 12, 22, 18, 84, 226, 223, 6, 4, 99, 88, 252, + 124, 228, 206, 103, 64, 162, 98, 20, 50, 178, 108, 84, 136, 202, 234, 151, + 219, 23, 126, 176, 66, 237, 10, 247, 60, 222, 38, 17, 81, 56, 188, 151, + 4, 216, 126, 170, 223, 110, 84, 5, 190, 132, 248, 227, 136, 202, 81, 30, + 248, 17, 168, 79, 85, 100, 220, 89, 216, 156, 200, 73, 146, 76, 118, 23, + 252, 138, 2, 201, 8, 187, 140, 229, 37, 210, 176, 164, 240, 188, 196, 31, + 27, 62, 115, 132, 37, 220, 115, 2, 208, 89, 100, 98, 20, 30, 189, 165, + 220, 203, 156, 194, 3, 226, 98, 213, 168, 239, 133, 71, 4, 154, 203, 139, + 188, 10, 232, 135, 140, 40, 170, 168, 176, 111, 1, 183, 69, 163, 34, 212, + 14, 136, 3, 255, 87, 163, 28, 241, 11, 198, 10, 130, 40, 1, 254, 226, + 20, 142, 248, 200, 82, 184, 168, 34, 71, 17, 1, 113, 164, 87, 188, 10, + 88, 33, 170, 136, 208, 57, 4, 30, 244, 141, 3, 4, 3, 152, 87, 8, + 250, 135, 183, 62, 207, 162, 41, 161, 151, 169, 255, 200, 46, 82, 255, 198, + 54, 82, 255, 139, 247, 145, 250, 35, 27, 233, 13, 7, 41, 204, 27, 14, + 82, 94, 167, 241, 36, 237, 165, 23, 172, 35, 234, 12, 95, 28, 59, 201, + 216, 63, 52, 181, 196, 127, 208, 113, 110, 143, 149, 254, 93, 1, 234, 172, + 186, 55, 1, 113, 247, 150, 59, 161, 187, 147, 59, 161, 144, 83, 162, 96, + 99, 2, 68, 162, 176, 179, 35, 34, 144, 77, 124, 186, 67, 99, 186, 59, + 30, 118, 59, 190, 17, 175, 117, 23, 231, 254, 139, 244, 99, 44, 228, 115, + 127, 50, 59, 115, 241, 19, 32, 150, 171, 158, 224, 229, 87, 248, 183, 161, + 117, 170, 234, 228, 123, 136, 35, 238, 250, 136, 247, 47, 153, 231, 80, 49, + 66, 92, 131, 241, 228, 87, 22, 209, 163, 19, 98, 38, 142, 85, 16, 241, + 41, 172, 40, 191, 192, 17, 232, 151, 235, 167, 12, 83, 13, 143, 83, 253, + 193, 129, 170, 223, 88, 21, 100, 43, 188, 225, 220, 235, 238, 228, 253, 235, + 229, 38, 121, 195, 185, 215, 221, 201, 251, 215, 113, 222, 127, 30, 80, 87, + 235, 159, 0, 211, 102, 235, 4, 82, 191, 194, 191, 13, 209, 83, 85, 97, + 183, 85, 68, 105, 10, 84, 44, 170, 10, 254, 24, 133, 168, 40, 251, 222, + 169, 84, 22, 221, 132, 240, 64, 148, 120, 164, 70, 1, 133, 121, 53, 202, + 183, 151, 206, 123, 195, 57, 204, 106, 208, 105, 140, 115, 239, 145, 177, 253, + 216, 114, 57, 85, 252, 215, 176, 105, 224, 102, 234, 46, 240, 60, 245, 10, + 179, 6, 110, 166, 238, 2, 207, 83, 71, 4, 251, 98, 118, 63, 82, 25, + 99, 134, 154, 186, 29, 85, 212, 28, 115, 142, 22, 144, 208, 207, 224, 51, + 26, 96, 25, 139, 123, 236, 224, 7, 255, 226, 250, 7, 164, 180, 244, 129, + 200, 6, 161, 4, 63, 82, 159, 3, 43, 55, 109, 107, 122, 145, 39, 221, + 192, 115, 110, 164, 37, 31, 169, 215, 41, 167, 226, 196, 27, 13, 86, 112, + 178, 110, 123, 207, 138, 45, 130, 182, 228, 120, 26, 253, 218, 248, 125, 100, + 0, 197, 114, 35, 240, 117, 6, 245, 159, 170, 194, 150, 67, 1, 131, 143, + 227, 248, 112, 115, 255, 47, 231, 116, 200, 143, 217, 62, 28, 124, 153, 124, + 165, 182, 24, 19, 25, 254, 246, 240, 167, 83, 207, 167, 10, 154, 30, 58, + 139, 248, 112, 28, 201, 135, 224, 160, 158, 248, 47, 65, 182, 196, 50, 134, + 203, 187, 201, 202, 91, 250, 205, 255, 129, 170, 140, 7, 63, 59, 121, 229, + 30, 92, 115, 52, 14, 103, 121, 254, 134, 45, 221, 161, 153, 119, 67, 155, + 250, 254, 5, 118, 32, 152, 192, 26, 131, 5, 231, 25, 135, 233, 216, 189, + 153, 63, 88, 91, 18, 69, 147, 243, 52, 223, 101, 5, 199, 210, 156, 122, + 123, 245, 233, 249, 23, 95, 189, 237, 91, 98, 224, 199, 160, 174, 45, 58, + 134, 123, 179, 190, 192, 145, 65, 224, 30, 99, 119, 182, 34, 158, 150, 166, + 101, 16, 159, 53, 69, 98, 23, 83, 194, 127, 49, 160, 244, 113, 88, 79, + 219, 223, 30, 184, 23, 73, 59, 72, 122, 185, 50, 138, 219, 210, 105, 202, + 253, 90, 53, 143, 114, 140, 205, 43, 235, 198, 220, 144, 250, 80, 34, 166, + 140, 104, 115, 1, 51, 13, 162, 239, 201, 252, 4, 199, 140, 223, 12, 128, + 189, 173, 97, 101, 218, 106, 57, 131, 39, 83, 135, 85, 181, 59, 175, 166, + 248, 110, 53, 58, 234, 181, 157, 191, 84, 19, 49, 186, 128, 142, 225, 50, + 193, 227, 192, 67, 189, 31, 208, 235, 12, 22, 189, 35, 198, 223, 80, 227, + 202, 51, 6, 175, 138, 195, 178, 127, 53, 172, 153, 99, 237, 78, 142, 122, + 252, 45, 3, 25, 230, 193, 173, 176, 144, 5, 75, 8, 222, 7, 91, 254, + 19, 184, 15, 6, 45, 90, 127, 182, 90, 18, 182, 239, 180, 77, 241, 142, + 2, 129, 246, 102, 108, 16, 187, 160, 157, 127, 151, 124, 96, 14, 137, 37, + 18, 224, 73, 115, 255, 205, 123, 113, 69, 223, 173, 78, 201, 255, 9, 117, + 228, 33, 212, 133, 7, 88, 93, 223, 92, 223, 219, 93, 68, 60, 95, 84, + 145, 139, 23, 107, 236, 213, 69, 50, 214, 191, 46, 118, 242, 165, 19, 36, + 144, 203, 1, 161, 195, 17, 140, 169, 125, 48, 73, 185, 18, 206, 66, 106, + 95, 250, 39, 74, 255, 160, 12, 188, 247, 34, 248, 14, 174, 112, 61, 134, + 142, 57, 52, 138, 221, 178, 119, 216, 139, 32, 249, 254, 18, 35, 156, 175, + 92, 39, 176, 55, 248, 199, 21, 247, 63, 255, 243, 143, 43, 30, 125, 197, + 16, 187, 102, 98, 140, 249, 15, 244, 140, 82, 124, 248, 74, 140, 139, 225, + 149, 185, 42, 161, 106, 227, 6, 45, 84, 191, 209, 22, 112, 228, 197, 231, + 237, 213, 215, 210, 243, 101, 184, 77, 234, 250, 184, 132, 240, 62, 77, 17, + 221, 210, 20, 111, 175, 74, 207, 40, 75, 92, 253, 227, 151, 171, 98, 137, + 130, 148, 210, 221, 181, 255, 114, 227, 159, 126, 147, 235, 251, 150, 31, 81, + 248, 162, 136, 167, 66, 165, 112, 143, 184, 31, 232, 81, 32, 93, 23, 63, + 1, 244, 54, 154, 235, 28, 170, 40, 154, 30, 17, 47, 14, 100, 21, 22, + 54, 172, 40, 178, 214, 16, 241, 204, 54, 254, 149, 244, 119, 107, 61, 135, + 45, 25, 13, 142, 44, 24, 216, 235, 113, 113, 23, 103, 64, 230, 253, 33, + 193, 56, 97, 196, 63, 48, 174, 210, 95, 27, 151, 143, 48, 126, 222, 208, + 64, 136, 127, 167, 243, 17, 236, 253, 21, 183, 189, 226, 195, 149, 99, 136, + 179, 96, 126, 175, 136, 179, 198, 211, 10, 57, 112, 27, 186, 97, 90, 4, + 68, 176, 58, 200, 225, 207, 221, 87, 52, 219, 199, 123, 131, 145, 171, 79, + 52, 46, 30, 0, 220, 151, 139, 171, 98, 132, 44, 85, 62, 114, 249, 201, + 215, 177, 226, 17, 1, 123, 243, 43, 53, 255, 205, 250, 253, 51, 181, 249, + 231, 60, 50, 254, 231, 156, 250, 242, 241, 51, 185, 255, 246, 229, 18, 13, + 56, 116, 202, 186, 191, 167, 60, 160, 169, 182, 182, 245, 85, 235, 22, 190, + 111, 143, 239, 161, 139, 138, 192, 167, 248, 87, 16, 47, 63, 19, 3, 127, + 104, 234, 234, 19, 128, 224, 242, 75, 196, 252, 124, 73, 182, 243, 39, 232, + 231, 205, 229, 23, 168, 253, 57, 116, 175, 11, 143, 85, 73, 124, 249, 99, + 128, 243, 32, 126, 112, 80, 55, 41, 138, 67, 188, 161, 52, 50, 66, 50, + 176, 59, 238, 25, 143, 184, 253, 34, 231, 25, 75, 225, 140, 37, 146, 113, + 23, 152, 74, 191, 56, 29, 240, 205, 227, 241, 148, 147, 96, 163, 203, 192, + 110, 254, 50, 226, 83, 141, 167, 217, 48, 248, 120, 112, 209, 70, 222, 2, + 191, 133, 254, 77, 231, 112, 2, 121, 9, 108, 82, 209, 162, 20, 81, 229, + 124, 118, 198, 149, 29, 157, 248, 133, 124, 25, 250, 182, 250, 192, 96, 134, + 16, 180, 223, 165, 183, 156, 65, 157, 44, 28, 195, 213, 135, 184, 160, 192, + 228, 19, 153, 22, 116, 137, 2, 180, 142, 104, 90, 52, 116, 26, 55, 50, + 136, 207, 137, 192, 89, 10, 186, 157, 192, 120, 231, 240, 32, 61, 244, 77, + 125, 5, 127, 240, 44, 63, 88, 154, 163, 239, 103, 222, 183, 152, 156, 35, + 52, 30, 120, 233, 151, 131, 15, 54, 63, 1, 103, 245, 96, 176, 24, 238, + 227, 131, 240, 14, 185, 56, 155, 134, 203, 190, 181, 114, 129, 213, 241, 198, + 154, 11, 123, 4, 109, 16, 216, 203, 136, 120, 241, 98, 174, 206, 41, 7, + 255, 202, 221, 26, 244, 42, 108, 182, 136, 125, 10, 155, 45, 114, 207, 159, + 94, 24, 45, 10, 1, 161, 145, 33, 23, 172, 254, 163, 50, 232, 25, 94, + 216, 135, 75, 103, 118, 73, 121, 28, 252, 250, 32, 189, 115, 12, 96, 8, + 251, 51, 23, 82, 249, 135, 203, 0, 184, 240, 34, 60, 92, 250, 208, 133, + 103, 241, 225, 18, 193, 11, 79, 210, 195, 101, 0, 95, 120, 145, 33, 139, + 15, 224, 147, 149, 164, 191, 42, 142, 247, 54, 174, 184, 15, 33, 239, 139, + 4, 49, 97, 248, 120, 127, 240, 215, 87, 32, 59, 124, 2, 98, 119, 67, + 128, 12, 189, 244, 200, 174, 151, 35, 87, 242, 205, 51, 106, 121, 194, 80, + 127, 195, 249, 151, 99, 163, 241, 164, 243, 124, 65, 42, 100, 31, 136, 3, + 11, 114, 75, 131, 220, 127, 119, 208, 132, 226, 18, 175, 74, 223, 162, 73, + 225, 38, 50, 142, 12, 110, 224, 237, 38, 40, 192, 189, 85, 64, 196, 2, + 226, 89, 1, 241, 230, 249, 228, 82, 206, 47, 10, 248, 203, 111, 147, 190, + 246, 31, 184, 187, 32, 225, 230, 22, 241, 131, 111, 194, 136, 14, 232, 110, + 110, 254, 125, 5, 130, 223, 6, 123, 186, 193, 243, 4, 238, 163, 255, 49, + 32, 11, 164, 212, 45, 241, 98, 26, 52, 8, 180, 249, 98, 140, 217, 199, + 239, 102, 31, 191, 200, 62, 192, 236, 131, 119, 179, 15, 94, 100, 167, 125, + 207, 117, 155, 200, 213, 56, 114, 53, 240, 177, 215, 149, 140, 120, 223, 209, + 220, 81, 160, 37, 4, 12, 9, 40, 155, 96, 154, 131, 183, 16, 151, 216, + 164, 58, 54, 117, 229, 216, 175, 113, 16, 240, 0, 186, 59, 155, 195, 154, + 38, 123, 139, 139, 144, 31, 30, 13, 201, 66, 170, 209, 151, 194, 215, 161, + 212, 75, 153, 170, 191, 123, 247, 190, 17, 46, 11, 7, 77, 142, 207, 24, + 85, 191, 254, 149, 239, 29, 0, 25, 93, 96, 69, 215, 104, 61, 19, 161, + 176, 129, 57, 82, 67, 82, 1, 178, 169, 35, 224, 15, 207, 56, 221, 43, + 74, 100, 81, 231, 69, 238, 141, 146, 64, 245, 129, 247, 31, 89, 68, 159, + 152, 68, 189, 5, 140, 170, 57, 7, 17, 71, 2, 112, 225, 31, 199, 179, + 228, 143, 245, 141, 15, 41, 250, 0, 130, 23, 16, 121, 34, 22, 116, 14, + 233, 24, 186, 208, 28, 195, 198, 27, 207, 172, 1, 160, 219, 147, 195, 204, + 3, 238, 133, 181, 56, 134, 29, 137, 214, 13, 142, 129, 86, 218, 48, 206, + 176, 151, 9, 223, 85, 226, 211, 114, 55, 247, 29, 242, 16, 224, 33, 142, + 244, 140, 145, 125, 20, 241, 17, 81, 18, 167, 133, 166, 3, 226, 129, 23, + 178, 254, 63, 2, 28, 183, 92, 224, 213, 146, 10, 26, 243, 177, 248, 161, + 171, 175, 221, 210, 2, 121, 215, 117, 82, 233, 136, 248, 101, 32, 110, 11, + 169, 227, 53, 0, 228, 222, 45, 13, 208, 244, 201, 189, 243, 177, 89, 67, + 211, 199, 199, 75, 199, 231, 46, 60, 175, 141, 251, 209, 253, 185, 199, 204, + 111, 89, 164, 31, 193, 247, 192, 250, 248, 250, 224, 26, 147, 189, 231, 126, + 9, 220, 95, 188, 134, 32, 27, 32, 242, 48, 248, 184, 51, 52, 78, 238, + 9, 75, 50, 172, 35, 19, 230, 24, 42, 139, 240, 148, 177, 0, 160, 15, + 76, 188, 145, 249, 132, 6, 163, 20, 207, 82, 196, 237, 228, 211, 112, 116, + 244, 60, 169, 89, 232, 119, 211, 215, 128, 210, 14, 20, 65, 39, 6, 7, + 191, 138, 129, 8, 171, 159, 22, 71, 120, 53, 128, 28, 241, 230, 26, 57, + 121, 52, 250, 229, 249, 220, 160, 157, 251, 229, 100, 166, 222, 159, 205, 172, + 107, 255, 182, 241, 153, 176, 1, 84, 34, 160, 1, 98, 72, 158, 224, 67, + 72, 250, 176, 6, 222, 156, 247, 211, 141, 179, 147, 27, 224, 3, 204, 137, + 227, 206, 131, 135, 78, 223, 55, 39, 31, 9, 107, 234, 133, 8, 250, 140, + 70, 248, 227, 45, 251, 208, 12, 80, 151, 151, 132, 59, 240, 221, 174, 34, + 252, 143, 66, 104, 168, 184, 24, 193, 126, 69, 194, 107, 57, 18, 90, 199, + 207, 151, 31, 238, 255, 229, 188, 118, 18, 112, 92, 3, 95, 195, 216, 143, + 32, 247, 19, 110, 255, 23, 69, 252, 102, 240, 183, 155, 91, 64, 123, 188, + 143, 9, 143, 183, 194, 136, 77, 231, 39, 130, 243, 176, 38, 152, 96, 212, + 106, 3, 133, 250, 244, 0, 137, 135, 6, 46, 232, 163, 151, 81, 234, 183, + 80, 58, 117, 247, 199, 193, 174, 242, 176, 62, 124, 87, 164, 40, 118, 21, + 159, 15, 138, 15, 179, 120, 225, 60, 160, 57, 246, 39, 148, 107, 96, 38, + 254, 229, 82, 212, 39, 128, 159, 3, 220, 222, 133, 11, 24, 107, 228, 162, + 169, 217, 87, 52, 18, 34, 137, 208, 197, 7, 226, 55, 244, 202, 161, 232, + 91, 244, 209, 201, 125, 241, 13, 138, 137, 161, 229, 3, 204, 175, 239, 156, + 244, 1, 128, 120, 90, 75, 152, 114, 255, 47, 130, 129, 200, 245, 60, 138, + 222, 19, 148, 239, 127, 9, 78, 0, 69, 116, 79, 112, 40, 20, 120, 29, + 253, 174, 202, 14, 14, 81, 111, 168, 221, 253, 69, 152, 56, 224, 165, 212, + 64, 104, 101, 15, 146, 132, 136, 30, 19, 180, 64, 118, 120, 135, 102, 60, + 121, 176, 109, 222, 162, 27, 127, 144, 44, 127, 78, 45, 78, 167, 70, 228, + 243, 232, 160, 79, 12, 48, 14, 193, 74, 129, 95, 152, 63, 165, 42, 145, + 99, 115, 168, 98, 221, 157, 84, 43, 62, 213, 8, 55, 116, 34, 42, 239, + 50, 152, 88, 250, 91, 14, 176, 144, 212, 16, 108, 193, 30, 232, 11, 121, + 59, 208, 24, 1, 254, 120, 34, 92, 160, 233, 193, 25, 188, 216, 139, 23, + 224, 59, 98, 13, 50, 83, 103, 187, 253, 142, 128, 229, 192, 134, 249, 208, + 122, 5, 41, 2, 37, 31, 39, 195, 176, 131, 91, 169, 31, 174, 110, 63, + 220, 31, 85, 17, 33, 33, 209, 123, 194, 102, 30, 190, 126, 254, 128, 252, + 194, 135, 47, 15, 15, 31, 48, 225, 131, 111, 173, 254, 15, 92, 91, 79, + 135, 14, 94, 5, 185, 177, 119, 196, 89, 248, 169, 158, 111, 44, 184, 32, + 243, 243, 197, 22, 88, 59, 100, 76, 136, 171, 93, 178, 240, 158, 169, 93, + 144, 198, 135, 210, 246, 65, 154, 112, 74, 187, 216, 114, 126, 154, 24, 46, + 27, 164, 73, 225, 178, 65, 154, 28, 42, 139, 3, 217, 178, 159, 174, 182, + 220, 37, 245, 199, 31, 176, 77, 119, 240, 178, 59, 188, 236, 225, 101, 207, + 129, 140, 8, 162, 48, 134, 175, 39, 30, 123, 161, 195, 31, 121, 223, 138, + 157, 218, 99, 233, 8, 20, 138, 64, 222, 8, 212, 2, 207, 240, 183, 231, + 78, 222, 212, 142, 232, 231, 35, 8, 60, 190, 2, 27, 182, 233, 31, 148, + 206, 2, 63, 128, 228, 254, 144, 202, 145, 84, 142, 164, 190, 96, 161, 30, + 13, 99, 238, 171, 227, 66, 194, 216, 161, 222, 111, 73, 94, 73, 211, 53, + 245, 177, 5, 88, 184, 143, 248, 146, 56, 88, 242, 53, 128, 190, 198, 237, + 141, 234, 144, 175, 66, 69, 29, 106, 51, 53, 103, 244, 206, 162, 14, 59, + 223, 122, 51, 195, 155, 254, 188, 248, 3, 76, 2, 253, 230, 11, 144, 108, + 223, 4, 201, 246, 251, 65, 18, 84, 251, 147, 32, 18, 212, 246, 157, 0, + 9, 114, 223, 129, 52, 135, 219, 58, 200, 180, 15, 29, 109, 224, 210, 255, + 112, 127, 54, 142, 128, 155, 38, 3, 143, 144, 129, 70, 158, 14, 253, 66, + 238, 198, 191, 255, 231, 29, 179, 236, 66, 25, 119, 223, 155, 125, 255, 170, + 208, 254, 175, 21, 213, 223, 169, 64, 255, 86, 53, 225, 201, 74, 188, 133, + 208, 95, 4, 74, 240, 221, 173, 83, 33, 86, 224, 141, 83, 149, 253, 139, + 83, 149, 55, 154, 62, 83, 47, 12, 142, 179, 237, 235, 24, 86, 32, 179, + 250, 172, 51, 112, 12, 230, 108, 64, 148, 8, 194, 131, 109, 18, 183, 142, + 223, 208, 33, 188, 209, 208, 187, 71, 38, 52, 153, 213, 59, 94, 192, 67, + 117, 248, 135, 87, 253, 63, 142, 76, 55, 18, 233, 215, 223, 216, 183, 23, + 21, 86, 132, 11, 10, 255, 20, 255, 47, 200, 136, 23, 151, 241, 102, 232, + 139, 59, 191, 24, 159, 225, 8, 104, 31, 191, 147, 163, 140, 67, 118, 223, + 231, 128, 126, 30, 88, 0, 232, 14, 33, 62, 145, 15, 187, 15, 20, 125, + 172, 249, 88, 230, 227, 139, 27, 146, 216, 136, 95, 183, 175, 204, 60, 175, + 124, 11, 180, 100, 23, 178, 142, 15, 116, 109, 87, 159, 34, 99, 154, 59, + 104, 211, 240, 50, 74, 248, 75, 40, 253, 142, 243, 249, 135, 193, 108, 227, + 160, 246, 255, 9, 184, 111, 13, 247, 231, 153, 47, 123, 233, 116, 25, 129, + 251, 13, 117, 38, 151, 71, 199, 160, 44, 251, 255, 216, 123, 243, 198, 182, + 141, 36, 111, 248, 127, 124, 10, 152, 134, 195, 11, 160, 8, 128, 148, 108, + 73, 144, 55, 177, 39, 27, 239, 174, 252, 122, 147, 217, 217, 100, 52, 50, + 31, 136, 164, 68, 88, 188, 76, 82, 226, 161, 240, 187, 63, 117, 116, 55, + 26, 23, 117, 196, 78, 102, 158, 55, 147, 145, 9, 116, 55, 250, 238, 234, + 234, 234, 170, 95, 201, 205, 71, 202, 104, 17, 161, 137, 173, 123, 176, 16, + 79, 219, 155, 128, 121, 35, 193, 164, 91, 135, 168, 61, 203, 213, 228, 0, + 146, 243, 76, 170, 168, 171, 157, 15, 157, 25, 68, 99, 56, 107, 162, 1, + 9, 31, 32, 128, 155, 177, 222, 155, 192, 205, 33, 218, 161, 241, 137, 252, + 64, 52, 52, 123, 12, 178, 138, 18, 18, 67, 68, 63, 156, 65, 125, 225, + 88, 46, 254, 184, 110, 25, 6, 10, 6, 243, 22, 242, 198, 99, 37, 225, + 249, 49, 82, 225, 48, 140, 198, 250, 153, 145, 204, 109, 225, 48, 219, 239, + 229, 152, 131, 255, 69, 100, 161, 38, 134, 247, 86, 46, 66, 96, 137, 38, + 177, 37, 197, 174, 139, 22, 6, 19, 220, 111, 73, 248, 65, 170, 129, 171, + 91, 251, 114, 241, 120, 228, 138, 235, 172, 141, 216, 190, 134, 160, 196, 192, + 122, 54, 25, 142, 196, 108, 140, 172, 167, 172, 30, 204, 46, 170, 159, 229, + 58, 243, 33, 78, 90, 81, 205, 10, 129, 122, 37, 65, 110, 201, 254, 39, + 109, 93, 160, 164, 71, 4, 109, 167, 165, 71, 152, 61, 60, 59, 248, 4, + 180, 191, 165, 91, 8, 72, 139, 48, 60, 163, 173, 217, 227, 167, 83, 199, + 26, 197, 211, 193, 165, 161, 247, 204, 250, 9, 49, 235, 119, 214, 168, 110, + 245, 80, 18, 84, 119, 171, 48, 113, 88, 245, 205, 172, 71, 51, 45, 22, + 197, 200, 208, 204, 108, 90, 180, 222, 107, 36, 234, 15, 83, 6, 243, 71, + 7, 197, 100, 250, 3, 41, 62, 161, 61, 22, 203, 156, 79, 98, 5, 12, + 193, 132, 11, 25, 77, 70, 139, 188, 191, 154, 194, 136, 116, 86, 200, 44, + 226, 226, 89, 145, 200, 33, 143, 124, 61, 129, 62, 106, 112, 142, 88, 74, + 214, 227, 7, 221, 141, 35, 235, 188, 114, 146, 247, 226, 15, 161, 167, 110, + 1, 61, 85, 77, 242, 145, 78, 106, 13, 148, 147, 203, 213, 205, 146, 20, + 89, 240, 142, 3, 63, 62, 16, 139, 26, 171, 43, 152, 84, 77, 197, 110, + 132, 199, 124, 60, 30, 178, 172, 178, 132, 186, 111, 112, 148, 243, 108, 213, + 79, 182, 232, 35, 91, 246, 143, 205, 125, 83, 218, 150, 12, 197, 80, 196, + 109, 74, 72, 52, 99, 114, 183, 172, 123, 53, 203, 213, 111, 22, 196, 245, + 130, 133, 238, 62, 219, 242, 47, 111, 92, 215, 98, 96, 255, 160, 97, 93, + 67, 111, 21, 146, 137, 39, 142, 235, 58, 57, 176, 235, 47, 54, 178, 92, + 217, 63, 102, 104, 121, 191, 75, 15, 243, 131, 70, 120, 243, 7, 15, 241, + 230, 137, 99, 156, 104, 192, 23, 26, 193, 205, 63, 201, 16, 226, 115, 79, + 31, 206, 7, 140, 164, 92, 170, 157, 245, 31, 51, 146, 235, 47, 79, 131, + 147, 75, 245, 139, 173, 212, 245, 239, 76, 131, 105, 4, 159, 188, 66, 229, + 250, 236, 108, 254, 152, 113, 221, 60, 113, 92, 181, 234, 127, 145, 81, 219, + 252, 17, 163, 166, 134, 238, 17, 171, 145, 111, 64, 232, 210, 92, 100, 95, + 202, 222, 178, 0, 173, 233, 58, 250, 133, 10, 142, 26, 18, 160, 100, 152, + 23, 176, 165, 177, 35, 212, 242, 112, 8, 117, 41, 227, 60, 49, 146, 92, + 114, 104, 18, 70, 28, 41, 118, 197, 121, 193, 160, 139, 47, 146, 240, 76, + 212, 209, 54, 74, 35, 102, 177, 127, 184, 248, 156, 12, 103, 172, 65, 95, + 232, 129, 197, 253, 101, 162, 232, 94, 155, 19, 223, 67, 238, 239, 19, 197, + 197, 86, 208, 179, 254, 28, 167, 75, 132, 90, 40, 238, 234, 253, 202, 93, + 181, 196, 74, 47, 230, 254, 245, 222, 74, 97, 249, 76, 9, 107, 207, 172, + 203, 126, 46, 33, 175, 93, 121, 87, 61, 113, 189, 151, 37, 68, 35, 86, + 253, 175, 93, 132, 11, 133, 41, 190, 88, 179, 253, 42, 222, 92, 219, 115, + 215, 158, 123, 246, 220, 207, 140, 133, 157, 26, 7, 59, 49, 6, 118, 162, + 255, 181, 121, 43, 234, 99, 205, 45, 175, 148, 184, 243, 128, 211, 235, 44, + 186, 92, 147, 136, 84, 245, 32, 222, 100, 35, 182, 207, 98, 22, 148, 78, + 96, 14, 59, 216, 211, 157, 97, 116, 177, 45, 177, 30, 202, 236, 102, 92, + 41, 187, 182, 143, 58, 62, 101, 155, 164, 149, 56, 195, 91, 100, 234, 61, + 71, 32, 201, 10, 28, 32, 95, 87, 248, 36, 234, 161, 224, 222, 52, 33, + 187, 70, 80, 130, 201, 221, 137, 198, 243, 254, 108, 81, 65, 60, 201, 179, + 149, 189, 182, 55, 118, 247, 28, 190, 137, 4, 60, 49, 126, 224, 238, 74, + 142, 137, 223, 105, 137, 189, 252, 196, 145, 204, 19, 78, 35, 252, 191, 220, + 100, 239, 56, 55, 56, 102, 112, 244, 17, 28, 36, 42, 48, 51, 96, 29, + 83, 188, 107, 227, 7, 242, 181, 138, 45, 228, 135, 102, 181, 170, 47, 77, + 60, 98, 193, 106, 68, 199, 172, 208, 255, 140, 183, 10, 57, 18, 116, 2, + 158, 79, 102, 183, 210, 105, 34, 94, 43, 100, 151, 101, 71, 200, 125, 14, + 205, 51, 190, 86, 145, 64, 150, 50, 30, 134, 190, 163, 13, 189, 126, 232, + 229, 15, 216, 35, 167, 120, 57, 205, 46, 190, 225, 80, 186, 230, 204, 209, + 34, 95, 14, 38, 116, 37, 50, 131, 166, 79, 39, 4, 223, 201, 215, 59, + 120, 55, 90, 78, 84, 137, 180, 35, 251, 159, 81, 61, 23, 69, 81, 28, + 53, 42, 199, 119, 9, 250, 229, 23, 44, 81, 148, 140, 156, 42, 205, 172, + 93, 248, 254, 176, 190, 138, 90, 91, 40, 99, 34, 213, 19, 95, 57, 5, + 108, 152, 45, 4, 114, 73, 118, 106, 140, 162, 229, 198, 235, 48, 238, 240, + 123, 112, 143, 217, 158, 72, 40, 54, 242, 156, 126, 126, 236, 199, 170, 138, + 178, 131, 227, 206, 213, 117, 64, 168, 123, 230, 38, 154, 38, 141, 21, 138, + 22, 223, 53, 198, 251, 195, 179, 103, 176, 126, 160, 203, 74, 116, 147, 168, + 90, 109, 56, 39, 120, 215, 47, 178, 136, 47, 249, 163, 43, 32, 45, 48, + 66, 9, 85, 182, 244, 114, 223, 89, 157, 59, 235, 206, 167, 11, 135, 39, + 212, 42, 6, 216, 28, 221, 18, 144, 78, 194, 51, 40, 106, 57, 215, 173, + 227, 45, 11, 29, 198, 91, 3, 150, 16, 154, 7, 220, 205, 235, 21, 203, + 123, 237, 31, 54, 171, 172, 44, 249, 252, 196, 55, 27, 171, 59, 235, 185, + 227, 111, 177, 254, 132, 121, 144, 38, 56, 73, 235, 98, 116, 134, 27, 157, + 162, 73, 240, 145, 241, 35, 25, 202, 138, 102, 160, 161, 234, 32, 156, 15, + 32, 140, 105, 224, 251, 74, 19, 205, 76, 209, 227, 235, 53, 106, 205, 217, + 230, 245, 49, 173, 225, 31, 171, 182, 89, 175, 95, 147, 19, 133, 193, 217, + 143, 103, 215, 231, 231, 16, 127, 13, 121, 122, 12, 108, 88, 137, 198, 232, + 158, 152, 162, 163, 243, 42, 57, 225, 133, 122, 235, 84, 3, 82, 216, 103, + 230, 187, 202, 115, 160, 2, 68, 145, 204, 243, 234, 97, 58, 1, 69, 83, + 150, 102, 116, 132, 194, 172, 138, 170, 141, 135, 181, 25, 138, 122, 72, 82, + 115, 157, 160, 52, 215, 85, 18, 0, 54, 155, 72, 102, 8, 87, 241, 204, + 205, 170, 163, 144, 43, 195, 115, 177, 46, 70, 232, 84, 244, 10, 101, 77, + 37, 160, 1, 107, 24, 55, 88, 64, 189, 62, 236, 240, 34, 166, 35, 61, + 27, 29, 199, 42, 193, 168, 146, 11, 123, 249, 49, 109, 230, 253, 58, 50, + 60, 154, 230, 133, 114, 133, 36, 84, 159, 33, 219, 254, 140, 248, 129, 17, + 172, 217, 104, 42, 131, 96, 175, 183, 75, 29, 1, 96, 136, 138, 198, 82, + 41, 79, 19, 124, 247, 81, 160, 149, 82, 162, 150, 85, 206, 217, 247, 211, + 10, 24, 241, 190, 207, 109, 51, 187, 228, 16, 73, 21, 224, 152, 229, 159, + 203, 164, 169, 49, 159, 247, 71, 23, 80, 4, 210, 187, 196, 149, 41, 226, + 253, 234, 170, 227, 154, 74, 57, 231, 217, 208, 115, 251, 161, 48, 183, 1, + 172, 189, 13, 214, 60, 161, 126, 14, 159, 252, 173, 240, 19, 52, 80, 73, + 235, 171, 195, 7, 223, 22, 126, 16, 18, 126, 97, 92, 146, 25, 206, 102, + 97, 242, 227, 239, 118, 126, 172, 138, 204, 249, 242, 135, 240, 240, 34, 249, + 241, 98, 57, 49, 47, 134, 147, 238, 245, 28, 13, 54, 132, 231, 148, 242, + 142, 150, 62, 52, 135, 130, 134, 255, 24, 210, 215, 179, 201, 130, 103, 5, + 125, 73, 31, 94, 172, 205, 87, 77, 179, 215, 191, 106, 152, 149, 242, 143, + 152, 14, 151, 141, 251, 82, 132, 81, 190, 63, 170, 112, 239, 128, 195, 171, + 137, 220, 79, 57, 119, 113, 160, 208, 115, 143, 121, 246, 159, 153, 103, 175, + 148, 79, 85, 102, 24, 252, 11, 5, 107, 217, 125, 171, 125, 45, 238, 83, + 66, 73, 49, 97, 153, 247, 87, 102, 101, 65, 115, 187, 103, 74, 126, 30, + 91, 91, 37, 251, 25, 115, 12, 83, 44, 158, 178, 112, 238, 64, 149, 7, + 226, 177, 126, 184, 56, 236, 150, 237, 242, 223, 248, 231, 199, 11, 180, 60, + 136, 175, 115, 78, 225, 61, 90, 192, 138, 184, 76, 114, 178, 253, 21, 1, + 70, 218, 137, 69, 80, 254, 161, 121, 248, 55, 247, 208, 131, 10, 82, 77, + 230, 113, 13, 137, 119, 150, 144, 202, 77, 114, 25, 49, 97, 216, 81, 180, + 158, 177, 77, 117, 158, 153, 227, 254, 72, 175, 103, 222, 185, 42, 50, 30, + 61, 115, 26, 118, 175, 25, 204, 19, 191, 38, 203, 154, 29, 92, 178, 70, + 127, 130, 159, 73, 115, 73, 39, 65, 30, 132, 232, 20, 166, 44, 53, 150, + 178, 20, 36, 40, 149, 138, 236, 21, 24, 58, 243, 181, 89, 159, 14, 195, + 249, 136, 240, 172, 231, 131, 112, 218, 239, 116, 111, 166, 81, 207, 100, 253, + 166, 164, 202, 210, 229, 12, 17, 183, 125, 194, 122, 227, 103, 188, 239, 225, + 56, 1, 102, 84, 151, 52, 233, 91, 245, 200, 251, 234, 15, 238, 225, 223, + 160, 159, 127, 240, 14, 93, 232, 111, 223, 136, 201, 173, 226, 230, 37, 155, + 224, 41, 79, 194, 250, 57, 82, 51, 86, 254, 121, 91, 178, 89, 153, 201, + 46, 161, 14, 211, 86, 112, 202, 72, 141, 21, 91, 33, 73, 230, 16, 118, + 123, 60, 238, 232, 180, 50, 169, 178, 148, 152, 12, 150, 184, 138, 136, 109, + 75, 44, 175, 33, 216, 224, 116, 222, 68, 244, 31, 159, 53, 125, 102, 150, + 238, 44, 207, 241, 182, 8, 4, 5, 187, 119, 194, 179, 66, 19, 155, 51, + 156, 44, 251, 179, 110, 56, 239, 87, 88, 107, 162, 26, 4, 229, 85, 217, + 172, 15, 19, 76, 51, 51, 202, 39, 9, 165, 112, 114, 161, 131, 126, 221, + 28, 207, 94, 158, 12, 152, 11, 43, 193, 19, 251, 230, 251, 155, 240, 250, + 6, 177, 131, 147, 165, 136, 133, 39, 142, 253, 33, 142, 141, 191, 133, 88, + 153, 225, 96, 111, 185, 61, 174, 44, 247, 6, 85, 145, 27, 155, 130, 243, + 183, 74, 233, 95, 230, 176, 55, 128, 196, 240, 73, 85, 38, 136, 19, 255, + 141, 152, 150, 200, 24, 195, 60, 10, 44, 12, 194, 47, 198, 219, 67, 100, + 122, 228, 212, 145, 192, 151, 24, 13, 71, 115, 131, 57, 38, 6, 60, 181, + 240, 75, 190, 203, 224, 110, 22, 119, 52, 51, 113, 153, 33, 135, 197, 226, + 88, 60, 217, 91, 62, 76, 152, 22, 143, 166, 241, 62, 176, 158, 145, 205, + 123, 103, 78, 11, 13, 123, 217, 228, 21, 5, 37, 21, 140, 192, 160, 108, + 178, 89, 5, 98, 140, 163, 162, 61, 95, 7, 226, 101, 35, 27, 198, 16, + 24, 31, 234, 48, 173, 185, 173, 26, 131, 57, 44, 200, 243, 182, 40, 79, + 239, 97, 121, 206, 131, 76, 174, 71, 115, 212, 177, 41, 147, 131, 76, 216, + 71, 216, 20, 228, 88, 191, 176, 28, 207, 164, 185, 9, 219, 249, 188, 71, + 59, 159, 113, 87, 217, 160, 188, 223, 179, 198, 51, 97, 87, 83, 80, 111, + 32, 178, 227, 0, 82, 153, 144, 151, 53, 238, 226, 215, 22, 229, 173, 213, + 122, 110, 174, 108, 71, 228, 185, 140, 179, 76, 131, 158, 153, 132, 133, 74, + 26, 50, 231, 38, 121, 51, 136, 251, 149, 21, 194, 226, 11, 42, 12, 160, + 6, 141, 103, 234, 11, 120, 78, 244, 155, 248, 102, 205, 35, 45, 235, 108, + 94, 2, 153, 185, 172, 68, 65, 112, 224, 161, 98, 78, 132, 151, 188, 136, + 38, 97, 27, 28, 252, 114, 95, 6, 187, 47, 33, 27, 21, 172, 82, 187, + 228, 57, 90, 4, 31, 28, 168, 76, 94, 217, 78, 139, 131, 79, 130, 214, + 75, 58, 245, 28, 7, 237, 3, 59, 114, 90, 144, 81, 187, 90, 37, 46, + 116, 110, 214, 177, 65, 244, 227, 241, 143, 207, 63, 45, 254, 105, 103, 110, + 30, 17, 143, 97, 132, 116, 176, 94, 135, 163, 217, 75, 19, 175, 132, 239, + 22, 172, 91, 71, 70, 130, 205, 116, 223, 172, 17, 209, 178, 139, 48, 207, + 144, 29, 46, 49, 70, 130, 59, 110, 218, 145, 29, 189, 128, 113, 46, 51, + 246, 159, 184, 128, 182, 222, 67, 94, 250, 188, 24, 49, 189, 86, 231, 146, + 129, 9, 147, 34, 194, 202, 176, 150, 83, 23, 107, 67, 94, 35, 187, 120, + 90, 143, 160, 66, 103, 86, 23, 106, 74, 30, 198, 189, 173, 137, 74, 144, + 145, 184, 108, 236, 95, 90, 81, 96, 117, 121, 218, 34, 181, 234, 162, 65, + 48, 6, 119, 49, 24, 170, 46, 117, 2, 121, 179, 187, 251, 184, 53, 59, + 67, 126, 36, 5, 115, 139, 194, 171, 236, 56, 0, 87, 172, 154, 57, 239, + 205, 138, 117, 66, 183, 154, 36, 107, 23, 98, 246, 45, 95, 146, 87, 153, + 32, 66, 31, 50, 10, 106, 103, 10, 91, 195, 245, 25, 66, 194, 9, 178, + 0, 7, 172, 101, 192, 88, 174, 230, 32, 96, 52, 87, 137, 154, 87, 105, + 218, 235, 234, 49, 42, 80, 218, 81, 181, 28, 247, 39, 222, 255, 191, 180, + 239, 6, 123, 47, 183, 98, 114, 74, 32, 66, 229, 115, 10, 119, 135, 191, + 78, 128, 121, 10, 199, 232, 131, 14, 207, 240, 202, 176, 73, 118, 187, 208, + 156, 111, 149, 128, 42, 194, 97, 163, 19, 111, 133, 86, 11, 42, 217, 60, + 23, 219, 77, 42, 18, 59, 191, 84, 58, 120, 225, 73, 206, 140, 166, 56, + 135, 190, 140, 67, 215, 24, 42, 56, 195, 187, 87, 205, 26, 196, 238, 111, + 17, 77, 48, 161, 237, 95, 42, 181, 104, 37, 86, 161, 223, 82, 17, 109, + 25, 33, 212, 28, 124, 150, 238, 4, 214, 29, 217, 187, 208, 244, 80, 215, + 217, 3, 3, 198, 29, 59, 204, 58, 129, 65, 90, 209, 139, 203, 47, 107, + 122, 241, 248, 101, 73, 47, 62, 191, 12, 232, 165, 197, 47, 33, 189, 180, + 249, 101, 196, 57, 236, 139, 55, 206, 226, 128, 222, 104, 242, 249, 191, 254, + 250, 12, 230, 21, 78, 58, 182, 73, 128, 178, 8, 195, 86, 117, 212, 153, + 21, 33, 244, 31, 205, 188, 173, 109, 173, 34, 219, 90, 71, 178, 141, 214, + 50, 138, 27, 108, 13, 240, 197, 10, 33, 197, 8, 147, 65, 105, 116, 85, + 142, 57, 200, 15, 121, 110, 222, 140, 76, 149, 63, 221, 155, 59, 130, 78, + 163, 2, 6, 173, 25, 179, 116, 118, 42, 6, 10, 183, 121, 24, 193, 120, + 224, 168, 226, 157, 233, 137, 197, 19, 59, 227, 250, 85, 36, 68, 247, 100, + 99, 212, 173, 30, 246, 23, 253, 36, 227, 80, 178, 120, 139, 66, 231, 28, + 164, 8, 201, 250, 135, 144, 169, 45, 215, 71, 188, 52, 59, 211, 58, 204, + 245, 27, 120, 19, 34, 190, 110, 16, 56, 45, 131, 131, 135, 129, 190, 4, + 204, 203, 51, 107, 120, 14, 188, 121, 128, 3, 176, 174, 190, 240, 142, 96, + 250, 87, 86, 64, 218, 190, 249, 38, 172, 254, 250, 43, 62, 238, 127, 243, + 205, 179, 176, 106, 63, 3, 234, 113, 137, 239, 176, 38, 96, 28, 155, 85, + 7, 127, 214, 240, 131, 146, 194, 50, 22, 56, 212, 10, 244, 243, 11, 28, + 82, 129, 104, 78, 87, 7, 70, 217, 132, 69, 135, 130, 61, 116, 81, 100, + 214, 144, 131, 38, 144, 87, 212, 123, 104, 217, 255, 134, 254, 252, 110, 207, + 124, 27, 210, 212, 207, 218, 72, 55, 144, 170, 19, 169, 19, 133, 1, 105, + 167, 82, 140, 116, 41, 176, 178, 173, 161, 253, 111, 62, 60, 14, 248, 177, + 5, 51, 54, 153, 104, 134, 137, 102, 148, 104, 54, 224, 199, 150, 232, 70, + 132, 185, 230, 81, 67, 110, 224, 216, 67, 27, 27, 156, 51, 214, 112, 96, + 91, 51, 132, 43, 175, 115, 199, 17, 245, 169, 88, 3, 7, 98, 170, 53, + 52, 72, 130, 105, 69, 31, 85, 183, 74, 95, 167, 89, 198, 228, 51, 74, + 110, 13, 151, 226, 131, 217, 206, 15, 168, 109, 80, 106, 133, 35, 29, 175, + 90, 211, 43, 80, 175, 248, 142, 248, 140, 50, 137, 43, 54, 188, 132, 166, + 12, 246, 32, 0, 154, 37, 158, 103, 3, 217, 37, 203, 154, 53, 188, 148, + 77, 135, 151, 217, 229, 214, 168, 113, 83, 160, 30, 195, 203, 196, 31, 109, + 166, 101, 244, 178, 56, 227, 248, 217, 101, 226, 79, 196, 39, 218, 214, 212, + 27, 129, 170, 191, 148, 121, 197, 113, 5, 161, 30, 46, 235, 80, 240, 22, + 87, 174, 160, 211, 33, 164, 192, 136, 58, 219, 44, 134, 244, 1, 102, 105, + 175, 241, 186, 102, 118, 46, 53, 174, 240, 186, 80, 176, 150, 106, 92, 150, + 114, 92, 128, 22, 204, 150, 250, 184, 64, 207, 45, 97, 84, 150, 197, 157, + 156, 24, 23, 78, 62, 203, 38, 199, 158, 77, 143, 203, 50, 103, 92, 184, + 2, 217, 113, 145, 21, 163, 113, 1, 6, 104, 184, 20, 227, 2, 207, 208, + 17, 98, 126, 14, 196, 184, 208, 60, 28, 124, 225, 113, 105, 166, 27, 145, + 25, 23, 32, 165, 88, 137, 58, 206, 148, 167, 140, 11, 100, 72, 43, 82, + 233, 42, 139, 173, 232, 48, 1, 80, 177, 109, 52, 26, 137, 247, 148, 114, + 231, 41, 127, 148, 127, 95, 169, 227, 100, 36, 149, 14, 53, 89, 182, 218, + 1, 197, 19, 65, 31, 239, 76, 186, 210, 62, 74, 216, 233, 123, 74, 199, + 88, 192, 167, 67, 6, 252, 68, 150, 38, 157, 249, 34, 7, 30, 228, 131, + 72, 154, 178, 90, 34, 205, 131, 132, 57, 129, 150, 147, 102, 221, 170, 133, + 150, 249, 86, 13, 182, 131, 11, 20, 26, 43, 127, 183, 164, 5, 141, 226, + 233, 254, 140, 108, 98, 238, 86, 191, 174, 127, 221, 252, 218, 221, 198, 183, + 7, 100, 34, 85, 94, 173, 187, 27, 2, 50, 88, 173, 241, 23, 186, 62, + 183, 31, 100, 227, 214, 171, 141, 236, 168, 153, 166, 105, 204, 194, 213, 148, + 174, 49, 7, 154, 49, 138, 74, 210, 234, 55, 247, 34, 219, 238, 132, 43, + 248, 91, 195, 223, 6, 254, 186, 56, 53, 248, 243, 206, 18, 117, 179, 151, + 81, 15, 125, 33, 159, 189, 56, 71, 173, 109, 17, 51, 192, 152, 1, 26, + 157, 46, 210, 81, 61, 140, 18, 14, 148, 147, 49, 115, 140, 193, 158, 94, + 204, 110, 70, 50, 242, 73, 21, 212, 71, 246, 71, 110, 243, 61, 170, 199, + 210, 66, 34, 71, 225, 120, 150, 82, 56, 46, 178, 100, 118, 92, 54, 101, + 174, 140, 250, 163, 9, 95, 100, 47, 208, 93, 14, 226, 179, 124, 21, 35, + 231, 124, 213, 231, 1, 105, 227, 74, 211, 108, 116, 61, 6, 179, 61, 45, + 83, 230, 233, 56, 153, 247, 199, 153, 246, 140, 146, 210, 229, 134, 249, 191, + 131, 76, 170, 32, 192, 230, 210, 29, 28, 180, 3, 43, 109, 110, 113, 202, + 230, 86, 8, 150, 131, 168, 5, 172, 78, 109, 253, 23, 228, 220, 44, 204, + 232, 75, 40, 117, 23, 54, 199, 199, 30, 199, 158, 222, 209, 146, 124, 163, + 117, 46, 91, 31, 23, 152, 143, 48, 29, 97, 54, 134, 221, 50, 219, 191, + 37, 16, 79, 152, 44, 146, 173, 36, 107, 79, 228, 212, 168, 137, 82, 212, + 86, 57, 158, 141, 49, 150, 11, 210, 163, 30, 139, 29, 109, 229, 253, 7, + 2, 162, 49, 217, 55, 177, 133, 130, 73, 26, 162, 187, 44, 44, 147, 229, + 185, 5, 141, 86, 38, 149, 225, 42, 8, 215, 65, 184, 9, 194, 110, 225, + 141, 36, 156, 37, 220, 35, 248, 251, 8, 219, 208, 17, 236, 47, 31, 225, + 15, 127, 171, 130, 240, 144, 205, 211, 153, 227, 157, 219, 62, 58, 215, 194, + 39, 19, 195, 242, 233, 188, 246, 13, 90, 109, 162, 125, 46, 122, 123, 245, + 18, 49, 174, 199, 38, 186, 47, 40, 14, 111, 57, 165, 250, 199, 174, 84, + 136, 100, 137, 202, 34, 201, 188, 16, 93, 8, 255, 48, 77, 43, 65, 49, + 59, 35, 188, 44, 37, 74, 39, 45, 120, 153, 184, 201, 55, 162, 103, 242, + 229, 187, 14, 117, 178, 221, 121, 195, 15, 15, 34, 69, 167, 17, 186, 134, + 26, 14, 157, 247, 64, 134, 66, 248, 46, 146, 30, 172, 42, 68, 4, 170, + 73, 113, 120, 175, 191, 128, 195, 171, 142, 168, 3, 228, 107, 48, 233, 217, + 144, 123, 255, 208, 68, 231, 236, 243, 195, 189, 189, 94, 191, 177, 140, 174, + 163, 105, 191, 23, 133, 141, 201, 236, 106, 15, 223, 246, 178, 101, 57, 223, + 83, 89, 197, 179, 133, 155, 203, 96, 9, 182, 212, 4, 151, 111, 223, 161, + 15, 38, 248, 159, 152, 42, 111, 228, 107, 254, 44, 225, 46, 245, 122, 43, + 211, 247, 180, 254, 125, 137, 7, 214, 151, 172, 194, 29, 247, 185, 102, 22, + 155, 4, 69, 240, 213, 123, 44, 94, 110, 113, 193, 168, 84, 222, 22, 143, + 177, 14, 147, 232, 124, 121, 35, 76, 58, 229, 43, 203, 91, 89, 190, 184, + 36, 219, 49, 2, 223, 5, 86, 203, 54, 223, 4, 86, 27, 181, 206, 135, + 209, 69, 80, 226, 107, 217, 239, 204, 0, 78, 254, 71, 236, 150, 197, 124, + 131, 111, 109, 249, 166, 52, 154, 2, 211, 149, 97, 188, 232, 240, 90, 246, + 200, 24, 141, 43, 31, 154, 246, 7, 215, 254, 224, 217, 31, 124, 187, 71, + 112, 208, 248, 159, 243, 221, 222, 190, 243, 166, 90, 251, 208, 68, 239, 161, + 142, 95, 251, 110, 207, 115, 222, 212, 129, 97, 253, 128, 0, 227, 21, 10, + 168, 191, 65, 14, 246, 131, 135, 1, 144, 190, 142, 233, 125, 179, 90, 235, + 125, 244, 141, 58, 230, 130, 105, 188, 154, 202, 198, 171, 125, 7, 159, 248, + 50, 15, 167, 77, 185, 66, 130, 186, 79, 217, 56, 111, 224, 123, 252, 220, + 227, 207, 29, 42, 84, 126, 77, 5, 98, 58, 72, 1, 241, 80, 160, 172, + 221, 119, 123, 126, 221, 21, 185, 82, 176, 87, 61, 202, 98, 252, 139, 11, + 241, 49, 158, 94, 146, 72, 12, 110, 105, 251, 58, 33, 197, 112, 107, 203, + 106, 245, 80, 190, 0, 255, 61, 30, 100, 62, 242, 210, 31, 121, 181, 65, + 252, 145, 135, 31, 245, 50, 31, 249, 233, 143, 252, 90, 47, 254, 200, 231, + 131, 248, 51, 107, 188, 100, 203, 63, 120, 26, 168, 167, 30, 74, 218, 154, + 2, 240, 103, 137, 47, 144, 206, 134, 20, 240, 215, 147, 174, 36, 81, 16, + 10, 135, 236, 95, 127, 133, 184, 99, 72, 68, 105, 82, 250, 221, 119, 2, + 29, 194, 147, 0, 189, 227, 229, 201, 210, 200, 73, 104, 221, 145, 22, 0, + 249, 246, 173, 85, 150, 207, 29, 23, 157, 71, 144, 19, 148, 35, 19, 175, + 233, 209, 189, 1, 57, 247, 133, 247, 15, 136, 215, 253, 142, 148, 118, 126, + 166, 4, 31, 220, 56, 160, 122, 100, 192, 248, 170, 215, 58, 197, 251, 90, + 0, 140, 152, 153, 153, 140, 71, 37, 243, 186, 33, 124, 9, 13, 68, 171, + 6, 199, 3, 105, 114, 129, 77, 215, 90, 53, 72, 183, 106, 240, 44, 24, + 24, 57, 41, 69, 179, 208, 131, 195, 186, 86, 25, 200, 102, 13, 84, 179, + 126, 17, 205, 250, 37, 217, 172, 149, 253, 75, 186, 97, 16, 148, 108, 26, + 4, 164, 27, 135, 65, 247, 54, 15, 33, 53, 132, 181, 231, 184, 119, 220, + 75, 88, 149, 208, 240, 82, 19, 123, 233, 38, 246, 158, 5, 61, 35, 39, + 165, 104, 34, 58, 166, 216, 212, 42, 61, 217, 196, 158, 106, 226, 223, 69, + 19, 255, 158, 110, 226, 218, 254, 123, 182, 145, 16, 152, 110, 38, 4, 101, + 27, 138, 129, 187, 155, 202, 226, 174, 60, 84, 15, 65, 113, 167, 147, 165, + 135, 70, 70, 143, 231, 185, 239, 219, 226, 230, 200, 114, 2, 65, 32, 166, + 167, 23, 141, 208, 6, 27, 17, 99, 240, 164, 52, 197, 251, 9, 60, 35, + 121, 15, 128, 11, 250, 147, 201, 254, 147, 201, 254, 114, 76, 246, 239, 199, + 95, 23, 117, 248, 163, 248, 235, 186, 182, 78, 25, 77, 192, 72, 174, 220, + 34, 128, 66, 84, 242, 118, 92, 105, 41, 185, 175, 89, 224, 53, 183, 242, + 58, 158, 216, 39, 193, 58, 225, 15, 58, 198, 44, 98, 158, 30, 184, 156, + 117, 152, 217, 216, 182, 194, 251, 88, 225, 61, 119, 56, 185, 242, 42, 203, + 170, 186, 204, 200, 196, 13, 118, 196, 245, 84, 156, 32, 186, 174, 179, 191, + 213, 113, 169, 103, 51, 175, 151, 145, 135, 116, 200, 23, 172, 215, 131, 14, + 230, 120, 163, 115, 53, 138, 186, 157, 121, 80, 178, 94, 151, 204, 91, 96, + 98, 58, 201, 148, 166, 85, 75, 18, 73, 25, 126, 40, 37, 31, 182, 148, + 115, 216, 177, 214, 88, 4, 29, 210, 227, 185, 11, 252, 185, 120, 134, 117, + 19, 246, 208, 53, 237, 214, 110, 6, 199, 73, 42, 11, 163, 114, 239, 49, + 129, 28, 5, 18, 198, 239, 236, 86, 224, 83, 68, 51, 51, 36, 137, 137, + 73, 213, 202, 147, 94, 64, 51, 203, 187, 230, 41, 213, 185, 153, 139, 128, + 182, 143, 221, 148, 106, 117, 78, 135, 89, 77, 236, 164, 116, 191, 233, 22, + 6, 205, 52, 222, 89, 83, 135, 198, 244, 36, 236, 217, 190, 142, 140, 185, + 95, 138, 241, 7, 69, 143, 72, 163, 208, 146, 37, 42, 81, 82, 108, 60, + 31, 162, 168, 108, 39, 1, 84, 195, 35, 97, 139, 81, 176, 121, 4, 182, + 37, 166, 192, 164, 4, 164, 55, 153, 33, 107, 172, 86, 114, 234, 98, 20, + 169, 56, 147, 189, 40, 222, 163, 144, 228, 216, 221, 3, 22, 208, 219, 131, + 89, 74, 2, 99, 245, 138, 6, 196, 177, 37, 81, 205, 162, 239, 197, 37, + 167, 122, 211, 24, 135, 22, 79, 91, 186, 36, 67, 157, 110, 180, 9, 70, + 149, 135, 36, 232, 160, 60, 215, 42, 73, 45, 186, 30, 205, 76, 112, 8, + 195, 65, 163, 168, 194, 185, 141, 177, 169, 105, 205, 121, 169, 19, 110, 26, + 15, 240, 139, 48, 1, 105, 131, 75, 91, 159, 204, 48, 182, 133, 83, 24, + 27, 245, 167, 12, 238, 79, 246, 224, 255, 93, 246, 192, 255, 130, 236, 1, + 46, 101, 84, 159, 246, 20, 178, 182, 161, 173, 241, 251, 232, 55, 19, 130, + 52, 233, 6, 78, 193, 215, 109, 195, 246, 115, 9, 185, 175, 220, 110, 39, + 32, 142, 37, 138, 101, 28, 218, 230, 80, 131, 185, 12, 25, 186, 175, 210, + 30, 104, 161, 7, 4, 146, 252, 208, 173, 64, 234, 254, 63, 140, 214, 100, + 49, 198, 48, 115, 1, 24, 153, 192, 20, 67, 164, 2, 183, 6, 4, 158, + 224, 33, 164, 70, 134, 133, 201, 99, 181, 4, 160, 238, 24, 128, 238, 172, + 19, 71, 94, 207, 57, 216, 102, 207, 92, 94, 111, 157, 67, 190, 215, 76, + 190, 215, 59, 201, 247, 58, 75, 190, 49, 175, 164, 76, 242, 107, 18, 240, + 245, 99, 9, 248, 250, 79, 2, 254, 39, 1, 255, 147, 128, 63, 144, 128, + 175, 139, 8, 120, 62, 89, 72, 17, 240, 34, 155, 236, 127, 85, 10, 190, + 139, 216, 60, 150, 130, 15, 82, 20, 124, 41, 72, 246, 64, 83, 46, 19, + 68, 253, 126, 10, 238, 231, 48, 224, 62, 51, 224, 254, 78, 6, 220, 207, + 50, 224, 254, 31, 205, 128, 251, 59, 232, 183, 255, 39, 3, 254, 39, 253, + 254, 147, 126, 235, 244, 91, 91, 181, 247, 81, 100, 255, 95, 131, 165, 246, + 127, 11, 75, 237, 255, 14, 44, 181, 8, 234, 165, 185, 236, 98, 242, 156, + 101, 176, 125, 102, 176, 253, 157, 12, 182, 159, 101, 176, 253, 20, 131, 253, + 251, 243, 215, 187, 233, 243, 159, 252, 245, 159, 244, 249, 79, 250, 156, 67, + 159, 31, 192, 49, 251, 41, 142, 249, 95, 158, 62, 239, 162, 30, 95, 145, + 97, 78, 209, 231, 193, 253, 244, 121, 147, 67, 159, 55, 76, 159, 55, 59, + 233, 243, 38, 75, 159, 49, 47, 165, 134, 245, 149, 201, 243, 230, 177, 228, + 57, 13, 90, 251, 39, 121, 254, 147, 60, 255, 73, 158, 251, 69, 203, 60, + 69, 158, 55, 255, 111, 145, 231, 93, 212, 227, 177, 228, 185, 39, 200, 51, + 223, 55, 38, 73, 116, 47, 203, 70, 247, 10, 196, 28, 69, 36, 154, 109, + 17, 17, 215, 8, 22, 222, 195, 104, 42, 207, 209, 206, 138, 112, 193, 197, + 203, 26, 225, 219, 15, 205, 27, 251, 214, 94, 218, 156, 87, 50, 171, 71, + 229, 164, 94, 54, 156, 109, 66, 219, 159, 107, 124, 143, 182, 63, 85, 193, + 172, 192, 108, 39, 8, 13, 70, 131, 152, 76, 177, 92, 130, 124, 128, 225, + 96, 140, 12, 170, 177, 182, 12, 30, 226, 198, 76, 81, 97, 79, 17, 223, + 123, 9, 238, 151, 32, 75, 68, 148, 66, 30, 51, 188, 202, 230, 78, 50, + 43, 221, 149, 221, 133, 61, 174, 187, 169, 146, 111, 79, 217, 9, 54, 123, + 233, 193, 169, 43, 236, 83, 52, 247, 158, 52, 49, 117, 207, 73, 191, 85, + 125, 92, 142, 101, 32, 199, 49, 168, 64, 98, 166, 58, 213, 66, 113, 40, + 15, 166, 227, 181, 9, 34, 78, 120, 203, 16, 179, 18, 45, 132, 188, 118, + 98, 162, 146, 1, 80, 136, 152, 44, 106, 198, 146, 221, 43, 170, 37, 92, + 134, 8, 142, 4, 75, 248, 190, 169, 146, 176, 246, 225, 137, 130, 45, 24, + 133, 215, 125, 198, 244, 146, 133, 36, 252, 82, 49, 160, 30, 46, 101, 217, + 163, 49, 86, 10, 186, 14, 158, 152, 23, 209, 149, 157, 236, 102, 88, 233, + 195, 176, 11, 165, 160, 251, 17, 211, 93, 185, 247, 66, 240, 165, 90, 19, + 188, 68, 74, 154, 105, 186, 4, 245, 242, 130, 151, 72, 179, 98, 37, 30, + 110, 176, 84, 226, 161, 53, 193, 13, 4, 42, 165, 48, 102, 114, 26, 90, + 50, 40, 89, 112, 103, 185, 47, 252, 253, 38, 155, 90, 82, 208, 73, 128, + 56, 52, 98, 156, 240, 145, 66, 29, 12, 21, 106, 146, 34, 25, 194, 216, + 136, 100, 248, 40, 146, 193, 99, 50, 217, 43, 149, 234, 149, 74, 244, 138, + 172, 212, 200, 182, 192, 181, 95, 194, 223, 1, 252, 237, 195, 95, 27, 254, + 90, 226, 215, 63, 242, 232, 215, 163, 95, 31, 254, 60, 8, 243, 33, 190, + 69, 225, 238, 81, 27, 158, 15, 40, 206, 59, 122, 9, 191, 175, 40, 141, + 11, 239, 46, 164, 193, 120, 247, 104, 31, 254, 14, 224, 239, 165, 237, 86, + 209, 165, 228, 10, 173, 13, 246, 36, 148, 69, 184, 8, 199, 13, 4, 231, + 190, 131, 122, 239, 77, 163, 173, 81, 225, 122, 87, 25, 15, 167, 97, 54, + 26, 236, 181, 103, 26, 220, 57, 190, 253, 111, 119, 31, 183, 91, 243, 51, + 33, 137, 243, 51, 98, 191, 35, 106, 151, 240, 159, 51, 69, 147, 232, 207, + 154, 5, 127, 154, 246, 195, 48, 44, 194, 224, 14, 11, 246, 42, 214, 212, + 182, 62, 3, 173, 191, 234, 246, 2, 235, 14, 254, 45, 153, 165, 59, 32, + 236, 159, 129, 164, 3, 201, 159, 110, 183, 198, 116, 25, 80, 200, 158, 5, + 209, 172, 110, 45, 212, 155, 167, 203, 218, 114, 175, 59, 153, 87, 44, 202, + 179, 154, 147, 207, 148, 243, 249, 12, 249, 124, 30, 4, 244, 40, 243, 25, + 168, 124, 62, 15, 106, 131, 84, 62, 236, 219, 149, 21, 104, 43, 168, 250, + 140, 206, 151, 24, 124, 4, 85, 134, 73, 55, 27, 207, 15, 110, 163, 93, + 131, 104, 40, 133, 159, 6, 202, 76, 29, 189, 130, 72, 179, 119, 206, 183, + 38, 122, 88, 95, 247, 198, 76, 41, 93, 199, 223, 73, 181, 24, 129, 242, + 34, 109, 249, 91, 231, 154, 149, 182, 213, 36, 3, 109, 212, 232, 151, 118, + 125, 177, 206, 90, 169, 114, 135, 85, 130, 202, 220, 245, 224, 111, 190, 173, + 146, 174, 108, 118, 39, 92, 102, 124, 149, 172, 115, 125, 149, 172, 31, 236, + 171, 132, 242, 124, 164, 163, 18, 205, 191, 6, 58, 37, 201, 115, 90, 66, + 217, 62, 204, 99, 9, 37, 77, 185, 43, 33, 136, 27, 111, 117, 223, 97, + 40, 246, 197, 244, 19, 127, 0, 12, 206, 213, 100, 6, 52, 101, 148, 95, + 86, 236, 93, 140, 104, 56, 231, 42, 73, 122, 93, 150, 42, 126, 53, 127, + 19, 111, 39, 55, 72, 214, 86, 107, 71, 13, 154, 14, 237, 103, 139, 154, + 100, 107, 145, 101, 165, 102, 166, 71, 14, 22, 208, 200, 228, 210, 44, 245, + 86, 193, 234, 27, 247, 168, 183, 14, 214, 240, 243, 109, 240, 169, 130, 30, + 57, 164, 171, 134, 234, 209, 119, 16, 226, 41, 235, 91, 8, 120, 3, 1, + 78, 34, 228, 45, 125, 164, 125, 99, 60, 235, 173, 107, 149, 103, 189, 85, + 13, 56, 182, 55, 65, 240, 237, 55, 223, 188, 121, 22, 188, 253, 230, 155, + 111, 159, 5, 223, 217, 223, 218, 81, 21, 248, 91, 142, 253, 54, 8, 190, + 163, 240, 55, 223, 124, 243, 29, 164, 177, 191, 67, 115, 124, 179, 110, 96, + 14, 156, 228, 187, 0, 63, 133, 72, 200, 230, 45, 36, 180, 223, 114, 6, + 34, 255, 183, 1, 126, 11, 17, 223, 81, 41, 223, 218, 111, 48, 135, 82, + 102, 242, 82, 167, 250, 143, 29, 82, 255, 105, 67, 234, 251, 47, 108, 248, + 19, 67, 234, 139, 33, 245, 87, 9, 23, 34, 4, 160, 247, 160, 33, 245, + 239, 27, 82, 159, 128, 46, 180, 33, 125, 225, 211, 144, 194, 79, 183, 25, + 64, 79, 29, 117, 221, 0, 250, 51, 8, 96, 120, 186, 30, 63, 34, 226, + 33, 14, 56, 80, 105, 199, 79, 142, 120, 51, 17, 130, 67, 158, 76, 99, + 188, 229, 239, 180, 89, 240, 61, 37, 210, 2, 140, 127, 231, 52, 218, 103, + 63, 80, 214, 90, 192, 59, 250, 200, 79, 79, 157, 110, 83, 140, 236, 119, + 52, 178, 63, 208, 240, 127, 47, 7, 190, 235, 98, 108, 38, 250, 155, 111, + 34, 152, 29, 136, 250, 0, 51, 230, 123, 158, 78, 223, 124, 243, 61, 197, + 67, 204, 183, 85, 154, 91, 48, 181, 186, 158, 152, 86, 137, 68, 246, 247, + 98, 230, 85, 160, 227, 160, 155, 100, 45, 42, 63, 208, 252, 251, 129, 74, + 224, 105, 70, 185, 65, 57, 185, 53, 248, 247, 170, 94, 79, 85, 92, 126, + 165, 222, 97, 54, 223, 7, 248, 246, 61, 101, 253, 3, 197, 83, 67, 146, + 21, 242, 84, 133, 210, 245, 73, 117, 75, 110, 110, 255, 142, 229, 228, 54, + 228, 93, 213, 254, 65, 239, 150, 244, 231, 92, 139, 130, 229, 212, 233, 117, + 187, 17, 18, 42, 179, 211, 239, 93, 245, 99, 127, 159, 164, 123, 211, 95, + 177, 159, 197, 19, 122, 94, 160, 113, 186, 59, 93, 145, 106, 240, 101, 136, + 59, 21, 242, 246, 139, 217, 77, 95, 131, 138, 22, 132, 142, 55, 40, 90, + 74, 188, 12, 224, 64, 128, 238, 21, 201, 187, 14, 31, 39, 96, 19, 64, + 47, 40, 196, 229, 39, 207, 81, 42, 51, 20, 224, 244, 231, 221, 89, 116, + 193, 167, 122, 105, 16, 216, 31, 231, 25, 4, 190, 141, 139, 232, 188, 193, + 34, 58, 111, 226, 34, 58, 239, 18, 14, 122, 139, 185, 211, 100, 63, 4, + 110, 195, 109, 227, 177, 64, 246, 69, 208, 22, 103, 1, 173, 67, 10, 53, + 33, 18, 125, 108, 27, 169, 46, 215, 92, 202, 96, 41, 91, 77, 201, 161, + 173, 153, 4, 178, 56, 224, 177, 59, 201, 219, 55, 111, 222, 221, 187, 145, + 220, 1, 143, 227, 84, 158, 161, 217, 152, 13, 207, 3, 249, 44, 56, 147, + 22, 18, 163, 4, 128, 107, 76, 43, 3, 96, 183, 143, 68, 168, 236, 27, + 12, 244, 142, 140, 164, 46, 50, 89, 9, 38, 172, 8, 141, 79, 110, 101, + 101, 175, 209, 82, 240, 195, 217, 65, 109, 13, 83, 127, 133, 248, 173, 173, + 115, 136, 242, 244, 168, 149, 233, 32, 152, 2, 71, 113, 182, 149, 107, 140, + 116, 174, 159, 51, 213, 195, 117, 243, 170, 134, 111, 136, 134, 164, 222, 200, + 92, 215, 49, 225, 9, 136, 19, 16, 165, 30, 127, 54, 191, 25, 85, 194, + 139, 121, 229, 204, 16, 95, 248, 34, 21, 230, 229, 194, 9, 154, 62, 141, + 67, 93, 21, 234, 199, 161, 28, 104, 196, 101, 202, 28, 226, 12, 220, 56, + 131, 248, 123, 87, 125, 31, 127, 174, 125, 237, 203, 175, 181, 143, 125, 249, + 113, 252, 173, 95, 53, 206, 25, 150, 22, 89, 214, 202, 179, 74, 101, 85, + 67, 224, 156, 170, 29, 217, 48, 194, 151, 21, 116, 181, 85, 193, 142, 243, + 237, 53, 253, 219, 180, 187, 246, 1, 252, 71, 229, 126, 192, 206, 64, 195, + 172, 94, 229, 19, 82, 235, 158, 199, 207, 184, 149, 144, 236, 6, 205, 55, + 209, 10, 178, 135, 214, 94, 244, 128, 81, 236, 140, 56, 96, 241, 206, 73, + 60, 11, 94, 139, 149, 139, 153, 29, 114, 6, 199, 21, 119, 79, 37, 168, + 106, 41, 60, 72, 81, 89, 98, 217, 174, 200, 217, 253, 40, 103, 78, 245, + 200, 92, 122, 90, 140, 167, 197, 32, 162, 175, 44, 163, 182, 196, 232, 56, + 199, 218, 210, 67, 115, 66, 12, 132, 39, 89, 209, 189, 192, 221, 7, 138, + 247, 207, 60, 121, 155, 250, 220, 109, 234, 83, 183, 169, 6, 187, 185, 115, + 234, 122, 241, 116, 244, 196, 124, 242, 226, 73, 214, 84, 51, 183, 25, 7, + 122, 241, 204, 69, 0, 37, 53, 205, 154, 156, 146, 158, 100, 166, 77, 57, + 29, 155, 106, 33, 53, 85, 49, 113, 41, 170, 144, 184, 140, 120, 118, 199, + 85, 244, 146, 179, 182, 178, 130, 9, 139, 134, 183, 107, 248, 125, 134, 136, + 78, 127, 240, 220, 53, 239, 159, 188, 230, 239, 60, 123, 51, 251, 117, 63, + 28, 117, 195, 217, 45, 57, 80, 219, 97, 196, 143, 226, 213, 89, 132, 68, + 127, 221, 17, 30, 43, 83, 254, 213, 16, 104, 157, 92, 209, 193, 62, 161, + 71, 141, 194, 85, 52, 186, 25, 117, 176, 164, 57, 103, 247, 72, 252, 17, + 239, 173, 130, 32, 177, 53, 70, 28, 51, 116, 176, 238, 44, 243, 207, 112, + 227, 247, 217, 233, 231, 53, 169, 41, 34, 18, 141, 145, 94, 220, 18, 45, + 9, 224, 100, 88, 132, 65, 171, 250, 116, 31, 56, 111, 189, 135, 11, 45, + 246, 219, 152, 93, 102, 119, 182, 217, 147, 245, 125, 102, 250, 162, 79, 242, + 251, 67, 247, 77, 13, 219, 176, 141, 125, 75, 255, 192, 9, 120, 91, 50, + 101, 15, 72, 55, 164, 201, 228, 173, 116, 114, 236, 23, 71, 118, 140, 16, + 137, 81, 167, 80, 233, 115, 211, 106, 231, 112, 4, 227, 229, 125, 94, 169, + 53, 117, 151, 170, 176, 106, 127, 136, 27, 107, 229, 196, 154, 141, 197, 159, + 5, 75, 179, 19, 119, 55, 9, 68, 124, 27, 26, 97, 181, 165, 43, 102, + 178, 189, 54, 23, 232, 166, 113, 138, 158, 13, 18, 201, 7, 113, 242, 56, + 69, 66, 222, 161, 37, 63, 52, 122, 19, 131, 100, 142, 52, 27, 238, 169, + 111, 11, 234, 219, 194, 6, 182, 168, 190, 243, 185, 252, 4, 173, 163, 164, + 61, 191, 179, 172, 218, 104, 242, 231, 32, 178, 22, 167, 64, 219, 41, 85, + 136, 141, 148, 218, 194, 111, 101, 155, 61, 115, 78, 96, 80, 246, 157, 235, + 204, 183, 230, 94, 131, 240, 141, 209, 227, 226, 213, 44, 236, 69, 80, 54, + 70, 135, 82, 72, 215, 53, 33, 135, 6, 123, 58, 159, 247, 229, 164, 135, + 144, 186, 57, 102, 103, 221, 194, 135, 31, 73, 235, 66, 118, 164, 215, 149, + 125, 231, 155, 202, 7, 37, 66, 160, 206, 26, 18, 20, 132, 82, 58, 50, + 105, 35, 198, 80, 172, 163, 12, 165, 97, 222, 89, 199, 117, 119, 107, 246, + 103, 232, 3, 218, 244, 149, 227, 62, 235, 152, 142, 119, 136, 63, 41, 189, + 247, 41, 189, 82, 147, 190, 61, 35, 59, 206, 49, 161, 220, 99, 139, 16, + 107, 211, 59, 71, 212, 86, 124, 242, 207, 105, 214, 225, 99, 235, 28, 86, + 195, 84, 149, 252, 188, 9, 153, 34, 20, 44, 186, 20, 220, 114, 61, 206, + 224, 43, 68, 215, 157, 25, 245, 218, 89, 203, 110, 159, 3, 35, 61, 136, + 46, 23, 248, 173, 75, 110, 5, 227, 160, 182, 12, 106, 157, 27, 117, 217, + 123, 159, 48, 24, 83, 135, 66, 80, 105, 118, 141, 203, 134, 89, 58, 129, + 225, 238, 194, 94, 131, 195, 9, 39, 91, 183, 90, 199, 211, 44, 31, 92, + 109, 20, 138, 196, 1, 30, 227, 165, 194, 16, 152, 84, 16, 58, 248, 6, + 58, 141, 253, 1, 127, 122, 208, 25, 241, 142, 231, 198, 137, 44, 29, 75, + 58, 134, 146, 62, 85, 92, 196, 240, 132, 253, 57, 130, 172, 62, 157, 97, + 15, 156, 115, 119, 158, 24, 218, 72, 99, 250, 79, 149, 72, 244, 112, 181, + 100, 198, 163, 237, 138, 14, 193, 30, 165, 30, 129, 226, 160, 247, 168, 60, + 26, 5, 104, 9, 58, 109, 175, 121, 49, 160, 45, 76, 58, 66, 64, 133, + 40, 251, 110, 133, 78, 32, 49, 225, 39, 145, 7, 22, 79, 163, 54, 27, + 97, 55, 219, 144, 155, 62, 237, 12, 89, 121, 236, 166, 79, 21, 173, 123, + 92, 117, 196, 79, 212, 176, 9, 189, 14, 243, 170, 217, 112, 205, 103, 162, + 84, 132, 167, 91, 18, 166, 233, 96, 107, 206, 3, 242, 75, 73, 211, 18, + 215, 195, 113, 211, 172, 41, 60, 211, 166, 9, 71, 16, 196, 189, 131, 136, + 173, 4, 211, 68, 80, 83, 150, 166, 99, 250, 147, 166, 225, 192, 90, 17, + 171, 71, 17, 172, 57, 193, 142, 158, 28, 195, 34, 67, 238, 166, 129, 144, + 163, 161, 244, 207, 210, 229, 38, 75, 104, 49, 68, 32, 67, 40, 51, 29, + 70, 85, 224, 240, 194, 240, 124, 18, 172, 18, 142, 17, 213, 166, 158, 169, + 141, 92, 85, 198, 92, 173, 223, 43, 148, 170, 195, 106, 64, 122, 64, 13, + 119, 141, 138, 144, 225, 2, 95, 195, 39, 219, 91, 186, 220, 17, 178, 116, + 246, 161, 170, 185, 80, 61, 35, 71, 50, 210, 137, 42, 74, 205, 167, 179, + 201, 21, 194, 203, 155, 119, 97, 176, 220, 3, 6, 21, 106, 24, 30, 187, + 118, 88, 67, 53, 122, 244, 234, 26, 2, 49, 97, 251, 89, 160, 160, 150, + 116, 87, 77, 147, 17, 182, 172, 91, 190, 98, 188, 229, 203, 197, 219, 13, + 255, 116, 139, 60, 27, 167, 238, 65, 233, 84, 47, 84, 50, 58, 99, 220, + 127, 47, 38, 51, 253, 38, 48, 45, 11, 254, 137, 138, 221, 121, 239, 4, + 29, 78, 119, 67, 35, 100, 175, 217, 175, 135, 46, 22, 206, 68, 202, 11, + 196, 241, 100, 236, 96, 229, 174, 250, 51, 60, 245, 67, 147, 187, 3, 19, + 177, 159, 77, 81, 151, 36, 147, 14, 204, 218, 13, 240, 115, 23, 82, 145, + 227, 247, 184, 166, 124, 152, 91, 229, 60, 115, 228, 98, 97, 1, 17, 52, + 152, 38, 66, 156, 204, 83, 165, 32, 220, 45, 8, 247, 212, 164, 152, 69, + 227, 235, 164, 247, 84, 109, 232, 48, 242, 17, 78, 79, 19, 60, 147, 204, + 217, 111, 26, 90, 41, 186, 169, 70, 12, 87, 36, 74, 122, 144, 179, 210, + 4, 63, 178, 97, 92, 121, 151, 177, 149, 29, 216, 114, 221, 109, 130, 27, + 22, 37, 107, 94, 68, 31, 209, 188, 180, 243, 207, 188, 246, 173, 245, 6, + 166, 141, 81, 30, 210, 194, 28, 167, 157, 249, 77, 76, 182, 146, 45, 172, + 119, 180, 120, 243, 180, 38, 75, 103, 152, 137, 124, 30, 221, 166, 28, 55, + 150, 133, 141, 42, 110, 23, 251, 189, 43, 108, 99, 194, 223, 228, 195, 219, + 152, 118, 19, 153, 51, 170, 250, 160, 62, 97, 76, 115, 220, 59, 230, 180, + 190, 137, 45, 143, 61, 51, 22, 54, 51, 225, 126, 241, 225, 205, 148, 94, + 19, 181, 92, 30, 217, 140, 28, 127, 135, 185, 205, 136, 27, 18, 59, 43, + 204, 105, 13, 123, 180, 78, 93, 43, 110, 114, 175, 21, 55, 15, 190, 86, + 20, 185, 126, 249, 139, 69, 145, 113, 209, 213, 226, 124, 50, 195, 205, 180, + 51, 153, 245, 72, 71, 13, 246, 197, 58, 84, 220, 193, 166, 96, 175, 5, + 58, 130, 236, 175, 192, 85, 100, 246, 69, 204, 128, 180, 165, 164, 87, 196, + 93, 109, 120, 119, 137, 90, 101, 17, 43, 7, 166, 181, 90, 32, 39, 60, + 188, 65, 12, 67, 235, 167, 245, 22, 123, 225, 34, 148, 106, 47, 151, 209, + 108, 190, 16, 78, 218, 246, 128, 105, 220, 163, 118, 238, 9, 78, 77, 149, + 183, 179, 63, 51, 190, 18, 101, 31, 212, 149, 254, 27, 116, 64, 145, 202, + 203, 126, 11, 123, 178, 103, 18, 175, 2, 219, 19, 246, 3, 115, 0, 235, + 14, 48, 159, 211, 129, 217, 2, 62, 198, 199, 63, 217, 215, 154, 226, 44, + 57, 167, 79, 1, 189, 82, 152, 153, 4, 241, 165, 46, 79, 1, 249, 82, + 152, 221, 97, 255, 246, 172, 181, 105, 94, 195, 156, 226, 16, 236, 67, 134, + 48, 156, 235, 131, 249, 176, 76, 233, 59, 215, 230, 239, 61, 116, 208, 135, + 53, 28, 79, 96, 254, 92, 85, 211, 35, 79, 213, 125, 8, 124, 176, 141, + 184, 152, 179, 254, 85, 168, 134, 51, 132, 239, 62, 223, 244, 199, 93, 210, + 186, 97, 175, 144, 98, 32, 98, 245, 71, 77, 183, 43, 47, 87, 84, 208, + 209, 180, 188, 148, 230, 238, 60, 165, 182, 27, 247, 83, 130, 23, 226, 222, + 78, 76, 50, 146, 144, 134, 99, 57, 37, 160, 79, 78, 100, 58, 224, 203, + 222, 155, 211, 112, 182, 192, 208, 99, 45, 148, 195, 176, 17, 72, 89, 156, + 247, 187, 184, 166, 184, 38, 129, 83, 228, 176, 151, 51, 206, 71, 81, 230, + 184, 181, 154, 80, 121, 177, 43, 96, 176, 189, 151, 90, 2, 215, 246, 154, + 116, 50, 46, 145, 199, 78, 187, 85, 130, 201, 74, 73, 29, 124, 23, 230, + 170, 103, 46, 29, 28, 215, 218, 135, 40, 199, 164, 47, 240, 191, 22, 255, + 87, 149, 223, 174, 128, 85, 203, 253, 146, 219, 200, 160, 206, 135, 230, 233, + 51, 148, 209, 189, 127, 38, 36, 117, 131, 201, 104, 114, 213, 31, 247, 39, + 55, 154, 63, 200, 251, 38, 20, 226, 19, 157, 174, 222, 179, 99, 48, 90, + 255, 152, 121, 130, 166, 156, 154, 228, 54, 21, 40, 199, 24, 102, 217, 34, + 186, 237, 219, 38, 102, 5, 131, 217, 155, 43, 103, 89, 248, 29, 15, 83, + 4, 227, 220, 15, 119, 105, 202, 189, 15, 78, 37, 59, 155, 172, 118, 33, + 63, 59, 156, 160, 247, 50, 189, 249, 109, 187, 101, 178, 187, 71, 232, 172, + 249, 32, 156, 65, 119, 153, 7, 205, 102, 18, 249, 26, 78, 252, 4, 178, + 143, 159, 27, 201, 222, 83, 128, 79, 36, 135, 226, 123, 49, 22, 120, 168, + 61, 143, 167, 161, 220, 242, 176, 171, 88, 242, 166, 58, 75, 171, 187, 232, + 56, 229, 92, 233, 161, 89, 200, 207, 210, 186, 78, 199, 232, 89, 96, 109, + 163, 176, 7, 230, 131, 229, 154, 92, 183, 89, 140, 201, 26, 99, 225, 36, + 188, 166, 136, 14, 4, 194, 26, 205, 23, 188, 1, 57, 238, 113, 208, 65, + 23, 89, 209, 226, 166, 215, 63, 14, 128, 6, 49, 70, 18, 67, 19, 217, + 157, 205, 100, 50, 218, 165, 93, 154, 115, 34, 81, 227, 244, 6, 221, 132, + 118, 97, 223, 132, 38, 245, 135, 123, 211, 104, 220, 189, 129, 227, 4, 156, + 165, 68, 5, 248, 82, 177, 219, 189, 153, 145, 158, 54, 113, 10, 203, 168, + 215, 119, 88, 211, 110, 216, 31, 107, 243, 237, 199, 62, 169, 216, 195, 174, + 26, 43, 203, 227, 241, 246, 239, 176, 247, 92, 153, 127, 111, 192, 194, 121, + 245, 234, 85, 181, 97, 126, 63, 236, 175, 34, 188, 188, 236, 134, 163, 254, + 12, 142, 228, 225, 48, 186, 152, 241, 33, 14, 14, 142, 183, 81, 127, 73, + 194, 74, 19, 246, 140, 177, 112, 103, 117, 51, 190, 30, 79, 150, 99, 152, + 207, 40, 36, 75, 93, 222, 162, 136, 233, 219, 113, 111, 214, 95, 154, 255, + 11, 217, 71, 139, 205, 85, 116, 113, 1, 185, 85, 188, 102, 211, 133, 18, + 127, 138, 208, 209, 97, 200, 163, 45, 14, 143, 194, 107, 96, 196, 144, 230, + 202, 17, 34, 150, 174, 164, 215, 52, 211, 177, 149, 90, 135, 252, 238, 199, + 74, 92, 118, 106, 6, 4, 205, 134, 71, 23, 209, 250, 44, 96, 41, 56, + 206, 4, 126, 202, 234, 167, 194, 185, 80, 58, 243, 203, 61, 161, 54, 12, + 125, 210, 105, 55, 210, 205, 6, 186, 209, 142, 225, 214, 132, 6, 121, 74, + 175, 220, 47, 4, 97, 131, 130, 25, 134, 13, 31, 20, 75, 250, 63, 170, + 176, 236, 212, 235, 95, 94, 226, 156, 148, 254, 76, 149, 11, 51, 213, 5, + 228, 225, 84, 7, 10, 51, 45, 207, 54, 177, 245, 38, 107, 146, 194, 98, + 179, 13, 169, 48, 76, 226, 225, 106, 218, 143, 247, 254, 131, 252, 120, 231, + 49, 148, 57, 226, 114, 213, 221, 105, 144, 214, 86, 105, 251, 122, 89, 179, + 90, 135, 86, 107, 107, 168, 177, 72, 167, 106, 67, 170, 65, 205, 106, 31, + 90, 237, 45, 94, 86, 26, 58, 186, 110, 124, 3, 169, 110, 42, 181, 123, + 72, 107, 95, 6, 202, 58, 64, 96, 201, 146, 47, 165, 84, 236, 90, 143, + 93, 171, 216, 112, 56, 29, 132, 16, 213, 189, 89, 84, 160, 111, 157, 102, + 3, 214, 169, 77, 255, 86, 101, 26, 121, 177, 70, 206, 240, 94, 163, 159, + 232, 67, 188, 230, 114, 44, 79, 37, 161, 17, 128, 20, 190, 72, 225, 139, + 20, 190, 74, 113, 10, 209, 40, 116, 93, 218, 3, 8, 195, 186, 122, 53, + 186, 231, 147, 21, 174, 238, 85, 48, 151, 26, 149, 86, 59, 133, 68, 107, + 78, 180, 142, 19, 173, 101, 34, 140, 158, 65, 52, 185, 231, 198, 11, 215, + 35, 99, 140, 239, 51, 188, 126, 115, 184, 85, 181, 217, 71, 79, 92, 54, + 206, 78, 154, 182, 49, 198, 66, 199, 179, 189, 89, 109, 117, 100, 142, 215, + 242, 101, 45, 98, 100, 224, 218, 16, 245, 107, 54, 218, 181, 241, 74, 214, + 7, 149, 115, 68, 77, 185, 102, 20, 189, 214, 35, 214, 71, 198, 59, 170, + 76, 246, 230, 78, 183, 223, 189, 25, 207, 38, 195, 97, 138, 207, 229, 64, + 60, 117, 60, 232, 132, 241, 63, 156, 252, 126, 70, 83, 63, 12, 43, 110, + 112, 93, 136, 163, 119, 40, 24, 252, 117, 98, 71, 39, 174, 199, 71, 5, + 100, 123, 255, 232, 192, 126, 105, 191, 2, 158, 71, 212, 88, 242, 56, 55, + 83, 86, 109, 153, 143, 66, 162, 35, 242, 122, 82, 187, 155, 20, 232, 226, + 192, 165, 143, 38, 147, 197, 96, 220, 159, 207, 233, 186, 50, 28, 71, 243, + 201, 98, 54, 153, 174, 3, 186, 197, 176, 5, 95, 0, 27, 129, 126, 42, + 254, 31, 46, 33, 255, 2, 18, 8, 47, 106, 237, 56, 154, 41, 202, 19, + 110, 25, 147, 104, 224, 113, 53, 201, 221, 101, 89, 171, 103, 179, 209, 18, + 52, 53, 174, 43, 124, 119, 15, 80, 56, 161, 161, 64, 207, 37, 186, 170, + 221, 36, 217, 93, 243, 69, 12, 146, 146, 238, 75, 69, 95, 233, 30, 210, + 86, 152, 225, 49, 177, 110, 5, 158, 126, 63, 9, 213, 75, 27, 4, 17, + 225, 118, 137, 114, 199, 226, 1, 217, 165, 57, 88, 226, 130, 242, 198, 125, + 96, 34, 114, 120, 220, 5, 144, 49, 59, 146, 84, 237, 7, 138, 148, 67, + 32, 181, 155, 0, 163, 62, 107, 8, 68, 64, 203, 39, 167, 45, 8, 52, + 125, 108, 9, 29, 235, 193, 177, 53, 48, 200, 167, 156, 158, 138, 244, 92, + 25, 150, 26, 227, 234, 104, 205, 119, 131, 26, 79, 11, 216, 154, 39, 179, + 57, 138, 90, 218, 182, 219, 240, 240, 207, 152, 41, 111, 141, 137, 12, 218, + 6, 183, 131, 238, 178, 172, 22, 93, 97, 133, 93, 179, 36, 42, 15, 229, + 237, 67, 194, 146, 189, 238, 94, 116, 97, 29, 231, 233, 77, 47, 33, 37, + 178, 27, 248, 139, 167, 73, 88, 95, 195, 222, 57, 35, 101, 62, 204, 158, + 104, 124, 209, 33, 135, 165, 243, 147, 102, 106, 53, 255, 47, 230, 125, 207, + 189, 122, 66, 144, 78, 133, 107, 204, 72, 230, 32, 119, 17, 118, 175, 161, + 166, 61, 39, 188, 152, 163, 246, 27, 235, 233, 169, 80, 216, 118, 233, 68, + 64, 252, 8, 28, 5, 210, 73, 125, 21, 168, 82, 234, 150, 63, 59, 108, + 135, 248, 246, 192, 201, 187, 61, 192, 178, 126, 71, 43, 162, 34, 124, 80, + 251, 193, 38, 63, 82, 149, 64, 13, 92, 80, 116, 64, 213, 32, 207, 129, + 82, 150, 127, 14, 86, 123, 75, 216, 74, 219, 71, 191, 4, 235, 189, 1, + 61, 253, 24, 84, 126, 174, 253, 92, 255, 165, 246, 75, 245, 35, 190, 127, + 27, 176, 49, 196, 47, 136, 107, 238, 250, 205, 218, 143, 168, 185, 217, 13, + 128, 32, 162, 85, 66, 171, 246, 109, 213, 158, 71, 227, 202, 75, 120, 168, + 150, 105, 250, 41, 55, 19, 236, 242, 200, 252, 124, 3, 3, 51, 19, 190, + 40, 48, 180, 41, 238, 123, 161, 38, 113, 53, 45, 109, 2, 119, 166, 225, + 162, 59, 200, 153, 198, 20, 206, 42, 37, 39, 120, 206, 224, 119, 129, 7, + 27, 7, 176, 183, 27, 124, 159, 47, 122, 210, 18, 169, 153, 59, 223, 227, + 142, 250, 128, 159, 58, 203, 156, 57, 110, 231, 40, 143, 192, 32, 250, 111, + 115, 102, 59, 25, 185, 101, 167, 53, 249, 185, 210, 92, 61, 207, 174, 110, + 232, 155, 114, 92, 65, 178, 58, 157, 179, 56, 109, 209, 147, 194, 178, 171, + 240, 102, 62, 143, 96, 158, 45, 169, 145, 241, 137, 152, 187, 104, 2, 61, + 59, 12, 167, 154, 75, 163, 207, 55, 112, 148, 37, 89, 202, 2, 181, 199, + 226, 252, 107, 220, 55, 236, 165, 232, 143, 152, 216, 113, 85, 208, 87, 196, + 14, 94, 31, 29, 89, 36, 166, 129, 52, 176, 2, 150, 148, 61, 23, 145, + 50, 9, 156, 172, 137, 34, 75, 244, 101, 52, 80, 85, 222, 144, 93, 61, + 198, 15, 44, 233, 40, 217, 231, 40, 67, 70, 161, 46, 12, 199, 180, 212, + 71, 236, 92, 153, 60, 90, 136, 184, 54, 27, 193, 202, 143, 246, 85, 73, + 251, 137, 19, 134, 218, 176, 180, 185, 148, 176, 254, 202, 78, 140, 156, 25, + 132, 103, 7, 214, 190, 161, 29, 110, 5, 27, 1, 117, 4, 78, 68, 28, + 84, 121, 130, 104, 27, 95, 242, 196, 160, 188, 66, 79, 195, 249, 220, 114, + 121, 37, 83, 107, 26, 176, 134, 105, 191, 203, 49, 155, 18, 137, 135, 226, + 66, 219, 144, 226, 3, 118, 235, 226, 198, 90, 28, 26, 112, 63, 75, 232, + 229, 93, 251, 252, 185, 123, 18, 248, 230, 115, 92, 78, 48, 153, 113, 203, + 52, 250, 48, 103, 240, 88, 94, 58, 49, 18, 106, 145, 211, 165, 80, 125, + 20, 175, 3, 226, 229, 213, 107, 143, 157, 131, 136, 87, 232, 170, 75, 246, + 15, 178, 235, 80, 50, 37, 69, 57, 28, 214, 233, 114, 47, 62, 40, 76, + 73, 75, 14, 202, 115, 40, 133, 19, 31, 109, 166, 3, 245, 193, 64, 255, + 96, 64, 31, 12, 240, 131, 65, 242, 131, 158, 250, 160, 167, 127, 64, 58, + 129, 80, 103, 135, 82, 232, 31, 44, 7, 61, 42, 188, 54, 29, 212, 166, + 61, 56, 65, 112, 199, 7, 226, 238, 185, 50, 23, 199, 5, 108, 225, 113, + 155, 245, 17, 57, 10, 63, 173, 84, 109, 65, 43, 32, 217, 228, 242, 114, + 201, 170, 161, 72, 55, 42, 27, 124, 113, 160, 60, 56, 140, 46, 143, 3, + 168, 131, 109, 214, 235, 155, 165, 205, 209, 107, 142, 30, 64, 244, 26, 163, + 7, 20, 189, 150, 209, 43, 142, 94, 66, 244, 10, 163, 151, 20, 189, 130, + 104, 81, 224, 25, 22, 87, 175, 159, 67, 178, 254, 106, 90, 113, 86, 203, + 143, 222, 94, 5, 206, 70, 88, 211, 218, 116, 89, 253, 72, 122, 150, 235, + 100, 240, 64, 4, 111, 146, 193, 61, 12, 102, 69, 76, 253, 255, 55, 216, + 153, 120, 124, 177, 55, 118, 19, 21, 17, 181, 119, 84, 181, 92, 106, 239, + 164, 110, 41, 149, 53, 159, 55, 237, 27, 30, 78, 219, 188, 229, 97, 178, + 151, 220, 251, 246, 116, 105, 79, 7, 246, 180, 167, 236, 162, 171, 188, 213, + 192, 247, 220, 201, 175, 141, 222, 44, 92, 86, 158, 123, 28, 110, 175, 68, + 78, 107, 145, 209, 70, 100, 212, 140, 179, 154, 63, 39, 175, 184, 114, 44, + 14, 159, 154, 67, 85, 78, 0, 225, 139, 251, 105, 139, 227, 159, 102, 53, + 44, 7, 114, 110, 63, 114, 98, 239, 154, 215, 127, 224, 196, 125, 228, 244, + 220, 57, 29, 121, 228, 159, 58, 7, 155, 106, 238, 184, 143, 157, 124, 217, + 79, 181, 89, 135, 30, 141, 27, 102, 215, 118, 144, 102, 227, 141, 170, 50, + 208, 189, 110, 100, 206, 31, 135, 135, 38, 187, 182, 130, 253, 75, 4, 93, + 192, 54, 133, 251, 4, 74, 13, 70, 209, 24, 152, 212, 254, 103, 58, 102, + 163, 18, 162, 120, 137, 57, 163, 233, 116, 184, 142, 63, 17, 14, 161, 128, + 159, 121, 248, 93, 160, 44, 67, 105, 181, 200, 114, 2, 175, 89, 164, 94, + 171, 10, 116, 95, 216, 254, 11, 157, 43, 213, 106, 47, 206, 183, 46, 11, + 14, 61, 204, 46, 150, 23, 230, 87, 252, 140, 14, 120, 168, 72, 40, 25, + 129, 156, 179, 103, 114, 107, 36, 45, 59, 114, 52, 95, 17, 236, 57, 76, + 51, 210, 64, 103, 22, 93, 188, 109, 246, 122, 226, 173, 90, 50, 88, 211, + 210, 140, 228, 145, 84, 168, 253, 153, 119, 184, 50, 113, 37, 111, 109, 122, + 28, 196, 143, 61, 122, 68, 53, 156, 75, 84, 16, 52, 107, 120, 97, 8, + 63, 114, 108, 225, 252, 186, 160, 3, 104, 122, 132, 47, 34, 56, 144, 244, + 103, 33, 74, 129, 206, 174, 110, 162, 94, 255, 220, 70, 214, 174, 215, 191, + 141, 132, 195, 79, 161, 224, 157, 12, 157, 73, 181, 239, 57, 137, 73, 129, + 169, 159, 39, 95, 17, 44, 0, 123, 249, 11, 230, 165, 159, 94, 191, 195, + 235, 156, 28, 37, 48, 37, 43, 0, 78, 182, 210, 191, 5, 62, 236, 134, + 238, 45, 63, 77, 160, 155, 246, 96, 173, 206, 231, 85, 173, 209, 151, 114, + 118, 39, 110, 177, 66, 147, 122, 66, 135, 116, 152, 220, 66, 64, 143, 46, + 179, 162, 57, 223, 239, 35, 49, 234, 205, 240, 152, 74, 92, 62, 157, 245, + 145, 207, 227, 60, 181, 227, 65, 34, 55, 137, 25, 35, 78, 4, 208, 70, + 86, 111, 161, 235, 176, 80, 156, 24, 138, 86, 199, 79, 125, 60, 100, 136, + 110, 41, 227, 93, 48, 29, 60, 230, 18, 156, 6, 171, 20, 222, 44, 38, + 120, 205, 208, 53, 195, 222, 39, 40, 12, 19, 20, 73, 136, 104, 230, 182, + 181, 254, 192, 211, 92, 51, 49, 63, 52, 25, 34, 94, 161, 165, 36, 136, + 116, 171, 150, 26, 101, 24, 172, 98, 221, 191, 235, 254, 108, 220, 199, 201, + 70, 215, 209, 79, 248, 238, 65, 147, 0, 78, 169, 225, 60, 114, 212, 113, + 11, 186, 69, 61, 75, 175, 116, 179, 126, 247, 6, 24, 212, 91, 28, 152, + 233, 144, 88, 118, 170, 70, 222, 77, 246, 69, 234, 38, 251, 105, 199, 44, + 93, 2, 193, 237, 73, 124, 148, 170, 115, 229, 50, 156, 67, 69, 171, 148, + 133, 10, 77, 35, 150, 104, 170, 27, 161, 58, 134, 98, 223, 10, 71, 186, + 250, 237, 126, 86, 243, 64, 187, 241, 197, 108, 214, 56, 125, 73, 227, 3, + 213, 116, 212, 13, 213, 34, 26, 161, 152, 151, 72, 98, 56, 156, 179, 14, + 8, 141, 124, 50, 201, 14, 42, 190, 75, 210, 193, 93, 81, 124, 159, 75, + 37, 181, 81, 35, 17, 159, 72, 241, 208, 118, 119, 36, 93, 195, 20, 126, + 145, 21, 69, 96, 92, 39, 28, 95, 221, 160, 134, 195, 97, 124, 187, 163, + 223, 96, 102, 174, 51, 83, 59, 153, 252, 156, 202, 65, 13, 208, 7, 111, + 99, 249, 55, 100, 5, 219, 151, 94, 83, 47, 185, 127, 37, 27, 161, 100, + 180, 109, 41, 162, 109, 103, 119, 177, 116, 165, 139, 111, 185, 104, 60, 196, + 61, 214, 20, 9, 166, 89, 33, 121, 38, 186, 109, 236, 223, 64, 37, 122, + 253, 112, 236, 161, 12, 107, 102, 10, 65, 103, 3, 254, 50, 254, 10, 89, + 121, 11, 181, 193, 93, 5, 59, 115, 209, 192, 27, 106, 215, 148, 58, 202, + 29, 222, 168, 72, 77, 89, 187, 144, 166, 204, 61, 85, 88, 162, 24, 109, + 28, 47, 134, 120, 247, 131, 23, 23, 178, 250, 180, 99, 176, 169, 21, 62, + 141, 47, 58, 17, 52, 131, 158, 47, 134, 120, 201, 63, 129, 195, 115, 136, + 226, 10, 214, 197, 1, 54, 2, 255, 141, 198, 168, 147, 35, 166, 224, 131, + 87, 33, 161, 19, 77, 86, 36, 43, 89, 204, 34, 190, 156, 70, 224, 56, + 248, 186, 55, 35, 226, 11, 185, 226, 61, 81, 56, 68, 69, 59, 18, 120, + 207, 117, 155, 39, 92, 162, 233, 201, 101, 114, 171, 36, 151, 132, 46, 162, + 168, 234, 241, 50, 163, 33, 228, 120, 82, 117, 137, 81, 230, 208, 152, 35, + 138, 5, 71, 49, 160, 78, 132, 168, 70, 208, 167, 168, 211, 124, 113, 179, + 16, 162, 115, 160, 135, 67, 212, 68, 131, 66, 48, 126, 78, 36, 144, 178, + 255, 151, 160, 47, 234, 230, 255, 208, 60, 13, 231, 225, 117, 100, 254, 103, + 184, 12, 231, 125, 219, 44, 125, 64, 39, 225, 17, 106, 128, 188, 75, 144, + 117, 172, 224, 15, 192, 63, 155, 111, 215, 227, 112, 4, 3, 244, 35, 33, + 181, 253, 8, 253, 75, 12, 64, 201, 54, 255, 253, 237, 27, 132, 184, 104, + 61, 232, 90, 156, 4, 184, 124, 25, 78, 247, 52, 98, 194, 5, 116, 87, + 158, 154, 113, 117, 12, 83, 100, 206, 46, 103, 38, 70, 140, 243, 6, 47, + 21, 96, 88, 170, 229, 98, 202, 192, 179, 196, 54, 18, 11, 65, 183, 233, + 214, 13, 186, 213, 13, 77, 44, 61, 107, 199, 194, 179, 68, 76, 91, 249, + 59, 107, 107, 215, 56, 45, 150, 175, 177, 20, 13, 111, 225, 171, 234, 234, + 189, 21, 212, 145, 232, 28, 4, 25, 190, 153, 42, 37, 238, 213, 119, 82, + 28, 91, 187, 80, 183, 124, 19, 123, 48, 228, 29, 95, 76, 125, 217, 135, + 102, 217, 18, 151, 95, 177, 136, 236, 153, 181, 111, 255, 163, 244, 143, 18, + 252, 51, 158, 152, 255, 40, 149, 182, 37, 190, 89, 146, 253, 203, 90, 27, + 36, 13, 27, 195, 39, 149, 146, 117, 80, 170, 18, 231, 17, 88, 7, 54, + 202, 190, 70, 102, 137, 187, 16, 249, 203, 11, 200, 27, 35, 75, 86, 169, + 228, 150, 226, 56, 55, 29, 135, 194, 48, 45, 30, 125, 199, 1, 53, 16, + 235, 86, 164, 187, 115, 235, 94, 13, 19, 35, 91, 174, 167, 246, 239, 79, + 109, 123, 90, 250, 214, 3, 210, 251, 69, 62, 99, 205, 209, 105, 128, 14, + 226, 237, 232, 244, 124, 139, 242, 60, 101, 174, 227, 195, 162, 191, 26, 133, + 136, 74, 85, 3, 42, 255, 209, 58, 169, 110, 205, 58, 23, 105, 181, 49, + 165, 69, 9, 72, 148, 184, 143, 214, 95, 214, 232, 20, 187, 204, 177, 90, + 103, 110, 108, 9, 36, 34, 174, 27, 102, 198, 59, 230, 205, 200, 20, 157, + 107, 139, 142, 20, 191, 158, 248, 245, 197, 111, 75, 39, 237, 226, 226, 70, + 219, 161, 93, 218, 149, 213, 171, 199, 175, 140, 80, 150, 199, 88, 236, 224, + 192, 82, 36, 87, 148, 85, 176, 157, 103, 110, 10, 98, 60, 51, 85, 153, + 93, 123, 126, 92, 99, 190, 1, 98, 24, 176, 230, 14, 89, 121, 209, 85, + 143, 222, 49, 46, 30, 239, 91, 237, 12, 87, 160, 250, 173, 64, 49, 198, + 77, 175, 210, 84, 227, 83, 139, 148, 145, 205, 252, 24, 217, 44, 110, 178, + 89, 161, 99, 41, 114, 5, 192, 192, 187, 197, 240, 138, 82, 245, 130, 81, + 22, 33, 173, 151, 151, 150, 45, 53, 227, 180, 30, 167, 61, 149, 168, 89, + 110, 195, 107, 83, 180, 133, 165, 217, 248, 175, 39, 205, 27, 49, 221, 49, + 16, 171, 98, 16, 176, 254, 106, 10, 181, 71, 75, 10, 74, 108, 223, 89, + 173, 103, 168, 190, 119, 7, 235, 7, 3, 8, 128, 130, 159, 212, 25, 33, + 190, 10, 54, 53, 82, 125, 3, 199, 103, 157, 123, 193, 53, 194, 214, 84, + 13, 205, 120, 131, 178, 202, 30, 179, 113, 132, 112, 143, 166, 131, 246, 147, + 120, 79, 241, 245, 239, 192, 122, 138, 146, 114, 56, 79, 213, 130, 7, 49, + 158, 169, 26, 127, 73, 190, 19, 78, 0, 92, 215, 21, 97, 132, 230, 50, + 141, 237, 36, 203, 200, 29, 22, 145, 149, 53, 81, 54, 134, 154, 233, 93, + 225, 221, 56, 49, 140, 188, 25, 159, 196, 215, 152, 185, 231, 75, 105, 74, + 45, 115, 83, 76, 33, 127, 190, 235, 202, 140, 8, 46, 163, 186, 96, 177, + 65, 179, 209, 142, 111, 123, 5, 43, 208, 46, 24, 153, 241, 36, 154, 247, + 129, 61, 65, 165, 41, 179, 105, 123, 237, 182, 208, 116, 165, 171, 88, 49, + 235, 91, 233, 166, 218, 172, 193, 175, 212, 90, 211, 3, 170, 119, 138, 198, + 66, 36, 48, 97, 160, 150, 187, 152, 8, 77, 179, 131, 250, 75, 94, 145, + 137, 75, 47, 191, 184, 171, 36, 125, 197, 110, 145, 179, 128, 58, 6, 6, + 48, 43, 88, 163, 29, 173, 105, 143, 183, 177, 233, 50, 113, 216, 104, 139, + 236, 154, 31, 27, 230, 157, 131, 68, 162, 217, 104, 18, 113, 218, 162, 12, + 96, 188, 128, 149, 139, 230, 197, 126, 157, 119, 74, 100, 248, 233, 29, 37, + 159, 51, 52, 170, 53, 226, 13, 177, 30, 160, 37, 233, 9, 154, 245, 162, + 248, 76, 153, 245, 94, 52, 240, 19, 119, 175, 130, 217, 84, 133, 13, 10, + 90, 87, 138, 45, 47, 163, 79, 43, 102, 102, 114, 161, 243, 81, 228, 137, + 219, 85, 238, 76, 44, 182, 155, 123, 136, 149, 96, 209, 94, 83, 23, 181, + 223, 207, 76, 150, 85, 66, 43, 104, 155, 63, 236, 89, 63, 23, 217, 65, + 214, 1, 4, 60, 117, 185, 169, 250, 160, 240, 86, 19, 57, 117, 152, 165, + 72, 157, 155, 246, 10, 70, 57, 209, 223, 107, 189, 195, 153, 156, 198, 175, + 133, 186, 201, 95, 162, 251, 127, 166, 86, 253, 98, 38, 141, 251, 190, 192, + 32, 172, 243, 70, 97, 157, 167, 144, 254, 128, 225, 96, 187, 192, 175, 57, + 30, 200, 45, 136, 16, 4, 245, 131, 243, 190, 159, 28, 161, 205, 189, 67, + 20, 191, 110, 190, 222, 112, 217, 56, 86, 208, 238, 191, 255, 214, 17, 83, + 67, 178, 137, 199, 164, 245, 160, 177, 216, 124, 245, 193, 104, 101, 6, 67, + 11, 65, 132, 155, 13, 250, 206, 213, 134, 103, 253, 59, 18, 172, 180, 201, + 228, 111, 95, 43, 121, 75, 101, 253, 56, 130, 181, 254, 186, 4, 107, 157, + 34, 88, 155, 223, 177, 191, 55, 191, 181, 191, 69, 143, 110, 30, 215, 163, + 155, 175, 219, 163, 27, 173, 71, 213, 9, 89, 25, 41, 19, 197, 39, 83, + 194, 98, 221, 72, 33, 35, 84, 247, 17, 79, 249, 242, 97, 55, 18, 40, + 46, 20, 53, 68, 27, 181, 216, 44, 20, 239, 125, 72, 202, 104, 62, 224, + 70, 130, 77, 35, 147, 230, 115, 116, 241, 68, 211, 194, 157, 47, 28, 236, + 160, 219, 88, 207, 210, 27, 247, 244, 160, 223, 174, 4, 249, 47, 122, 1, + 65, 253, 86, 232, 217, 66, 215, 186, 36, 41, 94, 49, 173, 81, 243, 172, + 253, 226, 190, 20, 107, 91, 147, 90, 223, 140, 166, 30, 31, 38, 53, 107, + 168, 241, 109, 127, 166, 25, 218, 97, 162, 81, 56, 165, 235, 60, 78, 139, + 111, 122, 77, 124, 182, 100, 53, 187, 209, 172, 59, 84, 0, 192, 182, 235, + 189, 36, 5, 45, 190, 42, 121, 145, 40, 77, 123, 214, 64, 100, 101, 217, + 162, 72, 86, 195, 86, 101, 230, 217, 156, 8, 232, 21, 179, 105, 94, 193, + 254, 133, 64, 16, 151, 200, 120, 35, 192, 137, 102, 35, 101, 212, 76, 215, + 59, 48, 235, 240, 239, 75, 1, 83, 210, 229, 227, 74, 230, 76, 44, 65, + 134, 240, 50, 95, 235, 19, 10, 140, 251, 4, 145, 124, 112, 104, 6, 40, + 187, 197, 164, 56, 155, 214, 194, 218, 19, 78, 35, 80, 235, 254, 50, 115, + 8, 206, 152, 99, 82, 41, 112, 164, 53, 89, 115, 142, 14, 77, 171, 100, + 21, 244, 151, 68, 79, 113, 141, 118, 84, 196, 122, 157, 169, 137, 234, 64, + 58, 48, 61, 219, 67, 216, 57, 84, 171, 99, 188, 161, 243, 100, 63, 176, + 76, 1, 111, 224, 71, 225, 252, 186, 16, 54, 101, 30, 223, 40, 244, 244, + 187, 4, 49, 52, 66, 43, 124, 197, 7, 105, 187, 179, 150, 15, 27, 249, + 176, 154, 47, 160, 182, 16, 35, 126, 55, 226, 119, 5, 67, 3, 161, 244, + 239, 134, 254, 133, 148, 179, 8, 115, 91, 203, 135, 141, 124, 88, 245, 34, + 169, 113, 190, 142, 31, 55, 242, 49, 69, 16, 223, 200, 198, 237, 4, 108, + 193, 102, 255, 30, 90, 172, 101, 189, 171, 146, 84, 244, 102, 4, 67, 53, + 133, 179, 181, 154, 232, 152, 55, 140, 146, 115, 57, 153, 57, 236, 157, 194, + 11, 88, 154, 180, 83, 49, 54, 159, 188, 48, 104, 156, 54, 126, 108, 55, + 167, 85, 135, 19, 137, 209, 11, 196, 224, 5, 98, 236, 208, 76, 217, 172, + 56, 174, 144, 225, 244, 123, 85, 76, 75, 195, 23, 240, 104, 6, 60, 152, + 156, 47, 14, 104, 128, 227, 25, 224, 112, 170, 143, 241, 206, 171, 59, 33, + 51, 235, 112, 209, 159, 139, 60, 112, 88, 3, 49, 206, 129, 24, 102, 69, + 16, 213, 104, 7, 106, 176, 3, 53, 214, 133, 100, 18, 113, 25, 237, 230, + 145, 107, 59, 232, 27, 128, 94, 170, 106, 158, 43, 141, 114, 178, 149, 199, + 183, 29, 121, 84, 133, 29, 11, 165, 119, 125, 169, 108, 238, 39, 193, 142, + 206, 220, 115, 157, 85, 73, 174, 43, 148, 213, 169, 181, 117, 255, 196, 76, + 201, 124, 241, 43, 27, 111, 209, 8, 236, 96, 114, 3, 164, 110, 6, 171, + 119, 20, 70, 227, 252, 182, 199, 170, 63, 82, 220, 65, 117, 39, 219, 239, + 86, 59, 174, 183, 38, 66, 52, 82, 85, 45, 212, 144, 78, 144, 111, 170, + 125, 66, 33, 25, 235, 74, 151, 42, 249, 213, 45, 101, 85, 125, 155, 177, + 178, 239, 210, 67, 241, 138, 82, 49, 50, 7, 234, 157, 244, 140, 204, 158, + 122, 39, 101, 35, 99, 134, 178, 207, 164, 134, 48, 1, 7, 49, 26, 149, + 252, 99, 221, 37, 76, 234, 88, 75, 207, 118, 172, 1, 254, 211, 243, 164, + 174, 18, 246, 0, 254, 192, 36, 168, 215, 206, 208, 243, 64, 195, 148, 15, + 154, 12, 198, 128, 160, 182, 141, 14, 131, 106, 132, 123, 6, 51, 200, 17, + 15, 70, 161, 110, 83, 23, 173, 141, 135, 236, 130, 231, 255, 69, 202, 42, + 91, 247, 39, 105, 253, 147, 180, 138, 185, 240, 64, 218, 90, 71, 165, 85, + 179, 133, 80, 219, 240, 183, 207, 127, 72, 154, 100, 54, 77, 97, 221, 211, + 84, 12, 44, 169, 206, 117, 100, 10, 158, 142, 25, 146, 58, 154, 18, 240, + 29, 38, 117, 244, 164, 89, 244, 151, 60, 50, 187, 11, 159, 204, 116, 124, + 116, 47, 209, 164, 170, 39, 43, 162, 136, 104, 78, 13, 31, 66, 73, 119, + 84, 58, 143, 186, 222, 67, 70, 73, 36, 205, 186, 45, 248, 175, 41, 133, + 200, 181, 6, 62, 183, 207, 9, 52, 210, 217, 63, 55, 28, 21, 147, 33, + 109, 117, 249, 80, 76, 218, 110, 102, 112, 162, 187, 153, 245, 51, 157, 31, + 205, 39, 211, 193, 4, 27, 36, 147, 204, 119, 94, 23, 165, 111, 127, 96, + 255, 210, 114, 87, 79, 41, 134, 120, 71, 73, 197, 154, 177, 209, 165, 217, + 11, 2, 215, 168, 211, 1, 162, 105, 14, 250, 124, 219, 6, 61, 179, 90, + 173, 214, 235, 181, 193, 106, 171, 164, 183, 74, 59, 1, 255, 58, 30, 66, + 108, 182, 184, 143, 56, 133, 49, 255, 60, 211, 250, 143, 183, 13, 145, 38, + 198, 227, 172, 55, 8, 32, 242, 35, 156, 83, 96, 39, 218, 99, 141, 251, + 122, 4, 4, 45, 121, 133, 0, 89, 14, 67, 52, 220, 225, 218, 24, 142, + 26, 8, 206, 64, 170, 72, 211, 183, 137, 180, 166, 147, 103, 182, 217, 235, + 18, 148, 147, 126, 220, 77, 163, 252, 144, 109, 181, 128, 243, 201, 140, 33, + 97, 44, 69, 243, 238, 172, 143, 189, 59, 153, 71, 64, 34, 9, 111, 246, + 18, 39, 87, 118, 49, 197, 122, 63, 25, 164, 30, 82, 39, 77, 162, 245, + 32, 224, 85, 49, 145, 205, 84, 42, 177, 22, 177, 101, 245, 8, 254, 37, + 26, 19, 94, 204, 207, 196, 124, 245, 16, 15, 117, 56, 185, 74, 146, 28, + 203, 236, 64, 90, 7, 200, 157, 131, 31, 25, 220, 49, 154, 230, 181, 81, + 41, 151, 44, 183, 84, 174, 26, 8, 169, 140, 138, 25, 119, 209, 232, 36, + 232, 148, 87, 101, 182, 207, 141, 78, 143, 225, 109, 83, 230, 235, 94, 145, + 40, 246, 30, 40, 123, 108, 103, 111, 37, 229, 82, 212, 7, 101, 11, 232, + 171, 154, 161, 75, 131, 237, 223, 35, 156, 166, 194, 63, 23, 6, 80, 61, + 148, 198, 196, 51, 199, 21, 55, 81, 104, 65, 124, 226, 82, 219, 146, 112, + 42, 194, 27, 151, 248, 118, 93, 240, 237, 0, 190, 149, 32, 161, 235, 213, + 166, 203, 25, 37, 66, 118, 228, 186, 41, 200, 181, 167, 229, 186, 89, 173, + 211, 185, 110, 86, 169, 92, 97, 222, 138, 220, 217, 202, 249, 105, 157, 10, + 157, 56, 158, 192, 124, 201, 91, 236, 90, 31, 25, 15, 109, 182, 241, 208, + 150, 24, 137, 150, 80, 138, 67, 156, 68, 147, 30, 112, 112, 203, 23, 158, + 154, 48, 16, 128, 112, 175, 75, 188, 1, 76, 153, 173, 225, 133, 32, 218, + 67, 192, 186, 28, 18, 122, 210, 33, 76, 227, 16, 222, 4, 123, 179, 226, + 238, 26, 221, 34, 255, 10, 45, 131, 40, 228, 89, 225, 95, 13, 231, 216, + 171, 161, 233, 172, 179, 170, 77, 35, 180, 38, 89, 86, 171, 64, 145, 128, + 187, 61, 79, 38, 66, 179, 218, 84, 34, 23, 19, 57, 233, 122, 58, 57, + 245, 36, 192, 230, 13, 1, 222, 194, 203, 94, 195, 188, 35, 147, 2, 100, + 203, 37, 84, 114, 83, 216, 245, 213, 100, 28, 122, 120, 151, 244, 168, 47, + 244, 180, 51, 226, 102, 93, 77, 178, 183, 96, 29, 202, 254, 213, 205, 48, + 126, 234, 44, 214, 211, 62, 137, 160, 255, 26, 93, 15, 38, 227, 201, 45, + 113, 111, 232, 79, 22, 233, 126, 131, 120, 183, 191, 254, 77, 247, 196, 194, + 165, 177, 186, 59, 223, 2, 135, 38, 229, 21, 206, 144, 63, 51, 255, 3, + 166, 209, 124, 50, 118, 254, 6, 60, 226, 155, 104, 177, 64, 57, 212, 67, + 112, 19, 148, 112, 142, 24, 177, 222, 34, 240, 232, 129, 178, 14, 154, 141, + 3, 193, 87, 105, 213, 222, 165, 79, 99, 194, 25, 82, 116, 140, 15, 108, + 16, 130, 115, 225, 221, 177, 161, 58, 43, 1, 197, 30, 95, 136, 251, 80, + 108, 252, 214, 194, 130, 19, 176, 236, 109, 93, 46, 174, 247, 133, 114, 26, + 248, 240, 206, 72, 73, 206, 109, 132, 222, 214, 116, 228, 12, 148, 122, 154, + 243, 69, 127, 138, 215, 215, 216, 120, 149, 51, 179, 48, 86, 107, 215, 61, + 58, 204, 39, 21, 233, 209, 52, 108, 159, 4, 30, 112, 88, 114, 63, 111, + 8, 210, 211, 70, 99, 218, 122, 212, 167, 128, 121, 223, 172, 199, 59, 32, + 46, 62, 224, 104, 172, 150, 81, 199, 107, 114, 224, 133, 28, 228, 111, 90, + 49, 127, 131, 209, 119, 150, 191, 135, 55, 243, 205, 166, 91, 199, 75, 122, + 132, 41, 143, 70, 85, 130, 43, 143, 78, 9, 240, 92, 157, 244, 212, 237, + 186, 81, 112, 187, 206, 3, 212, 185, 154, 12, 123, 163, 126, 196, 86, 1, + 177, 66, 135, 62, 163, 195, 110, 23, 54, 202, 153, 180, 46, 144, 122, 190, + 241, 148, 126, 172, 202, 189, 24, 206, 124, 149, 144, 127, 135, 10, 57, 167, + 92, 35, 53, 130, 247, 207, 230, 151, 164, 26, 166, 213, 52, 165, 24, 191, + 123, 38, 179, 202, 187, 43, 167, 178, 214, 43, 44, 49, 49, 242, 122, 75, + 135, 237, 148, 90, 30, 47, 245, 25, 238, 38, 102, 116, 107, 199, 140, 222, + 209, 244, 123, 38, 175, 169, 183, 89, 206, 223, 164, 107, 129, 82, 201, 230, + 17, 218, 150, 212, 104, 112, 167, 228, 112, 151, 186, 114, 163, 135, 179, 17, + 203, 116, 241, 214, 179, 190, 39, 236, 150, 137, 211, 3, 110, 16, 10, 3, + 166, 209, 37, 233, 1, 233, 199, 204, 70, 184, 22, 10, 38, 26, 30, 136, + 195, 89, 15, 22, 233, 240, 166, 187, 214, 39, 155, 169, 77, 54, 243, 235, + 78, 174, 31, 85, 37, 156, 255, 194, 90, 60, 134, 94, 182, 155, 191, 97, + 66, 37, 91, 159, 156, 84, 153, 158, 201, 155, 88, 237, 102, 202, 107, 197, + 125, 147, 169, 176, 169, 187, 39, 84, 102, 254, 248, 95, 100, 254, 0, 233, + 66, 125, 65, 180, 23, 128, 99, 68, 223, 217, 79, 77, 167, 116, 186, 135, + 77, 172, 148, 192, 207, 60, 227, 106, 157, 139, 77, 87, 81, 112, 29, 138, + 232, 173, 250, 234, 126, 137, 79, 90, 2, 56, 159, 134, 221, 34, 215, 184, + 135, 98, 203, 212, 11, 45, 154, 28, 170, 27, 243, 5, 153, 56, 107, 18, + 193, 4, 19, 130, 68, 61, 221, 226, 221, 32, 16, 56, 111, 96, 183, 112, + 147, 192, 65, 90, 7, 228, 29, 204, 115, 55, 64, 239, 95, 85, 24, 58, + 20, 243, 200, 4, 110, 206, 172, 195, 127, 48, 217, 113, 30, 25, 177, 116, + 148, 30, 247, 249, 209, 209, 4, 165, 251, 54, 238, 191, 53, 237, 56, 204, + 15, 123, 116, 182, 222, 187, 87, 110, 218, 235, 19, 86, 13, 2, 89, 224, + 49, 118, 212, 95, 12, 38, 189, 28, 152, 208, 183, 90, 186, 244, 140, 172, + 148, 249, 179, 164, 36, 16, 97, 64, 209, 19, 2, 240, 214, 192, 66, 78, + 112, 136, 28, 188, 118, 235, 143, 231, 33, 126, 188, 221, 1, 17, 38, 170, + 81, 56, 53, 133, 11, 92, 159, 248, 109, 229, 236, 154, 253, 225, 48, 30, + 83, 234, 221, 99, 246, 28, 152, 63, 49, 46, 56, 201, 240, 72, 16, 2, + 39, 94, 215, 59, 1, 9, 158, 222, 37, 250, 1, 54, 158, 156, 113, 138, + 196, 236, 212, 73, 146, 107, 103, 27, 109, 203, 94, 129, 169, 207, 109, 204, + 3, 180, 66, 151, 194, 228, 104, 23, 78, 43, 107, 4, 226, 16, 167, 21, + 124, 254, 216, 196, 223, 25, 31, 4, 204, 89, 162, 117, 2, 137, 10, 185, + 56, 23, 232, 19, 66, 89, 197, 16, 37, 56, 31, 144, 233, 109, 19, 62, + 8, 73, 86, 248, 188, 66, 39, 9, 60, 115, 152, 123, 166, 39, 47, 112, + 33, 103, 107, 57, 200, 153, 45, 172, 154, 122, 159, 253, 112, 167, 192, 232, + 55, 6, 178, 65, 53, 220, 225, 100, 114, 125, 51, 85, 175, 49, 18, 152, + 221, 193, 253, 179, 19, 78, 167, 179, 201, 42, 158, 140, 102, 145, 137, 241, + 87, 43, 78, 151, 193, 191, 21, 109, 207, 161, 199, 232, 75, 130, 145, 104, + 25, 247, 38, 188, 133, 141, 234, 42, 97, 105, 156, 139, 169, 19, 87, 121, + 42, 14, 58, 113, 141, 89, 119, 88, 171, 115, 176, 47, 1, 225, 98, 212, + 184, 194, 141, 93, 14, 84, 219, 110, 219, 47, 147, 131, 215, 25, 132, 100, + 58, 144, 242, 195, 25, 235, 68, 227, 91, 119, 221, 69, 120, 184, 105, 52, + 38, 144, 188, 230, 189, 189, 192, 219, 57, 102, 237, 44, 161, 249, 120, 169, + 160, 242, 87, 232, 174, 148, 171, 41, 115, 77, 153, 58, 199, 106, 209, 104, + 54, 129, 112, 213, 210, 184, 153, 68, 92, 189, 62, 172, 184, 17, 137, 38, + 128, 192, 163, 236, 11, 149, 28, 198, 55, 163, 11, 161, 101, 115, 159, 70, + 182, 238, 110, 179, 37, 172, 184, 232, 35, 101, 165, 145, 108, 116, 49, 218, + 94, 158, 122, 182, 222, 185, 76, 92, 26, 47, 141, 84, 143, 39, 124, 113, + 182, 210, 122, 214, 158, 50, 201, 242, 50, 26, 216, 110, 51, 79, 5, 91, + 142, 69, 146, 165, 42, 28, 3, 193, 82, 197, 206, 233, 144, 173, 138, 41, + 86, 5, 202, 109, 194, 49, 13, 122, 221, 182, 60, 32, 80, 220, 163, 212, + 53, 168, 217, 45, 186, 133, 7, 49, 7, 169, 52, 62, 107, 198, 35, 73, + 46, 171, 208, 10, 196, 67, 19, 11, 31, 29, 72, 66, 139, 134, 147, 43, + 143, 92, 93, 161, 13, 72, 213, 113, 241, 72, 168, 251, 243, 129, 253, 167, + 183, 21, 38, 75, 214, 157, 131, 43, 133, 26, 186, 69, 231, 57, 108, 39, + 178, 180, 189, 143, 21, 75, 21, 84, 71, 231, 65, 136, 143, 192, 177, 131, + 130, 88, 168, 9, 10, 165, 109, 233, 153, 171, 151, 151, 174, 186, 149, 2, + 163, 166, 81, 191, 52, 155, 177, 210, 184, 209, 91, 73, 59, 149, 155, 74, + 211, 190, 107, 213, 226, 111, 183, 216, 136, 222, 250, 158, 248, 13, 219, 196, + 80, 37, 154, 118, 113, 82, 60, 35, 43, 215, 43, 86, 111, 101, 91, 189, + 53, 252, 109, 136, 121, 192, 1, 6, 70, 84, 165, 55, 212, 136, 146, 234, + 122, 141, 109, 185, 182, 232, 191, 43, 147, 84, 162, 75, 0, 39, 178, 130, + 14, 129, 159, 53, 255, 108, 24, 81, 34, 125, 50, 199, 242, 247, 24, 95, + 218, 90, 162, 191, 34, 171, 39, 122, 167, 248, 196, 206, 115, 158, 40, 217, + 180, 27, 34, 165, 153, 47, 102, 253, 241, 21, 2, 187, 221, 75, 148, 33, + 54, 10, 135, 10, 14, 226, 193, 148, 71, 1, 171, 57, 88, 230, 67, 78, + 76, 26, 169, 61, 72, 147, 90, 215, 101, 176, 206, 69, 24, 13, 129, 202, + 54, 94, 74, 210, 155, 170, 94, 161, 5, 71, 93, 167, 17, 130, 217, 72, + 208, 9, 217, 61, 20, 103, 27, 57, 189, 150, 160, 22, 47, 183, 140, 145, + 156, 161, 25, 7, 138, 102, 164, 73, 134, 27, 147, 12, 61, 166, 165, 204, + 57, 90, 247, 211, 18, 213, 163, 242, 56, 38, 6, 146, 72, 7, 239, 117, + 236, 219, 3, 88, 111, 238, 63, 241, 206, 39, 124, 209, 93, 166, 236, 174, + 98, 25, 21, 80, 141, 247, 192, 102, 91, 94, 13, 72, 143, 121, 138, 143, + 126, 205, 242, 183, 184, 225, 83, 197, 82, 132, 64, 199, 67, 36, 253, 139, + 49, 48, 49, 225, 213, 21, 28, 9, 52, 175, 113, 24, 40, 128, 116, 140, + 75, 156, 202, 165, 154, 68, 94, 82, 46, 253, 42, 223, 218, 227, 111, 209, + 249, 41, 135, 240, 235, 145, 49, 150, 232, 72, 150, 135, 232, 72, 230, 216, + 35, 140, 38, 211, 49, 199, 2, 21, 105, 164, 82, 248, 148, 98, 68, 41, + 124, 136, 28, 137, 20, 212, 65, 210, 91, 171, 114, 59, 58, 102, 240, 158, + 177, 75, 142, 71, 153, 50, 18, 35, 134, 165, 210, 153, 171, 178, 170, 42, + 56, 163, 218, 10, 101, 200, 99, 23, 254, 95, 21, 32, 68, 140, 171, 84, + 178, 222, 123, 165, 10, 16, 236, 77, 127, 54, 201, 143, 193, 179, 82, 85, + 224, 44, 13, 9, 115, 201, 252, 140, 112, 74, 80, 180, 249, 249, 56, 24, + 19, 150, 210, 103, 129, 180, 52, 149, 49, 83, 25, 51, 181, 233, 180, 117, + 54, 100, 120, 37, 81, 183, 105, 181, 38, 158, 62, 87, 13, 250, 79, 58, + 9, 94, 189, 176, 90, 52, 179, 158, 85, 214, 248, 200, 40, 80, 113, 39, + 32, 14, 165, 94, 205, 59, 168, 103, 13, 254, 182, 84, 217, 83, 89, 83, + 170, 226, 136, 171, 56, 202, 86, 113, 196, 85, 28, 137, 42, 234, 101, 192, + 193, 105, 106, 163, 55, 220, 207, 8, 249, 244, 179, 253, 51, 182, 254, 212, + 172, 7, 168, 58, 90, 249, 249, 26, 2, 108, 234, 28, 4, 124, 194, 122, + 159, 238, 5, 37, 235, 212, 43, 29, 25, 48, 73, 176, 203, 163, 171, 10, + 214, 99, 24, 142, 46, 122, 8, 90, 77, 210, 117, 20, 92, 66, 204, 89, + 147, 63, 38, 31, 179, 84, 159, 107, 236, 83, 219, 188, 62, 198, 57, 95, + 225, 143, 168, 3, 248, 241, 236, 26, 184, 80, 160, 199, 37, 75, 78, 226, + 18, 214, 25, 43, 245, 223, 11, 46, 237, 140, 114, 180, 181, 174, 56, 135, + 72, 53, 25, 113, 122, 254, 247, 66, 213, 249, 41, 221, 51, 253, 5, 66, + 255, 123, 81, 43, 232, 35, 194, 253, 154, 174, 43, 211, 95, 160, 182, 52, + 149, 240, 64, 75, 237, 153, 254, 66, 158, 117, 209, 187, 44, 229, 81, 131, + 128, 122, 240, 243, 145, 0, 164, 42, 89, 188, 220, 74, 246, 47, 54, 229, + 42, 167, 54, 100, 157, 55, 189, 225, 132, 43, 230, 163, 252, 94, 172, 204, + 18, 133, 63, 48, 15, 57, 114, 205, 234, 17, 16, 175, 81, 184, 58, 19, + 185, 32, 195, 213, 196, 219, 91, 174, 149, 173, 130, 175, 69, 200, 121, 214, + 102, 89, 110, 88, 172, 101, 158, 143, 108, 195, 186, 196, 242, 76, 240, 43, + 156, 144, 182, 118, 62, 128, 118, 174, 190, 81, 234, 12, 193, 182, 146, 111, + 69, 137, 177, 14, 184, 84, 22, 207, 49, 75, 206, 67, 220, 38, 226, 138, + 4, 89, 101, 172, 233, 152, 203, 115, 183, 106, 9, 58, 130, 129, 70, 208, + 71, 121, 138, 246, 95, 80, 75, 252, 183, 152, 118, 200, 113, 192, 67, 253, + 170, 232, 84, 35, 146, 160, 188, 101, 37, 191, 160, 11, 105, 10, 90, 227, + 113, 62, 171, 28, 72, 122, 54, 253, 216, 88, 192, 212, 252, 213, 217, 202, + 7, 152, 173, 220, 100, 225, 241, 86, 201, 232, 138, 148, 200, 102, 253, 144, + 65, 68, 46, 162, 49, 68, 59, 228, 18, 8, 187, 5, 35, 248, 45, 115, + 130, 140, 138, 84, 184, 240, 154, 168, 187, 144, 224, 45, 2, 39, 86, 31, + 211, 217, 77, 119, 113, 67, 110, 50, 250, 108, 44, 240, 213, 70, 141, 141, + 87, 177, 39, 238, 199, 45, 150, 221, 80, 40, 167, 17, 61, 239, 54, 19, + 35, 209, 65, 141, 118, 226, 11, 121, 60, 30, 167, 169, 151, 90, 76, 152, + 23, 245, 154, 82, 157, 203, 81, 64, 74, 200, 76, 177, 212, 39, 194, 23, + 165, 117, 207, 118, 54, 155, 155, 121, 96, 36, 27, 45, 132, 161, 196, 201, + 105, 214, 53, 210, 211, 76, 210, 170, 58, 183, 113, 146, 69, 195, 70, 177, + 99, 53, 59, 215, 57, 25, 122, 147, 129, 74, 39, 234, 12, 12, 138, 64, + 140, 117, 143, 61, 205, 146, 126, 62, 8, 167, 92, 197, 33, 25, 105, 115, + 157, 37, 138, 44, 155, 199, 207, 20, 55, 45, 90, 52, 97, 213, 151, 47, + 49, 138, 144, 85, 120, 133, 202, 44, 255, 132, 195, 136, 205, 84, 163, 200, + 109, 126, 212, 32, 230, 183, 237, 107, 140, 34, 133, 124, 227, 154, 243, 57, + 66, 125, 108, 77, 186, 192, 229, 23, 116, 185, 140, 41, 144, 11, 86, 106, + 133, 110, 172, 85, 24, 161, 164, 186, 194, 65, 218, 191, 213, 152, 91, 119, + 60, 99, 38, 143, 183, 232, 119, 26, 54, 227, 154, 208, 76, 216, 171, 184, + 117, 241, 88, 37, 17, 249, 231, 84, 194, 76, 2, 172, 233, 236, 164, 169, + 46, 97, 196, 12, 239, 179, 23, 105, 158, 111, 116, 169, 34, 90, 245, 89, + 75, 251, 57, 78, 235, 166, 211, 142, 110, 209, 145, 175, 186, 142, 177, 225, + 36, 219, 185, 158, 201, 137, 125, 200, 61, 244, 194, 11, 96, 220, 208, 205, + 22, 11, 64, 169, 155, 92, 9, 109, 142, 154, 51, 2, 141, 145, 67, 52, + 225, 190, 129, 158, 101, 194, 113, 183, 143, 214, 48, 212, 66, 84, 26, 107, + 19, 124, 35, 156, 226, 45, 119, 207, 219, 26, 157, 79, 151, 113, 129, 119, + 210, 157, 119, 44, 157, 32, 128, 12, 161, 143, 122, 135, 78, 62, 42, 75, + 7, 131, 46, 27, 64, 121, 25, 61, 210, 17, 126, 84, 170, 31, 189, 122, + 101, 173, 189, 85, 203, 216, 132, 103, 149, 229, 11, 15, 134, 70, 86, 0, + 239, 218, 209, 137, 240, 194, 13, 88, 33, 164, 162, 188, 136, 163, 120, 5, + 122, 28, 242, 65, 223, 62, 80, 202, 194, 203, 166, 169, 167, 210, 92, 227, + 140, 113, 226, 104, 68, 5, 48, 22, 16, 184, 64, 49, 209, 194, 115, 224, + 161, 90, 179, 174, 97, 28, 169, 225, 214, 130, 117, 5, 180, 110, 112, 48, + 171, 45, 106, 12, 36, 72, 70, 44, 124, 138, 247, 96, 87, 237, 193, 174, + 218, 131, 93, 59, 37, 158, 220, 229, 105, 170, 96, 95, 21, 119, 65, 149, + 159, 129, 67, 253, 187, 253, 174, 154, 190, 24, 251, 90, 27, 231, 58, 224, + 150, 145, 135, 15, 109, 39, 141, 5, 144, 94, 187, 125, 15, 48, 76, 78, + 119, 9, 121, 128, 56, 199, 187, 85, 41, 16, 112, 147, 2, 1, 203, 45, + 132, 82, 119, 147, 72, 234, 116, 219, 15, 85, 17, 130, 72, 35, 198, 134, + 114, 53, 108, 40, 77, 68, 192, 221, 156, 119, 29, 39, 61, 122, 104, 178, + 197, 86, 226, 142, 214, 106, 103, 17, 206, 11, 237, 62, 135, 103, 231, 70, + 111, 133, 88, 51, 212, 82, 190, 132, 91, 121, 52, 41, 45, 136, 112, 92, + 20, 181, 201, 120, 143, 227, 215, 36, 62, 64, 129, 22, 199, 111, 100, 188, + 207, 241, 27, 146, 41, 160, 164, 139, 226, 43, 148, 147, 141, 255, 84, 205, + 10, 125, 118, 132, 255, 240, 203, 198, 221, 195, 127, 170, 40, 246, 138, 221, + 137, 248, 100, 0, 199, 134, 110, 168, 189, 85, 27, 212, 122, 91, 219, 23, + 71, 147, 248, 204, 214, 48, 34, 116, 219, 174, 228, 19, 182, 215, 110, 37, + 95, 219, 164, 94, 86, 41, 223, 125, 220, 150, 171, 124, 183, 12, 212, 13, + 175, 106, 80, 86, 102, 150, 224, 3, 27, 142, 133, 149, 219, 224, 83, 165, + 148, 140, 194, 175, 33, 138, 168, 146, 213, 174, 146, 3, 111, 56, 160, 222, + 58, 81, 245, 56, 176, 90, 246, 45, 84, 165, 239, 53, 209, 131, 250, 16, + 136, 85, 112, 183, 216, 26, 51, 62, 245, 24, 151, 132, 168, 91, 177, 48, + 66, 161, 142, 245, 208, 199, 195, 21, 154, 109, 102, 116, 83, 227, 168, 196, + 110, 44, 28, 105, 19, 230, 125, 129, 118, 241, 240, 102, 4, 108, 49, 126, + 168, 180, 111, 165, 231, 66, 229, 147, 62, 206, 253, 140, 36, 142, 113, 97, + 89, 253, 227, 100, 77, 244, 10, 20, 105, 31, 207, 3, 152, 228, 87, 232, + 50, 145, 21, 155, 224, 29, 93, 230, 117, 205, 43, 84, 65, 182, 155, 232, + 94, 29, 21, 147, 235, 42, 218, 151, 209, 50, 158, 19, 64, 186, 141, 72, + 135, 14, 252, 200, 162, 144, 107, 54, 162, 37, 108, 53, 203, 208, 99, 48, + 159, 39, 11, 178, 49, 204, 86, 151, 181, 227, 224, 172, 127, 82, 130, 61, + 118, 16, 206, 205, 210, 221, 124, 91, 58, 241, 149, 145, 68, 149, 29, 253, + 101, 142, 166, 147, 43, 102, 176, 174, 70, 161, 43, 109, 149, 233, 205, 227, + 183, 156, 17, 187, 20, 104, 121, 88, 112, 140, 137, 250, 24, 12, 33, 46, + 46, 240, 164, 83, 55, 46, 48, 240, 139, 112, 132, 176, 150, 158, 237, 27, + 92, 91, 77, 108, 233, 189, 208, 161, 101, 252, 23, 201, 27, 254, 251, 171, + 156, 4, 17, 202, 30, 108, 231, 82, 17, 32, 15, 66, 134, 116, 60, 166, + 225, 44, 28, 14, 251, 67, 179, 116, 65, 146, 116, 23, 86, 206, 5, 41, + 120, 122, 37, 244, 226, 117, 49, 207, 246, 121, 218, 253, 15, 14, 0, 226, + 40, 74, 111, 82, 77, 244, 153, 168, 188, 20, 177, 211, 68, 244, 6, 22, + 15, 14, 62, 1, 191, 134, 187, 108, 14, 195, 155, 84, 252, 22, 133, 153, + 178, 180, 28, 174, 23, 133, 59, 105, 215, 83, 49, 2, 177, 18, 117, 239, + 28, 82, 217, 0, 82, 157, 76, 123, 154, 242, 41, 4, 219, 0, 47, 251, + 188, 109, 225, 221, 139, 219, 208, 24, 102, 106, 77, 17, 171, 156, 245, 153, + 212, 120, 137, 189, 107, 78, 39, 75, 120, 246, 244, 51, 121, 78, 7, 39, + 92, 2, 30, 36, 241, 136, 124, 245, 138, 62, 46, 52, 213, 34, 168, 170, + 0, 59, 107, 184, 236, 5, 176, 153, 181, 244, 200, 118, 48, 246, 102, 106, + 98, 201, 206, 97, 223, 127, 154, 3, 42, 207, 22, 238, 235, 164, 60, 155, + 181, 145, 80, 136, 61, 21, 80, 104, 172, 239, 1, 220, 16, 17, 86, 160, + 238, 125, 7, 249, 219, 41, 238, 54, 83, 116, 81, 215, 119, 14, 234, 228, + 201, 110, 107, 92, 96, 62, 99, 113, 19, 32, 207, 244, 125, 213, 101, 230, + 5, 170, 86, 102, 48, 205, 34, 160, 35, 164, 145, 4, 188, 149, 161, 8, + 25, 188, 117, 99, 219, 145, 58, 238, 55, 102, 253, 35, 26, 41, 64, 177, + 230, 199, 6, 63, 193, 217, 129, 146, 144, 31, 15, 62, 13, 200, 15, 91, + 78, 222, 135, 192, 192, 165, 244, 145, 189, 252, 204, 144, 90, 97, 205, 60, + 174, 126, 102, 25, 49, 182, 147, 126, 203, 204, 151, 242, 106, 38, 252, 133, + 61, 100, 162, 194, 249, 120, 49, 185, 201, 157, 250, 197, 130, 37, 198, 212, + 114, 219, 47, 242, 177, 51, 235, 92, 60, 196, 27, 178, 34, 74, 143, 3, + 2, 227, 121, 162, 106, 193, 52, 90, 175, 75, 114, 146, 232, 183, 166, 48, + 252, 73, 84, 170, 11, 58, 4, 156, 4, 124, 114, 230, 19, 2, 140, 39, + 121, 244, 193, 179, 29, 249, 199, 133, 220, 77, 31, 58, 244, 0, 47, 38, + 204, 216, 216, 170, 63, 99, 103, 210, 187, 133, 83, 157, 175, 46, 157, 250, + 11, 213, 227, 255, 71, 194, 41, 238, 120, 37, 155, 162, 215, 175, 35, 154, + 130, 172, 231, 255, 28, 34, 13, 173, 145, 7, 70, 162, 197, 79, 147, 75, + 105, 45, 251, 61, 196, 82, 84, 227, 34, 169, 20, 55, 231, 171, 8, 165, + 254, 217, 6, 144, 69, 82, 122, 131, 159, 40, 145, 250, 202, 227, 247, 175, + 44, 144, 162, 222, 125, 152, 60, 74, 38, 125, 136, 56, 74, 159, 171, 95, + 69, 26, 146, 79, 199, 255, 149, 133, 33, 217, 206, 250, 195, 101, 33, 220, + 201, 127, 138, 66, 254, 201, 69, 33, 59, 37, 33, 209, 56, 37, 9, 97, + 109, 245, 251, 77, 121, 235, 69, 86, 188, 228, 239, 94, 234, 158, 199, 22, + 148, 21, 228, 67, 152, 104, 142, 80, 45, 20, 71, 153, 48, 141, 170, 95, + 216, 190, 183, 64, 2, 131, 237, 74, 11, 95, 144, 118, 147, 238, 17, 217, + 241, 194, 111, 172, 22, 45, 129, 166, 154, 164, 17, 150, 151, 55, 106, 204, + 39, 245, 229, 99, 109, 121, 44, 140, 173, 248, 81, 237, 29, 181, 222, 41, + 31, 32, 253, 195, 104, 10, 212, 95, 134, 250, 8, 110, 69, 128, 230, 77, + 145, 62, 214, 147, 231, 47, 88, 103, 189, 63, 154, 220, 178, 128, 40, 115, + 175, 139, 226, 6, 233, 181, 69, 50, 228, 41, 159, 53, 74, 248, 116, 104, + 238, 28, 86, 224, 175, 129, 166, 140, 144, 15, 151, 70, 209, 59, 70, 90, + 229, 74, 48, 82, 99, 242, 202, 83, 185, 140, 102, 243, 133, 25, 227, 175, + 229, 142, 110, 142, 191, 153, 171, 148, 191, 25, 174, 136, 70, 123, 157, 216, + 175, 46, 84, 182, 169, 176, 43, 136, 16, 11, 55, 186, 100, 153, 57, 159, + 92, 244, 135, 4, 217, 65, 250, 241, 168, 123, 30, 141, 111, 67, 244, 89, + 177, 48, 43, 61, 166, 207, 85, 242, 93, 33, 111, 210, 127, 53, 219, 193, + 109, 56, 190, 29, 70, 64, 216, 53, 98, 174, 58, 65, 74, 180, 66, 116, + 6, 30, 93, 141, 97, 238, 117, 195, 68, 203, 139, 15, 105, 220, 146, 66, + 94, 70, 246, 98, 206, 192, 234, 167, 171, 204, 8, 168, 222, 31, 231, 91, + 200, 239, 46, 141, 79, 108, 242, 104, 166, 151, 157, 76, 145, 149, 65, 102, + 202, 45, 68, 63, 128, 153, 137, 150, 28, 40, 78, 172, 147, 14, 81, 70, + 75, 82, 149, 165, 193, 169, 33, 237, 233, 69, 112, 126, 66, 142, 44, 184, + 35, 151, 232, 89, 177, 209, 123, 167, 23, 215, 68, 255, 250, 49, 199, 231, + 184, 24, 191, 208, 250, 39, 175, 134, 158, 81, 80, 113, 77, 130, 227, 111, + 81, 242, 250, 235, 175, 176, 93, 160, 164, 66, 60, 248, 89, 193, 31, 108, + 97, 197, 77, 41, 232, 219, 227, 115, 230, 41, 133, 112, 215, 172, 3, 193, + 111, 16, 42, 116, 223, 121, 105, 58, 123, 194, 136, 149, 74, 70, 228, 9, + 179, 78, 38, 53, 26, 72, 4, 37, 196, 49, 105, 152, 123, 236, 56, 77, + 33, 62, 16, 119, 138, 95, 109, 212, 103, 190, 147, 243, 153, 196, 167, 208, + 62, 205, 17, 222, 146, 129, 68, 79, 51, 149, 192, 150, 222, 72, 147, 133, + 164, 237, 18, 7, 66, 218, 135, 164, 121, 8, 6, 165, 40, 156, 165, 26, + 191, 197, 241, 25, 80, 168, 60, 191, 103, 144, 182, 219, 159, 107, 51, 236, + 11, 58, 62, 251, 235, 0, 10, 239, 10, 241, 186, 66, 199, 228, 143, 84, + 83, 98, 185, 39, 144, 220, 121, 119, 22, 93, 96, 78, 227, 67, 149, 203, + 15, 125, 219, 252, 207, 48, 130, 77, 240, 234, 200, 252, 233, 102, 108, 155, + 255, 1, 116, 240, 200, 252, 107, 136, 154, 240, 63, 71, 225, 100, 114, 99, + 155, 165, 127, 231, 142, 122, 71, 213, 86, 254, 15, 75, 241, 46, 252, 238, + 47, 127, 249, 139, 249, 87, 220, 203, 209, 215, 12, 30, 128, 96, 130, 126, + 8, 209, 120, 123, 108, 126, 11, 219, 243, 122, 46, 20, 178, 78, 195, 238, + 0, 237, 19, 222, 1, 121, 134, 205, 142, 196, 255, 182, 121, 59, 25, 54, + 252, 182, 13, 68, 163, 177, 111, 155, 211, 105, 195, 245, 95, 29, 216, 110, + 171, 249, 10, 106, 116, 51, 70, 29, 97, 215, 47, 88, 130, 92, 183, 182, + 221, 82, 238, 182, 133, 37, 1, 105, 115, 107, 186, 209, 57, 108, 8, 165, + 36, 200, 76, 246, 147, 162, 44, 2, 118, 96, 139, 36, 48, 96, 147, 70, + 11, 146, 33, 118, 21, 67, 236, 230, 74, 243, 233, 171, 92, 68, 14, 98, + 146, 225, 12, 47, 12, 53, 178, 2, 123, 50, 147, 80, 161, 192, 154, 162, + 81, 0, 193, 188, 11, 77, 121, 96, 55, 62, 194, 185, 205, 58, 33, 163, + 129, 173, 49, 72, 70, 15, 82, 209, 189, 100, 116, 47, 21, 93, 223, 152, + 77, 102, 29, 133, 98, 187, 217, 97, 117, 249, 79, 210, 85, 149, 192, 204, + 80, 235, 90, 216, 113, 240, 111, 103, 197, 233, 59, 107, 241, 187, 81, 225, + 164, 102, 176, 68, 143, 204, 137, 147, 240, 242, 133, 39, 174, 143, 154, 14, + 154, 242, 197, 87, 72, 248, 93, 25, 166, 26, 108, 214, 195, 72, 174, 90, + 242, 149, 30, 148, 238, 150, 112, 56, 168, 192, 20, 195, 251, 37, 116, 114, + 88, 109, 148, 200, 92, 75, 48, 77, 80, 8, 114, 108, 102, 221, 17, 102, + 137, 64, 182, 240, 160, 105, 238, 105, 192, 17, 200, 98, 203, 218, 82, 237, + 6, 153, 218, 13, 30, 87, 59, 246, 220, 14, 213, 27, 236, 172, 30, 26, + 207, 74, 43, 181, 7, 212, 114, 45, 106, 185, 225, 90, 246, 50, 181, 236, + 61, 174, 150, 228, 78, 254, 1, 149, 212, 171, 249, 208, 186, 110, 228, 146, + 132, 233, 218, 185, 68, 196, 80, 216, 191, 147, 24, 27, 8, 66, 208, 159, + 118, 36, 44, 110, 161, 160, 73, 51, 108, 22, 20, 19, 51, 53, 41, 211, + 71, 93, 221, 101, 80, 51, 252, 216, 28, 92, 175, 72, 161, 120, 41, 110, + 140, 215, 52, 244, 150, 197, 226, 115, 225, 66, 213, 111, 22, 8, 151, 96, + 137, 223, 211, 158, 148, 100, 61, 198, 181, 192, 107, 188, 41, 28, 245, 41, + 33, 159, 54, 21, 250, 68, 140, 47, 47, 160, 164, 152, 165, 71, 30, 126, + 133, 76, 252, 10, 213, 112, 215, 248, 180, 198, 167, 141, 98, 242, 119, 165, + 120, 24, 187, 47, 11, 212, 185, 253, 57, 218, 39, 247, 30, 193, 238, 63, + 133, 161, 214, 135, 70, 84, 66, 196, 69, 95, 2, 118, 42, 66, 88, 224, + 249, 63, 19, 252, 84, 26, 67, 42, 250, 106, 32, 82, 15, 106, 251, 87, + 3, 147, 138, 190, 24, 154, 84, 244, 117, 224, 164, 162, 223, 138, 39, 245, + 152, 254, 189, 23, 87, 42, 218, 5, 44, 149, 215, 3, 249, 200, 82, 121, + 141, 74, 65, 75, 69, 57, 216, 82, 123, 58, 202, 146, 25, 67, 51, 213, + 118, 64, 51, 61, 8, 144, 138, 161, 158, 20, 254, 148, 176, 205, 115, 49, + 99, 96, 126, 52, 68, 41, 4, 157, 210, 224, 164, 244, 40, 132, 154, 210, + 163, 234, 136, 71, 5, 3, 81, 103, 200, 41, 29, 84, 21, 113, 170, 4, + 18, 149, 233, 176, 48, 154, 68, 44, 43, 243, 154, 205, 252, 60, 68, 199, + 178, 61, 129, 136, 213, 0, 158, 129, 60, 176, 122, 41, 91, 43, 187, 69, + 182, 145, 4, 131, 144, 27, 231, 26, 245, 135, 2, 93, 9, 106, 214, 207, + 234, 30, 201, 131, 161, 51, 153, 45, 6, 19, 186, 173, 112, 152, 181, 5, + 226, 226, 37, 72, 175, 154, 74, 149, 121, 53, 159, 120, 98, 1, 240, 183, + 227, 80, 255, 152, 98, 254, 105, 0, 15, 233, 80, 170, 67, 29, 222, 139, + 86, 24, 253, 70, 25, 167, 92, 214, 191, 81, 200, 217, 248, 13, 187, 8, + 110, 18, 208, 10, 217, 160, 7, 156, 136, 100, 165, 159, 118, 36, 138, 158, + 118, 16, 74, 20, 250, 180, 3, 209, 3, 142, 66, 199, 187, 143, 66, 199, + 187, 143, 66, 199, 197, 71, 161, 40, 247, 44, 196, 193, 250, 145, 40, 146, + 103, 162, 72, 30, 138, 34, 121, 42, 138, 228, 177, 40, 122, 234, 185, 40, + 122, 202, 193, 136, 105, 216, 140, 72, 19, 194, 245, 218, 46, 226, 239, 201, + 69, 163, 51, 241, 134, 170, 235, 125, 103, 162, 123, 235, 116, 223, 113, 104, + 110, 174, 169, 82, 10, 174, 3, 107, 118, 132, 183, 42, 104, 140, 237, 217, + 203, 237, 61, 117, 188, 255, 68, 116, 111, 29, 239, 57, 12, 205, 205, 77, + 92, 197, 68, 61, 247, 244, 122, 218, 248, 51, 40, 172, 174, 88, 149, 138, + 16, 17, 151, 46, 142, 37, 124, 36, 56, 193, 51, 80, 19, 69, 238, 200, + 249, 119, 144, 243, 71, 203, 239, 179, 104, 28, 145, 109, 117, 95, 168, 228, + 196, 2, 255, 119, 41, 215, 25, 255, 165, 50, 79, 83, 147, 119, 151, 230, + 21, 80, 234, 177, 58, 9, 133, 226, 34, 19, 154, 91, 198, 51, 17, 175, + 74, 148, 49, 66, 8, 221, 203, 70, 99, 243, 123, 29, 56, 9, 88, 251, + 136, 252, 97, 170, 207, 171, 26, 207, 11, 228, 100, 182, 140, 208, 249, 48, + 42, 198, 224, 121, 7, 101, 81, 233, 210, 38, 40, 93, 83, 181, 116, 226, + 66, 63, 188, 253, 11, 159, 130, 42, 41, 72, 228, 178, 234, 139, 178, 182, + 133, 189, 159, 16, 5, 11, 23, 68, 198, 116, 63, 207, 34, 195, 185, 137, + 142, 157, 63, 161, 180, 77, 116, 155, 16, 159, 78, 39, 176, 251, 92, 12, + 251, 123, 12, 106, 66, 29, 218, 51, 231, 147, 225, 77, 202, 230, 175, 232, + 8, 201, 77, 33, 15, 198, 170, 106, 120, 172, 228, 211, 100, 102, 176, 122, + 231, 65, 5, 40, 75, 255, 18, 120, 188, 94, 181, 232, 116, 25, 207, 138, + 122, 60, 67, 216, 58, 222, 72, 76, 25, 93, 33, 80, 87, 7, 68, 108, + 70, 9, 47, 86, 194, 211, 231, 182, 132, 188, 154, 172, 69, 96, 221, 149, + 116, 144, 41, 211, 242, 75, 91, 57, 251, 2, 221, 252, 2, 141, 40, 44, + 17, 33, 121, 21, 153, 11, 51, 179, 176, 235, 150, 196, 196, 75, 205, 55, + 242, 0, 146, 156, 52, 226, 40, 43, 122, 69, 142, 69, 159, 213, 34, 8, + 113, 202, 7, 190, 46, 34, 56, 11, 6, 135, 233, 119, 186, 147, 225, 100, + 54, 223, 50, 42, 19, 238, 224, 143, 47, 22, 117, 46, 194, 160, 105, 228, + 184, 66, 197, 125, 62, 97, 36, 111, 151, 188, 90, 133, 25, 73, 15, 249, + 197, 101, 21, 86, 46, 190, 175, 249, 125, 80, 69, 115, 223, 86, 137, 60, + 185, 27, 18, 56, 74, 16, 255, 0, 22, 108, 22, 66, 10, 50, 40, 179, + 57, 253, 79, 1, 131, 45, 85, 206, 172, 40, 60, 183, 231, 118, 179, 90, + 61, 250, 169, 204, 237, 122, 124, 247, 10, 119, 146, 105, 65, 130, 92, 61, + 57, 130, 3, 156, 150, 70, 126, 247, 167, 160, 191, 124, 29, 250, 75, 237, + 176, 58, 204, 37, 162, 90, 34, 35, 70, 88, 150, 222, 94, 30, 134, 37, + 28, 3, 8, 137, 137, 122, 225, 90, 71, 213, 122, 224, 72, 62, 190, 133, + 57, 183, 76, 9, 116, 146, 47, 215, 4, 152, 77, 49, 103, 62, 30, 23, + 115, 230, 79, 103, 199, 33, 87, 100, 87, 119, 176, 227, 95, 139, 7, 39, + 88, 246, 12, 19, 78, 60, 120, 27, 161, 212, 100, 68, 146, 9, 231, 139, + 162, 251, 121, 112, 186, 60, 138, 11, 166, 172, 176, 228, 213, 6, 10, 223, + 108, 54, 88, 254, 43, 246, 118, 1, 79, 47, 101, 77, 224, 193, 195, 223, + 3, 81, 163, 3, 81, 163, 87, 14, 62, 138, 8, 168, 146, 132, 128, 51, + 69, 51, 196, 47, 165, 221, 183, 9, 112, 94, 182, 79, 134, 112, 51, 248, + 26, 75, 59, 75, 80, 91, 141, 204, 5, 215, 94, 238, 153, 97, 60, 13, + 163, 113, 236, 86, 69, 61, 0, 195, 200, 200, 89, 12, 101, 22, 135, 235, + 24, 47, 168, 188, 164, 131, 188, 104, 239, 151, 33, 154, 113, 144, 172, 84, + 132, 68, 227, 238, 140, 110, 123, 158, 145, 150, 19, 122, 133, 87, 154, 124, + 168, 119, 207, 33, 74, 181, 134, 148, 239, 57, 172, 215, 239, 134, 172, 40, + 43, 190, 18, 88, 86, 46, 41, 251, 113, 216, 228, 102, 161, 217, 242, 167, + 143, 57, 239, 68, 51, 31, 225, 97, 3, 216, 141, 241, 68, 199, 65, 169, + 0, 27, 134, 186, 107, 115, 221, 85, 154, 232, 63, 218, 184, 5, 211, 33, + 145, 146, 201, 21, 156, 216, 16, 80, 179, 118, 212, 239, 33, 149, 200, 129, + 175, 249, 255, 98, 206, 35, 90, 240, 213, 92, 40, 224, 89, 46, 66, 124, + 155, 161, 64, 146, 117, 113, 145, 7, 224, 33, 177, 153, 123, 16, 170, 4, + 80, 206, 154, 105, 10, 38, 69, 253, 16, 237, 70, 176, 172, 141, 100, 66, + 241, 11, 200, 145, 3, 233, 199, 228, 215, 55, 90, 172, 85, 125, 81, 253, + 0, 29, 100, 21, 197, 122, 217, 79, 69, 251, 80, 69, 33, 251, 165, 136, + 220, 165, 82, 166, 97, 246, 144, 132, 91, 171, 51, 171, 149, 233, 32, 62, + 158, 167, 133, 240, 92, 35, 47, 204, 113, 160, 154, 110, 66, 155, 88, 205, + 55, 225, 60, 46, 57, 219, 244, 64, 154, 110, 1, 194, 233, 105, 31, 50, + 230, 149, 98, 146, 82, 243, 174, 8, 247, 32, 134, 171, 145, 42, 50, 82, + 1, 39, 86, 145, 65, 53, 41, 25, 235, 17, 103, 78, 177, 110, 28, 91, + 23, 179, 44, 118, 10, 34, 53, 103, 10, 220, 130, 196, 197, 10, 245, 90, + 159, 242, 228, 124, 49, 75, 155, 237, 20, 68, 236, 1, 107, 174, 67, 189, + 18, 177, 170, 88, 198, 4, 69, 63, 220, 194, 34, 194, 126, 133, 146, 48, + 174, 131, 82, 222, 17, 169, 59, 211, 158, 238, 167, 71, 193, 83, 73, 220, + 62, 101, 181, 17, 3, 236, 10, 163, 12, 114, 73, 227, 6, 189, 254, 48, + 188, 25, 135, 107, 71, 92, 145, 146, 79, 25, 52, 145, 81, 239, 126, 128, + 153, 203, 247, 173, 158, 167, 184, 160, 121, 252, 194, 87, 203, 86, 147, 33, + 8, 77, 183, 25, 238, 88, 210, 212, 36, 103, 249, 2, 165, 40, 107, 182, + 40, 216, 170, 0, 205, 110, 16, 57, 16, 81, 87, 196, 20, 151, 215, 37, + 84, 90, 165, 223, 184, 106, 64, 105, 202, 162, 224, 242, 102, 76, 139, 187, + 74, 92, 63, 210, 0, 149, 255, 98, 34, 238, 223, 147, 86, 69, 153, 107, + 250, 60, 118, 95, 204, 219, 131, 246, 11, 186, 52, 74, 246, 189, 84, 79, + 78, 118, 31, 162, 177, 63, 112, 54, 211, 92, 148, 115, 171, 149, 152, 209, + 117, 109, 58, 72, 199, 46, 201, 25, 114, 63, 114, 44, 212, 58, 235, 176, + 92, 83, 238, 228, 163, 131, 127, 28, 248, 74, 203, 147, 49, 138, 141, 121, + 51, 40, 169, 89, 5, 103, 10, 55, 40, 165, 166, 21, 4, 122, 65, 73, + 155, 87, 16, 224, 7, 37, 109, 98, 197, 98, 31, 57, 137, 52, 45, 106, + 229, 161, 43, 103, 218, 228, 76, 22, 33, 15, 242, 132, 60, 200, 32, 195, + 182, 86, 138, 65, 132, 67, 15, 176, 176, 208, 124, 149, 65, 130, 13, 98, + 40, 45, 137, 113, 27, 251, 169, 145, 131, 124, 26, 220, 117, 251, 209, 80, + 32, 240, 1, 87, 184, 180, 7, 118, 143, 240, 230, 52, 208, 62, 113, 78, + 162, 179, 212, 180, 63, 67, 125, 51, 52, 152, 219, 190, 142, 129, 228, 78, + 107, 150, 119, 72, 70, 77, 58, 216, 31, 100, 232, 218, 164, 87, 169, 66, + 109, 237, 27, 81, 12, 31, 198, 48, 113, 219, 182, 90, 8, 168, 43, 234, + 31, 195, 212, 221, 53, 237, 210, 79, 102, 96, 122, 31, 75, 214, 113, 233, + 136, 21, 77, 43, 103, 38, 151, 176, 220, 251, 169, 106, 139, 231, 129, 246, + 220, 163, 231, 185, 121, 94, 45, 37, 16, 194, 224, 31, 163, 15, 51, 30, + 5, 214, 37, 218, 37, 205, 229, 16, 209, 187, 150, 207, 29, 134, 234, 50, + 225, 127, 28, 49, 160, 136, 65, 54, 162, 71, 17, 61, 25, 97, 136, 124, + 48, 80, 212, 10, 195, 171, 71, 50, 159, 56, 98, 144, 136, 232, 197, 17, + 61, 142, 48, 158, 69, 175, 43, 198, 207, 16, 204, 205, 92, 213, 160, 118, + 123, 75, 252, 228, 23, 21, 184, 174, 65, 205, 246, 6, 24, 248, 119, 21, + 184, 169, 65, 173, 246, 122, 152, 199, 187, 202, 115, 224, 73, 73, 187, 187, + 138, 136, 87, 240, 142, 158, 161, 215, 246, 6, 34, 235, 245, 8, 162, 93, + 17, 109, 84, 143, 222, 149, 140, 58, 131, 92, 11, 136, 96, 232, 153, 103, + 129, 48, 48, 123, 102, 157, 24, 17, 76, 36, 200, 47, 26, 193, 49, 193, + 105, 224, 41, 34, 26, 57, 238, 22, 15, 20, 136, 69, 172, 96, 16, 212, + 117, 133, 185, 132, 3, 215, 108, 62, 232, 247, 148, 196, 176, 30, 127, 134, + 122, 240, 142, 111, 8, 229, 249, 19, 60, 195, 255, 250, 43, 76, 102, 13, + 243, 211, 53, 102, 44, 253, 182, 125, 74, 228, 7, 65, 83, 159, 25, 56, + 107, 80, 28, 201, 56, 182, 226, 63, 215, 70, 80, 238, 6, 131, 48, 104, + 23, 94, 62, 157, 2, 116, 176, 134, 212, 229, 195, 29, 158, 19, 94, 123, + 135, 254, 150, 102, 6, 228, 80, 170, 137, 33, 85, 138, 216, 1, 161, 188, + 133, 43, 60, 49, 133, 246, 5, 98, 178, 209, 41, 42, 172, 158, 224, 207, + 69, 245, 117, 120, 120, 129, 232, 103, 43, 30, 81, 12, 252, 84, 113, 241, + 24, 29, 217, 17, 252, 251, 169, 226, 16, 104, 91, 180, 214, 19, 52, 237, + 68, 18, 84, 61, 192, 68, 189, 19, 23, 102, 65, 180, 73, 38, 205, 36, + 150, 201, 9, 181, 11, 7, 221, 173, 218, 103, 102, 180, 178, 163, 181, 13, + 31, 159, 219, 190, 189, 28, 244, 16, 38, 235, 48, 39, 9, 196, 123, 20, + 95, 34, 175, 11, 186, 210, 93, 35, 221, 217, 198, 39, 137, 61, 173, 119, + 55, 12, 43, 226, 7, 115, 20, 210, 113, 219, 37, 119, 87, 52, 3, 48, + 156, 142, 31, 34, 130, 15, 26, 168, 57, 33, 78, 89, 210, 223, 67, 60, + 76, 94, 166, 216, 122, 218, 64, 148, 198, 23, 69, 24, 2, 131, 163, 160, + 94, 172, 156, 166, 42, 230, 202, 155, 184, 248, 88, 94, 167, 43, 171, 134, + 237, 161, 77, 119, 120, 230, 196, 147, 192, 97, 165, 232, 63, 162, 59, 168, + 142, 176, 48, 114, 166, 54, 201, 117, 70, 9, 68, 78, 68, 52, 68, 212, + 205, 217, 109, 140, 75, 207, 7, 54, 68, 113, 206, 30, 218, 164, 250, 134, + 198, 106, 93, 13, 39, 23, 225, 48, 86, 83, 129, 32, 194, 46, 78, 56, + 135, 105, 10, 163, 102, 97, 122, 200, 62, 16, 138, 180, 86, 36, 215, 162, + 29, 116, 158, 164, 186, 162, 213, 76, 104, 176, 36, 234, 6, 97, 82, 173, + 165, 29, 91, 44, 187, 186, 149, 122, 161, 58, 235, 99, 216, 18, 189, 235, + 210, 108, 137, 232, 206, 251, 249, 146, 164, 23, 25, 40, 89, 119, 35, 211, + 222, 158, 136, 231, 54, 187, 223, 224, 151, 253, 192, 79, 154, 200, 11, 133, + 26, 52, 40, 201, 209, 169, 201, 233, 238, 164, 102, 141, 98, 64, 52, 57, + 82, 75, 153, 52, 183, 117, 147, 230, 253, 123, 48, 242, 103, 141, 52, 226, + 189, 44, 190, 65, 118, 79, 154, 111, 25, 224, 57, 175, 102, 104, 77, 125, + 7, 173, 174, 89, 39, 123, 21, 203, 227, 91, 166, 236, 194, 166, 117, 109, + 1, 27, 176, 207, 247, 233, 16, 194, 203, 152, 241, 201, 45, 31, 24, 4, + 125, 25, 171, 188, 33, 235, 157, 211, 30, 206, 107, 100, 245, 11, 164, 20, + 113, 162, 97, 124, 250, 161, 60, 93, 44, 38, 232, 137, 4, 246, 5, 122, + 131, 33, 196, 163, 104, 71, 63, 138, 230, 40, 106, 73, 254, 14, 213, 118, + 68, 82, 58, 116, 95, 209, 136, 12, 66, 178, 202, 199, 163, 59, 20, 100, + 14, 177, 138, 112, 242, 214, 60, 166, 243, 68, 223, 49, 255, 245, 154, 6, + 132, 79, 173, 234, 25, 104, 39, 202, 108, 93, 119, 163, 84, 183, 209, 130, + 187, 158, 236, 150, 151, 48, 225, 141, 116, 79, 105, 34, 247, 86, 194, 2, + 63, 229, 209, 67, 211, 247, 146, 125, 194, 89, 176, 191, 163, 100, 243, 97, + 18, 77, 163, 21, 122, 1, 141, 50, 106, 95, 178, 117, 210, 160, 48, 233, + 206, 3, 219, 105, 195, 172, 134, 21, 165, 183, 54, 71, 232, 151, 98, 244, + 168, 255, 200, 52, 255, 46, 102, 95, 105, 109, 218, 150, 91, 35, 67, 37, + 155, 174, 0, 68, 62, 243, 231, 104, 127, 66, 232, 16, 39, 102, 29, 191, + 110, 152, 108, 196, 119, 28, 176, 143, 163, 95, 207, 92, 73, 106, 121, 170, + 69, 40, 131, 100, 165, 9, 216, 75, 37, 88, 191, 141, 160, 213, 51, 137, + 35, 197, 166, 243, 132, 162, 223, 19, 28, 40, 33, 36, 37, 143, 203, 77, + 251, 206, 171, 61, 179, 188, 250, 179, 103, 8, 118, 75, 89, 22, 75, 224, + 58, 163, 201, 108, 58, 152, 152, 25, 103, 156, 143, 61, 193, 114, 62, 112, + 8, 64, 108, 117, 115, 50, 69, 202, 130, 235, 241, 203, 157, 232, 184, 132, + 52, 245, 84, 245, 191, 223, 85, 231, 253, 231, 169, 162, 70, 220, 227, 178, + 83, 128, 148, 155, 17, 61, 32, 131, 27, 157, 210, 211, 41, 134, 185, 129, + 100, 89, 163, 83, 122, 62, 173, 67, 165, 36, 76, 11, 208, 43, 51, 32, + 54, 185, 78, 112, 194, 144, 212, 5, 158, 148, 72, 99, 130, 41, 232, 77, + 140, 186, 4, 41, 243, 13, 97, 180, 134, 46, 179, 224, 3, 27, 50, 117, + 217, 166, 177, 145, 142, 61, 197, 216, 145, 27, 11, 152, 247, 26, 192, 38, + 124, 106, 100, 217, 142, 229, 32, 194, 59, 202, 81, 16, 208, 7, 215, 141, + 34, 120, 83, 213, 247, 132, 44, 77, 162, 202, 28, 201, 11, 201, 88, 16, + 250, 29, 200, 222, 9, 93, 206, 38, 97, 186, 19, 183, 130, 184, 170, 58, + 66, 225, 34, 45, 165, 5, 182, 1, 86, 45, 139, 188, 56, 10, 97, 178, + 53, 55, 203, 168, 145, 55, 132, 85, 214, 91, 119, 196, 125, 77, 129, 13, + 246, 131, 38, 53, 195, 27, 8, 199, 221, 137, 115, 182, 195, 7, 109, 173, + 217, 15, 116, 163, 36, 58, 36, 237, 142, 225, 149, 224, 71, 242, 186, 65, + 112, 43, 154, 252, 16, 24, 148, 114, 110, 79, 104, 230, 222, 121, 221, 240, + 69, 197, 42, 113, 219, 51, 11, 81, 159, 12, 197, 204, 140, 190, 5, 36, + 37, 44, 175, 138, 192, 197, 149, 167, 130, 214, 73, 202, 144, 182, 173, 27, + 210, 202, 253, 100, 159, 109, 212, 15, 242, 182, 149, 60, 235, 218, 92, 97, + 10, 139, 193, 169, 77, 73, 203, 16, 233, 147, 165, 132, 135, 13, 207, 188, + 49, 255, 81, 130, 159, 127, 148, 216, 14, 253, 134, 60, 76, 56, 64, 112, + 75, 219, 146, 144, 86, 64, 139, 144, 217, 162, 28, 233, 53, 33, 128, 153, + 226, 197, 43, 21, 73, 88, 186, 98, 76, 133, 185, 124, 123, 55, 229, 209, + 220, 35, 72, 18, 4, 43, 54, 26, 93, 17, 252, 113, 86, 140, 194, 39, + 124, 229, 59, 33, 225, 51, 97, 207, 221, 175, 86, 201, 26, 30, 246, 177, + 219, 104, 126, 195, 147, 206, 186, 187, 140, 22, 168, 110, 217, 31, 159, 157, + 151, 204, 18, 148, 114, 134, 2, 30, 247, 124, 11, 19, 131, 100, 202, 91, + 99, 62, 140, 186, 253, 249, 25, 20, 124, 14, 181, 155, 137, 43, 29, 122, + 183, 249, 95, 194, 60, 52, 159, 5, 34, 74, 200, 4, 14, 116, 225, 45, + 127, 46, 168, 200, 65, 251, 5, 233, 162, 140, 80, 21, 247, 138, 72, 170, + 195, 9, 128, 52, 25, 100, 22, 41, 248, 119, 234, 203, 228, 177, 94, 250, + 37, 160, 101, 68, 28, 99, 5, 206, 120, 31, 173, 227, 42, 78, 8, 152, + 13, 39, 230, 7, 22, 98, 138, 158, 47, 221, 161, 13, 199, 182, 180, 167, + 73, 15, 74, 166, 115, 2, 227, 76, 47, 47, 178, 12, 40, 119, 104, 156, + 156, 185, 209, 217, 153, 236, 124, 168, 40, 127, 106, 203, 95, 181, 129, 143, + 229, 241, 139, 75, 239, 117, 240, 27, 241, 72, 227, 118, 18, 156, 105, 175, + 136, 66, 253, 138, 60, 240, 220, 105, 161, 246, 51, 220, 92, 224, 36, 151, + 159, 199, 57, 193, 206, 68, 227, 27, 130, 12, 128, 157, 37, 78, 118, 110, + 58, 173, 230, 171, 125, 179, 254, 41, 17, 168, 239, 5, 201, 226, 233, 84, + 143, 135, 68, 17, 58, 235, 11, 108, 45, 163, 59, 233, 95, 18, 220, 164, + 238, 241, 194, 177, 112, 68, 16, 175, 40, 38, 116, 119, 183, 1, 207, 61, + 236, 54, 18, 230, 249, 118, 187, 106, 35, 30, 63, 230, 81, 173, 30, 221, + 214, 43, 174, 83, 185, 125, 225, 85, 83, 95, 138, 249, 105, 91, 113, 32, + 194, 30, 197, 100, 17, 242, 102, 208, 164, 184, 4, 96, 241, 219, 50, 231, + 84, 214, 88, 183, 122, 224, 26, 65, 186, 143, 73, 64, 20, 79, 172, 164, + 55, 0, 68, 18, 191, 108, 152, 107, 116, 229, 154, 248, 12, 157, 186, 202, + 11, 207, 174, 161, 17, 71, 189, 107, 207, 210, 29, 119, 174, 183, 38, 241, + 236, 218, 45, 86, 133, 133, 147, 122, 60, 184, 234, 67, 193, 110, 52, 216, + 97, 251, 124, 58, 25, 247, 104, 32, 180, 5, 209, 100, 185, 68, 237, 44, + 153, 4, 111, 131, 103, 217, 48, 205, 211, 83, 94, 188, 222, 12, 59, 241, + 130, 210, 7, 212, 202, 205, 239, 166, 80, 25, 133, 27, 151, 201, 14, 43, + 213, 96, 176, 34, 72, 106, 220, 76, 187, 232, 236, 0, 81, 219, 147, 197, + 150, 236, 149, 227, 218, 107, 236, 133, 234, 145, 121, 123, 127, 50, 148, 85, + 222, 116, 167, 133, 201, 236, 181, 227, 202, 220, 238, 79, 198, 185, 21, 23, + 26, 215, 236, 190, 68, 152, 19, 11, 73, 229, 71, 40, 238, 131, 188, 131, + 0, 27, 15, 27, 215, 45, 62, 67, 11, 171, 175, 49, 160, 110, 186, 135, + 16, 155, 252, 200, 213, 62, 130, 202, 171, 143, 186, 211, 234, 107, 108, 13, + 126, 116, 139, 31, 53, 73, 0, 151, 25, 194, 156, 217, 18, 22, 142, 51, + 19, 223, 46, 236, 28, 115, 87, 110, 26, 41, 26, 151, 210, 124, 18, 105, + 90, 181, 74, 197, 58, 70, 204, 87, 11, 191, 69, 84, 217, 164, 16, 158, + 214, 84, 39, 135, 139, 72, 44, 148, 84, 189, 146, 132, 200, 182, 226, 85, + 15, 167, 123, 148, 54, 127, 185, 229, 150, 46, 218, 248, 148, 233, 164, 134, + 84, 194, 191, 171, 1, 47, 191, 116, 19, 133, 90, 106, 203, 100, 37, 116, + 74, 230, 65, 50, 47, 147, 143, 150, 148, 220, 71, 75, 183, 56, 249, 148, + 220, 206, 180, 70, 33, 60, 102, 114, 198, 5, 41, 51, 76, 136, 53, 144, + 182, 165, 38, 65, 16, 239, 197, 121, 195, 82, 48, 30, 98, 32, 80, 186, + 146, 51, 217, 176, 240, 122, 188, 77, 143, 201, 213, 143, 58, 64, 64, 122, + 46, 81, 104, 249, 230, 240, 141, 134, 96, 113, 92, 230, 117, 60, 243, 14, + 206, 176, 44, 215, 127, 102, 181, 132, 138, 157, 111, 144, 24, 84, 29, 119, + 177, 213, 74, 41, 172, 37, 129, 115, 128, 227, 66, 165, 35, 246, 208, 34, + 28, 180, 36, 197, 240, 44, 154, 143, 103, 3, 185, 90, 81, 193, 158, 240, + 196, 18, 199, 163, 71, 22, 25, 139, 23, 46, 218, 151, 14, 166, 167, 43, + 156, 240, 22, 157, 126, 72, 205, 53, 244, 123, 241, 28, 104, 133, 177, 156, + 126, 78, 6, 199, 31, 127, 196, 108, 175, 200, 149, 138, 230, 141, 99, 202, + 222, 56, 166, 89, 111, 28, 83, 246, 198, 49, 149, 222, 56, 32, 235, 179, + 43, 118, 167, 66, 238, 93, 42, 211, 143, 30, 58, 187, 248, 136, 144, 69, + 30, 178, 62, 126, 77, 219, 59, 113, 101, 30, 25, 234, 255, 232, 102, 37, + 122, 238, 217, 239, 108, 89, 7, 110, 1, 60, 16, 36, 193, 147, 171, 245, + 63, 38, 93, 24, 185, 182, 238, 30, 4, 58, 2, 175, 200, 68, 141, 185, + 136, 122, 176, 164, 66, 225, 183, 70, 55, 76, 255, 195, 86, 37, 142, 121, + 54, 181, 63, 159, 171, 154, 66, 146, 61, 76, 95, 37, 88, 83, 20, 107, + 196, 115, 8, 39, 4, 112, 205, 94, 15, 166, 208, 110, 89, 14, 108, 91, + 192, 254, 241, 124, 224, 177, 196, 59, 65, 24, 164, 35, 19, 239, 204, 225, + 44, 46, 144, 96, 127, 170, 84, 57, 8, 135, 26, 106, 212, 60, 63, 50, + 223, 99, 119, 64, 48, 95, 128, 4, 1, 125, 241, 154, 18, 29, 158, 213, + 235, 239, 129, 43, 46, 25, 243, 6, 225, 208, 198, 215, 68, 108, 122, 147, + 189, 203, 18, 21, 245, 140, 75, 188, 42, 58, 137, 94, 191, 59, 172, 24, + 227, 15, 170, 6, 243, 138, 154, 111, 115, 12, 165, 185, 51, 254, 128, 14, + 111, 120, 223, 33, 215, 37, 21, 140, 250, 15, 212, 73, 199, 75, 28, 156, + 238, 176, 69, 124, 162, 13, 132, 195, 130, 96, 246, 26, 62, 195, 152, 0, + 134, 6, 31, 142, 76, 120, 119, 229, 187, 11, 239, 243, 15, 39, 222, 107, + 186, 220, 129, 24, 239, 220, 166, 127, 230, 31, 28, 152, 44, 135, 178, 136, + 102, 182, 132, 166, 40, 192, 52, 227, 34, 184, 0, 243, 73, 69, 228, 52, + 194, 205, 41, 194, 113, 158, 222, 10, 172, 117, 182, 159, 154, 233, 34, 210, + 29, 117, 111, 1, 48, 153, 63, 224, 212, 196, 177, 60, 254, 109, 99, 73, + 135, 176, 84, 39, 220, 219, 7, 248, 254, 240, 145, 204, 14, 228, 189, 227, + 248, 152, 2, 156, 108, 19, 28, 209, 134, 226, 46, 126, 76, 1, 217, 65, + 204, 25, 195, 116, 23, 61, 116, 12, 227, 27, 197, 148, 220, 235, 250, 102, + 25, 14, 194, 89, 40, 160, 213, 78, 210, 183, 87, 255, 41, 227, 165, 239, + 157, 203, 20, 142, 223, 206, 235, 171, 132, 90, 187, 42, 170, 109, 104, 165, + 42, 68, 190, 102, 234, 62, 39, 175, 100, 6, 220, 211, 174, 112, 114, 4, + 221, 243, 224, 110, 190, 149, 114, 69, 76, 77, 38, 195, 243, 126, 39, 22, + 79, 194, 1, 204, 96, 136, 64, 134, 59, 206, 75, 18, 174, 98, 7, 194, + 150, 244, 122, 112, 231, 238, 33, 62, 159, 244, 185, 140, 95, 55, 52, 20, + 175, 84, 4, 246, 247, 84, 199, 36, 51, 244, 67, 132, 89, 186, 117, 131, + 168, 178, 114, 74, 214, 180, 4, 140, 58, 253, 160, 243, 172, 121, 137, 25, + 109, 243, 214, 195, 248, 122, 113, 188, 175, 125, 95, 207, 137, 111, 105, 223, + 231, 197, 143, 2, 60, 138, 222, 186, 246, 173, 103, 223, 250, 246, 109, 11, + 2, 225, 44, 211, 61, 9, 40, 85, 100, 227, 27, 164, 10, 32, 73, 182, + 166, 93, 202, 198, 54, 100, 26, 207, 206, 214, 54, 157, 198, 183, 179, 53, + 86, 105, 50, 117, 229, 24, 252, 95, 73, 9, 151, 209, 115, 194, 220, 241, + 182, 153, 153, 172, 212, 186, 51, 154, 216, 177, 94, 249, 67, 81, 144, 226, + 188, 52, 115, 139, 140, 22, 118, 34, 223, 226, 9, 41, 237, 226, 99, 23, + 162, 120, 161, 94, 181, 81, 213, 122, 179, 161, 159, 45, 226, 166, 167, 219, + 19, 17, 194, 42, 249, 4, 92, 220, 244, 72, 136, 44, 59, 65, 91, 166, + 63, 194, 119, 176, 58, 254, 235, 221, 27, 52, 90, 70, 232, 235, 60, 164, + 163, 2, 44, 250, 140, 96, 87, 149, 22, 67, 34, 200, 50, 83, 154, 153, + 173, 102, 19, 1, 87, 232, 212, 92, 198, 73, 19, 4, 77, 56, 190, 46, + 247, 60, 24, 125, 196, 56, 43, 155, 117, 108, 2, 28, 197, 109, 223, 252, + 124, 131, 80, 239, 66, 235, 18, 136, 147, 219, 20, 43, 202, 107, 183, 13, + 110, 169, 178, 94, 247, 5, 116, 130, 118, 205, 177, 179, 145, 222, 219, 20, + 210, 189, 184, 58, 83, 109, 137, 241, 207, 229, 57, 163, 66, 80, 242, 133, + 158, 89, 181, 185, 230, 162, 217, 86, 190, 97, 0, 23, 42, 145, 157, 83, + 60, 25, 148, 5, 100, 1, 221, 142, 48, 140, 53, 95, 215, 162, 230, 130, + 69, 174, 164, 129, 18, 75, 108, 173, 2, 15, 161, 163, 112, 218, 89, 192, + 107, 18, 30, 154, 46, 15, 174, 194, 209, 72, 232, 28, 40, 39, 199, 248, + 26, 195, 106, 164, 168, 56, 230, 131, 25, 34, 71, 169, 238, 128, 114, 253, + 168, 177, 150, 52, 218, 96, 77, 162, 249, 28, 126, 177, 154, 172, 233, 81, + 56, 105, 52, 213, 223, 6, 105, 8, 83, 253, 224, 229, 37, 193, 89, 198, + 126, 152, 81, 173, 152, 39, 149, 60, 114, 251, 133, 16, 27, 113, 243, 109, + 67, 239, 138, 24, 228, 128, 241, 204, 17, 252, 252, 165, 192, 216, 104, 180, + 25, 234, 220, 207, 160, 109, 20, 118, 64, 49, 124, 181, 109, 82, 51, 8, + 222, 60, 110, 131, 196, 56, 79, 72, 188, 115, 22, 125, 125, 72, 184, 102, + 233, 96, 178, 184, 112, 9, 21, 178, 206, 248, 104, 154, 46, 77, 195, 32, + 217, 240, 214, 60, 133, 159, 211, 173, 121, 65, 71, 190, 49, 252, 59, 178, + 173, 83, 3, 152, 110, 161, 204, 97, 185, 181, 232, 244, 168, 66, 47, 132, + 157, 238, 54, 235, 81, 181, 90, 171, 68, 242, 141, 162, 170, 213, 143, 150, + 87, 54, 106, 154, 63, 7, 199, 101, 135, 14, 240, 171, 81, 28, 170, 79, + 13, 17, 232, 219, 52, 13, 85, 107, 90, 186, 181, 12, 217, 201, 80, 154, + 58, 155, 205, 56, 108, 167, 221, 48, 95, 54, 155, 2, 100, 157, 238, 226, + 48, 0, 246, 212, 134, 156, 252, 74, 127, 167, 112, 138, 147, 125, 4, 206, + 243, 4, 176, 87, 103, 58, 89, 230, 205, 102, 74, 252, 208, 41, 189, 99, + 222, 114, 97, 232, 177, 129, 39, 37, 21, 71, 64, 255, 247, 205, 73, 174, + 175, 54, 49, 101, 3, 116, 128, 183, 23, 57, 8, 253, 105, 165, 149, 221, + 77, 73, 78, 78, 174, 174, 36, 102, 84, 217, 124, 151, 14, 245, 24, 212, + 242, 130, 238, 230, 25, 71, 189, 94, 67, 148, 93, 7, 207, 111, 4, 7, + 199, 86, 79, 181, 225, 228, 170, 226, 54, 129, 158, 193, 81, 187, 97, 28, + 7, 66, 77, 112, 70, 99, 140, 31, 177, 158, 22, 218, 190, 152, 31, 229, + 136, 203, 128, 26, 167, 250, 72, 38, 63, 64, 220, 3, 250, 28, 77, 104, + 4, 226, 190, 54, 201, 4, 164, 191, 28, 251, 62, 84, 240, 102, 118, 27, + 34, 184, 255, 23, 7, 6, 194, 220, 77, 149, 253, 31, 1, 17, 148, 211, + 62, 175, 105, 228, 182, 250, 55, 130, 6, 21, 180, 245, 49, 240, 65, 81, + 191, 31, 3, 7, 9, 3, 19, 5, 181, 175, 163, 42, 167, 129, 245, 184, + 90, 149, 201, 116, 209, 136, 137, 103, 191, 87, 149, 153, 20, 122, 236, 84, + 142, 146, 211, 160, 248, 204, 228, 175, 82, 24, 225, 169, 174, 165, 188, 229, + 76, 26, 15, 177, 7, 230, 26, 132, 160, 184, 149, 231, 5, 163, 251, 203, + 190, 128, 17, 36, 187, 248, 19, 82, 112, 26, 167, 131, 248, 59, 200, 110, + 142, 195, 35, 193, 245, 96, 94, 126, 209, 12, 83, 189, 55, 134, 222, 33, + 245, 61, 147, 219, 193, 78, 174, 137, 22, 92, 154, 223, 221, 132, 61, 232, + 173, 62, 170, 84, 217, 200, 76, 181, 27, 59, 39, 242, 95, 165, 131, 111, + 52, 162, 10, 99, 63, 49, 210, 40, 2, 243, 44, 207, 23, 189, 100, 147, + 202, 201, 12, 164, 67, 106, 246, 159, 192, 57, 9, 231, 6, 67, 178, 45, + 20, 164, 168, 156, 233, 134, 84, 70, 212, 35, 90, 54, 64, 98, 8, 188, + 9, 51, 175, 144, 104, 175, 247, 209, 219, 75, 119, 28, 202, 243, 84, 54, + 52, 79, 122, 52, 209, 251, 55, 16, 212, 139, 112, 186, 43, 99, 143, 139, + 254, 98, 217, 239, 139, 217, 46, 47, 164, 239, 53, 141, 18, 148, 159, 244, + 199, 50, 109, 144, 106, 101, 137, 58, 197, 246, 74, 185, 67, 26, 56, 184, + 155, 239, 246, 114, 238, 54, 229, 84, 37, 173, 4, 20, 211, 223, 53, 27, + 251, 181, 132, 203, 238, 173, 33, 210, 176, 19, 190, 180, 161, 182, 91, 66, + 238, 84, 236, 49, 30, 170, 160, 41, 229, 201, 248, 185, 149, 54, 0, 111, + 115, 245, 182, 233, 221, 7, 205, 106, 10, 102, 94, 154, 126, 176, 217, 76, + 142, 63, 115, 57, 87, 84, 79, 1, 207, 98, 27, 60, 240, 90, 24, 131, + 123, 243, 183, 162, 239, 20, 120, 101, 217, 106, 151, 165, 1, 56, 233, 2, + 52, 80, 237, 146, 180, 188, 18, 220, 136, 4, 99, 162, 51, 121, 138, 223, + 102, 117, 117, 199, 109, 52, 247, 42, 86, 171, 70, 6, 19, 162, 39, 97, + 140, 102, 210, 112, 198, 70, 201, 72, 236, 17, 33, 102, 72, 148, 121, 121, + 82, 193, 79, 237, 223, 122, 79, 167, 122, 183, 245, 219, 123, 87, 239, 83, + 55, 183, 79, 189, 156, 62, 245, 119, 246, 105, 171, 156, 207, 150, 194, 80, + 196, 93, 187, 171, 23, 209, 179, 252, 174, 94, 196, 157, 131, 178, 74, 26, + 69, 39, 136, 50, 125, 133, 124, 157, 188, 234, 225, 201, 108, 211, 245, 27, + 116, 69, 7, 216, 158, 7, 145, 235, 7, 211, 76, 169, 248, 34, 48, 93, + 129, 145, 98, 31, 215, 212, 87, 33, 178, 89, 20, 40, 202, 79, 180, 238, + 94, 141, 229, 82, 38, 194, 19, 170, 204, 66, 193, 7, 213, 121, 30, 62, + 13, 184, 170, 162, 122, 98, 91, 164, 225, 231, 186, 81, 93, 113, 137, 233, + 179, 131, 198, 220, 200, 153, 32, 45, 125, 5, 137, 171, 166, 166, 182, 116, + 60, 185, 116, 144, 47, 75, 143, 59, 28, 123, 231, 91, 187, 153, 49, 255, + 112, 119, 4, 195, 65, 99, 159, 76, 201, 159, 55, 201, 44, 69, 136, 254, + 97, 233, 213, 93, 243, 83, 112, 103, 157, 56, 86, 107, 107, 38, 195, 35, + 25, 206, 112, 7, 207, 130, 230, 175, 191, 90, 159, 224, 71, 128, 76, 50, + 130, 164, 21, 217, 214, 39, 1, 111, 238, 156, 29, 176, 82, 22, 90, 104, + 195, 227, 5, 254, 3, 221, 80, 163, 112, 96, 49, 97, 27, 129, 71, 163, + 118, 182, 15, 239, 16, 134, 222, 206, 219, 252, 88, 63, 107, 217, 244, 227, + 219, 251, 231, 242, 26, 81, 3, 32, 72, 214, 237, 186, 160, 206, 143, 110, + 11, 252, 92, 255, 254, 77, 82, 11, 112, 54, 34, 240, 50, 132, 50, 131, + 111, 16, 228, 12, 222, 155, 252, 3, 193, 123, 153, 99, 152, 114, 80, 194, + 86, 4, 73, 169, 19, 242, 127, 241, 202, 28, 11, 137, 131, 244, 178, 23, + 166, 222, 97, 121, 116, 111, 22, 186, 34, 35, 156, 68, 48, 11, 104, 66, + 16, 51, 255, 136, 217, 34, 202, 204, 48, 134, 84, 135, 93, 120, 136, 186, + 144, 10, 119, 106, 177, 153, 187, 228, 146, 77, 86, 48, 104, 145, 153, 166, + 172, 31, 186, 233, 179, 73, 157, 16, 171, 71, 66, 10, 170, 152, 216, 211, + 69, 237, 10, 85, 196, 147, 253, 243, 18, 150, 129, 145, 233, 52, 35, 1, + 238, 173, 163, 177, 236, 111, 165, 250, 223, 197, 100, 50, 148, 238, 50, 52, + 101, 241, 214, 11, 150, 91, 120, 244, 187, 31, 52, 89, 217, 15, 29, 109, + 40, 98, 18, 119, 152, 84, 248, 19, 29, 149, 35, 237, 178, 213, 89, 17, + 168, 199, 24, 233, 203, 197, 100, 54, 152, 76, 122, 89, 65, 134, 33, 13, + 209, 245, 152, 86, 254, 206, 193, 158, 160, 238, 96, 250, 123, 232, 150, 6, + 165, 10, 208, 137, 188, 145, 212, 209, 56, 76, 200, 220, 147, 41, 194, 149, + 72, 65, 22, 104, 176, 251, 92, 200, 195, 33, 156, 56, 200, 106, 14, 195, + 235, 228, 160, 215, 133, 181, 129, 182, 64, 100, 248, 179, 39, 236, 128, 12, + 117, 154, 20, 254, 112, 240, 252, 137, 64, 30, 10, 110, 130, 165, 244, 184, + 10, 219, 194, 5, 156, 181, 143, 85, 131, 223, 3, 188, 50, 119, 36, 160, + 28, 75, 40, 234, 34, 105, 23, 146, 217, 156, 162, 112, 73, 244, 58, 221, + 217, 100, 78, 251, 195, 172, 63, 148, 56, 238, 41, 197, 114, 41, 16, 214, + 60, 253, 208, 87, 142, 254, 85, 142, 83, 164, 20, 186, 81, 18, 53, 33, + 193, 65, 10, 20, 99, 191, 9, 253, 208, 100, 209, 81, 81, 245, 164, 18, + 235, 61, 77, 184, 95, 183, 252, 161, 173, 202, 83, 64, 213, 55, 35, 146, + 115, 233, 60, 92, 35, 230, 226, 46, 47, 209, 50, 6, 255, 53, 53, 20, + 17, 147, 38, 65, 13, 127, 129, 200, 57, 26, 200, 95, 155, 1, 0, 149, + 120, 65, 62, 200, 36, 97, 210, 117, 71, 195, 72, 129, 215, 231, 193, 243, + 196, 174, 177, 132, 25, 4, 170, 140, 199, 224, 29, 199, 1, 210, 176, 78, + 28, 7, 132, 238, 24, 77, 149, 56, 42, 92, 229, 68, 53, 82, 236, 138, + 150, 49, 175, 55, 178, 70, 226, 179, 241, 98, 242, 8, 177, 68, 178, 38, + 58, 253, 210, 131, 209, 2, 44, 127, 34, 37, 60, 133, 185, 174, 237, 194, + 50, 210, 170, 47, 216, 59, 175, 109, 31, 180, 141, 68, 111, 200, 233, 146, + 61, 143, 16, 3, 20, 141, 103, 112, 56, 236, 87, 88, 15, 26, 175, 109, + 154, 205, 106, 50, 130, 205, 187, 180, 40, 244, 84, 105, 249, 37, 227, 22, + 26, 101, 223, 34, 9, 190, 235, 156, 229, 152, 83, 147, 122, 42, 154, 81, + 219, 169, 72, 95, 70, 250, 135, 150, 127, 158, 150, 149, 220, 211, 231, 5, + 54, 96, 165, 18, 146, 52, 237, 219, 146, 133, 245, 43, 189, 160, 142, 70, + 98, 150, 138, 11, 87, 165, 23, 250, 108, 39, 251, 96, 243, 125, 0, 11, + 107, 107, 146, 114, 207, 123, 50, 137, 81, 104, 116, 166, 235, 189, 180, 173, + 247, 202, 160, 246, 196, 16, 170, 60, 83, 214, 76, 17, 22, 211, 82, 89, + 103, 169, 233, 232, 12, 100, 224, 128, 2, 81, 215, 229, 117, 197, 152, 220, + 44, 240, 250, 125, 129, 82, 148, 74, 249, 253, 89, 217, 158, 218, 229, 243, + 224, 83, 165, 108, 175, 76, 7, 114, 178, 203, 240, 223, 26, 30, 7, 240, + 88, 61, 42, 75, 187, 216, 72, 220, 147, 79, 235, 245, 170, 13, 185, 144, + 35, 173, 10, 60, 144, 58, 77, 9, 189, 184, 119, 195, 25, 222, 97, 192, + 177, 2, 118, 219, 187, 5, 169, 231, 74, 95, 14, 102, 73, 212, 156, 148, + 72, 248, 54, 164, 100, 189, 47, 85, 170, 166, 170, 113, 158, 122, 210, 252, + 39, 169, 45, 240, 190, 170, 27, 137, 207, 155, 202, 98, 123, 254, 83, 77, + 246, 123, 172, 100, 224, 166, 163, 177, 235, 85, 116, 111, 142, 101, 160, 35, + 17, 180, 60, 159, 67, 71, 162, 14, 99, 175, 95, 50, 168, 184, 201, 108, + 1, 197, 29, 193, 182, 54, 167, 110, 166, 67, 64, 5, 159, 231, 77, 224, + 184, 143, 131, 185, 139, 90, 62, 115, 27, 53, 154, 234, 193, 79, 103, 243, + 243, 234, 17, 62, 239, 5, 189, 121, 41, 166, 15, 112, 6, 67, 98, 120, + 45, 101, 119, 255, 41, 225, 121, 98, 235, 143, 223, 44, 188, 252, 64, 197, + 56, 167, 88, 206, 19, 68, 151, 178, 74, 136, 62, 17, 27, 99, 176, 49, + 40, 25, 133, 62, 29, 234, 60, 167, 3, 116, 71, 198, 77, 237, 192, 220, + 78, 25, 196, 137, 171, 153, 172, 72, 211, 123, 104, 15, 36, 87, 236, 127, + 154, 220, 74, 41, 15, 215, 4, 156, 8, 103, 54, 50, 75, 157, 108, 109, + 141, 216, 205, 54, 33, 95, 165, 183, 11, 148, 151, 163, 79, 222, 61, 18, + 155, 3, 123, 46, 133, 221, 40, 27, 79, 168, 0, 55, 204, 242, 63, 74, + 115, 55, 152, 59, 48, 127, 223, 224, 61, 59, 130, 8, 216, 115, 82, 122, + 225, 59, 244, 57, 174, 45, 163, 242, 166, 142, 23, 219, 174, 140, 230, 43, + 237, 26, 154, 192, 199, 234, 233, 85, 39, 130, 165, 32, 210, 58, 153, 180, + 145, 243, 169, 226, 232, 201, 171, 192, 195, 112, 98, 123, 13, 89, 167, 50, + 38, 111, 81, 57, 25, 147, 54, 112, 38, 227, 166, 237, 196, 201, 171, 213, + 127, 148, 202, 186, 120, 152, 28, 153, 101, 122, 210, 182, 90, 198, 205, 200, + 204, 132, 203, 117, 50, 8, 81, 153, 34, 201, 50, 245, 16, 111, 110, 76, + 175, 49, 231, 164, 28, 203, 146, 18, 133, 72, 44, 110, 115, 165, 104, 79, + 205, 252, 249, 228, 6, 72, 175, 100, 158, 200, 44, 87, 241, 78, 90, 238, + 15, 99, 161, 50, 117, 20, 155, 159, 121, 51, 158, 77, 134, 67, 18, 209, + 173, 141, 188, 150, 20, 111, 133, 89, 127, 185, 92, 168, 106, 137, 214, 0, + 196, 75, 31, 39, 234, 173, 179, 77, 186, 204, 107, 39, 39, 71, 23, 215, + 13, 131, 47, 176, 113, 75, 1, 170, 60, 135, 222, 235, 87, 206, 86, 167, + 39, 1, 236, 30, 175, 87, 167, 184, 11, 28, 174, 78, 109, 99, 13, 65, + 176, 119, 188, 94, 99, 208, 224, 112, 13, 65, 27, 8, 234, 65, 208, 6, + 131, 122, 135, 155, 211, 243, 90, 0, 19, 162, 12, 164, 175, 44, 238, 232, + 125, 216, 11, 136, 133, 183, 144, 122, 162, 246, 117, 233, 140, 58, 198, 212, + 42, 114, 94, 66, 107, 123, 97, 196, 35, 45, 145, 117, 222, 170, 87, 124, + 203, 115, 219, 135, 179, 76, 180, 88, 75, 105, 234, 211, 72, 103, 104, 94, + 245, 199, 232, 176, 43, 198, 15, 253, 205, 87, 62, 240, 144, 174, 92, 160, + 110, 68, 31, 71, 72, 85, 7, 32, 29, 237, 221, 127, 249, 163, 138, 41, + 34, 156, 121, 119, 65, 178, 178, 220, 252, 178, 229, 151, 239, 189, 10, 74, + 59, 142, 82, 72, 137, 70, 29, 40, 169, 196, 70, 172, 224, 233, 172, 158, + 167, 8, 33, 188, 130, 182, 248, 86, 152, 109, 198, 148, 97, 166, 84, 221, + 230, 20, 179, 145, 176, 220, 69, 71, 43, 241, 145, 139, 35, 17, 144, 216, + 114, 99, 180, 115, 160, 45, 209, 164, 135, 7, 236, 41, 171, 34, 168, 110, + 253, 32, 99, 50, 7, 42, 41, 252, 147, 202, 11, 115, 84, 198, 154, 101, + 1, 65, 11, 70, 40, 93, 162, 25, 206, 102, 225, 218, 244, 108, 248, 207, + 200, 198, 198, 26, 65, 113, 141, 146, 200, 149, 247, 213, 35, 71, 123, 45, + 71, 105, 96, 116, 26, 220, 157, 69, 35, 59, 58, 61, 135, 51, 245, 13, + 91, 228, 134, 91, 77, 55, 73, 67, 133, 5, 210, 102, 90, 144, 8, 79, + 183, 163, 211, 228, 29, 127, 230, 152, 59, 187, 184, 132, 78, 232, 173, 236, + 206, 10, 150, 226, 202, 5, 74, 63, 136, 42, 179, 42, 7, 246, 214, 28, + 190, 22, 113, 235, 108, 124, 111, 99, 67, 10, 72, 176, 105, 218, 144, 4, + 82, 108, 92, 155, 211, 104, 26, 74, 10, 114, 207, 116, 223, 238, 121, 111, + 17, 194, 207, 127, 43, 37, 180, 179, 201, 72, 35, 241, 253, 5, 205, 229, + 235, 254, 26, 122, 121, 188, 152, 19, 130, 240, 143, 223, 125, 239, 68, 232, + 205, 111, 58, 25, 166, 72, 252, 183, 248, 73, 226, 11, 188, 103, 82, 74, + 66, 104, 251, 138, 174, 185, 121, 75, 113, 104, 173, 139, 217, 2, 171, 97, + 208, 159, 245, 205, 126, 216, 29, 176, 249, 125, 252, 25, 94, 120, 9, 124, + 99, 153, 111, 92, 228, 223, 120, 123, 210, 220, 156, 16, 241, 145, 9, 17, + 229, 128, 1, 198, 46, 39, 104, 218, 74, 146, 220, 126, 56, 134, 223, 216, + 237, 150, 9, 196, 246, 123, 200, 196, 125, 155, 66, 36, 132, 141, 210, 92, + 117, 174, 109, 243, 210, 173, 92, 87, 109, 56, 189, 94, 190, 135, 7, 243, + 188, 145, 249, 214, 43, 250, 118, 157, 248, 222, 46, 204, 192, 223, 149, 193, + 230, 158, 76, 254, 198, 72, 108, 101, 72, 15, 199, 11, 248, 66, 80, 195, + 13, 61, 205, 132, 39, 52, 33, 167, 238, 78, 38, 179, 30, 110, 115, 253, + 196, 232, 2, 237, 44, 103, 115, 148, 133, 114, 153, 113, 102, 229, 247, 229, + 84, 167, 51, 197, 163, 209, 160, 145, 45, 206, 27, 47, 35, 229, 213, 136, + 214, 102, 228, 34, 20, 92, 122, 66, 22, 67, 210, 246, 114, 111, 85, 94, + 149, 123, 107, 252, 103, 83, 22, 228, 147, 170, 33, 245, 68, 139, 119, 147, + 85, 51, 88, 55, 131, 77, 147, 45, 164, 87, 110, 208, 3, 198, 14, 31, + 215, 240, 184, 230, 199, 13, 60, 110, 248, 145, 215, 76, 48, 251, 40, 20, + 50, 250, 78, 187, 62, 75, 34, 68, 207, 167, 38, 129, 33, 95, 222, 192, + 76, 245, 122, 43, 84, 193, 211, 44, 158, 233, 254, 80, 210, 38, 56, 186, + 93, 55, 240, 198, 209, 181, 241, 32, 10, 155, 120, 155, 184, 3, 210, 192, + 43, 241, 177, 109, 26, 52, 171, 71, 112, 128, 124, 119, 134, 199, 64, 56, + 4, 158, 7, 103, 200, 197, 162, 197, 66, 245, 188, 90, 130, 83, 114, 103, + 118, 117, 129, 60, 209, 232, 102, 200, 98, 108, 150, 240, 145, 0, 1, 73, + 121, 219, 172, 3, 9, 33, 94, 73, 88, 209, 2, 133, 234, 50, 84, 181, + 173, 139, 123, 45, 211, 247, 136, 151, 104, 219, 55, 149, 51, 169, 59, 136, + 0, 137, 226, 239, 188, 74, 196, 72, 196, 0, 241, 226, 239, 137, 64, 25, + 86, 16, 154, 61, 36, 61, 157, 89, 186, 135, 8, 101, 2, 189, 123, 88, + 207, 145, 83, 177, 91, 85, 243, 121, 118, 85, 25, 64, 173, 86, 72, 161, + 2, 43, 132, 30, 177, 158, 159, 184, 175, 207, 172, 16, 152, 219, 208, 63, + 63, 132, 166, 65, 48, 84, 122, 107, 112, 25, 119, 255, 7, 82, 248, 175, + 207, 202, 86, 216, 42, 159, 31, 150, 45, 81, 120, 249, 255, 200, 219, 87, + 171, 183, 210, 20, 150, 147, 20, 78, 39, 108, 106, 54, 2, 149, 82, 27, + 48, 205, 173, 18, 100, 81, 66, 121, 3, 165, 171, 148, 172, 85, 179, 84, + 69, 193, 4, 62, 186, 240, 72, 119, 123, 76, 109, 3, 72, 77, 21, 104, + 228, 234, 44, 142, 89, 208, 176, 196, 90, 153, 4, 25, 133, 120, 27, 129, + 27, 79, 83, 225, 75, 24, 149, 122, 32, 141, 130, 222, 48, 249, 22, 4, + 39, 9, 124, 177, 149, 246, 188, 142, 242, 8, 211, 48, 187, 235, 205, 202, + 144, 223, 176, 131, 146, 82, 77, 73, 44, 100, 245, 42, 162, 126, 37, 58, + 97, 195, 233, 103, 54, 153, 162, 221, 75, 108, 127, 59, 120, 78, 26, 159, + 85, 251, 231, 84, 18, 121, 246, 152, 203, 36, 152, 232, 123, 145, 136, 23, + 119, 229, 57, 68, 125, 244, 170, 246, 105, 85, 24, 238, 92, 227, 25, 222, + 54, 175, 143, 241, 27, 56, 182, 95, 11, 179, 157, 33, 135, 15, 143, 131, + 107, 12, 30, 218, 100, 139, 128, 156, 202, 207, 103, 215, 104, 127, 243, 243, + 217, 16, 205, 111, 78, 207, 174, 107, 240, 41, 108, 149, 67, 212, 162, 63, + 61, 27, 138, 215, 107, 124, 229, 102, 29, 25, 8, 1, 71, 213, 160, 237, + 187, 114, 106, 127, 111, 207, 171, 246, 255, 42, 145, 195, 229, 138, 155, 190, + 114, 29, 26, 189, 189, 202, 146, 142, 127, 137, 202, 207, 43, 85, 27, 54, + 149, 234, 145, 73, 169, 81, 34, 195, 99, 93, 187, 92, 21, 182, 198, 148, + 213, 94, 81, 157, 175, 133, 44, 162, 30, 252, 239, 217, 188, 118, 109, 207, + 207, 107, 92, 71, 96, 204, 99, 72, 139, 172, 71, 35, 185, 48, 60, 123, + 223, 62, 192, 133, 145, 217, 50, 12, 222, 198, 121, 15, 167, 13, 156, 86, + 8, 46, 13, 92, 37, 30, 174, 18, 31, 94, 91, 240, 215, 134, 191, 125, + 90, 45, 176, 212, 69, 170, 243, 244, 170, 217, 167, 85, 115, 176, 99, 213, + 136, 155, 212, 222, 186, 96, 1, 121, 143, 88, 64, 54, 100, 147, 90, 68, + 182, 181, 214, 23, 18, 188, 62, 125, 49, 97, 246, 185, 11, 10, 88, 66, + 125, 61, 65, 178, 39, 172, 40, 254, 10, 214, 148, 247, 181, 214, 148, 150, + 228, 151, 84, 18, 239, 235, 47, 59, 60, 182, 234, 235, 206, 254, 133, 159, + 127, 249, 61, 214, 160, 136, 93, 115, 236, 26, 98, 215, 20, 59, 120, 228, + 10, 53, 41, 135, 53, 133, 173, 41, 108, 189, 123, 213, 82, 171, 229, 178, + 181, 205, 53, 53, 248, 183, 46, 96, 223, 126, 5, 19, 9, 87, 112, 134, + 103, 51, 138, 25, 113, 181, 148, 113, 13, 223, 241, 150, 166, 45, 101, 248, + 59, 128, 191, 151, 240, 247, 74, 44, 235, 120, 97, 211, 206, 152, 94, 220, + 175, 104, 113, 207, 174, 224, 132, 252, 160, 245, 45, 31, 55, 5, 75, 221, + 127, 228, 82, 135, 191, 77, 206, 114, 183, 173, 77, 122, 201, 67, 208, 111, + 91, 246, 88, 84, 254, 210, 247, 51, 75, 31, 146, 62, 105, 241, 227, 119, + 176, 252, 253, 63, 112, 249, 107, 73, 254, 158, 74, 226, 255, 177, 20, 194, + 254, 59, 63, 255, 253, 143, 167, 22, 34, 118, 195, 177, 27, 136, 221, 80, + 108, 239, 11, 208, 18, 147, 114, 221, 80, 216, 134, 194, 54, 79, 162, 47, + 182, 185, 161, 206, 122, 18, 165, 153, 247, 99, 207, 82, 158, 238, 89, 10, + 216, 239, 242, 33, 250, 209, 33, 255, 72, 176, 242, 111, 216, 199, 116, 217, + 170, 161, 118, 153, 146, 213, 204, 250, 189, 78, 127, 141, 247, 132, 120, 39, + 170, 59, 30, 104, 102, 140, 84, 32, 5, 186, 133, 30, 179, 89, 9, 36, + 137, 207, 242, 34, 24, 125, 248, 244, 28, 204, 175, 127, 121, 137, 78, 154, + 163, 199, 136, 241, 98, 107, 148, 131, 118, 202, 254, 196, 87, 246, 39, 90, + 13, 200, 104, 165, 64, 34, 36, 219, 5, 211, 85, 181, 80, 9, 236, 14, + 218, 66, 96, 199, 102, 39, 62, 89, 164, 196, 66, 186, 29, 141, 217, 101, + 116, 162, 235, 97, 48, 226, 159, 86, 87, 190, 219, 224, 115, 153, 9, 127, + 222, 186, 123, 209, 157, 101, 4, 70, 40, 68, 66, 61, 127, 239, 165, 89, + 63, 33, 120, 190, 23, 100, 9, 224, 9, 215, 236, 177, 2, 191, 129, 58, + 18, 62, 162, 177, 234, 190, 58, 224, 59, 180, 8, 161, 204, 61, 40, 38, + 43, 55, 34, 192, 250, 206, 96, 178, 16, 184, 133, 135, 38, 33, 59, 72, + 32, 52, 205, 96, 9, 109, 57, 116, 107, 53, 252, 208, 132, 15, 53, 196, + 195, 71, 92, 127, 203, 50, 2, 95, 12, 100, 60, 218, 110, 243, 197, 78, + 136, 71, 23, 85, 175, 234, 153, 154, 227, 208, 102, 26, 35, 69, 252, 164, + 201, 211, 148, 67, 142, 112, 165, 47, 116, 163, 180, 156, 182, 228, 92, 43, + 75, 171, 85, 186, 165, 138, 199, 58, 215, 114, 67, 168, 182, 163, 118, 139, + 195, 86, 26, 52, 126, 30, 122, 69, 52, 27, 140, 170, 167, 43, 178, 20, + 12, 140, 106, 200, 248, 102, 116, 209, 159, 117, 38, 151, 34, 136, 45, 107, + 210, 195, 17, 139, 61, 56, 61, 185, 198, 226, 44, 42, 81, 3, 182, 45, + 148, 177, 45, 6, 253, 17, 238, 177, 192, 134, 208, 246, 203, 206, 233, 73, + 246, 166, 224, 249, 31, 48, 166, 169, 245, 165, 87, 183, 221, 124, 97, 164, + 27, 32, 175, 23, 147, 222, 3, 69, 189, 209, 20, 152, 165, 64, 57, 53, + 40, 54, 200, 100, 203, 43, 6, 242, 230, 139, 122, 99, 44, 193, 95, 8, + 17, 51, 161, 101, 224, 150, 254, 47, 121, 111, 222, 150, 58, 178, 189, 129, + 254, 207, 167, 200, 166, 233, 22, 36, 72, 6, 198, 237, 198, 190, 138, 19, + 42, 136, 226, 128, 250, 179, 125, 194, 28, 129, 128, 204, 224, 241, 187, 223, + 181, 86, 85, 146, 10, 131, 219, 221, 167, 207, 185, 231, 121, 238, 57, 189, + 37, 169, 84, 106, 78, 213, 170, 85, 107, 189, 47, 124, 221, 133, 109, 52, + 119, 85, 109, 101, 55, 76, 91, 138, 228, 2, 52, 91, 123, 25, 126, 202, + 143, 84, 67, 118, 24, 249, 253, 22, 162, 90, 200, 91, 41, 212, 167, 23, + 34, 1, 16, 56, 120, 111, 50, 91, 196, 90, 134, 3, 99, 50, 220, 237, + 237, 150, 32, 63, 136, 76, 166, 51, 20, 47, 136, 91, 142, 110, 231, 174, + 174, 93, 149, 28, 38, 158, 157, 29, 153, 104, 112, 236, 59, 242, 69, 222, + 217, 241, 205, 87, 236, 100, 102, 146, 115, 202, 63, 151, 21, 68, 100, 84, + 29, 236, 35, 199, 131, 241, 189, 245, 65, 48, 159, 239, 1, 107, 91, 221, + 209, 226, 31, 76, 235, 2, 181, 182, 164, 202, 160, 110, 180, 153, 214, 159, + 26, 192, 228, 152, 139, 8, 84, 206, 232, 122, 88, 70, 158, 108, 204, 29, + 87, 37, 129, 121, 16, 194, 173, 88, 40, 60, 175, 223, 145, 194, 242, 220, + 55, 232, 77, 135, 84, 134, 128, 133, 120, 147, 228, 190, 180, 192, 183, 117, + 74, 37, 248, 190, 149, 205, 117, 155, 122, 109, 139, 163, 139, 182, 62, 66, + 66, 21, 32, 85, 225, 70, 64, 113, 154, 249, 184, 28, 231, 137, 11, 237, + 19, 143, 240, 246, 97, 23, 115, 172, 234, 240, 55, 5, 153, 17, 94, 245, + 154, 75, 95, 235, 72, 89, 12, 157, 202, 193, 253, 101, 9, 97, 84, 23, + 166, 218, 137, 42, 109, 51, 60, 106, 102, 166, 185, 227, 179, 187, 187, 21, + 13, 128, 188, 24, 168, 57, 29, 190, 198, 36, 13, 79, 37, 209, 98, 26, + 45, 241, 201, 245, 1, 150, 162, 17, 82, 172, 76, 76, 90, 27, 94, 108, + 183, 57, 111, 232, 192, 113, 166, 131, 125, 131, 137, 176, 194, 107, 220, 67, + 145, 54, 143, 37, 47, 57, 201, 111, 114, 221, 113, 63, 229, 235, 13, 175, + 144, 191, 8, 121, 182, 49, 233, 30, 230, 177, 209, 192, 96, 238, 39, 44, + 138, 140, 231, 158, 213, 129, 89, 193, 68, 45, 87, 45, 238, 183, 147, 60, + 177, 147, 60, 166, 248, 32, 244, 95, 153, 210, 35, 136, 224, 77, 169, 108, + 26, 189, 121, 207, 106, 202, 82, 169, 85, 183, 164, 11, 83, 150, 202, 99, + 233, 204, 52, 230, 6, 254, 149, 165, 163, 108, 246, 110, 75, 83, 212, 216, + 39, 11, 201, 82, 203, 113, 79, 16, 111, 195, 9, 46, 31, 118, 211, 145, + 7, 235, 166, 185, 108, 185, 127, 64, 104, 139, 248, 214, 244, 218, 38, 8, + 97, 47, 22, 54, 58, 179, 174, 113, 24, 252, 164, 155, 188, 75, 15, 250, + 199, 212, 224, 131, 147, 156, 26, 193, 100, 78, 54, 251, 124, 91, 100, 215, + 137, 179, 239, 57, 85, 124, 215, 254, 138, 4, 244, 143, 213, 89, 179, 34, + 185, 231, 210, 28, 129, 169, 186, 167, 50, 99, 68, 248, 86, 43, 164, 26, + 30, 160, 81, 19, 129, 82, 147, 123, 0, 243, 116, 166, 35, 65, 225, 185, + 253, 216, 71, 182, 153, 184, 176, 65, 211, 19, 147, 2, 17, 100, 154, 147, + 208, 7, 123, 19, 39, 82, 120, 244, 35, 224, 150, 150, 205, 55, 246, 185, + 98, 123, 213, 169, 116, 216, 50, 6, 253, 58, 30, 212, 139, 70, 204, 75, + 183, 50, 210, 149, 112, 32, 214, 126, 203, 224, 224, 237, 75, 206, 109, 37, + 158, 210, 26, 104, 85, 151, 183, 219, 38, 40, 65, 159, 130, 86, 175, 218, + 230, 29, 50, 228, 212, 82, 194, 202, 183, 133, 121, 110, 73, 93, 164, 161, + 172, 136, 139, 46, 44, 170, 117, 203, 168, 116, 234, 44, 133, 8, 239, 82, + 150, 192, 103, 118, 208, 228, 12, 172, 120, 144, 221, 63, 49, 252, 163, 186, + 232, 138, 178, 246, 121, 165, 51, 30, 72, 113, 49, 154, 108, 11, 230, 76, + 34, 21, 27, 208, 158, 82, 40, 182, 32, 215, 191, 24, 22, 167, 138, 153, + 19, 231, 24, 21, 144, 236, 194, 169, 112, 116, 85, 235, 160, 169, 84, 205, + 216, 243, 76, 73, 136, 48, 46, 30, 240, 113, 198, 52, 70, 203, 233, 225, + 34, 243, 146, 164, 174, 148, 66, 40, 130, 183, 111, 57, 94, 63, 14, 132, + 39, 230, 178, 255, 66, 112, 1, 104, 196, 238, 49, 118, 255, 119, 11, 184, + 156, 58, 47, 240, 208, 229, 12, 88, 118, 162, 44, 177, 6, 94, 30, 102, + 78, 77, 76, 178, 243, 230, 71, 202, 238, 136, 43, 30, 30, 109, 13, 229, + 229, 131, 43, 202, 22, 196, 34, 39, 117, 129, 79, 137, 227, 201, 187, 35, + 210, 83, 37, 15, 157, 153, 85, 55, 64, 82, 29, 17, 141, 20, 76, 56, + 112, 71, 236, 81, 131, 177, 213, 172, 71, 218, 227, 209, 200, 248, 148, 129, + 204, 233, 19, 152, 199, 146, 100, 136, 239, 116, 11, 57, 88, 59, 188, 4, + 202, 14, 153, 237, 179, 193, 171, 50, 248, 128, 90, 199, 198, 14, 168, 25, + 220, 8, 195, 157, 158, 136, 173, 204, 83, 110, 231, 11, 16, 123, 100, 211, + 150, 142, 207, 95, 186, 61, 170, 99, 108, 125, 70, 172, 72, 97, 14, 217, + 128, 42, 204, 32, 37, 33, 47, 58, 225, 138, 224, 230, 22, 254, 57, 110, + 33, 146, 205, 173, 129, 194, 24, 218, 7, 239, 104, 12, 142, 143, 29, 192, + 59, 16, 111, 240, 28, 179, 116, 243, 10, 216, 95, 26, 142, 195, 151, 198, + 160, 254, 134, 139, 187, 187, 107, 70, 223, 10, 119, 180, 96, 164, 149, 193, + 2, 45, 210, 147, 208, 230, 3, 91, 2, 81, 225, 37, 76, 6, 77, 82, + 56, 191, 248, 134, 105, 193, 205, 81, 251, 221, 39, 230, 239, 172, 59, 44, + 63, 151, 91, 245, 39, 249, 216, 3, 82, 216, 198, 170, 235, 72, 57, 43, + 4, 26, 111, 27, 93, 13, 38, 43, 248, 23, 164, 194, 113, 109, 45, 36, + 191, 99, 227, 96, 91, 226, 248, 151, 0, 183, 153, 175, 178, 200, 150, 236, + 224, 60, 138, 50, 79, 9, 19, 94, 193, 183, 128, 252, 24, 11, 160, 75, + 87, 236, 114, 239, 90, 207, 196, 141, 92, 237, 244, 134, 232, 212, 42, 240, + 12, 147, 63, 237, 74, 201, 240, 133, 29, 79, 134, 156, 214, 16, 118, 21, + 200, 111, 14, 253, 182, 14, 133, 219, 49, 78, 68, 233, 168, 78, 52, 10, + 107, 41, 210, 188, 240, 219, 180, 255, 113, 246, 109, 236, 1, 201, 96, 227, + 81, 15, 169, 142, 217, 236, 81, 171, 67, 59, 117, 145, 119, 248, 203, 172, + 198, 9, 101, 201, 100, 84, 204, 119, 253, 120, 178, 207, 216, 253, 141, 30, + 2, 216, 187, 214, 150, 126, 41, 236, 237, 80, 140, 16, 134, 63, 56, 2, + 92, 144, 9, 242, 138, 90, 234, 120, 193, 223, 53, 225, 17, 145, 226, 130, + 199, 171, 226, 21, 150, 54, 244, 49, 42, 214, 28, 49, 9, 111, 92, 187, + 25, 215, 113, 82, 181, 79, 250, 61, 166, 169, 30, 122, 16, 125, 137, 138, + 33, 24, 136, 101, 50, 74, 8, 105, 56, 176, 213, 63, 252, 155, 217, 234, + 209, 95, 146, 135, 225, 94, 51, 134, 239, 224, 78, 17, 77, 171, 68, 190, + 49, 228, 156, 39, 131, 76, 95, 3, 69, 178, 192, 15, 144, 200, 158, 216, + 57, 187, 77, 239, 21, 104, 132, 62, 100, 231, 190, 197, 238, 249, 126, 70, + 71, 228, 102, 219, 156, 31, 61, 106, 209, 99, 102, 213, 165, 86, 243, 2, + 124, 56, 136, 30, 239, 1, 157, 225, 65, 215, 35, 41, 121, 29, 39, 46, + 215, 64, 56, 190, 179, 54, 226, 167, 199, 27, 84, 156, 213, 96, 252, 25, + 38, 211, 20, 185, 95, 37, 226, 226, 163, 129, 37, 221, 58, 180, 134, 20, + 83, 12, 251, 202, 220, 231, 14, 206, 45, 137, 165, 96, 247, 129, 231, 211, + 113, 179, 219, 202, 100, 182, 196, 172, 182, 16, 192, 136, 49, 198, 112, 30, + 120, 134, 10, 102, 142, 68, 30, 116, 102, 2, 98, 72, 176, 148, 141, 33, + 167, 169, 49, 129, 194, 136, 179, 235, 10, 3, 233, 80, 24, 100, 253, 249, + 192, 232, 154, 53, 238, 249, 195, 215, 213, 53, 146, 250, 151, 160, 247, 105, + 207, 226, 214, 199, 89, 6, 197, 74, 109, 150, 7, 61, 157, 34, 251, 150, + 59, 137, 127, 116, 54, 46, 61, 110, 85, 152, 211, 134, 186, 231, 229, 60, + 113, 246, 43, 236, 3, 68, 240, 77, 216, 98, 100, 50, 252, 240, 39, 24, + 208, 241, 102, 195, 106, 226, 240, 59, 219, 134, 66, 124, 246, 98, 58, 218, + 149, 70, 254, 196, 88, 17, 246, 204, 136, 211, 204, 77, 91, 60, 242, 1, + 179, 247, 247, 120, 34, 72, 53, 206, 154, 183, 231, 135, 107, 244, 170, 168, + 109, 107, 4, 109, 140, 154, 245, 154, 134, 164, 223, 120, 29, 230, 215, 177, + 109, 254, 196, 189, 9, 179, 155, 196, 182, 185, 235, 247, 69, 119, 36, 149, + 156, 97, 91, 123, 170, 239, 31, 41, 6, 249, 107, 56, 5, 33, 172, 81, + 161, 40, 236, 169, 120, 187, 166, 56, 12, 178, 183, 246, 207, 149, 72, 94, + 120, 203, 4, 247, 75, 165, 98, 49, 188, 1, 235, 75, 70, 219, 62, 110, + 35, 60, 89, 37, 6, 255, 149, 193, 66, 223, 18, 126, 7, 28, 250, 158, + 171, 205, 197, 73, 96, 153, 226, 156, 13, 158, 33, 103, 17, 0, 129, 84, + 94, 101, 194, 209, 62, 96, 135, 186, 109, 207, 198, 184, 111, 14, 125, 248, + 134, 245, 207, 94, 209, 63, 16, 255, 221, 125, 69, 199, 87, 106, 144, 75, + 96, 88, 143, 4, 134, 195, 15, 113, 188, 130, 8, 132, 243, 236, 112, 24, + 14, 236, 109, 7, 106, 67, 27, 127, 95, 141, 104, 33, 212, 115, 17, 166, + 234, 196, 81, 159, 81, 227, 172, 250, 217, 219, 8, 42, 117, 46, 220, 227, + 252, 58, 132, 143, 183, 203, 248, 96, 177, 96, 245, 1, 81, 189, 170, 25, + 88, 240, 64, 6, 173, 69, 43, 70, 181, 141, 23, 43, 220, 206, 182, 199, + 31, 169, 118, 237, 132, 249, 182, 193, 217, 88, 124, 81, 93, 143, 155, 0, + 86, 142, 77, 162, 248, 74, 209, 97, 125, 65, 88, 35, 196, 152, 90, 35, + 27, 247, 16, 251, 163, 49, 167, 10, 58, 194, 229, 175, 83, 225, 50, 192, + 45, 145, 12, 215, 9, 249, 148, 254, 182, 100, 231, 239, 84, 159, 225, 62, + 194, 54, 201, 38, 225, 248, 108, 218, 22, 78, 161, 254, 105, 6, 89, 230, + 205, 71, 187, 14, 155, 18, 25, 105, 44, 24, 203, 9, 72, 179, 48, 106, + 16, 110, 204, 105, 64, 25, 117, 177, 176, 34, 205, 241, 20, 201, 240, 9, + 13, 43, 104, 166, 214, 16, 198, 106, 14, 97, 172, 102, 207, 251, 218, 143, + 140, 102, 47, 0, 95, 33, 140, 181, 155, 90, 160, 140, 117, 130, 68, 217, + 141, 21, 104, 165, 129, 109, 39, 83, 207, 230, 130, 193, 177, 45, 51, 191, + 17, 3, 172, 182, 145, 1, 150, 109, 66, 216, 162, 215, 235, 27, 104, 50, + 79, 202, 166, 111, 123, 42, 105, 186, 241, 8, 76, 32, 242, 96, 236, 109, + 50, 52, 76, 68, 39, 213, 148, 109, 160, 184, 206, 119, 120, 56, 135, 250, + 204, 16, 213, 104, 129, 234, 190, 23, 2, 104, 160, 99, 48, 249, 165, 69, + 96, 15, 203, 103, 98, 248, 70, 171, 62, 34, 147, 83, 6, 163, 51, 219, + 98, 49, 183, 144, 141, 124, 104, 87, 202, 25, 122, 93, 179, 58, 232, 69, + 88, 46, 76, 33, 197, 252, 49, 112, 111, 218, 235, 154, 139, 37, 35, 105, + 130, 226, 97, 145, 37, 150, 215, 16, 247, 7, 14, 1, 12, 41, 108, 81, + 71, 139, 89, 242, 89, 2, 90, 188, 207, 16, 153, 60, 228, 133, 156, 195, + 94, 84, 223, 74, 174, 254, 182, 53, 26, 245, 191, 71, 163, 211, 233, 116, + 199, 132, 85, 102, 199, 236, 70, 251, 227, 74, 20, 246, 133, 81, 77, 81, + 213, 104, 179, 217, 125, 25, 244, 173, 232, 230, 239, 132, 129, 237, 176, 202, + 227, 233, 241, 166, 51, 61, 180, 82, 64, 195, 252, 148, 134, 92, 219, 58, + 158, 116, 122, 218, 93, 215, 48, 84, 241, 45, 117, 134, 48, 194, 49, 113, + 193, 95, 45, 160, 126, 236, 121, 78, 152, 132, 78, 9, 168, 51, 88, 84, + 196, 158, 224, 173, 201, 24, 183, 214, 181, 253, 170, 224, 239, 177, 226, 183, + 89, 213, 164, 97, 107, 7, 25, 213, 134, 227, 110, 96, 143, 249, 140, 78, + 140, 1, 93, 78, 62, 92, 42, 53, 107, 250, 9, 87, 27, 227, 105, 179, + 90, 235, 162, 176, 69, 172, 37, 19, 7, 177, 155, 41, 230, 182, 13, 203, + 146, 53, 221, 14, 88, 173, 104, 112, 186, 221, 130, 53, 199, 113, 198, 176, + 166, 123, 211, 127, 253, 11, 158, 236, 181, 86, 221, 30, 92, 236, 16, 23, + 19, 106, 71, 138, 203, 113, 180, 101, 73, 224, 9, 12, 254, 197, 67, 144, + 10, 30, 0, 89, 116, 182, 227, 131, 52, 101, 72, 80, 102, 135, 87, 80, + 205, 70, 117, 7, 17, 81, 25, 250, 192, 11, 25, 54, 35, 133, 233, 135, + 77, 227, 245, 30, 156, 70, 48, 234, 244, 35, 20, 133, 90, 188, 7, 91, + 17, 118, 236, 69, 183, 14, 193, 23, 250, 163, 146, 11, 56, 71, 244, 144, + 220, 140, 168, 156, 116, 236, 194, 25, 81, 87, 171, 130, 112, 250, 141, 145, + 88, 35, 58, 241, 122, 143, 244, 77, 200, 18, 254, 248, 28, 182, 223, 224, + 244, 119, 144, 116, 240, 16, 44, 56, 254, 1, 169, 133, 182, 41, 142, 237, + 162, 251, 193, 25, 18, 190, 5, 91, 235, 226, 41, 44, 102, 107, 37, 230, + 31, 127, 108, 120, 195, 77, 121, 233, 213, 240, 16, 129, 13, 170, 189, 33, + 161, 243, 17, 240, 30, 30, 5, 179, 43, 66, 251, 224, 14, 186, 171, 238, + 242, 17, 187, 173, 156, 145, 128, 112, 125, 48, 83, 226, 120, 248, 224, 135, + 84, 48, 26, 177, 210, 238, 29, 31, 22, 220, 111, 126, 121, 228, 26, 147, + 38, 12, 60, 131, 78, 230, 2, 8, 180, 143, 187, 71, 82, 227, 7, 222, + 105, 40, 127, 68, 145, 30, 101, 34, 195, 127, 42, 237, 29, 121, 60, 103, + 112, 47, 57, 170, 172, 153, 69, 189, 68, 92, 155, 38, 84, 175, 186, 103, + 153, 154, 205, 166, 161, 114, 41, 216, 214, 30, 136, 253, 251, 147, 177, 173, + 216, 217, 68, 183, 181, 172, 202, 177, 153, 157, 55, 170, 114, 144, 193, 158, + 192, 211, 184, 83, 97, 205, 61, 127, 103, 59, 85, 47, 84, 222, 23, 166, + 84, 249, 51, 6, 183, 164, 195, 209, 102, 183, 150, 163, 255, 113, 181, 176, + 155, 100, 58, 54, 45, 199, 153, 4, 146, 100, 255, 54, 118, 101, 92, 133, + 201, 91, 213, 124, 155, 187, 250, 39, 211, 181, 151, 108, 77, 89, 162, 179, + 119, 217, 214, 146, 94, 178, 53, 70, 179, 38, 240, 201, 170, 94, 229, 209, + 230, 185, 63, 56, 12, 121, 103, 255, 159, 117, 182, 151, 91, 77, 103, 220, + 106, 250, 79, 184, 213, 98, 179, 64, 204, 229, 86, 91, 230, 79, 91, 62, + 189, 75, 172, 89, 107, 86, 88, 234, 113, 101, 208, 209, 149, 119, 3, 65, + 218, 135, 143, 141, 146, 247, 245, 246, 15, 44, 145, 233, 118, 128, 155, 1, + 210, 138, 195, 71, 212, 154, 87, 52, 231, 149, 214, 118, 64, 227, 175, 104, + 107, 41, 236, 215, 50, 154, 49, 213, 213, 42, 219, 152, 46, 107, 54, 243, + 250, 187, 26, 118, 10, 69, 69, 143, 190, 43, 176, 86, 176, 202, 200, 206, + 83, 200, 159, 21, 19, 31, 183, 236, 199, 168, 124, 39, 163, 32, 194, 179, + 149, 53, 178, 196, 128, 13, 217, 42, 197, 69, 199, 168, 212, 59, 47, 141, + 38, 161, 154, 174, 242, 93, 252, 140, 42, 74, 240, 192, 0, 113, 209, 23, + 166, 190, 36, 195, 0, 2, 226, 176, 177, 119, 34, 78, 130, 98, 124, 213, + 71, 220, 242, 72, 173, 233, 90, 98, 192, 36, 63, 133, 57, 84, 188, 111, + 125, 136, 158, 233, 93, 163, 191, 99, 39, 231, 218, 134, 80, 107, 236, 48, + 34, 143, 223, 145, 168, 30, 22, 2, 72, 231, 119, 118, 229, 77, 129, 45, + 164, 206, 206, 211, 91, 36, 194, 144, 69, 203, 14, 145, 102, 75, 102, 42, + 134, 109, 155, 255, 10, 85, 37, 14, 221, 149, 111, 178, 18, 42, 178, 91, + 49, 93, 134, 106, 199, 93, 9, 21, 185, 171, 102, 110, 154, 158, 16, 149, + 179, 190, 172, 227, 161, 194, 107, 194, 38, 151, 56, 31, 149, 44, 68, 245, + 178, 79, 241, 168, 170, 44, 113, 22, 42, 217, 12, 49, 106, 150, 62, 163, + 101, 131, 22, 113, 184, 219, 98, 238, 112, 86, 195, 129, 196, 118, 224, 7, + 196, 194, 105, 131, 1, 254, 187, 156, 109, 108, 244, 162, 38, 128, 56, 208, + 217, 178, 196, 206, 192, 217, 11, 2, 199, 26, 19, 125, 2, 125, 206, 234, + 180, 204, 159, 198, 204, 120, 28, 50, 7, 126, 181, 156, 106, 220, 71, 120, + 35, 18, 251, 46, 100, 254, 1, 172, 19, 136, 220, 53, 247, 229, 103, 115, + 240, 38, 72, 60, 119, 115, 168, 11, 155, 67, 210, 3, 226, 238, 80, 181, + 25, 30, 233, 240, 139, 166, 215, 29, 217, 54, 157, 66, 161, 121, 153, 9, + 210, 65, 6, 34, 152, 65, 58, 40, 67, 157, 50, 13, 175, 47, 83, 30, + 105, 255, 127, 163, 60, 250, 255, 128, 231, 200, 67, 111, 36, 48, 27, 57, + 252, 71, 94, 138, 35, 191, 199, 84, 195, 245, 242, 30, 77, 254, 113, 236, + 231, 81, 111, 100, 116, 112, 27, 101, 242, 67, 159, 255, 62, 248, 179, 93, + 171, 152, 226, 115, 43, 248, 111, 194, 60, 111, 170, 214, 175, 224, 60, 59, + 40, 209, 46, 218, 243, 216, 162, 179, 122, 40, 159, 23, 123, 221, 232, 194, + 103, 54, 242, 194, 63, 47, 157, 198, 176, 194, 218, 9, 144, 173, 235, 47, + 53, 51, 203, 34, 163, 173, 152, 242, 110, 106, 87, 50, 82, 209, 165, 176, + 157, 165, 10, 243, 152, 26, 151, 170, 227, 17, 119, 23, 117, 43, 35, 28, + 26, 106, 155, 169, 217, 215, 215, 96, 3, 236, 186, 44, 177, 2, 219, 10, + 102, 193, 150, 215, 163, 93, 134, 101, 158, 180, 75, 120, 190, 189, 35, 145, + 60, 198, 132, 63, 110, 41, 69, 22, 189, 186, 107, 25, 9, 223, 194, 54, + 25, 103, 71, 236, 185, 79, 216, 6, 241, 178, 189, 244, 96, 167, 61, 169, + 175, 156, 158, 109, 234, 179, 207, 187, 140, 39, 198, 141, 125, 56, 34, 237, + 47, 125, 30, 226, 17, 148, 141, 191, 72, 70, 29, 255, 102, 151, 218, 245, + 140, 201, 235, 123, 214, 109, 135, 181, 56, 189, 250, 82, 103, 107, 140, 55, + 121, 13, 122, 198, 218, 38, 240, 118, 60, 158, 52, 112, 145, 92, 128, 83, + 180, 199, 128, 190, 60, 6, 214, 128, 38, 186, 140, 34, 225, 6, 202, 143, + 76, 96, 118, 81, 89, 85, 159, 93, 111, 148, 119, 17, 140, 31, 109, 239, + 126, 224, 41, 2, 8, 24, 180, 147, 198, 128, 61, 144, 206, 233, 213, 112, + 198, 190, 71, 44, 79, 103, 164, 48, 88, 141, 40, 44, 248, 20, 107, 19, + 161, 200, 196, 176, 38, 29, 179, 62, 90, 54, 28, 229, 216, 157, 189, 65, + 13, 57, 48, 249, 52, 251, 47, 16, 243, 254, 5, 29, 243, 33, 27, 51, + 19, 121, 207, 103, 112, 59, 135, 127, 11, 248, 87, 69, 85, 185, 189, 12, + 191, 84, 209, 221, 156, 77, 85, 235, 192, 225, 239, 236, 108, 97, 203, 50, + 134, 93, 212, 100, 179, 105, 41, 180, 180, 209, 233, 225, 86, 199, 49, 103, + 194, 220, 169, 165, 177, 75, 156, 148, 5, 63, 253, 149, 195, 83, 89, 162, + 154, 48, 238, 105, 91, 84, 112, 203, 40, 88, 63, 173, 169, 129, 199, 6, + 170, 102, 14, 204, 106, 171, 83, 103, 86, 80, 86, 125, 220, 5, 73, 120, + 163, 217, 211, 250, 4, 55, 238, 148, 195, 78, 119, 232, 184, 117, 248, 89, + 28, 20, 219, 102, 78, 23, 146, 27, 63, 133, 193, 110, 163, 102, 3, 202, + 79, 122, 131, 30, 108, 107, 214, 30, 231, 160, 249, 53, 158, 180, 72, 119, + 44, 18, 4, 24, 205, 129, 209, 253, 117, 243, 125, 219, 69, 159, 121, 85, + 176, 253, 83, 253, 13, 183, 79, 246, 102, 9, 134, 16, 47, 10, 29, 74, + 56, 152, 91, 116, 199, 248, 79, 232, 84, 194, 11, 190, 69, 79, 51, 25, + 6, 30, 128, 216, 199, 84, 73, 76, 29, 209, 7, 120, 84, 7, 10, 137, + 30, 114, 122, 17, 1, 147, 0, 67, 99, 48, 210, 152, 117, 38, 146, 120, + 241, 146, 172, 161, 111, 250, 27, 205, 178, 209, 167, 96, 45, 217, 75, 152, + 97, 1, 126, 133, 56, 209, 75, 197, 178, 252, 229, 82, 252, 174, 49, 104, + 191, 52, 56, 124, 204, 119, 210, 65, 200, 47, 203, 156, 109, 53, 196, 184, + 38, 65, 30, 100, 5, 231, 53, 44, 58, 1, 146, 56, 166, 90, 181, 94, + 215, 48, 63, 231, 195, 90, 57, 205, 35, 183, 155, 141, 220, 40, 171, 101, + 244, 223, 219, 65, 245, 218, 55, 63, 237, 174, 233, 212, 137, 52, 137, 228, + 17, 97, 91, 145, 56, 189, 202, 123, 212, 30, 30, 140, 83, 100, 190, 52, + 92, 230, 190, 117, 237, 97, 111, 83, 64, 172, 66, 159, 29, 119, 186, 135, + 38, 89, 109, 16, 180, 242, 17, 28, 76, 209, 210, 103, 115, 19, 185, 189, + 110, 226, 68, 171, 72, 35, 162, 96, 13, 168, 126, 166, 34, 37, 13, 7, + 44, 235, 244, 112, 39, 78, 58, 29, 84, 132, 209, 189, 7, 189, 126, 170, + 101, 4, 141, 113, 139, 223, 145, 106, 151, 160, 80, 125, 12, 49, 154, 87, + 52, 48, 213, 96, 247, 198, 92, 53, 53, 159, 235, 96, 128, 252, 118, 175, + 182, 78, 119, 71, 214, 185, 171, 38, 219, 41, 117, 77, 230, 201, 135, 46, + 14, 66, 164, 119, 166, 75, 143, 104, 17, 210, 147, 124, 108, 120, 103, 254, + 233, 59, 239, 76, 3, 207, 2, 90, 31, 31, 63, 207, 86, 255, 218, 59, + 115, 178, 33, 242, 84, 62, 130, 181, 143, 184, 213, 71, 5, 180, 163, 205, + 128, 200, 221, 9, 126, 79, 130, 217, 145, 240, 169, 224, 167, 133, 150, 184, + 253, 129, 137, 106, 184, 57, 219, 184, 50, 120, 106, 180, 89, 196, 249, 217, + 130, 81, 111, 78, 224, 161, 199, 120, 119, 211, 105, 184, 155, 44, 29, 74, + 54, 136, 186, 233, 23, 62, 158, 181, 25, 175, 37, 84, 91, 51, 175, 58, + 100, 23, 42, 155, 10, 201, 246, 84, 162, 217, 150, 38, 60, 167, 112, 156, + 95, 13, 1, 91, 122, 236, 70, 139, 39, 156, 169, 84, 177, 231, 69, 59, + 211, 239, 210, 113, 221, 96, 74, 235, 163, 153, 237, 161, 193, 31, 26, 131, + 58, 154, 195, 143, 122, 29, 216, 135, 64, 222, 40, 84, 126, 222, 122, 43, + 237, 70, 73, 64, 35, 241, 232, 8, 31, 236, 162, 247, 252, 146, 219, 223, + 218, 140, 55, 73, 148, 46, 249, 17, 108, 131, 172, 170, 201, 26, 12, 154, + 145, 202, 35, 88, 191, 7, 124, 188, 146, 30, 31, 51, 87, 116, 84, 86, + 161, 144, 127, 86, 165, 165, 189, 152, 221, 120, 246, 41, 181, 107, 48, 248, + 13, 38, 13, 172, 146, 12, 123, 179, 15, 191, 36, 86, 108, 253, 226, 34, + 134, 81, 199, 179, 29, 6, 250, 88, 88, 21, 4, 162, 151, 213, 48, 114, + 134, 133, 91, 48, 88, 122, 184, 132, 177, 24, 86, 69, 38, 223, 169, 10, + 58, 79, 225, 72, 32, 188, 64, 247, 240, 101, 221, 114, 131, 181, 196, 101, + 252, 63, 216, 253, 168, 124, 112, 214, 87, 214, 207, 159, 14, 137, 146, 217, + 133, 85, 158, 128, 123, 183, 48, 225, 45, 169, 62, 171, 214, 251, 35, 102, + 178, 171, 216, 192, 94, 124, 165, 70, 196, 40, 171, 55, 194, 172, 135, 102, + 13, 237, 95, 254, 43, 131, 139, 68, 31, 159, 219, 122, 191, 62, 174, 160, + 89, 234, 77, 210, 213, 254, 15, 12, 49, 168, 196, 223, 26, 101, 36, 244, + 124, 117, 168, 141, 94, 208, 10, 18, 26, 107, 70, 155, 144, 57, 253, 93, + 208, 223, 153, 74, 33, 244, 119, 161, 138, 38, 240, 215, 245, 17, 172, 250, + 176, 145, 224, 253, 205, 53, 36, 43, 126, 58, 117, 220, 76, 224, 222, 142, + 155, 108, 187, 219, 6, 202, 52, 104, 35, 102, 132, 34, 65, 27, 51, 35, + 180, 65, 188, 177, 11, 202, 29, 250, 28, 189, 63, 244, 183, 83, 5, 91, + 4, 73, 242, 195, 170, 140, 136, 122, 177, 82, 98, 167, 35, 61, 197, 100, + 5, 99, 218, 154, 128, 14, 5, 67, 11, 97, 228, 166, 95, 67, 88, 233, + 155, 41, 27, 204, 2, 8, 214, 128, 187, 172, 126, 248, 230, 107, 163, 105, + 16, 173, 69, 209, 52, 118, 56, 179, 88, 27, 77, 135, 104, 53, 138, 134, + 231, 71, 16, 109, 166, 174, 139, 22, 115, 50, 141, 49, 221, 248, 124, 109, + 180, 184, 147, 41, 212, 41, 142, 153, 174, 141, 150, 112, 50, 77, 96, 213, + 63, 124, 65, 130, 250, 152, 169, 127, 17, 220, 199, 28, 126, 23, 8, 251, + 161, 134, 208, 203, 244, 221, 5, 166, 228, 200, 14, 204, 86, 153, 3, 57, + 240, 27, 134, 219, 16, 98, 199, 63, 40, 52, 249, 216, 161, 136, 164, 58, + 158, 25, 220, 95, 115, 45, 87, 33, 116, 243, 219, 216, 168, 13, 24, 7, + 150, 119, 188, 138, 35, 117, 166, 209, 53, 253, 157, 233, 116, 173, 51, 106, + 12, 175, 251, 208, 250, 237, 243, 23, 190, 2, 79, 14, 139, 149, 124, 22, + 95, 205, 237, 31, 252, 154, 28, 72, 71, 183, 133, 126, 197, 201, 40, 98, + 83, 84, 44, 123, 27, 85, 199, 21, 179, 42, 110, 184, 255, 230, 150, 29, + 211, 226, 198, 31, 104, 13, 168, 103, 152, 228, 41, 166, 44, 126, 236, 125, + 3, 38, 182, 97, 38, 254, 187, 12, 255, 165, 217, 79, 66, 97, 151, 49, + 246, 75, 19, 130, 48, 30, 2, 236, 29, 9, 170, 57, 111, 34, 149, 167, + 4, 159, 1, 11, 163, 211, 22, 84, 97, 45, 143, 32, 123, 121, 248, 109, + 47, 147, 34, 245, 213, 111, 63, 50, 106, 140, 93, 125, 203, 168, 170, 223, + 247, 226, 121, 229, 29, 34, 168, 218, 159, 218, 119, 253, 67, 10, 108, 47, + 61, 212, 68, 149, 88, 154, 157, 104, 83, 82, 105, 199, 68, 79, 85, 4, + 139, 109, 21, 61, 154, 215, 207, 40, 236, 228, 116, 245, 20, 248, 79, 123, + 86, 249, 238, 204, 42, 107, 163, 34, 102, 191, 61, 179, 124, 167, 153, 5, + 167, 140, 181, 81, 117, 55, 85, 196, 240, 231, 211, 198, 218, 168, 49, 55, + 213, 216, 119, 154, 97, 102, 218, 134, 168, 113, 55, 213, 248, 119, 154, 101, + 230, 155, 162, 38, 220, 84, 19, 223, 105, 166, 153, 233, 27, 162, 38, 221, + 84, 147, 223, 3, 73, 76, 117, 83, 212, 148, 155, 106, 234, 123, 32, 37, + 204, 95, 187, 129, 25, 76, 163, 51, 205, 158, 199, 118, 3, 115, 184, 159, + 107, 108, 30, 43, 42, 153, 39, 142, 105, 244, 188, 91, 84, 241, 134, 208, + 140, 224, 70, 195, 27, 13, 163, 194, 141, 142, 55, 248, 158, 254, 188, 107, + 159, 116, 63, 225, 20, 72, 224, 48, 69, 53, 82, 132, 73, 143, 93, 235, + 145, 162, 22, 10, 201, 238, 67, 93, 120, 168, 69, 138, 106, 40, 244, 76, + 83, 162, 6, 19, 34, 206, 131, 220, 195, 61, 144, 134, 181, 99, 121, 38, + 244, 14, 57, 221, 163, 133, 213, 133, 49, 167, 234, 238, 160, 139, 137, 131, + 46, 246, 95, 28, 116, 139, 77, 81, 117, 55, 42, 31, 116, 27, 199, 103, + 204, 45, 0, 31, 116, 27, 199, 103, 220, 77, 149, 15, 186, 197, 166, 168, + 107, 6, 221, 166, 241, 185, 102, 208, 109, 138, 186, 58, 232, 22, 155, 162, + 166, 221, 168, 233, 239, 129, 244, 103, 163, 94, 85, 132, 62, 80, 160, 19, + 148, 207, 6, 190, 170, 186, 41, 171, 216, 101, 216, 103, 139, 141, 177, 133, + 78, 83, 161, 215, 84, 237, 11, 95, 138, 189, 242, 239, 6, 22, 112, 191, + 88, 253, 114, 16, 13, 204, 243, 245, 96, 108, 207, 23, 132, 175, 121, 190, + 34, 22, 240, 79, 125, 73, 250, 210, 151, 164, 66, 250, 106, 108, 173, 80, + 81, 129, 165, 140, 153, 232, 175, 213, 58, 184, 143, 109, 152, 91, 27, 152, + 133, 111, 95, 196, 245, 11, 182, 250, 50, 110, 247, 235, 157, 142, 217, 31, + 214, 93, 91, 112, 254, 143, 220, 92, 165, 90, 157, 116, 23, 136, 128, 47, + 164, 30, 230, 47, 145, 158, 224, 253, 255, 129, 168, 31, 50, 90, 116, 162, + 164, 235, 19, 226, 173, 87, 162, 254, 180, 152, 94, 37, 154, 151, 15, 200, + 115, 82, 82, 249, 240, 17, 190, 53, 66, 178, 144, 239, 255, 184, 187, 167, + 112, 47, 22, 41, 188, 45, 109, 45, 182, 164, 5, 51, 147, 197, 109, 5, + 153, 16, 44, 96, 114, 97, 22, 149, 45, 30, 105, 190, 37, 205, 151, 34, + 205, 89, 36, 120, 56, 219, 146, 102, 206, 67, 95, 240, 61, 48, 139, 98, + 54, 31, 187, 239, 129, 185, 115, 181, 96, 87, 33, 102, 164, 16, 124, 159, + 146, 9, 106, 139, 254, 214, 224, 111, 136, 25, 98, 64, 138, 86, 87, 242, + 63, 9, 13, 128, 238, 160, 254, 128, 213, 245, 111, 61, 251, 87, 118, 59, + 182, 29, 188, 211, 107, 39, 8, 88, 143, 24, 81, 142, 30, 26, 68, 169, + 67, 30, 75, 2, 177, 12, 38, 218, 177, 203, 180, 244, 43, 138, 250, 156, + 5, 253, 99, 203, 110, 14, 230, 64, 213, 128, 93, 180, 27, 233, 200, 197, + 190, 230, 82, 95, 111, 60, 114, 222, 99, 118, 225, 80, 138, 62, 10, 84, + 65, 67, 174, 200, 213, 144, 141, 101, 77, 177, 217, 171, 76, 50, 28, 130, + 92, 232, 36, 140, 15, 151, 234, 1, 50, 207, 214, 254, 65, 118, 139, 195, + 110, 111, 25, 91, 242, 86, 5, 254, 85, 93, 132, 103, 218, 118, 58, 2, + 40, 175, 228, 214, 62, 68, 58, 128, 127, 217, 181, 234, 50, 180, 132, 66, + 112, 97, 212, 27, 47, 129, 33, 163, 117, 87, 140, 180, 104, 59, 76, 117, + 38, 133, 87, 122, 192, 115, 22, 41, 169, 191, 175, 75, 35, 181, 62, 13, + 23, 18, 16, 245, 147, 78, 168, 251, 141, 252, 251, 189, 251, 9, 134, 209, + 176, 99, 86, 161, 103, 21, 78, 92, 194, 142, 26, 96, 92, 135, 213, 15, + 238, 207, 30, 110, 16, 189, 16, 7, 123, 70, 115, 144, 208, 174, 228, 224, + 61, 135, 195, 125, 52, 54, 65, 196, 231, 231, 93, 169, 31, 250, 174, 16, + 225, 15, 59, 169, 216, 97, 103, 21, 140, 249, 219, 61, 173, 16, 144, 132, + 68, 203, 55, 221, 247, 226, 212, 158, 65, 221, 168, 146, 27, 194, 217, 69, + 34, 107, 194, 196, 32, 162, 33, 81, 217, 230, 139, 27, 170, 133, 29, 143, + 121, 245, 153, 246, 101, 12, 136, 29, 247, 224, 76, 169, 25, 35, 184, 58, + 166, 98, 48, 158, 34, 122, 132, 25, 176, 121, 64, 65, 94, 132, 142, 161, + 6, 217, 94, 75, 77, 212, 71, 242, 33, 19, 126, 209, 38, 232, 149, 3, + 165, 192, 173, 198, 110, 241, 60, 150, 27, 153, 245, 149, 111, 25, 136, 5, + 242, 12, 93, 145, 156, 211, 87, 241, 74, 246, 21, 49, 21, 108, 95, 93, + 238, 195, 34, 228, 43, 170, 238, 189, 138, 247, 154, 123, 15, 43, 142, 143, + 111, 23, 136, 135, 73, 151, 139, 138, 92, 84, 229, 34, 30, 39, 60, 245, + 21, 120, 3, 35, 145, 25, 141, 100, 250, 157, 41, 100, 4, 223, 251, 203, + 176, 141, 126, 23, 136, 182, 231, 104, 128, 8, 113, 3, 195, 95, 102, 252, + 119, 206, 127, 57, 125, 163, 96, 6, 112, 72, 169, 72, 148, 138, 56, 137, + 144, 25, 190, 72, 176, 194, 167, 3, 216, 96, 25, 125, 116, 239, 175, 51, + 229, 87, 127, 208, 171, 24, 21, 179, 131, 76, 19, 104, 112, 184, 148, 48, + 119, 152, 93, 118, 118, 207, 86, 178, 3, 248, 104, 6, 204, 43, 29, 223, + 173, 25, 35, 210, 123, 81, 65, 56, 60, 150, 104, 30, 45, 32, 14, 178, + 154, 17, 86, 4, 213, 205, 70, 61, 113, 43, 200, 230, 17, 40, 218, 196, + 172, 213, 107, 178, 152, 40, 61, 233, 192, 182, 210, 26, 57, 201, 187, 32, + 102, 136, 255, 81, 119, 191, 58, 84, 25, 210, 3, 78, 147, 134, 60, 139, + 216, 56, 240, 249, 5, 157, 98, 216, 165, 8, 121, 140, 68, 60, 197, 217, + 124, 26, 224, 244, 25, 225, 9, 9, 21, 153, 101, 240, 103, 158, 225, 38, + 21, 17, 60, 33, 240, 246, 184, 96, 246, 192, 17, 130, 152, 100, 13, 189, + 47, 168, 24, 35, 42, 179, 44, 138, 112, 243, 7, 248, 229, 22, 121, 72, + 78, 10, 210, 57, 254, 128, 48, 142, 10, 42, 37, 130, 62, 2, 254, 165, + 33, 225, 104, 167, 88, 215, 137, 122, 70, 100, 87, 82, 50, 170, 166, 236, + 164, 181, 180, 166, 42, 169, 148, 162, 40, 137, 180, 175, 171, 194, 246, 85, + 219, 137, 39, 99, 113, 45, 169, 165, 213, 148, 146, 138, 249, 246, 161, 152, + 74, 58, 25, 75, 167, 83, 241, 88, 42, 161, 37, 82, 233, 116, 210, 119, + 128, 161, 9, 61, 149, 74, 37, 85, 61, 169, 38, 99, 9, 184, 243, 101, + 49, 52, 174, 197, 21, 37, 174, 171, 74, 50, 169, 167, 98, 233, 184, 141, + 118, 56, 68, 184, 67, 47, 236, 161, 51, 255, 194, 108, 183, 50, 65, 34, + 108, 235, 251, 148, 131, 130, 17, 178, 218, 251, 116, 187, 181, 93, 251, 144, + 25, 16, 125, 68, 245, 13, 17, 61, 147, 44, 141, 187, 10, 92, 224, 137, + 91, 87, 133, 21, 111, 206, 206, 249, 130, 129, 125, 57, 112, 176, 27, 56, + 144, 3, 217, 144, 20, 238, 110, 51, 254, 18, 16, 34, 240, 197, 48, 115, + 147, 87, 81, 227, 137, 236, 80, 232, 122, 2, 121, 178, 148, 87, 252, 89, + 127, 185, 145, 153, 117, 9, 140, 127, 88, 121, 249, 56, 196, 241, 199, 180, + 130, 94, 195, 164, 152, 11, 9, 249, 171, 141, 180, 226, 68, 136, 109, 160, + 49, 243, 19, 18, 23, 195, 13, 12, 218, 66, 15, 14, 121, 14, 53, 11, + 109, 73, 66, 200, 140, 133, 112, 104, 55, 162, 151, 197, 5, 195, 96, 87, + 85, 223, 202, 4, 142, 212, 180, 207, 190, 225, 19, 179, 84, 134, 13, 154, + 42, 147, 235, 8, 107, 123, 5, 135, 208, 187, 198, 131, 52, 234, 14, 95, + 62, 243, 78, 230, 201, 148, 228, 76, 10, 51, 167, 192, 222, 176, 206, 96, + 67, 88, 120, 119, 155, 253, 70, 41, 161, 60, 131, 103, 26, 97, 94, 131, + 137, 180, 50, 18, 8, 70, 97, 101, 48, 96, 232, 220, 41, 138, 83, 0, + 59, 235, 249, 223, 29, 1, 142, 169, 35, 59, 255, 174, 146, 79, 29, 158, + 78, 50, 54, 40, 231, 108, 210, 117, 106, 244, 186, 166, 44, 187, 181, 56, + 150, 129, 200, 61, 201, 207, 101, 108, 143, 94, 145, 120, 247, 137, 40, 219, + 159, 151, 14, 53, 29, 102, 42, 79, 105, 152, 111, 175, 67, 83, 229, 90, + 215, 48, 194, 42, 162, 218, 114, 220, 94, 217, 160, 92, 145, 55, 27, 162, + 147, 235, 30, 185, 149, 12, 234, 40, 223, 12, 184, 79, 156, 132, 126, 174, + 184, 46, 16, 154, 100, 79, 114, 156, 68, 101, 38, 163, 67, 144, 0, 121, + 244, 95, 119, 147, 17, 60, 116, 21, 134, 67, 228, 186, 187, 196, 215, 184, + 204, 120, 250, 1, 53, 254, 138, 194, 41, 134, 157, 222, 176, 125, 122, 121, + 87, 100, 130, 99, 11, 75, 25, 218, 12, 33, 55, 194, 174, 209, 9, 48, + 144, 239, 223, 108, 187, 9, 214, 83, 116, 220, 68, 187, 180, 183, 177, 9, + 99, 156, 223, 163, 157, 116, 156, 3, 68, 190, 171, 59, 241, 109, 51, 255, + 225, 142, 186, 17, 7, 158, 131, 182, 165, 218, 146, 130, 184, 139, 90, 223, + 234, 82, 232, 19, 11, 101, 143, 209, 207, 115, 243, 137, 248, 24, 214, 201, + 166, 133, 204, 107, 118, 6, 141, 177, 197, 150, 126, 100, 52, 117, 134, 144, + 157, 188, 44, 245, 250, 32, 187, 25, 213, 42, 81, 193, 144, 22, 217, 144, + 170, 176, 49, 129, 78, 98, 217, 10, 122, 94, 22, 224, 81, 237, 194, 202, + 87, 153, 131, 24, 58, 33, 213, 110, 215, 176, 90, 198, 8, 50, 102, 126, + 220, 99, 120, 175, 86, 167, 59, 61, 51, 124, 27, 27, 4, 186, 235, 132, + 126, 120, 147, 134, 154, 121, 146, 70, 224, 168, 72, 215, 24, 48, 231, 29, + 82, 66, 247, 166, 17, 241, 196, 12, 106, 249, 218, 70, 15, 89, 202, 14, + 143, 213, 54, 62, 214, 51, 106, 152, 147, 125, 246, 13, 152, 166, 255, 37, + 197, 50, 154, 39, 228, 19, 11, 50, 86, 111, 199, 126, 146, 149, 117, 227, + 105, 164, 107, 125, 8, 27, 124, 183, 35, 20, 238, 69, 175, 175, 217, 46, + 225, 183, 167, 122, 198, 22, 189, 131, 147, 52, 237, 25, 188, 1, 170, 228, + 189, 87, 208, 176, 0, 118, 91, 66, 206, 106, 194, 241, 49, 95, 117, 218, + 111, 52, 70, 168, 248, 95, 213, 110, 216, 118, 59, 159, 89, 83, 200, 146, + 49, 148, 28, 0, 3, 8, 178, 8, 164, 45, 202, 220, 109, 63, 195, 149, + 181, 179, 93, 209, 133, 168, 168, 208, 96, 128, 156, 196, 4, 204, 10, 231, + 68, 95, 85, 111, 172, 45, 167, 179, 108, 127, 161, 124, 171, 168, 19, 104, + 254, 132, 71, 186, 157, 250, 76, 99, 217, 50, 146, 192, 247, 8, 119, 104, + 98, 62, 159, 252, 174, 229, 185, 171, 209, 29, 110, 55, 151, 85, 11, 206, + 129, 44, 55, 17, 238, 212, 39, 48, 169, 238, 49, 86, 118, 26, 93, 194, + 37, 30, 35, 125, 242, 105, 187, 105, 125, 102, 226, 2, 211, 50, 35, 93, + 34, 130, 95, 62, 175, 203, 75, 9, 120, 230, 227, 158, 213, 153, 211, 201, + 191, 187, 193, 245, 156, 35, 57, 73, 11, 233, 238, 72, 251, 124, 15, 32, + 109, 177, 178, 175, 67, 80, 4, 217, 150, 61, 85, 182, 120, 65, 62, 55, + 95, 102, 173, 147, 209, 226, 4, 62, 199, 222, 204, 40, 191, 243, 175, 142, + 229, 243, 153, 247, 185, 123, 254, 45, 37, 98, 14, 156, 2, 220, 247, 25, + 250, 27, 126, 109, 8, 161, 168, 47, 247, 206, 139, 133, 115, 234, 87, 250, + 103, 109, 207, 168, 135, 178, 115, 214, 182, 190, 151, 24, 156, 152, 35, 244, + 241, 173, 92, 176, 101, 16, 2, 25, 126, 226, 248, 182, 35, 21, 134, 254, + 235, 253, 185, 185, 95, 126, 189, 27, 4, 5, 140, 42, 244, 9, 54, 50, + 116, 173, 111, 169, 213, 249, 241, 188, 42, 2, 122, 43, 191, 179, 141, 18, + 29, 216, 175, 124, 253, 158, 38, 94, 215, 178, 174, 236, 142, 174, 75, 212, + 165, 216, 10, 172, 5, 159, 72, 137, 240, 140, 94, 24, 76, 227, 13, 223, + 37, 31, 120, 171, 231, 28, 78, 156, 174, 105, 45, 63, 214, 196, 199, 32, + 107, 172, 158, 103, 172, 154, 115, 100, 208, 72, 208, 221, 243, 188, 163, 223, + 154, 46, 15, 249, 233, 55, 8, 168, 19, 202, 72, 147, 136, 120, 59, 160, + 211, 246, 80, 40, 3, 236, 15, 133, 44, 125, 38, 42, 101, 187, 31, 146, + 9, 226, 56, 202, 22, 244, 54, 29, 220, 11, 239, 200, 1, 179, 27, 14, + 6, 204, 124, 4, 46, 92, 187, 2, 70, 237, 237, 137, 107, 204, 150, 227, + 114, 227, 2, 196, 117, 157, 100, 222, 137, 220, 57, 66, 12, 208, 31, 62, + 247, 123, 125, 103, 16, 57, 174, 75, 235, 114, 195, 34, 30, 66, 80, 13, + 11, 175, 147, 175, 42, 58, 223, 53, 216, 158, 101, 47, 67, 193, 127, 252, + 97, 254, 200, 80, 52, 132, 241, 49, 51, 252, 58, 224, 228, 21, 81, 9, + 149, 45, 104, 242, 100, 182, 221, 71, 209, 160, 152, 126, 40, 68, 155, 32, + 31, 233, 166, 170, 157, 222, 24, 150, 68, 33, 29, 153, 42, 62, 220, 243, + 132, 145, 139, 42, 11, 215, 150, 194, 55, 79, 236, 47, 213, 49, 170, 31, + 189, 211, 59, 153, 52, 186, 252, 176, 162, 252, 15, 159, 143, 51, 165, 172, + 157, 80, 40, 61, 144, 96, 39, 95, 157, 241, 127, 62, 147, 122, 11, 163, + 240, 201, 213, 251, 77, 127, 113, 98, 229, 213, 197, 19, 13, 215, 216, 72, + 97, 22, 141, 158, 9, 87, 152, 108, 87, 219, 202, 5, 242, 135, 247, 60, + 80, 254, 182, 239, 213, 239, 76, 67, 194, 38, 0, 36, 242, 101, 150, 83, + 126, 183, 30, 146, 95, 246, 251, 87, 230, 6, 127, 224, 253, 195, 191, 169, + 9, 55, 77, 14, 48, 23, 184, 241, 112, 122, 32, 63, 15, 158, 74, 93, + 34, 21, 141, 112, 52, 18, 165, 111, 25, 205, 174, 208, 232, 202, 235, 56, + 231, 214, 149, 70, 30, 34, 206, 253, 59, 43, 139, 167, 248, 68, 137, 233, + 165, 204, 100, 204, 60, 255, 33, 121, 192, 53, 0, 252, 207, 173, 31, 235, + 219, 235, 139, 11, 1, 29, 71, 56, 175, 121, 218, 106, 77, 51, 173, 177, + 211, 19, 71, 192, 70, 39, 33, 97, 162, 19, 200, 8, 86, 108, 187, 96, + 206, 164, 41, 211, 38, 36, 224, 245, 94, 111, 226, 133, 179, 172, 253, 130, + 61, 31, 179, 118, 89, 111, 235, 37, 198, 231, 115, 114, 68, 10, 176, 44, + 164, 109, 100, 0, 112, 166, 65, 54, 25, 147, 109, 21, 75, 50, 194, 227, + 33, 202, 71, 149, 65, 246, 187, 211, 233, 7, 243, 65, 247, 77, 81, 23, + 35, 181, 72, 171, 99, 115, 30, 56, 171, 212, 208, 89, 158, 8, 219, 95, + 97, 140, 131, 33, 105, 64, 103, 169, 59, 204, 114, 139, 59, 179, 239, 248, + 28, 186, 3, 221, 227, 134, 31, 99, 2, 53, 121, 244, 59, 62, 3, 59, + 107, 216, 2, 162, 58, 255, 27, 242, 33, 25, 251, 174, 74, 119, 60, 67, + 73, 99, 52, 11, 24, 73, 204, 150, 243, 6, 172, 146, 11, 68, 24, 125, + 128, 204, 109, 223, 5, 6, 129, 247, 192, 116, 59, 208, 218, 38, 136, 127, + 167, 69, 214, 83, 4, 176, 211, 15, 84, 36, 201, 129, 22, 18, 2, 8, + 171, 3, 50, 129, 175, 247, 236, 106, 245, 198, 77, 23, 25, 197, 133, 69, + 129, 43, 219, 247, 134, 230, 229, 151, 73, 111, 4, 243, 209, 39, 70, 187, + 44, 37, 119, 183, 19, 68, 24, 12, 67, 30, 180, 122, 161, 95, 91, 26, + 24, 156, 68, 92, 37, 184, 102, 142, 20, 193, 208, 84, 216, 199, 185, 182, + 92, 27, 125, 165, 200, 75, 80, 221, 137, 179, 242, 57, 34, 54, 110, 104, + 241, 17, 243, 25, 66, 207, 139, 90, 141, 27, 228, 118, 122, 77, 188, 242, + 217, 77, 35, 232, 205, 161, 80, 43, 184, 79, 174, 119, 168, 186, 250, 245, + 51, 8, 144, 229, 166, 17, 167, 121, 209, 234, 86, 151, 241, 139, 167, 63, + 189, 241, 232, 195, 239, 130, 224, 210, 193, 55, 171, 42, 76, 3, 252, 0, + 15, 183, 225, 174, 85, 241, 198, 185, 1, 122, 128, 196, 40, 66, 214, 153, + 254, 165, 133, 91, 232, 25, 174, 125, 248, 154, 194, 103, 18, 84, 118, 109, + 119, 11, 26, 196, 246, 232, 103, 104, 15, 50, 131, 122, 224, 163, 25, 49, + 39, 232, 92, 27, 157, 84, 233, 104, 219, 231, 217, 149, 210, 233, 26, 122, + 26, 176, 83, 63, 10, 211, 120, 12, 209, 15, 35, 252, 131, 72, 76, 32, + 141, 190, 41, 0, 195, 18, 119, 13, 33, 77, 104, 8, 103, 228, 227, 52, + 226, 1, 86, 143, 15, 60, 92, 148, 222, 161, 203, 96, 26, 139, 226, 243, + 185, 125, 124, 55, 147, 112, 126, 232, 78, 32, 255, 103, 108, 7, 194, 251, + 208, 165, 6, 126, 206, 196, 28, 62, 151, 68, 81, 11, 113, 14, 84, 238, + 130, 35, 43, 155, 62, 16, 115, 163, 34, 194, 6, 242, 255, 154, 66, 130, + 52, 138, 63, 85, 73, 152, 159, 40, 20, 62, 205, 207, 133, 38, 254, 74, + 62, 206, 74, 66, 8, 12, 223, 162, 90, 136, 161, 39, 128, 188, 16, 86, + 63, 158, 125, 92, 173, 224, 209, 42, 120, 148, 10, 75, 58, 5, 111, 31, + 75, 14, 226, 211, 74, 99, 14, 123, 253, 86, 15, 169, 156, 189, 178, 168, + 96, 80, 106, 213, 136, 6, 196, 142, 183, 218, 148, 232, 251, 105, 120, 0, + 254, 80, 105, 218, 228, 83, 236, 38, 237, 152, 187, 64, 38, 98, 91, 155, + 221, 137, 53, 33, 235, 132, 232, 30, 40, 197, 189, 208, 135, 98, 77, 28, + 239, 252, 68, 76, 164, 120, 242, 212, 4, 207, 58, 135, 172, 115, 88, 53, + 214, 174, 239, 236, 44, 198, 88, 117, 7, 92, 253, 204, 97, 133, 50, 17, + 127, 209, 170, 235, 53, 58, 149, 8, 236, 109, 107, 241, 56, 236, 48, 84, + 216, 84, 112, 145, 143, 14, 77, 164, 48, 196, 248, 11, 228, 223, 106, 175, + 131, 11, 135, 106, 251, 131, 125, 178, 142, 32, 181, 208, 82, 223, 145, 133, + 5, 246, 219, 47, 120, 118, 208, 30, 227, 66, 163, 153, 122, 163, 179, 212, + 5, 37, 252, 239, 187, 250, 8, 71, 163, 124, 67, 177, 206, 57, 131, 173, + 33, 66, 177, 54, 173, 28, 110, 147, 187, 26, 203, 4, 206, 184, 84, 220, + 101, 191, 67, 232, 94, 209, 65, 104, 131, 210, 84, 116, 199, 234, 145, 2, + 212, 77, 59, 197, 83, 198, 7, 118, 138, 107, 192, 76, 29, 79, 217, 191, + 231, 98, 243, 73, 99, 175, 115, 172, 9, 186, 110, 37, 161, 47, 123, 217, + 80, 17, 191, 230, 102, 67, 81, 55, 250, 216, 124, 230, 98, 35, 180, 195, + 207, 157, 101, 88, 173, 127, 230, 34, 99, 187, 241, 211, 153, 227, 63, 235, + 36, 227, 24, 162, 45, 208, 128, 133, 253, 199, 40, 177, 223, 91, 244, 183, + 134, 98, 46, 213, 105, 135, 123, 205, 16, 83, 149, 75, 157, 45, 196, 227, + 172, 56, 118, 82, 194, 243, 181, 41, 8, 207, 81, 73, 242, 45, 67, 136, + 84, 219, 162, 38, 242, 157, 249, 230, 16, 98, 225, 30, 62, 181, 247, 149, + 59, 100, 163, 177, 226, 106, 204, 187, 11, 150, 227, 23, 7, 90, 79, 192, + 204, 19, 136, 25, 175, 217, 225, 5, 25, 66, 216, 144, 36, 240, 26, 180, + 115, 71, 216, 187, 225, 227, 14, 71, 66, 67, 56, 230, 154, 100, 219, 245, + 183, 122, 61, 66, 14, 110, 194, 70, 217, 98, 30, 183, 56, 78, 191, 236, + 61, 41, 160, 211, 169, 137, 141, 36, 127, 176, 134, 134, 221, 202, 168, 9, + 159, 88, 179, 21, 60, 115, 53, 225, 0, 154, 103, 84, 17, 251, 237, 23, + 171, 186, 82, 73, 78, 247, 39, 111, 178, 223, 10, 179, 5, 201, 134, 8, + 201, 100, 56, 234, 135, 167, 79, 76, 235, 111, 245, 137, 105, 253, 47, 246, + 137, 83, 25, 236, 19, 161, 102, 255, 86, 159, 124, 86, 213, 95, 239, 19, + 152, 45, 107, 63, 237, 18, 204, 240, 133, 78, 240, 184, 163, 14, 78, 217, + 115, 251, 98, 97, 95, 144, 199, 14, 61, 178, 47, 22, 246, 197, 79, 28, + 144, 87, 164, 83, 187, 150, 148, 169, 125, 60, 63, 154, 246, 108, 61, 131, + 136, 160, 209, 7, 1, 197, 34, 92, 116, 148, 82, 254, 198, 100, 188, 118, + 231, 229, 217, 167, 33, 112, 7, 247, 120, 140, 6, 97, 182, 9, 121, 90, + 133, 237, 194, 150, 253, 227, 4, 105, 157, 67, 59, 108, 211, 175, 150, 82, + 36, 38, 41, 209, 45, 3, 213, 114, 142, 183, 225, 189, 222, 192, 183, 212, + 230, 226, 18, 225, 197, 161, 214, 197, 69, 35, 185, 206, 195, 114, 109, 75, + 242, 86, 116, 221, 237, 104, 117, 112, 93, 238, 216, 225, 134, 216, 174, 142, + 192, 231, 46, 33, 129, 36, 46, 30, 180, 138, 252, 220, 205, 210, 217, 207, + 69, 36, 210, 167, 135, 225, 39, 31, 133, 150, 250, 16, 108, 113, 50, 168, + 65, 126, 143, 69, 18, 31, 34, 118, 4, 57, 255, 147, 210, 38, 41, 199, + 100, 29, 164, 195, 246, 142, 111, 246, 169, 170, 8, 181, 225, 104, 186, 207, + 21, 69, 243, 205, 145, 25, 78, 48, 217, 226, 115, 164, 251, 197, 230, 200, + 12, 230, 158, 28, 244, 56, 198, 125, 48, 48, 219, 13, 204, 119, 3, 139, + 16, 50, 72, 246, 177, 142, 38, 132, 201, 129, 185, 12, 97, 204, 246, 172, + 255, 135, 42, 205, 34, 48, 131, 49, 126, 204, 254, 31, 154, 52, 11, 103, + 84, 78, 83, 0, 247, 49, 105, 46, 62, 78, 73, 115, 207, 99, 144, 179, + 22, 226, 115, 29, 214, 70, 30, 65, 200, 158, 145, 79, 6, 250, 4, 10, + 192, 118, 162, 210, 108, 211, 182, 176, 75, 58, 192, 245, 7, 161, 249, 210, + 145, 20, 204, 215, 13, 43, 82, 98, 230, 4, 210, 17, 250, 140, 193, 144, + 55, 70, 3, 115, 230, 26, 203, 124, 137, 232, 148, 57, 245, 235, 10, 191, + 66, 185, 93, 143, 139, 55, 41, 196, 58, 218, 177, 229, 80, 199, 71, 159, + 163, 128, 66, 114, 108, 190, 181, 21, 60, 236, 206, 209, 242, 176, 219, 26, + 72, 106, 248, 208, 33, 130, 127, 153, 169, 242, 203, 28, 254, 45, 16, 43, + 121, 7, 238, 11, 112, 15, 255, 22, 5, 215, 32, 136, 121, 254, 75, 133, + 176, 234, 228, 70, 59, 156, 149, 205, 175, 179, 31, 69, 248, 95, 215, 147, + 214, 158, 149, 55, 212, 220, 78, 51, 17, 147, 19, 100, 83, 22, 215, 101, + 85, 67, 64, 67, 53, 21, 147, 53, 226, 223, 210, 212, 36, 132, 37, 240, + 42, 25, 151, 245, 20, 108, 228, 221, 138, 123, 87, 9, 213, 195, 66, 194, + 3, 53, 27, 121, 80, 12, 212, 109, 52, 88, 1, 217, 213, 174, 44, 105, + 116, 102, 1, 221, 91, 99, 247, 92, 127, 36, 44, 54, 136, 32, 27, 65, + 125, 10, 124, 206, 206, 53, 42, 8, 117, 16, 202, 108, 237, 160, 200, 241, + 62, 95, 84, 103, 82, 1, 213, 156, 190, 83, 6, 240, 193, 148, 54, 168, + 22, 189, 207, 56, 251, 241, 192, 41, 67, 35, 197, 164, 222, 3, 247, 219, + 129, 83, 219, 51, 85, 33, 114, 249, 123, 153, 98, 160, 58, 133, 92, 92, + 16, 125, 21, 37, 192, 237, 0, 121, 33, 108, 35, 71, 163, 61, 113, 33, + 130, 80, 228, 157, 53, 16, 65, 139, 16, 16, 41, 15, 209, 156, 144, 5, + 15, 209, 41, 196, 181, 152, 198, 252, 104, 7, 169, 185, 232, 209, 30, 216, + 18, 52, 227, 35, 111, 110, 190, 187, 228, 251, 210, 157, 101, 227, 6, 180, + 139, 131, 98, 195, 15, 124, 251, 247, 200, 55, 20, 65, 178, 91, 245, 227, + 121, 245, 219, 19, 49, 38, 159, 216, 0, 230, 166, 112, 226, 80, 71, 163, + 102, 207, 96, 119, 3, 216, 112, 199, 251, 85, 22, 48, 8, 97, 120, 236, + 34, 20, 116, 191, 110, 225, 110, 143, 187, 196, 50, 211, 230, 151, 97, 21, + 54, 20, 191, 96, 55, 7, 209, 97, 173, 130, 221, 70, 13, 33, 0, 105, + 131, 183, 97, 42, 96, 102, 115, 206, 135, 194, 234, 74, 143, 248, 185, 144, + 147, 248, 87, 192, 162, 87, 93, 53, 152, 73, 17, 237, 126, 86, 138, 132, + 82, 221, 144, 249, 84, 240, 129, 44, 5, 251, 242, 91, 200, 126, 151, 152, + 204, 108, 220, 76, 144, 138, 60, 142, 27, 107, 203, 188, 67, 118, 120, 158, + 70, 83, 185, 41, 222, 168, 101, 14, 106, 246, 97, 60, 148, 125, 216, 19, + 242, 119, 11, 39, 214, 216, 169, 41, 165, 68, 235, 44, 29, 58, 177, 12, + 141, 161, 52, 173, 119, 58, 94, 19, 192, 213, 62, 36, 91, 15, 236, 95, + 169, 84, 58, 100, 6, 231, 22, 63, 178, 163, 53, 154, 37, 214, 171, 86, + 199, 3, 108, 152, 225, 151, 210, 251, 225, 38, 103, 90, 141, 136, 144, 36, + 178, 205, 58, 123, 127, 71, 132, 224, 19, 8, 51, 48, 31, 98, 157, 13, + 75, 218, 138, 172, 73, 253, 19, 173, 135, 56, 194, 51, 194, 240, 119, 161, + 185, 105, 176, 51, 140, 61, 47, 73, 155, 109, 154, 200, 135, 59, 187, 95, + 205, 157, 169, 83, 60, 221, 103, 171, 81, 104, 188, 163, 109, 98, 173, 222, + 64, 126, 184, 77, 230, 137, 220, 78, 254, 79, 46, 182, 225, 102, 203, 254, + 132, 109, 27, 95, 157, 251, 108, 216, 56, 52, 178, 173, 77, 233, 119, 122, + 35, 141, 170, 187, 234, 118, 206, 69, 120, 239, 162, 163, 29, 74, 236, 116, + 23, 223, 92, 193, 31, 35, 122, 82, 248, 63, 30, 233, 207, 247, 224, 110, + 27, 143, 161, 170, 189, 97, 112, 6, 194, 84, 88, 219, 30, 19, 174, 181, + 18, 218, 130, 5, 200, 201, 218, 133, 160, 90, 177, 212, 241, 9, 177, 190, + 251, 86, 80, 27, 196, 34, 122, 74, 182, 214, 55, 7, 177, 192, 246, 50, + 156, 206, 220, 43, 255, 5, 113, 39, 79, 170, 121, 20, 116, 21, 108, 177, + 109, 225, 60, 241, 157, 16, 172, 81, 1, 238, 78, 151, 6, 66, 50, 47, + 77, 158, 130, 6, 28, 117, 121, 104, 87, 155, 145, 222, 165, 72, 57, 19, + 41, 71, 56, 159, 9, 204, 103, 74, 166, 98, 90, 232, 226, 130, 38, 141, + 194, 89, 53, 218, 48, 50, 61, 21, 154, 43, 14, 236, 90, 86, 123, 100, + 154, 105, 160, 66, 20, 38, 66, 6, 31, 236, 10, 25, 182, 124, 177, 172, + 231, 53, 108, 26, 120, 118, 70, 44, 164, 66, 22, 114, 134, 29, 78, 197, + 53, 81, 239, 171, 30, 70, 29, 51, 38, 94, 66, 26, 102, 78, 202, 65, + 120, 86, 179, 105, 22, 73, 97, 14, 91, 55, 36, 162, 95, 91, 86, 143, + 239, 20, 19, 233, 169, 167, 80, 5, 107, 17, 252, 139, 88, 4, 209, 228, + 137, 124, 228, 86, 138, 109, 155, 134, 26, 82, 97, 150, 159, 169, 32, 68, + 193, 5, 252, 204, 242, 88, 102, 117, 86, 160, 75, 62, 147, 115, 111, 182, + 2, 77, 30, 94, 195, 100, 86, 22, 217, 157, 230, 225, 107, 203, 187, 103, + 201, 98, 150, 222, 169, 41, 191, 181, 167, 179, 169, 85, 143, 140, 122, 145, + 188, 168, 223, 130, 182, 102, 249, 4, 243, 17, 61, 20, 169, 153, 221, 186, + 133, 54, 202, 70, 135, 123, 239, 192, 112, 99, 83, 41, 57, 75, 57, 233, + 22, 17, 140, 160, 78, 204, 196, 156, 214, 64, 118, 104, 13, 56, 109, 92, + 159, 78, 231, 6, 216, 230, 29, 58, 160, 183, 129, 30, 112, 247, 204, 23, + 14, 152, 33, 32, 39, 166, 97, 115, 121, 95, 36, 41, 130, 5, 231, 134, + 221, 156, 70, 143, 94, 91, 225, 161, 196, 56, 12, 228, 209, 187, 212, 32, + 208, 227, 206, 134, 4, 11, 123, 98, 146, 155, 222, 198, 188, 10, 27, 147, + 248, 241, 213, 36, 160, 253, 186, 61, 88, 26, 133, 164, 138, 108, 80, 209, + 162, 34, 142, 19, 198, 23, 138, 90, 208, 122, 147, 125, 89, 208, 254, 184, + 17, 196, 131, 29, 92, 7, 220, 212, 131, 203, 141, 46, 243, 6, 119, 69, + 12, 91, 157, 138, 243, 202, 232, 83, 200, 34, 34, 140, 178, 167, 111, 212, + 114, 177, 211, 86, 188, 226, 107, 8, 94, 178, 37, 195, 187, 179, 135, 169, + 78, 225, 28, 182, 18, 211, 109, 135, 133, 185, 68, 225, 135, 37, 52, 51, + 234, 159, 190, 134, 115, 20, 206, 86, 186, 203, 135, 43, 98, 247, 161, 123, + 196, 230, 132, 61, 211, 151, 232, 209, 244, 241, 35, 163, 111, 102, 23, 220, + 192, 245, 153, 237, 145, 183, 135, 67, 17, 53, 234, 137, 159, 251, 144, 148, + 62, 246, 118, 93, 11, 7, 73, 125, 128, 230, 19, 17, 184, 252, 161, 132, + 228, 247, 8, 8, 214, 246, 172, 41, 179, 249, 72, 118, 103, 75, 153, 102, + 74, 144, 85, 96, 119, 223, 237, 213, 234, 92, 1, 224, 124, 120, 8, 11, + 11, 91, 137, 217, 231, 0, 176, 184, 103, 85, 191, 101, 200, 206, 206, 143, + 74, 228, 127, 253, 75, 10, 78, 247, 200, 143, 176, 197, 126, 134, 123, 106, + 8, 106, 69, 200, 36, 168, 183, 224, 116, 164, 202, 22, 78, 84, 208, 247, + 38, 206, 158, 174, 115, 174, 31, 154, 127, 246, 222, 130, 127, 53, 248, 55, + 252, 240, 239, 72, 165, 86, 111, 76, 126, 28, 159, 77, 92, 59, 126, 190, + 167, 246, 47, 101, 159, 65, 23, 178, 129, 228, 24, 52, 160, 191, 76, 132, + 239, 183, 253, 83, 120, 234, 45, 43, 198, 125, 231, 199, 201, 104, 184, 17, + 177, 247, 234, 195, 31, 186, 199, 53, 86, 178, 131, 99, 110, 218, 104, 59, + 33, 208, 36, 64, 12, 164, 147, 81, 224, 163, 229, 160, 60, 240, 153, 190, + 204, 50, 239, 223, 2, 218, 159, 200, 128, 240, 29, 54, 61, 24, 5, 79, + 129, 197, 40, 115, 140, 162, 243, 40, 58, 139, 66, 12, 5, 110, 148, 5, + 70, 137, 241, 40, 177, 15, 198, 24, 132, 251, 30, 95, 128, 50, 145, 233, + 103, 206, 126, 22, 242, 59, 118, 147, 246, 231, 48, 162, 127, 231, 78, 115, + 48, 72, 152, 231, 232, 222, 29, 122, 111, 238, 74, 69, 248, 185, 123, 2, + 185, 225, 121, 87, 202, 210, 181, 46, 19, 36, 252, 93, 8, 230, 28, 12, + 205, 145, 71, 103, 49, 4, 15, 209, 28, 81, 13, 109, 59, 33, 17, 72, + 112, 59, 187, 43, 221, 249, 185, 38, 67, 69, 122, 204, 191, 159, 254, 82, + 82, 234, 223, 78, 42, 236, 166, 53, 172, 251, 68, 223, 225, 14, 247, 29, + 254, 59, 197, 11, 135, 59, 148, 40, 242, 164, 97, 186, 106, 130, 15, 152, + 48, 244, 22, 203, 196, 199, 114, 41, 48, 58, 74, 90, 197, 51, 220, 172, + 106, 24, 84, 16, 231, 62, 247, 45, 131, 193, 127, 50, 207, 229, 2, 131, + 201, 127, 146, 136, 95, 82, 206, 73, 207, 187, 190, 194, 94, 102, 138, 153, + 134, 254, 228, 232, 252, 24, 17, 29, 97, 88, 40, 229, 57, 196, 48, 132, + 241, 135, 249, 41, 40, 68, 43, 136, 79, 49, 55, 42, 109, 123, 71, 218, + 160, 53, 234, 15, 45, 4, 28, 69, 43, 214, 23, 175, 72, 107, 235, 142, + 138, 165, 194, 181, 20, 44, 214, 141, 182, 84, 50, 155, 176, 96, 226, 42, + 94, 32, 21, 208, 53, 74, 227, 95, 87, 34, 173, 248, 135, 216, 121, 102, + 96, 174, 221, 164, 179, 253, 154, 178, 73, 152, 179, 169, 70, 120, 1, 211, + 23, 122, 26, 189, 192, 206, 71, 2, 153, 152, 85, 148, 212, 170, 52, 63, + 127, 16, 175, 131, 57, 4, 17, 39, 136, 240, 167, 33, 215, 179, 81, 180, + 148, 243, 7, 190, 205, 2, 223, 252, 118, 37, 65, 114, 160, 6, 97, 203, + 151, 236, 209, 181, 176, 185, 148, 14, 88, 198, 93, 110, 231, 199, 60, 76, + 135, 184, 117, 109, 170, 10, 12, 169, 119, 186, 8, 162, 242, 231, 47, 52, + 96, 243, 250, 84, 254, 205, 156, 9, 136, 2, 214, 4, 70, 251, 231, 131, + 25, 91, 212, 120, 32, 27, 23, 51, 187, 116, 24, 176, 160, 68, 108, 193, + 25, 190, 13, 118, 236, 178, 193, 0, 198, 62, 9, 154, 52, 50, 103, 207, + 50, 187, 152, 63, 195, 206, 3, 245, 35, 72, 48, 134, 176, 19, 17, 136, + 12, 67, 233, 9, 139, 99, 27, 96, 14, 235, 77, 244, 107, 120, 17, 33, + 75, 93, 172, 253, 85, 212, 118, 55, 30, 127, 147, 35, 7, 252, 210, 241, + 186, 3, 200, 174, 109, 218, 229, 173, 148, 74, 243, 173, 43, 169, 176, 108, + 107, 222, 245, 248, 103, 165, 245, 90, 70, 34, 9, 164, 8, 163, 190, 134, + 44, 222, 199, 140, 205, 187, 31, 190, 48, 30, 114, 6, 208, 42, 124, 233, + 100, 130, 145, 255, 154, 63, 2, 180, 58, 153, 63, 94, 131, 76, 81, 136, + 87, 17, 247, 18, 169, 98, 220, 107, 254, 32, 88, 251, 145, 81, 255, 84, + 191, 179, 64, 111, 20, 138, 4, 171, 242, 182, 109, 215, 180, 189, 4, 137, + 96, 159, 170, 70, 156, 146, 173, 50, 153, 33, 213, 143, 86, 25, 119, 145, + 151, 224, 5, 42, 218, 235, 140, 57, 238, 186, 172, 252, 200, 188, 48, 212, + 246, 23, 99, 210, 164, 41, 5, 126, 201, 149, 159, 36, 38, 210, 84, 121, + 220, 42, 87, 53, 82, 152, 50, 234, 124, 104, 116, 243, 237, 20, 229, 249, + 117, 203, 11, 24, 25, 110, 185, 108, 99, 110, 111, 185, 50, 202, 78, 50, + 206, 120, 75, 59, 182, 70, 129, 123, 174, 187, 142, 147, 176, 190, 111, 33, + 142, 175, 80, 225, 149, 67, 62, 52, 196, 118, 78, 249, 92, 46, 105, 72, + 221, 145, 241, 136, 56, 134, 52, 185, 56, 211, 136, 220, 94, 204, 82, 219, + 59, 222, 190, 214, 16, 75, 38, 217, 54, 37, 151, 74, 148, 92, 110, 229, + 33, 196, 37, 231, 250, 63, 127, 99, 220, 233, 72, 238, 83, 120, 68, 84, + 93, 50, 210, 222, 161, 1, 44, 199, 244, 39, 102, 0, 187, 97, 164, 128, + 238, 35, 213, 159, 192, 82, 26, 243, 18, 68, 112, 150, 46, 60, 82, 219, + 131, 137, 22, 150, 162, 204, 251, 211, 84, 110, 61, 127, 248, 4, 47, 190, + 48, 166, 68, 3, 123, 29, 98, 69, 208, 220, 163, 177, 253, 199, 31, 120, + 1, 163, 148, 68, 74, 188, 166, 65, 203, 130, 113, 52, 187, 15, 200, 212, + 192, 126, 97, 249, 137, 251, 128, 13, 121, 115, 248, 194, 22, 201, 90, 70, + 97, 114, 16, 99, 244, 182, 233, 141, 247, 160, 237, 6, 3, 173, 70, 118, + 10, 42, 41, 143, 155, 120, 130, 129, 234, 64, 11, 17, 98, 56, 134, 8, + 186, 72, 147, 173, 48, 10, 88, 161, 15, 73, 72, 151, 44, 250, 176, 130, + 138, 180, 51, 211, 124, 228, 89, 238, 223, 70, 144, 13, 83, 246, 13, 136, + 224, 233, 55, 69, 134, 101, 30, 161, 55, 240, 190, 209, 129, 221, 87, 112, + 0, 183, 3, 68, 210, 24, 252, 165, 137, 12, 55, 230, 128, 24, 110, 240, + 135, 24, 110, 30, 32, 144, 200, 107, 118, 5, 178, 27, 124, 218, 183, 35, + 245, 101, 95, 25, 2, 137, 231, 102, 151, 154, 30, 238, 8, 209, 9, 149, + 165, 12, 239, 3, 67, 127, 12, 100, 88, 117, 234, 19, 120, 74, 186, 252, + 1, 242, 4, 225, 131, 191, 24, 57, 246, 111, 154, 92, 150, 31, 80, 222, + 161, 197, 192, 190, 151, 241, 29, 158, 12, 12, 106, 60, 127, 14, 254, 166, + 179, 168, 32, 110, 225, 211, 93, 40, 5, 4, 198, 40, 144, 243, 249, 248, + 28, 204, 15, 134, 217, 160, 74, 249, 12, 218, 110, 162, 117, 7, 164, 143, + 237, 26, 117, 0, 241, 241, 204, 40, 144, 151, 94, 5, 27, 48, 132, 36, + 231, 244, 74, 93, 91, 157, 79, 18, 13, 165, 231, 182, 63, 89, 109, 98, + 129, 159, 176, 107, 158, 163, 52, 2, 241, 64, 66, 194, 123, 146, 138, 226, + 100, 200, 77, 167, 146, 156, 233, 150, 210, 136, 73, 204, 15, 8, 164, 219, + 191, 148, 191, 84, 58, 14, 177, 237, 209, 190, 49, 28, 116, 76, 28, 47, + 216, 87, 192, 152, 169, 98, 178, 178, 195, 33, 94, 144, 28, 20, 45, 118, + 237, 242, 179, 242, 137, 179, 102, 27, 57, 223, 123, 136, 121, 177, 14, 189, + 50, 243, 9, 65, 195, 138, 60, 230, 164, 5, 2, 129, 56, 47, 216, 100, + 141, 206, 55, 231, 90, 99, 26, 204, 190, 136, 72, 113, 81, 199, 238, 12, + 234, 141, 19, 232, 207, 201, 31, 40, 207, 151, 234, 184, 111, 162, 15, 45, + 124, 223, 78, 185, 96, 10, 112, 171, 203, 103, 204, 111, 246, 236, 167, 18, + 239, 50, 126, 169, 238, 140, 137, 120, 31, 33, 65, 26, 195, 115, 177, 74, + 53, 3, 159, 36, 245, 59, 92, 170, 18, 137, 55, 212, 109, 75, 103, 225, + 107, 154, 195, 35, 142, 225, 220, 200, 60, 97, 252, 129, 74, 213, 47, 59, + 205, 44, 243, 38, 134, 25, 112, 45, 181, 198, 215, 104, 17, 96, 92, 225, + 38, 64, 115, 47, 60, 94, 199, 138, 239, 255, 171, 25, 175, 65, 176, 254, + 123, 80, 125, 60, 137, 105, 189, 116, 204, 202, 199, 106, 65, 168, 77, 224, + 155, 38, 209, 225, 27, 19, 47, 32, 209, 111, 36, 114, 176, 11, 38, 90, + 216, 215, 144, 246, 159, 240, 46, 8, 213, 195, 58, 204, 29, 191, 169, 50, + 129, 46, 225, 23, 190, 11, 171, 24, 140, 31, 201, 147, 227, 42, 62, 145, + 157, 37, 126, 185, 221, 222, 196, 168, 116, 234, 180, 1, 98, 6, 159, 28, + 75, 137, 255, 95, 89, 249, 21, 159, 137, 255, 119, 159, 173, 127, 223, 247, + 243, 4, 212, 165, 68, 126, 229, 255, 190, 229, 220, 221, 95, 183, 36, 159, + 39, 241, 89, 13, 124, 255, 68, 19, 108, 126, 223, 247, 213, 38, 248, 213, + 38, 92, 106, 251, 213, 18, 136, 225, 56, 153, 194, 238, 183, 214, 27, 117, + 105, 64, 168, 90, 10, 79, 217, 117, 13, 191, 44, 69, 78, 201, 49, 4, + 56, 193, 40, 246, 216, 129, 169, 140, 190, 37, 102, 39, 17, 116, 131, 101, + 111, 20, 5, 246, 212, 240, 131, 227, 150, 109, 148, 145, 99, 145, 86, 81, + 11, 159, 202, 146, 245, 163, 128, 43, 168, 37, 251, 102, 140, 138, 241, 55, + 44, 150, 133, 69, 133, 152, 243, 165, 48, 98, 104, 228, 156, 141, 184, 164, + 87, 229, 121, 53, 132, 95, 116, 149, 8, 26, 191, 209, 186, 200, 66, 67, + 127, 6, 125, 51, 92, 170, 33, 93, 36, 227, 147, 230, 120, 51, 103, 55, + 190, 153, 197, 158, 132, 233, 137, 197, 158, 224, 13, 76, 61, 141, 32, 178, + 110, 80, 250, 125, 121, 222, 71, 32, 198, 144, 124, 135, 108, 145, 6, 170, + 48, 160, 149, 130, 216, 82, 242, 221, 30, 22, 81, 252, 154, 158, 32, 198, + 51, 228, 43, 20, 142, 181, 193, 114, 179, 221, 61, 233, 207, 25, 216, 45, + 4, 197, 15, 90, 131, 15, 26, 50, 172, 210, 39, 109, 103, 79, 41, 160, + 116, 112, 247, 20, 95, 255, 138, 229, 121, 197, 242, 188, 162, 174, 127, 5, + 74, 214, 119, 95, 193, 59, 247, 149, 228, 198, 87, 44, 207, 43, 150, 253, + 74, 232, 251, 186, 200, 85, 79, 100, 167, 72, 36, 148, 216, 74, 19, 28, + 120, 45, 120, 3, 245, 42, 26, 245, 119, 181, 215, 159, 163, 220, 163, 134, + 100, 147, 30, 104, 219, 20, 1, 219, 249, 9, 146, 166, 27, 34, 248, 193, + 86, 13, 193, 188, 215, 198, 201, 118, 79, 16, 23, 55, 114, 224, 216, 203, + 213, 203, 68, 211, 19, 30, 159, 78, 197, 131, 177, 254, 243, 229, 109, 199, + 47, 138, 215, 21, 98, 248, 98, 4, 96, 146, 90, 135, 29, 250, 94, 134, + 52, 148, 235, 13, 3, 93, 126, 54, 207, 230, 174, 67, 32, 42, 54, 203, + 180, 141, 120, 51, 154, 219, 102, 8, 130, 97, 130, 187, 119, 43, 177, 45, + 177, 231, 184, 147, 27, 13, 48, 82, 154, 113, 191, 62, 96, 86, 214, 14, + 56, 84, 171, 46, 149, 46, 114, 89, 129, 91, 56, 88, 50, 233, 68, 246, + 130, 33, 102, 231, 88, 78, 147, 186, 148, 237, 140, 135, 112, 3, 175, 9, + 135, 93, 37, 194, 126, 116, 252, 47, 64, 114, 176, 170, 131, 186, 129, 137, + 195, 118, 157, 219, 112, 139, 166, 221, 182, 125, 193, 142, 112, 224, 215, 168, + 211, 81, 186, 212, 7, 73, 102, 240, 93, 218, 71, 61, 239, 200, 144, 165, + 235, 29, 89, 42, 181, 140, 87, 83, 150, 246, 241, 178, 139, 46, 80, 210, + 57, 92, 94, 140, 171, 213, 22, 15, 62, 30, 67, 212, 34, 92, 252, 33, + 149, 198, 67, 144, 173, 198, 86, 27, 34, 239, 72, 65, 77, 81, 149, 208, + 14, 171, 96, 201, 173, 188, 20, 44, 244, 118, 164, 163, 226, 241, 69, 228, + 250, 168, 120, 121, 125, 19, 81, 99, 105, 93, 81, 66, 159, 168, 56, 108, + 147, 84, 100, 166, 115, 122, 3, 169, 28, 217, 110, 213, 123, 122, 174, 110, + 52, 124, 36, 40, 45, 104, 21, 234, 97, 102, 243, 152, 144, 24, 129, 175, + 228, 33, 239, 109, 208, 105, 183, 31, 197, 8, 37, 148, 201, 144, 92, 192, + 150, 125, 184, 241, 115, 107, 71, 140, 227, 227, 99, 69, 36, 181, 78, 8, + 158, 104, 170, 231, 196, 3, 239, 132, 77, 174, 61, 98, 108, 65, 141, 13, + 10, 106, 47, 207, 96, 17, 56, 141, 84, 23, 128, 105, 52, 183, 73, 11, + 3, 186, 64, 45, 9, 223, 67, 73, 238, 202, 54, 221, 37, 148, 40, 162, + 175, 193, 18, 112, 28, 213, 124, 239, 79, 162, 7, 254, 52, 26, 40, 113, + 68, 92, 59, 168, 69, 65, 207, 12, 80, 218, 207, 194, 130, 36, 238, 132, + 51, 68, 109, 159, 241, 7, 74, 126, 38, 185, 6, 74, 123, 25, 29, 201, + 18, 137, 54, 41, 41, 193, 134, 145, 145, 131, 121, 121, 193, 118, 152, 154, + 152, 75, 69, 56, 227, 179, 100, 49, 161, 168, 238, 144, 185, 90, 42, 167, + 122, 181, 136, 225, 181, 223, 27, 194, 61, 72, 177, 8, 124, 192, 150, 5, + 116, 233, 71, 117, 162, 5, 191, 42, 251, 181, 224, 255, 42, 78, 82, 181, + 25, 202, 89, 79, 240, 214, 239, 22, 57, 254, 195, 85, 212, 10, 61, 83, + 180, 93, 223, 19, 42, 76, 131, 38, 110, 201, 33, 38, 238, 116, 20, 121, + 250, 155, 130, 154, 101, 246, 68, 229, 79, 8, 231, 172, 69, 79, 164, 103, + 191, 143, 171, 0, 201, 124, 139, 31, 149, 96, 213, 124, 238, 25, 139, 34, + 15, 63, 100, 63, 177, 168, 230, 96, 246, 244, 139, 181, 255, 141, 248, 188, + 132, 238, 101, 39, 188, 67, 129, 10, 74, 147, 80, 126, 196, 246, 201, 241, + 10, 66, 221, 66, 76, 59, 78, 12, 198, 184, 248, 75, 57, 191, 68, 128, + 154, 43, 76, 100, 171, 138, 172, 37, 186, 103, 129, 176, 27, 135, 136, 111, + 216, 66, 88, 52, 21, 221, 241, 80, 71, 76, 254, 4, 80, 0, 218, 184, + 243, 142, 232, 146, 192, 218, 245, 219, 29, 83, 162, 251, 18, 220, 183, 113, + 233, 134, 37, 28, 127, 77, 88, 6, 230, 116, 1, 205, 155, 195, 139, 96, + 46, 244, 164, 33, 209, 46, 72, 43, 51, 133, 111, 165, 33, 110, 68, 42, + 209, 18, 51, 195, 14, 198, 222, 132, 176, 48, 132, 65, 251, 163, 72, 128, + 194, 134, 29, 123, 238, 198, 158, 219, 177, 231, 44, 118, 203, 137, 77, 66, + 12, 246, 246, 28, 164, 152, 249, 143, 204, 92, 69, 57, 102, 206, 9, 113, + 103, 88, 70, 120, 48, 251, 145, 153, 209, 131, 153, 140, 208, 174, 35, 227, + 165, 106, 171, 6, 114, 182, 82, 2, 15, 152, 219, 56, 120, 232, 249, 208, + 126, 142, 60, 215, 51, 152, 215, 144, 193, 122, 238, 60, 71, 1, 132, 167, + 19, 150, 186, 209, 210, 54, 127, 139, 43, 25, 240, 230, 135, 73, 125, 104, + 115, 90, 203, 190, 156, 125, 207, 122, 180, 45, 179, 148, 158, 93, 53, 1, + 158, 85, 60, 145, 85, 181, 221, 111, 116, 71, 174, 203, 195, 15, 214, 55, + 56, 59, 229, 158, 126, 195, 193, 1, 95, 33, 59, 54, 201, 253, 166, 208, + 208, 128, 247, 25, 26, 159, 28, 121, 87, 229, 33, 35, 9, 154, 177, 62, + 142, 18, 240, 29, 219, 147, 183, 49, 200, 61, 212, 179, 93, 84, 64, 216, + 243, 113, 94, 37, 144, 68, 127, 160, 174, 167, 244, 151, 22, 77, 125, 248, + 208, 2, 56, 111, 99, 209, 34, 191, 33, 21, 133, 246, 87, 107, 241, 87, + 73, 233, 67, 186, 115, 147, 44, 229, 73, 250, 124, 146, 104, 159, 166, 132, + 100, 190, 167, 146, 217, 44, 43, 115, 77, 238, 51, 239, 205, 54, 19, 73, + 219, 63, 72, 60, 41, 132, 176, 223, 218, 140, 231, 187, 240, 212, 126, 254, + 150, 49, 101, 159, 157, 56, 14, 57, 126, 137, 147, 53, 108, 210, 220, 91, + 140, 252, 39, 254, 249, 14, 223, 168, 67, 174, 108, 250, 125, 76, 185, 172, + 252, 169, 124, 87, 253, 104, 247, 196, 216, 66, 152, 147, 93, 207, 118, 179, + 245, 133, 9, 36, 75, 64, 16, 126, 21, 72, 69, 72, 102, 103, 240, 185, + 46, 206, 46, 83, 147, 172, 85, 40, 11, 45, 188, 162, 80, 30, 214, 94, + 188, 150, 147, 207, 242, 203, 120, 88, 183, 217, 240, 68, 107, 198, 127, 87, + 117, 66, 200, 128, 36, 46, 160, 81, 220, 47, 88, 58, 186, 203, 170, 11, + 224, 180, 150, 189, 195, 28, 74, 236, 112, 155, 224, 32, 200, 202, 110, 75, + 172, 140, 242, 9, 144, 170, 55, 30, 91, 224, 215, 213, 120, 227, 42, 143, + 43, 131, 100, 35, 164, 235, 113, 250, 7, 107, 191, 221, 192, 2, 118, 165, + 79, 108, 245, 141, 156, 232, 171, 248, 34, 171, 174, 8, 12, 108, 113, 169, + 69, 237, 117, 29, 171, 192, 114, 65, 213, 180, 173, 170, 22, 188, 213, 120, + 117, 229, 33, 196, 50, 141, 14, 55, 74, 240, 168, 94, 56, 149, 186, 226, + 146, 169, 15, 36, 1, 175, 25, 255, 144, 194, 97, 246, 50, 252, 240, 18, + 63, 69, 53, 238, 66, 28, 81, 145, 135, 22, 97, 166, 223, 200, 84, 13, + 26, 220, 5, 77, 167, 64, 104, 25, 6, 14, 170, 50, 45, 37, 126, 213, + 147, 94, 103, 82, 71, 126, 71, 103, 20, 115, 138, 63, 226, 253, 92, 72, + 98, 20, 222, 180, 28, 18, 148, 142, 244, 200, 84, 148, 28, 214, 72, 91, + 168, 83, 10, 78, 160, 221, 23, 20, 254, 196, 84, 154, 219, 24, 24, 65, + 171, 101, 248, 186, 158, 81, 97, 14, 5, 21, 54, 18, 225, 149, 111, 199, + 222, 109, 252, 55, 212, 138, 221, 222, 160, 223, 130, 21, 187, 137, 166, 79, + 238, 62, 199, 49, 114, 171, 212, 167, 48, 119, 162, 89, 18, 183, 60, 66, + 80, 71, 76, 23, 9, 187, 77, 71, 154, 239, 15, 122, 32, 127, 13, 67, + 255, 164, 230, 209, 41, 140, 208, 30, 255, 49, 189, 35, 59, 16, 92, 223, + 26, 104, 173, 243, 63, 161, 131, 116, 46, 254, 215, 181, 128, 173, 238, 11, + 78, 18, 184, 58, 106, 58, 148, 58, 149, 150, 237, 95, 85, 211, 228, 180, + 42, 167, 99, 178, 166, 166, 112, 117, 132, 184, 245, 55, 138, 154, 148, 213, + 88, 74, 214, 180, 152, 28, 195, 184, 114, 74, 145, 147, 26, 204, 5, 127, + 71, 125, 196, 108, 51, 82, 65, 210, 162, 88, 92, 51, 98, 177, 43, 29, + 130, 70, 108, 151, 95, 235, 73, 193, 37, 37, 18, 196, 193, 119, 70, 41, + 92, 133, 71, 191, 167, 196, 132, 159, 32, 152, 235, 7, 62, 215, 51, 65, + 34, 107, 52, 77, 110, 232, 6, 93, 19, 4, 253, 151, 52, 75, 65, 12, + 253, 67, 98, 29, 69, 213, 130, 173, 32, 117, 5, 221, 64, 41, 54, 232, + 93, 214, 180, 198, 38, 157, 19, 54, 247, 175, 171, 157, 248, 91, 191, 168, + 121, 226, 111, 253, 162, 242, 201, 125, 235, 107, 250, 39, 55, 254, 38, 21, + 20, 253, 231, 29, 80, 22, 27, 81, 107, 7, 12, 75, 2, 164, 59, 74, + 217, 122, 118, 47, 161, 91, 91, 252, 221, 103, 76, 29, 71, 204, 203, 168, + 219, 167, 29, 100, 109, 87, 98, 67, 217, 162, 107, 62, 174, 241, 49, 233, + 178, 40, 5, 251, 109, 71, 163, 229, 45, 149, 246, 121, 145, 114, 168, 17, + 179, 40, 103, 101, 189, 130, 44, 28, 54, 71, 80, 164, 32, 105, 105, 65, + 156, 165, 83, 69, 103, 108, 132, 28, 5, 218, 79, 120, 163, 97, 109, 34, + 23, 170, 130, 160, 122, 58, 129, 101, 173, 192, 159, 116, 141, 97, 123, 189, + 183, 215, 6, 113, 137, 189, 166, 251, 236, 132, 93, 72, 69, 129, 244, 130, + 112, 45, 86, 50, 88, 226, 127, 177, 8, 31, 74, 117, 112, 161, 16, 201, + 101, 9, 40, 213, 1, 201, 0, 249, 56, 156, 161, 83, 69, 180, 177, 216, + 227, 176, 24, 44, 100, 85, 58, 30, 245, 250, 61, 50, 208, 55, 171, 47, + 104, 13, 176, 12, 152, 231, 30, 203, 47, 27, 178, 175, 72, 181, 67, 49, + 177, 207, 220, 106, 189, 96, 120, 106, 98, 213, 50, 98, 147, 185, 205, 114, + 105, 85, 197, 183, 90, 129, 207, 28, 165, 69, 176, 4, 109, 5, 185, 100, + 185, 252, 75, 142, 110, 94, 236, 18, 105, 217, 106, 65, 91, 71, 60, 82, + 33, 182, 108, 27, 57, 5, 97, 10, 152, 121, 58, 136, 226, 174, 238, 32, + 12, 221, 131, 187, 155, 85, 125, 217, 154, 14, 27, 82, 39, 137, 152, 231, + 78, 83, 221, 192, 202, 135, 112, 210, 40, 53, 146, 10, 116, 107, 52, 128, + 132, 58, 29, 242, 29, 66, 48, 110, 144, 5, 182, 136, 143, 162, 83, 239, + 218, 186, 82, 3, 75, 132, 82, 133, 77, 173, 210, 28, 212, 235, 53, 180, + 61, 71, 140, 103, 170, 166, 22, 233, 245, 71, 174, 46, 85, 4, 193, 88, + 26, 5, 132, 54, 219, 130, 76, 69, 147, 95, 102, 86, 155, 197, 178, 65, + 3, 13, 234, 67, 220, 223, 20, 164, 42, 8, 33, 240, 10, 217, 223, 83, + 219, 102, 151, 12, 244, 215, 24, 252, 223, 160, 244, 87, 229, 230, 190, 131, + 122, 4, 162, 144, 249, 184, 192, 192, 72, 52, 25, 174, 205, 250, 44, 66, + 182, 234, 195, 30, 51, 64, 119, 29, 10, 134, 140, 187, 28, 189, 147, 32, + 65, 28, 193, 208, 244, 189, 193, 136, 123, 122, 181, 62, 25, 189, 46, 214, + 57, 90, 255, 44, 243, 74, 145, 226, 202, 54, 255, 142, 171, 26, 245, 153, + 44, 193, 21, 222, 201, 132, 142, 198, 198, 9, 106, 101, 56, 151, 0, 33, + 79, 225, 108, 7, 195, 134, 1, 237, 107, 241, 184, 253, 143, 136, 78, 237, + 40, 182, 144, 147, 209, 118, 159, 40, 58, 189, 20, 86, 159, 153, 34, 17, + 222, 64, 201, 132, 187, 29, 182, 235, 245, 62, 65, 123, 177, 113, 35, 218, + 161, 33, 196, 163, 104, 25, 244, 107, 163, 135, 123, 123, 219, 166, 233, 206, + 247, 225, 52, 205, 90, 227, 52, 201, 202, 188, 51, 251, 238, 22, 218, 68, + 131, 184, 71, 230, 221, 117, 70, 109, 30, 65, 20, 43, 191, 119, 72, 73, + 91, 126, 120, 195, 191, 5, 131, 10, 125, 204, 216, 230, 87, 24, 91, 65, + 63, 217, 2, 201, 53, 121, 248, 252, 225, 15, 237, 248, 73, 150, 70, 153, + 130, 140, 114, 8, 231, 222, 22, 194, 166, 36, 132, 89, 245, 217, 72, 8, + 138, 224, 122, 102, 193, 194, 106, 146, 219, 58, 172, 100, 32, 250, 15, 8, + 101, 201, 86, 158, 142, 65, 34, 69, 207, 240, 16, 23, 211, 120, 186, 79, + 78, 76, 46, 123, 20, 133, 55, 115, 194, 83, 76, 159, 231, 26, 1, 113, + 169, 214, 53, 45, 90, 60, 27, 203, 11, 223, 148, 11, 111, 168, 139, 249, + 230, 228, 242, 44, 251, 106, 142, 58, 13, 110, 65, 2, 115, 114, 178, 205, + 110, 126, 96, 162, 178, 157, 52, 174, 196, 118, 142, 150, 171, 154, 129, 136, + 44, 24, 221, 59, 240, 215, 91, 3, 167, 17, 118, 165, 202, 160, 110, 180, + 131, 33, 222, 90, 203, 209, 48, 12, 235, 228, 214, 214, 14, 115, 23, 97, + 85, 60, 2, 139, 168, 242, 148, 62, 139, 97, 88, 21, 79, 192, 152, 166, + 103, 24, 146, 241, 109, 121, 10, 123, 37, 87, 215, 139, 234, 53, 217, 54, + 170, 102, 98, 5, 154, 85, 51, 25, 18, 132, 2, 16, 86, 172, 218, 179, + 45, 126, 160, 190, 108, 248, 76, 143, 253, 12, 22, 208, 29, 3, 102, 23, + 105, 110, 86, 207, 114, 237, 112, 121, 41, 18, 136, 20, 176, 60, 141, 104, + 27, 17, 80, 183, 167, 188, 151, 88, 0, 58, 198, 12, 230, 63, 88, 4, + 236, 46, 252, 33, 243, 43, 54, 86, 80, 248, 72, 33, 139, 233, 246, 116, + 27, 95, 137, 178, 152, 161, 191, 148, 29, 45, 78, 39, 124, 235, 134, 149, + 133, 161, 65, 51, 172, 134, 126, 135, 236, 250, 236, 46, 194, 238, 112, 200, + 189, 82, 0, 44, 20, 246, 155, 145, 129, 60, 8, 133, 240, 185, 228, 182, + 249, 43, 215, 209, 193, 175, 101, 95, 244, 77, 76, 158, 222, 127, 229, 201, + 23, 95, 76, 106, 66, 19, 57, 150, 94, 44, 118, 99, 177, 187, 87, 186, + 121, 101, 79, 216, 141, 133, 119, 168, 132, 195, 225, 97, 143, 67, 122, 15, + 199, 33, 38, 79, 15, 95, 41, 186, 253, 240, 149, 30, 190, 218, 15, 77, + 225, 217, 171, 247, 61, 16, 13, 87, 95, 180, 76, 193, 158, 12, 223, 14, + 75, 78, 228, 31, 78, 89, 120, 32, 228, 44, 251, 186, 212, 102, 168, 195, + 54, 229, 215, 16, 110, 69, 168, 174, 221, 87, 219, 204, 76, 198, 194, 244, + 76, 174, 232, 238, 154, 114, 151, 2, 236, 231, 118, 128, 173, 126, 238, 97, + 65, 122, 38, 219, 211, 80, 255, 87, 89, 239, 87, 127, 12, 177, 219, 171, + 112, 197, 6, 113, 207, 164, 81, 92, 197, 195, 220, 222, 171, 125, 77, 233, + 200, 204, 88, 102, 119, 117, 20, 242, 143, 210, 207, 192, 22, 86, 86, 249, + 137, 129, 124, 103, 213, 250, 207, 112, 109, 108, 229, 138, 29, 223, 193, 163, + 229, 203, 49, 123, 93, 196, 34, 8, 162, 130, 92, 254, 37, 99, 87, 47, + 120, 205, 122, 89, 215, 91, 96, 223, 74, 249, 191, 138, 94, 179, 174, 66, + 108, 29, 176, 125, 135, 87, 208, 98, 89, 22, 252, 20, 15, 150, 28, 102, + 97, 201, 188, 102, 28, 204, 178, 151, 225, 88, 116, 192, 7, 33, 217, 81, + 247, 217, 10, 58, 91, 223, 246, 164, 32, 131, 13, 81, 239, 176, 7, 131, + 9, 11, 138, 176, 31, 84, 249, 123, 101, 105, 82, 189, 241, 102, 249, 46, + 229, 168, 184, 135, 3, 99, 234, 234, 175, 12, 88, 224, 166, 210, 102, 30, + 236, 151, 17, 200, 156, 109, 148, 35, 109, 236, 155, 86, 221, 168, 129, 136, + 108, 53, 71, 45, 79, 208, 74, 68, 219, 21, 11, 155, 26, 122, 217, 146, + 95, 232, 220, 139, 48, 44, 220, 46, 133, 210, 136, 222, 123, 84, 156, 207, + 108, 225, 183, 120, 106, 164, 113, 54, 44, 169, 85, 159, 25, 53, 120, 29, + 81, 97, 184, 207, 230, 112, 100, 12, 16, 157, 147, 245, 194, 150, 50, 67, + 178, 66, 19, 135, 27, 115, 8, 237, 117, 77, 244, 204, 115, 146, 172, 35, + 116, 18, 124, 211, 134, 77, 156, 54, 116, 75, 68, 254, 242, 228, 216, 143, + 153, 122, 30, 49, 71, 68, 86, 98, 211, 221, 133, 212, 160, 70, 22, 50, + 174, 117, 200, 226, 16, 246, 197, 35, 104, 30, 28, 46, 8, 187, 243, 185, + 67, 160, 221, 132, 25, 245, 119, 6, 184, 234, 52, 117, 70, 85, 220, 32, + 55, 158, 78, 129, 188, 165, 153, 95, 57, 47, 170, 199, 19, 156, 237, 99, + 88, 243, 47, 105, 209, 57, 56, 158, 40, 252, 193, 82, 199, 171, 101, 19, + 110, 188, 143, 131, 16, 24, 250, 16, 175, 116, 89, 99, 52, 28, 59, 58, + 234, 161, 175, 79, 14, 62, 184, 167, 51, 31, 82, 142, 72, 23, 135, 234, + 184, 103, 226, 9, 172, 138, 123, 155, 132, 58, 124, 56, 155, 159, 148, 8, + 220, 74, 99, 131, 183, 175, 240, 109, 209, 222, 135, 83, 251, 161, 92, 200, + 105, 253, 108, 148, 56, 187, 109, 164, 64, 92, 150, 176, 185, 36, 214, 130, + 82, 32, 33, 251, 188, 205, 39, 5, 146, 140, 30, 143, 187, 90, 7, 82, + 107, 118, 74, 54, 23, 184, 148, 148, 223, 253, 236, 72, 211, 191, 10, 252, + 239, 23, 25, 142, 249, 89, 230, 114, 52, 141, 162, 185, 236, 198, 252, 48, + 116, 57, 154, 46, 164, 134, 204, 198, 252, 20, 116, 57, 90, 76, 72, 13, + 89, 141, 57, 249, 225, 19, 193, 198, 224, 194, 216, 167, 59, 21, 62, 228, + 231, 72, 166, 15, 178, 67, 135, 175, 102, 90, 176, 214, 135, 57, 126, 180, + 38, 209, 56, 38, 218, 97, 220, 199, 187, 190, 86, 103, 77, 148, 4, 143, + 130, 156, 199, 16, 101, 93, 42, 73, 30, 5, 185, 142, 33, 219, 46, 165, + 211, 129, 101, 171, 213, 217, 37, 75, 237, 238, 184, 19, 68, 92, 159, 145, + 140, 15, 221, 223, 22, 92, 192, 42, 69, 55, 45, 30, 56, 130, 128, 209, + 179, 60, 232, 141, 64, 34, 78, 41, 219, 176, 137, 178, 176, 6, 120, 136, + 80, 195, 19, 188, 80, 20, 68, 9, 25, 149, 53, 229, 112, 134, 24, 23, + 151, 255, 123, 246, 227, 41, 78, 42, 66, 120, 125, 75, 11, 154, 49, 35, + 21, 200, 12, 1, 191, 16, 111, 7, 113, 118, 26, 61, 107, 228, 0, 149, + 252, 210, 76, 54, 155, 71, 40, 193, 255, 165, 25, 204, 221, 162, 246, 104, + 114, 98, 39, 116, 184, 58, 240, 29, 40, 140, 118, 252, 198, 30, 100, 242, + 178, 174, 244, 48, 203, 185, 125, 14, 55, 87, 183, 240, 35, 123, 248, 36, + 153, 185, 147, 12, 228, 62, 238, 90, 82, 89, 76, 105, 102, 167, 52, 99, + 41, 149, 63, 153, 0, 133, 134, 207, 168, 177, 127, 112, 106, 99, 62, 205, + 216, 51, 17, 182, 2, 71, 84, 31, 239, 249, 37, 1, 0, 38, 171, 24, + 23, 0, 226, 226, 156, 245, 177, 140, 77, 134, 35, 10, 207, 5, 241, 216, + 140, 13, 127, 190, 70, 252, 159, 63, 144, 252, 63, 191, 255, 67, 224, 11, + 92, 26, 26, 94, 49, 97, 22, 97, 80, 251, 124, 74, 147, 161, 61, 237, + 0, 62, 177, 97, 179, 72, 45, 238, 162, 18, 151, 221, 249, 10, 102, 52, + 59, 87, 62, 149, 177, 254, 15, 242, 209, 142, 96, 71, 118, 163, 65, 4, + 122, 152, 113, 190, 4, 47, 167, 225, 127, 172, 140, 62, 79, 185, 146, 203, + 229, 82, 102, 199, 252, 127, 78, 249, 40, 14, 119, 67, 254, 6, 115, 18, + 109, 199, 191, 5, 18, 220, 150, 13, 55, 210, 221, 89, 134, 200, 80, 88, + 121, 62, 164, 252, 140, 209, 138, 240, 123, 95, 119, 206, 159, 83, 241, 224, + 249, 156, 63, 103, 247, 171, 60, 147, 42, 122, 120, 35, 58, 167, 212, 162, + 203, 150, 77, 182, 169, 126, 67, 126, 149, 49, 210, 181, 188, 96, 227, 60, + 61, 115, 168, 234, 119, 88, 249, 182, 167, 209, 64, 252, 195, 255, 1, 203, + 123, 3, 74, 96, 12, 154, 65, 120, 54, 70, 204, 95, 20, 179, 121, 144, + 198, 130, 56, 6, 154, 14, 9, 198, 150, 18, 36, 166, 70, 74, 176, 229, + 38, 56, 95, 77, 112, 190, 146, 224, 240, 69, 153, 113, 207, 30, 61, 131, + 9, 207, 149, 76, 64, 231, 116, 217, 74, 230, 125, 146, 137, 4, 3, 221, + 57, 44, 18, 45, 53, 26, 12, 228, 231, 17, 188, 219, 69, 56, 184, 216, + 30, 196, 148, 39, 50, 60, 137, 76, 88, 114, 67, 196, 49, 196, 103, 115, + 101, 15, 131, 161, 39, 201, 194, 94, 104, 10, 230, 62, 132, 17, 240, 131, + 224, 215, 63, 50, 16, 219, 135, 18, 143, 196, 217, 219, 167, 42, 251, 77, + 200, 1, 123, 214, 12, 80, 255, 250, 98, 114, 140, 25, 147, 252, 200, 32, + 27, 35, 29, 45, 239, 72, 115, 156, 131, 134, 8, 144, 167, 187, 198, 83, + 115, 78, 23, 128, 98, 109, 163, 186, 35, 241, 20, 232, 164, 122, 15, 143, + 43, 185, 105, 198, 59, 100, 23, 65, 26, 0, 200, 18, 127, 201, 121, 38, + 33, 227, 102, 27, 219, 129, 231, 177, 35, 205, 92, 91, 142, 213, 168, 104, + 225, 229, 56, 218, 152, 25, 212, 83, 249, 232, 192, 252, 37, 128, 189, 27, + 14, 152, 219, 1, 214, 171, 31, 146, 137, 144, 117, 88, 12, 136, 0, 5, + 233, 206, 120, 75, 192, 45, 52, 69, 126, 134, 136, 126, 147, 12, 49, 42, + 64, 123, 207, 160, 245, 167, 212, 250, 51, 186, 163, 214, 167, 10, 96, 235, + 79, 169, 245, 89, 227, 5, 102, 172, 96, 136, 250, 199, 46, 209, 248, 102, + 77, 35, 242, 188, 125, 138, 52, 218, 161, 43, 86, 17, 98, 15, 20, 173, + 4, 150, 155, 206, 110, 48, 252, 22, 20, 153, 190, 16, 200, 127, 10, 185, + 69, 16, 91, 220, 97, 180, 25, 205, 247, 168, 35, 195, 58, 254, 141, 180, + 34, 122, 72, 104, 43, 193, 35, 137, 26, 152, 141, 66, 149, 251, 201, 114, + 240, 62, 108, 11, 108, 10, 62, 74, 231, 182, 255, 89, 6, 191, 167, 153, + 226, 156, 54, 207, 156, 81, 250, 149, 118, 98, 163, 148, 51, 17, 205, 96, + 148, 78, 151, 71, 41, 125, 95, 188, 63, 102, 194, 40, 157, 225, 40, 157, + 170, 118, 67, 83, 101, 224, 47, 12, 220, 79, 71, 233, 158, 56, 74, 103, + 12, 200, 87, 24, 162, 179, 205, 67, 148, 190, 47, 119, 136, 206, 20, 54, + 68, 91, 234, 103, 67, 116, 190, 252, 130, 242, 229, 33, 58, 119, 135, 232, + 124, 117, 136, 206, 189, 67, 116, 142, 56, 146, 238, 16, 253, 202, 4, 193, + 90, 142, 202, 133, 131, 114, 78, 69, 12, 179, 203, 255, 192, 16, 101, 227, + 112, 182, 71, 221, 20, 78, 224, 223, 200, 52, 146, 192, 33, 42, 140, 94, + 40, 90, 11, 10, 16, 105, 177, 209, 251, 233, 16, 157, 175, 31, 162, 115, + 27, 157, 146, 134, 49, 91, 109, 232, 122, 206, 202, 174, 252, 115, 5, 255, + 181, 111, 139, 251, 234, 113, 6, 116, 38, 175, 248, 44, 47, 127, 22, 67, + 238, 172, 193, 186, 128, 12, 46, 90, 36, 160, 134, 160, 23, 45, 196, 157, + 247, 13, 51, 239, 170, 242, 23, 139, 199, 156, 239, 3, 53, 140, 221, 181, + 225, 11, 221, 21, 84, 14, 32, 51, 9, 60, 203, 59, 207, 156, 213, 20, + 159, 225, 163, 90, 15, 241, 16, 213, 48, 183, 7, 14, 228, 97, 164, 132, + 162, 248, 144, 0, 16, 33, 55, 109, 59, 48, 252, 144, 120, 227, 22, 246, + 2, 150, 111, 44, 5, 186, 48, 78, 134, 72, 76, 193, 36, 179, 138, 209, + 33, 232, 122, 110, 107, 47, 189, 92, 203, 47, 39, 242, 203, 1, 57, 81, + 163, 212, 138, 166, 206, 47, 29, 20, 36, 126, 100, 82, 222, 80, 124, 7, + 3, 95, 134, 45, 163, 214, 155, 138, 71, 76, 12, 4, 202, 64, 19, 124, + 216, 138, 238, 51, 89, 2, 164, 111, 202, 110, 216, 31, 152, 163, 79, 89, + 99, 81, 135, 148, 32, 137, 243, 154, 48, 25, 224, 226, 36, 115, 141, 63, + 7, 236, 199, 91, 178, 140, 178, 147, 242, 132, 50, 37, 148, 125, 96, 8, + 165, 35, 34, 148, 29, 47, 184, 3, 23, 58, 210, 172, 80, 200, 240, 250, + 87, 48, 176, 23, 70, 226, 6, 113, 7, 109, 131, 239, 204, 124, 188, 173, + 132, 195, 145, 68, 204, 49, 53, 143, 99, 33, 156, 141, 116, 28, 218, 197, + 35, 172, 210, 77, 194, 9, 77, 98, 105, 60, 66, 172, 134, 21, 101, 230, + 109, 4, 28, 251, 30, 203, 32, 246, 138, 189, 251, 102, 13, 138, 16, 155, + 42, 43, 47, 199, 77, 226, 114, 156, 22, 1, 49, 89, 150, 236, 6, 144, + 58, 142, 228, 231, 4, 49, 205, 87, 130, 157, 71, 82, 135, 73, 13, 3, + 207, 54, 64, 88, 5, 1, 176, 243, 244, 236, 195, 17, 131, 112, 152, 244, + 131, 10, 72, 57, 129, 214, 123, 94, 120, 126, 196, 93, 240, 133, 45, 162, + 7, 252, 139, 136, 157, 147, 210, 54, 217, 172, 237, 196, 164, 48, 93, 193, + 60, 203, 47, 98, 236, 17, 218, 201, 51, 162, 5, 223, 30, 63, 115, 86, + 96, 218, 82, 96, 223, 250, 241, 187, 68, 198, 234, 239, 58, 187, 177, 72, + 105, 6, 131, 52, 142, 164, 13, 31, 210, 96, 34, 133, 201, 95, 22, 238, + 214, 82, 107, 219, 90, 17, 61, 70, 39, 2, 210, 182, 109, 4, 183, 189, + 67, 240, 27, 8, 245, 54, 144, 108, 109, 95, 140, 211, 124, 250, 170, 173, + 65, 175, 91, 199, 166, 76, 196, 102, 137, 24, 124, 202, 8, 229, 157, 136, + 105, 102, 183, 9, 50, 160, 63, 111, 30, 168, 21, 171, 208, 127, 212, 226, + 157, 199, 227, 244, 171, 113, 114, 60, 207, 157, 204, 250, 181, 211, 235, 225, + 227, 93, 186, 83, 233, 94, 247, 31, 238, 99, 231, 133, 215, 171, 38, 254, + 203, 151, 246, 231, 185, 108, 126, 145, 95, 60, 40, 89, 203, 172, 206, 30, + 59, 241, 187, 179, 130, 53, 25, 54, 110, 148, 110, 62, 105, 141, 138, 253, + 116, 33, 217, 55, 234, 141, 122, 226, 113, 113, 217, 189, 239, 88, 245, 110, + 227, 164, 123, 211, 95, 212, 7, 74, 237, 82, 189, 247, 251, 175, 173, 171, + 236, 193, 85, 241, 49, 125, 51, 109, 181, 14, 175, 218, 15, 211, 249, 249, + 213, 254, 126, 167, 114, 244, 250, 120, 48, 106, 53, 175, 175, 15, 140, 214, + 177, 209, 221, 111, 54, 251, 234, 121, 41, 121, 149, 107, 158, 207, 219, 201, + 195, 92, 191, 151, 189, 170, 197, 99, 229, 81, 182, 215, 157, 23, 47, 78, + 163, 141, 228, 108, 98, 69, 219, 209, 242, 188, 161, 71, 11, 73, 43, 92, + 214, 227, 71, 183, 205, 139, 203, 183, 66, 122, 17, 61, 60, 173, 190, 141, + 140, 251, 68, 186, 250, 230, 247, 31, 117, 207, 83, 139, 228, 80, 175, 14, + 139, 218, 227, 227, 101, 52, 153, 187, 56, 89, 244, 79, 91, 83, 227, 244, + 96, 209, 59, 157, 53, 247, 211, 209, 201, 40, 30, 207, 167, 26, 147, 162, + 49, 27, 183, 244, 100, 225, 114, 156, 222, 159, 23, 94, 15, 250, 133, 135, + 112, 241, 245, 40, 124, 217, 109, 63, 156, 140, 47, 23, 141, 74, 82, 47, + 223, 94, 143, 213, 120, 42, 93, 86, 22, 51, 173, 88, 30, 167, 30, 243, + 61, 229, 176, 98, 181, 98, 234, 225, 213, 44, 127, 19, 239, 158, 250, 253, + 151, 201, 137, 209, 141, 78, 146, 151, 241, 225, 237, 169, 30, 207, 54, 235, + 149, 201, 220, 52, 26, 225, 166, 254, 122, 61, 62, 61, 136, 246, 78, 94, + 235, 249, 98, 255, 205, 232, 158, 182, 231, 249, 195, 73, 69, 111, 234, 230, + 73, 56, 57, 154, 88, 175, 221, 148, 145, 84, 235, 209, 253, 70, 56, 94, + 44, 95, 62, 212, 138, 189, 88, 62, 59, 53, 238, 7, 90, 172, 122, 25, + 31, 87, 172, 71, 173, 222, 62, 125, 72, 20, 15, 155, 211, 194, 225, 245, + 168, 112, 117, 147, 30, 235, 126, 127, 247, 218, 28, 188, 149, 23, 163, 81, + 252, 194, 48, 84, 229, 181, 167, 20, 210, 141, 170, 241, 24, 190, 189, 111, + 182, 26, 157, 211, 233, 201, 193, 184, 102, 245, 231, 211, 215, 155, 219, 194, + 226, 181, 90, 139, 54, 140, 130, 222, 62, 56, 85, 39, 39, 229, 116, 234, + 238, 190, 86, 75, 84, 180, 131, 88, 239, 124, 164, 55, 78, 147, 103, 149, + 227, 120, 120, 114, 152, 141, 238, 31, 94, 21, 187, 202, 172, 120, 115, 61, + 72, 38, 161, 177, 198, 133, 199, 219, 218, 237, 98, 126, 163, 140, 252, 254, + 116, 253, 178, 16, 141, 223, 215, 43, 21, 189, 145, 170, 95, 214, 222, 238, + 211, 209, 163, 158, 86, 206, 69, 79, 90, 9, 99, 252, 48, 171, 236, 231, + 243, 167, 195, 220, 101, 44, 117, 121, 24, 189, 169, 78, 172, 236, 164, 208, + 25, 189, 86, 38, 185, 69, 52, 23, 189, 206, 151, 239, 138, 55, 29, 195, + 72, 204, 6, 198, 120, 90, 57, 137, 199, 235, 183, 241, 233, 254, 101, 165, + 255, 216, 61, 51, 141, 78, 191, 119, 102, 245, 75, 143, 217, 199, 132, 126, + 127, 23, 30, 92, 55, 103, 11, 191, 191, 113, 159, 182, 148, 242, 32, 138, + 99, 181, 172, 118, 107, 151, 119, 105, 67, 211, 147, 61, 253, 242, 226, 38, + 108, 116, 207, 166, 250, 85, 250, 176, 164, 231, 174, 103, 181, 194, 85, 172, + 208, 125, 168, 90, 177, 135, 66, 178, 147, 10, 223, 198, 231, 149, 220, 225, + 91, 172, 223, 28, 54, 98, 141, 226, 224, 181, 85, 189, 63, 110, 149, 170, + 111, 23, 241, 216, 228, 126, 164, 60, 90, 241, 112, 120, 120, 90, 237, 141, + 218, 249, 139, 170, 122, 249, 218, 31, 157, 92, 199, 230, 175, 83, 191, 63, + 145, 47, 62, 190, 85, 14, 198, 225, 121, 239, 98, 62, 185, 189, 110, 188, + 142, 235, 87, 199, 209, 133, 122, 151, 78, 61, 92, 159, 244, 82, 147, 251, + 59, 85, 75, 21, 111, 110, 22, 245, 147, 78, 191, 126, 223, 126, 28, 237, + 199, 15, 226, 195, 187, 211, 234, 162, 112, 115, 24, 203, 118, 31, 195, 143, + 221, 126, 170, 146, 184, 156, 39, 203, 199, 7, 233, 194, 225, 229, 93, 56, + 213, 90, 132, 213, 215, 228, 217, 40, 29, 110, 159, 223, 229, 230, 89, 37, + 166, 235, 135, 185, 81, 215, 60, 133, 154, 102, 39, 163, 163, 199, 73, 177, + 100, 142, 162, 175, 225, 138, 213, 31, 62, 156, 84, 142, 19, 163, 139, 212, + 40, 103, 94, 55, 174, 173, 88, 56, 171, 22, 23, 39, 231, 247, 211, 241, + 93, 246, 186, 27, 159, 221, 215, 39, 135, 165, 120, 246, 174, 123, 93, 239, + 246, 149, 135, 68, 87, 29, 188, 101, 7, 151, 55, 106, 253, 252, 160, 20, + 139, 246, 235, 251, 209, 242, 227, 249, 88, 237, 182, 239, 206, 239, 172, 248, + 227, 149, 18, 189, 57, 235, 142, 82, 181, 195, 82, 253, 50, 85, 44, 204, + 19, 208, 188, 231, 233, 134, 245, 248, 214, 233, 228, 198, 177, 134, 53, 222, + 215, 198, 177, 59, 235, 82, 25, 220, 166, 238, 187, 143, 173, 250, 109, 33, + 61, 139, 63, 206, 140, 211, 227, 169, 49, 42, 164, 43, 119, 86, 169, 57, + 90, 12, 71, 231, 151, 7, 251, 237, 220, 165, 90, 137, 167, 227, 138, 146, + 188, 215, 226, 217, 171, 118, 191, 123, 123, 59, 173, 36, 161, 141, 212, 27, + 189, 95, 206, 171, 119, 247, 80, 245, 219, 234, 98, 84, 237, 95, 229, 238, + 27, 229, 196, 224, 53, 125, 2, 153, 90, 111, 229, 222, 232, 164, 251, 152, + 189, 61, 156, 188, 94, 106, 216, 45, 247, 229, 139, 232, 229, 77, 237, 60, + 29, 189, 239, 156, 165, 230, 199, 151, 215, 109, 163, 83, 110, 229, 70, 241, + 183, 253, 139, 104, 172, 19, 109, 149, 22, 169, 219, 219, 214, 221, 121, 231, + 124, 110, 78, 146, 51, 19, 166, 45, 179, 50, 156, 45, 14, 123, 201, 228, + 228, 34, 158, 24, 157, 31, 150, 219, 113, 237, 230, 237, 118, 124, 101, 238, + 215, 71, 55, 221, 98, 244, 182, 84, 238, 170, 253, 197, 241, 99, 207, 239, + 191, 219, 63, 156, 140, 79, 47, 219, 39, 157, 94, 245, 100, 113, 150, 27, + 164, 82, 234, 168, 99, 220, 169, 237, 108, 248, 124, 154, 47, 63, 150, 162, + 205, 156, 114, 52, 8, 31, 22, 46, 146, 139, 219, 187, 112, 186, 166, 102, + 155, 183, 111, 147, 155, 108, 170, 57, 172, 229, 230, 151, 233, 137, 81, 57, + 237, 188, 230, 167, 69, 189, 148, 28, 86, 6, 74, 189, 144, 188, 78, 158, + 23, 226, 48, 190, 178, 23, 99, 248, 16, 78, 39, 201, 124, 249, 184, 156, + 28, 60, 118, 155, 209, 215, 27, 232, 211, 249, 112, 60, 58, 24, 23, 38, + 55, 218, 107, 74, 125, 152, 135, 47, 15, 234, 134, 166, 61, 230, 234, 233, + 135, 74, 231, 184, 95, 188, 220, 127, 28, 207, 78, 114, 229, 171, 90, 122, + 58, 140, 54, 42, 55, 249, 222, 113, 174, 155, 136, 22, 138, 13, 156, 111, + 18, 245, 84, 101, 248, 152, 219, 63, 202, 103, 71, 179, 183, 94, 105, 210, + 136, 199, 238, 43, 183, 231, 241, 254, 81, 174, 171, 235, 154, 53, 60, 187, + 41, 38, 175, 203, 111, 215, 165, 51, 227, 166, 221, 209, 23, 37, 191, 95, + 213, 235, 122, 255, 36, 222, 157, 89, 251, 7, 189, 122, 229, 124, 208, 175, + 199, 243, 247, 229, 78, 167, 92, 190, 173, 198, 206, 172, 35, 43, 169, 143, + 30, 123, 225, 118, 255, 52, 29, 29, 135, 143, 123, 141, 147, 179, 82, 127, + 144, 152, 143, 38, 29, 248, 2, 210, 119, 167, 157, 222, 124, 52, 104, 220, + 171, 208, 225, 229, 121, 226, 218, 108, 52, 171, 103, 227, 114, 121, 146, 58, + 74, 92, 158, 231, 138, 106, 45, 221, 187, 52, 212, 179, 219, 147, 209, 252, + 38, 62, 31, 79, 202, 126, 255, 124, 97, 164, 154, 111, 135, 11, 165, 158, + 136, 46, 198, 183, 147, 203, 187, 236, 172, 221, 106, 188, 78, 47, 219, 209, + 133, 53, 81, 115, 181, 100, 77, 129, 143, 162, 58, 41, 212, 205, 155, 163, + 225, 209, 209, 197, 121, 226, 173, 146, 108, 47, 242, 39, 218, 93, 43, 254, + 152, 47, 166, 227, 189, 73, 57, 247, 118, 57, 204, 150, 103, 154, 113, 149, + 214, 23, 199, 181, 202, 227, 34, 245, 120, 94, 134, 146, 148, 227, 217, 210, + 219, 168, 210, 61, 81, 212, 112, 35, 26, 78, 140, 21, 191, 191, 222, 107, + 31, 156, 23, 122, 177, 226, 163, 94, 78, 84, 79, 194, 209, 147, 248, 197, + 225, 224, 81, 133, 73, 109, 81, 171, 28, 188, 62, 190, 53, 47, 22, 233, + 228, 121, 251, 178, 214, 237, 220, 221, 222, 118, 146, 181, 250, 121, 33, 217, + 40, 156, 190, 21, 142, 155, 198, 184, 172, 132, 47, 211, 139, 70, 39, 85, + 107, 41, 213, 86, 174, 145, 125, 53, 22, 195, 216, 227, 236, 1, 134, 116, + 103, 118, 223, 57, 47, 95, 63, 30, 84, 31, 74, 221, 161, 81, 73, 79, + 23, 197, 206, 172, 234, 247, 15, 187, 139, 89, 253, 188, 117, 124, 58, 83, + 122, 199, 167, 135, 143, 55, 7, 189, 179, 217, 227, 254, 245, 233, 126, 44, + 145, 27, 157, 164, 18, 185, 89, 182, 25, 141, 63, 180, 204, 88, 50, 170, + 183, 250, 181, 178, 122, 161, 165, 245, 250, 85, 173, 168, 68, 243, 195, 122, + 188, 87, 173, 117, 110, 59, 173, 253, 171, 243, 171, 226, 205, 219, 93, 34, + 223, 45, 60, 148, 14, 71, 201, 51, 189, 166, 212, 22, 185, 215, 253, 243, + 195, 94, 105, 95, 63, 75, 68, 167, 215, 39, 157, 187, 116, 173, 1, 159, + 204, 137, 25, 175, 77, 106, 183, 106, 254, 208, 72, 63, 190, 86, 46, 211, + 233, 138, 53, 219, 63, 169, 207, 181, 202, 213, 252, 212, 188, 189, 205, 222, + 29, 93, 166, 219, 241, 177, 213, 143, 13, 167, 233, 65, 42, 90, 62, 53, + 167, 189, 11, 51, 122, 147, 56, 74, 149, 143, 207, 238, 111, 239, 212, 202, + 109, 249, 190, 27, 173, 38, 110, 42, 133, 11, 152, 33, 14, 239, 11, 241, + 254, 96, 210, 127, 60, 28, 228, 171, 106, 51, 127, 222, 236, 158, 62, 158, + 12, 219, 143, 167, 181, 211, 250, 28, 154, 183, 221, 154, 85, 71, 119, 103, + 119, 55, 181, 131, 69, 174, 122, 48, 215, 148, 235, 209, 101, 231, 248, 58, + 85, 174, 53, 98, 58, 172, 77, 87, 245, 98, 59, 125, 94, 60, 157, 43, + 147, 69, 59, 169, 55, 96, 181, 28, 43, 121, 227, 228, 96, 218, 218, 79, + 166, 58, 71, 131, 253, 252, 236, 60, 254, 118, 122, 85, 235, 37, 47, 205, + 124, 90, 217, 191, 110, 212, 239, 122, 245, 233, 81, 120, 63, 222, 59, 202, + 215, 7, 122, 235, 241, 216, 186, 27, 215, 43, 131, 145, 158, 28, 194, 228, + 48, 110, 195, 164, 57, 78, 41, 119, 215, 149, 122, 5, 164, 130, 69, 187, + 91, 204, 29, 22, 123, 157, 194, 89, 61, 63, 135, 90, 157, 221, 29, 53, + 43, 134, 86, 61, 58, 59, 57, 109, 181, 222, 138, 137, 235, 183, 106, 109, + 127, 58, 175, 93, 220, 244, 239, 202, 157, 179, 251, 106, 254, 192, 60, 47, + 205, 7, 151, 133, 215, 235, 154, 209, 141, 165, 202, 106, 109, 81, 234, 132, + 175, 14, 230, 169, 90, 234, 238, 180, 180, 127, 144, 184, 184, 54, 79, 91, + 147, 98, 52, 60, 187, 59, 45, 248, 253, 237, 171, 236, 121, 55, 94, 124, + 53, 123, 71, 197, 215, 241, 67, 121, 0, 211, 199, 241, 184, 93, 56, 187, + 191, 183, 74, 237, 84, 118, 63, 85, 60, 187, 213, 238, 59, 173, 225, 69, + 117, 176, 63, 27, 153, 157, 183, 187, 238, 217, 254, 213, 233, 172, 150, 190, + 44, 148, 26, 179, 196, 193, 245, 252, 238, 85, 153, 205, 194, 221, 199, 243, + 182, 217, 58, 104, 150, 207, 230, 53, 235, 120, 81, 45, 222, 104, 169, 161, + 53, 156, 150, 74, 70, 254, 166, 253, 122, 121, 121, 124, 29, 59, 45, 150, + 154, 126, 255, 219, 249, 240, 181, 112, 115, 164, 229, 204, 88, 247, 178, 115, + 16, 190, 159, 95, 37, 47, 166, 141, 251, 171, 66, 193, 44, 150, 18, 141, + 235, 243, 59, 115, 146, 78, 135, 207, 230, 5, 227, 237, 49, 59, 157, 220, + 165, 178, 201, 241, 160, 147, 236, 89, 218, 180, 126, 112, 126, 60, 189, 190, + 61, 41, 133, 239, 78, 99, 173, 235, 243, 254, 77, 78, 43, 153, 15, 119, + 7, 211, 114, 54, 219, 236, 93, 30, 54, 219, 103, 135, 205, 216, 249, 241, + 126, 59, 118, 152, 53, 42, 173, 246, 233, 232, 10, 196, 149, 195, 146, 178, + 40, 154, 205, 121, 171, 94, 121, 75, 140, 7, 237, 166, 94, 139, 151, 202, + 133, 233, 227, 105, 238, 236, 188, 95, 40, 130, 140, 150, 106, 188, 166, 162, + 237, 193, 241, 34, 222, 200, 21, 247, 239, 194, 249, 92, 41, 187, 127, 149, + 186, 232, 79, 10, 113, 181, 144, 78, 155, 249, 171, 114, 236, 44, 125, 53, + 27, 118, 206, 138, 163, 216, 216, 44, 180, 244, 81, 254, 162, 149, 59, 60, + 60, 82, 218, 183, 231, 253, 187, 147, 254, 226, 242, 225, 226, 192, 184, 152, + 148, 114, 151, 71, 126, 255, 233, 204, 26, 62, 182, 242, 199, 195, 212, 100, + 154, 139, 14, 83, 74, 245, 40, 54, 72, 103, 143, 79, 218, 137, 187, 138, + 185, 255, 90, 44, 106, 215, 167, 157, 88, 239, 248, 160, 94, 238, 182, 38, + 135, 167, 251, 205, 163, 163, 78, 59, 223, 133, 47, 73, 211, 234, 230, 85, + 242, 40, 94, 236, 30, 151, 138, 211, 156, 113, 218, 132, 174, 232, 94, 158, + 101, 239, 78, 204, 70, 71, 73, 29, 246, 211, 202, 113, 188, 158, 219, 63, + 152, 156, 78, 167, 247, 166, 62, 122, 187, 186, 58, 234, 250, 253, 231, 137, + 92, 250, 232, 81, 63, 62, 126, 232, 116, 242, 102, 114, 156, 187, 88, 132, + 163, 49, 229, 230, 232, 160, 93, 62, 107, 148, 173, 97, 234, 36, 151, 187, + 60, 155, 157, 28, 164, 39, 73, 173, 122, 114, 125, 112, 126, 125, 112, 4, + 66, 226, 245, 168, 121, 109, 228, 23, 227, 171, 179, 104, 233, 182, 164, 116, + 115, 149, 180, 113, 82, 94, 204, 22, 151, 71, 177, 155, 220, 217, 253, 81, + 52, 246, 112, 52, 200, 14, 102, 247, 177, 253, 253, 163, 234, 205, 124, 255, + 170, 116, 113, 112, 95, 221, 7, 17, 244, 238, 170, 89, 142, 199, 138, 175, + 137, 131, 216, 221, 233, 172, 10, 53, 186, 188, 126, 59, 110, 92, 197, 97, + 4, 20, 15, 139, 23, 122, 188, 122, 209, 63, 110, 28, 148, 203, 151, 77, + 229, 100, 180, 48, 96, 66, 190, 134, 25, 248, 34, 61, 213, 110, 91, 249, + 177, 121, 124, 115, 212, 186, 43, 206, 111, 174, 38, 251, 163, 194, 126, 229, + 240, 104, 255, 53, 94, 201, 37, 38, 86, 60, 154, 43, 206, 247, 167, 87, + 151, 87, 167, 225, 232, 65, 172, 156, 143, 191, 197, 71, 214, 244, 28, 196, + 149, 253, 94, 248, 240, 54, 118, 115, 16, 171, 157, 26, 151, 185, 118, 50, + 151, 75, 182, 195, 23, 195, 195, 116, 114, 124, 209, 189, 185, 191, 159, 158, + 88, 165, 252, 85, 184, 89, 63, 105, 229, 140, 243, 217, 125, 246, 161, 153, + 63, 42, 29, 31, 220, 52, 15, 83, 163, 34, 8, 11, 231, 211, 253, 84, + 233, 237, 238, 170, 222, 87, 175, 222, 30, 222, 46, 59, 101, 88, 207, 166, + 137, 134, 218, 138, 105, 135, 189, 105, 190, 116, 157, 184, 191, 50, 238, 231, + 225, 219, 131, 43, 232, 223, 251, 253, 3, 191, 63, 117, 212, 57, 62, 125, + 40, 153, 243, 187, 214, 145, 149, 45, 207, 179, 185, 215, 94, 226, 204, 188, + 203, 119, 222, 174, 43, 215, 213, 69, 246, 246, 102, 162, 247, 239, 139, 81, + 61, 171, 54, 140, 166, 57, 141, 230, 10, 189, 242, 217, 209, 212, 60, 140, + 157, 87, 59, 183, 205, 78, 126, 127, 58, 238, 223, 236, 199, 78, 38, 55, + 83, 72, 229, 164, 241, 118, 52, 184, 235, 151, 172, 131, 228, 201, 201, 77, + 169, 22, 139, 194, 38, 102, 63, 28, 125, 109, 70, 39, 202, 101, 242, 53, + 22, 243, 251, 31, 242, 135, 173, 236, 85, 225, 112, 63, 219, 60, 217, 135, + 249, 247, 58, 59, 191, 187, 190, 125, 168, 153, 15, 157, 187, 183, 78, 65, + 29, 79, 174, 243, 55, 143, 179, 219, 217, 249, 237, 181, 89, 124, 141, 66, + 146, 251, 122, 177, 120, 215, 232, 12, 173, 218, 44, 149, 109, 85, 147, 173, + 212, 81, 249, 64, 121, 221, 111, 190, 149, 95, 143, 247, 139, 7, 240, 245, + 92, 220, 158, 215, 6, 249, 139, 99, 213, 120, 232, 94, 77, 95, 149, 211, + 108, 59, 209, 137, 214, 43, 167, 225, 209, 5, 124, 50, 149, 122, 234, 240, + 224, 244, 22, 230, 175, 219, 108, 253, 186, 4, 147, 78, 248, 246, 90, 169, + 29, 93, 231, 223, 14, 14, 219, 229, 211, 217, 219, 248, 250, 246, 181, 20, + 175, 117, 226, 189, 135, 139, 107, 99, 250, 182, 127, 53, 124, 173, 228, 203, + 195, 91, 99, 146, 76, 143, 146, 211, 131, 78, 161, 151, 203, 235, 179, 198, + 109, 225, 242, 122, 254, 122, 155, 125, 232, 158, 37, 186, 55, 183, 241, 92, + 169, 221, 61, 184, 109, 199, 223, 170, 237, 86, 243, 110, 254, 86, 187, 54, + 15, 154, 249, 91, 205, 239, 191, 73, 86, 155, 229, 104, 120, 120, 52, 153, + 232, 103, 39, 71, 97, 107, 90, 59, 40, 156, 63, 168, 151, 74, 226, 209, + 234, 223, 119, 213, 68, 169, 151, 123, 59, 43, 41, 106, 190, 30, 207, 245, + 179, 243, 135, 210, 252, 180, 217, 168, 204, 167, 141, 188, 101, 36, 172, 206, + 93, 84, 171, 235, 234, 172, 115, 209, 31, 29, 245, 30, 15, 251, 141, 211, + 179, 251, 222, 124, 174, 231, 46, 230, 175, 185, 69, 237, 188, 215, 27, 94, + 102, 155, 147, 217, 195, 29, 188, 123, 60, 111, 21, 77, 191, 191, 243, 26, + 110, 149, 110, 141, 196, 193, 101, 121, 114, 219, 60, 111, 199, 6, 179, 235, + 203, 252, 195, 254, 253, 241, 169, 122, 220, 47, 148, 172, 179, 212, 227, 177, + 57, 189, 136, 95, 102, 211, 209, 199, 108, 175, 182, 223, 187, 137, 157, 61, + 28, 53, 198, 103, 199, 215, 243, 131, 122, 161, 113, 56, 125, 180, 142, 250, + 167, 111, 201, 113, 165, 245, 154, 128, 205, 159, 149, 178, 218, 249, 135, 118, + 216, 216, 79, 233, 135, 179, 84, 169, 171, 92, 118, 134, 249, 115, 85, 235, + 181, 138, 131, 250, 217, 62, 44, 109, 241, 227, 106, 49, 223, 84, 38, 103, + 227, 244, 4, 90, 237, 112, 92, 108, 193, 50, 54, 54, 186, 233, 65, 34, + 124, 112, 118, 28, 181, 226, 215, 137, 155, 118, 220, 168, 155, 122, 167, 87, + 132, 140, 52, 109, 210, 49, 111, 79, 155, 111, 139, 209, 157, 166, 79, 143, + 78, 199, 211, 203, 203, 74, 47, 161, 193, 214, 245, 108, 209, 111, 28, 61, + 206, 26, 157, 254, 65, 46, 122, 127, 22, 62, 73, 63, 62, 214, 186, 185, + 217, 69, 250, 232, 36, 126, 217, 90, 60, 84, 98, 176, 136, 183, 143, 206, + 172, 236, 237, 105, 55, 127, 219, 215, 198, 119, 229, 215, 104, 98, 84, 86, + 204, 73, 226, 180, 219, 79, 88, 183, 15, 198, 233, 105, 123, 112, 123, 222, + 189, 120, 237, 92, 190, 41, 131, 203, 233, 109, 98, 28, 171, 157, 36, 174, + 203, 233, 252, 81, 120, 220, 158, 215, 238, 213, 227, 199, 114, 39, 209, 206, + 26, 141, 97, 56, 173, 118, 239, 207, 179, 181, 113, 242, 244, 205, 124, 157, + 188, 166, 206, 30, 210, 53, 163, 102, 188, 54, 244, 169, 90, 109, 46, 38, + 183, 227, 209, 253, 157, 223, 223, 170, 212, 172, 171, 78, 180, 124, 121, 152, + 62, 75, 207, 227, 230, 180, 124, 211, 215, 204, 209, 162, 182, 127, 172, 14, + 195, 197, 243, 89, 239, 166, 216, 59, 111, 37, 235, 55, 229, 233, 32, 117, + 253, 216, 233, 37, 194, 167, 201, 122, 218, 176, 30, 110, 202, 41, 173, 5, + 61, 153, 60, 190, 76, 228, 83, 138, 89, 57, 207, 39, 231, 139, 70, 118, + 95, 109, 119, 58, 147, 172, 174, 77, 96, 6, 140, 223, 134, 139, 23, 241, + 104, 82, 211, 96, 199, 121, 127, 120, 250, 160, 85, 252, 254, 166, 113, 218, + 59, 41, 12, 194, 103, 23, 133, 216, 245, 254, 45, 8, 185, 245, 113, 167, + 93, 205, 155, 151, 141, 233, 34, 29, 157, 25, 230, 236, 172, 112, 185, 168, + 54, 14, 187, 139, 170, 254, 122, 116, 122, 211, 61, 139, 38, 175, 238, 172, + 253, 92, 202, 74, 100, 27, 139, 108, 178, 80, 73, 78, 230, 143, 233, 126, + 247, 110, 114, 152, 187, 53, 99, 151, 214, 185, 214, 190, 152, 90, 251, 198, + 124, 104, 158, 29, 87, 102, 165, 163, 28, 204, 111, 218, 190, 58, 177, 46, + 166, 199, 97, 191, 95, 79, 63, 206, 178, 251, 23, 23, 213, 73, 95, 171, + 239, 183, 179, 195, 7, 29, 166, 238, 230, 25, 108, 188, 71, 177, 194, 97, + 246, 102, 60, 215, 234, 48, 127, 215, 173, 81, 234, 33, 95, 214, 234, 5, + 173, 219, 121, 211, 202, 181, 242, 227, 180, 30, 157, 106, 221, 88, 45, 17, + 29, 68, 227, 135, 247, 234, 99, 34, 122, 88, 57, 60, 207, 118, 30, 203, + 163, 212, 117, 227, 84, 171, 159, 150, 143, 210, 150, 217, 213, 162, 149, 152, + 94, 79, 143, 178, 241, 116, 226, 180, 114, 2, 163, 119, 82, 175, 247, 207, + 91, 39, 185, 74, 233, 30, 38, 136, 55, 173, 82, 223, 191, 72, 198, 114, + 199, 225, 226, 224, 62, 124, 115, 22, 139, 106, 7, 35, 171, 82, 63, 13, + 95, 171, 233, 251, 212, 93, 229, 110, 210, 40, 54, 207, 245, 249, 162, 29, + 61, 111, 133, 19, 163, 88, 85, 45, 38, 166, 141, 91, 104, 208, 99, 253, + 38, 117, 151, 59, 191, 171, 196, 174, 47, 235, 234, 109, 56, 154, 44, 164, + 82, 141, 177, 30, 143, 165, 179, 229, 110, 34, 214, 58, 155, 132, 247, 235, + 199, 176, 85, 204, 222, 212, 115, 23, 55, 221, 225, 185, 82, 104, 21, 98, + 247, 15, 221, 135, 55, 69, 123, 208, 14, 187, 147, 220, 21, 180, 230, 197, + 224, 84, 79, 222, 31, 180, 195, 106, 51, 155, 191, 186, 206, 142, 26, 167, + 181, 199, 55, 101, 24, 51, 95, 219, 48, 251, 150, 243, 175, 225, 162, 86, + 28, 192, 122, 29, 62, 43, 207, 18, 99, 189, 189, 184, 232, 159, 166, 178, + 225, 241, 224, 22, 132, 198, 68, 250, 116, 63, 109, 53, 181, 55, 253, 166, + 81, 153, 22, 26, 185, 227, 147, 75, 191, 255, 184, 102, 36, 135, 183, 199, + 74, 251, 177, 152, 186, 72, 149, 212, 115, 37, 190, 63, 79, 41, 173, 98, + 92, 107, 70, 179, 111, 53, 107, 113, 121, 99, 168, 189, 196, 213, 241, 219, + 91, 173, 18, 79, 214, 58, 253, 100, 165, 19, 133, 1, 114, 108, 52, 219, + 179, 220, 225, 149, 154, 59, 60, 66, 77, 15, 8, 32, 185, 243, 250, 217, + 108, 145, 142, 169, 166, 146, 143, 230, 22, 138, 126, 119, 51, 111, 247, 111, + 134, 177, 222, 162, 164, 95, 213, 148, 246, 104, 97, 38, 207, 252, 254, 139, + 244, 65, 113, 97, 54, 179, 230, 176, 90, 62, 214, 74, 237, 227, 183, 242, + 219, 113, 189, 212, 201, 79, 247, 247, 171, 165, 135, 171, 202, 85, 38, 227, + 247, 17, 146, 64, 216, 64, 159, 190, 151, 166, 209, 237, 26, 200, 68, 184, + 163, 196, 17, 209, 77, 103, 120, 110, 106, 92, 129, 139, 29, 186, 148, 76, + 98, 242, 21, 181, 223, 186, 212, 168, 50, 122, 95, 2, 156, 64, 136, 140, + 152, 140, 103, 201, 54, 123, 176, 175, 186, 99, 83, 33, 185, 112, 8, 92, + 29, 138, 22, 115, 195, 74, 207, 24, 212, 56, 236, 138, 74, 78, 29, 112, + 161, 225, 69, 175, 209, 24, 214, 71, 170, 125, 161, 201, 47, 134, 213, 236, + 212, 5, 83, 12, 215, 2, 131, 95, 107, 171, 214, 24, 66, 38, 191, 4, + 175, 74, 197, 200, 80, 169, 200, 6, 129, 21, 38, 195, 203, 194, 56, 56, + 168, 60, 156, 142, 67, 180, 81, 112, 44, 17, 4, 195, 4, 237, 19, 152, + 95, 161, 140, 186, 134, 62, 123, 120, 16, 160, 197, 201, 172, 202, 49, 153, + 71, 119, 56, 248, 69, 133, 164, 167, 225, 92, 42, 181, 141, 68, 216, 10, + 211, 236, 210, 79, 156, 253, 160, 130, 88, 22, 140, 24, 80, 235, 233, 53, + 186, 242, 54, 156, 215, 20, 0, 155, 101, 232, 26, 2, 176, 70, 25, 186, + 134, 0, 212, 48, 82, 32, 46, 213, 234, 205, 29, 209, 14, 0, 27, 196, + 199, 160, 47, 60, 134, 0, 38, 170, 79, 157, 0, 137, 44, 27, 223, 241, + 48, 254, 35, 170, 185, 96, 27, 54, 49, 19, 25, 68, 206, 23, 51, 209, + 100, 210, 195, 70, 79, 84, 231, 25, 212, 230, 246, 205, 168, 154, 82, 144, + 214, 76, 151, 223, 3, 122, 56, 128, 199, 251, 187, 226, 205, 95, 200, 17, + 23, 219, 125, 15, 196, 194, 1, 198, 233, 105, 95, 17, 22, 34, 163, 111, + 199, 252, 117, 2, 255, 32, 2, 120, 230, 3, 225, 178, 219, 191, 35, 95, + 73, 128, 114, 197, 19, 158, 200, 16, 207, 84, 248, 237, 238, 187, 120, 39, + 123, 162, 134, 164, 238, 182, 195, 210, 36, 230, 5, 9, 255, 78, 112, 155, + 225, 128, 246, 33, 237, 101, 200, 55, 135, 62, 215, 153, 3, 82, 64, 84, + 160, 4, 204, 8, 175, 138, 31, 37, 124, 2, 175, 228, 119, 237, 96, 72, + 38, 152, 7, 247, 4, 209, 66, 108, 34, 98, 197, 6, 47, 174, 154, 117, + 53, 173, 171, 222, 207, 38, 155, 59, 138, 96, 168, 68, 26, 107, 164, 124, + 192, 14, 172, 153, 6, 145, 155, 124, 246, 37, 5, 164, 184, 96, 78, 104, + 39, 206, 127, 5, 70, 150, 175, 101, 227, 250, 154, 5, 19, 201, 157, 248, + 110, 82, 135, 63, 170, 146, 166, 191, 120, 29, 87, 233, 82, 129, 191, 122, + 114, 87, 79, 132, 124, 65, 45, 5, 249, 107, 80, 241, 93, 53, 169, 202, + 41, 45, 141, 87, 241, 20, 92, 81, 88, 92, 151, 83, 232, 20, 187, 171, + 198, 146, 112, 165, 210, 149, 34, 167, 148, 24, 94, 193, 215, 151, 76, 211, + 149, 166, 202, 201, 36, 197, 83, 18, 114, 18, 226, 42, 187, 169, 148, 156, + 84, 240, 133, 255, 243, 37, 226, 114, 66, 215, 225, 50, 166, 201, 113, 29, + 179, 208, 48, 87, 124, 24, 151, 181, 52, 124, 188, 187, 208, 2, 73, 124, + 16, 147, 85, 53, 78, 233, 200, 41, 124, 3, 50, 79, 96, 60, 141, 17, + 164, 237, 234, 240, 2, 222, 67, 22, 104, 75, 185, 11, 69, 197, 104, 73, + 2, 139, 219, 77, 227, 80, 131, 151, 160, 160, 73, 42, 62, 140, 15, 124, + 11, 189, 132, 227, 26, 38, 163, 65, 241, 168, 0, 9, 116, 3, 166, 171, + 116, 74, 86, 99, 248, 154, 174, 67, 238, 73, 204, 93, 79, 194, 156, 66, + 79, 99, 10, 100, 24, 195, 58, 198, 32, 142, 198, 202, 136, 108, 109, 42, + 102, 27, 135, 56, 58, 213, 54, 169, 171, 114, 60, 1, 121, 133, 124, 179, + 124, 6, 238, 164, 121, 62, 3, 205, 233, 211, 56, 251, 173, 205, 113, 198, + 8, 6, 136, 197, 103, 190, 37, 133, 195, 56, 204, 112, 248, 182, 62, 28, + 18, 50, 73, 117, 73, 202, 102, 62, 221, 121, 65, 77, 136, 175, 171, 72, + 30, 31, 139, 32, 10, 19, 196, 142, 71, 152, 253, 7, 142, 91, 197, 55, + 187, 206, 36, 244, 132, 52, 191, 206, 196, 149, 152, 52, 59, 201, 104, 233, + 164, 52, 135, 31, 29, 238, 14, 50, 208, 153, 210, 252, 32, 147, 76, 198, + 124, 162, 47, 211, 8, 45, 181, 97, 50, 162, 211, 194, 58, 59, 199, 101, + 4, 188, 116, 69, 213, 240, 251, 113, 146, 197, 123, 191, 159, 150, 42, 126, + 197, 150, 45, 4, 143, 66, 4, 169, 29, 95, 120, 213, 57, 14, 113, 131, + 177, 186, 245, 72, 202, 5, 114, 101, 71, 64, 108, 102, 248, 249, 160, 221, + 85, 119, 3, 179, 235, 221, 192, 252, 122, 55, 2, 139, 47, 222, 157, 192, + 221, 137, 115, 119, 0, 119, 7, 252, 46, 189, 11, 29, 191, 171, 193, 95, + 232, 40, 85, 117, 126, 35, 176, 52, 192, 133, 70, 255, 244, 144, 111, 14, + 89, 171, 33, 183, 201, 89, 35, 170, 194, 132, 169, 113, 114, 243, 29, 58, + 189, 22, 221, 185, 154, 3, 19, 89, 201, 105, 62, 249, 157, 205, 32, 176, + 14, 41, 179, 44, 255, 31, 14, 71, 159, 71, 8, 240, 133, 183, 245, 26, + 195, 109, 120, 15, 78, 35, 169, 80, 52, 48, 203, 195, 84, 23, 108, 69, + 116, 13, 110, 230, 249, 15, 31, 114, 155, 211, 164, 4, 19, 41, 67, 80, + 209, 124, 97, 228, 62, 222, 33, 74, 145, 141, 104, 70, 36, 93, 48, 60, + 163, 40, 70, 134, 150, 91, 155, 86, 159, 168, 212, 37, 250, 209, 28, 106, + 117, 45, 37, 173, 70, 86, 105, 54, 68, 92, 157, 233, 7, 193, 235, 192, + 56, 181, 169, 215, 221, 20, 153, 163, 14, 67, 141, 219, 145, 98, 82, 4, + 159, 115, 95, 72, 27, 67, 220, 39, 64, 60, 145, 127, 164, 125, 107, 116, + 250, 45, 195, 211, 72, 170, 99, 126, 72, 131, 112, 7, 191, 201, 157, 20, + 14, 53, 21, 190, 80, 201, 206, 71, 103, 4, 52, 112, 197, 187, 135, 230, + 114, 15, 34, 48, 76, 240, 196, 219, 226, 218, 8, 96, 223, 106, 238, 196, + 14, 253, 224, 76, 237, 120, 94, 137, 166, 173, 100, 205, 143, 127, 174, 201, + 162, 255, 239, 216, 229, 219, 167, 233, 60, 209, 207, 214, 128, 125, 9, 17, + 221, 199, 4, 54, 179, 133, 13, 176, 133, 230, 172, 86, 141, 145, 154, 111, + 49, 18, 69, 36, 186, 249, 75, 11, 51, 123, 193, 191, 52, 145, 171, 236, + 127, 205, 192, 159, 87, 249, 159, 177, 240, 255, 119, 204, 89, 93, 153, 145, + 127, 201, 186, 98, 59, 105, 74, 235, 12, 244, 225, 74, 87, 208, 178, 100, + 201, 64, 223, 126, 199, 62, 198, 134, 232, 56, 38, 153, 116, 105, 15, 26, + 46, 63, 198, 152, 168, 232, 8, 142, 27, 236, 93, 227, 107, 236, 93, 157, + 246, 225, 105, 162, 139, 15, 55, 218, 167, 110, 227, 163, 36, 160, 175, 138, + 152, 142, 204, 24, 147, 157, 142, 1, 129, 210, 145, 31, 81, 90, 76, 216, + 226, 227, 26, 51, 86, 214, 13, 255, 86, 198, 94, 99, 218, 184, 157, 25, + 241, 159, 116, 204, 254, 176, 46, 57, 164, 157, 240, 159, 34, 115, 70, 81, + 251, 219, 67, 94, 198, 23, 14, 136, 242, 93, 66, 27, 22, 152, 32, 200, + 41, 245, 101, 0, 95, 248, 15, 132, 191, 151, 221, 48, 145, 110, 152, 44, + 206, 135, 125, 108, 187, 23, 156, 27, 97, 153, 97, 65, 156, 189, 65, 8, + 99, 182, 49, 20, 147, 22, 58, 8, 134, 148, 83, 238, 251, 100, 169, 195, + 25, 7, 96, 11, 53, 168, 27, 47, 93, 211, 98, 55, 157, 78, 111, 10, + 137, 118, 26, 47, 38, 58, 97, 13, 49, 255, 158, 181, 134, 197, 122, 223, + 67, 252, 69, 85, 131, 134, 66, 248, 40, 134, 146, 99, 90, 30, 232, 151, + 33, 194, 160, 193, 104, 166, 239, 179, 69, 64, 56, 163, 65, 175, 205, 172, + 138, 43, 29, 3, 54, 44, 21, 248, 211, 164, 178, 125, 134, 0, 233, 105, + 177, 12, 99, 45, 88, 219, 98, 25, 141, 153, 226, 136, 77, 150, 73, 209, + 214, 108, 169, 209, 50, 154, 34, 68, 181, 219, 44, 147, 22, 67, 157, 54, + 195, 143, 116, 203, 110, 51, 226, 68, 192, 109, 223, 134, 102, 67, 160, 30, + 111, 175, 251, 4, 171, 29, 129, 20, 65, 165, 190, 183, 119, 107, 154, 136, + 21, 153, 242, 208, 99, 105, 194, 93, 28, 138, 40, 90, 250, 64, 31, 47, + 219, 250, 248, 200, 196, 71, 113, 162, 217, 240, 63, 232, 81, 19, 18, 220, + 216, 126, 214, 125, 46, 163, 7, 111, 106, 9, 155, 159, 96, 40, 157, 16, + 177, 241, 137, 51, 129, 53, 29, 73, 68, 142, 221, 14, 124, 22, 54, 227, + 200, 210, 131, 152, 231, 5, 123, 191, 232, 4, 58, 29, 128, 246, 237, 18, + 193, 210, 161, 243, 48, 55, 112, 199, 166, 151, 196, 166, 31, 10, 32, 67, + 223, 2, 41, 153, 122, 8, 38, 239, 255, 243, 35, 11, 27, 191, 195, 249, + 201, 143, 147, 133, 61, 126, 92, 6, 21, 50, 12, 10, 48, 207, 144, 53, + 99, 139, 91, 195, 145, 81, 249, 210, 16, 11, 232, 190, 229, 241, 21, 136, + 249, 150, 7, 87, 32, 238, 91, 25, 89, 104, 20, 111, 15, 172, 64, 210, + 183, 97, 80, 13, 51, 239, 223, 160, 70, 31, 190, 23, 100, 87, 233, 32, + 160, 80, 198, 207, 105, 150, 124, 125, 75, 98, 216, 225, 182, 63, 131, 172, + 144, 17, 44, 251, 97, 255, 49, 132, 233, 8, 65, 255, 244, 251, 60, 126, + 132, 71, 183, 225, 167, 21, 251, 54, 226, 188, 203, 161, 9, 209, 247, 57, + 104, 118, 155, 50, 33, 196, 4, 153, 127, 81, 255, 55, 230, 108, 24, 150, + 250, 214, 83, 108, 27, 110, 181, 103, 184, 135, 12, 212, 13, 79, 225, 70, + 163, 24, 85, 99, 136, 128, 231, 223, 16, 38, 154, 146, 85, 16, 253, 18, + 254, 50, 104, 54, 244, 141, 213, 182, 221, 167, 42, 61, 85, 237, 167, 187, + 190, 111, 152, 192, 159, 79, 82, 159, 30, 96, 120, 176, 15, 233, 163, 243, + 112, 76, 122, 254, 142, 79, 17, 190, 6, 34, 8, 9, 99, 12, 120, 8, + 129, 66, 122, 244, 94, 132, 189, 71, 85, 237, 15, 234, 19, 179, 55, 30, + 126, 86, 221, 254, 167, 213, 237, 255, 183, 170, 27, 249, 155, 213, 13, 11, + 213, 197, 158, 213, 254, 19, 93, 27, 220, 80, 215, 63, 116, 94, 221, 224, + 134, 234, 254, 65, 16, 176, 159, 85, 137, 61, 212, 255, 220, 220, 147, 223, + 55, 13, 13, 167, 206, 250, 63, 89, 103, 88, 168, 84, 14, 90, 181, 166, + 198, 244, 92, 19, 158, 175, 244, 47, 111, 51, 132, 153, 66, 198, 55, 52, + 59, 102, 151, 26, 107, 43, 124, 160, 185, 15, 52, 124, 240, 31, 110, 163, + 73, 189, 26, 228, 173, 3, 243, 23, 21, 222, 141, 173, 80, 46, 33, 174, + 86, 35, 52, 221, 222, 48, 8, 241, 208, 12, 20, 166, 36, 188, 98, 233, + 172, 39, 80, 180, 62, 124, 46, 6, 177, 136, 66, 138, 220, 57, 22, 236, + 241, 184, 156, 224, 217, 58, 197, 100, 191, 0, 220, 229, 15, 240, 56, 126, + 25, 225, 89, 85, 121, 78, 127, 113, 103, 164, 203, 58, 155, 10, 67, 114, + 1, 241, 165, 158, 98, 207, 208, 12, 133, 167, 248, 243, 159, 17, 237, 187, + 34, 195, 101, 146, 46, 211, 116, 173, 211, 53, 202, 74, 112, 163, 210, 141, + 150, 84, 176, 125, 112, 95, 197, 255, 131, 202, 248, 37, 44, 89, 253, 133, + 249, 107, 15, 125, 141, 39, 231, 250, 89, 10, 184, 19, 243, 26, 160, 55, + 132, 67, 253, 17, 81, 49, 105, 24, 108, 12, 201, 216, 98, 63, 236, 47, + 195, 112, 173, 98, 155, 141, 25, 238, 7, 226, 21, 219, 160, 83, 35, 50, + 135, 149, 70, 63, 50, 113, 66, 115, 144, 237, 52, 156, 185, 74, 108, 142, + 62, 123, 147, 167, 79, 51, 183, 248, 216, 98, 143, 17, 184, 0, 99, 102, + 50, 24, 32, 11, 104, 26, 83, 120, 171, 62, 235, 7, 35, 176, 27, 139, + 234, 56, 60, 199, 225, 204, 116, 155, 202, 196, 222, 117, 238, 121, 90, 240, + 31, 27, 35, 65, 230, 145, 57, 198, 49, 50, 70, 127, 204, 109, 104, 86, + 244, 201, 252, 93, 79, 40, 4, 37, 16, 254, 219, 173, 182, 220, 78, 159, + 54, 193, 167, 45, 192, 158, 246, 157, 134, 230, 177, 237, 123, 94, 169, 26, + 222, 7, 33, 52, 34, 245, 199, 161, 168, 6, 223, 27, 34, 104, 192, 232, + 27, 14, 131, 79, 118, 15, 201, 8, 220, 92, 27, 195, 15, 38, 129, 248, + 16, 181, 113, 104, 123, 104, 54, 17, 163, 26, 191, 17, 14, 160, 128, 3, + 167, 58, 30, 76, 140, 209, 24, 164, 13, 214, 12, 238, 253, 63, 57, 126, + 24, 248, 136, 185, 43, 13, 199, 221, 41, 123, 247, 127, 98, 16, 65, 185, + 112, 216, 152, 244, 2, 205, 36, 248, 203, 38, 19, 188, 162, 182, 114, 34, + 89, 60, 146, 229, 68, 178, 156, 72, 88, 177, 112, 70, 67, 208, 19, 246, + 74, 20, 67, 132, 134, 102, 136, 87, 158, 246, 118, 248, 104, 120, 21, 108, + 86, 26, 104, 87, 149, 116, 106, 255, 250, 151, 185, 167, 134, 241, 234, 79, + 5, 27, 89, 66, 100, 107, 9, 161, 22, 231, 187, 82, 77, 104, 71, 216, + 238, 86, 234, 184, 17, 101, 237, 233, 222, 130, 164, 93, 251, 161, 107, 50, + 45, 47, 47, 152, 64, 159, 45, 53, 47, 152, 202, 27, 1, 108, 56, 111, + 42, 92, 12, 235, 51, 168, 66, 139, 93, 19, 144, 71, 159, 162, 243, 112, + 118, 77, 225, 65, 2, 145, 193, 246, 147, 251, 111, 161, 208, 94, 237, 207, + 32, 65, 238, 32, 144, 142, 147, 99, 159, 223, 224, 123, 253, 183, 93, 201, + 83, 218, 144, 144, 8, 108, 167, 55, 38, 178, 43, 125, 45, 17, 235, 147, + 146, 88, 95, 46, 9, 18, 115, 125, 161, 54, 159, 151, 227, 75, 197, 248, + 188, 20, 214, 151, 138, 97, 125, 222, 168, 155, 19, 17, 27, 245, 179, 68, + 172, 79, 74, 98, 253, 172, 36, 125, 254, 177, 190, 192, 208, 123, 179, 175, + 223, 232, 59, 169, 241, 207, 131, 125, 0, 47, 168, 250, 48, 125, 203, 170, + 236, 167, 53, 31, 15, 161, 137, 192, 218, 183, 254, 217, 154, 111, 109, 77, + 162, 171, 169, 237, 72, 194, 43, 132, 198, 77, 19, 204, 114, 106, 254, 208, + 94, 38, 232, 15, 172, 110, 214, 252, 191, 135, 162, 65, 230, 253, 100, 186, + 83, 19, 171, 150, 63, 68, 180, 80, 62, 115, 47, 67, 238, 97, 59, 90, + 92, 222, 144, 134, 159, 193, 114, 191, 52, 154, 236, 108, 27, 11, 214, 174, + 207, 25, 209, 59, 161, 226, 230, 247, 20, 31, 50, 163, 241, 99, 142, 136, + 19, 135, 176, 223, 80, 12, 112, 226, 19, 22, 250, 160, 206, 209, 82, 57, + 235, 29, 130, 247, 152, 236, 107, 134, 44, 145, 120, 81, 34, 108, 40, 127, + 192, 73, 195, 47, 35, 124, 81, 219, 232, 247, 13, 38, 37, 174, 109, 8, + 150, 34, 197, 218, 227, 41, 161, 132, 234, 91, 77, 203, 89, 16, 88, 146, + 207, 68, 104, 71, 113, 88, 57, 253, 178, 253, 62, 204, 176, 246, 165, 250, + 204, 25, 114, 88, 5, 108, 252, 31, 116, 180, 134, 21, 201, 238, 74, 39, + 31, 244, 147, 209, 185, 23, 226, 74, 97, 101, 177, 55, 100, 183, 125, 200, + 139, 219, 66, 183, 101, 183, 192, 33, 76, 193, 145, 9, 100, 239, 88, 113, + 167, 107, 108, 116, 171, 14, 91, 99, 46, 25, 50, 78, 99, 177, 60, 126, + 31, 242, 24, 35, 233, 128, 66, 66, 57, 109, 187, 113, 245, 202, 97, 229, + 157, 28, 252, 114, 17, 42, 118, 203, 183, 192, 202, 6, 200, 121, 246, 178, + 136, 59, 207, 66, 158, 218, 12, 204, 30, 215, 55, 26, 125, 245, 72, 138, + 13, 64, 177, 224, 144, 7, 54, 109, 145, 173, 92, 237, 80, 8, 105, 13, + 153, 136, 228, 36, 227, 8, 207, 183, 200, 28, 56, 221, 22, 100, 104, 175, + 8, 141, 255, 61, 73, 69, 72, 136, 139, 87, 183, 152, 236, 237, 178, 120, + 197, 216, 41, 54, 181, 164, 207, 6, 253, 211, 157, 33, 110, 152, 131, 225, + 82, 11, 218, 204, 205, 14, 148, 25, 199, 126, 35, 14, 5, 98, 159, 144, + 172, 25, 71, 128, 155, 201, 92, 78, 129, 98, 51, 68, 55, 44, 63, 140, + 92, 175, 210, 195, 207, 235, 137, 212, 6, 85, 26, 249, 51, 168, 85, 206, + 162, 75, 11, 175, 145, 78, 34, 87, 229, 157, 118, 131, 55, 150, 219, 131, + 252, 161, 238, 54, 23, 4, 242, 72, 66, 96, 161, 68, 253, 201, 91, 176, + 228, 52, 97, 137, 218, 176, 112, 35, 62, 189, 113, 158, 222, 208, 211, 18, + 62, 189, 65, 158, 9, 47, 97, 100, 233, 134, 64, 224, 134, 132, 4, 219, + 27, 5, 11, 37, 57, 82, 184, 97, 178, 46, 134, 25, 152, 30, 62, 183, + 187, 1, 166, 220, 177, 209, 65, 69, 24, 27, 27, 56, 159, 48, 82, 201, + 168, 211, 44, 92, 59, 228, 15, 73, 219, 60, 14, 79, 26, 114, 195, 200, + 120, 115, 131, 55, 161, 40, 149, 197, 142, 69, 229, 136, 240, 182, 230, 83, + 1, 207, 109, 79, 97, 3, 20, 58, 141, 56, 179, 217, 135, 142, 189, 235, + 15, 33, 97, 12, 131, 183, 19, 66, 101, 109, 27, 33, 111, 249, 177, 45, + 17, 100, 63, 121, 158, 195, 83, 155, 145, 155, 231, 33, 207, 100, 24, 4, + 206, 112, 20, 249, 182, 151, 94, 244, 36, 75, 184, 226, 239, 246, 115, 121, + 250, 33, 13, 123, 131, 209, 147, 29, 240, 44, 69, 144, 71, 130, 243, 90, + 58, 161, 56, 171, 108, 254, 240, 33, 15, 251, 58, 243, 30, 216, 164, 47, + 251, 211, 150, 85, 191, 7, 132, 151, 233, 200, 194, 153, 127, 40, 183, 16, + 159, 192, 89, 121, 16, 37, 92, 148, 196, 97, 248, 115, 5, 58, 244, 116, + 173, 142, 51, 164, 35, 76, 43, 36, 76, 163, 72, 29, 206, 212, 64, 156, + 30, 233, 16, 56, 218, 14, 142, 52, 250, 69, 216, 67, 156, 144, 184, 11, + 45, 194, 220, 140, 116, 121, 164, 201, 35, 25, 62, 223, 172, 76, 84, 90, + 152, 232, 111, 48, 236, 48, 34, 122, 237, 82, 52, 125, 27, 98, 105, 219, + 35, 212, 200, 241, 152, 248, 237, 193, 76, 3, 49, 49, 231, 255, 151, 189, + 55, 111, 111, 219, 72, 246, 133, 255, 199, 167, 128, 25, 120, 196, 5, 160, + 176, 144, 148, 100, 25, 246, 216, 201, 25, 103, 158, 39, 246, 76, 236, 156, + 55, 201, 40, 50, 47, 69, 82, 38, 19, 110, 230, 34, 17, 100, 120, 62, + 251, 91, 75, 111, 88, 72, 81, 73, 230, 204, 156, 123, 238, 76, 44, 2, + 141, 94, 170, 247, 234, 234, 170, 95, 161, 173, 110, 111, 137, 96, 138, 120, + 129, 72, 174, 88, 123, 127, 23, 190, 70, 121, 146, 17, 140, 183, 152, 59, + 193, 53, 189, 125, 199, 111, 56, 175, 104, 180, 148, 211, 187, 6, 198, 103, + 133, 163, 202, 115, 99, 175, 52, 5, 160, 104, 53, 110, 21, 164, 251, 238, + 161, 116, 46, 207, 241, 130, 18, 43, 230, 180, 47, 200, 185, 146, 94, 9, + 246, 18, 29, 85, 178, 235, 195, 94, 58, 141, 168, 5, 51, 95, 77, 84, + 37, 161, 45, 85, 245, 106, 240, 123, 150, 153, 37, 239, 252, 216, 89, 216, + 211, 56, 197, 233, 72, 128, 72, 247, 188, 223, 126, 105, 11, 56, 36, 155, + 132, 14, 36, 136, 69, 89, 6, 93, 239, 186, 210, 187, 161, 112, 56, 104, + 195, 185, 211, 254, 224, 126, 231, 34, 225, 85, 92, 155, 248, 225, 59, 248, + 128, 194, 33, 26, 40, 52, 72, 48, 243, 83, 89, 44, 213, 150, 70, 30, + 227, 98, 182, 249, 184, 24, 16, 156, 228, 226, 126, 200, 248, 117, 18, 179, + 93, 142, 125, 61, 98, 140, 217, 7, 155, 28, 137, 175, 158, 196, 70, 94, + 180, 53, 232, 156, 46, 109, 227, 91, 252, 196, 120, 145, 88, 159, 58, 238, + 139, 144, 78, 83, 162, 61, 124, 13, 240, 41, 113, 65, 197, 71, 185, 239, + 176, 216, 188, 179, 214, 252, 28, 245, 159, 148, 166, 43, 119, 69, 50, 32, + 21, 175, 41, 191, 98, 6, 52, 225, 177, 214, 97, 181, 92, 144, 107, 141, + 88, 107, 226, 1, 114, 31, 159, 35, 51, 96, 180, 20, 53, 146, 177, 226, + 32, 183, 17, 99, 242, 7, 99, 253, 26, 11, 144, 241, 124, 163, 167, 99, + 146, 163, 14, 216, 138, 145, 187, 168, 196, 88, 190, 162, 159, 110, 72, 168, + 237, 190, 69, 137, 230, 183, 52, 30, 83, 9, 220, 144, 253, 3, 216, 101, + 43, 159, 245, 183, 200, 180, 124, 43, 56, 193, 198, 37, 93, 76, 212, 226, + 242, 183, 176, 104, 252, 9, 143, 197, 129, 247, 45, 137, 253, 202, 24, 177, + 246, 228, 91, 62, 142, 127, 43, 206, 25, 97, 62, 191, 138, 107, 125, 251, + 36, 254, 150, 110, 161, 106, 53, 38, 243, 121, 172, 155, 92, 52, 107, 254, + 3, 38, 192, 210, 95, 196, 5, 189, 39, 190, 61, 207, 247, 134, 107, 21, + 13, 32, 3, 90, 182, 184, 57, 169, 101, 168, 155, 143, 108, 78, 149, 0, + 216, 169, 255, 215, 156, 185, 209, 233, 61, 118, 116, 202, 4, 210, 249, 233, + 255, 107, 206, 220, 232, 244, 30, 59, 58, 61, 225, 43, 238, 127, 103, 115, + 250, 191, 105, 45, 109, 24, 205, 123, 212, 34, 250, 64, 179, 98, 30, 135, + 26, 204, 62, 220, 96, 199, 175, 90, 135, 9, 47, 88, 174, 254, 149, 132, + 155, 235, 195, 3, 45, 158, 95, 24, 254, 245, 45, 238, 29, 221, 226, 169, + 41, 248, 207, 39, 60, 51, 230, 139, 152, 12, 100, 140, 121, 210, 188, 12, + 158, 21, 198, 248, 19, 99, 65, 155, 236, 86, 173, 118, 224, 176, 112, 89, + 252, 249, 59, 245, 217, 248, 207, 254, 43, 137, 40, 82, 7, 189, 56, 190, + 50, 40, 32, 177, 124, 90, 36, 81, 112, 32, 99, 77, 139, 125, 39, 50, + 100, 180, 197, 13, 135, 62, 127, 125, 128, 225, 191, 172, 138, 35, 61, 157, + 185, 42, 197, 231, 160, 245, 111, 59, 204, 172, 31, 56, 169, 172, 179, 103, + 143, 195, 71, 9, 58, 153, 48, 229, 239, 62, 84, 225, 80, 146, 86, 46, + 65, 97, 96, 225, 121, 226, 195, 119, 167, 84, 255, 203, 212, 218, 152, 97, + 246, 253, 125, 204, 190, 104, 215, 125, 51, 224, 145, 220, 62, 10, 63, 14, + 50, 252, 113, 28, 186, 230, 1, 72, 46, 225, 151, 60, 94, 68, 5, 151, + 255, 19, 152, 127, 209, 114, 133, 220, 191, 175, 185, 255, 3, 209, 126, 141, + 27, 149, 227, 186, 33, 179, 103, 5, 255, 36, 254, 63, 124, 44, 75, 16, + 253, 155, 179, 4, 199, 237, 164, 71, 53, 231, 111, 224, 255, 255, 23, 53, + 167, 185, 191, 31, 55, 58, 31, 207, 255, 255, 47, 106, 78, 147, 235, 120, + 196, 232, 124, 20, 255, 255, 127, 93, 115, 250, 191, 109, 49, 13, 255, 224, + 3, 64, 160, 185, 186, 194, 22, 251, 195, 14, 0, 135, 9, 127, 252, 1, + 224, 159, 74, 184, 185, 64, 60, 208, 226, 143, 62, 0, 252, 55, 180, 184, + 119, 116, 139, 63, 230, 0, 240, 7, 16, 158, 29, 244, 15, 156, 0, 252, + 103, 133, 7, 128, 40, 195, 255, 219, 121, 6, 95, 50, 201, 25, 222, 62, + 207, 203, 227, 125, 175, 239, 180, 209, 195, 87, 91, 165, 23, 151, 61, 146, + 197, 103, 24, 86, 188, 70, 22, 233, 172, 201, 56, 157, 143, 51, 25, 231, + 192, 250, 165, 237, 69, 206, 168, 105, 78, 150, 77, 89, 27, 241, 2, 3, + 39, 116, 216, 91, 171, 60, 100, 230, 36, 203, 249, 223, 100, 231, 36, 235, + 252, 111, 106, 232, 36, 201, 59, 100, 233, 100, 252, 226, 229, 115, 129, 233, + 147, 204, 197, 180, 125, 34, 251, 39, 101, 1, 197, 100, 220, 142, 166, 211, + 158, 28, 102, 109, 26, 103, 237, 13, 251, 195, 153, 142, 250, 115, 84, 42, + 35, 43, 26, 152, 46, 3, 232, 218, 140, 201, 128, 246, 219, 94, 0, 87, + 144, 25, 129, 127, 193, 146, 60, 108, 207, 156, 227, 74, 246, 130, 168, 71, + 39, 53, 46, 181, 155, 34, 226, 64, 15, 36, 241, 134, 225, 9, 84, 100, + 126, 45, 36, 57, 131, 99, 240, 152, 206, 129, 230, 243, 69, 123, 21, 245, + 13, 26, 30, 211, 5, 86, 202, 71, 12, 231, 247, 169, 179, 90, 44, 134, + 48, 150, 9, 14, 248, 211, 184, 195, 46, 135, 232, 49, 212, 51, 58, 61, + 91, 59, 218, 107, 148, 74, 159, 159, 167, 18, 172, 64, 53, 30, 205, 77, + 4, 52, 232, 245, 239, 134, 29, 54, 28, 33, 223, 47, 243, 33, 100, 71, + 1, 7, 17, 33, 144, 186, 56, 34, 59, 33, 34, 47, 230, 32, 209, 84, + 18, 13, 162, 192, 253, 132, 166, 18, 7, 90, 4, 97, 77, 29, 201, 177, + 140, 54, 16, 54, 119, 80, 12, 26, 219, 17, 148, 67, 214, 249, 60, 163, + 51, 20, 213, 63, 229, 118, 187, 168, 178, 210, 6, 14, 233, 21, 54, 55, + 17, 97, 52, 148, 172, 85, 204, 200, 4, 145, 84, 219, 216, 89, 119, 49, + 67, 23, 24, 65, 61, 180, 102, 33, 236, 233, 123, 119, 192, 88, 235, 218, + 123, 248, 40, 80, 120, 238, 240, 184, 133, 90, 236, 112, 96, 248, 85, 7, + 147, 157, 162, 97, 146, 240, 127, 32, 210, 0, 37, 163, 16, 145, 224, 57, + 77, 136, 105, 194, 194, 52, 152, 95, 112, 90, 14, 171, 164, 122, 115, 10, + 51, 122, 20, 84, 62, 162, 61, 14, 166, 202, 124, 9, 249, 203, 43, 200, + 110, 20, 84, 157, 21, 252, 87, 131, 208, 170, 115, 7, 255, 237, 172, 215, + 241, 182, 12, 31, 60, 140, 72, 95, 33, 236, 75, 17, 23, 99, 112, 92, + 76, 149, 115, 17, 65, 58, 236, 190, 59, 217, 165, 208, 38, 122, 139, 120, + 219, 131, 21, 103, 177, 131, 13, 206, 146, 32, 14, 129, 123, 242, 67, 188, + 246, 160, 44, 116, 227, 115, 26, 238, 46, 127, 140, 19, 124, 29, 136, 87, + 231, 85, 245, 135, 234, 15, 53, 40, 235, 53, 60, 252, 88, 115, 190, 172, + 254, 88, 253, 241, 196, 66, 168, 99, 84, 161, 181, 231, 2, 16, 194, 233, + 45, 216, 19, 219, 56, 231, 22, 152, 28, 194, 194, 176, 185, 186, 93, 77, + 72, 255, 161, 77, 99, 0, 102, 205, 108, 52, 93, 182, 151, 201, 12, 246, + 194, 187, 254, 124, 217, 95, 139, 151, 4, 181, 7, 224, 111, 103, 253, 224, + 38, 121, 2, 155, 216, 120, 53, 234, 156, 184, 109, 224, 188, 167, 163, 213, + 146, 93, 186, 238, 207, 124, 141, 153, 175, 41, 239, 71, 148, 115, 96, 51, + 150, 213, 18, 21, 61, 236, 82, 71, 18, 117, 34, 247, 70, 88, 132, 227, + 9, 46, 249, 176, 18, 199, 184, 127, 45, 224, 9, 102, 237, 76, 62, 71, + 241, 77, 103, 110, 239, 140, 76, 140, 234, 20, 103, 195, 10, 109, 152, 143, + 27, 197, 164, 19, 78, 57, 53, 220, 102, 204, 182, 166, 248, 214, 114, 207, + 226, 197, 231, 21, 28, 93, 22, 169, 220, 255, 85, 94, 127, 242, 62, 98, + 101, 91, 241, 230, 108, 212, 154, 3, 176, 247, 98, 236, 188, 216, 183, 203, + 157, 213, 114, 90, 57, 202, 17, 143, 42, 240, 152, 189, 163, 134, 206, 62, + 200, 14, 228, 102, 180, 154, 147, 3, 217, 136, 236, 255, 150, 87, 108, 81, + 223, 27, 222, 225, 73, 32, 168, 55, 185, 251, 5, 196, 182, 27, 42, 67, + 120, 129, 219, 96, 124, 14, 205, 207, 2, 204, 193, 248, 28, 165, 63, 51, + 194, 3, 185, 161, 85, 112, 40, 8, 127, 32, 240, 136, 218, 107, 225, 199, + 142, 94, 18, 229, 212, 142, 224, 110, 218, 204, 23, 136, 151, 228, 145, 102, + 245, 235, 196, 163, 130, 254, 45, 157, 68, 229, 57, 57, 81, 227, 88, 214, + 182, 0, 244, 232, 55, 51, 120, 212, 14, 105, 184, 137, 166, 193, 134, 21, + 121, 113, 42, 72, 146, 70, 168, 8, 207, 17, 70, 41, 104, 89, 162, 55, + 53, 72, 146, 48, 160, 13, 77, 20, 252, 44, 66, 82, 32, 13, 221, 9, + 33, 201, 105, 21, 27, 188, 183, 138, 29, 60, 201, 110, 125, 28, 98, 146, + 178, 58, 111, 26, 230, 238, 45, 251, 176, 219, 36, 136, 144, 118, 151, 84, + 236, 206, 233, 247, 83, 148, 34, 163, 117, 132, 247, 166, 150, 244, 222, 164, + 29, 221, 10, 207, 112, 101, 56, 220, 145, 117, 217, 106, 130, 54, 93, 200, + 61, 207, 186, 75, 56, 70, 138, 167, 248, 234, 228, 11, 136, 114, 114, 173, + 66, 174, 72, 221, 80, 70, 196, 163, 245, 117, 28, 183, 79, 158, 158, 84, + 178, 10, 188, 35, 161, 181, 75, 78, 7, 232, 184, 43, 11, 5, 246, 228, + 37, 235, 140, 223, 127, 241, 75, 21, 222, 200, 67, 159, 112, 88, 250, 178, + 108, 65, 237, 145, 38, 51, 69, 84, 121, 137, 223, 217, 255, 94, 229, 41, + 62, 139, 242, 240, 114, 2, 18, 184, 246, 250, 57, 228, 6, 63, 53, 194, + 9, 131, 142, 99, 55, 129, 101, 8, 244, 66, 58, 43, 175, 221, 1, 201, + 2, 28, 212, 67, 23, 237, 85, 130, 71, 106, 167, 146, 56, 70, 23, 144, + 27, 74, 114, 7, 72, 110, 88, 33, 79, 129, 7, 201, 109, 72, 114, 209, + 15, 96, 138, 220, 68, 146, 155, 60, 31, 32, 185, 73, 49, 185, 190, 155, + 184, 247, 108, 80, 119, 136, 92, 52, 182, 225, 137, 249, 51, 174, 39, 159, + 17, 168, 4, 14, 20, 56, 180, 78, 210, 155, 57, 123, 70, 5, 222, 132, + 61, 111, 192, 242, 8, 43, 230, 175, 255, 197, 103, 41, 250, 221, 136, 223, + 174, 248, 85, 203, 231, 149, 120, 106, 143, 59, 139, 95, 224, 3, 138, 59, + 204, 160, 195, 76, 3, 151, 39, 202, 63, 180, 192, 150, 37, 249, 63, 159, + 84, 234, 63, 77, 180, 31, 145, 91, 242, 105, 7, 103, 92, 242, 209, 14, + 13, 178, 129, 51, 2, 236, 72, 157, 249, 167, 21, 25, 179, 247, 241, 140, + 79, 211, 168, 99, 159, 252, 23, 44, 127, 67, 152, 58, 124, 54, 131, 37, + 21, 152, 55, 46, 16, 242, 190, 209, 71, 23, 121, 106, 193, 245, 122, 142, + 28, 57, 170, 238, 218, 132, 215, 82, 193, 128, 1, 57, 139, 135, 133, 187, + 131, 198, 93, 195, 244, 113, 228, 63, 23, 43, 116, 59, 159, 201, 0, 56, + 12, 98, 79, 70, 253, 219, 165, 247, 243, 106, 177, 228, 22, 248, 213, 134, + 53, 52, 86, 103, 4, 228, 91, 230, 40, 125, 48, 162, 236, 14, 44, 247, + 235, 24, 15, 142, 221, 130, 69, 222, 236, 132, 130, 149, 62, 219, 79, 4, + 137, 80, 184, 247, 163, 45, 39, 44, 235, 79, 93, 252, 215, 226, 127, 66, + 101, 153, 118, 255, 16, 77, 63, 67, 129, 47, 228, 54, 237, 219, 121, 103, + 44, 190, 224, 14, 206, 89, 209, 150, 14, 97, 232, 44, 132, 28, 134, 164, + 119, 114, 66, 18, 56, 224, 214, 246, 247, 203, 136, 168, 132, 255, 33, 91, + 248, 31, 41, 140, 105, 194, 145, 150, 234, 110, 56, 135, 189, 103, 161, 203, + 128, 68, 46, 205, 180, 200, 69, 56, 133, 243, 93, 211, 172, 215, 216, 175, + 113, 79, 167, 56, 244, 73, 71, 204, 196, 49, 250, 149, 252, 183, 30, 229, + 179, 56, 39, 128, 121, 168, 83, 57, 235, 7, 187, 246, 128, 231, 222, 240, + 104, 73, 202, 30, 207, 187, 186, 134, 208, 162, 87, 112, 212, 118, 241, 95, + 243, 186, 160, 109, 45, 179, 53, 12, 119, 187, 97, 22, 4, 4, 97, 66, + 42, 102, 0, 98, 63, 26, 168, 32, 212, 26, 70, 221, 165, 172, 192, 147, + 44, 65, 158, 133, 72, 251, 217, 77, 163, 60, 22, 176, 45, 236, 201, 145, + 115, 71, 188, 208, 6, 177, 89, 138, 113, 177, 179, 254, 24, 209, 41, 92, + 222, 203, 174, 233, 100, 119, 103, 37, 249, 56, 33, 198, 209, 30, 118, 119, + 214, 58, 200, 197, 137, 116, 62, 184, 189, 67, 62, 249, 56, 13, 157, 15, + 238, 169, 59, 139, 229, 214, 241, 86, 218, 233, 66, 11, 160, 234, 65, 179, + 116, 105, 253, 157, 220, 238, 146, 131, 57, 220, 47, 19, 224, 45, 209, 75, + 125, 32, 67, 3, 10, 13, 40, 148, 116, 254, 255, 142, 74, 18, 127, 71, + 133, 12, 138, 226, 245, 232, 174, 163, 71, 87, 31, 215, 167, 202, 192, 136, + 13, 139, 255, 94, 169, 84, 151, 3, 180, 68, 102, 205, 144, 43, 72, 9, + 201, 39, 46, 254, 214, 232, 55, 80, 191, 16, 110, 227, 133, 29, 240, 166, + 98, 131, 135, 195, 169, 195, 180, 235, 246, 86, 222, 193, 129, 71, 227, 225, + 56, 134, 78, 235, 143, 110, 230, 211, 37, 12, 164, 141, 63, 119, 55, 254, + 208, 221, 4, 240, 27, 12, 221, 54, 108, 168, 180, 227, 76, 218, 18, 139, + 8, 154, 234, 231, 213, 104, 216, 49, 69, 157, 93, 72, 6, 127, 134, 106, + 206, 21, 45, 163, 186, 160, 83, 202, 0, 215, 246, 238, 18, 22, 196, 71, + 205, 182, 20, 65, 18, 153, 71, 209, 68, 111, 64, 77, 12, 196, 40, 28, + 86, 61, 35, 139, 68, 116, 70, 253, 189, 16, 38, 153, 135, 27, 13, 2, + 42, 134, 13, 68, 218, 132, 74, 214, 240, 156, 106, 163, 180, 10, 184, 90, + 44, 58, 234, 209, 142, 228, 249, 245, 80, 53, 226, 252, 134, 176, 179, 88, + 14, 211, 190, 39, 161, 191, 218, 97, 212, 187, 184, 165, 232, 140, 241, 184, + 187, 234, 245, 201, 155, 217, 124, 166, 97, 154, 38, 195, 197, 116, 9, 123, + 100, 34, 128, 154, 102, 131, 142, 16, 138, 66, 3, 175, 150, 237, 17, 121, + 62, 227, 103, 20, 229, 154, 110, 208, 222, 67, 239, 194, 198, 34, 104, 25, + 13, 127, 233, 171, 35, 197, 227, 154, 216, 168, 66, 12, 117, 52, 118, 14, + 29, 26, 104, 32, 220, 6, 193, 51, 169, 58, 113, 39, 168, 122, 65, 220, + 134, 146, 148, 202, 218, 177, 15, 53, 189, 93, 82, 69, 33, 176, 165, 132, + 172, 113, 80, 87, 43, 40, 215, 59, 150, 117, 222, 47, 89, 16, 85, 119, + 45, 213, 31, 74, 174, 10, 245, 96, 201, 42, 144, 206, 162, 213, 70, 51, + 13, 143, 91, 111, 136, 227, 95, 253, 92, 64, 228, 214, 91, 12, 146, 27, + 112, 146, 139, 216, 127, 138, 191, 129, 143, 227, 238, 169, 150, 204, 30, 110, + 248, 244, 218, 201, 220, 233, 189, 112, 150, 27, 232, 83, 159, 12, 10, 221, + 180, 136, 214, 181, 84, 203, 50, 124, 146, 108, 88, 113, 66, 147, 77, 202, + 136, 73, 216, 142, 182, 115, 134, 168, 28, 208, 136, 182, 115, 46, 14, 113, + 43, 4, 66, 187, 112, 157, 192, 199, 21, 121, 177, 134, 85, 47, 172, 102, + 164, 188, 246, 34, 161, 224, 140, 60, 216, 190, 37, 136, 143, 117, 213, 89, + 172, 107, 9, 252, 77, 106, 67, 60, 74, 177, 159, 75, 97, 15, 140, 164, + 1, 61, 232, 10, 242, 204, 117, 206, 113, 121, 233, 218, 92, 160, 61, 17, + 254, 212, 228, 84, 217, 208, 68, 161, 251, 49, 196, 123, 22, 206, 182, 113, + 80, 247, 71, 35, 225, 27, 48, 227, 219, 143, 18, 101, 165, 250, 16, 209, + 28, 7, 20, 39, 194, 59, 7, 129, 165, 104, 179, 97, 36, 158, 178, 152, + 0, 81, 116, 198, 235, 115, 16, 7, 77, 225, 245, 89, 96, 41, 203, 47, + 36, 134, 175, 8, 185, 65, 234, 75, 20, 135, 210, 83, 116, 244, 194, 47, + 21, 56, 206, 11, 137, 30, 196, 175, 21, 40, 82, 43, 216, 88, 97, 83, + 65, 110, 73, 5, 132, 20, 80, 177, 24, 79, 142, 32, 76, 154, 118, 237, + 22, 161, 38, 13, 212, 236, 246, 167, 254, 4, 23, 189, 126, 155, 42, 64, + 145, 173, 246, 156, 6, 29, 5, 213, 113, 172, 160, 217, 220, 21, 190, 93, + 103, 19, 60, 179, 122, 83, 116, 74, 11, 25, 254, 217, 11, 119, 118, 34, + 30, 97, 63, 136, 209, 163, 169, 179, 70, 47, 158, 192, 140, 144, 126, 5, + 12, 151, 97, 15, 81, 215, 124, 107, 53, 139, 189, 0, 121, 206, 97, 153, + 226, 84, 254, 116, 46, 189, 254, 190, 16, 158, 85, 159, 136, 79, 100, 175, + 20, 84, 108, 72, 194, 206, 107, 17, 96, 245, 220, 78, 101, 24, 224, 168, + 232, 77, 239, 39, 217, 92, 165, 199, 214, 228, 57, 182, 72, 58, 227, 154, + 200, 152, 210, 113, 214, 232, 118, 180, 81, 144, 53, 30, 134, 178, 89, 75, + 151, 197, 235, 20, 193, 94, 32, 106, 92, 177, 41, 209, 22, 131, 200, 151, + 105, 88, 144, 47, 29, 161, 178, 25, 7, 50, 227, 231, 216, 173, 70, 222, + 53, 157, 55, 39, 220, 98, 24, 101, 30, 20, 100, 46, 124, 143, 170, 80, + 171, 236, 172, 102, 174, 131, 213, 117, 29, 36, 206, 117, 40, 155, 138, 157, + 212, 209, 180, 180, 219, 153, 247, 8, 41, 117, 94, 183, 17, 78, 247, 52, + 218, 9, 16, 48, 88, 25, 134, 183, 228, 178, 84, 13, 176, 134, 116, 139, + 26, 10, 15, 203, 40, 52, 69, 212, 80, 47, 180, 138, 202, 70, 227, 77, + 49, 52, 226, 248, 220, 182, 109, 24, 31, 91, 85, 229, 179, 29, 15, 21, + 51, 20, 6, 240, 159, 2, 229, 177, 152, 89, 186, 84, 46, 141, 116, 30, + 34, 110, 58, 147, 90, 32, 51, 231, 222, 205, 230, 17, 102, 242, 136, 178, + 121, 80, 127, 194, 135, 6, 162, 120, 139, 174, 100, 222, 210, 252, 95, 58, + 147, 70, 54, 147, 90, 160, 114, 87, 93, 134, 173, 180, 17, 40, 248, 29, + 2, 127, 13, 175, 109, 206, 26, 27, 107, 240, 133, 71, 40, 77, 164, 138, + 68, 67, 5, 91, 153, 186, 128, 241, 101, 97, 186, 105, 151, 179, 129, 133, + 208, 178, 182, 70, 17, 246, 83, 179, 24, 230, 41, 193, 161, 147, 243, 72, + 123, 136, 234, 36, 240, 186, 14, 154, 196, 234, 95, 157, 123, 65, 243, 90, + 31, 166, 8, 192, 141, 191, 52, 188, 51, 55, 8, 197, 103, 227, 164, 37, + 0, 104, 57, 82, 8, 196, 183, 48, 162, 239, 5, 16, 216, 80, 185, 249, + 153, 136, 48, 154, 155, 207, 194, 107, 121, 36, 75, 103, 213, 185, 242, 41, + 225, 26, 135, 223, 246, 158, 29, 120, 14, 200, 129, 103, 149, 176, 202, 141, + 202, 65, 116, 233, 7, 51, 112, 215, 182, 126, 78, 140, 197, 13, 243, 169, + 215, 225, 228, 77, 240, 231, 56, 80, 37, 114, 180, 117, 15, 251, 156, 134, + 51, 39, 236, 94, 189, 131, 72, 113, 16, 237, 25, 251, 183, 140, 78, 183, + 11, 252, 47, 158, 178, 151, 83, 246, 73, 42, 28, 146, 206, 72, 204, 163, + 120, 34, 202, 45, 203, 24, 189, 197, 192, 113, 39, 65, 204, 195, 101, 103, + 56, 161, 233, 199, 55, 231, 125, 145, 73, 10, 255, 220, 183, 151, 253, 245, + 210, 46, 189, 57, 121, 251, 215, 47, 75, 68, 118, 147, 128, 169, 32, 225, + 8, 247, 163, 200, 198, 43, 21, 18, 129, 248, 44, 217, 176, 9, 133, 207, + 168, 209, 185, 142, 43, 54, 177, 241, 106, 100, 203, 205, 75, 214, 58, 183, + 131, 169, 221, 40, 200, 239, 70, 152, 134, 170, 8, 181, 191, 157, 79, 199, + 233, 235, 98, 108, 63, 225, 173, 53, 168, 151, 114, 248, 32, 112, 188, 120, + 17, 211, 101, 77, 246, 148, 6, 123, 74, 109, 14, 173, 201, 30, 84, 9, + 191, 153, 192, 252, 183, 87, 235, 183, 110, 242, 246, 26, 97, 244, 9, 73, + 153, 244, 3, 8, 216, 255, 227, 78, 221, 193, 132, 4, 110, 15, 189, 45, + 97, 143, 171, 136, 241, 156, 114, 22, 161, 211, 65, 144, 145, 212, 207, 238, + 111, 91, 132, 115, 30, 236, 196, 44, 27, 190, 253, 194, 183, 8, 231, 30, + 104, 207, 236, 146, 129, 185, 75, 102, 239, 84, 39, 253, 251, 37, 28, 43, + 228, 169, 164, 224, 48, 196, 220, 59, 34, 175, 246, 250, 11, 60, 44, 182, + 199, 112, 4, 159, 246, 158, 199, 97, 209, 73, 9, 198, 202, 93, 127, 14, + 180, 118, 251, 237, 217, 28, 216, 150, 5, 222, 163, 34, 246, 235, 122, 54, + 111, 207, 202, 155, 138, 120, 236, 153, 207, 33, 190, 164, 79, 78, 76, 217, + 129, 243, 146, 75, 122, 71, 216, 119, 163, 254, 90, 8, 152, 8, 221, 19, + 58, 8, 184, 205, 178, 168, 9, 29, 234, 69, 109, 12, 244, 213, 247, 253, + 5, 240, 255, 56, 73, 132, 242, 201, 160, 115, 135, 3, 80, 141, 129, 251, + 1, 2, 135, 142, 251, 29, 2, 118, 29, 46, 224, 224, 58, 234, 44, 150, + 237, 205, 220, 21, 15, 67, 215, 158, 220, 80, 19, 180, 87, 139, 126, 175, + 141, 74, 105, 70, 245, 237, 107, 67, 52, 150, 110, 187, 212, 109, 235, 162, + 15, 47, 75, 146, 91, 138, 58, 227, 189, 237, 96, 10, 121, 162, 2, 104, + 127, 126, 80, 124, 105, 184, 229, 72, 151, 193, 194, 175, 244, 201, 49, 228, + 147, 99, 97, 31, 197, 136, 10, 69, 144, 179, 178, 163, 226, 205, 199, 143, + 145, 167, 195, 168, 199, 226, 168, 10, 193, 161, 56, 165, 136, 222, 219, 224, + 135, 86, 117, 83, 120, 214, 204, 12, 49, 47, 192, 243, 38, 254, 145, 255, + 124, 60, 123, 18, 38, 179, 31, 184, 37, 200, 189, 5, 131, 24, 203, 70, + 1, 125, 201, 45, 181, 176, 68, 96, 17, 109, 46, 26, 66, 34, 31, 159, + 26, 16, 4, 223, 74, 192, 171, 151, 174, 108, 70, 13, 25, 6, 238, 208, + 175, 84, 47, 252, 90, 136, 211, 6, 142, 0, 229, 33, 66, 115, 65, 230, + 33, 170, 60, 85, 236, 235, 146, 61, 88, 140, 194, 249, 167, 27, 43, 55, + 248, 141, 37, 70, 8, 145, 120, 222, 86, 164, 75, 233, 208, 55, 64, 106, + 207, 169, 201, 208, 251, 136, 69, 39, 174, 146, 58, 88, 93, 136, 166, 19, + 7, 39, 166, 155, 94, 2, 108, 166, 93, 201, 26, 251, 238, 56, 112, 199, + 161, 232, 125, 151, 73, 113, 141, 94, 79, 203, 170, 242, 179, 65, 157, 176, + 204, 89, 32, 134, 62, 75, 179, 60, 117, 189, 197, 194, 123, 133, 59, 235, + 156, 17, 60, 17, 208, 59, 118, 90, 187, 146, 93, 42, 169, 97, 2, 179, + 74, 141, 8, 117, 144, 194, 94, 134, 179, 23, 105, 213, 156, 208, 32, 112, + 46, 104, 192, 241, 115, 32, 101, 14, 60, 141, 33, 32, 56, 169, 107, 52, + 29, 60, 135, 88, 208, 69, 85, 137, 228, 202, 2, 165, 30, 222, 44, 145, + 15, 119, 236, 103, 39, 168, 72, 115, 149, 94, 34, 63, 52, 240, 67, 168, + 62, 112, 5, 98, 168, 130, 178, 108, 161, 145, 142, 65, 45, 25, 132, 53, + 97, 147, 26, 231, 76, 134, 233, 26, 65, 232, 249, 165, 181, 233, 146, 28, + 202, 65, 57, 18, 52, 17, 250, 206, 174, 225, 169, 238, 26, 165, 78, 239, + 201, 38, 105, 89, 246, 168, 56, 190, 180, 194, 106, 225, 29, 148, 115, 129, + 152, 3, 234, 45, 64, 85, 84, 174, 52, 191, 99, 37, 54, 19, 157, 249, + 186, 218, 91, 159, 146, 232, 77, 20, 146, 84, 123, 201, 41, 201, 217, 108, + 137, 221, 243, 178, 76, 41, 202, 239, 171, 240, 224, 197, 155, 110, 165, 134, + 127, 32, 167, 39, 92, 61, 140, 48, 70, 225, 26, 196, 171, 65, 206, 170, + 54, 168, 45, 44, 175, 5, 135, 2, 112, 205, 165, 6, 120, 46, 90, 129, + 180, 90, 225, 209, 181, 102, 84, 8, 80, 138, 176, 42, 98, 129, 136, 253, + 151, 101, 32, 119, 38, 242, 246, 108, 136, 84, 69, 42, 224, 17, 139, 172, + 156, 158, 150, 103, 252, 129, 72, 168, 80, 237, 4, 41, 208, 46, 207, 100, + 62, 120, 75, 215, 227, 18, 122, 162, 136, 76, 182, 167, 167, 248, 29, 211, + 228, 98, 66, 251, 241, 123, 40, 2, 6, 212, 28, 68, 11, 125, 67, 50, + 194, 42, 166, 130, 73, 180, 47, 107, 160, 251, 10, 129, 68, 160, 133, 6, + 19, 238, 52, 18, 39, 82, 100, 172, 78, 229, 185, 106, 183, 151, 210, 2, + 139, 251, 10, 163, 80, 130, 46, 14, 58, 140, 25, 190, 188, 130, 80, 151, + 218, 20, 1, 68, 113, 11, 230, 23, 117, 29, 24, 245, 140, 11, 193, 233, + 205, 207, 176, 49, 69, 189, 204, 157, 160, 12, 198, 107, 65, 249, 204, 23, + 131, 90, 197, 210, 16, 216, 243, 174, 13, 155, 77, 123, 60, 69, 33, 25, + 28, 82, 122, 211, 213, 13, 186, 243, 24, 246, 250, 61, 83, 244, 8, 159, + 54, 55, 171, 219, 219, 254, 220, 12, 189, 157, 118, 59, 40, 104, 35, 207, + 244, 237, 181, 124, 72, 228, 195, 6, 97, 210, 217, 85, 61, 135, 240, 141, + 129, 10, 131, 163, 212, 100, 72, 66, 150, 131, 247, 65, 209, 87, 162, 102, + 71, 94, 55, 66, 187, 164, 46, 28, 79, 210, 21, 77, 237, 133, 189, 41, + 169, 27, 5, 241, 253, 112, 222, 103, 102, 17, 55, 195, 91, 224, 14, 73, + 131, 9, 31, 60, 242, 110, 130, 23, 125, 141, 248, 211, 116, 53, 239, 172, + 122, 58, 168, 25, 207, 6, 211, 201, 39, 25, 240, 240, 197, 95, 161, 34, + 168, 209, 190, 176, 148, 217, 175, 128, 91, 156, 210, 141, 165, 188, 19, 93, + 216, 203, 206, 47, 125, 188, 49, 29, 206, 237, 94, 42, 103, 85, 32, 177, + 157, 120, 167, 10, 13, 214, 159, 220, 13, 231, 211, 9, 93, 167, 222, 117, + 230, 195, 14, 116, 235, 162, 88, 158, 183, 156, 206, 87, 139, 168, 103, 179, + 166, 46, 178, 225, 125, 120, 139, 16, 169, 58, 244, 237, 78, 175, 23, 41, + 199, 27, 176, 76, 1, 63, 72, 190, 63, 72, 195, 167, 229, 171, 49, 167, + 110, 11, 197, 165, 85, 230, 182, 16, 234, 251, 75, 155, 175, 142, 177, 183, + 219, 104, 175, 136, 131, 103, 33, 81, 246, 209, 60, 133, 66, 4, 114, 63, + 35, 16, 81, 129, 2, 52, 31, 118, 65, 148, 212, 81, 111, 33, 60, 187, + 120, 9, 227, 11, 245, 28, 197, 157, 73, 130, 35, 115, 129, 237, 59, 249, + 228, 26, 28, 33, 148, 131, 23, 168, 122, 227, 49, 133, 186, 223, 205, 19, + 28, 59, 200, 105, 79, 199, 163, 132, 200, 181, 59, 11, 20, 91, 39, 182, + 36, 27, 222, 129, 107, 95, 12, 111, 200, 63, 7, 68, 199, 182, 62, 233, + 143, 103, 203, 228, 132, 172, 105, 72, 83, 189, 35, 118, 74, 221, 216, 31, + 68, 122, 49, 236, 240, 138, 113, 185, 34, 168, 127, 110, 207, 30, 31, 151, + 176, 242, 61, 187, 183, 162, 11, 104, 204, 26, 137, 192, 231, 217, 124, 218, + 133, 73, 162, 51, 252, 203, 112, 14, 155, 76, 122, 38, 32, 195, 72, 206, + 52, 58, 147, 187, 14, 62, 194, 0, 190, 71, 157, 231, 155, 190, 244, 214, + 32, 110, 149, 250, 178, 66, 58, 195, 191, 194, 248, 66, 22, 83, 50, 163, + 112, 28, 66, 164, 84, 56, 199, 73, 228, 122, 58, 18, 49, 135, 186, 233, + 207, 167, 98, 232, 225, 113, 5, 54, 106, 28, 100, 179, 233, 18, 126, 134, + 192, 42, 140, 96, 85, 96, 133, 88, 220, 40, 80, 195, 93, 86, 40, 87, + 174, 30, 231, 89, 205, 108, 157, 177, 145, 16, 199, 38, 46, 77, 120, 143, + 136, 121, 139, 6, 210, 249, 125, 71, 211, 227, 136, 154, 80, 243, 168, 50, + 22, 70, 33, 226, 216, 90, 30, 214, 225, 40, 211, 177, 207, 61, 125, 22, + 165, 83, 219, 4, 226, 87, 82, 37, 218, 112, 246, 133, 26, 224, 65, 151, + 115, 144, 253, 118, 59, 197, 49, 204, 153, 27, 113, 210, 138, 20, 116, 128, + 192, 24, 220, 139, 163, 225, 98, 153, 29, 57, 42, 67, 232, 98, 186, 85, + 154, 78, 196, 72, 53, 218, 26, 135, 144, 24, 219, 119, 125, 24, 90, 212, + 217, 189, 126, 23, 135, 37, 41, 185, 211, 108, 51, 14, 8, 106, 6, 158, + 216, 164, 154, 132, 52, 136, 75, 115, 32, 51, 151, 50, 219, 246, 29, 60, + 208, 230, 234, 66, 42, 25, 68, 175, 121, 93, 126, 162, 38, 247, 9, 41, + 101, 60, 173, 232, 34, 225, 19, 221, 215, 211, 225, 184, 184, 127, 237, 178, + 46, 8, 134, 118, 199, 22, 151, 136, 164, 128, 66, 90, 36, 170, 164, 233, + 124, 8, 28, 31, 102, 39, 58, 19, 114, 53, 122, 235, 68, 172, 11, 106, + 11, 96, 77, 144, 59, 236, 31, 150, 4, 192, 179, 169, 95, 32, 87, 143, + 19, 123, 137, 18, 16, 224, 18, 167, 43, 30, 146, 112, 246, 25, 34, 157, + 186, 201, 110, 59, 67, 156, 101, 232, 19, 11, 98, 222, 244, 161, 6, 125, + 84, 101, 145, 163, 31, 103, 97, 225, 116, 206, 109, 20, 170, 107, 98, 186, + 243, 81, 173, 23, 135, 77, 237, 33, 67, 45, 141, 172, 50, 207, 21, 19, + 10, 8, 234, 136, 117, 102, 168, 142, 232, 149, 15, 242, 105, 165, 78, 78, + 134, 79, 47, 183, 132, 48, 104, 168, 217, 153, 84, 187, 167, 97, 165, 164, + 157, 223, 21, 185, 181, 17, 142, 151, 102, 179, 62, 222, 127, 164, 116, 25, + 200, 199, 99, 47, 97, 181, 146, 134, 240, 184, 212, 73, 239, 4, 168, 112, + 104, 101, 246, 134, 156, 216, 69, 223, 27, 196, 218, 173, 135, 246, 247, 17, + 42, 127, 31, 250, 222, 32, 82, 215, 6, 34, 82, 244, 60, 142, 8, 103, + 77, 68, 105, 232, 251, 122, 14, 104, 198, 103, 34, 77, 83, 93, 237, 243, + 151, 22, 54, 151, 248, 214, 66, 197, 70, 125, 35, 149, 218, 46, 82, 2, + 31, 116, 40, 72, 93, 232, 242, 8, 95, 141, 249, 29, 200, 125, 234, 226, + 65, 8, 54, 246, 159, 236, 160, 6, 167, 129, 201, 212, 133, 237, 236, 167, + 210, 79, 246, 79, 37, 186, 138, 186, 48, 95, 96, 3, 130, 3, 147, 236, + 108, 116, 225, 65, 29, 205, 158, 123, 244, 193, 137, 124, 247, 160, 114, 0, + 244, 52, 149, 166, 123, 27, 78, 70, 239, 226, 45, 122, 113, 220, 161, 100, + 252, 22, 55, 143, 246, 114, 56, 238, 199, 134, 199, 50, 123, 78, 26, 248, + 166, 28, 114, 235, 188, 192, 29, 179, 28, 186, 139, 138, 208, 134, 144, 209, + 33, 33, 140, 226, 79, 120, 70, 179, 33, 90, 21, 82, 156, 162, 190, 0, + 12, 92, 188, 103, 131, 29, 113, 1, 155, 43, 149, 31, 111, 135, 183, 112, + 80, 121, 129, 7, 196, 90, 153, 60, 129, 160, 97, 192, 243, 83, 190, 168, + 113, 217, 136, 69, 229, 252, 206, 174, 141, 174, 182, 208, 46, 47, 118, 215, + 100, 6, 80, 117, 40, 27, 182, 6, 144, 47, 36, 83, 191, 127, 30, 252, + 250, 171, 51, 120, 142, 14, 199, 132, 138, 131, 242, 241, 72, 85, 8, 97, + 45, 103, 223, 141, 246, 19, 114, 44, 134, 123, 52, 231, 13, 84, 145, 61, + 65, 157, 180, 40, 149, 136, 106, 116, 229, 67, 181, 223, 213, 130, 29, 249, + 117, 147, 68, 181, 16, 232, 47, 134, 148, 101, 231, 197, 83, 231, 29, 180, + 6, 230, 20, 99, 39, 246, 59, 136, 221, 198, 4, 69, 112, 192, 177, 175, + 240, 253, 154, 101, 235, 24, 18, 160, 38, 54, 238, 242, 252, 193, 150, 183, + 6, 132, 110, 185, 211, 241, 194, 61, 241, 202, 81, 5, 165, 11, 66, 137, + 35, 19, 103, 85, 141, 90, 254, 174, 168, 154, 169, 10, 214, 20, 206, 172, + 207, 93, 204, 142, 214, 248, 106, 241, 69, 96, 11, 239, 104, 219, 176, 234, + 52, 212, 229, 130, 211, 120, 46, 69, 170, 117, 20, 14, 194, 183, 90, 68, + 114, 246, 26, 12, 187, 37, 29, 37, 235, 5, 106, 71, 82, 91, 213, 245, + 229, 205, 135, 30, 113, 246, 100, 58, 92, 96, 170, 58, 202, 38, 145, 8, + 190, 173, 82, 14, 234, 124, 25, 3, 197, 224, 184, 104, 205, 58, 203, 238, + 0, 125, 117, 34, 6, 38, 55, 73, 80, 111, 86, 165, 141, 76, 101, 103, + 85, 201, 115, 28, 25, 14, 116, 71, 211, 21, 112, 171, 117, 42, 248, 29, + 84, 108, 84, 183, 144, 179, 61, 69, 41, 63, 12, 45, 74, 127, 69, 190, + 61, 17, 152, 23, 10, 7, 198, 50, 112, 255, 12, 173, 139, 160, 242, 120, + 211, 179, 197, 251, 4, 125, 219, 99, 13, 49, 28, 230, 2, 185, 177, 35, + 65, 108, 120, 45, 238, 41, 66, 55, 66, 17, 61, 65, 111, 162, 211, 10, + 55, 177, 55, 28, 59, 178, 69, 118, 206, 132, 4, 211, 9, 188, 65, 9, + 17, 231, 84, 117, 38, 156, 189, 15, 209, 26, 20, 22, 165, 194, 154, 24, + 198, 73, 225, 189, 131, 55, 33, 56, 66, 161, 161, 128, 220, 63, 159, 241, + 96, 155, 96, 205, 234, 134, 155, 58, 57, 2, 173, 43, 175, 117, 109, 147, + 123, 68, 242, 91, 184, 189, 223, 93, 110, 7, 232, 40, 117, 199, 151, 201, + 19, 104, 152, 6, 12, 243, 137, 116, 50, 233, 73, 15, 184, 190, 109, 14, + 150, 186, 24, 84, 15, 100, 133, 234, 124, 228, 180, 75, 14, 120, 75, 14, + 82, 164, 67, 13, 99, 56, 204, 211, 136, 127, 40, 59, 145, 24, 202, 6, + 22, 191, 56, 174, 188, 208, 155, 188, 8, 69, 69, 194, 92, 69, 120, 9, + 160, 30, 227, 123, 37, 162, 3, 199, 27, 59, 111, 37, 47, 133, 169, 234, + 42, 239, 203, 15, 82, 120, 108, 10, 147, 206, 43, 175, 121, 205, 205, 180, + 232, 23, 55, 144, 152, 231, 71, 183, 207, 197, 49, 205, 243, 152, 216, 209, + 163, 98, 55, 68, 211, 55, 30, 106, 250, 232, 152, 166, 63, 127, 116, 211, + 31, 78, 145, 106, 131, 199, 39, 138, 126, 75, 162, 6, 116, 242, 133, 180, + 187, 78, 174, 112, 31, 137, 120, 31, 233, 152, 47, 9, 155, 101, 163, 205, + 10, 46, 199, 106, 237, 190, 197, 22, 242, 234, 54, 142, 42, 246, 193, 137, + 83, 75, 95, 229, 136, 235, 57, 233, 27, 83, 165, 35, 4, 7, 137, 179, + 142, 75, 42, 161, 245, 240, 178, 72, 158, 61, 225, 47, 68, 166, 235, 82, + 88, 42, 22, 168, 155, 192, 107, 38, 238, 14, 4, 197, 110, 255, 140, 148, + 164, 157, 96, 26, 43, 11, 141, 89, 253, 106, 108, 242, 53, 152, 237, 84, + 121, 29, 244, 2, 88, 17, 190, 168, 165, 13, 11, 47, 245, 134, 147, 85, + 95, 52, 11, 29, 95, 126, 193, 210, 112, 73, 211, 175, 82, 74, 48, 236, + 67, 187, 207, 81, 71, 142, 241, 227, 133, 214, 10, 156, 221, 249, 253, 189, + 248, 125, 35, 126, 95, 187, 37, 122, 8, 74, 46, 113, 207, 129, 251, 62, + 112, 223, 4, 238, 107, 246, 91, 206, 31, 223, 137, 143, 239, 220, 247, 239, + 220, 55, 239, 220, 215, 239, 210, 146, 38, 40, 213, 230, 98, 77, 249, 82, + 249, 253, 155, 215, 149, 2, 255, 203, 154, 197, 85, 212, 134, 77, 209, 110, + 165, 247, 253, 94, 201, 21, 222, 94, 41, 224, 205, 188, 223, 159, 148, 220, + 134, 239, 42, 223, 183, 175, 129, 148, 18, 154, 169, 226, 148, 17, 78, 199, + 221, 210, 223, 240, 24, 12, 105, 85, 40, 252, 179, 140, 246, 96, 174, 152, + 120, 224, 180, 160, 62, 69, 125, 90, 11, 138, 106, 111, 15, 164, 22, 84, + 74, 113, 148, 29, 43, 54, 80, 79, 201, 137, 209, 183, 91, 246, 230, 49, + 107, 200, 189, 189, 63, 13, 201, 129, 247, 128, 127, 249, 106, 252, 152, 88, + 154, 39, 176, 132, 129, 203, 51, 100, 233, 149, 222, 80, 123, 177, 130, 145, + 200, 94, 197, 137, 105, 184, 135, 169, 46, 200, 185, 183, 214, 253, 120, 235, + 195, 150, 207, 30, 101, 171, 229, 160, 102, 248, 248, 134, 253, 63, 49, 190, + 15, 232, 187, 225, 17, 28, 77, 88, 135, 147, 62, 12, 118, 73, 160, 179, + 238, 187, 78, 210, 231, 226, 188, 24, 182, 227, 217, 176, 58, 4, 198, 14, + 237, 111, 133, 202, 166, 36, 69, 210, 32, 84, 82, 94, 84, 172, 137, 244, + 125, 206, 201, 205, 196, 235, 110, 150, 78, 124, 67, 90, 241, 183, 236, 112, + 210, 154, 36, 12, 41, 239, 102, 41, 199, 55, 164, 126, 95, 138, 245, 109, + 190, 140, 243, 195, 101, 220, 230, 203, 56, 63, 88, 6, 93, 8, 67, 131, + 57, 235, 91, 104, 168, 91, 181, 34, 208, 145, 101, 123, 86, 107, 86, 129, + 127, 222, 137, 215, 243, 244, 235, 133, 120, 197, 78, 164, 11, 21, 206, 222, + 19, 217, 191, 0, 190, 207, 242, 237, 37, 100, 78, 209, 155, 50, 53, 185, + 81, 103, 23, 213, 48, 50, 63, 58, 209, 71, 212, 136, 54, 148, 22, 34, + 94, 178, 172, 159, 217, 97, 49, 170, 142, 116, 189, 123, 244, 94, 191, 117, + 146, 174, 55, 192, 39, 177, 112, 213, 141, 165, 74, 245, 165, 32, 4, 2, + 196, 65, 6, 6, 92, 246, 102, 122, 54, 234, 44, 198, 29, 20, 78, 10, + 133, 208, 27, 72, 225, 242, 201, 27, 143, 132, 5, 50, 234, 142, 148, 195, + 72, 237, 118, 145, 199, 49, 58, 183, 223, 13, 134, 40, 84, 25, 143, 73, + 114, 131, 183, 105, 99, 45, 138, 154, 122, 232, 11, 20, 82, 157, 124, 53, + 236, 140, 167, 147, 158, 247, 129, 12, 94, 225, 56, 63, 250, 52, 133, 147, + 242, 96, 124, 232, 138, 150, 244, 60, 73, 20, 128, 117, 80, 82, 102, 22, + 34, 156, 239, 213, 145, 103, 234, 77, 219, 121, 209, 50, 228, 147, 210, 132, + 4, 17, 80, 13, 15, 131, 47, 124, 232, 47, 11, 140, 0, 102, 195, 117, + 255, 145, 26, 201, 123, 4, 231, 199, 35, 40, 248, 162, 26, 197, 16, 10, + 133, 232, 9, 179, 233, 232, 151, 78, 155, 174, 8, 158, 193, 81, 168, 51, + 238, 195, 161, 154, 148, 14, 122, 253, 201, 130, 42, 206, 134, 125, 129, 124, + 8, 181, 242, 241, 104, 72, 226, 51, 210, 61, 238, 209, 67, 186, 181, 242, + 86, 171, 84, 208, 111, 210, 37, 22, 228, 8, 231, 171, 130, 38, 97, 78, + 26, 198, 77, 95, 107, 17, 11, 23, 171, 76, 91, 28, 72, 37, 226, 158, + 146, 29, 21, 54, 112, 12, 91, 212, 158, 22, 54, 218, 40, 128, 102, 228, + 109, 15, 175, 194, 105, 229, 167, 203, 118, 177, 199, 89, 169, 230, 52, 246, + 51, 169, 62, 28, 162, 71, 86, 82, 26, 110, 10, 139, 209, 166, 212, 26, + 102, 157, 225, 64, 216, 140, 6, 66, 97, 152, 111, 190, 33, 235, 12, 124, + 3, 21, 196, 205, 153, 219, 19, 101, 55, 146, 86, 176, 104, 183, 2, 117, + 96, 86, 243, 131, 125, 18, 21, 110, 43, 168, 242, 203, 77, 38, 236, 47, + 44, 209, 102, 182, 115, 6, 27, 168, 220, 20, 154, 66, 155, 119, 103, 119, + 151, 2, 240, 129, 23, 62, 56, 162, 47, 5, 220, 131, 12, 24, 15, 123, + 104, 20, 17, 192, 202, 133, 207, 136, 206, 16, 194, 51, 43, 167, 193, 54, + 121, 65, 118, 29, 112, 116, 244, 81, 75, 71, 123, 150, 15, 172, 239, 191, + 54, 49, 34, 114, 154, 104, 165, 53, 65, 211, 251, 126, 117, 125, 90, 114, + 190, 255, 186, 228, 57, 209, 165, 157, 200, 192, 68, 6, 54, 46, 237, 53, + 222, 224, 174, 39, 213, 146, 211, 93, 150, 188, 4, 31, 22, 203, 18, 68, + 86, 225, 240, 90, 75, 68, 4, 136, 143, 215, 216, 235, 249, 83, 39, 244, + 74, 14, 18, 141, 113, 49, 44, 73, 135, 209, 67, 80, 242, 8, 161, 103, + 221, 173, 174, 187, 181, 164, 91, 77, 186, 149, 18, 178, 165, 104, 87, 139, + 220, 168, 115, 102, 79, 232, 247, 220, 172, 111, 221, 212, 86, 83, 254, 217, + 77, 206, 180, 158, 241, 205, 30, 104, 223, 236, 215, 122, 226, 146, 105, 198, + 51, 251, 221, 139, 56, 72, 153, 46, 33, 91, 184, 126, 71, 239, 239, 254, + 32, 59, 181, 119, 30, 90, 248, 147, 223, 69, 89, 240, 191, 147, 213, 218, + 67, 176, 68, 146, 230, 127, 39, 88, 34, 109, 91, 19, 146, 165, 226, 83, + 247, 156, 141, 16, 233, 247, 204, 8, 35, 219, 116, 129, 68, 112, 124, 170, + 61, 182, 111, 105, 34, 208, 196, 157, 161, 70, 86, 229, 225, 109, 121, 141, + 234, 111, 192, 224, 238, 42, 80, 9, 81, 212, 21, 106, 170, 82, 48, 170, + 206, 213, 91, 130, 199, 71, 153, 248, 188, 63, 158, 222, 145, 81, 165, 200, + 252, 243, 106, 8, 227, 164, 16, 78, 100, 65, 198, 7, 147, 79, 136, 129, + 0, 187, 203, 45, 112, 15, 211, 185, 180, 3, 234, 204, 231, 211, 251, 7, + 32, 143, 246, 13, 209, 240, 43, 244, 189, 8, 153, 157, 26, 40, 60, 208, + 137, 253, 209, 97, 112, 132, 60, 60, 143, 160, 48, 110, 62, 197, 142, 101, + 10, 133, 198, 151, 36, 49, 179, 127, 252, 118, 20, 11, 137, 25, 133, 167, + 222, 19, 104, 249, 46, 34, 180, 175, 145, 223, 115, 19, 228, 245, 160, 253, + 155, 240, 185, 105, 96, 22, 112, 227, 210, 93, 3, 246, 9, 36, 223, 131, + 138, 33, 175, 37, 236, 22, 90, 2, 174, 198, 195, 9, 249, 47, 132, 85, + 246, 19, 162, 141, 65, 27, 225, 243, 120, 53, 34, 160, 57, 60, 135, 220, + 161, 251, 27, 178, 35, 22, 247, 28, 252, 220, 101, 96, 13, 136, 124, 110, + 66, 28, 97, 128, 32, 134, 85, 139, 105, 51, 164, 189, 144, 119, 65, 53, + 12, 196, 14, 72, 102, 113, 108, 12, 132, 199, 48, 52, 194, 43, 201, 91, + 142, 230, 211, 221, 11, 229, 188, 60, 208, 54, 135, 55, 211, 233, 72, 94, + 98, 8, 156, 133, 82, 10, 90, 33, 99, 120, 168, 134, 129, 232, 122, 56, + 11, 230, 17, 11, 68, 15, 211, 102, 200, 253, 75, 186, 74, 212, 183, 166, + 11, 112, 216, 18, 123, 195, 5, 42, 20, 244, 220, 254, 132, 126, 129, 100, + 215, 210, 144, 6, 123, 17, 13, 22, 11, 39, 176, 141, 189, 140, 142, 154, + 44, 99, 64, 36, 3, 96, 193, 198, 157, 229, 0, 33, 169, 161, 6, 11, + 53, 45, 80, 191, 233, 196, 9, 79, 174, 47, 45, 35, 72, 127, 103, 12, + 3, 253, 78, 48, 6, 182, 192, 49, 120, 137, 247, 89, 247, 95, 248, 238, + 224, 11, 95, 24, 45, 94, 90, 119, 105, 148, 231, 225, 184, 226, 210, 239, + 91, 84, 57, 18, 31, 241, 231, 37, 254, 121, 134, 62, 42, 161, 65, 80, + 153, 43, 170, 202, 66, 78, 239, 8, 16, 90, 129, 0, 168, 240, 144, 177, + 0, 124, 198, 2, 16, 161, 174, 6, 55, 48, 35, 34, 198, 129, 207, 24, + 7, 42, 226, 15, 10, 163, 122, 93, 189, 63, 133, 239, 149, 75, 251, 71, + 21, 150, 84, 7, 167, 88, 19, 246, 104, 59, 44, 255, 224, 254, 72, 0, + 210, 85, 164, 240, 210, 190, 51, 2, 3, 17, 72, 176, 131, 208, 107, 22, + 117, 101, 25, 10, 188, 90, 187, 201, 53, 252, 181, 107, 246, 202, 77, 224, + 239, 221, 181, 219, 104, 186, 138, 50, 178, 50, 186, 18, 93, 119, 93, 113, + 45, 5, 102, 128, 170, 147, 87, 232, 25, 24, 143, 143, 43, 242, 14, 140, + 79, 119, 34, 55, 25, 90, 147, 161, 169, 124, 12, 212, 242, 146, 97, 36, + 169, 117, 206, 213, 197, 194, 111, 53, 44, 127, 104, 171, 214, 5, 252, 79, + 218, 161, 53, 213, 255, 78, 123, 180, 130, 14, 52, 232, 219, 131, 29, 152, + 63, 112, 101, 96, 3, 45, 179, 231, 197, 113, 224, 88, 164, 152, 102, 1, + 82, 140, 106, 22, 157, 47, 105, 71, 73, 179, 235, 229, 116, 191, 221, 245, + 190, 117, 76, 89, 90, 23, 224, 192, 8, 13, 155, 63, 176, 52, 181, 106, + 222, 14, 77, 75, 99, 50, 97, 195, 188, 132, 252, 142, 66, 26, 120, 72, + 34, 203, 99, 49, 141, 166, 243, 69, 119, 208, 233, 14, 72, 229, 129, 44, + 7, 81, 203, 142, 17, 150, 78, 220, 147, 241, 16, 22, 2, 84, 51, 138, + 83, 224, 91, 107, 210, 166, 74, 72, 143, 106, 157, 216, 59, 213, 235, 194, + 242, 82, 101, 235, 145, 241, 229, 112, 242, 203, 205, 72, 156, 177, 30, 193, + 72, 40, 114, 144, 149, 16, 218, 9, 138, 158, 98, 227, 97, 93, 159, 232, + 169, 101, 86, 78, 89, 228, 7, 180, 85, 198, 25, 187, 66, 109, 86, 168, + 85, 5, 162, 82, 214, 160, 244, 64, 181, 50, 59, 164, 34, 93, 10, 83, + 141, 123, 252, 16, 239, 241, 17, 204, 100, 157, 236, 74, 158, 170, 17, 27, + 230, 59, 97, 76, 247, 225, 144, 196, 195, 11, 193, 27, 204, 224, 69, 108, + 251, 226, 218, 12, 205, 155, 178, 104, 120, 12, 130, 103, 193, 128, 88, 141, + 39, 168, 211, 44, 68, 171, 118, 81, 54, 53, 46, 208, 94, 219, 116, 51, + 254, 52, 180, 69, 186, 186, 188, 142, 185, 29, 194, 18, 179, 54, 132, 94, + 170, 228, 48, 87, 50, 1, 239, 145, 149, 21, 22, 59, 120, 184, 216, 132, + 138, 29, 60, 149, 6, 112, 102, 153, 73, 81, 153, 81, 113, 109, 25, 242, + 207, 218, 208, 181, 114, 70, 148, 252, 251, 234, 253, 88, 74, 149, 225, 254, + 98, 216, 159, 207, 96, 113, 253, 5, 135, 36, 204, 239, 213, 28, 21, 46, + 218, 35, 88, 208, 71, 166, 6, 33, 45, 3, 31, 116, 100, 84, 3, 122, + 112, 163, 73, 205, 14, 82, 84, 77, 229, 31, 159, 237, 89, 122, 13, 162, + 206, 172, 20, 133, 146, 169, 12, 226, 179, 93, 74, 180, 210, 244, 37, 212, + 101, 10, 139, 203, 87, 162, 21, 41, 91, 241, 179, 96, 152, 133, 149, 66, + 13, 177, 79, 243, 126, 63, 205, 74, 194, 104, 111, 27, 228, 64, 185, 30, + 90, 28, 6, 169, 208, 103, 52, 35, 206, 158, 199, 250, 192, 6, 43, 89, + 240, 212, 69, 213, 24, 39, 130, 127, 13, 248, 215, 132, 127, 173, 167, 66, + 191, 104, 222, 95, 174, 230, 120, 110, 73, 103, 79, 139, 225, 22, 86, 217, + 154, 19, 85, 72, 24, 92, 118, 66, 224, 79, 229, 51, 132, 55, 141, 240, + 22, 63, 59, 103, 184, 82, 154, 25, 237, 203, 130, 87, 88, 8, 137, 140, + 140, 26, 15, 102, 148, 47, 147, 109, 182, 31, 200, 72, 140, 183, 217, 112, + 222, 25, 221, 220, 67, 95, 22, 216, 110, 195, 206, 23, 246, 36, 82, 134, + 60, 17, 102, 76, 242, 58, 200, 238, 139, 157, 8, 213, 172, 69, 150, 210, + 38, 254, 144, 121, 119, 110, 181, 230, 146, 99, 162, 68, 171, 42, 43, 18, + 210, 172, 129, 34, 61, 104, 21, 143, 90, 249, 125, 139, 160, 43, 215, 59, + 152, 201, 53, 52, 63, 148, 200, 131, 190, 120, 13, 5, 16, 161, 101, 180, + 133, 1, 49, 23, 200, 211, 145, 131, 39, 162, 32, 117, 34, 138, 210, 168, + 43, 220, 32, 135, 154, 3, 53, 50, 217, 44, 111, 237, 132, 48, 124, 199, + 157, 225, 36, 46, 177, 129, 63, 123, 4, 93, 75, 228, 46, 248, 39, 0, + 199, 224, 95, 130, 158, 84, 16, 150, 132, 162, 86, 195, 106, 249, 30, 45, + 1, 240, 228, 209, 168, 82, 24, 250, 38, 70, 86, 30, 153, 101, 10, 184, + 180, 144, 139, 79, 244, 235, 247, 240, 138, 57, 135, 85, 17, 240, 53, 4, + 12, 204, 0, 60, 114, 44, 17, 132, 164, 252, 35, 26, 79, 252, 240, 204, + 250, 33, 142, 191, 71, 18, 94, 210, 95, 248, 242, 227, 51, 11, 190, 125, + 77, 97, 97, 245, 123, 8, 193, 103, 180, 112, 129, 216, 64, 150, 12, 33, + 172, 153, 31, 43, 151, 188, 31, 69, 182, 52, 134, 7, 62, 2, 235, 92, + 186, 178, 151, 79, 239, 93, 27, 183, 206, 229, 233, 61, 89, 45, 209, 5, + 174, 54, 154, 167, 120, 26, 209, 132, 113, 62, 51, 140, 250, 138, 254, 222, + 229, 152, 246, 21, 253, 189, 11, 246, 221, 26, 60, 196, 183, 139, 194, 208, + 243, 114, 209, 138, 106, 151, 187, 171, 155, 97, 23, 24, 245, 249, 152, 212, + 62, 41, 122, 229, 40, 22, 248, 145, 188, 174, 160, 100, 15, 123, 235, 181, + 124, 212, 138, 23, 16, 217, 233, 183, 71, 197, 23, 178, 36, 222, 140, 84, + 83, 139, 213, 252, 34, 150, 134, 94, 217, 181, 90, 196, 76, 113, 159, 87, + 180, 140, 93, 51, 23, 138, 11, 17, 6, 33, 124, 196, 245, 1, 110, 244, + 34, 205, 141, 6, 190, 100, 71, 139, 96, 132, 80, 195, 47, 135, 36, 4, + 75, 122, 149, 45, 145, 156, 160, 194, 80, 66, 249, 120, 33, 198, 131, 81, + 58, 160, 120, 136, 43, 188, 42, 140, 23, 97, 188, 72, 230, 23, 33, 124, + 114, 97, 188, 6, 198, 107, 200, 252, 26, 21, 134, 39, 202, 199, 107, 98, + 188, 166, 204, 175, 89, 97, 136, 162, 124, 188, 22, 198, 107, 201, 252, 90, + 72, 95, 97, 188, 51, 140, 119, 38, 243, 59, 67, 250, 10, 227, 157, 99, + 188, 115, 153, 223, 57, 196, 203, 11, 62, 132, 159, 49, 60, 166, 27, 136, + 71, 215, 248, 182, 162, 183, 59, 241, 166, 112, 143, 248, 27, 189, 221, 225, + 155, 115, 129, 135, 110, 238, 179, 235, 74, 41, 119, 211, 185, 236, 47, 231, + 157, 126, 111, 14, 124, 6, 153, 173, 208, 36, 134, 25, 236, 110, 124, 152, + 181, 48, 101, 221, 77, 224, 174, 67, 55, 9, 221, 77, 232, 174, 35, 55, + 137, 220, 77, 228, 190, 247, 221, 55, 190, 251, 218, 39, 25, 122, 74, 207, + 226, 125, 232, 190, 9, 221, 215, 33, 191, 68, 238, 155, 200, 125, 29, 229, + 231, 181, 46, 87, 160, 180, 32, 130, 30, 240, 0, 157, 165, 156, 234, 233, + 195, 68, 249, 14, 153, 57, 72, 52, 236, 106, 77, 140, 60, 241, 25, 144, + 45, 252, 14, 124, 61, 100, 84, 150, 199, 37, 180, 76, 20, 200, 41, 248, + 136, 131, 31, 26, 9, 31, 3, 188, 120, 70, 155, 121, 152, 40, 123, 105, + 26, 154, 12, 206, 122, 28, 11, 157, 45, 220, 29, 196, 241, 235, 140, 48, + 95, 72, 15, 170, 178, 179, 215, 111, 85, 148, 206, 58, 23, 133, 102, 67, + 58, 147, 144, 104, 59, 71, 82, 84, 38, 73, 58, 147, 76, 20, 204, 100, + 147, 206, 36, 34, 92, 152, 11, 170, 139, 204, 100, 147, 206, 36, 19, 5, + 51, 25, 93, 209, 117, 83, 224, 161, 206, 227, 37, 176, 134, 94, 139, 31, + 206, 188, 11, 126, 64, 44, 3, 84, 176, 171, 80, 188, 136, 239, 105, 8, + 152, 224, 180, 177, 115, 27, 10, 23, 163, 78, 202, 144, 163, 59, 232, 13, + 159, 36, 159, 124, 37, 131, 34, 15, 214, 246, 185, 21, 221, 164, 236, 50, + 215, 184, 129, 58, 193, 165, 157, 208, 67, 120, 105, 111, 232, 33, 186, 132, + 105, 139, 15, 13, 248, 20, 176, 1, 166, 189, 9, 132, 217, 229, 58, 100, + 91, 75, 59, 9, 217, 188, 210, 222, 208, 195, 5, 124, 138, 40, 67, 31, + 190, 241, 19, 228, 189, 225, 39, 216, 141, 87, 62, 102, 177, 166, 141, 28, + 162, 220, 209, 107, 66, 187, 57, 188, 222, 211, 235, 134, 140, 247, 124, 140, + 140, 153, 66, 89, 50, 50, 190, 38, 161, 138, 140, 175, 155, 80, 69, 198, + 66, 214, 145, 138, 140, 175, 73, 164, 34, 227, 235, 38, 146, 145, 3, 157, + 51, 208, 119, 23, 232, 156, 225, 245, 62, 208, 57, 7, 24, 89, 231, 76, + 145, 117, 206, 20, 89, 231, 140, 145, 67, 29, 25, 26, 243, 46, 212, 145, + 225, 245, 62, 212, 145, 161, 53, 38, 107, 159, 138, 130, 102, 168, 98, 117, + 60, 108, 129, 42, 212, 243, 210, 158, 36, 252, 9, 3, 86, 244, 105, 197, + 145, 224, 211, 134, 63, 173, 56, 46, 124, 186, 227, 72, 194, 13, 29, 102, + 90, 197, 230, 168, 113, 46, 213, 59, 126, 198, 100, 144, 67, 244, 220, 119, + 109, 142, 20, 123, 129, 40, 73, 60, 110, 196, 99, 133, 105, 139, 20, 109, + 145, 162, 45, 226, 20, 145, 162, 45, 82, 180, 69, 156, 67, 164, 104, 139, + 20, 109, 145, 166, 45, 162, 250, 48, 109, 17, 85, 128, 105, 139, 176, 118, + 146, 182, 72, 211, 22, 105, 218, 34, 77, 91, 200, 180, 133, 138, 182, 80, + 209, 22, 50, 109, 161, 162, 45, 84, 180, 133, 76, 91, 168, 104, 11, 83, + 180, 133, 72, 91, 192, 180, 133, 72, 91, 192, 180, 133, 72, 91, 32, 104, + 11, 53, 109, 161, 166, 45, 212, 180, 5, 76, 27, 54, 118, 64, 180, 97, + 23, 4, 68, 27, 127, 194, 128, 21, 125, 90, 113, 36, 204, 129, 63, 173, + 56, 46, 210, 198, 145, 152, 54, 143, 114, 37, 226, 60, 206, 134, 136, 243, + 56, 157, 38, 46, 208, 196, 233, 199, 77, 160, 136, 19, 254, 111, 214, 207, + 97, 231, 26, 151, 236, 95, 127, 181, 215, 47, 224, 241, 45, 61, 38, 16, + 154, 112, 104, 2, 161, 9, 135, 110, 32, 116, 195, 161, 27, 8, 221, 188, + 45, 185, 67, 215, 234, 209, 186, 177, 22, 147, 173, 71, 139, 71, 34, 230, + 90, 143, 86, 144, 141, 152, 106, 61, 90, 70, 214, 98, 242, 244, 104, 45, + 73, 196, 220, 233, 209, 130, 178, 17, 83, 7, 239, 96, 200, 40, 120, 237, + 87, 121, 102, 212, 48, 231, 42, 79, 133, 26, 230, 91, 165, 17, 202, 162, + 36, 75, 198, 139, 140, 120, 145, 17, 47, 74, 199, 11, 141, 120, 161, 17, + 47, 212, 241, 130, 42, 247, 30, 198, 131, 231, 68, 60, 111, 224, 25, 27, + 17, 226, 9, 42, 95, 162, 23, 76, 225, 185, 222, 175, 84, 81, 236, 46, + 3, 2, 12, 72, 140, 128, 16, 3, 54, 70, 64, 4, 1, 246, 179, 161, + 85, 177, 74, 150, 150, 187, 47, 13, 219, 98, 68, 87, 201, 216, 21, 19, + 224, 202, 51, 250, 201, 195, 12, 223, 78, 39, 75, 113, 66, 85, 16, 238, + 15, 170, 5, 237, 3, 7, 197, 130, 22, 75, 178, 128, 60, 202, 214, 119, + 121, 16, 90, 216, 38, 129, 207, 255, 157, 176, 194, 31, 8, 96, 252, 36, + 136, 196, 1, 38, 8, 207, 201, 8, 149, 91, 21, 74, 101, 254, 125, 62, + 239, 47, 102, 211, 9, 215, 138, 13, 32, 177, 195, 224, 196, 52, 153, 122, + 29, 50, 216, 100, 197, 22, 227, 176, 244, 106, 146, 8, 171, 76, 140, 202, + 231, 227, 33, 154, 100, 78, 216, 52, 79, 128, 59, 44, 135, 158, 76, 108, + 90, 44, 98, 159, 38, 88, 89, 104, 19, 178, 141, 181, 151, 208, 3, 253, + 165, 56, 112, 243, 5, 44, 240, 84, 75, 36, 105, 210, 191, 183, 123, 195, + 49, 170, 225, 160, 17, 227, 98, 213, 29, 176, 109, 166, 182, 136, 20, 176, + 64, 250, 226, 131, 92, 41, 65, 233, 80, 87, 99, 188, 60, 96, 119, 141, + 192, 25, 255, 69, 55, 215, 122, 184, 198, 65, 235, 55, 169, 148, 153, 55, + 200, 144, 179, 113, 56, 36, 122, 208, 194, 227, 197, 174, 36, 85, 252, 240, + 10, 201, 158, 12, 187, 76, 173, 139, 0, 177, 39, 136, 26, 97, 191, 44, + 161, 146, 148, 147, 184, 156, 0, 142, 124, 23, 116, 228, 75, 106, 49, 135, + 152, 44, 251, 30, 228, 163, 48, 98, 9, 153, 156, 168, 211, 204, 68, 110, + 139, 139, 16, 168, 11, 125, 147, 87, 197, 65, 188, 43, 9, 156, 70, 104, + 23, 33, 25, 164, 71, 45, 83, 111, 196, 103, 117, 227, 2, 250, 56, 208, + 91, 84, 198, 162, 160, 82, 73, 6, 158, 199, 206, 89, 58, 218, 69, 46, + 4, 142, 178, 148, 178, 100, 181, 77, 178, 109, 167, 84, 45, 25, 139, 144, + 10, 63, 114, 49, 194, 181, 136, 83, 236, 91, 151, 30, 90, 145, 200, 129, + 145, 188, 76, 58, 118, 121, 250, 95, 180, 12, 29, 63, 217, 112, 48, 209, + 116, 227, 214, 204, 194, 56, 187, 106, 226, 209, 79, 200, 63, 17, 105, 30, + 26, 243, 178, 113, 64, 21, 49, 53, 66, 74, 95, 15, 177, 245, 231, 253, + 39, 52, 205, 224, 191, 86, 228, 70, 86, 102, 20, 61, 60, 31, 172, 127, + 191, 249, 208, 62, 80, 137, 125, 247, 160, 52, 116, 79, 28, 92, 227, 150, + 106, 132, 8, 51, 128, 130, 91, 73, 90, 248, 165, 225, 64, 195, 181, 85, + 249, 57, 36, 106, 139, 101, 68, 226, 122, 84, 224, 80, 195, 62, 243, 169, + 92, 114, 130, 82, 197, 16, 221, 47, 250, 179, 181, 11, 127, 146, 120, 91, + 90, 172, 99, 161, 209, 129, 112, 168, 240, 24, 225, 227, 213, 98, 45, 84, + 57, 214, 21, 132, 146, 128, 111, 226, 61, 193, 247, 235, 210, 14, 57, 32, + 164, 77, 8, 84, 226, 188, 248, 199, 90, 67, 237, 226, 237, 255, 89, 64, + 174, 37, 39, 44, 65, 190, 14, 150, 140, 202, 32, 255, 117, 242, 235, 175, + 234, 229, 233, 201, 203, 197, 21, 59, 159, 41, 47, 48, 251, 103, 139, 255, + 3, 7, 115, 51, 117, 36, 83, 39, 102, 234, 100, 127, 234, 172, 112, 140, + 116, 221, 177, 29, 104, 177, 70, 29, 124, 39, 93, 129, 151, 3, 1, 127, + 77, 118, 130, 48, 247, 161, 69, 219, 235, 4, 14, 215, 120, 143, 0, 123, + 130, 85, 83, 38, 152, 176, 39, 52, 17, 182, 113, 120, 133, 253, 171, 46, + 164, 225, 40, 14, 236, 213, 118, 241, 133, 207, 150, 88, 196, 246, 217, 9, + 6, 118, 249, 91, 221, 173, 11, 147, 88, 146, 253, 54, 237, 170, 196, 88, + 100, 171, 217, 49, 91, 240, 161, 225, 197, 23, 190, 80, 184, 172, 187, 219, + 171, 178, 209, 112, 47, 81, 133, 198, 11, 188, 251, 202, 51, 179, 5, 57, + 180, 242, 244, 25, 226, 120, 99, 203, 187, 101, 163, 189, 94, 150, 7, 148, + 104, 192, 137, 100, 195, 113, 168, 72, 132, 13, 126, 45, 44, 0, 90, 110, + 221, 34, 107, 32, 162, 235, 151, 43, 214, 224, 207, 73, 175, 196, 37, 84, + 70, 118, 197, 130, 43, 150, 90, 29, 39, 169, 202, 8, 167, 228, 221, 214, + 81, 162, 169, 67, 118, 65, 25, 2, 67, 210, 135, 110, 72, 157, 54, 122, + 245, 149, 133, 80, 230, 201, 202, 214, 46, 35, 220, 146, 68, 102, 16, 183, + 60, 41, 217, 61, 68, 188, 150, 97, 177, 208, 135, 37, 251, 151, 124, 203, + 5, 191, 116, 73, 197, 98, 158, 51, 83, 202, 19, 237, 220, 232, 120, 41, + 207, 112, 114, 199, 6, 200, 101, 207, 105, 224, 144, 69, 249, 174, 199, 55, + 95, 53, 148, 9, 59, 161, 7, 148, 214, 156, 168, 10, 63, 31, 241, 230, + 107, 17, 16, 34, 178, 211, 244, 224, 187, 211, 218, 217, 11, 84, 135, 110, + 121, 78, 8, 143, 17, 106, 73, 123, 48, 25, 172, 37, 41, 76, 163, 141, + 50, 70, 142, 118, 246, 146, 180, 166, 161, 24, 120, 196, 104, 145, 135, 70, + 232, 69, 250, 101, 146, 71, 131, 89, 98, 161, 109, 116, 153, 27, 28, 13, + 119, 236, 27, 126, 15, 228, 123, 151, 223, 67, 241, 110, 45, 200, 185, 149, + 243, 194, 186, 133, 185, 188, 32, 80, 122, 81, 199, 82, 21, 22, 185, 69, + 80, 130, 243, 21, 252, 134, 37, 58, 139, 193, 83, 84, 170, 210, 253, 80, + 46, 238, 82, 196, 93, 170, 184, 75, 17, 119, 33, 182, 146, 165, 252, 173, + 45, 158, 199, 129, 253, 18, 162, 64, 210, 117, 173, 228, 220, 64, 68, 248, + 233, 150, 158, 13, 249, 232, 198, 238, 54, 213, 228, 48, 78, 115, 115, 96, + 163, 251, 120, 98, 19, 198, 43, 192, 250, 176, 39, 85, 118, 47, 39, 64, + 198, 201, 31, 25, 225, 1, 46, 231, 29, 90, 233, 113, 175, 167, 43, 150, + 158, 113, 169, 248, 151, 34, 199, 153, 52, 204, 132, 237, 139, 44, 78, 228, + 123, 80, 249, 131, 12, 80, 34, 218, 250, 153, 162, 88, 238, 238, 41, 170, + 242, 106, 32, 232, 160, 84, 22, 228, 90, 186, 134, 57, 176, 136, 40, 76, + 163, 76, 227, 166, 30, 237, 210, 254, 168, 130, 28, 168, 184, 86, 228, 120, + 2, 211, 129, 219, 192, 149, 237, 2, 188, 124, 182, 142, 134, 72, 88, 42, + 135, 48, 186, 3, 235, 133, 8, 191, 181, 116, 163, 120, 148, 147, 67, 216, + 115, 132, 127, 67, 130, 165, 141, 109, 58, 222, 211, 175, 134, 223, 144, 102, + 242, 104, 49, 142, 247, 213, 59, 251, 45, 12, 85, 116, 72, 252, 246, 20, + 175, 78, 134, 115, 123, 235, 188, 245, 208, 142, 0, 37, 219, 79, 67, 188, + 85, 114, 222, 214, 200, 176, 192, 214, 26, 16, 168, 15, 33, 164, 194, 206, + 253, 41, 219, 93, 105, 192, 108, 103, 160, 130, 12, 243, 105, 196, 17, 37, + 124, 210, 66, 64, 90, 43, 5, 72, 107, 151, 17, 69, 33, 144, 43, 136, + 134, 164, 141, 236, 26, 52, 233, 100, 129, 216, 167, 245, 60, 60, 109, 33, + 46, 45, 25, 11, 75, 112, 84, 141, 239, 128, 182, 176, 41, 180, 10, 103, + 175, 23, 71, 224, 63, 110, 86, 35, 2, 200, 132, 25, 33, 38, 2, 158, + 6, 186, 203, 206, 93, 127, 129, 8, 0, 161, 27, 225, 230, 128, 98, 110, + 54, 254, 194, 239, 189, 33, 226, 113, 97, 186, 120, 235, 17, 11, 9, 95, + 17, 64, 12, 251, 143, 210, 228, 52, 164, 164, 221, 23, 129, 24, 32, 219, + 111, 148, 253, 40, 45, 41, 49, 57, 120, 166, 72, 66, 91, 108, 187, 131, + 182, 93, 132, 249, 98, 16, 40, 1, 17, 137, 188, 253, 78, 80, 12, 114, + 204, 59, 122, 199, 74, 181, 145, 161, 85, 5, 179, 73, 79, 163, 22, 34, + 79, 234, 89, 20, 165, 129, 253, 115, 115, 234, 129, 198, 72, 79, 31, 57, + 99, 2, 224, 47, 185, 186, 164, 135, 220, 235, 140, 103, 132, 153, 131, 16, + 59, 20, 142, 58, 201, 150, 174, 57, 162, 40, 98, 205, 177, 226, 192, 218, + 28, 154, 111, 12, 164, 79, 172, 14, 97, 191, 215, 36, 212, 4, 206, 180, + 27, 26, 167, 12, 89, 209, 140, 99, 31, 88, 189, 38, 130, 119, 120, 8, + 91, 221, 217, 161, 53, 99, 93, 168, 47, 65, 120, 196, 159, 27, 246, 199, + 186, 29, 234, 224, 38, 190, 71, 100, 223, 45, 136, 8, 189, 192, 18, 229, + 232, 130, 200, 234, 231, 35, 29, 249, 85, 121, 123, 10, 218, 95, 2, 34, + 249, 58, 17, 205, 23, 52, 43, 167, 221, 192, 34, 123, 26, 228, 34, 8, + 19, 152, 43, 140, 19, 180, 129, 112, 228, 8, 4, 236, 217, 50, 10, 193, + 73, 20, 79, 152, 100, 56, 73, 128, 203, 200, 154, 58, 66, 176, 135, 225, + 192, 149, 143, 111, 166, 135, 205, 247, 180, 238, 158, 204, 76, 252, 102, 25, + 154, 130, 76, 53, 155, 114, 107, 251, 57, 179, 100, 94, 41, 53, 212, 167, + 53, 151, 55, 92, 126, 253, 162, 89, 37, 101, 111, 119, 80, 57, 197, 187, + 223, 154, 242, 162, 228, 187, 10, 180, 200, 13, 165, 143, 106, 54, 10, 38, + 245, 50, 103, 14, 163, 120, 142, 255, 209, 212, 102, 163, 97, 101, 51, 220, + 52, 192, 185, 243, 137, 107, 233, 196, 129, 176, 160, 181, 73, 127, 13, 191, + 53, 165, 27, 69, 202, 218, 248, 90, 203, 126, 85, 246, 212, 134, 193, 50, + 242, 253, 16, 77, 252, 112, 172, 170, 85, 92, 133, 173, 51, 63, 141, 212, + 79, 58, 199, 52, 189, 249, 152, 161, 149, 91, 80, 179, 3, 227, 25, 162, + 117, 3, 11, 186, 182, 191, 156, 142, 103, 43, 54, 120, 16, 223, 122, 195, + 159, 127, 193, 13, 19, 207, 163, 66, 55, 186, 61, 129, 73, 137, 44, 7, + 131, 96, 201, 215, 140, 40, 152, 179, 210, 64, 96, 114, 151, 99, 72, 51, + 216, 112, 7, 11, 214, 103, 48, 64, 192, 122, 63, 119, 224, 244, 212, 69, + 48, 55, 188, 28, 134, 184, 55, 9, 201, 90, 190, 146, 84, 228, 204, 100, + 225, 44, 219, 159, 236, 41, 154, 36, 138, 248, 93, 160, 218, 17, 4, 45, + 189, 147, 209, 196, 34, 5, 98, 14, 3, 149, 175, 164, 117, 225, 211, 57, + 63, 175, 217, 188, 34, 47, 9, 202, 64, 245, 13, 58, 11, 59, 194, 84, + 45, 53, 144, 81, 10, 196, 66, 214, 79, 157, 121, 79, 2, 157, 9, 67, + 157, 91, 59, 92, 135, 24, 63, 90, 71, 5, 229, 107, 15, 47, 12, 208, + 199, 85, 237, 75, 131, 98, 148, 243, 116, 185, 166, 61, 60, 253, 247, 81, + 119, 150, 109, 97, 133, 132, 138, 138, 49, 39, 111, 153, 216, 143, 75, 98, + 130, 47, 113, 104, 70, 21, 187, 70, 217, 22, 43, 118, 33, 123, 4, 171, + 123, 127, 217, 159, 44, 176, 189, 164, 43, 31, 34, 132, 157, 206, 146, 25, + 99, 206, 178, 120, 136, 184, 208, 200, 199, 209, 145, 130, 192, 69, 227, 15, + 255, 223, 87, 196, 137, 126, 243, 159, 246, 238, 64, 135, 81, 210, 133, 146, + 178, 25, 32, 243, 220, 42, 134, 76, 26, 50, 228, 252, 73, 183, 126, 52, + 189, 135, 167, 155, 213, 210, 30, 161, 42, 239, 100, 53, 238, 67, 2, 194, + 99, 68, 37, 122, 52, 104, 97, 81, 218, 55, 255, 185, 95, 83, 83, 208, + 155, 102, 84, 249, 20, 65, 13, 22, 92, 82, 19, 66, 179, 113, 21, 69, + 172, 233, 124, 57, 152, 126, 154, 78, 216, 95, 10, 176, 35, 180, 111, 197, + 36, 135, 75, 127, 195, 22, 160, 16, 237, 94, 69, 179, 27, 127, 75, 69, + 133, 129, 145, 137, 153, 107, 12, 87, 184, 186, 127, 59, 237, 241, 20, 122, + 51, 239, 140, 189, 15, 221, 193, 120, 216, 91, 62, 128, 72, 247, 204, 96, + 43, 50, 244, 179, 183, 113, 214, 189, 131, 131, 35, 69, 147, 78, 202, 57, + 13, 236, 254, 104, 53, 4, 155, 205, 202, 119, 87, 129, 123, 231, 187, 119, + 65, 156, 162, 223, 253, 91, 138, 120, 119, 237, 118, 251, 114, 147, 112, 182, + 43, 7, 51, 2, 22, 156, 170, 2, 76, 201, 221, 214, 121, 242, 4, 88, + 248, 93, 9, 153, 135, 99, 170, 149, 87, 90, 98, 191, 169, 47, 44, 136, + 241, 115, 121, 229, 222, 17, 154, 114, 111, 186, 164, 231, 83, 126, 88, 85, + 170, 43, 9, 118, 60, 35, 78, 220, 158, 61, 191, 71, 128, 227, 153, 107, + 161, 115, 85, 244, 48, 80, 158, 209, 218, 57, 168, 64, 58, 17, 247, 51, + 163, 34, 127, 126, 62, 195, 184, 159, 141, 184, 159, 101, 92, 204, 247, 206, + 139, 85, 233, 116, 55, 138, 246, 28, 229, 59, 119, 166, 54, 131, 1, 134, + 179, 186, 30, 54, 1, 17, 13, 39, 208, 234, 147, 228, 101, 89, 103, 186, + 54, 9, 192, 27, 76, 66, 33, 198, 151, 187, 211, 120, 242, 82, 188, 161, + 9, 147, 40, 96, 157, 45, 160, 64, 196, 50, 70, 210, 208, 82, 177, 55, + 36, 67, 69, 188, 55, 66, 71, 161, 4, 191, 204, 14, 67, 17, 95, 142, + 166, 43, 58, 91, 128, 209, 10, 108, 226, 142, 191, 224, 5, 73, 111, 213, + 25, 229, 151, 250, 191, 12, 97, 97, 189, 233, 35, 142, 54, 194, 122, 9, + 48, 68, 196, 143, 69, 97, 100, 218, 83, 132, 92, 90, 37, 206, 234, 98, + 214, 153, 8, 120, 213, 41, 76, 40, 143, 1, 200, 151, 90, 66, 46, 72, + 197, 27, 174, 175, 228, 184, 96, 228, 77, 57, 214, 82, 133, 205, 113, 43, + 99, 26, 254, 190, 154, 47, 86, 176, 252, 22, 64, 43, 124, 200, 156, 123, + 113, 45, 13, 191, 242, 20, 121, 112, 12, 100, 179, 31, 90, 84, 89, 247, + 220, 192, 46, 237, 160, 131, 40, 44, 25, 42, 33, 10, 55, 172, 140, 82, + 173, 203, 182, 70, 114, 31, 41, 204, 151, 141, 145, 196, 186, 46, 215, 61, + 35, 15, 251, 43, 19, 114, 83, 224, 254, 51, 110, 229, 61, 222, 169, 25, + 213, 87, 85, 213, 248, 168, 51, 88, 166, 201, 22, 105, 41, 108, 152, 158, + 169, 204, 126, 178, 109, 180, 243, 66, 79, 183, 133, 141, 89, 30, 245, 59, + 139, 165, 39, 125, 178, 75, 103, 246, 162, 19, 190, 249, 79, 239, 166, 179, + 192, 157, 147, 214, 76, 227, 162, 145, 243, 13, 200, 16, 79, 142, 7, 238, + 139, 108, 156, 176, 32, 142, 68, 153, 71, 191, 89, 164, 147, 94, 72, 219, + 98, 217, 159, 217, 226, 66, 17, 134, 121, 54, 227, 23, 113, 148, 174, 86, + 182, 20, 104, 58, 56, 105, 208, 176, 219, 159, 63, 244, 12, 156, 80, 96, + 250, 143, 13, 147, 175, 159, 12, 167, 56, 104, 68, 154, 200, 78, 241, 194, + 19, 19, 158, 209, 232, 51, 49, 175, 12, 68, 86, 52, 69, 212, 16, 163, + 58, 149, 92, 220, 4, 82, 42, 13, 19, 30, 107, 41, 230, 3, 242, 161, + 187, 64, 56, 31, 150, 5, 106, 116, 197, 53, 11, 194, 27, 167, 207, 43, + 30, 161, 105, 4, 88, 105, 120, 2, 67, 209, 24, 87, 229, 233, 4, 246, + 73, 225, 164, 226, 118, 53, 162, 210, 115, 109, 198, 96, 180, 11, 70, 158, + 6, 30, 164, 146, 169, 164, 92, 34, 78, 236, 79, 67, 60, 234, 65, 31, + 46, 167, 51, 58, 233, 117, 17, 6, 116, 62, 20, 54, 244, 60, 123, 230, + 125, 130, 213, 71, 38, 131, 6, 111, 183, 187, 130, 179, 101, 242, 7, 82, + 245, 23, 213, 134, 169, 9, 47, 205, 239, 208, 115, 7, 115, 103, 120, 153, + 33, 185, 51, 49, 87, 191, 207, 176, 95, 178, 225, 210, 151, 239, 152, 17, + 59, 159, 67, 32, 233, 197, 180, 59, 236, 136, 91, 62, 115, 138, 67, 187, + 127, 165, 217, 185, 244, 117, 184, 40, 14, 58, 190, 7, 13, 97, 127, 85, + 253, 94, 172, 8, 48, 117, 231, 211, 53, 16, 44, 151, 81, 102, 143, 216, + 43, 13, 166, 57, 32, 104, 16, 136, 250, 132, 3, 162, 150, 117, 223, 64, + 141, 149, 93, 21, 7, 125, 79, 131, 198, 210, 84, 198, 13, 130, 45, 216, + 51, 235, 252, 7, 250, 138, 103, 40, 84, 183, 79, 96, 138, 140, 237, 87, + 168, 11, 255, 154, 58, 70, 181, 241, 107, 189, 144, 18, 2, 182, 98, 240, + 95, 121, 89, 194, 255, 42, 184, 60, 206, 12, 234, 141, 214, 138, 115, 143, + 120, 31, 220, 14, 122, 136, 233, 49, 198, 171, 46, 238, 51, 90, 145, 236, + 220, 138, 100, 244, 161, 30, 60, 188, 76, 1, 151, 184, 111, 157, 82, 156, + 157, 100, 139, 201, 239, 88, 57, 184, 12, 47, 145, 49, 102, 113, 184, 52, + 61, 151, 45, 116, 215, 219, 195, 188, 34, 59, 218, 235, 179, 11, 160, 225, + 222, 157, 47, 109, 15, 207, 112, 42, 1, 89, 195, 175, 227, 56, 113, 215, + 181, 85, 217, 99, 23, 35, 97, 5, 248, 204, 19, 32, 227, 78, 214, 73, + 9, 217, 84, 30, 223, 201, 144, 195, 5, 25, 134, 242, 58, 15, 245, 100, + 156, 221, 117, 126, 250, 180, 14, 43, 224, 24, 235, 151, 172, 55, 93, 69, + 200, 240, 152, 145, 2, 209, 122, 195, 14, 47, 173, 7, 135, 139, 60, 143, + 165, 71, 139, 153, 60, 63, 114, 190, 51, 190, 138, 41, 36, 247, 60, 88, + 116, 230, 114, 50, 71, 114, 10, 114, 25, 174, 88, 247, 67, 214, 130, 199, + 15, 82, 17, 37, 5, 56, 173, 178, 238, 78, 251, 183, 183, 195, 46, 226, + 0, 44, 48, 49, 185, 34, 91, 240, 162, 19, 205, 123, 198, 170, 192, 94, + 174, 120, 144, 222, 114, 4, 186, 96, 79, 101, 145, 25, 124, 234, 64, 113, + 201, 74, 94, 122, 240, 201, 38, 206, 142, 63, 56, 171, 71, 95, 217, 111, + 251, 139, 129, 242, 16, 80, 75, 249, 144, 32, 96, 255, 140, 162, 23, 133, + 161, 114, 197, 218, 109, 163, 158, 196, 114, 99, 155, 174, 36, 48, 238, 4, + 21, 7, 62, 85, 178, 253, 72, 104, 57, 170, 167, 148, 199, 134, 69, 214, + 222, 8, 78, 247, 179, 17, 28, 222, 217, 49, 129, 104, 106, 92, 172, 209, + 61, 16, 54, 202, 56, 147, 66, 21, 161, 242, 52, 226, 119, 204, 171, 9, + 163, 208, 229, 244, 83, 31, 47, 255, 11, 52, 198, 106, 228, 29, 98, 255, + 130, 184, 76, 226, 229, 38, 103, 216, 132, 99, 129, 92, 36, 40, 31, 221, + 118, 77, 120, 70, 64, 28, 89, 159, 172, 55, 104, 154, 162, 237, 6, 223, + 185, 137, 143, 41, 87, 221, 148, 198, 200, 89, 228, 22, 250, 218, 11, 67, + 211, 13, 11, 211, 143, 87, 35, 17, 130, 168, 74, 228, 38, 209, 121, 65, + 118, 140, 236, 147, 129, 63, 209, 53, 214, 133, 79, 6, 141, 138, 190, 51, + 225, 198, 33, 27, 151, 214, 148, 115, 166, 140, 61, 127, 64, 28, 105, 210, + 216, 65, 113, 12, 70, 182, 139, 221, 136, 242, 45, 101, 111, 173, 158, 18, + 245, 180, 113, 219, 155, 233, 116, 108, 226, 152, 220, 194, 124, 152, 116, 198, + 122, 226, 188, 226, 236, 11, 187, 111, 136, 106, 44, 247, 112, 88, 152, 222, + 167, 118, 0, 165, 66, 115, 34, 179, 35, 6, 6, 118, 191, 59, 116, 88, + 226, 242, 86, 202, 94, 60, 196, 54, 200, 181, 16, 75, 255, 162, 115, 39, + 167, 59, 243, 57, 200, 61, 137, 156, 14, 12, 9, 170, 124, 220, 106, 208, + 38, 41, 180, 89, 26, 231, 26, 84, 11, 26, 33, 54, 223, 132, 58, 139, + 108, 12, 254, 102, 52, 136, 210, 52, 147, 101, 167, 108, 239, 235, 150, 217, + 242, 202, 179, 46, 20, 207, 158, 117, 161, 228, 148, 37, 103, 160, 32, 178, + 74, 168, 112, 82, 66, 248, 16, 105, 5, 218, 98, 208, 16, 181, 108, 203, + 70, 87, 109, 141, 71, 104, 106, 109, 118, 166, 202, 109, 110, 122, 111, 186, + 235, 143, 128, 85, 89, 14, 209, 198, 74, 24, 156, 55, 201, 219, 248, 162, + 61, 70, 119, 102, 8, 44, 254, 2, 141, 115, 213, 9, 187, 198, 71, 236, + 9, 144, 95, 133, 127, 91, 167, 85, 149, 134, 18, 97, 229, 52, 168, 55, + 119, 118, 23, 230, 64, 7, 218, 204, 238, 160, 250, 92, 7, 90, 136, 59, + 13, 126, 239, 176, 137, 226, 128, 253, 222, 225, 116, 224, 123, 90, 224, 130, + 231, 17, 95, 69, 209, 107, 34, 95, 9, 185, 173, 179, 129, 236, 106, 177, + 19, 65, 134, 240, 211, 128, 44, 225, 167, 169, 28, 190, 34, 98, 42, 122, + 208, 161, 91, 38, 41, 87, 37, 79, 172, 183, 182, 80, 85, 57, 43, 85, + 44, 129, 80, 95, 199, 202, 224, 26, 197, 106, 98, 92, 138, 23, 136, 255, + 240, 182, 190, 213, 16, 255, 41, 136, 107, 106, 11, 53, 150, 98, 103, 43, + 31, 127, 178, 49, 111, 215, 121, 225, 58, 84, 197, 29, 11, 71, 14, 196, + 20, 209, 224, 84, 62, 173, 219, 142, 252, 202, 13, 132, 120, 171, 140, 198, + 202, 20, 162, 139, 82, 160, 131, 156, 95, 226, 189, 2, 181, 94, 21, 29, + 245, 137, 199, 1, 107, 86, 48, 233, 116, 13, 98, 223, 119, 134, 180, 224, + 144, 162, 5, 42, 100, 111, 171, 238, 151, 223, 189, 255, 230, 155, 255, 248, + 203, 119, 59, 82, 181, 46, 137, 144, 247, 127, 125, 243, 245, 119, 8, 48, + 131, 234, 75, 16, 230, 125, 181, 147, 253, 83, 111, 10, 141, 145, 71, 164, + 254, 82, 166, 222, 6, 60, 12, 30, 157, 195, 123, 85, 190, 173, 220, 125, + 110, 171, 59, 225, 22, 22, 98, 252, 199, 135, 47, 141, 183, 111, 241, 70, + 213, 190, 71, 43, 251, 140, 124, 3, 15, 187, 73, 187, 11, 45, 58, 239, + 208, 52, 3, 86, 166, 189, 118, 241, 111, 66, 127, 55, 46, 43, 173, 66, + 160, 120, 72, 228, 195, 198, 93, 205, 32, 24, 254, 36, 248, 103, 163, 87, + 52, 204, 20, 167, 22, 231, 43, 153, 13, 116, 137, 153, 95, 227, 14, 237, + 64, 162, 100, 94, 55, 100, 241, 169, 55, 177, 166, 32, 33, 234, 41, 137, + 61, 185, 174, 32, 89, 180, 133, 229, 234, 41, 150, 19, 227, 214, 206, 68, + 216, 240, 25, 87, 207, 147, 126, 184, 245, 149, 222, 254, 186, 165, 150, 18, + 246, 117, 201, 81, 12, 37, 51, 105, 133, 229, 74, 85, 96, 227, 155, 52, + 203, 34, 93, 178, 213, 76, 176, 120, 182, 54, 210, 34, 231, 206, 168, 243, + 17, 236, 62, 110, 81, 69, 36, 196, 223, 150, 231, 68, 187, 138, 5, 209, + 62, 58, 231, 31, 33, 154, 101, 98, 48, 137, 59, 228, 118, 119, 62, 93, + 224, 166, 42, 124, 91, 110, 63, 238, 140, 48, 12, 240, 34, 8, 103, 52, + 102, 59, 185, 242, 34, 66, 104, 6, 6, 241, 78, 222, 77, 123, 145, 213, + 145, 225, 137, 189, 33, 64, 107, 203, 131, 29, 148, 197, 147, 162, 102, 88, + 161, 190, 12, 132, 140, 233, 210, 218, 195, 205, 20, 38, 223, 185, 239, 235, + 82, 159, 97, 101, 194, 42, 209, 95, 117, 154, 88, 149, 136, 52, 90, 72, + 241, 229, 35, 233, 183, 52, 73, 191, 5, 125, 141, 26, 117, 2, 250, 234, + 169, 209, 203, 93, 64, 189, 218, 9, 2, 183, 19, 132, 240, 143, 140, 238, + 220, 78, 4, 239, 17, 188, 71, 81, 102, 116, 166, 156, 106, 73, 167, 18, + 199, 142, 84, 199, 112, 21, 133, 182, 219, 25, 58, 182, 176, 8, 150, 209, + 145, 29, 91, 34, 120, 65, 179, 226, 94, 5, 82, 181, 73, 252, 158, 95, + 187, 17, 121, 147, 80, 220, 70, 182, 54, 217, 49, 183, 142, 36, 125, 194, + 76, 77, 24, 169, 9, 19, 181, 74, 102, 16, 22, 72, 123, 39, 55, 179, + 120, 59, 188, 106, 93, 163, 167, 4, 251, 220, 221, 158, 215, 16, 112, 255, + 102, 198, 0, 197, 62, 59, 121, 198, 0, 169, 229, 20, 9, 133, 39, 167, + 106, 27, 10, 11, 227, 170, 242, 131, 85, 0, 31, 219, 153, 207, 59, 9, + 79, 50, 196, 52, 94, 35, 240, 32, 185, 89, 111, 39, 250, 113, 67, 143, + 12, 204, 41, 252, 178, 137, 151, 36, 251, 162, 23, 136, 213, 108, 52, 236, + 226, 182, 221, 49, 92, 161, 117, 70, 83, 33, 224, 252, 193, 253, 145, 166, + 253, 63, 236, 206, 250, 48, 244, 10, 17, 195, 204, 9, 83, 163, 56, 17, + 73, 81, 44, 9, 144, 15, 27, 4, 132, 120, 122, 114, 96, 16, 136, 106, + 55, 93, 252, 127, 16, 224, 221, 97, 64, 168, 123, 254, 83, 75, 183, 73, + 90, 79, 39, 216, 227, 8, 126, 175, 31, 120, 249, 33, 82, 190, 47, 137, + 245, 129, 50, 20, 142, 197, 83, 5, 100, 241, 212, 48, 138, 86, 109, 103, + 12, 17, 209, 118, 8, 146, 197, 109, 38, 116, 94, 59, 124, 184, 212, 235, + 21, 107, 127, 83, 67, 44, 140, 165, 170, 96, 136, 213, 8, 44, 69, 12, + 45, 30, 106, 5, 158, 195, 235, 246, 26, 86, 143, 30, 58, 137, 143, 92, + 50, 14, 214, 202, 171, 63, 217, 168, 5, 138, 182, 203, 195, 183, 30, 226, + 145, 145, 245, 114, 143, 189, 200, 231, 227, 54, 217, 126, 89, 198, 69, 11, + 102, 224, 52, 183, 249, 136, 45, 54, 96, 150, 17, 209, 132, 153, 64, 228, + 73, 105, 0, 234, 166, 237, 23, 176, 173, 71, 211, 79, 33, 118, 79, 197, + 170, 213, 144, 95, 218, 162, 158, 66, 213, 233, 173, 119, 118, 141, 249, 39, + 210, 239, 133, 40, 127, 42, 227, 167, 10, 187, 31, 102, 166, 166, 70, 160, + 245, 14, 100, 138, 141, 134, 86, 12, 42, 177, 132, 126, 167, 76, 40, 6, + 60, 237, 43, 62, 84, 197, 195, 185, 74, 228, 145, 100, 9, 8, 247, 18, + 0, 252, 97, 142, 132, 36, 67, 130, 136, 115, 128, 136, 200, 32, 66, 147, + 177, 201, 146, 17, 29, 32, 163, 136, 144, 77, 142, 16, 131, 148, 130, 37, + 101, 122, 79, 211, 39, 111, 158, 45, 20, 153, 164, 201, 213, 160, 223, 233, + 181, 129, 85, 252, 180, 28, 164, 130, 204, 88, 25, 156, 16, 152, 17, 84, + 64, 14, 18, 68, 66, 155, 209, 53, 56, 251, 175, 130, 184, 116, 99, 124, + 132, 206, 18, 107, 249, 27, 244, 196, 161, 2, 122, 50, 72, 138, 131, 102, + 122, 89, 81, 80, 205, 54, 66, 233, 190, 168, 134, 4, 166, 235, 239, 84, + 43, 240, 6, 194, 176, 186, 29, 212, 87, 35, 60, 93, 124, 242, 224, 68, + 108, 203, 54, 181, 116, 171, 41, 69, 166, 51, 3, 30, 10, 57, 156, 208, + 124, 189, 64, 82, 118, 41, 199, 78, 233, 6, 114, 37, 158, 2, 109, 63, + 2, 206, 139, 246, 160, 74, 70, 123, 233, 204, 181, 177, 138, 54, 87, 220, + 118, 206, 169, 218, 20, 36, 163, 92, 192, 234, 241, 77, 188, 37, 104, 220, + 50, 109, 252, 149, 143, 97, 173, 76, 155, 62, 63, 33, 107, 0, 79, 48, + 81, 223, 23, 77, 232, 51, 66, 26, 112, 190, 97, 152, 129, 81, 81, 148, + 115, 2, 25, 192, 40, 136, 48, 48, 47, 138, 114, 1, 81, 46, 40, 202, + 5, 68, 249, 198, 139, 157, 145, 221, 77, 70, 67, 148, 170, 66, 219, 57, + 239, 93, 231, 27, 233, 10, 18, 117, 91, 70, 198, 112, 253, 6, 159, 37, + 143, 181, 151, 55, 179, 203, 104, 64, 241, 17, 250, 198, 15, 63, 194, 159, + 40, 197, 206, 28, 96, 209, 236, 2, 22, 205, 62, 150, 69, 35, 175, 56, + 112, 130, 35, 127, 43, 176, 254, 122, 77, 215, 92, 130, 113, 11, 111, 82, + 193, 9, 33, 201, 67, 194, 150, 224, 237, 120, 105, 162, 46, 182, 231, 119, + 145, 186, 41, 194, 13, 130, 133, 32, 188, 175, 203, 77, 93, 238, 232, 194, + 232, 8, 95, 80, 44, 194, 126, 41, 214, 242, 33, 145, 15, 27, 2, 239, + 97, 255, 116, 2, 118, 141, 238, 248, 19, 216, 126, 178, 8, 62, 56, 240, + 212, 182, 148, 198, 234, 89, 24, 27, 255, 218, 77, 104, 124, 109, 204, 134, + 125, 144, 1, 88, 199, 130, 15, 80, 44, 128, 52, 212, 193, 128, 56, 36, + 213, 66, 81, 139, 248, 7, 253, 146, 196, 63, 234, 151, 77, 252, 15, 13, + 7, 36, 42, 21, 156, 24, 179, 89, 180, 154, 107, 169, 230, 51, 236, 104, + 194, 104, 247, 34, 141, 100, 122, 110, 32, 153, 162, 180, 35, 96, 89, 135, + 19, 176, 168, 3, 198, 149, 75, 0, 167, 63, 240, 38, 255, 35, 159, 87, + 254, 177, 43, 154, 178, 186, 229, 168, 189, 244, 118, 206, 138, 239, 214, 152, + 225, 179, 201, 63, 65, 192, 184, 159, 48, 245, 248, 23, 86, 253, 211, 6, + 172, 57, 227, 144, 108, 240, 198, 240, 20, 193, 121, 181, 142, 207, 33, 171, + 16, 6, 116, 177, 161, 214, 35, 39, 144, 142, 147, 8, 218, 44, 253, 209, + 199, 146, 213, 199, 40, 251, 209, 199, 163, 131, 248, 24, 88, 114, 182, 141, + 93, 46, 218, 13, 90, 166, 208, 227, 194, 231, 33, 74, 218, 240, 99, 246, + 119, 96, 181, 69, 243, 150, 156, 102, 9, 56, 6, 21, 163, 230, 140, 35, + 142, 33, 9, 219, 159, 61, 179, 232, 158, 204, 31, 117, 119, 67, 81, 130, + 145, 127, 75, 231, 79, 49, 68, 9, 50, 255, 168, 48, 127, 189, 127, 162, + 110, 62, 182, 160, 206, 240, 204, 204, 144, 98, 80, 150, 50, 195, 115, 91, + 69, 253, 27, 197, 244, 104, 126, 142, 129, 81, 231, 127, 228, 65, 8, 62, + 79, 198, 246, 85, 212, 251, 137, 250, 253, 154, 182, 80, 85, 200, 51, 195, + 0, 39, 228, 206, 64, 13, 62, 101, 82, 131, 94, 37, 234, 54, 1, 140, + 9, 103, 87, 82, 249, 45, 178, 134, 184, 222, 148, 91, 103, 245, 230, 229, + 89, 4, 127, 2, 255, 130, 254, 226, 115, 51, 160, 71, 31, 255, 194, 255, + 125, 250, 63, 254, 166, 188, 3, 69, 21, 43, 239, 50, 40, 168, 208, 34, + 230, 178, 91, 32, 175, 33, 86, 45, 158, 56, 55, 168, 199, 8, 219, 237, + 205, 116, 109, 72, 137, 223, 179, 172, 167, 80, 82, 202, 106, 111, 195, 57, + 134, 201, 212, 240, 176, 238, 239, 57, 182, 161, 34, 189, 93, 75, 149, 195, + 139, 185, 188, 60, 72, 127, 122, 102, 232, 244, 50, 17, 38, 27, 125, 160, + 240, 162, 67, 216, 93, 188, 189, 13, 87, 195, 50, 178, 199, 168, 91, 110, + 112, 204, 112, 246, 186, 219, 169, 99, 216, 157, 201, 48, 91, 235, 174, 155, + 116, 221, 77, 215, 93, 172, 221, 69, 226, 46, 128, 203, 45, 93, 217, 229, + 225, 248, 11, 4, 198, 26, 190, 253, 194, 175, 32, 146, 46, 6, 4, 28, + 16, 168, 128, 144, 3, 66, 10, 192, 168, 182, 103, 99, 66, 23, 99, 241, + 115, 64, 31, 66, 126, 9, 109, 180, 49, 155, 143, 109, 174, 190, 3, 69, + 58, 80, 166, 179, 216, 160, 204, 146, 46, 80, 28, 160, 199, 1, 130, 156, + 77, 215, 158, 209, 244, 201, 177, 109, 162, 237, 246, 109, 24, 249, 197, 30, + 18, 160, 138, 2, 27, 165, 72, 158, 66, 175, 251, 159, 250, 83, 212, 248, + 75, 30, 94, 217, 149, 163, 15, 94, 218, 205, 133, 126, 157, 98, 182, 152, + 196, 128, 116, 116, 105, 72, 204, 230, 195, 49, 121, 66, 165, 113, 162, 47, + 32, 66, 117, 1, 97, 201, 106, 29, 88, 164, 243, 171, 49, 36, 114, 245, + 106, 156, 94, 140, 3, 247, 156, 241, 213, 113, 150, 185, 56, 203, 92, 154, + 101, 46, 205, 50, 23, 103, 153, 75, 179, 204, 61, 119, 91, 174, 185, 220, + 10, 28, 84, 185, 192, 138, 165, 148, 63, 242, 47, 227, 163, 250, 226, 183, + 65, 200, 7, 56, 251, 27, 240, 255, 38, 228, 118, 70, 97, 1, 60, 99, + 72, 4, 239, 45, 248, 142, 97, 13, 120, 142, 8, 214, 38, 132, 176, 38, + 27, 107, 253, 1, 255, 2, 253, 127, 107, 50, 174, 195, 162, 245, 213, 79, + 216, 60, 242, 160, 223, 77, 221, 206, 177, 253, 45, 94, 208, 89, 244, 1, + 24, 37, 17, 34, 163, 167, 95, 159, 217, 95, 82, 64, 225, 42, 161, 199, + 86, 193, 133, 88, 55, 125, 33, 102, 48, 226, 190, 112, 248, 138, 156, 152, + 0, 45, 115, 243, 15, 161, 113, 179, 149, 186, 184, 18, 118, 109, 118, 77, + 146, 154, 250, 42, 49, 251, 249, 70, 76, 69, 129, 138, 58, 190, 174, 44, + 173, 64, 194, 160, 85, 84, 48, 45, 235, 33, 174, 2, 183, 212, 156, 162, + 56, 170, 38, 194, 74, 67, 14, 32, 165, 119, 199, 48, 197, 12, 46, 48, + 116, 109, 121, 248, 3, 159, 224, 140, 92, 131, 51, 50, 218, 202, 120, 232, + 171, 113, 27, 165, 131, 128, 93, 220, 54, 140, 32, 224, 58, 67, 228, 33, + 215, 228, 223, 145, 240, 67, 11, 84, 233, 84, 19, 194, 122, 0, 167, 184, + 54, 28, 227, 218, 27, 211, 32, 43, 191, 28, 8, 55, 187, 157, 180, 231, + 156, 233, 28, 214, 215, 206, 242, 160, 132, 103, 237, 199, 137, 31, 111, 124, + 165, 193, 33, 207, 90, 69, 39, 173, 166, 47, 143, 90, 112, 208, 10, 155, + 232, 181, 68, 117, 55, 30, 178, 96, 89, 86, 199, 172, 144, 159, 113, 155, + 238, 156, 82, 212, 252, 13, 165, 235, 215, 27, 230, 45, 167, 81, 115, 181, + 100, 136, 59, 172, 236, 13, 86, 126, 221, 208, 109, 80, 32, 71, 78, 31, + 186, 26, 184, 219, 64, 61, 26, 167, 116, 168, 66, 112, 56, 152, 187, 141, + 227, 86, 150, 144, 28, 221, 6, 66, 123, 94, 106, 209, 71, 226, 55, 16, + 186, 242, 82, 103, 62, 98, 141, 125, 70, 90, 97, 185, 166, 57, 195, 245, + 188, 102, 242, 175, 83, 99, 64, 156, 34, 12, 75, 60, 224, 157, 239, 135, + 243, 62, 223, 125, 229, 225, 60, 191, 156, 178, 118, 116, 74, 104, 171, 175, + 184, 89, 73, 108, 122, 171, 155, 43, 119, 98, 224, 178, 30, 62, 179, 7, + 154, 153, 215, 4, 5, 123, 204, 236, 149, 211, 4, 3, 10, 163, 1, 140, + 214, 0, 94, 7, 211, 81, 143, 76, 181, 170, 196, 86, 153, 94, 89, 115, + 107, 131, 248, 103, 180, 142, 95, 63, 179, 204, 182, 50, 12, 145, 242, 206, + 15, 194, 52, 212, 167, 108, 44, 147, 65, 73, 183, 81, 10, 172, 153, 1, + 187, 93, 85, 91, 188, 52, 53, 219, 80, 217, 35, 161, 98, 75, 225, 250, + 226, 209, 229, 102, 32, 60, 143, 217, 53, 98, 14, 248, 48, 128, 28, 21, + 59, 127, 192, 213, 135, 128, 148, 175, 206, 96, 201, 179, 127, 166, 224, 179, + 107, 107, 126, 119, 21, 186, 231, 244, 27, 185, 23, 215, 144, 37, 44, 56, + 115, 59, 36, 3, 13, 181, 64, 109, 208, 252, 207, 94, 216, 9, 44, 178, + 228, 23, 40, 80, 102, 40, 110, 211, 124, 129, 115, 71, 200, 54, 130, 29, + 92, 142, 216, 16, 247, 23, 88, 56, 155, 215, 25, 92, 99, 49, 32, 167, + 163, 244, 110, 195, 93, 147, 209, 6, 17, 161, 200, 130, 186, 237, 55, 110, + 251, 181, 66, 208, 200, 106, 127, 244, 151, 2, 42, 146, 4, 166, 34, 142, + 169, 213, 84, 116, 157, 80, 54, 74, 63, 160, 148, 1, 163, 244, 117, 252, + 38, 126, 47, 37, 213, 2, 49, 34, 125, 101, 94, 204, 235, 6, 190, 113, + 209, 32, 59, 240, 76, 186, 57, 149, 202, 27, 98, 30, 31, 167, 180, 65, + 145, 186, 171, 155, 190, 177, 243, 234, 69, 139, 218, 0, 191, 154, 20, 25, + 73, 72, 41, 30, 126, 194, 44, 195, 101, 153, 145, 158, 229, 151, 67, 32, + 198, 51, 114, 47, 89, 15, 159, 76, 206, 47, 91, 21, 171, 204, 103, 19, + 152, 102, 234, 215, 124, 246, 51, 161, 242, 41, 23, 2, 57, 5, 33, 188, + 70, 151, 161, 58, 240, 180, 34, 253, 31, 28, 127, 240, 67, 120, 217, 186, + 108, 238, 251, 236, 95, 54, 46, 207, 46, 35, 249, 209, 87, 223, 224, 15, + 124, 110, 64, 202, 22, 68, 216, 243, 25, 15, 88, 77, 136, 180, 231, 115, + 4, 41, 91, 151, 97, 81, 217, 216, 10, 46, 213, 6, 255, 126, 68, 37, + 42, 177, 244, 124, 20, 218, 124, 16, 67, 132, 164, 190, 232, 103, 149, 154, + 242, 162, 52, 7, 99, 20, 151, 150, 41, 163, 32, 102, 38, 223, 76, 140, + 3, 52, 86, 172, 185, 148, 100, 177, 102, 2, 42, 61, 8, 207, 187, 74, + 196, 37, 31, 134, 87, 222, 153, 135, 156, 61, 31, 77, 91, 13, 252, 47, + 194, 46, 190, 84, 255, 175, 160, 76, 45, 144, 178, 49, 189, 175, 201, 97, + 170, 182, 54, 62, 245, 171, 125, 77, 106, 8, 185, 237, 201, 77, 123, 177, + 186, 233, 13, 239, 200, 67, 253, 226, 69, 17, 163, 67, 179, 235, 55, 31, + 124, 204, 253, 203, 149, 138, 57, 114, 43, 203, 20, 31, 135, 141, 147, 244, + 164, 156, 176, 66, 23, 28, 128, 142, 58, 253, 168, 138, 74, 221, 154, 8, + 178, 68, 49, 86, 246, 56, 84, 200, 205, 64, 226, 188, 161, 171, 196, 87, + 9, 137, 98, 39, 178, 77, 130, 143, 153, 227, 21, 148, 190, 70, 181, 112, + 119, 185, 37, 64, 4, 30, 157, 66, 67, 213, 9, 105, 250, 147, 131, 83, + 54, 196, 14, 136, 131, 17, 78, 191, 35, 1, 128, 207, 178, 153, 96, 103, + 163, 219, 212, 58, 80, 138, 126, 191, 213, 69, 39, 218, 179, 203, 231, 53, + 95, 127, 135, 58, 36, 1, 70, 203, 225, 155, 210, 147, 4, 53, 80, 81, + 11, 16, 227, 192, 222, 37, 13, 185, 237, 208, 10, 101, 36, 56, 144, 161, + 223, 97, 41, 121, 21, 162, 92, 4, 52, 129, 0, 35, 86, 32, 68, 35, + 196, 158, 27, 165, 69, 228, 129, 11, 227, 0, 187, 5, 101, 203, 183, 128, + 164, 185, 20, 223, 16, 232, 26, 131, 118, 162, 199, 43, 140, 93, 67, 156, + 107, 242, 223, 143, 97, 183, 48, 151, 71, 64, 169, 139, 19, 250, 127, 31, + 75, 37, 106, 9, 251, 138, 170, 175, 246, 12, 144, 214, 9, 123, 152, 113, + 50, 107, 203, 88, 233, 123, 153, 34, 146, 242, 252, 185, 181, 179, 233, 206, + 93, 249, 170, 191, 185, 251, 211, 159, 240, 126, 157, 216, 33, 242, 172, 21, + 219, 219, 243, 42, 242, 52, 59, 124, 108, 193, 99, 64, 40, 48, 1, 243, + 46, 35, 60, 81, 205, 51, 23, 168, 214, 160, 51, 186, 21, 62, 19, 45, + 207, 62, 113, 240, 29, 199, 59, 12, 189, 26, 130, 27, 241, 51, 194, 27, + 192, 87, 152, 1, 252, 157, 191, 178, 232, 192, 248, 42, 190, 203, 175, 248, + 253, 68, 185, 200, 176, 10, 25, 50, 139, 25, 178, 170, 125, 14, 159, 26, + 204, 112, 101, 249, 178, 6, 177, 96, 216, 35, 235, 38, 123, 158, 176, 79, + 74, 172, 1, 129, 195, 219, 246, 73, 0, 129, 226, 6, 161, 189, 134, 18, + 8, 156, 86, 36, 148, 136, 56, 180, 65, 210, 8, 155, 221, 155, 157, 185, + 205, 210, 137, 164, 170, 145, 111, 22, 4, 66, 56, 215, 4, 224, 12, 37, + 126, 111, 126, 5, 220, 95, 139, 113, 127, 146, 189, 199, 211, 213, 76, 44, + 223, 125, 169, 36, 95, 184, 82, 175, 102, 98, 116, 28, 114, 94, 33, 115, + 136, 17, 140, 48, 181, 218, 82, 41, 174, 37, 75, 51, 198, 98, 120, 14, + 139, 104, 193, 138, 185, 154, 201, 5, 83, 101, 203, 3, 47, 224, 211, 150, + 182, 107, 70, 93, 190, 167, 176, 140, 243, 191, 140, 209, 51, 25, 175, 54, + 159, 210, 63, 58, 181, 73, 103, 58, 117, 155, 132, 61, 16, 124, 254, 148, + 126, 208, 53, 224, 5, 101, 112, 193, 45, 153, 42, 129, 154, 55, 162, 7, + 81, 6, 90, 242, 251, 245, 224, 169, 53, 66, 244, 53, 18, 78, 163, 109, + 185, 94, 117, 86, 51, 181, 232, 232, 139, 181, 223, 184, 81, 138, 12, 254, + 85, 155, 165, 166, 255, 17, 27, 166, 89, 233, 223, 180, 105, 138, 12, 30, + 191, 113, 226, 45, 207, 59, 9, 11, 64, 104, 241, 40, 84, 166, 37, 233, + 10, 54, 202, 119, 53, 152, 139, 240, 115, 189, 131, 253, 19, 182, 209, 218, + 213, 246, 228, 203, 191, 142, 63, 193, 33, 100, 119, 77, 74, 101, 24, 29, + 215, 171, 10, 110, 112, 44, 144, 142, 220, 210, 63, 208, 74, 52, 121, 30, + 151, 156, 119, 165, 151, 254, 51, 216, 96, 47, 81, 75, 22, 67, 203, 201, + 211, 50, 6, 215, 130, 74, 197, 11, 42, 124, 121, 141, 1, 151, 214, 19, + 243, 219, 203, 43, 236, 189, 127, 92, 63, 187, 114, 2, 242, 219, 13, 233, + 17, 32, 159, 60, 114, 211, 243, 63, 174, 81, 48, 234, 188, 195, 33, 6, + 101, 14, 9, 12, 198, 174, 217, 201, 165, 61, 12, 197, 115, 121, 24, 60, + 197, 28, 161, 124, 50, 140, 178, 127, 246, 9, 106, 232, 29, 162, 11, 5, + 151, 246, 207, 152, 232, 103, 18, 143, 227, 91, 168, 222, 194, 75, 235, 202, + 70, 177, 232, 48, 116, 135, 208, 144, 145, 251, 179, 239, 254, 28, 184, 63, + 195, 98, 211, 192, 16, 8, 135, 103, 72, 127, 173, 236, 57, 174, 62, 146, + 187, 195, 82, 55, 217, 172, 75, 118, 32, 245, 164, 34, 156, 132, 250, 21, + 39, 4, 47, 50, 122, 2, 136, 254, 187, 230, 37, 157, 135, 83, 175, 63, + 234, 172, 38, 168, 20, 164, 198, 215, 155, 254, 4, 173, 218, 232, 110, 65, + 126, 22, 64, 87, 171, 145, 176, 118, 99, 0, 128, 125, 104, 19, 127, 67, + 54, 114, 177, 88, 141, 251, 11, 109, 46, 165, 99, 211, 128, 50, 12, 56, + 5, 14, 170, 8, 17, 6, 25, 210, 92, 20, 45, 230, 96, 219, 99, 109, + 7, 220, 8, 33, 211, 129, 233, 181, 187, 143, 96, 120, 98, 136, 10, 93, + 44, 182, 220, 132, 120, 54, 91, 245, 244, 201, 102, 127, 50, 157, 120, 124, + 49, 203, 54, 42, 164, 80, 157, 186, 151, 17, 78, 44, 5, 66, 138, 95, + 247, 81, 247, 191, 255, 217, 14, 196, 94, 95, 211, 173, 165, 166, 152, 216, + 233, 209, 167, 50, 156, 110, 233, 34, 171, 141, 146, 11, 220, 134, 154, 54, + 171, 48, 227, 115, 77, 90, 109, 40, 239, 42, 18, 99, 2, 109, 10, 249, + 194, 199, 191, 182, 140, 18, 244, 177, 243, 225, 30, 225, 14, 209, 182, 63, + 89, 62, 64, 227, 115, 216, 79, 208, 79, 211, 253, 160, 135, 104, 71, 236, + 65, 181, 7, 204, 230, 28, 185, 209, 251, 234, 160, 218, 83, 219, 88, 119, + 53, 94, 241, 189, 28, 249, 122, 39, 232, 32, 72, 199, 59, 111, 77, 194, + 66, 208, 118, 11, 12, 106, 72, 222, 57, 239, 33, 254, 124, 49, 232, 179, + 188, 37, 36, 48, 178, 240, 218, 34, 223, 155, 25, 207, 200, 17, 178, 34, + 189, 23, 144, 85, 91, 87, 250, 74, 9, 0, 168, 113, 236, 236, 55, 79, + 127, 244, 242, 41, 181, 24, 48, 159, 146, 148, 174, 85, 74, 188, 171, 220, + 83, 44, 66, 25, 237, 43, 21, 31, 128, 1, 70, 164, 181, 181, 169, 137, + 232, 225, 181, 147, 201, 9, 10, 81, 147, 128, 99, 139, 80, 238, 131, 119, + 143, 6, 95, 18, 25, 140, 60, 48, 210, 42, 156, 103, 177, 122, 133, 149, + 3, 41, 216, 14, 152, 25, 75, 50, 226, 163, 118, 106, 188, 32, 32, 218, + 171, 248, 231, 178, 113, 223, 130, 150, 113, 151, 246, 107, 12, 20, 234, 114, + 50, 16, 154, 191, 60, 124, 18, 191, 34, 33, 222, 147, 248, 53, 254, 190, + 130, 95, 215, 254, 101, 57, 40, 7, 181, 174, 59, 116, 95, 185, 175, 209, + 152, 173, 100, 65, 111, 119, 59, 115, 188, 26, 38, 196, 169, 129, 137, 65, + 39, 87, 146, 33, 34, 177, 222, 16, 103, 144, 90, 77, 12, 81, 140, 25, + 39, 37, 143, 58, 4, 223, 151, 206, 56, 37, 190, 49, 183, 61, 22, 30, + 9, 225, 80, 38, 141, 57, 149, 14, 144, 163, 231, 15, 207, 91, 91, 154, + 208, 149, 186, 235, 100, 83, 130, 150, 47, 84, 101, 229, 125, 13, 218, 4, + 49, 191, 142, 186, 165, 254, 201, 194, 101, 250, 210, 216, 210, 228, 154, 93, + 131, 62, 76, 204, 51, 30, 240, 15, 245, 122, 42, 142, 213, 49, 15, 83, + 102, 29, 174, 115, 236, 228, 105, 74, 172, 8, 123, 114, 78, 168, 72, 97, + 16, 34, 60, 204, 202, 135, 246, 218, 21, 15, 137, 244, 127, 220, 222, 100, + 197, 140, 4, 177, 86, 104, 48, 180, 152, 46, 231, 211, 153, 64, 241, 32, + 57, 100, 42, 72, 176, 16, 25, 216, 144, 188, 141, 153, 80, 1, 45, 144, + 81, 158, 30, 150, 80, 74, 138, 51, 134, 99, 82, 24, 137, 235, 122, 161, + 225, 24, 93, 94, 114, 155, 112, 64, 189, 216, 248, 43, 39, 135, 236, 221, + 164, 91, 90, 136, 57, 179, 141, 45, 165, 159, 192, 118, 14, 23, 109, 126, + 133, 131, 111, 175, 223, 211, 247, 13, 153, 86, 254, 15, 114, 233, 123, 42, + 92, 252, 138, 44, 60, 74, 195, 40, 91, 104, 147, 137, 218, 227, 132, 242, + 149, 66, 222, 86, 173, 133, 212, 29, 106, 174, 44, 45, 233, 115, 177, 16, + 146, 42, 79, 193, 97, 86, 129, 33, 35, 191, 197, 213, 178, 101, 136, 122, + 157, 23, 246, 98, 210, 153, 193, 201, 121, 41, 226, 32, 16, 149, 49, 74, + 97, 4, 221, 117, 228, 84, 181, 55, 158, 26, 139, 87, 234, 75, 123, 220, + 153, 161, 189, 227, 9, 26, 245, 195, 182, 116, 178, 223, 246, 241, 245, 106, + 56, 162, 209, 168, 18, 23, 44, 53, 26, 172, 64, 49, 236, 58, 58, 148, + 165, 235, 255, 253, 0, 61, 197, 78, 238, 166, 191, 72, 168, 117, 85, 46, + 208, 120, 34, 169, 61, 97, 59, 231, 84, 38, 200, 136, 104, 164, 159, 133, + 240, 238, 14, 187, 196, 61, 242, 23, 223, 132, 132, 13, 34, 44, 227, 84, + 121, 179, 225, 186, 63, 18, 55, 66, 117, 251, 111, 104, 54, 137, 209, 247, + 100, 191, 236, 252, 210, 23, 187, 63, 163, 114, 200, 218, 8, 119, 106, 136, + 25, 79, 13, 86, 188, 182, 18, 48, 80, 51, 213, 1, 176, 62, 153, 166, + 206, 192, 215, 208, 63, 88, 238, 87, 40, 149, 173, 216, 179, 81, 103, 49, + 238, 224, 201, 35, 226, 244, 13, 123, 49, 232, 204, 103, 64, 7, 140, 7, + 232, 89, 35, 55, 234, 237, 147, 31, 226, 242, 218, 107, 53, 42, 167, 173, + 203, 31, 227, 114, 34, 30, 61, 136, 93, 237, 175, 103, 101, 175, 252, 195, + 199, 176, 246, 227, 199, 176, 114, 26, 249, 149, 42, 42, 126, 33, 43, 254, + 67, 133, 184, 240, 31, 43, 202, 71, 57, 193, 215, 231, 4, 253, 12, 106, + 175, 86, 31, 179, 162, 50, 129, 248, 205, 73, 242, 179, 73, 143, 145, 227, + 251, 151, 126, 69, 47, 191, 148, 131, 60, 87, 246, 215, 203, 249, 170, 39, + 230, 119, 175, 63, 99, 19, 77, 243, 36, 239, 182, 179, 238, 95, 243, 108, + 183, 200, 197, 88, 80, 51, 236, 182, 224, 151, 127, 248, 209, 155, 205, 167, + 104, 144, 118, 232, 70, 145, 200, 16, 200, 250, 166, 68, 192, 135, 51, 165, + 80, 78, 209, 30, 96, 253, 122, 70, 9, 216, 0, 209, 77, 201, 190, 116, + 77, 131, 150, 101, 86, 219, 188, 34, 108, 25, 88, 133, 88, 158, 225, 59, + 221, 175, 103, 85, 124, 31, 172, 190, 174, 174, 178, 108, 162, 186, 209, 9, + 212, 20, 74, 240, 41, 212, 116, 14, 27, 65, 199, 210, 84, 155, 16, 28, + 38, 34, 228, 32, 86, 79, 94, 94, 102, 128, 129, 206, 77, 71, 77, 1, + 106, 252, 223, 191, 24, 184, 194, 59, 212, 125, 69, 62, 13, 42, 213, 251, + 211, 65, 165, 2, 91, 255, 224, 129, 36, 213, 193, 233, 189, 78, 70, 73, + 216, 252, 206, 9, 78, 49, 197, 253, 169, 115, 63, 119, 7, 167, 206, 96, + 14, 159, 110, 16, 88, 209, 39, 136, 205, 185, 11, 65, 204, 28, 106, 72, + 106, 20, 125, 249, 22, 236, 170, 139, 213, 28, 178, 193, 214, 39, 161, 36, + 217, 104, 2, 187, 64, 14, 210, 81, 111, 118, 31, 170, 224, 109, 106, 195, + 186, 157, 226, 102, 158, 219, 176, 100, 48, 238, 197, 244, 88, 112, 211, 8, + 253, 196, 223, 10, 54, 158, 91, 218, 119, 12, 143, 32, 152, 64, 20, 118, + 130, 49, 124, 66, 220, 160, 45, 206, 158, 117, 230, 192, 28, 244, 211, 80, + 54, 134, 31, 109, 224, 198, 112, 125, 67, 126, 207, 216, 203, 48, 199, 73, + 255, 83, 7, 131, 117, 214, 247, 136, 146, 43, 247, 76, 160, 112, 49, 67, + 28, 19, 27, 173, 126, 247, 59, 167, 120, 38, 211, 199, 103, 190, 95, 168, + 162, 113, 220, 206, 167, 90, 109, 235, 60, 175, 94, 248, 187, 125, 219, 31, + 100, 59, 158, 222, 225, 17, 74, 20, 245, 169, 179, 90, 44, 224, 88, 103, + 74, 196, 181, 159, 132, 188, 100, 188, 208, 86, 155, 133, 197, 66, 86, 44, + 115, 244, 96, 137, 158, 145, 227, 70, 108, 135, 61, 156, 246, 28, 229, 220, + 81, 152, 229, 184, 77, 170, 228, 189, 236, 126, 6, 28, 85, 254, 211, 245, + 200, 226, 151, 150, 180, 23, 92, 191, 30, 237, 14, 74, 190, 101, 117, 72, + 246, 157, 173, 140, 234, 215, 133, 155, 18, 135, 167, 174, 189, 9, 244, 119, + 70, 151, 188, 133, 50, 114, 53, 231, 109, 20, 134, 147, 192, 124, 192, 6, + 131, 124, 29, 231, 4, 248, 95, 80, 17, 80, 192, 146, 134, 186, 173, 196, + 152, 118, 23, 94, 36, 40, 48, 225, 121, 58, 8, 248, 110, 222, 203, 8, + 169, 251, 139, 192, 110, 184, 91, 124, 242, 2, 121, 206, 70, 193, 1, 113, + 157, 137, 140, 174, 211, 161, 78, 45, 203, 112, 10, 167, 240, 167, 241, 176, + 155, 219, 14, 201, 40, 141, 92, 146, 216, 163, 233, 167, 169, 217, 211, 28, + 63, 119, 215, 45, 130, 11, 174, 185, 223, 252, 212, 56, 83, 25, 149, 200, + 89, 3, 68, 124, 3, 99, 28, 33, 212, 67, 214, 91, 128, 99, 109, 11, + 175, 56, 9, 45, 157, 99, 252, 116, 162, 162, 144, 66, 113, 195, 151, 81, + 241, 42, 20, 106, 108, 196, 125, 155, 142, 218, 84, 81, 47, 90, 110, 112, + 209, 50, 163, 254, 53, 29, 245, 226, 64, 174, 95, 166, 163, 146, 242, 92, + 150, 88, 5, 35, 113, 46, 35, 65, 179, 71, 66, 245, 128, 2, 46, 66, + 149, 47, 105, 229, 242, 85, 86, 23, 141, 17, 148, 147, 25, 161, 135, 185, + 197, 149, 61, 170, 57, 207, 79, 67, 66, 157, 144, 121, 108, 35, 159, 188, + 201, 108, 67, 191, 118, 46, 30, 3, 95, 56, 152, 105, 90, 66, 227, 59, + 32, 181, 167, 23, 213, 32, 220, 89, 172, 51, 14, 113, 145, 9, 66, 113, + 104, 80, 247, 209, 255, 12, 124, 36, 19, 156, 115, 82, 247, 131, 108, 145, + 59, 242, 235, 231, 181, 236, 39, 140, 236, 181, 252, 29, 99, 208, 18, 225, + 145, 79, 148, 11, 237, 238, 38, 169, 152, 146, 124, 152, 130, 153, 155, 233, + 253, 68, 3, 68, 173, 69, 201, 124, 58, 236, 229, 47, 35, 24, 75, 34, + 47, 19, 231, 248, 135, 36, 226, 58, 151, 67, 26, 80, 154, 71, 137, 66, + 193, 161, 96, 129, 113, 218, 203, 136, 162, 174, 113, 158, 31, 207, 154, 114, + 125, 177, 193, 200, 201, 218, 253, 118, 129, 128, 155, 211, 21, 93, 115, 8, + 16, 241, 9, 112, 212, 180, 156, 164, 182, 221, 210, 137, 95, 111, 92, 84, + 137, 103, 181, 67, 194, 145, 71, 151, 95, 232, 201, 108, 54, 172, 192, 147, + 250, 224, 153, 31, 56, 220, 83, 41, 188, 76, 10, 79, 37, 241, 210, 73, + 108, 140, 31, 86, 11, 202, 144, 31, 188, 108, 25, 107, 114, 98, 156, 79, + 161, 191, 20, 149, 145, 80, 118, 249, 20, 153, 47, 42, 5, 211, 90, 148, + 34, 243, 37, 91, 117, 32, 43, 213, 78, 162, 57, 42, 217, 134, 200, 198, + 243, 50, 241, 140, 134, 49, 218, 68, 85, 61, 23, 207, 43, 136, 167, 243, + 179, 101, 161, 64, 119, 170, 137, 69, 93, 42, 233, 250, 165, 226, 121, 169, + 136, 24, 234, 215, 195, 179, 106, 57, 85, 113, 46, 46, 55, 70, 84, 112, + 170, 69, 178, 145, 189, 226, 216, 178, 178, 217, 94, 16, 241, 178, 157, 86, + 28, 217, 43, 142, 205, 1, 53, 81, 112, 42, 239, 141, 237, 233, 96, 35, + 52, 31, 217, 203, 198, 70, 63, 216, 126, 189, 117, 113, 130, 78, 89, 182, + 104, 178, 150, 250, 139, 130, 76, 254, 47, 224, 255, 80, 255, 186, 110, 79, + 232, 143, 60, 133, 241, 204, 149, 43, 215, 0, 216, 151, 233, 167, 121, 103, + 188, 79, 12, 169, 34, 28, 45, 131, 52, 178, 60, 78, 0, 105, 38, 216, + 35, 125, 76, 81, 145, 19, 61, 102, 37, 141, 115, 196, 249, 31, 24, 158, + 63, 180, 184, 25, 10, 157, 8, 16, 113, 148, 10, 68, 105, 157, 4, 224, + 27, 74, 208, 72, 186, 184, 235, 188, 3, 98, 42, 189, 149, 81, 163, 51, + 111, 29, 32, 95, 100, 184, 88, 243, 128, 142, 99, 45, 79, 114, 101, 71, + 53, 160, 192, 208, 177, 111, 9, 237, 215, 45, 69, 176, 67, 148, 232, 167, + 89, 114, 91, 105, 2, 204, 151, 61, 183, 32, 121, 122, 116, 3, 190, 101, + 123, 50, 242, 225, 188, 110, 223, 15, 118, 104, 220, 98, 59, 111, 93, 248, + 15, 229, 238, 20, 115, 54, 234, 144, 254, 16, 73, 148, 81, 39, 84, 219, + 27, 59, 79, 78, 91, 21, 106, 117, 15, 182, 228, 90, 115, 119, 77, 123, + 168, 207, 8, 77, 158, 216, 181, 245, 125, 195, 133, 82, 48, 197, 111, 100, + 228, 133, 223, 67, 249, 29, 118, 101, 138, 16, 114, 6, 50, 125, 36, 191, + 135, 103, 252, 61, 98, 36, 41, 153, 190, 33, 175, 36, 68, 254, 13, 74, + 142, 17, 232, 115, 83, 105, 74, 138, 228, 77, 186, 227, 224, 8, 53, 163, + 223, 133, 215, 62, 212, 17, 219, 211, 241, 55, 163, 105, 247, 23, 113, 228, + 128, 38, 27, 142, 87, 227, 182, 146, 225, 28, 35, 177, 64, 187, 18, 202, + 227, 129, 123, 65, 70, 169, 235, 204, 9, 42, 60, 63, 114, 180, 60, 139, + 184, 254, 78, 183, 11, 167, 233, 125, 10, 14, 11, 134, 174, 76, 19, 27, + 7, 126, 129, 80, 227, 65, 199, 129, 112, 228, 73, 55, 132, 7, 60, 160, + 144, 122, 70, 86, 182, 141, 36, 79, 129, 10, 207, 168, 4, 173, 239, 206, + 149, 26, 125, 225, 152, 53, 155, 40, 237, 108, 65, 212, 195, 144, 238, 9, + 150, 195, 20, 98, 20, 248, 46, 49, 93, 150, 144, 83, 250, 165, 82, 8, + 214, 23, 143, 104, 16, 42, 116, 116, 183, 206, 147, 56, 14, 217, 199, 180, + 176, 56, 34, 21, 12, 153, 237, 61, 234, 137, 213, 148, 13, 162, 54, 225, + 150, 17, 6, 42, 2, 223, 147, 169, 8, 116, 163, 140, 166, 190, 232, 93, + 129, 29, 16, 161, 7, 135, 208, 130, 99, 16, 159, 136, 2, 139, 109, 128, + 195, 6, 25, 1, 179, 160, 4, 86, 180, 211, 176, 81, 81, 250, 60, 100, + 120, 249, 28, 245, 178, 49, 106, 29, 184, 119, 249, 212, 84, 79, 231, 234, + 41, 96, 240, 37, 253, 222, 208, 143, 103, 58, 15, 35, 59, 246, 5, 49, + 38, 195, 229, 198, 53, 225, 204, 216, 115, 36, 22, 14, 128, 247, 82, 121, + 13, 175, 222, 112, 125, 21, 215, 237, 8, 148, 142, 226, 22, 138, 215, 50, + 108, 18, 133, 99, 47, 12, 30, 223, 225, 95, 81, 1, 221, 224, 116, 138, + 228, 111, 208, 101, 167, 108, 218, 152, 208, 77, 106, 75, 59, 48, 72, 234, + 242, 152, 87, 56, 59, 31, 181, 42, 31, 181, 22, 155, 217, 26, 207, 191, + 97, 169, 93, 140, 8, 44, 20, 5, 79, 197, 219, 150, 225, 237, 227, 200, + 139, 177, 243, 203, 22, 252, 197, 117, 236, 82, 255, 249, 201, 74, 191, 203, + 127, 233, 16, 239, 64, 164, 236, 191, 84, 96, 78, 149, 26, 45, 67, 165, + 133, 40, 254, 250, 64, 65, 78, 161, 58, 31, 9, 162, 176, 206, 116, 227, + 80, 20, 173, 117, 125, 32, 10, 171, 87, 31, 136, 146, 86, 176, 206, 71, + 73, 89, 185, 110, 23, 187, 10, 76, 69, 139, 37, 26, 156, 228, 49, 143, + 105, 69, 228, 253, 2, 9, 115, 107, 61, 52, 98, 41, 202, 163, 135, 172, + 204, 56, 181, 129, 31, 28, 180, 102, 57, 251, 70, 45, 51, 99, 191, 123, + 220, 54, 160, 113, 96, 152, 82, 115, 253, 100, 113, 31, 248, 170, 3, 224, + 201, 151, 79, 71, 141, 182, 226, 238, 59, 166, 245, 19, 96, 241, 134, 189, + 7, 218, 159, 35, 61, 190, 7, 84, 230, 233, 215, 7, 122, 33, 85, 218, + 67, 156, 174, 33, 131, 15, 99, 244, 202, 114, 124, 31, 192, 235, 239, 90, + 59, 168, 59, 142, 93, 15, 46, 200, 128, 34, 18, 95, 157, 251, 208, 232, + 238, 11, 72, 217, 80, 41, 179, 223, 112, 126, 7, 123, 190, 69, 240, 45, + 44, 252, 246, 251, 39, 244, 35, 230, 240, 124, 117, 51, 252, 69, 24, 73, + 38, 237, 37, 222, 49, 33, 82, 150, 255, 60, 134, 87, 82, 43, 127, 142, + 200, 78, 24, 176, 49, 222, 15, 141, 57, 202, 242, 100, 113, 212, 110, 149, + 55, 164, 20, 68, 176, 163, 45, 73, 131, 114, 86, 183, 81, 239, 7, 6, + 175, 172, 147, 107, 101, 170, 104, 202, 167, 129, 163, 11, 228, 157, 85, 83, + 97, 210, 132, 84, 59, 121, 121, 165, 195, 35, 10, 47, 184, 196, 202, 84, + 251, 167, 198, 217, 162, 96, 7, 101, 238, 15, 120, 189, 117, 226, 81, 245, + 92, 124, 162, 170, 200, 107, 172, 141, 124, 141, 14, 185, 210, 42, 75, 125, + 73, 56, 101, 215, 233, 6, 183, 124, 238, 54, 149, 249, 1, 245, 148, 248, + 165, 231, 75, 249, 203, 71, 235, 45, 2, 196, 92, 110, 33, 72, 30, 185, + 51, 33, 250, 129, 194, 49, 66, 42, 4, 74, 106, 144, 161, 118, 203, 109, + 94, 178, 209, 118, 211, 133, 41, 64, 70, 222, 45, 247, 236, 146, 13, 190, + 207, 220, 198, 101, 131, 84, 172, 91, 110, 88, 177, 34, 140, 164, 140, 7, + 154, 218, 116, 128, 197, 172, 218, 116, 64, 85, 60, 208, 12, 170, 175, 185, + 207, 43, 15, 62, 32, 134, 76, 62, 26, 213, 51, 31, 113, 201, 152, 81, + 132, 98, 99, 157, 178, 174, 48, 3, 90, 52, 81, 3, 16, 254, 35, 180, + 83, 9, 245, 65, 88, 28, 135, 223, 85, 124, 130, 218, 51, 190, 51, 166, + 47, 29, 201, 14, 206, 56, 37, 140, 78, 137, 91, 131, 23, 113, 100, 222, + 32, 135, 240, 126, 104, 146, 113, 46, 143, 157, 93, 70, 121, 90, 232, 170, + 3, 23, 33, 222, 31, 31, 152, 89, 138, 246, 40, 116, 131, 150, 149, 173, + 79, 230, 254, 39, 142, 212, 165, 112, 11, 223, 14, 78, 31, 179, 66, 25, + 15, 117, 154, 62, 233, 125, 245, 136, 61, 101, 137, 71, 38, 52, 175, 89, + 226, 169, 9, 157, 157, 210, 141, 79, 40, 61, 161, 134, 164, 156, 60, 35, + 199, 166, 248, 30, 192, 251, 145, 250, 92, 119, 66, 159, 139, 108, 252, 16, + 143, 158, 151, 223, 10, 185, 95, 36, 171, 159, 75, 249, 64, 166, 98, 91, + 120, 112, 241, 79, 197, 154, 51, 72, 76, 176, 99, 72, 148, 208, 141, 216, + 182, 7, 117, 50, 61, 156, 100, 3, 15, 93, 175, 214, 237, 174, 197, 102, + 65, 244, 215, 52, 12, 170, 177, 161, 144, 8, 134, 23, 178, 225, 129, 207, + 13, 215, 139, 174, 53, 32, 83, 87, 158, 107, 234, 124, 170, 225, 107, 170, + 40, 59, 207, 220, 59, 107, 185, 246, 161, 21, 238, 170, 206, 18, 125, 82, + 66, 131, 173, 131, 120, 91, 118, 238, 106, 232, 37, 88, 134, 37, 232, 2, + 118, 57, 56, 85, 77, 133, 187, 34, 182, 230, 29, 218, 64, 213, 56, 250, + 83, 136, 122, 185, 197, 52, 33, 110, 157, 14, 228, 12, 127, 146, 0, 159, + 2, 122, 170, 24, 14, 250, 34, 119, 101, 45, 19, 63, 198, 112, 46, 160, + 236, 172, 106, 33, 22, 170, 202, 177, 135, 62, 245, 217, 170, 138, 38, 225, + 119, 240, 30, 232, 119, 93, 40, 25, 73, 58, 67, 160, 8, 254, 212, 152, + 138, 97, 64, 15, 240, 171, 8, 41, 36, 73, 61, 249, 21, 190, 71, 41, + 227, 166, 174, 7, 74, 84, 73, 213, 206, 12, 167, 202, 139, 234, 2, 209, + 233, 60, 125, 81, 97, 202, 19, 154, 158, 112, 47, 185, 245, 17, 66, 171, + 65, 71, 197, 60, 78, 77, 84, 193, 174, 130, 241, 208, 168, 150, 25, 42, + 179, 146, 187, 64, 76, 41, 18, 30, 218, 225, 97, 226, 12, 133, 245, 28, + 60, 211, 50, 112, 245, 52, 165, 93, 229, 82, 160, 171, 16, 18, 214, 1, + 252, 74, 208, 204, 245, 11, 159, 192, 49, 5, 152, 166, 207, 105, 83, 58, + 107, 235, 37, 58, 155, 196, 121, 44, 10, 203, 89, 103, 81, 1, 133, 11, + 21, 41, 45, 165, 29, 204, 229, 116, 152, 246, 32, 45, 120, 204, 30, 4, + 49, 12, 155, 200, 196, 94, 81, 32, 91, 97, 115, 223, 74, 70, 170, 76, + 129, 209, 56, 112, 62, 48, 35, 170, 240, 147, 31, 226, 181, 7, 157, 123, + 249, 99, 156, 120, 3, 248, 85, 234, 75, 79, 67, 255, 4, 61, 67, 120, + 226, 31, 253, 167, 27, 93, 95, 25, 29, 221, 238, 27, 163, 237, 55, 7, + 218, 95, 193, 153, 62, 216, 25, 130, 136, 255, 158, 254, 216, 164, 187, 100, + 179, 175, 87, 4, 62, 14, 236, 61, 15, 137, 234, 96, 180, 27, 214, 121, + 89, 165, 36, 210, 141, 217, 216, 136, 241, 165, 187, 51, 173, 32, 67, 176, + 253, 36, 247, 138, 252, 116, 247, 234, 120, 39, 107, 232, 208, 4, 254, 161, + 42, 218, 166, 242, 17, 127, 26, 116, 29, 187, 174, 38, 213, 77, 53, 170, + 84, 78, 92, 185, 15, 19, 0, 27, 245, 105, 9, 239, 158, 75, 46, 97, + 183, 9, 92, 254, 88, 107, 111, 184, 124, 210, 12, 82, 158, 206, 205, 29, + 15, 83, 115, 110, 7, 218, 213, 200, 60, 14, 168, 105, 165, 112, 79, 218, + 14, 81, 41, 177, 97, 125, 8, 109, 170, 105, 212, 194, 203, 32, 50, 165, + 151, 17, 91, 254, 52, 48, 33, 67, 184, 18, 252, 233, 182, 21, 59, 205, + 98, 113, 38, 229, 137, 86, 126, 39, 2, 174, 21, 40, 211, 150, 64, 174, + 214, 191, 136, 136, 46, 62, 102, 19, 78, 35, 58, 34, 22, 78, 207, 125, + 123, 201, 112, 96, 190, 132, 3, 19, 17, 232, 54, 131, 149, 59, 162, 158, + 105, 176, 194, 120, 119, 108, 14, 194, 220, 18, 135, 236, 211, 149, 121, 213, + 235, 153, 238, 5, 152, 106, 148, 46, 143, 70, 54, 106, 155, 176, 87, 179, + 7, 160, 17, 114, 221, 160, 203, 196, 94, 72, 35, 33, 248, 245, 243, 189, + 8, 8, 13, 31, 88, 223, 86, 182, 18, 33, 154, 216, 74, 45, 91, 43, + 87, 67, 195, 58, 47, 74, 93, 98, 67, 73, 186, 111, 190, 161, 154, 153, + 85, 218, 131, 194, 108, 213, 102, 192, 10, 35, 87, 228, 219, 163, 186, 77, + 120, 60, 10, 129, 150, 120, 31, 224, 41, 254, 236, 239, 236, 24, 209, 99, + 113, 71, 65, 40, 149, 50, 251, 219, 217, 10, 156, 102, 50, 96, 14, 245, + 134, 19, 9, 131, 230, 176, 58, 80, 210, 92, 89, 34, 26, 154, 18, 240, + 155, 243, 66, 130, 69, 5, 174, 105, 30, 43, 21, 242, 128, 229, 41, 128, + 104, 163, 173, 143, 247, 203, 131, 57, 226, 137, 233, 96, 70, 129, 206, 72, + 74, 91, 233, 102, 135, 93, 210, 91, 198, 14, 41, 76, 8, 243, 170, 15, + 217, 187, 16, 246, 176, 71, 150, 68, 251, 110, 70, 126, 191, 10, 103, 198, + 144, 211, 205, 171, 108, 106, 247, 80, 68, 74, 28, 181, 210, 26, 220, 145, + 240, 216, 142, 254, 195, 209, 154, 37, 16, 138, 187, 62, 121, 244, 178, 181, + 163, 74, 190, 69, 148, 213, 119, 45, 221, 16, 166, 98, 39, 217, 136, 74, + 38, 94, 170, 114, 202, 211, 49, 148, 189, 71, 179, 147, 50, 59, 70, 175, + 51, 165, 123, 225, 166, 111, 65, 216, 187, 180, 184, 48, 97, 159, 24, 176, + 194, 244, 250, 159, 144, 249, 135, 112, 100, 23, 35, 15, 53, 97, 132, 70, + 204, 206, 46, 84, 253, 204, 223, 165, 204, 249, 222, 48, 112, 239, 195, 56, + 172, 222, 95, 162, 254, 102, 40, 21, 56, 49, 180, 34, 31, 81, 233, 51, + 68, 173, 79, 86, 250, 124, 32, 21, 234, 125, 134, 58, 105, 133, 16, 159, + 145, 80, 129, 57, 123, 63, 103, 156, 217, 1, 254, 18, 144, 21, 170, 124, + 194, 120, 166, 191, 165, 117, 215, 142, 73, 197, 0, 89, 14, 123, 131, 111, + 120, 127, 222, 195, 183, 37, 188, 116, 150, 157, 73, 88, 222, 116, 221, 117, + 183, 114, 105, 67, 241, 203, 23, 37, 7, 91, 162, 228, 150, 156, 57, 253, + 82, 65, 235, 110, 117, 221, 173, 109, 186, 213, 77, 183, 82, 41, 89, 85, + 4, 147, 174, 150, 113, 174, 223, 239, 128, 155, 60, 45, 223, 19, 103, 77, + 86, 94, 172, 113, 10, 191, 132, 88, 128, 113, 6, 59, 229, 62, 94, 127, + 85, 102, 76, 124, 180, 80, 62, 226, 133, 21, 21, 161, 178, 27, 250, 170, + 200, 163, 222, 96, 23, 230, 54, 101, 210, 83, 205, 178, 169, 105, 72, 156, + 17, 110, 44, 57, 253, 84, 17, 106, 63, 83, 176, 84, 236, 54, 130, 31, + 19, 253, 72, 142, 147, 112, 135, 93, 205, 251, 135, 252, 38, 245, 217, 88, + 113, 36, 28, 64, 41, 144, 47, 242, 151, 174, 62, 136, 140, 142, 49, 189, + 24, 101, 53, 96, 85, 201, 232, 147, 82, 120, 21, 196, 237, 148, 51, 158, + 218, 194, 45, 224, 1, 188, 72, 3, 67, 7, 89, 50, 250, 82, 55, 12, + 90, 100, 163, 144, 66, 153, 239, 163, 229, 152, 135, 179, 191, 102, 168, 161, + 250, 7, 180, 80, 213, 225, 32, 135, 114, 157, 215, 250, 34, 143, 222, 15, + 35, 163, 165, 80, 236, 20, 200, 25, 2, 151, 165, 32, 88, 247, 226, 156, + 73, 35, 156, 122, 145, 5, 142, 164, 55, 175, 209, 69, 212, 73, 156, 104, + 79, 130, 68, 19, 212, 97, 24, 28, 15, 72, 134, 25, 180, 118, 4, 89, + 26, 164, 17, 198, 180, 10, 10, 22, 165, 27, 112, 177, 232, 252, 60, 93, + 241, 246, 109, 236, 32, 129, 219, 113, 95, 185, 55, 238, 107, 183, 235, 126, + 89, 212, 152, 34, 157, 221, 93, 205, 209, 15, 99, 121, 93, 94, 86, 98, + 178, 69, 174, 46, 107, 175, 200, 140, 185, 226, 38, 50, 240, 6, 2, 95, + 139, 192, 141, 12, 236, 66, 224, 151, 28, 120, 200, 175, 86, 214, 22, 0, + 29, 36, 197, 33, 254, 188, 98, 23, 38, 55, 140, 68, 252, 154, 223, 186, + 10, 194, 238, 203, 204, 133, 186, 89, 89, 216, 48, 82, 85, 55, 56, 23, + 210, 255, 15, 52, 239, 18, 238, 113, 154, 148, 114, 127, 82, 212, 163, 169, + 38, 42, 222, 48, 202, 208, 202, 149, 184, 44, 157, 156, 148, 161, 193, 241, + 149, 124, 37, 81, 37, 202, 208, 252, 24, 210, 66, 208, 110, 226, 141, 22, + 202, 60, 253, 56, 137, 143, 3, 73, 224, 144, 15, 127, 113, 93, 180, 148, + 136, 135, 151, 72, 8, 22, 216, 146, 17, 67, 79, 132, 176, 222, 34, 55, + 21, 218, 53, 252, 69, 39, 35, 20, 157, 0, 111, 17, 118, 151, 2, 155, + 42, 208, 118, 90, 40, 201, 221, 58, 103, 28, 100, 58, 61, 33, 1, 144, + 97, 124, 202, 140, 215, 189, 193, 120, 33, 155, 198, 148, 9, 171, 1, 92, + 197, 41, 36, 212, 200, 51, 70, 132, 200, 174, 65, 97, 129, 129, 1, 195, + 72, 69, 24, 86, 152, 123, 84, 45, 115, 250, 138, 130, 127, 201, 230, 73, + 185, 53, 179, 208, 47, 178, 251, 228, 76, 25, 167, 214, 120, 102, 129, 51, + 75, 188, 224, 139, 165, 111, 238, 252, 122, 189, 64, 160, 237, 110, 106, 29, + 166, 68, 5, 139, 241, 56, 187, 24, 83, 145, 39, 194, 193, 174, 189, 5, + 222, 40, 150, 200, 185, 30, 162, 192, 254, 106, 251, 113, 111, 10, 171, 52, + 66, 131, 43, 112, 58, 120, 11, 227, 91, 96, 103, 224, 33, 162, 7, 212, + 72, 71, 155, 149, 95, 237, 70, 252, 105, 186, 154, 119, 86, 61, 29, 212, + 140, 103, 131, 41, 100, 40, 2, 118, 245, 82, 229, 82, 91, 171, 153, 197, + 81, 13, 203, 236, 222, 27, 221, 7, 85, 200, 148, 157, 44, 30, 108, 114, + 169, 122, 43, 182, 161, 33, 66, 111, 138, 15, 80, 241, 187, 97, 255, 222, + 244, 174, 87, 232, 47, 60, 141, 33, 65, 30, 52, 67, 66, 86, 133, 73, + 145, 135, 101, 187, 63, 206, 212, 65, 244, 206, 214, 119, 255, 236, 188, 200, + 25, 58, 68, 251, 182, 152, 113, 47, 215, 241, 121, 239, 135, 34, 244, 64, + 215, 247, 146, 73, 103, 92, 212, 247, 212, 80, 15, 52, 146, 30, 21, 189, + 127, 143, 97, 113, 184, 251, 60, 205, 210, 87, 211, 141, 135, 18, 141, 108, + 211, 173, 70, 255, 50, 171, 94, 67, 76, 180, 215, 124, 183, 250, 207, 49, + 223, 101, 57, 168, 246, 204, 120, 180, 249, 238, 36, 213, 162, 234, 60, 68, + 120, 191, 108, 64, 222, 54, 2, 101, 162, 92, 200, 51, 251, 157, 58, 74, + 21, 251, 193, 180, 87, 147, 225, 50, 3, 77, 165, 90, 101, 114, 36, 244, + 111, 196, 120, 191, 198, 143, 95, 15, 30, 132, 253, 53, 200, 165, 15, 251, + 209, 127, 141, 152, 18, 0, 56, 29, 164, 48, 128, 141, 234, 226, 159, 156, + 208, 225, 15, 128, 3, 22, 62, 26, 183, 119, 49, 158, 179, 32, 14, 185, + 206, 65, 11, 8, 245, 212, 16, 79, 21, 60, 125, 221, 185, 119, 46, 238, + 225, 10, 13, 248, 20, 243, 113, 196, 76, 56, 4, 13, 60, 77, 13, 2, + 33, 206, 201, 77, 45, 21, 142, 235, 210, 126, 252, 205, 71, 163, 110, 78, + 15, 79, 9, 45, 230, 251, 99, 208, 53, 85, 53, 40, 120, 187, 42, 152, + 20, 104, 143, 135, 16, 70, 108, 29, 100, 183, 215, 192, 87, 221, 84, 220, + 118, 34, 126, 55, 226, 23, 150, 224, 9, 254, 237, 172, 221, 246, 13, 61, + 223, 208, 51, 112, 3, 237, 142, 176, 128, 109, 223, 200, 135, 181, 124, 72, + 228, 195, 38, 45, 89, 17, 80, 188, 44, 31, 47, 4, 100, 78, 137, 84, + 212, 106, 163, 201, 181, 197, 233, 18, 249, 103, 34, 81, 80, 204, 4, 31, + 226, 138, 215, 113, 57, 196, 171, 180, 50, 68, 99, 12, 160, 10, 114, 191, + 137, 25, 76, 48, 65, 21, 102, 138, 137, 11, 167, 103, 108, 132, 216, 155, + 13, 249, 25, 142, 247, 39, 252, 124, 35, 195, 153, 123, 190, 81, 159, 244, + 102, 67, 237, 20, 55, 131, 80, 216, 232, 182, 111, 98, 10, 146, 175, 235, + 184, 213, 144, 207, 9, 125, 90, 203, 215, 13, 189, 38, 25, 153, 80, 248, + 84, 225, 7, 115, 43, 2, 251, 157, 182, 235, 77, 117, 173, 107, 101, 122, + 154, 152, 116, 18, 245, 228, 90, 99, 135, 82, 5, 96, 223, 115, 237, 193, + 31, 34, 209, 34, 59, 195, 43, 216, 22, 106, 191, 99, 254, 126, 43, 158, + 90, 58, 240, 140, 3, 45, 37, 95, 58, 199, 150, 80, 242, 165, 139, 216, + 209, 194, 166, 192, 135, 150, 208, 111, 65, 236, 4, 190, 126, 69, 228, 251, + 64, 191, 70, 208, 12, 90, 46, 21, 160, 119, 178, 125, 94, 133, 204, 241, + 84, 52, 138, 76, 144, 124, 62, 70, 92, 210, 223, 143, 120, 128, 104, 93, + 162, 107, 196, 51, 102, 252, 209, 67, 162, 184, 192, 149, 144, 59, 132, 209, + 72, 208, 44, 157, 120, 88, 94, 187, 9, 25, 71, 93, 222, 168, 151, 128, + 150, 173, 110, 28, 147, 28, 147, 31, 101, 129, 21, 104, 199, 1, 162, 174, + 172, 113, 24, 109, 97, 141, 131, 39, 148, 29, 13, 223, 238, 80, 177, 54, + 104, 33, 42, 182, 239, 5, 103, 100, 178, 72, 145, 3, 59, 81, 145, 147, + 124, 228, 32, 21, 57, 180, 55, 42, 242, 38, 31, 57, 84, 145, 241, 138, + 58, 101, 128, 96, 224, 221, 136, 115, 2, 16, 2, 53, 64, 27, 141, 144, + 228, 63, 168, 1, 28, 68, 25, 43, 101, 12, 107, 24, 54, 28, 85, 246, + 144, 130, 181, 242, 28, 172, 37, 226, 122, 39, 244, 150, 136, 183, 13, 189, + 33, 157, 59, 125, 146, 208, 253, 36, 121, 202, 89, 183, 211, 158, 117, 150, + 221, 1, 175, 86, 244, 168, 174, 5, 222, 226, 159, 119, 248, 71, 237, 100, + 109, 2, 162, 210, 184, 27, 230, 39, 134, 148, 50, 191, 141, 58, 227, 155, + 94, 167, 189, 214, 55, 11, 194, 152, 131, 202, 241, 160, 112, 92, 114, 81, + 166, 35, 28, 255, 28, 52, 141, 248, 142, 133, 62, 58, 45, 240, 249, 253, + 197, 146, 108, 36, 122, 60, 16, 223, 242, 87, 20, 61, 77, 4, 207, 175, + 112, 179, 92, 154, 222, 236, 187, 59, 145, 46, 148, 217, 22, 4, 74, 125, + 119, 148, 123, 48, 221, 62, 241, 25, 174, 31, 111, 81, 149, 137, 206, 250, + 239, 226, 72, 60, 101, 219, 42, 72, 7, 138, 86, 194, 168, 180, 220, 168, + 54, 218, 171, 115, 111, 246, 209, 153, 149, 238, 177, 180, 75, 66, 88, 124, + 206, 118, 251, 220, 18, 2, 121, 251, 60, 19, 70, 250, 91, 198, 57, 97, + 70, 196, 144, 53, 202, 217, 215, 143, 26, 166, 188, 140, 174, 149, 43, 238, + 194, 37, 159, 206, 218, 104, 71, 248, 35, 131, 195, 61, 122, 109, 14, 68, + 71, 137, 222, 115, 45, 86, 242, 138, 36, 76, 153, 12, 23, 209, 100, 107, + 242, 152, 209, 133, 61, 129, 21, 134, 237, 226, 123, 174, 176, 99, 239, 193, + 26, 43, 115, 217, 159, 172, 89, 144, 140, 186, 71, 245, 142, 237, 180, 96, + 33, 251, 123, 0, 115, 157, 156, 63, 158, 162, 210, 203, 223, 195, 152, 112, + 247, 255, 30, 144, 82, 140, 184, 9, 32, 49, 128, 29, 236, 215, 60, 91, + 196, 219, 5, 226, 251, 67, 229, 241, 114, 129, 240, 107, 125, 151, 52, 108, + 106, 70, 192, 128, 2, 110, 113, 37, 43, 18, 50, 212, 68, 163, 144, 166, + 124, 192, 215, 57, 232, 121, 12, 184, 53, 161, 10, 22, 10, 108, 218, 141, + 176, 187, 209, 2, 16, 12, 168, 226, 31, 167, 5, 241, 96, 237, 37, 25, + 9, 99, 116, 89, 181, 26, 61, 156, 146, 232, 197, 187, 10, 8, 147, 150, + 244, 190, 36, 140, 23, 169, 236, 55, 232, 34, 12, 210, 157, 194, 62, 138, + 194, 242, 160, 239, 157, 215, 134, 119, 21, 68, 32, 101, 248, 118, 114, 111, + 84, 228, 124, 212, 234, 15, 63, 245, 97, 193, 36, 248, 94, 6, 228, 5, + 206, 122, 53, 158, 240, 202, 111, 72, 106, 168, 168, 166, 141, 5, 64, 196, + 83, 20, 249, 160, 47, 201, 183, 59, 114, 119, 132, 33, 168, 147, 198, 22, + 10, 202, 192, 216, 137, 172, 181, 148, 77, 173, 202, 216, 182, 59, 188, 65, + 72, 82, 97, 3, 10, 43, 163, 111, 111, 103, 141, 202, 39, 240, 155, 236, + 42, 86, 109, 67, 198, 13, 206, 26, 251, 149, 22, 86, 249, 176, 174, 57, + 127, 15, 41, 132, 31, 2, 43, 109, 176, 206, 166, 195, 170, 221, 177, 186, + 1, 125, 50, 219, 157, 145, 244, 57, 10, 227, 221, 83, 21, 23, 79, 226, + 200, 154, 139, 112, 213, 157, 100, 31, 237, 58, 11, 244, 15, 24, 228, 62, + 3, 247, 143, 78, 241, 32, 41, 153, 76, 97, 13, 57, 6, 249, 159, 194, + 71, 133, 143, 205, 6, 249, 232, 13, 84, 228, 145, 88, 100, 113, 98, 17, + 244, 171, 86, 133, 180, 16, 195, 22, 189, 164, 95, 58, 232, 250, 9, 237, + 171, 20, 166, 49, 148, 181, 198, 13, 55, 112, 147, 138, 6, 77, 14, 172, + 196, 212, 58, 220, 163, 62, 163, 52, 207, 243, 14, 133, 50, 184, 157, 204, + 235, 202, 192, 5, 4, 99, 96, 82, 132, 40, 74, 153, 254, 81, 78, 135, + 92, 229, 91, 86, 184, 26, 42, 68, 21, 133, 168, 217, 144, 36, 139, 52, + 42, 235, 218, 60, 218, 43, 145, 110, 29, 197, 209, 73, 144, 81, 98, 196, + 26, 252, 82, 232, 91, 46, 207, 153, 81, 110, 105, 135, 69, 91, 152, 226, + 59, 22, 227, 154, 180, 227, 151, 200, 109, 144, 116, 95, 192, 106, 111, 157, + 6, 252, 152, 112, 68, 184, 254, 8, 134, 35, 56, 117, 34, 114, 37, 114, + 234, 52, 148, 177, 62, 202, 49, 53, 135, 129, 101, 43, 230, 2, 183, 211, + 212, 165, 72, 65, 31, 98, 156, 71, 94, 134, 164, 110, 67, 252, 157, 42, + 231, 193, 155, 144, 125, 242, 12, 69, 104, 65, 99, 18, 125, 25, 151, 79, + 193, 217, 113, 247, 32, 129, 184, 7, 161, 243, 185, 191, 239, 22, 132, 138, + 72, 181, 153, 48, 67, 221, 143, 93, 130, 205, 220, 153, 163, 56, 233, 14, + 151, 77, 102, 189, 133, 230, 17, 187, 146, 102, 186, 41, 163, 61, 198, 9, + 69, 120, 221, 40, 52, 73, 235, 7, 141, 87, 163, 163, 33, 187, 83, 104, + 142, 70, 99, 74, 242, 165, 6, 119, 142, 194, 67, 106, 218, 11, 123, 147, + 147, 131, 144, 88, 198, 126, 18, 43, 149, 5, 148, 182, 239, 46, 233, 239, + 71, 104, 244, 75, 130, 232, 28, 144, 220, 30, 175, 86, 235, 226, 120, 161, + 125, 95, 243, 38, 154, 82, 235, 180, 104, 59, 243, 80, 160, 3, 219, 23, + 58, 26, 37, 110, 48, 134, 82, 73, 235, 65, 152, 169, 113, 168, 229, 9, + 254, 61, 227, 237, 68, 231, 152, 108, 214, 118, 205, 184, 220, 245, 217, 253, + 167, 68, 164, 173, 139, 40, 140, 112, 41, 65, 224, 157, 23, 180, 213, 187, + 140, 26, 207, 238, 251, 180, 154, 58, 191, 203, 186, 89, 233, 164, 65, 38, + 171, 196, 204, 41, 69, 22, 214, 228, 30, 142, 75, 210, 187, 243, 78, 0, + 69, 99, 240, 139, 136, 178, 105, 168, 108, 60, 6, 50, 163, 166, 53, 209, + 55, 201, 136, 208, 204, 128, 221, 40, 102, 240, 236, 115, 74, 233, 156, 108, + 172, 64, 198, 82, 18, 165, 3, 234, 222, 236, 155, 30, 175, 172, 73, 23, + 204, 157, 5, 161, 214, 86, 98, 31, 235, 95, 81, 164, 223, 226, 7, 158, + 100, 59, 162, 4, 191, 30, 52, 195, 70, 4, 19, 188, 30, 250, 173, 86, + 139, 172, 131, 27, 173, 168, 213, 18, 118, 204, 81, 243, 162, 21, 162, 77, + 113, 243, 34, 8, 225, 220, 90, 247, 207, 155, 17, 237, 191, 245, 48, 8, + 34, 252, 228, 95, 52, 155, 13, 12, 131, 148, 231, 23, 45, 233, 246, 205, + 131, 12, 209, 21, 142, 18, 247, 227, 109, 178, 37, 107, 150, 117, 25, 159, + 174, 206, 149, 173, 240, 73, 157, 198, 165, 205, 160, 164, 120, 134, 62, 135, + 151, 11, 215, 56, 69, 218, 215, 15, 58, 147, 183, 113, 40, 111, 61, 68, + 83, 140, 122, 187, 3, 210, 68, 218, 255, 3, 10, 213, 23, 84, 48, 145, + 216, 225, 65, 116, 205, 235, 34, 208, 114, 65, 70, 17, 45, 164, 227, 18, + 73, 60, 67, 106, 232, 188, 127, 142, 52, 85, 144, 21, 194, 116, 22, 149, + 67, 57, 70, 250, 118, 140, 241, 89, 113, 100, 244, 231, 115, 88, 211, 96, + 193, 24, 143, 105, 247, 117, 252, 19, 216, 43, 200, 24, 251, 170, 180, 117, + 158, 120, 206, 11, 96, 138, 75, 215, 48, 52, 96, 165, 155, 76, 151, 250, + 220, 97, 58, 150, 135, 42, 223, 14, 243, 99, 40, 37, 170, 52, 183, 101, + 216, 190, 103, 5, 199, 41, 229, 225, 93, 8, 68, 130, 231, 113, 88, 178, + 218, 169, 13, 221, 169, 202, 220, 205, 208, 103, 116, 161, 146, 91, 191, 117, + 156, 227, 69, 156, 179, 135, 238, 89, 252, 88, 224, 60, 227, 189, 10, 156, + 116, 88, 115, 24, 175, 85, 16, 188, 89, 104, 93, 164, 174, 74, 28, 91, + 27, 31, 248, 118, 134, 63, 81, 247, 5, 36, 28, 45, 218, 56, 197, 158, + 153, 174, 239, 81, 45, 231, 248, 216, 94, 233, 6, 52, 157, 227, 21, 54, + 83, 198, 167, 3, 240, 70, 37, 56, 183, 161, 7, 172, 192, 229, 154, 187, + 178, 214, 174, 89, 99, 56, 111, 22, 88, 127, 83, 37, 221, 86, 195, 174, + 175, 67, 11, 120, 156, 145, 93, 178, 24, 127, 156, 174, 192, 98, 160, 245, + 210, 250, 212, 95, 182, 161, 170, 175, 202, 203, 181, 187, 76, 220, 79, 211, + 229, 180, 61, 129, 108, 43, 8, 147, 110, 189, 135, 191, 195, 171, 47, 26, + 238, 172, 123, 125, 105, 189, 127, 18, 227, 26, 249, 178, 108, 189, 209, 225, + 181, 0, 190, 188, 54, 222, 67, 120, 87, 217, 188, 44, 67, 72, 28, 85, + 46, 173, 202, 179, 178, 245, 125, 58, 153, 253, 117, 58, 153, 253, 193, 120, + 143, 224, 253, 123, 140, 240, 125, 245, 235, 75, 235, 251, 175, 161, 84, 244, + 187, 30, 219, 179, 46, 66, 170, 47, 147, 167, 95, 87, 170, 223, 211, 227, + 250, 233, 247, 8, 31, 210, 200, 149, 251, 253, 215, 213, 15, 248, 65, 20, + 47, 211, 79, 71, 87, 223, 3, 145, 84, 18, 132, 93, 199, 178, 90, 181, + 26, 188, 94, 106, 50, 209, 21, 124, 205, 164, 83, 6, 124, 200, 6, 104, + 74, 201, 57, 124, 156, 39, 144, 72, 248, 254, 235, 24, 161, 149, 51, 100, + 18, 125, 151, 186, 177, 145, 166, 75, 235, 3, 236, 91, 47, 203, 216, 210, + 216, 186, 239, 177, 2, 111, 140, 24, 144, 241, 247, 95, 115, 180, 240, 101, + 25, 163, 248, 24, 229, 117, 58, 74, 88, 165, 72, 21, 249, 223, 43, 254, + 220, 132, 225, 4, 193, 175, 84, 135, 154, 20, 77, 107, 68, 164, 209, 97, + 24, 221, 236, 48, 122, 55, 58, 140, 222, 247, 119, 216, 244, 184, 14, 155, + 238, 235, 176, 233, 172, 35, 59, 172, 121, 168, 195, 154, 217, 14, 107, 102, + 59, 172, 249, 184, 14, 203, 209, 215, 200, 180, 34, 247, 20, 7, 118, 167, + 179, 164, 141, 2, 186, 249, 176, 51, 42, 79, 110, 114, 51, 136, 202, 125, + 147, 121, 127, 157, 126, 55, 230, 216, 106, 50, 239, 223, 150, 123, 157, 101, + 167, 114, 105, 227, 15, 196, 188, 178, 223, 187, 111, 220, 215, 54, 68, 196, + 27, 236, 242, 47, 216, 237, 174, 253, 203, 243, 201, 141, 107, 215, 106, 191, + 184, 54, 82, 81, 134, 12, 129, 123, 249, 220, 189, 118, 49, 157, 11, 211, + 207, 254, 156, 153, 134, 111, 184, 145, 94, 167, 39, 29, 183, 204, 7, 110, + 154, 234, 7, 236, 198, 15, 64, 202, 231, 46, 141, 54, 234, 154, 234, 228, + 230, 69, 60, 40, 67, 1, 149, 151, 204, 77, 227, 51, 158, 153, 97, 53, + 132, 243, 64, 53, 19, 185, 34, 160, 16, 124, 209, 68, 6, 113, 162, 84, + 175, 113, 237, 66, 252, 26, 54, 46, 207, 218, 15, 76, 47, 5, 94, 22, + 55, 4, 49, 107, 147, 207, 152, 177, 217, 24, 193, 131, 141, 209, 16, 141, + 33, 199, 216, 254, 220, 97, 183, 189, 133, 113, 151, 45, 226, 225, 246, 78, + 21, 145, 157, 118, 212, 203, 122, 226, 237, 201, 22, 115, 12, 220, 207, 24, + 27, 190, 189, 42, 152, 142, 181, 204, 116, 172, 101, 166, 227, 190, 174, 156, + 22, 116, 101, 96, 116, 101, 96, 118, 229, 244, 225, 174, 68, 42, 169, 43, + 177, 212, 84, 87, 78, 101, 87, 78, 255, 200, 174, 228, 242, 116, 59, 79, + 31, 232, 74, 59, 219, 151, 199, 76, 158, 125, 133, 200, 255, 128, 47, 224, + 211, 81, 121, 56, 233, 185, 52, 39, 221, 87, 60, 225, 85, 30, 145, 251, + 121, 118, 237, 94, 97, 107, 246, 174, 93, 116, 62, 242, 121, 86, 139, 195, + 220, 44, 184, 162, 228, 215, 122, 150, 210, 66, 103, 246, 254, 37, 172, 115, + 147, 207, 170, 224, 69, 255, 211, 184, 207, 69, 251, 152, 121, 112, 152, 128, + 208, 85, 17, 69, 33, 51, 42, 228, 247, 144, 129, 123, 168, 88, 153, 241, + 7, 26, 23, 126, 238, 250, 120, 133, 94, 218, 66, 50, 24, 39, 215, 187, + 82, 185, 34, 90, 122, 54, 227, 125, 155, 246, 130, 24, 8, 192, 63, 248, + 250, 25, 95, 39, 248, 58, 249, 204, 189, 49, 155, 61, 31, 124, 17, 97, + 127, 76, 102, 174, 5, 49, 97, 15, 59, 231, 81, 26, 25, 163, 52, 50, + 71, 41, 71, 50, 71, 39, 173, 65, 65, 235, 136, 133, 42, 104, 165, 210, + 225, 128, 111, 28, 49, 41, 26, 102, 170, 119, 60, 237, 34, 119, 54, 163, + 217, 77, 28, 198, 100, 118, 77, 149, 198, 137, 0, 251, 151, 120, 157, 194, + 43, 14, 69, 126, 197, 214, 124, 71, 219, 188, 117, 231, 103, 50, 81, 140, + 153, 244, 199, 160, 199, 220, 157, 175, 122, 28, 7, 254, 59, 226, 0, 114, + 57, 216, 119, 193, 67, 89, 178, 34, 153, 15, 137, 247, 100, 110, 4, 7, + 169, 50, 203, 169, 145, 8, 105, 210, 223, 5, 89, 209, 49, 100, 217, 119, + 225, 63, 139, 78, 35, 56, 76, 145, 207, 25, 6, 47, 15, 87, 35, 245, + 45, 112, 83, 121, 164, 190, 133, 110, 166, 75, 114, 179, 80, 84, 15, 215, + 199, 134, 152, 130, 141, 189, 251, 97, 116, 228, 44, 164, 54, 110, 252, 166, + 54, 182, 239, 162, 255, 230, 70, 55, 130, 163, 127, 114, 95, 68, 251, 190, + 69, 71, 247, 83, 243, 218, 109, 138, 126, 106, 254, 49, 253, 212, 60, 170, + 159, 244, 51, 174, 229, 162, 105, 42, 191, 179, 255, 214, 162, 88, 148, 68, + 220, 193, 30, 107, 39, 169, 0, 226, 236, 55, 233, 32, 60, 196, 173, 3, + 35, 8, 227, 36, 169, 0, 78, 150, 14, 194, 100, 178, 177, 68, 105, 110, + 249, 74, 201, 196, 237, 107, 88, 58, 225, 85, 152, 11, 216, 215, 149, 211, + 16, 155, 112, 255, 218, 182, 183, 131, 90, 215, 110, 75, 116, 80, 235, 143, + 233, 160, 214, 81, 107, 232, 114, 157, 141, 178, 76, 114, 33, 235, 108, 183, + 46, 147, 108, 62, 186, 119, 140, 19, 184, 15, 71, 112, 218, 82, 236, 61, + 13, 98, 196, 13, 32, 110, 64, 222, 123, 246, 46, 210, 122, 102, 237, 105, + 196, 179, 107, 247, 76, 52, 226, 89, 246, 0, 131, 67, 72, 52, 208, 179, + 61, 68, 190, 199, 138, 191, 135, 51, 141, 207, 7, 138, 215, 62, 159, 40, + 94, 249, 220, 190, 133, 212, 150, 223, 251, 181, 248, 125, 229, 20, 56, 33, + 187, 252, 6, 158, 223, 136, 231, 215, 240, 252, 90, 60, 191, 130, 231, 87, + 244, 92, 180, 40, 248, 238, 27, 223, 125, 237, 187, 175, 124, 99, 175, 185, + 248, 109, 123, 205, 17, 253, 105, 29, 211, 159, 203, 117, 118, 134, 46, 147, + 108, 89, 127, 80, 159, 251, 251, 251, 220, 136, 27, 66, 220, 48, 59, 62, + 246, 237, 130, 89, 158, 209, 110, 185, 220, 214, 146, 62, 89, 182, 213, 114, + 121, 245, 149, 1, 178, 32, 252, 64, 219, 160, 12, 16, 41, 109, 96, 125, + 3, 201, 251, 6, 217, 65, 134, 115, 127, 242, 153, 102, 231, 31, 55, 202, + 56, 17, 12, 50, 76, 3, 227, 11, 147, 192, 208, 194, 20, 48, 170, 10, + 26, 41, 52, 135, 101, 100, 12, 203, 200, 24, 150, 145, 49, 44, 77, 238, + 89, 182, 88, 36, 90, 12, 70, 216, 161, 61, 94, 157, 224, 31, 177, 50, + 5, 71, 177, 119, 71, 236, 17, 255, 157, 131, 125, 185, 142, 114, 113, 178, + 244, 252, 11, 38, 132, 191, 127, 66, 24, 113, 35, 136, 27, 101, 39, 207, + 62, 182, 229, 15, 155, 60, 145, 49, 121, 152, 2, 252, 16, 241, 172, 226, + 0, 99, 86, 157, 203, 89, 117, 158, 157, 85, 13, 49, 171, 26, 255, 210, + 89, 245, 136, 4, 92, 183, 212, 52, 108, 24, 211, 176, 97, 76, 195, 134, + 49, 13, 27, 5, 211, 176, 161, 166, 33, 180, 156, 125, 136, 139, 123, 236, + 76, 164, 255, 82, 7, 208, 207, 51, 227, 16, 152, 58, 98, 126, 238, 22, + 125, 193, 160, 207, 83, 227, 139, 56, 41, 211, 73, 176, 100, 73, 79, 128, + 69, 80, 159, 218, 229, 137, 64, 53, 88, 19, 170, 71, 66, 127, 55, 244, + 119, 184, 104, 75, 35, 20, 120, 88, 107, 229, 196, 66, 179, 243, 117, 226, + 174, 55, 110, 178, 49, 157, 169, 164, 96, 23, 53, 242, 71, 246, 218, 189, + 110, 101, 169, 81, 186, 26, 77, 255, 41, 107, 107, 136, 135, 72, 62, 52, + 76, 151, 177, 143, 161, 67, 195, 1, 42, 157, 179, 253, 32, 183, 118, 47, + 222, 246, 118, 168, 16, 133, 202, 66, 91, 188, 194, 238, 207, 187, 192, 57, + 252, 100, 59, 168, 70, 18, 84, 239, 93, 50, 224, 75, 138, 98, 16, 180, + 89, 117, 128, 72, 81, 59, 107, 83, 20, 35, 130, 24, 81, 181, 231, 146, + 143, 218, 26, 106, 55, 217, 132, 144, 70, 78, 15, 239, 201, 85, 166, 70, + 136, 181, 106, 82, 207, 171, 206, 106, 76, 250, 198, 124, 147, 172, 187, 2, + 102, 146, 204, 254, 34, 200, 209, 158, 75, 197, 55, 195, 17, 166, 27, 165, + 208, 44, 37, 10, 67, 6, 107, 12, 95, 235, 10, 13, 154, 28, 68, 212, + 25, 91, 204, 217, 144, 79, 7, 66, 216, 77, 92, 159, 29, 60, 56, 107, + 2, 145, 174, 169, 252, 208, 178, 1, 97, 225, 206, 133, 178, 27, 99, 255, + 58, 208, 86, 208, 24, 61, 188, 76, 68, 13, 0, 17, 169, 33, 60, 67, + 208, 229, 120, 129, 149, 132, 1, 250, 104, 223, 15, 123, 203, 129, 203, 160, + 31, 5, 250, 48, 28, 243, 113, 90, 77, 142, 81, 0, 94, 103, 163, 151, + 176, 227, 20, 143, 10, 192, 40, 153, 148, 73, 255, 222, 32, 71, 208, 64, + 164, 75, 156, 101, 5, 91, 114, 148, 7, 48, 9, 52, 185, 245, 200, 245, + 249, 165, 241, 27, 226, 47, 124, 41, 254, 32, 131, 51, 161, 94, 97, 48, + 161, 71, 242, 99, 67, 193, 81, 254, 100, 69, 2, 118, 50, 18, 16, 147, + 145, 128, 147, 140, 24, 58, 18, 181, 217, 2, 5, 171, 103, 43, 88, 61, + 3, 229, 203, 208, 214, 225, 22, 145, 250, 58, 159, 87, 157, 222, 156, 32, + 21, 138, 173, 191, 93, 88, 248, 97, 221, 223, 132, 46, 44, 232, 176, 158, + 111, 162, 124, 159, 235, 60, 142, 82, 132, 74, 21, 153, 130, 77, 50, 158, + 50, 239, 90, 123, 42, 99, 219, 194, 19, 38, 42, 188, 233, 117, 253, 122, + 203, 180, 144, 18, 118, 139, 161, 149, 174, 116, 94, 105, 202, 168, 144, 214, + 156, 242, 148, 55, 85, 124, 60, 35, 213, 128, 11, 124, 212, 186, 11, 194, + 202, 252, 226, 56, 237, 170, 134, 208, 174, 10, 96, 141, 106, 184, 210, 52, + 115, 143, 146, 149, 38, 73, 246, 28, 106, 218, 78, 217, 150, 118, 114, 35, + 212, 122, 242, 150, 51, 28, 43, 163, 175, 100, 15, 39, 246, 21, 122, 148, + 254, 24, 165, 52, 212, 100, 142, 218, 246, 108, 193, 42, 37, 134, 1, 20, + 65, 217, 235, 162, 165, 194, 95, 80, 96, 101, 81, 88, 182, 171, 0, 48, + 133, 182, 122, 73, 34, 128, 215, 155, 218, 119, 31, 42, 83, 164, 61, 136, + 147, 137, 182, 246, 17, 142, 222, 185, 157, 119, 136, 39, 233, 188, 83, 90, + 200, 129, 242, 218, 13, 77, 167, 30, 147, 180, 215, 93, 17, 42, 60, 103, + 191, 211, 74, 160, 114, 135, 134, 245, 79, 53, 59, 87, 225, 39, 67, 125, + 76, 53, 255, 93, 74, 29, 99, 222, 39, 151, 166, 57, 203, 49, 21, 158, + 49, 23, 123, 207, 225, 90, 87, 192, 102, 55, 213, 194, 215, 246, 209, 234, + 21, 72, 70, 218, 126, 48, 13, 61, 100, 154, 135, 213, 20, 49, 146, 184, + 116, 21, 196, 188, 202, 214, 64, 4, 67, 224, 202, 189, 115, 239, 93, 158, + 24, 153, 234, 80, 164, 66, 251, 199, 14, 235, 147, 235, 101, 161, 179, 30, + 230, 144, 200, 196, 100, 131, 113, 137, 168, 46, 149, 162, 138, 30, 170, 231, + 227, 204, 224, 114, 70, 111, 20, 77, 186, 34, 53, 42, 153, 93, 234, 224, + 244, 35, 163, 74, 197, 166, 108, 61, 176, 110, 184, 187, 164, 42, 148, 182, + 239, 212, 133, 9, 23, 211, 249, 160, 139, 130, 48, 4, 20, 53, 9, 205, + 47, 91, 89, 218, 68, 203, 19, 77, 122, 29, 19, 78, 80, 25, 69, 167, + 33, 80, 116, 34, 97, 226, 179, 45, 65, 38, 4, 158, 209, 216, 85, 74, + 134, 233, 141, 204, 91, 14, 255, 197, 176, 63, 159, 13, 39, 192, 36, 74, + 200, 164, 238, 106, 142, 74, 185, 237, 17, 12, 178, 17, 217, 243, 49, 167, + 208, 46, 102, 21, 122, 246, 7, 149, 133, 220, 148, 82, 42, 62, 102, 1, + 228, 43, 251, 120, 182, 32, 67, 156, 70, 164, 104, 152, 240, 103, 33, 107, + 33, 35, 10, 154, 229, 229, 26, 51, 79, 29, 78, 74, 104, 173, 121, 191, + 79, 128, 19, 38, 71, 17, 166, 56, 138, 136, 129, 206, 172, 118, 138, 14, + 177, 199, 187, 198, 111, 68, 191, 135, 131, 51, 161, 94, 97, 48, 225, 168, + 240, 163, 19, 144, 39, 16, 82, 249, 84, 189, 167, 9, 201, 82, 245, 140, + 87, 223, 214, 115, 216, 57, 30, 230, 130, 240, 255, 168, 138, 31, 94, 162, + 134, 125, 227, 18, 141, 226, 208, 22, 238, 210, 57, 191, 68, 37, 58, 84, + 159, 67, 197, 57, 132, 224, 12, 32, 70, 0, 81, 130, 166, 193, 203, 252, + 126, 78, 6, 78, 94, 203, 213, 124, 130, 171, 116, 186, 38, 74, 193, 112, + 91, 70, 128, 208, 70, 133, 26, 168, 236, 132, 53, 167, 41, 159, 163, 26, + 236, 222, 226, 25, 227, 212, 156, 179, 26, 16, 93, 57, 109, 168, 168, 53, + 231, 28, 130, 2, 25, 132, 41, 106, 206, 69, 13, 119, 119, 17, 20, 112, + 18, 149, 59, 70, 86, 217, 7, 161, 145, 127, 16, 153, 209, 26, 102, 52, + 65, 18, 180, 60, 154, 222, 100, 70, 202, 17, 21, 80, 158, 221, 33, 16, + 171, 33, 35, 32, 253, 242, 25, 9, 255, 221, 181, 109, 152, 213, 104, 154, + 213, 104, 29, 87, 141, 223, 90, 234, 225, 42, 73, 6, 12, 3, 207, 204, + 14, 57, 55, 59, 228, 194, 236, 144, 51, 179, 38, 231, 102, 77, 46, 142, + 170, 201, 145, 157, 254, 219, 42, 124, 76, 29, 76, 91, 75, 44, 203, 55, + 43, 20, 4, 102, 141, 130, 240, 184, 42, 61, 56, 64, 143, 28, 0, 71, + 182, 238, 209, 68, 163, 13, 41, 124, 129, 127, 77, 85, 1, 185, 241, 164, + 176, 23, 222, 243, 106, 32, 133, 36, 120, 204, 85, 176, 4, 132, 221, 213, + 89, 20, 249, 76, 173, 91, 11, 137, 107, 64, 71, 254, 186, 125, 238, 110, + 207, 107, 81, 21, 241, 9, 118, 82, 49, 220, 4, 38, 168, 219, 107, 56, + 184, 175, 96, 25, 215, 24, 4, 158, 6, 38, 224, 95, 75, 131, 42, 10, + 106, 127, 129, 162, 151, 130, 179, 104, 179, 196, 197, 109, 19, 114, 72, 123, + 153, 204, 250, 40, 208, 137, 23, 192, 220, 207, 251, 172, 0, 219, 27, 118, + 198, 211, 73, 143, 21, 96, 5, 15, 78, 208, 34, 136, 98, 135, 54, 169, + 50, 71, 13, 49, 202, 185, 169, 215, 225, 66, 132, 40, 140, 146, 2, 169, + 145, 242, 151, 206, 217, 117, 70, 246, 98, 57, 95, 117, 9, 224, 204, 180, + 140, 14, 21, 108, 33, 185, 95, 93, 252, 255, 236, 189, 105, 123, 27, 217, + 145, 38, 250, 61, 127, 69, 10, 74, 25, 91, 2, 68, 38, 22, 82, 162, + 146, 110, 47, 227, 154, 154, 107, 233, 170, 203, 229, 238, 153, 203, 98, 161, + 65, 0, 36, 96, 129, 0, 141, 133, 0, 200, 194, 253, 237, 55, 222, 136, + 179, 229, 2, 138, 146, 171, 221, 51, 207, 115, 237, 18, 152, 121, 242, 172, + 113, 182, 56, 113, 34, 222, 240, 103, 139, 33, 155, 171, 18, 99, 115, 212, + 208, 181, 44, 237, 76, 233, 248, 210, 30, 124, 189, 95, 77, 198, 15, 220, + 202, 187, 193, 124, 50, 88, 175, 233, 51, 154, 57, 222, 80, 186, 209, 152, + 222, 142, 225, 161, 172, 76, 166, 2, 87, 117, 77, 28, 220, 74, 8, 200, + 120, 168, 89, 162, 24, 96, 212, 20, 109, 18, 58, 201, 164, 44, 157, 184, + 77, 253, 225, 230, 126, 10, 159, 146, 0, 75, 179, 221, 21, 122, 169, 190, + 203, 25, 170, 198, 135, 2, 29, 225, 180, 201, 106, 219, 216, 171, 90, 151, + 2, 237, 82, 14, 125, 149, 106, 37, 102, 170, 142, 52, 237, 165, 253, 147, + 134, 71, 183, 38, 161, 180, 25, 26, 138, 135, 134, 218, 161, 161, 244, 161, + 228, 171, 193, 232, 38, 138, 67, 53, 20, 67, 61, 12, 67, 53, 4, 67, + 12, 63, 74, 196, 132, 15, 205, 176, 206, 2, 190, 10, 36, 142, 9, 236, + 248, 5, 202, 251, 218, 70, 222, 111, 121, 117, 56, 29, 102, 19, 30, 118, + 22, 5, 91, 209, 82, 101, 122, 241, 183, 74, 35, 170, 254, 230, 55, 120, + 136, 170, 85, 255, 151, 95, 124, 14, 4, 3, 168, 130, 113, 25, 110, 63, + 52, 34, 251, 37, 202, 126, 177, 31, 40, 78, 85, 14, 155, 109, 234, 105, + 17, 212, 1, 24, 179, 229, 167, 109, 213, 113, 16, 101, 185, 24, 197, 211, + 54, 98, 10, 79, 133, 152, 142, 218, 101, 11, 172, 166, 107, 42, 196, 118, + 136, 98, 81, 10, 107, 68, 113, 72, 58, 79, 158, 34, 32, 170, 138, 27, + 96, 79, 25, 40, 4, 115, 189, 160, 44, 149, 109, 162, 19, 208, 73, 197, + 224, 132, 113, 66, 199, 106, 52, 167, 84, 193, 51, 141, 30, 26, 71, 116, + 218, 166, 224, 170, 151, 192, 214, 241, 169, 83, 11, 224, 178, 6, 217, 81, + 25, 116, 68, 169, 63, 178, 108, 48, 18, 56, 121, 152, 192, 178, 253, 107, + 29, 249, 211, 186, 71, 11, 25, 35, 144, 53, 82, 216, 95, 117, 164, 167, + 192, 203, 110, 168, 141, 111, 187, 56, 47, 67, 126, 125, 197, 40, 227, 92, + 173, 14, 27, 244, 118, 224, 65, 146, 209, 195, 220, 223, 229, 3, 27, 236, + 136, 193, 76, 87, 219, 144, 62, 208, 82, 42, 198, 57, 104, 64, 84, 220, + 152, 232, 75, 141, 105, 29, 105, 12, 252, 100, 176, 148, 148, 62, 180, 229, + 195, 127, 110, 3, 226, 226, 6, 196, 186, 1, 49, 55, 160, 254, 168, 92, + 247, 233, 106, 215, 235, 151, 34, 129, 104, 224, 111, 204, 245, 83, 18, 137, + 76, 5, 187, 92, 193, 216, 84, 176, 45, 46, 166, 169, 70, 157, 84, 141, + 104, 40, 178, 204, 130, 17, 108, 104, 232, 137, 157, 241, 61, 159, 137, 110, + 166, 50, 112, 97, 219, 152, 53, 89, 50, 226, 93, 21, 142, 17, 11, 51, + 231, 2, 48, 78, 199, 210, 199, 113, 76, 14, 199, 188, 124, 188, 187, 30, + 12, 63, 223, 242, 17, 243, 7, 247, 229, 59, 247, 229, 247, 238, 203, 239, + 128, 199, 105, 95, 251, 188, 120, 93, 133, 42, 67, 139, 147, 48, 248, 60, + 198, 198, 163, 139, 255, 178, 52, 132, 29, 204, 35, 27, 235, 94, 94, 187, + 129, 87, 139, 37, 150, 175, 198, 106, 56, 152, 29, 119, 4, 175, 173, 105, + 53, 40, 11, 59, 32, 214, 251, 72, 190, 218, 73, 69, 129, 118, 86, 143, + 130, 243, 196, 22, 64, 205, 130, 167, 165, 205, 167, 96, 117, 197, 238, 166, + 123, 157, 176, 29, 127, 85, 62, 131, 187, 123, 106, 223, 111, 179, 8, 159, + 52, 10, 145, 169, 151, 234, 60, 99, 150, 139, 51, 47, 36, 117, 206, 237, + 78, 164, 80, 25, 75, 37, 89, 171, 158, 104, 147, 147, 54, 246, 97, 167, + 18, 68, 165, 131, 53, 113, 225, 190, 17, 196, 3, 93, 64, 240, 219, 140, + 149, 139, 218, 140, 64, 63, 141, 69, 166, 14, 200, 150, 136, 202, 67, 37, + 31, 149, 239, 7, 171, 21, 229, 215, 50, 142, 185, 154, 50, 221, 166, 171, + 249, 230, 174, 2, 59, 238, 95, 191, 120, 65, 38, 167, 102, 3, 119, 156, + 17, 94, 228, 145, 61, 46, 12, 5, 216, 4, 183, 59, 110, 149, 86, 227, + 95, 171, 34, 106, 228, 56, 21, 18, 193, 49, 219, 196, 183, 99, 25, 12, + 97, 36, 94, 203, 223, 246, 76, 117, 228, 59, 251, 51, 212, 155, 42, 173, + 226, 77, 222, 88, 25, 150, 128, 23, 169, 87, 196, 109, 12, 101, 48, 204, + 229, 79, 77, 254, 60, 181, 107, 48, 200, 223, 2, 203, 56, 136, 233, 224, + 129, 137, 79, 73, 86, 23, 109, 47, 117, 63, 133, 237, 232, 111, 216, 247, + 40, 85, 216, 165, 48, 252, 131, 120, 85, 60, 173, 12, 154, 16, 177, 205, + 104, 187, 84, 196, 17, 39, 169, 145, 250, 79, 109, 150, 188, 97, 210, 20, + 156, 155, 139, 165, 193, 236, 126, 50, 16, 66, 254, 77, 156, 167, 102, 243, + 103, 209, 43, 175, 163, 148, 100, 126, 144, 229, 201, 174, 75, 140, 225, 160, + 214, 166, 52, 82, 48, 36, 112, 121, 68, 60, 21, 74, 97, 26, 87, 170, + 0, 180, 139, 145, 115, 25, 104, 90, 186, 15, 137, 54, 179, 193, 82, 62, + 20, 72, 34, 87, 179, 231, 81, 187, 4, 125, 9, 134, 152, 89, 240, 197, + 86, 179, 141, 59, 9, 250, 7, 195, 203, 184, 250, 149, 184, 139, 69, 8, + 111, 186, 137, 71, 192, 24, 143, 226, 253, 174, 86, 57, 250, 173, 10, 233, + 183, 250, 18, 253, 104, 15, 158, 79, 191, 138, 126, 171, 151, 209, 239, 236, + 159, 68, 190, 213, 183, 144, 207, 122, 58, 90, 14, 70, 211, 205, 138, 33, + 31, 140, 16, 116, 149, 39, 149, 17, 44, 42, 239, 70, 223, 14, 251, 240, + 142, 81, 29, 108, 89, 116, 4, 42, 180, 141, 124, 169, 180, 212, 105, 17, + 48, 29, 101, 183, 167, 18, 6, 143, 211, 187, 205, 122, 194, 222, 168, 232, + 245, 113, 60, 159, 170, 55, 105, 114, 255, 102, 51, 231, 187, 253, 202, 253, + 100, 26, 210, 97, 123, 61, 56, 214, 92, 228, 107, 182, 226, 127, 8, 239, + 194, 84, 36, 49, 53, 4, 82, 154, 114, 95, 149, 174, 87, 82, 130, 19, + 143, 168, 78, 12, 125, 77, 160, 21, 168, 162, 2, 106, 214, 169, 73, 125, + 171, 165, 60, 237, 20, 17, 122, 157, 44, 245, 188, 52, 141, 28, 116, 124, + 32, 148, 89, 23, 87, 65, 196, 46, 174, 12, 164, 26, 29, 222, 191, 88, + 143, 67, 1, 68, 89, 150, 116, 154, 94, 105, 4, 12, 246, 130, 229, 202, + 159, 117, 243, 253, 114, 64, 35, 163, 100, 29, 197, 189, 219, 87, 189, 121, + 228, 222, 168, 249, 243, 216, 188, 66, 65, 34, 152, 179, 183, 135, 88, 0, + 125, 219, 97, 137, 42, 234, 39, 62, 224, 136, 107, 149, 29, 26, 80, 61, + 217, 158, 115, 149, 41, 184, 113, 63, 61, 137, 235, 248, 180, 151, 79, 147, + 243, 33, 204, 62, 208, 70, 180, 240, 124, 133, 55, 52, 147, 223, 134, 107, + 245, 77, 154, 124, 142, 173, 189, 166, 81, 208, 134, 235, 218, 240, 222, 0, + 161, 209, 219, 234, 62, 68, 74, 69, 30, 58, 184, 229, 192, 200, 172, 234, + 197, 126, 247, 56, 20, 32, 5, 22, 132, 83, 105, 73, 75, 106, 153, 112, + 29, 207, 217, 131, 93, 238, 27, 127, 130, 39, 59, 23, 4, 135, 93, 131, + 77, 14, 240, 26, 97, 168, 193, 248, 8, 157, 176, 52, 223, 37, 68, 133, + 168, 250, 102, 123, 62, 223, 39, 212, 234, 168, 122, 30, 215, 117, 19, 118, + 245, 125, 173, 68, 105, 74, 166, 25, 243, 108, 80, 140, 160, 185, 14, 179, + 143, 233, 6, 118, 10, 27, 152, 193, 71, 232, 184, 183, 154, 56, 71, 42, + 236, 105, 229, 19, 74, 222, 202, 251, 178, 58, 70, 188, 161, 204, 169, 85, + 110, 196, 200, 87, 0, 11, 94, 157, 142, 59, 33, 128, 51, 99, 62, 3, + 201, 115, 93, 103, 15, 247, 31, 15, 13, 74, 119, 112, 15, 140, 114, 32, + 97, 116, 6, 246, 31, 50, 169, 139, 203, 128, 58, 4, 100, 147, 3, 176, + 124, 84, 92, 71, 118, 47, 8, 16, 142, 223, 52, 198, 149, 198, 163, 139, + 41, 237, 122, 180, 178, 29, 147, 129, 150, 102, 63, 231, 118, 134, 104, 220, + 62, 140, 249, 171, 146, 89, 211, 28, 88, 123, 232, 83, 237, 249, 247, 145, + 127, 55, 252, 251, 192, 191, 91, 254, 221, 69, 28, 135, 127, 31, 249, 119, + 195, 191, 15, 252, 187, 229, 95, 172, 132, 218, 223, 202, 69, 18, 23, 173, + 119, 12, 64, 255, 77, 43, 155, 206, 152, 93, 126, 28, 193, 132, 53, 109, + 122, 218, 0, 9, 246, 229, 255, 224, 69, 233, 40, 142, 140, 242, 12, 158, + 50, 166, 151, 221, 83, 93, 148, 58, 164, 52, 215, 105, 109, 241, 10, 66, + 84, 40, 212, 189, 81, 148, 96, 57, 149, 198, 227, 247, 47, 5, 143, 159, + 65, 30, 40, 240, 180, 241, 86, 2, 129, 103, 24, 83, 176, 82, 14, 104, + 27, 167, 54, 238, 2, 102, 61, 93, 226, 118, 233, 137, 126, 24, 136, 61, + 98, 113, 177, 12, 152, 10, 187, 225, 99, 0, 115, 29, 8, 105, 207, 223, + 41, 164, 110, 224, 83, 236, 97, 218, 171, 215, 154, 52, 102, 98, 92, 166, + 0, 225, 188, 18, 156, 65, 165, 35, 174, 86, 27, 113, 173, 18, 116, 89, + 191, 3, 136, 231, 144, 125, 195, 251, 27, 189, 212, 99, 196, 139, 241, 233, + 140, 22, 238, 178, 224, 136, 237, 252, 186, 92, 186, 213, 33, 92, 41, 67, + 253, 171, 167, 178, 100, 45, 145, 182, 202, 146, 181, 71, 162, 88, 178, 236, + 113, 150, 177, 202, 146, 117, 76, 222, 22, 100, 201, 56, 242, 101, 172, 244, + 29, 149, 229, 41, 231, 162, 178, 236, 136, 22, 138, 100, 217, 225, 44, 91, + 42, 203, 136, 117, 85, 84, 150, 205, 84, 166, 118, 46, 51, 118, 60, 211, + 50, 212, 208, 241, 192, 160, 65, 144, 220, 31, 180, 173, 243, 159, 102, 83, + 209, 84, 65, 208, 56, 139, 144, 194, 136, 71, 236, 12, 68, 188, 205, 155, + 81, 85, 104, 209, 233, 132, 141, 94, 10, 88, 69, 77, 216, 12, 83, 58, + 155, 230, 221, 127, 168, 80, 48, 41, 159, 199, 227, 251, 254, 106, 50, 88, + 142, 71, 125, 216, 117, 90, 65, 119, 150, 79, 69, 154, 98, 124, 235, 57, + 149, 212, 243, 111, 104, 122, 65, 182, 42, 230, 142, 43, 255, 157, 73, 250, + 68, 219, 234, 96, 52, 94, 134, 124, 173, 176, 10, 205, 192, 12, 157, 201, + 18, 202, 204, 90, 105, 15, 88, 211, 241, 202, 149, 101, 91, 214, 55, 11, + 134, 241, 227, 130, 230, 246, 112, 57, 134, 242, 132, 114, 10, 162, 247, 122, + 248, 194, 164, 77, 157, 66, 87, 99, 170, 161, 66, 71, 26, 204, 22, 243, + 91, 142, 186, 111, 224, 98, 255, 56, 143, 152, 35, 78, 90, 246, 173, 102, + 60, 187, 8, 17, 138, 26, 250, 138, 3, 174, 227, 232, 77, 186, 42, 43, + 153, 229, 136, 158, 18, 198, 164, 163, 137, 186, 1, 142, 126, 86, 244, 75, + 149, 242, 239, 6, 115, 250, 158, 186, 243, 183, 224, 78, 166, 18, 198, 29, + 216, 113, 56, 166, 116, 61, 158, 131, 98, 66, 59, 141, 179, 48, 65, 142, + 251, 226, 149, 119, 100, 28, 66, 71, 57, 15, 235, 173, 112, 5, 137, 193, + 165, 58, 121, 191, 162, 13, 222, 175, 208, 242, 99, 240, 96, 78, 88, 116, + 92, 224, 218, 241, 137, 19, 54, 113, 224, 125, 198, 105, 163, 106, 19, 15, + 246, 75, 121, 129, 215, 63, 126, 232, 79, 6, 171, 62, 147, 181, 175, 200, + 90, 112, 205, 147, 235, 58, 87, 47, 7, 248, 161, 146, 151, 66, 177, 74, + 203, 211, 142, 21, 195, 50, 54, 72, 70, 168, 7, 63, 143, 237, 37, 155, + 250, 172, 47, 222, 76, 145, 170, 136, 107, 58, 242, 40, 32, 65, 234, 253, + 249, 112, 79, 201, 87, 159, 159, 193, 191, 167, 175, 5, 109, 44, 6, 135, + 87, 82, 178, 2, 231, 129, 188, 137, 17, 43, 111, 228, 27, 254, 237, 96, + 179, 90, 77, 7, 115, 229, 172, 224, 13, 29, 24, 223, 0, 89, 75, 78, + 133, 106, 218, 233, 85, 109, 136, 217, 161, 58, 193, 72, 215, 52, 8, 43, + 203, 66, 112, 148, 242, 220, 142, 210, 219, 163, 43, 69, 99, 85, 101, 199, + 135, 219, 225, 101, 131, 89, 225, 159, 133, 254, 102, 133, 187, 77, 69, 201, + 128, 118, 57, 141, 34, 243, 4, 244, 79, 90, 164, 49, 201, 248, 103, 177, + 89, 3, 168, 148, 137, 214, 80, 68, 171, 166, 60, 193, 209, 72, 125, 245, + 20, 92, 132, 83, 90, 229, 79, 171, 128, 193, 155, 175, 167, 115, 248, 129, + 156, 26, 81, 28, 71, 218, 26, 145, 49, 49, 133, 34, 96, 162, 185, 196, + 83, 234, 137, 101, 51, 205, 84, 90, 35, 132, 82, 164, 250, 168, 46, 64, + 124, 22, 140, 7, 31, 89, 192, 163, 213, 225, 5, 125, 73, 187, 151, 251, + 40, 251, 139, 186, 17, 249, 232, 238, 48, 20, 38, 82, 45, 22, 84, 17, + 83, 205, 124, 126, 74, 139, 79, 38, 89, 161, 239, 55, 78, 250, 241, 34, + 210, 78, 84, 63, 22, 185, 80, 133, 64, 28, 50, 41, 184, 218, 13, 27, + 79, 240, 102, 226, 228, 153, 155, 185, 52, 50, 224, 136, 93, 231, 172, 184, + 242, 231, 114, 255, 71, 106, 166, 43, 119, 108, 9, 81, 55, 22, 47, 205, + 206, 209, 120, 212, 23, 8, 121, 177, 255, 122, 176, 52, 66, 128, 107, 154, + 177, 64, 105, 189, 96, 191, 239, 253, 245, 100, 58, 252, 12, 97, 207, 251, + 164, 192, 49, 20, 82, 254, 227, 231, 123, 93, 164, 241, 244, 110, 10, 77, + 90, 205, 118, 154, 49, 86, 117, 13, 95, 166, 22, 166, 27, 230, 156, 220, + 187, 41, 175, 118, 237, 179, 148, 251, 247, 162, 51, 57, 229, 97, 85, 88, + 117, 85, 185, 158, 166, 154, 162, 83, 78, 227, 63, 174, 97, 218, 231, 216, + 87, 191, 66, 67, 190, 14, 135, 196, 31, 171, 94, 229, 137, 143, 168, 212, + 159, 237, 26, 63, 24, 103, 61, 136, 98, 166, 194, 150, 145, 101, 197, 39, + 180, 184, 131, 22, 231, 207, 14, 255, 133, 187, 79, 113, 238, 94, 181, 72, + 129, 234, 254, 73, 41, 52, 232, 28, 91, 94, 69, 77, 161, 214, 121, 91, + 84, 105, 237, 52, 4, 124, 94, 122, 18, 54, 253, 132, 179, 17, 184, 215, + 35, 42, 180, 24, 139, 189, 80, 29, 10, 45, 103, 103, 85, 8, 65, 58, + 35, 63, 91, 19, 207, 115, 103, 79, 103, 124, 240, 226, 115, 23, 31, 178, + 254, 204, 23, 76, 163, 25, 238, 155, 216, 163, 203, 253, 98, 198, 234, 135, + 98, 17, 51, 24, 126, 222, 14, 150, 35, 23, 170, 155, 130, 69, 129, 118, + 60, 74, 113, 129, 214, 203, 46, 128, 215, 31, 127, 205, 172, 143, 248, 219, + 181, 77, 91, 101, 28, 64, 10, 115, 73, 211, 112, 60, 27, 189, 200, 195, + 110, 57, 85, 193, 148, 62, 197, 124, 140, 123, 250, 53, 251, 187, 185, 29, + 47, 89, 171, 34, 90, 173, 27, 139, 229, 136, 223, 226, 36, 158, 143, 204, + 91, 59, 233, 172, 39, 234, 237, 57, 29, 139, 209, 140, 117, 36, 194, 76, + 201, 162, 116, 225, 146, 167, 101, 156, 13, 88, 218, 164, 183, 102, 81, 203, + 149, 127, 109, 237, 132, 146, 53, 117, 217, 13, 101, 91, 159, 105, 197, 73, + 157, 51, 28, 248, 166, 98, 83, 161, 116, 226, 234, 36, 243, 0, 252, 84, + 30, 110, 71, 207, 178, 70, 86, 235, 240, 184, 71, 207, 181, 82, 225, 70, + 250, 220, 177, 185, 206, 159, 58, 16, 70, 33, 235, 93, 216, 135, 150, 205, + 58, 231, 66, 7, 87, 209, 133, 140, 22, 47, 22, 96, 137, 22, 247, 236, + 154, 144, 117, 147, 108, 175, 11, 51, 49, 28, 195, 24, 90, 13, 145, 130, + 147, 195, 51, 34, 115, 116, 220, 122, 159, 172, 179, 158, 115, 28, 65, 176, + 227, 57, 135, 27, 162, 61, 231, 16, 85, 165, 83, 94, 130, 50, 171, 9, + 113, 63, 94, 170, 145, 218, 206, 185, 186, 187, 187, 128, 216, 139, 254, 139, + 195, 121, 214, 82, 36, 254, 99, 42, 177, 56, 115, 19, 54, 212, 209, 203, + 58, 218, 196, 2, 231, 117, 119, 9, 123, 70, 157, 71, 10, 164, 62, 54, + 91, 198, 188, 157, 100, 54, 138, 116, 181, 67, 47, 215, 14, 215, 217, 169, + 114, 92, 167, 246, 5, 108, 10, 81, 94, 111, 71, 249, 76, 62, 203, 66, + 24, 23, 182, 179, 216, 105, 221, 93, 162, 110, 4, 43, 154, 102, 240, 80, + 215, 22, 237, 206, 255, 108, 39, 117, 77, 246, 7, 42, 23, 129, 169, 45, + 229, 122, 165, 97, 206, 127, 22, 79, 117, 63, 55, 161, 91, 96, 4, 130, + 63, 3, 196, 156, 177, 148, 61, 78, 167, 18, 54, 225, 195, 14, 191, 26, + 183, 117, 174, 19, 64, 13, 199, 179, 162, 60, 179, 157, 197, 255, 167, 186, + 180, 115, 251, 87, 111, 105, 235, 241, 124, 181, 88, 42, 75, 78, 125, 19, + 193, 215, 190, 188, 227, 176, 174, 25, 171, 251, 137, 51, 177, 139, 228, 99, + 50, 158, 205, 166, 247, 171, 197, 116, 132, 109, 70, 37, 185, 155, 206, 143, + 121, 21, 150, 18, 244, 254, 81, 228, 182, 221, 142, 248, 237, 100, 60, 167, + 149, 12, 133, 150, 105, 171, 243, 167, 107, 255, 150, 17, 41, 177, 16, 217, + 114, 57, 2, 176, 158, 134, 124, 159, 240, 220, 244, 115, 91, 164, 240, 198, + 185, 73, 113, 250, 242, 5, 158, 69, 90, 205, 86, 250, 238, 179, 7, 15, + 216, 225, 219, 176, 244, 87, 160, 119, 241, 78, 76, 163, 194, 191, 220, 134, + 147, 112, 116, 5, 175, 182, 127, 61, 73, 0, 138, 92, 249, 107, 245, 28, + 152, 205, 149, 191, 134, 127, 13, 219, 192, 19, 36, 166, 172, 54, 222, 143, + 43, 237, 106, 201, 33, 49, 236, 26, 93, 130, 187, 147, 87, 179, 112, 86, + 17, 47, 206, 42, 226, 193, 9, 37, 213, 241, 136, 207, 226, 12, 169, 43, + 171, 106, 145, 178, 157, 180, 215, 220, 236, 71, 172, 73, 87, 226, 179, 138, + 191, 113, 72, 204, 130, 128, 13, 43, 166, 222, 76, 113, 54, 19, 154, 131, + 102, 42, 11, 34, 153, 104, 66, 20, 248, 203, 194, 145, 199, 53, 30, 197, + 79, 47, 44, 93, 78, 95, 203, 21, 187, 252, 165, 223, 171, 146, 255, 89, + 41, 78, 80, 154, 118, 81, 154, 31, 40, 238, 119, 28, 255, 247, 146, 58, + 157, 166, 243, 124, 154, 223, 21, 165, 121, 91, 144, 230, 251, 228, 251, 215, + 173, 243, 203, 239, 113, 185, 255, 61, 14, 204, 223, 95, 198, 248, 233, 224, + 167, 139, 159, 179, 43, 201, 69, 169, 31, 188, 74, 122, 130, 156, 11, 237, + 138, 206, 85, 49, 126, 110, 185, 68, 135, 206, 82, 217, 159, 96, 195, 152, + 19, 223, 67, 35, 19, 3, 152, 1, 226, 177, 155, 174, 151, 155, 187, 164, + 68, 167, 162, 18, 45, 156, 124, 214, 73, 215, 44, 138, 195, 146, 247, 35, + 141, 191, 239, 43, 175, 97, 167, 253, 129, 129, 228, 126, 68, 45, 233, 55, + 226, 223, 216, 121, 110, 243, 111, 199, 9, 151, 103, 58, 189, 94, 157, 195, + 1, 4, 165, 167, 223, 202, 7, 216, 124, 223, 248, 149, 209, 120, 93, 161, + 247, 203, 118, 248, 246, 170, 250, 158, 166, 28, 191, 92, 213, 146, 70, 116, + 206, 207, 29, 231, 185, 203, 207, 85, 206, 7, 156, 74, 2, 247, 214, 180, + 86, 203, 171, 10, 143, 210, 225, 145, 14, 143, 211, 225, 177, 10, 47, 121, + 159, 197, 221, 68, 236, 108, 253, 176, 20, 105, 48, 32, 254, 202, 74, 249, + 137, 56, 31, 195, 79, 201, 211, 37, 180, 157, 195, 233, 229, 233, 213, 213, + 1, 148, 228, 139, 47, 134, 204, 103, 95, 61, 205, 29, 92, 79, 76, 70, + 80, 190, 190, 65, 45, 53, 212, 44, 176, 209, 74, 193, 199, 210, 185, 122, + 255, 196, 239, 159, 204, 59, 101, 197, 33, 244, 183, 164, 73, 245, 189, 254, + 56, 226, 59, 193, 199, 49, 136, 5, 210, 205, 17, 16, 209, 76, 135, 100, + 122, 11, 189, 55, 90, 188, 106, 143, 231, 222, 159, 133, 192, 151, 196, 63, + 94, 9, 137, 209, 230, 63, 87, 113, 215, 6, 43, 123, 160, 244, 245, 174, + 4, 125, 2, 207, 167, 120, 110, 89, 211, 124, 132, 69, 161, 160, 127, 163, + 195, 251, 21, 16, 161, 26, 122, 127, 174, 37, 64, 201, 253, 179, 37, 60, + 109, 185, 127, 22, 186, 255, 217, 82, 157, 3, 35, 9, 140, 83, 129, 76, + 241, 31, 84, 245, 208, 223, 231, 158, 113, 139, 184, 71, 243, 216, 201, 119, + 133, 11, 104, 248, 156, 201, 207, 49, 48, 72, 57, 119, 132, 196, 54, 36, + 150, 144, 214, 21, 123, 2, 175, 196, 53, 78, 199, 95, 17, 93, 61, 196, + 244, 80, 173, 50, 240, 192, 77, 5, 222, 204, 165, 125, 173, 80, 14, 247, + 180, 249, 213, 248, 28, 86, 13, 239, 215, 43, 128, 249, 17, 227, 89, 75, + 148, 28, 172, 242, 231, 144, 255, 224, 19, 76, 224, 212, 247, 132, 87, 90, + 122, 10, 127, 96, 192, 38, 132, 213, 77, 26, 181, 76, 231, 82, 142, 150, + 131, 173, 20, 142, 148, 182, 2, 54, 30, 99, 2, 81, 111, 207, 0, 59, + 49, 220, 172, 43, 113, 183, 91, 179, 4, 170, 225, 54, 252, 210, 255, 1, + 51, 239, 7, 76, 182, 31, 64, 131, 43, 44, 246, 149, 136, 104, 97, 99, + 86, 107, 176, 130, 101, 132, 0, 201, 208, 55, 181, 67, 238, 212, 230, 79, + 170, 82, 50, 180, 4, 90, 22, 163, 175, 225, 119, 106, 159, 220, 186, 82, + 124, 138, 74, 17, 220, 218, 82, 160, 174, 45, 128, 45, 190, 47, 137, 83, + 17, 191, 72, 25, 18, 176, 204, 253, 180, 131, 0, 191, 95, 66, 104, 84, + 10, 229, 33, 46, 185, 46, 237, 242, 226, 17, 196, 113, 20, 135, 101, 83, + 193, 126, 188, 222, 46, 156, 3, 1, 29, 134, 166, 243, 219, 231, 220, 56, + 113, 169, 137, 42, 28, 59, 49, 151, 158, 168, 74, 168, 253, 216, 241, 13, + 151, 241, 31, 152, 107, 73, 233, 187, 242, 135, 239, 255, 80, 10, 75, 63, + 44, 134, 159, 87, 175, 74, 94, 81, 99, 173, 131, 56, 46, 87, 59, 133, + 227, 50, 233, 69, 25, 210, 21, 59, 160, 144, 246, 114, 251, 83, 126, 252, + 164, 165, 184, 218, 82, 149, 14, 112, 210, 20, 169, 145, 169, 190, 236, 141, + 45, 127, 221, 132, 174, 109, 137, 59, 176, 203, 87, 123, 58, 48, 118, 3, + 105, 59, 197, 94, 210, 196, 149, 241, 102, 189, 192, 92, 209, 156, 103, 203, + 186, 166, 215, 65, 49, 157, 123, 70, 83, 58, 230, 142, 77, 136, 151, 130, + 116, 0, 132, 131, 124, 160, 35, 17, 173, 0, 125, 90, 16, 15, 254, 111, + 52, 135, 108, 229, 202, 198, 243, 17, 36, 132, 163, 3, 22, 93, 197, 125, + 46, 197, 199, 79, 147, 142, 203, 55, 149, 199, 36, 153, 242, 130, 84, 246, + 180, 246, 59, 107, 32, 243, 207, 141, 86, 67, 150, 18, 79, 244, 3, 51, + 214, 80, 151, 71, 69, 69, 221, 238, 137, 106, 145, 36, 233, 8, 81, 120, + 164, 58, 219, 163, 213, 217, 125, 115, 117, 158, 175, 143, 150, 75, 54, 126, + 209, 148, 186, 102, 133, 250, 180, 170, 125, 220, 125, 227, 184, 133, 51, 215, + 250, 153, 137, 98, 238, 243, 17, 46, 167, 112, 122, 8, 251, 55, 139, 249, + 90, 89, 151, 66, 154, 51, 26, 223, 175, 39, 105, 183, 146, 153, 57, 56, + 48, 179, 176, 216, 155, 36, 62, 61, 51, 237, 156, 242, 146, 46, 219, 157, + 112, 145, 116, 92, 44, 152, 114, 205, 110, 110, 210, 153, 153, 198, 135, 222, + 159, 230, 112, 109, 190, 184, 93, 168, 249, 230, 130, 174, 208, 65, 182, 173, + 108, 83, 181, 179, 244, 102, 183, 96, 114, 185, 109, 225, 73, 100, 157, 230, + 4, 113, 232, 115, 245, 180, 109, 134, 59, 161, 58, 185, 9, 21, 196, 114, + 216, 81, 51, 6, 78, 115, 112, 100, 50, 220, 19, 101, 98, 230, 206, 99, + 147, 189, 238, 114, 143, 118, 50, 61, 218, 193, 208, 123, 200, 247, 38, 106, + 103, 251, 49, 37, 110, 17, 192, 123, 237, 121, 119, 157, 186, 68, 201, 235, + 34, 179, 206, 125, 229, 213, 156, 222, 153, 183, 63, 176, 181, 71, 41, 23, + 53, 166, 168, 85, 203, 220, 255, 168, 11, 73, 225, 241, 139, 104, 70, 0, + 247, 145, 187, 48, 240, 146, 119, 92, 37, 174, 253, 39, 113, 163, 166, 163, + 56, 136, 22, 84, 2, 125, 84, 204, 253, 79, 165, 159, 74, 194, 221, 187, + 250, 204, 218, 198, 164, 229, 107, 70, 94, 244, 103, 155, 146, 44, 229, 44, + 82, 169, 226, 154, 162, 57, 147, 88, 34, 178, 228, 254, 129, 182, 199, 190, + 67, 42, 103, 74, 168, 16, 92, 18, 210, 86, 167, 34, 225, 166, 144, 95, + 185, 206, 171, 43, 51, 22, 45, 37, 142, 10, 171, 210, 51, 2, 13, 31, + 204, 143, 192, 121, 24, 1, 213, 58, 123, 181, 253, 239, 124, 2, 117, 171, + 80, 134, 199, 195, 197, 221, 116, 77, 101, 134, 70, 9, 250, 127, 254, 47, + 83, 138, 3, 23, 68, 49, 213, 17, 219, 189, 34, 206, 94, 18, 218, 204, + 147, 10, 173, 109, 227, 155, 233, 124, 60, 170, 30, 241, 67, 152, 81, 18, + 117, 40, 199, 18, 47, 190, 42, 192, 165, 57, 222, 188, 52, 93, 255, 255, + 225, 88, 56, 28, 225, 36, 58, 69, 40, 71, 47, 61, 86, 90, 233, 178, + 248, 207, 239, 147, 167, 155, 120, 51, 173, 224, 176, 81, 61, 168, 59, 66, + 185, 102, 244, 234, 214, 123, 139, 136, 186, 38, 39, 237, 106, 198, 242, 146, + 85, 191, 231, 108, 11, 244, 212, 19, 95, 131, 115, 245, 194, 126, 6, 157, + 123, 16, 216, 199, 52, 98, 229, 205, 167, 27, 198, 181, 201, 65, 158, 218, + 230, 201, 248, 248, 81, 30, 52, 0, 8, 103, 144, 214, 4, 113, 91, 205, + 164, 11, 70, 178, 203, 161, 140, 241, 173, 154, 138, 34, 248, 227, 22, 32, + 158, 241, 217, 24, 135, 154, 88, 133, 213, 235, 158, 69, 159, 126, 22, 180, + 218, 70, 126, 6, 93, 95, 149, 188, 125, 77, 205, 166, 127, 72, 224, 148, + 156, 199, 76, 173, 188, 238, 85, 67, 201, 89, 69, 146, 151, 115, 221, 62, + 134, 234, 214, 64, 104, 54, 140, 206, 169, 89, 148, 111, 11, 240, 205, 216, + 222, 197, 176, 222, 81, 251, 5, 176, 222, 81, 59, 7, 235, 221, 126, 1, + 129, 218, 207, 193, 115, 31, 65, 220, 246, 21, 58, 98, 229, 245, 41, 37, + 124, 0, 151, 175, 208, 17, 17, 18, 113, 136, 184, 115, 32, 74, 25, 108, + 63, 65, 211, 251, 46, 31, 12, 240, 192, 223, 231, 131, 227, 106, 1, 104, + 29, 50, 247, 159, 197, 136, 47, 194, 170, 163, 177, 3, 232, 111, 44, 34, + 128, 175, 173, 126, 107, 155, 114, 64, 146, 10, 2, 82, 37, 138, 170, 6, + 2, 82, 37, 194, 33, 72, 0, 115, 239, 239, 5, 24, 255, 165, 16, 136, + 126, 10, 112, 54, 61, 149, 116, 131, 218, 170, 65, 111, 255, 185, 13, 202, + 161, 103, 42, 144, 75, 149, 40, 174, 26, 144, 75, 149, 40, 22, 42, 188, + 21, 42, 244, 138, 168, 240, 214, 130, 17, 102, 177, 32, 21, 74, 34, 17, + 36, 106, 41, 138, 68, 173, 99, 36, 233, 40, 146, 68, 241, 255, 1, 52, + 201, 162, 142, 250, 10, 9, 84, 37, 106, 87, 13, 18, 168, 74, 212, 22, + 66, 2, 229, 20, 148, 60, 43, 156, 33, 177, 139, 235, 120, 140, 154, 26, + 38, 19, 84, 213, 158, 14, 162, 118, 17, 85, 143, 1, 114, 255, 243, 72, + 121, 47, 19, 29, 160, 156, 245, 132, 114, 80, 200, 199, 84, 28, 189, 238, + 229, 245, 63, 105, 185, 233, 90, 90, 202, 126, 116, 28, 73, 187, 120, 225, + 249, 70, 40, 76, 11, 113, 121, 247, 160, 239, 93, 218, 74, 127, 8, 30, + 3, 193, 44, 12, 46, 91, 136, 176, 79, 89, 114, 233, 115, 161, 226, 99, + 21, 115, 102, 238, 78, 34, 125, 35, 18, 231, 92, 172, 70, 23, 249, 176, + 248, 162, 64, 23, 155, 51, 253, 7, 21, 82, 84, 109, 228, 198, 67, 213, + 8, 154, 34, 124, 225, 152, 169, 23, 60, 169, 22, 186, 93, 141, 105, 34, + 28, 81, 92, 195, 173, 213, 11, 116, 87, 44, 125, 50, 46, 86, 99, 237, + 98, 53, 138, 233, 37, 239, 98, 149, 170, 90, 116, 112, 68, 118, 206, 69, + 198, 52, 101, 72, 146, 177, 48, 193, 125, 36, 46, 35, 89, 207, 63, 104, + 215, 130, 14, 216, 40, 17, 172, 126, 17, 229, 142, 149, 249, 159, 130, 78, + 13, 215, 133, 184, 192, 83, 183, 145, 245, 125, 19, 198, 207, 162, 61, 37, + 190, 91, 229, 14, 79, 25, 124, 11, 162, 17, 68, 207, 176, 139, 96, 175, + 174, 230, 230, 146, 149, 90, 40, 12, 95, 113, 3, 105, 180, 245, 22, 171, + 75, 168, 22, 183, 175, 32, 181, 17, 21, 111, 92, 165, 182, 69, 131, 154, + 24, 216, 58, 255, 141, 32, 193, 160, 183, 218, 37, 174, 27, 154, 206, 157, + 101, 129, 213, 194, 206, 250, 10, 134, 57, 69, 141, 15, 189, 117, 101, 121, + 14, 179, 71, 20, 161, 204, 45, 118, 101, 243, 133, 45, 250, 83, 117, 168, + 215, 185, 114, 244, 78, 181, 240, 47, 149, 141, 69, 87, 42, 80, 215, 21, + 223, 235, 68, 83, 254, 150, 49, 248, 80, 86, 233, 158, 117, 91, 169, 238, + 44, 141, 131, 195, 253, 165, 85, 193, 233, 26, 167, 198, 234, 222, 146, 187, + 221, 76, 57, 90, 57, 95, 0, 252, 88, 48, 173, 84, 194, 175, 116, 123, + 235, 122, 189, 61, 184, 165, 183, 180, 185, 40, 60, 66, 127, 171, 15, 92, + 183, 53, 5, 227, 93, 87, 249, 75, 120, 142, 98, 136, 219, 125, 217, 216, + 198, 168, 128, 97, 195, 91, 24, 37, 9, 128, 227, 17, 248, 70, 93, 190, + 166, 189, 224, 239, 58, 74, 214, 63, 226, 34, 28, 199, 221, 212, 169, 60, + 239, 29, 87, 244, 67, 239, 7, 203, 193, 108, 70, 17, 239, 167, 247, 227, + 17, 125, 45, 240, 15, 106, 15, 190, 131, 249, 20, 27, 37, 43, 222, 64, + 76, 138, 211, 175, 210, 46, 127, 180, 53, 209, 15, 14, 249, 108, 165, 210, + 234, 169, 71, 139, 207, 95, 97, 230, 129, 124, 21, 244, 6, 240, 8, 229, + 9, 18, 119, 22, 89, 90, 193, 173, 70, 217, 197, 39, 138, 231, 188, 113, + 68, 37, 160, 53, 58, 110, 16, 211, 170, 196, 88, 84, 24, 209, 71, 37, + 213, 143, 69, 233, 118, 143, 123, 39, 157, 242, 40, 46, 77, 237, 13, 55, + 215, 160, 69, 205, 193, 204, 205, 93, 9, 108, 199, 211, 229, 72, 195, 223, + 25, 37, 152, 2, 39, 209, 28, 241, 5, 246, 143, 54, 151, 227, 34, 15, + 71, 13, 166, 157, 222, 83, 116, 117, 58, 103, 47, 218, 81, 108, 237, 205, + 150, 209, 142, 11, 182, 10, 183, 242, 69, 90, 44, 0, 240, 116, 68, 128, + 126, 89, 110, 89, 163, 102, 47, 58, 107, 181, 219, 111, 223, 158, 123, 177, + 223, 240, 43, 152, 216, 184, 226, 251, 177, 182, 199, 85, 143, 188, 54, 220, + 215, 61, 127, 125, 180, 175, 13, 247, 245, 145, 95, 119, 246, 181, 206, 175, + 213, 82, 25, 198, 231, 157, 230, 169, 243, 227, 254, 19, 203, 249, 32, 202, + 8, 154, 121, 90, 114, 219, 140, 104, 140, 245, 229, 215, 203, 197, 204, 255, + 211, 108, 177, 85, 161, 131, 123, 71, 84, 57, 128, 111, 219, 190, 30, 254, + 68, 125, 124, 245, 250, 183, 119, 211, 97, 127, 149, 148, 130, 223, 150, 124, + 22, 140, 164, 227, 209, 102, 93, 43, 153, 236, 82, 95, 222, 249, 165, 161, + 92, 118, 151, 76, 79, 138, 3, 93, 119, 97, 149, 219, 112, 162, 246, 120, + 48, 156, 228, 20, 236, 101, 101, 8, 253, 235, 189, 153, 152, 211, 71, 232, + 139, 79, 215, 80, 41, 244, 41, 68, 193, 45, 104, 76, 172, 233, 170, 200, + 46, 123, 112, 159, 6, 216, 180, 11, 72, 93, 38, 9, 110, 104, 213, 211, + 62, 219, 144, 146, 104, 245, 149, 188, 108, 3, 11, 168, 19, 180, 132, 34, + 89, 50, 57, 174, 84, 133, 6, 67, 163, 7, 80, 43, 163, 249, 166, 37, + 165, 64, 229, 90, 2, 16, 149, 206, 64, 235, 201, 211, 215, 225, 253, 134, + 190, 193, 21, 248, 96, 164, 33, 102, 95, 9, 92, 11, 203, 180, 80, 126, + 213, 187, 243, 75, 125, 238, 223, 172, 201, 72, 80, 99, 60, 149, 87, 254, + 103, 172, 8, 70, 234, 101, 13, 52, 88, 189, 23, 96, 10, 193, 171, 80, + 74, 171, 30, 60, 85, 221, 85, 66, 125, 115, 159, 152, 76, 63, 250, 230, + 67, 160, 159, 130, 39, 138, 114, 160, 194, 169, 56, 218, 164, 223, 5, 31, + 175, 56, 81, 40, 235, 139, 33, 137, 73, 224, 109, 238, 48, 172, 32, 213, + 210, 3, 105, 120, 116, 96, 106, 107, 137, 21, 143, 208, 225, 11, 134, 168, + 73, 113, 124, 172, 218, 40, 255, 172, 65, 171, 10, 52, 101, 168, 60, 212, + 78, 56, 157, 143, 198, 216, 195, 198, 243, 245, 108, 95, 56, 156, 135, 199, + 198, 243, 209, 182, 23, 15, 98, 167, 229, 47, 31, 205, 110, 162, 23, 12, + 107, 19, 155, 26, 249, 109, 67, 252, 35, 60, 189, 219, 49, 183, 10, 46, + 192, 110, 133, 43, 197, 37, 173, 252, 33, 86, 43, 92, 248, 120, 54, 214, + 0, 227, 143, 162, 213, 105, 64, 6, 23, 184, 37, 132, 205, 139, 179, 199, + 13, 238, 23, 199, 135, 217, 226, 97, 188, 156, 209, 178, 129, 81, 182, 240, + 83, 48, 51, 173, 172, 22, 86, 155, 130, 68, 11, 171, 205, 90, 87, 95, + 28, 145, 42, 115, 185, 162, 162, 44, 27, 22, 3, 240, 72, 76, 103, 92, + 134, 42, 12, 218, 228, 116, 22, 83, 84, 98, 245, 59, 6, 210, 131, 14, + 247, 47, 126, 76, 255, 58, 244, 239, 12, 239, 61, 199, 110, 234, 215, 28, + 205, 48, 196, 183, 85, 40, 219, 209, 44, 53, 188, 31, 243, 121, 171, 145, + 85, 224, 115, 198, 241, 34, 227, 64, 219, 201, 205, 191, 219, 172, 214, 98, + 91, 117, 191, 216, 142, 151, 168, 89, 252, 204, 105, 86, 21, 154, 180, 202, + 161, 147, 77, 70, 113, 216, 89, 248, 143, 245, 137, 92, 38, 250, 93, 86, + 207, 160, 254, 137, 178, 83, 198, 246, 201, 63, 54, 40, 120, 118, 57, 3, + 224, 216, 40, 249, 186, 114, 62, 138, 35, 136, 118, 8, 149, 158, 72, 221, + 58, 192, 68, 215, 44, 230, 48, 95, 138, 127, 70, 234, 217, 226, 54, 174, + 96, 169, 143, 122, 64, 28, 175, 86, 15, 217, 249, 108, 187, 220, 25, 42, + 124, 29, 139, 139, 172, 244, 100, 86, 28, 148, 174, 182, 82, 255, 133, 50, + 149, 51, 149, 251, 212, 202, 69, 127, 188, 27, 142, 239, 5, 199, 162, 196, + 91, 21, 183, 48, 162, 166, 242, 222, 244, 42, 137, 0, 235, 213, 242, 179, + 177, 127, 178, 250, 115, 71, 230, 43, 12, 98, 179, 67, 155, 235, 139, 85, + 232, 86, 148, 68, 61, 23, 69, 83, 216, 135, 213, 122, 48, 252, 220, 148, + 171, 165, 28, 163, 127, 164, 99, 104, 141, 145, 254, 139, 29, 246, 25, 123, + 153, 52, 230, 88, 50, 106, 165, 23, 68, 246, 10, 42, 211, 198, 170, 213, + 23, 140, 192, 210, 102, 62, 51, 56, 112, 113, 198, 177, 32, 30, 111, 47, + 146, 137, 183, 120, 216, 105, 229, 106, 118, 11, 82, 178, 126, 65, 248, 194, + 46, 220, 214, 196, 156, 134, 134, 195, 54, 166, 33, 67, 163, 97, 123, 2, + 156, 140, 250, 35, 91, 41, 4, 219, 184, 17, 80, 46, 7, 81, 185, 224, + 64, 8, 38, 182, 113, 29, 193, 24, 175, 150, 65, 98, 108, 192, 32, 210, + 45, 103, 94, 162, 20, 82, 112, 148, 15, 254, 71, 26, 174, 107, 209, 194, + 45, 153, 84, 143, 106, 134, 66, 232, 81, 129, 201, 209, 33, 137, 173, 202, + 22, 15, 251, 231, 41, 48, 177, 20, 152, 40, 10, 76, 132, 2, 250, 96, + 245, 20, 76, 152, 8, 123, 69, 4, 115, 246, 10, 241, 5, 116, 216, 255, + 215, 208, 193, 169, 72, 11, 119, 132, 82, 73, 169, 159, 80, 99, 175, 169, + 177, 247, 142, 15, 152, 142, 12, 24, 44, 20, 0, 206, 58, 209, 8, 90, + 23, 73, 251, 248, 24, 43, 29, 253, 242, 19, 205, 134, 159, 48, 29, 100, + 74, 72, 39, 124, 235, 48, 252, 7, 186, 47, 59, 128, 91, 162, 230, 225, + 246, 153, 95, 127, 180, 29, 169, 186, 216, 29, 219, 98, 13, 150, 203, 41, + 51, 32, 82, 83, 35, 61, 57, 126, 141, 17, 130, 224, 184, 56, 184, 253, + 159, 50, 175, 210, 51, 43, 61, 182, 236, 52, 211, 228, 140, 236, 87, 202, + 32, 70, 6, 60, 240, 158, 98, 39, 15, 69, 161, 182, 74, 107, 70, 166, + 16, 120, 192, 158, 58, 24, 113, 37, 10, 99, 126, 120, 118, 192, 158, 129, + 75, 253, 218, 129, 217, 201, 12, 204, 99, 203, 114, 239, 91, 50, 63, 203, + 100, 174, 152, 184, 117, 142, 177, 92, 79, 103, 99, 62, 179, 172, 211, 251, + 121, 212, 122, 99, 204, 52, 219, 169, 183, 78, 234, 173, 107, 119, 254, 224, + 169, 231, 190, 156, 154, 23, 79, 243, 4, 103, 73, 164, 120, 130, 51, 29, + 237, 12, 248, 188, 71, 57, 83, 174, 221, 113, 118, 84, 62, 187, 60, 40, + 7, 137, 23, 4, 226, 67, 161, 153, 198, 1, 162, 65, 230, 134, 176, 158, + 150, 10, 80, 52, 179, 201, 18, 39, 208, 38, 117, 67, 77, 114, 70, 229, + 196, 114, 48, 88, 238, 251, 195, 197, 124, 52, 101, 111, 34, 204, 246, 142, + 166, 203, 233, 112, 50, 27, 175, 217, 84, 112, 62, 222, 80, 29, 5, 126, + 153, 86, 140, 233, 2, 82, 60, 216, 9, 170, 243, 253, 203, 89, 97, 52, + 192, 175, 204, 81, 177, 235, 197, 114, 178, 88, 140, 170, 71, 217, 227, 241, + 3, 173, 76, 27, 26, 27, 251, 20, 23, 116, 15, 78, 153, 201, 87, 196, + 254, 174, 159, 55, 124, 51, 36, 78, 28, 226, 38, 150, 172, 24, 32, 196, + 236, 166, 200, 154, 164, 233, 153, 164, 8, 105, 108, 27, 139, 40, 25, 29, + 99, 148, 199, 127, 167, 118, 17, 199, 132, 69, 34, 238, 246, 52, 231, 204, + 173, 98, 213, 121, 29, 1, 95, 137, 95, 238, 241, 127, 26, 252, 208, 75, + 15, 161, 255, 141, 134, 254, 17, 254, 91, 213, 244, 248, 201, 86, 152, 223, + 32, 222, 5, 237, 93, 208, 145, 222, 53, 103, 91, 99, 67, 163, 8, 143, + 75, 38, 118, 102, 16, 156, 86, 21, 63, 44, 240, 6, 81, 61, 56, 11, + 205, 200, 13, 213, 168, 13, 245, 136, 13, 101, 180, 150, 24, 152, 90, 58, + 203, 183, 157, 85, 32, 141, 190, 222, 38, 79, 80, 72, 87, 12, 127, 110, + 195, 252, 45, 182, 218, 119, 180, 97, 82, 215, 108, 105, 155, 188, 158, 60, + 19, 191, 77, 241, 105, 131, 109, 191, 11, 88, 51, 101, 130, 248, 163, 103, + 226, 119, 40, 254, 168, 22, 116, 222, 5, 172, 225, 51, 194, 6, 190, 53, + 214, 125, 233, 184, 93, 138, 27, 92, 83, 109, 186, 239, 130, 46, 34, 78, + 142, 68, 236, 113, 68, 170, 70, 239, 93, 208, 67, 196, 209, 145, 136, 167, + 28, 145, 202, 63, 125, 71, 84, 62, 120, 43, 69, 10, 42, 133, 182, 161, + 45, 110, 50, 174, 209, 228, 213, 68, 135, 79, 40, 124, 194, 225, 104, 218, + 106, 164, 195, 71, 20, 62, 226, 112, 52, 33, 99, 101, 243, 180, 170, 71, + 130, 35, 187, 216, 94, 40, 232, 106, 202, 198, 62, 142, 104, 196, 194, 57, + 10, 149, 22, 42, 55, 77, 215, 19, 254, 203, 57, 122, 137, 111, 102, 5, + 254, 249, 6, 34, 60, 242, 78, 152, 211, 128, 65, 24, 37, 62, 248, 39, + 12, 20, 42, 175, 19, 188, 198, 230, 117, 68, 245, 253, 251, 210, 175, 225, + 22, 110, 188, 187, 247, 151, 62, 138, 67, 65, 244, 141, 10, 171, 57, 16, + 200, 169, 47, 130, 139, 224, 6, 65, 77, 13, 135, 175, 62, 111, 74, 196, + 80, 124, 110, 82, 118, 37, 55, 10, 227, 192, 132, 45, 173, 76, 102, 45, + 52, 104, 28, 1, 198, 164, 170, 116, 169, 30, 69, 109, 234, 241, 253, 232, + 53, 254, 212, 105, 154, 173, 104, 155, 144, 143, 123, 249, 184, 127, 63, 193, + 199, 61, 127, 156, 232, 143, 59, 249, 184, 123, 191, 197, 199, 29, 127, 220, + 210, 71, 182, 111, 144, 178, 90, 202, 192, 157, 77, 234, 194, 224, 172, 106, + 46, 213, 56, 4, 55, 248, 155, 121, 165, 140, 118, 52, 203, 244, 118, 77, + 135, 205, 207, 226, 4, 213, 24, 117, 68, 161, 228, 213, 136, 170, 42, 55, + 149, 58, 92, 189, 102, 128, 87, 213, 26, 29, 27, 175, 42, 34, 34, 72, + 84, 6, 90, 63, 247, 170, 248, 63, 43, 7, 168, 123, 126, 5, 175, 1, + 90, 89, 77, 242, 207, 77, 62, 12, 82, 165, 114, 183, 43, 122, 161, 185, + 27, 47, 54, 235, 236, 190, 202, 129, 188, 175, 205, 23, 190, 142, 243, 139, + 127, 209, 74, 178, 10, 172, 234, 91, 133, 29, 22, 96, 113, 88, 85, 115, + 187, 219, 192, 44, 92, 2, 86, 164, 83, 165, 17, 113, 30, 6, 203, 41, + 99, 74, 151, 3, 96, 2, 168, 56, 12, 135, 83, 166, 229, 142, 198, 188, + 46, 108, 49, 28, 110, 150, 208, 113, 45, 211, 94, 178, 160, 173, 112, 185, + 157, 174, 198, 199, 239, 116, 116, 123, 226, 22, 139, 210, 210, 237, 118, 54, + 131, 184, 37, 22, 139, 108, 228, 5, 143, 61, 95, 88, 126, 211, 139, 173, + 165, 20, 173, 140, 116, 184, 118, 26, 145, 180, 50, 248, 198, 47, 201, 111, + 96, 219, 43, 70, 103, 66, 94, 113, 126, 228, 87, 202, 193, 73, 185, 234, + 79, 105, 217, 152, 174, 14, 12, 64, 14, 212, 177, 153, 87, 95, 173, 23, + 203, 177, 63, 157, 211, 42, 61, 152, 121, 253, 62, 250, 60, 160, 120, 144, + 100, 216, 42, 113, 136, 115, 40, 0, 43, 207, 81, 75, 244, 165, 148, 68, + 204, 226, 95, 209, 128, 97, 105, 200, 47, 141, 82, 240, 75, 233, 130, 106, + 225, 230, 161, 162, 10, 111, 47, 90, 177, 2, 228, 238, 228, 228, 243, 68, + 128, 112, 127, 59, 152, 202, 61, 245, 118, 2, 158, 70, 31, 25, 22, 243, + 155, 193, 116, 70, 3, 217, 15, 76, 157, 83, 148, 99, 208, 236, 76, 213, + 15, 190, 27, 39, 178, 167, 139, 110, 206, 188, 241, 199, 41, 92, 38, 96, + 136, 90, 26, 86, 89, 6, 238, 146, 159, 168, 202, 171, 213, 51, 25, 209, + 16, 57, 120, 10, 221, 221, 222, 19, 200, 240, 121, 103, 247, 197, 44, 114, + 5, 6, 33, 251, 110, 115, 88, 60, 29, 149, 193, 170, 5, 236, 8, 70, + 151, 66, 199, 187, 241, 106, 5, 113, 16, 181, 123, 172, 18, 143, 48, 9, + 110, 6, 51, 119, 144, 127, 127, 227, 151, 105, 237, 93, 82, 108, 6, 175, + 152, 174, 104, 4, 194, 6, 227, 110, 64, 131, 199, 126, 97, 219, 100, 250, + 184, 28, 223, 14, 150, 35, 248, 80, 3, 34, 192, 13, 117, 193, 28, 206, + 36, 88, 243, 28, 109, 0, 31, 121, 131, 184, 227, 29, 109, 9, 134, 85, + 228, 111, 114, 9, 11, 207, 39, 155, 217, 76, 78, 124, 71, 161, 58, 254, + 192, 4, 97, 235, 81, 56, 169, 200, 96, 203, 43, 140, 14, 117, 161, 29, + 62, 75, 1, 147, 37, 213, 11, 34, 246, 98, 182, 215, 54, 92, 44, 86, + 179, 133, 88, 138, 253, 137, 42, 111, 245, 193, 85, 207, 81, 234, 213, 140, + 69, 187, 215, 52, 70, 238, 22, 75, 109, 174, 253, 204, 122, 146, 38, 132, + 229, 89, 249, 189, 175, 154, 147, 33, 8, 181, 97, 96, 90, 10, 39, 118, + 15, 52, 234, 177, 220, 133, 10, 220, 102, 185, 216, 90, 10, 56, 139, 90, + 42, 83, 17, 150, 188, 122, 170, 133, 155, 131, 29, 171, 237, 220, 88, 253, + 184, 176, 84, 213, 5, 137, 213, 174, 170, 169, 6, 150, 74, 247, 221, 119, + 11, 12, 52, 40, 46, 16, 173, 105, 141, 93, 130, 181, 41, 11, 151, 215, + 108, 54, 49, 169, 217, 44, 103, 65, 47, 60, 139, 203, 128, 89, 41, 195, + 105, 13, 224, 15, 49, 51, 240, 88, 246, 175, 233, 239, 231, 98, 86, 222, + 122, 26, 229, 219, 160, 8, 148, 129, 139, 10, 23, 236, 10, 198, 11, 80, + 139, 136, 90, 238, 142, 37, 43, 73, 186, 198, 191, 231, 176, 127, 118, 85, + 205, 154, 86, 88, 207, 209, 34, 139, 93, 178, 30, 44, 49, 64, 83, 181, + 121, 166, 220, 217, 230, 110, 58, 103, 166, 108, 74, 171, 251, 160, 30, 227, + 142, 137, 198, 253, 154, 113, 181, 53, 84, 203, 27, 251, 164, 150, 212, 233, + 224, 125, 48, 53, 149, 152, 103, 123, 247, 191, 193, 89, 161, 166, 209, 201, + 13, 180, 50, 132, 78, 82, 23, 25, 136, 183, 60, 4, 6, 171, 213, 98, + 56, 229, 149, 199, 137, 95, 246, 25, 96, 69, 22, 21, 172, 21, 176, 231, + 103, 37, 182, 229, 248, 110, 48, 53, 90, 21, 188, 9, 28, 95, 18, 13, + 57, 16, 143, 234, 112, 137, 149, 247, 138, 30, 110, 166, 170, 42, 200, 157, + 102, 225, 195, 116, 177, 89, 193, 140, 174, 76, 155, 135, 204, 114, 58, 208, + 240, 34, 106, 50, 19, 123, 13, 32, 245, 220, 20, 46, 177, 147, 197, 108, + 100, 237, 212, 202, 230, 3, 47, 152, 178, 88, 82, 221, 215, 12, 114, 235, + 46, 154, 219, 201, 2, 219, 129, 44, 192, 202, 98, 70, 64, 123, 150, 227, + 181, 172, 162, 96, 143, 120, 81, 166, 117, 144, 39, 108, 178, 94, 210, 240, + 61, 52, 45, 29, 86, 185, 62, 216, 141, 137, 203, 167, 49, 190, 152, 209, + 170, 131, 131, 185, 190, 129, 206, 183, 25, 227, 21, 36, 42, 59, 135, 46, + 31, 155, 165, 53, 217, 185, 153, 22, 247, 177, 166, 235, 244, 230, 170, 144, + 192, 5, 130, 0, 250, 230, 92, 131, 49, 183, 104, 229, 71, 102, 186, 164, + 81, 123, 116, 112, 113, 37, 190, 56, 215, 42, 110, 246, 86, 12, 33, 75, + 224, 59, 179, 17, 166, 51, 255, 180, 132, 175, 91, 219, 213, 233, 77, 147, + 58, 138, 247, 8, 58, 211, 208, 113, 85, 127, 173, 172, 214, 35, 122, 146, + 195, 47, 237, 111, 107, 167, 43, 151, 161, 47, 114, 72, 119, 187, 145, 100, + 212, 229, 195, 193, 6, 152, 223, 215, 96, 98, 203, 194, 170, 148, 117, 151, + 217, 134, 232, 197, 87, 182, 38, 140, 150, 10, 214, 251, 249, 190, 42, 53, + 89, 49, 191, 161, 86, 100, 12, 79, 92, 73, 243, 117, 15, 238, 38, 49, + 177, 167, 243, 213, 122, 60, 24, 153, 35, 60, 174, 223, 217, 156, 72, 211, + 228, 129, 169, 108, 71, 232, 151, 217, 140, 12, 31, 96, 107, 219, 0, 239, + 64, 220, 234, 48, 87, 107, 108, 134, 58, 125, 40, 80, 38, 182, 64, 250, + 104, 249, 145, 5, 86, 39, 36, 158, 174, 49, 251, 87, 216, 30, 145, 154, + 154, 66, 29, 74, 77, 91, 111, 86, 153, 18, 95, 84, 92, 106, 190, 205, + 22, 11, 92, 223, 66, 138, 145, 67, 98, 193, 42, 66, 101, 232, 221, 255, + 110, 49, 226, 108, 108, 153, 62, 159, 73, 214, 19, 228, 51, 88, 83, 63, + 19, 213, 87, 180, 219, 150, 81, 6, 207, 254, 213, 244, 110, 10, 71, 10, + 50, 250, 103, 51, 49, 239, 4, 171, 72, 203, 223, 244, 118, 62, 85, 72, + 176, 210, 33, 34, 18, 51, 131, 116, 231, 206, 14, 154, 212, 217, 153, 65, + 65, 138, 103, 162, 218, 95, 211, 90, 226, 64, 158, 153, 163, 214, 145, 197, + 97, 188, 163, 234, 206, 169, 195, 53, 201, 68, 41, 97, 224, 175, 246, 52, + 74, 238, 120, 248, 216, 134, 254, 40, 227, 29, 196, 224, 58, 162, 105, 107, + 24, 7, 170, 206, 96, 186, 242, 120, 30, 46, 70, 128, 239, 130, 71, 63, + 34, 36, 141, 105, 158, 42, 69, 121, 130, 185, 116, 170, 14, 229, 108, 25, + 13, 92, 65, 43, 165, 196, 26, 138, 133, 76, 56, 84, 34, 29, 148, 218, + 168, 243, 104, 190, 209, 203, 137, 76, 187, 130, 9, 191, 123, 206, 65, 69, + 170, 96, 179, 210, 241, 146, 240, 197, 45, 37, 183, 171, 29, 219, 217, 21, + 126, 169, 223, 142, 217, 79, 16, 251, 10, 10, 219, 254, 142, 142, 73, 40, + 42, 216, 189, 135, 115, 10, 78, 161, 61, 169, 4, 59, 250, 15, 210, 129, + 78, 106, 187, 127, 217, 94, 247, 165, 21, 249, 101, 27, 89, 243, 159, 188, + 147, 21, 18, 15, 91, 255, 224, 125, 175, 3, 205, 96, 31, 50, 36, 113, + 39, 52, 120, 15, 8, 116, 132, 197, 93, 39, 236, 109, 140, 53, 78, 133, + 81, 9, 120, 65, 34, 56, 209, 162, 193, 194, 232, 19, 170, 24, 119, 199, + 41, 218, 110, 138, 246, 26, 67, 96, 189, 219, 92, 202, 42, 125, 149, 223, + 120, 180, 62, 232, 49, 76, 39, 51, 58, 103, 199, 20, 155, 56, 183, 75, + 192, 218, 194, 196, 85, 70, 12, 128, 0, 228, 234, 10, 240, 182, 204, 40, + 118, 128, 65, 180, 188, 167, 41, 8, 52, 61, 179, 75, 22, 75, 182, 165, + 81, 26, 173, 79, 115, 148, 218, 141, 118, 62, 109, 160, 30, 161, 105, 139, + 69, 8, 122, 90, 187, 176, 63, 16, 151, 28, 232, 201, 205, 156, 7, 20, + 238, 33, 248, 33, 123, 66, 251, 51, 2, 105, 140, 171, 120, 206, 142, 193, + 89, 98, 248, 223, 209, 124, 156, 54, 68, 99, 130, 62, 220, 47, 23, 183, + 203, 193, 221, 93, 202, 187, 215, 239, 64, 142, 207, 38, 153, 2, 79, 148, + 76, 121, 135, 152, 237, 205, 26, 131, 147, 166, 228, 214, 244, 127, 71, 123, + 31, 39, 25, 11, 80, 181, 73, 65, 145, 149, 209, 114, 10, 162, 145, 154, + 87, 166, 15, 88, 145, 217, 18, 23, 25, 74, 145, 210, 116, 232, 111, 93, + 50, 245, 175, 142, 175, 41, 138, 60, 118, 61, 153, 47, 32, 0, 79, 19, + 230, 175, 43, 241, 188, 9, 76, 185, 213, 122, 113, 167, 151, 57, 152, 162, + 32, 122, 153, 38, 232, 108, 38, 53, 208, 43, 224, 122, 66, 221, 54, 101, + 63, 236, 183, 27, 198, 24, 132, 250, 167, 63, 25, 60, 140, 121, 99, 186, + 30, 211, 48, 216, 172, 28, 142, 245, 134, 120, 251, 217, 108, 47, 236, 246, + 138, 215, 231, 189, 209, 51, 178, 59, 236, 28, 102, 253, 83, 97, 103, 4, + 213, 0, 218, 224, 192, 112, 12, 253, 191, 33, 246, 128, 89, 70, 174, 11, + 215, 214, 20, 96, 170, 54, 248, 60, 198, 238, 104, 170, 198, 182, 58, 169, + 117, 158, 90, 44, 91, 164, 73, 179, 240, 183, 140, 130, 156, 165, 1, 142, + 24, 195, 9, 247, 242, 136, 198, 203, 104, 172, 164, 5, 82, 136, 45, 129, + 6, 15, 53, 91, 151, 32, 115, 241, 229, 60, 48, 195, 170, 153, 83, 48, + 56, 142, 249, 112, 177, 193, 98, 37, 61, 131, 214, 94, 47, 70, 123, 45, + 11, 248, 50, 143, 89, 180, 59, 98, 99, 52, 168, 145, 195, 5, 157, 29, + 87, 247, 11, 241, 111, 155, 226, 38, 143, 220, 69, 201, 140, 229, 153, 222, + 104, 235, 38, 26, 21, 222, 204, 140, 117, 84, 145, 251, 144, 128, 105, 157, + 48, 195, 4, 64, 210, 166, 30, 227, 82, 8, 91, 149, 98, 106, 229, 174, + 8, 87, 105, 197, 69, 190, 45, 228, 193, 75, 156, 208, 205, 152, 207, 195, + 106, 202, 89, 222, 89, 87, 70, 85, 130, 215, 169, 177, 81, 90, 54, 220, + 167, 187, 207, 184, 149, 78, 65, 164, 114, 95, 233, 147, 247, 120, 254, 48, + 93, 46, 230, 119, 242, 60, 18, 103, 187, 211, 187, 187, 241, 8, 167, 72, + 90, 9, 142, 193, 162, 102, 74, 56, 122, 3, 136, 37, 54, 173, 13, 141, + 144, 54, 17, 79, 40, 143, 77, 122, 88, 242, 28, 114, 91, 64, 29, 177, + 212, 18, 192, 15, 129, 251, 16, 104, 73, 252, 246, 248, 247, 148, 127, 207, + 248, 247, 45, 255, 70, 45, 249, 35, 169, 35, 73, 30, 73, 250, 72, 50, + 136, 40, 7, 17, 22, 195, 95, 232, 47, 191, 176, 167, 77, 249, 19, 251, + 70, 212, 171, 251, 175, 244, 20, 188, 110, 68, 135, 146, 237, 190, 178, 186, + 244, 43, 187, 29, 233, 200, 129, 141, 76, 50, 151, 85, 240, 58, 149, 77, + 237, 153, 28, 24, 117, 92, 107, 59, 151, 140, 238, 49, 175, 232, 192, 42, + 121, 231, 183, 222, 39, 220, 19, 239, 19, 8, 103, 223, 225, 78, 39, 239, + 133, 12, 67, 196, 164, 225, 117, 87, 79, 65, 61, 2, 232, 235, 16, 44, + 7, 77, 34, 189, 80, 185, 179, 208, 89, 99, 232, 145, 22, 196, 155, 205, + 76, 246, 8, 30, 71, 178, 194, 201, 23, 222, 9, 176, 8, 220, 93, 143, + 71, 60, 43, 33, 179, 39, 190, 198, 181, 220, 248, 187, 195, 43, 252, 125, + 51, 93, 103, 88, 5, 4, 101, 154, 241, 175, 8, 82, 229, 216, 211, 95, + 193, 246, 255, 119, 187, 253, 171, 109, 249, 157, 63, 191, 238, 91, 113, 71, + 216, 215, 119, 21, 125, 150, 161, 22, 113, 36, 229, 84, 138, 178, 43, 44, + 89, 220, 88, 49, 204, 49, 102, 53, 151, 252, 25, 22, 79, 246, 160, 45, + 157, 96, 82, 59, 200, 49, 207, 15, 112, 213, 177, 183, 42, 249, 225, 220, + 103, 147, 186, 203, 96, 126, 229, 7, 239, 213, 165, 86, 172, 108, 191, 196, + 140, 105, 95, 152, 21, 157, 185, 96, 144, 18, 235, 188, 58, 242, 77, 153, + 246, 100, 92, 106, 118, 10, 92, 115, 118, 92, 54, 218, 97, 109, 228, 136, + 146, 33, 171, 242, 68, 206, 144, 66, 122, 204, 165, 183, 40, 211, 105, 71, + 7, 247, 47, 24, 220, 191, 56, 87, 93, 250, 51, 96, 53, 57, 138, 19, + 50, 216, 113, 200, 63, 62, 13, 252, 202, 114, 12, 160, 231, 7, 172, 131, + 235, 133, 201, 80, 75, 123, 102, 204, 247, 0, 90, 197, 230, 205, 247, 237, + 171, 106, 136, 253, 148, 165, 5, 204, 70, 229, 180, 68, 176, 139, 153, 252, + 236, 231, 76, 54, 77, 207, 37, 137, 193, 64, 82, 30, 73, 21, 184, 74, + 95, 71, 233, 171, 178, 253, 108, 72, 194, 90, 87, 16, 34, 223, 37, 240, + 105, 93, 105, 196, 97, 62, 217, 193, 255, 160, 190, 70, 69, 95, 121, 189, + 124, 77, 43, 228, 111, 126, 243, 202, 192, 159, 188, 6, 170, 172, 230, 159, + 26, 23, 76, 106, 219, 134, 1, 220, 131, 234, 53, 16, 159, 52, 57, 179, + 93, 65, 147, 55, 136, 222, 0, 147, 69, 135, 179, 26, 114, 244, 94, 46, + 87, 161, 99, 76, 61, 44, 200, 142, 193, 93, 189, 18, 124, 104, 4, 119, + 213, 26, 165, 17, 181, 227, 153, 170, 91, 155, 42, 212, 118, 120, 26, 170, + 209, 31, 216, 136, 192, 189, 197, 180, 212, 214, 68, 134, 35, 20, 182, 89, + 33, 178, 52, 216, 251, 27, 81, 130, 65, 13, 85, 128, 109, 69, 42, 59, + 139, 44, 149, 233, 55, 255, 178, 20, 204, 239, 194, 96, 254, 161, 116, 229, + 182, 42, 184, 203, 247, 77, 142, 212, 225, 19, 53, 145, 146, 215, 84, 51, + 79, 168, 237, 7, 21, 248, 33, 21, 136, 155, 107, 49, 92, 176, 37, 124, + 240, 95, 52, 34, 158, 254, 5, 13, 98, 103, 21, 153, 251, 179, 252, 157, + 196, 247, 10, 82, 212, 116, 52, 54, 46, 217, 161, 212, 188, 221, 96, 206, + 151, 210, 204, 174, 53, 129, 249, 129, 62, 91, 162, 167, 99, 101, 118, 26, + 224, 32, 97, 107, 81, 219, 12, 239, 48, 188, 177, 240, 234, 49, 160, 5, + 143, 248, 120, 98, 153, 154, 183, 188, 226, 15, 30, 4, 171, 119, 12, 169, + 220, 230, 122, 181, 158, 174, 55, 178, 84, 211, 199, 9, 175, 129, 204, 89, + 169, 138, 55, 153, 96, 239, 188, 160, 166, 74, 229, 25, 245, 14, 75, 252, + 93, 102, 209, 250, 227, 2, 220, 240, 4, 171, 1, 174, 151, 56, 162, 109, + 3, 18, 232, 154, 111, 156, 253, 76, 248, 213, 44, 66, 186, 48, 177, 239, + 212, 67, 95, 192, 253, 142, 108, 213, 122, 53, 82, 130, 56, 57, 217, 192, + 109, 51, 175, 51, 68, 1, 89, 98, 145, 129, 112, 197, 138, 48, 218, 183, + 97, 193, 174, 184, 57, 118, 40, 214, 195, 184, 116, 179, 192, 197, 199, 166, + 149, 252, 113, 176, 252, 236, 111, 162, 228, 247, 75, 118, 152, 168, 106, 30, + 60, 109, 158, 166, 131, 11, 118, 106, 118, 40, 9, 76, 226, 98, 179, 230, + 21, 50, 120, 106, 80, 234, 3, 12, 124, 195, 184, 205, 158, 122, 173, 88, + 64, 46, 55, 158, 185, 98, 21, 113, 115, 238, 114, 69, 223, 103, 0, 85, + 63, 123, 169, 49, 90, 148, 255, 183, 20, 180, 208, 177, 122, 185, 28, 236, + 87, 161, 255, 35, 171, 116, 161, 9, 127, 162, 163, 247, 88, 223, 97, 12, + 240, 153, 170, 245, 1, 202, 140, 31, 241, 163, 112, 227, 214, 123, 133, 127, + 13, 184, 99, 112, 223, 180, 242, 176, 254, 33, 150, 26, 199, 101, 145, 56, + 195, 250, 176, 251, 168, 178, 122, 30, 231, 58, 167, 16, 248, 49, 249, 160, + 244, 247, 220, 114, 143, 25, 184, 72, 17, 232, 208, 216, 211, 53, 87, 10, + 23, 74, 89, 46, 18, 69, 185, 232, 34, 131, 41, 29, 68, 6, 84, 186, + 229, 96, 195, 187, 174, 125, 164, 37, 240, 18, 29, 187, 109, 73, 107, 81, + 72, 45, 125, 212, 82, 129, 64, 183, 18, 98, 238, 91, 39, 188, 48, 51, + 38, 3, 45, 95, 145, 10, 195, 234, 173, 195, 98, 222, 253, 225, 197, 122, + 25, 180, 15, 111, 66, 253, 87, 161, 64, 18, 219, 227, 63, 5, 81, 13, + 43, 40, 20, 187, 99, 245, 164, 62, 19, 11, 229, 246, 88, 255, 102, 48, + 26, 187, 221, 6, 111, 47, 8, 235, 195, 109, 199, 218, 240, 30, 18, 70, + 60, 151, 132, 164, 59, 183, 176, 111, 127, 221, 174, 13, 253, 178, 173, 85, + 210, 107, 153, 0, 170, 82, 242, 182, 85, 208, 245, 199, 14, 108, 78, 179, + 219, 186, 247, 53, 21, 12, 11, 18, 68, 114, 42, 235, 41, 24, 198, 183, + 45, 57, 153, 69, 207, 118, 51, 177, 92, 149, 160, 77, 61, 210, 121, 83, + 245, 111, 88, 66, 37, 10, 144, 95, 234, 255, 110, 129, 251, 178, 166, 176, + 191, 116, 238, 86, 138, 125, 172, 251, 31, 62, 105, 168, 180, 88, 131, 215, + 115, 73, 125, 58, 207, 222, 209, 130, 224, 51, 106, 135, 227, 81, 76, 106, + 166, 208, 15, 186, 169, 174, 87, 162, 129, 119, 254, 71, 241, 141, 50, 93, + 242, 60, 221, 113, 79, 238, 185, 31, 119, 123, 214, 14, 166, 37, 189, 65, + 143, 135, 220, 164, 206, 250, 29, 19, 154, 196, 63, 127, 220, 209, 191, 111, + 235, 109, 84, 35, 254, 218, 169, 172, 219, 162, 251, 211, 52, 205, 244, 168, + 242, 118, 159, 159, 167, 3, 170, 46, 117, 34, 126, 148, 176, 100, 60, 106, + 188, 108, 218, 198, 78, 183, 177, 209, 82, 208, 78, 148, 98, 80, 12, 191, + 192, 75, 191, 77, 163, 1, 255, 172, 162, 164, 24, 127, 208, 39, 173, 236, + 232, 126, 18, 199, 79, 5, 112, 240, 65, 76, 25, 59, 246, 216, 98, 201, + 163, 62, 68, 174, 121, 182, 118, 65, 151, 138, 155, 142, 224, 171, 116, 168, + 96, 196, 85, 224, 31, 179, 62, 176, 126, 166, 242, 65, 101, 198, 145, 171, + 161, 199, 36, 134, 124, 121, 1, 190, 226, 195, 138, 215, 14, 254, 253, 48, + 226, 231, 145, 131, 134, 160, 103, 255, 104, 247, 113, 100, 231, 137, 51, 47, + 204, 208, 248, 176, 218, 125, 92, 249, 171, 197, 102, 137, 59, 60, 222, 110, + 158, 91, 21, 86, 201, 135, 21, 150, 129, 15, 35, 60, 200, 128, 249, 56, + 74, 62, 174, 142, 26, 53, 186, 245, 62, 3, 144, 13, 0, 61, 188, 76, + 115, 114, 107, 64, 160, 252, 126, 4, 113, 126, 242, 179, 146, 115, 81, 163, + 156, 101, 129, 197, 29, 95, 112, 78, 40, 41, 121, 150, 154, 168, 198, 85, + 14, 21, 113, 249, 180, 161, 13, 160, 6, 76, 247, 234, 225, 74, 206, 192, + 220, 35, 192, 174, 104, 60, 169, 79, 244, 69, 14, 198, 58, 63, 172, 5, + 199, 156, 12, 222, 44, 69, 68, 96, 238, 217, 241, 222, 223, 237, 137, 122, + 250, 147, 75, 10, 44, 17, 140, 61, 212, 237, 42, 114, 180, 101, 73, 12, + 58, 34, 174, 194, 7, 171, 72, 174, 245, 200, 117, 174, 192, 153, 112, 76, + 39, 36, 152, 69, 149, 239, 124, 246, 86, 121, 15, 132, 90, 70, 241, 157, + 62, 142, 197, 115, 134, 1, 174, 101, 47, 26, 16, 184, 132, 156, 196, 142, + 137, 229, 96, 235, 255, 240, 221, 239, 127, 215, 96, 160, 11, 32, 105, 96, + 113, 84, 77, 99, 205, 207, 151, 174, 58, 166, 10, 64, 245, 133, 143, 11, + 170, 69, 210, 150, 71, 139, 238, 219, 82, 238, 47, 80, 151, 68, 99, 87, + 163, 74, 73, 251, 205, 145, 81, 231, 180, 180, 29, 182, 1, 155, 30, 181, + 222, 120, 169, 246, 91, 232, 166, 150, 72, 4, 219, 45, 189, 88, 9, 6, + 176, 16, 186, 253, 198, 142, 63, 110, 185, 219, 216, 156, 150, 166, 105, 16, + 187, 168, 48, 208, 192, 41, 120, 237, 208, 87, 109, 193, 16, 67, 91, 184, + 66, 188, 27, 9, 68, 232, 32, 135, 144, 96, 198, 173, 163, 255, 77, 255, + 47, 53, 42, 64, 119, 223, 157, 108, 27, 240, 8, 142, 181, 180, 14, 135, + 50, 149, 253, 201, 68, 135, 84, 127, 174, 68, 39, 244, 167, 228, 95, 36, + 128, 97, 122, 195, 11, 91, 199, 119, 241, 167, 25, 219, 147, 97, 154, 26, + 10, 140, 26, 78, 103, 40, 89, 231, 128, 21, 73, 176, 164, 235, 215, 77, + 118, 76, 195, 128, 159, 109, 170, 52, 70, 60, 54, 65, 177, 152, 106, 10, + 102, 232, 51, 163, 190, 15, 81, 16, 6, 158, 64, 71, 99, 176, 65, 89, + 126, 140, 131, 75, 127, 231, 190, 236, 195, 254, 108, 124, 179, 166, 65, 57, + 98, 62, 7, 190, 74, 136, 187, 102, 86, 135, 87, 212, 134, 240, 59, 234, + 101, 239, 216, 210, 208, 134, 9, 239, 46, 56, 105, 112, 114, 202, 9, 234, + 124, 234, 121, 67, 243, 84, 158, 237, 221, 246, 124, 5, 143, 144, 237, 63, + 74, 37, 87, 95, 55, 128, 149, 209, 11, 6, 168, 211, 150, 196, 105, 138, + 49, 112, 177, 45, 114, 106, 103, 43, 151, 216, 186, 29, 221, 116, 29, 50, + 134, 94, 138, 166, 89, 143, 44, 37, 215, 253, 165, 59, 170, 21, 71, 213, + 146, 213, 163, 37, 210, 238, 150, 11, 68, 147, 34, 7, 168, 145, 30, 225, + 10, 229, 154, 70, 183, 105, 164, 128, 135, 251, 21, 65, 122, 226, 214, 138, + 155, 50, 37, 225, 172, 192, 11, 53, 252, 35, 61, 179, 34, 251, 25, 119, + 177, 218, 193, 171, 211, 74, 181, 150, 225, 46, 74, 244, 167, 239, 68, 158, + 2, 251, 208, 131, 239, 66, 31, 173, 146, 167, 213, 193, 227, 122, 223, 207, + 6, 236, 245, 110, 72, 255, 78, 128, 70, 35, 248, 66, 145, 87, 239, 219, + 172, 217, 2, 178, 227, 47, 219, 140, 225, 14, 249, 100, 227, 109, 11, 126, + 9, 104, 164, 3, 121, 138, 222, 225, 7, 59, 151, 164, 235, 38, 209, 41, + 158, 75, 208, 147, 4, 140, 229, 103, 203, 160, 23, 74, 83, 156, 226, 212, + 77, 97, 19, 52, 108, 10, 5, 233, 21, 225, 147, 139, 160, 116, 231, 221, + 224, 208, 208, 242, 134, 59, 218, 68, 107, 1, 49, 178, 181, 74, 112, 83, + 15, 238, 106, 180, 28, 156, 4, 55, 222, 112, 159, 0, 95, 110, 146, 251, + 0, 24, 35, 141, 18, 252, 4, 55, 243, 39, 109, 227, 200, 233, 6, 225, + 165, 233, 77, 101, 90, 137, 195, 125, 245, 61, 42, 50, 13, 167, 117, 65, + 183, 111, 133, 165, 96, 184, 43, 133, 242, 22, 225, 109, 95, 10, 105, 19, + 165, 29, 180, 86, 10, 238, 74, 213, 106, 181, 228, 237, 145, 7, 120, 166, + 26, 11, 140, 225, 185, 113, 123, 128, 231, 172, 128, 129, 213, 2, 218, 205, + 225, 114, 157, 222, 111, 14, 222, 223, 216, 57, 74, 211, 152, 169, 8, 242, + 23, 80, 23, 1, 120, 136, 19, 153, 244, 168, 195, 205, 229, 86, 161, 190, + 59, 89, 244, 29, 77, 228, 246, 94, 116, 214, 18, 36, 117, 197, 224, 241, + 173, 141, 67, 250, 130, 239, 109, 157, 158, 61, 228, 157, 181, 172, 232, 74, + 74, 187, 217, 60, 62, 226, 132, 139, 93, 160, 191, 211, 22, 131, 252, 182, + 215, 111, 28, 135, 247, 224, 244, 222, 171, 191, 255, 16, 246, 191, 11, 251, + 191, 15, 251, 191, 123, 102, 251, 149, 130, 190, 101, 251, 229, 186, 36, 82, + 65, 62, 219, 233, 234, 36, 221, 204, 30, 172, 183, 221, 31, 146, 239, 146, + 223, 39, 191, 3, 223, 241, 236, 34, 37, 117, 138, 91, 94, 134, 22, 89, + 54, 175, 155, 218, 108, 21, 155, 211, 75, 130, 174, 172, 76, 65, 79, 110, + 226, 152, 205, 73, 109, 195, 194, 234, 185, 77, 207, 109, 198, 166, 53, 178, + 233, 186, 136, 252, 220, 24, 16, 81, 192, 186, 172, 69, 28, 108, 121, 142, + 111, 196, 153, 253, 55, 242, 238, 7, 163, 157, 160, 91, 164, 237, 191, 162, + 18, 213, 59, 170, 85, 182, 52, 238, 79, 104, 89, 132, 184, 151, 226, 238, + 139, 226, 194, 116, 156, 38, 104, 101, 162, 226, 194, 98, 124, 73, 61, 200, + 16, 118, 180, 96, 161, 140, 16, 191, 251, 240, 137, 205, 152, 17, 112, 128, + 119, 82, 121, 222, 131, 157, 21, 101, 10, 218, 166, 197, 77, 128, 91, 207, + 142, 127, 51, 108, 194, 104, 177, 113, 70, 179, 137, 253, 42, 199, 87, 198, + 94, 41, 10, 113, 87, 10, 228, 165, 156, 77, 144, 116, 221, 253, 96, 10, + 77, 236, 91, 102, 25, 97, 115, 41, 67, 19, 210, 9, 232, 104, 47, 7, + 43, 200, 43, 66, 8, 131, 97, 70, 240, 220, 32, 126, 152, 222, 206, 199, + 235, 245, 216, 205, 199, 6, 234, 220, 228, 88, 60, 190, 129, 73, 64, 42, + 16, 69, 234, 240, 209, 120, 190, 162, 141, 66, 201, 69, 116, 168, 225, 98, + 77, 64, 174, 50, 43, 134, 176, 237, 207, 55, 119, 215, 99, 203, 211, 254, + 110, 4, 161, 161, 105, 170, 12, 40, 168, 46, 126, 213, 92, 18, 235, 87, + 150, 17, 114, 165, 147, 86, 147, 61, 39, 230, 73, 147, 244, 56, 226, 15, + 73, 28, 243, 76, 251, 46, 137, 91, 204, 230, 254, 62, 137, 98, 126, 72, + 209, 42, 137, 223, 164, 194, 76, 1, 29, 73, 149, 165, 86, 210, 77, 5, + 43, 98, 41, 38, 219, 37, 150, 176, 46, 121, 106, 81, 205, 187, 111, 180, + 159, 13, 151, 98, 84, 189, 118, 167, 219, 59, 61, 123, 251, 236, 244, 55, + 148, 212, 124, 138, 29, 69, 94, 202, 245, 227, 27, 107, 58, 11, 244, 212, + 78, 202, 35, 176, 54, 196, 237, 189, 113, 13, 108, 99, 231, 237, 12, 20, + 176, 175, 111, 169, 225, 218, 252, 150, 47, 237, 35, 251, 49, 106, 201, 173, + 31, 71, 140, 28, 207, 117, 124, 159, 143, 246, 138, 185, 151, 90, 162, 58, + 232, 26, 181, 42, 181, 20, 187, 68, 93, 163, 238, 253, 13, 21, 236, 170, + 132, 33, 148, 31, 64, 153, 227, 1, 31, 8, 192, 59, 169, 142, 226, 211, + 129, 26, 30, 217, 83, 130, 94, 153, 136, 121, 234, 29, 170, 161, 167, 123, + 95, 229, 114, 26, 250, 54, 100, 189, 28, 207, 111, 193, 151, 157, 177, 171, + 7, 118, 46, 97, 203, 120, 107, 3, 213, 80, 0, 57, 108, 160, 170, 86, + 20, 122, 38, 196, 169, 74, 36, 168, 57, 50, 12, 124, 25, 6, 20, 218, + 22, 160, 183, 87, 116, 232, 80, 55, 180, 5, 66, 20, 198, 2, 4, 63, + 102, 25, 53, 28, 19, 42, 229, 224, 105, 52, 30, 198, 215, 211, 57, 156, + 181, 183, 15, 229, 170, 223, 160, 35, 71, 185, 85, 62, 176, 231, 204, 149, + 231, 248, 170, 148, 243, 199, 28, 71, 146, 6, 220, 175, 63, 69, 117, 72, + 5, 234, 128, 170, 21, 127, 59, 117, 98, 21, 86, 7, 179, 48, 123, 117, + 11, 110, 73, 199, 21, 156, 91, 94, 101, 157, 95, 178, 249, 108, 163, 19, + 78, 116, 90, 55, 217, 206, 163, 68, 208, 190, 209, 203, 252, 98, 182, 191, + 93, 204, 225, 214, 89, 96, 53, 86, 2, 168, 193, 127, 204, 59, 60, 61, + 59, 49, 149, 96, 135, 214, 108, 91, 55, 103, 89, 110, 121, 92, 68, 190, + 132, 200, 194, 131, 192, 247, 166, 202, 39, 29, 195, 49, 1, 158, 80, 246, + 245, 232, 144, 201, 187, 159, 158, 118, 236, 32, 26, 144, 23, 60, 152, 160, + 214, 210, 136, 136, 132, 79, 141, 211, 112, 171, 8, 128, 103, 75, 140, 182, + 247, 55, 160, 230, 158, 186, 27, 5, 211, 131, 177, 164, 79, 175, 12, 146, + 39, 104, 204, 81, 123, 136, 202, 181, 57, 228, 226, 247, 0, 182, 43, 209, + 58, 233, 28, 85, 132, 206, 149, 11, 41, 250, 55, 246, 120, 164, 41, 151, + 139, 44, 216, 193, 150, 122, 13, 168, 90, 178, 159, 37, 29, 194, 73, 192, + 135, 55, 187, 56, 207, 226, 123, 29, 163, 232, 84, 142, 186, 193, 25, 16, + 102, 12, 142, 113, 83, 169, 157, 194, 171, 5, 99, 248, 14, 25, 41, 153, + 114, 179, 226, 57, 155, 31, 31, 124, 253, 193, 236, 126, 50, 240, 114, 28, + 166, 179, 204, 101, 167, 66, 93, 80, 144, 233, 15, 15, 231, 154, 194, 70, + 54, 200, 199, 67, 203, 92, 120, 211, 4, 10, 159, 198, 171, 84, 164, 188, + 44, 247, 239, 167, 59, 246, 25, 130, 235, 137, 6, 241, 72, 111, 120, 110, + 244, 248, 104, 15, 45, 218, 105, 157, 22, 77, 185, 32, 43, 221, 17, 19, + 117, 66, 75, 215, 121, 101, 58, 120, 127, 71, 103, 5, 118, 115, 48, 29, + 92, 220, 213, 233, 153, 111, 83, 74, 193, 180, 244, 62, 162, 53, 79, 104, + 115, 219, 180, 94, 103, 137, 78, 13, 32, 246, 118, 188, 122, 142, 78, 199, + 248, 4, 168, 213, 207, 249, 86, 35, 105, 135, 125, 118, 18, 183, 36, 122, + 200, 70, 227, 26, 8, 74, 132, 75, 73, 199, 43, 228, 213, 241, 248, 217, + 147, 186, 217, 146, 117, 129, 223, 192, 248, 170, 164, 230, 108, 158, 41, 251, + 249, 243, 183, 46, 247, 204, 203, 54, 92, 57, 174, 137, 32, 133, 206, 158, + 191, 1, 42, 222, 231, 37, 29, 138, 50, 190, 50, 100, 205, 251, 173, 201, + 158, 196, 193, 231, 70, 153, 182, 186, 156, 174, 24, 3, 40, 26, 112, 96, + 172, 221, 208, 196, 126, 203, 50, 176, 141, 72, 185, 136, 137, 174, 188, 237, + 4, 135, 238, 173, 224, 233, 96, 33, 21, 219, 126, 133, 207, 182, 61, 193, + 121, 13, 48, 70, 161, 9, 155, 216, 48, 115, 208, 98, 149, 187, 39, 206, + 136, 150, 13, 228, 198, 217, 213, 99, 229, 246, 55, 51, 113, 60, 96, 73, + 239, 158, 130, 8, 6, 108, 131, 203, 167, 6, 50, 60, 40, 207, 193, 204, + 150, 54, 249, 84, 103, 30, 37, 59, 98, 114, 39, 178, 105, 152, 244, 81, + 54, 253, 190, 32, 189, 84, 140, 82, 111, 37, 53, 223, 19, 248, 92, 231, + 96, 107, 143, 139, 190, 43, 110, 55, 138, 11, 197, 157, 64, 227, 235, 166, + 113, 172, 39, 138, 208, 152, 39, 144, 73, 0, 45, 156, 72, 236, 63, 229, + 169, 123, 148, 182, 62, 214, 31, 200, 151, 145, 156, 254, 124, 3, 65, 155, + 188, 130, 49, 65, 244, 35, 109, 150, 237, 151, 83, 212, 77, 207, 244, 84, + 158, 237, 50, 4, 61, 78, 205, 236, 121, 88, 4, 167, 95, 39, 120, 126, + 209, 249, 247, 215, 21, 63, 71, 207, 138, 159, 91, 95, 121, 14, 150, 186, + 69, 250, 28, 172, 105, 144, 19, 62, 71, 133, 98, 186, 175, 56, 15, 255, + 234, 98, 105, 239, 235, 143, 199, 255, 91, 200, 169, 167, 24, 238, 185, 243, + 47, 203, 174, 77, 27, 190, 69, 122, 189, 26, 15, 238, 102, 162, 51, 167, + 2, 244, 200, 165, 37, 97, 56, 145, 87, 64, 66, 113, 214, 230, 163, 196, + 29, 77, 151, 99, 107, 146, 49, 157, 207, 199, 240, 246, 180, 28, 211, 234, + 242, 96, 0, 31, 41, 73, 149, 133, 220, 139, 13, 12, 212, 114, 59, 223, + 177, 17, 30, 138, 221, 0, 117, 196, 122, 58, 211, 102, 106, 98, 133, 199, + 168, 168, 156, 251, 29, 107, 230, 115, 3, 224, 107, 2, 200, 26, 104, 209, + 23, 118, 73, 213, 174, 228, 20, 115, 192, 182, 44, 233, 170, 105, 144, 109, + 221, 81, 196, 166, 12, 13, 129, 137, 207, 247, 119, 80, 5, 201, 209, 87, + 159, 16, 163, 156, 111, 241, 83, 171, 6, 146, 70, 28, 237, 186, 136, 163, + 190, 57, 195, 69, 7, 111, 213, 74, 74, 76, 112, 10, 142, 146, 18, 211, + 182, 148, 93, 224, 233, 52, 186, 122, 122, 245, 138, 6, 18, 92, 134, 235, + 154, 28, 17, 129, 155, 83, 28, 19, 72, 79, 39, 117, 149, 3, 230, 80, + 66, 138, 124, 140, 3, 81, 208, 209, 43, 96, 156, 64, 71, 181, 192, 219, + 118, 236, 247, 14, 190, 119, 236, 247, 142, 168, 75, 190, 130, 164, 218, 236, + 38, 13, 136, 150, 204, 78, 34, 111, 5, 76, 107, 218, 65, 183, 184, 122, + 51, 174, 86, 159, 182, 117, 136, 227, 158, 38, 252, 167, 32, 181, 204, 59, + 143, 53, 35, 136, 45, 220, 82, 178, 96, 18, 139, 102, 176, 55, 157, 51, + 211, 11, 239, 64, 195, 9, 83, 4, 254, 54, 162, 43, 229, 230, 178, 5, + 103, 28, 174, 56, 139, 1, 226, 69, 144, 21, 105, 41, 22, 186, 73, 103, + 222, 65, 230, 157, 175, 201, 156, 102, 174, 164, 126, 162, 212, 117, 170, 30, + 99, 29, 210, 211, 36, 62, 168, 124, 138, 167, 244, 206, 149, 206, 130, 3, + 157, 201, 161, 5, 79, 31, 179, 179, 207, 72, 91, 121, 80, 12, 102, 11, + 53, 209, 118, 141, 193, 110, 250, 149, 215, 70, 40, 41, 161, 159, 24, 63, + 124, 187, 107, 24, 209, 89, 231, 139, 123, 202, 206, 143, 153, 17, 15, 133, + 29, 119, 218, 98, 212, 46, 100, 223, 104, 227, 246, 60, 117, 109, 156, 218, + 55, 12, 115, 227, 203, 130, 147, 29, 238, 185, 70, 170, 241, 111, 4, 19, + 177, 190, 213, 145, 85, 14, 125, 203, 222, 77, 83, 120, 125, 230, 46, 58, + 69, 107, 35, 6, 255, 103, 146, 61, 39, 239, 254, 154, 126, 168, 164, 174, + 236, 143, 169, 63, 154, 214, 242, 49, 212, 190, 198, 56, 211, 231, 59, 173, + 80, 38, 254, 194, 203, 126, 23, 53, 78, 223, 243, 219, 155, 127, 7, 45, + 206, 97, 98, 227, 194, 174, 118, 208, 207, 29, 2, 239, 137, 194, 227, 92, + 159, 183, 243, 125, 30, 196, 220, 233, 237, 130, 78, 127, 60, 218, 235, 252, + 248, 72, 143, 255, 85, 253, 47, 127, 30, 95, 58, 12, 82, 45, 202, 41, + 171, 168, 105, 166, 122, 206, 246, 152, 230, 219, 138, 231, 221, 142, 17, 251, + 94, 48, 251, 246, 143, 133, 125, 209, 41, 236, 11, 232, 159, 200, 167, 84, + 103, 152, 9, 248, 143, 204, 186, 253, 63, 125, 177, 219, 23, 45, 118, 251, + 255, 212, 197, 110, 255, 162, 197, 174, 21, 242, 114, 103, 160, 26, 149, 250, + 78, 110, 203, 55, 60, 177, 69, 31, 140, 106, 124, 11, 100, 47, 129, 32, + 4, 61, 132, 219, 48, 130, 225, 129, 5, 31, 140, 11, 226, 81, 27, 39, + 18, 207, 98, 15, 182, 11, 226, 17, 13, 70, 18, 239, 137, 37, 124, 124, + 16, 173, 203, 21, 235, 211, 8, 15, 35, 133, 133, 123, 51, 100, 32, 93, + 53, 100, 254, 102, 236, 219, 149, 35, 30, 95, 28, 245, 8, 111, 156, 219, + 72, 167, 119, 183, 241, 96, 53, 156, 162, 243, 224, 132, 97, 185, 26, 175, + 195, 254, 96, 62, 152, 237, 87, 84, 159, 213, 112, 48, 99, 174, 216, 134, + 228, 111, 100, 246, 115, 162, 122, 42, 182, 64, 7, 244, 57, 227, 190, 6, + 167, 114, 108, 127, 230, 163, 60, 6, 4, 20, 170, 175, 167, 115, 160, 82, + 74, 133, 6, 75, 199, 114, 56, 101, 114, 38, 242, 234, 85, 129, 193, 167, + 107, 251, 200, 224, 165, 162, 115, 45, 200, 165, 43, 218, 3, 68, 193, 91, + 227, 102, 41, 97, 56, 224, 145, 168, 233, 3, 170, 205, 114, 101, 53, 209, + 97, 58, 205, 118, 152, 233, 154, 62, 55, 85, 132, 128, 201, 165, 180, 64, + 189, 94, 97, 141, 74, 147, 52, 137, 122, 233, 64, 123, 92, 141, 229, 14, + 42, 67, 85, 36, 144, 89, 87, 76, 220, 228, 210, 120, 116, 190, 58, 50, + 31, 109, 87, 135, 158, 219, 237, 46, 126, 106, 207, 129, 79, 141, 221, 203, + 157, 142, 124, 83, 215, 43, 124, 249, 227, 191, 250, 169, 213, 137, 95, 7, + 111, 126, 67, 127, 79, 43, 213, 90, 61, 108, 52, 79, 90, 230, 106, 229, + 221, 249, 251, 228, 226, 183, 255, 242, 187, 223, 255, 225, 143, 255, 237, 79, + 223, 253, 247, 239, 255, 199, 255, 245, 231, 15, 31, 255, 239, 79, 255, 250, + 195, 95, 126, 252, 235, 191, 253, 251, 255, 252, 95, 255, 207, 79, 81, 187, + 253, 211, 79, 244, 219, 253, 185, 255, 83, 212, 105, 13, 174, 135, 212, 132, + 219, 201, 244, 111, 159, 75, 165, 217, 221, 124, 113, 255, 247, 229, 106, 189, + 121, 216, 210, 250, 249, 83, 116, 218, 254, 133, 126, 58, 255, 239, 161, 20, + 150, 216, 220, 211, 30, 2, 212, 128, 114, 220, 110, 101, 7, 146, 94, 12, + 164, 67, 216, 70, 7, 22, 219, 66, 125, 159, 41, 204, 39, 106, 27, 148, + 58, 90, 123, 166, 55, 116, 92, 185, 129, 86, 16, 25, 82, 140, 1, 97, + 43, 7, 221, 50, 251, 121, 234, 179, 225, 125, 242, 20, 188, 186, 160, 153, + 9, 28, 207, 74, 25, 150, 57, 229, 170, 62, 121, 111, 189, 63, 36, 79, + 255, 241, 54, 254, 143, 131, 92, 168, 44, 134, 52, 247, 105, 185, 249, 151, + 224, 226, 112, 16, 167, 243, 193, 31, 28, 151, 243, 233, 32, 246, 164, 231, + 105, 15, 145, 173, 43, 15, 174, 136, 217, 31, 177, 186, 130, 48, 30, 234, + 129, 136, 201, 168, 152, 18, 78, 117, 33, 222, 34, 126, 23, 95, 177, 218, + 251, 83, 131, 206, 31, 253, 237, 193, 94, 67, 88, 25, 188, 127, 205, 151, + 55, 10, 16, 97, 224, 63, 42, 100, 194, 203, 136, 5, 77, 95, 76, 110, + 82, 240, 15, 173, 161, 44, 134, 130, 162, 79, 3, 154, 41, 71, 125, 96, + 27, 212, 44, 94, 188, 12, 36, 131, 55, 223, 98, 57, 214, 103, 172, 128, + 97, 81, 105, 145, 156, 79, 108, 240, 228, 68, 244, 73, 148, 121, 218, 5, + 175, 8, 253, 237, 36, 9, 212, 67, 24, 204, 105, 113, 156, 79, 4, 194, + 194, 124, 85, 129, 116, 214, 98, 16, 226, 61, 14, 50, 254, 74, 113, 97, + 59, 122, 219, 250, 218, 24, 202, 232, 172, 160, 149, 71, 219, 96, 237, 244, + 224, 202, 15, 38, 9, 21, 196, 129, 126, 0, 95, 227, 19, 253, 26, 250, + 97, 245, 119, 14, 227, 159, 200, 220, 16, 133, 177, 191, 71, 199, 254, 1, + 173, 219, 223, 29, 84, 63, 107, 95, 112, 88, 247, 255, 192, 26, 125, 45, + 3, 214, 94, 10, 186, 165, 42, 29, 216, 89, 82, 250, 7, 31, 128, 232, + 44, 253, 79, 203, 246, 92, 141, 87, 30, 11, 20, 89, 218, 159, 201, 136, + 73, 49, 244, 1, 39, 15, 93, 29, 137, 163, 46, 189, 204, 104, 190, 27, + 220, 179, 212, 86, 244, 16, 86, 80, 150, 166, 241, 17, 188, 2, 176, 229, + 79, 243, 114, 213, 131, 230, 53, 250, 66, 207, 9, 51, 89, 146, 224, 73, + 63, 254, 228, 163, 196, 144, 70, 190, 244, 139, 137, 130, 96, 212, 126, 65, + 36, 54, 147, 108, 169, 246, 178, 84, 171, 12, 126, 170, 191, 241, 117, 103, + 155, 141, 142, 22, 135, 219, 229, 116, 228, 152, 109, 20, 217, 90, 136, 180, + 133, 35, 126, 133, 10, 190, 178, 183, 56, 182, 240, 234, 162, 163, 158, 231, + 214, 195, 229, 67, 139, 45, 36, 178, 181, 57, 46, 172, 174, 40, 81, 117, + 213, 248, 38, 53, 176, 177, 60, 43, 32, 109, 99, 169, 244, 207, 135, 80, + 46, 218, 98, 185, 202, 205, 165, 171, 153, 116, 5, 209, 133, 69, 141, 112, + 181, 166, 44, 45, 48, 90, 213, 237, 29, 12, 141, 107, 5, 44, 134, 106, + 113, 127, 50, 222, 13, 110, 23, 115, 70, 125, 73, 57, 1, 100, 213, 16, + 101, 61, 246, 62, 137, 178, 253, 98, 211, 33, 155, 172, 2, 252, 23, 25, + 216, 180, 19, 64, 218, 91, 85, 73, 73, 171, 169, 213, 162, 104, 92, 14, + 230, 64, 43, 157, 14, 136, 57, 56, 42, 6, 43, 106, 74, 220, 241, 138, + 91, 152, 182, 140, 18, 135, 129, 41, 243, 40, 81, 153, 136, 82, 42, 19, + 165, 236, 56, 72, 183, 189, 2, 176, 211, 188, 125, 69, 202, 197, 160, 222, + 153, 196, 20, 47, 46, 24, 43, 188, 19, 61, 149, 255, 240, 253, 221, 109, + 123, 84, 62, 132, 189, 176, 87, 117, 189, 205, 226, 42, 255, 126, 122, 18, + 243, 93, 126, 20, 158, 42, 71, 178, 112, 30, 219, 132, 59, 65, 26, 23, + 3, 227, 22, 146, 125, 132, 64, 192, 212, 21, 79, 179, 177, 23, 135, 61, + 73, 17, 194, 217, 170, 217, 17, 246, 126, 157, 101, 190, 111, 154, 126, 207, + 95, 62, 232, 12, 28, 215, 177, 109, 71, 53, 203, 77, 25, 41, 19, 141, + 26, 244, 245, 68, 137, 192, 171, 67, 93, 242, 137, 86, 205, 117, 165, 93, + 61, 248, 169, 215, 19, 220, 186, 55, 187, 30, 206, 43, 35, 136, 142, 99, + 95, 61, 250, 109, 245, 228, 119, 160, 111, 233, 157, 192, 162, 189, 41, 87, + 162, 222, 124, 159, 60, 69, 117, 217, 67, 104, 235, 170, 5, 145, 222, 92, + 118, 88, 126, 245, 39, 92, 235, 156, 76, 106, 237, 147, 138, 42, 174, 198, + 8, 229, 136, 200, 50, 81, 214, 82, 157, 239, 104, 157, 220, 83, 240, 83, + 167, 166, 107, 69, 44, 125, 44, 126, 21, 165, 33, 173, 144, 118, 42, 154, + 249, 224, 214, 177, 124, 126, 65, 83, 82, 201, 38, 39, 3, 234, 204, 135, + 241, 146, 250, 191, 245, 204, 92, 19, 31, 170, 27, 32, 162, 189, 211, 215, + 143, 130, 231, 127, 193, 218, 94, 42, 68, 56, 227, 84, 16, 172, 116, 220, + 9, 169, 149, 122, 89, 75, 76, 135, 241, 177, 138, 15, 160, 217, 201, 234, + 20, 252, 146, 217, 170, 239, 114, 217, 56, 40, 133, 72, 50, 89, 44, 167, + 143, 139, 249, 90, 105, 142, 83, 147, 197, 72, 19, 154, 227, 196, 211, 48, + 23, 15, 197, 113, 214, 10, 253, 197, 239, 36, 196, 64, 81, 21, 248, 62, + 245, 23, 191, 155, 76, 231, 230, 245, 24, 92, 137, 115, 151, 172, 124, 29, + 196, 162, 240, 149, 162, 78, 146, 138, 226, 126, 87, 38, 86, 118, 73, 209, + 180, 114, 150, 150, 52, 197, 142, 222, 77, 23, 246, 92, 15, 66, 167, 54, + 95, 22, 30, 233, 89, 71, 212, 30, 233, 53, 133, 237, 78, 162, 227, 30, + 189, 228, 225, 125, 210, 117, 4, 237, 70, 175, 156, 229, 237, 150, 244, 34, + 116, 215, 180, 167, 183, 56, 41, 41, 226, 211, 75, 155, 94, 136, 250, 185, + 69, 43, 51, 6, 142, 172, 90, 186, 231, 153, 172, 44, 144, 23, 122, 139, + 82, 149, 51, 44, 252, 50, 228, 251, 116, 36, 46, 17, 169, 75, 37, 189, + 182, 41, 90, 59, 204, 56, 7, 155, 19, 127, 87, 159, 248, 181, 225, 190, + 216, 130, 106, 147, 179, 142, 2, 217, 167, 199, 174, 23, 124, 8, 233, 63, + 76, 248, 221, 133, 44, 84, 177, 187, 198, 33, 160, 99, 3, 246, 78, 252, + 210, 171, 29, 242, 121, 181, 199, 239, 46, 73, 246, 37, 172, 154, 49, 223, + 167, 90, 102, 56, 246, 76, 226, 161, 174, 64, 215, 250, 240, 101, 54, 102, + 166, 194, 219, 153, 218, 164, 37, 255, 144, 188, 239, 46, 146, 125, 182, 122, + 177, 147, 155, 83, 81, 169, 121, 66, 63, 198, 73, 64, 210, 204, 180, 110, + 54, 184, 30, 207, 88, 19, 218, 171, 176, 205, 182, 90, 122, 100, 17, 111, + 135, 226, 207, 187, 197, 124, 30, 46, 147, 153, 19, 72, 213, 202, 99, 179, + 125, 229, 179, 232, 131, 40, 87, 125, 16, 157, 170, 200, 151, 111, 42, 128, + 218, 213, 202, 38, 75, 39, 121, 106, 215, 142, 101, 17, 211, 23, 171, 80, + 100, 146, 235, 224, 84, 149, 210, 105, 236, 39, 73, 233, 244, 134, 161, 123, + 92, 56, 10, 140, 78, 89, 126, 60, 20, 18, 60, 115, 117, 154, 25, 29, + 218, 29, 21, 94, 247, 242, 58, 81, 175, 24, 59, 248, 203, 29, 140, 113, + 84, 88, 201, 232, 203, 131, 227, 189, 59, 56, 158, 107, 70, 113, 93, 51, + 181, 252, 66, 181, 86, 227, 95, 115, 180, 102, 43, 180, 255, 90, 58, 185, + 58, 140, 141, 136, 85, 56, 232, 60, 198, 106, 24, 23, 56, 110, 178, 238, + 63, 144, 239, 151, 124, 225, 173, 244, 244, 46, 160, 236, 77, 155, 113, 124, + 80, 144, 247, 209, 123, 19, 133, 191, 198, 180, 229, 211, 178, 138, 105, 10, + 181, 69, 124, 8, 249, 71, 118, 232, 216, 232, 116, 192, 111, 131, 236, 212, + 114, 14, 188, 74, 109, 216, 94, 253, 102, 40, 46, 115, 101, 113, 242, 255, + 38, 70, 203, 70, 165, 142, 142, 244, 205, 166, 111, 221, 64, 72, 21, 92, + 21, 13, 79, 29, 116, 244, 46, 130, 81, 62, 88, 66, 46, 172, 253, 225, + 228, 78, 55, 127, 214, 81, 248, 128, 163, 156, 203, 188, 84, 2, 252, 236, + 201, 166, 158, 45, 157, 14, 56, 249, 10, 217, 61, 170, 229, 110, 81, 45, + 187, 109, 216, 26, 202, 177, 199, 212, 241, 232, 121, 199, 49, 5, 133, 177, + 144, 159, 51, 8, 101, 23, 174, 207, 105, 244, 220, 96, 36, 222, 96, 252, + 225, 151, 89, 204, 203, 159, 91, 24, 159, 196, 75, 63, 140, 205, 58, 167, + 136, 31, 62, 253, 75, 235, 80, 170, 193, 39, 119, 233, 233, 95, 34, 122, + 220, 203, 99, 124, 16, 246, 204, 57, 133, 74, 169, 188, 245, 190, 58, 9, + 104, 243, 163, 1, 26, 172, 68, 75, 80, 78, 235, 46, 30, 83, 202, 140, + 245, 136, 10, 3, 45, 188, 253, 213, 61, 160, 252, 64, 208, 254, 252, 90, + 191, 49, 231, 198, 160, 173, 125, 134, 104, 210, 42, 10, 115, 228, 15, 182, + 233, 45, 149, 53, 190, 109, 50, 215, 4, 35, 24, 126, 177, 170, 9, 31, + 6, 247, 12, 160, 7, 96, 127, 149, 127, 69, 195, 23, 13, 68, 194, 90, + 182, 165, 149, 1, 190, 203, 168, 166, 34, 178, 77, 97, 248, 179, 99, 56, + 224, 198, 2, 9, 35, 167, 227, 96, 74, 28, 12, 135, 139, 165, 8, 107, + 5, 205, 150, 37, 61, 139, 149, 114, 47, 64, 33, 211, 165, 207, 138, 146, + 138, 71, 251, 18, 230, 107, 231, 204, 64, 187, 247, 252, 107, 224, 99, 60, + 157, 65, 62, 126, 1, 150, 134, 189, 183, 3, 0, 243, 146, 111, 202, 43, + 81, 61, 184, 168, 158, 68, 61, 229, 231, 215, 165, 43, 141, 221, 52, 153, + 95, 6, 109, 209, 50, 42, 13, 246, 24, 23, 219, 161, 237, 16, 24, 42, + 104, 42, 115, 173, 89, 110, 73, 199, 131, 28, 134, 146, 144, 198, 136, 78, + 215, 149, 255, 247, 13, 78, 165, 143, 99, 55, 140, 111, 45, 34, 79, 73, + 128, 160, 243, 133, 114, 90, 80, 7, 80, 207, 193, 19, 203, 227, 38, 58, + 160, 80, 249, 76, 91, 193, 195, 187, 107, 167, 134, 99, 136, 93, 55, 169, + 162, 53, 158, 100, 116, 72, 98, 64, 84, 60, 183, 128, 142, 42, 146, 132, + 186, 82, 68, 76, 13, 247, 0, 10, 138, 80, 237, 126, 79, 149, 52, 118, + 244, 52, 73, 4, 58, 204, 127, 219, 114, 70, 181, 177, 194, 143, 81, 126, + 124, 172, 252, 56, 85, 126, 244, 77, 229, 187, 133, 174, 198, 254, 71, 90, + 123, 88, 211, 157, 168, 243, 145, 201, 229, 238, 57, 66, 186, 149, 254, 150, + 54, 75, 28, 152, 36, 59, 74, 254, 179, 144, 122, 123, 64, 202, 128, 190, + 107, 190, 163, 166, 62, 109, 233, 72, 13, 15, 142, 180, 206, 159, 235, 135, + 159, 169, 3, 206, 159, 130, 137, 242, 231, 8, 254, 148, 245, 229, 149, 56, + 49, 54, 52, 78, 201, 20, 11, 183, 28, 119, 7, 211, 194, 66, 58, 42, + 26, 218, 212, 183, 131, 37, 184, 53, 78, 195, 135, 200, 7, 253, 137, 214, + 43, 173, 47, 169, 55, 26, 13, 111, 201, 222, 79, 166, 171, 62, 67, 213, + 89, 157, 222, 181, 131, 119, 221, 95, 45, 150, 235, 254, 16, 3, 121, 73, + 3, 215, 129, 163, 4, 252, 108, 214, 157, 199, 28, 80, 61, 62, 78, 97, + 179, 113, 246, 254, 228, 199, 137, 3, 96, 173, 112, 133, 96, 245, 64, 5, + 174, 82, 87, 57, 243, 241, 214, 175, 236, 194, 61, 156, 229, 221, 208, 108, + 90, 217, 187, 153, 233, 28, 18, 248, 76, 198, 64, 198, 188, 3, 30, 32, + 75, 118, 178, 109, 209, 192, 175, 10, 111, 53, 167, 105, 5, 56, 214, 245, + 88, 224, 83, 169, 234, 52, 9, 151, 185, 170, 231, 142, 145, 69, 52, 211, + 202, 134, 105, 130, 37, 218, 150, 226, 200, 166, 106, 253, 84, 212, 245, 34, + 183, 227, 213, 235, 180, 251, 6, 235, 27, 132, 226, 253, 219, 193, 221, 221, + 224, 82, 134, 160, 172, 113, 220, 161, 220, 129, 112, 4, 196, 253, 104, 180, + 20, 149, 146, 162, 49, 226, 48, 171, 19, 247, 153, 190, 55, 41, 234, 43, + 65, 196, 124, 245, 62, 118, 140, 68, 88, 243, 153, 101, 254, 163, 195, 69, + 244, 28, 72, 216, 95, 50, 163, 65, 117, 46, 128, 107, 103, 99, 152, 182, + 160, 206, 15, 11, 218, 1, 198, 116, 100, 28, 170, 14, 168, 136, 129, 121, + 84, 109, 122, 127, 153, 44, 54, 179, 17, 251, 124, 167, 67, 126, 252, 71, + 241, 122, 98, 140, 142, 51, 42, 217, 118, 187, 159, 223, 41, 135, 238, 20, + 105, 126, 167, 88, 46, 4, 30, 222, 5, 23, 178, 26, 192, 77, 153, 162, + 83, 165, 252, 52, 135, 9, 11, 157, 129, 86, 126, 61, 124, 42, 191, 43, + 31, 252, 141, 255, 180, 54, 158, 152, 152, 12, 151, 229, 32, 46, 95, 37, + 73, 121, 94, 246, 185, 75, 121, 120, 214, 195, 185, 130, 194, 54, 65, 141, + 176, 20, 196, 34, 178, 150, 225, 74, 228, 226, 178, 46, 91, 87, 7, 24, + 194, 177, 251, 121, 111, 202, 183, 26, 196, 208, 209, 194, 197, 7, 46, 98, + 80, 162, 112, 66, 76, 115, 28, 66, 177, 236, 114, 251, 154, 94, 233, 223, + 246, 53, 5, 188, 142, 175, 136, 217, 153, 45, 214, 128, 190, 235, 227, 161, + 79, 227, 114, 144, 52, 162, 112, 58, 191, 209, 109, 159, 188, 110, 121, 240, + 49, 70, 221, 12, 26, 177, 135, 50, 98, 43, 47, 194, 14, 11, 168, 108, + 50, 90, 143, 112, 151, 204, 157, 185, 189, 72, 130, 45, 85, 152, 77, 10, + 38, 244, 50, 209, 47, 38, 254, 251, 36, 72, 21, 91, 84, 19, 48, 202, + 54, 2, 181, 158, 233, 140, 2, 16, 74, 219, 99, 81, 205, 56, 31, 169, + 156, 92, 93, 199, 2, 205, 190, 247, 179, 180, 163, 246, 39, 252, 5, 183, + 87, 114, 203, 64, 235, 23, 103, 112, 229, 161, 200, 72, 142, 249, 21, 90, + 105, 169, 57, 213, 26, 174, 191, 183, 176, 141, 158, 64, 221, 173, 202, 242, + 185, 241, 32, 206, 197, 138, 41, 154, 27, 11, 53, 230, 252, 136, 18, 156, + 66, 136, 20, 191, 15, 182, 254, 84, 21, 232, 87, 158, 130, 157, 232, 170, + 5, 123, 94, 220, 229, 121, 82, 213, 51, 100, 66, 241, 39, 78, 124, 170, + 250, 83, 176, 23, 165, 54, 168, 224, 61, 73, 129, 135, 170, 156, 253, 87, + 227, 175, 41, 37, 126, 97, 49, 233, 82, 232, 63, 5, 100, 243, 138, 230, + 72, 75, 223, 157, 224, 218, 132, 198, 158, 169, 67, 228, 201, 116, 236, 83, + 71, 65, 203, 55, 216, 70, 168, 67, 131, 101, 40, 52, 60, 21, 153, 84, + 164, 7, 21, 105, 18, 161, 80, 137, 68, 195, 24, 180, 101, 20, 70, 24, + 250, 155, 236, 160, 231, 192, 53, 142, 116, 215, 68, 76, 117, 122, 139, 240, + 22, 211, 91, 148, 206, 28, 73, 152, 42, 81, 136, 140, 109, 167, 85, 216, + 139, 242, 54, 194, 27, 134, 143, 34, 136, 46, 12, 35, 86, 101, 146, 155, + 134, 60, 148, 182, 176, 179, 210, 110, 130, 195, 150, 165, 102, 228, 75, 11, + 120, 96, 112, 71, 69, 138, 134, 250, 50, 109, 175, 24, 152, 73, 124, 193, + 209, 105, 28, 115, 139, 34, 229, 207, 121, 18, 165, 34, 235, 14, 46, 170, + 6, 39, 213, 213, 216, 171, 106, 72, 123, 81, 141, 152, 115, 126, 82, 13, + 87, 93, 159, 173, 198, 150, 170, 177, 85, 181, 22, 167, 209, 160, 11, 34, + 71, 153, 106, 56, 248, 68, 98, 102, 20, 188, 186, 136, 61, 185, 84, 148, + 13, 56, 49, 171, 232, 71, 223, 248, 127, 150, 79, 85, 181, 71, 39, 234, + 157, 246, 20, 221, 34, 125, 103, 167, 35, 184, 31, 110, 196, 125, 145, 62, + 218, 108, 124, 149, 156, 125, 25, 130, 14, 154, 249, 216, 60, 62, 50, 50, + 160, 18, 83, 211, 41, 86, 73, 167, 1, 145, 196, 7, 157, 143, 252, 59, + 220, 44, 31, 40, 131, 229, 216, 193, 28, 97, 251, 163, 57, 123, 10, 91, + 41, 60, 223, 41, 157, 8, 247, 161, 123, 207, 228, 220, 44, 125, 207, 108, + 131, 42, 82, 105, 11, 192, 65, 99, 22, 13, 148, 85, 129, 25, 121, 112, + 188, 192, 112, 218, 63, 195, 2, 136, 4, 89, 201, 140, 187, 17, 95, 53, + 125, 72, 62, 138, 45, 190, 169, 52, 76, 85, 83, 120, 35, 38, 160, 176, + 1, 252, 85, 216, 8, 231, 30, 171, 215, 73, 49, 15, 170, 29, 161, 103, + 104, 152, 187, 124, 162, 250, 28, 94, 0, 206, 119, 76, 43, 59, 229, 17, + 151, 85, 180, 228, 75, 39, 157, 228, 140, 106, 102, 156, 229, 90, 99, 220, + 46, 90, 161, 32, 75, 154, 74, 165, 14, 15, 25, 72, 0, 198, 133, 82, + 77, 208, 242, 223, 156, 45, 132, 33, 36, 12, 2, 28, 16, 147, 160, 199, + 102, 185, 138, 132, 190, 67, 66, 63, 56, 245, 68, 109, 200, 222, 146, 157, + 137, 227, 69, 49, 82, 184, 72, 98, 26, 137, 92, 238, 229, 21, 244, 61, + 158, 130, 78, 67, 32, 13, 26, 103, 7, 141, 217, 17, 233, 37, 183, 157, + 137, 223, 161, 248, 109, 39, 190, 3, 43, 97, 48, 66, 34, 224, 203, 81, + 122, 32, 102, 208, 73, 238, 4, 250, 93, 79, 65, 204, 166, 15, 196, 96, + 142, 150, 172, 94, 173, 176, 64, 48, 135, 35, 49, 77, 53, 143, 79, 12, + 85, 165, 66, 228, 209, 191, 231, 156, 25, 56, 132, 111, 181, 252, 72, 238, + 103, 205, 77, 146, 145, 148, 218, 91, 36, 94, 240, 251, 122, 156, 120, 63, + 16, 35, 208, 75, 29, 191, 226, 212, 213, 96, 240, 3, 21, 247, 3, 206, + 41, 14, 102, 27, 156, 55, 240, 194, 188, 121, 159, 48, 144, 137, 220, 126, + 73, 95, 80, 134, 157, 218, 166, 2, 131, 69, 156, 52, 99, 56, 228, 253, + 60, 95, 92, 83, 120, 87, 194, 91, 8, 143, 32, 137, 175, 16, 203, 64, + 231, 33, 138, 85, 15, 36, 117, 29, 199, 246, 167, 70, 128, 34, 106, 65, + 187, 134, 251, 81, 68, 232, 164, 34, 112, 154, 118, 55, 157, 136, 162, 214, + 56, 157, 36, 200, 124, 173, 208, 103, 10, 66, 77, 170, 78, 180, 238, 203, + 162, 245, 158, 45, 171, 151, 175, 220, 217, 115, 13, 170, 10, 103, 132, 11, + 137, 22, 11, 135, 228, 108, 175, 44, 183, 112, 123, 0, 186, 163, 219, 204, + 157, 106, 133, 101, 242, 231, 49, 247, 6, 43, 200, 255, 160, 15, 143, 109, + 245, 162, 110, 105, 213, 249, 177, 13, 41, 23, 7, 65, 111, 39, 74, 189, + 237, 47, 27, 93, 85, 216, 192, 62, 170, 97, 30, 92, 136, 70, 17, 174, + 71, 53, 250, 58, 198, 231, 250, 89, 25, 227, 191, 154, 56, 191, 190, 144, + 49, 87, 126, 212, 243, 10, 234, 244, 101, 49, 163, 83, 201, 127, 170, 156, + 241, 231, 88, 36, 141, 234, 239, 174, 38, 50, 199, 35, 242, 71, 239, 89, + 249, 35, 242, 48, 18, 72, 253, 18, 227, 11, 114, 165, 231, 182, 149, 82, + 118, 172, 148, 178, 251, 207, 144, 82, 138, 164, 199, 116, 8, 47, 105, 216, + 186, 91, 161, 59, 84, 196, 91, 174, 30, 37, 163, 134, 150, 91, 250, 227, + 27, 128, 23, 188, 124, 212, 96, 207, 253, 144, 156, 105, 16, 195, 163, 3, + 200, 88, 187, 185, 213, 139, 90, 225, 153, 63, 162, 67, 8, 27, 43, 46, + 182, 8, 128, 227, 71, 241, 234, 198, 9, 188, 76, 123, 140, 186, 206, 153, + 209, 87, 182, 232, 17, 220, 40, 209, 7, 63, 218, 172, 140, 71, 96, 62, + 102, 7, 17, 139, 100, 75, 105, 72, 67, 214, 2, 143, 84, 141, 89, 167, + 35, 213, 9, 248, 172, 129, 164, 161, 132, 147, 155, 151, 97, 127, 112, 135, + 252, 54, 14, 82, 90, 150, 238, 98, 115, 243, 45, 68, 183, 168, 193, 166, + 20, 241, 198, 92, 56, 125, 221, 26, 50, 126, 100, 203, 75, 87, 218, 81, + 64, 13, 210, 232, 103, 80, 66, 205, 209, 216, 204, 220, 124, 19, 50, 4, + 214, 149, 43, 182, 229, 210, 170, 76, 177, 63, 95, 192, 55, 43, 155, 195, + 90, 20, 130, 216, 87, 2, 52, 5, 73, 32, 198, 197, 153, 17, 191, 30, + 252, 125, 51, 157, 167, 8, 175, 76, 253, 81, 193, 180, 36, 254, 102, 186, + 92, 173, 89, 14, 63, 27, 240, 67, 59, 81, 240, 153, 64, 188, 35, 78, + 126, 124, 19, 246, 175, 23, 203, 209, 120, 217, 95, 79, 166, 195, 207, 74, + 201, 218, 4, 170, 11, 110, 14, 74, 105, 21, 20, 233, 177, 169, 154, 169, + 141, 254, 235, 85, 217, 66, 240, 155, 168, 147, 194, 162, 201, 86, 76, 184, + 218, 116, 205, 140, 192, 203, 165, 193, 209, 113, 161, 106, 120, 230, 25, 34, + 30, 23, 184, 31, 131, 146, 246, 28, 40, 105, 182, 29, 232, 42, 69, 134, + 238, 155, 12, 66, 30, 155, 221, 6, 167, 226, 18, 38, 56, 83, 78, 97, + 82, 38, 6, 41, 205, 187, 2, 250, 101, 117, 174, 64, 29, 112, 127, 190, + 80, 193, 55, 180, 97, 206, 84, 5, 26, 69, 172, 30, 27, 229, 230, 148, + 20, 78, 191, 132, 172, 151, 199, 58, 133, 209, 246, 83, 3, 178, 151, 237, + 36, 117, 179, 157, 131, 183, 50, 24, 5, 6, 172, 170, 91, 162, 141, 192, + 90, 243, 1, 136, 162, 6, 156, 9, 128, 94, 103, 158, 27, 93, 188, 102, + 95, 112, 104, 22, 44, 94, 199, 38, 176, 27, 210, 127, 98, 19, 216, 213, + 54, 129, 221, 131, 88, 80, 17, 207, 219, 244, 203, 81, 131, 78, 251, 187, + 147, 237, 251, 253, 201, 164, 90, 134, 9, 112, 208, 241, 138, 192, 13, 210, + 64, 130, 144, 144, 213, 69, 181, 116, 32, 189, 52, 180, 187, 14, 203, 177, + 135, 190, 99, 88, 130, 67, 0, 254, 35, 170, 70, 45, 163, 232, 209, 246, + 111, 154, 34, 237, 176, 52, 190, 123, 144, 203, 221, 13, 109, 126, 85, 17, + 158, 234, 232, 196, 231, 179, 96, 206, 183, 138, 1, 38, 131, 151, 239, 133, + 235, 13, 29, 69, 88, 209, 113, 54, 126, 24, 207, 196, 150, 120, 128, 179, + 201, 197, 179, 192, 153, 170, 225, 176, 184, 32, 218, 102, 22, 111, 149, 233, + 183, 172, 217, 92, 139, 228, 173, 32, 128, 163, 26, 201, 153, 2, 187, 58, + 134, 123, 41, 167, 82, 173, 208, 164, 213, 153, 184, 90, 52, 169, 139, 119, + 90, 169, 95, 220, 242, 76, 243, 29, 180, 168, 183, 46, 86, 212, 25, 172, + 11, 82, 88, 240, 77, 101, 53, 167, 30, 186, 172, 27, 169, 38, 113, 102, + 15, 200, 209, 225, 24, 198, 165, 52, 149, 21, 138, 236, 73, 177, 194, 8, + 191, 240, 198, 162, 21, 136, 186, 220, 54, 181, 33, 247, 10, 246, 10, 123, + 199, 132, 187, 24, 236, 191, 177, 190, 84, 147, 171, 180, 94, 70, 239, 65, + 239, 221, 90, 51, 33, 232, 241, 108, 24, 47, 23, 163, 49, 180, 16, 5, + 212, 161, 73, 7, 14, 128, 58, 108, 15, 141, 45, 29, 55, 112, 38, 172, + 40, 144, 135, 9, 189, 119, 228, 188, 71, 115, 203, 213, 9, 224, 217, 167, + 64, 29, 42, 10, 213, 193, 73, 29, 231, 82, 243, 60, 209, 226, 88, 59, + 123, 134, 41, 111, 141, 236, 171, 96, 61, 93, 173, 167, 67, 21, 114, 189, + 216, 221, 76, 215, 26, 58, 14, 203, 13, 133, 40, 195, 248, 40, 132, 71, + 29, 39, 128, 198, 244, 116, 62, 133, 6, 173, 70, 43, 227, 176, 249, 117, + 31, 231, 248, 187, 251, 245, 202, 149, 190, 72, 47, 82, 106, 95, 151, 112, + 116, 72, 135, 184, 134, 182, 190, 118, 113, 97, 179, 29, 95, 251, 247, 244, + 237, 157, 201, 239, 114, 178, 94, 223, 191, 59, 57, 217, 110, 183, 205, 225, + 130, 182, 253, 241, 110, 122, 163, 93, 76, 205, 199, 235, 147, 91, 184, 204, + 90, 238, 79, 238, 6, 195, 9, 45, 191, 171, 19, 42, 251, 79, 82, 52, + 157, 116, 79, 174, 142, 207, 27, 183, 221, 130, 182, 230, 54, 92, 148, 255, + 50, 45, 119, 148, 255, 156, 246, 39, 237, 35, 27, 161, 67, 231, 208, 75, + 17, 61, 175, 65, 108, 68, 56, 105, 253, 190, 130, 91, 104, 158, 81, 70, + 183, 216, 74, 110, 172, 224, 198, 85, 54, 126, 174, 67, 210, 115, 11, 113, + 208, 242, 149, 214, 23, 15, 45, 38, 89, 155, 27, 13, 117, 60, 213, 102, + 154, 73, 119, 26, 148, 7, 98, 229, 129, 162, 26, 11, 117, 121, 18, 233, + 43, 169, 234, 33, 111, 120, 231, 208, 174, 5, 247, 74, 195, 164, 235, 96, + 44, 233, 107, 178, 241, 153, 88, 121, 188, 143, 236, 71, 205, 209, 137, 93, + 253, 152, 102, 84, 208, 174, 30, 136, 165, 75, 18, 58, 106, 137, 48, 182, + 238, 34, 83, 212, 45, 84, 147, 81, 127, 71, 109, 197, 100, 93, 251, 18, + 8, 80, 137, 90, 160, 155, 4, 76, 72, 212, 74, 89, 239, 203, 215, 86, + 243, 173, 200, 162, 71, 83, 232, 74, 208, 98, 161, 163, 195, 61, 230, 160, + 127, 115, 43, 197, 160, 38, 79, 21, 155, 215, 207, 208, 105, 86, 105, 176, + 64, 224, 123, 203, 86, 230, 139, 105, 33, 212, 159, 126, 240, 29, 162, 1, + 75, 10, 148, 113, 231, 32, 176, 7, 104, 49, 208, 30, 239, 101, 45, 73, + 19, 26, 42, 78, 70, 253, 200, 158, 17, 169, 56, 213, 123, 13, 91, 240, + 73, 92, 53, 149, 102, 31, 75, 199, 43, 201, 26, 25, 245, 216, 173, 107, + 170, 38, 141, 95, 116, 161, 22, 56, 255, 37, 26, 207, 215, 203, 13, 78, + 1, 176, 40, 189, 228, 103, 240, 203, 248, 203, 74, 50, 24, 168, 88, 173, + 160, 206, 44, 161, 186, 62, 106, 51, 102, 165, 102, 19, 223, 133, 61, 190, + 176, 95, 102, 12, 248, 108, 244, 162, 221, 64, 141, 220, 231, 228, 99, 118, + 112, 13, 38, 166, 215, 5, 7, 121, 211, 124, 194, 141, 232, 98, 179, 4, + 244, 227, 4, 94, 30, 135, 176, 127, 72, 71, 113, 42, 149, 142, 229, 230, + 162, 130, 251, 140, 107, 166, 45, 51, 11, 190, 175, 166, 183, 119, 249, 239, + 247, 75, 154, 228, 203, 189, 240, 28, 233, 210, 57, 168, 143, 5, 120, 188, + 132, 99, 156, 247, 185, 101, 220, 113, 157, 133, 246, 227, 214, 124, 40, 156, + 52, 103, 50, 94, 82, 156, 7, 73, 188, 18, 61, 35, 227, 49, 41, 171, + 11, 158, 37, 119, 74, 31, 220, 30, 164, 104, 188, 241, 57, 106, 52, 88, + 126, 30, 207, 249, 36, 197, 105, 248, 185, 147, 220, 108, 224, 35, 231, 25, + 94, 40, 61, 62, 104, 97, 14, 117, 88, 102, 116, 208, 18, 218, 235, 217, + 175, 153, 17, 146, 136, 136, 63, 91, 105, 217, 19, 138, 6, 73, 2, 113, + 168, 253, 104, 117, 197, 207, 68, 169, 60, 61, 92, 180, 37, 232, 51, 99, + 133, 146, 190, 77, 69, 41, 28, 43, 185, 88, 153, 225, 34, 219, 218, 177, + 193, 146, 249, 154, 26, 42, 210, 212, 163, 99, 5, 237, 45, 102, 20, 59, + 236, 66, 240, 118, 176, 89, 173, 166, 131, 57, 235, 49, 156, 209, 242, 44, + 56, 184, 252, 218, 129, 46, 139, 158, 220, 202, 72, 206, 115, 38, 187, 194, + 106, 203, 34, 176, 69, 165, 3, 174, 174, 75, 63, 121, 37, 187, 57, 118, + 236, 230, 24, 169, 143, 178, 63, 198, 221, 131, 163, 15, 31, 101, 18, 118, + 18, 115, 103, 210, 185, 200, 125, 237, 154, 108, 187, 146, 135, 100, 139, 27, + 142, 214, 169, 201, 182, 231, 102, 59, 223, 220, 85, 228, 234, 227, 84, 110, + 86, 36, 9, 64, 80, 173, 169, 237, 153, 155, 219, 91, 196, 53, 159, 222, + 190, 119, 234, 15, 116, 212, 52, 56, 170, 253, 116, 12, 29, 53, 83, 147, + 168, 157, 116, 220, 138, 68, 96, 190, 99, 155, 105, 39, 101, 144, 244, 123, + 77, 252, 12, 67, 192, 147, 62, 136, 52, 106, 93, 68, 219, 214, 172, 169, + 244, 211, 232, 25, 206, 141, 104, 11, 62, 243, 161, 220, 198, 134, 164, 17, + 59, 172, 93, 193, 51, 151, 79, 60, 10, 189, 107, 51, 85, 171, 246, 212, + 209, 122, 99, 12, 82, 215, 238, 209, 233, 243, 130, 47, 75, 140, 255, 142, + 171, 226, 188, 60, 99, 242, 186, 212, 90, 42, 91, 37, 250, 118, 213, 223, + 96, 150, 74, 167, 54, 174, 188, 183, 189, 22, 45, 175, 107, 86, 243, 218, + 226, 47, 165, 241, 103, 171, 228, 137, 24, 228, 90, 208, 147, 163, 100, 151, + 189, 201, 224, 40, 168, 238, 93, 187, 236, 69, 134, 161, 22, 103, 171, 208, + 9, 141, 253, 250, 45, 235, 190, 25, 94, 2, 150, 83, 45, 191, 32, 106, + 59, 23, 117, 176, 83, 81, 137, 119, 159, 173, 148, 95, 154, 116, 28, 157, + 15, 190, 179, 62, 76, 83, 90, 194, 203, 141, 189, 201, 105, 68, 30, 235, + 36, 37, 79, 15, 137, 210, 124, 84, 172, 10, 60, 162, 156, 227, 188, 95, + 169, 68, 141, 135, 106, 61, 104, 215, 30, 170, 135, 55, 128, 18, 228, 140, + 66, 155, 29, 157, 93, 56, 147, 80, 253, 209, 186, 102, 158, 193, 31, 210, + 251, 174, 75, 95, 49, 50, 189, 252, 25, 38, 198, 143, 74, 178, 253, 168, + 180, 13, 178, 214, 178, 185, 18, 33, 107, 111, 133, 171, 131, 239, 42, 250, + 44, 111, 175, 5, 199, 0, 191, 211, 187, 91, 48, 30, 55, 55, 27, 172, + 51, 180, 240, 175, 22, 203, 213, 37, 133, 94, 1, 45, 23, 224, 184, 128, + 195, 5, 244, 45, 104, 163, 239, 110, 189, 250, 112, 50, 192, 201, 113, 117, + 169, 131, 112, 206, 95, 77, 156, 215, 216, 82, 249, 103, 56, 3, 104, 27, + 37, 76, 62, 247, 181, 44, 122, 89, 16, 195, 80, 46, 226, 18, 244, 210, + 236, 69, 225, 19, 213, 66, 161, 46, 102, 100, 47, 103, 165, 195, 111, 183, + 147, 90, 112, 246, 46, 56, 3, 144, 174, 98, 57, 57, 1, 148, 3, 45, + 23, 202, 65, 19, 118, 150, 96, 84, 219, 185, 28, 98, 209, 188, 186, 146, + 103, 75, 115, 17, 74, 19, 192, 187, 185, 164, 111, 52, 75, 107, 222, 245, + 248, 118, 58, 175, 120, 127, 33, 110, 215, 183, 198, 108, 151, 165, 96, 123, + 13, 211, 249, 201, 117, 233, 170, 122, 46, 75, 105, 127, 73, 113, 228, 233, + 214, 60, 93, 155, 167, 1, 61, 61, 240, 125, 42, 37, 166, 116, 21, 154, + 13, 148, 148, 150, 121, 250, 16, 68, 237, 218, 253, 244, 36, 58, 107, 157, + 123, 195, 13, 5, 92, 194, 52, 176, 66, 31, 171, 33, 45, 145, 252, 224, + 95, 209, 183, 7, 254, 214, 24, 110, 128, 251, 68, 191, 212, 125, 20, 252, + 35, 133, 222, 109, 102, 149, 225, 134, 194, 194, 184, 234, 215, 177, 224, 212, + 56, 232, 33, 164, 255, 98, 42, 137, 254, 251, 68, 241, 190, 63, 247, 190, + 195, 159, 202, 235, 82, 160, 123, 170, 20, 126, 50, 85, 217, 84, 238, 167, + 244, 242, 111, 92, 208, 119, 48, 167, 251, 14, 101, 169, 31, 26, 129, 87, + 181, 202, 143, 181, 194, 250, 33, 143, 59, 152, 199, 79, 145, 185, 238, 70, + 206, 220, 127, 61, 220, 208, 66, 31, 55, 132, 136, 180, 14, 196, 98, 202, + 247, 29, 75, 165, 124, 228, 92, 173, 178, 105, 62, 102, 147, 170, 139, 68, + 174, 84, 6, 116, 182, 136, 43, 255, 134, 42, 252, 27, 197, 175, 190, 169, + 192, 184, 178, 138, 115, 249, 137, 122, 172, 190, 9, 58, 231, 48, 82, 212, + 109, 163, 14, 149, 102, 77, 137, 237, 77, 32, 191, 174, 97, 33, 132, 96, + 226, 156, 166, 205, 77, 133, 149, 166, 40, 34, 119, 79, 137, 39, 28, 69, + 13, 225, 181, 193, 116, 46, 155, 34, 202, 108, 170, 22, 164, 226, 25, 246, + 229, 164, 28, 45, 53, 76, 64, 12, 170, 171, 180, 221, 198, 17, 92, 23, + 19, 243, 214, 137, 25, 61, 27, 243, 218, 137, 25, 31, 137, 57, 90, 14, + 182, 168, 57, 13, 240, 82, 120, 169, 234, 18, 170, 146, 212, 223, 107, 245, + 119, 112, 21, 126, 242, 27, 254, 95, 226, 76, 139, 58, 128, 12, 148, 37, + 6, 189, 244, 169, 228, 125, 190, 164, 252, 242, 171, 14, 100, 130, 244, 1, + 43, 130, 44, 50, 16, 235, 185, 26, 134, 188, 21, 5, 171, 122, 37, 88, + 189, 193, 237, 181, 43, 136, 204, 47, 155, 138, 239, 25, 14, 150, 235, 5, + 59, 185, 204, 34, 100, 46, 239, 199, 115, 214, 92, 49, 59, 24, 51, 229, + 70, 138, 44, 30, 118, 80, 56, 158, 212, 42, 52, 16, 131, 233, 12, 11, + 174, 11, 249, 22, 193, 160, 3, 61, 210, 86, 72, 153, 170, 102, 73, 36, + 162, 127, 83, 191, 36, 86, 239, 250, 14, 64, 243, 179, 92, 203, 36, 50, + 154, 42, 110, 101, 147, 179, 35, 114, 15, 93, 233, 118, 120, 70, 251, 120, + 215, 179, 148, 50, 122, 171, 109, 5, 174, 217, 85, 232, 154, 177, 134, 215, + 108, 106, 108, 247, 72, 235, 149, 156, 101, 101, 132, 121, 154, 100, 80, 0, + 93, 136, 244, 208, 183, 205, 102, 105, 161, 229, 42, 128, 172, 233, 72, 246, + 59, 26, 216, 61, 232, 178, 82, 137, 219, 212, 66, 217, 97, 90, 160, 237, + 243, 4, 146, 21, 220, 187, 102, 147, 0, 41, 24, 165, 70, 90, 38, 167, + 241, 54, 20, 134, 102, 125, 60, 186, 101, 199, 100, 202, 59, 4, 16, 54, + 137, 167, 23, 149, 171, 172, 220, 17, 98, 238, 219, 235, 120, 54, 128, 191, + 39, 152, 106, 15, 33, 69, 96, 204, 109, 22, 116, 94, 54, 58, 12, 247, + 48, 132, 217, 95, 76, 81, 155, 77, 207, 108, 113, 77, 17, 84, 18, 227, + 48, 111, 42, 184, 104, 109, 209, 63, 112, 69, 239, 122, 112, 131, 18, 253, + 241, 108, 54, 189, 95, 137, 101, 202, 144, 150, 63, 86, 216, 90, 14, 70, + 211, 141, 140, 97, 213, 116, 40, 128, 186, 254, 26, 212, 229, 151, 80, 211, + 228, 241, 85, 78, 27, 184, 52, 237, 68, 65, 74, 52, 208, 150, 174, 37, + 238, 145, 27, 168, 76, 245, 67, 168, 165, 176, 213, 120, 186, 81, 22, 236, + 181, 211, 82, 154, 212, 10, 177, 10, 18, 182, 148, 3, 1, 128, 233, 31, + 107, 86, 122, 248, 17, 135, 48, 189, 219, 220, 249, 82, 107, 141, 63, 105, + 36, 210, 81, 202, 73, 162, 202, 6, 215, 21, 108, 229, 88, 197, 173, 76, + 246, 25, 182, 173, 249, 71, 98, 157, 171, 7, 220, 38, 211, 91, 79, 214, + 213, 195, 209, 103, 12, 57, 183, 123, 55, 215, 211, 21, 188, 251, 185, 50, + 93, 72, 7, 204, 124, 120, 159, 116, 91, 34, 10, 86, 151, 253, 70, 248, + 97, 167, 87, 170, 223, 101, 106, 74, 190, 223, 178, 90, 233, 179, 113, 55, + 179, 18, 9, 234, 175, 169, 72, 114, 154, 186, 188, 160, 67, 148, 86, 197, + 119, 113, 129, 143, 172, 75, 82, 187, 208, 51, 205, 119, 238, 48, 186, 45, + 247, 18, 195, 113, 79, 17, 131, 20, 18, 14, 51, 234, 244, 45, 246, 169, + 185, 218, 56, 205, 45, 83, 89, 90, 100, 175, 50, 180, 191, 135, 212, 42, + 68, 43, 148, 30, 64, 234, 214, 162, 205, 106, 4, 97, 198, 40, 218, 115, + 87, 185, 174, 104, 243, 151, 224, 242, 1, 54, 169, 65, 44, 127, 218, 242, + 167, 83, 122, 198, 17, 68, 222, 61, 215, 39, 7, 230, 76, 75, 113, 129, + 87, 79, 27, 227, 71, 253, 41, 98, 20, 133, 218, 182, 54, 57, 169, 116, + 106, 193, 39, 246, 80, 14, 189, 47, 173, 96, 86, 5, 35, 13, 152, 160, + 10, 140, 144, 62, 30, 206, 131, 143, 85, 226, 161, 131, 143, 138, 59, 14, + 62, 137, 225, 76, 35, 248, 100, 216, 99, 14, 155, 168, 176, 20, 14, 5, + 43, 62, 193, 186, 180, 76, 223, 66, 250, 87, 134, 173, 41, 189, 186, 111, + 242, 42, 111, 236, 184, 128, 35, 211, 187, 39, 75, 35, 231, 53, 165, 104, + 149, 72, 219, 65, 183, 207, 233, 145, 42, 88, 9, 62, 54, 24, 174, 85, + 63, 2, 241, 200, 190, 196, 238, 75, 27, 26, 115, 148, 75, 151, 26, 147, + 210, 204, 194, 145, 193, 53, 193, 181, 141, 125, 138, 227, 110, 131, 175, 113, + 232, 129, 142, 100, 7, 156, 53, 158, 132, 199, 62, 120, 46, 250, 70, 93, + 14, 33, 77, 1, 226, 232, 8, 64, 145, 75, 139, 71, 10, 85, 40, 68, + 88, 197, 41, 129, 254, 214, 136, 124, 167, 157, 40, 128, 121, 90, 232, 84, + 127, 58, 120, 236, 16, 162, 147, 218, 81, 56, 57, 111, 32, 209, 149, 87, + 105, 68, 241, 217, 121, 176, 61, 15, 38, 231, 80, 25, 170, 95, 139, 35, + 53, 222, 168, 62, 94, 68, 62, 116, 33, 63, 106, 101, 52, 68, 150, 83, + 33, 3, 216, 106, 74, 68, 222, 94, 161, 71, 13, 212, 223, 189, 242, 205, + 165, 180, 49, 35, 40, 48, 42, 153, 143, 209, 97, 212, 72, 24, 151, 250, + 10, 172, 254, 124, 36, 215, 209, 3, 252, 32, 164, 128, 130, 100, 222, 131, + 189, 236, 111, 39, 211, 37, 223, 211, 26, 117, 145, 252, 130, 37, 113, 16, + 253, 217, 187, 170, 227, 26, 21, 86, 79, 134, 232, 122, 100, 221, 113, 106, + 19, 122, 169, 170, 57, 104, 227, 185, 171, 208, 99, 85, 211, 70, 61, 89, + 77, 152, 168, 224, 118, 51, 119, 111, 114, 218, 210, 119, 37, 24, 33, 198, + 61, 135, 255, 155, 203, 70, 36, 70, 205, 188, 172, 52, 149, 49, 34, 59, + 4, 199, 48, 106, 138, 216, 2, 9, 198, 196, 83, 204, 192, 82, 20, 82, + 93, 93, 42, 62, 67, 242, 95, 133, 216, 241, 81, 98, 215, 117, 254, 66, + 106, 169, 143, 161, 115, 156, 167, 243, 63, 68, 225, 103, 120, 64, 161, 36, + 19, 178, 25, 11, 222, 130, 127, 237, 199, 134, 45, 132, 11, 64, 224, 57, + 10, 100, 24, 176, 52, 91, 28, 43, 54, 20, 102, 121, 200, 124, 52, 222, + 105, 228, 71, 204, 176, 249, 157, 242, 9, 49, 63, 136, 215, 21, 237, 31, + 172, 136, 141, 115, 213, 224, 168, 87, 68, 119, 95, 65, 190, 170, 23, 5, + 250, 154, 5, 127, 100, 47, 98, 90, 33, 155, 239, 36, 148, 243, 233, 35, + 62, 64, 254, 8, 193, 156, 42, 233, 122, 60, 153, 178, 95, 162, 151, 238, + 253, 186, 94, 234, 24, 162, 107, 150, 232, 240, 12, 238, 127, 86, 237, 62, + 237, 29, 91, 221, 231, 30, 155, 138, 41, 189, 64, 34, 185, 0, 105, 171, + 180, 130, 7, 156, 81, 22, 76, 19, 209, 176, 12, 80, 162, 119, 80, 20, + 45, 195, 192, 194, 85, 119, 200, 9, 103, 25, 68, 57, 159, 233, 5, 68, + 75, 51, 9, 218, 40, 210, 220, 200, 166, 208, 11, 185, 217, 142, 214, 124, + 71, 28, 0, 228, 157, 227, 25, 141, 35, 227, 19, 47, 135, 112, 90, 99, + 248, 111, 128, 151, 238, 139, 162, 0, 220, 180, 22, 40, 31, 120, 114, 123, + 80, 16, 139, 118, 56, 205, 48, 212, 2, 185, 154, 205, 243, 23, 190, 145, + 213, 241, 9, 135, 54, 190, 197, 114, 4, 203, 18, 45, 223, 237, 75, 72, + 243, 39, 191, 197, 186, 173, 254, 163, 31, 72, 144, 183, 4, 36, 58, 27, + 37, 141, 118, 85, 198, 77, 149, 151, 125, 26, 92, 157, 171, 54, 218, 93, + 240, 214, 129, 120, 252, 190, 215, 239, 30, 252, 83, 109, 235, 29, 86, 244, + 190, 27, 112, 62, 246, 165, 192, 164, 218, 212, 88, 252, 23, 104, 176, 119, + 5, 147, 22, 192, 11, 224, 72, 252, 140, 51, 216, 22, 67, 109, 137, 194, + 97, 219, 231, 205, 189, 198, 78, 123, 196, 51, 66, 141, 83, 176, 9, 241, + 11, 34, 238, 29, 12, 12, 87, 111, 81, 169, 253, 123, 202, 187, 2, 215, + 29, 128, 133, 205, 172, 221, 176, 117, 234, 164, 84, 127, 93, 55, 73, 153, + 134, 241, 249, 147, 10, 182, 232, 146, 45, 105, 107, 215, 24, 50, 7, 43, + 255, 111, 162, 223, 2, 251, 33, 122, 151, 158, 1, 145, 17, 16, 219, 0, + 86, 75, 246, 141, 211, 207, 220, 110, 33, 71, 31, 58, 92, 171, 147, 200, + 15, 23, 45, 94, 138, 150, 234, 111, 234, 156, 33, 43, 150, 62, 130, 40, + 93, 187, 11, 246, 39, 40, 231, 151, 236, 46, 147, 202, 253, 102, 58, 131, + 201, 240, 87, 157, 64, 127, 80, 39, 143, 165, 18, 158, 56, 30, 55, 223, + 100, 79, 32, 14, 242, 156, 86, 90, 182, 26, 35, 189, 99, 27, 85, 170, + 138, 161, 151, 161, 71, 202, 25, 223, 193, 106, 190, 183, 205, 115, 55, 57, + 51, 207, 184, 156, 234, 165, 213, 174, 162, 55, 71, 143, 38, 71, 136, 147, + 81, 131, 164, 243, 235, 244, 200, 202, 147, 61, 141, 88, 101, 200, 110, 193, + 30, 169, 69, 109, 94, 221, 96, 127, 194, 165, 213, 110, 239, 10, 193, 197, + 71, 136, 115, 205, 9, 223, 1, 77, 22, 226, 11, 103, 13, 177, 43, 243, + 42, 96, 109, 137, 113, 62, 161, 217, 131, 137, 242, 182, 101, 85, 168, 124, + 103, 60, 135, 81, 74, 107, 178, 227, 141, 169, 111, 253, 146, 199, 102, 220, + 62, 223, 95, 223, 47, 102, 34, 222, 73, 252, 232, 92, 125, 248, 8, 9, + 120, 175, 182, 157, 156, 88, 100, 169, 115, 15, 86, 233, 149, 57, 3, 173, + 250, 243, 247, 31, 67, 58, 98, 204, 67, 111, 103, 196, 194, 27, 118, 40, + 90, 61, 39, 134, 215, 6, 77, 56, 72, 159, 241, 97, 230, 30, 138, 106, + 242, 180, 242, 154, 234, 11, 179, 119, 224, 194, 124, 95, 121, 221, 146, 23, + 145, 141, 186, 241, 27, 148, 160, 145, 75, 209, 218, 253, 73, 253, 207, 38, + 62, 9, 186, 42, 125, 181, 228, 241, 212, 43, 246, 135, 166, 144, 199, 167, + 203, 113, 95, 132, 79, 52, 245, 248, 65, 239, 250, 208, 24, 153, 111, 152, + 46, 188, 239, 167, 230, 97, 86, 166, 57, 191, 22, 120, 109, 241, 24, 180, + 30, 44, 249, 186, 152, 131, 240, 93, 57, 16, 161, 33, 233, 242, 129, 223, + 141, 231, 227, 37, 212, 8, 80, 11, 205, 119, 177, 34, 174, 212, 8, 170, + 4, 47, 158, 167, 156, 68, 207, 66, 167, 238, 70, 132, 153, 246, 157, 153, + 17, 123, 242, 187, 105, 132, 220, 136, 167, 155, 1, 158, 196, 117, 169, 130, + 198, 28, 247, 67, 102, 201, 26, 122, 41, 26, 59, 211, 217, 189, 248, 101, + 160, 72, 231, 178, 218, 117, 174, 9, 117, 73, 135, 193, 112, 98, 49, 23, + 113, 161, 156, 105, 246, 192, 97, 56, 94, 56, 69, 68, 97, 102, 252, 11, + 136, 157, 158, 247, 74, 36, 25, 133, 190, 67, 205, 34, 175, 68, 142, 36, + 181, 19, 122, 180, 71, 8, 17, 67, 95, 19, 208, 215, 170, 187, 76, 63, + 121, 145, 229, 233, 244, 57, 181, 104, 190, 78, 174, 223, 98, 253, 161, 181, + 160, 47, 183, 203, 77, 11, 19, 50, 189, 217, 179, 131, 62, 81, 230, 197, + 70, 10, 236, 13, 249, 229, 83, 232, 121, 75, 64, 205, 176, 80, 84, 0, + 42, 249, 115, 167, 122, 210, 177, 122, 104, 221, 26, 238, 76, 79, 171, 245, + 160, 231, 57, 238, 214, 204, 189, 29, 203, 70, 155, 162, 151, 128, 85, 73, + 9, 107, 217, 253, 81, 231, 141, 8, 103, 205, 41, 136, 119, 56, 237, 128, + 207, 122, 59, 11, 141, 11, 95, 230, 210, 155, 30, 195, 153, 207, 212, 189, + 55, 172, 178, 89, 183, 237, 34, 9, 122, 98, 145, 95, 9, 46, 26, 65, + 175, 250, 166, 18, 156, 214, 163, 42, 46, 164, 17, 81, 41, 119, 50, 159, + 15, 223, 138, 57, 157, 228, 138, 96, 240, 59, 255, 126, 110, 133, 173, 220, + 59, 213, 133, 78, 236, 88, 31, 216, 10, 173, 171, 113, 60, 219, 64, 198, + 145, 145, 34, 70, 73, 198, 49, 193, 112, 205, 237, 163, 161, 75, 139, 194, + 104, 188, 30, 76, 103, 162, 240, 236, 234, 9, 253, 192, 34, 209, 217, 222, + 77, 240, 226, 211, 156, 155, 41, 171, 202, 28, 115, 54, 160, 115, 102, 151, + 181, 182, 94, 169, 41, 117, 102, 149, 27, 82, 186, 13, 69, 53, 204, 10, + 226, 80, 13, 159, 171, 33, 103, 188, 221, 16, 14, 111, 59, 237, 182, 183, + 199, 83, 220, 235, 116, 189, 209, 120, 182, 30, 64, 44, 236, 13, 91, 208, + 30, 106, 71, 167, 244, 52, 133, 78, 72, 251, 248, 80, 182, 251, 157, 30, + 47, 160, 61, 29, 3, 49, 233, 223, 152, 203, 0, 171, 251, 8, 6, 61, + 224, 178, 106, 219, 19, 139, 234, 1, 166, 92, 5, 79, 156, 224, 93, 139, + 130, 119, 195, 6, 241, 147, 39, 241, 193, 219, 227, 117, 143, 215, 61, 94, + 119, 17, 127, 173, 235, 175, 17, 127, 173, 171, 175, 0, 243, 24, 207, 174, + 151, 11, 112, 176, 187, 86, 24, 236, 233, 223, 142, 182, 167, 61, 76, 9, + 49, 62, 2, 106, 41, 126, 166, 94, 93, 116, 22, 149, 207, 31, 99, 192, + 166, 134, 125, 207, 139, 122, 90, 16, 230, 204, 160, 244, 56, 75, 33, 12, + 50, 150, 218, 244, 50, 14, 219, 124, 174, 101, 173, 128, 102, 84, 195, 92, + 21, 127, 220, 75, 104, 245, 210, 102, 189, 28, 223, 78, 87, 180, 81, 211, + 34, 48, 95, 78, 111, 167, 35, 125, 18, 46, 5, 171, 82, 216, 45, 133, + 5, 49, 218, 2, 53, 241, 76, 140, 46, 197, 232, 152, 24, 172, 115, 66, + 156, 114, 231, 138, 143, 208, 71, 184, 213, 219, 153, 28, 161, 139, 5, 27, + 35, 58, 237, 46, 110, 214, 18, 235, 27, 197, 71, 111, 142, 236, 41, 156, + 103, 232, 169, 10, 88, 137, 209, 155, 244, 5, 69, 170, 252, 163, 230, 82, + 95, 22, 97, 40, 193, 31, 251, 116, 195, 147, 248, 22, 227, 77, 65, 225, + 13, 68, 133, 162, 134, 201, 96, 118, 179, 198, 82, 245, 14, 106, 167, 60, + 155, 136, 97, 136, 149, 63, 25, 40, 244, 217, 183, 235, 165, 96, 211, 198, + 124, 93, 122, 47, 230, 84, 10, 142, 7, 122, 128, 163, 233, 224, 110, 49, + 31, 9, 32, 236, 116, 57, 156, 141, 89, 21, 112, 58, 127, 104, 152, 88, + 29, 126, 181, 49, 187, 252, 174, 98, 31, 242, 18, 141, 204, 249, 192, 84, + 119, 52, 5, 170, 153, 66, 45, 123, 57, 219, 97, 218, 40, 210, 8, 211, + 200, 228, 204, 188, 74, 43, 85, 0, 55, 179, 155, 187, 171, 56, 126, 89, + 97, 42, 24, 122, 14, 105, 221, 11, 139, 3, 172, 213, 181, 209, 133, 125, + 105, 187, 47, 217, 27, 139, 14, 37, 99, 32, 88, 161, 163, 128, 192, 42, + 34, 42, 12, 88, 166, 160, 64, 192, 90, 130, 211, 123, 71, 222, 109, 228, + 174, 4, 168, 4, 153, 35, 70, 49, 125, 211, 227, 18, 192, 94, 76, 195, + 208, 7, 233, 180, 119, 182, 208, 23, 202, 169, 247, 78, 200, 78, 224, 130, + 14, 28, 192, 129, 140, 226, 244, 58, 115, 253, 145, 27, 212, 52, 68, 115, + 72, 234, 114, 27, 6, 196, 105, 163, 251, 195, 242, 57, 70, 186, 246, 217, + 73, 114, 124, 112, 205, 225, 245, 117, 7, 174, 66, 130, 247, 80, 166, 130, + 170, 21, 188, 130, 50, 150, 73, 176, 194, 121, 24, 103, 102, 3, 193, 234, + 232, 158, 3, 108, 224, 77, 251, 160, 236, 36, 141, 174, 57, 251, 151, 11, + 93, 231, 114, 226, 10, 13, 170, 100, 90, 83, 90, 137, 203, 219, 254, 123, + 109, 201, 245, 94, 74, 109, 210, 250, 248, 134, 25, 27, 248, 86, 230, 243, + 15, 52, 217, 26, 193, 133, 32, 178, 216, 4, 23, 153, 4, 88, 146, 27, + 180, 212, 95, 48, 146, 166, 65, 117, 7, 131, 211, 245, 177, 192, 227, 155, + 85, 75, 175, 187, 74, 219, 142, 101, 214, 0, 216, 160, 185, 169, 79, 7, + 254, 207, 227, 245, 112, 114, 157, 91, 35, 195, 148, 213, 136, 62, 193, 227, + 156, 129, 37, 197, 158, 38, 216, 5, 124, 216, 159, 174, 250, 55, 131, 213, + 186, 64, 192, 168, 135, 213, 114, 228, 255, 254, 55, 255, 238, 75, 121, 223, + 116, 211, 152, 18, 217, 139, 15, 81, 14, 154, 223, 202, 81, 223, 189, 95, + 14, 229, 128, 209, 79, 105, 74, 24, 100, 121, 174, 234, 81, 65, 116, 138, + 44, 49, 181, 238, 20, 18, 37, 136, 151, 252, 187, 241, 72, 107, 199, 198, + 126, 125, 182, 0, 250, 245, 114, 12, 93, 234, 49, 45, 184, 155, 37, 127, + 105, 203, 218, 171, 123, 100, 65, 159, 103, 3, 129, 189, 67, 2, 47, 67, + 118, 171, 91, 97, 238, 178, 91, 246, 50, 91, 188, 96, 89, 48, 232, 236, + 108, 61, 70, 214, 227, 59, 137, 99, 30, 18, 59, 242, 0, 145, 74, 130, + 104, 169, 3, 130, 246, 73, 31, 155, 35, 58, 236, 238, 228, 6, 194, 220, + 77, 90, 118, 137, 53, 64, 69, 55, 243, 56, 119, 197, 170, 147, 203, 7, + 120, 236, 230, 219, 47, 5, 192, 220, 241, 235, 124, 102, 208, 252, 122, 45, + 239, 100, 17, 197, 254, 125, 51, 37, 138, 138, 44, 75, 180, 250, 162, 22, + 157, 21, 78, 122, 184, 85, 103, 7, 82, 109, 177, 172, 207, 241, 220, 44, + 232, 59, 90, 43, 87, 224, 153, 175, 33, 213, 134, 22, 150, 116, 5, 115, + 183, 52, 68, 80, 115, 75, 163, 231, 225, 253, 130, 88, 175, 225, 108, 177, + 25, 1, 205, 97, 133, 31, 118, 224, 222, 104, 116, 67, 133, 179, 47, 144, + 17, 19, 192, 209, 43, 79, 146, 43, 96, 17, 64, 132, 234, 0, 233, 26, + 33, 34, 68, 136, 245, 6, 139, 84, 234, 90, 143, 100, 229, 96, 89, 179, + 187, 86, 64, 29, 168, 223, 1, 151, 198, 119, 155, 124, 139, 106, 175, 122, + 249, 245, 137, 221, 75, 195, 225, 132, 231, 128, 82, 184, 0, 21, 53, 237, + 40, 32, 229, 25, 192, 20, 192, 145, 136, 232, 123, 93, 142, 41, 112, 239, + 89, 183, 44, 232, 186, 103, 80, 80, 114, 157, 101, 124, 29, 79, 198, 116, + 42, 93, 165, 117, 30, 178, 171, 11, 162, 124, 203, 197, 148, 150, 246, 69, + 199, 23, 3, 41, 157, 54, 115, 93, 13, 215, 211, 112, 118, 58, 114, 61, + 148, 96, 238, 25, 205, 129, 231, 110, 252, 232, 216, 169, 71, 83, 100, 70, + 147, 92, 246, 205, 141, 61, 148, 220, 249, 245, 185, 188, 183, 187, 83, 207, + 152, 41, 53, 51, 70, 241, 38, 138, 255, 206, 171, 188, 85, 142, 35, 24, + 7, 7, 66, 102, 26, 60, 24, 53, 97, 135, 1, 99, 112, 161, 76, 49, + 40, 144, 70, 102, 151, 152, 255, 6, 162, 55, 58, 85, 58, 68, 193, 134, + 15, 126, 115, 250, 203, 153, 193, 92, 156, 44, 54, 183, 19, 119, 255, 112, + 119, 12, 165, 109, 164, 181, 83, 82, 187, 5, 187, 50, 112, 92, 24, 60, + 44, 214, 12, 171, 8, 134, 47, 215, 181, 40, 228, 31, 221, 57, 116, 55, + 159, 165, 180, 146, 82, 18, 165, 179, 86, 118, 11, 145, 221, 66, 215, 13, + 21, 63, 198, 233, 215, 211, 148, 160, 177, 146, 161, 140, 195, 253, 157, 185, + 34, 36, 71, 50, 68, 220, 95, 43, 101, 250, 208, 178, 55, 84, 142, 71, + 146, 142, 145, 51, 117, 185, 70, 41, 52, 149, 47, 82, 236, 184, 38, 139, + 81, 122, 202, 42, 218, 89, 121, 49, 43, 215, 105, 114, 8, 243, 102, 215, + 253, 163, 171, 42, 229, 165, 153, 177, 252, 189, 19, 148, 112, 186, 70, 87, + 133, 158, 137, 57, 75, 1, 188, 46, 39, 11, 250, 154, 136, 70, 196, 246, + 231, 184, 62, 249, 57, 134, 51, 17, 161, 176, 15, 53, 212, 16, 63, 230, + 68, 142, 245, 153, 207, 235, 125, 222, 107, 155, 202, 62, 159, 87, 236, 246, + 27, 63, 181, 24, 123, 47, 92, 140, 135, 128, 195, 156, 175, 148, 203, 94, + 90, 153, 195, 216, 195, 198, 192, 206, 89, 78, 80, 252, 1, 22, 245, 79, + 129, 212, 86, 133, 212, 69, 49, 164, 38, 235, 52, 62, 111, 81, 113, 86, + 26, 209, 225, 234, 195, 4, 31, 176, 10, 54, 101, 241, 198, 3, 165, 102, + 93, 24, 29, 157, 213, 71, 218, 140, 46, 219, 106, 121, 172, 68, 131, 104, + 180, 15, 208, 113, 175, 209, 189, 242, 26, 28, 157, 31, 89, 167, 134, 90, + 117, 197, 238, 151, 122, 33, 194, 254, 137, 187, 130, 66, 231, 112, 246, 134, + 142, 247, 235, 238, 13, 26, 104, 157, 14, 27, 203, 193, 30, 139, 50, 145, + 133, 22, 21, 53, 162, 223, 39, 198, 160, 95, 59, 34, 150, 23, 185, 51, + 167, 36, 116, 6, 132, 249, 151, 90, 169, 246, 174, 236, 188, 80, 224, 13, + 199, 218, 51, 241, 88, 200, 34, 88, 24, 61, 191, 88, 230, 189, 82, 11, + 145, 159, 210, 150, 115, 76, 253, 251, 187, 204, 187, 249, 110, 171, 202, 38, + 99, 10, 203, 35, 93, 97, 150, 142, 31, 69, 131, 215, 36, 10, 253, 58, + 148, 187, 213, 52, 113, 73, 87, 172, 75, 23, 165, 150, 160, 40, 35, 194, + 118, 78, 166, 96, 87, 223, 8, 191, 138, 135, 188, 252, 58, 75, 187, 227, + 139, 144, 180, 94, 38, 169, 207, 230, 200, 237, 106, 40, 233, 153, 6, 250, + 210, 42, 37, 223, 46, 56, 68, 122, 105, 25, 244, 5, 76, 35, 222, 248, + 227, 13, 17, 104, 52, 30, 204, 99, 92, 31, 45, 21, 102, 143, 74, 58, + 91, 220, 198, 149, 109, 213, 158, 249, 226, 159, 129, 148, 104, 44, 79, 132, + 37, 217, 204, 25, 25, 60, 130, 101, 83, 151, 71, 41, 160, 213, 182, 24, + 229, 79, 81, 189, 18, 116, 234, 128, 217, 168, 34, 164, 133, 133, 68, 176, + 0, 68, 197, 10, 174, 60, 224, 166, 91, 110, 142, 83, 95, 218, 198, 51, + 152, 28, 240, 236, 105, 142, 107, 26, 155, 154, 75, 157, 205, 98, 87, 56, + 33, 20, 112, 141, 156, 231, 174, 153, 10, 162, 194, 223, 135, 153, 39, 60, + 192, 200, 187, 210, 122, 215, 97, 88, 212, 67, 150, 132, 200, 7, 101, 39, + 233, 40, 200, 239, 102, 97, 127, 79, 255, 30, 241, 143, 157, 46, 154, 115, + 33, 142, 127, 130, 178, 120, 55, 184, 63, 122, 6, 84, 21, 227, 156, 191, + 66, 104, 3, 95, 53, 124, 250, 115, 26, 3, 65, 46, 31, 0, 115, 77, + 210, 119, 69, 169, 134, 177, 217, 35, 5, 234, 230, 137, 149, 228, 110, 166, + 195, 247, 179, 228, 113, 38, 41, 173, 233, 235, 163, 114, 243, 89, 132, 185, + 81, 216, 238, 99, 60, 36, 14, 134, 116, 92, 76, 245, 14, 213, 159, 184, + 46, 156, 42, 91, 94, 166, 219, 44, 70, 116, 83, 105, 219, 43, 252, 13, + 182, 143, 84, 119, 195, 26, 143, 35, 46, 192, 112, 100, 96, 157, 72, 112, + 117, 34, 5, 171, 147, 99, 85, 179, 157, 241, 156, 31, 187, 70, 208, 163, + 173, 32, 194, 159, 115, 247, 229, 103, 122, 57, 101, 44, 189, 83, 250, 16, + 201, 11, 255, 249, 57, 56, 11, 131, 179, 115, 254, 173, 186, 24, 78, 184, + 185, 96, 68, 219, 150, 85, 39, 97, 235, 122, 81, 190, 194, 38, 37, 170, + 132, 250, 157, 141, 20, 249, 178, 134, 37, 30, 111, 212, 5, 116, 250, 88, + 24, 188, 181, 155, 208, 208, 115, 238, 162, 245, 60, 50, 19, 10, 18, 108, + 62, 53, 33, 174, 163, 102, 151, 136, 220, 167, 7, 159, 144, 80, 212, 14, + 78, 229, 201, 149, 11, 193, 35, 164, 104, 122, 68, 222, 9, 155, 210, 183, + 13, 239, 2, 43, 122, 40, 35, 241, 119, 98, 56, 96, 141, 22, 121, 86, + 199, 147, 173, 4, 68, 252, 19, 78, 63, 104, 8, 161, 52, 166, 142, 192, + 10, 80, 253, 134, 71, 231, 247, 92, 76, 109, 83, 123, 29, 203, 95, 196, + 78, 119, 58, 191, 149, 45, 205, 224, 106, 50, 75, 141, 217, 108, 61, 97, + 113, 12, 14, 0, 60, 194, 116, 37, 254, 254, 250, 176, 167, 17, 121, 238, + 230, 122, 141, 59, 23, 58, 101, 179, 80, 119, 48, 26, 77, 249, 37, 59, + 159, 85, 117, 94, 192, 144, 3, 86, 126, 48, 187, 165, 142, 89, 79, 104, + 3, 0, 8, 253, 234, 126, 42, 238, 176, 213, 110, 202, 34, 199, 241, 106, + 184, 156, 94, 83, 48, 101, 166, 112, 69, 0, 43, 226, 151, 21, 154, 136, + 148, 216, 188, 27, 159, 12, 174, 23, 155, 117, 249, 197, 106, 233, 134, 60, + 73, 44, 56, 90, 6, 183, 181, 35, 27, 109, 202, 85, 152, 40, 144, 164, + 73, 4, 63, 100, 50, 247, 153, 80, 199, 230, 186, 162, 73, 7, 179, 122, + 238, 218, 69, 243, 254, 218, 41, 222, 95, 227, 36, 118, 15, 2, 108, 123, + 108, 183, 94, 147, 198, 218, 57, 199, 214, 208, 89, 193, 192, 94, 47, 22, + 179, 138, 32, 243, 84, 179, 7, 130, 92, 63, 29, 223, 129, 13, 157, 248, + 36, 224, 194, 179, 210, 81, 32, 227, 226, 43, 100, 199, 50, 190, 161, 144, + 6, 237, 161, 150, 150, 26, 48, 253, 142, 234, 65, 47, 116, 70, 83, 168, + 71, 18, 44, 194, 65, 197, 2, 241, 175, 194, 41, 211, 165, 224, 24, 65, + 135, 8, 119, 182, 63, 173, 104, 73, 235, 253, 182, 245, 78, 89, 227, 224, + 34, 248, 2, 71, 5, 128, 242, 179, 61, 24, 21, 239, 26, 121, 182, 75, + 135, 223, 42, 235, 207, 118, 109, 91, 125, 71, 71, 22, 154, 178, 172, 227, + 38, 176, 89, 241, 104, 255, 229, 132, 19, 73, 56, 145, 132, 184, 59, 22, + 15, 184, 84, 43, 227, 159, 53, 160, 73, 121, 189, 185, 173, 202, 197, 240, + 171, 167, 26, 252, 234, 110, 47, 217, 35, 192, 205, 116, 77, 131, 123, 60, + 158, 95, 94, 253, 228, 63, 69, 225, 37, 173, 26, 87, 7, 246, 95, 164, + 244, 91, 96, 54, 63, 175, 192, 4, 240, 83, 213, 79, 252, 202, 39, 42, + 64, 245, 60, 30, 223, 111, 95, 67, 207, 144, 223, 34, 251, 33, 186, 122, + 63, 193, 135, 170, 214, 131, 33, 34, 179, 38, 140, 126, 215, 221, 155, 224, + 203, 111, 49, 230, 26, 212, 213, 239, 2, 163, 56, 99, 251, 60, 129, 9, + 3, 240, 86, 69, 119, 70, 62, 235, 174, 160, 60, 59, 58, 204, 246, 57, + 133, 118, 77, 204, 187, 88, 10, 143, 168, 136, 184, 70, 207, 231, 30, 80, + 27, 216, 8, 116, 123, 178, 125, 221, 10, 253, 201, 201, 228, 53, 115, 247, + 176, 56, 197, 93, 12, 176, 127, 160, 158, 195, 134, 145, 45, 85, 203, 233, + 135, 215, 173, 119, 211, 187, 215, 20, 58, 90, 248, 21, 239, 47, 20, 14, + 136, 234, 85, 229, 117, 11, 22, 131, 58, 222, 165, 255, 151, 203, 179, 171, + 240, 47, 151, 111, 161, 112, 254, 151, 203, 136, 6, 253, 213, 59, 132, 118, + 16, 218, 149, 208, 83, 54, 111, 165, 236, 41, 213, 95, 46, 41, 29, 189, + 93, 143, 87, 235, 190, 216, 135, 202, 227, 195, 173, 202, 147, 10, 158, 223, + 40, 197, 161, 207, 162, 56, 244, 249, 189, 105, 48, 20, 136, 62, 135, 198, + 202, 21, 182, 60, 198, 230, 118, 244, 41, 109, 115, 235, 107, 163, 86, 62, + 201, 92, 33, 194, 9, 123, 124, 128, 238, 227, 232, 19, 84, 140, 160, 180, + 36, 69, 183, 196, 176, 246, 83, 235, 92, 225, 128, 87, 100, 60, 16, 181, + 62, 81, 86, 20, 169, 158, 76, 229, 237, 156, 234, 240, 241, 220, 255, 84, + 79, 70, 159, 170, 95, 159, 172, 33, 201, 232, 211, 73, 242, 241, 28, 131, + 183, 130, 118, 87, 40, 224, 66, 211, 162, 250, 14, 175, 239, 205, 107, 152, + 162, 210, 195, 237, 185, 239, 16, 16, 77, 100, 203, 96, 135, 0, 250, 179, + 162, 130, 125, 61, 74, 138, 231, 154, 161, 90, 80, 79, 100, 136, 213, 204, + 144, 125, 25, 21, 158, 75, 222, 112, 147, 215, 48, 92, 179, 121, 68, 58, + 15, 60, 52, 116, 30, 106, 90, 28, 175, 202, 63, 152, 151, 170, 23, 122, + 231, 85, 69, 79, 148, 55, 113, 183, 85, 13, 61, 227, 196, 58, 209, 179, + 59, 73, 48, 123, 48, 187, 223, 41, 59, 31, 32, 9, 96, 200, 55, 124, + 124, 169, 158, 84, 244, 58, 160, 2, 96, 137, 188, 153, 87, 202, 38, 175, + 114, 248, 176, 166, 142, 211, 239, 85, 85, 184, 114, 60, 45, 43, 91, 137, + 10, 231, 84, 245, 225, 101, 116, 101, 245, 5, 120, 165, 11, 233, 151, 15, + 252, 80, 133, 95, 47, 154, 185, 28, 195, 50, 173, 223, 252, 95, 23, 82, + 206, 45, 24, 41, 136, 28, 249, 148, 95, 174, 122, 50, 136, 234, 117, 221, + 90, 216, 37, 143, 7, 159, 249, 56, 88, 161, 47, 253, 10, 19, 19, 195, + 26, 227, 149, 154, 113, 161, 26, 69, 195, 149, 222, 222, 235, 55, 218, 1, + 63, 55, 173, 229, 102, 177, 98, 192, 221, 98, 53, 152, 14, 11, 152, 169, + 44, 118, 167, 50, 31, 84, 241, 191, 210, 211, 177, 238, 159, 246, 49, 134, + 65, 101, 27, 122, 166, 62, 14, 191, 208, 206, 232, 132, 201, 126, 174, 98, + 126, 121, 63, 127, 94, 204, 28, 198, 97, 121, 243, 30, 10, 45, 181, 10, + 157, 143, 171, 63, 119, 126, 123, 185, 9, 163, 171, 50, 51, 201, 158, 203, + 248, 138, 113, 211, 150, 168, 177, 92, 77, 198, 35, 35, 103, 206, 195, 65, + 229, 200, 188, 152, 141, 250, 247, 147, 197, 122, 145, 97, 30, 33, 95, 228, + 240, 151, 240, 143, 46, 193, 108, 134, 230, 201, 127, 151, 161, 80, 81, 230, + 246, 128, 195, 226, 117, 63, 110, 249, 215, 44, 53, 95, 210, 238, 219, 110, + 133, 189, 86, 214, 202, 67, 52, 223, 250, 55, 155, 199, 199, 189, 127, 246, + 38, 164, 255, 122, 161, 62, 169, 40, 245, 127, 193, 35, 243, 129, 31, 163, + 143, 229, 212, 140, 251, 233, 64, 187, 80, 24, 207, 135, 211, 153, 136, 199, + 13, 46, 223, 51, 70, 54, 16, 219, 74, 154, 111, 51, 29, 151, 195, 110, + 59, 7, 6, 220, 59, 54, 254, 76, 5, 105, 89, 177, 117, 205, 159, 65, + 123, 185, 19, 100, 97, 85, 51, 22, 221, 114, 81, 47, 66, 27, 123, 5, + 89, 224, 1, 187, 192, 30, 71, 244, 9, 83, 22, 217, 29, 152, 222, 104, + 251, 28, 182, 5, 180, 250, 89, 16, 17, 167, 37, 35, 69, 218, 46, 236, + 198, 14, 126, 129, 216, 172, 6, 120, 176, 56, 20, 60, 249, 117, 58, 234, + 52, 160, 126, 50, 216, 77, 87, 244, 190, 163, 247, 61, 253, 123, 164, 127, + 59, 60, 236, 119, 248, 122, 137, 164, 12, 201, 164, 125, 71, 93, 81, 32, + 220, 84, 92, 101, 58, 114, 224, 151, 197, 101, 158, 74, 81, 118, 14, 64, + 199, 48, 21, 205, 241, 103, 42, 199, 31, 62, 251, 88, 76, 69, 117, 8, + 90, 13, 214, 251, 193, 114, 61, 225, 99, 16, 188, 0, 207, 198, 171, 19, + 46, 171, 161, 202, 58, 121, 198, 98, 71, 55, 185, 206, 106, 183, 104, 236, + 206, 241, 137, 149, 106, 90, 130, 118, 37, 21, 218, 78, 196, 253, 224, 49, + 247, 88, 117, 165, 248, 57, 150, 219, 111, 58, 77, 215, 13, 153, 249, 104, + 27, 238, 89, 159, 18, 202, 147, 46, 253, 213, 66, 87, 89, 173, 151, 81, + 82, 198, 104, 171, 31, 202, 231, 62, 191, 38, 229, 122, 25, 70, 176, 234, + 165, 81, 230, 243, 78, 137, 35, 199, 136, 28, 39, 59, 21, 57, 166, 239, + 59, 29, 25, 47, 123, 247, 229, 209, 125, 217, 165, 62, 237, 119, 38, 215, + 50, 206, 93, 135, 50, 180, 55, 217, 3, 113, 22, 196, 138, 142, 2, 37, + 39, 110, 231, 185, 184, 29, 196, 45, 177, 178, 14, 122, 148, 70, 32, 81, + 85, 20, 118, 6, 230, 21, 123, 107, 57, 104, 151, 95, 65, 146, 138, 124, + 203, 65, 7, 47, 153, 57, 86, 54, 244, 42, 235, 73, 102, 101, 53, 24, + 38, 208, 176, 121, 186, 44, 7, 17, 187, 193, 170, 151, 15, 116, 180, 226, + 62, 166, 17, 53, 91, 16, 123, 134, 46, 198, 92, 241, 100, 66, 74, 31, + 251, 166, 143, 245, 189, 63, 123, 90, 225, 219, 126, 198, 65, 202, 85, 45, + 249, 47, 169, 154, 91, 157, 228, 159, 75, 41, 151, 32, 171, 241, 127, 86, + 97, 148, 189, 107, 218, 237, 140, 10, 159, 161, 187, 218, 12, 122, 12, 121, + 24, 46, 96, 23, 171, 113, 223, 224, 37, 97, 209, 172, 43, 7, 40, 138, + 36, 146, 166, 163, 211, 88, 7, 133, 202, 75, 33, 67, 81, 8, 172, 179, + 72, 155, 13, 154, 19, 238, 199, 160, 5, 117, 247, 0, 144, 9, 214, 200, + 224, 234, 38, 79, 255, 81, 58, 71, 51, 184, 21, 191, 45, 191, 47, 191, + 43, 95, 148, 75, 255, 113, 144, 82, 227, 50, 207, 61, 98, 205, 236, 188, + 14, 4, 101, 219, 218, 138, 209, 137, 29, 218, 89, 170, 35, 57, 201, 158, + 146, 208, 49, 251, 110, 67, 236, 213, 126, 247, 56, 244, 191, 156, 222, 119, + 227, 167, 50, 123, 116, 50, 123, 220, 237, 191, 46, 179, 199, 93, 58, 179, + 221, 190, 176, 53, 191, 90, 101, 247, 187, 47, 55, 253, 43, 11, 243, 210, + 166, 90, 2, 23, 225, 36, 123, 167, 46, 240, 158, 70, 20, 181, 233, 151, + 222, 121, 127, 223, 76, 135, 159, 241, 173, 178, 107, 133, 187, 136, 150, 231, + 71, 150, 56, 192, 225, 212, 240, 179, 133, 152, 162, 177, 17, 215, 182, 135, + 18, 152, 111, 254, 196, 251, 57, 159, 85, 239, 55, 171, 73, 101, 60, 91, + 183, 66, 250, 137, 56, 53, 199, 184, 52, 241, 234, 245, 43, 10, 69, 20, + 172, 210, 197, 159, 0, 255, 115, 191, 184, 175, 112, 250, 254, 42, 146, 99, + 62, 69, 109, 52, 76, 228, 171, 115, 226, 156, 90, 71, 190, 92, 210, 167, + 144, 18, 2, 53, 106, 181, 29, 220, 87, 6, 225, 181, 100, 182, 102, 12, + 169, 193, 185, 15, 200, 172, 107, 58, 175, 210, 31, 4, 86, 85, 221, 185, + 229, 244, 162, 206, 103, 38, 211, 139, 22, 29, 113, 232, 164, 138, 118, 114, + 213, 206, 189, 217, 2, 182, 65, 8, 163, 221, 236, 220, 155, 76, 205, 107, + 68, 175, 247, 211, 135, 197, 90, 224, 170, 0, 224, 180, 174, 84, 40, 126, + 221, 159, 76, 129, 197, 10, 210, 134, 45, 91, 204, 108, 241, 62, 153, 76, + 67, 253, 202, 105, 102, 11, 21, 43, 136, 56, 47, 136, 24, 102, 11, 155, + 134, 3, 131, 136, 227, 82, 90, 137, 27, 250, 141, 198, 100, 202, 149, 67, + 142, 191, 165, 156, 95, 241, 95, 166, 194, 247, 54, 223, 170, 88, 26, 73, + 194, 106, 149, 165, 0, 179, 197, 185, 78, 142, 99, 160, 106, 217, 123, 74, + 206, 164, 209, 1, 161, 46, 64, 55, 86, 62, 83, 190, 58, 0, 25, 32, + 11, 233, 185, 215, 16, 45, 69, 74, 116, 178, 107, 137, 236, 100, 215, 122, + 207, 130, 159, 122, 157, 40, 206, 39, 74, 110, 8, 189, 160, 33, 171, 136, + 78, 148, 18, 31, 89, 236, 144, 32, 66, 2, 150, 119, 114, 196, 72, 71, + 76, 146, 136, 179, 65, 175, 165, 70, 48, 228, 114, 59, 248, 100, 108, 53, + 34, 166, 56, 69, 224, 226, 17, 153, 107, 88, 114, 220, 115, 243, 149, 218, + 98, 58, 210, 28, 121, 196, 44, 57, 123, 245, 116, 217, 113, 117, 248, 51, + 177, 213, 50, 63, 253, 90, 110, 28, 106, 66, 154, 193, 66, 25, 199, 221, + 114, 104, 167, 40, 166, 200, 110, 216, 110, 105, 135, 35, 116, 90, 113, 205, + 153, 137, 89, 183, 205, 200, 88, 28, 90, 245, 146, 56, 115, 124, 60, 222, + 166, 44, 162, 52, 22, 154, 149, 66, 149, 86, 252, 59, 111, 86, 13, 81, + 252, 99, 85, 213, 122, 16, 41, 87, 4, 242, 148, 183, 191, 165, 136, 226, + 206, 157, 227, 196, 153, 56, 52, 73, 44, 216, 57, 213, 105, 127, 187, 152, + 139, 129, 72, 31, 170, 110, 25, 109, 212, 156, 161, 59, 35, 195, 2, 223, + 88, 191, 91, 105, 53, 95, 250, 95, 164, 131, 246, 69, 202, 69, 170, 212, + 111, 58, 106, 165, 235, 8, 229, 205, 140, 209, 90, 204, 23, 11, 186, 150, + 208, 226, 121, 147, 190, 123, 232, 239, 18, 183, 130, 212, 121, 199, 20, 140, + 28, 234, 80, 57, 144, 160, 32, 183, 176, 141, 255, 188, 20, 233, 82, 194, + 131, 244, 96, 120, 227, 222, 49, 32, 189, 107, 164, 22, 57, 119, 14, 221, + 36, 232, 164, 244, 138, 62, 217, 18, 82, 16, 11, 32, 65, 70, 181, 212, + 85, 239, 6, 36, 206, 116, 78, 41, 102, 140, 67, 173, 89, 77, 219, 102, + 216, 199, 119, 160, 245, 83, 32, 168, 168, 95, 227, 26, 45, 117, 145, 223, + 196, 221, 159, 99, 121, 106, 109, 70, 161, 16, 205, 214, 165, 39, 212, 174, + 186, 150, 43, 78, 239, 170, 33, 255, 253, 32, 96, 230, 171, 157, 6, 6, + 63, 166, 143, 212, 97, 131, 250, 78, 184, 61, 9, 58, 85, 81, 21, 167, + 100, 251, 47, 37, 235, 178, 145, 125, 55, 156, 156, 80, 91, 36, 217, 253, + 108, 48, 135, 243, 56, 190, 157, 68, 209, 252, 187, 247, 107, 208, 114, 193, + 149, 5, 123, 144, 107, 49, 164, 36, 180, 138, 68, 19, 137, 152, 47, 86, + 190, 105, 157, 63, 105, 79, 212, 162, 141, 148, 118, 37, 214, 244, 247, 205, + 166, 199, 250, 62, 68, 142, 83, 6, 15, 219, 23, 40, 46, 61, 138, 190, + 160, 226, 39, 40, 213, 227, 112, 231, 58, 78, 64, 255, 65, 142, 167, 84, + 74, 83, 186, 14, 38, 209, 112, 183, 127, 84, 62, 207, 168, 88, 255, 111, + 128, 6, 68, 130, 51, 214, 156, 18, 16, 26, 108, 22, 56, 233, 177, 14, + 79, 10, 253, 69, 193, 195, 136, 147, 190, 150, 103, 102, 3, 53, 189, 16, + 134, 0, 87, 52, 53, 117, 201, 82, 71, 76, 105, 2, 235, 111, 233, 196, + 126, 189, 41, 66, 41, 136, 161, 94, 34, 166, 194, 229, 241, 151, 37, 85, + 196, 94, 67, 247, 70, 27, 126, 30, 83, 117, 55, 225, 88, 138, 199, 234, + 250, 85, 69, 116, 113, 2, 57, 8, 182, 10, 131, 217, 116, 176, 82, 55, + 179, 12, 228, 205, 229, 40, 128, 58, 99, 154, 215, 13, 51, 31, 50, 73, + 115, 43, 23, 226, 42, 29, 164, 111, 89, 190, 50, 218, 241, 157, 150, 81, + 153, 231, 118, 137, 122, 100, 186, 89, 90, 181, 34, 215, 50, 117, 97, 90, + 208, 48, 0, 114, 203, 230, 119, 188, 113, 199, 21, 241, 83, 61, 130, 45, + 47, 213, 65, 47, 185, 87, 77, 27, 232, 182, 156, 229, 175, 155, 94, 253, + 212, 155, 199, 250, 77, 246, 54, 182, 139, 158, 49, 150, 250, 69, 194, 88, + 167, 35, 242, 242, 175, 172, 54, 61, 45, 144, 28, 196, 36, 230, 5, 82, + 197, 48, 48, 98, 237, 208, 227, 32, 151, 64, 108, 74, 19, 116, 149, 165, + 227, 226, 198, 79, 209, 146, 201, 155, 13, 113, 19, 191, 12, 1, 209, 99, + 64, 227, 48, 74, 225, 219, 242, 162, 43, 6, 254, 198, 84, 118, 128, 102, + 51, 196, 12, 219, 202, 176, 18, 20, 95, 27, 134, 184, 116, 104, 136, 40, + 25, 86, 129, 0, 22, 171, 81, 138, 55, 48, 148, 105, 190, 125, 75, 209, + 136, 81, 131, 113, 43, 69, 140, 210, 17, 137, 59, 112, 226, 182, 88, 35, + 144, 150, 164, 97, 211, 152, 19, 116, 12, 194, 17, 103, 211, 109, 193, 97, + 204, 65, 235, 96, 157, 208, 8, 48, 127, 91, 205, 179, 240, 109, 75, 251, + 6, 237, 50, 40, 134, 192, 241, 224, 150, 87, 25, 6, 117, 26, 172, 83, + 26, 116, 235, 180, 94, 215, 218, 113, 61, 174, 30, 116, 146, 158, 42, 139, + 227, 235, 210, 122, 166, 180, 158, 42, 173, 151, 41, 237, 25, 88, 70, 53, + 116, 39, 139, 251, 113, 26, 119, 52, 63, 179, 255, 59, 226, 80, 108, 22, + 172, 234, 209, 245, 245, 154, 237, 41, 16, 209, 99, 92, 133, 173, 148, 153, + 93, 170, 138, 46, 31, 81, 52, 236, 159, 175, 229, 51, 184, 158, 197, 48, + 19, 192, 93, 26, 220, 15, 253, 146, 18, 238, 194, 234, 6, 196, 166, 25, + 19, 149, 12, 24, 166, 127, 10, 220, 50, 191, 76, 59, 199, 244, 85, 210, + 13, 167, 225, 180, 206, 110, 172, 246, 111, 226, 106, 181, 12, 59, 177, 118, + 28, 118, 78, 207, 245, 223, 184, 245, 22, 155, 80, 219, 62, 188, 165, 92, + 59, 148, 105, 167, 123, 46, 151, 79, 141, 232, 60, 238, 182, 195, 56, 134, + 2, 252, 89, 53, 179, 89, 194, 200, 90, 0, 205, 52, 206, 89, 206, 193, + 226, 104, 58, 131, 230, 180, 108, 24, 134, 25, 82, 251, 2, 133, 57, 200, + 140, 162, 169, 3, 89, 182, 217, 37, 178, 46, 46, 90, 26, 223, 73, 1, + 205, 90, 181, 28, 118, 173, 176, 100, 141, 28, 49, 179, 163, 151, 156, 134, + 157, 174, 77, 69, 91, 77, 111, 86, 141, 217, 244, 243, 184, 234, 24, 37, + 124, 155, 193, 85, 17, 184, 163, 105, 138, 6, 252, 204, 186, 99, 56, 181, + 168, 80, 6, 237, 201, 105, 214, 49, 176, 39, 211, 140, 40, 166, 243, 66, + 200, 44, 111, 203, 207, 168, 118, 3, 6, 170, 87, 152, 188, 32, 98, 212, + 115, 50, 109, 133, 157, 176, 211, 226, 64, 53, 220, 122, 90, 229, 184, 83, + 156, 216, 115, 186, 185, 248, 180, 69, 219, 78, 108, 183, 157, 52, 10, 165, + 179, 239, 116, 92, 158, 188, 147, 156, 186, 200, 47, 93, 209, 234, 235, 185, + 64, 83, 153, 110, 205, 89, 150, 20, 89, 119, 165, 65, 41, 77, 31, 177, + 10, 15, 45, 163, 110, 7, 133, 202, 1, 186, 163, 186, 51, 88, 222, 254, + 228, 71, 245, 87, 65, 47, 212, 195, 44, 148, 161, 119, 40, 41, 8, 213, + 35, 170, 59, 233, 61, 101, 249, 32, 118, 99, 61, 127, 62, 190, 101, 111, + 52, 112, 99, 195, 94, 219, 0, 144, 14, 61, 184, 185, 49, 217, 84, 176, + 149, 157, 170, 39, 88, 161, 79, 180, 44, 7, 23, 53, 128, 197, 152, 79, + 196, 15, 66, 145, 146, 175, 134, 7, 224, 139, 105, 255, 128, 43, 230, 90, + 16, 159, 136, 210, 94, 32, 136, 167, 17, 118, 172, 86, 243, 84, 223, 26, + 241, 246, 69, 59, 84, 202, 48, 146, 245, 202, 243, 21, 92, 62, 20, 46, + 223, 174, 145, 11, 124, 243, 160, 28, 139, 156, 162, 145, 86, 197, 217, 6, + 203, 70, 68, 199, 206, 234, 152, 167, 193, 87, 12, 30, 210, 245, 173, 114, + 64, 231, 218, 91, 230, 214, 136, 193, 124, 186, 90, 172, 233, 244, 191, 207, + 156, 132, 21, 30, 181, 114, 14, 34, 46, 191, 86, 253, 235, 197, 194, 53, + 196, 228, 48, 222, 174, 71, 71, 53, 115, 211, 134, 34, 95, 107, 79, 45, + 228, 16, 205, 58, 135, 32, 73, 135, 185, 69, 135, 42, 73, 36, 86, 54, + 74, 163, 189, 157, 193, 178, 206, 24, 113, 182, 196, 11, 204, 173, 118, 252, + 194, 10, 188, 14, 58, 83, 106, 1, 82, 54, 159, 150, 84, 38, 138, 139, + 34, 163, 177, 177, 181, 27, 22, 78, 99, 72, 230, 24, 136, 42, 122, 29, + 197, 41, 54, 3, 34, 122, 169, 249, 167, 103, 199, 144, 231, 44, 33, 177, + 57, 117, 183, 65, 29, 119, 113, 104, 183, 92, 165, 251, 255, 143, 189, 119, + 239, 111, 219, 56, 22, 134, 255, 199, 167, 128, 97, 184, 188, 129, 20, 0, + 146, 178, 45, 9, 242, 73, 211, 166, 199, 191, 183, 113, 251, 38, 237, 155, + 228, 145, 21, 150, 34, 41, 17, 49, 111, 15, 47, 18, 105, 154, 223, 253, + 157, 203, 94, 1, 144, 146, 28, 185, 77, 207, 105, 90, 139, 192, 98, 175, + 179, 179, 179, 179, 179, 115, 105, 230, 92, 197, 240, 203, 43, 225, 64, 138, + 223, 94, 27, 198, 66, 14, 43, 254, 226, 87, 21, 120, 36, 178, 189, 214, + 96, 36, 18, 214, 230, 119, 148, 54, 127, 75, 133, 133, 15, 233, 234, 55, + 18, 145, 60, 49, 20, 73, 209, 21, 240, 62, 35, 35, 188, 104, 151, 184, + 17, 152, 235, 196, 64, 136, 128, 49, 33, 80, 56, 16, 200, 165, 33, 167, + 61, 16, 51, 30, 168, 169, 14, 244, 28, 7, 134, 122, 186, 154, 212, 64, + 206, 103, 160, 231, 17, 122, 95, 143, 90, 59, 71, 32, 30, 241, 171, 190, + 104, 59, 42, 8, 116, 6, 167, 83, 212, 207, 99, 181, 253, 75, 160, 60, + 150, 28, 2, 57, 2, 242, 173, 233, 228, 226, 93, 160, 7, 6, 221, 83, + 223, 232, 170, 111, 244, 213, 87, 157, 117, 186, 66, 237, 183, 135, 66, 122, + 95, 12, 22, 157, 88, 49, 119, 202, 125, 36, 39, 121, 113, 32, 221, 83, + 93, 160, 64, 117, 248, 60, 188, 68, 81, 131, 107, 252, 247, 28, 29, 104, + 160, 36, 22, 40, 58, 28, 19, 132, 226, 10, 233, 207, 44, 212, 24, 213, + 164, 200, 83, 59, 213, 45, 221, 107, 177, 239, 226, 196, 45, 123, 190, 49, + 103, 30, 134, 172, 246, 207, 189, 170, 231, 27, 179, 231, 29, 121, 186, 54, + 79, 235, 193, 113, 77, 61, 20, 188, 11, 93, 184, 209, 64, 169, 19, 46, + 48, 89, 40, 198, 81, 242, 223, 56, 214, 2, 10, 201, 255, 78, 234, 99, + 127, 131, 62, 85, 161, 116, 13, 158, 162, 203, 234, 162, 27, 240, 131, 72, + 138, 49, 9, 85, 200, 80, 150, 236, 249, 114, 182, 189, 224, 239, 71, 73, + 153, 194, 218, 212, 104, 19, 47, 255, 29, 165, 221, 206, 223, 233, 170, 213, + 87, 184, 224, 92, 35, 140, 188, 170, 51, 93, 225, 149, 192, 244, 150, 254, + 174, 174, 233, 249, 154, 47, 55, 166, 233, 26, 83, 249, 15, 166, 165, 148, + 184, 193, 119, 254, 67, 137, 17, 229, 164, 146, 41, 165, 212, 49, 5, 175, + 29, 60, 95, 224, 177, 231, 86, 165, 192, 251, 58, 216, 92, 3, 151, 209, + 172, 156, 121, 190, 194, 119, 239, 141, 231, 75, 84, 247, 78, 80, 178, 61, + 29, 83, 13, 168, 66, 57, 157, 241, 32, 167, 51, 216, 19, 92, 146, 146, + 247, 71, 44, 85, 239, 143, 160, 22, 70, 14, 15, 133, 226, 253, 81, 224, + 112, 87, 24, 73, 214, 215, 168, 190, 181, 209, 9, 155, 107, 161, 207, 5, + 185, 158, 37, 212, 237, 79, 159, 92, 200, 129, 47, 208, 49, 234, 101, 20, + 64, 122, 0, 175, 149, 106, 130, 253, 64, 141, 185, 217, 169, 43, 6, 9, + 127, 79, 229, 72, 83, 170, 143, 160, 134, 30, 206, 34, 53, 60, 98, 163, + 224, 211, 109, 254, 83, 36, 62, 209, 144, 86, 215, 85, 40, 93, 67, 152, + 87, 111, 175, 207, 96, 72, 144, 146, 0, 0, 221, 91, 250, 69, 17, 254, + 117, 45, 89, 93, 159, 58, 27, 248, 189, 133, 95, 158, 36, 76, 225, 137, + 194, 52, 154, 67, 209, 204, 85, 176, 185, 50, 123, 144, 255, 100, 247, 224, + 170, 10, 165, 177, 7, 87, 213, 219, 43, 234, 193, 149, 232, 193, 149, 236, + 193, 85, 61, 89, 93, 65, 15, 224, 247, 246, 234, 84, 160, 12, 166, 48, + 218, 96, 26, 163, 138, 128, 250, 21, 65, 93, 39, 108, 174, 20, 212, 175, + 8, 234, 87, 12, 117, 122, 129, 46, 41, 168, 95, 1, 212, 175, 114, 80, + 167, 17, 172, 175, 8, 234, 244, 76, 245, 33, 86, 191, 21, 215, 210, 18, + 153, 121, 109, 141, 8, 245, 4, 90, 156, 146, 151, 59, 196, 220, 141, 64, + 214, 149, 6, 72, 176, 65, 72, 33, 148, 50, 105, 132, 130, 251, 80, 152, + 114, 60, 18, 129, 133, 116, 26, 135, 25, 7, 107, 72, 28, 85, 87, 193, + 134, 126, 111, 225, 189, 38, 222, 107, 244, 62, 157, 81, 7, 222, 242, 173, + 248, 184, 193, 119, 153, 31, 208, 34, 10, 37, 123, 251, 236, 158, 22, 179, + 41, 94, 216, 73, 21, 171, 236, 137, 90, 124, 254, 156, 67, 52, 25, 254, + 238, 59, 63, 215, 68, 197, 129, 163, 58, 160, 109, 195, 155, 217, 189, 82, + 228, 217, 103, 28, 206, 65, 187, 132, 194, 212, 61, 138, 123, 202, 66, 60, + 14, 15, 91, 136, 59, 29, 225, 87, 7, 99, 218, 239, 53, 17, 23, 121, + 78, 216, 48, 231, 69, 140, 154, 45, 232, 200, 128, 131, 89, 16, 223, 46, + 90, 240, 249, 68, 110, 71, 238, 178, 68, 176, 162, 3, 236, 122, 26, 197, + 55, 141, 87, 152, 233, 213, 177, 16, 206, 242, 119, 57, 111, 203, 46, 234, + 21, 117, 110, 70, 221, 133, 246, 103, 40, 238, 115, 72, 72, 38, 196, 166, + 46, 144, 111, 56, 214, 76, 58, 139, 1, 250, 152, 2, 92, 91, 20, 240, + 178, 202, 226, 80, 212, 235, 114, 189, 143, 212, 216, 100, 191, 132, 194, 44, + 68, 244, 129, 236, 196, 20, 115, 200, 202, 224, 251, 109, 64, 236, 97, 197, + 33, 221, 214, 56, 217, 193, 90, 226, 203, 23, 230, 77, 141, 136, 248, 102, + 70, 98, 206, 33, 147, 53, 194, 125, 130, 23, 237, 17, 80, 140, 67, 6, + 181, 64, 88, 214, 53, 44, 173, 115, 95, 51, 24, 76, 186, 192, 193, 246, + 3, 152, 87, 122, 216, 121, 5, 248, 152, 142, 147, 109, 58, 198, 128, 88, + 117, 216, 93, 199, 25, 22, 137, 5, 246, 66, 70, 111, 169, 146, 170, 67, + 89, 52, 128, 51, 253, 51, 244, 79, 198, 183, 3, 200, 72, 142, 6, 203, + 233, 68, 4, 246, 54, 11, 217, 34, 125, 20, 255, 99, 147, 2, 215, 48, + 42, 24, 140, 171, 154, 39, 11, 192, 192, 152, 126, 35, 228, 69, 33, 5, + 163, 86, 183, 190, 231, 44, 133, 185, 2, 150, 6, 166, 68, 197, 38, 53, + 197, 54, 69, 183, 143, 223, 5, 157, 63, 5, 157, 223, 171, 195, 92, 81, + 32, 21, 238, 192, 163, 142, 83, 218, 33, 197, 11, 62, 239, 64, 87, 133, + 119, 75, 164, 69, 205, 88, 136, 89, 100, 119, 165, 27, 3, 45, 162, 111, + 190, 42, 118, 158, 249, 93, 242, 167, 228, 247, 228, 127, 221, 142, 198, 178, + 239, 140, 195, 157, 15, 28, 9, 69, 75, 238, 97, 225, 107, 100, 94, 44, + 54, 99, 195, 118, 9, 79, 26, 202, 93, 1, 118, 205, 18, 172, 107, 15, + 184, 109, 235, 12, 242, 146, 188, 189, 147, 21, 35, 90, 20, 226, 169, 198, + 127, 37, 236, 24, 247, 70, 119, 81, 176, 46, 12, 60, 142, 130, 16, 233, + 164, 202, 111, 185, 18, 122, 150, 176, 164, 109, 223, 94, 30, 7, 28, 119, + 198, 45, 251, 47, 3, 52, 100, 124, 93, 201, 4, 132, 9, 165, 111, 156, + 200, 112, 133, 131, 253, 104, 146, 103, 77, 191, 141, 242, 18, 188, 17, 35, + 191, 148, 248, 224, 55, 157, 81, 67, 250, 74, 104, 73, 89, 116, 92, 165, + 88, 200, 214, 155, 184, 74, 3, 238, 92, 56, 168, 50, 131, 41, 112, 148, + 5, 102, 117, 234, 175, 67, 21, 241, 10, 18, 73, 3, 72, 122, 129, 150, + 81, 37, 66, 182, 113, 18, 111, 24, 180, 72, 61, 31, 99, 125, 242, 205, + 118, 187, 171, 186, 185, 24, 94, 108, 49, 184, 199, 249, 142, 67, 87, 92, + 3, 93, 151, 48, 33, 39, 53, 28, 1, 82, 5, 17, 140, 92, 89, 33, + 235, 154, 209, 179, 14, 65, 178, 199, 143, 249, 80, 120, 50, 63, 106, 17, + 151, 166, 14, 101, 45, 39, 214, 1, 57, 208, 77, 137, 107, 4, 232, 8, + 3, 43, 116, 71, 198, 145, 1, 18, 10, 220, 160, 40, 217, 127, 71, 161, + 76, 202, 17, 121, 27, 229, 152, 24, 236, 84, 51, 27, 15, 196, 109, 169, + 184, 24, 232, 211, 70, 121, 134, 128, 134, 218, 194, 117, 193, 252, 86, 25, + 148, 206, 80, 95, 17, 239, 111, 201, 191, 55, 193, 67, 92, 242, 54, 94, + 182, 171, 228, 166, 20, 111, 122, 197, 203, 16, 95, 208, 135, 67, 213, 143, + 119, 142, 136, 151, 209, 48, 38, 25, 35, 37, 134, 202, 75, 184, 29, 32, + 158, 220, 57, 48, 52, 37, 133, 99, 1, 60, 208, 56, 118, 224, 33, 169, + 83, 70, 70, 132, 26, 149, 50, 134, 114, 142, 59, 18, 117, 124, 142, 128, + 88, 184, 82, 201, 57, 218, 150, 123, 165, 106, 118, 111, 200, 49, 217, 122, + 68, 130, 94, 71, 15, 40, 123, 1, 81, 72, 108, 94, 21, 93, 77, 228, + 7, 148, 247, 143, 189, 90, 228, 181, 21, 88, 203, 165, 233, 234, 94, 163, + 8, 131, 221, 215, 10, 220, 110, 178, 58, 250, 106, 66, 187, 152, 187, 245, + 35, 84, 107, 9, 40, 34, 132, 52, 55, 177, 54, 32, 67, 251, 95, 249, + 106, 62, 120, 251, 67, 18, 149, 229, 231, 27, 0, 48, 247, 18, 229, 29, + 22, 30, 112, 113, 164, 187, 137, 65, 128, 29, 179, 215, 154, 159, 109, 139, + 192, 111, 197, 50, 160, 92, 143, 139, 25, 145, 156, 7, 192, 7, 88, 2, + 72, 23, 51, 20, 106, 148, 233, 30, 158, 1, 106, 194, 179, 37, 185, 188, + 148, 23, 68, 248, 218, 36, 179, 0, 118, 134, 25, 59, 130, 221, 192, 55, + 242, 156, 2, 19, 37, 13, 55, 129, 75, 102, 217, 139, 81, 107, 161, 240, + 119, 185, 17, 142, 107, 47, 240, 113, 192, 186, 222, 151, 65, 231, 58, 237, + 15, 70, 232, 5, 0, 181, 227, 23, 75, 35, 161, 55, 133, 205, 200, 78, + 210, 163, 22, 217, 9, 21, 242, 159, 85, 89, 169, 46, 160, 43, 29, 2, + 35, 219, 37, 118, 36, 157, 164, 34, 250, 57, 63, 106, 149, 26, 44, 69, + 73, 24, 120, 75, 178, 100, 231, 28, 90, 124, 217, 27, 146, 127, 203, 238, + 164, 59, 218, 44, 82, 18, 96, 235, 212, 197, 102, 178, 132, 45, 113, 111, + 50, 118, 187, 59, 18, 220, 210, 24, 191, 15, 172, 161, 24, 169, 230, 16, + 128, 204, 79, 248, 62, 5, 231, 121, 153, 74, 42, 20, 112, 110, 14, 96, + 45, 205, 208, 105, 117, 160, 215, 5, 17, 237, 251, 28, 89, 47, 64, 65, + 209, 14, 127, 163, 210, 30, 43, 220, 171, 58, 122, 211, 49, 58, 198, 245, + 180, 201, 57, 108, 16, 139, 107, 84, 151, 197, 77, 124, 193, 108, 239, 96, + 141, 1, 55, 228, 145, 64, 69, 61, 167, 105, 101, 148, 45, 224, 214, 2, + 119, 69, 23, 233, 93, 140, 142, 186, 76, 235, 212, 9, 151, 32, 84, 135, + 246, 135, 244, 77, 218, 118, 232, 37, 246, 246, 26, 173, 220, 129, 133, 93, + 202, 168, 36, 176, 22, 128, 85, 185, 163, 232, 48, 11, 224, 35, 224, 184, + 210, 15, 200, 208, 3, 214, 207, 140, 92, 201, 224, 11, 247, 67, 193, 29, + 117, 167, 100, 13, 108, 25, 159, 46, 141, 0, 237, 10, 21, 172, 200, 236, + 104, 111, 89, 39, 224, 208, 133, 33, 160, 16, 172, 143, 229, 134, 28, 179, + 50, 195, 4, 51, 210, 199, 144, 236, 10, 187, 157, 195, 241, 187, 93, 25, + 162, 90, 56, 62, 175, 152, 105, 205, 68, 134, 229, 70, 185, 181, 41, 182, + 182, 20, 45, 142, 77, 87, 86, 158, 39, 67, 113, 43, 195, 118, 20, 108, + 115, 53, 47, 101, 153, 151, 103, 73, 211, 204, 242, 42, 137, 142, 69, 158, + 87, 170, 222, 215, 73, 206, 70, 30, 88, 69, 209, 71, 104, 39, 10, 207, + 237, 143, 145, 252, 232, 71, 81, 230, 19, 198, 123, 137, 228, 199, 56, 243, + 81, 141, 83, 165, 144, 152, 94, 182, 179, 141, 218, 150, 6, 102, 116, 108, + 26, 246, 71, 47, 147, 8, 78, 195, 187, 115, 107, 204, 209, 43, 28, 180, + 102, 127, 177, 150, 215, 201, 194, 237, 1, 215, 225, 46, 5, 18, 119, 102, + 189, 174, 112, 63, 142, 148, 45, 128, 159, 245, 38, 192, 59, 174, 9, 191, + 9, 75, 199, 139, 72, 188, 0, 153, 67, 201, 50, 105, 113, 116, 57, 181, + 183, 211, 27, 229, 247, 98, 210, 173, 91, 68, 115, 21, 144, 8, 34, 75, + 223, 222, 59, 121, 2, 103, 164, 229, 40, 220, 158, 143, 69, 101, 153, 182, + 65, 138, 166, 108, 226, 89, 147, 54, 153, 98, 82, 54, 72, 203, 211, 53, + 43, 81, 173, 163, 226, 84, 166, 106, 240, 45, 71, 212, 236, 52, 163, 211, + 69, 4, 13, 146, 243, 228, 12, 18, 77, 98, 134, 175, 57, 90, 150, 192, + 130, 170, 71, 175, 118, 46, 84, 224, 122, 98, 49, 114, 171, 184, 77, 71, + 175, 189, 44, 24, 248, 246, 2, 78, 9, 5, 3, 247, 51, 121, 129, 139, + 70, 183, 125, 189, 80, 242, 222, 113, 141, 2, 0, 230, 251, 42, 115, 70, + 201, 54, 170, 113, 222, 214, 158, 124, 0, 52, 38, 100, 201, 182, 186, 147, + 17, 230, 77, 238, 159, 185, 126, 96, 82, 205, 80, 189, 232, 47, 109, 177, + 67, 144, 138, 129, 171, 118, 70, 211, 155, 50, 249, 100, 224, 91, 141, 224, + 238, 121, 4, 191, 112, 16, 200, 141, 230, 8, 179, 250, 38, 76, 43, 164, + 232, 88, 33, 115, 20, 232, 141, 123, 7, 240, 0, 144, 122, 202, 219, 130, + 235, 137, 187, 28, 244, 181, 64, 164, 215, 199, 60, 24, 101, 249, 226, 79, + 165, 111, 223, 126, 237, 138, 181, 112, 233, 153, 65, 22, 85, 55, 3, 250, + 113, 8, 204, 226, 34, 18, 217, 247, 35, 187, 27, 63, 251, 103, 220, 135, + 103, 156, 140, 81, 219, 105, 245, 249, 70, 193, 23, 129, 253, 166, 79, 91, + 49, 244, 59, 24, 2, 72, 224, 76, 193, 125, 165, 144, 226, 4, 59, 177, + 138, 165, 213, 143, 17, 65, 208, 190, 147, 210, 254, 163, 46, 234, 205, 203, + 64, 255, 33, 37, 76, 242, 7, 215, 194, 20, 249, 7, 227, 197, 119, 133, + 254, 38, 17, 9, 249, 232, 88, 72, 104, 58, 54, 86, 107, 19, 141, 193, + 106, 244, 153, 112, 144, 78, 62, 77, 248, 31, 28, 171, 0, 47, 25, 227, + 118, 250, 25, 125, 16, 21, 45, 26, 22, 97, 75, 207, 64, 113, 224, 49, + 62, 92, 172, 131, 205, 101, 21, 111, 185, 234, 136, 8, 208, 58, 204, 240, + 81, 153, 0, 131, 55, 94, 158, 251, 220, 125, 43, 54, 52, 236, 87, 255, + 121, 61, 6, 154, 106, 107, 3, 11, 77, 46, 163, 203, 177, 139, 126, 54, + 26, 174, 119, 254, 87, 114, 221, 32, 235, 59, 117, 217, 84, 228, 109, 25, + 93, 36, 224, 95, 138, 111, 14, 79, 248, 0, 223, 8, 49, 72, 30, 45, + 156, 173, 234, 154, 45, 38, 43, 44, 184, 38, 52, 60, 31, 225, 60, 220, + 160, 207, 254, 92, 73, 71, 232, 179, 202, 201, 237, 8, 127, 253, 164, 6, + 15, 171, 47, 198, 131, 47, 6, 182, 119, 228, 168, 228, 10, 84, 142, 70, + 118, 46, 153, 202, 147, 55, 17, 186, 23, 144, 168, 90, 23, 136, 138, 32, + 20, 190, 76, 20, 110, 215, 49, 38, 216, 35, 49, 213, 64, 204, 76, 228, + 158, 123, 81, 243, 225, 216, 134, 113, 191, 165, 227, 164, 166, 136, 38, 68, + 190, 147, 154, 168, 153, 125, 183, 224, 232, 98, 152, 30, 201, 244, 225, 145, + 63, 20, 233, 34, 234, 40, 129, 30, 97, 223, 144, 86, 7, 145, 147, 91, + 102, 8, 205, 179, 51, 63, 79, 151, 93, 53, 219, 46, 134, 160, 79, 39, + 171, 1, 9, 194, 73, 235, 95, 99, 189, 95, 180, 209, 20, 38, 70, 138, + 68, 53, 24, 159, 120, 231, 75, 132, 238, 164, 159, 217, 108, 107, 101, 63, + 183, 217, 214, 179, 153, 42, 85, 95, 144, 193, 93, 209, 78, 155, 108, 253, + 253, 155, 179, 217, 64, 193, 230, 92, 63, 80, 84, 53, 203, 240, 147, 25, + 207, 73, 202, 61, 228, 245, 183, 24, 162, 39, 74, 142, 116, 90, 132, 13, + 4, 95, 242, 104, 137, 174, 51, 85, 29, 192, 236, 222, 104, 85, 29, 84, + 228, 1, 62, 167, 168, 43, 124, 145, 64, 202, 153, 145, 206, 128, 49, 238, + 134, 36, 177, 97, 54, 200, 93, 136, 192, 219, 102, 171, 140, 141, 53, 179, + 89, 193, 127, 184, 185, 40, 108, 150, 58, 236, 47, 194, 213, 166, 17, 38, + 70, 132, 197, 16, 131, 198, 240, 221, 216, 162, 210, 58, 167, 65, 94, 26, + 124, 132, 156, 110, 161, 213, 148, 99, 58, 106, 86, 154, 158, 140, 92, 70, + 53, 7, 63, 199, 104, 110, 160, 214, 52, 198, 10, 209, 11, 60, 218, 25, + 109, 139, 79, 226, 13, 191, 9, 140, 172, 225, 205, 14, 237, 138, 188, 80, + 200, 121, 135, 247, 61, 29, 115, 60, 38, 31, 71, 186, 210, 200, 59, 113, + 195, 23, 94, 208, 198, 24, 163, 173, 140, 23, 143, 204, 30, 42, 218, 114, + 140, 189, 130, 22, 101, 33, 239, 82, 144, 6, 83, 203, 187, 137, 248, 141, + 138, 55, 18, 152, 138, 70, 195, 169, 211, 229, 64, 247, 10, 253, 201, 161, + 98, 6, 173, 243, 180, 203, 241, 236, 158, 96, 229, 138, 112, 63, 207, 202, + 254, 249, 139, 54, 236, 66, 100, 252, 173, 7, 137, 122, 126, 21, 39, 11, + 75, 231, 94, 88, 122, 91, 195, 99, 139, 127, 94, 67, 198, 71, 215, 138, + 81, 195, 11, 33, 253, 160, 189, 0, 51, 32, 40, 206, 34, 157, 166, 4, + 137, 108, 186, 241, 144, 106, 168, 200, 190, 92, 31, 120, 255, 80, 153, 13, + 64, 179, 109, 73, 17, 80, 5, 219, 125, 224, 83, 196, 202, 223, 40, 148, + 153, 223, 10, 65, 141, 94, 189, 58, 174, 1, 130, 98, 53, 118, 173, 109, + 68, 156, 142, 151, 131, 229, 60, 165, 11, 32, 130, 118, 238, 94, 88, 124, + 255, 156, 123, 97, 246, 12, 185, 87, 162, 38, 106, 142, 66, 71, 245, 225, + 128, 215, 240, 92, 63, 50, 234, 211, 132, 60, 133, 151, 194, 119, 67, 244, + 149, 44, 236, 131, 48, 68, 231, 156, 180, 34, 229, 63, 193, 92, 74, 191, + 36, 74, 141, 58, 162, 56, 91, 152, 249, 110, 104, 57, 61, 33, 77, 219, + 220, 61, 26, 76, 232, 112, 74, 66, 230, 111, 81, 252, 243, 238, 188, 72, + 9, 113, 68, 90, 140, 89, 243, 201, 111, 215, 239, 220, 175, 38, 253, 141, + 251, 3, 213, 65, 186, 200, 64, 227, 151, 119, 211, 249, 135, 199, 94, 204, + 126, 203, 114, 230, 119, 201, 183, 89, 67, 59, 83, 179, 120, 191, 125, 165, + 24, 70, 147, 88, 213, 86, 232, 168, 97, 233, 0, 12, 102, 192, 87, 60, + 235, 203, 224, 11, 89, 11, 74, 63, 90, 251, 241, 61, 3, 51, 28, 106, + 134, 124, 102, 208, 113, 9, 243, 26, 103, 210, 215, 73, 19, 103, 101, 14, + 211, 70, 127, 34, 57, 133, 106, 234, 142, 105, 54, 219, 204, 228, 0, 71, + 168, 173, 185, 228, 83, 140, 106, 240, 20, 35, 61, 104, 5, 237, 10, 110, + 148, 77, 160, 31, 64, 64, 56, 166, 83, 140, 17, 197, 148, 139, 249, 150, + 180, 178, 64, 4, 49, 246, 186, 77, 239, 170, 55, 143, 105, 47, 171, 9, + 37, 120, 54, 80, 99, 245, 89, 14, 41, 50, 155, 97, 136, 161, 101, 10, + 148, 236, 226, 103, 146, 196, 162, 175, 109, 35, 208, 177, 25, 230, 216, 68, + 40, 180, 193, 202, 56, 140, 207, 222, 185, 10, 75, 43, 182, 119, 213, 170, + 243, 202, 197, 229, 117, 122, 53, 152, 47, 50, 70, 162, 34, 49, 131, 156, + 172, 118, 88, 143, 160, 186, 181, 29, 27, 153, 210, 54, 86, 90, 134, 70, + 112, 87, 181, 98, 44, 73, 235, 246, 161, 44, 235, 186, 90, 130, 184, 208, + 237, 15, 110, 26, 36, 132, 139, 99, 212, 149, 224, 55, 84, 179, 148, 207, + 205, 228, 248, 165, 252, 178, 123, 192, 213, 240, 177, 125, 227, 123, 220, 150, + 138, 10, 112, 34, 111, 133, 182, 214, 2, 125, 203, 130, 138, 84, 105, 59, + 197, 107, 132, 134, 27, 56, 114, 134, 140, 91, 152, 99, 243, 22, 230, 120, + 159, 97, 85, 107, 191, 19, 123, 113, 201, 171, 170, 108, 155, 106, 172, 199, + 73, 62, 22, 162, 37, 0, 36, 77, 87, 72, 173, 243, 181, 241, 43, 117, + 127, 252, 218, 76, 126, 109, 197, 144, 43, 158, 194, 92, 44, 163, 5, 144, + 223, 217, 162, 64, 113, 30, 45, 173, 241, 198, 88, 105, 79, 96, 72, 35, + 143, 193, 105, 42, 221, 179, 242, 188, 72, 183, 239, 144, 133, 66, 165, 135, + 14, 101, 17, 1, 128, 139, 160, 137, 182, 34, 64, 163, 29, 44, 93, 48, + 63, 204, 82, 235, 78, 74, 115, 164, 243, 217, 35, 86, 202, 169, 160, 215, + 124, 255, 14, 163, 53, 147, 41, 150, 223, 100, 155, 170, 157, 59, 19, 124, + 39, 90, 86, 145, 42, 61, 252, 12, 217, 231, 109, 152, 141, 126, 68, 234, + 20, 51, 36, 10, 109, 233, 28, 23, 61, 188, 153, 22, 176, 24, 84, 233, + 238, 69, 165, 178, 99, 22, 199, 191, 131, 221, 90, 6, 83, 186, 167, 42, + 214, 2, 146, 124, 118, 174, 214, 33, 214, 74, 188, 57, 228, 130, 31, 14, + 191, 50, 161, 163, 2, 177, 244, 254, 2, 223, 248, 240, 232, 47, 136, 61, + 192, 29, 16, 47, 133, 49, 51, 202, 182, 245, 65, 20, 175, 129, 196, 139, + 127, 252, 194, 85, 222, 128, 235, 126, 27, 111, 231, 231, 44, 20, 65, 195, + 215, 54, 146, 183, 26, 53, 19, 89, 9, 226, 176, 112, 141, 149, 11, 18, + 217, 18, 36, 18, 141, 25, 108, 170, 233, 0, 78, 116, 48, 16, 224, 43, + 224, 228, 238, 234, 119, 24, 169, 0, 241, 164, 131, 81, 0, 95, 235, 52, + 71, 221, 184, 43, 23, 248, 217, 200, 213, 215, 212, 179, 82, 90, 94, 215, + 124, 170, 181, 138, 58, 179, 155, 163, 97, 117, 150, 86, 72, 15, 175, 135, + 180, 188, 82, 114, 161, 23, 152, 173, 126, 56, 155, 67, 35, 192, 140, 193, + 134, 107, 220, 80, 214, 245, 209, 29, 101, 53, 235, 147, 249, 234, 135, 242, + 57, 66, 201, 157, 163, 18, 80, 176, 90, 91, 239, 157, 147, 122, 134, 88, + 0, 230, 74, 250, 57, 39, 192, 113, 4, 132, 174, 156, 220, 181, 113, 147, + 175, 31, 55, 194, 3, 2, 109, 51, 168, 142, 132, 1, 19, 196, 90, 114, + 44, 241, 10, 25, 129, 91, 12, 98, 209, 109, 222, 221, 48, 157, 143, 136, + 41, 20, 183, 65, 69, 247, 229, 210, 79, 184, 112, 149, 44, 92, 139, 103, + 35, 7, 10, 205, 19, 170, 81, 222, 45, 61, 78, 219, 71, 20, 202, 93, + 160, 31, 219, 206, 202, 27, 242, 58, 87, 123, 57, 143, 26, 251, 110, 212, + 107, 98, 132, 228, 100, 132, 135, 154, 101, 112, 142, 165, 55, 241, 54, 115, + 56, 80, 153, 173, 86, 179, 111, 100, 54, 233, 148, 31, 10, 236, 254, 101, + 223, 165, 205, 191, 234, 56, 187, 84, 218, 171, 220, 40, 249, 18, 116, 143, + 174, 52, 27, 21, 139, 115, 37, 93, 107, 135, 141, 40, 235, 26, 224, 103, + 76, 141, 121, 166, 201, 228, 7, 8, 157, 80, 138, 172, 238, 117, 168, 125, + 114, 130, 252, 27, 202, 216, 22, 34, 165, 63, 184, 70, 78, 44, 23, 12, + 205, 10, 59, 157, 181, 186, 19, 26, 72, 108, 75, 198, 53, 176, 33, 238, + 161, 51, 69, 201, 170, 210, 98, 26, 38, 200, 93, 33, 203, 192, 182, 78, + 196, 47, 92, 165, 189, 21, 252, 219, 203, 33, 100, 205, 245, 246, 32, 7, + 247, 142, 175, 195, 205, 183, 56, 116, 212, 208, 205, 163, 10, 95, 250, 231, + 12, 210, 14, 141, 248, 49, 49, 44, 157, 24, 184, 91, 18, 181, 232, 160, + 71, 166, 208, 52, 6, 86, 87, 197, 189, 162, 16, 220, 81, 70, 123, 149, + 71, 153, 141, 237, 0, 243, 183, 63, 254, 7, 236, 247, 104, 178, 34, 239, + 152, 97, 118, 175, 112, 3, 234, 206, 81, 212, 54, 233, 179, 76, 129, 109, + 46, 211, 121, 218, 27, 142, 6, 75, 154, 141, 201, 96, 53, 238, 78, 38, + 52, 29, 51, 116, 81, 214, 135, 249, 64, 254, 109, 156, 206, 231, 211, 188, + 53, 166, 14, 219, 0, 75, 135, 251, 197, 23, 122, 8, 230, 71, 105, 117, + 168, 48, 33, 217, 248, 32, 246, 80, 148, 226, 77, 209, 120, 246, 218, 50, + 101, 97, 23, 56, 121, 104, 42, 148, 16, 177, 62, 56, 232, 135, 102, 15, + 155, 50, 174, 181, 186, 215, 196, 152, 33, 124, 139, 218, 50, 98, 23, 53, + 179, 204, 217, 125, 48, 178, 145, 41, 19, 32, 68, 70, 184, 103, 32, 184, + 12, 4, 73, 114, 208, 49, 159, 240, 66, 222, 10, 212, 68, 6, 98, 18, + 3, 57, 129, 1, 79, 30, 94, 114, 75, 168, 185, 26, 106, 5, 24, 219, + 131, 13, 190, 80, 133, 205, 143, 170, 20, 76, 62, 160, 88, 184, 189, 77, + 81, 54, 60, 82, 198, 85, 10, 48, 207, 231, 192, 239, 68, 108, 35, 58, + 27, 246, 214, 63, 199, 1, 214, 81, 135, 199, 202, 207, 113, 165, 198, 201, + 27, 76, 30, 82, 242, 166, 194, 2, 191, 107, 183, 52, 79, 252, 239, 170, + 176, 49, 115, 4, 251, 159, 253, 230, 105, 55, 217, 84, 41, 38, 17, 53, + 112, 154, 98, 141, 181, 121, 149, 140, 112, 160, 189, 222, 6, 94, 200, 244, + 166, 18, 124, 164, 125, 28, 120, 193, 82, 126, 45, 253, 223, 85, 58, 7, + 196, 4, 206, 21, 3, 104, 196, 19, 160, 179, 243, 143, 131, 9, 76, 64, + 70, 187, 2, 231, 72, 33, 113, 166, 152, 64, 106, 156, 86, 170, 224, 136, + 107, 112, 49, 75, 42, 232, 218, 108, 62, 253, 101, 208, 99, 64, 59, 7, + 154, 53, 252, 187, 234, 134, 11, 219, 243, 223, 60, 184, 193, 123, 124, 227, + 146, 80, 151, 216, 91, 244, 153, 230, 252, 232, 38, 110, 92, 21, 192, 102, + 55, 87, 63, 161, 33, 16, 131, 26, 18, 96, 51, 101, 83, 143, 31, 207, + 194, 192, 1, 40, 207, 134, 41, 186, 180, 138, 78, 221, 31, 107, 184, 213, + 154, 137, 104, 101, 242, 99, 29, 83, 201, 1, 215, 28, 77, 162, 16, 11, + 126, 172, 254, 232, 214, 220, 159, 170, 63, 161, 185, 84, 15, 253, 151, 193, + 240, 202, 113, 117, 62, 71, 183, 101, 236, 120, 108, 158, 36, 225, 155, 240, + 4, 157, 59, 148, 113, 102, 123, 189, 74, 85, 212, 12, 153, 126, 20, 133, + 226, 242, 143, 65, 253, 39, 245, 225, 104, 150, 114, 135, 225, 141, 158, 203, + 181, 218, 143, 149, 42, 246, 160, 122, 7, 111, 63, 81, 23, 33, 97, 8, + 131, 40, 63, 175, 199, 120, 247, 245, 227, 169, 251, 211, 169, 71, 113, 7, + 133, 17, 60, 75, 189, 221, 15, 24, 121, 42, 139, 54, 215, 233, 98, 56, + 216, 12, 76, 210, 171, 233, 46, 157, 229, 89, 241, 78, 156, 229, 15, 248, + 192, 197, 154, 234, 88, 213, 67, 183, 210, 28, 189, 92, 39, 50, 240, 131, + 12, 246, 22, 230, 60, 226, 70, 141, 120, 31, 69, 148, 67, 9, 28, 61, + 40, 131, 2, 218, 65, 58, 249, 23, 153, 168, 56, 187, 77, 126, 35, 7, + 82, 32, 218, 99, 200, 12, 48, 152, 17, 82, 178, 23, 64, 14, 94, 84, + 108, 5, 197, 230, 139, 172, 227, 92, 17, 141, 211, 111, 161, 137, 134, 214, + 57, 62, 108, 43, 66, 39, 51, 209, 130, 117, 58, 35, 185, 15, 182, 98, + 154, 102, 32, 35, 181, 141, 142, 252, 214, 142, 181, 105, 183, 117, 63, 34, + 251, 106, 138, 236, 194, 143, 167, 69, 137, 24, 12, 38, 22, 137, 242, 137, + 130, 194, 196, 58, 39, 63, 178, 91, 35, 216, 225, 89, 76, 229, 136, 171, + 28, 25, 29, 93, 51, 241, 198, 206, 31, 237, 217, 248, 175, 71, 211, 187, + 193, 220, 226, 215, 130, 206, 245, 28, 136, 195, 96, 210, 219, 72, 103, 10, + 157, 57, 109, 252, 194, 78, 123, 63, 103, 240, 36, 124, 64, 150, 13, 16, + 93, 252, 108, 100, 54, 125, 140, 145, 56, 71, 142, 142, 143, 9, 114, 132, + 108, 32, 205, 150, 215, 161, 21, 91, 204, 98, 26, 246, 51, 8, 251, 204, + 156, 68, 255, 97, 49, 72, 88, 27, 17, 107, 237, 3, 133, 21, 156, 72, + 176, 10, 199, 242, 225, 101, 146, 179, 137, 42, 6, 205, 161, 208, 181, 106, + 240, 28, 188, 86, 120, 47, 104, 74, 57, 11, 240, 252, 82, 188, 226, 20, + 49, 11, 98, 253, 144, 142, 155, 25, 231, 195, 81, 76, 71, 135, 153, 16, + 111, 14, 132, 184, 252, 29, 234, 226, 195, 3, 252, 18, 146, 243, 86, 90, + 245, 99, 224, 41, 132, 185, 107, 197, 11, 188, 174, 23, 160, 68, 225, 56, + 240, 95, 242, 245, 123, 97, 109, 192, 151, 60, 170, 38, 21, 0, 245, 67, + 119, 52, 72, 251, 211, 69, 79, 120, 143, 57, 20, 217, 14, 41, 135, 66, + 244, 167, 102, 107, 133, 244, 219, 234, 143, 32, 109, 143, 148, 229, 239, 101, + 104, 5, 189, 142, 66, 3, 155, 155, 225, 103, 96, 109, 205, 234, 101, 224, + 100, 128, 88, 204, 208, 18, 22, 71, 161, 192, 227, 166, 64, 228, 102, 78, + 254, 191, 23, 2, 15, 97, 87, 21, 121, 207, 32, 173, 151, 227, 187, 125, + 62, 241, 144, 172, 42, 235, 30, 79, 4, 165, 20, 20, 28, 227, 160, 19, + 53, 111, 189, 112, 117, 140, 240, 3, 146, 248, 124, 100, 57, 213, 150, 140, + 143, 208, 157, 117, 22, 51, 180, 83, 39, 143, 140, 105, 127, 57, 196, 163, + 18, 135, 59, 59, 15, 53, 178, 145, 97, 161, 8, 34, 117, 109, 8, 232, + 233, 17, 22, 0, 172, 112, 115, 143, 255, 182, 59, 203, 34, 10, 46, 250, + 174, 203, 141, 29, 242, 184, 136, 125, 72, 184, 3, 73, 59, 138, 243, 248, + 34, 187, 162, 36, 223, 66, 14, 46, 240, 199, 236, 210, 129, 168, 137, 198, + 200, 3, 199, 2, 131, 25, 42, 49, 210, 134, 78, 177, 245, 150, 149, 107, + 11, 193, 183, 182, 230, 83, 8, 134, 159, 20, 106, 33, 92, 36, 15, 139, + 251, 3, 181, 137, 145, 178, 196, 109, 147, 84, 70, 182, 89, 132, 192, 149, + 99, 150, 193, 17, 175, 133, 172, 154, 226, 34, 198, 9, 71, 41, 3, 94, + 145, 209, 239, 40, 14, 67, 140, 85, 150, 183, 231, 107, 72, 221, 7, 37, + 142, 68, 252, 65, 15, 88, 17, 226, 79, 215, 221, 56, 204, 12, 196, 232, + 251, 10, 127, 42, 196, 29, 196, 240, 116, 186, 165, 159, 138, 171, 180, 130, + 36, 58, 161, 85, 13, 241, 163, 36, 137, 161, 11, 36, 190, 37, 146, 242, + 226, 172, 204, 24, 131, 33, 54, 92, 127, 30, 27, 54, 164, 65, 228, 32, + 187, 219, 32, 69, 169, 237, 44, 221, 145, 93, 225, 182, 76, 10, 65, 59, + 210, 14, 195, 99, 79, 133, 195, 176, 198, 71, 152, 227, 103, 21, 113, 141, + 212, 131, 118, 104, 169, 40, 196, 202, 102, 154, 112, 17, 86, 59, 39, 81, + 83, 158, 59, 106, 191, 48, 248, 34, 255, 24, 82, 27, 174, 208, 146, 168, + 203, 177, 34, 7, 38, 67, 50, 107, 214, 11, 155, 232, 239, 200, 229, 205, + 71, 51, 58, 157, 17, 198, 123, 31, 83, 99, 28, 125, 226, 204, 49, 231, + 208, 9, 236, 33, 199, 30, 60, 30, 21, 159, 212, 26, 206, 129, 102, 11, + 79, 96, 15, 104, 143, 207, 99, 123, 26, 252, 18, 39, 176, 233, 106, 57, + 91, 45, 233, 220, 69, 167, 177, 159, 80, 43, 41, 110, 103, 78, 100, 107, + 60, 91, 213, 233, 80, 70, 153, 206, 234, 185, 92, 117, 153, 141, 114, 169, + 106, 67, 50, 191, 135, 205, 187, 199, 110, 44, 48, 55, 157, 169, 127, 66, + 4, 60, 117, 214, 107, 225, 245, 130, 222, 233, 203, 143, 248, 116, 132, 69, + 78, 157, 13, 218, 226, 215, 101, 57, 157, 15, 159, 204, 124, 20, 148, 233, + 106, 81, 94, 175, 43, 231, 192, 245, 112, 243, 9, 26, 236, 67, 18, 29, + 219, 42, 181, 100, 77, 21, 210, 155, 8, 20, 196, 249, 2, 151, 122, 193, + 109, 225, 161, 16, 14, 123, 80, 145, 62, 237, 109, 54, 69, 199, 189, 245, + 250, 20, 202, 192, 129, 111, 57, 237, 144, 182, 121, 246, 224, 23, 22, 31, + 252, 178, 59, 201, 127, 100, 111, 191, 70, 246, 150, 135, 230, 23, 147, 189, + 9, 176, 76, 77, 96, 253, 71, 246, 246, 16, 217, 155, 247, 163, 148, 216, + 148, 215, 117, 15, 10, 120, 240, 169, 86, 222, 224, 243, 6, 159, 97, 209, + 9, 7, 244, 36, 139, 81, 95, 2, 149, 191, 194, 228, 11, 186, 9, 25, + 207, 194, 0, 254, 214, 112, 19, 11, 216, 71, 125, 90, 46, 255, 120, 228, + 249, 223, 65, 101, 101, 56, 141, 55, 43, 98, 124, 63, 241, 0, 196, 134, + 167, 197, 120, 94, 222, 51, 97, 55, 157, 160, 203, 240, 69, 230, 112, 108, + 232, 92, 116, 238, 186, 183, 3, 195, 75, 217, 120, 48, 191, 65, 6, 137, + 204, 145, 242, 114, 25, 93, 227, 19, 156, 101, 209, 19, 152, 225, 206, 139, + 76, 220, 117, 119, 212, 106, 178, 186, 180, 223, 83, 172, 238, 26, 122, 239, + 215, 3, 87, 139, 36, 54, 77, 143, 196, 154, 73, 50, 139, 38, 52, 22, + 141, 167, 151, 221, 171, 124, 236, 220, 125, 128, 56, 116, 114, 85, 97, 185, + 224, 220, 170, 7, 42, 87, 12, 240, 42, 98, 168, 108, 12, 246, 144, 75, + 50, 63, 86, 119, 100, 38, 227, 130, 23, 194, 184, 159, 192, 102, 82, 142, + 106, 233, 17, 57, 69, 170, 1, 10, 85, 74, 44, 60, 98, 193, 14, 233, + 128, 157, 146, 3, 215, 83, 122, 174, 0, 227, 213, 112, 99, 183, 161, 90, + 110, 97, 216, 145, 201, 237, 116, 132, 174, 94, 73, 145, 26, 3, 217, 54, + 4, 35, 215, 80, 118, 231, 66, 45, 30, 248, 32, 219, 65, 55, 114, 95, + 192, 41, 98, 7, 218, 133, 94, 185, 97, 49, 105, 25, 79, 33, 43, 52, + 79, 1, 226, 131, 12, 10, 95, 1, 196, 232, 48, 64, 42, 65, 51, 246, + 143, 121, 53, 154, 246, 104, 171, 88, 206, 83, 62, 87, 225, 94, 177, 72, + 233, 42, 173, 73, 15, 24, 228, 169, 37, 236, 223, 40, 214, 19, 31, 147, + 89, 138, 144, 69, 118, 110, 248, 9, 48, 157, 125, 101, 170, 62, 107, 223, + 153, 208, 241, 216, 148, 217, 8, 191, 12, 210, 93, 230, 62, 84, 231, 142, + 1, 158, 75, 208, 228, 238, 235, 226, 208, 82, 96, 147, 193, 162, 115, 104, + 92, 56, 196, 67, 56, 172, 6, 33, 53, 100, 102, 131, 98, 225, 139, 146, + 204, 224, 41, 100, 57, 28, 44, 187, 201, 86, 9, 58, 118, 238, 215, 201, + 22, 49, 212, 167, 47, 149, 157, 251, 125, 178, 69, 166, 72, 37, 28, 150, + 104, 6, 222, 218, 67, 68, 220, 222, 161, 126, 133, 253, 169, 180, 41, 57, + 248, 105, 120, 20, 215, 253, 54, 31, 20, 252, 239, 41, 40, 243, 215, 90, + 159, 163, 195, 67, 247, 155, 236, 210, 38, 38, 141, 19, 56, 203, 124, 47, + 10, 124, 109, 42, 117, 236, 197, 80, 81, 75, 8, 83, 112, 237, 242, 145, + 168, 234, 149, 201, 33, 109, 250, 194, 67, 243, 151, 120, 231, 157, 193, 86, + 3, 212, 89, 228, 141, 40, 175, 247, 54, 129, 28, 120, 26, 243, 227, 83, + 220, 186, 226, 42, 236, 3, 111, 207, 144, 213, 124, 27, 68, 245, 183, 21, + 228, 77, 117, 169, 152, 91, 168, 139, 38, 104, 113, 87, 177, 1, 128, 39, + 182, 161, 115, 54, 237, 156, 184, 206, 242, 185, 117, 246, 150, 194, 158, 42, + 233, 21, 146, 215, 121, 151, 194, 197, 8, 7, 11, 246, 137, 207, 37, 167, + 47, 59, 247, 91, 248, 249, 118, 135, 247, 241, 91, 146, 233, 238, 240, 144, + 228, 143, 3, 255, 91, 60, 60, 43, 31, 67, 210, 69, 238, 114, 250, 48, + 241, 21, 105, 18, 218, 218, 165, 210, 161, 193, 23, 18, 101, 145, 110, 9, + 84, 214, 29, 125, 81, 169, 22, 13, 76, 46, 252, 188, 159, 132, 71, 201, + 181, 44, 112, 2, 21, 176, 161, 187, 87, 174, 213, 134, 29, 207, 226, 25, + 67, 195, 79, 75, 198, 197, 243, 35, 128, 243, 16, 30, 17, 182, 56, 2, + 64, 206, 250, 191, 72, 21, 68, 187, 90, 168, 177, 226, 15, 137, 32, 154, + 199, 225, 145, 79, 129, 13, 80, 60, 74, 2, 4, 82, 54, 18, 206, 224, + 145, 242, 216, 158, 50, 164, 99, 176, 33, 122, 69, 31, 20, 56, 200, 0, + 190, 149, 220, 63, 22, 224, 218, 33, 249, 42, 192, 163, 179, 62, 34, 39, + 173, 98, 247, 56, 164, 25, 162, 218, 255, 28, 87, 14, 234, 234, 74, 157, + 54, 4, 103, 148, 113, 239, 179, 95, 214, 79, 242, 49, 209, 227, 36, 202, + 111, 53, 86, 215, 247, 30, 82, 110, 230, 24, 139, 134, 130, 182, 178, 134, + 218, 49, 71, 185, 148, 99, 67, 247, 103, 10, 204, 166, 132, 44, 180, 35, + 142, 152, 66, 177, 236, 137, 229, 149, 58, 177, 40, 171, 238, 87, 103, 73, + 172, 109, 162, 81, 9, 133, 54, 51, 133, 206, 234, 86, 33, 220, 229, 60, + 128, 228, 193, 190, 223, 5, 136, 128, 43, 239, 104, 6, 114, 54, 229, 29, + 157, 12, 82, 18, 56, 0, 198, 58, 1, 212, 208, 236, 244, 95, 102, 79, + 60, 175, 2, 20, 130, 160, 217, 206, 4, 69, 149, 87, 211, 121, 192, 114, + 145, 128, 52, 120, 240, 180, 99, 1, 94, 121, 17, 250, 244, 233, 25, 224, + 245, 254, 107, 61, 216, 164, 81, 185, 208, 190, 188, 136, 188, 221, 27, 60, + 215, 243, 105, 4, 207, 8, 120, 18, 25, 210, 111, 165, 74, 129, 190, 119, + 226, 42, 36, 95, 184, 5, 133, 169, 76, 213, 111, 157, 224, 149, 31, 103, + 220, 228, 50, 182, 49, 227, 144, 50, 182, 79, 96, 95, 117, 20, 58, 194, + 6, 112, 30, 190, 241, 227, 147, 168, 62, 88, 207, 202, 176, 29, 180, 43, + 187, 76, 152, 89, 207, 185, 26, 0, 107, 91, 150, 87, 50, 232, 229, 19, + 78, 65, 220, 41, 47, 144, 143, 27, 15, 221, 122, 222, 13, 35, 14, 24, + 30, 12, 221, 75, 150, 243, 140, 99, 78, 196, 113, 210, 53, 225, 16, 165, + 26, 8, 14, 114, 84, 136, 15, 222, 17, 101, 146, 94, 70, 209, 63, 100, + 116, 132, 62, 76, 231, 210, 27, 34, 127, 224, 233, 227, 248, 232, 64, 95, + 216, 65, 38, 96, 224, 203, 10, 189, 95, 137, 247, 58, 37, 160, 60, 7, + 133, 40, 108, 146, 10, 125, 225, 126, 86, 100, 91, 244, 17, 107, 169, 174, + 55, 24, 71, 11, 170, 62, 79, 162, 55, 229, 245, 6, 253, 149, 38, 148, + 80, 57, 193, 215, 240, 242, 72, 188, 66, 62, 40, 132, 58, 107, 49, 124, + 128, 215, 143, 88, 199, 25, 142, 225, 205, 34, 189, 1, 30, 8, 166, 141, + 38, 19, 147, 126, 142, 49, 94, 51, 204, 228, 73, 152, 107, 224, 200, 110, + 160, 170, 26, 144, 221, 186, 162, 110, 209, 155, 0, 124, 205, 197, 174, 30, + 149, 209, 243, 230, 199, 74, 149, 134, 1, 147, 67, 142, 169, 12, 185, 36, + 160, 112, 49, 55, 190, 216, 140, 199, 104, 172, 194, 20, 149, 9, 228, 198, + 188, 90, 125, 162, 109, 154, 124, 86, 163, 197, 131, 104, 112, 99, 186, 179, + 198, 8, 103, 157, 69, 218, 31, 20, 249, 0, 252, 94, 247, 48, 123, 201, + 48, 31, 220, 116, 231, 36, 27, 215, 158, 63, 48, 12, 227, 189, 122, 4, + 47, 52, 229, 124, 205, 188, 124, 225, 126, 205, 174, 164, 173, 94, 171, 200, + 95, 186, 203, 251, 189, 240, 232, 158, 75, 111, 80, 173, 182, 153, 76, 206, + 165, 229, 167, 122, 171, 237, 88, 179, 113, 224, 66, 235, 181, 188, 207, 146, + 231, 0, 246, 239, 172, 143, 3, 6, 208, 20, 157, 212, 208, 162, 80, 149, + 188, 153, 7, 176, 45, 35, 139, 95, 49, 184, 250, 166, 226, 234, 87, 25, + 174, 254, 54, 217, 90, 76, 189, 8, 173, 33, 128, 67, 192, 75, 190, 58, + 19, 193, 42, 51, 201, 231, 97, 17, 5, 92, 135, 123, 228, 63, 119, 194, + 121, 216, 206, 217, 20, 102, 137, 41, 66, 83, 204, 114, 31, 22, 249, 95, + 187, 165, 175, 146, 178, 191, 9, 235, 27, 160, 106, 171, 122, 217, 95, 135, + 245, 53, 60, 222, 158, 254, 152, 172, 107, 192, 196, 115, 194, 233, 79, 201, + 134, 222, 40, 231, 41, 214, 109, 245, 53, 72, 203, 63, 6, 63, 105, 73, + 76, 144, 162, 78, 21, 14, 233, 112, 11, 112, 76, 240, 111, 171, 95, 137, + 234, 253, 21, 60, 62, 172, 110, 180, 241, 206, 172, 203, 236, 125, 243, 137, + 235, 1, 49, 158, 11, 158, 199, 11, 58, 252, 202, 190, 156, 159, 78, 1, + 34, 43, 116, 93, 45, 6, 243, 186, 8, 22, 108, 139, 18, 185, 91, 48, + 157, 176, 47, 202, 232, 3, 232, 239, 230, 17, 142, 173, 244, 120, 146, 239, + 234, 115, 138, 67, 196, 73, 180, 48, 187, 159, 163, 241, 176, 87, 44, 155, + 129, 39, 178, 160, 223, 85, 203, 243, 163, 239, 96, 83, 13, 186, 133, 223, + 231, 65, 92, 237, 230, 46, 254, 197, 186, 36, 126, 8, 122, 189, 195, 205, + 14, 150, 102, 23, 30, 88, 119, 232, 69, 134, 171, 201, 169, 218, 246, 86, + 139, 37, 57, 241, 182, 69, 216, 196, 198, 148, 38, 131, 187, 14, 110, 39, + 62, 49, 119, 248, 134, 222, 181, 125, 148, 42, 100, 88, 241, 230, 11, 188, + 27, 46, 10, 180, 86, 44, 83, 229, 80, 92, 66, 166, 218, 220, 43, 83, + 109, 65, 182, 150, 148, 169, 182, 126, 157, 76, 245, 59, 55, 65, 129, 39, + 111, 144, 89, 225, 42, 106, 99, 88, 226, 213, 174, 18, 174, 138, 228, 64, + 102, 62, 117, 38, 88, 3, 80, 44, 124, 236, 210, 99, 76, 34, 85, 250, + 142, 238, 193, 89, 39, 114, 210, 133, 195, 9, 149, 229, 52, 36, 86, 148, + 246, 17, 192, 71, 71, 141, 2, 177, 234, 242, 14, 117, 226, 109, 121, 212, + 23, 86, 40, 202, 173, 51, 238, 195, 83, 136, 166, 158, 82, 79, 136, 123, + 5, 199, 3, 71, 194, 72, 11, 166, 50, 59, 146, 194, 251, 156, 70, 80, + 225, 208, 246, 139, 164, 216, 142, 202, 68, 117, 82, 167, 139, 95, 160, 86, + 68, 165, 72, 165, 2, 247, 48, 34, 166, 90, 165, 194, 177, 98, 36, 227, + 93, 194, 218, 240, 38, 66, 6, 215, 116, 21, 134, 230, 88, 210, 147, 135, + 116, 206, 152, 215, 163, 16, 13, 72, 67, 66, 182, 134, 30, 204, 145, 231, + 88, 166, 108, 246, 184, 174, 11, 118, 105, 35, 31, 62, 78, 167, 99, 60, + 83, 174, 235, 60, 24, 252, 36, 159, 158, 26, 135, 208, 226, 33, 199, 28, + 17, 100, 205, 110, 26, 83, 112, 136, 65, 226, 1, 36, 17, 235, 91, 136, + 241, 240, 153, 20, 199, 196, 24, 38, 71, 149, 200, 65, 105, 125, 204, 162, + 193, 237, 211, 203, 204, 129, 50, 112, 10, 160, 171, 145, 174, 33, 124, 22, + 10, 105, 168, 58, 64, 202, 243, 35, 243, 65, 57, 173, 77, 179, 58, 138, + 112, 153, 199, 64, 138, 120, 128, 20, 134, 184, 33, 148, 70, 16, 87, 4, + 148, 3, 198, 44, 69, 250, 44, 2, 61, 20, 227, 18, 101, 240, 97, 88, + 65, 89, 38, 224, 227, 17, 221, 118, 99, 240, 71, 149, 216, 150, 137, 74, + 175, 66, 186, 52, 97, 183, 38, 77, 20, 92, 178, 81, 12, 253, 70, 58, + 136, 99, 141, 194, 222, 28, 53, 72, 24, 39, 205, 174, 156, 42, 107, 121, + 176, 11, 229, 22, 9, 252, 241, 149, 212, 41, 72, 153, 2, 53, 40, 56, + 131, 209, 186, 244, 177, 178, 115, 12, 225, 190, 165, 199, 0, 124, 93, 209, + 121, 129, 252, 54, 103, 136, 101, 145, 113, 110, 214, 232, 150, 138, 61, 153, + 194, 164, 41, 113, 83, 166, 84, 42, 68, 205, 62, 92, 91, 146, 206, 163, + 28, 129, 116, 142, 23, 19, 90, 161, 140, 34, 163, 4, 169, 240, 171, 213, + 206, 34, 84, 225, 112, 14, 137, 217, 243, 110, 73, 133, 172, 161, 89, 100, + 65, 211, 126, 17, 200, 127, 145, 97, 69, 115, 131, 190, 83, 196, 204, 18, + 27, 46, 25, 245, 10, 41, 194, 48, 171, 110, 164, 213, 12, 167, 43, 62, + 133, 83, 141, 29, 203, 18, 167, 233, 222, 115, 87, 115, 39, 172, 186, 51, + 54, 217, 82, 99, 211, 146, 173, 233, 125, 50, 55, 247, 183, 79, 114, 235, + 210, 178, 85, 101, 195, 70, 75, 122, 9, 40, 216, 238, 246, 34, 129, 32, + 50, 54, 97, 105, 9, 178, 210, 104, 217, 26, 224, 237, 220, 13, 75, 209, + 96, 30, 170, 221, 186, 103, 107, 219, 207, 200, 233, 251, 65, 214, 248, 230, + 156, 230, 213, 32, 185, 218, 1, 90, 129, 186, 84, 168, 164, 210, 200, 222, + 214, 249, 209, 125, 247, 113, 232, 254, 35, 63, 199, 188, 139, 81, 0, 188, + 229, 114, 48, 89, 209, 96, 201, 83, 169, 10, 20, 145, 157, 102, 172, 231, + 115, 164, 162, 122, 134, 227, 172, 194, 179, 209, 54, 76, 206, 75, 49, 223, + 58, 190, 212, 94, 207, 16, 53, 234, 13, 76, 52, 15, 78, 200, 48, 149, + 135, 70, 188, 79, 19, 14, 33, 173, 8, 202, 47, 45, 83, 119, 207, 213, + 178, 202, 80, 121, 142, 200, 25, 163, 219, 227, 62, 132, 12, 210, 114, 92, + 90, 71, 31, 181, 218, 149, 106, 75, 90, 144, 195, 119, 61, 92, 148, 223, + 176, 95, 127, 21, 106, 180, 85, 228, 156, 188, 191, 238, 111, 18, 127, 91, + 39, 47, 46, 86, 197, 47, 94, 237, 118, 228, 53, 12, 109, 199, 209, 114, + 156, 212, 14, 138, 98, 35, 21, 57, 250, 111, 189, 112, 50, 174, 147, 208, + 236, 18, 137, 135, 118, 80, 225, 44, 134, 233, 53, 250, 63, 195, 78, 8, + 125, 34, 56, 14, 208, 254, 68, 190, 152, 160, 113, 200, 61, 158, 222, 14, + 58, 179, 116, 77, 188, 23, 185, 205, 192, 224, 226, 42, 104, 155, 121, 253, + 134, 131, 192, 203, 183, 21, 154, 177, 243, 107, 36, 94, 35, 126, 141, 233, + 53, 148, 175, 77, 122, 173, 171, 207, 45, 249, 46, 74, 183, 229, 123, 93, + 100, 56, 22, 229, 229, 251, 75, 81, 125, 93, 114, 119, 180, 223, 195, 114, + 16, 30, 30, 59, 61, 36, 108, 27, 248, 247, 241, 75, 241, 254, 212, 162, + 208, 182, 121, 148, 173, 177, 82, 83, 66, 150, 31, 168, 223, 38, 233, 125, + 52, 76, 139, 139, 122, 187, 119, 189, 96, 39, 200, 105, 114, 227, 88, 191, + 192, 198, 232, 8, 120, 40, 82, 25, 75, 82, 217, 206, 152, 28, 139, 135, + 130, 91, 105, 170, 98, 223, 10, 145, 106, 70, 22, 227, 95, 38, 158, 187, + 136, 36, 162, 119, 192, 36, 137, 156, 242, 86, 72, 185, 227, 42, 96, 55, + 35, 118, 32, 210, 160, 116, 13, 81, 30, 111, 99, 33, 185, 130, 153, 209, + 115, 20, 170, 135, 66, 137, 166, 46, 113, 106, 126, 0, 74, 92, 227, 149, + 34, 138, 33, 139, 86, 55, 89, 52, 161, 252, 42, 147, 179, 28, 83, 155, + 77, 5, 254, 25, 93, 43, 179, 170, 108, 159, 139, 181, 116, 177, 35, 243, + 3, 240, 169, 84, 172, 101, 140, 136, 149, 86, 115, 174, 35, 155, 134, 66, + 107, 110, 88, 34, 116, 79, 129, 173, 245, 31, 6, 72, 59, 216, 183, 186, + 72, 237, 205, 187, 189, 15, 50, 122, 170, 80, 145, 17, 22, 98, 233, 162, + 51, 31, 140, 210, 193, 181, 41, 252, 85, 161, 19, 201, 217, 15, 57, 125, + 208, 40, 63, 239, 222, 73, 211, 100, 81, 111, 126, 107, 17, 62, 149, 148, + 4, 152, 234, 121, 128, 215, 21, 14, 29, 168, 251, 20, 154, 193, 10, 35, + 211, 3, 81, 180, 127, 221, 136, 94, 5, 142, 26, 182, 25, 10, 208, 214, + 19, 207, 158, 91, 194, 66, 19, 125, 81, 81, 65, 220, 11, 161, 109, 132, + 218, 163, 50, 98, 5, 159, 75, 100, 84, 139, 45, 186, 160, 216, 21, 249, + 28, 233, 173, 96, 27, 184, 72, 199, 65, 250, 237, 101, 246, 46, 167, 180, + 58, 67, 255, 207, 85, 14, 223, 220, 122, 115, 177, 10, 162, 203, 147, 11, + 160, 230, 151, 37, 7, 72, 118, 239, 65, 17, 217, 107, 34, 26, 145, 219, + 212, 106, 212, 58, 22, 76, 76, 26, 191, 233, 155, 244, 228, 151, 114, 84, + 121, 19, 195, 15, 32, 40, 94, 115, 157, 164, 158, 12, 33, 84, 187, 70, + 93, 108, 49, 10, 222, 108, 176, 10, 244, 21, 249, 75, 67, 224, 35, 255, + 15, 206, 227, 168, 182, 138, 171, 205, 46, 84, 152, 15, 208, 247, 67, 145, + 211, 34, 114, 97, 192, 126, 205, 76, 215, 69, 15, 246, 22, 65, 31, 216, + 109, 248, 224, 179, 131, 194, 100, 252, 66, 188, 46, 240, 11, 241, 114, 31, + 242, 153, 3, 136, 241, 30, 247, 117, 208, 114, 236, 81, 229, 52, 137, 32, + 147, 64, 66, 224, 118, 50, 132, 58, 55, 160, 253, 24, 168, 221, 65, 196, + 89, 119, 16, 69, 71, 26, 233, 176, 140, 100, 250, 242, 72, 211, 10, 133, + 101, 75, 91, 123, 134, 155, 52, 88, 222, 114, 192, 197, 3, 149, 238, 12, + 87, 25, 161, 93, 118, 118, 40, 3, 229, 125, 248, 212, 60, 208, 229, 130, + 209, 131, 192, 177, 186, 83, 236, 19, 46, 215, 155, 253, 76, 226, 139, 2, + 224, 213, 174, 49, 196, 46, 195, 12, 163, 38, 115, 172, 93, 185, 154, 53, + 147, 230, 168, 163, 98, 16, 187, 231, 184, 108, 8, 188, 36, 34, 104, 104, + 83, 9, 242, 75, 203, 254, 118, 106, 121, 213, 111, 228, 211, 196, 109, 32, + 251, 67, 94, 159, 43, 23, 254, 27, 253, 248, 209, 240, 189, 247, 87, 89, + 230, 30, 194, 204, 30, 18, 15, 172, 10, 209, 32, 178, 245, 226, 150, 141, + 155, 77, 68, 155, 226, 119, 189, 111, 94, 84, 231, 3, 199, 24, 135, 102, + 93, 66, 219, 27, 156, 111, 136, 230, 213, 24, 108, 7, 234, 236, 57, 86, + 90, 243, 74, 17, 100, 150, 186, 222, 13, 251, 202, 107, 223, 182, 175, 124, + 246, 113, 1, 233, 240, 141, 124, 243, 245, 243, 177, 40, 122, 221, 9, 42, + 19, 100, 149, 122, 255, 189, 52, 34, 143, 51, 26, 145, 177, 86, 136, 12, + 31, 175, 16, 169, 97, 18, 56, 38, 124, 212, 76, 30, 75, 181, 200, 34, + 43, 213, 124, 104, 53, 85, 197, 195, 142, 105, 255, 99, 117, 34, 39, 172, + 253, 135, 202, 245, 78, 13, 121, 130, 125, 209, 23, 135, 221, 254, 160, 67, + 78, 212, 24, 47, 109, 137, 79, 159, 76, 127, 200, 113, 61, 224, 228, 112, + 58, 79, 63, 78, 39, 203, 238, 136, 48, 243, 118, 48, 95, 166, 24, 102, + 125, 247, 208, 109, 148, 90, 115, 101, 107, 143, 59, 1, 41, 105, 80, 155, + 141, 5, 101, 199, 162, 204, 182, 250, 42, 183, 173, 238, 117, 21, 96, 15, + 190, 25, 58, 89, 104, 232, 123, 121, 233, 75, 71, 28, 132, 94, 9, 25, + 129, 77, 249, 205, 72, 124, 113, 32, 193, 19, 104, 176, 193, 241, 159, 154, + 232, 155, 48, 200, 28, 146, 180, 20, 201, 218, 123, 137, 253, 115, 50, 174, + 152, 228, 94, 155, 11, 129, 204, 174, 217, 238, 240, 16, 242, 44, 9, 209, + 217, 155, 72, 26, 98, 82, 66, 73, 174, 185, 135, 228, 53, 209, 85, 76, + 74, 246, 198, 180, 127, 147, 102, 95, 123, 154, 185, 18, 28, 107, 209, 220, + 79, 239, 30, 207, 67, 157, 152, 97, 197, 247, 242, 71, 86, 39, 194, 70, + 203, 201, 244, 74, 205, 100, 152, 231, 133, 242, 61, 179, 167, 68, 7, 141, + 187, 55, 180, 167, 16, 147, 224, 170, 140, 229, 11, 74, 44, 102, 163, 238, + 98, 220, 109, 96, 124, 163, 70, 51, 120, 69, 142, 142, 81, 86, 75, 150, + 138, 184, 113, 180, 133, 233, 47, 113, 69, 88, 83, 65, 68, 196, 217, 124, + 208, 37, 249, 93, 127, 205, 139, 83, 172, 209, 143, 38, 168, 191, 231, 92, + 180, 41, 138, 213, 83, 112, 87, 47, 78, 32, 48, 248, 238, 104, 58, 185, + 113, 215, 193, 134, 86, 205, 199, 67, 140, 236, 154, 245, 100, 250, 155, 164, + 191, 22, 139, 172, 255, 241, 0, 105, 231, 158, 52, 29, 213, 241, 125, 190, + 90, 77, 109, 22, 179, 251, 208, 111, 185, 71, 203, 254, 102, 169, 184, 161, + 220, 114, 80, 172, 202, 127, 164, 63, 122, 173, 30, 141, 4, 82, 185, 1, + 143, 244, 7, 178, 55, 82, 31, 98, 253, 129, 238, 214, 233, 195, 61, 194, + 86, 177, 194, 59, 155, 44, 85, 181, 86, 133, 162, 161, 143, 38, 138, 22, + 77, 60, 20, 31, 76, 118, 3, 163, 65, 234, 46, 237, 101, 95, 139, 122, + 180, 159, 68, 237, 129, 121, 1, 109, 169, 178, 195, 69, 201, 167, 162, 27, + 184, 182, 91, 219, 75, 85, 216, 63, 29, 122, 133, 134, 45, 253, 182, 107, + 243, 76, 210, 95, 236, 124, 186, 90, 168, 93, 103, 48, 190, 154, 46, 22, + 157, 209, 224, 118, 48, 202, 130, 153, 66, 50, 184, 162, 166, 207, 242, 246, + 151, 21, 93, 27, 173, 195, 178, 224, 213, 96, 246, 0, 8, 205, 241, 126, + 15, 211, 153, 177, 5, 78, 193, 112, 77, 233, 66, 104, 250, 111, 109, 90, + 154, 185, 13, 195, 183, 107, 11, 237, 157, 60, 107, 58, 243, 99, 62, 120, + 135, 161, 71, 37, 143, 123, 60, 40, 151, 6, 85, 124, 226, 19, 252, 176, + 138, 234, 136, 211, 92, 187, 26, 173, 230, 157, 53, 93, 89, 208, 227, 70, + 92, 117, 74, 129, 129, 101, 108, 132, 30, 17, 198, 179, 41, 28, 174, 244, + 213, 125, 205, 133, 109, 83, 170, 27, 53, 240, 202, 35, 147, 3, 179, 224, + 7, 188, 177, 103, 185, 2, 226, 145, 10, 81, 251, 42, 212, 65, 57, 224, + 181, 206, 231, 209, 135, 32, 220, 12, 184, 192, 121, 6, 125, 32, 229, 65, + 120, 179, 103, 158, 185, 202, 204, 187, 97, 151, 93, 216, 136, 225, 132, 58, + 3, 113, 216, 51, 144, 154, 233, 117, 22, 217, 161, 164, 3, 121, 241, 23, + 186, 233, 53, 236, 65, 14, 135, 220, 160, 237, 72, 220, 28, 0, 171, 169, + 195, 150, 14, 205, 151, 62, 189, 112, 28, 8, 25, 238, 23, 33, 8, 187, + 82, 35, 150, 235, 87, 77, 157, 104, 142, 189, 3, 100, 97, 122, 155, 222, + 76, 6, 203, 37, 31, 49, 133, 54, 175, 244, 23, 205, 234, 96, 157, 113, + 58, 209, 14, 163, 101, 90, 119, 77, 105, 54, 165, 148, 117, 105, 103, 192, + 15, 95, 189, 90, 1, 63, 52, 60, 75, 97, 227, 201, 75, 121, 84, 209, + 141, 163, 166, 104, 241, 148, 170, 78, 4, 142, 49, 54, 43, 186, 174, 181, + 84, 95, 134, 123, 92, 45, 191, 206, 186, 90, 182, 87, 109, 193, 96, 51, + 126, 229, 149, 230, 187, 136, 203, 72, 1, 114, 11, 34, 50, 58, 227, 111, + 181, 56, 208, 237, 39, 218, 85, 147, 227, 247, 3, 191, 191, 215, 151, 131, + 192, 164, 216, 193, 128, 177, 124, 190, 229, 85, 230, 99, 116, 248, 158, 235, + 143, 191, 45, 86, 25, 24, 3, 207, 218, 185, 77, 23, 233, 21, 219, 254, + 33, 70, 195, 236, 74, 190, 240, 44, 210, 161, 155, 197, 137, 21, 67, 76, + 209, 1, 131, 111, 144, 232, 112, 209, 5, 40, 236, 246, 134, 219, 132, 143, + 83, 84, 73, 164, 236, 93, 87, 182, 166, 218, 47, 146, 29, 151, 9, 27, + 144, 74, 221, 12, 220, 241, 106, 177, 68, 143, 157, 23, 68, 12, 46, 43, + 247, 248, 121, 77, 202, 189, 138, 75, 33, 167, 76, 201, 49, 240, 114, 42, + 184, 115, 187, 169, 15, 191, 44, 110, 166, 81, 69, 249, 88, 158, 251, 47, + 172, 179, 192, 195, 32, 113, 78, 17, 76, 45, 203, 216, 166, 180, 5, 138, + 207, 34, 137, 94, 109, 149, 152, 11, 209, 76, 104, 250, 62, 110, 71, 239, + 221, 63, 189, 111, 189, 132, 33, 145, 62, 99, 11, 69, 216, 25, 45, 70, + 227, 56, 211, 14, 0, 230, 193, 119, 4, 112, 56, 197, 228, 1, 94, 242, + 97, 168, 185, 211, 182, 98, 157, 205, 24, 206, 25, 199, 57, 89, 132, 13, + 93, 160, 82, 158, 31, 121, 82, 174, 27, 241, 25, 135, 12, 138, 216, 235, + 61, 208, 181, 43, 242, 232, 161, 200, 190, 246, 155, 83, 163, 115, 139, 146, + 50, 178, 190, 112, 85, 168, 69, 224, 173, 36, 50, 119, 40, 14, 67, 45, + 95, 78, 175, 187, 71, 34, 29, 5, 200, 7, 252, 205, 254, 30, 205, 150, + 72, 173, 26, 230, 244, 27, 242, 213, 34, 62, 146, 65, 19, 204, 204, 5, + 6, 122, 156, 95, 6, 87, 34, 39, 225, 182, 186, 249, 96, 47, 10, 132, + 151, 176, 169, 117, 82, 190, 83, 188, 234, 46, 6, 117, 42, 183, 96, 137, + 207, 116, 38, 95, 119, 80, 229, 222, 170, 20, 22, 81, 183, 52, 190, 255, + 41, 248, 211, 87, 193, 119, 127, 250, 61, 46, 17, 248, 249, 74, 46, 128, + 171, 141, 33, 161, 163, 6, 48, 7, 247, 188, 59, 26, 229, 22, 204, 114, + 122, 51, 88, 14, 7, 243, 64, 53, 196, 177, 52, 117, 37, 178, 107, 46, + 5, 137, 83, 217, 74, 86, 151, 13, 239, 184, 184, 168, 63, 9, 231, 210, + 159, 8, 136, 240, 23, 24, 78, 140, 90, 248, 9, 249, 4, 250, 193, 251, + 238, 79, 116, 244, 29, 208, 3, 108, 97, 3, 160, 118, 61, 248, 168, 154, + 232, 167, 183, 105, 31, 115, 247, 167, 125, 42, 204, 182, 100, 240, 187, 238, + 141, 86, 24, 236, 14, 158, 129, 81, 29, 124, 196, 143, 55, 104, 244, 13, + 203, 120, 222, 237, 45, 229, 43, 90, 108, 243, 183, 1, 53, 3, 123, 93, + 159, 165, 226, 186, 21, 76, 27, 167, 107, 252, 74, 93, 179, 76, 127, 224, + 157, 242, 15, 212, 19, 177, 77, 248, 140, 6, 67, 98, 24, 252, 34, 42, + 214, 1, 113, 141, 70, 40, 48, 41, 158, 67, 63, 185, 147, 193, 141, 172, + 122, 138, 158, 131, 97, 177, 205, 49, 246, 232, 39, 56, 16, 77, 100, 29, + 232, 119, 16, 255, 94, 227, 108, 193, 211, 2, 221, 208, 203, 98, 139, 65, + 119, 60, 226, 110, 200, 71, 216, 229, 214, 88, 68, 53, 40, 130, 235, 125, + 98, 121, 87, 23, 14, 92, 104, 140, 99, 191, 134, 214, 123, 58, 201, 188, + 234, 207, 106, 246, 204, 215, 208, 108, 13, 211, 199, 131, 126, 218, 85, 149, + 240, 155, 170, 195, 168, 222, 172, 218, 232, 148, 236, 208, 244, 122, 41, 192, + 138, 143, 98, 234, 117, 75, 144, 38, 129, 4, 219, 216, 120, 134, 191, 171, + 43, 57, 235, 76, 254, 225, 23, 81, 71, 230, 91, 227, 45, 189, 129, 185, + 98, 117, 149, 160, 221, 233, 106, 212, 71, 180, 133, 222, 149, 40, 76, 14, + 16, 117, 200, 77, 207, 97, 120, 89, 2, 214, 202, 69, 45, 118, 0, 49, + 128, 151, 153, 105, 183, 244, 162, 116, 96, 43, 177, 214, 69, 66, 235, 160, + 232, 38, 210, 162, 16, 251, 189, 65, 207, 167, 51, 17, 98, 195, 69, 147, + 15, 164, 175, 20, 41, 30, 61, 180, 163, 218, 33, 91, 96, 242, 43, 50, + 228, 188, 206, 113, 237, 137, 136, 180, 157, 249, 205, 21, 50, 225, 151, 133, + 13, 44, 7, 139, 37, 189, 197, 125, 87, 178, 248, 92, 137, 64, 75, 163, + 148, 136, 224, 139, 150, 11, 248, 238, 121, 9, 218, 211, 73, 202, 238, 121, + 207, 69, 251, 34, 92, 29, 238, 43, 91, 12, 151, 180, 219, 17, 195, 219, + 153, 174, 150, 184, 80, 168, 179, 223, 2, 108, 78, 222, 123, 238, 123, 207, + 204, 135, 97, 148, 130, 184, 137, 17, 80, 84, 164, 110, 239, 158, 222, 66, + 103, 128, 226, 4, 52, 230, 0, 186, 23, 8, 244, 12, 144, 210, 4, 136, + 73, 1, 83, 153, 127, 135, 145, 104, 50, 24, 48, 241, 11, 8, 255, 3, + 69, 240, 2, 38, 119, 129, 73, 236, 2, 77, 234, 254, 29, 198, 72, 180, + 56, 80, 148, 56, 16, 244, 55, 0, 234, 27, 88, 180, 55, 16, 148, 55, + 80, 116, 247, 223, 97, 120, 122, 99, 8, 140, 109, 33, 80, 155, 66, 32, + 183, 130, 64, 110, 4, 193, 116, 30, 252, 27, 173, 54, 185, 75, 5, 176, + 71, 5, 98, 135, 10, 244, 254, 20, 240, 206, 19, 152, 91, 69, 32, 137, + 250, 191, 195, 248, 212, 174, 19, 168, 189, 38, 160, 157, 38, 144, 251, 76, + 64, 180, 62, 208, 123, 76, 0, 59, 140, 35, 185, 67, 37, 116, 35, 146, + 100, 221, 41, 104, 69, 17, 229, 227, 148, 58, 160, 226, 120, 59, 147, 100, + 59, 129, 151, 178, 95, 173, 236, 136, 225, 74, 20, 127, 94, 246, 39, 231, + 73, 92, 17, 148, 206, 55, 174, 37, 152, 53, 180, 110, 58, 245, 45, 5, + 176, 210, 200, 123, 6, 192, 112, 2, 79, 207, 28, 33, 74, 129, 152, 205, + 43, 121, 62, 182, 226, 149, 168, 49, 190, 4, 83, 202, 40, 22, 223, 46, + 194, 8, 203, 208, 193, 46, 57, 170, 113, 231, 183, 238, 181, 100, 140, 169, + 38, 20, 156, 26, 177, 223, 72, 177, 145, 12, 226, 172, 190, 34, 39, 170, + 221, 129, 11, 14, 84, 118, 9, 15, 25, 249, 222, 88, 199, 94, 138, 97, + 140, 136, 225, 204, 209, 129, 230, 69, 120, 25, 200, 127, 185, 64, 45, 192, + 127, 123, 139, 16, 45, 150, 158, 135, 103, 205, 55, 209, 73, 243, 212, 93, + 160, 177, 242, 66, 190, 225, 105, 121, 17, 6, 139, 168, 226, 237, 220, 231, + 238, 223, 0, 114, 131, 165, 208, 194, 225, 171, 84, 183, 252, 39, 193, 104, + 195, 33, 210, 12, 154, 76, 190, 15, 252, 69, 45, 170, 151, 161, 250, 23, + 49, 204, 90, 246, 63, 85, 161, 170, 42, 195, 186, 103, 171, 140, 116, 149, + 47, 132, 53, 228, 54, 12, 188, 5, 70, 200, 253, 4, 220, 78, 146, 180, + 60, 74, 181, 147, 48, 176, 38, 173, 149, 48, 216, 46, 234, 112, 252, 233, + 176, 3, 6, 63, 186, 136, 131, 38, 197, 230, 195, 95, 44, 120, 81, 194, + 163, 87, 233, 50, 73, 74, 204, 159, 152, 101, 161, 173, 197, 14, 203, 203, + 52, 14, 11, 4, 133, 91, 151, 240, 211, 196, 31, 89, 87, 77, 197, 150, + 149, 249, 22, 67, 245, 120, 125, 209, 228, 48, 50, 144, 27, 242, 254, 98, + 121, 170, 11, 132, 67, 233, 48, 16, 17, 66, 209, 200, 44, 184, 136, 47, + 3, 81, 2, 67, 162, 83, 183, 244, 128, 248, 141, 234, 174, 97, 160, 245, + 104, 80, 143, 66, 247, 136, 163, 167, 207, 201, 149, 170, 58, 215, 161, 46, + 17, 247, 197, 40, 45, 123, 246, 139, 8, 213, 126, 176, 43, 77, 213, 149, + 159, 67, 114, 157, 36, 235, 12, 109, 48, 205, 111, 185, 3, 26, 220, 244, + 250, 11, 33, 230, 193, 54, 178, 117, 23, 78, 105, 225, 132, 134, 98, 196, + 12, 34, 123, 88, 15, 134, 48, 54, 77, 237, 170, 122, 31, 82, 3, 3, + 218, 225, 136, 203, 134, 174, 47, 215, 193, 172, 231, 137, 124, 69, 5, 228, + 238, 72, 191, 227, 138, 62, 113, 126, 39, 214, 172, 74, 237, 99, 106, 77, + 164, 186, 189, 11, 21, 141, 72, 102, 16, 7, 16, 35, 211, 17, 62, 196, + 50, 3, 157, 42, 79, 212, 228, 68, 10, 250, 2, 72, 50, 27, 158, 43, + 160, 146, 58, 5, 84, 65, 9, 54, 53, 213, 136, 160, 186, 152, 6, 46, + 208, 136, 210, 81, 177, 70, 4, 66, 202, 119, 73, 156, 92, 79, 28, 0, + 77, 102, 56, 198, 89, 246, 196, 169, 203, 14, 119, 175, 112, 145, 232, 60, + 116, 180, 21, 3, 194, 30, 252, 140, 15, 117, 209, 38, 22, 56, 212, 56, + 29, 138, 68, 229, 144, 190, 183, 120, 189, 184, 60, 159, 163, 161, 113, 243, + 21, 104, 165, 152, 91, 153, 75, 157, 178, 33, 103, 149, 105, 1, 193, 169, + 30, 197, 24, 15, 175, 198, 136, 94, 203, 12, 95, 28, 200, 79, 28, 221, + 131, 186, 28, 164, 134, 252, 226, 255, 206, 177, 170, 71, 195, 221, 58, 229, + 27, 224, 173, 138, 241, 115, 13, 241, 171, 125, 69, 89, 34, 96, 32, 82, + 253, 80, 129, 1, 77, 177, 64, 43, 65, 127, 98, 141, 92, 252, 208, 148, + 203, 37, 86, 116, 81, 84, 160, 197, 13, 25, 8, 10, 0, 214, 56, 169, + 74, 132, 18, 122, 34, 232, 37, 61, 96, 182, 115, 209, 55, 160, 157, 177, + 217, 16, 234, 241, 74, 160, 33, 105, 207, 119, 93, 10, 53, 140, 129, 158, + 39, 18, 170, 18, 188, 42, 51, 45, 30, 185, 7, 193, 48, 41, 86, 50, + 6, 102, 30, 46, 110, 121, 243, 128, 161, 99, 183, 3, 57, 248, 150, 236, + 10, 222, 139, 194, 155, 11, 57, 49, 24, 165, 189, 213, 136, 250, 109, 137, + 10, 131, 226, 18, 221, 4, 31, 65, 39, 118, 220, 29, 245, 214, 155, 46, + 20, 94, 225, 15, 227, 184, 152, 223, 227, 102, 227, 101, 17, 86, 72, 25, + 13, 44, 199, 238, 58, 131, 143, 90, 106, 83, 60, 70, 12, 62, 253, 176, + 49, 98, 244, 232, 125, 99, 212, 66, 159, 226, 86, 40, 92, 231, 3, 219, + 81, 161, 61, 139, 91, 210, 146, 167, 44, 26, 211, 146, 105, 100, 65, 163, + 101, 83, 98, 77, 198, 110, 65, 177, 28, 76, 149, 200, 74, 148, 210, 84, + 87, 231, 81, 178, 172, 162, 158, 48, 197, 179, 87, 166, 81, 118, 138, 119, + 99, 245, 79, 153, 217, 146, 210, 176, 226, 5, 99, 211, 70, 221, 84, 93, + 174, 200, 218, 25, 177, 8, 176, 156, 115, 251, 111, 132, 91, 186, 4, 102, + 193, 120, 149, 244, 77, 67, 137, 249, 90, 65, 234, 69, 99, 199, 214, 185, + 68, 34, 30, 47, 174, 240, 158, 133, 42, 155, 146, 114, 61, 139, 130, 43, + 56, 33, 105, 12, 115, 164, 49, 223, 97, 148, 17, 74, 226, 36, 60, 94, + 103, 6, 29, 217, 219, 159, 146, 27, 42, 202, 175, 82, 66, 155, 244, 103, + 196, 138, 249, 252, 81, 38, 191, 22, 79, 222, 75, 72, 210, 235, 37, 63, + 114, 31, 235, 17, 7, 163, 63, 188, 36, 114, 197, 208, 253, 244, 33, 154, + 35, 228, 159, 230, 102, 175, 176, 165, 202, 148, 229, 200, 120, 47, 196, 80, + 75, 116, 122, 226, 92, 227, 103, 143, 29, 37, 125, 133, 14, 124, 72, 26, + 87, 190, 128, 30, 149, 23, 232, 242, 117, 225, 94, 6, 139, 160, 89, 169, + 156, 190, 173, 125, 229, 145, 11, 33, 154, 63, 188, 113, 229, 29, 48, 140, + 144, 136, 12, 70, 140, 44, 181, 107, 236, 218, 99, 107, 140, 101, 141, 177, + 168, 17, 123, 72, 47, 65, 232, 108, 163, 32, 253, 22, 14, 191, 164, 86, + 136, 44, 42, 60, 139, 142, 159, 99, 62, 116, 104, 91, 126, 30, 87, 78, + 221, 43, 56, 253, 194, 219, 219, 139, 231, 205, 32, 189, 60, 117, 201, 161, + 53, 228, 56, 199, 15, 23, 212, 15, 124, 34, 71, 222, 151, 129, 204, 71, + 142, 159, 222, 150, 159, 135, 112, 14, 197, 234, 46, 43, 167, 169, 231, 112, + 175, 212, 89, 32, 214, 44, 43, 70, 38, 46, 226, 196, 108, 49, 244, 227, + 96, 251, 44, 9, 223, 0, 56, 78, 222, 30, 4, 113, 231, 250, 230, 127, + 13, 148, 201, 250, 84, 116, 46, 224, 208, 225, 247, 3, 62, 157, 252, 27, + 227, 116, 144, 78, 174, 31, 7, 241, 179, 127, 50, 94, 227, 37, 199, 255, + 4, 188, 254, 87, 67, 250, 209, 184, 173, 206, 138, 79, 141, 219, 238, 214, + 6, 14, 46, 121, 156, 129, 115, 132, 71, 0, 127, 162, 96, 29, 108, 130, + 143, 65, 88, 161, 174, 246, 42, 181, 36, 197, 193, 213, 134, 233, 98, 57, + 133, 227, 7, 71, 123, 185, 67, 197, 155, 237, 29, 218, 55, 169, 104, 187, + 98, 72, 108, 123, 85, 48, 156, 47, 139, 75, 95, 114, 100, 52, 127, 141, + 252, 236, 229, 135, 42, 238, 15, 191, 0, 81, 122, 151, 240, 0, 93, 255, + 29, 143, 113, 241, 60, 164, 151, 87, 234, 101, 209, 112, 215, 18, 205, 133, + 51, 68, 104, 20, 26, 191, 29, 160, 65, 171, 231, 191, 243, 202, 232, 18, + 254, 3, 226, 63, 252, 52, 225, 247, 131, 91, 115, 155, 167, 206, 144, 94, + 134, 229, 231, 31, 154, 20, 121, 98, 182, 41, 167, 23, 240, 18, 64, 5, + 23, 31, 46, 107, 181, 203, 128, 241, 29, 26, 10, 32, 115, 112, 55, 236, + 63, 199, 72, 17, 184, 96, 56, 207, 121, 130, 233, 98, 156, 88, 84, 134, + 220, 142, 26, 237, 42, 124, 170, 69, 21, 72, 194, 242, 240, 63, 236, 6, + 0, 173, 124, 141, 70, 130, 216, 159, 48, 112, 63, 156, 81, 81, 248, 83, + 9, 224, 92, 249, 65, 222, 21, 66, 101, 53, 172, 141, 155, 49, 235, 192, + 246, 149, 68, 21, 82, 145, 7, 99, 131, 81, 255, 92, 194, 41, 10, 188, + 180, 87, 126, 142, 131, 175, 53, 107, 235, 138, 231, 18, 127, 43, 13, 242, + 32, 35, 250, 22, 223, 250, 239, 0, 182, 84, 148, 68, 65, 198, 242, 252, + 192, 66, 218, 252, 44, 127, 97, 218, 248, 142, 221, 31, 115, 207, 158, 104, + 202, 113, 182, 62, 4, 206, 135, 136, 102, 158, 220, 94, 126, 136, 5, 22, + 196, 136, 5, 177, 192, 130, 216, 196, 130, 152, 65, 31, 229, 208, 32, 206, + 163, 65, 68, 120, 16, 107, 60, 136, 51, 120, 16, 231, 240, 224, 95, 143, + 10, 209, 175, 64, 133, 47, 194, 130, 228, 136, 153, 216, 193, 14, 19, 52, + 104, 24, 133, 156, 123, 191, 7, 41, 237, 83, 214, 214, 211, 200, 142, 230, + 159, 76, 165, 159, 114, 96, 251, 200, 116, 225, 72, 191, 200, 113, 40, 63, + 188, 250, 67, 199, 215, 93, 255, 170, 137, 251, 210, 71, 144, 47, 59, 178, + 135, 206, 156, 212, 171, 49, 142, 196, 36, 55, 142, 133, 220, 88, 72, 27, + 170, 166, 132, 87, 11, 202, 13, 73, 121, 83, 92, 4, 105, 169, 76, 211, + 144, 166, 147, 168, 81, 30, 164, 31, 45, 183, 212, 42, 63, 212, 205, 168, + 184, 155, 97, 174, 155, 145, 234, 102, 248, 207, 234, 166, 18, 236, 30, 73, + 32, 41, 129, 2, 138, 112, 26, 38, 72, 35, 170, 94, 202, 228, 249, 11, + 73, 225, 234, 205, 131, 130, 126, 214, 112, 122, 148, 216, 78, 41, 67, 21, + 8, 199, 243, 185, 89, 95, 234, 65, 194, 95, 125, 173, 194, 23, 128, 247, + 8, 125, 13, 13, 172, 172, 64, 141, 208, 176, 80, 156, 198, 83, 255, 56, + 97, 218, 154, 4, 137, 240, 87, 74, 18, 13, 101, 77, 121, 211, 225, 102, + 125, 200, 239, 83, 171, 204, 104, 69, 46, 228, 157, 52, 213, 83, 202, 168, + 64, 222, 167, 72, 149, 185, 94, 121, 229, 216, 125, 98, 5, 223, 45, 249, + 44, 218, 119, 153, 159, 111, 94, 234, 134, 27, 30, 200, 34, 17, 52, 245, + 217, 121, 4, 61, 71, 133, 47, 119, 142, 183, 123, 116, 47, 110, 92, 133, + 231, 99, 84, 218, 158, 130, 200, 152, 252, 138, 124, 147, 177, 41, 64, 232, + 18, 34, 163, 25, 70, 15, 13, 45, 90, 117, 140, 160, 71, 70, 29, 45, + 17, 44, 207, 184, 235, 47, 108, 178, 230, 146, 203, 137, 35, 93, 24, 205, + 20, 12, 231, 36, 42, 136, 170, 184, 61, 66, 227, 209, 19, 247, 66, 68, + 130, 36, 2, 189, 87, 9, 54, 51, 91, 57, 213, 85, 17, 105, 145, 42, + 121, 248, 180, 101, 108, 115, 209, 230, 119, 115, 20, 133, 149, 146, 203, 215, + 153, 210, 211, 51, 46, 136, 154, 238, 53, 99, 48, 30, 71, 205, 145, 236, + 153, 215, 76, 151, 69, 71, 103, 232, 49, 106, 62, 17, 38, 87, 174, 191, + 173, 195, 6, 208, 1, 62, 17, 182, 140, 208, 17, 26, 24, 228, 6, 32, + 167, 241, 16, 145, 171, 38, 248, 56, 70, 215, 97, 91, 255, 89, 221, 12, + 33, 137, 194, 77, 116, 87, 120, 206, 70, 137, 117, 237, 249, 67, 148, 170, + 74, 181, 14, 229, 198, 169, 230, 200, 17, 80, 44, 104, 114, 235, 192, 10, + 216, 77, 188, 99, 144, 225, 170, 69, 236, 69, 118, 212, 209, 48, 86, 106, + 131, 24, 66, 182, 92, 54, 39, 152, 249, 255, 199, 205, 104, 137, 11, 61, + 122, 253, 177, 135, 38, 164, 128, 27, 57, 83, 162, 121, 243, 101, 239, 36, + 21, 53, 46, 86, 218, 153, 25, 6, 192, 212, 222, 192, 233, 49, 38, 110, + 151, 211, 71, 33, 157, 20, 170, 3, 111, 250, 107, 238, 145, 27, 243, 45, + 60, 78, 179, 233, 118, 0, 78, 41, 232, 122, 192, 136, 87, 217, 175, 46, + 144, 137, 128, 89, 235, 194, 202, 203, 152, 61, 2, 131, 14, 29, 45, 211, + 17, 3, 184, 243, 15, 13, 225, 161, 96, 129, 190, 176, 50, 139, 76, 95, + 4, 184, 232, 196, 135, 132, 252, 202, 64, 67, 58, 242, 73, 39, 147, 193, + 92, 4, 137, 149, 129, 55, 166, 171, 101, 38, 237, 158, 137, 100, 16, 118, + 181, 202, 178, 165, 77, 238, 150, 255, 58, 77, 23, 139, 233, 164, 142, 42, + 74, 253, 67, 6, 26, 178, 155, 236, 127, 192, 236, 155, 118, 67, 96, 116, + 14, 173, 109, 80, 75, 55, 55, 94, 211, 170, 194, 138, 54, 22, 114, 48, + 12, 35, 172, 24, 16, 229, 69, 152, 120, 19, 232, 30, 53, 13, 159, 162, + 196, 227, 199, 131, 24, 163, 154, 43, 26, 99, 128, 186, 198, 208, 254, 2, + 8, 63, 176, 145, 187, 157, 199, 217, 136, 170, 211, 184, 84, 128, 88, 178, + 205, 115, 104, 88, 42, 13, 149, 178, 40, 252, 35, 18, 219, 57, 42, 6, + 221, 213, 154, 24, 254, 7, 206, 148, 244, 16, 229, 53, 160, 72, 227, 199, + 111, 150, 46, 159, 37, 37, 130, 75, 145, 34, 85, 246, 134, 71, 196, 135, + 197, 91, 37, 195, 26, 143, 222, 133, 19, 31, 101, 71, 132, 142, 11, 211, + 111, 19, 244, 98, 130, 167, 238, 180, 183, 199, 95, 117, 140, 30, 177, 252, + 244, 219, 32, 170, 145, 199, 106, 92, 5, 105, 239, 44, 129, 36, 10, 219, + 26, 74, 3, 118, 72, 69, 211, 245, 6, 251, 17, 34, 35, 142, 137, 254, + 14, 252, 73, 29, 114, 28, 65, 177, 10, 25, 115, 160, 201, 7, 249, 66, + 193, 142, 228, 116, 123, 12, 166, 33, 54, 157, 6, 209, 162, 43, 2, 196, + 92, 92, 168, 73, 80, 194, 52, 220, 222, 36, 219, 159, 119, 108, 42, 140, + 166, 148, 210, 64, 163, 193, 62, 145, 92, 118, 201, 50, 152, 35, 133, 112, + 155, 206, 13, 239, 5, 235, 13, 244, 190, 42, 130, 175, 185, 13, 26, 111, + 228, 212, 186, 252, 181, 231, 194, 19, 223, 69, 242, 33, 66, 16, 203, 51, + 41, 57, 147, 246, 119, 56, 68, 118, 186, 164, 45, 183, 66, 2, 248, 126, + 104, 199, 4, 237, 88, 66, 59, 206, 65, 59, 15, 108, 19, 214, 123, 65, + 13, 255, 255, 229, 162, 222, 102, 31, 106, 6, 177, 199, 212, 214, 101, 102, + 7, 112, 40, 242, 28, 238, 243, 8, 17, 128, 7, 146, 46, 58, 18, 109, + 240, 169, 230, 164, 163, 238, 108, 4, 128, 4, 26, 28, 146, 231, 39, 215, + 7, 80, 59, 202, 227, 69, 222, 74, 7, 218, 255, 232, 70, 199, 1, 252, + 31, 229, 140, 47, 119, 20, 17, 235, 165, 244, 193, 135, 59, 86, 7, 168, + 245, 120, 74, 170, 152, 104, 110, 8, 16, 155, 47, 181, 245, 33, 84, 101, + 155, 29, 138, 80, 74, 178, 144, 88, 103, 143, 140, 43, 69, 141, 96, 196, + 68, 97, 35, 60, 233, 239, 55, 47, 44, 220, 169, 172, 142, 191, 10, 131, + 87, 109, 39, 51, 22, 69, 150, 94, 10, 103, 41, 175, 195, 92, 212, 115, + 233, 216, 166, 34, 135, 83, 39, 214, 199, 30, 85, 206, 226, 148, 156, 104, + 62, 59, 138, 43, 172, 220, 201, 218, 179, 236, 251, 152, 226, 15, 70, 58, + 254, 32, 179, 4, 236, 125, 36, 107, 58, 69, 253, 21, 241, 133, 209, 142, + 91, 121, 28, 125, 224, 12, 136, 162, 159, 55, 1, 202, 89, 112, 32, 39, + 163, 105, 78, 198, 203, 199, 79, 134, 232, 78, 171, 29, 180, 94, 5, 237, + 216, 177, 135, 167, 93, 205, 10, 175, 33, 210, 199, 240, 203, 162, 89, 17, + 174, 134, 138, 134, 88, 224, 183, 218, 21, 94, 171, 239, 155, 160, 227, 86, + 0, 255, 103, 215, 50, 228, 46, 223, 143, 164, 179, 96, 224, 43, 54, 228, + 45, 95, 39, 121, 114, 242, 208, 141, 66, 241, 228, 225, 97, 0, 181, 245, + 30, 179, 110, 68, 153, 95, 179, 108, 126, 237, 76, 137, 46, 52, 195, 224, + 101, 232, 216, 3, 201, 184, 128, 142, 139, 167, 71, 46, 154, 130, 177, 60, + 116, 177, 100, 92, 251, 22, 153, 218, 222, 187, 118, 214, 143, 131, 188, 225, + 168, 231, 95, 9, 253, 181, 9, 248, 245, 163, 97, 190, 103, 20, 15, 132, + 59, 5, 73, 181, 200, 82, 206, 33, 23, 245, 107, 243, 56, 208, 42, 247, + 24, 255, 74, 192, 110, 76, 192, 110, 30, 13, 216, 194, 49, 60, 28, 172, + 167, 15, 1, 235, 199, 199, 129, 149, 130, 163, 64, 191, 22, 79, 14, 89, + 213, 155, 199, 193, 104, 95, 135, 30, 14, 166, 163, 123, 192, 180, 88, 93, + 73, 157, 104, 247, 2, 15, 0, 108, 240, 113, 169, 76, 124, 59, 55, 221, + 116, 114, 158, 68, 26, 86, 211, 241, 108, 133, 192, 26, 14, 240, 44, 159, + 162, 254, 52, 213, 80, 23, 108, 184, 105, 43, 91, 158, 206, 102, 211, 69, + 10, 217, 167, 215, 194, 236, 79, 30, 176, 42, 238, 213, 96, 121, 135, 58, + 80, 88, 83, 6, 196, 170, 53, 246, 73, 61, 48, 205, 125, 161, 147, 2, + 63, 85, 174, 191, 65, 14, 105, 84, 168, 218, 254, 170, 254, 123, 55, 165, + 0, 203, 20, 77, 8, 253, 143, 12, 69, 73, 119, 216, 189, 165, 51, 158, + 232, 191, 244, 9, 11, 224, 232, 13, 33, 27, 64, 148, 170, 99, 9, 94, + 249, 247, 1, 212, 133, 226, 238, 175, 238, 117, 15, 69, 224, 218, 27, 22, + 168, 112, 49, 169, 41, 16, 186, 237, 150, 97, 164, 99, 78, 144, 113, 54, + 196, 224, 211, 100, 104, 239, 21, 154, 233, 40, 140, 18, 147, 117, 239, 68, + 201, 185, 144, 7, 69, 132, 187, 134, 52, 25, 228, 88, 182, 244, 56, 76, + 105, 243, 66, 14, 183, 229, 135, 156, 65, 78, 168, 76, 114, 30, 39, 135, + 112, 106, 231, 82, 251, 56, 102, 41, 120, 157, 205, 10, 232, 180, 52, 64, + 190, 124, 32, 196, 190, 78, 42, 165, 238, 71, 44, 226, 205, 186, 105, 193, + 207, 208, 144, 67, 85, 193, 42, 232, 201, 130, 53, 187, 34, 40, 31, 226, + 129, 71, 233, 61, 11, 41, 118, 215, 20, 36, 106, 75, 252, 183, 4, 155, + 239, 217, 17, 145, 136, 78, 250, 255, 165, 253, 193, 84, 226, 111, 23, 161, + 78, 222, 57, 174, 211, 17, 30, 254, 39, 221, 241, 32, 240, 102, 221, 121, + 119, 28, 49, 85, 34, 71, 207, 148, 240, 142, 19, 60, 245, 29, 90, 52, + 191, 194, 171, 23, 76, 174, 58, 215, 240, 54, 88, 72, 113, 7, 76, 175, + 72, 177, 156, 28, 139, 15, 41, 224, 47, 124, 67, 91, 245, 1, 160, 20, + 186, 187, 184, 234, 2, 14, 97, 79, 175, 167, 115, 140, 190, 152, 11, 128, + 247, 149, 232, 52, 119, 89, 80, 64, 236, 25, 75, 0, 177, 45, 116, 198, + 139, 238, 64, 132, 168, 196, 72, 156, 206, 213, 160, 247, 45, 105, 64, 28, + 101, 252, 75, 222, 236, 167, 119, 251, 151, 21, 117, 27, 9, 106, 241, 130, + 146, 109, 93, 143, 166, 119, 131, 121, 224, 193, 236, 1, 252, 98, 56, 159, + 120, 193, 107, 71, 131, 63, 71, 118, 5, 55, 236, 121, 108, 241, 22, 133, + 210, 237, 4, 134, 215, 58, 78, 118, 36, 70, 131, 133, 53, 89, 141, 49, + 12, 20, 202, 83, 194, 58, 94, 134, 120, 18, 60, 25, 198, 152, 1, 140, + 100, 14, 112, 126, 188, 160, 101, 137, 103, 98, 119, 229, 190, 247, 72, 166, + 130, 128, 175, 3, 224, 235, 4, 120, 18, 170, 188, 247, 56, 116, 29, 230, + 129, 231, 235, 212, 219, 53, 216, 231, 254, 51, 67, 124, 7, 180, 111, 208, + 7, 44, 88, 45, 208, 234, 86, 184, 28, 12, 200, 87, 104, 64, 83, 159, + 248, 40, 116, 35, 78, 27, 206, 221, 139, 206, 2, 210, 200, 189, 73, 178, + 245, 230, 128, 151, 137, 27, 157, 186, 11, 142, 137, 137, 119, 251, 207, 67, + 247, 242, 212, 85, 119, 242, 17, 222, 201, 143, 144, 152, 64, 102, 125, 37, + 143, 97, 175, 22, 73, 130, 101, 62, 64, 153, 15, 238, 101, 165, 2, 164, + 229, 14, 215, 153, 191, 189, 78, 151, 172, 194, 122, 113, 249, 30, 165, 60, + 23, 119, 193, 240, 114, 183, 163, 235, 118, 120, 189, 218, 53, 224, 239, 122, + 231, 244, 167, 206, 50, 93, 194, 217, 103, 235, 83, 95, 225, 203, 246, 31, + 100, 66, 40, 19, 214, 187, 202, 155, 78, 169, 81, 58, 9, 255, 177, 211, + 105, 44, 14, 48, 198, 2, 13, 243, 199, 75, 246, 175, 79, 45, 249, 84, + 183, 144, 79, 170, 239, 91, 159, 128, 83, 189, 200, 118, 83, 212, 46, 250, + 122, 185, 51, 235, 64, 225, 1, 126, 173, 37, 190, 2, 178, 16, 107, 224, + 95, 6, 116, 82, 143, 92, 126, 66, 241, 146, 242, 254, 8, 29, 48, 242, + 192, 228, 241, 19, 74, 185, 163, 157, 145, 145, 37, 157, 28, 218, 15, 115, + 188, 128, 188, 152, 114, 215, 77, 129, 100, 210, 60, 147, 182, 197, 182, 26, + 124, 253, 183, 239, 254, 252, 231, 63, 126, 243, 183, 157, 135, 214, 86, 158, + 72, 249, 238, 237, 159, 254, 251, 111, 59, 56, 43, 33, 229, 135, 180, 63, + 236, 220, 187, 11, 24, 48, 60, 222, 237, 170, 20, 175, 8, 159, 135, 252, + 204, 254, 100, 171, 24, 112, 198, 165, 38, 176, 247, 233, 227, 90, 248, 218, + 108, 225, 200, 104, 225, 72, 183, 112, 244, 171, 90, 248, 78, 180, 16, 6, + 119, 44, 38, 20, 181, 38, 81, 166, 74, 200, 59, 221, 185, 4, 165, 100, + 139, 58, 3, 109, 224, 231, 72, 70, 4, 147, 72, 201, 245, 40, 172, 82, + 46, 180, 3, 203, 21, 254, 254, 175, 95, 125, 253, 71, 70, 44, 90, 76, + 231, 214, 36, 114, 154, 75, 127, 113, 162, 104, 150, 248, 77, 35, 132, 145, + 159, 194, 75, 138, 54, 104, 14, 135, 64, 108, 161, 153, 29, 15, 236, 25, + 52, 248, 255, 26, 207, 127, 252, 30, 33, 233, 134, 140, 171, 138, 154, 200, + 13, 90, 144, 42, 242, 124, 183, 16, 161, 13, 5, 1, 46, 81, 108, 62, + 34, 195, 6, 161, 5, 202, 2, 4, 216, 111, 50, 249, 241, 91, 140, 80, + 11, 17, 179, 163, 236, 183, 63, 125, 162, 85, 230, 249, 199, 94, 165, 98, + 80, 19, 12, 101, 135, 81, 96, 42, 238, 70, 10, 242, 214, 218, 11, 218, + 198, 149, 97, 56, 252, 150, 136, 63, 48, 190, 37, 111, 133, 179, 249, 244, + 102, 78, 170, 248, 166, 80, 50, 88, 193, 88, 96, 28, 238, 185, 107, 17, + 70, 247, 194, 243, 207, 189, 75, 109, 18, 219, 114, 107, 66, 126, 89, 247, + 163, 6, 206, 246, 127, 1, 151, 90, 165, 89, 223, 213, 183, 101, 228, 88, + 43, 252, 90, 71, 27, 234, 57, 70, 132, 192, 177, 232, 81, 184, 83, 162, + 59, 188, 165, 189, 119, 49, 45, 240, 87, 129, 127, 190, 19, 115, 252, 204, + 71, 11, 49, 10, 251, 169, 122, 139, 1, 64, 170, 92, 251, 17, 198, 39, + 166, 222, 190, 159, 23, 245, 119, 229, 93, 194, 86, 241, 13, 194, 17, 16, + 147, 88, 104, 15, 202, 160, 141, 172, 25, 197, 143, 213, 41, 196, 61, 212, + 5, 155, 71, 138, 237, 30, 61, 121, 118, 122, 80, 126, 142, 236, 90, 199, + 19, 54, 228, 24, 48, 147, 18, 59, 176, 219, 13, 216, 111, 38, 238, 72, + 69, 91, 185, 24, 94, 198, 115, 178, 25, 109, 128, 205, 210, 1, 69, 70, + 24, 95, 76, 180, 134, 174, 184, 186, 227, 128, 54, 118, 185, 183, 166, 228, + 121, 216, 222, 105, 145, 75, 58, 20, 127, 158, 107, 135, 125, 145, 130, 124, + 24, 157, 198, 91, 140, 114, 95, 228, 231, 15, 21, 148, 101, 233, 97, 152, + 247, 28, 230, 80, 176, 178, 134, 147, 129, 141, 246, 2, 197, 27, 48, 172, + 148, 125, 55, 31, 161, 29, 90, 94, 4, 181, 20, 96, 144, 30, 159, 44, + 48, 184, 158, 247, 28, 157, 61, 241, 210, 104, 138, 165, 193, 109, 18, 236, + 168, 131, 174, 226, 142, 74, 126, 171, 132, 11, 103, 209, 25, 172, 151, 208, + 131, 150, 23, 192, 249, 0, 14, 15, 56, 43, 240, 148, 248, 219, 157, 51, + 2, 196, 73, 145, 98, 76, 29, 209, 24, 94, 63, 160, 57, 57, 108, 248, + 119, 13, 177, 41, 121, 23, 228, 160, 235, 210, 253, 154, 243, 80, 79, 220, + 178, 7, 220, 254, 26, 184, 125, 175, 226, 25, 56, 221, 2, 156, 22, 219, + 28, 55, 228, 126, 36, 201, 246, 93, 189, 124, 247, 226, 85, 5, 247, 142, + 105, 131, 251, 19, 183, 131, 241, 172, 117, 11, 44, 42, 209, 165, 105, 35, + 179, 20, 32, 139, 159, 238, 220, 180, 150, 32, 193, 51, 104, 30, 85, 113, + 51, 78, 123, 2, 246, 141, 25, 30, 34, 31, 73, 162, 239, 217, 102, 190, + 208, 222, 242, 132, 27, 138, 81, 21, 121, 77, 205, 211, 106, 164, 207, 38, + 229, 118, 245, 36, 135, 116, 106, 182, 214, 56, 130, 30, 111, 235, 60, 57, + 7, 29, 113, 53, 142, 145, 114, 245, 170, 191, 78, 231, 11, 193, 158, 179, + 79, 234, 174, 124, 5, 190, 27, 81, 252, 19, 116, 42, 193, 84, 100, 218, + 233, 3, 28, 2, 6, 179, 115, 12, 124, 117, 152, 34, 116, 217, 19, 156, + 73, 15, 52, 145, 72, 39, 136, 223, 76, 216, 168, 171, 1, 115, 221, 188, + 60, 208, 81, 80, 119, 163, 169, 192, 219, 235, 28, 67, 142, 7, 231, 233, + 108, 0, 231, 102, 100, 5, 97, 253, 163, 45, 151, 88, 70, 221, 249, 64, + 230, 166, 166, 144, 206, 244, 87, 115, 58, 8, 204, 167, 112, 14, 194, 59, + 70, 251, 108, 158, 93, 112, 99, 104, 104, 136, 145, 205, 96, 189, 97, 144, + 7, 232, 124, 169, 1, 248, 15, 36, 102, 1, 201, 116, 88, 71, 135, 122, + 112, 148, 170, 4, 124, 166, 0, 214, 90, 92, 184, 175, 186, 35, 99, 104, + 170, 29, 93, 149, 89, 199, 66, 28, 206, 148, 27, 223, 197, 161, 75, 92, + 73, 254, 202, 171, 137, 16, 27, 84, 216, 205, 170, 154, 70, 190, 222, 53, + 230, 177, 30, 113, 152, 56, 57, 117, 202, 127, 82, 150, 10, 154, 117, 74, + 114, 40, 209, 40, 19, 47, 12, 105, 30, 135, 11, 107, 10, 58, 40, 191, + 180, 18, 12, 184, 130, 41, 101, 191, 69, 8, 244, 9, 182, 86, 100, 75, + 57, 63, 29, 97, 206, 237, 80, 98, 28, 164, 50, 23, 71, 76, 83, 208, + 152, 125, 230, 101, 113, 70, 48, 30, 236, 109, 23, 33, 192, 8, 64, 222, + 243, 8, 101, 197, 107, 43, 16, 79, 56, 124, 244, 115, 39, 46, 133, 51, + 36, 246, 184, 212, 120, 63, 241, 28, 174, 186, 25, 160, 131, 7, 183, 243, + 46, 57, 18, 254, 68, 182, 59, 162, 119, 240, 28, 223, 118, 231, 46, 129, + 6, 58, 190, 115, 111, 221, 154, 219, 97, 112, 49, 250, 226, 6, 238, 111, + 41, 131, 96, 232, 209, 153, 10, 198, 69, 142, 41, 38, 114, 189, 141, 135, + 184, 99, 207, 90, 176, 132, 75, 0, 105, 250, 85, 147, 242, 47, 92, 172, + 232, 97, 68, 44, 40, 64, 77, 91, 196, 197, 83, 193, 93, 38, 56, 252, + 79, 92, 189, 170, 9, 172, 247, 73, 86, 239, 23, 91, 166, 18, 121, 126, + 59, 203, 84, 227, 198, 151, 89, 165, 176, 48, 139, 23, 222, 123, 88, 183, + 239, 97, 153, 81, 93, 5, 107, 206, 42, 96, 240, 121, 198, 248, 20, 155, + 117, 92, 196, 102, 9, 129, 70, 147, 120, 173, 155, 105, 135, 142, 215, 192, + 115, 33, 251, 5, 140, 214, 116, 114, 221, 77, 71, 226, 131, 216, 152, 145, + 133, 162, 4, 197, 220, 3, 119, 47, 216, 120, 239, 185, 199, 125, 245, 59, + 239, 60, 233, 241, 198, 83, 39, 253, 182, 51, 194, 147, 148, 168, 117, 192, + 218, 88, 117, 212, 31, 192, 147, 25, 3, 222, 28, 81, 9, 125, 219, 103, + 89, 113, 42, 54, 232, 159, 224, 56, 119, 170, 75, 40, 195, 233, 77, 39, + 203, 116, 178, 26, 8, 22, 70, 31, 101, 156, 135, 176, 125, 199, 247, 179, + 125, 199, 22, 219, 231, 72, 182, 111, 39, 100, 46, 138, 27, 205, 66, 131, + 58, 200, 132, 247, 110, 88, 113, 239, 134, 73, 86, 84, 34, 100, 36, 200, + 217, 66, 22, 91, 212, 162, 217, 93, 83, 122, 242, 191, 150, 163, 20, 76, + 165, 146, 1, 48, 50, 114, 225, 50, 47, 123, 174, 157, 97, 127, 150, 248, + 173, 44, 2, 76, 105, 83, 51, 38, 60, 212, 122, 167, 194, 194, 238, 32, + 207, 249, 101, 246, 46, 97, 169, 248, 191, 141, 175, 252, 247, 216, 153, 50, + 88, 145, 217, 155, 98, 181, 55, 197, 153, 189, 169, 105, 236, 77, 77, 185, + 55, 53, 141, 189, 169, 149, 221, 155, 218, 214, 174, 36, 144, 226, 225, 236, + 98, 108, 111, 68, 77, 123, 35, 106, 237, 217, 136, 218, 191, 138, 93, 20, + 192, 57, 204, 48, 2, 148, 234, 45, 220, 183, 218, 94, 102, 169, 237, 227, + 22, 191, 232, 50, 211, 220, 224, 127, 56, 193, 223, 238, 122, 219, 195, 11, + 126, 241, 245, 166, 177, 227, 193, 28, 224, 175, 90, 120, 154, 3, 204, 173, + 165, 12, 15, 104, 46, 163, 76, 110, 131, 1, 108, 91, 172, 95, 251, 0, + 235, 23, 155, 172, 159, 251, 46, 9, 157, 116, 252, 109, 146, 78, 174, 217, + 42, 237, 201, 121, 65, 172, 125, 123, 155, 92, 248, 240, 112, 121, 122, 65, + 198, 136, 227, 224, 246, 34, 188, 172, 208, 237, 66, 250, 45, 188, 68, 151, + 149, 203, 157, 243, 14, 248, 44, 101, 201, 98, 219, 63, 0, 168, 44, 38, + 175, 13, 76, 94, 237, 8, 152, 167, 119, 100, 141, 0, 117, 63, 136, 231, + 107, 223, 207, 243, 181, 109, 158, 79, 176, 30, 15, 228, 251, 106, 19, 237, + 146, 254, 63, 12, 224, 19, 138, 20, 141, 235, 195, 214, 62, 86, 176, 89, + 192, 10, 54, 43, 206, 17, 33, 73, 17, 142, 48, 91, 216, 46, 100, 11, + 73, 165, 232, 16, 79, 56, 185, 146, 38, 18, 124, 203, 16, 126, 161, 253, + 235, 79, 176, 189, 204, 241, 34, 165, 235, 46, 7, 227, 217, 116, 158, 213, + 158, 250, 183, 102, 31, 127, 3, 187, 89, 102, 34, 69, 16, 223, 47, 176, + 199, 89, 40, 149, 219, 224, 34, 189, 195, 101, 54, 184, 140, 24, 196, 249, + 124, 49, 136, 37, 0, 249, 6, 213, 214, 14, 242, 153, 184, 87, 176, 69, + 10, 65, 38, 248, 151, 203, 41, 175, 69, 232, 198, 123, 184, 78, 91, 66, + 73, 133, 246, 177, 156, 255, 172, 85, 44, 116, 15, 243, 107, 88, 225, 106, + 225, 98, 254, 77, 176, 166, 255, 226, 21, 179, 151, 37, 252, 215, 172, 152, + 135, 113, 138, 95, 112, 233, 40, 214, 49, 179, 26, 10, 248, 70, 37, 54, + 52, 178, 26, 76, 227, 231, 202, 11, 71, 7, 216, 195, 103, 188, 39, 27, + 26, 17, 119, 104, 213, 232, 14, 19, 212, 198, 92, 36, 219, 197, 78, 48, + 83, 196, 250, 104, 174, 232, 61, 240, 65, 129, 63, 68, 23, 66, 146, 191, + 66, 149, 45, 103, 38, 186, 192, 16, 210, 146, 197, 123, 25, 85, 217, 147, + 43, 24, 245, 135, 172, 157, 38, 52, 189, 64, 93, 12, 106, 83, 105, 81, + 196, 181, 152, 110, 140, 207, 14, 48, 122, 220, 31, 207, 173, 159, 103, 89, + 222, 178, 183, 141, 106, 254, 249, 238, 200, 143, 61, 82, 105, 19, 28, 114, + 29, 128, 203, 92, 92, 45, 239, 96, 217, 63, 63, 42, 251, 232, 216, 101, + 247, 36, 34, 76, 133, 46, 66, 120, 201, 124, 44, 49, 185, 59, 91, 132, + 153, 231, 49, 255, 215, 50, 152, 138, 199, 84, 26, 40, 48, 75, 251, 240, + 238, 113, 66, 200, 71, 76, 104, 94, 70, 89, 60, 163, 214, 100, 206, 199, + 114, 151, 195, 13, 53, 150, 180, 178, 136, 97, 205, 144, 90, 216, 186, 102, + 180, 223, 245, 96, 57, 244, 12, 253, 243, 9, 154, 14, 192, 190, 132, 71, + 205, 145, 96, 10, 128, 124, 78, 113, 247, 73, 201, 64, 73, 147, 188, 3, + 155, 68, 150, 178, 243, 59, 137, 47, 112, 43, 152, 45, 48, 132, 26, 111, + 2, 212, 131, 4, 7, 141, 52, 223, 26, 72, 238, 78, 40, 110, 43, 218, + 30, 154, 247, 59, 186, 122, 17, 234, 12, 171, 219, 113, 109, 64, 201, 60, + 30, 7, 211, 72, 47, 199, 96, 240, 87, 212, 254, 21, 249, 119, 78, 185, + 196, 169, 37, 82, 34, 185, 59, 71, 167, 178, 52, 105, 81, 252, 210, 93, + 136, 140, 219, 229, 14, 45, 223, 105, 162, 100, 154, 168, 12, 176, 137, 66, + 198, 42, 85, 113, 134, 171, 197, 106, 121, 190, 40, 228, 149, 24, 196, 122, + 115, 17, 228, 159, 225, 128, 183, 83, 134, 190, 205, 140, 117, 161, 253, 150, + 75, 144, 163, 93, 65, 146, 48, 57, 6, 23, 136, 35, 141, 62, 81, 92, + 18, 69, 197, 112, 58, 34, 17, 213, 207, 249, 204, 75, 29, 214, 170, 91, + 117, 161, 120, 173, 168, 153, 172, 210, 67, 45, 46, 122, 244, 46, 145, 252, + 93, 248, 241, 101, 46, 220, 1, 159, 249, 185, 78, 119, 234, 242, 13, 86, + 147, 212, 221, 16, 89, 229, 85, 16, 181, 53, 129, 182, 254, 136, 183, 59, + 238, 180, 215, 91, 205, 145, 67, 81, 87, 112, 188, 161, 122, 84, 143, 199, + 27, 159, 214, 17, 155, 186, 62, 85, 76, 52, 84, 160, 32, 155, 233, 127, + 57, 49, 62, 191, 206, 167, 119, 236, 66, 4, 82, 96, 49, 95, 99, 13, + 221, 25, 112, 77, 107, 212, 118, 19, 65, 212, 51, 26, 223, 150, 73, 7, + 187, 28, 96, 162, 82, 32, 139, 252, 34, 167, 55, 178, 211, 248, 21, 252, + 222, 35, 57, 59, 245, 142, 192, 74, 226, 240, 133, 88, 230, 197, 240, 66, + 221, 243, 204, 220, 61, 145, 240, 207, 81, 194, 63, 201, 220, 197, 104, 228, + 47, 106, 32, 213, 115, 140, 156, 8, 219, 4, 25, 250, 99, 223, 216, 198, + 127, 54, 135, 73, 89, 12, 60, 39, 103, 231, 193, 179, 167, 120, 191, 39, + 144, 207, 7, 204, 98, 185, 8, 43, 96, 253, 100, 20, 20, 242, 16, 240, + 204, 63, 70, 255, 0, 221, 209, 205, 116, 14, 245, 142, 27, 143, 63, 55, + 33, 143, 228, 228, 207, 73, 238, 100, 220, 32, 37, 244, 107, 180, 37, 39, + 110, 82, 204, 129, 84, 241, 219, 119, 182, 58, 198, 163, 88, 221, 49, 84, + 182, 68, 193, 47, 34, 212, 127, 210, 69, 71, 54, 82, 166, 90, 72, 55, + 127, 223, 255, 63, 100, 209, 145, 155, 135, 67, 171, 46, 210, 171, 238, 137, + 69, 238, 249, 85, 199, 190, 53, 50, 203, 46, 122, 252, 178, 83, 68, 243, + 169, 68, 244, 143, 92, 123, 176, 220, 104, 57, 113, 220, 210, 251, 151, 80, + 193, 129, 204, 92, 61, 153, 236, 39, 196, 32, 30, 243, 54, 92, 119, 191, + 27, 44, 231, 41, 240, 96, 104, 91, 118, 132, 30, 247, 24, 49, 108, 36, + 102, 81, 138, 148, 235, 203, 227, 217, 175, 147, 231, 63, 169, 68, 255, 11, + 169, 75, 68, 197, 210, 242, 200, 52, 54, 17, 60, 253, 103, 10, 141, 137, + 180, 114, 66, 29, 245, 218, 175, 187, 189, 165, 49, 232, 254, 109, 130, 67, + 172, 227, 160, 225, 229, 44, 9, 223, 132, 39, 113, 187, 125, 212, 39, 158, + 211, 25, 70, 9, 58, 166, 216, 185, 125, 90, 142, 34, 234, 118, 198, 73, + 71, 123, 247, 198, 111, 87, 135, 39, 126, 27, 14, 127, 40, 83, 1, 54, + 37, 81, 209, 186, 125, 42, 138, 70, 2, 149, 157, 201, 221, 97, 46, 7, + 62, 133, 201, 150, 179, 84, 81, 67, 31, 30, 160, 73, 142, 212, 51, 12, + 124, 252, 94, 227, 207, 117, 44, 47, 144, 234, 237, 114, 32, 220, 244, 191, + 127, 46, 84, 240, 143, 100, 157, 222, 137, 251, 231, 105, 183, 207, 139, 193, + 163, 26, 234, 248, 55, 58, 242, 135, 145, 183, 7, 211, 8, 99, 241, 14, + 9, 205, 45, 69, 143, 227, 246, 49, 249, 46, 194, 245, 129, 254, 129, 13, + 20, 196, 164, 116, 124, 179, 23, 21, 225, 219, 163, 16, 241, 218, 80, 50, + 246, 207, 127, 61, 154, 65, 251, 129, 66, 181, 11, 120, 187, 44, 66, 55, + 254, 80, 140, 114, 184, 83, 113, 57, 4, 32, 77, 4, 28, 49, 57, 201, + 59, 169, 213, 210, 242, 243, 122, 76, 158, 28, 121, 158, 211, 42, 116, 14, + 112, 203, 171, 4, 189, 10, 249, 193, 198, 172, 26, 109, 93, 186, 19, 123, + 28, 238, 246, 86, 227, 213, 8, 195, 130, 34, 244, 47, 221, 143, 206, 187, + 56, 217, 18, 233, 126, 135, 97, 223, 29, 78, 15, 196, 79, 36, 30, 104, + 2, 222, 189, 136, 29, 160, 103, 222, 9, 139, 78, 200, 178, 141, 12, 217, + 62, 178, 115, 217, 20, 93, 192, 98, 118, 79, 120, 163, 236, 85, 206, 60, + 255, 93, 76, 61, 250, 120, 134, 83, 239, 214, 106, 31, 43, 167, 238, 71, + 143, 77, 113, 168, 54, 246, 170, 249, 46, 158, 65, 45, 148, 253, 212, 125, + 23, 99, 245, 152, 84, 115, 163, 202, 169, 163, 27, 116, 184, 193, 89, 113, + 139, 51, 108, 18, 139, 97, 131, 51, 213, 226, 172, 34, 203, 97, 37, 144, + 43, 87, 112, 194, 5, 39, 84, 112, 162, 10, 78, 160, 96, 216, 104, 87, + 177, 96, 205, 197, 122, 60, 65, 59, 26, 14, 222, 47, 226, 228, 168, 43, + 70, 26, 17, 110, 1, 15, 71, 233, 199, 83, 215, 167, 70, 234, 207, 163, + 157, 128, 200, 13, 19, 137, 63, 155, 146, 90, 67, 207, 236, 232, 202, 27, + 24, 236, 106, 158, 255, 204, 211, 86, 86, 29, 123, 119, 228, 29, 19, 26, + 206, 210, 229, 95, 46, 96, 11, 102, 151, 212, 212, 89, 37, 91, 228, 116, + 57, 54, 5, 62, 77, 1, 9, 132, 231, 242, 126, 145, 93, 66, 49, 149, + 252, 3, 60, 63, 203, 117, 65, 108, 208, 218, 245, 155, 176, 74, 204, 250, + 113, 35, 132, 119, 22, 75, 180, 3, 86, 190, 164, 129, 50, 199, 85, 255, + 217, 206, 43, 3, 186, 209, 55, 138, 148, 14, 24, 126, 234, 204, 86, 139, + 97, 121, 48, 90, 134, 1, 252, 137, 42, 100, 23, 138, 57, 46, 84, 190, + 90, 13, 221, 230, 99, 150, 83, 119, 223, 39, 92, 67, 179, 233, 172, 76, + 229, 59, 28, 224, 144, 178, 214, 235, 42, 243, 229, 169, 219, 225, 80, 136, + 5, 95, 46, 224, 83, 0, 5, 47, 43, 162, 75, 97, 64, 83, 82, 167, + 229, 201, 19, 94, 86, 5, 206, 195, 192, 153, 119, 39, 55, 56, 6, 106, + 246, 212, 25, 77, 209, 107, 46, 166, 225, 166, 232, 12, 83, 245, 26, 193, + 235, 44, 189, 157, 46, 57, 120, 0, 146, 162, 50, 228, 174, 193, 246, 80, + 1, 138, 164, 171, 31, 77, 207, 146, 97, 26, 200, 87, 200, 59, 154, 86, + 206, 168, 40, 46, 86, 120, 81, 89, 41, 241, 12, 114, 64, 29, 129, 91, + 175, 195, 15, 187, 210, 22, 117, 184, 157, 229, 120, 198, 237, 97, 49, 254, + 173, 213, 42, 156, 132, 185, 249, 183, 94, 199, 36, 204, 204, 238, 180, 177, + 10, 57, 136, 51, 168, 135, 64, 33, 19, 2, 40, 167, 155, 145, 131, 227, + 60, 163, 105, 32, 19, 200, 51, 183, 240, 20, 248, 34, 118, 63, 92, 108, + 149, 3, 137, 29, 199, 220, 51, 211, 112, 131, 14, 182, 248, 180, 187, 20, + 136, 196, 107, 80, 28, 175, 166, 243, 217, 16, 216, 243, 236, 77, 21, 30, + 134, 180, 23, 80, 58, 90, 49, 3, 13, 200, 109, 58, 230, 19, 55, 79, + 84, 141, 117, 225, 36, 125, 18, 60, 194, 253, 134, 106, 46, 9, 27, 242, + 6, 71, 53, 154, 180, 246, 69, 177, 230, 40, 213, 110, 28, 146, 201, 163, + 116, 142, 195, 3, 123, 237, 200, 1, 74, 3, 181, 72, 25, 167, 197, 216, + 140, 105, 171, 214, 178, 109, 213, 238, 29, 154, 109, 68, 14, 212, 218, 190, + 147, 49, 157, 168, 146, 179, 61, 87, 13, 6, 61, 237, 33, 203, 67, 247, + 8, 145, 113, 155, 161, 221, 156, 54, 93, 211, 123, 220, 100, 12, 252, 216, + 121, 48, 217, 161, 63, 134, 51, 152, 207, 51, 114, 12, 164, 237, 33, 191, + 165, 97, 178, 196, 0, 141, 55, 209, 190, 84, 188, 9, 99, 200, 6, 111, + 0, 53, 24, 5, 123, 25, 37, 47, 9, 19, 105, 59, 202, 138, 37, 53, + 62, 83, 246, 6, 99, 96, 34, 69, 160, 184, 128, 156, 58, 185, 246, 39, + 225, 59, 151, 63, 161, 39, 182, 86, 80, 111, 94, 42, 78, 50, 18, 87, + 29, 231, 191, 251, 29, 94, 119, 36, 124, 17, 17, 225, 69, 132, 59, 29, + 195, 123, 84, 247, 151, 59, 140, 194, 133, 62, 29, 150, 110, 237, 174, 59, + 159, 161, 92, 188, 193, 158, 241, 80, 184, 217, 64, 39, 162, 62, 228, 198, + 108, 208, 21, 46, 35, 178, 70, 5, 89, 151, 218, 183, 155, 33, 108, 39, + 39, 120, 227, 219, 139, 152, 92, 194, 34, 40, 129, 209, 29, 231, 60, 66, + 208, 52, 63, 86, 37, 227, 192, 10, 249, 39, 234, 107, 40, 12, 253, 31, + 160, 177, 241, 91, 80, 64, 44, 190, 128, 206, 144, 167, 192, 166, 77, 95, + 230, 134, 218, 70, 202, 123, 175, 168, 233, 114, 218, 164, 105, 45, 166, 105, + 230, 37, 117, 91, 9, 94, 218, 25, 193, 203, 177, 33, 120, 57, 150, 130, + 151, 99, 227, 250, 250, 101, 246, 250, 250, 149, 121, 125, 45, 40, 208, 163, + 52, 62, 76, 18, 217, 12, 76, 250, 216, 202, 220, 105, 183, 3, 199, 148, + 181, 28, 219, 178, 150, 151, 123, 44, 131, 95, 125, 166, 58, 72, 135, 1, + 127, 191, 46, 200, 75, 188, 2, 127, 229, 89, 52, 228, 17, 202, 32, 255, + 14, 244, 227, 55, 161, 36, 242, 31, 242, 241, 249, 228, 227, 193, 26, 46, + 191, 1, 242, 241, 96, 245, 23, 165, 163, 248, 79, 37, 36, 74, 57, 38, + 75, 31, 10, 132, 177, 146, 52, 88, 121, 13, 245, 152, 87, 150, 122, 204, + 171, 3, 234, 49, 237, 223, 154, 122, 204, 203, 39, 85, 143, 233, 173, 150, + 176, 118, 160, 115, 66, 214, 251, 60, 12, 224, 79, 36, 165, 189, 248, 250, + 45, 188, 94, 238, 76, 157, 151, 251, 84, 102, 148, 200, 227, 243, 185, 94, + 188, 86, 222, 195, 245, 210, 167, 60, 215, 155, 83, 240, 185, 191, 151, 101, + 96, 214, 73, 163, 71, 247, 181, 64, 179, 71, 50, 208, 241, 63, 139, 129, + 38, 153, 148, 152, 24, 67, 209, 228, 213, 3, 53, 135, 94, 29, 210, 28, + 122, 245, 31, 205, 161, 207, 215, 28, 10, 100, 224, 187, 61, 11, 179, 72, + 116, 118, 92, 32, 58, 59, 174, 60, 114, 90, 137, 11, 122, 117, 72, 127, + 232, 213, 1, 253, 161, 249, 224, 38, 93, 144, 15, 189, 233, 100, 158, 222, + 164, 232, 115, 250, 162, 143, 14, 21, 39, 36, 47, 187, 60, 192, 11, 133, + 196, 58, 145, 87, 41, 83, 242, 240, 157, 168, 82, 75, 24, 22, 211, 213, + 188, 55, 144, 193, 1, 56, 144, 137, 98, 102, 140, 198, 56, 135, 188, 143, + 67, 15, 252, 220, 37, 92, 23, 15, 149, 79, 196, 246, 14, 126, 44, 246, + 99, 217, 209, 36, 44, 119, 87, 203, 105, 229, 113, 50, 139, 90, 14, 76, + 66, 161, 207, 41, 130, 31, 239, 231, 116, 235, 163, 28, 72, 2, 29, 143, + 88, 186, 203, 242, 141, 216, 148, 111, 180, 119, 231, 106, 99, 207, 248, 229, + 209, 192, 52, 96, 232, 191, 97, 32, 230, 64, 71, 30, 37, 139, 160, 151, + 143, 30, 19, 7, 142, 41, 245, 144, 154, 69, 4, 164, 50, 176, 81, 158, + 14, 60, 34, 73, 116, 131, 93, 196, 35, 97, 54, 68, 32, 6, 9, 247, + 207, 47, 85, 22, 155, 64, 163, 163, 124, 150, 73, 48, 129, 110, 52, 28, + 34, 118, 88, 194, 160, 118, 142, 138, 67, 146, 193, 206, 135, 161, 230, 21, + 222, 173, 116, 231, 27, 216, 208, 38, 253, 20, 243, 144, 251, 198, 164, 159, + 206, 211, 222, 112, 52, 88, 162, 178, 64, 50, 25, 172, 198, 221, 201, 4, + 158, 227, 100, 54, 152, 167, 211, 126, 218, 131, 151, 102, 194, 113, 67, 12, + 101, 130, 167, 194, 100, 99, 30, 202, 20, 210, 250, 16, 151, 106, 243, 163, + 242, 58, 191, 104, 104, 251, 220, 55, 214, 168, 13, 244, 35, 28, 135, 6, + 234, 22, 227, 237, 99, 144, 54, 122, 177, 203, 233, 4, 100, 157, 53, 248, + 205, 179, 164, 249, 4, 248, 123, 16, 119, 1, 59, 199, 174, 215, 201, 13, + 226, 10, 57, 80, 137, 142, 20, 102, 10, 13, 179, 34, 3, 151, 127, 8, + 254, 59, 248, 67, 240, 125, 66, 215, 35, 65, 63, 88, 0, 247, 114, 157, + 80, 212, 3, 72, 168, 28, 69, 97, 220, 98, 103, 118, 215, 103, 192, 211, + 101, 154, 104, 88, 136, 143, 251, 162, 127, 30, 220, 61, 75, 252, 31, 62, + 125, 26, 194, 207, 127, 127, 250, 212, 135, 159, 63, 0, 71, 36, 157, 30, + 180, 0, 8, 111, 25, 93, 232, 76, 148, 78, 208, 141, 42, 140, 249, 10, + 182, 3, 20, 169, 47, 80, 129, 24, 170, 209, 29, 2, 158, 3, 231, 28, + 146, 47, 252, 31, 2, 255, 191, 3, 255, 15, 129, 255, 61, 166, 147, 38, + 144, 83, 203, 244, 138, 86, 209, 108, 136, 110, 134, 123, 211, 249, 124, 48, + 34, 136, 98, 96, 30, 17, 64, 29, 191, 111, 127, 70, 30, 146, 100, 130, + 226, 218, 131, 212, 20, 241, 234, 162, 6, 28, 31, 243, 120, 119, 1, 142, + 191, 34, 174, 147, 245, 115, 159, 159, 47, 11, 252, 201, 206, 231, 113, 159, + 34, 132, 196, 45, 202, 4, 159, 226, 44, 216, 164, 240, 79, 3, 47, 254, + 215, 1, 15, 59, 76, 16, 177, 186, 236, 230, 102, 186, 16, 160, 13, 103, + 129, 46, 55, 171, 189, 57, 94, 126, 112, 104, 144, 154, 6, 178, 191, 32, + 24, 59, 191, 2, 160, 15, 236, 8, 246, 227, 194, 95, 92, 214, 204, 158, + 228, 59, 34, 217, 19, 29, 82, 100, 53, 206, 182, 32, 104, 8, 121, 197, + 38, 202, 130, 116, 86, 191, 137, 96, 92, 232, 35, 183, 219, 239, 15, 250, + 134, 123, 61, 232, 251, 121, 2, 159, 241, 196, 199, 238, 247, 72, 81, 88, + 136, 60, 166, 147, 209, 6, 200, 111, 61, 2, 250, 187, 232, 194, 140, 245, + 129, 202, 34, 149, 216, 21, 10, 61, 116, 243, 191, 230, 170, 98, 104, 7, + 7, 202, 119, 168, 190, 207, 139, 180, 8, 27, 229, 246, 116, 236, 37, 23, + 246, 175, 197, 184, 75, 97, 191, 112, 143, 58, 54, 122, 169, 226, 126, 5, + 109, 199, 2, 221, 61, 132, 52, 54, 246, 125, 237, 144, 175, 73, 158, 211, + 85, 20, 34, 50, 88, 17, 167, 76, 169, 68, 210, 130, 73, 70, 197, 41, + 26, 152, 24, 39, 20, 100, 29, 170, 192, 72, 225, 12, 52, 240, 58, 223, + 152, 226, 192, 37, 139, 153, 189, 69, 57, 4, 119, 139, 88, 227, 85, 9, + 206, 191, 58, 218, 155, 37, 17, 69, 208, 71, 54, 5, 56, 106, 157, 99, + 124, 35, 29, 51, 139, 57, 220, 103, 254, 103, 7, 207, 210, 228, 27, 35, + 230, 52, 114, 145, 208, 130, 166, 12, 72, 70, 94, 53, 77, 58, 67, 225, + 125, 248, 86, 134, 126, 226, 221, 165, 51, 25, 135, 112, 76, 11, 38, 76, + 231, 245, 125, 14, 159, 17, 91, 103, 161, 96, 201, 207, 19, 193, 198, 59, + 128, 95, 80, 4, 253, 93, 66, 111, 42, 112, 44, 172, 251, 205, 23, 59, + 76, 142, 172, 228, 26, 37, 115, 136, 246, 82, 57, 173, 251, 88, 176, 2, + 231, 67, 204, 41, 222, 74, 28, 134, 39, 66, 171, 144, 216, 182, 10, 225, + 240, 105, 176, 184, 81, 187, 192, 135, 110, 190, 199, 35, 41, 235, 99, 203, + 195, 6, 115, 247, 247, 119, 185, 118, 158, 96, 47, 204, 222, 237, 62, 183, + 73, 152, 47, 188, 167, 1, 178, 242, 204, 140, 252, 55, 214, 97, 23, 53, + 46, 52, 113, 31, 238, 24, 14, 181, 99, 58, 37, 172, 151, 40, 234, 21, + 71, 134, 141, 122, 233, 174, 97, 153, 172, 197, 239, 70, 252, 126, 36, 117, + 207, 238, 100, 153, 194, 62, 222, 93, 20, 105, 121, 50, 238, 54, 255, 240, + 48, 178, 1, 60, 211, 98, 0, 135, 102, 244, 236, 153, 37, 33, 37, 238, + 2, 158, 26, 184, 19, 130, 114, 112, 79, 96, 178, 80, 95, 1, 221, 110, + 47, 81, 228, 56, 238, 46, 135, 3, 212, 165, 196, 16, 11, 131, 245, 12, + 157, 161, 34, 47, 22, 0, 47, 51, 147, 74, 13, 19, 183, 180, 22, 181, + 108, 74, 135, 229, 145, 150, 36, 82, 129, 41, 81, 48, 74, 154, 170, 99, + 107, 214, 246, 228, 78, 26, 207, 31, 21, 177, 179, 128, 182, 151, 204, 93, + 141, 86, 115, 183, 109, 207, 216, 107, 219, 59, 126, 102, 54, 51, 242, 201, + 72, 203, 39, 35, 152, 94, 147, 29, 140, 147, 230, 62, 219, 60, 64, 63, + 109, 192, 225, 40, 58, 23, 41, 15, 225, 172, 148, 29, 176, 56, 50, 75, + 165, 238, 153, 233, 220, 133, 175, 164, 81, 126, 188, 134, 5, 78, 160, 36, + 24, 209, 241, 14, 171, 64, 208, 161, 53, 96, 224, 183, 3, 56, 115, 203, + 75, 223, 76, 136, 191, 197, 40, 69, 15, 244, 161, 138, 175, 105, 7, 103, + 108, 58, 211, 235, 107, 160, 224, 118, 56, 49, 188, 214, 245, 225, 195, 46, + 144, 79, 153, 43, 97, 181, 235, 25, 67, 210, 1, 40, 14, 223, 18, 243, + 25, 138, 34, 84, 250, 173, 146, 245, 218, 182, 95, 143, 75, 142, 138, 183, + 249, 209, 129, 131, 206, 120, 181, 132, 35, 220, 199, 245, 166, 135, 4, 180, + 9, 189, 195, 200, 108, 28, 159, 24, 184, 89, 49, 136, 33, 194, 8, 232, + 200, 246, 191, 194, 122, 188, 99, 6, 18, 233, 21, 201, 125, 66, 87, 113, + 142, 53, 142, 136, 70, 160, 149, 178, 41, 190, 116, 6, 82, 65, 123, 35, + 16, 139, 119, 137, 104, 132, 4, 165, 155, 68, 147, 230, 166, 179, 54, 222, + 98, 103, 116, 7, 89, 211, 224, 110, 231, 142, 134, 244, 52, 4, 234, 140, + 0, 0, 172, 156, 12, 154, 192, 177, 165, 151, 174, 157, 240, 238, 210, 157, + 139, 95, 127, 139, 157, 78, 97, 44, 175, 66, 183, 71, 185, 3, 76, 175, + 169, 71, 103, 237, 167, 137, 191, 118, 55, 248, 179, 113, 215, 181, 196, 31, + 221, 145, 172, 139, 121, 164, 13, 38, 12, 5, 191, 36, 239, 202, 129, 77, + 149, 207, 239, 184, 173, 115, 217, 214, 57, 204, 46, 52, 118, 84, 6, 178, + 142, 162, 191, 90, 77, 125, 94, 227, 71, 127, 187, 193, 31, 1, 48, 252, + 88, 247, 223, 113, 236, 211, 102, 159, 99, 194, 189, 116, 82, 52, 34, 194, + 248, 121, 113, 149, 181, 181, 112, 43, 195, 185, 168, 66, 30, 55, 118, 127, + 129, 31, 58, 57, 11, 57, 4, 209, 235, 152, 230, 1, 167, 128, 145, 178, + 219, 104, 200, 192, 13, 188, 165, 54, 56, 42, 52, 203, 234, 224, 255, 112, + 24, 151, 228, 30, 198, 119, 55, 65, 190, 185, 67, 68, 98, 128, 156, 123, + 91, 56, 207, 86, 157, 65, 129, 23, 252, 12, 101, 111, 190, 64, 55, 96, + 105, 41, 193, 25, 70, 143, 175, 71, 180, 45, 95, 68, 20, 44, 118, 27, + 226, 222, 140, 235, 6, 48, 33, 194, 136, 166, 89, 157, 0, 186, 125, 136, + 229, 245, 43, 221, 72, 24, 247, 121, 121, 139, 183, 207, 191, 176, 83, 52, + 244, 123, 68, 247, 3, 119, 112, 108, 200, 101, 221, 233, 211, 214, 9, 28, + 229, 160, 219, 19, 23, 40, 154, 36, 127, 67, 87, 31, 72, 146, 244, 165, + 199, 2, 119, 152, 187, 193, 104, 132, 191, 116, 237, 33, 233, 155, 248, 44, + 247, 34, 217, 137, 71, 152, 225, 113, 243, 179, 201, 205, 3, 110, 180, 120, + 55, 177, 46, 181, 26, 142, 13, 242, 167, 242, 217, 168, 111, 175, 34, 125, + 123, 21, 169, 253, 33, 78, 60, 213, 113, 35, 254, 10, 207, 69, 225, 69, + 148, 53, 13, 12, 53, 195, 138, 238, 30, 107, 108, 138, 223, 97, 92, 58, + 181, 77, 245, 231, 38, 36, 78, 103, 215, 163, 46, 156, 46, 0, 123, 201, + 208, 46, 117, 201, 40, 64, 171, 100, 2, 205, 67, 119, 234, 74, 75, 5, + 45, 15, 227, 247, 232, 209, 145, 178, 224, 49, 237, 144, 11, 29, 195, 131, + 34, 219, 22, 202, 22, 73, 23, 88, 220, 232, 24, 137, 180, 46, 88, 178, + 252, 204, 151, 233, 82, 186, 44, 37, 202, 45, 193, 27, 50, 212, 117, 156, + 149, 119, 131, 21, 94, 50, 191, 3, 28, 155, 206, 63, 44, 156, 201, 164, + 195, 87, 148, 157, 110, 15, 88, 37, 218, 39, 81, 172, 137, 193, 128, 87, + 174, 151, 73, 44, 175, 73, 229, 112, 93, 57, 245, 188, 126, 182, 132, 248, + 24, 161, 86, 109, 97, 181, 163, 65, 247, 195, 6, 206, 179, 171, 92, 221, + 234, 139, 108, 224, 44, 124, 19, 54, 194, 168, 186, 62, 201, 183, 181, 47, + 243, 201, 254, 150, 11, 27, 205, 86, 81, 208, 84, 46, 203, 254, 38, 22, + 233, 205, 120, 138, 242, 168, 76, 43, 34, 93, 212, 194, 97, 178, 81, 7, + 121, 217, 157, 12, 241, 181, 186, 174, 228, 154, 181, 203, 224, 91, 23, 158, + 171, 229, 200, 173, 187, 242, 173, 98, 247, 100, 52, 93, 44, 58, 227, 133, + 152, 54, 249, 86, 94, 7, 203, 249, 106, 57, 164, 122, 240, 24, 85, 94, + 67, 21, 156, 244, 115, 204, 237, 22, 230, 141, 171, 70, 206, 130, 150, 122, + 102, 67, 61, 187, 236, 98, 53, 46, 211, 91, 117, 52, 189, 193, 49, 212, + 92, 234, 57, 231, 160, 68, 124, 229, 33, 200, 14, 100, 234, 160, 167, 163, + 53, 21, 173, 115, 50, 238, 186, 107, 217, 151, 81, 10, 180, 11, 142, 145, + 43, 162, 76, 142, 120, 74, 28, 34, 123, 176, 20, 33, 11, 233, 139, 49, + 185, 160, 56, 78, 72, 148, 89, 209, 4, 191, 84, 100, 153, 70, 226, 247, + 40, 197, 237, 193, 137, 218, 147, 53, 116, 160, 6, 127, 139, 47, 187, 206, + 100, 176, 94, 238, 120, 239, 90, 185, 190, 40, 231, 216, 77, 152, 238, 89, + 173, 47, 59, 81, 37, 210, 12, 67, 127, 219, 106, 96, 185, 153, 13, 118, + 21, 91, 2, 166, 124, 166, 90, 181, 149, 78, 220, 191, 79, 62, 76, 96, + 67, 119, 185, 31, 46, 95, 137, 123, 52, 4, 175, 196, 226, 174, 236, 80, + 117, 249, 132, 82, 138, 6, 9, 167, 154, 219, 116, 186, 90, 136, 129, 98, + 151, 100, 17, 35, 159, 24, 19, 247, 24, 135, 83, 242, 117, 206, 210, 179, + 164, 196, 15, 15, 28, 202, 219, 9, 108, 93, 169, 220, 86, 177, 34, 28, + 137, 174, 208, 67, 229, 145, 225, 116, 53, 234, 227, 14, 40, 234, 22, 34, + 61, 152, 9, 93, 151, 154, 12, 161, 43, 80, 52, 27, 252, 233, 87, 79, + 7, 236, 43, 159, 63, 7, 220, 135, 253, 147, 96, 96, 26, 65, 65, 230, + 55, 103, 64, 140, 35, 55, 5, 156, 142, 115, 32, 158, 14, 13, 64, 66, + 94, 192, 203, 2, 61, 167, 101, 96, 47, 234, 204, 0, 159, 83, 197, 238, + 130, 128, 30, 220, 169, 245, 192, 176, 225, 48, 93, 119, 105, 127, 57, 12, + 58, 195, 65, 122, 51, 92, 6, 29, 228, 101, 96, 81, 143, 21, 39, 243, + 85, 191, 175, 13, 52, 5, 80, 51, 247, 44, 164, 67, 15, 187, 60, 218, + 120, 78, 120, 19, 155, 240, 38, 214, 112, 50, 45, 75, 97, 28, 6, 115, + 187, 237, 206, 83, 20, 67, 82, 63, 136, 16, 120, 6, 11, 18, 239, 57, + 183, 70, 250, 216, 106, 243, 53, 242, 67, 235, 220, 184, 174, 187, 120, 7, + 167, 14, 28, 130, 213, 127, 98, 76, 120, 16, 216, 245, 178, 188, 8, 67, + 16, 106, 20, 148, 135, 55, 191, 37, 132, 49, 136, 25, 89, 100, 76, 60, + 94, 14, 214, 7, 130, 41, 156, 176, 173, 68, 134, 48, 240, 45, 86, 170, + 132, 55, 26, 116, 20, 173, 249, 68, 77, 132, 128, 164, 90, 70, 230, 36, + 202, 220, 29, 35, 49, 59, 131, 162, 160, 0, 193, 225, 233, 82, 141, 60, + 96, 190, 188, 194, 175, 177, 193, 30, 170, 73, 176, 187, 192, 122, 74, 163, + 116, 242, 1, 112, 8, 250, 35, 7, 161, 191, 199, 37, 107, 66, 88, 205, + 88, 2, 6, 61, 15, 240, 82, 84, 73, 214, 98, 84, 84, 83, 47, 71, + 65, 81, 172, 66, 6, 49, 105, 102, 9, 162, 130, 132, 65, 87, 104, 120, + 72, 65, 114, 221, 101, 34, 163, 42, 150, 212, 70, 147, 1, 249, 165, 148, + 36, 165, 235, 213, 104, 180, 233, 77, 39, 19, 146, 136, 149, 152, 37, 44, + 200, 39, 136, 118, 20, 108, 237, 218, 241, 60, 206, 49, 150, 30, 212, 123, + 73, 84, 136, 154, 236, 233, 189, 213, 182, 236, 253, 33, 204, 23, 212, 168, + 0, 245, 163, 34, 204, 223, 66, 151, 11, 81, 63, 42, 198, 124, 123, 192, + 78, 150, 24, 39, 78, 225, 100, 211, 39, 223, 88, 0, 2, 20, 54, 192, + 31, 176, 126, 240, 130, 5, 151, 7, 74, 19, 13, 6, 240, 122, 53, 225, + 160, 105, 214, 242, 114, 169, 250, 186, 174, 255, 65, 203, 44, 215, 167, 95, + 179, 220, 76, 226, 217, 204, 138, 246, 60, 164, 144, 138, 59, 223, 21, 16, + 200, 61, 3, 120, 200, 34, 213, 46, 81, 4, 188, 248, 192, 234, 183, 224, + 228, 170, 0, 247, 132, 43, 153, 112, 236, 222, 188, 148, 107, 231, 48, 242, + 221, 155, 155, 179, 237, 28, 137, 148, 247, 22, 144, 25, 63, 151, 176, 100, + 8, 192, 147, 19, 24, 65, 56, 178, 100, 195, 183, 129, 87, 245, 51, 240, + 169, 250, 57, 8, 224, 85, 13, 198, 42, 31, 61, 136, 146, 229, 91, 204, + 180, 160, 170, 187, 143, 120, 229, 32, 244, 217, 68, 108, 14, 213, 146, 178, + 92, 116, 144, 158, 217, 13, 62, 152, 174, 237, 219, 209, 237, 204, 122, 37, + 36, 24, 199, 234, 145, 36, 239, 30, 2, 55, 155, 79, 103, 221, 155, 238, + 114, 208, 185, 234, 46, 123, 195, 12, 117, 187, 32, 92, 88, 116, 62, 146, + 217, 224, 160, 127, 169, 104, 215, 239, 41, 183, 42, 157, 21, 167, 97, 44, + 225, 249, 116, 117, 51, 44, 36, 98, 74, 161, 125, 178, 208, 30, 149, 166, + 215, 46, 221, 140, 47, 102, 83, 190, 125, 17, 217, 197, 222, 15, 164, 97, + 73, 149, 13, 80, 123, 152, 35, 194, 224, 129, 145, 72, 98, 126, 20, 15, + 167, 135, 70, 100, 224, 28, 235, 97, 140, 114, 70, 161, 240, 120, 108, 164, + 182, 98, 158, 191, 242, 103, 211, 192, 15, 161, 50, 235, 124, 160, 51, 9, + 110, 70, 230, 226, 133, 181, 255, 92, 102, 211, 163, 253, 249, 114, 148, 104, + 127, 86, 77, 131, 232, 66, 54, 118, 209, 145, 244, 182, 79, 36, 201, 187, + 123, 6, 136, 102, 116, 138, 88, 140, 33, 38, 154, 93, 160, 212, 5, 166, + 218, 237, 237, 95, 154, 153, 89, 130, 117, 249, 135, 116, 204, 182, 0, 69, + 110, 221, 73, 35, 196, 82, 7, 233, 79, 221, 201, 116, 233, 122, 222, 152, + 230, 69, 34, 8, 195, 188, 175, 235, 42, 91, 221, 15, 172, 110, 7, 153, + 238, 74, 109, 146, 173, 121, 248, 97, 45, 20, 255, 29, 41, 21, 33, 244, + 208, 77, 87, 135, 140, 224, 19, 227, 125, 218, 223, 36, 222, 250, 211, 167, + 205, 167, 79, 189, 55, 225, 73, 217, 123, 239, 120, 127, 233, 120, 198, 25, + 214, 115, 19, 151, 244, 58, 80, 90, 254, 17, 254, 97, 189, 81, 176, 16, + 18, 15, 212, 129, 73, 71, 3, 13, 25, 183, 104, 178, 248, 0, 105, 53, + 219, 72, 188, 254, 188, 123, 87, 126, 14, 164, 9, 91, 44, 58, 75, 170, + 133, 207, 110, 182, 168, 117, 204, 63, 124, 78, 22, 213, 11, 248, 129, 110, + 188, 119, 159, 187, 223, 15, 150, 98, 149, 57, 94, 136, 93, 27, 0, 185, + 108, 104, 187, 127, 207, 183, 97, 224, 65, 30, 223, 234, 79, 6, 72, 129, + 13, 35, 214, 91, 185, 44, 160, 58, 54, 189, 81, 132, 225, 175, 234, 187, + 144, 34, 28, 32, 38, 153, 234, 14, 47, 124, 123, 121, 103, 154, 121, 210, + 69, 125, 24, 32, 197, 115, 111, 200, 62, 138, 103, 27, 38, 218, 68, 83, + 152, 217, 251, 39, 31, 230, 202, 158, 98, 156, 92, 215, 123, 162, 153, 45, + 28, 200, 73, 166, 16, 244, 255, 150, 3, 31, 149, 191, 15, 126, 68, 89, + 160, 231, 149, 221, 213, 100, 62, 184, 46, 179, 225, 182, 52, 246, 254, 81, + 120, 171, 232, 124, 96, 231, 17, 157, 15, 103, 120, 208, 46, 255, 88, 65, + 243, 241, 206, 7, 182, 10, 191, 232, 124, 184, 164, 74, 158, 127, 95, 150, + 239, 21, 89, 9, 45, 45, 197, 47, 102, 37, 54, 180, 95, 23, 72, 134, + 28, 99, 151, 181, 63, 235, 15, 218, 193, 167, 175, 19, 133, 162, 185, 20, + 57, 1, 214, 25, 31, 119, 149, 28, 36, 252, 109, 189, 80, 212, 236, 91, + 237, 88, 181, 240, 157, 65, 17, 164, 59, 196, 181, 184, 15, 17, 61, 21, + 22, 23, 194, 149, 28, 182, 253, 165, 227, 71, 146, 114, 17, 210, 69, 132, + 71, 197, 149, 200, 35, 191, 184, 234, 169, 22, 231, 202, 158, 88, 10, 0, + 30, 89, 176, 182, 57, 125, 149, 69, 139, 52, 211, 73, 63, 161, 174, 229, + 177, 237, 7, 187, 255, 41, 198, 175, 67, 234, 199, 143, 68, 247, 188, 223, + 23, 228, 209, 57, 2, 186, 20, 200, 194, 229, 255, 112, 153, 241, 106, 84, + 198, 38, 2, 69, 236, 21, 223, 8, 229, 220, 154, 139, 117, 67, 19, 2, + 140, 18, 247, 141, 217, 246, 140, 233, 245, 2, 172, 22, 155, 83, 244, 17, + 67, 161, 63, 146, 51, 11, 46, 6, 235, 25, 193, 86, 76, 136, 249, 13, + 38, 26, 57, 173, 142, 32, 154, 50, 135, 214, 199, 9, 88, 96, 159, 59, + 162, 102, 217, 60, 220, 202, 173, 206, 201, 173, 90, 197, 249, 66, 87, 163, + 123, 25, 190, 191, 204, 176, 246, 73, 23, 80, 193, 77, 159, 132, 249, 211, + 10, 222, 164, 233, 33, 194, 107, 244, 93, 28, 14, 237, 13, 197, 160, 252, + 92, 246, 112, 207, 151, 166, 252, 2, 233, 87, 211, 233, 168, 204, 250, 255, + 21, 165, 6, 216, 78, 188, 241, 98, 80, 204, 94, 82, 220, 123, 205, 99, + 10, 40, 178, 26, 137, 228, 55, 25, 190, 98, 130, 21, 80, 252, 230, 147, + 110, 89, 133, 43, 110, 207, 182, 242, 175, 101, 90, 185, 241, 67, 130, 116, + 187, 249, 67, 57, 115, 29, 56, 148, 89, 119, 1, 151, 10, 45, 154, 132, + 2, 187, 40, 54, 154, 76, 83, 121, 113, 125, 97, 118, 186, 0, 179, 127, + 5, 75, 125, 157, 46, 89, 24, 243, 164, 92, 53, 129, 165, 233, 146, 134, + 189, 215, 199, 209, 41, 248, 208, 128, 13, 216, 8, 153, 96, 22, 56, 70, + 178, 13, 29, 201, 205, 252, 26, 240, 228, 86, 212, 3, 79, 28, 98, 225, + 20, 1, 71, 28, 32, 172, 238, 7, 217, 94, 75, 240, 144, 202, 167, 91, + 67, 7, 132, 0, 239, 190, 128, 76, 128, 143, 178, 107, 73, 189, 25, 212, + 217, 51, 209, 254, 44, 168, 180, 69, 206, 149, 236, 163, 138, 197, 107, 16, + 129, 247, 21, 218, 238, 188, 63, 147, 247, 34, 82, 169, 92, 106, 180, 37, + 7, 95, 122, 146, 178, 155, 224, 175, 56, 239, 168, 122, 6, 24, 64, 125, + 190, 154, 148, 75, 180, 126, 74, 193, 159, 143, 84, 131, 217, 140, 157, 229, + 62, 102, 121, 239, 65, 137, 128, 250, 165, 142, 75, 54, 148, 185, 106, 133, + 69, 22, 55, 161, 166, 71, 215, 231, 121, 119, 185, 111, 195, 92, 10, 182, + 149, 73, 163, 59, 245, 63, 230, 152, 13, 104, 80, 220, 180, 123, 122, 98, + 189, 114, 1, 87, 34, 107, 194, 138, 122, 243, 148, 180, 94, 203, 127, 174, + 37, 143, 43, 156, 97, 1, 109, 70, 160, 64, 2, 101, 2, 233, 84, 29, + 44, 47, 124, 141, 199, 151, 135, 207, 152, 91, 171, 150, 157, 7, 8, 97, + 102, 132, 87, 207, 102, 211, 242, 71, 148, 192, 66, 59, 60, 137, 26, 205, + 7, 22, 152, 47, 241, 10, 20, 161, 176, 135, 17, 203, 178, 96, 25, 134, + 235, 114, 31, 19, 149, 57, 102, 6, 200, 190, 76, 140, 109, 159, 62, 9, + 146, 66, 228, 44, 120, 144, 244, 236, 111, 195, 116, 161, 98, 172, 162, 86, + 51, 103, 54, 41, 212, 62, 254, 104, 15, 123, 244, 43, 24, 35, 201, 232, + 52, 247, 48, 58, 214, 88, 105, 144, 204, 225, 60, 177, 40, 237, 51, 88, + 152, 223, 12, 23, 209, 212, 92, 68, 150, 111, 248, 162, 123, 227, 125, 187, + 226, 35, 120, 134, 71, 238, 139, 203, 189, 27, 227, 161, 37, 252, 168, 77, + 46, 191, 187, 69, 123, 69, 111, 95, 74, 252, 146, 21, 177, 229, 246, 11, + 62, 144, 62, 25, 129, 55, 183, 214, 47, 71, 224, 239, 21, 35, 125, 9, + 226, 221, 112, 37, 137, 222, 219, 205, 147, 207, 145, 254, 236, 171, 237, 62, + 1, 75, 70, 193, 106, 111, 53, 82, 208, 82, 32, 34, 177, 51, 30, 18, + 166, 216, 57, 31, 45, 80, 81, 87, 213, 230, 56, 30, 40, 80, 89, 172, + 198, 125, 33, 48, 97, 135, 152, 229, 231, 36, 151, 195, 180, 74, 128, 91, + 59, 101, 249, 161, 32, 203, 15, 42, 75, 126, 85, 137, 42, 1, 243, 253, + 168, 42, 197, 36, 150, 214, 100, 161, 160, 196, 147, 13, 161, 32, 134, 42, + 161, 133, 104, 13, 208, 11, 168, 245, 124, 122, 69, 173, 53, 59, 93, 84, + 71, 150, 28, 179, 233, 130, 59, 110, 202, 140, 2, 110, 41, 146, 131, 197, + 183, 90, 66, 63, 167, 174, 28, 61, 36, 252, 64, 194, 31, 139, 139, 133, + 177, 142, 7, 243, 155, 65, 89, 150, 11, 106, 149, 83, 87, 39, 253, 32, + 146, 160, 98, 0, 156, 206, 118, 148, 40, 202, 21, 148, 196, 124, 245, 127, + 95, 178, 51, 254, 176, 47, 227, 15, 37, 83, 160, 37, 24, 77, 207, 18, + 52, 173, 102, 253, 60, 99, 51, 152, 45, 210, 145, 193, 191, 252, 157, 51, + 217, 124, 136, 123, 71, 132, 124, 17, 184, 221, 107, 180, 10, 183, 216, 25, + 180, 131, 17, 98, 26, 218, 131, 136, 213, 80, 109, 61, 128, 199, 96, 43, + 245, 48, 140, 118, 57, 157, 44, 213, 155, 76, 55, 104, 35, 18, 93, 215, + 108, 197, 30, 189, 209, 189, 132, 224, 102, 222, 237, 143, 187, 104, 209, 146, + 165, 29, 234, 14, 187, 232, 234, 218, 174, 170, 255, 251, 157, 155, 73, 249, + 97, 231, 118, 165, 113, 205, 90, 181, 66, 214, 234, 209, 160, 254, 42, 240, + 69, 82, 208, 189, 90, 148, 211, 113, 133, 127, 191, 173, 160, 235, 112, 142, + 158, 185, 87, 188, 187, 119, 44, 236, 18, 151, 33, 130, 230, 59, 71, 178, + 145, 221, 103, 129, 38, 167, 252, 40, 167, 212, 36, 146, 129, 47, 177, 231, + 51, 251, 171, 107, 45, 160, 153, 226, 75, 17, 145, 20, 159, 114, 84, 81, + 111, 6, 185, 25, 201, 207, 154, 99, 204, 17, 122, 235, 137, 157, 250, 5, + 15, 11, 109, 174, 213, 170, 41, 212, 164, 203, 249, 129, 251, 11, 231, 210, + 34, 24, 137, 178, 228, 240, 140, 131, 47, 153, 149, 61, 230, 230, 74, 212, + 45, 107, 132, 1, 47, 187, 233, 4, 5, 167, 166, 162, 98, 119, 33, 205, + 41, 88, 31, 110, 210, 89, 12, 230, 41, 187, 84, 64, 74, 230, 78, 151, + 13, 10, 240, 99, 56, 234, 176, 50, 217, 35, 68, 91, 78, 220, 139, 208, + 84, 114, 208, 47, 48, 230, 252, 94, 21, 212, 66, 36, 51, 236, 148, 112, + 165, 49, 181, 164, 192, 240, 89, 87, 138, 183, 63, 227, 134, 147, 233, 196, + 131, 116, 63, 133, 220, 53, 230, 120, 48, 22, 180, 242, 253, 42, 6, 24, + 19, 17, 60, 223, 44, 194, 96, 17, 97, 72, 170, 0, 25, 142, 45, 48, + 229, 59, 108, 72, 118, 148, 181, 146, 164, 130, 58, 175, 35, 75, 123, 157, + 102, 236, 240, 177, 198, 147, 171, 208, 96, 59, 247, 223, 78, 45, 151, 243, + 244, 106, 181, 68, 117, 248, 236, 58, 212, 223, 96, 155, 17, 180, 159, 213, + 82, 212, 30, 79, 149, 120, 192, 177, 139, 119, 214, 73, 209, 223, 249, 156, + 99, 100, 16, 10, 42, 58, 135, 56, 223, 24, 89, 148, 182, 138, 206, 164, + 206, 53, 70, 54, 67, 87, 43, 199, 113, 24, 217, 72, 55, 69, 103, 33, + 74, 225, 209, 81, 211, 196, 133, 14, 171, 233, 224, 7, 130, 206, 231, 18, + 153, 114, 201, 215, 80, 43, 85, 220, 77, 131, 220, 192, 119, 44, 188, 171, + 169, 199, 11, 105, 31, 64, 164, 1, 189, 14, 161, 7, 28, 118, 29, 159, + 17, 81, 203, 34, 125, 97, 139, 109, 118, 94, 18, 52, 43, 81, 209, 50, + 43, 53, 71, 198, 86, 174, 132, 148, 165, 14, 84, 192, 231, 1, 112, 140, + 253, 125, 162, 234, 212, 219, 185, 78, 51, 85, 177, 201, 196, 26, 55, 110, + 88, 177, 115, 25, 187, 164, 91, 116, 221, 110, 84, 10, 61, 179, 55, 103, + 179, 110, 13, 11, 81, 218, 127, 211, 208, 113, 206, 158, 145, 159, 229, 75, + 199, 172, 13, 78, 46, 238, 118, 201, 46, 48, 178, 150, 130, 208, 176, 212, + 5, 87, 70, 89, 158, 161, 74, 196, 244, 208, 98, 81, 72, 194, 160, 8, + 173, 4, 191, 213, 225, 195, 229, 136, 42, 64, 159, 201, 66, 108, 73, 254, + 185, 34, 47, 3, 215, 134, 25, 74, 233, 68, 196, 223, 155, 164, 100, 213, + 252, 141, 16, 5, 73, 137, 82, 119, 132, 87, 94, 39, 110, 135, 188, 174, + 5, 157, 49, 208, 18, 36, 137, 157, 81, 247, 106, 48, 234, 0, 58, 46, + 167, 147, 200, 126, 141, 3, 116, 86, 162, 204, 3, 133, 251, 207, 238, 68, + 84, 118, 53, 93, 211, 229, 16, 249, 52, 67, 210, 176, 130, 158, 149, 22, + 64, 51, 167, 105, 111, 144, 113, 30, 106, 210, 97, 116, 29, 10, 212, 23, + 121, 52, 53, 247, 1, 250, 8, 133, 244, 213, 66, 248, 229, 156, 184, 105, + 15, 109, 154, 161, 94, 204, 168, 154, 60, 96, 175, 200, 126, 249, 216, 195, + 161, 251, 21, 22, 184, 20, 118, 136, 98, 180, 9, 9, 174, 210, 133, 53, + 134, 70, 169, 225, 72, 232, 72, 189, 211, 8, 106, 241, 182, 255, 104, 190, + 254, 199, 206, 211, 149, 161, 69, 110, 92, 92, 7, 126, 106, 38, 127, 249, + 127, 118, 194, 2, 60, 65, 195, 58, 41, 255, 80, 144, 147, 217, 5, 203, + 168, 44, 206, 169, 227, 98, 31, 16, 93, 165, 157, 147, 47, 61, 105, 46, + 208, 4, 113, 139, 134, 216, 59, 196, 10, 86, 68, 188, 175, 254, 71, 87, + 43, 238, 5, 176, 247, 238, 104, 122, 51, 77, 216, 81, 4, 61, 2, 10, + 162, 231, 155, 145, 143, 111, 58, 27, 27, 238, 114, 135, 142, 91, 193, 113, + 203, 157, 77, 71, 155, 27, 152, 185, 38, 153, 249, 70, 226, 223, 107, 227, + 31, 238, 255, 87, 110, 211, 61, 79, 92, 200, 226, 212, 6, 115, 114, 27, + 217, 118, 235, 228, 111, 40, 73, 208, 255, 134, 168, 166, 225, 182, 130, 214, + 203, 23, 65, 171, 249, 34, 104, 55, 245, 239, 241, 241, 11, 74, 199, 223, + 40, 8, 221, 94, 58, 239, 141, 176, 18, 168, 255, 37, 164, 197, 152, 138, + 174, 17, 195, 75, 23, 61, 137, 53, 12, 143, 44, 202, 164, 189, 135, 45, + 150, 154, 213, 242, 166, 62, 60, 138, 43, 37, 228, 188, 26, 13, 225, 50, + 81, 150, 156, 223, 34, 159, 224, 244, 225, 128, 129, 110, 108, 208, 245, 109, + 51, 104, 194, 16, 82, 204, 161, 106, 37, 67, 231, 56, 12, 57, 48, 5, + 204, 197, 108, 216, 69, 128, 246, 134, 93, 160, 165, 163, 5, 170, 114, 198, + 142, 159, 192, 246, 169, 8, 209, 115, 244, 45, 130, 11, 14, 246, 11, 72, + 71, 43, 253, 230, 110, 135, 174, 2, 128, 186, 211, 7, 246, 175, 113, 140, + 214, 245, 88, 55, 27, 60, 147, 27, 249, 45, 186, 0, 138, 226, 87, 228, + 72, 19, 32, 239, 111, 201, 167, 0, 126, 219, 213, 162, 184, 130, 129, 1, + 48, 75, 139, 115, 196, 50, 199, 208, 204, 129, 215, 11, 166, 143, 148, 26, + 85, 141, 45, 241, 188, 226, 43, 186, 237, 8, 201, 18, 95, 251, 74, 137, + 130, 146, 132, 25, 250, 150, 132, 97, 244, 224, 111, 51, 12, 154, 161, 91, + 19, 104, 73, 112, 116, 123, 76, 242, 114, 30, 223, 4, 9, 174, 205, 97, + 249, 119, 137, 52, 208, 72, 13, 104, 134, 235, 111, 196, 127, 1, 26, 249, + 139, 108, 13, 114, 162, 179, 189, 171, 199, 48, 190, 33, 254, 205, 228, 28, + 165, 19, 200, 20, 227, 199, 230, 14, 51, 54, 119, 226, 25, 10, 182, 67, + 151, 191, 155, 233, 252, 28, 243, 119, 81, 94, 52, 34, 60, 27, 32, 26, + 232, 244, 72, 213, 199, 99, 82, 61, 3, 76, 197, 66, 109, 170, 184, 205, + 61, 251, 74, 252, 135, 200, 200, 126, 16, 184, 146, 144, 124, 92, 25, 133, + 159, 100, 248, 56, 128, 135, 119, 72, 231, 108, 220, 211, 62, 13, 158, 122, + 206, 141, 218, 29, 80, 96, 109, 16, 96, 213, 23, 126, 142, 76, 192, 138, + 134, 248, 75, 104, 130, 86, 124, 9, 85, 173, 8, 92, 123, 137, 185, 228, + 141, 134, 96, 231, 192, 146, 116, 245, 62, 93, 27, 233, 117, 6, 72, 232, + 46, 134, 8, 39, 44, 82, 191, 0, 138, 64, 139, 29, 177, 122, 62, 86, + 175, 108, 163, 253, 42, 120, 21, 132, 194, 105, 199, 49, 16, 6, 66, 214, + 53, 147, 189, 238, 108, 70, 215, 128, 228, 157, 130, 62, 160, 183, 97, 135, + 86, 167, 10, 33, 74, 107, 51, 164, 213, 169, 255, 160, 111, 140, 237, 93, + 45, 58, 70, 72, 212, 94, 225, 104, 90, 216, 103, 117, 196, 35, 39, 93, + 68, 88, 54, 180, 238, 116, 127, 107, 13, 209, 209, 134, 243, 192, 165, 129, + 208, 203, 0, 149, 86, 155, 252, 231, 170, 12, 26, 182, 86, 6, 230, 34, + 136, 105, 172, 73, 40, 34, 5, 46, 83, 149, 104, 162, 86, 14, 79, 201, + 155, 3, 189, 204, 229, 40, 96, 202, 0, 212, 106, 80, 61, 151, 156, 76, + 193, 178, 191, 149, 73, 85, 233, 51, 172, 159, 46, 122, 221, 121, 31, 47, + 155, 17, 52, 64, 56, 196, 130, 195, 219, 99, 213, 38, 226, 87, 83, 23, + 119, 244, 196, 11, 194, 113, 247, 188, 222, 116, 215, 97, 178, 173, 55, 131, + 180, 236, 159, 7, 97, 101, 231, 110, 140, 119, 244, 162, 97, 224, 191, 191, + 14, 3, 127, 131, 190, 155, 214, 97, 141, 220, 176, 214, 201, 133, 211, 134, + 222, 134, 244, 6, 40, 77, 142, 138, 24, 145, 244, 104, 36, 177, 122, 141, + 222, 145, 158, 109, 41, 82, 26, 58, 184, 73, 252, 115, 229, 247, 152, 203, + 104, 91, 10, 252, 94, 113, 247, 216, 73, 134, 37, 224, 208, 96, 164, 211, + 37, 249, 77, 207, 186, 83, 71, 70, 71, 243, 19, 228, 159, 89, 250, 30, + 74, 182, 233, 117, 217, 127, 158, 36, 77, 242, 133, 1, 99, 4, 6, 8, + 213, 171, 146, 58, 122, 30, 177, 102, 45, 32, 175, 120, 190, 200, 128, 46, + 85, 53, 188, 68, 98, 6, 106, 50, 21, 99, 189, 45, 134, 23, 242, 253, + 210, 125, 25, 188, 118, 126, 97, 167, 155, 12, 71, 102, 142, 41, 114, 145, + 236, 154, 221, 128, 76, 205, 180, 160, 146, 101, 19, 50, 225, 18, 40, 212, + 113, 65, 27, 232, 218, 154, 128, 105, 236, 218, 120, 137, 141, 44, 48, 110, + 42, 200, 113, 58, 235, 113, 2, 179, 130, 185, 130, 53, 180, 166, 223, 54, + 59, 247, 10, 222, 228, 235, 213, 238, 119, 209, 14, 153, 68, 0, 99, 217, + 95, 143, 161, 149, 49, 84, 214, 228, 168, 233, 254, 213, 88, 92, 45, 226, + 165, 130, 132, 235, 22, 223, 208, 125, 26, 143, 86, 230, 121, 134, 201, 34, + 187, 134, 176, 242, 17, 149, 200, 68, 115, 126, 168, 134, 103, 186, 25, 93, + 206, 78, 72, 18, 110, 147, 145, 75, 185, 76, 230, 49, 124, 245, 221, 119, + 127, 249, 129, 221, 11, 235, 214, 182, 26, 178, 181, 168, 242, 130, 221, 174, + 40, 23, 195, 220, 176, 85, 1, 121, 44, 46, 44, 95, 87, 229, 107, 58, + 145, 92, 61, 100, 234, 51, 39, 94, 250, 57, 230, 22, 254, 248, 238, 111, + 127, 252, 78, 99, 166, 202, 168, 199, 195, 62, 38, 68, 126, 25, 165, 76, + 21, 255, 254, 235, 157, 152, 116, 36, 18, 99, 20, 126, 136, 186, 204, 83, + 14, 94, 250, 158, 184, 19, 138, 130, 0, 207, 17, 158, 80, 232, 233, 93, + 246, 190, 153, 174, 164, 235, 192, 5, 195, 199, 21, 186, 143, 149, 98, 97, + 125, 240, 84, 95, 88, 161, 143, 235, 182, 189, 146, 68, 194, 237, 72, 84, + 65, 105, 48, 113, 111, 36, 150, 65, 110, 45, 170, 97, 250, 110, 167, 187, + 70, 129, 38, 78, 92, 75, 80, 20, 200, 86, 58, 220, 89, 245, 170, 123, + 252, 141, 244, 239, 146, 226, 177, 232, 34, 130, 108, 239, 46, 3, 186, 88, + 47, 89, 117, 249, 105, 162, 138, 167, 37, 59, 128, 130, 204, 200, 182, 88, + 218, 212, 250, 102, 52, 189, 2, 204, 134, 163, 245, 184, 251, 1, 99, 218, + 26, 87, 247, 112, 216, 130, 227, 190, 91, 78, 27, 64, 44, 23, 203, 238, + 124, 185, 112, 175, 232, 132, 135, 145, 6, 230, 139, 222, 116, 62, 168, 16, + 96, 120, 100, 10, 0, 91, 96, 93, 163, 157, 242, 89, 181, 221, 185, 126, + 196, 100, 84, 112, 178, 49, 62, 239, 204, 67, 52, 202, 46, 240, 206, 177, + 211, 155, 78, 231, 253, 5, 129, 9, 206, 109, 81, 64, 63, 116, 212, 116, + 63, 81, 174, 236, 76, 82, 1, 116, 241, 138, 158, 58, 129, 74, 0, 65, + 255, 24, 6, 235, 40, 216, 68, 193, 71, 152, 32, 49, 175, 178, 1, 120, + 129, 62, 245, 228, 248, 103, 131, 57, 74, 246, 56, 62, 56, 105, 111, 98, + 69, 75, 213, 136, 196, 138, 7, 185, 135, 68, 87, 111, 208, 76, 201, 201, + 143, 70, 104, 33, 68, 9, 126, 34, 61, 106, 124, 72, 182, 23, 37, 36, + 91, 165, 203, 36, 225, 162, 59, 203, 107, 127, 159, 116, 245, 168, 110, 36, + 79, 119, 120, 91, 2, 255, 250, 180, 242, 106, 112, 16, 66, 168, 210, 231, + 157, 201, 1, 224, 158, 216, 145, 125, 240, 69, 91, 40, 17, 138, 240, 40, + 231, 66, 57, 46, 148, 41, 67, 164, 218, 191, 171, 223, 49, 117, 246, 135, + 117, 232, 194, 71, 138, 6, 90, 239, 11, 71, 164, 251, 171, 117, 214, 81, + 66, 59, 41, 50, 5, 238, 6, 95, 96, 35, 165, 80, 165, 31, 241, 229, + 99, 88, 235, 19, 86, 64, 53, 43, 181, 247, 66, 50, 208, 246, 8, 158, + 225, 223, 199, 200, 81, 245, 135, 0, 52, 53, 103, 126, 85, 127, 136, 20, + 52, 171, 42, 131, 68, 34, 86, 34, 97, 231, 80, 139, 162, 37, 47, 213, + 76, 248, 34, 176, 78, 80, 80, 122, 187, 52, 243, 123, 103, 220, 174, 28, + 176, 125, 62, 88, 36, 158, 18, 27, 45, 128, 54, 47, 134, 60, 35, 24, + 53, 21, 197, 175, 240, 39, 216, 166, 93, 26, 51, 35, 59, 230, 8, 113, + 133, 64, 42, 126, 54, 228, 219, 87, 221, 197, 224, 184, 21, 99, 196, 199, + 19, 215, 227, 55, 140, 28, 145, 78, 110, 60, 3, 221, 240, 230, 206, 189, + 73, 111, 73, 81, 7, 243, 212, 7, 19, 76, 235, 187, 156, 151, 133, 248, + 147, 193, 157, 210, 100, 150, 99, 184, 87, 85, 25, 233, 132, 34, 122, 162, + 182, 241, 10, 64, 66, 142, 113, 175, 208, 75, 212, 141, 240, 43, 215, 23, + 46, 148, 37, 169, 40, 65, 183, 99, 238, 15, 16, 30, 115, 40, 242, 101, + 5, 92, 200, 156, 197, 84, 150, 140, 202, 26, 60, 103, 122, 242, 225, 71, + 117, 152, 180, 213, 120, 242, 79, 128, 3, 141, 32, 7, 9, 49, 46, 39, + 20, 202, 9, 14, 26, 152, 48, 14, 198, 237, 227, 114, 37, 24, 118, 23, + 67, 25, 103, 20, 45, 76, 58, 165, 175, 74, 129, 251, 225, 44, 233, 148, + 254, 79, 9, 45, 76, 62, 4, 46, 230, 185, 32, 251, 146, 15, 110, 157, + 114, 216, 37, 186, 178, 196, 199, 125, 37, 186, 37, 183, 230, 198, 199, 118, + 177, 80, 22, 123, 189, 175, 88, 136, 197, 218, 49, 20, 163, 47, 157, 82, + 173, 132, 31, 197, 75, 157, 94, 142, 99, 245, 245, 200, 252, 218, 225, 175, + 205, 83, 7, 85, 92, 46, 80, 218, 116, 121, 234, 176, 242, 203, 2, 147, + 232, 50, 124, 129, 177, 43, 209, 145, 231, 155, 50, 46, 43, 76, 18, 202, + 141, 139, 106, 243, 168, 5, 189, 40, 47, 46, 22, 176, 196, 128, 78, 118, + 74, 73, 169, 162, 82, 98, 153, 66, 225, 140, 79, 157, 105, 159, 67, 95, + 210, 0, 167, 11, 54, 214, 153, 46, 206, 68, 51, 129, 211, 139, 100, 231, + 22, 23, 211, 69, 173, 118, 137, 221, 137, 11, 210, 154, 5, 105, 173, 124, + 90, 122, 129, 61, 157, 246, 57, 92, 102, 185, 23, 157, 157, 197, 21, 216, + 170, 202, 189, 248, 252, 188, 85, 201, 101, 128, 244, 223, 69, 237, 202, 217, + 89, 139, 115, 53, 207, 207, 227, 162, 92, 205, 223, 53, 33, 211, 49, 102, + 234, 181, 78, 157, 10, 134, 125, 68, 177, 190, 119, 177, 154, 224, 30, 222, + 191, 244, 140, 181, 67, 187, 58, 199, 49, 194, 168, 117, 195, 192, 190, 142, + 234, 0, 56, 224, 223, 8, 118, 237, 34, 170, 168, 106, 192, 16, 224, 44, + 95, 166, 74, 56, 32, 206, 12, 14, 180, 41, 108, 253, 92, 222, 29, 77, + 123, 108, 253, 174, 106, 250, 1, 181, 6, 53, 223, 84, 218, 215, 116, 137, + 87, 209, 30, 78, 66, 85, 87, 22, 60, 137, 98, 89, 186, 61, 138, 9, + 133, 143, 36, 0, 239, 117, 71, 35, 10, 0, 36, 132, 216, 21, 94, 103, + 2, 6, 202, 175, 219, 106, 130, 210, 226, 29, 5, 171, 41, 111, 61, 68, + 61, 15, 15, 168, 236, 65, 208, 125, 29, 7, 173, 151, 238, 194, 173, 193, + 15, 50, 211, 105, 146, 192, 59, 28, 185, 93, 63, 78, 80, 214, 191, 114, + 61, 79, 71, 98, 141, 144, 106, 67, 42, 124, 244, 88, 194, 42, 229, 1, + 27, 253, 5, 153, 228, 229, 142, 163, 95, 184, 6, 95, 122, 149, 162, 219, + 102, 248, 139, 238, 245, 129, 115, 140, 44, 209, 249, 95, 129, 194, 152, 215, + 177, 156, 15, 175, 40, 7, 55, 3, 178, 91, 97, 159, 11, 233, 220, 157, + 194, 225, 117, 132, 158, 96, 123, 64, 202, 224, 97, 56, 88, 119, 197, 11, + 251, 100, 102, 106, 5, 99, 132, 101, 4, 228, 139, 102, 10, 54, 47, 234, + 128, 3, 57, 129, 1, 131, 231, 24, 158, 222, 3, 144, 126, 14, 119, 134, + 31, 84, 188, 31, 192, 3, 166, 213, 188, 71, 28, 219, 123, 23, 217, 217, + 231, 231, 81, 37, 240, 188, 0, 47, 200, 74, 84, 186, 132, 156, 35, 117, + 10, 45, 213, 183, 80, 109, 12, 111, 80, 53, 60, 237, 188, 82, 224, 200, + 206, 193, 87, 120, 132, 20, 171, 203, 178, 12, 164, 169, 50, 230, 56, 228, + 119, 120, 85, 223, 27, 158, 6, 42, 142, 227, 0, 96, 229, 136, 30, 4, + 90, 217, 167, 34, 216, 113, 59, 130, 191, 197, 93, 125, 49, 152, 37, 138, + 191, 125, 174, 118, 123, 56, 214, 204, 252, 109, 199, 15, 223, 187, 74, 100, + 27, 237, 118, 120, 170, 154, 37, 1, 251, 52, 6, 222, 7, 114, 58, 29, + 93, 45, 160, 143, 7, 35, 68, 253, 164, 229, 116, 81, 70, 5, 11, 56, + 57, 152, 84, 26, 55, 13, 162, 100, 144, 13, 40, 51, 211, 105, 167, 71, + 241, 118, 49, 225, 212, 41, 67, 150, 179, 179, 36, 170, 212, 146, 114, 15, + 73, 98, 88, 122, 19, 158, 208, 83, 84, 122, 19, 157, 76, 186, 24, 142, + 58, 93, 192, 47, 102, 173, 188, 161, 115, 87, 25, 200, 202, 41, 58, 121, + 155, 96, 139, 85, 60, 190, 238, 156, 14, 157, 113, 162, 56, 196, 174, 45, + 6, 157, 219, 37, 48, 135, 198, 45, 19, 46, 153, 40, 116, 128, 95, 123, + 70, 78, 58, 189, 115, 214, 181, 35, 65, 82, 130, 49, 125, 49, 148, 21, + 190, 45, 18, 32, 107, 155, 32, 4, 26, 29, 133, 167, 36, 105, 170, 37, + 242, 219, 155, 225, 243, 205, 9, 164, 94, 200, 4, 82, 34, 125, 190, 129, + 65, 196, 225, 155, 122, 116, 178, 9, 48, 25, 200, 28, 87, 181, 221, 254, + 23, 176, 143, 200, 65, 98, 28, 228, 183, 208, 210, 91, 104, 232, 186, 252, + 22, 195, 233, 134, 193, 219, 11, 216, 28, 80, 95, 209, 125, 235, 105, 129, + 18, 135, 80, 184, 67, 111, 249, 40, 156, 60, 98, 209, 161, 233, 139, 214, + 25, 5, 127, 78, 182, 111, 209, 177, 42, 7, 153, 242, 59, 55, 227, 180, + 215, 233, 121, 24, 132, 233, 226, 207, 56, 40, 79, 164, 93, 249, 127, 22, + 79, 19, 149, 43, 208, 95, 183, 254, 40, 24, 238, 114, 57, 92, 220, 252, + 23, 151, 39, 42, 227, 4, 51, 74, 243, 71, 142, 148, 211, 89, 78, 97, + 13, 49, 28, 208, 77, 44, 254, 178, 23, 71, 236, 197, 247, 61, 20, 224, + 160, 55, 21, 88, 15, 244, 13, 22, 32, 253, 122, 142, 49, 89, 102, 37, + 168, 39, 68, 142, 52, 195, 160, 218, 24, 186, 189, 100, 251, 15, 22, 66, + 81, 106, 229, 77, 41, 40, 157, 132, 255, 216, 185, 202, 112, 116, 11, 164, + 145, 190, 37, 156, 197, 239, 169, 80, 62, 178, 154, 222, 108, 246, 68, 21, + 61, 77, 53, 8, 204, 95, 83, 147, 64, 1, 179, 52, 157, 242, 145, 131, + 15, 56, 129, 10, 82, 60, 54, 158, 140, 170, 251, 77, 202, 94, 57, 240, + 3, 17, 35, 138, 9, 167, 102, 129, 210, 221, 91, 183, 110, 196, 253, 134, + 25, 252, 27, 206, 12, 70, 190, 209, 243, 104, 206, 150, 158, 78, 38, 93, + 189, 41, 109, 126, 147, 158, 62, 110, 192, 129, 238, 246, 6, 47, 229, 225, + 139, 165, 205, 99, 236, 227, 186, 24, 122, 17, 159, 167, 107, 201, 223, 154, + 199, 29, 244, 85, 62, 18, 230, 144, 247, 30, 123, 244, 166, 76, 2, 200, + 249, 85, 186, 156, 35, 1, 157, 172, 198, 87, 192, 11, 160, 117, 164, 16, + 46, 26, 241, 102, 254, 218, 69, 225, 57, 234, 222, 149, 236, 62, 151, 172, + 43, 220, 140, 76, 130, 206, 229, 203, 238, 135, 193, 130, 187, 108, 30, 205, + 138, 142, 109, 13, 167, 8, 74, 250, 138, 22, 154, 222, 121, 142, 31, 161, + 30, 182, 125, 118, 131, 13, 218, 149, 68, 11, 170, 190, 65, 198, 20, 202, + 120, 68, 221, 46, 165, 225, 209, 247, 200, 20, 46, 126, 142, 79, 221, 175, + 149, 230, 232, 247, 113, 57, 4, 10, 3, 148, 116, 76, 4, 8, 102, 22, + 202, 67, 142, 90, 130, 42, 154, 227, 183, 1, 252, 31, 153, 89, 84, 41, + 118, 191, 62, 74, 238, 134, 125, 12, 115, 126, 234, 146, 234, 243, 202, 45, + 5, 68, 226, 191, 174, 84, 176, 146, 183, 114, 190, 121, 27, 19, 59, 208, + 253, 12, 130, 220, 170, 138, 182, 49, 222, 225, 2, 201, 41, 60, 148, 65, + 224, 157, 40, 203, 10, 100, 26, 122, 0, 47, 32, 54, 88, 185, 113, 195, + 171, 228, 51, 96, 239, 247, 188, 66, 94, 65, 126, 62, 192, 26, 136, 44, + 251, 121, 3, 145, 161, 97, 64, 20, 191, 28, 130, 106, 134, 59, 128, 54, + 139, 225, 138, 188, 111, 33, 216, 8, 106, 220, 10, 238, 225, 255, 184, 160, + 94, 92, 254, 99, 103, 244, 129, 57, 191, 135, 246, 225, 65, 115, 91, 56, + 121, 220, 208, 211, 114, 40, 186, 90, 28, 157, 176, 88, 88, 220, 76, 232, + 212, 198, 44, 131, 60, 202, 189, 195, 67, 11, 10, 69, 175, 73, 40, 10, + 59, 57, 179, 26, 240, 2, 204, 71, 4, 36, 242, 122, 52, 157, 206, 203, + 163, 233, 77, 92, 38, 221, 210, 64, 178, 57, 240, 31, 58, 94, 133, 122, + 207, 19, 225, 244, 22, 207, 128, 106, 205, 189, 43, 227, 225, 80, 126, 45, + 195, 39, 188, 230, 195, 147, 107, 93, 29, 128, 153, 63, 18, 53, 158, 186, + 31, 228, 185, 18, 50, 227, 81, 49, 130, 19, 238, 121, 130, 77, 156, 133, + 208, 157, 176, 18, 184, 245, 250, 7, 12, 76, 187, 224, 115, 174, 56, 227, + 98, 61, 191, 195, 10, 224, 247, 252, 60, 193, 39, 200, 226, 89, 19, 10, + 248, 248, 116, 19, 106, 34, 124, 225, 172, 82, 107, 79, 63, 171, 92, 45, + 205, 42, 147, 193, 101, 247, 138, 168, 32, 137, 3, 144, 101, 132, 63, 49, + 254, 105, 226, 159, 22, 254, 105, 227, 159, 99, 252, 243, 18, 255, 188, 194, + 63, 175, 241, 79, 23, 255, 92, 225, 159, 30, 254, 233, 227, 159, 1, 254, + 185, 46, 185, 151, 10, 67, 158, 30, 111, 142, 90, 191, 1, 204, 1, 192, + 93, 16, 214, 180, 47, 37, 218, 180, 138, 208, 6, 40, 221, 211, 161, 13, + 19, 209, 66, 132, 161, 118, 158, 30, 97, 184, 218, 47, 74, 6, 142, 154, + 191, 129, 233, 52, 9, 193, 75, 69, 8, 154, 217, 25, 189, 238, 210, 116, + 18, 31, 82, 196, 136, 225, 247, 41, 138, 56, 243, 183, 74, 130, 119, 17, + 53, 240, 117, 146, 186, 77, 34, 153, 114, 164, 230, 11, 159, 22, 85, 14, + 255, 131, 18, 127, 115, 90, 68, 71, 210, 171, 233, 164, 219, 235, 97, 251, + 239, 236, 8, 153, 170, 51, 239, 208, 14, 78, 241, 107, 152, 242, 141, 42, + 37, 195, 156, 224, 165, 170, 174, 73, 92, 114, 97, 236, 149, 208, 195, 89, + 127, 151, 248, 209, 41, 156, 181, 222, 157, 197, 193, 187, 0, 32, 93, 158, + 36, 239, 78, 191, 9, 147, 240, 244, 155, 40, 137, 130, 73, 50, 169, 71, + 193, 55, 113, 242, 77, 88, 251, 38, 194, 15, 248, 55, 74, 190, 65, 53, + 34, 213, 213, 209, 160, 51, 190, 21, 82, 42, 18, 13, 45, 230, 61, 165, + 157, 222, 233, 155, 215, 46, 223, 9, 121, 212, 220, 29, 79, 73, 219, 147, + 216, 106, 146, 254, 116, 149, 4, 10, 1, 132, 90, 220, 19, 14, 236, 173, + 147, 227, 134, 163, 90, 51, 130, 76, 223, 14, 12, 39, 254, 80, 80, 21, + 16, 106, 232, 40, 233, 217, 214, 225, 56, 202, 119, 238, 139, 157, 187, 118, + 61, 106, 159, 56, 67, 15, 3, 255, 161, 220, 7, 83, 111, 117, 26, 156, + 36, 140, 17, 162, 99, 190, 156, 113, 171, 139, 169, 66, 117, 147, 6, 134, + 200, 138, 134, 50, 200, 84, 136, 88, 236, 176, 177, 247, 187, 203, 174, 232, + 58, 22, 64, 137, 205, 84, 149, 65, 62, 22, 165, 114, 232, 75, 104, 135, + 71, 31, 191, 51, 75, 251, 219, 127, 112, 236, 174, 149, 16, 39, 31, 151, + 17, 133, 43, 129, 126, 123, 93, 130, 197, 5, 152, 203, 247, 171, 233, 2, + 235, 43, 95, 148, 182, 71, 190, 172, 121, 87, 186, 172, 224, 149, 76, 198, + 80, 128, 251, 49, 54, 38, 204, 144, 195, 143, 6, 203, 129, 50, 22, 80, + 57, 141, 152, 140, 99, 11, 220, 69, 208, 117, 88, 79, 153, 224, 216, 79, + 231, 201, 246, 104, 123, 13, 20, 8, 69, 121, 248, 124, 5, 207, 168, 123, + 13, 143, 235, 29, 95, 161, 244, 166, 99, 20, 190, 169, 147, 29, 148, 170, + 112, 98, 175, 239, 190, 7, 254, 29, 18, 188, 247, 239, 223, 243, 229, 177, + 8, 200, 203, 89, 161, 38, 206, 234, 111, 225, 239, 206, 235, 15, 70, 84, + 2, 91, 107, 224, 87, 15, 222, 120, 122, 247, 228, 162, 12, 80, 229, 218, + 245, 225, 27, 171, 52, 2, 38, 192, 176, 235, 215, 46, 199, 0, 39, 21, + 73, 13, 60, 67, 40, 203, 102, 10, 188, 10, 35, 249, 16, 243, 245, 52, + 191, 228, 110, 168, 187, 186, 14, 206, 1, 196, 35, 227, 165, 26, 0, 137, + 193, 131, 120, 2, 76, 241, 39, 29, 128, 250, 124, 53, 41, 116, 78, 159, + 179, 8, 147, 12, 78, 254, 127, 246, 222, 189, 63, 109, 100, 201, 31, 254, + 95, 175, 66, 33, 202, 112, 19, 88, 18, 96, 59, 182, 229, 108, 46, 115, + 219, 29, 103, 178, 153, 57, 103, 230, 172, 227, 112, 48, 96, 195, 132, 219, + 65, 96, 96, 24, 246, 181, 63, 245, 173, 234, 150, 90, 32, 108, 103, 46, + 191, 253, 60, 251, 217, 57, 39, 70, 125, 175, 174, 238, 174, 174, 174, 174, + 174, 98, 216, 241, 36, 161, 194, 42, 59, 241, 40, 208, 74, 191, 217, 16, + 226, 245, 201, 120, 129, 89, 177, 222, 52, 215, 32, 79, 253, 3, 223, 195, + 127, 197, 103, 190, 183, 49, 99, 182, 35, 182, 194, 233, 160, 10, 225, 175, + 165, 28, 255, 84, 148, 127, 28, 61, 86, 235, 60, 13, 120, 158, 224, 226, + 198, 171, 20, 176, 99, 103, 200, 6, 118, 249, 76, 12, 223, 110, 46, 86, + 5, 142, 168, 229, 98, 22, 249, 195, 221, 14, 8, 223, 141, 246, 208, 116, + 128, 181, 55, 191, 22, 153, 180, 178, 103, 147, 224, 20, 149, 25, 174, 187, + 16, 140, 61, 116, 117, 239, 104, 183, 157, 243, 243, 144, 150, 205, 134, 55, + 176, 126, 41, 11, 157, 117, 13, 121, 120, 30, 80, 197, 133, 224, 29, 86, + 218, 102, 31, 121, 112, 15, 171, 155, 86, 17, 129, 74, 47, 219, 58, 97, + 147, 84, 6, 67, 182, 196, 133, 129, 94, 169, 122, 69, 13, 158, 221, 71, + 205, 7, 3, 6, 24, 220, 65, 52, 235, 182, 58, 186, 163, 152, 12, 82, + 255, 254, 171, 106, 212, 22, 54, 98, 61, 129, 27, 28, 237, 137, 28, 54, + 23, 108, 210, 169, 63, 146, 199, 23, 240, 37, 169, 77, 169, 235, 244, 221, + 169, 26, 188, 17, 187, 227, 121, 41, 35, 249, 243, 240, 27, 2, 189, 133, + 136, 78, 46, 183, 196, 196, 224, 140, 79, 212, 54, 171, 110, 57, 218, 245, + 90, 209, 214, 118, 185, 56, 232, 217, 220, 44, 70, 223, 0, 80, 252, 234, + 149, 156, 224, 220, 97, 201, 188, 216, 8, 166, 112, 113, 227, 106, 58, 61, + 199, 91, 34, 73, 241, 15, 156, 90, 113, 99, 146, 234, 89, 212, 158, 226, + 38, 239, 196, 54, 65, 118, 105, 27, 154, 224, 250, 132, 32, 99, 78, 13, + 189, 186, 124, 118, 69, 17, 173, 165, 25, 65, 229, 46, 89, 68, 114, 245, + 112, 222, 172, 89, 153, 239, 119, 186, 173, 65, 94, 176, 246, 211, 242, 27, + 81, 240, 210, 218, 94, 96, 250, 70, 29, 49, 79, 220, 73, 20, 235, 99, + 147, 84, 91, 134, 234, 225, 175, 140, 123, 115, 143, 246, 59, 247, 75, 124, + 186, 153, 240, 134, 126, 112, 172, 181, 224, 13, 168, 195, 227, 198, 179, 60, + 163, 60, 70, 83, 124, 175, 34, 202, 236, 248, 91, 15, 197, 181, 154, 168, + 74, 109, 27, 95, 192, 67, 162, 1, 141, 14, 251, 195, 213, 222, 112, 175, + 54, 162, 151, 25, 19, 230, 160, 104, 19, 185, 85, 35, 54, 12, 131, 198, + 51, 104, 206, 197, 201, 181, 162, 125, 1, 199, 56, 156, 124, 1, 176, 48, + 136, 76, 192, 168, 222, 16, 186, 7, 193, 38, 149, 253, 77, 156, 253, 77, + 232, 167, 234, 170, 115, 83, 245, 125, 77, 53, 184, 169, 198, 86, 83, 104, + 77, 238, 108, 169, 119, 147, 238, 180, 77, 36, 160, 64, 103, 126, 118, 28, + 162, 44, 5, 34, 165, 61, 131, 157, 63, 249, 10, 47, 243, 79, 41, 75, + 254, 42, 142, 185, 100, 46, 84, 103, 4, 39, 202, 247, 150, 207, 242, 49, + 235, 60, 135, 125, 155, 117, 201, 157, 111, 114, 58, 234, 78, 69, 221, 33, + 106, 8, 70, 88, 246, 122, 3, 144, 156, 51, 204, 21, 95, 92, 218, 115, + 247, 206, 190, 42, 33, 116, 2, 81, 214, 208, 165, 47, 62, 124, 93, 236, + 41, 118, 145, 42, 118, 33, 197, 46, 92, 250, 226, 98, 145, 146, 137, 193, + 189, 45, 100, 98, 86, 206, 121, 147, 59, 247, 95, 20, 162, 114, 136, 79, + 100, 129, 220, 125, 136, 191, 20, 203, 217, 57, 224, 70, 151, 254, 85, 137, + 63, 15, 152, 65, 231, 234, 40, 14, 121, 253, 56, 47, 146, 74, 28, 115, + 128, 63, 46, 127, 170, 188, 222, 213, 249, 133, 89, 239, 69, 82, 239, 197, + 110, 189, 200, 187, 85, 239, 69, 82, 239, 69, 170, 94, 60, 165, 230, 83, + 7, 215, 200, 64, 170, 90, 140, 20, 13, 13, 142, 31, 140, 184, 168, 168, + 165, 74, 55, 227, 209, 12, 210, 252, 132, 81, 85, 150, 130, 229, 81, 9, + 146, 89, 218, 63, 203, 208, 49, 144, 197, 155, 214, 52, 112, 140, 26, 227, + 47, 131, 141, 138, 221, 248, 109, 215, 175, 158, 254, 168, 125, 58, 104, 28, + 242, 10, 60, 15, 195, 231, 1, 103, 8, 63, 124, 80, 204, 12, 2, 235, + 127, 74, 223, 10, 237, 208, 57, 63, 109, 159, 135, 65, 237, 139, 47, 218, + 103, 97, 112, 252, 162, 22, 156, 180, 193, 30, 198, 170, 203, 235, 127, 254, + 211, 65, 161, 13, 107, 4, 55, 148, 18, 182, 236, 208, 45, 251, 87, 209, + 71, 182, 127, 77, 148, 245, 45, 229, 14, 248, 156, 213, 117, 93, 31, 254, + 37, 2, 207, 147, 218, 62, 124, 48, 5, 125, 231, 27, 35, 143, 111, 153, + 58, 203, 92, 198, 254, 69, 121, 107, 215, 254, 150, 175, 42, 151, 177, 169, + 163, 171, 141, 246, 38, 138, 167, 3, 177, 234, 48, 223, 161, 176, 178, 54, + 107, 146, 7, 199, 41, 197, 108, 219, 21, 245, 64, 96, 46, 160, 3, 245, + 109, 207, 192, 238, 151, 172, 57, 34, 88, 213, 126, 104, 89, 48, 253, 186, + 18, 205, 86, 112, 255, 44, 82, 63, 144, 230, 215, 223, 14, 111, 171, 189, + 237, 87, 98, 4, 236, 245, 104, 24, 174, 61, 247, 90, 223, 16, 216, 231, + 182, 89, 111, 158, 152, 199, 209, 144, 5, 147, 160, 87, 68, 5, 15, 104, + 180, 224, 136, 143, 21, 131, 213, 201, 239, 167, 45, 181, 224, 175, 98, 144, + 226, 10, 120, 111, 92, 76, 199, 4, 79, 202, 138, 73, 202, 2, 138, 40, + 6, 151, 111, 236, 92, 63, 12, 251, 67, 62, 128, 211, 7, 45, 106, 90, + 252, 34, 61, 12, 215, 253, 33, 177, 130, 162, 135, 117, 49, 12, 61, 251, + 226, 2, 142, 129, 161, 41, 124, 17, 174, 229, 124, 94, 112, 46, 134, 101, + 231, 226, 162, 120, 64, 251, 169, 85, 214, 175, 75, 155, 83, 66, 138, 19, + 87, 69, 212, 130, 72, 203, 34, 170, 218, 135, 177, 118, 250, 186, 22, 84, + 250, 67, 162, 200, 84, 87, 255, 130, 59, 217, 191, 56, 243, 131, 67, 155, + 218, 66, 126, 226, 53, 249, 78, 189, 127, 113, 206, 177, 23, 58, 54, 86, + 1, 117, 250, 23, 79, 104, 91, 58, 180, 62, 85, 97, 31, 165, 221, 155, + 143, 62, 69, 225, 218, 47, 3, 85, 189, 131, 195, 70, 163, 118, 88, 220, + 152, 62, 206, 178, 16, 110, 87, 206, 237, 159, 216, 102, 216, 79, 57, 215, + 254, 134, 191, 190, 161, 175, 11, 254, 186, 160, 175, 184, 31, 28, 19, 135, + 114, 174, 21, 183, 170, 109, 142, 73, 40, 39, 195, 207, 254, 7, 33, 245, + 165, 163, 70, 206, 197, 121, 227, 195, 118, 124, 78, 226, 233, 64, 16, 217, + 43, 154, 167, 190, 111, 172, 23, 229, 150, 188, 127, 217, 83, 250, 44, 31, + 62, 228, 191, 248, 2, 193, 224, 234, 137, 4, 55, 140, 87, 158, 95, 30, + 47, 6, 40, 230, 75, 156, 72, 106, 174, 216, 244, 187, 60, 122, 208, 49, + 107, 41, 73, 120, 228, 153, 41, 175, 35, 10, 249, 156, 205, 255, 17, 48, + 249, 34, 5, 63, 208, 15, 79, 61, 231, 140, 19, 55, 167, 136, 167, 66, + 148, 52, 162, 36, 176, 182, 43, 89, 52, 41, 79, 149, 49, 22, 42, 62, + 206, 29, 161, 240, 85, 79, 74, 34, 155, 56, 72, 210, 137, 205, 18, 75, + 90, 160, 169, 235, 188, 155, 223, 168, 231, 9, 182, 180, 96, 115, 11, 198, + 235, 12, 19, 206, 8, 194, 172, 182, 186, 129, 97, 165, 169, 146, 124, 227, + 104, 220, 196, 0, 211, 209, 230, 167, 205, 210, 89, 127, 179, 201, 93, 114, + 11, 185, 4, 108, 123, 76, 128, 210, 232, 87, 123, 59, 143, 52, 111, 38, + 153, 250, 128, 134, 92, 164, 63, 84, 234, 175, 90, 173, 4, 124, 43, 84, + 77, 112, 40, 160, 60, 81, 151, 32, 233, 184, 144, 73, 0, 5, 55, 146, + 185, 63, 186, 25, 35, 35, 244, 246, 87, 112, 224, 123, 215, 234, 15, 112, + 169, 149, 16, 249, 191, 137, 26, 173, 193, 202, 177, 136, 8, 52, 139, 105, + 251, 162, 151, 168, 251, 179, 6, 27, 184, 51, 37, 210, 35, 176, 133, 215, + 21, 22, 165, 73, 97, 252, 43, 90, 29, 58, 24, 59, 191, 85, 36, 6, + 176, 11, 15, 214, 153, 157, 251, 182, 206, 21, 251, 245, 230, 136, 209, 181, + 56, 43, 60, 160, 76, 52, 70, 113, 193, 208, 249, 205, 78, 101, 32, 146, + 32, 78, 151, 116, 61, 86, 42, 25, 254, 76, 121, 107, 217, 46, 180, 91, + 35, 96, 168, 128, 61, 23, 35, 128, 130, 144, 219, 54, 46, 64, 91, 238, + 117, 214, 120, 124, 253, 250, 141, 93, 184, 101, 135, 188, 152, 0, 227, 225, + 112, 12, 220, 220, 245, 163, 49, 113, 92, 218, 87, 101, 75, 158, 40, 86, + 45, 169, 43, 75, 39, 59, 237, 114, 201, 167, 131, 193, 19, 200, 178, 154, + 40, 193, 198, 45, 148, 140, 80, 228, 143, 201, 123, 184, 157, 104, 41, 114, + 98, 77, 225, 40, 244, 153, 35, 204, 166, 51, 229, 195, 41, 146, 62, 176, + 75, 218, 233, 38, 62, 114, 24, 2, 33, 185, 43, 48, 132, 252, 15, 95, + 237, 153, 55, 2, 143, 184, 222, 123, 204, 213, 158, 8, 251, 69, 247, 135, + 190, 239, 213, 253, 201, 104, 126, 231, 210, 47, 114, 115, 185, 71, 92, 250, + 105, 13, 160, 123, 180, 131, 98, 240, 181, 118, 208, 163, 117, 127, 84, 63, + 30, 194, 238, 174, 88, 253, 33, 252, 238, 189, 141, 137, 91, 252, 115, 133, + 235, 73, 181, 137, 22, 144, 210, 146, 100, 221, 30, 143, 119, 136, 74, 254, + 5, 177, 36, 227, 187, 194, 229, 101, 222, 91, 230, 137, 25, 166, 36, 223, + 85, 28, 43, 171, 54, 210, 137, 164, 226, 23, 175, 174, 138, 39, 219, 25, + 175, 138, 185, 141, 129, 54, 165, 96, 108, 226, 109, 91, 205, 86, 49, 181, + 163, 238, 66, 49, 33, 254, 242, 237, 30, 173, 89, 17, 73, 201, 41, 211, + 212, 179, 18, 34, 39, 138, 186, 70, 83, 91, 218, 186, 130, 86, 209, 19, + 46, 136, 38, 124, 17, 138, 58, 196, 36, 109, 44, 168, 249, 148, 44, 136, + 103, 154, 216, 9, 196, 63, 229, 242, 60, 172, 31, 99, 77, 47, 207, 194, + 198, 209, 11, 184, 141, 172, 31, 159, 44, 43, 199, 71, 167, 112, 231, 75, + 57, 130, 210, 234, 212, 40, 5, 197, 202, 192, 165, 164, 171, 98, 201, 63, + 132, 140, 101, 55, 169, 76, 204, 126, 78, 158, 184, 37, 120, 146, 219, 227, + 93, 52, 61, 114, 114, 169, 89, 172, 237, 140, 24, 221, 149, 138, 227, 7, + 1, 180, 152, 146, 55, 98, 64, 65, 145, 53, 15, 13, 23, 225, 133, 188, + 83, 34, 188, 64, 145, 9, 174, 195, 217, 214, 88, 42, 3, 97, 42, 127, + 23, 246, 43, 253, 155, 66, 255, 60, 124, 126, 228, 30, 31, 185, 245, 227, + 34, 36, 246, 203, 103, 129, 123, 231, 222, 81, 215, 139, 121, 60, 174, 11, + 68, 32, 178, 0, 99, 167, 94, 216, 217, 237, 249, 112, 14, 45, 144, 170, + 189, 180, 127, 229, 39, 164, 214, 60, 182, 118, 32, 189, 77, 212, 187, 33, + 117, 227, 65, 164, 254, 192, 210, 74, 168, 162, 33, 215, 146, 207, 249, 116, + 0, 187, 221, 108, 7, 138, 85, 64, 163, 12, 139, 44, 138, 101, 219, 82, + 55, 17, 246, 59, 83, 177, 59, 173, 158, 173, 178, 43, 17, 27, 155, 173, + 236, 116, 37, 251, 150, 66, 118, 162, 139, 158, 191, 71, 58, 18, 247, 200, + 163, 92, 169, 206, 198, 155, 139, 50, 227, 226, 107, 63, 196, 134, 97, 23, + 31, 134, 93, 192, 211, 70, 196, 79, 168, 49, 140, 107, 116, 124, 217, 26, + 146, 38, 136, 89, 0, 5, 1, 167, 158, 88, 152, 96, 227, 29, 62, 100, + 87, 216, 89, 76, 53, 114, 162, 34, 186, 236, 246, 144, 208, 116, 218, 222, + 69, 211, 132, 11, 75, 149, 61, 16, 43, 205, 119, 182, 75, 112, 223, 122, + 76, 155, 173, 144, 82, 137, 238, 187, 90, 231, 172, 170, 211, 154, 118, 77, + 10, 106, 95, 242, 171, 209, 43, 65, 159, 236, 57, 112, 97, 143, 215, 44, + 238, 186, 71, 255, 58, 244, 47, 218, 192, 164, 9, 158, 95, 99, 125, 243, + 2, 159, 141, 211, 203, 219, 83, 171, 251, 249, 11, 90, 232, 101, 123, 121, + 114, 124, 132, 159, 83, 171, 207, 58, 225, 158, 187, 66, 70, 93, 74, 201, + 149, 15, 161, 46, 217, 87, 74, 227, 233, 12, 207, 124, 40, 188, 247, 115, + 201, 156, 198, 58, 112, 0, 27, 244, 0, 19, 100, 18, 10, 178, 149, 170, + 32, 140, 155, 61, 234, 149, 136, 204, 95, 38, 8, 68, 2, 228, 208, 46, + 214, 61, 52, 126, 85, 67, 96, 234, 224, 121, 132, 143, 238, 236, 212, 36, + 214, 72, 18, 42, 230, 65, 46, 209, 133, 231, 137, 101, 24, 46, 32, 48, + 122, 81, 88, 133, 97, 79, 190, 126, 13, 195, 142, 124, 181, 195, 48, 226, + 47, 239, 164, 153, 255, 152, 47, 158, 64, 255, 30, 127, 79, 249, 175, 155, + 167, 174, 207, 180, 102, 105, 191, 40, 68, 178, 44, 151, 162, 253, 25, 46, + 92, 253, 243, 16, 246, 135, 131, 226, 139, 88, 243, 62, 112, 133, 113, 244, + 171, 141, 146, 164, 21, 229, 157, 54, 172, 229, 37, 90, 169, 30, 30, 14, + 196, 53, 97, 73, 204, 98, 229, 84, 59, 33, 174, 172, 209, 206, 73, 74, + 207, 221, 136, 166, 46, 242, 192, 176, 222, 180, 109, 80, 96, 224, 105, 214, + 93, 178, 77, 18, 168, 198, 53, 41, 103, 139, 216, 229, 241, 238, 24, 33, + 151, 50, 155, 196, 119, 34, 144, 205, 211, 226, 238, 87, 88, 33, 149, 7, + 102, 191, 16, 60, 93, 119, 104, 171, 229, 175, 154, 78, 46, 83, 236, 77, + 206, 42, 19, 85, 167, 67, 6, 225, 219, 245, 232, 119, 201, 156, 224, 147, + 115, 152, 122, 16, 175, 242, 241, 22, 118, 211, 39, 32, 150, 144, 75, 123, + 210, 47, 83, 25, 156, 234, 63, 78, 173, 220, 120, 35, 209, 147, 233, 248, + 186, 63, 139, 180, 182, 158, 220, 228, 61, 86, 109, 196, 46, 180, 162, 118, + 191, 175, 215, 117, 145, 187, 115, 172, 214, 227, 54, 183, 151, 209, 142, 243, + 66, 26, 250, 156, 38, 114, 214, 51, 204, 99, 58, 54, 38, 135, 220, 242, + 13, 159, 94, 177, 45, 97, 133, 22, 191, 240, 27, 167, 119, 101, 218, 144, + 238, 206, 124, 143, 54, 39, 218, 162, 138, 121, 107, 43, 211, 249, 121, 61, + 35, 83, 139, 50, 41, 211, 103, 198, 129, 78, 49, 14, 199, 251, 177, 248, + 25, 93, 144, 62, 103, 161, 61, 230, 80, 142, 51, 240, 183, 191, 5, 66, + 227, 227, 155, 48, 132, 74, 86, 68, 155, 176, 75, 71, 8, 253, 208, 60, + 31, 239, 233, 125, 226, 113, 232, 15, 237, 235, 48, 170, 65, 219, 52, 49, + 51, 90, 10, 54, 188, 195, 179, 50, 3, 59, 253, 168, 89, 219, 185, 134, + 230, 83, 43, 29, 104, 247, 18, 47, 162, 232, 181, 55, 246, 248, 250, 23, + 138, 142, 92, 170, 145, 47, 214, 23, 253, 136, 22, 16, 215, 200, 108, 170, + 111, 15, 100, 87, 164, 176, 111, 43, 143, 241, 115, 202, 205, 115, 188, 153, + 100, 92, 231, 122, 231, 135, 76, 23, 48, 186, 144, 181, 134, 225, 225, 81, + 18, 225, 35, 226, 168, 150, 68, 4, 136, 240, 189, 231, 73, 76, 77, 98, + 140, 60, 117, 196, 52, 252, 36, 162, 33, 89, 188, 152, 201, 133, 49, 184, + 94, 107, 116, 139, 219, 208, 166, 122, 59, 137, 59, 184, 22, 118, 97, 176, + 41, 179, 233, 188, 155, 50, 14, 55, 195, 161, 30, 175, 210, 102, 234, 110, + 70, 215, 144, 183, 225, 237, 158, 168, 122, 52, 38, 138, 62, 147, 11, 153, + 125, 194, 92, 182, 252, 195, 249, 103, 221, 193, 64, 46, 178, 176, 65, 78, + 105, 98, 64, 25, 150, 206, 249, 172, 167, 0, 43, 105, 227, 217, 86, 53, + 198, 147, 92, 37, 10, 192, 229, 23, 248, 26, 228, 155, 244, 39, 93, 166, + 102, 132, 226, 123, 30, 159, 74, 103, 253, 60, 143, 150, 198, 1, 191, 127, + 217, 229, 98, 192, 179, 224, 149, 27, 248, 19, 53, 134, 194, 150, 32, 206, + 151, 177, 4, 125, 67, 148, 167, 196, 118, 132, 191, 197, 115, 170, 205, 75, + 142, 184, 212, 80, 175, 53, 184, 201, 156, 106, 128, 156, 13, 48, 210, 124, + 147, 158, 78, 250, 75, 216, 224, 32, 60, 13, 250, 195, 190, 194, 39, 202, + 87, 110, 6, 227, 214, 140, 225, 70, 16, 199, 129, 192, 171, 63, 47, 242, + 213, 94, 24, 210, 247, 113, 138, 247, 137, 154, 66, 160, 147, 187, 117, 10, + 139, 80, 52, 19, 148, 132, 71, 143, 175, 202, 123, 188, 87, 203, 9, 69, + 23, 238, 143, 24, 132, 109, 226, 79, 180, 223, 147, 91, 242, 166, 186, 38, + 207, 13, 198, 139, 238, 180, 77, 252, 89, 225, 50, 159, 91, 47, 233, 108, + 138, 105, 104, 198, 58, 65, 30, 39, 175, 52, 212, 201, 245, 216, 137, 189, + 117, 156, 200, 6, 87, 29, 35, 6, 227, 241, 39, 32, 237, 19, 205, 206, + 75, 200, 214, 100, 140, 83, 213, 197, 224, 158, 110, 114, 187, 167, 73, 43, + 242, 227, 215, 118, 184, 189, 130, 86, 178, 85, 72, 142, 152, 151, 121, 44, + 41, 132, 35, 145, 74, 94, 229, 89, 129, 43, 206, 146, 175, 166, 115, 80, + 152, 55, 125, 72, 77, 80, 35, 29, 204, 26, 28, 166, 67, 41, 194, 120, + 199, 17, 152, 139, 82, 221, 147, 255, 254, 158, 183, 108, 88, 187, 54, 174, + 220, 109, 58, 227, 86, 249, 63, 65, 135, 209, 194, 253, 200, 72, 240, 112, + 30, 112, 167, 104, 66, 32, 232, 226, 208, 236, 6, 197, 20, 216, 114, 103, + 246, 153, 96, 99, 161, 202, 217, 184, 101, 231, 159, 229, 119, 137, 105, 92, + 173, 64, 23, 42, 200, 162, 75, 245, 82, 177, 162, 111, 8, 77, 88, 210, + 54, 38, 233, 20, 79, 173, 233, 99, 187, 128, 19, 109, 195, 19, 63, 100, + 85, 103, 37, 136, 83, 251, 29, 214, 38, 217, 85, 194, 223, 5, 115, 171, + 69, 190, 117, 218, 157, 91, 162, 166, 231, 167, 121, 67, 68, 18, 110, 21, + 139, 8, 100, 103, 188, 91, 162, 76, 95, 224, 217, 228, 121, 200, 207, 83, + 41, 127, 91, 158, 176, 202, 228, 227, 248, 151, 73, 252, 127, 153, 241, 94, + 18, 255, 92, 226, 137, 27, 206, 19, 235, 107, 225, 86, 85, 53, 226, 41, + 240, 96, 167, 161, 125, 198, 133, 144, 241, 156, 203, 16, 110, 183, 247, 175, + 4, 215, 132, 165, 241, 142, 230, 147, 57, 232, 49, 201, 73, 95, 201, 199, + 20, 134, 200, 28, 145, 63, 120, 180, 16, 37, 19, 174, 81, 244, 80, 4, + 183, 102, 11, 15, 17, 28, 11, 68, 41, 180, 179, 232, 206, 41, 210, 96, + 64, 224, 174, 207, 157, 147, 208, 112, 124, 103, 132, 90, 209, 141, 17, 234, + 244, 239, 150, 70, 240, 102, 96, 102, 29, 78, 110, 17, 82, 149, 14, 253, + 84, 90, 144, 10, 213, 83, 161, 95, 38, 169, 90, 234, 102, 232, 211, 157, + 89, 231, 164, 155, 6, 180, 111, 134, 199, 183, 195, 84, 232, 54, 21, 50, + 91, 252, 215, 204, 8, 76, 135, 70, 11, 119, 227, 107, 35, 105, 49, 52, + 75, 45, 9, 239, 41, 64, 187, 183, 88, 100, 41, 58, 61, 108, 181, 199, + 59, 23, 6, 60, 232, 237, 249, 116, 202, 203, 105, 60, 164, 115, 29, 109, + 231, 223, 255, 128, 129, 126, 211, 162, 53, 51, 178, 11, 23, 173, 246, 247, + 63, 20, 119, 215, 17, 87, 40, 162, 124, 101, 13, 168, 169, 99, 139, 54, + 91, 113, 220, 81, 62, 140, 51, 208, 145, 216, 144, 245, 200, 131, 164, 180, + 42, 96, 115, 206, 147, 116, 105, 231, 248, 195, 62, 207, 41, 245, 190, 141, + 188, 219, 227, 111, 43, 169, 112, 205, 4, 143, 109, 252, 23, 221, 188, 192, + 158, 119, 15, 97, 152, 7, 175, 209, 212, 154, 72, 1, 48, 148, 43, 21, + 117, 51, 176, 133, 162, 4, 236, 207, 193, 217, 79, 82, 100, 23, 89, 170, + 46, 161, 141, 130, 45, 66, 42, 113, 121, 162, 216, 39, 49, 63, 125, 251, + 246, 205, 183, 239, 17, 171, 9, 228, 16, 40, 25, 244, 119, 46, 22, 20, + 73, 102, 169, 133, 184, 99, 224, 83, 122, 151, 79, 241, 81, 23, 111, 131, + 6, 218, 216, 9, 245, 106, 58, 142, 98, 187, 146, 221, 225, 117, 183, 3, + 249, 8, 234, 182, 113, 80, 159, 227, 156, 88, 181, 116, 91, 98, 1, 213, + 74, 140, 179, 191, 116, 71, 47, 89, 254, 192, 49, 18, 60, 165, 67, 68, + 107, 210, 148, 163, 242, 168, 131, 100, 58, 7, 211, 151, 187, 232, 117, 10, + 248, 0, 185, 87, 185, 196, 106, 1, 242, 185, 221, 193, 140, 213, 76, 32, + 38, 150, 242, 120, 127, 30, 87, 197, 5, 79, 147, 196, 243, 176, 39, 113, + 44, 16, 208, 167, 121, 84, 228, 187, 113, 166, 82, 0, 27, 0, 236, 203, + 7, 41, 56, 208, 247, 232, 3, 21, 235, 10, 149, 86, 11, 151, 0, 8, + 186, 9, 250, 102, 29, 11, 252, 94, 25, 145, 2, 151, 33, 140, 78, 138, + 178, 122, 203, 100, 85, 80, 221, 141, 161, 184, 114, 227, 60, 208, 196, 48, + 171, 114, 123, 12, 177, 22, 52, 72, 210, 132, 159, 242, 199, 197, 93, 43, + 137, 6, 97, 87, 161, 22, 246, 36, 156, 10, 140, 82, 101, 219, 199, 45, + 182, 188, 194, 50, 27, 61, 75, 193, 68, 101, 175, 138, 102, 181, 186, 53, + 74, 112, 51, 250, 64, 89, 174, 220, 157, 26, 50, 58, 210, 19, 156, 102, + 212, 144, 202, 191, 7, 5, 244, 255, 194, 214, 128, 99, 70, 148, 203, 49, + 42, 56, 15, 7, 166, 172, 115, 171, 39, 216, 189, 147, 70, 184, 191, 237, + 113, 207, 30, 208, 167, 187, 29, 240, 182, 186, 158, 30, 208, 237, 174, 155, + 56, 245, 78, 161, 210, 172, 97, 27, 116, 111, 102, 44, 177, 79, 13, 151, + 46, 49, 133, 66, 94, 60, 14, 156, 151, 83, 229, 101, 96, 188, 132, 146, + 241, 72, 21, 60, 75, 186, 79, 51, 132, 203, 156, 167, 74, 112, 174, 171, + 23, 49, 158, 22, 173, 201, 118, 165, 104, 115, 107, 158, 168, 82, 73, 250, + 137, 17, 79, 99, 113, 146, 164, 60, 8, 1, 87, 191, 13, 64, 146, 132, + 218, 212, 43, 237, 189, 171, 40, 29, 67, 53, 236, 31, 7, 251, 41, 110, + 162, 19, 7, 243, 44, 22, 198, 82, 134, 206, 101, 172, 130, 206, 138, 233, + 84, 79, 53, 171, 69, 174, 127, 119, 25, 124, 206, 164, 223, 89, 54, 143, + 159, 59, 9, 16, 123, 215, 69, 122, 85, 116, 90, 211, 135, 105, 46, 50, + 165, 73, 174, 59, 193, 158, 204, 43, 8, 137, 210, 56, 253, 61, 149, 176, + 44, 142, 184, 110, 181, 60, 104, 151, 43, 232, 236, 196, 144, 170, 100, 55, + 46, 114, 47, 109, 86, 121, 18, 210, 44, 89, 19, 105, 43, 231, 104, 11, + 91, 45, 223, 103, 58, 15, 104, 1, 199, 104, 42, 37, 181, 198, 160, 151, + 197, 34, 166, 68, 180, 139, 238, 86, 122, 42, 45, 238, 95, 197, 214, 233, + 48, 16, 160, 55, 4, 68, 241, 126, 96, 235, 79, 27, 38, 128, 103, 91, + 3, 173, 74, 94, 185, 58, 151, 121, 79, 25, 87, 82, 116, 21, 66, 152, + 206, 21, 204, 177, 122, 170, 105, 156, 138, 228, 193, 44, 102, 13, 149, 49, + 76, 217, 195, 242, 135, 209, 255, 249, 93, 151, 9, 253, 103, 118, 29, 223, + 9, 113, 255, 227, 211, 115, 119, 118, 82, 137, 74, 101, 187, 204, 31, 156, + 121, 247, 205, 186, 157, 89, 185, 111, 230, 21, 119, 251, 255, 232, 49, 239, + 158, 123, 47, 210, 105, 220, 205, 56, 89, 112, 219, 143, 102, 196, 164, 189, + 146, 90, 71, 227, 233, 176, 240, 138, 128, 120, 89, 76, 82, 127, 118, 227, + 244, 151, 175, 232, 135, 211, 79, 173, 119, 244, 249, 146, 58, 210, 25, 83, + 22, 68, 185, 82, 240, 32, 118, 157, 130, 148, 151, 175, 220, 151, 175, 138, + 197, 210, 203, 87, 216, 249, 102, 133, 119, 156, 19, 127, 95, 21, 207, 66, + 239, 5, 183, 136, 224, 207, 197, 19, 72, 82, 56, 252, 146, 195, 110, 12, + 205, 207, 197, 98, 10, 88, 247, 181, 251, 70, 0, 66, 17, 21, 139, 56, + 151, 191, 95, 25, 223, 175, 25, 120, 249, 126, 195, 223, 82, 85, 212, 109, + 77, 219, 189, 102, 167, 223, 238, 141, 103, 99, 58, 66, 20, 110, 70, 205, + 165, 59, 35, 214, 186, 59, 211, 142, 118, 220, 37, 213, 79, 127, 90, 75, + 141, 116, 100, 111, 222, 140, 228, 178, 78, 5, 163, 219, 81, 137, 75, 51, + 238, 57, 74, 123, 187, 9, 181, 223, 155, 56, 101, 136, 27, 45, 170, 53, + 142, 184, 224, 136, 214, 50, 142, 144, 151, 133, 126, 28, 198, 197, 40, 74, + 201, 75, 66, 93, 77, 49, 149, 126, 177, 157, 126, 17, 207, 249, 164, 14, + 215, 54, 96, 128, 165, 144, 237, 28, 23, 113, 142, 11, 177, 99, 146, 6, + 41, 233, 125, 12, 196, 249, 78, 220, 69, 17, 166, 75, 18, 232, 69, 50, + 66, 144, 197, 49, 130, 226, 52, 250, 36, 46, 206, 50, 186, 110, 66, 146, + 53, 156, 176, 95, 184, 154, 151, 198, 197, 11, 225, 160, 84, 203, 195, 108, + 200, 78, 147, 12, 103, 169, 134, 95, 196, 44, 133, 206, 91, 10, 3, 10, + 20, 88, 249, 146, 31, 68, 238, 66, 81, 204, 2, 237, 69, 33, 53, 4, + 105, 176, 46, 178, 192, 186, 48, 192, 186, 56, 191, 31, 172, 139, 63, 14, + 86, 26, 141, 190, 23, 51, 159, 146, 12, 170, 22, 35, 12, 70, 60, 52, + 144, 7, 65, 2, 102, 59, 171, 31, 109, 106, 24, 10, 98, 73, 166, 138, + 157, 234, 77, 81, 227, 92, 77, 255, 23, 133, 212, 116, 208, 213, 156, 218, + 170, 215, 197, 147, 164, 193, 173, 225, 74, 32, 76, 202, 81, 246, 24, 165, + 102, 244, 67, 248, 82, 251, 104, 209, 156, 157, 143, 167, 6, 69, 190, 175, + 189, 47, 35, 81, 189, 154, 75, 115, 221, 21, 107, 67, 247, 102, 126, 92, + 109, 123, 107, 185, 167, 56, 182, 237, 214, 116, 58, 94, 240, 110, 249, 206, + 115, 223, 249, 46, 91, 124, 118, 7, 221, 209, 237, 172, 231, 142, 39, 173, + 118, 127, 182, 114, 217, 26, 136, 80, 182, 120, 155, 23, 19, 33, 192, 144, + 202, 69, 201, 234, 139, 119, 22, 73, 167, 72, 254, 165, 168, 119, 30, 5, + 222, 97, 137, 190, 131, 128, 253, 157, 207, 113, 252, 221, 140, 3, 149, 176, + 137, 44, 160, 55, 2, 195, 25, 182, 83, 164, 148, 194, 138, 196, 224, 169, + 92, 28, 167, 162, 176, 1, 4, 5, 142, 147, 147, 52, 27, 19, 229, 119, + 250, 212, 45, 170, 94, 255, 163, 249, 55, 165, 205, 133, 123, 89, 44, 113, + 129, 173, 164, 138, 153, 134, 211, 187, 236, 238, 74, 84, 219, 252, 116, 86, + 227, 253, 252, 147, 171, 61, 43, 200, 134, 29, 184, 210, 232, 101, 189, 68, + 105, 193, 149, 25, 44, 7, 136, 208, 120, 114, 77, 228, 169, 61, 102, 130, + 59, 43, 61, 10, 63, 242, 64, 252, 232, 223, 135, 254, 40, 65, 127, 22, + 94, 51, 135, 36, 138, 135, 68, 177, 117, 28, 84, 231, 214, 82, 200, 235, + 84, 101, 231, 97, 29, 38, 181, 0, 57, 216, 173, 227, 62, 96, 234, 52, + 97, 238, 5, 214, 92, 46, 137, 25, 172, 40, 51, 228, 112, 233, 192, 119, + 173, 234, 13, 130, 167, 61, 35, 216, 87, 174, 140, 6, 250, 70, 157, 36, + 220, 186, 1, 47, 48, 33, 241, 51, 218, 235, 208, 210, 129, 214, 57, 149, + 33, 161, 18, 197, 184, 151, 253, 209, 141, 30, 143, 153, 26, 143, 217, 89, + 232, 227, 167, 76, 71, 137, 25, 241, 105, 239, 226, 87, 60, 12, 89, 115, + 246, 177, 230, 210, 159, 128, 254, 184, 62, 13, 194, 107, 106, 148, 91, 69, + 70, 52, 195, 217, 106, 37, 206, 67, 231, 235, 25, 224, 53, 243, 161, 33, + 48, 15, 2, 161, 235, 85, 143, 26, 12, 34, 213, 80, 212, 59, 227, 59, + 239, 9, 205, 91, 215, 254, 86, 49, 111, 239, 100, 211, 215, 8, 39, 138, + 25, 35, 179, 148, 228, 137, 187, 213, 124, 199, 179, 128, 247, 62, 250, 157, + 193, 84, 15, 205, 65, 99, 85, 190, 11, 210, 147, 193, 147, 31, 95, 126, + 130, 244, 220, 152, 197, 115, 99, 43, 198, 219, 141, 242, 119, 163, 130, 189, + 107, 90, 87, 179, 53, 131, 188, 88, 244, 145, 84, 187, 149, 197, 223, 205, + 18, 108, 101, 9, 146, 44, 47, 227, 49, 124, 199, 243, 236, 85, 18, 246, + 245, 188, 83, 97, 6, 118, 41, 83, 7, 163, 226, 185, 60, 86, 47, 89, + 86, 246, 138, 255, 190, 198, 125, 186, 100, 107, 45, 213, 96, 46, 208, 84, + 69, 244, 66, 179, 51, 175, 50, 234, 244, 57, 27, 207, 34, 92, 201, 75, + 182, 184, 206, 94, 186, 206, 140, 204, 23, 177, 180, 19, 242, 207, 203, 230, + 75, 156, 169, 94, 225, 207, 107, 204, 205, 90, 124, 148, 0, 222, 25, 2, + 154, 217, 171, 51, 110, 132, 137, 206, 202, 85, 25, 208, 38, 119, 155, 50, + 44, 207, 184, 103, 156, 97, 73, 43, 224, 187, 24, 59, 209, 120, 64, 39, + 129, 230, 133, 123, 73, 9, 84, 152, 192, 192, 94, 209, 80, 211, 150, 123, + 245, 93, 241, 60, 244, 220, 100, 88, 80, 241, 119, 120, 26, 102, 12, 119, + 25, 81, 190, 17, 229, 75, 84, 96, 68, 5, 167, 233, 179, 13, 55, 72, + 203, 30, 39, 22, 149, 69, 31, 238, 244, 252, 132, 124, 65, 159, 44, 19, + 186, 19, 255, 95, 47, 135, 94, 116, 23, 76, 111, 175, 11, 223, 42, 214, + 90, 12, 218, 209, 47, 65, 249, 44, 172, 29, 122, 252, 205, 15, 211, 218, + 243, 89, 129, 191, 65, 118, 138, 28, 31, 24, 241, 65, 28, 207, 204, 202, + 183, 220, 1, 100, 199, 228, 64, 76, 187, 84, 240, 43, 32, 10, 5, 174, + 253, 224, 208, 43, 62, 11, 42, 188, 165, 20, 32, 74, 71, 191, 33, 53, + 141, 83, 9, 179, 109, 244, 21, 14, 93, 208, 229, 54, 127, 121, 46, 199, + 202, 23, 98, 37, 213, 83, 95, 109, 124, 45, 175, 138, 68, 178, 24, 62, + 34, 114, 109, 162, 191, 65, 163, 193, 253, 197, 109, 245, 40, 166, 1, 239, + 92, 62, 198, 168, 190, 223, 97, 237, 189, 150, 99, 85, 243, 206, 79, 206, + 88, 205, 59, 172, 167, 119, 42, 64, 231, 39, 15, 57, 113, 142, 162, 50, + 46, 253, 43, 170, 104, 63, 21, 237, 235, 232, 32, 21, 29, 168, 104, 63, + 201, 237, 27, 185, 253, 32, 21, 205, 185, 251, 163, 187, 55, 221, 17, 159, + 63, 252, 131, 130, 64, 80, 82, 117, 128, 231, 67, 211, 37, 249, 65, 246, + 185, 176, 148, 72, 46, 41, 0, 82, 185, 252, 128, 118, 96, 93, 39, 186, + 167, 243, 235, 90, 183, 242, 123, 91, 249, 231, 74, 61, 178, 121, 167, 63, + 230, 152, 179, 119, 103, 190, 198, 240, 191, 230, 173, 206, 180, 15, 37, 197, + 105, 107, 160, 209, 172, 79, 139, 89, 99, 240, 70, 153, 105, 73, 167, 72, + 33, 61, 112, 127, 201, 179, 87, 225, 113, 154, 138, 73, 48, 24, 4, 53, + 41, 178, 24, 128, 223, 183, 53, 55, 183, 247, 102, 216, 136, 225, 195, 117, + 178, 25, 171, 45, 111, 64, 52, 99, 132, 100, 202, 35, 162, 104, 222, 41, + 253, 131, 230, 224, 84, 61, 79, 43, 32, 3, 21, 26, 156, 195, 17, 172, + 239, 74, 117, 20, 121, 170, 138, 2, 100, 189, 3, 122, 15, 109, 236, 188, + 179, 239, 223, 211, 185, 206, 114, 40, 192, 54, 177, 16, 154, 2, 173, 110, + 65, 109, 178, 26, 76, 17, 55, 81, 153, 132, 211, 31, 224, 239, 176, 53, + 41, 252, 221, 93, 186, 55, 163, 165, 185, 171, 46, 159, 186, 205, 167, 203, + 152, 64, 63, 93, 42, 40, 159, 46, 229, 210, 254, 239, 79, 69, 204, 243, + 148, 232, 240, 242, 41, 37, 254, 253, 233, 37, 5, 104, 128, 213, 7, 69, + 81, 149, 79, 169, 134, 191, 63, 229, 230, 38, 221, 229, 164, 160, 197, 5, + 8, 48, 9, 2, 241, 97, 241, 128, 196, 156, 5, 47, 42, 94, 213, 247, + 189, 90, 131, 88, 20, 137, 251, 88, 39, 132, 123, 213, 195, 227, 90, 16, + 248, 113, 100, 141, 14, 234, 85, 255, 40, 56, 14, 226, 40, 72, 233, 252, + 19, 143, 27, 155, 142, 127, 49, 197, 51, 205, 251, 229, 51, 148, 188, 37, + 157, 161, 24, 142, 165, 85, 6, 1, 13, 68, 44, 221, 193, 172, 245, 165, + 231, 21, 6, 173, 107, 223, 165, 63, 129, 22, 125, 168, 4, 250, 184, 13, + 166, 173, 78, 129, 126, 57, 137, 126, 75, 147, 254, 129, 127, 108, 242, 33, + 58, 51, 106, 97, 161, 161, 25, 65, 165, 240, 147, 153, 59, 216, 206, 29, + 72, 238, 96, 55, 247, 39, 218, 229, 180, 177, 194, 84, 172, 136, 79, 118, + 179, 191, 206, 204, 254, 122, 95, 246, 111, 50, 179, 127, 147, 157, 157, 176, + 64, 123, 86, 127, 68, 152, 201, 40, 102, 164, 50, 11, 185, 141, 75, 74, + 204, 64, 30, 165, 18, 86, 239, 169, 83, 167, 102, 214, 153, 61, 32, 147, + 241, 34, 104, 204, 198, 71, 25, 21, 234, 36, 170, 45, 104, 124, 60, 58, + 53, 198, 252, 181, 31, 83, 140, 212, 72, 94, 250, 116, 4, 42, 166, 114, + 6, 153, 57, 131, 221, 156, 215, 173, 233, 107, 33, 255, 70, 43, 101, 219, + 172, 74, 73, 34, 116, 196, 215, 88, 157, 213, 6, 237, 230, 52, 157, 163, + 127, 77, 103, 133, 116, 109, 31, 143, 14, 118, 98, 82, 53, 198, 157, 47, + 166, 32, 105, 249, 147, 41, 94, 63, 18, 48, 105, 8, 190, 166, 117, 177, + 213, 223, 171, 84, 193, 224, 145, 5, 131, 173, 130, 175, 185, 92, 6, 82, + 21, 40, 238, 86, 179, 219, 72, 230, 76, 25, 152, 86, 0, 185, 91, 141, + 111, 21, 87, 85, 134, 106, 11, 221, 110, 156, 226, 95, 152, 11, 190, 23, + 3, 235, 225, 74, 46, 59, 169, 53, 107, 141, 130, 237, 217, 129, 227, 241, + 118, 237, 41, 72, 84, 249, 51, 239, 69, 97, 39, 18, 59, 68, 230, 234, + 178, 118, 122, 183, 219, 147, 224, 158, 158, 4, 251, 123, 18, 100, 247, 36, + 216, 234, 73, 176, 175, 39, 65, 86, 79, 130, 253, 61, 209, 194, 168, 36, + 149, 62, 190, 211, 147, 106, 11, 6, 143, 121, 202, 52, 134, 189, 171, 157, + 226, 175, 119, 139, 235, 249, 82, 217, 137, 243, 119, 167, 213, 187, 233, 184, + 51, 111, 207, 50, 42, 240, 75, 59, 85, 238, 45, 190, 141, 122, 254, 232, + 105, 208, 118, 208, 159, 78, 222, 29, 150, 202, 78, 156, 191, 211, 113, 137, + 63, 171, 100, 146, 200, 189, 192, 148, 195, 108, 58, 205, 119, 217, 89, 37, + 206, 63, 175, 254, 202, 254, 250, 179, 6, 255, 27, 141, 131, 160, 180, 69, + 225, 82, 232, 45, 150, 34, 22, 94, 100, 180, 120, 16, 108, 147, 217, 120, + 66, 109, 175, 79, 154, 81, 229, 221, 89, 182, 69, 117, 65, 71, 51, 42, + 208, 36, 172, 188, 59, 207, 182, 42, 16, 176, 126, 152, 15, 51, 70, 54, + 93, 190, 183, 111, 82, 101, 204, 188, 237, 9, 70, 96, 238, 157, 63, 212, + 182, 76, 56, 17, 90, 111, 131, 176, 59, 185, 130, 226, 89, 248, 240, 48, + 63, 208, 36, 176, 144, 69, 100, 40, 233, 44, 115, 74, 236, 173, 124, 7, + 102, 32, 179, 156, 61, 175, 138, 187, 205, 62, 88, 85, 229, 190, 170, 118, + 39, 234, 143, 96, 129, 170, 30, 124, 144, 16, 23, 123, 84, 106, 143, 163, + 66, 86, 107, 149, 44, 78, 199, 99, 123, 183, 22, 149, 12, 234, 92, 50, + 40, 101, 148, 213, 121, 106, 1, 231, 169, 101, 229, 217, 198, 0, 215, 127, + 136, 234, 43, 92, 61, 151, 172, 103, 150, 204, 130, 236, 176, 182, 197, 22, + 240, 199, 143, 189, 238, 172, 149, 205, 179, 121, 197, 146, 5, 110, 191, 82, + 120, 116, 239, 131, 163, 6, 129, 119, 144, 149, 66, 9, 31, 211, 43, 247, + 61, 179, 166, 59, 116, 32, 94, 143, 187, 236, 142, 138, 222, 195, 243, 152, + 117, 255, 32, 92, 50, 31, 57, 60, 159, 88, 170, 44, 130, 81, 177, 27, + 30, 1, 117, 192, 0, 4, 16, 24, 221, 151, 109, 171, 254, 215, 73, 253, + 245, 70, 41, 3, 206, 116, 246, 111, 82, 224, 100, 100, 55, 226, 126, 76, + 99, 9, 211, 177, 2, 114, 104, 206, 164, 100, 240, 138, 37, 59, 133, 211, + 83, 139, 251, 179, 77, 60, 165, 51, 7, 233, 243, 69, 41, 133, 49, 140, + 16, 166, 101, 230, 134, 155, 46, 249, 58, 85, 242, 245, 158, 146, 223, 100, + 148, 252, 38, 85, 242, 27, 85, 50, 213, 223, 237, 110, 62, 6, 128, 82, + 246, 70, 243, 64, 219, 88, 248, 185, 88, 187, 116, 231, 65, 21, 52, 68, + 47, 94, 190, 129, 214, 239, 178, 63, 36, 66, 242, 242, 58, 26, 15, 230, + 179, 174, 253, 166, 123, 215, 231, 135, 96, 197, 228, 221, 104, 52, 219, 122, + 113, 149, 126, 210, 140, 138, 250, 145, 82, 80, 101, 229, 124, 196, 132, 246, + 176, 219, 105, 246, 127, 91, 54, 251, 21, 124, 253, 82, 88, 54, 127, 41, + 254, 70, 7, 250, 142, 50, 130, 247, 196, 46, 87, 170, 246, 186, 223, 222, + 224, 152, 141, 183, 225, 107, 191, 90, 63, 14, 14, 75, 136, 138, 31, 238, + 204, 205, 87, 59, 236, 11, 58, 171, 55, 202, 6, 156, 216, 196, 139, 237, + 109, 236, 248, 66, 227, 242, 240, 56, 49, 236, 143, 248, 187, 215, 137, 80, + 22, 194, 23, 163, 137, 29, 67, 129, 102, 19, 98, 112, 239, 254, 54, 122, + 89, 109, 248, 169, 54, 50, 7, 69, 183, 193, 70, 239, 238, 111, 162, 147, + 213, 68, 144, 106, 34, 211, 114, 140, 110, 2, 122, 255, 179, 41, 141, 253, + 189, 173, 68, 89, 173, 212, 82, 173, 236, 154, 85, 76, 13, 200, 178, 167, + 108, 253, 221, 236, 25, 142, 76, 92, 193, 225, 171, 217, 196, 189, 216, 162, + 54, 150, 157, 135, 90, 201, 196, 151, 231, 214, 210, 205, 220, 139, 50, 110, + 103, 25, 61, 216, 82, 38, 210, 60, 183, 174, 155, 234, 118, 250, 173, 145, + 72, 221, 51, 155, 227, 116, 185, 168, 77, 187, 147, 200, 92, 139, 102, 117, + 162, 213, 157, 179, 225, 224, 79, 27, 248, 136, 108, 195, 145, 174, 115, 46, + 214, 73, 157, 200, 89, 83, 193, 234, 134, 178, 186, 137, 155, 63, 5, 32, + 236, 92, 102, 66, 38, 6, 24, 31, 92, 101, 40, 191, 131, 3, 220, 214, + 37, 19, 7, 6, 52, 239, 107, 226, 193, 85, 134, 10, 178, 218, 240, 83, + 109, 100, 207, 27, 213, 198, 67, 171, 12, 229, 179, 154, 8, 82, 77, 100, + 79, 25, 213, 196, 125, 147, 5, 101, 179, 170, 175, 165, 170, 223, 179, 188, + 244, 72, 220, 187, 188, 184, 120, 246, 64, 4, 169, 38, 238, 69, 211, 67, + 203, 75, 106, 200, 110, 166, 150, 110, 230, 94, 92, 61, 188, 188, 84, 37, + 217, 77, 213, 211, 145, 242, 62, 205, 26, 46, 104, 43, 90, 156, 218, 195, + 30, 253, 246, 232, 23, 66, 183, 14, 253, 178, 15, 191, 109, 163, 0, 3, + 245, 210, 139, 75, 57, 126, 97, 184, 112, 23, 79, 63, 65, 14, 221, 83, + 17, 61, 183, 39, 17, 29, 21, 209, 113, 59, 18, 17, 169, 136, 200, 141, + 56, 2, 183, 84, 151, 84, 1, 21, 161, 76, 195, 232, 170, 120, 9, 139, + 75, 181, 171, 248, 97, 220, 104, 8, 43, 80, 221, 127, 85, 217, 72, 46, + 59, 199, 203, 167, 236, 1, 115, 84, 108, 46, 56, 135, 160, 159, 147, 223, + 32, 199, 174, 101, 247, 90, 15, 86, 175, 68, 148, 165, 101, 34, 38, 211, + 105, 55, 154, 140, 71, 29, 126, 81, 50, 214, 79, 167, 83, 47, 170, 241, + 34, 108, 203, 82, 51, 155, 65, 49, 140, 250, 222, 204, 216, 26, 174, 225, + 108, 87, 94, 248, 68, 174, 212, 51, 107, 205, 230, 145, 182, 106, 128, 215, + 42, 218, 138, 177, 6, 164, 48, 31, 193, 248, 62, 27, 60, 16, 27, 28, + 69, 55, 174, 94, 217, 51, 16, 59, 60, 220, 0, 21, 128, 125, 217, 145, + 13, 61, 160, 85, 108, 156, 230, 198, 30, 197, 93, 96, 136, 103, 189, 113, + 36, 79, 1, 35, 195, 219, 229, 13, 238, 93, 13, 7, 63, 133, 24, 215, + 195, 78, 190, 120, 159, 225, 99, 188, 54, 143, 65, 86, 6, 169, 139, 252, + 8, 27, 15, 217, 96, 151, 100, 212, 233, 46, 217, 6, 114, 143, 8, 149, + 25, 3, 255, 139, 169, 226, 120, 245, 198, 62, 61, 169, 231, 179, 254, 93, + 23, 245, 192, 33, 99, 170, 166, 204, 92, 13, 204, 217, 84, 245, 187, 217, + 226, 201, 52, 158, 14, 217, 34, 75, 51, 195, 132, 247, 174, 225, 227, 92, + 156, 191, 147, 179, 239, 104, 24, 212, 115, 192, 180, 21, 227, 248, 153, 50, + 99, 121, 12, 123, 32, 147, 86, 91, 204, 81, 19, 186, 38, 125, 152, 200, + 26, 116, 241, 122, 149, 102, 73, 22, 8, 137, 121, 36, 24, 251, 17, 163, + 0, 135, 141, 47, 190, 232, 159, 133, 207, 61, 183, 95, 174, 5, 46, 34, + 195, 144, 62, 158, 55, 220, 126, 177, 152, 183, 183, 141, 248, 136, 15, 10, + 182, 199, 245, 176, 33, 50, 49, 219, 117, 159, 9, 178, 207, 118, 66, 40, + 78, 36, 196, 16, 25, 125, 223, 107, 136, 44, 213, 252, 239, 245, 59, 180, + 207, 204, 152, 107, 253, 105, 78, 8, 85, 63, 246, 227, 117, 215, 74, 212, + 126, 204, 238, 53, 62, 22, 183, 242, 231, 26, 31, 75, 170, 253, 19, 93, + 16, 214, 216, 5, 225, 214, 251, 220, 163, 252, 139, 182, 242, 37, 251, 57, + 174, 8, 5, 137, 147, 86, 167, 207, 15, 176, 197, 90, 163, 171, 148, 187, + 119, 23, 163, 194, 169, 144, 178, 60, 114, 229, 237, 78, 255, 22, 14, 156, + 10, 134, 237, 118, 60, 174, 169, 80, 165, 29, 109, 81, 31, 30, 19, 170, + 86, 220, 204, 182, 61, 193, 92, 98, 251, 186, 190, 177, 148, 237, 45, 193, + 187, 88, 107, 218, 104, 35, 227, 190, 247, 209, 57, 99, 19, 247, 38, 31, + 200, 79, 53, 219, 45, 170, 118, 23, 100, 182, 93, 79, 19, 128, 173, 101, + 41, 139, 65, 176, 117, 169, 204, 213, 3, 253, 60, 98, 17, 117, 171, 176, + 96, 234, 44, 172, 44, 109, 29, 223, 255, 80, 33, 214, 11, 134, 194, 71, + 51, 134, 95, 55, 99, 190, 51, 93, 231, 157, 102, 146, 146, 223, 20, 45, + 35, 24, 170, 180, 105, 27, 5, 46, 243, 206, 215, 212, 126, 243, 245, 203, + 215, 223, 124, 217, 124, 247, 242, 199, 111, 242, 87, 79, 96, 216, 113, 2, + 83, 247, 186, 196, 86, 22, 241, 144, 250, 100, 203, 181, 3, 27, 195, 234, + 244, 167, 226, 104, 226, 155, 239, 47, 190, 60, 168, 114, 121, 248, 154, 176, + 83, 16, 24, 137, 7, 120, 203, 122, 32, 53, 18, 48, 63, 191, 249, 90, + 53, 132, 60, 9, 44, 113, 209, 116, 6, 85, 90, 188, 62, 60, 145, 230, + 209, 186, 81, 100, 67, 244, 19, 222, 59, 62, 81, 154, 93, 193, 99, 107, + 35, 81, 89, 251, 86, 47, 92, 119, 6, 141, 35, 110, 251, 195, 201, 131, + 131, 248, 237, 197, 59, 108, 221, 55, 253, 219, 249, 84, 172, 112, 253, 206, + 193, 68, 107, 153, 99, 137, 4, 12, 101, 226, 50, 193, 89, 163, 217, 160, + 249, 230, 219, 247, 95, 190, 254, 241, 251, 247, 255, 96, 15, 10, 73, 238, + 112, 55, 131, 224, 57, 46, 255, 183, 31, 190, 124, 255, 238, 253, 247, 95, + 125, 251, 221, 151, 187, 101, 205, 196, 173, 114, 64, 253, 110, 1, 142, 85, + 99, 177, 245, 174, 25, 132, 104, 253, 207, 231, 193, 63, 149, 205, 76, 132, + 15, 148, 179, 14, 99, 210, 36, 213, 57, 107, 202, 178, 121, 57, 153, 188, + 161, 133, 33, 129, 247, 227, 22, 49, 169, 183, 18, 64, 199, 228, 43, 168, + 210, 210, 131, 55, 19, 19, 150, 223, 91, 145, 124, 73, 111, 255, 48, 92, + 199, 127, 18, 88, 199, 143, 132, 170, 42, 19, 240, 119, 33, 232, 158, 178, + 143, 109, 29, 159, 149, 199, 244, 58, 206, 249, 153, 53, 31, 62, 186, 230, + 195, 184, 230, 168, 155, 42, 96, 188, 161, 223, 94, 247, 198, 50, 215, 121, + 30, 90, 245, 198, 19, 74, 94, 236, 143, 89, 223, 179, 61, 203, 123, 182, + 187, 186, 127, 188, 120, 103, 44, 178, 25, 195, 143, 184, 173, 197, 248, 227, + 151, 89, 249, 190, 204, 200, 120, 241, 142, 40, 65, 86, 149, 136, 190, 127, + 137, 35, 107, 238, 128, 254, 230, 178, 23, 184, 81, 97, 252, 105, 46, 248, + 172, 244, 3, 123, 107, 8, 18, 148, 203, 211, 175, 38, 244, 48, 135, 173, + 233, 39, 152, 61, 17, 187, 55, 224, 140, 115, 198, 184, 176, 203, 33, 100, + 179, 57, 31, 219, 220, 80, 142, 80, 50, 78, 193, 59, 213, 138, 123, 51, + 102, 183, 19, 203, 38, 125, 104, 56, 81, 199, 10, 204, 190, 231, 155, 109, + 168, 174, 245, 149, 246, 93, 95, 180, 164, 144, 4, 229, 182, 64, 140, 140, + 132, 8, 95, 246, 203, 193, 85, 241, 156, 221, 47, 27, 86, 74, 94, 20, + 148, 29, 15, 88, 239, 112, 206, 93, 54, 224, 113, 106, 113, 53, 112, 81, + 244, 130, 181, 77, 165, 2, 40, 85, 230, 171, 121, 151, 226, 93, 239, 170, + 120, 162, 163, 67, 143, 79, 197, 220, 53, 184, 36, 155, 98, 82, 77, 155, + 196, 112, 40, 227, 102, 166, 37, 145, 28, 239, 175, 185, 131, 197, 120, 250, + 233, 32, 154, 182, 121, 147, 76, 242, 30, 196, 95, 213, 118, 116, 183, 201, + 185, 96, 114, 26, 236, 51, 61, 229, 241, 185, 226, 174, 97, 188, 27, 167, + 137, 75, 239, 202, 234, 206, 167, 193, 60, 234, 132, 126, 213, 15, 96, 45, + 189, 11, 221, 65, 48, 160, 79, 18, 83, 102, 110, 215, 30, 32, 175, 138, + 240, 61, 123, 224, 156, 135, 194, 23, 37, 254, 87, 251, 81, 132, 254, 244, + 217, 14, 122, 142, 240, 131, 8, 218, 188, 163, 211, 126, 241, 132, 99, 93, + 198, 31, 162, 240, 178, 170, 47, 208, 84, 124, 54, 152, 9, 11, 22, 176, + 123, 158, 203, 139, 249, 235, 39, 231, 53, 251, 230, 178, 70, 96, 39, 118, + 82, 250, 69, 237, 9, 138, 146, 235, 218, 253, 251, 101, 189, 194, 246, 158, + 9, 206, 195, 34, 27, 79, 135, 161, 242, 53, 225, 219, 116, 13, 12, 43, + 255, 4, 52, 70, 106, 166, 220, 175, 77, 135, 22, 241, 103, 221, 166, 67, + 252, 199, 192, 179, 216, 117, 25, 127, 251, 22, 108, 93, 201, 119, 96, 137, + 201, 139, 246, 74, 194, 53, 75, 227, 89, 194, 117, 11, 182, 41, 105, 10, + 79, 90, 171, 9, 157, 26, 56, 178, 145, 100, 146, 212, 142, 196, 31, 90, + 195, 86, 95, 229, 57, 178, 104, 58, 71, 152, 252, 28, 60, 230, 129, 42, + 208, 18, 85, 48, 129, 193, 145, 209, 58, 160, 142, 116, 90, 104, 223, 29, + 142, 71, 180, 160, 232, 99, 213, 109, 77, 81, 144, 173, 18, 186, 107, 159, + 255, 42, 203, 139, 86, 87, 119, 107, 141, 218, 80, 112, 83, 246, 61, 175, + 84, 112, 214, 186, 2, 137, 112, 214, 170, 158, 13, 172, 240, 43, 67, 241, + 59, 112, 163, 150, 164, 207, 155, 178, 179, 78, 117, 121, 83, 73, 167, 151, + 142, 159, 241, 16, 82, 87, 12, 212, 109, 242, 97, 152, 167, 201, 150, 79, + 154, 160, 16, 247, 61, 85, 122, 23, 130, 221, 108, 9, 108, 106, 47, 216, + 174, 114, 11, 226, 3, 71, 205, 242, 253, 181, 175, 179, 171, 55, 74, 194, + 123, 12, 86, 81, 197, 190, 124, 154, 115, 186, 112, 5, 157, 75, 6, 43, + 71, 41, 116, 84, 75, 53, 187, 129, 83, 185, 20, 14, 114, 240, 242, 208, + 204, 104, 74, 160, 64, 9, 250, 42, 186, 66, 240, 168, 176, 154, 147, 92, + 144, 6, 79, 38, 207, 38, 87, 132, 132, 6, 17, 241, 12, 34, 226, 147, + 51, 44, 229, 211, 225, 168, 217, 26, 142, 231, 163, 89, 228, 226, 27, 140, + 89, 188, 18, 2, 153, 32, 225, 122, 21, 226, 23, 126, 144, 135, 242, 229, + 23, 43, 126, 197, 57, 63, 29, 226, 61, 107, 161, 82, 89, 157, 14, 203, + 161, 31, 20, 79, 49, 89, 86, 229, 225, 198, 138, 154, 60, 131, 104, 52, + 114, 56, 189, 18, 34, 80, 240, 25, 140, 246, 185, 255, 222, 26, 205, 33, + 78, 248, 170, 123, 61, 229, 143, 11, 60, 234, 114, 95, 78, 166, 253, 1, + 125, 175, 220, 127, 159, 143, 186, 244, 103, 176, 114, 95, 206, 111, 231, 209, + 204, 253, 161, 59, 153, 117, 249, 32, 248, 125, 123, 54, 198, 239, 91, 34, + 228, 28, 241, 166, 219, 230, 143, 28, 218, 196, 44, 85, 110, 10, 184, 61, + 118, 70, 182, 177, 100, 50, 171, 126, 134, 86, 170, 147, 9, 41, 35, 234, + 5, 138, 33, 125, 102, 243, 148, 206, 90, 175, 144, 13, 215, 4, 59, 20, + 230, 252, 82, 163, 97, 233, 209, 217, 74, 222, 26, 180, 52, 24, 213, 144, + 143, 237, 84, 196, 28, 4, 138, 85, 195, 16, 167, 232, 90, 118, 115, 24, + 205, 90, 122, 240, 92, 57, 244, 211, 44, 148, 1, 150, 54, 163, 249, 48, + 92, 211, 159, 130, 231, 164, 128, 32, 220, 188, 13, 149, 185, 157, 237, 132, + 67, 207, 115, 107, 208, 172, 174, 185, 249, 229, 153, 19, 87, 244, 226, 210, + 175, 61, 119, 253, 99, 223, 245, 143, 106, 87, 229, 194, 234, 188, 119, 16, + 188, 240, 78, 234, 94, 241, 228, 50, 8, 60, 55, 160, 82, 65, 221, 187, + 98, 227, 211, 141, 184, 22, 187, 93, 181, 217, 94, 176, 21, 245, 90, 68, + 53, 219, 253, 105, 123, 208, 181, 131, 186, 173, 12, 96, 70, 218, 0, 230, + 202, 13, 172, 233, 37, 188, 162, 92, 86, 26, 87, 90, 187, 219, 166, 168, + 90, 42, 202, 71, 84, 96, 68, 249, 146, 203, 79, 69, 249, 16, 114, 83, + 109, 21, 88, 205, 76, 174, 115, 60, 155, 77, 106, 86, 233, 175, 77, 64, + 217, 45, 221, 122, 219, 34, 176, 217, 197, 202, 85, 185, 206, 6, 179, 225, + 174, 134, 213, 203, 171, 13, 241, 133, 211, 171, 218, 236, 221, 162, 195, 90, + 247, 220, 147, 170, 93, 179, 175, 41, 154, 101, 111, 179, 170, 237, 168, 5, + 128, 165, 45, 243, 146, 138, 122, 193, 127, 163, 130, 255, 38, 244, 72, 101, + 252, 63, 160, 4, 94, 120, 154, 202, 117, 67, 140, 233, 34, 45, 231, 15, + 53, 40, 167, 230, 118, 19, 75, 154, 226, 32, 151, 147, 147, 122, 117, 229, + 126, 186, 106, 231, 45, 109, 161, 19, 218, 241, 199, 144, 171, 229, 104, 150, + 231, 40, 234, 9, 123, 7, 140, 244, 93, 241, 135, 220, 7, 236, 154, 185, + 13, 213, 242, 252, 104, 31, 160, 226, 32, 228, 142, 231, 219, 176, 181, 12, + 217, 177, 130, 231, 24, 83, 152, 166, 14, 39, 246, 71, 33, 111, 183, 89, + 137, 198, 124, 220, 77, 108, 221, 221, 134, 107, 250, 179, 147, 200, 238, 133, + 114, 47, 239, 110, 79, 12, 132, 172, 85, 17, 128, 237, 19, 46, 128, 176, + 3, 59, 151, 187, 232, 118, 140, 108, 195, 46, 101, 53, 107, 51, 115, 246, + 71, 102, 133, 10, 248, 237, 234, 90, 203, 157, 76, 184, 154, 212, 153, 114, + 130, 161, 58, 95, 162, 97, 74, 121, 158, 45, 230, 158, 77, 151, 71, 181, + 212, 52, 131, 189, 171, 74, 67, 28, 165, 180, 104, 214, 19, 166, 237, 105, + 208, 89, 218, 245, 99, 143, 153, 151, 32, 12, 27, 246, 216, 22, 121, 73, + 138, 157, 59, 232, 205, 134, 131, 131, 254, 240, 54, 225, 230, 154, 98, 166, + 90, 166, 93, 84, 157, 140, 216, 220, 56, 111, 214, 38, 25, 217, 66, 253, + 22, 117, 137, 157, 236, 140, 126, 252, 254, 199, 151, 223, 217, 219, 125, 86, + 179, 146, 166, 30, 113, 189, 82, 116, 39, 143, 209, 146, 202, 11, 123, 193, + 209, 196, 6, 224, 159, 86, 108, 8, 124, 160, 205, 216, 78, 111, 175, 195, + 245, 183, 133, 69, 5, 206, 110, 103, 227, 38, 133, 91, 54, 205, 47, 229, + 223, 9, 110, 100, 212, 236, 243, 172, 14, 39, 58, 244, 23, 166, 150, 21, + 25, 233, 117, 225, 63, 235, 56, 176, 203, 211, 234, 22, 174, 213, 123, 171, + 42, 213, 167, 177, 158, 185, 216, 171, 85, 151, 254, 159, 90, 232, 65, 13, + 67, 219, 176, 59, 196, 109, 54, 169, 33, 58, 229, 208, 10, 39, 82, 24, + 48, 36, 215, 3, 248, 68, 104, 13, 38, 189, 22, 222, 81, 202, 168, 17, + 169, 179, 244, 96, 189, 233, 70, 159, 102, 227, 201, 222, 209, 249, 101, 114, + 235, 30, 55, 100, 116, 192, 207, 221, 59, 196, 253, 54, 54, 19, 88, 42, + 165, 65, 37, 130, 237, 89, 176, 85, 237, 188, 117, 167, 244, 239, 150, 254, + 93, 211, 63, 28, 65, 157, 183, 97, 46, 176, 121, 54, 214, 2, 24, 83, + 166, 191, 57, 2, 161, 25, 208, 32, 160, 112, 206, 126, 11, 95, 46, 247, + 20, 111, 72, 113, 154, 190, 241, 63, 174, 161, 241, 232, 26, 136, 235, 231, + 42, 252, 231, 236, 3, 136, 255, 113, 21, 190, 247, 232, 58, 202, 10, 138, + 70, 3, 238, 189, 92, 85, 193, 144, 14, 221, 143, 174, 34, 0, 81, 220, + 194, 2, 81, 203, 199, 98, 193, 201, 194, 193, 163, 203, 19, 14, 156, 76, + 12, 60, 186, 134, 50, 67, 176, 219, 255, 116, 5, 154, 137, 121, 107, 151, + 249, 224, 197, 171, 166, 186, 181, 108, 176, 93, 225, 214, 154, 104, 229, 212, + 57, 223, 124, 116, 214, 183, 242, 115, 77, 63, 69, 155, 86, 72, 208, 139, + 244, 130, 180, 191, 113, 127, 8, 215, 151, 239, 221, 175, 175, 228, 30, 105, + 80, 165, 45, 162, 109, 87, 160, 57, 187, 238, 183, 158, 122, 21, 231, 155, + 141, 253, 12, 193, 218, 161, 71, 241, 190, 196, 19, 63, 248, 195, 198, 46, + 227, 25, 32, 173, 28, 251, 0, 241, 129, 221, 230, 71, 16, 54, 246, 234, + 22, 213, 194, 243, 157, 26, 83, 203, 146, 170, 207, 222, 75, 125, 54, 63, + 156, 120, 139, 3, 225, 119, 214, 140, 174, 243, 141, 177, 213, 213, 27, 207, + 196, 89, 221, 78, 241, 114, 58, 162, 161, 104, 11, 237, 248, 198, 218, 231, + 101, 172, 131, 188, 154, 211, 11, 30, 204, 3, 150, 118, 149, 40, 178, 29, + 83, 164, 70, 140, 217, 113, 245, 126, 218, 236, 172, 121, 56, 207, 55, 6, + 199, 173, 78, 211, 137, 221, 81, 92, 251, 152, 94, 176, 113, 253, 124, 59, + 24, 95, 183, 224, 231, 21, 109, 206, 216, 111, 236, 205, 142, 113, 233, 238, + 232, 174, 63, 29, 143, 96, 233, 21, 162, 13, 148, 51, 189, 49, 255, 174, + 122, 114, 86, 231, 186, 214, 177, 135, 248, 215, 161, 63, 55, 244, 111, 64, + 255, 34, 254, 19, 197, 6, 198, 223, 127, 253, 106, 87, 58, 166, 60, 94, + 83, 221, 218, 220, 57, 101, 19, 101, 156, 170, 133, 79, 150, 183, 104, 231, + 213, 52, 106, 236, 130, 233, 254, 112, 210, 222, 203, 71, 54, 248, 210, 104, + 241, 229, 239, 105, 114, 15, 8, 209, 172, 211, 28, 141, 251, 81, 166, 247, + 119, 34, 237, 240, 224, 133, 107, 127, 100, 193, 109, 254, 168, 211, 154, 118, + 236, 142, 214, 10, 188, 87, 17, 41, 174, 59, 81, 240, 27, 180, 32, 180, + 232, 183, 70, 85, 123, 175, 174, 159, 168, 169, 118, 194, 208, 127, 17, 16, + 3, 30, 20, 247, 41, 255, 41, 255, 51, 105, 99, 198, 219, 215, 191, 166, + 251, 26, 220, 159, 221, 227, 119, 234, 30, 59, 251, 232, 76, 226, 236, 198, + 231, 187, 223, 53, 188, 217, 236, 94, 248, 234, 203, 86, 74, 124, 240, 62, + 247, 115, 93, 74, 61, 120, 221, 27, 95, 231, 18, 20, 226, 43, 97, 27, + 63, 187, 215, 184, 91, 14, 126, 186, 255, 154, 211, 129, 157, 21, 110, 204, + 214, 196, 99, 10, 227, 65, 57, 97, 192, 69, 126, 9, 23, 249, 171, 170, + 56, 228, 97, 154, 166, 92, 248, 220, 20, 150, 46, 60, 150, 184, 134, 95, + 19, 246, 135, 16, 62, 167, 205, 171, 124, 231, 30, 31, 149, 239, 50, 174, + 246, 169, 122, 165, 70, 0, 165, 159, 93, 232, 147, 180, 237, 14, 48, 104, + 102, 89, 182, 23, 143, 139, 51, 136, 254, 54, 249, 34, 132, 117, 133, 62, + 196, 151, 118, 94, 57, 148, 108, 230, 155, 98, 251, 187, 207, 254, 10, 71, + 249, 23, 72, 60, 233, 231, 88, 176, 103, 205, 10, 98, 160, 204, 150, 199, + 119, 81, 20, 63, 182, 139, 88, 91, 72, 12, 92, 159, 26, 182, 140, 217, + 18, 237, 210, 165, 156, 197, 39, 97, 132, 86, 126, 185, 140, 34, 246, 134, + 104, 67, 224, 250, 100, 201, 86, 159, 39, 225, 47, 56, 208, 21, 1, 65, + 149, 129, 153, 224, 243, 36, 249, 60, 77, 62, 63, 228, 248, 187, 192, 210, + 219, 167, 158, 139, 170, 220, 101, 241, 140, 37, 183, 156, 195, 102, 163, 209, + 86, 65, 5, 226, 146, 21, 238, 28, 117, 35, 223, 146, 110, 226, 107, 100, + 124, 118, 146, 239, 40, 249, 156, 197, 159, 215, 115, 227, 123, 21, 127, 222, + 140, 167, 201, 247, 116, 60, 140, 155, 233, 39, 149, 99, 58, 197, 1, 88, + 61, 143, 3, 35, 226, 109, 147, 128, 81, 213, 248, 198, 248, 52, 190, 71, + 113, 253, 99, 179, 82, 179, 36, 77, 233, 56, 48, 33, 90, 148, 4, 140, + 4, 56, 237, 54, 2, 9, 68, 170, 82, 180, 48, 159, 196, 177, 243, 201, + 56, 201, 78, 244, 46, 254, 198, 85, 123, 190, 248, 98, 62, 153, 196, 146, + 217, 19, 195, 45, 143, 105, 126, 27, 83, 82, 235, 62, 233, 201, 236, 187, + 242, 27, 108, 147, 220, 216, 215, 192, 77, 127, 26, 197, 132, 36, 46, 47, + 122, 89, 240, 221, 136, 203, 87, 153, 238, 113, 221, 106, 178, 43, 213, 154, + 200, 46, 187, 107, 10, 4, 185, 252, 6, 75, 12, 206, 93, 50, 64, 27, + 116, 19, 35, 246, 126, 214, 6, 32, 79, 219, 183, 28, 117, 11, 88, 218, + 28, 59, 195, 49, 232, 166, 109, 213, 139, 169, 122, 117, 237, 194, 48, 109, + 140, 29, 103, 170, 68, 215, 113, 219, 174, 24, 64, 114, 85, 188, 225, 208, + 2, 209, 182, 104, 149, 73, 145, 104, 126, 45, 101, 216, 85, 19, 92, 137, + 167, 188, 18, 165, 43, 87, 240, 212, 0, 143, 190, 6, 202, 57, 181, 92, + 209, 26, 68, 161, 179, 22, 192, 63, 216, 192, 19, 29, 222, 224, 24, 209, + 136, 171, 229, 54, 21, 127, 99, 226, 245, 100, 181, 133, 89, 246, 137, 234, + 12, 34, 67, 202, 142, 11, 127, 72, 217, 63, 110, 174, 194, 240, 82, 50, + 94, 153, 78, 80, 157, 193, 212, 22, 111, 49, 168, 166, 150, 99, 49, 189, + 18, 91, 218, 43, 59, 61, 137, 88, 188, 187, 53, 178, 149, 164, 253, 221, + 2, 230, 222, 24, 83, 165, 189, 22, 255, 91, 66, 185, 42, 156, 105, 175, + 206, 151, 129, 91, 163, 202, 132, 252, 227, 182, 201, 176, 230, 190, 166, 174, + 195, 15, 115, 138, 166, 199, 107, 101, 63, 44, 35, 155, 51, 61, 30, 24, + 163, 206, 52, 48, 201, 194, 204, 6, 230, 174, 149, 193, 55, 196, 40, 137, + 250, 195, 201, 64, 26, 123, 0, 10, 87, 44, 113, 43, 45, 193, 121, 148, + 233, 137, 128, 65, 229, 22, 19, 32, 225, 16, 208, 130, 226, 155, 86, 45, + 234, 27, 166, 255, 37, 190, 149, 196, 43, 23, 2, 106, 187, 122, 209, 63, + 81, 69, 95, 38, 89, 254, 139, 200, 81, 159, 213, 146, 40, 178, 108, 163, + 248, 137, 133, 220, 60, 239, 115, 187, 45, 229, 176, 99, 175, 23, 101, 127, + 163, 253, 97, 177, 228, 49, 132, 192, 142, 138, 241, 213, 209, 10, 58, 224, + 118, 47, 92, 247, 54, 182, 225, 21, 24, 182, 252, 155, 57, 55, 215, 204, + 217, 98, 71, 162, 247, 36, 116, 122, 59, 142, 246, 208, 235, 238, 148, 61, + 215, 8, 22, 51, 149, 82, 99, 140, 106, 84, 27, 126, 108, 123, 221, 216, + 241, 88, 204, 214, 187, 202, 49, 217, 150, 147, 183, 29, 255, 49, 82, 91, + 232, 232, 198, 243, 50, 12, 12, 144, 104, 69, 129, 76, 197, 201, 155, 115, + 15, 151, 79, 62, 97, 26, 120, 9, 74, 11, 90, 250, 90, 65, 17, 158, + 7, 249, 254, 178, 159, 193, 175, 204, 250, 109, 195, 213, 92, 127, 166, 156, + 224, 81, 116, 101, 54, 110, 179, 51, 222, 105, 202, 131, 46, 49, 161, 160, + 92, 68, 185, 127, 209, 238, 121, 69, 117, 139, 178, 19, 148, 112, 26, 156, + 156, 119, 82, 53, 162, 166, 156, 105, 119, 159, 242, 178, 9, 85, 245, 193, + 238, 110, 57, 160, 147, 216, 127, 173, 124, 226, 92, 173, 32, 30, 39, 16, + 191, 81, 126, 124, 187, 196, 151, 99, 250, 178, 239, 96, 133, 251, 84, 23, + 104, 85, 128, 39, 140, 89, 125, 184, 19, 102, 197, 89, 202, 149, 223, 242, + 28, 180, 165, 8, 44, 39, 9, 179, 129, 254, 200, 212, 13, 230, 49, 123, + 36, 138, 184, 49, 0, 117, 98, 221, 133, 206, 71, 221, 185, 10, 203, 124, + 215, 77, 248, 17, 94, 155, 8, 216, 108, 172, 59, 248, 195, 208, 126, 210, + 13, 40, 78, 176, 51, 108, 114, 118, 148, 171, 218, 119, 182, 115, 23, 99, + 167, 217, 30, 204, 103, 134, 91, 146, 148, 67, 81, 109, 136, 63, 161, 17, + 156, 51, 155, 14, 188, 254, 238, 111, 63, 42, 111, 36, 124, 163, 149, 204, + 246, 244, 166, 149, 106, 83, 251, 203, 192, 117, 53, 60, 178, 95, 203, 108, + 227, 43, 125, 230, 58, 13, 82, 139, 187, 247, 3, 103, 52, 196, 221, 59, + 110, 214, 97, 227, 9, 220, 233, 91, 121, 110, 200, 236, 41, 108, 75, 70, + 208, 77, 23, 39, 93, 111, 11, 90, 23, 114, 194, 230, 118, 59, 74, 23, + 50, 186, 156, 68, 172, 11, 57, 137, 92, 75, 66, 194, 41, 191, 40, 68, + 157, 203, 73, 71, 188, 220, 49, 191, 76, 244, 71, 50, 128, 32, 21, 152, + 219, 76, 194, 69, 246, 93, 145, 132, 215, 91, 233, 155, 173, 244, 203, 173, + 244, 171, 173, 244, 15, 249, 173, 12, 112, 251, 253, 194, 35, 24, 38, 108, + 49, 95, 18, 18, 250, 150, 128, 254, 60, 9, 211, 224, 39, 52, 85, 199, + 40, 210, 186, 211, 191, 83, 219, 136, 144, 234, 184, 203, 59, 145, 172, 187, + 192, 209, 87, 252, 18, 158, 190, 161, 197, 32, 83, 197, 244, 123, 249, 72, + 79, 163, 241, 36, 83, 46, 69, 177, 70, 148, 159, 202, 199, 187, 108, 124, + 132, 203, 81, 205, 87, 202, 116, 189, 223, 219, 40, 119, 195, 88, 224, 63, + 108, 181, 249, 153, 30, 53, 51, 233, 245, 142, 219, 210, 45, 220, 37, 108, + 165, 183, 249, 125, 222, 73, 215, 237, 110, 127, 80, 192, 43, 144, 82, 253, + 160, 86, 44, 23, 0, 16, 204, 173, 93, 34, 238, 89, 237, 106, 195, 174, + 43, 105, 83, 238, 181, 34, 60, 236, 200, 191, 124, 245, 250, 205, 151, 95, + 125, 253, 205, 183, 255, 254, 31, 223, 93, 188, 253, 254, 221, 127, 190, 255, + 225, 199, 191, 253, 253, 167, 159, 255, 241, 95, 173, 235, 118, 167, 123, 115, + 219, 235, 255, 242, 105, 48, 28, 141, 39, 255, 34, 86, 125, 126, 183, 88, + 174, 126, 245, 252, 160, 86, 111, 28, 30, 29, 63, 47, 31, 228, 79, 173, + 92, 236, 236, 52, 247, 162, 128, 122, 47, 15, 3, 153, 99, 21, 154, 99, + 18, 81, 139, 23, 213, 169, 53, 198, 82, 28, 195, 144, 214, 72, 12, 43, + 240, 42, 21, 103, 3, 174, 61, 142, 206, 0, 43, 124, 78, 90, 200, 163, + 220, 79, 70, 52, 35, 191, 96, 203, 100, 35, 126, 71, 143, 104, 223, 29, + 171, 137, 202, 141, 220, 157, 159, 7, 87, 167, 82, 243, 221, 41, 87, 238, + 211, 132, 30, 65, 190, 146, 149, 191, 80, 24, 223, 125, 81, 43, 158, 157, + 213, 241, 226, 160, 64, 197, 235, 197, 173, 242, 1, 22, 196, 190, 162, 126, + 131, 202, 6, 186, 236, 33, 202, 102, 65, 245, 5, 117, 94, 106, 243, 148, + 61, 185, 71, 0, 116, 117, 106, 107, 51, 229, 156, 235, 138, 54, 230, 48, + 143, 177, 132, 197, 75, 155, 138, 133, 129, 244, 45, 216, 95, 149, 2, 112, + 7, 46, 84, 69, 112, 228, 118, 88, 153, 147, 19, 251, 123, 118, 120, 247, + 45, 24, 145, 86, 27, 207, 44, 236, 215, 178, 82, 244, 3, 166, 78, 119, + 8, 183, 56, 118, 115, 58, 31, 53, 251, 35, 56, 197, 160, 45, 178, 59, + 224, 245, 62, 26, 243, 90, 95, 209, 250, 192, 3, 17, 40, 252, 152, 110, + 251, 122, 227, 5, 92, 125, 118, 71, 115, 214, 194, 227, 37, 198, 135, 158, + 187, 126, 119, 193, 79, 71, 12, 62, 72, 53, 207, 237, 85, 45, 221, 108, + 90, 211, 155, 150, 74, 176, 81, 14, 227, 149, 134, 151, 227, 159, 133, 65, + 78, 242, 53, 149, 99, 62, 139, 182, 170, 230, 221, 204, 247, 60, 155, 214, + 79, 147, 21, 170, 136, 4, 232, 207, 182, 61, 210, 159, 35, 123, 170, 63, + 167, 138, 145, 130, 218, 161, 124, 137, 198, 82, 147, 24, 180, 41, 129, 222, + 98, 57, 161, 202, 161, 50, 32, 237, 105, 42, 135, 86, 39, 249, 48, 178, + 42, 252, 31, 22, 248, 237, 38, 247, 245, 135, 250, 17, 107, 142, 163, 95, + 57, 103, 148, 179, 43, 59, 255, 169, 50, 234, 135, 149, 76, 54, 185, 139, + 49, 117, 198, 190, 158, 207, 102, 227, 17, 151, 51, 48, 201, 181, 85, 117, + 254, 255, 232, 174, 34, 150, 157, 81, 169, 215, 63, 190, 255, 174, 252, 6, + 249, 89, 86, 71, 60, 206, 148, 193, 19, 13, 64, 22, 240, 236, 47, 247, + 58, 46, 39, 98, 234, 135, 10, 125, 249, 131, 42, 65, 235, 90, 69, 253, + 103, 92, 69, 119, 217, 159, 85, 211, 61, 123, 240, 191, 28, 95, 178, 105, + 149, 181, 28, 124, 11, 218, 183, 208, 165, 115, 115, 175, 6, 227, 235, 200, + 254, 178, 211, 167, 45, 31, 193, 49, 49, 82, 160, 239, 175, 104, 54, 69, + 20, 241, 122, 60, 26, 1, 55, 95, 141, 231, 72, 255, 170, 79, 20, 251, + 203, 155, 27, 138, 82, 33, 200, 254, 35, 254, 142, 122, 149, 47, 87, 102, + 42, 21, 233, 211, 98, 248, 170, 63, 160, 233, 8, 242, 230, 230, 126, 4, + 79, 130, 125, 233, 155, 214, 104, 252, 161, 214, 56, 162, 184, 111, 250, 209, + 108, 124, 59, 109, 13, 137, 218, 15, 199, 136, 24, 207, 111, 123, 246, 143, + 48, 176, 73, 164, 109, 72, 49, 255, 222, 90, 240, 147, 137, 46, 96, 248, + 123, 127, 138, 103, 13, 246, 119, 88, 85, 237, 214, 4, 221, 192, 118, 245, + 117, 75, 120, 210, 239, 250, 55, 136, 250, 142, 159, 129, 198, 208, 92, 80, + 238, 238, 224, 122, 58, 166, 184, 229, 100, 48, 158, 114, 93, 181, 55, 246, + 69, 119, 214, 186, 86, 189, 189, 128, 167, 164, 69, 151, 14, 233, 83, 9, + 177, 68, 243, 93, 107, 214, 163, 224, 187, 86, 155, 22, 50, 127, 208, 226, + 193, 47, 113, 184, 195, 86, 210, 4, 100, 252, 255, 57, 111, 141, 102, 253, + 95, 89, 24, 44, 245, 191, 239, 222, 168, 39, 114, 42, 60, 191, 198, 193, + 229, 123, 246, 57, 74, 81, 63, 244, 90, 180, 135, 191, 162, 97, 64, 128, + 109, 3, 38, 227, 65, 249, 127, 152, 181, 166, 196, 11, 14, 58, 232, 102, + 151, 134, 16, 249, 126, 36, 158, 251, 199, 22, 253, 27, 163, 171, 223, 178, + 171, 201, 159, 104, 119, 229, 145, 192, 210, 39, 176, 127, 234, 245, 167, 106, + 12, 241, 192, 247, 245, 124, 138, 116, 75, 237, 220, 81, 184, 108, 98, 34, + 184, 203, 230, 53, 230, 0, 126, 213, 224, 211, 103, 91, 134, 189, 78, 159, + 55, 52, 200, 234, 135, 199, 154, 191, 163, 94, 119, 197, 177, 50, 198, 244, + 213, 163, 1, 237, 227, 87, 143, 38, 190, 49, 144, 244, 251, 75, 60, 124, + 20, 24, 232, 97, 195, 55, 13, 21, 255, 208, 80, 209, 239, 48, 30, 35, + 4, 244, 184, 212, 58, 8, 37, 35, 35, 33, 246, 79, 15, 189, 89, 10, + 78, 120, 100, 248, 131, 70, 6, 191, 60, 50, 244, 241, 47, 25, 142, 46, + 46, 191, 40, 56, 141, 199, 130, 43, 157, 242, 80, 240, 39, 238, 188, 186, + 215, 130, 7, 49, 208, 136, 15, 141, 122, 206, 50, 99, 228, 227, 163, 79, + 248, 37, 30, 25, 89, 22, 64, 58, 126, 129, 108, 88, 140, 26, 142, 229, + 65, 117, 179, 205, 248, 54, 117, 69, 149, 166, 145, 10, 22, 55, 150, 166, + 253, 252, 74, 51, 92, 251, 112, 103, 239, 248, 79, 194, 192, 117, 124, 215, + 105, 182, 39, 243, 232, 156, 246, 169, 205, 163, 41, 105, 53, 204, 164, 160, + 88, 253, 187, 10, 95, 22, 152, 30, 191, 236, 156, 187, 26, 36, 27, 191, + 43, 106, 70, 41, 155, 112, 252, 202, 84, 237, 144, 59, 60, 168, 63, 203, + 115, 217, 77, 44, 19, 208, 218, 65, 234, 158, 48, 128, 111, 53, 162, 168, + 191, 90, 229, 17, 46, 75, 69, 125, 166, 28, 245, 250, 55, 112, 69, 101, + 67, 175, 10, 90, 77, 84, 13, 241, 88, 80, 133, 40, 223, 32, 254, 215, + 178, 111, 249, 90, 25, 161, 230, 206, 11, 184, 0, 198, 69, 20, 206, 219, + 190, 123, 201, 102, 89, 175, 220, 26, 84, 25, 242, 171, 131, 66, 175, 226, + 23, 89, 211, 74, 167, 112, 170, 91, 179, 76, 93, 8, 223, 205, 105, 227, + 190, 75, 151, 78, 236, 149, 37, 241, 0, 43, 21, 179, 114, 169, 142, 202, + 138, 98, 10, 203, 210, 234, 96, 209, 43, 126, 244, 170, 71, 231, 48, 75, + 146, 179, 212, 61, 42, 212, 155, 150, 227, 41, 20, 166, 172, 50, 192, 172, + 86, 45, 246, 72, 76, 59, 98, 249, 210, 119, 43, 193, 149, 85, 186, 12, + 92, 98, 211, 170, 236, 86, 79, 176, 80, 119, 235, 174, 103, 225, 230, 55, + 34, 68, 180, 38, 80, 134, 167, 217, 3, 101, 249, 26, 174, 149, 45, 185, + 149, 197, 93, 113, 235, 178, 86, 105, 224, 82, 86, 180, 124, 190, 254, 144, + 79, 118, 55, 98, 91, 2, 220, 226, 139, 0, 198, 223, 25, 123, 41, 242, + 119, 145, 80, 156, 124, 160, 109, 77, 102, 131, 91, 103, 21, 176, 99, 93, + 144, 165, 139, 250, 254, 133, 69, 134, 91, 69, 237, 7, 74, 86, 84, 81, + 154, 82, 241, 53, 242, 146, 71, 253, 186, 10, 59, 125, 246, 8, 87, 237, + 190, 85, 168, 5, 167, 52, 102, 31, 193, 111, 226, 215, 59, 245, 120, 252, + 180, 166, 73, 13, 227, 167, 43, 224, 219, 70, 140, 109, 197, 183, 203, 79, + 66, 168, 166, 37, 106, 106, 190, 21, 133, 199, 214, 148, 142, 229, 146, 153, + 7, 116, 221, 43, 247, 158, 122, 229, 160, 228, 68, 229, 195, 180, 138, 154, + 11, 165, 0, 90, 157, 48, 234, 42, 211, 206, 137, 36, 121, 141, 204, 101, + 26, 106, 20, 240, 170, 135, 70, 62, 127, 111, 62, 63, 240, 248, 95, 45, + 176, 126, 225, 97, 119, 215, 133, 197, 83, 175, 178, 40, 30, 4, 27, 206, + 90, 219, 112, 179, 21, 159, 50, 248, 152, 23, 251, 114, 248, 46, 110, 252, + 181, 222, 79, 91, 128, 243, 173, 209, 144, 249, 57, 182, 155, 236, 242, 215, + 205, 45, 209, 15, 249, 132, 77, 101, 254, 184, 70, 156, 82, 102, 130, 157, + 255, 90, 199, 134, 166, 97, 172, 228, 64, 159, 207, 104, 204, 248, 31, 238, + 127, 107, 29, 86, 244, 17, 237, 9, 22, 19, 16, 53, 138, 198, 68, 234, + 152, 22, 140, 66, 255, 208, 106, 247, 166, 227, 97, 23, 20, 246, 176, 190, + 60, 172, 19, 147, 21, 40, 101, 13, 58, 76, 241, 64, 6, 53, 15, 202, + 137, 109, 183, 82, 179, 68, 77, 226, 174, 138, 27, 60, 83, 209, 200, 25, + 209, 88, 222, 80, 84, 238, 242, 215, 82, 237, 208, 59, 232, 184, 95, 187, + 175, 174, 114, 177, 246, 81, 21, 42, 150, 135, 37, 103, 180, 177, 223, 133, + 107, 26, 179, 183, 16, 150, 195, 55, 182, 93, 200, 191, 254, 118, 120, 91, + 195, 221, 18, 92, 99, 219, 5, 231, 173, 235, 188, 67, 128, 206, 63, 53, + 215, 121, 107, 193, 29, 54, 205, 87, 138, 151, 69, 252, 98, 117, 226, 231, + 108, 184, 196, 166, 244, 53, 87, 165, 82, 112, 168, 9, 78, 150, 56, 26, + 172, 78, 86, 101, 202, 181, 186, 172, 185, 117, 94, 88, 248, 89, 81, 199, + 235, 87, 22, 173, 67, 42, 238, 137, 239, 250, 10, 208, 179, 94, 108, 160, + 146, 229, 214, 138, 180, 92, 81, 37, 65, 202, 117, 230, 185, 78, 228, 81, + 213, 62, 115, 70, 39, 94, 222, 66, 195, 239, 42, 206, 91, 201, 5, 69, + 183, 21, 228, 235, 90, 153, 169, 65, 232, 181, 153, 28, 218, 210, 201, 84, + 43, 190, 110, 69, 1, 94, 17, 253, 22, 104, 83, 248, 169, 122, 189, 106, + 208, 48, 43, 150, 79, 154, 45, 215, 173, 246, 167, 91, 94, 51, 52, 152, + 156, 180, 54, 166, 13, 235, 109, 110, 88, 253, 171, 44, 155, 32, 171, 113, + 184, 141, 100, 68, 23, 176, 148, 204, 67, 8, 155, 89, 254, 41, 17, 186, + 26, 86, 104, 213, 39, 186, 23, 224, 87, 175, 213, 100, 145, 82, 206, 83, + 63, 181, 132, 209, 194, 132, 149, 68, 212, 178, 175, 18, 109, 128, 202, 88, + 188, 174, 133, 22, 4, 199, 22, 166, 95, 2, 181, 69, 101, 42, 190, 24, + 47, 206, 93, 202, 121, 165, 18, 19, 158, 28, 205, 28, 153, 170, 68, 6, + 22, 52, 39, 117, 86, 143, 214, 213, 229, 186, 228, 206, 221, 187, 205, 85, + 5, 95, 212, 211, 13, 44, 215, 109, 172, 241, 240, 218, 165, 165, 210, 164, + 83, 82, 251, 83, 183, 227, 182, 111, 150, 244, 111, 69, 255, 126, 117, 89, + 173, 37, 244, 172, 17, 197, 141, 40, 110, 116, 243, 107, 184, 190, 188, 117, + 233, 127, 87, 27, 150, 239, 121, 225, 218, 249, 173, 82, 135, 206, 187, 53, + 92, 186, 195, 149, 59, 188, 14, 77, 156, 46, 67, 106, 109, 185, 57, 93, + 225, 119, 181, 57, 189, 92, 158, 97, 94, 156, 44, 75, 172, 183, 119, 80, + 0, 48, 27, 250, 114, 87, 146, 176, 42, 241, 182, 196, 9, 61, 78, 160, + 143, 235, 205, 21, 77, 251, 81, 71, 85, 141, 165, 221, 47, 56, 212, 160, + 51, 92, 21, 101, 63, 31, 94, 139, 183, 207, 39, 142, 209, 27, 219, 248, + 14, 145, 128, 13, 253, 50, 193, 231, 149, 85, 139, 215, 135, 8, 245, 216, + 240, 114, 245, 184, 148, 115, 126, 203, 233, 107, 104, 24, 52, 203, 57, 140, + 140, 56, 110, 60, 108, 217, 226, 17, 162, 117, 106, 241, 100, 167, 24, 54, + 161, 150, 115, 8, 133, 185, 210, 202, 46, 219, 179, 34, 253, 209, 177, 163, + 36, 246, 196, 226, 69, 129, 18, 48, 196, 133, 18, 171, 84, 9, 137, 29, + 37, 177, 39, 150, 153, 249, 215, 204, 204, 113, 108, 206, 90, 85, 137, 162, + 154, 147, 29, 212, 215, 115, 143, 249, 184, 93, 38, 74, 182, 149, 232, 99, + 143, 116, 215, 129, 87, 114, 126, 219, 216, 37, 80, 192, 157, 133, 113, 16, + 84, 106, 30, 45, 117, 236, 218, 200, 128, 105, 69, 1, 235, 23, 10, 208, + 212, 118, 27, 68, 208, 26, 188, 149, 104, 174, 6, 203, 27, 13, 98, 120, + 126, 171, 56, 60, 95, 206, 27, 162, 44, 85, 134, 53, 236, 64, 191, 180, + 225, 168, 115, 95, 146, 32, 103, 54, 102, 97, 8, 204, 185, 64, 6, 254, + 252, 106, 63, 52, 25, 231, 165, 218, 70, 215, 75, 35, 126, 78, 224, 134, + 225, 165, 158, 55, 87, 22, 79, 131, 95, 8, 228, 203, 100, 119, 184, 138, + 247, 130, 117, 60, 145, 204, 121, 20, 242, 228, 121, 65, 59, 223, 9, 209, + 30, 209, 62, 163, 38, 126, 209, 149, 220, 164, 43, 33, 86, 43, 222, 151, + 196, 85, 239, 112, 121, 238, 9, 226, 245, 94, 2, 164, 251, 85, 168, 138, + 30, 186, 235, 134, 199, 147, 196, 249, 141, 38, 179, 198, 167, 154, 222, 92, + 93, 157, 171, 61, 166, 237, 101, 77, 4, 66, 13, 199, 134, 22, 183, 231, + 121, 162, 68, 42, 0, 37, 228, 1, 173, 210, 194, 193, 17, 250, 187, 47, + 191, 250, 113, 35, 125, 162, 152, 55, 27, 27, 132, 7, 35, 133, 63, 54, + 63, 221, 203, 204, 249, 90, 114, 198, 122, 116, 120, 231, 36, 163, 249, 36, + 65, 210, 56, 11, 93, 251, 16, 104, 13, 109, 90, 102, 67, 251, 196, 190, + 163, 165, 163, 205, 52, 32, 197, 117, 244, 201, 106, 99, 107, 198, 222, 118, + 82, 44, 190, 155, 195, 21, 45, 138, 171, 107, 216, 156, 61, 31, 34, 172, + 159, 148, 15, 175, 83, 203, 221, 3, 66, 8, 188, 144, 18, 172, 69, 171, + 63, 163, 45, 90, 217, 100, 95, 151, 84, 47, 159, 80, 55, 191, 252, 225, + 181, 17, 250, 79, 120, 52, 182, 23, 202, 189, 183, 45, 247, 26, 87, 118, + 46, 103, 237, 30, 79, 160, 32, 246, 187, 100, 59, 198, 237, 210, 78, 173, + 197, 108, 145, 141, 28, 67, 165, 221, 61, 18, 155, 223, 255, 95, 166, 172, + 231, 59, 120, 80, 29, 110, 11, 124, 198, 184, 188, 101, 48, 108, 72, 113, + 102, 236, 27, 121, 212, 93, 176, 2, 197, 116, 60, 160, 125, 13, 154, 97, + 48, 31, 131, 247, 146, 17, 27, 145, 89, 210, 177, 22, 114, 17, 58, 255, + 20, 171, 233, 86, 222, 179, 160, 97, 79, 51, 169, 42, 233, 112, 219, 69, + 115, 137, 4, 231, 33, 64, 197, 136, 88, 127, 36, 98, 244, 88, 114, 212, + 131, 238, 188, 40, 50, 242, 189, 159, 74, 158, 211, 89, 119, 160, 106, 192, + 11, 92, 117, 64, 232, 60, 26, 224, 236, 230, 90, 157, 14, 80, 244, 169, + 187, 146, 110, 64, 253, 107, 48, 80, 35, 41, 55, 86, 19, 217, 171, 68, + 245, 208, 144, 105, 105, 249, 213, 123, 37, 208, 74, 80, 207, 162, 176, 20, + 42, 246, 201, 219, 126, 151, 176, 173, 211, 253, 156, 66, 10, 188, 207, 19, + 207, 185, 91, 194, 185, 68, 90, 247, 229, 219, 31, 191, 84, 85, 182, 7, + 120, 19, 13, 188, 106, 151, 224, 82, 253, 231, 138, 240, 254, 192, 127, 180, + 238, 119, 150, 40, 237, 79, 32, 69, 157, 49, 40, 81, 52, 177, 95, 168, + 43, 250, 232, 73, 88, 19, 178, 177, 76, 211, 9, 188, 58, 200, 168, 70, + 20, 79, 254, 199, 151, 251, 247, 163, 193, 74, 77, 110, 188, 88, 141, 186, + 17, 206, 179, 220, 42, 205, 212, 241, 2, 23, 173, 51, 185, 11, 227, 91, + 88, 92, 46, 63, 249, 127, 57, 2, 177, 186, 141, 8, 221, 98, 145, 254, + 119, 173, 249, 168, 221, 99, 200, 98, 169, 108, 213, 146, 76, 90, 90, 255, + 7, 165, 240, 153, 131, 131, 250, 127, 207, 160, 108, 225, 253, 223, 199, 234, + 138, 94, 180, 49, 196, 186, 19, 124, 61, 138, 129, 159, 237, 198, 32, 250, + 216, 66, 59, 95, 227, 175, 198, 243, 169, 26, 62, 62, 222, 130, 212, 68, + 90, 56, 207, 111, 220, 69, 207, 96, 208, 165, 227, 232, 79, 189, 46, 181, + 185, 24, 75, 88, 87, 163, 108, 121, 169, 1, 86, 202, 33, 179, 241, 188, + 221, 99, 251, 98, 43, 58, 101, 79, 111, 187, 162, 187, 74, 83, 68, 67, + 145, 86, 68, 232, 131, 204, 77, 198, 211, 248, 230, 84, 173, 103, 221, 129, + 60, 143, 15, 45, 244, 254, 109, 127, 4, 195, 58, 186, 150, 78, 87, 153, + 38, 187, 214, 211, 240, 235, 214, 245, 180, 79, 228, 215, 126, 221, 159, 206, + 7, 131, 62, 138, 187, 140, 158, 214, 93, 171, 63, 96, 173, 159, 214, 236, + 196, 32, 204, 132, 168, 222, 108, 54, 57, 57, 56, 184, 85, 101, 219, 82, + 180, 122, 75, 125, 155, 95, 87, 251, 227, 3, 0, 114, 128, 170, 182, 144, + 248, 151, 222, 30, 236, 253, 79, 174, 21, 162, 246, 120, 218, 133, 74, 73, + 173, 99, 55, 60, 214, 157, 247, 192, 37, 53, 101, 22, 55, 137, 164, 42, + 69, 245, 19, 102, 99, 33, 248, 136, 77, 122, 185, 245, 210, 170, 188, 116, + 89, 136, 71, 211, 188, 221, 154, 118, 192, 255, 89, 227, 155, 155, 112, 221, + 191, 212, 154, 232, 56, 78, 21, 229, 69, 134, 77, 199, 49, 135, 146, 191, + 32, 22, 121, 37, 159, 231, 231, 193, 134, 38, 255, 154, 42, 156, 159, 193, + 175, 27, 206, 229, 196, 134, 114, 91, 206, 200, 117, 136, 11, 93, 217, 151, + 235, 160, 76, 103, 123, 226, 191, 136, 59, 213, 226, 208, 67, 155, 120, 85, + 22, 220, 184, 235, 163, 227, 178, 179, 44, 249, 129, 143, 135, 226, 207, 189, + 178, 179, 210, 1, 58, 83, 156, 209, 111, 1, 194, 210, 226, 193, 33, 49, + 149, 40, 162, 24, 50, 253, 174, 161, 154, 51, 123, 61, 102, 241, 126, 13, + 207, 195, 68, 176, 41, 221, 237, 151, 252, 195, 242, 158, 62, 191, 213, 10, + 84, 0, 172, 103, 223, 133, 235, 202, 26, 45, 110, 220, 127, 163, 63, 118, + 153, 142, 44, 232, 67, 193, 225, 155, 86, 188, 224, 119, 238, 8, 11, 4, + 23, 98, 130, 34, 48, 194, 176, 32, 99, 197, 121, 91, 97, 233, 218, 176, + 10, 93, 32, 64, 80, 119, 235, 214, 181, 23, 18, 120, 174, 255, 156, 78, + 235, 71, 207, 237, 107, 63, 12, 106, 199, 110, 0, 25, 171, 127, 108, 95, + 7, 20, 60, 162, 96, 157, 15, 62, 215, 181, 48, 168, 35, 227, 17, 157, + 227, 125, 235, 186, 78, 65, 194, 109, 253, 185, 251, 156, 138, 54, 40, 116, + 72, 9, 117, 247, 121, 195, 190, 62, 228, 208, 243, 186, 219, 160, 164, 35, + 169, 198, 163, 114, 126, 221, 106, 123, 161, 239, 63, 167, 79, 72, 151, 232, + 92, 68, 109, 82, 21, 200, 78, 181, 219, 145, 23, 230, 236, 156, 213, 8, + 60, 247, 80, 189, 148, 189, 105, 67, 122, 5, 153, 51, 129, 85, 123, 142, + 39, 156, 178, 4, 33, 241, 162, 90, 142, 169, 89, 226, 182, 61, 78, 120, + 136, 4, 49, 37, 101, 194, 195, 197, 159, 179, 216, 76, 138, 199, 18, 192, + 170, 93, 15, 2, 196, 55, 60, 223, 229, 233, 227, 31, 31, 225, 125, 175, + 235, 31, 138, 132, 244, 135, 215, 223, 191, 255, 50, 231, 214, 107, 4, 56, + 165, 243, 12, 75, 16, 23, 91, 124, 8, 44, 31, 157, 198, 63, 213, 15, + 103, 125, 45, 86, 23, 206, 221, 163, 226, 134, 70, 81, 34, 219, 107, 7, + 179, 118, 99, 69, 126, 184, 14, 62, 98, 124, 69, 226, 190, 142, 144, 226, + 109, 68, 104, 216, 96, 161, 111, 234, 145, 158, 41, 108, 207, 120, 129, 11, + 97, 236, 47, 176, 239, 88, 173, 26, 103, 185, 42, 68, 184, 177, 240, 81, + 12, 82, 64, 66, 45, 239, 22, 47, 131, 138, 200, 86, 221, 6, 75, 158, + 26, 169, 238, 115, 70, 149, 229, 200, 61, 74, 163, 70, 228, 215, 156, 104, + 77, 33, 182, 171, 123, 44, 133, 148, 39, 136, 56, 64, 219, 44, 23, 133, + 59, 13, 136, 147, 107, 158, 21, 77, 166, 253, 89, 151, 166, 104, 141, 75, + 241, 82, 74, 228, 137, 44, 20, 202, 173, 255, 89, 123, 254, 207, 77, 238, + 226, 219, 215, 87, 60, 128, 57, 91, 188, 160, 55, 137, 77, 79, 222, 125, + 5, 246, 46, 141, 225, 190, 117, 198, 234, 232, 172, 203, 88, 59, 203, 146, + 5, 4, 52, 171, 183, 193, 75, 232, 193, 209, 49, 94, 176, 241, 177, 244, + 216, 227, 81, 215, 67, 218, 246, 213, 96, 49, 233, 83, 111, 131, 19, 81, + 121, 130, 123, 30, 165, 227, 180, 164, 25, 51, 141, 86, 17, 102, 218, 225, + 243, 173, 153, 166, 69, 200, 42, 207, 174, 216, 152, 145, 101, 160, 130, 15, + 136, 101, 190, 145, 240, 153, 166, 254, 82, 32, 178, 18, 134, 253, 223, 126, + 251, 165, 16, 127, 64, 60, 29, 71, 186, 158, 124, 246, 195, 208, 207, 243, + 17, 219, 115, 251, 23, 20, 240, 241, 252, 24, 15, 62, 114, 124, 145, 250, + 253, 29, 223, 129, 126, 24, 189, 30, 143, 110, 167, 173, 217, 124, 32, 15, + 92, 158, 216, 255, 24, 207, 237, 219, 241, 204, 92, 93, 51, 222, 215, 63, + 140, 108, 27, 169, 83, 155, 17, 195, 215, 9, 140, 161, 220, 247, 255, 145, + 179, 248, 6, 80, 29, 116, 251, 23, 217, 109, 189, 106, 117, 236, 193, 188, + 253, 73, 26, 33, 214, 89, 90, 193, 174, 251, 200, 250, 213, 9, 31, 180, + 25, 126, 220, 248, 190, 137, 54, 39, 58, 102, 243, 39, 223, 120, 246, 147, + 207, 187, 248, 83, 73, 27, 94, 190, 127, 255, 253, 79, 44, 68, 0, 53, + 143, 83, 79, 114, 246, 16, 90, 19, 233, 240, 157, 17, 78, 90, 243, 45, + 45, 144, 224, 202, 222, 127, 251, 245, 55, 219, 181, 193, 65, 45, 45, 92, + 219, 63, 246, 182, 43, 54, 147, 172, 116, 27, 118, 132, 231, 104, 88, 101, + 83, 136, 191, 123, 7, 53, 45, 68, 182, 35, 123, 137, 55, 138, 46, 77, + 15, 72, 109, 249, 3, 22, 99, 40, 122, 37, 252, 124, 203, 94, 237, 135, + 241, 111, 239, 246, 0, 88, 121, 190, 23, 192, 231, 159, 11, 223, 244, 78, + 193, 197, 143, 39, 1, 37, 195, 248, 104, 32, 223, 124, 255, 211, 219, 61, + 96, 238, 135, 178, 242, 7, 192, 84, 200, 244, 31, 4, 83, 68, 117, 4, + 231, 84, 177, 6, 41, 137, 19, 147, 34, 149, 89, 164, 56, 180, 217, 199, + 224, 24, 6, 131, 130, 29, 50, 101, 149, 35, 96, 105, 165, 249, 4, 101, + 199, 129, 200, 207, 74, 127, 46, 97, 242, 65, 62, 235, 137, 138, 54, 158, + 121, 74, 228, 202, 98, 166, 139, 69, 242, 6, 229, 88, 27, 212, 241, 183, + 223, 158, 244, 135, 162, 199, 4, 94, 133, 179, 10, 187, 146, 230, 82, 180, + 100, 159, 176, 145, 60, 41, 175, 196, 247, 120, 192, 27, 238, 85, 192, 114, + 176, 111, 193, 254, 144, 200, 204, 69, 241, 139, 47, 32, 149, 250, 180, 177, + 14, 170, 118, 195, 254, 149, 239, 33, 236, 85, 204, 130, 241, 126, 37, 178, + 221, 212, 85, 154, 65, 147, 203, 201, 232, 81, 214, 132, 116, 103, 144, 106, + 147, 51, 83, 27, 29, 40, 130, 38, 160, 44, 101, 59, 183, 59, 138, 105, + 181, 216, 33, 206, 35, 249, 51, 205, 153, 89, 75, 176, 166, 206, 249, 149, + 98, 65, 11, 28, 208, 28, 216, 72, 37, 18, 143, 38, 82, 253, 229, 185, + 167, 228, 145, 30, 36, 254, 203, 10, 49, 31, 171, 226, 38, 12, 157, 145, + 112, 168, 158, 98, 80, 57, 176, 118, 70, 208, 181, 95, 35, 223, 134, 99, + 171, 213, 56, 135, 185, 9, 170, 62, 148, 193, 62, 20, 80, 168, 40, 70, + 126, 160, 154, 207, 55, 38, 206, 57, 186, 206, 40, 80, 57, 29, 41, 194, + 154, 145, 23, 103, 158, 177, 175, 136, 117, 32, 179, 175, 122, 48, 119, 54, + 78, 73, 169, 93, 217, 198, 152, 196, 67, 178, 51, 114, 187, 67, 116, 89, + 169, 113, 147, 127, 25, 183, 43, 55, 232, 101, 213, 89, 158, 82, 181, 26, + 239, 204, 105, 243, 8, 178, 149, 123, 241, 73, 192, 74, 205, 50, 99, 154, + 149, 183, 58, 1, 153, 121, 21, 187, 52, 177, 171, 235, 99, 175, 194, 111, + 178, 33, 119, 7, 159, 71, 131, 123, 118, 112, 88, 220, 184, 48, 224, 2, + 97, 118, 140, 100, 187, 2, 169, 120, 213, 94, 251, 116, 130, 224, 53, 154, + 154, 166, 140, 25, 230, 136, 196, 44, 28, 71, 246, 83, 100, 34, 205, 211, + 100, 48, 63, 82, 242, 115, 5, 196, 180, 55, 238, 84, 229, 238, 80, 34, + 45, 190, 96, 101, 161, 44, 249, 5, 39, 216, 93, 214, 92, 130, 8, 67, + 194, 127, 161, 12, 227, 149, 209, 224, 3, 178, 140, 253, 154, 128, 90, 202, + 32, 120, 61, 128, 176, 225, 64, 196, 180, 210, 161, 255, 133, 218, 128, 153, + 199, 120, 187, 224, 157, 122, 31, 189, 83, 63, 56, 166, 191, 90, 225, 166, + 78, 167, 48, 252, 19, 149, 141, 27, 126, 81, 64, 7, 13, 77, 170, 245, + 125, 153, 175, 47, 149, 113, 61, 97, 175, 111, 194, 222, 25, 188, 54, 210, + 84, 187, 219, 188, 240, 171, 141, 19, 255, 148, 47, 124, 74, 225, 141, 44, + 149, 109, 30, 63, 165, 133, 104, 209, 32, 64, 47, 187, 2, 117, 35, 16, + 91, 190, 126, 45, 17, 249, 92, 108, 14, 248, 174, 117, 99, 173, 56, 118, + 197, 177, 61, 142, 237, 81, 236, 117, 200, 23, 173, 54, 30, 142, 118, 163, + 25, 106, 184, 153, 224, 1, 95, 133, 126, 180, 189, 60, 223, 162, 50, 241, + 61, 121, 16, 147, 245, 167, 68, 245, 194, 181, 239, 66, 251, 160, 68, 71, + 125, 232, 30, 240, 149, 22, 212, 13, 40, 212, 184, 42, 57, 191, 149, 112, + 93, 85, 100, 82, 59, 232, 79, 162, 46, 150, 179, 251, 111, 132, 32, 162, + 213, 83, 252, 31, 184, 66, 212, 97, 229, 104, 99, 117, 194, 181, 120, 30, + 34, 106, 206, 249, 54, 197, 143, 32, 105, 43, 14, 249, 8, 169, 171, 223, + 206, 153, 51, 141, 193, 166, 13, 138, 150, 177, 168, 74, 177, 110, 138, 186, + 1, 15, 132, 224, 193, 206, 82, 195, 42, 195, 102, 58, 209, 185, 243, 16, + 86, 166, 236, 51, 236, 19, 117, 15, 215, 239, 66, 95, 203, 37, 181, 147, + 131, 38, 166, 77, 192, 248, 213, 195, 216, 26, 149, 93, 54, 182, 70, 135, + 208, 116, 142, 83, 93, 149, 63, 115, 54, 254, 208, 161, 112, 221, 171, 4, + 207, 55, 208, 1, 11, 160, 152, 96, 243, 53, 221, 189, 215, 115, 52, 161, + 214, 65, 73, 176, 252, 192, 253, 28, 178, 170, 140, 138, 121, 231, 221, 168, + 60, 27, 99, 63, 140, 21, 125, 211, 138, 170, 71, 108, 55, 200, 173, 53, + 224, 243, 130, 77, 148, 40, 61, 49, 11, 192, 231, 74, 246, 206, 141, 10, + 222, 132, 243, 109, 15, 11, 8, 88, 168, 168, 23, 248, 135, 81, 201, 222, + 189, 19, 73, 12, 108, 34, 159, 202, 118, 209, 239, 116, 136, 184, 102, 231, + 195, 165, 136, 89, 39, 223, 127, 208, 242, 149, 165, 251, 159, 240, 208, 240, + 159, 115, 94, 175, 72, 101, 249, 184, 136, 43, 176, 246, 249, 237, 6, 84, + 196, 90, 252, 232, 66, 168, 39, 205, 7, 62, 244, 180, 97, 89, 117, 164, + 12, 62, 12, 86, 52, 38, 212, 225, 99, 79, 107, 104, 161, 223, 143, 24, + 16, 90, 137, 191, 119, 72, 48, 226, 106, 183, 98, 158, 230, 204, 251, 237, + 55, 103, 69, 60, 4, 46, 184, 250, 163, 121, 87, 51, 186, 215, 95, 136, + 126, 154, 154, 203, 231, 33, 49, 63, 191, 253, 70, 20, 87, 22, 53, 133, + 229, 50, 153, 67, 84, 94, 173, 117, 157, 31, 213, 132, 152, 244, 14, 252, + 222, 168, 108, 182, 196, 172, 32, 182, 145, 24, 153, 34, 5, 230, 138, 220, + 245, 188, 192, 162, 27, 152, 174, 152, 23, 42, 30, 223, 72, 215, 36, 228, + 185, 147, 254, 65, 160, 191, 189, 170, 231, 61, 151, 192, 97, 157, 181, 10, + 83, 223, 69, 226, 154, 63, 130, 221, 214, 20, 104, 13, 53, 48, 182, 104, + 56, 144, 190, 5, 91, 125, 163, 99, 4, 65, 22, 17, 131, 78, 219, 183, + 142, 191, 226, 231, 182, 188, 181, 38, 132, 200, 54, 106, 169, 91, 159, 216, + 8, 10, 250, 144, 208, 186, 207, 223, 185, 147, 61, 89, 41, 238, 102, 110, + 203, 90, 163, 155, 117, 105, 69, 195, 221, 74, 138, 252, 165, 27, 116, 170, + 233, 71, 92, 55, 220, 35, 213, 254, 95, 184, 229, 178, 204, 179, 22, 136, + 204, 83, 148, 181, 88, 87, 235, 185, 13, 5, 178, 128, 150, 218, 219, 208, + 15, 18, 35, 71, 22, 208, 136, 165, 169, 165, 226, 181, 192, 61, 198, 102, + 228, 210, 6, 247, 254, 235, 87, 27, 107, 6, 203, 173, 88, 13, 180, 22, + 236, 37, 2, 30, 52, 104, 61, 232, 188, 34, 170, 39, 233, 126, 131, 213, + 94, 40, 226, 142, 51, 41, 185, 121, 131, 207, 192, 197, 18, 101, 112, 143, + 139, 27, 225, 64, 135, 119, 44, 68, 127, 2, 86, 150, 54, 246, 133, 222, + 216, 231, 89, 27, 251, 206, 182, 158, 126, 77, 0, 45, 50, 175, 122, 164, + 52, 201, 160, 6, 178, 216, 184, 71, 162, 108, 3, 123, 177, 214, 165, 243, + 246, 202, 236, 239, 130, 237, 208, 46, 54, 246, 117, 143, 191, 122, 188, 241, + 59, 107, 234, 199, 166, 4, 143, 13, 172, 113, 178, 134, 85, 36, 56, 36, + 63, 36, 100, 84, 156, 235, 30, 116, 194, 58, 56, 151, 99, 185, 129, 72, + 209, 62, 92, 113, 86, 56, 172, 121, 84, 85, 133, 14, 66, 246, 245, 2, + 231, 33, 155, 178, 137, 9, 63, 168, 175, 85, 10, 78, 231, 128, 202, 243, + 182, 44, 143, 196, 80, 141, 38, 109, 107, 66, 214, 166, 236, 92, 47, 14, + 130, 243, 5, 246, 118, 51, 166, 2, 40, 23, 82, 117, 143, 14, 101, 64, + 147, 211, 217, 108, 21, 172, 159, 47, 20, 206, 43, 206, 26, 31, 155, 141, + 98, 218, 227, 124, 21, 174, 238, 204, 227, 6, 184, 102, 137, 127, 160, 122, + 46, 86, 167, 190, 102, 87, 95, 158, 178, 37, 1, 202, 228, 82, 7, 89, + 29, 167, 22, 235, 118, 106, 121, 177, 96, 194, 197, 49, 102, 237, 188, 165, + 73, 67, 217, 49, 185, 18, 176, 216, 60, 16, 210, 122, 155, 10, 29, 223, + 8, 169, 149, 35, 47, 214, 111, 101, 126, 34, 57, 84, 210, 176, 0, 199, + 51, 107, 137, 143, 53, 125, 149, 52, 84, 50, 183, 202, 162, 85, 12, 238, + 162, 132, 106, 64, 110, 81, 159, 61, 236, 79, 167, 116, 136, 32, 42, 74, + 220, 202, 37, 181, 71, 71, 226, 171, 88, 76, 128, 137, 211, 171, 28, 249, + 27, 45, 100, 21, 213, 161, 132, 209, 179, 63, 143, 149, 121, 204, 182, 9, + 245, 77, 252, 246, 30, 179, 117, 138, 174, 167, 112, 73, 124, 101, 245, 57, + 170, 59, 32, 238, 105, 251, 27, 91, 55, 241, 39, 182, 132, 217, 159, 78, + 184, 230, 155, 249, 223, 236, 246, 112, 37, 127, 63, 209, 79, 47, 234, 243, + 223, 1, 255, 189, 163, 191, 131, 22, 50, 13, 104, 79, 248, 205, 94, 181, + 175, 219, 83, 142, 163, 253, 54, 121, 93, 246, 114, 50, 25, 172, 148, 239, + 56, 213, 212, 216, 240, 109, 70, 4, 230, 242, 229, 149, 122, 206, 233, 170, + 87, 160, 108, 86, 35, 121, 107, 166, 84, 27, 140, 71, 160, 51, 59, 159, + 0, 203, 228, 51, 143, 102, 249, 171, 197, 13, 50, 20, 218, 5, 100, 170, + 117, 237, 56, 104, 60, 233, 142, 148, 221, 161, 173, 150, 162, 253, 15, 251, + 13, 20, 17, 130, 242, 216, 242, 182, 176, 168, 60, 156, 248, 72, 223, 136, + 51, 16, 54, 157, 113, 245, 36, 20, 24, 69, 110, 53, 167, 17, 199, 108, + 132, 210, 112, 141, 173, 55, 169, 135, 175, 142, 151, 63, 177, 223, 142, 109, + 181, 113, 38, 247, 186, 213, 156, 122, 209, 142, 25, 240, 123, 183, 83, 121, + 135, 158, 53, 38, 55, 50, 6, 206, 11, 87, 191, 143, 135, 61, 2, 59, + 233, 176, 188, 253, 215, 189, 9, 85, 111, 76, 141, 173, 101, 187, 45, 216, + 192, 211, 217, 162, 1, 109, 179, 153, 70, 19, 205, 230, 173, 220, 89, 10, + 31, 127, 221, 127, 255, 167, 213, 245, 127, 90, 93, 255, 167, 213, 149, 249, + 95, 46, 115, 177, 250, 118, 122, 185, 134, 14, 31, 44, 102, 74, 107, 203, + 54, 172, 252, 131, 33, 200, 34, 123, 224, 21, 192, 242, 173, 111, 250, 179, + 136, 208, 221, 29, 93, 94, 125, 176, 149, 204, 196, 245, 33, 53, 161, 163, + 246, 145, 247, 44, 126, 121, 83, 179, 202, 3, 34, 176, 212, 238, 237, 24, + 175, 105, 237, 182, 29, 191, 2, 180, 131, 198, 161, 216, 78, 182, 145, 161, + 63, 186, 25, 203, 171, 133, 102, 243, 181, 23, 218, 244, 215, 231, 191, 1, + 255, 173, 241, 223, 122, 24, 27, 97, 114, 154, 220, 159, 215, 94, 209, 230, + 2, 113, 88, 109, 220, 169, 76, 126, 81, 234, 139, 195, 89, 153, 130, 162, + 52, 23, 135, 179, 50, 213, 138, 2, 77, 28, 206, 202, 84, 47, 10, 176, + 113, 24, 153, 150, 16, 33, 21, 120, 223, 168, 52, 14, 213, 59, 32, 220, + 18, 72, 236, 221, 166, 210, 227, 55, 11, 44, 139, 10, 195, 70, 252, 6, + 208, 206, 129, 119, 0, 182, 4, 99, 196, 77, 59, 203, 28, 253, 161, 211, + 254, 135, 28, 63, 222, 196, 133, 103, 147, 47, 91, 61, 24, 171, 94, 54, + 101, 115, 110, 222, 40, 227, 39, 62, 203, 151, 129, 39, 42, 38, 3, 238, + 229, 168, 138, 157, 138, 215, 206, 178, 28, 28, 123, 155, 125, 213, 251, 123, + 171, 103, 4, 199, 181, 251, 153, 181, 51, 216, 107, 103, 85, 166, 51, 198, + 38, 163, 246, 96, 95, 237, 60, 48, 113, 229, 1, 87, 94, 77, 233, 6, + 40, 216, 9, 177, 10, 118, 123, 123, 13, 84, 234, 87, 57, 117, 208, 38, + 244, 30, 254, 185, 232, 101, 163, 236, 127, 41, 126, 255, 90, 4, 103, 98, + 248, 30, 224, 239, 105, 163, 118, 223, 32, 214, 226, 38, 106, 191, 111, 16, + 27, 230, 32, 30, 253, 217, 131, 216, 248, 75, 7, 81, 79, 146, 191, 110, + 20, 255, 95, 12, 99, 230, 56, 62, 208, 198, 97, 118, 27, 245, 251, 166, + 74, 61, 110, 162, 254, 251, 166, 202, 225, 21, 107, 215, 178, 68, 13, 244, + 87, 237, 66, 90, 140, 64, 156, 76, 50, 50, 120, 176, 226, 172, 21, 185, + 198, 45, 99, 9, 54, 188, 26, 141, 103, 27, 182, 75, 218, 56, 84, 23, + 232, 141, 68, 60, 30, 245, 120, 51, 60, 39, 6, 106, 130, 67, 178, 113, + 159, 199, 103, 88, 84, 133, 135, 72, 179, 177, 97, 228, 120, 62, 180, 53, + 28, 110, 146, 193, 141, 55, 192, 230, 246, 97, 196, 98, 68, 65, 92, 115, + 205, 167, 87, 101, 16, 145, 194, 75, 246, 66, 37, 201, 14, 255, 84, 57, + 22, 22, 188, 10, 121, 137, 201, 23, 147, 123, 234, 117, 254, 191, 243, 27, + 149, 95, 27, 39, 41, 179, 229, 248, 170, 189, 133, 220, 109, 105, 13, 91, + 17, 192, 176, 113, 105, 46, 169, 123, 129, 119, 207, 99, 236, 215, 99, 108, + 215, 99, 236, 214, 99, 108, 214, 99, 218, 254, 216, 248, 8, 63, 96, 199, + 77, 166, 136, 137, 113, 222, 25, 117, 187, 29, 60, 184, 39, 246, 171, 71, + 73, 227, 56, 155, 163, 191, 136, 153, 109, 182, 103, 211, 1, 223, 229, 24, + 199, 105, 200, 139, 85, 140, 40, 207, 108, 108, 245, 6, 207, 86, 111, 240, + 18, 117, 139, 84, 43, 74, 97, 196, 81, 245, 198, 7, 243, 138, 62, 202, + 243, 237, 81, 201, 15, 104, 196, 221, 53, 95, 26, 73, 224, 145, 213, 188, + 78, 85, 115, 236, 37, 181, 224, 251, 145, 149, 188, 79, 75, 9, 178, 10, + 241, 45, 214, 23, 126, 130, 217, 181, 126, 131, 8, 43, 115, 103, 139, 3, + 92, 122, 240, 103, 80, 66, 32, 112, 107, 114, 39, 21, 151, 13, 212, 251, + 165, 37, 11, 224, 249, 115, 5, 217, 251, 178, 29, 210, 130, 162, 66, 114, + 143, 102, 175, 16, 94, 149, 122, 234, 6, 205, 46, 255, 202, 211, 125, 217, + 118, 157, 21, 253, 147, 223, 100, 45, 21, 176, 122, 176, 114, 92, 81, 114, + 56, 224, 197, 147, 10, 20, 197, 196, 239, 122, 129, 215, 93, 90, 173, 102, + 60, 197, 149, 188, 187, 178, 185, 116, 184, 254, 184, 73, 60, 199, 199, 2, + 146, 138, 47, 10, 12, 198, 124, 162, 5, 157, 194, 207, 218, 49, 131, 191, + 253, 230, 196, 179, 234, 73, 50, 173, 54, 9, 188, 204, 222, 54, 157, 245, + 24, 48, 131, 197, 229, 144, 116, 33, 79, 244, 98, 151, 52, 60, 142, 44, + 88, 101, 253, 68, 125, 139, 58, 136, 6, 159, 210, 187, 164, 248, 68, 26, + 150, 30, 103, 27, 16, 133, 186, 193, 216, 93, 141, 220, 46, 36, 25, 57, + 34, 198, 7, 33, 164, 156, 144, 147, 75, 214, 219, 48, 51, 60, 11, 172, + 69, 0, 34, 2, 219, 62, 144, 214, 109, 236, 107, 66, 89, 82, 222, 231, + 1, 94, 63, 113, 174, 55, 184, 86, 92, 59, 139, 160, 34, 113, 206, 53, + 117, 99, 161, 158, 247, 39, 109, 80, 143, 140, 64, 98, 59, 126, 105, 195, + 66, 6, 46, 30, 159, 169, 107, 96, 165, 86, 225, 169, 203, 59, 3, 76, + 161, 203, 4, 103, 116, 94, 179, 21, 37, 162, 254, 42, 209, 88, 66, 32, + 30, 119, 255, 145, 124, 255, 240, 238, 229, 235, 47, 205, 156, 56, 158, 177, + 252, 44, 214, 44, 138, 73, 169, 70, 52, 56, 118, 69, 252, 99, 228, 171, + 57, 201, 87, 52, 50, 10, 219, 7, 43, 177, 74, 110, 8, 84, 32, 81, + 178, 20, 239, 16, 230, 248, 161, 61, 95, 198, 209, 82, 83, 59, 126, 152, + 243, 89, 105, 180, 97, 198, 6, 18, 171, 82, 116, 108, 141, 106, 8, 88, + 222, 143, 127, 116, 172, 19, 238, 37, 124, 79, 39, 111, 197, 105, 132, 95, + 227, 24, 166, 66, 65, 248, 10, 14, 22, 213, 254, 29, 190, 196, 123, 83, + 104, 184, 105, 90, 45, 170, 137, 201, 0, 156, 228, 116, 42, 246, 158, 19, + 187, 192, 173, 159, 210, 4, 197, 191, 34, 194, 248, 82, 113, 113, 88, 197, + 21, 217, 239, 16, 43, 215, 96, 33, 212, 148, 176, 190, 165, 148, 128, 86, + 52, 39, 216, 252, 5, 127, 41, 255, 69, 57, 237, 207, 54, 70, 88, 123, + 184, 50, 16, 166, 81, 99, 32, 193, 79, 208, 104, 196, 6, 18, 203, 41, + 158, 247, 16, 194, 94, 175, 90, 163, 24, 99, 23, 180, 151, 141, 102, 173, + 24, 103, 255, 232, 226, 29, 208, 61, 88, 195, 177, 149, 186, 196, 254, 32, + 8, 92, 172, 235, 150, 221, 222, 198, 165, 206, 69, 57, 96, 221, 64, 231, + 218, 194, 48, 0, 102, 37, 10, 87, 89, 192, 16, 76, 22, 204, 24, 111, + 79, 124, 156, 254, 167, 97, 254, 211, 159, 138, 122, 61, 131, 141, 121, 93, + 255, 19, 6, 4, 82, 37, 197, 46, 62, 60, 56, 159, 238, 29, 157, 58, + 139, 193, 255, 250, 225, 41, 36, 195, 84, 207, 30, 166, 122, 60, 76, 181, + 120, 152, 212, 128, 213, 246, 13, 88, 47, 234, 111, 209, 22, 141, 87, 99, + 188, 12, 108, 239, 210, 22, 99, 100, 246, 45, 149, 111, 98, 2, 226, 135, + 63, 180, 102, 218, 105, 179, 30, 27, 152, 175, 27, 69, 253, 217, 234, 145, + 235, 133, 96, 62, 126, 96, 193, 32, 203, 254, 33, 209, 123, 108, 13, 92, + 205, 147, 182, 187, 132, 140, 169, 184, 19, 237, 225, 183, 77, 251, 152, 202, + 112, 95, 14, 98, 146, 139, 69, 43, 110, 86, 173, 164, 73, 119, 58, 156, + 207, 186, 58, 184, 108, 175, 126, 181, 63, 115, 69, 245, 162, 193, 255, 248, + 0, 177, 109, 179, 81, 55, 138, 30, 61, 64, 131, 135, 7, 104, 240, 63, + 51, 64, 131, 63, 127, 128, 238, 254, 199, 7, 232, 239, 173, 251, 247, 232, + 244, 224, 220, 61, 60, 56, 119, 159, 53, 56, 76, 183, 254, 140, 193, 185, + 251, 179, 7, 103, 208, 186, 222, 218, 142, 118, 89, 39, 32, 155, 183, 163, + 212, 224, 232, 97, 120, 196, 224, 108, 47, 15, 63, 124, 13, 99, 71, 173, + 202, 203, 120, 128, 84, 196, 171, 71, 140, 81, 132, 65, 210, 200, 159, 176, + 86, 26, 98, 168, 39, 208, 130, 172, 223, 55, 110, 42, 59, 178, 162, 6, + 206, 142, 178, 209, 31, 93, 104, 65, 253, 225, 209, 52, 243, 64, 100, 143, + 17, 213, 144, 252, 153, 35, 218, 238, 253, 222, 17, 221, 93, 154, 159, 59, + 162, 241, 120, 126, 243, 168, 229, 182, 111, 40, 219, 61, 172, 192, 199, 142, + 38, 229, 86, 149, 160, 132, 245, 185, 3, 234, 101, 12, 21, 97, 226, 193, + 225, 12, 50, 134, 83, 131, 242, 231, 13, 39, 107, 7, 60, 106, 64, 249, + 223, 46, 199, 248, 200, 1, 157, 199, 131, 231, 243, 129, 230, 131, 221, 78, + 143, 40, 157, 127, 182, 226, 30, 34, 164, 12, 250, 3, 148, 148, 243, 252, + 225, 125, 14, 248, 127, 104, 188, 204, 60, 122, 188, 146, 214, 255, 200, 128, + 193, 120, 117, 166, 74, 66, 250, 216, 154, 63, 177, 255, 54, 250, 52, 26, + 47, 70, 134, 65, 121, 185, 6, 100, 61, 1, 214, 27, 168, 166, 108, 19, + 112, 170, 248, 83, 106, 246, 163, 38, 14, 249, 173, 233, 12, 166, 137, 97, + 151, 216, 222, 184, 240, 250, 217, 164, 3, 251, 120, 48, 199, 126, 167, 82, + 206, 67, 234, 32, 167, 206, 7, 179, 190, 22, 141, 52, 199, 243, 217, 100, + 158, 42, 125, 57, 105, 13, 186, 179, 89, 215, 191, 74, 190, 3, 124, 223, + 78, 91, 48, 197, 233, 95, 25, 238, 167, 4, 148, 78, 162, 130, 242, 234, + 139, 159, 62, 79, 255, 132, 77, 5, 156, 123, 110, 236, 131, 198, 206, 167, + 225, 207, 43, 205, 147, 72, 221, 145, 47, 217, 222, 171, 92, 147, 39, 185, + 196, 82, 191, 82, 182, 184, 175, 189, 29, 107, 229, 6, 14, 125, 220, 44, + 111, 97, 207, 247, 130, 58, 187, 235, 162, 148, 44, 204, 121, 137, 222, 138, + 114, 114, 165, 117, 86, 60, 232, 101, 213, 228, 167, 46, 63, 13, 249, 57, + 164, 31, 109, 229, 25, 174, 237, 209, 198, 38, 12, 61, 72, 85, 157, 128, + 71, 106, 219, 186, 51, 158, 96, 115, 159, 115, 118, 68, 107, 91, 65, 76, + 1, 90, 210, 38, 92, 20, 67, 203, 153, 13, 41, 116, 114, 246, 31, 211, + 108, 209, 195, 155, 30, 221, 28, 222, 63, 63, 113, 252, 205, 38, 231, 188, + 48, 81, 61, 88, 185, 98, 226, 129, 199, 104, 62, 52, 71, 199, 9, 24, + 133, 92, 54, 40, 63, 113, 106, 240, 15, 46, 24, 164, 217, 253, 215, 170, + 170, 124, 134, 130, 202, 182, 86, 10, 76, 16, 119, 254, 108, 237, 148, 41, + 244, 57, 180, 194, 194, 207, 74, 131, 1, 222, 76, 30, 173, 180, 242, 168, + 154, 223, 73, 205, 173, 209, 106, 209, 235, 78, 187, 162, 43, 9, 109, 145, + 136, 27, 2, 137, 97, 5, 18, 94, 48, 236, 227, 47, 203, 8, 55, 149, + 165, 73, 197, 134, 49, 164, 250, 180, 250, 6, 155, 2, 137, 236, 191, 189, + 59, 192, 203, 79, 105, 241, 215, 49, 213, 202, 214, 206, 251, 163, 3, 26, + 227, 184, 94, 179, 224, 48, 93, 123, 162, 210, 241, 195, 55, 223, 126, 245, + 227, 78, 50, 26, 207, 52, 62, 194, 74, 253, 66, 12, 104, 241, 163, 233, + 174, 152, 90, 207, 210, 133, 97, 113, 164, 212, 55, 159, 116, 120, 164, 217, + 159, 201, 114, 54, 37, 190, 97, 192, 206, 17, 21, 102, 96, 81, 56, 171, + 138, 31, 95, 190, 210, 90, 198, 183, 183, 48, 18, 123, 221, 157, 45, 32, + 248, 27, 182, 166, 159, 96, 218, 128, 59, 14, 81, 110, 148, 85, 252, 213, + 203, 215, 255, 97, 64, 161, 71, 56, 113, 197, 146, 154, 0, 173, 78, 167, + 155, 9, 197, 187, 151, 95, 127, 73, 72, 79, 107, 233, 68, 10, 15, 92, + 7, 85, 182, 183, 96, 50, 84, 90, 87, 231, 49, 69, 223, 167, 251, 29, + 235, 170, 176, 127, 46, 116, 248, 127, 183, 58, 17, 84, 202, 247, 109, 46, + 127, 181, 70, 81, 206, 122, 27, 58, 79, 172, 89, 143, 48, 209, 105, 66, + 77, 44, 204, 53, 147, 77, 71, 84, 129, 124, 226, 78, 54, 57, 157, 137, + 211, 66, 190, 14, 174, 123, 162, 194, 238, 185, 31, 114, 239, 100, 63, 63, + 97, 93, 51, 243, 202, 151, 243, 95, 226, 82, 156, 191, 180, 0, 146, 153, + 71, 60, 163, 214, 76, 65, 8, 231, 236, 81, 147, 167, 75, 147, 182, 108, + 40, 52, 213, 115, 27, 253, 128, 90, 103, 179, 38, 173, 40, 114, 234, 196, + 81, 20, 242, 235, 235, 205, 238, 237, 167, 202, 168, 185, 75, 125, 13, 170, + 160, 143, 91, 139, 59, 128, 127, 169, 14, 228, 156, 116, 21, 169, 11, 108, + 149, 116, 153, 91, 59, 79, 128, 149, 184, 95, 204, 73, 37, 112, 6, 89, + 221, 105, 236, 116, 39, 144, 238, 52, 30, 217, 157, 96, 79, 119, 130, 199, + 119, 39, 248, 188, 238, 40, 214, 44, 171, 55, 135, 73, 111, 84, 46, 233, + 204, 225, 195, 157, 209, 181, 110, 245, 70, 71, 115, 103, 156, 245, 135, 156, + 161, 132, 38, 111, 146, 98, 13, 180, 134, 247, 236, 67, 110, 195, 61, 253, + 90, 74, 153, 61, 85, 21, 81, 87, 137, 131, 66, 64, 205, 194, 236, 110, + 170, 239, 208, 152, 153, 242, 84, 220, 152, 118, 177, 109, 214, 100, 232, 140, + 40, 221, 255, 196, 37, 181, 40, 216, 37, 150, 32, 141, 21, 230, 58, 230, + 74, 50, 20, 7, 248, 242, 44, 93, 133, 43, 79, 155, 31, 83, 81, 28, + 210, 32, 111, 71, 4, 113, 132, 6, 55, 105, 90, 116, 40, 42, 98, 155, + 248, 202, 106, 154, 124, 167, 5, 143, 83, 225, 122, 20, 43, 22, 152, 90, + 10, 203, 29, 253, 132, 165, 232, 190, 135, 235, 197, 70, 188, 194, 241, 36, + 225, 231, 24, 81, 24, 214, 109, 56, 189, 174, 161, 2, 60, 225, 232, 15, + 43, 253, 139, 226, 249, 97, 221, 46, 151, 170, 108, 90, 0, 239, 21, 203, + 226, 168, 158, 249, 10, 92, 19, 178, 19, 111, 121, 67, 5, 99, 247, 8, + 241, 229, 176, 186, 142, 101, 188, 73, 245, 190, 74, 229, 140, 229, 193, 124, + 216, 31, 181, 70, 237, 110, 85, 61, 171, 134, 49, 226, 254, 240, 214, 186, + 233, 244, 135, 225, 150, 142, 163, 179, 112, 157, 222, 198, 94, 16, 228, 232, + 25, 161, 15, 185, 138, 20, 211, 147, 152, 32, 142, 89, 122, 196, 81, 175, + 240, 103, 73, 4, 134, 157, 192, 173, 124, 245, 94, 76, 22, 22, 248, 251, + 138, 92, 225, 55, 213, 254, 29, 6, 241, 38, 24, 62, 183, 151, 147, 22, + 231, 88, 169, 95, 237, 57, 79, 102, 162, 86, 44, 109, 166, 163, 13, 37, + 196, 219, 121, 191, 169, 182, 244, 38, 111, 233, 81, 241, 60, 60, 180, 178, + 83, 196, 139, 31, 30, 158, 31, 170, 75, 121, 101, 255, 93, 227, 68, 242, + 241, 64, 5, 231, 30, 191, 160, 88, 156, 59, 61, 187, 12, 7, 224, 151, + 132, 49, 90, 126, 108, 199, 136, 112, 176, 40, 110, 220, 64, 198, 6, 201, + 171, 173, 228, 30, 39, 223, 244, 37, 135, 36, 154, 186, 229, 216, 50, 49, + 29, 38, 132, 231, 201, 120, 70, 157, 236, 183, 6, 120, 229, 51, 233, 153, + 17, 189, 141, 178, 227, 35, 253, 77, 225, 161, 24, 171, 83, 44, 55, 103, + 94, 28, 88, 81, 64, 63, 182, 240, 164, 121, 14, 137, 94, 166, 169, 64, + 98, 235, 167, 194, 99, 252, 86, 198, 27, 235, 209, 186, 40, 137, 225, 15, + 100, 101, 150, 50, 157, 151, 163, 140, 204, 204, 111, 142, 113, 16, 198, 187, + 73, 245, 28, 114, 117, 230, 109, 0, 148, 179, 244, 96, 117, 172, 224, 44, + 253, 10, 190, 253, 226, 129, 179, 88, 136, 105, 179, 21, 219, 32, 43, 56, + 43, 74, 90, 169, 36, 194, 202, 152, 38, 40, 229, 177, 199, 52, 45, 41, + 194, 30, 211, 100, 164, 162, 246, 152, 230, 35, 229, 163, 48, 237, 164, 75, + 159, 194, 244, 187, 242, 99, 93, 25, 107, 132, 153, 93, 114, 59, 27, 123, + 132, 25, 93, 114, 187, 27, 123, 24, 202, 184, 81, 154, 75, 127, 104, 236, + 172, 54, 129, 85, 16, 184, 124, 214, 94, 109, 195, 200, 133, 64, 35, 17, + 29, 0, 78, 37, 118, 193, 238, 172, 56, 165, 183, 11, 245, 18, 166, 141, + 219, 203, 138, 211, 89, 162, 10, 44, 27, 10, 150, 37, 104, 173, 56, 117, + 69, 169, 43, 214, 151, 229, 212, 85, 89, 130, 22, 58, 76, 205, 97, 29, + 162, 242, 253, 90, 62, 210, 69, 126, 192, 4, 13, 92, 154, 170, 139, 146, + 95, 13, 26, 69, 213, 101, 149, 114, 135, 148, 158, 78, 201, 64, 1, 63, + 81, 13, 85, 163, 212, 248, 144, 73, 128, 211, 43, 57, 67, 234, 141, 122, + 27, 134, 166, 156, 5, 71, 245, 152, 70, 56, 195, 228, 149, 103, 134, 238, + 144, 0, 71, 32, 29, 160, 97, 5, 17, 193, 33, 65, 180, 153, 6, 131, + 86, 115, 221, 222, 234, 250, 254, 6, 222, 111, 254, 32, 77, 179, 210, 52, + 205, 137, 137, 154, 195, 84, 141, 91, 45, 196, 134, 108, 180, 237, 228, 51, + 175, 24, 79, 124, 195, 118, 82, 71, 230, 16, 79, 14, 182, 152, 183, 244, + 240, 120, 109, 73, 85, 243, 239, 190, 234, 206, 183, 171, 83, 214, 147, 50, + 234, 43, 171, 250, 202, 91, 245, 37, 88, 49, 170, 43, 24, 150, 142, 140, + 93, 27, 121, 139, 86, 71, 230, 55, 207, 87, 174, 124, 197, 192, 174, 168, + 247, 252, 187, 167, 242, 179, 157, 202, 217, 66, 209, 99, 170, 47, 171, 234, + 203, 73, 245, 0, 86, 85, 183, 51, 182, 26, 242, 162, 60, 190, 102, 44, + 156, 251, 135, 90, 177, 139, 107, 62, 135, 75, 135, 37, 63, 230, 52, 180, + 190, 158, 24, 165, 97, 68, 198, 88, 215, 88, 233, 43, 201, 191, 218, 147, + 127, 229, 26, 203, 190, 24, 175, 225, 50, 106, 169, 208, 71, 177, 4, 107, + 139, 232, 144, 44, 87, 228, 166, 248, 149, 138, 183, 244, 34, 151, 145, 51, + 242, 251, 113, 126, 223, 204, 31, 79, 238, 241, 217, 253, 184, 96, 68, 23, + 173, 95, 111, 224, 134, 103, 42, 79, 56, 211, 180, 200, 77, 17, 32, 189, + 166, 85, 129, 51, 191, 90, 187, 15, 89, 92, 253, 103, 161, 75, 149, 120, + 16, 97, 7, 123, 16, 118, 176, 7, 97, 7, 123, 16, 166, 242, 51, 33, + 86, 157, 250, 24, 16, 209, 93, 84, 184, 37, 69, 184, 153, 26, 155, 201, + 189, 10, 55, 40, 100, 220, 218, 90, 67, 25, 243, 18, 86, 129, 120, 229, + 237, 214, 251, 185, 149, 153, 239, 223, 141, 37, 162, 55, 71, 30, 30, 226, + 132, 150, 122, 59, 71, 0, 111, 119, 17, 71, 219, 25, 126, 87, 180, 157, + 9, 219, 2, 160, 228, 21, 52, 151, 33, 192, 138, 2, 85, 18, 73, 123, + 201, 170, 152, 208, 9, 13, 78, 12, 158, 9, 22, 132, 87, 104, 134, 184, + 48, 110, 166, 162, 77, 122, 17, 177, 126, 18, 58, 180, 225, 170, 93, 123, + 209, 227, 96, 79, 5, 105, 231, 125, 130, 173, 87, 7, 87, 8, 174, 226, + 224, 210, 71, 170, 31, 167, 34, 184, 98, 67, 140, 120, 154, 3, 206, 144, + 25, 163, 183, 224, 122, 192, 125, 17, 15, 148, 240, 59, 58, 139, 98, 117, + 40, 226, 139, 90, 76, 26, 127, 78, 184, 13, 162, 10, 217, 186, 158, 58, + 246, 204, 89, 232, 216, 51, 71, 52, 10, 19, 14, 149, 186, 170, 18, 223, + 194, 156, 194, 41, 225, 12, 172, 162, 243, 150, 56, 184, 74, 213, 190, 20, + 192, 216, 106, 8, 47, 50, 7, 155, 19, 237, 77, 7, 28, 144, 5, 231, + 106, 218, 182, 177, 163, 127, 81, 225, 8, 15, 119, 99, 179, 34, 29, 218, + 212, 104, 217, 12, 55, 118, 210, 42, 175, 34, 36, 156, 7, 13, 24, 55, + 89, 98, 67, 82, 102, 38, 246, 48, 124, 214, 22, 123, 156, 104, 140, 166, + 58, 164, 237, 75, 92, 127, 161, 251, 101, 50, 224, 86, 153, 74, 207, 135, + 163, 40, 238, 87, 82, 146, 216, 38, 88, 238, 242, 174, 136, 39, 196, 58, + 191, 164, 115, 38, 108, 105, 209, 212, 195, 95, 118, 98, 96, 255, 18, 23, + 172, 186, 70, 81, 128, 78, 163, 202, 35, 170, 55, 139, 107, 232, 224, 198, + 195, 85, 204, 130, 6, 128, 190, 61, 247, 161, 127, 169, 171, 93, 39, 181, + 178, 203, 109, 152, 144, 219, 223, 168, 61, 53, 10, 138, 79, 25, 237, 240, + 74, 29, 128, 8, 42, 157, 67, 252, 0, 73, 200, 214, 246, 60, 248, 188, + 165, 0, 55, 86, 168, 175, 38, 3, 252, 54, 225, 189, 147, 140, 129, 189, + 226, 145, 173, 210, 233, 62, 214, 4, 197, 213, 148, 154, 189, 162, 24, 154, + 140, 50, 252, 247, 224, 12, 109, 246, 121, 251, 60, 36, 198, 217, 12, 196, + 165, 240, 246, 110, 19, 159, 204, 215, 242, 190, 213, 253, 150, 0, 43, 57, + 147, 5, 72, 60, 49, 199, 206, 164, 39, 212, 61, 62, 26, 26, 135, 47, + 197, 249, 86, 76, 77, 81, 153, 91, 82, 89, 113, 251, 204, 69, 160, 72, + 202, 85, 172, 75, 93, 249, 241, 229, 171, 77, 26, 106, 88, 32, 51, 194, + 21, 191, 248, 172, 182, 137, 209, 152, 158, 153, 79, 178, 244, 191, 247, 205, + 241, 109, 112, 100, 4, 83, 113, 122, 44, 20, 226, 18, 58, 146, 106, 21, + 168, 123, 249, 245, 151, 188, 41, 37, 71, 78, 245, 188, 223, 209, 17, 4, + 248, 62, 176, 85, 5, 196, 4, 152, 197, 137, 59, 125, 158, 20, 47, 223, + 91, 60, 22, 70, 111, 98, 250, 162, 167, 123, 50, 219, 61, 118, 133, 20, + 40, 126, 186, 31, 58, 106, 118, 26, 179, 182, 127, 233, 244, 101, 238, 242, + 71, 50, 125, 119, 90, 86, 198, 207, 2, 189, 9, 36, 236, 34, 20, 161, + 123, 70, 188, 102, 197, 180, 241, 165, 165, 119, 86, 113, 22, 1, 243, 166, + 114, 32, 91, 4, 124, 196, 231, 88, 181, 19, 172, 144, 169, 23, 48, 79, + 40, 71, 179, 94, 192, 27, 57, 199, 170, 76, 75, 255, 156, 142, 100, 101, + 174, 204, 43, 11, 19, 141, 16, 118, 206, 77, 204, 86, 75, 253, 186, 94, + 20, 233, 149, 185, 106, 46, 210, 67, 134, 94, 128, 141, 53, 225, 191, 165, + 53, 41, 242, 36, 53, 135, 247, 108, 31, 188, 117, 216, 179, 177, 66, 82, + 238, 221, 116, 220, 134, 85, 252, 209, 109, 181, 90, 133, 33, 132, 6, 236, + 29, 7, 246, 226, 50, 222, 135, 120, 124, 44, 141, 121, 139, 197, 40, 162, + 201, 206, 228, 95, 22, 157, 208, 105, 164, 105, 75, 147, 146, 214, 227, 67, + 16, 210, 184, 124, 123, 48, 158, 179, 37, 65, 151, 138, 209, 191, 30, 72, + 239, 112, 50, 142, 104, 34, 199, 206, 221, 104, 62, 218, 226, 240, 173, 211, + 143, 102, 44, 165, 33, 210, 82, 130, 17, 99, 47, 16, 58, 243, 145, 69, + 66, 101, 222, 137, 148, 96, 64, 25, 113, 244, 149, 241, 227, 42, 100, 73, + 76, 206, 102, 180, 24, 123, 93, 246, 60, 195, 196, 177, 2, 247, 113, 34, + 131, 72, 10, 187, 230, 55, 46, 235, 33, 62, 82, 50, 16, 193, 104, 198, + 22, 188, 179, 101, 167, 6, 34, 75, 50, 33, 41, 130, 74, 45, 194, 233, + 20, 173, 120, 98, 187, 138, 156, 73, 141, 35, 77, 119, 226, 172, 87, 10, + 24, 36, 109, 213, 18, 47, 130, 61, 18, 34, 94, 129, 251, 33, 187, 204, + 107, 26, 34, 239, 33, 156, 204, 106, 242, 87, 9, 26, 182, 64, 43, 38, + 100, 50, 142, 115, 119, 96, 36, 12, 101, 195, 167, 91, 103, 226, 156, 76, + 220, 114, 42, 151, 38, 195, 60, 1, 211, 221, 112, 179, 1, 22, 99, 34, + 49, 217, 168, 185, 13, 173, 91, 81, 181, 151, 191, 182, 87, 50, 27, 82, + 69, 170, 159, 83, 59, 38, 99, 82, 33, 212, 52, 202, 230, 190, 236, 185, + 53, 49, 62, 169, 188, 42, 106, 185, 154, 158, 84, 49, 102, 12, 97, 91, + 18, 247, 185, 51, 46, 206, 102, 141, 248, 132, 177, 244, 74, 122, 117, 142, + 248, 104, 177, 242, 212, 206, 184, 161, 28, 32, 33, 75, 223, 200, 129, 136, + 149, 31, 231, 32, 246, 131, 101, 116, 194, 202, 193, 214, 40, 44, 148, 178, + 213, 113, 197, 238, 233, 135, 222, 204, 183, 45, 22, 103, 154, 161, 92, 244, + 206, 122, 240, 169, 93, 220, 187, 165, 169, 109, 47, 30, 103, 187, 47, 248, + 8, 183, 103, 149, 218, 2, 210, 169, 232, 56, 30, 167, 244, 245, 116, 112, + 70, 128, 113, 4, 32, 71, 128, 114, 244, 57, 96, 214, 20, 185, 7, 137, + 81, 100, 69, 164, 204, 49, 69, 162, 216, 26, 81, 180, 235, 65, 23, 30, + 41, 171, 85, 241, 30, 103, 12, 108, 172, 101, 84, 181, 127, 49, 77, 172, + 139, 208, 58, 214, 238, 169, 106, 138, 162, 7, 106, 155, 46, 199, 155, 215, + 246, 200, 202, 168, 26, 67, 63, 173, 166, 205, 150, 114, 15, 244, 22, 124, + 246, 220, 62, 128, 5, 66, 156, 33, 85, 212, 6, 196, 114, 237, 7, 199, + 165, 130, 95, 241, 15, 10, 102, 90, 177, 24, 239, 58, 59, 124, 104, 138, + 195, 33, 198, 108, 218, 234, 248, 97, 3, 63, 1, 60, 194, 112, 231, 17, + 85, 147, 168, 244, 171, 249, 135, 198, 92, 62, 195, 109, 122, 168, 198, 60, + 157, 202, 123, 187, 220, 128, 44, 158, 58, 42, 49, 97, 220, 117, 12, 94, + 93, 65, 126, 90, 0, 203, 206, 219, 124, 9, 146, 53, 184, 104, 80, 219, + 62, 219, 138, 42, 128, 143, 231, 221, 190, 4, 73, 27, 146, 245, 97, 197, + 162, 42, 193, 231, 215, 174, 192, 56, 175, 97, 229, 81, 125, 52, 240, 193, + 102, 239, 96, 88, 31, 238, 1, 196, 208, 156, 3, 12, 96, 215, 179, 119, + 227, 3, 246, 41, 48, 30, 196, 54, 135, 247, 157, 99, 216, 62, 225, 123, + 117, 181, 205, 255, 93, 175, 146, 253, 216, 244, 73, 112, 12, 51, 155, 190, + 239, 139, 113, 121, 154, 99, 70, 18, 94, 106, 209, 255, 159, 187, 1, 30, + 28, 164, 219, 48, 235, 128, 169, 47, 170, 228, 56, 171, 18, 191, 33, 181, + 28, 233, 90, 178, 73, 159, 154, 202, 60, 141, 53, 183, 160, 23, 28, 173, + 67, 190, 243, 249, 236, 199, 91, 234, 177, 214, 35, 216, 21, 251, 102, 62, + 24, 76, 187, 209, 94, 182, 229, 211, 165, 231, 18, 253, 114, 53, 223, 98, + 242, 67, 54, 177, 21, 179, 121, 20, 42, 222, 70, 133, 116, 250, 199, 141, + 37, 148, 111, 247, 106, 34, 230, 97, 98, 26, 15, 86, 6, 178, 212, 93, + 70, 38, 206, 242, 120, 126, 38, 97, 66, 18, 171, 212, 196, 24, 67, 82, + 19, 174, 215, 232, 13, 120, 245, 133, 75, 39, 155, 3, 227, 74, 36, 142, + 220, 40, 230, 39, 57, 254, 225, 201, 95, 173, 36, 194, 30, 89, 230, 49, + 67, 20, 103, 50, 88, 31, 187, 18, 199, 250, 9, 143, 161, 185, 14, 43, + 185, 185, 113, 229, 175, 226, 148, 108, 131, 77, 82, 148, 164, 198, 3, 160, + 9, 116, 203, 110, 139, 216, 72, 143, 138, 62, 79, 9, 225, 45, 151, 4, + 225, 194, 211, 165, 104, 175, 65, 122, 213, 238, 207, 7, 74, 77, 129, 165, + 186, 171, 45, 50, 28, 243, 9, 191, 196, 95, 2, 111, 66, 151, 85, 65, + 67, 241, 83, 131, 36, 180, 23, 222, 153, 71, 67, 218, 89, 90, 195, 110, + 124, 218, 164, 227, 196, 220, 118, 100, 186, 240, 139, 194, 102, 250, 62, 84, + 238, 51, 197, 195, 41, 198, 180, 161, 13, 171, 212, 237, 178, 56, 225, 120, + 6, 97, 190, 113, 169, 123, 75, 52, 162, 143, 197, 37, 102, 91, 71, 250, + 125, 57, 130, 173, 1, 60, 148, 15, 198, 237, 214, 128, 152, 89, 241, 109, + 77, 24, 210, 121, 196, 185, 178, 71, 85, 170, 6, 89, 202, 18, 183, 51, + 210, 71, 113, 36, 81, 163, 90, 240, 18, 95, 236, 169, 49, 55, 148, 60, + 197, 183, 123, 150, 181, 200, 215, 146, 102, 127, 5, 47, 11, 218, 25, 149, + 46, 240, 87, 218, 138, 52, 27, 254, 108, 199, 84, 91, 90, 120, 186, 46, + 56, 167, 39, 154, 242, 169, 59, 138, 160, 192, 213, 130, 23, 107, 215, 150, + 157, 4, 138, 56, 157, 126, 235, 118, 156, 242, 227, 52, 27, 67, 237, 38, + 246, 57, 81, 253, 12, 245, 62, 101, 24, 138, 235, 22, 99, 210, 90, 213, + 143, 33, 200, 84, 18, 50, 180, 181, 50, 245, 130, 6, 176, 165, 196, 86, + 134, 136, 228, 16, 231, 57, 181, 217, 210, 24, 59, 195, 154, 79, 71, 186, + 202, 2, 43, 75, 193, 89, 253, 76, 28, 84, 45, 160, 247, 218, 159, 229, + 35, 214, 253, 43, 102, 105, 92, 25, 173, 180, 6, 209, 216, 238, 142, 96, + 186, 140, 64, 158, 207, 198, 220, 200, 13, 85, 106, 26, 56, 66, 100, 119, + 250, 153, 230, 50, 19, 59, 73, 127, 186, 54, 147, 152, 208, 60, 114, 15, + 153, 38, 93, 143, 91, 211, 142, 245, 62, 92, 243, 135, 59, 15, 249, 254, + 239, 244, 46, 228, 219, 190, 83, 80, 71, 152, 76, 132, 8, 99, 126, 176, + 112, 239, 14, 122, 120, 48, 15, 119, 212, 239, 105, 203, 231, 159, 120, 83, + 215, 86, 173, 107, 1, 139, 210, 224, 85, 39, 120, 102, 223, 18, 219, 159, + 136, 53, 181, 167, 243, 242, 72, 172, 237, 87, 27, 80, 102, 160, 117, 221, + 189, 101, 119, 241, 229, 155, 42, 223, 65, 195, 238, 178, 168, 118, 183, 244, + 71, 59, 118, 141, 173, 220, 191, 183, 170, 59, 77, 7, 71, 242, 152, 122, + 93, 23, 0, 235, 153, 0, 6, 94, 12, 160, 191, 7, 64, 13, 144, 197, + 190, 154, 1, 102, 12, 241, 241, 46, 196, 126, 54, 192, 86, 172, 127, 81, + 181, 15, 153, 215, 213, 93, 208, 180, 38, 241, 119, 177, 131, 68, 134, 17, + 148, 174, 197, 150, 169, 3, 156, 150, 218, 34, 49, 133, 102, 129, 106, 195, + 121, 111, 71, 113, 123, 172, 207, 79, 12, 117, 213, 26, 177, 61, 94, 161, + 148, 226, 170, 8, 97, 218, 175, 240, 211, 110, 17, 53, 114, 249, 239, 208, + 229, 69, 230, 201, 143, 47, 63, 67, 171, 76, 196, 158, 147, 175, 48, 130, + 124, 209, 8, 84, 185, 254, 51, 101, 79, 155, 54, 84, 149, 195, 21, 15, + 70, 102, 157, 218, 219, 188, 76, 169, 30, 76, 127, 111, 158, 233, 51, 6, + 120, 181, 238, 93, 107, 112, 19, 42, 175, 203, 227, 137, 29, 218, 53, 187, + 98, 79, 78, 173, 54, 177, 239, 133, 206, 210, 237, 172, 138, 20, 89, 176, + 38, 183, 227, 113, 135, 190, 38, 215, 45, 252, 120, 167, 22, 86, 87, 225, + 19, 125, 19, 2, 237, 79, 103, 244, 167, 92, 254, 228, 90, 63, 83, 204, + 210, 46, 219, 159, 74, 157, 229, 169, 245, 15, 10, 173, 36, 180, 58, 101, + 143, 26, 63, 195, 230, 48, 241, 80, 63, 159, 45, 240, 243, 15, 21, 252, + 7, 157, 111, 44, 2, 134, 242, 247, 11, 63, 187, 255, 40, 74, 110, 110, + 86, 101, 161, 212, 48, 28, 79, 92, 91, 195, 66, 115, 64, 190, 203, 225, + 147, 39, 148, 170, 203, 16, 136, 102, 17, 42, 161, 193, 230, 18, 244, 153, + 20, 144, 255, 235, 26, 249, 54, 185, 204, 33, 182, 7, 26, 184, 117, 54, + 210, 237, 119, 143, 145, 75, 42, 81, 153, 40, 96, 230, 73, 114, 113, 93, + 21, 110, 135, 43, 103, 84, 194, 105, 17, 225, 129, 191, 61, 248, 80, 87, + 223, 126, 234, 187, 226, 23, 115, 74, 101, 36, 62, 77, 69, 243, 162, 165, + 6, 80, 12, 213, 98, 57, 129, 153, 57, 172, 39, 134, 223, 29, 201, 176, + 178, 147, 115, 135, 196, 44, 129, 84, 77, 83, 250, 98, 110, 186, 40, 230, + 69, 129, 109, 248, 78, 230, 153, 182, 70, 16, 106, 83, 240, 219, 33, 43, + 22, 178, 233, 247, 218, 50, 170, 228, 26, 94, 241, 60, 86, 190, 29, 148, + 243, 138, 237, 41, 151, 1, 172, 158, 111, 137, 208, 189, 173, 248, 36, 21, + 100, 30, 73, 49, 233, 209, 156, 121, 227, 104, 190, 227, 84, 43, 207, 70, + 94, 82, 251, 172, 133, 93, 132, 6, 187, 31, 53, 111, 104, 27, 132, 33, + 106, 207, 230, 107, 176, 213, 29, 125, 117, 248, 47, 81, 238, 81, 119, 26, + 90, 122, 103, 232, 78, 161, 34, 144, 132, 124, 177, 221, 144, 96, 125, 69, + 171, 42, 198, 250, 98, 163, 140, 103, 228, 112, 173, 118, 106, 199, 19, 223, + 195, 188, 239, 61, 205, 9, 170, 115, 178, 0, 108, 60, 157, 233, 23, 146, + 216, 165, 251, 169, 72, 3, 19, 218, 159, 138, 197, 83, 123, 149, 99, 98, + 143, 6, 98, 39, 38, 10, 60, 241, 25, 45, 118, 182, 205, 211, 151, 36, + 211, 145, 90, 112, 130, 226, 179, 225, 4, 1, 156, 30, 149, 74, 132, 202, + 196, 90, 55, 74, 39, 34, 142, 106, 75, 84, 45, 137, 210, 22, 208, 141, + 46, 207, 186, 203, 89, 81, 28, 143, 228, 222, 76, 91, 11, 222, 134, 115, + 226, 35, 225, 72, 188, 130, 17, 177, 163, 131, 185, 106, 219, 133, 117, 20, + 187, 11, 21, 176, 78, 115, 185, 2, 215, 231, 217, 101, 37, 208, 36, 110, + 114, 84, 213, 252, 161, 108, 17, 32, 133, 177, 221, 33, 52, 230, 226, 207, + 144, 29, 120, 95, 170, 58, 137, 245, 69, 36, 205, 65, 221, 72, 129, 103, + 81, 229, 146, 230, 51, 151, 233, 201, 239, 21, 238, 107, 197, 99, 137, 87, + 61, 42, 123, 213, 26, 251, 95, 111, 148, 224, 187, 219, 229, 74, 134, 87, + 41, 85, 196, 186, 37, 51, 216, 193, 124, 185, 178, 212, 163, 85, 217, 21, + 104, 13, 179, 200, 193, 171, 214, 141, 106, 196, 82, 138, 111, 238, 21, 85, + 246, 53, 206, 243, 60, 229, 102, 92, 205, 124, 230, 116, 141, 206, 84, 105, + 13, 189, 47, 93, 242, 154, 187, 82, 11, 73, 108, 18, 65, 72, 222, 126, + 18, 6, 47, 252, 19, 143, 134, 140, 131, 240, 69, 239, 157, 224, 183, 254, + 162, 226, 159, 248, 155, 248, 28, 190, 72, 170, 76, 118, 41, 58, 22, 196, + 177, 134, 93, 123, 243, 178, 72, 93, 65, 85, 212, 73, 149, 37, 54, 132, + 83, 204, 61, 58, 118, 94, 242, 252, 196, 197, 132, 94, 30, 250, 246, 140, + 111, 124, 212, 106, 146, 131, 221, 58, 89, 43, 140, 64, 214, 251, 226, 202, + 126, 86, 86, 125, 126, 62, 243, 94, 252, 124, 2, 38, 229, 231, 146, 38, + 62, 7, 11, 72, 48, 46, 194, 117, 191, 144, 163, 245, 128, 118, 93, 92, + 115, 51, 156, 178, 182, 12, 117, 178, 229, 121, 184, 216, 236, 174, 124, 25, + 69, 21, 235, 188, 143, 165, 72, 80, 83, 184, 32, 50, 15, 20, 22, 75, + 5, 6, 235, 197, 165, 214, 126, 245, 174, 78, 248, 155, 112, 126, 85, 84, + 102, 151, 53, 97, 211, 46, 230, 165, 184, 87, 245, 27, 39, 52, 129, 68, + 242, 159, 114, 181, 110, 120, 13, 72, 252, 99, 85, 96, 214, 72, 223, 70, + 95, 24, 151, 212, 231, 105, 42, 100, 16, 32, 125, 197, 187, 131, 197, 100, + 136, 182, 134, 44, 145, 45, 36, 227, 103, 111, 149, 22, 171, 222, 120, 142, + 37, 158, 160, 42, 253, 209, 13, 184, 1, 28, 242, 66, 107, 123, 31, 192, + 67, 16, 159, 6, 195, 79, 143, 6, 71, 43, 122, 64, 137, 184, 123, 46, + 135, 122, 102, 192, 153, 17, 195, 169, 242, 185, 200, 146, 240, 170, 254, 103, + 18, 72, 63, 155, 66, 250, 247, 144, 72, 223, 26, 79, 38, 205, 173, 62, + 234, 40, 46, 173, 183, 182, 143, 27, 206, 202, 136, 89, 203, 108, 40, 251, + 197, 103, 193, 38, 19, 19, 1, 97, 34, 48, 49, 33, 110, 25, 186, 65, + 140, 138, 192, 68, 133, 47, 184, 208, 13, 40, 124, 4, 192, 71, 96, 129, + 235, 84, 12, 20, 248, 39, 159, 118, 243, 92, 156, 53, 119, 74, 1, 102, + 178, 196, 225, 31, 181, 25, 149, 231, 50, 215, 248, 214, 31, 145, 231, 78, + 170, 151, 118, 186, 207, 78, 58, 82, 245, 250, 163, 233, 215, 66, 123, 95, + 18, 96, 121, 129, 19, 43, 104, 236, 195, 24, 29, 162, 64, 78, 170, 18, + 43, 11, 240, 207, 0, 58, 1, 120, 7, 88, 61, 13, 101, 222, 216, 134, + 59, 168, 101, 232, 168, 196, 189, 139, 69, 221, 131, 167, 239, 9, 233, 76, + 90, 180, 104, 249, 199, 172, 236, 126, 46, 8, 142, 184, 76, 126, 231, 92, + 243, 59, 41, 110, 135, 121, 29, 144, 129, 243, 253, 92, 142, 48, 56, 74, + 96, 68, 16, 0, 180, 44, 122, 118, 41, 201, 87, 86, 220, 128, 108, 51, + 16, 46, 174, 238, 50, 234, 126, 196, 62, 146, 177, 219, 155, 91, 139, 236, + 45, 206, 114, 99, 74, 239, 179, 54, 10, 153, 207, 119, 231, 33, 77, 86, + 234, 41, 85, 162, 119, 90, 157, 213, 100, 157, 172, 100, 241, 171, 53, 180, + 17, 199, 109, 23, 152, 95, 220, 99, 221, 215, 114, 188, 131, 228, 192, 117, + 63, 233, 19, 28, 204, 235, 54, 123, 96, 226, 195, 16, 238, 59, 65, 27, + 249, 51, 72, 62, 107, 138, 39, 110, 222, 233, 124, 204, 16, 235, 100, 98, + 26, 204, 64, 156, 187, 227, 199, 213, 154, 217, 3, 51, 123, 205, 200, 30, + 36, 217, 43, 169, 252, 149, 84, 129, 74, 92, 162, 71, 91, 137, 192, 245, + 34, 56, 81, 77, 190, 168, 169, 175, 224, 69, 189, 152, 19, 142, 77, 239, + 151, 235, 203, 229, 133, 187, 186, 160, 89, 198, 191, 197, 43, 229, 189, 46, + 131, 6, 37, 75, 213, 216, 182, 45, 154, 237, 162, 182, 203, 35, 131, 169, + 2, 109, 225, 59, 214, 3, 187, 43, 171, 13, 182, 119, 128, 67, 91, 236, + 186, 230, 247, 187, 88, 249, 213, 62, 177, 187, 255, 170, 178, 1, 123, 90, + 128, 211, 241, 36, 111, 33, 210, 18, 161, 86, 20, 230, 156, 23, 57, 251, + 142, 168, 64, 83, 146, 19, 105, 91, 18, 128, 7, 34, 58, 38, 198, 47, + 94, 229, 45, 115, 250, 153, 107, 242, 152, 184, 16, 183, 247, 107, 190, 200, + 98, 56, 20, 206, 106, 209, 241, 172, 102, 156, 220, 141, 95, 133, 35, 44, + 207, 122, 149, 232, 45, 202, 109, 181, 149, 139, 223, 154, 104, 123, 208, 11, + 218, 104, 147, 55, 55, 180, 157, 50, 1, 236, 92, 109, 64, 47, 226, 67, + 68, 110, 141, 237, 183, 98, 127, 107, 60, 87, 67, 243, 57, 171, 44, 157, + 131, 1, 64, 209, 182, 80, 229, 217, 7, 15, 56, 184, 57, 83, 223, 95, + 105, 189, 57, 115, 229, 176, 17, 92, 20, 180, 100, 122, 173, 209, 109, 55, + 121, 145, 98, 207, 41, 75, 130, 198, 249, 44, 193, 226, 124, 246, 16, 18, + 185, 0, 99, 67, 61, 55, 166, 208, 103, 227, 34, 234, 255, 234, 133, 41, + 124, 84, 115, 27, 139, 31, 119, 123, 46, 255, 248, 114, 238, 224, 78, 56, + 156, 223, 60, 107, 101, 162, 105, 62, 203, 89, 30, 159, 255, 119, 38, 33, + 91, 153, 91, 60, 245, 137, 81, 247, 113, 55, 15, 27, 141, 110, 111, 115, + 101, 63, 181, 191, 238, 210, 162, 129, 243, 42, 121, 75, 201, 151, 49, 180, + 26, 168, 107, 229, 104, 208, 111, 119, 217, 14, 97, 3, 108, 87, 213, 86, + 197, 244, 201, 209, 183, 23, 188, 120, 134, 75, 119, 184, 114, 135, 252, 240, + 97, 233, 174, 220, 107, 165, 230, 126, 173, 120, 176, 161, 161, 63, 56, 100, + 99, 145, 233, 158, 174, 115, 157, 5, 168, 72, 142, 77, 71, 162, 95, 196, + 173, 72, 22, 196, 82, 249, 28, 68, 36, 7, 148, 235, 212, 234, 244, 116, + 214, 94, 42, 171, 47, 89, 87, 42, 107, 143, 178, 94, 218, 169, 118, 236, + 171, 83, 66, 178, 60, 161, 109, 162, 159, 177, 127, 85, 199, 136, 180, 212, + 25, 156, 202, 37, 80, 75, 5, 204, 123, 180, 217, 99, 148, 100, 120, 230, + 170, 148, 103, 137, 72, 157, 111, 225, 46, 250, 163, 19, 130, 177, 169, 148, + 70, 21, 24, 196, 211, 22, 55, 207, 114, 31, 70, 185, 220, 69, 107, 185, + 147, 193, 87, 25, 92, 145, 35, 177, 82, 149, 79, 164, 19, 206, 65, 158, + 209, 118, 38, 118, 13, 133, 152, 9, 226, 205, 190, 120, 49, 79, 172, 95, + 101, 216, 169, 174, 170, 107, 213, 194, 3, 143, 80, 146, 247, 47, 111, 54, + 150, 105, 217, 180, 218, 72, 12, 155, 210, 183, 86, 142, 178, 179, 240, 249, + 248, 70, 94, 155, 141, 28, 24, 141, 28, 252, 137, 141, 188, 223, 24, 203, + 104, 127, 157, 204, 85, 8, 209, 192, 225, 114, 158, 49, 202, 109, 34, 98, + 27, 227, 105, 155, 166, 33, 55, 253, 105, 55, 235, 210, 3, 241, 118, 247, + 230, 6, 132, 75, 251, 199, 226, 56, 101, 112, 33, 7, 139, 11, 202, 15, + 221, 102, 219, 120, 194, 159, 120, 7, 242, 85, 2, 199, 189, 87, 32, 255, + 203, 221, 100, 17, 167, 192, 14, 205, 249, 105, 49, 177, 101, 240, 138, 123, + 89, 135, 19, 30, 247, 176, 122, 68, 203, 236, 42, 203, 215, 20, 35, 239, + 75, 65, 158, 90, 92, 139, 77, 226, 173, 74, 57, 181, 227, 88, 151, 231, + 238, 149, 172, 16, 76, 83, 16, 139, 130, 103, 190, 75, 198, 191, 143, 226, + 216, 61, 29, 142, 29, 13, 194, 238, 159, 178, 249, 39, 86, 95, 106, 22, + 60, 71, 178, 249, 76, 49, 160, 73, 127, 249, 100, 119, 10, 246, 212, 43, + 218, 37, 36, 123, 213, 192, 183, 32, 98, 169, 193, 98, 5, 29, 223, 106, + 53, 216, 12, 180, 134, 119, 208, 99, 107, 215, 58, 151, 180, 119, 143, 228, + 167, 36, 63, 181, 0, 110, 246, 6, 18, 96, 88, 188, 6, 59, 215, 237, + 92, 83, 37, 158, 125, 67, 127, 107, 158, 103, 177, 172, 21, 119, 14, 45, + 104, 175, 136, 248, 40, 118, 83, 169, 229, 241, 184, 65, 103, 143, 99, 148, + 17, 247, 6, 158, 21, 245, 90, 211, 73, 119, 196, 103, 119, 207, 142, 122, + 211, 254, 232, 19, 203, 164, 146, 27, 72, 45, 133, 178, 7, 48, 14, 65, + 205, 9, 141, 99, 61, 2, 177, 250, 76, 7, 151, 105, 151, 111, 164, 61, + 246, 255, 107, 177, 183, 78, 72, 108, 24, 24, 193, 217, 161, 253, 11, 146, + 217, 135, 19, 251, 237, 196, 11, 35, 54, 80, 205, 86, 123, 240, 110, 153, + 61, 57, 178, 67, 52, 182, 168, 11, 27, 183, 229, 169, 244, 156, 177, 232, + 58, 220, 40, 252, 10, 179, 88, 66, 119, 11, 137, 44, 176, 176, 216, 109, + 47, 97, 185, 1, 58, 125, 232, 138, 151, 104, 110, 213, 204, 91, 227, 188, + 113, 39, 202, 97, 237, 115, 28, 72, 193, 178, 49, 134, 253, 241, 190, 48, + 127, 191, 235, 69, 161, 132, 245, 199, 57, 143, 194, 117, 55, 152, 63, 92, + 89, 155, 84, 111, 49, 158, 126, 202, 116, 218, 27, 39, 166, 8, 159, 196, + 252, 133, 183, 189, 95, 233, 70, 62, 207, 111, 239, 255, 54, 74, 167, 46, + 49, 11, 254, 225, 233, 97, 253, 227, 97, 253, 180, 22, 124, 164, 165, 66, + 63, 69, 248, 166, 135, 209, 180, 67, 229, 124, 215, 98, 241, 218, 150, 47, + 178, 61, 100, 80, 48, 107, 205, 250, 67, 181, 58, 241, 85, 81, 254, 240, + 158, 132, 97, 240, 129, 246, 225, 15, 182, 131, 104, 136, 177, 177, 60, 10, + 235, 121, 1, 239, 122, 63, 88, 235, 30, 255, 157, 23, 42, 56, 16, 170, + 239, 160, 88, 105, 240, 103, 205, 43, 195, 193, 32, 199, 19, 16, 244, 215, + 160, 144, 69, 105, 115, 45, 57, 176, 91, 179, 242, 203, 243, 231, 86, 74, + 91, 14, 235, 198, 234, 135, 94, 194, 113, 87, 2, 220, 133, 94, 119, 155, + 83, 246, 164, 218, 65, 90, 171, 211, 135, 174, 78, 255, 166, 176, 118, 250, + 238, 191, 213, 55, 231, 16, 56, 208, 87, 99, 115, 80, 211, 95, 112, 212, + 27, 148, 116, 142, 114, 80, 60, 240, 131, 45, 255, 188, 72, 130, 115, 57, + 252, 250, 27, 93, 80, 49, 110, 172, 187, 69, 237, 192, 175, 93, 107, 214, + 26, 5, 82, 85, 77, 229, 11, 54, 197, 146, 127, 236, 29, 76, 250, 132, + 235, 234, 161, 68, 30, 86, 142, 55, 86, 65, 165, 187, 58, 63, 123, 23, + 125, 174, 93, 245, 178, 37, 229, 242, 37, 165, 41, 253, 30, 5, 198, 153, + 39, 184, 87, 193, 243, 112, 97, 132, 125, 10, 247, 212, 216, 8, 88, 103, + 32, 64, 38, 94, 52, 131, 168, 58, 140, 234, 190, 248, 226, 131, 14, 194, + 138, 181, 165, 222, 75, 224, 108, 140, 97, 57, 150, 1, 99, 63, 145, 143, + 142, 140, 177, 15, 239, 145, 20, 124, 27, 174, 27, 101, 245, 157, 248, 103, + 20, 250, 15, 33, 80, 0, 247, 139, 206, 91, 58, 81, 192, 59, 133, 224, + 134, 157, 34, 175, 3, 118, 161, 44, 84, 187, 88, 86, 72, 83, 44, 100, + 192, 23, 6, 169, 180, 154, 74, 171, 4, 122, 100, 92, 71, 41, 206, 49, + 43, 183, 133, 13, 125, 50, 72, 69, 179, 47, 214, 254, 149, 210, 46, 44, + 11, 206, 228, 58, 224, 49, 36, 190, 198, 36, 158, 102, 140, 95, 55, 73, + 252, 214, 61, 193, 126, 82, 95, 227, 5, 90, 123, 156, 171, 192, 45, 223, + 130, 127, 192, 7, 236, 77, 63, 234, 117, 87, 123, 248, 219, 168, 87, 161, + 180, 93, 30, 151, 139, 252, 181, 132, 62, 213, 244, 94, 114, 191, 223, 65, + 187, 40, 75, 119, 167, 177, 69, 166, 40, 233, 79, 187, 139, 148, 76, 219, + 82, 162, 153, 35, 251, 11, 40, 124, 92, 230, 254, 141, 225, 255, 231, 27, + 74, 78, 249, 56, 247, 236, 150, 189, 180, 71, 90, 115, 34, 232, 172, 236, + 32, 16, 139, 8, 22, 17, 72, 247, 185, 56, 157, 53, 57, 69, 113, 64, + 11, 114, 13, 13, 52, 109, 88, 99, 102, 231, 108, 91, 29, 125, 62, 252, + 127, 228, 189, 249, 66, 219, 200, 179, 63, 250, 191, 158, 66, 241, 104, 130, + 109, 201, 182, 22, 219, 64, 64, 204, 15, 2, 73, 72, 6, 66, 246, 48, + 132, 112, 189, 97, 27, 188, 197, 11, 182, 113, 124, 95, 233, 62, 196, 125, + 177, 91, 75, 119, 171, 101, 27, 66, 102, 38, 223, 115, 207, 57, 51, 1, + 164, 222, 187, 213, 93, 93, 93, 93, 245, 169, 206, 179, 195, 119, 47, 50, + 7, 167, 7, 95, 58, 230, 193, 179, 103, 7, 79, 223, 39, 80, 27, 19, + 78, 191, 164, 63, 74, 238, 82, 42, 165, 86, 45, 152, 152, 101, 19, 93, + 167, 16, 99, 73, 124, 165, 113, 9, 43, 209, 43, 0, 115, 66, 126, 91, + 167, 153, 70, 14, 246, 56, 229, 101, 229, 178, 95, 106, 215, 46, 46, 71, + 183, 183, 200, 119, 22, 72, 45, 21, 126, 195, 254, 226, 74, 222, 147, 221, + 152, 245, 71, 3, 96, 63, 161, 210, 34, 179, 196, 64, 223, 71, 201, 192, + 141, 124, 57, 175, 122, 54, 145, 133, 196, 155, 74, 164, 203, 155, 174, 241, + 51, 57, 41, 99, 1, 255, 42, 7, 234, 24, 148, 151, 204, 55, 112, 236, + 89, 227, 109, 24, 0, 127, 150, 165, 253, 217, 135, 3, 7, 121, 182, 165, + 85, 45, 222, 26, 243, 213, 123, 53, 204, 201, 131, 105, 116, 108, 145, 238, + 83, 242, 146, 202, 148, 231, 8, 104, 242, 150, 169, 249, 6, 112, 191, 111, + 237, 13, 165, 196, 45, 226, 125, 138, 135, 205, 44, 128, 232, 140, 136, 182, + 37, 131, 60, 43, 184, 118, 224, 50, 17, 254, 158, 246, 179, 5, 20, 93, + 136, 64, 162, 190, 223, 225, 24, 84, 164, 64, 160, 255, 126, 20, 234, 99, + 40, 144, 191, 117, 230, 149, 205, 62, 21, 72, 4, 145, 182, 194, 64, 52, + 97, 50, 223, 33, 169, 6, 145, 146, 44, 201, 8, 38, 115, 146, 238, 176, + 139, 17, 146, 20, 76, 85, 8, 142, 132, 245, 214, 120, 24, 215, 252, 15, + 73, 169, 184, 114, 1, 90, 26, 74, 55, 228, 138, 154, 138, 151, 55, 115, + 205, 161, 15, 185, 94, 85, 190, 48, 153, 16, 123, 17, 129, 237, 142, 250, + 205, 90, 127, 37, 129, 229, 40, 200, 213, 2, 122, 132, 74, 203, 138, 196, + 138, 152, 95, 73, 98, 185, 138, 140, 170, 252, 167, 212, 39, 239, 33, 188, + 58, 9, 21, 94, 36, 251, 4, 14, 200, 50, 72, 244, 244, 7, 148, 14, + 102, 38, 26, 3, 195, 18, 174, 125, 27, 213, 58, 149, 102, 28, 156, 238, + 223, 38, 175, 127, 11, 178, 237, 191, 154, 44, 223, 67, 172, 31, 89, 143, + 204, 65, 207, 252, 131, 20, 68, 240, 8, 172, 217, 63, 40, 73, 52, 185, + 132, 97, 73, 24, 242, 60, 48, 210, 104, 84, 237, 242, 83, 105, 18, 194, + 60, 194, 178, 198, 59, 1, 11, 59, 114, 5, 169, 111, 34, 3, 60, 87, + 82, 141, 6, 39, 186, 17, 137, 166, 50, 17, 6, 48, 233, 184, 68, 45, + 57, 178, 93, 130, 145, 110, 153, 140, 152, 84, 170, 27, 246, 224, 91, 255, + 12, 131, 28, 124, 61, 143, 84, 13, 33, 124, 152, 101, 253, 246, 86, 183, + 158, 53, 148, 216, 64, 104, 220, 137, 171, 0, 242, 72, 35, 239, 5, 26, + 226, 70, 0, 245, 154, 164, 119, 74, 2, 250, 35, 191, 224, 131, 57, 93, + 28, 66, 105, 84, 49, 183, 19, 49, 102, 105, 163, 16, 182, 135, 124, 189, + 215, 24, 181, 203, 198, 24, 33, 115, 125, 82, 210, 39, 6, 124, 137, 210, + 138, 101, 248, 76, 173, 17, 163, 165, 93, 145, 194, 153, 119, 48, 188, 192, + 179, 75, 42, 194, 217, 130, 82, 96, 47, 235, 15, 207, 168, 138, 115, 243, + 75, 188, 208, 229, 50, 207, 191, 160, 243, 179, 247, 176, 76, 196, 134, 169, + 146, 196, 233, 130, 217, 108, 181, 70, 131, 97, 63, 194, 136, 36, 242, 255, + 165, 211, 189, 52, 203, 176, 35, 35, 132, 154, 90, 78, 83, 45, 51, 170, + 24, 11, 39, 174, 89, 243, 3, 172, 129, 41, 42, 56, 147, 38, 242, 151, + 142, 88, 173, 188, 44, 233, 14, 6, 221, 107, 32, 48, 106, 3, 22, 173, + 89, 198, 81, 31, 40, 173, 94, 109, 181, 126, 233, 8, 162, 4, 156, 179, + 88, 230, 178, 221, 48, 15, 113, 221, 116, 134, 12, 110, 15, 237, 83, 128, + 158, 95, 58, 73, 141, 24, 164, 178, 212, 247, 215, 175, 190, 36, 16, 79, + 77, 142, 38, 139, 187, 89, 37, 207, 210, 38, 177, 113, 198, 95, 246, 220, + 145, 15, 244, 45, 219, 165, 193, 181, 1, 71, 23, 156, 79, 201, 241, 87, + 223, 110, 124, 245, 83, 105, 75, 204, 242, 28, 28, 77, 230, 82, 160, 117, + 134, 105, 207, 149, 84, 203, 234, 227, 63, 18, 29, 25, 125, 105, 232, 188, + 170, 24, 32, 86, 80, 12, 89, 62, 99, 155, 250, 63, 44, 143, 214, 163, + 157, 86, 237, 20, 9, 209, 34, 149, 159, 114, 89, 211, 143, 238, 21, 104, + 198, 139, 152, 204, 12, 255, 58, 250, 228, 143, 5, 105, 75, 0, 107, 208, + 86, 22, 23, 128, 210, 28, 126, 104, 194, 146, 148, 139, 77, 183, 30, 48, + 80, 91, 215, 87, 71, 204, 244, 28, 125, 145, 112, 50, 33, 171, 247, 133, + 176, 19, 123, 129, 202, 105, 207, 250, 120, 171, 120, 4, 195, 112, 4, 52, + 27, 111, 104, 80, 235, 72, 142, 77, 106, 158, 248, 221, 204, 197, 2, 75, + 19, 12, 100, 203, 27, 79, 112, 121, 176, 220, 84, 99, 98, 238, 173, 4, + 137, 90, 188, 228, 40, 71, 155, 53, 114, 11, 162, 101, 248, 161, 224, 91, + 164, 233, 51, 37, 41, 46, 67, 148, 8, 34, 243, 41, 248, 108, 73, 98, + 28, 50, 124, 209, 224, 67, 72, 42, 247, 197, 80, 169, 199, 28, 102, 83, + 244, 87, 161, 123, 34, 29, 167, 73, 194, 104, 245, 249, 34, 70, 146, 76, + 105, 2, 223, 207, 4, 44, 159, 160, 83, 32, 71, 238, 132, 178, 199, 42, + 121, 20, 208, 92, 164, 193, 205, 232, 2, 39, 22, 243, 55, 46, 112, 204, + 251, 46, 112, 254, 89, 225, 49, 135, 117, 203, 23, 55, 255, 172, 112, 233, + 200, 206, 79, 147, 176, 23, 138, 70, 153, 238, 114, 161, 15, 244, 122, 207, + 110, 129, 251, 164, 219, 173, 221, 2, 247, 219, 138, 3, 139, 96, 28, 17, + 159, 252, 166, 212, 111, 162, 205, 194, 5, 89, 238, 72, 174, 236, 53, 158, + 56, 36, 6, 177, 64, 57, 132, 109, 191, 90, 199, 51, 160, 132, 36, 38, + 10, 181, 112, 133, 28, 93, 188, 239, 42, 176, 240, 88, 21, 107, 10, 69, + 157, 169, 182, 140, 132, 151, 18, 131, 235, 150, 154, 29, 142, 82, 37, 115, + 51, 24, 14, 220, 132, 84, 165, 206, 212, 68, 194, 168, 85, 54, 24, 52, + 235, 228, 222, 126, 45, 227, 49, 103, 132, 134, 43, 253, 74, 109, 112, 7, + 34, 44, 166, 33, 187, 138, 123, 112, 199, 99, 13, 15, 39, 245, 138, 26, + 45, 66, 20, 143, 13, 164, 194, 20, 215, 147, 205, 23, 248, 85, 193, 169, + 172, 134, 157, 183, 220, 181, 39, 64, 83, 216, 92, 47, 130, 154, 111, 118, + 122, 242, 214, 61, 155, 192, 137, 208, 58, 35, 229, 125, 2, 146, 148, 56, + 140, 242, 130, 158, 190, 27, 112, 92, 176, 31, 147, 179, 233, 193, 220, 121, + 254, 118, 247, 148, 126, 237, 58, 111, 159, 239, 225, 207, 46, 222, 190, 173, + 252, 178, 16, 68, 21, 89, 127, 8, 156, 112, 245, 117, 112, 4, 36, 210, + 61, 246, 2, 169, 36, 131, 139, 198, 253, 91, 47, 98, 139, 50, 101, 102, + 134, 130, 0, 70, 229, 172, 162, 174, 92, 196, 6, 81, 105, 238, 6, 220, + 47, 152, 12, 23, 72, 185, 201, 208, 88, 215, 226, 101, 182, 138, 226, 7, + 189, 126, 115, 136, 254, 67, 195, 2, 122, 97, 44, 152, 93, 203, 11, 45, + 203, 67, 179, 249, 65, 151, 46, 68, 220, 101, 109, 118, 55, 133, 151, 37, + 140, 183, 24, 93, 101, 201, 171, 126, 223, 140, 60, 125, 74, 117, 112, 34, + 198, 119, 161, 31, 18, 239, 112, 129, 70, 66, 104, 35, 30, 199, 15, 154, + 27, 141, 10, 124, 42, 170, 218, 242, 82, 127, 228, 221, 39, 126, 126, 110, + 160, 199, 72, 42, 215, 233, 64, 124, 35, 99, 53, 42, 153, 141, 173, 71, + 86, 84, 212, 31, 214, 180, 242, 132, 192, 134, 42, 223, 191, 195, 179, 13, + 15, 59, 97, 227, 15, 72, 255, 4, 75, 134, 191, 127, 20, 224, 169, 194, + 10, 15, 174, 213, 157, 56, 240, 107, 138, 191, 202, 248, 171, 81, 161, 119, + 250, 205, 86, 249, 174, 53, 131, 225, 153, 163, 82, 132, 48, 185, 45, 59, + 80, 42, 57, 169, 116, 45, 153, 198, 130, 125, 136, 20, 180, 220, 115, 213, + 253, 5, 24, 131, 148, 225, 231, 41, 167, 231, 8, 96, 202, 74, 214, 180, + 20, 32, 129, 234, 173, 110, 39, 11, 91, 109, 222, 209, 141, 176, 33, 129, + 240, 127, 24, 69, 249, 121, 201, 44, 72, 23, 135, 58, 167, 170, 189, 224, + 116, 144, 106, 100, 89, 233, 97, 147, 110, 193, 220, 88, 11, 104, 187, 62, + 233, 14, 154, 196, 122, 37, 19, 214, 103, 244, 128, 123, 154, 72, 125, 233, + 16, 118, 62, 90, 14, 39, 129, 31, 253, 191, 184, 245, 115, 140, 120, 39, + 233, 14, 71, 192, 136, 37, 82, 9, 186, 54, 67, 105, 74, 132, 148, 250, + 163, 162, 227, 229, 46, 148, 128, 252, 80, 164, 169, 222, 207, 46, 26, 168, + 171, 206, 101, 29, 188, 45, 128, 30, 206, 249, 59, 145, 136, 124, 163, 224, + 100, 89, 40, 213, 214, 12, 21, 73, 17, 69, 77, 32, 227, 115, 72, 54, + 176, 66, 237, 98, 146, 78, 142, 129, 99, 203, 241, 174, 15, 79, 176, 117, + 159, 198, 82, 76, 211, 201, 134, 76, 209, 16, 41, 132, 24, 60, 74, 117, + 152, 180, 62, 59, 214, 41, 198, 41, 53, 62, 109, 37, 158, 163, 170, 222, + 76, 11, 128, 70, 103, 26, 168, 194, 39, 244, 11, 213, 170, 62, 151, 8, + 83, 38, 174, 88, 5, 199, 67, 186, 230, 92, 174, 80, 22, 63, 55, 186, + 4, 93, 214, 69, 224, 50, 179, 91, 14, 173, 178, 9, 147, 59, 132, 249, + 7, 97, 240, 23, 62, 124, 87, 160, 98, 112, 49, 146, 6, 240, 144, 176, + 117, 194, 12, 137, 215, 60, 21, 134, 23, 107, 23, 107, 188, 62, 217, 70, + 33, 22, 193, 226, 233, 194, 2, 234, 169, 226, 81, 144, 226, 73, 172, 39, + 90, 31, 68, 114, 56, 197, 217, 26, 84, 73, 190, 95, 112, 7, 42, 3, + 31, 122, 253, 19, 219, 182, 121, 205, 11, 137, 108, 104, 219, 44, 147, 30, + 201, 37, 21, 39, 147, 79, 12, 196, 53, 40, 230, 125, 200, 128, 146, 140, + 163, 119, 123, 94, 185, 115, 220, 251, 203, 47, 180, 254, 122, 182, 121, 85, + 122, 254, 108, 122, 248, 124, 210, 171, 190, 120, 59, 248, 235, 227, 102, 171, + 220, 126, 219, 59, 253, 148, 127, 117, 244, 110, 247, 246, 232, 182, 82, 135, + 191, 147, 195, 167, 71, 211, 227, 219, 202, 171, 218, 203, 233, 113, 243, 184, + 245, 122, 220, 218, 61, 221, 107, 110, 30, 238, 239, 87, 74, 167, 246, 159, + 207, 123, 205, 151, 229, 171, 245, 225, 222, 171, 131, 114, 189, 245, 254, 205, + 193, 122, 181, 82, 190, 254, 235, 157, 87, 191, 60, 254, 252, 236, 233, 36, + 145, 104, 189, 42, 126, 58, 216, 8, 198, 118, 125, 191, 84, 170, 61, 119, + 219, 237, 79, 239, 219, 197, 245, 227, 119, 181, 82, 97, 224, 157, 220, 22, + 95, 15, 55, 220, 97, 167, 95, 206, 85, 131, 189, 78, 227, 250, 116, 239, + 91, 240, 230, 213, 254, 244, 245, 251, 221, 66, 167, 125, 249, 109, 191, 243, + 201, 255, 84, 232, 188, 90, 95, 63, 186, 42, 186, 211, 63, 63, 215, 255, + 186, 233, 127, 107, 23, 95, 127, 131, 51, 223, 233, 167, 74, 254, 175, 70, + 231, 233, 203, 3, 127, 220, 175, 95, 181, 247, 62, 61, 27, 191, 109, 39, + 18, 253, 92, 227, 248, 77, 240, 215, 183, 230, 205, 171, 55, 135, 173, 167, + 199, 238, 233, 155, 191, 170, 181, 55, 207, 235, 147, 219, 207, 175, 247, 189, + 247, 193, 231, 79, 7, 71, 141, 143, 159, 142, 134, 183, 222, 167, 246, 56, + 223, 240, 222, 188, 56, 120, 253, 174, 209, 173, 127, 123, 83, 41, 174, 159, + 158, 188, 222, 27, 247, 170, 237, 122, 175, 250, 233, 118, 255, 221, 233, 230, + 254, 241, 179, 151, 239, 188, 241, 167, 15, 47, 114, 199, 48, 114, 126, 241, + 217, 251, 86, 190, 91, 107, 229, 55, 134, 245, 81, 51, 120, 90, 124, 245, + 1, 42, 61, 234, 174, 247, 63, 61, 61, 125, 122, 243, 178, 158, 191, 206, + 93, 222, 244, 114, 133, 92, 245, 229, 183, 205, 55, 211, 209, 135, 105, 126, + 227, 195, 231, 163, 215, 127, 21, 94, 172, 151, 26, 155, 199, 251, 254, 233, + 219, 163, 114, 227, 195, 231, 250, 135, 65, 247, 207, 253, 250, 235, 206, 100, + 112, 105, 219, 110, 238, 253, 103, 239, 246, 237, 165, 119, 89, 57, 46, 185, + 205, 147, 250, 56, 12, 19, 6, 66, 169, 248, 235, 40, 138, 233, 182, 241, + 128, 56, 184, 232, 183, 16, 96, 89, 16, 57, 212, 66, 192, 203, 117, 146, + 64, 248, 121, 197, 190, 53, 74, 157, 110, 115, 149, 248, 236, 125, 119, 12, + 91, 57, 156, 46, 95, 96, 10, 101, 118, 76, 233, 127, 165, 228, 44, 86, + 239, 255, 251, 255, 220, 45, 55, 187, 219, 12, 88, 51, 0, 22, 62, 72, + 32, 134, 40, 25, 133, 1, 171, 70, 78, 36, 74, 136, 8, 112, 189, 210, + 211, 134, 86, 2, 138, 169, 186, 67, 212, 242, 11, 246, 151, 252, 76, 252, + 15, 187, 167, 192, 123, 111, 252, 169, 76, 97, 39, 173, 214, 250, 65, 21, + 119, 71, 18, 51, 71, 130, 122, 219, 198, 55, 214, 209, 54, 237, 12, 75, + 160, 233, 213, 40, 119, 39, 164, 246, 66, 172, 143, 153, 97, 49, 61, 154, + 91, 25, 152, 7, 8, 81, 191, 91, 29, 4, 85, 67, 0, 226, 155, 48, + 149, 6, 4, 199, 0, 71, 105, 116, 199, 209, 135, 29, 26, 74, 91, 235, + 135, 124, 162, 156, 100, 198, 124, 158, 204, 186, 94, 90, 220, 79, 192, 169, + 114, 171, 137, 152, 33, 253, 212, 154, 217, 148, 25, 99, 6, 182, 129, 103, + 36, 55, 138, 192, 47, 194, 191, 45, 47, 240, 157, 160, 8, 12, 228, 150, + 239, 109, 16, 58, 71, 177, 184, 229, 7, 176, 109, 186, 235, 232, 63, 139, + 28, 135, 122, 155, 112, 138, 206, 187, 169, 8, 77, 104, 122, 91, 153, 160, + 222, 102, 224, 43, 77, 34, 84, 126, 145, 48, 86, 108, 126, 12, 191, 39, + 142, 247, 187, 169, 107, 235, 68, 238, 168, 149, 112, 30, 89, 214, 77, 151, + 76, 196, 70, 136, 85, 16, 8, 56, 44, 45, 126, 211, 101, 5, 69, 36, + 212, 248, 5, 164, 254, 210, 218, 89, 80, 116, 211, 147, 220, 24, 118, 233, + 77, 68, 143, 73, 194, 115, 234, 171, 155, 45, 164, 48, 228, 124, 13, 125, + 120, 178, 33, 215, 116, 216, 237, 185, 209, 253, 253, 248, 55, 215, 120, 235, + 192, 102, 27, 100, 208, 152, 140, 220, 131, 123, 217, 34, 188, 248, 62, 190, + 169, 123, 27, 212, 211, 238, 211, 16, 185, 70, 128, 234, 93, 208, 7, 121, + 239, 196, 90, 63, 216, 89, 55, 234, 36, 38, 232, 48, 138, 9, 242, 12, + 158, 104, 42, 156, 15, 14, 81, 48, 74, 254, 185, 129, 207, 128, 127, 116, + 157, 37, 165, 33, 49, 243, 72, 67, 97, 192, 227, 109, 70, 193, 88, 26, + 27, 24, 140, 28, 223, 15, 121, 104, 17, 23, 216, 22, 108, 152, 177, 27, + 35, 158, 95, 196, 190, 192, 212, 43, 89, 59, 206, 4, 126, 166, 240, 211, + 176, 128, 83, 38, 75, 5, 28, 18, 236, 246, 70, 218, 234, 231, 146, 92, + 12, 90, 112, 97, 184, 29, 90, 179, 6, 14, 4, 114, 165, 72, 9, 130, + 170, 181, 163, 12, 79, 196, 113, 151, 148, 26, 139, 121, 233, 191, 97, 81, + 132, 25, 35, 86, 95, 130, 194, 122, 194, 240, 200, 219, 44, 124, 185, 105, + 24, 186, 127, 156, 225, 252, 241, 113, 222, 185, 231, 79, 166, 104, 16, 119, + 86, 204, 163, 158, 18, 154, 115, 209, 162, 129, 79, 40, 212, 131, 163, 115, + 3, 93, 246, 17, 82, 81, 229, 186, 78, 140, 146, 209, 41, 95, 208, 61, + 171, 35, 68, 138, 78, 187, 139, 140, 98, 80, 189, 152, 68, 143, 83, 116, + 38, 15, 156, 85, 21, 127, 46, 6, 221, 17, 156, 88, 233, 113, 8, 204, + 73, 109, 232, 200, 35, 48, 97, 169, 150, 170, 104, 31, 97, 125, 231, 243, + 35, 235, 164, 136, 185, 83, 164, 203, 185, 51, 57, 40, 231, 226, 27, 195, + 65, 16, 93, 115, 211, 245, 219, 204, 115, 211, 73, 107, 6, 67, 142, 172, + 221, 220, 201, 88, 179, 41, 206, 49, 151, 5, 4, 116, 53, 87, 36, 203, + 113, 74, 126, 198, 43, 255, 220, 208, 62, 33, 95, 219, 63, 74, 90, 162, + 75, 143, 81, 193, 134, 191, 41, 222, 104, 193, 140, 42, 208, 21, 25, 222, + 29, 145, 249, 34, 71, 102, 3, 98, 253, 102, 108, 32, 233, 226, 183, 253, + 206, 247, 107, 90, 217, 86, 52, 38, 178, 76, 146, 65, 71, 225, 19, 190, + 51, 132, 70, 156, 69, 195, 124, 78, 58, 108, 56, 123, 81, 224, 184, 78, + 28, 180, 80, 98, 243, 156, 13, 161, 10, 135, 142, 224, 208, 56, 26, 237, + 236, 72, 107, 6, 57, 247, 223, 142, 240, 235, 160, 179, 11, 245, 165, 252, + 223, 157, 77, 255, 119, 186, 140, 149, 190, 43, 44, 26, 107, 114, 82, 252, + 213, 253, 234, 166, 120, 169, 152, 108, 205, 39, 21, 113, 68, 34, 254, 44, + 82, 56, 70, 111, 184, 120, 25, 148, 85, 66, 70, 125, 207, 88, 252, 33, + 183, 61, 147, 65, 255, 84, 200, 92, 87, 145, 200, 255, 88, 69, 98, 44, + 228, 92, 13, 150, 113, 253, 248, 110, 15, 39, 172, 188, 211, 147, 203, 154, + 22, 28, 252, 66, 107, 255, 158, 239, 240, 2, 156, 82, 0, 254, 246, 113, + 230, 201, 73, 102, 192, 156, 80, 224, 192, 52, 147, 132, 173, 154, 156, 166, + 143, 66, 107, 71, 156, 125, 105, 114, 217, 188, 96, 119, 224, 13, 202, 178, + 32, 59, 28, 158, 197, 19, 28, 149, 245, 52, 115, 83, 134, 91, 59, 74, + 211, 4, 216, 162, 155, 11, 49, 217, 66, 57, 235, 12, 62, 226, 224, 42, + 194, 191, 83, 185, 192, 248, 112, 238, 208, 209, 220, 161, 131, 185, 118, 32, + 34, 211, 72, 56, 191, 251, 217, 34, 172, 2, 17, 198, 119, 171, 25, 164, + 205, 54, 234, 80, 106, 189, 155, 68, 32, 95, 81, 1, 162, 107, 106, 246, + 27, 171, 151, 244, 44, 121, 38, 51, 57, 226, 97, 122, 158, 139, 41, 205, + 82, 157, 233, 77, 87, 0, 194, 223, 93, 135, 23, 27, 223, 109, 215, 80, + 20, 193, 154, 201, 33, 53, 34, 218, 17, 206, 180, 180, 104, 194, 203, 9, + 68, 79, 100, 84, 84, 77, 159, 144, 13, 40, 18, 62, 134, 140, 159, 111, + 123, 158, 25, 189, 242, 189, 185, 135, 228, 68, 75, 99, 7, 41, 54, 54, + 50, 38, 42, 208, 14, 103, 208, 48, 40, 52, 131, 211, 67, 37, 221, 66, + 225, 92, 178, 154, 34, 224, 16, 36, 7, 168, 188, 80, 197, 35, 164, 94, + 9, 28, 242, 98, 153, 60, 207, 70, 66, 130, 52, 163, 215, 36, 125, 135, + 73, 134, 191, 206, 36, 133, 121, 75, 247, 228, 205, 223, 147, 143, 15, 153, + 194, 202, 88, 206, 41, 186, 198, 232, 106, 35, 163, 141, 149, 140, 20, 68, + 121, 91, 140, 151, 28, 254, 109, 149, 214, 140, 18, 209, 40, 152, 146, 178, + 160, 113, 117, 20, 247, 136, 34, 197, 23, 19, 6, 91, 11, 57, 69, 164, + 164, 244, 217, 13, 209, 234, 168, 143, 161, 86, 160, 62, 20, 46, 237, 149, + 138, 10, 169, 133, 39, 146, 202, 21, 171, 127, 201, 29, 218, 118, 227, 31, + 28, 113, 169, 49, 52, 254, 205, 51, 242, 155, 155, 15, 222, 180, 154, 70, + 4, 206, 167, 111, 28, 218, 218, 201, 132, 51, 154, 32, 26, 169, 231, 169, + 226, 209, 68, 209, 131, 161, 250, 104, 161, 45, 231, 155, 174, 206, 55, 21, + 159, 253, 65, 103, 113, 97, 19, 17, 87, 11, 107, 52, 7, 195, 46, 156, + 193, 219, 171, 14, 94, 42, 82, 233, 43, 68, 33, 191, 240, 220, 245, 34, + 86, 237, 67, 212, 21, 238, 214, 82, 144, 7, 39, 60, 204, 224, 213, 109, + 187, 134, 168, 103, 63, 58, 105, 197, 189, 25, 106, 48, 76, 242, 96, 244, + 95, 163, 29, 16, 215, 8, 96, 161, 49, 207, 218, 107, 148, 7, 115, 0, + 171, 115, 33, 251, 236, 155, 116, 233, 191, 129, 58, 255, 230, 6, 107, 255, + 179, 121, 63, 185, 223, 145, 58, 92, 116, 167, 175, 73, 35, 137, 245, 158, + 9, 238, 207, 7, 174, 4, 153, 138, 231, 165, 118, 187, 100, 62, 73, 48, + 3, 66, 202, 237, 20, 254, 84, 96, 71, 114, 84, 33, 22, 183, 215, 87, + 94, 153, 41, 150, 12, 16, 162, 232, 119, 237, 110, 119, 216, 208, 162, 227, + 185, 223, 33, 147, 31, 197, 250, 241, 204, 79, 241, 138, 28, 1, 195, 57, + 50, 202, 170, 64, 80, 38, 6, 178, 5, 108, 48, 192, 48, 190, 245, 126, + 19, 185, 50, 98, 165, 126, 23, 242, 70, 224, 224, 38, 79, 197, 127, 40, + 148, 208, 197, 186, 110, 76, 170, 235, 78, 158, 137, 255, 176, 150, 73, 109, + 32, 14, 87, 44, 253, 12, 168, 114, 26, 70, 217, 0, 2, 35, 244, 181, + 22, 77, 141, 138, 104, 53, 122, 110, 25, 200, 254, 193, 254, 61, 80, 67, + 17, 186, 17, 162, 182, 103, 150, 213, 8, 66, 120, 29, 63, 65, 232, 33, + 115, 140, 103, 130, 102, 41, 156, 53, 75, 76, 244, 40, 138, 174, 154, 225, + 20, 244, 21, 89, 226, 28, 135, 205, 145, 19, 19, 168, 50, 153, 172, 105, + 53, 75, 24, 160, 16, 63, 241, 158, 218, 138, 42, 161, 215, 102, 9, 1, + 229, 172, 168, 73, 145, 5, 136, 165, 218, 108, 168, 163, 165, 205, 28, 99, + 209, 41, 26, 3, 96, 67, 232, 170, 207, 246, 252, 57, 202, 246, 20, 181, + 64, 110, 144, 218, 67, 106, 94, 249, 185, 96, 51, 173, 1, 186, 162, 167, + 19, 214, 98, 106, 217, 194, 229, 12, 235, 43, 51, 36, 181, 110, 216, 232, + 112, 153, 50, 250, 133, 162, 158, 213, 187, 163, 178, 168, 175, 148, 11, 149, + 97, 180, 76, 171, 43, 140, 198, 130, 107, 114, 221, 88, 46, 255, 174, 126, + 137, 25, 176, 170, 121, 190, 168, 201, 70, 164, 217, 74, 68, 125, 21, 8, + 150, 204, 204, 118, 71, 102, 78, 70, 204, 138, 116, 197, 218, 152, 231, 84, + 18, 214, 91, 43, 156, 35, 62, 110, 38, 143, 147, 17, 111, 95, 109, 175, + 136, 55, 188, 153, 60, 114, 135, 5, 241, 216, 152, 103, 138, 115, 4, 32, + 236, 53, 224, 116, 4, 137, 29, 62, 214, 144, 30, 190, 35, 128, 62, 100, + 124, 22, 14, 36, 122, 52, 47, 1, 45, 122, 33, 86, 200, 31, 160, 45, + 249, 76, 198, 63, 23, 104, 33, 81, 107, 76, 165, 132, 71, 55, 243, 66, + 93, 157, 252, 118, 209, 84, 82, 1, 83, 10, 104, 204, 201, 186, 223, 61, + 199, 9, 71, 154, 217, 175, 225, 179, 195, 241, 189, 197, 128, 167, 64, 5, + 88, 119, 80, 158, 9, 86, 156, 148, 163, 237, 101, 31, 183, 23, 182, 50, + 214, 181, 17, 98, 205, 216, 9, 169, 29, 25, 79, 30, 91, 166, 16, 228, + 23, 244, 118, 133, 121, 223, 224, 197, 41, 152, 19, 220, 170, 243, 142, 208, + 89, 128, 47, 155, 74, 231, 115, 254, 134, 176, 59, 136, 74, 89, 143, 151, + 178, 233, 27, 139, 88, 252, 15, 44, 200, 91, 104, 143, 7, 13, 210, 72, + 7, 21, 150, 193, 179, 63, 241, 16, 240, 87, 47, 17, 38, 33, 150, 153, + 33, 47, 229, 11, 229, 46, 180, 208, 131, 38, 106, 164, 74, 107, 36, 140, + 188, 94, 166, 231, 174, 106, 166, 191, 208, 76, 31, 154, 25, 81, 65, 173, + 52, 92, 76, 241, 54, 186, 238, 234, 18, 23, 26, 232, 227, 24, 74, 26, + 75, 5, 250, 92, 96, 161, 184, 170, 207, 17, 211, 172, 62, 189, 176, 125, + 129, 23, 70, 141, 49, 255, 13, 146, 253, 51, 215, 37, 253, 118, 140, 102, + 152, 79, 24, 99, 76, 31, 106, 224, 126, 233, 10, 11, 122, 128, 232, 218, + 2, 122, 85, 222, 56, 186, 100, 232, 250, 187, 88, 133, 180, 58, 85, 156, + 39, 226, 232, 162, 49, 207, 177, 69, 63, 2, 145, 46, 10, 249, 34, 33, + 85, 205, 34, 179, 102, 212, 255, 165, 253, 48, 79, 96, 85, 228, 137, 17, + 235, 20, 32, 173, 75, 32, 212, 87, 89, 86, 46, 78, 226, 196, 26, 19, + 158, 212, 44, 233, 21, 51, 13, 5, 45, 229, 57, 168, 63, 168, 14, 235, + 228, 126, 208, 198, 100, 13, 252, 45, 12, 240, 16, 55, 17, 127, 34, 110, + 181, 59, 170, 55, 86, 114, 170, 24, 97, 194, 55, 232, 12, 46, 187, 125, + 141, 95, 165, 240, 95, 201, 171, 98, 5, 25, 85, 241, 207, 65, 147, 254, + 156, 114, 237, 77, 87, 217, 247, 163, 162, 43, 194, 136, 145, 89, 229, 160, + 215, 237, 160, 148, 133, 191, 242, 3, 11, 83, 229, 80, 169, 168, 31, 81, + 106, 181, 168, 132, 1, 66, 53, 176, 39, 8, 5, 123, 138, 56, 159, 173, + 102, 229, 26, 78, 130, 100, 110, 241, 3, 7, 215, 234, 250, 32, 250, 52, + 113, 124, 207, 255, 31, 40, 213, 182, 224, 107, 2, 27, 93, 239, 215, 106, + 112, 28, 237, 118, 46, 75, 205, 150, 57, 172, 13, 134, 52, 50, 126, 149, + 116, 109, 73, 205, 232, 50, 242, 35, 186, 168, 120, 139, 216, 242, 145, 158, + 200, 23, 105, 154, 169, 20, 46, 130, 7, 40, 145, 218, 164, 246, 66, 76, + 187, 210, 96, 21, 106, 1, 164, 95, 186, 164, 88, 74, 83, 206, 124, 47, + 167, 220, 178, 90, 233, 139, 21, 139, 97, 73, 169, 180, 212, 235, 193, 23, + 37, 197, 77, 210, 44, 197, 176, 197, 140, 164, 79, 61, 36, 93, 81, 154, + 24, 205, 85, 10, 166, 95, 58, 58, 214, 237, 128, 63, 90, 15, 189, 215, + 51, 16, 173, 42, 141, 167, 28, 94, 131, 13, 106, 56, 45, 198, 95, 58, + 170, 88, 129, 210, 81, 234, 215, 34, 165, 82, 152, 108, 229, 169, 116, 102, + 33, 80, 119, 85, 105, 145, 66, 169, 60, 210, 46, 43, 150, 246, 27, 93, + 84, 242, 139, 235, 139, 162, 47, 50, 196, 70, 246, 178, 5, 158, 154, 89, + 179, 224, 249, 116, 7, 84, 22, 8, 168, 82, 81, 57, 210, 163, 28, 147, + 67, 128, 213, 186, 195, 135, 4, 27, 98, 142, 189, 187, 147, 44, 124, 49, + 101, 200, 161, 182, 29, 114, 4, 199, 251, 147, 212, 203, 36, 151, 151, 49, + 13, 199, 57, 118, 200, 21, 221, 65, 143, 113, 164, 4, 137, 88, 245, 164, + 222, 8, 195, 51, 44, 65, 52, 155, 41, 178, 163, 6, 180, 199, 131, 109, + 99, 134, 246, 119, 115, 116, 213, 196, 137, 156, 153, 120, 200, 112, 132, 17, + 169, 133, 102, 130, 8, 113, 44, 0, 126, 4, 78, 57, 120, 96, 192, 154, + 77, 123, 27, 65, 94, 17, 21, 54, 139, 134, 155, 51, 200, 138, 74, 222, + 1, 229, 252, 29, 205, 91, 168, 56, 3, 181, 154, 102, 100, 89, 79, 165, + 161, 117, 36, 9, 132, 241, 21, 121, 84, 254, 46, 115, 253, 96, 36, 111, + 138, 4, 121, 129, 196, 205, 164, 181, 227, 160, 29, 41, 63, 121, 172, 10, + 155, 229, 189, 78, 92, 141, 100, 113, 212, 37, 67, 224, 177, 169, 137, 148, + 13, 123, 56, 172, 212, 75, 28, 70, 140, 100, 43, 68, 124, 30, 207, 105, + 44, 57, 98, 58, 79, 139, 22, 81, 92, 99, 78, 248, 123, 108, 163, 147, + 243, 109, 140, 99, 243, 24, 42, 140, 221, 6, 176, 205, 142, 140, 37, 139, + 24, 25, 203, 14, 55, 108, 52, 106, 138, 71, 176, 227, 141, 12, 69, 196, + 202, 99, 7, 28, 153, 21, 57, 200, 17, 135, 189, 156, 3, 198, 159, 119, + 244, 5, 151, 28, 116, 74, 117, 159, 241, 255, 52, 113, 57, 25, 57, 45, + 66, 176, 169, 31, 39, 197, 18, 201, 125, 17, 97, 83, 253, 48, 233, 98, + 137, 34, 21, 30, 24, 238, 175, 122, 41, 225, 93, 21, 107, 9, 21, 116, + 10, 47, 155, 56, 172, 159, 39, 222, 105, 90, 252, 252, 2, 215, 87, 239, + 210, 114, 149, 53, 162, 162, 76, 86, 155, 112, 248, 238, 101, 87, 8, 224, + 32, 242, 33, 110, 14, 188, 120, 148, 39, 121, 192, 177, 103, 18, 248, 0, + 139, 234, 132, 86, 34, 119, 20, 147, 205, 35, 37, 156, 69, 21, 216, 171, + 210, 152, 226, 200, 164, 200, 221, 190, 24, 55, 171, 195, 198, 182, 15, 163, + 183, 125, 209, 168, 33, 103, 42, 94, 202, 176, 255, 12, 182, 195, 141, 85, + 204, 212, 203, 168, 16, 169, 107, 17, 43, 151, 152, 41, 70, 61, 129, 131, + 254, 14, 129, 1, 91, 30, 20, 76, 15, 51, 63, 244, 2, 25, 234, 171, + 208, 32, 44, 200, 192, 0, 234, 253, 133, 48, 41, 81, 243, 255, 41, 80, + 60, 110, 170, 245, 110, 169, 37, 45, 27, 8, 60, 189, 73, 91, 28, 243, + 41, 108, 81, 76, 113, 64, 63, 154, 237, 81, 219, 236, 140, 218, 101, 186, + 136, 149, 133, 208, 72, 75, 182, 139, 97, 107, 161, 89, 142, 57, 104, 182, + 123, 173, 41, 110, 113, 196, 90, 9, 3, 14, 72, 4, 223, 125, 111, 52, + 52, 75, 178, 0, 82, 142, 194, 205, 16, 57, 180, 10, 108, 192, 48, 102, + 176, 123, 215, 74, 80, 75, 7, 74, 64, 220, 180, 33, 54, 11, 47, 14, + 123, 144, 144, 20, 92, 75, 67, 153, 191, 85, 67, 73, 15, 78, 20, 42, + 65, 244, 101, 128, 125, 17, 126, 142, 176, 159, 140, 45, 8, 165, 160, 57, + 8, 116, 160, 169, 58, 0, 155, 60, 176, 1, 192, 59, 116, 167, 102, 11, + 5, 225, 125, 148, 166, 14, 176, 32, 129, 252, 47, 53, 153, 69, 35, 7, + 217, 187, 21, 98, 150, 112, 241, 149, 61, 74, 78, 214, 161, 6, 140, 6, + 107, 21, 171, 169, 156, 199, 45, 242, 141, 113, 30, 20, 78, 47, 93, 234, + 107, 11, 7, 0, 191, 212, 74, 190, 85, 165, 31, 148, 224, 91, 14, 58, + 165, 222, 160, 209, 29, 202, 113, 146, 248, 246, 119, 234, 219, 252, 231, 216, + 215, 132, 97, 1, 93, 244, 35, 144, 80, 50, 208, 149, 64, 129, 16, 21, + 8, 16, 116, 25, 98, 176, 154, 47, 142, 131, 65, 138, 3, 64, 81, 243, + 226, 58, 31, 199, 248, 66, 95, 216, 68, 18, 178, 4, 227, 140, 88, 109, + 184, 213, 107, 0, 196, 30, 123, 114, 67, 162, 170, 172, 114, 241, 208, 166, + 80, 74, 201, 182, 82, 2, 72, 206, 211, 172, 116, 76, 230, 91, 44, 150, + 52, 164, 64, 198, 211, 52, 10, 76, 168, 16, 251, 32, 10, 44, 183, 70, + 125, 168, 205, 44, 58, 104, 140, 252, 109, 68, 142, 47, 8, 232, 39, 30, + 15, 212, 220, 24, 52, 76, 84, 4, 65, 181, 21, 250, 131, 102, 54, 57, + 252, 147, 199, 63, 230, 6, 27, 222, 244, 165, 240, 140, 85, 40, 232, 126, + 93, 83, 254, 101, 92, 77, 215, 192, 17, 146, 207, 240, 181, 171, 56, 26, + 4, 5, 234, 161, 128, 162, 87, 163, 56, 84, 105, 136, 222, 66, 169, 125, + 109, 233, 25, 12, 27, 216, 35, 57, 254, 25, 225, 222, 101, 22, 20, 221, + 156, 21, 0, 179, 180, 19, 70, 192, 192, 12, 125, 97, 218, 143, 162, 48, + 228, 195, 88, 162, 119, 70, 31, 40, 250, 155, 86, 88, 222, 43, 220, 4, + 172, 112, 157, 103, 155, 59, 236, 103, 70, 232, 157, 71, 42, 173, 60, 2, + 154, 18, 110, 4, 145, 169, 31, 200, 233, 148, 164, 245, 93, 97, 7, 207, + 176, 0, 186, 239, 165, 135, 149, 18, 54, 109, 3, 73, 190, 35, 186, 130, + 218, 8, 84, 80, 34, 149, 96, 11, 70, 109, 144, 93, 117, 141, 27, 213, + 103, 216, 67, 81, 97, 194, 78, 104, 17, 142, 184, 11, 103, 206, 184, 152, + 183, 245, 76, 115, 39, 240, 157, 89, 82, 15, 66, 181, 223, 0, 88, 10, + 54, 190, 138, 62, 165, 188, 70, 140, 39, 37, 120, 182, 127, 161, 135, 10, + 151, 199, 47, 24, 49, 133, 219, 24, 174, 103, 178, 233, 92, 37, 161, 214, + 48, 108, 226, 222, 142, 144, 158, 234, 17, 81, 59, 181, 23, 78, 5, 252, + 48, 159, 95, 155, 3, 86, 253, 18, 108, 128, 38, 68, 69, 213, 164, 248, + 4, 86, 236, 210, 220, 236, 138, 33, 165, 221, 51, 90, 249, 217, 94, 167, + 190, 210, 49, 167, 48, 238, 17, 140, 21, 206, 108, 92, 40, 56, 123, 68, + 39, 248, 93, 44, 35, 75, 173, 162, 197, 53, 36, 203, 142, 49, 232, 200, + 159, 75, 223, 156, 192, 112, 39, 208, 166, 140, 77, 192, 18, 233, 132, 34, + 43, 137, 156, 192, 19, 76, 37, 136, 243, 86, 201, 166, 90, 178, 134, 72, + 214, 224, 100, 88, 217, 34, 40, 255, 142, 203, 29, 16, 13, 191, 108, 117, + 187, 138, 78, 178, 201, 128, 92, 5, 153, 197, 172, 70, 108, 217, 146, 159, + 64, 141, 12, 204, 146, 205, 129, 237, 193, 17, 108, 110, 198, 230, 23, 250, + 152, 211, 166, 45, 76, 76, 87, 56, 49, 230, 209, 88, 170, 228, 190, 38, + 121, 102, 24, 34, 131, 74, 24, 169, 131, 29, 15, 150, 51, 127, 9, 145, + 94, 35, 96, 60, 9, 141, 123, 74, 115, 23, 81, 155, 35, 239, 105, 50, + 253, 142, 217, 110, 226, 5, 125, 22, 142, 102, 141, 80, 141, 50, 144, 107, + 115, 96, 102, 80, 50, 97, 18, 223, 97, 61, 50, 251, 184, 241, 52, 152, + 216, 139, 92, 16, 199, 216, 42, 20, 133, 243, 147, 136, 175, 154, 53, 89, + 7, 42, 192, 145, 224, 99, 28, 250, 101, 148, 20, 147, 229, 38, 102, 108, + 149, 160, 246, 154, 131, 171, 37, 57, 113, 80, 141, 223, 153, 56, 227, 148, + 211, 132, 101, 54, 232, 246, 135, 50, 165, 237, 76, 76, 189, 40, 46, 137, + 167, 166, 29, 146, 197, 34, 124, 169, 140, 199, 135, 101, 97, 253, 79, 205, + 140, 166, 133, 177, 72, 153, 188, 59, 46, 215, 223, 44, 112, 247, 194, 188, + 114, 33, 144, 84, 147, 24, 206, 31, 136, 9, 3, 206, 254, 136, 152, 60, + 195, 187, 12, 115, 153, 164, 24, 126, 209, 117, 54, 216, 193, 22, 178, 161, + 104, 7, 97, 138, 139, 217, 154, 249, 26, 222, 30, 37, 72, 104, 90, 8, + 72, 68, 75, 55, 168, 241, 82, 16, 133, 3, 98, 89, 141, 84, 183, 209, + 192, 50, 19, 109, 89, 106, 66, 89, 37, 45, 219, 110, 136, 137, 3, 84, + 205, 238, 159, 201, 12, 142, 202, 10, 221, 205, 163, 245, 44, 186, 146, 223, + 177, 9, 5, 115, 49, 192, 176, 117, 251, 143, 164, 28, 30, 37, 36, 150, + 195, 164, 137, 138, 103, 214, 78, 206, 47, 204, 157, 44, 31, 0, 229, 6, + 40, 233, 43, 77, 34, 137, 140, 17, 51, 104, 208, 244, 146, 20, 94, 228, + 195, 190, 103, 244, 86, 38, 208, 180, 21, 93, 21, 120, 195, 194, 159, 16, + 44, 63, 135, 182, 106, 135, 246, 12, 182, 238, 32, 199, 96, 75, 44, 150, + 249, 196, 104, 143, 27, 172, 122, 68, 206, 218, 144, 149, 9, 208, 119, 142, + 80, 188, 101, 139, 99, 150, 160, 88, 144, 20, 13, 39, 151, 31, 51, 249, + 133, 23, 87, 202, 244, 197, 143, 71, 44, 18, 240, 95, 192, 104, 172, 37, + 49, 149, 61, 205, 76, 82, 185, 164, 159, 30, 167, 214, 132, 155, 94, 51, + 160, 175, 157, 53, 53, 139, 29, 142, 112, 217, 111, 195, 26, 46, 188, 199, + 143, 147, 143, 104, 167, 250, 254, 253, 17, 238, 82, 244, 135, 54, 37, 241, + 228, 165, 82, 88, 103, 174, 8, 68, 110, 45, 222, 11, 172, 56, 237, 102, + 215, 17, 9, 139, 31, 3, 129, 41, 21, 160, 14, 36, 132, 224, 175, 28, + 28, 209, 83, 119, 135, 187, 28, 67, 33, 168, 180, 154, 154, 199, 192, 24, + 35, 16, 142, 22, 48, 147, 131, 10, 80, 221, 85, 231, 218, 155, 102, 127, + 8, 60, 165, 169, 18, 169, 107, 130, 40, 228, 23, 94, 21, 124, 92, 172, + 254, 225, 199, 211, 133, 243, 212, 65, 231, 170, 59, 21, 93, 170, 141, 31, + 253, 79, 71, 193, 91, 117, 18, 66, 205, 244, 79, 161, 87, 112, 205, 23, + 97, 80, 112, 141, 77, 23, 21, 177, 227, 234, 226, 69, 22, 248, 184, 235, + 191, 107, 254, 244, 8, 71, 160, 103, 216, 245, 44, 115, 224, 133, 37, 151, + 88, 95, 133, 197, 126, 6, 21, 82, 130, 192, 53, 228, 73, 228, 12, 50, + 18, 162, 167, 217, 225, 199, 76, 158, 148, 82, 92, 179, 194, 239, 172, 48, + 130, 18, 87, 207, 245, 157, 130, 183, 229, 229, 55, 81, 127, 192, 241, 252, + 252, 22, 6, 229, 129, 11, 216, 210, 1, 241, 22, 180, 252, 7, 232, 58, + 133, 144, 52, 251, 89, 29, 58, 148, 60, 26, 14, 152, 217, 239, 200, 186, + 176, 59, 132, 130, 73, 55, 105, 217, 44, 58, 33, 22, 143, 209, 25, 77, + 115, 200, 104, 125, 114, 172, 23, 84, 226, 218, 100, 205, 132, 51, 221, 132, + 98, 39, 122, 132, 103, 79, 236, 105, 122, 172, 69, 119, 47, 47, 241, 180, + 175, 39, 66, 170, 51, 93, 227, 173, 8, 26, 96, 30, 225, 111, 216, 98, + 143, 230, 42, 85, 64, 134, 147, 184, 101, 161, 110, 140, 104, 198, 114, 59, + 146, 211, 156, 245, 2, 118, 100, 46, 172, 29, 37, 200, 11, 156, 207, 181, + 114, 8, 91, 126, 198, 162, 42, 182, 144, 25, 216, 9, 203, 8, 21, 106, + 39, 167, 153, 50, 94, 228, 22, 114, 104, 219, 7, 207, 206, 148, 222, 202, + 72, 128, 240, 20, 156, 53, 146, 155, 197, 175, 94, 17, 17, 19, 83, 102, + 210, 253, 234, 187, 240, 131, 99, 30, 169, 8, 45, 12, 51, 124, 185, 175, + 129, 143, 202, 208, 240, 80, 204, 115, 206, 187, 83, 107, 49, 154, 65, 134, + 177, 160, 46, 15, 147, 167, 218, 39, 157, 162, 160, 138, 86, 118, 110, 54, + 95, 16, 151, 155, 234, 65, 104, 17, 101, 228, 19, 43, 132, 207, 172, 79, + 180, 41, 90, 47, 208, 27, 144, 116, 178, 138, 101, 65, 81, 70, 18, 27, + 88, 20, 154, 219, 214, 39, 254, 28, 84, 37, 219, 214, 145, 185, 128, 123, + 151, 185, 128, 36, 70, 127, 42, 98, 68, 64, 144, 225, 204, 250, 14, 36, + 218, 13, 230, 198, 164, 141, 135, 164, 30, 186, 34, 178, 147, 227, 12, 54, + 2, 182, 100, 18, 68, 7, 89, 47, 109, 13, 81, 66, 45, 210, 52, 48, + 77, 67, 165, 65, 41, 182, 143, 218, 240, 152, 102, 196, 73, 100, 17, 84, + 128, 143, 251, 22, 70, 222, 136, 72, 145, 151, 114, 110, 102, 215, 57, 178, + 164, 46, 51, 110, 28, 107, 164, 144, 22, 25, 241, 85, 27, 10, 118, 3, + 14, 188, 102, 137, 166, 45, 98, 47, 78, 218, 118, 243, 108, 227, 28, 7, + 143, 30, 61, 239, 124, 190, 37, 159, 215, 181, 240, 252, 249, 252, 235, 204, + 154, 226, 243, 38, 5, 211, 163, 231, 83, 114, 126, 222, 208, 194, 11, 231, + 243, 20, 47, 54, 26, 116, 158, 200, 62, 76, 119, 123, 92, 234, 247, 112, + 101, 42, 87, 167, 89, 129, 15, 34, 60, 213, 225, 170, 108, 225, 106, 33, + 224, 26, 49, 211, 241, 240, 223, 226, 229, 172, 125, 63, 195, 22, 129, 103, + 56, 235, 207, 129, 113, 110, 41, 239, 165, 98, 17, 197, 60, 91, 180, 165, + 199, 82, 61, 161, 54, 21, 16, 35, 151, 228, 66, 92, 42, 112, 26, 107, + 59, 237, 16, 53, 73, 197, 46, 158, 218, 106, 238, 180, 255, 104, 62, 201, + 180, 121, 33, 78, 93, 195, 22, 216, 60, 72, 16, 201, 15, 32, 9, 205, + 41, 210, 51, 210, 103, 83, 215, 153, 122, 170, 22, 178, 104, 21, 143, 70, + 95, 54, 194, 17, 137, 96, 26, 167, 173, 23, 226, 82, 9, 57, 73, 56, + 199, 216, 59, 80, 132, 144, 130, 156, 9, 18, 115, 142, 130, 205, 10, 138, + 252, 32, 124, 74, 7, 218, 6, 217, 18, 138, 193, 157, 156, 75, 203, 4, + 30, 195, 137, 65, 193, 11, 181, 73, 137, 6, 127, 165, 227, 16, 237, 2, + 146, 179, 181, 167, 135, 237, 122, 80, 93, 99, 103, 142, 199, 115, 199, 58, + 78, 25, 118, 233, 172, 5, 133, 98, 75, 240, 240, 208, 166, 38, 169, 64, + 79, 4, 182, 38, 84, 110, 116, 89, 101, 222, 18, 113, 53, 96, 194, 29, + 179, 38, 5, 57, 71, 156, 154, 54, 170, 207, 29, 71, 34, 154, 137, 209, + 190, 137, 190, 8, 156, 149, 20, 177, 175, 76, 111, 39, 81, 126, 207, 152, + 158, 101, 10, 25, 46, 188, 20, 61, 18, 17, 96, 7, 2, 136, 215, 22, + 51, 14, 201, 178, 116, 130, 95, 157, 49, 121, 166, 214, 2, 26, 204, 15, + 122, 106, 44, 132, 115, 69, 225, 182, 171, 45, 43, 209, 203, 36, 142, 118, + 201, 254, 231, 161, 184, 199, 5, 52, 113, 247, 53, 60, 76, 113, 157, 162, + 201, 38, 238, 52, 248, 192, 205, 187, 136, 215, 237, 63, 50, 244, 16, 244, + 204, 20, 248, 49, 104, 50, 243, 119, 241, 48, 161, 170, 149, 76, 34, 201, + 248, 187, 151, 38, 198, 19, 107, 8, 127, 127, 169, 145, 233, 66, 157, 63, + 113, 103, 113, 215, 109, 5, 223, 80, 32, 167, 55, 228, 187, 9, 230, 197, + 202, 205, 122, 189, 134, 254, 136, 80, 187, 3, 161, 47, 202, 77, 152, 154, + 245, 102, 165, 212, 146, 69, 12, 166, 131, 97, 141, 148, 88, 178, 230, 105, + 119, 100, 178, 207, 88, 190, 79, 128, 151, 110, 229, 154, 164, 254, 53, 20, + 30, 195, 192, 195, 144, 225, 229, 64, 165, 164, 92, 205, 14, 122, 80, 107, + 213, 228, 211, 169, 188, 239, 200, 154, 207, 208, 136, 168, 4, 201, 209, 223, + 45, 103, 231, 230, 85, 85, 198, 102, 123, 212, 2, 98, 95, 235, 142, 6, + 173, 41, 107, 9, 244, 16, 51, 69, 134, 148, 167, 12, 103, 197, 77, 116, + 240, 69, 230, 173, 151, 154, 29, 179, 141, 103, 221, 168, 120, 20, 231, 87, + 74, 67, 13, 254, 243, 161, 151, 17, 156, 75, 20, 3, 5, 83, 183, 87, + 42, 140, 175, 202, 206, 156, 178, 238, 28, 248, 191, 235, 93, 3, 193, 62, + 111, 10, 44, 80, 148, 26, 17, 12, 62, 6, 94, 226, 131, 203, 112, 246, + 194, 126, 150, 40, 69, 19, 97, 216, 61, 163, 137, 136, 52, 168, 87, 130, + 242, 114, 33, 42, 47, 195, 196, 147, 207, 52, 160, 97, 193, 117, 141, 177, + 132, 117, 191, 195, 164, 17, 117, 90, 196, 210, 248, 19, 151, 198, 34, 246, + 73, 146, 241, 243, 73, 1, 155, 177, 244, 83, 166, 29, 131, 154, 207, 202, + 141, 192, 110, 34, 243, 6, 164, 250, 49, 169, 143, 154, 77, 20, 110, 32, + 103, 157, 249, 174, 116, 208, 110, 16, 37, 78, 98, 101, 161, 176, 82, 151, + 85, 134, 161, 116, 76, 71, 237, 223, 113, 141, 78, 57, 156, 141, 210, 235, + 17, 226, 113, 167, 76, 154, 3, 152, 149, 13, 176, 24, 248, 200, 30, 37, + 51, 121, 39, 47, 52, 7, 80, 114, 201, 64, 151, 105, 210, 103, 181, 37, + 144, 182, 17, 146, 87, 3, 246, 8, 5, 47, 168, 240, 171, 134, 82, 132, + 146, 118, 4, 14, 59, 186, 219, 155, 145, 134, 130, 196, 86, 178, 166, 24, + 208, 160, 0, 134, 19, 69, 107, 84, 20, 123, 147, 128, 132, 7, 93, 168, + 244, 73, 217, 55, 134, 101, 160, 217, 66, 15, 50, 195, 67, 67, 222, 197, + 57, 67, 38, 132, 237, 50, 73, 198, 77, 14, 74, 208, 154, 131, 156, 87, + 76, 179, 56, 41, 7, 199, 35, 50, 59, 178, 197, 188, 48, 32, 29, 110, + 221, 196, 41, 164, 207, 60, 109, 44, 9, 135, 212, 184, 60, 115, 17, 132, + 207, 53, 181, 25, 34, 156, 160, 185, 166, 54, 67, 76, 53, 67, 112, 227, + 130, 57, 37, 38, 150, 208, 211, 68, 157, 18, 248, 26, 134, 22, 135, 144, + 172, 14, 73, 10, 152, 55, 31, 145, 150, 36, 33, 142, 247, 69, 188, 199, + 246, 196, 41, 118, 209, 11, 105, 242, 98, 52, 3, 102, 31, 133, 100, 84, + 75, 93, 212, 83, 23, 224, 140, 23, 156, 107, 22, 19, 228, 221, 129, 62, + 129, 67, 227, 142, 19, 107, 29, 15, 156, 232, 204, 142, 58, 130, 124, 116, + 97, 206, 104, 135, 212, 104, 225, 179, 32, 56, 231, 147, 39, 240, 53, 103, + 204, 82, 228, 240, 147, 122, 89, 207, 192, 191, 209, 236, 51, 186, 189, 82, + 37, 68, 39, 156, 194, 248, 135, 191, 88, 174, 224, 146, 40, 153, 69, 72, + 5, 87, 126, 73, 102, 173, 163, 57, 147, 98, 231, 86, 17, 210, 185, 110, + 69, 232, 21, 208, 140, 89, 253, 117, 209, 125, 93, 9, 65, 88, 188, 205, + 34, 140, 195, 29, 153, 92, 145, 201, 141, 101, 10, 124, 135, 44, 137, 239, + 200, 37, 106, 138, 87, 68, 7, 224, 0, 181, 58, 4, 242, 220, 159, 205, + 27, 188, 2, 103, 178, 27, 73, 62, 191, 116, 18, 95, 140, 196, 59, 218, + 122, 158, 200, 197, 71, 206, 119, 34, 233, 166, 154, 58, 192, 132, 160, 197, + 10, 161, 210, 178, 218, 150, 206, 205, 24, 209, 61, 72, 150, 175, 64, 104, + 143, 239, 65, 173, 17, 24, 236, 35, 109, 0, 127, 247, 220, 148, 160, 96, + 176, 168, 154, 192, 255, 68, 147, 148, 13, 201, 184, 214, 168, 1, 194, 26, + 11, 89, 147, 162, 27, 17, 66, 27, 102, 235, 223, 117, 207, 64, 46, 53, + 86, 49, 42, 20, 177, 8, 217, 205, 129, 191, 144, 93, 249, 83, 171, 245, + 103, 156, 208, 160, 77, 178, 104, 114, 79, 34, 11, 17, 95, 177, 0, 137, + 241, 67, 253, 213, 203, 82, 85, 22, 212, 236, 228, 186, 163, 213, 166, 88, + 255, 19, 228, 94, 9, 225, 48, 24, 145, 156, 20, 196, 118, 108, 252, 137, + 108, 109, 8, 163, 238, 216, 109, 61, 42, 125, 151, 241, 222, 55, 43, 124, + 5, 123, 43, 164, 249, 116, 123, 206, 215, 250, 190, 43, 228, 190, 89, 113, + 103, 189, 174, 5, 184, 194, 45, 138, 175, 39, 245, 11, 191, 59, 248, 227, + 41, 39, 46, 25, 31, 141, 210, 133, 98, 188, 0, 226, 240, 72, 227, 128, + 81, 24, 8, 189, 33, 96, 201, 26, 27, 163, 25, 74, 244, 198, 206, 233, + 53, 7, 214, 82, 254, 6, 63, 134, 130, 111, 214, 128, 179, 239, 195, 205, + 230, 49, 146, 160, 217, 58, 207, 64, 243, 38, 92, 119, 13, 196, 81, 128, + 31, 96, 212, 70, 192, 12, 151, 208, 182, 137, 231, 84, 228, 1, 76, 93, + 240, 203, 139, 75, 132, 157, 226, 253, 51, 57, 206, 80, 96, 10, 17, 58, + 17, 107, 74, 4, 55, 50, 68, 242, 56, 152, 78, 90, 177, 44, 212, 122, + 244, 72, 65, 34, 16, 148, 113, 164, 86, 148, 64, 221, 194, 84, 44, 69, + 41, 104, 233, 134, 118, 8, 123, 138, 31, 51, 88, 240, 120, 49, 8, 135, + 14, 184, 25, 208, 187, 141, 190, 24, 238, 238, 158, 25, 179, 121, 80, 69, + 160, 203, 11, 89, 66, 230, 199, 37, 216, 112, 18, 38, 208, 44, 96, 63, + 62, 219, 220, 63, 58, 137, 90, 167, 54, 247, 3, 222, 232, 148, 206, 134, + 67, 196, 168, 25, 139, 214, 2, 4, 150, 138, 54, 74, 202, 166, 236, 193, + 71, 206, 159, 244, 178, 243, 207, 241, 194, 205, 165, 139, 108, 190, 36, 226, + 251, 165, 232, 170, 223, 119, 31, 108, 243, 33, 204, 114, 165, 158, 138, 164, + 251, 8, 157, 88, 107, 149, 251, 93, 36, 231, 23, 87, 163, 22, 218, 251, + 65, 202, 239, 176, 62, 231, 206, 69, 197, 237, 227, 175, 37, 188, 164, 35, + 149, 45, 247, 18, 243, 72, 93, 236, 62, 238, 14, 177, 50, 21, 174, 163, + 59, 119, 80, 105, 207, 205, 6, 222, 58, 62, 6, 33, 9, 0, 127, 221, + 30, 114, 103, 27, 87, 111, 40, 11, 59, 9, 131, 216, 153, 183, 221, 110, + 27, 25, 134, 126, 173, 254, 192, 189, 228, 41, 170, 217, 153, 221, 78, 165, + 22, 63, 172, 97, 73, 176, 173, 84, 134, 221, 254, 63, 35, 239, 250, 73, + 47, 218, 67, 122, 125, 224, 50, 213, 209, 238, 18, 193, 58, 225, 140, 94, + 233, 118, 251, 213, 102, 7, 213, 241, 255, 209, 153, 45, 193, 194, 13, 212, + 112, 197, 31, 23, 117, 186, 162, 207, 124, 65, 213, 12, 76, 203, 91, 8, + 239, 149, 90, 53, 56, 230, 34, 133, 131, 109, 141, 137, 135, 198, 42, 1, + 173, 177, 32, 220, 193, 95, 102, 148, 13, 213, 186, 157, 175, 120, 247, 86, + 116, 44, 207, 33, 29, 7, 212, 72, 19, 122, 218, 252, 22, 144, 162, 131, + 114, 207, 133, 235, 23, 93, 76, 154, 170, 192, 85, 55, 224, 52, 13, 222, + 193, 199, 168, 132, 201, 4, 84, 242, 127, 220, 12, 130, 19, 102, 248, 197, + 207, 4, 240, 226, 152, 21, 55, 76, 66, 109, 86, 144, 74, 72, 7, 138, + 247, 22, 27, 77, 180, 31, 149, 77, 74, 73, 227, 112, 6, 76, 122, 131, + 68, 134, 124, 133, 32, 84, 19, 241, 228, 40, 206, 8, 164, 129, 1, 155, + 9, 112, 231, 71, 76, 48, 241, 0, 146, 193, 32, 167, 121, 150, 199, 39, + 239, 92, 64, 17, 28, 109, 23, 238, 252, 28, 236, 156, 115, 229, 71, 49, + 209, 215, 155, 199, 29, 76, 206, 168, 193, 115, 123, 6, 191, 210, 73, 106, + 240, 60, 195, 97, 169, 156, 53, 158, 111, 125, 49, 40, 137, 135, 73, 60, + 145, 36, 224, 36, 30, 38, 105, 204, 183, 100, 25, 73, 44, 196, 182, 142, + 82, 43, 11, 146, 197, 36, 177, 156, 40, 85, 188, 172, 148, 184, 246, 134, + 221, 20, 91, 233, 26, 151, 154, 27, 5, 135, 21, 33, 160, 119, 180, 236, + 249, 163, 194, 10, 115, 16, 218, 182, 98, 134, 230, 61, 159, 150, 214, 111, + 5, 61, 133, 138, 47, 156, 21, 159, 152, 138, 210, 62, 228, 131, 202, 203, + 38, 52, 112, 6, 165, 59, 61, 91, 118, 238, 16, 161, 25, 10, 77, 36, + 225, 213, 193, 100, 145, 161, 177, 242, 243, 61, 17, 189, 76, 102, 252, 45, + 248, 7, 255, 167, 152, 244, 67, 64, 214, 219, 202, 192, 142, 177, 229, 101, + 125, 248, 41, 164, 4, 24, 236, 138, 175, 252, 68, 34, 107, 9, 246, 201, + 87, 74, 149, 17, 208, 23, 91, 214, 17, 118, 40, 155, 196, 249, 102, 152, + 53, 149, 155, 44, 253, 197, 211, 95, 124, 109, 27, 25, 92, 71, 152, 200, + 44, 139, 134, 243, 23, 28, 96, 200, 224, 235, 59, 222, 44, 194, 239, 22, + 255, 153, 86, 202, 149, 62, 190, 150, 40, 16, 246, 147, 239, 168, 102, 72, + 191, 155, 244, 27, 179, 84, 218, 83, 254, 125, 141, 89, 154, 223, 112, 63, + 130, 66, 135, 205, 82, 235, 98, 216, 109, 193, 161, 7, 104, 44, 226, 94, + 113, 125, 177, 48, 181, 95, 29, 234, 222, 117, 37, 36, 189, 128, 208, 117, + 72, 254, 87, 170, 86, 209, 220, 168, 212, 234, 53, 32, 156, 85, 27, 37, + 142, 50, 82, 126, 146, 152, 197, 12, 224, 184, 159, 216, 229, 85, 104, 205, + 81, 231, 215, 128, 242, 95, 34, 120, 192, 176, 43, 74, 161, 124, 181, 97, + 191, 89, 49, 97, 243, 168, 146, 252, 180, 219, 238, 141, 134, 50, 114, 208, + 108, 55, 91, 165, 62, 28, 92, 106, 3, 110, 30, 106, 98, 151, 81, 167, + 122, 128, 18, 212, 214, 84, 213, 136, 154, 214, 93, 88, 15, 255, 206, 208, + 70, 61, 57, 101, 81, 43, 12, 200, 64, 97, 248, 83, 93, 240, 211, 43, + 245, 135, 205, 202, 8, 90, 168, 70, 138, 100, 138, 205, 129, 25, 117, 219, + 65, 33, 42, 172, 159, 33, 193, 73, 235, 195, 81, 138, 156, 255, 105, 225, + 82, 159, 116, 205, 76, 214, 178, 192, 161, 175, 65, 123, 47, 26, 107, 202, + 73, 64, 99, 84, 75, 221, 3, 50, 173, 77, 54, 24, 159, 53, 199, 92, + 91, 154, 36, 97, 97, 141, 198, 114, 109, 97, 162, 64, 56, 243, 43, 218, + 228, 85, 86, 7, 62, 90, 18, 132, 186, 89, 1, 242, 98, 138, 157, 129, + 186, 254, 45, 222, 133, 161, 167, 227, 51, 85, 136, 213, 163, 169, 182, 2, + 92, 90, 76, 25, 236, 58, 208, 9, 199, 20, 253, 54, 85, 255, 76, 203, + 199, 126, 51, 8, 173, 30, 28, 32, 217, 139, 241, 76, 191, 246, 191, 159, + 144, 141, 195, 114, 28, 192, 2, 29, 151, 58, 17, 114, 185, 88, 63, 60, + 25, 129, 13, 123, 152, 152, 156, 75, 234, 152, 163, 142, 94, 216, 224, 71, + 165, 29, 53, 171, 85, 160, 205, 75, 197, 197, 193, 90, 132, 75, 23, 98, + 237, 6, 58, 69, 184, 223, 100, 53, 226, 237, 222, 239, 238, 73, 222, 173, + 94, 111, 213, 6, 36, 141, 55, 209, 247, 200, 192, 76, 98, 73, 208, 224, + 183, 207, 247, 76, 81, 110, 234, 135, 242, 135, 191, 37, 124, 248, 91, 126, + 108, 126, 78, 92, 225, 44, 112, 179, 209, 16, 28, 28, 191, 63, 16, 69, + 34, 127, 123, 7, 208, 252, 191, 105, 150, 251, 128, 255, 72, 231, 199, 188, + 40, 85, 46, 96, 235, 21, 246, 186, 119, 226, 205, 211, 6, 3, 148, 168, + 89, 213, 232, 31, 196, 164, 215, 178, 9, 190, 7, 108, 83, 81, 176, 118, + 225, 120, 90, 125, 98, 93, 92, 46, 26, 247, 154, 236, 56, 29, 142, 92, + 136, 74, 76, 48, 241, 192, 96, 16, 52, 125, 136, 254, 163, 199, 141, 112, + 217, 246, 87, 33, 196, 227, 174, 141, 154, 10, 166, 53, 110, 200, 123, 111, + 223, 176, 181, 58, 179, 102, 164, 174, 111, 93, 16, 80, 215, 204, 115, 6, + 59, 116, 242, 226, 8, 186, 103, 97, 176, 30, 198, 246, 65, 134, 122, 140, + 161, 209, 1, 26, 142, 235, 157, 54, 19, 146, 193, 5, 172, 172, 48, 227, + 137, 46, 95, 12, 70, 101, 124, 67, 101, 68, 156, 190, 136, 247, 53, 184, + 16, 118, 220, 64, 63, 217, 80, 22, 102, 26, 144, 72, 56, 242, 121, 210, + 19, 104, 56, 179, 162, 116, 127, 144, 23, 208, 39, 214, 119, 86, 214, 198, + 11, 14, 95, 0, 102, 211, 57, 120, 5, 246, 246, 52, 150, 100, 58, 95, + 1, 190, 45, 240, 229, 13, 160, 193, 164, 154, 12, 25, 14, 149, 38, 116, + 147, 251, 49, 99, 120, 107, 43, 234, 90, 138, 80, 231, 155, 220, 177, 133, + 104, 8, 82, 209, 149, 97, 191, 69, 55, 45, 247, 249, 169, 160, 148, 176, + 96, 96, 149, 144, 59, 209, 218, 37, 188, 52, 4, 38, 154, 142, 87, 39, + 144, 234, 184, 85, 166, 54, 208, 90, 203, 160, 25, 204, 1, 198, 162, 73, + 200, 18, 141, 184, 167, 42, 33, 104, 68, 28, 215, 29, 139, 70, 95, 130, + 229, 197, 170, 245, 101, 181, 208, 53, 253, 139, 106, 61, 94, 172, 150, 163, + 127, 186, 218, 242, 227, 188, 26, 160, 183, 243, 123, 231, 146, 44, 202, 51, + 99, 53, 72, 204, 57, 173, 42, 45, 62, 244, 230, 177, 153, 23, 201, 175, + 50, 64, 108, 163, 143, 147, 17, 144, 27, 106, 194, 206, 216, 169, 1, 62, + 219, 94, 234, 247, 96, 174, 213, 175, 163, 151, 107, 95, 82, 180, 197, 18, + 211, 64, 73, 117, 50, 202, 211, 178, 67, 94, 247, 132, 15, 229, 135, 228, + 84, 2, 33, 188, 81, 251, 137, 140, 111, 151, 28, 73, 144, 231, 138, 101, + 50, 17, 47, 76, 216, 194, 68, 97, 116, 86, 116, 252, 115, 19, 168, 9, + 20, 91, 165, 51, 122, 77, 192, 115, 153, 247, 144, 148, 165, 209, 178, 68, + 0, 159, 72, 36, 111, 197, 247, 137, 126, 122, 252, 155, 159, 27, 255, 134, + 210, 160, 192, 81, 248, 254, 52, 15, 230, 250, 59, 204, 132, 185, 32, 26, + 72, 6, 177, 88, 245, 193, 66, 186, 253, 43, 230, 35, 253, 67, 187, 196, + 23, 129, 112, 94, 139, 124, 79, 176, 106, 8, 208, 173, 132, 121, 214, 40, + 181, 46, 51, 188, 173, 158, 39, 34, 251, 8, 173, 76, 239, 199, 133, 44, + 228, 103, 201, 192, 98, 130, 243, 132, 60, 173, 18, 149, 179, 190, 63, 16, + 57, 79, 139, 193, 125, 113, 30, 65, 239, 47, 208, 38, 51, 169, 7, 144, + 46, 141, 111, 15, 126, 67, 21, 190, 113, 46, 73, 143, 226, 134, 18, 86, + 146, 125, 203, 98, 121, 212, 206, 158, 37, 97, 220, 137, 70, 194, 55, 32, + 12, 219, 89, 178, 33, 66, 26, 28, 178, 198, 200, 73, 58, 129, 65, 9, + 235, 87, 205, 63, 97, 204, 43, 192, 2, 93, 140, 154, 134, 1, 191, 180, + 105, 68, 156, 87, 52, 45, 242, 163, 168, 79, 217, 133, 77, 48, 54, 49, + 33, 200, 127, 192, 100, 52, 72, 227, 21, 142, 136, 145, 87, 32, 99, 20, + 219, 222, 227, 197, 194, 201, 91, 109, 159, 139, 155, 77, 176, 114, 143, 201, + 115, 232, 208, 197, 73, 19, 109, 6, 76, 184, 4, 137, 214, 194, 141, 36, + 148, 99, 202, 49, 118, 163, 49, 118, 213, 24, 27, 199, 92, 109, 99, 110, + 30, 241, 83, 226, 200, 12, 205, 155, 26, 74, 33, 199, 201, 212, 22, 157, + 42, 146, 215, 16, 230, 58, 230, 245, 246, 216, 49, 109, 251, 218, 49, 143, + 206, 174, 207, 33, 172, 93, 171, 38, 209, 72, 51, 121, 141, 170, 247, 169, + 173, 163, 4, 155, 22, 69, 180, 3, 91, 148, 132, 134, 255, 176, 25, 212, + 79, 106, 6, 61, 253, 91, 205, 184, 204, 154, 137, 114, 173, 222, 236, 36, + 141, 102, 231, 166, 214, 31, 38, 119, 157, 206, 110, 10, 50, 193, 43, 63, + 111, 33, 220, 213, 0, 45, 151, 105, 103, 13, 121, 40, 113, 92, 181, 24, + 220, 252, 66, 53, 200, 42, 102, 48, 128, 80, 2, 194, 64, 215, 109, 158, + 10, 174, 232, 193, 254, 150, 182, 151, 65, 196, 25, 156, 175, 204, 115, 21, + 200, 69, 67, 96, 30, 3, 143, 84, 34, 55, 97, 209, 75, 130, 66, 101, + 42, 10, 197, 38, 156, 203, 202, 142, 69, 14, 136, 57, 142, 53, 251, 88, + 100, 162, 136, 88, 171, 155, 183, 16, 12, 52, 219, 132, 143, 160, 5, 250, + 220, 234, 36, 60, 194, 168, 12, 154, 245, 118, 73, 125, 5, 8, 75, 14, + 42, 50, 24, 5, 111, 144, 150, 30, 61, 122, 28, 108, 25, 195, 90, 103, + 208, 237, 39, 187, 61, 28, 222, 164, 241, 94, 207, 235, 195, 71, 36, 183, + 93, 48, 128, 191, 117, 123, 142, 17, 255, 160, 184, 193, 36, 197, 120, 64, + 116, 10, 194, 236, 16, 133, 169, 230, 83, 72, 18, 69, 156, 93, 59, 16, + 122, 158, 9, 143, 240, 109, 203, 124, 154, 14, 169, 17, 91, 230, 123, 59, + 108, 143, 90, 201, 167, 206, 83, 76, 1, 147, 192, 120, 159, 11, 189, 90, + 102, 3, 122, 121, 76, 137, 13, 72, 82, 155, 214, 68, 239, 222, 243, 20, + 192, 25, 241, 30, 94, 97, 138, 189, 55, 48, 88, 12, 166, 232, 11, 18, + 80, 12, 228, 129, 20, 129, 72, 186, 48, 135, 113, 66, 95, 100, 226, 76, + 157, 195, 223, 92, 252, 120, 189, 238, 80, 228, 231, 25, 244, 71, 18, 155, + 127, 98, 102, 120, 117, 109, 225, 13, 67, 50, 83, 237, 14, 161, 157, 84, + 83, 250, 41, 204, 215, 39, 30, 231, 228, 74, 120, 134, 233, 57, 225, 117, + 33, 39, 132, 112, 78, 55, 170, 51, 99, 138, 50, 18, 12, 138, 232, 241, + 21, 89, 193, 243, 163, 11, 45, 118, 50, 199, 118, 208, 176, 56, 70, 12, + 142, 61, 4, 154, 162, 228, 116, 181, 97, 137, 12, 136, 130, 234, 170, 203, + 254, 96, 223, 84, 41, 212, 101, 191, 150, 231, 87, 94, 249, 235, 117, 255, + 12, 162, 194, 15, 209, 173, 228, 233, 125, 249, 52, 142, 231, 121, 148, 6, + 208, 9, 92, 24, 180, 162, 208, 138, 60, 128, 254, 79, 189, 239, 95, 121, + 224, 53, 196, 85, 185, 114, 80, 129, 175, 154, 149, 139, 75, 78, 49, 24, + 226, 36, 240, 217, 109, 183, 176, 99, 41, 103, 205, 188, 227, 70, 55, 218, + 237, 230, 68, 179, 16, 79, 162, 146, 140, 235, 184, 91, 168, 40, 182, 201, + 127, 145, 53, 214, 188, 110, 183, 96, 46, 186, 232, 16, 139, 255, 121, 206, + 218, 231, 144, 252, 96, 108, 157, 134, 228, 1, 99, 235, 175, 240, 54, 83, + 133, 191, 180, 72, 146, 159, 211, 159, 237, 211, 244, 169, 253, 87, 250, 47, + 210, 61, 74, 173, 25, 235, 190, 67, 255, 204, 163, 112, 131, 190, 94, 24, + 24, 3, 55, 220, 239, 14, 7, 230, 192, 11, 63, 53, 145, 35, 197, 163, + 245, 192, 15, 159, 181, 224, 244, 61, 8, 232, 111, 102, 208, 40, 85, 129, + 245, 29, 228, 195, 231, 221, 81, 191, 52, 170, 170, 144, 66, 120, 210, 232, + 118, 234, 226, 93, 157, 218, 143, 204, 203, 137, 181, 131, 250, 106, 8, 55, + 63, 141, 30, 111, 213, 35, 113, 6, 164, 115, 120, 23, 80, 19, 76, 245, + 35, 53, 213, 53, 47, 4, 214, 145, 65, 133, 163, 45, 4, 90, 191, 224, + 109, 62, 93, 118, 231, 133, 210, 213, 12, 43, 159, 19, 252, 191, 65, 117, + 55, 100, 202, 70, 134, 212, 195, 48, 37, 129, 251, 204, 176, 109, 34, 37, + 53, 173, 42, 83, 86, 49, 101, 85, 79, 121, 171, 82, 82, 211, 47, 73, + 3, 205, 140, 122, 124, 133, 1, 192, 190, 59, 51, 225, 254, 0, 27, 149, + 243, 73, 29, 144, 32, 232, 169, 110, 25, 112, 43, 2, 170, 20, 128, 170, + 142, 60, 34, 54, 41, 189, 193, 97, 132, 255, 161, 62, 123, 115, 208, 29, + 140, 250, 151, 165, 74, 141, 253, 28, 228, 133, 7, 21, 244, 32, 1, 255, + 88, 51, 221, 67, 143, 26, 232, 222, 92, 56, 59, 192, 91, 139, 25, 124, + 246, 52, 10, 11, 142, 195, 89, 243, 108, 29, 14, 74, 73, 101, 164, 87, + 112, 183, 80, 63, 97, 179, 232, 120, 197, 252, 22, 235, 118, 160, 14, 24, + 241, 40, 129, 84, 134, 15, 208, 134, 67, 122, 33, 16, 64, 75, 153, 60, + 234, 236, 51, 38, 1, 78, 34, 179, 210, 236, 87, 90, 181, 1, 121, 232, + 200, 155, 242, 158, 7, 129, 157, 88, 103, 198, 154, 13, 40, 225, 156, 21, + 211, 3, 2, 18, 212, 236, 174, 216, 48, 108, 61, 90, 27, 154, 135, 62, + 251, 138, 20, 71, 179, 164, 76, 38, 128, 17, 216, 214, 10, 175, 229, 144, + 167, 5, 46, 86, 113, 181, 164, 152, 207, 102, 7, 210, 57, 44, 185, 132, + 104, 94, 38, 185, 173, 80, 8, 253, 21, 174, 92, 3, 151, 111, 104, 50, + 5, 118, 219, 128, 78, 236, 31, 170, 239, 48, 107, 100, 124, 4, 71, 44, + 234, 122, 246, 63, 84, 122, 240, 73, 139, 193, 127, 152, 210, 67, 220, 145, + 130, 110, 104, 27, 185, 156, 95, 192, 5, 48, 229, 81, 157, 142, 233, 208, + 111, 161, 84, 130, 43, 12, 184, 194, 223, 139, 145, 241, 45, 95, 122, 146, + 30, 241, 131, 245, 35, 86, 233, 238, 183, 17, 54, 110, 92, 131, 117, 128, + 23, 3, 27, 219, 33, 227, 28, 133, 136, 109, 132, 111, 2, 233, 40, 244, + 221, 85, 123, 233, 145, 150, 91, 226, 27, 197, 75, 212, 0, 142, 124, 119, + 190, 3, 164, 139, 17, 142, 194, 64, 65, 28, 89, 158, 10, 247, 49, 252, + 23, 226, 25, 105, 237, 253, 89, 64, 163, 251, 45, 4, 120, 235, 130, 133, + 84, 226, 251, 28, 28, 132, 203, 102, 173, 69, 0, 69, 116, 147, 209, 29, + 161, 106, 33, 108, 213, 37, 186, 51, 82, 144, 68, 109, 13, 105, 242, 129, + 122, 245, 195, 62, 2, 29, 65, 85, 12, 116, 4, 20, 255, 219, 168, 212, + 95, 196, 171, 188, 91, 177, 254, 178, 85, 170, 227, 134, 59, 234, 208, 83, + 105, 117, 254, 187, 238, 8, 212, 222, 142, 45, 55, 169, 147, 255, 197, 10, + 246, 95, 58, 10, 206, 135, 119, 246, 128, 110, 119, 67, 50, 179, 42, 243, + 132, 4, 26, 10, 20, 225, 14, 45, 247, 206, 77, 183, 117, 83, 99, 66, + 201, 70, 159, 164, 120, 13, 37, 144, 82, 159, 50, 106, 37, 15, 45, 208, + 95, 216, 67, 208, 79, 8, 11, 102, 71, 36, 182, 77, 145, 199, 79, 25, + 210, 224, 16, 94, 148, 18, 152, 226, 81, 232, 33, 104, 9, 149, 112, 110, + 122, 116, 203, 12, 123, 0, 69, 70, 64, 68, 134, 228, 16, 2, 4, 92, + 39, 219, 79, 34, 249, 100, 253, 169, 105, 19, 243, 6, 146, 119, 242, 2, + 145, 182, 72, 251, 201, 6, 110, 41, 28, 0, 175, 34, 76, 6, 4, 132, + 234, 156, 103, 239, 55, 17, 206, 45, 134, 123, 20, 46, 156, 102, 26, 183, + 194, 67, 211, 56, 67, 48, 178, 240, 59, 230, 99, 19, 122, 129, 173, 194, + 81, 46, 8, 154, 143, 202, 149, 94, 2, 75, 22, 190, 171, 133, 246, 179, + 105, 35, 2, 97, 194, 79, 56, 155, 90, 12, 108, 141, 28, 3, 81, 65, + 44, 74, 22, 71, 74, 108, 137, 188, 22, 39, 192, 179, 77, 140, 43, 64, + 92, 65, 143, 227, 157, 128, 226, 138, 16, 87, 212, 226, 112, 103, 68, 221, + 104, 140, 91, 135, 184, 117, 61, 14, 27, 34, 242, 109, 64, 220, 134, 22, + 87, 204, 115, 182, 75, 54, 220, 159, 108, 135, 222, 247, 239, 83, 250, 61, + 217, 9, 97, 100, 224, 109, 39, 132, 177, 113, 40, 118, 74, 133, 161, 154, + 60, 90, 49, 219, 126, 58, 57, 181, 39, 41, 96, 219, 236, 94, 183, 53, + 173, 119, 59, 200, 65, 98, 193, 5, 26, 230, 2, 126, 27, 248, 88, 235, + 244, 91, 193, 10, 227, 231, 66, 19, 103, 140, 85, 61, 86, 5, 4, 28, + 83, 132, 70, 10, 246, 1, 65, 241, 169, 153, 145, 119, 242, 69, 141, 64, + 53, 59, 248, 187, 111, 48, 146, 20, 14, 152, 172, 147, 67, 139, 84, 167, + 140, 146, 123, 184, 111, 216, 17, 159, 43, 142, 99, 184, 219, 71, 123, 60, + 227, 19, 223, 133, 125, 84, 58, 203, 120, 194, 130, 143, 166, 56, 251, 251, + 28, 160, 93, 183, 31, 108, 225, 175, 175, 200, 56, 3, 91, 225, 179, 156, + 71, 206, 126, 159, 53, 54, 36, 120, 77, 218, 71, 140, 6, 1, 158, 66, + 47, 152, 4, 151, 185, 110, 88, 157, 117, 178, 142, 196, 112, 94, 229, 20, + 150, 170, 161, 25, 198, 234, 192, 199, 18, 96, 142, 104, 25, 235, 202, 75, + 130, 193, 157, 217, 224, 11, 39, 26, 21, 178, 1, 175, 213, 169, 223, 87, + 2, 148, 89, 40, 106, 10, 200, 13, 193, 98, 209, 130, 145, 230, 203, 149, + 82, 231, 166, 52, 48, 240, 142, 141, 174, 138, 6, 163, 74, 165, 86, 171, + 210, 51, 212, 133, 20, 152, 48, 176, 209, 60, 140, 36, 250, 192, 42, 219, + 105, 9, 189, 226, 147, 198, 175, 50, 235, 116, 34, 3, 207, 232, 179, 224, + 1, 197, 214, 109, 63, 217, 198, 83, 12, 181, 176, 244, 100, 211, 157, 171, + 51, 110, 14, 6, 210, 72, 43, 196, 118, 129, 136, 99, 113, 59, 197, 248, + 160, 197, 208, 151, 142, 66, 68, 129, 255, 55, 4, 229, 88, 80, 60, 69, + 60, 111, 156, 12, 17, 244, 133, 128, 12, 203, 26, 213, 126, 183, 119, 129, + 7, 140, 238, 56, 75, 126, 28, 60, 225, 50, 142, 91, 194, 72, 92, 168, + 151, 34, 234, 220, 235, 118, 219, 143, 72, 65, 131, 155, 242, 40, 177, 240, + 37, 4, 219, 137, 147, 67, 20, 129, 40, 171, 210, 29, 135, 6, 117, 29, + 125, 44, 173, 215, 46, 206, 43, 194, 203, 1, 46, 77, 6, 75, 94, 141, + 6, 226, 33, 156, 20, 203, 213, 213, 167, 20, 77, 127, 135, 239, 131, 193, + 127, 110, 172, 158, 194, 225, 173, 95, 26, 142, 90, 100, 26, 49, 120, 132, + 90, 92, 2, 105, 156, 174, 167, 42, 41, 104, 246, 32, 165, 141, 32, 109, + 37, 174, 251, 192, 17, 52, 126, 229, 8, 14, 224, 184, 20, 42, 52, 40, + 79, 91, 13, 180, 85, 115, 21, 2, 60, 141, 23, 135, 9, 61, 66, 215, + 118, 192, 238, 114, 255, 15, 90, 165, 30, 169, 24, 53, 219, 100, 190, 178, + 162, 243, 102, 206, 124, 134, 133, 202, 181, 77, 53, 196, 199, 131, 40, 158, + 241, 15, 71, 67, 248, 4, 198, 75, 93, 194, 71, 98, 4, 98, 63, 15, + 132, 33, 207, 188, 129, 12, 158, 106, 193, 242, 242, 118, 105, 32, 87, 105, + 96, 106, 188, 235, 79, 220, 181, 88, 101, 41, 202, 198, 43, 81, 134, 248, + 39, 167, 227, 226, 113, 178, 173, 0, 194, 100, 228, 182, 66, 169, 146, 238, + 151, 13, 73, 158, 60, 147, 32, 244, 137, 135, 209, 16, 183, 232, 150, 9, + 34, 240, 210, 10, 190, 169, 96, 113, 92, 13, 221, 140, 131, 22, 118, 137, + 172, 88, 227, 234, 222, 143, 202, 240, 36, 128, 151, 40, 38, 130, 220, 242, + 116, 0, 47, 125, 15, 250, 65, 53, 44, 52, 84, 115, 13, 171, 17, 86, + 128, 210, 201, 87, 39, 92, 68, 17, 219, 194, 123, 99, 30, 195, 206, 78, + 232, 137, 203, 228, 14, 48, 0, 158, 161, 74, 194, 179, 233, 98, 70, 232, + 128, 71, 91, 45, 222, 240, 112, 45, 234, 110, 56, 66, 227, 242, 220, 72, + 173, 82, 237, 57, 97, 168, 166, 168, 240, 197, 32, 202, 62, 154, 3, 243, + 232, 105, 123, 199, 207, 248, 65, 208, 207, 122, 205, 118, 169, 117, 209, 43, + 13, 87, 34, 255, 139, 120, 19, 227, 35, 201, 168, 150, 233, 87, 138, 70, + 143, 180, 202, 127, 242, 108, 182, 242, 244, 36, 85, 212, 205, 225, 184, 43, + 144, 207, 229, 241, 69, 170, 35, 162, 134, 139, 232, 137, 222, 127, 89, 14, + 245, 184, 92, 27, 194, 154, 67, 48, 217, 46, 76, 33, 46, 135, 81, 94, + 107, 172, 40, 73, 65, 116, 10, 108, 212, 148, 237, 118, 5, 83, 119, 204, + 18, 227, 195, 119, 106, 147, 33, 111, 240, 81, 6, 114, 19, 208, 233, 14, + 17, 31, 22, 43, 250, 111, 111, 226, 172, 121, 211, 146, 40, 255, 104, 116, + 138, 4, 217, 244, 150, 208, 254, 239, 21, 29, 10, 179, 132, 119, 114, 196, + 78, 104, 196, 78, 220, 196, 175, 112, 1, 32, 231, 221, 9, 124, 132, 101, + 252, 255, 165, 37, 17, 3, 255, 111, 116, 199, 177, 20, 131, 47, 29, 161, + 202, 42, 166, 88, 85, 3, 228, 143, 60, 0, 224, 188, 131, 18, 96, 122, + 214, 170, 117, 53, 169, 190, 116, 164, 27, 0, 113, 230, 86, 112, 190, 8, + 25, 220, 68, 68, 96, 53, 135, 176, 4, 125, 254, 13, 156, 47, 29, 233, + 13, 96, 220, 40, 201, 249, 24, 111, 190, 106, 83, 52, 167, 107, 209, 156, + 126, 128, 19, 0, 27, 152, 141, 106, 19, 166, 220, 69, 7, 157, 16, 148, + 201, 199, 115, 150, 175, 117, 154, 57, 180, 240, 20, 170, 85, 136, 253, 193, + 77, 39, 91, 49, 248, 116, 225, 236, 171, 50, 159, 197, 176, 217, 255, 1, + 2, 57, 39, 62, 201, 85, 71, 29, 190, 222, 185, 43, 141, 230, 52, 76, + 19, 63, 74, 149, 121, 194, 52, 59, 113, 241, 118, 217, 232, 177, 103, 175, + 135, 204, 177, 3, 30, 68, 49, 195, 18, 86, 207, 208, 27, 174, 204, 92, + 169, 22, 123, 216, 197, 208, 196, 187, 18, 153, 215, 202, 229, 8, 231, 31, + 97, 65, 21, 56, 158, 100, 41, 4, 147, 42, 96, 214, 41, 31, 17, 63, + 157, 154, 18, 86, 168, 228, 189, 137, 31, 58, 241, 254, 67, 227, 228, 209, + 56, 201, 14, 157, 244, 187, 200, 183, 162, 155, 146, 31, 247, 197, 214, 187, + 64, 150, 245, 39, 174, 3, 37, 58, 30, 27, 129, 87, 90, 221, 81, 85, + 216, 66, 174, 224, 126, 209, 184, 195, 141, 254, 207, 82, 2, 10, 68, 248, + 0, 6, 13, 128, 233, 2, 5, 154, 61, 59, 148, 190, 33, 31, 178, 211, + 177, 160, 213, 99, 147, 223, 72, 125, 65, 109, 126, 221, 126, 15, 55, 176, + 11, 220, 97, 145, 42, 12, 118, 66, 223, 185, 64, 239, 177, 64, 63, 47, + 46, 155, 85, 216, 165, 135, 83, 52, 12, 11, 43, 176, 235, 14, 16, 223, + 227, 187, 233, 137, 23, 120, 244, 67, 156, 246, 37, 212, 45, 15, 194, 75, + 20, 126, 125, 55, 243, 244, 0, 41, 231, 171, 54, 84, 93, 209, 147, 93, + 118, 80, 43, 208, 130, 236, 78, 85, 111, 213, 188, 208, 43, 10, 141, 238, + 165, 54, 6, 172, 210, 45, 122, 36, 68, 172, 205, 1, 114, 152, 132, 36, + 95, 156, 167, 112, 100, 100, 136, 31, 6, 28, 96, 249, 82, 217, 219, 223, + 14, 243, 139, 114, 86, 2, 33, 221, 246, 239, 214, 4, 125, 98, 190, 173, + 125, 27, 1, 37, 26, 160, 213, 8, 99, 161, 227, 238, 218, 236, 0, 93, + 17, 100, 238, 17, 208, 143, 218, 112, 212, 239, 224, 46, 240, 183, 216, 3, + 96, 138, 197, 99, 121, 53, 167, 112, 120, 215, 168, 254, 136, 109, 88, 230, + 19, 202, 176, 201, 146, 107, 210, 28, 187, 37, 21, 247, 149, 79, 176, 164, + 7, 8, 99, 159, 152, 187, 213, 42, 33, 165, 92, 215, 166, 188, 175, 3, + 195, 33, 247, 101, 106, 155, 44, 133, 190, 36, 33, 220, 55, 135, 18, 193, + 158, 119, 255, 238, 146, 167, 161, 213, 146, 91, 170, 44, 71, 69, 220, 89, + 219, 42, 46, 98, 255, 224, 207, 131, 247, 145, 106, 182, 48, 236, 91, 45, + 220, 197, 249, 216, 130, 77, 74, 213, 240, 99, 85, 111, 205, 80, 16, 182, + 158, 90, 173, 197, 229, 188, 231, 251, 230, 129, 62, 186, 80, 88, 124, 236, + 15, 59, 25, 185, 23, 221, 57, 240, 71, 139, 37, 63, 109, 32, 84, 25, + 127, 115, 178, 93, 129, 253, 201, 129, 141, 190, 219, 54, 241, 162, 199, 244, + 178, 15, 250, 114, 111, 89, 134, 173, 151, 130, 185, 129, 34, 45, 53, 115, + 15, 62, 148, 104, 224, 32, 214, 66, 109, 80, 164, 170, 187, 106, 159, 250, + 70, 184, 103, 142, 6, 171, 6, 50, 210, 13, 127, 98, 158, 192, 10, 204, + 13, 208, 197, 110, 51, 26, 148, 18, 82, 218, 152, 250, 254, 171, 69, 237, + 124, 217, 17, 89, 221, 202, 138, 94, 137, 164, 239, 128, 97, 201, 53, 128, + 138, 172, 78, 254, 99, 198, 17, 218, 201, 123, 133, 121, 57, 106, 181, 136, + 16, 32, 39, 242, 47, 222, 211, 179, 16, 11, 181, 136, 105, 216, 46, 84, + 67, 195, 32, 98, 34, 225, 240, 215, 58, 155, 1, 35, 233, 32, 20, 238, + 185, 109, 113, 174, 57, 138, 232, 221, 80, 170, 150, 195, 102, 234, 193, 19, + 50, 37, 164, 125, 67, 215, 157, 80, 48, 48, 135, 166, 53, 203, 180, 75, + 147, 11, 132, 129, 245, 141, 14, 58, 84, 170, 187, 14, 252, 242, 12, 137, + 74, 232, 57, 9, 56, 48, 231, 255, 152, 100, 252, 39, 94, 130, 141, 48, + 253, 8, 3, 18, 129, 47, 165, 15, 99, 213, 72, 116, 102, 76, 148, 58, + 106, 181, 71, 26, 146, 23, 205, 142, 248, 166, 33, 10, 18, 248, 187, 198, + 66, 13, 92, 216, 23, 68, 17, 66, 225, 252, 84, 89, 205, 11, 150, 87, + 21, 154, 194, 64, 14, 187, 184, 16, 251, 64, 84, 37, 250, 38, 90, 25, + 140, 59, 49, 42, 174, 21, 80, 120, 90, 112, 4, 211, 1, 97, 121, 122, + 79, 244, 204, 208, 156, 254, 238, 111, 153, 223, 72, 175, 104, 152, 156, 230, + 252, 212, 150, 121, 6, 255, 247, 156, 111, 14, 252, 152, 231, 232, 107, 211, + 153, 154, 172, 255, 121, 236, 146, 186, 27, 142, 137, 170, 6, 246, 96, 88, + 204, 165, 126, 207, 117, 240, 183, 212, 193, 21, 93, 128, 17, 46, 187, 41, + 225, 126, 37, 10, 242, 82, 2, 245, 217, 28, 87, 155, 109, 188, 192, 77, + 40, 69, 95, 186, 30, 69, 77, 69, 250, 68, 244, 156, 110, 228, 208, 237, + 16, 43, 167, 174, 202, 64, 73, 99, 202, 193, 5, 247, 119, 198, 19, 65, + 45, 98, 202, 195, 60, 225, 26, 251, 157, 210, 118, 148, 35, 28, 182, 132, + 130, 103, 54, 109, 57, 125, 206, 160, 84, 180, 101, 64, 93, 74, 46, 65, + 218, 34, 196, 33, 81, 177, 67, 214, 142, 244, 171, 132, 236, 127, 189, 239, + 44, 143, 72, 82, 244, 159, 98, 226, 67, 66, 201, 82, 41, 99, 48, 42, + 15, 74, 237, 158, 208, 157, 180, 45, 223, 217, 112, 138, 14, 66, 195, 33, + 188, 190, 13, 223, 24, 83, 94, 244, 203, 151, 103, 106, 252, 81, 38, 129, + 131, 44, 172, 6, 72, 197, 58, 103, 137, 146, 48, 87, 75, 79, 59, 48, + 43, 78, 198, 55, 9, 174, 9, 101, 139, 102, 133, 253, 180, 233, 101, 103, + 239, 47, 145, 5, 203, 234, 142, 76, 70, 104, 126, 176, 56, 55, 43, 123, + 203, 49, 11, 96, 209, 201, 4, 250, 216, 136, 1, 107, 47, 77, 155, 126, + 202, 56, 163, 145, 165, 165, 113, 46, 71, 186, 143, 169, 6, 97, 152, 151, + 218, 204, 66, 162, 18, 95, 133, 70, 13, 216, 43, 189, 223, 137, 180, 33, + 52, 42, 209, 88, 29, 85, 253, 206, 204, 241, 111, 9, 158, 159, 9, 167, + 161, 30, 77, 56, 65, 152, 30, 169, 224, 72, 37, 67, 38, 76, 30, 169, + 82, 46, 18, 169, 68, 60, 17, 42, 35, 202, 228, 182, 233, 203, 72, 68, + 237, 1, 54, 14, 181, 62, 9, 139, 40, 200, 37, 146, 75, 69, 101, 188, + 84, 130, 85, 244, 62, 99, 41, 140, 105, 113, 152, 58, 243, 211, 9, 30, + 131, 132, 227, 159, 167, 177, 249, 144, 100, 26, 134, 145, 55, 122, 85, 70, + 226, 143, 164, 56, 38, 36, 127, 131, 67, 208, 103, 71, 180, 202, 246, 181, + 39, 113, 172, 64, 109, 195, 149, 137, 213, 95, 215, 17, 237, 118, 220, 59, + 210, 122, 234, 111, 148, 246, 240, 12, 198, 82, 82, 204, 132, 211, 204, 159, + 3, 73, 57, 76, 24, 49, 96, 195, 123, 86, 162, 153, 132, 253, 39, 49, + 112, 67, 230, 211, 80, 211, 233, 61, 179, 106, 35, 84, 77, 145, 99, 49, + 79, 160, 229, 249, 210, 172, 105, 195, 145, 212, 129, 133, 216, 30, 134, 179, + 97, 104, 45, 209, 221, 63, 72, 91, 72, 224, 131, 164, 147, 86, 156, 86, + 219, 40, 72, 94, 202, 131, 58, 139, 11, 9, 183, 206, 134, 142, 151, 25, + 158, 207, 241, 230, 134, 38, 50, 44, 132, 33, 163, 127, 137, 219, 24, 154, + 78, 40, 48, 22, 87, 91, 120, 201, 140, 222, 224, 168, 113, 50, 27, 36, + 224, 128, 165, 172, 222, 138, 172, 195, 8, 243, 165, 178, 64, 128, 218, 198, + 130, 15, 189, 59, 71, 55, 98, 193, 212, 240, 45, 119, 153, 197, 250, 121, + 215, 140, 57, 224, 104, 11, 233, 181, 217, 158, 192, 177, 233, 12, 37, 222, + 206, 116, 78, 91, 68, 46, 137, 175, 176, 226, 231, 231, 168, 214, 206, 236, + 215, 5, 66, 25, 10, 80, 55, 86, 13, 135, 186, 162, 24, 62, 204, 37, + 173, 118, 89, 105, 197, 48, 235, 58, 79, 73, 180, 184, 197, 9, 190, 45, + 164, 178, 141, 223, 162, 205, 113, 199, 93, 177, 47, 207, 84, 180, 147, 168, + 194, 162, 163, 13, 238, 114, 203, 188, 230, 231, 140, 183, 101, 42, 66, 32, + 232, 64, 95, 145, 129, 126, 2, 59, 241, 251, 214, 130, 190, 111, 131, 21, + 184, 13, 56, 62, 97, 70, 60, 27, 38, 97, 133, 158, 93, 159, 47, 44, + 82, 160, 32, 103, 9, 11, 6, 41, 113, 158, 146, 11, 22, 51, 109, 99, + 75, 254, 72, 138, 246, 96, 136, 106, 208, 117, 10, 23, 62, 190, 136, 3, + 27, 38, 218, 78, 32, 70, 194, 6, 170, 57, 165, 151, 200, 69, 42, 241, + 7, 38, 127, 146, 241, 18, 115, 205, 40, 168, 187, 100, 18, 20, 57, 121, + 147, 54, 66, 204, 108, 204, 30, 113, 139, 145, 160, 243, 166, 21, 217, 5, + 101, 94, 233, 217, 94, 205, 205, 5, 38, 7, 242, 198, 67, 86, 22, 242, + 86, 47, 228, 45, 39, 137, 190, 11, 37, 94, 193, 183, 132, 90, 9, 186, + 137, 147, 199, 175, 203, 124, 162, 240, 85, 188, 76, 81, 109, 63, 245, 251, + 70, 106, 169, 241, 158, 106, 171, 54, 110, 108, 158, 162, 213, 197, 1, 230, + 50, 231, 54, 91, 69, 85, 208, 200, 47, 102, 86, 37, 170, 40, 19, 147, + 89, 142, 76, 174, 60, 45, 178, 173, 133, 118, 231, 139, 124, 163, 238, 182, + 216, 89, 36, 84, 8, 143, 151, 166, 118, 118, 231, 168, 120, 178, 130, 193, + 52, 23, 182, 86, 74, 13, 139, 119, 153, 61, 189, 55, 183, 220, 96, 87, + 173, 91, 194, 117, 36, 59, 14, 124, 246, 239, 89, 182, 92, 68, 89, 1, + 65, 162, 126, 159, 100, 127, 151, 230, 163, 198, 25, 211, 192, 37, 181, 213, + 124, 134, 235, 202, 161, 95, 192, 93, 164, 12, 5, 11, 124, 59, 173, 76, + 204, 82, 180, 231, 11, 231, 152, 247, 146, 134, 6, 66, 44, 169, 201, 192, + 151, 54, 255, 164, 159, 59, 225, 63, 237, 40, 117, 15, 113, 178, 227, 253, + 186, 210, 121, 25, 188, 131, 92, 174, 219, 33, 87, 165, 209, 146, 206, 254, + 168, 99, 43, 155, 79, 81, 73, 54, 250, 99, 90, 172, 117, 60, 159, 72, + 45, 83, 223, 188, 249, 219, 162, 12, 193, 224, 227, 20, 158, 56, 30, 210, + 114, 186, 23, 20, 240, 213, 122, 106, 84, 122, 212, 223, 225, 44, 163, 125, + 58, 237, 84, 115, 236, 102, 96, 85, 46, 207, 58, 235, 216, 253, 195, 123, + 226, 206, 205, 149, 231, 182, 133, 115, 139, 19, 13, 213, 35, 161, 170, 249, + 131, 143, 252, 160, 239, 74, 186, 154, 15, 175, 255, 206, 13, 89, 95, 142, + 15, 190, 11, 142, 185, 210, 92, 229, 48, 147, 46, 113, 182, 87, 82, 97, + 109, 172, 191, 10, 165, 214, 142, 58, 9, 59, 26, 105, 115, 22, 59, 225, + 16, 209, 185, 239, 180, 34, 15, 7, 127, 251, 112, 34, 11, 224, 179, 200, + 29, 39, 11, 33, 60, 240, 98, 28, 225, 78, 142, 128, 218, 28, 203, 131, + 45, 254, 97, 108, 220, 223, 231, 226, 126, 134, 137, 179, 102, 157, 182, 59, + 191, 176, 118, 98, 254, 144, 200, 99, 41, 186, 52, 85, 91, 69, 180, 71, + 193, 142, 81, 155, 12, 67, 77, 154, 47, 110, 191, 190, 0, 27, 179, 131, + 94, 189, 176, 147, 243, 4, 202, 248, 229, 113, 219, 102, 144, 242, 42, 219, + 192, 138, 211, 44, 41, 75, 99, 89, 172, 241, 141, 74, 86, 99, 113, 91, + 47, 119, 14, 153, 211, 123, 64, 86, 79, 229, 21, 78, 86, 73, 45, 202, + 234, 180, 61, 243, 250, 44, 3, 109, 66, 145, 63, 11, 112, 108, 88, 183, + 143, 50, 254, 60, 18, 223, 155, 99, 87, 58, 113, 149, 130, 124, 56, 88, + 180, 75, 157, 69, 113, 59, 135, 42, 37, 100, 241, 250, 11, 239, 171, 79, + 168, 134, 159, 118, 139, 154, 89, 161, 73, 220, 28, 224, 125, 93, 73, 93, + 58, 162, 55, 211, 26, 2, 237, 144, 236, 79, 94, 247, 114, 181, 189, 168, + 90, 29, 25, 59, 134, 13, 138, 169, 197, 0, 224, 69, 47, 204, 122, 196, + 39, 130, 144, 42, 218, 138, 8, 225, 115, 181, 121, 121, 89, 35, 201, 113, + 171, 118, 83, 139, 28, 141, 154, 7, 66, 65, 25, 51, 212, 71, 109, 179, + 93, 186, 174, 13, 100, 121, 205, 206, 77, 179, 83, 33, 200, 243, 75, 37, + 252, 245, 92, 32, 169, 112, 180, 173, 210, 13, 187, 35, 11, 98, 84, 243, + 118, 13, 178, 137, 220, 120, 57, 138, 205, 169, 55, 186, 3, 104, 73, 117, + 212, 103, 240, 33, 188, 173, 108, 106, 48, 223, 170, 9, 148, 16, 178, 244, + 59, 3, 85, 151, 107, 246, 248, 42, 127, 57, 57, 124, 236, 126, 127, 186, + 144, 254, 238, 228, 120, 141, 59, 46, 175, 200, 114, 119, 30, 248, 26, 228, + 41, 99, 49, 195, 61, 181, 148, 75, 29, 248, 63, 150, 161, 176, 34, 67, + 92, 104, 189, 219, 239, 119, 233, 86, 65, 83, 90, 232, 12, 251, 221, 150, + 24, 202, 255, 53, 150, 91, 25, 105, 188, 213, 54, 19, 98, 85, 95, 208, + 172, 184, 64, 40, 145, 139, 250, 229, 4, 22, 121, 0, 4, 104, 83, 88, + 178, 16, 98, 171, 248, 231, 120, 20, 197, 24, 96, 107, 211, 237, 188, 189, + 145, 70, 95, 29, 104, 103, 52, 65, 247, 89, 192, 56, 251, 133, 116, 175, + 153, 182, 18, 9, 47, 149, 90, 211, 92, 83, 40, 17, 96, 222, 136, 215, + 59, 24, 150, 58, 85, 224, 77, 168, 110, 161, 163, 139, 94, 248, 200, 233, + 8, 166, 112, 145, 106, 223, 147, 71, 232, 48, 250, 126, 44, 151, 247, 131, + 92, 172, 4, 158, 95, 202, 231, 63, 48, 223, 186, 23, 203, 22, 44, 103, + 43, 193, 118, 209, 228, 76, 122, 202, 210, 114, 74, 53, 244, 232, 124, 16, + 6, 188, 200, 232, 161, 158, 80, 199, 165, 68, 237, 31, 142, 194, 226, 184, + 85, 245, 28, 50, 163, 106, 76, 86, 204, 252, 11, 145, 133, 223, 168, 22, + 54, 189, 82, 72, 47, 162, 48, 210, 60, 120, 132, 72, 110, 90, 21, 109, + 85, 1, 211, 10, 170, 128, 244, 250, 251, 163, 230, 208, 53, 101, 108, 68, + 26, 226, 41, 60, 149, 159, 233, 64, 60, 214, 87, 249, 121, 209, 199, 99, + 3, 3, 55, 68, 165, 217, 207, 238, 7, 135, 53, 134, 197, 118, 29, 250, + 227, 241, 31, 159, 255, 4, 252, 39, 31, 122, 100, 184, 136, 63, 8, 32, + 12, 191, 128, 64, 212, 27, 143, 212, 28, 45, 40, 91, 45, 76, 111, 237, + 176, 129, 148, 210, 155, 151, 87, 248, 247, 56, 36, 142, 172, 182, 104, 123, + 166, 114, 218, 114, 228, 69, 169, 60, 208, 72, 169, 243, 161, 94, 44, 134, + 4, 42, 36, 240, 41, 192, 167, 0, 148, 189, 139, 0, 47, 228, 88, 248, + 39, 155, 237, 33, 39, 131, 237, 222, 78, 152, 3, 214, 82, 245, 177, 205, + 214, 12, 51, 16, 146, 102, 94, 136, 157, 147, 214, 182, 237, 33, 116, 111, + 106, 206, 55, 14, 152, 2, 120, 85, 106, 146, 208, 86, 6, 170, 245, 182, + 86, 170, 78, 133, 202, 48, 97, 255, 221, 211, 237, 188, 222, 237, 141, 21, + 160, 206, 212, 247, 122, 109, 120, 129, 142, 56, 216, 68, 67, 189, 181, 87, + 169, 72, 99, 173, 133, 224, 95, 169, 21, 138, 165, 195, 153, 242, 82, 73, + 111, 109, 233, 5, 130, 55, 109, 132, 145, 105, 53, 111, 106, 131, 48, 64, + 155, 235, 111, 48, 201, 34, 95, 202, 148, 2, 142, 218, 23, 125, 78, 27, + 4, 230, 69, 61, 122, 44, 243, 35, 170, 134, 200, 73, 11, 156, 252, 5, + 133, 206, 146, 201, 12, 231, 71, 193, 87, 49, 101, 3, 195, 215, 102, 72, + 207, 54, 99, 122, 182, 199, 62, 107, 180, 142, 17, 77, 25, 66, 197, 107, + 131, 192, 149, 163, 234, 51, 69, 180, 177, 108, 149, 42, 56, 179, 8, 126, + 137, 28, 105, 75, 42, 11, 53, 186, 14, 249, 144, 35, 31, 73, 194, 21, + 28, 205, 71, 45, 128, 236, 43, 245, 128, 229, 4, 30, 82, 238, 60, 25, + 26, 220, 210, 162, 103, 7, 75, 21, 36, 33, 93, 210, 51, 230, 140, 209, + 88, 147, 245, 13, 122, 71, 4, 114, 10, 205, 39, 249, 27, 2, 199, 97, + 40, 33, 108, 211, 89, 66, 88, 127, 52, 225, 152, 239, 176, 231, 212, 48, + 68, 189, 97, 126, 66, 94, 158, 159, 242, 176, 168, 155, 169, 20, 110, 33, + 76, 156, 134, 141, 168, 86, 95, 242, 94, 145, 102, 51, 15, 254, 76, 140, + 50, 73, 236, 46, 57, 49, 85, 183, 19, 162, 245, 73, 19, 74, 211, 154, + 190, 176, 98, 137, 240, 82, 111, 240, 183, 89, 235, 163, 65, 183, 185, 137, + 106, 89, 190, 33, 64, 192, 203, 3, 5, 20, 34, 31, 118, 160, 223, 27, + 144, 190, 44, 92, 243, 225, 216, 13, 26, 192, 136, 93, 115, 201, 69, 56, + 198, 32, 128, 8, 79, 21, 211, 70, 159, 150, 150, 152, 45, 232, 224, 18, + 223, 120, 70, 105, 14, 180, 141, 104, 11, 64, 135, 120, 118, 70, 182, 25, + 78, 87, 18, 23, 189, 184, 208, 98, 61, 207, 116, 205, 236, 147, 91, 37, + 233, 117, 202, 143, 26, 28, 33, 153, 171, 28, 129, 169, 109, 19, 56, 176, + 68, 104, 181, 48, 224, 91, 41, 72, 181, 112, 170, 160, 179, 149, 49, 68, + 228, 174, 68, 233, 40, 205, 26, 54, 155, 150, 4, 10, 163, 86, 248, 83, + 64, 227, 16, 50, 111, 114, 133, 121, 10, 146, 189, 200, 47, 108, 2, 109, + 165, 188, 188, 59, 215, 226, 121, 21, 80, 86, 187, 127, 38, 218, 134, 206, + 41, 132, 233, 14, 108, 229, 164, 130, 79, 102, 190, 148, 110, 30, 217, 8, + 208, 16, 176, 145, 201, 166, 235, 172, 203, 19, 148, 242, 182, 174, 92, 136, + 147, 143, 215, 203, 176, 177, 141, 55, 25, 112, 148, 187, 153, 255, 225, 101, + 11, 79, 188, 45, 58, 17, 167, 195, 203, 85, 170, 228, 226, 236, 98, 234, + 120, 238, 76, 206, 254, 164, 15, 155, 224, 105, 73, 67, 80, 36, 196, 212, + 251, 168, 89, 146, 24, 154, 175, 242, 183, 155, 50, 109, 205, 135, 159, 242, + 135, 10, 211, 142, 218, 79, 69, 95, 28, 243, 206, 66, 47, 237, 139, 99, + 197, 108, 153, 147, 58, 90, 114, 163, 107, 20, 88, 154, 115, 115, 26, 189, + 54, 124, 59, 159, 134, 189, 205, 172, 98, 88, 96, 226, 117, 44, 130, 174, + 225, 14, 48, 233, 81, 34, 207, 133, 28, 252, 232, 3, 205, 170, 246, 144, + 66, 138, 249, 128, 27, 70, 31, 223, 105, 51, 22, 175, 214, 119, 179, 58, + 5, 62, 93, 204, 29, 40, 14, 232, 168, 34, 242, 161, 103, 76, 36, 193, + 157, 202, 135, 142, 124, 80, 110, 238, 217, 219, 31, 146, 191, 34, 154, 152, + 255, 158, 159, 67, 191, 46, 135, 236, 184, 90, 175, 29, 129, 92, 61, 55, + 99, 125, 183, 99, 193, 14, 185, 75, 231, 47, 26, 113, 157, 109, 56, 162, + 206, 176, 143, 115, 24, 19, 120, 156, 208, 227, 180, 30, 162, 65, 58, 62, + 227, 92, 101, 209, 83, 29, 21, 239, 175, 178, 38, 179, 62, 214, 206, 133, + 53, 60, 119, 172, 73, 221, 177, 166, 117, 161, 7, 127, 38, 153, 178, 225, + 185, 20, 0, 214, 17, 15, 106, 232, 115, 51, 177, 193, 59, 235, 142, 53, + 116, 212, 91, 64, 126, 106, 60, 159, 251, 68, 47, 126, 158, 95, 80, 198, + 172, 234, 3, 6, 113, 232, 63, 172, 62, 63, 202, 85, 93, 106, 36, 58, + 217, 17, 113, 109, 246, 174, 118, 111, 159, 102, 80, 34, 218, 39, 106, 53, + 221, 87, 186, 167, 149, 45, 5, 17, 216, 44, 253, 243, 175, 226, 62, 103, + 177, 20, 232, 61, 178, 223, 29, 162, 75, 36, 121, 189, 189, 233, 166, 147, + 120, 168, 176, 170, 189, 20, 93, 118, 73, 139, 56, 107, 210, 115, 102, 126, + 222, 182, 166, 189, 121, 204, 250, 61, 50, 143, 211, 139, 70, 109, 199, 197, + 6, 237, 20, 243, 17, 25, 121, 68, 87, 21, 145, 171, 122, 131, 122, 43, + 89, 131, 115, 103, 134, 80, 10, 234, 221, 25, 207, 217, 40, 205, 35, 127, + 146, 90, 68, 99, 30, 249, 131, 230, 235, 132, 100, 172, 210, 76, 49, 159, + 202, 21, 16, 217, 40, 42, 189, 125, 206, 74, 164, 181, 202, 144, 252, 111, + 102, 209, 157, 213, 58, 76, 102, 79, 152, 20, 178, 37, 5, 218, 244, 136, + 225, 145, 220, 250, 208, 81, 156, 250, 240, 31, 142, 22, 179, 21, 151, 74, + 48, 157, 16, 19, 53, 44, 8, 169, 52, 218, 169, 167, 104, 18, 16, 255, + 40, 172, 129, 48, 77, 106, 46, 198, 7, 35, 92, 30, 155, 12, 80, 11, + 199, 19, 130, 41, 228, 66, 217, 5, 13, 80, 242, 162, 59, 39, 38, 93, + 35, 228, 58, 89, 160, 129, 23, 100, 76, 20, 43, 222, 22, 6, 157, 124, + 107, 200, 40, 109, 216, 97, 46, 74, 194, 71, 189, 34, 53, 205, 239, 233, + 124, 234, 119, 177, 64, 100, 77, 242, 163, 202, 119, 85, 62, 12, 84, 178, + 97, 107, 17, 241, 210, 35, 54, 245, 92, 58, 152, 16, 162, 100, 38, 90, + 59, 76, 46, 152, 175, 103, 130, 134, 171, 69, 248, 224, 97, 82, 199, 231, + 51, 78, 239, 156, 137, 3, 129, 76, 139, 133, 114, 84, 6, 93, 28, 228, + 5, 121, 204, 240, 197, 5, 79, 204, 33, 164, 243, 10, 27, 112, 98, 149, + 102, 84, 197, 159, 3, 89, 48, 126, 12, 178, 112, 239, 206, 39, 49, 234, + 20, 73, 141, 211, 81, 65, 70, 97, 59, 129, 199, 42, 61, 70, 52, 151, + 116, 165, 75, 19, 158, 171, 147, 122, 6, 166, 103, 202, 161, 151, 41, 188, + 76, 123, 169, 212, 118, 184, 17, 81, 95, 121, 187, 163, 175, 163, 248, 206, + 162, 182, 18, 40, 73, 110, 38, 51, 40, 200, 246, 128, 164, 136, 173, 196, + 147, 155, 75, 62, 70, 163, 225, 183, 207, 187, 29, 4, 240, 97, 12, 136, + 133, 235, 254, 76, 137, 158, 102, 110, 212, 174, 239, 132, 190, 92, 65, 147, + 250, 206, 78, 62, 21, 134, 184, 221, 202, 176, 169, 10, 107, 248, 176, 15, + 145, 171, 20, 79, 101, 197, 157, 23, 246, 155, 73, 253, 113, 152, 241, 97, + 32, 233, 15, 234, 3, 136, 22, 74, 45, 12, 44, 251, 177, 87, 16, 215, + 99, 143, 176, 88, 124, 53, 146, 179, 17, 124, 224, 232, 103, 203, 101, 161, + 120, 74, 212, 176, 237, 27, 192, 163, 206, 70, 73, 152, 48, 228, 159, 156, + 54, 40, 26, 102, 167, 250, 217, 197, 238, 194, 231, 168, 111, 85, 79, 225, + 121, 10, 207, 211, 58, 186, 51, 198, 143, 3, 209, 169, 29, 122, 56, 117, + 83, 184, 147, 65, 192, 14, 49, 109, 252, 118, 138, 111, 192, 222, 165, 82, + 80, 146, 167, 149, 228, 45, 151, 228, 165, 182, 185, 36, 79, 148, 228, 237, + 224, 241, 93, 148, 123, 138, 111, 1, 97, 181, 205, 13, 130, 139, 159, 1, + 77, 171, 227, 29, 179, 216, 149, 117, 138, 65, 128, 242, 176, 189, 205, 240, + 96, 224, 52, 209, 171, 46, 14, 49, 249, 154, 163, 135, 20, 221, 169, 176, + 153, 26, 169, 233, 221, 157, 16, 135, 23, 184, 54, 32, 88, 25, 103, 18, + 241, 77, 85, 216, 199, 147, 214, 14, 169, 134, 225, 170, 225, 163, 207, 170, + 34, 28, 171, 154, 226, 89, 95, 141, 246, 18, 18, 182, 147, 205, 37, 125, + 197, 42, 97, 107, 133, 179, 125, 185, 52, 182, 146, 251, 48, 254, 169, 12, + 254, 241, 217, 219, 112, 60, 206, 227, 56, 244, 190, 199, 44, 28, 126, 126, + 219, 26, 161, 122, 141, 248, 122, 48, 86, 191, 39, 153, 179, 67, 108, 31, + 145, 106, 10, 169, 110, 86, 166, 106, 72, 180, 30, 134, 77, 241, 249, 126, + 42, 182, 97, 87, 137, 123, 129, 213, 191, 251, 246, 237, 235, 79, 12, 71, + 203, 199, 51, 25, 182, 255, 250, 211, 241, 156, 207, 105, 50, 136, 72, 9, + 30, 216, 162, 160, 15, 39, 115, 96, 186, 113, 83, 162, 15, 42, 166, 111, + 47, 62, 125, 233, 213, 104, 178, 159, 101, 26, 216, 158, 28, 216, 158, 248, + 54, 244, 225, 145, 207, 81, 171, 84, 158, 253, 50, 17, 184, 41, 140, 82, + 156, 41, 5, 46, 84, 125, 71, 234, 163, 224, 251, 104, 69, 121, 204, 239, + 194, 72, 241, 104, 243, 20, 67, 32, 99, 26, 27, 81, 38, 156, 24, 101, + 157, 51, 33, 6, 154, 89, 205, 76, 126, 62, 7, 246, 241, 225, 100, 130, + 243, 224, 199, 15, 229, 209, 122, 169, 155, 218, 49, 236, 74, 28, 67, 226, + 219, 55, 207, 35, 254, 50, 250, 52, 140, 23, 227, 204, 152, 15, 0, 54, + 96, 142, 150, 146, 85, 26, 254, 249, 223, 201, 152, 145, 28, 5, 102, 239, + 225, 236, 165, 149, 84, 237, 81, 81, 28, 153, 193, 120, 60, 198, 171, 138, + 24, 219, 55, 98, 246, 137, 204, 84, 123, 68, 47, 98, 171, 151, 61, 111, + 99, 28, 79, 115, 122, 8, 120, 17, 240, 139, 47, 67, 209, 53, 37, 158, + 69, 112, 242, 216, 192, 57, 143, 98, 51, 158, 34, 166, 20, 113, 163, 79, + 114, 252, 130, 11, 231, 4, 113, 221, 252, 125, 39, 22, 97, 123, 110, 252, + 164, 36, 72, 176, 120, 160, 249, 66, 221, 224, 9, 132, 18, 10, 232, 11, + 191, 164, 4, 106, 215, 194, 113, 72, 82, 235, 88, 143, 229, 70, 240, 61, + 99, 105, 167, 165, 20, 218, 193, 26, 26, 240, 9, 50, 144, 40, 193, 25, + 207, 5, 88, 245, 98, 68, 99, 46, 87, 147, 88, 51, 194, 70, 86, 236, + 227, 148, 70, 51, 156, 245, 141, 14, 251, 207, 225, 163, 7, 126, 184, 122, + 218, 203, 174, 227, 154, 52, 197, 132, 156, 193, 28, 235, 8, 195, 90, 53, + 255, 206, 168, 149, 86, 7, 248, 37, 28, 84, 116, 152, 136, 127, 167, 120, + 68, 90, 56, 239, 137, 125, 112, 133, 67, 147, 55, 113, 223, 38, 74, 162, + 166, 217, 218, 210, 40, 97, 160, 248, 60, 98, 109, 75, 122, 143, 49, 76, + 82, 197, 178, 148, 241, 196, 191, 51, 5, 0, 22, 57, 46, 252, 201, 120, + 108, 54, 207, 214, 106, 104, 195, 36, 165, 98, 142, 88, 3, 184, 23, 72, + 220, 87, 58, 239, 75, 150, 50, 98, 34, 185, 121, 124, 78, 136, 225, 60, + 221, 35, 129, 127, 114, 167, 84, 63, 143, 103, 122, 203, 131, 195, 188, 229, + 227, 175, 32, 101, 106, 39, 122, 13, 131, 6, 173, 156, 209, 255, 167, 212, + 34, 53, 85, 148, 191, 24, 101, 104, 23, 5, 40, 9, 100, 243, 18, 179, + 224, 204, 214, 97, 237, 228, 119, 112, 87, 97, 19, 111, 25, 5, 165, 47, + 197, 221, 125, 101, 113, 119, 111, 152, 115, 241, 182, 125, 212, 87, 136, 9, + 174, 161, 151, 238, 87, 254, 241, 221, 141, 148, 2, 0, 15, 37, 244, 10, + 138, 54, 242, 27, 95, 181, 223, 228, 133, 70, 27, 12, 51, 222, 45, 131, + 49, 85, 242, 208, 111, 6, 84, 65, 221, 87, 13, 107, 135, 131, 243, 90, + 132, 200, 177, 233, 16, 254, 206, 138, 44, 155, 24, 232, 197, 243, 8, 177, + 228, 116, 39, 220, 124, 252, 24, 65, 105, 220, 199, 143, 39, 48, 76, 240, + 27, 94, 130, 199, 143, 147, 73, 130, 27, 152, 176, 204, 220, 158, 194, 201, + 2, 216, 215, 126, 61, 89, 177, 185, 152, 20, 74, 23, 87, 157, 119, 159, + 24, 36, 162, 103, 185, 28, 130, 20, 122, 5, 194, 40, 132, 63, 187, 97, + 9, 230, 143, 159, 60, 117, 62, 167, 182, 222, 134, 4, 14, 251, 249, 171, + 111, 159, 126, 245, 225, 125, 219, 43, 100, 11, 143, 31, 227, 162, 221, 77, + 237, 32, 190, 183, 155, 13, 130, 180, 229, 173, 25, 139, 18, 34, 126, 138, + 77, 42, 125, 28, 81, 50, 54, 200, 162, 246, 71, 96, 172, 18, 244, 61, + 49, 16, 9, 239, 171, 183, 145, 255, 234, 21, 60, 50, 108, 200, 211, 248, + 4, 241, 175, 161, 99, 55, 172, 16, 14, 62, 209, 54, 50, 121, 119, 184, + 238, 224, 255, 2, 39, 195, 223, 112, 138, 249, 85, 23, 70, 79, 12, 156, + 93, 197, 188, 223, 108, 215, 201, 167, 82, 115, 239, 170, 244, 252, 217, 244, + 240, 249, 164, 87, 125, 241, 118, 240, 215, 199, 205, 86, 185, 253, 182, 119, + 250, 41, 255, 234, 248, 246, 180, 126, 244, 110, 119, 114, 184, 127, 80, 63, + 188, 253, 80, 120, 218, 105, 86, 158, 157, 246, 246, 158, 214, 119, 39, 251, + 187, 127, 126, 252, 124, 115, 147, 235, 21, 254, 26, 182, 7, 245, 246, 225, + 81, 247, 104, 253, 218, 125, 58, 201, 77, 223, 157, 158, 30, 126, 238, 31, + 20, 190, 189, 174, 191, 111, 31, 120, 175, 158, 183, 18, 137, 238, 135, 79, + 94, 175, 231, 125, 251, 248, 225, 91, 251, 122, 24, 188, 184, 218, 252, 212, + 152, 4, 239, 160, 244, 233, 209, 83, 89, 195, 161, 143, 53, 84, 114, 181, + 227, 211, 235, 171, 147, 219, 15, 211, 215, 199, 227, 221, 167, 55, 181, 247, + 71, 193, 201, 155, 111, 123, 245, 93, 251, 227, 155, 207, 126, 194, 168, 214, + 208, 30, 184, 95, 27, 12, 80, 156, 155, 165, 181, 32, 23, 6, 124, 31, + 111, 61, 112, 212, 247, 114, 86, 125, 47, 191, 138, 226, 226, 252, 143, 135, + 124, 225, 46, 237, 231, 6, 239, 80, 27, 188, 211, 49, 118, 237, 229, 105, + 235, 229, 126, 119, 119, 124, 112, 244, 122, 250, 226, 245, 139, 220, 11, 251, + 195, 238, 241, 75, 247, 237, 94, 233, 237, 97, 171, 231, 13, 95, 230, 95, + 236, 86, 55, 95, 60, 43, 117, 63, 12, 223, 31, 127, 122, 234, 77, 15, + 79, 62, 37, 18, 239, 11, 181, 113, 161, 214, 182, 91, 239, 55, 55, 243, + 245, 209, 171, 23, 245, 221, 238, 97, 183, 180, 113, 123, 80, 63, 186, 218, + 229, 90, 158, 30, 77, 143, 235, 189, 124, 231, 197, 73, 112, 245, 233, 229, + 225, 237, 134, 119, 116, 117, 85, 217, 221, 237, 7, 215, 183, 199, 183, 238, + 171, 250, 233, 238, 73, 235, 195, 179, 77, 96, 83, 255, 147, 3, 168, 93, + 53, 254, 212, 224, 237, 191, 209, 6, 239, 13, 205, 139, 189, 202, 139, 189, + 253, 55, 187, 245, 253, 221, 215, 147, 207, 39, 87, 79, 115, 245, 193, 228, + 67, 254, 227, 171, 230, 250, 126, 103, 119, 116, 253, 234, 228, 67, 241, 221, + 233, 213, 251, 143, 189, 225, 164, 81, 126, 119, 179, 49, 238, 125, 28, 93, + 38, 18, 31, 198, 251, 7, 127, 229, 161, 164, 195, 49, 150, 6, 165, 94, + 29, 93, 157, 190, 170, 189, 156, 220, 110, 230, 189, 230, 187, 163, 220, 241, + 251, 195, 124, 176, 187, 251, 106, 179, 112, 116, 91, 217, 124, 218, 125, 190, + 187, 95, 248, 184, 119, 121, 250, 176, 129, 194, 159, 127, 101, 168, 180, 123, + 215, 159, 155, 103, 187, 250, 80, 229, 113, 168, 142, 43, 223, 38, 52, 84, + 71, 239, 119, 143, 39, 238, 59, 219, 222, 40, 29, 62, 221, 124, 215, 120, + 93, 174, 212, 158, 22, 223, 188, 233, 190, 123, 89, 216, 109, 22, 110, 62, + 125, 242, 63, 189, 63, 44, 78, 250, 118, 249, 38, 145, 248, 243, 67, 110, + 175, 243, 225, 83, 112, 245, 47, 206, 171, 248, 96, 201, 129, 250, 7, 195, + 164, 110, 250, 188, 159, 26, 38, 232, 208, 68, 124, 127, 236, 84, 225, 120, + 12, 157, 122, 254, 233, 245, 135, 55, 197, 221, 163, 221, 198, 254, 171, 207, + 133, 226, 94, 109, 51, 247, 166, 243, 233, 229, 110, 255, 224, 104, 243, 168, + 58, 120, 94, 218, 124, 115, 250, 122, 240, 188, 249, 122, 154, 127, 86, 250, + 235, 244, 197, 110, 215, 43, 37, 18, 71, 181, 219, 195, 151, 246, 155, 151, + 157, 193, 237, 159, 131, 111, 126, 233, 109, 233, 114, 243, 205, 230, 243, 102, + 105, 175, 243, 188, 125, 240, 87, 227, 93, 109, 99, 252, 231, 235, 234, 199, + 111, 175, 237, 163, 169, 93, 121, 86, 125, 121, 181, 249, 186, 247, 241, 141, + 123, 115, 251, 182, 189, 209, 202, 253, 185, 89, 200, 239, 190, 56, 216, 188, + 234, 12, 238, 166, 127, 137, 196, 207, 80, 64, 187, 221, 68, 203, 231, 172, + 57, 49, 25, 0, 15, 175, 213, 212, 237, 211, 228, 239, 92, 164, 250, 63, + 59, 188, 121, 109, 120, 39, 71, 251, 187, 184, 196, 90, 87, 215, 7, 175, + 119, 111, 15, 14, 119, 39, 157, 192, 127, 154, 115, 115, 83, 251, 168, 218, + 250, 208, 234, 238, 190, 122, 89, 107, 215, 111, 174, 118, 95, 63, 183, 79, + 174, 159, 14, 54, 14, 90, 47, 6, 87, 111, 223, 36, 18, 215, 110, 115, + 90, 25, 191, 179, 115, 254, 85, 101, 244, 178, 213, 105, 52, 26, 151, 193, + 187, 201, 201, 171, 79, 227, 205, 253, 210, 203, 246, 233, 160, 220, 254, 243, + 245, 183, 246, 180, 244, 185, 179, 233, 127, 24, 124, 252, 184, 121, 106, 15, + 198, 181, 215, 55, 229, 245, 211, 61, 239, 230, 205, 201, 201, 126, 231, 99, + 190, 148, 219, 221, 123, 241, 46, 95, 216, 219, 95, 53, 155, 19, 137, 191, + 51, 159, 31, 58, 204, 168, 35, 177, 98, 156, 131, 96, 121, 152, 131, 159, + 29, 230, 66, 124, 152, 15, 112, 152, 63, 190, 111, 13, 94, 143, 247, 119, + 15, 119, 111, 106, 133, 87, 246, 173, 125, 108, 223, 190, 27, 62, 239, 182, + 107, 211, 247, 213, 171, 241, 225, 171, 211, 247, 155, 135, 221, 23, 207, 119, + 203, 189, 215, 245, 234, 155, 160, 227, 37, 18, 77, 239, 175, 102, 231, 69, + 181, 243, 218, 246, 221, 103, 163, 87, 245, 160, 115, 153, 255, 116, 248, 58, + 56, 237, 182, 78, 54, 222, 28, 188, 89, 47, 60, 61, 184, 238, 190, 42, + 125, 56, 220, 127, 31, 0, 109, 28, 111, 188, 254, 171, 220, 203, 183, 246, + 43, 71, 87, 222, 201, 241, 135, 171, 207, 211, 253, 186, 61, 202, 255, 249, + 254, 249, 211, 194, 159, 205, 215, 227, 221, 21, 52, 54, 145, 248, 59, 84, + 246, 111, 204, 102, 26, 241, 251, 166, 115, 254, 39, 199, 249, 96, 172, 83, + 139, 163, 93, 156, 52, 31, 79, 222, 48, 181, 232, 111, 212, 234, 159, 115, + 39, 27, 239, 143, 237, 202, 243, 231, 239, 166, 197, 247, 123, 71, 239, 223, + 212, 191, 181, 62, 156, 148, 246, 247, 246, 15, 143, 255, 220, 123, 249, 87, + 249, 232, 205, 139, 111, 137, 68, 123, 252, 109, 189, 150, 119, 107, 165, 70, + 125, 186, 209, 204, 93, 237, 191, 218, 243, 222, 52, 90, 111, 63, 237, 221, + 86, 78, 94, 184, 155, 111, 59, 253, 205, 221, 63, 223, 247, 95, 188, 123, + 61, 58, 46, 28, 219, 135, 207, 158, 109, 254, 121, 120, 186, 57, 122, 125, + 178, 223, 28, 86, 222, 220, 28, 60, 96, 239, 74, 36, 254, 205, 113, 213, + 167, 175, 62, 176, 171, 230, 111, 225, 103, 231, 111, 176, 130, 76, 84, 175, + 90, 7, 175, 38, 79, 119, 143, 222, 158, 188, 110, 119, 130, 209, 179, 224, + 198, 62, 248, 243, 243, 219, 254, 254, 129, 255, 109, 220, 63, 172, 223, 158, + 236, 109, 28, 117, 10, 254, 209, 254, 77, 190, 217, 216, 43, 3, 153, 152, + 94, 189, 153, 142, 222, 238, 221, 110, 22, 223, 62, 219, 56, 110, 191, 59, + 221, 45, 111, 110, 12, 138, 133, 171, 205, 194, 167, 170, 91, 126, 246, 109, + 242, 220, 59, 58, 254, 152, 27, 120, 181, 82, 235, 104, 116, 245, 246, 69, + 245, 176, 48, 30, 94, 110, 126, 118, 63, 117, 62, 181, 159, 125, 122, 157, + 91, 127, 217, 126, 249, 249, 93, 229, 228, 227, 228, 208, 123, 186, 114, 211, + 251, 207, 145, 9, 60, 52, 221, 55, 206, 197, 159, 27, 231, 247, 245, 219, + 216, 252, 197, 222, 60, 255, 248, 218, 125, 243, 109, 247, 205, 110, 227, 182, + 184, 254, 236, 178, 120, 98, 231, 6, 175, 138, 197, 247, 199, 223, 94, 126, + 216, 123, 218, 189, 221, 127, 209, 41, 212, 63, 140, 63, 109, 30, 28, 238, + 117, 26, 77, 191, 211, 222, 59, 73, 36, 222, 180, 95, 60, 173, 29, 141, + 247, 203, 163, 219, 189, 227, 167, 47, 188, 238, 95, 181, 253, 189, 131, 230, + 201, 187, 79, 205, 221, 238, 231, 15, 27, 167, 151, 141, 78, 254, 100, 218, + 60, 174, 120, 159, 131, 230, 230, 230, 241, 248, 195, 203, 147, 163, 238, 199, + 233, 199, 65, 112, 178, 187, 251, 238, 219, 65, 63, 255, 67, 134, 34, 145, + 248, 215, 199, 22, 199, 83, 140, 173, 23, 104, 196, 1, 6, 55, 82, 199, + 70, 19, 143, 31, 128, 159, 80, 34, 118, 156, 77, 143, 191, 82, 49, 251, + 112, 185, 222, 251, 180, 180, 23, 212, 111, 17, 131, 105, 193, 247, 181, 6, + 196, 196, 78, 111, 16, 243, 160, 220, 31, 13, 26, 171, 144, 38, 52, 164, + 228, 42, 156, 123, 6, 210, 17, 43, 193, 55, 245, 187, 215, 171, 193, 62, + 180, 92, 151, 77, 116, 76, 17, 229, 98, 175, 220, 217, 123, 245, 131, 87, + 122, 126, 32, 216, 22, 14, 221, 219, 125, 250, 74, 139, 193, 14, 141, 75, + 61, 89, 164, 130, 155, 184, 41, 53, 91, 37, 212, 237, 102, 44, 151, 255, + 126, 152, 100, 9, 129, 64, 37, 225, 200, 208, 151, 180, 114, 232, 45, 145, + 97, 59, 228, 115, 57, 113, 118, 92, 27, 115, 71, 207, 19, 44, 249, 185, + 198, 240, 203, 166, 225, 69, 136, 98, 137, 11, 49, 99, 207, 206, 19, 78, + 2, 175, 28, 243, 174, 75, 222, 33, 92, 231, 68, 120, 31, 158, 92, 240, + 236, 16, 48, 1, 231, 230, 5, 63, 49, 231, 157, 160, 98, 141, 11, 53, + 243, 161, 240, 129, 82, 203, 242, 204, 228, 26, 162, 198, 118, 230, 107, 41, + 105, 244, 148, 53, 103, 107, 255, 247, 26, 105, 57, 2, 107, 63, 27, 178, + 60, 93, 20, 138, 232, 22, 168, 33, 86, 218, 70, 241, 4, 251, 166, 9, + 146, 132, 59, 44, 95, 92, 114, 11, 136, 243, 19, 149, 183, 67, 143, 159, + 133, 65, 118, 232, 242, 43, 221, 226, 135, 155, 226, 109, 216, 104, 86, 174, + 59, 64, 31, 80, 7, 1, 135, 36, 114, 227, 119, 193, 239, 202, 245, 221, + 5, 101, 128, 247, 238, 196, 67, 241, 113, 119, 74, 127, 132, 210, 97, 44, + 17, 94, 190, 154, 201, 192, 119, 138, 249, 173, 98, 30, 70, 45, 21, 63, + 153, 120, 164, 255, 180, 145, 206, 111, 204, 157, 89, 158, 254, 8, 215, 204, + 74, 200, 237, 76, 229, 205, 200, 70, 36, 118, 156, 229, 55, 210, 214, 14, + 169, 106, 209, 227, 148, 31, 125, 12, 244, 208, 171, 22, 63, 165, 210, 86, + 188, 115, 115, 199, 138, 250, 238, 204, 188, 140, 53, 205, 229, 231, 36, 80, + 163, 235, 47, 134, 108, 136, 84, 28, 102, 150, 26, 69, 110, 163, 165, 143, + 164, 30, 36, 146, 216, 249, 245, 21, 169, 40, 116, 9, 151, 139, 92, 214, + 249, 27, 6, 2, 126, 10, 33, 20, 203, 251, 92, 242, 124, 64, 138, 96, + 244, 0, 25, 11, 226, 63, 33, 146, 162, 124, 229, 73, 56, 211, 186, 147, + 30, 231, 188, 13, 119, 190, 208, 252, 73, 198, 43, 66, 7, 81, 181, 13, + 94, 108, 124, 217, 160, 50, 177, 4, 174, 110, 117, 42, 159, 82, 69, 66, + 200, 88, 196, 66, 89, 145, 16, 83, 149, 181, 177, 156, 170, 152, 55, 239, + 168, 48, 163, 39, 50, 34, 13, 124, 20, 207, 205, 26, 20, 27, 141, 14, + 123, 133, 40, 68, 10, 179, 119, 140, 206, 84, 142, 142, 250, 250, 228, 59, + 179, 152, 138, 13, 145, 104, 194, 84, 111, 244, 212, 230, 26, 163, 33, 90, + 153, 74, 180, 43, 26, 162, 141, 123, 202, 138, 134, 40, 86, 150, 31, 79, + 165, 134, 40, 22, 190, 177, 152, 200, 208, 118, 234, 113, 144, 213, 33, 99, + 247, 176, 199, 137, 133, 165, 42, 157, 68, 90, 177, 21, 109, 140, 189, 51, + 139, 201, 31, 124, 18, 122, 64, 224, 91, 249, 200, 229, 29, 18, 188, 86, + 226, 55, 14, 76, 16, 198, 174, 72, 80, 158, 103, 229, 227, 100, 190, 64, + 44, 168, 70, 32, 15, 104, 32, 54, 153, 155, 83, 126, 154, 206, 141, 137, + 15, 79, 62, 133, 241, 19, 134, 5, 240, 20, 80, 24, 63, 77, 249, 66, + 108, 226, 9, 211, 74, 204, 91, 158, 63, 102, 138, 67, 183, 91, 240, 176, + 237, 58, 144, 194, 193, 71, 248, 164, 72, 132, 56, 102, 74, 49, 83, 140, + 153, 98, 76, 181, 214, 26, 150, 216, 120, 154, 85, 57, 96, 213, 99, 30, + 161, 203, 129, 111, 83, 242, 163, 218, 247, 208, 181, 77, 180, 156, 109, 180, + 5, 134, 70, 90, 125, 111, 137, 142, 24, 85, 244, 221, 154, 142, 74, 147, + 86, 132, 84, 27, 214, 58, 229, 120, 89, 254, 98, 124, 55, 4, 234, 147, + 140, 17, 138, 92, 62, 245, 21, 53, 105, 230, 146, 246, 113, 150, 36, 231, + 97, 57, 190, 66, 253, 139, 62, 28, 212, 110, 91, 59, 105, 171, 138, 119, + 94, 88, 23, 191, 77, 129, 214, 245, 161, 194, 190, 31, 163, 121, 86, 215, + 177, 196, 70, 194, 55, 235, 56, 164, 208, 11, 19, 7, 16, 90, 187, 68, + 244, 233, 190, 138, 41, 189, 41, 40, 125, 244, 69, 124, 131, 113, 122, 101, + 107, 232, 131, 76, 217, 145, 18, 93, 215, 168, 186, 22, 139, 213, 239, 224, + 176, 48, 237, 246, 94, 222, 193, 249, 171, 2, 131, 229, 192, 47, 134, 42, + 224, 195, 201, 98, 110, 45, 36, 88, 10, 241, 156, 56, 34, 130, 191, 240, + 30, 136, 119, 177, 35, 206, 146, 220, 79, 116, 159, 154, 68, 51, 197, 148, + 242, 161, 170, 13, 151, 222, 161, 152, 191, 92, 127, 69, 88, 176, 34, 204, + 211, 212, 22, 22, 242, 198, 194, 130, 21, 97, 158, 163, 24, 61, 45, 239, + 114, 88, 160, 133, 45, 244, 46, 115, 79, 239, 162, 239, 245, 110, 110, 118, + 213, 103, 39, 102, 156, 152, 27, 68, 180, 84, 70, 162, 65, 100, 52, 61, + 9, 164, 149, 244, 36, 216, 14, 54, 242, 34, 120, 10, 193, 222, 166, 111, + 106, 12, 201, 12, 82, 164, 97, 35, 203, 161, 83, 13, 36, 214, 194, 155, + 47, 164, 212, 243, 109, 171, 108, 17, 231, 50, 131, 240, 156, 164, 241, 50, + 219, 246, 234, 92, 196, 24, 145, 198, 46, 214, 183, 33, 106, 67, 64, 110, + 157, 85, 226, 4, 211, 32, 157, 23, 229, 178, 210, 192, 34, 35, 132, 183, + 195, 232, 207, 89, 218, 97, 123, 113, 171, 234, 5, 139, 107, 197, 200, 193, + 138, 2, 18, 140, 70, 74, 99, 159, 255, 4, 244, 39, 210, 119, 84, 71, + 44, 114, 81, 182, 234, 140, 197, 49, 102, 237, 242, 146, 97, 98, 25, 178, + 89, 132, 254, 74, 227, 87, 189, 222, 123, 78, 87, 11, 135, 171, 255, 105, + 198, 138, 108, 153, 120, 28, 110, 40, 235, 242, 99, 3, 207, 6, 136, 40, + 79, 183, 145, 112, 4, 147, 70, 221, 186, 159, 57, 205, 91, 22, 225, 123, + 141, 146, 153, 188, 235, 228, 93, 212, 2, 235, 215, 190, 69, 122, 20, 192, + 58, 227, 172, 172, 54, 251, 66, 177, 99, 132, 218, 142, 236, 14, 42, 45, + 19, 1, 123, 129, 51, 83, 183, 34, 242, 156, 53, 11, 74, 38, 135, 106, + 211, 180, 79, 22, 142, 88, 114, 174, 145, 90, 99, 194, 63, 27, 219, 254, + 92, 75, 62, 89, 51, 23, 10, 56, 13, 147, 211, 204, 134, 107, 123, 5, + 42, 102, 146, 11, 220, 148, 237, 185, 228, 80, 109, 146, 243, 161, 78, 212, + 149, 59, 221, 118, 191, 127, 63, 221, 9, 11, 104, 164, 227, 156, 234, 38, + 148, 21, 97, 83, 144, 78, 155, 159, 106, 173, 74, 151, 1, 22, 133, 145, + 179, 131, 6, 198, 221, 113, 173, 127, 57, 106, 9, 20, 207, 222, 130, 225, + 250, 184, 219, 191, 54, 211, 105, 97, 86, 37, 213, 8, 200, 221, 88, 33, + 26, 192, 35, 52, 75, 34, 92, 55, 56, 25, 93, 134, 168, 114, 171, 171, + 132, 6, 79, 32, 228, 126, 99, 8, 158, 203, 7, 60, 151, 141, 33, 186, + 115, 31, 134, 51, 86, 222, 69, 221, 150, 57, 123, 115, 71, 215, 3, 70, + 73, 16, 133, 33, 130, 172, 248, 196, 49, 148, 240, 201, 67, 28, 24, 31, + 121, 134, 50, 146, 82, 220, 175, 127, 183, 142, 129, 158, 112, 154, 50, 62, + 97, 154, 50, 165, 97, 68, 0, 200, 112, 110, 226, 111, 239, 220, 33, 207, + 43, 50, 188, 76, 225, 229, 40, 92, 250, 112, 115, 133, 226, 251, 48, 131, + 181, 226, 169, 144, 141, 160, 168, 12, 19, 53, 125, 112, 166, 148, 88, 13, + 216, 151, 145, 101, 61, 178, 44, 35, 165, 218, 241, 16, 193, 99, 220, 66, + 106, 71, 244, 139, 38, 91, 233, 158, 201, 22, 164, 88, 89, 113, 136, 29, + 29, 218, 4, 75, 131, 37, 56, 202, 239, 66, 138, 250, 110, 216, 183, 104, + 44, 52, 28, 98, 131, 135, 54, 80, 88, 152, 113, 194, 12, 7, 221, 251, + 56, 194, 115, 205, 162, 253, 155, 45, 80, 19, 216, 197, 39, 171, 135, 171, + 190, 147, 109, 22, 107, 133, 103, 197, 176, 100, 200, 135, 92, 92, 99, 60, + 107, 12, 17, 76, 64, 34, 1, 137, 118, 165, 125, 212, 106, 167, 125, 104, + 56, 220, 9, 173, 163, 197, 15, 77, 122, 210, 15, 115, 32, 87, 224, 67, + 219, 195, 125, 199, 5, 164, 214, 28, 60, 204, 119, 28, 54, 9, 147, 211, + 108, 22, 112, 27, 89, 229, 61, 238, 97, 190, 222, 206, 102, 25, 152, 121, + 199, 25, 127, 206, 174, 231, 104, 115, 137, 249, 126, 251, 54, 42, 117, 134, + 64, 50, 81, 98, 194, 200, 200, 236, 165, 118, 39, 244, 87, 109, 54, 111, + 159, 239, 9, 1, 152, 200, 200, 240, 4, 114, 215, 89, 40, 237, 78, 84, + 98, 203, 219, 241, 126, 161, 139, 55, 108, 229, 27, 173, 125, 63, 129, 208, + 176, 10, 152, 129, 48, 223, 129, 37, 24, 51, 218, 187, 26, 131, 129, 41, + 144, 222, 185, 219, 151, 205, 90, 213, 28, 33, 237, 146, 185, 5, 100, 3, + 236, 52, 215, 25, 196, 64, 24, 152, 165, 86, 189, 219, 111, 14, 27, 237, + 187, 205, 254, 87, 187, 124, 131, 65, 14, 246, 73, 164, 38, 108, 79, 24, + 220, 157, 191, 69, 101, 84, 126, 160, 231, 55, 173, 24, 246, 6, 59, 16, + 93, 201, 85, 16, 210, 190, 6, 125, 138, 57, 133, 253, 65, 147, 152, 104, + 203, 146, 170, 77, 196, 183, 145, 142, 101, 157, 7, 150, 33, 1, 100, 204, + 82, 181, 138, 50, 79, 220, 48, 187, 109, 14, 126, 112, 167, 84, 33, 253, + 26, 34, 237, 40, 217, 233, 221, 160, 185, 64, 249, 154, 195, 40, 31, 186, + 231, 147, 85, 51, 14, 247, 170, 172, 31, 238, 204, 58, 234, 52, 47, 17, + 16, 31, 113, 47, 91, 136, 162, 190, 34, 247, 209, 157, 185, 219, 181, 106, + 179, 212, 201, 84, 70, 195, 104, 134, 252, 0, 118, 185, 218, 165, 94, 226, + 116, 67, 97, 45, 202, 187, 37, 82, 136, 154, 108, 157, 170, 217, 43, 193, + 96, 253, 0, 121, 216, 236, 143, 32, 245, 210, 20, 253, 223, 133, 47, 177, + 224, 188, 130, 228, 192, 44, 72, 198, 45, 160, 177, 19, 160, 39, 11, 116, + 41, 17, 68, 46, 45, 80, 1, 91, 160, 45, 26, 118, 223, 156, 141, 129, + 80, 19, 227, 132, 86, 172, 36, 216, 68, 69, 214, 177, 179, 1, 135, 14, + 225, 36, 62, 136, 224, 131, 7, 232, 176, 208, 91, 98, 18, 169, 108, 101, + 188, 92, 67, 196, 143, 102, 117, 128, 194, 99, 157, 186, 94, 4, 85, 244, + 100, 72, 59, 34, 25, 79, 184, 210, 231, 48, 26, 95, 146, 253, 113, 119, + 80, 11, 170, 75, 249, 16, 153, 7, 33, 221, 177, 1, 9, 71, 172, 122, + 152, 68, 238, 93, 41, 5, 93, 208, 211, 122, 119, 164, 221, 151, 4, 224, + 9, 186, 99, 75, 56, 138, 32, 220, 85, 184, 158, 161, 163, 165, 103, 9, + 3, 12, 171, 211, 216, 134, 241, 70, 168, 33, 24, 122, 196, 79, 58, 199, + 241, 119, 60, 22, 214, 115, 0, 124, 45, 224, 100, 3, 175, 48, 119, 130, + 98, 65, 137, 248, 201, 118, 91, 147, 243, 161, 122, 96, 0, 44, 10, 254, + 196, 36, 177, 174, 158, 42, 112, 81, 11, 115, 54, 206, 96, 105, 247, 166, + 196, 210, 54, 101, 202, 162, 187, 152, 50, 235, 196, 106, 15, 200, 45, 34, + 218, 149, 201, 114, 61, 61, 26, 154, 133, 170, 174, 28, 77, 133, 249, 6, + 118, 148, 58, 139, 156, 120, 114, 186, 189, 237, 121, 41, 59, 57, 217, 222, + 246, 83, 118, 176, 38, 44, 131, 129, 11, 33, 94, 39, 226, 184, 77, 101, + 32, 172, 134, 19, 216, 217, 232, 227, 133, 46, 19, 133, 208, 51, 7, 110, + 8, 223, 9, 241, 84, 187, 157, 56, 206, 52, 230, 135, 41, 150, 50, 236, + 204, 153, 154, 131, 104, 197, 110, 219, 241, 247, 72, 14, 25, 225, 211, 85, + 38, 211, 91, 116, 59, 156, 65, 103, 134, 27, 198, 213, 89, 183, 124, 21, + 84, 25, 235, 109, 131, 90, 43, 66, 136, 13, 139, 90, 198, 54, 43, 52, + 51, 209, 221, 209, 182, 95, 40, 26, 54, 144, 136, 218, 228, 140, 67, 129, + 37, 214, 42, 39, 231, 18, 69, 211, 22, 145, 202, 133, 176, 2, 1, 145, + 153, 92, 115, 103, 7, 113, 22, 4, 126, 247, 82, 59, 23, 221, 35, 91, + 23, 199, 153, 6, 243, 214, 80, 30, 175, 35, 88, 203, 252, 128, 208, 103, + 209, 151, 9, 204, 43, 140, 211, 220, 21, 19, 70, 135, 195, 204, 40, 145, + 10, 242, 185, 7, 236, 110, 212, 79, 173, 203, 231, 34, 37, 89, 236, 181, + 239, 74, 2, 60, 176, 252, 168, 184, 238, 149, 198, 187, 8, 56, 199, 89, + 16, 199, 189, 165, 24, 88, 29, 41, 57, 128, 180, 82, 180, 209, 115, 102, + 110, 118, 61, 109, 169, 41, 130, 86, 144, 72, 231, 182, 37, 157, 203, 138, + 133, 38, 76, 249, 84, 194, 40, 75, 188, 237, 171, 19, 232, 45, 135, 38, + 44, 52, 29, 27, 69, 19, 127, 85, 235, 85, 91, 161, 15, 173, 17, 16, + 82, 68, 102, 208, 191, 127, 41, 27, 235, 208, 212, 100, 139, 40, 219, 153, + 0, 13, 29, 147, 175, 74, 36, 193, 164, 45, 63, 38, 67, 79, 58, 64, + 6, 202, 113, 30, 206, 14, 148, 102, 171, 66, 80, 248, 77, 104, 200, 210, + 245, 166, 84, 18, 183, 151, 125, 93, 250, 78, 236, 192, 97, 40, 145, 141, + 90, 127, 81, 15, 22, 186, 173, 53, 154, 214, 61, 118, 190, 37, 76, 191, + 199, 119, 122, 171, 89, 98, 106, 127, 149, 171, 106, 58, 31, 8, 31, 118, + 4, 212, 155, 22, 99, 56, 207, 33, 160, 239, 156, 205, 60, 68, 236, 84, + 198, 54, 40, 182, 129, 177, 210, 163, 93, 51, 228, 40, 97, 221, 129, 11, + 34, 165, 220, 201, 9, 137, 28, 34, 104, 104, 132, 106, 246, 72, 155, 146, + 166, 176, 117, 160, 121, 98, 70, 94, 114, 150, 74, 240, 13, 56, 93, 100, + 96, 128, 224, 116, 1, 19, 183, 2, 84, 41, 250, 166, 76, 156, 204, 21, + 251, 167, 44, 30, 22, 181, 172, 198, 89, 248, 64, 230, 99, 69, 69, 240, + 35, 75, 194, 73, 109, 65, 235, 75, 217, 24, 95, 107, 140, 24, 90, 125, + 86, 237, 248, 70, 95, 159, 186, 122, 36, 218, 126, 252, 135, 26, 183, 19, + 6, 134, 182, 17, 192, 96, 71, 111, 115, 173, 198, 133, 193, 134, 175, 121, + 4, 71, 249, 88, 109, 138, 129, 205, 154, 241, 245, 195, 208, 26, 122, 103, + 127, 200, 199, 252, 195, 174, 106, 205, 124, 139, 88, 192, 232, 43, 51, 202, + 168, 49, 85, 122, 240, 50, 11, 243, 175, 54, 228, 195, 220, 16, 39, 2, + 60, 223, 14, 251, 77, 56, 174, 32, 119, 30, 31, 171, 64, 57, 72, 250, + 175, 26, 48, 134, 52, 22, 209, 238, 242, 218, 162, 25, 211, 237, 246, 171, + 131, 21, 107, 57, 19, 204, 205, 145, 23, 206, 146, 73, 139, 211, 236, 236, + 248, 169, 199, 5, 96, 83, 50, 94, 1, 152, 182, 27, 140, 83, 81, 50, + 88, 163, 243, 35, 96, 85, 71, 110, 104, 141, 60, 243, 6, 254, 220, 72, + 76, 100, 136, 120, 132, 161, 194, 164, 255, 6, 223, 110, 60, 163, 227, 134, + 51, 50, 56, 161, 156, 95, 125, 27, 118, 10, 252, 11, 68, 165, 3, 197, + 208, 229, 95, 199, 221, 241, 130, 130, 3, 9, 210, 240, 55, 7, 239, 248, + 156, 154, 155, 157, 155, 133, 20, 55, 90, 138, 27, 74, 49, 150, 229, 51, + 204, 178, 183, 225, 251, 133, 12, 100, 160, 202, 240, 129, 107, 195, 234, 188, + 168, 37, 158, 104, 137, 39, 91, 34, 174, 33, 59, 158, 104, 137, 39, 234, + 241, 240, 153, 90, 178, 144, 226, 70, 75, 113, 67, 41, 198, 222, 29, 45, + 241, 100, 75, 60, 209, 146, 81, 56, 195, 118, 165, 45, 200, 147, 129, 95, + 248, 116, 3, 20, 229, 6, 195, 233, 109, 132, 225, 35, 78, 1, 180, 94, + 165, 143, 194, 49, 125, 39, 234, 144, 232, 15, 255, 25, 115, 175, 72, 230, + 0, 19, 56, 168, 162, 243, 140, 17, 180, 211, 177, 198, 206, 44, 83, 66, + 73, 176, 213, 201, 81, 11, 83, 116, 107, 211, 107, 206, 205, 246, 205, 25, + 115, 75, 231, 232, 238, 175, 29, 243, 158, 46, 206, 37, 241, 239, 174, 209, + 30, 229, 143, 243, 81, 18, 103, 34, 205, 16, 101, 160, 72, 19, 85, 153, + 232, 137, 219, 43, 158, 189, 17, 188, 185, 17, 167, 84, 63, 201, 66, 10, + 49, 254, 224, 55, 75, 8, 121, 126, 250, 191, 223, 204, 183, 53, 233, 95, + 82, 86, 134, 221, 110, 146, 135, 94, 20, 216, 170, 198, 88, 59, 166, 221, + 0, 2, 209, 173, 247, 75, 237, 56, 41, 77, 67, 203, 144, 156, 46, 134, + 225, 126, 65, 76, 101, 51, 75, 173, 119, 60, 37, 189, 71, 32, 49, 210, + 37, 161, 255, 17, 62, 40, 205, 134, 1, 10, 168, 36, 70, 126, 60, 129, + 215, 199, 0, 77, 89, 215, 51, 115, 10, 148, 4, 117, 97, 128, 183, 151, + 236, 248, 96, 46, 64, 158, 238, 163, 84, 246, 206, 142, 234, 216, 134, 238, + 156, 218, 188, 163, 139, 139, 221, 67, 236, 237, 10, 180, 38, 156, 77, 142, + 212, 29, 248, 152, 204, 161, 209, 174, 61, 197, 86, 129, 122, 3, 172, 29, + 193, 132, 105, 197, 28, 2, 205, 129, 66, 96, 29, 221, 149, 60, 131, 194, + 106, 132, 152, 35, 158, 65, 153, 81, 163, 124, 181, 178, 180, 119, 8, 95, + 34, 204, 122, 235, 123, 164, 114, 51, 34, 120, 219, 24, 183, 162, 71, 70, + 124, 160, 76, 162, 213, 33, 110, 14, 81, 166, 75, 103, 218, 88, 145, 210, + 205, 194, 106, 132, 231, 55, 11, 194, 95, 97, 244, 185, 106, 199, 120, 194, + 192, 31, 120, 234, 194, 70, 136, 3, 25, 158, 150, 244, 237, 41, 136, 109, + 145, 108, 15, 55, 192, 243, 13, 109, 247, 248, 128, 227, 65, 159, 24, 69, + 142, 80, 86, 15, 3, 189, 69, 222, 32, 94, 102, 86, 47, 41, 48, 187, + 248, 7, 49, 55, 77, 27, 234, 99, 108, 46, 35, 67, 229, 176, 58, 20, + 254, 176, 75, 119, 106, 238, 197, 49, 80, 203, 179, 245, 243, 249, 106, 25, + 194, 19, 193, 206, 91, 158, 112, 113, 45, 120, 119, 226, 253, 249, 130, 171, + 32, 150, 67, 228, 21, 92, 227, 231, 89, 198, 67, 144, 209, 120, 85, 193, + 232, 149, 109, 203, 87, 18, 242, 126, 237, 18, 53, 251, 168, 43, 171, 68, + 226, 193, 190, 25, 37, 81, 146, 112, 61, 215, 175, 188, 133, 141, 213, 254, + 191, 249, 22, 22, 39, 14, 83, 195, 187, 238, 92, 113, 188, 203, 173, 81, + 159, 64, 203, 2, 190, 28, 35, 100, 80, 76, 186, 73, 39, 117, 114, 203, + 238, 113, 72, 49, 10, 145, 32, 121, 27, 174, 116, 127, 41, 85, 167, 53, + 128, 58, 70, 30, 156, 104, 135, 85, 152, 71, 42, 97, 4, 181, 135, 75, + 104, 216, 237, 143, 96, 57, 96, 43, 60, 87, 91, 91, 194, 15, 249, 0, + 61, 25, 54, 43, 37, 8, 54, 243, 235, 78, 144, 119, 18, 27, 174, 237, + 187, 10, 184, 214, 79, 195, 204, 27, 150, 82, 169, 132, 73, 171, 138, 48, + 214, 112, 63, 8, 72, 11, 140, 8, 59, 28, 118, 125, 223, 85, 222, 205, + 229, 81, 118, 10, 169, 160, 181, 69, 1, 137, 183, 162, 42, 4, 163, 195, + 138, 60, 219, 205, 22, 233, 222, 55, 72, 247, 26, 205, 20, 221, 250, 230, + 85, 205, 70, 31, 151, 47, 119, 159, 5, 144, 48, 134, 213, 50, 148, 227, + 26, 147, 178, 51, 105, 57, 8, 89, 15, 76, 165, 212, 152, 197, 159, 229, + 99, 45, 76, 224, 183, 209, 4, 214, 174, 89, 109, 62, 196, 111, 56, 179, + 13, 59, 72, 55, 207, 138, 231, 184, 243, 217, 234, 50, 112, 131, 47, 66, + 145, 145, 194, 138, 182, 253, 130, 88, 225, 25, 188, 249, 197, 102, 115, 68, + 6, 111, 252, 208, 121, 83, 74, 58, 170, 178, 111, 161, 255, 168, 170, 84, + 166, 155, 212, 73, 217, 134, 129, 33, 29, 80, 37, 205, 89, 47, 176, 52, + 199, 149, 230, 115, 81, 166, 22, 103, 106, 169, 76, 198, 228, 82, 32, 22, + 0, 39, 73, 53, 174, 187, 41, 252, 90, 216, 6, 47, 187, 129, 112, 105, + 112, 100, 134, 68, 5, 250, 136, 228, 104, 8, 133, 47, 24, 76, 21, 98, + 201, 112, 80, 119, 109, 107, 114, 57, 255, 29, 216, 235, 75, 174, 57, 79, + 53, 227, 167, 97, 227, 62, 123, 85, 243, 216, 74, 61, 126, 61, 12, 31, + 142, 116, 72, 8, 77, 81, 214, 145, 71, 120, 167, 203, 165, 226, 31, 120, + 217, 137, 90, 152, 155, 115, 198, 147, 85, 55, 158, 166, 240, 40, 123, 159, + 24, 98, 3, 62, 59, 252, 252, 88, 4, 33, 230, 8, 150, 60, 161, 27, + 116, 248, 48, 197, 212, 99, 28, 102, 99, 210, 162, 128, 86, 70, 6, 224, + 56, 35, 90, 154, 54, 9, 103, 56, 176, 248, 237, 113, 96, 129, 33, 128, + 209, 167, 39, 207, 153, 69, 23, 212, 234, 30, 56, 8, 230, 152, 25, 103, + 19, 138, 91, 178, 1, 97, 207, 173, 74, 9, 83, 103, 110, 252, 228, 189, + 107, 166, 16, 93, 184, 70, 59, 201, 168, 92, 174, 245, 239, 222, 69, 40, + 26, 119, 61, 93, 145, 71, 102, 250, 213, 155, 136, 94, 249, 93, 251, 200, + 255, 248, 77, 4, 193, 117, 145, 32, 34, 107, 131, 4, 20, 215, 1, 83, + 234, 117, 88, 48, 192, 5, 77, 91, 120, 152, 192, 207, 225, 227, 100, 53, + 152, 116, 35, 35, 238, 178, 202, 15, 17, 240, 108, 32, 104, 58, 243, 52, + 24, 182, 94, 84, 100, 30, 197, 170, 16, 186, 94, 52, 42, 138, 1, 50, + 251, 196, 0, 209, 226, 93, 119, 53, 206, 8, 31, 9, 6, 35, 131, 229, + 152, 105, 122, 203, 22, 12, 73, 80, 81, 167, 222, 144, 218, 191, 72, 171, + 16, 19, 162, 130, 48, 89, 19, 135, 159, 60, 103, 234, 76, 211, 51, 207, + 169, 206, 115, 141, 84, 106, 77, 79, 109, 104, 162, 191, 59, 104, 51, 207, + 139, 215, 60, 47, 116, 167, 148, 26, 221, 208, 139, 52, 47, 43, 164, 223, + 79, 8, 18, 76, 79, 209, 181, 179, 20, 143, 43, 130, 106, 94, 157, 121, + 231, 130, 100, 177, 147, 20, 246, 80, 3, 61, 71, 44, 210, 44, 177, 108, + 217, 34, 170, 75, 240, 74, 78, 123, 192, 51, 34, 9, 231, 20, 68, 133, + 40, 69, 198, 19, 74, 51, 80, 222, 153, 79, 58, 37, 102, 250, 44, 192, + 66, 54, 240, 132, 135, 212, 202, 198, 119, 69, 174, 238, 161, 113, 62, 208, + 56, 31, 221, 43, 62, 92, 171, 227, 111, 138, 89, 37, 222, 11, 16, 21, + 56, 16, 250, 120, 153, 130, 23, 38, 230, 99, 224, 91, 233, 107, 137, 131, + 158, 24, 115, 32, 127, 244, 128, 202, 153, 20, 61, 127, 32, 45, 162, 35, + 129, 36, 65, 131, 90, 29, 157, 74, 160, 166, 7, 250, 62, 133, 229, 214, + 109, 17, 155, 142, 62, 175, 205, 239, 230, 78, 136, 204, 119, 228, 200, 250, + 157, 72, 127, 217, 237, 215, 234, 124, 235, 73, 94, 118, 203, 165, 202, 181, + 120, 111, 118, 148, 51, 29, 244, 106, 248, 109, 196, 90, 34, 108, 62, 228, + 232, 38, 96, 173, 105, 228, 243, 250, 45, 59, 136, 134, 148, 187, 34, 41, + 223, 132, 151, 129, 117, 234, 79, 205, 82, 171, 215, 40, 101, 212, 17, 114, + 181, 171, 236, 39, 230, 218, 66, 39, 60, 215, 207, 147, 95, 236, 168, 159, + 66, 7, 133, 180, 79, 32, 118, 142, 48, 169, 223, 191, 163, 6, 10, 118, + 245, 223, 82, 66, 249, 138, 75, 53, 113, 48, 25, 98, 87, 127, 48, 90, + 212, 93, 235, 143, 248, 200, 56, 66, 17, 160, 52, 105, 182, 71, 109, 51, + 234, 19, 180, 52, 155, 88, 32, 219, 191, 246, 191, 159, 209, 74, 233, 163, + 253, 153, 164, 193, 207, 152, 6, 35, 229, 31, 214, 204, 18, 57, 197, 214, + 134, 66, 121, 175, 32, 135, 80, 73, 200, 75, 142, 172, 209, 31, 200, 4, + 14, 140, 168, 55, 2, 167, 240, 212, 3, 117, 62, 98, 53, 239, 173, 168, + 89, 27, 244, 191, 87, 243, 130, 215, 105, 71, 212, 25, 223, 186, 74, 104, + 132, 55, 48, 63, 156, 228, 80, 11, 155, 155, 113, 219, 69, 37, 18, 212, + 177, 105, 118, 114, 221, 81, 228, 64, 91, 207, 184, 224, 45, 123, 205, 81, + 58, 30, 47, 14, 159, 189, 95, 138, 142, 220, 108, 151, 226, 102, 127, 236, + 79, 156, 244, 112, 96, 110, 97, 213, 176, 14, 23, 77, 239, 86, 232, 143, + 140, 122, 85, 165, 69, 84, 227, 121, 139, 179, 173, 93, 26, 92, 175, 202, + 41, 125, 91, 43, 101, 31, 109, 120, 169, 171, 168, 242, 179, 82, 207, 228, + 40, 158, 175, 93, 234, 95, 195, 134, 114, 127, 158, 5, 91, 197, 42, 57, + 19, 227, 182, 182, 208, 227, 124, 236, 131, 162, 226, 80, 173, 186, 170, 152, + 147, 221, 231, 7, 240, 105, 164, 218, 13, 179, 36, 177, 166, 11, 53, 239, + 59, 51, 71, 31, 181, 90, 123, 88, 246, 149, 28, 209, 223, 98, 135, 100, + 141, 15, 203, 36, 85, 121, 126, 138, 129, 114, 22, 216, 167, 136, 159, 210, + 180, 131, 144, 161, 90, 178, 230, 229, 26, 254, 53, 253, 155, 135, 253, 151, + 136, 220, 127, 155, 173, 51, 107, 231, 220, 232, 208, 214, 72, 206, 190, 135, + 205, 97, 139, 158, 203, 116, 142, 161, 27, 6, 120, 155, 204, 83, 34, 202, + 162, 63, 89, 10, 163, 13, 152, 156, 25, 176, 47, 131, 203, 42, 28, 85, + 173, 153, 114, 32, 125, 118, 254, 197, 180, 198, 142, 5, 81, 227, 177, 112, + 190, 12, 108, 10, 164, 2, 14, 100, 220, 224, 16, 95, 133, 76, 92, 68, + 7, 199, 95, 104, 158, 68, 87, 122, 104, 141, 68, 206, 4, 121, 115, 196, + 221, 41, 227, 137, 217, 127, 129, 19, 63, 244, 77, 196, 80, 199, 208, 169, + 248, 91, 174, 115, 140, 43, 39, 86, 88, 204, 11, 107, 86, 147, 29, 148, + 107, 94, 191, 235, 163, 230, 133, 88, 7, 23, 194, 255, 231, 78, 152, 55, + 86, 199, 176, 52, 12, 45, 29, 9, 202, 93, 57, 254, 166, 187, 103, 150, + 202, 147, 147, 100, 66, 73, 3, 214, 8, 255, 142, 119, 172, 6, 41, 222, + 8, 237, 1, 58, 227, 90, 48, 12, 99, 56, 84, 249, 172, 129, 163, 233, + 229, 168, 232, 6, 69, 95, 54, 23, 116, 116, 46, 212, 174, 156, 53, 122, + 48, 166, 189, 238, 16, 158, 155, 165, 150, 3, 95, 161, 215, 208, 3, 26, + 164, 110, 77, 6, 21, 147, 144, 174, 160, 205, 105, 72, 151, 205, 166, 244, + 55, 219, 13, 217, 181, 41, 194, 55, 86, 134, 253, 22, 249, 148, 213, 216, + 46, 113, 67, 128, 33, 108, 41, 68, 41, 73, 27, 154, 146, 18, 149, 141, + 167, 165, 32, 45, 49, 145, 96, 32, 223, 104, 144, 130, 94, 102, 233, 46, + 106, 186, 13, 135, 65, 52, 187, 156, 224, 105, 93, 152, 127, 193, 179, 151, + 202, 89, 227, 49, 181, 211, 154, 66, 212, 84, 88, 126, 77, 69, 20, 116, + 169, 11, 51, 9, 210, 152, 93, 152, 63, 16, 96, 118, 39, 136, 99, 11, + 223, 122, 138, 24, 182, 240, 119, 193, 14, 75, 58, 14, 53, 58, 56, 5, + 209, 233, 185, 217, 193, 169, 151, 118, 208, 159, 32, 139, 28, 44, 136, 115, + 224, 23, 34, 72, 86, 38, 116, 70, 198, 118, 161, 165, 216, 28, 78, 43, + 132, 53, 137, 173, 225, 0, 52, 89, 195, 28, 203, 205, 70, 99, 53, 44, + 102, 185, 213, 208, 200, 153, 85, 153, 100, 172, 234, 4, 139, 192, 249, 13, + 175, 54, 191, 26, 83, 138, 157, 66, 236, 20, 99, 167, 20, 59, 181, 249, + 213, 192, 14, 67, 117, 184, 96, 176, 112, 137, 83, 202, 95, 76, 177, 198, + 153, 125, 209, 69, 236, 16, 188, 143, 230, 48, 197, 198, 146, 221, 167, 46, + 139, 152, 27, 140, 105, 200, 152, 21, 67, 64, 224, 193, 161, 168, 20, 42, + 111, 211, 90, 181, 26, 105, 171, 13, 189, 153, 11, 223, 197, 120, 7, 54, + 166, 160, 6, 45, 102, 171, 109, 202, 59, 167, 229, 198, 61, 21, 141, 131, + 38, 229, 176, 98, 209, 34, 104, 7, 191, 18, 72, 116, 172, 25, 59, 176, + 106, 205, 133, 174, 223, 83, 193, 219, 185, 241, 207, 168, 143, 17, 167, 62, + 150, 34, 63, 22, 209, 31, 170, 54, 105, 201, 217, 47, 110, 118, 187, 219, + 210, 225, 124, 12, 17, 151, 172, 26, 229, 236, 72, 229, 138, 72, 218, 50, + 33, 124, 108, 40, 154, 254, 222, 85, 220, 206, 98, 113, 188, 144, 86, 149, + 103, 139, 242, 236, 133, 242, 162, 97, 209, 138, 211, 209, 121, 37, 192, 182, + 72, 155, 34, 19, 75, 57, 97, 169, 240, 41, 53, 118, 10, 189, 167, 191, + 119, 20, 190, 189, 84, 184, 176, 160, 251, 113, 241, 182, 40, 222, 142, 138, + 199, 198, 138, 226, 150, 62, 174, 108, 121, 74, 88, 179, 226, 40, 236, 120, + 69, 105, 141, 70, 37, 195, 59, 45, 93, 20, 100, 78, 20, 234, 235, 35, + 29, 149, 216, 154, 56, 218, 194, 198, 165, 46, 144, 106, 167, 119, 164, 159, + 58, 218, 186, 79, 169, 69, 108, 99, 41, 25, 120, 72, 165, 221, 236, 122, + 1, 59, 196, 235, 21, 83, 67, 248, 84, 132, 27, 114, 149, 243, 151, 211, + 210, 123, 42, 189, 167, 167, 87, 179, 187, 187, 125, 255, 88, 208, 64, 167, + 140, 91, 116, 129, 141, 64, 6, 40, 110, 139, 19, 35, 39, 70, 129, 228, + 162, 22, 25, 182, 189, 108, 112, 223, 96, 49, 208, 243, 207, 12, 151, 200, + 241, 195, 1, 203, 221, 49, 96, 185, 59, 6, 44, 119, 199, 128, 137, 244, + 68, 137, 69, 167, 190, 162, 149, 240, 56, 67, 53, 9, 202, 77, 228, 88, + 143, 110, 100, 168, 66, 166, 227, 198, 194, 26, 90, 49, 47, 7, 53, 177, + 242, 150, 203, 253, 217, 194, 212, 183, 45, 63, 206, 107, 75, 68, 238, 142, + 2, 184, 184, 51, 145, 142, 216, 241, 5, 118, 73, 19, 195, 96, 63, 195, + 191, 83, 216, 207, 4, 28, 179, 66, 14, 166, 60, 208, 176, 20, 183, 42, + 10, 132, 205, 100, 154, 138, 232, 132, 108, 142, 106, 158, 222, 172, 65, 141, + 171, 33, 15, 47, 80, 141, 130, 50, 6, 106, 253, 40, 180, 96, 199, 21, + 219, 246, 184, 65, 175, 13, 241, 10, 91, 239, 35, 220, 123, 229, 235, 20, + 95, 167, 234, 117, 226, 97, 172, 167, 98, 241, 117, 74, 74, 10, 136, 28, + 132, 71, 23, 226, 104, 142, 145, 103, 33, 119, 184, 99, 98, 24, 208, 201, + 196, 5, 159, 81, 209, 204, 235, 177, 167, 40, 226, 179, 57, 65, 9, 247, + 241, 44, 171, 167, 240, 85, 138, 61, 230, 57, 84, 92, 188, 56, 209, 146, + 133, 34, 230, 17, 55, 40, 219, 37, 253, 80, 171, 162, 164, 245, 109, 4, + 39, 29, 45, 2, 96, 107, 172, 177, 12, 221, 182, 26, 52, 112, 17, 187, + 10, 163, 41, 34, 143, 129, 171, 156, 108, 193, 103, 65, 54, 210, 58, 118, + 72, 82, 117, 38, 125, 244, 166, 81, 207, 29, 214, 177, 133, 27, 32, 236, + 127, 100, 232, 46, 214, 180, 35, 201, 231, 220, 28, 124, 131, 204, 131, 172, + 57, 85, 110, 157, 12, 244, 104, 15, 43, 179, 45, 221, 49, 147, 28, 138, + 16, 184, 209, 235, 189, 79, 118, 103, 147, 118, 74, 169, 226, 198, 218, 167, + 156, 46, 71, 44, 181, 97, 87, 186, 173, 81, 187, 51, 80, 109, 139, 146, + 3, 123, 133, 247, 200, 238, 57, 240, 142, 72, 14, 206, 188, 115, 2, 237, + 135, 25, 138, 191, 81, 163, 201, 195, 167, 153, 103, 47, 12, 62, 74, 70, + 3, 227, 234, 44, 114, 89, 173, 149, 74, 152, 139, 120, 171, 15, 115, 66, + 249, 63, 225, 209, 218, 114, 183, 86, 20, 150, 50, 75, 103, 154, 59, 242, + 137, 214, 117, 235, 152, 145, 223, 181, 30, 45, 28, 24, 128, 169, 94, 172, + 204, 212, 207, 23, 130, 103, 148, 150, 222, 248, 241, 120, 126, 180, 74, 101, + 72, 156, 194, 220, 252, 120, 174, 84, 192, 224, 100, 31, 75, 170, 166, 146, + 33, 143, 35, 64, 50, 196, 35, 154, 52, 22, 231, 241, 133, 176, 172, 42, + 168, 151, 198, 37, 233, 189, 128, 210, 180, 87, 20, 103, 6, 115, 213, 171, + 165, 210, 240, 20, 174, 237, 206, 139, 77, 84, 102, 218, 172, 40, 101, 137, + 247, 76, 64, 182, 235, 247, 53, 19, 11, 86, 60, 197, 221, 197, 226, 93, + 93, 161, 160, 10, 182, 127, 92, 176, 110, 106, 47, 86, 15, 78, 211, 227, + 29, 207, 188, 85, 115, 8, 175, 16, 143, 201, 203, 49, 233, 124, 132, 22, + 71, 96, 201, 50, 73, 243, 204, 106, 158, 147, 227, 74, 122, 16, 7, 52, + 109, 6, 168, 154, 133, 130, 136, 47, 169, 104, 196, 111, 97, 99, 27, 90, + 184, 228, 101, 164, 131, 190, 137, 187, 157, 177, 198, 62, 49, 119, 124, 164, + 65, 127, 91, 176, 249, 81, 168, 88, 113, 83, 76, 212, 240, 137, 169, 226, + 195, 77, 195, 167, 157, 144, 66, 69, 34, 68, 234, 176, 198, 54, 21, 230, + 218, 204, 133, 226, 27, 110, 61, 115, 197, 151, 114, 249, 178, 92, 204, 210, + 176, 169, 104, 202, 210, 192, 4, 13, 31, 119, 166, 136, 129, 229, 218, 98, + 234, 225, 98, 50, 47, 208, 95, 73, 10, 233, 11, 154, 195, 174, 24, 36, + 205, 23, 54, 122, 189, 214, 156, 82, 159, 41, 66, 78, 223, 199, 144, 35, + 207, 106, 1, 124, 143, 74, 196, 205, 234, 141, 233, 244, 192, 198, 182, 164, + 74, 160, 197, 53, 232, 24, 129, 113, 148, 191, 210, 234, 142, 170, 116, 167, + 8, 217, 224, 167, 97, 70, 94, 53, 199, 37, 180, 164, 105, 212, 170, 68, + 61, 197, 105, 247, 156, 196, 254, 60, 17, 180, 80, 71, 127, 166, 11, 125, + 121, 84, 231, 238, 175, 160, 253, 75, 27, 84, 108, 212, 162, 217, 221, 33, + 238, 102, 226, 166, 101, 199, 58, 196, 214, 76, 49, 128, 122, 3, 41, 112, + 244, 39, 158, 150, 2, 3, 166, 158, 74, 97, 223, 242, 193, 158, 105, 188, + 0, 98, 65, 240, 144, 172, 41, 246, 1, 71, 120, 4, 39, 130, 62, 30, + 111, 203, 157, 102, 220, 216, 110, 160, 11, 212, 20, 21, 34, 168, 145, 105, + 117, 176, 160, 14, 150, 212, 193, 162, 58, 63, 83, 214, 255, 71, 222, 155, + 55, 166, 113, 101, 125, 131, 255, 215, 167, 40, 147, 82, 139, 165, 64, 181, + 0, 146, 37, 33, 183, 157, 238, 78, 60, 211, 113, 231, 117, 242, 36, 233, + 145, 101, 94, 4, 72, 16, 179, 153, 197, 128, 9, 243, 217, 231, 252, 206, + 185, 247, 214, 45, 40, 36, 57, 157, 238, 103, 230, 153, 196, 42, 170, 238, + 190, 158, 123, 238, 89, 141, 88, 185, 64, 41, 184, 167, 49, 10, 196, 44, + 83, 138, 153, 162, 109, 92, 214, 219, 120, 139, 24, 253, 97, 107, 171, 91, + 165, 28, 193, 50, 5, 11, 85, 164, 116, 147, 125, 136, 187, 170, 36, 12, + 188, 160, 82, 76, 152, 222, 237, 160, 59, 50, 172, 104, 102, 95, 40, 140, + 103, 122, 127, 219, 170, 232, 185, 211, 147, 176, 187, 92, 205, 158, 222, 157, + 53, 153, 49, 107, 90, 247, 116, 165, 119, 207, 192, 157, 111, 56, 34, 153, + 182, 58, 97, 163, 134, 159, 136, 134, 134, 186, 221, 80, 10, 84, 28, 17, + 75, 68, 196, 17, 224, 153, 81, 3, 232, 28, 13, 140, 5, 124, 250, 8, + 27, 34, 65, 98, 92, 79, 44, 191, 82, 32, 43, 227, 204, 189, 114, 129, + 122, 226, 172, 101, 40, 84, 196, 213, 57, 31, 150, 52, 84, 98, 34, 73, + 30, 7, 48, 3, 163, 34, 174, 210, 136, 54, 152, 194, 0, 199, 115, 124, + 163, 249, 95, 218, 46, 187, 8, 30, 123, 104, 51, 54, 160, 187, 31, 30, + 49, 156, 246, 61, 72, 45, 122, 3, 229, 56, 198, 184, 76, 164, 81, 215, + 123, 94, 47, 43, 90, 109, 76, 20, 60, 32, 96, 183, 203, 77, 179, 98, + 68, 110, 250, 9, 64, 199, 189, 91, 12, 6, 211, 238, 236, 32, 240, 249, + 128, 141, 228, 107, 216, 99, 195, 52, 119, 54, 111, 205, 23, 179, 134, 130, + 79, 234, 75, 199, 191, 223, 58, 178, 5, 45, 194, 154, 155, 128, 32, 51, + 29, 128, 68, 160, 37, 200, 165, 171, 177, 97, 181, 58, 28, 151, 75, 159, + 110, 87, 39, 22, 217, 205, 4, 110, 21, 204, 50, 101, 176, 182, 71, 92, + 148, 43, 73, 97, 155, 0, 50, 147, 34, 5, 207, 76, 104, 232, 166, 123, + 39, 226, 238, 142, 178, 180, 39, 58, 73, 172, 4, 36, 207, 80, 217, 119, + 160, 81, 105, 177, 34, 27, 129, 133, 214, 176, 203, 26, 41, 34, 162, 185, + 32, 140, 142, 135, 193, 81, 130, 142, 134, 209, 39, 70, 33, 162, 35, 247, + 158, 22, 66, 159, 130, 154, 163, 49, 123, 204, 172, 184, 199, 33, 214, 87, + 255, 125, 84, 56, 86, 180, 78, 213, 84, 139, 45, 154, 24, 239, 3, 111, + 244, 83, 107, 218, 135, 17, 196, 38, 87, 111, 152, 143, 194, 36, 116, 91, + 204, 224, 164, 148, 204, 189, 148, 76, 82, 194, 120, 154, 176, 42, 95, 78, + 239, 23, 220, 180, 227, 84, 105, 199, 238, 108, 210, 109, 67, 89, 92, 248, + 25, 58, 146, 62, 90, 194, 216, 104, 245, 71, 18, 101, 216, 170, 82, 133, + 168, 37, 187, 249, 214, 204, 125, 235, 127, 227, 191, 242, 175, 95, 222, 20, + 76, 117, 148, 153, 110, 64, 236, 18, 57, 105, 195, 107, 66, 41, 56, 219, + 78, 165, 80, 65, 166, 254, 239, 212, 80, 113, 95, 210, 146, 189, 31, 97, + 213, 30, 151, 67, 17, 228, 96, 110, 102, 219, 228, 219, 229, 0, 176, 91, + 250, 193, 120, 214, 61, 204, 163, 77, 117, 191, 177, 154, 181, 205, 240, 42, + 86, 109, 106, 236, 103, 31, 250, 19, 23, 220, 90, 59, 225, 118, 135, 77, + 59, 29, 194, 75, 140, 108, 61, 15, 18, 243, 140, 55, 131, 87, 218, 144, + 99, 27, 214, 18, 8, 238, 42, 140, 211, 163, 203, 66, 117, 235, 190, 53, + 164, 52, 206, 243, 141, 161, 163, 241, 231, 43, 249, 140, 213, 231, 75, 185, + 137, 152, 82, 216, 115, 70, 149, 35, 217, 234, 250, 214, 112, 125, 255, 49, + 233, 142, 192, 155, 163, 4, 239, 92, 130, 99, 73, 22, 90, 31, 248, 123, + 73, 128, 35, 189, 74, 104, 240, 58, 247, 221, 185, 98, 250, 154, 37, 112, + 236, 133, 98, 178, 147, 214, 248, 148, 217, 146, 146, 45, 199, 189, 204, 85, + 114, 218, 95, 141, 200, 18, 84, 131, 160, 4, 111, 156, 166, 194, 173, 150, + 177, 251, 65, 76, 149, 42, 37, 120, 216, 19, 117, 132, 223, 215, 4, 216, + 193, 177, 54, 107, 206, 62, 137, 167, 211, 158, 252, 180, 26, 129, 164, 238, + 220, 74, 192, 188, 7, 55, 64, 102, 10, 244, 216, 109, 208, 200, 109, 161, + 209, 104, 30, 55, 143, 5, 32, 202, 40, 166, 34, 182, 206, 144, 194, 59, + 157, 230, 68, 24, 82, 231, 110, 114, 164, 53, 49, 179, 18, 238, 229, 114, + 97, 193, 221, 9, 104, 208, 131, 38, 37, 151, 139, 241, 168, 82, 227, 115, + 142, 85, 148, 145, 113, 115, 173, 192, 29, 31, 231, 73, 68, 228, 235, 83, + 204, 10, 84, 94, 25, 232, 52, 179, 2, 171, 218, 239, 128, 157, 210, 148, + 153, 46, 160, 174, 74, 221, 73, 125, 154, 56, 53, 176, 75, 62, 131, 226, + 33, 255, 179, 19, 63, 215, 238, 220, 89, 48, 213, 238, 75, 192, 194, 155, + 234, 47, 21, 19, 250, 150, 156, 145, 179, 24, 90, 145, 78, 230, 0, 167, + 6, 183, 17, 50, 50, 148, 247, 222, 190, 247, 190, 121, 239, 189, 42, 184, + 109, 163, 116, 126, 127, 27, 245, 102, 159, 42, 238, 183, 250, 146, 252, 131, + 186, 35, 187, 63, 225, 37, 186, 81, 30, 189, 198, 142, 230, 69, 104, 78, + 196, 1, 14, 141, 82, 168, 119, 248, 236, 241, 149, 195, 123, 49, 65, 168, + 151, 171, 98, 150, 157, 61, 215, 220, 178, 218, 41, 21, 23, 113, 88, 160, + 136, 245, 146, 164, 154, 145, 164, 26, 240, 181, 128, 112, 217, 51, 92, 70, + 206, 92, 24, 17, 244, 86, 81, 41, 198, 133, 163, 170, 147, 172, 106, 8, + 173, 74, 104, 93, 46, 138, 184, 233, 68, 49, 165, 140, 172, 205, 3, 245, + 131, 26, 46, 76, 235, 58, 163, 186, 165, 83, 203, 76, 164, 11, 124, 185, + 28, 178, 3, 50, 245, 187, 10, 75, 242, 205, 191, 105, 219, 158, 177, 56, + 1, 122, 40, 23, 127, 39, 22, 38, 179, 146, 234, 111, 85, 1, 146, 230, + 195, 139, 160, 0, 119, 16, 112, 121, 99, 4, 31, 13, 1, 85, 146, 11, + 245, 84, 219, 27, 232, 87, 118, 80, 88, 130, 127, 223, 90, 126, 187, 93, + 154, 247, 8, 34, 240, 74, 134, 84, 97, 244, 34, 141, 101, 247, 63, 218, + 105, 94, 252, 164, 254, 31, 202, 149, 209, 255, 221, 164, 81, 70, 255, 227, + 218, 243, 139, 224, 125, 120, 17, 226, 79, 216, 154, 84, 102, 25, 243, 190, + 215, 251, 152, 122, 191, 215, 185, 200, 116, 46, 181, 22, 211, 93, 173, 238, + 180, 164, 246, 164, 174, 30, 202, 149, 209, 213, 221, 164, 213, 67, 83, 45, + 29, 164, 155, 11, 45, 225, 189, 14, 86, 19, 13, 66, 185, 102, 152, 94, + 86, 77, 47, 197, 175, 109, 238, 107, 49, 202, 156, 227, 233, 149, 138, 160, + 26, 1, 110, 112, 96, 49, 149, 1, 44, 198, 131, 78, 129, 243, 252, 99, + 208, 177, 210, 199, 85, 147, 222, 74, 40, 250, 182, 240, 190, 116, 230, 135, + 117, 221, 12, 163, 123, 1, 111, 234, 150, 51, 117, 165, 126, 33, 173, 100, + 130, 3, 100, 168, 165, 248, 200, 144, 249, 212, 21, 35, 100, 181, 94, 251, + 112, 184, 218, 22, 112, 89, 86, 218, 29, 85, 173, 231, 164, 237, 68, 233, + 166, 192, 27, 241, 153, 110, 10, 11, 205, 201, 157, 29, 87, 192, 98, 222, + 187, 106, 52, 82, 32, 114, 235, 152, 246, 212, 75, 20, 125, 84, 199, 149, + 142, 155, 197, 223, 87, 13, 9, 80, 0, 16, 88, 168, 125, 150, 106, 194, + 164, 21, 232, 84, 152, 73, 193, 4, 149, 159, 12, 179, 181, 32, 28, 89, + 204, 94, 158, 2, 126, 40, 24, 102, 171, 186, 190, 182, 87, 87, 224, 7, + 107, 19, 185, 237, 21, 22, 5, 46, 215, 201, 59, 99, 200, 34, 35, 45, + 57, 46, 193, 49, 78, 114, 148, 172, 28, 165, 204, 28, 235, 43, 172, 12, + 201, 33, 115, 219, 94, 115, 217, 116, 235, 214, 239, 59, 57, 46, 65, 252, + 78, 231, 40, 89, 57, 74, 118, 142, 36, 25, 197, 8, 85, 128, 126, 49, + 73, 42, 166, 189, 18, 122, 1, 255, 242, 244, 57, 102, 84, 104, 115, 151, + 189, 111, 173, 113, 57, 161, 144, 109, 86, 187, 35, 171, 221, 241, 147, 218, + 29, 89, 237, 142, 15, 183, 59, 82, 237, 142, 117, 187, 119, 192, 132, 105, + 43, 147, 19, 94, 218, 109, 101, 185, 244, 140, 182, 86, 173, 182, 214, 158, + 212, 214, 170, 213, 214, 218, 225, 182, 86, 85, 91, 107, 166, 173, 124, 186, + 127, 251, 222, 251, 225, 189, 247, 211, 123, 106, 157, 43, 164, 172, 40, 1, + 131, 76, 175, 22, 11, 51, 111, 245, 81, 255, 141, 62, 234, 95, 169, 163, + 222, 249, 3, 246, 115, 24, 200, 134, 1, 32, 249, 246, 135, 159, 220, 124, + 78, 243, 120, 190, 45, 108, 115, 190, 249, 250, 161, 200, 216, 180, 21, 242, + 147, 10, 41, 228, 164, 200, 48, 212, 101, 70, 85, 27, 100, 89, 136, 4, + 42, 225, 203, 88, 62, 231, 189, 165, 162, 188, 111, 240, 120, 101, 21, 250, + 50, 179, 192, 51, 83, 30, 35, 27, 170, 152, 221, 82, 30, 202, 135, 17, + 63, 246, 54, 157, 110, 59, 234, 117, 87, 239, 104, 19, 190, 45, 214, 107, + 181, 184, 94, 242, 190, 129, 182, 102, 201, 123, 181, 133, 93, 247, 50, 44, + 186, 7, 199, 91, 12, 165, 86, 217, 84, 230, 122, 0, 190, 56, 14, 46, + 253, 96, 215, 253, 138, 80, 232, 150, 194, 173, 251, 151, 244, 241, 249, 216, + 239, 151, 154, 199, 47, 143, 203, 136, 240, 251, 0, 207, 24, 214, 31, 191, + 251, 187, 155, 203, 125, 149, 219, 204, 183, 187, 45, 172, 6, 186, 137, 60, + 11, 75, 27, 5, 200, 56, 254, 112, 115, 242, 222, 250, 222, 55, 190, 247, + 202, 247, 94, 10, 238, 101, 133, 237, 222, 32, 140, 61, 233, 253, 139, 130, + 144, 165, 107, 129, 18, 182, 80, 26, 140, 34, 194, 178, 20, 241, 5, 216, + 137, 248, 18, 193, 29, 37, 8, 227, 26, 57, 24, 45, 6, 115, 88, 162, + 132, 211, 66, 64, 163, 200, 242, 45, 200, 160, 190, 122, 7, 115, 125, 45, + 185, 224, 182, 208, 100, 146, 143, 131, 121, 222, 74, 150, 253, 155, 24, 50, + 83, 168, 163, 186, 206, 86, 8, 9, 109, 167, 114, 149, 8, 71, 18, 162, + 121, 220, 96, 89, 242, 24, 89, 60, 75, 30, 42, 190, 237, 41, 146, 21, + 77, 157, 6, 26, 137, 154, 254, 14, 119, 207, 248, 114, 237, 89, 252, 218, + 150, 246, 231, 202, 87, 63, 205, 164, 167, 156, 204, 6, 85, 236, 64, 225, + 122, 234, 130, 152, 35, 170, 184, 131, 96, 128, 22, 10, 206, 15, 154, 211, + 2, 198, 8, 173, 225, 50, 129, 63, 129, 126, 6, 14, 66, 205, 234, 167, + 116, 50, 170, 71, 248, 17, 230, 40, 100, 213, 245, 212, 141, 52, 117, 247, + 164, 187, 105, 40, 62, 19, 68, 19, 92, 55, 58, 179, 55, 189, 84, 103, + 34, 187, 51, 241, 131, 157, 249, 214, 110, 37, 157, 52, 62, 206, 31, 221, + 161, 34, 125, 164, 58, 229, 164, 90, 216, 107, 128, 31, 124, 168, 121, 61, + 171, 121, 173, 84, 243, 170, 118, 243, 106, 15, 54, 239, 165, 230, 219, 36, + 141, 84, 151, 203, 164, 145, 244, 97, 55, 114, 183, 149, 32, 244, 166, 135, + 249, 161, 65, 205, 88, 46, 155, 29, 188, 112, 155, 172, 56, 129, 246, 118, + 119, 8, 254, 4, 145, 221, 37, 96, 117, 169, 94, 149, 170, 167, 251, 200, + 163, 62, 163, 204, 29, 20, 103, 212, 3, 247, 208, 151, 66, 30, 182, 187, + 250, 232, 76, 216, 125, 146, 198, 215, 15, 78, 68, 221, 110, 114, 189, 84, + 11, 244, 100, 98, 17, 215, 11, 71, 81, 237, 178, 17, 153, 64, 76, 132, + 9, 116, 38, 98, 24, 71, 167, 37, 156, 160, 80, 170, 23, 37, 72, 82, + 158, 176, 236, 218, 14, 98, 59, 121, 16, 177, 61, 60, 76, 206, 191, 125, + 152, 158, 48, 199, 97, 122, 229, 150, 162, 83, 71, 207, 112, 234, 76, 209, + 237, 96, 155, 32, 252, 10, 118, 114, 164, 40, 5, 42, 200, 177, 135, 197, + 166, 93, 216, 37, 217, 225, 155, 20, 189, 3, 28, 25, 186, 216, 136, 163, + 100, 139, 53, 59, 235, 38, 0, 38, 49, 48, 225, 221, 102, 19, 194, 140, + 149, 115, 35, 82, 101, 129, 167, 31, 132, 43, 76, 136, 237, 15, 165, 144, + 102, 179, 78, 211, 185, 191, 199, 246, 216, 194, 137, 180, 209, 78, 89, 194, + 184, 254, 161, 252, 165, 101, 201, 233, 104, 21, 246, 147, 105, 216, 79, 95, + 220, 48, 62, 124, 119, 202, 146, 134, 253, 244, 37, 13, 83, 76, 117, 171, + 160, 111, 149, 106, 44, 65, 87, 239, 219, 82, 200, 204, 243, 195, 76, 254, + 157, 140, 210, 130, 111, 203, 59, 217, 100, 118, 174, 143, 61, 47, 60, 190, + 105, 52, 152, 84, 205, 30, 183, 213, 201, 152, 183, 200, 182, 178, 52, 85, + 218, 103, 141, 99, 107, 25, 29, 107, 41, 192, 103, 143, 39, 63, 46, 20, + 204, 46, 72, 150, 123, 96, 237, 154, 195, 219, 201, 97, 234, 173, 108, 226, + 100, 147, 203, 22, 175, 38, 155, 252, 247, 238, 111, 236, 234, 167, 177, 175, + 180, 50, 88, 26, 243, 91, 184, 123, 136, 95, 18, 36, 130, 219, 122, 51, + 111, 182, 187, 28, 147, 187, 197, 136, 101, 79, 194, 206, 30, 219, 196, 111, + 38, 138, 18, 205, 246, 98, 250, 169, 219, 124, 155, 17, 246, 77, 70, 216, + 43, 195, 75, 96, 218, 122, 107, 148, 193, 120, 240, 161, 28, 51, 237, 50, + 91, 98, 49, 235, 78, 217, 22, 111, 167, 123, 71, 119, 163, 142, 219, 159, + 207, 220, 241, 114, 228, 134, 127, 113, 117, 11, 45, 166, 200, 29, 151, 40, + 42, 51, 51, 195, 3, 241, 193, 235, 160, 111, 42, 172, 3, 174, 70, 71, + 115, 123, 58, 29, 54, 220, 210, 26, 80, 43, 96, 209, 73, 236, 172, 158, + 155, 242, 92, 23, 118, 130, 187, 52, 84, 211, 217, 28, 166, 231, 84, 51, + 52, 127, 135, 185, 54, 99, 170, 52, 165, 146, 132, 142, 234, 58, 160, 57, + 55, 226, 212, 138, 169, 146, 239, 86, 238, 43, 104, 165, 49, 156, 82, 168, + 236, 213, 23, 141, 168, 205, 241, 180, 195, 28, 131, 42, 204, 215, 66, 19, + 73, 234, 22, 99, 205, 224, 18, 105, 19, 193, 227, 225, 100, 60, 234, 66, + 198, 36, 169, 244, 182, 59, 235, 119, 36, 237, 47, 92, 202, 63, 221, 214, + 170, 59, 251, 183, 240, 176, 244, 60, 64, 115, 73, 9, 187, 100, 178, 172, + 254, 120, 22, 212, 44, 131, 7, 117, 151, 240, 160, 124, 247, 120, 127, 161, + 54, 162, 40, 200, 140, 249, 166, 177, 191, 90, 247, 131, 126, 180, 57, 91, + 169, 61, 98, 177, 183, 146, 54, 208, 61, 127, 19, 161, 74, 188, 196, 13, + 47, 194, 111, 21, 191, 59, 124, 175, 20, 203, 201, 90, 220, 7, 248, 73, + 232, 44, 51, 149, 132, 115, 228, 61, 51, 238, 205, 0, 151, 204, 186, 110, + 18, 92, 111, 53, 188, 103, 41, 238, 146, 101, 177, 225, 107, 173, 86, 103, + 213, 200, 60, 37, 62, 114, 155, 250, 102, 39, 95, 230, 122, 103, 216, 17, + 0, 126, 138, 49, 167, 185, 29, 76, 167, 64, 120, 162, 122, 2, 248, 184, + 2, 96, 140, 252, 205, 242, 36, 218, 106, 53, 149, 127, 153, 19, 101, 150, + 32, 164, 68, 127, 193, 227, 159, 137, 179, 178, 61, 217, 152, 13, 95, 48, + 203, 236, 215, 139, 175, 152, 101, 237, 146, 76, 155, 2, 218, 31, 186, 196, + 237, 130, 203, 70, 43, 88, 129, 25, 124, 232, 73, 143, 9, 35, 177, 49, + 147, 25, 50, 110, 203, 92, 151, 208, 41, 221, 181, 97, 113, 102, 19, 149, + 171, 91, 55, 195, 198, 189, 229, 5, 132, 198, 235, 126, 218, 135, 17, 82, + 120, 41, 41, 156, 160, 117, 112, 71, 194, 111, 66, 137, 137, 252, 96, 245, + 181, 250, 15, 70, 35, 148, 31, 49, 235, 214, 47, 137, 28, 69, 16, 133, + 146, 115, 149, 121, 50, 182, 47, 44, 234, 102, 12, 51, 180, 236, 76, 173, + 199, 63, 187, 228, 110, 237, 159, 138, 147, 34, 181, 78, 6, 205, 97, 59, + 78, 21, 19, 197, 138, 160, 157, 61, 120, 234, 158, 17, 208, 154, 185, 18, + 249, 69, 126, 141, 146, 161, 4, 19, 67, 41, 27, 233, 16, 35, 5, 19, + 243, 50, 164, 113, 161, 129, 90, 242, 84, 197, 138, 237, 97, 172, 188, 174, + 62, 183, 215, 38, 253, 153, 77, 15, 14, 20, 225, 23, 109, 133, 229, 87, + 24, 184, 80, 214, 213, 43, 110, 249, 185, 54, 170, 33, 101, 195, 248, 69, + 20, 107, 18, 117, 74, 150, 103, 144, 136, 239, 140, 71, 119, 173, 254, 64, + 76, 236, 103, 200, 241, 148, 62, 91, 146, 60, 50, 3, 27, 29, 64, 117, + 48, 213, 217, 124, 247, 202, 76, 116, 102, 139, 1, 71, 152, 169, 35, 39, + 1, 37, 215, 24, 23, 75, 20, 100, 0, 236, 66, 54, 215, 124, 218, 26, + 205, 96, 101, 205, 97, 215, 135, 249, 205, 241, 215, 175, 135, 247, 113, 231, + 88, 116, 244, 89, 43, 173, 192, 214, 195, 194, 132, 37, 180, 182, 92, 128, + 198, 202, 146, 77, 40, 105, 149, 149, 176, 210, 29, 203, 238, 178, 72, 149, + 149, 168, 154, 148, 17, 186, 144, 141, 88, 139, 161, 3, 194, 51, 120, 20, + 216, 98, 1, 134, 80, 86, 46, 140, 105, 240, 136, 230, 195, 114, 79, 62, + 217, 62, 137, 44, 126, 181, 80, 181, 128, 157, 176, 160, 152, 25, 208, 51, + 242, 70, 43, 35, 1, 211, 7, 118, 120, 37, 242, 68, 148, 179, 156, 132, + 135, 28, 190, 181, 68, 135, 96, 246, 228, 200, 175, 239, 90, 105, 102, 114, + 126, 34, 86, 220, 237, 128, 124, 178, 83, 131, 142, 58, 80, 81, 18, 189, + 95, 95, 172, 105, 132, 83, 241, 90, 87, 83, 50, 100, 145, 83, 250, 213, + 90, 9, 21, 222, 138, 85, 101, 214, 141, 90, 243, 75, 66, 208, 249, 231, + 85, 67, 12, 92, 253, 2, 83, 181, 154, 8, 32, 132, 1, 240, 51, 188, + 95, 148, 109, 155, 156, 251, 207, 3, 41, 254, 169, 82, 160, 22, 26, 129, + 72, 172, 250, 238, 10, 69, 125, 41, 69, 239, 144, 102, 222, 211, 233, 122, + 191, 176, 106, 16, 1, 9, 182, 177, 114, 146, 231, 99, 164, 92, 125, 78, + 3, 253, 79, 25, 104, 92, 154, 237, 232, 158, 68, 179, 42, 157, 28, 58, + 99, 77, 79, 100, 141, 171, 177, 210, 184, 162, 208, 223, 79, 53, 148, 205, + 88, 12, 163, 218, 145, 228, 145, 221, 40, 1, 143, 208, 14, 85, 222, 211, + 157, 172, 167, 135, 115, 10, 5, 209, 83, 71, 41, 183, 94, 29, 164, 214, + 93, 125, 55, 135, 37, 38, 156, 135, 225, 119, 117, 174, 166, 206, 83, 58, + 114, 19, 248, 144, 136, 141, 107, 93, 142, 24, 39, 43, 97, 105, 125, 22, + 144, 217, 89, 112, 234, 245, 151, 203, 6, 149, 170, 195, 249, 99, 155, 218, + 45, 151, 116, 123, 185, 51, 77, 57, 22, 11, 146, 253, 178, 247, 11, 27, + 143, 252, 53, 31, 22, 202, 222, 63, 97, 65, 178, 200, 179, 117, 116, 12, + 95, 195, 216, 217, 230, 76, 134, 144, 77, 127, 120, 117, 6, 81, 255, 181, + 18, 245, 55, 50, 197, 73, 75, 18, 90, 167, 189, 81, 149, 180, 251, 131, + 170, 156, 116, 228, 31, 218, 205, 230, 150, 255, 208, 50, 197, 82, 204, 222, + 238, 58, 191, 138, 77, 90, 22, 236, 52, 245, 146, 245, 240, 26, 137, 52, + 157, 202, 129, 251, 45, 171, 14, 254, 146, 110, 26, 93, 147, 97, 195, 170, + 144, 14, 37, 232, 89, 66, 40, 14, 124, 19, 136, 77, 107, 21, 204, 247, + 127, 90, 11, 234, 230, 252, 207, 2, 155, 63, 50, 169, 31, 91, 19, 198, + 236, 171, 94, 25, 14, 218, 70, 197, 164, 117, 22, 196, 210, 182, 169, 181, + 228, 175, 157, 63, 122, 21, 100, 54, 148, 81, 161, 93, 163, 198, 135, 71, + 93, 23, 128, 209, 223, 235, 216, 192, 180, 151, 48, 79, 84, 96, 242, 221, + 240, 25, 198, 34, 135, 138, 224, 144, 194, 32, 15, 12, 225, 174, 209, 82, + 43, 139, 225, 1, 208, 228, 60, 15, 142, 138, 162, 226, 106, 115, 4, 32, + 81, 217, 75, 37, 248, 100, 39, 232, 21, 20, 135, 96, 204, 90, 77, 70, + 169, 105, 204, 90, 77, 203, 222, 14, 127, 192, 28, 44, 190, 45, 224, 126, + 152, 92, 98, 168, 29, 215, 199, 73, 207, 142, 111, 28, 27, 200, 60, 13, + 89, 119, 15, 99, 66, 79, 33, 79, 136, 123, 162, 133, 107, 161, 53, 217, + 56, 35, 106, 121, 79, 168, 141, 200, 48, 51, 67, 100, 135, 46, 49, 81, + 126, 153, 247, 137, 18, 163, 197, 240, 182, 59, 109, 142, 239, 154, 74, 110, + 25, 150, 111, 26, 173, 5, 93, 34, 127, 115, 175, 2, 203, 246, 141, 208, + 30, 30, 144, 245, 84, 183, 46, 177, 241, 210, 114, 85, 157, 201, 45, 20, + 151, 116, 221, 144, 254, 204, 189, 167, 43, 43, 21, 200, 94, 91, 244, 134, + 100, 42, 196, 255, 187, 100, 70, 255, 51, 23, 240, 73, 114, 1, 23, 39, + 229, 251, 243, 18, 217, 151, 232, 100, 66, 173, 27, 244, 100, 231, 6, 29, + 236, 222, 151, 69, 6, 205, 237, 194, 10, 227, 117, 80, 46, 199, 55, 176, + 251, 63, 28, 114, 141, 94, 112, 124, 238, 126, 215, 23, 41, 109, 61, 192, + 157, 100, 198, 120, 106, 114, 198, 25, 140, 114, 240, 82, 236, 200, 106, 223, + 204, 182, 88, 241, 243, 113, 83, 201, 206, 90, 242, 166, 179, 6, 196, 77, + 197, 112, 67, 171, 34, 251, 70, 74, 253, 3, 132, 70, 49, 23, 186, 56, + 239, 197, 35, 87, 254, 229, 21, 140, 30, 61, 52, 0, 63, 142, 199, 238, + 112, 209, 238, 105, 151, 86, 249, 220, 102, 185, 205, 21, 82, 102, 157, 244, + 202, 206, 105, 61, 156, 125, 34, 1, 187, 254, 163, 127, 57, 229, 17, 253, + 156, 239, 116, 183, 124, 72, 218, 224, 115, 108, 3, 70, 72, 19, 238, 241, + 133, 223, 18, 124, 149, 50, 20, 14, 219, 207, 27, 216, 44, 119, 221, 130, + 8, 239, 62, 156, 138, 29, 250, 190, 122, 44, 21, 108, 104, 131, 146, 250, + 112, 170, 88, 3, 96, 11, 249, 208, 202, 228, 58, 136, 32, 177, 57, 148, + 191, 152, 181, 254, 24, 136, 222, 37, 83, 184, 116, 124, 73, 139, 111, 156, + 196, 224, 243, 138, 245, 93, 156, 25, 96, 115, 107, 66, 11, 172, 211, 156, + 19, 212, 157, 49, 172, 244, 34, 113, 147, 232, 190, 97, 131, 39, 105, 129, + 192, 208, 41, 177, 160, 217, 146, 238, 104, 167, 150, 75, 200, 170, 51, 213, + 194, 131, 176, 120, 0, 233, 75, 29, 174, 133, 15, 43, 160, 84, 148, 127, + 211, 148, 10, 33, 0, 232, 123, 156, 93, 73, 6, 73, 194, 68, 177, 225, + 51, 86, 217, 225, 10, 169, 76, 117, 161, 44, 87, 216, 188, 48, 252, 12, + 136, 29, 185, 64, 43, 212, 76, 63, 233, 22, 104, 235, 226, 78, 233, 89, + 131, 173, 57, 90, 26, 87, 195, 79, 160, 171, 16, 8, 72, 95, 91, 219, + 233, 11, 60, 31, 82, 95, 166, 145, 147, 40, 38, 37, 130, 173, 22, 86, + 60, 235, 89, 215, 59, 152, 154, 101, 189, 208, 196, 53, 77, 42, 210, 205, + 10, 175, 210, 32, 63, 131, 62, 170, 133, 22, 130, 198, 102, 104, 53, 193, + 206, 0, 91, 247, 218, 208, 49, 6, 142, 107, 110, 217, 140, 147, 168, 68, + 37, 49, 197, 138, 200, 205, 77, 119, 117, 156, 140, 147, 19, 139, 28, 101, + 81, 163, 118, 101, 111, 14, 10, 223, 120, 47, 33, 59, 115, 38, 107, 167, + 90, 219, 21, 182, 57, 40, 109, 179, 159, 35, 45, 182, 108, 75, 43, 171, + 29, 75, 107, 163, 192, 92, 18, 253, 29, 222, 136, 24, 17, 24, 38, 58, + 44, 210, 97, 34, 152, 100, 36, 147, 188, 111, 81, 245, 15, 120, 252, 100, + 213, 31, 135, 137, 196, 227, 127, 143, 140, 207, 174, 144, 143, 106, 24, 239, + 209, 68, 184, 7, 32, 214, 94, 111, 201, 252, 157, 41, 43, 185, 233, 249, + 211, 55, 127, 55, 125, 243, 255, 18, 170, 106, 54, 73, 224, 127, 144, 72, + 15, 12, 209, 126, 177, 8, 79, 254, 176, 12, 79, 33, 83, 209, 248, 16, + 230, 206, 80, 39, 57, 42, 83, 39, 203, 46, 197, 250, 1, 249, 251, 135, + 69, 132, 18, 74, 35, 156, 122, 148, 207, 124, 111, 93, 198, 114, 169, 22, + 44, 154, 249, 225, 68, 80, 207, 179, 20, 208, 229, 120, 103, 190, 251, 1, + 85, 238, 180, 25, 23, 235, 44, 245, 190, 51, 101, 148, 241, 241, 112, 9, + 150, 54, 184, 117, 215, 11, 252, 101, 217, 251, 46, 105, 120, 233, 241, 130, + 180, 7, 249, 140, 146, 66, 187, 160, 240, 145, 114, 44, 67, 159, 214, 109, + 212, 234, 82, 70, 1, 7, 109, 250, 239, 95, 138, 232, 74, 196, 66, 59, + 59, 248, 135, 251, 101, 92, 92, 29, 36, 115, 100, 110, 75, 189, 86, 167, + 123, 59, 190, 157, 101, 153, 36, 230, 72, 23, 177, 198, 24, 177, 73, 255, + 239, 180, 70, 252, 131, 169, 247, 41, 126, 91, 255, 135, 219, 36, 54, 134, + 239, 134, 238, 28, 244, 55, 119, 233, 214, 194, 200, 199, 223, 190, 189, 94, + 25, 185, 87, 24, 57, 54, 164, 94, 106, 192, 171, 135, 176, 173, 230, 87, + 213, 226, 164, 111, 128, 49, 1, 136, 233, 138, 189, 142, 195, 181, 51, 29, + 89, 107, 251, 227, 179, 253, 49, 183, 63, 218, 146, 9, 150, 225, 233, 143, + 66, 230, 4, 76, 8, 165, 140, 130, 146, 118, 15, 125, 198, 8, 58, 161, + 241, 249, 200, 132, 85, 33, 157, 86, 84, 102, 188, 96, 3, 151, 97, 226, + 73, 172, 9, 138, 198, 51, 133, 118, 43, 229, 67, 109, 52, 113, 83, 177, + 169, 154, 162, 194, 168, 144, 248, 210, 28, 247, 103, 93, 54, 162, 11, 193, + 56, 183, 209, 96, 167, 111, 18, 32, 39, 48, 116, 64, 138, 42, 133, 43, + 206, 176, 153, 129, 100, 188, 112, 82, 93, 78, 190, 126, 90, 169, 93, 156, + 198, 244, 8, 131, 231, 252, 196, 123, 45, 228, 215, 128, 158, 112, 224, 253, + 102, 123, 225, 189, 41, 192, 196, 62, 127, 200, 241, 238, 132, 190, 247, 134, + 95, 107, 110, 164, 95, 143, 215, 165, 21, 37, 17, 63, 232, 194, 39, 17, + 146, 87, 205, 169, 234, 52, 161, 187, 214, 216, 168, 113, 30, 176, 78, 220, + 94, 56, 214, 56, 25, 31, 163, 22, 244, 152, 54, 54, 222, 116, 77, 247, + 198, 21, 155, 71, 174, 23, 189, 233, 231, 162, 55, 47, 176, 106, 193, 116, + 37, 198, 250, 17, 58, 71, 232, 214, 201, 7, 23, 155, 56, 160, 111, 24, + 166, 123, 3, 137, 154, 2, 29, 87, 115, 116, 108, 210, 87, 65, 39, 222, + 155, 146, 55, 223, 90, 154, 69, 166, 115, 177, 83, 130, 111, 153, 184, 46, + 230, 235, 85, 101, 91, 70, 33, 55, 147, 254, 73, 120, 70, 19, 89, 162, + 40, 163, 74, 63, 158, 81, 175, 124, 92, 56, 139, 252, 18, 209, 65, 55, + 197, 59, 219, 164, 167, 247, 246, 10, 134, 96, 36, 137, 177, 8, 195, 229, + 113, 215, 97, 174, 168, 40, 31, 61, 254, 72, 60, 77, 58, 96, 66, 121, + 111, 249, 114, 64, 63, 38, 98, 45, 131, 28, 177, 79, 199, 125, 167, 147, + 244, 169, 84, 142, 37, 202, 178, 73, 93, 86, 30, 27, 157, 63, 73, 10, + 118, 27, 68, 43, 67, 187, 77, 84, 11, 133, 224, 183, 72, 39, 106, 107, + 240, 123, 228, 227, 180, 105, 104, 220, 189, 125, 185, 128, 63, 102, 24, 90, + 109, 106, 247, 203, 36, 121, 12, 28, 135, 207, 225, 238, 46, 16, 151, 80, + 37, 106, 210, 237, 244, 89, 61, 89, 39, 254, 183, 66, 240, 253, 138, 31, + 1, 229, 153, 54, 135, 217, 0, 47, 103, 100, 232, 61, 235, 78, 231, 39, + 48, 119, 123, 34, 246, 96, 21, 45, 242, 1, 23, 207, 6, 120, 179, 171, + 108, 180, 230, 17, 163, 184, 115, 229, 231, 251, 164, 7, 185, 24, 123, 252, + 50, 45, 196, 102, 101, 74, 153, 166, 125, 204, 241, 242, 161, 172, 131, 245, + 253, 120, 148, 105, 134, 55, 43, 159, 88, 193, 197, 189, 176, 123, 160, 202, + 215, 135, 179, 209, 177, 214, 111, 103, 91, 225, 253, 250, 112, 46, 118, 234, + 214, 31, 193, 130, 112, 230, 105, 88, 146, 172, 76, 102, 146, 144, 242, 222, + 57, 124, 98, 12, 220, 50, 104, 31, 117, 103, 217, 101, 253, 219, 189, 64, + 107, 225, 152, 22, 129, 233, 145, 82, 136, 85, 86, 87, 25, 107, 34, 216, + 25, 188, 15, 46, 194, 232, 140, 158, 162, 147, 167, 207, 96, 57, 96, 0, + 159, 247, 206, 98, 89, 60, 127, 149, 213, 207, 251, 26, 39, 15, 208, 75, + 2, 235, 144, 113, 16, 255, 37, 163, 173, 28, 88, 22, 188, 231, 82, 67, + 7, 119, 88, 55, 116, 204, 224, 208, 97, 94, 115, 224, 26, 234, 110, 208, + 186, 159, 53, 162, 216, 25, 117, 91, 180, 190, 231, 32, 165, 9, 65, 54, + 17, 108, 217, 132, 254, 178, 215, 153, 109, 225, 94, 147, 142, 85, 120, 24, + 176, 203, 113, 147, 172, 110, 146, 149, 107, 204, 211, 5, 73, 76, 218, 227, + 183, 183, 189, 176, 190, 207, 212, 247, 217, 129, 111, 164, 47, 224, 120, 146, + 130, 4, 144, 115, 151, 69, 156, 166, 199, 95, 189, 45, 157, 49, 9, 213, + 70, 78, 229, 8, 164, 144, 178, 92, 152, 35, 215, 14, 212, 97, 54, 33, + 195, 51, 189, 161, 252, 160, 119, 205, 62, 154, 67, 75, 31, 38, 8, 155, + 179, 238, 18, 149, 167, 61, 155, 41, 15, 48, 89, 67, 110, 28, 118, 241, + 248, 254, 169, 106, 246, 161, 187, 129, 91, 96, 58, 246, 253, 247, 91, 246, + 20, 162, 157, 58, 96, 161, 36, 250, 138, 189, 175, 52, 141, 139, 82, 254, + 57, 40, 199, 146, 216, 40, 144, 239, 148, 31, 42, 248, 162, 147, 67, 187, + 51, 214, 47, 20, 18, 161, 0, 132, 240, 75, 168, 43, 75, 23, 162, 37, + 110, 54, 92, 198, 182, 188, 169, 226, 167, 8, 73, 50, 14, 10, 37, 40, + 180, 130, 130, 109, 105, 63, 85, 201, 74, 21, 106, 237, 248, 253, 234, 194, + 58, 68, 17, 188, 43, 93, 18, 55, 81, 213, 19, 158, 41, 239, 48, 137, + 198, 252, 94, 254, 56, 98, 81, 6, 163, 11, 70, 171, 148, 74, 177, 181, + 191, 16, 18, 110, 149, 178, 150, 170, 36, 172, 39, 237, 132, 27, 95, 174, + 37, 212, 138, 240, 50, 44, 178, 94, 194, 114, 213, 94, 70, 137, 120, 71, + 210, 132, 200, 181, 166, 171, 59, 24, 244, 39, 51, 123, 10, 170, 236, 21, + 71, 121, 11, 115, 247, 227, 197, 237, 175, 116, 146, 185, 238, 6, 173, 180, + 215, 170, 248, 207, 211, 46, 114, 174, 99, 42, 148, 221, 193, 192, 162, 113, + 223, 50, 209, 230, 154, 118, 149, 196, 220, 132, 53, 212, 190, 66, 185, 53, + 19, 210, 112, 171, 191, 127, 40, 27, 45, 114, 106, 98, 86, 54, 49, 89, + 243, 64, 86, 106, 99, 149, 47, 255, 123, 89, 127, 124, 40, 219, 25, 92, + 147, 156, 101, 101, 123, 253, 96, 255, 224, 184, 131, 112, 244, 122, 86, 78, + 27, 219, 217, 65, 153, 116, 144, 178, 47, 123, 184, 130, 152, 134, 130, 157, + 144, 100, 142, 225, 203, 191, 188, 252, 203, 95, 244, 173, 221, 0, 147, 203, + 48, 1, 147, 197, 70, 88, 9, 51, 115, 254, 240, 95, 175, 246, 114, 94, + 5, 149, 84, 222, 160, 242, 124, 63, 239, 219, 167, 118, 139, 145, 76, 129, + 255, 59, 165, 228, 31, 33, 173, 21, 118, 113, 80, 1, 194, 69, 186, 202, + 104, 16, 204, 239, 95, 92, 220, 215, 118, 113, 39, 86, 113, 39, 191, 171, + 184, 183, 170, 184, 228, 56, 76, 134, 105, 42, 113, 230, 251, 150, 157, 118, + 36, 199, 148, 70, 166, 87, 91, 67, 212, 226, 84, 106, 78, 84, 66, 164, + 196, 166, 20, 31, 214, 62, 19, 199, 10, 201, 33, 162, 205, 81, 174, 146, + 203, 135, 62, 19, 55, 235, 33, 223, 74, 251, 195, 203, 122, 85, 215, 235, + 169, 88, 33, 113, 137, 158, 250, 144, 202, 55, 109, 212, 164, 182, 116, 195, + 84, 107, 158, 161, 53, 13, 76, 232, 102, 35, 46, 181, 3, 227, 79, 155, + 5, 58, 36, 89, 146, 100, 205, 73, 180, 83, 109, 150, 226, 80, 73, 116, + 239, 169, 198, 40, 171, 70, 130, 160, 189, 237, 85, 236, 12, 80, 148, 22, + 110, 80, 141, 223, 151, 109, 176, 139, 219, 233, 128, 179, 90, 55, 242, 89, + 205, 205, 104, 95, 65, 31, 227, 97, 250, 24, 175, 184, 8, 57, 161, 35, + 216, 241, 86, 235, 135, 71, 127, 198, 3, 207, 87, 53, 211, 246, 254, 245, + 198, 27, 205, 74, 225, 22, 150, 230, 214, 166, 245, 26, 221, 81, 145, 79, + 165, 165, 101, 183, 209, 10, 124, 4, 213, 0, 3, 10, 127, 34, 16, 73, + 227, 26, 220, 88, 135, 127, 114, 158, 7, 250, 24, 15, 245, 75, 160, 207, + 243, 208, 156, 231, 97, 66, 142, 176, 90, 147, 213, 66, 49, 99, 54, 24, + 143, 59, 149, 196, 250, 13, 19, 31, 208, 4, 31, 7, 139, 125, 23, 156, + 183, 166, 119, 253, 238, 160, 115, 208, 209, 152, 73, 145, 208, 245, 146, 60, + 255, 102, 63, 99, 166, 166, 167, 208, 246, 14, 220, 14, 255, 163, 151, 3, + 125, 69, 24, 92, 223, 56, 249, 227, 111, 222, 85, 79, 9, 189, 63, 46, + 208, 234, 92, 57, 43, 2, 75, 111, 26, 116, 115, 208, 110, 41, 222, 184, + 44, 171, 185, 33, 12, 105, 46, 248, 61, 212, 232, 105, 170, 87, 30, 148, + 233, 220, 181, 7, 202, 237, 103, 122, 110, 232, 108, 10, 2, 56, 196, 46, + 122, 87, 108, 68, 199, 91, 149, 150, 165, 179, 45, 207, 182, 251, 225, 186, + 22, 28, 177, 103, 212, 46, 156, 68, 116, 154, 180, 248, 235, 96, 126, 50, + 243, 174, 9, 57, 83, 183, 230, 222, 186, 64, 229, 85, 138, 207, 112, 137, + 229, 246, 103, 227, 217, 98, 122, 215, 106, 179, 11, 179, 224, 8, 30, 195, + 92, 33, 79, 77, 63, 209, 138, 72, 90, 202, 82, 186, 112, 162, 225, 106, + 63, 184, 188, 206, 68, 216, 244, 167, 238, 116, 6, 189, 2, 26, 209, 242, + 108, 78, 247, 223, 105, 170, 59, 240, 250, 0, 59, 27, 44, 20, 156, 92, + 151, 42, 236, 125, 125, 60, 132, 123, 180, 90, 96, 59, 182, 20, 199, 101, + 113, 36, 56, 27, 45, 166, 192, 21, 151, 175, 117, 254, 98, 31, 135, 44, + 68, 80, 15, 196, 97, 100, 189, 250, 128, 195, 200, 31, 204, 34, 114, 230, + 48, 123, 63, 23, 143, 100, 166, 120, 194, 229, 7, 149, 10, 92, 99, 58, + 83, 28, 1, 32, 217, 249, 189, 147, 216, 200, 41, 205, 16, 186, 114, 143, + 174, 171, 32, 210, 80, 149, 116, 63, 80, 175, 138, 77, 42, 174, 58, 149, + 168, 190, 128, 171, 95, 197, 151, 50, 129, 167, 214, 117, 4, 68, 115, 229, + 48, 68, 18, 246, 177, 118, 205, 168, 137, 74, 232, 137, 198, 35, 253, 168, + 42, 253, 149, 253, 43, 98, 122, 145, 239, 205, 131, 147, 48, 40, 19, 202, + 101, 28, 130, 2, 165, 140, 83, 30, 65, 235, 85, 214, 60, 40, 169, 32, + 250, 148, 16, 219, 99, 28, 100, 213, 217, 79, 92, 189, 38, 190, 42, 19, + 167, 136, 109, 10, 118, 84, 82, 36, 222, 148, 235, 69, 111, 190, 149, 220, + 202, 117, 114, 132, 16, 35, 133, 189, 201, 123, 243, 50, 13, 99, 161, 24, + 109, 53, 125, 12, 238, 122, 149, 219, 54, 75, 38, 219, 123, 67, 23, 41, + 181, 134, 96, 10, 228, 234, 136, 245, 0, 54, 101, 111, 67, 75, 28, 68, + 187, 164, 208, 231, 65, 201, 219, 208, 46, 192, 241, 81, 199, 251, 154, 223, + 37, 165, 175, 124, 81, 114, 225, 188, 59, 230, 131, 70, 116, 22, 148, 168, + 173, 151, 23, 64, 235, 230, 151, 243, 1, 107, 64, 7, 42, 75, 41, 10, + 10, 132, 234, 6, 69, 180, 118, 62, 128, 128, 134, 65, 246, 231, 151, 148, + 215, 29, 79, 118, 149, 208, 165, 91, 39, 17, 232, 211, 194, 131, 78, 210, + 64, 147, 157, 226, 207, 36, 158, 79, 148, 95, 49, 159, 24, 143, 101, 153, + 118, 43, 157, 124, 5, 150, 116, 139, 100, 74, 189, 241, 196, 135, 79, 77, + 160, 248, 124, 150, 198, 210, 252, 121, 0, 142, 17, 156, 134, 204, 131, 163, + 88, 251, 187, 247, 230, 46, 128, 133, 26, 184, 90, 22, 8, 48, 87, 134, + 39, 75, 202, 77, 135, 114, 24, 106, 200, 63, 239, 206, 167, 253, 125, 86, + 14, 135, 186, 247, 80, 123, 112, 116, 162, 127, 39, 148, 255, 145, 107, 248, + 18, 248, 158, 5, 228, 127, 236, 81, 43, 251, 16, 150, 83, 48, 151, 208, + 177, 201, 160, 11, 233, 56, 81, 192, 27, 223, 241, 121, 182, 87, 39, 119, + 52, 147, 158, 248, 50, 237, 57, 139, 14, 8, 166, 38, 138, 198, 7, 23, + 70, 133, 140, 105, 181, 140, 51, 201, 97, 105, 58, 225, 176, 245, 161, 171, + 233, 138, 176, 172, 100, 242, 186, 119, 45, 186, 53, 142, 238, 255, 123, 104, + 89, 234, 180, 154, 14, 29, 173, 69, 174, 254, 119, 98, 24, 221, 181, 100, + 18, 236, 48, 19, 66, 97, 145, 73, 183, 155, 70, 135, 5, 169, 176, 221, + 178, 172, 242, 156, 209, 240, 186, 124, 202, 172, 141, 33, 109, 195, 170, 63, + 60, 243, 135, 4, 248, 134, 116, 241, 27, 210, 62, 26, 70, 85, 236, 142, + 197, 37, 224, 139, 211, 119, 173, 138, 249, 203, 46, 16, 33, 113, 170, 97, + 125, 215, 126, 143, 211, 205, 54, 57, 226, 221, 80, 149, 3, 77, 19, 39, + 200, 195, 136, 90, 69, 55, 197, 97, 76, 173, 170, 162, 157, 212, 208, 234, + 153, 101, 137, 138, 78, 248, 126, 99, 83, 229, 109, 58, 184, 30, 194, 28, + 183, 138, 137, 161, 148, 132, 229, 195, 244, 164, 231, 0, 71, 87, 172, 229, + 204, 94, 196, 55, 94, 191, 132, 111, 181, 185, 19, 51, 166, 64, 26, 104, + 192, 52, 187, 104, 145, 167, 1, 137, 162, 106, 225, 24, 212, 170, 24, 7, + 223, 81, 194, 161, 154, 57, 121, 65, 6, 47, 66, 102, 85, 92, 240, 168, + 23, 112, 80, 17, 48, 146, 154, 90, 179, 15, 41, 168, 76, 141, 36, 160, + 92, 11, 248, 48, 82, 66, 61, 116, 132, 208, 74, 21, 225, 159, 107, 228, + 128, 52, 149, 173, 94, 164, 152, 106, 44, 129, 101, 232, 115, 56, 2, 99, + 37, 27, 100, 10, 22, 1, 45, 116, 190, 75, 208, 163, 221, 213, 50, 144, + 201, 58, 218, 72, 211, 253, 63, 111, 98, 12, 91, 153, 127, 74, 209, 150, + 78, 158, 79, 154, 7, 84, 210, 47, 237, 138, 118, 140, 109, 60, 62, 186, + 129, 182, 108, 150, 88, 103, 230, 174, 206, 188, 43, 129, 244, 154, 89, 8, + 57, 122, 234, 139, 163, 172, 219, 206, 228, 166, 50, 100, 162, 163, 243, 115, + 35, 140, 220, 111, 97, 153, 193, 251, 25, 102, 239, 32, 140, 169, 203, 187, + 29, 183, 166, 29, 31, 219, 183, 201, 175, 206, 198, 67, 25, 69, 239, 103, + 216, 208, 145, 215, 111, 197, 167, 169, 157, 141, 54, 123, 167, 59, 149, 124, + 242, 158, 200, 111, 177, 59, 113, 204, 91, 18, 217, 228, 185, 17, 213, 53, + 9, 1, 110, 79, 199, 170, 229, 153, 60, 18, 70, 38, 166, 66, 60, 148, + 19, 114, 85, 197, 152, 187, 198, 213, 248, 218, 102, 115, 209, 183, 46, 203, + 17, 95, 229, 85, 229, 217, 28, 252, 207, 68, 27, 81, 149, 10, 51, 77, + 154, 57, 122, 171, 36, 237, 98, 130, 244, 37, 107, 138, 133, 144, 38, 82, + 113, 90, 153, 213, 129, 96, 112, 195, 251, 205, 157, 209, 202, 129, 87, 50, + 64, 54, 237, 161, 12, 96, 150, 160, 231, 148, 94, 217, 119, 217, 104, 164, + 229, 172, 22, 56, 164, 193, 79, 44, 24, 55, 94, 46, 211, 102, 76, 118, + 150, 21, 141, 180, 217, 51, 93, 146, 232, 68, 233, 202, 193, 118, 75, 70, + 241, 198, 92, 123, 130, 202, 169, 127, 189, 59, 190, 55, 202, 171, 58, 97, + 174, 223, 80, 105, 239, 70, 255, 160, 242, 158, 229, 104, 79, 249, 88, 187, + 177, 128, 18, 244, 80, 249, 172, 6, 171, 165, 63, 90, 116, 181, 210, 211, + 232, 146, 112, 208, 107, 94, 6, 234, 226, 137, 62, 89, 219, 159, 238, 200, + 222, 165, 15, 87, 21, 253, 6, 189, 120, 125, 200, 84, 40, 132, 121, 42, + 22, 250, 113, 57, 229, 145, 42, 53, 54, 209, 251, 188, 200, 233, 244, 11, + 52, 16, 108, 201, 218, 229, 21, 104, 192, 35, 208, 202, 209, 80, 22, 161, + 155, 22, 64, 236, 23, 174, 66, 130, 51, 122, 181, 80, 115, 176, 116, 83, + 245, 76, 221, 131, 139, 213, 46, 93, 173, 79, 6, 60, 80, 249, 106, 120, + 163, 81, 246, 76, 241, 13, 228, 103, 246, 225, 69, 51, 218, 25, 171, 209, + 37, 84, 198, 154, 116, 61, 90, 38, 154, 55, 161, 217, 64, 246, 158, 240, + 247, 166, 200, 209, 195, 107, 54, 136, 244, 253, 87, 171, 4, 154, 244, 161, + 55, 186, 129, 49, 171, 50, 140, 166, 108, 232, 139, 121, 193, 5, 246, 209, + 35, 224, 133, 147, 56, 102, 120, 118, 246, 27, 68, 47, 103, 148, 0, 82, + 112, 169, 21, 228, 114, 176, 30, 172, 252, 94, 13, 133, 100, 32, 215, 91, + 45, 53, 39, 152, 54, 45, 152, 82, 49, 213, 76, 101, 196, 33, 189, 68, + 211, 213, 101, 194, 1, 185, 93, 253, 128, 85, 66, 40, 88, 206, 227, 245, + 146, 115, 233, 191, 55, 221, 213, 220, 61, 207, 49, 34, 28, 243, 81, 70, + 155, 122, 42, 112, 160, 170, 213, 6, 93, 136, 184, 26, 208, 232, 236, 116, + 48, 45, 176, 41, 254, 236, 247, 183, 138, 187, 159, 42, 17, 13, 164, 110, + 210, 128, 208, 232, 133, 207, 235, 124, 22, 177, 146, 173, 17, 11, 189, 126, + 112, 134, 129, 231, 111, 236, 20, 203, 109, 121, 89, 174, 110, 213, 154, 68, + 109, 92, 44, 155, 81, 212, 11, 140, 23, 149, 162, 193, 216, 187, 159, 174, + 42, 178, 72, 203, 33, 29, 29, 240, 254, 28, 84, 223, 203, 120, 21, 182, + 138, 202, 254, 235, 238, 12, 36, 29, 59, 0, 34, 150, 32, 229, 67, 104, + 144, 93, 54, 227, 37, 211, 241, 181, 66, 39, 69, 91, 123, 49, 157, 141, + 153, 95, 20, 164, 105, 247, 201, 198, 176, 72, 188, 137, 144, 219, 158, 111, + 181, 76, 255, 104, 45, 241, 120, 99, 229, 244, 177, 75, 75, 33, 174, 61, + 163, 163, 170, 63, 242, 71, 116, 67, 244, 189, 81, 1, 110, 25, 26, 155, + 101, 212, 80, 235, 182, 165, 22, 238, 5, 219, 109, 143, 248, 154, 67, 171, + 58, 85, 103, 41, 93, 157, 239, 253, 92, 54, 89, 143, 162, 66, 121, 137, + 117, 207, 128, 215, 108, 191, 22, 111, 146, 145, 217, 30, 173, 221, 29, 88, + 230, 45, 72, 201, 152, 70, 250, 93, 131, 186, 191, 162, 38, 175, 112, 71, + 104, 141, 52, 125, 212, 2, 33, 59, 230, 116, 148, 0, 31, 203, 71, 254, + 86, 246, 112, 200, 92, 5, 149, 231, 239, 81, 159, 76, 48, 213, 166, 226, + 205, 24, 59, 107, 186, 86, 165, 27, 250, 48, 156, 40, 107, 64, 193, 141, + 188, 210, 206, 156, 214, 37, 78, 219, 219, 94, 121, 223, 138, 23, 146, 75, + 106, 191, 57, 204, 120, 38, 147, 74, 236, 45, 255, 171, 129, 56, 59, 251, + 92, 169, 120, 241, 229, 79, 29, 152, 59, 157, 255, 29, 18, 29, 80, 193, + 157, 245, 198, 131, 142, 165, 77, 164, 66, 118, 180, 135, 102, 187, 46, 182, + 173, 204, 238, 185, 81, 56, 73, 178, 115, 174, 156, 186, 195, 209, 34, 79, + 103, 223, 247, 177, 186, 156, 245, 63, 7, 13, 111, 147, 51, 254, 9, 221, + 74, 110, 235, 176, 106, 15, 250, 46, 50, 172, 72, 36, 59, 233, 152, 183, + 80, 110, 51, 162, 14, 150, 221, 215, 150, 186, 144, 105, 87, 206, 161, 109, + 79, 87, 160, 189, 33, 97, 53, 136, 229, 87, 161, 223, 251, 42, 132, 70, + 26, 40, 206, 52, 89, 55, 238, 87, 238, 55, 221, 17, 21, 164, 21, 115, + 68, 117, 89, 56, 219, 165, 217, 0, 34, 12, 216, 162, 192, 171, 160, 201, + 32, 217, 124, 173, 224, 78, 199, 62, 230, 97, 184, 242, 135, 107, 127, 200, + 18, 178, 43, 127, 173, 165, 100, 135, 183, 138, 86, 63, 180, 164, 100, 135, + 44, 38, 43, 157, 220, 228, 150, 87, 189, 23, 121, 183, 179, 12, 221, 6, + 111, 225, 37, 247, 45, 188, 128, 130, 19, 5, 229, 17, 83, 230, 18, 114, + 162, 173, 76, 1, 23, 110, 225, 220, 161, 76, 61, 157, 169, 183, 155, 169, + 167, 50, 173, 117, 166, 30, 50, 229, 182, 143, 27, 152, 101, 158, 38, 218, + 134, 70, 150, 238, 187, 24, 6, 9, 56, 210, 135, 3, 99, 67, 102, 214, + 161, 143, 211, 84, 182, 48, 57, 29, 33, 82, 116, 79, 161, 177, 225, 127, + 76, 5, 9, 233, 182, 84, 33, 136, 120, 4, 125, 68, 193, 147, 68, 188, + 155, 7, 111, 207, 252, 163, 197, 205, 156, 238, 90, 135, 250, 114, 102, 149, + 243, 16, 179, 74, 243, 192, 178, 198, 229, 75, 88, 88, 206, 67, 44, 172, + 63, 166, 146, 183, 91, 107, 67, 28, 46, 147, 81, 71, 77, 198, 169, 64, + 86, 87, 205, 30, 45, 109, 216, 89, 74, 238, 138, 6, 34, 244, 219, 115, + 56, 4, 220, 19, 243, 162, 136, 50, 197, 148, 41, 42, 161, 242, 232, 196, + 255, 86, 66, 15, 85, 252, 35, 85, 252, 163, 170, 56, 155, 228, 179, 67, + 138, 249, 175, 89, 87, 145, 99, 134, 182, 120, 151, 192, 52, 119, 50, 158, + 177, 162, 231, 76, 145, 119, 116, 174, 217, 122, 120, 59, 198, 253, 234, 107, + 232, 25, 90, 122, 135, 236, 156, 58, 131, 228, 243, 68, 58, 201, 176, 59, + 155, 17, 52, 161, 5, 221, 166, 189, 49, 103, 124, 132, 141, 35, 225, 5, + 158, 70, 16, 53, 31, 78, 98, 249, 137, 228, 39, 108, 176, 239, 17, 51, + 200, 17, 182, 139, 232, 191, 17, 4, 116, 115, 74, 6, 199, 147, 146, 92, + 93, 73, 106, 192, 242, 255, 64, 243, 145, 162, 144, 147, 109, 150, 157, 236, + 23, 43, 25, 175, 27, 89, 195, 75, 49, 230, 177, 143, 186, 16, 56, 145, + 114, 140, 180, 193, 51, 134, 178, 106, 201, 202, 185, 163, 62, 254, 151, 48, + 90, 153, 146, 56, 237, 206, 23, 211, 145, 205, 116, 77, 243, 3, 163, 132, + 211, 186, 78, 125, 173, 182, 151, 213, 192, 142, 196, 167, 140, 153, 216, 66, + 228, 52, 229, 176, 86, 56, 9, 99, 220, 249, 120, 28, 77, 212, 122, 39, + 42, 108, 108, 170, 239, 243, 30, 18, 21, 227, 18, 126, 149, 119, 39, 65, + 15, 48, 37, 39, 8, 13, 11, 71, 85, 151, 211, 11, 111, 92, 116, 138, + 146, 111, 57, 115, 57, 229, 101, 122, 182, 54, 106, 94, 96, 122, 80, 43, + 202, 108, 114, 212, 128, 98, 142, 171, 203, 185, 37, 55, 172, 149, 22, 249, + 114, 205, 175, 17, 52, 246, 223, 57, 86, 116, 180, 23, 173, 112, 91, 135, + 177, 104, 230, 217, 16, 192, 228, 134, 210, 69, 16, 142, 141, 164, 186, 66, + 145, 27, 179, 117, 242, 17, 29, 75, 113, 181, 234, 159, 213, 131, 176, 238, + 87, 195, 58, 144, 253, 58, 5, 212, 235, 181, 211, 186, 79, 143, 231, 177, + 95, 141, 235, 103, 23, 239, 156, 4, 163, 101, 1, 85, 14, 81, 239, 242, + 63, 133, 128, 200, 21, 179, 228, 74, 213, 175, 249, 245, 130, 241, 209, 164, + 198, 243, 207, 222, 149, 82, 79, 225, 86, 253, 73, 134, 175, 209, 224, 223, + 223, 126, 211, 193, 249, 72, 90, 88, 160, 40, 245, 154, 30, 183, 126, 222, + 187, 98, 95, 91, 191, 130, 240, 205, 195, 134, 97, 1, 113, 156, 163, 232, + 60, 209, 195, 194, 131, 150, 138, 140, 236, 200, 148, 78, 82, 89, 233, 148, + 101, 54, 143, 14, 31, 107, 107, 237, 236, 140, 229, 120, 244, 76, 239, 158, + 195, 233, 254, 161, 211, 241, 246, 177, 132, 112, 148, 8, 130, 37, 104, 253, + 5, 184, 154, 236, 27, 222, 52, 6, 158, 179, 19, 56, 129, 30, 155, 188, + 154, 118, 101, 227, 82, 129, 23, 32, 177, 106, 101, 170, 144, 203, 231, 188, + 161, 117, 211, 119, 27, 255, 35, 84, 146, 1, 223, 208, 129, 63, 166, 245, + 122, 203, 167, 38, 151, 48, 197, 217, 4, 86, 95, 232, 198, 9, 34, 81, + 29, 234, 31, 211, 73, 23, 228, 165, 202, 153, 176, 195, 104, 57, 236, 100, + 1, 251, 47, 44, 247, 221, 210, 8, 162, 216, 236, 107, 133, 223, 233, 35, + 22, 130, 18, 175, 20, 79, 104, 47, 45, 17, 4, 87, 174, 214, 236, 162, + 2, 42, 11, 66, 117, 252, 199, 28, 70, 165, 71, 90, 35, 236, 132, 254, + 206, 212, 95, 98, 71, 62, 21, 170, 98, 186, 83, 186, 40, 128, 40, 154, + 238, 89, 167, 123, 199, 158, 160, 170, 59, 205, 103, 14, 35, 237, 188, 52, + 116, 8, 247, 154, 98, 132, 192, 52, 107, 47, 138, 228, 79, 52, 251, 246, + 162, 117, 163, 133, 4, 254, 164, 166, 128, 13, 154, 209, 150, 136, 218, 18, + 63, 167, 155, 247, 115, 33, 170, 230, 158, 229, 87, 71, 128, 148, 0, 224, + 207, 242, 107, 126, 207, 49, 149, 128, 96, 10, 254, 12, 117, 73, 89, 102, + 55, 154, 176, 110, 170, 62, 153, 54, 103, 143, 82, 24, 6, 152, 251, 51, + 152, 230, 208, 179, 31, 66, 88, 148, 48, 202, 72, 40, 132, 134, 44, 172, + 57, 190, 118, 185, 49, 181, 151, 91, 17, 7, 233, 105, 164, 106, 234, 244, + 247, 92, 253, 90, 147, 85, 79, 15, 144, 182, 190, 5, 29, 19, 130, 132, + 74, 209, 67, 141, 236, 238, 160, 157, 129, 119, 76, 255, 82, 69, 84, 169, + 13, 233, 54, 25, 123, 88, 26, 214, 216, 209, 53, 213, 100, 61, 120, 118, + 147, 67, 213, 228, 231, 15, 53, 249, 73, 141, 170, 63, 80, 139, 169, 97, + 167, 150, 244, 140, 29, 170, 69, 99, 135, 75, 154, 46, 88, 187, 24, 221, + 54, 141, 129, 197, 230, 10, 70, 227, 174, 26, 145, 159, 14, 94, 103, 7, + 131, 38, 58, 94, 76, 103, 116, 165, 240, 97, 78, 23, 200, 106, 243, 174, + 223, 233, 14, 216, 21, 170, 27, 52, 218, 116, 19, 158, 65, 6, 234, 55, + 55, 84, 31, 244, 26, 53, 224, 105, 141, 174, 52, 191, 185, 113, 131, 141, + 79, 254, 230, 86, 249, 133, 82, 110, 253, 166, 69, 214, 105, 242, 221, 237, + 198, 15, 46, 27, 182, 213, 79, 229, 136, 145, 110, 226, 89, 18, 43, 182, + 193, 9, 185, 251, 161, 179, 221, 233, 3, 214, 38, 246, 71, 161, 177, 63, + 2, 141, 8, 22, 30, 51, 135, 160, 17, 40, 217, 245, 189, 97, 8, 217, + 40, 133, 26, 109, 198, 172, 221, 92, 127, 198, 184, 201, 38, 108, 68, 219, + 2, 32, 173, 23, 210, 232, 226, 69, 199, 68, 13, 47, 84, 81, 209, 78, + 20, 97, 150, 42, 38, 134, 108, 200, 159, 254, 228, 232, 152, 106, 67, 231, + 169, 74, 12, 189, 92, 54, 170, 252, 178, 169, 67, 138, 123, 171, 195, 235, + 52, 116, 57, 109, 25, 163, 214, 248, 114, 51, 24, 111, 187, 31, 23, 125, + 186, 42, 194, 36, 200, 160, 219, 162, 137, 3, 195, 170, 63, 154, 44, 230, + 50, 230, 207, 114, 22, 134, 248, 7, 222, 33, 94, 31, 152, 220, 199, 217, + 199, 153, 44, 222, 191, 119, 239, 230, 46, 95, 44, 92, 229, 255, 154, 202, + 57, 119, 95, 118, 196, 74, 42, 248, 189, 198, 0, 105, 37, 157, 245, 45, + 60, 107, 103, 228, 253, 139, 40, 155, 236, 229, 202, 230, 12, 195, 91, 155, + 220, 110, 250, 157, 14, 29, 197, 251, 229, 253, 208, 27, 47, 69, 149, 194, + 172, 187, 76, 77, 143, 151, 175, 184, 196, 115, 247, 235, 30, 52, 59, 76, + 106, 120, 235, 236, 47, 178, 57, 212, 48, 123, 165, 114, 253, 56, 190, 135, + 51, 35, 186, 60, 140, 167, 253, 251, 62, 155, 175, 101, 139, 38, 7, 213, + 101, 176, 10, 160, 44, 147, 217, 172, 61, 14, 182, 159, 161, 206, 178, 203, + 212, 62, 119, 149, 31, 76, 237, 4, 147, 39, 225, 143, 147, 202, 210, 170, + 27, 155, 28, 12, 59, 161, 119, 205, 214, 244, 222, 245, 106, 185, 173, 59, + 105, 205, 102, 94, 205, 157, 205, 199, 211, 174, 205, 212, 98, 250, 36, 143, + 96, 178, 239, 27, 213, 93, 162, 151, 59, 26, 54, 54, 163, 173, 51, 26, + 178, 226, 157, 165, 118, 173, 203, 41, 184, 214, 135, 59, 157, 70, 202, 204, + 225, 245, 210, 239, 221, 64, 78, 60, 214, 117, 79, 211, 149, 107, 234, 157, + 169, 30, 52, 52, 6, 50, 73, 123, 118, 204, 147, 82, 19, 110, 11, 6, + 235, 235, 244, 135, 179, 52, 57, 14, 247, 174, 14, 97, 129, 208, 153, 228, + 215, 98, 239, 4, 220, 79, 65, 140, 179, 210, 35, 37, 90, 234, 135, 55, + 91, 70, 117, 232, 88, 22, 49, 74, 166, 93, 32, 139, 77, 204, 179, 119, + 233, 207, 180, 63, 115, 78, 73, 27, 190, 17, 21, 57, 118, 213, 203, 185, + 20, 201, 45, 82, 18, 84, 138, 169, 136, 30, 16, 122, 60, 226, 221, 13, + 221, 206, 37, 30, 211, 180, 101, 13, 211, 255, 130, 229, 145, 170, 41, 208, + 54, 25, 28, 232, 45, 102, 133, 178, 77, 237, 205, 242, 164, 42, 226, 68, + 202, 236, 187, 51, 186, 157, 248, 163, 219, 143, 4, 128, 125, 47, 130, 73, + 75, 143, 66, 138, 244, 248, 40, 233, 114, 4, 243, 9, 220, 81, 32, 168, + 116, 136, 204, 93, 184, 58, 236, 163, 10, 251, 152, 187, 112, 16, 191, 62, + 162, 248, 11, 7, 193, 128, 209, 235, 19, 250, 44, 92, 56, 43, 250, 158, + 136, 145, 66, 148, 83, 118, 67, 10, 92, 83, 224, 71, 29, 248, 81, 5, + 94, 187, 160, 59, 210, 159, 123, 147, 163, 166, 17, 204, 20, 181, 19, 122, + 189, 10, 156, 210, 45, 70, 243, 246, 134, 197, 250, 118, 252, 152, 138, 50, + 139, 226, 137, 240, 34, 59, 129, 172, 254, 125, 107, 49, 155, 245, 91, 192, + 208, 8, 65, 130, 227, 228, 219, 182, 244, 235, 202, 185, 237, 210, 190, 207, + 79, 187, 119, 249, 246, 116, 60, 201, 127, 85, 14, 11, 62, 167, 47, 80, + 75, 168, 127, 13, 118, 48, 59, 163, 136, 136, 2, 250, 223, 113, 192, 117, + 120, 67, 29, 82, 239, 103, 244, 190, 86, 239, 207, 233, 157, 90, 71, 31, + 159, 216, 28, 81, 254, 171, 37, 149, 88, 236, 125, 133, 171, 75, 255, 59, + 42, 161, 51, 109, 45, 81, 24, 235, 238, 82, 17, 101, 23, 41, 78, 34, + 127, 141, 247, 158, 188, 3, 59, 69, 176, 207, 25, 69, 30, 79, 181, 234, + 194, 25, 173, 184, 54, 26, 165, 239, 144, 233, 70, 134, 239, 122, 137, 66, + 41, 125, 116, 83, 150, 65, 68, 58, 159, 19, 223, 228, 248, 222, 29, 67, + 193, 212, 73, 88, 228, 74, 193, 254, 77, 192, 198, 110, 176, 2, 205, 74, + 121, 116, 25, 34, 174, 224, 204, 22, 183, 179, 214, 112, 162, 140, 13, 151, + 60, 186, 174, 251, 116, 89, 215, 158, 171, 245, 2, 156, 222, 222, 93, 155, + 162, 225, 40, 151, 230, 207, 183, 39, 201, 83, 5, 177, 178, 172, 171, 191, + 216, 102, 45, 167, 85, 240, 66, 109, 155, 24, 34, 211, 199, 215, 180, 64, + 110, 196, 87, 45, 42, 225, 22, 31, 104, 44, 130, 11, 78, 9, 201, 212, + 218, 185, 198, 251, 13, 223, 62, 98, 189, 247, 150, 186, 136, 253, 220, 211, + 2, 187, 17, 94, 222, 36, 123, 110, 154, 130, 114, 54, 248, 154, 130, 88, + 162, 204, 226, 106, 10, 132, 87, 215, 54, 27, 85, 101, 83, 148, 4, 19, + 88, 198, 5, 155, 86, 3, 178, 97, 156, 211, 37, 108, 205, 30, 186, 92, + 81, 45, 88, 56, 172, 8, 121, 21, 212, 171, 70, 197, 135, 22, 31, 5, + 71, 28, 108, 187, 250, 164, 112, 240, 108, 65, 78, 191, 166, 229, 150, 227, + 1, 201, 209, 98, 81, 111, 238, 13, 239, 60, 88, 64, 69, 9, 216, 214, + 2, 253, 153, 40, 239, 237, 158, 4, 185, 116, 34, 212, 167, 147, 151, 220, + 72, 71, 106, 199, 225, 13, 87, 68, 11, 227, 147, 92, 126, 175, 40, 90, + 170, 57, 90, 172, 244, 239, 23, 148, 194, 75, 34, 255, 186, 112, 77, 253, + 185, 41, 178, 31, 229, 11, 173, 127, 132, 173, 233, 255, 226, 171, 58, 205, + 111, 224, 171, 138, 252, 224, 64, 218, 208, 252, 38, 105, 215, 151, 57, 239, + 77, 144, 123, 129, 81, 60, 199, 152, 21, 46, 220, 215, 76, 252, 16, 58, + 62, 83, 16, 134, 218, 90, 235, 112, 69, 168, 253, 181, 240, 67, 182, 122, + 191, 105, 174, 11, 59, 94, 96, 12, 166, 201, 220, 177, 141, 86, 13, 80, + 124, 19, 19, 163, 121, 38, 154, 145, 178, 119, 198, 105, 87, 9, 189, 175, + 18, 40, 127, 21, 184, 95, 17, 118, 69, 39, 203, 16, 151, 6, 195, 213, + 210, 9, 50, 78, 202, 141, 201, 236, 231, 58, 148, 139, 225, 240, 221, 133, + 251, 65, 222, 203, 225, 133, 107, 86, 131, 90, 12, 83, 179, 24, 166, 57, + 116, 232, 232, 130, 57, 79, 249, 15, 148, 40, 240, 221, 15, 151, 61, 223, + 45, 149, 62, 248, 14, 33, 203, 200, 8, 104, 155, 167, 137, 186, 254, 112, + 35, 115, 69, 235, 231, 26, 140, 157, 117, 238, 166, 160, 231, 13, 105, 47, + 209, 128, 23, 121, 213, 12, 132, 152, 118, 124, 40, 96, 218, 241, 161, 16, + 116, 36, 186, 204, 129, 199, 114, 230, 211, 133, 186, 184, 183, 88, 10, 185, + 23, 72, 126, 94, 14, 115, 219, 132, 93, 90, 22, 78, 179, 98, 93, 210, + 156, 209, 158, 218, 193, 20, 54, 207, 118, 246, 21, 20, 40, 100, 171, 39, + 180, 220, 242, 91, 9, 77, 76, 239, 239, 31, 160, 13, 43, 57, 225, 158, + 219, 125, 36, 73, 236, 221, 248, 251, 43, 189, 20, 21, 142, 88, 143, 107, + 23, 139, 113, 119, 160, 206, 230, 49, 99, 173, 156, 136, 193, 162, 152, 208, + 43, 49, 4, 81, 128, 77, 233, 222, 11, 82, 163, 194, 18, 146, 158, 171, + 73, 95, 143, 217, 131, 221, 111, 211, 212, 4, 222, 106, 88, 149, 177, 180, + 27, 141, 93, 19, 180, 214, 234, 118, 150, 216, 71, 124, 170, 188, 206, 95, + 99, 181, 220, 20, 229, 0, 80, 70, 175, 233, 212, 208, 135, 153, 4, 110, + 157, 252, 38, 119, 205, 44, 195, 181, 239, 81, 118, 2, 85, 57, 186, 239, + 25, 187, 229, 159, 215, 237, 149, 219, 74, 32, 164, 58, 216, 30, 220, 20, + 108, 104, 86, 159, 111, 202, 190, 209, 151, 117, 5, 252, 196, 164, 97, 153, + 109, 250, 213, 134, 218, 56, 7, 246, 75, 17, 41, 241, 39, 180, 99, 215, + 138, 171, 221, 142, 12, 136, 81, 37, 136, 241, 182, 155, 186, 197, 57, 130, + 68, 0, 225, 123, 106, 203, 176, 89, 219, 173, 105, 199, 78, 13, 105, 47, + 251, 155, 16, 69, 107, 88, 45, 164, 242, 77, 80, 110, 108, 50, 150, 0, + 193, 220, 23, 225, 121, 144, 24, 14, 74, 225, 247, 233, 177, 120, 70, 125, + 207, 78, 247, 52, 18, 174, 21, 195, 74, 157, 114, 193, 191, 204, 218, 213, + 86, 47, 222, 51, 133, 56, 217, 82, 75, 16, 241, 42, 110, 78, 221, 209, + 96, 5, 83, 93, 211, 42, 149, 74, 206, 175, 209, 255, 32, 250, 105, 145, + 185, 15, 200, 227, 39, 67, 228, 60, 128, 2, 41, 172, 198, 70, 102, 52, + 134, 34, 19, 131, 235, 17, 102, 130, 238, 87, 222, 104, 152, 112, 59, 217, + 136, 61, 203, 233, 185, 129, 93, 129, 123, 206, 125, 236, 185, 140, 198, 51, + 7, 132, 203, 181, 136, 18, 73, 76, 130, 73, 36, 135, 1, 53, 199, 66, + 4, 86, 235, 252, 164, 128, 136, 215, 215, 95, 5, 254, 228, 198, 58, 149, + 245, 25, 255, 134, 162, 123, 95, 81, 90, 224, 207, 26, 227, 125, 83, 124, + 83, 240, 95, 22, 118, 3, 163, 130, 255, 170, 160, 206, 149, 137, 156, 43, + 147, 203, 55, 56, 87, 38, 190, 132, 226, 198, 48, 241, 221, 143, 18, 250, + 209, 119, 221, 151, 215, 31, 9, 165, 120, 83, 156, 220, 80, 212, 203, 235, + 9, 127, 124, 188, 209, 39, 144, 180, 176, 236, 210, 239, 199, 2, 240, 245, + 246, 120, 178, 206, 191, 186, 142, 40, 131, 159, 52, 59, 210, 205, 150, 164, + 147, 130, 31, 9, 206, 241, 51, 144, 246, 241, 224, 83, 55, 255, 210, 127, + 165, 3, 113, 3, 7, 2, 5, 85, 139, 155, 3, 237, 133, 197, 12, 183, + 212, 112, 127, 70, 85, 40, 61, 207, 237, 145, 209, 86, 149, 160, 65, 57, + 231, 67, 197, 162, 62, 126, 234, 102, 218, 144, 210, 36, 29, 138, 54, 202, + 102, 242, 245, 111, 228, 75, 191, 78, 42, 253, 61, 102, 71, 50, 105, 72, + 236, 17, 136, 110, 81, 238, 109, 107, 48, 152, 61, 137, 116, 196, 230, 71, + 68, 183, 0, 7, 227, 97, 83, 83, 255, 41, 19, 85, 156, 233, 111, 137, + 81, 143, 101, 127, 78, 211, 132, 61, 175, 232, 2, 16, 180, 250, 207, 170, + 45, 228, 52, 109, 18, 234, 117, 202, 175, 61, 68, 81, 203, 97, 37, 168, + 151, 23, 197, 160, 18, 178, 101, 187, 114, 80, 137, 244, 183, 3, 186, 101, + 119, 112, 75, 99, 235, 122, 240, 34, 12, 49, 176, 18, 98, 224, 250, 84, + 94, 162, 90, 221, 9, 181, 5, 168, 5, 75, 185, 91, 6, 161, 88, 218, + 16, 134, 69, 97, 226, 39, 184, 113, 149, 91, 220, 168, 179, 130, 240, 180, + 163, 132, 174, 225, 237, 66, 189, 173, 104, 119, 194, 50, 8, 220, 152, 204, + 122, 173, 73, 183, 121, 215, 37, 168, 179, 97, 187, 24, 167, 32, 119, 212, + 56, 187, 144, 128, 226, 34, 168, 16, 154, 67, 34, 151, 166, 20, 87, 70, + 184, 105, 207, 235, 251, 18, 216, 2, 9, 25, 197, 97, 163, 195, 44, 119, + 168, 172, 251, 43, 17, 80, 96, 40, 236, 215, 35, 10, 46, 206, 96, 153, + 100, 231, 183, 32, 153, 170, 172, 73, 22, 168, 30, 47, 105, 21, 154, 178, + 34, 99, 138, 36, 212, 162, 144, 234, 53, 83, 162, 64, 182, 211, 207, 188, + 157, 156, 37, 219, 144, 165, 163, 235, 19, 107, 225, 176, 22, 25, 107, 22, + 86, 28, 56, 48, 59, 243, 55, 167, 165, 184, 216, 191, 174, 223, 108, 69, + 163, 11, 250, 12, 27, 75, 247, 14, 202, 12, 90, 151, 193, 168, 50, 176, + 130, 48, 118, 22, 109, 231, 200, 216, 117, 80, 60, 56, 72, 124, 199, 149, + 154, 19, 184, 30, 12, 37, 186, 21, 214, 22, 220, 120, 108, 120, 28, 42, + 93, 84, 42, 20, 247, 102, 172, 68, 88, 169, 186, 179, 25, 191, 156, 185, + 119, 244, 11, 61, 68, 136, 229, 5, 13, 239, 55, 80, 213, 74, 4, 222, + 63, 1, 48, 86, 220, 235, 248, 134, 77, 204, 66, 205, 139, 237, 130, 84, + 192, 253, 66, 70, 88, 242, 236, 183, 216, 15, 50, 40, 70, 203, 162, 183, + 52, 186, 131, 191, 66, 119, 176, 2, 22, 188, 80, 189, 168, 73, 186, 107, + 215, 194, 200, 222, 212, 192, 141, 45, 13, 174, 107, 55, 226, 147, 11, 67, + 62, 186, 197, 200, 169, 169, 211, 30, 89, 10, 162, 228, 159, 247, 70, 183, + 160, 220, 20, 44, 94, 85, 116, 227, 228, 101, 156, 64, 177, 130, 203, 22, + 177, 183, 142, 164, 74, 79, 131, 221, 56, 131, 164, 85, 5, 61, 75, 89, + 1, 118, 19, 157, 68, 23, 58, 141, 179, 201, 180, 63, 239, 206, 148, 30, + 158, 56, 32, 178, 244, 3, 105, 53, 177, 34, 166, 26, 78, 249, 17, 109, + 205, 13, 22, 236, 243, 34, 75, 151, 250, 189, 194, 9, 141, 129, 99, 171, + 13, 138, 216, 42, 212, 208, 125, 81, 18, 143, 235, 129, 168, 136, 251, 222, + 111, 69, 200, 115, 216, 58, 138, 97, 68, 27, 11, 38, 184, 176, 223, 152, + 163, 87, 175, 65, 180, 88, 139, 172, 59, 119, 19, 80, 41, 203, 244, 179, + 101, 219, 134, 244, 66, 55, 68, 96, 40, 120, 205, 185, 120, 16, 74, 2, + 119, 67, 80, 195, 171, 99, 6, 42, 98, 48, 171, 242, 152, 33, 174, 61, + 153, 223, 199, 13, 114, 109, 204, 222, 80, 59, 195, 57, 156, 229, 111, 182, + 187, 171, 254, 172, 121, 55, 43, 184, 252, 211, 72, 177, 231, 149, 15, 128, + 13, 236, 255, 131, 66, 139, 240, 79, 91, 2, 22, 189, 130, 242, 241, 123, + 183, 132, 12, 250, 146, 201, 183, 172, 193, 164, 46, 59, 55, 174, 20, 203, + 91, 74, 74, 206, 229, 20, 141, 203, 8, 111, 239, 88, 37, 131, 0, 15, + 132, 59, 148, 136, 109, 0, 165, 130, 252, 102, 129, 165, 124, 161, 126, 78, + 25, 92, 180, 174, 107, 98, 87, 77, 237, 147, 13, 101, 89, 24, 115, 12, + 188, 150, 7, 146, 4, 102, 102, 97, 74, 79, 228, 79, 92, 249, 138, 149, + 98, 104, 153, 213, 134, 74, 216, 64, 145, 37, 81, 206, 98, 153, 171, 68, + 149, 162, 28, 138, 241, 40, 26, 27, 239, 82, 212, 227, 181, 118, 197, 159, + 163, 237, 101, 31, 206, 65, 17, 77, 232, 25, 45, 193, 179, 160, 180, 73, + 130, 160, 48, 42, 175, 172, 11, 113, 121, 99, 148, 48, 216, 128, 19, 36, + 145, 251, 226, 124, 139, 199, 173, 5, 94, 23, 43, 250, 66, 62, 232, 11, + 28, 17, 236, 200, 226, 82, 150, 233, 0, 204, 85, 69, 98, 193, 29, 41, + 3, 215, 185, 3, 133, 188, 53, 112, 57, 185, 70, 119, 14, 178, 40, 85, + 89, 13, 26, 45, 97, 41, 170, 74, 20, 79, 17, 220, 68, 138, 18, 179, + 14, 255, 54, 76, 233, 111, 169, 38, 63, 202, 115, 251, 255, 133, 173, 77, + 194, 73, 112, 245, 1, 132, 5, 206, 32, 120, 67, 236, 94, 243, 14, 163, + 211, 236, 172, 234, 227, 111, 255, 156, 212, 131, 249, 179, 12, 166, 35, 134, + 186, 161, 158, 254, 121, 60, 30, 210, 239, 170, 221, 72, 43, 19, 187, 107, + 132, 244, 56, 164, 199, 33, 56, 161, 160, 67, 95, 209, 26, 113, 76, 108, + 189, 46, 211, 73, 229, 173, 218, 132, 235, 180, 5, 86, 194, 50, 116, 81, + 46, 57, 111, 153, 186, 56, 207, 159, 177, 101, 198, 114, 206, 147, 122, 115, + 133, 194, 73, 158, 176, 168, 152, 16, 162, 32, 226, 56, 138, 66, 75, 40, + 230, 194, 253, 186, 33, 228, 105, 166, 14, 230, 243, 111, 139, 130, 225, 151, + 27, 95, 23, 10, 165, 198, 215, 168, 165, 160, 187, 192, 102, 68, 131, 208, + 225, 220, 252, 33, 170, 23, 180, 183, 18, 42, 48, 203, 88, 63, 6, 134, + 99, 6, 168, 241, 83, 1, 176, 134, 191, 12, 177, 21, 233, 18, 0, 238, + 105, 123, 88, 113, 5, 68, 84, 75, 111, 196, 115, 247, 111, 139, 209, 104, + 237, 254, 99, 212, 45, 255, 189, 63, 234, 78, 245, 181, 133, 160, 8, 100, + 50, 166, 205, 89, 191, 59, 157, 244, 71, 179, 15, 253, 102, 27, 172, 232, + 185, 229, 234, 243, 47, 211, 214, 18, 238, 59, 76, 18, 87, 146, 36, 251, + 220, 115, 79, 163, 231, 62, 254, 112, 174, 229, 218, 121, 240, 123, 6, 124, + 215, 252, 193, 144, 129, 151, 39, 241, 251, 1, 13, 124, 30, 76, 164, 213, + 201, 15, 133, 163, 184, 80, 204, 11, 71, 137, 63, 8, 146, 189, 160, 201, + 63, 31, 92, 214, 95, 168, 34, 32, 117, 88, 56, 15, 40, 151, 4, 132, + 52, 61, 135, 219, 236, 252, 7, 91, 113, 120, 252, 230, 211, 62, 47, 160, + 7, 71, 80, 39, 178, 199, 208, 24, 206, 20, 177, 167, 171, 213, 213, 250, + 69, 112, 190, 190, 140, 94, 132, 231, 43, 186, 115, 255, 202, 26, 177, 5, + 255, 215, 60, 203, 205, 193, 57, 239, 29, 237, 8, 120, 59, 163, 32, 66, + 97, 74, 107, 176, 154, 14, 12, 145, 174, 209, 249, 227, 170, 217, 25, 131, + 1, 46, 132, 179, 73, 183, 219, 177, 186, 174, 220, 199, 208, 125, 203, 181, + 226, 9, 227, 251, 212, 37, 148, 255, 238, 174, 219, 78, 173, 35, 66, 92, + 161, 187, 171, 79, 206, 48, 112, 75, 44, 165, 213, 156, 208, 115, 54, 30, + 209, 113, 192, 87, 132, 77, 92, 50, 230, 3, 216, 36, 13, 13, 239, 103, + 247, 142, 54, 194, 231, 23, 249, 183, 141, 246, 98, 46, 55, 248, 21, 26, + 236, 175, 203, 61, 218, 243, 39, 108, 196, 0, 46, 165, 46, 250, 60, 143, + 111, 11, 52, 171, 57, 87, 20, 41, 96, 196, 68, 204, 31, 82, 41, 64, + 255, 94, 23, 94, 44, 242, 215, 22, 219, 229, 166, 112, 254, 58, 39, 42, + 167, 32, 6, 19, 208, 11, 42, 245, 35, 183, 251, 113, 209, 26, 16, 208, + 214, 86, 20, 105, 244, 119, 199, 195, 249, 159, 208, 173, 102, 179, 215, 29, + 76, 154, 132, 82, 208, 244, 222, 47, 250, 205, 187, 254, 96, 142, 53, 54, + 94, 176, 155, 28, 203, 73, 77, 32, 158, 105, 66, 225, 152, 68, 206, 96, + 220, 110, 13, 8, 207, 109, 78, 90, 243, 94, 115, 218, 222, 138, 102, 128, + 215, 252, 36, 22, 87, 42, 56, 174, 89, 220, 121, 70, 133, 118, 243, 215, + 199, 155, 19, 143, 51, 109, 143, 111, 10, 238, 208, 149, 15, 55, 163, 86, + 143, 253, 1, 24, 122, 152, 224, 111, 11, 168, 86, 213, 248, 122, 141, 242, + 148, 32, 0, 189, 16, 6, 160, 219, 144, 59, 145, 70, 20, 185, 242, 220, + 86, 11, 67, 8, 62, 203, 169, 11, 156, 187, 145, 248, 171, 185, 242, 37, + 98, 11, 215, 8, 120, 163, 187, 204, 103, 66, 216, 174, 151, 229, 51, 127, + 89, 166, 235, 159, 203, 28, 163, 185, 24, 116, 226, 14, 141, 22, 195, 188, + 71, 161, 218, 149, 54, 189, 94, 154, 142, 211, 236, 140, 97, 91, 16, 101, + 105, 134, 34, 163, 118, 226, 72, 202, 209, 58, 172, 249, 205, 113, 111, 62, + 159, 204, 206, 79, 78, 208, 218, 74, 119, 113, 146, 53, 132, 199, 116, 69, + 40, 192, 104, 143, 219, 204, 28, 42, 237, 159, 74, 219, 208, 64, 74, 130, + 230, 253, 225, 253, 231, 115, 107, 118, 50, 242, 218, 142, 173, 242, 152, 29, + 73, 12, 31, 212, 219, 227, 2, 47, 7, 45, 53, 182, 236, 209, 250, 88, + 208, 69, 202, 75, 130, 250, 157, 121, 239, 197, 245, 110, 136, 111, 5, 244, + 186, 216, 45, 55, 231, 215, 202, 187, 206, 205, 86, 10, 109, 77, 233, 130, + 220, 29, 48, 9, 125, 208, 154, 80, 209, 173, 201, 152, 134, 49, 204, 249, + 94, 204, 215, 49, 72, 224, 190, 167, 39, 96, 22, 196, 233, 173, 182, 80, + 106, 246, 124, 234, 38, 250, 199, 192, 46, 134, 240, 29, 69, 183, 251, 87, + 156, 150, 5, 150, 217, 67, 19, 183, 155, 150, 10, 15, 222, 176, 59, 189, + 239, 74, 36, 99, 243, 236, 72, 235, 154, 142, 81, 250, 237, 220, 228, 182, + 86, 94, 182, 69, 255, 80, 94, 86, 255, 110, 13, 38, 189, 86, 42, 159, + 230, 168, 62, 148, 85, 51, 56, 225, 146, 208, 206, 75, 215, 229, 7, 243, + 81, 60, 250, 171, 242, 192, 181, 98, 170, 159, 187, 234, 110, 26, 49, 167, + 187, 232, 94, 251, 182, 220, 254, 116, 20, 66, 182, 168, 36, 29, 76, 1, + 44, 62, 148, 67, 53, 121, 143, 102, 4, 9, 9, 7, 99, 55, 243, 5, + 205, 174, 165, 0, 245, 70, 97, 148, 135, 190, 233, 153, 131, 84, 187, 209, + 0, 74, 55, 91, 13, 241, 110, 179, 217, 175, 86, 170, 5, 8, 217, 186, + 15, 119, 231, 145, 102, 19, 82, 13, 189, 30, 213, 118, 116, 226, 119, 55, + 59, 153, 225, 167, 182, 252, 119, 14, 117, 186, 205, 123, 227, 141, 78, 60, + 169, 193, 178, 172, 254, 213, 198, 62, 56, 252, 79, 110, 244, 222, 104, 43, + 57, 32, 108, 126, 232, 173, 235, 175, 40, 199, 150, 83, 119, 250, 100, 111, + 8, 197, 72, 97, 155, 101, 250, 164, 64, 101, 172, 224, 185, 183, 125, 42, + 233, 253, 170, 26, 113, 40, 109, 122, 131, 82, 59, 15, 37, 76, 118, 36, + 219, 254, 87, 165, 94, 178, 175, 81, 112, 108, 175, 143, 49, 57, 1, 124, + 18, 30, 83, 186, 227, 148, 119, 162, 170, 232, 57, 4, 13, 165, 3, 5, + 215, 137, 52, 186, 116, 160, 19, 188, 221, 10, 77, 174, 167, 229, 105, 2, + 199, 38, 60, 12, 140, 13, 143, 79, 142, 154, 176, 12, 144, 17, 222, 100, + 246, 250, 96, 226, 189, 110, 31, 76, 153, 244, 155, 16, 145, 22, 27, 101, + 102, 197, 77, 187, 189, 198, 0, 160, 183, 89, 188, 115, 49, 14, 76, 72, + 117, 180, 188, 29, 154, 38, 70, 255, 2, 231, 118, 0, 20, 132, 23, 139, + 159, 178, 117, 165, 199, 84, 57, 254, 181, 214, 195, 20, 181, 5, 73, 117, + 123, 237, 148, 19, 235, 127, 231, 156, 217, 124, 10, 102, 81, 110, 115, 188, + 25, 109, 143, 183, 185, 27, 45, 22, 55, 147, 24, 220, 206, 243, 244, 10, + 113, 136, 238, 29, 146, 30, 195, 151, 121, 57, 36, 68, 229, 194, 249, 208, + 157, 74, 80, 152, 63, 78, 114, 74, 40, 231, 164, 215, 130, 205, 107, 67, + 243, 77, 145, 62, 191, 81, 177, 133, 20, 175, 237, 77, 62, 40, 248, 211, + 46, 36, 197, 192, 182, 2, 83, 237, 174, 79, 11, 159, 178, 248, 82, 222, + 228, 170, 17, 188, 200, 59, 31, 75, 13, 212, 69, 121, 237, 36, 199, 5, + 255, 216, 255, 88, 16, 249, 189, 41, 82, 78, 207, 17, 113, 141, 30, 209, + 178, 128, 107, 163, 194, 241, 11, 249, 58, 103, 81, 51, 36, 70, 66, 230, + 190, 81, 205, 62, 146, 131, 87, 135, 226, 111, 124, 136, 245, 65, 222, 15, + 95, 133, 243, 252, 254, 56, 184, 38, 35, 197, 89, 189, 18, 102, 92, 238, + 127, 171, 51, 105, 50, 232, 207, 147, 147, 122, 87, 174, 60, 50, 34, 226, + 145, 22, 248, 142, 46, 97, 216, 134, 37, 193, 107, 20, 203, 84, 34, 198, + 57, 115, 144, 40, 31, 181, 70, 64, 59, 171, 252, 146, 115, 8, 200, 236, + 85, 65, 24, 16, 208, 236, 28, 124, 54, 13, 199, 159, 224, 59, 176, 177, + 121, 70, 56, 90, 107, 148, 247, 98, 133, 161, 233, 111, 88, 168, 163, 133, + 184, 2, 236, 89, 55, 54, 94, 146, 231, 5, 240, 240, 107, 66, 63, 188, + 42, 139, 156, 209, 114, 59, 191, 174, 1, 195, 39, 172, 101, 178, 244, 39, + 61, 13, 249, 18, 156, 104, 187, 7, 84, 65, 209, 36, 156, 170, 219, 129, + 50, 243, 128, 208, 154, 201, 96, 221, 4, 49, 114, 188, 152, 187, 233, 166, + 219, 136, 146, 74, 161, 49, 68, 130, 37, 20, 9, 247, 213, 42, 39, 170, + 85, 239, 58, 143, 16, 84, 17, 193, 194, 240, 102, 64, 160, 114, 43, 14, + 172, 84, 67, 66, 227, 20, 206, 51, 129, 2, 156, 158, 121, 145, 251, 65, + 52, 163, 29, 230, 165, 179, 240, 47, 237, 212, 165, 239, 77, 122, 108, 151, + 98, 74, 120, 48, 147, 205, 191, 130, 172, 35, 142, 126, 250, 232, 209, 71, + 143, 62, 18, 97, 63, 139, 37, 100, 15, 175, 146, 30, 244, 56, 8, 79, + 91, 150, 228, 72, 25, 205, 137, 88, 134, 131, 229, 130, 232, 53, 118, 66, + 99, 152, 244, 120, 125, 213, 224, 92, 47, 242, 156, 138, 214, 37, 39, 17, + 227, 82, 150, 9, 83, 247, 87, 96, 71, 4, 106, 108, 123, 32, 74, 88, + 35, 98, 209, 12, 93, 124, 213, 209, 133, 83, 241, 43, 41, 126, 37, 197, + 71, 170, 248, 234, 151, 22, 15, 235, 37, 38, 158, 219, 155, 196, 213, 147, + 56, 174, 42, 137, 57, 181, 115, 109, 56, 91, 217, 120, 242, 162, 248, 179, + 36, 158, 99, 233, 118, 104, 197, 62, 151, 179, 15, 185, 104, 10, 133, 4, + 197, 95, 87, 141, 30, 5, 40, 217, 34, 205, 39, 59, 146, 102, 165, 102, + 139, 217, 119, 12, 180, 197, 41, 98, 175, 204, 105, 182, 251, 137, 96, 165, + 71, 59, 5, 230, 121, 8, 76, 229, 171, 84, 229, 171, 253, 202, 101, 234, + 181, 119, 68, 107, 169, 72, 213, 155, 37, 215, 186, 218, 102, 38, 105, 41, + 122, 183, 169, 56, 204, 90, 28, 199, 110, 198, 148, 30, 39, 158, 95, 236, + 137, 92, 141, 117, 176, 243, 240, 156, 134, 81, 170, 170, 203, 63, 190, 42, + 229, 140, 213, 233, 244, 167, 226, 196, 172, 207, 238, 104, 196, 17, 67, 205, + 63, 245, 159, 251, 33, 149, 19, 21, 144, 2, 202, 150, 236, 132, 33, 208, + 51, 153, 76, 106, 80, 57, 173, 193, 101, 98, 32, 255, 243, 101, 232, 145, + 180, 42, 233, 223, 148, 37, 255, 4, 8, 58, 154, 161, 49, 105, 164, 118, + 237, 197, 245, 164, 116, 93, 14, 65, 67, 186, 241, 233, 53, 121, 195, 75, + 120, 3, 16, 41, 46, 6, 220, 88, 51, 54, 152, 219, 9, 26, 67, 118, + 140, 229, 228, 49, 120, 180, 90, 83, 171, 174, 244, 15, 168, 211, 16, 22, + 244, 192, 71, 126, 213, 175, 251, 103, 172, 142, 102, 141, 124, 36, 35, 47, + 237, 146, 49, 85, 43, 250, 224, 200, 31, 78, 187, 51, 242, 209, 179, 198, + 243, 196, 161, 247, 211, 38, 1, 60, 98, 30, 5, 8, 157, 235, 55, 186, + 9, 255, 91, 39, 33, 169, 213, 84, 250, 135, 212, 41, 147, 0, 154, 78, + 224, 150, 96, 80, 234, 229, 221, 188, 59, 205, 201, 173, 94, 121, 39, 16, + 255, 154, 175, 160, 112, 218, 77, 199, 56, 112, 118, 13, 141, 0, 55, 112, + 63, 43, 65, 0, 25, 33, 95, 164, 182, 62, 51, 144, 9, 83, 129, 246, + 148, 67, 215, 252, 20, 83, 30, 21, 8, 147, 22, 161, 50, 214, 51, 213, + 59, 58, 118, 141, 187, 13, 54, 47, 165, 221, 60, 165, 156, 140, 154, 3, + 118, 83, 54, 90, 24, 109, 145, 202, 198, 56, 230, 174, 150, 165, 72, 35, + 142, 237, 72, 135, 175, 115, 87, 61, 132, 131, 52, 149, 243, 104, 169, 229, + 252, 118, 228, 183, 67, 250, 247, 167, 63, 181, 35, 24, 79, 17, 192, 81, + 38, 132, 68, 49, 42, 1, 57, 42, 90, 220, 179, 28, 103, 85, 118, 73, + 71, 117, 121, 89, 142, 83, 21, 18, 150, 21, 134, 47, 242, 170, 222, 75, + 58, 192, 203, 189, 114, 76, 7, 158, 213, 146, 194, 83, 154, 18, 211, 105, + 116, 141, 26, 226, 242, 210, 55, 16, 139, 119, 203, 139, 232, 188, 199, 17, + 189, 155, 237, 30, 148, 83, 108, 75, 193, 220, 23, 195, 29, 84, 72, 145, + 119, 8, 71, 180, 240, 58, 141, 4, 134, 13, 96, 128, 113, 99, 155, 75, + 56, 138, 81, 35, 142, 140, 202, 32, 97, 135, 145, 32, 142, 202, 251, 13, + 83, 93, 65, 116, 3, 78, 227, 16, 170, 218, 248, 189, 116, 43, 111, 99, + 84, 141, 222, 105, 76, 200, 215, 88, 16, 94, 160, 116, 84, 13, 130, 45, + 45, 43, 170, 103, 169, 116, 44, 124, 143, 62, 10, 229, 179, 173, 106, 144, + 160, 85, 20, 198, 210, 130, 130, 106, 137, 243, 100, 132, 177, 143, 156, 232, + 140, 73, 130, 225, 5, 29, 124, 239, 229, 25, 92, 132, 5, 200, 152, 48, + 98, 133, 16, 150, 32, 169, 93, 168, 16, 54, 155, 25, 84, 234, 53, 203, + 131, 113, 165, 2, 39, 113, 90, 244, 80, 237, 43, 108, 43, 144, 214, 152, + 185, 165, 173, 7, 246, 247, 60, 229, 222, 181, 197, 137, 174, 24, 158, 142, + 2, 219, 92, 165, 146, 8, 194, 149, 108, 233, 39, 93, 92, 82, 31, 11, + 34, 91, 194, 165, 84, 83, 103, 184, 99, 8, 147, 142, 38, 76, 234, 214, + 196, 170, 53, 213, 67, 173, 17, 45, 123, 183, 237, 228, 143, 145, 250, 152, + 165, 16, 8, 209, 109, 108, 114, 172, 1, 4, 183, 157, 141, 198, 113, 177, + 88, 116, 143, 115, 134, 48, 235, 73, 34, 56, 18, 205, 25, 101, 33, 57, + 114, 99, 152, 162, 227, 203, 105, 193, 255, 81, 75, 56, 182, 105, 107, 80, + 176, 219, 190, 92, 66, 100, 176, 77, 111, 200, 209, 222, 205, 209, 104, 252, + 248, 130, 157, 88, 231, 89, 126, 241, 114, 249, 130, 179, 7, 118, 78, 44, + 9, 173, 156, 228, 183, 203, 145, 42, 163, 166, 138, 40, 92, 210, 221, 43, + 93, 70, 251, 92, 211, 13, 86, 110, 9, 20, 103, 111, 85, 10, 5, 19, + 114, 63, 51, 215, 148, 34, 102, 61, 225, 159, 98, 122, 92, 237, 205, 134, + 125, 106, 84, 216, 16, 118, 160, 8, 228, 169, 139, 200, 229, 13, 247, 111, + 121, 197, 147, 196, 195, 161, 128, 65, 192, 128, 2, 161, 185, 114, 168, 47, + 173, 237, 0, 48, 162, 29, 156, 68, 214, 184, 180, 209, 187, 171, 6, 197, + 249, 110, 185, 252, 59, 58, 72, 57, 95, 60, 181, 52, 85, 86, 248, 80, + 89, 237, 224, 28, 20, 253, 67, 35, 37, 36, 246, 4, 200, 16, 214, 186, + 191, 4, 91, 236, 64, 124, 205, 247, 148, 52, 142, 191, 123, 139, 17, 130, + 4, 19, 78, 24, 58, 141, 198, 251, 160, 169, 152, 203, 0, 92, 57, 44, + 237, 220, 155, 177, 171, 3, 90, 159, 168, 5, 56, 215, 115, 180, 160, 156, + 140, 155, 156, 226, 188, 100, 21, 243, 189, 250, 82, 57, 76, 9, 203, 214, + 116, 212, 31, 221, 63, 92, 130, 206, 172, 18, 159, 35, 183, 143, 86, 251, + 145, 148, 146, 190, 56, 62, 88, 6, 39, 181, 75, 8, 56, 181, 136, 115, + 104, 190, 7, 19, 228, 12, 243, 226, 210, 11, 51, 106, 201, 177, 53, 108, + 97, 68, 184, 211, 61, 93, 109, 93, 84, 145, 128, 124, 78, 204, 245, 211, + 5, 63, 183, 205, 21, 181, 149, 108, 214, 227, 116, 153, 3, 176, 28, 79, + 63, 84, 222, 141, 222, 141, 114, 185, 93, 70, 74, 103, 188, 28, 13, 198, + 173, 78, 101, 214, 155, 15, 7, 57, 103, 225, 42, 95, 221, 11, 151, 69, + 211, 209, 48, 141, 60, 36, 228, 162, 61, 18, 233, 48, 131, 64, 234, 28, + 32, 144, 62, 76, 110, 215, 216, 149, 183, 49, 213, 74, 200, 59, 23, 1, + 91, 231, 179, 171, 144, 36, 144, 82, 133, 72, 141, 167, 69, 238, 85, 47, + 66, 55, 213, 7, 141, 150, 39, 242, 55, 226, 219, 218, 4, 20, 124, 33, + 215, 143, 134, 5, 107, 87, 220, 173, 154, 179, 197, 100, 50, 158, 206, 155, + 11, 69, 65, 245, 158, 93, 5, 230, 200, 204, 90, 136, 142, 102, 185, 105, + 138, 49, 115, 137, 230, 195, 201, 150, 5, 114, 168, 92, 22, 160, 156, 85, + 38, 163, 123, 103, 212, 237, 118, 154, 194, 198, 34, 168, 243, 79, 232, 19, + 209, 107, 30, 124, 246, 239, 244, 71, 72, 31, 127, 209, 31, 192, 59, 216, + 162, 152, 182, 62, 222, 112, 255, 89, 140, 235, 53, 183, 228, 126, 87, 140, + 161, 172, 246, 151, 11, 39, 41, 199, 63, 206, 109, 78, 60, 221, 154, 45, + 157, 12, 118, 193, 25, 177, 78, 82, 83, 86, 94, 174, 154, 57, 117, 89, + 245, 166, 26, 86, 78, 18, 95, 53, 194, 154, 130, 221, 86, 135, 221, 190, + 187, 187, 14, 251, 195, 251, 19, 51, 64, 77, 96, 150, 179, 121, 19, 172, + 170, 30, 15, 151, 59, 86, 124, 66, 52, 72, 22, 104, 223, 10, 160, 9, + 145, 3, 243, 239, 156, 209, 53, 37, 65, 58, 40, 217, 12, 147, 233, 248, + 215, 110, 123, 126, 174, 144, 99, 150, 1, 96, 113, 77, 22, 206, 141, 2, + 109, 72, 207, 77, 140, 59, 19, 238, 24, 56, 132, 241, 182, 4, 24, 42, + 156, 4, 34, 203, 194, 91, 131, 1, 166, 228, 139, 177, 79, 197, 114, 110, + 237, 194, 84, 26, 132, 229, 21, 161, 132, 66, 100, 233, 93, 17, 18, 184, + 175, 68, 206, 199, 212, 175, 202, 43, 3, 16, 72, 159, 146, 221, 148, 57, + 150, 157, 17, 8, 236, 61, 171, 241, 10, 212, 187, 183, 9, 155, 153, 52, + 178, 45, 90, 169, 96, 107, 182, 7, 139, 185, 123, 55, 30, 131, 215, 185, + 195, 245, 108, 234, 65, 155, 53, 239, 167, 173, 254, 8, 235, 180, 137, 213, + 222, 31, 46, 216, 209, 8, 135, 110, 157, 230, 98, 58, 80, 41, 246, 96, + 6, 85, 132, 98, 134, 88, 251, 179, 238, 124, 230, 224, 229, 174, 191, 82, + 233, 249, 217, 116, 154, 221, 213, 92, 133, 48, 147, 213, 174, 154, 165, 3, + 8, 146, 125, 208, 213, 115, 64, 19, 33, 51, 85, 119, 146, 36, 179, 126, + 19, 157, 212, 158, 228, 144, 186, 147, 239, 189, 250, 161, 144, 203, 204, 237, + 114, 83, 189, 171, 90, 85, 68, 198, 242, 52, 213, 168, 36, 242, 163, 186, + 169, 194, 176, 177, 173, 90, 32, 15, 56, 107, 200, 230, 199, 171, 84, 33, + 161, 15, 213, 32, 41, 164, 100, 121, 87, 29, 24, 193, 10, 221, 155, 198, + 70, 41, 202, 239, 76, 165, 239, 101, 141, 112, 58, 116, 124, 63, 78, 5, + 72, 195, 65, 236, 157, 142, 239, 167, 176, 219, 160, 24, 4, 123, 75, 139, + 150, 149, 170, 37, 60, 156, 194, 170, 245, 161, 84, 220, 138, 7, 18, 72, + 171, 30, 76, 194, 227, 130, 20, 166, 225, 144, 227, 207, 78, 158, 156, 88, + 50, 112, 27, 107, 0, 96, 165, 197, 6, 218, 122, 14, 40, 60, 37, 250, + 176, 147, 103, 91, 161, 16, 204, 15, 189, 139, 160, 229, 95, 84, 173, 48, + 97, 171, 225, 18, 147, 46, 20, 13, 217, 150, 238, 80, 71, 67, 187, 69, + 120, 193, 54, 1, 180, 16, 247, 192, 25, 66, 69, 99, 161, 80, 209, 9, + 20, 118, 199, 238, 129, 108, 201, 38, 55, 18, 19, 102, 76, 54, 52, 40, + 69, 175, 57, 58, 241, 154, 111, 104, 133, 143, 74, 108, 103, 66, 206, 183, + 187, 105, 159, 210, 155, 195, 205, 157, 2, 100, 54, 54, 203, 19, 22, 213, + 3, 97, 146, 3, 66, 49, 239, 235, 210, 101, 175, 53, 157, 159, 5, 171, + 211, 216, 157, 181, 91, 131, 110, 188, 114, 167, 110, 40, 230, 175, 148, 39, + 1, 27, 49, 44, 17, 44, 61, 13, 220, 18, 252, 59, 135, 161, 188, 40, + 199, 64, 108, 33, 76, 95, 92, 108, 217, 155, 170, 54, 66, 5, 43, 212, + 14, 48, 119, 190, 88, 114, 67, 154, 203, 222, 59, 99, 4, 209, 227, 32, + 241, 225, 41, 194, 147, 74, 118, 146, 175, 1, 48, 175, 15, 253, 2, 190, + 238, 88, 229, 87, 216, 220, 190, 182, 115, 5, 243, 93, 142, 104, 106, 84, + 42, 190, 242, 71, 99, 20, 54, 108, 188, 54, 172, 198, 254, 153, 216, 183, + 146, 99, 230, 27, 186, 232, 206, 9, 85, 196, 249, 242, 110, 228, 82, 178, + 129, 246, 89, 130, 79, 53, 178, 176, 70, 207, 190, 25, 79, 217, 44, 88, + 41, 177, 204, 85, 172, 164, 124, 40, 177, 126, 189, 24, 37, 132, 225, 131, + 184, 172, 173, 31, 196, 101, 54, 129, 160, 225, 190, 49, 57, 200, 212, 82, + 123, 66, 206, 157, 106, 224, 159, 198, 170, 137, 74, 111, 220, 141, 34, 152, + 195, 103, 237, 10, 49, 77, 230, 38, 148, 166, 83, 63, 62, 245, 171, 145, + 127, 26, 225, 41, 77, 180, 148, 95, 90, 238, 10, 107, 4, 208, 233, 3, + 115, 240, 135, 188, 74, 66, 184, 229, 155, 77, 92, 21, 110, 152, 217, 223, + 240, 55, 27, 230, 83, 201, 194, 36, 89, 115, 216, 234, 125, 234, 143, 30, + 74, 29, 89, 169, 151, 253, 193, 45, 97, 179, 59, 169, 221, 63, 185, 63, + 115, 132, 182, 254, 71, 25, 166, 227, 78, 199, 106, 196, 91, 124, 138, 209, + 63, 211, 116, 91, 24, 198, 116, 199, 43, 42, 74, 195, 14, 101, 99, 151, + 176, 193, 156, 29, 202, 214, 154, 78, 91, 235, 230, 93, 139, 165, 48, 208, + 226, 211, 63, 133, 174, 25, 170, 187, 62, 43, 47, 156, 94, 153, 48, 102, + 3, 88, 153, 68, 79, 209, 171, 249, 94, 221, 247, 206, 132, 223, 235, 150, + 189, 248, 200, 47, 123, 85, 185, 78, 237, 212, 147, 110, 246, 126, 81, 224, + 190, 233, 2, 79, 65, 30, 212, 137, 84, 11, 140, 56, 218, 169, 214, 220, + 175, 97, 74, 116, 155, 213, 192, 215, 48, 240, 186, 205, 73, 88, 172, 117, + 216, 158, 7, 73, 96, 85, 7, 134, 103, 86, 104, 77, 135, 70, 167, 198, + 85, 192, 41, 63, 171, 88, 41, 237, 241, 96, 49, 28, 65, 27, 6, 128, + 168, 236, 157, 110, 143, 84, 222, 42, 154, 163, 52, 101, 50, 226, 34, 247, + 179, 248, 205, 210, 81, 89, 137, 98, 74, 180, 241, 78, 79, 224, 180, 202, + 252, 74, 178, 221, 119, 69, 63, 213, 35, 31, 97, 228, 99, 61, 242, 169, + 145, 195, 0, 211, 208, 214, 119, 135, 52, 107, 70, 172, 44, 214, 156, 208, + 37, 251, 52, 73, 195, 28, 252, 244, 149, 169, 98, 20, 87, 105, 164, 1, + 188, 18, 7, 212, 134, 223, 47, 72, 225, 108, 171, 236, 111, 192, 142, 136, + 128, 141, 77, 72, 45, 223, 38, 62, 20, 25, 228, 15, 63, 65, 39, 75, + 3, 118, 174, 24, 214, 29, 51, 215, 25, 207, 92, 198, 250, 173, 101, 173, + 95, 221, 55, 107, 56, 246, 199, 97, 111, 0, 56, 102, 214, 238, 247, 9, + 62, 89, 146, 145, 65, 99, 235, 131, 78, 25, 54, 224, 253, 151, 94, 34, + 122, 217, 51, 195, 36, 48, 81, 113, 132, 239, 91, 195, 97, 11, 167, 216, + 123, 154, 122, 247, 214, 245, 206, 142, 140, 72, 166, 129, 71, 157, 126, 123, + 222, 128, 36, 140, 5, 125, 28, 9, 116, 131, 208, 134, 50, 73, 104, 20, + 87, 107, 245, 211, 179, 231, 86, 108, 172, 99, 91, 183, 237, 78, 247, 238, + 190, 215, 255, 245, 195, 96, 56, 26, 79, 62, 78, 103, 243, 197, 167, 229, + 106, 253, 217, 74, 93, 213, 169, 95, 190, 250, 250, 47, 127, 253, 219, 55, + 223, 190, 254, 63, 254, 207, 191, 127, 247, 230, 31, 223, 255, 175, 183, 63, + 252, 248, 95, 63, 253, 252, 203, 63, 255, 47, 43, 117, 77, 167, 126, 246, + 46, 168, 70, 95, 121, 71, 127, 162, 223, 211, 124, 161, 88, 242, 203, 149, + 147, 164, 57, 231, 23, 151, 141, 171, 23, 127, 62, 92, 230, 187, 48, 142, + 223, 189, 163, 103, 237, 125, 243, 93, 88, 13, 50, 219, 154, 203, 113, 107, + 223, 133, 167, 241, 111, 244, 168, 254, 223, 86, 75, 234, 186, 37, 239, 194, + 58, 197, 189, 139, 130, 119, 145, 61, 70, 167, 38, 158, 174, 53, 244, 23, + 210, 95, 68, 127, 49, 253, 85, 233, 175, 70, 127, 117, 250, 163, 156, 33, + 178, 82, 124, 72, 241, 33, 197, 135, 20, 31, 82, 60, 21, 28, 161, 100, + 20, 29, 81, 124, 68, 241, 17, 197, 71, 20, 31, 81, 124, 68, 241, 17, + 197, 199, 20, 31, 135, 57, 13, 55, 234, 0, 9, 163, 238, 61, 192, 137, + 10, 42, 199, 110, 137, 48, 223, 136, 23, 147, 235, 161, 101, 178, 204, 142, + 176, 206, 114, 94, 57, 202, 157, 208, 51, 84, 71, 194, 225, 180, 162, 6, + 212, 0, 207, 95, 85, 21, 128, 35, 171, 151, 146, 244, 158, 27, 128, 80, + 105, 195, 94, 164, 102, 143, 215, 177, 86, 132, 107, 155, 136, 241, 132, 92, + 240, 243, 171, 198, 169, 75, 48, 175, 63, 106, 141, 218, 93, 69, 43, 224, + 136, 163, 83, 247, 227, 162, 53, 154, 247, 63, 139, 227, 40, 70, 68, 41, + 212, 23, 230, 10, 88, 43, 240, 140, 12, 215, 161, 161, 220, 2, 167, 154, + 27, 138, 63, 169, 133, 80, 39, 9, 211, 189, 96, 181, 43, 64, 1, 116, + 191, 120, 29, 38, 104, 149, 0, 188, 20, 65, 67, 111, 73, 107, 11, 239, + 25, 254, 103, 93, 207, 30, 76, 40, 165, 54, 49, 237, 112, 108, 48, 240, + 23, 202, 207, 129, 140, 208, 229, 18, 127, 44, 92, 228, 123, 189, 44, 202, + 96, 170, 110, 194, 88, 103, 51, 241, 254, 114, 238, 168, 11, 178, 107, 5, + 18, 52, 40, 135, 213, 109, 58, 233, 14, 201, 45, 45, 208, 146, 75, 151, + 10, 98, 27, 33, 200, 49, 164, 112, 80, 74, 135, 229, 191, 77, 15, 235, + 208, 220, 245, 160, 238, 200, 63, 46, 199, 123, 87, 137, 42, 89, 124, 20, + 169, 137, 215, 78, 194, 48, 130, 184, 213, 139, 13, 125, 29, 202, 54, 56, + 149, 122, 227, 153, 249, 35, 68, 50, 234, 172, 117, 26, 47, 2, 79, 64, + 222, 87, 59, 226, 104, 116, 151, 96, 175, 43, 169, 69, 50, 253, 116, 29, + 194, 238, 204, 84, 196, 188, 4, 107, 15, 79, 60, 125, 138, 153, 15, 99, + 106, 205, 172, 37, 74, 94, 167, 234, 139, 108, 141, 55, 33, 92, 136, 19, + 75, 248, 245, 218, 120, 17, 204, 144, 240, 25, 169, 222, 28, 64, 107, 49, + 156, 112, 220, 191, 203, 183, 97, 159, 76, 132, 57, 42, 140, 12, 87, 124, + 177, 55, 29, 37, 254, 186, 216, 220, 148, 214, 106, 22, 205, 89, 25, 182, + 75, 229, 21, 87, 206, 32, 39, 145, 104, 184, 142, 104, 229, 70, 102, 229, + 82, 23, 3, 241, 193, 5, 196, 90, 189, 15, 23, 131, 121, 159, 224, 124, + 106, 169, 50, 214, 206, 243, 19, 208, 225, 177, 103, 107, 183, 86, 137, 212, + 67, 51, 55, 57, 109, 104, 167, 141, 106, 208, 207, 206, 72, 155, 36, 57, + 165, 232, 211, 172, 36, 82, 92, 4, 229, 63, 41, 87, 154, 34, 193, 113, + 18, 156, 170, 44, 179, 164, 116, 101, 153, 237, 145, 82, 171, 186, 212, 56, + 85, 89, 45, 9, 78, 85, 150, 57, 10, 233, 202, 14, 12, 20, 246, 197, + 180, 181, 28, 53, 181, 16, 248, 185, 51, 186, 85, 100, 93, 209, 84, 13, + 9, 161, 124, 198, 182, 106, 88, 116, 197, 196, 58, 76, 157, 110, 228, 94, + 210, 249, 60, 113, 41, 12, 210, 86, 98, 235, 190, 63, 35, 188, 65, 25, + 19, 33, 228, 97, 110, 209, 173, 181, 211, 68, 216, 234, 25, 79, 63, 128, + 0, 55, 233, 78, 7, 235, 103, 194, 129, 164, 13, 145, 69, 164, 247, 184, + 46, 109, 105, 155, 87, 148, 132, 72, 132, 2, 109, 19, 130, 160, 51, 240, + 216, 102, 1, 63, 67, 126, 70, 252, 140, 249, 89, 229, 103, 141, 159, 117, + 126, 158, 242, 243, 140, 159, 207, 37, 151, 202, 44, 185, 67, 201, 30, 74, + 254, 80, 10, 8, 107, 116, 110, 60, 47, 71, 53, 57, 59, 194, 103, 13, + 143, 235, 134, 26, 4, 192, 248, 140, 238, 233, 199, 5, 87, 249, 197, 163, + 13, 119, 124, 126, 76, 112, 230, 216, 63, 222, 130, 81, 220, 124, 139, 82, + 154, 223, 240, 243, 21, 63, 161, 84, 199, 47, 171, 118, 23, 102, 22, 249, + 125, 109, 189, 139, 26, 33, 139, 131, 110, 230, 219, 173, 241, 203, 225, 252, + 139, 229, 69, 96, 181, 50, 110, 135, 86, 55, 60, 46, 238, 156, 127, 190, + 145, 159, 87, 242, 131, 18, 229, 77, 21, 41, 31, 107, 251, 67, 20, 170, + 96, 79, 112, 49, 107, 188, 219, 120, 225, 187, 45, 61, 165, 133, 82, 164, + 252, 188, 50, 225, 40, 213, 124, 168, 130, 205, 247, 122, 231, 155, 139, 231, + 47, 83, 240, 44, 48, 111, 73, 88, 100, 222, 98, 243, 86, 53, 111, 53, + 243, 86, 55, 111, 167, 230, 237, 204, 188, 61, 79, 74, 182, 42, 73, 106, + 9, 147, 106, 194, 164, 158, 48, 169, 136, 16, 159, 173, 211, 110, 24, 173, + 231, 100, 231, 152, 101, 114, 117, 112, 153, 188, 165, 83, 225, 27, 250, 123, + 69, 127, 24, 36, 250, 81, 195, 67, 111, 107, 243, 198, 67, 2, 183, 210, + 122, 97, 192, 64, 222, 172, 225, 225, 233, 181, 189, 205, 91, 56, 214, 245, + 54, 223, 200, 207, 43, 40, 83, 181, 27, 190, 88, 186, 16, 151, 149, 27, + 16, 179, 182, 226, 183, 146, 90, 37, 229, 109, 149, 35, 93, 57, 150, 1, + 187, 213, 1, 205, 76, 192, 164, 39, 202, 234, 210, 117, 127, 116, 231, 227, + 175, 172, 31, 70, 160, 203, 185, 67, 238, 156, 178, 197, 35, 190, 26, 217, + 252, 76, 142, 219, 152, 115, 111, 52, 71, 121, 32, 54, 104, 6, 151, 185, + 164, 252, 28, 56, 196, 3, 223, 121, 221, 104, 72, 214, 235, 184, 56, 240, + 227, 155, 23, 121, 246, 21, 176, 186, 236, 179, 169, 201, 129, 96, 25, 5, + 223, 77, 127, 83, 137, 43, 24, 181, 164, 164, 235, 84, 210, 112, 39, 105, + 136, 164, 107, 149, 116, 117, 101, 71, 69, 59, 73, 163, 84, 169, 169, 164, + 241, 78, 210, 216, 148, 202, 172, 218, 149, 191, 70, 0, 171, 79, 178, 80, + 177, 216, 228, 155, 247, 22, 195, 219, 81, 171, 63, 32, 4, 244, 22, 120, + 69, 107, 218, 239, 206, 68, 176, 141, 224, 161, 51, 104, 96, 138, 148, 238, + 216, 224, 178, 97, 173, 35, 86, 153, 31, 248, 203, 43, 88, 154, 128, 160, + 193, 181, 55, 160, 153, 204, 239, 137, 108, 236, 6, 156, 87, 225, 3, 185, + 174, 140, 195, 150, 24, 83, 217, 203, 42, 20, 143, 23, 123, 33, 58, 179, + 65, 135, 42, 59, 250, 68, 202, 226, 35, 219, 149, 250, 42, 231, 97, 48, + 104, 76, 194, 88, 47, 162, 138, 3, 204, 160, 28, 91, 93, 103, 206, 34, + 28, 9, 40, 110, 123, 50, 16, 52, 98, 225, 133, 107, 68, 18, 86, 110, + 217, 141, 252, 53, 63, 225, 70, 194, 255, 137, 70, 17, 83, 129, 163, 234, + 167, 66, 163, 1, 238, 248, 79, 5, 170, 178, 95, 200, 57, 74, 130, 129, + 151, 90, 65, 153, 33, 73, 198, 143, 25, 225, 98, 207, 35, 52, 82, 148, + 254, 154, 213, 93, 45, 25, 142, 85, 98, 250, 108, 253, 185, 189, 162, 243, + 107, 98, 156, 128, 239, 239, 237, 21, 53, 196, 95, 227, 177, 162, 166, 208, + 91, 11, 150, 108, 98, 255, 53, 176, 105, 57, 67, 33, 252, 115, 151, 247, + 144, 50, 145, 177, 230, 160, 245, 126, 16, 74, 217, 75, 69, 65, 206, 170, + 205, 144, 0, 62, 164, 25, 195, 46, 230, 175, 185, 72, 159, 75, 185, 41, + 93, 115, 86, 159, 83, 223, 148, 235, 98, 121, 78, 120, 74, 50, 237, 73, + 1, 101, 168, 191, 26, 7, 22, 106, 114, 172, 181, 168, 29, 32, 245, 191, + 187, 10, 50, 186, 76, 43, 84, 28, 220, 102, 247, 61, 250, 227, 251, 222, + 129, 163, 74, 196, 150, 185, 36, 170, 219, 233, 64, 38, 125, 205, 65, 107, + 21, 52, 90, 250, 35, 186, 184, 208, 2, 20, 105, 106, 150, 193, 57, 241, + 58, 43, 191, 71, 207, 117, 161, 120, 141, 119, 122, 187, 57, 201, 135, 165, + 184, 152, 247, 54, 2, 106, 183, 39, 97, 80, 120, 207, 94, 241, 166, 188, + 47, 60, 42, 202, 27, 165, 238, 52, 155, 60, 211, 146, 54, 6, 42, 111, + 11, 71, 91, 19, 186, 182, 67, 117, 33, 82, 153, 46, 164, 174, 49, 99, + 196, 129, 26, 172, 199, 95, 131, 218, 4, 120, 2, 52, 246, 191, 130, 212, + 9, 219, 68, 29, 176, 3, 49, 103, 0, 81, 143, 215, 231, 121, 94, 114, + 72, 33, 160, 71, 237, 68, 24, 31, 206, 8, 135, 62, 195, 20, 166, 138, + 177, 145, 144, 145, 62, 97, 195, 20, 59, 106, 205, 159, 34, 90, 66, 99, + 182, 242, 167, 218, 219, 38, 131, 121, 64, 172, 92, 202, 216, 8, 131, 36, + 107, 171, 218, 136, 60, 211, 201, 245, 93, 215, 108, 116, 17, 44, 227, 11, + 14, 1, 29, 190, 48, 239, 107, 6, 252, 42, 230, 97, 98, 237, 198, 180, + 114, 90, 99, 175, 42, 154, 4, 16, 102, 28, 169, 132, 87, 18, 172, 145, + 195, 204, 199, 172, 208, 47, 93, 243, 55, 107, 121, 9, 99, 177, 33, 84, + 115, 180, 135, 117, 102, 219, 107, 105, 175, 133, 235, 9, 214, 226, 100, 224, + 195, 251, 56, 178, 87, 20, 138, 86, 42, 212, 186, 154, 102, 230, 8, 145, + 163, 187, 154, 195, 64, 68, 115, 124, 11, 182, 179, 230, 180, 212, 96, 66, + 182, 217, 154, 118, 91, 13, 175, 118, 36, 172, 22, 19, 82, 119, 247, 101, + 148, 12, 67, 57, 91, 204, 194, 190, 179, 99, 167, 132, 71, 197, 252, 146, + 81, 120, 108, 146, 136, 190, 122, 252, 197, 103, 106, 99, 243, 58, 207, 22, + 180, 148, 82, 193, 105, 3, 10, 24, 41, 159, 206, 112, 228, 34, 80, 116, + 60, 213, 146, 216, 174, 37, 140, 49, 156, 208, 160, 194, 86, 188, 203, 180, + 21, 221, 116, 208, 162, 163, 196, 15, 81, 73, 228, 76, 67, 113, 5, 20, + 64, 240, 34, 52, 62, 131, 204, 123, 108, 189, 67, 229, 4, 246, 132, 89, + 106, 35, 59, 95, 34, 171, 145, 115, 115, 0, 51, 5, 199, 104, 139, 251, + 76, 6, 81, 125, 10, 157, 71, 187, 228, 148, 50, 250, 196, 107, 116, 191, + 87, 79, 77, 25, 154, 254, 195, 123, 52, 168, 153, 220, 153, 164, 43, 135, + 59, 146, 92, 125, 97, 216, 80, 209, 84, 170, 44, 205, 38, 237, 102, 195, + 206, 73, 46, 219, 115, 106, 110, 71, 114, 101, 103, 221, 89, 107, 117, 21, + 248, 172, 203, 71, 247, 193, 237, 227, 139, 177, 182, 183, 24, 175, 146, 197, + 200, 64, 57, 72, 173, 181, 117, 112, 120, 177, 61, 190, 198, 178, 70, 249, + 225, 53, 182, 90, 107, 81, 236, 47, 92, 102, 83, 26, 22, 70, 126, 121, + 22, 117, 49, 4, 50, 98, 141, 214, 48, 160, 56, 144, 44, 76, 137, 102, + 235, 28, 2, 206, 53, 196, 35, 16, 197, 235, 31, 94, 35, 213, 52, 228, + 88, 56, 57, 140, 217, 138, 85, 172, 43, 49, 149, 177, 248, 47, 166, 228, + 204, 104, 48, 172, 181, 160, 39, 191, 49, 93, 45, 91, 125, 33, 43, 161, + 37, 65, 47, 178, 246, 43, 62, 203, 248, 71, 73, 218, 31, 16, 202, 207, + 78, 104, 149, 71, 171, 162, 221, 159, 182, 225, 210, 138, 141, 241, 49, 184, + 85, 34, 151, 251, 17, 182, 24, 123, 106, 153, 178, 165, 72, 184, 101, 1, + 96, 52, 239, 98, 181, 223, 142, 38, 76, 116, 213, 186, 31, 195, 159, 197, + 62, 197, 146, 137, 80, 238, 52, 237, 210, 30, 4, 39, 156, 31, 25, 37, + 72, 241, 58, 151, 113, 224, 164, 233, 106, 187, 52, 211, 164, 8, 49, 33, + 178, 24, 180, 166, 251, 173, 112, 133, 52, 169, 21, 158, 7, 201, 29, 202, + 201, 44, 0, 212, 206, 120, 43, 76, 171, 90, 141, 21, 247, 202, 117, 165, + 179, 217, 162, 115, 42, 213, 4, 80, 80, 154, 179, 110, 107, 56, 0, 71, + 63, 123, 4, 66, 183, 116, 235, 110, 34, 154, 169, 178, 23, 158, 212, 130, + 237, 145, 91, 86, 164, 98, 1, 33, 155, 214, 167, 238, 20, 231, 150, 220, + 172, 42, 116, 133, 72, 247, 149, 176, 222, 254, 184, 211, 255, 108, 172, 114, + 152, 227, 114, 183, 9, 22, 56, 89, 136, 28, 55, 60, 127, 49, 201, 48, + 198, 238, 114, 63, 153, 208, 144, 151, 60, 135, 102, 81, 112, 153, 196, 68, + 99, 190, 219, 71, 175, 168, 153, 82, 177, 43, 28, 166, 156, 183, 0, 203, + 232, 83, 142, 34, 210, 116, 94, 33, 209, 62, 50, 60, 53, 107, 120, 106, + 191, 107, 120, 118, 170, 193, 4, 86, 183, 246, 16, 165, 19, 100, 140, 209, + 105, 230, 24, 157, 62, 105, 140, 234, 238, 126, 79, 147, 65, 58, 125, 116, + 144, 8, 126, 246, 103, 115, 232, 4, 100, 142, 15, 93, 41, 197, 20, 38, + 147, 0, 189, 200, 95, 22, 180, 8, 8, 221, 21, 77, 40, 108, 214, 129, + 137, 186, 183, 214, 97, 97, 17, 124, 75, 186, 42, 97, 41, 246, 71, 157, + 238, 10, 151, 38, 199, 214, 243, 2, 167, 19, 118, 20, 65, 151, 86, 186, + 35, 17, 142, 80, 183, 196, 150, 120, 21, 67, 37, 206, 229, 24, 142, 201, + 175, 83, 186, 103, 91, 114, 132, 70, 187, 207, 26, 250, 138, 22, 184, 37, + 70, 149, 143, 251, 249, 85, 137, 174, 112, 165, 176, 80, 102, 227, 47, 133, + 99, 78, 21, 151, 37, 85, 249, 55, 245, 238, 124, 86, 104, 42, 163, 242, + 203, 50, 216, 0, 189, 178, 58, 1, 79, 93, 54, 60, 82, 210, 22, 66, + 169, 170, 34, 59, 22, 76, 76, 117, 222, 130, 138, 94, 47, 122, 241, 73, + 109, 11, 75, 158, 101, 112, 222, 107, 218, 148, 40, 43, 117, 139, 87, 98, + 169, 70, 21, 219, 104, 92, 115, 51, 138, 102, 37, 237, 73, 82, 51, 167, + 38, 89, 100, 246, 142, 211, 51, 246, 116, 102, 77, 50, 201, 94, 241, 201, + 124, 25, 131, 248, 26, 53, 146, 168, 241, 114, 107, 108, 180, 38, 22, 3, + 218, 108, 49, 224, 23, 23, 191, 33, 115, 91, 249, 53, 106, 124, 203, 191, + 113, 227, 39, 254, 173, 54, 94, 242, 111, 173, 241, 74, 128, 108, 98, 120, + 188, 122, 201, 234, 140, 174, 56, 30, 134, 82, 67, 145, 224, 53, 28, 18, + 239, 135, 216, 240, 88, 115, 139, 24, 206, 85, 69, 253, 72, 62, 226, 35, + 106, 226, 240, 211, 245, 70, 94, 183, 106, 222, 213, 205, 33, 212, 218, 178, + 97, 148, 216, 34, 212, 132, 48, 0, 109, 202, 22, 194, 65, 37, 37, 240, + 233, 175, 32, 156, 55, 125, 101, 48, 200, 252, 6, 253, 241, 96, 106, 22, + 246, 86, 168, 67, 172, 143, 17, 149, 68, 251, 222, 171, 150, 169, 91, 5, + 120, 33, 15, 107, 62, 182, 171, 151, 203, 157, 30, 69, 123, 252, 245, 92, + 238, 44, 9, 5, 135, 221, 205, 229, 148, 240, 4, 83, 227, 114, 185, 250, + 150, 130, 24, 92, 253, 246, 27, 109, 121, 138, 86, 99, 229, 83, 100, 181, + 28, 209, 149, 181, 86, 242, 234, 168, 43, 9, 175, 165, 194, 205, 184, 229, + 114, 34, 145, 10, 1, 17, 250, 183, 57, 165, 91, 255, 86, 138, 92, 150, + 162, 162, 7, 71, 200, 61, 245, 178, 191, 70, 40, 161, 108, 127, 52, 187, + 202, 213, 216, 83, 226, 10, 249, 62, 172, 185, 89, 226, 225, 74, 58, 122, + 199, 234, 74, 238, 250, 59, 25, 208, 155, 156, 181, 238, 50, 212, 152, 14, + 172, 63, 123, 177, 255, 65, 11, 75, 212, 158, 126, 199, 194, 254, 255, 202, + 138, 12, 190, 104, 61, 58, 187, 171, 209, 49, 107, 209, 249, 23, 86, 226, + 157, 226, 44, 213, 98, 223, 216, 149, 133, 71, 217, 140, 245, 233, 60, 109, + 117, 138, 172, 247, 187, 119, 239, 190, 162, 90, 133, 208, 225, 221, 205, 52, + 27, 108, 53, 161, 131, 166, 185, 90, 131, 252, 23, 176, 13, 199, 85, 204, + 126, 72, 217, 48, 104, 219, 209, 82, 120, 155, 24, 21, 220, 205, 78, 34, + 218, 24, 45, 150, 184, 110, 39, 10, 236, 27, 234, 7, 186, 2, 36, 77, + 126, 133, 54, 2, 142, 38, 170, 97, 108, 157, 89, 50, 217, 123, 228, 64, + 167, 255, 3, 45, 175, 249, 65, 86, 91, 121, 215, 142, 100, 23, 141, 100, + 27, 77, 187, 176, 78, 209, 100, 81, 74, 72, 195, 193, 18, 45, 221, 222, + 234, 112, 101, 22, 169, 221, 209, 55, 154, 241, 97, 77, 244, 205, 170, 212, + 7, 38, 84, 253, 117, 54, 39, 228, 22, 238, 91, 80, 140, 11, 119, 243, + 66, 121, 99, 134, 245, 104, 121, 226, 17, 26, 113, 148, 163, 21, 151, 142, + 232, 157, 120, 61, 108, 69, 112, 152, 195, 186, 165, 123, 207, 214, 187, 33, + 111, 15, 107, 198, 4, 35, 38, 139, 207, 159, 7, 123, 134, 143, 46, 83, + 7, 159, 70, 179, 85, 90, 57, 244, 210, 242, 72, 78, 137, 206, 111, 175, + 78, 75, 200, 189, 175, 16, 46, 145, 156, 235, 124, 148, 159, 250, 116, 86, + 235, 147, 155, 147, 158, 33, 169, 24, 236, 134, 224, 21, 48, 1, 194, 11, + 16, 178, 201, 211, 120, 150, 189, 231, 5, 65, 219, 67, 200, 99, 40, 205, + 63, 75, 38, 41, 120, 214, 160, 254, 208, 190, 9, 67, 60, 34, 60, 98, + 60, 170, 120, 96, 67, 133, 117, 167, 84, 70, 153, 131, 214, 109, 119, 208, + 188, 187, 7, 235, 188, 132, 27, 174, 188, 83, 253, 151, 204, 241, 38, 28, + 134, 37, 67, 9, 153, 128, 132, 151, 118, 197, 202, 222, 104, 32, 60, 80, + 225, 80, 65, 87, 216, 224, 247, 172, 215, 237, 176, 196, 24, 88, 244, 82, + 60, 151, 167, 199, 176, 255, 93, 41, 116, 74, 130, 154, 120, 87, 7, 149, + 109, 42, 239, 220, 96, 171, 104, 56, 218, 254, 46, 20, 200, 140, 45, 222, + 79, 122, 12, 139, 220, 60, 165, 55, 145, 104, 66, 58, 43, 144, 170, 211, + 186, 55, 37, 109, 132, 146, 0, 155, 187, 214, 241, 209, 110, 60, 204, 250, + 109, 181, 119, 101, 161, 235, 40, 64, 59, 131, 58, 206, 0, 78, 123, 74, + 254, 194, 0, 213, 250, 222, 250, 80, 88, 43, 160, 97, 133, 170, 15, 131, + 18, 77, 69, 113, 1, 147, 142, 33, 193, 166, 35, 45, 180, 72, 224, 54, + 162, 168, 88, 71, 109, 245, 177, 102, 182, 162, 171, 100, 113, 218, 43, 109, + 164, 67, 90, 223, 54, 70, 59, 164, 181, 179, 30, 47, 97, 87, 229, 79, + 36, 125, 181, 233, 118, 67, 209, 81, 244, 206, 10, 237, 181, 205, 202, 187, + 220, 150, 189, 246, 10, 64, 102, 179, 150, 143, 181, 17, 245, 229, 189, 155, + 80, 95, 19, 180, 141, 193, 78, 170, 212, 205, 108, 107, 139, 153, 240, 0, + 84, 158, 48, 2, 149, 39, 12, 65, 229, 233, 99, 80, 57, 60, 8, 191, + 183, 215, 130, 167, 42, 95, 239, 138, 58, 150, 66, 96, 101, 227, 167, 165, + 18, 53, 48, 128, 76, 17, 109, 83, 166, 222, 206, 91, 31, 23, 253, 145, + 8, 31, 181, 220, 189, 251, 59, 110, 39, 56, 160, 93, 149, 46, 13, 66, + 142, 108, 36, 42, 85, 189, 140, 99, 115, 222, 31, 116, 161, 186, 168, 72, + 188, 234, 218, 170, 5, 68, 97, 208, 61, 102, 201, 174, 228, 152, 77, 178, + 120, 161, 125, 142, 67, 50, 135, 135, 115, 191, 112, 171, 147, 3, 55, 163, + 110, 66, 251, 149, 178, 79, 150, 84, 69, 238, 245, 232, 83, 107, 208, 239, + 40, 7, 29, 128, 217, 57, 81, 9, 74, 23, 53, 179, 4, 180, 82, 193, + 24, 12, 140, 10, 59, 197, 104, 206, 122, 45, 24, 108, 22, 241, 58, 140, + 207, 17, 19, 194, 197, 47, 48, 142, 21, 93, 150, 45, 248, 170, 232, 36, + 170, 60, 46, 108, 196, 229, 86, 221, 214, 100, 66, 141, 73, 69, 101, 136, + 182, 238, 23, 223, 106, 187, 185, 172, 138, 229, 134, 78, 215, 224, 50, 147, + 226, 249, 118, 183, 215, 63, 59, 84, 207, 184, 72, 47, 95, 134, 214, 26, + 153, 85, 8, 192, 67, 4, 183, 170, 142, 99, 134, 248, 73, 203, 92, 145, + 56, 135, 185, 198, 33, 156, 155, 217, 237, 227, 229, 224, 124, 92, 180, 58, + 56, 103, 147, 230, 49, 25, 138, 119, 50, 136, 110, 173, 233, 110, 20, 54, + 92, 114, 29, 236, 207, 198, 3, 123, 130, 14, 17, 101, 133, 216, 49, 51, + 59, 85, 20, 209, 123, 5, 54, 233, 207, 5, 179, 59, 28, 218, 189, 179, + 117, 195, 155, 173, 228, 150, 159, 164, 95, 66, 210, 204, 36, 208, 219, 187, + 72, 75, 82, 2, 181, 168, 166, 123, 187, 18, 231, 96, 60, 121, 20, 113, + 75, 197, 221, 170, 226, 40, 142, 118, 0, 66, 216, 112, 219, 204, 93, 249, + 101, 170, 107, 159, 104, 230, 174, 17, 177, 134, 26, 9, 155, 214, 161, 103, + 201, 187, 93, 111, 119, 13, 220, 24, 235, 58, 182, 81, 51, 149, 122, 181, + 53, 202, 240, 25, 89, 86, 105, 96, 113, 59, 254, 208, 133, 129, 206, 38, + 123, 244, 104, 208, 48, 171, 141, 31, 239, 241, 92, 50, 121, 45, 7, 12, + 17, 166, 141, 92, 192, 143, 115, 57, 140, 183, 23, 180, 4, 9, 87, 142, + 183, 5, 129, 136, 87, 145, 171, 13, 0, 120, 194, 100, 139, 109, 250, 58, + 29, 203, 162, 138, 232, 93, 185, 77, 221, 86, 28, 254, 155, 247, 34, 0, + 164, 78, 196, 74, 138, 17, 144, 168, 189, 98, 130, 196, 150, 160, 216, 97, + 16, 245, 87, 152, 173, 40, 56, 211, 79, 202, 84, 214, 120, 49, 159, 44, + 230, 172, 135, 11, 17, 216, 93, 75, 112, 194, 64, 73, 167, 187, 140, 246, + 225, 174, 105, 31, 36, 244, 196, 59, 10, 225, 35, 44, 9, 31, 39, 145, + 33, 27, 29, 211, 157, 13, 147, 136, 200, 228, 234, 244, 91, 116, 171, 1, + 228, 77, 98, 99, 19, 171, 181, 85, 168, 132, 154, 95, 173, 37, 73, 170, + 89, 73, 234, 169, 36, 181, 172, 36, 103, 169, 36, 245, 172, 36, 116, 91, + 180, 211, 156, 238, 117, 208, 138, 60, 51, 145, 154, 234, 29, 154, 85, 246, + 176, 236, 106, 106, 34, 2, 215, 44, 205, 148, 20, 107, 211, 90, 177, 202, + 233, 35, 109, 201, 134, 190, 80, 208, 174, 60, 186, 152, 150, 194, 114, 126, + 122, 132, 3, 67, 249, 144, 68, 18, 229, 175, 143, 162, 244, 91, 209, 139, + 143, 10, 233, 212, 163, 206, 120, 24, 99, 232, 149, 239, 15, 58, 113, 161, + 93, 5, 205, 35, 156, 153, 166, 118, 79, 118, 139, 171, 139, 98, 8, 160, + 42, 187, 106, 132, 238, 161, 132, 81, 134, 27, 156, 162, 198, 74, 148, 213, + 194, 176, 76, 208, 131, 192, 71, 217, 114, 78, 50, 235, 223, 15, 91, 44, + 69, 65, 7, 75, 113, 201, 102, 51, 232, 90, 88, 43, 122, 28, 195, 87, + 195, 228, 99, 87, 237, 12, 8, 60, 71, 105, 28, 30, 16, 212, 120, 68, + 1, 218, 203, 66, 169, 64, 49, 162, 27, 103, 80, 113, 224, 57, 6, 114, + 178, 177, 116, 61, 113, 91, 227, 66, 138, 118, 229, 116, 192, 82, 13, 138, + 64, 248, 121, 208, 88, 121, 109, 227, 213, 203, 30, 252, 47, 123, 245, 18, + 253, 26, 3, 254, 27, 239, 84, 133, 159, 90, 225, 20, 124, 166, 130, 207, + 56, 216, 92, 234, 86, 110, 219, 168, 174, 37, 94, 92, 28, 229, 52, 37, + 49, 133, 181, 241, 158, 171, 43, 135, 146, 191, 133, 208, 55, 198, 125, 186, + 192, 25, 182, 86, 108, 104, 243, 73, 168, 192, 44, 104, 192, 239, 187, 75, + 139, 38, 164, 186, 92, 90, 25, 240, 141, 225, 16, 120, 219, 204, 54, 172, + 57, 241, 34, 56, 103, 101, 137, 23, 225, 121, 180, 221, 10, 169, 83, 149, + 112, 253, 158, 237, 164, 176, 153, 97, 154, 134, 45, 35, 64, 207, 129, 73, + 210, 31, 246, 116, 4, 40, 6, 140, 160, 202, 132, 47, 15, 130, 163, 33, + 221, 165, 194, 51, 113, 217, 40, 186, 198, 169, 22, 190, 105, 108, 224, 93, + 198, 171, 110, 19, 221, 13, 195, 132, 173, 100, 216, 54, 9, 149, 140, 129, + 90, 27, 34, 100, 32, 42, 211, 222, 27, 159, 254, 5, 176, 41, 148, 104, + 156, 153, 194, 48, 120, 255, 106, 113, 145, 11, 212, 175, 234, 26, 38, 32, + 138, 67, 105, 71, 254, 115, 245, 23, 178, 187, 22, 173, 62, 146, 6, 105, + 40, 211, 210, 22, 217, 5, 52, 111, 252, 154, 165, 29, 178, 31, 91, 183, + 52, 54, 246, 99, 207, 44, 125, 141, 20, 4, 74, 215, 122, 166, 186, 144, + 120, 140, 142, 225, 112, 152, 173, 128, 154, 68, 207, 83, 240, 205, 202, 29, + 6, 42, 134, 245, 12, 17, 5, 135, 191, 236, 153, 90, 159, 99, 234, 134, + 17, 240, 217, 75, 240, 72, 81, 216, 124, 222, 250, 92, 247, 222, 254, 164, + 173, 216, 109, 97, 116, 78, 93, 185, 107, 171, 155, 182, 189, 154, 45, 216, + 201, 109, 185, 212, 62, 35, 159, 93, 102, 25, 228, 200, 253, 220, 235, 142, + 64, 74, 95, 204, 230, 227, 161, 44, 97, 55, 127, 59, 158, 227, 11, 18, + 201, 34, 177, 220, 157, 194, 56, 14, 161, 160, 221, 118, 255, 174, 223, 237, + 248, 137, 53, 141, 249, 114, 236, 42, 234, 37, 93, 194, 181, 185, 141, 142, + 147, 33, 207, 204, 182, 52, 94, 143, 36, 184, 221, 154, 117, 125, 28, 137, + 199, 80, 183, 167, 115, 116, 206, 94, 214, 240, 211, 235, 186, 199, 175, 71, + 19, 45, 37, 61, 59, 118, 199, 19, 152, 36, 120, 6, 141, 39, 22, 108, + 22, 164, 209, 222, 178, 220, 217, 231, 123, 59, 217, 108, 22, 190, 211, 91, + 235, 93, 4, 239, 129, 67, 136, 25, 129, 192, 23, 98, 220, 242, 164, 86, + 96, 15, 95, 242, 217, 227, 207, 192, 114, 208, 174, 37, 249, 88, 232, 198, + 181, 196, 250, 0, 135, 108, 41, 63, 71, 123, 52, 99, 241, 190, 87, 104, + 84, 78, 60, 98, 43, 150, 159, 98, 96, 179, 209, 131, 86, 133, 174, 121, + 10, 110, 68, 126, 148, 72, 45, 219, 29, 200, 108, 191, 12, 69, 155, 150, + 217, 120, 60, 122, 248, 228, 84, 137, 246, 244, 61, 100, 253, 55, 91, 183, + 51, 150, 125, 16, 51, 43, 187, 28, 147, 91, 220, 87, 18, 110, 149, 97, + 86, 89, 192, 214, 226, 89, 85, 45, 91, 194, 116, 167, 78, 148, 170, 189, + 43, 22, 175, 131, 152, 38, 72, 41, 1, 147, 82, 102, 31, 186, 131, 238, + 92, 252, 163, 137, 21, 178, 80, 140, 215, 109, 254, 124, 186, 197, 41, 83, + 129, 49, 98, 86, 10, 113, 166, 96, 125, 17, 100, 77, 157, 55, 112, 235, + 133, 0, 40, 168, 28, 105, 215, 94, 226, 142, 140, 131, 37, 168, 42, 130, + 141, 145, 104, 3, 105, 223, 231, 202, 104, 143, 210, 57, 89, 67, 241, 146, + 207, 244, 208, 127, 157, 247, 174, 232, 184, 79, 247, 234, 215, 184, 147, 28, + 205, 160, 31, 132, 37, 144, 90, 3, 54, 70, 140, 27, 187, 228, 87, 90, + 202, 42, 181, 78, 142, 35, 193, 164, 87, 110, 95, 43, 21, 49, 4, 116, + 109, 129, 86, 35, 226, 246, 1, 39, 173, 92, 27, 74, 90, 65, 133, 234, + 184, 4, 1, 172, 63, 154, 180, 250, 163, 121, 50, 1, 226, 174, 44, 49, + 192, 17, 40, 255, 119, 204, 82, 83, 42, 89, 188, 228, 83, 122, 255, 105, + 93, 163, 189, 165, 240, 184, 34, 209, 254, 234, 217, 91, 96, 139, 219, 254, + 108, 104, 45, 170, 208, 85, 65, 202, 246, 111, 82, 63, 7, 63, 94, 167, + 202, 189, 87, 207, 28, 186, 21, 79, 145, 49, 112, 134, 93, 58, 109, 70, + 184, 10, 65, 41, 212, 209, 74, 65, 124, 153, 48, 10, 70, 21, 229, 54, + 14, 160, 173, 37, 84, 77, 202, 215, 216, 244, 219, 202, 30, 152, 76, 65, + 179, 55, 198, 221, 114, 227, 81, 164, 172, 192, 64, 41, 181, 85, 237, 113, + 207, 150, 81, 144, 70, 63, 161, 203, 220, 183, 61, 93, 173, 241, 184, 51, + 232, 166, 236, 69, 101, 236, 220, 200, 52, 131, 38, 105, 209, 38, 24, 74, + 119, 237, 209, 12, 34, 230, 183, 184, 193, 217, 135, 61, 31, 72, 106, 209, + 44, 193, 223, 207, 25, 251, 116, 110, 37, 183, 133, 35, 167, 99, 246, 224, + 244, 23, 174, 26, 28, 115, 186, 20, 210, 65, 113, 55, 104, 221, 55, 2, + 246, 84, 239, 230, 148, 217, 175, 14, 108, 237, 192, 160, 28, 148, 101, 168, + 110, 194, 117, 33, 168, 76, 31, 136, 239, 82, 167, 250, 159, 186, 108, 48, + 24, 193, 193, 133, 114, 86, 148, 207, 74, 112, 89, 99, 109, 174, 35, 223, + 153, 46, 70, 249, 227, 18, 213, 57, 165, 25, 106, 183, 70, 159, 90, 51, + 88, 225, 249, 30, 150, 199, 22, 150, 251, 218, 11, 135, 54, 214, 253, 188, + 39, 69, 179, 240, 124, 167, 63, 21, 241, 121, 122, 185, 140, 32, 53, 79, + 47, 190, 243, 61, 5, 126, 79, 105, 198, 125, 188, 241, 67, 46, 240, 223, + 83, 33, 95, 211, 215, 235, 252, 87, 129, 79, 31, 238, 95, 233, 163, 219, + 191, 207, 95, 187, 95, 3, 40, 208, 51, 180, 158, 4, 155, 110, 40, 209, + 248, 39, 74, 133, 63, 212, 247, 130, 173, 99, 23, 255, 122, 77, 192, 255, + 198, 244, 240, 175, 148, 251, 202, 171, 190, 103, 187, 212, 249, 126, 190, 255, + 125, 225, 202, 171, 129, 199, 69, 109, 104, 52, 232, 211, 119, 56, 84, 26, + 175, 27, 70, 189, 44, 53, 58, 243, 226, 79, 23, 206, 193, 86, 66, 118, + 245, 105, 237, 68, 19, 117, 187, 58, 227, 121, 126, 252, 147, 255, 83, 225, + 50, 120, 145, 255, 169, 216, 96, 139, 222, 210, 17, 212, 245, 172, 65, 77, + 120, 81, 42, 201, 136, 42, 177, 124, 53, 190, 151, 94, 253, 69, 158, 39, + 5, 0, 200, 51, 51, 66, 163, 155, 53, 145, 133, 243, 188, 243, 44, 207, + 113, 106, 73, 28, 133, 181, 194, 11, 46, 192, 80, 231, 221, 0, 83, 122, + 120, 161, 208, 234, 164, 129, 123, 150, 183, 10, 137, 131, 194, 139, 252, 161, + 44, 92, 58, 88, 163, 155, 226, 214, 93, 16, 240, 188, 19, 138, 75, 105, + 212, 253, 200, 94, 57, 43, 240, 175, 181, 196, 5, 78, 208, 48, 229, 64, + 125, 193, 60, 200, 99, 246, 81, 95, 128, 92, 239, 135, 138, 251, 172, 193, + 178, 9, 198, 3, 169, 222, 202, 157, 254, 221, 221, 2, 182, 197, 244, 230, + 202, 16, 60, 232, 53, 54, 74, 182, 188, 180, 151, 220, 219, 212, 160, 101, + 36, 150, 16, 105, 165, 59, 157, 57, 181, 74, 49, 128, 162, 26, 157, 154, + 224, 149, 71, 32, 137, 94, 198, 47, 188, 248, 28, 254, 114, 170, 154, 167, + 11, 66, 12, 156, 125, 107, 56, 7, 78, 6, 115, 184, 42, 154, 192, 19, + 107, 193, 99, 57, 49, 24, 69, 85, 210, 59, 129, 161, 57, 211, 1, 21, + 225, 162, 33, 2, 22, 236, 91, 149, 165, 60, 210, 174, 2, 162, 135, 123, + 254, 40, 56, 219, 239, 251, 14, 96, 19, 157, 60, 74, 32, 39, 71, 234, + 211, 219, 188, 15, 246, 18, 61, 90, 101, 186, 136, 157, 234, 238, 186, 131, + 57, 140, 167, 236, 159, 29, 37, 138, 237, 181, 166, 29, 66, 82, 230, 237, + 222, 237, 146, 201, 163, 234, 4, 23, 75, 39, 136, 101, 235, 61, 110, 119, + 58, 238, 208, 248, 183, 231, 56, 176, 83, 3, 164, 202, 127, 180, 145, 186, + 29, 187, 237, 75, 181, 224, 220, 97, 168, 173, 4, 118, 171, 123, 36, 249, + 82, 186, 189, 66, 157, 85, 70, 47, 246, 219, 156, 40, 143, 26, 137, 129, + 7, 242, 27, 35, 30, 105, 117, 243, 83, 86, 168, 222, 113, 61, 97, 145, + 129, 123, 220, 176, 152, 153, 130, 17, 152, 130, 155, 136, 233, 2, 198, 151, + 175, 184, 154, 23, 30, 141, 42, 48, 126, 98, 129, 81, 70, 33, 130, 22, + 219, 253, 120, 116, 232, 211, 157, 222, 29, 127, 26, 43, 49, 180, 117, 59, + 24, 143, 135, 79, 195, 49, 74, 179, 225, 120, 76, 199, 143, 39, 98, 171, + 65, 5, 14, 122, 35, 135, 125, 127, 58, 173, 225, 4, 180, 222, 14, 93, + 122, 56, 149, 178, 125, 90, 35, 44, 145, 162, 112, 235, 168, 132, 10, 20, + 209, 119, 185, 81, 11, 92, 57, 58, 16, 125, 197, 146, 231, 243, 254, 168, + 75, 144, 34, 172, 251, 131, 214, 45, 112, 14, 113, 128, 168, 177, 77, 208, + 62, 170, 71, 130, 169, 180, 104, 136, 114, 9, 161, 95, 220, 98, 9, 121, + 162, 150, 67, 246, 230, 128, 21, 161, 33, 3, 79, 160, 201, 112, 101, 179, + 113, 150, 157, 209, 120, 124, 104, 119, 70, 111, 119, 116, 39, 227, 25, 156, + 70, 245, 198, 147, 12, 103, 61, 89, 35, 187, 103, 226, 34, 100, 2, 179, + 41, 196, 139, 14, 180, 220, 74, 244, 104, 171, 83, 5, 238, 174, 135, 241, + 226, 190, 151, 222, 144, 97, 202, 188, 70, 61, 123, 99, 166, 178, 1, 251, + 165, 45, 240, 164, 29, 153, 145, 81, 234, 217, 219, 138, 245, 63, 122, 43, + 214, 255, 144, 173, 104, 119, 224, 241, 5, 147, 238, 238, 206, 224, 127, 88, + 44, 91, 52, 92, 45, 197, 195, 74, 110, 21, 38, 2, 172, 54, 170, 59, + 39, 108, 72, 59, 207, 163, 85, 39, 101, 236, 212, 58, 232, 143, 132, 24, + 151, 37, 38, 123, 234, 54, 59, 221, 219, 197, 61, 93, 205, 49, 61, 229, + 148, 77, 103, 62, 239, 197, 89, 184, 50, 118, 122, 35, 102, 21, 207, 221, + 191, 115, 161, 140, 68, 171, 242, 53, 51, 237, 40, 1, 185, 169, 21, 44, + 201, 30, 237, 134, 46, 141, 14, 43, 72, 224, 236, 116, 101, 61, 232, 254, + 250, 161, 201, 151, 23, 40, 159, 103, 154, 37, 221, 4, 254, 136, 64, 193, + 192, 77, 198, 247, 214, 133, 106, 144, 187, 24, 177, 33, 48, 254, 160, 21, + 81, 169, 62, 215, 240, 194, 230, 236, 241, 197, 90, 195, 54, 56, 87, 135, + 87, 122, 38, 105, 157, 58, 21, 22, 131, 16, 9, 211, 20, 101, 145, 119, + 64, 119, 148, 216, 199, 213, 17, 108, 64, 143, 25, 46, 66, 240, 210, 211, + 4, 219, 13, 190, 39, 78, 177, 231, 221, 21, 237, 23, 192, 55, 65, 65, + 153, 144, 86, 133, 177, 83, 111, 52, 220, 25, 197, 244, 8, 60, 62, 156, + 59, 35, 182, 7, 193, 204, 80, 106, 155, 61, 85, 241, 102, 8, 135, 51, + 123, 163, 107, 155, 43, 18, 170, 126, 236, 207, 192, 56, 76, 65, 186, 233, + 39, 235, 194, 156, 226, 211, 50, 248, 6, 33, 209, 175, 251, 53, 49, 85, + 31, 134, 137, 245, 85, 30, 243, 102, 139, 16, 157, 49, 161, 198, 147, 126, + 187, 162, 236, 98, 192, 24, 90, 5, 196, 39, 32, 145, 145, 250, 62, 243, + 159, 7, 138, 232, 18, 50, 101, 42, 172, 139, 76, 44, 245, 186, 117, 171, + 61, 146, 203, 16, 87, 106, 201, 11, 103, 82, 108, 83, 212, 218, 189, 31, + 118, 233, 46, 108, 201, 210, 132, 129, 54, 200, 162, 151, 129, 87, 213, 106, + 114, 98, 25, 180, 189, 35, 145, 240, 212, 233, 56, 60, 15, 132, 99, 65, + 163, 76, 86, 181, 126, 19, 230, 146, 21, 247, 120, 5, 86, 57, 251, 167, + 21, 83, 147, 49, 17, 157, 238, 160, 181, 24, 181, 50, 160, 130, 225, 43, + 39, 24, 191, 240, 50, 195, 93, 211, 127, 130, 153, 67, 72, 241, 59, 74, + 217, 31, 250, 253, 239, 110, 216, 96, 19, 136, 7, 222, 240, 59, 167, 164, + 41, 137, 247, 224, 14, 97, 140, 133, 148, 124, 15, 154, 117, 228, 64, 25, + 248, 217, 10, 55, 199, 103, 107, 60, 87, 141, 198, 178, 28, 226, 109, 221, + 104, 244, 202, 225, 139, 252, 226, 61, 205, 122, 237, 18, 124, 172, 115, 243, + 17, 30, 189, 232, 159, 195, 27, 235, 166, 111, 20, 124, 35, 151, 125, 37, + 95, 137, 18, 58, 188, 70, 193, 168, 110, 255, 69, 254, 245, 53, 20, 179, + 75, 165, 201, 13, 116, 210, 225, 251, 248, 98, 2, 103, 161, 142, 30, 0, + 101, 211, 4, 214, 206, 28, 17, 49, 15, 80, 22, 28, 47, 83, 118, 118, + 64, 69, 151, 83, 92, 76, 249, 150, 78, 229, 69, 62, 120, 13, 55, 20, + 16, 38, 1, 33, 7, 68, 73, 64, 68, 1, 206, 207, 112, 131, 53, 30, + 124, 234, 230, 175, 191, 15, 112, 155, 253, 62, 228, 103, 196, 207, 0, 119, + 25, 10, 9, 57, 36, 84, 206, 83, 110, 252, 107, 118, 185, 11, 181, 249, + 215, 80, 43, 199, 69, 26, 254, 151, 126, 166, 76, 69, 185, 40, 7, 5, + 183, 228, 254, 76, 89, 212, 119, 40, 223, 145, 254, 142, 10, 162, 155, 195, + 119, 221, 215, 218, 210, 19, 204, 188, 253, 241, 125, 52, 109, 204, 91, 109, + 179, 154, 165, 91, 84, 56, 137, 119, 91, 19, 57, 37, 44, 8, 48, 232, + 44, 161, 56, 119, 3, 129, 181, 173, 226, 150, 239, 24, 75, 19, 197, 243, + 201, 152, 118, 17, 146, 218, 154, 218, 76, 118, 54, 5, 62, 19, 225, 185, + 76, 219, 190, 74, 98, 162, 167, 40, 141, 146, 70, 57, 35, 21, 237, 87, + 214, 78, 96, 20, 130, 185, 31, 76, 178, 102, 1, 200, 254, 179, 198, 175, + 121, 234, 23, 45, 82, 126, 13, 216, 55, 114, 73, 20, 74, 68, 86, 104, + 23, 147, 173, 19, 170, 90, 17, 233, 60, 118, 249, 80, 113, 204, 118, 178, + 239, 165, 123, 106, 72, 25, 187, 245, 9, 152, 223, 254, 14, 63, 12, 5, + 168, 24, 235, 67, 206, 111, 186, 162, 191, 143, 182, 74, 138, 146, 173, 88, + 237, 34, 131, 50, 198, 34, 87, 185, 163, 163, 1, 237, 11, 229, 122, 47, + 205, 136, 171, 166, 117, 51, 89, 60, 81, 105, 29, 135, 202, 160, 161, 119, + 230, 123, 207, 83, 166, 229, 19, 116, 82, 201, 218, 36, 157, 123, 250, 56, + 28, 66, 217, 187, 157, 123, 35, 171, 67, 248, 1, 211, 16, 166, 116, 181, + 96, 102, 39, 219, 83, 181, 211, 1, 111, 61, 221, 203, 254, 84, 68, 92, + 149, 145, 217, 16, 153, 134, 39, 220, 28, 42, 46, 95, 188, 194, 7, 46, + 94, 27, 197, 68, 0, 181, 158, 14, 201, 120, 155, 125, 1, 51, 157, 229, + 133, 10, 68, 136, 215, 230, 140, 246, 86, 4, 191, 201, 22, 175, 132, 208, + 101, 10, 156, 177, 82, 155, 214, 240, 97, 140, 133, 183, 144, 136, 175, 86, + 140, 240, 42, 109, 42, 69, 88, 174, 168, 132, 177, 94, 245, 246, 70, 149, + 125, 37, 171, 40, 207, 39, 237, 5, 47, 132, 11, 126, 39, 152, 161, 40, + 58, 42, 125, 37, 145, 20, 144, 77, 109, 47, 44, 194, 245, 102, 91, 101, + 74, 117, 111, 207, 89, 50, 133, 89, 236, 132, 135, 46, 90, 79, 91, 100, + 122, 2, 119, 167, 22, 162, 95, 115, 66, 162, 41, 43, 123, 109, 164, 92, + 237, 62, 40, 56, 126, 111, 60, 28, 223, 119, 71, 93, 120, 146, 28, 47, + 230, 144, 3, 243, 149, 140, 133, 250, 141, 124, 131, 255, 80, 146, 17, 221, + 22, 7, 221, 214, 29, 68, 144, 66, 208, 216, 224, 229, 239, 35, 91, 88, + 236, 209, 205, 101, 225, 110, 150, 87, 225, 159, 254, 212, 187, 10, 95, 244, + 63, 21, 243, 203, 98, 175, 240, 62, 231, 89, 181, 228, 206, 203, 116, 31, + 223, 42, 55, 128, 25, 248, 28, 230, 246, 67, 183, 59, 105, 90, 117, 109, + 216, 188, 254, 51, 99, 253, 46, 137, 218, 202, 188, 85, 24, 5, 66, 67, + 242, 155, 142, 145, 78, 185, 184, 198, 232, 119, 232, 192, 165, 63, 118, 116, + 227, 109, 182, 5, 83, 169, 25, 5, 230, 198, 193, 72, 168, 18, 30, 29, + 53, 54, 235, 239, 228, 186, 207, 202, 202, 254, 42, 244, 215, 161, 63, 232, + 126, 234, 14, 26, 27, 229, 168, 196, 27, 97, 169, 22, 182, 206, 170, 173, + 133, 212, 242, 222, 42, 44, 121, 171, 160, 32, 210, 197, 86, 248, 154, 194, + 215, 18, 78, 233, 169, 180, 118, 72, 40, 138, 183, 106, 251, 222, 186, 125, + 131, 89, 226, 194, 67, 216, 142, 192, 11, 140, 73, 188, 10, 26, 84, 22, + 212, 105, 125, 15, 121, 40, 101, 72, 123, 65, 137, 22, 120, 175, 176, 154, + 169, 199, 21, 247, 85, 80, 105, 248, 146, 47, 68, 15, 185, 225, 175, 194, + 134, 20, 143, 220, 251, 153, 67, 147, 57, 204, 202, 28, 169, 170, 219, 186, + 234, 84, 230, 200, 100, 142, 178, 50, 199, 170, 230, 182, 170, 57, 149, 55, + 54, 121, 227, 140, 188, 216, 19, 59, 147, 207, 220, 64, 26, 108, 250, 135, + 109, 77, 167, 35, 117, 157, 19, 231, 169, 27, 23, 212, 26, 250, 139, 11, + 137, 220, 247, 90, 78, 222, 6, 4, 210, 105, 138, 188, 17, 18, 6, 23, + 15, 38, 214, 108, 66, 165, 128, 23, 105, 149, 106, 22, 247, 174, 184, 37, + 159, 128, 30, 90, 202, 246, 69, 250, 52, 251, 172, 97, 238, 170, 228, 101, + 147, 222, 209, 39, 59, 35, 53, 48, 94, 183, 203, 39, 98, 151, 242, 90, + 98, 95, 137, 21, 213, 19, 151, 122, 9, 187, 183, 103, 175, 189, 100, 213, + 93, 249, 85, 94, 117, 201, 144, 154, 53, 194, 99, 13, 16, 39, 140, 115, + 115, 144, 175, 33, 66, 164, 236, 249, 67, 192, 10, 247, 88, 239, 42, 145, + 231, 51, 198, 102, 218, 235, 207, 171, 157, 30, 196, 130, 103, 8, 128, 85, + 34, 123, 140, 40, 95, 37, 154, 233, 121, 2, 197, 132, 103, 17, 126, 165, + 5, 1, 125, 134, 216, 140, 132, 57, 77, 198, 225, 192, 19, 106, 50, 174, + 246, 125, 136, 183, 144, 77, 50, 53, 5, 243, 164, 95, 224, 158, 238, 13, + 98, 98, 21, 19, 168, 152, 72, 197, 168, 35, 52, 255, 21, 106, 171, 250, + 148, 128, 254, 66, 250, 139, 232, 47, 222, 169, 153, 121, 42, 137, 5, 40, + 46, 50, 49, 23, 4, 84, 22, 60, 159, 215, 23, 206, 47, 19, 96, 155, + 223, 51, 130, 69, 95, 163, 17, 127, 69, 252, 69, 57, 57, 227, 247, 215, + 117, 63, 22, 53, 150, 27, 177, 194, 68, 16, 72, 96, 101, 238, 178, 17, + 248, 214, 72, 16, 106, 73, 37, 250, 84, 14, 13, 63, 229, 167, 138, 154, + 121, 172, 176, 194, 67, 169, 198, 236, 151, 53, 29, 75, 152, 106, 82, 11, + 146, 186, 101, 59, 64, 151, 14, 164, 92, 99, 176, 50, 61, 161, 154, 158, + 39, 116, 240, 151, 209, 132, 59, 72, 161, 24, 108, 74, 170, 198, 250, 151, + 201, 72, 34, 38, 19, 142, 160, 120, 137, 160, 74, 195, 140, 49, 161, 224, + 200, 14, 174, 87, 17, 250, 163, 10, 122, 78, 247, 137, 107, 56, 162, 51, + 79, 41, 172, 219, 191, 87, 188, 53, 56, 121, 226, 206, 211, 119, 139, 134, + 33, 202, 83, 232, 117, 237, 198, 199, 79, 245, 166, 80, 12, 207, 130, 147, + 73, 95, 6, 63, 207, 41, 149, 67, 49, 126, 191, 124, 30, 48, 6, 44, + 31, 101, 186, 133, 39, 171, 5, 174, 138, 100, 176, 173, 1, 7, 71, 46, + 35, 197, 136, 126, 85, 138, 200, 158, 185, 116, 210, 209, 78, 210, 253, 194, + 144, 2, 5, 38, 133, 153, 121, 2, 172, 225, 233, 249, 87, 23, 231, 47, + 109, 184, 106, 202, 203, 74, 161, 168, 2, 28, 66, 189, 229, 32, 158, 77, + 90, 46, 50, 123, 28, 145, 189, 148, 167, 236, 96, 74, 29, 243, 185, 226, + 91, 42, 160, 216, 208, 1, 97, 238, 203, 103, 80, 227, 9, 104, 6, 188, + 178, 96, 250, 232, 226, 120, 98, 62, 2, 244, 110, 90, 108, 36, 73, 9, + 59, 72, 62, 114, 95, 176, 12, 146, 205, 112, 21, 248, 218, 242, 36, 111, + 158, 118, 219, 127, 235, 79, 197, 82, 157, 222, 96, 84, 237, 110, 146, 244, + 134, 154, 166, 63, 173, 204, 50, 117, 172, 12, 170, 162, 65, 169, 85, 10, + 99, 46, 155, 152, 26, 226, 86, 221, 239, 64, 102, 145, 195, 97, 249, 65, + 93, 222, 68, 73, 47, 229, 78, 239, 227, 220, 198, 201, 30, 69, 235, 12, + 242, 182, 139, 213, 77, 199, 132, 152, 246, 23, 90, 3, 193, 124, 50, 95, + 205, 63, 221, 154, 139, 82, 93, 33, 232, 110, 152, 92, 115, 64, 174, 170, + 214, 44, 95, 7, 114, 179, 81, 228, 199, 156, 186, 254, 88, 181, 60, 218, + 206, 164, 254, 157, 118, 50, 123, 52, 45, 183, 178, 131, 239, 149, 82, 4, + 25, 22, 202, 11, 227, 35, 247, 61, 126, 19, 59, 179, 208, 160, 99, 100, + 223, 70, 184, 141, 41, 22, 160, 240, 230, 236, 138, 212, 236, 148, 174, 68, + 201, 12, 152, 122, 37, 117, 33, 108, 93, 107, 45, 49, 104, 161, 52, 88, + 251, 165, 126, 217, 8, 249, 234, 119, 90, 202, 67, 90, 246, 180, 80, 244, + 174, 78, 40, 188, 12, 133, 37, 62, 2, 145, 248, 146, 238, 103, 240, 119, + 166, 249, 4, 53, 182, 235, 139, 24, 49, 237, 203, 111, 44, 146, 172, 123, + 238, 133, 21, 190, 178, 85, 183, 174, 168, 69, 113, 26, 199, 184, 21, 236, + 178, 135, 190, 238, 129, 60, 108, 169, 78, 174, 26, 70, 35, 74, 119, 3, + 100, 193, 145, 185, 240, 42, 97, 153, 48, 184, 12, 211, 170, 79, 21, 96, + 60, 98, 147, 160, 109, 137, 45, 229, 232, 208, 252, 208, 84, 146, 201, 73, + 145, 52, 116, 150, 160, 109, 206, 55, 194, 102, 80, 69, 205, 195, 242, 90, + 65, 127, 59, 182, 148, 148, 242, 235, 145, 148, 255, 252, 212, 17, 49, 97, + 43, 149, 171, 186, 98, 155, 238, 74, 51, 208, 83, 54, 164, 45, 229, 79, + 205, 49, 185, 107, 51, 222, 147, 150, 250, 77, 221, 212, 31, 16, 204, 210, + 195, 251, 136, 67, 55, 71, 89, 101, 57, 52, 141, 182, 128, 162, 123, 213, + 16, 69, 201, 145, 97, 217, 236, 81, 27, 196, 234, 130, 45, 134, 94, 254, + 205, 177, 203, 14, 160, 54, 198, 189, 22, 178, 119, 49, 21, 27, 38, 164, + 17, 55, 102, 107, 49, 188, 147, 147, 58, 20, 250, 152, 153, 57, 98, 59, + 252, 150, 138, 0, 52, 87, 249, 34, 155, 149, 58, 54, 169, 181, 98, 196, + 131, 201, 171, 72, 62, 111, 77, 227, 142, 11, 233, 102, 17, 227, 23, 209, + 122, 214, 56, 142, 182, 174, 146, 36, 175, 248, 218, 210, 13, 219, 2, 246, + 149, 35, 179, 172, 66, 107, 73, 161, 213, 63, 172, 208, 122, 82, 104, 237, + 15, 42, 242, 52, 41, 82, 212, 197, 178, 138, 157, 198, 29, 77, 95, 242, + 226, 135, 43, 81, 11, 116, 58, 49, 82, 128, 6, 182, 211, 225, 53, 186, + 135, 107, 161, 14, 164, 122, 148, 245, 158, 156, 226, 201, 165, 243, 60, 10, + 169, 119, 170, 216, 131, 215, 9, 55, 86, 212, 40, 51, 57, 176, 41, 49, + 142, 176, 250, 52, 238, 235, 110, 38, 85, 193, 30, 235, 53, 172, 253, 209, + 188, 215, 176, 246, 71, 48, 95, 159, 204, 119, 61, 200, 114, 213, 60, 165, + 100, 126, 159, 64, 107, 211, 164, 176, 52, 103, 163, 36, 172, 141, 10, 120, + 27, 187, 44, 141, 75, 2, 73, 155, 90, 80, 246, 192, 221, 86, 194, 149, + 147, 78, 87, 75, 44, 65, 250, 143, 217, 125, 34, 59, 171, 104, 106, 143, + 8, 43, 236, 52, 253, 241, 49, 216, 233, 234, 222, 80, 204, 215, 3, 209, + 218, 135, 191, 56, 32, 82, 226, 26, 203, 83, 17, 5, 1, 190, 242, 209, + 4, 74, 165, 84, 75, 197, 149, 221, 136, 170, 35, 24, 63, 30, 44, 32, + 43, 171, 20, 189, 75, 56, 14, 206, 160, 198, 31, 71, 116, 13, 97, 195, + 248, 81, 173, 174, 173, 193, 205, 104, 84, 97, 132, 58, 71, 137, 225, 84, + 11, 54, 183, 7, 3, 127, 64, 157, 247, 215, 237, 219, 246, 212, 126, 54, + 215, 234, 151, 131, 32, 25, 162, 254, 154, 3, 126, 182, 110, 115, 91, 103, + 216, 162, 121, 86, 38, 155, 26, 185, 153, 219, 246, 203, 49, 172, 111, 176, + 63, 234, 91, 115, 166, 30, 25, 195, 254, 74, 237, 223, 58, 179, 115, 206, + 96, 49, 108, 249, 237, 222, 116, 60, 108, 53, 20, 53, 158, 86, 171, 54, + 212, 193, 30, 49, 144, 164, 209, 52, 45, 207, 75, 112, 193, 95, 251, 131, + 28, 78, 97, 206, 155, 17, 207, 109, 231, 150, 234, 173, 21, 224, 142, 152, + 106, 182, 103, 127, 229, 220, 86, 91, 92, 0, 188, 203, 221, 182, 6, 128, + 54, 74, 62, 196, 127, 7, 211, 78, 201, 56, 122, 104, 19, 202, 148, 105, + 147, 54, 20, 220, 63, 164, 104, 41, 140, 169, 162, 3, 221, 234, 232, 193, + 86, 211, 26, 27, 205, 238, 32, 102, 210, 159, 205, 233, 244, 111, 13, 245, + 98, 167, 249, 255, 87, 219, 253, 5, 133, 103, 181, 60, 126, 90, 203, 39, + 237, 150, 46, 118, 175, 189, 57, 183, 173, 104, 74, 132, 157, 255, 206, 198, + 31, 42, 95, 10, 73, 213, 160, 110, 47, 220, 129, 136, 221, 54, 61, 80, + 1, 224, 7, 239, 20, 153, 92, 220, 142, 124, 70, 36, 35, 247, 206, 236, + 128, 232, 44, 33, 127, 187, 156, 58, 98, 75, 223, 148, 210, 184, 126, 137, + 216, 25, 212, 3, 53, 49, 32, 164, 189, 247, 64, 69, 129, 85, 13, 165, + 100, 192, 182, 87, 75, 252, 123, 250, 19, 124, 121, 111, 170, 191, 163, 55, + 86, 53, 181, 7, 58, 195, 76, 140, 195, 101, 171, 66, 87, 107, 168, 200, + 233, 115, 46, 50, 90, 207, 109, 195, 120, 72, 129, 121, 99, 221, 3, 242, + 107, 85, 57, 81, 153, 90, 9, 227, 47, 244, 22, 202, 157, 41, 231, 76, + 184, 50, 186, 57, 66, 142, 130, 253, 156, 54, 188, 40, 214, 170, 82, 226, + 205, 239, 50, 82, 62, 19, 114, 47, 31, 81, 114, 114, 251, 74, 153, 137, + 221, 78, 241, 226, 235, 211, 53, 231, 174, 63, 157, 205, 27, 74, 79, 48, + 60, 15, 182, 208, 148, 225, 3, 161, 219, 48, 218, 131, 208, 122, 120, 67, + 159, 207, 240, 130, 83, 220, 164, 81, 198, 113, 146, 146, 2, 74, 72, 199, + 108, 82, 136, 125, 192, 160, 199, 176, 199, 134, 186, 103, 205, 37, 37, 26, + 47, 27, 137, 242, 205, 27, 26, 186, 141, 103, 202, 98, 171, 191, 12, 200, + 181, 124, 15, 186, 76, 152, 8, 91, 25, 198, 248, 5, 226, 78, 181, 200, + 219, 52, 98, 33, 68, 136, 140, 136, 252, 98, 205, 23, 145, 31, 63, 164, + 215, 200, 143, 232, 25, 179, 193, 34, 163, 104, 2, 219, 82, 110, 69, 123, + 195, 171, 184, 43, 253, 106, 22, 93, 98, 7, 224, 179, 90, 113, 49, 182, + 79, 105, 80, 129, 29, 170, 133, 232, 198, 3, 9, 221, 94, 92, 47, 252, + 197, 141, 101, 198, 40, 54, 183, 16, 213, 189, 152, 26, 46, 38, 160, 2, + 101, 152, 255, 138, 29, 27, 106, 44, 85, 22, 71, 203, 253, 44, 103, 175, + 169, 46, 254, 125, 213, 157, 166, 170, 171, 214, 30, 169, 78, 13, 73, 213, + 93, 210, 45, 185, 145, 82, 164, 200, 233, 113, 222, 110, 221, 165, 152, 35, + 161, 52, 110, 50, 131, 144, 82, 7, 226, 41, 147, 44, 168, 55, 196, 195, + 159, 139, 177, 52, 111, 7, 141, 160, 184, 240, 180, 28, 129, 227, 188, 191, + 196, 41, 50, 170, 150, 35, 144, 207, 237, 205, 6, 26, 143, 207, 75, 129, + 27, 48, 26, 6, 218, 191, 189, 180, 65, 217, 19, 71, 75, 12, 221, 192, + 178, 34, 32, 108, 143, 180, 194, 123, 2, 224, 205, 98, 45, 0, 20, 88, + 139, 91, 47, 148, 172, 106, 166, 195, 68, 163, 77, 227, 79, 123, 250, 140, + 102, 147, 102, 90, 234, 120, 116, 203, 46, 161, 240, 40, 138, 140, 107, 8, + 247, 24, 221, 71, 110, 30, 109, 226, 4, 235, 255, 239, 220, 203, 143, 236, + 223, 29, 127, 241, 152, 64, 223, 217, 223, 196, 17, 84, 228, 88, 56, 227, + 176, 158, 162, 161, 224, 42, 107, 226, 33, 212, 92, 249, 2, 33, 118, 120, + 115, 63, 160, 157, 231, 57, 68, 192, 243, 243, 142, 183, 161, 167, 205, 184, + 221, 73, 158, 201, 254, 108, 180, 24, 18, 182, 87, 112, 148, 243, 88, 131, + 218, 18, 142, 58, 234, 204, 218, 116, 83, 133, 109, 143, 214, 104, 190, 236, + 78, 39, 96, 98, 246, 91, 157, 5, 156, 167, 206, 96, 103, 166, 235, 19, + 218, 62, 31, 116, 111, 91, 235, 214, 124, 64, 119, 14, 236, 75, 127, 222, + 235, 14, 161, 156, 63, 104, 249, 178, 184, 102, 99, 42, 134, 253, 51, 207, + 91, 163, 238, 120, 49, 27, 172, 125, 120, 38, 159, 182, 250, 243, 78, 119, + 216, 157, 127, 166, 53, 208, 157, 250, 247, 180, 192, 231, 203, 214, 167, 174, + 63, 251, 184, 160, 245, 50, 91, 246, 231, 189, 246, 120, 4, 235, 244, 211, + 126, 91, 8, 16, 51, 127, 221, 29, 12, 198, 75, 90, 70, 183, 3, 106, + 65, 135, 242, 244, 168, 58, 154, 153, 174, 79, 55, 149, 94, 151, 59, 60, + 190, 251, 208, 234, 79, 199, 139, 214, 200, 31, 195, 155, 233, 188, 53, 152, + 96, 77, 46, 166, 132, 74, 79, 59, 180, 49, 71, 173, 123, 138, 105, 249, + 32, 141, 76, 122, 227, 209, 58, 242, 169, 204, 101, 139, 144, 180, 246, 88, + 186, 241, 161, 63, 155, 249, 108, 204, 121, 214, 199, 30, 166, 120, 169, 156, + 107, 166, 47, 144, 86, 169, 217, 173, 53, 191, 204, 90, 163, 251, 254, 120, + 74, 127, 195, 214, 61, 222, 168, 105, 157, 197, 236, 131, 207, 210, 120, 131, + 62, 213, 51, 30, 117, 124, 90, 252, 173, 57, 141, 95, 251, 195, 140, 102, + 113, 124, 55, 91, 12, 135, 212, 123, 0, 165, 214, 208, 95, 116, 70, 125, + 26, 215, 238, 12, 14, 130, 251, 51, 170, 142, 94, 91, 159, 250, 247, 35, + 130, 33, 179, 46, 236, 149, 45, 169, 252, 145, 15, 215, 213, 211, 79, 227, + 254, 180, 71, 67, 217, 234, 116, 187, 183, 211, 49, 53, 118, 244, 9, 226, + 153, 52, 102, 190, 148, 59, 239, 15, 187, 207, 91, 116, 83, 1, 57, 230, + 118, 48, 158, 205, 198, 116, 5, 156, 82, 201, 51, 31, 228, 135, 233, 122, + 196, 174, 66, 185, 85, 119, 253, 238, 160, 195, 163, 14, 83, 30, 57, 229, + 122, 129, 23, 7, 221, 37, 196, 51, 233, 174, 127, 120, 241, 230, 203, 131, + 222, 244, 16, 195, 238, 225, 121, 117, 37, 14, 131, 83, 46, 130, 247, 28, + 161, 103, 57, 83, 223, 41, 48, 237, 64, 93, 160, 211, 167, 110, 123, 14, + 53, 234, 195, 2, 180, 137, 18, 33, 219, 64, 133, 154, 97, 40, 42, 222, + 204, 73, 233, 208, 177, 227, 54, 220, 114, 120, 65, 240, 151, 95, 181, 134, + 218, 72, 244, 211, 74, 165, 209, 101, 227, 204, 103, 169, 50, 236, 175, 17, + 109, 123, 38, 186, 148, 69, 229, 213, 23, 23, 5, 31, 237, 232, 178, 138, + 80, 196, 114, 138, 238, 128, 165, 241, 107, 126, 226, 127, 212, 10, 171, 5, + 183, 236, 246, 11, 239, 35, 225, 70, 116, 174, 208, 16, 95, 181, 166, 99, + 26, 51, 242, 71, 236, 63, 162, 144, 83, 4, 74, 155, 212, 153, 166, 76, + 238, 12, 197, 163, 215, 235, 221, 161, 219, 211, 104, 156, 182, 224, 221, 224, + 255, 97, 239, 77, 219, 27, 57, 142, 116, 209, 239, 248, 21, 213, 112, 113, + 26, 75, 1, 172, 5, 107, 179, 65, 61, 110, 205, 113, 91, 247, 76, 247, + 245, 105, 219, 26, 233, 82, 36, 12, 2, 32, 81, 34, 22, 170, 0, 146, + 64, 195, 184, 191, 253, 198, 27, 145, 89, 149, 181, 128, 164, 228, 153, 115, + 61, 231, 25, 181, 136, 202, 53, 114, 207, 140, 204, 140, 124, 35, 140, 10, + 32, 171, 51, 135, 12, 73, 80, 94, 193, 106, 249, 189, 127, 18, 226, 229, + 23, 73, 73, 186, 217, 44, 93, 211, 4, 115, 71, 3, 157, 124, 55, 41, + 49, 163, 82, 140, 203, 148, 200, 236, 106, 205, 196, 12, 125, 84, 98, 205, + 205, 144, 140, 226, 175, 127, 34, 218, 230, 2, 216, 249, 65, 117, 141, 197, + 125, 4, 101, 175, 84, 215, 135, 221, 167, 252, 16, 163, 110, 7, 120, 43, + 28, 159, 234, 148, 70, 147, 159, 105, 173, 82, 203, 183, 8, 202, 121, 7, + 199, 128, 207, 51, 240, 242, 146, 219, 6, 129, 67, 244, 75, 75, 140, 233, + 166, 64, 59, 224, 232, 89, 229, 201, 235, 224, 4, 24, 226, 65, 10, 58, + 83, 7, 52, 195, 197, 193, 16, 10, 208, 21, 129, 10, 101, 4, 210, 97, + 16, 4, 103, 220, 45, 8, 174, 46, 113, 64, 223, 82, 135, 10, 82, 56, + 226, 95, 168, 220, 23, 141, 142, 211, 8, 46, 89, 163, 53, 243, 233, 49, + 64, 95, 61, 198, 137, 138, 159, 220, 135, 74, 90, 56, 135, 107, 197, 165, + 238, 89, 217, 135, 45, 228, 70, 25, 232, 59, 54, 20, 56, 159, 56, 10, + 98, 93, 179, 30, 190, 111, 138, 47, 177, 139, 135, 86, 187, 95, 79, 31, + 38, 216, 37, 239, 224, 34, 136, 99, 217, 214, 127, 177, 27, 165, 251, 74, + 254, 236, 136, 230, 199, 112, 206, 135, 148, 137, 217, 0, 86, 167, 182, 203, + 31, 90, 166, 186, 88, 233, 20, 157, 29, 153, 207, 221, 49, 64, 255, 110, + 161, 43, 176, 48, 93, 217, 12, 205, 214, 143, 178, 229, 187, 44, 165, 183, + 80, 154, 237, 82, 153, 122, 249, 152, 44, 201, 126, 246, 25, 246, 108, 20, + 209, 58, 246, 242, 248, 229, 67, 66, 89, 228, 166, 195, 248, 121, 59, 77, + 60, 57, 200, 90, 185, 155, 72, 41, 76, 239, 88, 49, 127, 77, 188, 29, + 183, 126, 51, 185, 202, 96, 141, 197, 114, 71, 72, 35, 169, 22, 28, 32, + 251, 107, 62, 207, 177, 234, 97, 100, 177, 188, 36, 211, 17, 8, 109, 13, + 98, 246, 6, 32, 124, 2, 79, 192, 226, 235, 141, 191, 151, 234, 53, 185, + 189, 129, 54, 118, 49, 121, 162, 82, 212, 238, 151, 146, 75, 42, 43, 37, + 159, 105, 105, 73, 58, 12, 17, 95, 131, 190, 100, 1, 166, 143, 61, 85, + 210, 213, 248, 10, 85, 158, 170, 190, 115, 13, 129, 76, 96, 84, 132, 208, + 177, 131, 199, 249, 143, 38, 92, 117, 107, 32, 15, 20, 240, 219, 129, 62, + 97, 102, 77, 177, 51, 92, 50, 194, 105, 246, 136, 146, 246, 57, 208, 180, + 234, 250, 45, 199, 119, 91, 61, 168, 140, 192, 219, 138, 242, 197, 199, 242, + 254, 111, 65, 255, 111, 135, 50, 191, 11, 255, 86, 165, 42, 72, 199, 253, + 193, 160, 161, 177, 123, 123, 111, 6, 79, 202, 216, 127, 51, 152, 89, 184, + 23, 192, 99, 221, 77, 180, 154, 15, 89, 24, 121, 61, 144, 87, 185, 69, + 62, 80, 131, 204, 96, 1, 212, 32, 200, 41, 107, 244, 187, 39, 134, 112, + 179, 153, 122, 196, 88, 207, 47, 46, 75, 46, 35, 124, 149, 237, 86, 217, + 154, 110, 137, 111, 223, 98, 83, 129, 124, 172, 1, 250, 117, 241, 214, 38, + 215, 183, 151, 206, 219, 219, 251, 249, 91, 94, 43, 171, 56, 102, 166, 221, + 11, 57, 72, 180, 20, 81, 158, 2, 212, 233, 45, 109, 78, 228, 0, 151, + 10, 101, 6, 74, 199, 184, 144, 93, 192, 165, 168, 129, 142, 61, 252, 76, + 254, 218, 191, 45, 127, 237, 84, 254, 252, 215, 228, 207, 79, 199, 200, 230, + 143, 102, 187, 235, 235, 105, 148, 201, 94, 39, 157, 61, 113, 145, 117, 205, + 50, 99, 121, 199, 18, 87, 1, 82, 129, 205, 164, 227, 237, 141, 86, 130, + 104, 239, 147, 238, 138, 153, 226, 39, 158, 20, 205, 13, 174, 239, 164, 170, + 61, 101, 83, 126, 42, 165, 131, 198, 206, 112, 27, 123, 251, 51, 146, 148, + 73, 158, 113, 83, 50, 120, 167, 241, 172, 179, 95, 179, 90, 137, 53, 134, + 142, 137, 23, 202, 49, 207, 7, 126, 46, 102, 189, 40, 106, 90, 139, 44, + 164, 106, 113, 17, 158, 208, 83, 212, 2, 53, 17, 42, 93, 125, 158, 28, + 95, 118, 156, 158, 218, 255, 170, 23, 75, 201, 221, 130, 212, 82, 213, 82, + 181, 213, 224, 134, 127, 176, 98, 13, 143, 162, 98, 145, 181, 43, 162, 23, + 203, 183, 173, 190, 29, 254, 178, 110, 198, 61, 96, 202, 102, 7, 14, 45, + 180, 126, 58, 58, 83, 20, 0, 140, 231, 102, 12, 22, 6, 46, 186, 137, + 254, 188, 178, 148, 249, 167, 165, 101, 141, 30, 169, 147, 0, 104, 179, 236, + 56, 229, 202, 183, 50, 174, 229, 249, 193, 218, 162, 157, 21, 237, 184, 38, + 196, 106, 254, 99, 5, 106, 80, 76, 97, 235, 211, 155, 99, 218, 25, 203, + 218, 22, 77, 117, 49, 147, 149, 137, 114, 80, 177, 223, 156, 250, 85, 5, + 62, 74, 61, 241, 220, 81, 90, 218, 4, 224, 113, 0, 217, 136, 115, 17, + 145, 96, 103, 60, 213, 187, 176, 215, 151, 162, 151, 215, 144, 18, 144, 229, + 66, 177, 127, 205, 82, 252, 204, 34, 181, 232, 53, 69, 250, 58, 190, 27, + 99, 45, 193, 208, 95, 44, 103, 170, 61, 109, 79, 58, 18, 152, 29, 163, + 91, 65, 118, 164, 142, 175, 194, 15, 78, 11, 161, 52, 69, 227, 125, 10, + 211, 88, 75, 128, 91, 120, 120, 236, 229, 113, 7, 132, 53, 101, 225, 26, + 57, 238, 26, 12, 20, 56, 178, 70, 67, 214, 239, 183, 88, 22, 147, 150, + 211, 158, 43, 15, 199, 58, 34, 209, 154, 96, 23, 227, 180, 183, 231, 51, + 251, 171, 111, 231, 154, 90, 99, 12, 217, 137, 249, 16, 190, 152, 184, 20, + 63, 203, 165, 120, 228, 24, 164, 29, 113, 193, 28, 115, 46, 162, 83, 51, + 230, 96, 4, 59, 94, 224, 123, 98, 72, 217, 184, 133, 211, 168, 182, 70, + 203, 243, 46, 97, 203, 124, 221, 83, 166, 67, 152, 224, 9, 121, 244, 22, + 245, 216, 198, 5, 72, 101, 191, 209, 240, 15, 172, 39, 177, 5, 137, 35, + 5, 122, 151, 210, 126, 152, 60, 207, 241, 160, 93, 145, 136, 92, 153, 191, + 10, 253, 169, 106, 190, 226, 169, 48, 28, 212, 85, 246, 55, 29, 44, 0, + 181, 86, 203, 241, 0, 42, 222, 10, 28, 175, 223, 113, 252, 86, 11, 100, + 93, 167, 7, 247, 190, 227, 209, 215, 15, 144, 84, 27, 65, 187, 20, 170, + 133, 53, 59, 166, 151, 253, 171, 202, 49, 21, 81, 14, 218, 253, 43, 42, + 14, 255, 105, 79, 148, 19, 179, 147, 232, 48, 13, 226, 23, 63, 170, 33, + 226, 39, 57, 234, 173, 176, 155, 14, 239, 37, 175, 136, 189, 12, 37, 67, + 63, 124, 218, 167, 157, 240, 254, 130, 94, 108, 122, 118, 226, 87, 8, 160, + 168, 51, 147, 116, 175, 25, 110, 194, 105, 143, 189, 61, 125, 138, 179, 104, + 188, 97, 144, 241, 203, 88, 91, 201, 22, 61, 187, 179, 130, 148, 130, 218, + 108, 140, 238, 21, 48, 151, 20, 51, 221, 111, 94, 222, 14, 152, 157, 140, + 113, 43, 210, 44, 26, 96, 247, 110, 194, 249, 124, 40, 80, 182, 69, 23, + 235, 197, 170, 235, 194, 245, 144, 133, 134, 6, 251, 53, 85, 223, 223, 255, + 78, 191, 74, 46, 65, 251, 88, 49, 178, 118, 28, 52, 92, 188, 247, 252, + 222, 191, 252, 75, 248, 233, 156, 190, 7, 253, 88, 43, 21, 43, 89, 215, + 228, 81, 1, 223, 255, 54, 149, 2, 84, 150, 115, 195, 2, 165, 155, 103, + 30, 171, 246, 36, 6, 177, 85, 186, 161, 165, 131, 38, 204, 171, 134, 253, + 254, 192, 144, 249, 26, 72, 45, 198, 200, 69, 8, 72, 165, 1, 72, 63, + 237, 57, 75, 60, 235, 194, 142, 39, 202, 36, 169, 129, 229, 162, 34, 247, + 6, 214, 193, 5, 123, 29, 162, 76, 252, 138, 167, 223, 199, 19, 85, 175, + 122, 56, 225, 82, 169, 147, 238, 53, 206, 13, 253, 237, 133, 88, 161, 44, + 94, 155, 154, 140, 68, 47, 54, 121, 113, 245, 104, 188, 117, 49, 158, 211, + 57, 188, 135, 183, 104, 214, 43, 66, 139, 7, 219, 164, 210, 226, 185, 168, + 158, 0, 70, 9, 13, 42, 40, 235, 133, 219, 151, 255, 52, 184, 216, 126, + 114, 118, 159, 46, 207, 68, 223, 228, 159, 170, 196, 31, 43, 197, 28, 231, + 94, 233, 28, 91, 255, 160, 182, 254, 37, 162, 133, 41, 168, 30, 146, 125, + 113, 97, 242, 74, 145, 130, 12, 64, 158, 170, 63, 83, 51, 127, 18, 122, + 159, 75, 64, 202, 87, 64, 189, 233, 7, 129, 78, 249, 252, 226, 231, 74, + 131, 159, 22, 62, 84, 188, 128, 70, 186, 223, 174, 58, 15, 21, 86, 35, + 201, 134, 102, 139, 140, 253, 234, 101, 185, 148, 12, 116, 65, 195, 82, 239, + 6, 237, 84, 209, 212, 185, 19, 58, 133, 249, 74, 73, 79, 209, 188, 171, + 138, 59, 89, 90, 203, 9, 95, 159, 53, 99, 149, 246, 197, 106, 80, 240, + 154, 2, 202, 251, 84, 203, 149, 211, 167, 80, 217, 113, 244, 140, 238, 159, + 162, 81, 39, 144, 215, 106, 171, 121, 215, 84, 26, 156, 30, 149, 112, 144, + 153, 177, 244, 22, 77, 79, 3, 58, 213, 245, 66, 198, 240, 240, 184, 167, + 93, 195, 90, 193, 53, 121, 156, 68, 246, 218, 35, 209, 216, 114, 252, 230, + 35, 1, 107, 180, 112, 142, 42, 253, 145, 152, 143, 21, 241, 88, 137, 162, + 121, 39, 209, 52, 175, 146, 230, 59, 34, 125, 133, 25, 107, 142, 215, 80, + 158, 47, 39, 171, 208, 34, 37, 185, 172, 94, 251, 215, 37, 167, 110, 8, + 142, 213, 152, 168, 124, 115, 249, 2, 76, 163, 251, 30, 173, 250, 130, 250, + 210, 215, 185, 71, 106, 72, 193, 146, 189, 54, 211, 197, 149, 19, 167, 241, + 15, 84, 7, 95, 142, 135, 75, 41, 155, 232, 145, 36, 110, 139, 152, 133, + 4, 65, 0, 128, 179, 114, 127, 196, 170, 39, 162, 219, 159, 104, 226, 125, + 243, 6, 155, 165, 247, 142, 108, 143, 231, 124, 249, 178, 190, 228, 91, 39, + 85, 59, 114, 87, 229, 241, 13, 150, 232, 66, 77, 175, 39, 114, 95, 163, + 2, 95, 30, 88, 5, 167, 233, 98, 41, 131, 92, 190, 157, 51, 246, 163, + 190, 193, 87, 164, 221, 119, 30, 226, 141, 7, 114, 93, 165, 166, 212, 101, + 66, 75, 79, 185, 106, 145, 85, 235, 206, 27, 236, 134, 128, 40, 220, 80, + 107, 243, 133, 78, 243, 117, 75, 92, 51, 183, 198, 125, 106, 132, 139, 243, + 78, 171, 120, 117, 75, 36, 122, 17, 77, 86, 53, 3, 238, 79, 173, 118, + 136, 134, 137, 152, 38, 179, 90, 197, 107, 216, 254, 137, 82, 176, 170, 250, + 74, 105, 200, 175, 189, 238, 166, 177, 22, 77, 187, 129, 187, 192, 67, 233, + 66, 133, 160, 98, 206, 113, 170, 117, 77, 148, 35, 72, 78, 19, 207, 232, + 181, 14, 162, 143, 51, 105, 95, 136, 1, 11, 40, 249, 244, 73, 227, 152, + 113, 134, 153, 92, 169, 174, 164, 175, 98, 162, 234, 33, 182, 218, 99, 148, + 234, 141, 11, 35, 226, 165, 149, 4, 212, 98, 212, 126, 26, 97, 221, 193, + 142, 133, 101, 203, 218, 151, 217, 231, 158, 94, 250, 169, 103, 124, 177, 23, + 151, 178, 106, 221, 92, 196, 150, 75, 171, 28, 191, 76, 104, 120, 78, 229, + 187, 42, 191, 247, 80, 202, 136, 161, 65, 167, 205, 234, 116, 46, 241, 86, + 29, 100, 141, 152, 188, 195, 5, 126, 193, 106, 49, 221, 68, 187, 88, 98, + 7, 188, 178, 86, 234, 108, 235, 238, 162, 39, 124, 71, 27, 74, 55, 241, + 234, 93, 14, 245, 171, 249, 223, 191, 167, 244, 168, 15, 130, 63, 168, 124, + 113, 62, 214, 33, 176, 240, 129, 126, 59, 252, 86, 62, 245, 46, 222, 171, + 211, 2, 201, 203, 224, 94, 245, 82, 0, 32, 148, 4, 250, 64, 144, 14, + 194, 203, 250, 224, 2, 111, 238, 181, 192, 81, 185, 74, 75, 249, 37, 72, + 97, 251, 226, 236, 27, 136, 98, 157, 198, 103, 214, 243, 116, 67, 212, 88, + 245, 141, 197, 186, 37, 189, 19, 230, 28, 60, 40, 135, 149, 83, 146, 244, + 214, 76, 144, 64, 173, 204, 211, 222, 55, 54, 139, 234, 104, 138, 178, 206, + 255, 156, 52, 112, 58, 61, 13, 155, 151, 248, 67, 30, 61, 182, 52, 136, + 9, 255, 37, 29, 195, 141, 177, 2, 50, 238, 234, 85, 114, 186, 159, 90, + 90, 195, 78, 46, 176, 117, 222, 204, 5, 174, 153, 161, 52, 207, 29, 23, + 250, 72, 151, 21, 108, 238, 184, 188, 122, 127, 220, 196, 178, 51, 1, 179, + 147, 138, 199, 56, 170, 189, 83, 224, 176, 25, 59, 77, 65, 29, 48, 195, + 149, 244, 224, 82, 220, 89, 50, 119, 255, 83, 86, 230, 118, 55, 188, 190, + 29, 236, 21, 135, 120, 248, 207, 170, 92, 141, 63, 19, 15, 164, 245, 44, + 54, 26, 155, 169, 158, 28, 27, 200, 147, 7, 61, 161, 155, 244, 249, 86, + 80, 33, 169, 102, 72, 32, 122, 178, 59, 164, 53, 64, 123, 166, 26, 227, + 159, 180, 79, 255, 111, 106, 6, 206, 109, 62, 171, 245, 68, 90, 51, 229, + 183, 55, 83, 188, 0, 51, 79, 19, 44, 139, 84, 39, 23, 32, 56, 157, + 87, 183, 32, 45, 151, 57, 0, 20, 100, 251, 41, 253, 226, 197, 87, 90, + 123, 228, 77, 236, 69, 72, 236, 190, 231, 8, 12, 17, 84, 208, 1, 47, + 159, 156, 176, 159, 242, 219, 190, 99, 211, 126, 0, 231, 0, 112, 38, 190, + 91, 182, 216, 110, 12, 41, 18, 168, 83, 160, 217, 58, 148, 3, 173, 68, + 187, 149, 45, 106, 11, 60, 200, 115, 39, 186, 195, 100, 23, 81, 210, 187, + 8, 201, 100, 178, 125, 136, 97, 73, 210, 59, 138, 116, 93, 196, 221, 42, + 229, 106, 244, 45, 37, 191, 163, 249, 31, 59, 102, 96, 18, 198, 197, 54, + 130, 243, 113, 79, 6, 7, 183, 44, 24, 182, 215, 200, 46, 45, 226, 180, + 202, 120, 103, 165, 255, 11, 107, 66, 18, 177, 236, 120, 213, 55, 131, 239, + 50, 142, 252, 172, 51, 23, 210, 45, 14, 91, 46, 21, 194, 171, 36, 192, + 42, 99, 246, 142, 33, 163, 143, 111, 141, 162, 233, 45, 152, 201, 9, 77, + 114, 139, 16, 61, 145, 90, 11, 151, 165, 123, 93, 122, 94, 230, 66, 227, + 92, 153, 248, 181, 170, 149, 39, 152, 102, 216, 210, 251, 174, 226, 221, 89, + 134, 93, 84, 167, 215, 204, 198, 52, 188, 23, 55, 127, 153, 216, 230, 126, + 75, 14, 15, 33, 4, 21, 51, 176, 151, 41, 150, 46, 195, 224, 160, 34, + 121, 194, 146, 167, 75, 28, 4, 200, 216, 250, 120, 40, 169, 100, 95, 115, + 83, 250, 136, 35, 127, 118, 239, 31, 112, 254, 203, 216, 24, 49, 147, 168, + 20, 84, 199, 248, 93, 124, 82, 177, 142, 209, 82, 75, 20, 97, 173, 117, + 235, 233, 100, 227, 84, 145, 168, 230, 224, 18, 4, 48, 123, 29, 235, 136, + 137, 229, 175, 133, 1, 44, 228, 93, 51, 181, 101, 28, 211, 100, 124, 110, + 66, 149, 143, 180, 123, 105, 153, 165, 208, 147, 195, 28, 153, 232, 77, 63, + 39, 213, 17, 116, 187, 148, 234, 235, 233, 124, 58, 86, 231, 101, 23, 154, + 143, 83, 66, 216, 250, 79, 41, 222, 251, 57, 147, 88, 18, 220, 228, 60, + 173, 187, 76, 30, 147, 90, 240, 74, 119, 169, 254, 152, 0, 227, 255, 199, + 215, 140, 238, 109, 233, 208, 191, 169, 73, 45, 221, 158, 175, 173, 213, 92, + 21, 188, 116, 218, 160, 54, 187, 216, 125, 26, 66, 139, 34, 37, 105, 73, + 11, 225, 250, 22, 135, 80, 114, 149, 97, 58, 137, 200, 46, 46, 50, 180, + 235, 101, 172, 108, 192, 84, 12, 18, 61, 154, 122, 61, 228, 89, 164, 161, + 184, 131, 117, 193, 32, 16, 30, 123, 106, 222, 221, 189, 204, 222, 121, 200, + 133, 197, 155, 180, 38, 198, 24, 100, 74, 41, 140, 76, 214, 61, 129, 178, + 224, 121, 35, 172, 184, 213, 243, 16, 88, 81, 90, 181, 52, 147, 162, 6, + 196, 92, 120, 205, 82, 52, 230, 93, 135, 90, 25, 248, 224, 75, 221, 250, + 185, 74, 91, 130, 62, 207, 17, 177, 215, 184, 218, 169, 206, 49, 71, 169, + 171, 190, 68, 185, 2, 5, 135, 151, 155, 248, 248, 202, 7, 206, 70, 132, + 0, 135, 134, 84, 161, 57, 143, 150, 190, 34, 98, 15, 95, 239, 115, 2, + 117, 108, 64, 142, 231, 124, 241, 10, 19, 85, 7, 16, 247, 226, 94, 85, + 233, 180, 219, 65, 135, 111, 5, 189, 106, 44, 90, 13, 177, 151, 82, 248, + 105, 176, 167, 45, 138, 58, 228, 11, 63, 157, 99, 167, 168, 244, 82, 134, + 159, 44, 57, 55, 8, 215, 7, 45, 140, 160, 60, 160, 39, 161, 158, 121, + 226, 201, 239, 198, 32, 133, 97, 106, 165, 204, 232, 163, 228, 253, 169, 13, + 170, 40, 128, 130, 64, 226, 84, 45, 81, 194, 198, 154, 50, 37, 139, 239, + 41, 135, 39, 124, 130, 169, 110, 202, 12, 221, 153, 150, 206, 227, 123, 35, + 139, 217, 12, 161, 122, 37, 75, 214, 171, 178, 20, 191, 114, 211, 250, 46, + 77, 69, 151, 203, 100, 78, 85, 202, 250, 114, 167, 70, 169, 107, 162, 220, + 0, 179, 61, 65, 62, 148, 231, 138, 147, 112, 51, 155, 66, 248, 179, 224, + 84, 177, 72, 178, 37, 185, 94, 40, 190, 95, 184, 198, 227, 239, 132, 168, + 240, 32, 74, 62, 162, 109, 157, 22, 203, 248, 248, 250, 29, 113, 75, 180, + 11, 177, 220, 136, 190, 18, 59, 138, 198, 148, 164, 242, 10, 100, 238, 184, + 148, 57, 76, 238, 37, 13, 78, 136, 144, 148, 110, 146, 119, 107, 173, 248, + 57, 0, 180, 244, 70, 131, 189, 125, 83, 171, 184, 77, 168, 198, 172, 102, + 144, 47, 223, 95, 150, 126, 141, 110, 56, 212, 71, 207, 82, 122, 78, 230, + 185, 89, 69, 42, 25, 240, 138, 114, 7, 204, 16, 115, 50, 135, 181, 172, + 72, 33, 94, 222, 28, 68, 57, 158, 152, 98, 205, 113, 124, 125, 116, 238, + 154, 196, 75, 163, 5, 49, 122, 155, 193, 158, 50, 223, 174, 219, 126, 213, + 56, 118, 107, 163, 173, 162, 24, 247, 212, 142, 120, 251, 73, 220, 129, 134, + 61, 21, 20, 30, 141, 86, 224, 42, 236, 102, 84, 133, 13, 209, 0, 124, + 91, 135, 210, 249, 128, 115, 5, 110, 248, 36, 62, 21, 71, 62, 74, 169, + 59, 92, 12, 146, 107, 30, 41, 129, 245, 158, 191, 93, 8, 69, 73, 255, + 214, 247, 108, 239, 93, 75, 109, 95, 100, 23, 110, 113, 34, 157, 26, 30, + 183, 171, 107, 53, 42, 223, 0, 72, 245, 199, 194, 177, 47, 8, 10, 148, + 125, 92, 115, 10, 78, 207, 192, 210, 211, 253, 73, 31, 255, 81, 133, 121, + 133, 173, 113, 180, 95, 188, 212, 44, 49, 8, 230, 181, 100, 176, 79, 156, + 87, 22, 80, 212, 202, 231, 49, 134, 252, 139, 207, 71, 93, 117, 94, 0, + 208, 8, 214, 62, 214, 115, 149, 122, 17, 189, 112, 227, 21, 81, 93, 68, + 31, 101, 53, 129, 34, 87, 26, 72, 117, 5, 223, 96, 12, 168, 76, 233, + 229, 165, 4, 43, 10, 164, 13, 193, 29, 20, 5, 38, 202, 4, 19, 149, + 129, 75, 89, 212, 148, 143, 193, 58, 155, 129, 178, 139, 187, 26, 91, 199, + 238, 45, 222, 95, 22, 13, 215, 229, 194, 186, 89, 173, 44, 99, 104, 218, + 181, 156, 102, 66, 99, 12, 167, 33, 233, 241, 168, 131, 54, 186, 175, 156, + 205, 52, 230, 69, 90, 193, 175, 185, 171, 108, 9, 70, 12, 228, 138, 199, + 111, 6, 45, 39, 116, 74, 95, 32, 76, 28, 86, 182, 180, 85, 221, 129, + 213, 99, 233, 227, 202, 86, 89, 206, 74, 95, 118, 226, 239, 236, 120, 51, + 155, 247, 135, 52, 244, 151, 237, 149, 111, 213, 173, 47, 59, 72, 45, 127, + 76, 83, 244, 204, 24, 144, 120, 254, 152, 166, 152, 247, 7, 197, 143, 66, + 241, 35, 83, 252, 144, 166, 232, 155, 49, 128, 167, 243, 33, 77, 49, 239, + 15, 138, 31, 132, 226, 7, 166, 8, 7, 111, 218, 104, 147, 3, 54, 213, + 95, 150, 206, 199, 165, 243, 97, 89, 189, 42, 51, 180, 96, 249, 172, 4, + 29, 41, 44, 242, 141, 202, 250, 178, 60, 31, 80, 182, 136, 39, 128, 233, + 195, 18, 138, 63, 132, 124, 80, 229, 226, 159, 46, 207, 44, 138, 49, 248, + 178, 59, 133, 39, 69, 249, 72, 1, 191, 112, 148, 143, 69, 81, 62, 198, + 81, 62, 74, 20, 211, 243, 67, 236, 249, 129, 60, 1, 49, 67, 102, 72, + 122, 39, 109, 25, 80, 91, 166, 54, 60, 225, 8, 219, 160, 112, 116, 224, + 227, 79, 57, 42, 13, 165, 30, 26, 186, 105, 203, 220, 252, 161, 174, 29, + 145, 68, 7, 170, 103, 124, 162, 60, 31, 129, 31, 97, 109, 106, 208, 150, + 20, 133, 203, 59, 209, 146, 204, 99, 47, 28, 37, 74, 182, 98, 149, 236, + 9, 22, 161, 167, 145, 236, 51, 75, 105, 0, 36, 244, 226, 85, 47, 238, + 225, 47, 171, 93, 136, 199, 66, 118, 205, 67, 30, 159, 70, 235, 217, 235, + 6, 137, 32, 7, 179, 88, 108, 83, 33, 129, 186, 49, 208, 35, 191, 141, + 131, 80, 99, 184, 124, 208, 162, 101, 208, 92, 108, 29, 193, 108, 238, 184, + 49, 4, 56, 205, 164, 130, 125, 19, 36, 80, 205, 174, 130, 106, 54, 132, + 33, 114, 183, 227, 190, 0, 68, 183, 180, 8, 116, 162, 92, 161, 224, 42, + 61, 27, 216, 98, 150, 104, 185, 137, 70, 84, 223, 235, 167, 133, 224, 203, + 53, 219, 158, 111, 234, 104, 40, 2, 166, 102, 20, 158, 88, 227, 161, 104, + 166, 63, 142, 20, 153, 136, 68, 223, 23, 72, 68, 43, 134, 232, 255, 87, + 169, 232, 251, 215, 10, 69, 223, 31, 147, 137, 22, 143, 161, 126, 123, 244, + 218, 73, 183, 126, 109, 249, 39, 244, 203, 215, 208, 147, 240, 145, 86, 54, + 165, 158, 62, 190, 179, 50, 59, 41, 159, 92, 120, 157, 110, 130, 215, 210, + 114, 252, 166, 47, 88, 221, 2, 21, 94, 202, 234, 51, 105, 90, 180, 251, + 15, 124, 234, 97, 189, 62, 158, 122, 82, 107, 121, 205, 150, 32, 22, 213, + 13, 72, 8, 22, 61, 131, 152, 88, 207, 101, 101, 214, 120, 29, 233, 10, + 22, 120, 71, 61, 19, 197, 215, 111, 171, 174, 233, 150, 140, 205, 150, 44, + 151, 165, 130, 237, 151, 129, 244, 206, 238, 26, 0, 158, 88, 238, 172, 84, + 191, 163, 214, 32, 171, 126, 51, 102, 93, 57, 93, 141, 222, 177, 94, 221, + 108, 56, 226, 179, 93, 204, 168, 253, 87, 54, 164, 217, 94, 121, 81, 254, + 209, 226, 254, 117, 173, 88, 196, 163, 118, 179, 48, 224, 194, 254, 240, 171, + 10, 75, 97, 6, 123, 214, 106, 179, 126, 128, 232, 147, 108, 224, 137, 127, + 164, 245, 67, 113, 73, 64, 126, 234, 50, 135, 229, 85, 153, 203, 116, 99, + 84, 172, 68, 112, 77, 41, 202, 24, 63, 68, 196, 27, 168, 167, 65, 46, + 37, 21, 56, 94, 151, 2, 248, 125, 125, 88, 19, 231, 41, 197, 252, 137, + 164, 124, 130, 113, 114, 4, 96, 3, 53, 241, 138, 247, 2, 168, 175, 66, + 17, 245, 231, 85, 15, 22, 212, 168, 58, 139, 17, 173, 27, 224, 231, 18, + 245, 109, 44, 199, 200, 44, 47, 113, 190, 87, 96, 161, 117, 85, 28, 145, + 178, 207, 102, 224, 101, 113, 251, 92, 150, 179, 133, 146, 74, 159, 141, 230, + 147, 241, 252, 97, 99, 200, 207, 250, 144, 153, 101, 188, 67, 32, 210, 235, + 231, 108, 101, 219, 47, 151, 136, 26, 235, 210, 114, 174, 35, 116, 228, 229, + 148, 223, 255, 201, 228, 235, 48, 218, 132, 51, 123, 192, 67, 191, 205, 67, + 36, 175, 122, 227, 225, 49, 192, 34, 216, 63, 196, 88, 151, 47, 189, 145, + 53, 116, 107, 138, 28, 196, 31, 41, 167, 223, 254, 219, 95, 255, 98, 8, + 42, 100, 223, 193, 162, 32, 10, 207, 246, 27, 136, 113, 67, 142, 64, 118, + 255, 177, 208, 184, 111, 10, 141, 243, 121, 192, 124, 245, 52, 141, 160, 232, + 51, 150, 108, 175, 14, 6, 111, 199, 15, 215, 211, 183, 150, 136, 181, 195, + 204, 81, 245, 123, 60, 54, 167, 211, 132, 208, 184, 150, 51, 47, 44, 207, + 159, 181, 90, 210, 164, 32, 186, 110, 105, 145, 131, 122, 209, 135, 229, 36, + 17, 109, 73, 158, 102, 43, 73, 5, 74, 198, 9, 63, 157, 51, 106, 192, + 233, 69, 236, 38, 203, 137, 26, 5, 73, 101, 15, 244, 107, 6, 195, 201, + 212, 129, 142, 208, 231, 111, 6, 49, 153, 194, 78, 156, 130, 17, 225, 215, + 187, 73, 207, 188, 9, 147, 67, 141, 227, 84, 235, 139, 209, 61, 155, 152, + 186, 153, 235, 159, 217, 197, 132, 113, 214, 125, 235, 68, 203, 68, 232, 231, + 187, 70, 180, 44, 95, 101, 116, 67, 59, 238, 135, 182, 116, 68, 27, 61, + 209, 54, 186, 98, 242, 174, 198, 168, 20, 255, 249, 122, 42, 170, 150, 101, + 140, 228, 145, 29, 168, 97, 126, 92, 21, 200, 167, 251, 90, 38, 221, 59, + 214, 247, 19, 185, 244, 68, 40, 61, 5, 227, 96, 118, 252, 226, 241, 159, + 25, 221, 180, 22, 254, 68, 189, 246, 39, 76, 1, 1, 228, 130, 51, 115, + 65, 170, 90, 223, 229, 216, 87, 165, 75, 140, 159, 185, 101, 66, 191, 56, + 19, 101, 104, 101, 95, 45, 174, 86, 240, 20, 92, 151, 215, 113, 27, 106, + 90, 213, 111, 30, 18, 44, 115, 37, 157, 222, 212, 71, 170, 190, 72, 222, + 88, 204, 114, 248, 241, 253, 99, 124, 195, 23, 75, 145, 200, 193, 243, 140, + 197, 214, 141, 107, 74, 37, 25, 8, 108, 144, 148, 176, 184, 18, 103, 212, + 64, 38, 113, 122, 238, 127, 76, 122, 49, 226, 9, 219, 178, 26, 6, 244, + 14, 163, 120, 161, 48, 171, 243, 101, 177, 95, 179, 238, 139, 27, 230, 102, + 52, 41, 128, 172, 79, 223, 102, 197, 119, 172, 158, 126, 68, 236, 185, 181, + 138, 237, 157, 122, 110, 245, 138, 24, 167, 67, 178, 99, 74, 221, 62, 184, + 0, 161, 96, 4, 182, 181, 245, 181, 0, 5, 72, 31, 147, 35, 95, 250, + 225, 189, 159, 65, 141, 18, 156, 168, 130, 42, 64, 198, 95, 89, 1, 92, + 70, 230, 229, 141, 26, 24, 222, 196, 199, 220, 20, 101, 53, 158, 242, 130, + 83, 56, 52, 112, 72, 42, 239, 100, 181, 44, 61, 4, 195, 237, 206, 137, + 99, 119, 79, 12, 209, 121, 195, 53, 169, 145, 68, 100, 158, 193, 198, 178, + 145, 104, 79, 16, 37, 177, 228, 136, 89, 111, 166, 122, 111, 6, 96, 186, + 12, 4, 207, 158, 163, 52, 217, 240, 155, 54, 163, 103, 197, 240, 84, 166, + 236, 216, 177, 18, 26, 141, 125, 252, 225, 176, 98, 169, 162, 13, 84, 240, + 88, 74, 101, 188, 40, 112, 59, 82, 117, 90, 101, 84, 178, 93, 212, 138, + 32, 176, 7, 43, 243, 195, 67, 79, 14, 153, 38, 154, 168, 176, 8, 111, + 248, 242, 130, 59, 59, 173, 10, 217, 215, 181, 133, 169, 189, 230, 57, 98, + 46, 131, 249, 23, 162, 124, 210, 224, 43, 132, 142, 220, 97, 87, 177, 208, + 187, 101, 204, 79, 124, 79, 197, 79, 110, 198, 165, 40, 187, 185, 11, 226, + 81, 141, 51, 79, 57, 182, 75, 206, 227, 202, 23, 209, 116, 114, 89, 117, + 248, 32, 111, 52, 153, 84, 137, 128, 247, 12, 129, 102, 219, 202, 30, 233, + 149, 47, 110, 129, 227, 146, 33, 226, 31, 39, 226, 129, 132, 159, 38, 1, + 40, 135, 20, 133, 228, 218, 141, 167, 192, 241, 130, 113, 121, 27, 122, 103, + 251, 91, 75, 59, 222, 141, 226, 156, 226, 237, 207, 52, 2, 72, 195, 111, + 42, 245, 98, 116, 11, 64, 139, 98, 106, 191, 178, 248, 130, 103, 81, 68, + 170, 46, 219, 114, 230, 41, 242, 133, 229, 43, 251, 92, 33, 175, 137, 205, + 44, 162, 21, 47, 40, 180, 197, 231, 43, 4, 174, 68, 167, 225, 31, 169, + 71, 5, 146, 204, 47, 72, 68, 161, 118, 65, 133, 98, 134, 210, 137, 9, + 123, 243, 66, 109, 122, 5, 117, 249, 56, 50, 218, 159, 45, 213, 82, 124, + 14, 225, 120, 201, 251, 178, 220, 61, 112, 122, 244, 60, 47, 234, 158, 29, + 106, 118, 173, 64, 83, 149, 85, 254, 93, 25, 55, 26, 231, 74, 81, 122, + 224, 116, 149, 44, 142, 145, 48, 48, 99, 20, 114, 172, 152, 3, 213, 24, + 196, 16, 97, 98, 217, 132, 80, 130, 237, 100, 150, 140, 20, 94, 222, 11, + 92, 72, 44, 93, 92, 215, 55, 197, 110, 242, 98, 135, 248, 147, 52, 49, + 89, 32, 242, 15, 181, 68, 161, 187, 62, 179, 47, 204, 200, 203, 203, 87, + 58, 165, 162, 77, 235, 245, 28, 188, 243, 179, 132, 146, 112, 71, 246, 189, + 247, 64, 82, 217, 96, 254, 27, 211, 210, 113, 187, 138, 118, 137, 80, 55, + 77, 234, 163, 235, 240, 150, 120, 212, 219, 213, 242, 235, 104, 62, 253, 234, + 208, 207, 246, 231, 85, 52, 25, 45, 157, 113, 184, 156, 46, 136, 249, 30, + 39, 166, 225, 6, 55, 0, 115, 7, 96, 46, 120, 191, 233, 76, 163, 112, + 12, 16, 151, 232, 154, 102, 226, 59, 135, 246, 68, 155, 105, 132, 155, 166, + 169, 243, 243, 102, 61, 93, 220, 207, 167, 206, 221, 110, 206, 42, 46, 231, + 64, 221, 113, 240, 214, 246, 102, 183, 152, 82, 159, 124, 12, 191, 58, 171, + 217, 104, 114, 79, 3, 105, 67, 198, 165, 231, 220, 135, 172, 17, 226, 102, + 75, 166, 237, 124, 253, 176, 118, 238, 31, 34, 34, 226, 225, 5, 207, 248, + 142, 10, 178, 65, 58, 235, 217, 104, 177, 90, 45, 71, 215, 52, 36, 67, + 103, 77, 131, 99, 62, 155, 56, 43, 220, 42, 174, 15, 37, 85, 100, 204, + 238, 188, 154, 81, 146, 235, 161, 173, 139, 127, 16, 253, 56, 201, 45, 18, + 176, 171, 26, 190, 119, 168, 30, 74, 155, 217, 195, 226, 154, 81, 167, 255, + 177, 189, 178, 79, 4, 213, 110, 249, 245, 187, 186, 95, 187, 137, 211, 187, + 22, 190, 161, 71, 145, 192, 78, 11, 104, 13, 118, 181, 105, 4, 27, 141, + 129, 164, 91, 158, 35, 16, 67, 107, 171, 202, 58, 148, 100, 167, 129, 96, + 206, 222, 181, 135, 97, 60, 232, 21, 122, 150, 9, 120, 179, 143, 147, 57, + 240, 54, 73, 128, 108, 198, 225, 226, 246, 43, 48, 112, 190, 241, 186, 239, + 90, 61, 227, 102, 182, 225, 241, 238, 82, 87, 234, 123, 154, 190, 50, 187, + 203, 230, 203, 123, 74, 230, 187, 51, 145, 244, 70, 182, 224, 212, 254, 63, + 103, 119, 249, 252, 17, 241, 209, 221, 101, 34, 116, 37, 157, 143, 150, 223, + 127, 254, 236, 98, 85, 203, 68, 167, 36, 53, 152, 221, 185, 29, 143, 22, + 11, 168, 96, 86, 98, 119, 12, 35, 139, 23, 134, 70, 143, 101, 4, 136, + 58, 22, 132, 255, 155, 138, 28, 46, 71, 115, 198, 253, 162, 255, 187, 205, + 246, 9, 174, 30, 154, 237, 210, 231, 251, 193, 94, 196, 7, 85, 255, 172, + 38, 152, 253, 159, 239, 185, 175, 14, 51, 61, 250, 60, 215, 151, 227, 80, + 204, 112, 218, 159, 13, 72, 128, 92, 111, 20, 228, 102, 221, 187, 154, 100, + 255, 124, 153, 211, 15, 87, 212, 33, 179, 135, 36, 159, 5, 247, 192, 108, + 220, 230, 127, 90, 235, 230, 88, 252, 162, 6, 101, 140, 191, 104, 60, 186, + 15, 55, 28, 209, 172, 24, 179, 34, 105, 250, 3, 12, 85, 236, 132, 195, + 119, 239, 255, 85, 191, 220, 54, 26, 197, 126, 129, 98, 150, 98, 36, 121, + 13, 130, 95, 161, 166, 129, 242, 31, 141, 141, 96, 127, 150, 7, 55, 201, + 170, 238, 104, 32, 184, 6, 227, 132, 166, 86, 245, 253, 122, 112, 51, 95, + 173, 162, 138, 188, 75, 124, 83, 173, 158, 61, 157, 207, 190, 185, 88, 59, + 238, 229, 59, 90, 165, 215, 192, 117, 70, 52, 117, 82, 147, 90, 222, 140, + 69, 210, 152, 185, 104, 148, 29, 159, 235, 69, 96, 20, 222, 197, 199, 56, + 74, 141, 46, 100, 196, 113, 130, 195, 72, 156, 111, 191, 197, 42, 118, 59, + 125, 43, 231, 56, 9, 20, 192, 177, 35, 92, 189, 250, 202, 218, 28, 184, + 141, 64, 176, 247, 30, 172, 242, 222, 246, 14, 123, 219, 63, 12, 203, 123, + 31, 27, 110, 218, 108, 84, 15, 228, 26, 24, 46, 30, 187, 180, 12, 23, + 159, 93, 218, 134, 75, 192, 46, 29, 195, 165, 197, 46, 93, 195, 165, 205, + 46, 61, 195, 165, 195, 46, 125, 195, 165, 203, 46, 158, 107, 56, 245, 196, + 201, 51, 156, 250, 226, 100, 102, 219, 147, 124, 123, 169, 140, 75, 206, 61, + 51, 235, 158, 228, 221, 51, 51, 239, 73, 238, 61, 51, 251, 158, 228, 223, + 51, 11, 224, 73, 9, 60, 179, 8, 158, 148, 193, 51, 11, 225, 73, 41, + 124, 179, 20, 158, 20, 195, 55, 139, 225, 73, 57, 124, 46, 135, 87, 87, + 29, 129, 157, 2, 180, 74, 11, 63, 109, 252, 116, 240, 211, 197, 79, 15, + 63, 125, 250, 9, 92, 252, 224, 126, 202, 63, 148, 203, 251, 36, 173, 55, + 138, 174, 155, 109, 84, 55, 219, 166, 110, 182, 73, 221, 108, 139, 186, 217, + 6, 117, 179, 237, 233, 102, 155, 211, 205, 182, 102, 174, 45, 221, 108, 75, + 186, 185, 118, 116, 115, 173, 232, 230, 218, 208, 205, 181, 160, 155, 107, 63, + 55, 215, 122, 110, 174, 237, 220, 92, 203, 229, 219, 205, 61, 148, 75, 9, + 23, 151, 97, 87, 105, 184, 63, 88, 215, 115, 156, 22, 69, 15, 180, 7, + 137, 28, 108, 120, 161, 218, 123, 61, 21, 35, 177, 167, 206, 120, 20, 133, + 215, 83, 197, 197, 170, 207, 208, 215, 134, 64, 27, 90, 218, 208, 214, 134, + 229, 42, 140, 12, 230, 247, 134, 6, 52, 77, 81, 183, 206, 100, 180, 27, + 182, 150, 225, 134, 248, 95, 98, 119, 151, 163, 196, 135, 88, 164, 5, 49, + 204, 55, 15, 63, 135, 195, 217, 36, 114, 110, 87, 243, 9, 45, 25, 196, + 122, 58, 68, 35, 10, 183, 196, 246, 46, 87, 124, 104, 55, 29, 122, 166, + 197, 119, 40, 232, 240, 105, 74, 235, 194, 122, 28, 98, 99, 57, 188, 9, + 249, 238, 199, 44, 126, 204, 157, 115, 201, 213, 109, 146, 218, 49, 15, 93, + 98, 231, 197, 37, 154, 78, 216, 54, 121, 36, 15, 226, 167, 135, 94, 171, + 29, 56, 35, 158, 174, 1, 187, 50, 163, 213, 104, 30, 222, 254, 188, 153, + 174, 25, 184, 226, 113, 26, 237, 168, 216, 52, 205, 77, 199, 179, 225, 245, + 238, 126, 180, 94, 15, 249, 248, 33, 227, 38, 27, 106, 208, 230, 218, 197, + 157, 171, 152, 136, 35, 7, 22, 38, 251, 240, 90, 39, 209, 197, 190, 122, + 90, 134, 235, 153, 40, 32, 187, 121, 152, 15, 93, 223, 237, 131, 155, 190, + 153, 83, 9, 17, 36, 22, 1, 192, 93, 145, 206, 221, 140, 167, 245, 213, + 70, 68, 135, 227, 48, 187, 225, 232, 6, 181, 190, 74, 185, 73, 102, 199, + 209, 106, 189, 214, 167, 66, 195, 241, 253, 208, 11, 220, 2, 199, 86, 129, + 91, 187, 192, 173, 83, 224, 214, 203, 187, 5, 121, 167, 130, 20, 58, 14, + 106, 75, 87, 139, 111, 218, 60, 177, 8, 172, 23, 85, 199, 4, 88, 153, + 67, 253, 237, 181, 29, 28, 114, 78, 168, 165, 54, 209, 10, 254, 41, 171, + 207, 157, 110, 232, 246, 123, 93, 49, 145, 161, 47, 38, 84, 100, 44, 94, + 225, 220, 204, 71, 155, 33, 213, 135, 164, 233, 187, 126, 91, 25, 165, 211, + 104, 75, 92, 185, 98, 215, 205, 164, 172, 232, 250, 148, 3, 195, 226, 43, + 203, 45, 101, 65, 25, 129, 139, 186, 138, 148, 133, 91, 210, 153, 141, 162, + 245, 12, 17, 148, 105, 253, 176, 164, 133, 209, 41, 110, 106, 137, 63, 100, + 28, 82, 116, 183, 184, 123, 196, 46, 119, 83, 206, 134, 238, 249, 160, 107, + 152, 83, 94, 140, 59, 186, 152, 46, 0, 148, 186, 118, 176, 109, 228, 4, + 57, 204, 106, 189, 153, 239, 132, 42, 96, 85, 120, 208, 44, 181, 47, 43, + 90, 164, 145, 20, 27, 134, 16, 74, 227, 192, 43, 218, 178, 50, 175, 166, + 6, 132, 179, 138, 70, 203, 91, 25, 15, 212, 246, 166, 173, 155, 178, 17, + 131, 115, 167, 29, 30, 104, 201, 137, 166, 91, 32, 211, 77, 28, 85, 122, + 179, 239, 83, 22, 56, 81, 221, 32, 218, 65, 21, 144, 141, 220, 65, 216, + 130, 190, 192, 35, 45, 177, 26, 243, 130, 56, 36, 163, 87, 113, 155, 83, + 85, 30, 1, 4, 136, 123, 202, 250, 225, 122, 51, 159, 42, 47, 49, 203, + 248, 82, 4, 218, 237, 107, 109, 148, 190, 231, 25, 115, 84, 60, 95, 242, + 20, 53, 153, 78, 239, 157, 73, 184, 0, 68, 46, 181, 44, 205, 107, 179, + 209, 146, 210, 69, 111, 124, 12, 151, 206, 77, 4, 213, 172, 19, 218, 209, + 67, 191, 234, 195, 156, 50, 32, 210, 152, 206, 83, 120, 63, 45, 34, 171, + 206, 32, 212, 212, 255, 192, 56, 120, 19, 190, 6, 208, 51, 207, 102, 58, + 154, 15, 165, 146, 181, 19, 113, 119, 11, 135, 81, 160, 196, 151, 131, 115, + 68, 113, 228, 162, 102, 236, 24, 128, 120, 130, 173, 128, 120, 201, 196, 77, + 200, 164, 216, 154, 30, 94, 236, 148, 16, 103, 43, 194, 138, 85, 134, 172, + 212, 34, 255, 210, 132, 24, 199, 221, 37, 78, 28, 56, 101, 163, 108, 64, + 150, 38, 85, 170, 229, 244, 129, 34, 206, 11, 221, 146, 52, 149, 192, 23, + 151, 72, 91, 100, 76, 170, 40, 202, 205, 164, 146, 20, 128, 215, 4, 38, + 166, 179, 227, 176, 141, 43, 33, 201, 121, 146, 92, 108, 162, 28, 179, 89, + 229, 72, 44, 50, 224, 121, 60, 177, 29, 9, 153, 205, 171, 78, 148, 100, + 93, 91, 82, 135, 193, 202, 51, 26, 207, 212, 194, 227, 165, 173, 126, 218, + 26, 164, 173, 52, 251, 210, 80, 157, 79, 101, 234, 225, 101, 135, 111, 78, + 112, 98, 53, 142, 194, 245, 189, 116, 7, 54, 49, 26, 25, 205, 180, 171, + 123, 180, 243, 218, 153, 78, 110, 119, 211, 197, 53, 185, 221, 140, 230, 115, + 245, 34, 245, 102, 117, 123, 171, 144, 132, 111, 30, 104, 228, 132, 107, 234, + 136, 72, 242, 142, 50, 150, 117, 241, 115, 46, 65, 206, 165, 229, 204, 86, + 64, 115, 144, 9, 141, 250, 187, 154, 15, 227, 233, 73, 166, 33, 26, 29, + 11, 204, 109, 10, 14, 90, 77, 54, 212, 108, 52, 255, 57, 144, 72, 66, + 65, 128, 249, 128, 218, 84, 195, 29, 44, 7, 219, 141, 22, 85, 51, 142, + 103, 90, 124, 211, 18, 56, 27, 25, 161, 122, 65, 74, 89, 253, 180, 53, + 19, 184, 101, 52, 99, 250, 60, 80, 26, 243, 145, 207, 176, 102, 104, 80, + 214, 169, 182, 161, 222, 56, 163, 182, 89, 173, 157, 217, 110, 18, 141, 198, + 171, 104, 74, 166, 251, 229, 106, 29, 174, 157, 187, 112, 62, 199, 62, 123, + 116, 71, 61, 122, 49, 133, 147, 204, 200, 194, 230, 181, 156, 123, 34, 55, + 9, 129, 22, 29, 1, 88, 155, 92, 200, 68, 251, 200, 13, 229, 42, 138, + 192, 198, 61, 134, 128, 255, 221, 169, 41, 106, 13, 132, 88, 35, 139, 198, + 25, 37, 231, 239, 230, 22, 83, 11, 14, 18, 137, 111, 19, 115, 36, 45, + 205, 22, 76, 10, 202, 72, 121, 37, 254, 81, 204, 169, 90, 205, 57, 249, + 202, 233, 49, 188, 6, 188, 184, 178, 161, 177, 140, 140, 232, 3, 82, 153, + 201, 56, 77, 205, 197, 80, 199, 196, 181, 46, 112, 174, 199, 209, 3, 230, + 70, 61, 81, 94, 163, 155, 223, 135, 227, 37, 229, 22, 71, 12, 247, 176, + 239, 184, 11, 197, 11, 197, 211, 8, 43, 203, 156, 124, 29, 250, 153, 49, + 81, 5, 195, 173, 250, 200, 120, 117, 115, 51, 157, 66, 23, 87, 136, 195, + 132, 245, 102, 60, 34, 135, 112, 41, 231, 15, 139, 29, 58, 170, 28, 188, + 170, 126, 73, 109, 179, 25, 205, 111, 195, 209, 140, 42, 147, 186, 30, 160, + 248, 110, 105, 73, 93, 114, 231, 91, 141, 144, 53, 65, 30, 119, 100, 68, + 113, 39, 102, 62, 220, 40, 113, 234, 36, 152, 139, 125, 55, 243, 156, 187, + 153, 79, 127, 1, 253, 181, 232, 175, 77, 127, 29, 250, 235, 210, 95, 143, + 254, 250, 244, 231, 185, 6, 17, 125, 128, 204, 241, 103, 212, 163, 168, 158, + 192, 138, 207, 166, 148, 124, 36, 166, 7, 36, 192, 198, 112, 66, 121, 18, + 19, 34, 194, 176, 122, 154, 243, 119, 71, 139, 248, 122, 51, 155, 166, 122, + 7, 159, 74, 51, 105, 54, 49, 143, 142, 175, 175, 190, 129, 250, 182, 212, + 183, 173, 190, 29, 245, 237, 170, 111, 79, 125, 251, 234, 235, 185, 218, 160, + 41, 122, 154, 164, 167, 105, 122, 154, 168, 167, 169, 122, 154, 172, 167, 233, + 122, 154, 176, 167, 41, 251, 154, 178, 31, 231, 85, 83, 246, 53, 101, 95, + 83, 246, 53, 101, 95, 83, 246, 53, 101, 95, 83, 246, 53, 229, 64, 83, + 14, 52, 229, 32, 174, 6, 77, 57, 208, 148, 3, 77, 57, 208, 148, 3, + 77, 57, 208, 148, 3, 77, 185, 165, 41, 183, 52, 229, 150, 166, 220, 138, + 107, 88, 83, 110, 105, 202, 45, 77, 185, 165, 41, 183, 122, 70, 211, 37, + 87, 9, 220, 126, 188, 154, 175, 67, 26, 97, 33, 142, 198, 168, 5, 39, + 195, 213, 80, 179, 66, 50, 30, 168, 57, 21, 127, 163, 166, 86, 94, 254, + 146, 73, 120, 19, 61, 76, 181, 164, 76, 143, 230, 21, 76, 175, 83, 94, + 20, 105, 217, 52, 153, 158, 213, 210, 227, 68, 253, 6, 205, 93, 225, 125, + 67, 241, 253, 206, 232, 151, 135, 17, 255, 48, 239, 104, 112, 130, 206, 53, + 198, 200, 114, 184, 190, 219, 57, 178, 240, 92, 63, 97, 145, 123, 194, 210, + 246, 132, 5, 237, 137, 250, 24, 253, 180, 241, 211, 193, 79, 23, 63, 61, + 252, 244, 57, 176, 235, 168, 173, 35, 54, 80, 154, 59, 106, 152, 102, 223, + 48, 7, 134, 185, 101, 152, 219, 134, 185, 99, 152, 187, 134, 185, 103, 152, + 251, 102, 90, 148, 133, 57, 45, 184, 96, 202, 80, 113, 73, 25, 29, 188, + 109, 35, 206, 130, 102, 11, 145, 211, 96, 6, 136, 236, 138, 5, 98, 182, + 81, 240, 60, 177, 159, 49, 108, 52, 117, 226, 90, 21, 204, 209, 98, 58, + 81, 156, 209, 80, 170, 72, 204, 170, 169, 98, 29, 14, 67, 67, 159, 3, + 213, 94, 98, 14, 12, 115, 203, 48, 183, 13, 115, 199, 48, 119, 13, 115, + 207, 48, 247, 205, 180, 92, 103, 62, 70, 138, 99, 36, 53, 70, 26, 99, + 16, 31, 131, 234, 24, 228, 198, 160, 51, 6, 129, 49, 98, 142, 101, 232, + 175, 38, 59, 158, 75, 240, 245, 213, 55, 80, 223, 150, 250, 182, 213, 183, + 163, 190, 93, 245, 237, 169, 111, 95, 211, 113, 157, 229, 19, 53, 52, 253, + 248, 248, 9, 240, 211, 194, 79, 27, 63, 29, 252, 116, 241, 211, 195, 79, + 159, 3, 187, 106, 215, 177, 142, 117, 83, 80, 118, 98, 163, 159, 24, 131, + 196, 216, 74, 140, 237, 196, 216, 73, 140, 221, 196, 216, 75, 140, 125, 35, + 9, 87, 221, 223, 13, 89, 253, 196, 154, 127, 84, 23, 209, 135, 9, 80, + 212, 240, 48, 9, 105, 72, 222, 209, 120, 224, 30, 195, 152, 31, 81, 60, + 222, 164, 155, 27, 163, 45, 190, 37, 84, 220, 34, 173, 187, 183, 144, 85, + 91, 46, 105, 128, 247, 186, 174, 12, 89, 39, 246, 224, 153, 128, 53, 46, + 132, 133, 142, 71, 92, 13, 231, 245, 244, 62, 28, 101, 201, 130, 1, 83, + 62, 97, 177, 107, 200, 7, 64, 184, 236, 149, 109, 136, 172, 155, 100, 155, + 78, 191, 78, 179, 126, 50, 35, 65, 81, 133, 246, 153, 173, 10, 157, 169, + 110, 110, 176, 87, 84, 44, 181, 235, 209, 58, 126, 204, 175, 125, 220, 207, + 115, 13, 191, 194, 156, 153, 105, 211, 238, 116, 70, 76, 199, 104, 206, 87, + 215, 227, 59, 217, 68, 11, 51, 229, 124, 13, 231, 180, 93, 96, 44, 74, + 42, 255, 124, 164, 65, 199, 18, 143, 112, 121, 19, 1, 130, 55, 113, 209, + 173, 123, 253, 148, 106, 89, 190, 245, 149, 118, 93, 64, 252, 25, 178, 100, + 78, 98, 172, 59, 35, 98, 165, 23, 198, 237, 244, 144, 216, 65, 218, 195, + 135, 209, 196, 112, 91, 76, 183, 225, 120, 37, 199, 42, 60, 119, 12, 49, + 215, 62, 168, 105, 29, 232, 21, 184, 14, 94, 175, 105, 42, 162, 29, 56, + 180, 246, 12, 59, 125, 217, 164, 241, 22, 93, 182, 107, 60, 37, 129, 81, + 136, 36, 168, 222, 80, 171, 25, 8, 16, 3, 171, 251, 21, 241, 79, 44, + 96, 17, 45, 121, 55, 12, 248, 154, 245, 61, 119, 224, 165, 106, 244, 157, + 163, 239, 74, 136, 200, 61, 49, 116, 235, 112, 180, 84, 219, 235, 41, 142, + 232, 66, 202, 32, 17, 31, 125, 197, 38, 24, 220, 47, 177, 92, 235, 39, + 250, 29, 94, 63, 92, 211, 142, 225, 246, 97, 161, 236, 183, 83, 98, 245, + 54, 43, 103, 51, 10, 111, 71, 14, 52, 156, 16, 51, 231, 60, 44, 239, + 150, 180, 245, 119, 30, 190, 94, 79, 169, 192, 15, 119, 180, 99, 28, 41, + 27, 109, 237, 163, 144, 50, 174, 172, 107, 226, 97, 35, 108, 143, 176, 195, + 163, 166, 216, 132, 35, 217, 144, 169, 246, 112, 88, 171, 64, 52, 228, 207, + 218, 108, 26, 117, 17, 207, 109, 115, 75, 19, 209, 80, 243, 127, 183, 43, + 116, 29, 156, 129, 98, 239, 62, 39, 198, 125, 52, 115, 160, 216, 102, 248, + 112, 191, 90, 146, 35, 180, 180, 128, 75, 7, 39, 70, 117, 49, 18, 33, + 175, 235, 157, 222, 128, 174, 71, 33, 116, 184, 58, 56, 17, 89, 134, 184, + 109, 49, 140, 190, 243, 16, 93, 143, 112, 16, 245, 116, 189, 162, 253, 38, + 213, 61, 13, 175, 169, 179, 91, 61, 12, 169, 28, 195, 201, 106, 24, 110, + 140, 124, 26, 114, 2, 210, 141, 162, 209, 53, 181, 54, 248, 45, 218, 138, + 12, 59, 196, 101, 141, 190, 70, 163, 233, 124, 216, 167, 85, 118, 69, 196, + 41, 143, 29, 90, 107, 89, 208, 133, 216, 51, 218, 170, 44, 208, 209, 137, + 251, 234, 97, 125, 219, 209, 156, 4, 134, 103, 60, 7, 59, 59, 122, 24, + 182, 105, 253, 92, 93, 135, 56, 247, 227, 109, 112, 56, 7, 247, 51, 126, + 160, 100, 104, 222, 232, 247, 157, 201, 207, 52, 193, 173, 192, 108, 77, 86, + 216, 158, 173, 112, 254, 170, 250, 20, 241, 46, 55, 171, 249, 45, 213, 112, + 219, 117, 4, 35, 121, 216, 235, 81, 39, 155, 83, 222, 136, 225, 165, 61, + 33, 118, 92, 148, 203, 249, 116, 185, 218, 18, 131, 69, 43, 206, 195, 248, + 110, 135, 60, 46, 198, 52, 71, 46, 41, 70, 151, 214, 138, 112, 190, 162, + 121, 121, 57, 133, 181, 235, 234, 125, 17, 38, 192, 54, 234, 120, 4, 53, + 64, 96, 10, 113, 239, 183, 27, 129, 169, 164, 126, 245, 56, 5, 59, 22, + 77, 23, 59, 48, 133, 216, 102, 160, 182, 136, 83, 196, 150, 47, 188, 69, + 210, 61, 7, 215, 156, 27, 176, 154, 27, 234, 115, 147, 97, 215, 163, 169, + 56, 154, 174, 192, 209, 125, 37, 59, 113, 129, 95, 167, 119, 68, 168, 111, + 84, 123, 74, 36, 67, 24, 48, 112, 93, 196, 70, 240, 94, 3, 236, 220, + 132, 134, 28, 120, 64, 28, 96, 161, 183, 44, 213, 96, 228, 7, 41, 145, + 240, 106, 83, 240, 134, 19, 40, 255, 161, 190, 142, 201, 152, 210, 156, 80, + 226, 124, 48, 184, 6, 71, 139, 173, 186, 58, 198, 216, 128, 99, 160, 154, + 154, 210, 8, 97, 49, 9, 42, 154, 156, 184, 15, 213, 208, 163, 185, 120, + 73, 164, 137, 169, 84, 238, 235, 213, 114, 7, 154, 106, 159, 219, 118, 104, + 169, 185, 223, 225, 98, 150, 248, 240, 192, 153, 205, 111, 135, 30, 173, 140, + 225, 114, 242, 0, 78, 142, 122, 1, 179, 186, 114, 55, 136, 133, 153, 118, + 237, 227, 21, 24, 115, 73, 225, 14, 238, 94, 11, 108, 229, 122, 131, 176, + 114, 16, 46, 238, 84, 86, 26, 252, 96, 168, 55, 179, 40, 196, 182, 24, + 91, 233, 135, 232, 46, 68, 96, 98, 121, 245, 28, 232, 117, 2, 231, 137, + 134, 20, 142, 81, 81, 104, 223, 220, 240, 40, 241, 22, 233, 204, 247, 120, + 166, 180, 187, 95, 19, 47, 53, 11, 215, 67, 62, 164, 89, 172, 240, 136, + 217, 185, 166, 225, 129, 141, 202, 245, 234, 26, 213, 59, 113, 230, 225, 205, + 116, 120, 27, 62, 34, 43, 172, 194, 9, 13, 4, 221, 72, 206, 122, 244, + 40, 119, 157, 225, 35, 218, 100, 2, 109, 214, 80, 9, 53, 228, 75, 138, + 113, 106, 220, 139, 84, 13, 167, 222, 113, 215, 14, 253, 241, 33, 207, 36, + 49, 13, 71, 243, 141, 67, 219, 72, 228, 94, 221, 25, 96, 163, 15, 110, + 144, 103, 17, 117, 56, 163, 238, 16, 228, 190, 0, 55, 31, 198, 124, 109, + 178, 176, 224, 1, 13, 75, 32, 7, 56, 67, 202, 215, 76, 198, 144, 147, + 164, 170, 76, 188, 246, 42, 203, 116, 75, 101, 93, 232, 19, 183, 71, 60, + 104, 139, 231, 120, 62, 167, 210, 150, 123, 44, 84, 43, 246, 77, 98, 208, + 207, 131, 177, 90, 73, 175, 209, 157, 71, 29, 12, 40, 155, 28, 213, 137, + 153, 139, 163, 204, 122, 211, 47, 93, 140, 125, 104, 215, 124, 59, 188, 163, + 31, 234, 88, 64, 28, 219, 140, 157, 59, 97, 117, 116, 15, 184, 91, 77, + 70, 194, 231, 56, 115, 117, 220, 129, 9, 125, 190, 90, 172, 248, 150, 136, + 251, 58, 101, 72, 142, 169, 57, 105, 24, 105, 216, 133, 55, 180, 61, 231, + 227, 220, 185, 42, 173, 222, 172, 143, 245, 73, 51, 82, 162, 105, 96, 121, + 39, 17, 101, 38, 151, 141, 144, 35, 218, 6, 135, 76, 87, 91, 116, 9, + 196, 170, 157, 39, 67, 62, 139, 136, 143, 21, 145, 217, 48, 177, 203, 145, + 35, 152, 31, 101, 98, 54, 96, 170, 64, 104, 178, 118, 234, 167, 90, 51, + 152, 48, 25, 104, 77, 90, 160, 151, 59, 249, 77, 236, 114, 224, 42, 70, + 238, 3, 235, 135, 123, 172, 79, 226, 170, 141, 218, 11, 123, 187, 155, 173, + 163, 75, 160, 190, 67, 238, 157, 177, 45, 62, 179, 141, 29, 116, 89, 244, + 34, 168, 155, 5, 185, 136, 25, 21, 110, 125, 156, 76, 35, 105, 78, 52, + 62, 173, 23, 171, 240, 5, 177, 112, 2, 174, 186, 168, 25, 175, 49, 120, + 62, 15, 60, 223, 80, 180, 236, 92, 223, 126, 161, 191, 143, 244, 247, 129, + 254, 126, 79, 115, 220, 250, 158, 150, 26, 173, 144, 100, 237, 108, 93, 103, + 231, 58, 17, 125, 34, 250, 126, 113, 157, 143, 174, 243, 129, 102, 249, 225, + 22, 63, 59, 252, 68, 108, 132, 247, 214, 115, 118, 52, 5, 209, 39, 162, + 239, 23, 207, 249, 232, 57, 31, 60, 4, 198, 207, 206, 227, 192, 252, 75, + 230, 173, 239, 64, 27, 28, 125, 34, 250, 126, 241, 157, 143, 190, 243, 193, + 71, 96, 252, 236, 124, 14, 204, 191, 100, 222, 6, 206, 46, 160, 192, 244, + 71, 223, 47, 129, 243, 49, 112, 62, 4, 8, 140, 159, 93, 192, 129, 249, + 151, 204, 219, 150, 179, 107, 81, 96, 250, 163, 239, 151, 150, 243, 177, 229, + 124, 104, 33, 48, 126, 118, 45, 14, 204, 191, 100, 222, 182, 157, 29, 45, + 73, 244, 137, 232, 251, 165, 237, 124, 108, 59, 31, 218, 8, 140, 159, 93, + 155, 3, 243, 47, 153, 183, 29, 103, 215, 161, 192, 244, 71, 223, 47, 29, + 231, 99, 199, 249, 208, 65, 96, 252, 236, 58, 28, 152, 127, 201, 188, 237, + 58, 187, 46, 5, 166, 63, 250, 126, 233, 58, 31, 187, 206, 135, 46, 2, + 227, 103, 215, 229, 192, 252, 75, 230, 109, 207, 217, 209, 130, 72, 159, 136, + 190, 95, 122, 206, 199, 158, 243, 161, 135, 192, 248, 217, 245, 56, 48, 255, + 146, 121, 219, 119, 118, 125, 10, 76, 127, 244, 253, 210, 119, 62, 246, 157, + 15, 125, 4, 198, 207, 174, 207, 129, 249, 151, 204, 91, 218, 253, 236, 60, + 180, 33, 126, 96, 250, 66, 127, 31, 233, 239, 131, 199, 13, 201, 191, 59, + 79, 154, 82, 62, 176, 109, 61, 180, 38, 55, 39, 183, 39, 26, 20, 45, + 138, 38, 149, 54, 149, 70, 85, 173, 170, 154, 213, 115, 6, 118, 185, 198, + 79, 147, 222, 164, 196, 247, 172, 108, 215, 26, 196, 143, 12, 24, 125, 137, + 31, 224, 140, 215, 131, 248, 33, 206, 120, 205, 239, 100, 6, 198, 131, 153, + 24, 156, 41, 21, 120, 62, 74, 2, 107, 21, 188, 16, 110, 1, 154, 217, + 0, 200, 126, 16, 19, 59, 187, 88, 67, 116, 135, 117, 202, 223, 53, 179, + 250, 24, 166, 141, 158, 33, 149, 21, 109, 237, 115, 42, 177, 125, 14, 12, + 115, 107, 96, 93, 148, 237, 253, 22, 18, 195, 246, 158, 28, 15, 229, 203, + 179, 210, 23, 229, 28, 41, 247, 72, 123, 172, 116, 4, 170, 32, 241, 162, + 58, 138, 253, 6, 131, 11, 214, 92, 119, 249, 205, 159, 172, 186, 117, 225, + 1, 53, 246, 221, 159, 222, 12, 86, 127, 250, 230, 11, 57, 252, 201, 106, + 88, 171, 63, 189, 251, 34, 32, 233, 111, 194, 245, 114, 180, 172, 72, 218, + 213, 18, 112, 13, 162, 45, 229, 203, 249, 226, 124, 116, 62, 80, 222, 4, + 180, 239, 201, 131, 230, 187, 39, 200, 50, 85, 79, 206, 44, 113, 156, 177, + 227, 204, 106, 176, 91, 89, 96, 231, 47, 132, 84, 237, 201, 83, 37, 169, + 205, 96, 138, 18, 199, 40, 113, 253, 34, 185, 255, 40, 159, 15, 244, 185, + 20, 208, 27, 19, 200, 158, 49, 104, 237, 109, 195, 166, 140, 217, 59, 250, + 236, 170, 85, 13, 129, 98, 85, 236, 47, 87, 246, 199, 43, 251, 67, 213, + 178, 85, 131, 53, 45, 149, 247, 171, 24, 179, 24, 72, 10, 181, 210, 61, + 173, 134, 149, 45, 48, 27, 182, 239, 253, 111, 42, 196, 197, 48, 6, 161, + 117, 15, 196, 138, 237, 149, 127, 102, 145, 83, 125, 208, 240, 154, 94, 215, + 239, 249, 181, 251, 45, 252, 106, 131, 173, 242, 112, 155, 157, 94, 224, 251, + 94, 206, 163, 225, 54, 61, 207, 13, 218, 1, 249, 84, 223, 185, 103, 37, + 169, 159, 8, 228, 155, 126, 173, 92, 177, 163, 106, 249, 172, 4, 4, 78, + 40, 3, 68, 121, 182, 141, 178, 189, 45, 59, 59, 250, 236, 202, 213, 211, + 232, 172, 244, 68, 94, 156, 67, 4, 171, 158, 149, 126, 174, 252, 78, 73, + 227, 85, 173, 250, 192, 122, 170, 149, 237, 47, 101, 211, 25, 96, 28, 202, + 227, 99, 218, 195, 143, 61, 62, 144, 71, 72, 141, 254, 116, 86, 226, 119, + 160, 2, 172, 51, 83, 146, 115, 80, 140, 7, 49, 122, 169, 74, 91, 245, + 111, 169, 49, 214, 85, 90, 187, 158, 222, 82, 223, 190, 190, 69, 127, 179, + 202, 54, 102, 114, 27, 83, 185, 141, 185, 156, 126, 126, 95, 182, 46, 171, + 103, 86, 88, 249, 157, 87, 125, 239, 54, 219, 223, 92, 223, 190, 187, 224, + 234, 103, 76, 228, 178, 117, 199, 104, 88, 166, 44, 98, 186, 199, 41, 236, + 174, 236, 184, 253, 231, 232, 136, 162, 167, 212, 178, 209, 239, 88, 125, 113, + 175, 237, 184, 219, 63, 168, 255, 156, 253, 227, 96, 244, 120, 91, 161, 5, + 245, 30, 253, 51, 64, 239, 132, 168, 127, 183, 90, 133, 62, 136, 111, 220, + 119, 84, 7, 103, 23, 143, 14, 254, 161, 58, 32, 37, 60, 38, 150, 232, + 150, 136, 234, 2, 161, 239, 149, 169, 107, 151, 117, 97, 118, 226, 176, 35, + 135, 11, 72, 45, 239, 232, 111, 91, 167, 111, 221, 191, 44, 31, 158, 207, + 68, 196, 185, 136, 94, 204, 6, 0, 185, 84, 177, 120, 84, 69, 59, 1, + 56, 216, 254, 193, 149, 127, 44, 184, 120, 52, 148, 10, 244, 135, 68, 200, + 49, 238, 91, 33, 235, 48, 78, 102, 100, 81, 66, 148, 48, 3, 172, 135, + 40, 223, 141, 216, 57, 219, 9, 216, 145, 214, 125, 123, 199, 186, 137, 108, + 240, 0, 148, 9, 177, 16, 151, 96, 19, 155, 96, 127, 112, 141, 96, 78, + 58, 12, 177, 1, 246, 206, 83, 113, 161, 255, 74, 89, 136, 105, 176, 137, + 107, 176, 63, 120, 70, 48, 39, 29, 134, 184, 2, 123, 231, 171, 184, 62, + 220, 197, 66, 60, 132, 77, 76, 132, 253, 193, 55, 130, 57, 233, 48, 91, + 116, 133, 64, 197, 229, 6, 17, 11, 177, 20, 54, 241, 20, 246, 135, 192, + 8, 230, 164, 195, 16, 207, 96, 239, 90, 42, 110, 11, 238, 98, 33, 14, + 195, 38, 22, 195, 254, 208, 50, 130, 57, 233, 48, 196, 66, 216, 187, 182, + 138, 219, 134, 187, 88, 136, 225, 176, 137, 227, 176, 63, 180, 141, 96, 78, + 58, 12, 113, 20, 246, 174, 163, 226, 118, 224, 46, 22, 226, 63, 108, 98, + 64, 236, 15, 29, 35, 152, 147, 14, 67, 12, 134, 189, 235, 170, 184, 93, + 184, 139, 133, 216, 17, 155, 248, 17, 251, 67, 215, 8, 230, 164, 195, 16, + 191, 97, 239, 122, 42, 110, 15, 238, 98, 33, 238, 196, 38, 246, 196, 254, + 208, 51, 130, 57, 233, 48, 196, 126, 216, 187, 190, 138, 219, 135, 187, 88, + 136, 89, 177, 137, 91, 177, 63, 244, 141, 96, 78, 58, 12, 152, 16, 106, + 117, 221, 179, 60, 238, 54, 202, 10, 222, 197, 6, 243, 66, 61, 196, 77, + 133, 118, 178, 65, 193, 147, 144, 71, 220, 201, 164, 7, 233, 110, 198, 253, + 140, 59, 154, 151, 10, 237, 164, 130, 154, 66, 190, 49, 31, 125, 84, 202, + 55, 90, 64, 124, 24, 44, 135, 173, 93, 135, 79, 225, 100, 51, 115, 18, + 251, 108, 10, 70, 189, 122, 234, 39, 28, 137, 87, 192, 170, 219, 181, 216, + 113, 49, 122, 25, 124, 67, 65, 124, 186, 10, 217, 18, 79, 48, 88, 148, + 148, 213, 183, 179, 170, 109, 6, 52, 49, 223, 221, 85, 128, 43, 226, 247, + 14, 85, 235, 43, 163, 192, 6, 53, 187, 133, 39, 59, 17, 64, 145, 246, + 79, 208, 167, 93, 164, 237, 9, 26, 138, 236, 64, 169, 86, 9, 146, 84, + 154, 156, 128, 188, 42, 134, 200, 62, 20, 143, 196, 158, 120, 176, 233, 59, + 12, 228, 17, 188, 31, 4, 140, 92, 81, 229, 202, 101, 48, 217, 28, 74, + 5, 132, 217, 95, 5, 78, 129, 186, 73, 61, 56, 2, 80, 234, 196, 161, + 223, 241, 3, 212, 153, 93, 176, 236, 43, 212, 196, 82, 145, 29, 254, 165, + 57, 214, 16, 123, 46, 43, 81, 103, 70, 88, 157, 40, 41, 103, 155, 227, + 147, 133, 145, 87, 82, 14, 189, 134, 231, 166, 93, 60, 175, 225, 5, 25, + 39, 170, 200, 78, 198, 169, 219, 240, 250, 105, 39, 223, 133, 26, 251, 180, + 83, 208, 240, 219, 25, 167, 14, 26, 201, 116, 82, 194, 191, 142, 29, 120, + 135, 50, 170, 108, 49, 90, 223, 41, 53, 156, 239, 74, 196, 21, 83, 79, + 112, 232, 111, 24, 241, 239, 45, 255, 94, 59, 115, 56, 207, 197, 125, 46, + 30, 115, 241, 145, 215, 208, 59, 243, 85, 180, 54, 106, 67, 236, 114, 139, + 7, 211, 252, 104, 122, 174, 158, 78, 203, 135, 127, 201, 76, 187, 223, 57, + 110, 205, 248, 119, 230, 204, 214, 143, 248, 19, 211, 112, 205, 191, 112, 9, + 241, 55, 196, 239, 28, 127, 68, 108, 188, 216, 81, 33, 228, 179, 144, 207, + 78, 62, 119, 206, 46, 252, 5, 217, 163, 223, 240, 151, 220, 251, 89, 133, + 148, 35, 202, 60, 45, 232, 19, 204, 171, 144, 170, 167, 42, 201, 124, 120, + 70, 156, 213, 193, 137, 181, 161, 218, 45, 126, 120, 157, 210, 156, 97, 197, + 90, 10, 25, 33, 54, 213, 87, 1, 54, 179, 78, 235, 28, 101, 61, 161, + 172, 24, 212, 18, 239, 178, 206, 113, 203, 26, 14, 183, 227, 241, 240, 91, + 218, 88, 8, 60, 13, 255, 37, 234, 18, 41, 113, 226, 245, 230, 23, 151, + 86, 69, 233, 127, 169, 90, 107, 171, 193, 74, 116, 226, 66, 39, 52, 246, + 180, 75, 185, 58, 104, 128, 139, 248, 145, 5, 67, 73, 149, 56, 148, 188, + 202, 27, 173, 227, 247, 41, 212, 189, 161, 23, 9, 61, 129, 170, 150, 171, + 87, 53, 198, 156, 155, 138, 219, 150, 154, 144, 27, 251, 96, 233, 231, 3, + 82, 16, 107, 62, 90, 111, 100, 112, 103, 60, 98, 234, 222, 175, 160, 110, + 142, 66, 140, 65, 54, 151, 109, 85, 62, 60, 135, 116, 180, 197, 51, 45, + 190, 105, 9, 76, 75, 171, 124, 40, 235, 151, 104, 190, 82, 69, 87, 181, + 42, 238, 153, 250, 158, 138, 138, 55, 173, 194, 214, 119, 232, 159, 149, 104, + 180, 77, 16, 31, 148, 18, 54, 253, 23, 0, 158, 160, 105, 181, 220, 126, + 199, 225, 31, 76, 125, 140, 163, 43, 10, 219, 58, 45, 71, 254, 87, 1, + 161, 59, 150, 245, 199, 74, 48, 202, 81, 186, 190, 154, 82, 147, 106, 105, + 201, 245, 161, 12, 82, 107, 190, 143, 217, 2, 59, 101, 239, 91, 241, 27, + 203, 135, 245, 102, 181, 0, 126, 148, 192, 240, 24, 184, 231, 195, 207, 85, + 235, 243, 160, 211, 146, 103, 66, 159, 7, 228, 128, 135, 80, 159, 189, 129, + 104, 12, 45, 217, 159, 29, 249, 191, 165, 42, 238, 97, 25, 222, 172, 32, + 97, 23, 226, 232, 249, 154, 149, 146, 90, 123, 188, 91, 241, 171, 87, 180, + 42, 196, 143, 5, 159, 20, 126, 125, 211, 218, 11, 95, 111, 127, 246, 106, + 223, 97, 117, 170, 98, 237, 96, 157, 50, 108, 37, 155, 238, 166, 12, 71, + 97, 15, 40, 107, 154, 138, 223, 82, 56, 65, 232, 68, 123, 47, 168, 119, + 107, 246, 251, 67, 130, 241, 83, 90, 71, 218, 175, 165, 252, 172, 245, 173, + 118, 106, 199, 78, 215, 218, 169, 163, 41, 108, 226, 136, 93, 29, 106, 19, + 71, 236, 197, 78, 113, 196, 190, 142, 184, 221, 125, 29, 168, 34, 161, 76, + 220, 111, 104, 41, 89, 71, 142, 189, 190, 165, 191, 107, 236, 64, 52, 168, + 63, 5, 102, 0, 84, 46, 196, 192, 255, 230, 194, 222, 80, 184, 13, 133, + 219, 92, 95, 190, 75, 197, 58, 56, 94, 178, 211, 195, 211, 236, 64, 65, + 184, 208, 52, 0, 101, 149, 162, 5, 66, 227, 57, 123, 214, 21, 144, 48, + 78, 43, 110, 211, 109, 215, 91, 53, 219, 59, 169, 42, 85, 157, 55, 77, + 209, 214, 172, 224, 164, 129, 74, 20, 46, 111, 230, 15, 144, 215, 231, 87, + 102, 68, 153, 188, 5, 150, 60, 92, 178, 6, 250, 225, 61, 171, 30, 107, + 198, 240, 186, 162, 140, 37, 86, 63, 40, 175, 2, 21, 17, 19, 156, 131, + 1, 75, 157, 11, 108, 251, 190, 94, 26, 192, 133, 80, 202, 150, 82, 169, + 211, 196, 147, 44, 81, 234, 169, 177, 247, 237, 32, 121, 42, 41, 186, 5, + 213, 168, 73, 158, 100, 150, 234, 9, 254, 98, 234, 245, 155, 188, 173, 132, + 46, 79, 126, 22, 23, 79, 252, 65, 172, 39, 133, 210, 167, 145, 38, 51, + 168, 85, 167, 64, 10, 34, 165, 89, 210, 175, 7, 179, 64, 27, 173, 70, + 207, 84, 35, 223, 255, 7, 30, 38, 10, 22, 134, 250, 20, 206, 26, 137, + 110, 71, 126, 252, 22, 82, 167, 122, 186, 242, 128, 101, 2, 30, 138, 236, + 14, 255, 168, 105, 130, 209, 40, 84, 237, 200, 48, 201, 13, 236, 172, 174, + 52, 239, 125, 247, 216, 179, 175, 244, 132, 128, 7, 228, 253, 3, 55, 20, + 25, 161, 128, 10, 216, 61, 94, 204, 15, 226, 165, 14, 184, 215, 163, 49, + 61, 35, 102, 28, 233, 124, 208, 43, 13, 63, 67, 43, 22, 25, 251, 223, + 116, 90, 239, 240, 172, 236, 46, 65, 45, 179, 76, 229, 230, 245, 87, 17, + 231, 222, 235, 129, 9, 165, 137, 202, 209, 127, 1, 179, 161, 24, 112, 184, + 253, 156, 4, 212, 246, 43, 252, 0, 46, 4, 218, 156, 127, 245, 196, 37, + 199, 7, 193, 196, 218, 187, 234, 40, 139, 146, 137, 231, 46, 183, 217, 109, + 67, 112, 11, 73, 236, 185, 1, 213, 60, 22, 163, 73, 185, 151, 255, 53, + 230, 177, 100, 26, 27, 126, 78, 79, 99, 152, 194, 190, 230, 189, 105, 154, + 170, 226, 204, 76, 159, 176, 80, 21, 209, 12, 231, 216, 95, 211, 149, 242, + 170, 217, 46, 158, 235, 120, 248, 1, 0, 141, 168, 213, 36, 190, 164, 119, + 144, 102, 4, 2, 135, 162, 236, 90, 247, 248, 120, 130, 109, 80, 15, 38, + 162, 46, 173, 132, 231, 9, 240, 104, 55, 61, 183, 131, 17, 214, 116, 91, + 125, 23, 152, 143, 93, 159, 122, 71, 224, 117, 154, 208, 19, 75, 89, 119, + 123, 94, 187, 219, 233, 58, 173, 102, 191, 219, 237, 16, 183, 16, 52, 219, + 125, 31, 134, 150, 215, 236, 186, 253, 22, 92, 90, 110, 167, 215, 166, 200, + 253, 182, 79, 11, 117, 171, 233, 117, 186, 68, 180, 225, 121, 189, 102, 207, + 147, 23, 162, 190, 27, 8, 46, 191, 253, 116, 110, 207, 74, 145, 63, 17, + 92, 234, 164, 203, 60, 157, 250, 120, 172, 191, 226, 243, 184, 15, 83, 234, + 123, 211, 178, 96, 150, 6, 172, 98, 184, 11, 172, 34, 28, 226, 149, 127, + 15, 153, 216, 172, 223, 72, 200, 237, 172, 4, 158, 195, 158, 41, 8, 81, + 121, 245, 236, 79, 118, 153, 36, 103, 255, 33, 73, 110, 37, 73, 251, 201, + 0, 240, 64, 99, 173, 151, 163, 251, 245, 108, 181, 81, 253, 222, 107, 122, + 53, 125, 126, 78, 163, 180, 233, 59, 154, 211, 225, 221, 29, 206, 181, 120, + 118, 38, 230, 34, 226, 8, 242, 38, 219, 126, 106, 60, 81, 120, 101, 167, + 189, 239, 172, 193, 241, 53, 76, 136, 82, 189, 92, 71, 68, 126, 235, 91, + 254, 242, 241, 131, 5, 48, 187, 92, 118, 173, 253, 223, 184, 246, 191, 25, + 190, 221, 190, 125, 55, 124, 187, 123, 251, 55, 189, 37, 159, 76, 199, 171, + 5, 122, 69, 162, 72, 64, 216, 30, 133, 166, 218, 82, 115, 208, 72, 86, + 76, 53, 33, 165, 144, 230, 98, 252, 29, 202, 234, 242, 80, 74, 3, 116, + 12, 215, 193, 224, 247, 214, 112, 221, 26, 252, 158, 111, 161, 243, 233, 217, + 30, 166, 1, 5, 85, 163, 22, 187, 17, 213, 173, 82, 105, 206, 201, 22, + 131, 251, 36, 89, 40, 82, 47, 67, 171, 208, 254, 111, 127, 35, 18, 135, + 50, 223, 36, 12, 215, 124, 127, 80, 142, 145, 22, 76, 165, 237, 212, 77, + 226, 242, 187, 214, 242, 122, 60, 216, 7, 245, 248, 29, 37, 57, 208, 244, + 76, 174, 117, 91, 233, 19, 140, 159, 226, 43, 117, 224, 228, 89, 5, 36, + 90, 3, 193, 88, 129, 252, 72, 89, 198, 172, 193, 126, 108, 161, 240, 81, + 113, 225, 173, 120, 247, 110, 64, 41, 165, 215, 119, 5, 207, 178, 182, 182, + 14, 209, 180, 254, 65, 226, 74, 105, 124, 97, 115, 60, 131, 39, 110, 182, + 101, 113, 215, 17, 92, 41, 224, 231, 234, 62, 116, 179, 214, 147, 163, 30, + 2, 53, 175, 125, 146, 194, 249, 167, 145, 134, 198, 82, 45, 228, 180, 169, + 131, 219, 55, 107, 135, 111, 72, 124, 189, 172, 220, 172, 79, 189, 118, 181, + 170, 144, 217, 85, 159, 76, 183, 98, 6, 85, 166, 184, 183, 185, 214, 59, + 42, 129, 59, 248, 66, 191, 222, 224, 35, 253, 250, 131, 15, 71, 194, 122, + 20, 86, 43, 54, 227, 72, 127, 228, 72, 127, 230, 72, 223, 31, 137, 228, + 199, 145, 230, 249, 72, 255, 118, 36, 82, 16, 71, 10, 243, 145, 190, 59, + 18, 169, 165, 34, 237, 30, 84, 246, 126, 228, 72, 127, 125, 54, 123, 109, + 29, 9, 155, 71, 35, 214, 183, 215, 28, 237, 219, 232, 72, 188, 142, 138, + 71, 108, 186, 36, 246, 3, 71, 251, 145, 99, 253, 63, 71, 34, 117, 85, + 36, 232, 120, 231, 72, 255, 198, 145, 70, 28, 233, 250, 72, 164, 158, 142, + 52, 158, 153, 145, 198, 28, 105, 118, 36, 82, 95, 69, 162, 205, 50, 199, + 249, 150, 227, 124, 226, 56, 63, 30, 107, 94, 55, 137, 116, 151, 143, 101, + 161, 187, 255, 207, 99, 113, 117, 223, 216, 133, 191, 152, 149, 255, 29, 199, + 253, 95, 165, 226, 1, 233, 42, 69, 191, 121, 31, 144, 211, 10, 240, 142, + 4, 241, 57, 200, 252, 185, 32, 1, 7, 9, 159, 11, 130, 78, 131, 14, + 243, 76, 16, 116, 145, 24, 247, 240, 72, 24, 116, 7, 116, 133, 103, 130, + 160, 241, 209, 240, 207, 4, 65, 83, 163, 153, 159, 9, 130, 134, 165, 246, + 121, 38, 4, 55, 35, 154, 240, 185, 48, 168, 95, 52, 21, 135, 225, 22, + 229, 247, 153, 16, 82, 166, 54, 81, 40, 113, 11, 193, 203, 75, 251, 49, + 248, 95, 26, 185, 7, 176, 21, 142, 250, 139, 183, 48, 150, 25, 205, 246, + 101, 185, 76, 187, 57, 10, 59, 208, 177, 123, 124, 28, 246, 137, 21, 111, + 67, 83, 72, 112, 98, 213, 68, 121, 172, 253, 233, 20, 110, 53, 172, 188, + 74, 87, 72, 57, 135, 210, 197, 123, 174, 82, 61, 155, 217, 145, 58, 124, + 233, 159, 123, 177, 42, 247, 154, 82, 129, 196, 120, 112, 234, 174, 152, 179, + 150, 137, 156, 158, 74, 31, 22, 121, 255, 148, 245, 101, 165, 48, 102, 201, + 205, 147, 101, 61, 117, 243, 250, 224, 197, 23, 144, 73, 205, 56, 80, 196, + 42, 122, 193, 100, 135, 89, 16, 196, 51, 239, 7, 205, 176, 124, 161, 183, + 183, 59, 13, 224, 138, 215, 236, 30, 180, 134, 216, 221, 148, 173, 83, 79, + 249, 25, 54, 47, 86, 70, 150, 38, 86, 127, 134, 88, 227, 181, 196, 100, + 189, 197, 193, 173, 134, 130, 140, 10, 240, 215, 50, 42, 195, 214, 212, 162, + 117, 190, 168, 14, 111, 42, 163, 235, 117, 37, 108, 208, 38, 236, 189, 29, + 156, 250, 127, 215, 214, 70, 208, 113, 51, 78, 245, 216, 137, 111, 8, 114, + 36, 186, 228, 217, 75, 194, 119, 21, 9, 211, 169, 30, 59, 21, 147, 240, + 144, 13, 207, 72, 212, 211, 25, 73, 59, 214, 19, 71, 69, 104, 51, 139, + 166, 196, 29, 207, 39, 162, 1, 11, 128, 52, 208, 240, 229, 225, 188, 195, + 162, 239, 229, 214, 23, 123, 112, 41, 223, 150, 250, 182, 47, 75, 245, 218, + 69, 0, 77, 70, 22, 25, 200, 217, 238, 195, 208, 190, 100, 21, 47, 117, + 161, 65, 219, 146, 203, 18, 155, 41, 191, 39, 200, 52, 229, 64, 70, 49, + 20, 80, 9, 133, 6, 13, 105, 193, 251, 97, 43, 78, 135, 104, 123, 219, + 174, 54, 88, 7, 21, 134, 139, 58, 59, 114, 85, 156, 22, 226, 120, 110, + 28, 169, 21, 71, 34, 254, 48, 23, 75, 167, 212, 230, 88, 73, 82, 237, + 36, 86, 58, 173, 90, 146, 119, 235, 234, 194, 211, 234, 148, 237, 142, 153, + 229, 78, 65, 150, 59, 249, 196, 189, 84, 150, 189, 162, 44, 123, 249, 88, + 157, 84, 150, 59, 69, 89, 238, 60, 147, 101, 193, 210, 165, 29, 125, 224, + 180, 168, 161, 44, 222, 33, 57, 166, 166, 132, 244, 145, 127, 106, 28, 24, + 147, 137, 82, 11, 230, 41, 37, 23, 233, 225, 242, 60, 106, 169, 163, 128, + 79, 25, 188, 20, 218, 132, 168, 146, 161, 45, 91, 184, 251, 130, 129, 85, + 113, 157, 160, 221, 175, 98, 211, 213, 108, 58, 123, 218, 189, 204, 14, 167, + 158, 123, 80, 216, 250, 77, 6, 116, 84, 138, 69, 2, 40, 22, 233, 123, + 39, 214, 207, 216, 21, 82, 93, 198, 86, 223, 180, 226, 224, 142, 59, 242, + 255, 105, 163, 182, 241, 119, 125, 190, 95, 199, 57, 67, 16, 64, 176, 198, + 163, 47, 245, 3, 65, 84, 54, 149, 32, 41, 132, 48, 6, 144, 85, 173, + 135, 166, 148, 107, 181, 4, 64, 216, 51, 175, 53, 202, 135, 215, 0, 78, + 171, 149, 186, 47, 168, 147, 206, 190, 252, 61, 228, 118, 236, 125, 167, 17, + 184, 239, 130, 195, 101, 237, 62, 60, 245, 122, 238, 25, 84, 40, 173, 43, + 223, 87, 157, 53, 237, 58, 190, 175, 66, 172, 196, 222, 83, 141, 121, 239, + 160, 93, 75, 199, 234, 53, 2, 31, 177, 180, 56, 211, 26, 238, 192, 57, + 163, 40, 103, 165, 155, 85, 100, 85, 238, 160, 117, 199, 177, 238, 222, 175, + 191, 119, 172, 122, 253, 206, 41, 61, 186, 228, 116, 119, 186, 254, 254, 172, + 244, 200, 82, 57, 119, 117, 175, 202, 214, 239, 47, 238, 46, 107, 131, 10, + 62, 231, 238, 55, 21, 207, 106, 88, 143, 110, 245, 221, 35, 180, 8, 85, + 207, 172, 239, 203, 124, 43, 204, 10, 250, 56, 247, 94, 9, 184, 211, 1, + 35, 22, 7, 114, 90, 9, 229, 186, 214, 104, 51, 90, 250, 149, 143, 206, + 23, 218, 43, 245, 220, 211, 251, 208, 249, 224, 252, 222, 113, 45, 218, 187, + 166, 116, 242, 150, 234, 232, 206, 246, 24, 250, 71, 235, 153, 219, 54, 134, + 39, 238, 40, 205, 185, 172, 42, 220, 194, 201, 114, 162, 82, 119, 81, 16, + 201, 222, 143, 215, 7, 70, 187, 110, 42, 253, 182, 74, 145, 222, 53, 43, + 135, 143, 70, 115, 62, 249, 134, 38, 57, 159, 183, 194, 73, 250, 167, 18, + 208, 196, 88, 243, 83, 244, 88, 227, 94, 83, 20, 119, 88, 162, 100, 149, + 117, 27, 29, 1, 207, 54, 251, 77, 230, 188, 182, 253, 66, 47, 90, 88, + 123, 183, 217, 171, 93, 168, 19, 131, 88, 130, 96, 118, 184, 148, 227, 147, + 50, 3, 67, 127, 83, 170, 252, 145, 154, 239, 207, 172, 86, 201, 66, 203, + 239, 78, 43, 179, 134, 87, 173, 190, 19, 159, 109, 141, 70, 193, 105, 229, + 137, 156, 206, 56, 152, 242, 79, 7, 62, 43, 93, 252, 209, 249, 179, 243, + 253, 101, 185, 148, 20, 183, 116, 20, 11, 62, 53, 30, 210, 87, 238, 204, + 104, 226, 196, 54, 151, 239, 220, 161, 143, 48, 19, 172, 254, 17, 123, 151, + 223, 136, 19, 205, 211, 164, 6, 14, 190, 163, 120, 208, 212, 68, 243, 58, + 86, 86, 15, 235, 41, 12, 190, 117, 45, 134, 224, 132, 122, 3, 148, 160, + 181, 148, 50, 180, 54, 180, 212, 51, 32, 118, 137, 85, 55, 119, 89, 55, + 154, 221, 99, 229, 245, 118, 31, 174, 12, 115, 93, 23, 197, 105, 215, 124, + 206, 124, 82, 26, 17, 57, 185, 41, 140, 185, 246, 102, 26, 106, 58, 120, + 37, 212, 180, 46, 255, 139, 204, 104, 92, 81, 89, 80, 85, 120, 200, 196, + 244, 155, 42, 144, 215, 28, 141, 21, 44, 245, 103, 53, 244, 8, 3, 240, + 161, 84, 152, 167, 42, 204, 87, 21, 22, 168, 10, 107, 73, 133, 181, 165, + 194, 58, 82, 97, 93, 174, 175, 30, 87, 23, 213, 225, 9, 98, 64, 97, + 118, 221, 160, 107, 141, 99, 139, 227, 25, 87, 175, 122, 2, 206, 212, 167, + 251, 43, 234, 51, 61, 220, 142, 87, 103, 174, 251, 42, 119, 72, 17, 191, + 94, 202, 134, 251, 249, 136, 230, 149, 249, 116, 62, 4, 110, 213, 124, 116, + 207, 103, 178, 67, 131, 28, 146, 97, 193, 26, 28, 8, 97, 245, 167, 117, + 191, 95, 61, 148, 140, 131, 45, 78, 68, 21, 100, 152, 202, 201, 209, 22, + 131, 114, 2, 213, 227, 255, 225, 70, 50, 90, 64, 43, 40, 200, 182, 64, + 146, 169, 87, 85, 175, 46, 119, 182, 122, 239, 199, 175, 211, 204, 96, 0, + 159, 95, 136, 32, 77, 247, 112, 57, 24, 200, 97, 26, 85, 200, 102, 93, + 169, 18, 139, 6, 198, 165, 233, 85, 173, 225, 232, 17, 55, 33, 94, 175, + 225, 187, 7, 235, 91, 96, 222, 122, 192, 188, 181, 16, 244, 97, 61, 16, + 30, 170, 206, 192, 160, 250, 98, 14, 19, 60, 66, 150, 199, 171, 199, 81, + 20, 242, 246, 88, 35, 100, 130, 94, 89, 116, 35, 12, 135, 138, 70, 70, + 74, 161, 197, 50, 67, 0, 229, 3, 38, 31, 32, 249, 122, 236, 2, 169, + 28, 15, 144, 124, 30, 66, 123, 16, 45, 162, 140, 5, 240, 43, 239, 143, + 228, 255, 80, 102, 111, 27, 201, 58, 246, 183, 101, 17, 71, 2, 145, 125, + 64, 83, 167, 127, 136, 5, 26, 160, 22, 236, 239, 127, 71, 211, 225, 215, + 243, 203, 86, 157, 216, 20, 171, 44, 82, 192, 20, 93, 196, 206, 57, 255, + 151, 103, 214, 52, 132, 3, 253, 86, 200, 241, 219, 50, 4, 129, 255, 180, + 17, 23, 226, 116, 251, 98, 175, 85, 190, 107, 80, 248, 106, 25, 151, 209, + 198, 145, 237, 35, 245, 87, 37, 95, 194, 87, 0, 212, 123, 153, 193, 90, + 84, 29, 254, 126, 138, 143, 51, 163, 133, 116, 100, 102, 186, 17, 205, 117, + 240, 235, 241, 175, 63, 240, 120, 190, 215, 153, 44, 177, 118, 6, 28, 111, + 84, 126, 239, 44, 127, 15, 97, 111, 113, 17, 235, 89, 105, 178, 146, 99, + 10, 64, 132, 51, 5, 65, 56, 70, 192, 10, 172, 181, 117, 120, 187, 132, + 103, 181, 198, 25, 130, 233, 20, 30, 213, 43, 9, 168, 217, 33, 182, 129, + 219, 241, 220, 171, 70, 197, 110, 157, 164, 125, 188, 216, 167, 151, 241, 241, + 99, 31, 154, 240, 99, 47, 46, 24, 139, 254, 178, 169, 108, 186, 123, 177, + 187, 151, 114, 247, 99, 119, 159, 220, 179, 237, 83, 202, 183, 79, 194, 181, + 5, 224, 218, 104, 59, 96, 221, 213, 7, 100, 70, 147, 221, 93, 190, 119, + 191, 25, 175, 238, 119, 21, 177, 57, 252, 161, 141, 102, 109, 128, 253, 38, + 22, 243, 84, 243, 146, 53, 174, 93, 212, 247, 159, 54, 20, 232, 172, 244, + 23, 114, 92, 60, 204, 43, 127, 114, 38, 225, 232, 182, 66, 37, 189, 192, + 214, 132, 118, 27, 212, 35, 56, 196, 23, 148, 39, 90, 109, 42, 66, 137, + 118, 15, 54, 59, 251, 134, 115, 135, 157, 187, 112, 14, 12, 231, 62, 59, + 123, 158, 145, 206, 23, 207, 225, 143, 47, 159, 192, 249, 11, 37, 34, 255, + 115, 157, 200, 179, 49, 10, 140, 250, 169, 211, 20, 86, 211, 201, 194, 214, + 169, 233, 212, 96, 243, 220, 154, 78, 69, 116, 73, 150, 211, 232, 208, 78, + 233, 223, 88, 18, 222, 119, 218, 142, 231, 94, 214, 24, 190, 85, 169, 166, + 68, 68, 218, 51, 161, 150, 163, 135, 101, 229, 237, 16, 227, 125, 61, 120, + 235, 60, 110, 136, 217, 86, 50, 233, 220, 72, 13, 235, 223, 104, 18, 138, + 179, 225, 148, 36, 103, 5, 142, 8, 233, 93, 198, 89, 76, 66, 230, 28, + 17, 210, 191, 140, 115, 159, 132, 52, 28, 173, 203, 106, 149, 153, 109, 252, + 191, 252, 142, 74, 194, 195, 147, 226, 98, 128, 158, 149, 42, 153, 225, 95, + 253, 166, 66, 193, 48, 95, 14, 172, 120, 216, 176, 131, 35, 195, 80, 134, + 0, 19, 195, 198, 47, 29, 202, 187, 84, 195, 84, 134, 131, 132, 242, 179, + 161, 124, 9, 229, 75, 40, 95, 242, 150, 180, 90, 221, 250, 75, 109, 249, + 93, 185, 52, 62, 170, 116, 204, 122, 176, 108, 61, 139, 26, 235, 192, 81, + 241, 217, 120, 198, 205, 157, 46, 29, 95, 111, 176, 174, 228, 184, 81, 98, + 196, 4, 10, 58, 207, 144, 66, 215, 122, 197, 150, 14, 192, 59, 232, 192, + 233, 20, 203, 185, 210, 106, 176, 133, 200, 128, 94, 34, 247, 79, 191, 115, + 79, 253, 131, 92, 79, 66, 210, 107, 172, 125, 212, 57, 25, 240, 133, 181, + 19, 195, 12, 171, 123, 218, 63, 69, 225, 98, 20, 237, 104, 223, 228, 115, + 100, 139, 119, 230, 180, 86, 227, 46, 181, 165, 2, 253, 121, 74, 115, 199, + 68, 130, 121, 221, 84, 56, 4, 243, 250, 42, 220, 95, 166, 209, 38, 148, + 96, 65, 138, 28, 203, 159, 181, 88, 250, 34, 115, 36, 154, 110, 132, 132, + 169, 120, 151, 60, 190, 170, 227, 105, 38, 180, 161, 38, 220, 218, 181, 54, + 64, 15, 95, 164, 45, 224, 48, 106, 188, 35, 3, 11, 6, 198, 226, 141, + 249, 46, 43, 69, 39, 120, 145, 206, 49, 66, 65, 142, 144, 255, 171, 8, + 201, 46, 67, 115, 49, 70, 57, 107, 58, 87, 245, 68, 139, 82, 156, 249, + 154, 166, 153, 247, 12, 10, 60, 41, 17, 221, 245, 85, 95, 196, 57, 205, + 63, 196, 144, 55, 154, 140, 71, 253, 31, 207, 220, 213, 133, 112, 44, 235, + 245, 155, 185, 108, 8, 12, 191, 134, 13, 68, 85, 20, 177, 129, 114, 123, + 247, 15, 239, 90, 68, 101, 150, 245, 191, 171, 190, 44, 83, 155, 214, 111, + 173, 58, 17, 160, 126, 77, 229, 73, 37, 229, 244, 104, 64, 0, 12, 72, + 124, 67, 222, 31, 104, 189, 135, 83, 224, 247, 89, 229, 223, 111, 172, 249, + 116, 68, 204, 199, 230, 105, 37, 26, 7, 45, 165, 6, 101, 20, 77, 173, + 229, 116, 10, 69, 225, 155, 149, 69, 235, 159, 104, 128, 19, 200, 148, 102, + 57, 37, 18, 209, 240, 248, 198, 156, 59, 58, 139, 46, 164, 37, 23, 154, + 205, 131, 168, 169, 217, 143, 6, 169, 213, 247, 155, 192, 127, 215, 105, 157, + 93, 140, 28, 250, 119, 121, 112, 90, 214, 13, 11, 161, 156, 127, 135, 151, + 111, 178, 192, 146, 209, 39, 198, 141, 102, 209, 134, 87, 101, 97, 163, 106, + 125, 160, 30, 164, 121, 196, 178, 210, 82, 194, 39, 101, 34, 24, 9, 49, + 192, 45, 244, 210, 156, 234, 33, 91, 44, 204, 216, 5, 30, 188, 149, 136, + 78, 186, 152, 158, 246, 13, 125, 46, 126, 176, 166, 219, 251, 166, 104, 113, + 190, 97, 229, 214, 191, 227, 131, 144, 155, 218, 119, 180, 128, 85, 188, 198, + 77, 181, 166, 36, 27, 107, 148, 37, 57, 52, 41, 51, 255, 255, 231, 24, + 174, 157, 230, 89, 236, 28, 156, 160, 227, 180, 250, 152, 103, 123, 158, 8, + 111, 251, 244, 109, 209, 228, 220, 233, 59, 190, 143, 59, 147, 14, 37, 136, + 134, 249, 243, 155, 193, 19, 159, 136, 252, 217, 145, 255, 3, 209, 121, 26, + 107, 150, 199, 132, 131, 183, 10, 247, 203, 219, 193, 126, 189, 137, 6, 166, + 2, 73, 226, 245, 203, 111, 137, 89, 185, 9, 121, 207, 16, 57, 111, 155, + 20, 238, 109, 117, 48, 224, 35, 62, 114, 169, 54, 90, 252, 212, 1, 50, + 85, 175, 138, 207, 154, 40, 83, 4, 218, 26, 122, 158, 51, 161, 148, 107, + 216, 138, 38, 117, 5, 152, 66, 24, 85, 7, 251, 131, 214, 51, 57, 221, + 42, 216, 69, 98, 241, 168, 191, 81, 8, 69, 222, 162, 96, 146, 83, 233, + 85, 44, 80, 202, 212, 69, 220, 8, 66, 76, 106, 35, 247, 52, 155, 64, + 169, 91, 245, 236, 34, 114, 34, 117, 184, 69, 125, 79, 196, 154, 236, 224, + 148, 10, 32, 59, 55, 168, 174, 116, 157, 167, 115, 218, 10, 89, 81, 48, + 225, 199, 36, 1, 43, 108, 93, 61, 108, 180, 90, 77, 51, 22, 159, 214, + 161, 27, 137, 4, 213, 171, 210, 85, 87, 122, 56, 4, 23, 21, 60, 162, + 7, 169, 204, 42, 140, 88, 201, 38, 13, 28, 170, 213, 229, 162, 252, 182, + 26, 75, 152, 15, 85, 14, 88, 13, 29, 11, 61, 230, 180, 23, 25, 35, + 54, 115, 20, 120, 84, 99, 233, 111, 31, 199, 137, 50, 71, 99, 96, 58, + 102, 46, 177, 31, 203, 204, 35, 180, 19, 21, 169, 208, 118, 142, 231, 138, + 48, 202, 165, 218, 198, 215, 196, 75, 63, 205, 136, 67, 141, 71, 56, 215, + 91, 29, 77, 210, 180, 252, 150, 53, 60, 82, 220, 127, 124, 24, 253, 206, + 85, 194, 106, 153, 161, 244, 202, 166, 5, 31, 200, 209, 95, 120, 144, 229, + 240, 227, 37, 31, 197, 233, 186, 39, 124, 190, 205, 39, 203, 180, 54, 120, + 137, 166, 61, 43, 115, 18, 108, 182, 55, 141, 143, 225, 104, 67, 67, 113, + 207, 163, 251, 27, 255, 157, 151, 123, 227, 48, 44, 219, 113, 56, 253, 214, + 200, 116, 104, 27, 40, 243, 5, 61, 39, 167, 244, 106, 52, 222, 12, 246, + 84, 95, 167, 79, 74, 30, 93, 137, 199, 90, 117, 250, 83, 103, 174, 124, + 238, 90, 131, 28, 39, 130, 43, 201, 215, 53, 68, 95, 61, 190, 243, 133, + 43, 203, 97, 226, 244, 217, 117, 91, 202, 197, 20, 218, 188, 184, 44, 97, + 153, 166, 32, 56, 71, 95, 91, 59, 167, 99, 28, 23, 172, 103, 124, 150, + 211, 18, 97, 66, 40, 22, 227, 43, 22, 95, 174, 237, 121, 35, 160, 246, + 6, 59, 185, 93, 81, 18, 158, 68, 82, 17, 233, 89, 43, 234, 37, 3, + 251, 252, 140, 242, 90, 187, 24, 253, 139, 231, 84, 70, 231, 231, 94, 85, + 25, 124, 50, 64, 237, 6, 196, 65, 209, 150, 43, 171, 222, 136, 141, 34, + 252, 77, 121, 19, 109, 88, 91, 46, 91, 252, 36, 195, 111, 201, 43, 101, + 168, 248, 14, 38, 74, 140, 20, 185, 107, 181, 33, 100, 232, 249, 110, 87, + 196, 70, 123, 253, 160, 223, 235, 56, 141, 118, 175, 25, 244, 40, 34, 57, + 181, 187, 126, 191, 29, 64, 240, 177, 231, 119, 57, 80, 199, 111, 117, 187, + 16, 19, 109, 118, 218, 237, 46, 244, 128, 247, 59, 221, 94, 11, 47, 127, + 131, 62, 81, 162, 176, 110, 47, 232, 66, 196, 52, 8, 168, 50, 123, 114, + 159, 0, 134, 222, 16, 174, 180, 88, 66, 12, 47, 68, 220, 108, 183, 116, + 115, 15, 5, 89, 240, 210, 143, 239, 228, 89, 211, 181, 18, 190, 212, 42, + 77, 240, 140, 72, 107, 198, 100, 137, 71, 40, 48, 161, 246, 87, 98, 172, + 162, 228, 58, 137, 15, 241, 82, 115, 154, 162, 137, 35, 92, 78, 183, 5, + 253, 171, 174, 189, 112, 123, 25, 223, 91, 4, 234, 222, 66, 61, 232, 81, + 175, 205, 228, 85, 15, 174, 171, 228, 142, 115, 223, 141, 183, 99, 29, 83, + 96, 31, 135, 160, 29, 12, 96, 181, 109, 201, 43, 37, 77, 109, 40, 51, + 153, 124, 145, 127, 138, 115, 156, 225, 158, 24, 101, 166, 88, 17, 105, 161, + 126, 216, 27, 203, 141, 195, 209, 68, 199, 216, 80, 242, 146, 49, 225, 10, + 227, 39, 142, 96, 56, 69, 139, 188, 222, 28, 228, 148, 210, 208, 36, 160, + 244, 209, 52, 99, 53, 221, 113, 32, 60, 255, 40, 190, 77, 138, 179, 253, + 154, 130, 171, 2, 166, 138, 62, 100, 212, 192, 57, 68, 90, 244, 11, 193, + 120, 55, 164, 142, 90, 141, 45, 144, 113, 217, 204, 205, 105, 238, 128, 18, + 49, 211, 196, 181, 149, 184, 26, 111, 75, 219, 137, 171, 159, 184, 118, 98, + 129, 220, 216, 55, 72, 124, 187, 185, 180, 11, 19, 236, 61, 19, 140, 58, + 121, 18, 176, 111, 101, 46, 206, 139, 168, 121, 238, 209, 80, 158, 218, 68, + 102, 234, 174, 98, 183, 175, 236, 206, 149, 221, 189, 178, 123, 85, 43, 91, + 185, 188, 1, 97, 147, 70, 184, 40, 208, 64, 40, 82, 68, 245, 92, 195, + 80, 55, 51, 237, 23, 178, 211, 117, 228, 129, 190, 18, 105, 174, 67, 219, + 59, 186, 159, 107, 189, 31, 36, 207, 174, 90, 120, 85, 130, 53, 83, 152, + 99, 117, 149, 25, 104, 177, 169, 107, 166, 21, 88, 203, 139, 248, 176, 130, + 165, 173, 68, 217, 176, 22, 62, 183, 254, 133, 17, 39, 84, 237, 244, 209, + 65, 52, 39, 165, 28, 124, 171, 1, 10, 232, 250, 53, 24, 26, 222, 115, + 209, 3, 137, 110, 53, 36, 130, 165, 30, 204, 149, 78, 53, 141, 122, 77, + 164, 209, 235, 76, 12, 55, 109, 218, 228, 199, 166, 192, 82, 6, 215, 26, + 65, 188, 68, 111, 208, 26, 34, 131, 83, 71, 43, 241, 145, 71, 106, 212, + 152, 245, 248, 226, 192, 73, 55, 66, 102, 218, 16, 79, 60, 202, 155, 76, + 19, 213, 88, 5, 115, 136, 86, 74, 92, 60, 153, 140, 99, 17, 144, 18, + 87, 33, 171, 217, 92, 9, 191, 201, 245, 177, 247, 166, 141, 78, 61, 252, + 164, 149, 60, 74, 253, 242, 58, 1, 57, 35, 135, 183, 50, 117, 214, 187, + 41, 82, 112, 231, 3, 142, 70, 235, 119, 251, 112, 194, 103, 17, 210, 184, + 250, 86, 111, 158, 104, 0, 45, 45, 62, 13, 246, 23, 225, 194, 9, 63, + 93, 38, 178, 231, 201, 164, 140, 131, 62, 94, 11, 101, 41, 133, 6, 225, + 197, 39, 206, 71, 23, 61, 164, 166, 196, 122, 164, 97, 187, 232, 23, 21, + 219, 187, 178, 253, 43, 59, 168, 106, 137, 225, 166, 228, 120, 31, 94, 96, + 161, 206, 40, 169, 142, 30, 133, 132, 126, 215, 36, 18, 23, 243, 68, 184, + 38, 55, 237, 21, 87, 251, 43, 155, 50, 215, 90, 249, 70, 189, 15, 113, + 27, 37, 223, 34, 93, 204, 38, 122, 134, 70, 93, 125, 57, 113, 80, 203, + 165, 21, 46, 30, 32, 130, 192, 152, 156, 199, 180, 95, 94, 63, 105, 64, + 54, 0, 108, 172, 31, 128, 71, 166, 29, 104, 145, 96, 61, 62, 91, 62, + 205, 7, 26, 172, 214, 33, 160, 16, 205, 98, 235, 146, 216, 253, 216, 2, + 184, 120, 193, 13, 149, 130, 205, 169, 173, 127, 155, 74, 74, 207, 253, 143, + 84, 73, 137, 215, 242, 189, 255, 86, 73, 249, 223, 42, 41, 255, 91, 37, + 229, 127, 171, 164, 252, 47, 171, 146, 50, 215, 42, 255, 68, 10, 41, 83, + 43, 206, 175, 82, 72, 41, 51, 253, 127, 178, 66, 202, 244, 130, 40, 203, + 165, 215, 135, 50, 204, 255, 154, 10, 41, 83, 90, 27, 61, 28, 243, 120, + 140, 101, 1, 213, 141, 30, 164, 68, 60, 136, 137, 120, 144, 19, 241, 160, + 186, 209, 131, 156, 8, 109, 202, 161, 8, 210, 84, 41, 120, 253, 36, 200, + 186, 183, 55, 163, 225, 232, 126, 59, 196, 201, 88, 108, 241, 219, 162, 203, + 111, 57, 165, 238, 188, 28, 122, 29, 215, 77, 57, 140, 160, 230, 141, 163, + 132, 115, 96, 238, 18, 255, 51, 223, 140, 242, 14, 129, 159, 117, 105, 37, + 14, 55, 247, 195, 214, 240, 126, 254, 64, 132, 40, 61, 229, 56, 187, 31, + 182, 197, 209, 8, 57, 187, 95, 15, 123, 137, 21, 57, 184, 145, 64, 237, + 216, 113, 123, 63, 244, 29, 192, 201, 222, 1, 141, 157, 34, 15, 199, 75, + 101, 159, 133, 144, 34, 20, 116, 91, 229, 180, 105, 208, 228, 201, 249, 53, + 237, 156, 93, 211, 161, 149, 216, 163, 176, 33, 118, 141, 159, 59, 236, 116, + 90, 166, 165, 107, 88, 186, 120, 142, 55, 159, 79, 195, 97, 24, 113, 36, + 101, 91, 69, 155, 25, 3, 100, 43, 187, 40, 229, 160, 108, 0, 171, 118, + 52, 79, 59, 247, 92, 19, 143, 56, 203, 176, 113, 235, 197, 41, 222, 111, + 105, 52, 185, 15, 143, 117, 81, 11, 214, 104, 56, 71, 189, 142, 249, 28, + 141, 81, 63, 238, 243, 156, 87, 161, 31, 227, 197, 22, 231, 78, 188, 142, + 249, 28, 141, 113, 60, 153, 103, 114, 144, 205, 93, 167, 231, 102, 115, 197, + 78, 89, 151, 92, 136, 60, 153, 2, 202, 69, 77, 146, 184, 23, 58, 23, + 135, 61, 66, 250, 88, 146, 245, 58, 3, 249, 102, 253, 138, 218, 32, 113, + 47, 116, 46, 14, 155, 79, 182, 168, 222, 187, 185, 170, 237, 102, 107, 182, + 235, 102, 253, 115, 36, 242, 68, 179, 109, 216, 45, 174, 232, 110, 97, 61, + 119, 11, 170, 185, 91, 88, 203, 221, 226, 74, 238, 22, 215, 99, 183, 176, + 26, 187, 5, 181, 216, 45, 172, 196, 110, 65, 29, 66, 141, 192, 240, 235, + 148, 102, 4, 13, 225, 221, 48, 83, 45, 242, 126, 214, 247, 25, 207, 231, + 226, 61, 155, 163, 231, 243, 171, 218, 229, 217, 108, 229, 218, 238, 88, 144, + 151, 66, 20, 204, 153, 196, 33, 137, 206, 51, 44, 97, 55, 247, 152, 10, + 198, 72, 43, 109, 79, 89, 211, 126, 140, 185, 110, 58, 212, 51, 214, 156, + 189, 32, 74, 54, 208, 120, 181, 154, 231, 114, 33, 142, 121, 183, 130, 80, + 69, 228, 178, 105, 196, 251, 243, 108, 58, 137, 71, 177, 251, 145, 208, 199, + 200, 31, 77, 183, 168, 38, 12, 207, 36, 90, 224, 186, 238, 181, 153, 77, + 229, 144, 182, 103, 124, 179, 209, 115, 244, 242, 41, 204, 198, 25, 135, 162, + 42, 202, 250, 28, 241, 56, 22, 62, 155, 102, 81, 53, 229, 124, 142, 122, + 77, 71, 209, 124, 103, 114, 26, 237, 212, 56, 97, 123, 202, 154, 246, 171, + 103, 172, 25, 187, 81, 200, 66, 247, 35, 161, 143, 81, 161, 234, 53, 60, + 250, 153, 156, 246, 211, 169, 244, 211, 126, 245, 140, 53, 103, 207, 56, 228, + 166, 140, 196, 49, 239, 86, 16, 202, 36, 215, 79, 175, 82, 108, 79, 89, + 211, 126, 153, 168, 245, 140, 61, 159, 179, 126, 126, 25, 210, 110, 5, 161, + 138, 200, 101, 211, 200, 45, 63, 137, 99, 222, 173, 32, 84, 17, 185, 122, + 221, 212, 24, 105, 158, 2, 38, 243, 167, 56, 65, 79, 148, 108, 3, 156, + 66, 215, 250, 237, 17, 247, 232, 136, 251, 110, 154, 247, 88, 67, 75, 79, + 214, 85, 171, 94, 83, 106, 35, 178, 222, 172, 120, 162, 200, 177, 32, 71, + 236, 156, 207, 16, 59, 23, 228, 135, 150, 17, 116, 116, 218, 79, 28, 245, + 90, 111, 38, 69, 126, 143, 5, 229, 224, 243, 219, 156, 43, 148, 19, 133, + 35, 163, 21, 210, 167, 175, 201, 158, 77, 116, 6, 203, 149, 67, 188, 119, + 123, 132, 92, 210, 208, 215, 187, 53, 214, 19, 17, 22, 56, 204, 110, 141, + 61, 157, 118, 140, 166, 163, 185, 236, 225, 82, 206, 219, 6, 18, 234, 197, + 59, 161, 233, 221, 102, 20, 25, 91, 167, 41, 212, 74, 242, 30, 102, 139, + 179, 99, 211, 81, 169, 188, 200, 4, 21, 215, 100, 107, 37, 106, 211, 144, + 161, 225, 114, 156, 119, 123, 28, 179, 58, 144, 219, 104, 116, 63, 99, 125, + 212, 235, 241, 104, 206, 9, 22, 213, 210, 114, 250, 148, 116, 85, 138, 30, + 175, 235, 48, 39, 38, 61, 69, 139, 89, 89, 40, 75, 51, 29, 28, 102, + 195, 213, 12, 161, 131, 83, 149, 124, 213, 193, 97, 54, 92, 205, 16, 20, + 220, 220, 219, 54, 76, 91, 202, 39, 29, 142, 162, 229, 170, 162, 145, 115, + 202, 135, 41, 136, 150, 37, 133, 205, 113, 35, 231, 148, 15, 83, 16, 45, + 75, 170, 151, 39, 213, 203, 146, 234, 229, 73, 245, 142, 144, 154, 233, 246, + 223, 232, 237, 120, 76, 125, 147, 221, 160, 199, 33, 234, 121, 151, 188, 19, + 152, 144, 204, 78, 62, 33, 29, 239, 237, 179, 33, 234, 121, 151, 188, 19, + 145, 46, 234, 137, 52, 103, 115, 79, 204, 29, 136, 36, 93, 224, 216, 33, + 137, 42, 86, 129, 91, 61, 119, 46, 163, 123, 224, 177, 163, 26, 14, 83, + 16, 77, 147, 210, 195, 220, 75, 72, 25, 78, 249, 48, 5, 209, 178, 164, + 90, 121, 82, 173, 44, 169, 86, 158, 84, 171, 128, 84, 47, 79, 170, 151, + 37, 213, 203, 147, 234, 21, 21, 176, 83, 80, 194, 220, 36, 104, 86, 87, + 218, 173, 96, 96, 45, 199, 5, 67, 178, 112, 18, 91, 142, 139, 6, 230, + 114, 92, 72, 246, 177, 144, 236, 99, 225, 220, 88, 68, 246, 49, 79, 22, + 117, 155, 207, 173, 184, 22, 134, 44, 142, 95, 68, 246, 161, 144, 236, 67, + 1, 217, 135, 66, 178, 15, 197, 100, 243, 149, 32, 174, 133, 33, 139, 227, + 167, 184, 25, 190, 156, 76, 150, 134, 160, 237, 185, 124, 150, 182, 153, 143, + 231, 225, 189, 147, 117, 92, 140, 82, 110, 15, 235, 251, 84, 176, 160, 40, + 110, 80, 16, 55, 72, 226, 74, 22, 253, 160, 151, 138, 156, 115, 69, 108, + 211, 49, 27, 189, 95, 24, 189, 95, 20, 189, 159, 68, 55, 117, 206, 199, + 23, 180, 9, 55, 113, 31, 77, 199, 225, 218, 24, 242, 204, 123, 193, 122, + 163, 183, 37, 195, 100, 91, 44, 28, 141, 225, 171, 28, 90, 5, 14, 91, + 53, 150, 32, 195, 91, 48, 165, 248, 154, 111, 96, 87, 225, 126, 68, 69, + 160, 153, 137, 225, 237, 116, 9, 29, 235, 217, 228, 211, 238, 42, 182, 233, + 46, 53, 145, 104, 25, 27, 118, 90, 25, 63, 176, 51, 202, 15, 17, 31, + 215, 89, 255, 6, 211, 219, 102, 2, 30, 139, 157, 230, 116, 196, 39, 199, + 0, 137, 115, 43, 227, 12, 125, 108, 163, 132, 161, 203, 101, 221, 47, 116, + 108, 23, 149, 209, 228, 152, 182, 208, 202, 60, 228, 246, 102, 18, 71, 246, + 95, 230, 14, 7, 6, 165, 125, 150, 122, 13, 51, 167, 55, 211, 72, 189, + 55, 81, 82, 92, 209, 244, 102, 176, 183, 91, 223, 184, 239, 24, 172, 200, + 8, 115, 113, 101, 147, 39, 110, 224, 240, 113, 128, 244, 227, 136, 56, 202, + 222, 191, 170, 180, 234, 118, 80, 61, 64, 100, 207, 53, 223, 179, 152, 4, + 142, 200, 46, 139, 166, 228, 248, 110, 231, 223, 229, 162, 232, 93, 217, 113, + 202, 127, 73, 36, 147, 173, 104, 250, 203, 67, 8, 133, 62, 163, 163, 162, + 205, 155, 149, 245, 180, 138, 238, 44, 170, 24, 234, 133, 243, 93, 74, 154, + 57, 93, 176, 250, 122, 179, 138, 166, 82, 20, 150, 191, 218, 48, 162, 253, + 244, 38, 47, 149, 161, 203, 93, 182, 205, 112, 86, 182, 6, 165, 42, 248, + 10, 14, 119, 151, 25, 217, 57, 29, 109, 80, 194, 99, 109, 166, 103, 191, + 201, 62, 152, 56, 23, 16, 153, 215, 138, 26, 179, 104, 22, 5, 102, 204, + 204, 139, 39, 103, 118, 121, 202, 34, 39, 1, 95, 51, 126, 153, 222, 64, + 69, 233, 120, 10, 120, 114, 121, 109, 230, 9, 134, 48, 238, 11, 155, 2, + 91, 158, 88, 229, 165, 153, 18, 166, 84, 80, 83, 124, 233, 159, 18, 168, + 137, 75, 76, 13, 179, 65, 79, 92, 100, 123, 142, 159, 237, 57, 113, 200, + 76, 255, 193, 19, 106, 224, 95, 21, 244, 149, 56, 202, 63, 67, 143, 241, + 255, 83, 122, 76, 82, 127, 64, 97, 255, 175, 223, 97, 2, 234, 48, 173, + 231, 58, 140, 60, 220, 127, 190, 171, 80, 152, 76, 39, 57, 210, 65, 210, + 175, 63, 255, 15, 235, 26, 252, 20, 245, 255, 232, 78, 33, 240, 221, 170, + 196, 171, 40, 153, 67, 70, 137, 52, 13, 67, 1, 217, 94, 185, 196, 160, + 34, 130, 153, 194, 112, 90, 252, 6, 203, 246, 225, 1, 159, 27, 6, 103, + 41, 219, 65, 25, 62, 240, 106, 149, 85, 152, 54, 12, 244, 237, 148, 19, + 41, 68, 19, 124, 69, 191, 98, 52, 36, 18, 141, 116, 150, 77, 45, 159, + 157, 8, 106, 235, 199, 155, 99, 145, 76, 48, 136, 197, 112, 246, 212, 57, + 210, 111, 246, 136, 125, 123, 92, 205, 161, 210, 195, 90, 223, 133, 247, 148, + 159, 125, 48, 192, 157, 253, 104, 44, 48, 31, 113, 0, 89, 65, 126, 162, + 178, 252, 84, 22, 173, 12, 109, 192, 171, 55, 90, 165, 84, 48, 37, 121, + 109, 153, 142, 182, 119, 113, 41, 210, 50, 21, 72, 83, 106, 212, 252, 22, + 94, 177, 217, 12, 151, 163, 67, 94, 184, 92, 62, 168, 217, 81, 50, 162, + 74, 140, 92, 162, 143, 19, 160, 121, 6, 175, 48, 210, 0, 132, 36, 63, + 154, 177, 60, 43, 150, 145, 129, 82, 245, 84, 40, 160, 116, 182, 157, 246, + 11, 161, 0, 212, 217, 117, 186, 47, 132, 2, 86, 103, 223, 233, 191, 16, + 10, 112, 157, 21, 8, 191, 52, 188, 179, 212, 167, 154, 10, 214, 145, 96, + 244, 239, 140, 23, 233, 51, 214, 160, 152, 11, 214, 53, 168, 97, 57, 111, + 248, 133, 212, 122, 18, 204, 79, 81, 243, 115, 193, 128, 222, 57, 26, 236, + 25, 21, 177, 226, 55, 88, 244, 198, 7, 236, 197, 53, 28, 201, 77, 185, + 64, 172, 135, 154, 110, 132, 148, 236, 209, 153, 125, 205, 134, 235, 51, 237, + 146, 166, 202, 136, 159, 191, 138, 44, 17, 36, 178, 42, 167, 100, 39, 218, + 5, 100, 209, 194, 21, 188, 243, 112, 169, 204, 141, 22, 151, 141, 209, 207, + 82, 161, 124, 85, 67, 103, 249, 90, 241, 2, 69, 1, 213, 145, 141, 215, + 50, 250, 79, 132, 214, 87, 40, 96, 9, 170, 83, 252, 32, 229, 120, 99, + 123, 237, 20, 21, 234, 29, 191, 137, 74, 39, 69, 197, 35, 18, 222, 107, + 233, 24, 100, 146, 53, 40, 51, 180, 143, 105, 154, 58, 58, 208, 89, 143, + 130, 249, 72, 247, 33, 122, 132, 184, 218, 43, 159, 153, 128, 251, 180, 194, + 169, 82, 255, 99, 141, 174, 215, 60, 228, 69, 240, 63, 56, 81, 208, 90, + 124, 132, 197, 146, 135, 203, 163, 88, 11, 169, 196, 95, 214, 157, 21, 103, + 211, 222, 95, 185, 153, 50, 76, 86, 183, 20, 17, 191, 182, 71, 217, 240, + 227, 108, 96, 198, 151, 236, 209, 2, 177, 167, 61, 81, 195, 14, 14, 39, + 122, 54, 202, 101, 82, 72, 189, 12, 184, 138, 132, 10, 114, 161, 158, 244, + 190, 174, 34, 227, 208, 220, 68, 130, 116, 142, 101, 99, 156, 90, 42, 2, + 44, 21, 113, 29, 98, 218, 60, 49, 38, 210, 24, 54, 33, 87, 177, 154, + 250, 203, 101, 137, 179, 145, 47, 208, 116, 114, 59, 93, 199, 43, 38, 192, + 115, 189, 19, 75, 28, 117, 29, 7, 197, 181, 200, 129, 94, 76, 91, 145, + 42, 78, 120, 184, 186, 185, 129, 0, 168, 89, 155, 165, 213, 122, 176, 95, + 31, 74, 140, 111, 118, 98, 17, 83, 59, 9, 167, 196, 132, 161, 157, 155, + 214, 249, 160, 201, 72, 11, 235, 187, 233, 124, 186, 89, 45, 121, 105, 76, + 52, 212, 104, 128, 62, 207, 58, 97, 16, 64, 4, 87, 170, 97, 237, 160, + 97, 183, 180, 32, 161, 238, 189, 205, 88, 93, 13, 86, 41, 253, 90, 2, + 210, 130, 20, 125, 181, 206, 172, 189, 102, 150, 95, 85, 240, 184, 124, 69, + 229, 231, 125, 252, 6, 202, 232, 167, 183, 156, 109, 173, 41, 224, 77, 138, + 51, 92, 175, 230, 172, 50, 36, 150, 138, 12, 68, 139, 147, 235, 183, 28, + 223, 109, 245, 88, 101, 93, 22, 90, 190, 16, 224, 159, 117, 128, 93, 124, + 44, 239, 255, 22, 244, 255, 118, 40, 127, 250, 238, 219, 75, 235, 59, 67, + 129, 211, 31, 146, 156, 252, 15, 201, 28, 37, 27, 51, 59, 13, 45, 13, + 223, 126, 51, 120, 82, 198, 206, 155, 193, 204, 26, 34, 25, 165, 129, 115, + 200, 207, 61, 215, 3, 89, 253, 139, 124, 212, 11, 60, 17, 114, 101, 88, + 21, 123, 143, 87, 10, 183, 11, 106, 228, 159, 44, 59, 41, 240, 161, 180, + 158, 41, 52, 71, 234, 7, 172, 75, 229, 28, 141, 61, 231, 118, 219, 123, + 117, 191, 102, 251, 208, 60, 196, 94, 239, 93, 107, 26, 113, 187, 237, 189, + 134, 248, 40, 166, 35, 30, 98, 76, 78, 189, 223, 23, 133, 128, 202, 203, + 183, 212, 235, 254, 40, 173, 130, 185, 5, 248, 4, 121, 117, 205, 143, 174, + 63, 141, 214, 119, 85, 56, 120, 202, 193, 94, 46, 170, 9, 153, 160, 212, + 196, 11, 93, 238, 77, 6, 22, 36, 0, 231, 28, 233, 138, 6, 96, 7, + 50, 128, 231, 188, 153, 176, 28, 148, 31, 81, 81, 135, 108, 4, 135, 124, + 132, 32, 135, 65, 205, 29, 80, 47, 47, 210, 224, 120, 98, 131, 87, 165, + 110, 10, 44, 129, 28, 200, 253, 96, 209, 215, 203, 121, 64, 3, 161, 81, + 86, 60, 43, 183, 46, 146, 206, 121, 89, 174, 58, 20, 172, 98, 131, 106, + 181, 148, 174, 4, 10, 121, 61, 26, 223, 229, 67, 210, 130, 158, 122, 126, + 78, 53, 37, 82, 226, 210, 246, 213, 243, 65, 203, 98, 125, 175, 162, 237, + 82, 148, 161, 138, 90, 83, 86, 80, 186, 127, 58, 56, 251, 217, 129, 29, + 36, 202, 79, 74, 215, 212, 131, 85, 46, 43, 220, 198, 212, 20, 65, 131, + 136, 151, 175, 180, 227, 21, 20, 241, 200, 10, 129, 45, 196, 177, 5, 44, + 75, 236, 197, 65, 158, 78, 165, 96, 148, 235, 0, 190, 156, 138, 165, 178, + 198, 110, 118, 235, 21, 11, 107, 134, 208, 171, 179, 37, 41, 228, 115, 21, + 174, 87, 247, 179, 213, 102, 170, 148, 147, 216, 216, 156, 221, 203, 73, 96, + 56, 30, 178, 246, 74, 94, 176, 248, 73, 193, 53, 112, 75, 146, 24, 182, + 126, 131, 24, 59, 189, 152, 29, 35, 114, 62, 47, 243, 209, 253, 156, 150, + 204, 209, 82, 87, 79, 236, 240, 107, 217, 15, 147, 216, 139, 121, 74, 146, + 205, 230, 9, 156, 221, 124, 53, 30, 205, 135, 171, 8, 149, 120, 236, 109, + 221, 17, 198, 201, 88, 178, 204, 248, 190, 5, 16, 253, 249, 116, 235, 243, + 249, 41, 191, 66, 164, 228, 222, 249, 151, 153, 146, 21, 241, 44, 197, 235, + 127, 81, 38, 245, 46, 48, 239, 103, 160, 61, 151, 113, 174, 234, 23, 146, + 120, 185, 222, 242, 132, 243, 109, 186, 88, 69, 212, 224, 243, 213, 109, 72, + 129, 141, 92, 165, 221, 213, 163, 54, 98, 92, 91, 204, 184, 182, 27, 29, + 208, 1, 6, 117, 142, 200, 203, 8, 53, 47, 144, 78, 243, 196, 74, 167, + 98, 80, 170, 8, 44, 73, 149, 183, 246, 149, 240, 124, 48, 124, 235, 190, + 197, 251, 169, 240, 61, 25, 251, 228, 65, 11, 93, 56, 32, 179, 243, 54, + 54, 158, 189, 253, 38, 124, 71, 235, 33, 248, 187, 241, 40, 154, 240, 124, + 92, 217, 111, 14, 213, 228, 232, 131, 181, 173, 180, 156, 167, 211, 78, 162, + 116, 136, 236, 51, 182, 3, 102, 244, 92, 161, 194, 24, 47, 228, 155, 169, + 115, 15, 227, 253, 133, 225, 156, 61, 29, 49, 222, 4, 254, 172, 116, 217, + 241, 217, 138, 192, 219, 118, 219, 137, 234, 91, 64, 112, 20, 180, 205, 63, + 84, 3, 150, 89, 3, 227, 187, 105, 68, 171, 216, 128, 42, 194, 210, 11, + 175, 15, 118, 151, 216, 142, 197, 110, 200, 203, 243, 59, 89, 165, 45, 187, + 92, 166, 216, 226, 33, 75, 250, 59, 181, 180, 139, 151, 90, 85, 125, 172, + 219, 249, 232, 195, 213, 120, 243, 12, 137, 196, 59, 33, 227, 23, 145, 1, + 234, 196, 115, 116, 18, 127, 169, 66, 131, 4, 118, 166, 101, 91, 21, 185, + 92, 21, 130, 170, 1, 248, 168, 173, 100, 82, 204, 134, 22, 215, 84, 112, + 173, 248, 34, 169, 48, 97, 192, 40, 106, 156, 166, 29, 148, 141, 103, 226, + 5, 193, 116, 21, 154, 225, 252, 103, 200, 29, 139, 19, 60, 71, 251, 72, + 126, 90, 217, 56, 117, 51, 161, 70, 217, 124, 137, 95, 16, 50, 33, 79, + 76, 151, 25, 186, 243, 44, 221, 56, 102, 51, 155, 74, 247, 249, 84, 52, + 145, 102, 65, 146, 189, 95, 145, 100, 66, 149, 145, 189, 210, 116, 99, 220, + 58, 224, 121, 75, 18, 120, 19, 249, 106, 226, 199, 104, 235, 194, 102, 21, + 135, 137, 50, 147, 55, 118, 39, 179, 58, 225, 24, 81, 167, 136, 133, 42, + 173, 223, 90, 65, 101, 63, 255, 242, 144, 23, 37, 165, 0, 43, 253, 240, + 240, 97, 17, 103, 204, 137, 51, 236, 196, 233, 201, 91, 101, 230, 239, 135, + 79, 128, 61, 95, 207, 166, 19, 125, 198, 97, 239, 91, 3, 154, 143, 177, + 64, 48, 159, 145, 15, 104, 123, 101, 89, 181, 10, 233, 188, 226, 253, 115, + 142, 96, 126, 189, 210, 187, 73, 94, 229, 23, 43, 136, 229, 40, 125, 107, + 215, 188, 219, 60, 31, 88, 109, 247, 68, 29, 148, 110, 102, 225, 18, 183, + 0, 234, 205, 123, 178, 201, 7, 108, 193, 40, 186, 159, 46, 45, 15, 103, + 106, 231, 3, 222, 76, 24, 13, 84, 151, 73, 2, 149, 11, 208, 2, 165, + 24, 84, 63, 11, 174, 89, 250, 97, 183, 202, 205, 203, 101, 211, 217, 46, + 42, 18, 110, 206, 239, 195, 173, 104, 160, 203, 65, 168, 172, 21, 102, 179, + 181, 158, 135, 227, 166, 90, 47, 53, 156, 131, 64, 9, 81, 97, 40, 210, + 35, 109, 15, 111, 167, 201, 211, 73, 62, 163, 215, 56, 90, 109, 5, 168, + 22, 190, 25, 252, 140, 51, 60, 89, 43, 96, 161, 21, 174, 90, 6, 160, + 128, 131, 63, 108, 165, 110, 56, 153, 78, 163, 127, 208, 104, 19, 212, 139, + 211, 15, 54, 137, 43, 193, 110, 233, 174, 169, 212, 177, 222, 53, 211, 187, + 135, 116, 177, 94, 174, 30, 163, 10, 10, 106, 8, 237, 24, 31, 127, 92, + 231, 15, 27, 208, 128, 104, 124, 163, 189, 149, 58, 189, 66, 214, 51, 33, + 247, 98, 198, 140, 148, 11, 242, 165, 174, 51, 38, 80, 163, 184, 208, 124, + 157, 58, 181, 160, 154, 27, 165, 160, 241, 128, 1, 131, 115, 145, 166, 186, + 164, 240, 212, 37, 133, 95, 46, 37, 215, 11, 214, 19, 117, 75, 81, 53, + 160, 149, 125, 200, 14, 56, 115, 181, 192, 24, 76, 169, 123, 148, 99, 56, + 33, 209, 96, 63, 217, 14, 42, 56, 83, 241, 128, 158, 215, 240, 170, 39, + 103, 147, 29, 185, 180, 160, 155, 163, 198, 88, 254, 39, 103, 200, 91, 101, + 178, 117, 38, 59, 57, 120, 145, 75, 19, 64, 138, 14, 202, 97, 229, 7, + 231, 71, 231, 171, 51, 22, 149, 35, 213, 178, 121, 113, 162, 130, 220, 84, + 62, 191, 47, 219, 81, 217, 201, 6, 118, 194, 170, 154, 75, 147, 144, 231, + 199, 67, 10, 222, 243, 95, 161, 132, 192, 106, 88, 79, 208, 89, 124, 86, + 98, 173, 3, 100, 157, 213, 168, 149, 207, 74, 159, 161, 171, 2, 231, 220, + 127, 173, 253, 213, 170, 91, 223, 215, 160, 179, 226, 115, 68, 174, 159, 41, + 16, 104, 159, 149, 126, 96, 10, 117, 234, 248, 181, 207, 81, 237, 175, 167, + 159, 207, 74, 63, 50, 21, 198, 5, 38, 167, 239, 225, 84, 198, 139, 225, + 73, 230, 142, 42, 83, 183, 25, 109, 218, 217, 154, 183, 107, 90, 145, 239, + 115, 136, 177, 217, 81, 189, 117, 157, 157, 59, 216, 51, 122, 178, 127, 89, + 171, 240, 245, 27, 26, 226, 240, 155, 26, 76, 43, 138, 34, 178, 246, 14, + 207, 169, 35, 234, 161, 89, 93, 81, 154, 249, 204, 7, 174, 191, 58, 176, + 29, 29, 215, 64, 149, 66, 78, 144, 83, 111, 30, 23, 115, 108, 83, 213, + 193, 229, 168, 52, 221, 222, 71, 238, 160, 204, 0, 125, 100, 244, 6, 229, + 175, 98, 242, 7, 229, 202, 87, 40, 20, 169, 124, 5, 132, 34, 187, 5, + 131, 50, 180, 153, 124, 85, 214, 214, 160, 12, 173, 38, 218, 218, 30, 148, + 105, 58, 143, 173, 157, 65, 153, 62, 177, 181, 59, 40, 19, 235, 28, 91, + 123, 131, 178, 119, 90, 105, 213, 190, 94, 249, 49, 249, 254, 160, 220, 104, + 215, 42, 95, 175, 130, 211, 160, 241, 245, 180, 85, 61, 165, 193, 88, 121, + 107, 239, 225, 105, 123, 135, 183, 85, 52, 28, 109, 62, 167, 195, 245, 38, + 162, 193, 90, 43, 59, 229, 90, 173, 156, 113, 61, 37, 215, 211, 211, 172, + 235, 21, 185, 94, 93, 101, 93, 145, 67, 242, 24, 243, 55, 227, 135, 236, + 194, 143, 191, 25, 63, 84, 3, 252, 248, 155, 241, 67, 157, 192, 143, 191, + 25, 63, 84, 16, 252, 248, 203, 133, 6, 211, 95, 42, 64, 22, 42, 61, + 205, 128, 60, 7, 141, 188, 162, 31, 227, 242, 29, 247, 202, 67, 105, 175, + 84, 39, 213, 46, 236, 167, 25, 35, 227, 241, 106, 137, 217, 75, 1, 179, + 143, 165, 149, 128, 179, 30, 126, 101, 20, 237, 198, 87, 128, 68, 127, 5, + 23, 114, 121, 102, 85, 184, 188, 33, 133, 168, 91, 108, 108, 144, 249, 212, + 7, 98, 245, 88, 90, 244, 21, 81, 27, 185, 168, 210, 250, 20, 73, 17, + 57, 61, 85, 25, 57, 43, 93, 227, 124, 107, 20, 237, 200, 147, 198, 230, + 89, 41, 196, 233, 41, 246, 243, 60, 75, 211, 122, 175, 177, 214, 1, 234, + 169, 113, 23, 98, 55, 87, 59, 254, 206, 117, 102, 191, 3, 10, 118, 136, + 172, 1, 109, 136, 65, 172, 145, 209, 138, 95, 187, 176, 182, 206, 206, 2, + 66, 209, 133, 69, 241, 173, 203, 234, 233, 141, 120, 2, 211, 188, 97, 119, + 170, 181, 175, 100, 111, 160, 84, 52, 199, 65, 107, 23, 197, 255, 122, 58, + 184, 0, 72, 124, 197, 6, 180, 184, 221, 173, 58, 176, 145, 229, 82, 17, + 46, 219, 104, 167, 114, 85, 96, 202, 105, 138, 176, 224, 252, 245, 234, 234, + 130, 143, 5, 46, 171, 73, 26, 58, 9, 168, 114, 193, 245, 223, 141, 91, + 251, 74, 68, 47, 84, 198, 17, 148, 17, 84, 49, 10, 128, 46, 245, 52, + 83, 173, 231, 248, 232, 3, 217, 235, 249, 212, 136, 205, 76, 124, 233, 209, + 172, 182, 237, 101, 62, 162, 160, 77, 187, 231, 41, 204, 27, 14, 27, 77, + 71, 235, 130, 139, 23, 189, 42, 235, 181, 145, 37, 11, 232, 15, 154, 20, + 80, 239, 79, 0, 143, 127, 250, 93, 195, 107, 120, 103, 150, 56, 205, 224, + 52, 35, 39, 32, 27, 156, 81, 61, 186, 206, 19, 246, 210, 79, 178, 161, + 158, 121, 244, 63, 85, 156, 40, 24, 162, 205, 251, 191, 14, 108, 106, 23, + 244, 219, 147, 179, 11, 52, 225, 191, 50, 87, 83, 117, 196, 236, 193, 204, + 93, 216, 119, 136, 59, 0, 40, 27, 14, 173, 29, 86, 24, 222, 108, 18, + 83, 163, 188, 226, 117, 24, 23, 161, 74, 71, 81, 238, 74, 103, 21, 109, + 134, 196, 128, 197, 138, 131, 59, 113, 201, 168, 243, 137, 191, 174, 40, 187, + 117, 66, 139, 57, 253, 117, 56, 50, 142, 127, 153, 207, 165, 168, 80, 128, + 254, 166, 97, 171, 179, 142, 207, 239, 7, 110, 33, 38, 175, 129, 226, 169, + 132, 88, 24, 57, 129, 49, 60, 249, 26, 36, 133, 196, 251, 153, 106, 156, + 201, 158, 179, 162, 220, 229, 130, 86, 155, 229, 161, 88, 157, 48, 110, 27, + 194, 197, 109, 105, 77, 139, 218, 4, 90, 134, 120, 65, 43, 221, 143, 214, + 140, 255, 196, 24, 103, 163, 166, 149, 81, 153, 132, 83, 114, 176, 218, 84, + 113, 9, 243, 232, 153, 202, 122, 132, 233, 142, 143, 233, 169, 195, 133, 203, + 129, 130, 164, 66, 165, 214, 42, 94, 3, 186, 21, 0, 64, 66, 174, 166, + 87, 114, 81, 66, 11, 171, 65, 129, 50, 184, 90, 104, 0, 68, 172, 157, + 20, 87, 20, 130, 19, 7, 133, 19, 104, 250, 96, 201, 45, 253, 76, 142, + 9, 195, 170, 50, 38, 232, 155, 208, 30, 142, 172, 212, 43, 54, 146, 109, + 176, 165, 90, 179, 207, 79, 251, 135, 19, 94, 173, 211, 188, 46, 174, 132, + 17, 145, 91, 30, 165, 246, 92, 6, 204, 90, 18, 51, 199, 156, 119, 169, + 126, 125, 193, 134, 203, 24, 234, 51, 112, 217, 155, 152, 254, 71, 158, 113, + 74, 183, 23, 177, 249, 210, 218, 238, 12, 137, 18, 11, 1, 193, 206, 66, + 199, 31, 190, 151, 214, 30, 31, 234, 42, 53, 61, 49, 157, 82, 233, 15, + 56, 130, 210, 233, 240, 85, 75, 251, 164, 84, 71, 63, 189, 160, 198, 195, + 97, 18, 223, 100, 139, 126, 43, 208, 140, 166, 55, 234, 102, 40, 161, 76, + 227, 200, 188, 54, 241, 68, 137, 142, 206, 137, 113, 86, 216, 44, 141, 168, + 91, 118, 149, 86, 177, 131, 53, 38, 107, 3, 147, 171, 61, 162, 42, 95, + 195, 134, 57, 23, 182, 18, 43, 25, 138, 59, 71, 101, 143, 102, 245, 92, + 170, 209, 241, 136, 90, 36, 182, 173, 201, 230, 85, 33, 84, 35, 87, 191, + 172, 43, 18, 61, 137, 107, 204, 43, 25, 197, 227, 170, 189, 95, 109, 214, + 41, 218, 170, 12, 21, 162, 11, 80, 151, 106, 105, 169, 92, 112, 72, 167, + 75, 168, 72, 208, 190, 9, 74, 6, 52, 193, 61, 20, 2, 114, 134, 78, + 28, 101, 94, 143, 184, 181, 145, 114, 35, 73, 153, 219, 87, 170, 55, 136, + 115, 166, 90, 122, 178, 122, 42, 197, 45, 77, 11, 164, 225, 47, 77, 144, + 220, 52, 213, 46, 36, 188, 0, 213, 197, 5, 208, 142, 16, 146, 128, 242, + 30, 109, 103, 18, 218, 98, 92, 213, 40, 167, 50, 77, 95, 52, 194, 43, + 12, 25, 91, 117, 212, 142, 183, 130, 213, 26, 248, 48, 135, 42, 179, 86, + 23, 73, 131, 95, 2, 87, 207, 180, 114, 61, 215, 141, 204, 183, 79, 210, + 247, 85, 148, 25, 51, 188, 143, 12, 153, 14, 70, 166, 12, 231, 116, 198, + 74, 73, 57, 209, 118, 170, 152, 148, 19, 101, 117, 89, 175, 32, 227, 251, + 212, 180, 27, 24, 71, 148, 93, 108, 102, 209, 239, 167, 227, 7, 28, 191, + 139, 215, 209, 42, 232, 171, 26, 136, 30, 165, 112, 142, 116, 131, 17, 119, + 7, 71, 149, 119, 28, 119, 15, 214, 233, 166, 204, 60, 130, 40, 113, 177, + 25, 105, 235, 205, 101, 156, 42, 57, 132, 203, 197, 52, 186, 157, 34, 33, + 5, 247, 204, 0, 120, 67, 118, 85, 87, 121, 74, 115, 187, 107, 101, 111, + 210, 108, 5, 133, 168, 174, 193, 146, 233, 223, 88, 99, 11, 150, 129, 151, + 1, 158, 95, 177, 40, 36, 55, 212, 50, 173, 23, 175, 16, 198, 108, 207, + 91, 205, 204, 42, 101, 215, 114, 133, 53, 74, 104, 2, 102, 103, 17, 134, + 127, 5, 25, 165, 117, 129, 139, 1, 222, 238, 22, 237, 239, 47, 169, 45, + 162, 175, 211, 101, 184, 153, 197, 18, 112, 134, 155, 159, 9, 47, 231, 31, + 207, 17, 81, 201, 60, 140, 33, 65, 63, 90, 170, 91, 158, 119, 90, 112, + 78, 47, 225, 114, 106, 194, 158, 126, 28, 88, 75, 180, 200, 246, 92, 165, + 149, 161, 148, 14, 34, 169, 221, 48, 188, 186, 78, 164, 27, 39, 50, 90, + 224, 200, 225, 97, 50, 117, 40, 167, 243, 41, 111, 253, 120, 231, 135, 29, + 31, 111, 248, 206, 46, 140, 157, 158, 211, 16, 13, 137, 147, 157, 51, 217, + 106, 29, 137, 196, 161, 43, 242, 118, 66, 142, 181, 132, 82, 30, 152, 172, + 19, 103, 169, 155, 100, 38, 205, 222, 105, 10, 53, 209, 253, 155, 148, 129, + 175, 97, 101, 211, 231, 202, 63, 90, 93, 143, 134, 81, 65, 254, 160, 143, + 90, 136, 71, 93, 133, 147, 213, 122, 188, 186, 159, 22, 156, 141, 152, 190, + 169, 106, 3, 179, 132, 248, 119, 163, 249, 52, 27, 63, 169, 61, 209, 35, + 163, 211, 23, 205, 139, 169, 24, 49, 77, 165, 51, 149, 207, 165, 118, 139, + 197, 116, 19, 133, 95, 211, 84, 131, 220, 137, 141, 87, 26, 1, 92, 223, + 246, 235, 84, 207, 96, 15, 20, 207, 225, 49, 20, 87, 76, 102, 10, 46, + 200, 193, 31, 42, 27, 217, 167, 61, 117, 120, 67, 219, 245, 55, 3, 159, + 207, 112, 206, 79, 124, 141, 221, 165, 111, 117, 134, 161, 33, 205, 161, 110, + 118, 223, 12, 104, 117, 30, 14, 117, 136, 187, 233, 46, 22, 196, 8, 180, + 32, 6, 77, 62, 202, 95, 221, 251, 38, 227, 141, 15, 176, 166, 27, 131, + 177, 227, 115, 160, 242, 39, 132, 198, 161, 88, 185, 252, 187, 178, 125, 158, + 9, 7, 121, 2, 86, 33, 231, 168, 211, 37, 74, 193, 196, 28, 47, 219, + 5, 57, 42, 67, 171, 88, 65, 73, 94, 139, 81, 255, 235, 4, 178, 223, + 164, 228, 175, 213, 33, 11, 222, 129, 202, 225, 74, 64, 251, 29, 125, 184, + 151, 212, 99, 97, 186, 159, 87, 150, 54, 143, 30, 71, 225, 28, 240, 99, + 63, 45, 127, 90, 254, 79, 93, 48, 11, 144, 233, 18, 102, 245, 176, 254, + 105, 9, 144, 252, 217, 136, 154, 232, 122, 58, 93, 18, 215, 243, 56, 157, + 24, 216, 100, 175, 162, 95, 86, 211, 26, 24, 181, 225, 61, 21, 231, 126, + 106, 180, 250, 27, 187, 151, 237, 205, 74, 217, 183, 244, 230, 92, 172, 172, + 38, 224, 94, 34, 30, 207, 103, 85, 230, 92, 214, 73, 205, 101, 184, 174, + 42, 101, 67, 242, 254, 13, 2, 211, 201, 72, 238, 24, 247, 86, 185, 240, + 95, 26, 145, 51, 74, 135, 133, 138, 225, 76, 168, 81, 237, 203, 41, 109, + 143, 239, 195, 170, 19, 213, 240, 61, 253, 98, 198, 145, 10, 249, 229, 97, + 52, 137, 120, 122, 194, 181, 243, 198, 180, 103, 103, 22, 217, 56, 37, 74, + 208, 237, 125, 31, 88, 115, 105, 42, 207, 192, 220, 203, 122, 237, 166, 171, + 195, 179, 234, 233, 92, 208, 226, 148, 22, 135, 63, 240, 78, 144, 194, 83, + 169, 118, 183, 171, 229, 5, 32, 219, 160, 63, 213, 123, 231, 30, 128, 87, + 255, 82, 62, 249, 165, 148, 238, 151, 80, 79, 237, 171, 243, 52, 150, 207, + 87, 145, 91, 152, 56, 173, 188, 123, 160, 64, 215, 49, 223, 26, 190, 42, + 169, 92, 44, 229, 30, 240, 78, 71, 64, 218, 13, 95, 149, 177, 92, 44, + 229, 142, 88, 80, 18, 229, 247, 140, 67, 63, 14, 160, 74, 146, 139, 168, + 220, 117, 38, 21, 42, 252, 92, 21, 212, 85, 44, 129, 170, 235, 55, 80, + 86, 50, 97, 49, 127, 81, 66, 245, 191, 146, 90, 39, 7, 98, 65, 191, + 76, 215, 15, 243, 141, 137, 104, 88, 170, 143, 172, 173, 104, 211, 190, 180, + 118, 214, 241, 195, 213, 160, 116, 119, 177, 55, 15, 107, 206, 197, 226, 145, + 197, 171, 126, 227, 190, 3, 119, 147, 189, 156, 32, 30, 22, 72, 191, 41, + 105, 198, 248, 106, 191, 30, 173, 158, 214, 122, 151, 226, 233, 93, 202, 34, + 196, 166, 188, 73, 121, 97, 94, 6, 234, 127, 48, 252, 88, 119, 144, 122, + 139, 80, 9, 107, 21, 8, 131, 217, 157, 170, 156, 51, 211, 70, 22, 138, + 106, 202, 37, 121, 161, 144, 247, 111, 37, 254, 69, 222, 109, 241, 54, 222, + 27, 96, 151, 244, 182, 50, 187, 178, 253, 198, 142, 126, 170, 167, 48, 190, + 77, 54, 113, 187, 146, 177, 191, 147, 77, 30, 239, 118, 104, 167, 80, 217, + 158, 62, 65, 41, 65, 245, 153, 32, 187, 211, 217, 145, 32, 101, 40, 208, + 139, 73, 32, 127, 253, 36, 56, 235, 215, 243, 202, 165, 83, 20, 179, 41, + 42, 148, 88, 107, 4, 12, 251, 70, 64, 91, 243, 210, 105, 172, 0, 75, + 251, 89, 251, 217, 161, 240, 238, 131, 133, 207, 179, 215, 30, 177, 84, 182, + 155, 28, 52, 173, 167, 163, 197, 120, 20, 197, 107, 104, 43, 171, 213, 232, + 79, 81, 72, 155, 218, 205, 206, 90, 140, 214, 119, 86, 101, 67, 209, 121, + 81, 169, 90, 96, 144, 195, 53, 237, 97, 111, 223, 240, 193, 201, 208, 36, + 135, 254, 146, 208, 142, 135, 185, 76, 185, 177, 244, 79, 50, 205, 196, 27, + 31, 89, 74, 161, 248, 114, 221, 240, 15, 241, 189, 171, 241, 148, 41, 38, + 155, 89, 44, 147, 172, 43, 249, 94, 192, 184, 190, 46, 251, 78, 27, 42, + 11, 105, 232, 154, 42, 92, 178, 197, 201, 157, 246, 14, 246, 79, 7, 107, + 54, 64, 27, 28, 43, 234, 94, 233, 157, 165, 237, 123, 44, 166, 157, 192, + 224, 59, 123, 46, 35, 209, 142, 223, 240, 88, 246, 147, 99, 199, 71, 140, + 169, 163, 160, 120, 244, 233, 186, 24, 102, 218, 143, 118, 160, 46, 191, 106, + 154, 55, 89, 157, 232, 29, 15, 253, 210, 185, 134, 59, 127, 51, 144, 237, + 73, 131, 213, 210, 147, 99, 141, 193, 225, 105, 26, 183, 112, 31, 219, 17, + 221, 72, 230, 147, 168, 145, 130, 61, 30, 75, 59, 48, 120, 248, 22, 199, + 151, 195, 245, 253, 108, 42, 34, 246, 171, 13, 238, 7, 247, 118, 175, 214, + 119, 149, 178, 9, 99, 74, 224, 37, 57, 134, 201, 127, 58, 245, 171, 49, + 178, 183, 85, 31, 175, 230, 15, 139, 37, 38, 10, 28, 113, 116, 113, 70, + 83, 173, 61, 65, 195, 31, 31, 152, 27, 14, 60, 154, 172, 219, 209, 3, + 53, 216, 104, 137, 5, 166, 233, 213, 68, 94, 146, 250, 57, 123, 242, 143, + 161, 64, 204, 56, 142, 12, 74, 235, 197, 106, 181, 153, 201, 181, 96, 135, + 218, 90, 198, 134, 156, 82, 153, 137, 203, 33, 216, 169, 47, 24, 186, 42, + 243, 141, 162, 220, 167, 238, 19, 99, 214, 163, 125, 18, 151, 78, 95, 31, + 50, 22, 191, 121, 137, 137, 185, 81, 41, 29, 142, 68, 176, 9, 143, 39, + 124, 235, 203, 199, 15, 191, 135, 206, 215, 43, 62, 137, 69, 8, 135, 127, + 112, 161, 172, 47, 208, 75, 58, 61, 163, 13, 82, 12, 141, 210, 208, 150, + 77, 180, 98, 239, 133, 252, 161, 106, 237, 154, 82, 59, 233, 20, 234, 217, + 20, 82, 13, 157, 222, 234, 24, 137, 43, 161, 85, 71, 113, 216, 60, 62, + 225, 3, 174, 158, 58, 7, 78, 194, 6, 123, 28, 206, 119, 104, 144, 104, + 15, 25, 35, 233, 69, 159, 131, 42, 129, 184, 49, 113, 174, 201, 112, 87, + 177, 140, 44, 140, 183, 206, 24, 240, 237, 45, 71, 84, 104, 217, 125, 235, + 54, 10, 39, 22, 209, 105, 203, 70, 2, 127, 110, 179, 163, 223, 99, 153, + 185, 210, 199, 201, 68, 196, 30, 239, 28, 92, 211, 235, 140, 19, 43, 19, + 77, 213, 5, 37, 198, 19, 132, 60, 228, 218, 195, 209, 183, 33, 14, 52, + 243, 108, 249, 119, 231, 172, 110, 110, 182, 248, 65, 94, 188, 70, 87, 201, + 219, 199, 23, 39, 154, 89, 186, 30, 173, 167, 3, 117, 64, 159, 189, 69, + 41, 219, 226, 18, 107, 174, 53, 174, 93, 202, 49, 169, 216, 23, 41, 178, + 15, 12, 229, 19, 195, 121, 167, 157, 119, 137, 51, 231, 85, 235, 211, 45, + 179, 82, 33, 138, 84, 53, 189, 119, 105, 239, 157, 225, 253, 4, 141, 179, + 148, 59, 238, 247, 218, 113, 166, 29, 103, 112, 44, 75, 137, 81, 81, 37, + 106, 6, 20, 180, 172, 2, 110, 214, 208, 42, 235, 215, 212, 115, 170, 179, + 210, 95, 229, 198, 103, 43, 10, 222, 112, 25, 81, 173, 73, 6, 235, 92, + 44, 185, 164, 166, 16, 187, 83, 190, 160, 77, 66, 236, 36, 196, 142, 104, + 32, 245, 191, 94, 249, 20, 22, 166, 239, 97, 250, 171, 191, 96, 11, 249, + 53, 172, 239, 125, 185, 184, 78, 94, 114, 241, 137, 56, 38, 27, 228, 136, + 111, 187, 57, 66, 21, 244, 83, 1, 26, 217, 0, 85, 185, 240, 62, 70, + 234, 123, 138, 241, 44, 41, 35, 0, 212, 199, 254, 80, 31, 80, 121, 6, + 79, 240, 38, 154, 228, 242, 163, 184, 204, 98, 151, 239, 112, 159, 175, 46, + 251, 147, 250, 252, 225, 197, 138, 251, 241, 229, 138, 163, 16, 63, 72, 91, + 64, 109, 179, 39, 41, 214, 126, 188, 226, 107, 64, 84, 252, 143, 121, 223, + 31, 196, 183, 242, 215, 92, 206, 191, 207, 231, 252, 175, 206, 247, 85, 189, + 83, 187, 143, 86, 63, 67, 161, 199, 154, 122, 246, 84, 139, 90, 99, 149, + 6, 254, 228, 35, 237, 197, 166, 206, 120, 138, 110, 191, 85, 223, 157, 19, + 141, 38, 196, 205, 110, 213, 151, 236, 211, 241, 108, 21, 57, 243, 232, 122, + 254, 16, 57, 44, 102, 5, 244, 113, 97, 33, 147, 209, 184, 210, 116, 148, + 65, 70, 162, 231, 203, 180, 160, 60, 223, 12, 108, 29, 78, 189, 229, 80, + 129, 19, 143, 93, 137, 33, 133, 182, 14, 127, 118, 144, 43, 208, 57, 82, + 134, 221, 37, 205, 193, 113, 114, 113, 188, 75, 154, 172, 211, 89, 71, 220, + 56, 152, 14, 69, 179, 171, 74, 64, 190, 136, 151, 188, 10, 249, 105, 111, + 39, 85, 195, 242, 255, 89, 2, 236, 152, 205, 145, 56, 114, 69, 177, 81, + 42, 139, 141, 186, 194, 216, 34, 149, 198, 70, 93, 113, 71, 18, 41, 45, + 117, 26, 203, 103, 75, 195, 151, 179, 125, 90, 47, 43, 197, 245, 148, 139, + 1, 145, 152, 101, 184, 209, 179, 96, 106, 146, 75, 138, 254, 77, 156, 191, + 119, 126, 60, 229, 29, 189, 119, 214, 101, 196, 52, 115, 85, 142, 139, 28, + 71, 84, 153, 224, 52, 116, 243, 159, 212, 42, 255, 14, 237, 147, 169, 32, + 59, 35, 200, 14, 65, 254, 104, 4, 81, 197, 227, 32, 186, 118, 52, 25, + 190, 80, 103, 194, 233, 208, 59, 51, 116, 76, 49, 14, 189, 211, 161, 191, + 104, 49, 28, 69, 247, 10, 115, 139, 138, 117, 149, 204, 185, 155, 217, 116, + 195, 186, 212, 229, 232, 50, 30, 34, 18, 41, 14, 118, 31, 250, 60, 227, + 222, 135, 103, 44, 144, 59, 60, 54, 18, 135, 210, 33, 172, 119, 22, 207, + 222, 229, 178, 167, 182, 102, 208, 14, 199, 27, 80, 114, 98, 153, 91, 113, + 221, 166, 156, 131, 216, 153, 214, 182, 114, 241, 73, 65, 110, 9, 68, 108, + 233, 169, 150, 98, 24, 149, 21, 220, 153, 14, 32, 253, 183, 148, 220, 172, + 57, 111, 182, 127, 255, 251, 118, 48, 120, 98, 53, 71, 96, 176, 10, 249, + 200, 107, 168, 137, 86, 177, 245, 141, 146, 85, 135, 154, 217, 196, 153, 88, + 42, 240, 122, 124, 197, 7, 73, 60, 243, 122, 210, 115, 32, 136, 199, 218, + 122, 36, 145, 70, 17, 191, 151, 168, 211, 84, 189, 85, 50, 218, 150, 204, + 194, 88, 174, 169, 150, 248, 119, 190, 132, 119, 117, 195, 252, 145, 47, 224, + 93, 8, 75, 97, 16, 148, 75, 220, 160, 208, 14, 47, 13, 91, 183, 182, + 212, 104, 254, 233, 211, 89, 137, 154, 7, 115, 57, 237, 10, 101, 102, 173, + 162, 53, 89, 56, 225, 75, 13, 183, 133, 228, 15, 13, 234, 179, 21, 66, + 85, 190, 80, 212, 175, 213, 83, 250, 54, 232, 91, 189, 170, 80, 140, 83, + 61, 14, 170, 181, 47, 178, 22, 234, 113, 64, 93, 107, 182, 170, 225, 6, + 146, 211, 85, 203, 155, 30, 2, 226, 139, 52, 180, 47, 139, 61, 200, 130, + 244, 98, 87, 82, 115, 140, 172, 92, 175, 14, 189, 127, 200, 232, 176, 93, + 80, 242, 184, 173, 125, 23, 203, 147, 92, 60, 56, 15, 84, 191, 235, 203, + 67, 166, 122, 83, 149, 155, 84, 237, 15, 74, 238, 45, 30, 151, 63, 42, + 201, 183, 120, 232, 233, 202, 151, 193, 244, 163, 243, 3, 100, 93, 196, 169, + 82, 249, 129, 135, 32, 150, 197, 211, 47, 244, 115, 165, 43, 83, 183, 65, + 133, 67, 98, 129, 61, 21, 99, 221, 194, 84, 33, 205, 54, 98, 25, 154, + 211, 47, 213, 36, 145, 138, 212, 38, 56, 2, 110, 107, 218, 205, 252, 14, + 55, 14, 126, 245, 132, 59, 136, 106, 111, 234, 29, 53, 180, 45, 249, 16, + 69, 180, 123, 245, 132, 123, 12, 183, 1, 71, 117, 208, 244, 188, 192, 222, + 53, 77, 253, 238, 11, 235, 104, 117, 139, 142, 212, 164, 122, 213, 165, 131, + 170, 154, 147, 120, 118, 62, 209, 115, 247, 54, 54, 237, 78, 248, 65, 133, + 121, 103, 97, 170, 47, 4, 107, 254, 91, 136, 197, 151, 27, 134, 114, 39, + 104, 156, 176, 19, 229, 232, 197, 29, 231, 152, 14, 141, 163, 204, 134, 93, + 75, 221, 84, 76, 243, 39, 186, 234, 186, 40, 92, 47, 71, 75, 32, 63, + 124, 99, 183, 223, 73, 159, 224, 91, 35, 71, 137, 15, 202, 13, 81, 234, + 182, 34, 222, 226, 171, 171, 33, 218, 65, 244, 14, 233, 228, 210, 251, 37, + 51, 110, 237, 89, 41, 199, 7, 231, 113, 176, 151, 156, 153, 25, 83, 66, + 4, 5, 249, 59, 187, 192, 128, 230, 24, 85, 7, 253, 79, 140, 151, 135, + 98, 129, 73, 103, 235, 57, 59, 111, 176, 255, 126, 112, 97, 63, 56, 246, + 227, 229, 25, 173, 224, 123, 207, 241, 177, 131, 195, 231, 178, 78, 83, 153, + 235, 214, 46, 190, 119, 26, 223, 95, 86, 69, 174, 210, 73, 100, 43, 165, + 213, 181, 44, 35, 81, 179, 119, 94, 250, 222, 42, 105, 218, 163, 97, 205, + 62, 149, 193, 188, 153, 110, 241, 38, 126, 50, 188, 5, 164, 109, 193, 65, + 116, 74, 246, 66, 196, 108, 173, 123, 10, 187, 24, 201, 86, 154, 172, 162, + 240, 108, 132, 167, 209, 88, 8, 168, 169, 111, 105, 37, 216, 201, 117, 100, + 169, 158, 126, 100, 221, 108, 178, 166, 113, 150, 87, 232, 88, 87, 180, 217, + 167, 48, 53, 57, 132, 171, 25, 122, 230, 177, 136, 12, 183, 59, 125, 212, + 38, 66, 250, 181, 166, 136, 205, 216, 30, 223, 108, 129, 119, 14, 23, 85, + 135, 191, 159, 170, 196, 243, 224, 132, 206, 246, 143, 120, 26, 144, 40, 241, + 185, 157, 18, 63, 121, 174, 82, 94, 150, 184, 78, 215, 97, 86, 29, 218, + 230, 41, 140, 230, 249, 203, 90, 113, 230, 179, 4, 125, 28, 31, 95, 186, + 228, 175, 218, 90, 241, 85, 27, 7, 48, 111, 218, 90, 250, 166, 77, 252, + 88, 113, 169, 28, 79, 120, 89, 93, 188, 234, 110, 44, 77, 66, 93, 141, + 101, 19, 206, 30, 246, 189, 34, 3, 57, 117, 202, 60, 240, 94, 3, 234, + 19, 171, 18, 156, 232, 35, 28, 121, 201, 155, 79, 175, 106, 21, 187, 242, + 201, 206, 254, 233, 180, 117, 224, 211, 29, 173, 121, 113, 121, 125, 239, 44, + 175, 127, 25, 112, 165, 148, 40, 132, 77, 46, 53, 250, 249, 69, 194, 41, + 254, 152, 28, 133, 133, 188, 190, 47, 107, 57, 62, 10, 163, 220, 126, 33, + 22, 23, 254, 187, 19, 242, 63, 43, 253, 162, 118, 228, 187, 83, 178, 210, + 218, 3, 94, 245, 94, 180, 30, 129, 78, 131, 87, 40, 176, 164, 191, 104, + 199, 95, 148, 35, 75, 95, 58, 44, 129, 89, 166, 172, 141, 7, 118, 32, + 154, 157, 174, 199, 231, 46, 100, 178, 112, 92, 216, 108, 103, 113, 9, 192, + 178, 198, 71, 122, 2, 123, 212, 170, 30, 140, 211, 57, 223, 61, 161, 178, + 129, 140, 20, 234, 188, 36, 82, 174, 209, 244, 166, 130, 3, 104, 214, 0, + 239, 112, 120, 108, 48, 249, 164, 0, 43, 192, 154, 60, 192, 246, 134, 159, + 216, 225, 2, 178, 162, 91, 101, 238, 145, 121, 167, 204, 125, 50, 135, 139, + 91, 178, 60, 210, 204, 191, 138, 42, 191, 131, 200, 99, 13, 66, 142, 78, + 131, 6, 215, 89, 105, 18, 141, 158, 64, 204, 161, 96, 14, 145, 104, 176, + 80, 228, 169, 239, 236, 96, 158, 137, 25, 243, 20, 156, 29, 142, 136, 127, + 244, 145, 92, 157, 149, 150, 91, 78, 141, 170, 232, 19, 34, 93, 74, 221, + 93, 60, 129, 40, 133, 247, 47, 27, 82, 131, 8, 231, 112, 96, 170, 67, + 104, 93, 12, 28, 242, 44, 25, 215, 9, 216, 19, 135, 165, 186, 238, 36, + 209, 245, 13, 95, 144, 101, 171, 143, 230, 138, 150, 149, 22, 5, 196, 52, + 23, 96, 126, 122, 123, 65, 141, 116, 249, 150, 207, 247, 181, 206, 94, 207, + 81, 50, 149, 143, 163, 57, 4, 171, 75, 90, 146, 120, 53, 247, 56, 227, + 80, 189, 236, 202, 155, 202, 75, 99, 127, 18, 62, 172, 225, 31, 164, 157, + 176, 117, 208, 158, 117, 203, 63, 99, 197, 214, 96, 77, 46, 44, 117, 43, + 196, 82, 186, 180, 6, 64, 122, 151, 143, 36, 190, 171, 94, 16, 245, 75, + 62, 105, 56, 163, 238, 61, 15, 239, 215, 83, 225, 25, 21, 205, 248, 43, + 88, 56, 133, 129, 188, 248, 139, 64, 200, 124, 245, 204, 250, 174, 172, 209, + 12, 142, 142, 187, 146, 107, 81, 39, 44, 255, 170, 139, 103, 89, 153, 90, + 114, 227, 86, 82, 47, 75, 219, 124, 28, 92, 55, 94, 65, 146, 155, 41, + 211, 103, 42, 27, 207, 222, 130, 61, 133, 9, 148, 133, 249, 76, 27, 111, + 188, 216, 15, 199, 17, 45, 60, 122, 97, 225, 137, 92, 56, 69, 226, 197, + 57, 93, 104, 101, 102, 242, 175, 171, 213, 34, 158, 200, 69, 17, 162, 237, + 189, 247, 226, 41, 157, 253, 109, 76, 50, 254, 201, 129, 126, 131, 19, 48, + 25, 234, 113, 153, 214, 1, 198, 130, 89, 224, 171, 134, 121, 87, 165, 191, + 110, 15, 225, 117, 48, 8, 141, 124, 152, 195, 65, 235, 45, 227, 27, 165, + 2, 34, 0, 84, 93, 69, 79, 171, 225, 242, 222, 55, 145, 170, 91, 41, + 220, 106, 19, 198, 58, 10, 183, 140, 66, 252, 176, 188, 91, 174, 158, 150, + 249, 236, 62, 95, 93, 249, 60, 196, 126, 92, 131, 13, 191, 32, 155, 38, + 135, 249, 143, 213, 132, 127, 40, 164, 240, 174, 116, 189, 112, 7, 220, 139, + 172, 235, 133, 55, 72, 4, 226, 200, 234, 15, 102, 163, 104, 50, 199, 250, + 67, 182, 96, 176, 162, 13, 230, 124, 180, 35, 115, 107, 176, 94, 221, 108, + 180, 79, 91, 8, 160, 201, 83, 26, 47, 77, 101, 154, 82, 28, 219, 75, + 52, 94, 90, 161, 245, 92, 16, 17, 199, 8, 173, 217, 102, 115, 191, 126, + 119, 122, 122, 187, 8, 199, 205, 233, 195, 233, 132, 184, 205, 88, 131, 29, + 144, 93, 78, 211, 241, 44, 40, 228, 123, 142, 174, 185, 4, 27, 248, 122, + 233, 199, 150, 172, 157, 119, 189, 91, 10, 215, 66, 44, 114, 252, 162, 156, + 149, 170, 187, 181, 167, 83, 64, 217, 56, 105, 199, 217, 169, 198, 183, 193, + 19, 128, 84, 244, 166, 190, 147, 200, 186, 39, 30, 198, 45, 17, 242, 200, + 41, 62, 113, 18, 51, 253, 54, 195, 73, 176, 235, 114, 250, 18, 137, 223, + 247, 212, 85, 151, 231, 243, 45, 27, 203, 128, 62, 74, 69, 242, 116, 161, + 220, 236, 253, 245, 194, 198, 117, 22, 164, 153, 252, 247, 131, 22, 248, 32, + 200, 62, 97, 138, 144, 23, 209, 230, 251, 82, 117, 191, 198, 188, 166, 22, + 198, 19, 64, 129, 148, 147, 33, 52, 17, 191, 194, 228, 87, 4, 90, 64, + 203, 12, 157, 222, 137, 164, 233, 212, 20, 79, 204, 140, 186, 203, 92, 31, + 151, 29, 6, 190, 118, 76, 113, 234, 214, 241, 96, 9, 243, 175, 152, 126, + 31, 247, 96, 248, 149, 107, 204, 35, 180, 10, 131, 25, 180, 100, 130, 228, + 60, 95, 207, 101, 178, 91, 221, 19, 135, 87, 166, 193, 8, 173, 154, 45, + 167, 142, 78, 225, 44, 194, 101, 249, 160, 69, 219, 226, 234, 146, 40, 241, + 51, 139, 213, 189, 198, 93, 112, 182, 59, 50, 246, 133, 35, 195, 155, 29, + 245, 74, 71, 159, 76, 245, 240, 168, 162, 244, 26, 58, 150, 17, 128, 24, + 91, 22, 199, 239, 86, 101, 34, 200, 6, 150, 52, 245, 117, 41, 132, 183, + 57, 153, 200, 124, 82, 98, 220, 247, 198, 184, 89, 217, 74, 120, 113, 173, + 48, 51, 157, 89, 49, 216, 107, 178, 186, 193, 44, 103, 187, 92, 38, 153, + 185, 169, 35, 155, 254, 230, 108, 104, 70, 163, 30, 51, 76, 147, 17, 201, + 191, 34, 85, 172, 144, 15, 18, 137, 149, 155, 176, 8, 63, 68, 30, 44, + 84, 158, 106, 79, 245, 89, 109, 86, 189, 162, 50, 31, 172, 47, 44, 50, + 207, 175, 10, 68, 98, 63, 26, 224, 102, 57, 113, 40, 109, 6, 144, 88, + 214, 66, 245, 15, 131, 61, 139, 212, 111, 136, 129, 162, 157, 51, 11, 212, + 147, 185, 52, 167, 61, 174, 60, 78, 56, 173, 120, 211, 70, 175, 110, 127, + 169, 86, 175, 252, 131, 53, 247, 179, 30, 17, 123, 176, 176, 254, 156, 90, + 208, 126, 32, 107, 221, 158, 67, 207, 228, 35, 71, 185, 38, 159, 135, 154, + 253, 72, 14, 115, 106, 223, 57, 94, 76, 140, 117, 232, 199, 36, 244, 3, + 211, 73, 63, 14, 120, 251, 195, 160, 178, 165, 45, 37, 205, 98, 184, 95, + 62, 141, 207, 181, 126, 28, 84, 118, 13, 187, 67, 19, 89, 218, 253, 102, + 96, 143, 106, 63, 212, 126, 0, 224, 211, 53, 25, 126, 172, 219, 227, 218, + 143, 181, 31, 207, 248, 225, 214, 205, 149, 237, 185, 167, 126, 179, 93, 125, + 43, 90, 204, 61, 165, 166, 220, 246, 172, 197, 122, 176, 15, 23, 7, 235, + 19, 190, 74, 139, 185, 231, 149, 234, 225, 122, 133, 193, 22, 76, 88, 59, + 56, 238, 205, 105, 9, 163, 61, 197, 28, 143, 62, 18, 201, 163, 92, 184, + 118, 54, 28, 100, 155, 40, 28, 5, 104, 248, 152, 61, 101, 153, 67, 111, + 65, 127, 16, 49, 35, 236, 107, 22, 107, 199, 254, 180, 6, 159, 145, 176, + 178, 129, 133, 231, 36, 184, 144, 207, 61, 39, 105, 42, 97, 169, 102, 74, + 150, 202, 60, 105, 170, 3, 77, 102, 181, 158, 26, 79, 36, 234, 214, 155, + 129, 192, 161, 9, 124, 64, 160, 128, 83, 83, 111, 78, 112, 218, 155, 85, + 132, 254, 98, 158, 53, 135, 167, 122, 240, 157, 200, 156, 103, 0, 105, 228, + 56, 252, 205, 185, 87, 154, 63, 208, 228, 35, 128, 108, 234, 224, 249, 138, + 229, 158, 174, 160, 136, 52, 181, 252, 213, 177, 206, 208, 10, 136, 133, 134, + 62, 178, 210, 80, 197, 28, 95, 22, 179, 121, 109, 72, 102, 93, 134, 14, + 111, 149, 70, 185, 181, 131, 75, 168, 165, 196, 172, 242, 191, 78, 239, 55, + 179, 198, 234, 166, 113, 19, 78, 231, 19, 171, 114, 189, 218, 108, 104, 82, + 200, 201, 191, 88, 111, 202, 26, 162, 214, 215, 188, 113, 152, 78, 157, 70, + 250, 82, 180, 219, 239, 33, 189, 123, 16, 236, 57, 114, 49, 218, 152, 150, + 207, 117, 157, 230, 153, 245, 192, 53, 36, 128, 235, 131, 129, 168, 165, 135, + 60, 175, 99, 191, 119, 236, 115, 128, 109, 82, 151, 58, 97, 249, 11, 196, + 213, 109, 70, 219, 175, 102, 230, 241, 16, 143, 36, 218, 61, 163, 120, 203, + 53, 203, 18, 243, 195, 94, 60, 227, 181, 207, 249, 177, 171, 18, 39, 230, + 221, 234, 94, 52, 244, 46, 215, 87, 126, 195, 166, 31, 72, 221, 172, 7, + 100, 23, 177, 6, 136, 154, 57, 251, 6, 178, 105, 157, 38, 143, 55, 68, + 78, 6, 229, 213, 123, 88, 93, 104, 193, 38, 23, 201, 34, 32, 178, 25, + 243, 28, 237, 131, 173, 29, 48, 4, 33, 162, 76, 253, 99, 39, 141, 145, + 136, 133, 232, 107, 141, 32, 31, 111, 139, 120, 129, 196, 219, 22, 197, 43, + 200, 138, 198, 21, 74, 187, 103, 145, 142, 228, 117, 92, 42, 204, 203, 8, + 90, 105, 138, 153, 53, 227, 118, 190, 122, 82, 201, 179, 145, 49, 42, 144, + 164, 246, 124, 153, 62, 71, 43, 90, 138, 48, 225, 164, 121, 28, 229, 34, + 187, 22, 154, 129, 120, 210, 231, 242, 181, 159, 225, 117, 36, 214, 235, 86, + 70, 157, 66, 81, 126, 176, 21, 141, 65, 156, 76, 151, 215, 177, 92, 18, + 184, 128, 227, 210, 84, 254, 107, 48, 92, 172, 231, 96, 180, 9, 199, 195, + 209, 245, 52, 18, 189, 223, 56, 139, 157, 95, 92, 66, 144, 8, 124, 16, + 142, 189, 248, 216, 187, 74, 253, 62, 245, 236, 141, 249, 249, 154, 204, 172, + 117, 22, 48, 219, 135, 235, 131, 69, 171, 149, 19, 240, 88, 243, 47, 83, + 193, 49, 240, 160, 237, 108, 141, 55, 137, 174, 115, 69, 179, 227, 213, 129, + 136, 110, 49, 164, 74, 159, 32, 14, 101, 177, 116, 52, 86, 0, 235, 83, + 184, 124, 100, 167, 104, 145, 145, 86, 75, 64, 27, 228, 228, 174, 128, 227, + 192, 75, 56, 6, 137, 251, 4, 241, 184, 212, 74, 237, 51, 100, 7, 113, + 6, 253, 6, 75, 148, 66, 2, 141, 150, 218, 6, 203, 143, 30, 140, 115, + 23, 198, 45, 230, 201, 182, 48, 122, 171, 97, 247, 117, 244, 54, 191, 218, + 139, 163, 123, 47, 71, 111, 152, 241, 27, 89, 2, 126, 154, 0, 96, 109, + 146, 18, 81, 189, 20, 33, 167, 25, 98, 147, 133, 173, 250, 50, 76, 109, + 97, 95, 200, 14, 158, 73, 24, 81, 37, 39, 115, 148, 216, 209, 85, 252, + 131, 129, 104, 195, 206, 175, 64, 112, 213, 145, 37, 182, 137, 85, 167, 19, + 202, 30, 237, 78, 198, 155, 212, 179, 76, 217, 112, 225, 226, 144, 22, 155, + 228, 145, 178, 95, 26, 48, 219, 192, 71, 70, 77, 43, 230, 69, 74, 53, + 43, 4, 137, 177, 85, 112, 39, 113, 51, 15, 239, 193, 79, 143, 139, 238, + 35, 100, 7, 170, 203, 109, 4, 141, 15, 126, 20, 204, 109, 161, 119, 250, + 60, 105, 152, 77, 140, 31, 175, 7, 39, 126, 85, 31, 238, 156, 123, 88, + 60, 28, 102, 247, 244, 37, 252, 136, 47, 226, 85, 216, 115, 79, 135, 245, + 57, 236, 142, 194, 250, 201, 237, 62, 86, 41, 181, 42, 181, 222, 12, 188, + 132, 108, 18, 169, 164, 35, 125, 30, 64, 124, 83, 165, 246, 9, 79, 235, + 78, 237, 207, 196, 39, 223, 91, 101, 189, 137, 65, 127, 247, 170, 144, 251, + 44, 147, 59, 205, 137, 80, 64, 59, 7, 210, 203, 39, 199, 254, 92, 210, + 15, 183, 116, 137, 94, 108, 121, 179, 126, 50, 61, 236, 255, 99, 239, 61, + 219, 219, 86, 146, 182, 193, 239, 252, 21, 48, 135, 30, 139, 2, 40, 100, + 2, 176, 77, 251, 82, 166, 172, 68, 5, 75, 148, 116, 100, 13, 3, 64, + 130, 34, 65, 138, 1, 12, 26, 253, 247, 173, 234, 110, 68, 82, 225, 60, + 51, 239, 179, 187, 215, 238, 57, 150, 4, 52, 58, 135, 234, 234, 234, 170, + 187, 58, 3, 187, 245, 80, 27, 142, 109, 148, 54, 18, 16, 155, 218, 200, + 46, 106, 138, 219, 107, 221, 161, 137, 206, 197, 86, 175, 190, 111, 181, 155, + 219, 91, 163, 90, 245, 92, 170, 239, 95, 57, 183, 215, 250, 99, 237, 122, + 111, 178, 221, 105, 181, 78, 183, 55, 149, 147, 237, 205, 217, 193, 246, 241, + 252, 184, 115, 48, 223, 246, 220, 134, 126, 53, 178, 158, 116, 121, 111, 119, + 187, 40, 61, 30, 142, 175, 143, 111, 6, 181, 109, 119, 120, 115, 184, 221, + 63, 48, 138, 134, 123, 94, 252, 221, 191, 128, 179, 242, 184, 121, 44, 238, + 110, 30, 43, 123, 173, 90, 93, 217, 107, 215, 174, 155, 173, 131, 223, 213, + 211, 108, 246, 233, 234, 212, 28, 85, 119, 203, 91, 87, 59, 123, 110, 173, + 248, 216, 218, 222, 170, 109, 159, 93, 204, 39, 188, 62, 53, 27, 170, 231, + 235, 3, 93, 223, 106, 241, 234, 228, 162, 183, 63, 146, 45, 175, 162, 220, + 42, 183, 99, 67, 87, 42, 170, 37, 214, 127, 137, 251, 102, 165, 188, 167, + 243, 79, 59, 242, 92, 243, 13, 131, 159, 159, 92, 207, 237, 73, 215, 110, + 85, 174, 231, 86, 189, 126, 205, 91, 131, 95, 198, 194, 170, 150, 139, 35, + 209, 81, 15, 103, 205, 163, 108, 118, 203, 62, 31, 42, 237, 206, 78, 93, + 242, 156, 115, 94, 59, 189, 157, 207, 166, 221, 169, 249, 187, 94, 190, 208, + 28, 217, 179, 219, 227, 173, 203, 86, 177, 232, 168, 143, 155, 243, 211, 223, + 74, 81, 62, 117, 118, 46, 221, 77, 209, 110, 239, 94, 89, 114, 171, 102, + 94, 42, 146, 201, 55, 118, 186, 45, 253, 215, 201, 97, 197, 125, 244, 252, + 115, 115, 254, 232, 28, 78, 143, 38, 231, 221, 190, 49, 151, 30, 173, 98, + 197, 110, 93, 152, 199, 179, 209, 150, 41, 157, 111, 122, 217, 236, 249, 233, + 214, 249, 205, 182, 117, 46, 109, 222, 142, 103, 123, 154, 222, 151, 167, 124, + 163, 186, 176, 156, 178, 191, 24, 95, 122, 21, 99, 110, 120, 190, 177, 208, + 155, 71, 91, 246, 208, 147, 79, 252, 203, 246, 88, 53, 68, 67, 175, 200, + 198, 217, 88, 236, 158, 142, 42, 149, 179, 167, 105, 117, 88, 183, 199, 237, + 226, 142, 88, 44, 251, 234, 158, 226, 116, 21, 145, 231, 175, 171, 79, 199, + 21, 103, 110, 183, 22, 189, 233, 237, 66, 83, 45, 219, 50, 116, 221, 201, + 102, 203, 211, 250, 177, 127, 57, 235, 148, 159, 166, 123, 103, 91, 221, 113, + 241, 248, 248, 166, 115, 124, 37, 154, 123, 226, 113, 171, 254, 56, 253, 197, + 215, 247, 247, 187, 173, 163, 154, 242, 107, 108, 108, 238, 25, 211, 243, 206, + 113, 75, 228, 219, 59, 170, 191, 175, 122, 189, 253, 217, 80, 186, 209, 197, + 11, 222, 158, 84, 246, 109, 177, 122, 245, 75, 188, 61, 220, 226, 253, 238, + 214, 227, 230, 109, 221, 110, 27, 70, 99, 92, 45, 14, 109, 209, 145, 119, + 139, 215, 219, 166, 186, 121, 60, 200, 102, 251, 103, 22, 127, 219, 228, 249, + 254, 85, 145, 55, 175, 47, 7, 55, 71, 139, 198, 230, 188, 7, 153, 74, + 188, 83, 233, 218, 182, 104, 43, 139, 167, 70, 165, 49, 159, 222, 110, 238, + 95, 171, 253, 211, 226, 47, 190, 86, 153, 106, 170, 209, 177, 39, 191, 172, + 153, 207, 159, 232, 51, 255, 120, 123, 71, 108, 202, 254, 230, 86, 229, 72, + 61, 107, 52, 175, 58, 157, 65, 189, 113, 165, 13, 235, 188, 82, 217, 63, + 52, 59, 163, 230, 108, 166, 158, 117, 134, 183, 219, 254, 175, 108, 214, 246, + 79, 187, 202, 166, 42, 54, 140, 206, 229, 211, 200, 108, 250, 245, 95, 227, + 195, 199, 214, 161, 1, 195, 246, 155, 31, 142, 142, 119, 247, 251, 59, 167, + 131, 95, 54, 25, 247, 155, 179, 197, 190, 214, 225, 31, 7, 215, 187, 147, + 197, 65, 79, 31, 157, 213, 175, 167, 131, 167, 199, 134, 121, 98, 143, 182, + 157, 209, 78, 213, 223, 173, 14, 247, 60, 181, 191, 191, 63, 226, 183, 142, + 79, 183, 252, 83, 247, 168, 226, 46, 42, 173, 10, 239, 44, 90, 215, 234, + 254, 104, 146, 205, 154, 198, 180, 174, 245, 102, 151, 29, 93, 117, 220, 89, + 199, 177, 119, 102, 125, 254, 169, 174, 140, 38, 219, 162, 194, 223, 202, 252, + 164, 110, 77, 170, 242, 165, 237, 204, 79, 129, 215, 191, 216, 23, 203, 221, + 217, 158, 211, 113, 206, 39, 131, 114, 163, 235, 247, 85, 173, 233, 245, 85, + 105, 236, 15, 78, 110, 79, 236, 115, 175, 95, 47, 94, 201, 7, 134, 238, + 73, 30, 76, 170, 51, 111, 104, 56, 183, 93, 173, 58, 175, 95, 76, 244, + 35, 123, 230, 143, 20, 40, 180, 174, 233, 254, 133, 63, 48, 28, 91, 54, + 143, 180, 107, 105, 56, 185, 80, 61, 195, 217, 230, 45, 227, 215, 149, 41, + 153, 253, 235, 243, 163, 249, 80, 31, 12, 182, 253, 125, 223, 59, 156, 239, + 217, 87, 206, 158, 115, 208, 213, 100, 179, 102, 95, 30, 93, 12, 181, 177, + 190, 63, 234, 84, 77, 241, 177, 198, 59, 70, 241, 166, 83, 236, 59, 229, + 142, 115, 122, 82, 132, 33, 216, 23, 111, 12, 111, 191, 33, 14, 143, 199, + 183, 221, 95, 206, 213, 86, 127, 161, 103, 179, 83, 187, 58, 220, 188, 176, + 206, 32, 218, 112, 243, 240, 128, 63, 49, 199, 29, 185, 117, 181, 235, 76, + 118, 230, 206, 97, 131, 63, 225, 71, 219, 253, 29, 165, 254, 212, 210, 188, + 98, 191, 226, 214, 228, 77, 123, 114, 57, 29, 202, 23, 181, 223, 252, 225, + 201, 89, 121, 87, 188, 58, 239, 95, 234, 115, 200, 176, 105, 117, 183, 157, + 43, 187, 191, 144, 167, 206, 85, 243, 182, 82, 191, 248, 229, 111, 250, 197, + 221, 237, 209, 102, 167, 161, 251, 79, 98, 255, 244, 182, 202, 203, 217, 108, + 197, 107, 204, 84, 111, 50, 26, 200, 139, 199, 95, 106, 247, 72, 230, 7, + 170, 209, 170, 54, 106, 77, 99, 191, 90, 215, 44, 9, 168, 204, 84, 145, + 149, 227, 27, 87, 20, 181, 106, 227, 164, 209, 59, 169, 248, 39, 205, 250, + 118, 207, 211, 176, 115, 101, 223, 122, 114, 78, 199, 102, 185, 108, 200, 87, + 162, 49, 92, 92, 76, 186, 45, 255, 102, 86, 60, 155, 117, 199, 170, 239, + 180, 212, 98, 99, 107, 230, 221, 238, 192, 44, 228, 253, 226, 30, 95, 131, + 66, 167, 154, 39, 15, 124, 99, 207, 89, 60, 137, 202, 192, 186, 217, 174, + 23, 103, 146, 55, 61, 174, 222, 118, 6, 141, 211, 154, 177, 80, 199, 195, + 223, 141, 205, 235, 162, 83, 188, 108, 237, 29, 249, 146, 177, 181, 211, 241, + 235, 231, 39, 211, 157, 93, 88, 21, 142, 222, 108, 13, 203, 218, 98, 166, + 119, 119, 237, 250, 182, 247, 11, 142, 146, 202, 230, 120, 120, 218, 157, 31, + 242, 131, 170, 89, 36, 117, 130, 209, 60, 83, 164, 110, 203, 177, 203, 139, + 199, 108, 150, 63, 63, 148, 142, 84, 105, 50, 54, 231, 245, 97, 205, 215, + 101, 199, 248, 125, 58, 58, 47, 31, 44, 138, 141, 242, 227, 109, 241, 228, + 244, 232, 210, 61, 182, 182, 237, 209, 252, 177, 173, 239, 218, 109, 231, 108, + 42, 245, 142, 221, 202, 217, 112, 112, 253, 219, 171, 192, 204, 249, 45, 61, + 157, 62, 57, 157, 107, 168, 179, 89, 44, 139, 222, 166, 126, 179, 179, 168, + 111, 95, 59, 123, 149, 195, 115, 83, 239, 157, 47, 244, 133, 63, 159, 149, + 229, 51, 190, 82, 230, 155, 231, 217, 108, 241, 198, 224, 107, 208, 209, 149, + 225, 239, 166, 174, 204, 219, 254, 62, 127, 5, 212, 107, 42, 205, 187, 147, + 142, 191, 83, 61, 188, 46, 158, 154, 222, 69, 215, 223, 230, 175, 198, 253, + 250, 116, 210, 61, 105, 92, 234, 215, 74, 215, 47, 95, 233, 213, 185, 231, + 187, 97, 123, 142, 7, 252, 172, 200, 247, 91, 238, 111, 231, 183, 228, 92, + 109, 158, 117, 55, 39, 215, 78, 107, 207, 28, 110, 78, 32, 168, 82, 183, + 14, 155, 67, 175, 43, 102, 179, 3, 85, 217, 53, 196, 171, 201, 104, 90, + 173, 253, 178, 84, 223, 63, 60, 28, 110, 251, 87, 198, 89, 187, 217, 19, + 129, 244, 59, 74, 217, 48, 234, 77, 197, 226, 123, 69, 107, 124, 60, 184, + 60, 215, 253, 27, 103, 54, 57, 16, 249, 83, 243, 201, 220, 181, 90, 198, + 85, 69, 58, 82, 182, 42, 202, 150, 175, 216, 7, 30, 223, 190, 170, 152, + 122, 95, 52, 55, 173, 179, 217, 237, 181, 213, 86, 141, 73, 227, 172, 201, + 203, 206, 163, 109, 27, 190, 221, 159, 102, 179, 214, 229, 209, 214, 205, 230, + 92, 121, 210, 207, 135, 210, 165, 98, 53, 123, 123, 226, 111, 93, 111, 42, + 219, 226, 100, 161, 213, 96, 250, 239, 31, 138, 226, 110, 140, 246, 76, 140, + 170, 223, 114, 202, 246, 212, 208, 118, 23, 218, 214, 149, 182, 213, 47, 110, + 93, 243, 91, 114, 91, 172, 233, 138, 101, 15, 219, 85, 197, 186, 30, 119, + 170, 189, 173, 138, 99, 241, 45, 67, 85, 188, 198, 205, 111, 185, 234, 156, + 88, 157, 163, 179, 157, 195, 108, 182, 182, 123, 236, 204, 122, 155, 35, 113, + 120, 114, 164, 76, 245, 197, 240, 188, 206, 187, 205, 234, 118, 69, 219, 133, + 73, 37, 222, 236, 138, 181, 253, 202, 245, 161, 127, 42, 158, 249, 71, 21, + 105, 167, 122, 202, 159, 57, 210, 206, 173, 197, 195, 80, 205, 27, 245, 162, + 249, 196, 151, 189, 182, 169, 151, 31, 143, 148, 158, 186, 37, 206, 252, 49, + 191, 171, 26, 230, 112, 56, 223, 225, 167, 251, 86, 71, 158, 158, 87, 159, + 170, 222, 205, 149, 181, 240, 39, 155, 254, 168, 155, 205, 194, 246, 113, 225, + 95, 212, 172, 67, 187, 235, 92, 40, 82, 199, 119, 157, 51, 164, 53, 29, + 255, 204, 247, 231, 198, 194, 52, 248, 254, 129, 168, 93, 30, 237, 141, 143, + 234, 205, 118, 157, 223, 106, 106, 101, 245, 164, 169, 159, 136, 155, 149, 155, + 35, 197, 106, 215, 213, 145, 106, 84, 120, 239, 102, 147, 55, 187, 191, 219, + 85, 73, 125, 60, 156, 87, 156, 69, 227, 137, 183, 122, 252, 217, 104, 234, + 27, 78, 163, 172, 54, 31, 47, 45, 169, 220, 233, 122, 179, 108, 182, 163, + 30, 243, 186, 90, 57, 182, 180, 106, 175, 234, 64, 199, 158, 118, 15, 237, + 61, 254, 105, 235, 172, 44, 205, 142, 248, 89, 95, 186, 62, 83, 149, 19, + 251, 74, 239, 95, 206, 84, 231, 106, 167, 113, 194, 159, 241, 229, 201, 211, + 206, 185, 39, 183, 228, 77, 103, 33, 117, 248, 173, 201, 149, 189, 227, 104, + 71, 197, 218, 225, 13, 127, 60, 233, 239, 244, 23, 197, 155, 110, 213, 108, + 237, 94, 156, 170, 71, 215, 229, 250, 126, 69, 153, 13, 7, 252, 129, 183, + 112, 246, 47, 128, 34, 233, 230, 227, 172, 115, 100, 239, 14, 78, 172, 125, + 179, 238, 47, 196, 107, 235, 188, 50, 51, 21, 181, 99, 52, 253, 125, 67, + 179, 100, 241, 247, 165, 233, 108, 73, 198, 109, 125, 38, 13, 111, 71, 55, + 151, 226, 149, 127, 107, 93, 139, 117, 103, 193, 95, 159, 52, 43, 179, 227, + 137, 218, 169, 159, 248, 251, 69, 83, 148, 125, 136, 92, 61, 238, 248, 189, + 217, 214, 80, 250, 101, 118, 31, 47, 197, 177, 95, 54, 110, 100, 73, 220, + 189, 20, 157, 147, 113, 145, 207, 102, 163, 148, 72, 1, 47, 196, 202, 66, + 157, 220, 158, 1, 57, 245, 175, 160, 72, 154, 139, 229, 53, 26, 21, 203, + 81, 198, 102, 191, 189, 125, 170, 46, 218, 21, 179, 109, 109, 154, 125, 81, + 170, 108, 139, 45, 99, 204, 107, 151, 86, 217, 233, 87, 187, 101, 197, 54, + 119, 248, 93, 177, 85, 238, 58, 82, 231, 70, 45, 238, 89, 158, 177, 45, + 158, 137, 252, 246, 104, 100, 94, 138, 125, 231, 172, 82, 220, 1, 130, 191, + 51, 245, 140, 83, 227, 210, 223, 21, 111, 49, 210, 153, 229, 121, 219, 226, + 108, 167, 184, 165, 95, 138, 7, 215, 123, 98, 91, 188, 181, 166, 190, 134, + 19, 233, 176, 242, 40, 106, 101, 233, 72, 108, 85, 14, 196, 95, 167, 11, + 95, 58, 210, 43, 202, 9, 223, 118, 164, 242, 173, 62, 245, 196, 51, 190, + 5, 235, 177, 88, 110, 87, 164, 166, 226, 55, 126, 241, 24, 101, 222, 49, + 42, 167, 123, 226, 54, 204, 194, 185, 15, 99, 12, 60, 146, 181, 195, 47, + 244, 182, 163, 57, 252, 214, 245, 181, 243, 75, 156, 86, 250, 85, 107, 147, + 63, 55, 47, 160, 151, 174, 250, 178, 163, 111, 206, 7, 252, 80, 60, 40, + 79, 125, 239, 74, 28, 95, 234, 187, 254, 222, 98, 175, 110, 85, 249, 179, + 227, 39, 231, 73, 156, 111, 153, 71, 250, 174, 248, 184, 163, 57, 143, 36, + 141, 31, 75, 115, 117, 84, 220, 156, 183, 205, 3, 89, 242, 119, 23, 114, + 213, 172, 78, 126, 87, 158, 128, 246, 186, 22, 134, 234, 18, 38, 187, 244, + 46, 204, 203, 202, 85, 125, 102, 235, 103, 124, 159, 63, 82, 15, 203, 242, + 150, 190, 233, 14, 196, 131, 189, 169, 183, 123, 105, 97, 178, 43, 232, 33, + 72, 4, 97, 191, 166, 226, 227, 165, 121, 230, 185, 230, 121, 69, 118, 32, + 209, 111, 216, 71, 32, 145, 103, 109, 234, 103, 147, 62, 38, 162, 67, 92, + 245, 175, 156, 226, 166, 59, 198, 138, 236, 1, 113, 128, 100, 252, 89, 185, + 197, 119, 111, 121, 103, 126, 100, 86, 96, 229, 119, 43, 242, 142, 50, 17, + 15, 42, 191, 78, 52, 167, 125, 106, 30, 93, 149, 117, 254, 192, 55, 249, + 241, 169, 117, 37, 122, 170, 43, 254, 46, 247, 203, 146, 107, 86, 166, 29, + 103, 175, 216, 49, 97, 138, 240, 142, 211, 226, 207, 42, 143, 149, 221, 9, + 4, 251, 11, 126, 86, 153, 236, 152, 101, 101, 107, 62, 178, 42, 250, 9, + 95, 54, 166, 39, 191, 105, 218, 253, 108, 246, 70, 213, 45, 205, 153, 109, + 243, 71, 242, 142, 206, 223, 120, 38, 111, 1, 149, 21, 181, 157, 219, 186, + 57, 20, 165, 29, 44, 65, 243, 31, 119, 186, 176, 99, 206, 13, 179, 162, + 110, 94, 12, 197, 138, 95, 230, 15, 142, 23, 254, 165, 49, 21, 183, 79, + 204, 234, 83, 101, 1, 141, 213, 45, 126, 71, 223, 228, 207, 204, 11, 12, + 22, 43, 198, 46, 175, 85, 166, 206, 77, 249, 112, 1, 253, 168, 106, 14, + 12, 243, 147, 120, 105, 192, 146, 33, 35, 236, 194, 242, 213, 28, 224, 80, + 166, 91, 238, 126, 167, 238, 102, 255, 131, 115, 192, 233, 229, 174, 138, 231, + 128, 206, 213, 104, 214, 153, 215, 247, 118, 175, 164, 95, 91, 154, 187, 51, + 47, 55, 111, 218, 237, 205, 95, 7, 11, 111, 107, 211, 189, 184, 40, 222, + 214, 183, 30, 235, 234, 205, 133, 214, 234, 150, 79, 129, 0, 237, 158, 204, + 207, 38, 59, 151, 167, 35, 136, 115, 14, 253, 177, 181, 59, 175, 24, 77, + 151, 47, 54, 14, 251, 250, 252, 246, 70, 251, 101, 233, 59, 189, 217, 225, + 118, 251, 224, 124, 247, 230, 184, 235, 233, 167, 59, 125, 89, 60, 125, 170, + 54, 173, 67, 32, 179, 183, 139, 170, 106, 92, 54, 248, 225, 211, 83, 183, + 106, 213, 158, 248, 126, 241, 180, 99, 251, 67, 254, 146, 31, 250, 221, 182, + 120, 85, 182, 102, 197, 73, 219, 144, 139, 178, 105, 53, 13, 171, 33, 78, + 60, 171, 49, 177, 229, 193, 180, 207, 159, 138, 226, 96, 2, 123, 81, 181, + 61, 181, 68, 88, 63, 58, 127, 236, 23, 21, 223, 179, 199, 162, 191, 40, + 123, 250, 89, 93, 53, 102, 176, 54, 33, 169, 63, 18, 197, 163, 33, 175, + 185, 166, 184, 47, 54, 117, 83, 87, 203, 197, 33, 47, 54, 141, 166, 105, + 141, 246, 135, 91, 142, 179, 107, 137, 59, 183, 21, 209, 80, 181, 78, 167, + 115, 98, 216, 252, 209, 192, 50, 45, 224, 248, 180, 95, 158, 55, 47, 158, + 148, 59, 90, 223, 42, 91, 182, 120, 114, 234, 116, 212, 108, 118, 209, 170, + 88, 230, 165, 218, 168, 168, 19, 109, 198, 95, 241, 170, 227, 28, 78, 28, + 199, 25, 26, 45, 67, 220, 28, 157, 110, 138, 234, 108, 231, 55, 207, 243, + 123, 98, 125, 112, 94, 245, 253, 217, 116, 122, 169, 78, 189, 114, 235, 218, + 59, 104, 14, 157, 77, 224, 161, 29, 111, 15, 232, 240, 84, 235, 206, 76, + 67, 156, 203, 131, 226, 185, 51, 22, 53, 115, 120, 105, 85, 108, 254, 84, + 231, 161, 232, 169, 88, 233, 116, 78, 45, 209, 92, 60, 1, 163, 122, 109, + 52, 203, 69, 189, 93, 183, 109, 179, 38, 246, 244, 22, 172, 149, 74, 197, + 107, 95, 97, 27, 229, 137, 122, 126, 57, 214, 245, 225, 41, 108, 119, 7, + 178, 199, 91, 141, 197, 66, 154, 136, 117, 95, 230, 135, 85, 222, 243, 171, + 234, 176, 54, 221, 179, 43, 14, 63, 242, 44, 222, 159, 221, 106, 21, 255, + 120, 243, 228, 178, 44, 26, 150, 127, 42, 87, 37, 200, 128, 247, 149, 218, + 78, 195, 17, 165, 206, 180, 210, 156, 214, 237, 61, 232, 222, 162, 57, 194, + 175, 99, 216, 237, 189, 202, 129, 46, 218, 206, 239, 9, 156, 49, 220, 45, + 203, 234, 87, 23, 69, 195, 186, 30, 246, 173, 193, 201, 120, 167, 238, 59, + 198, 166, 99, 214, 123, 134, 90, 158, 52, 118, 28, 227, 106, 231, 119, 217, + 220, 114, 78, 60, 243, 168, 113, 122, 226, 79, 218, 202, 225, 12, 24, 111, + 163, 119, 185, 24, 79, 55, 85, 111, 232, 215, 251, 215, 45, 83, 219, 210, + 253, 186, 168, 93, 107, 155, 117, 190, 222, 183, 93, 243, 44, 155, 221, 49, + 45, 15, 186, 120, 81, 241, 54, 69, 241, 100, 209, 52, 119, 78, 196, 45, + 245, 116, 62, 173, 237, 152, 112, 104, 178, 235, 126, 235, 220, 87, 139, 213, + 219, 155, 147, 173, 34, 68, 129, 66, 103, 215, 90, 171, 46, 214, 111, 154, + 123, 218, 102, 69, 51, 20, 181, 55, 158, 25, 202, 141, 189, 213, 169, 108, + 138, 83, 245, 100, 56, 61, 209, 245, 177, 182, 95, 169, 111, 54, 212, 162, + 162, 157, 75, 252, 177, 179, 59, 53, 14, 246, 140, 74, 179, 51, 29, 103, + 179, 126, 209, 188, 153, 252, 106, 43, 144, 220, 170, 206, 90, 112, 214, 157, + 46, 90, 14, 111, 78, 101, 191, 168, 238, 249, 154, 82, 190, 217, 20, 219, + 142, 226, 108, 30, 138, 35, 248, 104, 108, 150, 13, 95, 125, 108, 119, 157, + 162, 115, 117, 115, 185, 99, 30, 219, 179, 109, 113, 183, 170, 185, 162, 233, + 204, 14, 197, 221, 35, 179, 235, 180, 234, 230, 149, 227, 238, 241, 135, 254, + 236, 4, 136, 15, 6, 151, 205, 182, 248, 88, 135, 111, 238, 30, 240, 140, + 155, 254, 108, 33, 158, 254, 114, 230, 64, 114, 125, 72, 255, 171, 170, 93, + 97, 68, 146, 83, 91, 252, 229, 0, 67, 123, 80, 213, 182, 249, 19, 199, + 218, 89, 236, 251, 139, 29, 126, 127, 114, 34, 106, 189, 170, 185, 13, 107, + 224, 216, 209, 188, 234, 168, 38, 30, 87, 180, 58, 28, 13, 126, 31, 65, + 188, 253, 10, 236, 107, 151, 98, 229, 86, 92, 84, 204, 153, 39, 238, 206, + 197, 142, 163, 96, 124, 146, 14, 246, 162, 161, 54, 19, 111, 156, 185, 239, + 14, 156, 153, 191, 128, 205, 29, 234, 201, 215, 204, 169, 40, 87, 123, 158, + 114, 100, 118, 156, 89, 181, 87, 1, 78, 77, 23, 229, 19, 168, 195, 141, + 83, 28, 46, 202, 226, 21, 191, 229, 235, 195, 197, 142, 120, 101, 223, 136, + 69, 69, 124, 244, 205, 35, 243, 196, 52, 85, 104, 15, 127, 173, 119, 68, + 224, 131, 28, 235, 210, 153, 171, 16, 126, 5, 239, 174, 191, 171, 154, 99, + 160, 103, 208, 82, 72, 34, 213, 249, 91, 67, 107, 54, 221, 29, 113, 219, + 233, 150, 231, 101, 235, 68, 252, 173, 242, 53, 254, 76, 60, 112, 76, 25, + 82, 234, 67, 189, 44, 182, 43, 139, 42, 20, 251, 88, 153, 151, 49, 158, + 239, 61, 138, 124, 143, 183, 47, 69, 125, 88, 236, 137, 83, 79, 63, 2, + 34, 187, 237, 60, 213, 197, 67, 231, 177, 98, 93, 155, 3, 190, 239, 155, + 93, 241, 80, 236, 250, 192, 75, 107, 85, 209, 51, 248, 205, 129, 8, 235, + 116, 126, 34, 158, 139, 243, 163, 38, 255, 88, 228, 237, 154, 235, 105, 226, + 208, 23, 235, 139, 42, 111, 84, 218, 254, 241, 88, 157, 237, 139, 187, 21, + 241, 64, 174, 138, 176, 42, 212, 129, 229, 91, 254, 120, 81, 30, 185, 251, + 126, 173, 170, 116, 196, 121, 221, 150, 156, 98, 197, 154, 233, 61, 109, 207, + 210, 29, 255, 240, 84, 242, 204, 45, 94, 228, 167, 202, 169, 91, 129, 197, + 0, 59, 237, 249, 64, 59, 154, 206, 196, 178, 126, 42, 30, 136, 6, 180, + 180, 2, 228, 68, 43, 43, 238, 108, 38, 218, 35, 123, 50, 58, 95, 24, + 19, 243, 204, 54, 123, 19, 243, 70, 52, 142, 237, 51, 127, 186, 51, 228, + 225, 144, 113, 104, 57, 178, 82, 172, 40, 19, 249, 156, 119, 52, 121, 81, + 111, 154, 162, 114, 99, 181, 253, 70, 197, 62, 216, 173, 219, 251, 150, 111, + 72, 226, 150, 37, 110, 222, 170, 192, 51, 137, 250, 181, 104, 204, 60, 222, + 240, 220, 195, 25, 108, 81, 62, 172, 5, 19, 214, 194, 86, 3, 152, 154, + 138, 189, 16, 183, 156, 242, 124, 54, 171, 195, 56, 194, 240, 209, 177, 209, + 182, 157, 73, 221, 217, 28, 47, 54, 59, 106, 231, 194, 62, 222, 113, 142, + 29, 243, 90, 31, 67, 103, 237, 248, 163, 77, 31, 86, 134, 10, 27, 211, + 241, 118, 197, 57, 236, 204, 118, 43, 251, 162, 233, 59, 112, 186, 213, 175, + 109, 233, 210, 220, 22, 23, 143, 158, 117, 212, 113, 58, 229, 217, 241, 233, + 116, 75, 60, 189, 16, 47, 124, 227, 18, 86, 21, 44, 147, 108, 86, 131, + 45, 70, 63, 111, 6, 235, 10, 248, 79, 24, 131, 42, 93, 41, 157, 202, + 201, 112, 126, 37, 30, 122, 152, 242, 220, 172, 139, 115, 75, 220, 189, 18, + 221, 58, 255, 88, 230, 97, 190, 151, 121, 88, 29, 71, 38, 76, 122, 50, + 193, 159, 196, 93, 21, 86, 14, 172, 142, 142, 248, 56, 132, 25, 8, 223, + 46, 29, 119, 136, 191, 96, 197, 192, 47, 88, 31, 211, 177, 150, 205, 122, + 98, 215, 80, 39, 251, 254, 220, 84, 236, 233, 212, 56, 175, 192, 4, 222, + 35, 51, 31, 230, 244, 180, 58, 243, 172, 115, 255, 96, 33, 78, 125, 215, + 239, 84, 248, 95, 93, 113, 15, 87, 196, 21, 172, 136, 217, 177, 175, 29, + 105, 134, 57, 23, 221, 38, 156, 195, 197, 109, 126, 219, 60, 23, 103, 99, + 24, 55, 152, 137, 189, 58, 191, 45, 122, 85, 156, 227, 117, 165, 202, 239, + 242, 53, 81, 118, 218, 117, 165, 98, 29, 67, 247, 246, 207, 157, 206, 145, + 89, 238, 192, 236, 63, 33, 179, 223, 106, 139, 139, 170, 190, 191, 229, 158, + 248, 146, 45, 78, 225, 5, 86, 204, 163, 134, 181, 227, 143, 135, 208, 26, + 254, 17, 214, 239, 188, 106, 237, 225, 28, 191, 134, 69, 239, 22, 101, 85, + 169, 152, 135, 188, 5, 227, 51, 216, 17, 159, 124, 152, 194, 123, 206, 47, + 103, 234, 200, 123, 62, 236, 17, 190, 110, 40, 191, 58, 230, 149, 85, 117, + 244, 35, 43, 155, 221, 22, 187, 35, 87, 28, 54, 205, 27, 103, 12, 244, + 163, 114, 43, 123, 86, 197, 119, 129, 144, 56, 250, 249, 141, 228, 152, 101, + 103, 95, 212, 127, 251, 181, 161, 181, 197, 247, 85, 177, 82, 108, 89, 134, + 245, 27, 88, 76, 107, 224, 111, 94, 136, 157, 91, 235, 230, 210, 56, 178, + 246, 204, 153, 218, 113, 172, 219, 29, 183, 2, 164, 101, 94, 129, 19, 144, + 113, 210, 85, 103, 226, 109, 71, 217, 179, 230, 246, 176, 194, 47, 174, 142, + 102, 101, 177, 6, 4, 159, 63, 177, 247, 203, 252, 238, 233, 77, 197, 168, + 243, 123, 132, 42, 224, 108, 82, 246, 171, 46, 16, 6, 113, 100, 47, 142, + 203, 252, 100, 241, 11, 86, 245, 142, 55, 122, 28, 255, 118, 172, 201, 83, + 21, 114, 222, 242, 196, 217, 76, 42, 243, 195, 138, 179, 165, 66, 253, 183, + 197, 241, 9, 204, 139, 218, 1, 191, 227, 187, 162, 90, 185, 244, 245, 99, + 241, 228, 188, 8, 83, 229, 168, 56, 149, 13, 107, 23, 42, 106, 214, 76, + 239, 10, 216, 183, 129, 143, 51, 0, 201, 158, 223, 130, 82, 183, 171, 174, + 161, 117, 196, 133, 164, 138, 11, 255, 105, 80, 219, 145, 45, 207, 25, 116, + 206, 61, 241, 230, 73, 54, 93, 113, 236, 240, 215, 72, 215, 198, 64, 21, + 68, 199, 153, 250, 79, 234, 168, 162, 141, 135, 101, 190, 92, 190, 56, 226, + 241, 196, 100, 214, 205, 167, 234, 8, 166, 157, 239, 86, 135, 149, 226, 244, + 10, 10, 132, 237, 223, 172, 54, 91, 226, 229, 142, 222, 134, 66, 139, 42, + 191, 231, 223, 136, 143, 83, 254, 124, 111, 142, 169, 58, 14, 95, 30, 195, + 184, 94, 234, 123, 229, 199, 246, 211, 66, 28, 201, 23, 48, 67, 172, 113, + 113, 234, 212, 29, 125, 71, 28, 91, 26, 210, 160, 89, 21, 104, 215, 209, + 236, 132, 126, 115, 29, 121, 113, 227, 152, 38, 239, 219, 112, 78, 220, 170, + 250, 176, 114, 202, 188, 231, 245, 28, 189, 14, 219, 99, 221, 153, 159, 84, + 189, 125, 81, 246, 138, 62, 20, 122, 46, 158, 238, 60, 65, 125, 236, 142, + 42, 247, 180, 74, 241, 128, 63, 18, 47, 118, 196, 138, 5, 121, 255, 154, + 12, 170, 13, 189, 184, 101, 205, 157, 11, 177, 88, 209, 207, 174, 206, 69, + 239, 215, 176, 216, 130, 73, 224, 157, 54, 251, 34, 239, 204, 156, 226, 133, + 115, 11, 167, 26, 127, 171, 242, 251, 104, 234, 203, 115, 88, 181, 143, 192, + 226, 47, 206, 120, 151, 159, 84, 126, 203, 91, 226, 239, 250, 220, 151, 21, + 165, 174, 213, 117, 7, 230, 118, 54, 43, 153, 146, 106, 93, 250, 11, 163, + 239, 91, 191, 237, 40, 246, 233, 111, 171, 209, 220, 145, 219, 102, 175, 220, + 191, 177, 14, 124, 32, 117, 149, 147, 99, 209, 84, 245, 217, 239, 178, 120, + 233, 76, 139, 162, 213, 185, 10, 106, 66, 118, 46, 239, 246, 9, 170, 243, + 216, 190, 233, 64, 206, 18, 28, 212, 204, 33, 246, 242, 212, 111, 249, 137, + 90, 0, 55, 200, 55, 84, 185, 122, 106, 232, 195, 235, 202, 204, 128, 118, + 15, 244, 177, 111, 245, 196, 238, 100, 236, 245, 21, 115, 247, 212, 19, 37, + 103, 218, 122, 234, 0, 227, 166, 85, 23, 74, 209, 243, 158, 68, 163, 99, + 86, 249, 71, 79, 113, 138, 117, 93, 174, 42, 149, 98, 93, 60, 106, 238, + 242, 158, 41, 85, 180, 206, 211, 206, 98, 226, 67, 25, 124, 191, 162, 31, + 152, 21, 241, 241, 20, 41, 71, 215, 60, 113, 250, 162, 168, 58, 93, 88, + 50, 45, 223, 244, 212, 217, 158, 120, 160, 2, 95, 182, 163, 242, 77, 177, + 81, 221, 245, 167, 126, 64, 123, 143, 253, 178, 15, 51, 195, 240, 37, 113, + 234, 88, 39, 230, 76, 116, 97, 97, 108, 255, 114, 52, 204, 65, 217, 219, + 170, 0, 217, 180, 112, 199, 130, 69, 110, 94, 62, 86, 52, 154, 115, 11, + 83, 201, 176, 230, 159, 124, 32, 160, 42, 11, 199, 248, 80, 104, 69, 188, + 53, 204, 129, 184, 63, 221, 175, 24, 11, 254, 132, 111, 170, 115, 71, 243, + 97, 39, 59, 132, 67, 136, 86, 220, 189, 17, 253, 138, 166, 90, 178, 115, + 81, 217, 17, 229, 83, 235, 86, 212, 58, 215, 211, 98, 157, 55, 157, 142, + 227, 53, 77, 143, 135, 45, 88, 124, 234, 141, 96, 255, 11, 195, 213, 43, + 235, 192, 60, 226, 167, 98, 87, 190, 17, 103, 245, 107, 95, 57, 122, 170, + 134, 181, 65, 9, 98, 17, 234, 201, 15, 237, 185, 216, 83, 122, 162, 95, + 101, 37, 108, 139, 188, 55, 238, 194, 214, 175, 75, 149, 51, 177, 236, 243, + 112, 162, 29, 237, 138, 197, 9, 240, 46, 106, 69, 223, 173, 92, 138, 106, + 199, 52, 120, 205, 255, 85, 105, 139, 114, 199, 31, 57, 90, 213, 50, 148, + 97, 49, 202, 221, 242, 96, 11, 226, 199, 70, 89, 220, 107, 194, 46, 231, + 47, 124, 195, 53, 31, 161, 165, 101, 75, 117, 6, 198, 153, 88, 116, 236, + 75, 71, 237, 180, 202, 38, 176, 234, 176, 153, 234, 59, 36, 172, 110, 79, + 202, 54, 172, 149, 93, 255, 73, 60, 93, 88, 149, 98, 133, 191, 116, 138, + 93, 164, 141, 7, 82, 221, 52, 197, 166, 216, 44, 75, 29, 56, 69, 171, + 242, 162, 53, 190, 172, 204, 230, 11, 231, 17, 222, 161, 146, 149, 67, 152, + 113, 34, 68, 30, 247, 250, 142, 92, 131, 14, 24, 22, 125, 99, 4, 179, + 247, 241, 100, 7, 22, 110, 181, 114, 125, 105, 157, 137, 202, 252, 201, 153, + 214, 139, 254, 98, 36, 94, 242, 29, 177, 235, 12, 212, 190, 168, 89, 124, + 211, 233, 171, 186, 193, 67, 187, 42, 191, 160, 137, 192, 30, 26, 253, 178, + 126, 102, 207, 47, 37, 71, 109, 66, 151, 236, 136, 135, 124, 3, 250, 245, + 180, 50, 175, 195, 44, 156, 148, 7, 80, 42, 127, 182, 123, 36, 214, 117, + 216, 189, 79, 206, 42, 179, 45, 81, 17, 173, 50, 214, 4, 214, 233, 165, + 104, 0, 75, 49, 158, 193, 134, 118, 34, 30, 251, 151, 162, 165, 90, 173, + 155, 75, 94, 93, 116, 196, 158, 255, 123, 71, 151, 173, 19, 93, 230, 183, + 196, 9, 52, 117, 86, 41, 138, 252, 185, 179, 232, 240, 94, 185, 103, 244, + 188, 176, 38, 64, 32, 234, 205, 70, 175, 242, 180, 197, 95, 240, 13, 152, + 240, 11, 83, 187, 228, 43, 124, 163, 233, 149, 77, 199, 220, 7, 42, 169, + 58, 234, 214, 236, 168, 40, 234, 217, 236, 12, 246, 135, 167, 45, 216, 199, + 21, 17, 230, 240, 245, 208, 168, 43, 142, 181, 0, 166, 251, 23, 52, 86, + 117, 70, 157, 254, 142, 5, 117, 238, 29, 137, 11, 190, 90, 153, 171, 64, + 33, 117, 21, 206, 245, 117, 32, 175, 125, 66, 175, 140, 11, 24, 39, 31, + 78, 74, 195, 249, 177, 37, 138, 13, 190, 42, 3, 59, 202, 143, 203, 6, + 208, 220, 85, 105, 161, 165, 52, 117, 127, 97, 105, 252, 116, 130, 37, 193, + 103, 177, 35, 94, 226, 88, 139, 55, 240, 113, 216, 214, 22, 188, 118, 42, + 193, 140, 169, 195, 56, 20, 205, 78, 197, 129, 224, 174, 117, 227, 139, 149, + 225, 57, 63, 231, 71, 21, 91, 124, 252, 5, 37, 137, 93, 104, 157, 239, + 59, 146, 216, 84, 139, 14, 236, 157, 139, 162, 134, 84, 113, 91, 245, 245, + 29, 204, 75, 151, 172, 27, 56, 197, 158, 138, 99, 209, 240, 167, 252, 200, + 17, 61, 185, 101, 222, 138, 141, 114, 189, 170, 117, 180, 138, 254, 4, 212, + 205, 247, 43, 142, 196, 75, 62, 12, 240, 205, 126, 95, 236, 119, 122, 123, + 154, 231, 136, 134, 183, 48, 149, 133, 232, 215, 28, 7, 168, 137, 56, 222, + 49, 207, 228, 115, 32, 44, 219, 71, 51, 126, 65, 102, 230, 216, 23, 49, + 97, 7, 170, 127, 83, 238, 251, 144, 176, 107, 62, 58, 190, 232, 45, 70, + 192, 35, 45, 68, 199, 182, 157, 54, 36, 181, 128, 155, 216, 131, 164, 149, + 211, 163, 25, 28, 36, 161, 45, 64, 155, 68, 91, 226, 97, 135, 187, 20, + 107, 101, 160, 53, 29, 165, 205, 63, 58, 29, 56, 136, 140, 196, 133, 88, + 119, 108, 113, 96, 13, 42, 144, 112, 122, 2, 9, 203, 39, 71, 192, 203, + 67, 66, 79, 183, 60, 30, 18, 138, 52, 161, 137, 244, 204, 229, 127, 87, + 93, 75, 133, 153, 177, 3, 133, 214, 29, 30, 146, 234, 176, 53, 241, 82, + 229, 188, 114, 5, 73, 69, 109, 167, 117, 217, 84, 90, 103, 165, 44, 162, + 134, 50, 253, 155, 102, 99, 44, 224, 237, 107, 102, 77, 46, 18, 103, 178, + 146, 0, 15, 138, 38, 104, 146, 160, 203, 66, 81, 254, 134, 46, 32, 225, + 159, 38, 200, 150, 160, 20, 5, 221, 20, 138, 240, 73, 255, 134, 33, 106, + 44, 178, 33, 20, 45, 65, 47, 146, 112, 67, 80, 20, 65, 177, 48, 7, + 211, 16, 76, 73, 40, 42, 223, 16, 225, 71, 17, 84, 3, 226, 8, 69, + 19, 10, 178, 224, 71, 21, 12, 227, 27, 100, 160, 234, 144, 37, 98, 120, + 153, 88, 5, 200, 1, 178, 182, 148, 111, 154, 133, 97, 134, 137, 185, 96, + 100, 89, 129, 207, 10, 42, 38, 201, 223, 12, 5, 98, 8, 150, 46, 88, + 144, 25, 241, 83, 41, 145, 56, 150, 149, 39, 216, 238, 212, 192, 226, 130, + 32, 168, 127, 215, 165, 159, 186, 36, 73, 98, 78, 254, 170, 72, 18, 186, + 109, 148, 191, 113, 20, 16, 145, 154, 130, 172, 93, 172, 187, 188, 46, 17, + 168, 98, 98, 139, 146, 207, 103, 9, 112, 238, 89, 76, 143, 44, 208, 23, + 35, 250, 203, 25, 84, 107, 64, 220, 244, 64, 133, 149, 27, 114, 207, 83, + 126, 173, 48, 253, 44, 19, 87, 92, 109, 120, 110, 211, 231, 80, 195, 84, + 229, 208, 29, 202, 188, 81, 111, 12, 209, 21, 36, 55, 12, 198, 65, 143, + 172, 153, 17, 8, 137, 58, 23, 141, 43, 89, 168, 25, 10, 72, 74, 81, + 17, 169, 185, 73, 204, 146, 95, 249, 134, 128, 201, 107, 212, 36, 167, 168, + 173, 229, 133, 161, 77, 236, 123, 240, 106, 250, 211, 218, 236, 179, 153, 199, + 91, 230, 79, 107, 115, 120, 18, 50, 161, 49, 16, 218, 32, 65, 247, 230, + 133, 209, 176, 1, 177, 157, 254, 144, 91, 235, 34, 240, 134, 192, 117, 191, + 155, 2, 199, 243, 93, 129, 35, 161, 143, 52, 244, 145, 134, 62, 10, 8, + 110, 1, 65, 143, 28, 207, 153, 235, 93, 44, 126, 116, 7, 65, 247, 104, + 37, 52, 233, 173, 65, 126, 235, 212, 220, 40, 155, 131, 249, 69, 205, 63, + 224, 59, 150, 38, 64, 239, 230, 35, 67, 33, 25, 235, 138, 150, 80, 36, + 14, 214, 6, 81, 234, 57, 180, 111, 39, 253, 144, 225, 135, 119, 103, 247, + 129, 254, 94, 168, 222, 137, 214, 231, 34, 177, 21, 164, 209, 226, 54, 131, + 27, 255, 111, 235, 34, 247, 237, 62, 202, 230, 126, 100, 95, 239, 37, 244, + 134, 64, 84, 2, 137, 54, 6, 106, 51, 116, 239, 254, 80, 37, 251, 97, + 28, 109, 146, 33, 102, 195, 188, 35, 51, 144, 56, 109, 100, 83, 45, 194, + 190, 82, 5, 137, 78, 188, 4, 64, 110, 64, 39, 132, 179, 251, 101, 141, + 128, 119, 117, 11, 82, 10, 4, 105, 253, 130, 110, 191, 215, 95, 242, 136, + 180, 228, 38, 138, 98, 58, 101, 248, 64, 99, 46, 134, 112, 23, 62, 5, + 122, 160, 235, 68, 201, 200, 193, 21, 250, 69, 209, 245, 117, 180, 221, 93, + 91, 115, 11, 178, 98, 194, 18, 135, 95, 95, 50, 196, 161, 16, 249, 184, + 234, 155, 178, 42, 33, 4, 192, 71, 212, 253, 9, 253, 47, 101, 66, 39, + 219, 171, 180, 87, 176, 97, 31, 112, 116, 8, 173, 79, 119, 73, 207, 30, + 141, 30, 166, 238, 184, 253, 80, 119, 137, 202, 69, 232, 217, 48, 249, 129, + 98, 31, 101, 17, 184, 105, 197, 215, 184, 202, 12, 79, 117, 102, 234, 168, + 57, 162, 16, 197, 231, 63, 20, 126, 155, 186, 188, 13, 29, 67, 163, 194, + 237, 58, 113, 85, 134, 51, 131, 170, 171, 32, 30, 133, 3, 149, 13, 38, + 57, 2, 158, 178, 169, 46, 235, 108, 174, 67, 216, 191, 75, 208, 85, 63, + 126, 60, 230, 255, 41, 231, 191, 127, 95, 147, 245, 194, 99, 62, 116, 183, + 163, 161, 131, 56, 200, 132, 166, 37, 17, 205, 252, 63, 177, 75, 185, 127, + 227, 43, 121, 252, 254, 221, 12, 189, 232, 208, 5, 76, 177, 227, 32, 65, + 81, 215, 85, 253, 199, 15, 204, 149, 224, 186, 161, 186, 37, 172, 16, 238, + 159, 236, 211, 247, 239, 8, 96, 16, 4, 195, 194, 128, 47, 152, 54, 155, + 116, 110, 217, 97, 168, 106, 129, 218, 235, 115, 206, 248, 76, 1, 199, 66, + 132, 219, 68, 31, 190, 239, 15, 50, 53, 32, 169, 129, 36, 250, 79, 177, + 241, 163, 239, 68, 115, 52, 80, 206, 122, 136, 69, 123, 223, 247, 39, 23, + 203, 129, 91, 237, 175, 147, 196, 120, 183, 226, 44, 159, 245, 148, 150, 23, + 75, 108, 15, 187, 196, 112, 106, 100, 219, 205, 153, 128, 191, 9, 28, 141, + 12, 163, 38, 228, 100, 28, 172, 21, 102, 238, 68, 83, 151, 33, 125, 108, + 112, 241, 156, 208, 100, 181, 164, 252, 201, 105, 223, 70, 165, 64, 223, 126, + 61, 167, 50, 47, 23, 178, 0, 236, 26, 117, 114, 1, 143, 235, 67, 234, + 227, 34, 71, 203, 38, 127, 230, 104, 162, 153, 67, 124, 136, 16, 219, 250, + 173, 98, 140, 68, 49, 197, 191, 89, 140, 30, 21, 99, 190, 89, 140, 44, + 37, 202, 177, 254, 102, 57, 102, 84, 142, 44, 191, 93, 144, 154, 40, 72, + 86, 254, 102, 73, 8, 23, 203, 165, 237, 39, 83, 35, 157, 152, 161, 65, + 48, 53, 218, 3, 134, 44, 157, 224, 99, 211, 43, 145, 77, 220, 105, 28, + 196, 172, 53, 89, 161, 236, 37, 177, 38, 194, 56, 239, 59, 95, 99, 169, + 211, 37, 140, 135, 238, 192, 30, 61, 4, 154, 145, 209, 123, 66, 135, 58, + 12, 126, 191, 156, 40, 131, 84, 81, 102, 72, 107, 223, 218, 191, 18, 144, + 149, 204, 142, 76, 14, 225, 107, 148, 12, 31, 90, 51, 4, 74, 206, 100, + 194, 247, 199, 163, 9, 154, 128, 20, 153, 109, 27, 227, 23, 227, 62, 243, + 164, 12, 209, 107, 111, 112, 79, 147, 154, 55, 38, 64, 23, 106, 184, 211, + 83, 30, 114, 35, 9, 109, 41, 39, 39, 130, 249, 33, 66, 103, 174, 164, + 111, 212, 237, 29, 186, 138, 161, 230, 74, 209, 59, 110, 77, 230, 11, 179, + 75, 141, 71, 139, 24, 234, 53, 220, 21, 164, 124, 140, 122, 168, 232, 183, + 141, 103, 24, 162, 145, 201, 73, 0, 206, 75, 220, 171, 47, 127, 150, 227, + 46, 214, 151, 63, 43, 49, 215, 233, 220, 146, 65, 11, 199, 71, 159, 53, + 46, 26, 134, 40, 84, 15, 243, 68, 238, 189, 61, 234, 110, 172, 206, 188, + 248, 86, 188, 88, 19, 140, 183, 226, 197, 218, 98, 174, 168, 44, 84, 46, + 138, 96, 173, 138, 80, 155, 81, 165, 215, 132, 49, 84, 132, 201, 33, 73, + 1, 154, 18, 246, 61, 135, 142, 19, 80, 43, 151, 160, 11, 68, 91, 53, + 144, 163, 248, 190, 157, 4, 238, 8, 220, 37, 112, 124, 42, 87, 4, 242, + 48, 128, 159, 24, 82, 123, 162, 231, 92, 145, 151, 54, 36, 153, 161, 175, + 154, 28, 85, 0, 102, 197, 91, 220, 227, 6, 71, 125, 81, 146, 204, 194, + 41, 66, 244, 214, 255, 149, 147, 127, 62, 124, 225, 191, 124, 125, 248, 82, + 248, 242, 47, 56, 78, 253, 139, 184, 248, 253, 249, 101, 246, 229, 43, 241, + 214, 251, 243, 203, 156, 62, 41, 16, 6, 143, 95, 230, 51, 140, 135, 62, + 146, 144, 123, 123, 100, 0, 206, 137, 137, 30, 22, 145, 178, 177, 139, 77, + 90, 2, 93, 195, 140, 134, 19, 43, 248, 251, 253, 43, 238, 135, 194, 126, + 230, 186, 27, 25, 186, 169, 170, 146, 20, 168, 51, 115, 117, 14, 225, 160, + 27, 140, 91, 85, 25, 30, 115, 134, 255, 81, 226, 52, 72, 179, 236, 2, + 83, 202, 36, 76, 37, 40, 8, 191, 156, 129, 113, 13, 89, 180, 218, 96, + 208, 157, 63, 180, 106, 189, 94, 13, 45, 26, 188, 94, 228, 187, 133, 122, + 252, 24, 53, 134, 182, 237, 197, 29, 141, 20, 153, 163, 17, 74, 15, 252, + 20, 158, 244, 187, 118, 221, 105, 190, 36, 232, 36, 68, 29, 247, 131, 70, + 144, 66, 129, 255, 138, 184, 145, 20, 77, 110, 215, 154, 118, 64, 72, 3, + 186, 156, 8, 91, 109, 81, 147, 136, 243, 62, 161, 78, 230, 152, 222, 23, + 26, 53, 15, 187, 54, 44, 63, 124, 71, 122, 165, 191, 196, 204, 74, 194, + 79, 239, 23, 25, 101, 146, 46, 206, 238, 58, 15, 45, 136, 223, 32, 78, + 12, 162, 93, 54, 245, 33, 197, 199, 47, 37, 11, 249, 97, 6, 118, 139, + 224, 16, 12, 24, 104, 125, 77, 151, 10, 119, 164, 179, 238, 243, 33, 252, + 232, 200, 109, 33, 56, 95, 78, 253, 89, 144, 191, 202, 43, 0, 78, 129, + 71, 66, 52, 9, 191, 134, 103, 89, 140, 189, 190, 182, 134, 156, 70, 126, + 189, 179, 70, 202, 32, 176, 216, 136, 8, 66, 169, 244, 207, 53, 140, 202, + 115, 110, 254, 107, 134, 80, 8, 26, 176, 30, 6, 40, 52, 224, 159, 97, + 128, 74, 3, 254, 29, 6, 104, 63, 103, 253, 33, 134, 9, 65, 136, 78, + 162, 252, 9, 94, 139, 63, 215, 220, 63, 16, 192, 94, 13, 242, 245, 51, + 126, 93, 115, 63, 99, 120, 38, 255, 25, 182, 194, 111, 153, 236, 114, 223, + 126, 192, 65, 111, 178, 199, 151, 25, 6, 187, 246, 184, 194, 202, 32, 134, + 37, 140, 152, 61, 231, 194, 190, 176, 37, 108, 162, 155, 51, 164, 90, 193, + 43, 181, 41, 192, 195, 19, 15, 5, 33, 38, 22, 53, 133, 145, 132, 220, + 185, 144, 219, 23, 114, 91, 66, 110, 51, 112, 77, 170, 114, 196, 45, 46, + 252, 108, 108, 16, 139, 51, 196, 79, 15, 6, 110, 108, 15, 152, 255, 62, + 25, 209, 121, 215, 3, 92, 182, 16, 107, 144, 34, 207, 151, 16, 98, 157, + 154, 226, 134, 160, 140, 51, 2, 209, 98, 15, 214, 35, 92, 170, 240, 219, + 60, 248, 22, 1, 85, 49, 209, 135, 75, 33, 97, 14, 132, 140, 59, 67, + 121, 5, 253, 5, 39, 168, 57, 62, 208, 95, 223, 184, 46, 254, 149, 152, + 83, 63, 227, 71, 73, 22, 184, 105, 219, 133, 138, 172, 145, 244, 2, 164, + 45, 81, 89, 218, 204, 201, 11, 144, 150, 189, 205, 157, 124, 158, 8, 73, + 156, 111, 144, 115, 161, 212, 132, 156, 231, 248, 119, 142, 167, 180, 127, 112, + 123, 253, 225, 180, 54, 132, 131, 230, 172, 142, 197, 214, 131, 178, 241, 129, + 254, 130, 178, 235, 241, 178, 63, 173, 40, 187, 30, 148, 93, 199, 178, 131, + 183, 121, 157, 149, 93, 135, 178, 235, 60, 45, 27, 255, 178, 178, 183, 106, + 141, 71, 82, 56, 241, 23, 251, 243, 96, 13, 50, 194, 228, 56, 255, 208, + 61, 44, 9, 113, 176, 49, 44, 4, 230, 120, 215, 249, 222, 173, 199, 63, + 68, 169, 112, 158, 118, 235, 235, 240, 47, 250, 12, 43, 166, 235, 172, 195, + 191, 88, 52, 17, 98, 253, 81, 160, 71, 8, 206, 100, 62, 27, 77, 11, + 156, 21, 163, 112, 90, 44, 129, 81, 17, 232, 254, 94, 109, 248, 248, 224, + 187, 35, 183, 142, 64, 201, 212, 187, 117, 22, 166, 95, 137, 123, 201, 102, + 150, 99, 100, 67, 126, 151, 108, 36, 69, 230, 154, 134, 32, 186, 212, 231, + 4, 229, 201, 27, 185, 196, 176, 39, 237, 221, 135, 145, 170, 229, 168, 41, + 106, 245, 74, 94, 232, 181, 153, 203, 122, 8, 178, 135, 92, 131, 178, 70, + 214, 10, 116, 252, 175, 181, 53, 207, 133, 189, 16, 79, 50, 2, 121, 212, + 224, 145, 24, 215, 34, 237, 13, 60, 238, 66, 226, 14, 202, 94, 130, 136, + 177, 120, 81, 204, 152, 123, 146, 120, 13, 222, 7, 117, 89, 110, 84, 250, + 36, 108, 3, 63, 141, 146, 157, 135, 166, 61, 174, 185, 43, 221, 91, 211, + 124, 131, 239, 12, 114, 158, 248, 0, 148, 81, 4, 28, 190, 161, 7, 157, + 135, 85, 121, 222, 17, 160, 10, 21, 49, 10, 204, 87, 98, 40, 24, 195, + 32, 88, 1, 218, 43, 81, 84, 140, 34, 203, 5, 89, 123, 129, 147, 196, + 234, 56, 26, 137, 163, 23, 100, 224, 201, 229, 12, 191, 194, 220, 106, 101, + 58, 116, 124, 219, 30, 218, 163, 118, 191, 219, 164, 174, 38, 67, 54, 189, + 206, 17, 51, 81, 29, 33, 226, 35, 246, 60, 48, 215, 205, 244, 152, 73, + 60, 177, 136, 167, 130, 57, 44, 143, 117, 33, 130, 102, 229, 20, 81, 207, + 115, 117, 98, 70, 62, 132, 157, 66, 134, 14, 212, 33, 67, 234, 121, 32, + 147, 252, 0, 177, 63, 235, 121, 252, 74, 144, 221, 214, 114, 199, 133, 92, + 143, 200, 228, 94, 16, 165, 41, 215, 35, 220, 30, 206, 27, 138, 55, 79, + 42, 167, 35, 192, 194, 6, 204, 152, 13, 147, 176, 19, 4, 144, 124, 157, + 218, 136, 107, 47, 153, 213, 237, 37, 214, 182, 136, 15, 88, 131, 178, 187, + 118, 247, 129, 34, 194, 12, 184, 191, 178, 43, 123, 136, 32, 57, 152, 47, + 127, 225, 50, 195, 177, 198, 67, 172, 108, 193, 131, 180, 170, 128, 119, 103, + 230, 114, 254, 169, 157, 42, 140, 208, 237, 55, 106, 221, 135, 54, 186, 234, + 4, 254, 188, 71, 44, 179, 164, 82, 150, 138, 36, 179, 92, 93, 46, 101, + 25, 152, 13, 188, 40, 165, 108, 136, 102, 179, 140, 28, 203, 7, 139, 253, + 245, 204, 177, 153, 69, 92, 244, 6, 76, 2, 202, 241, 229, 158, 235, 4, + 97, 5, 14, 178, 47, 41, 91, 186, 183, 42, 201, 35, 31, 171, 203, 50, + 19, 62, 19, 113, 125, 132, 160, 149, 226, 83, 66, 222, 229, 132, 176, 51, + 49, 254, 166, 71, 64, 62, 115, 197, 159, 242, 87, 194, 6, 193, 74, 227, + 129, 66, 124, 203, 68, 98, 126, 93, 86, 214, 242, 194, 148, 128, 203, 141, + 2, 225, 125, 40, 166, 31, 65, 253, 214, 130, 143, 84, 140, 153, 97, 175, + 119, 143, 247, 148, 45, 234, 213, 126, 192, 206, 64, 0, 32, 70, 79, 195, + 181, 71, 145, 132, 1, 169, 71, 160, 238, 229, 224, 12, 145, 202, 167, 106, + 32, 229, 133, 186, 235, 133, 229, 55, 104, 249, 141, 239, 35, 44, 179, 17, + 191, 106, 128, 60, 79, 132, 57, 249, 45, 9, 13, 65, 89, 63, 65, 144, + 211, 240, 175, 140, 174, 96, 175, 86, 183, 227, 42, 104, 1, 229, 232, 174, + 160, 5, 223, 50, 77, 151, 220, 64, 32, 238, 33, 6, 23, 32, 152, 69, + 22, 21, 244, 174, 139, 213, 186, 131, 47, 247, 124, 41, 104, 56, 38, 161, + 110, 130, 17, 29, 110, 210, 163, 59, 239, 138, 2, 73, 147, 88, 153, 16, + 143, 47, 145, 204, 176, 84, 246, 64, 175, 57, 72, 62, 24, 34, 18, 1, + 150, 108, 23, 116, 1, 130, 33, 176, 2, 17, 14, 160, 12, 204, 172, 146, + 39, 28, 37, 6, 145, 212, 21, 56, 190, 221, 127, 227, 36, 216, 82, 195, + 239, 10, 253, 126, 23, 139, 33, 4, 207, 242, 61, 113, 183, 156, 136, 175, + 190, 29, 63, 124, 86, 86, 164, 213, 62, 158, 54, 124, 86, 131, 124, 160, + 105, 217, 76, 72, 240, 232, 78, 72, 1, 47, 35, 98, 71, 240, 56, 208, + 73, 137, 194, 35, 193, 35, 208, 178, 111, 46, 238, 143, 211, 141, 229, 149, + 155, 222, 217, 28, 100, 117, 231, 111, 236, 107, 193, 187, 154, 217, 224, 248, + 2, 129, 32, 65, 57, 98, 33, 242, 191, 40, 199, 155, 2, 123, 242, 179, + 140, 160, 37, 74, 64, 186, 227, 178, 42, 223, 245, 221, 0, 95, 139, 144, + 13, 70, 148, 232, 85, 85, 210, 220, 55, 93, 177, 119, 104, 113, 42, 62, + 181, 143, 255, 139, 29, 29, 179, 40, 72, 244, 34, 35, 236, 100, 228, 247, + 13, 98, 83, 121, 47, 9, 246, 217, 197, 15, 237, 239, 21, 157, 136, 117, + 79, 199, 74, 57, 64, 35, 117, 203, 18, 79, 100, 73, 201, 108, 34, 213, + 7, 100, 173, 169, 82, 150, 46, 216, 104, 46, 253, 134, 77, 65, 71, 190, + 2, 21, 237, 225, 86, 65, 123, 7, 207, 30, 61, 216, 45, 130, 41, 132, + 242, 70, 90, 55, 46, 30, 3, 14, 57, 240, 59, 240, 241, 89, 228, 48, + 40, 139, 130, 199, 108, 14, 30, 179, 40, 111, 204, 174, 194, 254, 196, 85, + 85, 98, 144, 149, 72, 3, 76, 33, 126, 5, 128, 112, 172, 100, 251, 129, + 36, 127, 101, 105, 86, 127, 161, 91, 55, 76, 22, 253, 149, 169, 187, 18, + 237, 115, 150, 129, 249, 161, 152, 158, 73, 163, 162, 185, 72, 45, 253, 159, + 145, 41, 145, 240, 98, 16, 87, 151, 168, 209, 11, 30, 130, 36, 27, 194, + 9, 82, 100, 190, 244, 125, 93, 178, 159, 62, 112, 119, 151, 234, 216, 165, + 123, 188, 90, 203, 109, 164, 230, 243, 195, 82, 120, 76, 244, 32, 103, 150, + 63, 47, 79, 45, 62, 226, 141, 168, 40, 59, 141, 172, 75, 128, 117, 51, + 131, 254, 20, 113, 111, 52, 220, 194, 212, 13, 116, 87, 253, 181, 64, 255, + 190, 16, 89, 157, 142, 108, 153, 44, 80, 100, 189, 76, 129, 32, 239, 146, + 107, 116, 149, 186, 186, 90, 109, 147, 159, 168, 220, 251, 247, 99, 201, 150, + 166, 73, 81, 15, 233, 66, 124, 197, 243, 140, 125, 35, 158, 40, 229, 16, + 145, 171, 192, 28, 41, 193, 84, 169, 143, 54, 136, 192, 2, 170, 202, 152, + 75, 132, 253, 81, 10, 72, 125, 8, 232, 239, 177, 136, 129, 161, 54, 0, + 143, 91, 218, 100, 228, 246, 9, 171, 223, 31, 82, 71, 177, 81, 222, 97, + 239, 106, 140, 117, 36, 69, 41, 247, 130, 194, 92, 12, 17, 152, 39, 244, + 187, 44, 34, 175, 153, 89, 85, 235, 112, 92, 147, 31, 34, 32, 2, 244, + 179, 28, 145, 162, 100, 180, 247, 251, 48, 149, 107, 26, 1, 194, 142, 193, + 212, 188, 66, 45, 89, 28, 58, 211, 130, 113, 253, 43, 75, 157, 254, 176, + 153, 23, 102, 245, 62, 76, 132, 189, 18, 174, 102, 226, 145, 171, 139, 135, + 22, 28, 22, 122, 182, 235, 217, 221, 119, 41, 248, 114, 18, 200, 53, 85, + 175, 87, 226, 125, 205, 176, 218, 38, 210, 50, 210, 16, 136, 95, 201, 137, + 32, 186, 218, 94, 93, 203, 160, 109, 175, 53, 119, 101, 37, 151, 100, 155, + 120, 103, 19, 248, 39, 32, 140, 23, 109, 124, 48, 187, 148, 8, 188, 70, + 14, 171, 199, 132, 164, 42, 237, 253, 21, 153, 124, 68, 220, 185, 84, 240, + 107, 149, 235, 77, 186, 99, 119, 4, 36, 43, 126, 35, 189, 226, 99, 120, + 21, 183, 58, 241, 135, 235, 20, 207, 50, 189, 240, 87, 214, 41, 77, 231, + 78, 74, 207, 84, 16, 134, 199, 197, 110, 191, 165, 172, 133, 210, 176, 130, + 66, 54, 142, 110, 120, 207, 118, 66, 80, 190, 98, 138, 84, 228, 94, 141, + 4, 6, 190, 200, 24, 184, 100, 33, 32, 112, 4, 241, 137, 72, 196, 161, + 29, 77, 187, 137, 132, 65, 35, 151, 25, 73, 236, 76, 226, 19, 143, 71, + 79, 140, 252, 144, 249, 111, 195, 27, 187, 96, 187, 4, 66, 36, 75, 138, + 150, 73, 50, 119, 207, 112, 54, 70, 236, 87, 204, 174, 67, 247, 165, 72, + 233, 0, 15, 76, 204, 69, 92, 218, 17, 117, 188, 232, 229, 186, 243, 161, + 230, 94, 28, 98, 38, 65, 159, 131, 217, 218, 111, 140, 107, 190, 253, 54, + 89, 72, 197, 141, 177, 39, 127, 49, 73, 56, 35, 94, 75, 249, 190, 59, + 9, 210, 89, 191, 66, 43, 134, 110, 3, 241, 87, 71, 125, 175, 59, 105, + 204, 163, 69, 157, 10, 103, 11, 91, 251, 200, 194, 78, 38, 253, 112, 69, + 151, 74, 92, 189, 136, 70, 237, 126, 227, 49, 181, 182, 99, 248, 88, 81, + 15, 166, 23, 121, 49, 185, 200, 73, 62, 31, 94, 74, 180, 212, 215, 234, + 196, 96, 231, 87, 172, 234, 224, 75, 12, 15, 72, 206, 172, 138, 176, 130, + 201, 24, 246, 187, 93, 228, 130, 112, 113, 144, 139, 105, 104, 25, 219, 141, + 9, 118, 28, 85, 45, 64, 255, 30, 171, 166, 97, 170, 128, 15, 183, 52, + 172, 113, 154, 98, 176, 113, 74, 212, 52, 120, 50, 67, 39, 193, 232, 124, + 6, 137, 45, 189, 160, 76, 30, 82, 114, 196, 221, 77, 129, 114, 57, 232, + 110, 64, 203, 240, 20, 86, 253, 71, 137, 92, 89, 210, 5, 23, 177, 14, + 244, 158, 146, 156, 124, 48, 37, 223, 96, 151, 157, 159, 185, 198, 6, 6, + 18, 173, 78, 244, 19, 138, 236, 48, 246, 134, 17, 46, 208, 76, 184, 82, + 67, 44, 91, 66, 110, 226, 174, 11, 227, 109, 10, 6, 46, 8, 73, 187, + 74, 46, 210, 45, 81, 200, 89, 89, 226, 105, 48, 177, 36, 63, 56, 197, + 87, 232, 97, 196, 228, 151, 15, 20, 32, 57, 173, 200, 144, 190, 6, 141, + 142, 128, 112, 28, 68, 84, 64, 149, 95, 203, 41, 84, 74, 251, 67, 68, + 236, 39, 152, 105, 63, 16, 40, 17, 218, 143, 224, 128, 252, 195, 234, 146, + 8, 60, 27, 244, 217, 40, 51, 154, 212, 105, 16, 117, 18, 169, 165, 79, + 134, 111, 101, 192, 100, 205, 50, 240, 184, 27, 212, 149, 4, 131, 251, 15, + 67, 37, 157, 91, 67, 40, 124, 3, 253, 0, 127, 211, 136, 206, 114, 17, + 127, 107, 223, 12, 124, 210, 100, 252, 109, 36, 191, 132, 9, 242, 84, 168, + 184, 70, 192, 191, 190, 41, 232, 45, 242, 27, 121, 206, 227, 140, 136, 78, + 94, 163, 9, 76, 163, 70, 223, 243, 251, 93, 223, 166, 106, 169, 136, 40, + 236, 190, 210, 205, 111, 248, 123, 126, 101, 92, 24, 106, 21, 101, 111, 146, + 67, 68, 209, 140, 73, 61, 67, 55, 192, 80, 50, 236, 158, 184, 111, 82, + 88, 198, 79, 176, 93, 114, 39, 193, 49, 140, 0, 74, 17, 121, 18, 156, + 141, 148, 230, 156, 92, 79, 35, 198, 212, 231, 37, 21, 52, 137, 195, 21, + 185, 193, 101, 255, 145, 197, 131, 194, 143, 151, 44, 151, 165, 122, 202, 12, + 204, 61, 192, 111, 71, 232, 118, 86, 60, 110, 119, 157, 112, 167, 12, 113, + 71, 9, 83, 13, 9, 8, 176, 103, 52, 188, 129, 3, 214, 152, 255, 100, + 246, 172, 10, 106, 112, 225, 29, 1, 92, 9, 41, 58, 147, 232, 171, 80, + 59, 244, 93, 125, 156, 213, 183, 249, 131, 254, 40, 25, 12, 1, 47, 41, + 57, 127, 176, 52, 97, 137, 255, 129, 134, 200, 138, 201, 53, 200, 19, 37, + 247, 84, 113, 50, 190, 141, 123, 189, 59, 218, 117, 247, 92, 150, 220, 207, + 71, 0, 228, 121, 129, 220, 221, 103, 241, 242, 62, 203, 221, 81, 70, 40, + 27, 245, 245, 61, 68, 128, 42, 172, 101, 115, 240, 59, 155, 207, 210, 102, + 123, 228, 212, 155, 141, 167, 28, 218, 35, 183, 9, 252, 72, 58, 193, 210, + 101, 255, 234, 254, 250, 59, 243, 49, 236, 227, 112, 83, 14, 56, 33, 58, + 17, 81, 91, 201, 113, 57, 143, 190, 81, 218, 247, 255, 197, 185, 56, 5, + 190, 167, 107, 127, 68, 55, 236, 63, 154, 139, 4, 203, 215, 135, 141, 135, + 116, 55, 155, 141, 97, 207, 199, 244, 120, 137, 95, 92, 6, 125, 158, 194, + 135, 135, 9, 69, 12, 11, 254, 75, 179, 115, 227, 131, 115, 243, 3, 157, + 247, 119, 38, 102, 216, 225, 216, 43, 244, 162, 234, 255, 159, 154, 161, 212, + 102, 240, 48, 238, 71, 138, 47, 209, 251, 171, 66, 138, 32, 198, 7, 100, + 60, 97, 94, 75, 242, 175, 32, 15, 167, 54, 26, 167, 139, 166, 129, 145, + 226, 167, 178, 156, 228, 227, 101, 179, 204, 158, 255, 72, 47, 41, 241, 200, + 176, 63, 26, 39, 24, 92, 202, 27, 20, 81, 205, 45, 5, 25, 62, 251, + 146, 14, 153, 127, 137, 251, 35, 137, 45, 27, 43, 51, 147, 194, 121, 34, + 51, 144, 241, 23, 110, 30, 5, 42, 12, 97, 252, 133, 155, 201, 97, 160, + 26, 197, 140, 2, 181, 32, 102, 102, 166, 132, 129, 122, 20, 51, 10, 44, + 70, 121, 170, 97, 160, 17, 197, 140, 2, 205, 48, 207, 4, 220, 169, 80, + 80, 21, 163, 104, 192, 58, 236, 206, 91, 125, 111, 3, 14, 188, 105, 55, + 97, 185, 25, 236, 110, 115, 248, 153, 1, 247, 57, 71, 93, 210, 2, 81, + 177, 207, 140, 218, 168, 199, 136, 215, 117, 192, 230, 185, 165, 18, 13, 22, + 160, 35, 84, 226, 30, 105, 38, 101, 249, 181, 121, 33, 11, 153, 101, 243, + 34, 44, 243, 185, 154, 101, 111, 235, 240, 54, 35, 111, 16, 9, 29, 37, + 201, 10, 77, 34, 7, 73, 100, 150, 68, 201, 178, 55, 146, 132, 188, 65, + 36, 212, 67, 154, 21, 160, 32, 136, 4, 105, 201, 211, 58, 113, 202, 43, + 160, 107, 62, 228, 181, 176, 118, 242, 138, 218, 205, 37, 153, 20, 53, 199, + 218, 205, 88, 13, 176, 40, 200, 150, 189, 97, 81, 115, 57, 168, 235, 183, + 204, 92, 165, 181, 131, 250, 179, 36, 42, 75, 66, 235, 163, 178, 36, 180, + 174, 42, 169, 221, 188, 0, 5, 65, 36, 72, 75, 158, 214, 137, 67, 224, + 176, 118, 51, 162, 84, 85, 122, 158, 174, 35, 140, 60, 193, 215, 159, 179, + 160, 54, 4, 81, 176, 101, 42, 154, 46, 161, 172, 81, 9, 112, 246, 51, + 141, 26, 3, 218, 39, 31, 243, 98, 78, 86, 95, 184, 81, 141, 33, 238, + 199, 3, 167, 48, 79, 208, 99, 59, 215, 134, 135, 54, 222, 203, 67, 111, + 124, 97, 189, 65, 134, 93, 112, 133, 106, 201, 93, 99, 102, 68, 249, 66, + 110, 170, 124, 187, 9, 3, 100, 8, 104, 43, 223, 32, 65, 3, 78, 82, + 2, 124, 44, 228, 104, 189, 249, 234, 122, 174, 81, 43, 220, 172, 231, 70, + 53, 1, 226, 20, 114, 243, 48, 124, 84, 227, 111, 240, 107, 62, 255, 133, + 46, 44, 162, 88, 74, 230, 10, 183, 84, 254, 12, 58, 228, 11, 115, 240, + 142, 190, 223, 150, 34, 204, 131, 8, 76, 167, 64, 38, 218, 168, 175, 230, + 6, 51, 160, 240, 63, 200, 81, 249, 15, 234, 215, 142, 138, 100, 10, 7, + 255, 81, 229, 226, 217, 5, 214, 0, 197, 239, 10, 23, 250, 165, 35, 242, + 34, 32, 86, 136, 197, 45, 235, 97, 177, 25, 62, 22, 67, 14, 62, 109, + 132, 180, 77, 5, 166, 32, 32, 92, 193, 213, 71, 240, 30, 58, 84, 34, + 187, 67, 68, 13, 19, 57, 202, 193, 173, 73, 242, 200, 74, 201, 105, 210, + 37, 220, 167, 156, 108, 112, 17, 169, 205, 173, 211, 195, 8, 163, 49, 72, + 98, 34, 12, 239, 200, 237, 124, 17, 126, 12, 248, 49, 17, 13, 91, 141, + 156, 23, 98, 153, 31, 79, 74, 156, 26, 178, 255, 226, 190, 45, 241, 6, + 15, 54, 199, 224, 144, 248, 138, 57, 217, 104, 86, 66, 105, 220, 122, 112, + 35, 5, 43, 107, 142, 72, 247, 177, 144, 12, 79, 44, 59, 115, 163, 25, + 177, 234, 204, 141, 230, 161, 69, 167, 202, 213, 137, 6, 143, 246, 153, 93, + 137, 213, 107, 93, 148, 148, 80, 221, 92, 170, 220, 99, 20, 172, 151, 208, + 204, 67, 194, 94, 102, 104, 254, 84, 138, 21, 4, 43, 137, 224, 128, 105, + 9, 89, 22, 100, 227, 23, 228, 30, 34, 167, 194, 194, 70, 229, 106, 246, + 151, 234, 21, 167, 159, 51, 17, 139, 17, 28, 25, 75, 192, 151, 200, 34, + 222, 54, 143, 200, 21, 7, 145, 99, 224, 132, 148, 11, 196, 67, 226, 76, + 156, 22, 208, 253, 233, 159, 220, 16, 47, 89, 208, 17, 110, 240, 158, 255, + 179, 6, 41, 135, 176, 192, 253, 210, 51, 138, 96, 93, 116, 208, 11, 4, + 68, 112, 145, 6, 11, 232, 144, 94, 160, 97, 148, 232, 173, 73, 36, 12, + 58, 175, 1, 39, 114, 31, 106, 235, 243, 232, 32, 55, 234, 230, 224, 126, + 60, 152, 100, 40, 73, 144, 227, 3, 145, 25, 146, 230, 98, 199, 179, 126, + 167, 110, 250, 98, 126, 90, 50, 110, 208, 142, 96, 123, 83, 57, 167, 65, + 187, 29, 246, 8, 89, 123, 97, 86, 19, 176, 239, 177, 73, 79, 88, 224, + 13, 214, 37, 255, 79, 236, 7, 138, 239, 76, 218, 160, 16, 30, 143, 246, + 67, 228, 234, 129, 246, 64, 160, 97, 196, 7, 138, 255, 97, 75, 136, 8, + 196, 64, 185, 20, 17, 60, 49, 1, 58, 181, 144, 52, 243, 129, 141, 36, + 46, 17, 66, 193, 67, 103, 130, 184, 49, 233, 159, 81, 109, 141, 190, 227, + 174, 84, 252, 28, 56, 97, 230, 196, 13, 174, 64, 184, 216, 13, 226, 248, + 132, 120, 196, 136, 223, 167, 166, 47, 242, 113, 233, 57, 147, 197, 98, 21, + 98, 120, 122, 209, 225, 150, 149, 94, 118, 100, 247, 138, 229, 2, 203, 79, + 128, 165, 39, 160, 182, 156, 249, 178, 170, 180, 192, 179, 246, 82, 113, 184, + 44, 208, 167, 75, 96, 42, 138, 207, 184, 92, 2, 215, 209, 203, 74, 71, + 161, 154, 81, 223, 113, 80, 169, 118, 109, 202, 188, 24, 82, 163, 181, 232, + 227, 156, 120, 16, 102, 110, 13, 225, 163, 22, 126, 116, 30, 186, 54, 81, + 212, 86, 254, 228, 244, 40, 112, 72, 244, 32, 72, 104, 49, 10, 157, 12, + 104, 144, 17, 5, 49, 135, 33, 36, 216, 164, 142, 37, 81, 61, 8, 43, + 68, 61, 74, 206, 233, 219, 28, 190, 125, 151, 126, 174, 205, 214, 75, 5, + 90, 102, 254, 107, 102, 246, 163, 132, 181, 133, 80, 226, 13, 187, 128, 66, + 90, 252, 97, 229, 175, 19, 77, 35, 210, 30, 100, 118, 48, 249, 156, 36, + 159, 12, 32, 241, 252, 71, 169, 77, 18, 207, 137, 239, 236, 88, 98, 90, + 167, 245, 181, 121, 208, 96, 234, 169, 26, 38, 62, 240, 15, 192, 231, 196, + 189, 35, 167, 199, 229, 141, 115, 220, 116, 36, 180, 71, 161, 25, 125, 122, + 60, 97, 51, 153, 54, 133, 118, 51, 114, 21, 245, 17, 87, 162, 220, 116, + 32, 180, 7, 97, 154, 160, 136, 28, 60, 228, 218, 163, 251, 117, 120, 26, + 192, 211, 224, 94, 132, 167, 38, 60, 53, 33, 86, 163, 223, 31, 54, 33, + 26, 116, 107, 105, 45, 140, 81, 8, 83, 229, 33, 25, 10, 100, 239, 63, + 127, 67, 67, 110, 180, 213, 230, 195, 143, 176, 30, 130, 195, 121, 112, 204, + 79, 30, 37, 114, 22, 156, 251, 27, 99, 162, 123, 13, 107, 148, 22, 70, + 246, 89, 182, 156, 80, 129, 34, 19, 70, 9, 99, 172, 112, 6, 253, 122, + 172, 21, 174, 128, 87, 12, 201, 0, 14, 248, 99, 170, 8, 66, 57, 162, + 216, 152, 196, 43, 173, 113, 201, 248, 27, 204, 25, 7, 221, 140, 159, 53, + 212, 91, 37, 251, 240, 179, 89, 0, 6, 52, 19, 113, 28, 132, 204, 198, + 239, 175, 18, 132, 155, 235, 133, 17, 165, 192, 171, 15, 106, 252, 38, 43, + 247, 118, 89, 12, 225, 62, 145, 36, 238, 254, 227, 111, 229, 21, 101, 52, + 30, 219, 67, 143, 245, 139, 146, 229, 254, 253, 111, 56, 6, 124, 194, 93, + 59, 212, 137, 226, 146, 81, 137, 147, 154, 88, 35, 94, 137, 71, 4, 132, + 16, 23, 137, 56, 139, 207, 37, 155, 64, 162, 37, 29, 152, 164, 74, 162, + 110, 208, 228, 240, 11, 42, 231, 50, 161, 64, 116, 182, 93, 176, 65, 82, + 25, 219, 4, 188, 9, 243, 182, 9, 251, 171, 64, 126, 200, 230, 168, 191, + 80, 58, 172, 47, 49, 63, 197, 248, 46, 28, 164, 13, 201, 47, 81, 69, + 78, 241, 132, 180, 158, 100, 223, 8, 187, 158, 190, 81, 43, 64, 118, 145, + 18, 99, 200, 208, 201, 12, 110, 160, 22, 108, 99, 50, 159, 179, 242, 212, + 209, 140, 140, 59, 155, 252, 57, 209, 51, 76, 33, 228, 253, 109, 100, 21, + 239, 150, 92, 130, 129, 80, 40, 224, 133, 224, 204, 244, 127, 122, 227, 231, + 190, 227, 213, 146, 79, 166, 43, 25, 179, 160, 39, 229, 140, 235, 145, 233, + 249, 48, 104, 218, 129, 16, 40, 168, 169, 158, 84, 254, 231, 98, 190, 68, + 250, 221, 230, 195, 160, 221, 31, 35, 100, 130, 239, 182, 60, 123, 60, 182, + 217, 212, 224, 194, 111, 196, 218, 173, 223, 173, 13, 251, 110, 51, 25, 207, + 196, 225, 227, 194, 111, 212, 142, 28, 248, 246, 1, 49, 156, 66, 103, 65, + 9, 62, 155, 11, 28, 243, 25, 164, 251, 32, 219, 241, 196, 163, 218, 23, + 236, 129, 185, 173, 6, 218, 250, 172, 10, 218, 203, 253, 231, 23, 230, 117, + 15, 35, 135, 5, 199, 71, 143, 25, 63, 38, 204, 107, 146, 150, 238, 25, + 98, 40, 24, 36, 222, 8, 154, 135, 6, 173, 188, 211, 224, 112, 5, 27, + 47, 145, 229, 217, 10, 6, 164, 94, 243, 154, 131, 149, 110, 204, 87, 121, + 167, 33, 46, 135, 130, 20, 236, 192, 17, 152, 34, 175, 182, 177, 15, 98, + 191, 239, 247, 40, 204, 118, 201, 111, 11, 68, 174, 205, 31, 28, 103, 28, + 174, 99, 46, 22, 72, 22, 64, 127, 50, 116, 237, 97, 96, 230, 145, 123, + 86, 74, 204, 249, 165, 146, 186, 2, 34, 231, 52, 84, 181, 42, 101, 247, + 143, 15, 182, 247, 246, 46, 179, 25, 23, 142, 225, 168, 184, 155, 115, 191, + 67, 227, 61, 23, 214, 134, 139, 222, 183, 188, 30, 62, 9, 30, 228, 52, + 122, 112, 161, 168, 18, 242, 145, 253, 238, 164, 231, 141, 238, 114, 46, 227, + 35, 187, 27, 28, 100, 40, 244, 36, 225, 88, 18, 122, 178, 112, 44, 151, + 114, 207, 147, 191, 184, 231, 241, 203, 11, 66, 70, 220, 125, 201, 193, 247, + 47, 247, 165, 18, 121, 112, 27, 95, 184, 32, 59, 188, 44, 229, 250, 158, + 83, 115, 187, 180, 215, 152, 67, 225, 79, 57, 22, 131, 227, 135, 253, 233, + 127, 167, 44, 101, 69, 89, 236, 184, 21, 22, 151, 121, 163, 184, 15, 23, + 164, 190, 210, 168, 160, 16, 56, 113, 71, 253, 25, 52, 208, 99, 69, 102, + 130, 34, 255, 86, 219, 210, 69, 102, 130, 43, 197, 84, 243, 186, 216, 180, + 12, 60, 145, 101, 13, 44, 58, 242, 232, 221, 126, 11, 254, 198, 187, 244, + 249, 206, 237, 253, 67, 18, 220, 99, 252, 213, 251, 135, 140, 79, 192, 180, + 192, 193, 51, 216, 139, 67, 133, 101, 114, 147, 190, 246, 204, 106, 36, 228, + 32, 155, 28, 228, 147, 131, 140, 114, 199, 242, 23, 56, 20, 228, 185, 249, + 6, 250, 191, 9, 132, 42, 184, 69, 190, 147, 0, 157, 74, 209, 203, 212, + 116, 60, 246, 61, 208, 203, 153, 39, 98, 196, 115, 72, 120, 246, 246, 122, + 92, 206, 99, 190, 168, 194, 43, 223, 112, 52, 100, 46, 62, 165, 81, 136, + 226, 10, 211, 2, 158, 52, 72, 192, 76, 8, 44, 183, 195, 20, 8, 188, + 52, 141, 71, 111, 71, 209, 231, 36, 58, 110, 239, 52, 138, 64, 134, 54, + 138, 134, 245, 193, 97, 16, 232, 26, 187, 231, 208, 25, 23, 199, 154, 71, + 143, 246, 172, 37, 104, 53, 128, 223, 10, 248, 75, 230, 220, 112, 216, 66, + 205, 22, 108, 15, 14, 49, 143, 219, 219, 247, 128, 9, 97, 213, 252, 161, + 252, 148, 191, 66, 121, 225, 214, 75, 73, 68, 82, 30, 179, 146, 60, 52, + 25, 81, 137, 108, 196, 66, 242, 146, 89, 14, 99, 118, 99, 241, 157, 167, + 214, 5, 130, 76, 175, 162, 70, 148, 100, 17, 27, 71, 188, 51, 226, 164, + 76, 26, 106, 40, 229, 83, 149, 84, 235, 89, 3, 250, 69, 220, 49, 65, + 109, 237, 225, 56, 200, 140, 136, 213, 19, 74, 7, 20, 147, 102, 104, 183, + 220, 209, 24, 47, 196, 250, 30, 156, 92, 220, 38, 189, 183, 217, 64, 86, + 142, 24, 86, 169, 1, 207, 197, 226, 165, 34, 49, 38, 49, 94, 241, 36, + 131, 149, 104, 18, 189, 215, 149, 232, 166, 242, 96, 55, 91, 246, 136, 131, + 82, 50, 203, 245, 13, 55, 21, 98, 198, 244, 9, 54, 122, 20, 182, 161, + 198, 215, 143, 23, 162, 248, 69, 180, 197, 162, 205, 130, 100, 200, 236, 187, + 161, 204, 46, 27, 165, 96, 43, 172, 101, 208, 225, 211, 18, 88, 83, 186, + 7, 31, 90, 245, 7, 103, 218, 36, 158, 29, 57, 145, 203, 157, 144, 144, + 58, 13, 65, 175, 145, 236, 123, 52, 52, 153, 112, 105, 46, 109, 130, 109, + 28, 215, 200, 14, 149, 144, 205, 180, 147, 77, 153, 172, 137, 119, 83, 194, + 67, 183, 182, 148, 5, 171, 80, 253, 239, 85, 40, 180, 128, 252, 219, 21, + 130, 42, 68, 245, 89, 149, 69, 224, 204, 55, 26, 220, 21, 195, 72, 16, + 222, 152, 182, 31, 199, 152, 69, 159, 152, 245, 198, 18, 6, 84, 8, 151, + 89, 15, 181, 166, 151, 133, 171, 192, 198, 166, 24, 6, 146, 220, 169, 53, + 237, 96, 240, 105, 47, 140, 39, 192, 217, 67, 213, 18, 171, 73, 139, 198, + 218, 136, 232, 113, 36, 3, 146, 5, 88, 158, 114, 54, 242, 110, 22, 229, + 14, 229, 18, 45, 33, 228, 165, 241, 252, 21, 79, 164, 18, 170, 185, 193, + 61, 23, 160, 181, 5, 5, 133, 25, 196, 91, 30, 121, 94, 3, 54, 92, + 205, 163, 26, 56, 49, 157, 163, 175, 235, 244, 35, 17, 95, 33, 177, 251, + 132, 164, 142, 138, 58, 97, 194, 7, 55, 201, 76, 192, 72, 161, 196, 228, + 128, 78, 194, 155, 235, 192, 38, 65, 29, 187, 70, 53, 100, 203, 147, 236, + 159, 225, 4, 54, 66, 93, 198, 100, 115, 100, 224, 125, 18, 237, 174, 149, + 114, 50, 94, 141, 40, 223, 184, 25, 181, 115, 70, 27, 219, 57, 53, 107, + 206, 103, 83, 201, 149, 84, 114, 137, 43, 17, 141, 247, 53, 56, 116, 200, + 121, 180, 15, 252, 76, 76, 11, 131, 23, 100, 192, 198, 212, 165, 172, 156, + 202, 74, 253, 15, 178, 34, 122, 233, 8, 133, 193, 19, 233, 44, 236, 76, + 163, 141, 84, 246, 90, 186, 161, 107, 107, 179, 194, 116, 29, 115, 199, 51, + 8, 140, 196, 188, 208, 94, 199, 252, 201, 107, 254, 243, 154, 180, 161, 172, + 79, 215, 33, 76, 222, 144, 72, 206, 8, 182, 21, 230, 217, 179, 155, 84, + 13, 38, 70, 53, 226, 95, 18, 180, 35, 72, 52, 178, 107, 189, 174, 77, + 185, 102, 63, 74, 169, 101, 168, 226, 0, 108, 88, 67, 242, 59, 86, 81, + 66, 164, 98, 60, 54, 85, 90, 72, 232, 44, 224, 42, 69, 161, 179, 235, + 140, 201, 130, 37, 236, 15, 170, 0, 16, 217, 34, 23, 222, 65, 232, 25, + 62, 85, 13, 118, 182, 128, 35, 73, 106, 127, 96, 2, 147, 200, 255, 59, + 23, 234, 144, 133, 71, 41, 202, 19, 188, 158, 99, 140, 64, 81, 196, 161, + 100, 212, 180, 43, 209, 100, 54, 228, 206, 156, 30, 136, 232, 25, 228, 107, + 6, 87, 46, 52, 189, 54, 108, 253, 133, 14, 210, 101, 161, 214, 108, 10, + 148, 24, 192, 25, 64, 96, 228, 95, 128, 227, 47, 252, 130, 85, 47, 52, + 38, 163, 113, 191, 7, 59, 238, 176, 55, 233, 214, 132, 38, 108, 191, 182, + 39, 160, 6, 183, 61, 180, 97, 226, 192, 163, 239, 54, 225, 79, 31, 136, + 142, 64, 40, 143, 96, 207, 26, 93, 98, 203, 32, 56, 67, 219, 94, 216, + 2, 81, 214, 176, 103, 227, 97, 173, 49, 22, 34, 205, 13, 120, 68, 48, + 14, 84, 104, 37, 166, 87, 228, 169, 231, 206, 132, 54, 148, 142, 70, 207, + 67, 100, 58, 208, 163, 164, 64, 190, 219, 236, 175, 7, 173, 19, 40, 246, + 8, 169, 35, 125, 164, 89, 132, 208, 56, 2, 81, 218, 30, 116, 231, 130, + 103, 183, 104, 38, 253, 161, 192, 204, 186, 132, 129, 235, 209, 248, 67, 187, + 9, 63, 14, 162, 33, 8, 163, 26, 16, 58, 26, 149, 130, 157, 12, 161, + 43, 107, 179, 196, 139, 20, 123, 115, 189, 196, 75, 240, 137, 245, 97, 2, + 47, 133, 190, 209, 89, 29, 127, 14, 62, 4, 89, 69, 217, 132, 5, 211, + 66, 251, 206, 152, 180, 21, 31, 104, 95, 135, 150, 178, 2, 3, 53, 129, + 149, 220, 27, 8, 48, 199, 104, 63, 251, 53, 28, 196, 200, 176, 77, 152, + 245, 135, 47, 153, 30, 151, 101, 243, 36, 57, 178, 176, 178, 157, 13, 238, + 175, 44, 218, 171, 186, 255, 144, 208, 102, 249, 27, 87, 39, 47, 50, 125, + 65, 168, 193, 198, 100, 188, 182, 150, 211, 243, 228, 30, 246, 175, 44, 69, + 5, 64, 204, 27, 238, 237, 77, 42, 60, 5, 231, 112, 2, 226, 189, 208, + 231, 151, 165, 141, 19, 17, 115, 152, 159, 201, 79, 63, 100, 182, 95, 5, + 43, 57, 150, 144, 184, 5, 167, 248, 62, 44, 153, 178, 156, 140, 113, 87, + 177, 84, 114, 112, 123, 57, 233, 113, 43, 187, 32, 90, 66, 203, 171, 138, + 203, 101, 215, 179, 76, 145, 44, 169, 193, 194, 197, 213, 39, 201, 238, 56, + 74, 29, 133, 3, 28, 165, 15, 233, 83, 193, 4, 120, 192, 249, 20, 24, + 21, 32, 241, 68, 3, 180, 64, 108, 203, 74, 96, 234, 125, 65, 236, 4, + 188, 14, 171, 38, 230, 92, 155, 140, 251, 104, 181, 27, 227, 97, 87, 168, + 51, 209, 60, 223, 16, 126, 243, 233, 6, 50, 36, 17, 226, 74, 124, 197, + 173, 37, 199, 40, 204, 179, 204, 127, 250, 132, 236, 102, 246, 20, 153, 94, + 175, 214, 205, 10, 89, 4, 10, 165, 56, 159, 154, 42, 24, 76, 239, 40, + 86, 171, 87, 53, 135, 2, 41, 204, 91, 26, 68, 184, 75, 69, 12, 48, + 97, 97, 190, 43, 175, 113, 48, 239, 159, 7, 106, 220, 2, 56, 222, 72, + 62, 247, 188, 214, 36, 87, 40, 176, 155, 190, 4, 183, 171, 35, 110, 145, + 42, 57, 117, 206, 249, 143, 106, 240, 200, 60, 37, 3, 47, 77, 52, 143, + 226, 141, 79, 75, 146, 105, 175, 133, 55, 212, 73, 143, 171, 50, 57, 106, + 204, 30, 122, 253, 225, 160, 157, 236, 162, 55, 78, 60, 108, 238, 146, 68, + 145, 78, 41, 173, 71, 119, 158, 48, 140, 137, 80, 62, 212, 210, 75, 118, + 73, 35, 123, 42, 81, 108, 57, 137, 128, 203, 209, 228, 36, 229, 8, 143, + 113, 106, 86, 136, 118, 61, 129, 97, 31, 8, 56, 139, 144, 199, 211, 9, + 230, 171, 46, 20, 243, 148, 177, 51, 233, 113, 115, 45, 103, 177, 133, 111, + 126, 2, 142, 11, 136, 14, 129, 5, 161, 231, 148, 80, 214, 76, 174, 32, + 224, 148, 106, 253, 204, 153, 60, 176, 42, 74, 33, 103, 18, 53, 112, 2, + 209, 121, 82, 64, 205, 185, 175, 57, 243, 37, 184, 213, 36, 187, 63, 73, + 148, 137, 123, 105, 151, 169, 147, 119, 89, 231, 70, 238, 162, 148, 155, 194, + 161, 185, 205, 240, 117, 72, 64, 56, 138, 228, 160, 200, 161, 69, 104, 48, + 158, 164, 25, 57, 4, 157, 14, 91, 17, 158, 88, 221, 204, 52, 76, 139, + 200, 123, 236, 185, 253, 66, 253, 235, 70, 205, 104, 204, 104, 27, 138, 60, + 117, 60, 93, 92, 110, 67, 17, 242, 157, 211, 88, 6, 198, 146, 11, 57, + 99, 57, 150, 241, 66, 165, 128, 246, 56, 201, 253, 16, 240, 226, 181, 220, + 180, 48, 133, 52, 13, 212, 35, 32, 239, 237, 2, 154, 192, 54, 230, 47, + 43, 76, 161, 211, 147, 224, 109, 61, 200, 165, 41, 67, 104, 234, 255, 76, + 179, 49, 56, 147, 210, 62, 143, 245, 126, 38, 57, 250, 172, 244, 255, 102, + 231, 193, 216, 210, 178, 226, 203, 21, 58, 12, 126, 230, 153, 255, 67, 26, + 150, 153, 143, 208, 199, 183, 232, 34, 112, 164, 143, 177, 37, 106, 226, 10, + 165, 219, 196, 210, 229, 12, 163, 226, 94, 15, 86, 170, 247, 194, 37, 55, + 40, 138, 47, 247, 130, 237, 132, 211, 194, 191, 254, 5, 251, 205, 11, 194, + 49, 19, 197, 76, 216, 98, 217, 77, 76, 116, 143, 81, 140, 44, 83, 66, + 45, 130, 80, 255, 31, 142, 126, 207, 119, 83, 94, 17, 218, 60, 217, 15, + 238, 95, 130, 214, 3, 107, 143, 162, 56, 225, 121, 250, 15, 233, 199, 244, + 39, 80, 194, 175, 18, 10, 133, 81, 152, 38, 197, 155, 230, 178, 219, 146, + 0, 16, 40, 106, 70, 178, 226, 172, 77, 185, 31, 88, 253, 64, 149, 248, + 249, 95, 221, 254, 212, 30, 54, 106, 35, 123, 237, 238, 75, 238, 25, 191, + 191, 124, 185, 207, 255, 139, 65, 4, 52, 164, 82, 118, 154, 229, 26, 114, + 41, 219, 134, 63, 74, 41, 27, 92, 218, 192, 155, 10, 223, 214, 49, 88, + 43, 101, 189, 108, 134, 244, 48, 146, 199, 231, 70, 78, 198, 211, 19, 185, + 166, 197, 190, 34, 200, 73, 65, 197, 168, 166, 12, 176, 20, 216, 153, 64, + 184, 196, 86, 207, 109, 144, 225, 217, 24, 207, 198, 64, 5, 127, 132, 159, + 73, 77, 33, 177, 59, 194, 16, 168, 224, 179, 152, 11, 190, 97, 45, 41, + 241, 169, 19, 72, 48, 56, 252, 7, 71, 148, 79, 30, 33, 55, 65, 204, + 124, 148, 223, 114, 113, 28, 145, 8, 222, 7, 131, 79, 83, 210, 170, 231, + 69, 37, 3, 171, 134, 82, 96, 148, 22, 9, 193, 135, 23, 110, 78, 195, + 149, 84, 120, 102, 237, 75, 246, 160, 7, 236, 110, 92, 253, 154, 91, 203, + 178, 142, 205, 230, 191, 162, 50, 165, 144, 155, 255, 229, 125, 201, 83, 226, + 138, 206, 201, 251, 48, 92, 97, 151, 12, 123, 161, 108, 17, 70, 155, 104, + 104, 175, 237, 127, 57, 62, 216, 230, 176, 210, 174, 215, 202, 11, 168, 157, + 141, 138, 129, 20, 70, 144, 90, 183, 228, 67, 230, 140, 113, 60, 140, 45, + 195, 68, 105, 53, 176, 79, 177, 221, 56, 14, 120, 10, 117, 232, 218, 205, + 136, 151, 133, 136, 44, 8, 41, 97, 142, 62, 243, 48, 230, 47, 201, 101, + 181, 108, 5, 37, 101, 40, 11, 135, 113, 163, 219, 79, 162, 18, 64, 32, + 78, 97, 105, 16, 201, 235, 20, 237, 120, 240, 218, 153, 172, 10, 98, 46, + 177, 71, 74, 129, 142, 98, 52, 16, 40, 204, 58, 43, 90, 204, 97, 174, + 121, 56, 194, 19, 232, 84, 45, 190, 217, 103, 112, 177, 32, 191, 48, 129, + 148, 48, 255, 158, 115, 10, 252, 168, 240, 163, 189, 100, 33, 68, 127, 121, + 200, 162, 204, 15, 222, 158, 129, 212, 197, 94, 12, 136, 99, 190, 100, 25, + 188, 92, 255, 145, 93, 216, 166, 8, 2, 69, 150, 124, 246, 94, 104, 23, + 42, 69, 182, 241, 234, 40, 41, 134, 147, 227, 195, 108, 78, 20, 218, 241, + 90, 128, 208, 0, 57, 0, 159, 139, 190, 39, 63, 19, 146, 144, 188, 230, + 226, 187, 27, 153, 58, 2, 122, 16, 194, 241, 163, 132, 86, 169, 20, 74, + 144, 152, 149, 209, 224, 79, 24, 204, 1, 205, 135, 129, 19, 96, 216, 80, + 34, 89, 164, 218, 118, 68, 124, 68, 96, 226, 219, 66, 200, 10, 177, 203, + 124, 6, 188, 244, 159, 230, 17, 175, 14, 188, 254, 224, 158, 45, 107, 195, + 178, 10, 244, 154, 120, 3, 111, 138, 21, 24, 161, 76, 32, 87, 225, 112, + 66, 104, 25, 224, 84, 16, 137, 25, 126, 228, 63, 200, 168, 48, 195, 47, + 153, 131, 141, 70, 133, 16, 13, 126, 116, 248, 41, 198, 174, 15, 102, 72, + 30, 115, 50, 229, 148, 161, 78, 129, 137, 30, 97, 72, 54, 54, 32, 169, + 2, 153, 41, 10, 252, 64, 22, 138, 150, 199, 204, 12, 200, 196, 132, 31, + 40, 78, 145, 242, 28, 19, 122, 249, 193, 165, 5, 34, 166, 221, 81, 223, + 16, 144, 127, 175, 70, 21, 41, 233, 201, 40, 126, 83, 81, 163, 92, 103, + 35, 184, 173, 160, 99, 198, 141, 218, 67, 215, 123, 36, 99, 25, 176, 69, + 138, 78, 101, 143, 169, 115, 5, 153, 73, 239, 152, 69, 208, 217, 150, 91, + 199, 146, 157, 126, 159, 112, 37, 68, 46, 192, 248, 207, 100, 150, 100, 91, + 83, 150, 24, 108, 58, 131, 98, 60, 174, 64, 55, 131, 180, 21, 66, 164, + 183, 25, 238, 153, 204, 210, 57, 189, 111, 98, 89, 168, 171, 175, 132, 60, + 242, 8, 142, 210, 37, 52, 215, 196, 191, 228, 92, 70, 138, 65, 245, 191, + 55, 76, 102, 128, 231, 141, 225, 37, 15, 253, 132, 77, 34, 170, 60, 66, + 110, 176, 197, 230, 48, 119, 96, 56, 48, 243, 2, 121, 33, 92, 7, 177, + 80, 132, 18, 224, 93, 94, 29, 105, 13, 207, 214, 121, 22, 17, 239, 107, + 121, 151, 24, 126, 231, 48, 95, 1, 127, 203, 76, 232, 185, 78, 45, 97, + 81, 233, 78, 139, 169, 214, 209, 237, 35, 21, 72, 103, 8, 51, 37, 200, + 68, 38, 223, 92, 218, 68, 43, 222, 71, 201, 3, 115, 162, 247, 8, 248, + 42, 240, 76, 148, 117, 251, 196, 180, 219, 232, 83, 136, 43, 253, 31, 141, + 23, 17, 81, 78, 134, 75, 96, 184, 168, 180, 21, 121, 62, 161, 70, 180, + 177, 203, 40, 68, 69, 38, 23, 160, 84, 104, 220, 134, 30, 36, 11, 78, + 161, 42, 41, 203, 71, 49, 210, 85, 234, 231, 76, 135, 172, 153, 103, 202, + 41, 139, 10, 17, 78, 35, 147, 140, 50, 83, 34, 97, 8, 139, 8, 250, + 81, 201, 36, 48, 133, 16, 41, 55, 41, 118, 167, 181, 15, 172, 107, 201, + 43, 213, 38, 200, 210, 61, 37, 136, 244, 254, 69, 62, 77, 186, 100, 94, + 210, 232, 123, 227, 33, 90, 170, 140, 166, 189, 143, 105, 27, 196, 166, 46, + 211, 66, 38, 22, 239, 179, 57, 185, 37, 68, 29, 157, 72, 246, 67, 4, + 108, 68, 29, 148, 232, 0, 51, 81, 79, 36, 214, 195, 27, 176, 149, 10, + 10, 113, 149, 142, 175, 153, 117, 228, 19, 121, 130, 227, 20, 170, 100, 60, + 163, 212, 9, 118, 47, 116, 208, 99, 193, 76, 14, 163, 100, 18, 234, 32, + 9, 245, 235, 80, 29, 164, 24, 168, 131, 196, 226, 170, 205, 101, 208, 100, + 106, 253, 155, 140, 4, 100, 233, 181, 170, 170, 205, 215, 8, 219, 119, 170, + 199, 44, 171, 220, 234, 12, 137, 185, 247, 170, 79, 105, 53, 145, 4, 61, + 93, 78, 240, 53, 51, 232, 195, 161, 9, 158, 8, 179, 204, 13, 85, 188, + 211, 96, 58, 183, 244, 141, 96, 199, 224, 221, 40, 123, 35, 234, 247, 106, + 102, 2, 167, 45, 96, 158, 76, 96, 226, 124, 250, 104, 193, 227, 148, 62, + 202, 104, 157, 131, 83, 152, 236, 255, 33, 90, 55, 81, 71, 64, 62, 180, + 87, 42, 185, 199, 49, 230, 137, 119, 184, 47, 213, 18, 211, 72, 250, 118, + 83, 98, 186, 72, 223, 54, 75, 107, 57, 163, 144, 211, 214, 115, 6, 177, + 238, 89, 207, 77, 197, 181, 234, 122, 110, 130, 54, 24, 62, 159, 51, 32, + 32, 143, 22, 28, 155, 223, 161, 80, 219, 20, 54, 243, 95, 50, 60, 80, + 169, 47, 44, 135, 47, 196, 92, 253, 11, 203, 249, 11, 81, 22, 120, 134, + 167, 66, 78, 167, 38, 40, 124, 240, 94, 164, 239, 24, 29, 25, 57, 188, + 194, 64, 233, 66, 100, 12, 133, 214, 2, 72, 190, 168, 185, 128, 68, 154, + 7, 60, 134, 249, 153, 224, 50, 192, 94, 204, 209, 189, 52, 220, 159, 243, + 64, 5, 54, 152, 163, 3, 53, 102, 86, 149, 0, 62, 11, 231, 108, 122, + 37, 241, 116, 45, 4, 104, 211, 161, 136, 54, 125, 211, 150, 202, 233, 227, + 192, 105, 225, 140, 79, 46, 112, 96, 16, 201, 122, 29, 147, 24, 3, 91, + 193, 73, 226, 122, 131, 9, 236, 141, 243, 129, 45, 244, 39, 227, 240, 249, + 209, 182, 7, 15, 244, 91, 189, 37, 4, 42, 169, 36, 217, 72, 32, 21, + 71, 45, 69, 34, 57, 101, 36, 161, 196, 118, 86, 131, 41, 191, 21, 225, + 199, 200, 36, 162, 198, 46, 21, 146, 89, 80, 254, 60, 20, 224, 51, 89, + 53, 21, 97, 227, 229, 3, 187, 81, 8, 165, 245, 68, 202, 29, 80, 202, + 168, 3, 35, 106, 18, 221, 31, 188, 100, 18, 77, 249, 39, 236, 147, 159, + 126, 48, 228, 175, 88, 131, 99, 70, 164, 185, 68, 2, 178, 74, 151, 123, + 142, 74, 128, 214, 35, 117, 201, 215, 51, 192, 146, 146, 33, 35, 27, 88, + 133, 31, 48, 101, 152, 104, 136, 188, 226, 241, 12, 230, 7, 188, 220, 83, + 254, 57, 145, 134, 177, 210, 209, 104, 253, 40, 41, 153, 213, 85, 163, 84, + 100, 169, 212, 191, 145, 3, 225, 16, 88, 38, 239, 213, 227, 123, 73, 166, + 164, 113, 101, 69, 8, 71, 128, 189, 243, 102, 65, 129, 26, 80, 114, 154, + 81, 249, 157, 148, 123, 112, 67, 222, 1, 120, 242, 148, 92, 10, 167, 15, + 201, 37, 49, 161, 82, 145, 194, 187, 54, 136, 23, 215, 203, 128, 137, 64, + 219, 179, 6, 165, 176, 201, 64, 230, 105, 73, 90, 81, 120, 169, 36, 83, + 158, 124, 69, 135, 124, 74, 196, 228, 136, 226, 86, 154, 85, 101, 40, 57, + 56, 226, 196, 32, 150, 234, 63, 165, 175, 245, 151, 59, 41, 142, 241, 31, + 171, 141, 28, 95, 186, 171, 151, 43, 185, 30, 171, 53, 198, 174, 111, 147, + 213, 9, 75, 179, 160, 188, 177, 30, 86, 164, 227, 222, 172, 82, 34, 38, + 140, 54, 227, 247, 19, 37, 164, 32, 136, 200, 188, 191, 127, 133, 28, 193, + 92, 128, 77, 46, 41, 253, 6, 142, 96, 177, 138, 224, 141, 186, 110, 3, + 120, 59, 157, 137, 221, 209, 189, 75, 156, 101, 34, 179, 110, 53, 157, 92, + 89, 48, 77, 255, 222, 24, 36, 26, 12, 227, 17, 159, 52, 210, 171, 3, + 66, 59, 255, 149, 142, 255, 111, 208, 13, 62, 32, 28, 129, 200, 243, 149, + 21, 121, 71, 85, 183, 21, 129, 65, 53, 227, 118, 151, 205, 230, 44, 228, + 2, 8, 238, 50, 48, 81, 89, 148, 206, 23, 11, 138, 133, 143, 18, 147, + 208, 125, 250, 161, 208, 251, 52, 102, 232, 149, 160, 34, 104, 126, 68, 65, + 35, 240, 122, 16, 237, 246, 3, 83, 40, 34, 243, 118, 220, 49, 37, 232, + 127, 113, 132, 207, 134, 85, 240, 34, 32, 48, 99, 81, 147, 208, 160, 193, + 93, 72, 201, 88, 76, 44, 174, 178, 145, 165, 113, 74, 57, 18, 51, 37, + 53, 87, 51, 192, 154, 55, 132, 130, 202, 125, 34, 154, 182, 93, 68, 179, + 33, 85, 16, 225, 183, 129, 222, 100, 132, 130, 2, 47, 148, 183, 140, 54, + 106, 188, 104, 167, 41, 209, 99, 36, 244, 131, 98, 126, 131, 31, 1, 158, + 113, 115, 231, 80, 230, 82, 140, 171, 253, 227, 209, 66, 201, 168, 18, 84, + 139, 8, 49, 27, 238, 176, 129, 230, 15, 33, 78, 151, 78, 253, 147, 192, + 1, 64, 99, 222, 219, 18, 58, 219, 170, 112, 7, 28, 41, 158, 86, 4, + 233, 158, 92, 197, 209, 61, 15, 134, 139, 221, 173, 215, 107, 141, 199, 22, + 17, 232, 208, 141, 144, 106, 1, 176, 103, 100, 174, 167, 119, 40, 14, 194, + 214, 19, 236, 45, 76, 185, 118, 247, 188, 46, 76, 224, 120, 177, 46, 248, + 47, 212, 192, 195, 93, 220, 147, 19, 71, 246, 142, 136, 196, 238, 185, 131, + 112, 26, 112, 202, 14, 119, 129, 51, 33, 155, 105, 76, 134, 35, 68, 245, + 207, 204, 36, 97, 46, 9, 253, 153, 208, 159, 11, 253, 186, 208, 39, 197, + 45, 74, 176, 22, 216, 147, 194, 53, 96, 165, 61, 162, 208, 11, 142, 122, + 25, 52, 176, 173, 11, 61, 224, 6, 177, 124, 44, 126, 70, 138, 159, 191, + 220, 175, 147, 83, 148, 136, 97, 83, 18, 214, 126, 185, 39, 127, 235, 228, + 119, 161, 255, 18, 228, 249, 140, 119, 196, 57, 250, 2, 220, 155, 186, 142, + 48, 136, 107, 185, 222, 52, 15, 231, 215, 185, 68, 96, 30, 225, 236, 58, + 47, 192, 75, 94, 108, 231, 137, 142, 156, 198, 46, 118, 102, 223, 37, 14, + 106, 65, 43, 80, 243, 96, 117, 253, 251, 219, 154, 204, 223, 161, 14, 141, + 188, 161, 173, 215, 80, 254, 135, 90, 52, 210, 134, 169, 147, 55, 180, 119, + 33, 85, 83, 2, 3, 198, 79, 185, 122, 112, 61, 84, 255, 39, 35, 235, + 117, 70, 202, 115, 172, 189, 28, 233, 154, 18, 17, 70, 6, 123, 97, 157, + 5, 82, 82, 65, 26, 48, 163, 35, 196, 234, 163, 110, 232, 235, 107, 202, + 250, 93, 14, 248, 82, 72, 39, 18, 207, 22, 164, 222, 119, 57, 232, 228, + 28, 244, 114, 14, 186, 57, 199, 250, 249, 254, 83, 233, 142, 20, 32, 228, + 32, 144, 133, 145, 171, 212, 21, 139, 55, 154, 49, 136, 238, 38, 5, 139, + 88, 126, 99, 17, 195, 99, 142, 213, 146, 254, 157, 7, 165, 0, 175, 102, + 177, 5, 206, 119, 238, 162, 185, 23, 135, 119, 147, 133, 59, 50, 7, 239, + 3, 187, 62, 116, 97, 169, 52, 103, 119, 43, 231, 231, 61, 247, 28, 62, + 11, 38, 207, 202, 65, 219, 118, 60, 73, 116, 54, 232, 145, 152, 54, 23, + 166, 42, 27, 16, 86, 208, 6, 170, 81, 5, 136, 83, 196, 205, 83, 180, + 202, 97, 67, 216, 224, 178, 71, 152, 221, 87, 110, 45, 251, 252, 175, 127, + 61, 83, 163, 140, 181, 187, 87, 26, 119, 143, 19, 38, 255, 242, 146, 205, + 103, 129, 216, 41, 176, 148, 51, 211, 13, 142, 144, 165, 105, 205, 29, 115, + 138, 68, 247, 97, 124, 193, 129, 12, 102, 120, 174, 206, 56, 167, 250, 63, + 149, 116, 183, 220, 97, 19, 87, 119, 205, 255, 78, 175, 76, 55, 194, 6, + 48, 142, 9, 22, 213, 246, 229, 249, 209, 209, 238, 222, 229, 11, 157, 188, + 184, 204, 118, 224, 172, 6, 148, 130, 0, 25, 39, 215, 34, 71, 8, 105, + 44, 136, 182, 118, 117, 54, 219, 44, 27, 180, 199, 250, 79, 242, 57, 167, + 249, 48, 242, 13, 21, 15, 104, 77, 41, 152, 248, 25, 234, 3, 227, 121, + 157, 165, 250, 4, 201, 118, 47, 182, 99, 111, 103, 176, 7, 224, 61, 120, + 143, 75, 158, 120, 255, 206, 137, 166, 117, 46, 180, 246, 133, 214, 150, 208, + 218, 76, 177, 75, 228, 45, 136, 58, 172, 121, 163, 65, 13, 213, 150, 230, + 2, 106, 78, 144, 124, 137, 254, 68, 250, 20, 68, 238, 232, 66, 61, 32, + 102, 221, 67, 212, 142, 234, 147, 222, 224, 1, 93, 132, 246, 135, 12, 179, + 253, 161, 230, 3, 103, 90, 155, 161, 239, 211, 126, 119, 66, 146, 173, 60, + 69, 9, 181, 94, 29, 225, 111, 5, 138, 245, 106, 11, 163, 129, 221, 152, + 116, 107, 67, 40, 197, 245, 92, 166, 213, 132, 57, 198, 202, 115, 160, 34, + 49, 125, 39, 204, 166, 107, 251, 48, 195, 133, 4, 133, 18, 216, 202, 143, + 176, 190, 194, 254, 195, 250, 172, 96, 113, 194, 48, 118, 122, 147, 11, 42, + 112, 44, 145, 144, 63, 198, 7, 0, 207, 28, 113, 31, 49, 47, 96, 184, + 126, 127, 224, 214, 188, 145, 137, 251, 147, 193, 121, 15, 244, 10, 6, 37, + 7, 163, 146, 131, 97, 201, 181, 54, 209, 24, 11, 33, 232, 62, 33, 178, + 37, 157, 244, 105, 118, 3, 29, 51, 188, 89, 76, 2, 242, 46, 57, 128, + 63, 100, 142, 15, 92, 203, 145, 0, 84, 16, 77, 70, 249, 67, 119, 8, + 202, 26, 60, 143, 80, 222, 71, 114, 13, 237, 1, 49, 219, 209, 15, 130, + 127, 192, 28, 25, 109, 82, 63, 162, 8, 184, 126, 7, 77, 90, 131, 68, + 121, 113, 196, 221, 11, 35, 65, 205, 231, 191, 29, 240, 155, 89, 10, 154, + 30, 232, 149, 162, 250, 36, 185, 83, 171, 213, 237, 46, 17, 187, 144, 220, + 58, 107, 114, 254, 83, 201, 197, 93, 169, 131, 114, 22, 124, 201, 114, 99, + 24, 117, 143, 24, 44, 202, 204, 235, 216, 58, 242, 36, 255, 165, 190, 36, + 82, 213, 90, 102, 148, 106, 237, 58, 133, 125, 163, 44, 18, 119, 129, 156, + 42, 126, 163, 40, 97, 34, 100, 122, 177, 34, 47, 53, 26, 143, 248, 112, + 176, 172, 8, 156, 201, 65, 169, 68, 157, 9, 104, 107, 82, 254, 231, 29, + 225, 183, 224, 135, 241, 69, 247, 95, 15, 128, 47, 137, 252, 204, 49, 67, + 133, 116, 182, 67, 159, 81, 191, 196, 145, 139, 157, 75, 147, 75, 116, 105, + 138, 170, 12, 138, 136, 156, 193, 8, 139, 26, 222, 180, 171, 116, 60, 30, + 28, 52, 54, 145, 184, 17, 122, 132, 131, 191, 207, 208, 119, 238, 49, 209, + 228, 33, 76, 220, 151, 25, 58, 216, 185, 35, 155, 192, 253, 215, 25, 130, + 253, 135, 124, 29, 105, 195, 100, 45, 241, 158, 255, 66, 111, 80, 2, 28, + 189, 117, 138, 65, 79, 13, 100, 81, 70, 22, 220, 78, 39, 79, 212, 148, + 154, 33, 29, 129, 57, 74, 46, 92, 99, 132, 67, 145, 52, 244, 59, 174, + 104, 130, 46, 43, 132, 147, 198, 94, 44, 106, 104, 122, 152, 34, 55, 207, + 185, 128, 74, 197, 108, 9, 33, 52, 77, 178, 80, 209, 119, 85, 77, 148, + 165, 46, 12, 212, 232, 210, 57, 112, 189, 99, 98, 151, 3, 189, 117, 79, + 20, 2, 154, 118, 147, 250, 6, 72, 199, 36, 44, 49, 178, 200, 185, 222, + 49, 113, 99, 2, 79, 49, 138, 25, 84, 35, 70, 187, 3, 111, 44, 203, + 53, 123, 141, 116, 195, 56, 51, 86, 63, 64, 86, 37, 186, 2, 141, 76, + 48, 244, 94, 116, 149, 65, 165, 55, 61, 162, 11, 96, 39, 44, 188, 179, + 219, 48, 241, 250, 99, 130, 134, 104, 15, 199, 144, 1, 37, 157, 56, 164, + 168, 193, 86, 227, 176, 222, 100, 128, 179, 92, 52, 156, 116, 109, 36, 234, + 159, 238, 199, 239, 37, 230, 28, 29, 169, 129, 4, 244, 0, 51, 82, 104, + 238, 27, 132, 28, 160, 67, 40, 37, 255, 243, 224, 107, 124, 153, 220, 103, + 19, 71, 236, 55, 27, 14, 13, 142, 77, 54, 214, 238, 176, 189, 203, 213, + 1, 18, 51, 155, 199, 143, 72, 43, 150, 56, 226, 165, 146, 195, 213, 6, + 61, 93, 109, 176, 227, 85, 232, 175, 220, 37, 235, 124, 61, 233, 4, 37, + 216, 158, 8, 18, 81, 240, 146, 13, 16, 2, 30, 107, 36, 156, 237, 123, + 217, 16, 119, 224, 177, 73, 194, 217, 62, 24, 11, 167, 249, 4, 251, 98, + 244, 129, 194, 98, 144, 111, 193, 86, 25, 22, 210, 147, 67, 87, 100, 89, + 198, 130, 101, 67, 151, 98, 189, 105, 59, 248, 140, 235, 3, 15, 144, 223, + 40, 111, 79, 60, 103, 100, 123, 242, 122, 192, 103, 134, 143, 115, 161, 16, + 228, 195, 221, 67, 70, 181, 30, 236, 153, 36, 58, 146, 134, 66, 54, 254, + 145, 248, 81, 25, 81, 157, 217, 159, 107, 25, 234, 143, 67, 89, 159, 137, + 164, 224, 2, 241, 139, 50, 143, 94, 36, 76, 115, 4, 145, 104, 21, 10, + 92, 5, 94, 197, 18, 78, 142, 181, 35, 200, 235, 10, 62, 177, 242, 200, + 183, 43, 246, 13, 253, 169, 160, 111, 153, 194, 29, 231, 74, 130, 43, 135, + 108, 1, 230, 119, 194, 34, 157, 64, 164, 115, 4, 99, 88, 111, 246, 199, + 107, 39, 194, 81, 126, 253, 4, 178, 57, 10, 170, 8, 163, 193, 67, 215, + 147, 175, 71, 194, 9, 154, 36, 60, 142, 8, 233, 192, 144, 115, 225, 10, + 206, 98, 249, 63, 164, 171, 161, 97, 95, 165, 111, 153, 59, 220, 253, 176, + 210, 9, 226, 29, 204, 189, 16, 51, 22, 231, 82, 154, 113, 97, 6, 97, + 33, 215, 146, 137, 211, 144, 149, 41, 200, 253, 90, 58, 240, 115, 176, 40, + 194, 140, 2, 247, 233, 136, 167, 47, 75, 127, 10, 107, 209, 167, 207, 249, + 23, 166, 103, 4, 228, 39, 160, 53, 148, 91, 10, 253, 206, 110, 4, 33, + 84, 93, 137, 198, 89, 205, 53, 69, 176, 39, 228, 90, 43, 88, 61, 193, + 202, 139, 86, 19, 187, 57, 143, 36, 170, 171, 22, 111, 242, 170, 120, 131, + 137, 8, 89, 82, 100, 120, 73, 211, 91, 93, 114, 173, 144, 146, 168, 171, + 84, 42, 78, 133, 230, 113, 157, 122, 170, 70, 31, 201, 198, 87, 43, 205, + 135, 178, 245, 64, 172, 30, 42, 188, 71, 42, 228, 68, 119, 156, 168, 140, + 199, 196, 86, 105, 151, 13, 4, 130, 56, 114, 100, 31, 55, 30, 249, 67, + 0, 141, 169, 174, 87, 216, 111, 113, 157, 239, 156, 150, 178, 199, 143, 183, + 55, 184, 250, 140, 194, 34, 192, 191, 68, 220, 247, 189, 93, 68, 57, 164, + 29, 140, 144, 169, 213, 181, 107, 143, 120, 167, 31, 42, 69, 145, 96, 12, + 125, 200, 61, 103, 7, 208, 90, 111, 76, 110, 87, 138, 47, 27, 13, 183, + 215, 90, 100, 82, 26, 88, 207, 133, 65, 109, 220, 126, 104, 212, 26, 109, + 251, 37, 169, 143, 229, 114, 175, 124, 165, 36, 218, 229, 218, 227, 241, 96, + 244, 85, 36, 74, 88, 27, 246, 68, 108, 214, 198, 181, 135, 176, 2, 163, + 72, 189, 139, 235, 111, 188, 154, 23, 26, 81, 39, 167, 135, 241, 223, 191, + 100, 137, 25, 120, 132, 6, 5, 175, 89, 113, 48, 11, 16, 52, 218, 136, + 89, 80, 176, 185, 68, 198, 124, 25, 170, 30, 106, 253, 61, 132, 170, 127, + 150, 201, 105, 83, 22, 136, 10, 180, 42, 232, 76, 21, 151, 224, 97, 35, + 111, 198, 4, 113, 84, 213, 15, 5, 251, 132, 182, 104, 148, 87, 255, 50, + 85, 74, 83, 81, 249, 214, 86, 74, 109, 248, 83, 45, 205, 10, 4, 48, + 110, 94, 64, 152, 184, 181, 169, 194, 87, 69, 88, 65, 109, 133, 191, 17, + 115, 26, 241, 89, 5, 132, 24, 152, 55, 20, 14, 36, 29, 32, 81, 87, + 199, 254, 6, 67, 75, 227, 137, 251, 17, 156, 247, 16, 72, 237, 246, 2, + 151, 235, 84, 123, 63, 165, 98, 136, 224, 42, 136, 43, 26, 57, 186, 93, + 242, 109, 75, 117, 214, 200, 138, 200, 199, 78, 30, 84, 21, 131, 193, 64, + 17, 171, 61, 186, 102, 138, 73, 205, 26, 106, 246, 144, 156, 203, 31, 91, + 17, 108, 222, 227, 170, 42, 232, 47, 130, 148, 130, 45, 79, 174, 141, 73, + 41, 155, 13, 116, 89, 12, 180, 254, 101, 138, 129, 147, 60, 55, 41, 229, + 38, 104, 242, 128, 15, 207, 147, 151, 85, 139, 39, 155, 251, 1, 139, 135, + 86, 120, 194, 229, 38, 81, 125, 97, 58, 55, 86, 96, 100, 188, 6, 118, + 16, 79, 20, 168, 246, 100, 95, 71, 59, 32, 209, 135, 181, 57, 182, 32, + 122, 142, 105, 149, 83, 85, 10, 102, 24, 24, 161, 179, 147, 42, 196, 197, + 185, 207, 168, 238, 55, 122, 225, 215, 232, 223, 207, 74, 254, 37, 14, 133, + 50, 8, 111, 226, 63, 8, 220, 176, 49, 83, 50, 161, 54, 5, 156, 22, + 232, 21, 49, 60, 184, 184, 39, 194, 12, 8, 89, 107, 244, 169, 9, 181, + 229, 208, 109, 76, 14, 190, 50, 64, 60, 162, 139, 21, 83, 30, 65, 247, + 217, 84, 235, 53, 230, 91, 96, 117, 167, 196, 42, 251, 238, 68, 137, 55, + 108, 53, 241, 28, 2, 223, 104, 163, 207, 144, 58, 71, 16, 80, 18, 161, + 212, 109, 11, 202, 187, 16, 6, 158, 66, 108, 16, 32, 15, 6, 180, 79, + 174, 185, 255, 222, 12, 72, 164, 162, 182, 222, 175, 180, 147, 220, 24, 61, + 144, 94, 238, 51, 239, 158, 111, 235, 102, 5, 90, 45, 15, 171, 18, 51, + 204, 104, 133, 35, 106, 154, 248, 147, 130, 87, 77, 195, 85, 167, 50, 72, + 232, 135, 36, 106, 177, 164, 102, 253, 129, 106, 16, 71, 150, 244, 134, 38, + 60, 46, 147, 19, 125, 220, 225, 124, 18, 67, 6, 25, 249, 26, 179, 59, + 108, 144, 59, 143, 4, 96, 82, 2, 145, 36, 242, 74, 31, 30, 38, 128, + 240, 89, 197, 72, 225, 16, 195, 151, 52, 82, 86, 244, 120, 104, 4, 188, + 194, 127, 61, 158, 43, 212, 56, 14, 195, 146, 19, 123, 98, 55, 205, 143, + 152, 165, 182, 153, 246, 75, 143, 213, 90, 233, 72, 62, 240, 20, 207, 241, + 212, 192, 160, 49, 25, 250, 54, 133, 41, 124, 206, 233, 133, 156, 81, 144, + 54, 228, 23, 170, 162, 142, 71, 119, 152, 158, 248, 7, 29, 191, 231, 76, + 158, 125, 195, 211, 118, 204, 235, 251, 170, 172, 208, 110, 64, 86, 194, 204, + 100, 137, 230, 102, 177, 220, 100, 52, 167, 84, 87, 230, 39, 175, 174, 155, + 12, 149, 147, 163, 218, 201, 172, 122, 114, 80, 63, 25, 42, 40, 175, 174, + 161, 188, 186, 138, 10, 84, 81, 137, 170, 168, 176, 42, 42, 50, 203, 81, + 129, 58, 42, 203, 117, 132, 185, 5, 25, 64, 95, 162, 16, 136, 232, 154, + 245, 103, 142, 59, 102, 224, 91, 177, 23, 6, 238, 164, 46, 155, 14, 116, + 107, 48, 25, 2, 111, 210, 193, 255, 228, 66, 140, 41, 237, 49, 195, 246, + 48, 175, 216, 18, 89, 46, 64, 254, 31, 23, 0, 135, 167, 254, 4, 14, + 71, 173, 21, 206, 66, 86, 81, 153, 112, 38, 193, 10, 67, 28, 71, 185, + 72, 112, 28, 101, 118, 247, 2, 161, 68, 86, 132, 183, 12, 192, 32, 151, + 128, 228, 54, 251, 161, 243, 86, 84, 250, 213, 161, 159, 225, 11, 129, 32, + 148, 57, 120, 42, 148, 116, 137, 121, 126, 198, 15, 63, 80, 133, 153, 105, + 205, 110, 112, 38, 80, 108, 2, 102, 148, 196, 223, 135, 213, 128, 18, 74, + 34, 47, 252, 142, 28, 54, 175, 252, 201, 253, 120, 225, 24, 248, 82, 96, + 27, 34, 161, 102, 50, 240, 23, 100, 13, 242, 244, 30, 189, 54, 224, 36, + 178, 95, 192, 248, 79, 145, 38, 104, 76, 154, 149, 133, 239, 165, 59, 68, + 33, 146, 245, 151, 251, 111, 240, 118, 167, 174, 207, 4, 21, 206, 114, 137, + 171, 79, 146, 229, 70, 160, 11, 204, 133, 144, 78, 75, 36, 182, 81, 243, + 252, 90, 106, 203, 163, 224, 50, 90, 102, 141, 130, 255, 6, 120, 192, 249, + 151, 63, 20, 248, 55, 10, 200, 115, 84, 60, 168, 80, 255, 102, 17, 236, + 26, 199, 156, 169, 81, 183, 26, 50, 173, 13, 243, 179, 130, 10, 151, 209, + 49, 147, 21, 82, 76, 23, 82, 252, 64, 33, 65, 25, 164, 16, 157, 129, + 221, 210, 50, 136, 71, 148, 198, 70, 80, 74, 232, 18, 69, 68, 13, 81, + 34, 80, 249, 79, 90, 183, 212, 184, 213, 109, 11, 200, 107, 242, 136, 68, + 187, 252, 221, 141, 155, 141, 76, 122, 207, 110, 0, 163, 254, 24, 64, 169, + 179, 23, 202, 71, 1, 237, 35, 78, 137, 201, 53, 163, 254, 34, 80, 7, + 143, 70, 148, 232, 253, 34, 89, 118, 75, 69, 206, 225, 72, 184, 194, 209, + 228, 170, 181, 55, 42, 61, 143, 94, 82, 71, 76, 122, 194, 92, 163, 24, + 177, 121, 244, 101, 199, 54, 208, 129, 59, 35, 91, 1, 57, 125, 70, 30, + 172, 169, 109, 236, 103, 225, 217, 29, 189, 112, 235, 84, 201, 151, 233, 11, + 224, 174, 69, 60, 222, 150, 164, 13, 5, 175, 183, 137, 211, 29, 234, 147, + 151, 252, 94, 47, 61, 163, 113, 33, 106, 89, 163, 150, 3, 229, 187, 201, + 158, 66, 28, 236, 68, 183, 115, 120, 200, 184, 102, 0, 212, 11, 33, 55, + 34, 186, 139, 215, 223, 81, 188, 39, 255, 251, 223, 215, 232, 103, 94, 18, + 16, 144, 250, 123, 110, 36, 184, 226, 181, 32, 51, 152, 233, 79, 168, 46, + 73, 136, 107, 96, 165, 67, 0, 192, 115, 163, 76, 39, 90, 211, 49, 123, + 47, 106, 235, 69, 137, 135, 28, 163, 77, 40, 213, 37, 251, 253, 234, 133, + 73, 59, 253, 3, 99, 70, 7, 231, 149, 65, 123, 136, 110, 68, 63, 54, + 126, 39, 165, 103, 133, 136, 143, 84, 129, 94, 217, 174, 193, 33, 0, 197, + 246, 246, 176, 97, 227, 41, 90, 201, 190, 252, 212, 214, 167, 237, 245, 156, + 242, 21, 186, 57, 159, 15, 60, 195, 32, 105, 202, 166, 165, 233, 89, 42, + 187, 103, 223, 32, 40, 79, 36, 162, 84, 90, 15, 107, 229, 152, 170, 222, + 83, 16, 61, 56, 11, 156, 196, 200, 39, 198, 65, 200, 144, 220, 49, 81, + 200, 86, 215, 201, 67, 136, 31, 15, 93, 126, 34, 60, 255, 129, 47, 133, + 156, 246, 25, 133, 228, 80, 202, 75, 112, 166, 138, 36, 198, 171, 251, 183, + 93, 235, 58, 168, 211, 142, 43, 169, 217, 153, 140, 18, 86, 208, 234, 75, + 180, 23, 113, 117, 164, 133, 111, 246, 92, 38, 200, 140, 168, 235, 60, 235, + 5, 235, 37, 243, 106, 129, 239, 142, 104, 88, 179, 244, 144, 182, 237, 218, + 112, 28, 44, 125, 246, 194, 248, 231, 240, 235, 251, 185, 179, 116, 233, 163, + 64, 205, 175, 125, 104, 130, 16, 137, 122, 164, 40, 195, 193, 30, 62, 234, + 213, 168, 113, 32, 106, 48, 160, 153, 28, 35, 143, 120, 208, 167, 26, 202, + 248, 15, 61, 161, 91, 18, 44, 231, 36, 105, 8, 71, 41, 240, 0, 139, + 155, 159, 154, 9, 189, 154, 189, 122, 48, 132, 10, 191, 127, 74, 198, 86, + 45, 123, 134, 24, 214, 87, 249, 252, 91, 181, 26, 88, 220, 28, 130, 228, + 67, 63, 147, 223, 43, 28, 99, 125, 70, 206, 241, 243, 43, 53, 237, 213, + 22, 171, 156, 156, 197, 141, 212, 134, 27, 204, 148, 66, 14, 77, 41, 228, + 184, 41, 69, 120, 96, 112, 40, 202, 77, 120, 64, 96, 167, 78, 34, 62, + 130, 98, 160, 172, 209, 35, 113, 141, 22, 220, 146, 81, 241, 29, 19, 134, + 124, 66, 191, 171, 52, 5, 23, 50, 216, 68, 119, 3, 237, 215, 162, 49, + 77, 27, 254, 0, 75, 132, 158, 204, 30, 122, 253, 81, 205, 109, 188, 14, + 105, 206, 163, 157, 23, 55, 178, 91, 61, 28, 94, 130, 236, 53, 106, 227, + 173, 18, 242, 66, 68, 214, 152, 161, 183, 184, 112, 152, 64, 112, 74, 224, + 93, 241, 254, 150, 49, 68, 1, 167, 194, 209, 123, 214, 12, 239, 224, 116, + 251, 18, 248, 4, 64, 160, 223, 47, 49, 100, 121, 62, 1, 125, 148, 0, + 233, 128, 126, 203, 132, 174, 22, 241, 140, 37, 20, 148, 251, 248, 201, 3, + 190, 51, 127, 7, 57, 61, 240, 118, 192, 196, 67, 168, 108, 30, 243, 121, + 240, 18, 131, 208, 199, 79, 49, 207, 7, 244, 83, 250, 244, 2, 172, 79, + 38, 229, 21, 153, 28, 212, 200, 5, 90, 1, 103, 142, 150, 121, 205, 189, + 109, 208, 189, 113, 7, 127, 171, 39, 39, 141, 74, 181, 3, 147, 51, 46, + 27, 34, 2, 96, 140, 247, 157, 152, 208, 50, 87, 184, 247, 27, 216, 1, + 146, 128, 252, 158, 19, 33, 50, 181, 12, 238, 33, 74, 152, 91, 231, 214, + 57, 106, 142, 68, 12, 101, 137, 39, 133, 68, 11, 232, 148, 193, 22, 16, + 175, 184, 141, 32, 83, 53, 150, 77, 92, 103, 27, 161, 138, 113, 20, 169, + 148, 158, 60, 54, 98, 103, 219, 100, 217, 212, 100, 74, 37, 18, 34, 46, + 116, 156, 137, 91, 246, 122, 242, 204, 27, 94, 173, 125, 250, 94, 66, 49, + 4, 222, 38, 222, 221, 115, 217, 237, 126, 175, 135, 59, 212, 151, 156, 244, + 229, 43, 119, 209, 239, 217, 28, 51, 125, 130, 9, 204, 245, 92, 234, 115, + 217, 245, 184, 47, 219, 4, 109, 132, 125, 253, 194, 17, 21, 216, 181, 236, + 51, 162, 49, 189, 100, 209, 78, 18, 88, 72, 27, 142, 229, 99, 174, 107, + 215, 70, 99, 1, 1, 77, 178, 220, 96, 216, 71, 241, 106, 51, 191, 145, + 77, 195, 71, 64, 219, 32, 117, 1, 1, 86, 114, 184, 55, 62, 140, 162, + 144, 151, 212, 133, 195, 29, 4, 19, 253, 171, 72, 37, 85, 65, 194, 197, + 226, 227, 225, 144, 56, 255, 202, 80, 65, 127, 140, 228, 144, 101, 79, 59, + 136, 90, 178, 19, 24, 124, 141, 236, 252, 204, 78, 127, 42, 78, 243, 140, + 7, 200, 181, 197, 54, 110, 244, 67, 98, 218, 182, 158, 211, 63, 67, 6, + 50, 125, 46, 126, 142, 238, 22, 20, 196, 183, 101, 73, 134, 18, 20, 189, + 14, 127, 229, 2, 60, 163, 73, 155, 130, 184, 221, 196, 248, 57, 55, 228, + 120, 42, 162, 203, 13, 5, 248, 23, 58, 53, 32, 131, 73, 239, 112, 216, + 70, 126, 87, 160, 109, 4, 254, 10, 152, 180, 85, 96, 26, 232, 135, 103, + 52, 24, 186, 99, 156, 48, 44, 174, 130, 166, 156, 17, 136, 45, 210, 128, + 160, 15, 3, 207, 120, 100, 178, 164, 64, 61, 150, 192, 225, 18, 84, 250, + 85, 239, 145, 3, 59, 100, 27, 100, 2, 65, 75, 29, 94, 162, 211, 250, + 128, 182, 46, 87, 123, 213, 36, 252, 145, 139, 129, 204, 189, 54, 150, 241, + 42, 241, 175, 87, 128, 170, 255, 69, 212, 253, 141, 26, 36, 251, 135, 140, + 1, 182, 117, 90, 27, 122, 241, 67, 125, 246, 56, 156, 247, 131, 201, 152, + 77, 249, 79, 89, 134, 11, 250, 16, 39, 27, 100, 107, 79, 76, 183, 229, + 217, 134, 108, 186, 140, 118, 68, 255, 139, 179, 46, 170, 228, 51, 90, 108, + 190, 220, 209, 25, 56, 250, 208, 196, 91, 2, 149, 180, 200, 118, 196, 162, + 173, 135, 79, 104, 205, 22, 190, 200, 20, 31, 55, 156, 162, 108, 110, 146, + 217, 134, 226, 137, 152, 219, 96, 84, 199, 142, 247, 163, 132, 86, 170, 68, + 23, 131, 234, 46, 35, 37, 142, 190, 202, 240, 149, 152, 236, 81, 217, 96, + 236, 139, 18, 255, 194, 149, 184, 240, 170, 37, 188, 219, 35, 45, 253, 14, + 251, 175, 140, 206, 14, 162, 148, 42, 166, 84, 4, 118, 65, 243, 101, 198, + 207, 191, 151, 208, 125, 65, 65, 254, 18, 139, 165, 177, 88, 203, 37, 235, + 172, 100, 101, 233, 75, 17, 69, 66, 136, 63, 137, 218, 236, 184, 25, 146, + 77, 56, 250, 110, 132, 109, 37, 12, 42, 87, 212, 185, 33, 23, 53, 79, + 129, 35, 36, 118, 85, 44, 133, 25, 166, 128, 54, 13, 147, 125, 99, 225, + 38, 10, 180, 124, 202, 140, 233, 36, 54, 120, 168, 243, 173, 33, 161, 65, + 63, 170, 253, 46, 124, 133, 93, 29, 109, 245, 100, 174, 161, 54, 105, 211, + 185, 142, 74, 245, 96, 130, 145, 193, 196, 4, 192, 35, 67, 253, 219, 51, + 239, 0, 115, 34, 167, 140, 141, 7, 14, 23, 170, 94, 1, 229, 47, 192, + 180, 195, 27, 134, 76, 238, 66, 128, 127, 68, 225, 23, 109, 234, 136, 219, + 40, 98, 83, 71, 92, 52, 125, 27, 150, 16, 237, 27, 109, 222, 8, 82, + 74, 245, 143, 194, 223, 252, 129, 51, 213, 183, 90, 169, 6, 3, 165, 172, + 205, 133, 25, 196, 130, 67, 169, 140, 242, 63, 99, 157, 196, 133, 81, 131, + 131, 23, 193, 29, 84, 214, 17, 121, 48, 168, 210, 108, 169, 78, 56, 73, + 226, 19, 10, 253, 227, 36, 76, 247, 121, 123, 136, 59, 150, 202, 21, 226, + 201, 148, 68, 50, 249, 163, 201, 212, 68, 50, 229, 163, 201, 180, 68, 50, + 245, 163, 201, 244, 68, 50, 227, 163, 201, 138, 137, 100, 230, 71, 147, 25, + 137, 100, 214, 155, 201, 2, 136, 138, 96, 201, 211, 205, 165, 24, 226, 70, + 189, 194, 102, 28, 3, 243, 142, 228, 117, 8, 103, 33, 23, 181, 59, 2, + 166, 129, 27, 79, 251, 9, 162, 203, 125, 202, 172, 13, 240, 19, 156, 172, + 219, 118, 227, 145, 27, 183, 33, 238, 151, 3, 18, 229, 136, 177, 34, 238, + 8, 230, 248, 16, 253, 53, 116, 231, 192, 148, 143, 25, 175, 145, 182, 238, + 185, 15, 5, 178, 41, 220, 134, 79, 37, 34, 129, 70, 198, 11, 65, 51, + 145, 203, 12, 113, 56, 164, 216, 17, 135, 177, 36, 118, 111, 128, 22, 91, + 5, 228, 204, 210, 138, 158, 209, 107, 65, 131, 174, 162, 215, 199, 241, 46, + 98, 233, 232, 109, 83, 202, 60, 239, 191, 95, 75, 122, 3, 68, 15, 111, + 64, 28, 185, 196, 96, 177, 58, 224, 61, 114, 224, 224, 134, 216, 202, 60, + 75, 194, 136, 192, 45, 227, 224, 14, 8, 118, 49, 242, 233, 212, 105, 52, + 242, 250, 36, 20, 17, 175, 194, 40, 239, 95, 206, 145, 140, 210, 204, 55, + 28, 169, 221, 230, 27, 238, 177, 227, 251, 42, 21, 183, 13, 201, 237, 158, + 252, 25, 175, 240, 244, 207, 145, 75, 240, 98, 140, 1, 129, 61, 140, 216, + 198, 19, 56, 44, 194, 30, 19, 186, 22, 220, 194, 135, 155, 41, 238, 94, + 81, 44, 116, 178, 12, 27, 116, 8, 75, 128, 187, 233, 75, 60, 97, 210, + 47, 60, 195, 240, 19, 185, 224, 78, 47, 186, 178, 236, 62, 214, 30, 154, + 253, 241, 40, 230, 58, 34, 22, 248, 140, 82, 63, 133, 216, 253, 66, 95, + 40, 145, 137, 59, 112, 197, 15, 118, 183, 235, 14, 70, 100, 33, 165, 2, + 226, 224, 101, 163, 185, 23, 14, 198, 138, 94, 163, 119, 171, 112, 68, 125, + 86, 8, 17, 85, 69, 130, 149, 90, 96, 167, 3, 206, 65, 63, 73, 207, + 1, 84, 50, 21, 6, 109, 188, 112, 225, 89, 141, 136, 173, 226, 69, 80, + 240, 181, 228, 149, 97, 236, 251, 251, 110, 199, 227, 153, 69, 87, 121, 228, + 58, 60, 126, 141, 159, 200, 180, 135, 183, 166, 228, 234, 244, 13, 28, 14, + 114, 228, 138, 53, 213, 248, 31, 52, 53, 206, 101, 190, 82, 131, 120, 165, + 159, 105, 125, 195, 187, 157, 112, 218, 105, 175, 48, 189, 31, 106, 216, 138, + 142, 251, 72, 143, 16, 133, 8, 37, 133, 150, 0, 36, 119, 4, 43, 58, + 117, 83, 157, 58, 217, 198, 166, 10, 193, 64, 64, 54, 54, 74, 72, 17, + 9, 18, 39, 91, 34, 133, 9, 176, 32, 95, 139, 136, 7, 212, 100, 86, + 129, 59, 155, 192, 164, 60, 142, 42, 154, 73, 139, 95, 70, 181, 177, 139, + 80, 18, 107, 40, 61, 48, 255, 160, 232, 201, 250, 131, 210, 39, 180, 109, + 71, 235, 109, 57, 31, 7, 197, 70, 113, 79, 49, 4, 152, 9, 49, 169, + 151, 9, 127, 36, 133, 141, 93, 152, 57, 49, 197, 30, 57, 229, 196, 132, + 41, 208, 103, 80, 131, 126, 178, 134, 58, 213, 112, 168, 70, 3, 24, 228, + 101, 50, 91, 43, 67, 81, 193, 145, 136, 225, 145, 5, 187, 95, 95, 219, + 226, 10, 220, 38, 132, 239, 64, 248, 38, 76, 185, 147, 111, 153, 109, 120, + 220, 162, 143, 181, 122, 3, 94, 70, 232, 201, 124, 237, 110, 19, 146, 108, + 193, 207, 54, 252, 236, 8, 120, 128, 151, 2, 193, 50, 100, 149, 39, 122, + 154, 168, 228, 8, 137, 132, 59, 20, 227, 203, 247, 192, 12, 133, 23, 220, + 133, 2, 7, 220, 21, 69, 59, 169, 19, 13, 140, 148, 228, 145, 26, 245, + 123, 49, 101, 33, 96, 124, 82, 178, 27, 10, 5, 138, 110, 52, 80, 2, + 20, 191, 79, 35, 226, 34, 96, 76, 19, 210, 99, 226, 48, 68, 45, 200, + 198, 75, 116, 231, 22, 8, 164, 201, 80, 6, 16, 191, 48, 121, 235, 147, + 46, 170, 98, 173, 34, 240, 49, 12, 163, 94, 134, 130, 22, 61, 163, 127, + 251, 34, 130, 68, 161, 224, 137, 72, 198, 105, 189, 225, 115, 32, 41, 207, + 169, 76, 152, 133, 48, 13, 178, 4, 47, 120, 108, 12, 2, 249, 48, 144, + 227, 129, 119, 220, 32, 88, 208, 27, 9, 27, 203, 224, 81, 38, 166, 156, + 170, 20, 67, 76, 81, 18, 136, 41, 10, 215, 31, 98, 79, 18, 173, 176, + 141, 76, 242, 158, 44, 147, 184, 30, 35, 233, 20, 138, 209, 64, 78, 163, + 43, 207, 162, 228, 10, 225, 19, 172, 37, 183, 86, 122, 118, 107, 47, 48, + 75, 114, 110, 13, 86, 80, 78, 135, 153, 129, 143, 137, 85, 17, 16, 170, + 96, 240, 40, 103, 214, 111, 60, 162, 35, 102, 220, 39, 154, 141, 113, 106, + 242, 70, 22, 160, 196, 24, 19, 79, 211, 42, 145, 177, 62, 19, 224, 207, + 196, 87, 134, 21, 147, 89, 231, 92, 200, 40, 238, 137, 32, 81, 72, 160, + 224, 24, 11, 140, 16, 94, 146, 177, 223, 223, 13, 98, 121, 164, 133, 113, + 131, 190, 71, 174, 190, 137, 246, 12, 125, 137, 228, 254, 52, 224, 253, 252, + 89, 186, 116, 222, 99, 84, 255, 107, 62, 180, 186, 31, 117, 89, 19, 250, + 175, 76, 164, 12, 55, 226, 248, 114, 138, 220, 179, 83, 7, 131, 1, 92, + 63, 17, 167, 10, 68, 50, 205, 174, 109, 3, 8, 253, 204, 210, 106, 42, + 134, 62, 247, 150, 213, 131, 226, 53, 120, 191, 3, 146, 245, 93, 238, 135, + 225, 251, 237, 31, 250, 25, 26, 49, 116, 234, 21, 222, 5, 124, 22, 168, + 195, 77, 162, 83, 66, 238, 97, 41, 218, 225, 82, 157, 97, 205, 187, 129, + 27, 6, 61, 220, 100, 130, 240, 176, 31, 233, 246, 162, 19, 193, 233, 242, + 183, 152, 183, 175, 79, 244, 126, 116, 35, 136, 182, 17, 33, 102, 225, 181, + 43, 178, 104, 175, 74, 202, 165, 152, 246, 110, 112, 35, 80, 252, 187, 10, + 26, 116, 164, 3, 245, 9, 85, 66, 8, 58, 65, 10, 52, 177, 163, 54, + 127, 96, 132, 88, 59, 83, 99, 51, 182, 199, 67, 151, 240, 141, 244, 129, + 114, 216, 227, 225, 4, 206, 62, 227, 21, 228, 51, 186, 200, 8, 226, 176, + 30, 209, 34, 63, 181, 164, 99, 17, 120, 40, 234, 104, 166, 24, 150, 162, + 26, 209, 119, 53, 245, 61, 250, 162, 81, 8, 163, 215, 62, 235, 171, 62, + 147, 220, 227, 197, 23, 233, 189, 7, 81, 131, 127, 142, 89, 48, 197, 137, + 125, 98, 3, 66, 80, 47, 152, 94, 245, 152, 202, 96, 146, 111, 240, 251, + 195, 190, 215, 119, 87, 204, 234, 105, 132, 160, 229, 4, 104, 144, 57, 130, + 90, 40, 35, 177, 22, 148, 13, 61, 79, 84, 91, 145, 145, 115, 96, 106, + 59, 225, 78, 160, 50, 37, 186, 212, 13, 255, 184, 244, 140, 183, 187, 133, + 28, 156, 18, 180, 23, 42, 78, 227, 225, 0, 202, 245, 108, 10, 247, 13, + 17, 232, 247, 208, 37, 173, 154, 180, 64, 34, 64, 92, 49, 43, 163, 31, + 240, 52, 38, 214, 41, 147, 239, 192, 249, 124, 206, 255, 209, 126, 186, 95, + 165, 108, 100, 246, 69, 186, 138, 53, 146, 141, 234, 119, 53, 19, 96, 235, + 101, 201, 234, 98, 150, 95, 212, 212, 139, 140, 122, 194, 252, 43, 10, 87, + 34, 243, 54, 252, 145, 168, 70, 77, 204, 249, 41, 202, 250, 24, 230, 127, + 224, 7, 153, 41, 114, 162, 5, 118, 124, 85, 5, 202, 107, 1, 156, 162, + 44, 101, 120, 108, 71, 210, 217, 103, 73, 254, 198, 185, 159, 74, 104, 69, + 136, 154, 207, 228, 17, 173, 8, 179, 153, 240, 238, 174, 24, 53, 230, 142, + 81, 23, 106, 83, 148, 172, 25, 213, 59, 136, 172, 192, 67, 10, 148, 52, + 71, 14, 180, 204, 2, 56, 118, 89, 207, 32, 91, 193, 102, 154, 74, 128, + 240, 54, 208, 232, 239, 14, 253, 106, 186, 247, 124, 137, 49, 85, 217, 37, + 187, 33, 186, 142, 72, 130, 160, 89, 67, 244, 71, 138, 0, 187, 114, 126, + 125, 245, 132, 250, 198, 177, 99, 219, 26, 122, 129, 34, 6, 47, 67, 248, + 159, 40, 201, 97, 117, 133, 187, 192, 119, 46, 83, 29, 96, 116, 142, 78, + 245, 97, 156, 115, 80, 86, 78, 244, 36, 96, 93, 48, 251, 113, 71, 70, + 11, 123, 162, 216, 133, 2, 69, 68, 106, 118, 16, 234, 215, 29, 118, 131, + 93, 156, 189, 196, 64, 63, 3, 35, 5, 250, 229, 93, 218, 21, 100, 64, + 132, 7, 41, 119, 107, 54, 49, 224, 64, 82, 138, 140, 73, 236, 77, 10, + 16, 229, 255, 72, 233, 152, 239, 22, 24, 207, 39, 77, 48, 3, 247, 126, + 237, 126, 151, 74, 159, 18, 239, 48, 61, 254, 192, 168, 188, 68, 39, 231, + 224, 59, 1, 4, 239, 175, 160, 168, 231, 165, 156, 204, 237, 35, 90, 226, + 22, 106, 203, 109, 150, 114, 26, 189, 244, 219, 100, 112, 60, 35, 98, 103, + 136, 10, 252, 240, 164, 229, 151, 133, 52, 212, 210, 55, 116, 54, 202, 157, + 195, 198, 183, 15, 63, 91, 37, 178, 135, 240, 84, 67, 37, 97, 36, 139, + 50, 151, 0, 53, 224, 92, 200, 237, 11, 185, 45, 33, 183, 121, 31, 234, + 155, 4, 203, 228, 153, 32, 217, 234, 148, 174, 36, 90, 2, 179, 25, 33, + 25, 147, 156, 248, 82, 123, 147, 211, 38, 213, 23, 204, 221, 6, 154, 54, + 232, 137, 190, 141, 29, 131, 151, 233, 43, 51, 184, 134, 110, 43, 98, 183, + 25, 216, 109, 38, 118, 155, 245, 127, 119, 183, 201, 82, 170, 223, 208, 39, + 99, 72, 25, 50, 190, 59, 154, 60, 160, 105, 116, 28, 224, 229, 14, 40, + 64, 246, 89, 18, 98, 88, 48, 68, 244, 243, 146, 153, 202, 168, 133, 19, + 38, 130, 181, 156, 189, 171, 208, 222, 188, 231, 8, 154, 201, 87, 238, 128, + 118, 24, 119, 71, 236, 84, 10, 4, 36, 252, 158, 92, 26, 5, 38, 187, + 203, 93, 74, 7, 78, 96, 162, 56, 162, 204, 19, 225, 152, 46, 15, 227, + 42, 209, 193, 234, 161, 194, 28, 45, 58, 156, 208, 112, 65, 162, 160, 4, + 129, 55, 204, 213, 163, 137, 195, 104, 225, 48, 202, 216, 239, 208, 75, 56, + 144, 178, 242, 127, 251, 72, 170, 233, 145, 84, 227, 75, 32, 232, 66, 114, + 190, 65, 175, 211, 2, 17, 248, 225, 29, 47, 236, 193, 228, 146, 208, 124, + 121, 125, 105, 188, 214, 23, 84, 243, 57, 83, 31, 49, 87, 22, 69, 196, + 92, 32, 234, 91, 33, 213, 215, 144, 70, 11, 134, 14, 83, 4, 102, 10, + 188, 8, 184, 3, 200, 121, 116, 119, 1, 89, 101, 151, 187, 156, 208, 175, + 250, 136, 252, 200, 100, 118, 225, 79, 96, 79, 206, 173, 74, 176, 36, 36, + 73, 68, 88, 61, 15, 162, 41, 32, 43, 108, 14, 168, 196, 225, 67, 34, + 82, 115, 213, 137, 28, 166, 128, 134, 83, 64, 199, 25, 80, 196, 9, 96, + 252, 151, 199, 63, 62, 242, 8, 14, 16, 13, 56, 181, 77, 74, 13, 182, + 153, 32, 119, 80, 233, 112, 188, 217, 193, 228, 117, 55, 174, 177, 68, 175, + 244, 83, 147, 186, 117, 53, 104, 39, 153, 84, 124, 70, 5, 101, 237, 254, + 152, 42, 109, 70, 86, 16, 81, 80, 232, 142, 34, 253, 229, 221, 221, 108, + 57, 171, 244, 249, 172, 223, 117, 209, 169, 215, 195, 120, 133, 30, 99, 228, + 202, 21, 29, 178, 61, 163, 152, 158, 129, 36, 71, 98, 49, 199, 13, 221, + 102, 106, 25, 118, 4, 101, 16, 152, 57, 237, 135, 196, 145, 219, 155, 160, + 119, 3, 14, 54, 234, 243, 2, 13, 101, 185, 4, 181, 137, 121, 165, 206, + 164, 125, 194, 34, 131, 24, 196, 139, 69, 139, 156, 150, 133, 206, 226, 150, + 228, 125, 81, 91, 223, 63, 51, 197, 250, 101, 169, 207, 200, 145, 236, 161, + 230, 185, 163, 254, 120, 216, 31, 172, 82, 221, 74, 232, 26, 1, 105, 99, + 199, 184, 101, 244, 243, 64, 213, 141, 120, 119, 99, 138, 70, 178, 178, 122, + 134, 45, 23, 252, 126, 59, 150, 235, 250, 106, 115, 198, 110, 173, 235, 166, + 149, 214, 169, 75, 27, 106, 124, 238, 246, 61, 42, 138, 26, 17, 196, 84, + 166, 129, 152, 182, 123, 165, 134, 175, 40, 23, 12, 33, 72, 98, 130, 43, + 194, 37, 137, 168, 8, 10, 12, 172, 140, 70, 23, 12, 81, 59, 57, 84, + 169, 58, 125, 188, 157, 65, 35, 94, 105, 101, 157, 204, 188, 33, 106, 93, + 7, 76, 162, 94, 34, 119, 35, 69, 244, 62, 20, 31, 53, 149, 139, 34, + 51, 167, 202, 116, 120, 180, 85, 249, 125, 180, 134, 177, 60, 87, 215, 144, + 34, 70, 68, 213, 43, 210, 234, 25, 129, 159, 96, 118, 204, 96, 142, 11, + 104, 244, 124, 120, 5, 250, 166, 126, 9, 137, 75, 175, 58, 179, 49, 100, + 218, 209, 184, 63, 180, 239, 158, 137, 165, 209, 79, 233, 43, 81, 145, 162, + 249, 134, 103, 27, 4, 181, 137, 247, 141, 198, 128, 45, 56, 42, 16, 97, + 29, 163, 199, 76, 150, 72, 116, 86, 189, 56, 124, 220, 18, 80, 116, 58, + 203, 64, 171, 44, 202, 25, 167, 71, 150, 89, 35, 6, 205, 142, 0, 79, + 242, 92, 80, 10, 149, 185, 4, 192, 14, 255, 251, 229, 83, 125, 157, 244, + 72, 166, 85, 161, 254, 151, 135, 47, 137, 148, 249, 230, 212, 12, 134, 116, + 245, 188, 12, 73, 0, 59, 218, 97, 86, 131, 26, 76, 228, 174, 221, 125, + 160, 246, 150, 3, 238, 175, 108, 64, 232, 138, 66, 138, 214, 73, 1, 37, + 251, 43, 75, 41, 94, 96, 68, 145, 206, 255, 163, 43, 41, 170, 208, 43, + 53, 238, 217, 53, 15, 45, 190, 106, 236, 190, 247, 141, 90, 39, 162, 62, + 56, 196, 34, 158, 104, 226, 224, 37, 78, 84, 109, 164, 216, 41, 2, 144, + 76, 249, 193, 170, 39, 107, 246, 106, 245, 153, 191, 71, 172, 55, 123, 33, + 125, 154, 13, 46, 102, 227, 241, 62, 94, 52, 205, 104, 117, 153, 94, 23, + 171, 54, 90, 201, 159, 142, 136, 98, 52, 141, 16, 109, 100, 133, 135, 165, + 212, 168, 91, 142, 187, 252, 27, 253, 253, 177, 108, 176, 203, 113, 135, 164, + 50, 131, 37, 155, 202, 68, 108, 9, 41, 38, 42, 41, 212, 71, 145, 178, + 78, 34, 134, 28, 139, 193, 175, 248, 142, 158, 69, 137, 18, 254, 242, 39, + 244, 20, 74, 240, 174, 74, 241, 59, 61, 116, 81, 27, 226, 190, 147, 22, + 19, 145, 93, 160, 107, 150, 200, 65, 123, 45, 135, 128, 147, 10, 156, 238, + 198, 239, 12, 223, 201, 83, 167, 236, 101, 50, 48, 24, 243, 119, 166, 65, + 56, 0, 171, 231, 65, 112, 76, 121, 99, 8, 131, 25, 98, 112, 77, 219, + 235, 187, 35, 123, 153, 185, 73, 48, 48, 56, 152, 132, 203, 201, 18, 119, + 32, 201, 162, 62, 58, 123, 99, 231, 154, 87, 42, 61, 104, 212, 88, 189, + 89, 181, 162, 96, 230, 135, 143, 213, 39, 16, 68, 165, 18, 255, 173, 154, + 144, 92, 95, 169, 12, 48, 190, 94, 13, 175, 60, 31, 223, 238, 199, 88, + 68, 70, 120, 40, 95, 69, 228, 234, 177, 190, 139, 22, 194, 170, 50, 62, + 92, 237, 88, 181, 94, 169, 57, 61, 49, 81, 92, 223, 15, 140, 63, 26, + 72, 79, 134, 177, 84, 225, 53, 73, 122, 244, 87, 180, 32, 76, 245, 209, + 250, 199, 138, 121, 165, 246, 143, 238, 10, 231, 22, 111, 220, 183, 209, 83, + 3, 95, 175, 117, 113, 29, 63, 180, 106, 189, 94, 141, 139, 137, 172, 233, + 42, 100, 56, 213, 161, 209, 118, 28, 225, 7, 141, 71, 184, 152, 89, 118, + 211, 30, 227, 145, 19, 107, 66, 174, 116, 233, 145, 39, 25, 72, 111, 182, + 12, 248, 49, 137, 93, 200, 113, 233, 217, 61, 102, 194, 250, 207, 196, 34, + 34, 119, 44, 98, 8, 222, 229, 105, 212, 244, 81, 102, 254, 91, 32, 171, + 154, 75, 213, 167, 180, 200, 72, 134, 127, 72, 118, 2, 90, 200, 193, 73, + 2, 213, 24, 50, 29, 124, 137, 195, 153, 38, 4, 216, 235, 20, 28, 136, + 8, 58, 82, 38, 20, 201, 123, 182, 135, 165, 110, 14, 251, 163, 142, 70, + 39, 162, 249, 242, 57, 210, 186, 86, 126, 72, 153, 30, 52, 171, 247, 194, + 177, 214, 5, 183, 41, 113, 247, 167, 138, 168, 231, 99, 140, 54, 250, 51, + 212, 215, 85, 102, 110, 150, 12, 71, 229, 79, 61, 15, 31, 51, 235, 28, + 188, 28, 23, 114, 189, 60, 145, 199, 227, 77, 118, 47, 147, 102, 191, 176, + 138, 41, 230, 171, 128, 30, 56, 86, 77, 48, 58, 9, 94, 159, 3, 112, + 62, 13, 155, 234, 188, 58, 218, 56, 216, 217, 108, 122, 184, 151, 71, 59, + 232, 143, 58, 29, 108, 230, 183, 131, 141, 55, 23, 45, 251, 216, 4, 167, + 5, 98, 253, 87, 50, 113, 144, 147, 245, 121, 101, 116, 101, 37, 100, 120, + 124, 30, 197, 38, 17, 247, 184, 17, 218, 247, 173, 204, 77, 253, 219, 185, + 165, 231, 12, 155, 146, 111, 150, 162, 253, 205, 82, 86, 102, 246, 42, 234, + 121, 162, 54, 9, 34, 18, 174, 239, 0, 90, 51, 19, 40, 136, 71, 195, + 7, 103, 6, 37, 184, 171, 93, 253, 89, 19, 164, 217, 30, 251, 47, 140, + 137, 176, 91, 176, 68, 138, 5, 72, 174, 163, 152, 9, 230, 51, 1, 91, + 136, 222, 138, 255, 87, 119, 95, 190, 222, 182, 177, 228, 123, 255, 230, 83, + 32, 8, 124, 204, 5, 164, 176, 144, 20, 37, 153, 202, 216, 217, 191, 201, + 226, 227, 228, 30, 207, 140, 44, 107, 40, 18, 18, 17, 113, 11, 23, 139, + 180, 134, 124, 150, 251, 44, 247, 201, 110, 253, 170, 186, 129, 6, 72, 74, + 116, 146, 51, 247, 126, 55, 177, 64, 160, 215, 234, 173, 186, 186, 186, 150, + 74, 38, 206, 248, 130, 138, 95, 34, 160, 147, 20, 85, 121, 164, 168, 234, + 97, 69, 101, 214, 203, 252, 195, 227, 8, 127, 254, 225, 147, 8, 99, 74, + 126, 32, 78, 167, 138, 247, 32, 243, 126, 167, 51, 221, 50, 11, 242, 24, + 140, 122, 207, 231, 140, 122, 35, 125, 2, 80, 164, 61, 20, 84, 41, 55, + 7, 236, 98, 34, 254, 60, 103, 67, 72, 216, 107, 49, 76, 43, 27, 172, + 197, 247, 53, 121, 100, 242, 117, 50, 41, 119, 201, 31, 22, 42, 211, 154, + 149, 42, 0, 176, 41, 250, 251, 23, 176, 134, 115, 191, 22, 238, 104, 159, + 191, 250, 194, 212, 63, 170, 89, 117, 113, 58, 105, 127, 53, 190, 31, 161, + 112, 86, 47, 153, 189, 99, 43, 142, 212, 105, 227, 251, 168, 247, 153, 237, + 54, 192, 66, 102, 57, 124, 24, 134, 52, 14, 201, 25, 25, 162, 234, 127, + 153, 150, 151, 10, 31, 225, 62, 166, 225, 85, 27, 94, 89, 32, 56, 186, + 199, 52, 75, 67, 250, 235, 163, 190, 132, 84, 182, 210, 84, 50, 105, 24, + 218, 124, 7, 212, 114, 132, 100, 70, 239, 63, 171, 242, 207, 185, 70, 203, + 167, 246, 123, 237, 124, 201, 103, 34, 123, 213, 189, 238, 178, 238, 26, 223, + 1, 100, 93, 99, 107, 42, 188, 149, 137, 55, 55, 126, 174, 50, 88, 154, + 198, 89, 56, 40, 52, 130, 2, 157, 106, 59, 117, 168, 83, 111, 71, 213, + 243, 185, 182, 147, 52, 178, 185, 205, 58, 155, 249, 130, 183, 115, 31, 239, + 171, 96, 59, 105, 43, 95, 209, 118, 146, 147, 221, 73, 194, 196, 198, 12, + 119, 56, 119, 118, 32, 26, 137, 102, 63, 163, 143, 117, 176, 18, 184, 200, + 50, 0, 101, 100, 141, 197, 240, 209, 130, 134, 9, 254, 154, 242, 103, 78, + 128, 132, 67, 46, 243, 168, 215, 237, 198, 212, 172, 132, 135, 230, 183, 253, + 154, 207, 22, 28, 130, 182, 24, 114, 0, 55, 45, 127, 198, 205, 210, 136, + 153, 146, 68, 252, 140, 201, 161, 157, 42, 166, 102, 226, 12, 204, 250, 210, + 229, 88, 254, 172, 60, 136, 184, 113, 1, 155, 126, 212, 139, 166, 161, 193, + 245, 243, 235, 109, 66, 46, 247, 113, 111, 222, 87, 26, 93, 117, 120, 210, + 94, 91, 125, 182, 107, 107, 132, 5, 235, 194, 136, 114, 118, 233, 111, 72, + 127, 90, 97, 203, 15, 97, 223, 49, 236, 181, 225, 250, 137, 21, 193, 28, + 46, 205, 117, 164, 132, 210, 209, 188, 51, 42, 58, 199, 16, 98, 12, 155, + 30, 238, 238, 161, 176, 131, 7, 244, 119, 30, 156, 86, 25, 31, 144, 187, + 58, 73, 222, 124, 79, 94, 173, 217, 128, 181, 123, 104, 238, 207, 248, 37, + 216, 234, 204, 50, 23, 18, 238, 170, 121, 13, 55, 91, 202, 203, 214, 67, + 213, 105, 234, 111, 96, 29, 250, 110, 200, 183, 224, 32, 216, 32, 88, 23, + 178, 5, 176, 37, 150, 42, 81, 181, 89, 133, 34, 17, 158, 216, 47, 100, + 85, 245, 213, 63, 67, 206, 74, 223, 187, 77, 83, 236, 202, 114, 16, 226, + 47, 35, 132, 109, 39, 63, 170, 54, 172, 35, 45, 226, 205, 234, 16, 59, + 205, 60, 209, 48, 94, 15, 198, 221, 187, 217, 182, 211, 52, 237, 191, 222, + 206, 154, 192, 179, 215, 133, 183, 44, 13, 254, 29, 171, 28, 152, 38, 27, + 24, 193, 159, 247, 225, 200, 25, 147, 91, 142, 16, 236, 213, 217, 241, 115, + 82, 228, 214, 48, 151, 207, 9, 207, 61, 43, 81, 166, 194, 98, 132, 151, + 217, 4, 54, 222, 18, 159, 21, 170, 33, 75, 182, 222, 179, 9, 8, 167, + 207, 30, 33, 88, 83, 149, 232, 208, 162, 51, 44, 23, 131, 42, 68, 58, + 104, 176, 88, 145, 235, 198, 165, 127, 15, 206, 77, 25, 138, 85, 52, 172, + 172, 185, 239, 25, 21, 166, 67, 230, 183, 196, 78, 82, 50, 198, 184, 148, + 73, 98, 171, 74, 95, 199, 111, 90, 240, 170, 250, 35, 213, 46, 63, 16, + 199, 209, 14, 93, 156, 31, 93, 250, 167, 66, 64, 164, 232, 121, 124, 159, + 159, 181, 150, 158, 181, 5, 153, 181, 122, 134, 178, 141, 169, 244, 53, 200, + 206, 219, 80, 207, 219, 186, 76, 34, 8, 252, 128, 120, 3, 77, 233, 105, + 161, 96, 191, 1, 87, 209, 98, 171, 168, 144, 220, 107, 85, 148, 198, 186, + 114, 4, 33, 152, 206, 43, 40, 23, 104, 201, 180, 204, 151, 24, 138, 235, + 57, 214, 226, 96, 3, 195, 174, 159, 106, 120, 136, 156, 33, 223, 101, 242, + 78, 159, 113, 151, 82, 72, 244, 231, 29, 255, 56, 145, 144, 246, 37, 160, + 149, 4, 136, 212, 167, 127, 194, 1, 91, 130, 75, 193, 46, 193, 37, 37, + 6, 164, 80, 240, 35, 11, 198, 203, 46, 151, 102, 70, 189, 178, 46, 234, + 149, 137, 228, 240, 48, 181, 232, 152, 99, 216, 113, 201, 81, 111, 124, 253, + 27, 29, 141, 120, 149, 40, 74, 105, 71, 164, 227, 19, 221, 38, 82, 170, + 162, 81, 8, 153, 85, 152, 223, 41, 244, 174, 49, 177, 10, 59, 203, 219, + 85, 139, 125, 101, 179, 192, 67, 221, 101, 145, 87, 67, 90, 159, 181, 124, + 53, 234, 173, 177, 71, 247, 123, 113, 228, 222, 95, 51, 183, 226, 225, 132, + 73, 60, 116, 111, 40, 103, 242, 134, 156, 55, 217, 47, 30, 11, 169, 137, + 23, 39, 117, 55, 105, 74, 164, 231, 192, 48, 125, 87, 237, 4, 82, 27, + 108, 255, 111, 5, 150, 227, 118, 192, 115, 5, 110, 42, 77, 135, 81, 164, + 85, 57, 19, 242, 115, 103, 114, 176, 86, 175, 199, 203, 124, 98, 39, 220, + 153, 26, 140, 214, 201, 106, 218, 25, 198, 61, 70, 11, 135, 228, 1, 7, + 118, 54, 233, 71, 83, 3, 34, 159, 81, 71, 32, 24, 36, 92, 239, 204, + 7, 190, 235, 124, 60, 93, 200, 114, 199, 74, 0, 194, 131, 32, 69, 195, + 83, 213, 134, 9, 161, 187, 171, 128, 6, 21, 112, 187, 154, 142, 25, 214, + 160, 126, 0, 168, 77, 202, 113, 31, 197, 83, 100, 8, 131, 3, 50, 28, + 83, 134, 238, 98, 130, 134, 5, 173, 3, 210, 235, 169, 242, 137, 131, 164, + 179, 125, 218, 96, 233, 92, 127, 100, 208, 116, 222, 63, 58, 120, 58, 255, + 159, 30, 68, 93, 80, 102, 48, 63, 165, 171, 205, 49, 245, 15, 25, 83, + 157, 49, 29, 219, 230, 174, 185, 19, 13, 162, 15, 172, 235, 145, 37, 26, + 142, 2, 113, 16, 199, 178, 149, 80, 17, 116, 129, 2, 74, 107, 145, 19, + 250, 140, 45, 66, 242, 189, 128, 160, 112, 16, 38, 216, 112, 66, 54, 232, + 173, 236, 27, 242, 70, 13, 165, 150, 50, 2, 30, 196, 177, 20, 190, 175, + 217, 41, 45, 100, 128, 146, 186, 53, 117, 195, 230, 183, 12, 172, 13, 92, + 91, 216, 2, 51, 15, 56, 16, 22, 200, 7, 131, 142, 213, 122, 107, 217, + 148, 89, 177, 152, 237, 34, 92, 165, 157, 35, 166, 22, 148, 154, 30, 108, + 40, 47, 122, 209, 161, 29, 148, 36, 79, 123, 250, 153, 238, 181, 192, 154, + 11, 201, 40, 118, 243, 50, 228, 91, 186, 173, 152, 21, 102, 1, 80, 167, + 128, 108, 67, 235, 73, 67, 117, 186, 92, 51, 115, 217, 141, 70, 54, 147, + 70, 50, 137, 182, 189, 49, 230, 79, 181, 91, 73, 121, 155, 220, 213, 136, + 124, 129, 219, 149, 240, 190, 232, 231, 26, 147, 40, 136, 102, 210, 26, 13, + 50, 9, 207, 93, 101, 26, 219, 88, 174, 108, 214, 91, 212, 221, 181, 149, + 149, 145, 25, 135, 40, 140, 182, 35, 137, 175, 147, 116, 23, 215, 187, 83, + 4, 73, 33, 26, 83, 237, 72, 20, 234, 68, 9, 74, 106, 214, 221, 48, + 216, 145, 210, 196, 59, 192, 54, 240, 120, 39, 72, 199, 156, 71, 59, 50, + 230, 55, 141, 39, 146, 231, 118, 140, 39, 82, 103, 183, 139, 39, 18, 183, + 116, 99, 167, 139, 235, 248, 142, 242, 52, 220, 198, 142, 100, 230, 150, 242, + 196, 40, 152, 219, 200, 227, 163, 97, 110, 29, 79, 142, 138, 185, 87, 100, + 71, 199, 111, 186, 173, 71, 50, 252, 225, 65, 218, 179, 41, 116, 145, 107, + 132, 199, 129, 249, 115, 123, 195, 129, 185, 50, 27, 195, 129, 121, 182, 6, + 19, 142, 222, 245, 128, 14, 58, 112, 145, 116, 123, 40, 158, 68, 242, 20, + 75, 66, 61, 250, 211, 176, 164, 89, 93, 182, 250, 71, 176, 164, 62, 28, + 216, 23, 225, 87, 150, 202, 113, 105, 151, 220, 201, 120, 86, 164, 227, 133, + 50, 248, 46, 102, 192, 50, 149, 100, 81, 106, 190, 174, 45, 148, 138, 186, + 59, 163, 222, 120, 184, 243, 44, 158, 225, 138, 224, 216, 44, 135, 202, 198, + 246, 161, 82, 177, 66, 154, 201, 65, 242, 56, 121, 107, 101, 78, 148, 39, + 250, 64, 169, 125, 127, 89, 69, 13, 211, 3, 146, 207, 214, 37, 54, 145, + 154, 96, 244, 160, 80, 124, 240, 221, 127, 241, 40, 28, 238, 185, 233, 213, + 151, 187, 190, 144, 125, 202, 120, 30, 99, 87, 221, 8, 194, 165, 15, 239, + 181, 229, 33, 161, 158, 152, 89, 178, 160, 94, 19, 230, 77, 145, 222, 161, + 11, 12, 235, 170, 101, 41, 208, 91, 91, 59, 66, 169, 119, 42, 84, 2, + 120, 184, 116, 12, 132, 149, 71, 252, 81, 50, 54, 161, 198, 198, 215, 244, + 249, 80, 157, 187, 30, 196, 190, 36, 167, 202, 190, 200, 13, 47, 21, 119, + 33, 54, 121, 126, 11, 149, 214, 78, 106, 226, 69, 93, 247, 240, 25, 154, + 237, 117, 102, 143, 132, 186, 129, 94, 66, 147, 42, 123, 51, 58, 2, 88, + 6, 100, 139, 244, 94, 119, 204, 196, 46, 64, 86, 198, 111, 51, 137, 131, + 108, 226, 213, 32, 86, 243, 111, 95, 134, 12, 97, 10, 11, 58, 153, 216, + 186, 81, 92, 152, 33, 64, 245, 88, 128, 231, 3, 227, 59, 169, 13, 30, + 80, 46, 199, 98, 106, 161, 190, 214, 190, 149, 149, 100, 218, 136, 173, 146, + 219, 188, 2, 94, 81, 122, 153, 247, 208, 0, 192, 100, 44, 94, 56, 15, + 176, 213, 122, 117, 223, 95, 43, 255, 135, 37, 248, 109, 84, 82, 32, 249, + 188, 182, 54, 18, 77, 31, 217, 213, 33, 160, 148, 147, 202, 83, 211, 126, + 25, 125, 69, 241, 18, 164, 12, 65, 243, 61, 214, 149, 92, 95, 176, 252, + 117, 0, 133, 117, 67, 200, 44, 145, 2, 84, 252, 197, 160, 92, 116, 2, + 168, 187, 176, 33, 41, 214, 164, 195, 68, 179, 42, 59, 222, 89, 74, 20, + 250, 208, 33, 207, 146, 149, 92, 35, 136, 156, 187, 54, 73, 69, 135, 128, + 99, 20, 53, 135, 77, 170, 86, 89, 27, 11, 22, 19, 28, 226, 3, 13, + 170, 94, 208, 134, 210, 230, 126, 10, 115, 118, 223, 51, 137, 203, 203, 35, + 39, 56, 35, 16, 139, 43, 24, 52, 44, 78, 217, 51, 125, 25, 214, 6, + 109, 103, 238, 217, 144, 71, 47, 207, 75, 174, 74, 225, 75, 10, 101, 233, + 71, 167, 168, 115, 10, 182, 149, 75, 208, 82, 235, 78, 42, 69, 182, 98, + 126, 82, 42, 79, 75, 244, 31, 171, 86, 12, 106, 5, 241, 83, 51, 134, + 219, 97, 107, 9, 254, 148, 216, 114, 96, 45, 196, 226, 195, 243, 47, 191, + 31, 18, 98, 122, 46, 231, 26, 160, 164, 126, 169, 80, 169, 136, 223, 179, + 234, 5, 29, 236, 97, 143, 37, 6, 118, 141, 181, 37, 69, 229, 220, 147, + 58, 168, 201, 29, 180, 44, 248, 202, 178, 152, 219, 176, 146, 215, 160, 188, + 178, 42, 204, 125, 74, 122, 114, 105, 125, 68, 215, 52, 10, 161, 78, 228, + 167, 233, 9, 178, 149, 213, 65, 111, 211, 138, 219, 237, 123, 122, 70, 104, + 208, 77, 205, 196, 10, 43, 72, 174, 194, 1, 253, 76, 26, 49, 91, 91, + 149, 178, 172, 108, 103, 38, 76, 35, 54, 221, 149, 132, 62, 56, 51, 152, + 187, 162, 238, 1, 2, 192, 89, 36, 184, 220, 182, 242, 132, 226, 131, 203, + 194, 51, 200, 51, 40, 133, 216, 184, 150, 227, 117, 137, 78, 166, 86, 202, + 84, 38, 80, 25, 219, 165, 26, 207, 108, 134, 65, 25, 241, 78, 220, 230, + 236, 82, 194, 221, 242, 61, 0, 102, 135, 169, 70, 221, 200, 154, 9, 19, + 198, 175, 44, 8, 212, 54, 103, 89, 196, 14, 145, 44, 80, 143, 221, 37, + 227, 157, 49, 196, 54, 44, 56, 13, 25, 40, 215, 158, 183, 157, 176, 178, + 164, 73, 84, 103, 195, 204, 180, 183, 96, 194, 106, 139, 155, 188, 227, 150, + 242, 46, 254, 138, 16, 138, 244, 253, 247, 44, 36, 21, 188, 135, 201, 124, + 48, 241, 113, 45, 39, 87, 104, 202, 84, 121, 200, 172, 231, 94, 60, 163, + 238, 89, 153, 240, 9, 133, 205, 150, 250, 105, 54, 251, 176, 183, 188, 102, + 241, 114, 159, 237, 228, 103, 89, 213, 105, 3, 7, 227, 93, 186, 190, 249, + 166, 137, 161, 116, 106, 161, 253, 111, 109, 39, 160, 165, 17, 86, 97, 43, + 139, 214, 34, 181, 145, 218, 230, 248, 118, 161, 119, 171, 169, 124, 17, 107, + 23, 157, 234, 140, 241, 229, 241, 116, 20, 77, 175, 180, 188, 184, 113, 221, + 113, 188, 235, 66, 38, 107, 175, 161, 136, 126, 107, 156, 113, 255, 132, 239, + 89, 168, 226, 76, 122, 169, 254, 30, 40, 230, 248, 12, 27, 13, 181, 246, + 61, 219, 243, 56, 147, 173, 167, 89, 42, 92, 221, 94, 95, 221, 220, 3, + 115, 31, 231, 44, 37, 132, 28, 119, 173, 226, 178, 160, 178, 253, 201, 4, + 212, 20, 197, 10, 200, 112, 43, 220, 104, 175, 237, 157, 138, 60, 117, 17, + 198, 201, 21, 225, 139, 138, 76, 125, 237, 66, 71, 148, 249, 124, 76, 173, + 40, 11, 87, 216, 99, 170, 137, 17, 86, 173, 33, 97, 186, 206, 74, 92, + 69, 237, 128, 79, 44, 36, 239, 42, 30, 136, 32, 175, 64, 97, 109, 23, + 176, 63, 119, 114, 253, 185, 187, 89, 222, 197, 190, 154, 121, 234, 18, 134, + 185, 95, 87, 217, 69, 64, 147, 213, 125, 111, 48, 97, 21, 5, 99, 41, + 70, 117, 11, 86, 160, 250, 240, 210, 172, 213, 82, 31, 27, 139, 173, 49, + 216, 5, 213, 30, 152, 68, 12, 200, 63, 111, 123, 34, 135, 205, 98, 216, + 156, 164, 68, 107, 138, 166, 230, 237, 180, 173, 125, 73, 221, 198, 195, 201, + 90, 23, 56, 43, 96, 3, 7, 23, 218, 78, 77, 153, 36, 30, 168, 222, + 161, 136, 119, 182, 189, 102, 250, 150, 75, 121, 184, 22, 67, 182, 202, 189, + 25, 5, 81, 102, 85, 197, 145, 163, 147, 213, 232, 79, 64, 228, 110, 38, + 172, 86, 244, 222, 243, 255, 165, 116, 228, 151, 187, 209, 247, 174, 57, 182, + 127, 30, 64, 137, 67, 172, 20, 178, 190, 60, 11, 225, 100, 130, 60, 14, + 18, 167, 100, 21, 78, 131, 31, 87, 17, 131, 67, 218, 151, 79, 158, 149, + 105, 156, 226, 225, 154, 47, 171, 32, 124, 195, 223, 63, 174, 215, 5, 182, + 129, 228, 12, 229, 126, 140, 232, 76, 218, 162, 3, 32, 62, 22, 210, 90, + 171, 242, 10, 250, 70, 29, 250, 246, 60, 242, 57, 236, 188, 115, 32, 79, + 245, 173, 67, 221, 109, 9, 22, 122, 240, 91, 213, 70, 115, 109, 77, 162, + 233, 112, 129, 85, 178, 250, 216, 93, 202, 196, 110, 41, 229, 126, 101, 130, + 7, 55, 38, 134, 154, 191, 186, 28, 228, 25, 198, 91, 39, 124, 158, 248, + 90, 239, 143, 205, 69, 7, 158, 87, 118, 154, 98, 36, 154, 141, 44, 17, + 77, 184, 11, 172, 154, 72, 50, 181, 10, 179, 126, 124, 51, 7, 142, 22, + 74, 230, 190, 12, 98, 206, 57, 126, 86, 74, 108, 157, 203, 46, 253, 112, + 127, 20, 36, 146, 73, 143, 23, 169, 204, 86, 231, 224, 176, 182, 106, 202, + 212, 194, 194, 254, 143, 117, 32, 139, 42, 40, 227, 58, 137, 239, 46, 209, + 185, 79, 229, 22, 84, 188, 97, 246, 72, 27, 23, 209, 250, 226, 108, 94, + 186, 172, 182, 163, 186, 178, 91, 144, 41, 60, 241, 255, 181, 167, 112, 109, + 148, 196, 80, 213, 82, 133, 239, 196, 154, 167, 98, 101, 40, 37, 65, 225, + 170, 119, 91, 192, 35, 254, 241, 60, 30, 86, 194, 160, 160, 84, 144, 100, + 34, 178, 107, 4, 45, 149, 200, 10, 175, 218, 56, 58, 187, 77, 137, 59, + 231, 208, 1, 121, 209, 86, 134, 141, 133, 216, 206, 101, 86, 138, 29, 134, + 110, 75, 206, 186, 21, 151, 249, 162, 141, 2, 140, 246, 238, 76, 117, 222, + 206, 3, 197, 173, 201, 57, 12, 54, 19, 9, 65, 2, 161, 175, 157, 8, + 208, 211, 8, 48, 155, 66, 232, 127, 141, 221, 188, 63, 143, 221, 188, 63, + 131, 221, 60, 187, 96, 90, 72, 52, 221, 136, 53, 235, 106, 51, 54, 92, + 147, 25, 13, 121, 196, 26, 155, 246, 126, 45, 22, 99, 43, 187, 250, 128, + 189, 75, 131, 168, 101, 153, 57, 81, 22, 212, 238, 205, 176, 178, 188, 229, + 55, 158, 252, 111, 26, 174, 224, 45, 118, 111, 14, 149, 225, 155, 212, 104, + 139, 80, 216, 201, 113, 43, 217, 244, 194, 96, 237, 134, 1, 175, 18, 63, + 179, 237, 37, 46, 16, 18, 199, 22, 180, 55, 34, 83, 127, 93, 173, 183, + 164, 99, 183, 212, 29, 114, 51, 160, 208, 153, 95, 101, 96, 244, 18, 40, + 217, 59, 79, 226, 245, 163, 81, 82, 72, 68, 136, 236, 194, 208, 178, 111, + 34, 86, 60, 193, 217, 58, 213, 54, 176, 141, 152, 192, 140, 241, 205, 152, + 208, 140, 9, 204, 24, 225, 195, 49, 239, 35, 209, 138, 48, 227, 27, 105, + 124, 34, 133, 181, 167, 146, 230, 163, 73, 51, 181, 30, 167, 73, 31, 209, + 164, 176, 149, 233, 190, 60, 63, 189, 162, 74, 65, 20, 140, 10, 173, 172, + 217, 152, 206, 192, 21, 119, 105, 177, 233, 71, 63, 229, 173, 167, 102, 124, + 166, 80, 110, 74, 58, 52, 76, 188, 28, 106, 153, 139, 165, 149, 46, 217, + 206, 78, 98, 119, 167, 244, 209, 22, 177, 75, 36, 46, 209, 181, 68, 204, + 150, 44, 58, 64, 188, 119, 154, 239, 157, 227, 247, 78, 171, 100, 152, 72, + 22, 242, 64, 91, 241, 48, 8, 221, 176, 112, 211, 233, 69, 10, 4, 75, + 168, 100, 159, 21, 75, 83, 130, 55, 71, 155, 3, 204, 206, 96, 23, 184, + 245, 127, 58, 184, 117, 195, 182, 80, 187, 198, 196, 9, 86, 157, 31, 102, + 221, 166, 94, 161, 81, 186, 53, 70, 75, 234, 249, 150, 128, 127, 99, 174, + 149, 125, 122, 205, 105, 173, 138, 94, 8, 216, 248, 10, 205, 46, 26, 199, + 226, 136, 206, 106, 214, 232, 5, 29, 59, 232, 224, 61, 114, 11, 75, 56, + 184, 231, 173, 119, 193, 28, 136, 210, 89, 97, 101, 4, 245, 37, 136, 61, + 223, 148, 96, 30, 26, 239, 159, 179, 131, 5, 44, 248, 146, 145, 20, 220, + 179, 82, 38, 218, 127, 60, 58, 120, 60, 58, 68, 180, 115, 92, 6, 78, + 169, 88, 69, 191, 234, 28, 151, 202, 185, 228, 37, 181, 8, 62, 147, 157, + 90, 137, 179, 36, 222, 103, 21, 206, 105, 179, 16, 10, 199, 231, 232, 0, + 200, 186, 108, 169, 197, 75, 7, 138, 136, 1, 239, 159, 250, 124, 205, 26, + 227, 129, 177, 195, 103, 100, 235, 107, 204, 17, 110, 230, 141, 249, 221, 40, + 215, 137, 35, 241, 165, 150, 115, 66, 104, 204, 17, 184, 6, 239, 116, 231, + 169, 224, 211, 17, 68, 146, 130, 103, 235, 132, 238, 243, 13, 99, 139, 202, + 15, 1, 189, 16, 241, 48, 138, 238, 175, 216, 167, 49, 125, 203, 251, 232, + 118, 222, 111, 195, 194, 26, 125, 45, 85, 138, 149, 250, 237, 140, 110, 7, + 81, 155, 103, 24, 171, 53, 104, 123, 232, 139, 162, 239, 10, 255, 170, 200, + 12, 117, 34, 213, 216, 99, 143, 148, 252, 224, 196, 238, 191, 192, 166, 173, + 100, 151, 79, 176, 191, 175, 175, 38, 99, 234, 192, 25, 7, 197, 23, 205, + 203, 117, 97, 162, 139, 44, 58, 73, 52, 145, 206, 229, 5, 45, 41, 136, + 148, 251, 173, 103, 40, 56, 5, 251, 65, 92, 50, 87, 252, 181, 9, 63, + 247, 68, 224, 110, 23, 229, 76, 164, 44, 72, 203, 7, 222, 179, 146, 46, + 108, 169, 96, 104, 85, 168, 231, 38, 151, 107, 213, 108, 9, 60, 49, 3, + 117, 35, 248, 183, 66, 101, 5, 224, 95, 16, 136, 241, 77, 113, 113, 206, + 106, 220, 46, 238, 20, 52, 1, 151, 14, 161, 147, 2, 168, 252, 137, 50, + 243, 90, 73, 133, 37, 101, 51, 67, 90, 18, 47, 37, 120, 85, 168, 200, + 93, 57, 70, 89, 155, 100, 74, 12, 136, 39, 200, 65, 172, 161, 41, 230, + 82, 173, 38, 6, 158, 226, 241, 8, 103, 147, 70, 185, 8, 33, 174, 32, + 60, 247, 216, 86, 146, 239, 149, 222, 227, 179, 92, 116, 146, 190, 196, 130, + 37, 184, 161, 191, 36, 29, 8, 153, 167, 138, 152, 88, 42, 169, 252, 245, + 115, 168, 168, 55, 56, 115, 125, 43, 51, 229, 86, 228, 93, 59, 177, 131, + 196, 162, 86, 229, 98, 128, 28, 141, 93, 57, 18, 59, 84, 26, 94, 86, + 251, 1, 20, 207, 180, 191, 110, 220, 4, 36, 62, 73, 58, 75, 177, 111, + 81, 48, 202, 58, 75, 187, 207, 56, 40, 174, 10, 147, 233, 248, 118, 10, + 255, 224, 15, 69, 231, 28, 166, 198, 112, 8, 243, 121, 120, 120, 137, 129, + 7, 47, 246, 83, 183, 237, 166, 209, 86, 38, 174, 79, 216, 36, 150, 56, + 1, 97, 222, 225, 135, 61, 107, 244, 17, 226, 44, 59, 15, 202, 86, 222, + 138, 67, 142, 180, 73, 23, 253, 224, 130, 218, 105, 176, 81, 197, 208, 10, + 173, 158, 18, 184, 162, 190, 197, 242, 253, 226, 235, 216, 234, 46, 134, 11, + 233, 74, 49, 114, 166, 14, 72, 30, 179, 65, 19, 99, 112, 43, 131, 193, + 26, 38, 12, 214, 135, 126, 85, 89, 130, 11, 44, 88, 17, 219, 102, 174, + 22, 234, 166, 185, 58, 131, 151, 202, 16, 207, 102, 157, 223, 198, 139, 93, + 166, 13, 53, 93, 170, 182, 71, 150, 171, 221, 113, 221, 84, 79, 37, 111, + 147, 210, 228, 122, 1, 74, 10, 45, 102, 162, 157, 8, 255, 206, 203, 172, + 27, 63, 180, 212, 167, 47, 23, 44, 150, 186, 18, 98, 11, 155, 132, 249, + 120, 233, 112, 141, 116, 80, 19, 222, 33, 65, 194, 223, 161, 18, 190, 215, + 223, 226, 34, 66, 241, 23, 37, 138, 224, 81, 23, 63, 62, 175, 184, 154, + 149, 53, 217, 159, 172, 183, 130, 185, 53, 195, 170, 156, 95, 135, 230, 26, + 24, 221, 178, 139, 228, 61, 169, 154, 146, 140, 141, 188, 36, 99, 51, 47, + 201, 152, 202, 58, 134, 166, 172, 99, 37, 145, 94, 204, 250, 130, 26, 245, + 162, 193, 245, 116, 172, 47, 48, 148, 122, 61, 172, 39, 149, 44, 177, 188, + 100, 56, 68, 99, 55, 158, 150, 68, 187, 242, 83, 48, 138, 80, 198, 169, + 104, 4, 30, 156, 198, 23, 23, 190, 24, 233, 184, 60, 21, 155, 119, 132, + 22, 147, 93, 134, 40, 155, 29, 214, 4, 249, 140, 124, 194, 54, 160, 18, + 166, 45, 163, 99, 52, 95, 153, 26, 20, 87, 146, 89, 216, 77, 33, 65, + 5, 50, 174, 109, 31, 170, 172, 237, 162, 46, 129, 239, 121, 136, 168, 141, + 96, 239, 64, 247, 3, 125, 199, 63, 199, 118, 97, 233, 185, 43, 34, 10, + 104, 210, 251, 237, 7, 251, 181, 7, 35, 193, 212, 26, 55, 88, 95, 158, + 21, 122, 175, 229, 51, 116, 235, 235, 75, 171, 106, 189, 246, 196, 70, 48, + 37, 171, 112, 50, 90, 83, 225, 250, 242, 89, 185, 247, 250, 172, 240, 145, + 81, 111, 27, 163, 90, 134, 44, 236, 23, 254, 41, 85, 4, 251, 2, 1, + 204, 3, 35, 31, 102, 80, 239, 117, 185, 232, 83, 89, 94, 237, 164, 85, + 230, 60, 20, 123, 241, 37, 133, 244, 190, 116, 191, 164, 114, 123, 95, 94, + 218, 107, 88, 247, 156, 47, 102, 237, 119, 15, 206, 210, 123, 183, 166, 159, + 149, 252, 44, 125, 249, 146, 159, 6, 63, 155, 252, 60, 230, 103, 139, 159, + 39, 252, 244, 37, 139, 207, 105, 27, 184, 225, 151, 239, 58, 126, 188, 236, + 131, 102, 203, 59, 218, 91, 151, 238, 100, 213, 110, 136, 67, 220, 76, 223, + 200, 8, 107, 176, 84, 66, 221, 3, 234, 200, 109, 78, 8, 202, 75, 32, + 187, 4, 47, 253, 250, 137, 124, 210, 210, 155, 82, 153, 83, 42, 148, 126, + 125, 218, 68, 108, 244, 203, 133, 237, 80, 129, 206, 100, 101, 83, 95, 222, + 159, 89, 73, 103, 221, 27, 125, 5, 225, 253, 51, 69, 210, 233, 254, 178, + 164, 195, 232, 3, 22, 151, 65, 115, 119, 231, 140, 226, 1, 192, 20, 16, + 76, 1, 2, 222, 232, 225, 213, 142, 31, 59, 192, 30, 146, 121, 199, 89, + 150, 185, 23, 45, 66, 98, 150, 253, 31, 152, 62, 69, 203, 126, 184, 162, + 18, 214, 182, 229, 242, 235, 10, 175, 165, 119, 163, 255, 240, 211, 88, 63, + 141, 197, 107, 201, 134, 105, 66, 58, 212, 98, 161, 45, 44, 71, 186, 25, + 125, 58, 138, 198, 163, 12, 186, 239, 97, 175, 14, 203, 98, 215, 117, 159, + 189, 81, 49, 19, 201, 183, 83, 137, 214, 57, 245, 189, 222, 179, 197, 82, + 150, 227, 87, 112, 139, 141, 187, 70, 236, 178, 214, 42, 19, 79, 4, 72, + 144, 137, 47, 44, 253, 92, 254, 58, 199, 19, 214, 109, 74, 126, 63, 151, + 191, 145, 137, 47, 44, 168, 124, 220, 191, 179, 24, 188, 245, 33, 243, 181, + 240, 51, 113, 230, 87, 225, 141, 89, 44, 6, 107, 33, 247, 140, 61, 32, + 250, 138, 211, 227, 194, 191, 221, 149, 200, 151, 68, 190, 78, 244, 106, 87, + 162, 64, 18, 5, 58, 17, 248, 100, 35, 158, 3, 207, 48, 7, 232, 177, + 192, 227, 3, 30, 75, 176, 14, 86, 120, 44, 240, 248, 224, 163, 167, 19, + 11, 89, 190, 80, 12, 162, 9, 81, 96, 151, 98, 225, 179, 12, 210, 23, + 94, 113, 151, 158, 180, 70, 43, 80, 148, 88, 187, 158, 38, 97, 224, 121, + 165, 38, 110, 68, 91, 56, 35, 152, 193, 214, 72, 83, 44, 218, 252, 234, + 82, 163, 245, 154, 101, 184, 113, 167, 179, 216, 34, 82, 214, 131, 172, 134, + 184, 155, 97, 187, 151, 62, 132, 209, 143, 68, 10, 255, 61, 111, 61, 218, + 29, 223, 94, 21, 29, 162, 151, 230, 52, 249, 110, 166, 132, 163, 82, 243, + 63, 54, 12, 236, 136, 125, 29, 118, 193, 206, 207, 32, 144, 159, 134, 252, + 180, 246, 220, 243, 28, 178, 201, 20, 18, 139, 68, 137, 61, 216, 48, 52, + 205, 119, 98, 115, 160, 103, 157, 134, 10, 36, 182, 74, 92, 190, 200, 108, + 78, 151, 235, 196, 184, 110, 97, 242, 177, 109, 127, 124, 255, 62, 0, 150, + 176, 173, 30, 62, 131, 242, 199, 17, 189, 6, 252, 110, 27, 150, 119, 117, + 226, 208, 72, 28, 150, 145, 91, 39, 111, 150, 63, 26, 25, 66, 157, 161, + 97, 100, 104, 32, 67, 61, 41, 223, 195, 103, 104, 100, 170, 235, 76, 77, + 194, 94, 185, 202, 154, 101, 46, 172, 98, 101, 107, 13, 185, 144, 58, 133, + 103, 235, 111, 232, 162, 90, 20, 229, 75, 197, 70, 105, 45, 4, 28, 35, + 151, 2, 66, 21, 215, 224, 106, 80, 189, 223, 242, 164, 162, 51, 193, 249, + 136, 133, 189, 88, 206, 238, 28, 235, 12, 78, 203, 86, 183, 90, 106, 12, + 39, 31, 75, 22, 34, 46, 96, 76, 223, 182, 50, 113, 61, 68, 246, 246, + 198, 6, 28, 29, 100, 227, 115, 147, 77, 19, 20, 161, 182, 244, 5, 103, + 148, 239, 171, 180, 150, 41, 112, 242, 209, 69, 29, 46, 23, 165, 204, 229, + 99, 160, 51, 60, 225, 132, 228, 104, 128, 115, 179, 143, 230, 240, 161, 152, + 83, 127, 146, 232, 80, 60, 106, 214, 14, 39, 58, 226, 194, 18, 167, 72, + 177, 239, 198, 94, 137, 178, 198, 129, 5, 227, 180, 124, 227, 8, 65, 161, + 11, 162, 45, 112, 18, 189, 44, 19, 189, 74, 135, 236, 145, 132, 157, 224, + 68, 121, 73, 223, 98, 157, 128, 15, 12, 206, 131, 77, 221, 98, 137, 149, + 218, 254, 44, 166, 191, 1, 253, 125, 176, 215, 96, 35, 24, 198, 1, 2, + 65, 44, 129, 250, 250, 91, 122, 195, 79, 237, 13, 234, 154, 171, 70, 49, + 98, 30, 247, 146, 111, 193, 249, 204, 77, 120, 198, 133, 116, 115, 60, 44, + 201, 239, 143, 192, 215, 10, 191, 136, 50, 33, 111, 225, 150, 93, 86, 142, + 21, 38, 197, 143, 224, 144, 20, 105, 99, 254, 104, 131, 124, 73, 3, 122, + 42, 36, 48, 130, 2, 9, 163, 127, 31, 177, 157, 91, 108, 84, 215, 34, + 10, 234, 194, 42, 122, 103, 116, 136, 44, 185, 252, 91, 87, 191, 141, 18, + 245, 151, 128, 219, 68, 179, 212, 235, 222, 54, 53, 255, 102, 248, 67, 200, + 65, 45, 103, 179, 225, 184, 7, 49, 7, 73, 142, 139, 99, 238, 85, 156, + 188, 169, 79, 91, 232, 84, 60, 62, 180, 92, 232, 81, 74, 223, 170, 91, + 10, 209, 24, 19, 146, 150, 117, 179, 2, 182, 195, 83, 201, 66, 242, 27, + 207, 134, 84, 63, 40, 4, 239, 132, 205, 92, 49, 179, 245, 138, 245, 198, + 242, 254, 123, 131, 227, 106, 232, 175, 115, 124, 239, 61, 248, 117, 199, 125, + 249, 97, 120, 54, 158, 233, 27, 160, 104, 57, 193, 73, 86, 206, 243, 108, + 115, 58, 56, 197, 93, 221, 76, 121, 175, 185, 94, 169, 148, 32, 33, 2, + 137, 247, 178, 241, 241, 60, 154, 170, 88, 127, 59, 150, 119, 23, 21, 29, + 72, 52, 247, 155, 247, 8, 221, 173, 176, 188, 116, 176, 119, 164, 80, 122, + 189, 190, 7, 165, 43, 254, 81, 216, 18, 130, 61, 60, 97, 74, 189, 238, + 201, 143, 255, 7, 8, 246, 31, 53, 193, 46, 212, 119, 150, 130, 15, 169, + 238, 166, 166, 224, 17, 241, 35, 133, 19, 1, 11, 186, 167, 85, 42, 23, + 65, 90, 254, 88, 50, 136, 251, 240, 152, 136, 251, 240, 4, 196, 125, 221, + 59, 144, 184, 183, 114, 212, 42, 232, 123, 131, 210, 102, 1, 136, 32, 211, + 48, 108, 237, 32, 8, 131, 52, 157, 116, 204, 126, 202, 92, 83, 228, 210, + 34, 69, 145, 231, 177, 106, 158, 42, 111, 184, 64, 246, 46, 16, 189, 11, + 28, 207, 74, 81, 65, 128, 155, 240, 32, 68, 80, 80, 231, 39, 223, 138, + 7, 77, 190, 160, 241, 160, 13, 92, 175, 134, 16, 218, 99, 160, 240, 45, + 170, 84, 249, 45, 223, 88, 90, 184, 62, 220, 67, 252, 91, 9, 245, 111, + 61, 70, 254, 135, 199, 41, 249, 159, 239, 81, 218, 241, 172, 255, 171, 7, + 128, 122, 248, 23, 30, 0, 82, 44, 177, 160, 20, 54, 21, 101, 175, 233, + 103, 37, 63, 75, 95, 190, 240, 227, 52, 214, 182, 77, 7, 192, 245, 149, + 237, 236, 194, 3, 20, 119, 252, 72, 92, 235, 145, 184, 147, 53, 14, 144, + 120, 248, 120, 4, 92, 17, 157, 245, 84, 14, 19, 97, 32, 162, 190, 47, + 162, 177, 47, 162, 153, 143, 96, 236, 130, 152, 227, 189, 49, 173, 189, 49, + 39, 251, 98, 2, 111, 111, 140, 159, 143, 145, 126, 64, 84, 176, 63, 106, + 171, 11, 210, 168, 173, 78, 72, 163, 182, 186, 33, 141, 218, 234, 136, 52, + 234, 152, 186, 62, 104, 225, 129, 225, 8, 49, 28, 33, 134, 131, 214, 33, + 61, 66, 30, 147, 176, 190, 182, 175, 240, 5, 132, 238, 157, 210, 64, 61, + 36, 11, 10, 169, 142, 49, 91, 120, 90, 211, 167, 103, 252, 163, 73, 139, + 7, 101, 87, 190, 222, 102, 195, 14, 237, 62, 250, 22, 171, 46, 102, 52, + 27, 218, 140, 102, 34, 12, 34, 87, 254, 234, 14, 49, 245, 222, 205, 38, + 180, 181, 211, 46, 85, 90, 98, 217, 74, 223, 114, 100, 13, 6, 41, 167, + 42, 84, 251, 239, 139, 184, 123, 71, 61, 48, 89, 77, 113, 214, 5, 79, + 138, 37, 108, 44, 150, 211, 178, 225, 100, 70, 220, 225, 152, 6, 65, 180, + 123, 61, 73, 201, 22, 42, 228, 34, 25, 150, 115, 97, 51, 152, 47, 136, + 213, 135, 104, 20, 27, 126, 126, 196, 91, 223, 28, 63, 217, 242, 253, 180, + 96, 95, 10, 134, 58, 24, 109, 49, 70, 193, 190, 89, 112, 198, 248, 135, + 50, 213, 203, 121, 124, 73, 82, 208, 94, 236, 112, 66, 123, 56, 241, 202, + 124, 126, 5, 135, 57, 149, 82, 18, 178, 174, 5, 131, 25, 191, 41, 101, + 232, 19, 252, 19, 106, 163, 41, 202, 200, 172, 107, 54, 80, 9, 125, 157, + 240, 225, 190, 234, 87, 229, 2, 157, 86, 237, 227, 153, 2, 163, 116, 48, + 116, 171, 114, 135, 142, 124, 59, 50, 209, 48, 239, 174, 227, 169, 172, 202, + 238, 72, 160, 5, 149, 184, 233, 114, 211, 24, 143, 174, 199, 187, 248, 223, + 198, 205, 34, 31, 192, 107, 44, 94, 197, 65, 176, 105, 192, 30, 146, 216, + 193, 91, 32, 97, 34, 93, 224, 23, 110, 6, 227, 177, 98, 245, 106, 91, + 93, 68, 29, 74, 32, 160, 94, 155, 17, 198, 97, 220, 75, 172, 164, 8, + 33, 12, 7, 236, 204, 84, 153, 116, 6, 209, 124, 30, 89, 26, 212, 74, + 114, 57, 95, 147, 44, 114, 111, 65, 32, 4, 144, 56, 105, 150, 214, 198, + 165, 160, 225, 195, 202, 244, 144, 194, 247, 224, 47, 160, 164, 96, 104, 27, + 55, 143, 196, 177, 137, 220, 35, 238, 102, 246, 223, 176, 159, 207, 94, 116, + 61, 190, 102, 167, 131, 187, 221, 163, 37, 183, 180, 237, 52, 44, 52, 238, + 243, 64, 210, 53, 43, 212, 64, 72, 120, 55, 203, 80, 202, 152, 151, 42, + 184, 245, 108, 136, 76, 55, 133, 181, 16, 70, 244, 87, 251, 161, 72, 103, + 22, 14, 85, 233, 224, 72, 135, 18, 156, 151, 18, 17, 243, 206, 178, 13, + 57, 231, 115, 4, 56, 68, 205, 205, 215, 133, 238, 82, 44, 108, 156, 148, + 197, 103, 253, 178, 84, 113, 166, 234, 189, 84, 42, 195, 106, 66, 161, 187, + 210, 105, 196, 121, 189, 164, 145, 119, 74, 3, 147, 10, 5, 229, 153, 163, + 102, 57, 93, 66, 97, 221, 149, 72, 147, 176, 180, 70, 213, 215, 28, 150, + 121, 5, 134, 23, 158, 169, 27, 154, 180, 183, 254, 38, 215, 52, 226, 93, + 128, 250, 159, 205, 27, 84, 197, 209, 11, 122, 114, 49, 137, 166, 55, 116, + 140, 88, 12, 58, 127, 201, 53, 132, 89, 160, 186, 137, 120, 168, 87, 177, + 224, 205, 219, 7, 47, 115, 251, 112, 146, 185, 124, 104, 29, 116, 247, 240, + 135, 239, 23, 252, 195, 239, 23, 130, 252, 253, 66, 152, 191, 95, 168, 231, + 239, 23, 26, 143, 220, 47, 204, 86, 67, 145, 178, 22, 63, 181, 65, 47, + 123, 205, 96, 90, 3, 54, 13, 238, 122, 25, 199, 176, 249, 107, 108, 102, + 107, 94, 237, 42, 189, 38, 87, 102, 162, 138, 97, 20, 168, 60, 204, 92, + 41, 169, 43, 104, 75, 237, 22, 22, 218, 5, 111, 17, 210, 98, 85, 34, + 19, 74, 176, 88, 104, 199, 51, 194, 2, 197, 184, 244, 69, 21, 39, 194, + 211, 216, 134, 168, 69, 183, 51, 101, 237, 13, 156, 17, 225, 240, 144, 102, + 14, 171, 90, 139, 62, 65, 34, 111, 217, 93, 125, 92, 178, 62, 6, 68, + 34, 222, 192, 167, 92, 112, 102, 65, 22, 226, 91, 188, 135, 103, 150, 102, + 41, 192, 207, 178, 203, 103, 93, 145, 138, 160, 99, 242, 160, 102, 141, 88, + 172, 188, 182, 148, 139, 61, 150, 187, 185, 209, 254, 110, 38, 113, 160, 212, + 58, 80, 74, 241, 13, 81, 196, 176, 19, 184, 58, 178, 157, 145, 141, 53, + 27, 208, 26, 45, 61, 163, 95, 151, 106, 3, 155, 66, 36, 118, 86, 150, + 220, 205, 213, 192, 207, 128, 128, 226, 231, 85, 108, 213, 229, 62, 253, 90, + 151, 192, 77, 56, 34, 89, 223, 242, 34, 126, 67, 64, 125, 203, 75, 245, + 13, 193, 84, 46, 50, 7, 24, 25, 144, 186, 68, 123, 217, 51, 59, 215, + 216, 238, 120, 60, 237, 205, 218, 74, 243, 71, 177, 38, 224, 104, 117, 117, + 59, 30, 89, 15, 50, 15, 36, 81, 9, 61, 166, 222, 89, 90, 53, 8, + 33, 217, 12, 181, 245, 38, 112, 242, 51, 145, 1, 61, 40, 179, 97, 73, + 110, 87, 57, 10, 17, 228, 7, 219, 188, 71, 202, 152, 127, 238, 210, 73, + 169, 75, 39, 165, 238, 50, 160, 95, 250, 91, 134, 244, 75, 127, 203, 58, + 253, 210, 223, 178, 65, 191, 244, 183, 108, 210, 111, 179, 173, 103, 12, 142, + 107, 75, 151, 30, 116, 36, 131, 108, 63, 218, 127, 193, 164, 208, 229, 103, + 237, 11, 38, 95, 46, 197, 14, 217, 133, 195, 73, 241, 92, 113, 28, 56, + 94, 151, 133, 222, 210, 237, 17, 186, 164, 60, 172, 103, 22, 18, 170, 190, + 76, 232, 133, 166, 21, 183, 225, 16, 225, 28, 120, 215, 137, 169, 102, 135, + 2, 236, 130, 76, 136, 46, 230, 152, 237, 60, 32, 106, 109, 159, 233, 208, + 149, 10, 93, 73, 104, 143, 42, 164, 16, 153, 117, 206, 49, 79, 67, 88, + 160, 197, 212, 44, 209, 83, 69, 156, 168, 136, 150, 68, 80, 62, 154, 242, + 148, 143, 103, 168, 74, 238, 170, 236, 165, 35, 9, 221, 202, 115, 161, 172, + 158, 95, 226, 180, 70, 249, 203, 56, 97, 3, 128, 50, 109, 39, 71, 147, + 184, 84, 190, 0, 212, 148, 186, 238, 2, 208, 42, 168, 77, 156, 146, 121, + 121, 166, 93, 73, 221, 65, 219, 152, 244, 200, 113, 69, 119, 74, 30, 99, + 224, 224, 105, 61, 204, 218, 218, 31, 200, 217, 197, 204, 157, 93, 174, 119, + 152, 50, 223, 141, 168, 148, 107, 22, 7, 99, 239, 96, 240, 29, 140, 190, + 131, 225, 119, 48, 254, 14, 38, 128, 131, 25, 224, 96, 10, 56, 152, 3, + 14, 38, 129, 131, 89, 64, 111, 77, 230, 212, 84, 137, 176, 223, 242, 197, + 192, 178, 82, 133, 185, 183, 183, 231, 207, 10, 44, 73, 117, 135, 19, 176, + 107, 221, 41, 89, 170, 59, 183, 176, 181, 216, 85, 200, 18, 126, 74, 105, + 249, 178, 128, 213, 51, 29, 186, 226, 208, 176, 204, 50, 86, 20, 138, 41, + 65, 41, 43, 86, 241, 190, 210, 23, 77, 175, 57, 214, 55, 107, 131, 221, + 1, 65, 136, 104, 214, 42, 77, 131, 197, 190, 149, 70, 45, 193, 34, 173, + 252, 101, 215, 93, 117, 69, 156, 170, 22, 54, 114, 231, 234, 39, 146, 166, + 167, 104, 145, 179, 202, 158, 120, 29, 58, 17, 191, 43, 224, 252, 67, 147, + 102, 235, 213, 54, 22, 140, 253, 72, 144, 30, 62, 35, 64, 70, 209, 8, + 144, 193, 52, 2, 100, 76, 141, 0, 25, 90, 35, 64, 70, 216, 214, 96, + 5, 250, 5, 70, 162, 40, 55, 225, 27, 21, 208, 84, 98, 198, 243, 105, + 20, 129, 216, 232, 46, 166, 108, 172, 189, 23, 77, 230, 125, 87, 137, 220, + 205, 162, 168, 231, 46, 167, 16, 106, 113, 87, 242, 51, 159, 46, 70, 119, + 87, 243, 62, 29, 136, 70, 116, 26, 119, 175, 59, 179, 200, 248, 148, 104, + 97, 188, 116, 62, 220, 94, 93, 83, 73, 93, 40, 247, 186, 179, 121, 207, + 248, 66, 220, 32, 186, 153, 167, 41, 249, 100, 37, 159, 72, 154, 70, 40, + 129, 35, 4, 170, 87, 132, 166, 85, 34, 34, 253, 122, 51, 119, 191, 157, + 187, 175, 230, 238, 203, 185, 251, 243, 220, 125, 51, 112, 191, 29, 184, 175, + 6, 238, 203, 129, 251, 243, 192, 229, 131, 221, 155, 111, 95, 189, 148, 183, + 159, 153, 61, 69, 71, 216, 194, 91, 247, 59, 247, 23, 113, 246, 151, 120, + 234, 185, 92, 91, 144, 94, 225, 189, 33, 17, 40, 196, 222, 44, 222, 230, + 78, 92, 141, 210, 250, 105, 253, 140, 197, 114, 125, 100, 63, 59, 10, 244, + 204, 239, 95, 103, 210, 26, 57, 203, 182, 147, 237, 75, 155, 22, 198, 27, + 22, 19, 156, 23, 117, 153, 114, 80, 46, 9, 51, 240, 194, 98, 68, 1, + 70, 54, 51, 26, 193, 109, 122, 67, 184, 170, 106, 86, 162, 226, 125, 35, + 126, 71, 116, 96, 70, 155, 177, 116, 98, 68, 124, 152, 41, 126, 59, 193, + 133, 245, 218, 115, 95, 251, 238, 235, 192, 125, 29, 162, 204, 244, 130, 45, + 55, 181, 168, 243, 160, 211, 113, 82, 80, 110, 244, 206, 89, 75, 118, 222, + 191, 26, 196, 215, 107, 221, 161, 61, 225, 115, 161, 47, 179, 83, 195, 38, + 52, 36, 97, 201, 228, 161, 205, 98, 26, 221, 20, 191, 119, 169, 188, 146, + 188, 211, 27, 92, 32, 95, 186, 175, 61, 35, 36, 224, 16, 223, 8, 169, + 115, 72, 96, 132, 52, 57, 36, 164, 144, 17, 67, 75, 32, 32, 184, 133, + 173, 193, 63, 99, 135, 206, 69, 102, 206, 82, 57, 24, 212, 87, 28, 16, + 32, 32, 228, 128, 151, 175, 216, 73, 115, 213, 122, 121, 86, 48, 7, 154, + 183, 30, 132, 115, 117, 63, 37, 210, 159, 221, 5, 6, 55, 179, 82, 108, + 42, 77, 169, 121, 211, 156, 200, 44, 27, 155, 122, 174, 9, 225, 207, 159, + 134, 24, 208, 159, 94, 180, 253, 47, 252, 211, 159, 192, 96, 84, 152, 121, + 36, 152, 121, 244, 226, 39, 37, 228, 42, 251, 104, 90, 77, 218, 111, 216, + 237, 248, 173, 60, 58, 66, 121, 249, 90, 37, 149, 91, 61, 241, 220, 19, + 244, 35, 45, 190, 92, 73, 88, 140, 9, 180, 213, 36, 163, 138, 112, 249, + 8, 138, 206, 29, 207, 213, 52, 166, 34, 209, 181, 175, 148, 35, 107, 74, + 248, 12, 155, 109, 249, 229, 171, 179, 2, 145, 125, 232, 238, 226, 8, 189, + 244, 170, 36, 1, 71, 109, 238, 56, 188, 150, 146, 36, 52, 5, 241, 6, + 121, 85, 254, 245, 46, 49, 5, 71, 102, 119, 167, 171, 74, 1, 155, 174, + 170, 173, 118, 166, 81, 216, 138, 254, 142, 149, 52, 2, 116, 105, 129, 101, + 84, 67, 81, 190, 68, 85, 183, 163, 122, 157, 233, 85, 60, 154, 69, 211, + 121, 17, 78, 33, 105, 57, 132, 88, 11, 127, 247, 221, 191, 123, 174, 154, + 74, 202, 19, 55, 109, 38, 197, 105, 4, 166, 51, 39, 245, 93, 228, 213, + 159, 184, 173, 155, 33, 216, 163, 81, 198, 212, 179, 21, 145, 97, 173, 10, + 137, 8, 28, 220, 92, 90, 177, 199, 222, 39, 3, 126, 214, 249, 217, 164, + 39, 86, 94, 46, 161, 15, 66, 56, 14, 249, 217, 224, 231, 49, 211, 208, + 118, 97, 182, 116, 103, 68, 182, 248, 222, 251, 11, 71, 97, 121, 71, 208, + 60, 209, 45, 85, 136, 12, 211, 234, 46, 43, 211, 2, 206, 47, 101, 103, + 182, 60, 42, 6, 53, 159, 143, 156, 234, 166, 78, 223, 220, 225, 202, 174, + 130, 164, 206, 91, 216, 30, 100, 22, 2, 114, 172, 142, 138, 126, 205, 147, + 83, 42, 95, 236, 17, 73, 15, 239, 153, 154, 85, 142, 118, 16, 72, 210, + 26, 1, 213, 215, 45, 11, 116, 251, 66, 221, 4, 122, 111, 129, 149, 94, + 48, 172, 222, 49, 209, 34, 40, 224, 87, 234, 52, 70, 133, 191, 242, 250, + 167, 15, 159, 63, 2, 249, 8, 248, 163, 46, 31, 33, 127, 96, 193, 159, + 21, 190, 199, 28, 194, 196, 26, 68, 211, 73, 17, 168, 12, 55, 28, 37, + 87, 62, 125, 253, 105, 96, 55, 231, 173, 235, 124, 199, 135, 84, 237, 14, + 244, 188, 160, 46, 39, 177, 189, 204, 213, 205, 1, 237, 70, 14, 109, 71, + 14, 237, 71, 206, 203, 185, 141, 121, 138, 232, 129, 142, 30, 80, 52, 253, + 209, 254, 228, 188, 28, 112, 180, 32, 192, 91, 164, 130, 204, 185, 247, 222, + 118, 146, 77, 43, 161, 150, 111, 127, 206, 196, 253, 108, 243, 204, 50, 209, + 224, 60, 193, 92, 116, 208, 202, 161, 96, 91, 128, 160, 20, 220, 62, 134, + 215, 101, 176, 220, 249, 123, 174, 153, 10, 248, 89, 71, 219, 14, 109, 163, + 206, 207, 3, 27, 145, 63, 99, 137, 104, 210, 9, 195, 81, 119, 5, 217, + 182, 46, 221, 159, 93, 149, 181, 24, 123, 237, 54, 81, 130, 116, 182, 141, + 125, 122, 11, 217, 113, 107, 49, 174, 211, 123, 147, 67, 27, 244, 118, 92, + 250, 194, 44, 40, 80, 174, 78, 227, 58, 205, 210, 180, 44, 94, 2, 90, + 17, 99, 85, 16, 127, 170, 74, 104, 19, 164, 139, 178, 86, 130, 87, 62, + 100, 179, 101, 6, 222, 178, 51, 135, 234, 59, 101, 239, 95, 37, 221, 47, + 232, 106, 233, 210, 80, 152, 65, 27, 103, 173, 217, 230, 188, 210, 103, 212, + 194, 140, 184, 196, 97, 105, 103, 20, 211, 30, 23, 229, 47, 81, 193, 197, + 246, 53, 23, 155, 93, 86, 57, 166, 216, 148, 226, 107, 139, 209, 88, 122, + 225, 83, 166, 50, 33, 123, 191, 78, 21, 88, 148, 9, 89, 122, 227, 20, + 218, 162, 108, 127, 157, 178, 191, 103, 53, 107, 233, 42, 207, 5, 204, 94, + 168, 58, 236, 146, 50, 176, 240, 194, 236, 56, 205, 26, 84, 18, 47, 194, + 235, 129, 113, 16, 124, 247, 19, 97, 210, 84, 213, 154, 153, 25, 117, 88, + 115, 92, 12, 71, 51, 86, 48, 128, 213, 86, 253, 205, 170, 248, 204, 49, + 197, 213, 115, 162, 250, 106, 177, 198, 118, 206, 252, 171, 210, 213, 239, 137, + 50, 167, 240, 87, 133, 127, 212, 72, 121, 43, 233, 149, 214, 124, 76, 235, + 237, 151, 121, 103, 58, 183, 217, 68, 167, 235, 135, 184, 157, 82, 42, 161, + 20, 247, 245, 168, 103, 131, 41, 28, 212, 133, 25, 220, 90, 27, 73, 114, + 54, 167, 245, 216, 100, 108, 162, 37, 151, 220, 117, 190, 195, 102, 47, 204, + 90, 125, 174, 109, 59, 245, 163, 219, 33, 29, 201, 140, 44, 181, 9, 54, + 110, 209, 197, 78, 210, 217, 218, 207, 75, 214, 52, 90, 163, 218, 196, 9, + 156, 171, 53, 205, 234, 184, 54, 36, 181, 91, 152, 9, 224, 11, 50, 179, + 220, 54, 2, 3, 58, 187, 171, 64, 185, 185, 120, 248, 207, 255, 116, 116, + 109, 235, 61, 109, 217, 113, 113, 207, 109, 50, 12, 2, 236, 3, 113, 199, + 196, 53, 161, 117, 238, 1, 92, 223, 206, 130, 107, 132, 26, 240, 122, 46, + 91, 18, 200, 192, 152, 154, 101, 59, 176, 183, 19, 75, 112, 143, 247, 181, + 97, 159, 13, 182, 91, 246, 245, 116, 139, 79, 209, 15, 62, 209, 255, 88, + 124, 240, 99, 147, 134, 6, 126, 53, 212, 161, 79, 245, 245, 182, 153, 184, + 39, 122, 58, 15, 224, 39, 244, 179, 1, 172, 217, 209, 6, 180, 59, 122, + 58, 103, 59, 238, 176, 222, 206, 100, 122, 188, 199, 119, 216, 161, 107, 236, + 235, 245, 166, 88, 211, 57, 225, 53, 137, 43, 253, 52, 204, 63, 193, 73, + 140, 3, 159, 232, 242, 61, 198, 236, 30, 239, 246, 71, 44, 219, 53, 62, + 97, 8, 82, 200, 205, 113, 73, 65, 55, 250, 127, 78, 35, 45, 106, 59, + 221, 193, 120, 209, 99, 219, 85, 57, 3, 209, 66, 5, 249, 6, 23, 159, + 237, 182, 20, 182, 179, 218, 240, 19, 102, 59, 33, 59, 59, 72, 44, 232, + 98, 254, 88, 154, 71, 127, 12, 187, 203, 124, 47, 80, 247, 60, 66, 112, + 108, 219, 11, 70, 196, 205, 187, 150, 84, 161, 164, 233, 149, 157, 243, 35, + 199, 79, 213, 154, 206, 33, 15, 198, 33, 149, 169, 152, 130, 241, 229, 146, + 64, 212, 122, 180, 21, 103, 160, 92, 43, 103, 172, 91, 153, 67, 134, 210, + 142, 190, 83, 131, 255, 214, 143, 201, 101, 37, 36, 75, 19, 247, 163, 20, + 254, 41, 246, 188, 125, 235, 167, 54, 180, 140, 115, 91, 117, 166, 45, 149, + 186, 52, 231, 39, 101, 186, 39, 203, 149, 215, 138, 48, 173, 170, 15, 3, + 29, 169, 165, 22, 72, 213, 85, 70, 209, 173, 104, 157, 232, 93, 138, 85, + 31, 18, 227, 2, 202, 168, 133, 169, 166, 36, 62, 119, 148, 162, 93, 198, + 28, 83, 254, 142, 76, 239, 193, 111, 207, 157, 239, 148, 249, 239, 183, 166, + 249, 239, 239, 18, 107, 76, 141, 115, 159, 64, 127, 96, 47, 58, 254, 81, + 80, 90, 95, 90, 153, 47, 176, 215, 197, 186, 1, 107, 25, 123, 105, 128, + 34, 108, 242, 115, 38, 107, 70, 106, 123, 74, 213, 93, 115, 82, 165, 166, + 174, 184, 147, 220, 196, 201, 188, 47, 251, 114, 129, 53, 158, 149, 157, 143, + 206, 100, 66, 45, 188, 154, 199, 112, 148, 14, 65, 32, 166, 154, 58, 163, + 89, 156, 88, 21, 101, 155, 107, 199, 133, 76, 104, 226, 8, 194, 118, 88, + 114, 167, 97, 139, 132, 143, 56, 16, 51, 147, 230, 28, 253, 176, 137, 212, + 71, 157, 41, 198, 35, 34, 246, 182, 157, 41, 42, 40, 238, 228, 118, 59, + 3, 76, 125, 47, 44, 119, 23, 52, 9, 47, 11, 124, 101, 111, 16, 32, + 194, 159, 45, 240, 133, 251, 86, 48, 91, 68, 235, 88, 75, 81, 52, 127, + 132, 120, 49, 81, 13, 81, 137, 241, 224, 122, 11, 117, 237, 195, 201, 58, + 253, 126, 116, 172, 177, 174, 78, 9, 244, 138, 189, 60, 33, 35, 158, 196, + 173, 58, 231, 62, 180, 186, 3, 83, 238, 175, 204, 76, 61, 155, 127, 98, + 107, 147, 12, 79, 55, 55, 73, 250, 233, 237, 77, 178, 126, 66, 131, 31, + 169, 206, 76, 222, 37, 2, 117, 12, 255, 154, 135, 181, 87, 37, 127, 186, + 181, 42, 161, 108, 157, 208, 73, 146, 185, 11, 234, 128, 157, 98, 52, 158, + 108, 180, 42, 225, 19, 154, 252, 116, 157, 25, 154, 168, 119, 75, 120, 225, + 80, 186, 14, 137, 159, 110, 53, 40, 39, 164, 76, 41, 134, 134, 65, 177, + 61, 221, 102, 206, 252, 9, 45, 126, 170, 62, 228, 185, 137, 167, 73, 99, + 11, 198, 135, 120, 5, 199, 141, 111, 38, 209, 19, 94, 137, 140, 252, 134, + 195, 28, 31, 122, 107, 94, 214, 67, 209, 160, 67, 231, 226, 206, 112, 114, + 125, 175, 237, 251, 125, 102, 65, 99, 228, 140, 176, 205, 251, 102, 253, 204, + 111, 190, 247, 131, 214, 153, 199, 214, 198, 26, 126, 224, 226, 79, 68, 200, + 183, 47, 176, 173, 156, 59, 38, 147, 112, 170, 76, 45, 72, 178, 40, 105, + 22, 66, 252, 23, 180, 209, 233, 123, 94, 112, 196, 47, 222, 179, 165, 33, + 95, 175, 9, 254, 134, 119, 88, 53, 220, 23, 98, 32, 96, 56, 158, 78, + 250, 18, 23, 112, 123, 10, 91, 233, 167, 242, 122, 175, 237, 221, 133, 180, + 29, 191, 231, 141, 28, 246, 91, 222, 11, 42, 182, 202, 252, 198, 226, 144, + 42, 214, 220, 230, 127, 227, 48, 246, 245, 147, 216, 190, 11, 183, 111, 212, + 185, 199, 182, 173, 71, 100, 253, 197, 104, 205, 221, 139, 247, 216, 219, 89, + 80, 38, 107, 61, 34, 51, 14, 121, 131, 166, 201, 248, 176, 220, 164, 233, + 30, 156, 121, 17, 230, 132, 51, 116, 79, 15, 91, 48, 73, 134, 131, 22, + 77, 146, 90, 144, 21, 174, 132, 240, 22, 132, 213, 186, 247, 52, 122, 76, + 114, 127, 218, 202, 121, 162, 82, 182, 56, 59, 28, 199, 236, 198, 151, 154, + 233, 109, 11, 69, 104, 81, 140, 68, 92, 27, 44, 131, 146, 149, 253, 118, + 147, 79, 197, 244, 160, 121, 158, 72, 229, 27, 227, 139, 239, 115, 41, 247, + 193, 121, 225, 206, 218, 237, 224, 191, 254, 139, 158, 245, 181, 210, 78, 194, + 50, 184, 160, 168, 138, 191, 190, 116, 153, 130, 19, 65, 173, 56, 67, 195, + 213, 11, 104, 58, 174, 178, 7, 47, 218, 205, 47, 252, 211, 162, 226, 199, + 13, 26, 86, 155, 197, 26, 6, 71, 184, 91, 84, 129, 245, 36, 176, 158, + 6, 54, 147, 192, 38, 5, 54, 202, 131, 70, 187, 61, 248, 98, 208, 56, + 45, 52, 203, 131, 38, 191, 55, 79, 11, 245, 242, 160, 206, 239, 245, 164, + 142, 41, 114, 130, 217, 138, 116, 86, 213, 26, 36, 101, 78, 27, 42, 6, + 165, 101, 99, 234, 42, 6, 229, 169, 152, 105, 227, 69, 155, 194, 169, 47, + 248, 173, 201, 117, 79, 155, 73, 32, 222, 26, 12, 196, 160, 94, 40, 21, + 32, 182, 124, 119, 241, 254, 212, 65, 211, 149, 189, 250, 115, 40, 247, 94, + 136, 113, 75, 209, 82, 0, 125, 190, 197, 74, 139, 217, 199, 176, 234, 105, + 33, 34, 45, 17, 192, 180, 50, 107, 49, 51, 250, 184, 137, 107, 231, 134, + 221, 117, 114, 227, 44, 75, 35, 165, 171, 233, 84, 229, 124, 119, 4, 85, + 180, 34, 81, 202, 178, 34, 232, 140, 229, 188, 45, 39, 97, 128, 243, 173, + 123, 67, 101, 131, 115, 139, 90, 142, 68, 131, 139, 176, 108, 221, 101, 230, + 144, 152, 60, 16, 97, 196, 144, 111, 4, 37, 199, 3, 81, 200, 80, 56, + 184, 104, 6, 158, 219, 58, 62, 190, 60, 197, 119, 240, 197, 69, 43, 56, + 118, 125, 191, 121, 34, 1, 225, 23, 23, 126, 80, 39, 156, 113, 220, 168, + 95, 158, 94, 4, 245, 150, 231, 134, 13, 175, 117, 105, 175, 221, 228, 195, + 44, 86, 177, 192, 133, 149, 236, 80, 160, 115, 243, 221, 101, 217, 171, 157, + 52, 74, 202, 172, 24, 247, 69, 98, 69, 86, 27, 238, 11, 149, 216, 80, + 67, 226, 41, 239, 91, 75, 181, 237, 134, 11, 202, 234, 66, 221, 188, 45, + 89, 70, 211, 183, 118, 0, 25, 41, 54, 80, 11, 1, 15, 164, 185, 44, + 84, 5, 199, 210, 25, 197, 122, 40, 250, 34, 73, 248, 172, 172, 98, 215, + 44, 251, 79, 91, 131, 98, 130, 111, 9, 46, 84, 44, 113, 239, 150, 29, + 103, 58, 126, 154, 232, 154, 127, 236, 184, 248, 249, 242, 153, 237, 252, 100, + 243, 5, 252, 71, 183, 91, 178, 49, 185, 128, 116, 179, 169, 93, 91, 210, + 65, 136, 184, 209, 176, 165, 131, 118, 150, 183, 58, 176, 188, 85, 166, 60, + 221, 185, 133, 120, 170, 135, 134, 125, 93, 221, 188, 61, 114, 120, 104, 142, + 156, 239, 74, 37, 152, 96, 88, 163, 233, 241, 148, 182, 69, 60, 18, 67, + 76, 20, 40, 99, 152, 246, 136, 159, 138, 114, 72, 233, 199, 106, 232, 90, + 133, 206, 210, 237, 172, 104, 6, 182, 157, 227, 170, 127, 118, 209, 121, 22, + 124, 129, 145, 63, 245, 106, 94, 195, 5, 130, 232, 208, 161, 47, 13, 186, + 92, 43, 7, 128, 159, 19, 204, 34, 209, 234, 185, 253, 178, 211, 122, 182, + 86, 140, 79, 125, 208, 174, 105, 211, 84, 13, 2, 170, 1, 235, 81, 250, + 120, 43, 7, 218, 26, 118, 73, 222, 210, 232, 92, 191, 220, 208, 99, 181, + 209, 246, 218, 70, 67, 101, 146, 248, 199, 104, 122, 27, 245, 172, 111, 80, + 210, 204, 176, 231, 173, 54, 71, 204, 136, 140, 113, 111, 194, 238, 146, 175, + 51, 187, 59, 36, 57, 180, 136, 127, 74, 54, 129, 189, 242, 77, 201, 46, + 33, 110, 213, 244, 70, 51, 29, 247, 226, 65, 124, 248, 134, 169, 211, 63, + 189, 95, 234, 148, 127, 130, 182, 214, 69, 124, 194, 134, 121, 64, 173, 102, + 182, 91, 120, 237, 60, 176, 233, 72, 251, 116, 179, 145, 202, 60, 2, 63, + 222, 66, 164, 254, 132, 214, 101, 11, 103, 161, 166, 73, 7, 122, 177, 198, + 129, 63, 113, 145, 209, 129, 57, 174, 4, 227, 237, 194, 45, 44, 7, 213, + 134, 31, 49, 145, 108, 109, 75, 219, 219, 109, 173, 172, 20, 138, 237, 66, + 164, 50, 130, 130, 36, 61, 206, 251, 105, 120, 152, 134, 67, 164, 104, 201, + 230, 30, 39, 241, 17, 148, 123, 42, 48, 218, 248, 18, 166, 162, 147, 228, + 245, 108, 242, 149, 78, 222, 223, 157, 188, 145, 38, 87, 2, 148, 213, 254, + 81, 224, 46, 171, 247, 180, 186, 159, 21, 139, 126, 245, 101, 137, 141, 99, + 87, 60, 216, 247, 53, 179, 54, 211, 172, 111, 218, 168, 133, 183, 178, 251, + 242, 125, 165, 95, 238, 151, 206, 248, 75, 138, 43, 189, 15, 42, 69, 41, + 242, 61, 74, 229, 162, 42, 111, 202, 92, 186, 89, 228, 177, 97, 32, 75, + 25, 99, 102, 126, 206, 67, 235, 8, 130, 207, 176, 0, 159, 152, 101, 102, + 189, 66, 133, 182, 212, 62, 34, 224, 148, 180, 4, 178, 32, 209, 151, 109, + 167, 113, 102, 235, 72, 77, 41, 85, 197, 74, 83, 19, 10, 3, 119, 23, + 14, 143, 198, 101, 106, 171, 145, 149, 13, 7, 42, 133, 175, 112, 226, 49, + 18, 19, 170, 214, 169, 83, 205, 214, 108, 34, 63, 155, 40, 117, 68, 217, + 100, 71, 191, 201, 156, 186, 120, 175, 19, 233, 212, 106, 98, 59, 80, 146, + 131, 13, 157, 124, 65, 68, 208, 156, 6, 202, 43, 234, 163, 229, 192, 133, + 0, 228, 58, 3, 179, 4, 45, 160, 173, 186, 0, 182, 3, 245, 156, 22, + 214, 89, 240, 204, 13, 158, 105, 206, 102, 150, 133, 230, 242, 1, 229, 201, + 122, 197, 45, 102, 138, 172, 25, 231, 166, 57, 82, 204, 187, 61, 106, 150, + 18, 93, 123, 112, 88, 57, 103, 253, 240, 206, 78, 70, 205, 126, 39, 202, + 90, 80, 213, 130, 74, 214, 3, 52, 194, 148, 44, 234, 214, 82, 205, 114, + 230, 136, 124, 122, 145, 12, 206, 103, 47, 194, 146, 136, 141, 82, 240, 121, + 26, 26, 148, 10, 162, 121, 25, 27, 6, 32, 237, 183, 194, 202, 59, 181, + 93, 215, 254, 181, 31, 207, 128, 156, 230, 209, 148, 200, 246, 223, 23, 132, + 243, 103, 22, 29, 26, 35, 147, 175, 55, 131, 18, 219, 253, 120, 122, 103, + 77, 104, 159, 139, 166, 131, 85, 13, 98, 70, 96, 245, 21, 246, 65, 171, + 61, 74, 48, 147, 79, 113, 56, 125, 177, 65, 60, 137, 193, 166, 20, 76, + 67, 180, 226, 103, 231, 222, 23, 166, 201, 254, 211, 11, 117, 112, 166, 173, + 151, 104, 163, 246, 195, 47, 68, 28, 73, 228, 101, 217, 241, 159, 157, 93, + 128, 60, 248, 5, 234, 39, 126, 201, 149, 119, 88, 80, 43, 81, 122, 136, + 141, 241, 144, 169, 106, 30, 138, 206, 49, 180, 93, 75, 101, 86, 68, 197, + 25, 87, 185, 90, 60, 22, 158, 112, 67, 174, 73, 101, 158, 60, 4, 44, + 110, 15, 7, 187, 201, 27, 60, 178, 59, 1, 156, 139, 195, 98, 33, 168, + 19, 109, 21, 33, 217, 248, 51, 228, 13, 108, 63, 105, 23, 123, 134, 173, + 62, 40, 37, 51, 235, 33, 154, 27, 142, 43, 45, 251, 187, 8, 151, 169, + 185, 40, 154, 76, 34, 250, 95, 76, 26, 174, 253, 24, 200, 29, 188, 92, + 182, 235, 206, 204, 30, 129, 165, 225, 250, 18, 93, 159, 203, 229, 108, 165, + 157, 20, 46, 175, 110, 35, 118, 8, 253, 79, 30, 4, 174, 229, 1, 22, + 55, 182, 6, 129, 61, 59, 52, 214, 250, 158, 97, 223, 96, 52, 147, 193, + 104, 234, 193, 104, 242, 96, 64, 125, 226, 240, 209, 96, 59, 92, 79, 143, + 198, 183, 4, 239, 31, 31, 12, 180, 54, 59, 22, 220, 254, 167, 134, 162, + 31, 137, 187, 136, 127, 242, 88, 72, 53, 255, 191, 47, 8, 110, 101, 118, + 16, 164, 225, 79, 141, 194, 44, 142, 166, 147, 120, 68, 52, 213, 83, 78, + 176, 45, 54, 132, 107, 232, 165, 37, 57, 107, 138, 255, 88, 168, 80, 147, + 97, 174, 69, 25, 169, 176, 114, 110, 68, 97, 66, 52, 127, 137, 37, 92, + 178, 45, 247, 205, 215, 132, 171, 103, 131, 104, 117, 117, 19, 77, 71, 59, + 76, 57, 202, 216, 114, 228, 131, 22, 159, 93, 43, 83, 187, 46, 43, 67, + 193, 214, 155, 50, 233, 146, 25, 22, 247, 66, 176, 242, 101, 193, 24, 148, + 84, 77, 141, 89, 117, 39, 230, 213, 26, 124, 245, 176, 42, 95, 65, 57, + 82, 169, 37, 110, 84, 4, 70, 235, 27, 2, 35, 61, 123, 216, 218, 131, + 114, 11, 103, 183, 35, 118, 116, 83, 130, 31, 150, 164, 190, 109, 191, 191, + 102, 107, 243, 206, 88, 204, 142, 64, 63, 183, 214, 194, 206, 154, 141, 198, + 247, 55, 131, 206, 93, 180, 91, 119, 75, 238, 57, 119, 140, 160, 116, 93, + 154, 219, 236, 63, 223, 218, 234, 43, 204, 223, 75, 125, 37, 249, 80, 188, + 184, 255, 156, 206, 129, 159, 123, 152, 136, 159, 251, 244, 230, 95, 178, 202, + 137, 82, 23, 165, 225, 79, 189, 244, 108, 141, 106, 111, 218, 185, 29, 143, + 186, 139, 233, 135, 63, 6, 180, 228, 207, 66, 12, 162, 104, 11, 104, 216, + 6, 61, 20, 232, 240, 9, 160, 149, 54, 120, 23, 98, 93, 134, 221, 236, + 118, 149, 95, 221, 53, 91, 19, 190, 202, 38, 188, 154, 205, 25, 185, 89, + 112, 107, 33, 156, 188, 171, 209, 245, 85, 60, 2, 219, 234, 170, 23, 15, + 241, 74, 71, 162, 89, 52, 161, 159, 45, 125, 13, 157, 194, 81, 47, 14, + 165, 179, 47, 108, 231, 220, 134, 212, 160, 77, 244, 240, 146, 232, 225, 229, + 67, 143, 254, 102, 107, 219, 37, 162, 197, 186, 176, 31, 174, 20, 131, 39, + 30, 186, 241, 143, 151, 116, 120, 241, 75, 107, 251, 82, 213, 242, 110, 100, + 234, 21, 104, 158, 101, 1, 182, 61, 118, 3, 127, 37, 86, 183, 32, 214, + 214, 118, 30, 168, 22, 162, 228, 160, 63, 10, 159, 28, 108, 130, 254, 144, + 92, 133, 228, 128, 164, 145, 165, 113, 64, 26, 165, 10, 210, 9, 195, 19, + 221, 196, 121, 85, 63, 225, 61, 233, 168, 60, 7, 61, 77, 226, 232, 183, + 191, 168, 171, 172, 76, 87, 45, 134, 214, 206, 214, 230, 166, 199, 46, 31, + 31, 198, 52, 49, 239, 57, 6, 133, 171, 219, 238, 228, 138, 40, 230, 182, + 173, 231, 72, 211, 218, 117, 73, 147, 157, 128, 142, 206, 198, 116, 68, 21, + 108, 238, 228, 158, 38, 231, 152, 99, 119, 122, 52, 103, 60, 186, 233, 196, + 131, 66, 4, 33, 199, 171, 225, 236, 150, 7, 138, 89, 111, 114, 27, 2, + 7, 176, 59, 232, 231, 95, 86, 163, 121, 103, 105, 113, 54, 16, 209, 56, + 175, 39, 101, 172, 221, 192, 115, 235, 94, 106, 202, 188, 46, 168, 52, 180, + 158, 177, 191, 29, 53, 192, 9, 95, 21, 204, 153, 115, 58, 221, 26, 22, + 82, 144, 102, 22, 127, 244, 218, 112, 175, 29, 127, 244, 219, 254, 49, 126, + 131, 182, 127, 130, 223, 176, 29, 176, 86, 248, 197, 115, 199, 152, 100, 207, + 47, 113, 138, 51, 103, 93, 49, 26, 78, 230, 171, 18, 215, 56, 186, 25, + 183, 237, 239, 153, 162, 23, 159, 128, 167, 150, 253, 185, 35, 75, 17, 195, + 172, 23, 24, 189, 211, 151, 253, 51, 75, 112, 230, 147, 82, 161, 105, 90, + 249, 48, 18, 75, 205, 167, 208, 170, 76, 129, 16, 222, 25, 58, 8, 32, + 40, 68, 243, 64, 141, 160, 67, 143, 98, 159, 69, 203, 73, 135, 142, 99, + 203, 85, 13, 134, 201, 82, 135, 45, 161, 185, 27, 97, 80, 132, 121, 102, + 240, 40, 152, 23, 202, 178, 48, 181, 90, 194, 176, 16, 118, 183, 176, 29, + 143, 36, 75, 160, 119, 126, 97, 190, 233, 141, 191, 166, 206, 46, 74, 92, + 181, 209, 108, 16, 46, 54, 62, 88, 251, 223, 97, 9, 11, 230, 232, 244, + 162, 225, 152, 149, 173, 199, 195, 89, 59, 240, 234, 45, 247, 122, 48, 190, + 158, 185, 215, 180, 130, 186, 80, 173, 233, 142, 71, 163, 168, 59, 175, 187, + 184, 80, 228, 7, 206, 76, 51, 122, 155, 245, 163, 21, 133, 140, 23, 83, + 162, 21, 220, 126, 103, 52, 142, 93, 58, 120, 205, 199, 183, 68, 102, 185, + 253, 241, 226, 182, 239, 254, 214, 185, 191, 158, 70, 180, 17, 77, 221, 1, + 117, 200, 172, 75, 136, 222, 37, 28, 129, 7, 132, 53, 83, 43, 138, 238, + 48, 154, 119, 224, 156, 108, 22, 246, 160, 51, 19, 205, 238, 35, 194, 7, + 83, 188, 211, 144, 13, 174, 224, 150, 192, 165, 93, 131, 178, 184, 108, 104, + 218, 21, 166, 131, 251, 251, 2, 134, 209, 62, 70, 56, 28, 187, 211, 232, + 102, 64, 224, 178, 76, 134, 59, 93, 92, 95, 179, 196, 85, 162, 86, 238, + 138, 190, 189, 139, 5, 126, 19, 71, 131, 30, 69, 206, 161, 17, 55, 115, + 231, 113, 119, 222, 233, 206, 199, 145, 123, 223, 249, 16, 205, 220, 251, 126, + 60, 29, 160, 95, 104, 1, 209, 18, 123, 7, 11, 7, 142, 207, 234, 151, + 195, 153, 118, 222, 230, 17, 78, 25, 208, 20, 229, 213, 137, 87, 76, 204, + 10, 161, 47, 122, 191, 180, 96, 136, 126, 60, 38, 132, 177, 188, 178, 145, + 205, 194, 215, 116, 104, 45, 228, 77, 75, 30, 167, 3, 97, 74, 18, 15, + 83, 246, 154, 118, 202, 48, 135, 79, 134, 36, 113, 173, 27, 15, 111, 217, + 36, 88, 60, 67, 210, 226, 197, 243, 135, 163, 148, 199, 246, 252, 178, 100, + 37, 95, 130, 62, 136, 110, 182, 250, 243, 249, 100, 118, 122, 196, 252, 188, + 90, 180, 56, 162, 50, 142, 242, 101, 90, 227, 52, 167, 130, 50, 46, 220, + 93, 56, 62, 79, 92, 241, 185, 70, 212, 132, 114, 211, 130, 75, 89, 125, + 11, 169, 29, 79, 37, 243, 0, 71, 0, 66, 6, 186, 15, 169, 11, 3, + 154, 171, 3, 23, 243, 217, 229, 1, 187, 189, 190, 154, 242, 243, 150, 159, + 28, 210, 185, 234, 184, 3, 196, 14, 36, 122, 32, 241, 3, 73, 160, 140, + 80, 169, 95, 60, 146, 87, 253, 146, 132, 220, 194, 6, 214, 213, 128, 159, + 157, 107, 249, 225, 39, 189, 119, 251, 87, 221, 190, 252, 240, 179, 15, 163, + 89, 234, 57, 227, 231, 7, 24, 212, 186, 98, 51, 101, 84, 70, 119, 184, + 186, 163, 164, 252, 51, 148, 159, 149, 252, 220, 185, 171, 248, 119, 64, 68, + 207, 248, 247, 117, 225, 170, 211, 189, 114, 88, 84, 28, 212, 3, 125, 208, + 184, 210, 66, 130, 184, 36, 97, 146, 137, 14, 189, 25, 79, 239, 59, 83, + 21, 122, 163, 67, 175, 59, 221, 187, 52, 248, 122, 155, 126, 48, 202, 51, + 74, 193, 80, 36, 38, 19, 8, 93, 21, 182, 199, 34, 113, 132, 233, 167, + 214, 124, 112, 167, 38, 92, 22, 190, 87, 75, 141, 46, 136, 183, 179, 12, + 177, 20, 15, 39, 99, 58, 136, 48, 6, 205, 108, 131, 176, 128, 56, 180, + 98, 198, 46, 44, 143, 39, 87, 166, 163, 132, 42, 160, 201, 215, 53, 232, + 1, 42, 106, 148, 160, 167, 108, 57, 152, 163, 221, 126, 212, 189, 131, 14, + 58, 203, 171, 5, 37, 112, 126, 156, 128, 22, 27, 164, 253, 37, 48, 148, + 192, 240, 220, 179, 213, 142, 39, 91, 151, 69, 27, 194, 135, 206, 32, 238, + 89, 191, 76, 162, 110, 76, 107, 188, 103, 125, 21, 15, 163, 17, 20, 22, + 102, 118, 178, 131, 93, 60, 7, 172, 178, 191, 236, 148, 4, 251, 178, 63, + 134, 23, 191, 78, 178, 10, 21, 231, 243, 179, 100, 177, 73, 1, 165, 221, + 217, 191, 209, 203, 103, 52, 158, 211, 98, 39, 114, 228, 51, 185, 100, 178, + 210, 150, 11, 46, 102, 95, 144, 74, 211, 64, 247, 13, 97, 167, 89, 220, + 217, 229, 233, 121, 4, 116, 132, 26, 211, 227, 37, 38, 197, 218, 170, 36, + 134, 39, 181, 236, 231, 57, 132, 21, 120, 223, 135, 85, 83, 151, 173, 13, + 84, 152, 6, 135, 181, 8, 22, 169, 184, 63, 119, 216, 208, 129, 149, 134, + 59, 117, 49, 56, 39, 206, 152, 104, 105, 195, 75, 230, 82, 173, 115, 237, + 7, 102, 52, 180, 138, 207, 31, 174, 215, 207, 217, 88, 192, 243, 248, 166, + 184, 116, 99, 151, 126, 226, 243, 246, 201, 241, 223, 254, 22, 191, 104, 251, + 65, 224, 198, 213, 144, 30, 165, 210, 115, 217, 116, 175, 160, 145, 200, 8, + 237, 97, 110, 122, 18, 45, 62, 183, 95, 124, 246, 213, 207, 95, 254, 250, + 239, 175, 191, 38, 252, 52, 28, 88, 175, 255, 231, 171, 31, 190, 255, 210, + 122, 103, 87, 143, 142, 222, 134, 95, 30, 29, 125, 245, 235, 87, 214, 191, + 125, 247, 235, 143, 63, 88, 126, 205, 179, 126, 77, 24, 114, 157, 193, 209, + 209, 215, 63, 189, 195, 166, 109, 3, 179, 17, 98, 187, 191, 191, 175, 221, + 135, 181, 241, 244, 246, 232, 215, 55, 71, 75, 148, 231, 35, 191, 122, 173, + 206, 141, 204, 181, 222, 188, 247, 206, 62, 127, 55, 122, 193, 213, 46, 135, + 131, 209, 172, 189, 171, 36, 255, 228, 228, 68, 10, 120, 103, 35, 217, 41, + 237, 102, 183, 148, 50, 162, 122, 45, 227, 157, 139, 138, 58, 189, 243, 23, + 71, 242, 115, 61, 238, 173, 172, 235, 91, 238, 94, 74, 243, 249, 55, 223, + 124, 243, 213, 55, 223, 80, 194, 23, 221, 104, 52, 143, 166, 231, 47, 110, + 198, 163, 185, 197, 118, 227, 168, 185, 190, 42, 34, 56, 183, 157, 108, 159, + 217, 22, 251, 2, 5, 197, 11, 83, 52, 118, 137, 106, 8, 144, 150, 118, + 205, 65, 100, 93, 143, 167, 189, 8, 53, 120, 4, 80, 55, 26, 12, 38, + 157, 94, 47, 102, 184, 90, 168, 109, 78, 53, 205, 123, 7, 165, 175, 51, + 12, 246, 243, 146, 26, 109, 136, 117, 170, 1, 148, 193, 19, 231, 62, 240, + 87, 64, 205, 154, 181, 217, 88, 80, 130, 165, 84, 104, 65, 90, 76, 113, + 223, 23, 157, 115, 49, 108, 203, 230, 240, 176, 127, 82, 76, 105, 109, 125, + 43, 33, 65, 26, 242, 74, 66, 194, 36, 132, 166, 134, 243, 208, 139, 186, + 65, 63, 90, 210, 6, 236, 188, 41, 55, 27, 141, 176, 89, 113, 190, 45, + 19, 217, 89, 113, 94, 173, 49, 5, 171, 68, 140, 61, 247, 158, 179, 71, + 57, 229, 123, 69, 9, 213, 122, 236, 62, 23, 113, 48, 253, 32, 243, 243, + 234, 121, 231, 185, 240, 146, 105, 150, 94, 61, 255, 248, 220, 141, 43, 87, + 207, 95, 62, 175, 34, 130, 102, 107, 161, 175, 64, 159, 75, 51, 137, 36, + 18, 55, 61, 194, 242, 225, 72, 65, 100, 187, 124, 246, 64, 95, 196, 241, + 143, 8, 155, 165, 61, 182, 190, 114, 206, 113, 107, 198, 197, 97, 178, 171, + 193, 120, 113, 125, 254, 37, 149, 182, 32, 164, 69, 39, 154, 23, 71, 215, + 52, 107, 16, 140, 63, 218, 134, 173, 217, 180, 219, 6, 95, 125, 71, 81, + 54, 141, 218, 81, 154, 252, 115, 219, 17, 168, 109, 9, 58, 162, 26, 100, + 8, 25, 117, 163, 206, 35, 30, 119, 76, 0, 157, 9, 209, 124, 208, 193, + 176, 43, 27, 146, 160, 113, 136, 136, 125, 103, 255, 58, 158, 88, 80, 238, + 124, 103, 171, 15, 214, 154, 229, 175, 87, 227, 57, 157, 64, 210, 88, 245, + 173, 18, 216, 116, 252, 233, 92, 19, 37, 100, 148, 216, 92, 187, 111, 198, + 247, 238, 151, 172, 203, 99, 175, 213, 121, 168, 23, 79, 189, 182, 253, 171, + 245, 183, 207, 91, 141, 147, 250, 153, 245, 10, 54, 70, 166, 126, 219, 126, + 149, 4, 253, 170, 46, 26, 37, 233, 15, 73, 248, 27, 157, 244, 77, 18, + 244, 3, 223, 49, 244, 112, 221, 46, 102, 23, 131, 178, 211, 168, 64, 56, + 76, 102, 130, 178, 30, 3, 177, 140, 74, 74, 184, 20, 42, 6, 190, 213, + 216, 91, 115, 188, 220, 102, 168, 149, 136, 128, 71, 225, 91, 84, 12, 33, + 177, 117, 37, 117, 27, 147, 248, 173, 193, 108, 208, 31, 217, 57, 145, 137, + 66, 1, 137, 60, 250, 28, 170, 126, 111, 162, 217, 98, 48, 23, 155, 92, + 236, 5, 209, 80, 77, 162, 232, 159, 177, 80, 33, 147, 60, 254, 16, 77, + 89, 162, 105, 87, 202, 76, 29, 65, 166, 146, 113, 109, 231, 156, 124, 137, + 121, 84, 216, 61, 95, 95, 113, 92, 22, 67, 111, 227, 141, 4, 171, 236, + 159, 173, 47, 243, 147, 245, 136, 179, 72, 54, 219, 222, 159, 241, 213, 206, + 140, 106, 18, 111, 135, 200, 100, 23, 142, 47, 128, 157, 96, 113, 189, 36, + 140, 38, 120, 222, 34, 226, 123, 8, 71, 102, 167, 188, 202, 174, 167, 84, + 42, 36, 216, 59, 116, 54, 177, 24, 137, 17, 154, 4, 38, 4, 109, 75, + 239, 240, 103, 86, 96, 141, 130, 254, 120, 32, 237, 253, 26, 216, 58, 41, + 199, 130, 87, 232, 90, 173, 134, 78, 56, 210, 37, 209, 235, 68, 32, 193, + 84, 76, 192, 248, 69, 173, 49, 177, 183, 203, 16, 88, 208, 21, 150, 80, + 251, 127, 255, 175, 237, 255, 41, 215, 207, 83, 120, 39, 98, 29, 42, 157, + 133, 215, 149, 109, 93, 175, 146, 247, 164, 66, 140, 85, 102, 156, 128, 210, + 103, 224, 177, 49, 74, 223, 137, 228, 211, 177, 244, 19, 140, 127, 101, 44, + 135, 11, 145, 165, 100, 249, 202, 138, 240, 233, 172, 213, 78, 143, 166, 231, + 207, 2, 229, 222, 170, 38, 254, 173, 226, 97, 155, 70, 115, 141, 238, 98, + 43, 139, 87, 211, 1, 44, 217, 122, 226, 55, 171, 201, 167, 90, 3, 19, + 66, 183, 52, 190, 29, 17, 36, 243, 241, 4, 93, 122, 125, 158, 180, 214, + 22, 219, 47, 25, 244, 152, 79, 79, 115, 135, 22, 62, 28, 204, 173, 237, + 4, 189, 169, 41, 65, 244, 221, 168, 13, 253, 60, 40, 127, 194, 163, 113, + 124, 225, 196, 68, 47, 197, 149, 182, 220, 42, 83, 240, 57, 37, 24, 119, + 187, 20, 192, 188, 47, 188, 62, 84, 17, 177, 206, 102, 210, 233, 95, 120, + 128, 64, 31, 251, 80, 146, 226, 114, 81, 104, 165, 77, 27, 55, 218, 214, + 101, 212, 126, 202, 109, 129, 222, 169, 26, 68, 42, 92, 102, 42, 149, 234, + 196, 47, 250, 107, 204, 87, 215, 82, 147, 102, 164, 160, 250, 172, 232, 140, + 158, 181, 74, 60, 151, 49, 91, 147, 89, 69, 167, 82, 152, 236, 164, 140, + 159, 123, 10, 175, 103, 240, 189, 86, 149, 89, 10, 42, 252, 140, 59, 197, + 160, 226, 17, 35, 110, 91, 248, 142, 32, 183, 51, 128, 22, 161, 210, 20, + 105, 130, 16, 208, 47, 188, 83, 80, 70, 139, 72, 89, 32, 11, 162, 7, + 96, 187, 60, 123, 52, 200, 225, 208, 93, 180, 235, 65, 20, 170, 190, 247, + 54, 103, 98, 50, 13, 179, 34, 87, 160, 59, 87, 207, 2, 119, 85, 190, + 175, 192, 100, 223, 146, 223, 150, 165, 23, 78, 171, 124, 223, 135, 81, 167, + 231, 22, 59, 58, 212, 28, 229, 23, 126, 221, 147, 10, 125, 72, 214, 213, + 149, 253, 60, 58, 229, 104, 118, 141, 229, 103, 170, 177, 196, 245, 121, 13, + 193, 248, 39, 86, 248, 58, 52, 211, 239, 195, 196, 14, 223, 195, 253, 81, + 93, 152, 64, 129, 200, 72, 249, 162, 183, 154, 53, 98, 38, 37, 152, 254, + 174, 107, 5, 131, 45, 52, 205, 59, 187, 78, 238, 85, 88, 86, 197, 244, + 243, 171, 238, 61, 76, 253, 160, 29, 157, 229, 231, 108, 126, 25, 135, 10, + 83, 234, 47, 176, 82, 143, 229, 166, 35, 119, 195, 157, 165, 214, 151, 54, + 157, 87, 170, 176, 85, 26, 22, 26, 122, 213, 74, 96, 112, 95, 37, 90, + 125, 238, 106, 214, 25, 78, 6, 145, 246, 64, 106, 205, 216, 134, 29, 115, + 161, 217, 130, 146, 48, 85, 38, 214, 23, 234, 91, 25, 90, 244, 242, 5, + 24, 115, 46, 231, 152, 58, 95, 19, 187, 11, 162, 67, 79, 255, 11, 231, + 254, 212, 131, 177, 172, 254, 185, 115, 255, 133, 211, 63, 21, 205, 234, 217, + 120, 240, 33, 186, 26, 118, 62, 102, 110, 48, 10, 21, 136, 154, 192, 107, + 40, 235, 17, 75, 219, 252, 84, 18, 14, 118, 185, 197, 217, 0, 251, 51, + 104, 136, 29, 58, 63, 162, 36, 137, 189, 56, 147, 139, 85, 219, 229, 149, + 177, 144, 42, 83, 177, 62, 177, 246, 2, 213, 180, 76, 110, 160, 235, 21, + 18, 69, 178, 140, 206, 155, 182, 192, 231, 11, 3, 210, 149, 219, 97, 101, + 233, 119, 43, 93, 66, 55, 36, 68, 66, 106, 138, 80, 129, 214, 112, 197, + 163, 130, 81, 80, 154, 70, 1, 189, 35, 77, 122, 13, 54, 76, 46, 224, + 82, 237, 232, 180, 127, 141, 49, 19, 125, 176, 189, 30, 53, 191, 84, 255, + 169, 90, 52, 20, 73, 218, 144, 215, 138, 255, 84, 180, 183, 244, 211, 102, + 38, 45, 216, 151, 57, 23, 45, 153, 63, 255, 151, 238, 32, 182, 78, 79, + 45, 131, 176, 248, 182, 51, 24, 68, 211, 149, 245, 61, 115, 149, 85, 146, + 91, 9, 188, 34, 68, 209, 89, 233, 192, 83, 139, 197, 82, 8, 181, 82, + 242, 94, 116, 3, 22, 167, 53, 27, 131, 195, 182, 228, 217, 57, 179, 198, + 55, 22, 103, 81, 178, 43, 51, 200, 108, 89, 243, 126, 100, 125, 251, 252, + 71, 58, 14, 171, 98, 173, 9, 85, 85, 75, 74, 117, 228, 108, 86, 251, + 109, 114, 139, 251, 1, 38, 4, 175, 224, 46, 204, 10, 61, 55, 196, 232, + 202, 40, 251, 65, 43, 249, 67, 88, 198, 32, 52, 171, 21, 36, 82, 113, + 132, 158, 174, 132, 136, 183, 89, 102, 115, 115, 129, 242, 46, 109, 163, 78, + 181, 160, 230, 241, 45, 88, 187, 209, 104, 236, 14, 199, 163, 187, 104, 229, + 246, 22, 221, 59, 55, 234, 192, 224, 142, 92, 183, 115, 31, 26, 239, 98, + 192, 158, 176, 209, 109, 100, 189, 76, 234, 249, 81, 66, 236, 125, 205, 154, + 44, 62, 126, 164, 34, 121, 198, 213, 212, 180, 173, 133, 108, 28, 213, 171, + 5, 220, 8, 126, 79, 255, 79, 138, 126, 205, 89, 237, 173, 177, 153, 199, + 179, 121, 220, 253, 196, 209, 145, 76, 127, 102, 128, 162, 209, 237, 180, 243, + 33, 98, 107, 75, 240, 220, 124, 92, 107, 210, 160, 52, 106, 129, 62, 163, + 120, 9, 97, 143, 3, 44, 120, 61, 67, 200, 207, 94, 41, 169, 37, 221, + 172, 175, 165, 156, 189, 61, 118, 61, 190, 139, 250, 212, 227, 24, 109, 154, + 6, 45, 84, 70, 61, 198, 189, 69, 117, 224, 175, 133, 99, 132, 199, 198, + 190, 67, 62, 50, 4, 178, 63, 249, 199, 244, 43, 33, 62, 124, 169, 212, + 124, 115, 74, 188, 66, 193, 123, 171, 109, 93, 199, 68, 30, 7, 13, 42, + 156, 15, 41, 105, 190, 159, 7, 189, 89, 183, 63, 30, 15, 54, 156, 102, + 79, 9, 169, 218, 18, 219, 32, 175, 5, 50, 224, 244, 19, 80, 81, 55, + 147, 89, 187, 153, 118, 1, 210, 109, 198, 163, 13, 114, 237, 133, 168, 23, + 223, 220, 44, 192, 254, 155, 71, 163, 25, 124, 21, 248, 152, 254, 33, 139, + 83, 251, 13, 238, 236, 208, 0, 243, 43, 157, 124, 163, 210, 239, 47, 152, + 104, 254, 161, 114, 63, 35, 78, 55, 188, 90, 139, 39, 38, 108, 82, 5, + 117, 179, 80, 36, 221, 72, 90, 16, 253, 123, 87, 111, 52, 152, 79, 162, + 17, 45, 93, 232, 123, 10, 136, 24, 134, 204, 146, 164, 52, 27, 74, 180, + 187, 144, 219, 249, 98, 62, 158, 82, 71, 225, 138, 196, 74, 22, 52, 253, + 95, 111, 164, 235, 59, 187, 198, 9, 162, 104, 186, 225, 28, 123, 33, 163, + 201, 54, 233, 199, 221, 171, 17, 29, 67, 7, 55, 203, 1, 14, 178, 110, + 19, 120, 68, 214, 98, 147, 166, 77, 221, 16, 82, 63, 166, 62, 168, 157, + 4, 201, 76, 246, 147, 24, 68, 4, 173, 164, 246, 159, 80, 224, 230, 155, + 127, 219, 91, 115, 60, 24, 44, 102, 115, 54, 36, 52, 186, 26, 140, 199, + 119, 150, 177, 210, 147, 98, 190, 55, 82, 109, 144, 106, 111, 121, 131, 213, + 32, 250, 237, 238, 138, 155, 139, 99, 25, 22, 3, 156, 48, 155, 165, 253, + 192, 105, 54, 58, 205, 126, 180, 164, 11, 105, 176, 107, 7, 56, 121, 144, + 97, 75, 177, 207, 147, 69, 140, 103, 132, 74, 216, 247, 70, 131, 87, 170, + 239, 38, 76, 139, 180, 20, 157, 104, 111, 49, 191, 47, 58, 61, 182, 52, + 3, 247, 71, 52, 247, 96, 38, 9, 123, 124, 45, 196, 154, 39, 20, 67, + 139, 255, 36, 83, 230, 223, 85, 142, 205, 135, 206, 52, 230, 126, 219, 63, + 213, 63, 68, 93, 204, 170, 164, 185, 39, 181, 240, 216, 40, 234, 31, 28, + 189, 213, 93, 26, 215, 94, 19, 253, 113, 71, 4, 54, 29, 94, 230, 209, + 39, 33, 92, 206, 89, 165, 172, 85, 206, 251, 231, 54, 198, 168, 115, 71, + 176, 220, 91, 39, 38, 123, 196, 216, 233, 16, 191, 121, 245, 55, 170, 253, + 236, 237, 222, 158, 48, 209, 119, 3, 37, 16, 98, 77, 140, 110, 103, 81, + 247, 161, 152, 250, 182, 219, 19, 228, 30, 205, 187, 125, 203, 103, 143, 224, + 1, 86, 126, 192, 123, 90, 171, 214, 80, 91, 184, 66, 50, 233, 166, 185, + 24, 204, 227, 42, 103, 221, 32, 239, 254, 57, 198, 218, 145, 87, 184, 189, + 153, 118, 226, 57, 245, 1, 230, 89, 160, 87, 171, 95, 175, 187, 199, 39, + 180, 37, 152, 51, 142, 179, 108, 116, 150, 71, 129, 23, 184, 9, 69, 251, + 13, 2, 241, 152, 128, 108, 53, 24, 115, 53, 120, 143, 105, 72, 207, 52, + 208, 170, 64, 117, 78, 45, 84, 166, 156, 117, 125, 191, 246, 167, 209, 12, + 220, 150, 76, 75, 244, 12, 18, 47, 51, 159, 52, 117, 68, 218, 232, 79, + 76, 24, 113, 81, 208, 185, 6, 86, 225, 27, 101, 246, 20, 202, 27, 104, + 10, 54, 24, 184, 211, 141, 145, 232, 145, 253, 120, 12, 119, 57, 253, 233, + 120, 216, 193, 20, 244, 50, 91, 42, 197, 109, 36, 142, 200, 139, 120, 190, + 218, 91, 12, 77, 146, 233, 152, 61, 93, 83, 87, 54, 121, 238, 37, 197, + 188, 65, 220, 6, 145, 123, 179, 207, 239, 174, 62, 196, 66, 124, 97, 138, + 241, 56, 29, 99, 144, 192, 214, 196, 76, 56, 118, 3, 156, 84, 101, 136, + 130, 144, 240, 26, 166, 201, 49, 161, 164, 26, 77, 75, 130, 219, 111, 161, + 27, 90, 210, 15, 60, 233, 53, 49, 22, 52, 50, 141, 250, 135, 212, 179, + 153, 205, 87, 219, 228, 23, 13, 27, 238, 155, 24, 235, 124, 210, 176, 26, + 25, 255, 240, 224, 106, 69, 21, 251, 102, 48, 190, 143, 166, 182, 107, 135, + 60, 69, 61, 104, 70, 39, 239, 97, 147, 190, 124, 62, 169, 231, 9, 15, + 149, 111, 255, 204, 25, 49, 144, 3, 58, 234, 76, 102, 86, 139, 167, 186, + 93, 44, 250, 53, 216, 69, 140, 203, 31, 143, 154, 37, 54, 100, 7, 45, + 74, 249, 44, 189, 111, 214, 2, 219, 160, 95, 133, 1, 96, 3, 151, 219, + 234, 199, 152, 116, 170, 252, 13, 202, 223, 13, 198, 108, 188, 152, 224, 10, + 138, 168, 20, 236, 29, 212, 142, 186, 140, 85, 122, 63, 146, 108, 205, 130, + 182, 78, 204, 48, 111, 43, 149, 151, 153, 245, 192, 243, 139, 241, 98, 182, + 145, 226, 247, 119, 5, 97, 85, 58, 80, 73, 159, 134, 105, 1, 28, 252, + 8, 201, 54, 155, 227, 166, 153, 14, 22, 160, 3, 3, 246, 242, 80, 11, + 66, 151, 29, 123, 102, 64, 249, 74, 146, 110, 144, 244, 17, 74, 109, 60, + 185, 186, 239, 128, 131, 43, 116, 46, 102, 60, 250, 56, 108, 168, 214, 51, + 101, 18, 104, 234, 232, 24, 15, 175, 161, 8, 196, 253, 52, 248, 87, 84, + 238, 134, 203, 125, 100, 189, 178, 64, 138, 197, 100, 1, 168, 105, 80, 220, + 88, 71, 77, 166, 150, 152, 54, 171, 134, 180, 122, 142, 241, 97, 44, 101, + 45, 199, 178, 183, 228, 25, 109, 249, 68, 44, 11, 139, 202, 242, 50, 195, + 149, 246, 207, 47, 156, 106, 51, 31, 111, 36, 225, 126, 204, 16, 45, 231, + 139, 105, 212, 187, 186, 29, 116, 102, 51, 204, 150, 186, 158, 4, 65, 22, + 83, 171, 132, 27, 78, 184, 227, 80, 136, 155, 111, 57, 19, 134, 68, 179, + 179, 178, 62, 21, 39, 107, 40, 109, 33, 135, 231, 209, 130, 172, 104, 34, + 33, 62, 9, 39, 252, 9, 36, 143, 237, 171, 59, 157, 91, 62, 147, 165, + 76, 189, 167, 110, 217, 32, 218, 150, 204, 216, 55, 191, 110, 102, 139, 235, + 234, 36, 94, 70, 131, 71, 102, 90, 60, 157, 175, 120, 186, 187, 249, 121, + 58, 125, 4, 171, 43, 226, 164, 23, 205, 59, 241, 96, 198, 52, 28, 79, + 23, 76, 210, 96, 155, 72, 81, 233, 118, 23, 247, 91, 244, 91, 116, 149, + 56, 144, 35, 138, 185, 75, 136, 136, 105, 60, 88, 17, 196, 10, 114, 27, + 185, 245, 252, 3, 210, 108, 116, 154, 141, 206, 220, 121, 116, 254, 13, 113, + 225, 103, 192, 220, 96, 214, 147, 2, 59, 165, 81, 56, 85, 30, 98, 61, + 222, 147, 206, 156, 70, 238, 19, 183, 0, 149, 233, 207, 12, 59, 252, 157, + 88, 77, 94, 252, 13, 62, 224, 42, 202, 106, 239, 74, 127, 67, 25, 54, + 76, 26, 110, 32, 92, 109, 118, 74, 221, 195, 82, 241, 68, 43, 128, 48, + 94, 103, 56, 94, 220, 12, 176, 195, 158, 184, 138, 132, 163, 249, 80, 111, + 186, 68, 137, 19, 98, 193, 210, 167, 138, 137, 222, 242, 91, 244, 231, 31, + 11, 7, 134, 226, 253, 70, 122, 42, 250, 50, 41, 229, 145, 65, 102, 110, + 225, 204, 106, 8, 139, 56, 201, 202, 161, 143, 96, 228, 213, 12, 254, 209, + 26, 138, 115, 146, 193, 235, 18, 247, 88, 235, 36, 5, 11, 41, 221, 138, + 162, 4, 206, 79, 13, 69, 8, 248, 249, 162, 54, 105, 194, 253, 19, 169, + 51, 197, 149, 21, 83, 162, 138, 179, 3, 94, 69, 147, 255, 104, 207, 148, + 178, 211, 25, 197, 201, 31, 153, 150, 163, 104, 138, 173, 119, 60, 235, 196, + 93, 139, 249, 25, 66, 164, 24, 115, 146, 147, 108, 36, 201, 126, 4, 11, + 177, 244, 25, 168, 62, 220, 88, 81, 57, 152, 47, 77, 66, 18, 154, 85, + 99, 240, 54, 38, 27, 214, 240, 216, 219, 111, 51, 90, 75, 35, 43, 48, + 177, 116, 206, 35, 155, 193, 142, 173, 230, 246, 184, 95, 144, 249, 177, 194, + 163, 206, 112, 128, 107, 54, 195, 90, 168, 223, 208, 180, 118, 104, 140, 202, + 47, 42, 229, 38, 77, 249, 72, 243, 199, 16, 68, 251, 16, 49, 199, 196, + 215, 135, 166, 180, 44, 196, 111, 56, 193, 35, 176, 1, 153, 138, 162, 95, + 7, 44, 64, 56, 31, 176, 88, 217, 117, 94, 42, 23, 163, 229, 164, 200, + 230, 249, 75, 165, 106, 192, 134, 250, 235, 229, 121, 169, 202, 209, 71, 126, + 80, 122, 223, 128, 46, 184, 164, 56, 48, 181, 204, 195, 186, 119, 34, 247, + 227, 188, 203, 122, 138, 233, 169, 136, 159, 244, 96, 166, 96, 219, 76, 6, + 227, 249, 230, 34, 133, 240, 114, 95, 131, 254, 53, 158, 207, 87, 111, 104, + 127, 154, 89, 204, 83, 19, 44, 205, 76, 98, 126, 242, 24, 38, 229, 83, + 234, 206, 248, 174, 179, 153, 77, 8, 121, 48, 27, 35, 135, 79, 115, 125, + 149, 243, 127, 173, 137, 157, 134, 58, 66, 41, 92, 117, 140, 17, 13, 245, + 201, 74, 168, 150, 148, 155, 18, 129, 253, 129, 34, 30, 227, 57, 192, 162, + 12, 145, 165, 13, 161, 50, 211, 109, 128, 130, 119, 236, 231, 138, 179, 59, + 32, 224, 21, 151, 119, 135, 230, 111, 170, 234, 139, 93, 211, 208, 59, 101, + 150, 226, 165, 117, 17, 94, 102, 136, 105, 63, 173, 54, 77, 252, 248, 82, + 140, 103, 67, 218, 25, 193, 20, 12, 165, 231, 27, 216, 28, 91, 124, 44, + 22, 202, 205, 148, 186, 72, 167, 169, 100, 205, 111, 61, 97, 111, 72, 7, + 206, 232, 211, 182, 158, 240, 43, 75, 204, 56, 98, 124, 62, 109, 255, 73, + 137, 163, 177, 116, 37, 222, 44, 177, 221, 173, 39, 66, 214, 164, 28, 243, + 253, 26, 79, 116, 89, 152, 193, 171, 212, 247, 68, 92, 6, 154, 158, 203, + 90, 232, 163, 181, 96, 51, 140, 180, 166, 222, 208, 218, 157, 125, 6, 11, + 240, 44, 211, 18, 236, 70, 71, 114, 47, 224, 159, 108, 213, 31, 126, 181, + 65, 249, 155, 180, 252, 124, 247, 226, 212, 167, 40, 136, 79, 234, 97, 17, + 46, 53, 114, 127, 90, 247, 118, 59, 83, 113, 154, 196, 5, 160, 160, 206, + 116, 186, 26, 177, 159, 61, 211, 134, 115, 155, 78, 98, 70, 50, 205, 115, + 19, 255, 225, 161, 58, 6, 248, 234, 2, 8, 107, 206, 87, 135, 32, 16, + 79, 248, 146, 19, 77, 0, 162, 209, 92, 127, 55, 116, 132, 223, 252, 163, + 51, 218, 124, 59, 190, 237, 159, 110, 126, 225, 234, 55, 63, 161, 254, 29, + 43, 43, 15, 237, 237, 180, 179, 98, 38, 222, 95, 13, 106, 176, 15, 212, + 31, 199, 163, 30, 168, 190, 211, 205, 183, 84, 247, 230, 87, 170, 252, 0, + 56, 87, 209, 128, 78, 192, 116, 6, 184, 30, 44, 254, 122, 96, 247, 246, + 235, 191, 118, 70, 61, 232, 36, 174, 78, 55, 255, 206, 16, 84, 223, 68, + 189, 234, 43, 120, 184, 124, 26, 230, 1, 161, 238, 65, 116, 221, 89, 117, + 230, 131, 78, 55, 134, 151, 194, 191, 190, 155, 247, 0, 254, 106, 218, 249, + 125, 17, 157, 110, 126, 96, 24, 54, 175, 168, 167, 59, 243, 205, 15, 157, + 205, 151, 12, 199, 33, 208, 71, 31, 226, 78, 111, 65, 100, 122, 68, 83, + 250, 247, 127, 66, 175, 239, 235, 244, 4, 246, 104, 243, 15, 6, 97, 211, + 217, 12, 158, 127, 45, 80, 28, 52, 167, 163, 206, 28, 84, 194, 95, 63, + 79, 246, 64, 252, 221, 248, 110, 65, 132, 221, 233, 230, 215, 126, 68, 211, + 154, 170, 223, 188, 205, 241, 95, 21, 172, 209, 32, 154, 244, 59, 163, 185, + 178, 11, 80, 171, 177, 58, 68, 191, 51, 103, 255, 24, 44, 179, 249, 40, + 208, 138, 184, 216, 3, 178, 119, 120, 39, 127, 135, 42, 55, 95, 77, 59, + 247, 185, 109, 59, 233, 212, 255, 247, 97, 188, 30, 99, 114, 207, 254, 251, + 208, 239, 159, 199, 190, 243, 44, 176, 139, 33, 157, 253, 230, 241, 48, 58, + 233, 28, 2, 109, 224, 166, 172, 163, 108, 159, 6, 25, 88, 253, 80, 168, + 183, 221, 224, 190, 30, 19, 38, 235, 222, 17, 180, 73, 245, 155, 159, 198, + 155, 147, 151, 7, 64, 252, 255, 242, 218, 234, 141, 111, 51, 176, 118, 199, + 163, 15, 56, 89, 227, 112, 242, 87, 67, 219, 120, 178, 115, 191, 76, 107, + 63, 0, 214, 120, 26, 207, 48, 147, 63, 29, 76, 95, 174, 106, 246, 237, + 194, 79, 83, 12, 223, 115, 213, 187, 168, 240, 14, 118, 234, 193, 32, 3, + 40, 209, 69, 8, 31, 15, 158, 152, 176, 250, 100, 25, 238, 156, 176, 159, + 178, 7, 235, 237, 0, 227, 255, 163, 84, 189, 3, 88, 225, 77, 102, 64, + 29, 139, 64, 235, 128, 162, 59, 179, 197, 52, 186, 237, 76, 123, 209, 168, + 51, 234, 220, 82, 204, 65, 235, 141, 0, 15, 24, 122, 116, 55, 46, 155, + 51, 141, 8, 113, 191, 105, 182, 163, 193, 108, 151, 189, 180, 196, 32, 162, + 86, 40, 41, 219, 193, 230, 181, 130, 106, 243, 45, 131, 181, 121, 169, 224, + 218, 125, 28, 162, 147, 206, 172, 147, 197, 29, 220, 224, 217, 125, 60, 239, + 211, 68, 135, 0, 37, 29, 35, 133, 227, 250, 196, 60, 170, 171, 182, 249, + 13, 182, 27, 248, 23, 80, 72, 179, 17, 40, 36, 97, 252, 206, 54, 0, + 9, 211, 95, 193, 68, 36, 7, 3, 117, 104, 195, 136, 190, 167, 67, 18, + 174, 112, 198, 55, 119, 157, 120, 58, 94, 116, 70, 79, 53, 40, 248, 228, + 6, 237, 93, 192, 50, 76, 223, 143, 54, 4, 5, 225, 115, 2, 99, 51, + 190, 161, 102, 10, 32, 135, 205, 60, 56, 134, 153, 244, 199, 163, 85, 112, + 216, 44, 251, 107, 70, 130, 1, 127, 173, 171, 222, 4, 135, 193, 122, 223, + 39, 148, 74, 187, 38, 157, 206, 232, 156, 57, 190, 145, 61, 233, 191, 17, + 110, 58, 16, 68, 243, 211, 205, 219, 20, 142, 77, 117, 243, 245, 168, 135, + 110, 151, 29, 234, 208, 78, 151, 139, 227, 94, 52, 140, 230, 31, 89, 194, + 228, 32, 20, 85, 219, 71, 169, 236, 156, 53, 251, 90, 241, 85, 52, 232, + 44, 70, 157, 21, 70, 64, 224, 216, 244, 8, 95, 105, 72, 30, 155, 252, + 25, 50, 43, 213, 79, 102, 78, 196, 163, 13, 208, 160, 250, 13, 54, 1, + 250, 231, 230, 253, 143, 73, 197, 155, 111, 112, 179, 76, 40, 234, 151, 104, + 23, 17, 179, 139, 234, 162, 131, 217, 211, 167, 72, 233, 239, 0, 82, 6, + 135, 119, 248, 147, 167, 200, 175, 63, 68, 224, 93, 157, 109, 232, 100, 182, + 239, 52, 185, 7, 228, 251, 78, 60, 155, 119, 199, 79, 29, 203, 52, 190, + 108, 2, 229, 251, 199, 9, 232, 94, 211, 128, 189, 161, 200, 179, 44, 89, + 139, 43, 189, 253, 107, 21, 16, 191, 213, 48, 28, 12, 246, 44, 154, 126, + 24, 199, 211, 62, 77, 179, 78, 47, 138, 104, 196, 254, 251, 206, 195, 175, + 227, 110, 103, 54, 27, 203, 102, 252, 70, 131, 114, 32, 232, 157, 1, 77, + 121, 58, 192, 143, 169, 132, 225, 65, 48, 11, 148, 91, 16, 239, 232, 235, + 3, 56, 35, 47, 185, 250, 205, 43, 169, 255, 64, 152, 19, 27, 2, 163, + 168, 51, 165, 115, 219, 125, 52, 157, 28, 68, 169, 243, 68, 169, 53, 27, + 127, 186, 203, 147, 211, 176, 134, 100, 3, 80, 136, 92, 96, 88, 14, 108, + 6, 35, 121, 54, 63, 192, 244, 2, 43, 197, 28, 208, 138, 176, 214, 106, + 238, 153, 53, 33, 92, 205, 250, 59, 90, 177, 123, 194, 167, 195, 192, 120, + 126, 243, 13, 96, 81, 148, 2, 160, 217, 22, 191, 233, 69, 210, 158, 79, + 149, 193, 129, 186, 81, 245, 102, 241, 169, 151, 117, 121, 43, 5, 170, 242, + 163, 212, 88, 57, 98, 172, 219, 241, 22, 103, 242, 7, 157, 194, 62, 160, + 184, 249, 120, 186, 152, 133, 189, 189, 133, 129, 205, 137, 36, 135, 148, 37, + 166, 41, 178, 69, 5, 41, 27, 250, 53, 71, 31, 82, 208, 140, 38, 196, + 96, 128, 179, 253, 190, 178, 126, 209, 41, 14, 41, 46, 89, 51, 185, 86, + 6, 6, 219, 95, 165, 56, 164, 56, 99, 71, 204, 148, 151, 94, 93, 166, + 91, 215, 33, 229, 177, 33, 179, 28, 104, 105, 75, 149, 225, 180, 167, 139, + 81, 18, 35, 241, 56, 63, 2, 91, 146, 34, 185, 107, 134, 125, 5, 18, + 248, 227, 143, 227, 241, 112, 47, 104, 111, 84, 2, 42, 204, 226, 251, 115, + 235, 31, 184, 63, 191, 166, 204, 167, 20, 132, 117, 124, 106, 205, 250, 244, + 74, 212, 19, 133, 208, 75, 145, 222, 176, 44, 100, 238, 47, 38, 189, 142, + 136, 52, 70, 165, 255, 241, 127, 0, 52, 188, 145, 34 }; const unsigned long size_data_gmic_stdlib = (unsigned long)sizeof(data_gmic_stdlib); diff -Nru gmic-2.4.5/src/Makefile gmic-2.9.2/src/Makefile --- gmic-2.4.5/src/Makefile 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/src/Makefile 2020-09-03 11:37:05.000000000 +0000 @@ -7,13 +7,13 @@ # . the G'MIC command line tool (type 'make cli'). # . the G'MIC library, with the C++ API (type 'make lib'). # . the G'MIC library, with the C API (type 'make libc' or 'make libcstatic'). -# . the G'MIC plug-in for GIMP, recommended Qt-based version (type 'make gimp'). +# . the G'MIC plug-in for GIMP (type 'make gimp'). # . the G'MIC plug-in for Krita (type 'make krita'). # . To compile all of them, just type 'make', or 'make all'). # # ( https://gmic.eu ) # -# Copyright : David Tschumperle +# Copyright : David Tschumperlé # ( https://tschumperle.users.greyc.fr/ ) # # Licenses : This file is 'dual-licensed', you have to choose one @@ -21,17 +21,17 @@ # # CeCILL-C # The CeCILL-C license is close to the GNU LGPL. -# ( http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html ) +# ( http://cecill.info/licences/Licence_CeCILL-C_V1-en.html ) # # or CeCILL v2.1 # The CeCILL license is compatible with the GNU GPL. -# ( http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html ) +# ( http://cecill.info/licences/Licence_CeCILL_V2.1-en.html ) # # This software is governed either by the CeCILL or the CeCILL-C license # under French law and abiding by the rules of distribution of free software. # You can use, modify and or redistribute the software under the terms of # the CeCILL or CeCILL-C licenses as circulated by CEA, CNRS and INRIA -# at the following URL: "http://www.cecill.info". +# at the following URL: "http://cecill.info". # # As a counterpart to the access to the source code and rights to copy, # modify and redistribute granted by the license, users are provided only @@ -82,10 +82,9 @@ else CIMG_VERSION = $(VERSION) endif + ifneq ($(VERSION),$(CIMG_VERSION)) -MISMATCH_VERSIONS=1 -else -MISMATCH_VERSIONS=0 +REMOVE_CIMG_H := $(shell rm -f CImg.h) endif ifeq ($(OS),Linux) @@ -116,6 +115,7 @@ ifneq (, $(findstring MINGW, $(OS))) OS = Windows +USR = /mingw64 endif ifeq ($(OS),Darwin) @@ -163,8 +163,9 @@ NO_PRERELEASE_CFLAGS = -Dgmic_prerelease="\\\"$(PRERELEASE)\\\"" # Minimal set of flags mandatory to compile G'MIC. -MANDATORY_CFLAGS = -Dgmic_build -Dcimg_date=\\\"\\\" -Dcimg_time=\\\"\\\" -Dcimg_use_zlib $(shell pkg-config --cflags zlib || echo -I$(USR)/$(INCLUDE)) $(PRERELEASE_CFLAGS) $(EXTRA_CFLAGS) +MANDATORY_CFLAGS = -Dgmic_build -Dcimg_date=\\\"\\\" -Dcimg_time=\\\"\\\" -Dcimg_use_zlib -I. $(shell pkg-config --cflags zlib || echo -I$(USR)/$(INCLUDE)) $(PRERELEASE_CFLAGS) $(EXTRA_CFLAGS) MANDATORY_LIBS = $(shell pkg-config --libs zlib || echo -lz) $(EXTRA_LIBS) + ifndef NO_SRIPDLIB MANDATORY_CFLAGS += -std=c++11 -pedantic endif @@ -172,6 +173,10 @@ ifdef IS_GCC MANDATORY_CFLAGS += -Wall -Wextra -Wfatal-errors -Werror=unknown-pragmas -Werror=unused-label MANDATORY_LIBS += -lm +GCC_VER_GTEQ5 = $(shell expr `$(CXX) -dumpversion | cut -f1 -d.` \>= 5) +ifeq ($(GCC_VER_GTEQ5),1) +MANDATORY_CFLAGS += -Wshadow +endif endif ifeq ($(OS),Unix) MANDATORY_CFLAGS += -Dcimg_use_vt100 @@ -185,15 +190,20 @@ MANDATORY_LIBS += -Wl,--stack,16777216 endif -# Enable optimizations. -OPT_CFLAGS = -Ofast +# Enable optimizations for 'cli'. +FLTO = -flto +OPT_CLI_CFLAGS = -Ofast ifdef IS_GCC -OPT_CFLAGS = -Ofast -mtune=generic # -fno-finite-math-only +OPT_CLI_CFLAGS = -Ofast -mtune=generic $(FLTO) +OPT_CLI_LIBS = $(FLTO) endif ifdef icpc -OPT_CFLAGS = -fast +OPT_CLI_CFLAGS = -fast endif +# Enable optimizations for other targets. +OPT_CFLAGS = -O2 + # Enable multi-threading support. PARALLEL_CFLAGS = -Dgmic_is_parallel ifneq ($(OS),Windows) @@ -240,7 +250,7 @@ # Enable faster X11 display, using XShm extension. # (ftp://www.x.org/pub/X11R7.7/doc/man/man3/XShm.3.xhtml) XSHM_CFLAGS = -Dcimg_use_xshm $(shell pkg-config --cflags xcb-shm) -XSHM_LIBS = $(shell pkg-config --libs xcb-shm || echo -L$(USR)/X11R6/lib -lXext) +XSHM_LIBS = $(shell pkg-config --libs xcb-shm || echo -L$(USR)/X11R6/lib) -lXext # Enable image display, using GDI32 (Windows). GDI32_CFLAGS = -Dcimg_display=2 @@ -283,8 +293,8 @@ # Enable native support of webcams and video streaming, using the OpenCV library. # (https://opencv.org/) -OPENCV_CFLAGS = -Dcimg_use_opencv $(shell pkg-config opencv --cflags || echo -I/usr/include/opencv) -I/usr/include/opencv -OPENCV_LIBS = $(shell pkg-config opencv --libs || echo -lopencv_core -lopencv_highgui) +OPENCV_CFLAGS = -Dcimg_use_opencv $(shell pkg-config opencv --cflags) -I/usr/include/opencv -I/usr/include/opencv4 +OPENCV_LIBS = $(shell pkg-config opencv --libs || echo -lopencv_core -lopencv_highgui -lopencv_videoio) # Enable support of most classical image file formats, using the GraphicsMagick++ library. # (http://www.graphicsmagick.org/Magick++/) @@ -334,38 +344,40 @@ # CLI (standard) #--------------- -GMIC_CLI_CFLAGS = $(MANDATORY_CFLAGS) $(ABORT_CFLAGS) $(PARALLEL_CFLAGS) $(FFTW_CFLAGS) $(CURL_CFLAGS) $(PNG_CFLAGS) $(JPEG_CFLAGS) $(TIFF_CFLAGS) -GMIC_CLI_LIBS = $(MANDATORY_LIBS) $(PARALLEL_LIBS) $(FFTW_LIBS) $(CURL_LIBS) $(PNG_LIBS) $(JPEG_LIBS) $(TIFF_LIBS) -ifeq ($(OS),Unix) # Unix. -GMIC_CLI_CFLAGS += $(OPENMP_CFLAGS) $(X11_CFLAGS) $(OPENEXR_CFLAGS) $(OPENCV_CFLAGS) # $(XSHM_CFLAGS) $(MAGICK_CFLAGS) +GMIC_CLI_CFLAGS = $(MANDATORY_CFLAGS) $(ABORT_CFLAGS) $(PARALLEL_CFLAGS) $(EIGEN_CFLAGS) $(FFTW_CFLAGS) $(CURL_CFLAGS) $(PNG_CFLAGS) $(JPEG_CFLAGS) $(TIFF_CFLAGS) +GMIC_CLI_LIBS = $(MANDATORY_LIBS) $(PARALLEL_LIBS) $(EIGEN_LIBS) $(FFTW_LIBS) $(CURL_LIBS) $(PNG_LIBS) $(JPEG_LIBS) $(TIFF_LIBS) +ifeq ($(OS),Unix) # Unix +GMIC_CLI_CFLAGS += $(OPENMP_CFLAGS) $(X11_CFLAGS) $(OPENEXR_CFLAGS) $(OPENCV_CFLAGS) # $(XSHM_CFLAGS) # $(MAGICK_CFLAGS) GMIC_CLI_LIBS += $(OPENMP_LIBS) $(X11_LIBS) $(OPENEXR_LIBS) $(OPENCV_LIBS) # $(XSHM_LIBS) # $(MAGICK_LIBS) else -ifeq ($(OS),Darwin) # MacOSX. +ifeq ($(OS),Darwin) # MacOSX GMIC_CLI_CFLAGS += $(X11_CFLAGS) $(OPENEXR_CFLAGS) $(OPENCV_CFLAGS) -GMIC_CLI_LIBS += $(X11_LIBS) $(OPENEXR_LIBS) $(OPENCV_LIBS) $(OPT_LIBS) -else # Windows. +GMIC_CLI_LIBS += $(X11_LIBS) $(OPENEXR_LIBS) $(OPENCV_LIBS) +else # Windows GMIC_CLI_CFLAGS += $(OPENMP_CFLAGS) $(GDI32_CFLAGS) $(OPENCV_CFLAGS) GMIC_CLI_LIBS += $(OPENMP_LIBS) $(GDI32_LIBS) $(OPENCV_LIBS) endif endif cli: - $(MAKE) "CFLAGS+=$(GMIC_CLI_CFLAGS) $(OPT_CFLAGS)" "LIBS+=$(GMIC_CLI_LIBS)" _cli + $(MAKE) "CFLAGS+=$(GMIC_CLI_CFLAGS) $(OPT_CLI_CFLAGS)" "LIBS+=$(GMIC_CLI_LIBS) $(OPT_LIBS)" _cli $(STRIP) gmic$(EXE) debug: $(MAKE) "CFLAGS+=$(GMIC_CLI_CFLAGS) $(DEBUG_CFLAGS)" "LIBS+=$(GMIC_CLI_LIBS)" _cli -_cli: check_versions gmic.cpp gmic.h gmic_stdlib.h CImg.h - $(CXX) -o gmic_cli.o -c gmic.cpp $(CFLAGS) +_cli: gmic_cli.o gmic.cpp gmic.h gmic_stdlib.h CImg.h $(CXX) -o gmic gmic_cli.cpp gmic_cli.o $(CFLAGS) $(LIBS) +gmic_cli.o: gmic.cpp gmic.h gmic_stdlib.h CImg.h + $(CXX) -o gmic_cli.o -c gmic.cpp $(CFLAGS) + # CLI (static) #------------- GMIC_STATIC_CLI_PATH = $(USR)/$(LIB)/x86_64-linux-gnu GMIC_STATIC_CLI_EXTRA = -GMIC_STATIC_CLI_CFLAGS = $(MANDATORY_CFLAGS) $(ABORT_CFLAGS) $(PARALLEL_CFLAGS) $(ZLIB_CFLAGS) $(FFTW_CFLAGS) $(PNG_CFLAGS) $(JPEG_CFLAGS) -Dcimg_display=0 -GMIC_STATIC_CLI_LIBS = $(PARALLEL_LIBS) \ +GMIC_STATIC_CLI_CFLAGS = $(MANDATORY_CFLAGS) $(ABORT_CFLAGS) $(PARALLEL_CFLAGS) $(EIGEN_CFLAGS) $(ZLIB_CFLAGS) $(FFTW_CFLAGS) $(PNG_CFLAGS) $(JPEG_CFLAGS) -Dcimg_display=0 +GMIC_STATIC_CLI_LIBS = $(PARALLEL_LIBS) $(EIGEN_LIBS) \ $(GMIC_STATIC_CLI_PATH)/libpng.a \ $(GMIC_STATIC_CLI_PATH)/libjpeg.a \ $(GMIC_STATIC_CLI_PATH)/libz.a \ @@ -373,20 +385,20 @@ $(GMIC_STATIC_CLI_EXTRA) static: - $(MAKE) "CFLAGS+=$(GMIC_STATIC_CLI_CFLAGS) $(OPT_CFLAGS)" "LIBS+=$(GMIC_STATIC_CLI_LIBS)" _cli + $(MAKE) "CFLAGS+=$(GMIC_STATIC_CLI_CFLAGS) $(OPT_CFLAGS)" "LIBS+=$(GMIC_STATIC_CLI_LIBS) $(OPT_LIBS)" _cli $(STRIP) gmic$(EXE) # Libgmic #-------- -GMIC_LIB_CFLAGS = $(MANDATORY_CFLAGS) $(ABORT_CFLAGS) $(PARALLEL_CFLAGS) $(FFTW_CFLAGS) $(CURL_CFLAGS) $(PNG_CFLAGS) $(JPEG_CFLAGS) $(TIFF_CFLAGS) -GMIC_LIB_LIBS = $(MANDATORY_LIBS) $(PARALLEL_LIBS) $(FFTW_LIBS) $(CURL_LIBS) $(PNG_LIBS) $(JPEG_LIBS) $(TIFF_LIBS) +GMIC_LIB_CFLAGS = $(MANDATORY_CFLAGS) $(ABORT_CFLAGS) $(PARALLEL_CFLAGS) $(EIGEN_CFLAGS) $(FFTW_CFLAGS) $(CURL_CFLAGS) $(PNG_CFLAGS) $(JPEG_CFLAGS) $(TIFF_CFLAGS) +GMIC_LIB_LIBS = $(MANDATORY_LIBS) $(PARALLEL_LIBS) $(EIGEN_LIBS) $(FFTW_LIBS) $(CURL_LIBS) $(PNG_LIBS) $(JPEG_LIBS) $(TIFF_LIBS) ifeq ($(OS),Unix) # Unix. GMIC_LIB_CFLAGS += $(OPENMP_CFLAGS) $(X11_CFLAGS) GMIC_LIB_LIBS += $(OPENMP_LIBS) $(X11_LIBS) else ifeq ($(OS),Darwin) # MacOSX. GMIC_LIB_CFLAGS += $(X11_CFLAGS) -GMIC_LIB_LIBS += $(X11_LIBS) $(OPT_LIBS) +GMIC_LIB_LIBS += $(X11_LIBS) else # Windows. GMIC_LIB_CFLAGS += $(OPENMP_CFLAGS) $(GDI32_CFLAGS) GMIC_LIB_LIBS += $(OPENMP_LIBS) $(GDI32_LIBS) @@ -394,31 +406,31 @@ endif lib: - $(MAKE) "CFLAGS+=$(GMIC_LIB_CFLAGS) $(OPT_CFLAGS)" "LIBS+=$(GMIC_LIB_LIBS)" _lib + $(MAKE) "CFLAGS+=$(GMIC_LIB_CFLAGS) $(OPT_CFLAGS)" "LIBS+=$(GMIC_LIB_LIBS) $(OPT_LIBS)" _lib _lib: libgmic.o use_libgmic.cpp ar rcs libgmic.a libgmic.o ifeq ($(OS),Darwin) - $(CXX) -shared -o libgmic.so libgmic.o $(LIBS) + $(CXX) -shared -std=c++11 -pedantic -o libgmic.so libgmic.o $(LIBS) else - $(CXX) -shared -Wl,-soname,libgmic.so.$(VERSION1) -o libgmic.so libgmic.o $(LIBS) - $(CXX) -o use_libgmic use_libgmic.cpp -L. -lgmic $(LIBS) + $(CXX) -shared -std=c++11 -pedantic -Wl,-soname,libgmic.so.$(VERSION1) -o libgmic.so libgmic.o $(LIBS) + $(CXX) -o use_libgmic use_libgmic.cpp -std=c++11 -pedantic -L. -lgmic $(LIBS) endif -libgmic.o: check_versions gmic.cpp gmic.h gmic_stdlib.h CImg.h +libgmic.o: gmic.cpp gmic.h gmic_stdlib.h CImg.h $(CXX) -o libgmic.o -c gmic.cpp $(PIC) $(CFLAGS) # LibCgmic (standard) #-------------------- -GMIC_LIBC_CFLAGS = $(MANDATORY_CFLAGS) $(ABORT_CFLAGS) $(PARALLEL_CFLAGS) $(FFTW_CFLAGS) $(CURL_CFLAGS) $(PNG_CFLAGS) $(JPEG_CFLAGS) $(TIFF_CFLAGS) -GMIC_LIBC_LIBS = $(MANDATORY_LIBS) $(PARALLEL_LIBS) $(FFTW_LIBS) $(CURL_LIBS) $(PNG_LIBS) $(JPEG_LIBS) $(TIFF_LIBS) +GMIC_LIBC_CFLAGS = $(MANDATORY_CFLAGS) $(ABORT_CFLAGS) $(PARALLEL_CFLAGS) $(EIGEN_CFLAGS) $(FFTW_CFLAGS) $(CURL_CFLAGS) $(PNG_CFLAGS) $(JPEG_CFLAGS) $(TIFF_CFLAGS) +GMIC_LIBC_LIBS = $(MANDATORY_LIBS) $(PARALLEL_LIBS) $(EIGEN_LIBS) $(FFTW_LIBS) $(CURL_LIBS) $(PNG_LIBS) $(JPEG_LIBS) $(TIFF_LIBS) ifeq ($(OS),Unix) # Unix. GMIC_LIBC_CFLAGS += $(OPENMP_CFLAGS) $(X11_CFLAGS) GMIC_LIBC_LIBS += $(OPENMP_LIBS) $(X11_LIBS) else ifeq ($(OS),Darwin) # MacOSX. GMIC_LIBC_CFLAGS += $(X11_CFLAGS) -GMIC_LIBC_LIBS += $(X11_LIBS) $(OPT_LIBS) +GMIC_LIBC_LIBS += $(X11_LIBS) else # Windows. GMIC_LIBC_CFLAGS += $(OPENMP_CFLAGS) $(GDI32_CFLAGS) GMIC_LIBC_LIBS += $(OPENMP_LIBS) $(GDI32_LIBS) @@ -426,7 +438,7 @@ endif libc: - $(MAKE) "CFLAGS+=$(GMIC_LIBC_CFLAGS) $(OPT_CFLAGS)" "LIBS+=$(GMIC_LIBC_LIBS)" _libc + $(MAKE) "CFLAGS+=$(GMIC_LIBC_CFLAGS) $(OPT_CFLAGS)" "LIBS+=$(GMIC_LIBC_LIBS) $(OPT_LIBS)" _libc _libc: libcgmic_files libgmic.o libcgmic.o ar rcs libcgmic.a libcgmic.o @@ -441,7 +453,7 @@ endif $(CC) -std=c99 -o use_libcgmic use_libcgmic.c -L. -lcgmic -libcgmic.o: check_versions gmic.cpp gmic.h gmic_stdlib.h CImg.h +libcgmic.o: gmic.cpp gmic.h gmic_stdlib.h CImg.h $(CXX) -o libcgmic.o -c gmic_libc.cpp $(PIC) $(CFLAGS) libcgmic_files: @@ -462,18 +474,18 @@ # LibCgmic (static) #------------------ -GMIC_LIBC_STATIC_CFLAGS = $(MANDATORY_CFLAGS) $(ABORT_CFLAGS) $(PARALLEL_CFLAGS) $(FFTW_CFLAGS) $(PNG_CFLAGS) $(JPEG_CFLAGS) # $(CURL_CFLAGS) $(TIFF_CFLAGS) +GMIC_LIBC_STATIC_CFLAGS = $(MANDATORY_CFLAGS) $(ABORT_CFLAGS) $(PARALLEL_CFLAGS) $(EIGEN_CFLAGS) $(FFTW_CFLAGS) $(PNG_CFLAGS) $(JPEG_CFLAGS) # $(CURL_CFLAGS) $(TIFF_CFLAGS) ifeq ($(OS),Window) GMIC_LIBC_STATIC_LIBS = -Bstatic -lpthread endif -GMIC_LIBC_STATIC_LIBS += $(MANDATORY_LIBS) $(PARALLEL_LIBS) $(FFTW_LIBS) $(PNG_LIBS) $(JPEG_LIBS) # $(CURL_LIBS) $(TIFF_LIBS) +GMIC_LIBC_STATIC_LIBS += $(MANDATORY_LIBS) $(PARALLEL_LIBS) $(EIGEN_LIBS) $(FFTW_LIBS) $(PNG_LIBS) $(JPEG_LIBS) # $(CURL_LIBS) $(TIFF_LIBS) ifeq ($(OS),Unix) # Unix. GMIC_LIBC_STATIC_CFLAGS += $(OPENMP_CFLAGS) $(X11_CFLAGS) GMIC_LIBC_STATIC_LIBS += $(OPENMP_LIBS) $(X11_LIBS) else ifeq ($(OS),Darwin) # MacOSX. GMIC_LIBC_STATIC_CFLAGS += $(X11_CFLAGS) -GMIC_LIBC_STATIC_LIBS += $(X11_LIBS) $(OPT_LIBS) +GMIC_LIBC_STATIC_LIBS += $(X11_LIBS) else # Windows. GMIC_LIBC_STATIC_CFLAGS += $(OPENMP_CFLAGS) $(GDI32_CFLAGS) GMIC_LIBC_STATIC_LIBS += $(OPENMP_LIBS) $(GDI32_LIBS) @@ -482,7 +494,7 @@ libcstatic: rm -f libgmic.o - $(MAKE) "CFLAGS+=$(GMIC_LIBC_STATIC_CFLAGS) $(OPT_CFLAGS)" "LIBS+=$(GMIC_LIBC_STATIC_LIBS)" _libcstatic + $(MAKE) "CFLAGS+=$(GMIC_LIBC_STATIC_CFLAGS) $(OPT_CFLAGS)" "LIBS+=$(GMIC_LIBC_STATIC_LIBS) $(OPT_LIBS)" _libcstatic _libcstatic: libcgmic_files libgmic.o libcgmicstatic.o ar rcs libcgmicstatic.a libcgmicstatic.o @@ -497,13 +509,13 @@ endif $(CC) -std=c99 -o use_libcgmic_static use_libcgmic.c -L. -lcgmicstatic -libcgmicstatic.o: check_versions gmic.cpp gmic.h gmic_stdlib.h CImg.h +libcgmicstatic.o: gmic.cpp gmic.h gmic_stdlib.h CImg.h $(CXX) -o libcgmicstatic.o -c gmic_libc.cpp $(PIC) $(CFLAGS) # All interfaces, sharing the same dynamic library #-------------------------------------------------- allshared: - $(MAKE) "CFLAGS+=$(GMIC_CLI_CFLAGS) $(OPT_CFLAGS)" "LIBS+=$(GMIC_CLI_LIBS)" _allshared + $(MAKE) "CFLAGS+=$(GMIC_CLI_CFLAGS) $(OPT_CFLAGS)" "LIBS+=$(GMIC_CLI_LIBS) $(OPT_LIBS)" _allshared _allshared: libgmic_shared.o ar rcs libgmic_shared.a libgmic_shared.o @@ -513,30 +525,30 @@ $(CXX) -o gmic gmic_cli.cpp $(CFLAGS) -lgmic_shared $(LIBS) $(STRIP) gmic$(EXE) -libgmic_shared.o: check_versions CImg.h gmic_stdlib.h +libgmic_shared.o: CImg.h gmic_stdlib.h $(CXX) -o libgmic_shared.o -c gmic.cpp $(PIC) $(CFLAGS) # G'MIC Online #------------- GMICOL_LIB_PATH = /usr/lib/x86_64-linux-gnu/ -GMICOL_CFLAGS = $(MANDATORY_CFLAGS) $(PARALLEL_CFLAGS) $(FFTW_CFLAGS) $(PNG_CFLAGS) $(JPEG_CFLAGS) $(ZLIB_CFLAGS) -Dcimg_display=0 # $(OPENMP_CFLAGS) -GMICOL_LIBS = $(MANDATORY_LIBS) $(PARALLEL_LIBS) $(PNG_LIBS) $(JPEG_LIBS) $(ZLIB_LIBS) $(GMICOL_LIB_PATH)/libfftw3.a $(GMICOL_LIB_PATH)/libfftw3_threads.a # $(OPENMP_LIBS) +GMICOL_CFLAGS = $(MANDATORY_CFLAGS) $(PARALLEL_CFLAGS) $(EIGEN_CFLAGS) $(FFTW_CFLAGS) $(PNG_CFLAGS) $(JPEG_CFLAGS) $(ZLIB_CFLAGS) -Dcimg_display=0 # $(OPENMP_CFLAGS) +GMICOL_LIBS = $(MANDATORY_LIBS) $(PARALLEL_LIBS) $(EIGEN_LIBS) $(PNG_LIBS) $(JPEG_LIBS) $(ZLIB_LIBS) $(GMICOL_LIB_PATH)/libfftw3.a $(GMICOL_LIB_PATH)/libfftw3_threads.a # $(OPENMP_LIBS) gmicol: - $(MAKE) "CFLAGS+=$(GMICOL_CFLAGS) $(OPT_CFLAGS)" "LIBS+=$(GMICOL_LIBS)" _cli + $(MAKE) "CFLAGS+=$(GMICOL_CFLAGS) $(OPT_CFLAGS)" "LIBS+=$(GMICOL_LIBS) $(OPT_LIBS)" _cli $(STRIP) gmic$(EXE) # G'MIC-Qt #--------- -gimp: check_versions gmic_qt_files CImg.h gmic_stdlib.h +gimp: gmic_qt_files CImg.h gmic_stdlib.h cd ../gmic-qt && $(QMAKE) CONFIG+=release GMIC_PATH=$(SRC_PATH) PRERELEASE=$(PRERELEASE) HOST=gimp gmic_qt.pro && $(MAKE) @echo "Executable 'gmic_gimp_qt' has been successfully compiled in '../gmic-qt/'." -krita: check_versions gmic_qt_files CImg.h gmic_stdlib.h +krita: gmic_qt_files CImg.h gmic_stdlib.h cd ../gmic-qt && $(QMAKE) CONFIG+=release GMIC_PATH=$(SRC_PATH) PRERELEASE=$(PRERELEASE) HOST=krita gmic_qt.pro && $(MAKE) @echo "Executable 'gmic_krita_qt' has been successfully compiled in '../gmic-qt/'." -gmic_qt: check_versions gmic_qt_files CImg.h gmic_stdlib.h +gmic_qt: gmic_qt_files CImg.h gmic_stdlib.h cd ../gmic-qt && $(QMAKE) CONFIG+=release GMIC_PATH=$(SRC_PATH) PRERELEASE=$(PRERELEASE) HOST=none gmic_qt.pro && $(MAKE) @echo "Executable 'gmic_qt' has been successfully compiled in '../gmic-qt/'." @@ -564,7 +576,7 @@ # ZArt #----- -zart: check_versions zart_files CImg.h gmic_stdlib.h +zart: zart_files CImg.h gmic_stdlib.h ifeq ($(OS),Darwin) cd ../zart && $(QMAKE) CONFIG+=release GMIC_PATH=$(SRC_PATH) zart.pro && $(MAKE) && $(STRIP) zart.app/Contents/MacOS/zart else @@ -608,18 +620,11 @@ @if [ -f ../../CImg/CImg.h ]; then \ if [ ! -f ./CImg.h ]; then ln -s ../../CImg/CImg.h .; fi; \ elif [ ! -e ./CImg.h ]; then \ - $(WGET) CImg.h https://framagit.org/dtschump/CImg/raw/master/CImg.h; \ + $(WGET) CImg.h https://github.com/dtschump/CImg/raw/master/CImg.h; \ touch CImg.h; \ fi @echo " done!" -check_versions: - @if [ $(MISMATCH_VERSIONS) = 1 ]; then \ - echo >&2 "make: *** Version numbers of files 'gmic.h' (v.$(VERSION)) and 'CImg.h' (v.$(CIMG_VERSION)) do not match."; \ - echo >&2 "make: *** Try make 'clean' to ensure you get the latest version of the CImg library."; \ - false; \ - fi - do_gmic_stdlib.h: @echo "/*\n\ #\n\ @@ -632,7 +637,7 @@ # 'do_gmic_stdlib.h:', from the G'MIC source file 'gmic_stdlib.gmic'.\n\ # ( https://gmic.eu )\n\ #\n\ - # Copyright : David Tschumperle\n\ + # Copyright : David Tschumperlé\n\ # ( https://tschumperle.users.greyc.fr/ )\n\ #\n\ # Licenses : This file is 'dual-licensed', you have to choose one\n\ @@ -640,17 +645,17 @@ #\n\ # CeCILL-C\n\ # The CeCILL-C license is close to the GNU LGPL.\n\ - # ( http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html )\n\ + # ( http://cecill.info/licences/Licence_CeCILL-C_V1-en.html )\n\ #\n\ # or CeCILL v2.1\n\ # The CeCILL license is compatible with the GNU GPL.\n\ - # ( http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html )\n\ + # ( http://cecill.info/licences/Licence_CeCILL_V2.1-en.html )\n\ #\n\ # This software is governed either by the CeCILL or the CeCILL-C license\n\ # under French law and abiding by the rules of distribution of free software.\n\ # You can use, modify and or redistribute the software under the terms of\n\ # the CeCILL or CeCILL-C licenses as circulated by CEA, CNRS and INRIA\n\ - # at the following URL: \"http://www.cecill.info\".\n\ + # at the following URL: \"http://cecill.info\".\n\ #\n\ # As a counterpart to the access to the source code and rights to copy,\n\ # modify and redistribute granted by the license, users are provided only\n\ @@ -673,73 +678,87 @@ # knowledge of the CeCILL and CeCILL-C licenses and that you accept its terms.\n\ #\n\ */\n" > gmic_stdlib.h - @\gmic gmic_stdlib.gmic raw:gmic_stdlib.gmic,char compress_gmic 1 a y serialize char,1,0 o -.h,uchar | sed 's/unsigned char/const unsigned char/' | sed 's/unnamed/gmic_stdlib/' >> gmic_stdlib.h + @\gmic gmic_stdlib.gmic it gmic_stdlib.gmic parse_gui *,update "(0)" a y serialize uchar,1,0 o -.h | sed 's/unsigned char/const unsigned char/' | sed 's/unnamed/gmic_stdlib/' >> gmic_stdlib.h @echo "\nconst unsigned long size_data_gmic_stdlib = (unsigned long)sizeof(data_gmic_stdlib);" >> gmic_stdlib.h - @\gmic v - _update_server_upload gmic_stdlib.h + @\gmic v - _upload gmic_stdlib.h @cp -f gmic_stdlib.h /tmp/gmic_stdlib$(VERSION).h - @\gmic v - _update_server_upload /tmp/gmic_stdlib$(VERSION).h - @\gmic v - _update_server_upload gmic_stdlib.h + @\gmic v - _upload /tmp/gmic_stdlib$(VERSION).h + @\gmic v - _upload gmic_stdlib.h # Bash completion script #----------------------- bashcompletion: @mkdir -p ../resources - @\gmic v - gmic_stdlib.gmic raw:gmic_stdlib.gmic,uchar nm gmic document_gmic bash 2> ../resources/gmic_bashcompletion.sh + @\gmic v - gmic_stdlib.gmic it gmic_stdlib.gmic nm gmic document_gmic bash > ../resources/gmic_bashcompletion.sh @echo "Bash completion script 'gmic_bashcompletion.sh' has been successfully generated in '../resources/'." # Man pages #---------- man: @mkdir -p ../man - @\gmic v - gmic_stdlib.gmic raw:gmic_stdlib.gmic,uchar __help man 2> ../man/gmic.1 + @\gmic gmic_stdlib.gmic it gmic_stdlib.gmic __help man > ../man/gmic.1 @gzip -f ../man/gmic.1 @echo "Man file 'gmic.1.gz' has been successfully generated in '../man/'." # Install / uninstall / clean. #----------------------------- install: - mkdir -p $(DESTDIR)$(PLUGINDIR)/ - cp -f ../resources/gmic_film_cluts.gmz $(DESTDIR)$(PLUGINDIR)/ - mkdir -p $(DESTDIR)$(USR)/$(BIN)/ - cp -f gmic $(DESTDIR)$(USR)/$(BIN)/ - mkdir -p $(DESTDIR)$(USR)/$(INCLUDE)/ - cp -f gmic.h $(DESTDIR)$(USR)/$(INCLUDE)/ - @if [ -f gmic_libc.h ]; then cp -f gmic_libc.h $(DESTDIR)$(USR)/$(INCLUDE)/; fi - @if [ -f ../zart/zart ]; then cp -f ../zart/zart $(DESTDIR)$(USR)/$(BIN)/; fi - @if [ -f ../gmic-qt/gmic_qt ]; then cp -f ../gmic-qt/gmic_qt $(DESTDIR)$(USR)/$(BIN)/; fi - @if [ -f ../gmic-qt/gmic_gimp_qt ]; then cp -f ../gmic-qt/gmic_gimp_qt $(DESTDIR)$(PLUGINDIR)/; fi - @if [ -f ../gmic-qt/gmic_krita_qt ]; then cp -f ../gmic-qt/gmic_krita_qt $(DESTDIR)$(USR)/$(BIN)/; fi - -ifneq ($(OS),Darwin) + mkdir -p $(DESTDIR)$(USR)/$(INCLUDE) + mkdir -p $(DESTDIR)$(USR)/$(BIN) + mkdir -p $(DESTDIR)$(PLUGINDIR) mkdir -p $(DESTDIR)$(USR)/share mkdir -p $(DESTDIR)$(USR)/$(LIB) - cp -f libgmic.so $(DESTDIR)$(USR)/$(LIB)/libgmic.so.$(VERSION) - ln -fs libgmic.so.$(VERSION) $(DESTDIR)$(USR)/$(LIB)/libgmic.so.$(VERSION1) - ln -fs libgmic.so.$(VERSION1) $(DESTDIR)$(USR)/$(LIB)/libgmic.so + @if [ -f gmic ]; then cp -f gmic $(DESTDIR)$(USR)/$(BIN); fi + @if [ -f gmic_libc.h ]; then cp -f gmic_libc.h $(DESTDIR)$(USR)/$(INCLUDE)/; fi + @if [ -f ../resources/gmic_cluts.gmz ]; then cp -f ../resources/gmic_cluts.gmz $(DESTDIR)$(PLUGINDIR); fi + @if [ -f ../zart/zart ]; then cp -f ../zart/zart $(DESTDIR)$(USR)/$(BIN); fi + @if [ -f ../gmic-qt/gmic_qt ]; then cp -f ../gmic-qt/gmic_qt $(DESTDIR)$(USR)/$(BIN); fi + @if [ -f ../gmic-qt/gmic_gimp_qt ]; then cp -f ../gmic-qt/gmic_gimp_qt $(DESTDIR)$(PLUGINDIR); fi + @if [ -f ../gmic-qt/gmic_krita_qt ]; then cp -f ../gmic-qt/gmic_krita_qt $(DESTDIR)$(USR)/$(BIN); fi + @if [ -f libgmic.so ]; then \ + cp -f gmic.h $(DESTDIR)$(USR)/$(INCLUDE); \ + cp -f libgmic.so $(DESTDIR)$(USR)/$(LIB)/libgmic.so.$(VERSION); \ + ln -fs libgmic.so.$(VERSION) $(DESTDIR)$(USR)/$(LIB)/libgmic.so.$(VERSION1); \ + ln -fs libgmic.so.$(VERSION1) $(DESTDIR)$(USR)/$(LIB)/libgmic.so; \ + fi @if [ -f libcgmic.so ]; then \ - cp -f gmic_libc.h $(DESTDIR)$(USR)/$(INCLUDE)/; \ + cp -f gmic_libc.h $(DESTDIR)$(USR)/$(INCLUDE); \ cp -f libcgmic.so $(DESTDIR)$(USR)/$(LIB)/libcgmic.so.$(VERSION); \ - ln -fs libcgmic.so.$(VERSION) $(DESTDIR)$(USR)/$(LIB)/libcgmic.so.$(VERSION1) ; \ + ln -fs libcgmic.so.$(VERSION) $(DESTDIR)$(USR)/$(LIB)/libcgmic.so.$(VERSION1); \ ln -fs libcgmic.so.$(VERSION1) $(DESTDIR)$(USR)/$(LIB)/libcgmic.so; \ fi -endif - mkdir -p $(DESTDIR)$(USR)/share/man/ - mkdir -p $(DESTDIR)$(USR)/share/man/man1/ - mkdir -p $(DESTDIR)$(USR)/share/man/fr/man1/ @if [ -f ../man/gmic.1.gz ]; then \ + mkdir -p $(DESTDIR)$(USR)/share/man/man1; \ + mkdir -p $(DESTDIR)$(USR)/share/man/fr/man1; \ cp -f ../man/gmic.1.gz $(DESTDIR)$(USR)/share/man/man1/gmic.1.gz; \ cp -f ../man/gmic.1.gz $(DESTDIR)$(USR)/share/man/fr/man1/gmic.1.gz; \ fi @if [ -f ../resources/gmic_bashcompletion.sh ]; then \ if [ -d /usr/share/bash-completion/completions ]; then \ - mkdir -p $(DESTDIR)/usr/share/bash-completion/completions/; \ + mkdir -p $(DESTDIR)/usr/share/bash-completion/completions; \ cp -f ../resources/gmic_bashcompletion.sh $(DESTDIR)/usr/share/bash-completion/completions/gmic; \ fi; \ if [ -d /opt/local/etc/bash_completion.d/ ]; then \ - mkdir -p $(DESTDIR)/opt/local/etc/bash_completion.d/; \ + mkdir -p $(DESTDIR)/opt/local/etc/bash_completion.d; \ cp -f ../resources/gmic_bashcompletion.sh $(DESTDIR)/opt/local/etc/bash_completion.d/gmic; \ fi; \ fi + @if [ -f ../zart/zart ]; then \ + mkdir -p $(DESTDIR)$(USR)/share/applications; \ + mkdir -p $(DESTDIR)$(USR)/share/icons/hicolor/48x48/apps; \ + mkdir -p $(DESTDIR)$(USR)/share/icons/hicolor/scalable/apps; \ + cp -f ../zart/zart.desktop $(DESTDIR)$(USR)/share/applications; \ + cp -f ../zart/icons/48-zart.png $(DESTDIR)$(USR)/share/icons/hicolor/48x48/apps/zart.png; \ + cp -f ../zart/icons/zart.svg $(DESTDIR)$(USR)/share/icons/hicolor/scalable/apps; \ + fi + @if [ -f ../gmic-qt/gmic_qt ]; then \ + mkdir -p $(DESTDIR)$(USR)/share/applications; \ + mkdir -p $(DESTDIR)$(USR)/share/icons/hicolor/48x48/apps; \ + mkdir -p $(DESTDIR)$(USR)/share/icons/hicolor/scalable/apps; \ + cp -f ../gmic-qt/gmic_qt.desktop $(DESTDIR)$(USR)/share/applications; \ + cp -f ../gmic-qt/icons/application/48-gmic_qt.png $(DESTDIR)$(USR)/share/icons/hicolor/48x48/apps/gmic_qt.png; \ + cp -f ../gmic-qt/icons/application/gmic_qt.svg $(DESTDIR)$(USR)/share/icons/hicolor/scalable/apps; \ + fi uninstall: rm -f $(DESTDIR)$(PLUGINDIR)/gmic_gimp_qt @@ -757,6 +776,12 @@ rm -rf $(DESTDIR)$(USR)/share/doc/gmic/ rm -f $(DESTDIR)$(USR)/share/man/man1/gmic.1.gz rm -f $(DESTDIR)$(USR)/share/man/fr/man1/gmic.1.gz + rm -f $(DESTDIR)$(USR)/share/applications/zart.desktop + rm -f $(DESTDIR)$(USR)/share/icons/hicolor/48x48/apps/zart.png + rm -f $(DESTDIR)$(USR)/share/icons/hicolor/scalable/apps/zart.svg + rm -f $(DESTDIR)$(USR)/share/applications/gmic_qt.desktop + rm -f $(DESTDIR)$(USR)/share/icons/hicolor/48x48/apps/gmic_qt.png + rm -f $(DESTDIR)$(USR)/share/icons/hicolor/scalable/apps/gmic_qt.svg distclean: clean diff -Nru gmic-2.4.5/src/use_libcgmic.c gmic-2.9.2/src/use_libcgmic.c --- gmic-2.4.5/src/use_libcgmic.c 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/src/use_libcgmic.c 2020-09-03 11:37:06.000000000 +0000 @@ -10,13 +10,13 @@ # ( https://plus.google.com/u/0/b/117441237982283011318/+TobiasFleischer ) # # License : CeCILL-B v1.0 - # ( http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html ) + # ( http://cecill.info/licences/Licence_CeCILL-B_V1-en.html ) # # This software is governed either by the CeCILL-B license # under French law and abiding by the rules of distribution of free software. # You can use, modify and or redistribute the software under the terms of # the CeCILL-B licenses as circulated by CEA, CNRS and INRIA - # at the following URL: "http://www.cecill.info". + # at the following URL: "http://cecill.info". # # As a counterpart to the access to the source code and rights to copy, # modify and redistribute granted by the license, users are provided only @@ -123,7 +123,7 @@ // And here is the actual call to the G'MIC library! // In this example, it will get the input buffer we created, divide only the red channel by 2 // and then display the result. - gmic_call("v 0 apply_channels \"div 2\",rgba_r polaroid 5,30 rotate 20 drop_shadow , drgba display", + gmic_call("v + apply_channels \"div 2\",rgba_r polaroid 5,30 rotate 20 drop_shadow , drgba display", &nofImages, &images[0], &options); // We have to dispose output images we got back from the gmic_call that were diff -Nru gmic-2.4.5/src/use_libgmic.cpp gmic-2.9.2/src/use_libgmic.cpp --- gmic-2.4.5/src/use_libgmic.cpp 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/src/use_libgmic.cpp 2020-09-03 11:37:06.000000000 +0000 @@ -6,7 +6,7 @@ # Description : Show how to call the C++ version of the G'MIC library from a C++ source code. # (for a C API, see 'use_libcgmic.c' instead) # - # Copyright : David Tschumperle + # Copyright : David Tschumperlé # ( http://tschumperle.users.greyc.fr/ ) # # Licenses : This file is 'dual-licensed', you have to choose one @@ -14,17 +14,17 @@ # # CeCILL-C # The CeCILL-C license is close to the GNU LGPL. - # ( http://www.cecill.info/licences/Licence_CeCILL-C_V1-en.html ) + # ( http://cecill.info/licences/Licence_CeCILL-C_V1-en.html ) # # or CeCILL v2.1 # The CeCILL license is compatible with the GNU GPL. - # ( http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.html ) + # ( http://cecill.info/licences/Licence_CeCILL_V2.1-en.html ) # # This software is governed either by the CeCILL or the CeCILL-C license # under French law and abiding by the rules of distribution of free software. # You can use, modify and or redistribute the software under the terms of # the CeCILL or CeCILL-C licenses as circulated by CEA, CNRS and INRIA - # at the following URL: "http://www.cecill.info". + # at the following URL: "http://cecill.info". # # As a counterpart to the access to the source code and rights to copy, # modify and redistribute granted by the license, users are provided only @@ -65,6 +65,8 @@ int main() { + gmic::init_rc(); // Initialize resources folder + // First step : Create a list of input images. //-------------------------------------------- std::fprintf(stderr,"\n- 1st step : Create input list of images.\n"); @@ -81,7 +83,7 @@ img._height, img._depth, img._spectrum, - img._data); + (void*)img._data); // Fill each image buffer with sinus values (with different frequencies). float *ptr = img; @@ -99,7 +101,7 @@ // Here you can call any G'MIC command you want ! // (here, create a deformed average of the input images, and save it as a BMP file). - gmic("add normalize 0,255 flower 8 sharpen 100 output foo1.bmp",images,images_names); + gmic("v + add normalize 0,255 flower 8 sharpen 100 output foo1.bmp",images,images_names); } catch (gmic_exception &e) { // Catch exception, if an error occurred in the interpreter std::fprintf(stderr,"\n- Error encountered when calling G'MIC : '%s'\n",e.what()); @@ -108,7 +110,7 @@ // Third step (alternative) : Call G'MIC API to process input images. //--------------------------------------------------------------------- - std::fprintf(stderr,"\n- 3rd step (alternative) : Call G'MIC interpreter from empty instance.\n"); + std::fprintf(stderr,"\n- 3rd step (alternative) : Call G'MIC interpreter twice from empty instance.\n"); gmic gmic_instance; // Construct first an empty 'gmic' instance @@ -116,9 +118,9 @@ // Here, we use the already constructed 'gmic' instance. The same instance can be used // several times. - gmic_instance.run("blur 5 sharpen 1000 normalize 0,255 output foo2.bmp",images,images_names); + gmic_instance.run("v + blur 5 sharpen 1000 normalize 0,255 output foo2.bmp",images,images_names); std::fputc('\n',stderr); - gmic_instance.run("+resize 50%,50% to_rgba[-1] rotate[-1] 30 drop_shadow[-1] 0,13 " + gmic_instance.run("v + +resize 50%,50% to_rgba[-1] rotate[-1] 30 drop_shadow[-1] 0,13 " "blur_radial[0] 10% blend alpha output foo3.bmp",images,images_names); } catch (gmic_exception &e) { // Catch exception, if an error occurred in the interpreter @@ -135,7 +137,7 @@ images[i]._height, images[i]._depth, images[i]._spectrum, - images[i]._data); + (void*)images[i]._data); } // Fourth step : Free image resources. Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/zart/icons/16-zart.png and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/zart/icons/16-zart.png differ Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/zart/icons/32-zart.png and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/zart/icons/32-zart.png differ Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/zart/icons/48-zart.png and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/zart/icons/48-zart.png differ Binary files /tmp/tmpcrhZ44/tTYjuiNyNS/gmic-2.4.5/zart/icons/64-zart.png and /tmp/tmpcrhZ44/e4CVa04Qtp/gmic-2.9.2/zart/icons/64-zart.png differ diff -Nru gmic-2.4.5/zart/icons/zart.svg gmic-2.9.2/zart/icons/zart.svg --- gmic-2.4.5/zart/icons/zart.svg 1970-01-01 00:00:00.000000000 +0000 +++ gmic-2.9.2/zart/icons/zart.svg 2020-09-03 11:37:04.000000000 +0000 @@ -0,0 +1,1010 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru gmic-2.4.5/zart/include/AbstractParameter.h gmic-2.9.2/zart/include/AbstractParameter.h --- gmic-2.4.5/zart/include/AbstractParameter.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/AbstractParameter.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _ABSTRACTPARAMETER_H_ -#define _ABSTRACTPARAMETER_H_ +#ifndef ZART_ABSTRACTPARAMETER_H +#define ZART_ABSTRACTPARAMETER_H #include #include @@ -71,4 +71,4 @@ void valueChanged(); }; -#endif // _ABSTRACTPARAMETER_H_ +#endif // ZART_ABSTRACTPARAMETER_H diff -Nru gmic-2.4.5/zart/include/BoolParameter.h gmic-2.9.2/zart/include/BoolParameter.h --- gmic-2.4.5/zart/include/BoolParameter.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/BoolParameter.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _BOOLPARAMETER_H_ -#define _BOOLPARAMETER_H_ +#ifndef ZART_BOOLPARAMETER_H +#define ZART_BOOLPARAMETER_H #include #include @@ -76,4 +76,4 @@ QCheckBox * _checkBox; }; -#endif // _BOOLPARAMETER_H_ +#endif // ZART_BOOLPARAMETER_H diff -Nru gmic-2.4.5/zart/include/ChoiceParameter.h gmic-2.9.2/zart/include/ChoiceParameter.h --- gmic-2.4.5/zart/include/ChoiceParameter.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/ChoiceParameter.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _CHOICEPARAMETER_H_ -#define _CHOICEPARAMETER_H_ +#ifndef ZART_CHOICEPARAMETER_H +#define ZART_CHOICEPARAMETER_H #include #include @@ -76,4 +76,4 @@ QComboBox * _comboBox; }; -#endif // _CHOICEPARAMETER_H_ +#endif // ZART_CHOICEPARAMETER_H diff -Nru gmic-2.4.5/zart/include/ColorParameter.h gmic-2.9.2/zart/include/ColorParameter.h --- gmic-2.4.5/zart/include/ColorParameter.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/ColorParameter.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _COLORPARAMETER_H_ -#define _COLORPARAMETER_H_ +#ifndef ZART_COLORPARAMETER_H +#define ZART_COLORPARAMETER_H #include #include @@ -86,4 +86,4 @@ QColorDialog * _dialog; }; -#endif // _COLORPARAMETER_H_ +#endif // ZART_COLORPARAMETER_H diff -Nru gmic-2.4.5/zart/include/CommandEditor.h gmic-2.9.2/zart/include/CommandEditor.h --- gmic-2.4.5/zart/include/CommandEditor.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/CommandEditor.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _COMMANDEDITOR_H_ -#define _COMMANDEDITOR_H_ +#ifndef ZART_COMMANDEDITOR_H +#define ZART_COMMANDEDITOR_H #include @@ -65,4 +65,4 @@ private: }; -#endif // _COMMANDEDITOR_H_ +#endif // ZART_COMMANDEDITOR_H diff -Nru gmic-2.4.5/zart/include/CommandParamsWidget.h gmic-2.9.2/zart/include/CommandParamsWidget.h --- gmic-2.4.5/zart/include/CommandParamsWidget.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/CommandParamsWidget.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _COMMANDPARAMSWIDGET_H_ -#define _COMMANDPARAMSWIDGET_H_ +#ifndef ZART_COMMANDPARAMSWIDGET_H +#define ZART_COMMANDPARAMSWIDGET_H #include #include @@ -85,4 +85,4 @@ bool _hasKeypoints; }; -#endif // _COMMANDPARAMSWIDGET_H_ +#endif // ZART_COMMANDPARAMSWIDGET_H diff -Nru gmic-2.4.5/zart/include/Common.h gmic-2.9.2/zart/include/Common.h --- gmic-2.4.5/zart/include/Common.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/Common.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -44,15 +44,17 @@ * knowledge of the CeCILL license and that you accept its terms. * */ -#ifndef _COMMON_H_ -#define _COMMON_H_ +#ifndef ZART_COMMON_H +#define ZART_COMMON_H #include #include #ifdef _ZART_DEBUG_ #define ENTERING qWarning() << "[" << __PRETTY_FUNCTION__ << "] <>" +#define LEAVING qWarning() << "[" << __PRETTY_FUNCTION__ << "] <>" #define TSHOW(V) qWarning() << "[" << __PRETTY_FUNCTION__ << "]" << #V << "=" << (V) +#define TRACE qWarning() << "[" << __PRETTY_FUNCTION__ << "]" #define SHOW(V) qWarning() << #V << "=" << (V) #else #define ENTERING while (false) @@ -62,6 +64,9 @@ #define SHOW(V) \ while (false) \ qWarning() << "" +#define TRACE \ + while (false) \ + qWarning() << "" #endif #define ZART_VERSION 3.2.2 @@ -70,4 +75,7 @@ #define ZART_XSTRINGIFY(X) ZART_STRINGIFY(X) #define ZART_VERSION_STRING ZART_XSTRINGIFY(ZART_VERSION) -#endif +#define QT_VERSION_GTE(MAJOR, MINOR) (((QT_VERSION_MAJOR == MAJOR) && (QT_VERSION_MINOR >= MINOR)) || (QT_VERSION_MAJOR > MAJOR)) + + +#endif // ZART_COMMON_H diff -Nru gmic-2.4.5/zart/include/ConstParameter.h gmic-2.9.2/zart/include/ConstParameter.h --- gmic-2.4.5/zart/include/ConstParameter.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/ConstParameter.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _CONSTPARAMETER_H_ -#define _CONSTPARAMETER_H_ +#ifndef ZART_CONSTPARAMETER_H +#define ZART_CONSTPARAMETER_H #include "AbstractParameter.h" class QLabel; @@ -67,4 +67,4 @@ QString _value; }; -#endif // _CONSTPARAMETER_H_ +#endif // ZART_CONSTPARAMETER_H diff -Nru gmic-2.4.5/zart/include/CriticalRef.h gmic-2.9.2/zart/include/CriticalRef.h --- gmic-2.4.5/zart/include/CriticalRef.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/CriticalRef.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _CRITICALREF_H_ -#define _CRITICALREF_H_ +#ifndef ZART_CRITICALREF_H +#define ZART_CRITICALREF_H #include @@ -89,4 +89,4 @@ _mutex.unlock(); } -#endif // _CRITICALREF_H_ +#endif // ZART_CRITICALREF_H diff -Nru gmic-2.4.5/zart/include/DialogAbout.h gmic-2.9.2/zart/include/DialogAbout.h --- gmic-2.4.5/zart/include/DialogAbout.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/DialogAbout.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _DIALOGABOUT_H_ -#define _DIALOGABOUT_H_ +#ifndef ZART_DIALOGABOUT_H +#define ZART_DIALOGABOUT_H #include #include "ui_DialogAbout.h" @@ -61,4 +61,4 @@ private: }; -#endif // _DIALOGABOUT_H_ +#endif // ZART_DIALOGABOUT_H diff -Nru gmic-2.4.5/zart/include/DialogLicense.h gmic-2.9.2/zart/include/DialogLicense.h --- gmic-2.4.5/zart/include/DialogLicense.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/DialogLicense.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _DIALOGLICENCE_H_ -#define _DIALOGLICENCE_H_ +#ifndef ZART_DIALOGLICENCE_H +#define ZART_DIALOGLICENCE_H #include #include "ui_DialogLicense.h" @@ -61,4 +61,4 @@ private: }; -#endif // DIALOGLICENCE_H +#endif // ZART_DIALOGLICENCE_H diff -Nru gmic-2.4.5/zart/include/FileParameter.h gmic-2.9.2/zart/include/FileParameter.h --- gmic-2.4.5/zart/include/FileParameter.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/FileParameter.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _FILEPARAMETER_H_ -#define _FILEPARAMETER_H_ +#ifndef ZART_FILEPARAMETER_H +#define ZART_FILEPARAMETER_H #include #include @@ -77,4 +77,4 @@ QPushButton * _button; }; -#endif // _FILEPARAMETER_H_ +#endif // ZART_FILEPARAMETER_H diff -Nru gmic-2.4.5/zart/include/FilterThread.h gmic-2.9.2/zart/include/FilterThread.h --- gmic-2.4.5/zart/include/FilterThread.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/FilterThread.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -44,12 +44,15 @@ * knowledge of the CeCILL license and that you accept its terms. * */ -#ifndef _FILTERTHREAD_H_ -#define _FILTERTHREAD_H_ +#ifndef ZART_FILTERTHREAD_H +#define ZART_FILTERTHREAD_H #include #include "Common.h" #include "CriticalRef.h" +#ifndef gmic_build +#include "CImg.h" +#endif #include "gmic.h" class ImageSource; class QMutex; @@ -119,6 +122,7 @@ cimg_library::CImgList _gmic_images; cimg_library::CImgList _gmic_images_names; gmic * _gmic; + bool _noFilter; }; -#endif // _FILTERTHREAD_H_ +#endif // ZART_FILTERTHREAD_H diff -Nru gmic-2.4.5/zart/include/FloatParameter.h gmic-2.9.2/zart/include/FloatParameter.h --- gmic-2.4.5/zart/include/FloatParameter.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/FloatParameter.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _FLOATPARAMETER_H_ -#define _FLOATPARAMETER_H_ +#ifndef ZART_FLOATPARAMETER_H +#define ZART_FLOATPARAMETER_H #include #include @@ -81,4 +81,4 @@ QDoubleSpinBox * _spinBox; }; -#endif // _FLOATPARAMETERPARAMETER_H_ +#endif // ZART_FLOATPARAMETER_H diff -Nru gmic-2.4.5/zart/include/FolderParameter.h gmic-2.9.2/zart/include/FolderParameter.h --- gmic-2.4.5/zart/include/FolderParameter.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/FolderParameter.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _FOLDERPARAMETER_H_ -#define _FOLDERPARAMETER_H_ +#ifndef ZART_FOLDERPARAMETER_H +#define ZART_FOLDERPARAMETER_H #include #include @@ -77,4 +77,4 @@ QPushButton * _button; }; -#endif // _FOLDERPARAMETER_H_ +#endif // ZART_FOLDERPARAMETER_H diff -Nru gmic-2.4.5/zart/include/FullScreenWidget.h gmic-2.9.2/zart/include/FullScreenWidget.h --- gmic-2.4.5/zart/include/FullScreenWidget.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/FullScreenWidget.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _FULLSCREENWIDGET_H_ -#define _FULLSCREENWIDGET_H_ +#ifndef ZART_FULLSCREENWIDGET_H +#define ZART_FULLSCREENWIDGET_H #include "ui_FullScreenWidget.h" @@ -79,4 +79,4 @@ MainWindow * _mainWindow; }; -#endif +#endif // ZART_FULLSCREENWIDGET_H diff -Nru gmic-2.4.5/zart/include/ImageConverter.h gmic-2.9.2/zart/include/ImageConverter.h --- gmic-2.4.5/zart/include/ImageConverter.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/ImageConverter.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,17 +43,14 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _IMAGECONVERTER_H_ -#define _IMAGECONVERTER_H_ - -#if defined(HAS_OPENCV2_HEADERS) || defined(OPENCV2_HEADERS) -#include -#include -#else -#include -#endif +#ifndef ZART_IMAGECONVERTER_H +#define ZART_IMAGECONVERTER_H #include +#include +#ifndef gmic_build +#include "CImg.h" +#endif #include "gmic.h" class QImage; @@ -70,20 +67,20 @@ DuplicateHorizontal }; - static void convert(const IplImage * in, QImage * out); - static void convert(const QImage & in, IplImage ** out); - static void convert(const IplImage * in, cimg_library::CImg & out); + static void convert(const cv::Mat * in, QImage * out); + static void convert(const QImage & in, cv::Mat ** out); + static void convert(const cv::Mat * in, cimg_library::CImg & out); static void convert(const cimg_library::CImg & in, QImage * out); - static void merge(IplImage * iplImage, const cimg_library::CImg & cimgImage, QImage * out, QMutex * imageMutex, MergeDirection direction); - static void mergeTop(IplImage * iplImage, const cimg_library::CImg & cimgImage, QImage * out); - static void mergeLeft(IplImage * iplImage, const cimg_library::CImg & cimgImage, QImage * out); - static void mergeBottom(IplImage * iplImage, const cimg_library::CImg & cimgImage, QImage * out, bool shift = false); - static void mergeRight(IplImage * iplImage, const cimg_library::CImg & cimgImage, QImage * out, bool shift = true); - static void duplicateVertical(IplImage * iplImage, const cimg_library::CImg & cimgImage, QImage * out); - static void duplicateHorizontal(IplImage * iplImage, const cimg_library::CImg & cimgImage, QImage * out); + static void merge(cv::Mat * cvImage, const cimg_library::CImg & cimgImage, QImage * out, QMutex * imageMutex, MergeDirection direction); + static void mergeTop(cv::Mat * cvImage, const cimg_library::CImg & cimgImage, QImage * out); + static void mergeLeft(cv::Mat * cvImage, const cimg_library::CImg & cimgImage, QImage * out); + static void mergeBottom(cv::Mat * cvImage, const cimg_library::CImg & cimgImage, QImage * out, bool shift = false); + static void mergeRight(cv::Mat * cvImage, const cimg_library::CImg & cimgImage, QImage * out, bool shift = true); + static void duplicateVertical(cv::Mat * cvImage, const cimg_library::CImg & cimgImage, QImage * out); + static void duplicateHorizontal(cv::Mat * cvImage, const cimg_library::CImg & cimgImage, QImage * out); private: - static IplImage * _image; + static cv::Mat * _image; }; -#endif // _IMAGECONVERTER_H_ +#endif // ZART_IMAGECONVERTER_H diff -Nru gmic-2.4.5/zart/include/ImageSource.h gmic-2.9.2/zart/include/ImageSource.h --- gmic-2.4.5/zart/include/ImageSource.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/ImageSource.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -44,16 +44,13 @@ * knowledge of the CeCILL license and that you accept its terms. * */ -#ifndef _IMAGESOURCE_H_ -#define _IMAGESOURCE_H_ +#ifndef ZART_IMAGESOURCE_H +#define ZART_IMAGESOURCE_H -#if defined(HAS_OPENCV2_HEADERS) || defined(OPENCV2_HEADERS) -#include -#include -#else -#include -#include -#endif +namespace cv +{ +class Mat; +} #include @@ -61,7 +58,7 @@ public: ImageSource(); virtual ~ImageSource(); - IplImage * image() const; + cv::Mat * image() const; int width() const; int height() const; QSize size() const; @@ -70,12 +67,12 @@ protected: void setWidth(int); void setHeight(int); - void setImage(IplImage * image); + void setImage(cv::Mat * image); private: - IplImage * _image; + cv::Mat * _image; int _width; int _height; }; -#endif +#endif // ZART_IMAGESOURCE_H diff -Nru gmic-2.4.5/zart/include/ImageView.h gmic-2.9.2/zart/include/ImageView.h --- gmic-2.4.5/zart/include/ImageView.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/ImageView.h 2020-09-03 11:37:04.000000000 +0000 @@ -1,5 +1,5 @@ /** -*- mode: c++ ; c-basic-offset: 2 -*- - * @file View2DWidget.h + * @file ImageView.h * @author Sebastien Fourey * @date July 2010 * @brief Declaration of the class ImageFilter @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _IMAGEVIEW_H_ -#define _IMAGEVIEW_H_ +#ifndef ZART_IMAGEVIEW_H +#define ZART_IMAGEVIEW_H #include #include @@ -120,4 +120,4 @@ return _imageMutex; } -#endif +#endif // ZART_IMAGEVIEW_H diff -Nru gmic-2.4.5/zart/include/IntParameter.h gmic-2.9.2/zart/include/IntParameter.h --- gmic-2.4.5/zart/include/IntParameter.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/IntParameter.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _INTPARAMETER_H_ -#define _INTPARAMETER_H_ +#ifndef ZART_INTPARAMETER_H +#define ZART_INTPARAMETER_H #include #include @@ -81,4 +81,4 @@ QSpinBox * _spinBox; }; -#endif // _INTPARAMETER_H_ +#endif // ZART_INTPARAMETER_H diff -Nru gmic-2.4.5/zart/include/KeypointList.h gmic-2.9.2/zart/include/KeypointList.h --- gmic-2.4.5/zart/include/KeypointList.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/KeypointList.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _ZART_KEYPOINTLIST_H_ -#define _ZART_KEYPOINTLIST_H_ +#ifndef ZART_KEYPOINTLIST_H +#define ZART_KEYPOINTLIST_H #include #include @@ -130,4 +130,4 @@ } } -#endif // _ZART_KEYPOINTLIST_H_ +#endif // ZART_KEYPOINTLIST_H diff -Nru gmic-2.4.5/zart/include/LinkParameter.h gmic-2.9.2/zart/include/LinkParameter.h --- gmic-2.4.5/zart/include/LinkParameter.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/LinkParameter.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _LINKPARAMETER_H_ -#define _LINKPARAMETER_H_ +#ifndef ZART_LINKPARAMETER_H +#define ZART_LINKPARAMETER_H #include #include "AbstractParameter.h" @@ -72,4 +72,4 @@ Qt::AlignmentFlag _alignment; }; -#endif // _LINKPARAMETER_H_ +#endif // ZART_LINKPARAMETER_H diff -Nru gmic-2.4.5/zart/include/MainWindow.h gmic-2.9.2/zart/include/MainWindow.h --- gmic-2.4.5/zart/include/MainWindow.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/MainWindow.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _MAINWINDOW_H_ -#define _MAINWINDOW_H_ +#ifndef ZART_MAINWINDOW_H +#define ZART_MAINWINDOW_H #include #include @@ -191,4 +191,4 @@ void updateKeypointsInViews(); }; -#endif +#endif // ZART_MAINWINDOW_H diff -Nru gmic-2.4.5/zart/include/NoteParameter.h gmic-2.9.2/zart/include/NoteParameter.h --- gmic-2.4.5/zart/include/NoteParameter.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/NoteParameter.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _NOTEPARAMETER_H_ -#define _NOTEPARAMETER_H_ +#ifndef ZART_NOTEPARAMETER_H +#define ZART_NOTEPARAMETER_H #include "AbstractParameter.h" class QLabel; @@ -67,4 +67,4 @@ QString _text; }; -#endif // _NOTEPARAMETER_H_ +#endif // ZART_NOTEPARAMETER_H diff -Nru gmic-2.4.5/zart/include/OutputWindow.h gmic-2.9.2/zart/include/OutputWindow.h --- gmic-2.4.5/zart/include/OutputWindow.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/OutputWindow.h 2020-09-03 11:37:04.000000000 +0000 @@ -1,8 +1,8 @@ /** -*- mode: c++ ; c-basic-offset: 2 -*- - * @file FullScreenWidget.h + * @file OutputWindow.h * @author Sebastien Fourey * @date Nov 2015 - * @brief Declaration of the class FullScreenWidget + * @brief Declaration of the class OutputWindow * * This file is part of the ZArt software's source code. * @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _OUTPUTWINDOW_H_ -#define _OUTPUTWINDOW_H_ +#ifndef ZART_OUTPUTWINDOW_H +#define ZART_OUTPUTWINDOW_H #include "ui_OutputWindow.h" @@ -81,4 +81,4 @@ QAction * _fullScreenAction; }; -#endif +#endif // ZART_OUTPUTWINDOW_H diff -Nru gmic-2.4.5/zart/include/OverrideCursor.h gmic-2.9.2/zart/include/OverrideCursor.h --- gmic-2.4.5/zart/include/OverrideCursor.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/OverrideCursor.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -44,8 +44,8 @@ * knowledge of the CeCILL license and that you accept its terms. * */ -#ifndef _ZART_OVERRIDECURSOR_H_ -#define _ZART_OVERRIDECURSOR_H_ +#ifndef ZART_OVERRIDECURSOR_H +#define ZART_OVERRIDECURSOR_H class OverrideCursor { public: @@ -62,4 +62,4 @@ static bool _pointingHand; }; -#endif // _ZART_OVERRIDECURSOR_H_ +#endif // ZART_OVERRIDECURSOR_H diff -Nru gmic-2.4.5/zart/include/PointParameter.h gmic-2.9.2/zart/include/PointParameter.h --- gmic-2.4.5/zart/include/PointParameter.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/PointParameter.h 2020-09-03 11:37:04.000000000 +0000 @@ -13,7 +13,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -44,8 +44,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _ZART_POINTPARAMETER_H_ -#define _ZART_POINTPARAMETER_H_ +#ifndef ZART_POINTPARAMETER_H +#define ZART_POINTPARAMETER_H #include #include @@ -118,4 +118,4 @@ static unsigned long _randomSeed; }; -#endif // _ZART_POINTPARAMETER_H_ +#endif // ZART_POINTPARAMETER_H diff -Nru gmic-2.4.5/zart/include/SeparatorParameter.h gmic-2.9.2/zart/include/SeparatorParameter.h --- gmic-2.4.5/zart/include/SeparatorParameter.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/SeparatorParameter.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _SEPARATORPARAMETER_H_ -#define _SEPARATORPARAMETER_H_ +#ifndef ZART_SEPARATORPARAMETER_H +#define ZART_SEPARATORPARAMETER_H #include "AbstractParameter.h" class QFrame; @@ -66,4 +66,4 @@ QFrame * _frame; }; -#endif // _SEPARATORPARAMETER_H_ +#endif // ZART_SEPARATORPARAMETER_H diff -Nru gmic-2.4.5/zart/include/StillImageSource.h gmic-2.9.2/zart/include/StillImageSource.h --- gmic-2.4.5/zart/include/StillImageSource.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/StillImageSource.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -45,16 +45,9 @@ * */ -#ifndef _STILLIMAGESOURCE_H_ -#define _STILLIMAGESOURCE_H_ +#ifndef ZART_STILLIMAGESOURCE_H +#define ZART_STILLIMAGESOURCE_H -#if defined(HAS_OPENCV2_HEADERS) || defined(OPENCV2_HEADERS) -#include -#include -#else -#include -#include -#endif #include #include "ImageSource.h" @@ -73,4 +66,4 @@ QString _filePath; }; -#endif +#endif // ZART_STILLIMAGESOURCE_H diff -Nru gmic-2.4.5/zart/include/TextParameter.h gmic-2.9.2/zart/include/TextParameter.h --- gmic-2.4.5/zart/include/TextParameter.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/TextParameter.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -43,8 +43,8 @@ * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ -#ifndef _TEXTPARAMETER_H_ -#define _TEXTPARAMETER_H_ +#ifndef ZART_TEXTPARAMETER_H +#define ZART_TEXTPARAMETER_H #include #include @@ -76,4 +76,4 @@ QLineEdit * _lineEdit; }; -#endif // _TEXTPARAMETER_H_ +#endif // ZART_TEXTPARAMETER_H diff -Nru gmic-2.4.5/zart/include/TreeWidgetPresetItem.h gmic-2.9.2/zart/include/TreeWidgetPresetItem.h --- gmic-2.4.5/zart/include/TreeWidgetPresetItem.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/TreeWidgetPresetItem.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -45,8 +45,8 @@ * */ -#ifndef _TREEWIDGETPRESETITEM_H_ -#define _TREEWIDGETPRESETITEM_H_ +#ifndef ZART_TREEWIDGETPRESETITEM_H +#define ZART_TREEWIDGETPRESETITEM_H #include #include @@ -67,4 +67,4 @@ QDomNode _presetNode; }; -#endif +#endif // ZART_TREEWIDGETPRESETITEM_H diff -Nru gmic-2.4.5/zart/include/VideoFileSource.h gmic-2.9.2/zart/include/VideoFileSource.h --- gmic-2.4.5/zart/include/VideoFileSource.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/VideoFileSource.h 2020-09-03 11:37:04.000000000 +0000 @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -44,17 +44,11 @@ * knowledge of the CeCILL license and that you accept its terms. * */ -#ifndef _VIDEOFILESOURCE_H_ -#define _VIDEOFILESOURCE_H_ +#ifndef ZART_VIDEOFILESOURCE_H +#define ZART_VIDEOFILESOURCE_H -#if defined(HAS_OPENCV2_HEADERS) || defined(OPENCV2_HEADERS) -#include -#include -#else -#include -#include -#endif #include +#include #include "ImageSource.h" class VideoFileSource : public ImageSource { @@ -68,11 +62,11 @@ void setLoop(bool); private: - CvCapture * _capture; + cv::VideoCapture * _capture; QString _filename; QString _filePath; bool _videoIsReadable; bool _loop; }; -#endif +#endif // ZART_VIDEOFILESOURCE_H diff -Nru gmic-2.4.5/zart/include/WebcamSource.h gmic-2.9.2/zart/include/WebcamSource.h --- gmic-2.4.5/zart/include/WebcamSource.h 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/include/WebcamSource.h 2020-09-03 11:37:04.000000000 +0000 @@ -1,5 +1,5 @@ /** -*- mode: c++ ; c-basic-offset: 2 -*- - * @file WebcamGrabber.h + * @file WebcamSource.h * @author Sebastien Fourey * @date July 2010 * @brief Declaration of the class ImageFilter @@ -12,7 +12,7 @@ * * This software is a computer program whose purpose is to demonstrate * the possibilities of the GMIC image processing language by offering the - * choice of several manipulations on a video stream aquired from a webcam. In + * choice of several manipulations on a video stream acquired from a webcam. In * other words, ZArt is a GUI for G'MIC real-time manipulations on the output * of a webcam. * @@ -45,19 +45,14 @@ * */ -#ifndef _WEBCAMGRABBER_H_ -#define _WEBCAMGRABBER_H_ +#ifndef ZART_WEBCAMSOURCE_H +#define ZART_WEBCAMSOURCE_H -#if defined(HAS_OPENCV2_HEADERS) || defined(OPENCV2_HEADERS) -#include -#include -#else -#include -#include -#endif #include #include +#include #include +#include #include "ImageSource.h" class QSplashScreen; @@ -79,16 +74,22 @@ static const QList & getCachedWebcamList(); static int getFirstUnusedWebcam(); static bool isWebcamUnused(int index); + static bool canOpenDeviceFile(int index); static void retrieveWebcamResolutions(const QList & camList, QSplashScreen * splashScreen = 0, QStatusBar * statusBar = 0); + static void retrieveWebcamResolutionsV4L2(const QList & camList); + static void retrieveWebcamResolutionsOpenCV(const QList & camList, QSplashScreen * splashScreen = 0, QStatusBar * statusBar = 0); static const QList & webcamResolutions(int index); static void clearSavedSettings(); + static QString osName(); private: - CvCapture * _capture; + cv::VideoCapture * _capture; int _cameraIndex; QSize _captureSize; static QList _webcamList; static QVector> _webcamResolutions; + + static bool captureIsValid(const cv::VideoCapture & capture, int index); }; -#endif +#endif // ZART_WEBCAMSOURCE_H diff -Nru gmic-2.4.5/zart/Makefile gmic-2.9.2/zart/Makefile --- gmic-2.4.5/zart/Makefile 2019-01-11 11:25:53.000000000 +0000 +++ gmic-2.9.2/zart/Makefile 2020-09-03 11:37:06.000000000 +0000 @@ -1,22 +1,24 @@ ############################################################################# # Makefile for building: zart -# Generated by qmake (3.0) (Qt 5.5.1) +# Generated by qmake (3.1) (Qt 5.12.4) # Project: zart.pro # Template: app -# Command: /usr/lib/x86_64-linux-gnu/qt5/bin/qmake CONFIG+=release GMIC_PATH=../src -o Makefile zart.pro +# Command: /usr/lib/qt5/bin/qmake -o Makefile zart.pro CONFIG+=release GMIC_PATH=../src ############################################################################# MAKEFILE = Makefile +EQ = = + ####### Compiler, tools and options CC = gcc CXX = g++ -DEFINES = -Dcimg_use_fftw3 -Dcimg_use_zlib -Dcimg_use_openmp -Dgmic_build -Dgmic_is_parallel -Dcimg_use_abort -DQT_NO_DEBUG_OUTPUT -D_IS_UNIX_ -Dcimg_display=0 -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_XML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -CFLAGS = -m64 -pipe -O2 -Wall -W -D_REENTRANT -fPIC $(DEFINES) -CXXFLAGS = -m64 -pipe -fopenmp -O2 -Wall -W -std=c++0x -D_REENTRANT -fPIC $(DEFINES) -INCPATH = -I. -I. -Iinclude -I../src -isystem /usr/include/opencv -isystem /usr/include/x86_64-linux-gnu/qt5 -isystem /usr/include/x86_64-linux-gnu/qt5/QtWidgets -isystem /usr/include/x86_64-linux-gnu/qt5/QtGui -isystem /usr/include/x86_64-linux-gnu/qt5/QtXml -isystem /usr/include/x86_64-linux-gnu/qt5/QtNetwork -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore -I.moc -I.ui -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -QMAKE = /usr/lib/x86_64-linux-gnu/qt5/bin/qmake +DEFINES = -Dcimg_use_fftw3 -Dcimg_use_zlib -DQT_DEPRECATED_WARNINGS -Dcimg_use_openmp -Dgmic_build -DHAS_V4L2 -Dgmic_is_parallel -Dcimg_use_abort -DQT_NO_DEBUG_OUTPUT -D_IS_UNIX_ -Dcimg_display=0 -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_XML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB +CFLAGS = -pipe -O2 -Wall -W -D_REENTRANT -fPIC $(DEFINES) +CXXFLAGS = -pipe -fopenmp -O2 -std=gnu++11 -Wall -W -D_REENTRANT -fPIC $(DEFINES) +INCPATH = -I. -I. -Iinclude -I../src -isystem /usr/include/opencv -isystem /usr/include/x86_64-linux-gnu/qt5 -isystem /usr/include/x86_64-linux-gnu/qt5/QtWidgets -isystem /usr/include/x86_64-linux-gnu/qt5/QtGui -isystem /usr/include/x86_64-linux-gnu/qt5/QtXml -isystem /usr/include/x86_64-linux-gnu/qt5/QtNetwork -isystem /usr/include/x86_64-linux-gnu/qt5/QtCore -I.moc -isystem /usr/include/libdrm -I.ui -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ +QMAKE = /usr/lib/qt5/bin/qmake DEL_FILE = rm -f CHK_DIR_EXISTS= test -d MKDIR = mkdir -p @@ -26,6 +28,8 @@ INSTALL_FILE = install -m 644 -p INSTALL_PROGRAM = install -m 755 -p INSTALL_DIR = cp -f -R +QINSTALL = /usr/lib/qt5/bin/qmake -install qinstall +QINSTALL_PROGRAM = /usr/lib/qt5/bin/qmake -install qinstall -exe DEL_FILE = rm -f SYMLINK = ln -f -s DEL_DIR = rmdir @@ -33,10 +37,10 @@ TAR = tar -cf COMPRESS = gzip -9f DISTNAME = zart3.2.2 -DISTDIR = /tmp/gmic-2.4.5/zart/.obj/zart3.2.2 +DISTDIR = /tmp/gmic-2.9.2/zart/.obj/zart3.2.2 LINK = g++ -LFLAGS = -m64 -fopenmp -Wl,-O1 -LIBS = $(SUBLIBS) -L/usr/X11R6/lib64 -lfftw3_threads /usr/lib/x86_64-linux-gnu/libopencv_calib3d.so -lopencv_calib3d /usr/lib/x86_64-linux-gnu/libopencv_contrib.so -lopencv_contrib /usr/lib/x86_64-linux-gnu/libopencv_core.so -lopencv_core /usr/lib/x86_64-linux-gnu/libopencv_features2d.so -lopencv_features2d /usr/lib/x86_64-linux-gnu/libopencv_flann.so -lopencv_flann /usr/lib/x86_64-linux-gnu/libopencv_gpu.so -lopencv_gpu /usr/lib/x86_64-linux-gnu/libopencv_highgui.so -lopencv_highgui /usr/lib/x86_64-linux-gnu/libopencv_imgproc.so -lopencv_imgproc /usr/lib/x86_64-linux-gnu/libopencv_legacy.so -lopencv_legacy /usr/lib/x86_64-linux-gnu/libopencv_ml.so -lopencv_ml /usr/lib/x86_64-linux-gnu/libopencv_objdetect.so -lopencv_objdetect /usr/lib/x86_64-linux-gnu/libopencv_ocl.so -lopencv_ocl /usr/lib/x86_64-linux-gnu/libopencv_photo.so -lopencv_photo /usr/lib/x86_64-linux-gnu/libopencv_stitching.so -lopencv_stitching /usr/lib/x86_64-linux-gnu/libopencv_superres.so -lopencv_superres /usr/lib/x86_64-linux-gnu/libopencv_ts.so -lopencv_ts /usr/lib/x86_64-linux-gnu/libopencv_video.so -lopencv_video /usr/lib/x86_64-linux-gnu/libopencv_videostab.so -lopencv_videostab -lfftw3 -lz -lQt5Widgets -lQt5Gui -lQt5Xml -lQt5Network -lQt5Core -lGL -lpthread +LFLAGS = -fopenmp -Wl,-O1 +LIBS = $(SUBLIBS) -lfftw3_threads -lfftw3 -lz -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_datasets -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_line_descriptor -lopencv_optflow -lopencv_video -lopencv_plot -lopencv_reg -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_rgbd -lopencv_viz -lopencv_surface_matching -lopencv_text -lopencv_ximgproc -lopencv_calib3d -lopencv_features2d -lopencv_flann -lopencv_xobjdetect -lopencv_objdetect -lopencv_ml -lopencv_xphoto -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_photo -lopencv_imgproc -lopencv_core /usr/lib/x86_64-linux-gnu/libQt5Widgets.so /usr/lib/x86_64-linux-gnu/libQt5Gui.so /usr/lib/x86_64-linux-gnu/libQt5Xml.so /usr/lib/x86_64-linux-gnu/libQt5Network.so /usr/lib/x86_64-linux-gnu/libQt5Core.so /usr/lib/x86_64-linux-gnu/libGL.so -lpthread AR = ar cqs RANLIB = SED = sed @@ -177,6 +181,7 @@ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_KItemViews.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_KWidgetsAddons.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_KWindowSystem.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_accessibility_support_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_bootstrap_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_concurrent.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_concurrent_private.pri \ @@ -185,17 +190,28 @@ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_dbus.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_dbus_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_designer.pri \ - /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_eglfs_device_lib_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_edid_support_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_egl_support_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_fb_support_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_glx_support_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_gui.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_gui_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_help.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_input_support_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_kms_support_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_network.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_network_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_opengl.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_opengl_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_openglextensions.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_openglextensions_private.pri \ - /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_platformsupport_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_printsupport.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_printsupport_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_qml.pri \ @@ -204,13 +220,16 @@ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_quickwidgets.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_script.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_scripttools.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_service_support_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_sql.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_sql_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_svg.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_testlib.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_testlib_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_theme_support_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_uiplugin.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_uitools.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_vulkan_support_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_widgets.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_widgets_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_x11extras.pri \ @@ -219,27 +238,29 @@ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_xml_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/qt_functions.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/qt_config.prf \ - /usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64/qmake.conf \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++/qmake.conf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/spec_post.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/exclusive_builds.prf \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/toolchain.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/default_pre.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/resolve_config.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/default_post.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/link_pkgconfig.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/warn_on.prf \ - /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/c++11.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/qt.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/resources.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/moc.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/unix/opengl.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/uic.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/unix/thread.prf \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/qmake_use.prf \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/file_copies.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/testcase_targets.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/exceptions.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/yacc.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/lex.prf \ - zart.pro ../src/gmic.h \ - ../src/gmic_stdlib.h \ + zart.pro ../src/gmic_stdlib.h \ + ../src/gmic.h \ ../src/CImg.h \ include/ImageView.h \ include/MainWindow.h \ @@ -307,36 +328,17 @@ src/OverrideCursor.cpp \ src/OutputWindow.cpp QMAKE_TARGET = zart -DESTDIR = #avoid trailing-slash linebreak +DESTDIR = TARGET = zart first: all -####### Implicit rules - -.SUFFIXES: .o .c .cpp .cc .cxx .C - -.cpp.o: - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" - -.cc.o: - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" - -.cxx.o: - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" - -.C.o: - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" - -.c.o: - $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<" - ####### Build rules -$(TARGET): .ui/ui_MainWindow.h .ui/ui_DialogAbout.h .ui/ui_DialogLicense.h .ui/ui_FullScreenWidget.h .ui/ui_OutputWindow.h $(OBJECTS) +zart: .ui/ui_MainWindow.h .ui/ui_DialogAbout.h .ui/ui_DialogLicense.h .ui/ui_FullScreenWidget.h .ui/ui_OutputWindow.h $(OBJECTS) $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS) -Makefile: zart.pro /usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64/qmake.conf /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/spec_pre.prf \ +Makefile: zart.pro /usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++/qmake.conf /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/spec_pre.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/common/unix.conf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/common/linux.conf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/common/sanitize.conf \ @@ -356,6 +358,7 @@ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_KItemViews.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_KWidgetsAddons.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_KWindowSystem.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_accessibility_support_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_bootstrap_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_concurrent.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_concurrent_private.pri \ @@ -364,17 +367,28 @@ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_dbus.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_dbus_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_designer.pri \ - /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_eglfs_device_lib_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_edid_support_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_egl_support_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_fb_support_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_glx_support_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_gui.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_gui_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_help.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_input_support_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_kms_support_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_network.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_network_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_opengl.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_opengl_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_openglextensions.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_openglextensions_private.pri \ - /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_platformsupport_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_printsupport.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_printsupport_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_qml.pri \ @@ -383,13 +397,16 @@ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_quickwidgets.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_script.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_scripttools.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_service_support_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_sql.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_sql_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_svg.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_testlib.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_testlib_private.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_theme_support_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_uiplugin.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_uitools.pri \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_vulkan_support_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_widgets.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_widgets_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_x11extras.pri \ @@ -398,33 +415,30 @@ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_xml_private.pri \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/qt_functions.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/qt_config.prf \ - /usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64/qmake.conf \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++/qmake.conf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/spec_post.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/exclusive_builds.prf \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/toolchain.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/default_pre.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/resolve_config.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/default_post.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/link_pkgconfig.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/warn_on.prf \ - /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/c++11.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/qt.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/resources.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/moc.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/unix/opengl.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/uic.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/unix/thread.prf \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/qmake_use.prf \ + /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/file_copies.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/testcase_targets.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/exceptions.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/yacc.prf \ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/lex.prf \ zart.pro \ - zart.qrc \ - /usr/lib/x86_64-linux-gnu/libQt5Widgets.prl \ - /usr/lib/x86_64-linux-gnu/libQt5Gui.prl \ - /usr/lib/x86_64-linux-gnu/libQt5Xml.prl \ - /usr/lib/x86_64-linux-gnu/libQt5Network.prl \ - /usr/lib/x86_64-linux-gnu/libQt5Core.prl - $(QMAKE) CONFIG+=release GMIC_PATH=../src -o Makefile zart.pro + zart.qrc + $(QMAKE) -o Makefile zart.pro CONFIG+=release GMIC_PATH=../src /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/spec_pre.prf: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/common/unix.conf: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/common/linux.conf: @@ -445,6 +459,7 @@ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_KItemViews.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_KWidgetsAddons.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_KWindowSystem.pri: +/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_accessibility_support_private.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_bootstrap_private.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_concurrent.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_concurrent_private.pri: @@ -453,17 +468,28 @@ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_dbus.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_dbus_private.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_designer.pri: -/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_eglfs_device_lib_private.pri: +/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_devicediscovery_support_private.pri: +/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_edid_support_private.pri: +/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_egl_support_private.pri: +/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri: +/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri: +/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri: +/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_fb_support_private.pri: +/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_fontdatabase_support_private.pri: +/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_glx_support_private.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_gui.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_gui_private.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_help.pri: +/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_input_support_private.pri: +/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_kms_support_private.pri: +/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_network.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_network_private.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_opengl.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_opengl_private.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_openglextensions.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_openglextensions_private.pri: -/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_platformsupport_private.pri: +/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_platformcompositor_support_private.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_printsupport.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_printsupport_private.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_qml.pri: @@ -472,13 +498,16 @@ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_quickwidgets.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_script.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_scripttools.pri: +/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_service_support_private.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_sql.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_sql_private.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_svg.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_testlib.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_testlib_private.pri: +/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_theme_support_private.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_uiplugin.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_uitools.pri: +/usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_vulkan_support_private.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_widgets.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_widgets_private.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_x11extras.pri: @@ -487,39 +516,36 @@ /usr/lib/x86_64-linux-gnu/qt5/mkspecs/modules/qt_lib_xml_private.pri: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/qt_functions.prf: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/qt_config.prf: -/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64/qmake.conf: +/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++/qmake.conf: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/spec_post.prf: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/exclusive_builds.prf: +/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/toolchain.prf: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/default_pre.prf: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/resolve_config.prf: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/default_post.prf: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/link_pkgconfig.prf: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/warn_on.prf: -/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/c++11.prf: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/qt.prf: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/resources.prf: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/moc.prf: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/unix/opengl.prf: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/uic.prf: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/unix/thread.prf: +/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/qmake_use.prf: +/usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/file_copies.prf: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/testcase_targets.prf: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/exceptions.prf: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/yacc.prf: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/lex.prf: zart.pro: zart.qrc: -/usr/lib/x86_64-linux-gnu/libQt5Widgets.prl: -/usr/lib/x86_64-linux-gnu/libQt5Gui.prl: -/usr/lib/x86_64-linux-gnu/libQt5Xml.prl: -/usr/lib/x86_64-linux-gnu/libQt5Network.prl: -/usr/lib/x86_64-linux-gnu/libQt5Core.prl: qmake: FORCE - @$(QMAKE) CONFIG+=release GMIC_PATH=../src -o Makefile zart.pro + @$(QMAKE) -o Makefile zart.pro CONFIG+=release GMIC_PATH=../src qmake_all: FORCE -all: Makefile $(TARGET) +all: Makefile zart dist: distdir FORCE (cd `dirname $(DISTDIR)` && $(TAR) $(DISTNAME).tar $(DISTNAME) && $(COMPRESS) $(DISTNAME).tar) && $(MOVE) `dirname $(DISTDIR)`/$(DISTNAME).tar.gz . && $(DEL_FILE) -r $(DISTDIR) @@ -528,7 +554,8 @@ @test -d $(DISTDIR) || mkdir -p $(DISTDIR) $(COPY_FILE) --parents $(DIST) $(DISTDIR)/ $(COPY_FILE) --parents zart.qrc $(DISTDIR)/ - $(COPY_FILE) --parents ../src/gmic.h ../src/gmic_stdlib.h ../src/CImg.h include/ImageView.h include/MainWindow.h include/FilterThread.h include/CommandEditor.h include/DialogAbout.h include/ImageConverter.h include/DialogLicense.h include/ImageSource.h include/WebcamSource.h include/StillImageSource.h include/VideoFileSource.h include/Common.h include/TreeWidgetPresetItem.h include/AbstractParameter.h include/IntParameter.h include/CommandParamsWidget.h include/SeparatorParameter.h include/NoteParameter.h include/FloatParameter.h include/BoolParameter.h include/ChoiceParameter.h include/ColorParameter.h include/CriticalRef.h include/FullScreenWidget.h include/FileParameter.h include/FolderParameter.h include/TextParameter.h include/LinkParameter.h include/ConstParameter.h include/PointParameter.h include/KeypointList.h include/OverrideCursor.h include/OutputWindow.h $(DISTDIR)/ + $(COPY_FILE) --parents /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/data/dummy.cpp $(DISTDIR)/ + $(COPY_FILE) --parents ../src/gmic_stdlib.h ../src/gmic.h ../src/CImg.h include/ImageView.h include/MainWindow.h include/FilterThread.h include/CommandEditor.h include/DialogAbout.h include/ImageConverter.h include/DialogLicense.h include/ImageSource.h include/WebcamSource.h include/StillImageSource.h include/VideoFileSource.h include/Common.h include/TreeWidgetPresetItem.h include/AbstractParameter.h include/IntParameter.h include/CommandParamsWidget.h include/SeparatorParameter.h include/NoteParameter.h include/FloatParameter.h include/BoolParameter.h include/ChoiceParameter.h include/ColorParameter.h include/CriticalRef.h include/FullScreenWidget.h include/FileParameter.h include/FolderParameter.h include/TextParameter.h include/LinkParameter.h include/ConstParameter.h include/PointParameter.h include/KeypointList.h include/OverrideCursor.h include/OutputWindow.h $(DISTDIR)/ $(COPY_FILE) --parents ../src/gmic.cpp src/ImageView.cpp src/MainWindow.cpp src/ZArt.cpp src/FilterThread.cpp src/DialogAbout.cpp src/CommandEditor.cpp src/ImageConverter.cpp src/DialogLicense.cpp src/ImageSource.cpp src/WebcamSource.cpp src/StillImageSource.cpp src/VideoFileSource.cpp src/TreeWidgetPresetItem.cpp src/AbstractParameter.cpp src/IntParameter.cpp src/CommandParamsWidget.cpp src/SeparatorParameter.cpp src/NoteParameter.cpp src/FloatParameter.cpp src/BoolParameter.cpp src/ChoiceParameter.cpp src/ColorParameter.cpp src/FullScreenWidget.cpp src/FileParameter.cpp src/FolderParameter.cpp src/TextParameter.cpp src/LinkParameter.cpp src/PointParameter.cpp src/ConstParameter.cpp src/KeypointList.cpp src/OverrideCursor.cpp src/OutputWindow.cpp $(DISTDIR)/ $(COPY_FILE) --parents ui/MainWindow.ui ui/DialogAbout.ui ui/DialogLicense.ui ui/FullScreenWidget.ui ui/OutputWindow.ui $(DISTDIR)/ @@ -540,21 +567,25 @@ distclean: clean -$(DEL_FILE) $(TARGET) + -$(DEL_FILE) .qmake.stash -$(DEL_FILE) Makefile ####### Sub-libraries -mocclean: compiler_moc_header_clean compiler_moc_source_clean +mocclean: compiler_moc_header_clean compiler_moc_objc_header_clean compiler_moc_source_clean -mocables: compiler_moc_header_make_all compiler_moc_source_make_all +mocables: compiler_moc_header_make_all compiler_moc_objc_header_make_all compiler_moc_source_make_all check: first +benchmark: first + compiler_rcc_make_all: .qrc/qrc_zart.cpp compiler_rcc_clean: -$(DEL_FILE) .qrc/qrc_zart.cpp .qrc/qrc_zart.cpp: zart.qrc \ + /usr/lib/qt5/bin/rcc \ presets.xml \ Licence_CeCILL_V2-en.html \ images/media-playback-start.png \ @@ -571,135 +602,190 @@ images/list-remove.png \ images/LogoGreyc.png \ images/Logo_150_alpha.png - /usr/lib/x86_64-linux-gnu/qt5/bin/rcc -name zart zart.qrc -o .qrc/qrc_zart.cpp + /usr/lib/qt5/bin/rcc -name zart zart.qrc -o .qrc/qrc_zart.cpp + +compiler_moc_predefs_make_all: .moc/moc_predefs.h +compiler_moc_predefs_clean: + -$(DEL_FILE) .moc/moc_predefs.h +.moc/moc_predefs.h: /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/data/dummy.cpp + g++ -pipe -fopenmp -O2 -std=gnu++11 -Wall -W -dM -E -o .moc/moc_predefs.h /usr/lib/x86_64-linux-gnu/qt5/mkspecs/features/data/dummy.cpp compiler_moc_header_make_all: .moc/moc_ImageView.cpp .moc/moc_MainWindow.cpp .moc/moc_FilterThread.cpp .moc/moc_CommandEditor.cpp .moc/moc_AbstractParameter.cpp .moc/moc_IntParameter.cpp .moc/moc_CommandParamsWidget.cpp .moc/moc_SeparatorParameter.cpp .moc/moc_NoteParameter.cpp .moc/moc_FloatParameter.cpp .moc/moc_BoolParameter.cpp .moc/moc_ChoiceParameter.cpp .moc/moc_ColorParameter.cpp .moc/moc_FullScreenWidget.cpp .moc/moc_FileParameter.cpp .moc/moc_FolderParameter.cpp .moc/moc_TextParameter.cpp .moc/moc_LinkParameter.cpp .moc/moc_ConstParameter.cpp .moc/moc_PointParameter.cpp .moc/moc_OutputWindow.cpp compiler_moc_header_clean: -$(DEL_FILE) .moc/moc_ImageView.cpp .moc/moc_MainWindow.cpp .moc/moc_FilterThread.cpp .moc/moc_CommandEditor.cpp .moc/moc_AbstractParameter.cpp .moc/moc_IntParameter.cpp .moc/moc_CommandParamsWidget.cpp .moc/moc_SeparatorParameter.cpp .moc/moc_NoteParameter.cpp .moc/moc_FloatParameter.cpp .moc/moc_BoolParameter.cpp .moc/moc_ChoiceParameter.cpp .moc/moc_ColorParameter.cpp .moc/moc_FullScreenWidget.cpp .moc/moc_FileParameter.cpp .moc/moc_FolderParameter.cpp .moc/moc_TextParameter.cpp .moc/moc_LinkParameter.cpp .moc/moc_ConstParameter.cpp .moc/moc_PointParameter.cpp .moc/moc_OutputWindow.cpp -.moc/moc_ImageView.cpp: include/KeypointList.h \ - include/ImageView.h - /usr/lib/x86_64-linux-gnu/qt5/bin/moc $(DEFINES) -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart/include -I/tmp/gmic-2.4.5/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/ImageView.h -o .moc/moc_ImageView.cpp +.moc/moc_ImageView.cpp: include/ImageView.h \ + include/KeypointList.h \ + .moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /tmp/gmic-2.9.2/zart/.moc/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart/include -I/tmp/gmic-2.9.2/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/ImageView.h -o .moc/moc_ImageView.cpp -.moc/moc_MainWindow.cpp: include/FilterThread.h \ +.moc/moc_MainWindow.cpp: include/MainWindow.h \ + include/FilterThread.h \ include/Common.h \ include/CriticalRef.h \ - ../src/gmic.h \ ../src/CImg.h \ + ../src/gmic.h \ include/StillImageSource.h \ include/ImageSource.h \ include/VideoFileSource.h \ include/WebcamSource.h \ .ui/ui_MainWindow.h \ - include/MainWindow.h - /usr/lib/x86_64-linux-gnu/qt5/bin/moc $(DEFINES) -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart/include -I/tmp/gmic-2.4.5/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/MainWindow.h -o .moc/moc_MainWindow.cpp + .moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /tmp/gmic-2.9.2/zart/.moc/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart/include -I/tmp/gmic-2.9.2/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/MainWindow.h -o .moc/moc_MainWindow.cpp -.moc/moc_FilterThread.cpp: include/Common.h \ +.moc/moc_FilterThread.cpp: include/FilterThread.h \ + include/Common.h \ include/CriticalRef.h \ - ../src/gmic.h \ ../src/CImg.h \ - include/FilterThread.h - /usr/lib/x86_64-linux-gnu/qt5/bin/moc $(DEFINES) -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart/include -I/tmp/gmic-2.4.5/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/FilterThread.h -o .moc/moc_FilterThread.cpp - -.moc/moc_CommandEditor.cpp: include/CommandEditor.h - /usr/lib/x86_64-linux-gnu/qt5/bin/moc $(DEFINES) -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart/include -I/tmp/gmic-2.4.5/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/CommandEditor.h -o .moc/moc_CommandEditor.cpp - -.moc/moc_AbstractParameter.cpp: include/AbstractParameter.h - /usr/lib/x86_64-linux-gnu/qt5/bin/moc $(DEFINES) -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart/include -I/tmp/gmic-2.4.5/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/AbstractParameter.h -o .moc/moc_AbstractParameter.cpp + ../src/gmic.h \ + .moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /tmp/gmic-2.9.2/zart/.moc/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart/include -I/tmp/gmic-2.9.2/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/FilterThread.h -o .moc/moc_FilterThread.cpp + +.moc/moc_CommandEditor.cpp: include/CommandEditor.h \ + .moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /tmp/gmic-2.9.2/zart/.moc/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart/include -I/tmp/gmic-2.9.2/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/CommandEditor.h -o .moc/moc_CommandEditor.cpp + +.moc/moc_AbstractParameter.cpp: include/AbstractParameter.h \ + .moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /tmp/gmic-2.9.2/zart/.moc/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart/include -I/tmp/gmic-2.9.2/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/AbstractParameter.h -o .moc/moc_AbstractParameter.cpp -.moc/moc_IntParameter.cpp: include/AbstractParameter.h \ - include/IntParameter.h - /usr/lib/x86_64-linux-gnu/qt5/bin/moc $(DEFINES) -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart/include -I/tmp/gmic-2.4.5/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/IntParameter.h -o .moc/moc_IntParameter.cpp +.moc/moc_IntParameter.cpp: include/IntParameter.h \ + include/AbstractParameter.h \ + .moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /tmp/gmic-2.9.2/zart/.moc/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart/include -I/tmp/gmic-2.9.2/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/IntParameter.h -o .moc/moc_IntParameter.cpp -.moc/moc_CommandParamsWidget.cpp: include/KeypointList.h \ - include/CommandParamsWidget.h - /usr/lib/x86_64-linux-gnu/qt5/bin/moc $(DEFINES) -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart/include -I/tmp/gmic-2.4.5/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/CommandParamsWidget.h -o .moc/moc_CommandParamsWidget.cpp +.moc/moc_CommandParamsWidget.cpp: include/CommandParamsWidget.h \ + include/KeypointList.h \ + .moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /tmp/gmic-2.9.2/zart/.moc/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart/include -I/tmp/gmic-2.9.2/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/CommandParamsWidget.h -o .moc/moc_CommandParamsWidget.cpp -.moc/moc_SeparatorParameter.cpp: include/AbstractParameter.h \ - include/SeparatorParameter.h - /usr/lib/x86_64-linux-gnu/qt5/bin/moc $(DEFINES) -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart/include -I/tmp/gmic-2.4.5/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/SeparatorParameter.h -o .moc/moc_SeparatorParameter.cpp +.moc/moc_SeparatorParameter.cpp: include/SeparatorParameter.h \ + include/AbstractParameter.h \ + .moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /tmp/gmic-2.9.2/zart/.moc/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart/include -I/tmp/gmic-2.9.2/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/SeparatorParameter.h -o .moc/moc_SeparatorParameter.cpp -.moc/moc_NoteParameter.cpp: include/AbstractParameter.h \ - include/NoteParameter.h - /usr/lib/x86_64-linux-gnu/qt5/bin/moc $(DEFINES) -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart/include -I/tmp/gmic-2.4.5/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/NoteParameter.h -o .moc/moc_NoteParameter.cpp +.moc/moc_NoteParameter.cpp: include/NoteParameter.h \ + include/AbstractParameter.h \ + .moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /tmp/gmic-2.9.2/zart/.moc/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart/include -I/tmp/gmic-2.9.2/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/NoteParameter.h -o .moc/moc_NoteParameter.cpp -.moc/moc_FloatParameter.cpp: include/AbstractParameter.h \ - include/FloatParameter.h - /usr/lib/x86_64-linux-gnu/qt5/bin/moc $(DEFINES) -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart/include -I/tmp/gmic-2.4.5/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/FloatParameter.h -o .moc/moc_FloatParameter.cpp +.moc/moc_FloatParameter.cpp: include/FloatParameter.h \ + include/AbstractParameter.h \ + .moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /tmp/gmic-2.9.2/zart/.moc/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart/include -I/tmp/gmic-2.9.2/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/FloatParameter.h -o .moc/moc_FloatParameter.cpp -.moc/moc_BoolParameter.cpp: include/AbstractParameter.h \ - include/BoolParameter.h - /usr/lib/x86_64-linux-gnu/qt5/bin/moc $(DEFINES) -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart/include -I/tmp/gmic-2.4.5/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/BoolParameter.h -o .moc/moc_BoolParameter.cpp +.moc/moc_BoolParameter.cpp: include/BoolParameter.h \ + include/AbstractParameter.h \ + .moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /tmp/gmic-2.9.2/zart/.moc/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart/include -I/tmp/gmic-2.9.2/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/BoolParameter.h -o .moc/moc_BoolParameter.cpp -.moc/moc_ChoiceParameter.cpp: include/AbstractParameter.h \ - include/ChoiceParameter.h - /usr/lib/x86_64-linux-gnu/qt5/bin/moc $(DEFINES) -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart/include -I/tmp/gmic-2.4.5/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/ChoiceParameter.h -o .moc/moc_ChoiceParameter.cpp +.moc/moc_ChoiceParameter.cpp: include/ChoiceParameter.h \ + include/AbstractParameter.h \ + .moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /tmp/gmic-2.9.2/zart/.moc/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart/include -I/tmp/gmic-2.9.2/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/ChoiceParameter.h -o .moc/moc_ChoiceParameter.cpp -.moc/moc_ColorParameter.cpp: include/AbstractParameter.h \ - include/ColorParameter.h - /usr/lib/x86_64-linux-gnu/qt5/bin/moc $(DEFINES) -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart/include -I/tmp/gmic-2.4.5/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/ColorParameter.h -o .moc/moc_ColorParameter.cpp +.moc/moc_ColorParameter.cpp: include/ColorParameter.h \ + include/AbstractParameter.h \ + .moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /tmp/gmic-2.9.2/zart/.moc/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart/include -I/tmp/gmic-2.9.2/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/ColorParameter.h -o .moc/moc_ColorParameter.cpp -.moc/moc_FullScreenWidget.cpp: .ui/ui_FullScreenWidget.h \ - include/FullScreenWidget.h - /usr/lib/x86_64-linux-gnu/qt5/bin/moc $(DEFINES) -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart/include -I/tmp/gmic-2.4.5/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/FullScreenWidget.h -o .moc/moc_FullScreenWidget.cpp +.moc/moc_FullScreenWidget.cpp: include/FullScreenWidget.h \ + .ui/ui_FullScreenWidget.h \ + .moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /tmp/gmic-2.9.2/zart/.moc/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart/include -I/tmp/gmic-2.9.2/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/FullScreenWidget.h -o .moc/moc_FullScreenWidget.cpp -.moc/moc_FileParameter.cpp: include/AbstractParameter.h \ - include/FileParameter.h - /usr/lib/x86_64-linux-gnu/qt5/bin/moc $(DEFINES) -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart/include -I/tmp/gmic-2.4.5/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/FileParameter.h -o .moc/moc_FileParameter.cpp +.moc/moc_FileParameter.cpp: include/FileParameter.h \ + include/AbstractParameter.h \ + .moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /tmp/gmic-2.9.2/zart/.moc/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart/include -I/tmp/gmic-2.9.2/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/FileParameter.h -o .moc/moc_FileParameter.cpp -.moc/moc_FolderParameter.cpp: include/AbstractParameter.h \ - include/FolderParameter.h - /usr/lib/x86_64-linux-gnu/qt5/bin/moc $(DEFINES) -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart/include -I/tmp/gmic-2.4.5/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/FolderParameter.h -o .moc/moc_FolderParameter.cpp +.moc/moc_FolderParameter.cpp: include/FolderParameter.h \ + include/AbstractParameter.h \ + .moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /tmp/gmic-2.9.2/zart/.moc/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart/include -I/tmp/gmic-2.9.2/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/FolderParameter.h -o .moc/moc_FolderParameter.cpp -.moc/moc_TextParameter.cpp: include/AbstractParameter.h \ - include/TextParameter.h - /usr/lib/x86_64-linux-gnu/qt5/bin/moc $(DEFINES) -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart/include -I/tmp/gmic-2.4.5/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/TextParameter.h -o .moc/moc_TextParameter.cpp +.moc/moc_TextParameter.cpp: include/TextParameter.h \ + include/AbstractParameter.h \ + .moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /tmp/gmic-2.9.2/zart/.moc/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart/include -I/tmp/gmic-2.9.2/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/TextParameter.h -o .moc/moc_TextParameter.cpp -.moc/moc_LinkParameter.cpp: include/AbstractParameter.h \ - include/LinkParameter.h - /usr/lib/x86_64-linux-gnu/qt5/bin/moc $(DEFINES) -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart/include -I/tmp/gmic-2.4.5/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/LinkParameter.h -o .moc/moc_LinkParameter.cpp +.moc/moc_LinkParameter.cpp: include/LinkParameter.h \ + include/AbstractParameter.h \ + .moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /tmp/gmic-2.9.2/zart/.moc/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart/include -I/tmp/gmic-2.9.2/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/LinkParameter.h -o .moc/moc_LinkParameter.cpp -.moc/moc_ConstParameter.cpp: include/AbstractParameter.h \ - include/ConstParameter.h - /usr/lib/x86_64-linux-gnu/qt5/bin/moc $(DEFINES) -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart/include -I/tmp/gmic-2.4.5/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/ConstParameter.h -o .moc/moc_ConstParameter.cpp +.moc/moc_ConstParameter.cpp: include/ConstParameter.h \ + include/AbstractParameter.h \ + .moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /tmp/gmic-2.9.2/zart/.moc/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart/include -I/tmp/gmic-2.9.2/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/ConstParameter.h -o .moc/moc_ConstParameter.cpp -.moc/moc_PointParameter.cpp: include/AbstractParameter.h \ - include/PointParameter.h - /usr/lib/x86_64-linux-gnu/qt5/bin/moc $(DEFINES) -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart/include -I/tmp/gmic-2.4.5/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/PointParameter.h -o .moc/moc_PointParameter.cpp +.moc/moc_PointParameter.cpp: include/PointParameter.h \ + include/AbstractParameter.h \ + .moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /tmp/gmic-2.9.2/zart/.moc/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart/include -I/tmp/gmic-2.9.2/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/PointParameter.h -o .moc/moc_PointParameter.cpp -.moc/moc_OutputWindow.cpp: .ui/ui_OutputWindow.h \ - include/OutputWindow.h - /usr/lib/x86_64-linux-gnu/qt5/bin/moc $(DEFINES) -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++-64 -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart -I/tmp/gmic-2.4.5/zart/include -I/tmp/gmic-2.4.5/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/OutputWindow.h -o .moc/moc_OutputWindow.cpp +.moc/moc_OutputWindow.cpp: include/OutputWindow.h \ + .ui/ui_OutputWindow.h \ + .moc/moc_predefs.h \ + /usr/lib/qt5/bin/moc + /usr/lib/qt5/bin/moc $(DEFINES) --include /tmp/gmic-2.9.2/zart/.moc/moc_predefs.h -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-g++ -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart -I/tmp/gmic-2.9.2/zart/include -I/tmp/gmic-2.9.2/src -I/usr/include/opencv -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtXml -I/usr/include/x86_64-linux-gnu/qt5/QtNetwork -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include include/OutputWindow.h -o .moc/moc_OutputWindow.cpp +compiler_moc_objc_header_make_all: +compiler_moc_objc_header_clean: compiler_moc_source_make_all: compiler_moc_source_clean: compiler_uic_make_all: .ui/ui_MainWindow.h .ui/ui_DialogAbout.h .ui/ui_DialogLicense.h .ui/ui_FullScreenWidget.h .ui/ui_OutputWindow.h compiler_uic_clean: -$(DEL_FILE) .ui/ui_MainWindow.h .ui/ui_DialogAbout.h .ui/ui_DialogLicense.h .ui/ui_FullScreenWidget.h .ui/ui_OutputWindow.h .ui/ui_MainWindow.h: ui/MainWindow.ui \ + /usr/lib/qt5/bin/uic \ include/ImageView.h \ include/CommandEditor.h \ include/CommandParamsWidget.h \ include/KeypointList.h \ include/KeypointList.h - /usr/lib/x86_64-linux-gnu/qt5/bin/uic ui/MainWindow.ui -o .ui/ui_MainWindow.h + /usr/lib/qt5/bin/uic ui/MainWindow.ui -o .ui/ui_MainWindow.h -.ui/ui_DialogAbout.h: ui/DialogAbout.ui - /usr/lib/x86_64-linux-gnu/qt5/bin/uic ui/DialogAbout.ui -o .ui/ui_DialogAbout.h - -.ui/ui_DialogLicense.h: ui/DialogLicense.ui - /usr/lib/x86_64-linux-gnu/qt5/bin/uic ui/DialogLicense.ui -o .ui/ui_DialogLicense.h +.ui/ui_DialogAbout.h: ui/DialogAbout.ui \ + /usr/lib/qt5/bin/uic + /usr/lib/qt5/bin/uic ui/DialogAbout.ui -o .ui/ui_DialogAbout.h + +.ui/ui_DialogLicense.h: ui/DialogLicense.ui \ + /usr/lib/qt5/bin/uic + /usr/lib/qt5/bin/uic ui/DialogLicense.ui -o .ui/ui_DialogLicense.h .ui/ui_FullScreenWidget.h: ui/FullScreenWidget.ui \ + /usr/lib/qt5/bin/uic \ include/ImageView.h \ include/CommandParamsWidget.h \ include/KeypointList.h \ include/KeypointList.h - /usr/lib/x86_64-linux-gnu/qt5/bin/uic ui/FullScreenWidget.ui -o .ui/ui_FullScreenWidget.h + /usr/lib/qt5/bin/uic ui/FullScreenWidget.ui -o .ui/ui_FullScreenWidget.h .ui/ui_OutputWindow.h: ui/OutputWindow.ui \ + /usr/lib/qt5/bin/uic \ include/ImageView.h \ include/KeypointList.h - /usr/lib/x86_64-linux-gnu/qt5/bin/uic ui/OutputWindow.ui -o .ui/ui_OutputWindow.h + /usr/lib/qt5/bin/uic ui/OutputWindow.ui -o .ui/ui_OutputWindow.h compiler_yacc_decl_make_all: compiler_yacc_decl_clean: @@ -707,7 +793,7 @@ compiler_yacc_impl_clean: compiler_lex_make_all: compiler_lex_clean: -compiler_clean: compiler_rcc_clean compiler_moc_header_clean compiler_uic_clean +compiler_clean: compiler_rcc_clean compiler_moc_predefs_clean compiler_moc_header_clean compiler_uic_clean ####### Compile @@ -729,8 +815,8 @@ .ui/ui_DialogLicense.h \ include/FilterThread.h \ include/CriticalRef.h \ - ../src/gmic.h \ ../src/CImg.h \ + ../src/gmic.h \ include/FullScreenWidget.h \ .ui/ui_FullScreenWidget.h \ include/ImageConverter.h \ @@ -751,8 +837,8 @@ include/MainWindow.h \ include/FilterThread.h \ include/CriticalRef.h \ - ../src/gmic.h \ ../src/CImg.h \ + ../src/gmic.h \ include/StillImageSource.h \ include/ImageSource.h \ include/VideoFileSource.h \ @@ -763,8 +849,8 @@ .obj/FilterThread.o: src/FilterThread.cpp include/FilterThread.h \ include/Common.h \ include/CriticalRef.h \ - ../src/gmic.h \ ../src/CImg.h \ + ../src/gmic.h \ include/ImageConverter.h \ include/WebcamSource.h \ include/ImageSource.h @@ -781,8 +867,8 @@ $(CXX) -c $(CXXFLAGS) $(INCPATH) -o .obj/CommandEditor.o src/CommandEditor.cpp .obj/ImageConverter.o: src/ImageConverter.cpp include/ImageConverter.h \ - ../src/gmic.h \ ../src/CImg.h \ + ../src/gmic.h \ include/Common.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o .obj/ImageConverter.o src/ImageConverter.cpp @@ -802,8 +888,8 @@ .obj/StillImageSource.o: src/StillImageSource.cpp include/StillImageSource.h \ include/ImageSource.h \ include/ImageConverter.h \ - ../src/gmic.h \ - ../src/CImg.h + ../src/CImg.h \ + ../src/gmic.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o .obj/StillImageSource.o src/StillImageSource.cpp .obj/VideoFileSource.o: src/VideoFileSource.cpp include/VideoFileSource.h \ @@ -880,8 +966,8 @@ include/FilterThread.h \ include/Common.h \ include/CriticalRef.h \ - ../src/gmic.h \ ../src/CImg.h \ + ../src/gmic.h \ include/StillImageSource.h \ include/ImageSource.h \ include/VideoFileSource.h \ @@ -935,8 +1021,8 @@ include/FilterThread.h \ include/Common.h \ include/CriticalRef.h \ - ../src/gmic.h \ ../src/CImg.h \ + ../src/gmic.h \ include/StillImageSource.h \ include/ImageSource.h \ include/VideoFileSource.h \ @@ -1012,9 +1098,18 @@ ####### Install -install: FORCE +install_zart_program: first FORCE + @test -d $(INSTALL_ROOT)/usr/bin || mkdir -p $(INSTALL_ROOT)/usr/bin + -$(QINSTALL_PROGRAM) /tmp/gmic-2.9.2/zart/zart $(INSTALL_ROOT)/usr/bin/zart + +uninstall_zart_program: FORCE + -$(DEL_FILE) -r $(INSTALL_ROOT)/usr/bin/zart + -$(DEL_DIR) $(INSTALL_ROOT)/usr/bin/ + + +install: install_zart_program FORCE -uninstall: FORCE +uninstall: uninstall_zart_program FORCE FORCE: diff -Nru gmic-2.4.5/zart/presets.xml gmic-2.9.2/zart/presets.xml --- gmic-2.4.5/zart/presets.xml 2019-01-11 11:25:52.000000000 +0000 +++ gmic-2.9.2/zart/presets.xml 2020-09-03 11:37:04.000000000 +0000 @@ -11,21 +11,15 @@ -fx_logo_en $"*" +_none_ - - - - - + + - - - + + + + + +_none_ + + + + + + + +-fx_gmicky_preview $"*" + + + + + + + + + + + + + +_none_ + + + + + - + - - + + -fx_array_fade_preview $"*" +-fx_array_fade_preview $"*" - - - - - - - - + + + + + + + + - + - - + + -fx_array_mirror_preview $"*" +-fx_array_mirror_preview $"*" - - - + + + - + - + - - + + -array_random $"*" +-array_random $"*" - - - - + + + + - + - - + + -fx_array_color $"*" +-fx_array_color $"*" - - + + - + - - + + -fx_array_preview $"*" +-fx_array_preview $"*" - - - - - - + + + + + + - + - - - -fx_asciiart_preview $"*" - - - - - - - - - - - - - - - - - - - - - - + -fx_chessboard_preview $"*" +-fx_chessboard_preview $"*" - - - - + + + + - - + + - + - + -fx_dices $"*" +-fx_dices $"*" - + - + - - + + -fx_imagegrid $"*" +-fx_imagegrid $"*" - - + + - + - - + + -fx_imagegrid_hexagonal $"*" +-fx_imagegrid_hexagonal $"*" - - - - - - - - -fx_imagegrid_triangular $"*" - - - - - + - + - - + + -fx_make_seamless_preview $"*" +-fx_imagegrid_triangular $"*" - - - - - - - + + + + - - - + - + -fx_ministeck_preview $"*" +-fx_ministeck_preview $"*" - + - - - - - + + + + + - + - + -fx_puzzle_preview $"*" +-fx_puzzle_preview $"*" - - + + - - + + - - - - + + + + - + - - - - + + + + - + - + -fx_taquin $"*" +-fx_taquin $"*" - - - + + + - - - - - - - - - - - - -fx_rotate_tileable_preview $"*" - - - - + + + - - + - + - - + + -fx_rotate_tiles $"*" +-fx_rotate_tiles $"*" - - + + - - + + - + - - + + -fx_normalize_tiles $"*" +-fx_normalize_tiles $"*" - - - - + + + + - + - + - - + + -fx_shift_tiles $"*" +-fx_shift_tiles $"*" - - + + - + - - + + -fx_parameterize_tiles $"*" +-fx_parameterize_tiles $"*" - - - + + + - + - - + + -fx_isolate_tiles $"*" +-fx_isolate_tiles $"*" - - - - - - + + + + + + - + @@ -398,60 +475,62 @@ -fx_bokeh_preview $"*" +-fx_bokeh_preview $"*" - + - + - + - + - + - + - + -fx_cartoon_preview $"*" +-fx_cartoon_preview $"*" - - - - + + + + - + -fx_cubism_preview $"*" +-fx_cubism_preview $"*" @@ -464,38 +543,58 @@ - + + + + + + +-fx_cutout_preview $"*" + + + + + + + + + + + - - + + -fx_diffusiontensors_preview $"*" +-fx_diffusiontensors_preview $"*" - + - - + + - + -fx_ellipsionism_preview $"*" +-fx_ellipsionism_preview $"*" - - + + @@ -505,13 +604,14 @@ - + - - + + -fx_feltpen_preview $"*" +-fx_feltpen_preview $"*" @@ -524,54 +624,35 @@ - + - - + + -fx_hardsketchbw_preview $"*" +-fx_hardsketchbw_preview $"*" - - - - - - - - - - - - - -fx_highlight_bloom_preview $"*" - - - - - - + + - - - - + - - + + -fx_poster_hope_preview $"*" +-fx_poster_hope_preview $"*" @@ -580,50 +661,53 @@ - + - - + + -fx_houghsketchbw_preview $"*" +-fx_houghsketchbw_preview $"*" - + - + -fx_kuwahara_preview $"*" +-fx_kuwahara_preview $"*" - - + + - + - - + + -fx_lylejk_painting_preview $"*" +-fx_lylejk_painting_preview $"*" @@ -634,33 +718,35 @@ - + -fx_painting_preview $"*" +-fx_painting_preview $"*" - + - + - + - - + + -fx_pen_drawing_preview $"*" +-fx_pen_drawing_preview $"*" @@ -668,13 +754,14 @@ - + - - + + -fx_polygonize_delaunay_preview $"*" +-fx_polygonize_delaunay_preview $"*" @@ -682,106 +769,64 @@ - - - - - - - - - - - - - -fx_polygonize_preview $"*" - - - - - - - + + - - - + - - + + -fx_poster_edges_preview $"*" +-fx_poster_edges_preview $"*" - - - - - - - + + + + + + + - - + -fx_posterize_preview $"*" +-fx_posterize_preview $"*" - + - - - - - - - - - - - - -fx_quadtree_preview $"*" - - - - - - - - - - - + - + -fx_rodilius_preview $"*" +-fx_rodilius_preview $"*" @@ -789,73 +834,76 @@ - + - - + + - + - - + + -fx_sharp_abstract_preview $"*" +-fx_sharp_abstract_preview $"*" - - + + - + - + -fx_sketchbw_preview $"*" +-fx_sketchbw_preview $"*" - - - - - + + + + + - + - - - + + + - + - - + + -fx_smooth_abstract_preview $"*" +-fx_smooth_abstract_preview $"*" - + @@ -863,13 +911,14 @@ - + - - + + -fx_vector_painting_preview $"*" +-fx_vector_painting_preview $"*" @@ -878,26 +927,27 @@ +Latest Update: <i>2015/25/08</i>.</small>" /> -warhol $"*" +-warhol $"*" - - + + - + - - + + -fx_draw_whirl_preview $"*" +-fx_draw_whirl_preview $"*" @@ -905,29 +955,30 @@ - + - + - - + + -fx_blackandwhite_preview $"*" +-fx_blackandwhite_preview $"*" - - - - - - + + + + + + @@ -935,31 +986,32 @@ - - - - - - + + + + + + - + - + - - + + - + - - + + -fx_stencilbw_preview $"*" +-fx_stencilbw_preview $"*" @@ -970,71 +1022,74 @@ - + - + -fx_charcoal_preview $"*" +-fx_charcoal_preview $"*" - - - - - - - - - - + + + + + + + + + + - + - - + + -fx_bwrecolorize_preview $"*" +-fx_bwrecolorize_preview $"*" - + - - - + + + - - - - - - - - - + + + + + + + + + - + - + -fx_ditheredbw_preview $"*" +-fx_ditheredbw_preview $"*" @@ -1047,13 +1102,14 @@ - + - + -fx_engrave_preview $"*" +-fx_engrave_preview $"*" @@ -1061,30 +1117,31 @@ - - + + - + - + - + - + -fx_freaky_bw_preview $"*" +-fx_freaky_bw_preview $"*" @@ -1096,42 +1153,44 @@ - + - - + + -fx_ink_wash $"*" +-fx_ink_wash $"*" - - + + - - - - - - - - - - - + + + + + + + + + + + - + - + -fx_pencilbw_preview $"*" +-fx_pencilbw_preview $"*" @@ -1142,45 +1201,29 @@ - - - - - - -fx_pencil_portraitbw_preview $"*" - - - - - - - - - - - - + - + -fx_stamp_preview $"*" +-fx_stamp_preview $"*" - + - + - + @@ -1195,7 +1238,7 @@ -fx_color_abstraction_preview $"*" +-fx_color_abstraction_preview $"*" @@ -1205,13 +1248,14 @@ - + - - + + -fx_adjust_colors_preview $"*" +-fx_adjust_colors_preview $"*" @@ -1223,97 +1267,93 @@ - + - - + + -fx_boost_chroma_preview $"*" +-fx_boost_chroma_preview $"*" - + - + - - + + -fx_boost_fade_preview $"*" +-fx_boost_fade_preview $"*" + - + - - + + -fx_channel_processing_preview $"*" +-fx_channel_processing_preview $"*" - - - + + + - - + + - + - + - - + + -fx_channels2layers_preview $"*" +-fx_balance_gamma_preview $"*" - - - - - - - - -fx_balance_gamma_preview $"*" - - - + + - + - - + + -fx_colorblind_preview $"*" +-fx_colorblind_preview $"*" - + @@ -1323,331 +1363,206 @@ This filter simulates different types of colorblindness vision.<br/> </small>" /> - + - - + + -fx_colormap_preview $"*" +-fx_detect_skin_preview $"*" - - + + + + + + - - + + + + - - - - - - - - - - + - - - - - - -fx_decompose_channels_preview $"*" - - - - - - - + -fx_hsv_equalizer_preview $"*" +-fx_hsv_equalizer_preview $"*" - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - + -fx_equalize_hsv_preview $"*" +-fx_equalize_hsv_preview $"*" - - + + - + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - -fx_mix_cmyk_preview $"*" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -fx_mix_hsv_preview $"*" - - - - - - - - - - - - - - - - - - - - - - - - - - -fx_mix_lab_preview $"*" - - - - - - - - - - - - - - - + + + - + - - + + -fx_mix_rgb_preview $"*" +-fx_retinex_preview $"*" - - - - - - - - - - - + + + + + + - - + + + - - - - - - -fx_mix_ycbcr_preview $"*" - - - - - - - - - - - - - - - - - - - + + - + - - + + -fx_retinex_preview $"*" +-fx_select_color_preview $"*" - - - - - - - - - - + + + + + + + - - - - + - - + + -fx_selective_desaturation_preview $"*" +-fx_selective_desaturation_preview $"*" - - + + - + - + -fx_sepia_preview $"*" +-fx_sepia_preview $"*" @@ -1657,23 +1572,25 @@ - + - - + + -fx_custom_transform $"*" +-fx_custom_transform $"*" - - + + - + - + @@ -1688,154 +1605,165 @@ -fx_convolve_preview $"*" +-fx_convolve_preview $"*" - - + + - - - + + + - + - + -fx_curvature_preview $"*" +-fx_curvature_preview $"*" - - - - + + + + - + - - + + -fx_dog_preview $"*" +-fx_dog_preview $"*" - - + + - + - + - - + + -fx_distance_preview $"*" +-fx_distance_preview $"*" - + - + -fx_edges_preview $"*" +-fx_edges_preview $"*" - + - + - - + + -fx_edge_offsets_preview $"*" +-fx_edge_offsets_preview $"*" - + - + - - + + -fx_gradient_norm_preview $"*" +-fx_gradient_norm_preview $"*" - - - + + + - + -fx_gradient2rgb_preview $"*" +-fx_gradient2rgb_preview $"*" - - - - + + + + - + -fx_isophotes_preview $"*" +-fx_isophotes_preview $"*" @@ -1845,137 +1773,143 @@ - + -fx_laplacian_preview $"*" +-fx_laplacian_preview $"*" - - - - + + + + - + - - + + -fx_local_orientation_preview $"*" +-fx_local_orientation_preview $"*" - - - + + + - + - + - - + + -fx_morpho_v2_preview $"*" +-fx_morphological_preview $"*" - + - + - - + + - + -fx_segment_watershed_preview $"*" +-fx_segment_watershed_preview $"*" - + - - + + - + -fx_skeleton_preview $"*" +-fx_skeleton_preview $"*" - + - - - + - - + + -fx_superpixels_preview $"*" +-fx_superpixels_preview $"*" - - + + - + - - + + -fx_thin_edges_preview $"*" +-fx_thin_edges_preview $"*" - + - + @@ -1987,159 +1921,169 @@ ************************************ --> - - + + -fx_custom_deformation $"*" +-fx_custom_deformation $"*" - - - - + + + + - + - - + + -fx_circle_transform_preview $"*" +-fx_circle_transform_preview $"*" - - + + - + - + - + - - + + -fx_conformal_maps_preview $"*" +-fx_conformal_maps_preview $"*" - - - - + + + + - - - + + + - + - - - + + + - + -fx_crease $"*" +-fx_crease $"*" - + - - + + -fx_distort_lens $"*" +-fx_distort_lens $"*" - + - + - - + + -fx_drop_water_preview $"*" +-fx_drop_water_preview $"*" - + - - + + - - - - + + + + - - - - + + + + - + - + - - + + -fx_equirectangular2nadirzenith $"*" +-fx_equirectangular2nadirzenith $"*" - + - + - - + + -fx_euclidean2polar $"*" +-fx_euclidean2polar $"*" - + - + - + - - + + -fisheye $"*" +-fisheye $"*" - + -fx_flower_preview $"*" +-fx_flower_preview $"*" @@ -2147,107 +2091,115 @@ - + - - + + -fx_rotoidoscope $"*" +-fx_rotoidoscope $"*" - + - + - - + + -fx_kaleidoscope $"*" +-fx_kaleidoscope $"*" - - - - + + + + - + - - + + -fx_symmetrizoscope $"*" +-fx_symmetrizoscope $"*" - + - + -fx_warp_perspective $"*" +-fx_warp_perspective $"*" - - + + - - + + - + - - + + -fx_transform_polar $"*" +-fx_transform_polar $"*" - + - + -raindrops $"*" +-raindrops $"*" - + - + -deform $"*" +-deform $"*" - + -ripple $"*" +-ripple $"*" @@ -2255,76 +2207,54 @@ - + -fx_reflect $"*" +-fx_reflect $"*" - - - - + + + + - - - - - - -fx_seamcarve_preview $"*" - - - - - - - - - - + -fx_map_sphere_preview $"*" +-fx_map_sphere_preview $"*" - - + + - + - + - + -fx_spherize_preview $"*" +-fx_spherize_preview $"*" @@ -2332,124 +2262,133 @@ - - + + - + - - + + -fx_square_circle $"*" +-fx_square_circle $"*" - - + + - - - - + + + + - + - + - - + + -fx_project_stereographic_preview $"*" - - - + + + - - + + - + -fx_symmetrize_preview $"*" +-fx_symmetrize_preview $"*" - + - + - - + + -fx_textured_glass_preview $"*" +-fx_textured_glass_preview $"*" - - - - - - - + + + + + + + - + -fx_twirl $"*" +-fx_twirl $"*" - + -water $"*" +-water $"*" - + -wave $"*" +-wave $"*" - + -fx_wind_preview $"*" +-fx_wind_preview $"*" @@ -2457,26 +2396,28 @@ - - + + - + -fx_zoom $"*" +-fx_zoom $"*" - + @@ -2488,331 +2429,439 @@ ************************************ --> - - + + + +-fx_simulate_grain_preview $"*" + + + + + + + + + + + + + + + + + + + + + + + -fx_blur_angular_preview $"*" +-fx_blur_angular_preview $"*" - + - + - - + + - + - - + + -fx_blur_bloom_preview $"*" +-fx_blur_bloom_preview $"*" - - + + - + - + - - + + -fx_blur_dof_preview $"*" +-fx_blur_dof_preview $"*" - - - - + + + + - - + + - + - - + - - + + -fx_gaussian_blur_preview $"*" +-fx_gaussian_blur_preview $"*" - - - + + + - - + + - + - - + + -fx_glow_preview $"*" +-fx_glow_preview $"*" - - + + - + - - + + -fx_blur_linear_preview $"*" +-fx_blur_linear_preview $"*" - - + + - - + + - + - - + + -fx_blur_radial_preview $"*" +-fx_blur_radial_preview $"*" - + - - + + - + - - + + -fx_chromatic_aberrations_preview $"*" +-fx_chromatic_aberrations_preview $"*" - - - + + + - - - + + + - + -fx_dirty_preview $"*" +-fx_dirty_preview $"*" - - + + - + - - + + -fx_flip_blocs_preview $"*" +-fx_flip_blocs_preview $"*" - - + + - + - + - - + + -fx_jpeg_artefacts_preview $"*" +-fx_jpeg_artefacts_preview $"*" - + - + -fx_lomo_preview $"*" +-fx_lomo_preview $"*" - + - + - - + + -fx_noise_preview $"*" +-fx_mess_with_bits_preview $"*" - - + + + + - - + + + + + + + - + - - + + -fx_spread_preview $"*" +-fx_noise_preview $"*" - - + + - - + + - + - - + + -fx_stripes_y_preview $"*" +-fx_noise_perlin_preview $"*" - + - - + + + + + + + + + + + + + + + + + + + + + - + - - + + -fx_8bits_preview $"*" +-fx_spread_preview $"*" - - - + + + + + - + - - + + -fx_pixelsort_preview $"*" +-fx_stripes_y_preview $"*" + + + + + + + + + + + + + + + + +-fx_8bits_preview $"*" + + + + + + + + + + + + + + + +-fx_pixelsort_preview $"*" - - + + - - - - - - + + + + + + - + - - + + -fx_rain_preview $"*" +-fx_rain_preview $"*" @@ -2825,33 +2874,35 @@ - + - - + + -fx_shade_stripes_preview $"*" +-fx_shade_stripes_preview $"*" - - + + - + -fx_scanlines_preview $"*" +-fx_scanlines_preview $"*" @@ -2859,20 +2910,35 @@ - - + + - + - - + + -fx_watermark_visible $"*" +-fx_streak $"*" + + + + + + + + + + + + +-fx_watermark_visible $"*" @@ -2881,31 +2947,33 @@ - + - - + + -fx_warp_by_intensity_preview $"*" +-fx_warp_by_intensity_preview $"*" - - + + - - + + - - + + - + - + @@ -2917,261 +2985,254 @@ ************************************ --> - - - -fx_equalize_details_preview $"*" - - - + + + fx_equalize_details_preview $* + + - + - + - + - + - - + + - + + - - - + + - + - - + + -fx_equalize_local_histograms_preview $"*" +-fx_equalize_local_histograms_preview $"*" - + - + - + - - - -fx_freaky_details_preview $"*" - + + + fx_freaky_details_preview $* - + - + + - - - + + - + - - + + -fx_normalize_local_preview $"*" +-fx_normalize_local_preview $"*" - - - + + + - + - + - - + + -fx_local_processing_preview $"*" +-fx_local_processing_preview $"*" - + - + - + - + - - + + -fx_magic_details_preview $"*" +-fx_magic_details_preview $"*" - - + + - + - + - - + + -fx_mighty_details_preview $"*" +-fx_mighty_details_preview $"*" - - - + + + - + - + - - - -fx_deblur_preview $"*" - + + + fx_deblur_preview $* - + - + - + - + + - - - + + - + - + - -fx_unsharp_goldmeinel_preview $"*" - + fx_unsharp_goldmeinel_preview $* - + - + + - - - + + - + - - - -fx_sharpen_inversediff_preview $"*" - + + + fx_sharpen_inversediff_preview $* - + - + + - - - + + - + - - - -fx_unsharp_octave_preview $"*" - + + + fx_unsharp_octave_preview $* - + - + - + + - - - + + - + -fx_unsharp_richardsonlucy_preview $"*" +-fx_unsharp_richardsonlucy_preview $"*" @@ -3182,64 +3243,64 @@ - + - - - -fx_sharpen_shock_preview $"*" - + + + fx_sharpen_shock_preview $* - - - + + + - + - + + - - - + + - + - - + + -fx_sharpen_texture_preview $"*" +-fx_sharpen_texture_preview $"*" - + - + - - + + -fx_unsharp_preview $"*" +-fx_unsharp_preview $"*" - - - + + + - - + + - + - + @@ -3250,401 +3311,82 @@ This filter is inspired by the original GIMP <i>Unsharp Mask</i> filter, with additional parameters.<br/> </small>" /> - + + + + + + +-fx_split_details_gaussian_preview $"*" + + + + + + + + - - + + -fx_split_details_wavelets_preview $"*" +-fx_split_details_wavelets_preview $"*" - - + + - + - - + - - + + -fx_map_tones_preview $"*" +-fx_map_tones_preview $"*" - + - + - - + + -fx_map_tones_fast_preview $"*" +-fx_map_tones_fast_preview $"*" - - - - - - - - - - - - - - - - - -fx_emulate_grain_preview $"*" - - - - - - - - - - - - - - - - - - - - - - - - -fx_emulate_film_bw_preview $"*" - - - - - - - - - - - - - - - - - - - - - - - - - - -fx_emulate_film_fujixtransii_preview $"*" - - - - - - - - - - - - - - - - - - - - - - - - -fx_emulate_film_instant_consumer_preview $"*" - - - - - - - - - - - - - - - - - - - - - - - - -fx_emulate_film_instant_pro_preview $"*" - - - - - - - - - - - - - - - - - - - - - - - - -fx_emulate_film_negative_color_preview $"*" - - - - - - - - - - - - - - - - - - - - - - - - -fx_emulate_film_negative_new_preview $"*" - - - - - - - - - - - - - - - - - - - - - - - - - -fx_emulate_film_negative_old_preview $"*" - - - - - - - - - - - - - - - - - - - - - - - - - -fx_emulate_film_picturefx_preview $"*" - - - - - - - - - - - - - - - - - - - - - - - - -fx_emulate_film_print_preview $"*" - - - - - - - - - - - - - - - - - - - - - - - - -fx_emulate_film_colorslide_preview $"*" - - - - - - - - - - - - - - - - - - - - - - - - -fx_emulate_film_userdefined_preview $"*" - - - - - - - - - - - - + - - - - - - - - - -fx_emulate_film_various_preview $"*" - - - - - - - - - - - - - - - - - - - + @@ -3659,7 +3401,7 @@ -fx_droste_preview $"*" +-fx_droste_preview $"*" @@ -3678,198 +3420,234 @@ - - + + - + - - + + - + - - + + -fx_frame_blur $"*" +-fx_frame_blur $"*" - - + + - - + + - - - - - - - - + + + + + + + + - + - - + + -frame_cube $"*" +-frame_cube $"*" - - - - - - + + + + + + - + - - + + -fx_frame_fuzzy $"*" +-fx_frame_fuzzy $"*" - - + + - + - - + + -fx_frame_painting_preview $"*" +-fx_frame_mirror_preview $"*" + + + + + + + + + + + + + + + + + + + + + + + +-fx_frame_painting_preview $"*" - - + + - - - - + + + + - - + + - + - - + + -fx_frame_pattern_preview $"*" +-fx_frame_pattern_preview $"*" - + - + - + - - + + -fx_frame $"*" +-fx_frame $"*" - - - - + + + + - - + + - + - - + + -fx_frame_round $"*" +-fx_frame_round $"*" - - - + + + - + - - + + -fx_frame_smooth $"*" +-fx_frame_smooth $"*" - + - - + + -fx_old_photo $"*" +-fx_old_photo $"*" - - - + + + - + -fx_polaroid $"*" +-fx_polaroid $"*" - - - - + + + + - - - + + + - + -fx_tunnel $"*" +-fx_tunnel $"*" @@ -3877,20 +3655,22 @@ - + -fx_vignette $"*" +-fx_vignette $"*" - - + + - + @@ -3905,72 +3685,71 @@ -fx_bandpass_preview $"*" +-fx_bandpass_preview $"*" - - + + - - + + - + - + - + -fx_burn_preview $"*" +-fx_burn_preview $"*" - - + + - + - - + + -fx_contrast_swm $"*" +-fx_drop_shadow $"*" + + + + + + - - - - - - - - - - - + - - + + -fx_equalize_shadow_preview $"*" +-fx_equalize_shadow_preview $"*" @@ -3978,70 +3757,49 @@ - + - - + + -fx_lightglow_preview $"*" +-fx_lightglow_preview $"*" - + - - - - - - - - - - - - -fx_light_leaks_preview $"*" - - - - - - - - - + - - - - + - - + + -fx_light_patch $"*" +-fx_light_patch $"*" - + - + - - + + -fx_lightrays $"*" +-fx_lightrays $"*" @@ -4049,54 +3807,58 @@ - + - - + + -fx_pop_shadows_preview $"*" +-fx_pop_shadows_preview $"*" - + - + - - + + -fx_light_relief $"*" +-fx_light_relief $"*" - - - + + + - - - - - - + + + + + + - + - - + + -fx_shadow_patch $"*" +-fx_shadow_patch $"*" - + - + @@ -4108,21 +3870,22 @@ ************************************ --> - - + + -rgb2bayer $"*" +-rgb2bayer $"*" - - + + - + -fx_camouflage $"*" +-fx_camouflage $"*" @@ -4132,13 +3895,14 @@ - + -fx_canvas_preview $"*" +-fx_canvas_preview $"*" @@ -4146,7 +3910,7 @@ - + @@ -4155,47 +3919,46 @@ - + - - + + -texturize_canvas $"*" +-texturize_canvas $"*" - + -fx_cracks_preview $"*" +-fx_cracks_preview $"*" - - - - - + - + -fx_crystal_preview $"*" +-fx_crystal_preview $"*" @@ -4205,27 +3968,29 @@ - + - - + + -fx_crystal_background $"*" +-fx_crystal_background $"*" - + - + -fx_halftone_preview $"*" +-fx_halftone_preview $"*" @@ -4234,39 +3999,41 @@ - - - - + + + + - + -fx_hearts_preview $"*" +-fx_hearts_preview $"*" - + - + -fx_lava_preview $"*" +-fx_lava_preview $"*" @@ -4277,77 +4044,98 @@ - + -fx_marble $"*" +-fx_marble $"*" - - - + + + - - + + - + - - + + -fx_mineral_mosaic $"*" +-fx_maze $"*" + + + + + + + + + + + + + +-fx_mineral_mosaic $"*" - - + + - + -fx_mosaic_preview $"*" +-fx_mosaic_preview $"*" - + - + - - + + -fx_shapes_preview $"*" +-fx_shapes_preview $"*" - - + + - - - - - + + + + + @@ -4355,115 +4143,85 @@ - + - - + + -fx_paper_preview $"*" +-fx_paper_preview $"*" - + - + -fx_plaid_texture $"*" +-fx_plaid_texture $"*" - - - + + + - + - - + + -fx_polka_dots $"*" +-fx_polka_dots $"*" - - + + - - - - - - -fx_color_ellipses $"*" - - - - - - - - - - - -fx_syntexturize_preview $"*" - - - - - - - - - - - - - - - - + -fx_rorschach $"*" +-fx_rorschach $"*" - - + + - + -fx_satin $"*" +-fx_satin $"*" - - - + + + @@ -4471,68 +4229,74 @@ - + - + - - + + -fx_seamless_turbulence $"*" +-fx_seamless_turbulence $"*" - + - + - - + + -fx_shockwaves_preview $"*" +-fx_shockwaves_preview $"*" - - + + - + - + -fx_sponge_preview $"*" +-fx_sponge_preview $"*" - + - + - - + + -fx_stained_glass_preview $"*" +-fx_stained_glass_preview $"*" - + @@ -4544,13 +4308,14 @@ - + -fx_stars $"*" +-fx_stars $"*" @@ -4560,87 +4325,93 @@ - + -fx_stencil_preview $"*" +-fx_stencil_preview $"*" - + - + -fx_tetris $"*" +-fx_tetris $"*" - + -fx_truchet $"*" +-fx_truchet $"*" - + - + -weave $"*" +-weave $"*" - - + + - - + + - + -fx_whirls_preview $"*" +-fx_whirls_preview $"*" - + - + @@ -4652,347 +4423,312 @@ ************************************ --> - - - -gui_no_preview $"*" - - - - - - - - - - + + -fx_deinterlace_preview $"*" - - - - - - - - - - - - - -red_eye $"*" +-red_eye $"*" - + - - + + -fx_remove_hotpixels_preview $"*" +-fx_remove_hotpixels_preview $"*" - + - + - - + + -fx_smooth_anisotropic_preview $"*" +-fx_smooth_anisotropic_preview $"*" - - - - - - - + + + + + + + - + - + - - + + -fx_smooth_antialias_preview $"*" +-fx_smooth_antialias_preview $"*" - + - + - - + + -fx_smooth_bilateral_preview $"*" +-fx_smooth_bilateral_preview $"*" - - + + - + - + - - + + -fx_smooth_guided_preview $"*" +-fx_smooth_guided_preview $"*" + - + - + - - - -fx_smooth_diffusion_preview $"*" - + + + fx_smooth_diffusion_preview $* - - - + + + - + - + + - - - + + - + - - - -fx_smooth_meancurvature_preview $"*" - - + + + fx_smooth_meancurvature_preview $* + - + - + - + + - - - + + - + - - + + -fx_smooth_median_preview $"*" +-fx_smooth_median_preview $"*" - + - + - - - -fx_smooth_nlmeans_preview $"*" - - - - - + + + fx_smooth_nlmeans_preview $* + + + + - + - + + - - - + + - + - - - -fx_smooth_patch_preview $"*" - - - - - - - + + + fx_smooth_patch_preview $* + + + + + + - + - + + - - - + + - + - - - -fx_smooth_peronamalik_preview $"*" - - - + + + fx_smooth_peronamalik_preview $* + + - + - + - + + - - - + + - + - - - -fx_smooth_selective_preview $"*" - + + + fx_smooth_selective_preview $* - + - + + - - - + + - + - - - -fx_smooth_anisotropic $"*" - + + + fx_smooth_anisotropic $* - - - - - - - + + + + + + + - + - + + - + - - - -fx_smooth_tv_preview $"*" - - + + + fx_smooth_tv_preview $* + - + - + - + + - - - + + - + - - - -fx_smooth_haar_preview $"*" - + + + fx_smooth_haar_preview $* - + - + + - - - + + - + @@ -5004,10 +4740,10 @@ ************************************ --> - - + + -fx_blocks3d $"*" +-fx_blocks3d $"*" @@ -5018,22 +4754,23 @@ - - - - - - + + + + + + - + - + - - + + -fx_coloredobject3d_preview $"*" +-fx_coloredobject3d_preview $"*" @@ -5041,25 +4778,26 @@ - - - + + + - - - - - - + + + + + + - + - - + + -fx_elevation3d_preview $"*" +-fx_elevation3d_preview $"*" @@ -5067,27 +4805,28 @@ - - - + + + - - - - - - + + + + + + - + - - + + -fx_extrude3d_preview $"*" +-fx_extrude3d_preview $"*" @@ -5096,201 +4835,136 @@ - - - + + + - - - - - - + + + + + + - + - - + + -fx_imageobject3d_preview $"*" +-fx_imageobject3d_preview $"*" - - - + + + - - - - - - + + + + + + - + - - + + -fx_lathing3d_preview $"*" +-fx_lathing3d_preview $"*" - + - - - + + + - - - - - - + + + + + + - + - - + + -fx_random3d $"*" +-fx_random3d $"*" - + - - - - - - + + + + + + - - - - - - -fx_ball_preview $"*" - - - - - - - - - - - - - -fx_barnsley_fern_preview $"*" - - - - - - - - - - - - - - - - - -fx_circle_art $"*" - - - - - - - - - - - - - - - - - - - + - - + + -fx_cupid_preview $"*" - - - - - - - - - - - - -fx_equation_parametric $"*" +-fx_equation_parametric $"*" - - - - - + + + + + - + - - + + -fx_equation_plot $"*" +-fx_equation_plot $"*" - - - + + + - - + + - + - - + + -fx_gear_preview $"*" +-fx_corner_gradient $"*" - - - - - - - - - - - - - - - -fx_corner_gradient $"*" - - - - - + + + + - + - - + + -fx_custom_gradient_preview $"*" +-fx_linear_gradient $"*" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -fx_line_gradient_preview $"*" - - - - - - - - - - - - - - - - - - -fx_linear_gradient $"*" - - - - + + + - - + + - + - - + + -fx_radial_gradient $"*" +-fx_radial_gradient $"*" - - - - - + + + + + - + - - + + -fx_random_gradient $"*" +-fx_random_gradient $"*" - + - - - - - - -fx_heart_preview $"*" - - - - - - - + -fx_lightning_preview $"*" +-fx_lightning_preview $"*" - + @@ -5472,78 +5060,85 @@ - + - + - - - - - - - - - + + + + + + + + + - + -fx_lissajous $"*" +-fx_lissajous $"*" - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - + - - + + -fx_mandelbrot_preview $"*" +-fx_mandelbrot_preview $"*" - - - - - - - - - - - + + + + + + + + + + - + + + + + + - - + + -fx_neon_lightning $"*" +-fx_neon_lightning $"*" @@ -5555,129 +5150,130 @@ - + - + -fx_plasma $"*" +-fx_plasma $"*" - + - + - - + + -fx_quick_copyright $"*" +-fx_quick_copyright $"*" - + - + -fx_rainbow $"*" +-fx_rainbow $"*" - - - - + + + + - - - - - - -fx_sierpinski $"*" - - - - - - - - - - - - - - - - - -fx_snowflake $"*" - - - - - - + -fx_superformula $"*" +-fx_superformula $"*" - - + + - - - + + + - + + + + + + +-fx_symmetric_shape2d_preview $"*" + + + + + + + + + + + + + + + + + -fx_turbulence $"*" +-fx_turbulence $"*" - - + + - + +
\n
Reference
\n
\n

Preamble

\n \n

Table of contents

\n
    @@ -1235,56 +1457,67 @@ \n
\n
  • List of commands
  • \n \n
  • Examples of use
  • \n \n

    Version

    \n
    gmic: GREYC\'s Magic for Image Computing.
     \n
    -\n       Version "${-strver}$strprerelease", Copyright (c) 2008-2019, David Tschumperlé
    +\n       Version "${-strver}$strprerelease", Copyright (c) 2008-2020,
    + David Tschumperlé
     \n       (https://gmic.eu)
     \n
    " -v - --_help_section "Usage" + _help_section "Usage" _help_section_html : + v 0 _section+=1 - v + - e[] "

    \"\"  $1

    " - v - + +e[] "
    \n

    \"\"  $1

    " _help_paragraph_html : - v + - e[] "
    $*
    " - v - + v 0 + ('{``{/"$*"}}') + replace_str. "'"{/$_gmic_c},$_gmic_quotedc + replace_str. "'"{/$_gmic_g},$_gmic_quotedg + replace_str. $_gmic_n"'",$_gmic_n + replace_str. " - "," • " + replace_str. " . "," ◦ " + replace_str. " _ "," ▶ " + add_link_html. 1 + +e[] "
    "{t}"
    " + rm. _help_footer_html : - v + - e[] " -\n
    ** G\47MIC comes with ABSOLUTELY NO WARRANTY; for details visit: https://gmic.eu ** + v 0 + +e[] " +\n
    ** G\47MIC comes with ABSOLUTELY NO WARRANTY; for details visit: + https://gmic.eu ** \n
    \n
    \n
    @@ -1293,14 +1526,19 @@ \n \n " - v - # Commands to output help in latex format. _help_header_latex : + v 0 strver=${-strver} - if {narg($_prerelease)} strprerelease=" (pre-release \\#"$_prerelease")" else strprerelease="" fi - _gmic_n="§\\aftergroup\\Ccn§" _gmic_b="§\\aftergroup\\Ccb§" _gmic_r="§\\aftergroup\\Ccr§" _gmic_g="§\\aftergroup\\Ccg§" _gmic_c="§\\aftergroup\\Ccb§" _gmic_m="" - v + e[] "\\documentclass[a4paper,10.5pt,twoside]{book} + if $_prerelease strprerelease=" (pre-release \\#"$_prerelease")" else strprerelease="" fi + _gmic_n="§\\aftergroup\\Ccn§" + _gmic_b="§\\aftergroup\\Ccb§" + _gmic_r="§\\aftergroup\\Ccr§" + _gmic_g="§\\aftergroup\\Ccg§" + _gmic_c="§\\aftergroup\\Ccb§" + _gmic_m="" + +e[] "\\documentclass[a4paper,10.5pt,twoside]{book} \n\\usepackage{hyperref,fancyhdr,graphicx,amssymb,amsmath,times,makeidx,listings,color} \n\\graphicspath{{img/}} \n\\pagestyle{fancyplain} @@ -1327,7 +1565,9 @@ \n\\newcommand{\\Cb}[1]{\\textcolor{cb}{#1}} \n\\newcommand{\\Cc}[1]{\\textcolor{cc}{#1}} \n\\newcommand{\\Cd}[1]{\\textcolor{cd}{#1}} -\n\\title{\\fbox{\\parbox{\\textwidth}{\\begin{center}\\vspace*{2cm}\\includegraphics[width=12cm]{gmic_banner.jpg}\\\\\\vspace*{1cm}{\\Huge \\textbf{The Handbook}\\\\{\\small Version "$strver$strprerelease"}\\\\\\vspace*{1cm}}\\end{center}}}} +\n\\title{\\fbox{\\parbox{\\textwidth}{\\begin{center}\\vspace*{2cm} +\\includegraphics[width=12cm]{gmic_banner.jpg}\\\\\\vspace*{1cm}{\\Huge \\textbf{The Handbook} +\\\\{\\small Version "$strver$strprerelease"}\\\\\\vspace*{1cm}}\\end{center}}}} \n\\author{\\Large \\bf David Tschumperl\\'e} \n\\renewcommand\\indexname{Index of commands} \n\\makeindex @@ -1341,93 +1581,113 @@ \n Read the full license terms at \\url{http://www.gnu.org/licenses/fdl-1.3.txt}.\\\\~\\\\ \n An online version of this documentation is available at:\\\\\\url{https://gmic.eu/reference.shtml}. \n\\section*{Motivations} -\n \\Cc{G\47MIC} is a full-featured open-source framework for image processing, distributed under the CeCILL free software licenses +\n \\Cc{G\47MIC} is a full-featured open-source framework for image processing, distributed under the CeCILL + free software licenses \n (LGPL-like and/or GPL-compatible). It provides several user interfaces to -\n convert/manipulate/filter/visualize generic image datasets, ranging from 1D scalar signals to 3D+t sequences of multi-spectral +\n convert/manipulate/filter/visualize generic image datasets, ranging from 1D scalar signals to 3D+t sequences + of multi-spectral \n volumetric images, hence including 2D color images. \n~\\\\G'MIC user interfaces are: \n\\begin{itemize} \n\\item '\\texttt{gmic}', a command-line tool to use the \\Cc{G\47MIC} image processing features from a shell. -\n In this setting, \\Cc{G\47MIC} may be seen as a friendly companion to the ImageMagick or GraphicsMagick software suites. -\n\\item '\\texttt{libgmic}', a small, portable, thread-safe and multi-threaded, C++ image processing library to be linked to third-party applications. -\n It's simple API allows programmers to add all \\Cc{G\47MIC} features in their own software without much efforts (a C API is available as well). -\n\\item '\\texttt{G'MIC-Qt}', a plug-in to bring \\Cc{G\47MIC} capabilities to the image retouching and painting software GIMP and Krita. -\n More than 500 filters are already available, sorted by category (Artistic, Black \\& white, Colors, Contours, Deformations, -\n Degradations, Details, Film emulation, Frames, Layers, Light \\& shadows, Patterns, +\n In this setting, \\Cc{G\47MIC} may be seen as a friendly companion to the ImageMagick or GraphicsMagick + software suites. +\n\\item '\\texttt{libgmic}', a small, portable, thread-safe and multi-threaded, C++ image processing library to be + linked to third-party applications. +\n It's simple API allows programmers to add all \\Cc{G\47MIC} features in their own software without much efforts + (a C API is available as well). +\n\\item '\\texttt{G'MIC-Qt}', a plug-in to bring \\Cc{G\47MIC} capabilities to the image retouching and painting + software GIMP and Krita. +\n More than 500 filters are already available, sorted by category (Artistic, Black \\& white, Colors, Contours, + Deformations, +\n Degradations, Details, Color Grading, Frames, Layers, Light \\& shadows, Patterns, \n Rendering, Repair, Sequences, etc.). -\n\\item '\\texttt{\\Cc{G\47MIC} Online}', a web service to allow users applying image processing algorithms on their images, directly from a web browser. -\n\\item '\\texttt{ZArt}', a Qt-based interface for real-time processing of video streaming coming from webcams or video files. +\n\\item '\\texttt{\\Cc{G\47MIC} Online}', a web service to allow users applying image processing algorithms on their + images, directly from a web browser. +\n\\item '\\texttt{ZArt}', a Qt-based interface for real-time processing of video streaming coming from webcams or + video files. \n\\end{itemize} -\n \\Cc{G\47MIC} is focused on the design of possibly complex pipelines for converting, manipulating, filtering and visualizing generic 1D/2D/3D multi-spectral image datasets. This includes of course color images, but also more complex data as image sequences or 3D(+t) volumetric float-valued datasets.\\\\ -\n -\n \\Cc{G\47MIC} is an open framework: the default language can be extended with custom \\Cc{G\47MIC}-written commands, defining thus new available image filters or effects. By the way, \\Cc{G\47MIC} already contains a substantial set of pre-defined image processing algorithms and pipelines (more than 1000).\\\\ -\n -\n \\Cc{G\47MIC} has been designed with portability in mind and runs on different platforms (Windows, Unix, MacOSX). It is distributed partly under the CeCILL licenses (CeCILL-C and/or CeCILL). Since 2008, it is developed in the Image Team of the GREYC laboratory, in Caen/France, by permanent researchers working in the field of image processing on a daily basis. +\n \\Cc{G\47MIC} is focused on the design of possibly complex pipelines for converting, manipulating, filtering and + visualizing generic 1D/2D/3D multi-spectral image datasets. This includes of course color images, but also more + complex data as image sequences or 3D(+t) volumetric float-valued datasets.\\\\ +\n +\n \\Cc{G\47MIC} is an open framework: the default language can be extended with custom \\Cc{G\47MIC}-written commands, + defining thus new available image filters or effects. By the way, \\Cc{G\47MIC} already contains a substantial set of + pre-defined image processing algorithms and pipelines (more than 1000).\\\\ +\n +\n \\Cc{G\47MIC} has been designed with portability in mind and runs on different platforms (Windows, Unix, MacOS). + It is distributed partly under the CeCILL licenses (CeCILL-C and/or CeCILL). Since 2008, it is developed in the + Image Team of the GREYC laboratory, in Caen/France, by permanent researchers working in the field of image processing + on a daily basis. \n\\section*{Version} \n \n \\Ca{\\textbf{gmic:} GREYC\'s Magic for Image Computing.}\\\\ \n -\n \\Cb{Version \\textbf{"$strver$strprerelease"}, Copyright (c) 2008-2019, David Tschumperl\\'e}\\\\ +\n \\Cb{Version \\textbf{"$strver$strprerelease"}, Copyright (c) 2008-2020, David Tschumperl\\'e}\\\\ \n \\Cb{(\\url{https://gmic.eu})} \n\\chapter{Usage} " - v - _help_section_latex : skip "$1" - v + - e[] "~\\\\\\section{$1}" - v - + v 0 + +e[] "~\\\\\\section{$1}" _help_paragraph_latex : skip "$1" - v + - e[] "\\small" - e[] "\\begin{lstlisting}[escapechar=§]" - e[] "$1" - e[] "\\end{lstlisting}" - e[] "\\normalsize" - v - + v 0 + +e[] "\\small" + +e[] "\\begin{lstlisting}[escapechar=§]" + +e[] "$1" + +e[] "\\end{lstlisting}" + +e[] "\\normalsize" _help_footer_latex : - v + - e[] " + v 0 + +e[] " \n\\printindex \n~\\\\$\\square$~End of document. \n\n\\end{document}" - v - # Commands to output help in man page format. _help_header_man : - v + e[] ".TH G\47MIC 1\n\ + v 0 + +e[] ".TH G\47MIC 1\n\ .SH NAME\n\ gmic \\- Perform image processing operations using the G\47MIC framework.\n\ \n\ - .SH HELP\n" v - - _gmic_n="\\fR" _gmic_b="\\fB" _gmic_r="" _gmic_g="" _gmic_c="\\fB" _gmic_m="" + .SH HELP\n" + _gmic_n="\\fR" + _gmic_b="\\fB" + _gmic_r="" + _gmic_g="" + _gmic_c="\\fI" + _gmic_m="" _prerelease= __help_header_ascii - _gmic_n="__N" _gmic_b="__B" _gmic_r="__B" _gmic_c="__B" + _gmic_n="__N" + _gmic_b="__B" + _gmic_r="__B" + _gmic_c="__B" _section=0 _space1="" _space2=" " _help_section "Usage" _help_section_man : + v 0 _section+=1 {narg({'"$1"'})},1,1,1,{'-'} - v + - e[] "\n \\fB"$_section". $1" - e[] " "${_space{narg({'$_section'})}}{t}"\\fR\n" - v - + +e[] "\n \\fI"$_section". $1\\fR\n" rm. _help_paragraph_man : - l[] ({'"$*"'}) + v 0 + l[] ('"$*"') replace_str "\\fR","__N" replace_str "\\fB","__B" + replace_str "\\fI","__I" replace_str "\\","\\\\\\\\" replace_str "__N","\\\\fR" replace_str "__B","\\\\fB" - v + - e[] {0,t} - v - + replace_str "__I","\\\\fI" + +e[] {0,t} rm endl _help_footer_man : @@ -1436,20 +1696,20 @@ # use_vt100 # This command defines some global variables used to output colored text on VT100 terminals. use_vt100 : - v - if {0$_vt100>0} - _gmic_n="\33[0;0;0m" _gmic_r="\33[0;31;59m" _gmic_g="\33[0;32;59m" _gmic_m="\33[0;35;59m" - _gmic_c="\33[0;36;59m" _gmic_b="\33[1m" - fi v + + if $_vt100 + _gmic_n="\33[0;0;0m" + _gmic_r="\33[0;31;59m" + _gmic_g="\33[0;32;59m" + _gmic_m="\33[0;35;59m" + _gmic_c="\33[0;36;59m" + _gmic_b="\33[1m" + fi #@cli version #@cli : Display current version number on stdout. version : - v - - m "_e : echo_stdout[] \"$""*\"" - if {$^>=-1} _e "" fi __help_header_ascii[] - uncommand _e - v + + if !0$_cli_noarg +e[] "\n" fi v : # Allow 'gmic +v' to get the version number. version @@ -1463,43 +1723,342 @@ #@cli camera : _camera_index>=0,_nb_frames>0,_skip_frames>=0,_capture_width>=0,_capture_height>=0 : (+) #@cli : Insert one or several frames from specified camera. #@cli : When 'nb_frames==0', the camera stream is released instead of capturing new images. -#@cli : Default values: 'camera_index=0' (default camera), 'nb_frames=1', 'skip_frames=0' and 'capture_width=capture_height=0' (default size). +#@cli : Default values: 'camera_index=0' (default camera), 'nb_frames=1', 'skip_frames=0' and \ +# 'capture_width=capture_height=0' (default size). -#@cli clut : "clut_name",_resolution>0 -#@cli : Insert one of the pre-defined CLUTs at the end of the image list.\n -#@cli : 'clut_name' can be { 60's | 60's_faded | 60's_faded_alt | agfa_apx_100 | agfa_apx_25 | agfa_precisa_100 | agfa_ultra_color_100 | agfa_vista_200 | alien_green | analogfx_anno_1870_color | analogfx_old_style_i | analogfx_old_style_ii | analogfx_old_style_iii | analogfx_sepia_color | analogfx_soft_sepia_i | analogfx_soft_sepia_ii | black_and_white | bleach_bypass | blue_mono | color_rich | expired_fade | expired_polaroid | extreme | fade | faded | faded_alt | faded_analog | faded_extreme | faded_vivid | faux_infrared | fuji3510_constlclip | fuji3510_constlmap | fuji3510_cuspclip | fuji3513_constlclip | fuji3513_constlmap | fuji3513_cuspclip | fuji_160c | fuji_160c_+ | fuji_160c_++ | fuji_160c_- | fuji_400h | fuji_400h_+ | fuji_400h_++ | fuji_400h_- | fuji_800z | fuji_800z_+ | fuji_800z_++ | fuji_800z_- | fuji_astia_100f | fuji_fp-100c | fuji_fp-100c_+ | fuji_fp-100c_++ | fuji_fp-100c_+++ | fuji_fp-100c_++_alt | fuji_fp-100c_- | fuji_fp-100c_-- | fuji_fp-100c_cool | fuji_fp-100c_cool_+ | fuji_fp-100c_cool_++ | fuji_fp-100c_cool_- | fuji_fp-100c_cool_-- | fuji_fp-100c_negative | fuji_fp-100c_negative_+ | fuji_fp-100c_negative_++ | fuji_fp-100c_negative_+++ | fuji_fp-100c_negative_++_alt | fuji_fp-100c_negative_- | fuji_fp-100c_negative_-- | fuji_fp-3000b | fuji_fp-3000b_+ | fuji_fp-3000b_++ | fuji_fp-3000b_+++ | fuji_fp-3000b_- | fuji_fp-3000b_-- | fuji_fp-3000b_hc | fuji_fp-3000b_negative | fuji_fp-3000b_negative_+ | fuji_fp-3000b_negative_++ | fuji_fp-3000b_negative_+++ | fuji_fp-3000b_negative_- | fuji_fp-3000b_negative_-- | fuji_fp-3000b_negative_early | fuji_fp_100c | fuji_ilford_delta_3200 | fuji_ilford_delta_3200_+ | fuji_ilford_delta_3200_++ | fuji_ilford_delta_3200_- | fuji_ilford_hp5 | fuji_ilford_hp5_+ | fuji_ilford_hp5_++ | fuji_ilford_hp5_- | fuji_neopan_1600 | fuji_neopan_1600_+ | fuji_neopan_1600_++ | fuji_neopan_1600_- | fuji_neopan_acros_100 | fuji_provia_100f | fuji_provia_400f | fuji_provia_400x | fuji_sensia_100 | fuji_superia_100 | fuji_superia_100_+ | fuji_superia_100_++ | fuji_superia_100_- | fuji_superia_1600 | fuji_superia_1600_+ | fuji_superia_1600_++ | fuji_superia_1600_- | fuji_superia_200 | fuji_superia_200_xpro | fuji_superia_400 | fuji_superia_400_+ | fuji_superia_400_++ | fuji_superia_400_- | fuji_superia_800 | fuji_superia_800_+ | fuji_superia_800_++ | fuji_superia_800_- | fuji_superia_hg_1600 | fuji_superia_reala_100 | fuji_superia_x-tra_800 | fuji_velvia_50 | fuji_xtrans_ii_astia_v2 | fuji_xtrans_ii_classic_chrome_v1 | fuji_xtrans_ii_pro_neg_hi_v2 | fuji_xtrans_ii_pro_neg_std_v2 | fuji_xtrans_ii_provia_v2 | fuji_xtrans_ii_velvia_v2 | generic_fuji_astia_100 | generic_fuji_provia_100 | generic_fuji_velvia_100 | generic_kodachrome_64 | generic_kodak_ektachrome_100_vs | golden | golden_bright | golden_fade | golden_mono | golden_vibrant | goldfx_bright_spring_breeze | goldfx_bright_summer_heat | goldfx_hot_summer_heat | goldfx_perfect_sunset_01min | goldfx_perfect_sunset_05min | goldfx_perfect_sunset_10min | goldfx_spring_breeze | goldfx_summer_heat | green_mono | hong_kong | ilford_delta_100 | ilford_delta_3200 | ilford_delta_400 | ilford_fp4_plus_125 | ilford_hp5_plus_400 | ilford_hps_800 | ilford_pan_f_plus_50 | ilford_xp2 | kodak2383_constlclip | kodak2383_constlmap | kodak2383_cuspclip | kodak2393_constlclip | kodak2393_constlmap | kodak2393_cuspclip | kodak_bw_400_cn | kodak_e-100_gx_ektachrome_100 | kodak_ektachrome_100_vs | kodak_elite_100_xpro | kodak_elite_chrome_200 | kodak_elite_chrome_400 | kodak_elite_color_200 | kodak_elite_color_400 | kodak_elite_extracolor_100 | kodak_hie_(hs_infra) | kodak_kodachrome_200 | kodak_kodachrome_25 | kodak_kodachrome_64 | kodak_portra_160 | kodak_portra_160_+ | kodak_portra_160_++ | kodak_portra_160_- | kodak_portra_160_nc | kodak_portra_160_nc_+ | kodak_portra_160_nc_++ | kodak_portra_160_nc_- | kodak_portra_160_vc | kodak_portra_160_vc_+ | kodak_portra_160_vc_++ | kodak_portra_160_vc_- | kodak_portra_400 | kodak_portra_400_+ | kodak_portra_400_++ | kodak_portra_400_- | kodak_portra_400_nc | kodak_portra_400_nc_+ | kodak_portra_400_nc_++ | kodak_portra_400_nc_- | kodak_portra_400_uc | kodak_portra_400_uc_+ | kodak_portra_400_uc_++ | kodak_portra_400_uc_- | kodak_portra_400_vc | kodak_portra_400_vc_+ | kodak_portra_400_vc_++ | kodak_portra_400_vc_- | kodak_portra_800 | kodak_portra_800_+ | kodak_portra_800_++ | kodak_portra_800_- | kodak_t-max_100 | kodak_t-max_3200 | kodak_t-max_400 | kodak_tmax_3200 | kodak_tmax_3200_+ | kodak_tmax_3200_++ | kodak_tmax_3200_- | kodak_tri-x_400 | kodak_tri-x_400_+ | kodak_tri-x_400_++ | kodak_tri-x_400_- | light_blown | lomo | lomography_redscale_100 | lomography_x-pro_slide_200 | mono_tinted | mute_shift | muted_fade | natural_vivid | nostalgic | orange_tone | pink_fade | polaroid_664 | polaroid_665 | polaroid_665_+ | polaroid_665_++ | polaroid_665_- | polaroid_665_-- | polaroid_665_negative | polaroid_665_negative_+ | polaroid_665_negative_- | polaroid_665_negative_hc | polaroid_667 | polaroid_669 | polaroid_669_+ | polaroid_669_++ | polaroid_669_+++ | polaroid_669_- | polaroid_669_-- | polaroid_669_cold | polaroid_669_cold_+ | polaroid_669_cold_- | polaroid_669_cold_-- | polaroid_672 | polaroid_690 | polaroid_690_+ | polaroid_690_++ | polaroid_690_- | polaroid_690_-- | polaroid_690_cold | polaroid_690_cold_+ | polaroid_690_cold_++ | polaroid_690_cold_- | polaroid_690_cold_-- | polaroid_690_warm | polaroid_690_warm_+ | polaroid_690_warm_++ | polaroid_690_warm_- | polaroid_690_warm_-- | polaroid_polachrome | polaroid_px-100uv+_cold | polaroid_px-100uv+_cold_+ | polaroid_px-100uv+_cold_++ | polaroid_px-100uv+_cold_+++ | polaroid_px-100uv+_cold_- | polaroid_px-100uv+_cold_-- | polaroid_px-100uv+_warm | polaroid_px-100uv+_warm_+ | polaroid_px-100uv+_warm_++ | polaroid_px-100uv+_warm_+++ | polaroid_px-100uv+_warm_- | polaroid_px-100uv+_warm_-- | polaroid_px-680 | polaroid_px-680_+ | polaroid_px-680_++ | polaroid_px-680_- | polaroid_px-680_-- | polaroid_px-680_cold | polaroid_px-680_cold_+ | polaroid_px-680_cold_++ | polaroid_px-680_cold_++_alt | polaroid_px-680_cold_- | polaroid_px-680_cold_-- | polaroid_px-680_warm | polaroid_px-680_warm_+ | polaroid_px-680_warm_++ | polaroid_px-680_warm_- | polaroid_px-680_warm_-- | polaroid_px-70 | polaroid_px-70_+ | polaroid_px-70_++ | polaroid_px-70_+++ | polaroid_px-70_- | polaroid_px-70_-- | polaroid_px-70_cold | polaroid_px-70_cold_+ | polaroid_px-70_cold_++ | polaroid_px-70_cold_- | polaroid_px-70_cold_-- | polaroid_px-70_warm | polaroid_px-70_warm_+ | polaroid_px-70_warm_++ | polaroid_px-70_warm_- | polaroid_px-70_warm_-- | polaroid_time_zero_(expired) | polaroid_time_zero_(expired)_+ | polaroid_time_zero_(expired)_++ | polaroid_time_zero_(expired)_- | polaroid_time_zero_(expired)_-- | polaroid_time_zero_(expired)_--- | polaroid_time_zero_(expired)_cold | polaroid_time_zero_(expired)_cold_- | polaroid_time_zero_(expired)_cold_-- | polaroid_time_zero_(expired)_cold_--- | purple | retro | rollei_ir_400 | rollei_ortho_25 | rollei_retro_100_tonal | rollei_retro_80s | rotate_muted | rotate_vibrant | rotated | rotated_crush | smooth_cromeish | smooth_fade | soft_fade | solarized_color | solarized_color2 | summer | summer_alt | sunny | sunny_alt | sunny_rich | sunny_warm | super_warm | super_warm_rich | sutro_fx | technicalfx_backlight_filter | vibrant | vibrant_alien | vibrant_contrast | vibrant_cromeish | vintage | vintage_alt | vintage_brighter | warm | warm_highlight | warm_yellow | zilverfx_b_w_solarization | zilverfx_infrared | zilverfx_vintage_b_w }. +#@cli clut : "clut_name",_resolution>0,_cut_and_round={ 0=no | 1=yes } +#@cli : Insert one of the 856 pre-defined CLUTs at the end of the image list.\n +#@cli : 'clut_name' can be { 2-strip-process | 60s | 60s_faded | 60s_faded_alt | action_magenta_01 | action_red_01 | \ +# adventure_1453 | agfa_apx_100 | agfa_apx_25 | agfa_precisa_100 | agfa_ultra_color_100 | agfa_vista_200 | \ +# agressive_highligjtes_recovery_5 | alberto_street | alien_green | amstragram | amstragram+ | \ +# analogfx_anno_1870_color | analogfx_old_style_i | analogfx_old_style_ii | analogfx_old_style_iii | \ +# analogfx_sepia_color | analogfx_soft_sepia_i | analogfx_soft_sepia_ii | anime | apocalypse_this_very_moment | \ +# aqua | aqua_and_orange_dark | arabica_12 | autumn | ava_614 | avalanche | azrael_93 | bboyz_2 | berlin_sky | \ +# black_and_white | black_star | blade_runner | bleach_bypass | bleachbypass_1 | bleachbypass_2 | bleachbypass_3 | \ +# bleachbypass_4 | bleech_bypass_green | bleech_bypass_yellow_01 | blue_cold_fade | blue_dark | blue_house | \ +# blue_ice | blue_mono | blue_shadows_01 | blues | bob_ford | bourbon_64 | bright_green_01 | bright_teal_orange | \ +# bright_warm | brightgreen | brownish | bw_1 | bw_10 | bw_2 | bw_3 | bw_4 | bw_5 | bw_6 | bw_7 | bw_8 | bw_9 | \ +# byers_11 | candlelight | caribe | chemical_168 | chrome_01 | cinema | cinema_2 | cinema_3 | cinema_4 | cinema_5 | \ +# cinema_noir | cinematic-1 | cinematic-10 | cinematic-2 | cinematic-3 | cinematic-4 | cinematic-5 | cinematic-6 | \ +# cinematic-7 | cinematic-8 | cinematic-9 | cinematic_01 | cinematic_02 | cinematic_03 | cinematic_for_flog | \ +# cinematic_lady_bird | cinematic_mexico | city_7 | classic_teal_and_orange | clayton_33 | clear_teal_fade | \ +# clouseau_54 | cobi_3 | coffee_44 | cold_clear_blue | cold_clear_blue_1 | cold_simplicity_2 | color_rich | \ +# colorful_0209 | colornegative | conflict_01 | contrail_35 | contrast_with_highlights_protection | \ +# contrasty_afternoon | contrasty_green | crispromance | crispwarm | crispwinter | cross_process_cp_130 | \ +# cross_process_cp_14 | cross_process_cp_15 | cross_process_cp_16 | cross_process_cp_18 | cross_process_cp_3 | \ +# cross_process_cp_4 | cross_process_cp_6 | crushin | cubicle_99 | d_o_1 | dark_blues_in_sunlight | dark_green_02 | \ +# dark_green_1 | dark_place_01 | date_39 | day_4nite | day_for_night | deep | deep_blue | deep_dark_warm | \ +# deep_high_contrast | deep_teal_fade | deep_warm_fade | delicatessen | denoiser_simple_40 | desert_gold_37 | \ +# dimension | directions_23 | django_25 | domingo_145 | dream_1 | dream_85 | drop_green_tint_14 | dropblues | \ +# earth_tone_boost | edgyember | elegance_38 | enchanted | eterna_for_flog | expired_69 | expired_fade | \ +# expired_polaroid | extreme | fade | fade_to_green | faded | faded_47 | faded_alt | faded_analog | faded_extreme | \ +# faded_green | faded_print | faded_retro_01 | faded_retro_02 | faded_vivid | fadedlook | fallcolors | \ +# faux_infrared | fgcinebasic | fgcinebright | fgcinecold | fgcinedrama | fgcinetealorange_1 | fgcinetealorange_2 | \ +# fgcinevibrant | fgcinewarm | film_0987 | film_9879 | film_high_contrast | film_print_01 | film_print_02 | filmic | \ +# flat_30 | flavin | foggynight | folger_50 | french_comedy | frosted | frostedbeachpicnic | fuji_160c | \ +# fuji_160c_+ | fuji_160c_++ | fuji_160c_- | fuji_3510_constlclip | fuji_3510_constlmap | fuji_3510_cuspclip | \ +# fuji_3513_constlclip | fuji_3513_constlmap | fuji_3513_cuspclip | fuji_400h | fuji_400h_+ | fuji_400h_++ | \ +# fuji_400h_- | fuji_800z | fuji_800z_+ | fuji_800z_++ | fuji_800z_- | fuji_astia_100_generic | fuji_astia_100f | \ +# fuji_fp-100c | fuji_fp-100c_+ | fuji_fp-100c_++ | fuji_fp-100c_+++ | fuji_fp-100c_++_alt | fuji_fp-100c_- | \ +# fuji_fp-100c_-- | fuji_fp-100c_alt | fuji_fp-100c_cool | fuji_fp-100c_cool_+ | fuji_fp-100c_cool_++ | \ +# fuji_fp-100c_cool_- | fuji_fp-100c_cool_-- | fuji_fp-100c_negative | fuji_fp-100c_negative_+ | \ +# fuji_fp-100c_negative_++ | fuji_fp-100c_negative_+++ | fuji_fp-100c_negative_++_alt | fuji_fp-100c_negative_- | \ +# fuji_fp-100c_negative_-- | fuji_fp-3000b | fuji_fp-3000b_+ | fuji_fp-3000b_++ | fuji_fp-3000b_+++ | \ +# fuji_fp-3000b_- | fuji_fp-3000b_-- | fuji_fp-3000b_hc | fuji_fp-3000b_negative | fuji_fp-3000b_negative_+ | \ +# fuji_fp-3000b_negative_++ | fuji_fp-3000b_negative_+++ | fuji_fp-3000b_negative_- | fuji_fp-3000b_negative_-- | \ +# fuji_fp-3000b_negative_early | fuji_fp_100c | fuji_hdr | fuji_neopan_1600 | fuji_neopan_1600_+ | \ +# fuji_neopan_1600_++ | fuji_neopan_1600_- | fuji_neopan_acros_100 | fuji_provia_100_generic | fuji_provia_100f | \ +# fuji_provia_400f | fuji_provia_400x | fuji_sensia_100 | fuji_superia_100 | fuji_superia_100_+ | \ +# fuji_superia_100_++ | fuji_superia_100_- | fuji_superia_1600 | fuji_superia_1600_+ | fuji_superia_1600_++ | \ +# fuji_superia_1600_- | fuji_superia_200 | fuji_superia_200_xpro | fuji_superia_400 | fuji_superia_400_+ | \ +# fuji_superia_400_++ | fuji_superia_400_- | fuji_superia_800 | fuji_superia_800_+ | fuji_superia_800_++ | \ +# fuji_superia_800_- | fuji_superia_hg_1600 | fuji_superia_reala_100 | fuji_superia_x-tra_800 | \ +# fuji_velvia_100_generic | fuji_velvia_50 | fuji_xtrans_iii_acros | fuji_xtrans_iii_acros+g | \ +# fuji_xtrans_iii_acros+r | fuji_xtrans_iii_acros+ye | fuji_xtrans_iii_astia | fuji_xtrans_iii_classic_chrome | \ +# fuji_xtrans_iii_mono | fuji_xtrans_iii_mono+g | fuji_xtrans_iii_mono+r | fuji_xtrans_iii_mono+ye | \ +# fuji_xtrans_iii_pro_neg_hi | fuji_xtrans_iii_pro_neg_std | fuji_xtrans_iii_provia | fuji_xtrans_iii_sepia | \ +# fuji_xtrans_iii_velvia | fusion_88 | futuristicbleak_1 | futuristicbleak_2 | futuristicbleak_3 | \ +# futuristicbleak_4 | going_for_a_walk | golden | golden_bright | golden_fade | golden_mono | \ +# golden_night_softner_43 | golden_sony_37 | golden_vibrant | goldengate | goldfx_bright_spring_breeze | \ +# goldfx_bright_summer_heat | goldfx_hot_summer_heat | goldfx_perfect_sunset_01min | goldfx_perfect_sunset_05min | \ +# goldfx_perfect_sunset_10min | goldfx_spring_breeze | goldfx_summer_heat | good_morning | green_15 | green_2025 | \ +# green_action | green_afternoon | green_blues | green_conflict | green_day_01 | green_day_02 | green_g_09 | \ +# green_indoor | green_light | green_mono | green_yellow | greenish_contrasty | greenish_fade | greenish_fade_1 | \ +# hackmanite | happyness_133 | hard_teal_orange | harsh_day | harsh_sunset | helios | herderite | heulandite | \ +# hiddenite | highlights_protection | hilutite | hlg_1_1 | hong_kong | horrorblue | howlite | hydracore | hyla_68 | \ +# hypersthene | hypnosis | hypressen | ilford_delta_100 | ilford_delta_3200 | ilford_delta_3200_+ | \ +# ilford_delta_3200_++ | ilford_delta_3200_- | ilford_delta_400 | ilford_fp_4_plus_125 | ilford_hp_5 | \ +# ilford_hp_5_+ | ilford_hp_5_++ | ilford_hp_5_- | ilford_hp_5_plus_400 | ilford_hps_800 | ilford_pan_f_plus_50 | \ +# ilford_xp_2 | indoor_blue | industrial_33 | instantc | justpeachy | k_tone_vintage_kodachrome | kh_1 | kh_10 | \ +# kh_2 | kh_3 | kh_4 | kh_5 | kh_6 | kh_7 | kh_8 | kh_9 | killstreak | kodak_2383_constlclip | kodak_2383_constlmap | \ +# kodak_2383_cuspclip | kodak_2393_constlclip | kodak_2393_constlmap | kodak_2393_cuspclip | kodak_bw_400_cn | \ +# kodak_e-100_gx_ektachrome_100 | kodak_ektachrome_100_vs | kodak_ektachrome_100_vs_generic | kodak_ektar_100 | \ +# kodak_elite_100_xpro | kodak_elite_chrome_200 | kodak_elite_chrome_400 | kodak_elite_color_200 | \ +# kodak_elite_color_400 | kodak_elite_extracolor_100 | kodak_hie_hs_infra | kodak_kodachrome_200 | \ +# kodak_kodachrome_25 | kodak_kodachrome_64 | kodak_kodachrome_64_generic | kodak_portra_160 | kodak_portra_160_+ | \ +# kodak_portra_160_++ | kodak_portra_160_- | kodak_portra_160_nc | kodak_portra_160_nc_+ | kodak_portra_160_nc_++ | \ +# kodak_portra_160_nc_- | kodak_portra_160_vc | kodak_portra_160_vc_+ | kodak_portra_160_vc_++ | \ +# kodak_portra_160_vc_- | kodak_portra_400 | kodak_portra_400_+ | kodak_portra_400_++ | kodak_portra_400_- | \ +# kodak_portra_400_nc | kodak_portra_400_nc_+ | kodak_portra_400_nc_++ | kodak_portra_400_nc_- | \ +# kodak_portra_400_uc | kodak_portra_400_uc_+ | kodak_portra_400_uc_++ | kodak_portra_400_uc_- | \ +# kodak_portra_400_vc | kodak_portra_400_vc_+ | kodak_portra_400_vc_++ | kodak_portra_400_vc_- | kodak_portra_800 | \ +# kodak_portra_800_+ | kodak_portra_800_++ | kodak_portra_800_- | kodak_portra_800_hc | kodak_t-max_100 | \ +# kodak_t-max_3200 | kodak_t-max_400 | kodak_tmax_3200 | kodak_tmax_3200_+ | kodak_tmax_3200_++ | kodak_tmax_3200_- | \ +# kodak_tmax_3200_alt | kodak_tri-x_400 | kodak_tri-x_400_+ | kodak_tri-x_400_++ | kodak_tri-x_400_- | \ +# kodak_tri-x_400_alt | korben_214 | landscape_1 | landscape_10 | landscape_2 | landscape_3 | landscape_4 | \ +# landscape_5 | landscape_6 | landscape_7 | landscape_8 | landscape_9 | lateafternoonwanderlust | latesunset | lc_1 | \ +# lc_10 | lc_2 | lc_3 | lc_4 | lc_5 | lc_6 | lc_7 | lc_8 | lc_9 | lenox_340 | life_giving_tree | light_blown | lomo | \ +# lomography_redscale_100 | lomography_x-pro_slide_200 | low_contrast_blue | low_key_01 | lucky_64 | \ +# lushgreensummer | magenta_day | magenta_day_01 | magenta_dream | magenta_yellow | magentacoffee | matrix | \ +# mckinnon_75 | memories | metropolis | milo_5 | minimalistcaffeination | modern_film | mono_tinted | monochrome_1 | \ +# monochrome_2 | moody_1 | moody_10 | moody_2 | moody_3 | moody_4 | moody_5 | moody_6 | moody_7 | moody_8 | moody_9 | \ +# moonlight | moonlight_01 | moonrise | morning_6 | morroco_16 | mostly_blue | moviz_1 | moviz_10 | moviz_11 | \ +# moviz_12 | moviz_13 | moviz_14 | moviz_15 | moviz_16 | moviz_17 | moviz_18 | moviz_19 | moviz_2 | moviz_20 | \ +# moviz_21 | moviz_22 | moviz_23 | moviz_24 | moviz_25 | moviz_26 | moviz_27 | moviz_28 | moviz_29 | moviz_3 | \ +# moviz_30 | moviz_31 | moviz_32 | moviz_33 | moviz_34 | moviz_35 | moviz_36 | moviz_37 | moviz_38 | moviz_39 | \ +# moviz_4 | moviz_40 | moviz_41 | moviz_42 | moviz_43 | moviz_44 | moviz_45 | moviz_46 | moviz_47 | moviz_48 | \ +# moviz_5 | moviz_6 | moviz_7 | moviz_8 | moviz_9 | mute_shift | muted_01 | muted_fade | mysticpurplesunset | nah | \ +# natural_vivid | nemesis | neon_770 | neutral_teal_orange | neutral_warm_fade | newspaper | night_01 | \ +# night_blade_4 | night_king_141 | night_spy | nightfromday | nostalgiahoney | nostalgic | nw-1 | nw-10 | nw-2 | \ +# nw-3 | nw-4 | nw-5 | nw-6 | nw-7 | nw-8 | nw-9 | old_west | once_upon_a_time | only_red | only_red_and_blue | \ +# operation_yellow | orange_dark_4 | orange_dark_7 | orange_dark_look | orange_tone | orange_underexposed | oranges | \ +# paladin | paladin_1875 | pasadena_21 | passing_by | pink_fade | pitaya_15 | polaroid_664 | polaroid_665 | \ +# polaroid_665_+ | polaroid_665_++ | polaroid_665_- | polaroid_665_-- | polaroid_665_negative | \ +# polaroid_665_negative_+ | polaroid_665_negative_- | polaroid_665_negative_hc | polaroid_667 | polaroid_669 | \ +# polaroid_669_+ | polaroid_669_++ | polaroid_669_+++ | polaroid_669_- | polaroid_669_-- | polaroid_669_cold | \ +# polaroid_669_cold_+ | polaroid_669_cold_- | polaroid_669_cold_-- | polaroid_672 | polaroid_690 | polaroid_690_+ | \ +# polaroid_690_++ | polaroid_690_- | polaroid_690_-- | polaroid_690_cold | polaroid_690_cold_+ | \ +# polaroid_690_cold_++ | polaroid_690_cold_- | polaroid_690_cold_-- | polaroid_690_warm | polaroid_690_warm_+ | \ +# polaroid_690_warm_++ | polaroid_690_warm_- | polaroid_690_warm_-- | polaroid_polachrome | polaroid_px-100uv+_cold | \ +# polaroid_px-100uv+_cold_+ | polaroid_px-100uv+_cold_++ | polaroid_px-100uv+_cold_+++ | polaroid_px-100uv+_cold_- | \ +# polaroid_px-100uv+_cold_-- | polaroid_px-100uv+_warm | polaroid_px-100uv+_warm_+ | polaroid_px-100uv+_warm_++ | \ +# polaroid_px-100uv+_warm_+++ | polaroid_px-100uv+_warm_- | polaroid_px-100uv+_warm_-- | polaroid_px-680 | \ +# polaroid_px-680_+ | polaroid_px-680_++ | polaroid_px-680_- | polaroid_px-680_-- | polaroid_px-680_cold | \ +# polaroid_px-680_cold_+ | polaroid_px-680_cold_++ | polaroid_px-680_cold_++_alt | polaroid_px-680_cold_- | \ +# polaroid_px-680_cold_-- | polaroid_px-680_warm | polaroid_px-680_warm_+ | polaroid_px-680_warm_++ | \ +# polaroid_px-680_warm_- | polaroid_px-680_warm_-- | polaroid_px-70 | polaroid_px-70_+ | polaroid_px-70_++ | \ +# polaroid_px-70_+++ | polaroid_px-70_- | polaroid_px-70_-- | polaroid_px-70_cold | polaroid_px-70_cold_+ | \ +# polaroid_px-70_cold_++ | polaroid_px-70_cold_- | polaroid_px-70_cold_-- | polaroid_px-70_warm | \ +# polaroid_px-70_warm_+ | polaroid_px-70_warm_++ | polaroid_px-70_warm_- | polaroid_px-70_warm_-- | \ +# polaroid_time_zero_expired | polaroid_time_zero_expired_+ | polaroid_time_zero_expired_++ | \ +# polaroid_time_zero_expired_- | polaroid_time_zero_expired_-- | polaroid_time_zero_expired_--- | \ +# polaroid_time_zero_expired_cold | polaroid_time_zero_expired_cold_- | polaroid_time_zero_expired_cold_-- | \ +# polaroid_time_zero_expired_cold_--- | portrait_1 | portrait_10 | portrait_2 | portrait_3 | portrait_4 | \ +# portrait_5 | portrait_6 | portrait_7 | portrait_8 | portrait_9 | progressen | protect_highlights_01 | \ +# prussian_blue | pseudogrey | purple | purple_2 | red_afternoon_01 | red_day_01 | red_dream_01 | redblueyellow | \ +# reds | reds_oranges_yellows | reeve_38 | remy_24 | rest_33 | retro | retro_brown_01 | retro_magenta_01 | \ +# retro_summer_3 | retro_yellow_01 | rollei_ir_400 | rollei_ortho_25 | rollei_retro_100_tonal | rollei_retro_80s | \ +# rotate_muted | rotate_vibrant | rotated | rotated_crush | saturated_blue | saving_private_damon | science_fiction | \ +# serenity | seringe_4 | serpent | seventies_magazine | shadow_king_39 | shine | skin_tones | smart_contrast | \ +# smokey | smooth_clear | smooth_cromeish | smooth_fade | smooth_green_orange | smooth_sailing | smooth_teal_orange | \ +# soft_fade | softwarming | solarized_color | solarized_color_2 | springmorning | sprocket_231 | spy_29 | street | \ +# studio_skin_tone_shaper | subtle_blue | subtle_green | subtle_yellow | summer | summer_alt | sunny | sunny_alt | \ +# sunny_rich | sunny_warm | super_warm | super_warm_rich | sutro_fx | sweet_bubblegum | sweet_gelatto | taiga | \ +# tarraco | teal_fade | teal_moonlight | tealmagentagold | tealorange | tealorange_1 | tealorange_2 | tealorange_3 | \ +# technicalfx_backlight_filter | teigen_28 | tensiongreen_1 | tensiongreen_2 | tensiongreen_3 | tensiongreen_4 | \ +# terra_4 | the_matrices | thriller_2 | toastedgarden | trent_18 | true_colors_8 | turkiest_42 | tweed_71 | \ +# ultra_water | undeniable | undeniable_2 | unknown | urban_cowboy | uzbek_bukhara | uzbek_marriage | \ +# uzbek_samarcande | velvetia | very_warm_greenish | vibrant | vibrant_alien | vibrant_contrast | vibrant_cromeish | \ +# victory | vintage | vintage_163 | vintage_alt | vintage_brighter | vintage_chrome | vintage_warmth_1 | vireo_37 | \ +# warm | warm_dark_contrasty | warm_fade | warm_fade_1 | warm_highlight | warm_neutral | warm_sunset_red | \ +# warm_teal | warm_vintage | warm_yellow | well_see | whiter_whites | winterlighthouse | wipe | wooden_gold_20 | \ +# yellow_55b | yellow_film_01 | yellowstone | you_can_do_it | zed_32 | zeke_39 | zilverfx_bw_solarization | \ +# zilverfx_infrared | zilverfx_vintage_bw } +#@cli : Default values: 'resolution=48' and 'cut_and_round=1'. #@cli : $ clut summer -clut : check "isval(${2=64}) && $2>0" - e[^-1] "Input CLUT with name '$1' and resolution $2." - v - l[] - if ${_path_rc}clut_"$1".cimgz i ${_path_rc}clut_"$1".cimgz fi - if {"!"$!" || w!=$2 || h!=$2 || d!=$2"} - if {narg($GMIC_SYSTEM_PATH)} g_path_unix=$GMIC_SYSTEM_PATH +clut : check "isnum(${2=48}) && $2>0 && isbool(${3=1})" + to_clutname "$1" name=${} l[] + e[^-1] "Input CLUT '"$name"' with resolution $2." + path_clut=${-path_cache} + if isfile(['{/${path_clut}clut_$name.cimgz}']) i ${path_clut}clut_$name.cimgz fi + if $!"!=1 || w<$2 || h<$2 || d<$2" # Decompression needed + rm + if narg($GMIC_SYSTEM_PATH) g_path_unix=$GMIC_SYSTEM_PATH else g_path_unix=/usr/lib/gimp/2.0/plug-ins/ fi - rm repeat 2 - if {!$>" && "(\ - isfile(${_path_rc}gmic_film_cluts.gmz)" || "\ - isfile(${-path_gimp}plug-ins/gmic_film_cluts.gmz)" || "\ - isfile(${-path_gimp}plug-ins/gmic_gimp_qt/gmic_film_cluts.gmz)" || "\ - isfile(${g_path_unix}gmic_film_cluts.gmz))} - if {isfile(${_path_rc}gmic_film_cluts.gmz)} i ${_path_rc}gmic_film_cluts.gmz - elif {isfile(${-path_gimp}plug-ins/gmic_film_cluts.gmz)} i ${-path_gimp}plug-ins/gmic_film_cluts.gmz - elif {isfile(${-path_gimp}plug-ins/gmic_gimp_qt/gmic_film_cluts.gmz)} i ${-path_gimp}plug-ins/gmic_gimp_qt/gmic_film_cluts.gmz - elif {isfile(${g_path_unix}gmic_film_cluts.gmz)} i ${g_path_unix}gmic_film_cluts.gmz - fi - else l[] i https://gmic.eu/gmic_film_cluts.gmz o ${_path_rc}gmic_film_cluts.gmz,uchar endl + path_test0=$path_clut + path_test1=$_path_rc + path_test2=${-path_gimp}plug-ins/ + path_test3=${-path_gimp}plug-ins/gmic_gimp_qt/ + path_test4=$g_path_unix + repeat 5 file_clut=${path_test$>}/gmic_cluts.gmz + l[] $file_clut onfail endl if $! break fi + done + if !$! # Download from G'MIC server + i https://gmic.eu/gmic_cluts.gmz o ${path_clut}gmic_cluts.gmz + fi + + k[${"nmd 1,"$name}] + if $!!=1 + rm i https://gmic.eu/gmic_cluts.gmz o ${path_clut}gmic_cluts.gmz # Try getting newest version of the CLUTs file + repeat $! if ['{$>,n}']==['$name'] k[$>] break fi done + if $!!=1 + error[0--5] "Command '$0': Unknown CLUT name '"$name"'." fi - repeat $! if {['{$>,n}']==['"$1"']} k[$>] break fi done - if {$!==1} break fi # CLUT found! - rm + fi + decompress_clut $2,$2,$2 + if $3 round c 0,255 to_rgb fi + o. ${path_clut}clut_$name.cimgz + elif "w>$2 || h>$2 || d>$2" r $2,$2,$2,3,2 # Downsize from higher resolution + fi + nm "[CLUT: "$name"]" k. + endl + +# [Internal] Use this command to 'clean' a .gmz file that represents CLUT keypoints. +# What it does is: +# +# - Standardize CLUT name. +# - Convert RGB CLUTs to Grayscale when possible. +# - Remove duplicates and sort by lexicographic order. +# - Display list of CLUTs to ease documentation update of command 'clut'. +# +clean_cluts : + e[^-1] "Clean CLUT dataset.\n" + round c 0,255 + + # Standardize names. + repeat $! l[$>] + nm={n} + + # Standardize names for 'Moviz'. + if "str = lowercase(['"$nm"*']); + find(str,'tpf_-_cinematica_')==0" l[] + if !narg($tpf) tpf=1 fi + ('moviz_$tpf') + tpf+=1 + nm={t} rm + endl fi + if "str = lowercase(['"$nm"*']); + find(str,'_-_standard-vk')>=0" l[] + if !narg($tpf) tpf=1 fi + ('moviz_$tpf') + tpf+=1 + nm={t} rm + endl fi + + # Standardize names for 'SmallHD MovieLook'. + if "str = lowercase(['"$nm"*']); + find(str,'_-_rec_709*')>=0" l[] + ('$nm') z. 0,{w-11} + nm={t} rm + endl fi + + # Standardize names for 'SmallHD MovieLook'. + if "str = lowercase(['"$nm"']); + find(str,'smallhd_movielook_')==0" l[] + ('$nm') z. 18,100% + replace_str "apocalypsethisverymoment","apocalypse_this_very_moment" + replace_str "bobford","bob_ford" + replace_str "lifegivingtree","life_giving_tree" + replace_str "savingprivatedamon","saving_private_damon" + replace_str "thematrices","the_matrices" + nm={t} rm + endl fi + + # Standardize names for 'Fuji XTrans III'. + if "str = lowercase(['"$nm"']); + find(str,'fuji_xtrans_iii')==0" l[] + ('$nm') + replace_str "_-_","_" nm={t} rm + endl fi + + # Standardize names for 'RawTherapee'. + if "str = lowercase(['"$nm"']); + find(str,'kodak')==0 || + find(str,'polaroid')==0 || + find(str,'fuji')==0 || + find(str,'ilford')==0" l[] + ({'$nm'},{'*'}) + replace_str " ","_" + replace_str "xp_2","xp2" + replace_str "hp_5","hp5" + repeat 8 n={1+$>} + replace_str "_"${n}"_+","_+" + replace_str "_"${n}"_-","_-" + replace_str "_"${n}"_alt","_alt" + replace_str "_"${n}"_Alt","_alt" + replace_str "_"${n}"*","*" done - if {!$!} v + error[0--4] "Command '$0': Unknown CLUT name '$1'." fi - decompress_clut $2,$2,$2 round - o. ${_path_rc}clut_$1.cimgz,uchar + = 0,0,100% nm={t} rm + endl fi + + to_clutname $nm nm=${} + + # Standardize names for 'PictureFX'. + if "str = lowercase(['"$nm"']); + find(str,'technicalfx')==0 || + find(str,'analogfx')==0 || + find(str,'goldfx')==0 || + find(str,'zilverfx')==0" l[] + ('$nm') + replace_str "-","_" nm={t} rm + endl fi + + # Other name changes. + l[] + ({'$nm'},{'*'}) + replace_str "_v_2*","*" + replace_str "_v_1*","*" + replace_str "_*","*" + replace_str "_b_w","_bw" + replace_str "&","" + replace_str "rec_709_-_","rec709_" + replace_str "s-log","slog" + replace_str "__","_" + replace_str "action_-_","action_" + = 0,0,100% nm={t} rm + endl + nm $nm + endl done + + # Convert RGB CLUTs to Grayscale when possible. + repeat $! l[$>] + if "ref(crop(#0,0,0,0,3,1,h,1,1),R); + ref(crop(#0,0,0,0,4,1,h,1,1),G); + ref(crop(#0,0,0,0,5,1,h,1,1),B); + R==G && G==B?1:0" + channels 0,3 + fi + endl done + + # Search for duplicates and sort. + p=0 for $p<$! + nm0={$p,n} + e[] "\r- Search duplicates for ["$p"] = '"$nm0"' " + q={$p+1} for $q<$! + nm={$q,n} + if ['$nm0']==['$nm'] + e[] " > Found duplicate ["$q"] -> Original 1x"{$p,h}", new 1x"{$q,h}"\n" + rv[$p,$q] rm[$q] + else q+=1 + fi + done + p+=1 + done + sort_list +,n + + # Display all clut names. + doc="#@cli clut : \"clut_name\",_resolution>0,_cut_and_round={ 0=no | 1=yes }\n"\ + "#@cli : Insert one of the "$!" pre-defined CLUTs at the end of the image list.\\n\n"\ + "#@cli : 'clut_name' can be {" sep="|" + nbc=28 + repeat $! l[$>] + if !$< sep="}" fi + str=" "{n}" "$sep + s_str={size(['$str'])} + nbc+=$s_str + if $nbc<118 + doc=${doc}${str} + else + doc=${doc}" \\\n#"${str} + nbc={1+$s_str} fi - nm "[CLUT: $1]" - endl v + + endl done + + doc=${doc}"\n"\ + "#@cli : Default values: 'resolution=48' and 'cut_and_round=1'.\n"\ + "#@cli : $ clut summer\n" + e[] "\n"$doc #@cli m : eq. to 'command'. : (+) @@ -1510,6 +2069,41 @@ #@cli : Default value: 'add_debug_info=1'. #@cli : $ image.jpg command "foo : mirror y deform $""1" +foo[0] 5 +foo[0] 15 +# compress_gmic +# Compress .gmic custom command files for compressing update files a little bit, +# by removing empty lines, and useless comments. +compress_gmic : + merge_multiline_comments + merge_multiline + eval " # Remove useless comments + p = 0; + while (p look for comment at line end + l = find(#-1,_'#',p); + l>=0 && l] w+={w} h={max($h,h)} d={max($d,d)} s={max($s,s)} endl done - if {$!==1} w -1,-1,0,0,-1,-1,{0,n}\ ($wx$hx$dx$s) - elif {$!==2} w -1,-1,0,0,-1,-1,{0,n},{n}\ ($wx$hx$dx$s) - else w -1,-1,0,0,-1,-1,{0,n},...,{n}\ ($wx$hx$dx$s) - fi - v + d v - w[] 0 v + +#@cli d2d : eq. to 'display2d'. +d2d : + _gmic_s="$?" v + _display2d 0,1 + +_d2d_core : + _gmic_s="$?" _d2d_core=1 v + _display2d $1,1 + +#@cli display2d +#@cli : Display selected 2d images in an interactive window. +#@cli : (eq. to 'd2d'). +#@cli : This command is used by default by command 'display' when displaying 2d images. +#@cli : If selected image is a volumetric image, each slice is displayed on a separate display +#@cli : window (up to 10 images can be displayed simultaneously this way), with synchronized moves. +#@cli : When interactive window is opened, the following actions are possible:\n +#@cli : - Left mouse button: Create an image selection and zoom into it. +#@cli : - Middle mouse button, or CTRL+left mouse button: Move image. +#@cli : - Mouse wheel or PADD+/-: Zoom in/out. +#@cli : - Arrow keys: Move image left/right/up/down. +#@cli : - CTRL + A: Enable/disable transparency (show/hide alpha channel). +#@cli : - CTRL + C: Decrease window size. +#@cli : - CTRL + D: Increase window size. +#@cli : - CTRL + F: Toggle fullscreen mode. +#@cli : - CTRL + N: Change normalization mode (can be 'none' | 'normal' | 'channel-by-channel'). +#@cli : - CTRL + O: Save a copy of the input image, as a numbered file 'gmic_xxxxxx.gmz'. +#@cli : - CTRL + R: Reset both window size and view. +#@cli : - CTRL + S: Save a screenshot of the current view, as a numbered file 'gmic_xxxxxx.png'. +#@cli : - CTRL + SPACE: Reset view. +#@cli : - CTRL + X: Show/hide axes. +#@cli : - CTRL + Z: Hold/release aspect ratio. +display2d : + _gmic_s="$?" v + _$0 0,1 + +# $1 = exit_on_single_click?, can be { 0=no | 1=yes }. +# $2 = default window normalization for display window #0. +_display2d : check "isbool(${1=0}) && isint(${2=1}) && $2>=0" + e[0--3] "Start interactive display of 2d image"$_gmic_s"." + m "_d2d_format : + if $""#>=8 u {_([$""*])[0,4]:\\ }\\ ...\\ {_([$""*])[$""#-4,4]:\\ } + else ('\"$""*\"') replace. {','},32 u {t} rm. + fi" + p + repeat $! l[$>] + ('{n}') if s=crop();find(s,_'.',size(s)-1,-1)>0 nm={-2,b}.{-2,x} else nm={-2,b} fi rm. + nm img + + if !w v - d v + break fi + if d>10 + error[0--6] "Command 'display2d': Input image has "{d}" slices, cannot manage more than 10 simultaneous views." + fi + is_multiview={d>1} + is_moderate_ratio={0,D=[w,h];max(D)/min(D)<6} + may_have_alpha={s==2||s>=4} + alpha_mode,axes_mode,fullscreen_mode,ratio_mode={s==1||s==3},1,0,$is_moderate_ratio + normalization_mode={{*}?!!{*,n}:$2} + posx,posy,sizx,sizy={0,[0,0,w,h]} + is_bottom_text,wait_event,mx,my,omb=0,1,-1,-1,0 + xsel0,ysel0,xsel1,ysel1,notification= + wnormalization0={*,n} + fontsize,fontsize_notif= + + if $is_multiview" && "!${-is_macos} + if d==2 if {*,u}/w>={*,v}/h wsiz0={r={*,u}*0.48;round([r,r*h/w])} else wsiz0={r={*,v}*0.40;round([r*w/h,r])} fi + elif d<=4 wsiz0=${fitscreen\ .,,45%} + else wsiz0=${fitscreen\ .,,30%} + fi + wsiz0=${fitscreen\ $wsiz0,1,,90%} + else wsiz0=${fitscreen\ .} + fi + + if $is_multiview + if narg($_d2d_names) l[] $_d2d_names repeat $! wname$>={$>,t} done rm endl fi + com_iskey,com_flushkey,com_isvisible,com_isresizeed,com_idisp,sep= + repeat {img,d} + if narg($_d2d_names) w$>[] {{*$>,w}?[-1,-1]:[$wsiz0]},0,${wname$>}" ("{w}x{h}x{d}x{s}")" + else w$>[] {{*$>,w}?[-1,-1]:[$wsiz0]},0,$nm" ("{w}x{h}x{d}x{s}")-#"$> + fi + com_iskey.=$sep"{*"$>",$""1}" + com_flushkey.=$sep"{*"$>",-$""1}" + com_isvisible.=$sep"{*"$>"}" + com_isresized.=$sep"{*"$>",r}" + com_idisp.=$sep"{*"$>",x}" + sep=, + done + m "iskey : u {max("$com_iskey")}"\n\ + "flushkey : skip "$com_flushkey\n\ + "isvisible : u {min("$com_isvisible")}"\n\ + "isresized : u {max("$com_isresized")}"\n\ + "idisp : u {argmax("$com_idisp")}" + + # Auto-arrange display window layout in multi-view mode. + if !${-is_macos} + ww,wh={[$wsiz0]+[8,40]} + if d==2 + if {*,u}/$ww>{*,v}/$wh # Horizontal alignment + ox,oy={round([max(0,{*,u}-2*$ww),max(0,{*,v}-$wh)]/2)} + w0[] -1,-1,-1,-1,$ox,$oy + w1[] -1,-1,-1,-1,{$ox+$ww},$oy + else # Vertical alignment + ox,oy={round([{*,u}-$ww,{*,v}-2*$wh]/2)} + w0[] -1,-1,-1,-1,$ox,$oy + w1[] -1,-1,-1,-1,$ox,{$oy+$wh} + fi + elif d<=4 + ox,oy={round([max(0,{*,u}-2*$ww),max(0,{*,v}-2*$wh)]/2)} + ww,wh+=$ox,$oy + w0[] -1,-1,-1,-1,$ox,$oy + w1[] -1,-1,-1,-1,$ww,$oy + w2[] -1,-1,-1,-1,$ox,$wh + if d==4 w3[] -1,-1,-1,-1,$ww,$wh fi + else + ox,oy={round([max(0,{*,u}-3*$ww),max(0,{*,v}-(d>6?3:2)*$wh)]/2)} + ww2,wh2={2*[$ww,$wh]+[$ox,$oy]} + ww,wh+=$ox,$oy + w0[] -1,-1,-1,-1,$ox,$oy + w1[] -1,-1,-1,-1,$ww,$oy + w2[] -1,-1,-1,-1,$ww2,$oy + w3[] -1,-1,-1,-1,$ox,$wh + w4[] -1,-1,-1,-1,$ww,$wh + if d>5 w5[] -1,-1,-1,-1,$ww2,$wh fi + if d>6 w6[] -1,-1,-1,-1,$ox,$wh2 fi + if d>7 w7[] -1,-1,-1,-1,$ww,$wh2 fi + if d>8 w8[] -1,-1,-1,-1,$ww2,$wh2 fi + fi + fi + + else + w[] {{*,w}?[-1,-1]:[$wsiz0]},0,$nm" ("{w}x{h}x{d}x{s}")" + m "iskey : u {*,$""1}"\n\ + "flushkey : skip {*,-$""1}"\n\ + "isvisible : u {*}"\n\ + "isresized : u {*,r}"\n\ + "idisp : u 0" + fi + + repeat {img,d} cursor[$>] 0 done + xin0,yin0,xin1,yin1=0,0,{0,[w,h]} + if isnan(ia)" || "isinf(im)" || "isinf(iM) # Detect if image has nan or inf values, and find bounding box + eval[0] "* + begin(x0 = w; y0 = h; x1 = y1 = -1); + isinf(i) || isnan(i)?critical( + xx1?(x1 = x); + y>y1?(y1 = y); + ); + end(run('xin0,yin0,xin1,yin1=',x0,',',y0,',',x1,',',y1))" + fi + + # Start event loop. + for ${-isvisible}" && "!${"iskey ESC"}" && "!((${"iskey CTRLLEFT"}" || "${"iskey CTRLRIGHT"})" && "${"iskey W"}) + + # Correct aspect ratio while centering image. + if $ratio_mode + nposx,nposy,nsizx,nsizy=$posx,$posy,$sizx,$sizy + repeat 2 + if {*,w}/$sizx<{*,h}/$sizy + nposy,nsizy={nsizy=round($nsizx*{*,h}/{*,w});[$nposy-(nsizy-$nsizy)/2,nsizy]} + else + nposx,nsizx={nsizx=round($nsizy*{*,w}/{*,h});[$nposx-(nsizx-$nsizx)/2,nsizx]} + fi + if $<" && "$nsizx>w#0" && "$nsizy>h#0 nposx,nposy,nsizx,nsizy={[0,0,w#0,h#0]} fi + done + if [$nposx,$nposy,$nsizx,$nsizy]!=[$posx,$posy,$sizx,$sizy] + posx,posy,sizx,sizy=$nposx,$nposy,$nsizx,$nsizy + rmn baseview + fi + fi + + # Generate baseview. + if !narg($baseview) + + # Get view corresponding to position and zoom factor. + ($posx,{$posx+$sizx}) ($posy;{$posy+$sizy}) r[-2,-1] 2,2 a[-2,-1] c + r. {[{*,w,h}]+1},1,2,3 z. 0,0,{[w,h]-2} round. 1,-1 ind_warp={$!-1} + +channels[0] {0,[0,min(3,s-1)]} warp. ..,0,0,1 + if $is_multiview repeat {img,d-1} +slices[img] {1+$>} warp. [$ind_warp],0,0,1 done a[-{img,d}--1] z fi + rm.. + + if s>($alpha_mode?4:3) channels. 0,{$alpha_mode?3:2} fi # Discard useless channels + if (($xin0>=floor($posx)" && "$xin0=floor($posx)" && "$xin1<=floor($posx+$sizx)))" && "\ + (($yin0>=floor($posy)" && "$yin0=floor($posy)" && "$yin1<=floor($posy+$sizy))) + if $normalization_mode im,iM={0,[im,iM]} else im,iM=0,255 fi + f. "isnan(i)?"$im":isinf(i)?(i<0?"$im":"$iM"):i" + fi + + # Normalize view. + if $normalization_mode==1 + sh. 0,{s-($alpha_mode" && "$may_have_alpha?2:1)} + if $is_multiview repeat {img,d} +slices. $> n. 0,255 j.. .,0,0,$> rm. done else n. 0,255 fi + rm. + elif $normalization_mode==2 + sh. 0,{s-($alpha_mode" && "$may_have_alpha?2:1)} + if $is_multiview repeat d*s z,c={[$>%d,int($>/d)]} sh. $z,$z,$c n. 0,255 rm. done + else repeat s sh. $> n. 0,255 rm. done + fi + fi + if $posx<0" || "$posy<0" || "$posx+$sizx>=w#0" || "$posy+$sizy>=h#0 + 100%,100% + rectangle. {A=-[$posx,$posy]*[w,h]/[$sizx,$sizy];\ + B=A+[w#0,h#0]*[w,h]/[$sizx,$sizy]-1;\ + [ceil(A),floor(B)]},1,1 + *[-2,-1] + fi + + # Add alpha channel if necessary. + if $alpha_mode + coords={A=-[$posx,$posy]*[w,h]/[$sizx,$sizy];\ + B=A+[w#0,h#0]*[w,h]/[$sizx,$sizy]-1;\ + [ceil(A),floor(B)]} + if !$may_have_alpha # Alpha mode without alpha channel -> Add alpha channel + 100%,100%,1,1,64 rectangle. $coords,1,255 r. 100%,100%,.. a[-2,-1] c + else # Alpha mode with alpha channel + sh. 100% 100%,100%,1,1,64 rectangle. $coords,1,0 r. 100%,100%,.. +[-2,-1] rm. + fi + fi + + # Render image with transparency pattern. + if $alpha_mode + (128,160;160,128) r. 32,32,1,{-2,s-1} r. ..,..,..,100%,0,2,0.5,0.5 sh.. 100% j.. ...,0,0,0,0,1,.,255 rm[-3,-1] + elif s==1 r. 100%,100%,100%,3 + elif s==2 r. 100%,100%,100%,3,0 + fi + nm. baseview + rmn view + fi + + # Manage notifications. + if narg($notification) + wait_event=0 + if !isnum($notification) # Create notification gfx + rmn notification_gfx + ofs,fs={narg($fontsize_notif)?0$fontsize_notif:32} + do + 0 t. {``$notification},0,0,$fs,1,255 + if narg($fontsize_notif) break + elif {baseview,"(w#-1>0.7*w || h#-1>0.25*h) && "$fs>13" && "$ofs>=$fs} + ofs,fs=$fs,{max(13,round($fs/1.25))} rm. + elif {baseview,"w#-1<0.3*w && h#-1<0.25*h && "$fs<64" && "$ofs<=$fs} + ofs,fs=$fs,{min(64,round($fs*1.25))} rm. + else + fontsize_notif=$fs break + fi + while 1 + + r. {[w+12,h+8]},1,1,0,0,0.5,0.5 rectangle. 0,0,100%,100%,1,0xFFFFFFFF,255 to_rgb. + nm. notification_gfx + notification=$| + else + if $|>$notification+1 rm[notification_gfx] wait_event=1 notification= fi + rmn view + fi + fi + + # Generate view. + if !narg($view) + [baseview] + if $mx>=0 + posmx,posmy={floor([$posx,$posy]+[$mx,$my]*[$sizx,$sizy]/[{*,w,h}])} + is_selection_a_point={[0$xsel0,0$ysel0]==[0$xsel1,0$ysel1]} + + if narg($xsel0)" && "!$is_selection_a_point + dselx,dsely={[$xsel1-$xsel0,$ysel1-$ysel0]} + ofs,fs={narg($fontsize)?0$fontsize:32} + do + 0 t. " Box ( "{``{[min($xsel0,$xsel1),min($ysel0,$ysel1)]}}" ) - "\ + "( "{``{[max($xsel0,$xsel1),max($ysel0,$ysel1)]}}" ) \n"\ + " Size = ( "{``{abs([$dselx,$dsely]+1)}}" ), "\ + "Length = "{_norm($dselx,$dsely)}" \n"\ + " Angle = "{_atan2($dsely,$dselx)*180/pi}"\260 ",1,0,$fs,1,1 + if narg($fontsize) break + elif {baseview,"(w#-1>0.7*w || h#-1>0.45*h) && "$fs>13" && "$ofs>=$fs} + ofs,fs=$fs,{max(13,round($fs/1.25))} rm. + elif {baseview,"w#-1<0.3*w && h#-1<0.45*h && "$fs<64" && "$ofs<=$fs} + ofs,fs=$fs,{min(64,round($fs*1.25))} rm. + else + fontsize=$fs break + fi + while 1 + n. 0,255 +dilate. 3 *. -1 n. 0,80 +[-2,-1] r. 100%,100%,..,.. + j.. .,0,$is_bottom_text~,0,0,0.85 rm. + fi + + if $mx>=0 + if $posmx>=0" && "$posmx=0" && "$posmy);(s>=1" || "s<=4)" && "min(isint(P))" && "min(P)>=0" && "max(P)<=255} + hexstr="= \#"\ + {img,`"digit(x) = (x<10?_'0' + x:_'A' + x - 10);\ + P = I("$posmx,$posmy,$>");\ + [ digit(P[0]>>4),digit(P[0]&15),\ + s<2?0:digit(P[1]>>4),s<2?0:digit(P[1]&15),\ + s<3?0:digit(P[2]>>4),s<3?0:digit(P[2]&15),\ + s<4?0:digit(P[3]>>4),s<4?0:digit(P[3]&15) ]"`}" " + else hexstr= fi + ofs,fs={narg($fontsize)?0$fontsize:32} + do + 0 t. " Point ( "$posmx","$posmy" ) = [ "${_d2d_format\ {img,_I($posmx,$posmy,$>)}}" ] "$hexstr,\ + 1,0,$fs,1,1 + if narg($fontsize) break + elif {baseview,"(w#-1>0.7*w || h#-1>0.15*h) && "$fs>13" && "$ofs>=$fs} + _ofs,fs=$fs,{max(13,round($fs/1.25))} rm. + elif {baseview,"w#-1<0.3*w && h#-1<0.15*h && "$fs<64" && "$ofs<=$fs} + ofs,fs=$fs,{min(64,round($fs*1.25))} rm. + else + fontsize=$fs break + fi + while 1 + + n. 0,255 +dilate. 3 *. -1 n. 0,80 +[-2,-1] r. 100%,100%,1,.. + j.. .,0,$is_bottom_text~,$>,0,0.85 rm. + done + fi + x0,y0,x1,y1={[round([$posmx-$posx,$posmy-$posy]*[{*,w,h}]/[$sizx,$sizy]),\ + round([$posmx-$posx+1,$posmy-$posy+1]*[{*,w,h}]/[$sizx,$sizy])-1]} + if $x1-$x0>=8" && "$y1-$y0>=8 # Draw pixel contour when zoomed-in + repeat d==1?1:d*s if d==1 sh. else sh. {z=$>%d;[z,z,int($>/d)]} fi + rectangle. $x0,$y0,$x1,$y1,1,0x55555555,0 + rectangle. $x0,$y0,$x1,$y1,1,0xAAAAAAAA,255 + rm. + done + fi + fi + if $axes_mode # Draw horizontal/vertical axes + repeat d==1?1:d*s if d==1 sh. else sh. {z=$>%d;[z,z,int($>/d)]} fi + line. $mx,0,$mx,100%,0.5,0xFF00FF00,255 + line. $mx,0,$mx,100%,0.5,0x00FF00FF,0 + line. 0,$my,100%,$my,0.5,0xFF00FF00,255 + line. 0,$my,100%,$my,0.5,0x00FF00FF,0 + rm. + done + fi + fi + + if narg($xsel0) # Draw rectangular selection + x0,y0,x1,y1={xm=min($xsel0,$xsel1);xM=max($xsel0,$xsel1);\ + ym=min($ysel0,$ysel1);yM=max($ysel0,$ysel1);\ + [[xm-$posx,ym-$posy]*[{*,w,h}]/[$sizx,$sizy],\ + [xM+1-$posx,yM+1-$posy]*[{*,w,h}]/[$sizx,$sizy]-1]} + repeat d==1?1:d*s if d==1 sh. else sh. {z=$>%d;[z,z,int($>/d)]} fi + rectangle. $x0,$y0,$x1,$y1,0.2,0 + rectangle. $x0,$y0,$x1,$y1,0.9,0x55555555,0 + rectangle. $x0,$y0,$x1,$y1,0.9,0xAAAAAAAA,255 + rm. + done + if $xsel0>$xsel1 x0,x1=$x1,$x0 fi + if $ysel0>$ysel1 y0,y1=$y1,$y0 fi + if $xsel0!=$xsel1" && "$ysel0!=$ysel1 + x0,y0,x1,y1={[(0.5+[$xsel0-$posx,$ysel0-$posy])*[{*,w,h}]/[$sizx,$sizy],\ + (0.5+[$xsel1-$posx,$ysel1-$posy])*[{*,w,h}]/[$sizx,$sizy]]} + repeat d==1?1:d*s if d==1 sh. else sh. {z=$>%d;[z,z,int($>/d)]} fi + line. $x0,$y0,$x1,$y1,0.9,0x33333333,0 + line. $x0,$y0,$x1,$y1,0.9,0xCCCCCCCC,255 + rm. + done + fi + fi + fi + + if $notification_gfx + +r[notification_gfx] 100%,100%,. j.. .,{[w#-2-w-4,4]},0,0,{sqrt(max(0,1-($|-$notification)))} rm. + fi + + nm. view + if $is_multiview repeat d +slices[view] $> w$>. rm. done else w. fi + fi + + # Manage user events. + if $wait_event wait else wait 40 fi + idisp=${-idisp} # Index of 'active' display window + wait_event=1 + + old_mx,old_my=$mx,$my + nposx,nposy,nsizx,nsizy=$posx,$posy,$sizx,$sizy + is_CTRL,mb,mx,my,mo={${"iskey CTRLLEFT"}" || "${"iskey CTRLRIGHT"}},{*$idisp,b,x,y,-o} + + # Test end of pan shift. + if !($mb&4)" && "!($is_CTRL" && "($mb&1)) pan_mx,pan_my,pan_posx,pan_posy= fi + + # Test if text must be displayed at the bottom. + if {view,$my<0" || "$my>=h-16} is_bottom_text=0 + elif $my<16 is_bottom_text=1 + fi + + # Events related to window resizing. + if ${-isresized} # One of the display windows has been resized + repeat {img,d},w if {*$w,r} + w$w[] {*$w,d,e} + if $is_multiview repeat {img,d} w$>[] {*$w,w,h} done fi + if $nsizx>w#0" && "$nsizy>h#0 nposx,nposy,nsizx,nsizy={[0,0,w#0,h#0]} fi + break + fi done + fontsize,fontsize_notif= + rmn baseview + elif $is_CTRL" && "${"iskey D"}" && "{*$idisp,d}<{*$idisp,u}" && "{*$idisp,e}<{*$idisp,v} # Increase window size + w$idisp[] {round([{*$idisp,w,h}]*1.25)} + if $is_multiview repeat {img,d} w$>[] {*$idisp,w,h} done fi + notification="Increase Window Size" + fontsize,fontsize_notif= + flushkey D rmn baseview + elif $is_CTRL" && "${"iskey C"}" && "{*$idisp,d}>64" && "{*$idisp,e}>64 # Decrease window size + w$idisp[] {round([{*$idisp,w,h}]/1.25)} + if $is_multiview repeat {img,d} w$>[] {*$idisp,w,h} done fi + notification="Decrease Window Size" + fontsize,fontsize_notif= + flushkey C rmn baseview + elif $is_CTRL" && "${"iskey R"} # Reset window size (and view) + nposx,nposy,nsizx,nsizy={0,[0,0,w,h]} + repeat {img,d} w$>[] $wsiz0 done + notification="Reset Window Size" + fontsize,fontsize_notif= + flushkey R rmn baseview + fi + + # Events related to image selection. + if !$is_CTRL" && "$mb&1" && "$mx>0 + xsel,ysel={X=[$nposx,$nposy]+[$mx,$my]*[$nsizx,$nsizy]/[{*,w,h}];\ + floor([max(0,min(X[0],w#0-1)),max(0,min(X[1],h#0-1))])} + if !narg($xsel0)" && "!($omb&1) xsel0,ysel0,xsel1,ysel1=$xsel,$ysel,$xsel,$ysel + elif narg($xsel0) xsel1,ysel1=$xsel,$ysel + fi + if $mx<=16 nposx-={$nsizx/64} wait_event=0 xzoom,yzoom= + elif $mx>={*,w}-17 nposx+={$nsizx/64} wait_event=0 xzoom,yzoom= + fi + if $my<=16 nposy-={$nsizy/64} wait_event=0 xzoom,yzoom= + elif $my>{*,h}-17 nposy+={$nsizx/64} wait_event=0 xzoom,yzoom= + fi + wait_event=0 + rmn view + elif !($mb&1) + if narg($xsel0) + if [$xsel0,$ysel0]==[$xsel1,$ysel1] # One px selection -> reset view or exit. + if $1" && "$nsizx>=w#0" && "$nsizy>=h#0 break fi + nposx,nposy,nsizx,nsizy={0,[0,0,w,h]} + else # Otherwise, zoom in + nposx,nposy,nsizx,nsizy={[min($xsel0,$xsel1),min($ysel0,$ysel1),abs([$xsel1-$xsel0,$ysel1-$ysel0])+1]} + fi + xzoom,yzoom= mb={$mb&6} + rmn view + fi + xsel0,ysel0,xsel1,ysel1= + fi + + # Events related to image displacement and mode changes. + if ${"iskey ARROWLEFT"} nposx-={$nsizx/($is_CTRL?4:16)} xzoom,yzoom= # Go left + elif ${"iskey ARROWRIGHT"} nposx+={$nsizx/($is_CTRL?4:16)} xzoom,yzoom= # Go right + elif ${"iskey ARROWUP"} nposy-={$nsizy/($is_CTRL?4:16)} xzoom,yzoom= # Go up + elif ${"iskey ARROWDOWN"} nposy+={$nsizy/($is_CTRL?4:16)} xzoom,yzoom= # Go down + elif $is_CTRL" && "${"iskey O"} # Save copy + n=0 do filename gmic.gmz,$n n+=1 while isfile(['{/${}}']) + if $is_multiview +slices[img] $idisp o. ${} rm. else o[img] ${} fi + notification="Save Copy:\n"${} + flushkey O + elif $is_CTRL" && "${"iskey S"} # Save screenshot + n=0 do filename gmic.png,$n n+=1 while isfile(['{/${}}']) + if $is_multiview +slices[baseview] $idisp o. ${} rm. else o[baseview] ${} fi + notification="Save Screenshot:\n"${} + flushkey S + elif $is_CTRL" && "${"iskey SPACE"} # Center view + nposx,nposy,nsizx,nsizy={0,[0,0,w,h]} + notification="Center View" + flushkey SPACE + elif $is_CTRL" && "${"iskey N"} # Change normalization mode + normalization_mode={($normalization_mode+1)%3} + notification=${"s0=Disable s1=Enable s2=\"Enable C.by.C\" u ${s"$normalization_mode"}"}" Normalization" + flushkey N rmn baseview + elif $is_CTRL" && "${"iskey A"} # Toggle alpha mode + alpha_mode={!$alpha_mode} + notification=${"s0=Disable s1=Enable u ${s"$alpha_mode"}"}" Alpha" + flushkey A rmn baseview + elif $is_CTRL" && "${"iskey F"} # Toggle fullscreen mode + fullscreen_mode={!$fullscreen_mode} + if $fullscreen_mode + fullscreen_wsize={*,w,h} fullscreen_params=$nposx,$nposy,$nsizx,$nsizy + w[] {*,u,v},0,1 + else + nposx,nposy,nsizx,nsizy=$fullscreen_params + w[] $fullscreen_wsize,0,0 + fi + repeat {img,d} cursor[$>] {!$axes_mode} done + notification=${"s0=Disable s1=Enable u ${s"$fullscreen_mode"}"}" Fullscreen" + flushkey F rmn baseview + elif $is_CTRL" && "${"iskey X"} # Toggle axes mode + repeat {img,d} cursor[$>] $axes_mode done axes_mode={!$axes_mode} + notification=${"s0=Hide s1=Show u ${s"$axes_mode"}"}" Axes" + flushkey X rmn view + elif $is_CTRL" && "${"iskey Z"}" && "$is_moderate_ratio # Toggle aspect-ratio mode + ratio_mode={!$ratio_mode} + notification=${"s0=Release s1=Hold u ${s"$ratio_mode"}"}" Aspect Ratio" + if !$ratio_mode nposx,nposy,nsizx,nsizy={0,[0,0,w,h]} fi + flushkey Z rmn baseview + elif $mx>=0" && "($mb&4" || "($is_CTRL" && "$mb&1)) # Pan (middle mouse button) + if !narg($pan_mx) pan_mx,pan_my,pan_posx,pan_posy=$mx,$my,$posx,$posy fi + nposx,nposy={shiftx=($mx-$pan_mx)*$nsizx/{*,w};\ + shifty=($my-$pan_my)*$nsizy/{*,h};\ + [$pan_posx-shiftx,$pan_posy-shifty]} + xzoom,yzoom= + elif ${"iskey PADSUB"}" || "($mx>=0" && "$mo<0) # Zoom out + if $nsizx>=w#0" && "$nsizy>=h#0 + nposx,nposy,nsizx,nsizy={[$nposx/2,$nposy/2,w#0,h#0]} + else + if !narg($xzoom) + xzoom,yzoom={X=$mx<0?[$nposx,$nposy]+[$nsizx,$nsizy]/2:\ + [$nposx,$nposy]+[$mx,$my]*[$nsizx,$nsizy]/[{*,w,h}];\ + [max(0,min(X[0],w#0-1)),max(0,min(X[1],h#0-1))]} + fi + nposx,nposy,nsizx,nsizy={[[$xzoom,$yzoom]+[$nposx-$xzoom,$nposy-$yzoom]/0.75,\ + min(w#0,round($nsizx/0.75)),\ + min(h#0,round($nsizy/0.75))]} + if $nsizx>w#0" && "$nsizy>h#0 nsizx,nsizy={[w#0,h#0]} fi + fi + elif ($nsizx>2" || "$nsizy>2)" && "(${"iskey PADADD"}" || "($mx>=0" && "$mo>0)) # Zoom in + xzoom,yzoom={X=$mx<0?[$nposx,$nposy]+[$nsizx,$nsizy]/2:\ + [$nposx,$nposy]+[$mx,$my]*[$nsizx,$nsizy]/[{*,w,h}];\ + [max(0,min(X[0],w#0-1)),max(0,min(X[1],h#0-1))]} + nposx,nposy,nsizx,nsizy={[[$xzoom,$yzoom]+0.75*[$nposx-$xzoom,$nposy-$yzoom],round(0.75*[$nsizx,$nsizy])]} + fi + + # Constrain image displacement. + if $nposx>=w#0-0.5*$nsizx nposx={w#0-1-0.5*$nsizx} + elif $nposx<=-0.5*$nsizx nposx={1-0.5*$nsizx} + fi + if $nposy>=h#0-0.5*$nsizy nposy={h#0-1-0.5*$nsizy} + elif $nposy<=-0.5*$nsizy nposy={1-0.5*$nsizy} + fi + + if [$nposx,$nposy,$nsizx,$nsizy]!=[$posx,$posy,$sizx,$sizy] + posx,posy,sizx,sizy=$nposx,$nposy,$nsizx,$nsizy + rmn baseview + fi + if [$mx,$my]!=[$old_mx,$old_my] rmn view fi + omb=$mb + + done + k[0] + if narg($_d2d_core) w[] -1,-1,$wnormalization0 + else + if $is_multiview repeat d w$>[] 0 done else w[] 0 fi + fi + nm $nm um iskey,flushkey,isvisible,isresized,idisp endl done + um _d2d_format v -1 d[] -#@cli d3d : eq. to 'display3d'. : (+) +#@cli d3d : eq. to 'display3d'. +d3d : skip "${1=},${2=0}" + l[] is_image_arg=${"is_image_arg $1"} is_arg={$is_image_arg" || isnum($1)"} onfail is_arg=0 endl + if $is_arg arg=$is_image_arg,$2 if $is_image_arg pass$1 1 _d3d_wh={[w,h]} store. _d3d_background fi + else arg=0,0 noarg fi + v + _display3d $arg -#@cli display3d : _[background_image],_exit_on_anykey={ 0 | 1 } : _exit_on_anykey={ 0 | 1 } : (+) +#@cli display3d : _[background_image],_exit_on_anykey={ 0 | 1 } : _exit_on_anykey={ 0 | 1 } #@cli : Display selected 3D objects in an interactive viewer (use the instant display window [0] if opened). #@cli : (eq. to 'd3d'). #@cli : Default values: '[background_image]=(default)' and 'exit_on_anykey=0'. +display3d : skip "${1=},${2=0}" + l[] is_image_arg=${"is_image_arg $1"} is_arg={$is_image_arg" || isnum($1)"} onfail is_arg=0 endl + if $is_arg arg=$is_image_arg,$2 if $is_image_arg pass$1 1 _d3d_wh={[w,h]} store. _d3d_background fi + else arg=0,0 noarg fi + v + _$0 $arg + +# $1 = is_user_background? +# $2 = exit_on_any_key? +_display3d : + is_user_background,exit_on_anykey=$1,$2 + if !$! e[0--3] "Display 3D object []." return fi + + repeat $! l[$>] + l. check3d 0 + onfail l[] ({'${}'}) s +,{'"'check3d': "'} k. msg={t} rm endl error[] "Command 'display3d': "$msg + endl + nm={n} nbv,nbp={f2ui(i[6,2])} + e[0--5] "Display 3D object ["{arg(1+$>,$[])}"] = '"$nm"' ("$nbv" vertices, "$nbp" primitives)." + + # Init display window and variables. + disp_title=$nm" ("$nbv" vertices, "$nbp" primitives)" + if !{*} + if narg($_d3d_wh) w[] ${fitscreen\ $_d3d_wh,1},0,$disp_title + else w[] {0.7*[{*,u,v}]},0,$disp_title + fi + else disp_normalization={*,n} w[] -1,-1,0,$disp_title fi + disp_size0={*,w,h} + + (1,0,0,0;0,1,0,0;0,0,1,0) store. pose3d + posx,posy,zoomfactor=50,50,1 + is_fullscreen,is_zbuffer,is_axes3d,is_outline,is_boundingbox,is_animate,is_outvideo={*,f},1,1,0,0,0,0 + mode_render=4 + mode_drender={$nbp<2048?$mode_render:-1} + mode_background={$is_user_background?7:3} + mode_orientation=2 + mode_animate=1 + speed_animate=1 + focale=800 + mx0,my0,mx1,my1= + notification= fontsize_notif= + wait_event=1 + + # Create 3D axes. + axes3d 40,40,40,20,X,Y,Z,0 col3d. 0,255,0 l. s3d a[0-3] y off_axes={0,h} a y endl nm. axes3d + + # Start interactive loop. + do + is_motion={narg($mx0)} + if $is_animate" || "$is_outvideo rmn render fi + + # Init background image. + if !narg($background) + if $mode_background<3 {*,w,h},1,3,{arg(1+$mode_background,0,255,128)} + elif $mode_background==3 3,2,1,1,"32,32,64,64,116,96" permute. cyzx r. {*,w,h},1,3,3 round. + elif $mode_background==4 3,2,1,1,"0,0,0,0,64,96" permute. cyzx r. {*,w,h},1,3,3 round. + elif $mode_background==5 3,2,1,1,"8,0,0,160,90,0" permute. cyzx r. {*,w,h},1,3,3 round. + elif $mode_background==6 2,2,1,1,110,90,90,110 r. 64,64,1,3 r. {*,w,h},1,3,0,2,0.5,0.5 + else $_d3d_background r. {*,w,h},1,3,1 + fi + w. nm. background + rmn object3d + fi + + # Init normalized 3D object. + if !narg($object3d) + +c3d[0] n3d. *3d. {background,$zoomfactor*0.65*min(w,h)} + if $mode_orientation==1 rv3d. fi + rmn boundingbox3d + if $is_boundingbox +boundingbox3d. o3d. 0.35 nm. boundingbox3d +3d.. . rv[-2,-1] fi + nm. object3d + rmn render + fi + + # Render 3D object. + if !narg($render) + $pose3d + if $is_animate" || "$is_outvideo l. + da={$speed_animate*($is_animate?20*($|-$time_animate):1)} + if $mode_animate==0 rotation3d 1,0,0,$da rv + elif $mode_animate==1 rotation3d 0,1,0,$da rv + elif $mode_animate==2 rotation3d 0,0,1,$da rv + else + dax,day,daz={[0.75,0.82,0.97]*$da} + rotation3d 0,1,0,$dax rotation3d 1,0,0,$day rotation3d 0,0,1,$daz rv + fi + m* 1,3,1,1 j.. .,3 rm. +store. pose3d + time_animate=$| + endl fi + p={^} rm. + m={$is_motion?$mode_drender:$mode_render} + [background] nm. render + if $m<0 + if !narg($boundingbox3d) +boundingbox3d[object3d] o3d. 0.35 nm. boundingbox3d fi + +pose3d[boundingbox3d] $p + j3d[render] .,$posx%,$posy%,0,1,1,0,0,$focale rm. + else + +pose3d[object3d] $p + if $is_outline + {render,[w,h]},1,3,-1 + j3d. ..,$posx%,$posy%,0,1,$m,{$mode_orientation==2},$is_zbuffer,$focale + +channels. 0 !=. -1 + +dilate. 5 r. 100%,100%,1,3 j[render] .,0,0,0,0,0.8,. rm. + j[render] ..,0,0,0,0,1,. rm[-2,-1] + else j3d[render] .,$posx%,$posy%,0,1,$m,{$mode_orientation==2},$is_zbuffer,$focale + fi + rm. + fi + if $is_axes3d + +pose3d[axes3d] $p + eval " # Colorize axes depending on their Z-sign + const off = "$off_axes"; + ref([ 255,0,0 ],col); + i[13]>0?copy(i[off],col,3); + i[19]>0?copy(i[off+3],col,3); + i[25]>0?copy(i[off+6],col,3); + " + j3d[render] .,50,{-2,h-50},0,0.75,1,0,0,$focale rm. + fi + rmn view + + if $is_outvideo + o[render] $filename_outvideo,20,0,1 + nb_frames={int(360/$speed_animate)} + if $is_outvideo>=$nb_frames + o[] $filename_outvideo,20,0,0 # Close video stream + is_outvideo=0 + notification="Output Video:\nDone!" + else + is_outvideo+=1 + notification="Output Video:\nFrame "{$is_outvideo+1}/$nb_frames + fi + fi + fi + + # Manage notifications. + if narg($notification) + wait_event=0 + if !isnum($notification) # Create notification gfx + rmn notification_gfx + ofs,fs={narg($fontsize_notif)?0$fontsize_notif:32} + do + 0 t. {``$notification},0,0,$fs,1,255 + if narg($fontsize_notif) break + elif {background,"(w#-1>0.7*w || h#-1>0.25*h) && "$fs>13" && "$ofs>=$fs} + ofs,fs=$fs,{max(13,round($fs/1.25))} rm. + elif {background,"w#-1<0.3*w && h#-1<0.25*h && "$fs<64" && "$ofs<=$fs} + ofs,fs=$fs,{min(64,round($fs*1.25))} rm. + else + fontsize_notif=$fs break + fi + while 1 + r. {[w+12,h+8]},1,1,0,0,0.5,0.5 rectangle. 0,0,100%,100%,1,0xFFFFFFFF,255 to_rgb. + nm. notification_gfx + notification=$| + else + if $|>$notification+1 rm[notification_gfx] wait_event=1 notification= fi + rmn view + fi + fi + + # Refresh window view. + if !narg($view) + if $notification_gfx + +j[render] [notification_gfx],0.99~,5,0,0,{sqrt(max(0,1-($|-$notification)))} + else [render] + fi + nm. view w. -1,-1,0,$is_fullscreen,$disp_title + fi + + if $is_motion" || "$is_animate wait_event=0 fi + if $wait_event wait elif !$is_outvideo wait 20 fi + + # Manage user-events + if $exit_on_anykey" && "{*,k} break fi + if $is_outvideo continue fi # Skip user event management + mx,my,mb={*,x,y,b} + is_CTRL={{*,CTRLLEFT}" || "{*,CTRLRIGHT}} + if {*,-F1} # Render: Dots + mode_render,mode_drender={M=0;m=$mode_render;wasbbox=$mode_drender<0;[M,m!=M?(wasbbox?-1:M):(wasbbox?M:-1)]} + notification="Render: Dots" if $mode_drender<0 notification.=" + Box" fi + rmn render + elif {*,-F2} # Render: Wireframe + mode_render,mode_drender={M=1;m=$mode_render;wasbbox=$mode_drender<0;[M,m!=M?(wasbbox?-1:M):(wasbbox?M:-1)]} + notification="Render: Wireframe" if $mode_drender<0 notification.=" + Box" fi + rmn render + elif {*,-F3} # Render: Flat + mode_render,mode_drender={M=2;m=$mode_render;wasbbox=$mode_drender<0;[M,m!=M?(wasbbox?-1:M):(wasbbox?M:-1)]} + notification="Render: Flat" if $mode_drender<0 notification.=" + Box" fi + rmn render + elif {*,-F4} # Render: Flat-shaded + mode_render,mode_drender={M=3;m=$mode_render;wasbbox=$mode_drender<0;[M,m!=M?(wasbbox?-1:M):(wasbbox?M:-1)]} + notification="Render: Flat-Shaded" if $mode_drender<0 notification.=" + Box" fi + rmn render + elif {*,-F5} # Render: Gouraud-shaded + mode_render,mode_drender={M=4;m=$mode_render;wasbbox=$mode_drender<0;[M,m!=M?(wasbbox?-1:M):(wasbbox?M:-1)]} + notification="Render: Gouraud-Shaded" if $mode_drender<0 notification.=" + Box" fi + rmn render + elif {*,-F6} # Render: Phong-shaded + mode_render,mode_drender={M=5;m=$mode_render;wasbbox=$mode_drender<0;[M,m!=M?(wasbbox?-1:M):(wasbbox?M:-1)]} + notification="Render: Phong-Shaded" if $mode_drender<0 notification.=" + Box" fi + rmn render + elif {*,-F7}" && "($focale>100" || "!$focale) # Decrease focale + if !$focale focale=2000 else focale-=100 fi + notification="Focale: "$focale + rmn render + elif {*,-F8}" && "$focale # Increase focale + if $focale>=2000 focale=0 notification="Focale: Inf" else focale+=100 notification="Focale: "$focale fi + rmn render + elif {*,-F9} # Choose animation mode + mode_animate={($mode_animate+1)%4} + n0,n1,n2,n3="X-Axis","Y-Axis","Z-Axis","XYZ-Axes" notification="Animation Mode: "${n$mode_animate} + rmn render + elif {*,-F10} # Choose animation speed + speed_animate={max(1,($speed_animate+1)%9)} + notification="Animation Speed: X"$speed_animate + elif {*,-SPACE} # Start/stop animation + is_animate,time_animate={!$is_animate},$| + n0,n1="Off","On" notification="Animation: "${n$is_animate} + rmn render + fi + if $is_CTRL + if {*,-A} # Show/hide 3D axes + is_axes3d={!$is_axes3d} + n0,n1="Off","On" notification="3D Axes: "${n$is_axes3d} + rmn render + elif {*,-B} # Change background + mode_background={($mode_background+1)%($is_user_background?8:7)} + n0,n1,n2,n3,n4,n5,n6,n7=\ + "Black","White","Gray","Gradient \#1","Gradient \#2","Gradient \#3","Checkerboard","User-Defined" + notification="Background: "${n$mode_background} + rmn background + elif {*,-C}" && "{*,w}>128" && "{*,h}>128 w[] {0.8*[{*,w,h}]} # Decrease window size + notification="Decrease Window Size" fontsize_notif= + rmn background + elif {*,-D}" && "{*,w}<0.8*{*,u}" && "{*,h}<0.8*{*,v} w[] {1.25*[{*,w,h}]} # Increase window size + notification="Increase Window Size" fontsize_notif= + rmn background + elif {*,-F} # Toggle fullscreen + is_fullscreen={!$is_fullscreen} + if $is_fullscreen w[] {*,u,v} else w[] {0.75*[{*,u,v}]} fi + n0,n1="Off","On" notification="Fullscreen: "${n$is_fullscreen} fontsize_notif= + rmn background + elif {*,-G} # Save object as a .off file + n=0 do filename gmic.off,$n n+=1 while isfile(['{/${}}']) + o[0] ${} + notification="Save Copy:\n"${} + elif {*,-L} # Show/hide outline + is_outline={!$is_outline} + n0,n1="Off","On" notification="Outline: "${n$is_outline} + rmn render + elif {*,-O} # Save object as a .gmz file + n=0 do filename gmic.gmz,$n n+=1 while isfile(['{/${}}']) + o[0] ${} + notification="Save Copy:\n"${} + elif {*,-P} # Print 3D pose on console + $pose3d v 0 e[] " > 3D Pose = [ "{^}" ]." rm. + elif {*,-R} # Reset window + w[] $disp_size0 + notification="Reset Window Size" fontsize_notif= + rmn background + elif {*,-S} # Save screenshot + n=0 do filename gmic.png,$n n+=1 while isfile(['{/${}}']) + o[render] ${} + notification="Save Screenshot:\n"${} + elif {*,-T} # Change orientation mode + mode_orientation={($mode_orientation+1)%3} + n0,n1,n2="Forward","Backward","Double-Sided" notification="Orientation: "${n$mode_orientation} + if $mode_orientation rv3d[object3d] fi + rmn render + elif {*,-V} # Start/stop output video + is_outvideo={!$is_outvideo} + is_animate=0 + n=0 do filename gmic.avi,$n n+=1 while isfile(['{/${}}']) + filename_outvideo=${} + elif {*,-X} # Show/hide bounding box + is_boundingbox={!$is_boundingbox} + n0,n1="Off","On" notification="Bounding Box: "${n$is_boundingbox} + rmn object3d + elif {*,-Z} # Enable/disable Z-buffer + is_zbuffer={!$is_zbuffer} + n0,n1="Off","On" notification="Z-Buffer: "${n$is_zbuffer} + rmn render + fi + fi + if {*,-r} rmn background fontsize_notif= fi + + if $mx>=0 # Manage mouse-drag + if $mb + if !narg($mx0) mx0,my0,mx1,my1=$mx,$my,$mx,$my else mx1,my1=$mx,$my fi + else + if narg($mx0) rmn render fi + mx0,my0,mx1,my1= + fi + fi + + # Estimate new 3D pose from motion. + if narg($mx1)" && "($mx0!=$mx1" || "$my0!=$my1) + rmn render + if $mb&1" && "!$is_CTRL # Rotation + rotation3d[] {" + const w2 = "{*,w}"/2; + const h2 = "{*,h}"/2; + const R = 0.375*min("{*,w,h}"); + const u0 = "$mx0" - w2; + const v0 = "$my0" - h2; + const u1 = "$mx1" - w2; + const v1 = "$my1" - h2; + n0 = norm(u0,v0); + nu0 = n0>R?u0*R/n0:u0; + nv0 = n0>R?v0*R/n0:v0; + nw0 = sqrt(max(0,R^2 - nu0^2 - nv0^2)); + n1 = norm(u1,v1); + nu1 = n1>R?u1*R/n1:u1; + nv1 = n1>R?v1*R/n1:v1; + nw1 = sqrt(max(0,R^2 - nu1^2 - nv1^2)); + u = nv0*nw1 - nw0*nv1; + v = nw0*nu1 - nu0*nw1; + w = nv0*nu1 - nu0*nv1; + n = norm(u,v,w); + [ u,v,w,-asin(n/R^2)*180/pi ]"} + $pose3d m*[-2,-1] store. pose3d + mx0,my0=$mx1,$my1 + elif $mb&4" || "($mb&1" && "$is_CTRL) # Pan + posx,posy={" + const px = "$mx1-$mx0+$posx*{*,w}%"; + const py = "$my1-$my0+$posy*{*,h}%"; + cut([ px*100/"{*,w}", py*100/"{*,h}" ],0,100)"} + mx0,my0=$mx1,$my1 + elif $mb&2 # Zoom with mouse button + fact={1+($my0-$my1)/100} + zoomfactor*=$fact + *3d[object3d] $fact if narg($boundingbox3d) *3d[boundingbox3d] $fact fi + mx0,my0=$mx1,$my1 + fi + fi + if {*,o} # Zoom with mousewheel + fact={1+{*,-o}/10} + zoomfactor*=$fact + *3d[object3d] $fact if narg($boundingbox3d) *3d[boundingbox3d] $fact fi + rmn render + fi + + while {*}" && "!{*,ESC}" && "!($is_CTRL" && "{*,W}) + k[0] + endl done + if narg($disp_normalization) w[] -1,-1,$disp_normalization else w[] 0 fi + v -1 d[] #@cli da : eq. to 'display_array'. da : - v - _gmic_s="$?" v + - _display_array $* + _gmic_s="$?" v + _display_array $* #@cli display_array : _width>0,_height>0 #@cli : Display images in interactive windows where pixel neighborhoods can be explored. #@cli : Default values: 'width=13' and 'height=width'. display_array : - v - _gmic_s="$?" v + - _$0 $* + _gmic_s="$?" v + _$0 $* _display_array : check ${1=13}>0" && "${2=$1}>0 e[0--3] "Display $1x$2 array of pixel values for image"$_gmic_s"." - v - + dxb={round($1/2,1,1)} dxf={$1-1-$dxb} dyb={round($2/2,1,1)} dyf={$2-1-$dyb} repeat $! l[$>] - if {w<128" && "h<128} r 128,128,100%,100%,0,0,0.5,0.5 fi # Manage cases of small and large images. + if w<128" && "h<128 r 128,128,100%,100%,0,0,0.5,0.5 fi # Manage cases of small and large images. x0=0 y0=0 w={w} h={h} wmax={0.9*{*,u}} hmax={0.9*{*,v}} do - if {w>=$wmax||h>=$hmax} + if w>=$wmax" || "h>=$hmax n={n} nm. "Image "'{b}.{x}'" is too large, please select a sub-image." +select. 2 x0={i[0]} y0={i[1]} w={1+i[3]-i[0]} h={1+i[4]-i[1]} rm. nm. $n fi +z. $x0,$y0,0,{$x0+$w-1},{$y0+$h-1},0 round. 1 n. 0,255 - while {w>=$wmax||h>=$hmax} + while w>=$wmax" || "h>=$hmax x1=-1 y1=-1 c1=0 ox1=-1 oy1=-1 oc1=-1 x2=-1 y2=-1 c2=0 ox2=-1 oy2=-1 oc2=-1 x3=-1 y3=-1 c3=0 ox3=-1 oy3=-1 oc3=-1 c0=0 oxm=-1 oym=-1 - w. -1,-1,0,0,-1,-1,{-2,b}.{-2,x} + w. -1,-1,0,0,{-2,b}.{-2,x} do # Enter event loop. # Manage user interactions. wait[0-3] oc0=$c0 repeat 4 - if {$>" && "!{*$>}" && "${x$>}>=0} w$> 0 x$>=-1 y$>=-1 c$>=0 fi + if $>" && "!{*$>}" && "${x$>}>=0 w$> 0 x$>=-1 y$>=-1 c$>=0 fi if {*$>,o} c$>={(${c$>}+sign({*$>,o}))%s} wait[$>] -1 fi - if {{*$>,SPACE}" || "{*$>,ENTER}" || "{*$>,ARROWRIGHT}" || "{*$>,ARROWDOWN}} c$>={(${c$>}+1)%s} wait[$>] -1 fi - if {{*$>,BACKSPACE}" || "{*$>,ARROWLEFT}" || "{*$>,ARROWUP}} c$>={(${c$>}-1)%s} wait[$>] -1 fi + if {*$>,SPACE}" || "{*$>,ENTER}" || "{*$>,ARROWRIGHT}" || "{*$>,ARROWDOWN} c$>={(${c$>}+1)%s} wait[$>] -1 fi + if {*$>,BACKSPACE}" || "{*$>,ARROWLEFT}" || "{*$>,ARROWUP} c$>={(${c$>}-1)%s} wait[$>] -1 fi done - if {$oc0!=$c0} c1=$c0 c2=$c0 c3=$c0 fi + if $oc0!=$c0 c1=$c0 c2=$c0 c3=$c0 fi xm={*,x} ym={*,y} - if {$xm>=0" && "{*,b}&1} x1=$xm y1=$ym fi - if {$xm>=0" && "{*,b}&2} x2=$xm y2=$ym fi - if {$xm>=0" && "{*,b}&4} x3=$xm y3=$ym fi + if $xm>=0" && "{*,b}&1 x1=$xm y1=$ym fi + if $xm>=0" && "{*,b}&2 x2=$xm y2=$ym fi + if $xm>=0" && "{*,b}&4 x3=$xm y3=$ym fi # Generate main image view. - if {$xm>=0" && "($oxm!=$xm" || "$oym!=$ym)} w[] -1,-1,-1,-1,-1,-1,{-2,b}.{-2,x}" - ("$xm,$ym")" fi - if {$x1!=$ox1" || "$y1!=$oy1" || "$x2!=$ox2" || "$y2!=$oy2" || "$x3!=$ox3" || "$y3!=$oy3} + if $xm>=0" && "($oxm!=$xm" || "$oym!=$ym) w[] -1,-1,{-2,b}.{-2,x}" - ("$xm,$ym")" fi + if $x1!=$ox1" || "$y1!=$oy1" || "$x2!=$ox2" || "$y2!=$oy2" || "$x3!=$ox3" || "$y3!=$oy3 . - if {$x1>=0} + if $x1>=0 xb={$x1-$dxb} yb={$y1-$dyb} xe={$x1+$dxf} ye={$y1+$dyf} rectangle. $xb,$yb,$xe,$ye,0.2,0,255,255 rectangle. $xb,$yb,$xe,$ye,1,0xFFFFFFFF,0,255,255 fi - if {$x2>=0} + if $x2>=0 xb={$x2-$dxb} yb={$y2-$dyb} xe={$x2+$dxf} ye={$y2+$dyf} rectangle. $xb,$yb,$xe,$ye,0.2,255,32,255 rectangle. $xb,$yb,$xe,$ye,1,0xFFFFFFFF,255,32,255 fi - if {$x3>=0} + if $x3>=0 xb={$x3-$dxb} yb={$y3-$dyb} xe={$x3+$dxf} ye={$y3+$dyf} rectangle. $xb,$yb,$xe,$ye,0.2,255,255,0 rectangle. $xb,$yb,$xe,$ye,1,0xFFFFFFFF,255,255,0 @@ -1627,34 +3105,34 @@ fi # Generate zoomed views. - if {$x1>=0" && "($ox1!=$x1" || "$oy1!=$y1" || "$oc1!=$c1)} + if $x1>=0" && "($ox1!=$x1" || "$oy1!=$y1" || "$oc1!=$c1) +z.. {$x1-$dxb},{$y1-$dyb},0,$c1,{$x1+$dxf},{$y1+$dyf},0,$c1 +z.. {$x1-$dxb},{$y1-$dyb},0,{$x1+$dxf},{$y1+$dyf},0 __display_array[-2,-1] $1,$2,0,255,255 - w1. {w},{h},0,0,-1,-1,{-3,b}" - ("$x1,$y1,c=$c1")" + w1. {w},{h},0,0,{-3,b}" - ("$x1,$y1,c=$c1")" rm. ox1=$x1 oy1=$y1 oc1=$c1 fi - if {$x2>=0" && "($ox2!=$x2" || "$oy2!=$y2" || "$oc2!=$c2)} + if $x2>=0" && "($ox2!=$x2" || "$oy2!=$y2" || "$oc2!=$c2) +z.. {$x2-$dxb},{$y2-$dyb},0,$c2,{$x2+$dxf},{$y2+$dyf},0,$c2 +z.. {$x2-$dxb},{$y2-$dyb},0,{$x2+$dxf},{$y2+$dyf},0 __display_array[-2,-1] $1,$2,255,32,255 - w2. {w},{h},0,0,-1,-1,{-3,b}" - ("$x2,$y2,c=$c2")" + w2. {w},{h},0,0,{-3,b}" - ("$x2,$y2,c=$c2")" rm. ox2=$x2 oy2=$y2 oc2=$c2 fi - if {$x3>=0" && "($ox3!=$x3" || "$oy3!=$y3" || "$oc3!=$c3)} + if $x3>=0" && "($ox3!=$x3" || "$oy3!=$y3" || "$oc3!=$c3) +z.. {$x3-$dxb},{$y3-$dyb},0,$c3,{$x3+$dxf},{$y3+$dyf},0,$c3 +z.. {$x3-$dxb},{$y3-$dyb},0,{$x3+$dxf},{$y3+$dyf},0 __display_array[-2,-1] $1,$2,255,255,0 - w3. {w},{h},0,0,-1,-1,{-3,b}" - ("$x3,$y3,c=$c3")" + w3. {w},{h},0,0,{-3,b}" - ("$x3,$y3,c=$c3")" rm. ox3=$x3 oy3=$y3 oc3=$c3 fi - while {{*}" && "\ - !{*,ESC}" && "!{*,Q}" && "\ - !{*1,ESC}" && "!{*1,Q}" && "\ - !{*2,ESC}" && "!{*2,Q}" && "\ - !{*3,ESC}" && "!{*3,Q}} + while {*}" && "\ + !{*,ESC}" && "!{*,Q}" && "\ + !{*1,ESC}" && "!{*1,Q}" && "\ + !{*2,ESC}" && "!{*2,Q}" && "\ + !{*3,ESC}" && "!{*3,Q} k[0] w 0 w1 0 w2 0 w3 0 - endl done v + + endl done __display_array : round.. 1 c.. 0,999 r. 100%,100%,1,3,{s==1} @@ -1663,25 +3141,25 @@ rectangle.. $xb,$yb,$xe,$ye,1,0xFFFFFFFF,$3,$4,$5 repeat $2,yg repeat $1,xg - t.. {-3,i($xg,$yg)},{5+$xg*24},{5+$yg*24},13,0.8,{if(i($xg,$yg)>128,0,255)} + t.. {-3,i($xg,$yg)},{5+$xg*24},{5+$yg*24},13,0.8,{i($xg,$yg)>128?0:255} done done rm[-3,-1] #@cli dfft : eq. to 'display_fft'. dfft : - _display_fft + v + _display_fft #@cli display_fft #@cli : Display fourier transform of selected images, with centered log-module and argument. #@cli : (eq. to 'dfft'). #@cli : $ image.jpg +display_fft display_fft : - _$0 + v + _$0 _display_fft : e[0--3] "Render fourier transform of image$? with centered log-module and argument." - v - repeat $! l[$>] fftpolar +.. 1 log.. n 0,255 a x endl done s x,2 v + + repeat $! l[$>] fftpolar +.. 1 log.. n 0,255 a x endl done s x,2 #@cli dg : eq. to 'display_graph'. dg : check "${1=0}>=0 && ${2=0}>=0" skip ${3=1},${4=0},${5=0},${6=0},${7=0},${8=0},"${9=x-axis}","${10=y-axis}" @@ -1693,23 +3171,27 @@ #@cli : 'vertex_type' can be { 0=none | 1=points | 2,3=crosses | 4,5=circles | 6,7=squares }. #@cli : 'xmin','xmax','ymin','ymax' set the coordinates of the displayed xy-axes. #@cli : if specified 'width' or 'height' is '0', then image size is set to half the screen size. -#@cli : Default values: 'width=0', 'height=0', 'plot_type=1', 'vertex_type=1', 'xmin=xmax=ymin=ymax=0 (auto)', 'xlabel="x-axis"' and 'ylabel="y-axis"'. +#@cli : Default values: 'width=0', 'height=0', 'plot_type=1', 'vertex_type=1', 'xmin=xmax=ymin=ymax=0 (auto)', \ +# 'xlabel="x-axis"' and 'ylabel="y-axis"'. #@cli : $ 128,1,1,1,'cos(x/10+u)' +display_graph 400,300,3 -display_graph : check "${1=0}>=0 && ${2=0}>=0" skip ${3=1},${4=0},${5=0},${6=0},${7=0},${8=0},"${9=x-axis}","${10=y-axis}" +display_graph : check "${1=0}>=0 && ${2=0}>=0" + skip ${3=1},${4=0},${5=0},${6=0},${7=0},${8=0},"${9=x-axis}","${10=y-axis}" _display_graph ${1-8},"$9","$10" -_display_graph : check "${1=0}>=0 && ${2=0}>=0" skip ${3=1},${4=0},${5=0},${6=0},${7=0},${8=0},"${9=x-axis}","${10=y-axis}" +_display_graph : check "${1=0}>=0 && ${2=0}>=0" + skip ${3=1},${4=0},${5=0},${6=0},${7=0},${8=0},"${9=x-axis}","${10=y-axis}" e[0--3] "Render $1x$2 graph plot from data of image$?." - v - repeat $! l[$>] nm={0,n} + + repeat $! l[$>] nm={0,n} # Determine output size. - if {$1>0&&$2>0} w,h=$1,$2 else w,h={{*,u}/2},{{*,v}/2} fi + if $1>0" && "$2>0 w,h=$1,$2 else w,h={{*,u}/2},{{*,v}/2} fi w,h={[max($w,33),max($h,33)]} # Determine xmin,xmax/ymin,ymax. one={$3!=3} siz={w*h*d} - if {$5==$6} xmin=0 xmax={$siz-$one} else xmin={min($5,$6)} xmax={max($5,$6)} fi - if {$7==$8} ymin={im-(iM-im)/20} ymax={iM+(iM-im)/20} else ymin={min($7,$8)} ymax={max($7,$8)} fi + if $5==$6 xmin=0 xmax={$siz-$one} else xmin={min($5,$6)} xmax={max($5,$6)} fi + if $7==$8 ymin={im-(iM-im)/20} ymax={iM+(iM-im)/20} else ymin={min($7,$8)} ymax={max($7,$8)} fi dx={$xmax-$xmin} dy={$ymax-$ymin} # Determine number of axes tick marks. @@ -1719,39 +3201,39 @@ # Create plot canvas. gw={$w-32} gh={$h-32} gg={($gw-$one)/($siz-$one)} $gw,$gh,1,3,255 + grid. {$deltax*$gw/$dx},{$deltay*$gh/$dy},{($offx-$xmin)*$gw/$dx},{$gh-($offy-$ymin)*$gh/$dy},0.25,0xCCCCCCCC,0 # Define color palette for curves. - if {{-2,s}==1} (120,120,200) - elif {{-2,s}<=3} (220,10,10;10,220,10;10,10,220) + if s#-2==1 (120,120,200) + elif s#-2<=3 (220,10,10;10,220,10;10,10,220) else (0,255) r. 256,1,1,1,3 map. 2 z. 2,100% permute. cxyz r. 3,{-3,max(3,s)},1,1,0,2 sh. 0,2,0,0 f. 255,0,0,0,255,0,0,0,255 rm. fi # Draw plot for each channel. - repeat {-3,s} sh... $> graph... .,$3,$4,$ymax,$ymin,1,{-2,@0-2} rm. shift. 0,-1 done + repeat s#-3 sh... $> graph... .,$3,$4,$ymax,$ymin,1,{-2,@0-2} rm. shift. 0,-1 done rm[-3,-1] line. 0,0,100%,0,1,110 line. 100%,0,100%,100%,1,110 line. 100%,100%,0,100%,1,255 line. 0,100%,0,0,1,255 100%,100%,1,1,255 axes. $xmin,$xmax,$ymax,$ymin,14,1,0 - if {$xmin>0} axes. 0,0,$ymax,$ymin,14,1,160 fi - if {$xmax<0} axes. {w-1},{w-1},$ymax,$ymin,14,1,160 fi - if {$ymin>0} axes. $xmin,$xmax,{h-1},{h-1},14,1,160 fi - if {$ymax<0} axes. $xmin,$xmax,0,0,14,1,160 fi + if $xmin>0 axes. 0,0,$ymax,$ymin,14,1,160 fi + if $xmax<0 axes. {w-1},{w-1},$ymax,$ymin,14,1,160 fi + if $ymin>0 axes. $xmin,$xmax,{h-1},{h-1},14,1,160 fi + if $ymax<0 axes. $xmin,$xmax,0,0,14,1,160 fi +erode. 3 !=. 255 r.. 100%,100%,1,3 j... ..,0,0,0,0,1,.,1 rm[-2,-1] frame. 16,16,220 0 t. "$9",0,0,14,1,-220,-220,-220 j.. .,{({-2,w}-w)/2},{{-2,h}-16},0,0,-1 rm. 0 t. "$10",0,0,14,1,-220,-220,-220 rotate. -90 j.. .,2,{({-2,h}-h)/2},0,0,-1 rm. - nm $nm endl done c 0,255 v + + nm $nm endl done c 0,255 #@cli dh : eq. to 'display_histogram'. dh : - v - _gmic_s="$?" v + - _display_histogram $"*" + _gmic_s="$?" v + _display_histogram $"*" #@cli display_histogram : _width>=0,_height>=0,_clusters>0,_min_value[%],_max_value[%],_show_axes={ 0 | 1 },_expression. #@cli : Render a channel-by-channel histogram. @@ -1759,55 +3241,59 @@ #@cli : 'expression' is a mathematical expression used to transform the histogram data for visualization purpose. #@cli : (eq. to 'dh'). #@cli : if specified 'width' or 'height' is '0', then image size is set to half the screen size. -#@cli : Default values: 'width=0', 'height=0', 'clusters=256', 'min_value=0%', 'max_value=100%', 'show_axes=1' and 'expression=i'. +#@cli : Default values: 'width=0', 'height=0', 'clusters=256', 'min_value=0%', 'max_value=100%', 'show_axes=1' \ +# and 'expression=i'. #@cli : $ image.jpg +display_histogram 512,300 display_histogram : - v - _gmic_s="$?" v + - _$0 $"*" + _gmic_s="$?" v + _$0 $"*" _display_histogram : check "${1=0}>=0 && ${2=0}>=0 && ${3=256}>0" skip ${4=0%},${5=100%},${6=1},"${7=i}" - e[0--3] "Render $1x$2 channel-by-channel histogram of image"$_gmic_s", with $3 clusters, minimum value $4 and maximum value $5." - v - repeat $! l[$>] nm={0,n} + e[0--3] "Render $1x$2 channel-by-channel histogram of image"$_gmic_s", with $3 clusters, minimum value $4 + and maximum value $5." + repeat $! l[$>] nm={0,n} if ${is_percent\ $4} m={im+(iM-im)*$4} else m=$4 fi if ${is_percent\ $5} M={im+(iM-im)*$5} else M=$5 fi s={s} s c repeat $s l[{-1-$>}] s z histogram $3,$m,$M a z endl done a c f '"${7--1}"' vM={iM} s z repeat $! l[$>] - if {$1>0&&$2>0} wh=$1,$2 else wh={{*,u}/2},{{*,v}/2} fi + if $1>0" && "$2>0 wh=$1,$2 else wh={{*,u}/2},{{*,v}/2} fi $wh,1,{s},-255 - repeat {s} sh[-2,-1] $> graph. ..,3,0,$vM,0,1,0 rm[-2,-1] done + repeat s sh[-2,-1] $> graph. ..,3,0,$vM,0,1,0 rm[-2,-1] done rm.. + 255 if $6 100%,100% axes. $m,$M,$vM,0,14,1,255 - if {$m>0} axes. 0,0,$vM,0,14,1,200 fi - if {$M<0} axes. {w-1},{w-1},$vM,0,14,1,200 fi + if $m>0 axes. 0,0,$vM,0,14,1,200 fi + if $M<0 axes. {w-1},{w-1},$vM,0,14,1,200 fi +dilate. 3 r.. ... j... ..,0,0,0,0,1,.,255 rm[-2,-1] fi endl done a z nm $nm - endl done v + + endl done -#@cli display_parametric : _width>0,_height>0,_outline_opacity,_vertex_radius>=0,_is_antialiased={ 0 | 1 },_is_decorated={ 0 | 1 },_xlabel,_ylabel +#@cli display_parametric : _width>0,_height>0,_outline_opacity,_vertex_radius>=0,_is_antialiased={ 0 | 1 },\ +# _is_decorated={ 0 | 1 },_xlabel,_ylabel #@cli : Render 2D or 3D parametric curve or point clouds from selected image data. #@cli : Curve points are defined as pixels of a 2 or 3-channel image. #@cli : If the point image contains more than 3 channels, additional channels define the (R,G,B) color for each vertex. -#@cli : If 'outline_opacity>1', the outline is colored according to the specified vertex colors and 'outline_opacity-1' is used -#@cli : as the actual drawing opacity. -#@cli : Default values: 'width=512', 'height=width', 'outline_opacity=3', 'vertex_radius=0', 'is_antialiased=1', 'is_decorated=1', 'xlabel="x-axis"' and 'ylabel="y-axis"'. +#@cli : If 'outline_opacity>1', the outline is colored according to the specified vertex colors and +#@cli : 'outline_opacity-1' is used as the actual drawing opacity. +#@cli : Default values: 'width=512', 'height=width', 'outline_opacity=3', 'vertex_radius=0', 'is_antialiased=1',\ +# 'is_decorated=1', 'xlabel="x-axis"' and 'ylabel="y-axis"'. #@cli : $ 1024,1,1,2,'t=x/40;if(c==0,sin(t),cos(t))*(exp(cos(t))-2*cos(4*t)-sin(t/12)^5)' display_parametric 512,512 -#@cli : $ 1000,1,1,2,u(-100,100) quantize 4,1 noise 12 channels 0,2 +normalize 0,255 append c display_parametric 512,512,0.1,8 +#@cli : $ 1000,1,1,2,u(-100,100) quantize 4,1 noise 12 channels 0,2 +normalize 0,255 append c \ +# display_parametric 512,512,0.1,8 display_parametric : check "${1=512}>0 && ${2=$1}>0 && ${4=0}>=0" skip ${3=3},${5=1},${6=1},"${7=x-axis}","${8=y-axis}" - v - s0="no " s1="" o0="" o1="colored " - v + e[^-1] "Render $1x$2 parametric graph plot from data of image$?, with "${o{$3>1}}"outline opacity "{if($3>1,$3-1,$3)}\ - ", vertex radius $4, "${s{$5!=0}}"antialiasing and "${s{$6!=0}}"decoration." v - + s0="no " s1="" o0="" o1="colored " + e[^-1] "Render $1x$2 parametric graph plot from data of image$?, with "${o{$3>1}}"outline opacity "\ + {$3>1?$3-1:$3}", vertex radius $4, "${s{$5!=0}}"antialiasing and "${s{$6!=0}}"decoration." repeat $! l[$>] nm={0,n} N={w*h*d} - i[0] ({'CImg3d'}) +[0] 0.5 i[1] ($N;$N) # Header + nb of vertices/primitives. + i[0] ('CImg3d') +[0] 0.5 i[1] ($N;$N) # Header + nb of vertices/primitives. # Calibrate colors of vertices. - if {s==4} +channels. 3,3 r. 100%,100%,1,2 a[-2,-1] c is_grayscale=1 + if s==4 +channels. 3,3 r. 100%,100%,1,2 a[-2,-1] c is_grayscale=1 else is_grayscale={s<4} channels. 0,5 fi @@ -1830,9 +3316,10 @@ +circles3d[0] $4 j3d[1] [2],50%,50%,0,1,3,0,0 rm[2] fi - if $3 l[0] s3d f[1] 'i-y' rm[3] i[3] (2,0,1;2,{$N-2},{$N-1}) r[3] 3,{$N-1},1,1,3 round[3] # Convert point cloud to connected segments. + # Convert point cloud to connected segments. + if $3 l[0] s3d f[1] 'i-y' rm[3] i[3] (2,0,1;2,{$N-2},{$N-1}) r[3] 3,{$N-1},1,1,3 round[3] r[5] 1,{h-1},1,1,0 - if {$3>1} r[4] 3,{4,h/3},1,1,-1 r[4] 3,{4,h-1},1,1,2 else rm[4] i[4] 3,{$N-1} fi + if $3>1 r[4] 3,{4,h/3},1,1,-1 r[4] 3,{4,h-1},1,1,2 else rm[4] i[4] 3,{$N-1} fi y a y endl j3d[1] [0],50%,50%,0,{if($3>1,$3-1,$3)},2,0,0 fi @@ -1843,84 +3330,71 @@ xc={0.5*($xm+$xM)} yc={0.5*($ym+$yM)} dx={0.5*($xM-$xm)/0.96} dy={0.5*($yM-$ym)/0.96} xm={$xc-$dx} xM={$xc+$dx} ym={$yc-$dy} yM={$yc+$dy} 100%,100%,1,1,255 axes. $xm,$xM,$yM,$ym,14,1,0 - if {$xm>0} axes. 0,0,$yM,$ym,14,1,160 fi - if {$xM<0} axes. {w-1},{w-1},$yM,$ym,14,1,160 fi - if {$ym>0} axes. $xm,$xM,{h-1},{h-1},14,1,160 fi - if {$yM<0} axes. $xm,$xM,0,0,14,1,160 fi + if $xm>0 axes. 0,0,$yM,$ym,14,1,160 fi + if $xM<0 axes. {w-1},{w-1},$yM,$ym,14,1,160 fi + if $ym>0 axes. $xm,$xM,{h-1},{h-1},14,1,160 fi + if $yM<0 axes. $xm,$xM,0,0,14,1,160 fi +erode. 3 !=. 255 r.. 100%,100%,1,3 j... ..,0,0,0,0,1,.,1 rm[-2,-1] frame 1,1,128 frame 15,15,220 0 t. "$7",0,0,14,1,-220,-220,-220 j.. .,{({-2,w}-w)/2},{{-2,h}-16},0,0,-1 rm. 0 t. "$8",0,0,14,1,-220,-220,-220 rotate. -90 j.. .,2,{({-2,h}-h)/2},0,0,-1 rm. fi nm. $nm - endl done v + + endl done #@cli dp : eq. to 'display_parallel'. dp : - v - _gmic_s="$?" v + - _display_parallel + _gmic_s="$?" v + _display_parallel 1 #@cli display_parallel #@cli : Display each selected image in a separate interactive display window. #@cli : (eq. to 'dp'). display_parallel : - v - _gmic_s="$?" v + - _$0 + _gmic_s="$?" v + _$0 1 -_display_parallel : +# $1 = Normalization used for display window. +_display_parallel : check ${1=0}>=0 e[0--3] "Display image$? in parallel." print - v - - if {$!<=1} d v + return fi - $!,1,1,1,x ({'{^}'}) rm.. - l. - s -,{','} y x - i[0--2] ({'d['}) - i[2--2:2] ({'],'}) - ({']'}) - a x com={t} rm - endl - m "__dp : parallel "$com __dp uncommand __dp - d[] v + + is_d2d_compatible={"res = l<=10; for (k = 0, k,n}'];find(s,_'.',size(s)-1,-1)>0 nm={$>,b}.{$>,x} else nm={$>,b} fi + ('$nm':;) + done + store[-$N--1] _d2d_names + a z _display2d 0,$1 s z + _d2d_names= + else + if $!<=1 v - d v + return fi + 14,$! eval. "!x?copy(i(),[[',d['],vtos(y,10,10),_']'])" =. 0 discard. 0 str={t} rm. + m "__dp : parallel "$str __dp um __dp + fi + v -1 d[] #@cli dp0 : eq. to 'display_parallel0'. dp0 : - v - _gmic_s="$?" v + - _display_parallel0 + _gmic_s="$?" v + _display_parallel 0 #@cli display_parallel0 #@cli : Display each selected image in a separate interactive display window, without value normalization. #@cli : (eq. to 'dp0'). display_parallel0 : - v - _gmic_s="$?" v + - _$0 - -_display_parallel0 : - e[0--3] "Display image$? in parallel, without value normalization." - print - v - - if {$!<=1} d0 v + return fi - $!,1,1,1,x ({'{^}'}) rm.. - l. - s -,{','} y x - i[0--2] ({'d0['}) - i[2--2:2] ({'],'}) - ({']'}) - a x com={t} rm - endl - m "__dp0 : parallel "$com __dp0 uncommand __dp0 - d[] v + + _gmic_s="$?" v + _display_parallel 0 #@cli display_polar : _width>32,_height>32,_outline_type,_fill_R,_fill_G,_fill_B,_theta_start,_theta_end,_xlabel,_ylabel #@cli : Render polar curve from selected image data. #@cli : 'outline_type' can be { r<0=dots with radius -r | 0=no outline | r>0=lines+dots with radius r }. #@cli : 'fill_color' can be { -1=no fill | R,G,B=fill with specified color }. -#@cli : Default values: 'width=500', 'height=width', 'outline_type=1', 'fill_R=fill_G=fill_B=200', 'theta_start=0', 'theta_end=360', 'xlabel="x-axis"' and 'ylabel="y-axis"'. +#@cli : Default values: 'width=500', 'height=width', 'outline_type=1', 'fill_R=fill_G=fill_B=200', 'theta_start=0', \ +# 'theta_end=360', 'xlabel="x-axis"' and 'ylabel="y-axis"'. #@cli : $ 300,1,1,1,'0.3+abs(cos(10*pi*x/w))+u(0.4)' display_polar 512,512,4,200,255,200 #@cli : $ 3000,1,1,1,'x^3/1e10' display_polar 400,400,1,-1,,,0,{15*360} -display_polar : check "${1=500}>32 && ${2=$1}>32" skip ${3=1},${4=200},${5=$4},${6=$5},${7=0},${8=360},"${9=x-axis}","${10=y-axis}" +display_polar : check "${1=500}>32 && ${2=$1}>32" + skip ${3=1},${4=200},${5=$4},${6=$5},${7=0},${8=360},"${9=x-axis}","${10=y-axis}" e[^-1] "Render $1x$2 polar graph plot from data of image"$_gmic_s", with outline $4 and fill color ($4,$5,$6)." - v - repeat $! l[$>] nm={0,n} + repeat $! l[$>] nm={0,n} # Compute (x,y) coordinates of the polar curve points. M={max(abs(iM),abs(im))} @@ -1932,7 +3406,7 @@ # Generate 3D object for curve outline. if $3 - ({'CImg3d'}) +. 0.5 ($N,$N) + ('CImg3d') +. 0.5 ($N,$N) +z[coords] 0,2 1,$N,1,1,2 1,$N,1,1,'y' ++. 1 a[-3--1] x =. 0,2,100% 3,$N,1,1,0 1,$N,1,1,1 y[-6--1] a[-6--1] y @@ -1940,8 +3414,8 @@ fi # Generate 3D object for filling. - if {"$4>=0 && $5>=0 && $6>=0"} - ({'CImg3d'}) +. 0.5 ({$N+1},$N) + if "$4>=0 && $5>=0 && $6>=0" + ('CImg3d') +. 0.5 ({$N+1},$N) +z[coords] 0,-1,2,100% z. 0,2 1,$N,1,1,3 1,$N 1,$N,1,1,'1+y' ++. 1 a[-4--1] x =. 1,3,100% 3,$N,1,1,$4,$5,$6 1,$N,1,1,1 @@ -1952,17 +3426,17 @@ # Render graph image. {$1-32},{$2-32},1,3,255 - L={0.1*max($1,$2)} grid. $L,$L,0,0,0.25,0xCCCCCCCC,0 # Draw background grid. - if {"$4>=0 && $5>=0 && $6>=0"} # Draw curve filling. + L={0.1*max($1,$2)} grid. $L,$L,0,0,0.25,0xCCCCCCCC,0 # Draw background grid + if "$4>=0 && $5>=0 && $6>=0" # Draw curve filling j3d. [_plot_polar_fill],50%,50%,0,1,2,1,0 rm[_plot_polar_fill] fi if $3 - if {$3>=0} # Draw curve outline. + if $3>=0 # Draw curve outline j3d. [_plot_polar_outline],50%,50%,0,1,1,0,0 fi - if {$3!=0} # Draw curve vertices. - if {abs($3)>1} circles3d[_plot_polar_outline] {abs($3)} fi + if $3!=0 # Draw curve vertices + if abs($3)>1 circles3d[_plot_polar_outline] {abs($3)} fi j3d. [_plot_polar_outline],50%,50%,0,0.2,2,0,0 fi rm[_plot_polar_outline] @@ -1976,12 +3450,11 @@ 0 t. "$9",0,0,13,1,-220,-220,-220 j.. .,{({-2,w}-w)/2},{{-2,h}-16},0,0,-1 rm. 0 t. "$10",0,0,13,1,-220,-220,-220 rotate. -90 j.. .,2,{({-2,h}-h)/2},0,0,-1 rm. - nm $nm endl done v + + nm $nm endl done #@cli dq : eq. to 'display_quiver'. dq : - v - _gmic_s="$?" v + - _display_quiver $* + _gmic_s="$?" v + _display_quiver $* #@cli display_quiver : _size_factor>0,_arrow_size>=0,_color_mode={ 0=monochrome | 1=grayscale | 2=color } #@cli : Render selected images of 2D vectors as a field of 2D arrows. @@ -1989,16 +3462,16 @@ #@cli : Default values: 'size_factor=16', 'arrow_size=1.5' and 'color_mode=1'. #@cli : $ image.jpg +luminance gradient[-1] xy rv[-2,-1] *[-2] -1 a[-2,-1] c crop 60,10,90,30 +display_quiver[1] , display_quiver : - v - _gmic_s="$?" v + - _$0 $* + _gmic_s="$?" v + _$0 $* _display_quiver : check "${1=16}>0 && ${2=1.5}>=0 && isint(${3=2}) && $3>=0 && $3<=2" - e[0--3] "Render field of 2D arrows from image"$_gmic_s", with size factor $1, arrow size $2 in "${arg\ 1+$3,monochrome,grayscale,color}" mode." - v - repeat $! l[$>] + e[0--3] "Render field of 2D arrows from image"$_gmic_s", with size factor $1, arrow size $2 in "\ + ${arg\ 1+$3,monochrome,grayscale,color}" mode." + repeat $! l[$>] +norm. /.. {max(1e-6,iM)} rm. # Normalize vector values. {$1*w},{$1*h},1,{"1<] if {s==2" || "s==4} + repeat $! l[$>] if s==2" || "s==4 if $is_rgb i[0] 100%,100%,1,3 fc[0] {[$*]} else i[0] (160,128;128,160) r[0] 16,16 r[0] [1],[1],1,{s-1},0,2 fi nm[0] {1,n} sh. {s-1} j[0] [1],0,0,0,0,1,[2],255 k[0] - fi endl done to_rgb u $is_rgb v + + fi endl done to_rgb u $is_rgb #@cli dt : eq. to 'display_tensors'. dt : - v - _gmic_s="$?" v + - _display_tensors $* + _gmic_s="$?" v + _display_tensors $* #@cli display_tensors : _size_factor>0,_ellipse_size>=0,_color_mode={ 0=monochrome | 1=grayscale | 2=color },_outline>=0 #@cli : Render selected images of tensors as a field of 2D ellipses. @@ -2063,12 +3533,12 @@ #@cli : $ image.jpg diffusiontensors 0.1,0.9 resize2dx 32 +display_tensors 64,2 #@cli : $$ display_tensors : - v - _gmic_s="$?" v + - _$0 $* + _gmic_s="$?" v + _$0 $* _display_tensors : check "${1=16}>0 && ${2=1.5}>=0 && isint(${3=2}) && $3>=0 && $3<=2 && ${4=2}>=0" - e[0--3] "Render field of 2x2 tensors from image"$_gmic_s", with size factor $1, ellipse size $2 in "${arg\ 1+$3,monochrome,grayscale,color}" mode and outline $4." - v - repeat $! l[$>] + e[0--3] "Render field of 2x2 tensors from image"$_gmic_s", with size factor $1, ellipse size $2 in "\ + ${arg\ 1+$3,monochrome,grayscale,color}" mode and outline $4." + repeat $! l[$>] * {($2*$1/2)/max(abs(im),abs(iM))} # Normalize tensor values. {$1*w},{$1*h},1,{"1<=0, --k, ellipse(#1,X,r1 + k*$4,r2 + k*$4,ang,1,arg(k + 1,C,Co))); I" rm.. - endl done v + + endl done #@cli dw : eq. to 'display_warp'. dw : - v - _gmic_s="$?" v + - _display_warp $* + _gmic_s="$?" v + _display_warp $* #@cli display_warp : _cell_size>0 #@cli : Render selected 2D warping fields. @@ -2103,73 +3572,76 @@ #@cli : Default value: 'cell_size=15'. #@cli : $ 400,400,1,2,'x=x-w/2;y=y-h/2;r=sqrt(x*x+y*y);a=atan2(y,x);5*sin(r/10)*[cos(a),sin(a)]' +display_warp 10 display_warp : - v - _gmic_s="$?" v + - _$0 $* + _gmic_s="$?" v + _$0 $* _display_warp : check "${1=15}>0" e[0--3] "Render 2D warping field"$_gmic_s", with cell size $1." - v - repeat $! l[$>] - if {d!=1||s!=2} - v + error[0--3] "Command 'display_warp': Invalid image ["{$!-$>-1}"]: Dimensions "{w}","{h}","{d}","{s}" does not represent a 2D field of 2D vectors." + repeat $! l[$>] + if d!=1" || "s!=2 + error[0--3] "Command 'display_warp': Invalid image ["{$!-$>-1}"]: Dimensions "{w}","{h}","{d}","{s}" + does not represent a 2D field of 2D vectors." fi i[0] 100%,100%,1,1,1 grid[0] $1,$1 nm[0] {1,n} warp[0] [1],1,1,0 rm[1] - endl done * 255 v + + endl done * 255 #@cli document_gmic : _format={ ascii | bash | html | images | latex },_image_path,_write_wrapper={ 0 | 1 } #@cli : Create documentation of .gmic command files (loaded as raw 'uchar' images), in specified format. #@cli : Default values: 'format=ascii', 'image_path=""' and 'write_wrapper=1'.\n -#@cli : Example(s) : raw:filename.gmic,char document_gmic html,img +#@cli : Example(s) : input_text filename.gmic document_gmic html,img document_gmic : skip ${1="ascii"},${2=""},${3=1} - if {!$!} return fi - v -1 + if !$! return fi + if $_vt100" && "['"$1"']=='ascii' use_vt100 fi + v 0 # Concatenate command data and split them into lines. _name={0,b} # Basename for the commands definition file. - if {$!>1} i[1--2] (10) fi a y m {t} s -,10 + if $!>1 append_newline[^-1] fi + a y m {/{t}} merge_multiline_comments. s -,10 # Output header. _document_gmic_header_$1[] $3 # Define parsing variables. - _subsection=0 # Indice of current subsection. - _example=0 # Indice of current example. - _command=0 # Indice of current command. + _subsection=0 # Index of current subsection. + _example=0 # Index of current example. + _command=0 # Index of current command. _is_example=0 # Boolean telling if current line is an example. _path="$2" # Path of example images. ks0="0" ks1="k[0]" go_on=1 # Parse lines of the commands file. - repeat $! l[$>] if {$go_on" && "h>7" && "same([{^}],'#@cli',5)" && (i[5]==_' ' || i[5]==_':')"} # Process only lines starting with '#@cli'. + repeat $! l[$>] # Process only lines starting with '#@cli'. + if $go_on" && h>7 && same(["{^}"],'#@cli',5) && (i[5]==_' ' || i[5]==_':')" rows 6,100% autocrop {'" "'} # Discard '#@cli'. _is_example=0 - if {i!=_':'} + if i!=_':' # Reached line as '#@cli Command : Arguments_line1 : Arguments_line2 : (qualifier)'. _command+=1 - s -,{'": "'} autocrop {'" "'} + s -,{'": "'} l[0] discard {':'} endl autocrop {'" "'} _document_gmic_declaration_$1 else rows 1,100% # Discard ':' char. - if {i==_':'} + if i==_':' # Reached line as '#@cli :: Subsection name'. _subsection+=1 rows 1,100% autocrop {'" "'} # Discard ':' character. - if {"['"{t}"']=='Additional Gallery Images'"} go_on=0 + if ['{t}']=='"Additional Gallery Images"' go_on=0 else _document_gmic_subsection_$1 fi else autocrop {'" "'} - if {i==_'$'} + if i==_'$' # Reached line as '#@cli : $ Example of use'. rows 1,100% autocrop {'" "'} # Discard '$' character. _is_example=1 - if {i!=_'$'} _example+=1 fi # Reached '#@cli : $$' for announcing available tutorial page. + if i!=_'$' _example+=1 fi # Reached '#@cli : $$' for announcing available tutorial page. _filename=$_path$_name$_example.jpg _document_gmic_example_$1 @@ -2189,116 +3661,119 @@ _shortcut=0 _document_gmic_subsection_ascii : - v + - e[] "\n\n "$_gmic_r$_gmic_b"**** "{0,t}":"$_gmic_n"\n" - v - + v 0 + +e[] "\n\n "$_gmic_r$_gmic_b"**** "{0,t}":"$_gmic_n"\n" _document_gmic_declaration_ascii : - if {[{^}]=='(+)'} qualifier=" "{t} rm. else qualifier="" fi - if {$!>1" && "same([{^}],'"eq. to "',7)} # Declaration of a shortcut command. + v 0 + if [{^}]=='(+)' qualifier=" "{t} rm. else qualifier="" fi + if $!>1" && "same([{^}],'"eq. to "',7) # Declaration of a shortcut command. rows. 7,100% autocrop. {'.'} autocrop. {'" "'} autocrop. 39 _shortcut$_shortcut={0,t} _shortcutlink$_shortcut={t} _shortcutqualifier$_shortcut=$qualifier _shortcut+=1 else # Declaration of a regular command. - v + e[] "\n "$_gmic_m${_gmic_b}{0,t}${qualifier}":"$_gmic_n v - rm[0] + +e[] "\n "$_gmic_m${_gmic_b}{0,t}${qualifier}":"$_gmic_n rm[0] if $! s=" " y x - repeat {$!-1} ({'" |"'}) a[$>,-1] x done # Insert ' |'. + repeat $!-1 ('" |"') a[$>,-1] x done # Insert ' |'. repeat $! l[$>] _document_gmic_split_ascii 80 - repeat {$!-1} ({'\\\\\n$s" "'}) a[$>,-1] x done - a x v + e[] $_gmic_c$s{0,t}$_gmic_n v - + repeat $!-1 ('\\\\\n$s" "') a[$>,-1] x done + a x +e[] $_gmic_c$s{0,t}$_gmic_n endl done fi - v + e[] "" v - + +e[] "" fi _document_gmic_description_ascii : + v 0 s=" " bs0="\n" bs1="\\\\\n " is_equivalent={same([{^}],"'(eq. to '",8)} is_default={same([{^}],"'Default value'",13)} - y x if {!narg($_is_tutorial)} _document_gmic_split_ascii 96 fi - if {$!==1" && "0$_vt100>0" && "$is_equivalent} - replace_str "eq. to","equivalent to shorcut command" - s +,39 if {$!==5} i[2] ({'$_gmic_m$_gmic_b'}) i[4] ({'$_gmic_n'}) y fi a y + y x if !narg($_is_tutorial) _document_gmic_split_ascii 96 fi y + if $!==1" && "$_vt100" && "$is_equivalent + replace_str "eq. to","equivalent to shortcut command" + s +,39 if $!==5 i[2] ('$_gmic_m$_gmic_b':y) i[4] ('$_gmic_n':y) fi a y fi - repeat {$!-1} ({'${bs$_is_example}$s" "'}) a[$>,-1] x done a x - if {0$_vt100>0} + repeat $!-1 ('${bs$_is_example}$s" "':y) a[$>,-1] y done a y + if $_vt100 replace_str "Default values:","\n"$s$_gmic_n${_gmic_b}"Default values:"$_gmic_n replace_str "Default value:","\n"$s$_gmic_n${_gmic_b}"Default value:"$_gmic_n replace_str "G'MIC",${_gmic_g}"G'MIC"$_gmic_n replace_str "(no arg)",${_gmic_g}"(no arg)"$_gmic_n - if {!$_is_example" && "!$is_equivalent} + if !$_is_example" && "!$is_equivalent # Colorize parameters between single quotes. - s +,39 if {$!>=3} + s +,39 if $!>=3 ind=0 closing=0 do - if {"const ind = "$ind"; h#ind==1 && i#ind==39 && h#(ind+2)==1 && i#(ind+2)==39 && h#(ind+1)<48 && (im#(ind+1)>32 || "$is_default")"} + if "const ind = "$ind"; h#ind==1 && i#ind==39 && h#(ind+2)==1 && i#(ind+2)==39 && + h#(ind+1)<48 && (im#(ind+1)>32 || "$is_default")" l[$ind,{$ind+2}] rm (39,{'$_gmic_c'}) ({'$_gmic_n'},39) y endl ind+=2 fi ind+=1 - while {$ind<$!-3} + while $ind<$!-3 a y fi # Colorize parameters between braces '{}'. - s +,{'\{'} s +,{'\}'} if {$!>=3} + s +,{'\{'} s +,{'\}'} if $!>=3 ind=0 closing=0 do - if {"const ind = "$ind"; h#ind==1 && i#ind==123 && h#(ind+2)==1 && i#(ind+2)==125"} + if "const ind = "$ind"; h#ind==1 && i#ind==123 && h#(ind+2)==1 && i#(ind+2)==125" l[$ind,{$ind+2}] rm ({'$_gmic_g'},123) (125,{'$_gmic_n'}) y endl ind+=2 fi ind+=1 - while {$ind<$!-3} + while $ind<$!-3 a y fi # Colorize parameters between brackets '[]'. - s +,{'['} s +,{']'} if {$!>=3} + s +,{'['} s +,{']'} if $!>=3 ind=0 closing=0 do - if {"const ind = "$ind"; h#ind==1 && i#ind==91 && h#(ind+2)==1 && i#(ind+2)==93"} + if "const ind = "$ind"; h#ind==1 && i#ind==91 && h#(ind+2)==1 && i#(ind+2)==93" l[$ind,{$ind+2}] rm ({'$_gmic_c'},91) (93,{'$_gmic_n'}) y endl ind+=2 fi ind+=1 - while {$ind<$!-3} + while $ind<$!-3 a y fi - fi fi - v + repeat $! e[] $s{$>,t} v - done + repeat $! +e[] $s{$>,t} done _document_gmic_example_ascii : _document_gmic_footer_ascii : skip $1 + v 0 if $_shortcut # Document shortcuts. - ({'"Command shortcuts"'}) _document_gmic_subsection_ascii. v + e[] "" v - rm. - v + repeat $_shortcut - e[] " "$_gmic_m${_gmic_b}${_shortcut$>}" "${_shortcutqualifier$>}":"$_gmic_n" eq. to '"$_gmic_g${_shortcutlink$>}$_gmic_n"'." - done v - + ('"Command shortcuts"') _document_gmic_subsection_ascii. +e[] "" rm. + _document_gmic_sort_shortcuts[] + repeat $_shortcut + +e[] " "$_gmic_m${_gmic_b}${_sshortcut$>}" "${_sshortcutqualifier$>}":"$_gmic_n" eq. to '"\ + $_gmic_g${_sshortcutlink$>}$_gmic_n"'." + done fi - v + e[] "\n "$_gmic_c"[ Total number of commands: "$_command" ]"$_gmic_n v - + +e[] "\n "$_gmic_c"[ Total number of commands: "$_command" ]"$_gmic_n _document_gmic_split_ascii : - do if {w>$1} + do if w>$1 i={$1-1} - repeat {$1/2} if {C=i($1-1-$>);C==32||C==38||C==42||C==43||C==44||C==46||C==47||C==58||C==59||C==63||C==92||C==124} i={$1-1-$>} break - fi done + repeat $1/2 if isin(i($1-1-$>),32,38,42,43,44,46,47,58,59,63,92,124) i={$1-1-$>} break fi done +z. {$i+1},100% z.. 0,$i - fi while {w>$1} - if {$!>1" && "w<10} a[-2,-1] x fi + fi while w>$1 + if $!>1" && "w<10 a[-2,-1] x fi # Define document_gmic commands for bash auto-completion script output. _document_gmic_header_bash : skip $1 - v + - e[] "# + v 0 + +e[] "# \n# Bash completion rules for 'gmic'. \n# \n# This file has been generated automatically. @@ -2310,17 +3785,16 @@ \n_"$_name"() \n{ \n\tlocal cur prev opts coms -\n\t_init_completion || return -\n\tCOMPREPLY=() -\n\tcur=\"${COMP_WORDS[COMP_CWORD]}\" -\n\tprev=\"${COMP_WORDS[COMP_CWORD-1]}\" -" - v - - _opts= +\n\tif type -t _init_completion >/dev/null; then +\n\t\t_init_completion -n = || return +\n\telse +\n\t\tCOMPREPLY=() +\n\t\tcur=\"${COMP_WORDS[COMP_CWORD]}\" +\n\t\tprev=\"${COMP_WORDS[COMP_CWORD-1]}\" +\n\tfi" _coms= _argcommand=0 _shortcut=0 - _nbopts=0 _nbcoms=0 _document_gmic_subsection_bash : @@ -2328,30 +3802,33 @@ _document_gmic_example_bash : _document_gmic_declaration_bash : - _opts$_nbopts={0,t}" "-{0,t}" "--{0,t}" "+{0,t} - _nbopts+=1 - _coms$_nbcoms={0,t} _nbcoms+=1 - if {"s = ["{^}"]; s=='input' || s=='i' || s=='output' || s=='o' || s=='command' || s=='m'"} return fi # Manage special commands (remove arguments). + # Manage special commands (remove arguments). + if "s = ["{^}"]; "\ + "s=='input' || s=='i' || s=='output' || s=='o' || s=='command' || s=='m' || "\ + "s=='input_text' || s=='it' || s=='output_text' || s=='ot'" + return + fi - repeat $! if {[{^}]=='(+)'} rm[$<] fi done # Discard '(+)' qualifier. - if {$!==2" && "same([{^}],'"eq. to "',7)} # Command is a shortcut. + repeat $! if [{^}]=='(+)' rm[$<] fi done # Discard '(+)' qualifier. + if $!==2" && "same([{^}],'"eq. to "',7) # Command is a shortcut. rows. 7,100% autocrop. {'.'} autocrop. {'" "'} autocrop. 39 autocrop. {'-'} _shortcut$_shortcut={0,t} _shortcutlink$_shortcut=${str2hex\ {1,t}} rm. _shortcut+=1 - elif {$!>1} # Command is regular and has arguments. + elif $!>1 # Command is regular and has arguments. _command$_argcommand={0,t} - if {[{0,^}]=='help'} + if [{0,^}]=='help' _argument$_argcommand="$coms\" -- \"$cur" # Manage help command. else - if {$!==2} ({'>'}) fi # Add shadow parameter when single argument. + if $!==2 ('>') fi # Add shadow parameter when single argument. replace_str[^0] " ","_" replace_str[^0] "'","\\\\'" - i[2--2] ({'" "'}) a[^0] y + replace_str[^0] "\"","\\\\\"" + i[2--2] ('" "') a[^0] y _argument$_argcommand={1,t} fi _argumentlink${str2hex\ {0,t}}=${_argument$_argcommand} @@ -2359,34 +3836,42 @@ fi _document_gmic_footer_bash : skip $1 - + v 0 str_coms= repeat $_nbcoms str_coms=${str_coms}" "${_coms$>} done - v + - e[] "\tcoms=\""${str_coms}" \"" - e[] "\topts=$(echo \"\$coms\" | sed \"s: \\([^ ]\\+\\): \\1 -\\1 \\+\\1 --\\1:g\")" - e[] "\n\tcase \"${prev}\" in" + +e[] "\tcoms=\""${str_coms}" \"" + +e[] "\topts=$(echo \"\$coms\" | sed \"s: \\([^ ]\\+\\): \\1 -\\1 \\+\\1 --\\1:g\")" + +e[] "\n\tcase \"${prev}\" in" repeat $_argcommand # Regular commands with arguments. - if {'${_command$>}'!='i'" && "'${_command$>}'!='o'" && "!same('${_command$>}','input',5)" && "!same('${_command$>}','output',6)} - e[] "\t\t\""${_command$>}"\" | \"-"${_command$>}"\" | \"--"${_command$>}"\" | \"+"${_command$>}"\")\n\t\t "\ + if "s=['"${_command$>}"']; "\ + "s!='i' && s!='o' && s!='it' && s!='ot' && "\ + "!same(s,'input',5) && !same(s,'output',6)" + +e[] "\t\t\""${_command$>}"\" | \"-"${_command$>}"\" | \"--"${_command$>}"\" | \"+"${_command$>}"\")\n\t\t "\ "COMPREPLY=( $(compgen -W \""${_argument$>}"\") ); return 0;;" fi done repeat $_shortcut # Shortcut commands (with arguments). - if {['${_shortcut$>}']!='i'" && "['${_shortcut$>}']!='o'" && "narg(${_argumentlink${_shortcutlink$>}})} - e[] "\t\t\""${_shortcut$>}"\" | \"-"${_shortcut$>}"\" | \"--"${_shortcut$>}"\" | \"+"${_shortcut$>}"\") "\ + if "s=['"${_shortcut$>}"']; "\ + "s!='i' && s!='o' && s!='it' && s!='ot' && "narg(${_argumentlink${_shortcutlink$>}}) + +e[] "\t\t\""${_shortcut$>}"\" | \"-"${_shortcut$>}"\" | \"--"${_shortcut$>}"\" | \"+"${_shortcut$>}"\") "\ "COMPREPLY=( $(compgen -W \""${_argumentlink${_shortcutlink$>}}"\") ); return 0;;" fi done - e[] "\tesac\n + +e[] "\tesac\n \n\tCOMPREPLY=( $(compgen -W \"$opts\" -- \"$cur\") ) -\n\t_filedir +\n\tif type -t _filedir >/dev/null; then +\n\t\t_filedir +\n\telse +\n\t\tcomptopt -o filenames 2>/dev/null +\n\t\tCOMPREPLY=( $(compgen -f -- ${cur}) ) +\n\tfi \n} \ncomplete -F _"$_name" -o filenames gmic" - v - # Define document_gmic commands for html output. _document_gmic_header_html : - if $1 v + e[] " + v 0 + if $1 +e[] " \n \n \n @@ -2397,7 +3882,7 @@ \n \n \n" - v - fi + fi m "don : _document_gmic_desc_on_html" m "doff : _document_gmic_desc_off_html" m "eon : _document_gmic_ex_on_html" @@ -2407,55 +3892,49 @@ _shortcut=0 _document_gmic_desc_on_html : - v - if $_is_desc u "
    " else - u "

    " + u "

    " _is_desc=1 fi - v + _document_gmic_desc_off_html : - v - if $_is_desc u "

    " _is_desc=0 else u "" fi - v + _document_gmic_ex_on_html : - v - if $_is_ex u "" else - u "
    "\ + u "
    "\ "" _is_ex=1 fi - v + _document_gmic_ex_off_html : - v - if $_is_ex u "
    Example of use:
    " _is_ex=0 else u "" fi - v + _document_gmic_subsection_html : - v + - e[] ${-eoff}${-doff}"

    \"\"  "\ + v 0 + +e[] ${-eoff}${-doff}"
    \n

    \"\"  "\ ""{0,t}"

    " - v - _document_gmic_declaration_html : - if {[{^}]=='(+)'} qualifier=" "{t} rm. else qualifier="" fi + v 0 + if [{^}]=='(+)' qualifier=" (+)" rm. else qualifier="" fi s1="\n" s0=" |
    " - if {$!>1" && "same([{^}],'"eq. to "',7)} # Declaration of a shortcut command. + if $!>1" && "same([{^}],'"eq. to "',7) # Declaration of a shortcut command. rows. 7,100% autocrop. {'.'} autocrop. {'" "'} autocrop. 39 _shortcut$_shortcut={0,t} _shortcutlink$_shortcut={t} @@ -2463,65 +3942,73 @@ _shortcut+=1 else # Declaration of a regular command. _command_name={0,t} - v + - e[] ${-eoff}${-doff}"

      "{0,t}$qualifier":" - if {$!>1} - e[] "

    " - repeat {$!-1} l[{1+$>}] - if {h>48} v - replace_str ",",", " v + fi - e[] ""{0,t}""${s{$<==0}} + +e[] ${-eoff}${-doff}"


    "\ + ""{0,t}""$qualifier"   " + if $!>1 + +e[] "

    " + repeat $!-1 l[{1+$>}] + if h>48 replace_str ",",", " fi + +e[] ""{0,t}""${s{$<==0}} endl done - e[] "

    " - else e[] "" + +e[] "

    " + else +e[] "" fi - v - fi _document_gmic_description_html : + v 0 is_equivalent={same([{^}],"'(eq. to '",8)} is_default={same([{^}],"'Default value'",13)} replace_str "\\n","
    " - replace_str "G'MIC","G\47MIC" - replace_str "(no arg)","(no arg)" + replace_str "G'MIC","G\47MIC" + replace_str "(no arg)","(no arg)" + add_link_html. 1 - if {!$_is_example" && "!$is_equivalent} + if !$_is_example" && "!$is_equivalent # Colorize parameters between single quotes. - s +,39 if {$!>=3} + s +,39 if $!>=3 ind=0 closing=0 do - if {"const ind = "$ind"; h#ind==1 && i#ind==39 && h#(ind+2)==1 && i#(ind+2)==39 && h#(ind+1)<48 && (im#(ind+1)>32 || "$is_default")"} - l[$ind,{$ind+2}] rm (39,{'""'}) ({'""'},39) y endl + if "const ind = "$ind"; h#ind==1 && i#ind==39 && h#(ind+2)==1 && i#(ind+2)==39 && + h#(ind+1)<48 && (im#(ind+1)>32 || "$is_default")" + l[$ind,{$ind+2}] rm + ('""') + ('""') + y endl ind+=2 fi ind+=1 - while {$ind<$!-3} + while $ind<$!-3 a y fi # Colorize parameters between braces '{}'. - s +,{'\{'} s +,{'\}'} if {$!>=3} + s +,{'\{'} s +,{'\}'} if $!>=3 ind=0 closing=0 do - if {"const ind = "$ind"; h#ind==1 && i#ind==123 && h#(ind+2)==1 && i#(ind+2)==125"} - l[$ind,{$ind+2}] rm ({'""'},123) (125,{'""'}) y endl + if "const ind = "$ind"; h#ind==1 && i#ind==123 && h#(ind+2)==1 && i#(ind+2)==125" + l[$ind,{$ind+2}] + rm ({'""'},123) (125,{'""'}) y + endl ind+=2 fi ind+=1 - while {$ind<$!-3} + while $ind<$!-3 a y fi # Colorize parameters between brackets '[]'. - s +,{'['} s +,{']'} if {$!>=3} + s +,{'['} s +,{']'} if $!>=3 ind=0 closing=0 do - if {"const ind = "$ind"; h#ind==1 && i#ind==91 && h#(ind+2)==1 && i#(ind+2)==93"} + if "const ind = "$ind"; h#ind==1 && i#ind==91 && h#(ind+2)==1 && i#(ind+2)==93" l[$ind,{$ind+2}] rm ({'""'},91) (93,{'""'}) y endl ind+=2 fi ind+=1 - while {$ind<$!-3} + while $ind<$!-3 a y fi @@ -2529,101 +4016,132 @@ if $is_default # Reached line as '#@cli : Default value(s) : ... '. s +,{':'} l[^0] a y endl autocrop {':'} autocrop {'" "'} - v + - if {$!>1} e[] ${-don}"
    "{0,t}": "{t} - else e[] ${-don}"
    "{0,t} + if $!>1 + replace_str "ref_code","ref_defvals" + +e[] ${-don}"
    "{0,t}": "{t} + else + +e[] ${-don}"
    "{0,t} fi - v - elif $is_equivalent # Reached line as '#@cli : (eq. to shortcut)'. - replace_str "eq. to","equivalent to shorcut command" - s +,39 if {$!==5} i[2] ({'""'}) i[4] ({'""'}) y fi a y - v + e[] ${-don}""{t}"" v - + replace_str "eq. to","equivalent to shortcut command" + s +,39 if $!==5 rm[1,3] i[1] + ('""') + i[3] ('""') + y fi a y + +e[] ${-don}""{t}"" else # Reached line as '#@cli : description'. - if {(i<_'A'" || "i>_'Z')" && "i!=40" && "i!=39} v + e[] ${-don}" "{t} v - - else v + e[] ${-don}{t} v - + if (i<_'A'" || "i>_'Z')" && "i!=40" && "i!=39 +e[] ${-don}" "{t} + else +e[] ${-don}{t} fi - fi _document_gmic_example_html : - if {i==_'$'} # Link to a tutorial page. - if {h==1" && "i==_'$'} tuturl=https://gmic.eu/tutorial/_$_command_name.shtml + v 0 + if i==_'$' # Link to a tutorial page. + if h==1" && "i==_'$' tuturl=https://gmic.eu/tutorial/_$_command_name.shtml else autocrop {'$'} autocrop {'" "'} tuturl=https://gmic.eu/tutorial/{0,t}.shtml fi - v + - e[] ${-eon}"\"\""\ - "A tutorial page exists for this command." - v - + +e[] ${-eon}" + + A tutorial page exists for this command." else # Regular example. - if $_filename else # Generate picture only if the file doesn't yet exist. - m "foo : "{t} - l[] v -99 reset foo v -1 _document_gmic o $_filename,85 rm endl - uncommand foo - fi - v + - e[] ${-eon}"
    "\ - "\"\"
    "{t}"
    "{t}"" - v - + if !isfile(['{/$_filename}']) # Generate picture only if the file doesn't yet exist. + m "foo : "{/{t}} + l[] reset foo _document_gmic o $_filename,85 rm endl + um foo + fi + ('${-eon}"
    +
    "{t}"
    + "{t}""') + replace_str. " "$_command_name" "," "$_command_name" " + replace_str. " "$_command_name"."," "$_command_name"." + replace_str. " "$_command_name"["," "$_command_name"[" + replace_str. "+"$_command_name" ","+"$_command_name" " + replace_str. "+"$_command_name".","+"$_command_name"." + replace_str. "+"$_command_name"[","+"$_command_name"[" + replace_str. $_command_name"<",""$_command_name"<" + replace_str. ">"$_command_name,">"$_command_name"" + +e[] {t} + rm. fi _document_gmic_footer_html : skip $1 + v 0 if $_shortcut # Document shortcuts. _subsection+=1 - ({'"Command shortcuts"'}) _document_gmic_subsection_html. rm. - v + e[] "

    " + ('"Command shortcuts"') _document_gmic_subsection_html. rm. + _document_gmic_sort_shortcuts[] + +e[] "

    " repeat $_shortcut - e[] "  "${_shortcut$>}" "${_shortcutqualifier$>}":" - v - ({'${_shortcutlink$>}'}) scl={t} rm. v + - e[] "Shortcut for command '"${_shortcutlink$>}"'
    " - done - e[] "

    " v - - fi - v + - e[] ${-eoff}${-doff}"

    [ Total number of commands: "$_command" ]" - v - - uncommand don,doff,eon,eoff + +e[] "  "${_sshortcut$>}" "${_sshortcutqualifier$>}":" + ('${_sshortcutlink$>}') scl={t} rm. + +e[] "Shortcut for command '"${_sshortcutlink$>}\ + "'
    " + done + +e[] "

    " + fi + +e[] ${-eoff}${-doff}"

    [ Total number of \ + commands: "$_command" ]" + um don,doff,eon,eoff + +# Replace URL with HTML link in selected images of string. +# $1 can be { 0=open in same window (default) | 1=open in new window } +add_link_html : check "isbool(${1=0})" + repeat $! + _add_link_html[$>] $1,http:// + _add_link_html[$>] $1,https:// + done + +_add_link_html : + if $1 target=" target=\"_blank\"" fi + s +,{'"$2"'} + repeat $!-1 if {$>,crop()==['"$2"']} + l[{$>+1}] + s +,{'" "'} s[0] +,{')'} s[0] +,{']'} s[0] +,39 s[0] +,{'\"'} s[0] +,{'<'} + url="$2"{0,t} i[1] ('') y[1] + a y endl + rm[$>] i[$>] ('"$2"') y[$>] + fi done a y # Define document_gmic commands for images-only output. _document_gmic_header_images : skip $1 - use_vt100 - v + + v 0 use_vt100 e[] "\n - Generate example images from set of commands '"${_gmic_c}$_name${gmic_n}"'.\n" - if image.jpg else l[] sp pencils onfail testimage2d 400 endl o. image.jpg rm. fi - v - + if isfile('image.jpg') else l[] sp pencils onfail testimage2d 400 endl o. image.jpg rm. fi _document_gmic_subsection_images : - v + + v 0 e[] "\n "${_gmic_r}"** Section ""#"$_subsection": "{0,t}"."${_gmic_n}"\n" - v - + _document_gmic_declaration_images : _command_name={0,t} _document_gmic_description_images : _document_gmic_example_images : - if {i==_'$'} return fi - v + + v 0 + if i==_'$' return fi e[] " "${_gmic_c}"["$_example"]"${_gmic_n}" Command '"${_gmic_g}$_command_name${_gmic_n}"': $ "{t} - v - - if $_filename else # Generate picture only if the file doesn't yet exist. - m "foo"$_example" : "{t} - l[] v -1 reset v -99 etime=$| foo$_example etime={_round($|-$etime,0.01)} v -1 _document_gmic o $_filename,85 rm endl - uncommand foo$_example - v + + if !isfile(['{/$_filename}']) # Generate picture only if the file doesn't yet exist. + m "foo"$_example" : "{/{t}} + l[] + reset etime=$| foo$_example etime={_round($|-$etime,0.01)} _document_gmic o $_filename,85 rm + endl + um foo$_example e[] "\r "${_gmic_c}"["$_example"]"${_gmic_n}" Command '"${_gmic_g}$_command_name${_gmic_n}"': $ "{t}\ ${_gmic_m}" (done in "$_gmic_n${etime}"s"$_gmic_m")."$_gmic_n - v - fi _document_gmic_footer_images : skip $1 - v + + v 0 e[] " - [ All done! ]\n\n" - v - # Define document_gmic commands for LateX output. _document_gmic_header_latex : - if $1 v + - e[] "\\documentclass[a4paper,10.5pt,twoside]{book} + v 0 + if $1 + +e[] "\\documentclass[a4paper,10.5pt,twoside]{book} \n\\usepackage{hyperref,fancyhdr,graphicx,amssymb,amsmath,times,makeidx,color} \n\\graphicspath{{"$_path"}} \n\\pagestyle{fancyplain} @@ -2654,8 +4172,8 @@ \n\\makeindex \n\\begin{document} \n\\tableofcontents" - v - fi - v + e[] "\n\\chapter{List of commands}" v - + fi + +e[] "\n\\chapter{List of commands}" m "eon : _document_gmic_ex_on_latex" m "eoff : _document_gmic_ex_off_latex" _is_desc=0 @@ -2663,35 +4181,31 @@ _shortcut=0 _document_gmic_ex_on_latex : - v - if $_is_ex u "\\\\" else u "\\begin{center}" _is_ex=1 fi - v + _document_gmic_ex_off_latex : - v - if $_is_ex u "\\end{center}" _is_ex=0 else u "" fi - v + _document_gmic_subsection_latex : - _is_desc=0 + v 0 _is_desc=0 _document_gmic_replace_latex - v + e[] ${-eoff}"\n\\section{"{0,t}"}" v - + +e[] ${-eoff}"\n\\section{"{0,t}"}" _document_gmic_declaration_latex : - _is_desc=0 - if {[{^}]=='(+)'} qualifier={t} rm. else qualifier="" fi + v 0 _is_desc=0 + if [{^}]=='(+)' qualifier={t} rm. else qualifier="" fi e1="\\end{flushleft}" e0="~~~\\\\" - if {$!>1" && "same([{^}],'"eq. to "',7)} # Declaration of a shortcut command. + if $!>1" && "same([{^}],'"eq. to "',7) # Declaration of a shortcut command. _document_gmic_replace_latex rows. 7,100% autocrop. {'.'} autocrop. {'" "'} autocrop. 39 _shortcut$_shortcut={0,t} @@ -2701,83 +4215,82 @@ else # Declaration of a regular command. _document_gmic_replace_latex[0] _command_name={0,t} - v + e[] ${-eoff}"\n\n\\subsection{\\emph{"{0,t}"\\index{"{0,t}"}} "$qualifier"}\\vspace*{-0.7em}" - if {$!>1} - e[] "~\\\\\\textbf{\\Cb{Arguments: }}\\begin{flushleft}" - repeat {$!-1} l[{1+$>}] - v - s y,-60 if {$!>1} i[1--2] ({'\\-'}) fi y a y - _document_gmic_replace_latex v + - e[] "{\\small \\Cb{\\hspace*{0.5cm}$\\bullet$~~\\texttt{"{0,t}"}}}"${e{$<==0}} + +e[] ${-eoff}"\n\n\\subsection{\\emph{"{0,t}"\\index{"{0,t}"}} "$qualifier"}\\vspace*{-0.7em}" + if $!>1 + +e[] "~\\\\\\textbf{\\Cb{Arguments: }}\\begin{flushleft}" + repeat $!-1 l[{1+$>}] + s y,-60 if $!>1 i[1--2] ('\\-') fi y a y + _document_gmic_replace_latex + +e[] "{\\small \\Cb{\\hspace*{0.5cm}$\\bullet$~~\\texttt{"{0,t}"}}}"${e{$<==0}} endl done fi - v - fi _document_gmic_description_latex : + v 0 is_equivalent={same([{^}],"'(eq. to '",8)} is_default={same([{^}],"'Default value'",13)} s0="" s1="~\\\\" s=${s$_is_desc} _document_gmic_replace_latex if $is_default # Reached line as '#@cli : Default value(s) : ... '. s +,{':'} l[^0] a y endl autocrop {':'} autocrop {'" "'} - if {$!>1} + if $!>1 replace_str[1] " and ","} and \\\\texttt{" - v + e[] ${-eoff}"\\begin{flushleft}\\Cc{\\textbf{"{0,t}"}:\\\\~\\\\\\hspace*{0.5cm}{\\small $\\bullet$~~\\texttt{"{t}"}}}\\end{flushleft}" v - - else v + e[] ${-eoff}$s"~\\\\"{0,t} v - + +e[] ${-eoff}"\\begin{flushleft}\\Cc{\\textbf{"{0,t}"}:\\\\~\\\\\\hspace*{0.5cm}{\\small + $\\bullet$~~\\texttt{"{t}"}}}\\end{flushleft}" + else +e[] ${-eoff}$s"~\\\\"{0,t} fi elif $is_equivalent # Reached line as '#@cli : (eq. to 'shortcut').'. rows. 8,100% autocrop. {'.'} autocrop. {')'} autocrop. {'" "'} - v + e[] ${-eoff}$s"(\\emph{eq. to} {\\small \\texttt{"{t}"}})." v - + +e[] ${-eoff}$s"(\\emph{eq. to} {\\small \\texttt{"{t}"}})." else # Reached line as '#@cli : description'. - if {(i<_'A'" || "i>_'Z')" && "i!=40" && "i!=39} v + e[] ${-eoff}{t} v - - else v + e[] ${-eoff}$s{t} v - + if (i<_'A'" || "i>_'Z')" && "i!=40" && "i!=39 +e[] ${-eoff}{t} + else +e[] ${-eoff}$s{t} fi fi _is_desc=1 _document_gmic_example_latex : - if {i==_'$'} # Link to a tutorial page. - if {h==1" && "i==_'$'} tuturl=https://gmic.eu/tutorial/\\_$_command_name.shtml + v 0 + if i==_'$' # Link to a tutorial page. + if h==1" && "i==_'$' tuturl=https://gmic.eu/tutorial/\\_$_command_name.shtml else autocrop {'$'} autocrop {'" "'} tuturl=https://gmic.eu/tutorial/{0,t}.shtml fi - l[] ({'$tuturl'}) replace_str "_","\\_" - s x,-60 if {$!>1} i[1--2] ({'\\\\-'}) fi a x + l[] ('$tuturl') replace_str "_","\\_" + s x,-60 if $!>1 i[1--2] ('\\\\-') fi a x replace_str. "_","\\_" tuturl={t} rm endl - v + - e[] ${-eoff} - if {!$_is_ex} e[] "~\\\\" fi - e[] "~\\textbf{Tutorial page: }\\\\\\url{"$tuturl"}" - v - + +e[] ${-eoff} + if !$_is_ex +e[] "~\\\\" fi + +e[] "~\\textbf{Tutorial page: }\\\\\\url{"$tuturl"}" else # Regular example. _is_desc=0 - if $_filename else # Generate picture only if the file doesn't yet exist. - m "foo : "{t} - l[] v -99 reset foo v -1 _document_gmic o $_filename,85 rm endl - uncommand foo + if !isfile(['{/$_filename}']) # Generate picture only if the file doesn't yet exist. + m "foo : "{/{t}} + l[] reset foo _document_gmic o $_filename,85 rm endl + um foo fi _document_gmic_replace_latex - v + - e[] ${-eon}"\\includegraphics[keepaspectratio=true,height=6cm,width=\\textwidth]{"$_filename"}\\\\" - e[] "{\\footnotesize \\textbf{Example "$_example"~:} \\texttt{"{t}"}}" - v - + +e[] ${-eon}"\\includegraphics[keepaspectratio=true,height=6cm,width=\\textwidth]{"$_filename"}\\\\" + +e[] "{\\footnotesize \\textbf{Example "$_example"~:} \\texttt{"{t}"}}" fi _document_gmic_footer_latex : + v 0 if $_shortcut # Document shortcuts. - ({'"Command shortcuts"'}) _document_gmic_subsection_latex. rm. - v + repeat $_shortcut - e[] "$\\bullet$~'\\texttt{\\Ca{"${_shortcut$>}"}}' "${_shortcutqualifier$>}"~is equivalent to~~'\\texttt{\\Ca{"${_shortcutlink$>}"}}'.\\\\" - done v - + ('"Command shortcuts"') _document_gmic_subsection_latex. rm. + _document_gmic_sort_shortcuts[] + repeat $_shortcut + +e[] "$\\bullet$~'\\texttt{\\Ca{"${_sshortcut$>}"}}' "${_sshortcutqualifier$>}"~is equivalent + to~~'\\texttt{\\Ca{"${_sshortcutlink$>}"}}'.\\\\" + done fi if $1 - v + - e[] " + +e[] " \n\\printindex \n~\\\\$\\square$~End of document. \n\n\\end{document}" - v - fi - uncommand eon,eoff + um eon,eoff _document_gmic_replace_latex : replace_str "\\","\\\\textbackslash " # Replace '\' @@ -2797,44 +4310,50 @@ # Define document_gmic commands for man page output. _document_gmic_header_man : skip $1 - _gmic_n="\\fR" _gmic_b="\\fB" _gmic_r="" _gmic_g="" _gmic_c="\\fB" _gmic_m="" + _gmic_n="\\fR" + _gmic_b="\\fB" + _gmic_r="" + _gmic_g="" + _gmic_c="\\fB" + _gmic_m="" _document_gmic_header_ascii $"*" _document_gmic_subsection_man : - v + - e[] "\n "$_gmic_b"** "{0,t}":"$_gmic_n - v - + v 0 + +e[] "\n ** \\fI"{0,t}":\\fR" _document_gmic_declaration_man : - if {[{^}]=='(+)'} qualifier=" "{t} rm. else qualifier="" fi - if {$!>1" && "same([{^}],'"eq. to "',7)} # Declaration of a shortcut command. + v 0 + if [{^}]=='(+)' qualifier=" "{t} rm. else qualifier="" fi + if $!>1" && "same([{^}],'"eq. to "',7) # Declaration of a shortcut command. rows. 7,100% autocrop. {'.'} autocrop. {'" "'} autocrop. 39 _shortcut$_shortcut={0,t} _shortcutlink$_shortcut={t} _shortcutqualifier$_shortcut=$qualifier _shortcut+=1 else # Declaration of a regular command. - v + e[] "\n "${_gmic_b}{0,t}${qualifier}":"$_gmic_n v - rm[0] + +e[] "\n "${_gmic_b}{0,t}${qualifier}":"$_gmic_n rm[0] if $! s=" " y x - repeat {$!-1} ({'" |"'}) a[$>,-1] x done # Insert ' |'. + repeat $!-1 ('" |"') a[$>,-1] x done # Insert ' |'. repeat $! l[$>] _document_gmic_split_ascii 80 - repeat {$!-1} ({'\n$s" "'}) a[$>,-1] x done - a x v + e[] $s{0,t} v - + repeat $!-1 ('\n$s" "') a[$>,-1] x done + a x +e[] $s{0,t} endl done fi - v + e[] "" v - + +e[] "" fi _document_gmic_description_man : + v 0 s=" " bs0="\n" bs1="\\\\\n " - y x if {!narg($_is_tutorial)} _document_gmic_split_ascii 96 fi - repeat {$!-1} ({'${bs_is_example}$s" "'}) a[$>,-1] x done a x - replace_str "Default values:","Default values:" - replace_str "Default value:","Default value:" + y x if !narg($_is_tutorial) _document_gmic_split_ascii 96 fi + repeat $!-1 ('${bs$_is_example}$s" "') a[$>,-1] x done a x + replace_str "Default values:",${bs0}${s}"\\fIDefault values:\\fR" + replace_str "Default value:",${bs0}${s}"\\fIDefault value:\\fR" replace_str "\\","\\\\" - v + repeat $! e[] $s{$>,t} v - done + repeat $! +e[] $s{$>,t} done _document_gmic_example_man : @@ -2846,22 +4365,22 @@ repeat $! l[$>] W$>={w} H$>={h} D$>={d} S$>={s} IS_3D$>=${-_is_3d} endl done repeat $! l[$>] if ${IS_3D$>} r3d 1,1,0,-80 r3d 0,1,0,80 snapshot3d 400 - else if {w>8192} z 0,8191 elif {h>8192} rows 0,8191 fi n 0,255 + else if w>8192 z 0,8191 elif h>8192 rows 0,8191 fi n 0,255 fi endl done - +append_tiles 2 if {w>1024} r={round(1024*100/w,0.1)} r[^-1] $r%,$r%,1,100%,2 fi rm. + +append_tiles 2 if w>1024 r={round(1024*100/w,0.1)} r[^-1] $r%,$r%,1,100%,2 fi rm. repeat $! l[$>] - if {s==1} r {w},{h},1,3 else r {w},{h},1,3,0 fi - if {w<=h&&h<256} r2dy 256,2 elif {h<=w&&w<256} r2dx 256,2 fi - if {w<=h&&h>512} r2dy 512,2 elif {h<=w&&w>512} r2dx 512,2 fi - if {h<48} r 100%,48 fi - if {w<48} r 48,100% fi + if s==1 r {w},{h},1,3 else r {w},{h},1,3,0 fi + if w<=h" && "h<256 r2dy 256,2 elif h<=w" && "w<256 r2dx 256,2 fi + if w<=h" && "h>512 r2dy 512,2 elif h<=w" && "w>512 r2dx 512,2 fi + if h<48 r 100%,48 fi + if w<48 r 48,100% fi frame 1,1,0 frame 4,4,255 endl done N=$! repeat $N l[$>] {w},16,1,3,255 - if {w>75} - if {$N>1} if {w>110} t. Image\ [$>]:,3,3,15 else t. [$>]:,3,3,15 fi fi + if w>75 + if $N>1 if w>110 t. Image\ [$>]:,3,3,15 else t. [$>]:,3,3,15 fi fi if ${IS_3D$>} 0 t. (3d\ object),0,0,13,1,255 else 0 t. (${W$>}x${H$>}x${D$>}x${S$>}),0,0,13,1,255 fi @@ -2871,27 +4390,43 @@ rv[-2,-1] a[-2,-1] y endl done - 255 append_tiles 2 + 255 - if {w<256} - 255 r 256,100%,1,3,0,0,0.5,0.5 + 255 fi - if {h<256} - 255 r 100%,256,1,3,0,0,0.5,0.5 + 255 fi + if w<256 - 255 r 256,100%,1,3,0,0,0.5,0.5 + 255 fi + if h<256 - 255 r 100%,256,1,3,0,0,0.5,0.5 + 255 fi + +# Sort shortcut by lexicographic order and generate new sorted variables 'sshortcut_?'. +_document_gmic_sort_shortcuts : + $_shortcut,1,1,1,x s x repeat $! nm[$>] ${_shortcut$>} done sort_list +,n a x + repeat w i={i[$>]} + _sshortcut$>,_sshortcutqualifier$>,_sshortcutlink$>=${_shortcut$i},${_shortcutqualifier$i},${_shortcutlink$i} + done + rm + +# Append a newline character at the end of all string images of the list. +append_newline : + eval "for (ind = 0, ind=0,y0,x1>=0,y1,...,xn>=0,yn #@cli : Insert continuous 1D function from specified list of keypoints (xk,yk) @@ -2900,13 +4435,13 @@ #@cli : $ function1d 1,0,0,10,30,40,20,70,30,80,0 +display_graph 400,300 function1d : check "${1=1}>=0 && $1<=1" skip ${2=0},${3=0} e[^-1] "Input continuous 1D function, with smoothness $1 and keypoints (${2--1})." - v - l[] + l[] # Sort and normalize input keypoints. smoothness={max(0,min(1,$1))} (${2--1}) r 2,{int(w/2)},1,1,-1 sort +,y s x size={0,if(iM>=0,1+int(iM),0)} - if {!$size} rm 0 break fi + if !$size rm 0 break fi a x # Compute slopes for splines. @@ -2914,14 +4449,14 @@ # Determine spline coefficients for each part of the curve. $size,1,1,1,-1 - repeat {0,h-1} + repeat h#0-1 x0={0,i(0,$>)} y0={0,i(1,$>)} x1={0,i(0,$>+1)} y1={0,i(1,$>+1)} slope={($y1-$y0)/max(0.01,$x1-$x0)} yp0={0,i(2,$>)*$smoothness+(1-$smoothness)*$slope} yp1={0,i(2,$>+1)*$smoothness+(1-$smoothness)*$slope} i={round($x0,1,1)} j={round($x1,1,0)} line[1] $i,0,$j,0,1,$> - if {$j-$i<=1} # Linear interpolation for very close points. + if $j-$i<=1 # Linear interpolation for very close points. ({$y0-$x0*$slope}^{$slope}^0^0) else # Cubic interpolation otherwise. (1,$x0,{($x0)^2},{($x0)^3};\ @@ -2929,7 +4464,7 @@ 0,1,{2*$x0},{3*($x0)^2};\ 0,1,{2*$x1},{3*($x1)^2}) ($y0;$y1;$yp0;$yp1) - solve. .. rm.. y. c + invert.. mmul[-2,-1] y. c fi done a[2--1] x map.. . rm. @@ -2938,55 +4473,19 @@ 100%,1,1,1,1 (0,{w-1}) r. {-2,w},1,1,1,3 round. +sqr. +*[-2,-1] a[-4--1] c *[-2,-1] s. c +[-4--1] rm.. - endl v + - -#@cli gmicky -#@cli : Insert new image of the G'MIC mascot 'Gmicky'. -gmicky : - gmicky_deevad nm. [gmicky] - -#@cli gmicky_deevad -#@cli : Insert new image of the G'MIC mascot 'Gmicky', by David Revoy. -#@cli : $ gmicky_deevad -gmicky_deevad : - e[^-1] "Insert image of the G\47MIC mascot 'Gmicky', by David Revoy." - v - - filename=${_path_rc}gmicky_large_deevad.cimgz - if $filename $filename - else https://gmic.eu/img/gmicky_large_deevad.cimgz o. $filename +. 0 - fi - nm. [gmicky_deevad] - v + - -#@cli gmicky_mahvin -#@cli : Insert new image of the G'MIC mascot 'Gmicky', by Mahvin. -#@cli : $ gmicky_mahvin -gmicky_mahvin : - e[^-1] "Insert image of the G\47MIC mascot 'Gmicky', by Mahvin." - v - - filename=${_path_rc}gmicky_large_mahvin.cimgz - if $filename $filename - else https://gmic.eu/img/gmicky_large_mahvin.cimgz o. $filename +. 0 - fi - nm. [gmicky_mahvin] - v + - -#@cli gmicky_wilber -#@cli : Insert new image of the G'MIC mascot 'Gmicky' together with GIMP mascot 'Wilber', by Mahvin. -#@cli : $ gmicky_wilber -gmicky_wilber : - e[^-1] "Insert image of the G\47MIC mascot 'Gmicky' together with GIMP mascot 'Wilber', by Mahvin." - v - - filename=${_path_rc}gmicky_wilber_large.cimgz - if $filename $filename - else https://gmic.eu/img/gmicky_wilber_large.cimgz o. $filename +. 0 - fi - nm. [gmicky_wilber] v + + endl #@cli i : eq. to 'input'. : (+) -#@cli input : [type:]filename : [type:]http://URL : [selection]x_nb_copies>0 : { width>0[%] | [image_w] },{ _height>0[%] | [image_h] },{ _depth>0[%] | [image_d] },{ _spectrum>0[%] | [image_s] },_{ value1,_value2,... | 'formula' } : (value1{,|;|/|^}value2{,|;|/|^}...) : 0 : (+) -#@cli : Insert a new image taken from a filename or from a copy of an existing image [indice], +#@cli input : \ +# [type:]filename : \ +# [type:]http://URL : \ +# [selection]x_nb_copies>0 : \ +# { width>0[%] | [image_w] },{ _height>0[%] | [image_h] },{ _depth>0[%] | [image_d] },{ _spectrum>0[%] \ +# | [image_s] },_{ value1,_value2,... | 'formula' } : \ +# (value1{,|;|/|^}value2{,|;|/|^}...[:{x|y|z|c|,|;|/|^}]) : \ +# 0 : (+) +#@cli : Insert a new image taken from a filename or from a copy of an existing image [index], #@cli : or insert new image with specified dimensions and values. Single quotes may be omitted in #@cli : 'formula'. Specifying argument '0' inserts an 'empty' image. #@cli : (eq. to 'i' | (no arg)). @@ -2996,40 +4495,43 @@ #@cli : $ image.jpg (1,2,3;4,5,6;7,8,9) (255^128^64) 400,400,1,3,'if(x>w/2,x,y)*c' #@cli : $$ +#@cli input_565 : filename,width>0,height>0,reverse_endianness={ 0 | 1 } +#@cli : Insert image data from a raw RGB-565 file, at the end of the list. +#@cli : Default value: 'reverse_endianness=0'. +input_565 : check "isint($2) && $2>0 && isint($3) && $3>0 && isbool(${4=0})" + e[^-1] "Input raw RGB-565 file '$1', with size $2x$3." + l[] raw:"$1",ushort if $4 endian ushort fi + r $2,$3,1,1,-1 +>> 5 &. 63 +&.. 31 >>... 11 *[-3,-1] 8 *.. 4 a c endl + #@cli input_cube : "filename",_convert_1d_cluts_to_3d={ 0 | 1 }. #@cli : Insert CLUT data from a .cube filename (Adobe CLUT file format). #@cli : Default value: 'convert_1d_cluts_to_3d=1'. input_cube : skip ${2=1} - e[^-1] "Input CLUT from file '$1'." - v - l[] - i raw:"$1",uchar - f "i<_' ' && i!=10?_' ':i" + e[^-1] "Input CLUT from file '$1'" + l[] + it[] "$1" f "i<_' ' && i!=10?_' ':i" s -,10 i[0] 0 range={" - line = vector512(); + ref(vector128(),line); dmin = [ 0,0,0 ]; dmax = [ 1,1,1 ]; dim = size = 0; target = 0; - pos = 0; - while (pos=0, - do ( + ):( + val = stov(line); + !isnan(val)?do ( i[#0,target++] = val; ind = find(line,_' '); - if (ind<0, break()); + ind<0?break(); copy(line[0],line[ind + 1],size(line) - ind); val = stov(line); - ,_(while); val>=0); - ))))); - pos = ++npos; + ,_(while); !isnan(val)); + ); ); [dmin,dmax];"} - rm. + k[0] permute yzcx - if {[$range]!=[0,0,0,1,1,1]} + if [$range]!=[0,0,0,1,1,1] f "begin( range = ["$range"]; dmin = range[0,3]; @@ -3072,43 +4574,84 @@ (I - dmin)*255/delta" else * 255 fi - if {"w>1 && h==1 && d==1 && $2"} size={w} s c y.. y y. z r $size,$size,$size a c fi + if "w>1 && h==1 && d==1 && $2" size={w} s c y.. y. z r $size,$size,$size a c fi nm "$1" - endl v + + endl + +#@cli input_flo : "filename" +#@cli : Insert optical flow data from a .flo filename (vision.middlebury.edu file format). +input_flo : + e[^-1] "Input optical flow from file '$1'" + l[] + i raw:"$1",float + if i!=202021.25 endian. fi + if i!=202021.25 error[0--3] "Command 'input_flo': Filename '$1' is not a valid .flo file." return fi + +rows 1,2 cast. float,uint w,h={^} rm. + rows 3,100% r 2,$w,$h,1,-1 permute yzcx + endl #@cli ig : eq. to 'input_glob'. ig : - _input_glob "$*" + v + _input_glob "$*" #@cli input_glob : pattern #@cli : Insert new images from several filenames that match the specified glob pattern. +#@cli : (eq. to 'ig'). input_glob : _input_glob "$*" _input_glob : e[0--3] "Input all files that match glob pattern '$*'." - v - files 3,"$*" N=$! m "_ig : $""=arg repeat $""# i ${arg{1+$>}} done" - _ig ${} uncommand _ig - if {$N==$!} v + error[0--3] "Command 'input_glob': No matching filenames for pattern '$*'." fi - v + + _ig ${} um _ig + if $N==$! error[0--3] "Command 'input_glob': No matching filenames for pattern '$*'." fi #@cli input_gpl : filename #@cli : Input specified filename as a .gpl palette data file. input_gpl : e[^-1] "Input .gpl palette file '$*'." - v - l[] - i raw:"$*",char replace 9,32 s -,10 + l[] + it[] "$*" discard 13 replace 9,32 s -,10 colors=0 repeat $! l[$>] s -,32 - if {$!>=3" && "isint({0,t})" && "isint({1,t})" && "isint({2,t})} colors=$colors;{0,t},{1,t},{2,t} fi + if $!>=3" && "isint({0,t})" && "isint({1,t})" && "isint({2,t}) colors=$colors;{0,t},{1,t},{2,t} fi rm 0 onfail rm 0 endl done rm ($colors) rows 1,100% nm "$1" permute yzcx - endl v + + endl + +#@cli it : eq. to 'input_text'. +it : + e[^-1] "Input text-data file '$*'." + i raw:"$*",uchar + +#@cli input_text : filename +#@cli : Input specified text-data filename as a new image. +#@cli : (eq. to 'it'). +input_text : + e[^-1] "Input text-data file '$*'." + i raw:"$*",uchar + +# Merge multi-lines (lines continued by backslash before NL) in a string image. +merge_multiline : + discard {'\r'} + eval[^] "*i==_'\\' && j[-1]!=_'\\' && j[+1]==_'\n'?( + for (p = 2, j[p] && j[p]<=_' ' && j[p]!=_'\n', ++p); copy(i(),-1,p,1,0))" + discard -1 + +# Merge multi-line comments in a string image. +merge_multiline_comments : + discard {'\r'} + eval[^] "*i==_'\\' && j[-1]!=_'\\' && j[+1]==_'\n' && j[+2]==_'#'?( + for (p = 3, j[p] && j[p]<=_' ' && j[p]!=_'\n', ++p); copy(i(),-1,p,1,0))" + discard -1 + +#@cli network : mode={ -1=disabled | 0=enabled w/o timeout | >0=enabled w/ specified timeout in seconds } : (+) +#@cli : Enable/disable load-from-network and set corresponding timeout. +#@cli : (Default mode is 'enabled w/o timeout'). #@cli o : eq. to 'output'. : (+) @@ -3117,16 +4660,29 @@ #@cli : (eq. to 'o'). #@cli : Default value: 'format_options'=(undefined). -#@cli output_cube : filename +#@cli output_565 : "filename",reverse_endianness={ 0=false | 1=true } +#@cli : Output selected images as raw RGB-565 files. +#@cli : Default value: 'reverse_endianness=0'. +output_565 : check "isbool(${2=0})" + e[^-1] "Output image$? as raw RGB-565 file '$1'." + N=$! repeat $N +l[$>] + s c c 0,255 /[-3,-1] 8 /.. 4 round + bsl... 11 bsl.. 5 + + if $N>1 fn=${"filename \"$1\",$>"} else fn="$1" fi + if $2 endian ushort fi + o raw:$fn,ushort rm + endl done is_change 0 + +#@cli output_cube : "filename" #@cli : Output selected CLUTs as a .cube file (Adobe CLUT format). output_cube : e[^-1] "Output CLUT$? as file '$1'." - v - N=$! repeat $N +l[$>] to_rgb + N=$! repeat $N +l[$>] to_rgb l={round((w*h*d)^(1/3))} - if {w*h*d!=$l^3} v + error "Command '$0': CLUT '"{n}"' has invalid dimensions "({w},{h},{d},{s}). fi + if w*h*d!=$l^3 error "Command '$0': CLUT '"{n}"' has invalid dimensions "({w},{h},{d},{s}). fi r $l,$l,$l,3,-1 permute cxyz / 255 - if {$N>1} fn=${"filename \"$1\",$>"} else fn="$1" fi - o dlm:$fn rm i raw:$fn,uchar replace {','},32 + if $N>1 fn=${"filename \"$1\",$>"} else fn="$1" fi + o dlm:$fn rm it[] $fn replace {','},32 0 nm. $fn basename={b} rm. header="\# Created by: G'MIC (https://gmic.eu)\n"\ "TITLE \""$basename"\"\n\n"\ @@ -3136,137 +4692,158 @@ "DOMAIN_MIN 0.0 0.0 0.0\n"\ "DOMAIN_MAX 1.0 1.0 1.0\n\n"\ "# LUT data points\n" - i[0] ({'$header'}) - y a y o raw:$fn,uchar rm - endl done v + + i[0] ('$header') + y a y ot $fn rm + endl done is_change 0 + +#@cli output_flo : "filename" +#@cli : Output selected optical flow as a .flo file (vision.middlebury.edu file format). +output_flo : + e[^-1] "Output optical flow$? as file '$1'." + N=$! repeat $N +l[$>] + w,h={[w,h]} + channels 0,1 permute cxyz i[0] (202021.25) i[1] ($w,$h) cast[1] uint,float y a y + if $N>1 fn=${"filename \"$1\",$>"} else fn="$1" fi + o raw:$fn,float rm + endl done is_change 0 #@cli output_ggr : filename,_gradient_name #@cli : Output selected images as .ggr gradient files (GIMP). #@cli : If no gradient name is specified, it is deduced from the filename. output_ggr : skip "${2=}" e[^-1] "Output image$? as .ggr gradient file '$1'." - v - N=$! + N=$! repeat $N +l[$>] r 1,{w*h*d},1,100%,-1 to_rgba / 255 - if {narg("$2")} name="$2" - else l[] 1 nm. "$1" ({'{b}'}) f "if(x==0 && i>=_'a' && i<=_'z',i-_'a'+_'A',i)" name={t} rm endl + if narg("$2") name="$2" + else l[] 1 nm. "$1" ('{b}') f "if(x==0 && i>=_'a' && i<=_'z',i-_'a'+_'A',i)" name={t} rm endl fi - ({'"GIMP Gradient\nName: "$name\n{0,h}\n'}) - repeat {0,h} + ('"GIMP Gradient\nName: "$name\n{0,h}\n') + repeat h#0 start={_$>/{0,h}} end={_($>+1)/{0,h}} mid={_0.5*($start+$end)} rgba={0,I(0,$>)} r={arg(1,$rgba)} g={arg(2,$rgba)} b={arg(3,$rgba)} a={arg(4,$rgba)} - ({'$start" "$mid" "$end" "$r" "$g" "$b" "$a" "$r" "$g" "$b" "$a" 0 0\n"'}) + ('$start" "$mid" "$end" "$r" "$g" "$b" "$a" "$r" "$g" "$b" "$a" 0 0\n"') done rm[0] a x - if {$N>1} o raw:${"filename \"$1\",$>"},char else o raw:"$1",char fi + if $N>1 ot ${"filename \"$1\",$>"} else ot "$1" fi rm - endl done v + + endl done is_change 0 + +#@cli ot : eq. to 'output_text'. +ot : + _gmic_s="$?" v + _output_text "$*" + +#@cli output_text : filename +#@cli : Output selected images as text-data filenames. +#@cli : (eq. to 'ot'). +output_text : + _gmic_s="$?" v + _$0 "$1" + +_output_text : + e[0--3] "Output image"$_gmic_s" as text-data file '$1'." + o raw:"$1",uchar #@cli on : eq. to 'outputn'. on : - v - _gmic_s="$?" v + - _outputn $* + _gmic_s="$?" v + _outputn $* -#@cli outputn : filename +#@cli outputn : filename,_index #@cli : Output selected images as automatically numbered filenames in repeat...done loops. #@cli : (eq. to 'on'). outputn : - v - _gmic_s="$?" v + - _$0 $* + _gmic_s="$?" v + _$0 $* _outputn : - v - filename=${filename\ "$1",$>} v + + if $#==1 filename=${filename\ "$1",$>} + else filename=${filename\ "$1",$2} + fi e[0--3] "Output image"$_gmic_s" as file '"$filename"'." - v - o $filename v + + o $filename #@cli op : eq. to 'outputp'. op : - v - _gmic_s="$?" v + - _outputp $* + _gmic_s="$?" v + _outputp $* #@cli outputp : prefix #@cli : Output selected images as prefixed versions of their original filenames. #@cli : (eq. to 'op'). #@cli : Default value: 'prefix=_'. outputp : - v - _gmic_s="$?" v + - _$0 $* + _gmic_s="$?" v + _$0 $* _outputp : skip ${1="_"} - if {$!>1} e[0--4] "Output image"$_gmic_s" as their initial locations, prefixed by '$1'." + if $!>1 e[0--4] "Output image"$_gmic_s" as their initial locations, prefixed by '$1'." else e[0--4] "Output image"$_gmic_s" as its initial location, prefixed by '$1'." fi - v - repeat $! o[$>] {$>,f}$1{$>,b}.{$>,x} done v + + repeat $! o[$>] {$>,f}$1{$>,b}.{$>,x} done #@cli ow : eq. to 'outputw'. ow : - v - _gmic_s="$?" v + - _outputw + _gmic_s="$?" v + _outputw #@cli outputw -#@cli : Output selected images by overwritting their original location. +#@cli : Output selected images by overwriting their original location. #@cli : (eq. to 'ow'). outputw : - v - _gmic_s="$?" v + - _$0 $* + _gmic_s="$?" v + _$0 $* _outputw : - if {$!>1} e[0--4] "Output image"$_gmic_s" as their initial location." + if $!>1 e[0--4] "Output image"$_gmic_s" as their initial location." else e[0--4] "Output image"$_gmic_s" as its initial location." fi - v - repeat $! o[$>] {$>,n} done v + + repeat $! o[$>] {$>,n} done #@cli ox : eq. to 'outputx'. ox : - v - _gmic_s="$?" v + - _outputx $* + _gmic_s="$?" v + _outputx $* #@cli outputx : extension1,_extension2,_...,_extensionN,_output_at_same_location={ 0 | 1 } #@cli : Output selected images with same base filenames but for N different extensions. #@cli : (eq. to 'ox'). #@cli : Default value: 'output_at_same_location=0'. outputx : - v - _gmic_s="$?" v + - _$0 $* + _gmic_s="$?" v + _$0 $* _outputx : - v - $=arg is_last_arg=0 is_same_location=0 - if {isval($-1)} is_last_arg={isint($-1)&&$-1>=0&&$-1<=1} is_same_location=$-1 fi + if isnum($-1) is_last_arg={isint($-1)" && "$-1>=0" && "$-1<=1} is_same_location=$-1 fi N={$#-$is_last_arg} s0= s1=s - if {!$N} v + e[0--3] "Output image"$_gmic_s" at same location, with same base filename but extension '' (skipped, no extension provided)." return + if !$N e[0--3] "Output image"$_gmic_s" at same location, with same base filename but extension '' + (skipped, no extension provided)." return fi if $is_same_location - v + - if $is_last_arg e[0--4] "Output image"$_gmic_s" at same location, with same base filename but extension"${s{$N>1}}"' ${^-1}'." - else e[0--4] "Output image"$_gmic_s" at same location, with same base filename but extension"${s{$N>1}}" '$*'." + if $is_last_arg + e[0--4] "Output image"$_gmic_s" at same location, with same base filename but extension"${s{$N>1}}"' ${^-1}'." + else + e[0--4] "Output image"$_gmic_s" at same location, with same base filename but extension"${s{$N>1}}" '$*'." fi - v - repeat $! l[$>] - repeat $N o {0,f}{0,b}.${arg{1+$>}} done + repeat $! l[$>] + repeat $N ext=${arg{1+$>}} if ext=lowercase(['$ext']);ext=='jpg'||ext=='jpeg' ext.=,85 fi o {0,f}{0,b}.$ext done endl done else - v + if $is_last_arg e[0--4] "Output image"$_gmic_s" with same base filename but extension"${s{$N>1}}"' ${^-1}'." else e[0--4] "Output image"$_gmic_s" with same base filename but extension"${s{$N>1}}" '$*'." fi - v - repeat $! l[$>] - repeat $N o {0,b}.${arg{1+$>}} done + repeat $! l[$>] + repeat $N ext=${arg{1+$>}} if ext=lowercase(['$ext']);ext=='jpg'||ext=='jpeg' ext.=,85 fi o {0,b}.$ext done endl done fi - v + -#@cli pass : _shared_state={ 0=non-shared (copy) | 1=shared | 2=adaptive } : (+) +#@cli pass : _shared_state={ -1=status only | 0=non-shared (copy) | 1=shared | 2=adaptive } : (+) #@cli : Insert images from parent context of a custom command or a local environment. #@cli : Command selection (if any) stands for a selection of images in the parent context. -#@cli : By default (adaptive shared state), selected images are inserted in a shared state if they do not belong to the context (selection) of the current custom command or local environment as well. +#@cli : By default (adaptive shared state), selected images are inserted in a shared state if they do not belong +#@cli : to the context (selection) of the current custom command or local environment as well. #@cli : Typical use of command 'pass' concerns the design of custom commands that take images as arguments. +#@cli : This commands return the list of corresponding indices in the status. #@cli : Default value: 'shared_state=2'. #@cli : $ command "average : pass$""1 add[^-1] [-1] remove[-1] div 2" sample ? +mirror y +average[0] [1] -#@cli plot : _plot_type,_vertex_type,_xmin,_xmax,_ymin,_ymax,_exit_on_anykey={ 0 | 1 } : 'formula',_resolution>=0,_plot_type,_vertex_type,_xmin,xmax,_ymin,_ymax,_exit_on_anykey={ 0 | 1 } : (+) +#@cli plot : _plot_type,_vertex_type,_xmin,_xmax,_ymin,_ymax,_exit_on_anykey={ 0 | 1 } : \ +# 'formula',_resolution>=0,_plot_type,_vertex_type,_xmin,xmax,_ymin,_ymax,_exit_on_anykey={ 0 | 1 } : (+) #@cli : Display selected images or formula in an interactive viewer (use the instant display window [0] if opened). #@cli : 'plot_type' can be { 0=none | 1=lines | 2=splines | 3=bar }. #@cli : 'vertex_type' can be { 0=none | 1=points | 2,3=crosses | 4,5=circles | 6,7=squares }. @@ -3279,28 +4856,6 @@ #@cli : Output information on selected images, on the standard error (stderr). #@cli : (eq. to 'p'). -#@cli rainbow_lut -#@cli : Input a 256-entries RGB colormap of rainbow colors. -#@cli : $ image.jpg rainbow_lut +luminance[-2] map[-1] [-2] -rainbow_lut : - e[^-1] "Input RGB colormap of 256 rainbow colors." - v - - base642img "MiB1bnNpZ25lZF9jaGFyIGxpdHRsZV9lbmRpYW4KMjU2IDEgMSAzICM2MjgKeJxj4uLl5Rfg5xcSl5JXVFVT19LS0dXR0dXVAdK6hkYmZuYWlhYWlpZWllZW1lY21lbWIGBjAyatIcDKysrCwszYQEddUYSVgYERjKAEHKDycABWSSOnwKi03LLGzgkz5q3YtH3f8fNX7zx+9ubTt1/////9+/fP71+/fv748f3Ht2/fvn77+vXrNyj4CgJfgBAGvgCZn9+/fvbozo3LZ04e2rdjw+olC2ZM6GqqKspOCPdztTTSU5MXZmXm4uMXFBIWEhaXlJNXVlUHetvA0MjYxNTC2t7JycXV3dPL28fH18/fPyAwMCgoOAQEQkPDgCA8IhxERURGRsXExCUkp2Vk55dW1DV19E2dvXD5mg2bNm/eBAQbN27cAATr165dt3bNaqxg7dq16zcAlW7dtmPXrn0HDh4+duLkmXMXL184d+rooX07t21as3zR3BkTulvqK4tz0pJiwv29XR3srMxNjAz1oUAPCIARp6WlqamhrqaqoiQvJysnJ6+goKCoqKSkqKSoIA8UkZIUFxXm5+UVEBISEuTn5eFkYhOWVNA0NHd09w+JSkjLyi+tbGhp6+6fNHXG7Dlz589fsHDR4iVLli5bvmzpsmXLl69YsWIlEKyCgNUQcvUakPs3bt6yfefufQePnTx39fbDx4/v37p25viBHZvXrFg0Z/rE7ta6isKspKjQIDQQEgKmgoMDAwMDAvz8/Hy8PD3dPVxdnB3trK0sjI0MdbU11FSVFeQhPlFWUQGlUh1dPT19A0MDOACHga6utrYW2P9qaqpArKamrgGCGurqQAFlJQU5GSlxEQE+HgFgAAgK8PFyMgEAsxoliDEgMTggMSAxICMyNgp4nHP3jWKILkrMzEvKL1fIKS2JZQAAON0GDg==" - nm. [rainbow\ lut] - v + - -#@cli roddy -#@cli : Input a new image of the G'MIC Rodilius mascot 'Roddy'. -#@cli : $ roddy -roddy : - e[^-1] "Input image of the G\47MIC Rodilius mascot 'Roddy'." - v - - filename=${_path_rc}roddy_large.cimgz - if $filename $filename - else https://gmic.eu/img/roddy_large.cimgz o. $filename +. 0 - fi - nm. [roddy] v + - #@cli screen : _x0[%],_y0[%],_x1[%],_y1[%] : (+) #@cli : Take screenshot, optionally grabbed with specified coordinates, and insert it #@cli : at the end of the image list. @@ -3316,10 +4871,12 @@ #@cli serialize : _datatype,_is_compressed={ 0 | 1 },_store_names={ 0 | 1 } : (+) #@cli : Serialize selected list of images into a single image, optionnally in a compressed form. #@cli : 'datatype' can be { auto | uchar | char | ushort | short | uint | int | uint64 | int64 | float | double }. -#@cli : Specify 'datatype' if all selected images have a range of values constrained to a particular datatype, in order to minimize the memory footprint. +#@cli : Specify 'datatype' if all selected images have a range of values constrained to a particular datatype, +#@cli : in order to minimize the memory footprint. #@cli : The resulting image has only integers values in [0,255] and can then be saved as a raw image of #@cli : unsigned chars (doing so will output a valid .cimg[z] or .gmz file). -#@cli : If 'store_names' is set to '1', serialization uses the .gmz format to store data in memory (otherwise the .cimg[z] format). +#@cli : If 'store_names' is set to '1', serialization uses the .gmz format to store data in memory +#@cli : (otherwise the .cimg[z] format). #@cli : Default values: 'datatype=auto', 'is_compressed=1' and 'store_names=1'. #@cli : $ image.jpg +serialize uchar +unserialize[-1] @@ -3329,35 +4886,65 @@ #@cli : $ shape_circle , shape_circle : check "${1=512}>=0" e[^-1] "Input a $1x$1 circle binary shape." - v - ir={round($1)} - if {!$ir} 0 - elif {$ir<2} $ir,$ir,1,1,1 + if !$ir 0 + elif $ir<2 $ir,$ir,1,1,1 else {int($ir/2)+($ir%2)},{int($ir/2)+($ir%2)} =. 1,100%,100% distance. 1 <=. {(i+0.4)/sqrt(2)} +mirror. x - if {$ir>1&&($ir%2)} r. {w-1},100%,1,1,0,0,1 fi + if $ir>1" && "($ir%2) r. {w-1},100%,1,1,0,0,1 fi a[-2,-1] x +mirror. y - if {$ir>1&&($ir%2)} r. 100%,{h-1},1,1,0,0,0,1 fi + if $ir>1" && "($ir%2) r. 100%,{h-1},1,1,0,0,0,1 fi a[-2,-1] y fi nm. "[2D circle shape]" - v + #@cli shape_cupid : _size>=0 #@cli : Input a 2D cupid binary shape with specified size. #@cli : Default value: 'size=512'. #@cli : $ shape_cupid , shape_cupid : check "${1=512}>=0" - e[^-1] "Input a $1x$1 cupid binary shape." v - + e[^-1] "Input a $1x$1 cupid binary shape." ir={round($1)} - if {!$ir} 0 + if !$ir 0 else - base642img "MiBzaG9ydCBsaXR0bGVfZW5kaWFuCjEgMjMwMSAxIDEgIzI2NDQKeJx1mOl3lEUWxm+n6aS7IUSQRQQEFA37FtkFVFAEBxHZEoKACwRQEUHU0fGM58yZxa9z5i9AFBAhAZKwg8qACMM6CDgZIIQ9Kx0CmAHqzq/u2yR80A91nue5daveWm5tb2moNBSSkAiptCoq9RqToa6p3NVmMtyli2pzecp1IHWUke6R30wjyB9hfh0o97AMIw11D8kQ0mDXRga6VpLlWsoA10L6uQzpQ909XVy6u6hkulTp6lJkyamw1GhTGc33b2iGHHYR+RT8RVvIUReThKbI3+H/0wflGD512kT+oa3EaRt0M7mlEanFZ4X2QqdTLiLX8flK+5i+rWn36eb0MYqOyErT7eBp8rX2gz8Ej9H3iGww3Y5vZRg/QztvaqMuox13tAvpAdMX3JO0J+CX3AuGl904wytuvOFV9yLYF5wgG8Fy9xK6j1S4iWBvcBL23lLpXkH3kio3Bd1Tqt10sIdcczOkULtLws0Eu4GzwEypdbPJfxx8S3aC190i2aWPge+iu0idW4ruJDfcMvARuek+Ajsa7tT24O9lB33zuE3b4rdY1mtrw3zGPFtTZbm+K9/Qv+mM1Re6iPFKl2mM1Qp9R1Yxd1NJX8FXYptCDK2Ef0m5yfitgtcy7qsNMyi7iLY9IGsMW1Cvx5aylm94XGfYSgp0seF6w9aMyWLKt6HP76HbShFYCxaDCXCTYTvZqksYq4fp01KwA31dKjXE6ff6PthZ9uoyxrSL7AOr3KNyQD9gzB+Tg2CFe1yOGHaTf4Plrrv8BNYRq7eZi1OUqSN+7zJPJfCDGpJu6tdNXzmDPqRh6aHPShn8MDHXQ5+Ti8bD0l3HyiXa4u3ddZxcpT2ed9PxUtHAX5RKfA4Z/51UJXkmvJp+HYQ/Aa+BH2J8M3WCXKPfB+GPUzbgacYTxmNWNsGYHqSdmWb3vBn1jIcvop4IcZzKfKbKSdp1Td+2b9ajsyl/ClsC22H8/NrKoewp+pLQt8x2kzSDeT6lz1N2ofWjDlsue8hJ+p/QBeZXR30ziaEy2ndXx7BmA3st9le1JWPzstmOoBPYX2WNXzHbfPOrwT6LuKzQSazT+dbGauqaTcxW6SvUH/hVYZtDPNckbUewVZjtYeoNbEepqxzba8R/gvoCW4Q5iWLrQP3etoAYiMhlK8v60Yn2XW+7ZGUfZe+ZSPvyiJGIXKDOOdqVcXuJdr0hJ7CVYZvNGr3DHFToa4xRRErN70O+P0d+hp81/QHfno2OEEdpDboE/V+rY5lpz0tMv8/YzEJHrIzXl3Wm6VM2TkvJD/RJ00tMn0afsDFbgn8uuokct/F/j/wZfDsVnYZenNQROYYtlzi5ojmWf9Ri4B3ak2Nt9/P1BvFdT4xc1Wwr42NzHrFzhxgpT/p5W55+zDjk2Bj8i7RAPyHefX6EdRjoqqT/ftJC/QPzOMP8f2zQgf8+2vkW+lpS7yXf60SyfKA/RU+3Nv2zIT+Vto4z2+5knSU60vq2O9mGEh1h+rsGPczG8lvrwyeM21Cbi2+tn38iHoaY3kWb5uqf6fNg0ztIb+pf6GOjfl3/RhsCvd3m/nNibbDVv83m5nPiKsj3eib+9ejT6C2kHP0r6yf4ntfT9VvL22zzcMD4JvvuAfPZRB3zdCfnZ5rpYjAPfRheZHyH7QGFxrfbPN3j3mej8W3GN1hdW22drbe+brH59/xN3ZTkUfpY1GCfpRtsvRVYXwosnvLh2bqWtRTwV3QVa8jzKGdJAeOdZvbp1FkKrjP/rbae1uGTQ9sumD3K3rPL1uhaUo5+RwymwqP4f0+sRThfPP/B5t3bp+t+1nLApzJGt5I+U+D1ST4Jfsd4TCbC1fxj8rz+aPgcuA4co/usnjGmozIazDfcT39jhuvBZ8ENGpdnwI3oUfgVgk9RvhgcqLuZv7hk0eYt6CzdQ2x4/IEz2tv3c341Bc/JfwyvyDn24QFazvmSDlYRcxnST6tZHy05XyroV2swHuqhTUMlrPOpmh46Q53Z2jp0mTpytHPoOnt0rj4Rus39aoYOD03WJqGb+gTndkqoWjszJimh89QzWUOhMvZjj+eo/2VV5iVDxuovrLV0xuMW6yVOf2/anvU02IbUWuukhV6TGO2N6iVJ1YvSRM9LmBTSUql3P8stt4+7Uzr3j48Z8xhzlsk5wz3PfWjzcZF23EDXOn9OtSD2s8kPs889wNqPc89qTmxPw5ZCrMe5fzWFT6P/IcY2Lhe5a966Tx/nPnXP99e4n4+fXHbSPyYnuHcFPjE56XIb/Eu4f93zP+3mWJu8zxn3GmUD/7PudePe55x7Ax74lLk3OTe9PSrn3dwkj9HWeQ38ksuDh83H8xtJ+xU3v4FfdQuMF+FT7hbCw2avuI9Xci+sS/r/Fq9yb8ODtnl+Pdn+Knxqf4VX41OL/+Yk93f0+/kWxqcGfs14jLhPI969DnM/8+unOfW8TaymmB5LTG1J6m2UHUfMbeXsqMbfr4Px+hD2Rj2BM3o7ugr/Hfjncj9u1DH2md7gQvbdMOsnxnnWp0Hvwn8W97VGHUP3x28BayiFPT3OHjwgqcOcAT7f6/nsLWHWoc/PQuex76SgfX6j3m35T1JvHudCmHPH5z9JvXnEclj2WHsGYl8g5/G/p/fR/zL0Xmv/IM7DRaZ/QOey3x/izC2l/I/W3zGss0Wm96NzuHuVcmafxX+/rfEXqHsxazKFemKs/Qj311Gc4Uuwhbn/xeUFzrxK7g1eH0I/j67mnnGaMofRY/BPcE/xdRxBP82ZeF0/Mv9j6BE6nJj5mG+G2cfjMpgz6iZno/c/jh5An3/hbPX+J9D90PWcx2dt7TaVPujb+kfrw8/oXui7+pn1we9xPbTYfE+zz3WDe78zdm8tMn4Wn65w7+/3wke10Ph59pLOcO9zEXtH3Wj8Mrw93Ptcxacd55Ln5fC2ut54JbwV3PvXEKMtOYu8PQHP0Hzj19n30nWd8Trs8SS/RdlUzjTP6+Fh/cbafwcuugb+oDj3NdhCbrvVYHP2vlVgnHfLV2CU9fOl3V0qDbmPui/AJuxxcxmrIcYv2v4yyOo+z9vvBrHj+Tn2plp4Kd8/w15Ww3hudZPpU5Zs5s15mRgu5k16gVjf4J6hTD/Jd8MY676y1vVlzvvIN64r8dhb1vCe2swbdDXvsULePavYYwvAlbx91rLWVrgmvON6yATXm/MsLMvdAOI5zf4jrOQtvIc+3WF+VruBxHMz+5+wxg0iljvyrcGG+W4IeR2lwA1Fd6JNw5I4FHsnKXTDkziM+h4x3I1/Efj9fVgMfsd+UES5Xdzni8Gd3PWLqH8774BivreV/aOI72/WNobFnGVFtG0j+04h7d0AFoEFnCke19HeIpfFG7UZ5bN4z0bx6897N9X0cuZhEzgN36mkALNkiqX+Msn1I/WViYzPBNdTXuQdOc5lyljel8/x1hzN+/MZ0tOuk4wijWzA4J9K8D+lvf1PCf6ltLU0iPdvkO7Xngf/XIbw/r2H98r4fzD9eWf3Zu5GVv4foPOEnDEgMjAgMSAxICMzOQp4nHNn8GWIYmBgSGfIZchkSGaIZzCAQj0gLxMoms5QBZQHAHyqBfY=" - decompress_rle. r. $ir,$ir,1,1,5 if {$ir>480} b. 0.2% fi >=. 40% + base642img[] \ +"MiBzaG9ydCBsaXR0bGVfZW5kaWFuCjEgMjMwMSAxIDEgIzI2NDQKeJx1mOl3lEUWxm+n6aS7IUSQRQQEFA37FtkFVFAEBxHZEoKACwRQEUHU0fGM58y"\ +"Zxa9z5i9AFBAhAZKwg8qACMM6CDgZIIQ9Kx0CmAHqzq/u2yR80A91nue5daveWm5tb2moNBSSkAiptCoq9RqToa6p3NVmMtyli2pzecp1IHWUke6R30"\ +"wjyB9hfh0o97AMIw11D8kQ0mDXRga6VpLlWsoA10L6uQzpQ909XVy6u6hkulTp6lJkyamw1GhTGc33b2iGHHYR+RT8RVvIUReThKbI3+H/0wflGD512"\ +"kT+oa3EaRt0M7mlEanFZ4X2QqdTLiLX8flK+5i+rWn36eb0MYqOyErT7eBp8rX2gz8Ej9H3iGww3Y5vZRg/QztvaqMuox13tAvpAdMX3JO0J+CX3AuG"\ +"l904wytuvOFV9yLYF5wgG8Fy9xK6j1S4iWBvcBL23lLpXkH3kio3Bd1Tqt10sIdcczOkULtLws0Eu4GzwEypdbPJfxx8S3aC190i2aWPge+iu0idW4r"\ +"uJDfcMvARuek+Ajsa7tT24O9lB33zuE3b4rdY1mtrw3zGPFtTZbm+K9/Qv+mM1Re6iPFKl2mM1Qp9R1Yxd1NJX8FXYptCDK2Ef0m5yfitgtcy7qsNMy"\ +"i7iLY9IGsMW1Cvx5aylm94XGfYSgp0seF6w9aMyWLKt6HP76HbShFYCxaDCXCTYTvZqksYq4fp01KwA31dKjXE6ff6PthZ9uoyxrSL7AOr3KNyQD9gz"\ +"B+Tg2CFe1yOGHaTf4Plrrv8BNYRq7eZi1OUqSN+7zJPJfCDGpJu6tdNXzmDPqRh6aHPShn8MDHXQ5+Ti8bD0l3HyiXa4u3ddZxcpT2ed9PxUtHAX5RK"\ +"fA4Z/51UJXkmvJp+HYQ/Aa+BH2J8M3WCXKPfB+GPUzbgacYTxmNWNsGYHqSdmWb3vBn1jIcvop4IcZzKfKbKSdp1Td+2b9ajsyl/ClsC22H8/NrKoew"\ +"p+pLQt8x2kzSDeT6lz1N2ofWjDlsue8hJ+p/QBeZXR30ziaEy2ndXx7BmA3st9le1JWPzstmOoBPYX2WNXzHbfPOrwT6LuKzQSazT+dbGauqaTcxW6S"\ +"vUH/hVYZtDPNckbUewVZjtYeoNbEepqxzba8R/gvoCW4Q5iWLrQP3etoAYiMhlK8v60Yn2XW+7ZGUfZe+ZSPvyiJGIXKDOOdqVcXuJdr0hJ7CVYZvNG"\ +"r3DHFToa4xRRErN70O+P0d+hp81/QHfno2OEEdpDboE/V+rY5lpz0tMv8/YzEJHrIzXl3Wm6VM2TkvJD/RJ00tMn0afsDFbgn8uuokct/F/j/wZfDsV"\ +"nYZenNQROYYtlzi5ojmWf9Ri4B3ak2Nt9/P1BvFdT4xc1Wwr42NzHrFzhxgpT/p5W55+zDjk2Bj8i7RAPyHefX6EdRjoqqT/ftJC/QPzOMP8f2zQgf8"\ +"+2vkW+lpS7yXf60SyfKA/RU+3Nv2zIT+Vto4z2+5knSU60vq2O9mGEh1h+rsGPczG8lvrwyeM21Cbi2+tn38iHoaY3kWb5uqf6fNg0ztIb+pf6GOjfl"\ +"3/RhsCvd3m/nNibbDVv83m5nPiKsj3eib+9ejT6C2kHP0r6yf4ntfT9VvL22zzcMD4JvvuAfPZRB3zdCfnZ5rpYjAPfRheZHyH7QGFxrfbPN3j3mej8"\ +"W3GN1hdW22drbe+brH59/xN3ZTkUfpY1GCfpRtsvRVYXwosnvLh2bqWtRTwV3QVa8jzKGdJAeOdZvbp1FkKrjP/rbae1uGTQ9sumD3K3rPL1uhaUo5+"\ +"RwymwqP4f0+sRThfPP/B5t3bp+t+1nLApzJGt5I+U+D1ST4Jfsd4TCbC1fxj8rz+aPgcuA4co/usnjGmozIazDfcT39jhuvBZ8ENGpdnwI3oUfgVgk9"\ +"RvhgcqLuZv7hk0eYt6CzdQ2x4/IEz2tv3c341Bc/JfwyvyDn24QFazvmSDlYRcxnST6tZHy05XyroV2swHuqhTUMlrPOpmh46Q53Z2jp0mTpytHPoOn"\ +"t0rj4Rus39aoYOD03WJqGb+gTndkqoWjszJimh89QzWUOhMvZjj+eo/2VV5iVDxuovrLV0xuMW6yVOf2/anvU02IbUWuukhV6TGO2N6iVJ1YvSRM9Lm"\ +"BTSUql3P8stt4+7Uzr3j48Z8xhzlsk5wz3PfWjzcZF23EDXOn9OtSD2s8kPs889wNqPc89qTmxPw5ZCrMe5fzWFT6P/IcY2Lhe5a966Tx/nPnXP99e4"\ +"n4+fXHbSPyYnuHcFPjE56XIb/Eu4f93zP+3mWJu8zxn3GmUD/7PudePe55x7Ax74lLk3OTe9PSrn3dwkj9HWeQ38ksuDh83H8xtJ+xU3v4FfdQuMF+F"\ +"T7hbCw2avuI9Xci+sS/r/Fq9yb8ODtnl+Pdn+Knxqf4VX41OL/+Yk93f0+/kWxqcGfs14jLhPI969DnM/8+unOfW8TaymmB5LTG1J6m2UHUfMbeXsqM"\ +"bfr4Px+hD2Rj2BM3o7ugr/Hfjncj9u1DH2md7gQvbdMOsnxnnWp0Hvwn8W97VGHUP3x28BayiFPT3OHjwgqcOcAT7f6/nsLWHWoc/PQuex76SgfX6j3"\ +"m35T1JvHudCmHPH5z9JvXnEclj2WHsGYl8g5/G/p/fR/zL0Xmv/IM7DRaZ/QOey3x/izC2l/I/W3zGss0Wm96NzuHuVcmafxX+/rfEXqHsxazKFemKs"\ +"/Qj311Gc4Uuwhbn/xeUFzrxK7g1eH0I/j67mnnGaMofRY/BPcE/xdRxBP82ZeF0/Mv9j6BE6nJj5mG+G2cfjMpgz6iZno/c/jh5An3/hbPX+J9D90PW"\ +"cx2dt7TaVPujb+kfrw8/oXui7+pn1we9xPbTYfE+zz3WDe78zdm8tMn4Wn65w7+/3wke10Ph59pLOcO9zEXtH3Wj8Mrw93Ptcxacd55Ln5fC2ut54Jb"\ +"wV3PvXEKMtOYu8PQHP0Hzj19n30nWd8Trs8SS/RdlUzjTP6+Fh/cbafwcuugb+oDj3NdhCbrvVYHP2vlVgnHfLV2CU9fOl3V0qDbmPui/AJuxxcxmrI"\ +"cYv2v4yyOo+z9vvBrHj+Tn2plp4Kd8/w15Ww3hudZPpU5Zs5s15mRgu5k16gVjf4J6hTD/Jd8MY676y1vVlzvvIN64r8dhb1vCe2swbdDXvsULePavY"\ +"YwvAlbx91rLWVrgmvON6yATXm/MsLMvdAOI5zf4jrOQtvIc+3WF+VruBxHMz+5+wxg0iljvyrcGG+W4IeR2lwA1Fd6JNw5I4FHsnKXTDkziM+h4x3I1"\ +"/Efj9fVgMfsd+UES5Xdzni8Gd3PWLqH8774BivreV/aOI72/WNobFnGVFtG0j+04h7d0AFoEFnCke19HeIpfFG7UZ5bN4z0bx6897N9X0cuZhEzgN36"\ +"mkALNkiqX+Msn1I/WViYzPBNdTXuQdOc5lyljel8/x1hzN+/MZ0tOuk4wijWzA4J9K8D+lvf1PCf6ltLU0iPdvkO7Xngf/XIbw/r2H98r4fzD9eWf3Z"\ +"u5GVv4foPOEnDEgMjAgMSAxICMzOQp4nHNn8GWIYmBgSGfIZchkSGaIZzCAQj0gLxMoms5QBZQHAHyqBfY=" + decompress_rle. r. $ir,$ir,1,1,5 if $ir>480 b. 0.2% fi >=. 40% fi - nm "[2D cupid shape]" v + + nm "[2D cupid shape]" #@cli shape_diamond : _size>=0 #@cli : Input a 2D diamond binary shape with specified size. @@ -3365,31 +4952,45 @@ #@cli : $ shape_diamond , shape_diamond : check "${1=512}>=0" e[^-1] "Input a $1x$1 diamond binary shape." - v - ir={round($1)} - if {!$ir} 0 - elif {$ir<2} $ir,$ir,1,1,1 + if !$ir 0 + elif $ir<2 $ir,$ir,1,1,1 else {int($ir/2)+($ir%2)},{int($ir/2)+($ir%2)} =. 1,100%,100% distance. 1,1 <=. {i/2} +mirror. x - if {$ir>1&&($ir%2)} r. {w-1},100%,1,1,0,0,1 fi + if $ir>1" && "($ir%2) r. {w-1},100%,1,1,0,0,1 fi a[-2,-1] x +mirror. y - if {$ir>1&&($ir%2)} r. 100%,{h-1},1,1,0,0,0,1 fi + if $ir>1" && "($ir%2) r. 100%,{h-1},1,1,0,0,0,1 fi a[-2,-1] y fi nm. "[2D diamond shape]" - v + -#@cli shape_fern : _size>=0,_density[%]>=0,_angle,0<=_opacity<=1,_type={ 0=Asplenium adiantum-nigrum | 1=Thelypteridaceae } +#@cli shape_dragon : _size>=0,_recursion_level>=0,_angle +#@cli : Input a 2D Dragon curve with specified size. +#@cli : Default value: 'size=512', 'recursion_level=18' and 'angle=0'. +#@cli : $ shape_dragon , +shape_dragon : check "${1=512}>=0 && ${2=18}>=0" skip "${3=0}" + e[^-1] "Input a $1x$1 Dragon curve, with recursion level $2 and angle $3." + ir={round($1)} + if !$ir 0 + else l[] + (0,1^0,0) ind=1 + repeat $2 +f "begin(C = I["$ind"]; R = rot(90)); R*(I - C) + C" ind={2*h} a y done + s c -.. {-2,ia} -. {ia} a c / {max(abs(im),abs(iM))} + angle={$3-atan2(i1,i0)*180/pi} f. "begin(R = rot("$angle")); R*I" + n 0,{$1-1} round $1,$1,1,1 eval.. "!x?polygon(#1,2,I(0,y),I(1,y),1,1); I" k. + endl fi + +#@cli shape_fern : _size>=0,_density[%]>=0,_angle,0<=_opacity<=1,\ +# _type={ 0=Asplenium adiantum-nigrum | 1=Thelypteridaceae } #@cli : Input a 2D Barnsley fern with specified size. #@cli : Default value: 'size=512', 'density=50%', 'angle=30', 'opacity=0.3' and 'type=0'. #@cli : $ shape_fern , -shape_fern : check "${1=512}>=0 && ${2=50%}>=0 && isval(${3=30}) && ${4=0.3}>=0 && $4<=1 && isval(${5=0})" +shape_fern : check "${1=512}>=0 && ${2=50%}>=0 && isnum(${3=30}) && ${4=0.3}>=0 && $4<=1 && isnum(${5=0})" e[^-1] "Input a $1x$1 Barnsley fern, with density $2, angle $3 and opacity $4." - v - ir={round($1)} - if {!$ir} 0 + if !$ir 0 else l[] N={${"is_percent $2"}?$ir^2*$2:$2} $N,1,1,2 @@ -3421,24 +5022,23 @@ pointcloud -$4 r $ir,$ir,1,1,0,0,0.5,0.5 endl fi nm "[2D Barnsley fern]" - v + #@cli shape_gear : _size>=0,_nb_teeth>0,0<=_height_teeth<=100,0<=_offset_teeth<=100,0<=_inner_radius<=100 #@cli : Input a 2D gear binary shape with specified size. #@cli : Default value: 'size=512', 'nb_teeth=12', 'height_teeth=20', 'offset_teeth=0' and 'inner_radius=40'. #@cli : $ shape_gear , -shape_gear : check "${1=512}>=0 && isint(${2=12}) && $2>0 && ${3=20}>=0 && $3<=100 && ${4=0}>=0 && $4<=100 && ${5=40}>=0 && $5<=100" +shape_gear : check "${1=512}>=0 && isint(${2=12}) && $2>0 && ${3=20}>=0 && $3<=100 && ${4=0}>=0 && $4<=100 && + ${5=40}>=0 && $5<=100" e[^-1] "Input a $1x$1 gear binary shape with $2 teeth, teeth height $3, teeth offset $4 and inner radius $5." - v - ir={round($1)} - if {!$ir} 0 + if !$ir 0 else l[] $ir,$ir polygon {" const nb_teeth = $2; const height_teeth = $3%; const offset_teeth = 2*$4%; - pts = vector2048(); + ref(vector2048(),pts); for (i = 0, i=0 #@cli : Input a 2D heart binary shape with specified size. @@ -3458,9 +5057,8 @@ #@cli : $ shape_heart , shape_heart : check "${1=512}>=0" e[^-1] "Input a $1x$1 heart binary shape." - v - ir={round($1)} - if {!$ir} 0 + if !$ir 0 else l[] 2048,1,1,1,"t = x*2*pi/w; 16*sin(t)^3" 2048,1,1,1,"t = x*2*pi/w; 13*cos(t) - 5*cos(2*t) - 2*cos(3*t) - cos(4*t)" @@ -3469,7 +5067,6 @@ endl fi nm "[2D heart shape]" - v + #@cli shape_polygon : _size>=0,_nb_vertices>=3,_angle #@cli : Input a 2D polygonal binary shape with specified geometry. @@ -3477,9 +5074,8 @@ #@cli : $ repeat 6 shape_polygon 256,{3+$>} done shape_polygon : check "${1=512}>=0 && isint(${2=5}) && $2>=3" skip ${3=0} e[^-1] "Input a $1x$1 polygon binary shape, with $2 vertices and angle $3 deg." - v - ir={round($1)} - if {!$ir} 0 + if !$ir 0 else l[] (0;{2*pi}) + {($3-90)*pi/180} r. 1,{$2+1},1,1,3 rows. 0,{h-2} ir2={round($ir/2)} @@ -3489,7 +5085,6 @@ endl fi nm "[2D $2-polygon shape]" - v + #@cli shape_snowflake : size>=0,0<=_nb_recursions<=6 #@cli : Input a 2D snowflake binary shape with specified size. @@ -3497,9 +5092,8 @@ #@cli : $ repeat 6 shape_snowflake 256,$> done shape_snowflake : check "${1=512}>=0 && isint(${2=5}) && $2>=0 && $2<=6" e[^-1] "Input a $1x$1 snowflake binary shape, with $2 recursions." - v - ir={round($1)} - if {!$ir} 0 + if !$ir 0 else l[] $ir,$ir (0;120;240) *. {pi/180} +sin. cos.. a[-2,-1] c repeat $2 @@ -3520,7 +5114,6 @@ *. {0.5*$1} +. {$1/2} permute. cyzx polygon.. {h},{^},1,1 rm. endl fi nm "[2D snowflake shape]" - v + #@cli shape_star : _size>=0,_nb_branches>0,0<=_thickness<=1 #@cli : Input a 2D star binary shape with specified size. @@ -3528,55 +5121,64 @@ #@cli : $ repeat 9 shape_star 256,{$>+2} done shape_star : check "${1=512}>=0 && ${2=5}>0 && ${3=0.5}>=0 && $3<=1" e[^-1] "Input a $1x$1 star binary shape, with $2 branches and thickness $3." - v - ir={round($1)} - if {!$ir} 0 + if !$ir 0 else l[] star3d $2,$3 col3d 1 c3d n3d *3d $1,$1 $1,$1 j3d. ..,50%,50%,0,1,2 rm.. endl fi nm "[2D star shape]" - v + #@cli sh : eq. to 'shared'. : (+) -#@cli shared : x0[%],x1[%],y[%],z[%],v[%] : y0[%],y1[%],z[%],v[%] : z0[%],z1[%],v[%] : v0[%],v1[%] : v0[%] : (no arg) : (+) +#@cli shared : x0[%],x1[%],y[%],z[%],c[%] : y0[%],y1[%],z[%],c[%] : z0[%],z1[%],c[%] : c0[%],c1[%] : c0[%] : \ +# (no arg) : (+) #@cli : Insert shared buffers from (opt. points/rows/planes/channels of) selected images. #@cli : Shared buffers cannot be returned by a command, nor a local environment. #@cli : (eq. to 'sh'). #@cli : $ image.jpg shared 1 blur[-1] 3 remove[-1] -#@cli : $ image.jpg repeat {s} shared 25%,75%,0,$> mirror[-1] x remove[-1] done +#@cli : $ image.jpg repeat s shared 25%,75%,0,$> mirror[-1] x remove[-1] done #@cli : $$ #@cli sp : eq. to 'sample'. sp : skip "${1=?}",${2=0} - v - _sample[] "$1",${2--1} - if {!${}} noarg fi v + + v + _sample[] "$1",${2--1} v - + if !${} noarg fi -#@cli sample : _name1={ ? | apples | barbara | boats | bottles | butterfly | cameraman | car | cat | cliff | david | dog | duck | eagle | elephant | earth | flower | fruits | greece | gummy | house | inside | landscape | leaf | lena | leno | lion | mandrill | monalisa | monkey | parrots | pencils | peppers | rooster | rose | square | teddy | tiger | wall | waterfall | zelda },_name2,...,_nameN,_width={ >=0 | 0 (auto) },_height = { >=0 | 0 (auto) } : (no arg) +#@cli sample : _name1={ ? | apples | balloons | barbara | boats | bottles | butterfly | cameraman | car | cat | \ +# cliff | chick | colorful | david | dog | duck | eagle | elephant | earth | flower | fruits | gmicky | \ +# gmicky_mahvin | gmicky_wilber | greece | gummy | house | inside | landscape | leaf | lena | leno | lion | \ +# mandrill | monalisa | monkey | parrots | pencils | peppers | portrait0 | portrait1 | portrait2 | portrait3 | \ +# portrait4 | portrait5 | portrait6 | portrait7 | portrait8 | portrait9 | roddy | rooster | rose | square | swan | \ +# teddy | tiger | tulips | wall | waterfall | zelda },_name2,...,_nameN,_width={ >=0 | 0 (auto) },\ +# _height = { >=0 | 0 (auto) } : (no arg) #@cli : Input a new sample RGB image (opt. with specified size). #@cli : (eq. to 'sp').\n #@cli : Argument 'name' can be replaced by an integer which serves as a sample index. #@cli : $ repeat 6 sample done sample : skip "${1=?}",${2=0} - v - _sample[] "$1",${2--1} - if {!${}} noarg fi v + + v + _sample[] "$1",${2--1} v - + if !${} noarg fi __sample : - u apples,barbara,boats,bottles,butterfly,cameraman,car,cat,cliff,\ - david,dog,duck,eagle,elephant,earth,flower,fruits,greece,gummy,house,\ - inside,landscape,leaf,lena,leno,lion,mandrill,monalisa,monkey,parrots,\ - pencils,peppers,rooster,rose,square,teddy,tiger,wall,waterfall,zelda + u apples,balloons,barbara,boats,bottles,butterfly,cameraman,car,cat,chick,cliff,colorful,\ + david,dog,duck,eagle,elephant,earth,flower,fruits,gmicky,gmicky_mahvin,gmicky_wilber,greece,gummy,house,\ + inside,landscape,leaf,lena,leno,lion,mandrill,monalisa,monkey,parrots,pencils,peppers,\ + portrait0,portrait1,portrait2,portrait3,portrait4,portrait5,portrait6,portrait7,portrait8,portrait9,\ + roddy,rooster,rose,square,swan,teddy,tiger,tulips,wall,waterfall,zelda _sample : - if {"$#>=3 && isval($-2) && isint($-2) && $-2>=0 && isval($-1) && isint($-1) && $-1>=0"} # W and H specified. - N={$#-2} W=$-2 H=$-1 - elif {"$#>=2 && isval($-1) && isint($-1) && $-1>=0"} # Only W specified. - N={$#-1} W=$-1 H=0 - else # No dimensions specified - N={$#} W=0 H=0 - fi + l[] + if "$#>=3 && isnum($-2) && isint($-2) && $-2>=0 && isnum($-1) && isint($-1) && $-1>=0" # W and H specified. + N={$#-2} W=$-2 H=$-1 + elif "$#>=2 && isnum($-1) && isint($-1) && $-1>=0" # Only W specified. + N={$#-1} W=$-1 H=0 + else # No dimensions specified + N={$#} W,H=0 + fi + onfail N={$#} W,H=0 + endl # Check validity of given arguments. $=arg @@ -3585,22 +5187,25 @@ is_arg=1 repeat $N arg=${arg{1+$>}} is_rand{1+$>}=0 - if {['$arg']=='?'} arg={round(u(1,$M))} is_rand{1+$>}=1 - elif {!isval($arg)" || "!isint($arg)} repeat $M name=${_sp_name{1+$>}} if {'$name'!=0" && "'$name'==['$arg']} arg={1+$>} break fi done + if ['$arg']=='?' arg={round(u(1,$M))} is_rand{1+$>}=1 + elif !isnum($arg)" || "!isint($arg) + repeat $M name=${_sp_name{1+$>}} + if '$name'!=0" && "'$name'==['$arg'] arg={1+$>} break fi + done else arg={($arg%$M)+1} fi - if {!isval($arg)" || "!isint($arg)} is_arg=0 break fi + if !isnum($arg)" || "!isint($arg) is_arg=0 break fi arg{1+$>}=$arg done - if {!$is_arg} N=1 W=0 H=0 arg1={round(u(1,$M))} fi + if !$is_arg N=1 W=0 H=0 arg1={round(u(1,$M))} fi # Input sample images. repeat $N name=${_sp_name${arg{1+$>}}} # Retrieve image data. - filename=${_path_rc}sample_$name.png + filename=${-path_cache}sample_$name.png url=https://gmic.eu/img/sample_$name.png - if $filename $filename + if isfile(['{/$filename}']) $filename else if ${is_rand{1+$>}} l[] $url o. $filename onfail testimage2d {m=max($W,$H);m>0?m:400} endl else $url o. $filename @@ -3608,14 +5213,14 @@ fi # Resize to desired dimensions. - if {$W>0" && "$H==0} r2dx. $W round. - elif {$W==0" && "$H>0} r2dy. $H round. - elif {$W>0" && "$H>0} - if {w/$W>h/$H} r2dy. $H else r2dx. $W fi + if $W>0" && "$H==0 r2dx. $W round. + elif $W==0" && "$H>0 r2dy. $H round. + elif $W>0" && "$H>0 + if w/$W>h/$H r2dy. $H else r2dx. $W fi r. $W,$H,1,100%,0,0,0.5,0.5 round. fi nm. $name - v + e[0--4] "Input sample image '"{n}"' (1 image "{w}x{h}x{d}x{s}")." v - + e[0--4] "Input sample image '"{n}"' (1 image "{w}x{h}x{d}x{s}")." done +. 0 u $is_arg @@ -3623,12 +5228,16 @@ #@cli : Set random generator seed. #@cli : If no argument is specified, a random value is used as the random generator seed. -#@cli string : "string" -#@cli : Insert new image containing the ascii codes of specified string. -#@cli : $ string "foo bar" -string : - e[^-1] "Input new image from string '$1'." - v - ({'"$1"'}) nm. "$1" v + +#@cli store : _is_compressed={ 0 | 1 },variable_name1,_variable_name2,... : (+) +#@cli : Store selected images into one or several named variables. +#@cli : Selected images are transferred to the variables, and are so removed from the image list. +#@cli : (except if the prepended variant of the command '+store[selection]' is used). +#@cli : If a single variable name is specified, all images of the selection are assigned +#@cli : to the named variable. Otherwise, there must be as many variable names as images +#@cli : in the selection, and each selected image is assigned to each specified named variable. +#@cli : Use command 'input $variable' to bring the stored images back in the list. +#@cli : Default value: 'is_compressed=0'. +#@cli : $ sample eagle,earth store img1,img2 input $img2 $img1 #@cli testimage2d : _width>0,_height>0,_spectrum>0 #@cli : Input a 2D synthetic image. @@ -3636,57 +5245,62 @@ #@cli : $ testimage2d 512 testimage2d : check "${1=512}>0 && ${2=$1}>0 && ${3=3}>0" e[^-1] "Input 2D synthetic image of size $1x$2x$3." - v - Dmax2={0.15*min($1,$2)^2} - $1,$2,1,$3,'X=x-w/2;Y=y-h/2;a=atan2(Y,X);if(X^2+Y^2<=$Dmax2,255*abs(cos(c+200*(x/w-0.5)*(y/h-0.5))),850*(a%(0.1*(c+1))))' + $1,$2,1,$3," + X = x - w/2; + Y = y - h/2; + a = atan2(Y,X); + if (X^2 + Y^2<="$Dmax2",255*abs(cos(c+200*(x/w-0.5)*(y/h-0.5))),850*(a%(0.1*(c+1))))" polygon. 4,20%,20%,60%,20%,70%,70%,35%,45%,0.9,0,255,0 torus3d {$1/7},{$1/20} r3d. 0,1,1,-80 col3d. 128,200,255 j3d.. .,30%,70%,0,1,5,0,0 rm. round. 1 nm. "[2D test image]" - v + + +#@cli um : eq. to 'uncommand'. +um : + v + uncommand $* v - #@cli uncommand : command_name[,_command_name2,...] : * : (+) #@cli : Discard definition of specified custom commands. #@cli : Set argument to '*' for discarding all existing custom commands. +#@cli : (eq. to 'um'). #@cli uniform_distribution : nb_levels>=1,spectrum>=1 #@cli : Input set of uniformly distributed spectrum-d points in [0,1]^spectrum. #@cli : $ uniform_distribution 64,3 * 255 +distribution3d circles3d[-1] 10 uniform_distribution : check "isint($1) && $1>0 && isint($2) && $2>0" e[^1] "Input set of $1 uniformly distributed $2-d points in [0,1]^$2." - v - n={round($1^(1/$2),1,1)} + n={round($1^(1/$2),1,1)} (0,1) r. $n,1,1,1,3 - repeat {$2-1} +channels. 100% r. {$n*w},1,1,1,1 r.. .,1,1,100%,0,2 a[-2,-1] c done - r. $1,1,1,$2,1 nm. "[uniform $2D distribution]" v + + repeat $2-1 +channels. 100% r. {$n*w},1,1,1,1 r.. .,1,1,100%,0,2 a[-2,-1] c done + r. $1,1,1,$2,1 nm. "[uniform $2D distribution]" #@cli unserialize : : (+) #@cli : Recreate lists of images from serialized image buffers, obtained with command 'serialize'. #@cli up : eq. to 'update'. up : - _update + v + _update #@cli update #@cli : Update commands from the latest definition file on the G'MIC server. #@cli : (eq. to 'up'). update : - _$0 + v + _$0 _update : e[0--3] "Update commands from the latest definition file on the G\47MIC server." - v - out=${_path_rc}update$_version.gmic l[] cimgz:https://gmic.eu/update$_version.gmic - if {h>7" && "same([{^}],'#@gmic',6)} o raw:$out,char fi + if h>7" && "same([{^}],'#@gmic',6) ot $out fi rm - onfail v + error[0--3] "Command 'update' : Unreachable update file." + onfail error[0--3] "Command 'update' : Unreachable update file." endl m $out - v + # Generate images used in the G'MIC installer for Windows (InnoSetup). update_instimg : - $HOME/work/src/gmic/html/img/gmicky_deevad600.jpg + sp gmicky,600 # Large image. +l @@ -3706,124 +5320,134 @@ o $HOME/work/src/gmic/resources/gmic_instimg_small.bmp rm -# Generate film emulation page for the G'MIC website. +# Generate Color Presets page for the G'MIC website. # Input images : samples you want to generate -update_film_emulation_html : - if {!$!} error[^-1] "Command '$0': Missing input images !" fi - v - +# $1 = upload to G'MIC server, can be { 0 | 1 }. +update_color_presets_html : check "isbool(${1=0})" + v 0 + if !$! error[^-1] "Command '$0': Missing input images !" fi # Init variables. jpeg_quality=70 # Set JPEG quality of output images. thumb_width=180 # Set thumbnail width. thumb_height=90 # Set mini thumbnail height. - categories=bw,instant_consumer,instant_pro,fujixtransii,negative_color,negative_new,negative_old,picturefx,print,colorslide,various - category_names="Black and White",\ - "Instant [consumer]",\ - "Instant [pro]",\ - "Fuji XTrans II",\ - "Negative [color]",\ - "Negative [new]",\ - "Negative [old]",\ - "PictureFX",\ - "Print films",\ - "Slide [color]",\ - "Various" - category_authors="Pat David",\ + categories=creative,lutifyme,picturefx,pixlsus,others,\ + bw,instant_consumer,instant_pro,fujixtransiii,negative_color,negative_new,negative_old,print,colorslide + category_names="Creative: Creative Pack",\ + "Creative: Lutify.Me",\ + "Creative: PictureFX",\ + "Creative: PIXLS.US",\ + "Creative: Others",\ + "Films: Black and White",\ + "Films: Instant [Consumer]",\ + "Films: Instant [Pro]",\ + "Films: Fuji XTrans III",\ + "Films: Negative [Color]",\ + "Films: Negative [New]",\ + "Films: Negative [Old]",\ + "Films: Print Films",\ + "Films: Slide [Color]" + category_authors="RawTherapee",\ + "Lutify.Me",\ + "Marc Roovers",\ + "PIXLS.US contributors",\ + 0,\ + "Pat David",\ "Pat David",\ "Pat David",\ "Stuart Sowerby",\ "Pat David",\ "Pat David",\ "Pat David",\ - "Marc Roovers",\ "Juan Melara",\ - "Pat David",\ - 0 - category_authors_url="http://blog.patdavid.net/2013/08/film-emulation-presets-in-gmic-gimp.html",\ + "Pat David" + category_authors_url="https://rawpedia.rawtherapee.com/Film_Simulation",\ + "https://lutify.me/free-luts/",\ + "http://www.digicrea.be/haldclut-set-style-a-la-nik-software",\ + "https://discuss.pixls.us/t/help-to-create-a-set-of-pixls-us-color-luts",\ + 0,\ "http://blog.patdavid.net/2013/08/film-emulation-presets-in-gmic-gimp.html",\ "http://blog.patdavid.net/2013/08/film-emulation-presets-in-gmic-gimp.html",\ - "http://blog.sowerby.me/fuji-film-simulation-profiles",\ "http://blog.patdavid.net/2013/08/film-emulation-presets-in-gmic-gimp.html",\ + "http://blog.sowerby.me/fuji-film-simulation-profiles",\ "http://blog.patdavid.net/2013/08/film-emulation-presets-in-gmic-gimp.html",\ - "http://www.digicrea.be/haldclut-set-style-a-la-nik-software",\ - "http://juanmelara.com.au/print-film-emulation-luts-for-download",\ "http://blog.patdavid.net/2013/08/film-emulation-presets-in-gmic-gimp.html",\ "http://blog.patdavid.net/2013/08/film-emulation-presets-in-gmic-gimp.html",\ - 0 + "http://juanmelara.com.au/print-film-emulation-luts-for-download",\ + "http://blog.patdavid.net/2013/08/film-emulation-presets-in-gmic-gimp.html" m "_thumb : frame 3%,3%,255 to_rgba drop_shadow 2,2,3 repeat $! l[$>] i[0] 100%,100%,1,3,245 blend alpha endl done" - m "_title : string \"$""*\" replace. {'_'},32 f. if((x==0||j(-1)==32)&&i>=_'a'&&i<=_'z',i+_'A'-_'a',i) u {t} rm." + m "_title : ('\"$""*\"') replace_str. \"_\",\" \" replace_str. \"iii\",\"III\" f. \"(!y || j(0,-1)==32) && + i>=_'a' && i<=_'z'?uppercase(i):i\" u {t} rm." nb_presets=0 - repeat {narg($categories)} + repeat narg($categories) category=${arg\ {1+$>},$categories} - presets=${-_fx_emulate_film_$category} + presets=${-_fx_cluts_$category} nb_presets+={narg({/$presets})} done - v + e[] "\n > Update film emulation pages, for "$!" image samples and "$nb_presets" presets." v - + e[] "\n > Update 'Color Presets' pages, for "$!" image samples and "$nb_presets" presets." # Prepare folder structure. - v + e[] "\n * Prepare folder structure." v - - x "ln -fs ../copyright.html ." - x "ln -fs ../favicon.ico ." - x "ln -fs ../favicon.png ." - x "ln -fs ../footer.html ." - x "ln -fs ../header.html ." - x "ln -fs ../gmicmenu ." - x "ln -fs ../jquery-1.11.0.min.js ." - x "ln -fs ../style.css ." - x "ln -fs ../images ." + HTML=$HOME/work/src/gmic/html + e[] "\n * Prepare folder structure." + x "ln -fs "$HTML"/copyright.html ." + x "ln -fs "$HTML"/favicon.ico ." + x "ln -fs "$HTML"/favicon.png ." + x "ln -fs "$HTML"/footer.html ." + x "ln -fs "$HTML"/header.html ." + x "ln -fs "$HTML"/jquery-1.11.0.min.js ." + x "ln -fs "$HTML"/style.css ." + x "ln -fs "$HTML"/images ." x "mkdir -p img" - x "cd img && ln -fs ../../img/logo4.jpg ." - x "cd img && ln -fs ../../img/logos.jpg ." - x "cd img && ln -fs ../../img/rss.png ." - x "ln -fs ../highslide ." + x "cd img && ln -fs "$HTML"/img/logo4.jpg ." + x "cd img && ln -fs "$HTML"/img/logos.jpg ." + x "cd img && ln -fs "$HTML"/img/rss.png ." + x "ln -fs "$HTML"/highslide ." # Generate thumbnails. - v + e[] "\n * Generate thumbnails from samples." v - - if original else x "mkdir original" fi + e[] "\n * Generate thumbnails from samples." + if !isdir('original') x "mkdir original" fi nb_samples=$! to_rgb repeat $nb_samples l[$<] nm[0] sample_{1+$<} basename={0,b} basename$<=$basename - v + e[] " - "$basename v - + e[] " - "$basename +r2dx $thumb_width +to[0] "Reference",4,{0,h-28},20,2 frame. 1,1,0 o. original/$basename.jpg,$jpeg_quality rm. +_thumb[1] o. original/thumb_$basename.jpg,$jpeg_quality rm. - +r2dy[0] $thumb_height _thumb. o. original/minithumb_$basename.jpg,$jpeg_quality rm. + +r2dy[0] $thumb_height r. {h},{h},1,100%,0,0,0.5,0.5 _thumb. + o. original/minithumb_$basename.jpg,$jpeg_quality rm. endl done - # Generate film emulation data and rendering on each input sample. + # Generate color grading data and rendering on each input sample. ind_preset=0 - repeat {narg($categories)} + repeat narg($categories) category=${arg\ {1+$>},$categories} - presets=${-_fx_emulate_film_$category} + presets=${-_fx_cluts_$category} - v + e[] "\n * Category ""#"{1+$>}": "$category"\n" v - - if $category else x "mkdir "$category fi - if $category/clut else x "mkdir "$category/clut fi + e[] "\n * Category ""#"{1+$>}": "$category"\n" + if !isdir(['{/$category}']) x "mkdir "$category fi + if !isdir(['{/$category/clut}']) x "mkdir "$category/clut fi - repeat {narg({/$presets})} + repeat narg({/$presets}) preset=${arg\ {1+$>},$presets} - v + e[] " - "$preset v - - clut $preset to_rgb. s={sqrt(w*h*d)} - if {!isint($s)} - v + warn[] "Preset '"$preset"' must be resampled." v - - r. 64,64,64,3,3 - fi + e[] " - "$preset + clut $preset,64 to_rgb. s={sqrt(w*h*d)} +r. $s,$s,1,3,-1 - if {iM<=255} *. 257 fi # Force PNG to be saved in 16bits. + if iM<=255 *. 257 fi # Force PNG to be saved in 16bits. o. $category/clut/$preset.png rm. repeat $nb_samples l[{2*$>},{2*$>+1},-1] basename={0,b} - if $category/$basename/$preset.jpg else - if $category/$basename else x "mkdir \""$category/$basename"\"" fi + if !isfile(['{/$category/$basename/$preset.jpg}']) + if !isdir(['{/$category/$basename}']) x "mkdir \""$category/$basename"\"" fi +map_clut[^-1] . - to.. ${_title\ $preset},4,{-2,h-28},20,2 frame.. 1,1,0 + _title $preset + to.. ${},4,{-2,h-28},20,2 frame.. 1,1,0 o.. $category/$basename/$preset.jpg,$jpeg_quality _thumb. o. $category/$basename/thumb_$preset.jpg,$jpeg_quality rm[-2,-1] @@ -3840,120 +5464,136 @@ rm[1--1:2] # Remove thumbnails. # Generate HTML gallery code. - v + e[] "\n * Generate html code.\n" v - + e[] "\n * Generate html code.\n" - repeat {narg($categories)} + repeat narg($categories) category=${arg\ {1+$>},$categories} arg {1+$>},$category_names category_name=${} - presets=${-_fx_emulate_film_$category} + presets=${-_fx_cluts_$category} repeat $nb_samples width={$>,64+w} height={$>,64+h} basename={$>,b} - v + e[] " - "$category_name" / "$basename v - + e[] " - "$category_name" / "$basename - string " + ('" \n\n \n \n -

    \n +
    Color Presets
    \n
    \n -

    Among all features available in G\47MIC, our Film Emulation filters are able to apply various pre-defined color presets on your images.\n -Most of those 300+ presets have been designed by Patrick David, in order to emulate the look of\n -analog films. They have a dedicated section in the open-source G\47MIC plug-in for GIMP and Krita, so you can apply all these easily in GIMP.

    \n\n -

    Below, you can navigate through the different proposed color presets and see how they modify the colors of some sample images.\n -You can also download each color preset separately as its corresponding HaldCLUT file (in .png format), to use it in\n +

    Among all features available in G\47MIC, our Color Presets and +Simulate Film filters are able to apply various pre-defined color CLUTs on your images +(550+ color CLUTs available).

    \n\n +

    Below, you can navigate through the different proposed presets and see how they modify the colors of some sample +images.\n +You can also download each color preset separately as its corresponding +HaldCLUT file (in .png format), to use it in\n other software that support this feature.

    \n\n -

    Image credits: Sample images below have been borrowed from Patrick David and\n -Chi King\47s Flickr accounts, distributed under\n +

    Image credits: Sample images below have been borrowed from +Patrick David,\n +Chi King, +Capri23auto +and +ivanovgood, +distributed a minima under\n CC-by-SA 2.0.

    \n\n

    Disclaimer:
    \n -The trademarked names which may appear in the filenames of the HaldCLUT images are there for informational purposes only. They serve only to inform the user which film stock the given HaldCLUT image\n -is designed to approximate. As there is no way to convey this information other than by using the trademarked name, we believe this constitutes fair use. Neither the publisher nor the authors are affiliated\n +The trademarked names which may appear in the filenames of the HaldCLUT images are there for informational purposes +only. They serve only to inform the user which film stock the given HaldCLUT image\n +is designed to approximate. As there is no way to convey this information other than by using the trademarked name, +we believe this constitutes fair use. Neither the publisher nor the authors are affiliated\n with or endorsed by the companies that own the trademarks.

    \n\n
    \"\"
    \n
    \n
    \n \n -\n\n\n
    Select film category:\n -
      \n" - repeat {narg($categories)} +
    Select category:\n +
      \n"') + repeat narg($categories) _category=${arg\ {1+$>},$categories} arg {1+$>},$category_names _category_name=${} arg {1+$>},$category_authors_url - if {isval(${})} _category_author_url_start= _category_author_url_end= + if isnum(${}) _category_author_url_start= _category_author_url_end= else _category_author_url_start="" _category_author_url_end="" fi arg {1+$>},$category_authors - if {isval(${})} _category_author="" + if isnum(${}) _category_author="" else _category_author=$_category_author_url_start${}$_category_author_url_end fi - if {narg($_category_author)} + if narg($_category_author) _category_author="(by "$_category_author")" fi - if {['$_category']==['$category']} - string "
    • "$_category_name" "$_category_author"
    • \n" + if ['$_category']==['$category'] + ('"
    • "$_category_name" "$_category_author"
    • \n"') else - string "
    • "$_category_name" "$_category_author"
    • \n" + ('"
    • "$_category_name" "$_category_author\ + "
    • \n"') fi done - string "
    \n
    Select sample image:

    \n" - repeat {$nb_samples} + ('"\n
    Select sample image:

    \n"') + repeat $nb_samples _basename=${basename$>} - if {['$_basename']==['$basename']} - string "\"\"\n" + if ['$_basename']==['$basename'] + ('"\"\"\n"') else - string "\"\"\n" + ('"\"\"\n"') fi done - string "
    \n
    \"\"
    \n" - string "\n + ('"\n\n