Explorar o código

Updated to libwebp 1.3.2.d7a0506

Brucey hai 1 ano
pai
achega
778768c8a7
Modificáronse 82 ficheiros con 8864 adicións e 1482 borrados
  1. 2 0
      webp.mod/libwebp/Android.mk
  2. 35 10
      webp.mod/libwebp/CMakeLists.txt
  3. 1 0
      webp.mod/libwebp/Makefile.vc
  4. 2 0
      webp.mod/libwebp/build.gradle
  5. 2 1
      webp.mod/libwebp/cmake/WebPConfig.cmake.in
  6. 4 5
      webp.mod/libwebp/configure.ac
  7. 1 1
      webp.mod/libwebp/doc/api.md
  8. 18 0
      webp.mod/libwebp/doc/building.md
  9. 141 137
      webp.mod/libwebp/doc/webp-container-spec.txt
  10. 267 247
      webp.mod/libwebp/doc/webp-lossless-bitstream-spec.txt
  11. 5 1
      webp.mod/libwebp/examples/anim_dump.c
  12. 9 5
      webp.mod/libwebp/examples/cwebp.c
  13. 1 1
      webp.mod/libwebp/examples/vwebp.c
  14. 6 6
      webp.mod/libwebp/examples/webpinfo.c
  15. 1 1
      webp.mod/libwebp/extras/vwebp_sdl.c
  16. 35 48
      webp.mod/libwebp/extras/webp_to_sdl.c
  17. 52 29
      webp.mod/libwebp/imageio/image_enc.c
  18. 14 4
      webp.mod/libwebp/iosbuild.sh
  19. 7 4
      webp.mod/libwebp/makefile.unix
  20. 1 0
      webp.mod/libwebp/sharpyuv/Makefile.am
  21. 207 59
      webp.mod/libwebp/sharpyuv/sharpyuv.c
  22. 103 2
      webp.mod/libwebp/sharpyuv/sharpyuv.h
  23. 64 2
      webp.mod/libwebp/sharpyuv/sharpyuv_dsp.c
  24. 10 0
      webp.mod/libwebp/sharpyuv/sharpyuv_dsp.h
  25. 308 2
      webp.mod/libwebp/sharpyuv/sharpyuv_gamma.c
  26. 7 4
      webp.mod/libwebp/sharpyuv/sharpyuv_gamma.h
  27. 6210 0
      webp.mod/libwebp/sharpyuv/sharpyuv_risk_table.c
  28. 27 0
      webp.mod/libwebp/sharpyuv/sharpyuv_risk_table.h
  29. 34 27
      webp.mod/libwebp/src/dec/alpha_dec.c
  30. 1 1
      webp.mod/libwebp/src/dec/buffer_dec.c
  31. 31 19
      webp.mod/libwebp/src/dec/idec_dec.c
  32. 12 8
      webp.mod/libwebp/src/dec/vp8_dec.c
  33. 8 9
      webp.mod/libwebp/src/dec/vp8_dec.h
  34. 7 4
      webp.mod/libwebp/src/dec/vp8i_dec.h
  35. 100 68
      webp.mod/libwebp/src/dec/vp8l_dec.c
  36. 21 7
      webp.mod/libwebp/src/dec/vp8li_dec.h
  37. 30 18
      webp.mod/libwebp/src/dec/webp_dec.c
  38. 4 2
      webp.mod/libwebp/src/dec/webpi_dec.h
  39. 14 8
      webp.mod/libwebp/src/demux/anim_decode.c
  40. 41 0
      webp.mod/libwebp/src/dsp/alpha_processing_sse2.c
  41. 0 12
      webp.mod/libwebp/src/dsp/cpu.c
  42. 8 1
      webp.mod/libwebp/src/dsp/filters.c
  43. 3 3
      webp.mod/libwebp/src/dsp/lossless.h
  44. 3 3
      webp.mod/libwebp/src/dsp/lossless_common.h
  45. 14 9
      webp.mod/libwebp/src/dsp/lossless_enc.c
  46. 7 7
      webp.mod/libwebp/src/dsp/lossless_enc_mips32.c
  47. 52 2
      webp.mod/libwebp/src/dsp/lossless_enc_sse41.c
  48. 15 17
      webp.mod/libwebp/src/dsp/msa_macro.h
  49. 2 1
      webp.mod/libwebp/src/dsp/quant.h
  50. 4 7
      webp.mod/libwebp/src/enc/alpha_enc.c
  51. 2 2
      webp.mod/libwebp/src/enc/frame_enc.c
  52. 19 17
      webp.mod/libwebp/src/enc/histogram_enc.c
  53. 1 1
      webp.mod/libwebp/src/enc/picture_enc.c
  54. 42 347
      webp.mod/libwebp/src/enc/vp8l_enc.c
  55. 1 3
      webp.mod/libwebp/src/enc/vp8li_enc.h
  56. 15 8
      webp.mod/libwebp/src/mux/anim_encode.c
  57. 2 1
      webp.mod/libwebp/src/mux/muxedit.c
  58. 2 0
      webp.mod/libwebp/src/utils/Makefile.am
  59. 4 1
      webp.mod/libwebp/src/utils/huffman_utils.c
  60. 7 4
      webp.mod/libwebp/src/utils/huffman_utils.h
  61. 402 0
      webp.mod/libwebp/src/utils/palette.c
  62. 60 0
      webp.mod/libwebp/src/utils/palette.h
  63. 5 61
      webp.mod/libwebp/src/utils/utils.c
  64. 1 2
      webp.mod/libwebp/src/utils/utils.h
  65. 58 56
      webp.mod/libwebp/src/webp/decode.h
  66. 25 21
      webp.mod/libwebp/src/webp/demux.h
  67. 44 39
      webp.mod/libwebp/src/webp/encode.h
  68. 12 10
      webp.mod/libwebp/src/webp/mux.h
  69. 2 1
      webp.mod/libwebp/src/webp/mux_types.h
  70. 18 1
      webp.mod/libwebp/src/webp/types.h
  71. 1 1
      webp.mod/libwebp/tests/fuzzer/advanced_api_fuzzer.c
  72. 13 2
      webp.mod/libwebp/tests/fuzzer/animencoder_fuzzer.cc
  73. 46 26
      webp.mod/libwebp/tests/fuzzer/enc_dec_fuzzer.cc
  74. 65 0
      webp.mod/libwebp/tests/fuzzer/huffman_fuzzer.c
  75. 3 3
      webp.mod/libwebp/tests/fuzzer/makefile.unix
  76. 7 7
      webp.mod/libwebp/tests/fuzzer/mux_demux_api_fuzzer.c
  77. 8 7
      webp.mod/libwebp/tests/fuzzer/simple_api_fuzzer.c
  78. 1 22
      webp.mod/libwebp/webp_js/README.md
  79. 17 31
      webp.mod/libwebp/webp_js/index_wasm.html
  80. 26 5
      webp.mod/libwebp/xcframeworkbuild.sh
  81. 1 0
      webp.mod/source.bmx
  82. 3 1
      webp.mod/webp.bmx

+ 2 - 0
webp.mod/libwebp/Android.mk

@@ -42,6 +42,7 @@ sharpyuv_srcs := \
     sharpyuv/sharpyuv_dsp.c \
     sharpyuv/sharpyuv_gamma.c \
     sharpyuv/sharpyuv_neon.$(NEON) \
+    sharpyuv/sharpyuv_risk_table.c \
     sharpyuv/sharpyuv_sse2.c \
 
 dec_srcs := \
@@ -164,6 +165,7 @@ utils_dec_srcs := \
     src/utils/color_cache_utils.c \
     src/utils/filters_utils.c \
     src/utils/huffman_utils.c \
+    src/utils/palette.c \
     src/utils/quant_levels_dec_utils.c \
     src/utils/random_utils.c \
     src/utils/rescaler_utils.c \

+ 35 - 10
webp.mod/libwebp/CMakeLists.txt

@@ -51,6 +51,8 @@ option(WEBP_ENABLE_SWAP_16BIT_CSP "Enable byte swap for 16 bit colorspaces."
        OFF)
 set(WEBP_BITTRACE "0" CACHE STRING "Bit trace mode (0=none, 1=bit, 2=bytes)")
 set_property(CACHE WEBP_BITTRACE PROPERTY STRINGS 0 1 2)
+option(WEBP_ENABLE_WUNUSED_RESULT "Add [[nodiscard]] to some functions. \
+       CMake must be at least 3.21 to force C23" OFF)
 
 if(WEBP_LINK_STATIC)
   if(WIN32)
@@ -163,6 +165,17 @@ endif()
 
 set(CMAKE_C_VISIBILITY_PRESET hidden)
 
+if(WEBP_ENABLE_WUNUSED_RESULT)
+  if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.21.0)
+    set(CMAKE_C_STANDARD 23)
+  else()
+    unset(CMAKE_C_STANDARD)
+    add_compile_options($<$<COMPILE_LANGUAGE:C>:-std=gnu2x>)
+  endif()
+  add_compile_options(-Wunused-result)
+  add_definitions(-DWEBP_ENABLE_NODISCARD=1)
+endif()
+
 # ##############################################################################
 # Android only.
 if(ANDROID)
@@ -638,13 +651,13 @@ if(WEBP_BUILD_EXTRAS)
                                                   ${CMAKE_CURRENT_BINARY_DIR})
 
   # vwebp_sdl
-  find_package(SDL)
-  if(WEBP_BUILD_VWEBP AND SDL_FOUND)
+  find_package(SDL2 QUIET)
+  if(WEBP_BUILD_VWEBP AND SDL2_FOUND)
     add_executable(vwebp_sdl ${VWEBP_SDL_SRCS})
-    target_link_libraries(vwebp_sdl ${SDL_LIBRARY} imageioutil webp)
+    target_link_libraries(vwebp_sdl ${SDL2_LIBRARIES} imageioutil webp)
     target_include_directories(
       vwebp_sdl PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}
-                        ${CMAKE_CURRENT_BINARY_DIR}/src ${SDL_INCLUDE_DIR})
+                        ${CMAKE_CURRENT_BINARY_DIR}/src ${SDL2_INCLUDE_DIRS})
     set(WEBP_HAVE_SDL 1)
     target_compile_definitions(vwebp_sdl PUBLIC WEBP_HAVE_SDL)
   endif()
@@ -661,31 +674,43 @@ if(WEBP_BUILD_WEBP_JS)
   else()
     set(emscripten_stack_size "-sTOTAL_STACK=5MB")
   endif()
+  # Set SDL2 flags so that ports are downloaded by emscripten.
+  set(EMSCRIPTEN_SDL2_FLAGS "-sUSE_SDL=2 -sUSE_SDL_IMAGE=2")
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EMSCRIPTEN_SDL2_FLAGS}")
   # wasm2js does not support SIMD.
   if(NOT WEBP_ENABLE_SIMD)
     # JavaScript version
+    find_package(SDL2 QUIET)
     add_executable(webp_js ${CMAKE_CURRENT_SOURCE_DIR}/extras/webp_to_sdl.c)
-    target_link_libraries(webp_js webpdecoder SDL)
+    target_link_libraries(webp_js webpdecoder SDL2)
     target_include_directories(webp_js PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
     set(WEBP_HAVE_SDL 1)
     set_target_properties(
       webp_js
-      PROPERTIES LINK_FLAGS "-sWASM=0 ${emscripten_stack_size} \
+      PROPERTIES
+        LINK_FLAGS
+        "-sWASM=0 ${emscripten_stack_size} \
          -sEXPORTED_FUNCTIONS=_WebPToSDL -sINVOKE_RUN=0 \
-         -sEXPORTED_RUNTIME_METHODS=cwrap")
+         -sEXPORTED_RUNTIME_METHODS=cwrap ${EMSCRIPTEN_SDL2_FLAGS} \
+         -sALLOW_MEMORY_GROWTH"
+    )
     set_target_properties(webp_js PROPERTIES OUTPUT_NAME webp)
     target_compile_definitions(webp_js PUBLIC EMSCRIPTEN WEBP_HAVE_SDL)
   endif()
 
   # WASM version
   add_executable(webp_wasm ${CMAKE_CURRENT_SOURCE_DIR}/extras/webp_to_sdl.c)
-  target_link_libraries(webp_wasm webpdecoder SDL)
+  target_link_libraries(webp_wasm webpdecoder SDL2)
   target_include_directories(webp_wasm PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
   set_target_properties(
     webp_wasm
-    PROPERTIES LINK_FLAGS "-sWASM=1 ${emscripten_stack_size} \
+    PROPERTIES
+      LINK_FLAGS
+      "-sWASM=1 ${emscripten_stack_size} \
        -sEXPORTED_FUNCTIONS=_WebPToSDL -sINVOKE_RUN=0 \
-       -sEXPORTED_RUNTIME_METHODS=cwrap")
+       -sEXPORTED_RUNTIME_METHODS=cwrap ${EMSCRIPTEN_SDL2_FLAGS} \
+       -sALLOW_MEMORY_GROWTH"
+  )
   target_compile_definitions(webp_wasm PUBLIC EMSCRIPTEN WEBP_HAVE_SDL)
 
   target_compile_definitions(webpdspdecode PUBLIC EMSCRIPTEN)

+ 1 - 0
webp.mod/libwebp/Makefile.vc

@@ -336,6 +336,7 @@ UTILS_DEC_OBJS = \
     $(DIROBJ)\utils\color_cache_utils.obj \
     $(DIROBJ)\utils\filters_utils.obj \
     $(DIROBJ)\utils\huffman_utils.obj \
+    $(DIROBJ)\utils\palette.obj \
     $(DIROBJ)\utils\quant_levels_dec_utils.obj \
     $(DIROBJ)\utils\rescaler_utils.obj \
     $(DIROBJ)\utils\random_utils.obj \

+ 2 - 0
webp.mod/libwebp/build.gradle

@@ -112,6 +112,7 @@ model {
             include "sharpyuv_dsp.c"
             include "sharpyuv_gamma.c"
             include "sharpyuv_neon.c"
+            include "sharpyuv_risk_table.c"
             include "sharpyuv_sse2.c"
             srcDir "src/dec"
             include "alpha_dec.c"
@@ -173,6 +174,7 @@ model {
             include "color_cache_utils.c"
             include "filters_utils.c"
             include "huffman_utils.c"
+            include "palette.c"
             include "quant_levels_dec_utils.c"
             include "random_utils.c"
             include "rescaler_utils.c"

+ 2 - 1
webp.mod/libwebp/cmake/WebPConfig.cmake.in

@@ -11,7 +11,8 @@ endif()
 include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]")
 
 set_and_check(WebP_INCLUDE_DIR "@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@")
-set(WEBP_INCLUDE_DIRS ${WebP_INCLUDE_DIRS})
+set(WebP_INCLUDE_DIRS ${WebP_INCLUDE_DIR})
+set(WEBP_INCLUDE_DIRS ${WebP_INCLUDE_DIR})
 set(WebP_LIBRARIES "@INSTALLED_LIBRARIES@")
 set(WEBP_LIBRARIES "${WebP_LIBRARIES}")
 

+ 4 - 5
webp.mod/libwebp/configure.ac

@@ -464,7 +464,7 @@ AC_ARG_ENABLE([sdl],
                               @<:@default=auto@:>@]))
 AS_IF([test "x$enable_sdl" != "xno"], [
   CLEAR_LIBVARS([SDL])
-  AC_PATH_PROGS([LIBSDL_CONFIG], [sdl-config])
+  AC_PATH_PROGS([LIBSDL_CONFIG], [sdl2-config])
   if test -n "$LIBSDL_CONFIG"; then
     SDL_INCLUDES=`$LIBSDL_CONFIG --cflags`
     SDL_LIBS="`$LIBSDL_CONFIG --libs`"
@@ -474,13 +474,12 @@ AS_IF([test "x$enable_sdl" != "xno"], [
 
   sdl_header="no"
   LIBCHECK_PROLOGUE([SDL])
-  AC_CHECK_HEADER([SDL/SDL.h], [sdl_header="SDL/SDL.h"],
-                  [AC_CHECK_HEADER([SDL.h], [sdl_header="SDL.h"],
-                  [AC_MSG_WARN(SDL library not available - no sdl.h)])])
+  AC_CHECK_HEADER([SDL2/SDL.h], [sdl_header="SDL2/SDL.h"],
+                  [AC_MSG_WARN(SDL2 library not available - no SDL.h)])
   if test x"$sdl_header" != "xno"; then
     AC_LANG_PUSH(C)
     SDL_SAVED_LIBS="$LIBS"
-    for lib in "" "-lSDL" "-lSDLmain -lSDL"; do
+    for lib in "" "-lSDL2" "-lSDL2main -lSDL2"; do
       LIBS="$SDL_SAVED_LIBS $lib"
       # Perform a full link to ensure SDL_main is resolved if needed.
       AC_LINK_IFELSE(

+ 1 - 1
webp.mod/libwebp/doc/api.md

@@ -157,7 +157,7 @@ decoding is not finished yet or VP8_STATUS_OK when decoding is done. Any other
 status is an error condition.
 
 The 'idec' object must always be released (even upon an error condition) by
-calling: WebPDelete(idec).
+calling: WebPIDelete(idec).
 
 To retrieve partially decoded picture samples, one must use the corresponding
 method: WebPIDecGetRGB or WebPIDecGetYUVA. It will return the last displayable

+ 18 - 0
webp.mod/libwebp/doc/building.md

@@ -96,6 +96,24 @@ make
 make install
 ```
 
+## Building libwebp - Using vcpkg
+
+You can download and install libwebp using the
+[vcpkg](https://github.com/Microsoft/vcpkg) dependency manager:
+
+```shell
+git clone https://github.com/Microsoft/vcpkg.git
+cd vcpkg
+./bootstrap-vcpkg.sh
+./vcpkg integrate install
+./vcpkg install libwebp
+```
+
+The libwebp port in vcpkg is kept up to date by Microsoft team members and
+community contributors. If the version is out of date, please
+[create an issue or pull request](https://github.com/Microsoft/vcpkg) on the
+vcpkg repository.
+
 ## CMake
 
 With CMake, you can compile libwebp, cwebp, dwebp, gif2webp, img2webp, webpinfo

+ 141 - 137
webp.mod/libwebp/doc/webp-container-spec.txt

@@ -21,9 +21,9 @@ Introduction
 ------------
 
 WebP is an image format that uses either (i) the VP8 key frame encoding to
-compress image data in a lossy way, or (ii) the WebP lossless encoding. These
-encoding schemes should make it more efficient than older formats such as JPEG,
-GIF and PNG. It is optimized for fast image transfer over the network (for
+compress image data in a lossy way or (ii) the WebP lossless encoding. These
+encoding schemes should make it more efficient than older formats, such as JPEG,
+GIF, and PNG. It is optimized for fast image transfer over the network (for
 example, for websites). The WebP format has feature parity (color profile,
 metadata, animation, etc.) with other formats as well. This document describes
 the structure of a WebP file.
@@ -31,36 +31,37 @@ the structure of a WebP file.
 The WebP container (that is, the RIFF container for WebP) allows feature support
 over and above the basic use case of WebP (that is, a file containing a single
 image encoded as a VP8 key frame). The WebP container provides additional
-support for:
+support for the following:
 
-  * **Lossless compression.** An image can be losslessly compressed, using the
+  * Lossless Compression: An image can be losslessly compressed, using the
     WebP Lossless Format.
 
-  * **Metadata.** An image may have metadata stored in Exif or XMP formats.
+  * Metadata: An image may have metadata stored in Exchangeable Image File
+    Format (Exif) or Extensible Metadata Platform (XMP) format.
 
-  * **Transparency.** An image may have transparency, that is, an alpha channel.
+  * Transparency: An image may have transparency, that is, an alpha channel.
 
-  * **Color Profile.** An image may have an embedded ICC profile as described
+  * Color Profile: An image may have an embedded ICC profile as described
     by the [International Color Consortium][iccspec].
 
-  * **Animation.** An image may have multiple frames with pauses between them,
+  * Animation: An image may have multiple frames with pauses between them,
     making it an animation.
 
+Terminology & Basics
+--------------------
+
 The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
 "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this
 document are to be interpreted as described in BCP 14 [RFC 2119][] [RFC 8174][]
 when, and only when, they appear in all capitals, as shown here.
 
-Bit numbering in chunk diagrams starts at `0` for the most significant bit
-('MSB 0') as described in [RFC 1166][].
-
-Terminology & Basics
---------------------
-
 A WebP file contains either a still image (that is, an encoded matrix of pixels)
 or an [animation](#animation). Optionally, it can also contain transparency
-information, color profile and metadata. We refer to the matrix of pixels as the
-_canvas_ of the image.
+information, a color profile and metadata. We refer to the matrix of pixels as
+the _canvas_ of the image.
+
+Bit numbering in chunk diagrams starts at `0` for the most significant bit
+('MSB 0'), as described in [RFC 1166][].
 
 Below are additional terms used throughout this document:
 
@@ -83,7 +84,7 @@ _uint32_
 
 _FourCC_
 
-: A _FourCC_ (four-character code) is a _uint32_ created by concatenating four
+: A four-character code (FourCC) is a _uint32_ created by concatenating four
   ASCII characters in little-endian order. This means 'aaaa' (0x61616161) and
  'AAAA' (0x41414141) are treated as different _FourCCs_.
 
@@ -94,9 +95,8 @@ _1-based_
 
 _ChunkHeader('ABCD')_
 
-: This is used to describe the _FourCC_ and _Chunk Size_ header of individual
-  chunks, where 'ABCD' is the FourCC for the chunk. This element's size is 8
-  bytes.
+: Used to describe the _FourCC_ and _Chunk Size_ header of individual chunks,
+  where 'ABCD' is the FourCC for the chunk. This element's size is 8 bytes.
 
 
 RIFF File Format
@@ -124,11 +124,11 @@ Chunk FourCC: 32 bits
 Chunk Size: 32 bits (_uint32_)
 
 : The size of the chunk in bytes, not including this field, the chunk
-  identifier or padding.
+  identifier, or padding.
 
 Chunk Payload: _Chunk Size_ bytes
 
-: The data payload. If _Chunk Size_ is odd, a single padding byte -- that MUST
+: The data payload. If _Chunk Size_ is odd, a single padding byte -- which MUST
   be `0` to conform with RIFF -- is added.
 
 **Note:** RIFF has a convention that all-uppercase chunk FourCCs are standard
@@ -151,17 +151,17 @@ WebP File Header
 
 'RIFF': 32 bits
 
-: The ASCII characters 'R' 'I' 'F' 'F'.
+: The ASCII characters 'R', 'I', 'F', 'F'.
 
 File Size: 32 bits (_uint32_)
 
-: The size of the file in bytes starting at offset 8. The maximum value of
+: The size of the file in bytes, starting at offset 8. The maximum value of
   this field is 2^32 minus 10 bytes and thus the size of the whole file is at
-  most 4GiB minus 2 bytes.
+  most 4 GiB minus 2 bytes.
 
 'WEBP': 32 bits
 
-: The ASCII characters 'W' 'E' 'B' 'P'.
+: The ASCII characters 'W', 'E', 'B', 'P'.
 
 A WebP file MUST begin with a RIFF header with the FourCC 'WEBP'. The file size
 in the header is the total size of the chunks that follow plus `4` bytes for
@@ -188,10 +188,10 @@ Simple WebP (lossy) file format:
     |                    WebP file header (12 bytes)                |
     |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    :                          VP8 chunk                            :
+    :                        'VP8 ' Chunk                           :
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
-VP8 chunk:
+'VP8 ' Chunk:
 
      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
@@ -206,15 +206,15 @@ VP8 data: _Chunk Size_ bytes
 
 : VP8 bitstream data.
 
-Note the fourth character in the 'VP8 ' FourCC is an ASCII space (0x20).
+Note that the fourth character in the 'VP8 ' FourCC is an ASCII space (0x20).
 
-The VP8 bitstream format specification can be found at [VP8 Data Format and
-Decoding Guide][vp8spec]. Note that the VP8 frame header contains the VP8 frame
+The VP8 bitstream format specification is described in [VP8 Data Format and
+Decoding Guide][rfc 6386]. Note that the VP8 frame header contains the VP8 frame
 width and height. That is assumed to be the width and height of the canvas.
 
 The VP8 specification describes how to decode the image into Y'CbCr format. To
-convert to RGB, Rec. 601 SHOULD be used. Applications MAY use another
-conversion method, but visual results may differ among decoders.
+convert to RGB, [Recommendation BT.601][rec601] SHOULD be used. Applications MAY
+use another conversion method, but visual results may differ among decoders.
 
 
 Simple File Format (Lossless)
@@ -235,10 +235,10 @@ Simple WebP (lossless) file format:
     |                    WebP file header (12 bytes)                |
     |                                                               |
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    :                          VP8L chunk                           :
+    :                         'VP8L' Chunk                          :
     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
-VP8L chunk:
+'VP8L' Chunk:
 
      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
@@ -266,17 +266,17 @@ Extended File Format
 
 An extended format file consists of:
 
-  * A 'VP8X' chunk with information about features used in the file.
+  * A 'VP8X' Chunk with information about features used in the file.
 
-  * An optional 'ICCP' chunk with color profile.
+  * An optional 'ICCP' Chunk with a color profile.
 
-  * An optional 'ANIM' chunk with animation control data.
+  * An optional 'ANIM' Chunk with animation control data.
 
   * Image data.
 
-  * An optional 'EXIF' chunk with Exif metadata.
+  * An optional 'EXIF' Chunk with Exif metadata.
 
-  * An optional 'XMP ' chunk with XMP metadata.
+  * An optional 'XMP ' Chunk with XMP metadata.
 
   * An optional list of [unknown chunks](#unknown-chunks).
 
@@ -295,7 +295,7 @@ appears in the wrong place, the file is invalid, but readers MAY parse the
 file, ignoring the chunks that are out of order.
 
 **Rationale:** Setting the order of chunks should allow quicker file
-parsing. For example, if an 'ALPH' chunk does not appear in its required
+parsing. For example, if an 'ALPH' Chunk does not appear in its required
 position, a decoder can choose to stop searching for it. The rule of
 ignoring late chunks should make programs that need to do a full search
 give the same results as the ones stopping early.
@@ -326,7 +326,7 @@ Reserved (Rsv): 2 bits
 
 ICC profile (I): 1 bit
 
-: Set if the file contains an ICC profile.
+: Set if the file contains an 'ICCP' Chunk.
 
 Alpha (L): 1 bit
 
@@ -343,7 +343,7 @@ XMP metadata (X): 1 bit
 
 Animation (A): 1 bit
 
-: Set if this is an animated image. Data in 'ANIM' and 'ANMF' chunks should be
+: Set if this is an animated image. Data in 'ANIM' and 'ANMF' Chunks should be
   used to control the animation.
 
 Reserved (R): 1 bit
@@ -372,9 +372,9 @@ Future specifications may add more fields. Unknown fields MUST be ignored.
 
 #### Animation
 
-An animation is controlled by ANIM and ANMF chunks.
+An animation is controlled by 'ANIM' and 'ANMF' Chunks.
 
-ANIM Chunk:
+'ANIM' Chunk:
 {:#anim_chunk}
 
 For an animated image, this chunk contains the _global parameters_ of the
@@ -396,14 +396,14 @@ Background Color: 32 bits (_uint32_)
 : The default background color of the canvas in \[Blue, Green, Red, Alpha\]
   byte order. This color MAY be used to fill the unused space on the canvas
   around the frames, as well as the transparent pixels of the first frame.
-  Background color is also used when disposal method is `1`.
+  The background color is also used when the Disposal method is `1`.
 
 **Note**:
 
-  * Background color MAY contain a non-opaque alpha value, even if the _Alpha_
-    flag in [VP8X chunk](#extended_header) is unset.
+  * The background color MAY contain a non-opaque alpha value, even if the
+    _Alpha_ flag in the ['VP8X' Chunk](#extended_header) is unset.
 
-  * Viewer applications SHOULD treat the background color value as a hint, and
+  * Viewer applications SHOULD treat the background color value as a hint and
     are not required to use it.
 
   * The canvas is cleared at the start of each loop. The background color MAY be
@@ -411,13 +411,14 @@ Background Color: 32 bits (_uint32_)
 
 Loop Count: 16 bits (_uint16_)
 
-: The number of times to loop the animation. `0` means infinitely.
+: The number of times to loop the animation. If it is `0`, this means
+  infinitely.
 
-This chunk MUST appear if the _Animation_ flag in the VP8X chunk is set.
+This chunk MUST appear if the _Animation_ flag in the 'VP8X' Chunk is set.
 If the _Animation_ flag is not set and this chunk is present, it MUST be
 ignored.
 
-ANMF chunk:
+'ANMF' Chunk:
 
 For animated images, this chunk contains information about a _single_ frame.
 If the _Animation flag_ is not set, then this chunk SHOULD NOT be present.
@@ -459,10 +460,10 @@ Frame Height Minus One: 24 bits (_uint24_)
 
 Frame Duration: 24 bits (_uint24_)
 
-: The time to wait before displaying the next frame, in 1 millisecond units.
-  Note the interpretation of frame duration of 0 (and often <= 10) is
-  implementation defined. Many tools and browsers assign a minimum duration
-  similar to GIF.
+: The time to wait before displaying the next frame, in 1-millisecond units.
+  Note that the interpretation of the Frame Duration of 0 (and often <= 10) is
+  defined by the implementation. Many tools and browsers assign a minimum
+  duration similar to GIF.
 
 Reserved: 6 bits
 
@@ -473,10 +474,10 @@ Blending method (B): 1 bit
 : Indicates how transparent pixels of _the current frame_ are to be blended
   with corresponding pixels of the previous canvas:
 
-    * `0`: Use alpha blending. After disposing of the previous frame, render the
+    * `0`: Use alpha-blending. After disposing of the previous frame, render the
       current frame on the canvas using [alpha-blending](#alpha-blending). If
-      the current frame does not have an alpha channel, assume alpha value of
-      255, effectively replacing the rectangle.
+      the current frame does not have an alpha channel, assume the alpha value
+      is 255, effectively replacing the rectangle.
 
     * `1`: Do not blend. After disposing of the previous frame, render the
       current frame on the canvas by overwriting the rectangle covered by the
@@ -489,20 +490,20 @@ Disposal method (D): 1 bit
 
     * `0`: Do not dispose. Leave the canvas as is.
 
-    * `1`: Dispose to background color. Fill the _rectangle_ on the canvas
-      covered by the _current frame_ with background color specified in the
-      [ANIM chunk](#anim_chunk).
+    * `1`: Dispose to the background color. Fill the _rectangle_ on the canvas
+      covered by the _current frame_ with the background color specified in the
+      ['ANIM' Chunk](#anim_chunk).
 
 **Notes**:
 
   * The frame disposal only applies to the _frame rectangle_, that is, the
-    rectangle defined by _Frame X_, _Frame Y_, _frame width_ and _frame height_.
-    It may or may not cover the whole canvas.
+    rectangle defined by _Frame X_, _Frame Y_, _frame width_, and _frame
+    height_. It may or may not cover the whole canvas.
 
 {:#alpha-blending}
-  * **Alpha-blending**:
+  * Alpha-blending:
 
-    Given that each of the R, G, B and A channels is 8-bit, and the RGB
+    Given that each of the R, G, B, and A channels is 8 bits, and the RGB
     channels are _not premultiplied_ by alpha, the formula for blending
     'dst' onto 'src' is:
 
@@ -518,8 +519,8 @@ Disposal method (D): 1 bit
 
   * Alpha-blending SHOULD be done in linear color space, by taking into account
     the [color profile](#color-profile) of the image. If the color profile is
-    not present, sRGB is to be assumed. (Note that sRGB also needs to be
-    linearized due to a gamma of ~2.2).
+    not present, standard RGB (sRGB) is to be assumed. (Note that sRGB also
+    needs to be linearized due to a gamma of ~2.2.)
 
 Frame Data: _Chunk Size_ - `16` bytes
 
@@ -532,7 +533,7 @@ Frame Data: _Chunk Size_ - `16` bytes
   * An optional list of [unknown chunks](#unknown-chunks).
 
 **Note**: The 'ANMF' payload, _Frame Data_ above, consists of individual
-_padded_ chunks as described by the [RIFF file format](#riff-file-format).
+_padded_ chunks, as described by the [RIFF file format](#riff-file-format).
 
 #### Alpha
 
@@ -549,18 +550,20 @@ Reserved (Rsv): 2 bits
 
 : MUST be `0`. Readers MUST ignore this field.
 
-Pre-processing (P): 2 bits
+Preprocessing (P): 2 bits
 
-: These _informative_ bits are used to signal the pre-processing that has
+: These _informative_ bits are used to signal the preprocessing that has
   been performed during compression. The decoder can use this information to
   for example, dither the values or smooth the gradients prior to display.
 
-    * `0`: No pre-processing.
+    * `0`: No preprocessing.
     * `1`: Level reduction.
 
+Decoders are not required to use this information in any specified way.
+
 Filtering method (F): 2 bits
 
-: The filtering method used:
+: The filtering methods used are described as follows:
 
     * `0`: None.
     * `1`: Horizontal filter.
@@ -584,8 +587,8 @@ made depending on the filtering method:
 
 where `clip(v)` is equal to:
 
-  * 0    if v < 0
-  * 255  if v > 255
+  * 0    if v < 0,
+  * 255  if v > 255, or
   * v    otherwise
 
 The final value is derived by adding the decompressed value `X` to the
@@ -594,17 +597,15 @@ into the \[0..255\] one:
 
 `alpha = (predictor + X) % 256`
 
-There are special cases for the left-most and top-most pixel positions:
+There are special cases for the left-most and top-most pixel positions. For
+example, the top-left value at location (0, 0) uses 0 as the predictor value.
+Otherwise:
 
-  * The top-left value at location (0, 0) uses 0 as predictor value. Otherwise,
   * For horizontal or gradient filtering methods, the left-most pixels at
     location (0, y) are predicted using the location (0, y-1) just above.
   * For vertical or gradient filtering methods, the top-most pixels at
     location (x, 0) are predicted using the location (x-1, 0) on the left.
 
-
-Decoders are not required to use this information in any specified way.
-
 Compression method (C): 2 bits
 
 : The compression method used:
@@ -617,32 +618,32 @@ Alpha bitstream: _Chunk Size_ - `1` bytes
 : Encoded alpha bitstream.
 
 This optional chunk contains encoded alpha data for this frame. A frame
-containing a 'VP8L' chunk SHOULD NOT contain this chunk.
+containing a 'VP8L' Chunk SHOULD NOT contain this chunk.
 
 **Rationale**: The transparency information is already part of the 'VP8L'
-chunk.
+Chunk.
 
-The alpha channel data is stored as uncompressed raw data (when
+The alpha channel data is stored as uncompressed raw data (when the
 compression method is '0') or compressed using the lossless format
 (when the compression method is '1').
 
-  * Raw data: consists of a byte sequence of length width * height,
+  * Raw data: This consists of a byte sequence of length = width * height,
     containing all the 8-bit transparency values in scan order.
 
-  * Lossless format compression: the byte sequence is a compressed
-    image-stream (as described in the [WebP Lossless Bitstream Format]
-    [webpllspec]) of implicit dimension width x height. That is, this
-    image-stream does NOT contain any headers describing the image dimension.
+  * Lossless format compression: The byte sequence is a compressed
+    image-stream (as described in ["WebP Lossless Bitstream Format"]
+    [webpllspec]) of implicit dimensions width x height. That is, this
+    image-stream does NOT contain any headers describing the image dimensions.
 
-    **Rationale**: the dimension is already known from other sources,
-    so storing it again would be redundant and error-prone.
+    **Rationale**: The dimensions are already known from other sources,
+    so storing them again would be redundant and prone to error.
 
-    Once the image-stream is decoded into ARGB color values, following
-    the process described in the lossless format specification, the
-    transparency information must be extracted from the *green* channel
-    of the ARGB quadruplet.
+    Once the image-stream is decoded into Alpha, Red, Green, Blue (ARGB) color
+    values, following the process described in the lossless format
+    specification, the transparency information must be extracted from the
+    *green* channel of the ARGB quadruplet.
 
-    **Rationale**: the green channel is allowed extra transformation
+    **Rationale**: The green channel is allowed extra transformation
     steps in the specification -- unlike the other channels -- that can
     improve compression.
 
@@ -650,13 +651,13 @@ compression method is '0') or compressed using the lossless format
 
 This chunk contains compressed bitstream data for a single frame.
 
-A bitstream chunk may be either (i) a VP8 chunk, using "VP8 " (note the
-significant fourth-character space) as its tag _or_ (ii) a VP8L chunk, using
-"VP8L" as its tag.
+A bitstream chunk may be either (i) a 'VP8 ' Chunk, using 'VP8 ' (note the
+significant fourth-character space) as its FourCC, _or_ (ii) a 'VP8L' Chunk,
+using 'VP8L' as its FourCC.
 
-The formats of VP8 and VP8L chunks are as described in sections
+The formats of 'VP8 ' and 'VP8L' Chunks are as described in sections
 [Simple File Format (Lossy)](#simple-file-format-lossy)
-and [Simple File Format (Lossless)](#simple-file-format-lossless) respectively.
+and [Simple File Format (Lossless)](#simple-file-format-lossless), respectively.
 
 #### Color Profile
 
@@ -683,14 +684,14 @@ If this chunk is not present, sRGB SHOULD be assumed.
 
 #### Metadata
 
-Metadata can be stored in 'EXIF' or 'XMP ' chunks.
+Metadata can be stored in 'EXIF' or 'XMP ' Chunks.
 
 There SHOULD be at most one chunk of each type ('EXIF' and 'XMP '). If there
 are more such chunks, readers MAY ignore all except the first one.
 
 The chunks are defined as follows:
 
-EXIF chunk:
+'EXIF' Chunk:
 
      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
@@ -705,7 +706,7 @@ Exif Metadata: _Chunk Size_ bytes
 
 : Image metadata in Exif format.
 
-XMP chunk:
+'XMP ' Chunk:
 
      0                   1                   2                   3
      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
@@ -720,62 +721,62 @@ XMP Metadata: _Chunk Size_ bytes
 
 : Image metadata in XMP format.
 
-Note the fourth character in the 'XMP ' FourCC is an ASCII space (0x20).
+Note that the fourth character in the 'XMP ' FourCC is an ASCII space (0x20).
 
 Additional guidance about handling metadata can be found in the
-Metadata Working Group's [Guidelines for Handling Metadata][metadata].
+Metadata Working Group's ["Guidelines for Handling Metadata"][metadata].
 
 #### Unknown Chunks
 
-A RIFF chunk (described in [this](#terminology-amp-basics) section) whose _chunk
-tag_ is different from any of the chunks described in this document, is
+A RIFF chunk (described in the [RIFF File Format](#riff-file-format) section)
+whose FourCC is different from any of the chunks described in this document, is
 considered an _unknown chunk_.
 
 **Rationale**: Allowing unknown chunks gives a provision for future extension
-of the format, and also allows storage of any application-specific data.
+of the format and also allows storage of any application-specific data.
 
 A file MAY contain unknown chunks:
 
-  * At the end of the file as described in [Extended WebP file
-    header](#extended_header) section.
-  * At the end of ANMF chunks as described in the
+  * at the end of the file, as described in [Extended WebP file
+    header](#extended_header) section, or
+  * at the end of 'ANMF' Chunks, as described in the
     [Animation](#animation) section.
 
 Readers SHOULD ignore these chunks. Writers SHOULD preserve them in their
 original order (unless they specifically intend to modify these chunks).
 
-### Assembling the Canvas From Frames
+### Canvas Assembly from Frames
 
 Here we provide an overview of how a reader MUST assemble a canvas in the case
 of an animated image.
 
 The process begins with creating a canvas using the dimensions given in the
-'VP8X' chunk, `Canvas Width Minus One + 1` pixels wide by `Canvas Height Minus
-One + 1` pixels high. The `Loop Count` field from the 'ANIM' chunk controls how
+'VP8X' Chunk, `Canvas Width Minus One + 1` pixels wide by `Canvas Height Minus
+One + 1` pixels high. The `Loop Count` field from the 'ANIM' Chunk controls how
 many times the animation process is repeated. This is `Loop Count - 1` for
-non-zero `Loop Count` values or infinitely if `Loop Count` is zero.
+nonzero `Loop Count` values or infinite if the `Loop Count` is zero.
 
-At the beginning of each loop iteration the canvas is filled using the
-background color from the 'ANIM' chunk or an application defined color.
+At the beginning of each loop iteration, the canvas is filled using the
+background color from the 'ANIM' Chunk or an application-defined color.
 
-'ANMF' chunks contain individual frames given in display order. Before rendering
+'ANMF' Chunks contain individual frames given in display order. Before rendering
 each frame, the previous frame's `Disposal method` is applied.
 
 The rendering of the decoded frame begins at the Cartesian coordinates (`2 *
-Frame X`, `2 * Frame Y`) using the top-left corner of the canvas as the origin.
+Frame X`, `2 * Frame Y`), using the top-left corner of the canvas as the origin.
 `Frame Width Minus One + 1` pixels wide by `Frame Height Minus One + 1` pixels
 high are rendered onto the canvas using the `Blending method`.
 
 The canvas is displayed for `Frame Duration` milliseconds. This continues until
-all frames given by 'ANMF' chunks have been displayed. A new loop iteration is
-then begun or the canvas is left in its final state if all iterations have been
+all frames given by 'ANMF' Chunks have been displayed. A new loop iteration is
+then begun, or the canvas is left in its final state if all iterations have been
 completed.
 
 The following pseudocode illustrates the rendering process. The notation
-_VP8X.field_ means the field in the 'VP8X' chunk with the same description.
+_VP8X.field_ means the field in the 'VP8X' Chunk with the same description.
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-assert VP8X.flags.hasAnimation
+VP8X.flags.hasAnimation MUST be TRUE
 canvas ← new image of size VP8X.canvasWidth x VP8X.canvasHeight with
          background color ANIM.background_color.
 loop_count ← ANIM.loopCount
@@ -783,9 +784,9 @@ dispose_method ← Dispose to background color
 if loop_count == 0:
   loop_count = ∞
 frame_params ← nil
-assert next chunk in image_data is ANMF
+next chunk in image_data is ANMF MUST be TRUE
 for loop = 0..loop_count - 1
-  clear canvas to ANIM.background_color or application defined color
+  clear canvas to ANIM.background_color or application-defined color
   until eof or non-ANMF chunk
     frame_params.frameX = Frame X
     frame_params.frameY = Frame Y
@@ -794,22 +795,24 @@ for loop = 0..loop_count - 1
     frame_params.frameDuration = Frame Duration
     frame_right = frame_params.frameX + frame_params.frameWidth
     frame_bottom = frame_params.frameY + frame_params.frameHeight
-    assert VP8X.canvasWidth >= frame_right
-    assert VP8X.canvasHeight >= frame_bottom
+    VP8X.canvasWidth >= frame_right MUST be TRUE
+    VP8X.canvasHeight >= frame_bottom MUST be TRUE
     for subchunk in 'Frame Data':
       if subchunk.tag == "ALPH":
-        assert alpha subchunks not found in 'Frame Data' earlier
+        alpha subchunks not found in 'Frame Data' earlier MUST be
+          TRUE
         frame_params.alpha = alpha_data
       else if subchunk.tag == "VP8 " OR subchunk.tag == "VP8L":
-        assert bitstream subchunks not found in 'Frame Data' earlier
+        bitstream subchunks not found in 'Frame Data' earlier MUST
+          be TRUE
         frame_params.bitstream = bitstream_data
     render frame with frame_params.alpha and frame_params.bitstream
       on canvas with top-left corner at (frame_params.frameX,
-      frame_params.frameY), using blending method
+      frame_params.frameY), using Blending method
       frame_params.blendingMethod.
     canvas contains the decoded image.
     Show the contents of the canvas for
-    frame_params.frameDuration * 1ms.
+    frame_params.frameDuration * 1 ms.
     dispose_method = frame_params.disposeMethod
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
@@ -817,7 +820,7 @@ for loop = 0..loop_count - 1
 Example File Layouts
 --------------------
 
-A lossy encoded image with alpha may look as follows:
+A lossy-encoded image with alpha may look as follows:
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 RIFF/WEBP
@@ -826,16 +829,16 @@ RIFF/WEBP
 +- VP8 (bitstream)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-A losslessly encoded image may look as follows:
+A lossless-encoded image may look as follows:
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 RIFF/WEBP
 +- VP8X (descriptions of features used)
-+- XYZW (unknown chunk)
 +- VP8L (lossless bitstream)
++- XYZW (unknown chunk)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-A lossless image with ICC profile and XMP metadata may
+A lossless image with an ICC profile and XMP metadata may
 look as follows:
 
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -859,10 +862,11 @@ RIFF/WEBP
 +- EXIF (metadata)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-[vp8spec]:  https://datatracker.ietf.org/doc/html/rfc6386
 [webpllspec]: https://chromium.googlesource.com/webm/libwebp/+/HEAD/doc/webp-lossless-bitstream-spec.txt
 [iccspec]: https://www.color.org/icc_specs2.xalter
 [metadata]: https://web.archive.org/web/20180919181934/http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf
+[rec601]: https://www.itu.int/rec/R-REC-BT.601
 [rfc 1166]: https://datatracker.ietf.org/doc/html/rfc1166
 [rfc 2119]: https://datatracker.ietf.org/doc/html/rfc2119
+[rfc 6386]: https://datatracker.ietf.org/doc/html/rfc6386
 [rfc 8174]: https://datatracker.ietf.org/doc/html/rfc8174

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 267 - 247
webp.mod/libwebp/doc/webp-lossless-bitstream-spec.txt


+ 5 - 1
webp.mod/libwebp/examples/anim_dump.c

@@ -98,7 +98,11 @@ int main(int argc, const char* argv[]) {
       for (i = 0; !error && i < image.num_frames; ++i) {
         W_CHAR out_file[1024];
         WebPDecBuffer buffer;
-        WebPInitDecBuffer(&buffer);
+        if (!WebPInitDecBuffer(&buffer)) {
+          fprintf(stderr, "Cannot init dec buffer\n");
+          error = 1;
+          continue;
+        }
         buffer.colorspace = MODE_RGBA;
         buffer.is_external_memory = 1;
         buffer.width = image.canvas_width;

+ 9 - 5
webp.mod/libwebp/examples/cwebp.c

@@ -306,6 +306,7 @@ static int MyWriter(const uint8_t* data, size_t data_size,
 // Dumps a picture as a PGM file using the IMC4 layout.
 static int DumpPicture(const WebPPicture* const picture, const char* PGM_name) {
   int y;
+  int ok = 0;
   const int uv_width = (picture->width + 1) / 2;
   const int uv_height = (picture->height + 1) / 2;
   const int stride = (picture->width + 1) & ~1;
@@ -320,23 +321,26 @@ static int DumpPicture(const WebPPicture* const picture, const char* PGM_name) {
   if (f == NULL) return 0;
   fprintf(f, "P5\n%d %d\n255\n", stride, height);
   for (y = 0; y < picture->height; ++y) {
-    if (fwrite(src_y, picture->width, 1, f) != 1) return 0;
+    if (fwrite(src_y, picture->width, 1, f) != 1) goto Error;
     if (picture->width & 1) fputc(0, f);  // pad
     src_y += picture->y_stride;
   }
   for (y = 0; y < uv_height; ++y) {
-    if (fwrite(src_u, uv_width, 1, f) != 1) return 0;
-    if (fwrite(src_v, uv_width, 1, f) != 1) return 0;
+    if (fwrite(src_u, uv_width, 1, f) != 1) goto Error;
+    if (fwrite(src_v, uv_width, 1, f) != 1) goto Error;
     src_u += picture->uv_stride;
     src_v += picture->uv_stride;
   }
   for (y = 0; y < alpha_height; ++y) {
-    if (fwrite(src_a, picture->width, 1, f) != 1) return 0;
+    if (fwrite(src_a, picture->width, 1, f) != 1) goto Error;
     if (picture->width & 1) fputc(0, f);  // pad
     src_a += picture->a_stride;
   }
+  ok = 1;
+
+ Error:
   fclose(f);
-  return 1;
+  return ok;
 }
 
 // -----------------------------------------------------------------------------

+ 1 - 1
webp.mod/libwebp/examples/vwebp.c

@@ -613,7 +613,7 @@ int main(int argc, char* argv[]) {
 
   // Position iterator to last frame. Next call to HandleDisplay will wrap over.
   // We take this into account by bumping up loop_count.
-  WebPDemuxGetFrame(kParams.dmux, 0, curr);
+  if (!WebPDemuxGetFrame(kParams.dmux, 0, curr)) goto Error;
   if (kParams.loop_count) ++kParams.loop_count;
 
 #if defined(__unix__) || defined(__CYGWIN__)

+ 6 - 6
webp.mod/libwebp/examples/webpinfo.c

@@ -357,12 +357,12 @@ static WebPInfoStatus ParseLossyHeader(const ChunkData* const chunk_data,
   }
   data += 3;
   data_size -= 3;
-  printf("  Key frame:        %s\n"
-         "  Profile:          %d\n"
-         "  Display:          %s\n"
-         "  Part. 0 length:   %d\n",
-         key_frame ? "Yes" : "No", profile,
-         display ? "Yes" : "No", partition0_length);
+  printf(
+      "  Key frame:        %s\n"
+      "  Profile:          %d\n"
+      "  Display:          Yes\n"
+      "  Part. 0 length:   %d\n",
+      key_frame ? "Yes" : "No", profile, partition0_length);
   if (key_frame) {
     if (!(data[0] == 0x9d && data[1] == 0x01 && data[2] == 0x2a)) {
       LOG_ERROR("Invalid lossy bitstream signature.");

+ 1 - 1
webp.mod/libwebp/extras/vwebp_sdl.c

@@ -30,7 +30,7 @@
 #if defined(WEBP_HAVE_JUST_SDL_H)
 #include <SDL.h>
 #else
-#include <SDL/SDL.h>
+#include <SDL2/SDL.h>
 #endif
 
 static void ProcessEvents(void) {

+ 35 - 48
webp.mod/libwebp/extras/webp_to_sdl.c

@@ -20,88 +20,75 @@
 #include "webp_to_sdl.h"
 
 #include <stdio.h>
+
 #include "src/webp/decode.h"
 
 #if defined(WEBP_HAVE_JUST_SDL_H)
 #include <SDL.h>
 #else
-#include <SDL/SDL.h>
+#include <SDL2/SDL.h>
 #endif
 
 static int init_ok = 0;
 int WebPToSDL(const char* data, unsigned int data_size) {
   int ok = 0;
   VP8StatusCode status;
-  WebPDecoderConfig config;
-  WebPBitstreamFeatures* const input = &config.input;
-  WebPDecBuffer* const output = &config.output;
-  SDL_Surface* screen = NULL;
-  SDL_Surface* surface = NULL;
-
-  if (!WebPInitDecoderConfig(&config)) {
-    fprintf(stderr, "Library version mismatch!\n");
-    return 0;
-  }
+  WebPBitstreamFeatures input;
+  uint8_t* output = NULL;
+  SDL_Window* window = NULL;
+  SDL_Renderer* renderer = NULL;
+  SDL_Texture* texture = NULL;
+  int width, height;
 
   if (!init_ok) {
     SDL_Init(SDL_INIT_VIDEO);
     init_ok = 1;
   }
 
-  status = WebPGetFeatures((uint8_t*)data, (size_t)data_size, &config.input);
+  status = WebPGetFeatures((uint8_t*)data, (size_t)data_size, &input);
   if (status != VP8_STATUS_OK) goto Error;
+  width = input.width;
+  height = input.height;
 
-  screen = SDL_SetVideoMode(input->width, input->height, 32, SDL_SWSURFACE);
-  if (screen == NULL) {
-    fprintf(stderr, "Unable to set video mode (32bpp %dx%d)!\n",
-            input->width, input->height);
+  SDL_CreateWindowAndRenderer(width, height, 0, &window, &renderer);
+  if (window == NULL || renderer == NULL) {
+    fprintf(stderr, "Unable to create window or renderer!\n");
     goto Error;
   }
-
-  surface = SDL_CreateRGBSurface(SDL_SWSURFACE,
-                                 input->width, input->height, 32,
-                                 0x000000ffu,   // R mask
-                                 0x0000ff00u,   // G mask
-                                 0x00ff0000u,   // B mask
-                                 0xff000000u);  // A mask
-
-  if (surface == NULL) {
-    fprintf(stderr, "Unable to create %dx%d RGBA surface!\n",
-            input->width, input->height);
+  SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY,
+              "linear");  // make the scaled rendering look smoother.
+  SDL_RenderSetLogicalSize(renderer, width, height);
+
+  texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ABGR8888,
+                              SDL_TEXTUREACCESS_STREAMING, width, height);
+  if (texture == NULL) {
+    fprintf(stderr, "Unable to create %dx%d RGBA texture!\n", width, height);
     goto Error;
   }
-  if (SDL_MUSTLOCK(surface)) SDL_LockSurface(surface);
 
 #if SDL_BYTEORDER == SDL_BIG_ENDIAN
-  output->colorspace = MODE_BGRA;
+  output = WebPDecodeBGRA((const uint8_t*)data, (size_t)data_size, &width,
+                          &height);
 #else
-  output->colorspace = MODE_RGBA;
+  output = WebPDecodeRGBA((const uint8_t*)data, (size_t)data_size, &width,
+                          &height);
 #endif
-  output->width  = surface->w;
-  output->height = surface->h;
-  output->u.RGBA.rgba   = surface->pixels;
-  output->u.RGBA.stride = surface->pitch;
-  output->u.RGBA.size   = surface->pitch * surface->h;
-  output->is_external_memory = 1;
-
-  status = WebPDecode((const uint8_t*)data, (size_t)data_size, &config);
-  if (status != VP8_STATUS_OK) {
+  if (output == NULL) {
     fprintf(stderr, "Error decoding image (%d)\n", status);
     goto Error;
   }
 
-  if (SDL_MUSTLOCK(surface)) SDL_UnlockSurface(surface);
-  if (SDL_BlitSurface(surface, NULL, screen, NULL) ||
-      SDL_Flip(screen)) {
-    goto Error;
-  }
-
+  SDL_UpdateTexture(texture, NULL, output, width * sizeof(uint32_t));
+  SDL_RenderClear(renderer);
+  SDL_RenderCopy(renderer, texture, NULL, NULL);
+  SDL_RenderPresent(renderer);
   ok = 1;
 
  Error:
-  SDL_FreeSurface(surface);
-  SDL_FreeSurface(screen);
-  WebPFreeDecBuffer(output);
+  // We should call SDL_DestroyWindow(window) but that makes .js fail.
+  SDL_DestroyRenderer(renderer);
+  SDL_DestroyTexture(texture);
+  WebPFree(output);
   return ok;
 }
 

+ 52 - 29
webp.mod/libwebp/imageio/image_enc.c

@@ -260,14 +260,20 @@ int WebPWritePAM(FILE* fout, const WebPDecBuffer* const buffer) {
 
 // Save 16b mode (RGBA4444, RGB565, ...) for debugging purpose.
 int WebPWrite16bAsPGM(FILE* fout, const WebPDecBuffer* const buffer) {
-  const uint32_t width = buffer->width;
-  const uint32_t height = buffer->height;
-  const uint8_t* rgba = buffer->u.RGBA.rgba;
-  const int stride = buffer->u.RGBA.stride;
+  uint32_t width, height;
+  uint8_t* rgba;
+  int stride;
   const uint32_t bytes_per_px = 2;
   uint32_t y;
 
-  if (fout == NULL || buffer == NULL || rgba == NULL) return 0;
+  if (fout == NULL || buffer == NULL) return 0;
+
+  width = buffer->width;
+  height = buffer->height;
+  rgba = buffer->u.RGBA.rgba;
+  stride = buffer->u.RGBA.stride;
+
+  if (rgba == NULL) return 0;
 
   fprintf(fout, "P5\n%u %u\n255\n", width * bytes_per_px, height);
   for (y = 0; y < height; ++y) {
@@ -295,22 +301,29 @@ static void PutLE32(uint8_t* const dst, uint32_t value) {
 #define BMP_HEADER_SIZE 54
 #define BMP_HEADER_ALPHA_EXTRA_SIZE 16  // for alpha info
 int WebPWriteBMP(FILE* fout, const WebPDecBuffer* const buffer) {
-  const int has_alpha = WebPIsAlphaMode(buffer->colorspace);
-  const int header_size =
-      BMP_HEADER_SIZE + (has_alpha ? BMP_HEADER_ALPHA_EXTRA_SIZE : 0);
-  const uint32_t width = buffer->width;
-  const uint32_t height = buffer->height;
-  const uint8_t* rgba = buffer->u.RGBA.rgba;
-  const int stride = buffer->u.RGBA.stride;
-  const uint32_t bytes_per_px = has_alpha ? 4 : 3;
+  int has_alpha, header_size;
+  uint32_t width, height;
+  uint8_t* rgba;
+  int stride;
   uint32_t y;
-  const uint32_t line_size = bytes_per_px * width;
-  const uint32_t bmp_stride = (line_size + 3) & ~3;   // pad to 4
-  const uint32_t image_size = bmp_stride * height;
-  const uint32_t total_size =  image_size + header_size;
+  uint32_t bytes_per_px, line_size, image_size, bmp_stride, total_size;
   uint8_t bmp_header[BMP_HEADER_SIZE + BMP_HEADER_ALPHA_EXTRA_SIZE] = { 0 };
 
-  if (fout == NULL || buffer == NULL || rgba == NULL) return 0;
+  if (fout == NULL || buffer == NULL) return 0;
+
+  has_alpha = WebPIsAlphaMode(buffer->colorspace);
+  header_size = BMP_HEADER_SIZE + (has_alpha ? BMP_HEADER_ALPHA_EXTRA_SIZE : 0);
+  width = buffer->width;
+  height = buffer->height;
+  rgba = buffer->u.RGBA.rgba;
+  stride = buffer->u.RGBA.stride;
+  bytes_per_px = has_alpha ? 4 : 3;
+  line_size = bytes_per_px * width;
+  bmp_stride = (line_size + 3) & ~3;  // pad to 4
+  image_size = bmp_stride * height;
+  total_size = image_size + header_size;
+
+  if (rgba == NULL) return 0;
 
   // bitmap file header
   PutLE16(bmp_header + 0, 0x4d42);                // signature 'BM'
@@ -372,17 +385,14 @@ int WebPWriteBMP(FILE* fout, const WebPDecBuffer* const buffer) {
 #define TIFF_HEADER_SIZE (EXTRA_DATA_OFFSET + EXTRA_DATA_SIZE)
 
 int WebPWriteTIFF(FILE* fout, const WebPDecBuffer* const buffer) {
-  const int has_alpha = WebPIsAlphaMode(buffer->colorspace);
-  const uint32_t width = buffer->width;
-  const uint32_t height = buffer->height;
-  const uint8_t* rgba = buffer->u.RGBA.rgba;
-  const int stride = buffer->u.RGBA.stride;
-  const uint8_t bytes_per_px = has_alpha ? 4 : 3;
-  const uint8_t assoc_alpha =
-      WebPIsPremultipliedMode(buffer->colorspace) ? 1 : 2;
+  int has_alpha;
+  uint32_t width, height;
+  uint8_t* rgba;
+  int stride;
+  uint8_t bytes_per_px = 0;
+  const uint8_t assoc_alpha = 0;
   // For non-alpha case, we omit tag 0x152 (ExtraSamples).
-  const uint8_t num_ifd_entries = has_alpha ? NUM_IFD_ENTRIES
-                                            : NUM_IFD_ENTRIES - 1;
+  const uint8_t num_ifd_entries = 0;
   uint8_t tiff_header[TIFF_HEADER_SIZE] = {
     0x49, 0x49, 0x2a, 0x00,   // little endian signature
     8, 0, 0, 0,               // offset to the unique IFD that follows
@@ -416,7 +426,20 @@ int WebPWriteTIFF(FILE* fout, const WebPDecBuffer* const buffer) {
   };
   uint32_t y;
 
-  if (fout == NULL || buffer == NULL || rgba == NULL) return 0;
+  if (fout == NULL || buffer == NULL) return 0;
+
+  has_alpha = WebPIsAlphaMode(buffer->colorspace);
+  width = buffer->width;
+  height = buffer->height;
+  rgba = buffer->u.RGBA.rgba;
+  stride = buffer->u.RGBA.stride;
+
+  if (rgba == NULL) return 0;
+
+  // Update bytes_per_px, num_ifd_entries and assoc_alpha.
+  tiff_header[38] = tiff_header[102] = bytes_per_px = has_alpha ? 4 : 3;
+  tiff_header[8] = has_alpha ? NUM_IFD_ENTRIES : NUM_IFD_ENTRIES - 1;
+  tiff_header[186] = WebPIsPremultipliedMode(buffer->colorspace) ? 1 : 2;
 
   // Fill placeholders in IFD:
   PutLE32(tiff_header + 10 + 8, width);

+ 14 - 4
webp.mod/libwebp/iosbuild.sh

@@ -41,6 +41,7 @@ readonly TARGETDIR="${TOPDIR}/WebP.framework"
 readonly DECTARGETDIR="${TOPDIR}/WebPDecoder.framework"
 readonly MUXTARGETDIR="${TOPDIR}/WebPMux.framework"
 readonly DEMUXTARGETDIR="${TOPDIR}/WebPDemux.framework"
+readonly SHARPYUVTARGETDIR="${TOPDIR}/SharpYuv.framework"
 readonly DEVELOPER=$(xcode-select --print-path)
 readonly PLATFORMSROOT="${DEVELOPER}/Platforms"
 readonly LIPO=$(xcrun -sdk iphoneos${SDK} -find lipo)
@@ -63,7 +64,8 @@ echo "Xcode Version: ${XCODE}"
 echo "iOS SDK Version: ${SDK}"
 
 if [[ -e "${BUILDDIR}" || -e "${TARGETDIR}" || -e "${DECTARGETDIR}" \
-      || -e "${MUXTARGETDIR}" || -e "${DEMUXTARGETDIR}" ]]; then
+      || -e "${MUXTARGETDIR}" || -e "${DEMUXTARGETDIR}" \
+      || -e "${SHARPYUVTARGETDIR}" ]]; then
   cat << EOF
 WARNING: The following directories will be deleted:
 WARNING:   ${BUILDDIR}
@@ -71,14 +73,16 @@ WARNING:   ${TARGETDIR}
 WARNING:   ${DECTARGETDIR}
 WARNING:   ${MUXTARGETDIR}
 WARNING:   ${DEMUXTARGETDIR}
+WARNING:   ${SHARPYUVTARGETDIR}
 WARNING: The build will continue in 5 seconds...
 EOF
   sleep 5
 fi
 rm -rf ${BUILDDIR} ${TARGETDIR} ${DECTARGETDIR} \
-    ${MUXTARGETDIR} ${DEMUXTARGETDIR}
+    ${MUXTARGETDIR} ${DEMUXTARGETDIR} ${SHARPYUVTARGETDIR}
 mkdir -p ${BUILDDIR} ${TARGETDIR}/Headers/ ${DECTARGETDIR}/Headers/ \
-    ${MUXTARGETDIR}/Headers/ ${DEMUXTARGETDIR}/Headers/
+    ${MUXTARGETDIR}/Headers/ ${DEMUXTARGETDIR}/Headers/ \
+    ${SHARPYUVTARGETDIR}/Headers/
 
 if [[ ! -e ${SRCDIR}/configure ]]; then
   if ! (cd ${SRCDIR} && sh autogen.sh); then
@@ -134,13 +138,14 @@ for PLATFORM in ${PLATFORMS}; do
   set +x
 
   # Build only the libraries, skip the examples.
-  make V=0 -C sharpyuv
+  make V=0 -C sharpyuv install
   make V=0 -C src install
 
   LIBLIST+=" ${ROOTDIR}/lib/libwebp.a"
   DECLIBLIST+=" ${ROOTDIR}/lib/libwebpdecoder.a"
   MUXLIBLIST+=" ${ROOTDIR}/lib/libwebpmux.a"
   DEMUXLIBLIST+=" ${ROOTDIR}/lib/libwebpdemux.a"
+  SHARPYUVLIBLIST+=" ${ROOTDIR}/lib/libsharpyuv.a"
 
   make clean
 
@@ -165,4 +170,9 @@ cp -a ${SRCDIR}/src/webp/{decode,types,mux_types,demux}.h \
     ${DEMUXTARGETDIR}/Headers/
 ${LIPO} -create ${DEMUXLIBLIST} -output ${DEMUXTARGETDIR}/WebPDemux
 
+echo "SHARPYUVLIBLIST = ${SHARPYUVLIBLIST}"
+cp -a ${SRCDIR}/sharpyuv/{sharpyuv,sharpyuv_csp}.h \
+    ${SHARPYUVTARGETDIR}/Headers/
+${LIPO} -create ${SHARPYUVLIBLIST} -output ${SHARPYUVTARGETDIR}/SharpYuv
+
 echo  "SUCCESS"

+ 7 - 4
webp.mod/libwebp/makefile.unix

@@ -37,13 +37,13 @@ else
 endif
 
 # SDL flags: use sdl-config if it exists
-SDL_CONFIG = $(shell sdl-config --version 2> /dev/null)
+SDL_CONFIG = $(shell sdl2-config --version 2> /dev/null)
 ifneq ($(SDL_CONFIG),)
-  SDL_LIBS = $(shell sdl-config --libs)
-  SDL_FLAGS = $(shell sdl-config --cflags)
+  SDL_LIBS = $(shell sdl2-config --libs)
+  SDL_FLAGS = $(shell sdl2-config --cflags)
 else
   # use best-guess
-  SDL_LIBS = -lSDL
+  SDL_LIBS = -lSDL2
   SDL_FLAGS =
 endif
 
@@ -133,6 +133,7 @@ SHARPYUV_OBJS = \
     sharpyuv/sharpyuv_dsp.o \
     sharpyuv/sharpyuv_gamma.o \
     sharpyuv/sharpyuv_neon.o \
+    sharpyuv/sharpyuv_risk_table.o \
     sharpyuv/sharpyuv_sse2.o \
 
 DEC_OBJS = \
@@ -276,6 +277,7 @@ UTILS_DEC_OBJS = \
     src/utils/color_cache_utils.o \
     src/utils/filters_utils.o \
     src/utils/huffman_utils.o \
+    src/utils/palette.o \
     src/utils/quant_levels_dec_utils.o \
     src/utils/random_utils.o \
     src/utils/rescaler_utils.o \
@@ -343,6 +345,7 @@ HDRS = \
     src/utils/filters_utils.h \
     src/utils/huffman_utils.h \
     src/utils/huffman_encode_utils.h \
+    src/utils/palette.h \
     src/utils/quant_levels_utils.h \
     src/utils/quant_levels_dec_utils.h \
     src/utils/random_utils.h \

+ 1 - 0
webp.mod/libwebp/sharpyuv/Makefile.am

@@ -30,6 +30,7 @@ libsharpyuv_la_SOURCES += sharpyuv_cpu.c sharpyuv_cpu.h
 libsharpyuv_la_SOURCES += sharpyuv_csp.c sharpyuv_csp.h
 libsharpyuv_la_SOURCES += sharpyuv_dsp.c sharpyuv_dsp.h
 libsharpyuv_la_SOURCES += sharpyuv_gamma.c sharpyuv_gamma.h
+libsharpyuv_la_SOURCES += sharpyuv_risk_table.c sharpyuv_risk_table.h
 libsharpyuv_la_SOURCES += sharpyuv.c sharpyuv.h
 
 libsharpyuv_la_CPPFLAGS = $(AM_CPPFLAGS)

+ 207 - 59
webp.mod/libwebp/sharpyuv/sharpyuv.c

@@ -23,6 +23,7 @@
 #include "sharpyuv/sharpyuv_cpu.h"
 #include "sharpyuv/sharpyuv_dsp.h"
 #include "sharpyuv/sharpyuv_gamma.h"
+#include "sharpyuv/sharpyuv_risk_table.h"
 
 //------------------------------------------------------------------------------
 
@@ -75,41 +76,48 @@ static int RGBToGray(int64_t r, int64_t g, int64_t b) {
 }
 
 static uint32_t ScaleDown(uint16_t a, uint16_t b, uint16_t c, uint16_t d,
-                          int rgb_bit_depth) {
+                          int rgb_bit_depth,
+                          SharpYuvTransferFunctionType transfer_type) {
   const int bit_depth = rgb_bit_depth + GetPrecisionShift(rgb_bit_depth);
-  const uint32_t A = SharpYuvGammaToLinear(a, bit_depth);
-  const uint32_t B = SharpYuvGammaToLinear(b, bit_depth);
-  const uint32_t C = SharpYuvGammaToLinear(c, bit_depth);
-  const uint32_t D = SharpYuvGammaToLinear(d, bit_depth);
-  return SharpYuvLinearToGamma((A + B + C + D + 2) >> 2, bit_depth);
+  const uint32_t A = SharpYuvGammaToLinear(a, bit_depth, transfer_type);
+  const uint32_t B = SharpYuvGammaToLinear(b, bit_depth, transfer_type);
+  const uint32_t C = SharpYuvGammaToLinear(c, bit_depth, transfer_type);
+  const uint32_t D = SharpYuvGammaToLinear(d, bit_depth, transfer_type);
+  return SharpYuvLinearToGamma((A + B + C + D + 2) >> 2, bit_depth,
+                               transfer_type);
 }
 
 static WEBP_INLINE void UpdateW(const fixed_y_t* src, fixed_y_t* dst, int w,
-                                int rgb_bit_depth) {
+                                int rgb_bit_depth,
+                                SharpYuvTransferFunctionType transfer_type) {
   const int bit_depth = rgb_bit_depth + GetPrecisionShift(rgb_bit_depth);
-  int i;
-  for (i = 0; i < w; ++i) {
-    const uint32_t R = SharpYuvGammaToLinear(src[0 * w + i], bit_depth);
-    const uint32_t G = SharpYuvGammaToLinear(src[1 * w + i], bit_depth);
-    const uint32_t B = SharpYuvGammaToLinear(src[2 * w + i], bit_depth);
+  int i = 0;
+  do {
+    const uint32_t R =
+        SharpYuvGammaToLinear(src[0 * w + i], bit_depth, transfer_type);
+    const uint32_t G =
+        SharpYuvGammaToLinear(src[1 * w + i], bit_depth, transfer_type);
+    const uint32_t B =
+        SharpYuvGammaToLinear(src[2 * w + i], bit_depth, transfer_type);
     const uint32_t Y = RGBToGray(R, G, B);
-    dst[i] = (fixed_y_t)SharpYuvLinearToGamma(Y, bit_depth);
-  }
+    dst[i] = (fixed_y_t)SharpYuvLinearToGamma(Y, bit_depth, transfer_type);
+  } while (++i < w);
 }
 
 static void UpdateChroma(const fixed_y_t* src1, const fixed_y_t* src2,
-                         fixed_t* dst, int uv_w, int rgb_bit_depth) {
-  int i;
-  for (i = 0; i < uv_w; ++i) {
+                         fixed_t* dst, int uv_w, int rgb_bit_depth,
+                         SharpYuvTransferFunctionType transfer_type) {
+  int i = 0;
+  do {
     const int r =
         ScaleDown(src1[0 * uv_w + 0], src1[0 * uv_w + 1], src2[0 * uv_w + 0],
-                  src2[0 * uv_w + 1], rgb_bit_depth);
+                  src2[0 * uv_w + 1], rgb_bit_depth, transfer_type);
     const int g =
         ScaleDown(src1[2 * uv_w + 0], src1[2 * uv_w + 1], src2[2 * uv_w + 0],
-                  src2[2 * uv_w + 1], rgb_bit_depth);
+                  src2[2 * uv_w + 1], rgb_bit_depth, transfer_type);
     const int b =
         ScaleDown(src1[4 * uv_w + 0], src1[4 * uv_w + 1], src2[4 * uv_w + 0],
-                  src2[4 * uv_w + 1], rgb_bit_depth);
+                  src2[4 * uv_w + 1], rgb_bit_depth, transfer_type);
     const int W = RGBToGray(r, g, b);
     dst[0 * uv_w] = (fixed_t)(r - W);
     dst[1 * uv_w] = (fixed_t)(g - W);
@@ -117,15 +125,15 @@ static void UpdateChroma(const fixed_y_t* src1, const fixed_y_t* src2,
     dst  += 1;
     src1 += 2;
     src2 += 2;
-  }
+  } while (++i < uv_w);
 }
 
 static void StoreGray(const fixed_y_t* rgb, fixed_y_t* y, int w) {
-  int i;
+  int i = 0;
   assert(w > 0);
-  for (i = 0; i < w; ++i) {
+  do {
     y[i] = RGBToGray(rgb[0 * w + i], rgb[1 * w + i], rgb[2 * w + i]);
-  }
+  } while (++i < w);
 }
 
 //------------------------------------------------------------------------------
@@ -151,9 +159,9 @@ static void ImportOneRow(const uint8_t* const r_ptr,
   // Convert the rgb_step from a number of bytes to a number of uint8_t or
   // uint16_t values depending the bit depth.
   const int step = (rgb_bit_depth > 8) ? rgb_step / 2 : rgb_step;
-  int i;
+  int i = 0;
   const int w = (pic_width + 1) & ~1;
-  for (i = 0; i < pic_width; ++i) {
+  do {
     const int off = i * step;
     const int shift = GetPrecisionShift(rgb_bit_depth);
     if (rgb_bit_depth == 8) {
@@ -165,7 +173,7 @@ static void ImportOneRow(const uint8_t* const r_ptr,
       dst[i + 1 * w] = Shift(((uint16_t*)g_ptr)[off], shift);
       dst[i + 2 * w] = Shift(((uint16_t*)b_ptr)[off], shift);
     }
-  }
+  } while (++i < pic_width);
   if (pic_width & 1) {  // replicate rightmost pixel
     dst[pic_width + 0 * w] = dst[pic_width + 0 * w - 1];
     dst[pic_width + 1 * w] = dst[pic_width + 1 * w - 1];
@@ -233,8 +241,11 @@ static int ConvertWRGBToYUV(const fixed_y_t* best_y, const fixed_t* best_uv,
   const int sfix = GetPrecisionShift(rgb_bit_depth);
   const int yuv_max = (1 << yuv_bit_depth) - 1;
 
-  for (best_uv = best_uv_base, j = 0; j < height; ++j) {
-    for (i = 0; i < width; ++i) {
+  best_uv = best_uv_base;
+  j = 0;
+  do {
+    i = 0;
+    do {
       const int off = (i >> 1);
       const int W = best_y[i];
       const int r = best_uv[off + 0 * uv_w] + W;
@@ -246,19 +257,22 @@ static int ConvertWRGBToYUV(const fixed_y_t* best_y, const fixed_t* best_uv,
       } else {
         ((uint16_t*)y_ptr)[i] = clip(y, yuv_max);
       }
-    }
+    } while (++i < width);
     best_y += w;
     best_uv += (j & 1) * 3 * uv_w;
     y_ptr += y_stride;
-  }
-  for (best_uv = best_uv_base, j = 0; j < uv_h; ++j) {
-    for (i = 0; i < uv_w; ++i) {
-      const int off = i;
+  } while (++j < height);
+
+  best_uv = best_uv_base;
+  j = 0;
+  do {
+    i = 0;
+    do {
       // Note r, g and b values here are off by W, but a constant offset on all
       // 3 components doesn't change the value of u and v with a YCbCr matrix.
-      const int r = best_uv[off + 0 * uv_w];
-      const int g = best_uv[off + 1 * uv_w];
-      const int b = best_uv[off + 2 * uv_w];
+      const int r = best_uv[i + 0 * uv_w];
+      const int g = best_uv[i + 1 * uv_w];
+      const int b = best_uv[i + 2 * uv_w];
       const int u = RGBToYUVComponent(r, g, b, yuv_matrix->rgb_to_u, sfix);
       const int v = RGBToYUVComponent(r, g, b, yuv_matrix->rgb_to_v, sfix);
       if (yuv_bit_depth <= 8) {
@@ -268,11 +282,11 @@ static int ConvertWRGBToYUV(const fixed_y_t* best_y, const fixed_t* best_uv,
         ((uint16_t*)u_ptr)[i] = clip(u, yuv_max);
         ((uint16_t*)v_ptr)[i] = clip(v, yuv_max);
       }
-    }
+    } while (++i < uv_w);
     best_uv += 3 * uv_w;
     u_ptr += u_stride;
     v_ptr += v_stride;
-  }
+  } while (++j < uv_h);
   return 1;
 }
 
@@ -285,7 +299,7 @@ static void* SafeMalloc(uint64_t nmemb, size_t size) {
   return malloc((size_t)total_size);
 }
 
-#define SAFE_ALLOC(W, H, T) ((T*)SafeMalloc((W) * (H), sizeof(T)))
+#define SAFE_ALLOC(W, H, T) ((T*)SafeMalloc((uint64_t)(W) * (H), sizeof(T)))
 
 static int DoSharpArgbToYuv(const uint8_t* r_ptr, const uint8_t* g_ptr,
                             const uint8_t* b_ptr, int rgb_step, int rgb_stride,
@@ -293,12 +307,14 @@ static int DoSharpArgbToYuv(const uint8_t* r_ptr, const uint8_t* g_ptr,
                             uint8_t* u_ptr, int u_stride, uint8_t* v_ptr,
                             int v_stride, int yuv_bit_depth, int width,
                             int height,
-                            const SharpYuvConversionMatrix* yuv_matrix) {
+                            const SharpYuvConversionMatrix* yuv_matrix,
+                            SharpYuvTransferFunctionType transfer_type) {
   // we expand the right/bottom border if needed
   const int w = (width + 1) & ~1;
   const int h = (height + 1) & ~1;
   const int uv_w = w >> 1;
   const int uv_h = h >> 1;
+  const int y_bit_depth = rgb_bit_depth + GetPrecisionShift(rgb_bit_depth);
   uint64_t prev_diff_y_sum = ~0;
   int j, iter;
 
@@ -346,9 +362,9 @@ static int DoSharpArgbToYuv(const uint8_t* r_ptr, const uint8_t* g_ptr,
     StoreGray(src1, best_y + 0, w);
     StoreGray(src2, best_y + w, w);
 
-    UpdateW(src1, target_y, w, rgb_bit_depth);
-    UpdateW(src2, target_y + w, w, rgb_bit_depth);
-    UpdateChroma(src1, src2, target_uv, uv_w, rgb_bit_depth);
+    UpdateW(src1, target_y, w, rgb_bit_depth, transfer_type);
+    UpdateW(src2, target_y + w, w, rgb_bit_depth, transfer_type);
+    UpdateChroma(src1, src2, target_uv, uv_w, rgb_bit_depth, transfer_type);
     memcpy(best_uv, target_uv, 3 * uv_w * sizeof(*best_uv));
     best_y += 2 * w;
     best_uv += 3 * uv_w;
@@ -369,7 +385,8 @@ static int DoSharpArgbToYuv(const uint8_t* r_ptr, const uint8_t* g_ptr,
     best_uv = best_uv_base;
     target_y = target_y_base;
     target_uv = target_uv_base;
-    for (j = 0; j < h; j += 2) {
+    j = 0;
+    do {
       fixed_y_t* const src1 = tmp_buffer + 0 * w;
       fixed_y_t* const src2 = tmp_buffer + 3 * w;
       {
@@ -380,21 +397,21 @@ static int DoSharpArgbToYuv(const uint8_t* r_ptr, const uint8_t* g_ptr,
         cur_uv = next_uv;
       }
 
-      UpdateW(src1, best_rgb_y + 0 * w, w, rgb_bit_depth);
-      UpdateW(src2, best_rgb_y + 1 * w, w, rgb_bit_depth);
-      UpdateChroma(src1, src2, best_rgb_uv, uv_w, rgb_bit_depth);
+      UpdateW(src1, best_rgb_y + 0 * w, w, rgb_bit_depth, transfer_type);
+      UpdateW(src2, best_rgb_y + 1 * w, w, rgb_bit_depth, transfer_type);
+      UpdateChroma(src1, src2, best_rgb_uv, uv_w, rgb_bit_depth, transfer_type);
 
       // update two rows of Y and one row of RGB
       diff_y_sum +=
-          SharpYuvUpdateY(target_y, best_rgb_y, best_y, 2 * w,
-                          rgb_bit_depth + GetPrecisionShift(rgb_bit_depth));
+          SharpYuvUpdateY(target_y, best_rgb_y, best_y, 2 * w, y_bit_depth);
       SharpYuvUpdateRGB(target_uv, best_rgb_uv, best_uv, 3 * uv_w);
 
       best_y += 2 * w;
       best_uv += 3 * uv_w;
       target_y += 2 * w;
       target_uv += 3 * uv_w;
-    }
+      j += 2;
+    } while (j < h);
     // test exit condition
     if (iter > 0) {
       if (diff_y_sum < diff_y_threshold) break;
@@ -418,7 +435,6 @@ static int DoSharpArgbToYuv(const uint8_t* r_ptr, const uint8_t* g_ptr,
   free(tmp_buffer);
   return ok;
 }
-#undef SAFE_ALLOC
 
 #if defined(WEBP_USE_THREAD) && !defined(_WIN32)
 #include <pthread.h>  // NOLINT
@@ -462,12 +478,42 @@ void SharpYuvInit(VP8CPUInfo cpu_info_func) {
   UNLOCK_ACCESS_AND_RETURN;
 }
 
-int SharpYuvConvert(const void* r_ptr, const void* g_ptr,
-                    const void* b_ptr, int rgb_step, int rgb_stride,
-                    int rgb_bit_depth, void* y_ptr, int y_stride,
-                    void* u_ptr, int u_stride, void* v_ptr,
-                    int v_stride, int yuv_bit_depth, int width,
+int SharpYuvConvert(const void* r_ptr, const void* g_ptr, const void* b_ptr,
+                    int rgb_step, int rgb_stride, int rgb_bit_depth,
+                    void* y_ptr, int y_stride, void* u_ptr, int u_stride,
+                    void* v_ptr, int v_stride, int yuv_bit_depth, int width,
                     int height, const SharpYuvConversionMatrix* yuv_matrix) {
+  SharpYuvOptions options;
+  options.yuv_matrix = yuv_matrix;
+  options.transfer_type = kSharpYuvTransferFunctionSrgb;
+  return SharpYuvConvertWithOptions(
+      r_ptr, g_ptr, b_ptr, rgb_step, rgb_stride, rgb_bit_depth, y_ptr, y_stride,
+      u_ptr, u_stride, v_ptr, v_stride, yuv_bit_depth, width, height, &options);
+}
+
+int SharpYuvOptionsInitInternal(const SharpYuvConversionMatrix* yuv_matrix,
+                                SharpYuvOptions* options, int version) {
+  const int major = (version >> 24);
+  const int minor = (version >> 16) & 0xff;
+  if (options == NULL || yuv_matrix == NULL ||
+      (major == SHARPYUV_VERSION_MAJOR && major == 0 &&
+       minor != SHARPYUV_VERSION_MINOR) ||
+      (major != SHARPYUV_VERSION_MAJOR)) {
+    return 0;
+  }
+  options->yuv_matrix = yuv_matrix;
+  options->transfer_type = kSharpYuvTransferFunctionSrgb;
+  return 1;
+}
+
+int SharpYuvConvertWithOptions(const void* r_ptr, const void* g_ptr,
+                               const void* b_ptr, int rgb_step, int rgb_stride,
+                               int rgb_bit_depth, void* y_ptr, int y_stride,
+                               void* u_ptr, int u_stride, void* v_ptr,
+                               int v_stride, int yuv_bit_depth, int width,
+                               int height, const SharpYuvOptions* options) {
+  const SharpYuvConversionMatrix* yuv_matrix = options->yuv_matrix;
+  SharpYuvTransferFunctionType transfer_type = options->transfer_type;
   SharpYuvConversionMatrix scaled_matrix;
   const int rgb_max = (1 << rgb_bit_depth) - 1;
   const int rgb_round = 1 << (rgb_bit_depth - 1);
@@ -486,7 +532,7 @@ int SharpYuvConvert(const void* r_ptr, const void* g_ptr,
   if (yuv_bit_depth != 8 && yuv_bit_depth != 10 && yuv_bit_depth != 12) {
     return 0;
   }
-  if (rgb_bit_depth > 8 && (rgb_step % 2 != 0 || rgb_stride %2 != 0)) {
+  if (rgb_bit_depth > 8 && (rgb_step % 2 != 0 || rgb_stride % 2 != 0)) {
     // Step/stride should be even for uint16_t buffers.
     return 0;
   }
@@ -521,7 +567,109 @@ int SharpYuvConvert(const void* r_ptr, const void* g_ptr,
   return DoSharpArgbToYuv(r_ptr, g_ptr, b_ptr, rgb_step, rgb_stride,
                           rgb_bit_depth, y_ptr, y_stride, u_ptr, u_stride,
                           v_ptr, v_stride, yuv_bit_depth, width, height,
-                          &scaled_matrix);
+                          &scaled_matrix, transfer_type);
+}
+
+//------------------------------------------------------------------------------
+// 420 risk metric
+
+static int DoEstimateRisk(const uint8_t* r_ptr, const uint8_t* g_ptr,
+                          const uint8_t* b_ptr, int rgb_step, int rgb_stride,
+                          int rgb_bit_depth, int width, int height,
+                          const SharpYuvOptions* options,
+                          const uint8_t precomputed_scores_table[],
+                          int precomputed_scores_table_sampling,
+                          float* score_out) {
+  const int sampling3 = precomputed_scores_table_sampling *
+                        precomputed_scores_table_sampling *
+                        precomputed_scores_table_sampling;
+  const int kNoiseLevel = 4;
+  double total_score = 0;
+  double count = 0;
+  // Rows of indices in
+  uint16_t* row1 = SAFE_ALLOC(width, 1, uint16_t);
+  uint16_t* row2 = SAFE_ALLOC(width, 1, uint16_t);
+  uint16_t* tmp;
+  int i, j;
+
+  if (row1 == NULL || row2 == NULL) {
+    free(row1);
+    free(row2);
+    return 0;
+  }
+
+  // Convert the first row ahead.
+  SharpYuvRowToYuvSharpnessIndex(r_ptr, g_ptr, b_ptr, rgb_step, rgb_bit_depth,
+                                 width, row2, options->yuv_matrix,
+                                 precomputed_scores_table_sampling);
+
+  for (j = 1; j < height; ++j) {
+    r_ptr += rgb_stride;
+    g_ptr += rgb_stride;
+    b_ptr += rgb_stride;
+    // Swap row 1 and row 2.
+    tmp = row1;
+    row1 = row2;
+    row2 = tmp;
+    // Convert the row below.
+    SharpYuvRowToYuvSharpnessIndex(r_ptr, g_ptr, b_ptr, rgb_step, rgb_bit_depth,
+                                   width, row2, options->yuv_matrix,
+                                   precomputed_scores_table_sampling);
+    for (i = 0; i < width - 1; ++i) {
+      const int idx0 = row1[i + 0];
+      const int idx1 = row1[i + 1];
+      const int idx2 = row2[i + 0];
+      const int score = precomputed_scores_table[idx0 + sampling3 * idx1] +
+                        precomputed_scores_table[idx0 + sampling3 * idx2] +
+                        precomputed_scores_table[idx1 + sampling3 * idx2];
+      if (score > kNoiseLevel) {
+        total_score += score;
+        count += 1.0;
+      }
+    }
+  }
+  if (count > 0.) total_score /= count;
+
+  // If less than 1% of pixels were evaluated -> below noise level.
+  if (100. * count / (width * height) < 1.) total_score = 0.;
+
+  // Rescale to [0:100]
+  total_score = (total_score > 25.) ? 100. : total_score * 100. / 25.;
+
+  free(row1);
+  free(row2);
+
+  *score_out = (float)total_score;
+  return 1;
 }
 
+int SharpYuvEstimate420Risk(const void* r_ptr, const void* g_ptr,
+                            const void* b_ptr, int rgb_step, int rgb_stride,
+                            int rgb_bit_depth, int width, int height,
+                            const SharpYuvOptions* options, float* score) {
+  if (width < 1 || height < 1 || width == INT_MAX || height == INT_MAX ||
+      r_ptr == NULL || g_ptr == NULL || b_ptr == NULL || options == NULL ||
+      score == NULL) {
+    return 0;
+  }
+  if (rgb_bit_depth != 8) {
+    return 0;
+  }
+
+  if (width <= 4 || height <= 4) {
+    *score = 0.0f;  // too small, no real risk.
+    return 1;
+  }
+
+  // The address of the function pointer is used to avoid a read race.
+  SharpYuvInit((VP8CPUInfo)&SharpYuvGetCPUInfo);
+
+  return DoEstimateRisk(
+      (const uint8_t*)r_ptr, (const uint8_t*)g_ptr, (const uint8_t*)b_ptr,
+      rgb_step, rgb_stride, rgb_bit_depth, width, height, options,
+      kSharpYuvPrecomputedRisk, kSharpYuvPrecomputedRiskYuvSampling, score);
+}
+
+#undef SAFE_ALLOC
+
 //------------------------------------------------------------------------------

+ 103 - 2
webp.mod/libwebp/sharpyuv/sharpyuv.h

@@ -34,10 +34,27 @@ extern "C" {
 #endif /* WEBP_EXTERN */
 #endif /* SHARPYUV_EXTERN */
 
+#ifndef SHARPYUV_INLINE
+#ifdef WEBP_INLINE
+#define SHARPYUV_INLINE WEBP_INLINE
+#else
+#ifndef _MSC_VER
+#if defined(__cplusplus) || !defined(__STRICT_ANSI__) || \
+    (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L)
+#define SHARPYUV_INLINE inline
+#else
+#define SHARPYUV_INLINE
+#endif
+#else
+#define SHARPYUV_INLINE __forceinline
+#endif /* _MSC_VER */
+#endif /* WEBP_INLINE */
+#endif /* SHARPYUV_INLINE */
+
 // SharpYUV API version following the convention from semver.org
 #define SHARPYUV_VERSION_MAJOR 0
-#define SHARPYUV_VERSION_MINOR 2
-#define SHARPYUV_VERSION_PATCH 1
+#define SHARPYUV_VERSION_MINOR 5
+#define SHARPYUV_VERSION_PATCH 0
 // Version as a uint32_t. The major number is the high 8 bits.
 // The minor number is the middle 8 bits. The patch number is the low 16 bits.
 #define SHARPYUV_MAKE_VERSION(MAJOR, MINOR, PATCH) \
@@ -61,6 +78,33 @@ typedef struct {
   int rgb_to_v[4];
 } SharpYuvConversionMatrix;
 
+typedef struct SharpYuvOptions SharpYuvOptions;
+
+// Enums for transfer functions, as defined in H.273,
+// https://www.itu.int/rec/T-REC-H.273-202107-I/en
+typedef enum SharpYuvTransferFunctionType {
+  // 0 is reserved
+  kSharpYuvTransferFunctionBt709 = 1,
+  // 2 is unspecified
+  // 3 is reserved
+  kSharpYuvTransferFunctionBt470M = 4,
+  kSharpYuvTransferFunctionBt470Bg = 5,
+  kSharpYuvTransferFunctionBt601 = 6,
+  kSharpYuvTransferFunctionSmpte240 = 7,
+  kSharpYuvTransferFunctionLinear = 8,
+  kSharpYuvTransferFunctionLog100 = 9,
+  kSharpYuvTransferFunctionLog100_Sqrt10 = 10,
+  kSharpYuvTransferFunctionIec61966 = 11,
+  kSharpYuvTransferFunctionBt1361 = 12,
+  kSharpYuvTransferFunctionSrgb = 13,
+  kSharpYuvTransferFunctionBt2020_10Bit = 14,
+  kSharpYuvTransferFunctionBt2020_12Bit = 15,
+  kSharpYuvTransferFunctionSmpte2084 = 16,  // PQ
+  kSharpYuvTransferFunctionSmpte428 = 17,
+  kSharpYuvTransferFunctionHlg = 18,
+  kSharpYuvTransferFunctionNum
+} SharpYuvTransferFunctionType;
+
 // Converts RGB to YUV420 using a downsampling algorithm that minimizes
 // artefacts caused by chroma subsampling.
 // This is slower than standard downsampling (averaging of 4 UV values).
@@ -85,6 +129,8 @@ typedef struct {
 //     adjacent pixels on the y, u and v channels. If yuv_bit_depth > 8, they
 //     should be multiples of 2.
 // width, height: width and height of the image in pixels
+// This function calls SharpYuvConvertWithOptions with a default transfer
+// function of kSharpYuvTransferFunctionSrgb.
 SHARPYUV_EXTERN int SharpYuvConvert(const void* r_ptr, const void* g_ptr,
                                     const void* b_ptr, int rgb_step,
                                     int rgb_stride, int rgb_bit_depth,
@@ -93,6 +139,61 @@ SHARPYUV_EXTERN int SharpYuvConvert(const void* r_ptr, const void* g_ptr,
                                     int yuv_bit_depth, int width, int height,
                                     const SharpYuvConversionMatrix* yuv_matrix);
 
+struct SharpYuvOptions {
+  // This matrix cannot be NULL and can be initialized by
+  // SharpYuvComputeConversionMatrix.
+  const SharpYuvConversionMatrix* yuv_matrix;
+  SharpYuvTransferFunctionType transfer_type;
+};
+
+// Internal, version-checked, entry point
+SHARPYUV_EXTERN int SharpYuvOptionsInitInternal(const SharpYuvConversionMatrix*,
+                                                SharpYuvOptions*, int);
+
+// Should always be called, to initialize a fresh SharpYuvOptions
+// structure before modification. SharpYuvOptionsInit() must have succeeded
+// before using the 'options' object.
+static SHARPYUV_INLINE int SharpYuvOptionsInit(
+    const SharpYuvConversionMatrix* yuv_matrix, SharpYuvOptions* options) {
+  return SharpYuvOptionsInitInternal(yuv_matrix, options, SHARPYUV_VERSION);
+}
+
+SHARPYUV_EXTERN int SharpYuvConvertWithOptions(
+    const void* r_ptr, const void* g_ptr, const void* b_ptr, int rgb_step,
+    int rgb_stride, int rgb_bit_depth, void* y_ptr, int y_stride, void* u_ptr,
+    int u_stride, void* v_ptr, int v_stride, int yuv_bit_depth, int width,
+    int height, const SharpYuvOptions* options);
+
+// Computes a score between 0 and 100 which represents the risk of having visual
+// quality loss from converting an RGB image to YUV420.
+// A low score, typically < 40, means there is a low risk of artifacts from
+// chroma subsampling and a simple averaging algorithm can be used instead of
+// the more expensive SharpYuvConvert function.
+// A medium score, typically >= 40 and < 70, means that simple chroma
+// subsampling will produce artifacts and it may be advisable to use the more
+// costly SharpYuvConvert for YUV420 conversion.
+// A high score, typically >= 70, means there is a very high risk of artifacts
+// from chroma subsampling even with SharpYuvConvert, and best results might be
+// achieved by using YUV444.
+// If not using SharpYuvConvert, a threshold of about 50 can be used to decide
+// between (simple averaging) 420 and 444.
+// r_ptr, g_ptr, b_ptr: pointers to the source r, g and b channels. Should point
+//     to uint8_t buffers if rgb_bit_depth is 8, or uint16_t buffers otherwise.
+// rgb_step: distance in bytes between two horizontally adjacent pixels on the
+//     r, g and b channels. If rgb_bit_depth is > 8, it should be a
+//     multiple of 2.
+// rgb_stride: distance in bytes between two vertically adjacent pixels on the
+//     r, g, and b channels. If rgb_bit_depth is > 8, it should be a
+//     multiple of 2.
+// rgb_bit_depth: number of bits for each r/g/b value. Only a value of 8 is
+//     currently supported.
+// width, height: width and height of the image in pixels
+// Returns 0 on failure.
+SHARPYUV_EXTERN int SharpYuvEstimate420Risk(
+    const void* r_ptr, const void* g_ptr, const void* b_ptr, int rgb_step,
+    int rgb_stride, int rgb_bit_depth, int width, int height,
+    const SharpYuvOptions* options, float* score);
+
 // TODO(b/194336375): Add YUV444 to YUV420 conversion. Maybe also add 422
 // support (it's rarely used in practice, especially for images).
 

+ 64 - 2
webp.mod/libwebp/sharpyuv/sharpyuv_dsp.c

@@ -16,7 +16,9 @@
 #include <assert.h>
 #include <stdlib.h>
 
+#include "sharpyuv/sharpyuv.h"
 #include "sharpyuv/sharpyuv_cpu.h"
+#include "src/webp/types.h"
 
 //-----------------------------------------------------------------------------
 
@@ -62,6 +64,58 @@ static void SharpYuvFilterRow_C(const int16_t* A, const int16_t* B, int len,
 }
 #endif  // !WEBP_NEON_OMIT_C_CODE
 
+#define YUV_FIX 16  // fixed-point precision for RGB->YUV
+static const int kYuvHalf = 1 << (YUV_FIX - 1);
+
+// Maps a value in [0, (256 << YUV_FIX) - 1] to [0,
+// precomputed_scores_table_sampling - 1]. It is important that the extremal
+// values are preserved and 1:1 mapped:
+//  ConvertValue(0) = 0
+//  ConvertValue((256 << 16) - 1) = rgb_sampling_size - 1
+static int SharpYuvConvertValueToSampledIdx(int v, int rgb_sampling_size) {
+  v = (v + kYuvHalf) >> YUV_FIX;
+  v = (v < 0) ? 0 : (v > 255) ? 255 : v;
+  return (v * (rgb_sampling_size - 1)) / 255;
+}
+
+#undef YUV_FIX
+
+static int SharpYuvConvertToYuvSharpnessIndex(
+    int r, int g, int b, const SharpYuvConversionMatrix* matrix,
+    int precomputed_scores_table_sampling) {
+  const int y = SharpYuvConvertValueToSampledIdx(
+      matrix->rgb_to_y[0] * r + matrix->rgb_to_y[1] * g +
+          matrix->rgb_to_y[2] * b + matrix->rgb_to_y[3],
+      precomputed_scores_table_sampling);
+  const int u = SharpYuvConvertValueToSampledIdx(
+      matrix->rgb_to_u[0] * r + matrix->rgb_to_u[1] * g +
+          matrix->rgb_to_u[2] * b + matrix->rgb_to_u[3],
+      precomputed_scores_table_sampling);
+  const int v = SharpYuvConvertValueToSampledIdx(
+      matrix->rgb_to_v[0] * r + matrix->rgb_to_v[1] * g +
+          matrix->rgb_to_v[2] * b + matrix->rgb_to_v[3],
+      precomputed_scores_table_sampling);
+  return y + u * precomputed_scores_table_sampling +
+         v * precomputed_scores_table_sampling *
+             precomputed_scores_table_sampling;
+}
+
+static void SharpYuvRowToYuvSharpnessIndex_C(
+    const uint8_t* r_ptr, const uint8_t* g_ptr, const uint8_t* b_ptr,
+    int rgb_step, int rgb_bit_depth, int width, uint16_t* dst,
+    const SharpYuvConversionMatrix* matrix,
+    int precomputed_scores_table_sampling) {
+  int i;
+  assert(rgb_bit_depth == 8);
+  (void)rgb_bit_depth;  // Unused for now.
+  for (i = 0; i < width;
+       ++i, r_ptr += rgb_step, g_ptr += rgb_step, b_ptr += rgb_step) {
+    dst[i] =
+        SharpYuvConvertToYuvSharpnessIndex(r_ptr[0], g_ptr[0], b_ptr[0], matrix,
+                                           precomputed_scores_table_sampling);
+  }
+}
+
 //-----------------------------------------------------------------------------
 
 uint64_t (*SharpYuvUpdateY)(const uint16_t* src, const uint16_t* ref,
@@ -69,8 +123,14 @@ uint64_t (*SharpYuvUpdateY)(const uint16_t* src, const uint16_t* ref,
 void (*SharpYuvUpdateRGB)(const int16_t* src, const int16_t* ref, int16_t* dst,
                           int len);
 void (*SharpYuvFilterRow)(const int16_t* A, const int16_t* B, int len,
-                          const uint16_t* best_y, uint16_t* out,
-                          int bit_depth);
+                          const uint16_t* best_y, uint16_t* out, int bit_depth);
+void (*SharpYuvRowToYuvSharpnessIndex)(const uint8_t* r_ptr,
+                                       const uint8_t* g_ptr,
+                                       const uint8_t* b_ptr, int rgb_step,
+                                       int rgb_bit_depth, int width,
+                                       uint16_t* dst,
+                                       const SharpYuvConversionMatrix* matrix,
+                                       int precomputed_scores_table_sampling);
 
 extern VP8CPUInfo SharpYuvGetCPUInfo;
 extern void InitSharpYuvSSE2(void);
@@ -82,6 +142,8 @@ void SharpYuvInitDsp(void) {
   SharpYuvUpdateRGB = SharpYuvUpdateRGB_C;
   SharpYuvFilterRow = SharpYuvFilterRow_C;
 #endif
+  // There is only a C version for now so always include it.
+  SharpYuvRowToYuvSharpnessIndex = SharpYuvRowToYuvSharpnessIndex_C;
 
   if (SharpYuvGetCPUInfo != NULL) {
 #if defined(WEBP_HAVE_SSE2)

+ 10 - 0
webp.mod/libwebp/sharpyuv/sharpyuv_dsp.h

@@ -12,6 +12,7 @@
 #ifndef WEBP_SHARPYUV_SHARPYUV_DSP_H_
 #define WEBP_SHARPYUV_SHARPYUV_DSP_H_
 
+#include "sharpyuv/sharpyuv.h"
 #include "sharpyuv/sharpyuv_cpu.h"
 #include "src/webp/types.h"
 
@@ -23,6 +24,15 @@ extern void (*SharpYuvFilterRow)(const int16_t* A, const int16_t* B, int len,
                                  const uint16_t* best_y, uint16_t* out,
                                  int bit_depth);
 
+// For each pixel, computes the index to look up that color in a precomputed
+// risk score table where the YUV space is subsampled to a size of
+// precomputed_scores_table_sampling^3 (see sharpyuv_risk_table.h)
+extern void (*SharpYuvRowToYuvSharpnessIndex)(
+    const uint8_t* r_ptr, const uint8_t* g_ptr, const uint8_t* b_ptr,
+    int rgb_step, int rgb_bit_depth, int width, uint16_t* dst,
+    const SharpYuvConversionMatrix* matrix,
+    int precomputed_scores_table_sampling);
+
 void SharpYuvInitDsp(void);
 
 #endif  // WEBP_SHARPYUV_SHARPYUV_DSP_H_

+ 308 - 2
webp.mod/libwebp/sharpyuv/sharpyuv_gamma.c

@@ -12,6 +12,7 @@
 #include "sharpyuv/sharpyuv_gamma.h"
 
 #include <assert.h>
+#include <float.h>
 #include <math.h>
 
 #include "src/webp/types.h"
@@ -97,7 +98,7 @@ static WEBP_INLINE uint32_t FixedPointInterpolation(int v, uint32_t* tab,
   return result;
 }
 
-uint32_t SharpYuvGammaToLinear(uint16_t v, int bit_depth) {
+static uint32_t ToLinearSrgb(uint16_t v, int bit_depth) {
   const int shift = GAMMA_TO_LINEAR_TAB_BITS - bit_depth;
   if (shift > 0) {
     return kGammaToLinearTabS[v << shift];
@@ -105,9 +106,314 @@ uint32_t SharpYuvGammaToLinear(uint16_t v, int bit_depth) {
   return FixedPointInterpolation(v, kGammaToLinearTabS, -shift, 0);
 }
 
-uint16_t SharpYuvLinearToGamma(uint32_t value, int bit_depth) {
+static uint16_t FromLinearSrgb(uint32_t value, int bit_depth) {
   return FixedPointInterpolation(
       value, kLinearToGammaTabS,
       (GAMMA_TO_LINEAR_BITS - LINEAR_TO_GAMMA_TAB_BITS),
       bit_depth - GAMMA_TO_LINEAR_BITS);
 }
+
+////////////////////////////////////////////////////////////////////////////////
+
+#define CLAMP(x, low, high) \
+  (((x) < (low)) ? (low) : (((high) < (x)) ? (high) : (x)))
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
+#define MAX(a, b) (((a) > (b)) ? (a) : (b))
+
+static WEBP_INLINE float Roundf(float x) {
+  if (x < 0)
+    return (float)ceil((double)(x - 0.5f));
+  else
+    return (float)floor((double)(x + 0.5f));
+}
+
+static WEBP_INLINE float Powf(float base, float exp) {
+  return (float)pow((double)base, (double)exp);
+}
+
+static WEBP_INLINE float Log10f(float x) { return (float)log10((double)x); }
+
+static float ToLinear709(float gamma) {
+  if (gamma < 0.f) {
+    return 0.f;
+  } else if (gamma < 4.5f * 0.018053968510807f) {
+    return gamma / 4.5f;
+  } else if (gamma < 1.f) {
+    return Powf((gamma + 0.09929682680944f) / 1.09929682680944f, 1.f / 0.45f);
+  }
+  return 1.f;
+}
+
+static float FromLinear709(float linear) {
+  if (linear < 0.f) {
+    return 0.f;
+  } else if (linear < 0.018053968510807f) {
+    return linear * 4.5f;
+  } else if (linear < 1.f) {
+    return 1.09929682680944f * Powf(linear, 0.45f) - 0.09929682680944f;
+  }
+  return 1.f;
+}
+
+static float ToLinear470M(float gamma) {
+  return Powf(CLAMP(gamma, 0.f, 1.f), 2.2f);
+}
+
+static float FromLinear470M(float linear) {
+  return Powf(CLAMP(linear, 0.f, 1.f), 1.f / 2.2f);
+}
+
+static float ToLinear470Bg(float gamma) {
+  return Powf(CLAMP(gamma, 0.f, 1.f), 2.8f);
+}
+
+static float FromLinear470Bg(float linear) {
+  return Powf(CLAMP(linear, 0.f, 1.f), 1.f / 2.8f);
+}
+
+static float ToLinearSmpte240(float gamma) {
+  if (gamma < 0.f) {
+    return 0.f;
+  } else if (gamma < 4.f * 0.022821585529445f) {
+    return gamma / 4.f;
+  } else if (gamma < 1.f) {
+    return Powf((gamma + 0.111572195921731f) / 1.111572195921731f, 1.f / 0.45f);
+  }
+  return 1.f;
+}
+
+static float FromLinearSmpte240(float linear) {
+  if (linear < 0.f) {
+    return 0.f;
+  } else if (linear < 0.022821585529445f) {
+    return linear * 4.f;
+  } else if (linear < 1.f) {
+    return 1.111572195921731f * Powf(linear, 0.45f) - 0.111572195921731f;
+  }
+  return 1.f;
+}
+
+static float ToLinearLog100(float gamma) {
+  // The function is non-bijective so choose the middle of [0, 0.01].
+  const float mid_interval = 0.01f / 2.f;
+  return (gamma <= 0.0f) ? mid_interval
+                          : Powf(10.0f, 2.f * (MIN(gamma, 1.f) - 1.0f));
+}
+
+static float FromLinearLog100(float linear) {
+  return (linear < 0.01f) ? 0.0f : 1.0f + Log10f(MIN(linear, 1.f)) / 2.0f;
+}
+
+static float ToLinearLog100Sqrt10(float gamma) {
+  // The function is non-bijective so choose the middle of [0, 0.00316227766f[.
+  const float mid_interval = 0.00316227766f / 2.f;
+  return (gamma <= 0.0f) ? mid_interval
+                          : Powf(10.0f, 2.5f * (MIN(gamma, 1.f) - 1.0f));
+}
+
+static float FromLinearLog100Sqrt10(float linear) {
+  return (linear < 0.00316227766f) ? 0.0f
+                                  : 1.0f + Log10f(MIN(linear, 1.f)) / 2.5f;
+}
+
+static float ToLinearIec61966(float gamma) {
+  if (gamma <= -4.5f * 0.018053968510807f) {
+    return Powf((-gamma + 0.09929682680944f) / -1.09929682680944f, 1.f / 0.45f);
+  } else if (gamma < 4.5f * 0.018053968510807f) {
+    return gamma / 4.5f;
+  }
+  return Powf((gamma + 0.09929682680944f) / 1.09929682680944f, 1.f / 0.45f);
+}
+
+static float FromLinearIec61966(float linear) {
+  if (linear <= -0.018053968510807f) {
+    return -1.09929682680944f * Powf(-linear, 0.45f) + 0.09929682680944f;
+  } else if (linear < 0.018053968510807f) {
+    return linear * 4.5f;
+  }
+  return 1.09929682680944f * Powf(linear, 0.45f) - 0.09929682680944f;
+}
+
+static float ToLinearBt1361(float gamma) {
+  if (gamma < -0.25f) {
+    return -0.25f;
+  } else if (gamma < 0.f) {
+    return Powf((gamma - 0.02482420670236f) / -0.27482420670236f, 1.f / 0.45f) /
+           -4.f;
+  } else if (gamma < 4.5f * 0.018053968510807f) {
+    return gamma / 4.5f;
+  } else if (gamma < 1.f) {
+    return Powf((gamma + 0.09929682680944f) / 1.09929682680944f, 1.f / 0.45f);
+  }
+  return 1.f;
+}
+
+static float FromLinearBt1361(float linear) {
+  if (linear < -0.25f) {
+    return -0.25f;
+  } else if (linear < 0.f) {
+    return -0.27482420670236f * Powf(-4.f * linear, 0.45f) + 0.02482420670236f;
+  } else if (linear < 0.018053968510807f) {
+    return linear * 4.5f;
+  } else if (linear < 1.f) {
+    return 1.09929682680944f * Powf(linear, 0.45f) - 0.09929682680944f;
+  }
+  return 1.f;
+}
+
+static float ToLinearPq(float gamma) {
+  if (gamma > 0.f) {
+    const float pow_gamma = Powf(gamma, 32.f / 2523.f);
+    const float num = MAX(pow_gamma - 107.f / 128.f, 0.0f);
+    const float den = MAX(2413.f / 128.f - 2392.f / 128.f * pow_gamma, FLT_MIN);
+    return Powf(num / den, 4096.f / 653.f);
+  }
+  return 0.f;
+}
+
+static float FromLinearPq(float linear) {
+  if (linear > 0.f) {
+    const float pow_linear = Powf(linear, 653.f / 4096.f);
+    const float num = 107.f / 128.f + 2413.f / 128.f * pow_linear;
+    const float den = 1.0f + 2392.f / 128.f * pow_linear;
+    return Powf(num / den, 2523.f / 32.f);
+  }
+  return 0.f;
+}
+
+static float ToLinearSmpte428(float gamma) {
+  return Powf(MAX(gamma, 0.f), 2.6f) / 0.91655527974030934f;
+}
+
+static float FromLinearSmpte428(float linear) {
+  return Powf(0.91655527974030934f * MAX(linear, 0.f), 1.f / 2.6f);
+}
+
+// Conversion in BT.2100 requires RGB info. Simplify to gamma correction here.
+static float ToLinearHlg(float gamma) {
+  if (gamma < 0.f) {
+    return 0.f;
+  } else if (gamma <= 0.5f) {
+    return Powf((gamma * gamma) * (1.f / 3.f), 1.2f);
+  }
+  return Powf((expf((gamma - 0.55991073f) / 0.17883277f) + 0.28466892f) / 12.0f,
+              1.2f);
+}
+
+static float FromLinearHlg(float linear) {
+  linear = Powf(linear, 1.f / 1.2f);
+  if (linear < 0.f) {
+    return 0.f;
+  } else if (linear <= (1.f / 12.f)) {
+    return sqrtf(3.f * linear);
+  }
+  return 0.17883277f * logf(12.f * linear - 0.28466892f) + 0.55991073f;
+}
+
+uint32_t SharpYuvGammaToLinear(uint16_t v, int bit_depth,
+                               SharpYuvTransferFunctionType transfer_type) {
+  float v_float, linear;
+  if (transfer_type == kSharpYuvTransferFunctionSrgb) {
+    return ToLinearSrgb(v, bit_depth);
+  }
+  v_float = (float)v / ((1 << bit_depth) - 1);
+  switch (transfer_type) {
+    case kSharpYuvTransferFunctionBt709:
+    case kSharpYuvTransferFunctionBt601:
+    case kSharpYuvTransferFunctionBt2020_10Bit:
+    case kSharpYuvTransferFunctionBt2020_12Bit:
+      linear = ToLinear709(v_float);
+      break;
+    case kSharpYuvTransferFunctionBt470M:
+      linear = ToLinear470M(v_float);
+      break;
+    case kSharpYuvTransferFunctionBt470Bg:
+      linear = ToLinear470Bg(v_float);
+      break;
+    case kSharpYuvTransferFunctionSmpte240:
+      linear = ToLinearSmpte240(v_float);
+      break;
+    case kSharpYuvTransferFunctionLinear:
+      return v;
+    case kSharpYuvTransferFunctionLog100:
+      linear = ToLinearLog100(v_float);
+      break;
+    case kSharpYuvTransferFunctionLog100_Sqrt10:
+      linear = ToLinearLog100Sqrt10(v_float);
+      break;
+    case kSharpYuvTransferFunctionIec61966:
+      linear = ToLinearIec61966(v_float);
+      break;
+    case kSharpYuvTransferFunctionBt1361:
+      linear = ToLinearBt1361(v_float);
+      break;
+    case kSharpYuvTransferFunctionSmpte2084:
+      linear = ToLinearPq(v_float);
+      break;
+    case kSharpYuvTransferFunctionSmpte428:
+      linear = ToLinearSmpte428(v_float);
+      break;
+    case kSharpYuvTransferFunctionHlg:
+      linear = ToLinearHlg(v_float);
+      break;
+    default:
+      assert(0);
+      linear = 0;
+      break;
+  }
+  return (uint32_t)Roundf(linear * ((1 << 16) - 1));
+}
+
+uint16_t SharpYuvLinearToGamma(uint32_t v, int bit_depth,
+                               SharpYuvTransferFunctionType transfer_type) {
+  float v_float, linear;
+  if (transfer_type == kSharpYuvTransferFunctionSrgb) {
+    return FromLinearSrgb(v, bit_depth);
+  }
+  v_float = (float)v / ((1 << 16) - 1);
+  switch (transfer_type) {
+    case kSharpYuvTransferFunctionBt709:
+    case kSharpYuvTransferFunctionBt601:
+    case kSharpYuvTransferFunctionBt2020_10Bit:
+    case kSharpYuvTransferFunctionBt2020_12Bit:
+      linear = FromLinear709(v_float);
+      break;
+    case kSharpYuvTransferFunctionBt470M:
+      linear = FromLinear470M(v_float);
+      break;
+    case kSharpYuvTransferFunctionBt470Bg:
+      linear = FromLinear470Bg(v_float);
+      break;
+    case kSharpYuvTransferFunctionSmpte240:
+      linear = FromLinearSmpte240(v_float);
+      break;
+    case kSharpYuvTransferFunctionLinear:
+      return v;
+    case kSharpYuvTransferFunctionLog100:
+      linear = FromLinearLog100(v_float);
+      break;
+    case kSharpYuvTransferFunctionLog100_Sqrt10:
+      linear = FromLinearLog100Sqrt10(v_float);
+      break;
+    case kSharpYuvTransferFunctionIec61966:
+      linear = FromLinearIec61966(v_float);
+      break;
+    case kSharpYuvTransferFunctionBt1361:
+      linear = FromLinearBt1361(v_float);
+      break;
+    case kSharpYuvTransferFunctionSmpte2084:
+      linear = FromLinearPq(v_float);
+      break;
+    case kSharpYuvTransferFunctionSmpte428:
+      linear = FromLinearSmpte428(v_float);
+      break;
+    case kSharpYuvTransferFunctionHlg:
+      linear = FromLinearHlg(v_float);
+      break;
+    default:
+      assert(0);
+      linear = 0;
+      break;
+  }
+  return (uint16_t)Roundf(linear * ((1 << bit_depth) - 1));
+}

+ 7 - 4
webp.mod/libwebp/sharpyuv/sharpyuv_gamma.h

@@ -12,6 +12,7 @@
 #ifndef WEBP_SHARPYUV_SHARPYUV_GAMMA_H_
 #define WEBP_SHARPYUV_SHARPYUV_GAMMA_H_
 
+#include "sharpyuv/sharpyuv.h"
 #include "src/webp/types.h"
 
 #ifdef __cplusplus
@@ -22,11 +23,13 @@ extern "C" {
 // SharpYuvGammaToLinear or SharpYuvLinearToGamma.
 void SharpYuvInitGammaTables(void);
 
-// Converts a gamma color value on 'bit_depth' bits to a 16 bit linear value.
-uint32_t SharpYuvGammaToLinear(uint16_t v, int bit_depth);
+// Converts a 'bit_depth'-bit gamma color value to a 16-bit linear value.
+uint32_t SharpYuvGammaToLinear(uint16_t v, int bit_depth,
+                               SharpYuvTransferFunctionType transfer_type);
 
-// Converts a 16 bit linear color value to a gamma value on 'bit_depth' bits.
-uint16_t SharpYuvLinearToGamma(uint32_t value, int bit_depth);
+// Converts a 16-bit linear color value to a 'bit_depth'-bit gamma value.
+uint16_t SharpYuvLinearToGamma(uint32_t value, int bit_depth,
+                               SharpYuvTransferFunctionType transfer_type);
 
 #ifdef __cplusplus
 }  // extern "C"

+ 6210 - 0
webp.mod/libwebp/sharpyuv/sharpyuv_risk_table.c

@@ -0,0 +1,6210 @@
+// Copyright 2023 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Precomputed data for 420 risk estimation.
+
+#include "src/webp/types.h"
+
+const int kSharpYuvPrecomputedRiskYuvSampling = 7;
+
+const uint8_t kSharpYuvPrecomputedRisk[] = {
+    0,  2,  2,  3,  3,  2,  2,  1,  2,  2,  3,  2,  2,  1,  2,  1,  2,  2,  2,
+    1,  2,  2,  1,  1,  2,  2,  3,  4,  4,  4,  4,  4,  5,  4,  4,  8,  8,  8,
+    7,  5,  4,  4,  14, 12, 9,  8,  6,  4,  4,  2,  1,  2,  2,  2,  2,  1,  2,
+    0,  2,  2,  2,  1,  1,  2,  1,  1,  2,  2,  1,  3,  2,  2,  2,  2,  2,  3,
+    4,  5,  5,  5,  5,  5,  4,  4,  11, 9,  9,  8,  6,  5,  4,  18, 14, 11, 9,
+    7,  5,  4,  2,  1,  1,  1,  1,  3,  6,  2,  2,  1,  1,  1,  3,  6,  3,  2,
+    2,  2,  3,  3,  7,  6,  3,  5,  6,  6,  6,  8,  9,  7,  9,  9,  9,  8,  8,
+    14, 12, 13, 12, 11, 10, 8,  20, 18, 16, 14, 13, 11, 10, 3,  6,  6,  7,  7,
+    7,  10, 6,  7,  7,  8,  8,  8,  10, 10, 7,  9,  9,  10, 10, 10, 13, 10, 12,
+    13, 13, 13, 12, 13, 15, 17, 17, 17, 16, 15, 14, 22, 21, 20, 19, 18, 17, 20,
+    27, 25, 23, 20, 19, 19, 14, 15, 14, 14, 15, 14, 9,  16, 16, 16, 16, 16, 15,
+    9,  16, 17, 18, 18, 18, 17, 14, 16, 21, 21, 22, 22, 20, 17, 19, 26, 27, 26,
+    25, 24, 18, 23, 30, 32, 29, 28, 25, 20, 27, 33, 35, 32, 30, 28, 22, 24, 25,
+    24, 24, 21, 17, 12, 23, 27, 25, 26, 22, 17, 14, 24, 30, 29, 28, 24, 20, 17,
+    24, 31, 32, 32, 28, 24, 20, 27, 34, 37, 36, 32, 27, 22, 30, 36, 42, 41, 34,
+    29, 23, 33, 39, 44, 44, 38, 31, 26, 32, 37, 36, 29, 23, 19, 15, 31, 38, 39,
+    31, 25, 20, 16, 31, 38, 41, 34, 28, 24, 20, 31, 38, 44, 38, 33, 27, 24, 34,
+    41, 46, 45, 37, 31, 25, 36, 43, 47, 49, 40, 33, 27, 39, 44, 49, 49, 42, 36,
+    29, 2,  0,  2,  2,  2,  2,  1,  2,  1,  2,  2,  2,  1,  1,  2,  2,  1,  2,
+    1,  2,  3,  2,  2,  2,  2,  3,  4,  5,  5,  5,  5,  5,  6,  5,  5,  9,  9,
+    9,  8,  6,  5,  5,  15, 14, 10, 8,  7,  5,  5,  2,  2,  1,  2,  1,  1,  4,
+    2,  2,  0,  2,  1,  1,  4,  2,  2,  1,  1,  1,  3,  5,  3,  3,  3,  3,  3,
+    4,  6,  7,  6,  7,  6,  6,  5,  6,  12, 11, 10, 9,  8,  7,  6,  19, 16, 12,
+    10, 9,  8,  6,  2,  2,  3,  3,  3,  5,  7,  3,  2,  3,  4,  4,  5,  7,  7,
+    2,  4,  6,  6,  6,  9,  10, 4,  8,  9,  9,  9,  11, 13, 8,  11, 13, 13, 12,
+    11, 17, 14, 15, 16, 15, 14, 10, 21, 20, 18, 18, 16, 15, 13, 7,  7,  9,  9,
+    10, 8,  11, 11, 8,  10, 11, 11, 11, 11, 13, 8,  11, 13, 13, 14, 13, 16, 11,
+    16, 17, 17, 17, 15, 17, 17, 20, 21, 21, 20, 18, 18, 23, 25, 24, 23, 21, 20,
+    21, 29, 28, 26, 25, 23, 22, 16, 17, 17, 17, 18, 17, 11, 20, 18, 19, 19, 19,
+    18, 11, 19, 20, 20, 22, 21, 20, 16, 19, 24, 26, 25, 26, 24, 22, 21, 29, 31,
+    30, 31, 27, 22, 26, 33, 35, 33, 31, 30, 25, 30, 36, 39, 36, 35, 31, 26, 27,
+    28, 28, 27, 23, 20, 15, 26, 30, 29, 29, 25, 21, 17, 27, 32, 32, 32, 28, 24,
+    21, 26, 35, 38, 37, 32, 29, 25, 30, 38, 41, 41, 36, 31, 25, 34, 40, 47, 45,
+    39, 33, 27, 37, 44, 48, 49, 41, 35, 29, 35, 42, 40, 33, 27, 22, 18, 36, 41,
+    42, 34, 29, 24, 21, 36, 41, 46, 38, 32, 28, 24, 35, 43, 49, 42, 37, 32, 28,
+    38, 45, 51, 48, 42, 36, 30, 40, 47, 53, 51, 44, 38, 32, 44, 49, 54, 55, 47,
+    39, 34, 2,  2,  0,  2,  2,  1,  2,  3,  2,  1,  2,  2,  1,  3,  3,  2,  1,
+    1,  2,  3,  5,  3,  3,  3,  3,  3,  4,  5,  6,  6,  7,  6,  6,  5,  6,  11,
+    10, 10, 9,  7,  5,  5,  17, 15, 12, 10, 8,  5,  6,  3,  2,  2,  1,  1,  3,
+    6,  3,  2,  2,  1,  1,  3,  6,  4,  3,  2,  2,  3,  5,  7,  7,  4,  4,  5,
+    6,  6,  8,  11, 7,  8,  9,  9,  6,  9,  14, 12, 12, 11, 11, 10, 8,  20, 17,
+    14, 12, 13, 11, 9,  4,  3,  4,  5,  6,  6,  8,  8,  3,  4,  6,  7,  6,  9,
+    11, 3,  5,  9,  10, 8,  11, 14, 5,  9,  12, 13, 12, 13, 17, 10, 12, 16, 17,
+    16, 13, 21, 15, 17, 20, 19, 17, 12, 23, 20, 20, 21, 20, 19, 16, 11, 8,  12,
+    13, 12, 10, 13, 15, 9,  12, 14, 14, 14, 14, 18, 10, 13, 16, 17, 17, 16, 20,
+    14, 18, 20, 21, 21, 18, 21, 20, 22, 24, 25, 24, 21, 21, 25, 27, 28, 27, 26,
+    25, 23, 31, 30, 30, 28, 27, 26, 19, 19, 20, 21, 21, 20, 13, 23, 21, 21, 22,
+    23, 21, 14, 23, 22, 23, 25, 25, 25, 19, 23, 26, 28, 29, 29, 28, 25, 24, 31,
+    34, 34, 34, 32, 26, 28, 36, 40, 38, 37, 34, 28, 32, 40, 43, 40, 39, 35, 29,
+    29, 32, 31, 30, 26, 22, 17, 29, 33, 32, 32, 29, 25, 21, 29, 36, 36, 36, 32,
+    28, 24, 29, 38, 42, 40, 36, 32, 28, 32, 42, 45, 44, 40, 35, 30, 37, 45, 50,
+    49, 42, 37, 31, 40, 47, 52, 52, 46, 39, 33, 38, 45, 42, 36, 30, 25, 21, 39,
+    45, 45, 38, 32, 28, 24, 39, 45, 49, 42, 37, 32, 28, 38, 46, 52, 46, 41, 35,
+    31, 42, 49, 55, 52, 45, 40, 34, 45, 51, 57, 57, 48, 42, 36, 48, 53, 58, 57,
+    51, 44, 38, 3,  2,  2,  0,  0,  2,  4,  3,  2,  2,  0,  1,  3,  6,  3,  3,
+    2,  2,  2,  4,  7,  4,  4,  4,  5,  4,  5,  7,  8,  7,  8,  8,  7,  6,  7,
+    12, 11, 12, 10, 8,  6,  7,  18, 16, 13, 11, 9,  6,  8,  3,  2,  2,  2,  3,
+    5,  7,  4,  3,  2,  2,  3,  6,  8,  8,  3,  2,  3,  6,  7,  9,  11, 4,  5,
+    6,  9,  8,  11, 14, 8,  9,  10, 12, 8,  11, 17, 13, 13, 13, 14, 12, 11, 22,
+    18, 15, 13, 16, 15, 11, 8,  3,  5,  8,  8,  8,  10, 12, 3,  5,  8,  10, 8,
+    11, 15, 5,  6,  11, 13, 9,  13, 18, 9,  10, 15, 16, 16, 16, 21, 12, 14, 19,
+    19, 19, 16, 24, 17, 18, 21, 22, 21, 16, 26, 22, 20, 23, 23, 22, 19, 15, 9,
+    13, 15, 16, 12, 15, 18, 11, 14, 16, 17, 17, 17, 22, 13, 15, 19, 21, 21, 19,
+    26, 17, 20, 24, 23, 25, 21, 26, 22, 24, 27, 28, 27, 24, 25, 27, 30, 31, 31,
+    29, 27, 25, 33, 33, 33, 32, 31, 30, 23, 20, 22, 24, 24, 23, 16, 26, 22, 25,
+    25, 26, 25, 17, 26, 25, 26, 28, 30, 28, 22, 26, 29, 31, 33, 33, 32, 27, 28,
+    34, 37, 36, 38, 36, 30, 30, 39, 42, 42, 41, 37, 32, 34, 43, 46, 44, 42, 39,
+    33, 31, 34, 33, 33, 30, 26, 20, 31, 36, 35, 35, 32, 28, 24, 32, 37, 39, 39,
+    36, 31, 28, 32, 40, 45, 42, 40, 37, 32, 34, 44, 50, 48, 44, 40, 34, 39, 47,
+    54, 52, 47, 40, 35, 43, 48, 56, 56, 49, 43, 37, 43, 46, 45, 39, 32, 29, 25,
+    42, 47, 47, 40, 35, 31, 28, 41, 47, 49, 44, 39, 36, 31, 42, 48, 55, 50, 44,
+    40, 34, 45, 52, 57, 55, 49, 43, 38, 48, 54, 59, 60, 53, 44, 39, 51, 57, 61,
+    60, 54, 47, 41, 3,  2,  2,  0,  0,  2,  4,  3,  2,  2,  1,  0,  3,  6,  3,
+    2,  2,  2,  2,  4,  6,  4,  4,  4,  4,  4,  5,  7,  8,  7,  8,  8,  7,  6,
+    8,  12, 12, 11, 11, 8,  6,  8,  18, 16, 13, 11, 9,  6,  8,  3,  2,  2,  2,
+    3,  5,  7,  4,  3,  2,  2,  3,  6,  8,  8,  3,  2,  3,  6,  7,  9,  12, 5,
+    5,  6,  9,  8,  11, 14, 8,  9,  10, 12, 8,  10, 17, 13, 13, 13, 14, 13, 11,
+    22, 18, 15, 13, 15, 15, 11, 8,  3,  5,  8,  8,  8,  10, 12, 3,  5,  9,  10,
+    8,  11, 16, 5,  6,  11, 13, 9,  13, 17, 8,  9,  15, 16, 15, 15, 22, 12, 14,
+    19, 20, 20, 16, 24, 17, 18, 21, 22, 21, 16, 26, 22, 20, 23, 24, 22, 19, 15,
+    9,  13, 15, 15, 12, 16, 18, 11, 14, 16, 17, 17, 17, 21, 13, 15, 19, 21, 21,
+    19, 26, 17, 20, 23, 24, 25, 20, 25, 21, 24, 27, 27, 27, 24, 24, 27, 29, 30,
+    30, 29, 27, 26, 33, 32, 33, 32, 31, 30, 23, 21, 23, 24, 23, 22, 15, 26, 22,
+    24, 24, 26, 25, 17, 26, 24, 25, 28, 30, 27, 22, 26, 29, 30, 33, 33, 32, 27,
+    28, 34, 36, 38, 37, 35, 30, 30, 38, 43, 42, 41, 37, 32, 33, 42, 46, 44, 42,
+    39, 34, 32, 34, 33, 33, 29, 26, 20, 32, 37, 35, 35, 32, 28, 24, 31, 38, 38,
+    39, 36, 32, 28, 31, 40, 44, 44, 39, 36, 32, 35, 42, 49, 48, 44, 40, 33, 39,
+    47, 54, 53, 46, 40, 36, 44, 50, 54, 55, 48, 43, 37, 40, 47, 44, 37, 33, 28,
+    25, 41, 48, 47, 40, 35, 31, 28, 40, 47, 50, 44, 40, 35, 31, 41, 49, 55, 50,
+    44, 39, 35, 44, 52, 58, 55, 47, 43, 38, 48, 55, 60, 59, 50, 45, 39, 50, 57,
+    62, 62, 53, 47, 42, 2,  2,  1,  2,  2,  0,  3,  2,  2,  1,  2,  2,  1,  4,
+    2,  2,  1,  2,  4,  3,  5,  3,  3,  4,  4,  6,  6,  6,  6,  7,  7,  7,  9,
+    8,  6,  11, 11, 11, 10, 9,  8,  6,  18, 15, 13, 11, 10, 7,  6,  2,  2,  2,
+    1,  1,  3,  5,  3,  2,  2,  1,  1,  4,  6,  6,  2,  2,  3,  4,  5,  7,  10,
+    4,  5,  6,  7,  6,  9,  11, 8,  9,  9,  10, 7,  8,  16, 13, 13, 12, 12, 11,
+    9,  21, 18, 15, 13, 14, 13, 9,  6,  2,  4,  6,  6,  6,  8,  10, 2,  4,  7,
+    8,  6,  9,  14, 3,  5,  9,  10, 7,  11, 16, 6,  9,  13, 14, 13, 13, 18, 11,
+    12, 17, 18, 17, 13, 22, 16, 17, 20, 20, 18, 13, 25, 22, 20, 22, 22, 20, 17,
+    14, 7,  12, 13, 13, 9,  13, 17, 9,  12, 14, 15, 14, 14, 20, 12, 13, 17, 18,
+    19, 16, 22, 15, 18, 22, 22, 22, 18, 22, 20, 22, 25, 26, 25, 21, 23, 25, 28,
+    28, 28, 27, 24, 24, 31, 31, 30, 30, 29, 27, 22, 19, 21, 21, 21, 20, 13, 24,
+    20, 22, 22, 23, 22, 14, 24, 22, 23, 26, 26, 25, 19, 25, 26, 28, 29, 32, 29,
+    25, 25, 32, 34, 35, 35, 32, 27, 28, 36, 41, 39, 37, 34, 30, 32, 40, 43, 43,
+    39, 36, 30, 29, 32, 32, 30, 26, 22, 17, 29, 35, 32, 32, 29, 25, 22, 29, 35,
+    35, 36, 33, 29, 25, 29, 38, 41, 41, 37, 33, 29, 33, 41, 47, 45, 42, 37, 30,
+    38, 44, 52, 52, 44, 38, 32, 41, 47, 53, 53, 47, 40, 34, 39, 46, 42, 36, 30,
+    26, 22, 39, 45, 45, 38, 33, 29, 25, 39, 44, 48, 42, 36, 33, 28, 39, 46, 52,
+    47, 41, 37, 33, 42, 50, 54, 52, 45, 39, 36, 45, 52, 58, 56, 49, 43, 35, 49,
+    54, 58, 59, 52, 44, 37, 1,  1,  2,  4,  4,  3,  0,  2,  1,  2,  4,  4,  3,
+    2,  2,  1,  1,  4,  5,  4,  4,  2,  3,  3,  5,  7,  7,  6,  5,  6,  7,  8,
+    10, 8,  7,  10, 10, 11, 11, 10, 8,  7,  17, 15, 12, 11, 11, 8,  7,  2,  1,
+    1,  3,  2,  2,  3,  2,  2,  1,  2,  2,  2,  4,  2,  2,  1,  3,  3,  3,  5,
+    6,  3,  4,  5,  5,  4,  6,  9,  7,  8,  8,  8,  6,  6,  13, 12, 12, 11, 9,
+    8,  6,  20, 18, 13, 12, 11, 9,  6,  2,  2,  3,  3,  3,  5,  6,  6,  2,  3,
+    4,  4,  4,  6,  11, 2,  4,  7,  7,  5,  8,  15, 4,  8,  10, 10, 10, 10, 16,
+    9,  11, 14, 14, 14, 10, 19, 14, 16, 18, 16, 15, 10, 23, 21, 19, 19, 18, 16,
+    14, 11, 7,  9,  10, 10, 7,  11, 15, 7,  10, 11, 12, 11, 11, 17, 9,  12, 14,
+    15, 15, 12, 19, 13, 16, 18, 18, 18, 14, 19, 17, 20, 22, 23, 22, 18, 20, 23,
+    26, 26, 25, 23, 21, 22, 29, 29, 27, 26, 25, 23, 19, 17, 18, 18, 18, 17, 11,
+    22, 18, 20, 19, 20, 19, 11, 22, 20, 21, 23, 23, 22, 17, 22, 24, 26, 27, 27,
+    26, 22, 23, 30, 31, 32, 32, 28, 24, 25, 34, 37, 36, 34, 30, 26, 30, 37, 41,
+    37, 36, 33, 27, 27, 29, 27, 27, 24, 20, 15, 26, 31, 30, 29, 26, 22, 18, 27,
+    33, 32, 33, 30, 26, 22, 26, 35, 39, 36, 34, 29, 25, 31, 37, 43, 42, 38, 33,
+    28, 35, 44, 48, 47, 40, 34, 30, 38, 45, 49, 49, 42, 37, 31, 35, 41, 38, 32,
+    26, 23, 18, 36, 42, 41, 35, 29, 25, 22, 36, 40, 43, 38, 33, 29, 25, 36, 42,
+    50, 43, 37, 34, 29, 39, 45, 52, 47, 42, 37, 31, 42, 47, 53, 54, 45, 39, 33,
+    46, 51, 54, 54, 46, 40, 35, 1,  2,  3,  3,  3,  2,  2,  0,  2,  2,  3,  3,
+    2,  1,  1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  4,  4,  3,  4,
+    4,  5,  4,  4,  7,  7,  7,  7,  5,  4,  4,  13, 12, 9,  7,  6,  4,  4,  1,
+    2,  2,  3,  2,  2,  1,  2,  1,  2,  2,  2,  1,  0,  2,  0,  2,  2,  2,  1,
+    2,  2,  2,  2,  2,  2,  3,  4,  5,  5,  5,  5,  5,  4,  4,  10, 9,  9,  8,
+    6,  4,  4,  17, 14, 11, 8,  6,  5,  4,  2,  1,  1,  2,  2,  2,  5,  2,  1,
+    1,  1,  1,  2,  6,  2,  2,  1,  2,  2,  2,  6,  5,  3,  4,  4,  5,  5,  7,
+    8,  7,  8,  8,  8,  7,  7,  13, 12, 12, 11, 10, 9,  7,  20, 17, 15, 13, 11,
+    10, 9,  2,  5,  6,  6,  6,  6,  9,  5,  6,  6,  7,  7,  7,  9,  8,  7,  8,
+    8,  9,  9,  9,  11, 9,  11, 12, 12, 12, 11, 12, 15, 15, 16, 15, 15, 14, 14,
+    20, 20, 20, 18, 17, 16, 19, 27, 24, 21, 20, 18, 17, 13, 14, 13, 14, 14, 13,
+    9,  15, 15, 14, 15, 15, 14, 9,  15, 17, 17, 17, 17, 16, 12, 15, 21, 20, 20,
+    21, 19, 16, 18, 25, 25, 24, 24, 23, 17, 22, 29, 30, 29, 26, 24, 19, 26, 32,
+    33, 31, 29, 26, 21, 23, 24, 23, 22, 20, 15, 12, 23, 27, 25, 25, 21, 16, 13,
+    23, 28, 28, 26, 23, 19, 15, 23, 30, 32, 31, 28, 22, 19, 26, 32, 36, 36, 31,
+    26, 20, 29, 34, 41, 39, 34, 28, 23, 31, 38, 41, 42, 35, 30, 25, 31, 37, 35,
+    29, 23, 18, 14, 31, 37, 38, 30, 25, 19, 15, 30, 36, 40, 33, 27, 23, 18, 30,
+    37, 44, 37, 31, 26, 23, 33, 39, 45, 43, 36, 30, 24, 36, 42, 48, 47, 39, 31,
+    27, 38, 43, 48, 49, 42, 34, 28, 2,  1,  2,  2,  2,  2,  1,  2,  0,  2,  3,
+    2,  2,  1,  2,  1,  1,  2,  2,  1,  3,  2,  2,  2,  2,  3,  3,  5,  5,  5,
+    5,  5,  5,  5,  4,  9,  8,  8,  8,  6,  5,  4,  15, 13, 10, 8,  7,  5,  4,
+    2,  1,  2,  2,  2,  1,  3,  2,  2,  1,  2,  1,  1,  3,  2,  2,  1,  1,  1,
+    2,  5,  2,  3,  3,  3,  3,  3,  6,  6,  6,  6,  6,  6,  4,  6,  11, 10, 10,
+    9,  7,  5,  6,  19, 15, 12, 9,  8,  7,  6,  2,  2,  2,  2,  2,  4,  7,  3,
+    2,  3,  3,  3,  5,  7,  5,  2,  4,  5,  5,  5,  8,  9,  3,  7,  8,  8,  8,
+    9,  12, 8,  11, 11, 12, 11, 10, 16, 13, 15, 15, 14, 12, 10, 21, 19, 18, 17,
+    15, 14, 13, 5,  7,  8,  8,  9,  8,  11, 9,  7,  9,  10, 10, 10, 11, 12, 8,
+    11, 11, 12, 12, 12, 16, 11, 15, 16, 16, 15, 14, 16, 17, 19, 19, 20, 19, 17,
+    16, 23, 24, 23, 22, 20, 19, 21, 29, 27, 25, 23, 22, 20, 16, 16, 17, 16, 17,
+    16, 10, 18, 18, 18, 18, 18, 17, 11, 18, 19, 20, 20, 21, 19, 16, 18, 24, 24,
+    25, 25, 23, 20, 21, 29, 29, 28, 28, 26, 21, 24, 32, 34, 33, 31, 28, 24, 29,
+    36, 38, 34, 33, 30, 25, 26, 28, 26, 26, 22, 18, 14, 25, 31, 28, 28, 23, 19,
+    16, 26, 32, 31, 31, 27, 23, 19, 26, 33, 36, 33, 32, 26, 22, 29, 36, 40, 38,
+    35, 30, 25, 33, 39, 45, 44, 36, 31, 27, 35, 42, 45, 46, 41, 33, 29, 35, 41,
+    38, 31, 26, 21, 17, 35, 40, 41, 34, 27, 23, 19, 35, 41, 44, 37, 30, 26, 22,
+    34, 41, 47, 41, 35, 31, 26, 37, 43, 50, 47, 40, 34, 29, 39, 46, 52, 51, 42,
+    37, 30, 42, 49, 53, 53, 44, 39, 32, 2,  1,  1,  2,  2,  1,  2,  2,  2,  0,
+    2,  2,  1,  3,  3,  2,  1,  1,  2,  2,  4,  3,  3,  3,  3,  3,  4,  5,  5,
+    6,  6,  6,  6,  5,  5,  10, 10, 9,  8,  7,  5,  5,  17, 15, 11, 9,  7,  5,
+    5,  3,  2,  1,  1,  1,  3,  5,  3,  2,  2,  1,  1,  3,  6,  3,  2,  2,  2,
+    2,  4,  7,  6,  4,  4,  4,  5,  5,  8,  9,  7,  7,  8,  8,  5,  8,  13, 12,
+    11, 11, 10, 9,  8,  20, 17, 13, 11, 11, 10, 8,  3,  2,  4,  5,  5,  6,  8,
+    6,  3,  4,  6,  6,  6,  8,  10, 3,  5,  8,  8,  7,  10, 13, 4,  9,  11, 12,
+    11, 12, 16, 9,  12, 15, 15, 15, 12, 20, 14, 16, 18, 17, 16, 12, 22, 20, 19,
+    20, 19, 17, 16, 10, 7,  11, 11, 11, 9,  12, 13, 8,  11, 12, 13, 13, 13, 16,
+    10, 13, 16, 16, 16, 15, 18, 13, 17, 19, 19, 19, 17, 20, 18, 22, 23, 24, 22,
+    19, 20, 24, 27, 27, 25, 25, 22, 23, 30, 30, 28, 27, 26, 25, 19, 18, 19, 19,
+    20, 18, 12, 21, 19, 20, 21, 21, 20, 13, 22, 21, 23, 24, 25, 23, 18, 21, 26,
+    27, 28, 28, 27, 23, 24, 31, 33, 32, 33, 30, 25, 27, 36, 38, 36, 34, 31, 26,
+    31, 39, 41, 38, 37, 34, 28, 28, 31, 30, 29, 25, 21, 17, 28, 33, 32, 31, 28,
+    23, 19, 27, 35, 35, 34, 31, 26, 23, 28, 36, 40, 38, 35, 30, 27, 32, 41, 45,
+    44, 39, 34, 29, 35, 43, 51, 48, 42, 36, 30, 39, 46, 51, 50, 44, 38, 32, 37,
+    44, 41, 34, 29, 24, 20, 39, 44, 44, 37, 32, 26, 23, 38, 43, 47, 40, 36, 31,
+    26, 38, 45, 50, 45, 39, 35, 30, 40, 48, 54, 50, 43, 37, 32, 44, 51, 56, 53,
+    46, 40, 34, 46, 52, 57, 57, 49, 42, 37, 3,  2,  2,  0,  0,  2,  4,  3,  3,
+    2,  0,  1,  2,  5,  3,  3,  2,  2,  2,  3,  6,  4,  4,  4,  4,  4,  5,  7,
+    7,  7,  7,  7,  7,  6,  7,  12, 11, 11, 10, 8,  6,  7,  17, 15, 12, 10, 9,
+    6,  7,  3,  3,  2,  2,  2,  5,  7,  3,  3,  2,  2,  2,  5,  8,  7,  3,  2,
+    3,  5,  6,  9,  10, 4,  5,  6,  8,  7,  10, 13, 8,  9,  9,  12, 8,  10, 16,
+    13, 13, 12, 13, 12, 10, 22, 18, 14, 13, 15, 14, 10, 7,  3,  5,  7,  7,  8,
+    10, 11, 3,  5,  8,  9,  8,  11, 14, 4,  6,  11, 12, 9,  12, 17, 7,  9,  14,
+    15, 15, 15, 19, 11, 13, 18, 19, 18, 15, 24, 16, 18, 20, 21, 20, 15, 25, 21,
+    20, 22, 22, 21, 18, 14, 8,  13, 14, 14, 11, 15, 17, 10, 13, 15, 17, 16, 16,
+    20, 12, 14, 18, 20, 20, 18, 22, 16, 19, 22, 23, 23, 19, 23, 21, 24, 26, 27,
+    27, 23, 24, 26, 29, 30, 30, 28, 27, 25, 32, 32, 31, 31, 29, 29, 22, 20, 22,
+    23, 23, 22, 15, 27, 21, 24, 24, 25, 24, 16, 25, 23, 26, 28, 28, 27, 21, 25,
+    29, 30, 32, 33, 31, 27, 27, 34, 36, 37, 37, 34, 29, 30, 38, 42, 41, 38, 35,
+    31, 32, 41, 45, 42, 42, 38, 33, 32, 33, 34, 32, 29, 25, 19, 31, 36, 35, 34,
+    32, 27, 24, 31, 38, 37, 38, 34, 30, 27, 31, 39, 43, 42, 39, 35, 31, 35, 43,
+    50, 47, 44, 39, 33, 39, 47, 55, 52, 46, 39, 34, 43, 50, 54, 55, 49, 42, 36,
+    41, 46, 44, 38, 32, 27, 24, 41, 46, 46, 40, 34, 31, 27, 40, 48, 50, 44, 40,
+    35, 30, 41, 47, 55, 48, 43, 39, 34, 44, 50, 58, 54, 48, 42, 37, 47, 54, 60,
+    58, 52, 45, 37, 50, 55, 61, 60, 54, 47, 39, 2,  2,  2,  1,  1,  2,  4,  3,
+    2,  2,  1,  0,  2,  5,  3,  2,  2,  2,  2,  4,  6,  4,  4,  4,  4,  4,  5,
+    7,  8,  7,  7,  7,  7,  6,  7,  12, 11, 11, 10, 8,  6,  7,  17, 15, 13, 10,
+    9,  6,  7,  3,  2,  2,  1,  3,  5,  8,  4,  2,  2,  2,  3,  5,  8,  7,  3,
+    2,  3,  6,  6,  9,  11, 4,  5,  6,  9,  7,  10, 14, 8,  8,  9,  12, 8,  10,
+    17, 13, 13, 12, 14, 12, 10, 22, 18, 14, 13, 15, 14, 10, 7,  3,  5,  8,  8,
+    9,  11, 12, 3,  5,  8,  9,  8,  11, 15, 5,  5,  11, 12, 9,  13, 18, 8,  9,
+    15, 16, 15, 15, 21, 12, 13, 18, 19, 19, 15, 25, 16, 18, 21, 21, 21, 15, 25,
+    22, 20, 23, 23, 22, 19, 15, 8,  13, 15, 15, 12, 16, 18, 10, 14, 16, 17, 17,
+    17, 21, 13, 14, 19, 20, 21, 18, 25, 17, 19, 23, 23, 24, 20, 25, 21, 24, 27,
+    28, 27, 23, 25, 26, 29, 31, 30, 28, 26, 25, 32, 32, 32, 31, 31, 29, 23, 21,
+    22, 24, 24, 23, 16, 26, 22, 23, 24, 26, 25, 17, 26, 24, 26, 28, 30, 28, 21,
+    26, 28, 31, 33, 33, 32, 27, 27, 35, 36, 36, 38, 35, 30, 29, 38, 41, 42, 39,
+    36, 31, 34, 41, 45, 43, 42, 38, 33, 32, 34, 34, 32, 30, 25, 20, 31, 35, 35,
+    35, 32, 28, 23, 31, 38, 38, 38, 35, 31, 28, 31, 40, 44, 43, 39, 35, 32, 34,
+    43, 49, 47, 43, 40, 32, 40, 46, 54, 52, 46, 39, 35, 43, 50, 55, 55, 48, 42,
+    36, 42, 47, 45, 39, 33, 28, 24, 41, 47, 48, 40, 35, 31, 27, 41, 47, 50, 45,
+    40, 35, 31, 42, 48, 56, 49, 44, 39, 35, 45, 51, 57, 55, 48, 42, 37, 48, 53,
+    61, 59, 51, 44, 39, 50, 57, 61, 61, 54, 48, 40, 2,  1,  1,  3,  3,  1,  3,
+    2,  1,  1,  2,  2,  0,  3,  2,  2,  1,  1,  2,  2,  4,  2,  3,  3,  3,  4,
+    4,  5,  5,  6,  6,  6,  7,  6,  5,  10, 10, 9,  9,  8,  6,  5,  16, 14, 11,
+    9,  8,  6,  5,  2,  2,  1,  1,  2,  4,  6,  2,  2,  1,  1,  2,  3,  5,  4,
+    2,  1,  2,  3,  4,  6,  9,  3,  4,  4,  6,  5,  7,  11, 7,  7,  8,  9,  5,
+    7,  14, 11, 11, 11, 11, 9,  7,  19, 16, 13, 11, 12, 11, 7,  5,  2,  4,  6,
+    7,  7,  9,  9,  2,  4,  7,  7,  6,  8,  13, 2,  5,  9,  9,  6,  10, 15, 5,
+    8,  12, 12, 12, 12, 18, 9,  11, 16, 16, 15, 12, 21, 14, 16, 19, 18, 17, 12,
+    23, 20, 18, 20, 19, 18, 16, 13, 7,  11, 12, 13, 11, 14, 16, 8,  12, 14, 15,
+    14, 13, 19, 10, 13, 16, 17, 18, 15, 21, 14, 17, 20, 20, 20, 16, 22, 19, 21,
+    24, 24, 24, 20, 21, 24, 26, 27, 26, 26, 23, 22, 30, 29, 28, 28, 27, 26, 20,
+    19, 20, 20, 22, 21, 14, 23, 20, 22, 23, 23, 21, 13, 23, 22, 24, 25, 26, 24,
+    19, 24, 26, 28, 29, 29, 28, 23, 25, 31, 34, 33, 34, 32, 25, 28, 36, 39, 37,
+    36, 33, 28, 30, 39, 41, 39, 38, 34, 30, 29, 32, 31, 31, 28, 23, 19, 28, 33,
+    33, 32, 29, 24, 20, 28, 37, 35, 37, 32, 28, 24, 28, 37, 41, 40, 37, 33, 28,
+    31, 39, 46, 43, 40, 35, 29, 37, 43, 51, 48, 42, 36, 31, 39, 46, 51, 51, 44,
+    39, 33, 39, 44, 42, 36, 30, 26, 22, 39, 44, 45, 38, 32, 28, 24, 39, 44, 47,
+    41, 35, 31, 27, 38, 47, 51, 45, 40, 35, 31, 41, 48, 54, 51, 44, 39, 33, 46,
+    51, 56, 57, 47, 40, 35, 47, 53, 58, 58, 49, 43, 37, 1,  1,  3,  6,  6,  4,
+    2,  1,  1,  3,  5,  5,  3,  0,  2,  1,  2,  3,  4,  3,  2,  2,  2,  2,  3,
+    5,  5,  4,  4,  5,  5,  6,  8,  6,  4,  9,  8,  8,  8,  8,  6,  4,  14, 12,
+    10, 8,  9,  6,  4,  2,  1,  2,  4,  3,  3,  5,  2,  1,  1,  3,  3,  2,  3,
+    2,  1,  1,  1,  1,  2,  4,  3,  3,  3,  3,  3,  3,  4,  8,  6,  6,  6,  6,
+    4,  4,  12, 10, 10, 9,  7,  6,  5,  18, 14, 11, 10, 8,  7,  5,  2,  1,  3,
+    4,  5,  6,  8,  4,  2,  3,  5,  5,  5,  6,  9,  2,  4,  6,  6,  4,  6,  12,
+    3,  7,  9,  9,  9,  8,  16, 8,  10, 12, 13, 12, 8,  18, 13, 14, 15, 14, 13,
+    8,  20, 18, 16, 17, 16, 15, 13, 8,  6,  9,  10, 11, 9,  11, 13, 7,  10, 11,
+    12, 12, 11, 15, 8,  11, 13, 13, 13, 11, 17, 11, 15, 16, 16, 16, 13, 19, 16,
+    19, 21, 21, 20, 16, 18, 21, 23, 24, 23, 22, 19, 20, 27, 26, 25, 24, 23, 21,
+    17, 17, 18, 18, 19, 18, 12, 21, 18, 19, 19, 20, 18, 11, 20, 20, 21, 22, 22,
+    21, 15, 20, 24, 25, 25, 26, 24, 19, 22, 28, 29, 29, 30, 28, 22, 24, 33, 36,
+    35, 32, 29, 24, 28, 36, 39, 36, 35, 31, 26, 27, 29, 27, 27, 24, 21, 17, 26,
+    32, 30, 29, 25, 21, 16, 26, 33, 33, 31, 27, 23, 20, 25, 36, 36, 34, 32, 28,
+    23, 29, 37, 42, 41, 34, 31, 26, 32, 40, 46, 44, 38, 33, 27, 37, 41, 47, 46,
+    40, 34, 29, 36, 41, 39, 32, 27, 24, 19, 36, 41, 41, 35, 29, 24, 20, 35, 40,
+    44, 37, 32, 27, 24, 36, 43, 47, 42, 37, 32, 27, 38, 44, 50, 47, 40, 34, 29,
+    41, 47, 52, 49, 42, 37, 31, 43, 49, 52, 52, 46, 39, 33, 2,  2,  3,  3,  3,
+    2,  2,  1,  2,  3,  3,  3,  2,  2,  0,  2,  2,  3,  2,  2,  1,  1,  1,  1,
+    2,  2,  2,  3,  3,  3,  3,  4,  4,  3,  3,  7,  7,  7,  6,  5,  3,  3,  13,
+    11, 9,  7,  5,  3,  3,  0,  2,  2,  3,  2,  2,  2,  1,  2,  2,  3,  2,  2,
+    1,  2,  1,  2,  2,  2,  2,  1,  2,  1,  2,  2,  2,  2,  3,  4,  4,  4,  4,
+    4,  3,  4,  9,  8,  8,  7,  5,  4,  4,  16, 13, 10, 8,  6,  4,  3,  2,  1,
+    2,  2,  2,  1,  4,  2,  1,  1,  1,  1,  1,  4,  2,  1,  1,  0,  0,  1,  5,
+    3,  2,  3,  3,  3,  3,  6,  7,  6,  6,  6,  7,  6,  6,  12, 11, 11, 10, 8,
+    7,  6,  19, 17, 13, 12, 10, 9,  8,  2,  4,  4,  5,  5,  5,  8,  3,  5,  5,
+    6,  6,  6,  8,  7,  6,  6,  7,  7,  7,  8,  10, 9,  10, 10, 10, 11, 10, 10,
+    14, 14, 14, 14, 13, 13, 13, 19, 19, 18, 16, 15, 14, 18, 25, 22, 20, 18, 16,
+    16, 12, 12, 12, 12, 12, 12, 8,  14, 14, 14, 13, 14, 13, 8,  14, 16, 15, 15,
+    15, 14, 11, 14, 19, 19, 19, 19, 18, 14, 17, 23, 23, 23, 23, 20, 16, 21, 27,
+    28, 27, 26, 23, 18, 25, 31, 32, 29, 28, 25, 20, 21, 23, 22, 21, 18, 14, 10,
+    21, 25, 23, 23, 20, 16, 11, 21, 27, 26, 25, 22, 18, 14, 21, 27, 30, 29, 25,
+    21, 18, 24, 30, 34, 34, 30, 25, 19, 27, 33, 39, 37, 32, 26, 21, 30, 36, 40,
+    40, 35, 28, 23, 29, 34, 33, 27, 22, 17, 13, 29, 35, 37, 29, 23, 19, 14, 29,
+    35, 39, 32, 25, 22, 17, 30, 35, 42, 35, 30, 25, 21, 31, 37, 44, 40, 35, 29,
+    23, 33, 41, 46, 46, 36, 31, 25, 36, 43, 47, 46, 39, 32, 26, 1,  2,  2,  2,
+    2,  2,  1,  2,  1,  2,  3,  2,  2,  1,  2,  0,  2,  2,  2,  2,  2,  2,  2,
+    2,  2,  2,  3,  4,  4,  4,  4,  4,  5,  4,  4,  8,  8,  8,  7,  5,  4,  4,
+    14, 12, 9,  8,  6,  4,  4,  2,  0,  2,  2,  2,  2,  2,  2,  1,  2,  2,  2,
+    1,  2,  2,  2,  1,  2,  2,  1,  4,  2,  2,  2,  3,  2,  3,  5,  6,  5,  5,
+    5,  5,  4,  5,  11, 10, 9,  8,  6,  5,  5,  18, 15, 11, 9,  7,  5,  5,  2,
+    2,  1,  2,  1,  3,  6,  2,  2,  2,  2,  2,  4,  6,  4,  2,  3,  3,  4,  4,
+    7,  7,  3,  6,  6,  6,  7,  9,  11, 7,  9,  10, 10, 10, 8,  15, 12, 14, 13,
+    12, 11, 8,  20, 18, 17, 15, 14, 12, 11, 4,  6,  7,  7,  8,  7,  10, 8,  7,
+    8,  8,  9,  9,  10, 11, 8,  10, 10, 11, 11, 11, 14, 10, 14, 14, 14, 14, 13,
+    14, 16, 18, 18, 18, 17, 16, 15, 21, 22, 21, 20, 18, 18, 20, 28, 26, 24, 22,
+    20, 19, 14, 15, 15, 15, 16, 15, 10, 17, 17, 16, 16, 17, 15, 10, 16, 18, 19,
+    19, 19, 18, 14, 17, 22, 23, 23, 23, 21, 18, 19, 27, 27, 27, 27, 24, 20, 24,
+    31, 34, 32, 29, 27, 21, 28, 34, 36, 33, 31, 28, 23, 24, 26, 24, 24, 21, 17,
+    13, 24, 29, 27, 26, 23, 18, 14, 24, 30, 29, 28, 25, 21, 17, 24, 31, 34, 32,
+    29, 25, 22, 29, 35, 38, 37, 34, 29, 23, 32, 37, 44, 42, 36, 31, 25, 34, 40,
+    45, 44, 39, 33, 26, 33, 38, 37, 30, 24, 20, 16, 32, 39, 40, 32, 26, 21, 18,
+    32, 38, 42, 35, 30, 25, 21, 33, 40, 46, 39, 33, 28, 24, 34, 41, 48, 43, 38,
+    32, 27, 37, 43, 49, 49, 41, 35, 28, 40, 46, 49, 50, 44, 36, 30, 2,  1,  1,
+    2,  2,  1,  1,  2,  1,  1,  2,  2,  1,  2,  2,  2,  0,  2,  1,  2,  3,  2,
+    3,  2,  3,  3,  4,  5,  5,  5,  6,  5,  6,  5,  5,  10, 9,  9,  8,  6,  5,
+    5,  16, 14, 11, 8,  7,  5,  4,  2,  2,  1,  2,  1,  2,  5,  2,  2,  1,  1,
+    1,  2,  5,  3,  2,  1,  1,  1,  3,  6,  4,  3,  3,  3,  4,  4,  7,  8,  6,
+    7,  7,  7,  5,  7,  12, 11, 10, 10, 9,  7,  7,  19, 16, 13, 11, 10, 9,  7,
+    2,  2,  4,  4,  5,  6,  8,  4,  2,  4,  5,  5,  6,  8,  8,  2,  5,  7,  7,
+    6,  9,  11, 4,  8,  10, 10, 10, 11, 14, 8,  11, 14, 14, 14, 11, 18, 14, 16,
+    17, 16, 15, 11, 21, 20, 18, 19, 18, 16, 14, 8,  7,  10, 11, 11, 9,  12, 11,
+    8,  11, 11, 12, 12, 12, 14, 8,  12, 14, 14, 15, 14, 17, 12, 17, 18, 18, 17,
+    15, 18, 17, 21, 21, 22, 21, 19, 18, 23, 26, 25, 24, 23, 21, 22, 30, 29, 27,
+    26, 24, 23, 17, 18, 18, 18, 19, 18, 12, 19, 19, 19, 20, 20, 19, 12, 20, 20,
+    21, 23, 23, 22, 17, 20, 25, 27, 26, 27, 26, 21, 22, 30, 32, 31, 31, 29, 23,
+    26, 35, 37, 35, 33, 30, 25, 30, 37, 40, 37, 36, 32, 27, 28, 29, 28, 28, 25,
+    20, 17, 27, 32, 31, 30, 26, 22, 18, 27, 34, 34, 34, 29, 25, 21, 27, 35, 38,
+    37, 34, 30, 25, 31, 38, 43, 41, 38, 33, 27, 34, 41, 49, 47, 39, 33, 29, 38,
+    44, 49, 49, 43, 36, 30, 36, 43, 41, 34, 28, 24, 20, 37, 43, 44, 36, 30, 25,
+    21, 36, 43, 46, 38, 34, 29, 24, 37, 44, 49, 44, 38, 34, 29, 40, 46, 53, 49,
+    42, 36, 30, 42, 49, 55, 54, 45, 38, 33, 45, 51, 55, 55, 48, 41, 34, 2,  2,
+    1,  2,  2,  2,  4,  2,  2,  1,  2,  2,  1,  3,  3,  2,  2,  0,  1,  2,  4,
+    3,  3,  3,  3,  2,  3,  5,  6,  6,  6,  6,  5,  4,  5,  10, 10, 9,  8,  6,
+    4,  5,  16, 14, 11, 9,  7,  4,  5,  2,  2,  1,  2,  3,  5,  7,  3,  2,  2,
+    2,  3,  4,  6,  4,  2,  2,  2,  3,  5,  7,  7,  3,  4,  4,  6,  6,  8,  10,
+    7,  7,  8,  9,  6,  8,  14, 11, 11, 10, 11, 10, 8,  19, 16, 13, 11, 13, 11,
+    8,  4,  2,  5,  7,  8,  9,  11, 8,  3,  4,  7,  8,  8,  10, 11, 3,  5,  9,
+    10, 8,  11, 14, 5,  8,  12, 13, 13, 13, 18, 9,  12, 16, 17, 16, 13, 21, 14,
+    16, 19, 19, 18, 13, 22, 20, 18, 21, 20, 19, 17, 11, 8,  12, 14, 14, 12, 16,
+    15, 8,  13, 14, 15, 16, 15, 18, 10, 14, 17, 18, 17, 16, 20, 14, 18, 20, 21,
+    21, 18, 21, 19, 23, 24, 25, 24, 21, 21, 24, 27, 28, 27, 27, 24, 23, 30, 31,
+    29, 29, 27, 27, 20, 19, 21, 22, 23, 22, 16, 23, 21, 23, 23, 24, 22, 15, 23,
+    23, 24, 26, 26, 25, 20, 23, 27, 29, 30, 31, 29, 25, 25, 32, 33, 34, 34, 32,
+    27, 27, 36, 39, 38, 36, 34, 29, 31, 39, 43, 41, 39, 37, 30, 30, 33, 33, 32,
+    29, 25, 20, 29, 34, 34, 34, 30, 25, 21, 29, 37, 37, 37, 33, 28, 25, 30, 39,
+    41, 40, 37, 33, 29, 33, 42, 47, 45, 41, 38, 30, 36, 44, 51, 49, 44, 38, 33,
+    40, 47, 52, 53, 46, 38, 34, 41, 46, 44, 37, 32, 28, 23, 40, 45, 46, 40, 33,
+    29, 25, 40, 46, 49, 42, 37, 33, 28, 40, 47, 53, 47, 41, 36, 32, 43, 50, 55,
+    52, 46, 40, 35, 45, 52, 57, 56, 49, 43, 36, 48, 54, 57, 58, 52, 44, 38, 2,
+    1,  2,  2,  2,  4,  5,  2,  2,  2,  2,  2,  2,  4,  3,  2,  2,  1,  0,  2,
+    5,  3,  3,  3,  2,  2,  3,  6,  7,  6,  6,  5,  5,  4,  6,  11, 9,  9,  8,
+    6,  4,  6,  16, 13, 10, 8,  7,  4,  6,  3,  2,  2,  3,  4,  7,  9,  3,  2,
+    2,  3,  4,  6,  8,  5,  2,  2,  2,  4,  5,  8,  9,  4,  4,  4,  7,  6,  9,
+    13, 7,  7,  7,  10, 6,  9,  16, 11, 11, 10, 12, 11, 9,  20, 16, 12, 11, 13,
+    12, 9,  5,  2,  5,  9,  9,  10, 13, 9,  3,  5,  9,  10, 9,  11, 13, 3,  5,
+    10, 11, 8,  11, 15, 6,  8,  13, 14, 14, 14, 20, 11, 12, 16, 18, 18, 13, 23,
+    15, 16, 19, 20, 18, 14, 23, 19, 18, 20, 21, 20, 18, 13, 8,  13, 15, 16, 14,
+    18, 16, 9,  14, 16, 17, 17, 17, 19, 11, 14, 18, 18, 19, 17, 23, 15, 18, 21,
+    22, 22, 19, 24, 20, 23, 25, 26, 25, 22, 24, 24, 27, 28, 28, 28, 25, 23, 30,
+    31, 30, 30, 29, 27, 21, 20, 23, 23, 25, 24, 18, 25, 22, 24, 25, 26, 24, 17,
+    24, 24, 27, 28, 28, 26, 21, 24, 28, 30, 31, 31, 29, 26, 26, 32, 35, 36, 36,
+    33, 28, 28, 37, 40, 39, 39, 35, 29, 30, 40, 45, 42, 40, 37, 32, 31, 34, 33,
+    34, 31, 27, 22, 31, 36, 35, 36, 32, 28, 23, 30, 38, 38, 38, 34, 30, 26, 30,
+    41, 42, 42, 39, 33, 29, 34, 43, 48, 47, 42, 37, 31, 36, 45, 53, 51, 44, 40,
+    34, 41, 47, 53, 54, 47, 40, 35, 41, 47, 45, 39, 34, 30, 26, 41, 47, 47, 41,
+    35, 30, 26, 42, 48, 50, 44, 37, 34, 30, 42, 48, 54, 47, 42, 38, 33, 43, 51,
+    56, 52, 47, 40, 35, 47, 53, 59, 57, 49, 42, 37, 50, 55, 59, 59, 52, 46, 39,
+    1,  2,  2,  4,  4,  3,  4,  2,  1,  2,  4,  4,  2,  3,  2,  2,  2,  2,  3,
+    0,  3,  2,  2,  1,  1,  2,  2,  3,  4,  4,  4,  4,  5,  4,  4,  8,  8,  7,
+    7,  6,  4,  4,  13, 11, 9,  7,  6,  4,  4,  2,  1,  2,  3,  4,  6,  7,  2,
+    1,  2,  3,  4,  5,  6,  3,  2,  1,  1,  2,  3,  5,  6,  3,  2,  3,  4,  4,
+    6,  10, 5,  5,  6,  7,  4,  6,  12, 9,  9,  8,  9,  7,  6,  17, 14, 10, 9,
+    10, 9,  6,  2,  2,  5,  7,  8,  9,  11, 7,  2,  4,  8,  8,  8,  9,  11, 2,
+    4,  7,  8,  6,  8,  14, 4,  7,  10, 10, 11, 10, 17, 8,  10, 14, 15, 14, 10,
+    19, 12, 14, 16, 16, 15, 10, 20, 17, 15, 17, 18, 17, 15, 11, 7,  12, 14, 14,
+    12, 15, 14, 8,  12, 15, 16, 15, 15, 17, 9,  12, 15, 16, 16, 14, 19, 12, 16,
+    18, 19, 18, 15, 21, 17, 20, 22, 23, 22, 18, 20, 22, 24, 25, 25, 23, 22, 20,
+    26, 26, 27, 26, 25, 24, 18, 18, 21, 22, 23, 22, 16, 21, 20, 22, 23, 24, 23,
+    15, 22, 21, 24, 25, 24, 23, 18, 22, 26, 26, 28, 28, 27, 23, 23, 30, 31, 32,
+    33, 29, 24, 26, 34, 38, 36, 34, 31, 26, 27, 36, 39, 37, 37, 34, 27, 28, 31,
+    32, 32, 29, 25, 20, 29, 33, 33, 33, 29, 25, 21, 27, 36, 35, 34, 30, 27, 23,
+    28, 38, 39, 37, 34, 29, 26, 31, 39, 43, 42, 38, 32, 28, 34, 41, 48, 46, 41,
+    34, 30, 37, 44, 49, 49, 42, 37, 31, 39, 44, 42, 36, 31, 27, 23, 39, 45, 45,
+    38, 33, 28, 23, 39, 45, 47, 40, 34, 30, 26, 40, 45, 52, 44, 38, 34, 30, 41,
+    47, 52, 49, 42, 37, 33, 43, 48, 55, 53, 45, 39, 33, 46, 51, 56, 55, 48, 40,
+    35, 2,  3,  5,  6,  6,  5,  4,  1,  2,  4,  6,  6,  4,  2,  1,  2,  3,  4,
+    5,  3,  0,  1,  1,  1,  3,  4,  3,  2,  3,  3,  3,  4,  6,  4,  2,  7,  6,
+    6,  6,  6,  4,  2,  11, 9,  7,  6,  6,  4,  2,  1,  2,  3,  5,  4,  5,  6,
+    1,  2,  3,  4,  4,  4,  5,  2,  1,  2,  3,  2,  2,  3,  2,  1,  1,  1,  1,
+    2,  4,  5,  4,  4,  4,  3,  2,  3,  9,  8,  7,  7,  5,  4,  4,  14, 11, 8,
+    7,  7,  6,  4,  2,  1,  5,  5,  6,  8,  9,  2,  1,  4,  6,  6,  6,  8,  5,
+    1,  4,  6,  6,  5,  6,  10, 2,  5,  7,  7,  7,  7,  13, 6,  8,  10, 11, 10,
+    7,  15, 11, 11, 13, 13, 11, 7,  16, 14, 13, 14, 14, 13, 12, 6,  6,  11, 11,
+    12, 11, 13, 11, 7,  11, 12, 13, 13, 12, 13, 7,  11, 13, 13, 13, 11, 16, 10,
+    14, 15, 14, 15, 12, 17, 15, 17, 19, 19, 18, 15, 16, 19, 20, 21, 21, 20, 18,
+    16, 22, 23, 23, 23, 21, 20, 15, 17, 18, 19, 20, 19, 13, 18, 18, 20, 20, 21,
+    20, 12, 18, 19, 21, 21, 21, 19, 15, 18, 22, 24, 24, 24, 22, 18, 20, 27, 28,
+    28, 28, 26, 20, 21, 30, 33, 31, 29, 28, 22, 24, 33, 34, 33, 32, 28, 24, 27,
+    30, 29, 29, 26, 22, 17, 26, 31, 30, 31, 27, 22, 18, 26, 34, 33, 31, 27, 23,
+    19, 26, 34, 35, 33, 31, 27, 22, 28, 36, 40, 38, 34, 29, 24, 31, 37, 43, 42,
+    36, 30, 26, 33, 39, 45, 44, 39, 33, 27, 37, 41, 39, 34, 29, 25, 21, 36, 41,
+    42, 36, 30, 25, 21, 37, 41, 45, 37, 31, 26, 22, 36, 42, 46, 41, 35, 31, 26,
+    37, 43, 48, 44, 38, 31, 28, 39, 45, 50, 48, 41, 34, 29, 41, 46, 51, 51, 45,
+    36, 29, 2,  2,  3,  4,  4,  3,  2,  2,  2,  3,  4,  4,  3,  2,  1,  2,  2,
+    3,  3,  2,  1,  0,  2,  2,  2,  3,  2,  3,  3,  3,  3,  3,  4,  3,  3,  7,
+    6,  7,  6,  4,  3,  3,  12, 11, 8,  7,  5,  3,  3,  1,  2,  3,  3,  2,  2,
+    2,  0,  2,  2,  3,  2,  2,  1,  1,  2,  2,  2,  2,  2,  1,  2,  1,  2,  2,
+    2,  1,  3,  4,  3,  4,  4,  4,  3,  3,  9,  8,  8,  7,  5,  3,  3,  16, 13,
+    10, 8,  6,  4,  3,  1,  2,  2,  2,  2,  2,  3,  2,  1,  1,  2,  2,  2,  3,
+    2,  0,  1,  1,  1,  1,  3,  2,  2,  2,  2,  2,  2,  5,  6,  5,  5,  5,  5,
+    4,  5,  12, 10, 10, 9,  7,  6,  5,  18, 17, 13, 10, 9,  7,  6,  2,  3,  3,
+    4,  4,  4,  7,  2,  4,  4,  5,  5,  5,  8,  5,  5,  5,  6,  6,  6,  7,  8,
+    8,  8,  9,  9,  9,  9,  9,  13, 13, 12, 13, 12, 11, 12, 19, 17, 16, 15, 14,
+    13, 18, 24, 21, 18, 17, 15, 15, 11, 11, 11, 11, 11, 11, 8,  13, 13, 12, 13,
+    13, 12, 8,  12, 15, 15, 14, 14, 13, 10, 13, 18, 18, 17, 18, 16, 13, 16, 23,
+    22, 22, 22, 20, 15, 20, 26, 28, 26, 25, 21, 17, 24, 29, 30, 27, 27, 23, 18,
+    20, 23, 21, 21, 17, 13, 10, 21, 24, 23, 22, 19, 15, 10, 21, 25, 26, 24, 21,
+    17, 12, 21, 27, 28, 27, 25, 20, 17, 23, 29, 33, 33, 29, 23, 19, 25, 32, 38,
+    36, 30, 26, 20, 29, 35, 39, 39, 34, 27, 21, 28, 34, 33, 25, 21, 17, 12, 28,
+    34, 34, 29, 22, 17, 13, 28, 34, 38, 30, 25, 20, 16, 29, 34, 40, 33, 29, 24,
+    20, 30, 37, 42, 38, 33, 26, 22, 33, 39, 44, 43, 36, 29, 24, 35, 41, 44, 44,
+    38, 32, 26, 1,  2,  3,  4,  4,  3,  3,  2,  2,  3,  4,  4,  3,  2,  1,  2,
+    3,  3,  3,  2,  1,  2,  0,  2,  2,  2,  2,  3,  3,  3,  3,  3,  3,  3,  3,
+    7,  6,  6,  6,  4,  3,  3,  13, 11, 8,  6,  5,  3,  3,  2,  2,  3,  3,  3,
+    3,  3,  2,  1,  2,  3,  3,  2,  3,  2,  1,  2,  2,  2,  1,  1,  2,  1,  1,
+    2,  1,  1,  3,  4,  4,  4,  4,  4,  3,  3,  9,  8,  8,  7,  5,  3,  3,  16,
+    13, 10, 7,  5,  4,  3,  2,  1,  2,  2,  3,  4,  6,  2,  2,  2,  3,  3,  4,
+    6,  2,  2,  2,  2,  3,  3,  6,  5,  2,  4,  4,  4,  5,  7,  8,  6,  8,  8,
+    8,  7,  6,  13, 11, 12, 11, 10, 9,  7,  19, 16, 15, 13, 11, 10, 9,  2,  6,
+    7,  8,  8,  7,  10, 5,  6,  8,  8,  9,  9,  10, 9,  7,  8,  9,  9,  9,  10,
+    12, 9,  12, 12, 12, 12, 11, 12, 14, 15, 15, 16, 15, 14, 13, 20, 20, 19, 18,
+    16, 15, 18, 26, 24, 21, 19, 18, 18, 13, 14, 15, 15, 16, 15, 10, 14, 16, 15,
+    16, 17, 16, 10, 15, 18, 17, 17, 17, 16, 12, 15, 21, 21, 21, 21, 19, 16, 18,
+    25, 25, 25, 25, 22, 17, 21, 28, 30, 28, 26, 24, 19, 25, 32, 34, 31, 30, 26,
+    21, 24, 24, 25, 25, 21, 17, 13, 23, 27, 26, 25, 23, 18, 14, 23, 29, 28, 27,
+    23, 19, 15, 23, 30, 31, 31, 27, 23, 19, 26, 32, 36, 35, 31, 26, 21, 29, 35,
+    41, 41, 34, 28, 23, 31, 38, 42, 43, 35, 30, 24, 32, 38, 36, 30, 25, 20, 16,
+    31, 38, 39, 32, 26, 21, 17, 31, 38, 41, 33, 27, 23, 19, 32, 37, 44, 36, 31,
+    26, 23, 34, 39, 45, 42, 36, 30, 25, 35, 41, 47, 46, 39, 33, 26, 38, 44, 48,
+    49, 42, 34, 29, 1,  2,  3,  4,  4,  4,  3,  2,  2,  3,  4,  4,  3,  2,  1,
+    2,  2,  3,  3,  1,  1,  2,  2,  0,  2,  2,  2,  3,  4,  3,  3,  3,  3,  3,
+    3,  7,  7,  7,  6,  4,  3,  3,  13, 11, 8,  6,  5,  3,  3,  2,  2,  2,  3,
+    4,  4,  6,  2,  2,  2,  3,  3,  3,  5,  2,  1,  2,  2,  2,  2,  4,  2,  2,
+    2,  1,  1,  2,  5,  5,  5,  4,  4,  4,  3,  5,  10, 9,  8,  7,  6,  4,  5,
+    17, 14, 10, 8,  7,  6,  5,  2,  2,  4,  5,  5,  7,  9,  2,  2,  4,  5,  6,
+    7,  8,  5,  2,  4,  5,  5,  6,  7,  8,  3,  6,  7,  7,  7,  9,  12, 6,  9,
+    10, 11, 10, 9,  15, 11, 13, 14, 13, 12, 9,  19, 17, 16, 16, 14, 13, 12, 4,
+    7,  10, 11, 12, 10, 13, 9,  7,  11, 12, 12, 12, 13, 12, 8,  11, 12, 12, 12,
+    12, 14, 10, 14, 15, 15, 15, 13, 16, 15, 18, 18, 20, 18, 16, 15, 21, 23, 22,
+    21, 20, 19, 19, 27, 26, 24, 22, 21, 20, 15, 17, 18, 19, 19, 18, 13, 17, 18,
+    19, 20, 21, 19, 13, 18, 20, 21, 21, 20, 19, 15, 17, 24, 24, 24, 24, 23, 18,
+    20, 27, 28, 29, 28, 26, 21, 23, 32, 34, 32, 30, 27, 22, 27, 35, 37, 35, 32,
+    29, 23, 26, 29, 28, 28, 25, 21, 17, 27, 31, 30, 30, 26, 21, 17, 27, 33, 33,
+    31, 27, 22, 19, 27, 34, 36, 34, 31, 26, 22, 28, 36, 41, 40, 36, 28, 24, 33,
+    38, 45, 43, 37, 32, 26, 35, 41, 45, 45, 40, 34, 28, 35, 41, 40, 33, 29, 24,
+    20, 35, 42, 43, 35, 29, 25, 20, 36, 41, 45, 37, 31, 26, 22, 36, 41, 47, 40,
+    35, 30, 25, 37, 43, 48, 46, 40, 33, 27, 39, 44, 51, 51, 42, 35, 30, 43, 47,
+    52, 52, 46, 38, 31, 2,  2,  3,  5,  5,  4,  5,  2,  2,  3,  4,  4,  3,  3,
+    2,  2,  3,  3,  2,  1,  3,  2,  2,  2,  0,  2,  1,  3,  4,  4,  3,  3,  3,
+    2,  3,  8,  7,  7,  6,  4,  2,  4,  13, 11, 8,  6,  5,  2,  3,  2,  2,  3,
+    3,  5,  6,  8,  2,  2,  2,  3,  4,  5,  7,  2,  2,  2,  2,  3,  4,  6,  4,
+    2,  2,  2,  3,  4,  6,  8,  5,  5,  5,  6,  4,  7,  11, 9,  9,  8,  8,  7,
+    7,  17, 13, 10, 8,  10, 8,  7,  2,  2,  5,  7,  8,  10, 12, 4,  2,  5,  8,
+    9,  9,  11, 8,  2,  5,  8,  8,  7,  9,  11, 3,  6,  10, 10, 10, 10, 15, 7,
+    9,  13, 14, 13, 11, 18, 12, 13, 16, 15, 15, 11, 19, 17, 16, 17, 17, 16, 15,
+    8,  8,  12, 14, 15, 13, 16, 12, 8,  13, 14, 16, 15, 15, 15, 8,  13, 15, 16,
+    15, 15, 17, 12, 16, 17, 18, 18, 16, 19, 16, 20, 22, 22, 22, 18, 18, 22, 24,
+    25, 24, 23, 22, 19, 26, 27, 26, 26, 24, 24, 17, 19, 21, 21, 23, 22, 16, 20,
+    20, 22, 24, 24, 23, 16, 20, 22, 23, 24, 24, 22, 18, 20, 25, 27, 27, 27, 26,
+    22, 22, 30, 31, 32, 31, 29, 24, 25, 34, 36, 36, 34, 30, 26, 29, 37, 40, 37,
+    36, 33, 27, 28, 32, 32, 31, 29, 25, 20, 28, 34, 33, 33, 29, 25, 21, 28, 36,
+    36, 35, 30, 25, 22, 29, 37, 39, 37, 33, 30, 25, 31, 39, 44, 43, 38, 33, 27,
+    34, 41, 49, 46, 41, 35, 29, 39, 43, 49, 49, 42, 37, 31, 39, 46, 43, 37, 31,
+    27, 23, 39, 45, 46, 39, 33, 28, 23, 39, 46, 49, 41, 34, 29, 25, 39, 45, 50,
+    44, 37, 34, 29, 40, 47, 52, 49, 42, 37, 31, 43, 49, 54, 53, 46, 39, 32, 45,
+    51, 54, 55, 49, 42, 34, 2,  3,  3,  4,  4,  6,  7,  2,  2,  3,  4,  3,  4,
+    5,  2,  2,  3,  2,  2,  2,  4,  3,  2,  2,  2,  0,  2,  5,  5,  4,  4,  3,
+    3,  3,  5,  9,  8,  7,  6,  4,  3,  5,  13, 10, 8,  6,  5,  3,  5,  2,  2,
+    3,  4,  6,  9,  10, 3,  2,  3,  4,  6,  7,  9,  3,  2,  2,  3,  4,  6,  8,
+    6,  3,  2,  2,  5,  5,  8,  10, 5,  5,  5,  8,  6,  8,  13, 9,  8,  8,  10,
+    9,  8,  16, 13, 9,  8,  11, 11, 8,  3,  2,  6,  9,  11, 12, 14, 7,  2,  6,
+    10, 11, 11, 13, 10, 3,  5,  9,  11, 10, 12, 13, 4,  7,  11, 12, 13, 12, 18,
+    9,  10, 14, 16, 15, 13, 21, 12, 13, 17, 18, 17, 12, 20, 16, 15, 18, 19, 19,
+    17, 10, 8,  14, 16, 17, 15, 18, 13, 8,  14, 17, 18, 18, 18, 16, 10, 14, 17,
+    19, 19, 17, 20, 13, 17, 20, 21, 21, 18, 21, 18, 21, 23, 25, 24, 21, 21, 22,
+    25, 26, 27, 25, 24, 20, 26, 27, 28, 28, 27, 26, 19, 20, 23, 25, 26, 25, 19,
+    22, 22, 25, 26, 27, 25, 18, 23, 23, 26, 27, 27, 26, 21, 22, 26, 29, 30, 31,
+    29, 24, 24, 31, 34, 34, 34, 31, 27, 26, 34, 38, 37, 36, 34, 28, 28, 36, 41,
+    38, 38, 35, 30, 31, 35, 35, 35, 31, 28, 23, 31, 37, 36, 36, 33, 28, 24, 30,
+    39, 38, 37, 33, 29, 25, 31, 38, 41, 40, 36, 32, 28, 32, 41, 46, 44, 40, 35,
+    29, 35, 43, 52, 49, 42, 37, 32, 37, 45, 51, 51, 45, 39, 33, 40, 48, 45, 39,
+    34, 31, 26, 42, 48, 48, 41, 36, 30, 26, 42, 48, 50, 43, 37, 32, 28, 41, 48,
+    53, 46, 39, 35, 31, 43, 49, 54, 52, 45, 39, 33, 44, 52, 57, 56, 47, 42, 36,
+    46, 53, 57, 58, 50, 43, 37, 3,  4,  4,  5,  5,  6,  7,  2,  3,  4,  5,  5,
+    4,  5,  2,  3,  4,  3,  3,  2,  3,  2,  2,  2,  2,  2,  0,  3,  3,  2,  2,
+    2,  3,  2,  3,  6,  5,  5,  4,  3,  2,  3,  9,  7,  5,  4,  3,  2,  3,  2,
+    3,  4,  5,  6,  8,  9,  2,  3,  3,  5,  6,  6,  7,  2,  2,  3,  3,  4,  5,
+    6,  4,  2,  1,  1,  3,  3,  5,  8,  3,  3,  4,  5,  3,  5,  10, 6,  6,  5,
+    7,  6,  5,  12, 9,  6,  5,  8,  7,  5,  2,  2,  6,  8,  9,  11, 12, 5,  2,
+    5,  9,  9,  9,  11, 9,  2,  5,  8,  9,  8,  10, 13, 2,  5,  8,  9,  9,  9,
+    15, 6,  8,  11, 12, 12, 9,  16, 8,  10, 13, 14, 13, 9,  15, 12, 11, 15, 15,
+    15, 13, 9,  7,  13, 15, 15, 14, 17, 14, 8,  13, 15, 16, 16, 16, 16, 8,  13,
+    15, 16, 16, 15, 18, 10, 14, 17, 17, 17, 14, 19, 15, 18, 20, 20, 20, 17, 16,
+    18, 21, 22, 22, 22, 20, 15, 21, 22, 24, 24, 23, 22, 17, 19, 22, 23, 24, 23,
+    16, 20, 20, 23, 24, 25, 23, 16, 20, 21, 24, 25, 24, 23, 19, 20, 24, 25, 26,
+    27, 25, 21, 21, 29, 30, 29, 30, 28, 23, 22, 30, 33, 33, 31, 29, 24, 22, 31,
+    36, 35, 33, 31, 26, 28, 32, 32, 32, 30, 26, 21, 28, 34, 34, 34, 30, 25, 21,
+    29, 36, 35, 35, 31, 26, 22, 28, 36, 38, 36, 32, 28, 24, 29, 38, 44, 40, 36,
+    32, 26, 32, 40, 46, 43, 38, 33, 28, 33, 42, 46, 46, 41, 35, 30, 39, 46, 44,
+    37, 32, 28, 24, 40, 45, 46, 40, 33, 29, 24, 40, 46, 48, 40, 33, 29, 24, 40,
+    45, 50, 43, 37, 33, 28, 40, 45, 51, 47, 40, 34, 29, 41, 47, 52, 51, 43, 37,
+    31, 43, 48, 53, 53, 46, 39, 32, 4,  5,  6,  7,  8,  6,  7,  4,  4,  5,  7,
+    7,  5,  4,  3,  4,  4,  5,  6,  3,  2,  3,  3,  3,  3,  5,  3,  0,  2,  1,
+    1,  2,  4,  2,  0,  3,  2,  2,  2,  3,  2,  0,  5,  3,  2,  2,  3,  2,  0,
+    4,  4,  5,  6,  7,  8,  8,  3,  4,  4,  5,  6,  6,  6,  2,  4,  4,  4,  4,
+    4,  4,  2,  2,  2,  2,  2,  2,  3,  2,  1,  1,  2,  2,  1,  3,  4,  3,  2,
+    2,  2,  2,  3,  8,  5,  3,  2,  4,  3,  3,  3,  4,  6,  7,  9,  10, 11, 2,
+    3,  6,  8,  8,  8,  9,  5,  3,  6,  7,  7,  6,  8,  9,  2,  4,  7,  6,  7,
+    6,  12, 3,  5,  7,  8,  8,  6,  13, 4,  6,  9,  9,  9,  6,  11, 8,  6,  9,
+    10, 10, 10, 5,  7,  11, 12, 13, 13, 14, 10, 8,  12, 13, 14, 14, 13, 13, 8,
+    12, 13, 14, 14, 12, 15, 8,  12, 14, 14, 14, 11, 15, 10, 13, 15, 16, 15, 14,
+    13, 12, 15, 17, 17, 17, 16, 11, 15, 17, 18, 19, 18, 18, 15, 17, 20, 20, 21,
+    21, 14, 18, 18, 21, 21, 21, 20, 13, 18, 20, 22, 22, 22, 20, 16, 18, 20, 22,
+    22, 23, 21, 17, 16, 23, 26, 24, 24, 22, 18, 16, 24, 27, 28, 26, 24, 20, 17,
+    25, 30, 28, 28, 26, 21, 27, 29, 30, 29, 26, 23, 18, 27, 32, 31, 31, 27, 22,
+    18, 27, 33, 33, 32, 27, 23, 19, 27, 33, 35, 32, 29, 24, 19, 26, 33, 37, 35,
+    31, 26, 22, 27, 34, 39, 37, 32, 28, 23, 27, 34, 40, 40, 35, 29, 24, 37, 42,
+    41, 34, 29, 25, 21, 37, 42, 43, 35, 30, 25, 21, 37, 43, 44, 36, 31, 27, 22,
+    37, 42, 46, 40, 32, 27, 23, 36, 41, 46, 41, 35, 28, 24, 36, 42, 46, 45, 37,
+    31, 26, 36, 41, 46, 46, 39, 33, 27, 4,  5,  6,  8,  8,  6,  5,  4,  5,  6,
+    7,  8,  6,  4,  3,  4,  5,  6,  7,  4,  3,  3,  3,  4,  4,  4,  3,  2,  0,
+    2,  2,  2,  3,  2,  2,  4,  4,  4,  3,  3,  2,  2,  10, 8,  6,  4,  3,  2,
+    2,  3,  4,  5,  6,  5,  5,  5,  3,  4,  5,  6,  6,  5,  4,  2,  4,  4,  5,
+    4,  4,  3,  2,  2,  3,  3,  3,  2,  1,  2,  2,  2,  2,  2,  2,  1,  6,  5,
+    6,  5,  2,  1,  1,  13, 11, 7,  5,  3,  1,  1,  2,  3,  4,  4,  5,  5,  5,
+    2,  3,  4,  4,  5,  4,  5,  2,  2,  4,  3,  4,  4,  4,  2,  1,  1,  1,  1,
+    1,  2,  3,  3,  2,  2,  3,  1,  2,  9,  8,  7,  6,  4,  3,  2,  15, 14, 10,
+    7,  6,  4,  3,  2,  3,  5,  5,  6,  6,  8,  1,  4,  5,  6,  6,  6,  8,  3,
+    5,  6,  6,  6,  6,  8,  6,  6,  6,  6,  6,  7,  7,  6,  10, 9,  10, 10, 9,
+    8,  9,  15, 14, 13, 12, 11, 10, 15, 21, 18, 15, 14, 12, 12, 11, 11, 11, 12,
+    13, 11, 8,  12, 13, 13, 13, 14, 12, 8,  12, 14, 14, 14, 15, 13, 9,  12, 16,
+    15, 15, 15, 14, 10, 14, 19, 19, 19, 19, 17, 12, 17, 23, 24, 23, 21, 19, 13,
+    21, 26, 28, 25, 23, 21, 15, 20, 22, 21, 22, 19, 14, 10, 20, 24, 23, 24, 20,
+    16, 11, 20, 26, 25, 25, 21, 16, 12, 20, 25, 26, 25, 22, 18, 14, 20, 26, 30,
+    29, 25, 20, 15, 22, 29, 36, 33, 28, 23, 17, 25, 31, 35, 36, 30, 25, 19, 28,
+    35, 32, 26, 22, 17, 13, 28, 35, 36, 29, 24, 18, 14, 28, 34, 38, 30, 25, 19,
+    14, 28, 35, 38, 31, 26, 21, 17, 26, 33, 38, 36, 30, 26, 19, 29, 36, 40, 39,
+    33, 28, 20, 32, 37, 40, 40, 33, 29, 23, 4,  5,  6,  7,  7,  7,  6,  3,  5,
+    6,  7,  7,  6,  5,  3,  4,  5,  6,  6,  4,  3,  3,  3,  3,  4,  4,  2,  1,
+    2,  0,  1,  2,  3,  2,  2,  4,  4,  4,  3,  2,  2,  1,  10, 8,  5,  4,  2,
+    2,  1,  3,  4,  5,  7,  7,  7,  6,  3,  4,  5,  6,  6,  5,  5,  2,  3,  5,
+    5,  5,  4,  3,  2,  2,  2,  2,  2,  2,  0,  2,  2,  1,  2,  1,  1,  0,  7,
+    6,  5,  4,  2,  1,  0,  13, 11, 7,  5,  3,  1,  0,  3,  3,  4,  5,  6,  7,
+    8,  2,  3,  4,  5,  6,  6,  7,  2,  2,  4,  4,  4,  4,  6,  2,  2,  2,  2,
+    3,  3,  5,  5,  3,  5,  5,  5,  4,  5,  10, 8,  9,  8,  7,  6,  5,  15, 13,
+    12, 10, 8,  7,  6,  2,  6,  7,  8,  9,  9,  11, 2,  7,  8,  8,  9,  9,  10,
+    6,  7,  8,  9,  9,  9,  10, 9,  7,  9,  9,  9,  9,  9,  9,  11, 12, 12, 13,
+    12, 11, 10, 17, 17, 16, 14, 13, 13, 16, 23, 20, 18, 16, 15, 14, 13, 14, 14,
+    15, 16, 15, 11, 13, 16, 16, 16, 17, 16, 11, 14, 17, 17, 17, 17, 16, 12, 14,
+    18, 17, 18, 18, 16, 13, 15, 22, 22, 21, 22, 19, 14, 19, 26, 27, 26, 24, 21,
+    16, 23, 30, 31, 28, 26, 23, 18, 23, 25, 24, 24, 22, 17, 13, 23, 27, 26, 25,
+    23, 18, 14, 23, 29, 29, 26, 23, 18, 14, 23, 28, 29, 28, 24, 20, 16, 23, 29,
+    33, 32, 28, 23, 18, 26, 32, 39, 37, 31, 25, 19, 29, 33, 38, 39, 34, 27, 21,
+    31, 37, 37, 29, 24, 20, 16, 32, 38, 39, 31, 26, 21, 17, 31, 37, 41, 33, 27,
+    21, 17, 31, 36, 43, 34, 28, 24, 20, 30, 37, 42, 40, 32, 26, 21, 31, 38, 44,
+    44, 35, 29, 23, 35, 40, 46, 46, 39, 31, 24, 4,  5,  6,  8,  8,  7,  6,  4,
+    5,  6,  7,  7,  6,  5,  3,  4,  5,  6,  6,  4,  3,  3,  3,  3,  3,  4,  2,
+    1,  2,  1,  0,  2,  2,  1,  1,  4,  4,  4,  3,  2,  1,  1,  10, 8,  5,  3,
+    2,  1,  1,  4,  4,  5,  7,  7,  8,  8,  3,  4,  5,  6,  7,  6,  7,  3,  4,
+    5,  5,  5,  4,  5,  2,  2,  2,  2,  2,  2,  3,  2,  2,  2,  2,  1,  0,  3,
+    7,  6,  5,  4,  2,  1,  3,  13, 10, 7,  5,  4,  2,  3,  3,  4,  6,  7,  8,
+    10, 10, 2,  3,  6,  7,  8,  8,  9,  3,  3,  6,  6,  6,  7,  8,  6,  2,  4,
+    5,  5,  6,  7,  8,  4,  6,  7,  7,  7,  7,  12, 8,  10, 10, 9,  8,  7,  15,
+    13, 13, 12, 10, 10, 8,  2,  7,  10, 11, 11, 12, 13, 6,  8,  10, 11, 12, 12,
+    13, 10, 8,  11, 11, 12, 12, 12, 12, 8,  11, 12, 12, 12, 11, 12, 12, 14, 15,
+    16, 14, 14, 12, 18, 20, 19, 17, 17, 15, 15, 23, 22, 21, 19, 18, 16, 14, 17,
+    18, 18, 19, 18, 14, 15, 19, 19, 19, 19, 19, 13, 16, 19, 20, 20, 20, 19, 15,
+    16, 21, 22, 21, 21, 20, 16, 16, 24, 25, 24, 24, 22, 17, 19, 27, 30, 29, 27,
+    24, 19, 24, 32, 34, 31, 29, 26, 20, 26, 29, 28, 28, 25, 21, 16, 26, 31, 29,
+    30, 26, 21, 16, 25, 32, 32, 30, 26, 21, 17, 26, 31, 33, 32, 27, 23, 19, 25,
+    32, 37, 35, 31, 26, 20, 28, 34, 41, 39, 34, 27, 23, 32, 36, 42, 42, 36, 30,
+    24, 35, 41, 39, 33, 28, 24, 19, 35, 41, 42, 35, 29, 24, 19, 35, 42, 45, 36,
+    30, 24, 19, 35, 40, 46, 38, 31, 26, 22, 33, 40, 46, 43, 37, 29, 24, 35, 43,
+    47, 47, 39, 32, 26, 39, 45, 49, 48, 41, 34, 29, 4,  5,  6,  8,  8,  7,  8,
+    4,  5,  6,  7,  7,  6,  6,  3,  5,  6,  6,  5,  4,  4,  3,  3,  3,  3,  3,
+    2,  2,  2,  2,  2,  0,  2,  1,  2,  5,  4,  4,  3,  2,  1,  2,  9,  7,  5,
+    3,  2,  1,  2,  4,  5,  5,  7,  8,  10, 10, 3,  4,  5,  6,  7,  8,  8,  3,
+    4,  5,  5,  5,  6,  6,  3,  2,  3,  3,  3,  4,  5,  4,  2,  2,  2,  3,  3,
+    5,  8,  6,  5,  5,  5,  4,  5,  12, 9,  6,  5,  6,  5,  5,  3,  4,  7,  9,
+    10, 12, 13, 3,  3,  7,  9,  9,  10, 11, 6,  3,  6,  8,  8,  8,  10, 9,  2,
+    5,  7,  8,  8,  9,  11, 4,  7,  10, 10, 10, 9,  14, 8,  10, 12, 12, 11, 9,
+    14, 11, 11, 14, 13, 12, 11, 6,  8,  12, 13, 14, 14, 16, 10, 9,  13, 14, 15,
+    15, 16, 13, 9,  13, 14, 15, 15, 15, 15, 9,  13, 15, 15, 16, 14, 15, 13, 16,
+    18, 18, 18, 17, 14, 18, 21, 21, 20, 19, 18, 14, 21, 23, 23, 22, 21, 20, 16,
+    19, 20, 21, 22, 22, 16, 18, 20, 22, 23, 23, 22, 16, 18, 21, 23, 23, 24, 22,
+    18, 18, 23, 24, 24, 25, 23, 19, 18, 27, 28, 27, 27, 25, 20, 21, 30, 33, 31,
+    30, 27, 22, 24, 31, 35, 33, 32, 29, 23, 27, 32, 31, 31, 28, 24, 20, 28, 34,
+    32, 33, 29, 24, 20, 27, 35, 36, 34, 29, 25, 20, 28, 35, 37, 36, 31, 27, 22,
+    27, 34, 40, 39, 35, 29, 23, 31, 38, 44, 43, 37, 31, 25, 34, 39, 45, 46, 40,
+    33, 27, 38, 45, 43, 37, 31, 26, 22, 39, 44, 46, 39, 33, 27, 23, 39, 45, 47,
+    40, 33, 28, 23, 39, 45, 49, 41, 35, 30, 26, 37, 43, 49, 46, 39, 33, 27, 38,
+    45, 51, 50, 43, 35, 29, 41, 46, 51, 51, 44, 38, 31, 5,  5,  6,  7,  7,  9,
+    10, 5,  5,  6,  7,  7,  7,  8,  4,  5,  6,  5,  5,  5,  6,  4,  3,  3,  3,
+    3,  3,  4,  3,  3,  2,  2,  0,  1,  4,  4,  3,  3,  2,  1,  1,  4,  6,  5,
+    3,  2,  2,  2,  4,  4,  5,  6,  7,  9,  11, 12, 4,  5,  5,  7,  9,  10, 10,
+    4,  4,  5,  5,  7,  8,  9,  5,  3,  3,  3,  5,  6,  7,  6,  3,  2,  3,  6,
+    5,  7,  8,  4,  4,  4,  7,  7,  7,  10, 7,  4,  4,  8,  8,  7,  3,  5,  8,
+    11, 12, 14, 15, 5,  4,  7,  11, 12, 12, 14, 8,  4,  7,  10, 11, 11, 13, 12,
+    3,  5,  10, 11, 12, 11, 13, 4,  7,  12, 13, 13, 12, 14, 6,  8,  12, 14, 14,
+    12, 14, 9,  9,  13, 16, 16, 15, 8,  9,  14, 17, 18, 17, 20, 12, 10, 15, 17,
+    19, 19, 19, 15, 10, 16, 18, 19, 19, 18, 17, 10, 15, 18, 18, 19, 17, 16, 14,
+    17, 20, 21, 21, 20, 15, 16, 20, 22, 23, 23, 22, 14, 18, 21, 23, 24, 24, 24,
+    19, 21, 24, 25, 26, 26, 19, 21, 22, 25, 26, 28, 26, 19, 21, 24, 26, 28, 27,
+    25, 21, 21, 25, 26, 27, 28, 27, 22, 20, 28, 30, 30, 31, 29, 24, 21, 29, 34,
+    33, 32, 30, 25, 21, 30, 37, 35, 34, 33, 27, 30, 34, 35, 34, 32, 28, 24, 30,
+    37, 37, 37, 33, 28, 24, 30, 39, 39, 37, 33, 29, 25, 31, 38, 40, 39, 35, 30,
+    25, 30, 39, 43, 41, 36, 32, 27, 31, 40, 47, 44, 39, 33, 29, 32, 41, 45, 47,
+    41, 36, 31, 42, 48, 47, 40, 35, 31, 26, 43, 49, 49, 42, 36, 32, 27, 42, 48,
+    51, 44, 37, 32, 27, 43, 48, 53, 44, 39, 33, 29, 41, 47, 53, 49, 41, 35, 31,
+    42, 48, 52, 50, 44, 38, 32, 43, 48, 53, 53, 46, 40, 33, 4,  5,  5,  6,  6,
+    8,  8,  4,  5,  5,  6,  6,  6,  6,  3,  4,  5,  4,  4,  4,  4,  3,  3,  3,
+    2,  3,  2,  3,  2,  2,  1,  1,  1,  0,  2,  3,  2,  2,  2,  1,  0,  2,  5,
+    3,  2,  1,  1,  0,  2,  4,  4,  5,  6,  8,  10, 10, 3,  4,  5,  6,  7,  8,
+    9,  3,  3,  4,  4,  5,  6,  7,  4,  2,  2,  2,  3,  4,  5,  6,  2,  2,  2,
+    4,  3,  5,  7,  3,  2,  2,  5,  5,  5,  9,  5,  3,  2,  6,  6,  5,  3,  4,
+    7,  9,  11, 12, 14, 5,  3,  7,  10, 10, 10, 12, 9,  3,  6,  9,  9,  9,  10,
+    13, 2,  5,  8,  9,  10, 9,  13, 3,  5,  9,  10, 11, 9,  16, 5,  6,  10, 12,
+    12, 9,  14, 8,  7,  11, 13, 13, 13, 9,  8,  13, 15, 16, 15, 17, 13, 8,  13,
+    16, 16, 17, 17, 16, 8,  13, 16, 17, 16, 16, 18, 9,  14, 16, 17, 17, 14, 18,
+    12, 15, 18, 19, 18, 17, 15, 13, 17, 19, 20, 20, 20, 14, 16, 19, 21, 21, 21,
+    21, 16, 19, 22, 23, 24, 24, 18, 20, 20, 22, 24, 25, 23, 17, 20, 21, 25, 25,
+    25, 24, 19, 20, 24, 25, 26, 26, 24, 20, 18, 25, 27, 28, 28, 25, 21, 18, 26,
+    30, 30, 29, 27, 23, 18, 27, 32, 32, 31, 30, 25, 29, 33, 33, 32, 30, 26, 21,
+    28, 35, 34, 34, 31, 26, 21, 29, 38, 37, 35, 31, 27, 22, 28, 36, 38, 37, 32,
+    28, 23, 28, 36, 41, 39, 34, 29, 25, 29, 36, 42, 42, 35, 30, 26, 30, 37, 43,
+    43, 38, 33, 27, 40, 47, 45, 37, 33, 28, 24, 40, 45, 46, 40, 34, 29, 25, 41,
+    46, 49, 41, 34, 29, 25, 40, 45, 50, 42, 36, 31, 26, 39, 44, 49, 46, 38, 33,
+    28, 39, 45, 50, 47, 40, 34, 30, 39, 46, 50, 49, 43, 36, 30, 4,  5,  6,  8,
+    8,  6,  6,  4,  4,  5,  7,  7,  5,  4,  3,  4,  5,  5,  6,  4,  2,  3,  3,
+    3,  3,  5,  3,  0,  2,  1,  1,  2,  4,  2,  0,  2,  2,  2,  2,  3,  2,  0,
+    4,  3,  2,  2,  3,  2,  0,  4,  4,  5,  6,  6,  8,  8,  3,  4,  5,  5,  6,
+    6,  6,  3,  4,  4,  4,  4,  4,  5,  2,  2,  2,  2,  2,  2,  3,  2,  2,  1,
+    1,  1,  1,  3,  4,  2,  2,  2,  2,  2,  3,  7,  5,  2,  2,  3,  3,  3,  3,
+    4,  6,  8,  9,  10, 11, 2,  3,  6,  8,  8,  8,  9,  5,  3,  6,  7,  7,  7,
+    8,  9,  2,  4,  7,  6,  7,  6,  11, 2,  4,  7,  8,  8,  6,  13, 4,  5,  8,
+    9,  9,  6,  10, 8,  6,  9,  10, 10, 10, 5,  7,  11, 12, 13, 13, 14, 10, 7,
+    11, 13, 14, 14, 13, 13, 8,  12, 13, 14, 13, 12, 15, 7,  12, 14, 14, 14, 11,
+    16, 10, 13, 15, 15, 15, 14, 12, 12, 15, 16, 17, 17, 16, 10, 15, 17, 18, 18,
+    18, 18, 15, 17, 20, 20, 21, 20, 14, 18, 18, 21, 21, 22, 20, 13, 18, 19, 21,
+    22, 22, 20, 17, 17, 21, 23, 23, 23, 21, 16, 16, 22, 25, 25, 25, 23, 18, 16,
+    24, 27, 27, 25, 24, 20, 17, 25, 30, 28, 28, 26, 21, 25, 29, 30, 30, 26, 23,
+    18, 27, 32, 32, 30, 27, 23, 18, 27, 34, 34, 33, 28, 23, 19, 27, 33, 34, 32,
+    29, 25, 20, 26, 33, 37, 34, 30, 26, 21, 27, 33, 41, 38, 32, 28, 23, 27, 34,
+    39, 41, 35, 29, 24, 36, 42, 39, 34, 29, 25, 21, 37, 43, 42, 36, 31, 26, 22,
+    37, 43, 45, 38, 31, 26, 22, 38, 42, 47, 39, 32, 28, 23, 37, 40, 45, 42, 34,
+    29, 24, 35, 41, 46, 44, 36, 30, 26, 36, 42, 46, 45, 40, 33, 27, 8,  9,  10,
+    12, 12, 11, 10, 8,  9,  10, 12, 12, 10, 9,  7,  8,  9,  10, 11, 8,  7,  7,
+    7,  7,  8,  8,  6,  3,  4,  4,  4,  5,  4,  3,  2,  0,  2,  2,  2,  3,  3,
+    2,  6,  5,  2,  2,  2,  3,  2,  7,  8,  10, 11, 11, 11, 10, 7,  8,  9,  10,
+    10, 10, 9,  6,  7,  9,  9,  9,  8,  7,  6,  6,  6,  7,  6,  5,  2,  3,  3,
+    3,  3,  3,  2,  2,  2,  2,  2,  2,  2,  2,  2,  9,  7,  4,  2,  1,  2,  2,
+    6,  8,  9,  9,  10, 11, 10, 6,  7,  8,  9,  9,  9,  9,  5,  6,  7,  7,  8,
+    8,  7,  5,  5,  5,  5,  5,  5,  3,  2,  1,  1,  2,  2,  2,  3,  5,  4,  3,
+    2,  0,  2,  3,  11, 10, 6,  4,  2,  2,  3,  6,  7,  8,  9,  11, 12, 11, 5,
+    7,  8,  10, 10, 10, 10, 4,  7,  8,  8,  8,  9,  8,  5,  6,  5,  6,  6,  6,
+    6,  3,  6,  6,  6,  7,  7,  7,  5,  11, 10, 9,  8,  8,  8,  11, 16, 13, 12,
+    10, 9,  10, 9,  10, 11, 11, 12, 12, 12, 11, 12, 12, 12, 13, 12, 10, 11, 13,
+    14, 13, 13, 12, 8,  11, 15, 14, 14, 14, 13, 9,  11, 16, 16, 15, 15, 15, 10,
+    12, 18, 21, 20, 18, 16, 11, 17, 21, 24, 21, 20, 18, 13, 18, 20, 20, 21, 18,
+    14, 11, 19, 23, 23, 22, 19, 14, 10, 19, 24, 25, 24, 20, 15, 10, 18, 24, 25,
+    26, 22, 16, 11, 18, 24, 27, 27, 23, 17, 13, 19, 24, 30, 29, 24, 20, 15, 21,
+    27, 31, 31, 27, 21, 16, 27, 33, 33, 26, 21, 16, 12, 27, 33, 35, 27, 22, 17,
+    13, 27, 33, 36, 29, 23, 18, 13, 28, 33, 37, 30, 25, 19, 15, 26, 33, 36, 33,
+    26, 22, 16, 27, 32, 35, 34, 28, 23, 19, 28, 31, 36, 36, 31, 25, 20, 8,  9,
+    10, 11, 11, 11, 10, 7,  8,  10, 11, 11, 10, 8,  7,  8,  9,  10, 9,  8,  6,
+    6,  6,  7,  7,  7,  5,  2,  4,  4,  4,  4,  4,  2,  2,  2,  0,  2,  2,  2,
+    2,  2,  6,  4,  2,  2,  2,  2,  2,  7,  8,  9,  11, 11, 11, 11, 6,  8,  9,
+    10, 11, 9,  9,  6,  7,  8,  9,  8,  7,  6,  6,  5,  6,  6,  6,  5,  2,  3,
+    3,  3,  3,  2,  2,  2,  3,  2,  2,  2,  1,  2,  2,  9,  7,  3,  2,  1,  2,
+    2,  6,  7,  8,  9,  11, 11, 12, 6,  6,  8,  9,  10, 10, 10, 6,  6,  8,  8,
+    8,  8,  8,  5,  5,  6,  6,  5,  5,  5,  3,  2,  3,  3,  3,  3,  4,  5,  5,
+    5,  4,  3,  4,  5,  11, 9,  8,  6,  5,  5,  5,  6,  9,  9,  11, 12, 14, 13,
+    5,  8,  10, 11, 12, 12, 11, 5,  8,  9,  9,  9,  10, 9,  8,  7,  8,  8,  8,
+    9,  8,  6,  8,  9,  9,  10, 10, 10, 6,  13, 13, 12, 11, 11, 11, 11, 18, 16,
+    14, 12, 12, 13, 12, 13, 14, 14, 15, 15, 13, 12, 15, 15, 16, 16, 14, 11, 13,
+    16, 17, 16, 16, 15, 11, 13, 17, 17, 16, 17, 16, 12, 12, 19, 19, 18, 18, 17,
+    13, 14, 22, 23, 21, 20, 18, 14, 19, 24, 26, 24, 22, 20, 16, 22, 24, 24, 24,
+    21, 17, 13, 22, 26, 25, 25, 22, 17, 12, 22, 28, 28, 27, 22, 17, 13, 22, 27,
+    29, 27, 24, 19, 14, 22, 27, 30, 30, 25, 20, 16, 21, 28, 34, 33, 27, 21, 17,
+    25, 30, 34, 35, 30, 24, 18, 31, 37, 36, 29, 23, 19, 15, 30, 36, 39, 32, 25,
+    20, 16, 30, 37, 40, 32, 26, 21, 17, 31, 35, 41, 33, 27, 22, 17, 29, 35, 41,
+    36, 29, 23, 19, 29, 35, 41, 38, 32, 26, 20, 30, 37, 40, 42, 34, 27, 22, 8,
+    9,  10, 12, 11, 11, 10, 7,  8,  10, 11, 11, 9,  8,  7,  8,  9,  9,  9,  7,
+    6,  6,  6,  7,  7,  7,  5,  2,  4,  4,  3,  4,  3,  2,  2,  2,  2,  0,  2,
+    2,  2,  2,  5,  3,  2,  1,  2,  2,  2,  7,  8,  9,  10, 11, 11, 12, 7,  8,
+    9,  10, 11, 10, 10, 6,  7,  8,  8,  8,  7,  7,  6,  6,  6,  6,  5,  4,  4,
+    3,  3,  3,  3,  2,  2,  4,  3,  2,  2,  1,  2,  2,  3,  7,  5,  3,  1,  1,
+    2,  3,  6,  7,  9,  11, 12, 14, 14, 6,  7,  10, 11, 12, 12, 12, 6,  7,  9,
+    10, 9,  9,  9,  5,  5,  7,  7,  7,  7,  6,  6,  2,  4,  5,  5,  5,  6,  8,
+    4,  7,  7,  6,  6,  6,  8,  7,  8,  9,  7,  7,  8,  6,  10, 11, 12, 14, 15,
+    15, 5,  9,  11, 12, 13, 13, 13, 8,  9,  11, 11, 12, 11, 11, 10, 8,  11, 11,
+    11, 12, 10, 9,  9,  11, 12, 12, 12, 13, 8,  13, 15, 15, 14, 14, 14, 8,  16,
+    17, 16, 15, 15, 15, 13, 16, 17, 17, 18, 18, 15, 15, 17, 18, 18, 19, 17, 13,
+    15, 18, 20, 19, 19, 18, 14, 15, 20, 20, 20, 20, 19, 14, 13, 22, 22, 21, 21,
+    20, 15, 16, 24, 26, 24, 23, 21, 17, 18, 25, 28, 27, 25, 23, 19, 24, 27, 27,
+    27, 24, 20, 16, 26, 29, 29, 29, 25, 21, 16, 25, 31, 31, 30, 25, 21, 17, 24,
+    31, 32, 30, 26, 22, 17, 24, 30, 34, 32, 28, 23, 18, 24, 31, 36, 36, 30, 24,
+    20, 27, 33, 38, 39, 33, 27, 21, 35, 39, 39, 32, 27, 22, 18, 34, 41, 42, 34,
+    28, 23, 19, 35, 41, 44, 36, 29, 24, 19, 34, 40, 44, 37, 30, 25, 21, 33, 39,
+    44, 39, 32, 26, 22, 32, 39, 43, 43, 34, 29, 23, 34, 40, 45, 45, 39, 30, 25,
+    7,  8,  9,  10, 10, 10, 11, 7,  7,  8,  10, 10, 9,  8,  6,  7,  8,  9,  8,
+    7,  6,  6,  6,  6,  6,  6,  4,  3,  3,  3,  3,  3,  2,  1,  2,  2,  2,  2,
+    0,  2,  2,  2,  4,  3,  2,  1,  1,  1,  2,  7,  7,  8,  9,  10, 12, 13, 6,
+    7,  8,  9,  10, 10, 11, 6,  7,  7,  7,  8,  8,  8,  5,  5,  5,  5,  5,  5,
+    5,  3,  2,  2,  2,  2,  3,  5,  3,  2,  2,  2,  2,  3,  4,  6,  4,  2,  2,
+    3,  3,  4,  6,  7,  10, 11, 13, 14, 15, 5,  6,  9,  12, 12, 12, 12, 4,  6,
+    9,  10, 10, 10, 10, 8,  4,  6,  8,  8,  8,  8,  10, 2,  4,  7,  8,  8,  8,
+    11, 3,  5,  8,  9,  9,  8,  10, 7,  6,  10, 10, 10, 11, 5,  10, 13, 13, 15,
+    15, 17, 8,  9,  12, 14, 14, 14, 15, 11, 9,  13, 13, 14, 14, 14, 13, 8,  13,
+    14, 14, 15, 13, 13, 10, 14, 15, 16, 16, 16, 11, 12, 16, 16, 17, 16, 17, 10,
+    15, 17, 18, 18, 18, 18, 15, 18, 20, 20, 22, 21, 17, 17, 20, 22, 22, 22, 21,
+    15, 17, 20, 23, 22, 22, 22, 17, 17, 22, 23, 23, 23, 22, 17, 16, 24, 25, 25,
+    25, 23, 19, 16, 25, 28, 27, 26, 24, 20, 17, 26, 30, 28, 29, 26, 22, 27, 31,
+    31, 31, 27, 24, 19, 27, 32, 33, 33, 28, 24, 19, 27, 35, 35, 34, 29, 24, 20,
+    27, 33, 35, 34, 29, 25, 21, 26, 33, 38, 36, 31, 26, 22, 27, 32, 39, 39, 33,
+    27, 23, 28, 34, 39, 40, 35, 30, 25, 38, 44, 42, 36, 31, 26, 21, 38, 45, 45,
+    38, 31, 27, 22, 37, 44, 47, 39, 32, 27, 22, 38, 43, 48, 40, 34, 28, 23, 37,
+    42, 48, 43, 35, 30, 25, 36, 43, 47, 45, 37, 32, 27, 37, 42, 47, 47, 41, 33,
+    28, 6,  6,  7,  8,  8,  9,  10, 5,  6,  7,  8,  8,  8,  8,  5,  6,  6,  6,
+    6,  6,  6,  4,  4,  4,  4,  4,  3,  3,  2,  2,  2,  2,  1,  1,  3,  3,  2,
+    2,  2,  0,  1,  3,  5,  4,  2,  2,  1,  1,  3,  5,  6,  7,  8,  10, 12, 13,
+    5,  5,  6,  8,  10, 10, 10, 4,  5,  6,  6,  7,  8,  8,  4,  3,  3,  4,  5,
+    6,  7,  5,  3,  2,  2,  4,  4,  7,  6,  3,  3,  2,  5,  5,  7,  8,  5,  3,
+    3,  6,  6,  7,  4,  5,  8,  11, 13, 14, 15, 4,  4,  8,  11, 12, 12, 14, 8,
+    4,  8,  10, 10, 11, 12, 11, 3,  5,  9,  10, 11, 11, 12, 3,  5,  10, 11, 12,
+    11, 13, 4,  7,  11, 13, 13, 11, 12, 8,  7,  12, 13, 14, 14, 8,  9,  14, 16,
+    17, 17, 19, 11, 9,  14, 17, 18, 17, 18, 14, 9,  15, 17, 18, 18, 17, 16, 10,
+    14, 17, 18, 19, 16, 16, 12, 16, 18, 20, 19, 19, 14, 14, 18, 20, 21, 21, 21,
+    12, 16, 20, 22, 22, 22, 22, 17, 21, 23, 24, 25, 25, 19, 20, 21, 24, 25, 26,
+    25, 18, 20, 22, 26, 26, 27, 25, 21, 20, 25, 26, 27, 27, 26, 21, 18, 26, 28,
+    29, 29, 27, 22, 18, 27, 31, 32, 30, 29, 24, 19, 29, 33, 33, 33, 30, 25, 30,
+    33, 34, 34, 31, 27, 23, 30, 37, 36, 35, 32, 27, 23, 30, 38, 38, 37, 33, 28,
+    23, 30, 38, 39, 37, 33, 29, 24, 28, 37, 42, 39, 35, 30, 25, 30, 37, 44, 42,
+    36, 32, 27, 31, 38, 43, 44, 38, 33, 29, 42, 48, 45, 40, 34, 30, 26, 41, 48,
+    48, 41, 35, 30, 26, 42, 47, 50, 42, 36, 31, 27, 41, 47, 51, 44, 37, 32, 27,
+    40, 45, 51, 46, 39, 34, 29, 40, 46, 50, 49, 42, 36, 30, 40, 46, 51, 51, 44,
+    37, 32, 4,  5,  5,  6,  6,  8,  8,  4,  5,  5,  6,  6,  6,  6,  3,  4,  5,
+    4,  4,  4,  4,  3,  3,  3,  2,  3,  2,  2,  2,  2,  1,  1,  2,  0,  2,  3,
+    2,  2,  1,  2,  0,  2,  5,  3,  2,  1,  1,  0,  2,  4,  4,  5,  6,  8,  9,
+    10, 3,  4,  5,  6,  8,  8,  8,  3,  4,  4,  4,  6,  6,  7,  4,  2,  2,  2,
+    4,  4,  5,  6,  2,  2,  2,  4,  3,  5,  7,  3,  2,  2,  5,  5,  5,  9,  5,
+    3,  2,  6,  6,  5,  3,  4,  7,  9,  10, 12, 14, 5,  3,  7,  10, 10, 10, 12,
+    9,  3,  6,  8,  9,  9,  10, 13, 2,  5,  8,  9,  10, 9,  13, 3,  5,  9,  11,
+    11, 9,  17, 5,  6,  10, 11, 12, 9,  14, 9,  7,  11, 13, 13, 13, 9,  8,  13,
+    15, 15, 15, 17, 15, 8,  13, 16, 17, 17, 16, 16, 8,  14, 15, 16, 17, 16, 19,
+    9,  13, 17, 17, 17, 14, 18, 12, 15, 18, 18, 19, 17, 15, 13, 17, 19, 20, 20,
+    20, 15, 16, 19, 21, 21, 21, 22, 17, 19, 22, 23, 25, 23, 18, 20, 20, 23, 24,
+    26, 23, 17, 20, 21, 25, 25, 26, 24, 19, 20, 23, 25, 25, 26, 24, 20, 19, 25,
+    27, 28, 28, 26, 22, 18, 26, 30, 30, 29, 27, 23, 19, 27, 32, 32, 31, 28, 25,
+    28, 32, 32, 33, 30, 26, 21, 29, 35, 35, 34, 31, 26, 22, 29, 37, 36, 36, 31,
+    26, 22, 28, 36, 39, 37, 33, 28, 23, 29, 35, 40, 40, 33, 29, 24, 28, 36, 42,
+    41, 36, 30, 26, 30, 37, 43, 44, 38, 33, 28, 40, 46, 44, 38, 32, 29, 25, 40,
+    46, 47, 39, 33, 29, 24, 42, 45, 49, 41, 35, 30, 25, 39, 46, 50, 42, 36, 30,
+    26, 39, 44, 49, 46, 39, 32, 28, 39, 45, 50, 48, 40, 34, 29, 39, 45, 50, 50,
+    43, 37, 31, 4,  5,  6,  7,  7,  6,  6,  4,  4,  5,  7,  7,  5,  4,  3,  4,
+    5,  5,  6,  4,  2,  3,  3,  3,  3,  5,  3,  0,  2,  1,  1,  2,  4,  2,  0,
+    2,  2,  2,  2,  3,  2,  0,  4,  3,  2,  2,  3,  2,  0,  4,  4,  5,  6,  7,
+    8,  8,  3,  4,  4,  5,  6,  6,  7,  3,  4,  4,  4,  4,  4,  4,  2,  2,  2,
+    2,  2,  2,  3,  2,  2,  1,  1,  1,  1,  3,  4,  2,  2,  2,  2,  2,  3,  7,
+    5,  2,  2,  4,  3,  3,  3,  4,  6,  8,  9,  10, 11, 2,  3,  7,  8,  8,  8,
+    9,  5,  3,  6,  7,  6,  6,  8,  9,  2,  4,  7,  6,  6,  6,  11, 2,  4,  7,
+    8,  8,  6,  12, 4,  5,  8,  9,  9,  6,  10, 8,  6,  9,  10, 10, 10, 5,  7,
+    11, 13, 13, 13, 14, 10, 7,  11, 13, 14, 14, 13, 13, 8,  12, 13, 14, 13, 12,
+    15, 8,  12, 14, 14, 14, 11, 15, 10, 13, 15, 15, 15, 14, 13, 12, 15, 16, 17,
+    16, 17, 10, 15, 17, 18, 18, 18, 18, 15, 17, 19, 20, 21, 20, 15, 18, 19, 20,
+    21, 22, 21, 13, 18, 20, 22, 22, 22, 20, 16, 18, 22, 22, 22, 23, 22, 17, 16,
+    23, 24, 24, 25, 23, 18, 16, 24, 27, 27, 26, 23, 20, 17, 25, 30, 28, 28, 25,
+    21, 27, 30, 29, 30, 27, 23, 19, 27, 32, 32, 31, 27, 23, 18, 26, 34, 34, 32,
+    27, 23, 19, 27, 33, 34, 33, 29, 24, 19, 25, 33, 37, 35, 31, 26, 21, 27, 33,
+    40, 38, 32, 26, 22, 27, 34, 40, 40, 34, 29, 24, 37, 43, 40, 34, 29, 26, 21,
+    37, 42, 44, 36, 31, 25, 22, 36, 41, 46, 37, 30, 26, 22, 37, 42, 47, 39, 32,
+    28, 23, 36, 41, 46, 42, 36, 29, 24, 36, 40, 45, 44, 36, 31, 25, 35, 41, 45,
+    46, 40, 33, 28, 14, 15, 16, 18, 18, 17, 16, 13, 15, 16, 18, 17, 16, 14, 13,
+    14, 16, 16, 16, 13, 11, 12, 13, 13, 13, 13, 9,  5,  10, 10, 10, 9,  6,  5,
+    5,  6,  6,  5,  4,  5,  5,  4,  0,  2,  2,  3,  4,  5,  4,  13, 14, 16, 17,
+    17, 17, 16, 12, 14, 15, 16, 17, 16, 14, 12, 13, 15, 15, 14, 13, 11, 11, 12,
+    12, 12, 11, 9,  4,  9,  8,  8,  8,  5,  4,  4,  5,  4,  4,  3,  3,  4,  4,
+    3,  2,  2,  2,  3,  4,  4,  12, 13, 15, 16, 17, 17, 17, 11, 13, 14, 15, 16,
+    15, 15, 12, 12, 13, 13, 13, 12, 11, 11, 11, 10, 10, 10, 8,  4,  7,  7,  7,
+    7,  3,  4,  4,  2,  2,  2,  2,  3,  3,  4,  5,  4,  1,  2,  3,  4,  5,  11,
+    13, 14, 16, 17, 18, 18, 11, 13, 14, 16, 17, 16, 16, 10, 13, 14, 14, 14, 14,
+    12, 7,  12, 11, 11, 11, 9,  9,  4,  8,  7,  7,  5,  5,  6,  3,  6,  6,  6,
+    7,  6,  7,  5,  11, 8,  8,  8,  8,  8,  12, 12, 14, 15, 17, 18, 19, 10, 12,
+    14, 15, 16, 16, 16, 10, 12, 13, 13, 13, 13, 12, 10, 12, 12, 12, 12, 10, 7,
+    8,  13, 13, 13, 14, 13, 8,  8,  14, 16, 16, 16, 15, 10, 11, 17, 19, 18, 18,
+    17, 11, 16, 18, 18, 19, 16, 17, 18, 16, 20, 20, 21, 17, 15, 15, 16, 22, 22,
+    21, 17, 12, 11, 16, 21, 23, 23, 19, 14, 10, 15, 20, 25, 24, 20, 17, 11, 15,
+    22, 27, 25, 23, 18, 13, 17, 23, 27, 28, 24, 20, 15, 25, 31, 30, 24, 18, 16,
+    17, 25, 31, 32, 26, 20, 15, 14, 25, 31, 33, 27, 21, 16, 11, 25, 30, 35, 28,
+    23, 18, 13, 24, 30, 32, 28, 24, 21, 15, 24, 28, 31, 30, 25, 21, 17, 24, 28,
+    31, 31, 27, 23, 19, 12, 13, 15, 16, 16, 16, 15, 12, 13, 14, 15, 15, 14, 12,
+    11, 12, 14, 14, 13, 11, 9,  11, 11, 11, 11, 10, 7,  3,  8,  8,  8,  7,  5,
+    3,  3,  5,  4,  3,  3,  3,  3,  3,  2,  0,  2,  2,  3,  3,  3,  11, 12, 14,
+    15, 16, 16, 15, 11, 12, 13, 15, 15, 14, 12, 11, 12, 13, 13, 12, 11, 9,  11,
+    10, 10, 10, 9,  7,  3,  8,  7,  7,  7,  3,  3,  3,  4,  3,  3,  2,  2,  3,
+    3,  3,  2,  2,  2,  2,  2,  3,  10, 12, 13, 14, 15, 16, 17, 10, 11, 13, 14,
+    14, 14, 14, 11, 11, 12, 12, 12, 11, 10, 10, 10, 10, 10, 9,  7,  5,  5,  6,
+    7,  6,  4,  4,  5,  3,  2,  3,  3,  3,  4,  5,  3,  2,  3,  3,  3,  4,  4,
+    11, 13, 14, 15, 17, 18, 18, 9,  13, 14, 15, 16, 16, 15, 7,  13, 14, 13, 13,
+    13, 11, 8,  11, 11, 11, 10, 9,  9,  6,  7,  8,  8,  8,  8,  8,  3,  8,  9,
+    9,  9,  9,  10, 3,  11, 11, 11, 10, 11, 11, 12, 13, 14, 15, 17, 18, 17, 11,
+    13, 14, 15, 16, 16, 15, 11, 14, 15, 15, 15, 14, 11, 11, 15, 15, 15, 15, 14,
+    10, 10, 17, 17, 16, 17, 15, 12, 11, 17, 20, 19, 18, 17, 13, 13, 18, 22, 20,
+    21, 19, 14, 20, 22, 22, 22, 19, 18, 17, 20, 24, 23, 24, 20, 16, 15, 20, 26,
+    26, 25, 20, 16, 12, 20, 26, 27, 25, 22, 17, 13, 19, 24, 28, 28, 24, 19, 14,
+    19, 25, 31, 30, 25, 20, 16, 20, 25, 31, 33, 27, 22, 17, 28, 34, 33, 27, 22,
+    18, 17, 29, 36, 36, 29, 23, 18, 14, 28, 35, 39, 30, 25, 19, 14, 29, 34, 39,
+    31, 25, 20, 16, 27, 33, 38, 34, 28, 22, 18, 28, 33, 37, 36, 30, 25, 19, 27,
+    34, 38, 39, 33, 26, 21, 9,  11, 12, 13, 13, 13, 12, 9,  10, 11, 13, 12, 11,
+    9,  9,  9,  11, 11, 10, 9,  7,  8,  8,  8,  8,  8,  5,  2,  6,  6,  5,  5,
+    3,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  2,  2,  2,  2,  9,  9,
+    11, 12, 12, 13, 13, 9,  9,  10, 12, 12, 11, 11, 8,  9,  10, 10, 9,  9,  8,
+    8,  7,  7,  7,  7,  5,  3,  5,  5,  4,  4,  2,  2,  3,  2,  2,  1,  1,  2,
+    2,  3,  4,  2,  2,  1,  2,  2,  3,  8,  9,  11, 12, 13, 15, 15, 8,  8,  11,
+    12, 13, 13, 13, 8,  8,  11, 11, 10, 10, 10, 6,  7,  8,  8,  8,  7,  6,  5,
+    3,  5,  6,  4,  5,  6,  6,  2,  4,  5,  5,  5,  6,  5,  4,  5,  6,  6,  6,
+    7,  8,  11, 12, 13, 15, 16, 16, 5,  11, 12, 14, 14, 14, 14, 7,  11, 12, 12,
+    12, 12, 11, 10, 9,  10, 10, 10, 10, 10, 8,  7,  10, 11, 11, 12, 12, 6,  10,
+    13, 12, 13, 13, 13, 5,  13, 14, 14, 14, 14, 15, 12, 15, 16, 16, 17, 18, 16,
+    14, 16, 17, 18, 18, 17, 14, 13, 18, 19, 19, 19, 17, 13, 13, 19, 18, 19, 18,
+    18, 14, 13, 20, 20, 20, 20, 19, 15, 13, 21, 22, 22, 22, 20, 16, 16, 22, 26,
+    24, 24, 22, 18, 23, 26, 25, 25, 23, 19, 16, 24, 28, 28, 28, 24, 19, 15, 24,
+    30, 30, 29, 24, 20, 15, 23, 29, 30, 29, 25, 21, 16, 23, 29, 33, 31, 27, 22,
+    17, 24, 29, 35, 34, 29, 23, 19, 23, 29, 34, 36, 32, 26, 21, 33, 39, 38, 31,
+    25, 21, 18, 33, 40, 41, 33, 27, 22, 18, 33, 39, 43, 35, 29, 22, 18, 33, 39,
+    44, 36, 29, 24, 19, 32, 37, 43, 38, 30, 25, 20, 31, 36, 43, 41, 33, 27, 22,
+    31, 37, 43, 42, 36, 30, 24, 7,  8,  10, 11, 11, 11, 11, 7,  8,  9,  11, 10,
+    9,  8,  7,  8,  9,  9,  8,  7,  6,  6,  6,  6,  6,  6,  4,  2,  4,  3,  3,
+    3,  2,  2,  2,  2,  2,  1,  1,  2,  1,  2,  3,  2,  1,  0,  2,  1,  2,  7,
+    8,  8,  10, 11, 12, 13, 7,  7,  8,  9,  10, 10, 10, 6,  7,  8,  8,  8,  8,
+    8,  6,  6,  5,  5,  5,  5,  4,  3,  3,  2,  3,  2,  3,  4,  3,  2,  2,  1,
+    2,  2,  4,  6,  3,  2,  2,  2,  3,  4,  6,  7,  10, 11, 13, 14, 14, 6,  7,
+    10, 11, 12, 12, 12, 4,  6,  9,  10, 10, 10, 9,  6,  5,  7,  8,  8,  7,  8,
+    8,  2,  4,  7,  7,  7,  8,  9,  3,  5,  8,  8,  8,  8,  8,  6,  6,  9,  9,
+    9,  10, 5,  10, 12, 13, 14, 15, 16, 7,  9,  12, 13, 14, 14, 14, 10, 9,  12,
+    13, 13, 13, 13, 13, 8,  12, 13, 13, 14, 12, 12, 9,  13, 14, 15, 15, 15, 9,
+    12, 15, 16, 16, 16, 16, 8,  15, 17, 18, 17, 16, 18, 14, 18, 19, 19, 21, 20,
+    16, 16, 19, 20, 21, 21, 20, 14, 16, 20, 22, 22, 21, 20, 16, 16, 22, 23, 22,
+    23, 21, 17, 15, 23, 24, 24, 23, 22, 18, 15, 23, 27, 26, 25, 24, 19, 17, 24,
+    29, 27, 27, 26, 20, 26, 30, 29, 30, 27, 22, 18, 26, 31, 31, 31, 28, 22, 18,
+    27, 34, 33, 33, 28, 23, 19, 26, 32, 35, 34, 29, 24, 19, 27, 33, 36, 35, 30,
+    25, 21, 25, 33, 40, 38, 33, 26, 22, 27, 33, 40, 39, 34, 29, 24, 37, 43, 41,
+    34, 29, 25, 21, 37, 43, 43, 37, 30, 26, 21, 36, 43, 46, 38, 32, 26, 21, 38,
+    41, 48, 40, 33, 27, 23, 35, 41, 47, 42, 35, 29, 24, 35, 42, 47, 44, 37, 31,
+    26, 35, 41, 47, 46, 39, 32, 27, 6,  7,  8,  9,  9,  10, 11, 6,  7,  7,  9,
+    9,  8,  8,  5,  6,  7,  7,  7,  6,  6,  5,  5,  5,  5,  5,  3,  3,  3,  2,
+    2,  2,  2,  1,  3,  3,  2,  2,  1,  1,  1,  3,  4,  3,  2,  2,  0,  1,  3,
+    5,  6,  7,  8,  10, 12, 13, 5,  6,  7,  8,  10, 10, 10, 4,  6,  6,  7,  8,
+    8,  8,  4,  4,  4,  4,  5,  6,  6,  4,  2,  2,  2,  3,  3,  6,  5,  3,  2,
+    2,  4,  4,  6,  7,  4,  3,  2,  5,  5,  6,  5,  6,  9,  11, 12, 14, 14, 4,
+    5,  9,  11, 12, 12, 13, 7,  5,  8,  10, 10, 10, 11, 10, 3,  6,  9,  9,  9,
+    10, 12, 3,  5,  9,  10, 10, 10, 13, 4,  6,  10, 11, 11, 10, 11, 8,  7,  11,
+    12, 13, 13, 6,  9,  13, 15, 16, 16, 18, 10, 9,  13, 15, 17, 17, 17, 14, 9,
+    14, 15, 16, 17, 16, 16, 9,  14, 16, 17, 17, 15, 15, 11, 15, 17, 18, 18, 18,
+    13, 13, 17, 19, 19, 19, 19, 12, 16, 18, 20, 20, 21, 21, 16, 19, 22, 23, 24,
+    23, 18, 19, 20, 23, 24, 25, 23, 17, 19, 22, 25, 25, 25, 23, 19, 18, 24, 25,
+    26, 26, 25, 20, 17, 26, 27, 27, 27, 26, 21, 17, 25, 29, 30, 29, 27, 23, 19,
+    28, 33, 31, 30, 29, 24, 29, 32, 33, 32, 30, 25, 21, 29, 35, 35, 34, 31, 26,
+    22, 28, 37, 36, 35, 30, 26, 22, 29, 36, 38, 37, 32, 27, 22, 28, 35, 40, 38,
+    34, 29, 23, 29, 36, 42, 41, 36, 31, 26, 30, 36, 43, 44, 38, 32, 27, 40, 46,
+    44, 38, 33, 28, 24, 41, 46, 47, 40, 34, 29, 24, 40, 46, 50, 41, 35, 29, 25,
+    39, 46, 49, 42, 36, 30, 26, 39, 45, 49, 46, 38, 33, 27, 38, 45, 49, 48, 40,
+    34, 29, 39, 45, 49, 48, 43, 36, 30, 4,  5,  5,  6,  6,  8,  8,  4,  5,  5,
+    6,  6,  6,  6,  3,  4,  5,  4,  4,  4,  4,  3,  3,  3,  2,  3,  2,  2,  2,
+    2,  1,  1,  2,  0,  2,  3,  2,  2,  2,  1,  0,  2,  5,  3,  2,  1,  1,  0,
+    2,  4,  4,  5,  6,  8,  10, 10, 3,  4,  5,  6,  8,  8,  8,  3,  4,  4,  4,
+    5,  6,  7,  4,  2,  2,  2,  3,  4,  5,  6,  2,  2,  2,  4,  3,  5,  7,  3,
+    2,  2,  5,  4,  5,  10, 5,  3,  2,  6,  6,  5,  3,  4,  7,  9,  10, 12, 14,
+    5,  3,  7,  10, 10, 10, 12, 9,  3,  6,  8,  9,  9,  10, 13, 2,  5,  8,  9,
+    10, 9,  14, 3,  5,  9,  11, 10, 9,  15, 5,  6,  10, 12, 11, 9,  14, 8,  7,
+    11, 13, 13, 13, 10, 8,  13, 15, 16, 15, 18, 14, 8,  13, 15, 17, 17, 16, 16,
+    9,  14, 16, 16, 17, 16, 18, 9,  14, 16, 17, 17, 14, 18, 12, 15, 18, 18, 19,
+    17, 16, 13, 17, 19, 20, 20, 19, 14, 16, 19, 20, 21, 21, 21, 17, 19, 22, 23,
+    24, 23, 18, 19, 20, 23, 24, 26, 23, 17, 20, 21, 25, 25, 25, 24, 19, 20, 23,
+    25, 26, 26, 24, 20, 18, 26, 28, 28, 28, 26, 21, 18, 26, 31, 31, 29, 27, 23,
+    19, 27, 33, 32, 32, 28, 24, 28, 33, 33, 32, 30, 26, 22, 29, 34, 35, 35, 31,
+    27, 22, 28, 38, 37, 35, 31, 26, 23, 29, 37, 37, 37, 32, 27, 23, 28, 35, 40,
+    39, 34, 29, 24, 29, 35, 43, 41, 36, 31, 27, 29, 38, 43, 44, 38, 32, 27, 40,
+    46, 44, 37, 32, 28, 24, 39, 45, 46, 40, 33, 29, 24, 41, 45, 49, 41, 34, 30,
+    25, 40, 45, 50, 42, 35, 31, 26, 39, 44, 49, 45, 38, 33, 28, 39, 46, 50, 47,
+    41, 35, 29, 40, 44, 50, 50, 43, 36, 31, 4,  5,  6,  8,  8,  6,  6,  4,  4,
+    5,  7,  7,  5,  4,  3,  4,  5,  5,  6,  4,  2,  3,  3,  3,  4,  5,  3,  0,
+    2,  2,  1,  2,  4,  2,  0,  2,  2,  2,  2,  3,  2,  0,  4,  3,  2,  2,  3,
+    2,  0,  4,  4,  5,  6,  6,  8,  8,  3,  4,  4,  5,  6,  6,  7,  3,  4,  4,
+    4,  4,  4,  4,  2,  2,  2,  2,  2,  2,  3,  2,  2,  1,  1,  1,  1,  3,  4,
+    3,  2,  2,  2,  2,  3,  7,  5,  2,  2,  3,  3,  3,  3,  4,  6,  8,  9,  10,
+    11, 2,  3,  6,  8,  8,  8,  9,  5,  3,  6,  7,  6,  6,  8,  9,  2,  4,  7,
+    6,  6,  6,  11, 2,  4,  7,  8,  8,  6,  12, 4,  5,  8,  9,  9,  6,  10, 8,
+    6,  9,  10, 10, 10, 5,  7,  11, 12, 13, 13, 14, 10, 7,  12, 13, 13, 14, 13,
+    14, 8,  12, 13, 13, 13, 12, 14, 8,  12, 14, 14, 14, 11, 15, 10, 13, 15, 15,
+    15, 14, 14, 12, 15, 16, 17, 16, 16, 10, 15, 17, 18, 18, 18, 18, 15, 18, 19,
+    20, 21, 20, 14, 18, 18, 20, 21, 22, 20, 13, 18, 20, 22, 22, 21, 20, 16, 18,
+    22, 23, 22, 23, 22, 17, 16, 24, 24, 24, 24, 22, 18, 16, 24, 27, 27, 26, 24,
+    20, 17, 25, 30, 29, 28, 26, 21, 26, 29, 30, 29, 26, 22, 18, 26, 32, 30, 30,
+    27, 23, 19, 27, 33, 33, 32, 27, 23, 19, 26, 33, 34, 32, 28, 24, 20, 27, 34,
+    36, 35, 31, 25, 21, 27, 34, 40, 38, 33, 27, 23, 28, 34, 39, 39, 35, 29, 24,
+    36, 42, 40, 34, 29, 25, 21, 37, 43, 43, 36, 30, 25, 21, 36, 42, 45, 37, 32,
+    27, 21, 37, 41, 46, 38, 32, 27, 23, 35, 40, 45, 41, 35, 28, 24, 36, 42, 46,
+    44, 37, 32, 25, 37, 41, 46, 46, 38, 33, 27, 2,  2,  3,  3,  3,  2,  2,  1,
+    2,  3,  3,  3,  2,  2,  0,  2,  2,  3,  3,  2,  1,  1,  2,  2,  2,  2,  2,
+    4,  3,  3,  3,  4,  4,  3,  4,  7,  7,  7,  6,  5,  4,  4,  13, 11, 9,  7,
+    5,  4,  4,  0,  2,  2,  3,  2,  2,  1,  1,  2,  2,  3,  2,  2,  1,  2,  1,
+    2,  2,  2,  1,  1,  2,  1,  2,  2,  2,  2,  3,  4,  4,  4,  5,  4,  4,  4,
+    9,  9,  9,  7,  5,  4,  4,  16, 14, 10, 8,  6,  4,  4,  2,  1,  2,  1,  2,
+    1,  4,  2,  1,  2,  1,  1,  1,  4,  2,  1,  0,  0,  1,  0,  5,  3,  2,  3,
+    3,  3,  3,  6,  7,  6,  6,  6,  7,  6,  7,  12, 11, 11, 10, 9,  7,  7,  19,
+    17, 14, 12, 10, 9,  8,  2,  4,  5,  5,  5,  5,  8,  3,  5,  5,  6,  6,  6,
+    8,  7,  6,  6,  7,  7,  8,  8,  10, 9,  10, 10, 10, 11, 10, 10, 14, 14, 14,
+    14, 14, 12, 13, 20, 19, 17, 16, 15, 14, 19, 26, 22, 20, 18, 16, 15, 12, 13,
+    12, 13, 12, 12, 8,  13, 14, 14, 14, 14, 13, 8,  14, 16, 16, 15, 16, 15, 11,
+    13, 20, 19, 19, 19, 18, 14, 17, 25, 24, 22, 23, 21, 16, 21, 27, 30, 26, 25,
+    23, 17, 25, 31, 32, 29, 27, 25, 20, 21, 23, 22, 21, 18, 15, 11, 21, 26, 24,
+    23, 20, 16, 11, 22, 27, 26, 25, 22, 18, 14, 22, 28, 30, 29, 25, 22, 18, 25,
+    31, 35, 34, 30, 25, 20, 27, 33, 40, 38, 33, 26, 22, 31, 37, 41, 41, 35, 28,
+    23, 29, 35, 34, 27, 22, 17, 13, 29, 35, 36, 29, 23, 19, 15, 30, 35, 38, 31,
+    26, 21, 17, 30, 36, 41, 35, 30, 25, 21, 31, 37, 43, 40, 35, 28, 24, 34, 40,
+    46, 45, 38, 31, 25, 37, 42, 46, 46, 39, 33, 27, 1,  2,  2,  2,  2,  2,  1,
+    2,  1,  2,  3,  2,  2,  1,  2,  0,  2,  2,  2,  1,  2,  2,  2,  2,  2,  2,
+    3,  4,  4,  4,  4,  5,  5,  4,  4,  8,  8,  8,  7,  6,  4,  4,  14, 13, 9,
+    8,  6,  4,  4,  2,  0,  2,  2,  2,  1,  2,  2,  1,  2,  2,  2,  1,  2,  2,
+    2,  1,  2,  2,  1,  4,  2,  2,  2,  3,  2,  3,  5,  6,  5,  5,  6,  5,  4,
+    5,  11, 10, 10, 8,  6,  5,  5,  18, 15, 11, 9,  7,  5,  5,  2,  2,  1,  1,
+    1,  3,  6,  2,  2,  2,  2,  2,  4,  6,  3,  2,  3,  3,  4,  4,  7,  7,  3,
+    6,  6,  7,  7,  9,  11, 7,  10, 10, 11, 9,  9,  15, 12, 14, 13, 12, 11, 9,
+    20, 18, 17, 16, 14, 12, 12, 4,  6,  7,  8,  8,  7,  10, 7,  7,  8,  8,  9,
+    9,  10, 11, 8,  10, 10, 11, 11, 11, 14, 10, 13, 14, 14, 14, 13, 14, 16, 18,
+    18, 18, 17, 15, 15, 22, 23, 21, 21, 19, 18, 20, 28, 26, 24, 22, 20, 19, 15,
+    15, 15, 15, 16, 14, 10, 17, 17, 17, 17, 17, 15, 10, 17, 19, 19, 19, 19, 18,
+    14, 17, 22, 23, 23, 23, 22, 18, 20, 27, 28, 26, 28, 25, 20, 24, 30, 34, 32,
+    29, 27, 21, 29, 34, 35, 33, 31, 28, 22, 25, 26, 24, 25, 21, 17, 13, 24, 29,
+    27, 26, 23, 18, 14, 25, 31, 30, 29, 25, 22, 17, 25, 32, 34, 33, 29, 25, 22,
+    28, 34, 38, 38, 34, 28, 23, 31, 37, 45, 42, 36, 30, 25, 34, 39, 45, 45, 38,
+    32, 27, 33, 38, 36, 30, 25, 20, 16, 33, 39, 40, 32, 26, 21, 18, 34, 39, 43,
+    34, 30, 26, 21, 33, 39, 46, 39, 33, 29, 25, 35, 40, 48, 44, 38, 31, 27, 38,
+    44, 50, 48, 42, 34, 29, 40, 46, 51, 51, 44, 37, 30, 2,  1,  2,  2,  2,  2,
+    1,  2,  2,  1,  2,  2,  1,  2,  2,  2,  1,  1,  2,  2,  3,  2,  3,  2,  3,
+    3,  4,  5,  5,  5,  6,  5,  6,  5,  5,  10, 9,  9,  8,  7,  5,  5,  16, 13,
+    11, 8,  7,  5,  5,  2,  2,  0,  2,  1,  2,  4,  3,  2,  1,  2,  1,  2,  5,
+    3,  2,  1,  1,  1,  3,  6,  4,  3,  3,  3,  3,  4,  7,  8,  7,  7,  7,  7,
+    5,  7,  12, 11, 11, 10, 9,  7,  7,  20, 16, 13, 11, 10, 9,  7,  3,  2,  4,
+    4,  4,  5,  7,  5,  2,  4,  4,  5,  5,  8,  8,  3,  5,  7,  7,  6,  9,  11,
+    4,  8,  10, 10, 10, 11, 15, 9,  11, 14, 14, 13, 11, 18, 14, 16, 17, 16, 15,
+    11, 21, 19, 19, 19, 18, 16, 15, 8,  7,  10, 10, 10, 8,  11, 12, 8,  11, 11,
+    12, 12, 12, 15, 9,  12, 14, 14, 15, 14, 17, 12, 17, 18, 18, 18, 15, 18, 17,
+    20, 21, 22, 22, 19, 18, 24, 26, 25, 23, 23, 21, 22, 30, 28, 28, 25, 24, 23,
+    17, 18, 19, 18, 19, 17, 12, 20, 19, 20, 19, 20, 19, 12, 20, 20, 22, 23, 23,
+    22, 17, 20, 24, 26, 27, 27, 26, 22, 23, 29, 31, 31, 31, 29, 24, 25, 33, 36,
+    35, 33, 30, 25, 30, 38, 40, 38, 36, 31, 27, 28, 29, 28, 27, 24, 21, 15, 27,
+    32, 31, 30, 26, 22, 18, 27, 33, 33, 32, 30, 25, 22, 28, 35, 39, 37, 33, 29,
+    25, 31, 38, 43, 42, 38, 32, 27, 35, 42, 48, 46, 40, 34, 28, 38, 44, 49, 49,
+    43, 36, 30, 37, 42, 39, 34, 27, 23, 19, 37, 42, 43, 36, 30, 25, 21, 37, 42,
+    46, 39, 33, 29, 25, 37, 44, 50, 42, 38, 32, 28, 39, 45, 52, 49, 42, 36, 31,
+    43, 48, 54, 54, 46, 39, 33, 44, 50, 55, 55, 48, 41, 33, 2,  2,  1,  2,  2,
+    1,  3,  3,  2,  2,  2,  1,  1,  4,  3,  2,  2,  2,  3,  3,  5,  3,  3,  4,
+    3,  4,  5,  6,  6,  6,  7,  7,  7,  6,  6,  11, 11, 11, 10, 8,  6,  6,  17,
+    15, 12, 10, 8,  6,  6,  3,  2,  2,  0,  1,  4,  6,  3,  2,  2,  1,  1,  4,
+    6,  5,  3,  2,  3,  3,  5,  8,  8,  4,  4,  5,  7,  6,  9,  11, 7,  8,  9,
+    10, 7,  9,  15, 12, 12, 12, 12, 10, 9,  21, 18, 14, 12, 13, 12, 9,  5,  3,
+    5,  6,  6,  7,  8,  8,  3,  5,  7,  7,  6,  9,  11, 3,  5,  9,  10, 8,  11,
+    15, 5,  9,  13, 13, 13, 13, 18, 10, 12, 17, 18, 16, 13, 21, 16, 17, 20, 19,
+    18, 13, 24, 21, 20, 21, 21, 19, 17, 11, 8,  12, 12, 13, 10, 13, 15, 9,  12,
+    14, 15, 14, 15, 18, 11, 14, 17, 18, 19, 16, 20, 14, 18, 20, 21, 21, 18, 21,
+    20, 22, 24, 25, 24, 21, 22, 25, 29, 28, 26, 27, 24, 23, 31, 31, 31, 29, 29,
+    27, 20, 19, 20, 21, 21, 20, 13, 24, 20, 21, 23, 23, 22, 14, 23, 22, 24, 26,
+    27, 25, 20, 24, 26, 29, 30, 30, 29, 25, 24, 33, 35, 35, 35, 31, 27, 28, 37,
+    40, 39, 37, 33, 28, 32, 40, 44, 40, 40, 37, 32, 29, 32, 31, 32, 27, 23, 18,
+    29, 35, 33, 33, 30, 26, 22, 29, 36, 36, 37, 32, 28, 25, 29, 37, 41, 41, 37,
+    33, 29, 33, 41, 47, 46, 42, 36, 31, 36, 45, 52, 50, 44, 38, 31, 40, 46, 53,
+    53, 46, 40, 34, 40, 45, 43, 37, 30, 26, 22, 40, 46, 45, 38, 32, 28, 25, 39,
+    45, 49, 43, 38, 32, 28, 39, 46, 53, 46, 41, 36, 33, 44, 49, 54, 52, 46, 40,
+    35, 45, 52, 58, 57, 48, 43, 36, 48, 54, 60, 59, 52, 44, 38, 2,  1,  1,  3,
+    3,  1,  2,  2,  2,  1,  2,  3,  2,  3,  2,  2,  1,  3,  4,  4,  4,  2,  3,
+    4,  5,  6,  6,  6,  6,  7,  7,  8,  10, 8,  6,  11, 11, 11, 10, 10, 8,  7,
+    17, 15, 13, 11, 10, 8,  7,  2,  2,  1,  1,  0,  2,  4,  2,  2,  1,  1,  1,
+    3,  5,  5,  2,  2,  2,  3,  4,  6,  9,  3,  4,  5,  6,  5,  8,  11, 7,  8,
+    9,  10, 6,  8,  15, 13, 13, 12, 11, 10, 8,  21, 18, 15, 13, 13, 12, 8,  5,
+    2,  4,  5,  5,  5,  7,  10, 2,  4,  6,  7,  5,  8,  13, 2,  5,  9,  10, 6,
+    10, 15, 5,  8,  12, 13, 12, 12, 17, 10, 12, 16, 17, 16, 12, 21, 16, 17, 19,
+    19, 17, 12, 24, 21, 20, 21, 20, 19, 16, 13, 7,  11, 12, 11, 8,  11, 16, 9,
+    11, 12, 14, 13, 13, 19, 11, 13, 16, 17, 17, 15, 21, 14, 17, 20, 20, 21, 17,
+    21, 19, 22, 24, 23, 24, 21, 22, 25, 27, 28, 27, 26, 23, 24, 31, 31, 30, 28,
+    27, 26, 21, 18, 19, 20, 20, 19, 11, 24, 19, 21, 21, 22, 22, 13, 25, 21, 23,
+    25, 26, 24, 19, 24, 26, 27, 30, 29, 28, 24, 25, 31, 33, 34, 35, 33, 26, 27,
+    36, 39, 38, 36, 34, 28, 32, 41, 42, 41, 39, 35, 30, 28, 30, 30, 28, 25, 22,
+    16, 29, 33, 31, 31, 28, 24, 20, 28, 35, 34, 35, 31, 28, 24, 29, 37, 40, 39,
+    37, 31, 28, 32, 40, 45, 45, 41, 35, 29, 36, 44, 51, 48, 42, 37, 32, 39, 48,
+    51, 50, 45, 39, 33, 38, 43, 41, 34, 28, 24, 21, 38, 43, 43, 37, 31, 28, 24,
+    37, 44, 46, 39, 36, 31, 28, 37, 45, 51, 45, 39, 36, 31, 41, 49, 54, 51, 45,
+    39, 33, 44, 51, 57, 56, 47, 41, 34, 47, 52, 57, 58, 50, 43, 37, 2,  1,  3,
+    5,  5,  3,  2,  2,  1,  3,  4,  6,  4,  3,  2,  1,  2,  5,  7,  6,  5,  2,
+    3,  4,  6,  8,  8,  8,  5,  6,  7,  9,  11, 10, 8,  11, 11, 11, 12, 12, 10,
+    8,  17, 15, 13, 12, 12, 10, 8,  2,  1,  2,  4,  2,  0,  2,  2,  2,  2,  3,
+    3,  1,  4,  2,  2,  1,  4,  4,  3,  5,  5,  3,  4,  6,  6,  6,  6,  8,  7,
+    8,  9,  9,  7,  7,  14, 13, 12, 12, 10, 8,  6,  21, 18, 15, 12, 10, 9,  7,
+    2,  2,  3,  2,  2,  3,  5,  6,  2,  3,  3,  4,  4,  6,  10, 2,  4,  6,  7,
+    5,  7,  13, 3,  8,  10, 10, 10, 10, 15, 9,  12, 14, 14, 13, 10, 19, 15, 17,
+    17, 16, 15, 10, 23, 22, 19, 19, 17, 16, 14, 10, 7,  9,  9,  9,  6,  8,  14,
+    7,  10, 10, 11, 11, 10, 16, 9,  11, 13, 14, 15, 12, 19, 12, 16, 18, 18, 18,
+    14, 18, 17, 20, 22, 22, 21, 17, 19, 24, 25, 25, 25, 24, 21, 23, 30, 29, 28,
+    26, 24, 23, 19, 16, 17, 17, 17, 16, 9,  23, 18, 18, 18, 20, 18, 10, 23, 20,
+    21, 22, 23, 21, 16, 22, 24, 26, 27, 27, 26, 22, 22, 29, 31, 31, 31, 29, 23,
+    25, 35, 37, 36, 34, 31, 25, 31, 38, 39, 37, 35, 32, 26, 27, 28, 27, 26, 23,
+    18, 14, 28, 31, 27, 27, 25, 21, 18, 26, 32, 32, 32, 29, 25, 21, 26, 34, 37,
+    36, 32, 29, 25, 30, 38, 43, 42, 39, 31, 28, 35, 42, 49, 46, 39, 33, 28, 39,
+    44, 49, 49, 42, 38, 30, 35, 41, 36, 31, 25, 21, 18, 34, 39, 39, 32, 27, 25,
+    20, 36, 40, 41, 36, 33, 29, 25, 35, 42, 47, 42, 36, 32, 29, 39, 44, 52, 49,
+    41, 37, 31, 42, 48, 54, 52, 44, 38, 32, 45, 50, 53, 54, 47, 41, 34, 1,  4,
+    5,  7,  7,  5,  3,  1,  3,  5,  7,  8,  6,  5,  1,  2,  5,  7,  9,  8,  6,
+    2,  3,  6,  8,  10, 9,  8,  5,  6,  8,  10, 12, 10, 8,  10, 10, 12, 13, 12,
+    10, 8,  16, 15, 13, 13, 13, 10, 8,  1,  2,  4,  5,  4,  2,  0,  2,  1,  4,
+    5,  4,  3,  2,  2,  1,  3,  6,  5,  4,  4,  2,  3,  5,  7,  7,  6,  6,  6,
+    7,  8,  10, 10, 8,  6,  12, 12, 12, 13, 10, 8,  6,  20, 17, 14, 13, 11, 9,
+    6,  2,  1,  1,  1,  2,  2,  3,  2,  2,  1,  1,  1,  2,  4,  5,  2,  2,  3,
+    3,  3,  5,  10, 3,  6,  7,  6,  7,  7,  12, 8,  10, 11, 11, 10, 7,  17, 14,
+    15, 14, 12, 11, 7,  22, 20, 18, 16, 14, 13, 11, 5,  6,  6,  6,  6,  5,  7,
+    11, 6,  7,  7,  8,  8,  7,  14, 7,  9,  10, 11, 11, 9,  16, 10, 14, 14, 14,
+    15, 11, 16, 16, 18, 18, 18, 18, 15, 17, 23, 23, 22, 21, 19, 18, 22, 30, 26,
+    24, 22, 21, 20, 16, 14, 14, 13, 14, 13, 7,  18, 15, 15, 15, 16, 15, 7,  18,
+    18, 18, 19, 19, 17, 13, 19, 22, 22, 23, 23, 22, 18, 20, 27, 28, 28, 28, 25,
+    20, 24, 31, 34, 32, 29, 26, 22, 29, 34, 37, 34, 32, 29, 23, 24, 24, 23, 23,
+    19, 15, 11, 24, 28, 25, 24, 21, 18, 14, 24, 30, 28, 27, 26, 21, 18, 24, 31,
+    33, 32, 29, 26, 22, 27, 34, 39, 36, 33, 29, 23, 32, 38, 44, 42, 35, 30, 25,
+    34, 41, 45, 45, 39, 33, 26, 30, 37, 33, 27, 22, 18, 14, 32, 36, 35, 29, 24,
+    21, 18, 32, 36, 38, 32, 28, 25, 21, 31, 37, 44, 38, 33, 29, 25, 34, 40, 46,
+    42, 38, 32, 27, 38, 44, 48, 48, 41, 34, 29, 42, 48, 50, 50, 43, 35, 30, 2,
+    2,  3,  4,  4,  3,  2,  2,  2,  3,  4,  4,  2,  2,  1,  2,  2,  3,  3,  2,
+    1,  0,  2,  2,  2,  3,  2,  3,  3,  3,  3,  3,  4,  3,  3,  7,  6,  7,  6,
+    5,  3,  3,  13, 11, 9,  7,  5,  3,  3,  1,  2,  3,  3,  2,  2,  2,  0,  2,
+    2,  3,  2,  2,  1,  1,  2,  2,  2,  2,  2,  1,  1,  1,  2,  2,  2,  2,  3,
+    4,  4,  4,  4,  4,  3,  3,  9,  8,  8,  7,  5,  4,  3,  16, 13, 10, 8,  6,
+    4,  3,  1,  2,  2,  2,  2,  2,  3,  2,  2,  2,  1,  2,  1,  3,  2,  1,  1,
+    1,  1,  1,  4,  2,  2,  2,  2,  2,  2,  6,  6,  6,  5,  5,  6,  5,  5,  12,
+    11, 10, 9,  7,  6,  5,  18, 16, 13, 11, 9,  7,  7,  2,  3,  4,  4,  4,  4,
+    8,  2,  5,  4,  5,  5,  5,  8,  5,  5,  6,  6,  6,  7,  8,  8,  8,  9,  9,
+    9,  10, 9,  9,  13, 13, 13, 13, 12, 12, 12, 18, 17, 16, 15, 14, 13, 18, 24,
+    21, 19, 16, 15, 15, 11, 11, 12, 12, 12, 11, 7,  13, 13, 13, 13, 13, 12, 8,
+    13, 15, 14, 15, 14, 13, 10, 13, 19, 18, 18, 18, 17, 14, 16, 23, 22, 21, 23,
+    20, 15, 20, 26, 27, 26, 24, 22, 17, 24, 29, 31, 28, 26, 24, 19, 20, 22, 21,
+    21, 18, 14, 9,  21, 24, 23, 22, 19, 15, 10, 21, 26, 25, 25, 21, 17, 13, 21,
+    27, 29, 28, 25, 20, 17, 23, 28, 33, 32, 29, 23, 18, 26, 31, 38, 37, 32, 25,
+    20, 29, 35, 38, 39, 34, 28, 22, 28, 35, 33, 26, 21, 17, 12, 28, 34, 35, 28,
+    23, 18, 14, 28, 34, 38, 30, 25, 20, 16, 28, 34, 40, 35, 29, 24, 20, 30, 36,
+    43, 39, 32, 28, 23, 32, 38, 43, 42, 36, 29, 24, 34, 40, 44, 46, 38, 32, 26,
+    0,  2,  2,  3,  3,  2,  2,  1,  2,  2,  3,  2,  2,  1,  2,  1,  2,  2,  2,
+    1,  2,  2,  1,  2,  2,  2,  3,  4,  4,  4,  4,  4,  5,  4,  4,  8,  8,  8,
+    7,  5,  4,  4,  14, 12, 9,  7,  6,  4,  4,  2,  1,  2,  3,  2,  2,  1,  2,
+    0,  2,  2,  2,  1,  1,  2,  1,  2,  2,  2,  1,  3,  2,  2,  2,  2,  2,  3,
+    4,  5,  5,  5,  5,  5,  4,  4,  10, 9,  9,  8,  6,  4,  4,  17, 15, 11, 9,
+    7,  5,  4,  2,  1,  1,  1,  1,  2,  6,  2,  2,  1,  1,  1,  3,  6,  2,  2,
+    2,  2,  2,  3,  7,  6,  3,  5,  5,  5,  6,  8,  9,  7,  9,  9,  9,  8,  8,
+    14, 12, 13, 12, 11, 10, 8,  20, 18, 16, 14, 12, 11, 10, 3,  6,  6,  6,  7,
+    6,  9,  6,  7,  7,  8,  8,  8,  9,  9,  7,  9,  9,  10, 10, 10, 12, 10, 12,
+    13, 13, 13, 12, 13, 15, 16, 17, 17, 16, 14, 14, 21, 21, 20, 19, 17, 16, 20,
+    28, 24, 22, 20, 19, 18, 14, 15, 14, 14, 15, 13, 9,  16, 17, 16, 15, 16, 15,
+    10, 16, 17, 18, 18, 18, 17, 13, 15, 22, 21, 21, 22, 20, 17, 19, 26, 27, 26,
+    26, 23, 19, 23, 31, 32, 30, 28, 25, 20, 27, 33, 35, 31, 29, 27, 21, 24, 25,
+    24, 24, 20, 16, 12, 23, 27, 25, 25, 22, 18, 14, 24, 30, 28, 27, 25, 20, 17,
+    23, 30, 33, 31, 28, 24, 20, 27, 33, 38, 36, 32, 28, 22, 30, 36, 42, 41, 34,
+    29, 24, 33, 39, 43, 42, 37, 31, 26, 32, 37, 36, 29, 23, 19, 15, 32, 37, 38,
+    30, 25, 20, 17, 31, 36, 40, 33, 28, 23, 20, 32, 38, 44, 38, 32, 28, 24, 34,
+    41, 46, 44, 37, 31, 25, 36, 43, 48, 49, 40, 34, 28, 39, 45, 49, 50, 42, 35,
+    30, 2,  0,  2,  2,  2,  2,  1,  2,  1,  2,  2,  2,  1,  1,  2,  2,  2,  2,
+    2,  2,  3,  2,  2,  2,  2,  3,  3,  4,  5,  5,  5,  5,  5,  5,  4,  9,  9,
+    9,  8,  6,  5,  4,  15, 13, 10, 8,  7,  5,  4,  2,  2,  1,  2,  1,  1,  4,
+    2,  2,  0,  2,  1,  1,  4,  2,  2,  1,  1,  1,  2,  5,  3,  3,  3,  3,  3,
+    4,  6,  7,  6,  6,  6,  6,  4,  6,  11, 11, 11, 9,  7,  6,  6,  19, 16, 12,
+    10, 9,  7,  6,  3,  2,  3,  3,  3,  5,  7,  3,  2,  3,  4,  4,  5,  7,  7,
+    2,  4,  6,  6,  5,  8,  10, 3,  7,  9,  9,  9,  10, 13, 8,  11, 12, 13, 12,
+    10, 17, 13, 15, 16, 15, 13, 10, 21, 19, 18, 17, 16, 15, 14, 7,  7,  9,  9,
+    10, 8,  11, 11, 8,  10, 10, 11, 11, 11, 13, 8,  11, 12, 13, 13, 12, 16, 11,
+    15, 16, 16, 17, 14, 17, 17, 20, 20, 20, 19, 18, 18, 23, 24, 24, 23, 21, 20,
+    21, 30, 27, 25, 24, 22, 22, 17, 17, 17, 17, 18, 16, 11, 19, 18, 18, 18, 18,
+    18, 11, 19, 20, 21, 21, 22, 20, 16, 19, 23, 25, 25, 25, 24, 20, 21, 30, 30,
+    29, 29, 26, 22, 25, 34, 35, 34, 31, 29, 24, 30, 36, 39, 35, 34, 31, 26, 26,
+    28, 27, 27, 23, 19, 15, 26, 31, 29, 28, 25, 21, 17, 26, 32, 32, 31, 28, 24,
+    20, 26, 34, 37, 35, 31, 28, 23, 30, 36, 41, 40, 36, 30, 26, 33, 41, 46, 45,
+    38, 32, 27, 37, 42, 48, 48, 41, 35, 28, 35, 41, 39, 32, 26, 22, 18, 35, 41,
+    42, 34, 29, 24, 20, 36, 42, 45, 37, 33, 27, 23, 36, 42, 49, 41, 37, 31, 27,
+    38, 45, 50, 47, 42, 35, 29, 41, 48, 53, 52, 44, 37, 31, 44, 50, 53, 54, 46,
+    40, 32, 2,  2,  1,  2,  2,  1,  2,  2,  2,  1,  2,  2,  1,  3,  3,  2,  1,
+    2,  3,  3,  4,  3,  3,  3,  3,  4,  5,  5,  6,  6,  7,  6,  7,  6,  5,  10,
+    10, 10, 9,  8,  6,  5,  17, 15, 12, 10, 8,  6,  5,  3,  2,  2,  1,  1,  3,
+    5,  3,  2,  2,  0,  1,  3,  6,  3,  2,  2,  2,  2,  4,  7,  6,  4,  4,  5,
+    5,  5,  8,  10, 7,  8,  8,  9,  6,  8,  14, 12, 12, 11, 10, 9,  8,  20, 17,
+    14, 12, 12, 11, 8,  3,  2,  4,  5,  5,  6,  8,  7,  3,  4,  6,  6,  6,  9,
+    10, 3,  5,  8,  9,  7,  10, 14, 5,  9,  12, 12, 12, 12, 16, 9,  12, 15, 16,
+    15, 12, 20, 15, 16, 19, 18, 17, 12, 23, 21, 20, 21, 19, 18, 16, 10, 7,  11,
+    12, 12, 9,  13, 14, 8,  12, 13, 14, 13, 13, 17, 10, 13, 16, 16, 17, 15, 19,
+    13, 17, 20, 20, 20, 17, 20, 18, 22, 24, 24, 23, 20, 20, 24, 26, 28, 26, 25,
+    23, 23, 30, 30, 29, 27, 26, 25, 19, 19, 20, 20, 20, 19, 13, 23, 20, 21, 22,
+    22, 21, 13, 22, 22, 23, 25, 26, 24, 19, 22, 26, 28, 28, 29, 28, 24, 24, 32,
+    33, 33, 33, 31, 25, 27, 37, 39, 38, 35, 32, 27, 31, 40, 42, 39, 39, 35, 29,
+    28, 31, 30, 29, 27, 22, 17, 29, 33, 32, 31, 28, 24, 20, 28, 35, 34, 35, 32,
+    27, 23, 28, 37, 40, 39, 36, 31, 27, 32, 41, 46, 44, 41, 34, 29, 36, 43, 50,
+    49, 42, 37, 32, 40, 47, 51, 51, 45, 38, 32, 38, 44, 41, 35, 28, 25, 20, 38,
+    44, 44, 37, 32, 28, 24, 39, 44, 47, 41, 36, 31, 27, 38, 45, 52, 46, 40, 36,
+    31, 41, 48, 55, 52, 44, 39, 34, 45, 51, 57, 56, 47, 40, 35, 48, 53, 56, 58,
+    51, 43, 37, 2,  1,  1,  3,  3,  1,  2,  2,  1,  1,  2,  3,  2,  3,  2,  2,
+    1,  3,  4,  4,  4,  2,  3,  3,  4,  6,  6,  6,  5,  6,  7,  7,  9,  8,  6,
+    11, 11, 11, 10, 10, 8,  6,  17, 15, 12, 10, 9,  8,  6,  2,  2,  1,  1,  1,
+    3,  4,  2,  2,  1,  1,  0,  3,  5,  4,  2,  1,  2,  2,  4,  6,  8,  3,  4,
+    5,  5,  5,  7,  10, 7,  8,  9,  9,  6,  7,  14, 12, 12, 12, 11, 9,  7,  21,
+    17, 14, 12, 12, 11, 7,  4,  2,  4,  5,  5,  6,  8,  9,  2,  4,  6,  6,  5,
+    8,  13, 2,  5,  8,  9,  6,  10, 15, 5,  8,  12, 12, 12, 12, 17, 10, 12, 16,
+    17, 16, 12, 21, 15, 17, 19, 19, 17, 12, 24, 21, 19, 20, 19, 18, 16, 13, 7,
+    11, 12, 11, 9,  12, 16, 8,  11, 12, 14, 13, 13, 19, 11, 12, 15, 17, 17, 14,
+    21, 14, 17, 20, 20, 20, 16, 20, 19, 22, 23, 25, 24, 19, 22, 25, 27, 27, 27,
+    25, 24, 23, 31, 30, 30, 28, 27, 26, 21, 17, 19, 20, 20, 19, 12, 24, 19, 21,
+    21, 22, 21, 13, 24, 21, 23, 24, 25, 24, 18, 24, 26, 27, 28, 30, 28, 24, 25,
+    32, 32, 34, 33, 32, 25, 27, 34, 39, 38, 36, 33, 27, 32, 39, 43, 39, 38, 36,
+    29, 28, 29, 29, 29, 26, 22, 16, 28, 33, 31, 31, 27, 24, 20, 28, 36, 35, 33,
+    31, 27, 24, 28, 37, 39, 38, 35, 31, 27, 32, 39, 45, 44, 40, 34, 30, 35, 43,
+    51, 47, 41, 36, 31, 39, 48, 52, 52, 45, 38, 33, 38, 43, 40, 34, 29, 24, 21,
+    38, 43, 43, 37, 32, 27, 24, 37, 43, 46, 40, 36, 32, 27, 37, 44, 50, 44, 40,
+    34, 31, 41, 48, 53, 51, 43, 39, 33, 45, 51, 55, 56, 48, 40, 34, 47, 53, 55,
+    57, 51, 41, 37, 1,  1,  4,  6,  5,  4,  2,  1,  1,  3,  5,  5,  3,  2,  2,
+    1,  2,  4,  6,  5,  4,  2,  2,  3,  5,  7,  6,  6,  5,  5,  6,  8,  10, 8,
+    6,  10, 9,  9,  10, 10, 8,  6,  15, 14, 11, 10, 10, 8,  6,  2,  1,  2,  4,
+    3,  1,  3,  2,  1,  1,  3,  3,  0,  3,  2,  2,  1,  3,  3,  2,  4,  4,  3,
+    4,  5,  5,  4,  5,  7,  6,  7,  8,  7,  6,  5,  12, 11, 11, 10, 8,  6,  5,
+    19, 16, 12, 10, 9,  8,  5,  2,  1,  3,  2,  3,  4,  6,  4,  2,  3,  3,  4,
+    3,  5,  8,  2,  4,  6,  6,  4,  6,  13, 3,  7,  9,  9,  9,  8,  14, 8,  11,
+    13, 13, 12, 8,  18, 14, 15, 16, 15, 13, 8,  21, 19, 18, 18, 16, 15, 13, 9,
+    6,  9,  9,  9,  7,  10, 13, 7,  9,  10, 10, 10, 9,  16, 8,  11, 13, 13, 13,
+    11, 18, 11, 15, 16, 17, 17, 13, 18, 17, 19, 20, 21, 19, 16, 18, 23, 25, 23,
+    23, 21, 19, 21, 28, 27, 26, 24, 23, 22, 18, 16, 17, 16, 17, 17, 10, 21, 18,
+    18, 18, 19, 17, 9,  21, 19, 20, 22, 21, 20, 15, 21, 23, 24, 25, 25, 24, 20,
+    22, 29, 30, 30, 30, 27, 22, 25, 33, 35, 34, 32, 29, 24, 29, 37, 38, 35, 34,
+    31, 26, 26, 28, 27, 26, 22, 19, 14, 26, 30, 28, 27, 25, 21, 17, 25, 32, 31,
+    30, 28, 24, 20, 26, 34, 36, 35, 32, 28, 24, 28, 36, 41, 40, 36, 31, 26, 33,
+    41, 47, 43, 38, 31, 27, 37, 41, 47, 47, 40, 34, 29, 35, 40, 37, 30, 26, 22,
+    18, 34, 40, 40, 33, 27, 24, 20, 35, 40, 43, 36, 31, 27, 24, 34, 42, 46, 41,
+    36, 32, 28, 37, 43, 48, 46, 40, 35, 30, 41, 46, 52, 51, 42, 36, 31, 44, 49,
+    53, 52, 45, 39, 32, 1,  5,  6,  8,  8,  6,  4,  0,  3,  6,  8,  8,  5,  3,
+    1,  2,  5,  6,  8,  6,  5,  1,  3,  5,  7,  9,  7,  6,  4,  5,  7,  8,  10,
+    9,  6,  8,  8,  10, 11, 11, 9,  7,  14, 12, 11, 11, 10, 8,  7,  1,  2,  5,
+    7,  5,  4,  2,  1,  1,  4,  6,  5,  3,  0,  2,  1,  3,  5,  4,  3,  2,  2,
+    2,  4,  5,  5,  4,  4,  5,  6,  7,  8,  7,  6,  4,  11, 10, 10, 10, 8,  6,
+    4,  17, 14, 12, 10, 8,  6,  4,  1,  1,  1,  2,  3,  3,  5,  2,  1,  0,  1,
+    2,  2,  3,  3,  1,  2,  2,  2,  2,  4,  7,  2,  5,  5,  5,  5,  5,  11, 7,
+    9,  9,  9,  8,  5,  15, 12, 13, 12, 11, 9,  5,  19, 17, 15, 14, 12, 10, 9,
+    3,  5,  6,  6,  7,  6,  8,  8,  6,  7,  7,  8,  8,  7,  11, 7,  8,  9,  9,
+    9,  8,  14, 9,  13, 13, 13, 13, 10, 15, 14, 17, 16, 17, 16, 13, 15, 20, 21,
+    20, 19, 17, 16, 20, 26, 24, 22, 21, 19, 18, 14, 14, 14, 14, 15, 14, 8,  17,
+    16, 15, 15, 16, 14, 7,  17, 17, 18, 18, 18, 17, 12, 16, 21, 22, 21, 22, 20,
+    16, 19, 27, 27, 26, 26, 24, 18, 22, 30, 31, 30, 27, 25, 21, 27, 33, 35, 32,
+    30, 27, 22, 24, 25, 24, 23, 20, 17, 12, 24, 27, 25, 24, 21, 17, 12, 23, 29,
+    27, 27, 24, 20, 16, 24, 31, 31, 30, 27, 24, 20, 26, 33, 37, 35, 32, 27, 21,
+    30, 36, 43, 39, 33, 29, 24, 33, 39, 43, 41, 36, 29, 25, 31, 35, 33, 27, 23,
+    19, 15, 32, 36, 35, 28, 24, 20, 16, 32, 37, 38, 32, 27, 24, 20, 30, 37, 41,
+    36, 31, 27, 23, 34, 39, 44, 41, 36, 30, 25, 37, 41, 47, 46, 39, 32, 28, 39,
+    45, 48, 47, 41, 34, 29, 2,  2,  4,  8,  8,  6,  2,  2,  2,  3,  7,  8,  4,
+    2,  2,  2,  3,  4,  5,  3,  2,  1,  2,  2,  2,  3,  2,  2,  2,  2,  3,  3,
+    3,  3,  3,  6,  6,  6,  6,  4,  3,  2,  12, 10, 8,  6,  4,  3,  3,  2,  2,
+    3,  5,  5,  2,  2,  1,  2,  3,  4,  4,  2,  2,  0,  2,  2,  2,  2,  2,  1,
+    1,  1,  1,  2,  1,  1,  3,  3,  3,  4,  4,  3,  3,  3,  8,  7,  8,  7,  4,
+    3,  3,  15, 13, 10, 7,  5,  3,  3,  0,  2,  2,  2,  2,  2,  1,  2,  2,  2,
+    2,  2,  2,  1,  2,  1,  1,  1,  1,  1,  2,  2,  1,  1,  1,  1,  1,  4,  5,
+    5,  4,  4,  5,  3,  4,  11, 10, 9,  8,  6,  4,  4,  17, 16, 12, 9,  7,  6,
+    5,  2,  2,  2,  3,  3,  3,  7,  2,  3,  3,  4,  4,  4,  7,  4,  4,  4,  5,
+    5,  5,  7,  7,  7,  7,  7,  8,  8,  8,  7,  11, 11, 11, 12, 11, 10, 11, 17,
+    16, 15, 14, 12, 12, 18, 22, 19, 17, 16, 14, 13, 10, 10, 10, 10, 11, 10, 7,
+    12, 12, 12, 11, 12, 11, 7,  12, 14, 13, 13, 13, 12, 8,  12, 17, 16, 17, 16,
+    15, 12, 15, 21, 20, 20, 20, 19, 13, 18, 24, 26, 24, 24, 21, 15, 22, 28, 29,
+    26, 25, 23, 17, 19, 21, 20, 20, 16, 12, 8,  19, 23, 22, 22, 18, 13, 9,  20,
+    25, 24, 24, 20, 15, 11, 19, 25, 27, 27, 23, 19, 15, 21, 28, 31, 31, 28, 22,
+    17, 25, 30, 36, 35, 30, 24, 18, 27, 33, 38, 36, 31, 27, 21, 27, 32, 31, 25,
+    20, 16, 11, 27, 33, 34, 27, 22, 16, 12, 27, 32, 36, 29, 24, 19, 15, 27, 33,
+    38, 32, 27, 23, 19, 28, 35, 40, 36, 32, 26, 21, 31, 36, 41, 40, 33, 28, 22,
+    34, 37, 42, 41, 35, 31, 24, 1,  2,  3,  3,  3,  2,  2,  0,  2,  2,  3,  3,
+    2,  1,  1,  2,  2,  2,  2,  2,  1,  2,  1,  1,  2,  2,  2,  4,  4,  3,  4,
+    4,  4,  4,  4,  7,  7,  7,  7,  5,  4,  4,  13, 11, 9,  7,  6,  4,  4,  1,
+    2,  2,  3,  2,  2,  1,  2,  1,  2,  2,  2,  1,  1,  2,  0,  2,  2,  2,  1,
+    1,  2,  2,  2,  2,  2,  2,  4,  5,  4,  4,  5,  4,  4,  3,  9,  9,  8,  8,
+    5,  4,  4,  17, 14, 10, 8,  6,  4,  3,  2,  0,  1,  1,  2,  2,  5,  2,  2,
+    1,  1,  1,  2,  5,  2,  2,  1,  1,  1,  1,  6,  4,  2,  4,  4,  4,  4,  7,
+    8,  6,  7,  8,  8,  7,  7,  13, 11, 12, 11, 9,  8,  7,  19, 17, 15, 13, 11,
+    10, 9,  2,  5,  5,  6,  6,  5,  8,  5,  6,  6,  7,  7,  7,  9,  8,  7,  7,
+    8,  8,  8,  9,  11, 9,  11, 11, 11, 11, 11, 11, 14, 15, 15, 15, 14, 13, 13,
+    20, 20, 19, 18, 16, 15, 19, 26, 23, 20, 19, 17, 17, 12, 13, 13, 13, 14, 12,
+    8,  14, 15, 15, 15, 15, 13, 8,  14, 17, 16, 16, 16, 15, 12, 14, 21, 20, 19,
+    20, 19, 15, 18, 26, 24, 24, 25, 22, 17, 21, 29, 30, 29, 26, 23, 19, 26, 31,
+    33, 30, 29, 26, 20, 22, 24, 22, 22, 19, 15, 11, 23, 26, 24, 23, 21, 16, 12,
+    22, 28, 27, 26, 22, 19, 15, 22, 28, 31, 30, 26, 22, 19, 26, 32, 35, 35, 31,
+    26, 21, 28, 34, 40, 39, 32, 28, 23, 32, 37, 42, 41, 36, 29, 25, 30, 36, 35,
+    28, 22, 18, 14, 30, 36, 37, 29, 23, 19, 15, 30, 36, 39, 32, 27, 22, 19, 31,
+    38, 42, 36, 31, 26, 23, 32, 39, 44, 42, 34, 30, 24, 34, 40, 47, 45, 38, 32,
+    27, 37, 42, 48, 48, 41, 34, 27, 1,  1,  2,  2,  2,  2,  1,  2,  1,  2,  2,
+    2,  1,  1,  2,  1,  1,  2,  2,  1,  2,  2,  2,  2,  2,  2,  3,  4,  4,  5,
+    4,  5,  5,  4,  4,  9,  8,  8,  7,  6,  4,  4,  15, 13, 10, 8,  6,  4,  4,
+    2,  1,  1,  2,  1,  1,  3,  2,  1,  1,  2,  1,  1,  3,  2,  2,  0,  1,  2,
+    1,  5,  2,  3,  2,  3,  3,  3,  5,  6,  6,  6,  6,  5,  4,  5,  11, 10, 10,
+    9,  6,  5,  5,  18, 15, 12, 9,  8,  6,  5,  2,  2,  2,  2,  2,  5,  7,  2,
+    2,  3,  3,  3,  5,  7,  5,  2,  4,  4,  5,  5,  8,  8,  3,  7,  7,  8,  8,
+    9,  12, 7,  10, 11, 11, 10, 9,  15, 13, 15, 15, 13, 12, 9,  21, 19, 17, 16,
+    15, 13, 12, 5,  7,  8,  9,  9,  8,  11, 9,  7,  9,  10, 10, 10, 11, 11, 8,
+    11, 11, 12, 12, 12, 14, 10, 15, 15, 15, 15, 13, 15, 16, 18, 19, 19, 18, 17,
+    16, 22, 23, 22, 21, 20, 19, 21, 28, 27, 25, 23, 22, 21, 15, 16, 16, 16, 17,
+    16, 11, 17, 18, 18, 18, 18, 17, 11, 17, 19, 20, 21, 21, 19, 15, 17, 23, 24,
+    23, 24, 22, 19, 20, 29, 28, 28, 28, 25, 21, 24, 33, 34, 33, 31, 27, 23, 29,
+    35, 37, 33, 32, 30, 24, 26, 27, 26, 26, 23, 18, 14, 25, 30, 28, 27, 24, 20,
+    15, 26, 31, 31, 31, 26, 23, 19, 25, 33, 34, 35, 31, 26, 22, 28, 35, 40, 38,
+    36, 29, 24, 32, 39, 45, 43, 37, 32, 26, 36, 41, 46, 46, 40, 34, 28, 34, 41,
+    38, 32, 26, 22, 17, 34, 41, 41, 34, 27, 22, 19, 34, 40, 43, 37, 31, 26, 22,
+    34, 41, 47, 41, 35, 30, 26, 36, 43, 49, 44, 40, 33, 28, 39, 45, 52, 51, 43,
+    35, 30, 42, 48, 52, 51, 45, 38, 32, 2,  1,  2,  4,  3,  3,  3,  2,  1,  2,
+    3,  3,  2,  1,  2,  2,  1,  2,  2,  1,  3,  2,  2,  2,  2,  3,  3,  4,  5,
+    5,  5,  5,  5,  4,  4,  9,  9,  8,  8,  6,  4,  4,  15, 13, 10, 8,  7,  4,
+    4,  2,  2,  1,  3,  3,  4,  6,  2,  2,  1,  2,  2,  3,  5,  2,  2,  1,  0,
+    0,  3,  6,  4,  3,  3,  3,  3,  4,  7,  8,  6,  6,  7,  6,  4,  7,  12, 10,
+    10, 9,  8,  7,  7,  19, 16, 12, 10, 10, 9,  7,  2,  2,  4,  5,  6,  7,  9,
+    4,  2,  4,  6,  6,  6,  8,  7,  2,  4,  6,  7,  6,  9,  11, 3,  7,  10, 10,
+    10, 10, 14, 8,  11, 14, 14, 13, 10, 18, 13, 15, 17, 15, 15, 10, 21, 18, 18,
+    18, 17, 16, 14, 7,  7,  10, 11, 12, 10, 14, 11, 8,  11, 12, 13, 13, 13, 14,
+    8,  12, 13, 14, 14, 13, 17, 12, 16, 17, 18, 18, 15, 17, 17, 20, 21, 22, 21,
+    19, 18, 23, 26, 24, 23, 22, 21, 21, 29, 28, 27, 25, 23, 24, 17, 18, 19, 19,
+    20, 20, 14, 20, 19, 21, 21, 21, 20, 13, 19, 20, 22, 23, 23, 22, 17, 20, 25,
+    26, 27, 27, 26, 21, 22, 31, 30, 31, 32, 29, 23, 25, 35, 36, 35, 33, 30, 25,
+    30, 37, 40, 37, 36, 32, 26, 27, 30, 29, 29, 26, 22, 18, 27, 32, 31, 30, 27,
+    23, 18, 28, 34, 34, 33, 30, 25, 21, 27, 36, 39, 38, 33, 29, 25, 30, 39, 42,
+    41, 37, 32, 27, 34, 41, 47, 46, 40, 34, 29, 38, 42, 49, 50, 43, 35, 30, 36,
+    44, 41, 34, 29, 25, 20, 38, 43, 43, 36, 30, 26, 21, 38, 44, 47, 40, 34, 29,
+    25, 37, 44, 50, 44, 38, 33, 29, 39, 45, 52, 50, 42, 36, 30, 42, 49, 54, 54,
+    46, 37, 33, 47, 51, 56, 55, 49, 41, 34, 2,  1,  3,  6,  6,  4,  3,  2,  1,
+    2,  5,  6,  3,  1,  2,  2,  1,  3,  4,  2,  2,  2,  2,  2,  3,  4,  4,  4,
+    4,  5,  5,  5,  7,  5,  4,  9,  8,  8,  8,  7,  5,  4,  14, 12, 10, 7,  8,
+    5,  4,  2,  2,  1,  3,  3,  4,  5,  2,  2,  1,  2,  2,  3,  4,  2,  2,  1,
+    0,  0,  2,  4,  4,  3,  3,  3,  3,  3,  5,  8,  6,  6,  6,  6,  3,  5,  12,
+    10, 10, 9,  8,  7,  5,  18, 15, 11, 9,  9,  8,  5,  2,  2,  4,  5,  5,  6,
+    8,  5,  2,  3,  6,  6,  6,  7,  8,  2,  4,  6,  7,  4,  7,  12, 3,  7,  10,
+    10, 9,  9,  15, 8,  10, 13, 14, 13, 9,  18, 12, 14, 17, 16, 14, 9,  21, 18,
+    16, 18, 17, 16, 14, 9,  6,  10, 11, 12, 10, 13, 12, 7,  10, 12, 13, 12, 12,
+    15, 8,  12, 13, 14, 14, 12, 16, 11, 15, 17, 17, 17, 14, 18, 16, 19, 21, 22,
+    21, 17, 18, 22, 24, 24, 24, 22, 21, 20, 27, 27, 26, 25, 24, 23, 17, 17, 19,
+    19, 20, 19, 13, 20, 19, 20, 20, 21, 20, 12, 20, 20, 22, 23, 23, 22, 16, 20,
+    23, 26, 26, 27, 25, 21, 22, 29, 31, 31, 30, 28, 23, 25, 34, 37, 35, 33, 29,
+    25, 29, 37, 40, 37, 35, 32, 26, 27, 30, 29, 29, 26, 22, 17, 26, 32, 31, 30,
+    27, 22, 18, 26, 34, 34, 33, 29, 25, 21, 27, 35, 39, 37, 33, 29, 25, 30, 39,
+    44, 41, 37, 32, 26, 34, 41, 48, 46, 39, 33, 29, 37, 44, 48, 48, 43, 36, 30,
+    37, 42, 40, 33, 29, 25, 21, 37, 42, 42, 36, 29, 25, 21, 37, 42, 45, 38, 34,
+    29, 24, 37, 44, 49, 43, 36, 33, 28, 38, 46, 50, 48, 42, 35, 30, 42, 49, 53,
+    52, 45, 38, 32, 45, 49, 55, 55, 47, 40, 34, 1,  3,  5,  7,  7,  5,  3,  1,
+    1,  4,  6,  6,  4,  2,  2,  1,  3,  5,  5,  3,  2,  2,  1,  2,  4,  6,  5,
+    4,  4,  4,  4,  6,  8,  6,  4,  8,  7,  7,  8,  8,  6,  4,  13, 11, 9,  8,
+    8,  6,  4,  1,  1,  3,  5,  4,  3,  4,  1,  1,  2,  4,  4,  2,  3,  2,  1,
+    1,  3,  2,  0,  3,  2,  2,  2,  3,  3,  2,  4,  6,  5,  5,  6,  5,  4,  4,
+    11, 9,  9,  8,  6,  4,  3,  16, 13, 10, 8,  7,  6,  3,  2,  1,  3,  4,  4,
+    6,  7,  2,  2,  4,  4,  5,  5,  6,  5,  2,  3,  4,  4,  3,  5,  10, 3,  6,
+    7,  7,  7,  7,  13, 7,  9,  11, 11, 10, 7,  16, 12, 13, 14, 12, 12, 7,  19,
+    17, 15, 15, 14, 13, 12, 5,  6,  9,  10, 11, 9,  11, 11, 7,  9,  11, 11, 11,
+    10, 14, 7,  11, 11, 11, 11, 10, 16, 10, 14, 14, 15, 15, 11, 17, 15, 18, 19,
+    19, 18, 14, 16, 20, 22, 22, 20, 20, 18, 18, 25, 25, 24, 23, 21, 20, 15, 16,
+    17, 18, 18, 17, 11, 19, 17, 19, 19, 20, 18, 10, 19, 19, 20, 20, 20, 18, 14,
+    19, 22, 23, 23, 24, 22, 18, 21, 28, 28, 28, 28, 25, 20, 23, 31, 34, 32, 30,
+    27, 23, 26, 34, 36, 35, 32, 29, 24, 26, 28, 27, 27, 24, 19, 16, 25, 30, 28,
+    28, 25, 21, 16, 25, 32, 30, 29, 25, 22, 18, 25, 33, 34, 34, 30, 26, 22, 28,
+    35, 40, 38, 34, 29, 23, 31, 40, 45, 41, 36, 30, 26, 35, 40, 44, 45, 39, 33,
+    27, 36, 40, 37, 31, 25, 23, 19, 35, 40, 40, 33, 28, 23, 19, 35, 40, 42, 35,
+    30, 26, 22, 34, 41, 45, 39, 32, 30, 26, 37, 43, 48, 44, 37, 33, 28, 38, 44,
+    50, 49, 41, 35, 29, 42, 47, 49, 50, 44, 37, 31, 3,  5,  7,  9,  9,  7,  5,
+    2,  5,  7,  8,  9,  6,  4,  1,  4,  6,  7,  8,  5,  3,  1,  1,  4,  6,  8,
+    6,  5,  3,  3,  5,  6,  9,  7,  4,  7,  6,  7,  8,  8,  7,  4,  10, 9,  8,
+    8,  8,  7,  5,  1,  4,  6,  8,  7,  5,  4,  1,  3,  5,  7,  6,  4,  2,  1,
+    1,  5,  6,  4,  3,  0,  2,  1,  3,  4,  3,  3,  2,  4,  4,  4,  6,  5,  4,
+    2,  9,  8,  7,  8,  6,  4,  2,  14, 11, 8,  8,  6,  4,  2,  1,  1,  3,  3,
+    4,  5,  6,  2,  1,  3,  3,  3,  4,  5,  2,  1,  2,  2,  2,  2,  3,  4,  2,
+    4,  4,  3,  3,  4,  9,  6,  7,  7,  7,  6,  4,  12, 10, 10, 9,  9,  8,  4,
+    16, 13, 12, 11, 10, 9,  8,  2,  6,  7,  8,  8,  8,  9,  5,  6,  8,  8,  9,
+    9,  8,  9,  6,  8,  9,  9,  9,  7,  12, 8,  11, 11, 10, 11, 8,  13, 13, 15,
+    14, 15, 14, 12, 12, 17, 18, 17, 17, 15, 14, 16, 22, 21, 19, 19, 17, 16, 13,
+    14, 15, 15, 16, 15, 9,  15, 15, 16, 17, 17, 16, 8,  15, 17, 18, 17, 17, 15,
+    12, 15, 20, 20, 20, 20, 18, 15, 17, 25, 24, 25, 24, 21, 16, 20, 27, 29, 27,
+    26, 23, 18, 23, 29, 32, 29, 28, 25, 20, 23, 25, 24, 23, 21, 17, 14, 24, 27,
+    26, 25, 23, 18, 13, 23, 29, 28, 26, 22, 18, 14, 23, 30, 31, 29, 26, 22, 18,
+    26, 32, 36, 33, 29, 25, 20, 29, 35, 39, 37, 32, 26, 21, 31, 36, 40, 39, 33,
+    28, 23, 31, 37, 34, 28, 23, 20, 17, 32, 36, 35, 29, 25, 20, 16, 32, 37, 39,
+    31, 25, 22, 17, 32, 36, 40, 35, 29, 26, 21, 33, 38, 43, 39, 33, 28, 23, 36,
+    40, 43, 44, 36, 30, 25, 38, 42, 45, 45, 39, 32, 26, 2,  3,  7,  11, 11, 10,
+    6,  2,  2,  6,  10, 11, 9,  3,  2,  2,  4,  7,  9,  6,  2,  2,  2,  2,  4,
+    6,  4,  2,  2,  2,  2,  3,  5,  4,  2,  6,  6,  6,  5,  4,  4,  2,  11, 11,
+    8,  6,  4,  4,  2,  2,  2,  4,  8,  9,  5,  2,  1,  2,  3,  6,  8,  3,  2,
+    1,  2,  2,  4,  4,  2,  2,  0,  2,  2,  2,  2,  1,  2,  3,  3,  3,  3,  3,
+    2,  2,  8,  7,  8,  7,  4,  3,  2,  15, 13, 10, 7,  5,  3,  2,  1,  2,  2,
+    2,  2,  2,  2,  0,  2,  2,  2,  2,  2,  1,  1,  2,  2,  2,  1,  2,  0,  2,
+    1,  1,  1,  1,  1,  2,  5,  4,  4,  4,  4,  3,  2,  11, 10, 9,  8,  6,  3,
+    2,  17, 16, 12, 9,  6,  5,  3,  1,  1,  1,  1,  1,  2,  6,  1,  2,  3,  3,
+    3,  3,  6,  3,  3,  3,  4,  4,  4,  6,  6,  6,  6,  6,  7,  7,  8,  6,  10,
+    10, 10, 10, 10, 9,  11, 15, 15, 14, 12, 11, 10, 17, 21, 18, 16, 15, 13, 12,
+    9,  9,  9,  10, 10, 9,  6,  11, 11, 11, 11, 11, 10, 6,  11, 12, 12, 12, 13,
+    11, 7,  11, 16, 15, 15, 15, 14, 10, 14, 20, 19, 19, 20, 18, 12, 17, 23, 25,
+    23, 22, 20, 14, 21, 27, 28, 26, 24, 22, 16, 18, 19, 19, 20, 16, 12, 7,  18,
+    22, 21, 21, 18, 13, 9,  18, 23, 23, 23, 19, 15, 10, 18, 24, 27, 25, 22, 18,
+    14, 20, 27, 30, 27, 26, 21, 16, 23, 28, 34, 31, 28, 24, 18, 27, 31, 35, 34,
+    30, 25, 20, 26, 32, 29, 24, 20, 15, 10, 26, 31, 32, 26, 21, 16, 11, 26, 32,
+    33, 28, 23, 18, 14, 25, 31, 36, 29, 26, 22, 18, 26, 31, 37, 34, 29, 25, 20,
+    30, 34, 38, 36, 30, 26, 22, 31, 36, 37, 37, 32, 29, 24, 2,  3,  4,  4,  4,
+    4,  3,  2,  3,  4,  4,  4,  3,  3,  1,  2,  3,  4,  4,  3,  1,  1,  1,  2,
+    2,  2,  2,  2,  2,  2,  2,  2,  3,  2,  2,  6,  6,  6,  5,  3,  2,  2,  11,
+    10, 7,  6,  4,  2,  2,  1,  3,  3,  4,  3,  3,  3,  1,  2,  3,  4,  3,  3,
+    2,  1,  2,  3,  3,  3,  2,  1,  2,  0,  1,  2,  2,  1,  2,  3,  3,  3,  3,
+    3,  2,  2,  8,  7,  7,  6,  4,  2,  2,  15, 12, 9,  7,  5,  3,  2,  1,  2,
+    2,  3,  3,  3,  5,  2,  1,  2,  3,  3,  3,  5,  2,  1,  2,  2,  2,  2,  4,
+    2,  1,  2,  2,  2,  2,  5,  6,  5,  5,  5,  5,  5,  5,  11, 10, 10, 9,  7,
+    6,  5,  17, 15, 12, 10, 9,  7,  6,  2,  4,  5,  5,  6,  6,  9,  2,  5,  6,
+    7,  7,  7,  8,  6,  6,  7,  7,  7,  8,  9,  9,  8,  9,  9,  9,  9,  9,  9,
+    13, 13, 13, 13, 13, 11, 11, 18, 17, 16, 15, 14, 13, 17, 25, 20, 19, 17, 15,
+    14, 12, 12, 13, 13, 14, 12, 9,  13, 14, 14, 14, 15, 13, 9,  13, 15, 16, 16,
+    16, 14, 10, 13, 18, 18, 18, 18, 17, 13, 16, 23, 22, 22, 22, 20, 15, 20, 26,
+    27, 26, 24, 22, 16, 24, 29, 31, 27, 26, 24, 17, 22, 23, 22, 22, 20, 15, 11,
+    21, 25, 24, 24, 21, 16, 12, 21, 27, 26, 26, 21, 17, 13, 22, 27, 29, 27, 24,
+    20, 16, 23, 29, 34, 32, 28, 23, 18, 26, 32, 39, 37, 32, 26, 20, 29, 35, 40,
+    40, 34, 27, 22, 29, 36, 35, 28, 22, 18, 14, 29, 36, 38, 30, 24, 19, 15, 30,
+    37, 39, 31, 25, 20, 17, 30, 34, 41, 34, 29, 24, 20, 29, 37, 42, 39, 34, 28,
+    22, 32, 38, 44, 43, 37, 30, 24, 35, 41, 45, 46, 39, 32, 25, 2,  3,  4,  5,
+    5,  5,  4,  2,  3,  4,  5,  5,  4,  3,  2,  2,  3,  4,  4,  2,  1,  2,  1,
+    2,  2,  2,  1,  2,  3,  2,  2,  3,  3,  2,  2,  6,  6,  6,  5,  3,  2,  2,
+    12, 10, 7,  5,  4,  2,  2,  2,  2,  3,  4,  4,  4,  5,  2,  2,  3,  4,  4,
+    3,  4,  2,  2,  2,  3,  3,  2,  2,  2,  2,  0,  1,  2,  1,  3,  4,  3,  3,
+    3,  3,  2,  4,  9,  8,  7,  6,  4,  2,  4,  16, 13, 9,  7,  5,  3,  3,  2,
+    2,  3,  4,  5,  6,  8,  2,  2,  3,  4,  5,  5,  8,  2,  2,  3,  4,  4,  4,
+    6,  5,  2,  4,  5,  5,  5,  7,  9,  5,  8,  8,  8,  7,  7,  12, 10, 12, 11,
+    10, 9,  7,  17, 16, 15, 13, 11, 10, 9,  2,  6,  8,  9,  10, 9,  11, 5,  7,
+    9,  10, 11, 11, 12, 9,  8,  10, 10, 10, 11, 11, 12, 9,  12, 12, 12, 13, 11,
+    12, 14, 15, 15, 16, 16, 14, 13, 20, 21, 20, 18, 17, 16, 18, 26, 24, 22, 19,
+    18, 17, 13, 15, 16, 17, 18, 17, 11, 15, 17, 17, 18, 19, 17, 11, 15, 18, 19,
+    18, 19, 18, 13, 15, 22, 21, 20, 21, 20, 16, 17, 26, 26, 25, 25, 23, 17, 22,
+    30, 31, 30, 27, 24, 19, 26, 33, 34, 32, 29, 26, 21, 25, 27, 26, 26, 23, 20,
+    15, 24, 29, 28, 27, 24, 20, 16, 25, 31, 30, 30, 25, 20, 16, 24, 31, 32, 32,
+    28, 23, 19, 26, 32, 36, 36, 32, 26, 21, 29, 35, 42, 41, 35, 28, 23, 33, 38,
+    42, 42, 37, 30, 25, 33, 40, 37, 32, 27, 22, 18, 32, 39, 40, 33, 27, 22, 18,
+    34, 40, 43, 35, 28, 23, 19, 33, 38, 44, 38, 32, 28, 23, 34, 40, 45, 43, 36,
+    31, 25, 36, 43, 48, 47, 40, 33, 26, 38, 44, 49, 49, 42, 35, 28, 2,  3,  5,
+    6,  6,  6,  4,  2,  3,  4,  6,  6,  4,  3,  2,  2,  3,  4,  4,  2,  1,  2,
+    2,  1,  2,  2,  1,  2,  3,  2,  2,  3,  3,  2,  2,  7,  6,  6,  5,  4,  2,
+    2,  12, 10, 8,  5,  4,  2,  2,  2,  3,  3,  5,  5,  6,  7,  2,  2,  3,  5,
+    5,  4,  5,  2,  2,  3,  3,  3,  3,  4,  2,  2,  2,  0,  0,  2,  5,  5,  4,
+    3,  4,  3,  3,  4,  9,  8,  7,  7,  5,  4,  5,  15, 13, 9,  8,  7,  5,  5,
+    2,  2,  5,  6,  7,  8,  10, 2,  2,  5,  6,  7,  7,  9,  4,  2,  5,  6,  6,
+    6,  8,  8,  2,  5,  7,  7,  7,  8,  11, 6,  8,  10, 11, 10, 8,  15, 11, 12,
+    13, 12, 11, 8,  17, 15, 15, 16, 14, 13, 11, 4,  7,  11, 11, 12, 11, 14, 8,
+    7,  11, 12, 13, 13, 14, 11, 8,  12, 13, 13, 13, 13, 14, 10, 14, 14, 15, 14,
+    13, 14, 14, 17, 18, 18, 18, 16, 15, 20, 22, 21, 20, 19, 18, 17, 26, 25, 24,
+    22, 21, 20, 15, 17, 18, 19, 20, 19, 14, 17, 19, 20, 21, 21, 20, 14, 17, 20,
+    21, 22, 22, 20, 16, 17, 23, 24, 24, 23, 23, 19, 19, 27, 28, 28, 28, 26, 20,
+    22, 31, 33, 32, 30, 27, 22, 27, 34, 37, 34, 32, 29, 23, 27, 29, 29, 28, 26,
+    22, 18, 27, 32, 30, 30, 27, 22, 18, 27, 33, 33, 32, 28, 23, 18, 27, 33, 35,
+    34, 30, 25, 21, 28, 36, 40, 38, 35, 29, 24, 31, 38, 45, 43, 36, 30, 26, 34,
+    40, 45, 46, 39, 34, 27, 37, 42, 41, 35, 29, 25, 20, 36, 42, 43, 37, 30, 25,
+    21, 36, 43, 45, 38, 31, 26, 22, 37, 42, 48, 41, 35, 30, 25, 37, 43, 49, 46,
+    39, 33, 28, 38, 46, 51, 50, 42, 35, 30, 41, 47, 52, 53, 45, 38, 32, 2,  3,
+    6,  9,  9,  7,  5,  2,  3,  5,  8,  9,  6,  3,  2,  2,  3,  6,  7,  4,  1,
+    2,  1,  1,  3,  5,  3,  2,  3,  2,  2,  3,  5,  3,  2,  6,  6,  6,  5,  5,
+    4,  2,  11, 9,  7,  5,  5,  3,  2,  2,  2,  3,  7,  6,  6,  7,  2,  2,  3,
+    5,  6,  5,  5,  2,  2,  3,  3,  3,  3,  4,  2,  2,  2,  0,  0,  1,  4,  5,
+    3,  3,  3,  3,  2,  4,  9,  7,  7,  6,  5,  4,  4,  14, 11, 8,  7,  6,  5,
+    4,  1,  2,  5,  6,  7,  8,  9,  2,  2,  5,  6,  7,  7,  8,  5,  2,  4,  6,
+    6,  5,  7,  8,  2,  5,  7,  7,  7,  7,  12, 5,  8,  10, 11, 10, 7,  15, 11,
+    11, 13, 12, 11, 7,  16, 14, 13, 14, 14, 13, 11, 5,  6,  10, 11, 12, 11, 13,
+    9,  7,  11, 12, 13, 13, 12, 11, 7,  11, 12, 13, 13, 11, 14, 9,  13, 14, 14,
+    14, 12, 15, 14, 17, 19, 19, 18, 15, 14, 18, 21, 22, 21, 19, 18, 16, 23, 23,
+    22, 22, 21, 20, 15, 16, 18, 19, 20, 19, 14, 18, 18, 20, 21, 21, 20, 13, 18,
+    19, 21, 22, 21, 19, 15, 17, 22, 24, 24, 23, 22, 18, 19, 26, 28, 27, 28, 25,
+    20, 21, 30, 32, 31, 30, 27, 22, 24, 34, 36, 34, 32, 29, 23, 26, 29, 29, 29,
+    26, 22, 17, 26, 31, 31, 30, 27, 22, 17, 26, 33, 33, 32, 27, 22, 18, 26, 33,
+    35, 34, 30, 25, 21, 28, 35, 39, 38, 35, 29, 24, 31, 37, 44, 42, 37, 31, 25,
+    34, 38, 44, 45, 39, 34, 27, 36, 42, 41, 33, 29, 25, 20, 37, 43, 43, 36, 30,
+    25, 21, 36, 42, 45, 38, 31, 26, 22, 36, 42, 46, 41, 34, 29, 25, 37, 43, 48,
+    45, 39, 33, 27, 38, 46, 51, 50, 42, 35, 29, 40, 47, 51, 51, 43, 36, 31, 3,
+    4,  6,  8,  8,  6,  4,  3,  3,  5,  7,  7,  5,  3,  2,  3,  4,  6,  6,  4,
+    2,  1,  1,  2,  4,  5,  3,  2,  2,  2,  2,  4,  6,  4,  2,  6,  5,  5,  5,
+    6,  4,  2,  9,  7,  5,  5,  6,  4,  2,  2,  3,  4,  6,  5,  6,  6,  2,  3,
+    4,  5,  5,  4,  4,  1,  2,  3,  4,  3,  2,  3,  1,  1,  1,  2,  1,  0,  3,
+    4,  3,  3,  3,  3,  2,  3,  8,  6,  5,  5,  3,  2,  2,  11, 8,  6,  5,  5,
+    4,  3,  1,  2,  5,  5,  6,  8,  9,  2,  2,  5,  6,  6,  6,  7,  3,  1,  5,
+    5,  5,  5,  6,  8,  1,  4,  5,  5,  5,  5,  11, 5,  7,  9,  9,  8,  5,  12,
+    9,  9,  11, 10, 9,  5,  13, 11, 10, 12, 11, 11, 10, 3,  6,  10, 11, 11, 11,
+    12, 8,  7,  11, 12, 12, 12, 11, 11, 7,  11, 12, 12, 12, 10, 14, 8,  12, 13,
+    13, 13, 10, 15, 13, 15, 17, 17, 16, 13, 12, 16, 18, 19, 18, 18, 16, 13, 19,
+    21, 20, 19, 19, 18, 14, 16, 18, 19, 20, 19, 13, 17, 18, 19, 20, 20, 19, 12,
+    17, 18, 21, 20, 20, 19, 15, 17, 21, 22, 22, 23, 21, 17, 19, 26, 26, 26, 25,
+    24, 18, 20, 28, 30, 29, 27, 25, 20, 21, 29, 32, 30, 29, 27, 21, 25, 28, 28,
+    28, 24, 21, 17, 26, 30, 29, 29, 26, 21, 17, 26, 32, 31, 29, 26, 21, 18, 25,
+    32, 34, 31, 27, 24, 20, 28, 33, 38, 35, 31, 27, 22, 29, 35, 41, 39, 33, 28,
+    24, 30, 36, 42, 40, 36, 31, 26, 35, 40, 39, 32, 27, 23, 19, 35, 40, 41, 34,
+    29, 24, 20, 36, 41, 43, 35, 29, 25, 20, 36, 39, 43, 38, 33, 28, 23, 35, 42,
+    45, 42, 36, 30, 26, 38, 43, 47, 45, 39, 32, 27, 38, 43, 47, 47, 41, 33, 29,
+    4,  7,  8,  11, 10, 9,  6,  4,  6,  8,  10, 10, 7,  5,  3,  5,  7,  8,  9,
+    6,  3,  3,  3,  5,  7,  8,  5,  3,  1,  0,  3,  5,  7,  5,  3,  2,  2,  4,
+    5,  7,  5,  3,  4,  3,  3,  4,  6,  5,  3,  4,  5,  7,  9,  8,  6,  7,  3,
+    4,  6,  8,  7,  5,  4,  2,  3,  5,  7,  5,  3,  2,  2,  2,  3,  5,  4,  3,
+    0,  1,  1,  2,  4,  3,  2,  0,  4,  3,  3,  4,  2,  2,  0,  7,  4,  3,  3,
+    3,  1,  0,  3,  4,  4,  5,  7,  8,  8,  2,  3,  5,  6,  6,  6,  6,  2,  3,
+    5,  4,  4,  4,  5,  3,  2,  3,  3,  2,  3,  3,  6,  2,  4,  4,  4,  4,  3,
+    7,  4,  5,  5,  5,  5,  3,  8,  6,  6,  7,  6,  6,  6,  2,  7,  8,  8,  9,
+    10, 11, 3,  7,  9,  9,  10, 10, 9,  8,  7,  9,  9,  10, 10, 8,  11, 7,  10,
+    10, 10, 10, 7,  10, 9,  11, 11, 12, 11, 11, 7,  11, 13, 13, 13, 13, 12, 8,
+    14, 15, 15, 14, 14, 14, 12, 15, 15, 16, 17, 16, 11, 14, 16, 17, 18, 17, 15,
+    9,  14, 18, 18, 18, 18, 16, 12, 14, 20, 19, 18, 18, 17, 13, 14, 21, 22, 21,
+    20, 18, 14, 14, 22, 24, 23, 22, 20, 15, 16, 22, 27, 25, 23, 21, 17, 24, 27,
+    24, 24, 22, 18, 14, 24, 28, 27, 26, 23, 18, 14, 24, 29, 29, 26, 22, 19, 15,
+    24, 30, 30, 27, 24, 20, 15, 23, 30, 32, 30, 25, 21, 17, 24, 30, 36, 33, 27,
+    23, 19, 25, 30, 35, 34, 30, 25, 20, 32, 37, 34, 29, 24, 20, 17, 33, 37, 37,
+    30, 26, 21, 16, 32, 38, 39, 32, 26, 22, 17, 32, 37, 40, 33, 27, 23, 19, 31,
+    37, 40, 36, 30, 24, 20, 31, 37, 41, 38, 32, 27, 21, 33, 36, 42, 40, 34, 28,
+    23, 5,  7,  10, 14, 14, 11, 8,  5,  6,  9,  13, 14, 11, 8,  4,  6,  8,  11,
+    13, 10, 6,  4,  4,  5,  8,  11, 8,  2,  2,  2,  2,  4,  6,  6,  2,  3,  3,
+    3,  3,  5,  6,  2,  9,  8,  5,  3,  4,  6,  2,  4,  6,  8,  11, 11, 8,  6,
+    4,  5,  7,  9,  10, 7,  5,  3,  5,  6,  8,  8,  6,  4,  3,  3,  4,  5,  5,
+    4,  1,  0,  2,  2,  2,  2,  2,  1,  5,  5,  5,  4,  2,  2,  1,  12, 10, 7,
+    5,  2,  2,  1,  4,  5,  5,  6,  7,  6,  5,  3,  4,  5,  5,  5,  5,  5,  2,
+    4,  4,  4,  4,  4,  4,  2,  2,  2,  3,  3,  3,  1,  2,  2,  2,  2,  2,  1,
+    1,  8,  7,  7,  5,  3,  1,  1,  14, 14, 9,  6,  4,  1,  1,  2,  4,  4,  5,
+    5,  6,  6,  2,  3,  5,  5,  5,  5,  6,  2,  3,  4,  5,  5,  5,  6,  3,  4,
+    4,  4,  5,  5,  6,  3,  7,  7,  7,  7,  7,  6,  8,  13, 12, 11, 9,  8,  8,
+    14, 18, 15, 13, 11, 10, 9,  9,  9,  10, 10, 11, 9,  6,  10, 11, 11, 11, 12,
+    10, 6,  10, 12, 12, 12, 13, 12, 7,  10, 14, 13, 13, 14, 12, 8,  11, 17, 17,
+    16, 16, 15, 9,  14, 19, 21, 20, 19, 16, 11, 18, 22, 24, 21, 20, 19, 13, 17,
+    20, 20, 20, 17, 12, 8,  18, 22, 21, 21, 18, 13, 9,  17, 23, 23, 22, 19, 15,
+    10, 18, 22, 24, 23, 20, 16, 11, 17, 23, 26, 24, 22, 19, 13, 19, 25, 28, 27,
+    23, 20, 15, 22, 26, 29, 27, 24, 21, 17, 25, 30, 28, 25, 20, 15, 11, 26, 30,
+    31, 26, 22, 16, 12, 26, 31, 33, 27, 22, 18, 13, 26, 30, 33, 27, 23, 19, 15,
+    24, 29, 32, 29, 24, 21, 17, 25, 28, 32, 31, 26, 22, 19, 27, 30, 32, 32, 28,
+    23, 20, 5,  6,  7,  8,  8,  7,  7,  5,  6,  7,  8,  8,  7,  6,  4,  5,  6,
+    7,  7,  5,  4,  3,  4,  5,  5,  5,  3,  2,  1,  2,  2,  2,  3,  2,  1,  3,
+    3,  3,  2,  3,  2,  1,  9,  7,  5,  3,  2,  2,  2,  4,  5,  7,  7,  7,  7,
+    7,  4,  5,  6,  7,  7,  6,  5,  3,  4,  6,  6,  6,  5,  4,  3,  3,  3,  4,
+    3,  3,  1,  2,  0,  2,  2,  2,  1,  1,  5,  4,  4,  3,  1,  2,  1,  12, 9,
+    6,  4,  2,  1,  1,  3,  5,  5,  6,  7,  7,  8,  3,  4,  5,  6,  6,  6,  7,
+    2,  3,  4,  5,  5,  5,  5,  3,  2,  2,  2,  2,  2,  3,  3,  2,  2,  2,  2,
+    2,  3,  8,  7,  6,  5,  4,  3,  3,  14, 12, 9,  7,  5,  4,  4,  3,  5,  6,
+    7,  8,  9,  10, 2,  5,  6,  7,  8,  8,  9,  3,  6,  6,  6,  7,  7,  8,  6,
+    6,  7,  7,  7,  8,  8,  6,  10, 9,  10, 10, 9,  9,  8,  15, 14, 13, 12, 10,
+    10, 14, 21, 18, 15, 13, 12, 11, 11, 12, 12, 13, 14, 13, 10, 12, 14, 14, 14,
+    15, 14, 9,  12, 15, 15, 15, 15, 14, 9,  13, 17, 16, 15, 16, 15, 11, 13, 20,
+    19, 19, 19, 17, 12, 17, 22, 24, 23, 20, 18, 13, 21, 26, 28, 25, 23, 21, 15,
+    21, 22, 21, 23, 20, 16, 11, 21, 24, 24, 24, 21, 16, 12, 21, 26, 27, 25, 22,
+    17, 12, 21, 26, 27, 26, 22, 17, 13, 20, 26, 29, 29, 25, 20, 15, 22, 28, 35,
+    34, 28, 22, 17, 25, 33, 36, 36, 31, 25, 18, 29, 36, 35, 28, 22, 19, 14, 29,
+    35, 37, 29, 24, 19, 15, 30, 36, 39, 30, 25, 20, 15, 29, 35, 39, 32, 26, 21,
+    17, 28, 34, 38, 36, 31, 24, 19, 29, 35, 41, 40, 32, 27, 21, 32, 37, 43, 41,
+    35, 28, 23, 5,  7,  8,  9,  9,  9,  8,  5,  6,  7,  9,  9,  7,  6,  4,  5,
+    7,  7,  7,  5,  4,  4,  4,  4,  5,  5,  3,  1,  2,  1,  2,  2,  2,  2,  1,
+    3,  3,  3,  2,  2,  2,  1,  8,  7,  4,  2,  2,  2,  1,  4,  5,  7,  8,  8,
+    8,  8,  4,  5,  7,  8,  8,  7,  7,  4,  5,  6,  6,  6,  5,  4,  3,  3,  3,
+    4,  3,  3,  2,  2,  2,  0,  1,  1,  1,  2,  5,  4,  4,  3,  1,  1,  2,  12,
+    9,  6,  3,  2,  1,  2,  4,  5,  6,  7,  8,  10, 10, 3,  4,  6,  7,  8,  8,
+    9,  3,  4,  6,  6,  6,  6,  7,  3,  3,  4,  4,  4,  5,  6,  5,  2,  4,  5,
+    5,  4,  5,  9,  7,  9,  8,  6,  5,  6,  14, 12, 11, 9,  8,  7,  7,  3,  7,
+    8,  9,  10, 12, 12, 3,  7,  9,  10, 10, 10, 11, 7,  8,  9,  10, 10, 10, 11,
+    10, 7,  10, 10, 10, 10, 10, 9,  11, 12, 12, 12, 12, 11, 9,  16, 17, 15, 14,
+    13, 13, 14, 22, 20, 18, 16, 15, 14, 13, 15, 15, 16, 17, 16, 12, 14, 16, 17,
+    17, 18, 16, 11, 14, 18, 19, 18, 17, 17, 13, 14, 19, 19, 19, 19, 17, 13, 14,
+    23, 21, 21, 20, 19, 14, 18, 25, 27, 25, 23, 21, 16, 23, 28, 31, 28, 25, 23,
+    18, 24, 25, 26, 26, 22, 18, 14, 23, 29, 26, 28, 24, 19, 15, 24, 29, 30, 28,
+    24, 20, 15, 24, 29, 30, 30, 26, 20, 16, 23, 29, 33, 32, 28, 23, 17, 26, 31,
+    38, 37, 30, 24, 19, 28, 34, 39, 38, 33, 26, 21, 33, 39, 38, 31, 26, 20, 17,
+    33, 39, 41, 32, 27, 22, 17, 33, 40, 42, 34, 27, 23, 18, 33, 38, 43, 36, 29,
+    24, 19, 31, 37, 42, 39, 33, 28, 21, 32, 37, 44, 44, 35, 29, 23, 34, 41, 45,
+    45, 38, 32, 25, 5,  6,  9,  10, 10, 9,  8,  5,  6,  8,  9,  9,  8,  6,  4,
+    5,  7,  8,  7,  6,  4,  4,  4,  4,  5,  6,  4,  2,  2,  2,  2,  2,  3,  2,
+    1,  3,  3,  3,  2,  2,  2,  1,  8,  7,  4,  2,  2,  2,  1,  4,  6,  7,  9,
+    9,  9,  10, 4,  5,  6,  8,  9,  8,  8,  4,  5,  6,  6,  6,  6,  6,  3,  3,
+    3,  4,  3,  3,  3,  2,  2,  2,  0,  0,  1,  4,  6,  5,  4,  3,  2,  2,  4,
+    11, 8,  6,  4,  3,  2,  4,  4,  5,  7,  9,  10, 11, 12, 3,  4,  8,  9,  9,
+    10, 10, 3,  4,  7,  8,  8,  8,  8,  6,  3,  5,  6,  6,  6,  7,  8,  3,  5,
+    7,  7,  6,  7,  11, 7,  9,  10, 8,  8,  7,  13, 11, 11, 12, 10, 9,  9,  3,
+    8,  10, 11, 12, 13, 14, 6,  8,  11, 12, 13, 13, 13, 9,  8,  11, 12, 13, 12,
+    13, 12, 8,  12, 12, 13, 13, 11, 11, 11, 14, 14, 15, 14, 14, 11, 16, 18, 18,
+    16, 16, 16, 13, 20, 21, 20, 18, 17, 17, 13, 17, 18, 19, 19, 19, 15, 16, 18,
+    19, 20, 21, 19, 13, 15, 19, 21, 21, 21, 19, 15, 16, 21, 22, 21, 22, 20, 15,
+    15, 24, 25, 24, 24, 22, 17, 19, 27, 29, 28, 26, 23, 18, 22, 28, 32, 30, 29,
+    25, 20, 26, 29, 28, 28, 26, 22, 17, 27, 31, 31, 30, 26, 22, 17, 26, 34, 33,
+    32, 27, 22, 18, 26, 33, 34, 32, 27, 23, 18, 25, 32, 36, 35, 31, 25, 20, 27,
+    35, 40, 39, 33, 28, 22, 30, 36, 41, 42, 35, 30, 24, 37, 42, 40, 34, 28, 24,
+    20, 36, 43, 43, 35, 30, 23, 20, 36, 42, 45, 37, 31, 24, 20, 36, 41, 46, 39,
+    32, 26, 22, 35, 40, 45, 42, 34, 30, 24, 35, 42, 47, 46, 38, 32, 25, 38, 43,
+    48, 48, 41, 34, 27, 5,  6,  9,  12, 13, 10, 8,  5,  6,  8,  12, 12, 9,  6,
+    4,  5,  7,  9,  10, 7,  3,  4,  4,  4,  6,  8,  5,  2,  2,  1,  1,  3,  6,
+    4,  1,  3,  2,  2,  2,  4,  4,  1,  5,  3,  2,  2,  3,  4,  1,  4,  5,  7,
+    10, 10, 9,  9,  4,  5,  6,  9,  9,  7,  7,  3,  4,  5,  7,  6,  5,  5,  3,
+    3,  3,  3,  3,  3,  3,  2,  2,  1,  0,  0,  1,  3,  4,  3,  2,  2,  2,  1,
+    3,  7,  4,  3,  2,  3,  2,  3,  4,  5,  7,  8,  10, 11, 11, 3,  4,  7,  9,
+    9,  9,  9,  3,  4,  7,  7,  7,  7,  8,  7,  2,  4,  6,  6,  6,  6,  9,  2,
+    5,  7,  7,  7,  6,  9,  4,  6,  9,  9,  8,  6,  9,  7,  7,  10, 9,  9,  9,
+    3,  7,  11, 11, 12, 13, 14, 8,  7,  11, 12, 13, 13, 13, 11, 8,  12, 12, 13,
+    12, 12, 12, 7,  12, 13, 13, 13, 11, 12, 10, 14, 14, 15, 15, 14, 10, 12, 15,
+    16, 16, 16, 15, 9,  15, 18, 18, 17, 17, 17, 14, 17, 18, 19, 20, 20, 14, 16,
+    18, 20, 20, 21, 19, 13, 16, 19, 21, 21, 21, 19, 15, 16, 21, 21, 22, 22, 20,
+    16, 15, 24, 24, 24, 24, 22, 17, 16, 24, 28, 27, 26, 23, 18, 18, 27, 30, 28,
+    27, 25, 20, 27, 30, 28, 28, 25, 22, 18, 26, 31, 30, 31, 27, 22, 17, 26, 34,
+    33, 31, 26, 22, 18, 26, 32, 34, 32, 28, 23, 18, 25, 32, 37, 35, 31, 26, 20,
+    26, 33, 39, 38, 32, 28, 22, 27, 34, 40, 40, 35, 29, 24, 37, 43, 40, 34, 30,
+    24, 21, 37, 42, 43, 36, 30, 25, 20, 37, 42, 45, 36, 30, 26, 21, 36, 41, 46,
+    38, 31, 27, 22, 35, 41, 44, 40, 34, 28, 24, 36, 42, 46, 45, 38, 31, 26, 35,
+    41, 46, 45, 40, 33, 28, 4,  5,  6,  8,  8,  7,  6,  4,  4,  5,  8,  8,  5,
+    4,  3,  4,  5,  6,  6,  4,  2,  3,  3,  3,  4,  6,  3,  1,  2,  1,  0,  2,
+    5,  3,  1,  2,  2,  2,  3,  4,  3,  1,  4,  3,  2,  3,  3,  3,  1,  4,  4,
+    5,  6,  6,  7,  8,  3,  4,  5,  6,  6,  6,  6,  3,  4,  4,  4,  3,  4,  4,
+    2,  2,  2,  3,  2,  2,  2,  2,  1,  1,  1,  1,  0,  2,  3,  2,  2,  2,  1,
+    1,  2,  7,  4,  2,  2,  3,  2,  2,  3,  4,  6,  7,  8,  9,  10, 2,  3,  6,
+    7,  7,  8,  9,  3,  3,  6,  6,  6,  6,  7,  7,  2,  4,  6,  6,  5,  5,  9,
+    2,  4,  6,  7,  7,  5,  10, 4,  5,  7,  8,  8,  5,  9,  7,  6,  8,  9,  9,
+    9,  3,  7,  10, 11, 12, 12, 13, 8,  7,  11, 12, 13, 12, 12, 12, 8,  12, 12,
+    12, 12, 11, 14, 7,  11, 13, 13, 13, 10, 14, 10, 12, 14, 14, 14, 13, 11, 12,
+    14, 15, 16, 16, 15, 9,  15, 16, 17, 17, 17, 17, 14, 17, 19, 19, 20, 19, 13,
+    17, 18, 19, 20, 20, 19, 12, 17, 19, 20, 21, 20, 19, 15, 17, 21, 21, 21, 22,
+    20, 15, 16, 22, 24, 24, 23, 22, 17, 15, 23, 26, 26, 24, 22, 18, 16, 24, 28,
+    27, 26, 24, 20, 26, 29, 28, 28, 25, 21, 17, 26, 31, 30, 30, 26, 22, 17, 26,
+    33, 32, 31, 26, 22, 17, 26, 32, 33, 32, 27, 23, 18, 25, 32, 35, 33, 30, 25,
+    20, 26, 33, 38, 36, 30, 26, 21, 26, 33, 38, 39, 33, 27, 23, 36, 41, 38, 32,
+    27, 24, 20, 35, 41, 42, 34, 29, 25, 20, 35, 41, 44, 36, 30, 25, 20, 35, 40,
+    45, 37, 31, 26, 22, 35, 40, 44, 40, 33, 27, 23, 34, 40, 44, 43, 36, 30, 25,
+    35, 40, 45, 45, 37, 31, 25, 4,  6,  9,  11, 10, 9,  6,  4,  6,  8,  10, 10,
+    7,  4,  3,  5,  7,  8,  9,  6,  4,  3,  3,  5,  7,  8,  5,  3,  1,  0,  3,
+    5,  7,  5,  3,  2,  2,  4,  5,  7,  5,  3,  4,  3,  3,  4,  6,  5,  3,  4,
+    5,  7,  9,  8,  7,  6,  3,  4,  6,  8,  7,  5,  4,  3,  4,  5,  6,  5,  3,
+    2,  2,  2,  4,  5,  4,  3,  0,  1,  1,  2,  3,  3,  2,  0,  3,  2,  3,  4,
+    2,  2,  0,  6,  4,  3,  3,  2,  1,  0,  3,  4,  4,  5,  7,  8,  8,  2,  3,
+    5,  6,  6,  6,  6,  2,  3,  5,  4,  4,  4,  5,  3,  2,  3,  3,  3,  3,  3,
+    6,  2,  4,  4,  4,  4,  3,  7,  4,  5,  5,  5,  5,  3,  9,  7,  6,  6,  6,
+    6,  6,  2,  7,  8,  9,  9,  10, 11, 3,  7,  9,  9,  10, 10, 9,  8,  7,  9,
+    9,  10, 9,  8,  11, 7,  10, 10, 9,  10, 7,  10, 9,  11, 11, 12, 11, 10, 8,
+    11, 13, 13, 13, 13, 12, 8,  14, 15, 15, 14, 14, 13, 13, 15, 16, 16, 16, 16,
+    11, 14, 17, 17, 17, 18, 16, 10, 14, 18, 18, 18, 18, 16, 12, 14, 20, 19, 18,
+    18, 17, 13, 14, 21, 21, 20, 20, 18, 14, 15, 22, 24, 23, 21, 19, 15, 16, 23,
+    26, 24, 24, 20, 17, 24, 25, 24, 24, 21, 18, 14, 24, 28, 27, 25, 22, 18, 14,
+    24, 30, 29, 27, 22, 19, 15, 23, 29, 30, 27, 23, 20, 15, 23, 29, 32, 30, 26,
+    22, 17, 24, 30, 36, 33, 28, 23, 18, 25, 30, 35, 35, 29, 25, 20, 32, 37, 34,
+    29, 23, 20, 17, 32, 37, 36, 30, 25, 21, 17, 33, 37, 39, 31, 26, 22, 17, 32,
+    37, 40, 33, 27, 23, 18, 31, 38, 39, 36, 29, 25, 20, 31, 36, 40, 39, 32, 26,
+    20, 32, 36, 41, 40, 34, 28, 23, 10, 12, 14, 17, 18, 16, 13, 10, 11, 13, 17,
+    17, 14, 12, 9,  11, 12, 14, 15, 12, 10, 9,  9,  10, 11, 14, 9,  4,  6,  7,
+    7,  8,  8,  7,  4,  2,  2,  3,  3,  6,  7,  4,  5,  4,  2,  3,  5,  8,  4,
+    9,  11, 12, 15, 15, 14, 12, 9,  10, 12, 14, 14, 12, 11, 8,  10, 11, 12, 12,
+    11, 9,  8,  8,  9,  9,  9,  8,  3,  5,  5,  5,  5,  4,  4,  3,  0,  2,  2,
+    2,  3,  3,  3,  8,  6,  3,  2,  2,  3,  3,  8,  10, 11, 11, 13, 13, 12, 8,
+    9,  11, 11, 12, 12, 11, 7,  8,  10, 10, 10, 10, 9,  7,  7,  7,  7,  8,  7,
+    4,  3,  3,  4,  4,  3,  3,  3,  3,  2,  2,  1,  2,  2,  3,  9,  9,  5,  2,
+    1,  3,  3,  7,  9,  10, 11, 12, 13, 13, 7,  8,  10, 11, 12, 12, 12, 6,  8,
+    9,  10, 10, 10, 10, 4,  7,  7,  7,  7,  7,  5,  2,  3,  4,  4,  4,  4,  5,
+    3,  8,  7,  7,  6,  6,  6,  9,  13, 11, 9,  7,  7,  8,  7,  8,  9,  11, 12,
+    13, 13, 8,  9,  9,  10, 11, 11, 12, 8,  10, 11, 11, 11, 9,  9,  9,  12, 12,
+    11, 12, 11, 6,  8,  13, 13, 14, 14, 13, 8,  9,  15, 16, 15, 15, 15, 10, 13,
+    17, 18, 16, 16, 16, 12, 16, 18, 19, 19, 15, 12, 13, 16, 20, 20, 20, 16, 12,
+    11, 16, 22, 22, 21, 18, 12, 9,  16, 21, 21, 21, 19, 14, 10, 15, 21, 22, 21,
+    18, 16, 12, 16, 20, 22, 21, 19, 16, 13, 17, 21, 23, 22, 20, 17, 15, 24, 28,
+    27, 23, 18, 14, 12, 24, 28, 28, 24, 20, 15, 10, 24, 28, 30, 23, 21, 16, 11,
+    24, 27, 29, 25, 20, 18, 13, 22, 26, 28, 25, 20, 18, 15, 22, 25, 27, 26, 20,
+    18, 16, 22, 24, 27, 28, 22, 19, 16, 9,  11, 12, 13, 13, 13, 12, 9,  10, 12,
+    13, 13, 11, 10, 8,  10, 11, 11, 11, 10, 8,  8,  8,  9,  9,  9,  6,  3,  5,
+    6,  6,  6,  4,  3,  2,  2,  2,  2,  2,  3,  3,  3,  4,  3,  2,  2,  3,  3,
+    3,  8,  10, 11, 12, 13, 13, 12, 8,  9,  10, 12, 12, 11, 10, 7,  9,  10, 10,
+    10, 9,  7,  7,  7,  7,  8,  7,  6,  2,  5,  4,  4,  5,  3,  2,  2,  2,  0,
+    1,  2,  2,  2,  2,  7,  5,  2,  2,  2,  2,  2,  8,  9,  10, 11, 12, 13, 13,
+    7,  8,  10, 11, 11, 11, 11, 7,  8,  9,  9,  9,  9,  8,  7,  7,  6,  6,  7,
+    6,  4,  3,  3,  3,  3,  2,  3,  3,  3,  3,  2,  2,  2,  3,  3,  9,  8,  5,
+    3,  3,  3,  4,  7,  9,  10, 11, 13, 14, 14, 7,  9,  10, 11, 12, 12, 12, 5,
+    9,  10, 10, 10, 10, 9,  6,  8,  7,  7,  8,  7,  7,  4,  6,  7,  7,  7,  7,
+    8,  3,  10, 10, 9,  9,  9,  9,  9,  16, 13, 11, 10, 10, 11, 10, 11, 11, 12,
+    13, 14, 14, 10, 12, 13, 13, 14, 12, 12, 11, 14, 14, 14, 14, 12, 9,  11, 15,
+    15, 15, 15, 13, 9,  10, 17, 16, 16, 17, 15, 11, 12, 18, 20, 18, 18, 16, 12,
+    16, 21, 23, 20, 20, 18, 14, 19, 21, 21, 21, 18, 15, 14, 20, 23, 23, 23, 19,
+    15, 12, 19, 25, 25, 24, 20, 15, 11, 19, 25, 26, 25, 21, 17, 12, 18, 23, 29,
+    27, 23, 18, 14, 19, 25, 31, 30, 25, 20, 15, 21, 27, 32, 32, 27, 22, 17, 29,
+    34, 33, 27, 21, 17, 14, 28, 34, 36, 29, 23, 18, 13, 28, 34, 39, 30, 24, 19,
+    14, 28, 34, 38, 30, 25, 20, 15, 27, 33, 39, 35, 28, 22, 17, 26, 32, 37, 37,
+    29, 24, 18, 27, 33, 36, 37, 32, 26, 20, 9,  11, 12, 13, 13, 13, 12, 9,  10,
+    11, 13, 13, 11, 10, 8,  9,  11, 11, 10, 9,  7,  8,  8,  8,  9,  8,  6,  2,
+    6,  5,  5,  5,  4,  2,  2,  2,  2,  2,  2,  2,  2,  2,  4,  3,  1,  2,  2,
+    2,  2,  8,  10, 11, 12, 13, 13, 13, 8,  9,  10, 12, 12, 11, 10, 8,  8,  10,
+    10, 9,  9,  7,  8,  7,  7,  7,  7,  5,  3,  5,  4,  4,  4,  2,  2,  2,  2,
+    1,  0,  2,  2,  2,  2,  6,  4,  2,  1,  2,  2,  3,  8,  9,  10, 11, 13, 14,
+    15, 8,  8,  10, 12, 12, 12, 12, 7,  8,  10, 10, 10, 10, 9,  6,  7,  8,  8,
+    8,  6,  5,  4,  3,  5,  5,  4,  4,  5,  5,  3,  5,  4,  4,  4,  5,  7,  6,
+    7,  6,  5,  5,  5,  8,  11, 12, 13, 14, 16, 15, 6,  10, 12, 13, 14, 14, 13,
+    6,  10, 12, 11, 11, 11, 10, 9,  9,  9,  9,  9,  9,  9,  7,  7,  9,  10, 10,
+    10, 11, 5,  12, 12, 12, 12, 12, 12, 7,  15, 15, 14, 13, 13, 13, 11, 14, 15,
+    15, 16, 16, 16, 13, 15, 16, 16, 16, 15, 13, 12, 16, 17, 17, 17, 15, 12, 13,
+    18, 18, 18, 18, 17, 13, 12, 19, 19, 19, 19, 18, 13, 13, 22, 23, 22, 20, 19,
+    15, 17, 22, 26, 24, 22, 21, 16, 22, 24, 25, 24, 22, 18, 16, 22, 26, 26, 27,
+    23, 18, 13, 22, 29, 28, 27, 23, 18, 14, 22, 27, 28, 28, 24, 19, 15, 22, 28,
+    31, 31, 26, 21, 16, 22, 28, 34, 32, 27, 22, 18, 24, 29, 35, 36, 30, 24, 20,
+    32, 38, 37, 29, 24, 21, 16, 31, 38, 38, 32, 26, 21, 16, 31, 37, 41, 32, 27,
+    21, 17, 31, 37, 42, 34, 28, 23, 18, 30, 35, 42, 38, 30, 24, 19, 29, 35, 41,
+    40, 33, 26, 21, 30, 36, 40, 41, 34, 28, 22, 8,  9,  11, 12, 13, 12, 11, 8,
+    9,  11, 12, 12, 11, 9,  7,  8,  10, 10, 10, 8,  6,  7,  7,  7,  8,  8,  5,
+    2,  5,  4,  4,  5,  3,  2,  2,  2,  2,  1,  2,  2,  2,  2,  3,  2,  1,  1,
+    2,  2,  2,  8,  8,  10, 12, 12, 12, 13, 7,  8,  9,  11, 12, 10, 10, 7,  8,
+    9,  10, 9,  8,  8,  6,  6,  6,  7,  6,  5,  4,  4,  3,  3,  3,  2,  2,  4,
+    2,  2,  2,  0,  1,  2,  4,  5,  3,  2,  1,  2,  3,  4,  7,  8,  10, 11, 13,
+    14, 15, 6,  7,  10, 12, 12, 13, 12, 6,  7,  10, 10, 10, 10, 10, 5,  6,  7,
+    8,  8,  7,  6,  6,  2,  4,  5,  5,  6,  6,  7,  2,  5,  6,  6,  7,  6,  6,
+    5,  6,  8,  7,  8,  8,  6,  10, 12, 13, 14, 16, 15, 5,  10, 12, 13, 14, 14,
+    13, 8,  10, 12, 12, 12, 12, 11, 11, 8,  11, 11, 11, 12, 11, 10, 8,  12, 12,
+    12, 13, 13, 8,  11, 14, 14, 14, 14, 14, 6,  14, 15, 16, 15, 15, 16, 13, 16,
+    17, 18, 19, 18, 15, 15, 18, 19, 19, 19, 18, 13, 15, 18, 20, 19, 20, 18, 14,
+    14, 20, 21, 20, 21, 20, 15, 14, 21, 22, 22, 22, 20, 16, 14, 23, 25, 24, 24,
+    22, 17, 16, 23, 27, 26, 25, 23, 19, 25, 27, 27, 27, 24, 21, 17, 25, 31, 29,
+    30, 25, 20, 16, 25, 31, 31, 30, 26, 21, 16, 25, 31, 32, 31, 27, 22, 18, 23,
+    31, 34, 33, 29, 24, 18, 24, 31, 36, 34, 31, 25, 20, 26, 32, 37, 38, 33, 27,
+    22, 35, 40, 40, 33, 27, 23, 19, 35, 41, 42, 34, 29, 24, 19, 35, 40, 44, 36,
+    30, 25, 19, 35, 41, 45, 37, 31, 26, 20, 33, 39, 44, 40, 33, 27, 23, 33, 39,
+    45, 42, 35, 30, 23, 33, 39, 44, 44, 38, 30, 25, 6,  8,  11, 14, 14, 12, 9,
+    6,  7,  10, 13, 13, 11, 7,  5,  6,  9,  11, 12, 9,  5,  5,  5,  6,  8,  10,
+    7,  2,  2,  2,  2,  5,  7,  5,  2,  2,  1,  1,  2,  5,  5,  2,  3,  2,  2,
+    2,  4,  5,  2,  5,  6,  8,  11, 11, 10, 10, 5,  6,  7,  10, 11, 8,  8,  4,
+    5,  6,  8,  8,  6,  6,  4,  4,  4,  5,  5,  3,  2,  2,  1,  1,  2,  2,  1,
+    2,  3,  2,  2,  1,  0,  1,  2,  6,  3,  2,  2,  1,  1,  2,  5,  6,  8,  9,
+    10, 11, 12, 4,  5,  8,  9,  10, 10, 9,  3,  5,  8,  8,  8,  8,  7,  5,  3,
+    5,  5,  5,  5,  5,  8,  2,  4,  5,  6,  6,  5,  9,  3,  5,  7,  7,  7,  5,
+    8,  6,  6,  8,  8,  8,  8,  3,  8,  10, 10, 11, 13, 14, 6,  8,  10, 11, 12,
+    12, 13, 10, 8,  11, 12, 12, 12, 11, 12, 7,  11, 12, 11, 12, 10, 12, 8,  12,
+    13, 13, 13, 13, 9,  11, 13, 14, 14, 14, 15, 8,  14, 16, 16, 15, 15, 16, 13,
+    16, 17, 18, 20, 18, 14, 15, 17, 19, 19, 20, 19, 12, 15, 19, 20, 20, 20, 19,
+    14, 15, 20, 20, 21, 21, 19, 14, 14, 21, 22, 22, 22, 20, 16, 14, 23, 25, 24,
+    23, 22, 17, 16, 24, 28, 26, 27, 24, 19, 26, 29, 27, 28, 24, 21, 16, 25, 30,
+    29, 29, 26, 21, 17, 25, 33, 33, 31, 26, 22, 17, 25, 32, 33, 31, 27, 23, 17,
+    25, 31, 35, 33, 28, 24, 18, 25, 32, 36, 36, 30, 24, 20, 26, 32, 38, 39, 33,
+    27, 22, 35, 41, 39, 33, 28, 23, 19, 36, 41, 42, 35, 29, 24, 19, 36, 40, 45,
+    36, 30, 24, 20, 35, 40, 45, 37, 31, 25, 21, 34, 40, 44, 40, 33, 27, 22, 34,
+    39, 43, 43, 35, 29, 23, 35, 39, 44, 44, 38, 31, 25, 4,  6,  10, 12, 13, 11,
+    8,  4,  5,  9,  12, 12, 9,  6,  4,  5,  7,  10, 10, 8,  4,  3,  3,  4,  7,
+    9,  6,  2,  1,  1,  1,  4,  6,  4,  2,  2,  2,  2,  3,  5,  4,  2,  4,  3,
+    2,  2,  4,  5,  2,  4,  5,  7,  10, 10, 8,  8,  4,  5,  6,  9,  9,  6,  6,
+    3,  4,  5,  7,  7,  4,  4,  3,  2,  2,  4,  4,  2,  2,  2,  2,  1,  2,  1,
+    1,  2,  3,  2,  2,  2,  1,  0,  2,  6,  4,  2,  2,  2,  1,  2,  3,  4,  6,
+    7,  8,  10, 10, 3,  4,  6,  7,  8,  8,  8,  2,  3,  6,  6,  6,  6,  7,  6,
+    2,  4,  5,  5,  5,  5,  8,  2,  4,  6,  6,  6,  5,  9,  4,  5,  7,  7,  7,
+    5,  8,  7,  6,  8,  8,  8,  8,  2,  7,  10, 10, 11, 12, 13, 7,  7,  11, 11,
+    12, 12, 12, 11, 7,  11, 12, 11, 12, 10, 12, 7,  11, 12, 12, 12, 10, 12, 9,
+    13, 13, 13, 13, 13, 9,  11, 14, 14, 15, 15, 14, 9,  14, 16, 17, 16, 16, 16,
+    13, 16, 18, 18, 18, 18, 13, 15, 17, 19, 20, 20, 18, 12, 15, 19, 20, 20, 20,
+    18, 14, 15, 20, 21, 21, 20, 19, 15, 15, 22, 23, 22, 23, 21, 16, 15, 23, 27,
+    24, 24, 21, 18, 16, 24, 28, 27, 25, 23, 19, 25, 28, 27, 27, 25, 20, 16, 26,
+    30, 29, 29, 25, 21, 16, 25, 32, 32, 31, 26, 21, 17, 26, 32, 33, 31, 26, 22,
+    18, 24, 31, 35, 33, 29, 23, 19, 25, 32, 37, 35, 30, 25, 21, 25, 32, 37, 38,
+    32, 27, 22, 35, 40, 39, 32, 27, 23, 19, 36, 40, 41, 34, 27, 24, 19, 35, 39,
+    43, 35, 30, 24, 19, 36, 39, 44, 36, 31, 26, 21, 34, 39, 44, 38, 32, 27, 23,
+    34, 39, 43, 42, 35, 29, 24, 34, 40, 43, 44, 37, 30, 25, 4,  6,  8,  11, 11,
+    9,  6,  4,  6,  8,  10, 10, 7,  4,  3,  5,  7,  8,  9,  6,  4,  3,  3,  5,
+    7,  8,  5,  3,  1,  0,  3,  5,  7,  5,  3,  2,  2,  4,  4,  7,  5,  3,  4,
+    3,  3,  4,  6,  5,  3,  4,  5,  7,  9,  8,  6,  6,  3,  4,  6,  8,  7,  5,
+    4,  3,  4,  5,  7,  5,  4,  2,  2,  2,  4,  5,  4,  3,  0,  1,  1,  2,  4,
+    3,  2,  0,  3,  2,  3,  4,  2,  2,  0,  7,  4,  3,  3,  3,  1,  0,  3,  4,
+    5,  5,  7,  8,  8,  2,  3,  5,  6,  6,  6,  6,  2,  3,  5,  4,  4,  4,  5,
+    3,  2,  3,  3,  2,  3,  3,  6,  2,  4,  4,  4,  4,  3,  7,  4,  5,  5,  5,
+    5,  3,  8,  7,  6,  6,  6,  6,  6,  2,  7,  8,  8,  9,  10, 11, 3,  7,  9,
+    9,  10, 10, 10, 9,  7,  10, 9,  10, 10, 8,  11, 7,  10, 10, 9,  10, 7,  10,
+    9,  11, 11, 12, 11, 11, 7,  11, 13, 12, 13, 13, 12, 8,  14, 15, 14, 14, 14,
+    14, 12, 16, 16, 16, 17, 16, 11, 14, 16, 17, 17, 18, 16, 10, 15, 18, 18, 18,
+    17, 16, 12, 14, 20, 19, 19, 19, 17, 12, 14, 21, 21, 21, 20, 18, 14, 15, 22,
+    24, 22, 21, 19, 15, 16, 23, 26, 25, 23, 21, 17, 24, 26, 24, 25, 21, 18, 14,
+    24, 28, 26, 25, 22, 18, 14, 24, 30, 29, 27, 23, 19, 14, 24, 29, 30, 28, 25,
+    19, 15, 23, 29, 32, 30, 25, 21, 17, 24, 30, 35, 32, 27, 23, 18, 25, 30, 35,
+    35, 30, 25, 20, 32, 37, 35, 28, 24, 21, 16, 32, 37, 38, 31, 25, 20, 17, 33,
+    37, 39, 32, 27, 22, 17, 32, 37, 40, 33, 27, 22, 18, 31, 36, 41, 37, 30, 24,
+    20, 31, 35, 40, 40, 32, 26, 21, 32, 37, 40, 41, 34, 28, 23, 17, 19, 20, 23,
+    22, 21, 20, 17, 19, 20, 22, 22, 20, 18, 16, 18, 19, 19, 20, 17, 14, 16, 16,
+    16, 17, 17, 12, 7,  13, 13, 13, 12, 10, 10, 7,  9,  9,  7,  6,  8,  9,  7,
+    3,  3,  4,  6,  7,  9,  7,  16, 18, 19, 21, 21, 21, 20, 15, 18, 19, 20, 20,
+    19, 17, 15, 17, 18, 19, 18, 17, 14, 14, 15, 15, 16, 14, 11, 7,  12, 12, 12,
+    11, 7,  7,  7,  8,  7,  6,  5,  6,  6,  6,  0,  2,  4,  4,  5,  6,  6,  15,
+    17, 18, 19, 21, 21, 20, 14, 16, 17, 19, 19, 19, 17, 15, 16, 17, 17, 17, 16,
+    13, 15, 14, 14, 14, 13, 11, 6,  10, 10, 10, 9,  5,  6,  6,  3,  5,  5,  4,
+    5,  6,  6,  2,  2,  2,  4,  5,  5,  6,  15, 16, 17, 18, 20, 21, 21, 14, 16,
+    18, 19, 19, 19, 19, 12, 16, 17, 17, 17, 16, 15, 9,  15, 14, 14, 13, 10, 10,
+    6,  11, 10, 9,  5,  5,  7,  4,  4,  4,  4,  4,  5,  6,  2,  7,  5,  5,  5,
+    5,  6,  14, 15, 17, 19, 19, 21, 21, 12, 15, 16, 18, 19, 18, 19, 11, 14, 15,
+    15, 16, 15, 14, 12, 12, 12, 12, 11, 10, 6,  9,  10, 10, 10, 11, 11, 6,  6,
+    11, 13, 12, 12, 12, 7,  7,  12, 14, 13, 13, 12, 9,  13, 15, 16, 17, 17, 19,
+    21, 13, 17, 17, 18, 16, 17, 18, 13, 19, 18, 18, 14, 14, 13, 13, 18, 19, 18,
+    16, 11, 8,  12, 17, 19, 18, 15, 12, 9,  12, 16, 19, 17, 15, 13, 11, 13, 15,
+    18, 18, 16, 14, 12, 21, 25, 24, 21, 16, 18, 19, 21, 25, 25, 21, 17, 16, 16,
+    21, 24, 26, 22, 18, 13, 12, 21, 23, 25, 21, 18, 14, 11, 19, 21, 24, 20, 16,
+    14, 12, 18, 21, 22, 21, 16, 15, 13, 17, 19, 22, 22, 18, 15, 13, 15, 16, 17,
+    19, 18, 18, 17, 14, 16, 17, 18, 18, 17, 15, 13, 15, 16, 16, 16, 14, 11, 13,
+    14, 14, 13, 12, 9,  5,  11, 11, 10, 9,  6,  5,  4,  7,  7,  5,  4,  5,  5,
+    5,  2,  2,  2,  3,  5,  5,  4,  14, 15, 16, 18, 18, 18, 17, 14, 15, 16, 17,
+    18, 16, 14, 13, 14, 15, 16, 15, 13, 10, 13, 12, 13, 12, 11, 9,  4,  10, 9,
+    9,  8,  4,  4,  4,  6,  5,  4,  3,  3,  4,  4,  2,  0,  2,  2,  3,  4,  4,
+    13, 14, 15, 16, 18, 18, 18, 13, 13, 15, 16, 16, 16, 15, 13, 13, 14, 14, 14,
+    13, 11, 12, 12, 11, 11, 10, 8,  5,  8,  8,  8,  8,  3,  4,  4,  3,  4,  4,
+    3,  3,  4,  4,  2,  2,  1,  2,  3,  4,  5,  13, 15, 15, 17, 19, 19, 19, 12,
+    15, 16, 17, 17, 18, 16, 10, 15, 15, 15, 15, 14, 13, 7,  14, 13, 13, 12, 9,
+    9,  5,  10, 9,  8,  6,  6,  7,  3,  6,  6,  7,  7,  7,  8,  2,  9,  9,  8,
+    8,  9,  9,  13, 14, 15, 17, 18, 19, 20, 11, 14, 15, 16, 17, 17, 17, 12, 13,
+    14, 14, 15, 14, 12, 11, 13, 12, 12, 13, 12, 8,  9,  13, 14, 14, 14, 14, 9,
+    8,  15, 16, 17, 16, 15, 11, 10, 16, 19, 19, 19, 17, 12, 16, 19, 19, 20, 17,
+    18, 19, 16, 21, 21, 21, 18, 16, 16, 16, 23, 23, 22, 18, 14, 12, 17, 22, 24,
+    23, 19, 15, 11, 15, 22, 25, 25, 22, 17, 12, 16, 22, 28, 28, 24, 19, 14, 17,
+    23, 28, 29, 25, 21, 16, 26, 32, 31, 24, 20, 17, 18, 25, 31, 33, 26, 21, 16,
+    15, 26, 31, 35, 27, 22, 17, 12, 25, 31, 36, 29, 23, 18, 14, 24, 30, 35, 32,
+    25, 21, 15, 24, 31, 35, 33, 28, 23, 17, 24, 31, 35, 33, 29, 24, 19, 11, 12,
+    14, 15, 15, 15, 14, 10, 12, 13, 15, 14, 13, 11, 10, 11, 13, 13, 12, 10, 8,
+    10, 10, 10, 10, 9,  6,  3,  7,  7,  7,  6,  4,  3,  2,  4,  3,  3,  2,  3,
+    3,  2,  2,  1,  1,  2,  3,  3,  2,  10, 11, 13, 14, 15, 14, 14, 10, 11, 12,
+    13, 14, 12, 12, 10, 10, 11, 12, 11, 10, 8,  10, 9,  9,  9,  8,  6,  3,  7,
+    6,  6,  6,  3,  2,  3,  3,  2,  2,  2,  2,  2,  3,  4,  2,  0,  2,  2,  2,
+    3,  10, 10, 11, 13, 14, 16, 16, 10, 10, 12, 13, 13, 14, 14, 10, 10, 11, 12,
+    11, 11, 10, 9,  8,  9,  9,  9,  6,  5,  4,  5,  6,  6,  4,  3,  5,  3,  2,
+    3,  3,  3,  4,  5,  4,  3,  4,  4,  4,  5,  5,  10, 13, 13, 14, 16, 17, 17,
+    8,  12, 13, 14, 15, 15, 14, 6,  12, 13, 13, 13, 12, 11, 8,  11, 10, 10, 10,
+    9,  9,  6,  7,  8,  9,  9,  10, 9,  4,  9,  10, 10, 11, 11, 11, 4,  12, 12,
+    12, 12, 12, 12, 11, 13, 14, 15, 16, 17, 17, 11, 14, 15, 15, 16, 15, 14, 11,
+    15, 16, 16, 16, 14, 11, 11, 17, 17, 16, 17, 15, 11, 11, 18, 17, 18, 18, 17,
+    12, 12, 19, 21, 20, 20, 18, 14, 14, 20, 23, 21, 22, 20, 16, 21, 23, 23, 23,
+    20, 17, 17, 21, 25, 25, 25, 21, 17, 14, 21, 28, 27, 26, 22, 17, 13, 21, 25,
+    29, 27, 22, 19, 14, 20, 27, 31, 29, 25, 20, 15, 20, 26, 33, 32, 26, 21, 17,
+    22, 27, 32, 34, 29, 24, 18, 30, 35, 35, 28, 23, 19, 16, 30, 36, 38, 31, 24,
+    19, 15, 30, 36, 39, 32, 26, 20, 15, 30, 35, 40, 32, 27, 22, 17, 28, 35, 40,
+    35, 29, 23, 19, 28, 35, 40, 38, 30, 26, 20, 29, 35, 40, 41, 33, 28, 21, 9,
+    10, 12, 13, 13, 13, 12, 8,  9,  11, 13, 13, 11, 9,  8,  9,  11, 11, 11, 9,
+    7,  8,  7,  8,  9,  8,  5,  2,  5,  5,  5,  5,  4,  2,  2,  2,  2,  1,  2,
+    3,  2,  2,  3,  2,  1,  2,  2,  2,  2,  8,  9,  11, 12, 13, 12, 13, 8,  9,
+    10, 12, 12, 10, 10, 7,  8,  9,  10, 10, 8,  8,  7,  7,  7,  8,  7,  5,  4,
+    5,  4,  3,  4,  3,  2,  3,  2,  2,  1,  1,  2,  2,  3,  4,  2,  2,  0,  1,
+    2,  3,  8,  8,  10, 11, 13, 14, 14, 7,  8,  10, 12, 12, 12, 12, 7,  7,  10,
+    10, 10, 10, 9,  5,  6,  8,  8,  8,  6,  6,  5,  3,  5,  5,  5,  5,  6,  6,
+    2,  5,  5,  5,  6,  6,  5,  4,  5,  7,  7,  7,  7,  7,  11, 12, 13, 14, 16,
+    15, 5,  10, 12, 14, 13, 13, 13, 7,  10, 11, 11, 12, 12, 11, 10, 9,  10, 11,
+    11, 11, 10, 9,  8,  11, 11, 12, 12, 12, 7,  10, 13, 13, 13, 13, 14, 5,  13,
+    14, 15, 14, 14, 15, 12, 15, 16, 17, 18, 17, 15, 14, 16, 18, 18, 19, 17, 13,
+    14, 17, 19, 19, 18, 17, 13, 14, 20, 19, 19, 20, 18, 14, 13, 21, 21, 20, 20,
+    19, 15, 14, 22, 23, 23, 22, 21, 17, 16, 22, 26, 25, 25, 23, 18, 24, 27, 26,
+    26, 23, 19, 16, 24, 29, 28, 28, 24, 21, 15, 24, 31, 31, 29, 26, 20, 16, 24,
+    30, 31, 30, 27, 21, 17, 23, 30, 33, 31, 27, 22, 18, 23, 30, 35, 34, 29, 24,
+    19, 25, 30, 35, 36, 32, 27, 21, 33, 40, 39, 32, 26, 22, 18, 34, 40, 42, 34,
+    28, 23, 18, 33, 40, 43, 35, 29, 23, 18, 34, 40, 44, 36, 30, 25, 19, 32, 38,
+    44, 39, 32, 26, 21, 33, 38, 43, 42, 34, 28, 23, 32, 39, 42, 43, 36, 30, 24,
+    7,  9,  13, 15, 15, 14, 10, 6,  8,  11, 15, 15, 12, 9,  6,  7,  10, 12, 13,
+    10, 7,  6,  5,  7,  10, 11, 8,  4,  3,  3,  4,  6,  8,  6,  3,  1,  1,  2,
+    3,  6,  6,  3,  3,  2,  2,  2,  5,  6,  3,  6,  7,  10, 13, 13, 10, 10, 6,
+    7,  9,  12, 12, 9,  8,  5,  6,  8,  10, 10, 7,  6,  5,  5,  5,  7,  6,  5,
+    3,  2,  2,  2,  3,  3,  3,  2,  2,  2,  2,  2,  1,  2,  3,  5,  3,  2,  1,
+    0,  1,  2,  5,  6,  8,  9,  11, 12, 12, 5,  6,  8,  9,  10, 10, 10, 4,  5,
+    8,  8,  8,  8,  8,  4,  4,  5,  6,  6,  5,  5,  6,  2,  3,  4,  4,  4,  4,
+    8,  3,  4,  5,  5,  5,  5,  7,  5,  5,  7,  7,  7,  7,  5,  8,  10, 10, 12,
+    13, 13, 4,  8,  10, 11, 11, 11, 11, 7,  8,  10, 10, 10, 10, 10, 10, 7,  10,
+    11, 11, 11, 9,  10, 8,  11, 11, 12, 11, 12, 8,  10, 13, 13, 13, 13, 13, 7,
+    13, 15, 15, 15, 14, 15, 12, 16, 16, 17, 18, 17, 14, 14, 16, 18, 18, 19, 17,
+    12, 14, 18, 19, 19, 18, 17, 13, 14, 19, 19, 19, 19, 18, 13, 13, 21, 21, 21,
+    21, 19, 15, 13, 22, 23, 23, 22, 20, 16, 15, 23, 26, 25, 24, 22, 18, 24, 27,
+    26, 26, 23, 19, 15, 24, 30, 28, 28, 25, 20, 15, 24, 31, 30, 29, 24, 20, 16,
+    25, 31, 31, 30, 25, 21, 16, 24, 30, 34, 32, 27, 23, 17, 24, 30, 36, 35, 28,
+    23, 20, 24, 31, 35, 36, 31, 26, 20, 34, 39, 39, 32, 26, 21, 18, 34, 40, 39,
+    33, 28, 23, 18, 34, 41, 43, 35, 28, 23, 18, 33, 39, 44, 35, 30, 24, 19, 32,
+    39, 42, 39, 31, 26, 20, 32, 39, 43, 41, 34, 28, 23, 32, 38, 42, 43, 36, 30,
+    24, 5,  8,  11, 15, 15, 13, 9,  5,  7,  10, 14, 14, 11, 7,  4,  5,  9,  11,
+    13, 9,  6,  4,  4,  6,  8,  11, 7,  3,  1,  1,  2,  5,  8,  6,  3,  2,  2,
+    2,  3,  6,  6,  3,  4,  3,  2,  3,  5,  6,  3,  4,  5,  9,  12, 12, 9,  9,
+    4,  5,  8,  11, 11, 8,  7,  3,  5,  6,  8,  8,  6,  4,  3,  3,  3,  6,  5,
+    4,  1,  2,  1,  1,  2,  2,  2,  1,  3,  2,  2,  3,  1,  1,  1,  7,  4,  2,
+    2,  1,  0,  1,  4,  5,  6,  7,  9,  10, 10, 3,  4,  7,  7,  8,  8,  8,  3,
+    4,  6,  6,  6,  6,  6,  4,  2,  4,  4,  4,  4,  4,  7,  2,  4,  5,  5,  4,
+    4,  8,  3,  5,  6,  6,  6,  4,  8,  6,  6,  7,  7,  7,  7,  3,  7,  9,  9,
+    10, 11, 12, 5,  7,  10, 10, 11, 11, 11, 8,  7,  10, 10, 10, 11, 10, 11, 7,
+    10, 11, 11, 11, 8,  10, 9,  11, 12, 12, 12, 12, 8,  11, 13, 13, 14, 13, 13,
+    8,  14, 15, 15, 14, 14, 15, 13, 16, 16, 17, 18, 17, 12, 15, 16, 17, 18, 19,
+    17, 11, 15, 18, 19, 19, 19, 18, 13, 15, 20, 20, 20, 20, 18, 13, 14, 21, 21,
+    21, 21, 19, 15, 14, 22, 25, 23, 22, 21, 16, 16, 24, 27, 25, 25, 23, 18, 24,
+    28, 27, 26, 23, 19, 15, 24, 29, 28, 27, 24, 19, 15, 24, 32, 31, 29, 25, 20,
+    16, 24, 31, 31, 29, 26, 21, 16, 23, 29, 33, 31, 27, 22, 18, 24, 30, 37, 34,
+    28, 24, 19, 25, 30, 37, 36, 31, 26, 21, 34, 39, 37, 31, 26, 22, 18, 35, 40,
+    39, 33, 27, 22, 18, 34, 39, 42, 34, 29, 24, 18, 34, 37, 42, 34, 29, 24, 19,
+    33, 38, 42, 37, 31, 26, 21, 34, 38, 41, 41, 34, 27, 23, 33, 38, 42, 42, 35,
+    28, 24, 4,  6,  8,  11, 11, 9,  6,  4,  6,  8,  10, 10, 7,  4,  3,  5,  7,
+    8,  9,  6,  4,  3,  3,  5,  6,  8,  5,  3,  1,  0,  3,  5,  8,  5,  3,  2,
+    2,  4,  5,  7,  5,  3,  4,  3,  3,  4,  6,  5,  3,  4,  5,  7,  9,  8,  7,
+    6,  3,  4,  6,  8,  7,  5,  4,  3,  4,  5,  7,  5,  4,  2,  2,  2,  3,  5,
+    4,  3,  0,  1,  1,  2,  4,  3,  2,  0,  3,  2,  3,  4,  2,  2,  0,  7,  4,
+    3,  3,  3,  1,  0,  3,  4,  5,  5,  7,  8,  8,  2,  3,  5,  6,  6,  6,  6,
+    2,  3,  5,  4,  4,  4,  5,  3,  2,  3,  3,  3,  3,  3,  5,  2,  4,  4,  4,
+    4,  3,  7,  4,  5,  5,  5,  5,  3,  8,  7,  6,  6,  6,  6,  6,  2,  7,  8,
+    9,  9,  10, 11, 3,  7,  9,  9,  10, 10, 9,  9,  7,  10, 9,  9,  10, 8,  11,
+    7,  10, 10, 10, 10, 7,  9,  9,  11, 11, 11, 11, 11, 8,  11, 13, 13, 13, 13,
+    12, 8,  14, 15, 14, 14, 14, 13, 12, 15, 16, 16, 16, 16, 11, 14, 17, 17, 17,
+    18, 16, 10, 14, 17, 18, 18, 18, 16, 12, 14, 19, 18, 19, 18, 17, 12, 14, 21,
+    21, 20, 19, 19, 14, 15, 22, 24, 23, 21, 19, 16, 16, 22, 26, 24, 23, 21, 17,
+    24, 26, 24, 24, 21, 18, 14, 24, 28, 27, 26, 23, 18, 14, 24, 30, 28, 27, 23,
+    19, 15, 24, 29, 31, 27, 24, 20, 16, 23, 28, 32, 30, 25, 21, 17, 24, 30, 34,
+    33, 28, 23, 19, 24, 30, 35, 34, 30, 24, 20, 32, 37, 35, 28, 24, 20, 17, 33,
+    37, 36, 30, 25, 21, 16, 33, 37, 39, 31, 26, 22, 17, 32, 37, 40, 33, 27, 23,
+    19, 31, 36, 39, 36, 30, 23, 20, 31, 36, 40, 38, 32, 26, 21, 33, 36, 41, 40,
+    34, 28, 22, 2,  3,  4,  8,  8,  6,  2,  2,  2,  3,  7,  8,  4,  2,  2,  2,
+    2,  4,  5,  2,  2,  1,  2,  2,  2,  3,  2,  3,  2,  3,  3,  3,  4,  3,  3,
+    6,  6,  6,  6,  4,  3,  3,  12, 11, 8,  6,  5,  3,  3,  2,  2,  3,  5,  5,
+    2,  2,  1,  2,  3,  3,  4,  2,  1,  0,  2,  2,  2,  2,  2,  1,  1,  1,  2,
+    2,  1,  1,  3,  4,  3,  4,  4,  4,  3,  3,  8,  8,  8,  7,  5,  3,  3,  15,
+    13, 10, 7,  5,  4,  3,  0,  2,  2,  2,  2,  2,  1,  1,  2,  2,  2,  2,  2,
+    1,  2,  1,  1,  1,  1,  1,  2,  2,  1,  2,  1,  2,  2,  4,  6,  5,  5,  5,
+    5,  4,  4,  11, 10, 9,  8,  6,  5,  4,  18, 16, 12, 9,  7,  6,  5,  2,  2,
+    2,  3,  3,  3,  7,  2,  3,  4,  4,  4,  4,  7,  4,  4,  5,  5,  5,  5,  7,
+    7,  7,  7,  7,  8,  8,  8,  8,  12, 11, 11, 12, 11, 10, 12, 17, 16, 15, 14,
+    13, 12, 18, 23, 20, 17, 15, 14, 13, 10, 10, 10, 10, 11, 10, 7,  12, 12, 12,
+    11, 12, 11, 7,  12, 13, 13, 14, 13, 12, 8,  12, 17, 16, 16, 17, 15, 12, 15,
+    21, 21, 20, 20, 19, 14, 19, 24, 25, 25, 23, 20, 15, 22, 27, 30, 27, 25, 22,
+    17, 19, 21, 20, 20, 17, 13, 8,  19, 22, 22, 22, 18, 14, 10, 19, 24, 24, 24,
+    19, 15, 11, 19, 25, 27, 27, 23, 19, 15, 22, 28, 32, 31, 28, 23, 17, 24, 30,
+    36, 35, 30, 25, 18, 27, 34, 37, 37, 32, 26, 20, 27, 32, 32, 25, 20, 16, 11,
+    27, 33, 34, 28, 22, 17, 13, 26, 34, 36, 29, 24, 19, 15, 28, 34, 38, 32, 27,
+    23, 19, 29, 35, 40, 36, 32, 27, 21, 31, 37, 40, 40, 33, 27, 23, 33, 38, 42,
+    42, 36, 30, 25, 1,  2,  3,  3,  3,  2,  2,  1,  2,  2,  3,  3,  2,  1,  1,
+    2,  2,  2,  2,  2,  1,  2,  1,  2,  2,  2,  2,  4,  4,  3,  4,  4,  4,  4,
+    4,  8,  7,  7,  7,  5,  4,  4,  13, 12, 9,  7,  6,  4,  4,  1,  2,  2,  3,
+    2,  2,  1,  2,  1,  2,  2,  2,  1,  1,  2,  0,  2,  2,  2,  1,  1,  2,  2,
+    2,  2,  2,  2,  4,  5,  5,  5,  5,  5,  4,  4,  10, 9,  9,  8,  6,  4,  4,
+    17, 14, 11, 8,  6,  5,  4,  2,  0,  1,  2,  2,  1,  5,  2,  1,  1,  1,  1,
+    1,  5,  2,  2,  1,  1,  1,  1,  6,  4,  2,  4,  4,  4,  4,  7,  8,  6,  7,
+    7,  8,  7,  7,  13, 12, 12, 11, 10, 8,  7,  19, 17, 15, 13, 11, 10, 9,  2,
+    5,  5,  6,  6,  6,  9,  5,  6,  6,  7,  7,  7,  9,  8,  7,  7,  8,  8,  8,
+    9,  11, 10, 11, 11, 11, 12, 11, 11, 15, 15, 15, 15, 15, 14, 13, 20, 20, 18,
+    17, 16, 15, 19, 26, 23, 21, 18, 18, 17, 13, 14, 13, 13, 13, 13, 9,  14, 15,
+    14, 15, 15, 14, 9,  14, 17, 16, 17, 16, 15, 12, 15, 21, 20, 20, 20, 19, 16,
+    18, 25, 25, 24, 24, 22, 17, 22, 28, 30, 29, 26, 24, 19, 26, 31, 33, 30, 29,
+    26, 20, 22, 24, 23, 23, 19, 15, 11, 23, 26, 25, 24, 21, 16, 12, 23, 28, 27,
+    26, 23, 19, 15, 23, 29, 31, 30, 27, 22, 19, 25, 32, 36, 34, 31, 26, 21, 29,
+    34, 41, 39, 34, 27, 22, 32, 37, 42, 41, 36, 30, 24, 31, 36, 34, 28, 23, 18,
+    14, 30, 37, 37, 30, 23, 20, 15, 31, 36, 39, 33, 26, 22, 19, 30, 36, 42, 36,
+    31, 27, 23, 32, 39, 45, 41, 35, 29, 24, 34, 40, 47, 45, 39, 31, 26, 38, 43,
+    47, 46, 41, 34, 28, 1,  3,  4,  5,  5,  4,  3,  1,  2,  4,  5,  5,  4,  3,
+    2,  1,  4,  4,  5,  5,  5,  2,  2,  4,  5,  6,  6,  6,  4,  4,  6,  7,  8,
+    7,  6,  8,  8,  9,  10, 8,  7,  6,  14, 13, 10, 10, 9,  7,  6,  2,  1,  3,
+    4,  4,  3,  1,  2,  1,  3,  4,  4,  3,  1,  2,  2,  2,  4,  4,  3,  3,  2,
+    3,  3,  5,  5,  5,  5,  5,  5,  6,  7,  7,  6,  4,  11, 10, 10, 10, 8,  6,
+    4,  18, 15, 12, 10, 8,  6,  4,  2,  1,  0,  1,  1,  2,  5,  2,  2,  1,  1,
+    1,  2,  4,  3,  2,  2,  2,  3,  3,  6,  7,  3,  6,  6,  6,  6,  8,  10, 7,
+    9,  9,  9,  9,  8,  15, 12, 13, 13, 11, 10, 7,  21, 19, 16, 14, 13, 11, 10,
+    3,  6,  6,  6,  7,  6,  8,  8,  6,  7,  7,  8,  8,  9,  10, 7,  9,  9,  10,
+    10, 10, 12, 10, 13, 13, 13, 13, 11, 13, 15, 17, 17, 17, 16, 14, 15, 22, 22,
+    21, 19, 18, 17, 20, 27, 25, 22, 21, 20, 19, 14, 15, 15, 14, 15, 13, 8,  16,
+    15, 16, 16, 15, 14, 8,  16, 17, 18, 19, 18, 17, 13, 16, 22, 22, 22, 22, 21,
+    17, 19, 27, 27, 26, 26, 24, 18, 23, 31, 33, 31, 29, 25, 21, 28, 34, 35, 32,
+    31, 28, 22, 23, 25, 24, 23, 20, 16, 12, 23, 28, 26, 25, 21, 17, 13, 24, 29,
+    28, 28, 25, 21, 17, 24, 31, 33, 32, 28, 24, 21, 27, 33, 39, 36, 33, 27, 21,
+    31, 37, 42, 41, 36, 29, 24, 33, 40, 45, 44, 38, 31, 26, 32, 38, 36, 29, 24,
+    19, 15, 32, 37, 38, 30, 25, 21, 17, 31, 38, 40, 35, 29, 24, 19, 32, 39, 45,
+    39, 32, 28, 24, 34, 41, 46, 44, 37, 31, 25, 37, 44, 48, 48, 41, 33, 28, 40,
+    45, 49, 50, 43, 36, 30, 1,  3,  6,  8,  8,  6,  3,  1,  2,  5,  7,  8,  6,
+    4,  1,  2,  4,  7,  8,  7,  5,  2,  2,  5,  7,  9,  8,  7,  4,  5,  7,  9,
+    11, 9,  8,  9,  9,  10, 11, 11, 9,  8,  16, 14, 12, 11, 11, 9,  7,  1,  1,
+    4,  6,  5,  3,  1,  2,  1,  3,  5,  5,  2,  2,  2,  1,  2,  5,  5,  4,  3,
+    2,  3,  4,  6,  6,  5,  5,  6,  6,  7,  9,  8,  7,  5,  12, 11, 11, 11, 9,
+    7,  5,  19, 17, 13, 11, 9,  7,  5,  2,  2,  1,  0,  1,  2,  4,  2,  2,  1,
+    1,  1,  2,  4,  5,  2,  3,  3,  3,  3,  6,  8,  3,  6,  7,  7,  7,  7,  11,
+    8,  10, 10, 10, 10, 8,  16, 13, 15, 14, 13, 11, 8,  21, 20, 18, 16, 14, 12,
+    11, 5,  6,  7,  7,  7,  5,  7,  9,  6,  7,  8,  8,  8,  8,  12, 7,  9,  10,
+    11, 11, 10, 14, 10, 14, 15, 14, 14, 12, 15, 15, 18, 18, 18, 18, 15, 16, 23,
+    22, 21, 21, 19, 17, 22, 29, 26, 24, 22, 20, 20, 15, 14, 14, 14, 14, 13, 7,
+    18, 15, 16, 15, 16, 15, 8,  18, 17, 18, 19, 19, 17, 14, 17, 22, 23, 23, 23,
+    22, 18, 20, 28, 28, 27, 27, 25, 20, 23, 32, 34, 32, 28, 26, 22, 28, 35, 37,
+    34, 32, 28, 23, 24, 26, 24, 23, 20, 16, 12, 24, 28, 26, 26, 22, 18, 14, 24,
+    30, 29, 29, 25, 21, 18, 24, 32, 34, 33, 30, 25, 22, 28, 35, 40, 38, 34, 29,
+    23, 32, 37, 45, 42, 36, 30, 25, 36, 42, 45, 45, 39, 33, 27, 32, 38, 35, 29,
+    23, 19, 15, 32, 38, 37, 31, 26, 21, 18, 33, 38, 41, 35, 29, 26, 21, 32, 40,
+    45, 39, 35, 29, 25, 36, 43, 48, 44, 39, 33, 26, 38, 45, 50, 50, 41, 35, 29,
+    41, 47, 51, 51, 44, 37, 30, 1,  3,  6,  8,  8,  6,  3,  2,  2,  5,  7,  8,
+    6,  5,  2,  1,  5,  8,  9,  8,  6,  2,  3,  5,  8,  10, 9,  8,  5,  6,  8,
+    10, 12, 10, 9,  10, 11, 12, 13, 13, 10, 9,  17, 15, 13, 12, 12, 10, 9,  2,
+    1,  4,  6,  5,  2,  2,  2,  1,  3,  5,  5,  3,  2,  2,  2,  2,  6,  5,  4,
+    4,  2,  3,  5,  7,  7,  6,  7,  7,  7,  8,  10, 10, 8,  7,  13, 12, 13, 13,
+    10, 9,  7,  21, 18, 14, 13, 11, 9,  7,  2,  2,  1,  1,  0,  2,  4,  3,  2,
+    1,  1,  2,  3,  5,  7,  2,  3,  4,  5,  4,  6,  10, 3,  7,  8,  8,  8,  8,
+    13, 9,  11, 12, 12, 11, 8,  17, 15, 16, 15, 14, 13, 8,  23, 21, 19, 17, 15,
+    14, 13, 6,  6,  7,  7,  7,  4,  7,  11, 7,  8,  8,  9,  9,  8,  13, 7,  10,
+    11, 12, 12, 11, 16, 10, 15, 16, 16, 16, 13, 16, 17, 19, 20, 20, 19, 16, 18,
+    24, 25, 23, 22, 21, 19, 23, 30, 28, 25, 23, 22, 22, 16, 15, 15, 15, 15, 13,
+    7,  19, 17, 16, 16, 18, 16, 8,  19, 18, 19, 20, 21, 19, 15, 19, 23, 23, 25,
+    25, 24, 20, 20, 28, 30, 29, 29, 26, 21, 24, 33, 35, 33, 31, 29, 23, 30, 37,
+    38, 35, 33, 30, 25, 25, 26, 25, 24, 20, 16, 12, 24, 28, 26, 25, 22, 19, 15,
+    24, 30, 29, 30, 27, 23, 19, 25, 32, 35, 34, 31, 27, 23, 28, 36, 41, 39, 35,
+    30, 25, 33, 40, 46, 43, 38, 32, 27, 37, 42, 47, 46, 40, 34, 28, 32, 38, 35,
+    28, 23, 19, 16, 33, 37, 38, 31, 26, 22, 19, 34, 38, 40, 35, 31, 27, 22, 33,
+    40, 45, 40, 35, 31, 27, 35, 43, 47, 46, 39, 34, 29, 41, 46, 50, 50, 42, 36,
+    30, 43, 48, 50, 53, 45, 38, 32, 3,  5,  7,  8,  8,  6,  5,  2,  4,  6,  8,
+    9,  7,  6,  1,  3,  6,  9,  10, 9,  8,  2,  4,  7,  9,  12, 11, 10, 5,  7,
+    10, 11, 14, 12, 10, 11, 12, 13, 14, 14, 12, 10, 17, 16, 15, 14, 14, 12, 10,
+    1,  4,  5,  7,  5,  3,  2,  2,  2,  5,  6,  6,  4,  3,  2,  2,  5,  7,  7,
+    6,  5,  2,  3,  6,  8,  8,  7,  8,  6,  7,  10, 11, 11, 9,  8,  13, 13, 14,
+    14, 11, 10, 8,  21, 18, 15, 14, 12, 10, 8,  2,  1,  2,  2,  2,  0,  2,  2,
+    2,  1,  1,  2,  1,  4,  4,  2,  1,  3,  3,  3,  5,  9,  3,  5,  6,  6,  7,
+    7,  11, 9,  10, 10, 10, 10, 7,  17, 15, 15, 14, 12, 11, 7,  23, 21, 17, 15,
+    14, 12, 11, 4,  5,  5,  5,  5,  3,  5,  9,  6,  6,  6,  7,  7,  7,  12, 7,
+    8,  9,  10, 11, 9,  15, 10, 13, 14, 14, 14, 11, 15, 15, 18, 18, 18, 17, 15,
+    17, 23, 23, 22, 20, 19, 17, 24, 30, 26, 24, 22, 20, 19, 15, 13, 13, 12, 13,
+    11, 5,  18, 15, 14, 14, 15, 14, 7,  19, 16, 17, 19, 19, 18, 13, 19, 21, 22,
+    23, 23, 21, 18, 19, 27, 28, 27, 27, 24, 19, 23, 31, 34, 31, 29, 25, 21, 29,
+    35, 36, 33, 31, 28, 23, 23, 24, 22, 20, 18, 14, 10, 23, 26, 24, 22, 20, 17,
+    13, 23, 28, 27, 27, 23, 21, 17, 23, 30, 32, 30, 29, 24, 21, 27, 34, 37, 36,
+    32, 28, 23, 31, 38, 43, 42, 35, 30, 25, 35, 40, 44, 43, 37, 31, 26, 31, 33,
+    30, 25, 20, 17, 14, 30, 33, 33, 27, 23, 20, 17, 31, 33, 36, 31, 27, 25, 21,
+    30, 35, 42, 36, 32, 28, 25, 34, 39, 44, 43, 37, 32, 27, 38, 42, 47, 47, 40,
+    33, 28, 41, 46, 49, 48, 42, 36, 30, 6,  7,  9,  10, 10, 8,  6,  5,  6,  8,
+    10, 11, 9,  8,  4,  6,  8,  11, 13, 11, 9,  3,  6,  9,  12, 14, 12, 11, 5,
+    8,  10, 13, 15, 14, 11, 11, 13, 14, 14, 16, 14, 11, 17, 17, 15, 15, 14, 13,
+    11, 4,  6,  7,  9,  7,  5,  3,  3,  5,  7,  8,  7,  6,  5,  1,  5,  7,  9,
+    8,  7,  6,  1,  5,  8,  10, 9,  9,  8,  5,  8,  10, 12, 11, 10, 8,  12, 13,
+    15, 15, 12, 10, 8,  20, 18, 16, 14, 12, 10, 8,  1,  5,  5,  4,  4,  2,  0,
+    2,  3,  5,  4,  3,  3,  2,  2,  2,  4,  5,  4,  5,  4,  4,  3,  6,  6,  6,
+    6,  6,  8,  8,  10, 10, 10, 8,  6,  15, 15, 15, 13, 11, 9,  6,  22, 20, 17,
+    14, 11, 9,  8,  2,  2,  2,  2,  1,  2,  3,  5,  3,  3,  2,  3,  3,  4,  8,
+    5,  4,  6,  6,  6,  6,  11, 7,  9,  10, 10, 10, 8,  12, 14, 14, 14, 14, 13,
+    11, 15, 20, 19, 17, 16, 15, 13, 22, 26, 22, 20, 18, 16, 15, 12, 10, 9,  9,
+    9,  8,  3,  15, 12, 11, 11, 11, 10, 4,  15, 14, 13, 14, 14, 13, 10, 14, 18,
+    18, 18, 19, 17, 14, 17, 25, 23, 23, 23, 20, 15, 22, 28, 30, 27, 24, 21, 17,
+    26, 31, 33, 29, 26, 23, 19, 20, 19, 18, 16, 14, 10, 6,  19, 22, 18, 17, 15,
+    13, 9,  19, 23, 22, 21, 19, 16, 13, 20, 25, 26, 26, 23, 20, 17, 23, 30, 33,
+    30, 28, 23, 19, 27, 33, 38, 35, 29, 25, 20, 32, 35, 40, 38, 32, 27, 22, 24,
+    28, 25, 19, 15, 13, 10, 25, 28, 27, 21, 17, 15, 13, 25, 28, 29, 25, 22, 19,
+    16, 25, 29, 35, 31, 27, 23, 20, 28, 35, 39, 36, 31, 27, 22, 32, 37, 41, 41,
+    34, 28, 23, 36, 40, 42, 43, 37, 30, 26, 2,  3,  8,  12, 12, 10, 7,  2,  3,
+    6,  11, 11, 9,  4,  2,  2,  4,  8,  9,  7,  2,  2,  2,  2,  4,  7,  5,  2,
+    2,  2,  2,  3,  5,  5,  2,  6,  6,  6,  5,  4,  5,  2,  11, 11, 8,  6,  4,
+    5,  2,  2,  2,  5,  8,  9,  6,  2,  1,  2,  3,  7,  9,  4,  2,  2,  2,  2,
+    4,  5,  2,  2,  0,  2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  2,  2,  7,
+    7,  8,  6,  4,  3,  2,  15, 13, 10, 7,  5,  3,  2,  1,  2,  2,  2,  3,  2,
+    2,  0,  2,  2,  2,  2,  2,  1,  1,  2,  2,  2,  2,  2,  0,  1,  1,  1,  1,
+    1,  1,  2,  5,  4,  4,  4,  4,  3,  2,  11, 9,  9,  7,  5,  3,  2,  17, 16,
+    12, 9,  6,  4,  3,  1,  1,  1,  1,  1,  1,  5,  2,  2,  2,  3,  3,  3,  6,
+    2,  3,  3,  3,  4,  4,  6,  5,  5,  6,  6,  6,  7,  7,  6,  10, 10, 10, 10,
+    9,  9,  11, 15, 14, 14, 12, 11, 10, 17, 21, 18, 16, 14, 13, 12, 9,  9,  9,
+    9,  10, 9,  6,  11, 11, 10, 11, 11, 10, 6,  11, 12, 12, 12, 12, 11, 7,  11,
+    15, 14, 15, 15, 14, 11, 13, 20, 19, 19, 19, 18, 12, 17, 23, 25, 24, 21, 20,
+    14, 21, 26, 27, 24, 24, 21, 16, 18, 20, 19, 19, 16, 12, 7,  18, 21, 21, 21,
+    18, 12, 9,  18, 23, 22, 22, 18, 14, 10, 18, 24, 26, 25, 22, 18, 14, 20, 25,
+    30, 28, 25, 21, 16, 22, 28, 33, 31, 27, 23, 18, 25, 31, 34, 34, 29, 25, 19,
+    26, 31, 29, 24, 19, 15, 10, 26, 31, 31, 26, 21, 16, 11, 26, 31, 33, 27, 23,
+    18, 14, 25, 31, 35, 30, 26, 21, 18, 27, 32, 35, 33, 28, 24, 20, 29, 35, 37,
+    36, 31, 27, 22, 32, 34, 36, 37, 31, 28, 23, 2,  2,  3,  3,  3,  2,  2,  1,
+    2,  3,  3,  3,  2,  2,  1,  2,  2,  3,  3,  2,  1,  1,  1,  2,  2,  2,  2,
+    3,  3,  3,  3,  3,  4,  3,  3,  7,  6,  7,  6,  5,  3,  3,  13, 11, 8,  7,
+    5,  3,  3,  1,  2,  2,  3,  2,  2,  2,  1,  2,  2,  3,  2,  2,  1,  2,  2,
+    2,  2,  2,  2,  1,  2,  1,  2,  2,  1,  2,  3,  4,  4,  4,  4,  4,  3,  3,
+    9,  8,  8,  7,  5,  4,  3,  16, 14, 10, 8,  6,  4,  3,  2,  1,  2,  2,  2,
+    2,  3,  2,  0,  1,  1,  1,  2,  3,  2,  1,  1,  0,  1,  0,  4,  3,  2,  2,
+    2,  3,  3,  6,  7,  6,  6,  6,  6,  5,  6,  12, 11, 10, 9,  8,  7,  6,  18,
+    17, 13, 11, 9,  8,  7,  2,  4,  4,  4,  5,  4,  8,  3,  5,  5,  5,  6,  6,
+    8,  6,  6,  6,  6,  7,  7,  8,  9,  9,  9,  10, 10, 10, 10, 10, 13, 13, 13,
+    13, 13, 12, 12, 19, 18, 16, 16, 15, 14, 18, 25, 22, 19, 18, 16, 15, 12, 12,
+    12, 12, 12, 12, 8,  14, 14, 13, 13, 14, 12, 8,  13, 15, 15, 15, 15, 14, 11,
+    13, 19, 19, 18, 19, 18, 14, 17, 24, 23, 23, 23, 20, 16, 20, 27, 29, 27, 25,
+    22, 17, 25, 30, 31, 29, 28, 25, 19, 21, 23, 22, 21, 18, 14, 10, 21, 25, 23,
+    23, 20, 15, 11, 20, 26, 27, 26, 22, 17, 13, 21, 27, 28, 28, 25, 21, 17, 24,
+    30, 34, 33, 30, 24, 19, 27, 33, 40, 37, 32, 26, 21, 30, 36, 40, 39, 34, 29,
+    22, 29, 36, 33, 27, 20, 17, 13, 29, 35, 35, 28, 23, 18, 14, 29, 35, 38, 31,
+    25, 20, 16, 29, 34, 42, 35, 30, 25, 21, 31, 37, 43, 40, 34, 29, 22, 33, 40,
+    45, 43, 37, 30, 25, 35, 42, 46, 46, 39, 32, 27, 1,  3,  4,  5,  5,  4,  3,
+    1,  3,  4,  5,  5,  4,  3,  1,  2,  4,  4,  5,  4,  4,  1,  2,  4,  5,  5,
+    5,  6,  4,  4,  6,  7,  7,  6,  6,  8,  8,  10, 10, 8,  7,  6,  14, 12, 11,
+    10, 9,  7,  6,  1,  2,  4,  5,  4,  3,  1,  1,  1,  3,  4,  4,  3,  0,  2,
+    1,  3,  4,  3,  4,  3,  2,  2,  3,  5,  5,  5,  5,  5,  5,  6,  8,  7,  6,
+    5,  10, 10, 10, 11, 8,  6,  5,  18, 15, 11, 10, 8,  7,  5,  2,  1,  1,  1,
+    1,  1,  4,  2,  1,  0,  1,  1,  1,  4,  2,  1,  2,  2,  2,  2,  5,  5,  3,
+    5,  5,  5,  5,  7,  9,  7,  8,  8,  8,  8,  7,  14, 12, 13, 11, 10, 9,  7,
+    20, 18, 15, 14, 12, 10, 9,  2,  5,  6,  6,  6,  5,  8,  6,  6,  6,  7,  7,
+    7,  8,  9,  7,  8,  8,  9,  9,  9,  11, 9,  12, 12, 12, 12, 11, 12, 15, 16,
+    16, 16, 16, 14, 14, 21, 20, 19, 18, 17, 16, 20, 27, 24, 21, 20, 18, 17, 13,
+    13, 13, 14, 14, 13, 8,  15, 15, 14, 15, 15, 14, 8,  15, 17, 17, 17, 17, 16,
+    12, 15, 22, 21, 20, 21, 20, 16, 18, 26, 25, 24, 25, 23, 18, 23, 30, 32, 29,
+    28, 24, 20, 26, 33, 35, 31, 30, 26, 21, 23, 25, 23, 23, 19, 15, 11, 23, 27,
+    25, 24, 20, 16, 12, 23, 28, 27, 28, 24, 19, 16, 22, 30, 32, 31, 28, 23, 19,
+    26, 33, 36, 35, 31, 26, 21, 29, 35, 41, 40, 34, 29, 22, 33, 38, 43, 43, 36,
+    30, 24, 30, 37, 35, 28, 22, 18, 14, 31, 36, 37, 30, 24, 20, 16, 31, 36, 40,
+    33, 28, 22, 19, 30, 38, 44, 38, 31, 27, 23, 33, 39, 45, 42, 36, 31, 25, 35,
+    41, 48, 46, 39, 32, 27, 40, 44, 48, 51, 41, 35, 29, 1,  4,  6,  9,  9,  7,
+    4,  1,  3,  5,  8,  8,  7,  5,  1,  2,  5,  7,  9,  8,  6,  1,  3,  5,  8,
+    10, 8,  8,  5,  5,  7,  9,  11, 10, 8,  9,  9,  11, 12, 11, 9,  8,  15, 14,
+    12, 12, 11, 10, 8,  1,  2,  4,  7,  6,  3,  1,  1,  1,  4,  6,  6,  3,  1,
+    2,  1,  3,  6,  5,  4,  3,  2,  3,  4,  6,  6,  6,  6,  5,  6,  7,  9,  9,
+    7,  6,  11, 11, 11, 12, 9,  8,  6,  19, 16, 13, 12, 9,  8,  6,  2,  1,  1,
+    1,  2,  1,  3,  2,  1,  1,  0,  1,  1,  4,  3,  2,  2,  2,  2,  3,  5,  7,
+    3,  5,  6,  5,  6,  7,  10, 8,  9,  9,  10, 8,  7,  15, 13, 14, 13, 11, 10,
+    7,  21, 20, 17, 15, 13, 11, 10, 3,  5,  6,  6,  6,  4,  7,  8,  6,  7,  7,
+    7,  7,  7,  11, 7,  8,  9,  10, 10, 9,  13, 9,  13, 13, 13, 13, 11, 13, 15,
+    17, 16, 17, 17, 14, 16, 22, 22, 21, 19, 18, 16, 21, 28, 26, 23, 21, 20, 18,
+    14, 14, 14, 14, 14, 13, 7,  16, 15, 15, 15, 15, 14, 7,  16, 17, 17, 18, 18,
+    17, 13, 16, 21, 22, 22, 22, 21, 17, 19, 27, 27, 27, 26, 24, 19, 23, 30, 32,
+    31, 28, 26, 20, 28, 33, 35, 32, 31, 28, 22, 23, 24, 23, 23, 19, 16, 11, 22,
+    27, 25, 24, 21, 17, 13, 23, 30, 28, 28, 24, 21, 17, 23, 31, 33, 32, 28, 24,
+    21, 28, 34, 36, 36, 33, 27, 22, 31, 36, 44, 42, 36, 29, 24, 34, 39, 43, 45,
+    37, 32, 26, 31, 36, 35, 28, 22, 18, 14, 31, 37, 37, 31, 25, 20, 17, 31, 37,
+    41, 33, 29, 25, 19, 31, 38, 45, 39, 33, 28, 24, 35, 39, 46, 44, 36, 32, 26,
+    38, 45, 51, 50, 40, 33, 28, 40, 46, 50, 51, 43, 35, 30, 1,  4,  7,  10, 10,
+    8,  4,  1,  3,  6,  9,  9,  7,  5,  1,  2,  5,  8,  10, 8,  6,  2,  3,  6,
+    8,  11, 9,  8,  5,  6,  8,  10, 12, 10, 8,  10, 10, 12, 12, 12, 10, 8,  16,
+    14, 12, 12, 12, 10, 8,  1,  2,  5,  7,  7,  4,  1,  1,  1,  4,  6,  6,  4,
+    2,  2,  1,  3,  6,  6,  5,  3,  2,  3,  5,  7,  7,  6,  6,  5,  6,  8,  9,
+    9,  7,  6,  12, 11, 12, 12, 9,  8,  6,  19, 17, 13, 12, 10, 8,  6,  2,  1,
+    1,  1,  2,  2,  3,  2,  2,  1,  1,  0,  1,  4,  4,  2,  2,  3,  3,  2,  5,
+    8,  3,  6,  6,  6,  6,  7,  11, 8,  9,  10, 10, 9,  7,  16, 14, 14, 13, 12,
+    10, 7,  21, 20, 17, 15, 13, 12, 11, 4,  5,  6,  6,  6,  4,  7,  8,  6,  7,
+    7,  7,  7,  7,  12, 6,  8,  10, 10, 10, 9,  13, 9,  13, 13, 14, 14, 11, 14,
+    15, 17, 17, 18, 17, 14, 16, 22, 22, 21, 20, 18, 17, 21, 28, 25, 23, 22, 20,
+    19, 15, 14, 14, 14, 14, 13, 7,  17, 15, 15, 15, 15, 14, 7,  16, 17, 17, 19,
+    19, 17, 13, 17, 21, 23, 23, 22, 21, 17, 19, 27, 27, 27, 27, 24, 19, 24, 32,
+    34, 31, 30, 26, 20, 28, 36, 36, 34, 31, 29, 23, 23, 25, 23, 23, 20, 16, 11,
+    23, 27, 25, 24, 22, 17, 14, 23, 29, 28, 28, 24, 20, 17, 23, 31, 34, 33, 29,
+    25, 21, 27, 34, 38, 37, 33, 28, 22, 30, 38, 44, 42, 36, 30, 24, 35, 40, 44,
+    44, 37, 32, 26, 32, 35, 34, 27, 22, 18, 14, 31, 37, 36, 29, 24, 21, 17, 31,
+    36, 38, 33, 29, 24, 21, 32, 39, 43, 38, 33, 28, 24, 35, 42, 46, 44, 37, 32,
+    27, 37, 43, 49, 48, 42, 34, 28, 41, 46, 49, 51, 44, 36, 30, 3,  5,  6,  8,
+    8,  6,  4,  2,  5,  6,  8,  8,  6,  5,  1,  4,  6,  8,  9,  8,  6,  2,  4,
+    7,  9,  11, 9,  8,  4,  6,  8,  10, 12, 10, 8,  10, 10, 12, 12, 12, 10, 8,
+    15, 15, 13, 12, 12, 10, 8,  1,  4,  5,  7,  5,  4,  2,  1,  3,  5,  6,  5,
+    3,  2,  2,  2,  5,  6,  6,  5,  4,  2,  3,  5,  7,  7,  6,  6,  5,  6,  8,
+    10, 9,  7,  6,  12, 11, 12, 12, 10, 8,  6,  19, 16, 14, 12, 10, 8,  6,  2,
+    1,  2,  2,  3,  1,  3,  2,  1,  1,  1,  1,  0,  3,  3,  1,  1,  2,  2,  2,
+    4,  7,  3,  5,  5,  5,  5,  5,  11, 8,  9,  9,  9,  8,  5,  15, 14, 13, 12,
+    11, 9,  5,  21, 18, 16, 14, 12, 11, 9,  2,  5,  5,  5,  5,  4,  6,  7,  6,
+    6,  6,  6,  6,  6,  11, 6,  7,  8,  9,  9,  7,  14, 9,  12, 12, 12, 12, 10,
+    14, 14, 17, 16, 17, 16, 13, 16, 21, 21, 20, 19, 17, 16, 21, 27, 25, 22, 20,
+    18, 18, 14, 13, 13, 13, 13, 13, 6,  16, 15, 14, 14, 14, 13, 6,  17, 16, 16,
+    17, 17, 16, 12, 17, 21, 21, 21, 22, 19, 15, 19, 27, 27, 26, 25, 23, 18, 23,
+    30, 32, 30, 27, 25, 20, 27, 33, 34, 31, 29, 27, 21, 23, 23, 22, 21, 18, 15,
+    10, 23, 26, 23, 22, 19, 16, 12, 23, 28, 26, 25, 23, 19, 16, 23, 29, 32, 29,
+    27, 23, 19, 26, 33, 37, 34, 31, 26, 21, 31, 37, 40, 40, 33, 28, 23, 33, 38,
+    42, 42, 35, 29, 24, 30, 34, 30, 25, 20, 16, 13, 29, 34, 33, 27, 22, 20, 16,
+    30, 34, 36, 30, 26, 23, 19, 29, 36, 40, 34, 30, 27, 23, 33, 39, 43, 41, 35,
+    30, 25, 37, 41, 46, 46, 37, 31, 27, 40, 44, 47, 47, 40, 34, 28, 6,  7,  9,
+    12, 11, 9,  6,  5,  6,  8,  11, 11, 8,  6,  4,  6,  8,  10, 11, 9,  8,  3,
+    6,  9,  10, 13, 11, 9,  5,  7,  9,  11, 14, 12, 9,  9,  10, 11, 12, 14, 12,
+    9,  15, 14, 12, 12, 13, 12, 9,  4,  6,  7,  9,  8,  6,  4,  3,  6,  7,  8,
+    7,  5,  3,  1,  5,  7,  8,  7,  6,  5,  1,  4,  8,  9,  8,  8,  6,  5,  7,
+    9,  10, 9,  9,  6,  11, 11, 12, 12, 10, 8,  6,  18, 16, 13, 12, 10, 8,  6,
+    1,  5,  5,  4,  5,  4,  2,  1,  3,  4,  4,  4,  3,  0,  1,  2,  4,  4,  3,
+    3,  2,  2,  3,  5,  5,  4,  4,  4,  7,  8,  8,  7,  8,  6,  4,  14, 13, 12,
+    10, 8,  7,  4,  20, 17, 14, 11, 9,  7,  5,  1,  2,  2,  2,  2,  3,  5,  2,
+    3,  2,  2,  3,  3,  3,  7,  4,  4,  5,  5,  5,  4,  10, 7,  8,  8,  8,  8,
+    6,  10, 13, 12, 12, 12, 11, 9,  14, 19, 17, 15, 14, 13, 11, 19, 23, 20, 17,
+    15, 14, 13, 11, 10, 9,  9,  10, 9,  5,  13, 12, 11, 10, 11, 9,  3,  13, 13,
+    13, 14, 13, 11, 8,  13, 18, 17, 16, 17, 15, 12, 16, 23, 22, 21, 21, 18, 13,
+    20, 26, 27, 25, 22, 20, 15, 23, 28, 31, 26, 24, 22, 16, 19, 19, 17, 16, 15,
+    11, 8,  19, 22, 18, 17, 15, 11, 8,  19, 23, 21, 20, 17, 14, 12, 20, 25, 25,
+    24, 22, 18, 15, 22, 28, 31, 28, 25, 22, 17, 27, 31, 36, 33, 27, 23, 19, 29,
+    34, 38, 35, 29, 25, 20, 25, 27, 25, 19, 16, 13, 10, 25, 27, 27, 20, 17, 14,
+    11, 25, 28, 29, 24, 21, 18, 15, 25, 29, 34, 29, 25, 21, 18, 28, 33, 36, 34,
+    30, 24, 20, 31, 35, 40, 38, 32, 26, 21, 35, 38, 41, 41, 34, 28, 23, 3,  7,
+    12, 15, 16, 14, 11, 2,  5,  10, 14, 15, 14, 8,  2,  4,  8,  11, 13, 11, 6,
+    2,  2,  5,  8,  10, 10, 5,  2,  2,  3,  6,  8,  9,  5,  5,  6,  6,  5,  7,
+    9,  5,  12, 11, 8,  4,  7,  9,  5,  2,  4,  8,  12, 13, 11, 5,  2,  3,  7,
+    10, 12, 9,  3,  2,  2,  5,  7,  8,  6,  2,  1,  2,  2,  4,  5,  3,  2,  2,
+    3,  3,  3,  3,  3,  2,  7,  7,  7,  6,  3,  2,  2,  15, 13, 9,  7,  4,  3,
+    2,  2,  2,  3,  5,  6,  4,  2,  1,  2,  2,  3,  4,  3,  1,  0,  2,  2,  2,
+    2,  2,  1,  1,  1,  1,  1,  1,  1,  1,  4,  4,  4,  4,  4,  3,  2,  10, 9,
+    9,  8,  5,  3,  2,  17, 16, 12, 9,  6,  4,  2,  0,  1,  1,  1,  2,  2,  4,
+    1,  1,  1,  1,  1,  1,  5,  1,  2,  2,  3,  3,  3,  5,  4,  4,  5,  5,  5,
+    6,  7,  5,  9,  8,  9,  9,  8,  7,  11, 14, 13, 13, 11, 10, 9,  17, 20, 17,
+    15, 13, 12, 11, 8,  8,  8,  9,  9,  8,  5,  10, 10, 9,  10, 10, 9,  5,  10,
+    11, 11, 11, 12, 11, 6,  10, 14, 13, 14, 14, 13, 9,  12, 18, 18, 18, 18, 17,
+    11, 16, 21, 22, 21, 20, 19, 13, 19, 24, 24, 22, 21, 20, 16, 17, 18, 18, 18,
+    15, 11, 7,  17, 20, 19, 19, 16, 12, 7,  17, 22, 22, 21, 19, 14, 9,  17, 22,
+    23, 22, 20, 17, 13, 18, 24, 26, 24, 23, 20, 15, 21, 26, 29, 28, 24, 21, 17,
+    23, 28, 30, 29, 26, 22, 18, 25, 28, 26, 22, 19, 14, 9,  24, 28, 28, 24, 20,
+    16, 10, 24, 29, 31, 24, 21, 17, 13, 24, 29, 31, 26, 23, 20, 17, 25, 28, 32,
+    30, 25, 22, 18, 27, 29, 33, 32, 27, 23, 20, 28, 31, 33, 34, 29, 24, 21, 2,
+    2,  3,  5,  5,  3,  2,  2,  2,  3,  4,  5,  2,  2,  2,  2,  2,  3,  3,  2,
+    1,  0,  2,  2,  2,  3,  2,  3,  2,  2,  3,  3,  4,  3,  3,  6,  6,  7,  6,
+    4,  3,  3,  12, 11, 8,  6,  5,  3,  3,  1,  2,  3,  3,  3,  2,  2,  1,  2,
+    2,  3,  2,  2,  1,  1,  2,  2,  2,  2,  2,  1,  2,  1,  2,  2,  2,  1,  3,
+    4,  3,  4,  4,  4,  3,  3,  9,  8,  8,  7,  5,  3,  3,  16, 13, 10, 8,  5,
+    4,  3,  1,  2,  2,  2,  2,  2,  2,  2,  1,  2,  2,  2,  2,  2,  2,  0,  1,
+    1,  1,  1,  3,  2,  2,  2,  1,  2,  2,  5,  6,  5,  5,  5,  5,  4,  5,  12,
+    10, 10, 8,  7,  5,  5,  18, 17, 12, 10, 8,  7,  6,  2,  3,  3,  3,  4,  4,
+    7,  2,  4,  4,  5,  5,  5,  8,  5,  5,  5,  5,  6,  6,  7,  8,  8,  8,  8,
+    9,  9,  9,  9,  13, 12, 12, 13, 12, 11, 12, 18, 16, 16, 15, 13, 12, 18, 23,
+    20, 18, 17, 15, 14, 11, 11, 11, 11, 11, 11, 7,  12, 13, 12, 13, 13, 12, 7,
+    12, 14, 14, 14, 14, 13, 9,  13, 18, 17, 17, 18, 16, 13, 16, 22, 22, 21, 22,
+    19, 14, 19, 26, 27, 26, 24, 22, 16, 24, 29, 31, 28, 26, 23, 18, 19, 21, 20,
+    20, 17, 13, 9,  20, 23, 22, 23, 19, 14, 10, 20, 25, 25, 24, 20, 16, 12, 20,
+    26, 28, 28, 24, 20, 16, 23, 28, 32, 32, 29, 23, 18, 26, 32, 37, 37, 31, 25,
+    20, 28, 34, 39, 39, 33, 28, 22, 28, 34, 32, 26, 20, 16, 12, 28, 34, 34, 27,
+    22, 17, 13, 27, 34, 38, 30, 24, 20, 16, 28, 34, 39, 34, 28, 23, 20, 30, 36,
+    41, 39, 32, 28, 22, 32, 38, 44, 41, 36, 30, 24, 34, 40, 45, 43, 38, 31, 25,
+    2,  4,  5,  6,  6,  5,  4,  1,  4,  5,  6,  6,  5,  4,  0,  3,  5,  5,  5,
+    4,  4,  1,  2,  4,  5,  5,  5,  6,  3,  4,  6,  6,  7,  6,  6,  8,  8,  9,
+    9,  8,  6,  6,  13, 12, 11, 9,  8,  6,  6,  0,  3,  5,  5,  5,  4,  2,  1,
+    2,  4,  5,  5,  4,  2,  1,  1,  4,  4,  4,  3,  2,  2,  2,  3,  5,  4,  5,
+    5,  5,  4,  6,  7,  7,  6,  5,  9,  9,  10, 10, 8,  6,  5,  17, 14, 11, 10,
+    8,  6,  5,  1,  1,  2,  3,  3,  1,  4,  2,  1,  2,  2,  2,  1,  4,  2,  1,
+    0,  0,  0,  0,  5,  4,  2,  3,  3,  3,  3,  6,  8,  6,  7,  7,  7,  6,  6,
+    13, 11, 11, 10, 9,  7,  6,  19, 18, 14, 12, 10, 9,  8,  2,  4,  5,  5,  5,
+    5,  7,  4,  5,  5,  6,  6,  6,  8,  8,  6,  7,  7,  7,  8,  8,  10, 9,  10,
+    10, 11, 11, 10, 11, 14, 14, 15, 15, 14, 13, 13, 20, 19, 18, 17, 15, 15, 19,
+    26, 22, 20, 18, 17, 16, 12, 13, 12, 13, 13, 12, 7,  13, 14, 14, 14, 14, 13,
+    8,  14, 16, 16, 16, 16, 15, 11, 13, 20, 19, 19, 20, 18, 15, 18, 25, 24, 24,
+    24, 21, 16, 22, 28, 30, 28, 26, 23, 18, 26, 31, 33, 29, 28, 25, 20, 22, 23,
+    22, 22, 18, 14, 10, 22, 25, 24, 24, 20, 16, 12, 22, 27, 26, 26, 23, 18, 14,
+    21, 29, 30, 29, 26, 22, 18, 26, 31, 36, 34, 30, 25, 20, 27, 34, 39, 38, 33,
+    27, 21, 31, 37, 41, 41, 34, 28, 23, 29, 35, 34, 27, 22, 17, 13, 29, 36, 36,
+    29, 24, 19, 14, 29, 36, 39, 32, 26, 22, 17, 30, 36, 42, 35, 30, 26, 22, 31,
+    38, 44, 41, 33, 29, 24, 34, 40, 47, 47, 38, 30, 26, 37, 43, 47, 47, 39, 33,
+    27, 2,  6,  9,  11, 11, 10, 7,  2,  5,  8,  11, 11, 9,  6,  0,  3,  7,  9,
+    10, 7,  6,  1,  2,  5,  7,  9,  8,  7,  3,  4,  6,  8,  10, 9,  7,  7,  8,
+    10, 10, 10, 9,  7,  14, 13, 11, 10, 10, 9,  7,  0,  3,  7,  10, 9,  6,  3,
+    1,  2,  5,  8,  9,  6,  2,  1,  1,  4,  6,  6,  4,  2,  2,  2,  4,  6,  6,
+    5,  4,  4,  5,  6,  8,  7,  6,  4,  10, 9,  10, 10, 8,  6,  4,  17, 14, 11,
+    11, 8,  6,  4,  1,  1,  2,  3,  4,  3,  5,  2,  0,  2,  2,  3,  2,  4,  2,
+    1,  0,  0,  0,  0,  3,  4,  2,  3,  3,  3,  3,  5,  8,  6,  7,  7,  7,  6,
+    5,  13, 11, 11, 10, 9,  7,  5,  19, 17, 14, 12, 10, 9,  8,  2,  4,  5,  5,
+    6,  6,  8,  5,  5,  6,  6,  7,  7,  7,  10, 6,  7,  7,  7,  7,  7,  11, 9,
+    10, 11, 11, 10, 9,  12, 14, 14, 15, 14, 14, 12, 13, 20, 19, 18, 17, 16, 14,
+    19, 26, 23, 21, 18, 17, 16, 12, 13, 12, 13, 14, 13, 8,  15, 14, 14, 15, 15,
+    14, 7,  14, 16, 16, 16, 15, 14, 11, 14, 20, 19, 19, 20, 17, 14, 17, 25, 24,
+    23, 24, 21, 16, 21, 28, 30, 28, 26, 23, 18, 25, 31, 33, 30, 27, 25, 20, 22,
+    24, 22, 22, 19, 16, 12, 21, 26, 24, 24, 20, 16, 12, 22, 28, 26, 26, 21, 18,
+    14, 22, 29, 30, 30, 26, 22, 18, 25, 33, 36, 34, 30, 25, 19, 28, 34, 41, 38,
+    33, 27, 22, 31, 37, 42, 41, 36, 29, 23, 30, 35, 34, 28, 23, 18, 14, 29, 36,
+    36, 30, 23, 19, 14, 30, 35, 38, 32, 26, 21, 17, 29, 37, 41, 35, 31, 25, 21,
+    32, 39, 45, 39, 34, 29, 23, 34, 41, 47, 46, 38, 31, 26, 37, 43, 47, 46, 40,
+    33, 27, 3,  6,  9,  13, 13, 10, 7,  2,  5,  8,  12, 12, 9,  6,  0,  4,  7,
+    10, 11, 8,  6,  1,  3,  5,  8,  10, 9,  7,  4,  4,  6,  8,  11, 9,  7,  7,
+    8,  10, 10, 10, 9,  7,  13, 12, 10, 10, 10, 9,  7,  1,  4,  7,  10, 10, 7,
+    3,  1,  2,  6,  9,  9,  6,  2,  1,  1,  5,  7,  7,  4,  2,  1,  2,  4,  6,
+    6,  5,  4,  4,  5,  6,  8,  7,  5,  4,  10, 9,  10, 10, 7,  6,  4,  16, 14,
+    11, 10, 8,  6,  4,  1,  1,  3,  4,  5,  3,  4,  1,  1,  2,  2,  3,  2,  3,
+    2,  1,  0,  0,  0,  1,  3,  4,  2,  3,  3,  3,  3,  4,  8,  6,  7,  7,  7,
+    6,  4,  13, 12, 11, 10, 9,  7,  4,  19, 17, 14, 12, 10, 9,  8,  1,  5,  5,
+    5,  6,  6,  8,  5,  6,  6,  6,  7,  7,  7,  9,  6,  7,  7,  7,  7,  6,  11,
+    8,  11, 11, 10, 11, 8,  12, 14, 15, 15, 15, 14, 12, 13, 19, 19, 18, 17, 15,
+    14, 19, 26, 23, 20, 19, 17, 16, 12, 13, 13, 13, 14, 13, 8,  14, 15, 14, 14,
+    15, 13, 7,  15, 16, 16, 16, 16, 14, 11, 14, 20, 20, 20, 20, 18, 14, 17, 25,
+    25, 24, 23, 21, 16, 22, 29, 30, 28, 26, 23, 18, 26, 32, 33, 31, 28, 25, 20,
+    22, 23, 23, 23, 20, 16, 11, 22, 26, 24, 24, 21, 16, 12, 23, 29, 27, 26, 22,
+    17, 14, 23, 29, 31, 29, 26, 22, 18, 25, 32, 37, 34, 30, 25, 19, 28, 35, 41,
+    38, 33, 27, 22, 31, 36, 41, 40, 34, 30, 23, 31, 35, 33, 27, 22, 18, 14, 30,
+    36, 36, 29, 23, 18, 14, 29, 36, 38, 31, 25, 21, 17, 31, 36, 40, 35, 30, 26,
+    22, 32, 38, 43, 40, 34, 29, 23, 36, 41, 45, 45, 37, 31, 25, 37, 43, 46, 46,
+    40, 34, 27, 3,  6,  8,  9,  9,  7,  5,  2,  6,  7,  9,  9,  6,  4,  1,  4,
+    6,  8,  8,  6,  5,  1,  3,  5,  7,  9,  8,  6,  4,  4,  7,  8,  11, 9,  6,
+    8,  8,  10, 10, 10, 9,  6,  13, 12, 10, 10, 10, 9,  6,  0,  4,  6,  8,  7,
+    5,  3,  1,  3,  5,  7,  6,  4,  2,  1,  1,  5,  6,  4,  3,  2,  2,  2,  4,
+    6,  5,  5,  4,  5,  5,  6,  8,  7,  6,  4,  10, 9,  10, 10, 7,  6,  4,  16,
+    13, 11, 10, 8,  6,  4,  1,  1,  3,  3,  4,  3,  5,  2,  1,  2,  3,  3,  2,
+    3,  2,  1,  0,  0,  0,  0,  2,  4,  2,  3,  3,  3,  3,  4,  9,  7,  7,  7,
+    7,  6,  4,  14, 11, 11, 10, 9,  7,  4,  18, 16, 13, 11, 10, 9,  8,  2,  5,
+    5,  6,  6,  6,  8,  5,  6,  6,  6,  7,  7,  6,  9,  6,  7,  7,  8,  7,  6,
+    11, 8,  11, 11, 10, 11, 8,  12, 14, 15, 14, 15, 14, 11, 13, 20, 19, 18, 16,
+    16, 14, 18, 25, 22, 20, 18, 17, 16, 13, 13, 13, 13, 14, 13, 8,  15, 15, 14,
+    15, 15, 13, 7,  15, 16, 16, 16, 16, 14, 10, 15, 20, 20, 20, 20, 18, 15, 18,
+    25, 24, 23, 24, 21, 16, 22, 28, 29, 28, 26, 23, 18, 25, 30, 32, 29, 28, 25,
+    20, 23, 24, 23, 22, 19, 16, 11, 23, 26, 24, 22, 20, 16, 11, 23, 28, 26, 24,
+    21, 18, 14, 22, 29, 31, 28, 25, 22, 18, 25, 31, 35, 34, 29, 24, 19, 28, 33,
+    39, 37, 31, 26, 22, 31, 35, 41, 39, 33, 27, 23, 29, 34, 32, 26, 22, 18, 14,
+    30, 34, 33, 27, 22, 18, 14, 29, 33, 36, 29, 24, 21, 17, 29, 34, 39, 34, 29,
+    26, 21, 32, 37, 42, 38, 34, 27, 23, 34, 40, 44, 44, 35, 29, 25, 37, 41, 45,
+    45, 37, 31, 27, 7,  9,  11, 13, 13, 11, 8,  6,  8,  10, 12, 13, 10, 6,  5,
+    7,  9,  11, 11, 8,  6,  3,  6,  7,  10, 12, 10, 8,  4,  6,  8,  10, 13, 10,
+    8,  7,  8,  9,  10, 12, 10, 7,  11, 10, 9,  9,  11, 11, 8,  5,  7,  9,  11,
+    10, 7,  5,  4,  6,  8,  10, 9,  6,  4,  1,  6,  7,  9,  7,  5,  3,  0,  4,
+    6,  8,  7,  6,  5,  4,  5,  7,  8,  8,  7,  5,  9,  8,  9,  10, 7,  7,  5,
+    13, 11, 10, 9,  8,  6,  5,  2,  6,  6,  6,  6,  5,  4,  0,  4,  5,  5,  5,
+    4,  2,  1,  3,  5,  3,  3,  3,  0,  1,  2,  3,  3,  3,  3,  2,  6,  6,  6,
+    5,  5,  4,  2,  12, 10, 8,  8,  6,  4,  2,  15, 13, 10, 8,  6,  5,  3,  1,
+    2,  3,  3,  4,  5,  6,  1,  3,  3,  4,  4,  4,  5,  4,  5,  4,  4,  4,  4,
+    4,  7,  7,  7,  6,  6,  6,  5,  8,  12, 11, 10, 10, 9,  8,  12, 16, 14, 13,
+    12, 11, 10, 15, 20, 16, 14, 14, 12, 11, 11, 10, 10, 10, 11, 10, 6,  12, 12,
+    11, 11, 12, 10, 5,  12, 14, 13, 12, 12, 10, 7,  12, 17, 15, 15, 15, 13, 10,
+    15, 22, 20, 19, 18, 16, 12, 19, 23, 25, 22, 20, 18, 13, 20, 25, 27, 24, 22,
+    19, 15, 19, 19, 18, 17, 15, 12, 9,  19, 22, 19, 18, 16, 12, 8,  19, 23, 21,
+    19, 16, 13, 10, 19, 23, 24, 22, 19, 17, 13, 21, 27, 29, 27, 23, 20, 15, 24,
+    28, 34, 29, 25, 20, 17, 26, 30, 34, 34, 27, 23, 18, 25, 28, 26, 20, 17, 14,
+    11, 25, 28, 28, 22, 18, 14, 11, 25, 28, 30, 23, 19, 16, 12, 25, 29, 32, 27,
+    23, 19, 16, 27, 31, 36, 33, 27, 22, 18, 29, 33, 38, 36, 29, 24, 20, 30, 36,
+    38, 38, 32, 26, 21, 6,  10, 15, 18, 18, 17, 15, 5,  9,  13, 16, 17, 15, 12,
+    3,  7,  11, 14, 15, 13, 10, 2,  5,  8,  11, 13, 13, 9,  2,  2,  6,  9,  11,
+    13, 10, 5,  5,  5,  8,  11, 13, 10, 11, 10, 6,  6,  10, 13, 9,  3,  7,  12,
+    15, 15, 13, 10, 2,  6,  10, 13, 15, 13, 7,  2,  4,  8,  11, 12, 10, 4,  2,
+    2,  5,  8,  8,  8,  3,  2,  3,  3,  6,  7,  7,  3,  7,  7,  6,  5,  5,  6,
+    3,  14, 12, 9,  5,  4,  4,  3,  2,  4,  7,  9,  10, 9,  4,  2,  3,  5,  7,
+    8,  7,  2,  1,  2,  4,  5,  4,  4,  1,  0,  2,  1,  1,  2,  1,  2,  4,  4,
+    4,  4,  4,  3,  2,  10, 10, 9,  8,  6,  3,  2,  16, 15, 11, 9,  7,  4,  2,
+    1,  1,  1,  2,  2,  3,  3,  0,  1,  1,  1,  1,  1,  4,  1,  1,  2,  2,  2,
+    2,  4,  3,  3,  3,  4,  4,  4,  5,  5,  8,  7,  8,  8,  7,  6,  10, 13, 12,
+    12, 10, 9,  8,  16, 18, 15, 13, 12, 11, 10, 7,  7,  8,  8,  9,  7,  3,  9,
+    9,  9,  10, 9,  8,  4,  9,  10, 11, 11, 11, 10, 5,  9,  13, 13, 13, 13, 12,
+    8,  11, 16, 16, 16, 15, 15, 10, 14, 19, 19, 18, 17, 16, 12, 18, 21, 21, 19,
+    18, 17, 14, 16, 16, 16, 16, 14, 11, 6,  16, 19, 17, 17, 15, 12, 7,  16, 20,
+    19, 18, 16, 13, 8,  15, 20, 20, 19, 17, 15, 12, 17, 21, 23, 21, 19, 17, 14,
+    19, 22, 25, 24, 21, 18, 15, 21, 23, 27, 25, 22, 18, 16, 21, 25, 23, 19, 17,
+    14, 9,  21, 25, 26, 20, 17, 15, 10, 22, 25, 27, 21, 18, 15, 12, 21, 24, 28,
+    22, 18, 17, 15, 20, 25, 29, 26, 21, 19, 16, 22, 26, 29, 28, 23, 20, 17, 24,
+    27, 30, 30, 24, 21, 18, 3,  3,  5,  8,  8,  6,  3,  2,  3,  4,  7,  8,  5,
+    3,  2,  3,  4,  5,  6,  4,  2,  2,  2,  3,  3,  4,  2,  2,  1,  2,  2,  2,
+    3,  2,  2,  5,  5,  5,  4,  3,  2,  2,  11, 9,  7,  5,  3,  2,  2,  2,  3,
+    4,  6,  5,  4,  3,  2,  3,  4,  5,  5,  3,  2,  1,  2,  3,  3,  3,  3,  2,
+    1,  1,  2,  2,  2,  2,  2,  2,  2,  3,  3,  2,  2,  2,  7,  6,  7,  6,  3,
+    2,  2,  14, 12, 8,  6,  4,  2,  2,  1,  2,  3,  3,  3,  3,  3,  1,  2,  3,
+    3,  3,  3,  3,  1,  2,  2,  2,  2,  2,  2,  2,  0,  1,  1,  1,  1,  2,  4,
+    4,  3,  3,  4,  2,  3,  10, 9,  8,  7,  5,  3,  3,  17, 15, 11, 8,  6,  5,
+    4,  2,  3,  3,  4,  4,  4,  7,  2,  4,  4,  5,  5,  5,  8,  3,  5,  5,  6,
+    6,  6,  8,  5,  6,  6,  6,  7,  7,  8,  6,  10, 10, 10, 10, 10, 9,  10, 16,
+    15, 14, 13, 11, 11, 16, 21, 18, 16, 14, 13, 12, 10, 11, 11, 11, 12, 11, 7,
+    11, 12, 12, 12, 13, 12, 8,  12, 13, 14, 14, 14, 13, 9,  12, 16, 16, 15, 15,
+    15, 11, 14, 20, 19, 19, 19, 17, 12, 17, 23, 25, 24, 22, 20, 14, 20, 27, 29,
+    26, 24, 22, 16, 19, 21, 21, 20, 18, 14, 9,  20, 23, 23, 23, 19, 14, 10, 19,
+    25, 25, 24, 21, 16, 11, 19, 24, 26, 26, 22, 18, 14, 21, 26, 31, 29, 27, 21,
+    16, 23, 29, 34, 34, 28, 24, 17, 26, 31, 35, 34, 31, 25, 20, 28, 34, 32, 26,
+    22, 17, 12, 27, 34, 34, 28, 23, 18, 13, 27, 33, 37, 30, 24, 19, 14, 28, 33,
+    38, 31, 26, 22, 18, 27, 34, 39, 36, 30, 25, 19, 29, 36, 39, 39, 33, 27, 22,
+    33, 37, 39, 41, 34, 30, 24, 5,  8,  9,  10, 10, 9,  8,  4,  7,  9,  10, 9,
+    8,  7,  3,  6,  8,  8,  8,  7,  5,  2,  4,  6,  6,  7,  5,  4,  1,  2,  4,
+    5,  5,  5,  4,  5,  5,  7,  6,  5,  5,  4,  10, 10, 8,  7,  6,  5,  4,  3,
+    6,  8,  9,  8,  8,  6,  2,  5,  7,  9,  8,  7,  5,  1,  4,  7,  7,  7,  6,
+    4,  1,  2,  4,  5,  5,  4,  3,  2,  2,  4,  5,  4,  4,  3,  7,  6,  8,  7,
+    5,  4,  3,  14, 11, 9,  8,  5,  4,  3,  2,  4,  6,  6,  7,  5,  6,  1,  2,
+    5,  5,  6,  5,  5,  1,  2,  3,  3,  3,  3,  3,  1,  1,  0,  0,  0,  0,  3,
+    5,  4,  3,  3,  3,  3,  3,  10, 9,  8,  7,  5,  4,  3,  16, 15, 11, 8,  7,
+    6,  5,  1,  4,  5,  5,  6,  6,  9,  2,  5,  5,  6,  7,  7,  8,  4,  6,  6,
+    6,  6,  7,  7,  7,  7,  7,  7,  7,  8,  7,  8,  11, 11, 11, 11, 10, 10, 10,
+    17, 16, 14, 13, 12, 11, 16, 22, 19, 17, 15, 14, 13, 11, 12, 12, 12, 13, 12,
+    8,  12, 13, 14, 14, 14, 13, 8,  12, 15, 15, 15, 15, 13, 9,  12, 17, 16, 16,
+    16, 15, 11, 15, 21, 21, 20, 20, 18, 13, 18, 25, 26, 25, 22, 19, 14, 23, 27,
+    29, 26, 25, 22, 16, 21, 22, 22, 22, 19, 15, 11, 21, 25, 24, 24, 20, 15, 11,
+    21, 26, 25, 25, 20, 16, 12, 21, 26, 27, 26, 23, 18, 14, 21, 28, 31, 31, 27,
+    21, 16, 24, 30, 37, 35, 29, 23, 18, 28, 33, 37, 38, 31, 25, 20, 29, 33, 34,
+    27, 22, 18, 13, 28, 36, 36, 29, 23, 18, 14, 28, 35, 38, 30, 24, 19, 14, 28,
+    34, 39, 32, 26, 22, 18, 29, 35, 42, 38, 32, 26, 20, 31, 37, 43, 41, 34, 27,
+    22, 33, 39, 44, 44, 37, 30, 23, 5,  9,  12, 15, 15, 13, 10, 4,  8,  11, 14,
+    15, 12, 9,  3,  6,  10, 13, 13, 10, 7,  2,  4,  7,  10, 11, 8,  7,  1,  2,
+    5,  8,  10, 9,  7,  5,  5,  7,  8,  9,  8,  7,  10, 10, 8,  8,  8,  8,  7,
+    3,  7,  10, 13, 12, 10, 7,  2,  5,  9,  12, 12, 9,  5,  1,  4,  8,  10, 10,
+    7,  4,  1,  2,  5,  7,  7,  5,  3,  3,  2,  4,  6,  6,  6,  3,  7,  6,  8,
+    8,  6,  5,  3,  13, 12, 9,  8,  6,  4,  3,  1,  4,  6,  7,  8,  6,  6,  1,
+    2,  5,  6,  6,  5,  4,  1,  1,  3,  3,  3,  3,  3,  1,  1,  0,  0,  0,  0,
+    3,  5,  4,  3,  3,  3,  3,  3,  10, 8,  8,  7,  5,  4,  3,  16, 14, 11, 9,
+    7,  5,  5,  1,  4,  5,  5,  6,  7,  8,  1,  5,  6,  6,  7,  7,  7,  5,  6,
+    6,  6,  6,  7,  7,  8,  7,  7,  7,  7,  7,  6,  9,  11, 11, 11, 11, 11, 9,
+    11, 17, 16, 15, 13, 12, 11, 16, 22, 19, 17, 15, 14, 12, 11, 12, 12, 13, 14,
+    13, 9,  12, 14, 13, 14, 15, 13, 8,  12, 15, 15, 14, 15, 13, 9,  12, 17, 16,
+    16, 16, 15, 11, 15, 22, 20, 20, 20, 18, 12, 18, 25, 27, 25, 22, 19, 14, 23,
+    28, 29, 27, 25, 22, 16, 21, 22, 22, 22, 19, 15, 11, 21, 24, 24, 24, 20, 15,
+    11, 21, 26, 26, 25, 20, 16, 11, 21, 26, 28, 26, 22, 18, 15, 22, 27, 31, 30,
+    26, 21, 16, 25, 31, 37, 35, 29, 23, 18, 28, 33, 37, 37, 32, 25, 20, 29, 35,
+    33, 27, 22, 18, 14, 29, 36, 36, 30, 23, 19, 14, 30, 35, 38, 30, 24, 19, 14,
+    29, 35, 40, 33, 27, 22, 18, 28, 35, 40, 38, 31, 25, 20, 31, 37, 43, 40, 34,
+    27, 22, 33, 40, 44, 43, 37, 29, 23, 6,  9,  13, 16, 16, 14, 10, 5,  8,  11,
+    15, 15, 12, 9,  3,  6,  10, 13, 14, 11, 7,  2,  4,  7,  10, 12, 9,  6,  1,
+    3,  5,  8,  11, 9,  6,  5,  6,  7,  8,  10, 9,  6,  10, 9,  8,  8,  9,  9,
+    6,  3,  7,  10, 13, 13, 10, 7,  2,  6,  9,  12, 12, 9,  5,  1,  4,  8,  10,
+    10, 7,  3,  1,  2,  5,  7,  7,  5,  2,  3,  2,  4,  6,  6,  5,  2,  7,  6,
+    8,  8,  5,  5,  2,  13, 10, 9,  8,  6,  4,  3,  1,  4,  6,  7,  8,  6,  6,
+    1,  3,  5,  6,  6,  5,  4,  1,  2,  3,  3,  3,  3,  3,  2,  1,  0,  0,  0,
+    0,  3,  5,  4,  4,  4,  4,  3,  3,  11, 9,  8,  7,  6,  4,  3,  15, 13, 10,
+    9,  7,  6,  5,  1,  5,  5,  6,  6,  7,  9,  2,  6,  6,  6,  7,  7,  7,  5,
+    6,  7,  7,  7,  7,  6,  8,  7,  8,  7,  7,  7,  6,  9,  11, 12, 11, 12, 10,
+    9,  11, 17, 16, 15, 13, 12, 11, 15, 21, 19, 17, 15, 14, 13, 11, 13, 13, 13,
+    14, 13, 9,  12, 14, 14, 14, 15, 13, 8,  12, 16, 15, 15, 15, 13, 10, 13, 18,
+    17, 17, 16, 15, 11, 14, 22, 21, 21, 21, 18, 13, 19, 26, 27, 25, 22, 20, 15,
+    22, 27, 29, 27, 25, 22, 16, 21, 24, 22, 22, 19, 16, 11, 22, 26, 25, 24, 21,
+    16, 11, 21, 28, 26, 25, 20, 16, 12, 21, 27, 27, 27, 23, 19, 15, 23, 28, 34,
+    31, 27, 22, 16, 25, 31, 37, 35, 28, 24, 18, 28, 33, 37, 37, 32, 26, 19, 31,
+    35, 33, 29, 22, 18, 14, 30, 36, 36, 30, 23, 18, 15, 29, 35, 37, 31, 24, 20,
+    14, 31, 36, 39, 33, 28, 22, 18, 29, 35, 40, 37, 32, 26, 20, 31, 38, 42, 41,
+    34, 27, 22, 34, 39, 44, 43, 37, 31, 24, 6,  9,  12, 16, 16, 13, 11, 5,  8,
+    12, 15, 16, 12, 9,  3,  7,  10, 13, 14, 11, 7,  2,  5,  8,  10, 13, 9,  6,
+    1,  3,  6,  8,  12, 10, 7,  5,  5,  7,  8,  11, 10, 6,  8,  7,  7,  7,  9,
+    9,  7,  3,  7,  10, 13, 13, 10, 7,  2,  6,  9,  12, 12, 9,  5,  1,  4,  8,
+    10, 10, 7,  3,  1,  2,  5,  7,  7,  5,  3,  3,  2,  4,  6,  6,  5,  3,  7,
+    6,  7,  7,  5,  5,  3,  11, 8,  7,  7,  5,  4,  3,  2,  5,  6,  7,  8,  6,
+    6,  1,  3,  5,  6,  6,  5,  4,  1,  2,  4,  3,  3,  3,  3,  2,  1,  0,  0,
+    0,  0,  2,  6,  4,  4,  4,  4,  3,  2,  9,  8,  6,  6,  5,  4,  2,  13, 10,
+    8,  7,  7,  6,  5,  1,  5,  5,  6,  6,  7,  9,  2,  6,  6,  7,  7,  7,  7,
+    6,  6,  7,  7,  7,  7,  6,  8,  7,  8,  8,  7,  8,  6,  9,  12, 12, 11, 11,
+    10, 9,  10, 15, 15, 14, 13, 12, 11, 12, 18, 17, 15, 14, 14, 13, 12, 13, 13,
+    13, 14, 13, 9,  13, 14, 14, 15, 15, 13, 7,  13, 16, 16, 15, 15, 13, 10, 13,
+    18, 17, 16, 17, 15, 11, 15, 23, 21, 21, 20, 18, 13, 18, 24, 26, 24, 22, 20,
+    14, 20, 25, 28, 25, 23, 22, 16, 22, 24, 22, 21, 19, 15, 11, 22, 25, 24, 23,
+    20, 16, 12, 22, 28, 26, 24, 20, 16, 12, 22, 26, 27, 25, 22, 19, 15, 23, 29,
+    33, 30, 25, 22, 16, 25, 30, 35, 33, 28, 23, 18, 26, 31, 36, 36, 30, 25, 20,
+    30, 34, 31, 26, 22, 18, 14, 30, 33, 33, 28, 22, 19, 14, 29, 33, 35, 28, 23,
+    19, 15, 29, 34, 37, 30, 26, 22, 18, 29, 34, 39, 36, 29, 24, 21, 31, 36, 40,
+    39, 32, 27, 21, 32, 37, 40, 40, 33, 27, 23, 8,  11, 13, 15, 15, 13, 10, 7,
+    10, 12, 15, 15, 12, 8,  6,  8,  11, 13, 14, 10, 7,  5,  7,  9,  10, 12, 9,
+    6,  2,  5,  7,  9,  12, 9,  6,  3,  5,  6,  8,  11, 9,  6,  4,  5,  6,  8,
+    10, 9,  6,  6,  8,  11, 13, 12, 10, 7,  6,  8,  10, 12, 12, 8,  5,  4,  7,
+    9,  10, 9,  7,  4,  2,  5,  7,  8,  7,  5,  3,  1,  3,  6,  7,  6,  5,  3,
+    3,  4,  5,  6,  6,  5,  3,  6,  5,  5,  6,  5,  4,  3,  4,  7,  7,  7,  8,
+    7,  6,  2,  6,  7,  7,  6,  5,  4,  1,  5,  5,  5,  4,  4,  2,  2,  2,  3,
+    3,  3,  2,  0,  3,  3,  2,  2,  2,  1,  0,  5,  4,  3,  2,  3,  1,  0,  9,
+    5,  4,  3,  2,  2,  2,  2,  4,  4,  5,  6,  8,  8,  1,  5,  4,  5,  6,  5,
+    6,  1,  6,  5,  5,  5,  5,  5,  6,  6,  5,  5,  5,  5,  4,  5,  8,  7,  7,
+    7,  7,  6,  6,  10, 9,  8,  8,  8,  7,  9,  14, 12, 10, 10, 9,  9,  11, 11,
+    11, 11, 12, 11, 8,  12, 13, 12, 12, 12, 11, 6,  12, 14, 14, 13, 12, 11, 7,
+    12, 16, 14, 13, 13, 12, 8,  13, 18, 16, 16, 15, 14, 9,  14, 19, 20, 18, 16,
+    14, 10, 15, 20, 22, 21, 18, 16, 12, 19, 21, 18, 18, 16, 13, 9,  19, 22, 20,
+    19, 17, 13, 9,  20, 24, 22, 20, 16, 13, 10, 20, 24, 23, 21, 17, 15, 11, 19,
+    24, 26, 24, 21, 16, 12, 20, 24, 30, 27, 23, 17, 14, 21, 26, 29, 30, 25, 19,
+    14, 26, 30, 27, 22, 18, 14, 12, 26, 30, 30, 23, 18, 15, 12, 26, 30, 32, 24,
+    19, 16, 12, 26, 30, 33, 26, 21, 16, 14, 25, 29, 34, 30, 24, 19, 15, 25, 30,
+    35, 34, 27, 21, 16, 27, 32, 36, 35, 29, 23, 17, 9,  13, 17, 22, 21, 18, 16,
+    8,  12, 16, 20, 21, 18, 15, 7,  10, 14, 18, 20, 17, 13, 6,  9,  12, 15, 17,
+    15, 11, 4,  5,  8,  11, 13, 14, 12, 2,  3,  6,  10, 12, 14, 12, 7,  5,  5,
+    8,  12, 13, 11, 7,  10, 15, 18, 18, 15, 13, 6,  9,  13, 16, 17, 15, 11, 5,
+    8,  11, 14, 15, 13, 9,  5,  6,  9,  11, 12, 11, 6,  2,  3,  5,  8,  9,  10,
+    6,  3,  3,  4,  6,  8,  8,  6,  10, 8,  4,  5,  6,  6,  5,  5,  8,  10, 11,
+    13, 11, 8,  5,  7,  9,  10, 11, 10, 7,  4,  6,  7,  8,  9,  8,  6,  4,  4,
+    5,  5,  5,  6,  3,  0,  2,  1,  1,  1,  2,  3,  6,  6,  5,  4,  1,  2,  3,
+    11, 10, 7,  5,  2,  1,  2,  5,  6,  6,  7,  7,  8,  7,  4,  5,  6,  6,  7,
+    7,  7,  3,  5,  6,  6,  6,  6,  6,  2,  3,  3,  4,  4,  4,  3,  2,  3,  4,
+    4,  4,  3,  3,  6,  8,  7,  7,  6,  5,  5,  11, 13, 9,  8,  8,  7,  6,  6,
+    7,  7,  7,  8,  7,  7,  7,  8,  8,  9,  9,  7,  7,  7,  10, 10, 10, 11, 9,
+    6,  7,  11, 10, 10, 10, 10, 5,  7,  11, 10, 10, 10, 10, 6,  9,  13, 13, 12,
+    11, 10, 8,  12, 15, 15, 13, 12, 11, 9,  14, 15, 14, 14, 13, 9,  7,  14, 16,
+    15, 15, 14, 11, 6,  14, 17, 16, 16, 14, 11, 7,  14, 16, 16, 15, 14, 11, 8,
+    13, 15, 17, 16, 14, 11, 9,  13, 16, 20, 18, 14, 12, 10, 15, 18, 20, 19, 16,
+    13, 10, 18, 23, 21, 17, 15, 12, 8,  18, 22, 23, 18, 16, 13, 9,  18, 23, 24,
+    18, 16, 13, 10, 19, 22, 24, 19, 15, 13, 10, 17, 20, 23, 20, 16, 13, 11, 17,
+    20, 23, 22, 18, 14, 11, 18, 22, 24, 24, 19, 15, 12, 7,  8,  10, 12, 12, 11,
+    9,  6,  8,  9,  12, 12, 9,  8,  6,  7,  8,  10, 11, 8,  6,  6,  6,  6,  7,
+    9,  6,  3,  3,  3,  4,  4,  4,  3,  2,  1,  2,  2,  2,  3,  3,  2,  7,  6,
+    3,  2,  3,  3,  2,  6,  7,  8,  10, 10, 9,  8,  6,  7,  8,  10, 9,  8,  7,
+    5,  6,  7,  8,  8,  7,  5,  4,  5,  5,  6,  5,  5,  2,  2,  2,  2,  3,  2,
+    2,  2,  3,  3,  3,  2,  2,  2,  2,  10, 8,  5,  3,  1,  2,  2,  5,  6,  7,
+    8,  9,  9,  8,  4,  6,  7,  8,  8,  8,  8,  4,  5,  6,  6,  6,  6,  6,  4,
+    4,  4,  4,  4,  4,  3,  2,  0,  1,  1,  1,  2,  3,  6,  5,  5,  3,  1,  1,
+    2,  12, 11, 7,  4,  2,  1,  2,  4,  6,  7,  8,  9,  9,  9,  4,  5,  7,  8,
+    8,  8,  9,  3,  5,  6,  7,  7,  7,  7,  4,  4,  5,  5,  5,  5,  5,  3,  6,
+    6,  6,  7,  7,  7,  6,  12, 11, 10, 9,  7,  8,  12, 17, 14, 12, 10, 9,  9,
+    9,  10, 10, 10, 11, 10, 9,  10, 11, 11, 12, 12, 11, 9,  11, 12, 13, 13, 13,
+    12, 8,  10, 14, 13, 14, 14, 13, 8,  11, 16, 16, 16, 16, 14, 9,  13, 19, 21,
+    20, 19, 16, 11, 17, 22, 24, 22, 20, 18, 12, 18, 20, 20, 20, 17, 13, 9,  18,
+    22, 22, 22, 19, 14, 9,  18, 24, 24, 24, 19, 15, 10, 19, 23, 25, 24, 21, 16,
+    11, 17, 23, 27, 25, 23, 18, 13, 19, 25, 31, 28, 25, 20, 14, 23, 28, 31, 30,
+    26, 22, 16, 27, 33, 32, 26, 21, 16, 11, 26, 32, 33, 28, 23, 17, 12, 27, 32,
+    35, 28, 23, 18, 13, 26, 32, 36, 29, 25, 19, 14, 26, 31, 33, 31, 26, 22, 16,
+    25, 30, 35, 33, 28, 23, 18, 27, 31, 34, 35, 30, 25, 20, 9,  11, 12, 14, 13,
+    13, 12, 8,  11, 12, 13, 13, 11, 10, 6,  10, 11, 12, 12, 10, 8,  5,  8,  9,
+    10, 10, 8,  5,  2,  5,  6,  6,  6,  5,  4,  1,  3,  4,  5,  5,  5,  4,  7,
+    7,  5,  4,  5,  5,  4,  6,  10, 11, 13, 12, 12, 10, 5,  9,  11, 12, 12, 11,
+    9,  4,  7,  10, 11, 10, 9,  7,  4,  5,  7,  8,  8,  7,  4,  2,  2,  4,  5,
+    5,  4,  4,  4,  3,  5,  4,  4,  4,  4,  10, 8,  6,  5,  3,  4,  4,  5,  7,
+    9,  10, 11, 10, 10, 4,  6,  8,  9,  10, 8,  8,  4,  5,  7,  7,  7,  7,  6,
+    4,  3,  3,  3,  4,  4,  2,  2,  1,  0,  0,  0,  1,  2,  6,  5,  4,  3,  2,
+    1,  2,  12, 10, 7,  5,  4,  3,  2,  4,  6,  7,  8,  10, 11, 10, 3,  6,  7,
+    8,  9,  9,  9,  3,  6,  7,  7,  7,  7,  7,  6,  6,  6,  6,  6,  7,  6,  4,
+    8,  7,  8,  8,  8,  8,  7,  13, 12, 11, 10, 9,  9,  12, 18, 15, 13, 11, 10,
+    10, 11, 12, 12, 12, 13, 12, 10, 11, 13, 13, 13, 14, 12, 9,  12, 14, 14, 14,
+    14, 13, 9,  11, 16, 15, 15, 15, 14, 9,  12, 18, 17, 17, 17, 15, 11, 14, 20,
+    21, 21, 19, 16, 12, 18, 23, 26, 23, 21, 18, 13, 20, 22, 22, 22, 19, 15, 11,
+    19, 24, 23, 24, 19, 15, 11, 20, 26, 24, 24, 20, 15, 11, 20, 25, 26, 26, 21,
+    17, 12, 19, 25, 29, 27, 23, 18, 13, 20, 26, 32, 32, 26, 19, 14, 23, 29, 33,
+    35, 28, 22, 16, 27, 35, 33, 28, 21, 17, 13, 29, 34, 36, 29, 23, 18, 13, 28,
+    35, 38, 30, 24, 19, 14, 29, 34, 38, 30, 25, 20, 15, 27, 34, 38, 34, 28, 22,
+    17, 27, 34, 39, 38, 31, 24, 19, 30, 36, 40, 41, 34, 26, 21, 9,  13, 16, 19,
+    18, 17, 14, 8,  11, 15, 18, 18, 16, 13, 6,  10, 14, 16, 16, 13, 10, 5,  8,
+    11, 13, 14, 11, 8,  2,  5,  7,  10, 11, 9,  7,  2,  3,  5,  7,  10, 9,  7,
+    7,  6,  6,  7,  9,  9,  7,  7,  10, 14, 16, 16, 14, 11, 5,  9,  12, 15, 16,
+    13, 9,  4,  7,  11, 13, 13, 11, 7,  4,  5,  8,  10, 10, 9,  4,  2,  2,  4,
+    7,  7,  7,  4,  4,  3,  5,  5,  5,  6,  4,  9,  7,  6,  5,  4,  5,  4,  5,
+    7,  9,  10, 12, 10, 9,  4,  6,  8,  9,  10, 9,  8,  4,  5,  7,  7,  7,  7,
+    5,  4,  3,  3,  3,  4,  4,  2,  1,  1,  0,  0,  0,  1,  2,  6,  5,  4,  3,
+    2,  1,  2,  11, 9,  7,  5,  3,  2,  2,  4,  6,  7,  8,  9,  11, 10, 4,  6,
+    7,  8,  8,  9,  8,  3,  6,  7,  6,  6,  7,  7,  6,  6,  6,  6,  6,  6,  5,
+    5,  8,  7,  7,  8,  8,  7,  7,  13, 12, 11, 10, 9,  9,  11, 17, 15, 13, 11,
+    10, 10, 11, 12, 12, 12, 13, 13, 10, 11, 13, 13, 14, 14, 13, 8,  11, 14, 15,
+    14, 14, 12, 9,  11, 17, 15, 15, 15, 13, 9,  11, 18, 17, 17, 17, 15, 10, 15,
+    21, 22, 21, 19, 16, 12, 19, 23, 25, 23, 21, 18, 13, 21, 22, 22, 21, 19, 15,
+    11, 20, 24, 24, 23, 20, 15, 10, 21, 26, 26, 24, 20, 15, 11, 20, 26, 26, 25,
+    21, 16, 12, 19, 25, 29, 27, 23, 18, 13, 21, 26, 33, 32, 25, 20, 15, 24, 30,
+    33, 33, 28, 22, 16, 28, 35, 33, 27, 21, 17, 13, 29, 35, 36, 29, 22, 18, 13,
+    29, 35, 39, 30, 23, 18, 14, 29, 34, 38, 32, 25, 19, 14, 28, 33, 39, 34, 27,
+    22, 17, 28, 33, 39, 38, 30, 24, 18, 29, 34, 39, 40, 33, 26, 20, 9,  13, 16,
+    20, 20, 18, 15, 8,  12, 15, 19, 20, 17, 13, 7,  10, 14, 17, 18, 14, 11, 5,
+    8,  11, 14, 16, 13, 8,  3,  5,  7,  10, 13, 10, 8,  2,  3,  5,  8,  11, 10,
+    8,  3,  4,  4,  7,  10, 11, 8,  7,  10, 14, 17, 16, 14, 11, 5,  9,  13, 17,
+    16, 12, 9,  5,  8,  11, 14, 14, 11, 7,  4,  6,  8,  11, 10, 9,  4,  2,  2,
+    5,  7,  7,  7,  4,  3,  2,  4,  5,  6,  6,  4,  6,  3,  3,  5,  4,  5,  4,
+    5,  8,  10, 11, 12, 10, 10, 4,  6,  8,  9,  10, 9,  8,  4,  5,  7,  7,  7,
+    7,  5,  4,  4,  3,  4,  4,  4,  2,  1,  1,  0,  0,  0,  1,  2,  5,  3,  3,
+    2,  2,  1,  2,  7,  5,  4,  4,  3,  2,  2,  4,  6,  7,  8,  9,  11, 10, 4,
+    6,  7,  8,  9,  9,  8,  3,  6,  7,  6,  7,  7,  6,  6,  6,  6,  6,  6,  6,
+    5,  5,  8,  8,  8,  8,  7,  7,  5,  10, 10, 10, 10, 8,  8,  7,  13, 12, 11,
+    11, 10, 10, 11, 12, 12, 13, 13, 12, 10, 12, 13, 13, 14, 14, 13, 8,  12, 15,
+    15, 14, 14, 13, 9,  11, 17, 15, 15, 15, 13, 9,  12, 18, 17, 17, 16, 15, 10,
+    14, 19, 21, 19, 19, 16, 12, 15, 20, 23, 21, 21, 18, 13, 22, 22, 22, 21, 19,
+    15, 11, 21, 24, 23, 23, 19, 15, 11, 20, 26, 25, 24, 20, 15, 11, 21, 25, 26,
+    26, 21, 16, 12, 20, 25, 30, 27, 23, 18, 13, 21, 26, 32, 31, 25, 19, 15, 21,
+    26, 32, 31, 27, 21, 16, 29, 35, 32, 26, 22, 17, 13, 29, 34, 35, 29, 23, 18,
+    14, 29, 35, 37, 30, 23, 18, 14, 29, 34, 38, 31, 25, 20, 15, 28, 32, 37, 33,
+    27, 22, 16, 28, 34, 38, 36, 30, 24, 18, 29, 34, 39, 39, 32, 26, 20, 8,  12,
+    16, 19, 20, 17, 14, 7,  11, 15, 19, 19, 16, 12, 6,  9,  13, 16, 17, 14, 10,
+    4,  7,  10, 13, 15, 12, 8,  1,  4,  7,  9,  13, 11, 8,  2,  3,  5,  8,  12,
+    11, 8,  4,  4,  4,  7,  10, 11, 8,  6,  10, 13, 16, 16, 14, 10, 5,  8,  12,
+    15, 16, 12, 8,  3,  7,  11, 13, 13, 10, 6,  3,  5,  8,  10, 9,  8,  4,  1,
+    2,  4,  7,  7,  7,  4,  3,  3,  4,  6,  5,  6,  4,  6,  4,  3,  5,  4,  4,
+    4,  4,  7,  9,  10, 11, 9,  8,  3,  5,  8,  9,  9,  8,  6,  3,  4,  6,  6,
+    6,  6,  4,  3,  2,  3,  3,  3,  3,  1,  2,  2,  1,  1,  1,  0,  1,  4,  3,
+    3,  2,  2,  2,  1,  8,  6,  4,  3,  3,  2,  2,  3,  5,  6,  7,  8,  10, 9,
+    2,  6,  6,  7,  7,  8,  7,  3,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,
+    6,  5,  6,  8,  8,  8,  8,  8,  7,  5,  10, 10, 9,  9,  8,  8,  8,  14, 12,
+    11, 10, 10, 10, 11, 12, 12, 12, 13, 13, 9,  12, 14, 13, 14, 14, 12, 7,  12,
+    15, 15, 14, 14, 13, 8,  12, 17, 15, 15, 15, 13, 9,  13, 19, 17, 17, 16, 15,
+    10, 14, 19, 20, 18, 18, 16, 11, 14, 20, 23, 21, 19, 18, 13, 21, 23, 22, 21,
+    18, 14, 10, 22, 25, 23, 23, 19, 15, 11, 21, 26, 25, 23, 19, 15, 11, 21, 25,
+    26, 24, 21, 16, 11, 20, 25, 28, 26, 22, 17, 13, 21, 26, 30, 28, 23, 19, 15,
+    21, 27, 30, 30, 25, 20, 16, 28, 33, 30, 25, 21, 17, 13, 28, 33, 33, 26, 22,
+    18, 13, 29, 33, 35, 27, 22, 18, 14, 29, 32, 35, 29, 23, 19, 15, 27, 32, 36,
+    31, 25, 20, 16, 28, 32, 35, 34, 27, 23, 18, 27, 31, 36, 35, 29, 23, 19, 8,
+    10, 13, 16, 15, 13, 10, 7,  10, 12, 15, 15, 12, 8,  6,  8,  11, 13, 14, 10,
+    7,  5,  6,  9,  10, 13, 9,  6,  2,  5,  7,  9,  12, 9,  6,  3,  5,  6,  8,
+    11, 10, 6,  4,  4,  6,  8,  10, 9,  6,  6,  9,  11, 13, 12, 10, 7,  5,  8,
+    10, 13, 12, 8,  5,  4,  7,  9,  10, 9,  7,  4,  2,  5,  7,  8,  7,  6,  3,
+    1,  3,  5,  7,  6,  5,  3,  3,  3,  5,  6,  5,  5,  3,  6,  4,  5,  6,  5,
+    4,  3,  4,  7,  8,  8,  9,  7,  6,  2,  6,  7,  7,  7,  5,  4,  2,  5,  6,
+    5,  4,  4,  2,  2,  3,  3,  3,  3,  2,  0,  3,  3,  2,  2,  2,  1,  0,  5,
+    4,  3,  2,  2,  1,  0,  8,  5,  3,  3,  2,  2,  1,  2,  4,  4,  5,  7,  8,
+    8,  1,  5,  4,  5,  6,  6,  6,  1,  6,  5,  5,  5,  5,  5,  5,  6,  5,  5,
+    5,  5,  4,  5,  8,  7,  7,  7,  6,  6,  5,  10, 9,  8,  8,  8,  7,  8,  13,
+    12, 10, 9,  9,  9,  11, 11, 11, 11, 12, 11, 8,  12, 12, 12, 13, 12, 11, 6,
+    12, 14, 14, 13, 12, 11, 7,  12, 16, 14, 13, 13, 12, 8,  13, 18, 16, 16, 15,
+    13, 9,  14, 19, 20, 17, 16, 14, 10, 15, 20, 23, 20, 18, 16, 12, 20, 21, 19,
+    18, 15, 13, 9,  20, 22, 20, 18, 16, 13, 9,  20, 24, 22, 20, 16, 13, 10, 20,
+    24, 23, 21, 17, 14, 11, 19, 23, 26, 24, 20, 16, 12, 20, 24, 30, 28, 23, 17,
+    14, 21, 26, 29, 30, 25, 19, 14, 26, 30, 28, 22, 17, 15, 12, 26, 30, 29, 24,
+    18, 15, 11, 26, 30, 32, 25, 19, 16, 12, 25, 29, 33, 26, 21, 17, 13, 25, 29,
+    33, 30, 24, 20, 15, 26, 31, 35, 34, 27, 20, 16, 27, 32, 35, 35, 29, 23, 17,
+    14, 17, 21, 24, 24, 22, 19, 13, 16, 20, 24, 25, 21, 18, 12, 15, 18, 21, 23,
+    19, 15, 12, 13, 15, 17, 21, 16, 12, 9,  9,  11, 14, 14, 15, 12, 5,  5,  8,
+    11, 13, 14, 12, 2,  3,  6,  9,  13, 15, 12, 13, 15, 19, 21, 22, 19, 17, 12,
+    14, 17, 20, 21, 18, 14, 11, 13, 15, 18, 18, 16, 12, 11, 11, 13, 14, 15, 12,
+    7,  8,  8,  9,  10, 9,  10, 7,  3,  3,  5,  7,  9,  9,  7,  3,  3,  3,  6,
+    8,  8,  7,  11, 13, 14, 16, 18, 17, 15, 11, 12, 14, 15, 16, 15, 14, 10, 11,
+    13, 13, 13, 13, 12, 10, 10, 10, 10, 11, 9,  5,  6,  6,  6,  6,  5,  5,  5,
+    0,  2,  1,  2,  4,  4,  5,  4,  4,  2,  1,  3,  4,  5,  10, 11, 13, 14, 15,
+    16, 15, 10, 11, 12, 14, 14, 15, 14, 9,  10, 12, 12, 12, 13, 12, 6,  9,  9,
+    9,  10, 9,  7,  4,  5,  4,  5,  5,  4,  4,  0,  2,  2,  2,  3,  3,  5,  4,
+    6,  3,  3,  3,  4,  5,  9,  10, 12, 13, 14, 15, 15, 8,  9,  11, 12, 13, 13,
+    14, 8,  9,  10, 10, 11, 11, 12, 8,  8,  8,  8,  9,  8,  5,  5,  8,  7,  7,
+    7,  6,  5,  4,  7,  7,  7,  7,  7,  5,  5,  8,  9,  8,  8,  8,  5,  11, 12,
+    12, 13, 12, 14, 15, 11, 13, 13, 13, 12, 12, 13, 11, 14, 14, 13, 11, 10, 11,
+    11, 13, 13, 13, 11, 9,  5,  9,  11, 13, 12, 10, 8,  5,  8,  11, 14, 13, 11,
+    8,  6,  8,  12, 15, 15, 11, 9,  7,  15, 19, 18, 15, 13, 13, 14, 15, 19, 20,
+    16, 13, 11, 12, 15, 18, 21, 16, 14, 11, 9,  15, 18, 20, 15, 13, 9,  6,  14,
+    16, 19, 16, 11, 9,  7,  13, 15, 18, 17, 13, 10, 8,  12, 16, 19, 19, 14, 11,
+    8,  12, 14, 15, 17, 17, 16, 14, 12, 13, 15, 16, 17, 14, 13, 11, 12, 14, 15,
+    15, 12, 11, 10, 11, 11, 12, 12, 8,  4,  8,  8,  8,  8,  6,  5,  4,  4,  4,
+    4,  3,  4,  5,  4,  2,  2,  2,  3,  4,  5,  4,  11, 13, 14, 15, 16, 15, 14,
+    10, 12, 13, 15, 15, 14, 12, 10, 11, 13, 13, 13, 12, 10, 9,  10, 10, 10, 11,
+    9,  4,  7,  7,  7,  7,  4,  4,  4,  2,  3,  3,  3,  3,  4,  4,  5,  4,  2,
+    2,  3,  3,  4,  10, 11, 13, 14, 15, 15, 15, 9,  10, 12, 13, 14, 14, 13, 9,
+    10, 12, 12, 12, 11, 10, 9,  9,  9,  9,  9,  8,  4,  5,  5,  5,  5,  3,  3,
+    4,  2,  0,  1,  2,  2,  3,  4,  7,  6,  2,  0,  3,  3,  4,  10, 11, 12, 13,
+    15, 16, 16, 9,  11, 12, 13, 14, 14, 14, 8,  11, 12, 12, 12, 12, 11, 5,  9,
+    9,  9,  9,  8,  7,  3,  5,  5,  5,  5,  5,  5,  2,  7,  7,  6,  6,  6,  7,
+    7,  13, 10, 8,  8,  8,  8,  10, 11, 12, 13, 14, 16, 16, 9,  10, 11, 13, 14,
+    14, 14, 9,  11, 11, 11, 12, 12, 11, 9,  12, 11, 12, 12, 11, 7,  8,  13, 14,
+    13, 14, 13, 9,  9,  15, 17, 17, 16, 15, 10, 12, 17, 19, 18, 18, 16, 11, 16,
+    19, 18, 19, 16, 15, 16, 16, 21, 21, 21, 17, 13, 13, 16, 22, 23, 21, 17, 12,
+    10, 16, 22, 23, 23, 19, 14, 10, 15, 21, 25, 23, 21, 17, 11, 16, 22, 27, 25,
+    21, 18, 13, 18, 22, 26, 25, 23, 20, 15, 25, 30, 29, 25, 19, 15, 14, 25, 30,
+    31, 26, 20, 15, 12, 25, 30, 33, 26, 21, 16, 11, 25, 30, 34, 28, 22, 18, 14,
+    24, 29, 32, 27, 23, 20, 16, 24, 27, 30, 29, 24, 21, 17, 23, 27, 30, 30, 25,
+    22, 19, 13, 16, 17, 18, 18, 17, 16, 12, 15, 17, 18, 18, 16, 14, 11, 14, 16,
+    16, 15, 13, 11, 10, 12, 13, 13, 13, 10, 5,  7,  9,  10, 10, 8,  6,  5,  3,
+    5,  7,  5,  6,  6,  5,  2,  3,  5,  5,  6,  6,  5,  11, 14, 16, 17, 17, 17,
+    15, 10, 13, 15, 16, 17, 15, 13, 9,  12, 15, 15, 14, 13, 10, 9,  9,  12, 13,
+    11, 9,  5,  7,  6,  8,  9,  6,  5,  5,  2,  2,  5,  5,  5,  5,  5,  5,  3,
+    3,  5,  4,  5,  5,  9,  12, 14, 15, 16, 15, 14, 9,  10, 12, 14, 15, 13, 12,
+    9,  10, 11, 11, 11, 11, 9,  9,  8,  8,  8,  8,  7,  3,  5,  5,  5,  4,  3,
+    3,  3,  1,  1,  0,  1,  2,  3,  3,  6,  5,  3,  1,  2,  3,  3,  9,  11, 11,
+    13, 15, 15, 15, 9,  11, 12, 13, 14, 14, 13, 7,  11, 11, 11, 11, 11, 10, 5,
+    9,  8,  8,  8,  7,  7,  3,  5,  5,  6,  6,  6,  6,  2,  8,  8,  7,  7,  8,
+    8,  6,  12, 11, 9,  9,  9,  9,  10, 10, 11, 13, 14, 15, 15, 9,  11, 12, 13,
+    13, 13, 13, 10, 12, 13, 13, 13, 11, 9,  10, 13, 13, 13, 13, 12, 8,  9,  15,
+    14, 15, 15, 14, 9,  10, 16, 18, 17, 17, 15, 11, 13, 18, 21, 18, 18, 17, 13,
+    18, 20, 20, 20, 17, 15, 15, 18, 22, 21, 21, 18, 13, 12, 18, 24, 24, 23, 18,
+    14, 10, 18, 23, 25, 24, 20, 15, 11, 18, 23, 27, 26, 21, 17, 13, 17, 23, 29,
+    28, 24, 18, 14, 19, 25, 29, 31, 26, 20, 16, 27, 33, 32, 25, 20, 16, 14, 26,
+    32, 34, 27, 22, 17, 12, 27, 33, 36, 28, 22, 17, 12, 27, 32, 37, 29, 24, 19,
+    14, 25, 31, 37, 32, 26, 20, 16, 25, 31, 36, 35, 28, 22, 17, 26, 32, 37, 37,
+    30, 24, 19, 12, 16, 19, 22, 22, 20, 18, 12, 15, 18, 21, 21, 19, 15, 10, 13,
+    17, 19, 19, 17, 13, 8,  11, 14, 16, 17, 13, 8,  6,  8,  10, 12, 12, 10, 8,
+    2,  4,  7,  9,  11, 10, 8,  2,  3,  5,  8,  10, 10, 8,  10, 13, 17, 20, 20,
+    17, 14, 9,  12, 16, 19, 19, 16, 12, 8,  11, 14, 17, 16, 14, 9,  8,  9,  11,
+    13, 13, 11, 5,  5,  5,  8,  10, 8,  8,  5,  1,  2,  4,  6,  6,  7,  5,  4,
+    3,  3,  5,  5,  6,  5,  8,  11, 13, 14, 16, 13, 13, 8,  9,  12, 13, 14, 12,
+    11, 7,  8,  10, 10, 10, 10, 7,  8,  7,  7,  7,  7,  6,  2,  4,  3,  3,  3,
+    2,  2,  2,  2,  2,  1,  0,  1,  2,  2,  4,  3,  2,  2,  1,  2,  2,  8,  9,
+    10, 11, 13, 14, 14, 8,  9,  10, 11, 12, 12, 11, 5,  9,  10, 9,  9,  9,  8,
+    5,  8,  7,  6,  7,  6,  6,  3,  6,  6,  6,  6,  6,  6,  2,  8,  8,  7,  7,
+    7,  7,  4,  11, 10, 9,  9,  9,  9,  9,  11, 11, 12, 13, 13, 13, 9,  11, 12,
+    12, 13, 12, 11, 10, 13, 14, 13, 13, 11, 8,  10, 15, 13, 14, 14, 12, 8,  10,
+    16, 15, 15, 15, 13, 9,  11, 16, 18, 17, 16, 14, 11, 12, 17, 20, 19, 18, 17,
+    12, 19, 21, 20, 20, 18, 14, 13, 18, 23, 22, 22, 18, 14, 10, 19, 24, 24, 23,
+    19, 14, 10, 19, 24, 25, 23, 20, 15, 10, 18, 24, 28, 26, 21, 17, 12, 18, 24,
+    30, 29, 23, 18, 13, 18, 24, 30, 30, 25, 19, 15, 27, 34, 32, 26, 20, 16, 12,
+    27, 34, 34, 28, 22, 17, 12, 27, 34, 37, 28, 22, 17, 13, 28, 33, 37, 30, 23,
+    18, 14, 26, 32, 36, 33, 25, 19, 15, 26, 31, 36, 34, 28, 21, 17, 26, 31, 36,
+    37, 29, 24, 18, 11, 15, 18, 21, 22, 20, 16, 10, 14, 17, 21, 22, 18, 14, 8,
+    12, 16, 19, 20, 16, 12, 7,  10, 13, 16, 18, 14, 9,  4,  7,  9,  12, 14, 12,
+    9,  0,  3,  6,  9,  13, 12, 9,  3,  3,  5,  8,  11, 12, 9,  8,  12, 16, 19,
+    18, 16, 12, 7,  11, 14, 18, 18, 14, 10, 6,  10, 13, 16, 15, 13, 9,  6,  7,
+    10, 12, 12, 10, 5,  3,  4,  6,  9,  9,  8,  5,  2,  2,  4,  6,  7,  7,  5,
+    5,  4,  3,  6,  5,  6,  5,  6,  10, 11, 13, 14, 12, 11, 5,  8,  10, 11, 12,
+    11, 8,  5,  7,  9,  9,  9,  9,  6,  6,  5,  5,  5,  6,  5,  3,  1,  1,  2,
+    2,  2,  2,  2,  4,  3,  2,  1,  0,  1,  2,  7,  4,  3,  2,  1,  1,  2,  6,
+    7,  8,  9,  10, 12, 11, 5,  7,  8,  9,  9,  9,  9,  4,  7,  7,  7,  7,  7,
+    6,  5,  6,  6,  5,  5,  5,  5,  3,  7,  6,  6,  6,  6,  6,  4,  9,  8,  8,
+    8,  7,  7,  7,  12, 10, 9,  9,  9,  9,  10, 11, 11, 11, 12, 12, 11, 11, 12,
+    12, 13, 13, 11, 9,  11, 14, 14, 13, 13, 11, 8,  11, 15, 14, 13, 14, 12, 8,
+    11, 17, 16, 15, 15, 13, 9,  12, 17, 18, 17, 16, 15, 10, 13, 17, 20, 19, 18,
+    16, 12, 20, 21, 20, 21, 18, 14, 11, 20, 23, 23, 23, 19, 14, 9,  19, 25, 24,
+    23, 19, 14, 10, 20, 24, 26, 24, 20, 15, 11, 18, 24, 27, 26, 21, 16, 12, 19,
+    23, 30, 29, 23, 18, 14, 19, 24, 29, 31, 25, 20, 15, 28, 34, 32, 26, 21, 16,
+    12, 27, 34, 34, 27, 21, 17, 12, 27, 33, 36, 29, 23, 18, 13, 28, 32, 37, 29,
+    24, 19, 13, 26, 32, 36, 33, 25, 20, 15, 26, 32, 37, 33, 28, 22, 17, 27, 32,
+    35, 36, 30, 23, 18, 10, 14, 18, 21, 21, 18, 15, 9,  12, 16, 20, 21, 17, 13,
+    7,  11, 15, 18, 19, 16, 11, 6,  9,  12, 14, 16, 14, 9,  3,  6,  8,  11, 14,
+    12, 9,  2,  4,  6,  9,  13, 12, 9,  4,  4,  5,  8,  11, 12, 9,  7,  11, 14,
+    18, 18, 15, 11, 6,  10, 13, 17, 17, 13, 9,  5,  8,  12, 14, 14, 12, 8,  4,
+    6,  9,  11, 11, 10, 5,  1,  3,  5,  8,  8,  8,  5,  2,  3,  4,  7,  7,  7,
+    5,  6,  4,  4,  6,  5,  6,  5,  5,  8,  10, 11, 13, 11, 9,  3,  7,  9,  10,
+    11, 9,  7,  3,  6,  7,  8,  7,  7,  4,  3,  3,  4,  4,  4,  4,  1,  2,  1,
+    1,  1,  1,  2,  1,  4,  3,  2,  2,  1,  0,  1,  8,  6,  3,  3,  2,  1,  1,
+    3,  5,  6,  7,  8,  10, 9,  3,  5,  6,  7,  8,  8,  7,  2,  5,  6,  6,  5,
+    6,  5,  5,  6,  6,  5,  5,  5,  4,  4,  8,  7,  6,  7,  6,  6,  4,  10, 8,
+    8,  8,  8,  7,  8,  12, 11, 10, 9,  9,  9,  11, 11, 11, 11, 12, 12, 9,  12,
+    13, 12, 13, 13, 12, 7,  12, 14, 14, 13, 12, 11, 8,  11, 16, 14, 14, 14, 12,
+    8,  12, 18, 17, 15, 16, 13, 9,  13, 18, 19, 18, 16, 15, 11, 14, 18, 21, 19,
+    19, 16, 12, 20, 21, 20, 20, 17, 14, 10, 20, 23, 22, 22, 18, 14, 9,  20, 25,
+    24, 23, 19, 14, 10, 20, 25, 24, 23, 20, 15, 10, 19, 25, 26, 25, 21, 16, 12,
+    20, 25, 29, 28, 22, 18, 14, 20, 25, 29, 30, 24, 19, 15, 28, 33, 29, 24, 20,
+    16, 12, 28, 32, 31, 26, 21, 16, 12, 28, 32, 34, 27, 23, 17, 13, 27, 31, 35,
+    28, 23, 18, 14, 26, 31, 34, 31, 24, 20, 15, 26, 31, 35, 33, 26, 21, 17, 27,
+    30, 35, 35, 29, 22, 18, 8,  11, 12, 16, 15, 13, 10, 7,  10, 12, 15, 15, 12,
+    8,  6,  8,  11, 13, 14, 10, 7,  5,  6,  9,  10, 12, 9,  6,  2,  5,  7,  9,
+    12, 9,  6,  3,  5,  6,  8,  11, 9,  6,  4,  5,  6,  8,  10, 9,  6,  6,  9,
+    11, 13, 12, 10, 7,  5,  8,  10, 12, 12, 8,  5,  4,  7,  9,  10, 9,  7,  4,
+    2,  5,  7,  8,  7,  6,  3,  1,  3,  5,  7,  6,  5,  3,  3,  3,  5,  6,  5,
+    5,  3,  6,  4,  5,  6,  5,  4,  3,  4,  7,  8,  8,  9,  7,  6,  2,  6,  7,
+    7,  7,  5,  4,  2,  5,  6,  5,  4,  4,  2,  2,  3,  3,  3,  3,  2,  0,  3,
+    2,  2,  2,  2,  1,  0,  5,  4,  3,  2,  2,  1,  0,  8,  6,  3,  2,  2,  2,
+    1,  2,  4,  4,  5,  6,  7,  8,  1,  4,  4,  5,  6,  5,  6,  1,  6,  5,  5,
+    5,  5,  5,  5,  6,  5,  5,  5,  5,  4,  5,  8,  7,  7,  7,  7,  6,  5,  10,
+    9,  8,  8,  8,  7,  8,  13, 12, 10, 9,  9,  9,  11, 11, 11, 11, 12, 11, 8,
+    12, 12, 13, 12, 12, 11, 6,  12, 14, 14, 13, 12, 11, 7,  12, 16, 14, 13, 13,
+    12, 8,  12, 18, 17, 15, 15, 13, 9,  13, 19, 20, 18, 16, 14, 10, 14, 20, 23,
+    20, 18, 16, 11, 20, 20, 19, 17, 15, 13, 9,  20, 22, 20, 19, 16, 13, 9,  20,
+    23, 22, 20, 17, 13, 10, 19, 24, 24, 21, 17, 14, 11, 19, 24, 26, 24, 20, 16,
+    12, 20, 24, 30, 27, 22, 17, 13, 21, 25, 30, 29, 24, 19, 14, 26, 30, 27, 21,
+    17, 14, 12, 26, 30, 29, 23, 18, 15, 12, 26, 30, 32, 25, 19, 16, 12, 26, 29,
+    33, 26, 21, 17, 13, 25, 29, 33, 30, 24, 19, 15, 25, 31, 34, 34, 27, 21, 16,
+    27, 32, 35, 35, 29, 23, 17, 20, 21, 23, 25, 26, 24, 23, 20, 21, 23, 24, 25,
+    23, 20, 19, 21, 21, 23, 24, 20, 16, 18, 19, 19, 19, 20, 15, 11, 15, 15, 15,
+    14, 14, 15, 10, 11, 11, 8,  10, 12, 14, 10, 5,  3,  5,  8,  11, 14, 10, 19,
+    20, 22, 24, 24, 23, 22, 18, 20, 21, 23, 24, 22, 20, 17, 19, 20, 20, 21, 18,
+    16, 17, 17, 18, 18, 16, 13, 8,  14, 14, 14, 12, 9,  9,  8,  9,  9,  7,  6,
+    8,  8,  8,  2,  2,  4,  5,  7,  8,  8,  17, 19, 20, 21, 23, 24, 22, 17, 18,
+    20, 21, 22, 21, 19, 17, 18, 19, 19, 19, 18, 15, 16, 16, 16, 16, 15, 12, 9,
+    11, 12, 12, 11, 7,  8,  8,  4,  7,  6,  4,  6,  8,  8,  0,  2,  2,  4,  6,
+    6,  8,  17, 18, 20, 21, 22, 23, 23, 16, 18, 20, 20, 21, 21, 21, 14, 19, 19,
+    19, 18, 18, 17, 10, 17, 16, 16, 15, 11, 11, 8,  12, 12, 10, 6,  7,  8,  5,
+    5,  5,  3,  4,  6,  7,  0,  3,  3,  3,  4,  5,  6,  15, 17, 19, 20, 21, 23,
+    23, 12, 17, 18, 20, 20, 20, 21, 12, 16, 16, 17, 17, 16, 15, 12, 13, 13, 13,
+    12, 10, 7,  9,  9,  8,  8,  7,  6,  6,  6,  7,  7,  6,  7,  7,  6,  4,  6,
+    8,  7,  7,  8,  6,  13, 14, 15, 16, 18, 21, 23, 13, 14, 15, 16, 17, 19, 19,
+    13, 14, 15, 15, 14, 15, 14, 13, 13, 13, 13, 12, 9,  6,  10, 12, 13, 12, 9,
+    8,  6,  9,  10, 13, 13, 10, 8,  6,  7,  10, 14, 14, 11, 8,  7,  16, 19, 18,
+    16, 17, 20, 21, 16, 19, 20, 17, 15, 17, 18, 16, 18, 21, 16, 14, 13, 13, 16,
+    17, 20, 15, 12, 10, 7,  14, 16, 18, 15, 11, 9,  7,  12, 15, 17, 16, 12, 10,
+    8,  11, 15, 18, 17, 13, 10, 8,  18, 19, 21, 22, 22, 21, 21, 18, 19, 20, 22,
+    22, 19, 18, 17, 18, 19, 20, 19, 17, 14, 17, 17, 17, 17, 15, 12, 8,  14, 13,
+    13, 11, 9,  8,  8,  10, 10, 7,  7,  8,  9,  8,  4,  2,  4,  6,  8,  8,  8,
+    17, 19, 20, 21, 22, 21, 20, 16, 18, 19, 20, 21, 19, 17, 16, 17, 19, 19, 18,
+    16, 13, 16, 16, 16, 16, 14, 11, 7,  14, 12, 12, 11, 7,  7,  7,  9,  8,  6,
+    5,  6,  7,  7,  2,  2,  3,  4,  6,  6,  7,  16, 17, 18, 20, 21, 21, 21, 16,
+    17, 18, 19, 20, 19, 18, 15, 17, 17, 17, 16, 16, 13, 15, 15, 14, 14, 13, 10,
+    6,  10, 11, 11, 9,  5,  6,  6,  4,  6,  5,  3,  4,  5,  6,  2,  0,  2,  3,
+    4,  5,  6,  16, 17, 18, 19, 21, 22, 22, 15, 17, 19, 19, 20, 19, 19, 13, 17,
+    18, 18, 17, 16, 15, 9,  16, 15, 15, 14, 10, 11, 7,  12, 11, 10, 5,  5,  7,
+    4,  6,  5,  5,  5,  5,  6,  2,  7,  6,  6,  6,  6,  7,  15, 17, 18, 20, 20,
+    22, 22, 12, 16, 18, 18, 19, 19, 19, 12, 15, 16, 16, 16, 15, 13, 12, 13, 13,
+    13, 12, 10, 6,  10, 10, 11, 11, 13, 11, 7,  7,  11, 14, 14, 15, 13, 8,  8,
+    13, 16, 16, 16, 15, 10, 14, 16, 17, 17, 19, 21, 21, 14, 18, 18, 19, 17, 18,
+    18, 14, 19, 20, 19, 16, 14, 13, 14, 19, 21, 21, 17, 12, 8,  12, 18, 22, 21,
+    18, 16, 10, 12, 19, 22, 20, 19, 17, 12, 14, 19, 22, 21, 20, 17, 13, 22, 27,
+    27, 22, 18, 20, 20, 22, 28, 29, 24, 18, 17, 17, 22, 27, 30, 24, 19, 14, 12,
+    22, 26, 30, 24, 20, 16, 12, 20, 25, 29, 24, 19, 17, 14, 20, 25, 26, 25, 20,
+    18, 15, 21, 23, 25, 25, 22, 19, 17, 16, 19, 19, 21, 20, 20, 19, 15, 18, 19,
+    20, 20, 18, 16, 14, 16, 18, 19, 18, 15, 13, 13, 15, 16, 15, 15, 11, 7,  10,
+    11, 12, 11, 9,  7,  6,  6,  8,  8,  6,  7,  7,  6,  1,  3,  5,  6,  7,  7,
+    6,  14, 17, 19, 19, 20, 19, 18, 13, 16, 18, 19, 19, 17, 15, 12, 14, 18, 17,
+    16, 15, 12, 12, 12, 14, 15, 13, 10, 6,  9,  9,  11, 10, 7,  6,  6,  5,  5,
+    7,  6,  6,  6,  6,  2,  1,  4,  5,  5,  6,  6,  12, 15, 16, 18, 19, 18, 17,
+    12, 13, 16, 17, 17, 16, 14, 12, 12, 14, 14, 14, 13, 10, 11, 11, 10, 11, 10,
+    8,  4,  7,  7,  7,  7,  4,  4,  3,  2,  2,  3,  2,  3,  3,  3,  2,  2,  0,
+    2,  3,  4,  4,  12, 13, 14, 16, 17, 18, 17, 11, 13, 14, 15, 16, 16, 14, 9,
+    13, 13, 14, 13, 13, 11, 6,  12, 11, 11, 10, 8,  8,  4,  8,  7,  7,  5,  5,
+    6,  2,  6,  6,  6,  6,  6,  6,  2,  8,  8,  7,  7,  7,  8,  12, 12, 14, 15,
+    16, 17, 17, 10, 12, 13, 14, 15, 15, 15, 10, 12, 12, 12, 12, 12, 10, 10, 12,
+    11, 12, 12, 10, 7,  8,  13, 13, 13, 14, 12, 8,  8,  14, 16, 16, 16, 14, 9,
+    10, 15, 18, 17, 18, 16, 11, 16, 19, 18, 19, 16, 17, 17, 15, 20, 20, 20, 16,
+    14, 14, 15, 22, 22, 20, 17, 12, 10, 16, 21, 22, 23, 18, 13, 10, 15, 21, 25,
+    24, 20, 16, 11, 15, 21, 27, 27, 22, 17, 12, 17, 22, 29, 30, 24, 19, 14, 24,
+    31, 30, 24, 19, 16, 16, 25, 31, 33, 26, 19, 15, 13, 24, 30, 35, 27, 21, 16,
+    11, 24, 30, 35, 27, 22, 17, 13, 24, 29, 35, 31, 24, 19, 14, 24, 29, 34, 34,
+    27, 21, 16, 24, 30, 34, 35, 29, 23, 18, 14, 18, 21, 23, 23, 22, 19, 13, 17,
+    20, 22, 23, 20, 17, 11, 15, 19, 20, 20, 18, 15, 10, 13, 16, 18, 18, 14, 9,
+    7,  10, 12, 14, 14, 11, 9,  4,  6,  8,  10, 12, 11, 9,  2,  3,  6,  9,  11,
+    11, 9,  12, 15, 19, 21, 21, 19, 16, 11, 14, 18, 21, 20, 17, 13, 9,  12, 16,
+    18, 18, 15, 11, 9,  10, 13, 16, 14, 12, 7,  6,  7,  9,  11, 10, 9,  6,  2,
+    3,  6,  8,  8,  8,  6,  4,  2,  4,  7,  7,  7,  6,  9,  13, 14, 16, 17, 16,
+    14, 9,  11, 13, 15, 15, 13, 11, 9,  10, 12, 12, 12, 11, 8,  9,  8,  8,  9,
+    9,  7,  3,  5,  4,  5,  5,  4,  3,  2,  1,  0,  1,  1,  2,  3,  2,  4,  3,
+    2,  0,  2,  2,  3,  9,  10, 11, 12, 13, 14, 14, 9,  10, 11, 12, 13, 12, 12,
+    7,  10, 10, 10, 10, 10, 9,  4,  9,  7,  7,  7,  6,  6,  2,  5,  4,  5,  5,
+    5,  5,  1,  7,  6,  6,  6,  6,  6,  4,  9,  9,  8,  7,  7,  8,  9,  10, 10,
+    12, 13, 14, 14, 9,  10, 11, 12, 12, 12, 12, 9,  12, 12, 12, 12, 10, 8,  9,
+    13, 12, 12, 13, 11, 7,  8,  14, 13, 13, 13, 12, 8,  10, 15, 17, 16, 15, 13,
+    9,  11, 16, 19, 17, 17, 15, 10, 17, 19, 18, 18, 16, 14, 14, 17, 21, 21, 20,
+    17, 12, 11, 17, 23, 22, 21, 18, 13, 9,  17, 22, 24, 22, 19, 14, 9,  17, 21,
+    26, 24, 20, 16, 10, 16, 22, 28, 27, 22, 16, 12, 16, 23, 28, 29, 24, 18, 13,
+    26, 32, 31, 24, 19, 15, 13, 26, 31, 33, 26, 20, 15, 11, 25, 31, 34, 27, 21,
+    16, 11, 26, 31, 36, 29, 22, 17, 12, 24, 30, 35, 32, 23, 18, 14, 25, 30, 35,
+    33, 26, 21, 15, 25, 30, 35, 35, 29, 23, 17, 12, 16, 20, 23, 23, 20, 18, 12,
+    15, 19, 22, 23, 19, 16, 10, 14, 17, 20, 21, 17, 14, 9,  11, 14, 17, 19, 15,
+    10, 5,  8,  10, 13, 15, 13, 10, 2,  5,  7,  10, 13, 13, 10, 3,  3,  6,  9,
+    12, 12, 10, 10, 14, 17, 21, 20, 17, 14, 9,  12, 16, 19, 20, 16, 12, 7,  11,
+    15, 17, 17, 14, 10, 6,  8,  11, 13, 13, 12, 6,  4,  5,  8,  10, 9,  9,  6,
+    1,  3,  5,  7,  8,  8,  6,  5,  3,  4,  6,  6,  7,  6,  7,  11, 13, 14, 15,
+    13, 11, 6,  9,  12, 13, 13, 12, 9,  6,  8,  10, 10, 10, 10, 6,  6,  6,  7,
+    7,  7,  7,  2,  2,  2,  3,  3,  3,  3,  2,  3,  3,  2,  1,  1,  2,  2,  5,
+    4,  3,  2,  0,  1,  2,  6,  7,  8,  9,  11, 12, 11, 6,  7,  8,  9,  10, 10,
+    9,  5,  7,  7,  7,  7,  7,  6,  3,  6,  5,  5,  5,  4,  5,  2,  6,  5,  5,
+    5,  5,  5,  3,  8,  7,  7,  7,  6,  6,  5,  11, 9,  8,  8,  8,  8,  9,  10,
+    10, 11, 11, 12, 11, 10, 11, 11, 12, 12, 11, 9,  10, 12, 13, 12, 12, 11, 7,
+    10, 14, 13, 12, 13, 11, 7,  10, 16, 14, 14, 14, 12, 8,  11, 16, 17, 16, 15,
+    13, 9,  12, 16, 20, 18, 17, 15, 11, 18, 20, 20, 19, 16, 13, 11, 18, 22, 21,
+    21, 18, 13, 9,  19, 24, 24, 22, 18, 13, 9,  19, 23, 25, 23, 19, 14, 10, 17,
+    23, 26, 25, 20, 15, 11, 18, 23, 28, 27, 22, 17, 13, 18, 24, 29, 29, 24, 19,
+    14, 27, 32, 31, 25, 19, 15, 11, 27, 32, 33, 26, 21, 16, 11, 27, 33, 35, 27,
+    22, 17, 12, 26, 32, 36, 29, 22, 18, 12, 26, 31, 36, 32, 24, 19, 14, 25, 30,
+    36, 34, 26, 20, 16, 25, 30, 35, 36, 29, 23, 17, 11, 15, 19, 22, 22, 20, 17,
+    10, 14, 17, 21, 22, 18, 15, 9,  12, 16, 19, 20, 17, 12, 7,  10, 13, 16, 18,
+    15, 10, 4,  7,  9,  12, 15, 13, 10, 2,  5,  7,  10, 14, 13, 10, 4,  4,  6,
+    9,  12, 13, 10, 9,  12, 16, 20, 19, 16, 12, 7,  11, 15, 18, 18, 15, 11, 6,
+    9,  13, 16, 16, 13, 9,  5,  7,  10, 13, 12, 11, 6,  1,  4,  7,  9,  9,  9,
+    6,  3,  3,  5,  8,  8,  8,  6,  5,  4,  5,  7,  7,  7,  6,  6,  10, 12, 12,
+    14, 12, 9,  4,  8,  10, 12, 12, 11, 7,  4,  7,  9,  9,  9,  9,  5,  4,  5,
+    6,  5,  6,  6,  2,  1,  1,  3,  2,  2,  2,  2,  4,  3,  3,  2,  1,  1,  2,
+    7,  5,  4,  2,  1,  0,  1,  4,  5,  6,  7,  9,  10, 9,  4,  5,  6,  7,  8,
+    8,  7,  4,  5,  6,  5,  5,  5,  5,  4,  5,  4,  4,  4,  4,  3,  2,  6,  5,
+    5,  5,  5,  5,  4,  8,  7,  7,  7,  6,  6,  7,  12, 9,  9,  8,  8,  8,  10,
+    10, 10, 11, 11, 11, 9,  11, 12, 11, 12, 12, 10, 7,  11, 13, 13, 12, 12, 10,
+    7,  11, 15, 13, 13, 13, 11, 7,  11, 16, 15, 14, 14, 12, 8,  12, 17, 17, 16,
+    16, 13, 9,  13, 17, 21, 18, 17, 16, 11, 20, 20, 19, 19, 16, 13, 9,  19, 22,
+    21, 20, 18, 13, 9,  19, 24, 23, 22, 17, 13, 9,  19, 23, 25, 22, 18, 14, 9,
+    18, 23, 26, 24, 20, 16, 11, 18, 23, 28, 27, 21, 17, 13, 19, 23, 29, 29, 24,
+    19, 14, 27, 31, 29, 24, 20, 16, 11, 26, 30, 31, 25, 20, 16, 12, 27, 32, 33,
+    27, 21, 16, 11, 27, 31, 34, 28, 22, 17, 12, 26, 29, 34, 30, 23, 19, 14, 25,
+    30, 34, 32, 25, 21, 16, 25, 30, 35, 34, 28, 22, 17, 10, 14, 17, 19, 19, 17,
+    14, 9,  13, 15, 18, 19, 16, 13, 8,  11, 14, 16, 18, 15, 11, 7,  9,  12, 15,
+    17, 13, 10, 3,  6,  9,  12, 15, 13, 10, 3,  5,  8,  10, 14, 13, 10, 5,  4,
+    7,  10, 12, 13, 10, 8,  11, 15, 17, 16, 14, 11, 7,  10, 14, 16, 15, 13, 10,
+    5,  9,  12, 15, 13, 12, 8,  4,  6,  9,  12, 11, 10, 6,  1,  4,  7,  9,  9,
+    9,  6,  3,  4,  5,  8,  8,  8,  6,  7,  5,  5,  7,  7,  7,  6,  5,  9,  11,
+    11, 12, 11, 8,  3,  7,  10, 10, 11, 9,  5,  2,  6,  8,  8,  8,  8,  3,  2,
+    4,  5,  5,  5,  5,  2,  2,  2,  3,  2,  2,  2,  1,  5,  4,  3,  2,  2,  1,
+    1,  8,  6,  4,  3,  2,  1,  0,  2,  4,  4,  6,  7,  9,  8,  2,  3,  4,  6,
+    6,  6,  6,  1,  4,  4,  4,  4,  4,  4,  4,  5,  4,  4,  4,  4,  3,  3,  8,
+    6,  5,  5,  5,  5,  5,  10, 8,  7,  7,  6,  6,  8,  13, 10, 9,  8,  8,  7,
+    10, 10, 10, 10, 11, 10, 8,  11, 12, 11, 11, 11, 10, 6,  12, 13, 12, 12, 11,
+    10, 6,  12, 15, 13, 12, 12, 11, 6,  12, 17, 15, 14, 13, 12, 8,  13, 17, 18,
+    16, 15, 13, 9,  13, 18, 20, 17, 16, 14, 10, 19, 19, 18, 17, 15, 12, 8,  19,
+    20, 19, 18, 16, 12, 8,  19, 23, 21, 19, 15, 12, 8,  19, 23, 22, 19, 16, 13,
+    9,  18, 22, 24, 22, 18, 14, 10, 19, 23, 27, 25, 20, 15, 12, 18, 23, 28, 27,
+    22, 17, 13, 25, 28, 25, 20, 17, 14, 11, 24, 28, 27, 22, 17, 14, 11, 24, 28,
+    29, 22, 17, 14, 11, 25, 27, 30, 24, 19, 16, 12, 23, 27, 31, 28, 22, 17, 13,
+    24, 28, 32, 31, 24, 19, 14, 25, 28, 32, 32, 26, 20, 15, 3,  7,  11, 15, 16,
+    13, 11, 2,  5,  10, 14, 15, 13, 8,  2,  4,  8,  11, 13, 10, 5,  2,  2,  5,
+    8,  10, 9,  5,  2,  2,  2,  5,  8,  10, 5,  5,  6,  6,  5,  8,  9,  5,  12,
+    10, 8,  5,  6,  9,  5,  2,  4,  8,  11, 13, 10, 5,  2,  3,  7,  10, 13, 8,
+    3,  2,  2,  5,  7,  9,  5,  2,  1,  2,  2,  4,  5,  3,  2,  2,  3,  3,  3,
+    3,  3,  2,  7,  7,  8,  6,  3,  2,  2,  15, 13, 10, 7,  5,  3,  2,  2,  2,
+    3,  5,  6,  4,  2,  1,  2,  2,  3,  4,  3,  1,  0,  2,  2,  2,  2,  2,  1,
+    1,  2,  1,  1,  1,  1,  2,  4,  4,  4,  4,  4,  3,  2,  10, 10, 9,  8,  6,
+    4,  2,  17, 16, 12, 9,  6,  4,  2,  0,  1,  1,  1,  2,  2,  5,  1,  2,  2,
+    2,  2,  2,  5,  2,  2,  3,  3,  3,  3,  5,  4,  4,  5,  5,  5,  6,  7,  6,
+    9,  9,  9,  9,  8,  7,  10, 15, 14, 13, 11, 10, 9,  17, 20, 17, 15, 13, 12,
+    11, 8,  8,  8,  9,  9,  8,  5,  10, 10, 10, 10, 10, 9,  5,  10, 11, 11, 12,
+    12, 10, 6,  10, 14, 14, 14, 14, 13, 9,  13, 18, 18, 18, 18, 17, 11, 15, 21,
+    23, 21, 20, 18, 13, 20, 24, 25, 23, 21, 20, 15, 17, 18, 18, 18, 16, 11, 7,
+    17, 20, 20, 19, 17, 12, 7,  17, 22, 21, 20, 19, 14, 9,  17, 23, 22, 22, 20,
+    17, 14, 18, 24, 26, 25, 23, 20, 15, 21, 26, 29, 28, 24, 20, 17, 24, 28, 29,
+    30, 25, 23, 18, 24, 29, 27, 22, 19, 15, 9,  24, 28, 29, 23, 20, 16, 11, 24,
+    29, 30, 25, 21, 17, 13, 24, 29, 30, 26, 22, 20, 17, 25, 28, 32, 29, 25, 23,
+    19, 26, 30, 33, 32, 26, 24, 20, 28, 32, 34, 33, 28, 25, 22, 6,  7,  8,  8,
+    9,  7,  7,  5,  7,  8,  9,  9,  7,  6,  4,  6,  7,  8,  8,  7,  6,  3,  6,
+    7,  7,  8,  7,  7,  3,  6,  7,  8,  9,  8,  7,  7,  9,  10, 9,  9,  8,  7,
+    13, 13, 11, 10, 9,  8,  7,  4,  6,  7,  7,  7,  6,  5,  3,  6,  7,  7,  7,
+    6,  5,  2,  5,  7,  7,  6,  6,  6,  1,  4,  7,  7,  6,  6,  7,  4,  5,  7,
+    8,  7,  7,  6,  9,  9,  11, 10, 8,  7,  7,  16, 14, 12, 11, 8,  7,  7,  2,
+    5,  6,  6,  6,  5,  2,  1,  4,  5,  5,  5,  5,  2,  1,  3,  4,  4,  5,  5,
+    2,  1,  3,  4,  4,  5,  5,  4,  6,  6,  6,  6,  6,  5,  4,  11, 11, 11, 9,
+    7,  5,  4,  18, 17, 13, 10, 7,  5,  4,  1,  0,  1,  1,  1,  2,  4,  1,  2,
+    2,  2,  2,  2,  4,  2,  3,  2,  2,  3,  3,  4,  5,  5,  5,  6,  6,  6,  6,
+    6,  10, 9,  9,  10, 9,  8,  12, 15, 14, 13, 11, 11, 9,  19, 21, 18, 15, 13,
+    12, 11, 9,  8,  8,  8,  9,  7,  4,  10, 10, 9,  9,  10, 8,  4,  10, 11, 11,
+    11, 11, 10, 6,  10, 15, 14, 14, 14, 13, 10, 13, 19, 18, 18, 19, 17, 11, 17,
+    22, 24, 23, 21, 19, 13, 20, 26, 28, 25, 24, 21, 15, 17, 18, 17, 17, 14, 10,
+    6,  17, 21, 19, 19, 16, 11, 7,  17, 21, 22, 21, 17, 13, 9,  17, 24, 25, 25,
+    21, 17, 13, 20, 25, 31, 30, 25, 20, 15, 22, 28, 35, 33, 28, 22, 16, 25, 31,
+    35, 36, 30, 24, 18, 25, 31, 29, 22, 17, 13, 9,  25, 30, 32, 25, 19, 15, 10,
+    25, 31, 34, 27, 21, 17, 13, 24, 31, 37, 30, 26, 21, 17, 27, 33, 38, 36, 31,
+    25, 18, 28, 36, 40, 40, 33, 27, 20, 32, 38, 41, 41, 35, 29, 23, 6,  9,  12,
+    13, 13, 11, 9,  5,  8,  11, 13, 13, 11, 10, 4,  7,  10, 12, 13, 12, 10, 3,
+    7,  10, 12, 14, 12, 11, 5,  7,  9,  12, 14, 13, 11, 8,  9,  11, 12, 14, 13,
+    11, 14, 14, 12, 12, 13, 13, 11, 5,  7,  10, 12, 11, 9,  6,  4,  6,  9,  11,
+    11, 9,  6,  2,  5,  8,  10, 10, 9,  7,  1,  5,  8,  11, 10, 10, 8,  4,  6,
+    8,  10, 10, 11, 8,  10, 11, 11, 12, 10, 10, 8,  17, 16, 13, 12, 10, 9,  8,
+    2,  5,  6,  7,  7,  5,  2,  1,  4,  5,  6,  6,  5,  2,  1,  3,  5,  5,  5,
+    5,  3,  1,  3,  5,  5,  5,  6,  4,  6,  7,  7,  7,  7,  6,  4,  13, 12, 12,
+    10, 8,  6,  4,  20, 18, 14, 11, 8,  6,  4,  1,  1,  0,  1,  1,  1,  3,  1,
+    2,  1,  1,  1,  1,  3,  4,  3,  3,  3,  3,  3,  4,  7,  6,  6,  6,  6,  7,
+    6,  8,  11, 10, 10, 10, 10, 8,  13, 16, 15, 14, 12, 11, 10, 19, 22, 19, 16,
+    14, 13, 12, 9,  8,  8,  8,  8,  7,  3,  11, 10, 9,  9,  9,  8,  3,  10, 12,
+    12, 12, 11, 10, 7,  10, 16, 15, 14, 15, 14, 10, 14, 21, 20, 20, 19, 17, 12,
+    18, 24, 25, 23, 21, 18, 14, 22, 27, 28, 26, 24, 21, 15, 17, 19, 17, 17, 13,
+    9,  5,  17, 21, 19, 18, 15, 11, 6,  17, 22, 22, 21, 17, 13, 10, 18, 24, 26,
+    25, 21, 17, 13, 20, 27, 30, 30, 26, 20, 15, 23, 29, 36, 35, 29, 23, 17, 27,
+    32, 37, 37, 31, 25, 19, 25, 30, 29, 22, 16, 12, 8,  25, 31, 31, 24, 18, 14,
+    10, 25, 30, 35, 27, 22, 17, 13, 26, 31, 37, 31, 26, 21, 17, 27, 34, 39, 37,
+    30, 25, 19, 30, 37, 43, 41, 33, 27, 20, 33, 38, 43, 43, 36, 29, 23, 7,  9,
+    12, 15, 15, 13, 10, 6,  8,  11, 14, 15, 13, 10, 5,  7,  10, 13, 15, 14, 11,
+    4,  7,  11, 14, 16, 14, 12, 5,  8,  11, 13, 17, 15, 12, 9,  11, 12, 13, 16,
+    14, 12, 16, 15, 14, 13, 15, 15, 12, 5,  8,  10, 13, 12, 9,  6,  4,  7,  9,
+    12, 12, 9,  6,  3,  5,  9,  11, 11, 10, 8,  1,  5,  9,  11, 11, 11, 9,  5,
+    7,  9,  11, 11, 11, 9,  11, 12, 13, 13, 11, 10, 8,  19, 17, 14, 13, 10, 10,
+    8,  3,  6,  6,  6,  7,  5,  2,  1,  4,  6,  6,  6,  5,  2,  1,  3,  5,  5,
+    5,  6,  3,  2,  4,  5,  5,  6,  6,  5,  7,  8,  8,  8,  8,  7,  5,  14, 13,
+    13, 11, 9,  7,  5,  21, 19, 15, 12, 9,  7,  6,  1,  1,  1,  0,  1,  1,  3,
+    2,  2,  2,  1,  2,  1,  3,  5,  3,  3,  4,  4,  4,  5,  8,  6,  7,  7,  7,
+    7,  7,  9,  12, 11, 11, 12, 10, 9,  14, 18, 16, 15, 14, 12, 11, 21, 24, 20,
+    17, 15, 13, 12, 10, 9,  8,  8,  8,  7,  3,  11, 10, 9,  9,  9,  8,  3,  11,
+    12, 12, 13, 12, 11, 7,  11, 16, 16, 16, 16, 15, 11, 15, 22, 21, 20, 21, 18,
+    13, 19, 25, 26, 25, 22, 20, 14, 23, 28, 30, 27, 25, 21, 16, 18, 19, 17, 17,
+    14, 9,  5,  18, 21, 19, 19, 15, 11, 7,  18, 23, 22, 22, 18, 14, 11, 18, 25,
+    27, 25, 23, 19, 15, 21, 28, 32, 32, 26, 21, 16, 24, 32, 37, 36, 29, 23, 18,
+    28, 34, 38, 38, 32, 26, 20, 26, 31, 29, 22, 17, 12, 8,  25, 31, 31, 24, 19,
+    15, 11, 25, 30, 33, 28, 24, 18, 14, 26, 31, 37, 32, 27, 22, 18, 29, 35, 40,
+    38, 31, 26, 20, 31, 38, 42, 42, 34, 28, 22, 34, 39, 44, 44, 37, 30, 24, 7,
+    10, 12, 15, 15, 12, 10, 6,  9,  11, 14, 15, 13, 11, 5,  7,  11, 15, 16, 15,
+    12, 4,  8,  11, 14, 17, 16, 13, 6,  9,  11, 14, 18, 16, 13, 11, 12, 14, 14,
+    17, 16, 13, 17, 17, 15, 14, 16, 15, 13, 5,  8,  10, 13, 11, 9,  6,  4,  7,
+    10, 12, 12, 9,  7,  3,  6,  9,  12, 12, 10, 8,  2,  6,  10, 12, 12, 11, 9,
+    5,  8,  10, 12, 12, 12, 9,  12, 13, 14, 15, 12, 11, 9,  20, 19, 16, 14, 12,
+    10, 9,  3,  6,  7,  6,  7,  5,  1,  1,  5,  6,  6,  6,  5,  2,  2,  4,  5,
+    6,  6,  6,  4,  2,  4,  6,  6,  6,  6,  6,  7,  9,  9,  9,  10, 8,  6,  15,
+    15, 14, 12, 10, 9,  6,  22, 21, 17, 14, 11, 9,  7,  2,  1,  1,  1,  0,  1,
+    3,  3,  2,  2,  2,  2,  2,  3,  7,  3,  3,  4,  5,  5,  5,  9,  6,  8,  9,
+    9,  8,  7,  10, 12, 12, 12, 13, 12, 10, 16, 19, 17, 16, 15, 14, 12, 22, 25,
+    21, 18, 16, 15, 14, 10, 9,  8,  8,  8,  7,  2,  13, 11, 10, 9,  10, 9,  3,
+    13, 12, 12, 13, 13, 12, 9,  13, 17, 17, 18, 17, 16, 12, 16, 23, 22, 22, 22,
+    19, 14, 21, 27, 28, 26, 24, 21, 16, 24, 29, 31, 28, 27, 23, 17, 18, 19, 18,
+    17, 13, 9,  5,  19, 21, 19, 18, 15, 12, 8,  18, 23, 22, 23, 19, 16, 12, 19,
+    24, 28, 27, 23, 19, 16, 22, 29, 32, 31, 28, 23, 17, 27, 32, 39, 36, 29, 24,
+    19, 30, 36, 38, 39, 33, 27, 21, 25, 29, 26, 21, 16, 12, 8,  25, 30, 29, 23,
+    19, 16, 12, 26, 30, 31, 26, 23, 19, 15, 25, 32, 35, 31, 27, 24, 20, 29, 35,
+    39, 38, 32, 26, 21, 32, 38, 43, 42, 35, 29, 23, 35, 40, 43, 45, 37, 31, 25,
+    6,  8,  10, 12, 12, 9,  8,  6,  8,  9,  11, 12, 11, 9,  5,  7,  9,  12, 14,
+    12, 11, 4,  7,  10, 13, 16, 14, 13, 6,  9,  12, 14, 18, 15, 13, 11, 13, 15,
+    16, 17, 15, 13, 18, 18, 16, 15, 16, 15, 13, 5,  7,  8,  10, 8,  6,  5,  4,
+    6,  8,  9,  9,  7,  6,  3,  6,  8,  10, 10, 9,  8,  2,  6,  9,  11, 11, 11,
+    10, 6,  9,  11, 13, 13, 12, 9,  13, 14, 16, 15, 13, 12, 10, 22, 19, 17, 16,
+    13, 11, 10, 3,  6,  5,  5,  5,  3,  2,  2,  5,  5,  4,  4,  4,  3,  2,  4,
+    5,  5,  6,  6,  5,  3,  4,  6,  7,  7,  7,  8,  8,  9,  10, 11, 11, 10, 8,
+    16, 17, 15, 14, 12, 10, 8,  23, 22, 18, 14, 12, 10, 8,  2,  2,  1,  1,  1,
+    0,  2,  4,  2,  2,  2,  2,  3,  4,  8,  4,  3,  5,  6,  6,  6,  11, 6,  8,
+    9,  9,  10, 8,  11, 13, 13, 14, 14, 12, 11, 16, 20, 18, 17, 16, 14, 13, 23,
+    26, 22, 19, 17, 16, 15, 11, 9,  8,  8,  8,  7,  2,  14, 11, 10, 9,  10, 9,
+    4,  14, 13, 12, 13, 14, 12, 9,  14, 17, 17, 17, 17, 17, 13, 16, 23, 23, 23,
+    22, 19, 15, 21, 27, 28, 26, 23, 21, 17, 26, 31, 31, 28, 26, 22, 18, 18, 17,
+    15, 13, 12, 9,  6,  18, 19, 16, 14, 12, 12, 9,  18, 21, 18, 19, 17, 15, 13,
+    18, 23, 25, 24, 22, 19, 17, 22, 29, 31, 29, 26, 23, 18, 26, 33, 37, 34, 28,
+    23, 20, 30, 36, 38, 37, 30, 25, 21, 22, 25, 22, 17, 13, 10, 9,  22, 25, 24,
+    18, 15, 14, 12, 22, 25, 27, 22, 20, 18, 15, 22, 27, 33, 29, 25, 22, 20, 27,
+    31, 37, 34, 30, 25, 21, 31, 36, 40, 40, 32, 27, 22, 35, 39, 42, 41, 35, 29,
+    24, 9,  11, 13, 16, 16, 13, 10, 9,  11, 12, 15, 16, 14, 12, 8,  9,  12, 16,
+    17, 15, 13, 8,  10, 13, 16, 19, 16, 14, 8,  11, 13, 17, 20, 18, 14, 11, 13,
+    15, 16, 19, 18, 15, 18, 17, 16, 16, 18, 17, 14, 8,  10, 12, 13, 11, 8,  7,
+    8,  9,  11, 13, 12, 10, 8,  7,  8,  11, 14, 13, 11, 9,  6,  8,  11, 14, 13,
+    12, 11, 6,  10, 12, 14, 14, 13, 11, 13, 14, 16, 15, 14, 13, 11, 22, 19, 17,
+    15, 13, 12, 11, 7,  8,  8,  7,  7,  5,  3,  6,  8,  8,  7,  7,  6,  4,  5,
+    7,  7,  8,  8,  8,  6,  3,  7,  8,  8,  9,  9,  8,  7,  9,  10, 10, 10, 9,
+    8,  16, 16, 15, 13, 11, 9,  8,  23, 22, 18, 14, 11, 9,  8,  5,  4,  3,  3,
+    3,  3,  0,  2,  2,  3,  2,  2,  2,  2,  6,  2,  2,  3,  3,  3,  4,  10, 3,
+    5,  6,  6,  6,  6,  9,  10, 10, 10, 10, 9,  7,  15, 18, 16, 14, 12, 10, 8,
+    24, 25, 19, 15, 13, 11, 9,  4,  3,  2,  2,  2,  2,  0,  6,  3,  3,  2,  3,
+    3,  2,  6,  4,  4,  5,  6,  6,  5,  6,  8,  9,  10, 10, 9,  8,  9,  14, 15,
+    15, 15, 13, 9,  16, 20, 22, 20, 17, 14, 10, 22, 25, 25, 21, 19, 15, 11, 8,
+    7,  6,  5,  3,  2,  1,  7,  10, 7,  6,  4,  4,  3,  8,  11, 10, 11, 9,  8,
+    7,  8,  14, 17, 17, 14, 12, 10, 12, 19, 23, 23, 20, 16, 11, 18, 24, 30, 28,
+    22, 17, 13, 24, 28, 31, 30, 24, 19, 14, 13, 16, 14, 8,  5,  3,  2,  13, 16,
+    16, 10, 7,  6,  5,  13, 16, 19, 15, 12, 10, 8,  13, 18, 25, 21, 18, 15, 13,
+    17, 24, 30, 28, 23, 19, 14, 22, 28, 34, 34, 27, 21, 15, 27, 32, 35, 35, 29,
+    23, 17, 6,  10, 15, 18, 18, 16, 15, 5,  9,  14, 17, 18, 15, 13, 3,  8,  11,
+    15, 16, 14, 11, 2,  5,  9,  11, 13, 13, 10, 1,  2,  6,  10, 12, 14, 10, 5,
+    5,  5,  8,  11, 14, 10, 11, 9,  5,  7,  10, 14, 10, 3,  7,  12, 15, 16, 14,
+    10, 2,  6,  11, 14, 15, 13, 8,  2,  5,  9,  11, 12, 11, 5,  2,  2,  6,  8,
+    9,  8,  3,  2,  2,  3,  6,  7,  8,  3,  7,  7,  6,  5,  6,  6,  4,  15, 12,
+    8,  5,  4,  5,  4,  2,  5,  7,  9,  11, 9,  5,  2,  3,  6,  8,  8,  8,  2,
+    1,  2,  4,  5,  5,  5,  1,  0,  2,  2,  1,  2,  1,  1,  4,  4,  4,  4,  4,
+    2,  1,  10, 9,  9,  8,  5,  3,  1,  16, 15, 11, 9,  6,  4,  2,  1,  1,  1,
+    2,  3,  4,  2,  0,  1,  1,  2,  2,  1,  3,  1,  1,  1,  1,  1,  1,  3,  3,
+    3,  3,  3,  4,  4,  4,  5,  7,  7,  7,  8,  7,  6,  9,  13, 11, 11, 10, 9,
+    8,  16, 18, 14, 13, 12, 10, 9,  7,  7,  7,  8,  8,  7,  3,  8,  8,  9,  9,
+    9,  8,  3,  8,  10, 10, 10, 11, 9,  5,  8,  13, 12, 13, 13, 12, 8,  11, 16,
+    15, 15, 15, 14, 10, 14, 18, 19, 17, 16, 16, 12, 17, 20, 21, 18, 18, 16, 13,
+    16, 16, 16, 16, 14, 10, 5,  15, 18, 17, 16, 14, 11, 7,  15, 19, 18, 17, 16,
+    13, 8,  15, 19, 19, 18, 16, 15, 11, 16, 20, 22, 21, 18, 16, 13, 18, 22, 25,
+    23, 20, 17, 14, 20, 24, 25, 25, 21, 18, 15, 21, 25, 22, 19, 16, 14, 8,  21,
+    25, 25, 20, 16, 14, 10, 20, 25, 27, 21, 17, 15, 11, 21, 24, 27, 22, 18, 17,
+    15, 21, 25, 28, 26, 21, 18, 16, 21, 25, 29, 28, 23, 19, 17, 24, 26, 29, 29,
+    24, 20, 17, 7,  8,  9,  11, 11, 9,  7,  6,  7,  8,  10, 10, 8,  7,  5,  7,
+    8,  9,  9,  8,  7,  4,  6,  7,  8,  8,  8,  8,  4,  7,  8,  8,  9,  8,  8,
+    7,  8,  9,  9,  9,  8,  8,  13, 13, 11, 9,  9,  8,  7,  5,  7,  8,  9,  9,
+    7,  6,  4,  7,  8,  8,  8,  7,  6,  3,  6,  7,  7,  7,  7,  6,  2,  5,  7,
+    8,  7,  7,  7,  3,  5,  7,  8,  7,  7,  7,  8,  9,  10, 10, 8,  7,  7,  16,
+    15, 12, 10, 8,  7,  7,  3,  6,  6,  6,  7,  6,  3,  2,  5,  6,  6,  6,  6,
+    3,  1,  4,  5,  5,  6,  6,  3,  1,  4,  5,  5,  6,  6,  5,  5,  6,  6,  6,
+    6,  6,  5,  11, 11, 11, 9,  7,  5,  5,  18, 17, 13, 10, 7,  5,  3,  2,  2,
+    2,  2,  2,  2,  2,  1,  0,  1,  1,  1,  1,  3,  1,  1,  1,  1,  1,  1,  3,
+    4,  4,  4,  4,  4,  4,  5,  6,  8,  8,  8,  8,  7,  6,  11, 14, 13, 12, 10,
+    9,  8,  18, 20, 16, 14, 12, 10, 9,  7,  7,  7,  7,  7,  6,  2,  9,  9,  8,
+    8,  8,  7,  3,  9,  10, 10, 10, 10, 8,  4,  9,  13, 13, 12, 13, 12, 8,  12,
+    18, 17, 17, 18, 15, 10, 15, 21, 23, 21, 20, 17, 11, 19, 24, 26, 23, 22, 18,
+    13, 16, 17, 17, 16, 13, 9,  5,  15, 20, 18, 18, 14, 10, 6,  15, 21, 20, 20,
+    16, 12, 8,  16, 22, 24, 23, 19, 15, 11, 18, 24, 29, 28, 24, 19, 13, 20, 27,
+    32, 31, 27, 21, 15, 25, 30, 34, 32, 28, 23, 17, 23, 29, 28, 22, 16, 12, 7,
+    23, 29, 30, 24, 18, 13, 9,  23, 30, 33, 26, 20, 15, 11, 24, 29, 34, 29, 24,
+    20, 15, 24, 31, 35, 34, 28, 23, 17, 27, 33, 37, 36, 30, 25, 19, 30, 35, 39,
+    38, 33, 27, 22, 7,  10, 12, 14, 14, 12, 10, 7,  9,  12, 13, 14, 12, 10, 5,
+    8,  10, 13, 13, 12, 11, 4,  8,  10, 12, 14, 13, 12, 5,  8,  10, 13, 15, 13,
+    12, 8,  10, 11, 13, 14, 13, 11, 14, 14, 13, 12, 13, 13, 12, 5,  8,  11, 12,
+    11, 10, 7,  5,  7,  10, 12, 11, 10, 7,  3,  6,  9,  11, 11, 10, 8,  3,  6,
+    9,  11, 11, 11, 9,  5,  6,  8,  11, 11, 11, 9,  10, 11, 12, 12, 10, 10, 9,
+    17, 16, 13, 12, 10, 9,  9,  4,  6,  7,  7,  8,  6,  3,  2,  5,  6,  7,  7,
+    6,  3,  1,  4,  5,  5,  6,  6,  3,  1,  4,  5,  6,  6,  6,  4,  6,  7,  7,
+    7,  7,  6,  5,  12, 12, 11, 10, 8,  6,  4,  19, 19, 14, 11, 8,  6,  5,  2,
+    2,  1,  1,  2,  2,  3,  1,  1,  0,  1,  1,  1,  3,  2,  2,  2,  2,  2,  2,
+    4,  6,  5,  5,  5,  5,  5,  5,  7,  9,  9,  9,  9,  9,  7,  12, 15, 14, 13,
+    11, 10, 9,  19, 21, 17, 15, 13, 11, 11, 8,  7,  7,  7,  7,  6,  3,  9,  9,
+    8,  8,  8,  7,  3,  9,  10, 10, 10, 10, 9,  5,  9,  14, 14, 14, 14, 13, 9,
+    13, 19, 19, 18, 18, 16, 11, 17, 22, 24, 23, 20, 18, 12, 21, 26, 28, 24, 23,
+    20, 14, 16, 18, 17, 16, 13, 9,  4,  16, 20, 18, 18, 14, 9,  6,  17, 21, 21,
+    20, 16, 12, 8,  17, 24, 25, 24, 21, 16, 12, 20, 25, 30, 29, 25, 19, 14, 22,
+    28, 35, 32, 28, 21, 16, 25, 31, 35, 36, 28, 23, 18, 24, 30, 27, 21, 16, 12,
+    7,  24, 30, 30, 23, 18, 13, 9,  24, 30, 33, 26, 21, 16, 12, 24, 31, 36, 30,
+    24, 20, 16, 25, 32, 38, 34, 29, 23, 18, 28, 34, 39, 40, 33, 26, 20, 31, 37,
+    41, 41, 35, 28, 21, 8,  10, 13, 16, 16, 13, 11, 7,  9,  12, 15, 16, 14, 11,
+    6,  8,  11, 14, 16, 14, 12, 5,  9,  11, 14, 17, 15, 13, 6,  8,  11, 14, 17,
+    16, 13, 10, 11, 12, 14, 17, 16, 13, 16, 15, 13, 13, 15, 15, 13, 6,  8,  11,
+    14, 12, 10, 7,  5,  8,  10, 13, 12, 10, 7,  4,  7,  10, 12, 12, 10, 9,  3,
+    7,  10, 12, 12, 12, 9,  5,  7,  9,  12, 12, 12, 9,  11, 11, 13, 13, 11, 12,
+    9,  19, 17, 15, 13, 10, 10, 9,  4,  7,  7,  7,  8,  6,  2,  3,  5,  7,  7,
+    7,  6,  2,  1,  5,  6,  6,  6,  6,  4,  1,  5,  6,  6,  7,  7,  5,  7,  8,
+    8,  8,  8,  7,  5,  14, 14, 13, 11, 9,  7,  5,  21, 20, 15, 12, 9,  7,  5,
+    2,  1,  1,  1,  2,  2,  2,  2,  1,  1,  0,  1,  1,  3,  3,  2,  2,  2,  3,
+    3,  4,  6,  5,  6,  6,  6,  6,  6,  8,  11, 10, 10, 10, 9,  8,  14, 17, 15,
+    14, 12, 11, 9,  21, 23, 18, 16, 14, 12, 11, 8,  8,  7,  7,  7,  6,  3,  10,
+    9,  8,  8,  8,  7,  3,  10, 11, 11, 11, 11, 10, 6,  10, 15, 15, 15, 15, 14,
+    10, 13, 20, 20, 19, 19, 16, 11, 18, 25, 25, 24, 21, 18, 13, 22, 27, 28, 26,
+    23, 20, 15, 17, 18, 17, 16, 12, 8,  4,  17, 20, 18, 17, 14, 10, 6,  17, 22,
+    22, 21, 17, 13, 9,  17, 24, 26, 25, 21, 17, 13, 20, 26, 30, 30, 25, 20, 15,
+    23, 29, 36, 33, 28, 22, 17, 27, 32, 36, 37, 30, 24, 19, 24, 30, 28, 21, 16,
+    11, 7,  24, 29, 29, 23, 18, 13, 10, 24, 30, 33, 27, 21, 17, 13, 24, 31, 37,
+    30, 25, 21, 17, 28, 33, 39, 36, 31, 24, 19, 30, 36, 41, 41, 33, 27, 20, 33,
+    38, 43, 43, 36, 28, 22, 8,  11, 14, 17, 17, 15, 12, 7,  10, 13, 17, 17, 14,
+    12, 6,  9,  12, 15, 18, 15, 13, 5,  9,  12, 15, 19, 16, 14, 6,  9,  12, 15,
+    19, 17, 14, 10, 12, 13, 14, 18, 17, 14, 16, 15, 14, 14, 16, 16, 14, 6,  9,
+    11, 15, 14, 11, 8,  5,  8,  11, 13, 13, 10, 8,  4,  7,  10, 13, 13, 11, 9,
+    3,  7,  11, 13, 13, 12, 10, 5,  8,  10, 12, 13, 12, 10, 12, 12, 14, 14, 12,
+    12, 10, 19, 17, 15, 14, 11, 11, 10, 4,  7,  8,  8,  9,  7,  3,  3,  6,  7,
+    7,  7,  6,  3,  1,  5,  6,  7,  7,  7,  4,  1,  5,  7,  7,  7,  7,  6,  7,
+    8,  9,  8,  8,  7,  6,  14, 14, 14, 12, 9,  7,  6,  21, 20, 16, 12, 10, 8,
+    6,  2,  2,  1,  2,  2,  2,  2,  2,  1,  1,  1,  0,  0,  2,  4,  2,  2,  3,
+    3,  3,  3,  7,  5,  6,  6,  6,  6,  5,  8,  11, 10, 10, 11, 9,  8,  14, 17,
+    15, 14, 12, 11, 10, 21, 23, 19, 16, 14, 12, 11, 8,  7,  7,  7,  7,  6,  2,
+    10, 9,  8,  8,  8,  7,  2,  10, 11, 10, 11, 11, 10, 6,  10, 15, 15, 15, 15,
+    14, 10, 14, 21, 20, 20, 19, 17, 12, 18, 24, 26, 24, 21, 18, 13, 23, 28, 29,
+    26, 24, 21, 15, 17, 18, 17, 15, 12, 9,  4,  16, 19, 18, 17, 13, 10, 6,  17,
+    22, 21, 21, 18, 13, 9,  16, 24, 26, 25, 22, 18, 13, 20, 27, 30, 30, 26, 21,
+    15, 24, 30, 37, 35, 28, 23, 17, 28, 32, 37, 37, 30, 24, 19, 24, 28, 25, 20,
+    15, 11, 7,  24, 28, 28, 22, 17, 13, 10, 24, 29, 31, 25, 21, 17, 13, 24, 30,
+    35, 31, 25, 21, 17, 28, 33, 38, 35, 30, 24, 19, 30, 35, 41, 40, 32, 27, 21,
+    34, 39, 41, 42, 35, 29, 23, 8,  11, 14, 17, 17, 15, 11, 7,  10, 13, 16, 16,
+    14, 12, 6,  9,  12, 15, 17, 16, 13, 5,  9,  12, 16, 18, 16, 14, 6,  9,  12,
+    15, 18, 17, 14, 10, 12, 13, 14, 18, 17, 14, 17, 16, 14, 14, 16, 17, 14, 6,
+    9,  12, 14, 13, 11, 8,  5,  8,  11, 13, 13, 10, 8,  4,  7,  10, 14, 13, 11,
+    9,  3,  7,  11, 13, 13, 12, 10, 5,  8,  10, 13, 13, 12, 10, 11, 12, 14, 13,
+    12, 12, 10, 19, 17, 15, 14, 11, 11, 9,  4,  7,  8,  8,  9,  7,  3,  3,  6,
+    7,  7,  7,  6,  3,  2,  5,  6,  7,  7,  7,  4,  1,  5,  7,  7,  7,  7,  6,
+    6,  8,  9,  9,  8,  7,  6,  14, 14, 13, 11, 9,  8,  6,  21, 19, 15, 12, 10,
+    8,  6,  2,  2,  1,  1,  2,  3,  2,  1,  1,  1,  1,  0,  0,  2,  5,  2,  2,
+    3,  3,  3,  3,  7,  5,  6,  6,  6,  6,  5,  9,  11, 10, 11, 10, 10, 8,  14,
+    17, 16, 14, 13, 11, 10, 21, 23, 19, 16, 14, 13, 12, 9,  8,  7,  6,  7,  6,
+    2,  11, 10, 8,  8,  8,  7,  2,  11, 11, 10, 11, 11, 10, 6,  10, 15, 15, 15,
+    15, 14, 10, 14, 21, 20, 20, 19, 16, 12, 18, 24, 25, 23, 21, 18, 13, 23, 27,
+    29, 25, 22, 20, 15, 16, 16, 14, 13, 11, 8,  5,  16, 18, 15, 13, 12, 10, 6,
+    16, 20, 17, 17, 15, 12, 10, 17, 21, 23, 21, 19, 17, 13, 20, 26, 28, 26, 23,
+    20, 15, 24, 29, 33, 30, 25, 21, 17, 27, 33, 34, 33, 26, 23, 19, 21, 23, 20,
+    15, 13, 10, 7,  21, 24, 23, 17, 14, 13, 9,  21, 24, 25, 21, 18, 16, 13, 21,
+    25, 30, 25, 22, 19, 16, 25, 29, 34, 32, 27, 23, 19, 29, 33, 37, 36, 29, 24,
+    20, 32, 35, 37, 38, 32, 26, 21, 9,  11, 14, 17, 17, 14, 11, 9,  11, 13, 16,
+    17, 13, 11, 8,  10, 12, 15, 17, 15, 12, 8,  10, 13, 16, 18, 15, 13, 8,  10,
+    13, 15, 19, 17, 13, 11, 11, 13, 15, 18, 16, 13, 16, 15, 14, 14, 16, 17, 13,
+    8,  10, 12, 14, 13, 10, 7,  8,  9,  11, 13, 13, 9,  7,  7,  8,  11, 13, 12,
+    10, 8,  6,  9,  12, 14, 13, 12, 9,  6,  9,  11, 13, 13, 12, 10, 11, 12, 13,
+    13, 12, 11, 10, 19, 17, 14, 13, 11, 11, 10, 7,  9,  9,  8,  9,  7,  4,  6,
+    8,  8,  7,  7,  6,  3,  5,  8,  8,  7,  7,  6,  5,  4,  7,  8,  8,  7,  7,
+    6,  7,  9,  9,  8,  8,  7,  6,  14, 14, 13, 11, 9,  7,  6,  21, 19, 14, 11,
+    9,  7,  6,  5,  4,  3,  3,  3,  4,  2,  3,  3,  3,  2,  2,  2,  0,  2,  2,
+    2,  3,  2,  2,  2,  7,  3,  4,  5,  4,  4,  4,  8,  9,  9,  8,  8,  7,  5,
+    14, 15, 14, 11, 10, 8,  6,  20, 21, 16, 13, 11, 9,  7,  5,  3,  2,  2,  2,
+    2,  2,  6,  4,  3,  2,  3,  2,  0,  5,  5,  4,  4,  4,  4,  3,  5,  8,  8,
+    8,  8,  8,  6,  9,  14, 13, 13, 13, 10, 7,  14, 19, 20, 18, 15, 12, 8,  20,
+    23, 23, 19, 17, 14, 9,  9,  9,  7,  6,  4,  3,  2,  9,  11, 9,  8,  5,  3,
+    2,  8,  12, 11, 11, 9,  6,  5,  9,  14, 17, 16, 13, 10, 8,  12, 18, 22, 21,
+    18, 14, 9,  17, 23, 27, 25, 20, 15, 11, 22, 26, 29, 28, 23, 17, 12, 14, 18,
+    15, 10, 6,  3,  2,  13, 18, 18, 12, 8,  5,  3,  14, 18, 20, 15, 12, 9,  6,
+    14, 19, 25, 21, 17, 13, 11, 17, 23, 28, 26, 22, 17, 12, 22, 26, 32, 32, 25,
+    19, 14, 26, 30, 33, 33, 27, 20, 15, 10, 14, 18, 22, 22, 20, 17, 8,  12, 17,
+    20, 22, 19, 16, 7,  11, 14, 17, 20, 17, 13, 5,  9,  12, 15, 16, 15, 13, 3,
+    6,  10, 13, 15, 16, 14, 4,  5,  8,  11, 14, 16, 13, 10, 7,  7,  11, 13, 15,
+    14, 7,  11, 15, 18, 20, 17, 13, 5,  9,  14, 17, 19, 15, 12, 4,  8,  12, 13,
+    15, 14, 9,  3,  6,  9,  11, 12, 13, 8,  2,  3,  7,  10, 12, 12, 8,  6,  5,
+    6,  8,  10, 11, 8,  12, 10, 6,  8,  8,  8,  8,  4,  8,  10, 12, 13, 12, 9,
+    2,  7,  9,  11, 11, 11, 7,  1,  5,  8,  9,  9,  10, 4,  1,  3,  4,  5,  5,
+    5,  1,  3,  3,  3,  3,  3,  3,  1,  9,  8,  7,  5,  4,  2,  1,  14, 13, 9,
+    7,  5,  4,  1,  2,  2,  4,  5,  7,  8,  6,  1,  1,  2,  3,  4,  5,  2,  0,
+    1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  4,  6,  6,  6,  6,  5,
+    4,  9,  10, 9,  8,  8,  7,  6,  14, 15, 11, 10, 9,  8,  8,  6,  6,  6,  6,
+    6,  4,  6,  7,  7,  8,  8,  8,  6,  3,  7,  9,  8,  8,  9,  8,  3,  7,  10,
+    10, 10, 10, 9,  6,  9,  13, 12, 12, 12, 11, 8,  11, 15, 15, 14, 13, 12, 9,
+    14, 17, 17, 15, 14, 13, 10, 13, 13, 13, 13, 11, 8,  5,  12, 15, 14, 13, 12,
+    9,  6,  12, 16, 15, 14, 12, 10, 7,  13, 15, 16, 15, 13, 11, 9,  13, 16, 18,
+    17, 16, 12, 10, 14, 18, 22, 20, 17, 14, 11, 16, 20, 22, 21, 18, 15, 12, 17,
+    20, 19, 16, 13, 11, 6,  18, 21, 21, 16, 13, 11, 8,  17, 21, 23, 17, 14, 11,
+    9,  17, 21, 23, 19, 15, 13, 11, 17, 21, 24, 21, 18, 15, 12, 18, 22, 25, 25,
+    19, 16, 13, 20, 23, 26, 25, 21, 16, 14, 7,  8,  10, 13, 13, 11, 9,  7,  8,
+    10, 12, 13, 10, 8,  6,  8,  9,  10, 11, 9,  7,  5,  7,  8,  9,  10, 8,  8,
+    5,  7,  8,  9,  10, 9,  8,  7,  8,  9,  9,  9,  8,  8,  13, 13, 11, 9,  9,
+    8,  8,  7,  8,  9,  10, 11, 9,  7,  6,  7,  8,  10, 11, 8,  7,  4,  7,  8,
+    8,  8,  7,  6,  3,  6,  7,  8,  7,  7,  7,  3,  6,  8,  8,  8,  8,  7,  8,
+    9,  10, 9,  7,  7,  7,  16, 15, 12, 10, 8,  7,  7,  4,  7,  7,  7,  7,  7,
+    5,  3,  6,  7,  7,  7,  6,  4,  2,  5,  6,  6,  6,  6,  5,  1,  5,  6,  6,
+    6,  6,  6,  5,  6,  6,  6,  6,  6,  6,  11, 11, 10, 9,  7,  5,  6,  18, 17,
+    13, 10, 7,  5,  4,  2,  3,  3,  3,  3,  4,  2,  1,  1,  2,  2,  2,  2,  2,
+    1,  0,  1,  1,  1,  1,  2,  3,  2,  2,  3,  3,  3,  3,  5,  7,  6,  6,  7,
+    6,  5,  11, 12, 12, 11, 9,  8,  7,  18, 20, 15, 13, 11, 9,  8,  6,  6,  6,
+    6,  6,  5,  2,  7,  7,  7,  7,  7,  6,  2,  8,  9,  9,  8,  9,  7,  3,  8,
+    12, 11, 11, 12, 11, 7,  10, 16, 16, 15, 17, 14, 9,  13, 19, 22, 20, 19, 16,
+    11, 18, 23, 24, 22, 20, 18, 12, 14, 16, 15, 16, 12, 8,  4,  14, 18, 17, 18,
+    14, 9,  5,  14, 20, 19, 20, 16, 11, 7,  14, 20, 22, 22, 19, 14, 10, 16, 22,
+    27, 24, 22, 18, 12, 19, 25, 30, 28, 24, 20, 14, 23, 28, 31, 30, 26, 22, 16,
+    22, 28, 26, 20, 16, 11, 6,  22, 28, 28, 23, 18, 12, 8,  22, 27, 31, 24, 19,
+    14, 10, 22, 27, 32, 25, 22, 18, 14, 23, 28, 33, 30, 25, 22, 16, 26, 30, 34,
+    32, 28, 24, 18, 28, 31, 34, 35, 29, 25, 21, 9,  12, 14, 14, 15, 13, 12, 8,
+    10, 13, 14, 15, 13, 11, 6,  10, 12, 14, 14, 12, 11, 5,  8,  11, 13, 14, 13,
+    12, 6,  8,  11, 14, 15, 14, 12, 8,  9,  11, 13, 15, 14, 12, 14, 14, 12, 12,
+    13, 14, 12, 6,  10, 12, 13, 13, 11, 9,  6,  9,  11, 13, 13, 11, 8,  4,  7,
+    10, 12, 12, 10, 9,  3,  7,  10, 12, 11, 11, 9,  4,  6,  9,  11, 11, 12, 10,
+    9,  10, 12, 12, 11, 11, 9,  17, 15, 13, 12, 10, 10, 9,  4,  7,  9,  9,  9,
+    8,  4,  3,  6,  8,  8,  8,  7,  4,  2,  5,  7,  7,  7,  7,  4,  2,  5,  6,
+    6,  7,  7,  5,  6,  6,  7,  6,  7,  6,  5,  12, 12, 11, 10, 7,  6,  5,  19,
+    18, 14, 10, 8,  6,  4,  2,  2,  3,  3,  3,  3,  2,  1,  1,  2,  2,  2,  2,
+    2,  1,  1,  0,  0,  0,  0,  2,  4,  3,  3,  4,  4,  4,  5,  6,  8,  7,  7,
+    8,  7,  6,  12, 14, 12, 11, 10, 8,  7,  19, 20, 16, 13, 11, 10, 9,  7,  6,
+    6,  6,  6,  5,  2,  8,  8,  7,  7,  8,  6,  2,  8,  9,  9,  9,  9,  7,  4,
+    8,  13, 12, 12, 12, 11, 7,  11, 17, 17, 16, 16, 14, 9,  15, 21, 23, 20, 19,
+    16, 11, 19, 24, 26, 23, 21, 18, 13, 15, 17, 15, 16, 12, 8,  4,  15, 18, 18,
+    17, 13, 9,  5,  15, 20, 19, 19, 15, 11, 7,  15, 21, 23, 23, 19, 15, 11, 18,
+    25, 28, 26, 23, 18, 12, 20, 26, 33, 31, 26, 19, 14, 23, 29, 33, 33, 28, 22,
+    16, 22, 28, 27, 21, 15, 11, 6,  22, 28, 30, 22, 17, 12, 8,  23, 28, 32, 25,
+    19, 15, 11, 23, 29, 34, 28, 22, 18, 15, 24, 31, 37, 34, 28, 21, 16, 27, 34,
+    39, 37, 31, 25, 18, 30, 35, 40, 40, 33, 26, 20, 9,  13, 16, 19, 19, 17, 14,
+    8,  12, 15, 18, 19, 16, 13, 7,  10, 14, 17, 18, 15, 13, 6,  9,  12, 15, 17,
+    15, 13, 6,  9,  11, 15, 17, 15, 13, 8,  9,  11, 14, 16, 16, 13, 14, 14, 12,
+    13, 16, 15, 13, 7,  11, 14, 17, 16, 13, 10, 6,  9,  13, 16, 16, 13, 9,  5,
+    8,  11, 14, 14, 11, 8,  4,  7,  10, 12, 12, 12, 9,  5,  7,  10, 12, 12, 12,
+    9,  9,  10, 11, 12, 11, 11, 9,  17, 15, 13, 11, 10, 10, 9,  5,  8,  9,  10,
+    11, 9,  6,  4,  6,  8,  9,  10, 9,  5,  3,  5,  7,  7,  7,  7,  4,  2,  6,
+    6,  6,  6,  7,  5,  6,  7,  7,  6,  6,  6,  5,  12, 12, 11, 9,  7,  5,  5,
+    19, 17, 13, 10, 7,  5,  4,  3,  2,  3,  4,  4,  5,  3,  1,  2,  2,  3,  3,
+    3,  3,  1,  1,  0,  0,  0,  0,  2,  4,  3,  3,  3,  3,  3,  4,  6,  8,  7,
+    7,  7,  7,  5,  12, 14, 12, 11, 10, 8,  7,  19, 20, 16, 13, 11, 10, 8,  7,
+    6,  6,  7,  7,  6,  3,  8,  8,  7,  8,  8,  7,  3,  8,  9,  9,  9,  9,  7,
+    4,  8,  13, 12, 12, 12, 11, 7,  11, 17, 17, 16, 16, 14, 9,  15, 21, 22, 21,
+    18, 16, 11, 19, 24, 25, 23, 21, 18, 12, 15, 17, 16, 16, 13, 9,  5,  15, 19,
+    18, 17, 14, 9,  5,  15, 20, 19, 18, 14, 11, 7,  15, 22, 24, 22, 19, 15, 10,
+    18, 24, 28, 26, 23, 18, 12, 21, 26, 34, 32, 25, 20, 14, 24, 29, 34, 33, 27,
+    22, 16, 23, 28, 27, 21, 16, 12, 7,  23, 29, 29, 22, 17, 12, 8,  23, 28, 32,
+    24, 19, 15, 10, 22, 29, 35, 29, 22, 18, 14, 23, 30, 36, 34, 27, 22, 16, 27,
+    32, 39, 38, 31, 24, 18, 30, 36, 40, 40, 33, 26, 20, 10, 14, 18, 20, 21, 19,
+    15, 8,  12, 16, 20, 21, 17, 13, 7,  10, 15, 18, 19, 16, 13, 6,  9,  12, 15,
+    19, 16, 13, 6,  9,  12, 15, 18, 16, 14, 8,  9,  11, 14, 18, 17, 13, 14, 13,
+    12, 13, 16, 17, 14, 7,  11, 15, 18, 17, 14, 11, 6,  10, 13, 16, 17, 13, 9,
+    5,  8,  12, 14, 14, 11, 9,  4,  7,  10, 13, 13, 12, 10, 5,  7,  10, 12, 12,
+    12, 9,  10, 10, 11, 12, 12, 11, 10, 17, 15, 12, 12, 10, 11, 9,  5,  8,  10,
+    11, 12, 10, 6,  4,  7,  9,  10, 10, 9,  5,  3,  6,  7,  7,  7,  7,  4,  1,
+    6,  6,  6,  7,  7,  5,  6,  7,  7,  6,  6,  6,  5,  13, 12, 11, 9,  7,  6,
+    5,  19, 17, 13, 10, 7,  5,  4,  3,  3,  3,  4,  5,  6,  3,  1,  1,  2,  3,
+    3,  3,  2,  1,  1,  0,  0,  0,  0,  1,  4,  3,  4,  3,  3,  3,  3,  6,  8,
+    7,  7,  7,  6,  5,  13, 14, 12, 11, 9,  8,  6,  19, 21, 15, 13, 11, 9,  8,
+    7,  6,  6,  6,  7,  6,  3,  9,  8,  7,  7,  8,  6,  2,  9,  10, 9,  8,  8,
+    7,  3,  9,  13, 12, 12, 12, 11, 7,  12, 18, 17, 16, 16, 13, 8,  15, 21, 22,
+    20, 18, 15, 10, 19, 24, 26, 23, 21, 17, 12, 15, 16, 15, 15, 12, 9,  4,  15,
+    19, 17, 17, 13, 9,  4,  15, 20, 19, 18, 14, 10, 7,  15, 21, 23, 21, 18, 14,
+    10, 18, 24, 29, 26, 23, 17, 12, 20, 27, 33, 31, 25, 19, 14, 24, 29, 33, 33,
+    28, 21, 15, 22, 27, 26, 20, 15, 11, 7,  23, 27, 27, 21, 16, 12, 7,  22, 27,
+    29, 23, 18, 14, 10, 23, 28, 33, 27, 23, 18, 13, 25, 30, 35, 33, 26, 22, 16,
+    27, 32, 38, 38, 30, 23, 18, 29, 34, 38, 37, 32, 25, 20, 10, 14, 17, 21, 21,
+    18, 15, 9,  12, 15, 20, 20, 17, 13, 7,  11, 14, 17, 19, 15, 13, 6,  9,  12,
+    16, 18, 16, 14, 6,  9,  12, 15, 19, 17, 14, 9,  10, 11, 14, 18, 17, 14, 14,
+    13, 12, 14, 17, 17, 13, 7,  11, 15, 18, 17, 15, 11, 6,  10, 13, 16, 17, 13,
+    9,  5,  8,  12, 15, 14, 11, 9,  4,  8,  11, 13, 13, 12, 9,  5,  7,  10, 12,
+    13, 12, 10, 10, 10, 11, 12, 12, 12, 10, 16, 14, 12, 12, 11, 11, 10, 5,  8,
+    10, 11, 12, 10, 6,  4,  7,  9,  10, 10, 9,  5,  3,  6,  7,  8,  7,  7,  4,
+    2,  6,  7,  7,  7,  7,  5,  6,  7,  7,  7,  7,  6,  5,  13, 12, 11, 9,  7,
+    5,  5,  17, 16, 12, 10, 7,  5,  4,  3,  3,  3,  4,  5,  6,  4,  1,  1,  2,
+    3,  3,  3,  2,  1,  1,  0,  0,  0,  0,  1,  4,  4,  4,  3,  3,  3,  3,  7,
+    9,  8,  7,  8,  6,  5,  13, 14, 12, 10, 9,  8,  6,  18, 19, 15, 13, 11, 9,
+    8,  7,  6,  6,  6,  7,  6,  4,  9,  8,  7,  7,  8,  6,  2,  9,  10, 9,  8,
+    8,  7,  3,  9,  14, 13, 12, 12, 10, 7,  12, 18, 17, 16, 16, 14, 9,  15, 21,
+    22, 20, 18, 15, 10, 18, 23, 24, 22, 19, 17, 12, 15, 15, 14, 13, 11, 9,  4,
+    16, 17, 15, 14, 12, 9,  4,  15, 19, 17, 15, 12, 10, 7,  15, 20, 21, 18, 16,
+    14, 10, 18, 23, 26, 23, 20, 17, 12, 21, 25, 31, 27, 22, 18, 14, 23, 28, 31,
+    29, 24, 20, 15, 20, 23, 20, 15, 13, 11, 7,  21, 23, 22, 17, 13, 11, 7,  20,
+    23, 23, 19, 15, 13, 10, 20, 24, 28, 22, 18, 17, 14, 23, 26, 30, 28, 23, 19,
+    16, 26, 29, 33, 32, 25, 21, 17, 28, 31, 34, 34, 27, 22, 18, 11, 13, 16, 19,
+    19, 16, 13, 10, 12, 15, 18, 18, 15, 11, 8,  11, 14, 16, 17, 14, 11, 7,  9,
+    12, 15, 17, 15, 12, 8,  10, 12, 15, 18, 15, 12, 8,  9,  12, 14, 17, 16, 12,
+    12, 12, 11, 13, 16, 16, 12, 9,  11, 14, 16, 15, 12, 9,  7,  10, 12, 15, 14,
+    11, 8,  7,  9,  12, 13, 12, 10, 7,  6,  9,  11, 13, 12, 10, 8,  6,  8,  10,
+    12, 12, 11, 9,  10, 9,  10, 12, 11, 11, 8,  15, 13, 11, 11, 10, 9,  8,  7,
+    9,  10, 10, 11, 9,  6,  6,  8,  9,  9,  9,  7,  4,  4,  7,  8,  7,  6,  6,
+    4,  4,  8,  7,  7,  6,  6,  5,  6,  8,  7,  7,  6,  6,  5,  12, 11, 10, 8,
+    6,  5,  5,  16, 15, 11, 9,  6,  5,  4,  5,  4,  4,  4,  5,  6,  4,  3,  3,
+    4,  4,  3,  3,  2,  2,  2,  2,  2,  1,  1,  0,  4,  2,  3,  3,  2,  2,  2,
+    7,  7,  6,  6,  6,  5,  3,  12, 13, 11, 9,  7,  6,  4,  17, 18, 13, 10, 8,
+    7,  5,  4,  4,  3,  3,  3,  4,  4,  5,  5,  3,  3,  3,  3,  2,  6,  5,  4,
+    4,  4,  3,  2,  5,  9,  8,  7,  7,  6,  4,  8,  14, 13, 12, 12, 9,  5,  13,
+    17, 18, 16, 14, 11, 7,  16, 20, 21, 18, 15, 13, 8,  10, 10, 9,  9,  7,  4,
+    3,  9,  12, 11, 10, 8,  4,  2,  9,  13, 12, 12, 8,  5,  3,  9,  15, 16, 15,
+    12, 9,  6,  13, 18, 22, 20, 17, 12, 8,  16, 21, 27, 24, 19, 14, 10, 20, 24,
+    27, 27, 21, 16, 11, 15, 19, 18, 13, 9,  6,  3,  15, 20, 20, 15, 10, 6,  3,
+    15, 20, 22, 16, 12, 8,  5,  15, 20, 25, 20, 16, 13, 9,  18, 23, 28, 26, 21,
+    16, 11, 21, 26, 31, 30, 23, 17, 13, 24, 29, 31, 32, 25, 20, 14, 13, 16, 20,
+    25, 25, 24, 19, 11, 14, 18, 23, 25, 21, 17, 10, 14, 17, 20, 23, 19, 16, 8,
+    12, 14, 17, 20, 18, 15, 6,  9,  12, 15, 17, 18, 15, 5,  8,  11, 13, 16, 18,
+    15, 7,  8,  9,  13, 15, 18, 15, 9,  14, 17, 20, 21, 19, 15, 8,  13, 15, 19,
+    21, 18, 14, 7,  11, 14, 17, 17, 15, 12, 6,  9,  12, 14, 14, 14, 11, 3,  7,
+    10, 12, 13, 14, 11, 4,  6,  9,  11, 12, 12, 11, 9,  7,  8,  10, 10, 11, 11,
+    7,  11, 13, 14, 16, 15, 11, 5,  10, 11, 13, 13, 14, 9,  4,  8,  10, 11, 11,
+    11, 7,  3,  5,  7,  8,  8,  8,  5,  2,  4,  6,  6,  6,  6,  5,  6,  6,  5,
+    5,  5,  5,  5,  10, 9,  7,  4,  3,  4,  4,  4,  6,  7,  7,  9,  11, 11, 3,
+    4,  6,  6,  7,  8,  7,  1,  3,  4,  4,  4,  4,  3,  0,  0,  0,  0,  0,  0,
+    0,  3,  3,  3,  3,  3,  3,  2,  6,  7,  6,  5,  4,  4,  3,  10, 12, 8,  6,
+    5,  4,  4,  4,  4,  4,  4,  6,  8,  10, 4,  5,  5,  5,  5,  5,  7,  4,  5,
+    6,  5,  5,  5,  2,  4,  7,  6,  6,  6,  5,  3,  5,  9,  8,  8,  8,  7,  4,
+    7,  11, 11, 11, 9,  8,  5,  10, 13, 13, 12, 11, 9,  6,  9,  10, 9,  9,  8,
+    6,  8,  9,  11, 10, 10, 8,  6,  4,  9,  12, 11, 11, 9,  6,  4,  9,  12, 12,
+    12, 10, 7,  5,  9,  13, 15, 14, 12, 9,  6,  11, 14, 18, 16, 13, 10, 7,  13,
+    16, 18, 18, 14, 11, 8,  14, 17, 16, 12, 10, 7,  6,  14, 18, 17, 14, 10, 7,
+    5,  14, 17, 19, 14, 11, 8,  5,  13, 16, 20, 15, 12, 9,  7,  13, 17, 20, 17,
+    15, 11, 8,  14, 18, 21, 20, 16, 12, 9,  16, 19, 22, 22, 17, 14, 10, 10, 11,
+    14, 17, 17, 14, 12, 9,  11, 13, 16, 17, 14, 11, 9,  11, 12, 13, 14, 13, 10,
+    8,  9,  10, 12, 13, 10, 8,  6,  7,  8,  9,  11, 9,  8,  6,  7,  8,  8,  10,
+    9,  8,  12, 12, 9,  8,  9,  9,  8,  9,  10, 12, 14, 14, 12, 10, 8,  10, 11,
+    13, 14, 11, 9,  7,  9,  10, 11, 11, 10, 8,  6,  8,  9,  9,  9,  8,  7,  4,
+    6,  7,  8,  7,  7,  7,  7,  8,  9,  8,  7,  7,  7,  15, 13, 11, 8,  6,  7,
+    7,  7,  9,  10, 9,  10, 9,  8,  5,  8,  9,  9,  9,  9,  7,  4,  8,  9,  9,
+    8,  8,  7,  3,  6,  6,  7,  7,  7,  6,  3,  4,  5,  6,  6,  6,  6,  9,  9,
+    10, 8,  6,  6,  6,  17, 16, 12, 9,  6,  5,  5,  4,  5,  6,  6,  6,  7,  3,
+    3,  4,  5,  5,  5,  5,  3,  2,  2,  3,  3,  4,  4,  2,  0,  0,  0,  0,  0,
+    0,  0,  4,  5,  4,  4,  4,  4,  3,  9,  11, 10, 9,  7,  5,  4,  17, 19, 14,
+    10, 9,  7,  6,  5,  5,  6,  6,  6,  5,  3,  6,  7,  7,  7,  8,  6,  3,  6,
+    8,  9,  9,  9,  7,  3,  6,  10, 9,  9,  10, 9,  4,  8,  14, 14, 14, 14, 12,
+    6,  11, 17, 19, 17, 16, 14, 8,  16, 21, 21, 19, 17, 16, 10, 13, 16, 16, 16,
+    13, 8,  3,  14, 18, 17, 17, 14, 9,  5,  14, 19, 20, 18, 15, 10, 6,  14, 19,
+    20, 19, 17, 13, 8,  14, 20, 22, 21, 18, 16, 10, 17, 21, 26, 23, 21, 17, 12,
+    20, 23, 26, 25, 21, 19, 14, 22, 26, 25, 20, 16, 11, 6,  21, 26, 26, 21, 17,
+    13, 8,  22, 26, 28, 23, 19, 14, 9,  21, 26, 28, 23, 19, 16, 12, 21, 25, 28,
+    25, 20, 18, 14, 22, 26, 29, 28, 23, 19, 16, 23, 26, 30, 28, 24, 21, 17, 13,
+    16, 18, 20, 19, 17, 16, 11, 14, 17, 19, 20, 17, 15, 10, 14, 17, 18, 18, 15,
+    13, 8,  11, 14, 16, 17, 14, 12, 6,  9,  12, 13, 15, 13, 12, 5,  8,  11, 13,
+    15, 14, 12, 11, 11, 10, 13, 14, 14, 12, 10, 13, 16, 18, 17, 16, 13, 9,  12,
+    16, 18, 17, 16, 13, 7,  11, 14, 16, 16, 14, 11, 6,  9,  12, 14, 13, 12, 10,
+    4,  7,  10, 12, 12, 12, 10, 7,  8,  9,  11, 11, 11, 10, 14, 12, 10, 10, 10,
+    10, 10, 7,  11, 13, 14, 15, 13, 9,  6,  10, 12, 13, 13, 12, 8,  5,  8,  11,
+    11, 11, 11, 7,  3,  6,  7,  7,  8,  8,  5,  3,  5,  6,  6,  6,  7,  5,  9,
+    9,  9,  7,  5,  5,  5,  16, 15, 11, 8,  5,  5,  4,  5,  5,  6,  7,  8,  8,
+    5,  3,  4,  5,  6,  6,  6,  4,  2,  2,  3,  4,  4,  4,  3,  0,  0,  0,  0,
+    0,  0,  0,  4,  4,  4,  4,  4,  3,  2,  9,  11, 9,  8,  6,  5,  4,  16, 18,
+    12, 9,  8,  6,  5,  5,  5,  6,  6,  7,  6,  5,  7,  7,  7,  7,  8,  6,  4,
+    7,  8,  8,  8,  8,  6,  3,  7,  10, 9,  9,  9,  7,  4,  8,  14, 13, 13, 13,
+    11, 5,  11, 17, 18, 17, 15, 12, 7,  15, 20, 21, 19, 17, 15, 9,  14, 15, 15,
+    16, 13, 8,  5,  14, 17, 17, 16, 14, 9,  4,  14, 20, 19, 18, 14, 9,  5,  14,
+    19, 21, 19, 15, 11, 7,  14, 20, 24, 23, 19, 14, 9,  17, 23, 29, 28, 22, 16,
+    11, 20, 25, 30, 30, 24, 19, 13, 22, 28, 27, 21, 16, 11, 7,  22, 28, 29, 23,
+    16, 12, 7,  22, 28, 32, 24, 17, 12, 8,  22, 28, 33, 25, 20, 15, 11, 21, 27,
+    33, 30, 24, 19, 13, 23, 30, 35, 34, 27, 21, 15, 25, 31, 35, 36, 29, 23, 17,
+    13, 16, 20, 23, 24, 21, 18, 11, 15, 19, 23, 23, 19, 16, 10, 14, 17, 21, 21,
+    19, 15, 9,  11, 15, 18, 20, 16, 14, 6,  9,  12, 15, 18, 16, 13, 6,  8,  11,
+    14, 17, 16, 14, 11, 11, 11, 13, 16, 16, 13, 10, 14, 17, 20, 20, 17, 14, 9,
+    13, 16, 20, 20, 16, 13, 7,  11, 15, 18, 17, 15, 11, 6,  9,  12, 14, 14, 13,
+    10, 4,  7,  10, 13, 13, 13, 10, 7,  7,  9,  11, 12, 12, 10, 14, 12, 10, 11,
+    11, 11, 10, 8,  11, 13, 14, 15, 14, 9,  6,  10, 12, 13, 14, 13, 8,  5,  8,
+    11, 10, 11, 11, 7,  4,  6,  7,  7,  8,  8,  5,  4,  5,  6,  6,  6,  6,  5,
+    9,  9,  8,  7,  5,  5,  5,  16, 14, 10, 7,  5,  4,  4,  5,  6,  6,  7,  8,
+    9,  6,  3,  4,  5,  6,  6,  6,  5,  2,  3,  3,  4,  3,  4,  3,  0,  0,  0,
+    0,  0,  0,  0,  4,  5,  4,  4,  4,  3,  2,  9,  11, 9,  7,  6,  5,  3,  16,
+    17, 12, 9,  7,  6,  5,  6,  6,  6,  6,  7,  6,  6,  7,  7,  7,  7,  8,  6,
+    5,  7,  8,  8,  8,  8,  6,  3,  7,  10, 9,  9,  9,  7,  4,  9,  14, 13, 13,
+    13, 10, 5,  11, 17, 19, 17, 15, 12, 7,  15, 19, 22, 19, 17, 14, 9,  14, 15,
+    15, 15, 12, 9,  6,  14, 18, 17, 16, 13, 9,  4,  14, 19, 19, 18, 14, 9,  5,
+    14, 19, 20, 19, 15, 11, 7,  14, 20, 25, 23, 19, 14, 9,  17, 23, 29, 28, 21,
+    16, 10, 20, 26, 30, 30, 24, 18, 12, 22, 27, 26, 20, 15, 11, 7,  22, 28, 29,
+    22, 16, 12, 7,  21, 28, 31, 23, 17, 12, 7,  22, 27, 31, 24, 19, 15, 11, 21,
+    28, 33, 29, 24, 18, 12, 24, 29, 35, 34, 27, 20, 14, 26, 31, 36, 36, 29, 22,
+    16, 13, 17, 21, 24, 24, 21, 18, 12, 15, 19, 23, 24, 20, 16, 10, 14, 17, 21,
+    22, 18, 15, 9,  12, 15, 18, 21, 17, 14, 6,  9,  12, 15, 19, 17, 14, 6,  8,
+    11, 14, 18, 17, 14, 11, 10, 10, 13, 16, 16, 14, 10, 14, 18, 22, 20, 18, 14,
+    9,  13, 17, 20, 20, 16, 12, 8,  11, 15, 18, 17, 14, 11, 7,  9,  12, 14, 14,
+    13, 9,  5,  7,  10, 12, 13, 12, 10, 7,  8,  9,  11, 12, 12, 10, 13, 11, 10,
+    11, 11, 11, 10, 8,  11, 13, 14, 15, 14, 10, 6,  10, 12, 13, 14, 12, 8,  5,
+    9,  10, 11, 10, 11, 6,  4,  7,  7,  7,  7,  7,  5,  4,  5,  6,  6,  6,  6,
+    5,  10, 9,  8,  7,  5,  5,  5,  15, 13, 10, 7,  5,  4,  4,  5,  6,  6,  7,
+    8,  9,  6,  4,  4,  5,  6,  6,  6,  4,  2,  3,  4,  3,  3,  3,  2,  0,  0,
+    0,  0,  0,  0,  0,  4,  5,  4,  4,  4,  3,  2,  9,  11, 9,  7,  6,  5,  3,
+    15, 16, 12, 9,  7,  6,  5,  6,  6,  6,  6,  7,  6,  6,  7,  7,  7,  7,  8,
+    6,  4,  7,  8,  8,  8,  8,  6,  2,  7,  10, 9,  9,  9,  7,  4,  9,  14, 14,
+    12, 13, 10, 5,  12, 17, 19, 17, 15, 12, 7,  15, 20, 22, 19, 17, 14, 9,  14,
+    16, 15, 15, 12, 8,  6,  15, 18, 17, 17, 14, 9,  4,  15, 19, 19, 18, 14, 9,
+    5,  14, 19, 20, 19, 15, 10, 7,  15, 21, 24, 23, 19, 14, 9,  17, 23, 30, 27,
+    21, 16, 11, 20, 25, 30, 29, 24, 18, 12, 22, 27, 26, 20, 15, 11, 7,  22, 27,
+    27, 21, 16, 11, 7,  22, 27, 30, 23, 17, 12, 7,  22, 27, 30, 24, 19, 15, 11,
+    22, 26, 32, 29, 23, 18, 13, 24, 29, 34, 34, 26, 20, 14, 26, 31, 35, 35, 28,
+    22, 16, 13, 17, 20, 24, 25, 22, 19, 12, 16, 19, 24, 24, 21, 16, 10, 14, 18,
+    21, 23, 19, 15, 9,  12, 15, 19, 21, 17, 14, 7,  10, 12, 16, 19, 16, 14, 6,
+    9,  11, 15, 18, 18, 14, 9,  9,  10, 13, 17, 17, 14, 11, 14, 18, 21, 21, 18,
+    14, 9,  13, 17, 20, 20, 17, 13, 8,  11, 15, 17, 18, 15, 11, 7,  9,  12, 15,
+    14, 13, 9,  5,  8,  10, 13, 13, 13, 10, 7,  7,  9,  12, 12, 12, 10, 10, 9,
+    9,  11, 11, 11, 10, 8,  12, 13, 15, 16, 14, 10, 7,  10, 12, 13, 14, 12, 8,
+    5,  9,  11, 11, 10, 10, 6,  4,  7,  8,  7,  7,  8,  5,  4,  5,  7,  6,  6,
+    6,  5,  9,  8,  7,  6,  5,  5,  5,  11, 10, 8,  6,  4,  4,  4,  6,  6,  6,
+    7,  9,  9,  6,  4,  4,  5,  6,  6,  7,  4,  2,  3,  4,  4,  3,  3,  2,  0,
+    0,  0,  0,  0,  0,  0,  4,  5,  4,  4,  4,  3,  2,  9,  9,  8,  6,  6,  5,
+    3,  12, 13, 10, 8,  7,  6,  5,  6,  6,  6,  6,  7,  6,  6,  7,  7,  7,  8,
+    8,  6,  4,  7,  9,  8,  8,  8,  6,  2,  7,  11, 9,  9,  9,  7,  3,  9,  15,
+    13, 13, 13, 10, 5,  12, 16, 17, 16, 14, 12, 7,  13, 18, 19, 18, 16, 13, 8,
+    14, 15, 14, 13, 12, 8,  6,  15, 17, 15, 14, 12, 9,  4,  15, 18, 17, 15, 12,
+    9,  5,  14, 18, 18, 15, 14, 11, 7,  15, 20, 22, 20, 17, 13, 8,  17, 22, 25,
+    22, 18, 15, 10, 18, 23, 26, 24, 21, 16, 12, 20, 22, 20, 15, 13, 10, 7,  20,
+    23, 22, 17, 14, 11, 7,  20, 23, 23, 17, 14, 11, 7,  20, 23, 24, 19, 16, 14,
+    10, 20, 23, 27, 24, 20, 16, 12, 22, 26, 29, 29, 22, 18, 14, 24, 27, 29, 29,
+    24, 19, 15, 12, 15, 18, 21, 20, 18, 15, 11, 13, 17, 20, 20, 17, 13, 10, 13,
+    15, 18, 18, 15, 12, 9,  11, 13, 15, 18, 14, 11, 7,  9,  11, 14, 17, 14, 11,
+    6,  8,  10, 12, 16, 14, 11, 8,  9,  10, 12, 14, 14, 11, 11, 13, 16, 18, 17,
+    15, 11, 10, 12, 14, 17, 16, 13, 10, 8,  11, 14, 15, 14, 11, 8,  8,  9,  11,
+    13, 12, 10, 7,  6,  8,  10, 11, 11, 10, 7,  5,  7,  9,  11, 10, 10, 7,  10,
+    9,  9,  10, 9,  9,  7,  8,  11, 12, 12, 13, 11, 8,  8,  10, 11, 11, 11, 10,
+    6,  7,  9,  10, 9,  8,  8,  5,  5,  8,  7,  6,  6,  6,  4,  3,  5,  6,  5,
+    5,  5,  4,  7,  7,  7,  6,  5,  4,  4,  11, 11, 8,  6,  5,  3,  3,  7,  6,
+    6,  6,  7,  8,  6,  4,  5,  5,  6,  6,  5,  4,  2,  3,  4,  4,  3,  3,  2,
+    0,  0,  0,  0,  0,  0,  0,  3,  4,  3,  3,  3,  3,  2,  7,  9,  7,  6,  5,
+    4,  3,  12, 13, 10, 8,  6,  5,  4,  4,  4,  5,  5,  6,  6,  6,  5,  6,  5,
+    6,  6,  5,  4,  6,  7,  7,  6,  6,  5,  2,  6,  8,  7,  7,  7,  6,  3,  7,
+    12, 11, 11, 11, 8,  4,  10, 15, 16, 14, 12, 10, 6,  13, 17, 19, 16, 14, 12,
+    7,  11, 13, 12, 12, 10, 7,  6,  11, 14, 13, 13, 10, 7,  4,  12, 16, 16, 14,
+    11, 7,  4,  11, 16, 16, 15, 12, 9,  6,  12, 17, 21, 19, 15, 11, 7,  15, 20,
+    24, 23, 18, 13, 8,  17, 21, 25, 25, 20, 15, 10, 18, 22, 21, 16, 12, 9,  5,
+    18, 22, 23, 17, 13, 9,  5,  18, 22, 25, 18, 13, 10, 6,  18, 22, 26, 21, 16,
+    12, 9,  18, 23, 27, 24, 19, 15, 10, 20, 25, 30, 28, 21, 16, 11, 22, 26, 30,
+    30, 24, 18, 13, 13, 17, 21, 26, 25, 22, 19, 11, 15, 19, 23, 25, 22, 19, 10,
+    14, 18, 21, 24, 21, 17, 9,  12, 15, 18, 21, 19, 15, 6,  9,  12, 15, 16, 18,
+    15, 3,  6,  10, 13, 16, 17, 15, 4,  6,  8,  12, 15, 18, 15, 10, 14, 18, 21,
+    21, 18, 16, 9,  13, 16, 20, 21, 18, 14, 7,  11, 15, 17, 18, 18, 12, 6,  9,
+    12, 15, 15, 15, 10, 3,  6,  9,  12, 12, 14, 10, 2,  4,  7,  10, 12, 11, 10,
+    6,  5,  6,  9,  10, 10, 10, 7,  11, 14, 15, 16, 15, 12, 6,  10, 12, 13, 15,
+    14, 10, 5,  8,  11, 11, 12, 12, 8,  5,  6,  8,  8,  9,  9,  5,  1,  3,  4,
+    5,  5,  6,  5,  4,  3,  3,  3,  3,  4,  5,  8,  7,  4,  2,  2,  2,  3,  6,
+    6,  8,  9,  10, 11, 9,  5,  6,  7,  8,  8,  9,  8,  4,  5,  6,  6,  6,  7,
+    7,  3,  4,  4,  4,  4,  4,  3,  0,  2,  1,  1,  2,  1,  3,  4,  5,  4,  3,
+    2,  2,  3,  8,  9,  6,  4,  3,  2,  3,  4,  6,  6,  6,  7,  8,  9,  5,  6,
+    6,  6,  7,  7,  8,  5,  6,  7,  7,  7,  6,  6,  5,  7,  6,  6,  6,  5,  3,
+    4,  7,  6,  6,  6,  5,  3,  5,  9,  9,  8,  7,  6,  4,  8,  11, 11, 9,  9,
+    7,  4,  9,  11, 11, 11, 9,  7,  8,  9,  12, 11, 12, 10, 7,  7,  10, 13, 12,
+    12, 10, 8,  6,  9,  12, 12, 12, 9,  7,  4,  8,  11, 13, 12, 10, 7,  5,  9,
+    12, 16, 15, 11, 8,  5,  11, 13, 16, 16, 12, 9,  6,  14, 18, 17, 14, 11, 8,
+    7,  14, 18, 19, 14, 12, 9,  7,  14, 19, 21, 14, 12, 9,  7,  14, 17, 20, 15,
+    11, 8,  5,  13, 16, 19, 16, 12, 9,  6,  13, 17, 19, 18, 14, 10, 7,  14, 17,
+    20, 19, 15, 11, 8,  15, 17, 19, 22, 22, 19, 17, 15, 16, 18, 21, 22, 19, 16,
+    14, 16, 18, 19, 20, 18, 14, 13, 14, 15, 17, 18, 15, 10, 10, 11, 12, 13, 14,
+    12, 10, 6,  8,  9,  9,  12, 12, 10, 8,  8,  8,  9,  11, 12, 10, 13, 16, 17,
+    19, 19, 18, 16, 13, 14, 17, 18, 18, 16, 15, 11, 14, 16, 17, 16, 15, 13, 10,
+    12, 14, 14, 14, 13, 9,  7,  9,  10, 11, 10, 9,  9,  3,  6,  7,  8,  9,  9,
+    9,  10, 9,  7,  8,  8,  8,  9,  12, 14, 16, 15, 16, 16, 14, 10, 13, 15, 15,
+    15, 15, 13, 9,  13, 14, 14, 14, 13, 12, 7,  10, 11, 11, 12, 11, 9,  3,  6,
+    8,  8,  8,  8,  8,  5,  5,  5,  6,  7,  7,  8,  12, 12, 8,  5,  6,  6,  8,
+    9,  10, 11, 12, 12, 13, 10, 7,  8,  9,  10, 11, 11, 9,  6,  7,  8,  8,  8,
+    9,  8,  3,  4,  4,  5,  5,  5,  4,  2,  0,  0,  0,  0,  2,  3,  5,  7,  6,
+    4,  2,  1,  3,  12, 14, 9,  6,  4,  3,  3,  4,  5,  7,  8,  9,  9,  10, 5,
+    6,  6,  7,  8,  8,  9,  5,  7,  7,  7,  7,  6,  7,  5,  8,  8,  8,  8,  6,
+    3,  4,  10, 10, 10, 10, 9,  3,  7,  12, 13, 12, 12, 10, 5,  12, 14, 15, 13,
+    12, 11, 7,  12, 14, 14, 15, 11, 8,  9,  12, 16, 15, 16, 13, 8,  8,  12, 18,
+    18, 17, 14, 9,  6,  12, 16, 18, 16, 14, 10, 5,  12, 16, 17, 16, 14, 11, 7,
+    12, 16, 19, 17, 15, 12, 9,  14, 17, 19, 18, 15, 13, 10, 20, 23, 22, 19, 14,
+    10, 8,  19, 23, 23, 19, 15, 12, 7,  19, 23, 25, 20, 16, 12, 7,  19, 22, 25,
+    19, 16, 13, 9,  18, 21, 23, 20, 16, 14, 10, 17, 19, 23, 22, 17, 13, 12, 18,
+    21, 23, 23, 18, 14, 12, 17, 20, 22, 25, 24, 23, 20, 15, 19, 21, 24, 24, 21,
+    19, 14, 17, 21, 22, 22, 20, 17, 13, 15, 18, 20, 21, 18, 13, 9,  12, 15, 17,
+    17, 15, 13, 6,  9,  11, 14, 16, 15, 13, 7,  8,  10, 13, 15, 15, 13, 14, 17,
+    20, 22, 21, 20, 18, 13, 16, 21, 22, 21, 19, 16, 11, 15, 18, 19, 20, 17, 15,
+    10, 12, 16, 17, 17, 16, 11, 7,  9,  12, 14, 13, 12, 11, 4,  7,  9,  12, 12,
+    12, 11, 10, 9,  8,  11, 11, 12, 11, 11, 15, 17, 18, 19, 18, 14, 10, 13, 16,
+    17, 18, 16, 12, 8,  12, 14, 14, 15, 15, 11, 7,  10, 11, 11, 11, 11, 7,  4,
+    6,  7,  8,  7,  8,  7,  4,  5,  5,  6,  6,  7,  7,  11, 11, 7,  4,  5,  5,
+    6,  9,  9,  10, 11, 13, 13, 10, 7,  8,  9,  10, 10, 11, 9,  6,  7,  7,  7,
+    7,  8,  6,  3,  4,  4,  4,  4,  4,  3,  1,  0,  0,  0,  0,  1,  2,  5,  6,
+    5,  4,  2,  2,  2,  11, 13, 8,  6,  4,  3,  3,  4,  5,  6,  8,  9,  10, 10,
+    6,  6,  6,  7,  8,  8,  9,  6,  7,  7,  7,  7,  6,  6,  6,  9,  8,  8,  8,
+    6,  2,  5,  10, 10, 9,  9,  8,  3,  7,  13, 14, 13, 12, 9,  5,  11, 16, 18,
+    15, 14, 11, 6,  13, 15, 15, 15, 11, 9,  10, 12, 16, 16, 16, 12, 8,  8,  13,
+    18, 18, 17, 13, 9,  5,  13, 18, 19, 18, 15, 10, 5,  12, 18, 21, 20, 16, 11,
+    6,  12, 19, 25, 24, 19, 13, 8,  16, 21, 26, 26, 21, 15, 10, 20, 27, 26, 20,
+    15, 10, 9,  21, 27, 28, 22, 16, 11, 7,  20, 28, 31, 23, 17, 12, 7,  21, 26,
+    31, 24, 18, 13, 8,  20, 25, 31, 27, 21, 15, 10, 20, 26, 31, 31, 23, 17, 11,
+    22, 28, 32, 32, 25, 19, 13, 17, 21, 24, 28, 27, 25, 22, 15, 20, 23, 26, 26,
+    24, 20, 14, 18, 21, 24, 25, 22, 19, 13, 16, 19, 21, 23, 20, 15, 9,  12, 15,
+    18, 20, 18, 15, 6,  9,  12, 15, 18, 17, 15, 7,  7,  11, 14, 17, 18, 14, 14,
+    18, 21, 25, 24, 22, 18, 13, 16, 21, 24, 24, 21, 17, 11, 15, 18, 21, 21, 18,
+    14, 10, 13, 15, 17, 18, 16, 11, 7,  10, 12, 14, 15, 14, 11, 4,  7,  10, 12,
+    13, 13, 11, 9,  8,  9,  11, 11, 12, 11, 11, 15, 17, 18, 20, 18, 14, 10, 14,
+    16, 17, 18, 16, 12, 8,  12, 14, 14, 15, 15, 10, 8,  10, 11, 11, 11, 11, 7,
+    4,  6,  7,  7,  8,  7,  7,  5,  5,  6,  6,  6,  6,  7,  11, 10, 7,  4,  5,
+    5,  6,  9,  9,  10, 11, 13, 13, 10, 7,  8,  9,  10, 10, 10, 8,  6,  6,  7,
+    7,  7,  7,  6,  3,  4,  4,  4,  4,  4,  3,  1,  0,  0,  0,  0,  1,  2,  5,
+    6,  5,  4,  2,  2,  2,  10, 11, 8,  5,  4,  3,  3,  5,  5,  6,  8,  8,  10,
+    10, 6,  6,  6,  7,  8,  8,  8,  6,  7,  8,  7,  7,  6,  5,  6,  9,  8,  8,
+    8,  6,  2,  5,  10, 10, 9,  9,  7,  3,  7,  13, 14, 13, 11, 9,  4,  10, 15,
+    18, 15, 13, 11, 6,  13, 14, 14, 15, 11, 9,  10, 13, 17, 16, 16, 12, 8,  7,
+    13, 19, 18, 17, 13, 8,  5,  13, 18, 19, 18, 14, 9,  4,  12, 17, 21, 19, 15,
+    10, 6,  13, 19, 24, 23, 18, 12, 8,  16, 22, 26, 26, 20, 14, 9,  21, 27, 26,
+    20, 15, 10, 8,  21, 27, 28, 21, 16, 11, 6,  20, 26, 31, 22, 17, 12, 6,  20,
+    26, 31, 23, 18, 13, 7,  19, 26, 30, 27, 20, 14, 9,  20, 25, 31, 30, 23, 16,
+    11, 22, 27, 32, 32, 25, 19, 12, 17, 20, 24, 28, 29, 26, 23, 16, 20, 24, 28,
+    28, 24, 20, 14, 18, 22, 25, 26, 23, 19, 13, 16, 19, 22, 25, 21, 15, 10, 13,
+    15, 19, 21, 19, 15, 7,  9,  13, 15, 20, 18, 16, 5,  8,  12, 15, 17, 19, 15,
+    14, 18, 22, 26, 25, 22, 19, 13, 17, 20, 24, 24, 21, 17, 11, 15, 19, 22, 21,
+    19, 15, 10, 13, 16, 18, 18, 17, 12, 7,  10, 12, 14, 15, 14, 11, 4,  7,  10,
+    12, 13, 14, 12, 5,  6,  9,  12, 12, 12, 11, 11, 16, 17, 18, 20, 18, 14, 10,
+    14, 16, 17, 18, 16, 12, 9,  13, 15, 14, 15, 14, 10, 8,  11, 11, 11, 12, 11,
+    7,  4,  7,  8,  8,  8,  8,  7,  4,  5,  6,  6,  6,  6,  7,  6,  5,  5,  5,
+    5,  5,  6,  9,  9,  10, 12, 13, 14, 10, 8,  8,  9,  10, 10, 10, 8,  7,  7,
+    8,  7,  7,  7,  6,  3,  4,  4,  4,  4,  4,  3,  2,  0,  0,  0,  0,  1,  2,
+    5,  5,  3,  2,  2,  1,  1,  6,  7,  4,  4,  3,  2,  2,  5,  5,  6,  8,  9,
+    10, 10, 6,  6,  6,  7,  8,  8,  8,  6,  7,  7,  7,  7,  5,  5,  6,  9,  8,
+    7,  8,  6,  2,  6,  11, 9,  9,  9,  7,  3,  7,  12, 13, 12, 10, 8,  4,  7,
+    12, 15, 14, 12, 10, 5,  13, 15, 14, 14, 11, 9,  10, 13, 17, 16, 15, 12, 8,
+    7,  13, 19, 18, 16, 13, 8,  4,  13, 18, 19, 18, 13, 9,  4,  13, 17, 20, 19,
+    15, 10, 5,  13, 18, 24, 22, 18, 11, 7,  13, 18, 24, 25, 19, 14, 8,  20, 26,
+    24, 19, 14, 10, 9,  20, 26, 27, 21, 15, 10, 6,  21, 26, 28, 21, 16, 11, 6,
+    21, 25, 29, 23, 17, 12, 7,  20, 25, 28, 25, 19, 14, 9,  20, 26, 30, 27, 21,
+    15, 10, 20, 26, 30, 30, 24, 17, 12, 16, 20, 24, 28, 28, 26, 21, 15, 19, 23,
+    27, 28, 24, 20, 13, 17, 21, 24, 26, 22, 18, 12, 15, 18, 21, 24, 20, 15, 9,
+    12, 15, 17, 21, 18, 15, 7,  10, 12, 16, 19, 18, 16, 5,  8,  11, 15, 18, 18,
+    15, 14, 17, 21, 25, 24, 21, 18, 12, 16, 20, 23, 23, 20, 16, 11, 14, 18, 20,
+    21, 18, 14, 9,  12, 15, 18, 18, 16, 11, 7,  9,  11, 14, 14, 14, 11, 4,  7,
+    10, 13, 13, 14, 11, 5,  6,  9,  12, 12, 12, 11, 11, 15, 17, 17, 19, 17, 13,
+    9,  13, 15, 16, 17, 16, 11, 8,  12, 14, 14, 14, 14, 9,  7,  10, 10, 10, 11,
+    11, 7,  3,  6,  7,  7,  7,  8,  6,  4,  5,  6,  6,  6,  6,  7,  7,  5,  5,
+    5,  5,  5,  5,  8,  9,  10, 11, 12, 13, 9,  7,  7,  8,  9,  10, 9,  7,  5,
+    6,  7,  7,  6,  6,  5,  3,  4,  3,  3,  3,  3,  3,  1,  2,  1,  1,  1,  0,
+    1,  4,  5,  3,  3,  2,  2,  1,  7,  8,  5,  4,  3,  2,  2,  5,  5,  5,  7,
+    8,  9,  9,  7,  6,  6,  7,  7,  7,  7,  7,  8,  7,  7,  7,  5,  4,  7,  10,
+    8,  7,  7,  6,  2,  6,  11, 10, 9,  9,  7,  2,  8,  12, 12, 11, 10, 8,  4,
+    8,  12, 15, 12, 11, 10, 5,  14, 14, 13, 12, 11, 8,  9,  14, 16, 15, 14, 11,
+    8,  6,  14, 18, 16, 14, 11, 8,  4,  14, 18, 17, 14, 12, 8,  4,  12, 17, 19,
+    16, 13, 10, 5,  13, 17, 21, 18, 14, 11, 7,  14, 18, 21, 20, 15, 12, 8,  19,
+    22, 19, 15, 12, 10, 7,  19, 22, 21, 17, 14, 10, 6,  20, 22, 23, 17, 13, 10,
+    6,  19, 22, 23, 18, 14, 11, 7,  18, 21, 23, 20, 16, 12, 8,  18, 21, 23, 23,
+    17, 13, 10, 19, 22, 24, 24, 19, 15, 11, 14, 18, 21, 23, 24, 21, 18, 14, 17,
+    20, 23, 23, 20, 16, 12, 15, 19, 21, 22, 18, 15, 11, 14, 16, 19, 20, 17, 14,
+    8,  11, 13, 16, 20, 18, 14, 7,  10, 13, 15, 19, 18, 14, 6,  8,  12, 15, 18,
+    17, 14, 13, 16, 18, 21, 20, 18, 15, 11, 15, 17, 20, 19, 16, 13, 10, 13, 16,
+    18, 17, 15, 12, 9,  11, 14, 16, 15, 14, 11, 6,  9,  12, 14, 14, 13, 10, 5,
+    8,  11, 13, 13, 12, 11, 7,  7,  9,  12, 12, 12, 11, 10, 14, 15, 15, 16, 14,
+    11, 8,  12, 14, 15, 14, 13, 10, 7,  11, 13, 12, 12, 12, 8,  6,  9,  9,  9,
+    9,  9,  6,  3,  7,  8,  7,  7,  7,  6,  4,  5,  6,  6,  6,  6,  6,  8,  7,
+    6,  5,  5,  5,  5,  8,  8,  9,  9,  10, 11, 7,  6,  6,  7,  8,  8,  8,  5,
+    4,  5,  6,  5,  5,  5,  3,  2,  3,  2,  2,  2,  2,  2,  3,  3,  2,  2,  2,
+    1,  0,  5,  5,  4,  3,  2,  2,  1,  7,  10, 6,  4,  3,  2,  2,  4,  4,  4,
+    5,  6,  7,  7,  5,  5,  4,  4,  5,  5,  5,  5,  4,  4,  3,  3,  2,  2,  4,
+    6,  4,  4,  4,  3,  1,  5,  8,  8,  7,  7,  5,  2,  6,  11, 12, 11, 9,  7,
+    3,  9,  13, 15, 12, 11, 8,  4,  8,  9,  9,  9,  7,  6,  7,  8,  11, 10, 10,
+    7,  4,  4,  8,  12, 12, 11, 7,  4,  2,  8,  12, 13, 12, 9,  6,  3,  9,  13,
+    17, 15, 12, 8,  4,  11, 16, 21, 19, 14, 10, 5,  13, 18, 21, 21, 16, 11, 7,
+    15, 19, 17, 13, 9,  6,  6,  14, 18, 19, 14, 9,  6,  3,  14, 19, 21, 15, 10,
+    6,  3,  14, 18, 22, 16, 12, 9,  6,  14, 18, 23, 21, 16, 11, 7,  16, 21, 25,
+    25, 19, 13, 8,  19, 23, 25, 26, 20, 15, 10, 14, 17, 22, 25, 25, 23, 20, 13,
+    16, 20, 24, 25, 22, 18, 13, 15, 18, 21, 24, 19, 16, 12, 13, 16, 19, 21, 17,
+    14, 9,  10, 12, 14, 15, 16, 13, 5,  6,  8,  11, 13, 15, 13, 3,  3,  6,  9,
+    13, 15, 13, 13, 15, 18, 22, 22, 19, 17, 12, 14, 17, 21, 21, 18, 16, 11, 13,
+    16, 18, 18, 16, 12, 11, 11, 13, 15, 15, 13, 7,  8,  8,  9,  11, 10, 11, 8,
+    3,  3,  5,  8,  9,  9,  8,  4,  3,  4,  7,  8,  8,  7,  12, 13, 15, 16, 17,
+    17, 16, 11, 13, 14, 15, 16, 16, 14, 10, 12, 13, 13, 13, 14, 12, 10, 10, 10,
+    10, 11, 10, 6,  6,  6,  6,  6,  5,  5,  5,  0,  2,  1,  2,  4,  4,  5,  5,
+    4,  2,  1,  3,  4,  5,  11, 12, 13, 13, 15, 16, 16, 10, 11, 12, 14, 14, 15,
+    14, 9,  10, 12, 12, 13, 13, 12, 6,  9,  9,  9,  9,  9,  7,  4,  5,  5,  5,
+    5,  4,  4,  0,  2,  2,  1,  2,  3,  5,  5,  6,  3,  2,  3,  3,  4,  9,  11,
+    12, 13, 14, 15, 16, 8,  9,  11, 12, 13, 14, 14, 8,  9,  10, 11, 11, 12, 12,
+    8,  8,  8,  8,  8,  8,  5,  5,  7,  7,  6,  6,  5,  4,  3,  6,  7,  7,  7,
+    6,  4,  5,  8,  9,  8,  8,  7,  5,  10, 11, 12, 12, 12, 14, 15, 10, 12, 12,
+    13, 12, 12, 14, 10, 13, 13, 13, 11, 10, 11, 10, 12, 13, 12, 11, 8,  5,  8,
+    11, 12, 12, 9,  7,  5,  7,  10, 14, 13, 10, 8,  5,  8,  11, 14, 14, 11, 9,
+    6,  14, 19, 17, 15, 12, 12, 14, 15, 19, 19, 16, 13, 11, 12, 15, 19, 21, 15,
+    13, 10, 9,  15, 18, 21, 15, 12, 9,  6,  13, 16, 18, 15, 11, 9,  7,  12, 15,
+    18, 17, 13, 9,  7,  12, 16, 18, 19, 14, 11, 8,  21, 23, 24, 27, 27, 25, 23,
+    20, 23, 25, 26, 26, 23, 21, 20, 22, 23, 24, 24, 22, 18, 18, 20, 21, 21, 21,
+    18, 12, 15, 17, 18, 17, 16, 13, 12, 11, 13, 13, 12, 13, 13, 12, 6,  8,  10,
+    12, 13, 13, 12, 19, 22, 23, 25, 25, 24, 23, 18, 21, 23, 25, 24, 22, 21, 17,
+    21, 22, 22, 21, 20, 18, 16, 19, 20, 20, 19, 16, 11, 12, 15, 16, 16, 12, 12,
+    11, 8,  11, 12, 10, 11, 11, 11, 4,  6,  9,  10, 10, 11, 11, 17, 20, 21, 23,
+    23, 23, 20, 15, 19, 21, 22, 22, 21, 18, 14, 18, 20, 20, 19, 20, 16, 13, 15,
+    16, 16, 16, 15, 11, 8,  12, 13, 13, 10, 10, 10, 2,  7,  8,  8,  9,  9,  10,
+    5,  6,  6,  7,  8,  9,  10, 14, 15, 17, 18, 19, 20, 18, 12, 13, 16, 17, 17,
+    17, 16, 10, 12, 13, 14, 14, 14, 13, 7,  11, 11, 11, 11, 9,  9,  4,  7,  6,
+    6,  4,  5,  5,  2,  0,  0,  2,  3,  4,  6,  5,  7,  3,  2,  2,  3,  4,  11,
+    12, 13, 15, 16, 17, 18, 8,  11, 13, 14, 15, 15, 16, 8,  10, 11, 11, 12, 13,
+    12, 8,  8,  8,  8,  8,  7,  5,  6,  7,  7,  7,  8,  6,  4,  3,  8,  9,  8,
+    8,  8,  3,  5,  8,  9,  9,  9,  8,  5,  10, 12, 12, 13, 13, 16, 18, 10, 14,
+    14, 15, 12, 14, 14, 10, 15, 15, 14, 11, 10, 11, 9,  14, 15, 13, 12, 7,  3,
+    9,  13, 14, 13, 10, 9,  5,  9,  12, 14, 13, 11, 9,  7,  9,  11, 14, 14, 12,
+    10, 8,  17, 20, 19, 17, 13, 14, 16, 17, 20, 20, 18, 14, 11, 13, 17, 20, 22,
+    17, 14, 9,  9,  17, 19, 21, 16, 13, 11, 7,  15, 17, 19, 16, 12, 10, 8,  13,
+    16, 18, 17, 13, 10, 8,  12, 15, 18, 18, 14, 11, 9,  21, 24, 28, 30, 29, 29,
+    26, 20, 24, 27, 28, 30, 27, 23, 18, 23, 26, 27, 27, 24, 20, 17, 20, 23, 24,
+    25, 21, 15, 14, 17, 20, 21, 19, 17, 15, 10, 13, 15, 16, 18, 17, 15, 6,  9,
+    12, 15, 17, 17, 15, 19, 23, 25, 28, 28, 26, 23, 17, 21, 25, 27, 27, 24, 21,
+    16, 19, 24, 25, 24, 22, 18, 15, 17, 21, 22, 21, 18, 13, 12, 14, 17, 18, 15,
+    14, 13, 7,  10, 12, 14, 14, 14, 13, 4,  6,  10, 13, 13, 13, 13, 16, 20, 22,
+    23, 25, 22, 18, 15, 18, 20, 22, 22, 21, 17, 14, 17, 19, 19, 19, 19, 14, 12,
+    15, 16, 16, 15, 14, 9,  7,  11, 12, 12, 10, 10, 9,  2,  7,  7,  8,  8,  8,
+    9,  5,  5,  6,  6,  7,  7,  8,  14, 14, 15, 16, 18, 18, 16, 12, 13, 14, 15,
+    16, 16, 13, 9,  12, 12, 12, 12, 12, 10, 6,  10, 9,  9,  9,  7,  8,  4,  6,
+    5,  5,  3,  3,  4,  1,  0,  0,  1,  2,  3,  3,  5,  6,  3,  2,  2,  2,  2,
+    10, 11, 12, 13, 14, 15, 16, 7,  10, 11, 12, 13, 13, 14, 7,  9,  10, 10, 10,
+    10, 10, 7,  7,  7,  7,  7,  6,  3,  5,  7,  7,  7,  8,  6,  2,  3,  8,  10,
+    9,  9,  8,  3,  5,  11, 13, 11, 11, 10, 5,  10, 13, 13, 13, 12, 14, 15, 10,
+    14, 14, 15, 11, 12, 13, 10, 16, 16, 16, 11, 9,  8,  10, 15, 17, 17, 12, 7,
+    3,  9,  15, 19, 18, 15, 10, 5,  9,  15, 22, 21, 17, 11, 7,  11, 17, 22, 23,
+    20, 14, 8,  18, 25, 24, 18, 13, 13, 14, 19, 25, 26, 19, 14, 11, 11, 18, 24,
+    29, 21, 15, 10, 7,  18, 25, 29, 22, 17, 11, 6,  18, 23, 28, 25, 19, 13, 8,
+    17, 23, 28, 27, 21, 15, 10, 18, 23, 28, 29, 22, 18, 12, 20, 24, 27, 31, 31,
+    28, 26, 19, 23, 27, 30, 30, 27, 23, 18, 21, 25, 27, 29, 26, 21, 16, 19, 22,
+    25, 26, 23, 17, 13, 16, 18, 21, 22, 19, 16, 10, 12, 15, 17, 20, 19, 16, 6,
+    9,  12, 16, 18, 19, 16, 18, 21, 25, 28, 28, 26, 22, 16, 20, 24, 27, 27, 23,
+    19, 15, 18, 22, 24, 24, 22, 17, 14, 16, 19, 22, 21, 19, 13, 11, 13, 16, 18,
+    16, 15, 13, 7,  9,  12, 14, 14, 14, 12, 4,  7,  10, 13, 13, 14, 12, 15, 18,
+    21, 22, 24, 21, 18, 14, 17, 20, 21, 21, 19, 16, 13, 16, 18, 18, 18, 17, 13,
+    11, 13, 15, 14, 15, 14, 8,  7,  10, 11, 11, 10, 9,  8,  2,  6,  7,  7,  8,
+    8,  8,  3,  5,  6,  6,  7,  7,  7,  13, 13, 14, 15, 16, 17, 14, 11, 11, 13,
+    14, 14, 14, 11, 8,  10, 11, 11, 11, 10, 9,  5,  8,  7,  7,  7,  6,  6,  3,
+    4,  4,  4,  2,  2,  3,  1,  2,  1,  0,  1,  2,  3,  3,  4,  2,  2,  2,  2,
+    2,  9,  9,  10, 11, 12, 14, 13, 6,  8,  9,  10, 11, 11, 11, 6,  8,  8,  8,
+    9,  9,  8,  6,  7,  6,  6,  6,  5,  3,  4,  8,  8,  8,  8,  6,  2,  3,  9,
+    10, 10, 9,  7,  3,  5,  9,  12, 11, 11, 9,  5,  11, 13, 13, 13, 11, 12, 13,
+    11, 15, 15, 15, 11, 10, 10, 11, 16, 16, 16, 11, 8,  7,  11, 16, 17, 16, 12,
+    8,  3,  10, 15, 19, 17, 14, 9,  5,  10, 15, 22, 21, 16, 10, 6,  11, 16, 21,
+    23, 18, 13, 8,  19, 25, 24, 18, 13, 11, 12, 19, 25, 27, 20, 14, 9,  9,  18,
+    25, 29, 21, 15, 10, 6,  19, 24, 29, 22, 16, 11, 6,  18, 24, 29, 24, 18, 13,
+    8,  18, 23, 29, 27, 20, 14, 9,  18, 24, 30, 29, 22, 16, 11, 19, 23, 26, 31,
+    30, 27, 24, 17, 22, 26, 29, 30, 27, 22, 16, 20, 23, 27, 28, 25, 21, 15, 17,
+    21, 24, 27, 23, 17, 12, 15, 17, 20, 22, 20, 17, 8,  11, 13, 17, 21, 20, 16,
+    6,  9,  13, 16, 19, 20, 17, 16, 20, 24, 28, 27, 25, 21, 15, 19, 22, 26, 27,
+    23, 19, 14, 18, 21, 24, 23, 21, 17, 12, 15, 18, 20, 20, 18, 13, 9,  12, 14,
+    17, 16, 16, 13, 6,  9,  12, 14, 14, 15, 12, 4,  7,  10, 13, 13, 14, 13, 14,
+    18, 19, 20, 22, 20, 17, 12, 15, 19, 19, 20, 19, 14, 11, 15, 17, 16, 16, 17,
+    12, 10, 13, 13, 13, 13, 13, 8,  6,  9,  10, 10, 9,  9,  8,  3,  6,  7,  7,
+    8,  8,  8,  4,  5,  6,  6,  7,  7,  7,  11, 12, 12, 14, 15, 16, 12, 10, 10,
+    11, 12, 13, 13, 10, 8,  9,  10, 9,  9,  9,  7,  4,  7,  6,  6,  6,  6,  5,
+    2,  2,  2,  2,  2,  2,  3,  2,  4,  2,  1,  0,  1,  2,  4,  6,  3,  2,  2,
+    1,  2,  6,  7,  8,  9,  10, 11, 12, 5,  6,  7,  9,  9,  9,  10, 5,  6,  7,
+    6,  6,  7,  6,  5,  7,  6,  6,  6,  5,  3,  4,  9,  8,  7,  7,  5,  2,  5,
+    9,  10, 9,  9,  7,  3,  6,  10, 12, 11, 10, 9,  4,  11, 13, 13, 13, 10, 10,
+    11, 12, 15, 14, 14, 11, 8,  9,  11, 17, 16, 15, 11, 7,  5,  11, 16, 17, 16,
+    12, 8,  3,  11, 16, 19, 18, 14, 9,  4,  11, 16, 22, 20, 15, 10, 6,  11, 16,
+    22, 22, 17, 12, 7,  19, 25, 23, 17, 13, 9,  10, 19, 25, 25, 19, 14, 9,  7,
+    20, 25, 27, 20, 15, 10, 5,  19, 24, 28, 22, 16, 11, 6,  18, 24, 28, 23, 17,
+    12, 7,  18, 23, 27, 25, 20, 14, 9,  18, 23, 27, 28, 22, 16, 10, 18, 22, 26,
+    29, 29, 26, 23, 16, 20, 24, 29, 29, 25, 21, 15, 19, 23, 25, 28, 23, 19, 14,
+    16, 19, 23, 25, 22, 16, 10, 13, 16, 19, 23, 20, 16, 8,  11, 14, 17, 21, 20,
+    17, 7,  10, 13, 16, 19, 20, 16, 15, 19, 23, 26, 26, 23, 19, 14, 17, 22, 25,
+    25, 21, 18, 12, 16, 20, 22, 23, 20, 16, 11, 14, 16, 19, 19, 17, 13, 8,  11,
+    13, 16, 16, 15, 13, 6,  9,  12, 14, 14, 14, 13, 5,  7,  11, 13, 13, 13, 13,
+    13, 16, 18, 19, 21, 19, 15, 11, 15, 17, 18, 19, 17, 13, 10, 13, 16, 15, 16,
+    15, 11, 9,  11, 12, 12, 12, 12, 8,  5,  8,  9,  9,  9,  9,  8,  3,  6,  7,
+    8,  7,  7,  8,  5,  5,  6,  6,  7,  7,  7,  10, 10, 11, 12, 14, 14, 10, 9,
+    9,  10, 11, 11, 11, 8,  7,  8,  8,  8,  8,  8,  6,  3,  5,  5,  5,  5,  5,
+    4,  2,  1,  2,  2,  1,  2,  2,  3,  4,  3,  2,  1,  0,  1,  5,  7,  4,  3,
+    2,  2,  2,  4,  4,  6,  7,  8,  9,  10, 5,  5,  5,  7,  7,  7,  8,  5,  6,
+    6,  6,  5,  5,  5,  5,  8,  7,  6,  6,  5,  1,  5,  9,  8,  7,  8,  5,  2,
+    6,  10, 11, 10, 9,  7,  3,  7,  10, 13, 11, 11, 9,  4,  12, 13, 12, 12, 10,
+    8,  9,  12, 15, 14, 13, 11, 7,  7,  12, 17, 16, 13, 11, 6,  4,  13, 16, 16,
+    14, 12, 7,  3,  11, 16, 18, 15, 13, 9,  4,  11, 16, 20, 18, 14, 10, 6,  12,
+    16, 21, 20, 15, 12, 7,  18, 21, 19, 15, 12, 9,  8,  18, 21, 20, 16, 13, 9,
+    5,  18, 21, 23, 16, 13, 9,  5,  18, 21, 23, 17, 14, 10, 6,  18, 20, 23, 20,
+    15, 12, 8,  18, 20, 23, 21, 17, 13, 9,  18, 21, 23, 23, 18, 13, 10, 17, 20,
+    24, 27, 27, 24, 21, 16, 19, 23, 26, 27, 23, 20, 14, 18, 21, 24, 26, 22, 18,
+    13, 16, 18, 21, 24, 21, 17, 10, 12, 15, 18, 22, 20, 16, 8,  11, 14, 17, 21,
+    20, 16, 7,  10, 13, 16, 20, 19, 17, 14, 17, 21, 24, 23, 21, 18, 13, 17, 20,
+    23, 23, 20, 16, 11, 15, 19, 21, 20, 18, 14, 10, 13, 16, 19, 17, 16, 12, 7,
+    11, 13, 15, 16, 15, 12, 6,  9,  12, 14, 15, 14, 12, 6,  8,  11, 13, 13, 13,
+    12, 12, 15, 17, 17, 19, 17, 13, 10, 13, 16, 17, 17, 16, 11, 9,  12, 14, 14,
+    14, 14, 10, 8,  10, 11, 11, 11, 11, 7,  5,  8,  9,  9,  8,  8,  7,  5,  7,
+    8,  8,  7,  7,  7,  6,  6,  6,  6,  6,  6,  6,  9,  9,  10, 11, 12, 13, 8,
+    8,  8,  9,  9,  9,  10, 6,  6,  7,  7,  7,  6,  6,  4,  3,  4,  4,  3,  3,
+    3,  3,  3,  3,  2,  2,  1,  1,  1,  5,  5,  4,  2,  2,  1,  0,  7,  7,  4,
+    3,  2,  2,  2,  3,  3,  4,  5,  6,  8,  8,  4,  4,  4,  5,  5,  5,  6,  4,
+    5,  4,  3,  3,  3,  3,  4,  6,  4,  3,  3,  3,  0,  5,  6,  5,  4,  4,  3,
+    2,  6,  8,  9,  7,  6,  4,  2,  7,  10, 11, 8,  7,  5,  2,  6,  6,  6,  6,
+    5,  7,  7,  6,  8,  7,  7,  5,  4,  5,  6,  9,  8,  7,  4,  2,  2,  6,  8,
+    9,  8,  5,  3,  2,  7,  10, 13, 12, 9,  5,  2,  8,  12, 17, 15, 11, 7,  3,
+    10, 14, 18, 17, 12, 8,  4,  11, 15, 14, 9,  6,  6,  6,  10, 15, 16, 10, 6,
+    3,  3,  10, 15, 18, 11, 7,  3,  2,  10, 14, 18, 12, 8,  5,  3,  10, 15, 20,
+    17, 12, 8,  4,  12, 17, 22, 20, 15, 10, 5,  14, 20, 23, 22, 17, 11, 7,  20,
+    21, 23, 26, 26, 25, 23, 19, 21, 23, 25, 26, 23, 21, 18, 20, 21, 23, 23, 19,
+    16, 18, 18, 19, 19, 20, 15, 11, 15, 15, 15, 14, 14, 14, 10, 11, 11, 8,  10,
+    12, 14, 10, 5,  3,  5,  8,  11, 14, 10, 19, 20, 22, 23, 24, 23, 22, 18, 20,
+    21, 24, 24, 21, 19, 18, 19, 21, 21, 20, 19, 16, 17, 17, 18, 18, 16, 13, 8,
+    14, 14, 14, 13, 9,  9,  8,  9,  9,  7,  6,  8,  9,  9,  2,  2,  4,  5,  7,
+    8,  8,  18, 20, 20, 21, 23, 23, 22, 17, 18, 20, 21, 22, 21, 19, 17, 18, 19,
+    20, 19, 18, 16, 16, 17, 16, 16, 15, 12, 9,  11, 12, 12, 11, 7,  8,  8,  4,
+    7,  6,  4,  6,  8,  8,  0,  2,  2,  4,  6,  6,  8,  17, 18, 19, 21, 23, 24,
+    23, 16, 18, 20, 20, 21, 21, 20, 14, 18, 19, 19, 19, 18, 17, 10, 17, 16, 16,
+    15, 12, 12, 7,  12, 11, 11, 6,  7,  8,  5,  5,  5,  3,  4,  5,  6,  0,  3,
+    3,  3,  4,  5,  6,  15, 17, 19, 20, 22, 23, 23, 12, 16, 18, 19, 20, 20, 21,
+    12, 16, 17, 17, 17, 17, 15, 12, 13, 13, 13, 12, 10, 7,  10, 9,  8,  8,  7,
+    6,  6,  6,  7,  7,  6,  7,  7,  5,  4,  6,  8,  7,  7,  8,  6,  13, 14, 15,
+    16, 19, 22, 23, 13, 14, 14, 16, 17, 18, 19, 13, 15, 15, 14, 14, 15, 14, 13,
+    13, 13, 13, 12, 9,  6,  11, 12, 13, 12, 9,  8,  6,  8,  10, 13, 13, 10, 8,
+    7,  7,  10, 13, 14, 11, 8,  7,  16, 19, 18, 16, 17, 20, 21, 16, 18, 19, 17,
+    16, 17, 18, 16, 18, 20, 16, 14, 13, 13, 16, 17, 20, 15, 12, 10, 7,  14, 16,
+    18, 16, 11, 8,  7,  12, 15, 17, 17, 12, 10, 8,  11, 15, 18, 18, 14, 10, 8,
+    27, 30, 31, 32, 32, 31, 30, 26, 29, 31, 32, 32, 29, 27, 25, 28, 29, 30, 29,
+    26, 23, 24, 26, 27, 27, 25, 21, 15, 21, 24, 23, 21, 18, 16, 15, 17, 19, 16,
+    15, 17, 17, 15, 11, 11, 13, 15, 16, 16, 15, 25, 28, 30, 31, 30, 30, 29, 24,
+    27, 30, 31, 30, 29, 26, 22, 26, 29, 28, 27, 25, 22, 22, 24, 25, 25, 23, 20,
+    14, 18, 20, 22, 20, 15, 15, 14, 13, 16, 15, 14, 14, 14, 14, 7,  9,  12, 13,
+    13, 14, 14, 23, 26, 27, 29, 30, 29, 26, 21, 25, 27, 29, 29, 27, 23, 20, 24,
+    26, 26, 25, 24, 20, 18, 21, 22, 22, 21, 18, 14, 13, 17, 18, 17, 14, 14, 13,
+    6,  13, 12, 10, 12, 12, 13, 3,  7,  8,  10, 11, 11, 13, 20, 21, 22, 24, 25,
+    26, 25, 18, 20, 22, 23, 23, 22, 21, 15, 20, 20, 21, 20, 19, 18, 11, 19, 17,
+    17, 16, 12, 13, 9,  14, 13, 11, 7,  8,  9,  6,  7,  6,  4,  6,  7,  7,  3,
+    0,  3,  4,  5,  6,  8,  16, 19, 20, 21, 22, 24, 24, 12, 18, 20, 21, 21, 21,
+    21, 12, 18, 18, 18, 18, 17, 16, 12, 14, 15, 14, 13, 10, 8,  10, 8,  9,  8,
+    5,  4,  7,  6,  5,  5,  5,  5,  4,  6,  3,  3,  5,  5,  6,  5,  5,  13, 14,
+    16, 17, 20, 22, 24, 13, 13, 14, 16, 18, 19, 20, 13, 13, 13, 14, 15, 16, 14,
+    13, 12, 12, 12, 10, 9,  6,  10, 10, 11, 9,  7,  5,  5,  7,  8,  10, 9,  7,
+    6,  4,  5,  7,  10, 10, 8,  7,  4,  14, 17, 16, 15, 18, 21, 22, 14, 16, 17,
+    15, 16, 18, 18, 14, 17, 18, 14, 13, 13, 13, 14, 15, 17, 13, 11, 8,  4,  12,
+    13, 15, 12, 8,  6,  5,  10, 12, 14, 13, 9,  7,  5,  8,  11, 14, 14, 10, 8,
+    6,  25, 28, 31, 33, 33, 32, 29, 23, 27, 30, 32, 33, 30, 26, 21, 26, 29, 30,
+    30, 27, 23, 21, 23, 26, 27, 28, 22, 17, 17, 20, 22, 23, 21, 19, 16, 13, 16,
+    17, 17, 20, 19, 17, 8,  11, 14, 17, 19, 19, 16, 22, 25, 29, 31, 31, 29, 27,
+    20, 25, 28, 30, 29, 28, 24, 19, 23, 26, 28, 27, 25, 21, 18, 21, 24, 25, 23,
+    20, 15, 15, 17, 19, 20, 17, 16, 15, 11, 13, 15, 15, 15, 16, 15, 5,  9,  12,
+    14, 15, 15, 15, 20, 23, 26, 27, 28, 26, 22, 18, 22, 24, 25, 26, 24, 20, 17,
+    21, 23, 22, 22, 22, 17, 15, 18, 19, 19, 19, 17, 11, 9,  14, 15, 15, 12, 12,
+    12, 3,  10, 11, 10, 10, 11, 11, 3,  6,  8,  8,  9,  9,  10, 17, 18, 18, 19,
+    21, 22, 19, 14, 16, 17, 18, 19, 19, 16, 11, 15, 16, 16, 15, 15, 13, 8,  13,
+    12, 12, 11, 10, 10, 6,  9,  8,  8,  5,  5,  6,  3,  3,  3,  2,  3,  4,  4,
+    3,  3,  0,  2,  3,  4,  5,  12, 14, 15, 16, 17, 18, 19, 8,  13, 14, 15, 16,
+    16, 16, 8,  12, 13, 13, 13, 13, 11, 8,  10, 10, 10, 9,  7,  4,  6,  6,  5,
+    5,  6,  4,  4,  4,  6,  8,  8,  8,  6,  3,  2,  7,  10, 10, 10, 8,  3,  9,
+    11, 11, 13, 15, 17, 18, 9,  12, 12, 13, 13, 15, 16, 9,  14, 14, 14, 11, 11,
+    10, 9,  13, 15, 15, 11, 7,  3,  7,  12, 17, 17, 13, 8,  3,  7,  13, 19, 19,
+    15, 10, 5,  8,  14, 20, 20, 17, 12, 6,  16, 22, 22, 16, 13, 16, 17, 16, 23,
+    24, 18, 12, 13, 14, 17, 23, 26, 19, 13, 9,  10, 17, 22, 26, 20, 14, 9,  5,
+    15, 21, 25, 23, 17, 12, 6,  15, 21, 25, 23, 18, 14, 8,  16, 21, 24, 24, 20,
+    15, 10, 23, 26, 30, 33, 32, 30, 27, 21, 25, 29, 32, 32, 29, 26, 19, 24, 27,
+    31, 31, 27, 22, 18, 21, 24, 27, 28, 24, 18, 15, 18, 20, 23, 23, 21, 18, 11,
+    14, 17, 18, 22, 21, 18, 8,  11, 14, 17, 20, 21, 18, 19, 23, 27, 31, 29, 27,
+    25, 18, 22, 26, 30, 29, 25, 22, 17, 20, 25, 26, 26, 24, 19, 16, 19, 22, 24,
+    23, 20, 15, 13, 15, 18, 19, 18, 17, 14, 9,  11, 14, 16, 16, 16, 14, 5,  8,
+    12, 15, 15, 15, 14, 17, 21, 23, 24, 26, 23, 20, 16, 19, 22, 23, 23, 21, 18,
+    15, 18, 20, 20, 20, 20, 15, 13, 16, 16, 17, 17, 15, 10, 8,  12, 13, 13, 12,
+    11, 10, 3,  8,  9,  9,  9,  10, 10, 3,  6,  7,  8,  8,  9,  8,  15, 15, 16,
+    17, 19, 19, 15, 13, 14, 15, 16, 17, 17, 13, 10, 12, 13, 13, 13, 13, 10, 6,
+    10, 9,  9,  9,  8,  8,  4,  6,  6,  6,  4,  3,  4,  2,  2,  2,  2,  2,  3,
+    3,  3,  4,  2,  0,  2,  2,  3,  9,  10, 11, 12, 13, 15, 15, 6,  10, 11, 12,
+    13, 13, 13, 6,  9,  9,  9,  10, 9,  9,  6,  7,  6,  6,  6,  5,  3,  4,  6,
+    6,  6,  6,  4,  3,  2,  7,  9,  8,  8,  6,  2,  4,  8,  11, 10, 9,  8,  3,
+    9,  11, 11, 12, 12, 14, 15, 9,  13, 13, 13, 11, 11, 11, 9,  15, 15, 14, 10,
+    8,  8,  9,  14, 15, 15, 11, 6,  2,  8,  13, 18, 16, 12, 8,  3,  8,  14, 20,
+    19, 14, 9,  5,  9,  14, 20, 21, 16, 11, 6,  17, 23, 22, 17, 11, 12, 13, 17,
+    23, 24, 18, 12, 10, 10, 17, 23, 27, 19, 13, 8,  7,  17, 22, 27, 20, 15, 9,
+    5,  16, 21, 27, 22, 16, 11, 6,  16, 22, 27, 25, 18, 13, 8,  16, 22, 27, 27,
+    21, 15, 9,  20, 25, 28, 32, 32, 30, 27, 20, 23, 27, 31, 32, 27, 24, 17, 22,
+    25, 29, 30, 26, 22, 17, 19, 22, 25, 28, 24, 18, 14, 16, 19, 21, 24, 22, 18,
+    10, 12, 15, 18, 22, 21, 18, 8,  10, 14, 17, 20, 21, 18, 18, 22, 26, 29, 29,
+    25, 22, 17, 20, 23, 27, 28, 24, 20, 15, 19, 23, 25, 25, 22, 19, 14, 17, 20,
+    22, 22, 20, 14, 11, 14, 15, 18, 18, 17, 14, 7,  10, 13, 15, 16, 17, 14, 5,
+    8,  12, 14, 15, 15, 14, 16, 19, 20, 22, 24, 22, 18, 14, 17, 20, 21, 22, 20,
+    15, 13, 17, 18, 18, 19, 17, 13, 12, 15, 15, 14, 15, 14, 10, 8,  11, 11, 11,
+    11, 10, 9,  3,  8,  9,  9,  9,  9,  9,  4,  6,  7,  7,  8,  8,  8,  13, 14,
+    14, 15, 17, 18, 13, 12, 12, 13, 14, 14, 14, 11, 9,  11, 11, 11, 11, 11, 8,
+    5,  9,  8,  7,  7,  7,  6,  3,  4,  4,  4,  3,  3,  3,  3,  2,  2,  2,  2,
+    2,  2,  4,  5,  3,  2,  0,  1,  2,  7,  7,  8,  9,  11, 12, 12, 5,  7,  8,
+    9,  9,  10, 10, 5,  6,  7,  7,  7,  7,  7,  5,  6,  5,  5,  5,  4,  2,  3,
+    7,  6,  6,  6,  4,  2,  3,  8,  9,  8,  8,  6,  2,  4,  8,  11, 10, 10, 7,
+    3,  10, 12, 12, 11, 9,  11, 12, 10, 14, 13, 13, 10, 8,  9,  10, 16, 15, 14,
+    10, 6,  6,  10, 15, 16, 15, 11, 6,  2,  9,  14, 18, 17, 12, 8,  3,  9,  15,
+    20, 19, 14, 9,  5,  10, 15, 20, 21, 16, 11, 6,  18, 24, 23, 16, 12, 10, 10,
+    18, 23, 24, 18, 13, 8,  8,  18, 24, 26, 19, 13, 8,  5,  18, 23, 28, 21, 15,
+    10, 4,  17, 22, 27, 23, 16, 11, 6,  17, 22, 27, 26, 18, 13, 8,  17, 22, 27,
+    27, 21, 15, 9,  20, 24, 27, 31, 30, 28, 25, 18, 22, 25, 29, 30, 27, 23, 16,
+    20, 24, 27, 28, 25, 21, 15, 18, 21, 24, 27, 23, 18, 12, 15, 17, 21, 24, 21,
+    18, 9,  12, 15, 18, 22, 21, 18, 8,  11, 14, 17, 21, 21, 18, 17, 20, 24, 28,
+    28, 25, 21, 15, 20, 23, 26, 27, 23, 19, 14, 17, 21, 24, 24, 21, 17, 13, 15,
+    19, 20, 20, 19, 14, 10, 12, 15, 17, 17, 17, 14, 7,  10, 13, 15, 16, 16, 14,
+    6,  9,  12, 15, 14, 14, 14, 14, 17, 20, 21, 22, 20, 16, 13, 16, 18, 19, 20,
+    19, 14, 12, 15, 17, 17, 17, 16, 12, 11, 13, 13, 13, 14, 13, 9,  7,  9,  10,
+    10, 10, 10, 9,  4,  8,  9,  9,  9,  9,  9,  5,  7,  7,  7,  8,  8,  8,  12,
+    12, 13, 14, 15, 16, 11, 10, 11, 11, 12, 13, 13, 9,  9,  9,  10, 10, 9,  9,
+    7,  5,  7,  6,  6,  6,  6,  5,  2,  3,  3,  3,  2,  3,  3,  3,  3,  2,  2,
+    1,  1,  2,  5,  6,  4,  3,  1,  0,  1,  5,  5,  6,  8,  8,  10, 11, 4,  5,
+    6,  7,  8,  8,  9,  4,  5,  5,  5,  5,  5,  5,  4,  6,  5,  5,  5,  3,  2,
+    3,  8,  7,  6,  6,  4,  1,  4,  9,  10, 8,  8,  6,  2,  5,  9,  12, 10, 10,
+    8,  3,  10, 12, 11, 11, 9,  9,  10, 10, 14, 13, 12, 10, 7,  7,  10, 16, 14,
+    13, 10, 5,  4,  10, 15, 15, 14, 10, 6,  2,  10, 14, 17, 15, 12, 8,  3,  10,
+    15, 19, 17, 13, 9,  5,  10, 15, 20, 19, 15, 11, 6,  17, 21, 19, 15, 11, 8,
+    8,  17, 21, 20, 16, 12, 8,  6,  18, 21, 22, 16, 12, 8,  4,  17, 20, 22, 17,
+    13, 9,  5,  17, 20, 23, 20, 15, 11, 6,  16, 20, 23, 21, 16, 13, 8,  16, 20,
+    23, 23, 18, 13, 9,  19, 23, 26, 29, 30, 28, 24, 17, 21, 24, 29, 29, 26, 22,
+    16, 20, 23, 27, 27, 24, 20, 14, 17, 20, 24, 26, 22, 18, 11, 14, 16, 20, 23,
+    21, 18, 10, 13, 15, 19, 22, 21, 18, 8,  11, 15, 18, 21, 21, 18, 16, 20, 23,
+    27, 26, 23, 20, 14, 19, 22, 26, 25, 22, 18, 13, 17, 20, 23, 23, 20, 16, 12,
+    15, 17, 21, 20, 18, 14, 9,  12, 14, 17, 17, 17, 14, 8,  11, 13, 16, 16, 16,
+    14, 6,  9,  12, 15, 15, 15, 14, 13, 17, 19, 20, 21, 19, 15, 12, 16, 18, 19,
+    19, 18, 13, 11, 14, 16, 16, 16, 16, 11, 10, 12, 13, 12, 13, 13, 9,  6,  9,
+    10, 10, 10, 10, 9,  5,  8,  9,  9,  9,  9,  9,  6,  7,  8,  8,  8,  8,  8,
+    11, 11, 12, 13, 14, 15, 9,  9,  9,  10, 11, 12, 11, 7,  8,  8,  9,  9,  8,
+    8,  6,  4,  6,  5,  5,  5,  5,  4,  3,  3,  3,  3,  3,  3,  2,  4,  4,  3,
+    2,  2,  2,  2,  6,  8,  5,  3,  2,  1,  0,  2,  3,  5,  6,  7,  8,  9,  2,
+    3,  4,  5,  6,  6,  7,  2,  3,  3,  3,  3,  4,  4,  2,  5,  3,  2,  2,  2,
+    1,  3,  7,  5,  4,  4,  3,  0,  5,  8,  7,  5,  3,  3,  2,  7,  8,  8,  6,
+    5,  3,  2,  6,  6,  5,  5,  6,  7,  9,  6,  8,  5,  5,  5,  5,  6,  6,  8,
+    6,  5,  3,  3,  3,  6,  7,  7,  5,  4,  3,  1,  7,  9,  10, 8,  6,  3,  2,
+    8,  10, 13, 11, 7,  4,  3,  9,  11, 14, 14, 9,  5,  3,  8,  11, 10, 6,  5,
+    7,  7,  8,  11, 11, 7,  4,  4,  4,  8,  11, 13, 7,  4,  3,  2,  8,  11, 14,
+    9,  6,  4,  3,  9,  11, 15, 13, 8,  5,  3,  9,  13, 18, 16, 11, 6,  3,  11,
+    15, 18, 17, 12, 7,  4,  14, 17, 20, 24, 23, 22, 19, 13, 16, 19, 23, 23, 21,
+    17, 12, 14, 17, 20, 21, 18, 16, 11, 13, 15, 17, 20, 18, 15, 11, 13, 14, 15,
+    19, 17, 15, 9,  11, 13, 15, 17, 17, 15, 12, 12, 12, 14, 16, 17, 15, 12, 15,
+    17, 20, 21, 19, 16, 11, 13, 16, 19, 21, 18, 14, 11, 13, 15, 17, 18, 16, 13,
+    9,  12, 14, 15, 15, 14, 13, 9,  11, 13, 14, 14, 14, 13, 7,  10, 11, 13, 13,
+    13, 13, 14, 14, 11, 12, 12, 12, 12, 10, 13, 14, 15, 16, 15, 12, 9,  12, 13,
+    13, 15, 14, 11, 8,  11, 12, 12, 12, 13, 11, 7,  10, 11, 11, 12, 11, 11, 6,
+    9,  11, 11, 11, 11, 11, 9,  10, 10, 9,  10, 11, 11, 15, 16, 12, 9,  9,  10,
+    11, 8,  8,  9,  10, 10, 11, 4,  7,  7,  8,  8,  8,  9,  5,  6,  6,  6,  7,
+    7,  7,  4,  4,  5,  5,  6,  6,  6,  4,  4,  4,  4,  5,  5,  5,  4,  9,  11,
+    10, 8,  6,  3,  3,  15, 16, 12, 9,  7,  4,  2,  0,  1,  1,  2,  2,  2,  4,
+    2,  2,  2,  2,  2,  1,  5,  2,  3,  3,  3,  4,  2,  4,  2,  6,  5,  6,  6,
+    5,  2,  4,  9,  8,  7,  7,  7,  3,  9,  11, 11, 9,  9,  8,  4,  14, 14, 13,
+    10, 9,  8,  6,  8,  8,  8,  8,  7,  2,  3,  8,  10, 9,  9,  7,  3,  2,  7,
+    11, 10, 9,  8,  5,  0,  8,  10, 11, 10, 8,  7,  4,  8,  11, 14, 13, 11, 8,
+    6,  10, 13, 17, 15, 12, 9,  7,  12, 15, 17, 16, 13, 10, 8,  12, 16, 14, 11,
+    8,  6,  2,  12, 16, 16, 12, 9,  6,  2,  12, 16, 18, 12, 9,  7,  4,  12, 15,
+    19, 14, 11, 8,  7,  12, 16, 19, 17, 13, 10, 7,  13, 17, 20, 19, 15, 11, 8,
+    15, 18, 20, 21, 16, 12, 9,  15, 17, 19, 20, 21, 18, 17, 14, 16, 18, 20, 20,
+    19, 17, 12, 15, 18, 19, 20, 18, 17, 11, 14, 17, 18, 20, 19, 17, 11, 14, 17,
+    19, 21, 19, 17, 10, 14, 16, 18, 20, 19, 17, 13, 13, 15, 18, 20, 19, 17, 13,
+    15, 18, 19, 18, 16, 14, 12, 15, 17, 19, 18, 16, 14, 11, 14, 16, 17, 17, 16,
+    14, 9,  13, 16, 17, 17, 17, 15, 9,  12, 15, 17, 17, 17, 15, 8,  11, 14, 16,
+    16, 16, 15, 16, 14, 13, 15, 15, 15, 15, 10, 14, 14, 15, 15, 13, 10, 9,  12,
+    14, 14, 14, 13, 10, 8,  11, 12, 13, 13, 13, 10, 7,  11, 12, 12, 13, 13, 11,
+    7,  10, 11, 12, 12, 12, 11, 10, 11, 10, 11, 11, 11, 11, 17, 17, 12, 10, 10,
+    10, 10, 8,  8,  8,  9,  9,  9,  3,  7,  7,  7,  7,  8,  8,  3,  6,  6,  6,
+    6,  6,  6,  4,  4,  5,  5,  6,  6,  6,  4,  6,  6,  5,  5,  5,  5,  4,  10,
+    12, 10, 9,  6,  5,  3,  17, 19, 14, 10, 7,  5,  3,  1,  0,  1,  1,  2,  2,
+    3,  2,  2,  1,  2,  2,  1,  3,  2,  3,  3,  3,  3,  1,  3,  2,  7,  6,  6,
+    6,  5,  3,  5,  11, 10, 10, 11, 8,  3,  10, 14, 16, 15, 13, 10, 5,  16, 19,
+    20, 16, 15, 12, 7,  9,  10, 10, 10, 7,  2,  2,  8,  12, 12, 11, 8,  3,  2,
+    8,  14, 14, 14, 9,  5,  1,  8,  15, 17, 17, 13, 9,  5,  11, 17, 22, 21, 17,
+    12, 7,  14, 20, 26, 25, 20, 15, 9,  18, 23, 27, 25, 21, 17, 11, 17, 22, 21,
+    15, 10, 5,  1,  16, 22, 24, 17, 12, 6,  2,  16, 22, 25, 18, 13, 9,  4,  16,
+    22, 27, 22, 17, 13, 9,  18, 24, 29, 26, 21, 17, 11, 20, 26, 30, 29, 23, 18,
+    13, 23, 28, 30, 30, 25, 21, 15, 14, 17, 20, 22, 23, 20, 18, 13, 16, 19, 22,
+    23, 20, 18, 12, 15, 18, 21, 23, 20, 18, 11, 14, 17, 21, 23, 22, 19, 12, 14,
+    18, 20, 24, 23, 19, 11, 14, 17, 20, 23, 22, 19, 14, 14, 16, 19, 22, 21, 19,
+    12, 15, 18, 21, 19, 17, 14, 11, 14, 18, 19, 19, 16, 14, 10, 13, 16, 19, 18,
+    17, 15, 9,  13, 16, 18, 18, 18, 16, 10, 13, 15, 18, 18, 18, 15, 10, 11, 15,
+    17, 18, 18, 16, 17, 16, 14, 16, 17, 16, 16, 10, 13, 15, 15, 15, 13, 9,  9,
+    12, 13, 13, 14, 12, 9,  8,  11, 12, 12, 12, 13, 10, 8,  11, 12, 12, 12, 13,
+    11, 7,  10, 12, 12, 12, 12, 11, 12, 12, 11, 11, 11, 11, 11, 19, 18, 14, 10,
+    10, 10, 10, 8,  8,  8,  8,  8,  8,  2,  7,  7,  7,  7,  7,  7,  2,  6,  6,
+    6,  6,  6,  6,  3,  4,  6,  6,  6,  6,  6,  4,  6,  7,  6,  6,  6,  5,  4,
+    12, 13, 12, 10, 8,  6,  4,  19, 20, 15, 11, 8,  6,  5,  1,  1,  0,  1,  1,
+    1,  2,  2,  2,  2,  1,  2,  1,  2,  2,  4,  3,  4,  4,  2,  3,  2,  7,  7,
+    7,  7,  6,  4,  6,  12, 12, 11, 11, 9,  5,  11, 15, 17, 16, 14, 11, 6,  18,
+    21, 20, 17, 16, 13, 7,  9,  11, 9,  9,  6,  2,  2,  9,  13, 11, 11, 7,  3,
+    1,  9,  14, 14, 14, 10, 6,  2,  9,  16, 18, 17, 14, 10, 6,  12, 18, 23, 21,
+    18, 13, 7,  15, 21, 28, 26, 20, 15, 9,  19, 25, 29, 27, 23, 17, 11, 16, 22,
+    21, 15, 9,  5,  1,  17, 22, 23, 16, 11, 6,  2,  16, 22, 26, 19, 13, 9,  5,
+    16, 23, 29, 23, 18, 14, 10, 18, 25, 31, 28, 22, 17, 11, 22, 28, 33, 33, 26,
+    19, 13, 25, 30, 34, 34, 28, 21, 15, 14, 17, 21, 23, 24, 20, 18, 14, 16, 19,
+    23, 24, 21, 18, 12, 15, 18, 22, 23, 22, 19, 11, 15, 18, 22, 25, 23, 20, 12,
+    15, 18, 22, 26, 23, 20, 11, 14, 17, 21, 25, 23, 20, 16, 15, 17, 20, 23, 22,
+    19, 12, 15, 18, 20, 20, 17, 14, 12, 14, 17, 20, 19, 17, 14, 10, 13, 17, 19,
+    19, 18, 15, 9,  13, 17, 20, 19, 18, 16, 10, 13, 16, 18, 19, 19, 16, 11, 12,
+    15, 18, 18, 18, 16, 18, 17, 15, 17, 17, 17, 16, 10, 13, 14, 15, 15, 12, 9,
+    9,  12, 13, 13, 14, 12, 9,  9,  11, 13, 13, 13, 13, 10, 8,  11, 13, 13, 13,
+    14, 11, 7,  10, 12, 12, 12, 12, 11, 13, 13, 13, 12, 12, 11, 11, 20, 19, 15,
+    12, 10, 11, 10, 9,  8,  8,  8,  8,  8,  2,  8,  7,  7,  7,  7,  6,  2,  6,
+    6,  6,  7,  6,  6,  3,  4,  6,  6,  6,  6,  6,  5,  6,  8,  8,  8,  8,  6,
+    5,  13, 15, 13, 11, 9,  7,  5,  21, 21, 16, 12, 9,  7,  6,  2,  1,  1,  0,
+    1,  1,  2,  3,  2,  2,  2,  2,  0,  2,  2,  4,  4,  4,  4,  3,  3,  2,  8,
+    8,  8,  8,  7,  5,  7,  13, 12, 12, 13, 10, 6,  13, 17, 18, 17, 14, 12, 7,
+    19, 22, 22, 19, 17, 14, 8,  9,  11, 9,  9,  6,  2,  2,  10, 12, 11, 11, 7,
+    3,  2,  10, 15, 14, 14, 11, 6,  3,  9,  17, 18, 18, 15, 10, 7,  13, 19, 24,
+    22, 18, 13, 8,  16, 22, 29, 27, 21, 16, 10, 21, 26, 30, 30, 25, 17, 12, 17,
+    22, 20, 14, 9,  5,  1,  17, 22, 23, 16, 11, 6,  3,  17, 22, 25, 19, 14, 10,
+    6,  17, 24, 29, 24, 18, 14, 10, 20, 26, 31, 29, 23, 18, 12, 23, 30, 35, 33,
+    26, 19, 14, 25, 32, 35, 36, 28, 22, 16, 15, 18, 21, 24, 24, 21, 18, 14, 17,
+    19, 23, 24, 22, 19, 12, 15, 19, 23, 25, 23, 20, 11, 16, 19, 22, 26, 24, 20,
+    12, 16, 19, 23, 26, 24, 21, 12, 15, 18, 22, 26, 24, 21, 17, 17, 18, 20, 24,
+    24, 21, 12, 16, 19, 22, 20, 17, 14, 12, 15, 18, 20, 20, 17, 15, 10, 14, 17,
+    20, 20, 19, 16, 10, 14, 17, 20, 20, 19, 16, 10, 14, 17, 19, 20, 20, 17, 12,
+    14, 16, 19, 19, 19, 17, 20, 18, 16, 18, 18, 18, 17, 10, 14, 15, 14, 15, 13,
+    9,  10, 12, 13, 14, 14, 13, 10, 9,  12, 13, 14, 14, 14, 11, 9,  12, 14, 14,
+    14, 14, 12, 8,  11, 13, 13, 13, 13, 12, 14, 14, 14, 13, 13, 12, 12, 22, 20,
+    16, 12, 11, 11, 10, 9,  8,  8,  8,  8,  8,  2,  9,  7,  7,  7,  7,  7,  3,
+    6,  6,  6,  7,  7,  7,  4,  6,  6,  7,  7,  7,  7,  6,  7,  8,  9,  9,  9,
+    8,  6,  14, 16, 14, 12, 10, 8,  6,  22, 22, 17, 13, 10, 8,  7,  2,  2,  1,
+    1,  0,  1,  2,  3,  2,  2,  2,  2,  1,  3,  3,  4,  4,  5,  5,  4,  3,  3,
+    8,  8,  9,  9,  7,  6,  7,  14, 13, 13, 13, 11, 7,  14, 18, 19, 18, 15, 12,
+    8,  20, 23, 23, 19, 18, 14, 9,  10, 10, 9,  8,  5,  2,  2,  10, 12, 10, 9,
+    7,  4,  2,  10, 13, 12, 13, 10, 7,  4,  10, 15, 17, 16, 15, 11, 7,  13, 19,
+    23, 21, 18, 14, 9,  17, 23, 28, 26, 20, 16, 11, 21, 27, 29, 28, 23, 18, 13,
+    15, 17, 14, 10, 8,  4,  1,  15, 17, 15, 11, 9,  7,  3,  15, 17, 18, 15, 13,
+    11, 7,  15, 19, 23, 20, 17, 15, 11, 18, 23, 27, 25, 22, 18, 13, 23, 27, 31,
+    30, 24, 19, 15, 27, 30, 32, 32, 26, 21, 17, 13, 16, 20, 23, 23, 20, 17, 13,
+    16, 18, 22, 23, 21, 19, 12, 14, 18, 22, 25, 22, 19, 11, 15, 19, 22, 26, 23,
+    20, 12, 15, 18, 21, 25, 23, 20, 12, 15, 18, 21, 25, 23, 20, 18, 18, 17, 20,
+    23, 23, 20, 12, 15, 17, 20, 18, 15, 13, 11, 14, 17, 19, 19, 17, 14, 10, 13,
+    16, 19, 20, 17, 15, 9,  12, 16, 20, 19, 18, 16, 9,  13, 16, 19, 20, 19, 16,
+    13, 14, 16, 18, 18, 18, 15, 21, 19, 17, 17, 17, 17, 16, 10, 13, 13, 13, 14,
+    11, 8,  9,  12, 12, 12, 13, 12, 9,  8,  11, 12, 13, 13, 13, 10, 7,  11, 12,
+    13, 13, 13, 11, 7,  11, 12, 13, 13, 13, 11, 15, 16, 15, 13, 12, 12, 11, 23,
+    22, 17, 14, 11, 10, 10, 8,  7,  7,  7,  7,  7,  2,  7,  6,  6,  6,  6,  6,
+    2,  4,  5,  5,  6,  6,  6,  4,  8,  5,  6,  6,  6,  7,  6,  8,  9,  10, 10,
+    10, 9,  7,  15, 17, 16, 14, 11, 9,  8,  23, 24, 18, 15, 12, 10, 8,  2,  2,
+    2,  1,  1,  0,  2,  4,  2,  2,  2,  2,  2,  2,  4,  3,  3,  4,  5,  5,  4,
+    4,  7,  7,  8,  8,  8,  8,  8,  13, 13, 13, 13, 11, 8,  15, 19, 19, 17, 14,
+    12, 9,  22, 24, 22, 18, 15, 13, 10, 6,  6,  4,  3,  3,  2,  1,  6,  7,  5,
+    4,  3,  3,  2,  6,  9,  6,  7,  6,  6,  6,  6,  11, 12, 12, 11, 10, 9,  11,
+    15, 19, 17, 15, 13, 10, 17, 21, 25, 22, 17, 13, 11, 22, 25, 26, 24, 19, 15,
+    12, 10, 12, 8,  5,  3,  2,  2,  10, 12, 10, 6,  4,  4,  4,  10, 12, 13, 9,
+    9,  8,  7,  10, 14, 18, 16, 13, 12, 10, 14, 18, 23, 22, 18, 15, 12, 19, 23,
+    27, 27, 21, 16, 13, 24, 27, 28, 29, 23, 18, 13, 9,  11, 13, 15, 16, 13, 11,
+    9,  11, 12, 15, 16, 14, 12, 8,  10, 12, 16, 18, 15, 13, 7,  10, 13, 16, 19,
+    17, 15, 8,  11, 14, 17, 20, 17, 14, 11, 13, 15, 16, 19, 17, 14, 18, 18, 16,
+    16, 18, 17, 15, 8,  10, 11, 14, 11, 9,  7,  7,  9,  11, 13, 12, 10, 8,  7,
+    8,  11, 14, 13, 11, 10, 6,  9,  12, 14, 13, 12, 11, 6,  10, 12, 14, 14, 13,
+    11, 13, 14, 15, 16, 14, 13, 11, 21, 19, 17, 15, 13, 12, 11, 7,  9,  8,  7,
+    7,  5,  3,  6,  8,  8,  7,  7,  7,  5,  5,  7,  7,  8,  8,  8,  6,  3,  7,
+    8,  9,  9,  9,  8,  7,  10, 10, 10, 10, 9,  8,  16, 16, 15, 13, 11, 9,  8,
+    23, 22, 18, 14, 12, 10, 8,  5,  4,  3,  3,  3,  2,  0,  3,  2,  3,  2,  2,
+    3,  2,  6,  2,  2,  3,  3,  3,  4,  10, 3,  5,  6,  6,  6,  6,  9,  10, 10,
+    10, 10, 9,  7,  16, 18, 16, 14, 12, 10, 8,  23, 24, 19, 15, 12, 11, 9,  4,
+    3,  2,  2,  2,  2,  0,  6,  4,  3,  2,  2,  3,  2,  6,  4,  4,  5,  5,  5,
+    5,  6,  8,  8,  9,  10, 9,  8,  9,  15, 15, 15, 15, 12, 9,  15, 21, 21, 19,
+    16, 14, 10, 22, 25, 25, 21, 18, 15, 11, 8,  7,  5,  5,  3,  2,  1,  8,  10,
+    7,  6,  4,  4,  3,  8,  11, 10, 11, 9,  7,  6,  8,  13, 16, 16, 15, 12, 10,
+    12, 19, 23, 22, 19, 16, 11, 18, 24, 30, 27, 22, 16, 13, 23, 28, 31, 30, 24,
+    18, 14, 12, 16, 14, 8,  5,  3,  2,  13, 16, 16, 10, 6,  5,  4,  12, 16, 19,
+    15, 12, 10, 8,  13, 18, 25, 21, 18, 15, 12, 17, 23, 29, 28, 23, 19, 14, 22,
+    27, 33, 33, 26, 20, 16, 27, 32, 34, 34, 28, 23, 17, 16, 19, 23, 26, 26, 25,
+    22, 15, 19, 22, 25, 26, 23, 21, 14, 17, 20, 23, 24, 22, 19, 13, 15, 17, 20,
+    22, 20, 18, 12, 14, 16, 18, 21, 19, 18, 10, 12, 15, 17, 20, 20, 18, 10, 11,
+    13, 16, 19, 20, 18, 14, 17, 20, 24, 24, 23, 18, 13, 16, 19, 22, 24, 22, 17,
+    12, 14, 18, 20, 20, 18, 15, 11, 13, 15, 17, 18, 16, 14, 10, 12, 14, 15, 16,
+    17, 14, 8,  11, 13, 14, 15, 15, 15, 11, 11, 12, 13, 14, 15, 14, 12, 14, 16,
+    17, 19, 19, 14, 11, 13, 15, 16, 16, 17, 13, 10, 12, 14, 14, 15, 15, 12, 9,
+    12, 12, 12, 12, 13, 12, 7,  10, 12, 12, 11, 12, 12, 8,  9,  10, 10, 11, 11,
+    12, 12, 12, 10, 9,  10, 11, 12, 10, 10, 11, 11, 12, 14, 6,  8,  9,  9,  10,
+    10, 11, 6,  7,  7,  8,  8,  9,  9,  5,  4,  6,  7,  7,  7,  7,  6,  5,  5,
+    5,  6,  6,  7,  4,  8,  8,  7,  6,  5,  5,  4,  12, 12, 8,  6,  5,  4,  2,
+    2,  2,  2,  2,  3,  4,  6,  0,  1,  1,  2,  1,  2,  5,  0,  2,  2,  1,  1,
+    1,  4,  0,  2,  2,  1,  1,  1,  4,  2,  4,  3,  3,  4,  2,  2,  5,  7,  7,
+    6,  5,  3,  2,  9,  10, 9,  7,  6,  4,  2,  4,  5,  5,  5,  3,  2,  4,  4,
+    6,  6,  6,  3,  1,  3,  4,  7,  7,  6,  4,  1,  2,  4,  7,  8,  7,  5,  3,
+    2,  4,  8,  10, 9,  7,  4,  2,  6,  10, 14, 11, 9,  6,  2,  9,  12, 14, 13,
+    10, 6,  3,  9,  12, 11, 8,  5,  2,  2,  9,  12, 12, 8,  5,  2,  1,  9,  12,
+    14, 9,  6,  3,  1,  9,  12, 15, 10, 7,  5,  2,  9,  12, 15, 13, 10, 7,  4,
+    10, 13, 17, 16, 11, 8,  5,  12, 15, 16, 17, 13, 9,  6,  16, 19, 20, 22, 22,
+    20, 18, 15, 18, 20, 21, 22, 20, 17, 14, 16, 18, 21, 22, 19, 18, 13, 15, 19,
+    20, 22, 20, 18, 13, 16, 18, 20, 22, 21, 19, 11, 15, 18, 19, 21, 20, 18, 12,
+    13, 17, 19, 20, 20, 18, 14, 17, 19, 21, 19, 18, 16, 13, 16, 18, 20, 19, 18,
+    16, 12, 15, 17, 19, 18, 17, 16, 11, 14, 17, 18, 17, 18, 16, 11, 14, 17, 19,
+    18, 18, 17, 9,  12, 15, 17, 18, 18, 16, 15, 14, 14, 16, 16, 17, 16, 12, 15,
+    16, 16, 16, 15, 12, 11, 14, 15, 15, 15, 15, 12, 10, 13, 14, 14, 15, 15, 12,
+    9,  12, 14, 13, 14, 14, 12, 8,  11, 13, 13, 13, 13, 12, 10, 10, 11, 12, 13,
+    13, 12, 17, 16, 12, 10, 11, 11, 12, 10, 9,  10, 10, 10, 11, 4,  9,  8,  9,
+    9,  9,  9,  4,  7,  7,  7,  8,  8,  8,  5,  5,  7,  7,  7,  7,  7,  6,  6,
+    6,  6,  6,  6,  6,  5,  10, 11, 10, 9,  6,  5,  4,  17, 18, 13, 10, 7,  5,
+    3,  2,  2,  2,  2,  2,  2,  4,  1,  0,  1,  1,  1,  2,  4,  1,  2,  2,  2,
+    1,  0,  4,  1,  5,  5,  5,  5,  4,  3,  4,  9,  9,  9,  9,  7,  3,  9,  13,
+    15, 14, 12, 9,  4,  16, 18, 18, 15, 14, 11, 5,  7,  9,  8,  9,  5,  1,  3,
+    7,  11, 10, 10, 7,  2,  3,  7,  13, 13, 12, 8,  3,  2,  7,  13, 15, 15, 12,
+    7,  4,  9,  16, 19, 18, 16, 11, 5,  12, 18, 22, 20, 17, 13, 7,  17, 21, 23,
+    22, 18, 15, 9,  15, 20, 18, 14, 9,  4,  2,  15, 19, 20, 15, 11, 5,  1,  15,
+    19, 21, 16, 12, 7,  3,  15, 20, 23, 19, 16, 12, 7,  16, 21, 24, 22, 18, 15,
+    9,  18, 22, 25, 24, 20, 16, 12, 21, 23, 26, 25, 21, 18, 13, 16, 19, 21, 24,
+    24, 22, 19, 15, 18, 20, 23, 25, 21, 19, 13, 17, 20, 23, 24, 21, 20, 13, 16,
+    19, 22, 24, 22, 20, 13, 16, 19, 22, 25, 23, 20, 12, 15, 18, 21, 24, 23, 21,
+    13, 14, 17, 20, 23, 24, 21, 13, 17, 20, 22, 21, 18, 16, 12, 16, 18, 21, 20,
+    18, 15, 12, 14, 17, 20, 20, 18, 16, 10, 14, 17, 21, 19, 19, 17, 11, 14, 17,
+    19, 20, 20, 17, 9,  13, 16, 18, 19, 19, 17, 16, 15, 15, 18, 17, 18, 17, 11,
+    14, 16, 16, 16, 14, 11, 10, 13, 15, 15, 15, 14, 11, 10, 12, 14, 13, 14, 14,
+    11, 9,  12, 14, 14, 14, 14, 12, 8,  11, 13, 13, 13, 13, 12, 11, 11, 12, 12,
+    12, 12, 12, 18, 17, 13, 11, 11, 11, 11, 10, 9,  9,  9,  10, 9,  3,  9,  8,
+    8,  8,  8,  8,  3,  8,  7,  7,  7,  7,  7,  3,  5,  7,  7,  7,  7,  7,  5,
+    6,  6,  6,  6,  6,  6,  4,  11, 13, 11, 9,  7,  5,  4,  18, 20, 14, 10, 8,
+    6,  4,  2,  1,  2,  2,  2,  2,  3,  1,  1,  0,  1,  1,  1,  3,  1,  2,  2,
+    2,  2,  1,  3,  1,  6,  6,  6,  6,  5,  4,  5,  10, 10, 10, 10, 8,  4,  11,
+    14, 16, 14, 12, 9,  5,  17, 19, 19, 16, 14, 12, 6,  7,  9,  8,  8,  5,  1,
+    2,  7,  11, 10, 10, 6,  2,  2,  7,  13, 12, 12, 8,  4,  2,  8,  14, 16, 16,
+    12, 8,  5,  10, 17, 21, 20, 16, 11, 6,  13, 20, 26, 25, 19, 13, 8,  17, 23,
+    26, 27, 22, 16, 9,  15, 20, 19, 13, 8,  4,  1,  16, 21, 22, 15, 10, 5,  0,
+    15, 20, 24, 17, 12, 8,  4,  15, 22, 27, 21, 16, 12, 8,  17, 24, 29, 27, 21,
+    15, 10, 20, 26, 31, 32, 24, 18, 12, 23, 29, 33, 33, 26, 19, 14, 16, 19, 22,
+    25, 25, 22, 20, 15, 18, 21, 25, 25, 22, 19, 13, 16, 20, 23, 26, 22, 21, 13,
+    16, 19, 23, 26, 24, 21, 13, 16, 19, 22, 26, 25, 21, 12, 16, 19, 22, 25, 24,
+    22, 15, 15, 17, 21, 25, 25, 21, 14, 16, 20, 22, 21, 19, 15, 13, 15, 19, 21,
+    21, 19, 15, 12, 14, 17, 20, 21, 19, 17, 11, 15, 18, 21, 21, 20, 17, 12, 14,
+    17, 20, 20, 21, 17, 11, 13, 16, 19, 20, 19, 17, 18, 16, 15, 18, 18, 18, 17,
+    12, 14, 16, 16, 17, 14, 11, 11, 13, 15, 15, 15, 14, 10, 10, 12, 14, 15, 14,
+    15, 11, 9,  13, 14, 14, 15, 15, 12, 9,  12, 13, 14, 14, 14, 12, 12, 13, 12,
+    12, 12, 13, 12, 19, 18, 14, 11, 12, 12, 11, 10, 9,  9,  9,  9,  9,  2,  9,
+    8,  8,  8,  8,  8,  2,  8,  7,  7,  8,  7,  8,  3,  5,  7,  7,  7,  7,  7,
+    6,  7,  7,  7,  7,  7,  7,  4,  13, 14, 13, 11, 8,  6,  5,  19, 21, 16, 12,
+    9,  7,  5,  2,  2,  1,  2,  2,  2,  2,  2,  1,  1,  0,  1,  1,  3,  2,  2,
+    2,  3,  3,  2,  3,  2,  6,  6,  6,  7,  5,  5,  6,  12, 11, 11, 11, 8,  5,
+    12, 16, 17, 15, 13, 10, 6,  18, 21, 20, 17, 15, 12, 7,  8,  9,  8,  8,  5,
+    1,  2,  8,  11, 10, 9,  6,  2,  2,  8,  13, 13, 13, 9,  5,  3,  8,  15, 17,
+    17, 13, 9,  6,  11, 18, 22, 21, 17, 12, 7,  14, 20, 26, 26, 19, 14, 9,  19,
+    24, 28, 28, 22, 16, 10, 15, 21, 19, 13, 8,  3,  1,  15, 20, 21, 15, 9,  5,
+    1,  15, 21, 24, 18, 13, 9,  5,  15, 22, 28, 23, 17, 13, 9,  18, 24, 30, 27,
+    21, 16, 11, 20, 27, 32, 32, 24, 18, 12, 24, 30, 34, 34, 27, 20, 14, 16, 19,
+    23, 26, 26, 23, 20, 15, 18, 21, 25, 26, 23, 20, 14, 17, 20, 23, 25, 24, 22,
+    13, 17, 20, 24, 26, 25, 22, 14, 17, 20, 24, 27, 25, 21, 12, 16, 18, 23, 27,
+    25, 22, 16, 16, 18, 22, 25, 25, 22, 14, 17, 20, 23, 22, 19, 16, 13, 16, 19,
+    22, 22, 18, 16, 12, 15, 18, 21, 20, 20, 17, 11, 15, 18, 22, 21, 20, 17, 12,
+    15, 18, 20, 21, 21, 17, 11, 14, 17, 20, 20, 20, 18, 18, 17, 16, 19, 18, 19,
+    17, 12, 15, 15, 16, 17, 15, 11, 11, 14, 15, 15, 15, 14, 11, 10, 13, 14, 15,
+    15, 15, 12, 10, 13, 15, 15, 15, 15, 12, 9,  13, 14, 14, 14, 14, 12, 13, 14,
+    14, 13, 13, 13, 12, 20, 19, 15, 12, 12, 12, 12, 10, 9,  9,  9,  10, 10, 3,
+    9,  8,  8,  8,  8,  8,  3,  8,  8,  8,  8,  8,  8,  3,  5,  7,  8,  8,  8,
+    8,  6,  7,  8,  8,  8,  8,  7,  4,  13, 15, 13, 11, 9,  7,  5,  20, 21, 16,
+    12, 10, 8,  6,  2,  2,  2,  2,  2,  2,  2,  1,  1,  1,  1,  0,  2,  3,  1,
+    2,  3,  3,  3,  2,  3,  1,  6,  7,  7,  7,  6,  5,  6,  11, 11, 11, 11, 8,
+    6,  12, 17, 18, 16, 13, 10, 7,  19, 21, 21, 17, 16, 12, 7,  8,  9,  8,  7,
+    4,  1,  2,  8,  11, 9,  8,  6,  2,  2,  8,  12, 11, 12, 9,  5,  3,  8,  14,
+    16, 15, 13, 9,  6,  11, 17, 21, 20, 18, 13, 7,  15, 21, 27, 25, 19, 14, 9,
+    20, 24, 28, 26, 21, 16, 11, 14, 16, 14, 10, 7,  3,  1,  13, 16, 15, 11, 9,
+    5,  2,  14, 16, 18, 14, 12, 9,  5,  14, 18, 23, 19, 16, 12, 9,  17, 22, 25,
+    24, 20, 16, 11, 21, 25, 29, 29, 23, 18, 13, 24, 29, 31, 30, 25, 19, 14, 15,
+    18, 21, 26, 25, 22, 18, 14, 17, 20, 24, 25, 22, 19, 13, 16, 19, 23, 24, 23,
+    19, 12, 15, 19, 23, 25, 23, 20, 13, 15, 19, 22, 26, 24, 21, 11, 14, 17, 21,
+    25, 24, 20, 16, 15, 16, 20, 23, 23, 21, 13, 16, 18, 22, 21, 19, 15, 12, 15,
+    17, 21, 21, 17, 14, 11, 14, 17, 20, 19, 18, 15, 10, 13, 17, 20, 20, 19, 16,
+    10, 14, 16, 19, 19, 19, 16, 11, 13, 16, 18, 18, 18, 16, 18, 17, 16, 17, 16,
+    17, 16, 11, 14, 15, 15, 16, 14, 10, 10, 12, 13, 13, 14, 13, 9,  9,  11, 13,
+    14, 13, 13, 10, 8,  12, 13, 13, 13, 13, 11, 7,  11, 12, 12, 12, 13, 11, 14,
+    14, 13, 12, 11, 11, 11, 20, 19, 15, 12, 10, 10, 10, 9,  8,  8,  8,  9,  9,
+    3,  8,  7,  7,  7,  7,  7,  2,  6,  6,  6,  7,  6,  6,  2,  5,  6,  6,  6,
+    6,  6,  5,  7,  8,  8,  8,  8,  7,  5,  14, 16, 13, 11, 9,  7,  5,  21, 22,
+    16, 12, 10, 8,  6,  1,  1,  1,  0,  1,  2,  3,  2,  2,  1,  1,  2,  0,  2,
+    2,  3,  3,  4,  3,  3,  3,  2,  6,  6,  6,  6,  6,  5,  7,  12, 11, 10, 10,
+    8,  6,  13, 16, 17, 14, 11, 9,  7,  19, 21, 20, 15, 13, 10, 7,  6,  6,  4,
+    3,  3,  2,  2,  6,  7,  5,  4,  3,  2,  2,  6,  9,  6,  6,  4,  4,  3,  6,
+    10, 10, 9,  8,  7,  7,  9,  13, 16, 14, 13, 10, 8,  14, 19, 22, 19, 14, 11,
+    9,  19, 22, 23, 21, 16, 12, 9,  10, 11, 8,  5,  3,  2,  1,  10, 12, 10, 5,
+    4,  3,  2,  10, 12, 12, 8,  7,  5,  5,  10, 13, 16, 13, 10, 9,  8,  12, 15,
+    20, 19, 15, 12, 9,  16, 20, 24, 24, 17, 13, 10, 20, 24, 25, 25, 19, 14, 11,
+    9,  11, 14, 17, 17, 14, 11, 9,  11, 13, 16, 17, 13, 11, 8,  10, 12, 15, 17,
+    15, 12, 8,  10, 13, 16, 18, 16, 14, 8,  11, 13, 16, 19, 16, 13, 10, 11, 13,
+    15, 18, 17, 13, 16, 15, 14, 15, 17, 17, 13, 8,  10, 12, 14, 13, 11, 7,  8,
+    9,  11, 13, 13, 9,  7,  7,  8,  11, 13, 12, 10, 8,  6,  9,  12, 14, 13, 12,
+    9,  6,  9,  11, 13, 13, 12, 10, 12, 12, 13, 13, 12, 12, 10, 19, 17, 14, 13,
+    11, 11, 10, 7,  9,  8,  8,  9,  7,  4,  6,  8,  8,  7,  7,  6,  4,  5,  8,
+    7,  8,  7,  7,  5,  4,  7,  8,  8,  7,  7,  6,  7,  9,  9,  8,  8,  8,  6,
+    14, 14, 13, 11, 9,  7,  6,  21, 19, 15, 12, 9,  7,  6,  5,  4,  3,  3,  3,
+    4,  2,  3,  3,  3,  3,  2,  2,  0,  3,  2,  2,  3,  2,  2,  2,  7,  3,  4,
+    5,  4,  4,  4,  8,  9,  9,  8,  8,  7,  5,  14, 16, 14, 12, 10, 8,  6,  21,
+    22, 16, 13, 10, 9,  7,  5,  3,  2,  2,  3,  2,  2,  5,  4,  3,  2,  3,  2,
+    0,  5,  5,  4,  4,  4,  4,  3,  5,  8,  8,  8,  8,  8,  6,  9,  14, 14, 13,
+    13, 10, 7,  14, 18, 19, 18, 14, 11, 8,  20, 22, 23, 19, 16, 13, 9,  9,  9,
+    7,  6,  4,  3,  2,  8,  10, 8,  7,  5,  3,  2,  9,  12, 11, 11, 9,  6,  4,
+    9,  14, 16, 16, 13, 10, 8,  12, 18, 22, 20, 18, 14, 9,  16, 22, 28, 26, 20,
+    15, 10, 21, 26, 29, 28, 22, 17, 12, 14, 18, 15, 10, 6,  3,  2,  13, 17, 18,
+    12, 8,  5,  3,  13, 17, 20, 15, 12, 9,  6,  14, 19, 25, 21, 16, 14, 10, 18,
+    23, 28, 26, 21, 17, 12, 21, 27, 32, 32, 25, 19, 14, 26, 30, 32, 33, 26, 21,
+    15, 16, 19, 23, 26, 26, 25, 23, 15, 18, 21, 25, 26, 23, 21, 14, 17, 20, 23,
+    24, 22, 19, 13, 15, 17, 20, 22, 20, 18, 12, 14, 15, 18, 21, 20, 18, 11, 12,
+    14, 17, 20, 20, 17, 10, 11, 13, 16, 19, 20, 18, 13, 17, 21, 24, 24, 23, 18,
+    13, 15, 19, 22, 24, 21, 17, 12, 14, 17, 20, 21, 18, 15, 10, 13, 15, 17, 17,
+    17, 15, 10, 12, 14, 15, 15, 17, 14, 8,  11, 13, 15, 15, 15, 14, 11, 11, 12,
+    14, 14, 15, 14, 12, 14, 16, 18, 19, 19, 15, 11, 13, 15, 16, 17, 17, 13, 10,
+    13, 13, 15, 14, 15, 12, 9,  12, 12, 12, 13, 13, 12, 7,  10, 11, 11, 11, 12,
+    12, 8,  9,  9,  10, 11, 11, 12, 12, 12, 10, 9,  10, 11, 12, 10, 10, 10, 11,
+    13, 13, 6,  8,  9,  9,  10, 10, 10, 5,  7,  7,  8,  8,  9,  9,  5,  4,  6,
+    6,  7,  7,  7,  6,  5,  5,  6,  6,  6,  7,  5,  8,  8,  7,  6,  5,  5,  4,
+    12, 12, 8,  6,  5,  4,  2,  2,  2,  2,  3,  3,  4,  6,  0,  1,  1,  2,  1,
+    2,  5,  0,  2,  2,  1,  1,  1,  5,  0,  2,  2,  1,  2,  1,  3,  2,  4,  4,
+    3,  4,  2,  2,  5,  7,  7,  6,  5,  3,  2,  9,  10, 10, 7,  6,  4,  2,  4,
+    5,  4,  5,  3,  2,  4,  4,  6,  6,  6,  3,  1,  3,  4,  7,  7,  6,  4,  1,
+    2,  4,  7,  8,  7,  5,  3,  2,  4,  8,  10, 9,  7,  4,  2,  6,  10, 13, 12,
+    9,  6,  2,  9,  12, 14, 13, 10, 7,  3,  9,  12, 11, 8,  5,  2,  2,  9,  12,
+    13, 8,  5,  2,  1,  9,  13, 14, 9,  6,  3,  1,  9,  12, 15, 10, 7,  5,  2,
+    9,  12, 15, 13, 10, 7,  3,  10, 14, 17, 16, 11, 8,  5,  12, 15, 17, 17, 13,
+    9,  6,  18, 19, 22, 24, 24, 22, 19, 17, 20, 21, 24, 24, 22, 19, 15, 18, 20,
+    22, 24, 22, 20, 15, 18, 20, 21, 23, 22, 19, 14, 17, 19, 21, 24, 22, 21, 13,
+    16, 19, 21, 23, 22, 20, 12, 14, 17, 20, 22, 22, 20, 15, 18, 20, 23, 22, 20,
+    17, 14, 17, 20, 22, 20, 19, 17, 13, 17, 19, 21, 21, 18, 18, 12, 16, 18, 20,
+    19, 18, 17, 12, 15, 18, 19, 19, 20, 18, 11, 13, 17, 19, 18, 19, 17, 14, 13,
+    15, 17, 18, 18, 18, 13, 17, 17, 18, 18, 17, 14, 12, 15, 16, 16, 17, 16, 13,
+    11, 14, 16, 16, 16, 17, 14, 10, 13, 15, 15, 16, 16, 14, 9,  12, 14, 14, 15,
+    15, 14, 9,  11, 12, 13, 13, 14, 14, 16, 16, 12, 12, 13, 13, 13, 11, 11, 12,
+    12, 12, 13, 4,  10, 10, 11, 11, 11, 11, 5,  9,  9,  9,  9,  10, 10, 5,  5,
+    8,  8,  8,  8,  9,  7,  6,  7,  7,  7,  8,  8,  5,  9,  10, 9,  8,  6,  6,
+    5,  16, 18, 13, 9,  6,  5,  3,  3,  3,  4,  4,  4,  3,  4,  1,  2,  2,  2,
+    2,  2,  5,  1,  0,  1,  1,  1,  2,  5,  1,  3,  3,  3,  4,  2,  5,  3,  8,
+    8,  8,  8,  6,  3,  8,  13, 14, 12, 10, 8,  3,  15, 17, 16, 13, 11, 9,  4,
+    6,  8,  8,  8,  4,  2,  4,  6,  10, 9,  9,  6,  1,  4,  6,  11, 11, 10, 7,
+    2,  3,  6,  12, 12, 12, 10, 6,  4,  8,  13, 15, 14, 12, 9,  4,  11, 15, 18,
+    16, 13, 11, 6,  15, 17, 19, 17, 14, 12, 8,  13, 16, 15, 12, 8,  2,  2,  13,
+    16, 16, 12, 9,  4,  2,  13, 16, 18, 13, 10, 6,  1,  13, 16, 19, 14, 12, 10,
+    6,  13, 16, 20, 17, 14, 12, 8,  15, 17, 21, 20, 15, 13, 10, 17, 19, 22, 21,
+    17, 14, 11, 18, 21, 24, 26, 26, 24, 21, 17, 20, 23, 26, 26, 24, 21, 15, 19,
+    22, 26, 25, 23, 22, 14, 17, 21, 24, 26, 24, 22, 14, 17, 21, 23, 26, 25, 22,
+    13, 16, 20, 23, 26, 25, 21, 13, 15, 18, 21, 24, 24, 22, 15, 19, 21, 24, 23,
+    21, 17, 15, 18, 21, 24, 23, 20, 17, 13, 17, 20, 22, 22, 20, 17, 12, 16, 19,
+    22, 22, 20, 18, 12, 15, 18, 21, 21, 22, 18, 11, 14, 17, 20, 21, 20, 18, 15,
+    14, 16, 19, 19, 19, 18, 13, 17, 18, 18, 19, 17, 13, 12, 15, 17, 17, 17, 17,
+    13, 11, 14, 16, 16, 16, 16, 13, 10, 13, 15, 15, 16, 16, 13, 10, 13, 15, 15,
+    15, 15, 14, 10, 11, 13, 13, 14, 14, 13, 16, 16, 12, 12, 13, 13, 13, 11, 11,
+    11, 11, 12, 12, 4,  10, 10, 10, 11, 10, 11, 4,  8,  9,  9,  9,  9,  9,  5,
+    6,  8,  8,  8,  8,  8,  7,  7,  7,  7,  7,  7,  7,  4,  10, 11, 10, 8,  7,
+    6,  4,  17, 18, 13, 9,  7,  5,  3,  3,  3,  3,  4,  4,  3,  4,  2,  2,  2,
+    2,  2,  3,  4,  2,  1,  0,  0,  0,  2,  4,  2,  4,  3,  3,  4,  3,  4,  4,
+    8,  8,  8,  8,  6,  3,  9,  13, 14, 12, 10, 7,  4,  15, 18, 18, 14, 12, 9,
+    5,  5,  7,  7,  7,  3,  2,  3,  5,  9,  9,  8,  5,  1,  3,  5,  11, 11, 10,
+    6,  2,  3,  6,  12, 14, 14, 10, 6,  4,  8,  14, 19, 18, 15, 9,  5,  11, 17,
+    24, 23, 18, 11, 6,  16, 21, 25, 26, 20, 13, 7,  13, 19, 18, 12, 7,  2,  2,
+    13, 19, 20, 14, 9,  3,  2,  13, 19, 23, 16, 11, 6,  2,  13, 20, 25, 19, 15,
+    10, 6,  15, 21, 26, 25, 19, 14, 8,  17, 24, 29, 28, 21, 16, 10, 20, 26, 30,
+    31, 24, 17, 11, 18, 22, 26, 29, 29, 26, 23, 17, 20, 25, 28, 29, 26, 22, 15,
+    19, 23, 26, 28, 24, 22, 14, 17, 20, 24, 27, 25, 22, 14, 17, 20, 23, 27, 25,
+    22, 13, 16, 20, 23, 26, 25, 22, 13, 14, 18, 22, 25, 25, 22, 15, 19, 23, 26,
+    25, 22, 19, 14, 18, 22, 25, 24, 21, 18, 13, 16, 20, 23, 22, 20, 17, 13, 16,
+    19, 21, 22, 21, 18, 12, 15, 18, 21, 21, 21, 18, 11, 14, 17, 20, 20, 21, 18,
+    15, 14, 17, 19, 19, 19, 18, 13, 17, 19, 19, 21, 18, 14, 12, 15, 17, 19, 19,
+    17, 13, 11, 14, 16, 16, 16, 16, 12, 10, 14, 15, 15, 15, 15, 12, 10, 13, 14,
+    14, 14, 15, 13, 10, 11, 13, 13, 13, 13, 13, 17, 16, 12, 12, 12, 12, 12, 11,
+    11, 12, 12, 13, 13, 5,  11, 10, 10, 11, 11, 11, 4,  9,  9,  9,  9,  8,  8,
+    4,  5,  9,  8,  8,  8,  8,  6,  7,  7,  7,  7,  7,  7,  3,  10, 11, 10, 9,
+    6,  6,  3,  17, 18, 13, 9,  7,  5,  3,  3,  3,  4,  4,  5,  4,  5,  1,  2,
+    2,  3,  3,  4,  4,  1,  1,  0,  0,  0,  2,  3,  1,  4,  4,  3,  4,  3,  3,
+    4,  8,  8,  8,  8,  5,  3,  10, 13, 14, 12, 10, 7,  4,  15, 18, 17, 14, 12,
+    9,  4,  6,  7,  7,  7,  4,  3,  4,  6,  10, 8,  9,  6,  2,  3,  6,  11, 10,
+    10, 6,  2,  2,  6,  12, 14, 13, 10, 6,  4,  9,  15, 18, 18, 14, 9,  4,  12,
+    17, 24, 22, 17, 11, 6,  16, 21, 24, 25, 19, 13, 7,  14, 19, 18, 12, 7,  3,
+    4,  13, 19, 20, 14, 8,  3,  2,  13, 19, 22, 15, 10, 6,  2,  14, 20, 25, 19,
+    14, 10, 5,  15, 21, 27, 24, 19, 13, 8,  17, 24, 29, 29, 22, 15, 9,  21, 27,
+    30, 30, 23, 17, 11, 18, 22, 26, 29, 30, 27, 23, 17, 21, 24, 28, 30, 26, 21,
+    15, 19, 23, 26, 27, 24, 21, 14, 17, 21, 24, 27, 25, 22, 14, 17, 20, 23, 27,
+    25, 22, 14, 16, 19, 23, 26, 25, 21, 13, 15, 18, 21, 25, 25, 22, 15, 19, 23,
+    26, 26, 23, 20, 14, 18, 22, 25, 25, 22, 18, 13, 16, 20, 23, 23, 20, 17, 12,
+    15, 19, 21, 22, 21, 17, 13, 15, 18, 21, 21, 20, 17, 11, 13, 17, 19, 20, 20,
+    17, 15, 15, 15, 18, 18, 18, 18, 13, 16, 18, 19, 21, 19, 15, 12, 15, 18, 18,
+    19, 17, 13, 12, 14, 16, 16, 15, 16, 11, 11, 14, 14, 15, 15, 15, 12, 10, 13,
+    14, 14, 14, 14, 12, 10, 12, 13, 13, 13, 13, 12, 17, 16, 13, 12, 12, 12, 11,
+    12, 11, 11, 12, 13, 13, 6,  11, 9,  10, 11, 11, 11, 4,  9,  9,  9,  8,  8,
+    8,  4,  5,  9,  8,  8,  8,  8,  6,  7,  7,  7,  7,  7,  7,  3,  11, 12, 10,
+    8,  6,  5,  3,  17, 18, 13, 10, 7,  5,  3,  4,  3,  4,  4,  5,  5,  5,  1,
+    1,  2,  3,  3,  3,  4,  1,  1,  0,  0,  0,  1,  2,  1,  4,  4,  3,  4,  3,
+    3,  5,  9,  8,  8,  8,  6,  3,  10, 14, 14, 12, 10, 7,  4,  15, 18, 17, 13,
+    12, 9,  5,  6,  7,  7,  7,  4,  4,  5,  6,  9,  8,  8,  5,  2,  3,  6,  11,
+    10, 9,  6,  2,  2,  6,  13, 13, 12, 10, 6,  4,  9,  15, 18, 17, 14, 9,  5,
+    12, 18, 23, 21, 16, 11, 6,  16, 20, 24, 23, 18, 13, 7,  13, 15, 13, 10, 7,
+    3,  4,  13, 16, 15, 11, 8,  3,  1,  12, 15, 17, 11, 9,  6,  2,  12, 17, 20,
+    16, 13, 9,  6,  15, 19, 23, 21, 18, 13, 7,  18, 23, 26, 26, 20, 15, 9,  21,
+    25, 28, 28, 22, 17, 11, 17, 20, 25, 28, 28, 25, 21, 16, 19, 23, 28, 28, 24,
+    21, 14, 18, 21, 25, 27, 23, 20, 13, 16, 19, 22, 26, 23, 20, 13, 16, 19, 22,
+    26, 24, 21, 12, 15, 18, 22, 25, 24, 21, 13, 14, 17, 21, 23, 24, 21, 14, 18,
+    21, 25, 24, 22, 18, 13, 17, 20, 24, 23, 20, 16, 12, 16, 19, 22, 21, 19, 15,
+    11, 14, 17, 20, 20, 19, 16, 12, 14, 17, 20, 19, 19, 16, 9,  12, 15, 18, 18,
+    19, 16, 16, 14, 14, 17, 17, 17, 16, 12, 15, 17, 18, 19, 17, 13, 11, 14, 16,
+    17, 17, 16, 11, 11, 13, 15, 14, 15, 14, 10, 10, 13, 13, 13, 13, 13, 11, 9,
+    12, 12, 12, 12, 12, 11, 11, 12, 11, 11, 12, 11, 11, 17, 16, 12, 10, 10, 10,
+    10, 10, 10, 10, 11, 12, 12, 6,  9,  8,  9,  9,  10, 10, 4,  8,  7,  7,  7,
+    7,  7,  3,  5,  7,  6,  6,  6,  6,  5,  6,  6,  6,  5,  6,  5,  2,  11, 12,
+    10, 9,  7,  5,  3,  17, 17, 13, 10, 7,  5,  3,  2,  1,  2,  3,  4,  5,  5,
+    1,  0,  1,  2,  2,  3,  3,  1,  2,  2,  2,  1,  0,  2,  1,  5,  4,  4,  4,
+    3,  3,  5,  9,  8,  8,  8,  6,  3,  11, 14, 14, 11, 9,  7,  4,  16, 17, 17,
+    13, 10, 8,  5,  5,  5,  4,  3,  3,  3,  5,  5,  7,  5,  4,  3,  2,  2,  5,
+    7,  5,  4,  2,  2,  1,  5,  8,  8,  7,  6,  5,  4,  8,  11, 13, 11, 10, 8,
+    5,  12, 15, 18, 16, 11, 8,  6,  16, 18, 19, 18, 13, 9,  7,  8,  9,  7,  5,
+    3,  3,  3,  8,  9,  8,  6,  3,  2,  1,  8,  9,  10, 6,  4,  3,  2,  7,  10,
+    13, 10, 8,  6,  6,  10, 13, 17, 16, 12, 9,  7,  13, 17, 20, 19, 14, 10, 8,
+    17, 20, 21, 21, 16, 11, 8,  13, 16, 19, 22, 22, 20, 16, 12, 15, 18, 22, 22,
+    19, 15, 11, 15, 18, 20, 21, 18, 15, 10, 12, 15, 18, 21, 19, 16, 9,  12, 15,
+    18, 21, 20, 16, 8,  11, 14, 17, 21, 19, 16, 11, 11, 13, 16, 20, 19, 16, 11,
+    14, 17, 20, 18, 17, 14, 10, 13, 16, 19, 18, 15, 12, 8,  12, 15, 17, 16, 14,
+    12, 7,  10, 13, 16, 16, 14, 12, 7,  10, 12, 15, 15, 15, 12, 9,  10, 11, 14,
+    14, 14, 12, 14, 12, 11, 13, 13, 13, 12, 8,  12, 13, 14, 15, 13, 10, 7,  10,
+    13, 13, 13, 13, 8,  6,  9,  11, 11, 11, 10, 7,  5,  9,  9,  9,  9,  9,  7,
+    6,  8,  9,  9,  9,  8,  7,  12, 11, 9,  8,  7,  7,  7,  15, 13, 10, 8,  7,
+    6,  6,  6,  6,  7,  8,  9,  9,  5,  5,  4,  5,  6,  6,  7,  3,  3,  3,  4,
+    4,  3,  3,  2,  2,  3,  3,  3,  2,  2,  2,  6,  7,  6,  5,  5,  4,  2,  12,
+    12, 9,  8,  6,  5,  3,  15, 16, 11, 9,  7,  5,  4,  4,  3,  3,  2,  3,  4,
+    5,  4,  4,  3,  3,  3,  3,  3,  4,  5,  4,  3,  2,  2,  0,  4,  8,  5,  5,
+    4,  4,  3,  8,  12, 9,  9,  8,  6,  4,  11, 14, 14, 12, 10, 7,  5,  15, 17,
+    17, 14, 12, 9,  5,  8,  7,  6,  5,  4,  4,  4,  7,  9,  6,  6,  4,  3,  2,
+    8,  11, 8,  7,  5,  3,  2,  8,  11, 12, 11, 9,  6,  5,  10, 14, 17, 16, 13,
+    9,  5,  13, 18, 22, 20, 15, 10, 7,  16, 20, 23, 22, 17, 12, 8,  12, 15, 13,
+    9,  5,  4,  3,  11, 15, 16, 11, 6,  3,  2,  12, 15, 18, 12, 8,  5,  3,  12,
+    16, 21, 16, 12, 9,  6,  14, 19, 24, 21, 16, 12, 8,  16, 21, 26, 26, 19, 13,
+    9,  20, 24, 27, 27, 22, 15, 10, 15, 19, 23, 26, 26, 25, 22, 14, 18, 22, 25,
+    25, 23, 21, 13, 17, 20, 23, 24, 21, 19, 13, 15, 18, 20, 22, 20, 18, 12, 14,
+    16, 18, 21, 20, 18, 10, 12, 15, 17, 20, 20, 18, 10, 11, 13, 15, 19, 19, 18,
+    14, 17, 20, 23, 24, 23, 19, 13, 16, 19, 22, 24, 21, 17, 12, 14, 17, 20, 20,
+    19, 15, 11, 13, 16, 17, 17, 17, 15, 10, 12, 14, 16, 16, 17, 14, 8,  11, 12,
+    14, 14, 15, 15, 11, 11, 12, 14, 14, 14, 14, 12, 14, 16, 17, 19, 19, 15, 11,
+    13, 15, 16, 17, 17, 12, 10, 13, 14, 14, 14, 15, 12, 9,  12, 12, 12, 13, 13,
+    12, 7,  10, 12, 12, 12, 12, 12, 8,  9,  9,  10, 11, 12, 12, 12, 13, 10, 9,
+    10, 11, 11, 10, 10, 10, 11, 13, 14, 6,  8,  9,  9,  10, 10, 11, 5,  7,  8,
+    8,  8,  9,  9,  5,  4,  6,  6,  7,  7,  7,  5,  5,  5,  6,  6,  6,  7,  5,
+    8,  8,  7,  6,  5,  5,  4,  12, 12, 8,  6,  5,  4,  2,  2,  2,  2,  2,  3,
+    4,  6,  0,  1,  1,  2,  1,  2,  5,  0,  1,  1,  1,  1,  1,  5,  0,  2,  2,
+    1,  2,  1,  4,  2,  4,  4,  3,  4,  2,  2,  5,  7,  7,  6,  5,  3,  2,  9,
+    10, 10, 7,  6,  4,  2,  4,  5,  4,  5,  3,  2,  5,  4,  6,  6,  5,  3,  1,
+    3,  4,  7,  7,  6,  4,  1,  2,  4,  7,  8,  7,  5,  3,  2,  4,  8,  11, 9,
+    7,  4,  2,  6,  10, 14, 12, 9,  6,  2,  9,  12, 14, 13, 10, 7,  3,  9,  12,
+    11, 7,  5,  2,  2,  9,  12, 13, 8,  5,  2,  1,  9,  12, 14, 9,  6,  3,  1,
+    9,  12, 15, 10, 7,  5,  2,  8,  12, 15, 13, 9,  7,  4,  10, 14, 17, 16, 11,
+    8,  5,  12, 15, 17, 17, 13, 9,  6,  21, 24, 26, 29, 28, 27, 25, 21, 23, 26,
+    28, 29, 26, 23, 19, 22, 25, 26, 27, 25, 23, 18, 21, 23, 26, 27, 24, 21, 16,
+    19, 21, 23, 25, 23, 22, 15, 19, 21, 22, 24, 23, 21, 12, 15, 19, 22, 24, 23,
+    22, 20, 23, 25, 27, 26, 24, 22, 18, 21, 24, 26, 26, 23, 21, 17, 20, 23, 25,
+    23, 23, 20, 16, 18, 21, 23, 22, 21, 19, 14, 17, 19, 22, 21, 21, 19, 12, 15,
+    18, 20, 21, 20, 19, 12, 12, 17, 19, 20, 19, 20, 17, 21, 22, 22, 22, 21, 18,
+    15, 20, 21, 22, 21, 20, 17, 14, 18, 20, 20, 20, 20, 17, 12, 16, 17, 17, 18,
+    18, 16, 11, 14, 16, 16, 17, 17, 16, 8,  12, 14, 14, 16, 16, 16, 13, 13, 11,
+    13, 15, 15, 15, 14, 15, 16, 16, 17, 17, 8,  13, 13, 14, 15, 15, 15, 8,  10,
+    12, 13, 13, 13, 14, 8,  7,  10, 10, 10, 10, 11, 9,  7,  8,  9,  9,  9,  10,
+    6,  8,  8,  7,  7,  7,  8,  6,  13, 14, 10, 7,  6,  6,  5,  6,  6,  7,  8,
+    8,  6,  8,  2,  5,  6,  6,  6,  6,  8,  2,  3,  4,  4,  4,  5,  9,  2,  0,
+    0,  0,  0,  2,  6,  3,  5,  4,  5,  5,  3,  5,  5,  9,  9,  8,  6,  4,  3,
+    11, 12, 11, 8,  6,  5,  2,  4,  6,  6,  6,  3,  5,  7,  4,  7,  7,  7,  4,
+    5,  6,  4,  8,  8,  8,  6,  3,  6,  4,  8,  8,  7,  5,  3,  3,  4,  8,  9,
+    8,  7,  5,  2,  7,  9,  12, 11, 8,  6,  3,  11, 12, 13, 12, 9,  6,  4,  9,
+    12, 11, 9,  6,  3,  6,  9,  12, 13, 9,  7,  3,  5,  9,  13, 15, 10, 7,  4,
+    3,  10, 12, 15, 9,  7,  6,  3,  8,  11, 14, 12, 8,  6,  5,  9,  13, 15, 14,
+    10, 7,  6,  11, 14, 16, 16, 12, 8,  6,  22, 26, 28, 31, 31, 29, 26, 21, 24,
+    28, 31, 31, 28, 25, 19, 23, 26, 29, 29, 27, 23, 18, 20, 24, 27, 29, 26, 22,
+    15, 18, 21, 24, 27, 25, 22, 14, 16, 20, 23, 27, 25, 22, 12, 15, 18, 22, 25,
+    25, 22, 19, 23, 26, 30, 27, 26, 22, 18, 21, 25, 28, 28, 24, 22, 16, 20, 24,
+    27, 25, 24, 20, 15, 18, 21, 23, 23, 21, 19, 13, 16, 19, 22, 22, 21, 19, 11,
+    15, 17, 21, 21, 21, 19, 12, 12, 16, 19, 20, 20, 19, 16, 20, 22, 23, 24, 22,
+    18, 15, 18, 21, 22, 22, 21, 17, 14, 17, 20, 20, 20, 20, 15, 13, 15, 16, 16,
+    17, 17, 14, 10, 13, 15, 15, 15, 16, 14, 8,  12, 13, 14, 14, 14, 14, 13, 13,
+    12, 12, 13, 13, 13, 13, 14, 15, 16, 17, 17, 9,  12, 13, 14, 15, 15, 15, 8,
+    9,  11, 12, 13, 12, 13, 8,  6,  9,  9,  9,  9,  9,  7,  6,  8,  8,  8,  8,
+    8,  4,  8,  8,  7,  6,  6,  7,  4,  13, 15, 10, 7,  5,  5,  3,  5,  6,  7,
+    8,  8,  7,  8,  2,  5,  5,  6,  7,  6,  8,  2,  3,  3,  4,  4,  4,  5,  2,
+    0,  0,  0,  0,  2,  4,  3,  5,  5,  4,  5,  3,  3,  6,  10, 11, 9,  7,  4,
+    2,  12, 15, 14, 11, 9,  6,  2,  4,  6,  7,  7,  4,  6,  7,  4,  8,  8,  9,
+    5,  5,  6,  4,  10, 10, 10, 6,  2,  4,  4,  10, 11, 11, 7,  3,  2,  5,  11,
+    15, 15, 12, 6,  2,  8,  14, 20, 19, 14, 8,  3,  13, 17, 21, 21, 16, 10, 4,
+    12, 19, 18, 12, 7,  5,  6,  13, 19, 21, 14, 8,  3,  5,  13, 19, 23, 15, 10,
+    4,  2,  13, 18, 23, 17, 11, 7,  3,  12, 18, 23, 21, 16, 10, 4,  14, 20, 25,
+    24, 19, 12, 6,  17, 23, 25, 25, 20, 14, 8,  22, 26, 29, 32, 33, 30, 26, 20,
+    24, 28, 33, 33, 29, 26, 19, 23, 27, 30, 31, 28, 23, 18, 20, 24, 27, 30, 26,
+    23, 15, 18, 21, 24, 28, 26, 23, 14, 17, 19, 23, 27, 26, 22, 12, 15, 18, 22,
+    26, 25, 22, 19, 23, 27, 29, 29, 27, 23, 18, 21, 26, 29, 29, 25, 22, 16, 20,
+    24, 27, 26, 24, 20, 15, 18, 21, 24, 23, 22, 19, 13, 16, 19, 21, 22, 21, 19,
+    12, 15, 18, 20, 21, 21, 18, 12, 12, 17, 19, 20, 19, 19, 16, 20, 22, 23, 24,
+    22, 19, 15, 18, 20, 22, 23, 22, 17, 13, 17, 19, 19, 20, 19, 15, 13, 15, 15,
+    16, 16, 17, 13, 10, 13, 15, 15, 14, 15, 13, 8,  12, 13, 14, 14, 13, 13, 13,
+    13, 12, 12, 13, 13, 12, 14, 14, 15, 16, 17, 18, 10, 13, 13, 14, 15, 15, 15,
+    8,  10, 11, 12, 12, 12, 12, 7,  6,  10, 9,  9,  9,  9,  7,  6,  8,  8,  8,
+    7,  7,  4,  8,  8,  7,  6,  6,  6,  3,  13, 14, 9,  6,  5,  5,  2,  6,  6,
+    7,  8,  9,  8,  9,  1,  5,  6,  6,  7,  6,  8,  1,  3,  3,  3,  4,  4,  5,
+    1,  0,  0,  0,  0,  2,  3,  3,  5,  4,  4,  4,  2,  2,  6,  10, 11, 9,  6,
+    3,  2,  12, 15, 14, 10, 9,  5,  2,  4,  6,  7,  7,  5,  7,  8,  4,  8,  8,
+    8,  5,  5,  6,  4,  10, 10, 9,  5,  2,  3,  4,  9,  11, 10, 6,  2,  2,  5,
+    11, 15, 14, 11, 5,  2,  8,  14, 20, 18, 13, 7,  2,  12, 17, 21, 21, 15, 10,
+    4,  13, 19, 17, 12, 7,  5,  7,  13, 18, 20, 13, 8,  3,  4,  13, 19, 21, 14,
+    9,  4,  1,  13, 17, 22, 16, 10, 6,  2,  12, 17, 24, 21, 15, 9,  4,  14, 20,
+    25, 25, 18, 11, 6,  17, 22, 26, 26, 20, 14, 8,  22, 26, 30, 34, 33, 30, 28,
+    21, 24, 29, 33, 33, 30, 26, 19, 23, 27, 31, 32, 28, 24, 18, 20, 24, 28, 30,
+    27, 23, 15, 18, 21, 25, 29, 26, 23, 14, 17, 20, 23, 27, 27, 23, 12, 15, 19,
+    23, 26, 26, 22, 19, 23, 28, 30, 29, 26, 24, 18, 21, 25, 29, 30, 26, 22, 17,
+    20, 24, 27, 27, 23, 20, 15, 18, 21, 23, 24, 22, 18, 14, 16, 19, 22, 22, 22,
+    18, 12, 15, 17, 20, 20, 21, 19, 12, 13, 17, 20, 19, 20, 18, 17, 20, 22, 23,
+    24, 23, 18, 15, 19, 21, 22, 23, 21, 17, 15, 17, 20, 19, 20, 19, 15, 13, 16,
+    16, 17, 17, 16, 13, 10, 14, 15, 15, 15, 15, 13, 9,  12, 14, 14, 14, 14, 13,
+    12, 12, 12, 12, 13, 13, 12, 15, 15, 15, 16, 17, 18, 10, 13, 13, 14, 15, 15,
+    15, 8,  10, 12, 12, 12, 12, 12, 7,  6,  10, 9,  9,  9,  9,  7,  6,  8,  8,
+    8,  7,  8,  4,  8,  8,  7,  7,  6,  6,  3,  12, 12, 9,  6,  5,  5,  2,  6,
+    6,  7,  8,  9,  8,  10, 2,  5,  6,  7,  7,  6,  8,  1,  4,  4,  4,  4,  4,
+    4,  1,  0,  0,  0,  0,  1,  3,  3,  5,  4,  4,  4,  2,  2,  6,  10, 10, 8,
+    6,  3,  2,  11, 13, 13, 10, 8,  5,  1,  5,  7,  7,  7,  5,  7,  8,  5,  9,
+    8,  8,  5,  5,  6,  5,  10, 9,  8,  5,  2,  3,  5,  10, 10, 9,  6,  2,  2,
+    5,  11, 14, 13, 10, 5,  1,  8,  14, 19, 17, 12, 7,  2,  12, 16, 20, 20, 14,
+    9,  3,  12, 15, 13, 10, 6,  6,  7,  12, 15, 15, 11, 7,  4,  4,  12, 15, 16,
+    11, 8,  3,  2,  12, 15, 17, 13, 10, 6,  2,  11, 16, 19, 17, 14, 9,  4,  14,
+    19, 23, 23, 16, 11, 5,  16, 21, 24, 23, 19, 13, 7,  21, 24, 28, 32, 33, 29,
+    25, 19, 23, 27, 31, 32, 28, 25, 18, 21, 25, 29, 30, 27, 23, 17, 20, 22, 25,
+    28, 25, 21, 14, 17, 20, 23, 27, 24, 21, 13, 16, 18, 22, 26, 25, 21, 11, 14,
+    17, 21, 24, 24, 21, 17, 22, 25, 29, 28, 26, 23, 17, 20, 24, 28, 28, 24, 20,
+    15, 19, 22, 26, 26, 23, 18, 14, 16, 20, 22, 22, 21, 17, 12, 15, 18, 20, 20,
+    20, 17, 10, 13, 16, 19, 19, 19, 17, 10, 12, 15, 18, 18, 18, 17, 16, 19, 21,
+    21, 24, 21, 17, 14, 17, 20, 21, 21, 20, 15, 13, 16, 18, 18, 18, 18, 14, 12,
+    14, 15, 15, 15, 15, 11, 10, 13, 14, 13, 13, 13, 12, 8,  11, 12, 12, 12, 12,
+    11, 10, 10, 10, 11, 11, 11, 11, 13, 13, 14, 15, 16, 17, 9,  11, 12, 13, 14,
+    14, 14, 7,  9,  11, 10, 11, 10, 10, 6,  5,  9,  8,  7,  7,  7,  6,  5,  6,
+    6,  6,  6,  6,  3,  8,  7,  6,  5,  4,  5,  3,  10, 10, 7,  5,  4,  3,  2,
+    5,  5,  6,  7,  8,  8,  9,  1,  4,  5,  5,  6,  6,  7,  1,  2,  3,  3,  3,
+    3,  4,  1,  2,  2,  2,  1,  0,  2,  2,  6,  5,  4,  4,  2,  2,  6,  9,  9,
+    7,  5,  3,  1,  9,  11, 10, 7,  6,  4,  2,  5,  4,  4,  4,  5,  7,  8,  5,
+    6,  4,  4,  4,  4,  6,  5,  8,  5,  4,  2,  2,  3,  5,  7,  7,  4,  3,  2,
+    1,  5,  8,  10, 8,  6,  4,  2,  8,  11, 13, 10, 7,  5,  3,  10, 12, 13, 12,
+    8,  6,  3,  9,  11, 8,  5,  5,  6,  6,  9,  11, 9,  5,  4,  4,  4,  9,  11,
+    11, 6,  4,  2,  1,  8,  11, 11, 7,  5,  3,  2,  8,  10, 13, 11, 8,  5,  4,
+    10, 13, 15, 14, 9,  7,  4,  11, 14, 15, 15, 11, 7,  5,  17, 21, 24, 28, 27,
+    25, 22, 16, 20, 24, 27, 27, 23, 20, 14, 18, 21, 24, 26, 23, 18, 13, 16, 19,
+    22, 25, 20, 17, 10, 13, 15, 19, 22, 20, 17, 9,  11, 14, 18, 22, 21, 17, 7,
+    10, 14, 16, 20, 20, 17, 14, 18, 21, 25, 24, 22, 18, 13, 17, 21, 24, 23, 20,
+    16, 12, 15, 20, 21, 21, 19, 14, 11, 13, 16, 19, 18, 17, 13, 8,  11, 13, 16,
+    16, 16, 13, 7,  9,  12, 15, 15, 15, 12, 6,  8,  12, 14, 13, 14, 13, 12, 16,
+    17, 18, 19, 18, 14, 10, 14, 16, 17, 17, 16, 12, 9,  13, 15, 14, 14, 14, 10,
+    9,  11, 11, 11, 11, 11, 8,  5,  8,  9,  9,  9,  9,  8,  5,  7,  8,  8,  8,
+    8,  8,  6,  6,  7,  6,  7,  7,  6,  10, 10, 10, 11, 12, 13, 9,  8,  8,  9,
+    10, 10, 10, 6,  6,  7,  7,  7,  7,  7,  4,  3,  4,  4,  3,  4,  4,  3,  3,
+    3,  2,  2,  2,  2,  2,  5,  5,  3,  3,  2,  1,  0,  6,  7,  4,  3,  2,  2,
+    1,  2,  3,  4,  5,  6,  8,  8,  4,  3,  4,  5,  5,  5,  6,  4,  5,  4,  3,
+    3,  3,  3,  4,  6,  4,  3,  3,  2,  0,  4,  6,  5,  4,  4,  2,  1,  6,  7,
+    8,  7,  5,  3,  2,  7,  9,  11, 8,  7,  5,  2,  7,  6,  5,  5,  5,  7,  7,
+    7,  8,  6,  6,  4,  4,  5,  7,  8,  7,  7,  4,  2,  2,  7,  8,  8,  8,  5,
+    3,  2,  6,  9,  12, 11, 8,  5,  2,  7,  11, 16, 15, 10, 6,  3,  9,  13, 17,
+    17, 12, 7,  3,  10, 14, 13, 8,  5,  6,  6,  10, 14, 15, 10, 6,  3,  3,  10,
+    14, 17, 10, 6,  3,  2,  10, 13, 17, 12, 8,  5,  2,  10, 14, 19, 16, 11, 8,
+    4,  12, 16, 21, 20, 14, 9,  5,  14, 18, 22, 22, 16, 11, 6,  19, 22, 24, 28,
+    28, 25, 22, 18, 21, 23, 26, 28, 25, 22, 17, 20, 22, 24, 26, 23, 20, 16, 18,
+    20, 22, 24, 21, 17, 13, 15, 17, 18, 21, 19, 16, 11, 12, 14, 16, 19, 18, 16,
+    8,  10, 12, 15, 17, 18, 16, 17, 20, 23, 25, 25, 23, 20, 17, 19, 22, 24, 24,
+    22, 19, 15, 18, 21, 22, 22, 20, 18, 14, 16, 18, 19, 19, 18, 14, 10, 13, 14,
+    15, 15, 15, 14, 8,  10, 12, 14, 14, 15, 14, 9,  9,  11, 12, 13, 13, 14, 15,
+    18, 19, 20, 20, 20, 16, 13, 17, 18, 19, 19, 18, 16, 12, 16, 17, 17, 17, 17,
+    15, 11, 14, 15, 15, 15, 15, 13, 7,  10, 12, 11, 12, 12, 13, 5,  8,  9,  10,
+    11, 12, 12, 10, 10, 8,  8,  10, 11, 11, 12, 14, 14, 15, 15, 16, 9,  11, 12,
+    13, 13, 13, 14, 9,  9,  10, 11, 11, 12, 12, 9,  6,  8,  8,  9,  9,  9,  7,
+    4,  5,  5,  5,  6,  6,  6,  5,  6,  5,  4,  4,  5,  5,  10, 10, 6,  4,  3,
+    3,  3,  4,  5,  6,  7,  7,  8,  9,  2,  4,  5,  6,  6,  7,  9,  2,  3,  4,
+    4,  4,  5,  8,  2,  3,  3,  3,  3,  2,  4,  0,  3,  2,  2,  2,  1,  3,  3,
+    4,  5,  4,  3,  1,  1,  7,  7,  7,  5,  4,  3,  1,  5,  6,  6,  7,  5,  6,
+    8,  5,  7,  7,  7,  5,  5,  7,  5,  8,  8,  8,  6,  4,  6,  5,  7,  8,  7,
+    5,  2,  1,  3,  6,  9,  8,  5,  2,  1,  4,  8,  11, 10, 7,  4,  1,  6,  10,
+    12, 11, 8,  5,  2,  10, 13, 13, 9,  6,  5,  6,  10, 14, 14, 10, 7,  5,  6,
+    10, 14, 15, 10, 7,  5,  3,  10, 13, 15, 10, 7,  4,  1,  9,  11, 14, 12, 8,
+    5,  2,  8,  12, 15, 14, 9,  6,  3,  10, 13, 15, 15, 11, 7,  4,  27, 29, 32,
+    35, 35, 32, 30, 25, 29, 31, 34, 34, 31, 28, 25, 27, 31, 32, 33, 30, 26, 22,
+    26, 28, 30, 32, 28, 24, 20, 23, 25, 26, 28, 26, 23, 16, 19, 21, 24, 26, 25,
+    23, 13, 17, 21, 23, 26, 26, 23, 24, 28, 31, 33, 32, 29, 28, 23, 26, 29, 32,
+    32, 29, 26, 21, 25, 28, 30, 30, 28, 25, 20, 23, 26, 28, 26, 25, 21, 16, 20,
+    22, 24, 24, 22, 21, 14, 17, 20, 21, 22, 22, 21, 10, 13, 18, 21, 21, 21, 21,
+    21, 25, 28, 28, 28, 27, 24, 20, 24, 26, 27, 27, 27, 23, 18, 22, 24, 25, 26,
+    25, 22, 16, 20, 21, 22, 22, 23, 18, 11, 16, 17, 18, 18, 18, 18, 7,  13, 16,
+    16, 16, 17, 18, 9,  10, 13, 15, 15, 16, 17, 18, 19, 21, 22, 22, 22, 15, 16,
+    18, 20, 20, 20, 21, 14, 13, 16, 17, 18, 18, 18, 14, 9,  14, 14, 14, 15, 15,
+    12, 7,  10, 10, 10, 10, 11, 8,  7,  7,  7,  8,  9,  9,  6,  9,  9,  6,  6,
+    7,  8,  7,  9,  11, 12, 14, 14, 13, 14, 4,  9,  11, 12, 12, 11, 14, 4,  7,
+    8,  8,  9,  9,  12, 4,  5,  5,  5,  5,  6,  6,  3,  0,  0,  0,  0,  3,  6,
+    3,  3,  3,  2,  1,  1,  6,  6,  6,  5,  2,  2,  2,  5,  4,  5,  6,  6,  9,
+    12, 13, 4,  5,  6,  6,  8,  10, 11, 4,  6,  6,  6,  5,  7,  9,  4,  5,  5,
+    5,  3,  3,  6,  2,  3,  5,  4,  2,  2,  4,  2,  4,  7,  6,  3,  2,  2,  5,
+    5,  8,  7,  4,  2,  1,  7,  10, 9,  7,  7,  10, 12, 7,  10, 11, 8,  6,  8,
+    10, 7,  10, 12, 7,  5,  5,  6,  7,  9,  12, 7,  4,  2,  2,  5,  8,  10, 7,
+    4,  2,  1,  4,  7,  10, 9,  5,  2,  1,  5,  9,  11, 11, 7,  3,  2,  27, 30,
+    34, 37, 37, 34, 32, 25, 29, 32, 36, 36, 34, 29, 23, 27, 32, 34, 35, 32, 28,
+    22, 25, 28, 31, 33, 29, 24, 19, 22, 25, 27, 30, 28, 24, 16, 19, 21, 24, 29,
+    27, 24, 13, 17, 20, 24, 27, 27, 24, 24, 27, 31, 34, 33, 31, 28, 22, 26, 30,
+    33, 33, 31, 27, 20, 24, 29, 31, 30, 29, 25, 19, 22, 25, 28, 28, 27, 22, 16,
+    18, 22, 25, 24, 23, 21, 13, 16, 19, 23, 22, 23, 21, 10, 14, 18, 21, 21, 21,
+    21, 21, 24, 27, 29, 29, 28, 23, 19, 23, 26, 27, 28, 26, 22, 18, 21, 24, 24,
+    25, 24, 20, 16, 20, 20, 20, 21, 22, 17, 10, 16, 17, 17, 17, 18, 16, 7,  13,
+    15, 16, 16, 16, 16, 8,  11, 13, 13, 15, 15, 15, 18, 19, 20, 21, 22, 23, 15,
+    15, 17, 19, 20, 19, 19, 14, 12, 16, 17, 17, 17, 17, 13, 8,  13, 13, 13, 14,
+    14, 11, 6,  9,  9,  9,  9,  9,  8,  6,  7,  7,  8,  8,  8,  5,  8,  9,  5,
+    6,  6,  7,  5,  8,  10, 12, 13, 13, 13, 15, 3,  9,  10, 11, 11, 11, 14, 3,
+    8,  8,  8,  8,  8,  9,  3,  5,  4,  4,  4,  5,  5,  2,  0,  0,  0,  0,  2,
+    4,  3,  5,  6,  5,  3,  1,  4,  7,  10, 10, 6,  5,  2,  4,  4,  5,  6,  7,
+    9,  11, 13, 4,  7,  7,  7,  8,  9,  11, 4,  9,  9,  8,  5,  7,  8,  4,  8,
+    10, 10, 5,  3,  4,  2,  7,  12, 12, 7,  2,  3,  3,  9,  15, 15, 10, 4,  2,
+    8,  12, 16, 16, 12, 6,  1,  11, 17, 16, 11, 7,  10, 12, 11, 18, 19, 13, 7,
+    8,  9,  11, 17, 21, 14, 8,  4,  6,  11, 17, 21, 15, 9,  4,  2,  10, 16, 21,
+    17, 12, 6,  1,  10, 16, 20, 19, 14, 8,  2,  13, 18, 20, 20, 16, 10, 4,  27,
+    30, 33, 37, 36, 35, 31, 25, 29, 32, 36, 37, 35, 30, 23, 27, 31, 35, 35, 32,
+    28, 22, 25, 29, 31, 34, 30, 24, 19, 22, 24, 27, 31, 28, 25, 16, 18, 21, 25,
+    29, 28, 25, 13, 16, 20, 23, 27, 27, 25, 23, 28, 30, 34, 33, 31, 29, 22, 26,
+    30, 33, 34, 29, 26, 20, 24, 28, 30, 31, 28, 23, 19, 22, 24, 27, 28, 26, 20,
+    17, 19, 21, 24, 24, 23, 20, 14, 16, 19, 22, 21, 22, 20, 10, 14, 18, 20, 21,
+    21, 21, 20, 24, 26, 27, 29, 27, 23, 19, 22, 25, 26, 26, 25, 21, 18, 21, 23,
+    24, 24, 24, 19, 15, 20, 20, 20, 21, 20, 16, 10, 16, 16, 17, 16, 16, 16, 7,
+    14, 14, 15, 15, 15, 16, 8,  11, 13, 14, 14, 14, 14, 18, 18, 19, 20, 22, 22,
+    15, 15, 17, 18, 19, 20, 20, 13, 11, 16, 16, 16, 16, 16, 12, 8,  14, 12, 13,
+    13, 13, 11, 6,  10, 9,  9,  9,  9,  7,  6,  7,  7,  7,  7,  8,  4,  8,  8,
+    5,  6,  6,  6,  4,  7,  10, 12, 13, 13, 13, 14, 3,  9,  10, 11, 11, 10, 13,
+    3,  8,  8,  8,  8,  8,  9,  3,  5,  4,  4,  4,  4,  4,  2,  0,  0,  0,  0,
+    2,  3,  3,  5,  6,  4,  2,  1,  3,  6,  9,  9,  6,  4,  2,  2,  4,  5,  6,
+    7,  9,  12, 13, 4,  7,  7,  7,  8,  9,  10, 4,  8,  9,  8,  5,  6,  7,  4,
+    8,  9,  9,  5,  3,  3,  2,  7,  11, 11, 7,  2,  3,  3,  9,  15, 15, 9,  3,
+    2,  7,  12, 17, 17, 11, 5,  1,  11, 17, 16, 11, 7,  10, 11, 11, 17, 19, 12,
+    7,  8,  9,  11, 17, 20, 14, 8,  4,  5,  11, 17, 21, 14, 9,  3,  2,  10, 15,
+    21, 17, 11, 5,  1,  10, 16, 21, 21, 14, 7,  2,  12, 18, 22, 22, 16, 10, 4,
+    26, 30, 33, 39, 37, 35, 31, 25, 29, 32, 37, 37, 33, 30, 23, 26, 32, 34, 36,
+    32, 28, 22, 24, 28, 31, 33, 30, 25, 19, 21, 25, 27, 30, 28, 25, 16, 19, 21,
+    25, 28, 28, 25, 14, 17, 20, 24, 27, 28, 25, 23, 28, 30, 34, 34, 31, 27, 22,
+    26, 29, 32, 33, 30, 26, 21, 24, 28, 30, 31, 28, 24, 20, 22, 25, 28, 29, 26,
+    20, 17, 19, 21, 23, 24, 23, 20, 14, 16, 19, 21, 22, 23, 20, 12, 15, 18, 21,
+    21, 21, 20, 21, 24, 27, 27, 29, 27, 23, 19, 23, 26, 26, 26, 25, 21, 18, 22,
+    23, 23, 24, 24, 19, 15, 20, 20, 20, 20, 20, 15, 10, 16, 17, 17, 17, 16, 15,
+    7,  14, 15, 15, 15, 15, 14, 7,  12, 14, 14, 14, 14, 14, 18, 19, 20, 20, 22,
+    21, 15, 15, 17, 18, 20, 20, 19, 13, 12, 16, 16, 16, 16, 16, 12, 8,  14, 13,
+    12, 13, 13, 11, 6,  10, 9,  9,  9,  9,  7,  6,  8,  8,  7,  7,  8,  4,  7,
+    5,  6,  6,  6,  6,  4,  7,  11, 12, 12, 13, 13, 15, 4,  9,  10, 11, 11, 10,
+    13, 4,  8,  8,  8,  8,  8,  8,  4,  5,  5,  4,  4,  4,  4,  2,  0,  0,  0,
+    0,  2,  3,  3,  4,  4,  3,  2,  2,  3,  4,  5,  5,  4,  4,  2,  2,  4,  5,
+    6,  7,  9,  11, 13, 4,  7,  7,  7,  8,  9,  10, 4,  9,  8,  7,  5,  6,  7,
+    4,  8,  9,  8,  5,  3,  3,  2,  7,  11, 9,  6,  2,  2,  3,  9,  14, 12, 8,
+    3,  2,  4,  9,  14, 14, 10, 5,  1,  10, 14, 12, 9,  8,  10, 11, 10, 14, 14,
+    10, 7,  8,  8,  10, 14, 15, 10, 7,  4,  5,  10, 13, 15, 11, 8,  3,  2,  10,
+    13, 16, 14, 10, 5,  1,  10, 15, 18, 17, 12, 7,  2,  11, 15, 18, 18, 13, 9,
+    3,  24, 27, 31, 35, 36, 33, 29, 22, 26, 30, 34, 36, 32, 28, 21, 25, 28, 32,
+    33, 29, 25, 19, 22, 26, 29, 31, 27, 23, 17, 19, 21, 25, 29, 26, 23, 15, 17,
+    19, 23, 27, 26, 22, 13, 16, 19, 22, 26, 26, 23, 21, 25, 28, 32, 31, 28, 25,
+    20, 22, 27, 31, 31, 28, 23, 19, 22, 26, 28, 28, 25, 21, 17, 20, 23, 25, 25,
+    23, 18, 15, 17, 19, 22, 22, 21, 18, 13, 15, 17, 20, 20, 21, 19, 10, 14, 17,
+    19, 19, 19, 18, 19, 22, 23, 25, 27, 24, 20, 18, 21, 23, 24, 24, 23, 18, 17,
+    19, 21, 22, 21, 20, 16, 15, 17, 18, 18, 18, 18, 13, 10, 14, 15, 14, 14, 15,
+    13, 6,  13, 14, 13, 13, 13, 13, 6,  12, 12, 12, 12, 12, 12, 17, 17, 17, 18,
+    19, 19, 13, 14, 15, 16, 16, 17, 17, 10, 11, 14, 14, 14, 14, 13, 9,  7,  12,
+    11, 10, 10, 10, 9,  5,  8,  8,  7,  7,  7,  5,  5,  6,  6,  6,  6,  6,  3,
+    6,  4,  4,  4,  4,  4,  3,  7,  8,  9,  10, 11, 11, 13, 2,  7,  8,  8,  9,
+    8,  10, 2,  6,  6,  5,  6,  6,  6,  2,  3,  3,  2,  2,  3,  3,  1,  3,  2,
+    2,  2,  0,  2,  2,  5,  5,  4,  2,  1,  2,  3,  6,  7,  4,  3,  2,  2,  3,
+    4,  5,  7,  8,  10, 11, 3,  4,  5,  6,  7,  7,  8,  3,  6,  5,  4,  4,  4,
+    5,  3,  5,  5,  3,  2,  1,  2,  3,  7,  7,  5,  4,  2,  1,  5,  7,  10, 7,
+    4,  3,  0,  6,  8,  10, 8,  5,  3,  1,  6,  8,  7,  5,  7,  8,  9,  6,  8,
+    7,  6,  6,  6,  6,  6,  8,  9,  5,  3,  3,  3,  6,  8,  10, 7,  4,  2,  0,
+    7,  10, 11, 8,  5,  3,  2,  8,  10, 11, 10, 6,  4,  2,  9,  10, 11, 11, 7,
+    4,  3,  19, 22, 26, 30, 30, 27, 23, 17, 21, 25, 29, 29, 25, 22, 16, 20, 23,
+    26, 28, 24, 20, 15, 17, 21, 24, 26, 23, 18, 12, 14, 17, 20, 24, 22, 18, 10,
+    13, 16, 19, 22, 22, 18, 8,  11, 15, 18, 20, 21, 18, 16, 20, 23, 27, 25, 23,
+    20, 15, 18, 22, 26, 26, 22, 18, 14, 17, 21, 23, 23, 20, 16, 12, 15, 18, 21,
+    20, 19, 14, 9,  12, 15, 17, 17, 17, 14, 8,  11, 14, 16, 16, 16, 14, 6,  9,
+    13, 15, 14, 15, 14, 14, 17, 19, 19, 21, 20, 15, 12, 15, 17, 18, 19, 18, 13,
+    11, 14, 16, 16, 16, 16, 11, 10, 12, 13, 12, 13, 13, 9,  6,  9,  10, 10, 10,
+    10, 9,  5,  8,  9,  9,  9,  9,  9,  6,  7,  8,  8,  8,  8,  8,  11, 11, 12,
+    13, 14, 15, 9,  10, 10, 10, 11, 11, 12, 7,  8,  9,  9,  9,  8,  8,  5,  4,
+    6,  5,  5,  5,  5,  4,  3,  3,  3,  3,  3,  2,  2,  4,  3,  2,  2,  2,  2,
+    1,  6,  7,  4,  3,  2,  1,  0,  3,  3,  5,  6,  7,  8,  9,  2,  3,  4,  5,
+    6,  6,  7,  2,  3,  3,  3,  3,  3,  4,  2,  5,  3,  2,  2,  2,  1,  3,  6,
+    4,  3,  3,  2,  0,  4,  7,  6,  4,  3,  2,  2,  6,  8,  8,  6,  4,  3,  2,
+    6,  6,  5,  5,  6,  7,  8,  6,  7,  5,  5,  5,  5,  5,  6,  8,  6,  4,  3,
+    2,  2,  6,  8,  6,  5,  4,  3,  1,  6,  7,  9,  8,  5,  3,  2,  7,  9,  13,
+    11, 7,  4,  2,  8,  10, 14, 13, 9,  5,  3,  8,  11, 9,  6,  5,  7,  7,  8,
+    11, 11, 7,  4,  4,  4,  8,  11, 13, 7,  4,  3,  2,  8,  10, 14, 8,  5,  3,
+    2,  8,  11, 15, 13, 8,  5,  3,  9,  13, 17, 17, 10, 6,  3,  11, 15, 18, 18,
+    12, 7,  4,  23, 25, 27, 31, 31, 29, 25, 23, 24, 26, 29, 30, 27, 25, 21, 24,
+    27, 27, 28, 25, 22, 20, 21, 24, 25, 26, 22, 16, 17, 19, 20, 21, 20, 18, 16,
+    12, 14, 16, 16, 18, 18, 16, 8,  11, 14, 16, 18, 18, 16, 21, 24, 25, 28, 27,
+    26, 24, 20, 23, 25, 27, 27, 24, 23, 18, 22, 25, 24, 25, 22, 20, 17, 20, 22,
+    22, 21, 20, 15, 14, 16, 18, 19, 16, 15, 14, 9,  12, 14, 15, 14, 15, 15, 6,
+    8,  12, 14, 14, 15, 15, 19, 22, 23, 24, 24, 24, 21, 16, 20, 22, 23, 24, 23,
+    21, 15, 19, 21, 22, 22, 21, 19, 14, 17, 18, 18, 18, 19, 14, 9,  13, 14, 15,
+    14, 14, 13, 4,  9,  10, 11, 12, 13, 13, 7,  7,  8,  10, 11, 12, 13, 15, 17,
+    18, 20, 20, 21, 16, 14, 15, 16, 18, 18, 18, 14, 11, 13, 15, 15, 15, 15, 12,
+    7,  11, 11, 11, 12, 11, 10, 5,  7,  7,  7,  6,  7,  6,  3,  3,  3,  3,  5,
+    6,  6,  6,  6,  4,  2,  3,  4,  5,  8,  10, 11, 13, 14, 15, 16, 5,  9,  10,
+    12, 12, 13, 15, 5,  8,  9,  9,  10, 10, 11, 5,  6,  6,  6,  6,  6,  5,  3,
+    3,  3,  3,  3,  2,  4,  0,  3,  3,  2,  2,  2,  5,  4,  4,  5,  3,  3,  3,
+    3,  7,  8,  8,  9,  11, 14, 15, 7,  9,  8,  9,  9,  11, 13, 7,  9,  9,  9,
+    7,  8,  10, 7,  8,  8,  8,  6,  5,  5,  5,  7,  9,  7,  5,  3,  2,  3,  5,
+    10, 8,  6,  3,  2,  4,  7,  10, 10, 7,  4,  2,  10, 13, 13, 10, 9,  12, 13,
+    10, 14, 14, 11, 9,  9,  11, 10, 13, 16, 11, 8,  7,  8,  10, 13, 15, 10, 8,
+    6,  2,  9,  11, 14, 11, 7,  4,  2,  7,  10, 13, 12, 8,  5,  3,  7,  11, 13,
+    13, 9,  6,  3,  30, 34, 36, 38, 39, 38, 34, 29, 33, 36, 38, 38, 35, 33, 27,
+    31, 33, 36, 37, 34, 30, 26, 29, 31, 35, 35, 30, 24, 23, 26, 27, 30, 29, 27,
+    24, 18, 22, 23, 25, 27, 26, 24, 14, 18, 21, 24, 26, 26, 24, 27, 31, 35, 37,
+    36, 35, 31, 25, 30, 33, 36, 36, 33, 29, 24, 28, 31, 34, 34, 31, 28, 23, 26,
+    30, 32, 29, 28, 22, 19, 23, 25, 27, 25, 24, 22, 15, 18, 20, 22, 23, 24, 22,
+    11, 15, 19, 22, 22, 22, 22, 24, 29, 30, 32, 33, 32, 28, 22, 26, 30, 31, 30,
+    31, 26, 22, 25, 28, 28, 28, 28, 23, 19, 23, 24, 25, 25, 25, 18, 13, 19, 21,
+    21, 19, 19, 19, 7,  15, 16, 16, 18, 18, 19, 7,  11, 14, 15, 16, 17, 17, 21,
+    23, 24, 26, 27, 27, 21, 18, 21, 22, 24, 24, 24, 19, 14, 20, 20, 21, 21, 21,
+    17, 11, 17, 17, 17, 17, 17, 15, 9,  12, 12, 13, 12, 12, 11, 6,  8,  8,  9,
+    9,  10, 8,  7,  5,  6,  7,  8,  8,  8,  11, 14, 16, 17, 18, 19, 20, 7,  13,
+    14, 16, 17, 16, 19, 7,  13, 13, 13, 14, 14, 15, 7,  9,  10, 9,  9,  9,  8,
+    5,  3,  5,  5,  4,  5,  7,  3,  0,  2,  2,  1,  3,  7,  3,  3,  3,  2,  2,
+    2,  5,  7,  9,  10, 12, 15, 18, 20, 7,  7,  9,  11, 13, 16, 16, 7,  8,  8,
+    8,  10, 12, 12, 7,  7,  7,  7,  6,  7,  6,  5,  5,  6,  5,  3,  2,  5,  2,
+    3,  5,  4,  3,  2,  4,  3,  5,  6,  6,  4,  2,  3,  9,  11, 11, 9,  12, 16,
+    17, 9,  11, 12, 10, 10, 13, 15, 9,  11, 13, 9,  7,  9,  11, 9,  10, 12, 8,
+    6,  5,  4,  7,  9,  10, 8,  4,  2,  3,  5,  7,  9,  8,  4,  3,  2,  4,  6,
+    9,  9,  5,  3,  2,  32, 36, 40, 42, 43, 41, 37, 31, 35, 39, 42, 42, 39, 35,
+    29, 33, 38, 40, 41, 37, 33, 28, 30, 35, 37, 39, 34, 27, 25, 27, 30, 32, 33,
+    30, 27, 21, 23, 26, 28, 31, 31, 27, 16, 20, 24, 27, 30, 30, 27, 29, 34, 37,
+    39, 39, 37, 34, 28, 33, 35, 38, 39, 35, 32, 26, 30, 34, 36, 36, 33, 28, 25,
+    28, 31, 33, 34, 30, 24, 21, 24, 27, 29, 27, 26, 24, 16, 20, 23, 25, 25, 27,
+    24, 13, 17, 21, 24, 24, 25, 24, 26, 30, 32, 34, 35, 34, 29, 25, 28, 31, 33,
+    33, 31, 26, 22, 26, 30, 30, 29, 29, 24, 19, 25, 26, 26, 27, 25, 20, 13, 21,
+    22, 23, 20, 21, 20, 8,  17, 18, 18, 18, 19, 20, 7,  14, 16, 16, 17, 17, 18,
+    23, 24, 25, 26, 28, 29, 21, 19, 22, 24, 25, 26, 26, 19, 15, 21, 22, 22, 22,
+    22, 18, 11, 18, 18, 18, 18, 17, 16, 9,  13, 15, 14, 13, 12, 12, 7,  8,  10,
+    10, 10, 11, 9,  7,  5,  8,  9,  9,  10, 7,  11, 16, 17, 18, 19, 19, 21, 7,
+    15, 16, 17, 18, 17, 20, 7,  13, 14, 14, 14, 14, 14, 7,  9,  11, 10, 10, 9,
+    8,  5,  3,  6,  6,  4,  5,  6,  3,  2,  0,  2,  3,  4,  6,  4,  3,  3,  2,
+    2,  3,  5,  7,  10, 12, 13, 16, 18, 20, 7,  9,  11, 12, 14, 16, 16, 7,  7,
+    9,  9,  11, 13, 12, 7,  6,  7,  7,  7,  7,  6,  5,  4,  9,  9,  5,  3,  5,
+    3,  5,  11, 11, 7,  2,  5,  1,  7,  11, 12, 9,  4,  4,  9,  15, 14, 10, 14,
+    17, 18, 8,  15, 16, 10, 12, 14, 14, 9,  14, 18, 11, 8,  10, 11, 8,  14, 18,
+    12, 7,  5,  5,  7,  13, 17, 14, 9,  4,  4,  7,  13, 16, 14, 11, 6,  3,  8,
+    13, 15, 15, 12, 8,  2,  30, 33, 38, 42, 43, 38, 36, 29, 33, 37, 41, 41, 38,
+    35, 28, 31, 35, 39, 40, 36, 31, 26, 29, 33, 35, 38, 33, 27, 23, 26, 28, 30,
+    32, 30, 27, 19, 22, 25, 27, 31, 30, 27, 16, 19, 22, 26, 30, 29, 27, 27, 31,
+    34, 39, 38, 35, 32, 26, 30, 34, 38, 37, 34, 30, 26, 29, 32, 35, 34, 31, 26,
+    23, 25, 30, 32, 31, 29, 23, 20, 23, 26, 28, 26, 26, 22, 16, 19, 22, 23, 23,
+    25, 23, 12, 17, 20, 23, 23, 24, 23, 25, 29, 30, 31, 34, 32, 27, 23, 27, 29,
+    31, 31, 29, 25, 22, 26, 28, 28, 28, 27, 22, 18, 23, 25, 25, 25, 23, 18, 12,
+    20, 21, 21, 20, 19, 18, 7,  16, 17, 17, 17, 18, 18, 6,  14, 16, 16, 16, 16,
+    16, 21, 23, 24, 25, 26, 26, 20, 18, 22, 23, 23, 24, 23, 17, 14, 20, 21, 20,
+    21, 21, 16, 10, 17, 17, 17, 17, 16, 14, 8,  12, 13, 13, 12, 11, 11, 7,  8,
+    10, 10, 9,  10, 7,  6,  5,  8,  8,  8,  8,  5,  9,  15, 15, 17, 17, 17, 19,
+    6,  13, 14, 15, 15, 14, 17, 6,  12, 12, 12, 12, 11, 12, 6,  8,  9,  9,  8,
+    7,  7,  4,  2,  5,  4,  3,  4,  5,  2,  2,  2,  0,  2,  3,  4,  3,  2,  3,
+    2,  2,  2,  4,  6,  9,  10, 11, 13, 16, 17, 6,  7,  9,  10, 12, 13, 14, 6,
+    7,  7,  8,  9,  10, 9,  6,  6,  7,  7,  5,  6,  4,  4,  5,  9,  9,  4,  2,
+    3,  2,  5,  11, 11, 6,  1,  3,  2,  6,  11, 13, 8,  3,  3,  9,  15, 14, 9,
+    12, 14, 15, 9,  15, 17, 10, 10, 12, 12, 9,  15, 18, 11, 7,  9,  9,  9,  14,
+    19, 12, 7,  4,  3,  7,  13, 19, 15, 8,  3,  2,  7,  13, 18, 17, 10, 5,  2,
+    8,  14, 19, 18, 13, 7,  2,  29, 31, 36, 40, 40, 38, 34, 27, 30, 35, 39, 38,
+    36, 32, 25, 29, 33, 37, 38, 33, 30, 24, 27, 31, 34, 36, 32, 26, 21, 24, 26,
+    30, 32, 30, 25, 18, 20, 23, 27, 30, 28, 26, 16, 18, 22, 25, 29, 29, 26, 26,
+    29, 33, 37, 35, 34, 30, 25, 28, 32, 35, 36, 32, 27, 22, 27, 30, 33, 33, 30,
+    25, 22, 24, 26, 30, 30, 27, 21, 19, 21, 23, 26, 25, 25, 22, 16, 18, 20, 23,
+    24, 24, 21, 12, 16, 19, 22, 22, 23, 21, 23, 26, 28, 29, 31, 29, 25, 22, 25,
+    27, 29, 28, 27, 23, 20, 24, 26, 26, 26, 25, 20, 17, 22, 22, 22, 23, 22, 16,
+    11, 18, 19, 19, 18, 18, 16, 7,  16, 17, 16, 16, 17, 16, 7,  15, 15, 15, 15,
+    16, 15, 20, 21, 21, 22, 24, 24, 17, 17, 20, 20, 21, 21, 21, 15, 13, 19, 19,
+    18, 18, 18, 13, 9,  16, 15, 15, 15, 14, 12, 7,  11, 11, 11, 10, 10, 9,  7,
+    8,  10, 9,  9,  9,  6,  7,  5,  8,  8,  8,  8,  4,  8,  13, 14, 14, 15, 14,
+    16, 5,  12, 12, 13, 13, 11, 15, 5,  10, 10, 10, 10, 9,  10, 5,  6,  7,  6,
+    6,  5,  5,  3,  1,  3,  2,  2,  2,  3,  2,  1,  3,  2,  0,  2,  3,  4,  2,
+    4,  2,  2,  1,  3,  4,  6,  7,  9,  10, 13, 14, 4,  5,  6,  8,  9,  10, 11,
+    4,  7,  7,  6,  7,  7,  7,  4,  6,  7,  7,  3,  4,  3,  2,  5,  10, 8,  5,
+    1,  2,  0,  6,  11, 11, 6,  2,  2,  3,  7,  12, 12, 8,  3,  2,  9,  12, 11,
+    8,  9,  11, 12, 9,  13, 12, 9,  8,  9,  9,  9,  13, 14, 9,  6,  6,  7,  9,
+    12, 14, 10, 7,  2,  2,  8,  12, 15, 13, 8,  3,  2,  8,  13, 16, 15, 10, 5,
+    1,  8,  13, 16, 16, 11, 7,  2,  26, 28, 32, 36, 37, 34, 31, 24, 27, 31, 36,
+    36, 33, 29, 23, 26, 29, 33, 34, 32, 27, 21, 24, 27, 31, 33, 29, 24, 18, 21,
+    24, 27, 31, 27, 24, 16, 18, 22, 25, 28, 27, 24, 15, 17, 21, 23, 27, 27, 24,
+    23, 27, 30, 35, 33, 31, 27, 21, 26, 29, 32, 32, 28, 25, 21, 23, 28, 30, 31,
+    28, 23, 20, 22, 24, 27, 27, 25, 20, 17, 18, 21, 24, 24, 23, 20, 15, 17, 19,
+    22, 22, 22, 20, 12, 16, 18, 20, 20, 21, 19, 21, 24, 25, 27, 28, 27, 22, 19,
+    22, 25, 25, 26, 24, 20, 18, 21, 23, 23, 23, 22, 18, 16, 19, 20, 20, 20, 19,
+    15, 10, 16, 16, 16, 16, 16, 14, 7,  15, 16, 15, 15, 15, 14, 7,  14, 14, 13,
+    14, 14, 13, 18, 19, 18, 20, 21, 21, 14, 15, 17, 18, 18, 19, 18, 12, 12, 16,
+    16, 16, 15, 15, 11, 8,  14, 13, 12, 12, 11, 10, 6,  10, 9,  9,  8,  8,  7,
+    6,  8,  8,  7,  7,  7,  4,  7,  4,  6,  6,  6,  6,  3,  8,  10, 11, 12, 12,
+    12, 13, 3,  9,  9,  10, 11, 9,  11, 3,  8,  7,  7,  7,  7,  7,  3,  4,  4,
+    3,  3,  3,  3,  1,  1,  1,  1,  2,  1,  2,  2,  3,  4,  3,  2,  0,  3,  3,
+    5,  5,  3,  3,  2,  2,  3,  5,  6,  7,  8,  10, 11, 3,  4,  6,  7,  7,  8,
+    8,  3,  4,  4,  4,  5,  5,  6,  3,  4,  4,  3,  2,  2,  2,  2,  5,  6,  4,
+    3,  2,  2,  3,  6,  8,  6,  3,  2,  1,  5,  7,  8,  7,  4,  3,  0,  5,  7,
+    6,  6,  8,  9,  10, 5,  7,  7,  6,  6,  7,  7,  6,  7,  8,  4,  3,  4,  4,
+    5,  7,  8,  5,  3,  2,  1,  5,  8,  9,  7,  4,  2,  0,  6,  8,  10, 9,  5,
+    3,  2,  7,  9,  10, 10, 6,  4,  3,  20, 24, 29, 32, 32, 29, 25, 20, 23, 27,
+    31, 31, 28, 25, 18, 21, 25, 29, 30, 25, 22, 16, 19, 22, 26, 28, 23, 20, 13,
+    16, 19, 22, 26, 23, 19, 11, 14, 17, 20, 24, 23, 20, 10, 13, 16, 19, 22, 23,
+    20, 18, 21, 25, 29, 28, 26, 22, 16, 20, 24, 28, 28, 24, 20, 15, 19, 23, 25,
+    24, 23, 18, 14, 17, 20, 22, 22, 20, 16, 11, 13, 16, 18, 19, 18, 16, 10, 12,
+    15, 17, 18, 17, 15, 7,  11, 14, 16, 16, 16, 16, 15, 19, 21, 21, 23, 21, 17,
+    14, 17, 20, 21, 21, 20, 15, 13, 16, 18, 17, 18, 18, 14, 12, 14, 15, 15, 15,
+    15, 11, 8,  11, 12, 12, 12, 12, 11, 5,  10, 11, 10, 10, 10, 11, 5,  8,  9,
+    9,  10, 9,  9,  14, 13, 14, 14, 16, 17, 10, 11, 11, 12, 13, 13, 14, 8,  9,
+    10, 11, 11, 10, 10, 7,  5,  8,  7,  7,  7,  7,  6,  4,  5,  5,  4,  4,  4,
+    3,  5,  3,  3,  3,  3,  3,  3,  6,  5,  3,  2,  2,  2,  2,  4,  5,  6,  7,
+    8,  9,  10, 2,  4,  5,  6,  6,  7,  8,  2,  3,  4,  4,  4,  4,  5,  2,  3,
+    2,  2,  2,  1,  2,  1,  6,  4,  3,  3,  2,  2,  4,  7,  7,  5,  3,  2,  0,
+    6,  8,  8,  5,  4,  3,  1,  5,  5,  5,  5,  6,  8,  9,  4,  6,  5,  5,  5,
+    6,  6,  5,  7,  5,  4,  3,  3,  3,  5,  7,  7,  5,  4,  3,  0,  6,  8,  8,
+    6,  4,  3,  1,  7,  9,  10, 8,  5,  3,  2,  8,  9,  11, 10, 6,  4,  2,  8,
+    10, 7,  5,  6,  7,  7,  8,  9,  9,  6,  5,  5,  5,  8,  10, 10, 5,  4,  2,
+    2,  8,  10, 11, 7,  5,  3,  2,  9,  10, 12, 10, 6,  4,  3,  9,  10, 14, 13,
+    8,  5,  3,  9,  11, 14, 14, 9,  5,  3,  27, 30, 32, 34, 33, 31, 30, 26, 29,
+    32, 33, 33, 30, 28, 25, 29, 30, 31, 31, 27, 24, 24, 25, 27, 28, 28, 23, 17,
+    20, 23, 24, 23, 21, 18, 17, 17, 19, 19, 17, 19, 18, 17, 11, 13, 16, 18, 18,
+    18, 17, 25, 27, 31, 32, 31, 30, 30, 24, 28, 30, 31, 31, 29, 26, 22, 25, 28,
+    30, 28, 26, 23, 21, 24, 26, 26, 25, 21, 16, 18, 20, 22, 22, 17, 16, 16, 13,
+    16, 17, 16, 16, 16, 16, 7,  11, 14, 16, 15, 16, 16, 22, 26, 28, 29, 30, 29,
+    26, 21, 25, 27, 28, 28, 27, 24, 19, 23, 25, 26, 26, 25, 20, 18, 21, 22, 22,
+    22, 20, 15, 11, 17, 18, 18, 15, 15, 14, 5,  12, 13, 13, 13, 13, 15, 4,  7,
+    10, 11, 12, 13, 13, 19, 20, 22, 23, 25, 25, 22, 17, 19, 20, 22, 23, 23, 20,
+    14, 18, 19, 19, 19, 18, 16, 11, 16, 15, 15, 15, 13, 13, 8,  11, 11, 10, 8,
+    8,  9,  5,  5,  5,  5,  6,  7,  7,  4,  3,  2,  4,  5,  5,  7,  13, 16, 18,
+    19, 20, 22, 22, 9,  15, 17, 18, 18, 19, 20, 9,  15, 15, 16, 16, 16, 14, 9,
+    11, 12, 12, 11, 9,  7,  7,  6,  7,  6,  4,  3,  7,  4,  3,  4,  3,  4,  3,
+    6,  0,  3,  4,  3,  4,  4,  4,  10, 11, 13, 14, 17, 20, 21, 10, 10, 12, 13,
+    16, 17, 18, 10, 11, 11, 11, 12, 14, 13, 10, 10, 10, 9,  8,  7,  6,  8,  8,
+    9,  8,  5,  4,  5,  5,  7,  9,  8,  5,  4,  3,  4,  5,  8,  9,  7,  5,  3,
+    12, 14, 14, 13, 15, 19, 20, 12, 14, 15, 13, 13, 15, 17, 12, 14, 16, 12, 10,
+    11, 11, 12, 13, 15, 11, 9,  6,  3,  10, 12, 14, 11, 7,  4,  3,  9,  10, 13,
+    12, 8,  5,  4,  7,  10, 12, 13, 9,  6,  4,  34, 37, 39, 42, 42, 40, 38, 32,
+    35, 39, 42, 42, 39, 36, 31, 34, 37, 39, 39, 36, 31, 29, 32, 34, 37, 36, 31,
+    25, 26, 29, 30, 31, 30, 27, 25, 22, 24, 25, 25, 28, 27, 25, 16, 19, 21, 25,
+    27, 27, 25, 30, 34, 38, 41, 40, 37, 35, 29, 33, 37, 39, 40, 36, 33, 27, 32,
+    35, 37, 36, 33, 30, 26, 29, 33, 34, 32, 28, 23, 23, 26, 28, 29, 27, 24, 23,
+    17, 21, 23, 22, 24, 24, 23, 11, 16, 20, 22, 23, 24, 23, 27, 31, 34, 35, 36,
+    35, 30, 26, 29, 33, 34, 35, 33, 29, 23, 29, 31, 31, 31, 30, 25, 21, 26, 27,
+    28, 27, 25, 20, 15, 22, 24, 23, 20, 20, 20, 9,  18, 18, 17, 17, 18, 20, 6,
+    13, 15, 15, 16, 17, 18, 25, 26, 27, 28, 30, 31, 25, 20, 24, 26, 27, 27, 27,
+    23, 17, 23, 24, 24, 24, 23, 21, 13, 20, 20, 20, 20, 18, 17, 11, 14, 15, 15,
+    12, 12, 13, 8,  8,  11, 9,  10, 11, 10, 6,  4,  7,  7,  8,  9,  9,  13, 19,
+    20, 22, 22, 24, 25, 10, 19, 19, 21, 21, 21, 22, 10, 17, 18, 18, 18, 17, 17,
+    10, 12, 15, 14, 13, 11, 9,  7,  6,  10, 9,  5,  6,  7,  4,  3,  3,  2,  2,
+    5,  8,  3,  0,  3,  2,  2,  3,  7,  10, 14, 15, 17, 20, 22, 24, 10, 12, 14,
+    16, 18, 19, 20, 10, 10, 12, 12, 15, 16, 14, 10, 9,  8,  9,  10, 9,  7,  8,
+    7,  7,  6,  4,  3,  7,  5,  5,  7,  5,  4,  2,  6,  2,  4,  6,  6,  4,  3,
+    5,  10, 13, 13, 13, 17, 21, 22, 10, 13, 13, 12, 16, 18, 19, 10, 13, 14, 11,
+    11, 13, 13, 10, 12, 13, 10, 8,  7,  6,  8,  10, 11, 9,  5,  3,  5,  7,  8,
+    9,  8,  5,  3,  3,  5,  7,  9,  9,  6,  4,  2,  36, 39, 42, 47, 46, 43, 40,
+    33, 38, 41, 46, 46, 42, 38, 33, 35, 40, 43, 43, 39, 35, 31, 33, 37, 39, 41,
+    36, 31, 27, 30, 34, 35, 35, 32, 30, 23, 26, 28, 30, 33, 33, 30, 19, 22, 26,
+    29, 32, 32, 30, 32, 36, 41, 44, 42, 41, 38, 31, 34, 39, 42, 42, 39, 35, 29,
+    34, 37, 39, 40, 38, 32, 28, 31, 35, 36, 36, 32, 26, 23, 27, 30, 32, 30, 29,
+    26, 18, 23, 26, 27, 27, 27, 27, 13, 20, 23, 26, 26, 26, 26, 30, 34, 35, 37,
+    38, 38, 32, 27, 31, 35, 36, 36, 35, 30, 25, 30, 34, 34, 33, 32, 27, 21, 28,
+    29, 29, 29, 28, 22, 15, 24, 26, 25, 23, 23, 22, 9,  20, 21, 20, 20, 21, 22,
+    8,  17, 18, 19, 19, 20, 20, 25, 28, 29, 31, 31, 32, 26, 20, 26, 28, 29, 29,
+    29, 23, 17, 24, 25, 26, 25, 25, 21, 14, 21, 22, 21, 22, 20, 18, 11, 15, 18,
+    18, 15, 14, 14, 9,  10, 13, 13, 13, 13, 11, 8,  5,  10, 10, 11, 12, 8,  13,
+    20, 20, 22, 23, 22, 25, 10, 18, 19, 21, 21, 20, 23, 9,  16, 18, 17, 17, 17,
+    17, 10, 11, 14, 13, 13, 10, 10, 7,  5,  10, 9,  6,  7,  8,  5,  3,  3,  3,
+    3,  5,  8,  4,  3,  0,  2,  3,  5,  7,  8,  14, 15, 17, 19, 22, 23, 9,  12,
+    14, 15, 17, 19, 19, 9,  9,  12, 12, 14, 15, 14, 9,  8,  8,  8,  10, 9,  7,
+    6,  5,  7,  7,  3,  5,  7,  4,  3,  8,  7,  5,  4,  7,  2,  4,  8,  8,  6,
+    2,  5,  9,  12, 12, 13, 17, 20, 21, 9,  12, 14, 11, 15, 17, 18, 9,  12, 15,
+    9,  11, 13, 13, 9,  11, 14, 10, 7,  7,  6,  7,  10, 13, 11, 6,  2,  5,  5,
+    10, 11, 10, 7,  4,  4,  5,  8,  10, 10, 8,  6,  3,  32, 36, 39, 43, 44, 41,
+    38, 31, 35, 38, 43, 44, 39, 35, 29, 33, 37, 40, 40, 38, 33, 28, 30, 34, 37,
+    38, 34, 29, 25, 28, 30, 33, 35, 31, 29, 22, 24, 26, 29, 32, 31, 28, 18, 21,
+    24, 28, 31, 32, 29, 29, 34, 38, 40, 41, 37, 34, 28, 32, 35, 39, 39, 36, 31,
+    27, 30, 35, 38, 37, 33, 29, 25, 28, 31, 34, 33, 31, 24, 21, 25, 27, 29, 28,
+    27, 24, 17, 21, 23, 25, 26, 27, 24, 13, 18, 22, 24, 24, 25, 25, 27, 30, 33,
+    34, 35, 33, 29, 25, 29, 31, 33, 34, 32, 27, 23, 28, 30, 30, 30, 29, 24, 19,
+    25, 25, 26, 26, 26, 20, 13, 21, 22, 23, 21, 20, 19, 8,  17, 19, 19, 19, 19,
+    19, 7,  16, 17, 18, 18, 19, 18, 23, 25, 26, 27, 29, 28, 21, 18, 23, 24, 26,
+    26, 25, 19, 15, 22, 23, 22, 22, 21, 18, 12, 19, 19, 19, 18, 17, 16, 9,  13,
+    15, 15, 13, 12, 12, 8,  9,  11, 11, 11, 11, 9,  8,  5,  10, 9,  10, 10, 6,
+    11, 16, 18, 19, 20, 18, 21, 7,  15, 16, 17, 17, 16, 19, 7,  12, 14, 14, 13,
+    13, 14, 7,  8,  11, 10, 10, 7,  8,  5,  2,  6,  6,  4,  4,  6,  3,  2,  2,
+    2,  2,  3,  5,  3,  2,  2,  0,  2,  3,  4,  6,  10, 11, 13, 15, 16, 19, 6,
+    9,  10, 11, 13, 14, 15, 6,  7,  8,  9,  10, 11, 10, 6,  5,  6,  5,  6,  7,
+    5,  4,  3,  7,  7,  3,  3,  4,  2,  3,  10, 10, 5,  2,  4,  1,  4,  10, 12,
+    7,  2,  3,  7,  13, 12, 10, 13, 16, 16, 7,  13, 15, 9,  11, 13, 13, 7,  13,
+    17, 10, 8,  10, 10, 7,  12, 17, 11, 5,  5,  4,  6,  11, 17, 13, 7,  2,  3,
+    5,  12, 17, 16, 9,  4,  3,  6,  12, 17, 17, 11, 6,  2,  30, 35, 39, 42, 42,
+    39, 36, 29, 34, 38, 41, 42, 38, 34, 28, 31, 36, 39, 41, 36, 33, 27, 28, 32,
+    36, 38, 33, 28, 24, 25, 29, 33, 34, 31, 28, 20, 22, 26, 28, 32, 31, 28, 18,
+    20, 24, 27, 30, 31, 28, 28, 31, 35, 40, 39, 35, 32, 26, 30, 34, 38, 39, 34,
+    30, 25, 28, 32, 36, 36, 32, 27, 24, 26, 29, 33, 33, 30, 23, 20, 23, 26, 28,
+    28, 26, 23, 16, 20, 23, 25, 26, 26, 24, 13, 19, 21, 24, 24, 24, 23, 25, 29,
+    30, 32, 33, 31, 27, 23, 27, 29, 31, 30, 30, 25, 21, 26, 28, 29, 28, 27, 22,
+    18, 25, 25, 25, 25, 24, 18, 12, 20, 22, 21, 21, 19, 18, 8,  18, 18, 19, 19,
+    18, 18, 8,  16, 18, 17, 18, 18, 16, 20, 24, 24, 25, 26, 25, 19, 17, 22, 22,
+    23, 24, 22, 17, 14, 20, 21, 20, 20, 20, 15, 11, 17, 17, 17, 17, 16, 14, 8,
+    12, 14, 14, 13, 12, 11, 7,  9,  11, 11, 11, 11, 7,  7,  6,  10, 9,  9,  10,
+    5,  9,  15, 16, 17, 18, 15, 18, 6,  14, 15, 15, 16, 13, 16, 6,  11, 12, 12,
+    12, 10, 12, 6,  6,  9,  9,  8,  6,  7,  4,  2,  5,  4,  4,  3,  4,  3,  2,
+    2,  2,  2,  2,  4,  4,  2,  3,  2,  0,  2,  3,  5,  8,  9,  10, 12, 14, 16,
+    5,  6,  8,  9,  11, 11, 12, 5,  5,  6,  6,  8,  9,  8,  4,  4,  6,  5,  4,
+    5,  4,  2,  4,  7,  7,  3,  2,  3,  2,  4,  10, 9,  4,  1,  3,  2,  5,  10,
+    11, 6,  2,  2,  7,  11, 10, 7,  11, 13, 14, 7,  11, 11, 8,  9,  11, 11, 7,
+    11, 13, 8,  6,  7,  8,  7,  11, 13, 9,  5,  3,  3,  6,  10, 14, 12, 7,  2,
+    3,  6,  11, 15, 14, 8,  3,  2,  7,  12, 15, 15, 10, 5,  1,  27, 31, 36, 39,
+    39, 36, 33, 27, 30, 34, 38, 39, 36, 32, 24, 27, 34, 36, 37, 33, 30, 24, 26,
+    29, 32, 36, 32, 26, 21, 23, 26, 29, 32, 29, 26, 18, 20, 23, 26, 30, 29, 26,
+    17, 19, 22, 25, 28, 29, 26, 24, 28, 32, 37, 35, 33, 29, 24, 27, 32, 34, 36,
+    30, 27, 23, 26, 29, 32, 31, 30, 25, 22, 23, 27, 29, 29, 27, 22, 18, 20, 23,
+    26, 25, 24, 21, 16, 18, 20, 23, 23, 24, 22, 12, 17, 20, 22, 22, 23, 21, 23,
+    26, 28, 29, 30, 28, 23, 21, 25, 27, 28, 28, 27, 22, 20, 23, 26, 25, 26, 25,
+    20, 17, 22, 21, 21, 21, 21, 16, 11, 18, 18, 18, 18, 18, 16, 8,  16, 17, 16,
+    17, 16, 16, 8,  15, 15, 15, 15, 15, 14, 20, 21, 21, 22, 23, 23, 15, 16, 19,
+    20, 20, 21, 19, 14, 13, 18, 18, 18, 17, 17, 12, 9,  15, 14, 14, 13, 13, 12,
+    7,  11, 11, 10, 10, 10, 8,  7,  9,  10, 9,  9,  9,  5,  8,  5,  8,  8,  8,
+    8,  3,  8,  12, 13, 14, 14, 13, 15, 4,  11, 12, 12, 12, 10, 13, 4,  9,  9,
+    9,  9,  8,  9,  4,  5,  6,  5,  5,  4,  5,  3,  2,  2,  2,  2,  2,  3,  3,
+    2,  3,  2,  1,  2,  3,  4,  3,  5,  3,  2,  0,  3,  3,  6,  7,  8,  9,  11,
+    13, 3,  5,  7,  8,  8,  9,  10, 3,  4,  5,  5,  6,  6,  6,  3,  3,  3,  2,
+    2,  3,  3,  1,  4,  6,  4,  3,  0,  3,  2,  6,  8,  5,  4,  2,  2,  4,  7,
+    8,  7,  4,  2,  2,  4,  6,  6,  7,  9,  10, 11, 4,  6,  7,  6,  7,  8,  8,
+    4,  6,  7,  4,  4,  4,  6,  4,  6,  8,  4,  2,  1,  2,  3,  8,  9,  7,  4,
+    2,  2,  6,  9,  9,  9,  5,  3,  0,  7,  9,  9,  9,  6,  4,  2,  22, 26, 29,
+    33, 33, 30, 27, 21, 24, 29, 33, 32, 29, 26, 19, 23, 27, 30, 32, 28, 24, 18,
+    21, 24, 27, 30, 26, 21, 15, 17, 21, 24, 27, 24, 21, 13, 15, 18, 22, 25, 25,
+    21, 12, 15, 18, 20, 24, 24, 21, 20, 23, 27, 31, 29, 26, 23, 18, 22, 26, 29,
+    29, 26, 21, 17, 20, 24, 27, 27, 24, 20, 16, 18, 21, 24, 23, 22, 17, 13, 15,
+    17, 20, 20, 20, 17, 12, 13, 16, 18, 19, 19, 16, 9,  12, 16, 18, 17, 18, 17,
+    18, 20, 23, 24, 25, 23, 19, 17, 19, 21, 22, 22, 21, 17, 15, 18, 20, 20, 20,
+    19, 15, 14, 16, 16, 16, 16, 16, 12, 9,  13, 14, 13, 13, 13, 12, 6,  12, 13,
+    12, 12, 12, 12, 6,  10, 10, 11, 11, 11, 10, 15, 15, 16, 17, 18, 18, 11, 14,
+    14, 14, 15, 15, 15, 9,  11, 12, 13, 12, 12, 11, 8,  6,  11, 9,  9,  9,  9,
+    7,  4,  7,  6,  6,  5,  5,  4,  5,  5,  5,  5,  4,  4,  2,  6,  4,  3,  3,
+    3,  3,  2,  6,  7,  7,  8,  9,  10, 11, 2,  5,  6,  7,  7,  8,  9,  2,  4,
+    5,  4,  5,  5,  5,  2,  2,  2,  2,  1,  2,  2,  1,  4,  3,  3,  2,  1,  2,
+    3,  5,  5,  3,  3,  2,  1,  4,  7,  6,  4,  3,  3,  0,  4,  4,  5,  6,  7,
+    8,  10, 3,  5,  5,  6,  6,  6,  7,  4,  6,  5,  4,  4,  3,  4,  4,  6,  5,
+    4,  3,  2,  1,  4,  7,  8,  5,  4,  3,  0,  5,  7,  9,  7,  4,  3,  2,  6,
+    8,  9,  8,  5,  3,  2,  7,  9,  7,  5,  6,  8,  8,  7,  9,  8,  5,  5,  5,
+    5,  7,  9,  9,  5,  3,  2,  3,  7,  8,  11, 6,  4,  3,  1,  8,  9,  11, 9,
+    5,  3,  2,  8,  9,  11, 11, 6,  4,  2,  8,  10, 12, 12, 8,  5,  3,  24, 27,
+    29, 32, 31, 29, 26, 23, 26, 28, 30, 32, 29, 25, 22, 24, 27, 29, 31, 29, 25,
+    21, 23, 26, 28, 31, 28, 27, 20, 23, 25, 28, 31, 29, 26, 19, 23, 25, 27, 30,
+    29, 27, 16, 20, 23, 26, 29, 28, 27, 22, 24, 27, 30, 28, 25, 24, 21, 24, 26,
+    29, 28, 26, 24, 19, 22, 25, 28, 27, 25, 24, 18, 22, 24, 27, 26, 25, 23, 18,
+    21, 24, 27, 26, 26, 24, 16, 19, 22, 24, 25, 25, 24, 13, 16, 21, 24, 25, 24,
+    24, 19, 22, 23, 24, 24, 23, 19, 18, 20, 23, 23, 24, 23, 19, 17, 20, 22, 22,
+    22, 23, 19, 16, 19, 21, 21, 22, 23, 20, 14, 18, 19, 20, 21, 22, 19, 11, 16,
+    18, 19, 19, 20, 20, 13, 14, 16, 17, 19, 19, 18, 17, 18, 17, 18, 18, 17, 8,
+    15, 15, 16, 16, 17, 16, 9,  13, 14, 15, 15, 15, 15, 10, 9,  14, 14, 14, 15,
+    15, 11, 9,  12, 12, 13, 13, 14, 8,  10, 10, 10, 11, 11, 12, 6,  13, 13, 10,
+    9,  10, 10, 6,  8,  9,  9,  9,  10, 6,  8,  4,  7,  7,  8,  8,  6,  9,  4,
+    6,  5,  6,  6,  5,  7,  4,  4,  4,  4,  5,  5,  7,  5,  4,  4,  4,  4,  3,
+    6,  7,  7,  7,  6,  4,  3,  4,  10, 10, 8,  6,  5,  3,  4,  0,  2,  2,  2,
+    2,  5,  7,  0,  3,  2,  2,  1,  4,  8,  0,  4,  3,  2,  1,  3,  6,  0,  3,
+    3,  2,  1,  2,  5,  2,  3,  5,  5,  3,  3,  4,  5,  6,  9,  8,  5,  3,  3,
+    8,  9,  10, 9,  6,  4,  3,  4,  7,  6,  3,  2,  3,  6,  4,  7,  7,  4,  2,
+    2,  5,  4,  7,  9,  4,  2,  0,  5,  4,  7,  10, 6,  3,  2,  3,  4,  7,  11,
+    9,  5,  3,  3,  5,  9,  12, 11, 7,  4,  3,  7,  11, 12, 13, 8,  5,  3,  25,
+    29, 32, 33, 34, 31, 29, 25, 27, 31, 34, 34, 32, 29, 23, 26, 29, 32, 34, 31,
+    29, 21, 24, 28, 32, 34, 33, 30, 21, 24, 28, 32, 35, 33, 30, 20, 23, 27, 31,
+    34, 33, 30, 18, 23, 25, 30, 33, 33, 31, 23, 25, 29, 31, 30, 27, 25, 21, 25,
+    28, 31, 30, 27, 25, 21, 24, 27, 30, 29, 27, 25, 19, 22, 27, 28, 29, 29, 25,
+    20, 22, 26, 29, 29, 28, 26, 19, 21, 24, 28, 28, 28, 25, 15, 19, 23, 27, 27,
+    27, 26, 21, 25, 25, 26, 26, 24, 19, 19, 22, 25, 24, 25, 24, 19, 18, 22, 23,
+    23, 24, 24, 20, 17, 21, 22, 23, 23, 23, 20, 14, 20, 22, 21, 22, 22, 21, 12,
+    18, 20, 21, 21, 22, 20, 13, 16, 18, 19, 20, 20, 18, 19, 19, 19, 19, 19, 18,
+    7,  16, 17, 18, 17, 18, 16, 9,  13, 16, 16, 17, 16, 15, 10, 10, 16, 16, 15,
+    16, 15, 12, 11, 14, 15, 15, 14, 14, 9,  11, 12, 13, 13, 13, 13, 6,  14, 14,
+    10, 11, 12, 12, 6,  8,  10, 10, 11, 10, 6,  7,  5,  9,  9,  9,  9,  6,  9,
+    5,  8,  7,  7,  7,  5,  6,  5,  6,  6,  6,  7,  4,  6,  6,  5,  5,  5,  5,
+    4,  6,  8,  9,  10, 9,  6,  5,  5,  11, 14, 14, 11, 8,  6,  4,  2,  0,  1,
+    1,  3,  5,  6,  2,  2,  2,  2,  2,  4,  6,  2,  4,  4,  4,  1,  4,  7,  2,
+    5,  7,  7,  4,  3,  5,  3,  7,  12, 11, 9,  6,  4,  6,  12, 16, 13, 11, 7,
+    4,  12, 16, 16, 14, 12, 8,  5,  6,  11, 11, 6,  1,  3,  5,  6,  12, 12, 8,
+    2,  3,  5,  6,  11, 13, 9,  4,  2,  5,  6,  12, 14, 12, 8,  4,  4,  8,  13,
+    16, 15, 12, 8,  5,  10, 15, 17, 16, 13, 10, 6,  14, 17, 18, 17, 14, 11, 7,
+    24, 27, 31, 33, 34, 31, 28, 23, 27, 29, 33, 34, 31, 28, 22, 25, 29, 32, 33,
+    31, 28, 21, 25, 28, 31, 35, 32, 29, 22, 24, 28, 31, 35, 33, 30, 21, 24, 26,
+    30, 34, 33, 29, 18, 21, 25, 29, 33, 33, 30, 21, 24, 28, 31, 29, 26, 24, 21,
+    24, 27, 30, 30, 26, 23, 20, 23, 26, 28, 30, 27, 25, 19, 22, 26, 29, 29, 28,
+    24, 20, 22, 26, 28, 28, 28, 25, 18, 21, 24, 27, 28, 27, 25, 16, 19, 23, 26,
+    26, 27, 24, 20, 23, 24, 24, 24, 22, 17, 19, 21, 23, 24, 23, 22, 17, 18, 21,
+    22, 23, 23, 21, 18, 16, 21, 22, 22, 23, 22, 18, 14, 20, 22, 22, 22, 22, 18,
+    12, 18, 20, 20, 21, 21, 19, 15, 17, 19, 19, 19, 19, 17, 18, 17, 17, 17, 18,
+    15, 6,  16, 16, 16, 16, 17, 14, 7,  12, 15, 16, 15, 15, 14, 9,  9,  16, 15,
+    15, 15, 14, 12, 10, 14, 14, 15, 14, 13, 9,  12, 12, 12, 13, 13, 12, 6,  15,
+    16, 11, 11, 12, 11, 5,  8,  10, 10, 10, 9,  4,  6,  4,  9,  8,  8,  8,  4,
+    7,  4,  8,  7,  7,  7,  4,  6,  4,  6,  7,  6,  7,  4,  5,  6,  6,  6,  6,
+    6,  5,  5,  8,  10, 12, 10, 7,  6,  5,  12, 16, 15, 12, 9,  7,  5,  2,  1,
+    0,  1,  2,  3,  4,  2,  2,  2,  2,  2,  3,  4,  2,  4,  4,  4,  1,  3,  5,
+    2,  6,  8,  8,  5,  4,  5,  4,  8,  13, 13, 9,  7,  5,  8,  13, 19, 18, 12,
+    8,  5,  13, 18, 20, 19, 14, 9,  6,  6,  12, 11, 5,  1,  2,  4,  6,  12, 13,
+    7,  1,  2,  4,  6,  12, 15, 9,  5,  2,  4,  6,  13, 18, 13, 9,  6,  5,  9,
+    15, 21, 19, 13, 9,  6,  12, 18, 24, 23, 16, 10, 7,  16, 21, 25, 25, 18, 12,
+    8,  24, 27, 30, 33, 33, 31, 26, 23, 26, 30, 33, 33, 31, 27, 21, 24, 28, 32,
+    33, 31, 28, 21, 24, 29, 32, 35, 32, 29, 21, 24, 28, 31, 35, 33, 30, 20, 23,
+    27, 30, 34, 32, 28, 19, 21, 26, 29, 33, 33, 29, 21, 25, 27, 31, 28, 26, 22,
+    21, 23, 27, 30, 28, 26, 23, 19, 22, 26, 28, 29, 28, 23, 19, 23, 26, 29, 29,
+    28, 24, 20, 23, 25, 28, 29, 28, 25, 18, 22, 24, 28, 28, 27, 25, 16, 19, 23,
+    27, 27, 26, 24, 20, 23, 23, 24, 23, 21, 16, 19, 21, 23, 23, 23, 21, 16, 18,
+    20, 22, 22, 22, 22, 17, 16, 21, 22, 22, 22, 22, 18, 15, 20, 22, 22, 22, 21,
+    17, 13, 19, 20, 20, 21, 20, 18, 16, 18, 19, 19, 19, 19, 17, 18, 17, 17, 17,
+    17, 14, 5,  16, 17, 16, 16, 15, 13, 6,  13, 15, 16, 15, 15, 13, 9,  9,  16,
+    15, 15, 15, 13, 12, 11, 15, 14, 15, 14, 13, 8,  12, 13, 13, 13, 13, 12, 6,
+    16, 17, 13, 11, 12, 11, 5,  8,  10, 10, 9,  8,  3,  5,  5,  9,  8,  8,  7,
+    3,  6,  5,  8,  7,  7,  7,  3,  5,  5,  6,  7,  7,  7,  4,  5,  6,  6,  7,
+    7,  7,  7,  5,  9,  12, 13, 11, 9,  7,  5,  14, 17, 17, 13, 10, 8,  6,  2,
+    1,  1,  0,  2,  3,  4,  2,  3,  2,  2,  2,  3,  3,  2,  4,  4,  5,  2,  3,
+    4,  2,  6,  9,  9,  6,  5,  5,  4,  9,  14, 13, 10, 8,  6,  9,  14, 20, 18,
+    12, 9,  7,  15, 19, 21, 20, 15, 10, 7,  6,  9,  7,  4,  0,  2,  3,  6,  9,
+    8,  5,  2,  2,  3,  6,  9,  10, 8,  5,  3,  4,  6,  11, 15, 12, 9,  7,  6,
+    10, 14, 19, 18, 14, 10, 8,  13, 19, 23, 23, 16, 11, 8,  18, 22, 24, 24, 19,
+    13, 9,  20, 23, 27, 30, 30, 28, 24, 19, 23, 26, 29, 29, 27, 24, 18, 21, 25,
+    28, 31, 29, 26, 17, 21, 25, 28, 31, 29, 26, 18, 22, 24, 28, 32, 29, 26, 18,
+    21, 24, 27, 32, 29, 25, 16, 19, 23, 26, 29, 29, 26, 18, 21, 24, 27, 27, 22,
+    19, 18, 20, 23, 26, 26, 23, 20, 17, 19, 22, 26, 26, 24, 21, 16, 19, 23, 26,
+    26, 25, 22, 17, 20, 23, 26, 25, 25, 21, 15, 18, 22, 24, 24, 24, 21, 17, 18,
+    20, 23, 23, 23, 21, 17, 19, 19, 20, 21, 17, 13, 16, 18, 19, 19, 19, 18, 14,
+    15, 18, 19, 20, 20, 19, 14, 15, 18, 20, 19, 20, 19, 15, 13, 17, 19, 18, 19,
+    19, 16, 12, 16, 17, 18, 17, 18, 15, 19, 19, 16, 16, 17, 16, 15, 15, 14, 13,
+    14, 14, 12, 3,  14, 13, 13, 13, 12, 11, 4,  11, 12, 12, 13, 12, 11, 7,  8,
+    13, 13, 12, 12, 12, 9,  9,  12, 12, 11, 11, 10, 7,  12, 14, 12, 11, 10, 10,
+    5,  19, 20, 15, 12, 9,  9,  6,  7,  6,  6,  6,  5,  2,  3,  3,  5,  5,  4,
+    4,  3,  4,  3,  4,  3,  4,  4,  3,  4,  3,  3,  4,  5,  5,  5,  5,  5,  9,
+    9,  9,  9,  8,  6,  10, 15, 16, 13, 10, 8,  6,  17, 20, 19, 15, 12, 9,  7,
+    2,  3,  2,  2,  0,  2,  3,  2,  4,  3,  2,  2,  2,  3,  2,  6,  4,  4,  4,
+    3,  4,  2,  7,  8,  8,  7,  6,  6,  7,  12, 14, 13, 12, 9,  7,  12, 16, 20,
+    18, 13, 10, 8,  18, 21, 22, 19, 15, 11, 8,  7,  9,  5,  3,  2,  1,  2,  7,
+    9,  7,  3,  2,  2,  3,  7,  9,  9,  6,  5,  5,  4,  7,  9,  13, 11, 9,  8,
+    8,  9,  14, 17, 17, 14, 11, 8,  15, 18, 21, 22, 16, 13, 9,  19, 23, 23, 23,
+    18, 14, 10, 16, 20, 23, 26, 25, 23, 20, 15, 18, 21, 25, 25, 24, 20, 14, 17,
+    21, 25, 26, 24, 21, 14, 18, 21, 24, 28, 25, 22, 14, 18, 20, 25, 28, 26, 22,
+    13, 17, 20, 23, 27, 26, 23, 17, 17, 19, 22, 25, 26, 22, 14, 17, 20, 23, 22,
+    19, 15, 14, 16, 19, 22, 22, 20, 17, 12, 15, 18, 22, 22, 20, 17, 12, 15, 19,
+    22, 22, 21, 18, 12, 16, 18, 21, 22, 21, 18, 12, 15, 18, 21, 21, 20, 18, 19,
+    18, 17, 19, 19, 20, 18, 13, 15, 16, 16, 17, 14, 11, 12, 14, 15, 15, 16, 15,
+    11, 11, 13, 14, 16, 16, 16, 12, 11, 13, 15, 15, 15, 15, 13, 9,  13, 15, 14,
+    15, 15, 13, 14, 15, 14, 14, 14, 14, 13, 22, 20, 17, 13, 13, 13, 12, 11, 10,
+    9,  9,  9,  9,  2,  10, 9,  9,  8,  9,  8,  3,  8,  8,  8,  9,  9,  9,  4,
+    6,  8,  8,  9,  9,  8,  7,  7,  8,  9,  9,  9,  8,  6,  14, 16, 14, 13, 10,
+    8,  7,  21, 23, 18, 13, 11, 9,  7,  2,  2,  2,  2,  2,  2,  2,  2,  1,  1,
+    1,  1,  2,  3,  2,  2,  2,  3,  4,  3,  4,  2,  5,  6,  7,  7,  7,  7,  6,
+    11, 12, 11, 11, 9,  7,  13, 18, 19, 15, 13, 10, 8,  20, 22, 21, 17, 14, 11,
+    9,  5,  5,  3,  3,  2,  0,  2,  5,  6,  4,  3,  2,  2,  3,  5,  8,  6,  6,
+    5,  5,  4,  5,  9,  11, 10, 9,  9,  8,  9,  14, 17, 15, 14, 12, 8,  15, 19,
+    23, 20, 15, 12, 10, 21, 23, 24, 21, 17, 13, 10, 9,  11, 7,  4,  3,  2,  1,
+    9,  11, 9,  5,  3,  3,  3,  9,  11, 11, 8,  7,  6,  6,  9,  12, 15, 13, 11,
+    10, 10, 12, 16, 20, 19, 16, 13, 11, 17, 21, 24, 24, 19, 15, 11, 21, 24, 25,
+    25, 20, 16, 12, 12, 15, 18, 20, 20, 17, 15, 11, 14, 17, 20, 20, 18, 16, 10,
+    13, 16, 20, 21, 20, 17, 10, 13, 17, 20, 23, 20, 18, 10, 14, 16, 20, 24, 21,
+    18, 11, 13, 16, 19, 23, 22, 18, 18, 17, 16, 18, 21, 22, 18, 11, 13, 16, 18,
+    17, 14, 11, 9,  12, 15, 17, 16, 15, 13, 8,  11, 15, 18, 17, 16, 14, 7,  11,
+    15, 18, 17, 17, 14, 8,  11, 14, 17, 17, 16, 14, 12, 14, 15, 16, 16, 16, 14,
+    20, 19, 17, 16, 15, 15, 14, 8,  11, 12, 12, 12, 10, 7,  7,  10, 11, 11, 11,
+    10, 7,  7,  9,  10, 11, 11, 11, 8,  6,  9,  11, 11, 11, 11, 9,  7,  10, 11,
+    11, 11, 11, 9,  16, 16, 15, 13, 11, 9,  9,  22, 21, 17, 14, 11, 9,  8,  6,
+    6,  5,  5,  5,  6,  1,  6,  5,  4,  4,  4,  4,  2,  5,  3,  4,  5,  4,  4,
+    3,  8,  3,  5,  6,  6,  6,  6,  8,  9,  9,  10, 10, 9,  7,  16, 17, 15, 14,
+    11, 9,  7,  23, 24, 18, 15, 12, 10, 8,  3,  2,  2,  2,  2,  1,  1,  5,  3,
+    2,  2,  2,  2,  2,  4,  4,  3,  4,  5,  5,  4,  5,  7,  7,  8,  9,  8,  7,
+    8,  13, 13, 13, 12, 11, 8,  15, 19, 20, 17, 14, 12, 9,  22, 24, 23, 18, 16,
+    13, 10, 7,  6,  4,  3,  3,  2,  0,  7,  8,  5,  4,  3,  3,  3,  7,  10, 7,
+    8,  7,  6,  6,  7,  11, 13, 13, 11, 10, 9,  11, 16, 20, 19, 16, 13, 10, 17,
+    21, 26, 24, 19, 14, 11, 22, 25, 28, 25, 21, 16, 12, 10, 13, 10, 6,  3,  2,
+    2,  11, 13, 12, 7,  4,  4,  4,  11, 13, 16, 11, 9,  8,  7,  11, 15, 21, 17,
+    14, 12, 11, 14, 21, 24, 24, 20, 16, 12, 19, 24, 30, 30, 22, 17, 13, 25, 29,
+    31, 30, 25, 19, 14, 23, 27, 29, 32, 32, 30, 27, 22, 25, 28, 31, 31, 29, 26,
+    21, 24, 27, 29, 31, 28, 26, 20, 23, 26, 29, 30, 29, 27, 20, 23, 26, 28, 30,
+    29, 26, 19, 21, 25, 27, 30, 28, 27, 16, 20, 23, 27, 29, 28, 27, 22, 24, 27,
+    29, 29, 26, 24, 20, 24, 27, 28, 28, 26, 24, 20, 22, 26, 28, 26, 25, 22, 18,
+    22, 24, 27, 26, 26, 24, 18, 21, 24, 26, 26, 26, 24, 16, 19, 22, 24, 25, 25,
+    24, 13, 17, 21, 24, 24, 24, 24, 19, 22, 23, 25, 25, 23, 20, 18, 21, 22, 23,
+    23, 23, 19, 17, 20, 22, 22, 22, 22, 19, 15, 19, 21, 21, 22, 22, 20, 14, 18,
+    20, 20, 21, 21, 20, 11, 16, 18, 18, 19, 20, 20, 13, 14, 16, 17, 18, 19, 19,
+    17, 17, 17, 18, 18, 18, 8,  15, 15, 16, 16, 17, 16, 9,  13, 15, 15, 15, 16,
+    15, 9,  9,  13, 14, 14, 14, 14, 12, 9,  12, 13, 13, 13, 13, 8,  10, 10, 10,
+    11, 12, 12, 6,  13, 13, 9,  9,  10, 10, 6,  7,  9,  9,  9,  10, 6,  7,  4,
+    7,  8,  8,  8,  6,  9,  4,  6,  6,  6,  6,  5,  7,  4,  4,  4,  4,  5,  4,
+    7,  5,  4,  4,  4,  4,  3,  6,  7,  7,  7,  6,  4,  3,  5,  10, 10, 8,  6,
+    5,  3,  3,  0,  2,  2,  2,  2,  5,  7,  0,  3,  2,  2,  2,  4,  8,  0,  4,
+    3,  2,  1,  3,  6,  0,  3,  3,  2,  1,  2,  5,  2,  3,  5,  5,  3,  3,  3,
+    5,  6,  9,  8,  5,  3,  3,  8,  8,  10, 9,  6,  4,  3,  4,  7,  6,  3,  2,
+    3,  6,  4,  7,  7,  4,  2,  2,  5,  4,  7,  9,  4,  2,  0,  4,  4,  7,  10,
+    5,  3,  2,  3,  4,  7,  11, 9,  5,  3,  3,  5,  9,  12, 11, 7,  4,  3,  7,
+    11, 12, 12, 8,  5,  3,  28, 31, 34, 36, 36, 33, 31, 26, 29, 33, 36, 37, 35,
+    32, 25, 29, 32, 35, 37, 34, 31, 24, 27, 31, 34, 36, 34, 32, 24, 27, 31, 34,
+    37, 36, 31, 23, 25, 30, 33, 36, 35, 32, 20, 24, 28, 32, 35, 35, 32, 25, 29,
+    32, 34, 34, 31, 27, 24, 27, 30, 33, 32, 30, 27, 22, 26, 29, 32, 32, 30, 28,
+    22, 25, 29, 32, 32, 31, 28, 23, 24, 28, 32, 31, 31, 28, 20, 24, 27, 30, 30,
+    31, 29, 17, 20, 25, 29, 29, 29, 28, 23, 26, 27, 28, 28, 26, 21, 22, 25, 27,
+    26, 27, 25, 21, 21, 24, 25, 26, 25, 27, 22, 18, 23, 26, 24, 26, 25, 22, 16,
+    22, 24, 24, 25, 24, 23, 13, 20, 22, 23, 23, 24, 22, 14, 17, 20, 22, 22, 23,
+    21, 20, 20, 21, 22, 22, 19, 10, 18, 19, 20, 20, 21, 19, 11, 15, 18, 18, 18,
+    19, 17, 12, 11, 18, 18, 18, 18, 17, 14, 12, 16, 17, 17, 17, 16, 11, 12, 14,
+    14, 15, 15, 15, 8,  14, 13, 12, 13, 14, 13, 8,  10, 12, 13, 13, 12, 7,  10,
+    6,  11, 11, 11, 11, 7,  10, 6,  10, 9,  9,  9,  7,  9,  6,  8,  8,  8,  9,
+    6,  7,  7,  5,  7,  7,  7,  4,  7,  8,  7,  9,  8,  5,  4,  6,  10, 12, 12,
+    9,  7,  5,  5,  3,  2,  2,  3,  4,  6,  8,  3,  0,  1,  1,  3,  7,  8,  3,
+    2,  2,  2,  2,  5,  8,  3,  3,  5,  5,  2,  3,  6,  4,  5,  8,  7,  7,  5,
+    5,  5,  9,  11, 9,  8,  6,  4,  11, 13, 12, 10, 8,  7,  4,  4,  8,  7,  4,
+    3,  4,  7,  4,  8,  7,  5,  2,  4,  7,  4,  7,  9,  6,  2,  4,  6,  4,  8,
+    10, 7,  6,  4,  4,  6,  9,  10, 9,  8,  7,  4,  8,  10, 12, 12, 9,  7,  5,
+    11, 12, 13, 13, 10, 8,  6,  26, 29, 33, 35, 36, 33, 29, 25, 29, 32, 35, 35,
+    33, 30, 23, 27, 31, 33, 35, 35, 30, 22, 26, 30, 34, 37, 34, 31, 23, 25, 29,
+    33, 37, 34, 31, 23, 25, 29, 33, 37, 35, 31, 20, 24, 27, 32, 34, 34, 31, 23,
+    27, 30, 33, 32, 28, 25, 23, 26, 29, 32, 32, 29, 25, 22, 24, 28, 31, 31, 29,
+    26, 21, 25, 28, 31, 31, 29, 27, 21, 23, 27, 31, 31, 30, 26, 20, 23, 26, 29,
+    30, 30, 26, 17, 21, 25, 27, 28, 29, 27, 22, 25, 26, 26, 26, 23, 19, 21, 24,
+    25, 25, 25, 24, 18, 20, 22, 24, 24, 24, 24, 19, 17, 23, 24, 24, 25, 24, 20,
+    15, 22, 23, 23, 24, 23, 20, 13, 20, 22, 22, 22, 22, 20, 15, 18, 20, 21, 21,
+    21, 19, 19, 19, 19, 19, 19, 16, 7,  17, 18, 18, 18, 18, 15, 9,  13, 17, 17,
+    17, 17, 15, 10, 10, 17, 17, 17, 17, 15, 13, 12, 16, 16, 16, 16, 14, 10, 12,
+    14, 14, 14, 15, 14, 7,  15, 15, 12, 13, 13, 13, 5,  9,  11, 12, 11, 10, 5,
+    7,  6,  11, 10, 10, 9,  5,  8,  6,  9,  9,  9,  8,  5,  7,  5,  7,  8,  8,
+    8,  4,  6,  7,  5,  7,  7,  7,  5,  5,  9,  9,  11, 9,  7,  6,  5,  12, 14,
+    14, 10, 8,  7,  5,  2,  2,  2,  2,  3,  4,  5,  2,  1,  0,  1,  2,  4,  5,
+    2,  2,  2,  2,  2,  4,  6,  2,  4,  6,  6,  4,  4,  5,  4,  7,  11, 11, 9,
+    7,  5,  7,  12, 17, 15, 11, 8,  5,  12, 16, 19, 18, 13, 9,  6,  4,  10, 9,
+    4,  2,  3,  4,  4,  10, 12, 6,  1,  3,  4,  4,  10, 14, 8,  3,  3,  4,  4,
+    11, 17, 12, 7,  5,  5,  7,  13, 19, 17, 12, 9,  6,  10, 17, 22, 21, 15, 10,
+    7,  15, 19, 23, 23, 17, 11, 8,  26, 28, 32, 35, 35, 32, 29, 25, 27, 31, 34,
+    35, 31, 29, 23, 26, 30, 34, 35, 33, 29, 22, 25, 30, 33, 36, 34, 31, 23, 25,
+    29, 33, 37, 35, 29, 23, 25, 28, 32, 35, 34, 32, 20, 23, 27, 31, 34, 34, 31,
+    23, 26, 29, 32, 31, 27, 23, 22, 25, 29, 32, 30, 27, 24, 22, 24, 28, 31, 31,
+    29, 25, 21, 24, 27, 31, 31, 30, 25, 21, 24, 27, 30, 30, 29, 26, 20, 23, 26,
+    30, 29, 29, 25, 18, 21, 24, 28, 27, 28, 25, 22, 24, 25, 25, 25, 23, 17, 20,
+    22, 25, 25, 24, 22, 17, 19, 22, 24, 24, 24, 22, 17, 17, 23, 23, 23, 24, 23,
+    19, 15, 23, 23, 24, 23, 23, 19, 13, 20, 22, 22, 22, 22, 19, 15, 19, 20, 20,
+    21, 21, 18, 20, 19, 18, 18, 18, 15, 6,  17, 18, 18, 17, 17, 14, 8,  13, 17,
+    17, 17, 16, 14, 10, 10, 17, 17, 17, 17, 14, 13, 12, 16, 16, 16, 15, 14, 10,
+    13, 14, 14, 14, 14, 13, 7,  16, 16, 13, 13, 13, 13, 5,  9,  12, 11, 11, 9,
+    4,  6,  6,  10, 10, 9,  8,  4,  8,  6,  9,  8,  9,  8,  4,  6,  5,  7,  9,
+    8,  8,  4,  6,  7,  6,  7,  7,  7,  6,  5,  9,  10, 12, 10, 8,  7,  5,  13,
+    16, 15, 12, 9,  8,  6,  2,  2,  2,  2,  2,  3,  4,  2,  1,  1,  0,  2,  3,
+    4,  2,  2,  3,  3,  2,  3,  4,  2,  4,  7,  7,  5,  5,  5,  4,  8,  12, 11,
+    9,  8,  6,  8,  13, 18, 16, 11, 8,  6,  14, 18, 20, 18, 13, 9,  7,  5,  8,
+    7,  3,  1,  2,  3,  5,  8,  8,  4,  0,  2,  4,  5,  8,  10, 7,  4,  3,  4,
+    5,  10, 14, 11, 8,  6,  6,  8,  13, 18, 17, 12, 9,  7,  11, 17, 22, 22, 15,
+    11, 8,  16, 21, 23, 23, 18, 12, 8,  22, 25, 28, 31, 32, 29, 26, 21, 23, 27,
+    31, 32, 27, 25, 19, 23, 26, 29, 32, 29, 27, 19, 23, 26, 30, 32, 30, 27, 20,
+    22, 26, 29, 32, 31, 28, 19, 22, 25, 29, 32, 30, 27, 17, 20, 24, 27, 31, 31,
+    27, 20, 23, 26, 29, 28, 24, 21, 18, 22, 25, 28, 27, 24, 21, 18, 20, 24, 27,
+    27, 26, 21, 17, 21, 25, 27, 26, 25, 22, 19, 21, 24, 26, 26, 26, 22, 16, 20,
+    22, 25, 26, 26, 23, 16, 18, 21, 24, 25, 24, 22, 18, 20, 21, 22, 23, 19, 15,
+    17, 19, 21, 21, 21, 20, 15, 17, 19, 20, 20, 20, 20, 15, 15, 19, 20, 20, 21,
+    20, 16, 14, 19, 20, 20, 20, 19, 16, 12, 17, 18, 19, 19, 18, 16, 17, 17, 17,
+    17, 17, 17, 16, 16, 15, 15, 15, 16, 13, 4,  14, 14, 14, 14, 14, 12, 5,  12,
+    14, 13, 14, 13, 12, 8,  8,  14, 14, 13, 13, 12, 10, 10, 13, 13, 13, 12, 11,
+    7,  12, 12, 11, 11, 11, 11, 5,  17, 18, 14, 10, 10, 10, 5,  7,  8,  7,  7,
+    7,  3,  4,  3,  7,  6,  6,  6,  3,  5,  3,  6,  5,  6,  5,  3,  4,  3,  4,
+    5,  5,  5,  4,  4,  5,  7,  8,  8,  8,  7,  5,  9,  13, 14, 12, 9,  7,  6,
+    15, 18, 18, 13, 11, 8,  6,  1,  2,  2,  2,  2,  2,  3,  2,  3,  2,  2,  0,
+    3,  3,  2,  4,  3,  3,  3,  2,  3,  2,  6,  8,  7,  6,  5,  5,  6,  10, 13,
+    12, 10, 8,  6,  11, 16, 19, 16, 12, 9,  7,  16, 20, 21, 18, 14, 10, 7,  6,
+    7,  5,  3,  1,  2,  2,  6,  7,  7,  3,  2,  2,  3,  5,  7,  8,  5,  4,  3,
+    3,  6,  8,  12, 10, 8,  7,  7,  9,  12, 16, 16, 13, 10, 7,  13, 17, 20, 21,
+    15, 12, 8,  18, 21, 21, 21, 17, 13, 9,  17, 21, 24, 28, 28, 26, 22, 17, 19,
+    24, 28, 28, 24, 21, 15, 19, 22, 25, 27, 25, 22, 15, 18, 21, 25, 29, 26, 22,
+    15, 18, 21, 24, 28, 26, 23, 14, 17, 20, 24, 28, 26, 23, 15, 16, 19, 23, 25,
+    27, 23, 16, 19, 22, 25, 24, 22, 18, 14, 18, 21, 23, 23, 21, 16, 13, 16, 20,
+    22, 22, 20, 18, 13, 16, 20, 23, 22, 22, 19, 13, 16, 19, 22, 22, 21, 19, 12,
+    14, 18, 21, 21, 21, 19, 17, 16, 17, 19, 20, 20, 18, 14, 16, 17, 18, 19, 17,
+    13, 13, 15, 16, 17, 17, 16, 12, 12, 14, 15, 16, 16, 16, 12, 11, 14, 16, 16,
+    16, 16, 13, 11, 14, 15, 15, 15, 15, 13, 12, 13, 14, 14, 14, 14, 13, 19, 18,
+    14, 13, 13, 13, 12, 12, 11, 10, 11, 12, 12, 4,  11, 10, 10, 10, 10, 10, 3,
+    9,  9,  9,  9,  9,  9,  4,  6,  9,  9,  9,  9,  9,  7,  7,  8,  8,  8,  8,
+    7,  4,  12, 14, 12, 10, 8,  7,  4,  18, 20, 14, 12, 9,  7,  5,  4,  3,  3,
+    3,  4,  3,  4,  1,  2,  2,  2,  2,  2,  3,  1,  1,  1,  2,  2,  2,  3,  1,
+    5,  5,  5,  5,  4,  4,  5,  10, 9,  9,  9,  7,  5,  12, 15, 16, 13, 10, 8,
+    6,  17, 20, 18, 14, 11, 9,  6,  4,  5,  3,  3,  2,  2,  3,  4,  6,  4,  3,
+    2,  0,  2,  4,  7,  5,  5,  3,  3,  2,  4,  8,  9,  8,  7,  6,  5,  8,  12,
+    14, 13, 11, 9,  6,  12, 16, 20, 17, 12, 10, 7,  18, 21, 21, 19, 14, 11, 8,
+    8,  10, 6,  4,  3,  2,  2,  8,  10, 8,  5,  3,  2,  1,  8,  10, 10, 7,  5,
+    4,  3,  9,  10, 14, 11, 9,  8,  7,  10, 14, 17, 16, 14, 11, 8,  14, 18, 21,
+    21, 16, 12, 9,  19, 21, 23, 22, 18, 13, 10, 14, 16, 21, 24, 24, 21, 18, 13,
+    16, 19, 23, 24, 20, 17, 11, 14, 18, 21, 23, 20, 18, 10, 14, 18, 21, 24, 21,
+    18, 11, 14, 17, 20, 24, 22, 18, 10, 13, 16, 19, 23, 22, 18, 15, 14, 15, 18,
+    22, 21, 18, 11, 14, 18, 21, 20, 17, 14, 11, 14, 17, 20, 20, 16, 13, 9,  12,
+    15, 18, 18, 16, 14, 9,  12, 15, 18, 17, 17, 14, 9,  12, 15, 17, 17, 17, 14,
+    11, 12, 13, 16, 16, 16, 14, 18, 16, 14, 15, 15, 15, 14, 10, 12, 14, 14, 16,
+    13, 9,  9,  11, 12, 13, 13, 12, 8,  7,  10, 12, 11, 11, 12, 8,  7,  10, 11,
+    11, 11, 11, 9,  6,  9,  11, 11, 10, 10, 9,  13, 13, 12, 10, 9,  9,  9,  19,
+    17, 15, 11, 9,  8,  8,  8,  7,  6,  7,  8,  9,  3,  7,  6,  6,  6,  6,  6,
+    2,  6,  5,  5,  5,  4,  4,  2,  4,  5,  4,  4,  4,  4,  4,  7,  8,  8,  7,
+    7,  6,  4,  14, 15, 13, 11, 8,  7,  5,  19, 20, 15, 12, 9,  7,  6,  2,  2,
+    1,  2,  2,  2,  3,  3,  3,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,  2,  2,
+    3,  6,  6,  6,  6,  5,  5,  7,  11, 11, 10, 9,  8,  5,  13, 16, 16, 13, 11,
+    9,  7,  19, 20, 19, 15, 12, 10, 7,  7,  6,  4,  3,  3,  3,  3,  7,  7,  5,
+    4,  3,  2,  0,  7,  9,  6,  6,  4,  3,  3,  7,  10, 10, 10, 8,  7,  6,  9,
+    14, 16, 15, 12, 10, 7,  15, 18, 22, 20, 14, 10, 8,  19, 21, 23, 21, 16, 12,
+    9,  10, 12, 9,  5,  3,  3,  2,  10, 12, 11, 6,  3,  2,  2,  10, 12, 13, 9,
+    6,  5,  4,  10, 13, 17, 13, 11, 9,  8,  13, 16, 21, 20, 16, 12, 9,  16, 21,
+    25, 24, 18, 13, 10, 20, 23, 25, 26, 20, 15, 11, 24, 26, 29, 32, 32, 30, 26,
+    23, 25, 28, 31, 31, 29, 26, 22, 24, 27, 29, 31, 28, 26, 20, 23, 26, 29, 30,
+    29, 27, 20, 23, 26, 29, 31, 28, 27, 19, 22, 24, 27, 30, 29, 26, 16, 20, 24,
+    26, 29, 29, 27, 22, 24, 27, 29, 28, 26, 23, 21, 24, 27, 29, 27, 25, 24, 19,
+    23, 25, 27, 27, 25, 23, 18, 21, 25, 27, 25, 25, 25, 18, 21, 24, 27, 26, 25,
+    25, 16, 19, 23, 25, 25, 25, 24, 13, 16, 20, 24, 24, 25, 24, 19, 23, 23, 24,
+    25, 23, 19, 18, 21, 22, 23, 24, 22, 20, 17, 20, 22, 22, 22, 23, 19, 15, 19,
+    21, 21, 22, 22, 20, 14, 19, 19, 20, 21, 22, 20, 11, 17, 18, 19, 20, 20, 19,
+    13, 14, 16, 17, 18, 19, 19, 17, 17, 17, 18, 18, 18, 7,  15, 16, 16, 16, 17,
+    16, 8,  13, 15, 15, 15, 15, 15, 10, 9,  14, 14, 14, 14, 14, 12, 9,  12, 12,
+    13, 13, 14, 8,  10, 10, 10, 11, 11, 12, 6,  13, 13, 9,  9,  10, 10, 6,  8,
+    8,  9,  10, 10, 6,  8,  4,  7,  7,  8,  8,  6,  9,  4,  6,  6,  5,  6,  5,
+    8,  4,  4,  4,  4,  5,  5,  6,  5,  4,  4,  4,  4,  3,  6,  7,  7,  7,  6,
+    4,  3,  5,  10, 10, 8,  6,  4,  3,  4,  0,  2,  2,  2,  2,  5,  7,  0,  3,
+    2,  2,  2,  4,  8,  0,  4,  2,  2,  1,  4,  6,  0,  3,  3,  2,  1,  2,  5,
+    2,  3,  5,  5,  3,  3,  4,  5,  6,  9,  8,  5,  3,  3,  8,  9,  10, 9,  6,
+    4,  3,  4,  7,  6,  3,  2,  3,  6,  4,  7,  8,  4,  2,  2,  5,  4,  7,  9,
+    4,  2,  0,  5,  4,  7,  10, 6,  3,  2,  3,  4,  7,  10, 9,  5,  4,  3,  5,
+    9,  12, 11, 7,  4,  3,  7,  11, 12, 12, 8,  5,  3,  30, 32, 35, 39, 38, 37,
+    32, 28, 32, 34, 37, 39, 36, 33, 27, 31, 33, 37, 38, 36, 32, 26, 29, 32, 35,
+    38, 37, 34, 25, 28, 33, 36, 38, 37, 35, 24, 27, 31, 35, 38, 37, 35, 22, 25,
+    31, 34, 36, 37, 34, 27, 31, 33, 36, 36, 32, 29, 26, 29, 33, 35, 34, 32, 28,
+    24, 28, 32, 34, 35, 33, 30, 24, 27, 31, 34, 34, 33, 30, 23, 26, 29, 33, 32,
+    33, 30, 21, 25, 29, 32, 32, 33, 30, 19, 22, 27, 30, 31, 31, 30, 24, 28, 28,
+    29, 30, 28, 23, 23, 27, 28, 29, 29, 28, 22, 22, 25, 27, 28, 28, 28, 23, 20,
+    25, 26, 27, 28, 27, 25, 17, 24, 25, 26, 26, 26, 24, 14, 23, 24, 24, 25, 26,
+    24, 15, 19, 21, 23, 24, 25, 23, 22, 23, 23, 23, 23, 21, 11, 19, 21, 21, 21,
+    22, 20, 12, 16, 20, 20, 20, 20, 19, 13, 12, 20, 19, 20, 19, 19, 16, 13, 17,
+    18, 19, 19, 18, 12, 13, 15, 16, 17, 17, 17, 9,  15, 13, 14, 15, 16, 16, 8,
+    10, 14, 14, 14, 14, 9,  11, 7,  12, 13, 13, 12, 9,  12, 7,  11, 11, 11, 11,
+    7,  10, 7,  8,  10, 10, 10, 8,  9,  8,  6,  9,  8,  9,  6,  8,  9,  8,  8,
+    7,  7,  4,  7,  11, 10, 9,  7,  5,  3,  6,  4,  3,  4,  4,  6,  8,  10, 4,
+    2,  2,  2,  4,  7,  9,  4,  0,  1,  1,  3,  6,  8,  4,  1,  2,  1,  2,  4,
+    7,  4,  3,  4,  4,  4,  3,  7,  6,  6,  8,  6,  5,  4,  5,  8,  9,  9,  6,
+    5,  4,  4,  2,  5,  3,  2,  3,  6,  9,  2,  5,  4,  3,  2,  5,  9,  2,  5,
+    5,  3,  0,  4,  7,  2,  5,  6,  2,  2,  3,  5,  2,  4,  7,  5,  4,  4,  4,
+    5,  6,  8,  8,  5,  4,  4,  8,  8,  9,  9,  6,  5,  4,  29, 33, 36, 39, 39,
+    36, 33, 28, 31, 34, 38, 38, 36, 32, 26, 29, 34, 37, 38, 35, 32, 25, 28, 31,
+    36, 39, 36, 33, 25, 29, 31, 36, 39, 37, 34, 24, 27, 30, 34, 38, 37, 33, 22,
+    26, 29, 33, 36, 37, 33, 26, 29, 34, 36, 34, 32, 29, 25, 29, 32, 36, 35, 32,
+    27, 24, 27, 30, 34, 34, 31, 28, 23, 26, 30, 33, 33, 32, 28, 24, 27, 30, 32,
+    32, 31, 29, 22, 25, 29, 32, 32, 32, 29, 19, 23, 27, 30, 30, 30, 28, 24, 27,
+    28, 29, 30, 26, 22, 23, 25, 28, 28, 28, 27, 21, 22, 25, 27, 26, 27, 26, 21,
+    18, 25, 25, 25, 26, 25, 21, 16, 24, 25, 25, 26, 25, 22, 13, 22, 24, 24, 24,
+    24, 22, 15, 20, 22, 23, 23, 23, 20, 22, 22, 22, 22, 23, 19, 10, 18, 20, 21,
+    22, 21, 18, 11, 15, 20, 20, 20, 19, 17, 12, 11, 19, 19, 19, 18, 16, 15, 13,
+    17, 18, 18, 19, 16, 11, 13, 15, 16, 16, 16, 15, 8,  15, 14, 14, 15, 15, 14,
+    6,  10, 14, 14, 14, 12, 6,  10, 7,  13, 12, 13, 11, 6,  11, 7,  11, 11, 11,
+    10, 5,  8,  7,  8,  10, 10, 9,  5,  8,  8,  6,  9,  9,  8,  5,  6,  9,  8,
+    9,  7,  7,  5,  6,  11, 12, 12, 9,  6,  5,  5,  3,  4,  4,  5,  4,  5,  7,
+    3,  2,  2,  3,  3,  5,  6,  3,  1,  0,  0,  3,  5,  7,  2,  2,  4,  4,  2,
+    4,  5,  4,  5,  9,  8,  8,  5,  5,  6,  10, 15, 13, 10, 6,  4,  10, 14, 17,
+    15, 11, 8,  4,  2,  8,  8,  2,  3,  4,  6,  2,  8,  10, 4,  2,  4,  6,  2,
+    8,  12, 5,  1,  3,  5,  2,  9,  14, 9,  5,  4,  5,  5,  11, 16, 14, 10, 8,
+    4,  8,  14, 19, 18, 13, 9,  5,  13, 18, 19, 19, 15, 10, 6,  28, 32, 36, 38,
+    38, 35, 33, 27, 30, 35, 37, 39, 36, 31, 26, 29, 33, 36, 39, 34, 32, 24, 27,
+    31, 35, 37, 35, 32, 25, 27, 31, 35, 37, 36, 33, 23, 26, 30, 33, 37, 35, 33,
+    21, 25, 29, 31, 35, 35, 32, 25, 29, 33, 37, 35, 31, 27, 25, 29, 31, 36, 34,
+    32, 27, 24, 26, 31, 33, 33, 30, 26, 23, 25, 29, 32, 32, 30, 26, 22, 25, 29,
+    32, 32, 31, 26, 21, 25, 27, 31, 30, 29, 27, 19, 22, 26, 30, 29, 28, 27, 24,
+    26, 29, 29, 30, 27, 20, 22, 25, 28, 28, 28, 26, 20, 21, 23, 26, 26, 26, 24,
+    19, 18, 25, 25, 24, 25, 23, 19, 16, 23, 24, 24, 24, 23, 20, 13, 22, 23, 23,
+    23, 23, 20, 15, 20, 21, 21, 21, 22, 18, 20, 21, 21, 22, 23, 18, 11, 18, 20,
+    20, 21, 21, 17, 11, 14, 19, 18, 19, 18, 15, 12, 11, 18, 18, 17, 18, 15, 14,
+    12, 16, 17, 17, 17, 14, 11, 13, 15, 16, 16, 16, 13, 7,  14, 14, 14, 14, 15,
+    13, 5,  9,  14, 13, 15, 12, 7,  11, 6,  13, 12, 13, 12, 6,  11, 6,  10, 11,
+    10, 9,  4,  7,  6,  7,  10, 9,  8,  4,  7,  8,  6,  8,  8,  7,  4,  4,  9,
+    8,  9,  8,  6,  4,  4,  11, 12, 12, 9,  6,  5,  4,  2,  4,  4,  5,  4,  6,
+    8,  2,  2,  2,  3,  3,  5,  6,  2,  1,  0,  0,  3,  3,  5,  2,  2,  4,  4,
+    2,  3,  4,  4,  5,  9,  8,  7,  5,  4,  6,  10, 15, 13, 9,  6,  4,  10, 14,
+    16, 15, 10, 7,  4,  3,  7,  6,  2,  3,  5,  6,  3,  7,  7,  4,  2,  3,  4,
+    3,  7,  8,  5,  1,  2,  4,  3,  8,  11, 9,  4,  4,  4,  5,  11, 15, 14, 9,
+    7,  4,  8,  14, 19, 19, 12, 8,  5,  13, 17, 20, 20, 14, 9,  6,  24, 29, 32,
+    35, 36, 33, 29, 23, 27, 31, 34, 35, 32, 28, 22, 25, 28, 33, 34, 31, 27, 20,
+    22, 26, 30, 32, 30, 28, 21, 23, 26, 30, 34, 31, 27, 20, 22, 26, 29, 33, 31,
+    27, 17, 21, 24, 27, 31, 32, 28, 22, 25, 30, 33, 31, 28, 25, 21, 23, 27, 31,
+    32, 28, 23, 20, 22, 27, 29, 28, 26, 22, 19, 21, 24, 27, 27, 26, 22, 20, 21,
+    24, 27, 27, 27, 22, 18, 20, 23, 25, 26, 26, 23, 14, 18, 22, 25, 25, 24, 22,
+    20, 23, 24, 25, 27, 23, 19, 19, 21, 24, 24, 25, 22, 17, 18, 21, 22, 22, 22,
+    21, 16, 16, 20, 21, 21, 21, 21, 16, 14, 20, 20, 20, 20, 19, 16, 11, 17, 19,
+    19, 19, 19, 16, 14, 15, 17, 17, 18, 18, 15, 18, 18, 17, 18, 19, 17, 9,  15,
+    16, 16, 17, 17, 15, 9,  12, 16, 15, 15, 14, 12, 8,  9,  16, 14, 13, 13, 12,
+    11, 10, 14, 13, 13, 12, 11, 8,  11, 11, 11, 11, 11, 10, 4,  14, 14, 10, 10,
+    10, 10, 3,  7,  9,  10, 10, 10, 6,  9,  4,  9,  8,  9,  9,  4,  9,  4,  7,
+    6,  6,  6,  3,  5,  4,  6,  6,  5,  5,  2,  4,  6,  5,  5,  5,  5,  4,  3,
+    7,  10, 11, 9,  6,  5,  3,  12, 14, 14, 10, 8,  6,  4,  1,  1,  1,  2,  4,
+    5,  7,  1,  2,  2,  2,  3,  3,  4,  1,  3,  4,  3,  0,  2,  4,  1,  5,  5,
+    4,  4,  3,  3,  3,  7,  10, 9,  8,  6,  4,  8,  12, 16, 13, 9,  6,  4,  13,
+    16, 18, 15, 11, 7,  5,  5,  6,  5,  3,  2,  4,  5,  4,  6,  6,  4,  2,  2,
+    3,  4,  6,  7,  3,  2,  1,  2,  4,  7,  9,  7,  6,  4,  4,  6,  9,  13, 13,
+    10, 7,  5,  10, 14, 17, 17, 13, 9,  6,  15, 18, 18, 18, 14, 10, 6,  20, 24,
+    28, 32, 32, 29, 25, 19, 23, 26, 31, 31, 28, 24, 17, 21, 25, 28, 30, 26, 23,
+    17, 19, 23, 26, 29, 26, 23, 16, 18, 21, 25, 29, 27, 23, 15, 18, 21, 24, 27,
+    26, 23, 12, 16, 19, 23, 26, 27, 23, 17, 21, 25, 29, 28, 24, 21, 16, 20, 24,
+    28, 27, 24, 20, 16, 18, 23, 25, 25, 21, 18, 15, 17, 20, 23, 22, 22, 19, 14,
+    17, 20, 22, 22, 22, 18, 12, 16, 18, 21, 21, 21, 18, 13, 14, 17, 20, 20, 20,
+    19, 15, 18, 21, 22, 23, 20, 16, 14, 17, 19, 21, 21, 19, 15, 14, 16, 18, 18,
+    18, 18, 13, 13, 16, 16, 16, 16, 16, 13, 12, 15, 16, 16, 16, 15, 13, 10, 12,
+    14, 14, 14, 14, 13, 15, 15, 12, 12, 13, 13, 12, 14, 13, 13, 14, 15, 15, 7,
+    13, 12, 12, 13, 13, 13, 6,  10, 11, 11, 10, 10, 10, 5,  6,  10, 9,  9,  9,
+    9,  7,  7,  9,  8,  8,  8,  8,  4,  10, 10, 9,  7,  7,  7,  2,  15, 16, 11,
+    8,  6,  5,  3,  5,  5,  6,  6,  7,  6,  7,  1,  3,  4,  5,  5,  4,  6,  1,
+    2,  2,  2,  2,  2,  3,  1,  3,  2,  2,  2,  2,  2,  4,  7,  7,  6,  6,  4,
+    2,  9,  12, 12, 10, 7,  5,  3,  14, 16, 15, 11, 9,  6,  4,  3,  4,  3,  3,
+    3,  5,  6,  3,  5,  4,  3,  3,  3,  3,  3,  6,  5,  4,  2,  0,  2,  4,  6,
+    6,  5,  4,  3,  3,  6,  9,  11, 10, 8,  6,  4,  10, 13, 16, 14, 10, 7,  4,
+    14, 16, 18, 15, 11, 8,  5,  7,  8,  7,  4,  3,  4,  4,  6,  8,  8,  5,  3,
+    2,  2,  7,  8,  9,  5,  3,  2,  1,  7,  8,  11, 8,  6,  5,  4,  8,  11, 14,
+    14, 11, 8,  5,  12, 15, 18, 18, 13, 9,  6,  16, 18, 19, 19, 14, 10, 7,  17,
+    20, 25, 28, 28, 26, 21, 15, 19, 23, 27, 28, 25, 20, 14, 18, 21, 25, 27, 22,
+    19, 12, 16, 19, 22, 24, 22, 19, 12, 14, 17, 21, 24, 23, 19, 10, 14, 16, 20,
+    23, 22, 19, 11, 12, 15, 19, 22, 22, 19, 14, 17, 22, 25, 24, 22, 17, 13, 16,
+    20, 24, 23, 20, 16, 12, 15, 19, 21, 21, 18, 15, 10, 13, 16, 18, 19, 17, 14,
+    10, 13, 15, 18, 18, 18, 15, 9,  11, 14, 17, 17, 17, 14, 13, 12, 13, 15, 16,
+    16, 14, 12, 15, 16, 18, 19, 17, 13, 10, 13, 16, 16, 17, 16, 12, 9,  12, 14,
+    14, 14, 14, 10, 8,  11, 12, 12, 12, 12, 10, 7,  10, 11, 11, 11, 11, 10, 11,
+    10, 10, 10, 10, 10, 9,  14, 13, 10, 9,  9,  9,  8,  9,  9,  10, 11, 12, 13,
+    7,  8,  8,  9,  9,  10, 10, 5,  7,  6,  7,  7,  6,  7,  3,  4,  6,  5,  5,
+    5,  5,  4,  6,  6,  5,  4,  5,  4,  2,  11, 11, 9,  7,  5,  4,  2,  14, 14,
+    10, 8,  6,  4,  3,  0,  1,  2,  3,  4,  5,  6,  2,  2,  2,  3,  3,  3,  4,
+    2,  3,  3,  2,  2,  1,  2,  2,  6,  4,  3,  3,  3,  2,  6,  9,  8,  7,  6,
+    5,  2,  10, 12, 12, 9,  7,  6,  3,  13, 14, 14, 11, 8,  6,  4,  6,  6,  5,
+    4,  4,  4,  6,  6,  8,  6,  4,  3,  2,  3,  6,  8,  7,  5,  3,  2,  0,  6,
+    9,  8,  6,  5,  4,  3,  8,  11, 13, 11, 9,  6,  4,  11, 14, 17, 15, 10, 7,
+    5,  14, 16, 18, 16, 12, 8,  6,  9,  10, 8,  6,  4,  4,  4,  10, 10, 10, 6,
+    4,  2,  2,  9,  10, 11, 6,  4,  3,  2,  9,  11, 14, 10, 7,  6,  5,  10, 13,
+    17, 15, 11, 8,  6,  13, 16, 20, 19, 13, 9,  6,  16, 19, 20, 20, 15, 11, 7,
+    24, 27, 29, 31, 31, 31, 27, 23, 26, 28, 31, 32, 28, 27, 21, 24, 27, 30, 31,
+    28, 25, 20, 24, 27, 29, 30, 29, 27, 20, 23, 26, 28, 30, 28, 26, 18, 22, 24,
+    27, 31, 29, 26, 16, 20, 24, 26, 29, 28, 26, 21, 24, 28, 29, 28, 26, 23, 21,
+    23, 25, 28, 28, 26, 23, 19, 23, 26, 28, 26, 26, 24, 18, 21, 25, 26, 26, 26,
+    25, 17, 21, 24, 26, 25, 26, 24, 16, 19, 22, 25, 26, 25, 24, 13, 16, 21, 24,
+    24, 25, 24, 19, 23, 24, 24, 25, 23, 20, 18, 21, 22, 23, 23, 23, 19, 17, 21,
+    22, 22, 22, 23, 19, 15, 20, 21, 21, 22, 22, 20, 14, 18, 20, 20, 21, 21, 20,
+    11, 16, 18, 19, 20, 20, 20, 13, 14, 16, 17, 18, 19, 19, 17, 17, 18, 18, 18,
+    18, 8,  15, 15, 16, 17, 17, 16, 9,  13, 15, 15, 15, 15, 15, 10, 9,  13, 14,
+    14, 15, 15, 12, 9,  12, 13, 13, 13, 14, 8,  10, 10, 10, 11, 11, 12, 6,  13,
+    13, 9,  9,  10, 11, 6,  8,  8,  9,  9,  10, 6,  8,  4,  7,  8,  8,  8,  6,
+    9,  4,  6,  5,  6,  6,  5,  7,  4,  4,  4,  4,  5,  5,  7,  5,  4,  4,  4,
+    4,  3,  6,  7,  7,  7,  6,  4,  3,  5,  10, 10, 8,  6,  4,  3,  4,  0,  2,
+    2,  2,  2,  5,  7,  0,  3,  2,  2,  2,  4,  8,  0,  4,  3,  2,  1,  4,  6,
+    0,  3,  3,  2,  1,  2,  5,  2,  3,  5,  5,  3,  3,  4,  5,  6,  9,  8,  4,
+    3,  3,  8,  9,  10, 9,  6,  4,  3,  4,  7,  6,  3,  2,  3,  6,  4,  7,  8,
+    4,  2,  2,  5,  4,  7,  9,  4,  2,  0,  5,  4,  7,  10, 6,  3,  2,  3,  4,
+    7,  11, 9,  5,  3,  3,  5,  9,  12, 12, 7,  4,  3,  7,  10, 12, 13, 8,  5,
+    3,  30, 34, 37, 40, 39, 38, 34, 29, 34, 37, 40, 40, 38, 34, 28, 32, 35, 39,
+    38, 38, 34, 27, 29, 34, 37, 39, 36, 33, 25, 28, 32, 35, 39, 37, 33, 23, 28,
+    31, 34, 38, 37, 34, 21, 25, 29, 33, 36, 36, 34, 28, 32, 35, 37, 37, 34, 31,
+    26, 31, 34, 37, 36, 33, 31, 25, 29, 33, 34, 35, 33, 30, 24, 28, 31, 33, 33,
+    33, 30, 23, 26, 29, 32, 33, 32, 30, 20, 24, 28, 31, 32, 32, 30, 18, 22, 26,
+    30, 30, 30, 28, 25, 30, 32, 32, 32, 30, 25, 24, 27, 30, 31, 32, 30, 25, 22,
+    26, 28, 29, 29, 28, 24, 20, 25, 26, 27, 27, 27, 24, 16, 23, 25, 26, 26, 27,
+    24, 13, 22, 24, 23, 25, 25, 24, 13, 18, 21, 22, 23, 23, 22, 23, 24, 24, 25,
+    26, 23, 14, 19, 22, 22, 23, 23, 22, 14, 16, 21, 21, 21, 23, 20, 15, 12, 19,
+    19, 19, 19, 18, 15, 12, 17, 18, 18, 18, 17, 12, 12, 14, 15, 16, 16, 16, 9,
+    14, 12, 13, 14, 15, 15, 7,  10, 15, 16, 16, 15, 11, 13, 7,  13, 14, 15, 14,
+    10, 13, 7,  11, 12, 12, 12, 8,  12, 7,  8,  10, 10, 10, 7,  8,  7,  5,  8,
+    8,  8,  5,  8,  8,  7,  6,  6,  6,  3,  8,  10, 9,  8,  6,  4,  3,  6,  3,
+    5,  6,  6,  7,  9,  11, 3,  3,  4,  4,  6,  8,  10, 3,  1,  2,  2,  4,  6,
+    9,  3,  0,  2,  2,  2,  5,  7,  3,  2,  3,  3,  3,  3,  6,  5,  5,  7,  5,
+    3,  3,  4,  7,  8,  7,  5,  4,  3,  3,  2,  4,  4,  2,  5,  7,  10, 2,  4,
+    5,  3,  4,  6,  9,  2,  5,  6,  3,  2,  5,  6,  2,  4,  5,  3,  1,  2,  5,
+    2,  4,  6,  5,  3,  3,  3,  4,  5,  7,  7,  4,  3,  3,  7,  7,  8,  9,  5,
+    3,  3,  33, 36, 41, 43, 44, 41, 38, 31, 35, 39, 43, 44, 41, 37, 30, 35, 37,
+    41, 43, 38, 35, 29, 33, 35, 39, 41, 38, 34, 27, 29, 33, 38, 40, 37, 33, 25,
+    28, 32, 36, 40, 38, 34, 23, 26, 32, 34, 37, 38, 35, 30, 34, 38, 40, 40, 37,
+    33, 29, 33, 36, 40, 40, 37, 32, 26, 32, 35, 39, 38, 35, 32, 26, 29, 32, 36,
+    35, 33, 31, 25, 27, 30, 34, 34, 33, 29, 22, 26, 29, 33, 32, 32, 30, 19, 24,
+    27, 31, 31, 32, 29, 27, 31, 34, 34, 34, 32, 27, 26, 29, 32, 33, 33, 32, 26,
+    24, 28, 30, 31, 31, 30, 24, 20, 27, 27, 28, 28, 27, 23, 16, 25, 26, 27, 27,
+    26, 23, 13, 24, 24, 25, 25, 26, 23, 14, 21, 23, 23, 24, 24, 22, 23, 25, 26,
+    27, 28, 25, 17, 20, 24, 25, 26, 25, 22, 16, 15, 23, 23, 23, 23, 21, 17, 12,
+    20, 20, 20, 19, 18, 16, 12, 17, 19, 19, 19, 16, 13, 13, 14, 17, 17, 17, 16,
+    9,  14, 12, 15, 16, 16, 15, 7,  11, 17, 18, 19, 17, 12, 16, 8,  15, 16, 17,
+    16, 10, 16, 8,  12, 14, 14, 13, 8,  12, 8,  8,  11, 11, 10, 7,  9,  8,  5,
+    10, 10, 9,  5,  6,  8,  7,  7,  7,  7,  4,  8,  10, 9,  8,  6,  6,  3,  5,
+    3,  7,  8,  9,  8,  10, 13, 3,  5,  6,  7,  7,  9,  10, 3,  2,  4,  4,  5,
+    6,  8,  3,  2,  0,  0,  3,  6,  6,  3,  2,  5,  5,  4,  3,  5,  5,  6,  11,
+    10, 6,  3,  5,  7,  11, 13, 11, 8,  4,  4,  1,  7,  7,  4,  7,  9,  10, 1,
+    7,  9,  3,  6,  7,  9,  1,  7,  11, 4,  3,  5,  6,  1,  7,  11, 6,  1,  2,
+    5,  1,  7,  12, 10, 7,  4,  3,  4,  10, 13, 13, 10, 5,  3,  9,  13, 14, 15,
+    11, 7,  3,  33, 36, 40, 42, 44, 41, 37, 30, 34, 38, 44, 43, 40, 35, 29, 33,
+    38, 41, 42, 38, 34, 28, 31, 35, 37, 40, 37, 32, 26, 28, 32, 35, 39, 36, 33,
+    25, 27, 30, 34, 38, 36, 33, 23, 26, 30, 33, 36, 36, 33, 29, 33, 36, 41, 38,
+    36, 32, 28, 32, 36, 39, 38, 35, 31, 26, 30, 33, 37, 36, 33, 29, 25, 27, 32,
+    34, 34, 31, 28, 24, 26, 30, 32, 33, 32, 28, 22, 25, 28, 31, 31, 31, 28, 18,
+    23, 27, 29, 30, 30, 27, 27, 31, 33, 33, 34, 31, 25, 25, 28, 31, 32, 32, 30,
+    23, 22, 27, 29, 30, 30, 28, 22, 19, 25, 26, 26, 27, 26, 21, 15, 25, 25, 26,
+    25, 24, 21, 12, 23, 24, 24, 24, 23, 21, 13, 20, 21, 22, 23, 22, 19, 22, 24,
+    25, 25, 27, 23, 16, 18, 22, 24, 24, 24, 21, 15, 14, 21, 23, 22, 21, 18, 15,
+    12, 19, 19, 19, 19, 15, 15, 12, 16, 19, 18, 17, 14, 12, 13, 14, 16, 16, 16,
+    14, 8,  13, 12, 14, 15, 15, 14, 5,  10, 17, 17, 18, 16, 12, 16, 7,  15, 16,
+    16, 15, 9,  16, 7,  11, 14, 13, 12, 7,  11, 7,  7,  11, 10, 9,  4,  7,  7,
+    5,  10, 9,  8,  3,  5,  8,  7,  7,  7,  7,  3,  5,  10, 9,  8,  5,  5,  2,
+    4,  2,  7,  8,  8,  8,  10, 13, 2,  5,  6,  7,  7,  8,  10, 2,  1,  4,  4,
+    4,  5,  6,  2,  2,  0,  0,  2,  4,  5,  3,  2,  5,  5,  4,  2,  4,  5,  6,
+    11, 10, 6,  3,  3,  7,  10, 13, 12, 7,  4,  3,  2,  6,  6,  4,  7,  9,  10,
+    1,  6,  7,  3,  6,  6,  7,  1,  6,  8,  4,  2,  3,  5,  1,  6,  8,  5,  1,
+    2,  3,  1,  7,  11, 11, 6,  4,  3,  4,  10, 15, 15, 9,  5,  2,  9,  13, 16,
+    16, 11, 6,  3,  28, 32, 36, 40, 41, 36, 33, 27, 31, 35, 39, 40, 35, 32, 26,
+    29, 34, 36, 39, 35, 30, 24, 27, 31, 34, 36, 32, 29, 22, 25, 28, 31, 34, 32,
+    29, 21, 24, 26, 30, 33, 32, 29, 19, 22, 25, 28, 33, 31, 29, 26, 29, 34, 37,
+    35, 33, 29, 25, 28, 32, 36, 35, 32, 28, 23, 27, 31, 34, 33, 30, 25, 22, 25,
+    28, 30, 30, 28, 24, 20, 22, 25, 28, 28, 27, 23, 19, 22, 24, 27, 27, 27, 24,
+    16, 19, 23, 26, 25, 26, 24, 23, 26, 29, 29, 31, 28, 23, 22, 26, 28, 28, 29,
+    26, 21, 20, 23, 26, 25, 26, 25, 19, 17, 22, 22, 22, 23, 22, 18, 13, 21, 21,
+    21, 21, 21, 17, 11, 19, 20, 20, 20, 19, 17, 12, 17, 18, 19, 19, 19, 16, 20,
+    21, 22, 22, 24, 22, 15, 16, 20, 20, 21, 22, 19, 13, 13, 18, 19, 18, 18, 16,
+    13, 10, 16, 15, 15, 15, 13, 12, 9,  14, 15, 14, 14, 12, 9,  10, 12, 12, 12,
+    12, 11, 6,  12, 10, 11, 11, 11, 11, 4,  8,  14, 14, 15, 14, 11, 14, 5,  12,
+    12, 13, 13, 8,  13, 5,  10, 10, 10, 10, 6,  8,  5,  5,  7,  6,  6,  3,  5,
+    5,  4,  5,  5,  5,  2,  3,  6,  6,  7,  5,  3,  2,  4,  8,  9,  9,  6,  4,
+    2,  3,  1,  4,  5,  6,  8,  9,  12, 1,  2,  4,  5,  6,  7,  8,  1,  2,  2,
+    2,  4,  4,  5,  1,  2,  4,  2,  0,  3,  4,  2,  4,  6,  6,  4,  2,  3,  4,
+    8,  12, 10, 6,  3,  2,  8,  11, 13, 11, 7,  4,  2,  4,  5,  4,  4,  6,  8,
+    9,  4,  5,  5,  4,  5,  6,  6,  4,  6,  6,  3,  2,  3,  3,  3,  7,  8,  4,
+    3,  1,  2,  4,  6,  9,  9,  7,  4,  2,  6,  10, 13, 13, 9,  5,  2,  11, 13,
+    14, 14, 10, 6,  3,  25, 28, 32, 36, 36, 34, 29, 23, 26, 31, 35, 35, 31, 28,
+    22, 25, 29, 33, 33, 30, 25, 20, 23, 27, 30, 33, 28, 24, 17, 20, 23, 26, 29,
+    27, 24, 16, 19, 22, 25, 28, 27, 24, 14, 17, 21, 24, 28, 27, 24, 21, 25, 29,
+    32, 32, 28, 25, 21, 24, 28, 31, 32, 27, 23, 18, 22, 27, 29, 29, 25, 22, 19,
+    20, 24, 27, 26, 24, 20, 16, 18, 20, 23, 23, 22, 20, 14, 17, 19, 22, 22, 22,
+    19, 11, 14, 18, 21, 21, 21, 20, 19, 22, 25, 26, 27, 25, 20, 18, 21, 24, 25,
+    24, 23, 19, 17, 20, 22, 22, 22, 22, 16, 15, 18, 18, 18, 19, 19, 14, 11, 16,
+    16, 16, 16, 16, 14, 9,  14, 15, 15, 15, 15, 14, 9,  12, 13, 13, 14, 14, 13,
+    17, 17, 18, 18, 20, 19, 12, 15, 15, 17, 17, 17, 16, 10, 11, 15, 15, 15, 14,
+    14, 9,  7,  12, 11, 11, 11, 11, 9,  7,  10, 9,  9,  9,  8,  6,  8,  7,  8,
+    8,  8,  7,  3,  9,  9,  6,  6,  6,  6,  3,  7,  9,  9,  10, 11, 10, 12, 3,
+    8,  8,  9,  9,  7,  10, 3,  6,  6,  6,  6,  5,  6,  3,  3,  3,  2,  2,  2,
+    3,  2,  4,  3,  3,  3,  1,  3,  5,  7,  7,  6,  4,  2,  2,  7,  9,  9,  7,
+    5,  3,  2,  2,  3,  4,  5,  6,  8,  10, 2,  3,  4,  5,  5,  6,  7,  2,  4,
+    4,  3,  3,  3,  4,  2,  5,  5,  4,  3,  0,  2,  2,  6,  8,  6,  5,  3,  2,
+    6,  9,  12, 9,  6,  4,  1,  9,  11, 12, 11, 7,  5,  2,  6,  8,  6,  4,  6,
+    7,  8,  6,  8,  7,  5,  5,  5,  5,  6,  8,  9,  4,  2,  2,  3,  6,  9,  11,
+    5,  3,  2,  1,  6,  8,  10, 10, 7,  5,  2,  8,  11, 13, 12, 8,  5,  3,  10,
+    13, 14, 14, 10, 6,  4,  20, 24, 28, 32, 31, 29, 25, 19, 23, 27, 31, 31, 28,
+    24, 18, 21, 25, 28, 31, 27, 22, 17, 19, 22, 26, 28, 25, 19, 13, 16, 19, 22,
+    26, 23, 20, 11, 15, 17, 20, 24, 23, 19, 10, 13, 16, 19, 23, 23, 20, 18, 22,
+    25, 29, 28, 25, 21, 17, 21, 24, 27, 28, 24, 20, 15, 19, 23, 25, 24, 22, 18,
+    14, 17, 19, 22, 22, 20, 16, 11, 14, 16, 18, 19, 19, 15, 10, 12, 15, 18, 18,
+    18, 15, 7,  10, 14, 16, 16, 16, 15, 15, 19, 20, 22, 23, 21, 17, 14, 17, 20,
+    21, 21, 19, 15, 13, 16, 18, 18, 18, 18, 13, 12, 14, 15, 14, 14, 14, 10, 9,
+    11, 12, 12, 12, 11, 10, 5,  10, 11, 10, 11, 11, 11, 6,  8,  10, 9,  9,  9,
+    9,  13, 13, 14, 15, 16, 16, 10, 12, 12, 12, 13, 13, 13, 8,  9,  10, 11, 10,
+    10, 10, 7,  5,  8,  7,  7,  7,  7,  6,  4,  5,  5,  4,  4,  4,  3,  5,  4,
+    3,  3,  3,  3,  2,  6,  6,  3,  2,  2,  2,  1,  4,  5,  6,  7,  7,  9,  10,
+    2,  4,  5,  6,  6,  7,  8,  2,  3,  4,  4,  4,  4,  5,  2,  3,  3,  2,  2,
+    1,  2,  1,  6,  4,  3,  3,  2,  1,  5,  6,  6,  4,  3,  2,  0,  5,  7,  7,
+    5,  4,  3,  1,  5,  5,  5,  5,  6,  8,  9,  5,  6,  5,  5,  5,  5,  6,  5,
+    7,  5,  4,  3,  3,  3,  5,  7,  6,  5,  4,  3,  0,  6,  8,  8,  6,  4,  3,
+    1,  6,  9,  11, 8,  5,  3,  2,  7,  9,  11, 10, 6,  4,  2,  7,  9,  7,  5,
+    6,  7,  7,  8,  10, 9,  5,  5,  5,  5,  8,  10, 10, 5,  3,  2,  2,  8,  9,
+    11, 7,  4,  3,  2,  8,  9,  12, 10, 6,  4,  2,  8,  10, 14, 13, 8,  4,  3,
+    9,  12, 14, 14, 9,  5,  3,  27, 31, 32, 35, 35, 33, 30, 25, 29, 33, 35, 35,
+    32, 29, 23, 27, 30, 33, 34, 31, 29, 23, 26, 28, 31, 33, 28, 26, 20, 23, 25,
+    28, 30, 28, 26, 18, 22, 24, 27, 30, 28, 26, 15, 19, 22, 26, 28, 28, 26, 24,
+    28, 30, 33, 32, 30, 27, 23, 27, 30, 31, 31, 29, 26, 21, 25, 28, 31, 30, 28,
+    26, 20, 24, 27, 28, 28, 25, 23, 18, 20, 23, 25, 25, 26, 23, 16, 18, 22, 25,
+    25, 24, 23, 12, 15, 20, 23, 24, 24, 23, 22, 25, 27, 27, 28, 26, 23, 20, 24,
+    26, 28, 28, 26, 22, 18, 23, 25, 25, 24, 26, 22, 17, 20, 22, 22, 22, 24, 20,
+    12, 18, 19, 20, 20, 21, 19, 9,  15, 17, 18, 19, 20, 19, 10, 12, 15, 16, 17,
+    19, 19, 18, 20, 20, 22, 22, 22, 12, 16, 18, 19, 20, 21, 20, 13, 13, 17, 17,
+    18, 18, 18, 13, 9,  14, 14, 14, 15, 15, 12, 8,  12, 12, 12, 12, 13, 8,  9,
+    9,  9,  10, 11, 11, 6,  10, 10, 7,  8,  9,  9,  7,  9,  11, 12, 13, 13, 10,
+    12, 4,  9,  10, 11, 11, 9,  12, 4,  8,  8,  8,  9,  8,  10, 4,  4,  5,  5,
+    5,  6,  6,  3,  2,  2,  2,  2,  3,  6,  5,  5,  5,  4,  2,  2,  6,  8,  8,
+    6,  4,  2,  1,  5,  2,  3,  4,  4,  7,  9,  11, 2,  4,  4,  4,  6,  8,  9,
+    2,  4,  4,  4,  3,  6,  8,  2,  3,  3,  3,  2,  2,  6,  0,  3,  4,  3,  2,
+    1,  5,  3,  4,  7,  5,  2,  1,  3,  6,  7,  8,  7,  3,  2,  1,  5,  8,  7,
+    5,  5,  8,  9,  5,  8,  9,  6,  4,  6,  9,  5,  8,  10, 6,  4,  3,  6,  5,
+    7,  10, 5,  2,  2,  3,  4,  6,  9,  7,  3,  2,  1,  4,  7,  10, 9,  5,  2,
+    1,  5,  9,  10, 10, 6,  3,  1,  34, 37, 40, 44, 42, 41, 38, 33, 35, 39, 43,
+    43, 40, 37, 30, 34, 38, 41, 43, 39, 36, 29, 32, 35, 39, 41, 37, 33, 26, 30,
+    32, 35, 39, 34, 33, 23, 26, 30, 33, 36, 37, 33, 21, 25, 29, 33, 36, 36, 34,
+    31, 35, 38, 42, 40, 37, 35, 29, 33, 37, 40, 41, 36, 33, 28, 31, 34, 38, 38,
+    36, 31, 26, 29, 33, 35, 35, 34, 29, 23, 26, 29, 32, 31, 31, 28, 20, 24, 27,
+    30, 31, 33, 29, 17, 21, 26, 29, 30, 30, 29, 27, 31, 33, 36, 36, 33, 29, 26,
+    30, 32, 34, 34, 33, 28, 24, 28, 31, 32, 33, 32, 27, 21, 27, 27, 28, 29, 28,
+    24, 15, 23, 25, 25, 25, 25, 25, 12, 21, 23, 24, 24, 24, 24, 12, 18, 21, 22,
+    22, 23, 22, 25, 26, 27, 29, 28, 28, 19, 20, 23, 26, 26, 27, 24, 18, 16, 22,
+    24, 24, 24, 23, 17, 12, 20, 20, 20, 21, 20, 17, 11, 16, 17, 17, 17, 17, 13,
+    11, 13, 15, 15, 16, 15, 10, 12, 10, 12, 14, 14, 14, 8,  12, 17, 18, 19, 20,
+    16, 19, 8,  15, 17, 18, 18, 13, 18, 8,  13, 15, 15, 15, 11, 15, 8,  8,  11,
+    10, 11, 8,  9,  6,  3,  8,  7,  8,  6,  7,  7,  5,  4,  5,  5,  5,  8,  8,
+    7,  5,  3,  3,  4,  7,  3,  7,  8,  10, 11, 14, 16, 3,  6,  7,  8,  10, 12,
+    13, 3,  3,  5,  5,  7,  9,  11, 3,  2,  2,  2,  4,  6,  8,  3,  0,  3,  2,
+    1,  4,  7,  3,  3,  4,  3,  2,  3,  7,  5,  6,  5,  4,  2,  1,  5,  4,  6,
+    6,  6,  10, 12, 14, 4,  6,  7,  5,  8,  10, 11, 3,  6,  7,  4,  4,  7,  9,
+    4,  5,  7,  3,  2,  3,  5,  2,  4,  5,  4,  2,  1,  5,  3,  4,  6,  5,  3,
+    2,  4,  4,  5,  6,  6,  3,  2,  2,  38, 41, 46, 49, 49, 47, 45, 37, 41, 44,
+    48, 50, 45, 41, 35, 38, 43, 46, 48, 44, 40, 33, 36, 39, 43, 46, 43, 36, 31,
+    33, 37, 40, 43, 41, 36, 27, 30, 35, 38, 41, 40, 36, 25, 28, 33, 37, 40, 40,
+    37, 35, 40, 42, 46, 46, 42, 37, 33, 37, 42, 46, 46, 41, 37, 31, 36, 40, 43,
+    44, 40, 35, 30, 33, 37, 39, 40, 38, 33, 25, 30, 33, 36, 37, 36, 32, 22, 27,
+    32, 34, 35, 35, 32, 18, 25, 30, 33, 33, 34, 32, 31, 36, 38, 39, 41, 37, 32,
+    29, 35, 37, 38, 39, 36, 31, 27, 33, 34, 36, 36, 35, 29, 23, 31, 32, 32, 33,
+    31, 25, 17, 27, 28, 28, 28, 27, 25, 14, 25, 26, 27, 27, 27, 26, 13, 22, 25,
+    25, 26, 26, 24, 26, 30, 31, 32, 33, 31, 23, 22, 28, 30, 31, 30, 29, 22, 19,
+    25, 27, 28, 28, 26, 22, 15, 22, 24, 24, 24, 22, 20, 13, 17, 21, 21, 21, 18,
+    17, 13, 14, 18, 19, 19, 18, 13, 13, 11, 17, 17, 18, 17, 10, 14, 21, 22, 24,
+    23, 19, 23, 10, 19, 21, 21, 21, 15, 22, 10, 15, 19, 18, 18, 13, 17, 10, 9,
+    15, 15, 15, 10, 12, 8,  5,  12, 12, 11, 7,  9,  9,  6,  9,  9,  9,  7,  8,
+    9,  7,  7,  7,  7,  7,  7,  5,  11, 13, 13, 14, 17, 20, 5,  8,  11, 12, 13,
+    14, 16, 5,  4,  9,  9,  10, 11, 12, 5,  3,  5,  5,  6,  8,  8,  4,  3,  0,
+    0,  3,  6,  7,  4,  3,  6,  5,  1,  5,  8,  6,  5,  7,  6,  2,  4,  6,  4,
+    5,  5,  9,  13, 15, 16, 4,  6,  7,  8,  11, 13, 14, 4,  5,  9,  5,  8,  9,
+    11, 4,  5,  9,  4,  3,  6,  7,  2,  4,  7,  5,  2,  3,  7,  2,  5,  8,  7,
+    4,  3,  5,  4,  7,  8,  8,  5,  1,  4,  36, 40, 45, 47, 48, 45, 42, 35, 40,
+    43, 48, 47, 44, 40, 33, 37, 42, 45, 46, 43, 39, 32, 35, 39, 43, 44, 40, 35,
+    30, 32, 35, 39, 41, 38, 35, 27, 29, 32, 36, 40, 38, 34, 23, 28, 32, 34, 38,
+    38, 34, 34, 38, 41, 45, 46, 41, 37, 33, 35, 40, 44, 44, 38, 35, 31, 35, 39,
+    42, 42, 38, 33, 28, 32, 35, 39, 38, 35, 31, 24, 29, 32, 34, 36, 33, 30, 20,
+    27, 30, 33, 33, 32, 30, 17, 24, 29, 32, 31, 31, 30, 31, 35, 36, 38, 38, 37,
+    30, 28, 34, 36, 36, 38, 35, 29, 25, 32, 35, 34, 34, 33, 26, 21, 29, 31, 31,
+    30, 30, 23, 15, 26, 27, 28, 27, 25, 24, 12, 23, 26, 27, 25, 25, 24, 12, 21,
+    24, 24, 24, 24, 22, 25, 30, 29, 32, 31, 29, 23, 20, 27, 29, 29, 29, 26, 21,
+    17, 26, 27, 26, 26, 23, 20, 14, 21, 23, 23, 22, 20, 19, 12, 17, 20, 20, 19,
+    16, 15, 12, 13, 18, 18, 18, 15, 12, 12, 10, 16, 16, 17, 15, 8,  12, 20, 22,
+    22, 21, 17, 22, 9,  18, 19, 21, 20, 14, 21, 9,  14, 18, 17, 17, 11, 16, 9,
+    8,  15, 14, 13, 8,  11, 8,  4,  12, 11, 9,  5,  8,  7,  5,  9,  9,  8,  4,
+    6,  8,  6,  7,  7,  7,  4,  5,  5,  11, 12, 13, 13, 15, 19, 5,  7,  11, 11,
+    12, 13, 14, 5,  4,  9,  8,  9,  10, 11, 5,  3,  5,  5,  6,  6,  6,  3,  2,
+    0,  0,  2,  4,  5,  3,  3,  6,  5,  1,  3,  5,  5,  5,  7,  7,  2,  3,  4,
+    4,  5,  5,  9,  12, 14, 15, 4,  5,  5,  8,  10, 12, 12, 4,  5,  6,  5,  7,
+    8,  9,  4,  4,  6,  3,  3,  4,  5,  2,  4,  7,  6,  1,  3,  4,  1,  5,  11,
+    11, 4,  1,  4,  4,  8,  12, 12, 6,  1,  3,  33, 37, 41, 43, 44, 41, 38, 31,
+    35, 39, 43, 44, 39, 36, 29, 34, 37, 42, 42, 38, 33, 28, 31, 34, 39, 41, 36,
+    30, 26, 28, 31, 35, 37, 33, 31, 23, 24, 28, 32, 35, 34, 30, 21, 24, 27, 30,
+    35, 34, 30, 30, 33, 38, 41, 40, 37, 32, 29, 31, 36, 40, 41, 37, 31, 28, 30,
+    35, 37, 37, 34, 29, 26, 28, 31, 34, 34, 32, 26, 22, 25, 27, 30, 31, 29, 25,
+    19, 23, 26, 29, 29, 28, 25, 14, 21, 25, 27, 27, 27, 25, 28, 31, 33, 34, 35,
+    33, 28, 26, 30, 32, 33, 33, 31, 25, 22, 28, 30, 29, 30, 29, 23, 19, 27, 27,
+    26, 28, 25, 19, 13, 22, 24, 23, 23, 22, 19, 10, 20, 22, 21, 21, 21, 20, 9,
+    18, 20, 20, 20, 20, 18, 23, 26, 26, 27, 27, 27, 20, 18, 24, 25, 25, 26, 23,
+    18, 15, 22, 23, 23, 22, 21, 17, 12, 19, 19, 19, 20, 17, 15, 10, 14, 16, 15,
+    15, 13, 12, 9,  10, 15, 14, 14, 12, 9,  9,  7,  13, 13, 13, 12, 6,  11, 18,
+    18, 19, 19, 15, 19, 7,  16, 16, 18, 17, 12, 18, 7,  12, 15, 14, 14, 10, 13,
+    7,  7,  11, 11, 10, 6,  8,  5,  2,  7,  7,  6,  4,  5,  5,  3,  5,  4,  5,
+    3,  4,  5,  4,  3,  3,  3,  3,  4,  3,  9,  9,  10, 12, 13, 17, 3,  7,  9,
+    9,  11, 11, 12, 3,  4,  8,  7,  8,  8,  9,  3,  3,  4,  4,  4,  5,  4,  2,
+    1,  3,  2,  0,  3,  4,  2,  3,  5,  4,  2,  2,  4,  3,  4,  5,  5,  3,  1,
+    3,  4,  5,  6,  9,  11, 13, 13, 4,  5,  6,  8,  9,  10, 10, 4,  5,  6,  6,
+    6,  7,  7,  4,  3,  5,  2,  2,  3,  3,  2,  3,  6,  5,  3,  1,  3,  2,  5,
+    7,  6,  3,  2,  3,  4,  6,  7,  7,  4,  2,  2,  26, 31, 35, 39, 39, 35, 33,
+    26, 30, 33, 39, 38, 36, 31, 24, 29, 32, 36, 37, 33, 29, 23, 26, 30, 33, 34,
+    31, 26, 20, 24, 26, 29, 32, 29, 26, 18, 20, 23, 26, 30, 30, 26, 17, 18, 22,
+    26, 29, 29, 26, 24, 28, 32, 36, 35, 33, 29, 24, 26, 31, 35, 34, 30, 27, 22,
+    25, 29, 33, 31, 29, 24, 21, 24, 27, 29, 29, 27, 21, 18, 20, 23, 25, 25, 24,
+    21, 16, 19, 21, 23, 23, 24, 21, 13, 17, 20, 23, 22, 22, 22, 22, 25, 28, 28,
+    30, 28, 24, 21, 24, 27, 27, 28, 27, 22, 20, 23, 25, 25, 25, 25, 20, 17, 21,
+    22, 21, 22, 22, 16, 11, 18, 18, 18, 18, 18, 16, 7,  17, 17, 16, 16, 17, 16,
+    8,  15, 15, 15, 16, 16, 14, 20, 20, 20, 21, 23, 23, 16, 16, 19, 20, 20, 21,
+    19, 14, 13, 18, 18, 18, 17, 17, 13, 9,  15, 15, 14, 14, 14, 11, 7,  12, 11,
+    10, 10, 10, 8,  7,  8,  10, 9,  9,  9,  5,  7,  5,  8,  8,  7,  8,  3,  8,
+    12, 13, 14, 14, 13, 15, 4,  11, 11, 12, 13, 10, 13, 4,  10, 9,  9,  9,  8,
+    9,  4,  5,  6,  6,  5,  4,  5,  3,  2,  2,  2,  2,  2,  3,  3,  2,  3,  2,
+    1,  2,  3,  4,  3,  5,  3,  2,  0,  3,  3,  6,  7,  8,  9,  11, 13, 3,  5,
+    7,  8,  8,  9,  10, 3,  3,  5,  5,  6,  6,  6,  3,  3,  3,  2,  2,  3,  3,
+    1,  4,  6,  4,  3,  0,  3,  2,  5,  8,  5,  3,  2,  2,  4,  7,  8,  7,  4,
+    2,  2,  4,  6,  6,  7,  8,  10, 11, 4,  6,  6,  6,  7,  8,  8,  4,  6,  7,
+    4,  4,  4,  6,  4,  6,  8,  4,  2,  1,  2,  3,  8,  9,  7,  4,  2,  2,  6,
+    8,  10, 9,  5,  3,  0,  7,  9,  10, 9,  6,  4,  2,  21, 26, 31, 32, 34, 32,
+    27, 20, 24, 28, 32, 34, 30, 25, 19, 22, 27, 30, 32, 28, 23, 18, 21, 24, 28,
+    30, 26, 21, 15, 18, 21, 24, 27, 24, 21, 13, 15, 18, 21, 24, 24, 20, 12, 14,
+    17, 21, 24, 25, 21, 20, 23, 26, 31, 29, 27, 24, 19, 22, 26, 29, 29, 26, 22,
+    17, 21, 24, 27, 27, 24, 19, 16, 18, 21, 24, 23, 22, 17, 13, 15, 17, 20, 20,
+    20, 17, 12, 13, 16, 19, 19, 19, 17, 9,  12, 15, 18, 17, 18, 17, 18, 20, 22,
+    23, 25, 23, 18, 16, 19, 21, 22, 23, 21, 16, 15, 18, 19, 19, 19, 19, 15, 14,
+    16, 16, 16, 16, 16, 12, 9,  12, 13, 13, 12, 13, 12, 6,  12, 12, 12, 11, 12,
+    12, 6,  10, 11, 10, 11, 11, 10, 15, 15, 15, 16, 17, 18, 11, 13, 13, 14, 15,
+    15, 15, 9,  10, 12, 12, 12, 12, 11, 8,  6,  11, 9,  8,  8,  8,  7,  4,  7,
+    6,  6,  5,  5,  4,  5,  5,  5,  4,  4,  4,  2,  6,  4,  3,  3,  3,  3,  2,
+    6,  7,  7,  8,  9,  10, 11, 2,  5,  6,  7,  7,  8,  9,  2,  4,  5,  4,  5,
+    5,  5,  2,  2,  2,  2,  1,  2,  2,  1,  4,  4,  3,  2,  2,  2,  3,  5,  5,
+    4,  2,  2,  1,  4,  6,  7,  4,  3,  3,  0,  3,  4,  5,  6,  7,  8,  10, 4,
+    5,  5,  6,  6,  6,  7,  4,  7,  5,  4,  4,  4,  4,  4,  6,  5,  4,  3,  2,
+    1,  4,  7,  8,  5,  4,  3,  0,  6,  7,  9,  7,  4,  3,  2,  6,  8,  10, 8,
+    5,  3,  2,  7,  9,  7,  5,  6,  8,  8,  7,  9,  8,  5,  5,  5,  5,  7,  9,
+    10, 5,  3,  2,  3,  7,  8,  11, 6,  4,  3,  1,  7,  9,  11, 8,  5,  3,  2,
+    8,  9,  12, 11, 6,  4,  2,  8,  10, 12, 12, 8,  5,  3,  31, 34, 37, 39, 39,
+    37, 34, 28, 33, 36, 38, 38, 35, 32, 27, 31, 34, 37, 37, 35, 31, 26, 28, 32,
+    34, 35, 32, 27, 22, 25, 29, 30, 32, 29, 27, 18, 22, 24, 26, 30, 29, 27, 15,
+    19, 23, 26, 29, 28, 27, 26, 31, 35, 36, 36, 34, 32, 26, 30, 34, 36, 37, 33,
+    31, 24, 28, 31, 34, 34, 31, 28, 22, 26, 30, 32, 30, 30, 24, 20, 22, 25, 28,
+    27, 26, 24, 16, 19, 22, 24, 25, 25, 24, 12, 16, 20, 24, 24, 25, 24, 24, 29,
+    31, 31, 33, 30, 27, 23, 26, 29, 30, 31, 31, 26, 21, 26, 28, 28, 29, 29, 25,
+    19, 23, 25, 24, 25, 25, 20, 12, 19, 20, 21, 21, 21, 20, 8,  16, 18, 18, 19,
+    20, 20, 8,  13, 16, 16, 18, 18, 19, 21, 22, 24, 25, 25, 27, 18, 18, 20, 21,
+    24, 23, 24, 17, 14, 19, 21, 21, 21, 21, 16, 11, 17, 17, 17, 17, 17, 15, 8,
+    12, 12, 13, 13, 13, 11, 7,  9,  9,  10, 11, 12, 8,  9,  7,  7,  8,  9,  10,
+    8,  10, 14, 15, 16, 17, 17, 18, 6,  12, 13, 15, 15, 14, 17, 6,  11, 11, 11,
+    12, 11, 14, 6,  7,  8,  8,  8,  8,  7,  4,  2,  3,  3,  3,  5,  7,  3,  2,
+    2,  2,  0,  3,  7,  5,  5,  4,  2,  2,  2,  5,  5,  6,  8,  9,  12, 15, 17,
+    5,  5,  7,  8,  11, 13, 14, 5,  6,  6,  6,  8,  10, 11, 5,  5,  5,  5,  4,
+    6,  6,  3,  3,  4,  3,  2,  2,  6,  0,  4,  5,  4,  2,  1,  5,  4,  4,  6,
+    5,  2,  2,  3,  7,  9,  9,  8,  10, 13, 15, 7,  9,  10, 8,  8,  11, 13, 7,
+    9,  11, 7,  6,  7,  9,  7,  8,  10, 6,  4,  3,  5,  5,  7,  9,  6,  3,  1,
+    3,  4,  5,  9,  8,  3,  2,  1,  5,  6,  9,  9,  4,  2,  1,  37, 41, 44, 47,
+    48, 44, 42, 35, 39, 43, 47, 48, 44, 40, 33, 38, 41, 45, 45, 42, 38, 32, 36,
+    38, 42, 45, 40, 34, 29, 31, 35, 39, 39, 36, 34, 24, 28, 31, 33, 37, 37, 34,
+    22, 25, 29, 32, 36, 36, 34, 33, 36, 41, 46, 42, 42, 39, 31, 36, 41, 44, 45,
+    42, 36, 30, 34, 38, 41, 41, 39, 35, 29, 32, 36, 38, 39, 35, 30, 25, 29, 31,
+    34, 33, 33, 30, 20, 25, 28, 32, 31, 31, 28, 16, 22, 26, 31, 30, 30, 30, 30,
+    35, 36, 37, 39, 37, 33, 28, 33, 35, 36, 37, 36, 31, 26, 31, 33, 34, 34, 34,
+    29, 22, 29, 30, 31, 31, 30, 24, 16, 24, 26, 26, 25, 26, 25, 11, 21, 23, 24,
+    24, 24, 25, 10, 19, 21, 23, 23, 23, 22, 26, 29, 30, 31, 32, 33, 24, 21, 26,
+    29, 30, 31, 29, 23, 18, 25, 27, 27, 27, 26, 21, 14, 22, 23, 23, 23, 22, 19,
+    12, 16, 19, 19, 18, 17, 16, 11, 12, 15, 16, 16, 16, 12, 10, 8,  13, 14, 14,
+    15, 9,  13, 20, 21, 22, 24, 21, 24, 10, 18, 20, 20, 22, 18, 22, 10, 15, 17,
+    17, 18, 15, 17, 10, 9,  14, 14, 13, 10, 12, 8,  4,  9,  9,  9,  8,  9,  5,
+    3,  5,  5,  6,  6,  9,  7,  5,  3,  3,  4,  5,  7,  6,  12, 13, 14, 17, 19,
+    21, 6,  10, 11, 13, 15, 17, 18, 6,  6,  9,  10, 12, 13, 14, 6,  5,  6,  6,
+    8,  9,  8,  4,  3,  3,  3,  3,  6,  7,  4,  0,  4,  3,  1,  4,  7,  3,  3,
+    5,  3,  2,  3,  6,  6,  8,  8,  10, 15, 17, 19, 6,  8,  9,  9,  13, 15, 16,
+    6,  8,  9,  7,  9,  11, 12, 6,  7,  8,  5,  5,  7,  6,  4,  5,  6,  5,  2,
+    3,  7,  2,  4,  5,  4,  2,  1,  5,  3,  5,  5,  5,  3,  2,  4,  42, 47, 50,
+    55, 55, 54, 48, 41, 45, 49, 54, 55, 52, 45, 39, 43, 47, 51, 52, 50, 45, 38,
+    40, 45, 48, 51, 45, 39, 34, 38, 41, 44, 46, 42, 40, 31, 34, 38, 41, 44, 42,
+    39, 27, 30, 35, 40, 42, 43, 40, 40, 43, 48, 51, 52, 48, 44, 38, 43, 47, 51,
+    50, 46, 42, 35, 40, 45, 48, 48, 46, 42, 34, 38, 42, 44, 44, 42, 35, 29, 35,
+    38, 41, 40, 38, 34, 22, 31, 34, 37, 37, 38, 34, 19, 29, 33, 35, 36, 37, 36,
+    37, 40, 44, 44, 45, 44, 39, 33, 40, 42, 42, 43, 42, 37, 29, 38, 40, 41, 40,
+    39, 34, 25, 35, 37, 36, 37, 35, 30, 20, 30, 33, 33, 32, 29, 29, 14, 26, 30,
+    30, 29, 30, 29, 13, 23, 27, 29, 28, 28, 27, 29, 34, 36, 37, 39, 38, 30, 25,
+    32, 34, 36, 36, 34, 27, 21, 30, 33, 32, 33, 30, 26, 18, 26, 29, 28, 29, 26,
+    25, 16, 20, 25, 25, 24, 20, 21, 14, 14, 22, 21, 21, 20, 17, 14, 10, 19, 20,
+    20, 19, 13, 17, 27, 28, 29, 29, 25, 30, 13, 22, 27, 27, 27, 22, 28, 13, 18,
+    24, 23, 24, 18, 22, 13, 12, 20, 20, 19, 13, 17, 11, 7,  16, 15, 14, 9,  12,
+    9,  5,  11, 11, 11, 8,  10, 9,  6,  8,  10, 10, 8,  9,  9,  15, 18, 20, 20,
+    23, 26, 9,  12, 17, 18, 19, 20, 22, 9,  8,  15, 15, 16, 17, 17, 9,  7,  11,
+    11, 12, 11, 11, 7,  5,  6,  6,  5,  8,  9,  5,  4,  0,  1,  4,  6,  9,  5,
+    3,  2,  2,  3,  6,  8,  7,  8,  11, 16, 19, 21, 22, 7,  7,  9,  14, 18, 18,
+    18, 8,  7,  8,  11, 14, 15, 15, 7,  6,  6,  7,  10, 10, 9,  6,  4,  5,  3,
+    3,  5,  8,  4,  2,  4,  4,  2,  5,  7,  3,  2,  4,  4,  2,  4,  6,  42, 45,
+    48, 52, 53, 51, 46, 40, 42, 47, 52, 52, 48, 43, 38, 42, 46, 49, 52, 47, 42,
+    35, 40, 44, 46, 48, 45, 38, 32, 37, 39, 44, 44, 42, 38, 29, 33, 36, 39, 42,
+    41, 37, 26, 30, 34, 38, 41, 41, 38, 38, 42, 46, 49, 48, 46, 43, 37, 40, 45,
+    49, 48, 44, 40, 35, 38, 43, 47, 46, 42, 35, 33, 38, 40, 43, 41, 39, 33, 26,
+    34, 36, 39, 38, 36, 32, 22, 29, 32, 36, 35, 35, 32, 17, 28, 32, 35, 34, 34,
+    33, 35, 40, 42, 42, 44, 41, 35, 31, 39, 39, 42, 42, 39, 33, 28, 37, 39, 38,
+    38, 37, 30, 24, 33, 34, 35, 35, 32, 28, 18, 28, 31, 31, 30, 29, 28, 13, 24,
+    29, 28, 29, 28, 28, 13, 21, 27, 27, 27, 27, 25, 27, 34, 34, 35, 37, 33, 27,
+    23, 30, 33, 34, 33, 31, 26, 20, 27, 32, 31, 30, 27, 24, 16, 24, 28, 28, 27,
+    23, 23, 14, 17, 24, 23, 23, 18, 19, 13, 13, 21, 21, 20, 17, 16, 12, 9,  19,
+    20, 19, 17, 11, 16, 24, 26, 27, 26, 23, 27, 12, 20, 25, 26, 24, 19, 26, 12,
+    16, 23, 23, 21, 15, 20, 12, 10, 19, 19, 17, 10, 15, 10, 6,  15, 15, 12, 7,
+    11, 9,  5,  11, 11, 11, 6,  8,  8,  5,  7,  9,  9,  6,  7,  8,  14, 18, 18,
+    18, 19, 24, 8,  9,  16, 16, 17, 17, 19, 8,  6,  14, 13, 14, 14, 14, 8,  5,
+    10, 9,  10, 9,  9,  6,  3,  5,  5,  4,  6,  7,  4,  3,  1,  0,  3,  5,  7,
+    4,  3,  1,  2,  2,  4,  6,  6,  7,  11, 14, 17, 19, 20, 6,  7,  10, 13, 15,
+    16, 16, 6,  6,  9,  10, 12, 13, 13, 6,  5,  5,  6,  8,  8,  7,  4,  4,  4,
+    3,  3,  4,  6,  3,  2,  6,  6,  1,  4,  5,  2,  3,  6,  6,  2,  3,  4,  34,
+    39, 42, 47, 46, 43, 40, 34, 37, 42, 46, 46, 43, 37, 32, 35, 40, 44, 45, 41,
+    36, 31, 33, 37, 40, 42, 38, 32, 28, 30, 33, 37, 38, 36, 33, 25, 27, 29, 33,
+    37, 36, 32, 23, 25, 28, 32, 35, 36, 32, 32, 35, 40, 44, 44, 40, 36, 32, 35,
+    38, 43, 42, 38, 33, 30, 33, 38, 40, 40, 36, 31, 28, 31, 34, 37, 36, 34, 28,
+    22, 29, 30, 34, 33, 30, 27, 19, 25, 27, 30, 30, 30, 28, 15, 25, 27, 29, 29,
+    30, 27, 30, 34, 37, 36, 36, 34, 29, 27, 32, 34, 35, 36, 33, 28, 24, 30, 33,
+    32, 32, 30, 25, 21, 29, 29, 30, 30, 27, 23, 15, 24, 26, 26, 25, 23, 22, 11,
+    22, 24, 23, 23, 22, 22, 10, 19, 22, 22, 22, 22, 20, 25, 28, 28, 29, 30, 29,
+    23, 20, 26, 27, 28, 28, 25, 20, 16, 24, 26, 25, 25, 22, 19, 13, 20, 22, 21,
+    22, 18, 18, 11, 15, 19, 18, 17, 14, 14, 10, 11, 17, 15, 15, 14, 11, 10, 7,
+    15, 14, 14, 13, 7,  12, 20, 20, 21, 21, 17, 22, 9,  17, 19, 20, 19, 14, 20,
+    9,  13, 17, 17, 16, 11, 15, 9,  8,  14, 13, 12, 7,  10, 7,  3,  10, 9,  8,
+    4,  7,  6,  3,  7,  6,  6,  3,  5,  5,  4,  5,  5,  4,  4,  4,  5,  10, 12,
+    12, 13, 15, 19, 5,  8,  11, 11, 12, 13, 14, 4,  4,  10, 9,  9,  10, 10, 5,
+    3,  6,  6,  6,  6,  5,  3,  2,  1,  1,  2,  3,  4,  2,  1,  4,  3,  0,  3,
+    4,  3,  2,  4,  3,  2,  2,  3,  5,  5,  8,  10, 12, 14, 15, 5,  5,  7,  10,
+    11, 12, 12, 5,  5,  6,  7,  8,  9,  9,  5,  4,  4,  4,  4,  5,  4,  3,  2,
+    5,  4,  2,  2,  4,  1,  4,  5,  5,  2,  2,  3,  3,  4,  5,  5,  3,  0,  2,
+    28, 33, 37, 40, 41, 38, 35, 28, 31, 36, 40, 39, 37, 33, 26, 29, 35, 38, 38,
+    34, 31, 26, 28, 31, 35, 37, 33, 28, 23, 25, 28, 30, 34, 31, 27, 19, 22, 24,
+    28, 32, 31, 27, 18, 21, 23, 27, 30, 31, 28, 27, 30, 34, 38, 36, 35, 30, 26,
+    30, 32, 37, 37, 33, 28, 25, 28, 31, 34, 33, 32, 26, 23, 26, 28, 30, 30, 28,
+    22, 20, 22, 25, 27, 27, 26, 22, 17, 20, 22, 25, 25, 25, 22, 13, 19, 21, 24,
+    24, 25, 22, 25, 28, 29, 30, 31, 30, 25, 23, 26, 29, 30, 29, 28, 23, 21, 26,
+    27, 27, 27, 27, 21, 18, 23, 23, 23, 24, 23, 17, 12, 20, 20, 20, 20, 19, 17,
+    8,  19, 19, 18, 18, 18, 17, 8,  16, 17, 17, 17, 17, 15, 21, 22, 22, 23, 24,
+    23, 17, 17, 21, 22, 22, 23, 21, 15, 13, 19, 20, 20, 19, 18, 14, 10, 16, 16,
+    16, 16, 15, 13, 8,  12, 13, 12, 12, 11, 10, 8,  9,  11, 11, 10, 10, 6,  8,
+    6,  10, 9,  9,  9,  4,  9,  14, 15, 16, 16, 13, 17, 5,  13, 13, 14, 14, 10,
+    15, 6,  11, 11, 11, 11, 8,  10, 6,  6,  8,  7,  7,  5,  6,  4,  2,  4,  3,
+    3,  3,  3,  3,  2,  2,  1,  2,  2,  3,  4,  2,  4,  2,  1,  2,  3,  3,  7,
+    8,  9,  10, 12, 14, 3,  6,  7,  8,  9,  10, 10, 3,  4,  6,  6,  6,  7,  7,
+    3,  3,  3,  3,  3,  4,  3,  1,  3,  5,  3,  2,  1,  3,  1,  5,  6,  4,  3,
+    0,  3,  2,  5,  6,  6,  3,  2,  2,  4,  6,  6,  7,  9,  11, 12, 4,  7,  6,
+    7,  8,  9,  9,  4,  6,  6,  5,  5,  5,  6,  4,  5,  6,  3,  2,  2,  2,  2,
+    5,  7,  6,  3,  2,  2,  5,  6,  8,  7,  4,  2,  1,  5,  7,  8,  8,  5,  3,
+    0,  24, 28, 32, 36, 35, 32, 29, 23, 26, 30, 34, 36, 32, 28, 21, 25, 29, 32,
+    34, 31, 25, 19, 22, 26, 30, 32, 28, 23, 17, 20, 22, 26, 28, 27, 23, 15, 17,
+    20, 23, 27, 26, 23, 14, 16, 19, 22, 25, 26, 23, 21, 24, 28, 34, 32, 28, 26,
+    20, 24, 28, 31, 31, 28, 24, 18, 22, 26, 29, 28, 26, 22, 18, 20, 23, 25, 26,
+    23, 19, 15, 17, 20, 22, 21, 21, 18, 13, 15, 18, 20, 20, 21, 19, 11, 13, 17,
+    20, 19, 19, 18, 18, 22, 24, 25, 27, 25, 20, 17, 20, 23, 24, 24, 23, 19, 17,
+    19, 22, 22, 21, 22, 17, 14, 18, 18, 18, 18, 18, 14, 10, 14, 15, 15, 15, 15,
+    14, 6,  13, 14, 13, 13, 14, 13, 6,  12, 12, 12, 12, 13, 12, 17, 17, 17, 18,
+    20, 20, 13, 14, 15, 16, 17, 17, 17, 11, 11, 14, 14, 14, 14, 13, 10, 7,  12,
+    11, 11, 11, 10, 9,  5,  9,  8,  7,  7,  7,  5,  6,  7,  7,  6,  6,  6,  3,
+    7,  4,  5,  5,  5,  5,  3,  7,  9,  9,  10, 11, 11, 13, 2,  7,  8,  9,  9,
+    8,  11, 2,  6,  6,  6,  6,  6,  7,  2,  3,  3,  2,  2,  3,  3,  1,  2,  2,
+    2,  2,  0,  2,  2,  4,  5,  4,  2,  1,  2,  3,  6,  7,  4,  3,  2,  2,  3,
+    4,  5,  7,  8,  10, 11, 3,  4,  5,  6,  7,  7,  8,  3,  5,  4,  4,  4,  5,
+    5,  3,  4,  5,  3,  2,  1,  2,  3,  6,  8,  5,  4,  2,  2,  4,  8,  10, 7,
+    4,  3,  0,  6,  9,  10, 8,  5,  3,  1,  6,  8,  6,  5,  7,  8,  9,  6,  8,
+    8,  6,  6,  6,  7,  6,  8,  9,  5,  3,  3,  4,  6,  7,  10, 7,  5,  2,  0,
+    7,  9,  10, 8,  5,  3,  2,  8,  10, 11, 10, 6,  4,  2,  9,  10, 11, 11, 7,
+    5,  3,  33, 37, 40, 43, 42, 41, 37, 32, 36, 40, 42, 42, 40, 36, 30, 34, 38,
+    40, 41, 37, 34, 29, 32, 36, 37, 38, 33, 27, 25, 28, 32, 33, 32, 29, 28, 22,
+    24, 27, 28, 32, 29, 28, 16, 20, 24, 27, 29, 30, 28, 30, 34, 38, 40, 40, 38,
+    35, 29, 33, 37, 42, 40, 37, 34, 27, 31, 35, 38, 36, 34, 30, 26, 29, 32, 34,
+    34, 32, 25, 23, 26, 28, 31, 28, 27, 25, 18, 22, 24, 25, 27, 26, 25, 13, 17,
+    21, 24, 24, 25, 24, 27, 32, 33, 35, 36, 35, 31, 26, 29, 33, 34, 35, 34, 29,
+    24, 29, 31, 31, 31, 31, 26, 20, 26, 27, 28, 28, 26, 21, 14, 22, 24, 24, 22,
+    21, 21, 8,  17, 19, 19, 19, 20, 21, 7,  14, 17, 17, 18, 19, 19, 24, 25, 26,
+    28, 30, 30, 24, 20, 24, 25, 27, 27, 27, 22, 17, 23, 24, 24, 24, 23, 20, 13,
+    19, 20, 20, 20, 19, 17, 11, 14, 16, 16, 14, 13, 14, 8,  9,  11, 10, 11, 12,
+    10, 7,  5,  8,  9,  10, 10, 9,  12, 18, 19, 20, 22, 22, 23, 9,  17, 18, 19,
+    20, 19, 22, 9,  15, 16, 16, 16, 16, 16, 9,  11, 13, 13, 12, 10, 10, 6,  5,
+    8,  8,  4,  6,  8,  4,  3,  1,  2,  3,  5,  8,  3,  2,  2,  1,  2,  4,  7,
+    8,  12, 14, 15, 18, 21, 22, 8,  10, 12, 14, 16, 18, 18, 8,  8,  10, 10, 13,
+    14, 14, 8,  7,  7,  7,  8,  9,  7,  6,  5,  6,  5,  3,  4,  7,  3,  3,  5,
+    4,  3,  2,  6,  0,  3,  5,  5,  3,  2,  5,  8,  11, 11, 11, 16, 19, 20, 9,
+    11, 12, 10, 14, 16, 17, 9,  11, 12, 9,  10, 12, 13, 9,  10, 11, 8,  6,  6,
+    6,  7,  8,  10, 7,  4,  2,  5,  5,  7,  8,  7,  4,  3,  3,  4,  5,  7,  8,
+    4,  3,  2,  39, 43, 46, 51, 52, 48, 44, 38, 42, 45, 50, 49, 46, 43, 36, 39,
+    44, 48, 48, 45, 39, 35, 38, 42, 44, 45, 40, 34, 31, 35, 36, 40, 41, 37, 34,
+    27, 30, 33, 34, 38, 38, 34, 22, 26, 29, 34, 37, 37, 33, 36, 40, 46, 48, 48,
+    43, 41, 34, 38, 42, 47, 47, 42, 38, 32, 36, 41, 43, 44, 41, 35, 31, 34, 38,
+    41, 40, 37, 30, 27, 32, 34, 36, 34, 33, 30, 21, 27, 30, 31, 32, 33, 30, 15,
+    23, 25, 30, 30, 30, 29, 33, 36, 40, 41, 42, 40, 35, 31, 35, 38, 40, 41, 39,
+    33, 28, 34, 37, 38, 36, 36, 31, 24, 31, 33, 33, 33, 31, 26, 17, 27, 28, 29,
+    27, 26, 26, 12, 22, 25, 24, 24, 25, 26, 10, 18, 22, 23, 23, 24, 24, 27, 31,
+    32, 34, 35, 35, 28, 23, 30, 31, 32, 32, 33, 25, 20, 28, 30, 29, 29, 28, 24,
+    16, 24, 25, 26, 25, 22, 22, 13, 18, 21, 21, 18, 18, 18, 12, 11, 17, 16, 16,
+    17, 14, 10, 7,  15, 14, 15, 15, 11, 15, 23, 24, 25, 26, 25, 28, 12, 20, 22,
+    24, 24, 22, 26, 12, 17, 21, 21, 20, 18, 20, 12, 11, 17, 16, 16, 12, 14, 10,
+    5,  13, 12, 9,  8,  10, 7,  5,  7,  6,  7,  7,  9,  5,  4,  4,  4,  5,  7,
+    8,  9,  16, 18, 19, 22, 23, 25, 9,  13, 16, 18, 20, 20, 22, 9,  9,  14, 14,
+    16, 17, 16, 9,  8,  10, 10, 12, 11, 9,  7,  6,  5,  5,  4,  7,  9,  4,  3,
+    3,  3,  2,  5,  9,  4,  0,  3,  4,  2,  4,  7,  9,  9,  10, 15, 19, 22, 22,
+    9,  9,  10, 13, 18, 19, 19, 9,  9,  11, 11, 13, 15, 14, 9,  8,  10, 7,  9,
+    9,  7,  7,  7,  8,  6,  3,  4,  7,  5,  5,  6,  5,  3,  3,  6,  2,  4,  5,
+    5,  3,  2,  5,  44, 47, 53, 55, 56, 52, 48, 42, 47, 51, 53, 55, 51, 47, 41,
+    45, 50, 51, 54, 50, 44, 39, 42, 44, 49, 50, 47, 40, 36, 39, 42, 46, 46, 42,
+    39, 31, 34, 38, 40, 44, 43, 39, 27, 31, 35, 39, 42, 43, 39, 40, 45, 49, 52,
+    52, 48, 45, 39, 44, 47, 52, 50, 47, 42, 36, 42, 45, 48, 49, 45, 39, 35, 39,
+    42, 44, 44, 41, 34, 28, 36, 39, 41, 39, 38, 35, 23, 32, 35, 36, 37, 36, 35,
+    18, 29, 32, 36, 35, 36, 34, 36, 42, 44, 45, 47, 44, 38, 33, 41, 41, 45, 45,
+    43, 37, 30, 39, 40, 41, 41, 39, 34, 25, 35, 37, 37, 37, 36, 30, 20, 31, 34,
+    34, 31, 30, 30, 15, 26, 30, 29, 30, 29, 30, 13, 22, 28, 28, 28, 29, 28, 29,
+    35, 36, 38, 39, 38, 31, 26, 34, 36, 37, 37, 35, 29, 22, 31, 34, 33, 34, 31,
+    27, 18, 27, 30, 29, 30, 26, 25, 16, 20, 26, 25, 24, 21, 22, 15, 14, 22, 21,
+    21, 20, 17, 14, 10, 19, 20, 20, 19, 14, 17, 25, 28, 30, 29, 26, 31, 14, 23,
+    27, 28, 28, 23, 29, 14, 19, 25, 25, 24, 20, 24, 14, 13, 21, 20, 21, 13, 16,
+    12, 8,  16, 16, 13, 10, 13, 9,  5,  11, 11, 12, 9,  11, 9,  6,  8,  10, 10,
+    8,  10, 10, 16, 19, 21, 22, 24, 27, 10, 12, 18, 20, 21, 22, 23, 9,  8,  17,
+    16, 17, 18, 18, 10, 8,  13, 12, 13, 12, 11, 8,  5,  7,  7,  5,  8,  10, 6,
+    5,  2,  1,  4,  7,  9,  5,  3,  0,  2,  4,  6,  8,  9,  8,  12, 17, 21, 23,
+    24, 9,  8,  11, 16, 20, 20, 20, 9,  8,  9,  13, 15, 16, 16, 8,  7,  7,  8,
+    11, 11, 9,  6,  5,  5,  3,  4,  5,  8,  4,  3,  4,  4,  2,  5,  7,  3,  2,
+    4,  4,  2,  4,  6,  44, 48, 53, 55, 55, 53, 49, 41, 48, 50, 54, 54, 52, 48,
+    40, 44, 49, 52, 53, 49, 44, 39, 42, 47, 48, 51, 47, 42, 35, 39, 42, 45, 46,
+    44, 40, 31, 34, 38, 42, 44, 43, 40, 27, 33, 36, 39, 43, 43, 40, 41, 44, 48,
+    53, 53, 48, 43, 39, 45, 48, 51, 50, 47, 42, 36, 42, 46, 48, 48, 46, 39, 33,
+    40, 43, 46, 45, 42, 35, 28, 36, 40, 41, 40, 38, 35, 22, 32, 35, 39, 38, 37,
+    35, 18, 29, 34, 37, 35, 36, 36, 36, 41, 44, 45, 46, 44, 37, 34, 39, 43, 44,
+    43, 41, 35, 29, 39, 41, 41, 40, 39, 33, 26, 37, 37, 37, 37, 36, 30, 19, 31,
+    34, 34, 32, 30, 29, 15, 26, 31, 30, 30, 29, 29, 14, 21, 30, 29, 29, 28, 27,
+    30, 36, 38, 38, 38, 36, 30, 25, 33, 35, 37, 35, 33, 28, 21, 30, 34, 34, 32,
+    30, 26, 17, 24, 31, 30, 30, 24, 25, 15, 19, 26, 27, 24, 20, 21, 15, 14, 24,
+    23, 22, 19, 17, 14, 10, 20, 22, 21, 18, 14, 16, 25, 29, 30, 27, 24, 30, 13,
+    22, 27, 28, 26, 20, 28, 13, 17, 25, 24, 23, 17, 23, 13, 12, 21, 21, 19, 12,
+    17, 11, 7,  17, 17, 13, 8,  13, 10, 6,  12, 13, 12, 7,  10, 9,  6,  8,  12,
+    11, 7,  9,  9,  14, 19, 20, 19, 22, 26, 9,  10, 18, 18, 18, 19, 22, 9,  6,
+    16, 15, 15, 16, 16, 9,  5,  12, 12, 11, 11, 10, 7,  4,  6,  7,  5,  7,  8,
+    5,  3,  2,  2,  3,  5,  8,  5,  3,  2,  0,  3,  5,  7,  7,  7,  12, 16, 18,
+    20, 22, 7,  7,  11, 14, 17, 17, 18, 7,  7,  9,  12, 13, 14, 14, 7,  6,  5,
+    8,  9,  9,  8,  5,  4,  3,  2,  4,  5,  7,  3,  2,  5,  4,  2,  4,  6,  3,
+    1,  5,  5,  1,  4,  5,  38, 42, 47, 47, 48, 47, 43, 36, 41, 44, 48, 49, 45,
+    41, 34, 39, 43, 45, 47, 44, 38, 33, 36, 40, 43, 45, 41, 34, 31, 33, 37, 39,
+    41, 39, 35, 26, 29, 32, 35, 39, 37, 35, 23, 28, 31, 34, 38, 38, 34, 34, 39,
+    43, 47, 46, 41, 38, 34, 38, 41, 45, 44, 40, 36, 31, 35, 40, 43, 42, 39, 33,
+    29, 34, 36, 40, 39, 36, 30, 24, 30, 33, 36, 35, 33, 30, 21, 27, 30, 32, 32,
+    32, 29, 16, 26, 29, 31, 31, 31, 30, 31, 35, 38, 39, 39, 37, 31, 29, 35, 37,
+    38, 38, 35, 30, 26, 32, 35, 35, 36, 33, 27, 22, 31, 32, 31, 32, 30, 24, 16,
+    26, 27, 28, 27, 25, 24, 11, 24, 25, 26, 25, 24, 24, 11, 20, 24, 24, 24, 24,
+    22, 25, 30, 30, 31, 32, 30, 24, 21, 29, 28, 30, 31, 28, 22, 18, 26, 28, 28,
+    27, 24, 21, 15, 21, 24, 25, 24, 20, 20, 12, 15, 21, 20, 20, 16, 16, 11, 12,
+    18, 18, 17, 15, 12, 11, 8,  17, 17, 16, 15, 9,  13, 21, 23, 24, 23, 19, 24,
+    10, 19, 22, 22, 21, 16, 23, 10, 14, 19, 19, 18, 13, 17, 10, 9,  16, 16, 15,
+    8,  12, 8,  4,  12, 12, 10, 5,  9,  7,  4,  9,  8,  8,  4,  6,  7,  4,  6,
+    7,  7,  4,  5,  6,  12, 14, 15, 15, 17, 20, 6,  8,  12, 13, 14, 14, 16, 6,
+    5,  11, 10, 11, 11, 12, 6,  4,  8,  7,  7,  7,  6,  4,  2,  2,  2,  3,  4,
+    5,  2,  2,  3,  3,  2,  3,  5,  3,  2,  4,  3,  0,  3,  4,  5,  5,  10, 12,
+    14, 16, 17, 5,  6,  9,  11, 12, 13, 13, 5,  6,  8,  9,  9,  10, 10, 5,  5,
+    4,  5,  6,  6,  5,  3,  2,  3,  3,  1,  3,  4,  2,  3,  5,  4,  2,  2,  4,
+    2,  4,  5,  4,  3,  2,  3,  31, 36, 40, 43, 43, 40, 36, 30, 33, 38, 43, 43,
+    39, 35, 28, 32, 37, 39, 42, 37, 33, 28, 30, 33, 36, 40, 35, 29, 25, 27, 29,
+    33, 35, 32, 29, 21, 24, 26, 30, 34, 32, 29, 20, 21, 26, 29, 32, 32, 29, 29,
+    32, 36, 40, 38, 35, 33, 29, 31, 35, 38, 37, 35, 30, 26, 30, 33, 36, 36, 32,
+    29, 25, 28, 30, 33, 33, 31, 24, 20, 25, 27, 29, 29, 27, 24, 18, 22, 25, 27,
+    27, 27, 24, 14, 21, 24, 26, 26, 26, 24, 26, 30, 32, 33, 34, 32, 27, 25, 29,
+    30, 31, 31, 30, 25, 23, 27, 29, 29, 29, 28, 22, 18, 26, 25, 26, 26, 24, 19,
+    13, 22, 22, 22, 22, 21, 19, 9,  20, 20, 20, 20, 20, 19, 9,  17, 20, 18, 19,
+    19, 17, 23, 24, 24, 26, 27, 25, 19, 18, 23, 23, 25, 24, 22, 17, 14, 22, 22,
+    21, 22, 19, 16, 11, 18, 19, 18, 18, 16, 14, 9,  13, 15, 14, 14, 12, 11, 9,
+    10, 13, 12, 12, 12, 8,  9,  7,  12, 11, 11, 11, 5,  10, 17, 17, 18, 18, 15,
+    19, 7,  15, 16, 16, 16, 12, 17, 6,  12, 13, 13, 13, 9,  12, 7,  6,  10, 9,
+    9,  6,  7,  5,  2,  6,  5,  5,  3,  5,  4,  2,  4,  3,  3,  3,  4,  4,  3,
+    2,  2,  2,  2,  3,  4,  9,  9,  10, 11, 13, 16, 4,  7,  9,  9,  10, 11, 12,
+    4,  4,  8,  7,  8,  8,  8,  4,  3,  4,  4,  4,  5,  4,  2,  1,  4,  3,  1,
+    2,  3,  2,  3,  6,  4,  2,  2,  3,  2,  5,  6,  5,  3,  0,  3,  4,  5,  6,
+    8,  10, 12, 13, 4,  5,  6,  8,  9,  10, 10, 4,  5,  6,  5,  6,  6,  7,  4,
+    4,  6,  3,  2,  3,  3,  2,  4,  8,  5,  3,  0,  3,  3,  6,  7,  7,  4,  2,
+    2,  5,  7,  7,  8,  5,  2,  2,  25, 28, 34, 37, 37, 34, 31, 24, 28, 32, 36,
+    37, 32, 29, 23, 26, 30, 34, 36, 32, 27, 22, 24, 28, 31, 34, 30, 24, 19, 21,
+    24, 27, 31, 28, 24, 17, 18, 21, 24, 29, 28, 24, 15, 17, 21, 24, 27, 27, 24,
+    23, 27, 31, 34, 33, 30, 27, 22, 25, 29, 33, 33, 28, 25, 20, 24, 28, 31, 30,
+    27, 24, 20, 22, 24, 28, 27, 26, 20, 17, 18, 21, 23, 24, 23, 20, 15, 17, 19,
+    21, 22, 22, 20, 12, 16, 19, 21, 21, 21, 20, 21, 24, 26, 27, 28, 26, 22, 20,
+    23, 24, 25, 26, 25, 20, 19, 21, 23, 23, 23, 22, 18, 16, 20, 20, 20, 19, 19,
+    14, 10, 16, 16, 16, 16, 16, 14, 7,  16, 15, 15, 15, 15, 15, 7,  14, 14, 14,
+    14, 14, 13, 18, 19, 19, 20, 21, 21, 14, 15, 17, 18, 19, 19, 18, 12, 12, 16,
+    16, 16, 15, 15, 11, 8,  14, 13, 12, 12, 12, 10, 6,  10, 9,  9,  8,  8,  7,
+    6,  8,  8,  7,  7,  7,  4,  7,  4,  6,  6,  6,  6,  3,  8,  11, 11, 12, 13,
+    12, 14, 3,  9,  10, 10, 11, 9,  12, 4,  8,  8,  7,  7,  7,  8,  3,  4,  4,
+    4,  3,  3,  3,  1,  1,  1,  1,  1,  1,  3,  2,  3,  4,  3,  2,  0,  2,  3,
+    5,  5,  3,  2,  2,  2,  3,  5,  6,  7,  8,  10, 12, 3,  4,  6,  7,  7,  8,
+    9,  3,  4,  4,  4,  5,  5,  6,  3,  3,  4,  3,  2,  2,  2,  1,  5,  6,  4,
+    3,  2,  2,  3,  6,  8,  6,  3,  2,  1,  5,  7,  8,  7,  4,  3,  0,  5,  7,
+    6,  6,  8,  9,  10, 5,  7,  6,  6,  6,  7,  7,  5,  7,  8,  4,  3,  4,  4,
+    5,  7,  8,  5,  3,  2,  1,  5,  8,  9,  7,  4,  3,  0,  6,  8,  10, 9,  5,
+    3,  2,  7,  9,  10, 10, 6,  4,  2,  31, 36, 39, 41, 40, 39, 36, 31, 35, 38,
+    41, 41, 38, 36, 30, 33, 36, 40, 42, 39, 36, 29, 32, 36, 39, 41, 39, 38, 28,
+    31, 35, 38, 42, 40, 37, 28, 30, 34, 38, 41, 42, 36, 25, 29, 33, 37, 40, 40,
+    37, 29, 32, 36, 40, 38, 35, 32, 28, 32, 35, 38, 38, 34, 32, 27, 30, 34, 38,
+    38, 34, 32, 25, 29, 34, 36, 37, 36, 32, 25, 29, 32, 36, 36, 36, 33, 24, 28,
+    32, 35, 36, 35, 32, 21, 26, 30, 34, 34, 35, 32, 27, 31, 31, 32, 33, 30, 25,
+    27, 29, 30, 30, 32, 29, 25, 24, 28, 29, 30, 30, 30, 25, 21, 27, 28, 29, 30,
+    30, 25, 19, 27, 28, 28, 29, 30, 26, 15, 24, 26, 28, 28, 28, 26, 16, 22, 25,
+    26, 26, 26, 25, 24, 25, 25, 25, 25, 22, 13, 22, 23, 23, 25, 24, 21, 14, 17,
+    22, 22, 23, 22, 20, 15, 14, 22, 21, 22, 23, 20, 17, 15, 19, 20, 21, 21, 19,
+    14, 15, 17, 19, 19, 19, 18, 10, 16, 14, 17, 17, 18, 17, 8,  12, 16, 16, 17,
+    15, 10, 12, 9,  15, 15, 15, 14, 10, 13, 9,  13, 13, 13, 13, 8,  12, 9,  9,
+    13, 13, 12, 9,  10, 10, 7,  11, 11, 11, 6,  8,  10, 9,  8,  9,  9,  5,  8,
+    12, 11, 9,  7,  7,  4,  7,  4,  6,  6,  6,  7,  9,  10, 4,  4,  4,  5,  5,
+    9,  10, 4,  2,  2,  3,  5,  7,  9,  4,  2,  1,  1,  3,  6,  8,  5,  4,  4,
+    4,  4,  4,  7,  7,  6,  8,  6,  4,  4,  6,  9,  9,  9,  7,  5,  4,  5,  0,
+    4,  3,  1,  4,  7,  9,  0,  4,  4,  2,  4,  6,  8,  0,  4,  5,  2,  2,  5,
+    8,  0,  3,  4,  2,  2,  4,  6,  2,  4,  5,  5,  5,  4,  5,  5,  6,  8,  8,
+    5,  5,  4,  8,  8,  9,  9,  6,  5,  4,  37, 41, 45, 47, 47, 45, 41, 37, 40,
+    44, 46, 48, 46, 42, 36, 39, 42, 47, 47, 46, 43, 34, 37, 41, 45, 48, 46, 42,
+    34, 37, 41, 45, 49, 46, 42, 33, 36, 41, 44, 47, 45, 42, 30, 35, 38, 43, 47,
+    46, 42, 36, 39, 42, 45, 43, 41, 36, 34, 37, 41, 44, 44, 39, 36, 33, 36, 40,
+    42, 43, 40, 36, 32, 36, 38, 43, 42, 42, 37, 30, 35, 38, 42, 41, 40, 37, 28,
+    34, 38, 41, 41, 40, 37, 25, 31, 36, 40, 40, 40, 37, 33, 36, 38, 38, 37, 34,
+    28, 31, 34, 36, 38, 36, 34, 28, 28, 34, 36, 36, 35, 34, 29, 25, 34, 34, 36,
+    36, 34, 30, 22, 32, 34, 35, 35, 34, 30, 19, 30, 33, 33, 33, 32, 30, 18, 28,
+    31, 31, 32, 32, 28, 28, 31, 31, 30, 29, 25, 16, 25, 29, 29, 30, 28, 24, 18,
+    21, 28, 28, 28, 27, 23, 20, 17, 26, 29, 27, 27, 23, 23, 18, 23, 27, 27, 26,
+    22, 19, 19, 20, 25, 25, 25, 21, 15, 18, 17, 23, 24, 24, 21, 11, 16, 22, 22,
+    22, 16, 12, 16, 12, 19, 21, 21, 16, 11, 18, 13, 16, 19, 19, 16, 9,  15, 13,
+    12, 19, 19, 15, 11, 14, 14, 10, 17, 17, 13, 8,  11, 13, 11, 14, 14, 12, 7,
+    10, 14, 13, 12, 13, 11, 6,  8,  7,  11, 12, 9,  9,  11, 13, 7,  8,  10, 8,
+    7,  9,  12, 7,  5,  8,  7,  6,  8,  10, 7,  4,  7,  6,  6,  8,  10, 8,  6,
+    5,  5,  4,  6,  9,  9,  8,  8,  7,  5,  6,  8,  11, 9,  8,  7,  6,  5,  7,
+    4,  0,  2,  4,  6,  9,  11, 4,  0,  2,  3,  5,  7,  10, 4,  0,  3,  2,  6,
+    9,  10, 4,  1,  3,  2,  4,  5,  8,  4,  3,  5,  5,  5,  5,  7,  6,  6,  8,
+    8,  6,  5,  6,  7,  9,  8,  8,  7,  5,  6,  36, 40, 42, 44, 44, 42, 39, 35,
+    38, 42, 44, 45, 42, 38, 34, 37, 41, 44, 45, 42, 40, 33, 37, 41, 45, 46, 43,
+    40, 33, 36, 40, 43, 47, 44, 39, 32, 35, 39, 43, 46, 44, 40, 30, 34, 38, 41,
+    45, 44, 39, 34, 37, 40, 43, 41, 36, 34, 32, 35, 39, 42, 42, 37, 33, 31, 35,
+    38, 40, 41, 37, 34, 31, 35, 37, 41, 41, 39, 34, 29, 35, 36, 40, 39, 39, 35,
+    27, 33, 36, 39, 39, 38, 35, 24, 31, 35, 38, 37, 37, 35, 31, 34, 36, 35, 35,
+    31, 24, 29, 33, 34, 35, 34, 31, 24, 27, 33, 34, 34, 32, 31, 26, 23, 33, 33,
+    34, 33, 31, 27, 21, 31, 33, 33, 33, 29, 27, 18, 29, 32, 31, 31, 30, 28, 18,
+    27, 30, 30, 31, 29, 25, 27, 29, 28, 28, 27, 22, 14, 22, 28, 27, 27, 25, 20,
+    16, 19, 26, 27, 27, 25, 20, 18, 15, 24, 27, 26, 25, 20, 21, 17, 22, 25, 25,
+    24, 19, 17, 17, 19, 24, 25, 23, 18, 14, 18, 16, 22, 22, 22, 18, 10, 14, 20,
+    20, 20, 14, 8,  14, 11, 18, 19, 19, 14, 8,  15, 11, 14, 19, 18, 13, 7,  14,
+    11, 11, 18, 18, 13, 7,  13, 13, 9,  16, 16, 12, 6,  9,  12, 11, 14, 14, 11,
+    6,  7,  14, 13, 12, 12, 10, 6,  7,  6,  10, 11, 7,  5,  7,  10, 6,  7,  9,
+    7,  5,  7,  9,  6,  3,  8,  6,  5,  7,  8,  6,  4,  7,  6,  4,  6,  7,  7,
+    6,  5,  5,  6,  6,  7,  9,  8,  11, 11, 8,  6,  7,  11, 10, 12, 12, 10, 6,
+    6,  3,  2,  0,  3,  4,  6,  8,  3,  2,  2,  2,  4,  5,  7,  3,  2,  3,  2,
+    4,  6,  7,  3,  2,  6,  4,  4,  5,  6,  4,  5,  10, 11, 9,  6,  6,  6,  10,
+    15, 16, 11, 7,  6,  9,  14, 17, 17, 13, 8,  6,  28, 32, 36, 38, 38, 36, 32,
+    29, 31, 35, 38, 39, 36, 32, 27, 31, 34, 37, 39, 36, 33, 26, 30, 34, 37, 40,
+    37, 34, 27, 30, 33, 36, 40, 38, 34, 26, 29, 32, 36, 39, 38, 34, 24, 27, 30,
+    35, 37, 38, 34, 28, 30, 34, 36, 34, 30, 27, 26, 28, 32, 35, 34, 31, 27, 25,
+    28, 32, 34, 34, 32, 28, 24, 28, 31, 35, 34, 32, 28, 24, 28, 31, 34, 34, 34,
+    29, 23, 27, 29, 33, 33, 33, 29, 21, 25, 28, 31, 32, 31, 29, 26, 29, 29, 28,
+    29, 25, 19, 25, 26, 28, 28, 28, 25, 19, 23, 26, 27, 28, 28, 25, 20, 19, 26,
+    27, 28, 27, 26, 22, 17, 25, 27, 26, 26, 25, 22, 15, 25, 25, 25, 26, 24, 22,
+    16, 22, 24, 24, 24, 24, 20, 22, 23, 22, 21, 21, 17, 8,  18, 22, 21, 21, 20,
+    16, 10, 15, 21, 21, 21, 20, 16, 13, 12, 20, 21, 20, 19, 16, 16, 14, 18, 21,
+    20, 19, 15, 12, 15, 16, 18, 18, 17, 15, 9,  16, 15, 16, 17, 16, 14, 6,  11,
+    15, 15, 14, 10, 5,  8,  7,  14, 13, 13, 10, 5,  10, 8,  11, 12, 12, 10, 5,
+    9,  7,  9,  12, 12, 10, 5,  8,  9,  7,  11, 11, 9,  6,  6,  10, 9,  10, 9,
+    8,  6,  5,  13, 13, 13, 10, 8,  7,  5,  3,  6,  5,  4,  3,  4,  6,  3,  4,
+    4,  3,  3,  4,  5,  3,  2,  2,  2,  3,  4,  6,  3,  2,  4,  4,  4,  5,  5,
+    5,  6,  9,  9,  8,  7,  5,  7,  10, 16, 14, 10, 7,  6,  11, 15, 17, 15, 12,
+    8,  6,  2,  4,  3,  0,  2,  3,  4,  2,  4,  4,  2,  2,  3,  5,  2,  4,  5,
+    3,  2,  3,  4,  2,  6,  9,  7,  6,  5,  5,  5,  9,  13, 12, 11, 8,  6,  9,
+    14, 18, 18, 13, 10, 7,  14, 18, 19, 19, 15, 11, 7,  24, 27, 30, 33, 32, 30,
+    27, 24, 26, 29, 32, 33, 31, 27, 22, 25, 28, 31, 33, 31, 29, 21, 25, 28, 32,
+    34, 32, 29, 22, 25, 27, 31, 35, 33, 29, 21, 24, 27, 30, 34, 33, 29, 19, 22,
+    25, 29, 33, 33, 28, 21, 24, 28, 30, 29, 25, 23, 21, 24, 27, 30, 29, 25, 22,
+    20, 22, 26, 29, 28, 27, 23, 20, 22, 26, 29, 28, 27, 24, 21, 23, 26, 29, 29,
+    27, 23, 19, 21, 24, 28, 27, 27, 24, 16, 20, 23, 26, 26, 26, 24, 20, 22, 23,
+    23, 23, 20, 15, 19, 22, 22, 23, 22, 20, 16, 19, 20, 22, 23, 22, 21, 17, 16,
+    22, 23, 23, 23, 21, 18, 15, 21, 21, 21, 22, 21, 18, 13, 19, 20, 20, 21, 20,
+    17, 17, 18, 19, 19, 19, 20, 17, 19, 17, 16, 17, 16, 13, 5,  16, 16, 16, 16,
+    15, 12, 6,  13, 16, 15, 16, 15, 13, 9,  10, 16, 16, 15, 15, 13, 12, 11, 14,
+    14, 14, 14, 12, 8,  12, 13, 13, 13, 13, 12, 6,  17, 18, 13, 12, 12, 11, 5,
+    8,  10, 9,  9,  8,  3,  5,  5,  9,  8,  8,  7,  3,  6,  5,  8,  7,  7,  7,
+    3,  5,  5,  6,  7,  7,  7,  5,  5,  6,  7,  7,  7,  8,  7,  5,  9,  12, 14,
+    12, 9,  8,  6,  15, 18, 17, 13, 10, 8,  6,  2,  1,  1,  1,  2,  3,  3,  2,
+    3,  2,  1,  1,  3,  4,  2,  3,  3,  3,  2,  3,  4,  2,  5,  7,  7,  6,  5,
+    6,  5,  10, 13, 12, 11, 8,  6,  10, 15, 19, 17, 12, 9,  7,  16, 19, 21, 18,
+    14, 10, 8,  4,  6,  4,  2,  0,  2,  3,  4,  6,  5,  3,  1,  2,  3,  4,  6,
+    7,  5,  5,  3,  4,  4,  8,  12, 9,  8,  7,  7,  8,  12, 16, 15, 13, 10, 8,
+    13, 16, 20, 21, 15, 11, 9,  18, 22, 21, 21, 17, 13, 9,  19, 23, 25, 29, 28,
+    25, 22, 19, 21, 24, 27, 28, 26, 23, 17, 20, 24, 27, 30, 27, 24, 17, 20, 24,
+    28, 30, 29, 25, 18, 20, 23, 27, 31, 28, 25, 16, 19, 22, 26, 29, 29, 25, 16,
+    18, 22, 25, 28, 29, 26, 18, 20, 23, 25, 23, 21, 18, 16, 19, 23, 25, 25, 21,
+    19, 15, 18, 21, 25, 24, 22, 20, 15, 19, 22, 25, 24, 23, 20, 16, 18, 21, 24,
+    24, 23, 21, 14, 17, 20, 23, 23, 23, 20, 18, 18, 19, 22, 22, 22, 21, 15, 18,
+    19, 19, 19, 16, 13, 15, 17, 18, 18, 18, 17, 13, 15, 16, 18, 18, 18, 18, 14,
+    14, 17, 18, 18, 18, 18, 15, 12, 15, 17, 17, 17, 17, 15, 13, 15, 16, 17, 16,
+    16, 15, 20, 19, 16, 15, 15, 15, 13, 15, 13, 12, 12, 12, 11, 2,  14, 12, 12,
+    11, 11, 10, 3,  11, 11, 11, 12, 11, 11, 6,  7,  11, 11, 11, 11, 10, 9,  9,
+    10, 10, 10, 10, 10, 6,  13, 14, 13, 11, 9,  9,  6,  19, 21, 16, 13, 10, 8,
+    7,  6,  5,  5,  5,  4,  2,  3,  2,  4,  4,  3,  3,  2,  3,  2,  2,  2,  3,
+    3,  3,  4,  2,  3,  5,  5,  6,  6,  6,  5,  10, 10, 10, 10, 8,  7,  11, 16,
+    17, 15, 11, 9,  7,  18, 21, 20, 15, 13, 10, 8,  3,  4,  2,  2,  1,  2,  2,
+    3,  4,  3,  2,  2,  2,  3,  3,  6,  4,  5,  5,  4,  4,  3,  8,  9,  9,  8,
+    7,  7,  8,  12, 15, 14, 13, 10, 8,  13, 17, 20, 19, 14, 11, 8,  19, 22, 23,
+    21, 16, 12, 9,  7,  9,  6,  3,  2,  0,  2,  7,  9,  7,  4,  3,  2,  2,  7,
+    9,  9,  7,  6,  5,  5,  7,  11, 14, 12, 10, 9,  8,  10, 15, 18, 17, 15, 13,
+    9,  15, 19, 22, 23, 17, 13, 10, 20, 23, 23, 24, 19, 15, 11, 15, 18, 21, 24,
+    25, 22, 18, 14, 17, 20, 24, 25, 22, 20, 13, 16, 20, 23, 26, 24, 21, 12, 16,
+    20, 23, 26, 24, 21, 13, 16, 19, 23, 27, 24, 21, 12, 16, 18, 22, 25, 24, 21,
+    17, 16, 17, 21, 24, 24, 21, 13, 16, 19, 21, 21, 18, 15, 12, 15, 18, 20, 20,
+    18, 15, 11, 14, 17, 20, 21, 19, 16, 10, 14, 18, 21, 21, 19, 17, 11, 14, 17,
+    20, 20, 20, 17, 12, 13, 16, 19, 19, 19, 16, 19, 17, 16, 18, 18, 18, 17, 11,
+    14, 15, 15, 16, 14, 10, 10, 13, 14, 14, 14, 13, 10, 9,  11, 13, 14, 14, 14,
+    11, 9,  12, 14, 14, 14, 14, 12, 8,  11, 13, 13, 13, 13, 12, 14, 14, 14, 13,
+    12, 12, 12, 22, 20, 16, 13, 11, 11, 11, 9,  9,  8,  8,  9,  9,  2,  8,  7,
+    7,  7,  7,  7,  2,  6,  6,  7,  7,  7,  7,  3,  6,  6,  7,  7,  7,  7,  6,
+    7,  8,  9,  9,  9,  7,  6,  14, 16, 14, 12, 10, 8,  6,  21, 22, 17, 13, 10,
+    8,  7,  2,  1,  1,  1,  1,  2,  2,  2,  2,  1,  1,  1,  1,  2,  2,  2,  2,
+    4,  4,  3,  3,  2,  6,  6,  7,  7,  7,  6,  6,  11, 12, 11, 11, 9,  7,  13,
+    17, 18, 15, 12, 10, 7,  20, 22, 21, 16, 13, 11, 8,  6,  5,  4,  3,  2,  1,
+    2,  5,  7,  4,  3,  3,  2,  2,  6,  9,  6,  6,  5,  4,  4,  6,  10, 10, 10,
+    9,  8,  7,  9,  14, 16, 15, 13, 11, 8,  15, 19, 22, 19, 15, 12, 9,  20, 23,
+    24, 22, 16, 13, 10, 9,  11, 7,  4,  3,  2,  0,  10, 11, 9,  5,  3,  3,  3,
+    9,  11, 12, 8,  7,  6,  5,  9,  13, 16, 13, 11, 10, 9,  12, 16, 20, 19, 16,
+    13, 10, 17, 20, 24, 24, 18, 14, 11, 21, 25, 25, 25, 20, 16, 12, 32, 36, 39,
+    42, 41, 39, 35, 31, 35, 37, 41, 41, 40, 35, 29, 33, 36, 39, 41, 39, 36, 29,
+    32, 35, 39, 42, 40, 37, 29, 31, 35, 39, 42, 41, 37, 27, 31, 34, 38, 42, 40,
+    36, 24, 28, 33, 37, 40, 41, 37, 30, 33, 36, 38, 38, 35, 31, 28, 31, 36, 38,
+    37, 34, 32, 27, 31, 34, 37, 37, 35, 31, 25, 30, 34, 37, 36, 35, 33, 26, 29,
+    33, 36, 36, 36, 33, 24, 29, 31, 35, 36, 35, 32, 21, 26, 30, 34, 34, 34, 32,
+    27, 30, 31, 32, 33, 30, 24, 25, 29, 31, 32, 31, 30, 25, 25, 27, 28, 30, 31,
+    30, 25, 21, 27, 28, 30, 29, 30, 26, 19, 26, 29, 30, 29, 28, 25, 15, 25, 26,
+    28, 27, 27, 25, 16, 23, 24, 25, 27, 27, 25, 24, 24, 25, 25, 25, 22, 13, 21,
+    23, 24, 24, 24, 21, 14, 17, 22, 22, 23, 22, 20, 15, 14, 22, 21, 22, 22, 20,
+    18, 14, 19, 20, 21, 21, 19, 14, 15, 17, 19, 19, 19, 18, 11, 16, 14, 16, 18,
+    18, 17, 8,  12, 16, 17, 17, 15, 10, 12, 9,  15, 15, 15, 14, 10, 13, 9,  13,
+    13, 13, 12, 8,  11, 9,  10, 13, 13, 12, 9,  10, 10, 7,  11, 11, 10, 6,  8,
+    10, 9,  8,  9,  9,  5,  8,  12, 11, 9,  7,  7,  4,  7,  4,  6,  6,  6,  7,
+    9,  11, 4,  4,  4,  5,  6,  9,  10, 4,  2,  2,  3,  4,  7,  9,  4,  2,  1,
+    1,  4,  6,  8,  5,  4,  4,  4,  4,  4,  7,  7,  6,  8,  6,  5,  4,  6,  8,
+    9,  9,  7,  5,  4,  5,  0,  4,  3,  2,  4,  7,  9,  0,  4,  4,  2,  3,  7,
+    9,  0,  4,  5,  2,  2,  6,  8,  0,  4,  5,  2,  2,  4,  6,  2,  4,  5,  5,
+    5,  4,  5,  4,  6,  8,  8,  5,  5,  4,  8,  8,  9,  9,  6,  5,  4,  37, 41,
+    45, 47, 47, 44, 41, 36, 40, 43, 47, 47, 44, 41, 35, 38, 43, 46, 47, 44, 41,
+    33, 37, 41, 45, 48, 45, 42, 35, 37, 41, 45, 48, 46, 43, 33, 37, 40, 43, 47,
+    46, 43, 31, 35, 39, 43, 46, 46, 43, 34, 39, 43, 44, 44, 39, 36, 34, 37, 42,
+    44, 43, 41, 36, 33, 36, 40, 43, 43, 39, 36, 31, 36, 40, 43, 43, 41, 37, 30,
+    36, 39, 42, 42, 42, 38, 28, 34, 37, 40, 40, 41, 37, 25, 32, 37, 40, 39, 39,
+    37, 32, 36, 38, 37, 37, 34, 28, 31, 35, 37, 37, 38, 34, 28, 28, 33, 34, 36,
+    36, 34, 28, 25, 34, 35, 34, 35, 34, 30, 23, 33, 35, 34, 35, 34, 29, 18, 30,
+    32, 34, 34, 32, 30, 18, 28, 32, 31, 33, 32, 28, 29, 30, 31, 31, 30, 25, 16,
+    25, 30, 30, 30, 28, 23, 18, 21, 28, 28, 29, 27, 22, 20, 17, 26, 28, 28, 27,
+    23, 22, 18, 23, 27, 27, 27, 22, 18, 19, 20, 25, 25, 25, 21, 15, 18, 17, 22,
+    23, 24, 21, 11, 16, 22, 23, 22, 17, 12, 16, 12, 20, 21, 21, 16, 11, 18, 13,
+    16, 20, 19, 15, 9,  15, 12, 12, 19, 19, 15, 11, 14, 14, 10, 17, 17, 13, 8,
+    11, 13, 11, 15, 15, 13, 7,  10, 14, 13, 12, 13, 11, 6,  9,  7,  11, 12, 9,
+    9,  11, 13, 7,  8,  10, 8,  7,  10, 12, 7,  5,  8,  7,  6,  8,  10, 7,  4,
+    7,  6,  6,  8,  10, 8,  6,  5,  5,  5,  6,  9,  9,  8,  7,  7,  5,  6,  8,
+    11, 9,  8,  7,  6,  5,  7,  4,  0,  2,  4,  6,  9,  11, 4,  0,  2,  3,  5,
+    7,  10, 4,  0,  3,  2,  5,  9,  10, 4,  1,  3,  2,  4,  5,  8,  4,  3,  5,
+    5,  5,  5,  7,  6,  6,  8,  8,  6,  5,  6,  7,  8,  8,  8,  6,  5,  6,  39,
+    41, 46, 47, 47, 45, 41, 37, 41, 43, 47, 46, 43, 40, 37, 39, 42, 46, 48, 45,
+    42, 35, 38, 43, 46, 48, 46, 43, 36, 39, 43, 45, 49, 46, 44, 35, 38, 42, 45,
+    48, 47, 43, 32, 35, 40, 43, 47, 47, 43, 36, 39, 43, 45, 43, 39, 36, 35, 38,
+    42, 43, 44, 40, 35, 34, 37, 42, 44, 42, 40, 36, 32, 37, 41, 43, 42, 40, 37,
+    31, 37, 40, 43, 43, 41, 37, 29, 35, 39, 42, 42, 40, 37, 25, 33, 38, 41, 40,
+    39, 37, 35, 37, 37, 38, 38, 33, 26, 31, 36, 37, 37, 36, 33, 27, 29, 35, 37,
+    37, 36, 33, 28, 25, 34, 36, 37, 36, 33, 30, 23, 34, 36, 36, 35, 32, 30, 19,
+    31, 34, 35, 35, 32, 30, 19, 29, 33, 33, 33, 31, 27, 29, 31, 31, 31, 30, 24,
+    16, 25, 30, 31, 30, 27, 22, 18, 21, 28, 29, 30, 27, 22, 20, 18, 26, 29, 28,
+    28, 22, 23, 19, 23, 28, 28, 26, 21, 19, 19, 20, 26, 26, 26, 20, 16, 19, 17,
+    24, 24, 24, 20, 12, 16, 23, 23, 22, 16, 10, 16, 13, 20, 22, 21, 15, 10, 17,
+    13, 16, 21, 20, 15, 9,  16, 12, 13, 21, 19, 15, 9,  15, 14, 11, 19, 19, 13,
+    7,  11, 15, 12, 16, 16, 12, 7,  9,  15, 14, 14, 15, 11, 7,  8,  7,  12, 13,
+    8,  7,  9,  12, 8,  7,  12, 8,  6,  8,  10, 7,  4,  10, 7,  6,  8,  10, 7,
+    5,  9,  7,  5,  7,  9,  9,  7,  7,  5,  6,  7,  8,  10, 9,  9,  10, 7,  6,
+    7,  12, 10, 11, 11, 9,  6,  7,  4,  2,  2,  3,  5,  7,  9,  4,  2,  0,  3,
+    5,  6,  9,  4,  2,  2,  2,  5,  8,  9,  4,  2,  5,  3,  4,  6,  8,  5,  4,
+    9,  10, 8,  6,  7,  7,  8,  14, 14, 11, 7,  6,  8,  12, 15, 15, 12, 8,  6,
+    31, 35, 38, 40, 41, 38, 34, 30, 34, 37, 40, 41, 37, 34, 29, 31, 36, 39, 41,
+    39, 35, 28, 32, 36, 38, 42, 39, 36, 29, 32, 35, 39, 42, 40, 36, 28, 32, 34,
+    38, 40, 40, 36, 25, 29, 33, 36, 40, 40, 35, 30, 33, 36, 38, 36, 32, 28, 28,
+    31, 34, 37, 36, 32, 29, 27, 30, 34, 36, 36, 34, 30, 26, 30, 34, 36, 36, 34,
+    30, 26, 30, 33, 36, 36, 35, 31, 24, 29, 32, 34, 35, 34, 30, 22, 26, 31, 34,
+    34, 33, 30, 28, 30, 31, 31, 31, 27, 20, 26, 29, 29, 30, 29, 27, 21, 24, 29,
+    29, 30, 30, 27, 22, 20, 28, 30, 30, 29, 27, 24, 18, 28, 29, 29, 29, 27, 23,
+    16, 26, 28, 28, 28, 26, 23, 17, 24, 25, 26, 27, 26, 21, 24, 25, 24, 24, 22,
+    18, 10, 20, 23, 23, 24, 22, 17, 12, 16, 22, 22, 22, 21, 16, 15, 13, 21, 22,
+    22, 21, 17, 18, 14, 19, 22, 21, 20, 16, 14, 15, 17, 19, 20, 19, 16, 10, 17,
+    15, 18, 18, 18, 16, 7,  12, 17, 16, 16, 11, 5,  11, 8,  15, 15, 15, 11, 6,
+    12, 9,  12, 14, 14, 11, 5,  10, 9,  9,  14, 13, 11, 5,  10, 10, 8,  13, 12,
+    10, 6,  7,  11, 10, 10, 10, 9,  5,  6,  13, 12, 11, 9,  8,  6,  5,  4,  7,
+    7,  5,  4,  5,  7,  4,  5,  5,  5,  3,  5,  6,  4,  3,  4,  4,  4,  5,  6,
+    4,  3,  3,  3,  4,  5,  5,  6,  5,  8,  8,  8,  6,  5,  8,  9,  14, 13, 10,
+    7,  5,  10, 13, 16, 14, 11, 8,  5,  2,  3,  2,  2,  3,  4,  5,  2,  3,  3,
+    0,  2,  4,  5,  2,  3,  4,  2,  2,  4,  5,  2,  5,  8,  6,  5,  5,  5,  4,
+    8,  12, 12, 10, 8,  6,  7,  12, 17, 18, 13, 9,  6,  12, 17, 19, 18, 14, 10,
+    7,  25, 29, 32, 35, 35, 31, 29, 24, 28, 30, 35, 35, 32, 28, 23, 26, 30, 33,
+    35, 32, 30, 23, 26, 30, 33, 36, 33, 30, 24, 25, 29, 32, 36, 34, 30, 22, 25,
+    28, 32, 35, 33, 30, 20, 23, 27, 31, 33, 34, 30, 24, 26, 30, 33, 30, 28, 23,
+    23, 25, 28, 32, 31, 28, 24, 22, 23, 28, 31, 30, 27, 24, 21, 24, 27, 30, 30,
+    28, 25, 21, 25, 27, 30, 29, 29, 25, 20, 23, 25, 29, 29, 29, 25, 17, 20, 24,
+    27, 28, 27, 25, 22, 24, 25, 26, 26, 22, 17, 21, 22, 24, 25, 24, 23, 17, 20,
+    22, 24, 24, 24, 22, 17, 17, 23, 24, 23, 24, 23, 18, 15, 22, 23, 22, 23, 22,
+    18, 13, 20, 21, 21, 22, 21, 18, 15, 18, 19, 20, 20, 21, 17, 20, 19, 18, 18,
+    19, 15, 7,  16, 18, 18, 17, 17, 14, 8,  14, 18, 17, 16, 17, 14, 10, 10, 17,
+    17, 16, 16, 14, 13, 12, 16, 16, 15, 16, 13, 9,  12, 14, 14, 14, 14, 12, 6,
+    15, 16, 12, 12, 13, 12, 5,  9,  11, 11, 11, 9,  4,  6,  5,  10, 9,  9,  8,
+    3,  8,  5,  9,  8,  8,  8,  3,  6,  5,  7,  9,  8,  7,  4,  6,  7,  6,  7,
+    7,  7,  6,  4,  9,  10, 12, 10, 8,  6,  5,  13, 16, 16, 11, 9,  7,  5,  2,
+    2,  1,  2,  2,  3,  4,  2,  2,  1,  0,  2,  3,  4,  2,  2,  2,  2,  2,  3,
+    4,  2,  4,  6,  6,  5,  5,  5,  4,  8,  11, 10, 9,  7,  5,  8,  13, 18, 15,
+    11, 8,  6,  14, 18, 19, 17, 12, 9,  7,  4,  5,  3,  2,  1,  2,  3,  4,  5,
+    4,  2,  0,  2,  4,  4,  5,  6,  4,  3,  2,  3,  4,  7,  10, 8,  7,  6,  6,
+    7,  11, 14, 14, 11, 9,  7,  11, 15, 19, 19, 14, 10, 7,  16, 19, 20, 20, 16,
+    12, 8,  21, 24, 27, 31, 32, 29, 25, 19, 23, 27, 30, 31, 28, 24, 18, 22, 26,
+    29, 30, 28, 25, 18, 21, 24, 28, 31, 28, 25, 19, 21, 24, 27, 31, 29, 25, 17,
+    20, 23, 26, 30, 29, 25, 15, 19, 22, 26, 29, 29, 26, 19, 21, 25, 29, 28, 25,
+    21, 18, 20, 24, 28, 27, 24, 20, 17, 20, 22, 26, 25, 23, 21, 16, 20, 22, 25,
+    25, 24, 21, 17, 19, 22, 24, 24, 24, 21, 15, 18, 21, 23, 24, 23, 21, 16, 16,
+    19, 22, 22, 22, 21, 17, 19, 21, 22, 22, 20, 16, 16, 18, 19, 21, 21, 19, 14,
+    16, 17, 19, 19, 19, 18, 15, 14, 18, 18, 18, 18, 18, 16, 13, 17, 18, 18, 17,
+    18, 15, 11, 15, 17, 17, 17, 16, 15, 17, 16, 15, 15, 16, 16, 14, 16, 14, 14,
+    14, 15, 14, 6,  14, 13, 13, 13, 13, 12, 5,  11, 12, 12, 12, 11, 11, 6,  8,
+    12, 12, 12, 11, 11, 9,  9,  11, 11, 11, 10, 10, 6,  11, 11, 11, 9,  9,  9,
+    4,  17, 18, 13, 10, 8,  8,  4,  7,  7,  6,  6,  7,  4,  5,  2,  5,  5,  5,
+    5,  3,  5,  2,  4,  3,  3,  3,  2,  3,  2,  3,  3,  3,  4,  4,  4,  5,  8,
+    8,  7,  8,  6,  4,  9,  13, 14, 12, 9,  7,  5,  16, 18, 17, 13, 10, 8,  5,
+    2,  3,  2,  2,  2,  3,  4,  2,  4,  3,  2,  2,  2,  2,  2,  5,  4,  3,  2,
+    2,  2,  2,  6,  7,  6,  6,  5,  5,  6,  10, 13, 11, 10, 8,  5,  11, 15, 18,
+    16, 12, 9,  6,  16, 19, 19, 18, 13, 10, 7,  6,  8,  5,  3,  2,  2,  3,  6,
+    7,  7,  4,  2,  0,  2,  6,  7,  8,  5,  4,  3,  3,  6,  9,  12, 9,  8,  7,
+    6,  8,  12, 16, 15, 12, 10, 7,  13, 16, 20, 21, 15, 11, 8,  18, 21, 20, 21,
+    16, 12, 9,  17, 20, 24, 28, 28, 25, 22, 16, 19, 23, 27, 28, 24, 20, 14, 17,
+    21, 24, 26, 24, 20, 13, 17, 20, 23, 27, 24, 21, 14, 17, 20, 23, 27, 25, 21,
+    12, 15, 19, 22, 26, 24, 21, 14, 14, 18, 21, 25, 24, 21, 14, 18, 22, 25, 24,
+    21, 18, 13, 17, 20, 23, 23, 20, 16, 13, 15, 18, 21, 21, 19, 16, 12, 15, 18,
+    20, 21, 19, 16, 12, 15, 18, 20, 20, 20, 17, 10, 13, 16, 19, 20, 19, 17, 16,
+    15, 15, 18, 18, 18, 17, 13, 16, 17, 18, 19, 17, 13, 12, 14, 16, 16, 17, 15,
+    11, 10, 13, 14, 14, 14, 14, 11, 10, 13, 14, 14, 14, 14, 12, 9,  12, 14, 13,
+    13, 14, 12, 12, 12, 12, 12, 13, 12, 12, 18, 17, 13, 11, 11, 11, 11, 11, 10,
+    10, 11, 12, 12, 5,  10, 9,  9,  9,  10, 10, 3,  8,  8,  8,  8,  7,  7,  3,
+    5,  8,  7,  7,  7,  7,  5,  7,  7,  7,  6,  6,  6,  3,  12, 13, 11, 9,  7,
+    6,  4,  18, 18, 14, 10, 8,  6,  4,  2,  2,  2,  3,  3,  4,  4,  1,  1,  0,
+    1,  2,  2,  3,  1,  2,  2,  2,  1,  1,  2,  1,  5,  5,  4,  4,  4,  3,  5,
+    10, 9,  8,  8,  6,  4,  11, 14, 14, 12, 10, 7,  5,  17, 19, 17, 13, 10, 8,
+    5,  5,  5,  4,  3,  3,  3,  4,  5,  7,  4,  4,  3,  1,  2,  5,  8,  6,  4,
+    3,  2,  2,  5,  9,  9,  7,  6,  6,  5,  9,  12, 14, 12, 10, 8,  5,  12, 16,
+    19, 16, 12, 9,  6,  17, 19, 20, 18, 14, 10, 7,  9,  10, 7,  5,  3,  2,  3,
+    10, 10, 9,  5,  4,  2,  0,  9,  10, 11, 7,  5,  4,  3,  10, 11, 14, 10, 8,
+    7,  6,  10, 14, 17, 16, 13, 10, 8,  14, 17, 21, 20, 15, 11, 8,  18, 20, 22,
+    22, 17, 12, 9,  32, 35, 38, 41, 41, 38, 36, 30, 34, 37, 41, 41, 39, 37, 29,
+    32, 37, 40, 42, 39, 37, 28, 32, 36, 39, 42, 39, 37, 28, 31, 35, 39, 42, 41,
+    36, 28, 30, 34, 38, 41, 40, 36, 25, 29, 33, 37, 40, 39, 37, 29, 33, 36, 39,
+    38, 35, 32, 28, 32, 35, 39, 37, 35, 31, 27, 31, 34, 37, 37, 35, 31, 25, 30,
+    33, 36, 36, 36, 33, 25, 30, 33, 36, 35, 36, 32, 24, 27, 31, 35, 36, 35, 33,
+    21, 26, 30, 34, 34, 34, 32, 27, 31, 31, 32, 32, 30, 25, 26, 29, 31, 32, 32,
+    30, 25, 24, 28, 30, 30, 30, 30, 24, 21, 28, 28, 30, 30, 29, 26, 18, 26, 28,
+    29, 29, 29, 25, 15, 25, 27, 27, 28, 28, 25, 16, 22, 25, 26, 26, 27, 25, 24,
+    25, 24, 25, 25, 23, 13, 20, 23, 24, 24, 24, 21, 14, 18, 22, 23, 22, 22, 20,
+    15, 14, 21, 21, 22, 22, 20, 18, 14, 19, 20, 21, 21, 19, 14, 15, 17, 18, 19,
+    19, 18, 11, 16, 14, 16, 17, 18, 17, 8,  12, 16, 17, 17, 15, 10, 13, 9,  15,
+    15, 15, 13, 10, 14, 9,  13, 13, 13, 12, 8,  12, 9,  9,  12, 12, 12, 9,  10,
+    10, 7,  11, 11, 10, 6,  8,  10, 9,  8,  8,  9,  5,  8,  12, 10, 9,  7,  7,
+    4,  7,  4,  6,  6,  6,  7,  9,  11, 4,  4,  4,  5,  6,  9,  10, 4,  2,  2,
+    3,  4,  7,  9,  4,  2,  1,  1,  3,  6,  8,  5,  4,  4,  4,  4,  4,  7,  7,
+    6,  8,  6,  5,  4,  6,  9,  9,  9,  7,  5,  4,  6,  0,  4,  3,  2,  4,  7,
+    9,  0,  4,  4,  2,  4,  6,  8,  0,  4,  5,  2,  2,  6,  8,  0,  4,  4,  2,
+    2,  4,  6,  2,  4,  5,  5,  5,  4,  5,  4,  6,  8,  8,  6,  5,  4,  8,  8,
+    9,  9,  6,  5,  4,  38, 41, 44, 47, 47, 44, 41, 37, 40, 43, 47, 47, 45, 42,
+    35, 39, 42, 46, 47, 45, 42, 34, 37, 42, 45, 48, 46, 42, 34, 38, 41, 45, 49,
+    46, 43, 34, 36, 41, 44, 48, 46, 42, 32, 35, 38, 42, 46, 46, 42, 35, 39, 43,
+    44, 42, 39, 36, 34, 38, 41, 45, 43, 39, 36, 33, 36, 39, 43, 42, 40, 36, 31,
+    36, 39, 43, 41, 40, 37, 31, 35, 39, 43, 41, 41, 37, 28, 34, 38, 41, 40, 40,
+    37, 24, 31, 36, 39, 40, 39, 37, 33, 36, 38, 38, 37, 34, 27, 32, 34, 37, 38,
+    37, 33, 28, 28, 33, 36, 35, 36, 34, 28, 25, 34, 35, 36, 35, 34, 30, 22, 33,
+    35, 35, 35, 33, 30, 19, 31, 32, 33, 33, 32, 29, 19, 28, 31, 32, 33, 31, 28,
+    29, 31, 30, 30, 29, 25, 16, 24, 29, 29, 29, 28, 24, 18, 21, 28, 29, 29, 27,
+    23, 19, 17, 26, 27, 28, 28, 23, 22, 18, 23, 27, 26, 26, 22, 19, 19, 19, 25,
+    25, 24, 22, 14, 19, 17, 23, 24, 24, 20, 11, 16, 22, 21, 22, 17, 12, 16, 13,
+    20, 21, 20, 16, 12, 17, 12, 16, 20, 19, 16, 9,  15, 12, 12, 19, 19, 15, 10,
+    14, 14, 10, 18, 17, 14, 8,  11, 14, 11, 15, 15, 12, 7,  10, 15, 13, 12, 13,
+    11, 6,  9,  7,  11, 12, 9,  9,  10, 13, 7,  8,  10, 8,  7,  10, 12, 7,  5,
+    8,  7,  6,  8,  10, 7,  5,  7,  6,  6,  8,  9,  8,  6,  6,  5,  5,  6,  9,
+    9,  8,  7,  7,  5,  6,  8,  11, 9,  8,  7,  6,  5,  7,  4,  0,  2,  4,  6,
+    9,  11, 4,  0,  2,  3,  5,  7,  10, 4,  0,  3,  2,  5,  9,  9,  4,  1,  3,
+    2,  4,  5,  8,  4,  3,  5,  5,  5,  5,  7,  6,  6,  8,  8,  6,  5,  6,  7,
+    9,  8,  8,  6,  5,  6,  41, 44, 47, 50, 50, 47, 43, 40, 43, 48, 50, 51, 47,
+    44, 39, 42, 46, 48, 51, 46, 44, 37, 41, 45, 48, 51, 48, 45, 38, 41, 45, 49,
+    51, 49, 45, 37, 40, 44, 47, 51, 49, 46, 34, 38, 42, 46, 49, 48, 44, 39, 42,
+    46, 48, 46, 42, 38, 38, 41, 45, 48, 46, 42, 37, 37, 40, 43, 46, 45, 43, 39,
+    33, 40, 43, 46, 46, 43, 39, 33, 40, 43, 45, 45, 44, 39, 30, 38, 40, 44, 44,
+    43, 38, 27, 36, 40, 43, 42, 41, 39, 37, 40, 41, 40, 40, 37, 29, 34, 39, 39,
+    41, 38, 36, 29, 31, 38, 40, 38, 38, 36, 30, 27, 37, 38, 40, 37, 36, 32, 25,
+    35, 38, 38, 37, 35, 32, 21, 33, 36, 36, 36, 34, 32, 21, 30, 35, 35, 36, 33,
+    29, 31, 34, 33, 34, 31, 27, 19, 26, 32, 34, 33, 31, 25, 20, 23, 30, 32, 31,
+    30, 24, 22, 19, 27, 31, 32, 29, 23, 25, 20, 25, 31, 30, 28, 22, 21, 21, 22,
+    29, 28, 27, 22, 17, 21, 18, 26, 27, 26, 21, 14, 18, 26, 26, 25, 18, 13, 19,
+    14, 22, 25, 24, 17, 12, 20, 14, 18, 23, 23, 16, 10, 18, 14, 15, 22, 22, 15,
+    10, 17, 15, 12, 21, 20, 14, 9,  13, 16, 13, 18, 18, 14, 8,  10, 16, 14, 15,
+    17, 12, 8,  9,  9,  13, 15, 10, 9,  11, 15, 9,  9,  14, 10, 8,  10, 13, 9,
+    5,  12, 8,  7,  9,  11, 9,  6,  11, 8,  7,  9,  10, 11, 8,  9,  6,  6,  7,
+    9,  11, 9,  8,  8,  6,  7,  9,  12, 11, 9,  9,  8,  6,  7,  5,  3,  3,  5,
+    7,  9,  12, 5,  3,  2,  4,  6,  8,  11, 5,  3,  0,  4,  7,  9,  11, 5,  3,
+    3,  3,  4,  7,  9,  6,  4,  7,  8,  7,  6,  8,  7,  6,  10, 11, 8,  6,  7,
+    9,  10, 11, 11, 9,  7,  6,  34, 38, 42, 44, 45, 41, 37, 32, 37, 41, 44, 44,
+    41, 37, 31, 35, 39, 43, 43, 41, 36, 30, 33, 37, 40, 43, 40, 37, 30, 33, 37,
+    40, 43, 40, 38, 29, 32, 35, 40, 42, 41, 36, 26, 31, 35, 38, 42, 41, 38, 32,
+    35, 39, 43, 40, 36, 33, 31, 34, 38, 41, 40, 37, 32, 30, 32, 36, 39, 38, 35,
+    30, 27, 31, 34, 37, 38, 35, 31, 27, 31, 34, 38, 37, 36, 31, 25, 30, 33, 36,
+    37, 35, 31, 21, 27, 32, 35, 35, 34, 31, 29, 33, 34, 35, 33, 31, 25, 27, 31,
+    33, 35, 33, 30, 24, 24, 30, 31, 32, 31, 29, 23, 21, 30, 30, 30, 30, 28, 24,
+    19, 28, 30, 30, 29, 28, 24, 16, 26, 28, 28, 29, 26, 25, 16, 24, 27, 26, 28,
+    26, 22, 23, 27, 26, 28, 27, 22, 15, 20, 25, 26, 26, 26, 21, 15, 17, 23, 24,
+    24, 23, 18, 16, 14, 23, 23, 23, 21, 18, 19, 15, 19, 23, 22, 21, 17, 15, 15,
+    17, 21, 21, 20, 16, 11, 16, 15, 19, 19, 20, 16, 7,  13, 19, 18, 19, 15, 9,
+    15, 9,  17, 18, 17, 14, 8,  15, 9,  13, 16, 15, 12, 6,  12, 9,  10, 15, 14,
+    11, 6,  10, 10, 8,  14, 13, 10, 5,  7,  11, 9,  11, 11, 9,  4,  5,  12, 11,
+    9,  10, 8,  4,  5,  4,  9,  9,  8,  6,  8,  11, 4,  6,  8,  7,  5,  7,  9,
+    4,  3,  5,  5,  3,  5,  6,  4,  3,  4,  4,  3,  4,  5,  6,  4,  5,  5,  6,
+    4,  5,  7,  6,  11, 10, 7,  5,  5,  9,  11, 12, 12, 9,  6,  4,  2,  2,  2,
+    3,  5,  7,  8,  2,  2,  2,  2,  4,  5,  7,  2,  2,  3,  0,  3,  5,  6,  2,
+    3,  6,  4,  3,  3,  4,  3,  5,  9,  10, 8,  5,  4,  5,  9,  15, 15, 11, 7,
+    4,  9,  14, 17, 17, 12, 8,  5,  27, 33, 36, 39, 39, 37, 33, 27, 30, 35, 38,
+    40, 37, 32, 25, 29, 34, 37, 38, 34, 30, 25, 27, 32, 35, 37, 34, 32, 25, 27,
+    30, 34, 37, 35, 31, 24, 26, 29, 33, 36, 34, 31, 21, 24, 28, 32, 35, 34, 32,
+    26, 29, 34, 37, 35, 32, 28, 24, 29, 32, 35, 36, 32, 27, 24, 26, 30, 33, 33,
+    30, 25, 23, 25, 28, 31, 31, 29, 26, 23, 25, 28, 31, 31, 28, 26, 21, 24, 27,
+    30, 30, 29, 26, 18, 22, 25, 28, 29, 28, 26, 24, 26, 29, 30, 30, 27, 22, 22,
+    25, 28, 28, 29, 26, 20, 21, 24, 26, 26, 26, 25, 18, 17, 24, 24, 24, 25, 24,
+    19, 16, 23, 23, 23, 23, 22, 19, 13, 21, 22, 22, 22, 20, 19, 14, 19, 21, 21,
+    21, 21, 17, 21, 22, 21, 22, 23, 20, 13, 17, 20, 21, 21, 21, 18, 12, 14, 19,
+    19, 18, 19, 15, 12, 11, 19, 17, 17, 17, 14, 13, 12, 16, 16, 17, 16, 13, 10,
+    13, 14, 15, 15, 15, 13, 7,  14, 13, 13, 13, 13, 13, 4,  9,  14, 14, 15, 13,
+    9,  13, 6,  13, 12, 13, 12, 6,  12, 6,  10, 10, 10, 9,  4,  8,  6,  7,  9,
+    9,  8,  4,  6,  7,  5,  8,  7,  7,  3,  4,  8,  7,  8,  7,  6,  3,  4,  10,
+    11, 11, 8,  5,  4,  3,  2,  4,  5,  5,  5,  7,  9,  2,  2,  3,  4,  4,  5,
+    7,  2,  0,  1,  1,  2,  3,  4,  2,  2,  3,  2,  2,  2,  3,  4,  5,  8,  7,
+    6,  4,  3,  5,  9,  14, 12, 8,  5,  3,  10, 13, 16, 13, 9,  6,  3,  3,  6,
+    4,  2,  5,  6,  7,  2,  5,  5,  2,  3,  4,  5,  3,  6,  7,  3,  0,  3,  4,
+    2,  5,  7,  5,  4,  3,  3,  4,  7,  11, 11, 8,  6,  4,  7,  11, 15, 15, 11,
+    7,  4,  12, 16, 16, 16, 12, 8,  5,  24, 29, 32, 36, 35, 32, 29, 23, 27, 31,
+    35, 34, 31, 28, 21, 25, 29, 33, 34, 30, 26, 20, 22, 26, 30, 32, 29, 27, 19,
+    22, 24, 28, 32, 30, 27, 18, 21, 23, 27, 31, 30, 27, 16, 19, 23, 26, 29, 30,
+    26, 22, 25, 28, 33, 31, 28, 25, 20, 24, 28, 31, 31, 27, 24, 19, 22, 26, 30,
+    29, 26, 22, 18, 20, 23, 26, 26, 25, 21, 18, 20, 22, 26, 26, 25, 22, 16, 19,
+    22, 25, 24, 24, 22, 13, 17, 20, 23, 23, 24, 22, 19, 22, 24, 26, 26, 24, 20,
+    18, 21, 23, 24, 25, 23, 18, 17, 20, 22, 21, 22, 21, 16, 15, 19, 19, 19, 20,
+    19, 15, 13, 17, 19, 18, 18, 18, 15, 11, 16, 17, 17, 18, 17, 16, 13, 14, 15,
+    16, 16, 17, 14, 17, 17, 17, 18, 19, 18, 10, 15, 16, 17, 17, 17, 15, 9,  11,
+    15, 15, 15, 14, 13, 8,  8,  14, 13, 12, 12, 11, 10, 9,  12, 12, 11, 11, 10,
+    6,  10, 10, 10, 10, 10, 9,  3,  13, 14, 10, 8,  9,  8,  3,  7,  9,  10, 10,
+    11, 8,  10, 3,  7,  8,  9,  9,  5,  9,  3,  6,  6,  6,  6,  3,  5,  3,  4,
+    4,  4,  3,  2,  3,  5,  5,  4,  4,  4,  3,  3,  7,  9,  10, 8,  6,  4,  2,
+    11, 14, 13, 10, 7,  4,  2,  0,  2,  2,  3,  4,  6,  8,  0,  4,  3,  3,  3,
+    4,  5,  0,  4,  3,  2,  1,  2,  3,  0,  5,  5,  3,  3,  2,  2,  3,  7,  9,
+    8,  7,  4,  2,  7,  12, 15, 12, 9,  5,  3,  12, 15, 16, 14, 10, 7,  4,  6,
+    9,  6,  3,  3,  5,  6,  6,  9,  8,  4,  2,  3,  4,  6,  9,  11, 5,  3,  0,
+    3,  6,  7,  9,  6,  4,  4,  3,  6,  9,  12, 12, 9,  6,  4,  9,  13, 16, 16,
+    11, 8,  4,  14, 17, 17, 17, 13, 9,  5,  20, 23, 27, 31, 30, 28, 24, 19, 22,
+    26, 31, 31, 27, 24, 17, 21, 25, 28, 29, 26, 22, 16, 19, 22, 25, 27, 24, 21,
+    14, 17, 20, 23, 27, 25, 22, 14, 16, 19, 23, 26, 25, 21, 11, 14, 18, 22, 25,
+    25, 22, 17, 20, 25, 29, 28, 25, 21, 16, 20, 24, 28, 27, 23, 20, 15, 18, 22,
+    24, 24, 22, 18, 14, 16, 19, 21, 21, 19, 17, 13, 16, 18, 20, 20, 21, 17, 11,
+    14, 17, 20, 20, 20, 17, 12, 12, 16, 19, 19, 18, 17, 15, 18, 21, 22, 23, 21,
+    16, 14, 17, 19, 20, 21, 20, 15, 13, 16, 18, 18, 18, 17, 13, 12, 14, 14, 14,
+    15, 15, 12, 10, 13, 14, 14, 14, 14, 12, 9,  11, 12, 12, 13, 12, 12, 13, 12,
+    11, 11, 11, 11, 11, 13, 13, 13, 14, 15, 15, 8,  11, 11, 12, 13, 13, 13, 7,
+    9,  10, 11, 10, 10, 10, 6,  5,  9,  8,  7,  7,  7,  6,  7,  7,  7,  7,  6,
+    6,  3,  9,  9,  8,  6,  5,  5,  2,  13, 13, 9,  7,  5,  4,  2,  4,  5,  5,
+    6,  7,  7,  8,  1,  3,  4,  5,  5,  5,  6,  1,  1,  2,  2,  2,  2,  3,  1,
+    3,  2,  1,  2,  1,  2,  3,  6,  6,  5,  5,  3,  2,  8,  11, 11, 9,  6,  4,
+    2,  12, 14, 13, 10, 8,  6,  3,  5,  5,  4,  4,  4,  6,  7,  5,  7,  4,  4,
+    4,  3,  4,  5,  7,  5,  4,  2,  1,  2,  5,  7,  6,  5,  3,  3,  2,  6,  9,
+    11, 9,  7,  6,  3,  9,  12, 15, 13, 9,  6,  4,  13, 15, 16, 14, 10, 7,  4,
+    8,  10, 7,  4,  4,  5,  5,  8,  10, 9,  5,  3,  3,  3,  8,  10, 11, 6,  4,
+    3,  0,  8,  9,  11, 7,  5,  4,  3,  8,  10, 14, 13, 9,  7,  5,  11, 14, 17,
+    16, 12, 8,  6,  14, 16, 17, 17, 13, 9,  6,  32, 35, 38, 42, 42, 39, 35, 31,
+    35, 38, 41, 41, 39, 37, 29, 33, 37, 40, 41, 39, 37, 29, 31, 35, 38, 42, 39,
+    37, 28, 31, 35, 39, 42, 40, 37, 27, 31, 35, 37, 41, 40, 36, 24, 28, 33, 36,
+    41, 39, 36, 29, 33, 37, 39, 38, 34, 32, 29, 32, 35, 38, 37, 35, 31, 27, 30,
+    33, 38, 37, 34, 32, 26, 29, 33, 36, 36, 35, 33, 26, 29, 33, 35, 36, 36, 33,
+    23, 28, 31, 35, 35, 35, 33, 21, 25, 29, 33, 34, 34, 32, 27, 31, 32, 32, 33,
+    30, 24, 26, 28, 32, 31, 32, 29, 25, 24, 28, 29, 30, 30, 29, 24, 21, 28, 28,
+    29, 30, 30, 26, 19, 26, 29, 28, 29, 28, 26, 15, 24, 27, 27, 28, 27, 26, 16,
+    22, 25, 25, 27, 26, 25, 24, 25, 25, 25, 25, 22, 13, 21, 23, 24, 24, 24, 21,
+    14, 18, 22, 23, 23, 22, 20, 15, 13, 22, 22, 22, 23, 20, 17, 15, 20, 21, 21,
+    21, 19, 14, 15, 17, 19, 19, 19, 18, 11, 16, 14, 16, 17, 18, 17, 8,  12, 17,
+    16, 17, 14, 10, 13, 9,  15, 15, 15, 14, 10, 14, 9,  12, 13, 13, 13, 8,  12,
+    9,  10, 13, 12, 12, 9,  10, 10, 7,  11, 11, 10, 6,  8,  10, 9,  8,  9,  9,
+    5,  8,  12, 10, 9,  7,  7,  4,  7,  4,  6,  6,  6,  7,  9,  10, 4,  4,  4,
+    5,  5,  9,  10, 4,  2,  2,  3,  4,  7,  9,  4,  2,  1,  1,  4,  6,  8,  5,
+    4,  4,  4,  4,  4,  7,  7,  6,  8,  6,  4,  4,  6,  9,  9,  8,  7,  5,  4,
+    5,  0,  4,  3,  2,  4,  7,  9,  0,  4,  4,  2,  4,  6,  8,  0,  4,  5,  2,
+    2,  6,  8,  0,  4,  4,  2,  2,  4,  6,  2,  4,  6,  5,  5,  4,  5,  4,  6,
+    8,  8,  6,  5,  4,  8,  8,  9,  9,  6,  5,  4,  38, 42, 46, 49, 49, 46, 42,
+    37, 41, 46, 48, 50, 45, 42, 36, 39, 44, 47, 48, 45, 40, 34, 38, 41, 45, 48,
+    44, 41, 34, 37, 41, 45, 48, 45, 41, 32, 37, 40, 43, 47, 46, 42, 30, 34, 39,
+    43, 46, 46, 42, 36, 40, 44, 46, 44, 41, 37, 34, 38, 42, 45, 45, 40, 37, 33,
+    37, 42, 43, 44, 41, 38, 30, 36, 39, 42, 40, 39, 37, 30, 35, 38, 42, 42, 40,
+    36, 27, 33, 36, 40, 41, 39, 38, 24, 31, 35, 39, 39, 37, 37, 32, 36, 39, 39,
+    39, 36, 29, 32, 35, 37, 39, 37, 35, 29, 28, 34, 36, 37, 36, 35, 28, 25, 34,
+    33, 34, 35, 33, 29, 22, 32, 34, 34, 34, 33, 30, 18, 29, 31, 33, 33, 32, 29,
+    17, 27, 30, 31, 32, 31, 27, 28, 31, 32, 31, 31, 27, 19, 24, 30, 31, 31, 30,
+    25, 19, 20, 27, 29, 28, 28, 24, 21, 16, 26, 27, 27, 26, 22, 22, 17, 22, 26,
+    26, 25, 22, 18, 18, 19, 24, 24, 24, 21, 14, 17, 15, 22, 23, 23, 20, 11, 15,
+    22, 23, 24, 18, 14, 19, 12, 20, 22, 21, 18, 13, 19, 12, 16, 19, 19, 17, 10,
+    16, 12, 12, 18, 18, 15, 10, 13, 13, 9,  17, 16, 13, 8,  10, 12, 10, 14, 14,
+    12, 7,  10, 13, 12, 11, 12, 10, 6,  8,  7,  11, 13, 11, 9,  12, 15, 7,  7,
+    11, 10, 8,  11, 13, 7,  5,  9,  8,  7,  8,  11, 7,  4,  7,  6,  7,  9,  9,
+    7,  5,  5,  4,  4,  6,  8,  8,  7,  6,  6,  4,  5,  8,  10, 8,  8,  6,  5,
+    4,  6,  4,  1,  2,  6,  8,  10, 13, 4,  1,  2,  5,  7,  9,  10, 4,  1,  3,
+    3,  5,  7,  9,  4,  0,  3,  1,  3,  5,  7,  4,  2,  4,  4,  4,  4,  6,  5,
+    5,  7,  7,  5,  4,  6,  7,  7,  7,  7,  5,  4,  5,  45, 49, 52, 55, 56, 52,
+    48, 43, 47, 51, 55, 54, 51, 47, 41, 45, 50, 52, 53, 50, 46, 40, 44, 47, 51,
+    52, 49, 46, 38, 41, 45, 49, 52, 50, 46, 37, 41, 44, 48, 51, 50, 46, 34, 39,
+    43, 47, 50, 49, 47, 42, 45, 49, 53, 51, 48, 43, 40, 45, 49, 53, 51, 47, 42,
+    37, 43, 47, 51, 49, 46, 40, 35, 40, 44, 48, 46, 45, 40, 33, 41, 44, 46, 45,
+    45, 40, 30, 39, 42, 45, 45, 44, 40, 26, 36, 40, 44, 43, 42, 40, 38, 43, 45,
+    46, 45, 42, 34, 34, 41, 44, 44, 44, 40, 34, 31, 40, 42, 41, 41, 39, 33, 28,
+    37, 39, 39, 38, 36, 33, 24, 36, 38, 40, 38, 35, 33, 21, 32, 37, 37, 37, 34,
+    33, 19, 30, 34, 35, 35, 34, 30, 31, 37, 38, 37, 36, 32, 25, 27, 34, 36, 35,
+    35, 30, 25, 24, 31, 35, 34, 33, 27, 25, 20, 28, 31, 32, 30, 25, 26, 20, 25,
+    31, 31, 29, 23, 22, 21, 21, 29, 29, 28, 23, 19, 20, 17, 26, 28, 27, 22, 14,
+    18, 27, 29, 29, 23, 19, 25, 15, 23, 27, 27, 22, 16, 25, 15, 19, 25, 25, 20,
+    13, 20, 15, 15, 23, 23, 17, 11, 17, 15, 12, 21, 21, 15, 10, 14, 16, 12, 18,
+    19, 15, 8,  12, 15, 13, 14, 17, 13, 8,  12, 10, 14, 19, 15, 13, 16, 21, 10,
+    10, 17, 13, 12, 14, 18, 10, 6,  15, 11, 9,  11, 14, 10, 5,  11, 8,  7,  10,
+    11, 10, 6,  9,  6,  5,  8,  10, 10, 8,  6,  5,  4,  6,  10, 11, 9,  7,  5,
+    4,  6,  8,  5,  3,  6,  9,  12, 14, 16, 5,  3,  5,  8,  10, 12, 14, 5,  3,
+    3,  6,  7,  9,  11, 5,  3,  0,  3,  6,  10, 10, 5,  3,  3,  3,  3,  5,  8,
+    6,  5,  5,  6,  4,  5,  7,  8,  6,  6,  6,  5,  4,  6,  38, 43, 47, 49, 51,
+    47, 43, 36, 41, 43, 50, 49, 46, 41, 35, 39, 44, 46, 47, 45, 39, 34, 37, 40,
+    44, 46, 42, 38, 31, 34, 38, 42, 44, 42, 38, 30, 34, 36, 40, 44, 43, 37, 28,
+    31, 35, 39, 42, 42, 38, 34, 40, 44, 47, 45, 42, 38, 34, 38, 42, 46, 45, 41,
+    37, 32, 36, 40, 43, 43, 39, 34, 31, 34, 37, 40, 39, 38, 33, 27, 32, 35, 38,
+    38, 37, 33, 24, 32, 34, 37, 37, 36, 33, 20, 29, 33, 36, 36, 35, 34, 33, 36,
+    38, 38, 39, 36, 30, 29, 34, 38, 39, 39, 35, 29, 26, 33, 36, 36, 36, 34, 27,
+    23, 31, 32, 33, 33, 31, 26, 19, 29, 32, 32, 31, 29, 25, 15, 28, 30, 31, 31,
+    28, 25, 15, 25, 28, 29, 29, 27, 24, 26, 30, 31, 31, 32, 28, 21, 22, 29, 30,
+    31, 30, 25, 20, 18, 26, 28, 29, 27, 23, 20, 16, 22, 25, 25, 25, 19, 20, 14,
+    19, 25, 24, 23, 17, 16, 15, 16, 22, 22, 21, 18, 12, 15, 13, 20, 20, 20, 17,
+    9,  14, 22, 23, 24, 20, 15, 20, 10, 19, 21, 22, 18, 13, 21, 11, 14, 19, 19,
+    16, 10, 16, 10, 9,  17, 16, 12, 7,  12, 10, 7,  15, 15, 11, 7,  9,  11, 8,
+    12, 12, 10, 5,  7,  11, 9,  10, 11, 9,  4,  6,  5,  11, 14, 12, 11, 13, 17,
+    5,  7,  12, 11, 10, 11, 14, 6,  3,  9,  8,  7,  8,  10, 5,  3,  6,  5,  4,
+    5,  7,  5,  3,  4,  3,  2,  4,  6,  6,  5,  7,  6,  4,  3,  7,  8,  7,  8,
+    8,  5,  3,  4,  2,  2,  4,  7,  9,  12, 13, 2,  2,  3,  6,  8,  9,  10, 2,
+    2,  3,  4,  5,  6,  8,  2,  1,  3,  0,  3,  5,  6,  2,  1,  5,  6,  4,  3,
+    5,  3,  5,  11, 11, 7,  3,  4,  5,  9,  12, 13, 8,  4,  3,  32, 37, 41, 44,
+    43, 41, 38, 30, 35, 39, 44, 44, 41, 36, 30, 34, 39, 41, 42, 38, 34, 28, 32,
+    35, 38, 41, 37, 32, 26, 29, 31, 35, 38, 36, 32, 24, 27, 30, 34, 38, 36, 33,
+    22, 25, 29, 34, 36, 36, 32, 30, 35, 38, 41, 41, 37, 33, 30, 32, 36, 40, 38,
+    36, 31, 27, 31, 35, 38, 37, 34, 30, 25, 29, 32, 35, 35, 32, 27, 23, 26, 30,
+    32, 32, 31, 28, 21, 25, 28, 30, 31, 30, 27, 18, 23, 27, 30, 29, 29, 28, 27,
+    31, 33, 34, 35, 33, 26, 25, 29, 31, 33, 33, 30, 24, 23, 28, 31, 30, 31, 29,
+    23, 19, 26, 27, 26, 28, 26, 21, 15, 24, 25, 25, 25, 24, 21, 13, 23, 24, 23,
+    23, 23, 21, 12, 21, 22, 22, 23, 23, 19, 22, 25, 26, 27, 27, 25, 18, 19, 24,
+    24, 25, 25, 22, 17, 15, 22, 23, 23, 22, 19, 16, 12, 19, 19, 19, 20, 16, 16,
+    11, 16, 18, 17, 17, 14, 12, 12, 13, 16, 16, 16, 13, 9,  12, 11, 15, 14, 15,
+    13, 6,  10, 17, 18, 18, 17, 13, 18, 7,  16, 16, 17, 16, 10, 17, 7,  12, 15,
+    14, 13, 8,  12, 7,  7,  11, 10, 10, 5,  8,  7,  4,  9,  9,  8,  4,  5,  7,
+    6,  6,  7,  6,  3,  5,  9,  8,  7,  5,  5,  2,  4,  3,  8,  9,  9,  9,  11,
+    15, 3,  6,  7,  8,  8,  9,  11, 3,  2,  5,  4,  6,  6,  7,  3,  1,  1,  1,
+    3,  3,  4,  2,  2,  3,  3,  2,  2,  4,  4,  5,  9,  8,  4,  2,  5,  6,  9,
+    11, 9,  6,  2,  3,  2,  4,  4,  6,  8,  10, 11, 2,  4,  4,  5,  7,  8,  8,
+    2,  4,  5,  3,  4,  4,  5,  2,  3,  7,  3,  0,  3,  4,  1,  4,  7,  7,  5,
+    2,  3,  3,  8,  11, 12, 7,  3,  2,  8,  12, 13, 12, 8,  4,  2,  27, 32, 36,
+    39, 40, 36, 33, 27, 30, 35, 39, 38, 35, 32, 25, 29, 33, 37, 38, 34, 30, 25,
+    26, 30, 34, 36, 32, 27, 21, 24, 27, 30, 34, 31, 27, 19, 22, 25, 28, 32, 31,
+    28, 18, 20, 24, 27, 30, 31, 27, 26, 29, 34, 37, 35, 33, 28, 24, 27, 31, 35,
+    36, 31, 28, 23, 26, 30, 33, 32, 29, 24, 21, 24, 28, 30, 29, 28, 23, 19, 21,
+    24, 26, 26, 26, 22, 17, 20, 22, 25, 26, 25, 22, 14, 18, 22, 25, 24, 24, 22,
+    23, 26, 28, 29, 31, 28, 24, 22, 25, 27, 28, 28, 27, 21, 20, 25, 25, 26, 26,
+    25, 19, 17, 22, 22, 22, 22, 22, 17, 13, 19, 20, 19, 20, 19, 16, 10, 18, 19,
+    19, 18, 18, 17, 10, 15, 17, 17, 18, 17, 15, 20, 21, 21, 22, 23, 22, 15, 17,
+    20, 19, 21, 21, 20, 14, 13, 19, 19, 18, 18, 17, 13, 9,  16, 15, 15, 14, 13,
+    12, 8,  13, 13, 12, 12, 11, 8,  9,  11, 11, 11, 11, 10, 6,  10, 8,  9,  9,
+    10, 9,  4,  8,  13, 13, 14, 15, 12, 15, 5,  12, 12, 13, 13, 9,  13, 5,  10,
+    10, 9,  10, 7,  9,  5,  5,  6,  6,  6,  3,  5,  4,  2,  4,  3,  3,  3,  3,
+    5,  5,  5,  4,  2,  2,  4,  6,  7,  7,  5,  3,  1,  3,  2,  4,  6,  7,  8,
+    10, 12, 2,  3,  5,  6,  7,  8,  9,  2,  3,  4,  4,  4,  5,  6,  2,  2,  2,
+    2,  1,  2,  3,  2,  3,  6,  4,  3,  1,  3,  3,  7,  10, 8,  5,  2,  3,  6,
+    9,  10, 9,  6,  3,  2,  4,  6,  5,  5,  7,  9,  10, 4,  6,  6,  5,  6,  7,
+    7,  3,  5,  7,  3,  3,  4,  5,  4,  5,  10, 5,  3,  0,  3,  4,  6,  8,  8,
+    5,  3,  1,  6,  9,  12, 11, 7,  4,  1,  9,  11, 12, 12, 8,  5,  2,  24, 27,
+    32, 36, 36, 33, 29, 23, 26, 30, 34, 35, 32, 28, 21, 25, 29, 32, 33, 30, 26,
+    20, 22, 26, 29, 32, 28, 23, 17, 19, 22, 26, 28, 26, 23, 15, 17, 20, 23, 27,
+    26, 22, 14, 16, 19, 22, 26, 26, 22, 21, 25, 28, 33, 31, 29, 25, 20, 24, 28,
+    31, 31, 27, 23, 19, 22, 26, 28, 28, 25, 22, 18, 20, 23, 25, 25, 24, 19, 15,
+    17, 19, 21, 22, 22, 18, 13, 15, 18, 20, 20, 21, 18, 11, 14, 17, 20, 19, 19,
+    18, 19, 22, 24, 25, 27, 25, 20, 18, 21, 23, 24, 24, 23, 18, 17, 20, 21, 22,
+    22, 21, 17, 15, 17, 18, 18, 18, 18, 13, 10, 14, 15, 15, 15, 15, 13, 6,  13,
+    14, 14, 14, 14, 13, 7,  12, 13, 12, 12, 12, 12, 17, 17, 17, 18, 19, 19, 13,
+    15, 15, 16, 16, 17, 17, 11, 11, 14, 15, 14, 14, 13, 10, 7,  12, 11, 10, 10,
+    10, 9,  5,  9,  8,  8,  7,  7,  6,  6,  7,  6,  6,  6,  6,  3,  7,  4,  5,
+    5,  5,  5,  3,  7,  9,  9,  10, 11, 11, 13, 2,  7,  8,  9,  9,  8,  11, 2,
+    6,  6,  5,  6,  6,  6,  2,  3,  3,  2,  2,  2,  3,  1,  2,  2,  2,  2,  0,
+    2,  2,  5,  4,  3,  2,  1,  2,  3,  6,  6,  4,  3,  2,  1,  3,  4,  5,  7,
+    8,  9,  11, 3,  4,  5,  6,  6,  7,  8,  3,  6,  4,  4,  4,  4,  5,  3,  5,
+    4,  3,  2,  1,  2,  3,  6,  6,  5,  3,  2,  1,  5,  7,  9,  7,  4,  2,  0,
+    6,  7,  9,  8,  5,  3,  1,  6,  7,  6,  5,  7,  8,  9,  6,  8,  7,  5,  6,
+    6,  6,  6,  8,  9,  4,  3,  3,  3,  6,  8,  9,  6,  4,  2,  0,  6,  8,  10,
+    8,  4,  3,  2,  7,  9,  11, 10, 6,  3,  2,  7,  9,  11, 10, 7,  4,  2,  33,
+    38, 42, 45, 45, 42, 39, 33, 37, 41, 45, 45, 43, 37, 30, 35, 39, 42, 43, 41,
+    38, 30, 33, 36, 40, 43, 39, 36, 27, 30, 34, 38, 41, 40, 36, 26, 30, 33, 36,
+    40, 39, 35, 23, 27, 32, 36, 39, 38, 36, 31, 36, 39, 42, 41, 38, 35, 29, 33,
+    38, 41, 41, 37, 33, 28, 32, 36, 40, 39, 37, 32, 27, 30, 34, 36, 36, 36, 31,
+    25, 28, 32, 34, 35, 34, 30, 22, 27, 29, 33, 34, 33, 31, 20, 24, 28, 33, 32,
+    33, 31, 28, 32, 35, 34, 36, 34, 28, 27, 30, 32, 35, 35, 32, 28, 24, 29, 32,
+    33, 31, 32, 27, 21, 28, 28, 30, 29, 29, 25, 17, 25, 27, 28, 28, 28, 25, 14,
+    24, 26, 26, 26, 27, 26, 14, 21, 24, 25, 24, 25, 24, 24, 26, 27, 28, 29, 26,
+    17, 20, 25, 26, 28, 28, 25, 17, 17, 23, 25, 24, 24, 23, 18, 13, 20, 21, 21,
+    21, 19, 18, 13, 18, 20, 19, 19, 18, 14, 14, 15, 17, 18, 18, 18, 10, 14, 12,
+    15, 16, 17, 16, 9,  12, 18, 19, 20, 19, 14, 17, 9,  16, 17, 18, 17, 12, 17,
+    8,  13, 15, 15, 15, 10, 14, 9,  8,  12, 12, 12, 8,  10, 8,  5,  10, 10, 9,
+    7,  8,  9,  7,  7,  8,  8,  5,  10, 10, 8,  7,  6,  6,  3,  8,  4,  8,  9,
+    9,  9,  12, 14, 4,  6,  7,  8,  9,  10, 13, 4,  2,  5,  5,  6,  8,  10, 4,
+    2,  1,  1,  4,  6,  8,  4,  2,  2,  2,  2,  3,  8,  5,  4,  6,  4,  3,  2,
+    6,  7,  7,  6,  5,  3,  2,  5,  2,  4,  4,  5,  8,  10, 12, 2,  4,  5,  4,
+    7,  8,  10, 2,  4,  5,  3,  4,  6,  7,  2,  4,  5,  2,  1,  4,  7,  0,  4,
+    5,  3,  3,  2,  5,  3,  4,  6,  6,  4,  3,  4,  5,  6,  6,  6,  4,  3,  2,
+    41, 45, 50, 51, 52, 50, 46, 40, 43, 48, 51, 53, 48, 44, 37, 41, 46, 50, 51,
+    48, 43, 36, 39, 43, 46, 50, 46, 41, 33, 36, 41, 44, 47, 45, 41, 32, 35, 39,
+    42, 46, 45, 42, 28, 34, 37, 41, 45, 45, 41, 37, 41, 47, 49, 48, 44, 41, 35,
+    41, 44, 49, 48, 44, 40, 33, 39, 43, 47, 44, 42, 38, 33, 37, 40, 44, 42, 41,
+    36, 29, 34, 37, 40, 41, 39, 36, 25, 33, 36, 39, 40, 38, 36, 22, 30, 35, 38,
+    39, 38, 36, 34, 39, 42, 42, 42, 39, 34, 32, 37, 40, 41, 42, 38, 32, 29, 36,
+    37, 38, 39, 37, 31, 25, 33, 35, 35, 35, 34, 29, 20, 31, 33, 33, 34, 32, 30,
+    16, 29, 31, 31, 32, 31, 29, 16, 26, 30, 30, 31, 30, 27, 28, 33, 34, 34, 34,
+    32, 23, 24, 31, 32, 34, 33, 29, 23, 20, 29, 31, 30, 30, 27, 23, 17, 24, 27,
+    27, 27, 24, 23, 15, 20, 25, 26, 25, 21, 19, 16, 18, 23, 23, 24, 20, 15, 16,
+    14, 21, 22, 22, 20, 11, 16, 24, 25, 26, 23, 18, 24, 12, 21, 23, 24, 22, 16,
+    23, 12, 17, 21, 21, 19, 13, 19, 12, 11, 18, 17, 15, 10, 14, 11, 8,  16, 15,
+    13, 9,  11, 12, 9,  13, 13, 12, 8,  10, 12, 10, 11, 12, 11, 8,  9,  7,  13,
+    15, 14, 14, 16, 20, 7,  9,  14, 13, 12, 14, 16, 7,  4,  11, 11, 9,  11, 13,
+    7,  4,  7,  7,  6,  8,  10, 6,  4,  4,  4,  3,  8,  9,  7,  5,  4,  3,  2,
+    5,  9,  8,  7,  5,  4,  2,  4,  8,  4,  3,  5,  9,  12, 14, 16, 4,  3,  4,
+    8,  11, 12, 14, 4,  3,  4,  5,  7,  9,  11, 4,  2,  3,  1,  4,  7,  8,  4,
+    0,  4,  3,  2,  4,  8,  3,  3,  4,  5,  3,  3,  7,  5,  5,  5,  5,  3,  2,
+    5,  47, 50, 55, 58, 58, 55, 52, 45, 50, 53, 58, 57, 54, 50, 43, 48, 52, 54,
+    56, 52, 48, 42, 45, 49, 51, 55, 51, 45, 39, 42, 45, 49, 52, 50, 45, 36, 40,
+    43, 47, 50, 49, 45, 32, 38, 43, 46, 49, 51, 45, 42, 47, 51, 55, 54, 50, 47,
+    42, 45, 51, 55, 54, 49, 44, 40, 44, 48, 53, 51, 47, 43, 36, 43, 47, 49, 48,
+    46, 40, 32, 39, 42, 46, 46, 44, 39, 28, 36, 41, 45, 43, 44, 40, 24, 35, 40,
+    44, 43, 41, 40, 38, 43, 47, 47, 48, 45, 38, 36, 43, 46, 48, 47, 43, 37, 32,
+    40, 44, 44, 44, 43, 35, 28, 38, 40, 40, 40, 38, 34, 22, 34, 37, 38, 37, 36,
+    33, 19, 32, 37, 36, 36, 35, 33, 18, 28, 34, 35, 35, 33, 31, 32, 39, 39, 42,
+    40, 36, 30, 28, 36, 38, 39, 38, 34, 28, 24, 33, 37, 36, 35, 29, 28, 21, 28,
+    33, 33, 33, 27, 27, 18, 23, 31, 30, 29, 23, 23, 19, 19, 28, 28, 28, 23, 20,
+    18, 15, 25, 27, 27, 22, 15, 18, 28, 31, 31, 27, 23, 29, 16, 24, 30, 30, 26,
+    20, 28, 16, 20, 27, 26, 23, 17, 23, 16, 14, 23, 23, 19, 13, 19, 14, 10, 20,
+    20, 16, 11, 15, 14, 10, 16, 18, 15, 9,  12, 13, 11, 13, 17, 14, 9,  11, 11,
+    15, 21, 18, 17, 20, 25, 10, 10, 19, 18, 16, 17, 21, 11, 6,  16, 15, 13, 14,
+    17, 10, 6,  12, 12, 9,  11, 12, 9,  5,  7,  7,  7,  9,  11, 9,  7,  5,  4,
+    4,  7,  11, 10, 8,  5,  3,  3,  8,  9,  6,  5,  10, 13, 15, 18, 20, 6,  5,
+    9,  12, 14, 16, 17, 5,  5,  7,  9,  10, 12, 14, 5,  4,  3,  5,  7,  8,  10,
+    5,  4,  0,  2,  4,  7,  9,  5,  3,  3,  4,  3,  6,  8,  6,  4,  4,  4,  3,
+    4,  7,  44, 47, 51, 55, 56, 53, 48, 43, 46, 50, 54, 55, 52, 45, 40, 44, 49,
+    51, 54, 48, 45, 40, 42, 46, 50, 52, 48, 42, 35, 39, 42, 45, 48, 45, 41, 32,
+    37, 39, 42, 46, 45, 41, 29, 34, 39, 42, 45, 46, 41, 42, 45, 49, 53, 51, 47,
+    44, 40, 44, 48, 51, 50, 46, 42, 36, 41, 45, 47, 47, 45, 40, 33, 39, 43, 46,
+    46, 43, 37, 28, 35, 39, 42, 41, 40, 36, 25, 34, 37, 40, 40, 40, 37, 21, 32,
+    36, 39, 39, 38, 36, 36, 42, 43, 44, 46, 42, 37, 33, 39, 42, 44, 43, 41, 33,
+    29, 38, 40, 40, 41, 40, 33, 26, 35, 37, 37, 38, 36, 29, 20, 31, 34, 34, 34,
+    32, 31, 16, 28, 31, 33, 33, 30, 30, 15, 24, 31, 31, 31, 30, 27, 30, 35, 36,
+    37, 37, 35, 29, 25, 33, 34, 36, 36, 31, 26, 22, 30, 34, 34, 32, 28, 26, 17,
+    25, 30, 29, 29, 24, 25, 16, 19, 26, 26, 24, 21, 21, 15, 16, 25, 25, 25, 20,
+    17, 15, 12, 22, 23, 23, 20, 13, 16, 26, 28, 29, 25, 22, 28, 13, 22, 26, 28,
+    25, 19, 27, 13, 17, 25, 24, 22, 15, 21, 13, 12, 21, 21, 18, 11, 17, 12, 7,
+    17, 17, 14, 8,  13, 11, 8,  14, 15, 13, 7,  10, 11, 9,  10, 13, 12, 7,  9,
+    9,  14, 18, 18, 17, 19, 24, 9,  9,  17, 17, 16, 16, 19, 9,  6,  15, 14, 12,
+    13, 15, 8,  5,  10, 10, 9,  10, 10, 7,  4,  5,  6,  5,  7,  8,  6,  5,  3,
+    3,  4,  6,  8,  7,  6,  3,  2,  3,  6,  7,  5,  5,  10, 13, 15, 18, 20, 5,
+    5,  9,  12, 14, 15, 16, 5,  5,  8,  10, 11, 11, 13, 5,  4,  3,  6,  7,  8,
+    8,  3,  3,  2,  0,  3,  5,  7,  3,  2,  4,  5,  2,  5,  6,  4,  4,  6,  6,
+    2,  4,  6,  37, 42, 45, 48, 48, 46, 42, 36, 40, 43, 47, 48, 44, 40, 34, 37,
+    42, 46, 46, 42, 38, 32, 36, 41, 43, 44, 41, 34, 29, 33, 36, 39, 40, 37, 35,
+    27, 29, 33, 35, 39, 37, 33, 24, 27, 30, 35, 37, 39, 34, 34, 38, 41, 46, 45,
+    42, 37, 34, 37, 40, 45, 44, 40, 35, 31, 35, 39, 42, 41, 38, 34, 29, 33, 36,
+    39, 38, 36, 29, 25, 30, 32, 35, 35, 33, 29, 20, 27, 29, 32, 32, 32, 29, 15,
+    26, 29, 32, 31, 31, 29, 31, 34, 37, 39, 40, 37, 30, 28, 34, 36, 37, 37, 35,
+    29, 25, 32, 35, 35, 34, 34, 27, 21, 30, 31, 31, 31, 29, 25, 16, 25, 28, 28,
+    27, 25, 24, 12, 23, 25, 25, 25, 24, 24, 11, 19, 25, 23, 24, 24, 21, 25, 29,
+    30, 31, 31, 30, 24, 21, 28, 29, 30, 30, 27, 21, 18, 25, 27, 27, 27, 23, 20,
+    15, 22, 24, 23, 23, 20, 19, 12, 15, 21, 21, 19, 15, 16, 11, 12, 19, 18, 18,
+    15, 12, 11, 8,  17, 16, 16, 15, 9,  13, 21, 23, 23, 22, 19, 24, 9,  18, 21,
+    22, 21, 15, 22, 10, 14, 19, 18, 17, 12, 17, 10, 8,  16, 15, 14, 8,  11, 8,
+    4,  12, 11, 10, 5,  8,  7,  4,  9,  8,  8,  4,  6,  6,  5,  6,  7,  7,  4,
+    5,  5,  11, 13, 14, 14, 16, 20, 5,  8,  12, 13, 13, 14, 16, 5,  4,  11, 10,
+    10, 11, 11, 5,  3,  7,  6,  7,  7,  6,  3,  2,  2,  1,  3,  4,  5,  3,  2,
+    3,  3,  2,  3,  5,  4,  3,  4,  4,  1,  3,  4,  5,  5,  9,  11, 13, 15, 16,
+    5,  5,  8,  10, 12, 12, 13, 5,  5,  7,  8,  8,  9,  10, 5,  4,  3,  4,  5,
+    6,  4,  3,  2,  4,  3,  0,  3,  4,  2,  3,  5,  5,  2,  2,  3,  2,  5,  6,
+    6,  3,  1,  3,  32, 35, 39, 42, 42, 40, 37, 30, 34, 38, 42, 43, 39, 35, 29,
+    31, 37, 40, 41, 37, 33, 28, 29, 33, 38, 39, 35, 28, 25, 27, 30, 33, 36, 33,
+    29, 22, 23, 26, 30, 34, 32, 29, 20, 22, 25, 29, 32, 32, 28, 29, 33, 36, 40,
+    39, 36, 32, 28, 31, 35, 38, 39, 34, 30, 26, 30, 34, 36, 35, 32, 28, 26, 26,
+    30, 33, 33, 30, 24, 21, 23, 27, 30, 29, 28, 23, 17, 22, 24, 27, 27, 26, 24,
+    14, 20, 23, 26, 26, 26, 24, 27, 30, 31, 32, 35, 31, 27, 25, 29, 31, 32, 31,
+    29, 24, 22, 27, 29, 28, 29, 28, 22, 19, 26, 26, 25, 25, 25, 19, 13, 22, 22,
+    22, 22, 20, 18, 9,  20, 20, 20, 19, 20, 19, 8,  17, 19, 18, 18, 19, 17, 22,
+    25, 25, 25, 27, 26, 19, 18, 23, 24, 24, 25, 23, 17, 14, 22, 22, 22, 21, 19,
+    16, 11, 18, 18, 18, 18, 16, 14, 9,  13, 15, 14, 14, 12, 11, 9,  10, 13, 13,
+    12, 12, 8,  8,  6,  12, 11, 11, 11, 5,  10, 17, 17, 18, 18, 15, 19, 7,  15,
+    15, 16, 16, 12, 17, 7,  12, 13, 13, 13, 9,  12, 7,  6,  10, 9,  9,  5,  8,
+    5,  2,  6,  5,  5,  3,  5,  4,  2,  4,  3,  3,  3,  4,  4,  3,  2,  2,  2,
+    2,  3,  3,  9,  9,  10, 11, 13, 16, 3,  7,  8,  9,  10, 11, 12, 3,  4,  7,
+    7,  7,  8,  8,  3,  3,  4,  4,  4,  4,  3,  2,  1,  4,  3,  1,  2,  3,  1,
+    3,  5,  4,  2,  2,  3,  2,  4,  5,  5,  3,  0,  2,  4,  5,  6,  8,  10, 12,
+    13, 4,  5,  6,  8,  9,  10, 10, 4,  5,  6,  5,  6,  6,  7,  4,  4,  5,  3,
+    2,  3,  3,  2,  4,  7,  5,  3,  0,  3,  3,  5,  7,  6,  3,  2,  2,  4,  6,
+    7,  7,  4,  2,  2,  26, 30, 34, 38, 38, 34, 31, 24, 29, 32, 36, 37, 33, 29,
+    23, 26, 31, 35, 35, 32, 28, 22, 25, 28, 31, 33, 29, 24, 19, 21, 24, 28, 30,
+    28, 24, 17, 19, 22, 25, 29, 28, 25, 16, 17, 20, 24, 27, 28, 24, 23, 27, 31,
+    35, 33, 31, 27, 22, 25, 30, 33, 33, 30, 26, 21, 24, 28, 30, 31, 28, 24, 20,
+    21, 25, 27, 28, 26, 20, 17, 19, 21, 24, 24, 23, 20, 15, 17, 20, 22, 22, 22,
+    20, 12, 16, 19, 21, 21, 21, 20, 22, 24, 27, 27, 29, 26, 22, 20, 23, 25, 26,
+    26, 25, 20, 18, 22, 23, 23, 24, 23, 18, 16, 20, 20, 20, 20, 20, 15, 11, 16,
+    17, 17, 17, 16, 15, 7,  16, 15, 15, 15, 15, 14, 7,  14, 14, 14, 14, 14, 14,
+    18, 18, 19, 20, 22, 21, 14, 15, 18, 18, 19, 19, 19, 13, 12, 17, 17, 16, 16,
+    15, 11, 8,  15, 13, 12, 13, 12, 10, 6,  10, 10, 9,  9,  9,  7,  6,  8,  8,
+    8,  7,  8,  4,  7,  4,  7,  6,  6,  6,  3,  7,  11, 11, 12, 13, 12, 14, 4,
+    9,  10, 10, 11, 10, 12, 4,  8,  8,  7,  7,  7,  8,  4,  5,  4,  4,  4,  4,
+    4,  2,  1,  1,  1,  1,  2,  3,  2,  3,  4,  3,  2,  0,  3,  3,  4,  5,  3,
+    3,  2,  2,  3,  5,  6,  8,  9,  11, 12, 3,  4,  6,  7,  7,  8,  9,  3,  4,
+    4,  5,  5,  5,  6,  3,  3,  4,  3,  2,  2,  2,  1,  5,  6,  4,  3,  2,  2,
+    3,  7,  8,  6,  4,  2,  2,  5,  7,  9,  8,  4,  3,  0,  5,  7,  6,  6,  8,
+    9,  10, 5,  7,  7,  6,  7,  7,  7,  5,  7,  8,  4,  3,  4,  5,  5,  6,  8,
+    5,  3,  1,  2,  5,  8,  10, 8,  4,  3,  0,  7,  9,  10, 9,  5,  3,  1,  8,
+    9,  10, 10, 6,  4,  2,  36, 41, 47, 48, 47, 47, 42, 36, 39, 44, 48, 49, 45,
+    41, 34, 38, 42, 45, 47, 44, 39, 32, 35, 39, 42, 45, 41, 36, 29, 33, 35, 39,
+    41, 39, 37, 26, 29, 32, 37, 41, 39, 36, 23, 27, 32, 34, 38, 39, 35, 33, 38,
+    42, 45, 44, 42, 39, 31, 37, 41, 45, 44, 40, 38, 31, 35, 40, 42, 42, 40, 35,
+    29, 33, 36, 39, 38, 38, 31, 25, 28, 32, 36, 35, 35, 32, 22, 27, 30, 32, 34,
+    34, 31, 18, 24, 28, 32, 33, 32, 31, 31, 36, 37, 38, 39, 37, 32, 29, 33, 35,
+    37, 38, 36, 31, 26, 32, 36, 35, 35, 35, 30, 22, 29, 31, 31, 31, 31, 26, 17,
+    26, 27, 28, 27, 27, 26, 13, 24, 26, 26, 26, 27, 26, 12, 21, 23, 25, 24, 25,
+    24, 27, 29, 30, 31, 32, 31, 23, 21, 27, 29, 30, 29, 28, 22, 19, 25, 27, 26,
+    27, 25, 22, 14, 21, 24, 23, 23, 22, 20, 13, 17, 20, 19, 20, 18, 16, 12, 13,
+    17, 18, 18, 17, 12, 12, 10, 15, 16, 17, 17, 10, 13, 20, 22, 22, 22, 19, 23,
+    10, 18, 20, 20, 21, 16, 21, 10, 15, 18, 18, 18, 13, 17, 10, 9,  14, 14, 14,
+    10, 12, 8,  4,  10, 10, 10, 8,  9,  7,  5,  7,  7,  8,  6,  9,  8,  7,  5,
+    5,  6,  6,  8,  5,  11, 12, 13, 15, 17, 20, 5,  8,  10, 11, 13, 14, 16, 5,
+    5,  8,  8,  10, 12, 13, 5,  4,  4,  4,  6,  8,  8,  4,  3,  2,  1,  2,  6,
+    8,  4,  2,  4,  3,  1,  5,  8,  5,  5,  4,  3,  2,  4,  6,  4,  6,  6,  9,
+    13, 16, 17, 4,  6,  7,  7,  11, 13, 14, 5,  6,  7,  4,  8,  9,  11, 4,  5,
+    6,  3,  3,  5,  7,  3,  3,  5,  3,  2,  3,  7,  0,  4,  5,  5,  2,  1,  5,
+    3,  5,  5,  5,  3,  1,  4,  42, 48, 52, 54, 55, 52, 49, 41, 46, 50, 54, 53,
+    50, 46, 40, 44, 48, 52, 53, 50, 45, 38, 41, 46, 50, 52, 47, 41, 35, 39, 41,
+    46, 47, 46, 42, 31, 35, 37, 42, 46, 44, 41, 28, 33, 38, 41, 44, 44, 41, 39,
+    45, 48, 53, 51, 47, 44, 39, 43, 47, 50, 50, 47, 42, 36, 43, 46, 49, 48, 44,
+    40, 34, 39, 44, 45, 46, 42, 36, 29, 35, 38, 41, 41, 40, 37, 24, 33, 36, 39,
+    39, 39, 36, 20, 31, 34, 38, 38, 37, 37, 36, 40, 43, 43, 46, 43, 37, 34, 39,
+    42, 43, 43, 41, 36, 30, 39, 40, 41, 41, 39, 33, 25, 35, 37, 37, 37, 35, 30,
+    20, 31, 33, 33, 33, 32, 31, 15, 28, 31, 31, 31, 31, 30, 15, 25, 29, 30, 30,
+    30, 27, 30, 35, 37, 37, 38, 36, 28, 25, 33, 34, 36, 35, 32, 27, 21, 30, 34,
+    32, 32, 29, 26, 18, 26, 30, 29, 30, 26, 25, 16, 19, 26, 25, 25, 21, 21, 15,
+    16, 23, 24, 24, 21, 17, 15, 12, 21, 22, 22, 20, 13, 17, 25, 27, 29, 27, 23,
+    29, 14, 22, 26, 27, 25, 20, 27, 13, 18, 23, 23, 22, 17, 21, 13, 12, 20, 20,
+    18, 12, 16, 12, 7,  16, 16, 14, 9,  13, 11, 7,  13, 13, 13, 8,  10, 10, 8,
+    10, 12, 11, 8,  9,  9,  15, 18, 19, 18, 21, 24, 9,  10, 17, 17, 17, 18, 20,
+    9,  6,  14, 14, 14, 15, 16, 9,  5,  10, 10, 10, 11, 11, 7,  4,  5,  5,  5,
+    8,  10, 6,  4,  2,  2,  4,  6,  10, 7,  5,  3,  2,  3,  7,  8,  6,  6,  9,
+    14, 16, 19, 21, 6,  6,  8,  13, 15, 16, 18, 6,  6,  6,  10, 12, 13, 14, 6,
+    5,  5,  5,  8,  9,  9,  4,  3,  3,  2,  3,  5,  9,  4,  0,  3,  4,  1,  6,
+    7,  3,  3,  4,  4,  2,  4,  6,  49, 54, 58, 61, 61, 58, 53, 48, 51, 57, 60,
+    60, 57, 53, 46, 50, 54, 57, 59, 54, 51, 44, 47, 51, 55, 56, 51, 46, 40, 44,
+    47, 51, 53, 49, 46, 36, 41, 44, 46, 50, 50, 46, 32, 38, 42, 46, 49, 48, 47,
+    45, 49, 54, 58, 56, 54, 48, 44, 48, 52, 58, 56, 52, 47, 41, 47, 51, 55, 54,
+    50, 44, 38, 44, 48, 52, 50, 48, 41, 33, 42, 44, 48, 46, 46, 41, 27, 37, 41,
+    44, 45, 43, 40, 23, 34, 39, 43, 42, 42, 41, 41, 46, 50, 50, 51, 49, 41, 38,
+    45, 48, 50, 49, 46, 40, 33, 44, 46, 47, 46, 44, 37, 30, 40, 43, 43, 43, 41,
+    34, 24, 34, 39, 39, 39, 35, 34, 19, 30, 36, 36, 36, 35, 35, 17, 26, 34, 35,
+    34, 34, 32, 34, 42, 41, 43, 42, 41, 34, 29, 38, 41, 41, 40, 36, 33, 25, 34,
+    39, 39, 36, 33, 31, 21, 29, 36, 35, 33, 28, 29, 19, 23, 31, 32, 29, 24, 26,
+    18, 18, 28, 29, 27, 23, 22, 17, 14, 25, 26, 26, 23, 17, 20, 29, 33, 34, 30,
+    28, 33, 17, 25, 32, 32, 29, 24, 31, 17, 21, 29, 30, 26, 20, 26, 17, 15, 25,
+    26, 22, 15, 21, 15, 10, 20, 22, 17, 11, 17, 13, 9,  16, 19, 15, 10, 14, 13,
+    9,  11, 17, 15, 9,  11, 12, 17, 24, 23, 22, 24, 30, 12, 12, 22, 22, 20, 21,
+    25, 12, 9,  19, 19, 17, 18, 20, 12, 8,  14, 16, 13, 13, 14, 10, 6,  7,  11,
+    7,  10, 12, 9,  5,  4,  6,  5,  8,  10, 8,  6,  4,  5,  5,  7,  10, 8,  7,
+    16, 18, 20, 23, 24, 8,  8,  13, 17, 19, 20, 20, 8,  7,  11, 14, 16, 16, 17,
+    8,  6,  5,  11, 11, 12, 10, 6,  4,  3,  4,  5,  7,  10, 5,  3,  0,  1,  3,
+    6,  9,  5,  3,  2,  2,  3,  5,  8,  48, 52, 55, 59, 59, 57, 52, 47, 50, 55,
+    59, 59, 56, 50, 44, 48, 52, 56, 58, 53, 49, 43, 46, 50, 53, 54, 51, 44, 38,
+    44, 46, 49, 52, 49, 44, 34, 40, 43, 45, 50, 48, 43, 30, 37, 41, 44, 48, 47,
+    43, 45, 51, 53, 56, 56, 51, 47, 44, 47, 53, 55, 56, 50, 45, 40, 47, 51, 54,
+    52, 48, 44, 36, 43, 48, 50, 49, 44, 40, 32, 39, 45, 47, 44, 43, 39, 26, 36,
+    40, 43, 42, 42, 39, 21, 33, 38, 42, 42, 41, 40, 40, 45, 47, 48, 50, 48, 40,
+    37, 44, 48, 46, 49, 46, 38, 32, 42, 46, 45, 46, 43, 37, 28, 40, 42, 43, 41,
+    40, 33, 23, 35, 37, 38, 36, 34, 33, 17, 29, 35, 35, 35, 34, 34, 16, 24, 33,
+    33, 33, 32, 31, 32, 39, 40, 43, 42, 40, 34, 28, 38, 40, 41, 40, 36, 32, 24,
+    33, 38, 38, 37, 33, 30, 20, 28, 34, 34, 33, 28, 28, 19, 21, 31, 30, 28, 24,
+    25, 17, 17, 27, 27, 26, 22, 21, 16, 13, 23, 26, 26, 21, 17, 19, 29, 33, 34,
+    30, 27, 33, 16, 24, 32, 32, 29, 24, 31, 16, 21, 29, 29, 26, 20, 26, 16, 15,
+    24, 25, 22, 14, 20, 14, 10, 19, 21, 17, 10, 17, 12, 8,  14, 17, 15, 9,  13,
+    12, 8,  10, 16, 14, 9,  11, 11, 17, 23, 23, 22, 24, 29, 12, 12, 21, 22, 21,
+    21, 24, 12, 9,  19, 19, 17, 18, 20, 11, 7,  14, 15, 13, 12, 13, 10, 5,  7,
+    10, 7,  9,  11, 8,  5,  4,  6,  5,  7,  10, 7,  5,  4,  4,  4,  7,  9,  8,
+    8,  16, 18, 21, 23, 24, 8,  8,  14, 18, 20, 20, 20, 8,  8,  11, 16, 15, 15,
+    16, 8,  7,  6,  11, 11, 11, 10, 6,  5,  4,  5,  5,  6,  9,  4,  4,  1,  0,
+    3,  6,  8,  4,  3,  2,  2,  2,  5,  7,  41, 45, 48, 52, 51, 50, 45, 39, 42,
+    46, 52, 51, 47, 43, 37, 41, 45, 49, 49, 46, 41, 36, 39, 41, 46, 47, 44, 36,
+    33, 36, 38, 42, 43, 40, 37, 29, 32, 35, 39, 42, 41, 37, 25, 30, 34, 37, 40,
+    41, 37, 37, 42, 45, 49, 48, 44, 40, 36, 41, 44, 47, 47, 42, 37, 33, 38, 43,
+    45, 44, 42, 36, 31, 37, 39, 41, 41, 38, 32, 26, 33, 35, 38, 38, 35, 32, 21,
+    30, 33, 35, 34, 34, 31, 16, 28, 31, 34, 34, 33, 32, 34, 39, 40, 43, 42, 40,
+    33, 31, 37, 40, 41, 40, 37, 33, 26, 35, 38, 39, 37, 36, 30, 24, 32, 33, 34,
+    34, 32, 26, 17, 27, 31, 30, 30, 27, 26, 13, 24, 29, 28, 27, 26, 27, 12, 20,
+    27, 27, 27, 26, 24, 27, 33, 32, 34, 34, 33, 27, 22, 30, 33, 32, 32, 29, 24,
+    20, 27, 31, 31, 30, 26, 23, 17, 23, 27, 27, 26, 21, 22, 13, 17, 24, 23, 21,
+    18, 18, 12, 12, 21, 20, 19, 17, 15, 12, 9,  19, 19, 19, 17, 11, 15, 23, 26,
+    26, 24, 21, 26, 11, 20, 24, 25, 23, 18, 24, 11, 15, 22, 22, 20, 15, 19, 11,
+    10, 19, 18, 16, 10, 13, 9,  5,  14, 14, 12, 6,  10, 8,  4,  10, 11, 10, 5,
+    8,  8,  5,  7,  9,  8,  5,  6,  7,  13, 16, 17, 16, 19, 23, 7,  9,  15, 15,
+    15, 16, 18, 7,  5,  13, 12, 13, 13, 13, 7,  4,  10, 9,  9,  9,  8,  5,  2,
+    4,  4,  4,  5,  6,  3,  2,  2,  1,  2,  4,  6,  4,  3,  2,  2,  2,  4,  5,
+    6,  6,  11, 13, 15, 17, 18, 6,  6,  11, 13, 14, 15, 15, 6,  6,  8,  10, 11,
+    11, 11, 5,  5,  4,  6,  7,  7,  6,  3,  3,  3,  2,  2,  3,  5,  2,  1,  3,
+    3,  0,  3,  4,  2,  3,  4,  4,  2,  3,  4,  33, 38, 42, 46, 45, 43, 37, 32,
+    36, 40, 45, 44, 41, 37, 31, 34, 39, 42, 43, 39, 34, 30, 32, 36, 39, 40, 37,
+    31, 27, 29, 31, 36, 37, 35, 31, 23, 26, 29, 33, 36, 34, 31, 22, 25, 28, 30,
+    34, 34, 31, 31, 34, 38, 42, 42, 37, 34, 30, 33, 38, 41, 40, 36, 32, 29, 32,
+    36, 38, 38, 36, 28, 27, 29, 32, 36, 35, 32, 27, 22, 26, 30, 32, 31, 30, 26,
+    18, 23, 26, 29, 29, 29, 26, 15, 23, 25, 28, 28, 28, 26, 28, 31, 35, 34, 37,
+    34, 28, 26, 31, 31, 34, 34, 32, 26, 23, 30, 31, 31, 31, 30, 23, 19, 28, 28,
+    28, 28, 26, 21, 14, 24, 24, 24, 23, 23, 21, 10, 21, 23, 21, 22, 22, 21, 10,
+    19, 21, 20, 21, 21, 18, 24, 26, 27, 27, 29, 27, 21, 19, 25, 26, 27, 27, 24,
+    18, 16, 23, 24, 24, 24, 21, 18, 12, 19, 21, 20, 21, 18, 17, 10, 14, 17, 17,
+    16, 13, 13, 10, 10, 15, 15, 14, 13, 10, 9,  7,  14, 13, 13, 12, 6,  11, 18,
+    19, 20, 20, 16, 21, 8,  16, 18, 18, 18, 13, 19, 8,  12, 15, 15, 15, 11, 14,
+    8,  7,  12, 12, 11, 6,  9,  6,  2,  8,  8,  7,  4,  6,  5,  3,  6,  5,  5,
+    3,  5,  5,  3,  4,  4,  3,  3,  4,  4,  10, 10, 11, 13, 14, 18, 4,  8,  10,
+    10, 12, 12, 13, 4,  4,  9,  8,  9,  9,  9,  4,  3,  5,  5,  5,  5,  4,  2,
+    2,  2,  2,  2,  3,  4,  2,  1,  5,  4,  2,  2,  4,  3,  3,  5,  4,  2,  2,
+    3,  5,  5,  8,  10, 11, 13, 14, 5,  5,  7,  9,  10, 11, 11, 5,  5,  6,  7,
+    7,  8,  8,  5,  4,  5,  3,  3,  4,  3,  3,  3,  7,  5,  2,  2,  3,  1,  5,
+    6,  6,  3,  0,  3,  4,  6,  6,  6,  4,  2,  2,  27, 31, 35, 38, 39, 36, 33,
+    25, 30, 34, 39, 38, 35, 30, 25, 29, 32, 36, 37, 34, 29, 24, 26, 29, 32, 36,
+    31, 26, 21, 24, 26, 29, 33, 30, 26, 18, 20, 23, 27, 30, 30, 25, 17, 19, 22,
+    25, 29, 29, 26, 25, 28, 33, 35, 35, 33, 29, 24, 28, 32, 35, 35, 32, 27, 23,
+    26, 30, 32, 32, 30, 25, 22, 24, 27, 29, 29, 26, 21, 19, 20, 23, 26, 26, 25,
+    21, 16, 18, 21, 24, 23, 24, 21, 13, 17, 20, 22, 23, 22, 21, 22, 26, 28, 29,
+    31, 28, 23, 22, 24, 26, 28, 28, 27, 22, 20, 23, 25, 25, 25, 25, 19, 17, 22,
+    22, 22, 22, 21, 16, 11, 18, 19, 18, 18, 17, 16, 8,  17, 17, 17, 17, 16, 16,
+    8,  16, 16, 15, 15, 16, 14, 20, 21, 20, 22, 24, 22, 16, 16, 20, 20, 21, 21,
+    20, 14, 13, 18, 18, 18, 17, 17, 13, 9,  16, 15, 14, 14, 14, 12, 7,  12, 11,
+    11, 10, 10, 8,  7,  9,  10, 9,  9,  9,  5,  8,  5,  8,  8,  8,  8,  3,  8,
+    13, 13, 14, 15, 13, 15, 5,  11, 12, 12, 13, 10, 14, 5,  10, 10, 9,  9,  8,
+    9,  5,  5,  6,  6,  5,  4,  5,  3,  1,  2,  2,  2,  2,  3,  3,  2,  3,  2,
+    1,  2,  3,  4,  3,  4,  3,  2,  0,  2,  3,  6,  7,  8,  9,  11, 13, 3,  5,
+    7,  8,  8,  9,  10, 3,  4,  5,  5,  6,  6,  6,  3,  3,  3,  2,  2,  3,  3,
+    1,  4,  5,  4,  3,  0,  2,  1,  5,  7,  5,  3,  1,  2,  3,  6,  7,  6,  4,
+    2,  2,  4,  6,  6,  7,  9,  10, 11, 4,  6,  6,  6,  8,  8,  8,  4,  6,  7,
+    4,  4,  4,  6,  4,  6,  7,  4,  2,  1,  2,  3,  7,  8,  6,  3,  2,  1,  5,
+    7,  9,  8,  4,  3,  0,  6,  7,  9,  9,  5,  3,  2,  38, 44, 48, 51, 51, 48,
+    46, 38, 42, 46, 50, 51, 48, 44, 37, 41, 45, 47, 49, 44, 41, 34, 38, 41, 45,
+    47, 43, 36, 32, 34, 38, 42, 42, 38, 37, 28, 30, 33, 36, 41, 38, 37, 23, 26,
+    32, 35, 39, 40, 36, 37, 39, 45, 49, 49, 44, 41, 36, 39, 43, 47, 48, 44, 39,
+    34, 37, 42, 45, 44, 42, 36, 31, 36, 38, 41, 42, 38, 32, 27, 31, 35, 38, 36,
+    36, 31, 22, 28, 31, 33, 34, 35, 32, 18, 25, 29, 32, 33, 33, 32, 34, 36, 40,
+    41, 43, 41, 37, 31, 34, 39, 40, 40, 39, 34, 28, 35, 37, 37, 37, 37, 32, 23,
+    33, 34, 34, 34, 32, 27, 18, 28, 29, 30, 29, 28, 27, 13, 24, 26, 26, 27, 27,
+    27, 11, 21, 24, 24, 25, 25, 25, 28, 32, 33, 34, 36, 35, 27, 23, 30, 31, 34,
+    33, 31, 25, 20, 28, 29, 30, 30, 28, 24, 16, 23, 26, 26, 26, 24, 23, 14, 17,
+    22, 22, 21, 19, 18, 12, 13, 17, 19, 18, 18, 15, 11, 9,  16, 16, 17, 17, 11,
+    15, 23, 25, 26, 27, 23, 27, 12, 20, 23, 25, 25, 21, 25, 12, 16, 21, 21, 21,
+    17, 20, 12, 11, 17, 17, 17, 12, 14, 10, 5,  13, 12, 11, 8,  11, 7,  4,  8,
+    8,  9,  7,  10, 7,  5,  5,  6,  7,  7,  9,  7,  14, 16, 17, 19, 22, 24, 8,
+    11, 15, 16, 18, 19, 20, 8,  7,  13, 13, 15, 15, 16, 7,  6,  9,  9,  11, 10,
+    9,  5,  4,  4,  4,  4,  7,  9,  5,  3,  3,  2,  3,  5,  8,  4,  2,  3,  3,
+    1,  5,  7,  8,  7,  9,  14, 18, 20, 21, 7,  7,  9,  12, 16, 17, 18, 7,  7,
+    9,  9,  12, 14, 14, 8,  6,  8,  5,  7,  9,  7,  5,  5,  6,  4,  2,  4,  8,
+    3,  3,  5,  4,  2,  4,  6,  0,  4,  5,  5,  3,  3,  5,  45, 50, 54, 59, 58,
+    56, 50, 44, 48, 52, 57, 58, 51, 48, 42, 46, 51, 55, 54, 52, 46, 41, 44, 46,
+    51, 53, 48, 41, 36, 41, 44, 47, 48, 45, 41, 32, 37, 40, 42, 45, 46, 42, 28,
+    33, 37, 42, 45, 46, 42, 42, 47, 50, 54, 54, 50, 46, 39, 44, 50, 53, 53, 49,
+    45, 39, 43, 48, 51, 50, 46, 41, 35, 41, 45, 47, 46, 43, 36, 30, 37, 41, 43,
+    41, 40, 37, 24, 33, 38, 38, 40, 40, 37, 19, 31, 35, 38, 39, 38, 36, 38, 43,
+    46, 46, 48, 45, 41, 34, 41, 46, 46, 47, 44, 38, 31, 41, 42, 44, 43, 40, 36,
+    27, 38, 39, 40, 38, 37, 32, 21, 33, 35, 35, 34, 32, 31, 16, 26, 32, 31, 32,
+    30, 32, 15, 24, 29, 31, 31, 30, 29, 31, 38, 40, 39, 40, 39, 32, 27, 35, 37,
+    39, 38, 35, 30, 24, 31, 37, 36, 35, 32, 29, 19, 27, 31, 32, 32, 27, 27, 17,
+    21, 28, 27, 26, 22, 22, 16, 15, 24, 23, 23, 21, 19, 15, 12, 21, 22, 22, 21,
+    15, 18, 28, 30, 31, 30, 27, 31, 15, 24, 29, 30, 29, 24, 30, 15, 19, 26, 27,
+    25, 19, 24, 15, 14, 22, 23, 21, 14, 19, 13, 8,  18, 18, 15, 10, 15, 11, 6,
+    12, 14, 13, 8,  12, 10, 7,  9,  12, 11, 8,  10, 11, 16, 21, 22, 22, 24, 29,
+    11, 12, 20, 20, 21, 22, 24, 11, 8,  17, 17, 18, 18, 18, 10, 7,  13, 13, 13,
+    12, 12, 8,  5,  7,  8,  6,  9,  10, 6,  5,  2,  3,  4,  7,  10, 5,  4,  2,
+    1,  4,  7,  9,  8,  8,  14, 18, 21, 23, 24, 8,  8,  12, 17, 20, 21, 21, 8,
+    8,  10, 14, 16, 16, 16, 9,  7,  6,  9,  12, 11, 9,  6,  5,  4,  4,  5,  6,
+    9,  4,  3,  3,  3,  3,  5,  8,  4,  0,  3,  3,  2,  5,  7,  49, 54, 57, 61,
+    61, 57, 54, 47, 52, 57, 60, 62, 56, 53, 46, 50, 55, 58, 58, 55, 50, 45, 49,
+    52, 55, 57, 52, 46, 40, 45, 49, 52, 53, 50, 46, 35, 41, 44, 47, 50, 50, 46,
+    31, 38, 43, 45, 50, 51, 45, 47, 49, 55, 59, 57, 54, 50, 44, 50, 55, 58, 57,
+    52, 46, 41, 47, 53, 55, 54, 51, 44, 39, 46, 50, 51, 50, 48, 40, 32, 41, 45,
+    47, 46, 45, 40, 27, 37, 41, 43, 44, 44, 41, 22, 34, 40, 44, 42, 41, 41, 41,
+    49, 50, 52, 52, 49, 43, 37, 46, 50, 50, 50, 47, 41, 33, 42, 47, 47, 47, 44,
+    38, 29, 41, 43, 44, 42, 41, 35, 23, 35, 39, 40, 37, 36, 35, 19, 29, 37, 36,
+    37, 34, 36, 18, 26, 35, 35, 34, 33, 32, 33, 40, 43, 45, 43, 41, 35, 30, 38,
+    41, 42, 42, 38, 34, 25, 35, 40, 40, 39, 33, 32, 22, 30, 36, 35, 35, 30, 30,
+    20, 23, 31, 32, 30, 24, 26, 18, 18, 28, 29, 28, 23, 23, 18, 14, 24, 27, 26,
+    23, 18, 21, 29, 34, 36, 33, 29, 34, 17, 26, 33, 34, 31, 25, 33, 17, 21, 30,
+    30, 28, 21, 27, 17, 16, 25, 27, 23, 15, 21, 15, 10, 20, 23, 18, 11, 17, 13,
+    9,  15, 19, 16, 10, 14, 13, 9,  11, 18, 15, 10, 12, 12, 17, 25, 24, 23, 26,
+    31, 12, 13, 23, 23, 22, 22, 26, 12, 9,  20, 20, 19, 19, 21, 12, 8,  14, 16,
+    14, 14, 14, 11, 6,  8,  11, 7,  9,  12, 9,  5,  4,  6,  5,  8,  11, 7,  5,
+    4,  5,  4,  7,  10, 9,  8,  17, 19, 22, 24, 26, 9,  8,  15, 19, 20, 21, 21,
+    9,  8,  11, 16, 16, 17, 17, 9,  7,  7,  13, 12, 12, 11, 6,  5,  4,  6,  6,
+    7,  10, 5,  4,  2,  2,  3,  7,  9,  4,  3,  0,  0,  3,  5,  8,  49, 53, 57,
+    61, 62, 59, 55, 48, 53, 57, 60, 61, 57, 52, 45, 51, 53, 58, 59, 56, 51, 44,
+    47, 52, 55, 57, 52, 46, 42, 45, 48, 51, 54, 49, 45, 35, 41, 45, 47, 50, 49,
+    45, 31, 38, 41, 46, 49, 50, 46, 46, 52, 55, 59, 57, 54, 50, 46, 50, 54, 57,
+    55, 53, 48, 41, 48, 52, 56, 53, 50, 44, 38, 46, 50, 52, 50, 47, 42, 31, 41,
+    46, 48, 45, 45, 40, 27, 37, 41, 43, 43, 43, 40, 22, 35, 40, 42, 43, 41, 41,
+    41, 48, 50, 51, 51, 49, 42, 36, 46, 48, 50, 49, 46, 41, 33, 43, 47, 48, 46,
+    45, 38, 30, 41, 44, 44, 44, 40, 35, 24, 34, 39, 40, 38, 36, 35, 19, 30, 36,
+    36, 36, 35, 35, 17, 24, 34, 35, 35, 33, 32, 33, 41, 43, 44, 44, 41, 35, 29,
+    38, 42, 43, 40, 38, 33, 26, 34, 40, 40, 39, 33, 31, 22, 30, 36, 36, 34, 29,
+    30, 20, 23, 31, 32, 30, 24, 26, 19, 18, 28, 29, 27, 23, 22, 17, 14, 24, 27,
+    27, 22, 18, 21, 31, 34, 35, 32, 29, 35, 17, 26, 33, 33, 30, 25, 33, 17, 21,
+    30, 30, 28, 21, 27, 17, 16, 25, 27, 24, 15, 22, 15, 11, 20, 22, 17, 11, 17,
+    14, 9,  15, 18, 16, 10, 14, 13, 9,  10, 17, 15, 9,  12, 13, 17, 25, 24, 23,
+    25, 31, 13, 13, 22, 23, 22, 23, 26, 13, 9,  20, 20, 18, 19, 21, 12, 8,  14,
+    16, 14, 13, 14, 10, 6,  8,  12, 7,  10, 12, 9,  5,  4,  7,  5,  8,  10, 7,
+    6,  4,  5,  5,  8,  10, 9,  8,  17, 19, 21, 24, 25, 9,  8,  15, 18, 20, 21,
+    22, 9,  8,  11, 17, 17, 17, 17, 9,  7,  6,  12, 12, 12, 11, 6,  5,  4,  6,
+    6,  7,  10, 5,  4,  2,  2,  4,  6,  9,  5,  3,  0,  0,  3,  5,  8,  43, 47,
+    51, 55, 55, 53, 49, 40, 45, 50, 53, 53, 50, 45, 39, 44, 47, 51, 52, 48, 43,
+    39, 42, 46, 47, 49, 46, 39, 35, 38, 41, 45, 46, 43, 39, 30, 34, 37, 40, 44,
+    43, 38, 27, 32, 36, 39, 42, 43, 40, 40, 43, 48, 51, 51, 47, 43, 39, 42, 47,
+    50, 50, 47, 41, 36, 41, 45, 47, 48, 44, 39, 33, 38, 42, 44, 44, 40, 34, 27,
+    36, 38, 42, 39, 38, 35, 22, 32, 35, 37, 36, 37, 34, 18, 29, 34, 37, 37, 35,
+    34, 36, 40, 43, 44, 45, 42, 37, 32, 38, 42, 44, 42, 41, 33, 28, 38, 40, 40,
+    40, 38, 33, 25, 35, 36, 36, 36, 34, 29, 19, 30, 33, 33, 32, 30, 29, 14, 26,
+    30, 29, 30, 28, 29, 13, 21, 29, 28, 29, 28, 26, 28, 36, 36, 37, 37, 35, 29,
+    24, 32, 35, 36, 35, 31, 27, 20, 30, 33, 33, 32, 28, 25, 17, 24, 29, 28, 28,
+    24, 24, 15, 18, 25, 26, 24, 19, 20, 14, 14, 23, 22, 22, 19, 17, 13, 10, 20,
+    21, 21, 18, 12, 16, 25, 28, 29, 26, 23, 28, 13, 21, 26, 27, 25, 19, 27, 13,
+    17, 24, 24, 22, 16, 21, 13, 12, 20, 19, 18, 11, 16, 11, 7,  16, 16, 13, 7,
+    12, 10, 5,  12, 13, 12, 6,  9,  9,  6,  8,  11, 10, 6,  8,  8,  14, 19, 19,
+    18, 20, 24, 8,  10, 17, 18, 17, 17, 20, 8,  6,  14, 14, 14, 14, 15, 8,  5,
+    11, 11, 10, 10, 10, 6,  3,  5,  6,  4,  6,  8,  4,  3,  2,  2,  3,  5,  7,
+    4,  3,  2,  1,  3,  4,  6,  6,  6,  13, 15, 17, 19, 20, 6,  6,  12, 14, 16,
+    16, 17, 6,  6,  9,  12, 12, 12, 13, 6,  5,  5,  8,  8,  8,  7,  4,  3,  3,
+    2,  3,  4,  6,  3,  2,  3,  2,  2,  4,  5,  3,  2,  3,  3,  0,  4,  5,  36,
+    40, 45, 47, 47, 44, 40, 34, 38, 42, 46, 46, 43, 38, 32, 36, 41, 44, 45, 42,
+    36, 31, 34, 38, 40, 43, 39, 33, 29, 32, 33, 37, 39, 36, 32, 25, 27, 31, 33,
+    37, 36, 33, 23, 26, 29, 33, 36, 37, 33, 33, 36, 41, 45, 43, 40, 35, 31, 35,
+    39, 44, 43, 39, 35, 30, 33, 38, 41, 39, 36, 32, 29, 31, 34, 37, 37, 35, 29,
+    24, 29, 31, 34, 32, 32, 29, 19, 26, 28, 31, 30, 32, 28, 15, 24, 27, 30, 30,
+    29, 28, 31, 34, 36, 37, 37, 36, 30, 28, 32, 34, 36, 36, 35, 28, 25, 31, 34,
+    34, 34, 31, 25, 20, 29, 29, 29, 30, 28, 23, 15, 24, 26, 26, 25, 24, 23, 11,
+    21, 23, 23, 24, 23, 23, 10, 19, 24, 23, 22, 23, 20, 25, 29, 28, 30, 30, 29,
+    23, 20, 27, 28, 29, 29, 26, 21, 17, 24, 27, 26, 26, 22, 19, 14, 20, 23, 22,
+    22, 19, 18, 11, 15, 19, 19, 18, 14, 15, 11, 11, 17, 16, 16, 14, 11, 10, 7,
+    16, 15, 15, 14, 8,  12, 20, 21, 22, 21, 18, 22, 9,  17, 20, 20, 20, 15, 21,
+    9,  14, 18, 17, 17, 12, 15, 9,  8,  15, 14, 13, 7,  10, 7,  3,  10, 10, 9,
+    5,  7,  6,  3,  8,  7,  7,  4,  5,  6,  4,  5,  6,  5,  4,  5,  5,  11, 12,
+    13, 14, 16, 19, 5,  8,  11, 12, 13, 13, 15, 5,  5,  10, 9,  10, 10, 10, 5,
+    3,  7,  6,  6,  6,  5,  3,  2,  1,  1,  2,  4,  4,  2,  2,  4,  3,  0,  3,
+    5,  3,  2,  4,  4,  2,  2,  4,  5,  5,  9,  11, 13, 15, 15, 5,  5,  8,  10,
+    12, 12, 12, 5,  5,  7,  8,  8,  9,  9,  5,  4,  4,  4,  4,  5,  4,  3,  2,
+    4,  4,  1,  2,  4,  1,  4,  5,  5,  3,  2,  3,  2,  5,  5,  5,  3,  0,  3,
+    29, 34, 38, 41, 41, 39, 34, 28, 31, 36, 40, 40, 37, 33, 27, 31, 34, 38, 39,
+    36, 30, 26, 28, 31, 34, 37, 32, 27, 23, 25, 27, 31, 33, 31, 27, 20, 22, 25,
+    28, 33, 31, 27, 19, 21, 23, 27, 30, 30, 28, 27, 30, 34, 38, 38, 34, 31, 26,
+    29, 32, 37, 36, 34, 29, 25, 27, 32, 35, 33, 31, 26, 23, 25, 28, 31, 30, 28,
+    23, 20, 23, 25, 28, 27, 26, 22, 17, 20, 23, 25, 25, 25, 23, 14, 19, 22, 24,
+    24, 24, 24, 25, 28, 29, 31, 32, 30, 26, 23, 27, 28, 29, 30, 27, 23, 22, 25,
+    28, 27, 27, 26, 21, 18, 23, 24, 23, 23, 23, 17, 12, 20, 20, 19, 20, 18, 17,
+    8,  19, 19, 18, 18, 18, 17, 8,  16, 18, 17, 17, 18, 15, 21, 23, 23, 23, 25,
+    24, 17, 18, 21, 22, 22, 22, 22, 15, 14, 20, 20, 19, 20, 18, 14, 10, 17, 17,
+    16, 16, 15, 13, 8,  13, 13, 12, 12, 11, 10, 8,  9,  12, 11, 10, 10, 7,  8,
+    6,  10, 9,  9,  9,  4,  9,  15, 15, 16, 17, 14, 17, 6,  13, 13, 14, 14, 11,
+    15, 6,  11, 11, 11, 11, 8,  10, 6,  6,  8,  8,  7,  5,  6,  4,  2,  4,  4,
+    3,  3,  4,  3,  2,  2,  2,  2,  3,  4,  4,  2,  3,  2,  1,  2,  3,  3,  7,
+    8,  9,  10, 12, 14, 3,  6,  8,  9,  9,  10, 10, 3,  4,  6,  6,  6,  7,  7,
+    3,  3,  3,  3,  3,  4,  3,  1,  3,  5,  3,  2,  2,  3,  1,  4,  6,  4,  3,
+    0,  3,  2,  5,  6,  5,  3,  2,  2,  4,  6,  6,  8,  9,  11, 12, 4,  6,  6,
+    7,  8,  9,  9,  4,  6,  6,  5,  5,  5,  6,  4,  4,  6,  3,  2,  2,  3,  2,
+    5,  7,  6,  3,  2,  2,  4,  6,  8,  7,  4,  3,  2,  5,  7,  8,  8,  5,  3,
+    0,
+};

+ 27 - 0
webp.mod/libwebp/sharpyuv/sharpyuv_risk_table.h

@@ -0,0 +1,27 @@
+// Copyright 2023 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Precomputed data for 420 risk estimation.
+
+#ifndef WEBP_SHARPYUV_SHARPYUV_RISK_TABLE_H_
+#define WEBP_SHARPYUV_SHARPYUV_RISK_TABLE_H_
+
+#include "src/webp/types.h"
+
+extern const int kSharpYuvPrecomputedRiskYuvSampling;
+// Table of precomputed risk scores when chroma subsampling images with two
+// given colors.
+// Since precomputing values for all possible YUV colors would create a huge
+// table, the YUV space (i.e. [0, 255]^3) is reduced to
+// [0, kSharpYuvPrecomputedRiskYuvSampling-1]^3
+// where 255 maps to kSharpYuvPrecomputedRiskYuvSampling-1.
+// Table size: kSharpYuvPrecomputedRiskYuvSampling^6 bytes or 114 KiB
+extern const uint8_t kSharpYuvPrecomputedRisk[];
+
+#endif  // WEBP_SHARPYUV_SHARPYUV_RISK_TABLE_H_

+ 34 - 27
webp.mod/libwebp/src/dec/alpha_dec.c

@@ -13,18 +13,20 @@
 
 #include <stdlib.h>
 #include "src/dec/alphai_dec.h"
+#include "src/dec/vp8_dec.h"
 #include "src/dec/vp8i_dec.h"
 #include "src/dec/vp8li_dec.h"
 #include "src/dsp/dsp.h"
 #include "src/utils/quant_levels_dec_utils.h"
 #include "src/utils/utils.h"
 #include "src/webp/format_constants.h"
+#include "src/webp/types.h"
 
 //------------------------------------------------------------------------------
 // ALPHDecoder object.
 
 // Allocates a new alpha decoder instance.
-static ALPHDecoder* ALPHNew(void) {
+WEBP_NODISCARD static ALPHDecoder* ALPHNew(void) {
   ALPHDecoder* const dec = (ALPHDecoder*)WebPSafeCalloc(1ULL, sizeof(*dec));
   return dec;
 }
@@ -45,9 +47,9 @@ static void ALPHDelete(ALPHDecoder* const dec) {
 // header for alpha data stored using lossless compression.
 // Returns false in case of error in alpha header (data too short, invalid
 // compression method or filter, error in lossless header data etc).
-static int ALPHInit(ALPHDecoder* const dec, const uint8_t* data,
-                    size_t data_size, const VP8Io* const src_io,
-                    uint8_t* output) {
+WEBP_NODISCARD static int ALPHInit(ALPHDecoder* const dec, const uint8_t* data,
+                                   size_t data_size, const VP8Io* const src_io,
+                                   uint8_t* output) {
   int ok = 0;
   const uint8_t* const alpha_data = data + ALPHA_HEADER_LEN;
   const size_t alpha_data_size = data_size - ALPHA_HEADER_LEN;
@@ -79,7 +81,9 @@ static int ALPHInit(ALPHDecoder* const dec, const uint8_t* data,
   }
 
   // Copy the necessary parameters from src_io to io
-  VP8InitIo(io);
+  if (!VP8InitIo(io)) {
+    return 0;
+  }
   WebPInitCustomIo(NULL, io);
   io->opaque = dec;
   io->width = src_io->width;
@@ -107,7 +111,8 @@ static int ALPHInit(ALPHDecoder* const dec, const uint8_t* data,
 // starting from row number 'row'. It assumes that rows up to (row - 1) have
 // already been decoded.
 // Returns false in case of bitstream error.
-static int ALPHDecode(VP8Decoder* const dec, int row, int num_rows) {
+WEBP_NODISCARD static int ALPHDecode(VP8Decoder* const dec, int row,
+                                     int num_rows) {
   ALPHDecoder* const alph_dec = dec->alph_dec_;
   const int width = alph_dec->width_;
   const int height = alph_dec->io_.crop_bottom;
@@ -117,21 +122,12 @@ static int ALPHDecode(VP8Decoder* const dec, int row, int num_rows) {
     const uint8_t* deltas = dec->alpha_data_ + ALPHA_HEADER_LEN + row * width;
     uint8_t* dst = dec->alpha_plane_ + row * width;
     assert(deltas <= &dec->alpha_data_[dec->alpha_data_size_]);
-    if (alph_dec->filter_ != WEBP_FILTER_NONE) {
-      assert(WebPUnfilters[alph_dec->filter_] != NULL);
-      for (y = 0; y < num_rows; ++y) {
-        WebPUnfilters[alph_dec->filter_](prev_line, deltas, dst, width);
-        prev_line = dst;
-        dst += width;
-        deltas += width;
-      }
-    } else {
-      for (y = 0; y < num_rows; ++y) {
-        memcpy(dst, deltas, width * sizeof(*dst));
-        prev_line = dst;
-        dst += width;
-        deltas += width;
-      }
+    assert(WebPUnfilters[alph_dec->filter_] != NULL);
+    for (y = 0; y < num_rows; ++y) {
+      WebPUnfilters[alph_dec->filter_](prev_line, deltas, dst, width);
+      prev_line = dst;
+      dst += width;
+      deltas += width;
     }
     dec->alpha_prev_line_ = prev_line;
   } else {  // alph_dec->method_ == ALPHA_LOSSLESS_COMPRESSION
@@ -147,7 +143,8 @@ static int ALPHDecode(VP8Decoder* const dec, int row, int num_rows) {
   return 1;
 }
 
-static int AllocateAlphaPlane(VP8Decoder* const dec, const VP8Io* const io) {
+WEBP_NODISCARD static int AllocateAlphaPlane(VP8Decoder* const dec,
+                                             const VP8Io* const io) {
   const int stride = io->width;
   const int height = io->crop_bottom;
   const uint64_t alpha_size = (uint64_t)stride * height;
@@ -155,7 +152,8 @@ static int AllocateAlphaPlane(VP8Decoder* const dec, const VP8Io* const io) {
   dec->alpha_plane_mem_ =
       (uint8_t*)WebPSafeMalloc(alpha_size, sizeof(*dec->alpha_plane_));
   if (dec->alpha_plane_mem_ == NULL) {
-    return 0;
+    return VP8SetError(dec, VP8_STATUS_OUT_OF_MEMORY,
+                       "Alpha decoder initialization failed.");
   }
   dec->alpha_plane_ = dec->alpha_plane_mem_;
   dec->alpha_prev_line_ = NULL;
@@ -174,9 +172,9 @@ void WebPDeallocateAlphaMemory(VP8Decoder* const dec) {
 //------------------------------------------------------------------------------
 // Main entry point.
 
-const uint8_t* VP8DecompressAlphaRows(VP8Decoder* const dec,
-                                      const VP8Io* const io,
-                                      int row, int num_rows) {
+WEBP_NODISCARD const uint8_t* VP8DecompressAlphaRows(VP8Decoder* const dec,
+                                                     const VP8Io* const io,
+                                                     int row, int num_rows) {
   const int width = io->width;
   const int height = io->crop_bottom;
 
@@ -189,10 +187,19 @@ const uint8_t* VP8DecompressAlphaRows(VP8Decoder* const dec,
   if (!dec->is_alpha_decoded_) {
     if (dec->alph_dec_ == NULL) {    // Initialize decoder.
       dec->alph_dec_ = ALPHNew();
-      if (dec->alph_dec_ == NULL) return NULL;
+      if (dec->alph_dec_ == NULL) {
+        VP8SetError(dec, VP8_STATUS_OUT_OF_MEMORY,
+                    "Alpha decoder initialization failed.");
+        return NULL;
+      }
       if (!AllocateAlphaPlane(dec, io)) goto Error;
       if (!ALPHInit(dec->alph_dec_, dec->alpha_data_, dec->alpha_data_size_,
                     io, dec->alpha_plane_)) {
+        VP8LDecoder* const vp8l_dec = dec->alph_dec_->vp8l_dec_;
+        VP8SetError(dec,
+                    (vp8l_dec == NULL) ? VP8_STATUS_OUT_OF_MEMORY
+                                       : vp8l_dec->status_,
+                    "Alpha decoder initialization failed.");
         goto Error;
       }
       // if we allowed use of alpha dithering, check whether it's needed at all

+ 1 - 1
webp.mod/libwebp/src/dec/buffer_dec.c

@@ -75,7 +75,7 @@ static VP8StatusCode CheckDecBuffer(const WebPDecBuffer* const buffer) {
     const WebPRGBABuffer* const buf = &buffer->u.RGBA;
     const int stride = abs(buf->stride);
     const uint64_t size =
-        MIN_BUFFER_SIZE(width * kModeBpp[mode], height, stride);
+        MIN_BUFFER_SIZE((uint64_t)width * kModeBpp[mode], height, stride);
     ok &= (size <= buf->size);
     ok &= (stride >= width * kModeBpp[mode]);
     ok &= (buf->rgba != NULL);

+ 31 - 19
webp.mod/libwebp/src/dec/idec_dec.c

@@ -17,8 +17,10 @@
 
 #include "src/dec/alphai_dec.h"
 #include "src/dec/webpi_dec.h"
+#include "src/dec/vp8_dec.h"
 #include "src/dec/vp8i_dec.h"
 #include "src/utils/utils.h"
+#include "src/webp/decode.h"
 
 // In append mode, buffer allocations increase as multiples of this value.
 // Needs to be a power of 2.
@@ -161,8 +163,9 @@ static void DoRemap(WebPIDecoder* const idec, ptrdiff_t offset) {
 
 // Appends data to the end of MemBuffer->buf_. It expands the allocated memory
 // size if required and also updates VP8BitReader's if new memory is allocated.
-static int AppendToMemBuffer(WebPIDecoder* const idec,
-                             const uint8_t* const data, size_t data_size) {
+WEBP_NODISCARD static int AppendToMemBuffer(WebPIDecoder* const idec,
+                                            const uint8_t* const data,
+                                            size_t data_size) {
   VP8Decoder* const dec = (VP8Decoder*)idec->dec_;
   MemBuffer* const mem = &idec->mem_;
   const int need_compressed_alpha = NeedCompressedAlpha(idec);
@@ -203,8 +206,9 @@ static int AppendToMemBuffer(WebPIDecoder* const idec,
   return 1;
 }
 
-static int RemapMemBuffer(WebPIDecoder* const idec,
-                          const uint8_t* const data, size_t data_size) {
+WEBP_NODISCARD static int RemapMemBuffer(WebPIDecoder* const idec,
+                                         const uint8_t* const data,
+                                         size_t data_size) {
   MemBuffer* const mem = &idec->mem_;
   const uint8_t* const old_buf = mem->buf_;
   const uint8_t* const old_start =
@@ -237,7 +241,8 @@ static void ClearMemBuffer(MemBuffer* const mem) {
   }
 }
 
-static int CheckMemBufferMode(MemBuffer* const mem, MemBufferMode expected) {
+WEBP_NODISCARD static int CheckMemBufferMode(MemBuffer* const mem,
+                                             MemBufferMode expected) {
   if (mem->mode_ == MEM_MODE_NONE) {
     mem->mode_ = expected;    // switch to the expected mode
   } else if (mem->mode_ != expected) {
@@ -248,7 +253,7 @@ static int CheckMemBufferMode(MemBuffer* const mem, MemBufferMode expected) {
 }
 
 // To be called last.
-static VP8StatusCode FinishDecoding(WebPIDecoder* const idec) {
+WEBP_NODISCARD static VP8StatusCode FinishDecoding(WebPIDecoder* const idec) {
   const WebPDecoderOptions* const options = idec->params_.options;
   WebPDecBuffer* const output = idec->params_.output;
 
@@ -258,8 +263,10 @@ static VP8StatusCode FinishDecoding(WebPIDecoder* const idec) {
     if (status != VP8_STATUS_OK) return status;
   }
   if (idec->final_output_ != NULL) {
-    WebPCopyDecBufferPixels(output, idec->final_output_);  // do the slow-copy
+    const VP8StatusCode status = WebPCopyDecBufferPixels(
+        output, idec->final_output_);  // do the slow-copy
     WebPFreeDecBuffer(&idec->output_);
+    if (status != VP8_STATUS_OK) return status;
     *output = *idec->final_output_;
     idec->final_output_ = NULL;
   }
@@ -288,7 +295,7 @@ static void RestoreContext(const MBContext* context, VP8Decoder* const dec,
 static VP8StatusCode IDecError(WebPIDecoder* const idec, VP8StatusCode error) {
   if (idec->state_ == STATE_VP8_DATA) {
     // Synchronize the thread, clean-up and check for errors.
-    VP8ExitCritical((VP8Decoder*)idec->dec_, &idec->io_);
+    (void)VP8ExitCritical((VP8Decoder*)idec->dec_, &idec->io_);
   }
   idec->state_ = STATE_ERROR;
   return error;
@@ -329,6 +336,7 @@ static VP8StatusCode DecodeWebPHeaders(WebPIDecoder* const idec) {
     if (dec == NULL) {
       return VP8_STATUS_OUT_OF_MEMORY;
     }
+    dec->incremental_ = 1;
     idec->dec_ = dec;
     dec->alpha_data_ = headers.alpha_data;
     dec->alpha_data_size_ = headers.alpha_data_size;
@@ -601,8 +609,9 @@ static VP8StatusCode IDecode(WebPIDecoder* idec) {
 //------------------------------------------------------------------------------
 // Internal constructor
 
-static WebPIDecoder* NewDecoder(WebPDecBuffer* const output_buffer,
-                                const WebPBitstreamFeatures* const features) {
+WEBP_NODISCARD static WebPIDecoder* NewDecoder(
+    WebPDecBuffer* const output_buffer,
+    const WebPBitstreamFeatures* const features) {
   WebPIDecoder* idec = (WebPIDecoder*)WebPSafeCalloc(1ULL, sizeof(*idec));
   if (idec == NULL) {
     return NULL;
@@ -614,8 +623,10 @@ static WebPIDecoder* NewDecoder(WebPDecBuffer* const output_buffer,
   idec->last_mb_y_ = -1;
 
   InitMemBuffer(&idec->mem_);
-  WebPInitDecBuffer(&idec->output_);
-  VP8InitIo(&idec->io_);
+  if (!WebPInitDecBuffer(&idec->output_) || !VP8InitIo(&idec->io_)) {
+    WebPSafeFree(idec);
+    return NULL;
+  }
 
   WebPResetDecParams(&idec->params_);
   if (output_buffer == NULL || WebPAvoidSlowMemory(output_buffer, features)) {
@@ -674,7 +685,8 @@ void WebPIDelete(WebPIDecoder* idec) {
     if (!idec->is_lossless_) {
       if (idec->state_ == STATE_VP8_DATA) {
         // Synchronize the thread, clean-up and check for errors.
-        VP8ExitCritical((VP8Decoder*)idec->dec_, &idec->io_);
+        // TODO(vrabaud) do we care about the return result?
+        (void)VP8ExitCritical((VP8Decoder*)idec->dec_, &idec->io_);
       }
       VP8Delete((VP8Decoder*)idec->dec_);
     } else {
@@ -851,8 +863,8 @@ const WebPDecBuffer* WebPIDecodedArea(const WebPIDecoder* idec,
   return src;
 }
 
-uint8_t* WebPIDecGetRGB(const WebPIDecoder* idec, int* last_y,
-                        int* width, int* height, int* stride) {
+WEBP_NODISCARD uint8_t* WebPIDecGetRGB(const WebPIDecoder* idec, int* last_y,
+                                       int* width, int* height, int* stride) {
   const WebPDecBuffer* const src = GetOutputBuffer(idec);
   if (src == NULL) return NULL;
   if (src->colorspace >= MODE_YUV) {
@@ -867,10 +879,10 @@ uint8_t* WebPIDecGetRGB(const WebPIDecoder* idec, int* last_y,
   return src->u.RGBA.rgba;
 }
 
-uint8_t* WebPIDecGetYUVA(const WebPIDecoder* idec, int* last_y,
-                         uint8_t** u, uint8_t** v, uint8_t** a,
-                         int* width, int* height,
-                         int* stride, int* uv_stride, int* a_stride) {
+WEBP_NODISCARD uint8_t* WebPIDecGetYUVA(const WebPIDecoder* idec, int* last_y,
+                                        uint8_t** u, uint8_t** v, uint8_t** a,
+                                        int* width, int* height, int* stride,
+                                        int* uv_stride, int* a_stride) {
   const WebPDecBuffer* const src = GetOutputBuffer(idec);
   if (src == NULL) return NULL;
   if (src->colorspace < MODE_YUV) {

+ 12 - 8
webp.mod/libwebp/src/dec/vp8_dec.c

@@ -86,6 +86,8 @@ void VP8Delete(VP8Decoder* const dec) {
 
 int VP8SetError(VP8Decoder* const dec,
                 VP8StatusCode error, const char* const msg) {
+  // VP8_STATUS_SUSPENDED is only meaningful in incremental decoding.
+  assert(dec->incremental_ || error != VP8_STATUS_SUSPENDED);
   // The oldest error reported takes precedence over the new one.
   if (dec->status_ == VP8_STATUS_OK) {
     dec->status_ = error;
@@ -190,12 +192,12 @@ static int ParseSegmentHeader(VP8BitReader* br,
 }
 
 // Paragraph 9.5
-// This function returns VP8_STATUS_SUSPENDED if we don't have all the
-// necessary data in 'buf'.
-// This case is not necessarily an error (for incremental decoding).
-// Still, no bitreader is ever initialized to make it possible to read
-// unavailable memory.
-// If we don't even have the partitions' sizes, than VP8_STATUS_NOT_ENOUGH_DATA
+// If we don't have all the necessary data in 'buf', this function returns
+// VP8_STATUS_SUSPENDED in incremental decoding, VP8_STATUS_NOT_ENOUGH_DATA
+// otherwise.
+// In incremental decoding, this case is not necessarily an error. Still, no
+// bitreader is ever initialized to make it possible to read unavailable memory.
+// If we don't even have the partitions' sizes, then VP8_STATUS_NOT_ENOUGH_DATA
 // is returned, and this is an unrecoverable error.
 // If the partitions were positioned ok, VP8_STATUS_OK is returned.
 static VP8StatusCode ParsePartitions(VP8Decoder* const dec,
@@ -225,8 +227,10 @@ static VP8StatusCode ParsePartitions(VP8Decoder* const dec,
     sz += 3;
   }
   VP8InitBitReader(dec->parts_ + last_part, part_start, size_left);
-  return (part_start < buf_end) ? VP8_STATUS_OK :
-           VP8_STATUS_SUSPENDED;   // Init is ok, but there's not enough data
+  if (part_start < buf_end) return VP8_STATUS_OK;
+  return dec->incremental_
+             ? VP8_STATUS_SUSPENDED  // Init is ok, but there's not enough data
+             : VP8_STATUS_NOT_ENOUGH_DATA;
 }
 
 // Paragraph 9.4

+ 8 - 9
webp.mod/libwebp/src/dec/vp8_dec.h

@@ -15,6 +15,7 @@
 #define WEBP_DEC_VP8_DEC_H_
 
 #include "src/webp/decode.h"
+#include "src/webp/types.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -108,16 +109,14 @@ struct VP8Io {
 };
 
 // Internal, version-checked, entry point
-int VP8InitIoInternal(VP8Io* const, int);
+WEBP_NODISCARD int VP8InitIoInternal(VP8Io* const, int);
 
 // Set the custom IO function pointers and user-data. The setter for IO hooks
 // should be called before initiating incremental decoding. Returns true if
 // WebPIDecoder object is successfully modified, false otherwise.
-int WebPISetIOHooks(WebPIDecoder* const idec,
-                    VP8IoPutHook put,
-                    VP8IoSetupHook setup,
-                    VP8IoTeardownHook teardown,
-                    void* user_data);
+WEBP_NODISCARD int WebPISetIOHooks(WebPIDecoder* const idec, VP8IoPutHook put,
+                                   VP8IoSetupHook setup,
+                                   VP8IoTeardownHook teardown, void* user_data);
 
 // Main decoding object. This is an opaque structure.
 typedef struct VP8Decoder VP8Decoder;
@@ -128,17 +127,17 @@ VP8Decoder* VP8New(void);
 // Must be called to make sure 'io' is initialized properly.
 // Returns false in case of version mismatch. Upon such failure, no other
 // decoding function should be called (VP8Decode, VP8GetHeaders, ...)
-static WEBP_INLINE int VP8InitIo(VP8Io* const io) {
+WEBP_NODISCARD static WEBP_INLINE int VP8InitIo(VP8Io* const io) {
   return VP8InitIoInternal(io, WEBP_DECODER_ABI_VERSION);
 }
 
 // Decode the VP8 frame header. Returns true if ok.
 // Note: 'io->data' must be pointing to the start of the VP8 frame header.
-int VP8GetHeaders(VP8Decoder* const dec, VP8Io* const io);
+WEBP_NODISCARD int VP8GetHeaders(VP8Decoder* const dec, VP8Io* const io);
 
 // Decode a picture. Will call VP8GetHeaders() if it wasn't done already.
 // Returns false in case of error.
-int VP8Decode(VP8Decoder* const dec, VP8Io* const io);
+WEBP_NODISCARD int VP8Decode(VP8Decoder* const dec, VP8Io* const io);
 
 // Return current status of the decoder:
 VP8StatusCode VP8Status(VP8Decoder* const dec);

+ 7 - 4
webp.mod/libwebp/src/dec/vp8i_dec.h

@@ -21,6 +21,7 @@
 #include "src/utils/random_utils.h"
 #include "src/utils/thread_utils.h"
 #include "src/dsp/dsp.h"
+#include "src/webp/types.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -186,6 +187,7 @@ struct VP8Decoder {
 
   // Main data source
   VP8BitReader br_;
+  int incremental_;  // if true, incremental decoding is expected
 
   // headers
   VP8FrameHeader   frm_hdr_;
@@ -281,7 +283,7 @@ int VP8ParseIntraModeRow(VP8BitReader* const br, VP8Decoder* const dec);
 void VP8ParseQuant(VP8Decoder* const dec);
 
 // in frame.c
-int VP8InitFrame(VP8Decoder* const dec, VP8Io* const io);
+WEBP_NODISCARD int VP8InitFrame(VP8Decoder* const dec, VP8Io* const io);
 // Call io->setup() and finish setting up scan parameters.
 // After this call returns, one must always call VP8ExitCritical() with the
 // same parameters. Both functions should be used in pair. Returns VP8_STATUS_OK
@@ -289,7 +291,7 @@ int VP8InitFrame(VP8Decoder* const dec, VP8Io* const io);
 VP8StatusCode VP8EnterCritical(VP8Decoder* const dec, VP8Io* const io);
 // Must always be called in pair with VP8EnterCritical().
 // Returns false in case of error.
-int VP8ExitCritical(VP8Decoder* const dec, VP8Io* const io);
+WEBP_NODISCARD int VP8ExitCritical(VP8Decoder* const dec, VP8Io* const io);
 // Return the multi-threading method to use (0=off), depending
 // on options and bitstream size. Only for lossy decoding.
 int VP8GetThreadMethod(const WebPDecoderOptions* const options,
@@ -299,11 +301,12 @@ int VP8GetThreadMethod(const WebPDecoderOptions* const options,
 void VP8InitDithering(const WebPDecoderOptions* const options,
                       VP8Decoder* const dec);
 // Process the last decoded row (filtering + output).
-int VP8ProcessRow(VP8Decoder* const dec, VP8Io* const io);
+WEBP_NODISCARD int VP8ProcessRow(VP8Decoder* const dec, VP8Io* const io);
 // To be called at the start of a new scanline, to initialize predictors.
 void VP8InitScanline(VP8Decoder* const dec);
 // Decode one macroblock. Returns false if there is not enough data.
-int VP8DecodeMB(VP8Decoder* const dec, VP8BitReader* const token_br);
+WEBP_NODISCARD int VP8DecodeMB(VP8Decoder* const dec,
+                               VP8BitReader* const token_br);
 
 // in alpha.c
 const uint8_t* VP8DecompressAlphaRows(VP8Decoder* const dec,

+ 100 - 68
webp.mod/libwebp/src/dec/vp8l_dec.c

@@ -12,6 +12,7 @@
 // Authors: Vikas Arora ([email protected])
 //          Jyrki Alakuijala ([email protected])
 
+#include <assert.h>
 #include <stdlib.h>
 
 #include "src/dec/alphai_dec.h"
@@ -101,6 +102,14 @@ static const uint16_t kTableSize[12] = {
   FIXED_TABLE_SIZE + 2704
 };
 
+static int VP8LSetError(VP8LDecoder* const dec, VP8StatusCode error) {
+  // The oldest error reported takes precedence over the new one.
+  if (dec->status_ == VP8_STATUS_OK || dec->status_ == VP8_STATUS_SUSPENDED) {
+    dec->status_ = error;
+  }
+  return 0;
+}
+
 static int DecodeImageStream(int xsize, int ysize,
                              int is_level0,
                              VP8LDecoder* const dec,
@@ -301,7 +310,7 @@ static int ReadHuffmanCodeLengths(
 
  End:
   VP8LHuffmanTablesDeallocate(&tables);
-  if (!ok) dec->status_ = VP8_STATUS_BITSTREAM_ERROR;
+  if (!ok) return VP8LSetError(dec, VP8_STATUS_BITSTREAM_ERROR);
   return ok;
 }
 
@@ -333,10 +342,7 @@ static int ReadHuffmanCode(int alphabet_size, VP8LDecoder* const dec,
     int i;
     int code_length_code_lengths[NUM_CODE_LENGTH_CODES] = { 0 };
     const int num_codes = VP8LReadBits(br, 4) + 4;
-    if (num_codes > NUM_CODE_LENGTH_CODES) {
-      dec->status_ = VP8_STATUS_BITSTREAM_ERROR;
-      return 0;
-    }
+    assert(num_codes <= NUM_CODE_LENGTH_CODES);
 
     for (i = 0; i < num_codes; ++i) {
       code_length_code_lengths[kCodeLengthCodeOrder[i]] = VP8LReadBits(br, 3);
@@ -351,15 +357,14 @@ static int ReadHuffmanCode(int alphabet_size, VP8LDecoder* const dec,
                                  code_lengths, alphabet_size);
   }
   if (!ok || size == 0) {
-    dec->status_ = VP8_STATUS_BITSTREAM_ERROR;
-    return 0;
+    return VP8LSetError(dec, VP8_STATUS_BITSTREAM_ERROR);
   }
   return size;
 }
 
 static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
                             int color_cache_bits, int allow_recursion) {
-  int i, j;
+  int i;
   VP8LBitReader* const br = &dec->br_;
   VP8LMetadata* const hdr = &dec->hdr_;
   uint32_t* huffman_image = NULL;
@@ -367,9 +372,6 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
   HuffmanTables* huffman_tables = &hdr->huffman_tables_;
   int num_htree_groups = 1;
   int num_htree_groups_max = 1;
-  int max_alphabet_size = 0;
-  int* code_lengths = NULL;
-  const int table_size = kTableSize[color_cache_bits];
   int* mapping = NULL;
   int ok = 0;
 
@@ -383,7 +385,7 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
     const int huffman_xsize = VP8LSubSampleSize(xsize, huffman_precision);
     const int huffman_ysize = VP8LSubSampleSize(ysize, huffman_precision);
     const int huffman_pixs = huffman_xsize * huffman_ysize;
-    if (!DecodeImageStream(huffman_xsize, huffman_ysize, 0, dec,
+    if (!DecodeImageStream(huffman_xsize, huffman_ysize, /*is_level0=*/0, dec,
                            &huffman_image)) {
       goto Error;
     }
@@ -407,7 +409,7 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
       // values [0, num_htree_groups)
       mapping = (int*)WebPSafeMalloc(num_htree_groups_max, sizeof(*mapping));
       if (mapping == NULL) {
-        dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
+        VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY);
         goto Error;
       }
       // -1 means a value is unmapped, and therefore unused in the Huffman
@@ -426,25 +428,52 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
 
   if (br->eos_) goto Error;
 
-  // Find maximum alphabet size for the htree group.
-  for (j = 0; j < HUFFMAN_CODES_PER_META_CODE; ++j) {
-    int alphabet_size = kAlphabetSize[j];
-    if (j == 0 && color_cache_bits > 0) {
-      alphabet_size += 1 << color_cache_bits;
-    }
-    if (max_alphabet_size < alphabet_size) {
-      max_alphabet_size = alphabet_size;
-    }
+  if (!ReadHuffmanCodesHelper(color_cache_bits, num_htree_groups,
+                              num_htree_groups_max, mapping, dec,
+                              huffman_tables, &htree_groups)) {
+    goto Error;
   }
+  ok = 1;
 
-  code_lengths = (int*)WebPSafeCalloc((uint64_t)max_alphabet_size,
-                                      sizeof(*code_lengths));
-  htree_groups = VP8LHtreeGroupsNew(num_htree_groups);
+  // All OK. Finalize pointers.
+  hdr->huffman_image_ = huffman_image;
+  hdr->num_htree_groups_ = num_htree_groups;
+  hdr->htree_groups_ = htree_groups;
 
-  if (htree_groups == NULL || code_lengths == NULL ||
+ Error:
+  WebPSafeFree(mapping);
+  if (!ok) {
+    WebPSafeFree(huffman_image);
+    VP8LHuffmanTablesDeallocate(huffman_tables);
+    VP8LHtreeGroupsFree(htree_groups);
+  }
+  return ok;
+}
+
+int ReadHuffmanCodesHelper(int color_cache_bits, int num_htree_groups,
+                           int num_htree_groups_max, const int* const mapping,
+                           VP8LDecoder* const dec,
+                           HuffmanTables* const huffman_tables,
+                           HTreeGroup** const htree_groups) {
+  int i, j, ok = 0;
+  const int max_alphabet_size =
+      kAlphabetSize[0] + ((color_cache_bits > 0) ? 1 << color_cache_bits : 0);
+  const int table_size = kTableSize[color_cache_bits];
+  int* code_lengths = NULL;
+
+  if ((mapping == NULL && num_htree_groups != num_htree_groups_max) ||
+      num_htree_groups > num_htree_groups_max) {
+    goto Error;
+  }
+
+  code_lengths =
+      (int*)WebPSafeCalloc((uint64_t)max_alphabet_size, sizeof(*code_lengths));
+  *htree_groups = VP8LHtreeGroupsNew(num_htree_groups);
+
+  if (*htree_groups == NULL || code_lengths == NULL ||
       !VP8LHuffmanTablesAllocate(num_htree_groups * table_size,
                                  huffman_tables)) {
-    dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
+    VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY);
     goto Error;
   }
 
@@ -464,7 +493,7 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
       }
     } else {
       HTreeGroup* const htree_group =
-          &htree_groups[(mapping == NULL) ? i : mapping[i]];
+          &(*htree_groups)[(mapping == NULL) ? i : mapping[i]];
       HuffmanCode** const htrees = htree_group->htrees;
       int size;
       int total_size = 0;
@@ -516,18 +545,12 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
   }
   ok = 1;
 
-  // All OK. Finalize pointers.
-  hdr->huffman_image_ = huffman_image;
-  hdr->num_htree_groups_ = num_htree_groups;
-  hdr->htree_groups_ = htree_groups;
-
  Error:
   WebPSafeFree(code_lengths);
-  WebPSafeFree(mapping);
   if (!ok) {
-    WebPSafeFree(huffman_image);
     VP8LHuffmanTablesDeallocate(huffman_tables);
-    VP8LHtreeGroupsFree(htree_groups);
+    VP8LHtreeGroupsFree(*htree_groups);
+    *htree_groups = NULL;
   }
   return ok;
 }
@@ -551,8 +574,7 @@ static int AllocateAndInitRescaler(VP8LDecoder* const dec, VP8Io* const io) {
                                scaled_data_size * sizeof(*scaled_data);
   uint8_t* memory = (uint8_t*)WebPSafeMalloc(memory_size, sizeof(*memory));
   if (memory == NULL) {
-    dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
-    return 0;
+    return VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY);
   }
   assert(dec->rescaler_memory == NULL);
   dec->rescaler_memory = memory;
@@ -1086,12 +1108,10 @@ static int DecodeAlphaData(VP8LDecoder* const dec, uint8_t* const data,
  End:
   br->eos_ = VP8LIsEndOfStream(br);
   if (!ok || (br->eos_ && pos < end)) {
-    ok = 0;
-    dec->status_ = br->eos_ ? VP8_STATUS_SUSPENDED
-                            : VP8_STATUS_BITSTREAM_ERROR;
-  } else {
-    dec->last_pixel_ = pos;
+    return VP8LSetError(
+        dec, br->eos_ ? VP8_STATUS_SUSPENDED : VP8_STATUS_BITSTREAM_ERROR);
   }
+  dec->last_pixel_ = pos;
   return ok;
 }
 
@@ -1241,9 +1261,20 @@ static int DecodeImageData(VP8LDecoder* const dec, uint32_t* const data,
   }
 
   br->eos_ = VP8LIsEndOfStream(br);
-  if (dec->incremental_ && br->eos_ && src < src_end) {
+  // In incremental decoding:
+  // br->eos_ && src < src_last: if 'br' reached the end of the buffer and
+  // 'src_last' has not been reached yet, there is not enough data. 'dec' has to
+  // be reset until there is more data.
+  // !br->eos_ && src < src_last: this cannot happen as either the buffer is
+  // fully read, either enough has been read to reach 'src_last'.
+  // src >= src_last: 'src_last' is reached, all is fine. 'src' can actually go
+  // beyond 'src_last' in case the image is cropped and an LZ77 goes further.
+  // The buffer might have been enough or there is some left. 'br->eos_' does
+  // not matter.
+  assert(!dec->incremental_ || (br->eos_ && src < src_last) || src >= src_last);
+  if (dec->incremental_ && br->eos_ && src < src_last) {
     RestoreState(dec);
-  } else if (!br->eos_) {
+  } else if ((dec->incremental_ && src >= src_last) || !br->eos_) {
     // Process the remaining rows corresponding to last row-block.
     if (process_func != NULL) {
       process_func(dec, row > last_row ? last_row : row);
@@ -1258,8 +1289,7 @@ static int DecodeImageData(VP8LDecoder* const dec, uint32_t* const data,
   return 1;
 
  Error:
-  dec->status_ = VP8_STATUS_BITSTREAM_ERROR;
-  return 0;
+  return VP8LSetError(dec, VP8_STATUS_BITSTREAM_ERROR);
 }
 
 // -----------------------------------------------------------------------------
@@ -1326,7 +1356,7 @@ static int ReadTransform(int* const xsize, int const* ysize,
                                                transform->bits_),
                              VP8LSubSampleSize(transform->ysize_,
                                                transform->bits_),
-                             0, dec, &transform->data_);
+                             /*is_level0=*/0, dec, &transform->data_);
       break;
     case COLOR_INDEXING_TRANSFORM: {
        const int num_colors = VP8LReadBits(br, 8) + 1;
@@ -1336,8 +1366,11 @@ static int ReadTransform(int* const xsize, int const* ysize,
                       : 3;
        *xsize = VP8LSubSampleSize(transform->xsize_, bits);
        transform->bits_ = bits;
-       ok = DecodeImageStream(num_colors, 1, 0, dec, &transform->data_);
-       ok = ok && ExpandColorMap(num_colors, transform);
+       ok = DecodeImageStream(num_colors, /*ysize=*/1, /*is_level0=*/0, dec,
+                              &transform->data_);
+       if (ok && !ExpandColorMap(num_colors, transform)) {
+         return VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY);
+       }
       break;
     }
     case SUBTRACT_GREEN_TRANSFORM:
@@ -1443,7 +1476,7 @@ static int DecodeImageStream(int xsize, int ysize,
     color_cache_bits = VP8LReadBits(br, 4);
     ok = (color_cache_bits >= 1 && color_cache_bits <= MAX_CACHE_BITS);
     if (!ok) {
-      dec->status_ = VP8_STATUS_BITSTREAM_ERROR;
+      VP8LSetError(dec, VP8_STATUS_BITSTREAM_ERROR);
       goto End;
     }
   }
@@ -1452,7 +1485,7 @@ static int DecodeImageStream(int xsize, int ysize,
   ok = ok && ReadHuffmanCodes(dec, transform_xsize, transform_ysize,
                               color_cache_bits, is_level0);
   if (!ok) {
-    dec->status_ = VP8_STATUS_BITSTREAM_ERROR;
+    VP8LSetError(dec, VP8_STATUS_BITSTREAM_ERROR);
     goto End;
   }
 
@@ -1460,8 +1493,7 @@ static int DecodeImageStream(int xsize, int ysize,
   if (color_cache_bits > 0) {
     hdr->color_cache_size_ = 1 << color_cache_bits;
     if (!VP8LColorCacheInit(&hdr->color_cache_, color_cache_bits)) {
-      dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
-      ok = 0;
+      ok = VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY);
       goto End;
     }
   } else {
@@ -1478,8 +1510,7 @@ static int DecodeImageStream(int xsize, int ysize,
     const uint64_t total_size = (uint64_t)transform_xsize * transform_ysize;
     data = (uint32_t*)WebPSafeMalloc(total_size, sizeof(*data));
     if (data == NULL) {
-      dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
-      ok = 0;
+      ok = VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY);
       goto End;
     }
   }
@@ -1524,8 +1555,7 @@ static int AllocateInternalBuffers32b(VP8LDecoder* const dec, int final_width) {
   dec->pixels_ = (uint32_t*)WebPSafeMalloc(total_num_pixels, sizeof(uint32_t));
   if (dec->pixels_ == NULL) {
     dec->argb_cache_ = NULL;    // for soundness
-    dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
-    return 0;
+    return VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY);
   }
   dec->argb_cache_ = dec->pixels_ + num_pixels + cache_top_pixels;
   return 1;
@@ -1536,8 +1566,7 @@ static int AllocateInternalBuffers8b(VP8LDecoder* const dec) {
   dec->argb_cache_ = NULL;    // for soundness
   dec->pixels_ = (uint32_t*)WebPSafeMalloc(total_num_pixels, sizeof(uint8_t));
   if (dec->pixels_ == NULL) {
-    dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
-    return 0;
+    return VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY);
   }
   return 1;
 }
@@ -1592,7 +1621,8 @@ int VP8LDecodeAlphaHeader(ALPHDecoder* const alph_dec,
   dec->status_ = VP8_STATUS_OK;
   VP8LInitBitReader(&dec->br_, data, data_size);
 
-  if (!DecodeImageStream(alph_dec->width_, alph_dec->height_, 1, dec, NULL)) {
+  if (!DecodeImageStream(alph_dec->width_, alph_dec->height_, /*is_level0=*/1,
+                         dec, /*decoded_data=*/NULL)) {
     goto Err;
   }
 
@@ -1647,22 +1677,24 @@ int VP8LDecodeHeader(VP8LDecoder* const dec, VP8Io* const io) {
 
   if (dec == NULL) return 0;
   if (io == NULL) {
-    dec->status_ = VP8_STATUS_INVALID_PARAM;
-    return 0;
+    return VP8LSetError(dec, VP8_STATUS_INVALID_PARAM);
   }
 
   dec->io_ = io;
   dec->status_ = VP8_STATUS_OK;
   VP8LInitBitReader(&dec->br_, io->data, io->data_size);
   if (!ReadImageInfo(&dec->br_, &width, &height, &has_alpha)) {
-    dec->status_ = VP8_STATUS_BITSTREAM_ERROR;
+    VP8LSetError(dec, VP8_STATUS_BITSTREAM_ERROR);
     goto Error;
   }
   dec->state_ = READ_DIM;
   io->width = width;
   io->height = height;
 
-  if (!DecodeImageStream(width, height, 1, dec, NULL)) goto Error;
+  if (!DecodeImageStream(width, height, /*is_level0=*/1, dec,
+                         /*decoded_data=*/NULL)) {
+    goto Error;
+  }
   return 1;
 
  Error:
@@ -1692,7 +1724,7 @@ int VP8LDecodeImage(VP8LDecoder* const dec) {
     assert(dec->output_ != NULL);
 
     if (!WebPIoInitFromOptions(params->options, io, MODE_BGRA)) {
-      dec->status_ = VP8_STATUS_INVALID_PARAM;
+      VP8LSetError(dec, VP8_STATUS_INVALID_PARAM);
       goto Err;
     }
 
@@ -1702,7 +1734,7 @@ int VP8LDecodeImage(VP8LDecoder* const dec) {
     if (io->use_scaling && !AllocateAndInitRescaler(dec, io)) goto Err;
 #else
     if (io->use_scaling) {
-      dec->status_ = VP8_STATUS_INVALID_PARAM;
+      VP8LSetError(dec, VP8_STATUS_INVALID_PARAM);
       goto Err;
     }
 #endif
@@ -1720,7 +1752,7 @@ int VP8LDecodeImage(VP8LDecoder* const dec) {
           dec->hdr_.saved_color_cache_.colors_ == NULL) {
         if (!VP8LColorCacheInit(&dec->hdr_.saved_color_cache_,
                                 dec->hdr_.color_cache_.hash_bits_)) {
-          dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
+          VP8LSetError(dec, VP8_STATUS_OUT_OF_MEMORY);
           goto Err;
         }
       }

+ 21 - 7
webp.mod/libwebp/src/dec/vp8li_dec.h

@@ -20,6 +20,7 @@
 #include "src/utils/bit_reader_utils.h"
 #include "src/utils/color_cache_utils.h"
 #include "src/utils/huffman_utils.h"
+#include "src/webp/types.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -99,25 +100,26 @@ struct ALPHDecoder;  // Defined in dec/alphai.h.
 
 // Decodes image header for alpha data stored using lossless compression.
 // Returns false in case of error.
-int VP8LDecodeAlphaHeader(struct ALPHDecoder* const alph_dec,
-                          const uint8_t* const data, size_t data_size);
+WEBP_NODISCARD int VP8LDecodeAlphaHeader(struct ALPHDecoder* const alph_dec,
+                                         const uint8_t* const data,
+                                         size_t data_size);
 
 // Decodes *at least* 'last_row' rows of alpha. If some of the initial rows are
 // already decoded in previous call(s), it will resume decoding from where it
 // was paused.
 // Returns false in case of bitstream error.
-int VP8LDecodeAlphaImageStream(struct ALPHDecoder* const alph_dec,
-                               int last_row);
+WEBP_NODISCARD int VP8LDecodeAlphaImageStream(
+    struct ALPHDecoder* const alph_dec, int last_row);
 
 // Allocates and initialize a new lossless decoder instance.
-VP8LDecoder* VP8LNew(void);
+WEBP_NODISCARD VP8LDecoder* VP8LNew(void);
 
 // Decodes the image header. Returns false in case of error.
-int VP8LDecodeHeader(VP8LDecoder* const dec, VP8Io* const io);
+WEBP_NODISCARD int VP8LDecodeHeader(VP8LDecoder* const dec, VP8Io* const io);
 
 // Decodes an image. It's required to decode the lossless header before calling
 // this function. Returns false in case of error, with updated dec->status_.
-int VP8LDecodeImage(VP8LDecoder* const dec);
+WEBP_NODISCARD int VP8LDecodeImage(VP8LDecoder* const dec);
 
 // Resets the decoder in its initial state, reclaiming memory.
 // Preserves the dec->status_ value.
@@ -126,6 +128,18 @@ void VP8LClear(VP8LDecoder* const dec);
 // Clears and deallocate a lossless decoder instance.
 void VP8LDelete(VP8LDecoder* const dec);
 
+// Helper function for reading the different Huffman codes and storing them in
+// 'huffman_tables' and 'htree_groups'.
+// If mapping is NULL 'num_htree_groups_max' must equal 'num_htree_groups'.
+// If it is not NULL, it maps 'num_htree_groups_max' indices to the
+// 'num_htree_groups' groups. If 'num_htree_groups_max' > 'num_htree_groups',
+// some of those indices map to -1. This is used for non-balanced codes to
+// limit memory usage.
+WEBP_NODISCARD int ReadHuffmanCodesHelper(
+    int color_cache_bits, int num_htree_groups, int num_htree_groups_max,
+    const int* const mapping, VP8LDecoder* const dec,
+    HuffmanTables* const huffman_tables, HTreeGroup** const htree_groups);
+
 //------------------------------------------------------------------------------
 
 #ifdef __cplusplus

+ 30 - 18
webp.mod/libwebp/src/dec/webp_dec.c

@@ -13,11 +13,14 @@
 
 #include <stdlib.h>
 
+#include "src/dec/vp8_dec.h"
 #include "src/dec/vp8i_dec.h"
 #include "src/dec/vp8li_dec.h"
 #include "src/dec/webpi_dec.h"
 #include "src/utils/utils.h"
 #include "src/webp/mux_types.h"  // ALPHA_FLAG
+#include "src/webp/decode.h"
+#include "src/webp/types.h"
 
 //------------------------------------------------------------------------------
 // RIFF layout is:
@@ -444,8 +447,9 @@ void WebPResetDecParams(WebPDecParams* const params) {
 // "Into" decoding variants
 
 // Main flow
-static VP8StatusCode DecodeInto(const uint8_t* const data, size_t data_size,
-                                WebPDecParams* const params) {
+WEBP_NODISCARD static VP8StatusCode DecodeInto(const uint8_t* const data,
+                                               size_t data_size,
+                                               WebPDecParams* const params) {
   VP8StatusCode status;
   VP8Io io;
   WebPHeaderStructure headers;
@@ -459,7 +463,9 @@ static VP8StatusCode DecodeInto(const uint8_t* const data, size_t data_size,
   }
 
   assert(params != NULL);
-  VP8InitIo(&io);
+  if (!VP8InitIo(&io)) {
+    return VP8_STATUS_INVALID_PARAM;
+  }
   io.data = headers.data + headers.offset;
   io.data_size = headers.data_size - headers.offset;
   WebPInitCustomIo(params, &io);  // Plug the I/O functions.
@@ -523,17 +529,16 @@ static VP8StatusCode DecodeInto(const uint8_t* const data, size_t data_size,
 }
 
 // Helpers
-static uint8_t* DecodeIntoRGBABuffer(WEBP_CSP_MODE colorspace,
-                                     const uint8_t* const data,
-                                     size_t data_size,
-                                     uint8_t* const rgba,
-                                     int stride, size_t size) {
+WEBP_NODISCARD static uint8_t* DecodeIntoRGBABuffer(WEBP_CSP_MODE colorspace,
+                                                    const uint8_t* const data,
+                                                    size_t data_size,
+                                                    uint8_t* const rgba,
+                                                    int stride, size_t size) {
   WebPDecParams params;
   WebPDecBuffer buf;
-  if (rgba == NULL) {
+  if (rgba == NULL || !WebPInitDecBuffer(&buf)) {
     return NULL;
   }
-  WebPInitDecBuffer(&buf);
   WebPResetDecParams(&params);
   params.output = &buf;
   buf.colorspace    = colorspace;
@@ -578,8 +583,7 @@ uint8_t* WebPDecodeYUVInto(const uint8_t* data, size_t data_size,
                            uint8_t* v, size_t v_size, int v_stride) {
   WebPDecParams params;
   WebPDecBuffer output;
-  if (luma == NULL) return NULL;
-  WebPInitDecBuffer(&output);
+  if (luma == NULL || !WebPInitDecBuffer(&output)) return NULL;
   WebPResetDecParams(&params);
   params.output = &output;
   output.colorspace      = MODE_YUV;
@@ -601,13 +605,17 @@ uint8_t* WebPDecodeYUVInto(const uint8_t* data, size_t data_size,
 
 //------------------------------------------------------------------------------
 
-static uint8_t* Decode(WEBP_CSP_MODE mode, const uint8_t* const data,
-                       size_t data_size, int* const width, int* const height,
-                       WebPDecBuffer* const keep_info) {
+WEBP_NODISCARD static uint8_t* Decode(WEBP_CSP_MODE mode,
+                                      const uint8_t* const data,
+                                      size_t data_size, int* const width,
+                                      int* const height,
+                                      WebPDecBuffer* const keep_info) {
   WebPDecParams params;
   WebPDecBuffer output;
 
-  WebPInitDecBuffer(&output);
+  if (!WebPInitDecBuffer(&output)) {
+    return NULL;
+  }
   WebPResetDecParams(&params);
   params.output = &output;
   output.colorspace = mode;
@@ -733,7 +741,9 @@ int WebPInitDecoderConfigInternal(WebPDecoderConfig* config,
   }
   memset(config, 0, sizeof(*config));
   DefaultFeatures(&config->input);
-  WebPInitDecBuffer(&config->output);
+  if (!WebPInitDecBuffer(&config->output)) {
+    return 0;
+  }
   return 1;
 }
 
@@ -772,7 +782,9 @@ VP8StatusCode WebPDecode(const uint8_t* data, size_t data_size,
   if (WebPAvoidSlowMemory(params.output, &config->input)) {
     // decoding to slow memory: use a temporary in-mem buffer to decode into.
     WebPDecBuffer in_mem_buffer;
-    WebPInitDecBuffer(&in_mem_buffer);
+    if (!WebPInitDecBuffer(&in_mem_buffer)) {
+      return VP8_STATUS_INVALID_PARAM;
+    }
     in_mem_buffer.colorspace = config->output.colorspace;
     in_mem_buffer.width = config->input.width;
     in_mem_buffer.height = config->input.height;

+ 4 - 2
webp.mod/libwebp/src/dec/webpi_dec.h

@@ -20,6 +20,7 @@ extern "C" {
 
 #include "src/utils/rescaler_utils.h"
 #include "src/dec/vp8_dec.h"
+#include "src/webp/decode.h"
 
 //------------------------------------------------------------------------------
 // WebPDecParams: Decoding output parameters. Transient internal object.
@@ -87,8 +88,9 @@ void WebPInitCustomIo(WebPDecParams* const params, VP8Io* const io);
 
 // Setup crop_xxx fields, mb_w and mb_h in io. 'src_colorspace' refers
 // to the *compressed* format, not the output one.
-int WebPIoInitFromOptions(const WebPDecoderOptions* const options,
-                          VP8Io* const io, WEBP_CSP_MODE src_colorspace);
+WEBP_NODISCARD int WebPIoInitFromOptions(
+    const WebPDecoderOptions* const options, VP8Io* const io,
+    WEBP_CSP_MODE src_colorspace);
 
 //------------------------------------------------------------------------------
 // Internal functions regarding WebPDecBuffer memory (in buffer.c).

+ 14 - 8
webp.mod/libwebp/src/demux/anim_decode.c

@@ -20,6 +20,7 @@
 #include "src/utils/utils.h"
 #include "src/webp/decode.h"
 #include "src/webp/demux.h"
+#include "src/webp/types.h"
 
 #define NUM_CHANNELS 4
 
@@ -68,8 +69,9 @@ int WebPAnimDecoderOptionsInitInternal(WebPAnimDecoderOptions* dec_options,
   return 1;
 }
 
-static int ApplyDecoderOptions(const WebPAnimDecoderOptions* const dec_options,
-                               WebPAnimDecoder* const dec) {
+WEBP_NODISCARD static int ApplyDecoderOptions(
+    const WebPAnimDecoderOptions* const dec_options,
+    WebPAnimDecoder* const dec) {
   WEBP_CSP_MODE mode;
   WebPDecoderConfig* config = &dec->config_;
   assert(dec_options != NULL);
@@ -82,7 +84,9 @@ static int ApplyDecoderOptions(const WebPAnimDecoderOptions* const dec_options,
   dec->blend_func_ = (mode == MODE_RGBA || mode == MODE_BGRA)
                          ? &BlendPixelRowNonPremult
                          : &BlendPixelRowPremult;
-  WebPInitDecoderConfig(config);
+  if (!WebPInitDecoderConfig(config)) {
+    return 0;
+  }
   config->output.colorspace = mode;
   config->output.is_external_memory = 1;
   config->options.use_threads = dec_options->use_threads;
@@ -157,8 +161,8 @@ static int IsFullFrame(int width, int height, int canvas_width,
 }
 
 // Clear the canvas to transparent.
-static int ZeroFillCanvas(uint8_t* buf, uint32_t canvas_width,
-                          uint32_t canvas_height) {
+WEBP_NODISCARD static int ZeroFillCanvas(uint8_t* buf, uint32_t canvas_width,
+                                         uint32_t canvas_height) {
   const uint64_t size =
       (uint64_t)canvas_width * canvas_height * NUM_CHANNELS * sizeof(*buf);
   if (!CheckSizeOverflow(size)) return 0;
@@ -179,8 +183,8 @@ static void ZeroFillFrameRect(uint8_t* buf, int buf_stride, int x_offset,
 }
 
 // Copy width * height pixels from 'src' to 'dst'.
-static int CopyCanvas(const uint8_t* src, uint8_t* dst,
-                      uint32_t width, uint32_t height) {
+WEBP_NODISCARD static int CopyCanvas(const uint8_t* src, uint8_t* dst,
+                                     uint32_t width, uint32_t height) {
   const uint64_t size = (uint64_t)width * height * NUM_CHANNELS;
   if (!CheckSizeOverflow(size)) return 0;
   assert(src != NULL && dst != NULL);
@@ -424,7 +428,9 @@ int WebPAnimDecoderGetNext(WebPAnimDecoder* dec,
   WebPDemuxReleaseIterator(&dec->prev_iter_);
   dec->prev_iter_ = iter;
   dec->prev_frame_was_keyframe_ = is_key_frame;
-  CopyCanvas(dec->curr_frame_, dec->prev_frame_disposed_, width, height);
+  if (!CopyCanvas(dec->curr_frame_, dec->prev_frame_disposed_, width, height)) {
+    goto Error;
+  }
   if (dec->prev_iter_.dispose_method == WEBP_MUX_DISPOSE_BACKGROUND) {
     ZeroFillFrameRect(dec->prev_frame_disposed_, width * NUM_CHANNELS,
                       dec->prev_iter_.x_offset, dec->prev_iter_.y_offset,

+ 41 - 0
webp.mod/libwebp/src/dsp/alpha_processing_sse2.c

@@ -144,6 +144,46 @@ static int ExtractAlpha_SSE2(const uint8_t* WEBP_RESTRICT argb, int argb_stride,
   return (alpha_and == 0xff);
 }
 
+static void ExtractGreen_SSE2(const uint32_t* WEBP_RESTRICT argb,
+                              uint8_t* WEBP_RESTRICT alpha, int size) {
+  int i;
+  const __m128i mask = _mm_set1_epi32(0xff);
+  const __m128i* src = (const __m128i*)argb;
+
+  for (i = 0; i + 16 <= size; i += 16, src += 4) {
+    const __m128i a0 = _mm_loadu_si128(src + 0);
+    const __m128i a1 = _mm_loadu_si128(src + 1);
+    const __m128i a2 = _mm_loadu_si128(src + 2);
+    const __m128i a3 = _mm_loadu_si128(src + 3);
+    const __m128i b0 = _mm_srli_epi32(a0, 8);
+    const __m128i b1 = _mm_srli_epi32(a1, 8);
+    const __m128i b2 = _mm_srli_epi32(a2, 8);
+    const __m128i b3 = _mm_srli_epi32(a3, 8);
+    const __m128i c0 = _mm_and_si128(b0, mask);
+    const __m128i c1 = _mm_and_si128(b1, mask);
+    const __m128i c2 = _mm_and_si128(b2, mask);
+    const __m128i c3 = _mm_and_si128(b3, mask);
+    const __m128i d0 = _mm_packs_epi32(c0, c1);
+    const __m128i d1 = _mm_packs_epi32(c2, c3);
+    const __m128i e = _mm_packus_epi16(d0, d1);
+    // store
+    _mm_storeu_si128((__m128i*)&alpha[i], e);
+  }
+  if (i + 8 <= size) {
+    const __m128i a0 = _mm_loadu_si128(src + 0);
+    const __m128i a1 = _mm_loadu_si128(src + 1);
+    const __m128i b0 = _mm_srli_epi32(a0, 8);
+    const __m128i b1 = _mm_srli_epi32(a1, 8);
+    const __m128i c0 = _mm_and_si128(b0, mask);
+    const __m128i c1 = _mm_and_si128(b1, mask);
+    const __m128i d = _mm_packs_epi32(c0, c1);
+    const __m128i e = _mm_packus_epi16(d, d);
+    _mm_storel_epi64((__m128i*)&alpha[i], e);
+    i += 8;
+  }
+  for (; i < size; ++i) alpha[i] = argb[i] >> 8;
+}
+
 //------------------------------------------------------------------------------
 // Non-dither premultiplied modes
 
@@ -354,6 +394,7 @@ WEBP_TSAN_IGNORE_FUNCTION void WebPInitAlphaProcessingSSE2(void) {
   WebPDispatchAlpha = DispatchAlpha_SSE2;
   WebPDispatchAlphaToGreen = DispatchAlphaToGreen_SSE2;
   WebPExtractAlpha = ExtractAlpha_SSE2;
+  WebPExtractGreen = ExtractGreen_SSE2;
 
   WebPHasAlpha8b = HasAlpha8b_SSE2;
   WebPHasAlpha32b = HasAlpha32b_SSE2;

+ 0 - 12
webp.mod/libwebp/src/dsp/cpu.c

@@ -36,18 +36,6 @@ static WEBP_INLINE void GetCPUInfo(int cpu_info[4], int info_type) {
     : "=a"(cpu_info[0]), "=D"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3])
     : "a"(info_type), "c"(0));
 }
-#elif defined(__x86_64__) && \
-      (defined(__code_model_medium__) || defined(__code_model_large__)) && \
-      defined(__PIC__)
-static WEBP_INLINE void GetCPUInfo(int cpu_info[4], int info_type) {
-  __asm__ volatile (
-    "xchg{q}\t{%%rbx}, %q1\n"
-    "cpuid\n"
-    "xchg{q}\t{%%rbx}, %q1\n"
-    : "=a"(cpu_info[0]), "=&r"(cpu_info[1]), "=c"(cpu_info[2]),
-      "=d"(cpu_info[3])
-    : "a"(info_type), "c"(0));
-}
 #elif defined(__i386__) || defined(__x86_64__)
 static WEBP_INLINE void GetCPUInfo(int cpu_info[4], int info_type) {
   __asm__ volatile (

+ 8 - 1
webp.mod/libwebp/src/dsp/filters.c

@@ -189,6 +189,12 @@ static void GradientFilter_C(const uint8_t* data, int width, int height,
 
 //------------------------------------------------------------------------------
 
+static void NoneUnfilter_C(const uint8_t* prev, const uint8_t* in,
+                           uint8_t* out, int width) {
+  (void)prev;
+  if (out != in) memcpy(out, in, width * sizeof(*out));
+}
+
 static void HorizontalUnfilter_C(const uint8_t* prev, const uint8_t* in,
                                  uint8_t* out, int width) {
   uint8_t pred = (prev == NULL) ? 0 : prev[0];
@@ -240,7 +246,7 @@ extern void VP8FiltersInitNEON(void);
 extern void VP8FiltersInitSSE2(void);
 
 WEBP_DSP_INIT_FUNC(VP8FiltersInit) {
-  WebPUnfilters[WEBP_FILTER_NONE] = NULL;
+  WebPUnfilters[WEBP_FILTER_NONE] = NoneUnfilter_C;
 #if !WEBP_NEON_OMIT_C_CODE
   WebPUnfilters[WEBP_FILTER_HORIZONTAL] = HorizontalUnfilter_C;
   WebPUnfilters[WEBP_FILTER_VERTICAL] = VerticalUnfilter_C;
@@ -279,6 +285,7 @@ WEBP_DSP_INIT_FUNC(VP8FiltersInit) {
   }
 #endif
 
+  assert(WebPUnfilters[WEBP_FILTER_NONE] != NULL);
   assert(WebPUnfilters[WEBP_FILTER_HORIZONTAL] != NULL);
   assert(WebPUnfilters[WEBP_FILTER_VERTICAL] != NULL);
   assert(WebPUnfilters[WEBP_FILTER_GRADIENT] != NULL);

+ 3 - 3
webp.mod/libwebp/src/dsp/lossless.h

@@ -182,9 +182,9 @@ extern VP8LPredictorAddSubFunc VP8LPredictorsSub_C[16];
 // -----------------------------------------------------------------------------
 // Huffman-cost related functions.
 
-typedef float (*VP8LCostFunc)(const uint32_t* population, int length);
-typedef float (*VP8LCostCombinedFunc)(const uint32_t* X, const uint32_t* Y,
-                                      int length);
+typedef uint32_t (*VP8LCostFunc)(const uint32_t* population, int length);
+typedef uint32_t (*VP8LCostCombinedFunc)(const uint32_t* X, const uint32_t* Y,
+                                         int length);
 typedef float (*VP8LCombinedShannonEntropyFunc)(const int X[256],
                                                 const int Y[256]);
 

+ 3 - 3
webp.mod/libwebp/src/dsp/lossless_common.h

@@ -16,9 +16,9 @@
 #ifndef WEBP_DSP_LOSSLESS_COMMON_H_
 #define WEBP_DSP_LOSSLESS_COMMON_H_
 
-#include "src/webp/types.h"
-
+#include "src/dsp/cpu.h"
 #include "src/utils/utils.h"
+#include "src/webp/types.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -166,7 +166,7 @@ uint32_t VP8LSubPixels(uint32_t a, uint32_t b) {
 }
 
 //------------------------------------------------------------------------------
-// Transform-related functions use din both encoding and decoding.
+// Transform-related functions used in both encoding and decoding.
 
 // Macros used to create a batch predictor that iteratively uses a
 // one-pixel predictor.

+ 14 - 9
webp.mod/libwebp/src/dsp/lossless_enc.c

@@ -636,20 +636,25 @@ void VP8LBundleColorMap_C(const uint8_t* const row, int width, int xbits,
 
 //------------------------------------------------------------------------------
 
-static float ExtraCost_C(const uint32_t* population, int length) {
+static uint32_t ExtraCost_C(const uint32_t* population, int length) {
   int i;
-  float cost = 0.f;
-  for (i = 2; i < length - 2; ++i) cost += (i >> 1) * population[i + 2];
+  uint32_t cost = population[4] + population[5];
+  assert(length % 2 == 0);
+  for (i = 2; i < length / 2 - 1; ++i) {
+    cost += i * (population[2 * i + 2] + population[2 * i + 3]);
+  }
   return cost;
 }
 
-static float ExtraCostCombined_C(const uint32_t* X, const uint32_t* Y,
-                                  int length) {
+static uint32_t ExtraCostCombined_C(const uint32_t* X, const uint32_t* Y,
+                                    int length) {
   int i;
-  float cost = 0.f;
-  for (i = 2; i < length - 2; ++i) {
-    const int xy = X[i + 2] + Y[i + 2];
-    cost += (i >> 1) * xy;
+  uint32_t cost = X[4] + Y[4] + X[5] + Y[5];
+  assert(length % 2 == 0);
+  for (i = 2; i < length / 2 - 1; ++i) {
+    const int xy0 = X[2 * i + 2] + Y[2 * i + 2];
+    const int xy1 = X[2 * i + 3] + Y[2 * i + 3];
+    cost += i * (xy0 + xy1);
   }
   return cost;
 }

+ 7 - 7
webp.mod/libwebp/src/dsp/lossless_enc_mips32.c

@@ -103,8 +103,8 @@ static float FastLog2Slow_MIPS32(uint32_t v) {
 //     cost += i * *(pop + 1);
 //     pop += 2;
 //   }
-//   return (float)cost;
-static float ExtraCost_MIPS32(const uint32_t* const population, int length) {
+//   return cost;
+static uint32_t ExtraCost_MIPS32(const uint32_t* const population, int length) {
   int i, temp0, temp1;
   const uint32_t* pop = &population[4];
   const uint32_t* const LoopEnd = &population[length];
@@ -130,7 +130,7 @@ static float ExtraCost_MIPS32(const uint32_t* const population, int length) {
     : "memory", "hi", "lo"
   );
 
-  return (float)((int64_t)temp0 << 32 | temp1);
+  return ((int64_t)temp0 << 32 | temp1);
 }
 
 // C version of this function:
@@ -148,9 +148,9 @@ static float ExtraCost_MIPS32(const uint32_t* const population, int length) {
 //     pX += 2;
 //     pY += 2;
 //   }
-//   return (float)cost;
-static float ExtraCostCombined_MIPS32(const uint32_t* const X,
-                                      const uint32_t* const Y, int length) {
+//   return cost;
+static uint32_t ExtraCostCombined_MIPS32(const uint32_t* const X,
+                                         const uint32_t* const Y, int length) {
   int i, temp0, temp1, temp2, temp3;
   const uint32_t* pX = &X[4];
   const uint32_t* pY = &Y[4];
@@ -183,7 +183,7 @@ static float ExtraCostCombined_MIPS32(const uint32_t* const X,
     : "memory", "hi", "lo"
   );
 
-  return (float)((int64_t)temp0 << 32 | temp1);
+  return ((int64_t)temp0 << 32 | temp1);
 }
 
 #define HUFFMAN_COST_PASS                                 \

+ 52 - 2
webp.mod/libwebp/src/dsp/lossless_enc_sse41.c

@@ -18,8 +18,53 @@
 #include <smmintrin.h>
 #include "src/dsp/lossless.h"
 
-// For sign-extended multiplying constants, pre-shifted by 5:
-#define CST_5b(X)  (((int16_t)((uint16_t)(X) << 8)) >> 5)
+//------------------------------------------------------------------------------
+// Cost operations.
+
+static WEBP_INLINE uint32_t HorizontalSum_SSE41(__m128i cost) {
+  cost = _mm_add_epi32(cost, _mm_srli_si128(cost, 8));
+  cost = _mm_add_epi32(cost, _mm_srli_si128(cost, 4));
+  return _mm_cvtsi128_si32(cost);
+}
+
+static uint32_t ExtraCost_SSE41(const uint32_t* const a, int length) {
+  int i;
+  __m128i cost = _mm_set_epi32(2 * a[7], 2 * a[6], a[5], a[4]);
+  assert(length % 8 == 0);
+
+  for (i = 8; i + 8 <= length; i += 8) {
+    const int j = (i - 2) >> 1;
+    const __m128i a0 = _mm_loadu_si128((const __m128i*)&a[i]);
+    const __m128i a1 = _mm_loadu_si128((const __m128i*)&a[i + 4]);
+    const __m128i w = _mm_set_epi32(j + 3, j + 2, j + 1, j);
+    const __m128i a2 = _mm_hadd_epi32(a0, a1);
+    const __m128i mul = _mm_mullo_epi32(a2, w);
+    cost = _mm_add_epi32(mul, cost);
+  }
+  return HorizontalSum_SSE41(cost);
+}
+
+static uint32_t ExtraCostCombined_SSE41(const uint32_t* const a,
+                                        const uint32_t* const b, int length) {
+  int i;
+  __m128i cost = _mm_add_epi32(_mm_set_epi32(2 * a[7], 2 * a[6], a[5], a[4]),
+                               _mm_set_epi32(2 * b[7], 2 * b[6], b[5], b[4]));
+  assert(length % 8 == 0);
+
+  for (i = 8; i + 8 <= length; i += 8) {
+    const int j = (i - 2) >> 1;
+    const __m128i a0 = _mm_loadu_si128((const __m128i*)&a[i]);
+    const __m128i a1 = _mm_loadu_si128((const __m128i*)&a[i + 4]);
+    const __m128i b0 = _mm_loadu_si128((const __m128i*)&b[i]);
+    const __m128i b1 = _mm_loadu_si128((const __m128i*)&b[i + 4]);
+    const __m128i w = _mm_set_epi32(j + 3, j + 2, j + 1, j);
+    const __m128i a2 = _mm_hadd_epi32(a0, a1);
+    const __m128i b2 = _mm_hadd_epi32(b0, b1);
+    const __m128i mul = _mm_mullo_epi32(_mm_add_epi32(a2, b2), w);
+    cost = _mm_add_epi32(mul, cost);
+  }
+  return HorizontalSum_SSE41(cost);
+}
 
 //------------------------------------------------------------------------------
 // Subtract-Green Transform
@@ -44,6 +89,9 @@ static void SubtractGreenFromBlueAndRed_SSE41(uint32_t* argb_data,
 //------------------------------------------------------------------------------
 // Color Transform
 
+// For sign-extended multiplying constants, pre-shifted by 5:
+#define CST_5b(X) (((int16_t)((uint16_t)(X) << 8)) >> 5)
+
 #define MK_CST_16(HI, LO) \
   _mm_set1_epi32((int)(((uint32_t)(HI) << 16) | ((LO) & 0xffff)))
 
@@ -143,6 +191,8 @@ static void CollectColorRedTransforms_SSE41(const uint32_t* argb, int stride,
 extern void VP8LEncDspInitSSE41(void);
 
 WEBP_TSAN_IGNORE_FUNCTION void VP8LEncDspInitSSE41(void) {
+  VP8LExtraCost = ExtraCost_SSE41;
+  VP8LExtraCostCombined = ExtraCostCombined_SSE41;
   VP8LSubtractGreenFromBlueAndRed = SubtractGreenFromBlueAndRed_SSE41;
   VP8LCollectColorBlueTransforms = CollectColorBlueTransforms_SSE41;
   VP8LCollectColorRedTransforms = CollectColorRedTransforms_SSE41;

+ 15 - 17
webp.mod/libwebp/src/dsp/msa_macro.h

@@ -73,27 +73,25 @@
 #define ST_UW(...) ST_W(v4u32, __VA_ARGS__)
 #define ST_SW(...) ST_W(v4i32, __VA_ARGS__)
 
-#define MSA_LOAD_FUNC(TYPE, INSTR, FUNC_NAME)             \
-  static inline TYPE FUNC_NAME(const void* const psrc) {  \
-    const uint8_t* const psrc_m = (const uint8_t*)psrc;   \
-    TYPE val_m;                                           \
-    asm volatile (                                        \
-      "" #INSTR " %[val_m], %[psrc_m]  \n\t"              \
-      : [val_m] "=r" (val_m)                              \
-      : [psrc_m] "m" (*psrc_m));                          \
-    return val_m;                                         \
+#define MSA_LOAD_FUNC(TYPE, INSTR, FUNC_NAME)               \
+  static inline TYPE FUNC_NAME(const void* const psrc) {    \
+    const uint8_t* const psrc_m = (const uint8_t*)psrc;     \
+    TYPE val_m;                                             \
+    __asm__ volatile("" #INSTR " %[val_m], %[psrc_m]  \n\t" \
+                     : [val_m] "=r"(val_m)                  \
+                     : [psrc_m] "m"(*psrc_m));              \
+    return val_m;                                           \
   }
 
 #define MSA_LOAD(psrc, FUNC_NAME)  FUNC_NAME(psrc)
 
-#define MSA_STORE_FUNC(TYPE, INSTR, FUNC_NAME)               \
-  static inline void FUNC_NAME(TYPE val, void* const pdst) { \
-    uint8_t* const pdst_m = (uint8_t*)pdst;                  \
-    TYPE val_m = val;                                        \
-    asm volatile (                                           \
-      " " #INSTR "  %[val_m],  %[pdst_m]  \n\t"              \
-      : [pdst_m] "=m" (*pdst_m)                              \
-      : [val_m] "r" (val_m));                                \
+#define MSA_STORE_FUNC(TYPE, INSTR, FUNC_NAME)                 \
+  static inline void FUNC_NAME(TYPE val, void* const pdst) {   \
+    uint8_t* const pdst_m = (uint8_t*)pdst;                    \
+    TYPE val_m = val;                                          \
+    __asm__ volatile(" " #INSTR "  %[val_m],  %[pdst_m]  \n\t" \
+                     : [pdst_m] "=m"(*pdst_m)                  \
+                     : [val_m] "r"(val_m));                    \
   }
 
 #define MSA_STORE(val, pdst, FUNC_NAME)  FUNC_NAME(val, pdst)

+ 2 - 1
webp.mod/libwebp/src/dsp/quant.h

@@ -36,8 +36,9 @@ static WEBP_INLINE int IsFlat(const int16_t* levels, int num_blocks,
                               int thresh) {
   const int16x8_t tst_ones = vdupq_n_s16(-1);
   uint32x4_t sum = vdupq_n_u32(0);
+  int i;
 
-  for (int i = 0; i < num_blocks; ++i) {
+  for (i = 0; i < num_blocks; ++i) {
     // Set DC to zero.
     const int16x8_t a_0 = vsetq_lane_s16(0, vld1q_s16(levels), 0);
     const int16x8_t a_1 = vld1q_s16(levels + 8);

+ 4 - 7
webp.mod/libwebp/src/enc/alpha_enc.c

@@ -20,6 +20,7 @@
 #include "src/utils/filters_utils.h"
 #include "src/utils/quant_levels_utils.h"
 #include "src/utils/utils.h"
+#include "src/webp/encode.h"
 #include "src/webp/format_constants.h"
 
 // -----------------------------------------------------------------------------
@@ -55,7 +56,7 @@ static int EncodeLossless(const uint8_t* const data, int width, int height,
   WebPConfig config;
   WebPPicture picture;
 
-  WebPPictureInit(&picture);
+  if (!WebPPictureInit(&picture)) return 0;
   picture.width = width;
   picture.height = height;
   picture.use_argb = 1;
@@ -66,7 +67,7 @@ static int EncodeLossless(const uint8_t* const data, int width, int height,
   WebPDispatchAlphaToGreen(data, width, picture.width, picture.height,
                            picture.argb, picture.argb_stride);
 
-  WebPConfigInit(&config);
+  if (!WebPConfigInit(&config)) return 0;
   config.lossless = 1;
   // Enable exact, or it would alter RGB values of transparent alpha, which is
   // normally OK but not here since we are not encoding the input image but  an
@@ -83,11 +84,7 @@ static int EncodeLossless(const uint8_t* const data, int width, int height,
       (use_quality_100 && effort_level == 6) ? 100 : 8.f * effort_level;
   assert(config.quality >= 0 && config.quality <= 100.f);
 
-  // TODO(urvang): Temporary fix to avoid generating images that trigger
-  // a decoder bug related to alpha with color cache.
-  // See: https://code.google.com/p/webp/issues/detail?id=239
-  // Need to re-enable this later.
-  ok = VP8LEncodeStream(&config, &picture, bw, /*use_cache=*/0);
+  ok = VP8LEncodeStream(&config, &picture, bw);
   WebPPictureFree(&picture);
   ok = ok && !bw->error_;
   if (!ok) {

+ 2 - 2
webp.mod/libwebp/src/enc/frame_enc.c

@@ -578,7 +578,7 @@ static uint64_t OneStatPass(VP8Encoder* const enc, VP8RDLevel rd_opt,
   uint64_t size = 0;
   uint64_t size_p0 = 0;
   uint64_t distortion = 0;
-  const uint64_t pixel_count = nb_mbs * 384;
+  const uint64_t pixel_count = (uint64_t)nb_mbs * 384;
 
   VP8IteratorInit(enc, &it);
   SetLoopParams(enc, s->q);
@@ -789,7 +789,7 @@ int VP8EncTokenLoop(VP8Encoder* const enc) {
   VP8EncIterator it;
   VP8EncProba* const proba = &enc->proba_;
   const VP8RDLevel rd_opt = enc->rd_opt_level_;
-  const uint64_t pixel_count = enc->mb_w_ * enc->mb_h_ * 384;
+  const uint64_t pixel_count = (uint64_t)enc->mb_w_ * enc->mb_h_ * 384;
   PassStats stats;
   int ok;
 

+ 19 - 17
webp.mod/libwebp/src/enc/histogram_enc.c

@@ -358,15 +358,17 @@ static WEBP_INLINE float GetCombinedEntropy(const uint32_t* const X,
 
 // Estimates the Entropy + Huffman + other block overhead size cost.
 float VP8LHistogramEstimateBits(VP8LHistogram* const p) {
-  return
-      PopulationCost(p->literal_, VP8LHistogramNumCodes(p->palette_code_bits_),
-                     NULL, &p->is_used_[0])
-      + PopulationCost(p->red_, NUM_LITERAL_CODES, NULL, &p->is_used_[1])
-      + PopulationCost(p->blue_, NUM_LITERAL_CODES, NULL, &p->is_used_[2])
-      + PopulationCost(p->alpha_, NUM_LITERAL_CODES, NULL, &p->is_used_[3])
-      + PopulationCost(p->distance_, NUM_DISTANCE_CODES, NULL, &p->is_used_[4])
-      + VP8LExtraCost(p->literal_ + NUM_LITERAL_CODES, NUM_LENGTH_CODES)
-      + VP8LExtraCost(p->distance_, NUM_DISTANCE_CODES);
+  return PopulationCost(p->literal_,
+                        VP8LHistogramNumCodes(p->palette_code_bits_), NULL,
+                        &p->is_used_[0]) +
+         PopulationCost(p->red_, NUM_LITERAL_CODES, NULL, &p->is_used_[1]) +
+         PopulationCost(p->blue_, NUM_LITERAL_CODES, NULL, &p->is_used_[2]) +
+         PopulationCost(p->alpha_, NUM_LITERAL_CODES, NULL, &p->is_used_[3]) +
+         PopulationCost(p->distance_, NUM_DISTANCE_CODES, NULL,
+                        &p->is_used_[4]) +
+         (float)VP8LExtraCost(p->literal_ + NUM_LITERAL_CODES,
+                              NUM_LENGTH_CODES) +
+         (float)VP8LExtraCost(p->distance_, NUM_DISTANCE_CODES);
 }
 
 // -----------------------------------------------------------------------------
@@ -381,9 +383,9 @@ static int GetCombinedHistogramEntropy(const VP8LHistogram* const a,
   *cost += GetCombinedEntropy(a->literal_, b->literal_,
                               VP8LHistogramNumCodes(palette_code_bits),
                               a->is_used_[0], b->is_used_[0], 0);
-  *cost += VP8LExtraCostCombined(a->literal_ + NUM_LITERAL_CODES,
-                                 b->literal_ + NUM_LITERAL_CODES,
-                                 NUM_LENGTH_CODES);
+  *cost += (float)VP8LExtraCostCombined(a->literal_ + NUM_LITERAL_CODES,
+                                        b->literal_ + NUM_LITERAL_CODES,
+                                        NUM_LENGTH_CODES);
   if (*cost > cost_threshold) return 0;
 
   if (a->trivial_symbol_ != VP8L_NON_TRIVIAL_SYM &&
@@ -417,8 +419,8 @@ static int GetCombinedHistogramEntropy(const VP8LHistogram* const a,
   *cost +=
       GetCombinedEntropy(a->distance_, b->distance_, NUM_DISTANCE_CODES,
                          a->is_used_[4], b->is_used_[4], 0);
-  *cost +=
-      VP8LExtraCostCombined(a->distance_, b->distance_, NUM_DISTANCE_CODES);
+  *cost += (float)VP8LExtraCostCombined(a->distance_, b->distance_,
+                                        NUM_DISTANCE_CODES);
   if (*cost > cost_threshold) return 0;
 
   return 1;
@@ -506,11 +508,11 @@ static void UpdateHistogramCost(VP8LHistogram* const h) {
       PopulationCost(h->alpha_, NUM_LITERAL_CODES, &alpha_sym, &h->is_used_[3]);
   const float distance_cost =
       PopulationCost(h->distance_, NUM_DISTANCE_CODES, NULL, &h->is_used_[4]) +
-      VP8LExtraCost(h->distance_, NUM_DISTANCE_CODES);
+      (float)VP8LExtraCost(h->distance_, NUM_DISTANCE_CODES);
   const int num_codes = VP8LHistogramNumCodes(h->palette_code_bits_);
   h->literal_cost_ =
       PopulationCost(h->literal_, num_codes, NULL, &h->is_used_[0]) +
-          VP8LExtraCost(h->literal_ + NUM_LITERAL_CODES, NUM_LENGTH_CODES);
+      (float)VP8LExtraCost(h->literal_ + NUM_LITERAL_CODES, NUM_LENGTH_CODES);
   h->red_cost_ =
       PopulationCost(h->red_, NUM_LITERAL_CODES, &red_sym, &h->is_used_[1]);
   h->blue_cost_ =
@@ -1179,7 +1181,7 @@ int VP8LGetHistoImageSymbols(int xsize, int ysize,
   const int entropy_combine_num_bins = low_effort ? NUM_PARTITIONS : BIN_SIZE;
   int entropy_combine;
   uint16_t* const map_tmp =
-      WebPSafeMalloc(2 * image_histo_raw_size, sizeof(map_tmp));
+      WebPSafeMalloc(2 * image_histo_raw_size, sizeof(*map_tmp));
   uint16_t* const cluster_mappings = map_tmp + image_histo_raw_size;
   int num_used = image_histo_raw_size;
   if (orig_histo == NULL || map_tmp == NULL) {

+ 1 - 1
webp.mod/libwebp/src/enc/picture_enc.c

@@ -12,10 +12,10 @@
 // Author: Skal ([email protected])
 
 #include <assert.h>
+#include <limits.h>
 #include <stdlib.h>
 
 #include "src/enc/vp8i_enc.h"
-#include "src/dsp/dsp.h"
 #include "src/utils/utils.h"
 
 //------------------------------------------------------------------------------

+ 42 - 347
webp.mod/libwebp/src/enc/vp8l_enc.c

@@ -23,6 +23,7 @@
 #include "src/enc/vp8li_enc.h"
 #include "src/utils/bit_writer_utils.h"
 #include "src/utils/huffman_encode_utils.h"
+#include "src/utils/palette.h"
 #include "src/utils/utils.h"
 #include "src/webp/encode.h"
 #include "src/webp/format_constants.h"
@@ -30,298 +31,6 @@
 // Maximum number of histogram images (sub-blocks).
 #define MAX_HUFF_IMAGE_SIZE       2600
 
-// Palette reordering for smaller sum of deltas (and for smaller storage).
-
-static int PaletteCompareColorsForQsort(const void* p1, const void* p2) {
-  const uint32_t a = WebPMemToUint32((uint8_t*)p1);
-  const uint32_t b = WebPMemToUint32((uint8_t*)p2);
-  assert(a != b);
-  return (a < b) ? -1 : 1;
-}
-
-static WEBP_INLINE uint32_t PaletteComponentDistance(uint32_t v) {
-  return (v <= 128) ? v : (256 - v);
-}
-
-// Computes a value that is related to the entropy created by the
-// palette entry diff.
-//
-// Note that the last & 0xff is a no-operation in the next statement, but
-// removed by most compilers and is here only for regularity of the code.
-static WEBP_INLINE uint32_t PaletteColorDistance(uint32_t col1, uint32_t col2) {
-  const uint32_t diff = VP8LSubPixels(col1, col2);
-  const int kMoreWeightForRGBThanForAlpha = 9;
-  uint32_t score;
-  score =  PaletteComponentDistance((diff >>  0) & 0xff);
-  score += PaletteComponentDistance((diff >>  8) & 0xff);
-  score += PaletteComponentDistance((diff >> 16) & 0xff);
-  score *= kMoreWeightForRGBThanForAlpha;
-  score += PaletteComponentDistance((diff >> 24) & 0xff);
-  return score;
-}
-
-static WEBP_INLINE void SwapColor(uint32_t* const col1, uint32_t* const col2) {
-  const uint32_t tmp = *col1;
-  *col1 = *col2;
-  *col2 = tmp;
-}
-
-static WEBP_INLINE int SearchColorNoIdx(const uint32_t sorted[], uint32_t color,
-                                        int num_colors) {
-  int low = 0, hi = num_colors;
-  if (sorted[low] == color) return low;  // loop invariant: sorted[low] != color
-  while (1) {
-    const int mid = (low + hi) >> 1;
-    if (sorted[mid] == color) {
-      return mid;
-    } else if (sorted[mid] < color) {
-      low = mid;
-    } else {
-      hi = mid;
-    }
-  }
-  assert(0);
-  return 0;
-}
-
-// The palette has been sorted by alpha. This function checks if the other
-// components of the palette have a monotonic development with regards to
-// position in the palette. If all have monotonic development, there is
-// no benefit to re-organize them greedily. A monotonic development
-// would be spotted in green-only situations (like lossy alpha) or gray-scale
-// images.
-static int PaletteHasNonMonotonousDeltas(const uint32_t* const palette,
-                                         int num_colors) {
-  uint32_t predict = 0x000000;
-  int i;
-  uint8_t sign_found = 0x00;
-  for (i = 0; i < num_colors; ++i) {
-    const uint32_t diff = VP8LSubPixels(palette[i], predict);
-    const uint8_t rd = (diff >> 16) & 0xff;
-    const uint8_t gd = (diff >>  8) & 0xff;
-    const uint8_t bd = (diff >>  0) & 0xff;
-    if (rd != 0x00) {
-      sign_found |= (rd < 0x80) ? 1 : 2;
-    }
-    if (gd != 0x00) {
-      sign_found |= (gd < 0x80) ? 8 : 16;
-    }
-    if (bd != 0x00) {
-      sign_found |= (bd < 0x80) ? 64 : 128;
-    }
-    predict = palette[i];
-  }
-  return (sign_found & (sign_found << 1)) != 0;  // two consequent signs.
-}
-
-static void PaletteSortMinimizeDeltas(const uint32_t* const palette_sorted,
-                                      int num_colors, uint32_t* const palette) {
-  uint32_t predict = 0x00000000;
-  int i, k;
-  memcpy(palette, palette_sorted, num_colors * sizeof(*palette));
-  if (!PaletteHasNonMonotonousDeltas(palette_sorted, num_colors)) return;
-  // Find greedily always the closest color of the predicted color to minimize
-  // deltas in the palette. This reduces storage needs since the
-  // palette is stored with delta encoding.
-  for (i = 0; i < num_colors; ++i) {
-    int best_ix = i;
-    uint32_t best_score = ~0U;
-    for (k = i; k < num_colors; ++k) {
-      const uint32_t cur_score = PaletteColorDistance(palette[k], predict);
-      if (best_score > cur_score) {
-        best_score = cur_score;
-        best_ix = k;
-      }
-    }
-    SwapColor(&palette[best_ix], &palette[i]);
-    predict = palette[i];
-  }
-}
-
-// Sort palette in increasing order and prepare an inverse mapping array.
-static void PrepareMapToPalette(const uint32_t palette[], uint32_t num_colors,
-                                uint32_t sorted[], uint32_t idx_map[]) {
-  uint32_t i;
-  memcpy(sorted, palette, num_colors * sizeof(*sorted));
-  qsort(sorted, num_colors, sizeof(*sorted), PaletteCompareColorsForQsort);
-  for (i = 0; i < num_colors; ++i) {
-    idx_map[SearchColorNoIdx(sorted, palette[i], num_colors)] = i;
-  }
-}
-
-// -----------------------------------------------------------------------------
-// Modified Zeng method from "A Survey on Palette Reordering
-// Methods for Improving the Compression of Color-Indexed Images" by Armando J.
-// Pinho and Antonio J. R. Neves.
-
-// Finds the biggest cooccurrence in the matrix.
-static void CoOccurrenceFindMax(const uint32_t* const cooccurrence,
-                                uint32_t num_colors, uint8_t* const c1,
-                                uint8_t* const c2) {
-  // Find the index that is most frequently located adjacent to other
-  // (different) indexes.
-  uint32_t best_sum = 0u;
-  uint32_t i, j, best_cooccurrence;
-  *c1 = 0u;
-  for (i = 0; i < num_colors; ++i) {
-    uint32_t sum = 0;
-    for (j = 0; j < num_colors; ++j) sum += cooccurrence[i * num_colors + j];
-    if (sum > best_sum) {
-      best_sum = sum;
-      *c1 = i;
-    }
-  }
-  // Find the index that is most frequently found adjacent to *c1.
-  *c2 = 0u;
-  best_cooccurrence = 0u;
-  for (i = 0; i < num_colors; ++i) {
-    if (cooccurrence[*c1 * num_colors + i] > best_cooccurrence) {
-      best_cooccurrence = cooccurrence[*c1 * num_colors + i];
-      *c2 = i;
-    }
-  }
-  assert(*c1 != *c2);
-}
-
-// Builds the cooccurrence matrix
-static int CoOccurrenceBuild(const WebPPicture* const pic,
-                             const uint32_t* const palette, uint32_t num_colors,
-                             uint32_t* cooccurrence) {
-  uint32_t *lines, *line_top, *line_current, *line_tmp;
-  int x, y;
-  const uint32_t* src = pic->argb;
-  uint32_t prev_pix = ~src[0];
-  uint32_t prev_idx = 0u;
-  uint32_t idx_map[MAX_PALETTE_SIZE] = {0};
-  uint32_t palette_sorted[MAX_PALETTE_SIZE];
-  lines = (uint32_t*)WebPSafeMalloc(2 * pic->width, sizeof(*lines));
-  if (lines == NULL) {
-    return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
-  }
-  line_top = &lines[0];
-  line_current = &lines[pic->width];
-  PrepareMapToPalette(palette, num_colors, palette_sorted, idx_map);
-  for (y = 0; y < pic->height; ++y) {
-    for (x = 0; x < pic->width; ++x) {
-      const uint32_t pix = src[x];
-      if (pix != prev_pix) {
-        prev_idx = idx_map[SearchColorNoIdx(palette_sorted, pix, num_colors)];
-        prev_pix = pix;
-      }
-      line_current[x] = prev_idx;
-      // 4-connectivity is what works best as mentioned in "On the relation
-      // between Memon's and the modified Zeng's palette reordering methods".
-      if (x > 0 && prev_idx != line_current[x - 1]) {
-        const uint32_t left_idx = line_current[x - 1];
-        ++cooccurrence[prev_idx * num_colors + left_idx];
-        ++cooccurrence[left_idx * num_colors + prev_idx];
-      }
-      if (y > 0 && prev_idx != line_top[x]) {
-        const uint32_t top_idx = line_top[x];
-        ++cooccurrence[prev_idx * num_colors + top_idx];
-        ++cooccurrence[top_idx * num_colors + prev_idx];
-      }
-    }
-    line_tmp = line_top;
-    line_top = line_current;
-    line_current = line_tmp;
-    src += pic->argb_stride;
-  }
-  WebPSafeFree(lines);
-  return 1;
-}
-
-struct Sum {
-  uint8_t index;
-  uint32_t sum;
-};
-
-// Implements the modified Zeng method from "A Survey on Palette Reordering
-// Methods for Improving the Compression of Color-Indexed Images" by Armando J.
-// Pinho and Antonio J. R. Neves.
-static int PaletteSortModifiedZeng(
-    const WebPPicture* const pic, const uint32_t* const palette_sorted,
-    uint32_t num_colors, uint32_t* const palette) {
-  uint32_t i, j, ind;
-  uint8_t remapping[MAX_PALETTE_SIZE];
-  uint32_t* cooccurrence;
-  struct Sum sums[MAX_PALETTE_SIZE];
-  uint32_t first, last;
-  uint32_t num_sums;
-  // TODO(vrabaud) check whether one color images should use palette or not.
-  if (num_colors <= 1) return 1;
-  // Build the co-occurrence matrix.
-  cooccurrence =
-      (uint32_t*)WebPSafeCalloc(num_colors * num_colors, sizeof(*cooccurrence));
-  if (cooccurrence == NULL) {
-    return WebPEncodingSetError(pic, VP8_ENC_ERROR_OUT_OF_MEMORY);
-  }
-  if (!CoOccurrenceBuild(pic, palette_sorted, num_colors, cooccurrence)) {
-    WebPSafeFree(cooccurrence);
-    return 0;
-  }
-
-  // Initialize the mapping list with the two best indices.
-  CoOccurrenceFindMax(cooccurrence, num_colors, &remapping[0], &remapping[1]);
-
-  // We need to append and prepend to the list of remapping. To this end, we
-  // actually define the next start/end of the list as indices in a vector (with
-  // a wrap around when the end is reached).
-  first = 0;
-  last = 1;
-  num_sums = num_colors - 2;  // -2 because we know the first two values
-  if (num_sums > 0) {
-    // Initialize the sums with the first two remappings and find the best one
-    struct Sum* best_sum = &sums[0];
-    best_sum->index = 0u;
-    best_sum->sum = 0u;
-    for (i = 0, j = 0; i < num_colors; ++i) {
-      if (i == remapping[0] || i == remapping[1]) continue;
-      sums[j].index = i;
-      sums[j].sum = cooccurrence[i * num_colors + remapping[0]] +
-                    cooccurrence[i * num_colors + remapping[1]];
-      if (sums[j].sum > best_sum->sum) best_sum = &sums[j];
-      ++j;
-    }
-
-    while (num_sums > 0) {
-      const uint8_t best_index = best_sum->index;
-      // Compute delta to know if we need to prepend or append the best index.
-      int32_t delta = 0;
-      const int32_t n = num_colors - num_sums;
-      for (ind = first, j = 0; (ind + j) % num_colors != last + 1; ++j) {
-        const uint16_t l_j = remapping[(ind + j) % num_colors];
-        delta += (n - 1 - 2 * (int32_t)j) *
-                 (int32_t)cooccurrence[best_index * num_colors + l_j];
-      }
-      if (delta > 0) {
-        first = (first == 0) ? num_colors - 1 : first - 1;
-        remapping[first] = best_index;
-      } else {
-        ++last;
-        remapping[last] = best_index;
-      }
-      // Remove best_sum from sums.
-      *best_sum = sums[num_sums - 1];
-      --num_sums;
-      // Update all the sums and find the best one.
-      best_sum = &sums[0];
-      for (i = 0; i < num_sums; ++i) {
-        sums[i].sum += cooccurrence[best_index * num_colors + sums[i].index];
-        if (sums[i].sum > best_sum->sum) best_sum = &sums[i];
-      }
-    }
-  }
-  assert((last + 1) % num_colors == first);
-  WebPSafeFree(cooccurrence);
-
-  // Re-map the palette.
-  for (i = 0; i < num_colors; ++i) {
-    palette[i] = palette_sorted[remapping[(first + i) % num_colors]];
-  }
-  return 1;
-}
-
 // -----------------------------------------------------------------------------
 // Palette
 
@@ -336,13 +45,6 @@ typedef enum {
   kNumEntropyIx = 6
 } EntropyIx;
 
-typedef enum {
-  kSortedDefault = 0,
-  kMinimizeDelta = 1,
-  kModifiedZeng = 2,
-  kUnusedPalette = 3,
-} PaletteSorting;
-
 typedef enum {
   kHistoAlpha = 0,
   kHistoAlphaPred,
@@ -565,7 +267,7 @@ typedef struct {
 
 // +2 because we add a palette sorting configuration for kPalette and
 // kPaletteAndSpatial.
-#define CRUNCH_CONFIGS_MAX (kNumEntropyIx + 2)
+#define CRUNCH_CONFIGS_MAX (kNumEntropyIx + 2 * kPaletteSortingNum)
 
 static int EncoderAnalyze(VP8LEncoder* const enc,
                           CrunchConfig crunch_configs[CRUNCH_CONFIGS_MAX],
@@ -586,13 +288,10 @@ static int EncoderAnalyze(VP8LEncoder* const enc,
   assert(pic != NULL && pic->argb != NULL);
 
   // Check whether a palette is possible.
-  enc->palette_size_ = WebPGetColorPalette(pic, enc->palette_sorted_);
+  enc->palette_size_ = GetColorPalette(pic, enc->palette_sorted_);
   use_palette = (enc->palette_size_ <= MAX_PALETTE_SIZE);
   if (!use_palette) {
     enc->palette_size_ = 0;
-  } else {
-    qsort(enc->palette_sorted_, enc->palette_size_,
-          sizeof(*enc->palette_sorted_), PaletteCompareColorsForQsort);
   }
 
   // Empirical bit sizes.
@@ -625,20 +324,29 @@ static int EncoderAnalyze(VP8LEncoder* const enc,
         // a palette.
         if ((i != kPalette && i != kPaletteAndSpatial) || use_palette) {
           assert(*crunch_configs_size < CRUNCH_CONFIGS_MAX);
-          crunch_configs[(*crunch_configs_size)].entropy_idx_ = i;
           if (use_palette && (i == kPalette || i == kPaletteAndSpatial)) {
-            crunch_configs[(*crunch_configs_size)].palette_sorting_type_ =
-                kMinimizeDelta;
-            ++*crunch_configs_size;
-            // Also add modified Zeng's method.
-            crunch_configs[(*crunch_configs_size)].entropy_idx_ = i;
-            crunch_configs[(*crunch_configs_size)].palette_sorting_type_ =
-                kModifiedZeng;
+            int sorting_method;
+            for (sorting_method = 0; sorting_method < kPaletteSortingNum;
+                 ++sorting_method) {
+              const PaletteSorting typed_sorting_method =
+                  (PaletteSorting)sorting_method;
+              // TODO(vrabaud) kSortedDefault should be tested. It is omitted
+              // for now for backward compatibility.
+              if (typed_sorting_method == kUnusedPalette ||
+                  typed_sorting_method == kSortedDefault) {
+                continue;
+              }
+              crunch_configs[(*crunch_configs_size)].entropy_idx_ = i;
+              crunch_configs[(*crunch_configs_size)].palette_sorting_type_ =
+                  typed_sorting_method;
+              ++*crunch_configs_size;
+            }
           } else {
+            crunch_configs[(*crunch_configs_size)].entropy_idx_ = i;
             crunch_configs[(*crunch_configs_size)].palette_sorting_type_ =
                 kUnusedPalette;
+            ++*crunch_configs_size;
           }
-          ++*crunch_configs_size;
         }
       }
     } else {
@@ -1112,10 +820,10 @@ static int EncodeImageNoHuffman(VP8LBitWriter* const bw,
 static int EncodeImageInternal(
     VP8LBitWriter* const bw, const uint32_t* const argb,
     VP8LHashChain* const hash_chain, VP8LBackwardRefs refs_array[4], int width,
-    int height, int quality, int low_effort, int use_cache,
-    const CrunchConfig* const config, int* cache_bits, int histogram_bits,
-    size_t init_byte_position, int* const hdr_size, int* const data_size,
-    const WebPPicture* const pic, int percent_range, int* const percent) {
+    int height, int quality, int low_effort, const CrunchConfig* const config,
+    int* cache_bits, int histogram_bits, size_t init_byte_position,
+    int* const hdr_size, int* const data_size, const WebPPicture* const pic,
+    int percent_range, int* const percent) {
   const uint32_t histogram_image_xysize =
       VP8LSubSampleSize(width, histogram_bits) *
       VP8LSubSampleSize(height, histogram_bits);
@@ -1163,13 +871,9 @@ static int EncodeImageInternal(
   percent_start += percent_range;
   remaining_percent -= percent_range;
 
-  if (use_cache) {
-    // If the value is different from zero, it has been set during the
-    // palette analysis.
-    cache_bits_init = (*cache_bits == 0) ? MAX_COLOR_CACHE_BITS : *cache_bits;
-  } else {
-    cache_bits_init = 0;
-  }
+  // If the value is different from zero, it has been set during the palette
+  // analysis.
+  cache_bits_init = (*cache_bits == 0) ? MAX_COLOR_CACHE_BITS : *cache_bits;
   // If several iterations will happen, clone into bw_best.
   if ((config->sub_configs_size_ > 1 || config->sub_configs_[0].do_no_cache_) &&
       !VP8LBitWriterClone(bw, &bw_best)) {
@@ -1485,7 +1189,7 @@ static void ClearTransformBuffer(VP8LEncoder* const enc) {
 //  enc->use_predict_, enc->use_cross_color_
 static int AllocateTransformBuffer(VP8LEncoder* const enc, int width,
                                    int height) {
-  const uint64_t image_size = width * height;
+  const uint64_t image_size = (uint64_t)width * height;
   // VP8LResidualImage needs room for 2 scanlines of uint32 pixels with an extra
   // pixel in each, plus 2 regular scanlines of bytes.
   // TODO(skal): Clean up by using arithmetic in bytes instead of words.
@@ -1495,7 +1199,7 @@ static int AllocateTransformBuffer(VP8LEncoder* const enc, int width,
                         : 0;
   const uint64_t transform_data_size =
       (enc->use_predict_ || enc->use_cross_color_)
-          ? VP8LSubSampleSize(width, enc->transform_bits_) *
+          ? (uint64_t)VP8LSubSampleSize(width, enc->transform_bits_) *
                 VP8LSubSampleSize(height, enc->transform_bits_)
           : 0;
   const uint64_t max_alignment_in_words =
@@ -1758,7 +1462,6 @@ typedef struct {
   const WebPPicture* picture_;
   VP8LBitWriter* bw_;
   VP8LEncoder* enc_;
-  int use_cache_;
   CrunchConfig crunch_configs_[CRUNCH_CONFIGS_MAX];
   int num_crunch_configs_;
   int red_and_blue_always_zero_;
@@ -1771,7 +1474,6 @@ static int EncodeStreamHook(void* input, void* data2) {
   const WebPPicture* const picture = params->picture_;
   VP8LBitWriter* const bw = params->bw_;
   VP8LEncoder* const enc = params->enc_;
-  const int use_cache = params->use_cache_;
   const CrunchConfig* const crunch_configs = params->crunch_configs_;
   const int num_crunch_configs = params->num_crunch_configs_;
   const int red_and_blue_always_zero = params->red_and_blue_always_zero_;
@@ -1845,19 +1547,11 @@ static int EncodeStreamHook(void* input, void* data2) {
 
     // Encode palette
     if (enc->use_palette_) {
-      if (crunch_configs[idx].palette_sorting_type_ == kSortedDefault) {
-        // Nothing to do, we have already sorted the palette.
-        memcpy(enc->palette_, enc->palette_sorted_,
-               enc->palette_size_ * sizeof(*enc->palette_));
-      } else if (crunch_configs[idx].palette_sorting_type_ == kMinimizeDelta) {
-        PaletteSortMinimizeDeltas(enc->palette_sorted_, enc->palette_size_,
-                                  enc->palette_);
-      } else {
-        assert(crunch_configs[idx].palette_sorting_type_ == kModifiedZeng);
-        if (!PaletteSortModifiedZeng(enc->pic_, enc->palette_sorted_,
-                                      enc->palette_size_, enc->palette_)) {
-          goto Error;
-        }
+      if (!PaletteSort(crunch_configs[idx].palette_sorting_type_, enc->pic_,
+                       enc->palette_sorted_, enc->palette_size_,
+                       enc->palette_)) {
+        WebPEncodingSetError(enc->pic_, VP8_ENC_ERROR_OUT_OF_MEMORY);
+        goto Error;
       }
       percent_range = remaining_percent / 4;
       if (!EncodePalette(bw, low_effort, enc, percent_range, &percent)) {
@@ -1867,7 +1561,7 @@ static int EncodeStreamHook(void* input, void* data2) {
       if (!MapImageFromPalette(enc, use_delta_palette)) goto Error;
       // If using a color cache, do not have it bigger than the number of
       // colors.
-      if (use_cache && enc->palette_size_ < (1 << MAX_COLOR_CACHE_BITS)) {
+      if (enc->palette_size_ < (1 << MAX_COLOR_CACHE_BITS)) {
         enc->cache_bits_ = BitsLog2Floor(enc->palette_size_) + 1;
       }
     }
@@ -1911,7 +1605,7 @@ static int EncodeStreamHook(void* input, void* data2) {
     // Encode and write the transformed image.
     if (!EncodeImageInternal(
             bw, enc->argb_, &enc->hash_chain_, enc->refs_, enc->current_width_,
-            height, quality, low_effort, use_cache, &crunch_configs[idx],
+            height, quality, low_effort, &crunch_configs[idx],
             &enc->cache_bits_, enc->histo_bits_, byte_position, &hdr_size,
             &data_size, picture, remaining_percent, &percent)) {
       goto Error;
@@ -1953,7 +1647,7 @@ static int EncodeStreamHook(void* input, void* data2) {
 
 int VP8LEncodeStream(const WebPConfig* const config,
                      const WebPPicture* const picture,
-                     VP8LBitWriter* const bw_main, int use_cache) {
+                     VP8LBitWriter* const bw_main) {
   VP8LEncoder* const enc_main = VP8LEncoderNew(config, picture);
   VP8LEncoder* enc_side = NULL;
   CrunchConfig crunch_configs[CRUNCH_CONFIGS_MAX];
@@ -1975,7 +1669,9 @@ int VP8LEncodeStream(const WebPConfig* const config,
   }
 
   // Avoid "garbage value" error from Clang's static analysis tool.
-  WebPPictureInit(&picture_side);
+  if (!WebPPictureInit(&picture_side)) {
+    goto Error;
+  }
 
   // Analyze image (entropy, num_palettes etc)
   if (!EncoderAnalyze(enc_main, crunch_configs, &num_crunch_configs_main,
@@ -2010,7 +1706,6 @@ int VP8LEncodeStream(const WebPConfig* const config,
       StreamEncodeContext* const param =
           (idx == 0) ? &params_main : &params_side;
       param->config_ = config;
-      param->use_cache_ = use_cache;
       param->red_and_blue_always_zero_ = red_and_blue_always_zero;
       if (idx == 0) {
         param->picture_ = picture;
@@ -2164,7 +1859,7 @@ int VP8LEncodeImage(const WebPConfig* const config,
   if (!WebPReportProgress(picture, 2, &percent)) goto UserAbort;
 
   // Encode main image stream.
-  if (!VP8LEncodeStream(config, picture, &bw, 1 /*use_cache*/)) goto Error;
+  if (!VP8LEncodeStream(config, picture, &bw)) goto Error;
 
   if (!WebPReportProgress(picture, 99, &percent)) goto UserAbort;
 

+ 1 - 3
webp.mod/libwebp/src/enc/vp8li_enc.h

@@ -88,11 +88,9 @@ int VP8LEncodeImage(const WebPConfig* const config,
                     const WebPPicture* const picture);
 
 // Encodes the main image stream using the supplied bit writer.
-// If 'use_cache' is false, disables the use of color cache.
 // Returns false in case of error (stored in picture->error_code).
 int VP8LEncodeStream(const WebPConfig* const config,
-                     const WebPPicture* const picture, VP8LBitWriter* const bw,
-                     int use_cache);
+                     const WebPPicture* const picture, VP8LBitWriter* const bw);
 
 #if (WEBP_NEAR_LOSSLESS == 1)
 // in near_lossless.c

+ 15 - 8
webp.mod/libwebp/src/mux/anim_encode.c

@@ -22,6 +22,7 @@
 #include "src/webp/encode.h"
 #include "src/webp/format_constants.h"
 #include "src/webp/mux.h"
+#include "src/webp/types.h"
 
 #if defined(_MSC_VER) && _MSC_VER < 1900
 #define snprintf _snprintf
@@ -593,16 +594,17 @@ int WebPAnimEncoderRefineRect(
     int is_lossless, float quality, int* const x_offset, int* const y_offset,
     int* const width, int* const height) {
   FrameRectangle rect;
-  const int right = clip(*x_offset + *width, 0, curr_canvas->width);
-  const int left = clip(*x_offset, 0, curr_canvas->width - 1);
-  const int bottom = clip(*y_offset + *height, 0, curr_canvas->height);
-  const int top = clip(*y_offset, 0, curr_canvas->height - 1);
+  int right, left, bottom, top;
   if (prev_canvas == NULL || curr_canvas == NULL ||
       prev_canvas->width != curr_canvas->width ||
       prev_canvas->height != curr_canvas->height ||
       !prev_canvas->use_argb || !curr_canvas->use_argb) {
     return 0;
   }
+  right = clip(*x_offset + *width, 0, curr_canvas->width);
+  left = clip(*x_offset, 0, curr_canvas->width - 1);
+  bottom = clip(*y_offset + *height, 0, curr_canvas->height);
+  top = clip(*y_offset, 0, curr_canvas->height - 1);
   rect.x_offset_ = left;
   rect.y_offset_ = top;
   rect.width_ = clip(right - left, 0, curr_canvas->width - rect.x_offset_);
@@ -1397,7 +1399,10 @@ int WebPAnimEncoderAdd(WebPAnimEncoder* enc, WebPPicture* frame, int timestamp,
     }
     config = *encoder_config;
   } else {
-    WebPConfigInit(&config);
+    if (!WebPConfigInit(&config)) {
+      MarkError(enc, "Cannot Init config");
+      return 0;
+    }
     config.lossless = 1;
   }
   assert(enc->curr_canvas_ == NULL);
@@ -1418,12 +1423,14 @@ int WebPAnimEncoderAdd(WebPAnimEncoder* enc, WebPPicture* frame, int timestamp,
 // -----------------------------------------------------------------------------
 // Bitstream assembly.
 
-static int DecodeFrameOntoCanvas(const WebPMuxFrameInfo* const frame,
-                                 WebPPicture* const canvas) {
+WEBP_NODISCARD static int DecodeFrameOntoCanvas(
+    const WebPMuxFrameInfo* const frame, WebPPicture* const canvas) {
   const WebPData* const image = &frame->bitstream;
   WebPPicture sub_image;
   WebPDecoderConfig config;
-  WebPInitDecoderConfig(&config);
+  if (!WebPInitDecoderConfig(&config)) {
+    return 0;
+  }
   WebPUtilClearPic(canvas, NULL);
   if (WebPGetFeatures(image->bytes, image->size, &config.input) !=
       VP8_STATUS_OK) {

+ 2 - 1
webp.mod/libwebp/src/mux/muxedit.c

@@ -555,7 +555,8 @@ static WebPMuxError MuxCleanup(WebPMux* const mux) {
   if (num_frames == 1) {
     WebPMuxImage* frame = NULL;
     err = MuxImageGetNth((const WebPMuxImage**)&mux->images_, 1, &frame);
-    assert(err == WEBP_MUX_OK);  // We know that one frame does exist.
+    if (err != WEBP_MUX_OK) return err;
+    // We know that one frame does exist.
     assert(frame != NULL);
     if (frame->header_ != NULL &&
         ((mux->canvas_width_ == 0 && mux->canvas_height_ == 0) ||

+ 2 - 0
webp.mod/libwebp/src/utils/Makefile.am

@@ -26,6 +26,8 @@ COMMON_SOURCES += filters_utils.c
 COMMON_SOURCES += filters_utils.h
 COMMON_SOURCES += huffman_utils.c
 COMMON_SOURCES += huffman_utils.h
+COMMON_SOURCES += palette.c
+COMMON_SOURCES += palette.h
 COMMON_SOURCES += quant_levels_dec_utils.c
 COMMON_SOURCES += quant_levels_dec_utils.h
 COMMON_SOURCES += rescaler_utils.c

+ 4 - 1
webp.mod/libwebp/src/utils/huffman_utils.c

@@ -122,6 +122,9 @@ static int BuildHuffmanTable(HuffmanCode* const root_table, int root_bits,
     const int symbol_code_length = code_lengths[symbol];
     if (code_lengths[symbol] > 0) {
       if (sorted != NULL) {
+        if(offset[symbol_code_length] >= code_lengths_size) {
+            return 0;
+        }
         sorted[offset[symbol_code_length]++] = symbol;
       } else {
         offset[symbol_code_length]++;
@@ -267,11 +270,11 @@ int VP8LHuffmanTablesAllocate(int size, HuffmanTables* huffman_tables) {
   // Have 'segment' point to the first segment for now, 'root'.
   HuffmanTablesSegment* const root = &huffman_tables->root;
   huffman_tables->curr_segment = root;
+  root->next = NULL;
   // Allocate root.
   root->start = (HuffmanCode*)WebPSafeMalloc(size, sizeof(*root->start));
   if (root->start == NULL) return 0;
   root->curr_table = root->start;
-  root->next = NULL;
   root->size = size;
   return 1;
 }

+ 7 - 4
webp.mod/libwebp/src/utils/huffman_utils.h

@@ -63,7 +63,8 @@ typedef struct HuffmanTables {
 
 // Allocates a HuffmanTables with 'size' contiguous HuffmanCodes. Returns 0 on
 // memory allocation error, 1 otherwise.
-int VP8LHuffmanTablesAllocate(int size, HuffmanTables* huffman_tables);
+WEBP_NODISCARD int VP8LHuffmanTablesAllocate(int size,
+                                             HuffmanTables* huffman_tables);
 void VP8LHuffmanTablesDeallocate(HuffmanTables* const huffman_tables);
 
 #define HUFFMAN_PACKED_BITS 6
@@ -91,7 +92,7 @@ struct HTreeGroup {
 };
 
 // Creates the instance of HTreeGroup with specified number of tree-groups.
-HTreeGroup* VP8LHtreeGroupsNew(int num_htree_groups);
+WEBP_NODISCARD HTreeGroup* VP8LHtreeGroupsNew(int num_htree_groups);
 
 // Releases the memory allocated for HTreeGroup.
 void VP8LHtreeGroupsFree(HTreeGroup* const htree_groups);
@@ -101,8 +102,10 @@ void VP8LHtreeGroupsFree(HTreeGroup* const htree_groups);
 // the huffman table.
 // Returns built table size or 0 in case of error (invalid tree or
 // memory error).
-int VP8LBuildHuffmanTable(HuffmanTables* const root_table, int root_bits,
-                          const int code_lengths[], int code_lengths_size);
+WEBP_NODISCARD int VP8LBuildHuffmanTable(HuffmanTables* const root_table,
+                                         int root_bits,
+                                         const int code_lengths[],
+                                         int code_lengths_size);
 
 #ifdef __cplusplus
 }    // extern "C"

+ 402 - 0
webp.mod/libwebp/src/utils/palette.c

@@ -0,0 +1,402 @@
+// Copyright 2023 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Utilities for palette analysis.
+//
+// Author: Vincent Rabaud ([email protected])
+
+#include "src/utils/palette.h"
+
+#include <assert.h>
+#include <stdlib.h>
+
+#include "src/dsp/lossless_common.h"
+#include "src/utils/color_cache_utils.h"
+#include "src/utils/utils.h"
+#include "src/webp/encode.h"
+#include "src/webp/format_constants.h"
+
+// -----------------------------------------------------------------------------
+
+// Palette reordering for smaller sum of deltas (and for smaller storage).
+
+static int PaletteCompareColorsForQsort(const void* p1, const void* p2) {
+  const uint32_t a = WebPMemToUint32((uint8_t*)p1);
+  const uint32_t b = WebPMemToUint32((uint8_t*)p2);
+  assert(a != b);
+  return (a < b) ? -1 : 1;
+}
+
+static WEBP_INLINE uint32_t PaletteComponentDistance(uint32_t v) {
+  return (v <= 128) ? v : (256 - v);
+}
+
+// Computes a value that is related to the entropy created by the
+// palette entry diff.
+//
+// Note that the last & 0xff is a no-operation in the next statement, but
+// removed by most compilers and is here only for regularity of the code.
+static WEBP_INLINE uint32_t PaletteColorDistance(uint32_t col1, uint32_t col2) {
+  const uint32_t diff = VP8LSubPixels(col1, col2);
+  const int kMoreWeightForRGBThanForAlpha = 9;
+  uint32_t score;
+  score = PaletteComponentDistance((diff >> 0) & 0xff);
+  score += PaletteComponentDistance((diff >> 8) & 0xff);
+  score += PaletteComponentDistance((diff >> 16) & 0xff);
+  score *= kMoreWeightForRGBThanForAlpha;
+  score += PaletteComponentDistance((diff >> 24) & 0xff);
+  return score;
+}
+
+static WEBP_INLINE void SwapColor(uint32_t* const col1, uint32_t* const col2) {
+  const uint32_t tmp = *col1;
+  *col1 = *col2;
+  *col2 = tmp;
+}
+
+int SearchColorNoIdx(const uint32_t sorted[], uint32_t color, int num_colors) {
+  int low = 0, hi = num_colors;
+  if (sorted[low] == color) return low;  // loop invariant: sorted[low] != color
+  while (1) {
+    const int mid = (low + hi) >> 1;
+    if (sorted[mid] == color) {
+      return mid;
+    } else if (sorted[mid] < color) {
+      low = mid;
+    } else {
+      hi = mid;
+    }
+  }
+  assert(0);
+  return 0;
+}
+
+void PrepareMapToPalette(const uint32_t palette[], uint32_t num_colors,
+                         uint32_t sorted[], uint32_t idx_map[]) {
+  uint32_t i;
+  memcpy(sorted, palette, num_colors * sizeof(*sorted));
+  qsort(sorted, num_colors, sizeof(*sorted), PaletteCompareColorsForQsort);
+  for (i = 0; i < num_colors; ++i) {
+    idx_map[SearchColorNoIdx(sorted, palette[i], num_colors)] = i;
+  }
+}
+
+//------------------------------------------------------------------------------
+
+#define COLOR_HASH_SIZE (MAX_PALETTE_SIZE * 4)
+#define COLOR_HASH_RIGHT_SHIFT 22  // 32 - log2(COLOR_HASH_SIZE).
+
+int GetColorPalette(const WebPPicture* const pic, uint32_t* const palette) {
+  int i;
+  int x, y;
+  int num_colors = 0;
+  uint8_t in_use[COLOR_HASH_SIZE] = {0};
+  uint32_t colors[COLOR_HASH_SIZE] = {0};
+  const uint32_t* argb = pic->argb;
+  const int width = pic->width;
+  const int height = pic->height;
+  uint32_t last_pix = ~argb[0];  // so we're sure that last_pix != argb[0]
+  assert(pic != NULL);
+  assert(pic->use_argb);
+
+  for (y = 0; y < height; ++y) {
+    for (x = 0; x < width; ++x) {
+      int key;
+      if (argb[x] == last_pix) {
+        continue;
+      }
+      last_pix = argb[x];
+      key = VP8LHashPix(last_pix, COLOR_HASH_RIGHT_SHIFT);
+      while (1) {
+        if (!in_use[key]) {
+          colors[key] = last_pix;
+          in_use[key] = 1;
+          ++num_colors;
+          if (num_colors > MAX_PALETTE_SIZE) {
+            return MAX_PALETTE_SIZE + 1;  // Exact count not needed.
+          }
+          break;
+        } else if (colors[key] == last_pix) {
+          break;  // The color is already there.
+        } else {
+          // Some other color sits here, so do linear conflict resolution.
+          ++key;
+          key &= (COLOR_HASH_SIZE - 1);  // Key mask.
+        }
+      }
+    }
+    argb += pic->argb_stride;
+  }
+
+  if (palette != NULL) {  // Fill the colors into palette.
+    num_colors = 0;
+    for (i = 0; i < COLOR_HASH_SIZE; ++i) {
+      if (in_use[i]) {
+        palette[num_colors] = colors[i];
+        ++num_colors;
+      }
+    }
+    qsort(palette, num_colors, sizeof(*palette), PaletteCompareColorsForQsort);
+  }
+  return num_colors;
+}
+
+#undef COLOR_HASH_SIZE
+#undef COLOR_HASH_RIGHT_SHIFT
+
+// -----------------------------------------------------------------------------
+
+// The palette has been sorted by alpha. This function checks if the other
+// components of the palette have a monotonic development with regards to
+// position in the palette. If all have monotonic development, there is
+// no benefit to re-organize them greedily. A monotonic development
+// would be spotted in green-only situations (like lossy alpha) or gray-scale
+// images.
+static int PaletteHasNonMonotonousDeltas(const uint32_t* const palette,
+                                         int num_colors) {
+  uint32_t predict = 0x000000;
+  int i;
+  uint8_t sign_found = 0x00;
+  for (i = 0; i < num_colors; ++i) {
+    const uint32_t diff = VP8LSubPixels(palette[i], predict);
+    const uint8_t rd = (diff >> 16) & 0xff;
+    const uint8_t gd = (diff >> 8) & 0xff;
+    const uint8_t bd = (diff >> 0) & 0xff;
+    if (rd != 0x00) {
+      sign_found |= (rd < 0x80) ? 1 : 2;
+    }
+    if (gd != 0x00) {
+      sign_found |= (gd < 0x80) ? 8 : 16;
+    }
+    if (bd != 0x00) {
+      sign_found |= (bd < 0x80) ? 64 : 128;
+    }
+    predict = palette[i];
+  }
+  return (sign_found & (sign_found << 1)) != 0;  // two consequent signs.
+}
+
+static void PaletteSortMinimizeDeltas(const uint32_t* const palette_sorted,
+                                      int num_colors, uint32_t* const palette) {
+  uint32_t predict = 0x00000000;
+  int i, k;
+  memcpy(palette, palette_sorted, num_colors * sizeof(*palette));
+  if (!PaletteHasNonMonotonousDeltas(palette_sorted, num_colors)) return;
+  // Find greedily always the closest color of the predicted color to minimize
+  // deltas in the palette. This reduces storage needs since the
+  // palette is stored with delta encoding.
+  for (i = 0; i < num_colors; ++i) {
+    int best_ix = i;
+    uint32_t best_score = ~0U;
+    for (k = i; k < num_colors; ++k) {
+      const uint32_t cur_score = PaletteColorDistance(palette[k], predict);
+      if (best_score > cur_score) {
+        best_score = cur_score;
+        best_ix = k;
+      }
+    }
+    SwapColor(&palette[best_ix], &palette[i]);
+    predict = palette[i];
+  }
+}
+
+// -----------------------------------------------------------------------------
+// Modified Zeng method from "A Survey on Palette Reordering
+// Methods for Improving the Compression of Color-Indexed Images" by Armando J.
+// Pinho and Antonio J. R. Neves.
+
+// Finds the biggest cooccurrence in the matrix.
+static void CoOccurrenceFindMax(const uint32_t* const cooccurrence,
+                                uint32_t num_colors, uint8_t* const c1,
+                                uint8_t* const c2) {
+  // Find the index that is most frequently located adjacent to other
+  // (different) indexes.
+  uint32_t best_sum = 0u;
+  uint32_t i, j, best_cooccurrence;
+  *c1 = 0u;
+  for (i = 0; i < num_colors; ++i) {
+    uint32_t sum = 0;
+    for (j = 0; j < num_colors; ++j) sum += cooccurrence[i * num_colors + j];
+    if (sum > best_sum) {
+      best_sum = sum;
+      *c1 = i;
+    }
+  }
+  // Find the index that is most frequently found adjacent to *c1.
+  *c2 = 0u;
+  best_cooccurrence = 0u;
+  for (i = 0; i < num_colors; ++i) {
+    if (cooccurrence[*c1 * num_colors + i] > best_cooccurrence) {
+      best_cooccurrence = cooccurrence[*c1 * num_colors + i];
+      *c2 = i;
+    }
+  }
+  assert(*c1 != *c2);
+}
+
+// Builds the cooccurrence matrix
+static int CoOccurrenceBuild(const WebPPicture* const pic,
+                             const uint32_t* const palette, uint32_t num_colors,
+                             uint32_t* cooccurrence) {
+  uint32_t *lines, *line_top, *line_current, *line_tmp;
+  int x, y;
+  const uint32_t* src = pic->argb;
+  uint32_t prev_pix = ~src[0];
+  uint32_t prev_idx = 0u;
+  uint32_t idx_map[MAX_PALETTE_SIZE] = {0};
+  uint32_t palette_sorted[MAX_PALETTE_SIZE];
+  lines = (uint32_t*)WebPSafeMalloc(2 * pic->width, sizeof(*lines));
+  if (lines == NULL) {
+    return 0;
+  }
+  line_top = &lines[0];
+  line_current = &lines[pic->width];
+  PrepareMapToPalette(palette, num_colors, palette_sorted, idx_map);
+  for (y = 0; y < pic->height; ++y) {
+    for (x = 0; x < pic->width; ++x) {
+      const uint32_t pix = src[x];
+      if (pix != prev_pix) {
+        prev_idx = idx_map[SearchColorNoIdx(palette_sorted, pix, num_colors)];
+        prev_pix = pix;
+      }
+      line_current[x] = prev_idx;
+      // 4-connectivity is what works best as mentioned in "On the relation
+      // between Memon's and the modified Zeng's palette reordering methods".
+      if (x > 0 && prev_idx != line_current[x - 1]) {
+        const uint32_t left_idx = line_current[x - 1];
+        ++cooccurrence[prev_idx * num_colors + left_idx];
+        ++cooccurrence[left_idx * num_colors + prev_idx];
+      }
+      if (y > 0 && prev_idx != line_top[x]) {
+        const uint32_t top_idx = line_top[x];
+        ++cooccurrence[prev_idx * num_colors + top_idx];
+        ++cooccurrence[top_idx * num_colors + prev_idx];
+      }
+    }
+    line_tmp = line_top;
+    line_top = line_current;
+    line_current = line_tmp;
+    src += pic->argb_stride;
+  }
+  WebPSafeFree(lines);
+  return 1;
+}
+
+struct Sum {
+  uint8_t index;
+  uint32_t sum;
+};
+
+static int PaletteSortModifiedZeng(const WebPPicture* const pic,
+                                   const uint32_t* const palette_in,
+                                   uint32_t num_colors,
+                                   uint32_t* const palette) {
+  uint32_t i, j, ind;
+  uint8_t remapping[MAX_PALETTE_SIZE];
+  uint32_t* cooccurrence;
+  struct Sum sums[MAX_PALETTE_SIZE];
+  uint32_t first, last;
+  uint32_t num_sums;
+  // TODO(vrabaud) check whether one color images should use palette or not.
+  if (num_colors <= 1) return 1;
+  // Build the co-occurrence matrix.
+  cooccurrence =
+      (uint32_t*)WebPSafeCalloc(num_colors * num_colors, sizeof(*cooccurrence));
+  if (cooccurrence == NULL) {
+    return 0;
+  }
+  if (!CoOccurrenceBuild(pic, palette_in, num_colors, cooccurrence)) {
+    WebPSafeFree(cooccurrence);
+    return 0;
+  }
+
+  // Initialize the mapping list with the two best indices.
+  CoOccurrenceFindMax(cooccurrence, num_colors, &remapping[0], &remapping[1]);
+
+  // We need to append and prepend to the list of remapping. To this end, we
+  // actually define the next start/end of the list as indices in a vector (with
+  // a wrap around when the end is reached).
+  first = 0;
+  last = 1;
+  num_sums = num_colors - 2;  // -2 because we know the first two values
+  if (num_sums > 0) {
+    // Initialize the sums with the first two remappings and find the best one
+    struct Sum* best_sum = &sums[0];
+    best_sum->index = 0u;
+    best_sum->sum = 0u;
+    for (i = 0, j = 0; i < num_colors; ++i) {
+      if (i == remapping[0] || i == remapping[1]) continue;
+      sums[j].index = i;
+      sums[j].sum = cooccurrence[i * num_colors + remapping[0]] +
+                    cooccurrence[i * num_colors + remapping[1]];
+      if (sums[j].sum > best_sum->sum) best_sum = &sums[j];
+      ++j;
+    }
+
+    while (num_sums > 0) {
+      const uint8_t best_index = best_sum->index;
+      // Compute delta to know if we need to prepend or append the best index.
+      int32_t delta = 0;
+      const int32_t n = num_colors - num_sums;
+      for (ind = first, j = 0; (ind + j) % num_colors != last + 1; ++j) {
+        const uint16_t l_j = remapping[(ind + j) % num_colors];
+        delta += (n - 1 - 2 * (int32_t)j) *
+                 (int32_t)cooccurrence[best_index * num_colors + l_j];
+      }
+      if (delta > 0) {
+        first = (first == 0) ? num_colors - 1 : first - 1;
+        remapping[first] = best_index;
+      } else {
+        ++last;
+        remapping[last] = best_index;
+      }
+      // Remove best_sum from sums.
+      *best_sum = sums[num_sums - 1];
+      --num_sums;
+      // Update all the sums and find the best one.
+      best_sum = &sums[0];
+      for (i = 0; i < num_sums; ++i) {
+        sums[i].sum += cooccurrence[best_index * num_colors + sums[i].index];
+        if (sums[i].sum > best_sum->sum) best_sum = &sums[i];
+      }
+    }
+  }
+  assert((last + 1) % num_colors == first);
+  WebPSafeFree(cooccurrence);
+
+  // Re-map the palette.
+  for (i = 0; i < num_colors; ++i) {
+    palette[i] = palette_in[remapping[(first + i) % num_colors]];
+  }
+  return 1;
+}
+
+// -----------------------------------------------------------------------------
+
+int PaletteSort(PaletteSorting method, const struct WebPPicture* const pic,
+                const uint32_t* const palette_sorted, uint32_t num_colors,
+                uint32_t* const palette) {
+  switch (method) {
+    case kSortedDefault:
+      // Nothing to do, we have already sorted the palette.
+      memcpy(palette, palette_sorted, num_colors * sizeof(*palette));
+      return 1;
+    case kMinimizeDelta:
+      PaletteSortMinimizeDeltas(palette_sorted, num_colors, palette);
+      return 1;
+    case kModifiedZeng:
+      return PaletteSortModifiedZeng(pic, palette_sorted, num_colors, palette);
+    case kUnusedPalette:
+    case kPaletteSortingNum:
+      break;
+  }
+
+  assert(0);
+  return 0;
+}

+ 60 - 0
webp.mod/libwebp/src/utils/palette.h

@@ -0,0 +1,60 @@
+// Copyright 2023 Google Inc. All Rights Reserved.
+//
+// Use of this source code is governed by a BSD-style license
+// that can be found in the COPYING file in the root of the source
+// tree. An additional intellectual property rights grant can be found
+// in the file PATENTS. All contributing project authors may
+// be found in the AUTHORS file in the root of the source tree.
+// -----------------------------------------------------------------------------
+//
+// Utilities for palette analysis.
+//
+// Author: Vincent Rabaud ([email protected])
+
+#ifndef WEBP_UTILS_PALETTE_H_
+#define WEBP_UTILS_PALETTE_H_
+
+#include "src/webp/types.h"
+
+struct WebPPicture;
+
+// The different ways a palette can be sorted.
+typedef enum PaletteSorting {
+  kSortedDefault = 0,
+  // Sorts by minimizing L1 deltas between consecutive colors, giving more
+  // weight to RGB colors.
+  kMinimizeDelta = 1,
+  // Implements the modified Zeng method from "A Survey on Palette Reordering
+  // Methods for Improving the Compression of Color-Indexed Images" by Armando
+  // J. Pinho and Antonio J. R. Neves.
+  kModifiedZeng = 2,
+  kUnusedPalette = 3,
+  kPaletteSortingNum = 4
+} PaletteSorting;
+
+// Returns the index of 'color' in the sorted palette 'sorted' of size
+// 'num_colors'.
+int SearchColorNoIdx(const uint32_t sorted[], uint32_t color, int num_colors);
+
+// Sort palette in increasing order and prepare an inverse mapping array.
+void PrepareMapToPalette(const uint32_t palette[], uint32_t num_colors,
+                         uint32_t sorted[], uint32_t idx_map[]);
+
+// Returns count of unique colors in 'pic', assuming pic->use_argb is true.
+// If the unique color count is more than MAX_PALETTE_SIZE, returns
+// MAX_PALETTE_SIZE+1.
+// If 'palette' is not NULL and the number of unique colors is less than or
+// equal to MAX_PALETTE_SIZE, also outputs the actual unique colors into
+// 'palette' in a sorted order. Note: 'palette' is assumed to be an array
+// already allocated with at least MAX_PALETTE_SIZE elements.
+int GetColorPalette(const struct WebPPicture* const pic,
+                    uint32_t* const palette);
+
+// Sorts the palette according to the criterion defined by 'method'.
+// 'palette_sorted' is the input palette sorted lexicographically, as done in
+// PrepareMapToPalette. Returns 0 on memory allocation error.
+int PaletteSort(PaletteSorting method, const struct WebPPicture* const pic,
+                const uint32_t* const palette_sorted, uint32_t num_colors,
+                uint32_t* const palette);
+
+#endif  // WEBP_UTILS_PALETTE_H_

+ 5 - 61
webp.mod/libwebp/src/utils/utils.c

@@ -11,13 +11,13 @@
 //
 // Author: Skal ([email protected])
 
+#include "src/utils/utils.h"
+
 #include <stdlib.h>
 #include <string.h>  // for memcpy()
-#include "src/webp/decode.h"
+
+#include "src/utils/palette.h"
 #include "src/webp/encode.h"
-#include "src/webp/format_constants.h"  // for MAX_PALETTE_SIZE
-#include "src/utils/color_cache_utils.h"
-#include "src/utils/utils.h"
 
 // If PRINT_MEM_INFO is defined, extra info (like total memory used, number of
 // alloc/free etc) is printed. For debugging/tuning purpose only (it's slow,
@@ -252,66 +252,10 @@ void WebPCopyPixels(const WebPPicture* const src, WebPPicture* const dst) {
 
 //------------------------------------------------------------------------------
 
-#define COLOR_HASH_SIZE         (MAX_PALETTE_SIZE * 4)
-#define COLOR_HASH_RIGHT_SHIFT  22  // 32 - log2(COLOR_HASH_SIZE).
-
 int WebPGetColorPalette(const WebPPicture* const pic, uint32_t* const palette) {
-  int i;
-  int x, y;
-  int num_colors = 0;
-  uint8_t in_use[COLOR_HASH_SIZE] = { 0 };
-  uint32_t colors[COLOR_HASH_SIZE];
-  const uint32_t* argb = pic->argb;
-  const int width = pic->width;
-  const int height = pic->height;
-  uint32_t last_pix = ~argb[0];   // so we're sure that last_pix != argb[0]
-  assert(pic != NULL);
-  assert(pic->use_argb);
-
-  for (y = 0; y < height; ++y) {
-    for (x = 0; x < width; ++x) {
-      int key;
-      if (argb[x] == last_pix) {
-        continue;
-      }
-      last_pix = argb[x];
-      key = VP8LHashPix(last_pix, COLOR_HASH_RIGHT_SHIFT);
-      while (1) {
-        if (!in_use[key]) {
-          colors[key] = last_pix;
-          in_use[key] = 1;
-          ++num_colors;
-          if (num_colors > MAX_PALETTE_SIZE) {
-            return MAX_PALETTE_SIZE + 1;  // Exact count not needed.
-          }
-          break;
-        } else if (colors[key] == last_pix) {
-          break;  // The color is already there.
-        } else {
-          // Some other color sits here, so do linear conflict resolution.
-          ++key;
-          key &= (COLOR_HASH_SIZE - 1);  // Key mask.
-        }
-      }
-    }
-    argb += pic->argb_stride;
-  }
-
-  if (palette != NULL) {  // Fill the colors into palette.
-    num_colors = 0;
-    for (i = 0; i < COLOR_HASH_SIZE; ++i) {
-      if (in_use[i]) {
-        palette[num_colors] = colors[i];
-        ++num_colors;
-      }
-    }
-  }
-  return num_colors;
+  return GetColorPalette(pic, palette);
 }
 
-#undef COLOR_HASH_SIZE
-#undef COLOR_HASH_RIGHT_SHIFT
-
 //------------------------------------------------------------------------------
 
 #if defined(WEBP_NEED_LOG_TABLE_8BIT)

+ 1 - 2
webp.mod/libwebp/src/utils/utils.h

@@ -20,9 +20,7 @@
 #endif
 
 #include <assert.h>
-#include <limits.h>
 
-#include "src/dsp/dsp.h"
 #include "src/webp/types.h"
 
 #ifdef __cplusplus
@@ -198,6 +196,7 @@ WEBP_EXTERN void WebPCopyPixels(const struct WebPPicture* const src,
 // MAX_PALETTE_SIZE, also outputs the actual unique colors into 'palette'.
 // Note: 'palette' is assumed to be an array already allocated with at least
 // MAX_PALETTE_SIZE elements.
+// TODO(vrabaud) remove whenever we can break the ABI.
 WEBP_EXTERN int WebPGetColorPalette(const struct WebPPicture* const pic,
                                     uint32_t* const palette);
 

+ 58 - 56
webp.mod/libwebp/src/webp/decode.h

@@ -48,34 +48,33 @@ WEBP_EXTERN int WebPGetDecoderVersion(void);
 // RIFF + VP8X + (optional chunks) + VP8(L)
 // ALPH + VP8 <-- Not a valid WebP format: only allowed for internal purpose.
 // VP8(L)     <-- Not a valid WebP format: only allowed for internal purpose.
-WEBP_EXTERN int WebPGetInfo(const uint8_t* data, size_t data_size,
-                            int* width, int* height);
+WEBP_NODISCARD WEBP_EXTERN int WebPGetInfo(
+    const uint8_t* data, size_t data_size, int* width, int* height);
 
 // Decodes WebP images pointed to by 'data' and returns RGBA samples, along
 // with the dimensions in *width and *height. The ordering of samples in
 // memory is R, G, B, A, R, G, B, A... in scan order (endian-independent).
 // The returned pointer should be deleted calling WebPFree().
 // Returns NULL in case of error.
-WEBP_EXTERN uint8_t* WebPDecodeRGBA(const uint8_t* data, size_t data_size,
-                                    int* width, int* height);
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeRGBA(
+    const uint8_t* data, size_t data_size, int* width, int* height);
 
 // Same as WebPDecodeRGBA, but returning A, R, G, B, A, R, G, B... ordered data.
-WEBP_EXTERN uint8_t* WebPDecodeARGB(const uint8_t* data, size_t data_size,
-                                    int* width, int* height);
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeARGB(
+    const uint8_t* data, size_t data_size, int* width, int* height);
 
 // Same as WebPDecodeRGBA, but returning B, G, R, A, B, G, R, A... ordered data.
-WEBP_EXTERN uint8_t* WebPDecodeBGRA(const uint8_t* data, size_t data_size,
-                                    int* width, int* height);
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeBGRA(
+    const uint8_t* data, size_t data_size, int* width, int* height);
 
 // Same as WebPDecodeRGBA, but returning R, G, B, R, G, B... ordered data.
 // If the bitstream contains transparency, it is ignored.
-WEBP_EXTERN uint8_t* WebPDecodeRGB(const uint8_t* data, size_t data_size,
-                                   int* width, int* height);
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeRGB(
+    const uint8_t* data, size_t data_size, int* width, int* height);
 
 // Same as WebPDecodeRGB, but returning B, G, R, B, G, R... ordered data.
-WEBP_EXTERN uint8_t* WebPDecodeBGR(const uint8_t* data, size_t data_size,
-                                   int* width, int* height);
-
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeBGR(
+    const uint8_t* data, size_t data_size, int* width, int* height);
 
 // Decode WebP images pointed to by 'data' to Y'UV format(*). The pointer
 // returned is the Y samples buffer. Upon return, *u and *v will point to
@@ -87,10 +86,9 @@ WEBP_EXTERN uint8_t* WebPDecodeBGR(const uint8_t* data, size_t data_size,
 // 'width' and 'height' may be NULL, the other pointers must not be.
 // Returns NULL in case of error.
 // (*) Also named Y'CbCr. See: https://en.wikipedia.org/wiki/YCbCr
-WEBP_EXTERN uint8_t* WebPDecodeYUV(const uint8_t* data, size_t data_size,
-                                   int* width, int* height,
-                                   uint8_t** u, uint8_t** v,
-                                   int* stride, int* uv_stride);
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeYUV(
+    const uint8_t* data, size_t data_size, int* width, int* height,
+    uint8_t** u, uint8_t** v, int* stride, int* uv_stride);
 
 // These five functions are variants of the above ones, that decode the image
 // directly into a pre-allocated buffer 'output_buffer'. The maximum storage
@@ -100,22 +98,22 @@ WEBP_EXTERN uint8_t* WebPDecodeYUV(const uint8_t* data, size_t data_size,
 // The parameter 'output_stride' specifies the distance (in bytes)
 // between scanlines. Hence, output_buffer_size is expected to be at least
 // output_stride x picture-height.
-WEBP_EXTERN uint8_t* WebPDecodeRGBAInto(
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeRGBAInto(
     const uint8_t* data, size_t data_size,
     uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
-WEBP_EXTERN uint8_t* WebPDecodeARGBInto(
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeARGBInto(
     const uint8_t* data, size_t data_size,
     uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
-WEBP_EXTERN uint8_t* WebPDecodeBGRAInto(
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeBGRAInto(
     const uint8_t* data, size_t data_size,
     uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
 
 // RGB and BGR variants. Here too the transparency information, if present,
 // will be dropped and ignored.
-WEBP_EXTERN uint8_t* WebPDecodeRGBInto(
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeRGBInto(
     const uint8_t* data, size_t data_size,
     uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
-WEBP_EXTERN uint8_t* WebPDecodeBGRInto(
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeBGRInto(
     const uint8_t* data, size_t data_size,
     uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
 
@@ -126,7 +124,7 @@ WEBP_EXTERN uint8_t* WebPDecodeBGRInto(
 // 'u_size' and 'v_size' respectively.
 // Pointer to the luma plane ('*luma') is returned or NULL if an error occurred
 // during decoding (or because some buffers were found to be too small).
-WEBP_EXTERN uint8_t* WebPDecodeYUVInto(
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPDecodeYUVInto(
     const uint8_t* data, size_t data_size,
     uint8_t* luma, size_t luma_size, int luma_stride,
     uint8_t* u, size_t u_size, int u_stride,
@@ -217,11 +215,11 @@ struct WebPDecBuffer {
 };
 
 // Internal, version-checked, entry point
-WEBP_EXTERN int WebPInitDecBufferInternal(WebPDecBuffer*, int);
+WEBP_NODISCARD WEBP_EXTERN int WebPInitDecBufferInternal(WebPDecBuffer*, int);
 
 // Initialize the structure as empty. Must be called before any other use.
 // Returns false in case of version mismatch
-static WEBP_INLINE int WebPInitDecBuffer(WebPDecBuffer* buffer) {
+WEBP_NODISCARD static WEBP_INLINE int WebPInitDecBuffer(WebPDecBuffer* buffer) {
   return WebPInitDecBufferInternal(buffer, WEBP_DECODER_ABI_VERSION);
 }
 
@@ -232,7 +230,7 @@ WEBP_EXTERN void WebPFreeDecBuffer(WebPDecBuffer* buffer);
 //------------------------------------------------------------------------------
 // Enumeration of the status codes
 
-typedef enum VP8StatusCode {
+typedef enum WEBP_NODISCARD VP8StatusCode {
   VP8_STATUS_OK = 0,
   VP8_STATUS_OUT_OF_MEMORY,
   VP8_STATUS_INVALID_PARAM,
@@ -251,23 +249,24 @@ typedef enum VP8StatusCode {
 // WebPIDecoder object. This object can be left in a SUSPENDED state if the
 // picture is only partially decoded, pending additional input.
 // Code example:
-//
-//   WebPInitDecBuffer(&output_buffer);
-//   output_buffer.colorspace = mode;
-//   ...
-//   WebPIDecoder* idec = WebPINewDecoder(&output_buffer);
-//   while (additional_data_is_available) {
-//     // ... (get additional data in some new_data[] buffer)
-//     status = WebPIAppend(idec, new_data, new_data_size);
-//     if (status != VP8_STATUS_OK && status != VP8_STATUS_SUSPENDED) {
-//       break;    // an error occurred.
-//     }
-//
-//     // The above call decodes the current available buffer.
-//     // Part of the image can now be refreshed by calling
-//     // WebPIDecGetRGB()/WebPIDecGetYUVA() etc.
-//   }
-//   WebPIDelete(idec);
+/*
+     WebPInitDecBuffer(&output_buffer);
+     output_buffer.colorspace = mode;
+     ...
+     WebPIDecoder* idec = WebPINewDecoder(&output_buffer);
+     while (additional_data_is_available) {
+       // ... (get additional data in some new_data[] buffer)
+       status = WebPIAppend(idec, new_data, new_data_size);
+       if (status != VP8_STATUS_OK && status != VP8_STATUS_SUSPENDED) {
+         break;    // an error occurred.
+       }
+
+       // The above call decodes the current available buffer.
+       // Part of the image can now be refreshed by calling
+       // WebPIDecGetRGB()/WebPIDecGetYUVA() etc.
+     }
+     WebPIDelete(idec);
+*/
 
 // Creates a new incremental decoder with the supplied buffer parameter.
 // This output_buffer can be passed NULL, in which case a default output buffer
@@ -281,7 +280,8 @@ typedef enum VP8StatusCode {
 // within valid bounds.
 // All other fields of WebPDecBuffer MUST remain constant between calls.
 // Returns NULL if the allocation failed.
-WEBP_EXTERN WebPIDecoder* WebPINewDecoder(WebPDecBuffer* output_buffer);
+WEBP_NODISCARD WEBP_EXTERN WebPIDecoder* WebPINewDecoder(
+    WebPDecBuffer* output_buffer);
 
 // This function allocates and initializes an incremental-decoder object, which
 // will output the RGB/A samples specified by 'csp' into a preallocated
@@ -293,7 +293,7 @@ WEBP_EXTERN WebPIDecoder* WebPINewDecoder(WebPDecBuffer* output_buffer);
 // colorspace 'csp' is taken into account for allocating this buffer. All other
 // parameters are ignored.
 // Returns NULL if the allocation failed, or if some parameters are invalid.
-WEBP_EXTERN WebPIDecoder* WebPINewRGB(
+WEBP_NODISCARD WEBP_EXTERN WebPIDecoder* WebPINewRGB(
     WEBP_CSP_MODE csp,
     uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
 
@@ -308,7 +308,7 @@ WEBP_EXTERN WebPIDecoder* WebPINewRGB(
 // In this case, the output buffer will be automatically allocated (using
 // MODE_YUVA) when decoding starts. All parameters are then ignored.
 // Returns NULL if the allocation failed or if a parameter is invalid.
-WEBP_EXTERN WebPIDecoder* WebPINewYUVA(
+WEBP_NODISCARD WEBP_EXTERN WebPIDecoder* WebPINewYUVA(
     uint8_t* luma, size_t luma_size, int luma_stride,
     uint8_t* u, size_t u_size, int u_stride,
     uint8_t* v, size_t v_size, int v_stride,
@@ -316,7 +316,7 @@ WEBP_EXTERN WebPIDecoder* WebPINewYUVA(
 
 // Deprecated version of the above, without the alpha plane.
 // Kept for backward compatibility.
-WEBP_EXTERN WebPIDecoder* WebPINewYUV(
+WEBP_NODISCARD WEBP_EXTERN WebPIDecoder* WebPINewYUV(
     uint8_t* luma, size_t luma_size, int luma_stride,
     uint8_t* u, size_t u_size, int u_stride,
     uint8_t* v, size_t v_size, int v_stride);
@@ -346,21 +346,21 @@ WEBP_EXTERN VP8StatusCode WebPIUpdate(
 // (*last_y, *width etc.) can be NULL if corresponding information is not
 // needed. The values in these pointers are only valid on successful (non-NULL)
 // return.
-WEBP_EXTERN uint8_t* WebPIDecGetRGB(
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPIDecGetRGB(
     const WebPIDecoder* idec, int* last_y,
     int* width, int* height, int* stride);
 
 // Same as above function to get a YUVA image. Returns pointer to the luma
 // plane or NULL in case of error. If there is no alpha information
 // the alpha pointer '*a' will be returned NULL.
-WEBP_EXTERN uint8_t* WebPIDecGetYUVA(
+WEBP_NODISCARD WEBP_EXTERN uint8_t* WebPIDecGetYUVA(
     const WebPIDecoder* idec, int* last_y,
     uint8_t** u, uint8_t** v, uint8_t** a,
     int* width, int* height, int* stride, int* uv_stride, int* a_stride);
 
 // Deprecated alpha-less version of WebPIDecGetYUVA(): it will ignore the
 // alpha information (if present). Kept for backward compatibility.
-static WEBP_INLINE uint8_t* WebPIDecGetYUV(
+WEBP_NODISCARD static WEBP_INLINE uint8_t* WebPIDecGetYUV(
     const WebPIDecoder* idec, int* last_y, uint8_t** u, uint8_t** v,
     int* width, int* height, int* stride, int* uv_stride) {
   return WebPIDecGetYUVA(idec, last_y, u, v, NULL, width, height,
@@ -373,7 +373,7 @@ static WEBP_INLINE uint8_t* WebPIDecGetYUV(
 // Returns NULL in case the incremental decoder object is in an invalid state.
 // Otherwise returns the pointer to the internal representation. This structure
 // is read-only, tied to WebPIDecoder's lifespan and should not be modified.
-WEBP_EXTERN const WebPDecBuffer* WebPIDecodedArea(
+WEBP_NODISCARD WEBP_EXTERN const WebPDecBuffer* WebPIDecodedArea(
     const WebPIDecoder* idec, int* left, int* top, int* width, int* height);
 
 //------------------------------------------------------------------------------
@@ -389,7 +389,7 @@ WEBP_EXTERN const WebPDecBuffer* WebPIDecodedArea(
      CHECK(WebPGetFeatures(data, data_size, &config.input) == VP8_STATUS_OK);
 
      // C) Adjust 'config', if needed
-     config.no_fancy_upsampling = 1;
+     config.options.no_fancy_upsampling = 1;
      config.output.colorspace = MODE_BGRA;
      // etc.
 
@@ -468,12 +468,14 @@ struct WebPDecoderConfig {
 };
 
 // Internal, version-checked, entry point
-WEBP_EXTERN int WebPInitDecoderConfigInternal(WebPDecoderConfig*, int);
+WEBP_NODISCARD WEBP_EXTERN int WebPInitDecoderConfigInternal(WebPDecoderConfig*,
+                                                             int);
 
 // Initialize the configuration as empty. This function must always be
 // called first, unless WebPGetFeatures() is to be called.
 // Returns false in case of mismatched version.
-static WEBP_INLINE int WebPInitDecoderConfig(WebPDecoderConfig* config) {
+WEBP_NODISCARD static WEBP_INLINE int WebPInitDecoderConfig(
+    WebPDecoderConfig* config) {
   return WebPInitDecoderConfigInternal(config, WEBP_DECODER_ABI_VERSION);
 }
 
@@ -488,8 +490,8 @@ static WEBP_INLINE int WebPInitDecoderConfig(WebPDecoderConfig* config) {
 // The return WebPIDecoder object must always be deleted calling WebPIDelete().
 // Returns NULL in case of error (and config->status will then reflect
 // the error condition, if available).
-WEBP_EXTERN WebPIDecoder* WebPIDecode(const uint8_t* data, size_t data_size,
-                                      WebPDecoderConfig* config);
+WEBP_NODISCARD WEBP_EXTERN WebPIDecoder* WebPIDecode(
+    const uint8_t* data, size_t data_size, WebPDecoderConfig* config);
 
 // Non-incremental version. This version decodes the full data at once, taking
 // 'config' into account. Returns decoding status (which should be VP8_STATUS_OK

+ 25 - 21
webp.mod/libwebp/src/webp/demux.h

@@ -50,6 +50,7 @@
 
 #include "./decode.h"     // for WEBP_CSP_MODE
 #include "./mux_types.h"
+#include "./types.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -85,13 +86,13 @@ typedef enum WebPDemuxState {
 } WebPDemuxState;
 
 // Internal, version-checked, entry point
-WEBP_EXTERN WebPDemuxer* WebPDemuxInternal(
+WEBP_NODISCARD WEBP_EXTERN WebPDemuxer* WebPDemuxInternal(
     const WebPData*, int, WebPDemuxState*, int);
 
 // Parses the full WebP file given by 'data'. For single images the WebP file
 // header alone or the file header and the chunk header may be absent.
 // Returns a WebPDemuxer object on successful parse, NULL otherwise.
-static WEBP_INLINE WebPDemuxer* WebPDemux(const WebPData* data) {
+WEBP_NODISCARD static WEBP_INLINE WebPDemuxer* WebPDemux(const WebPData* data) {
   return WebPDemuxInternal(data, 0, NULL, WEBP_DEMUX_ABI_VERSION);
 }
 
@@ -103,7 +104,7 @@ static WEBP_INLINE WebPDemuxer* WebPDemux(const WebPData* data) {
 // If this data is volatile, the demuxer object should be deleted (by calling
 // WebPDemuxDelete()) and WebPDemuxPartial() called again on the new data.
 // This is usually an inexpensive operation.
-static WEBP_INLINE WebPDemuxer* WebPDemuxPartial(
+WEBP_NODISCARD static WEBP_INLINE WebPDemuxer* WebPDemuxPartial(
     const WebPData* data, WebPDemuxState* state) {
   return WebPDemuxInternal(data, 1, state, WEBP_DEMUX_ABI_VERSION);
 }
@@ -164,14 +165,14 @@ struct WebPIterator {
 // Returns false if 'dmux' is NULL or frame 'frame_number' is not present.
 // Call WebPDemuxReleaseIterator() when use of the iterator is complete.
 // NOTE: 'dmux' must persist for the lifetime of 'iter'.
-WEBP_EXTERN int WebPDemuxGetFrame(
+WEBP_NODISCARD WEBP_EXTERN int WebPDemuxGetFrame(
     const WebPDemuxer* dmux, int frame_number, WebPIterator* iter);
 
 // Sets 'iter->fragment' to point to the next ('iter->frame_num' + 1) or
 // previous ('iter->frame_num' - 1) frame. These functions do not loop.
 // Returns true on success, false otherwise.
-WEBP_EXTERN int WebPDemuxNextFrame(WebPIterator* iter);
-WEBP_EXTERN int WebPDemuxPrevFrame(WebPIterator* iter);
+WEBP_NODISCARD WEBP_EXTERN int WebPDemuxNextFrame(WebPIterator* iter);
+WEBP_NODISCARD WEBP_EXTERN int WebPDemuxPrevFrame(WebPIterator* iter);
 
 // Releases any memory associated with 'iter'.
 // Must be called before any subsequent calls to WebPDemuxGetChunk() on the same
@@ -202,15 +203,16 @@ struct WebPChunkIterator {
 // payloads are accessed through WebPDemuxGetFrame() and related functions.
 // Call WebPDemuxReleaseChunkIterator() when use of the iterator is complete.
 // NOTE: 'dmux' must persist for the lifetime of the iterator.
-WEBP_EXTERN int WebPDemuxGetChunk(const WebPDemuxer* dmux,
-                                  const char fourcc[4], int chunk_number,
-                                  WebPChunkIterator* iter);
+WEBP_NODISCARD WEBP_EXTERN int WebPDemuxGetChunk(const WebPDemuxer* dmux,
+                                                 const char fourcc[4],
+                                                 int chunk_number,
+                                                 WebPChunkIterator* iter);
 
 // Sets 'iter->chunk' to point to the next ('iter->chunk_num' + 1) or previous
 // ('iter->chunk_num' - 1) chunk. These functions do not loop.
 // Returns true on success, false otherwise.
-WEBP_EXTERN int WebPDemuxNextChunk(WebPChunkIterator* iter);
-WEBP_EXTERN int WebPDemuxPrevChunk(WebPChunkIterator* iter);
+WEBP_NODISCARD WEBP_EXTERN int WebPDemuxNextChunk(WebPChunkIterator* iter);
+WEBP_NODISCARD WEBP_EXTERN int WebPDemuxPrevChunk(WebPChunkIterator* iter);
 
 // Releases any memory associated with 'iter'.
 // Must be called before destroying the associated WebPDemuxer with
@@ -257,21 +259,21 @@ struct WebPAnimDecoderOptions {
 };
 
 // Internal, version-checked, entry point.
-WEBP_EXTERN int WebPAnimDecoderOptionsInitInternal(
+WEBP_NODISCARD WEBP_EXTERN int WebPAnimDecoderOptionsInitInternal(
     WebPAnimDecoderOptions*, int);
 
 // Should always be called, to initialize a fresh WebPAnimDecoderOptions
 // structure before modification. Returns false in case of version mismatch.
 // WebPAnimDecoderOptionsInit() must have succeeded before using the
 // 'dec_options' object.
-static WEBP_INLINE int WebPAnimDecoderOptionsInit(
+WEBP_NODISCARD static WEBP_INLINE int WebPAnimDecoderOptionsInit(
     WebPAnimDecoderOptions* dec_options) {
   return WebPAnimDecoderOptionsInitInternal(dec_options,
                                             WEBP_DEMUX_ABI_VERSION);
 }
 
 // Internal, version-checked, entry point.
-WEBP_EXTERN WebPAnimDecoder* WebPAnimDecoderNewInternal(
+WEBP_NODISCARD WEBP_EXTERN WebPAnimDecoder* WebPAnimDecoderNewInternal(
     const WebPData*, const WebPAnimDecoderOptions*, int);
 
 // Creates and initializes a WebPAnimDecoder object.
@@ -284,7 +286,7 @@ WEBP_EXTERN WebPAnimDecoder* WebPAnimDecoderNewInternal(
 // Returns:
 //   A pointer to the newly created WebPAnimDecoder object, or NULL in case of
 //   parsing error, invalid option or memory error.
-static WEBP_INLINE WebPAnimDecoder* WebPAnimDecoderNew(
+WEBP_NODISCARD static WEBP_INLINE WebPAnimDecoder* WebPAnimDecoderNew(
     const WebPData* webp_data, const WebPAnimDecoderOptions* dec_options) {
   return WebPAnimDecoderNewInternal(webp_data, dec_options,
                                     WEBP_DEMUX_ABI_VERSION);
@@ -306,8 +308,8 @@ struct WebPAnimInfo {
 //   info - (out) global information fetched from the animation.
 // Returns:
 //   True on success.
-WEBP_EXTERN int WebPAnimDecoderGetInfo(const WebPAnimDecoder* dec,
-                                       WebPAnimInfo* info);
+WEBP_NODISCARD WEBP_EXTERN int WebPAnimDecoderGetInfo(
+    const WebPAnimDecoder* dec, WebPAnimInfo* info);
 
 // Fetch the next frame from 'dec' based on options supplied to
 // WebPAnimDecoderNew(). This will be a fully reconstructed canvas of size
@@ -321,8 +323,9 @@ WEBP_EXTERN int WebPAnimDecoderGetInfo(const WebPAnimDecoder* dec,
 // Returns:
 //   False if any of the arguments are NULL, or if there is a parsing or
 //   decoding error, or if there are no more frames. Otherwise, returns true.
-WEBP_EXTERN int WebPAnimDecoderGetNext(WebPAnimDecoder* dec,
-                                       uint8_t** buf, int* timestamp);
+WEBP_NODISCARD WEBP_EXTERN int WebPAnimDecoderGetNext(WebPAnimDecoder* dec,
+                                                      uint8_t** buf,
+                                                      int* timestamp);
 
 // Check if there are more frames left to decode.
 // Parameters:
@@ -330,7 +333,8 @@ WEBP_EXTERN int WebPAnimDecoderGetNext(WebPAnimDecoder* dec,
 // Returns:
 //   True if 'dec' is not NULL and some frames are yet to be decoded.
 //   Otherwise, returns false.
-WEBP_EXTERN int WebPAnimDecoderHasMoreFrames(const WebPAnimDecoder* dec);
+WEBP_NODISCARD WEBP_EXTERN int WebPAnimDecoderHasMoreFrames(
+    const WebPAnimDecoder* dec);
 
 // Resets the WebPAnimDecoder object, so that next call to
 // WebPAnimDecoderGetNext() will restart decoding from 1st frame. This would be
@@ -348,7 +352,7 @@ WEBP_EXTERN void WebPAnimDecoderReset(WebPAnimDecoder* dec);
 //
 // Parameters:
 //   dec - (in) decoder instance from which the demuxer object is to be fetched.
-WEBP_EXTERN const WebPDemuxer* WebPAnimDecoderGetDemuxer(
+WEBP_NODISCARD WEBP_EXTERN const WebPDemuxer* WebPAnimDecoderGetDemuxer(
     const WebPAnimDecoder* dec);
 
 // Deletes the WebPAnimDecoder object.

+ 44 - 39
webp.mod/libwebp/src/webp/encode.h

@@ -164,13 +164,14 @@ typedef enum WebPPreset {
 } WebPPreset;
 
 // Internal, version-checked, entry point
-WEBP_EXTERN int WebPConfigInitInternal(WebPConfig*, WebPPreset, float, int);
+WEBP_NODISCARD WEBP_EXTERN int WebPConfigInitInternal(WebPConfig*, WebPPreset,
+                                                      float, int);
 
 // Should always be called, to initialize a fresh WebPConfig structure before
 // modification. Returns false in case of version mismatch. WebPConfigInit()
 // must have succeeded before using the 'config' object.
 // Note that the default values are lossless=0 and quality=75.
-static WEBP_INLINE int WebPConfigInit(WebPConfig* config) {
+WEBP_NODISCARD static WEBP_INLINE int WebPConfigInit(WebPConfig* config) {
   return WebPConfigInitInternal(config, WEBP_PRESET_DEFAULT, 75.f,
                                 WEBP_ENCODER_ABI_VERSION);
 }
@@ -179,8 +180,9 @@ static WEBP_INLINE int WebPConfigInit(WebPConfig* config) {
 // set of parameters (referred to by 'preset') and a given quality factor.
 // This function can be called as a replacement to WebPConfigInit(). Will
 // return false in case of error.
-static WEBP_INLINE int WebPConfigPreset(WebPConfig* config,
-                                        WebPPreset preset, float quality) {
+WEBP_NODISCARD static WEBP_INLINE int WebPConfigPreset(WebPConfig* config,
+                                                       WebPPreset preset,
+                                                       float quality) {
   return WebPConfigInitInternal(config, preset, quality,
                                 WEBP_ENCODER_ABI_VERSION);
 }
@@ -191,11 +193,12 @@ static WEBP_INLINE int WebPConfigPreset(WebPConfig* config,
 // speed and final compressed size.
 // This function will overwrite several fields from config: 'method', 'quality'
 // and 'lossless'. Returns false in case of parameter error.
-WEBP_EXTERN int WebPConfigLosslessPreset(WebPConfig* config, int level);
+WEBP_NODISCARD WEBP_EXTERN int WebPConfigLosslessPreset(WebPConfig* config,
+                                                        int level);
 
 // Returns true if 'config' is non-NULL and all configuration parameters are
 // within their valid ranges.
-WEBP_EXTERN int WebPValidateConfig(const WebPConfig* config);
+WEBP_NODISCARD WEBP_EXTERN int WebPValidateConfig(const WebPConfig* config);
 
 //------------------------------------------------------------------------------
 // Input / Output
@@ -255,8 +258,8 @@ WEBP_EXTERN void WebPMemoryWriterClear(WebPMemoryWriter* writer);
 // The custom writer to be used with WebPMemoryWriter as custom_ptr. Upon
 // completion, writer.mem and writer.size will hold the coded data.
 // writer.mem must be freed by calling WebPMemoryWriterClear.
-WEBP_EXTERN int WebPMemoryWrite(const uint8_t* data, size_t data_size,
-                                const WebPPicture* picture);
+WEBP_NODISCARD WEBP_EXTERN int WebPMemoryWrite(
+    const uint8_t* data, size_t data_size, const WebPPicture* picture);
 
 // Progress hook, called from time to time to report progress. It can return
 // false to request an abort of the encoding process, or true otherwise if
@@ -364,13 +367,13 @@ struct WebPPicture {
 };
 
 // Internal, version-checked, entry point
-WEBP_EXTERN int WebPPictureInitInternal(WebPPicture*, int);
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureInitInternal(WebPPicture*, int);
 
 // Should always be called, to initialize the structure. Returns false in case
 // of version mismatch. WebPPictureInit() must have succeeded before using the
 // 'picture' object.
 // Note that, by default, use_argb is false and colorspace is WEBP_YUV420.
-static WEBP_INLINE int WebPPictureInit(WebPPicture* picture) {
+WEBP_NODISCARD static WEBP_INLINE int WebPPictureInit(WebPPicture* picture) {
   return WebPPictureInitInternal(picture, WEBP_ENCODER_ABI_VERSION);
 }
 
@@ -381,7 +384,7 @@ static WEBP_INLINE int WebPPictureInit(WebPPicture* picture) {
 // Allocate y/u/v buffers as per colorspace/width/height specification.
 // Note! This function will free the previous buffer if needed.
 // Returns false in case of memory error.
-WEBP_EXTERN int WebPPictureAlloc(WebPPicture* picture);
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureAlloc(WebPPicture* picture);
 
 // Release the memory allocated by WebPPictureAlloc() or WebPPictureImport*().
 // Note that this function does _not_ free the memory used by the 'picture'
@@ -394,7 +397,8 @@ WEBP_EXTERN void WebPPictureFree(WebPPicture* picture);
 // will fully own the copied pixels (this is not a view). The 'dst' picture need
 // not be initialized as its content is overwritten.
 // Returns false in case of memory allocation error.
-WEBP_EXTERN int WebPPictureCopy(const WebPPicture* src, WebPPicture* dst);
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureCopy(const WebPPicture* src,
+                                               WebPPicture* dst);
 
 // Compute the single distortion for packed planes of samples.
 // 'src' will be compared to 'ref', and the raw distortion stored into
@@ -403,19 +407,18 @@ WEBP_EXTERN int WebPPictureCopy(const WebPPicture* src, WebPPicture* dst);
 // 'x_step' is the horizontal stride (in bytes) between samples.
 // 'src/ref_stride' is the byte distance between rows.
 // Returns false in case of error (bad parameter, memory allocation error, ...).
-WEBP_EXTERN int WebPPlaneDistortion(const uint8_t* src, size_t src_stride,
-                                    const uint8_t* ref, size_t ref_stride,
-                                    int width, int height,
-                                    size_t x_step,
-                                    int type,   // 0 = PSNR, 1 = SSIM, 2 = LSIM
-                                    float* distortion, float* result);
+WEBP_NODISCARD WEBP_EXTERN int WebPPlaneDistortion(
+    const uint8_t* src, size_t src_stride,
+    const uint8_t* ref, size_t ref_stride, int width, int height, size_t x_step,
+    int type,  // 0 = PSNR, 1 = SSIM, 2 = LSIM
+    float* distortion, float* result);
 
 // Compute PSNR, SSIM or LSIM distortion metric between two pictures. Results
 // are in dB, stored in result[] in the B/G/R/A/All order. The distortion is
 // always performed using ARGB samples. Hence if the input is YUV(A), the
 // picture will be internally converted to ARGB (just for the measurement).
 // Warning: this function is rather CPU-intensive.
-WEBP_EXTERN int WebPPictureDistortion(
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureDistortion(
     const WebPPicture* src, const WebPPicture* ref,
     int metric_type,           // 0 = PSNR, 1 = SSIM, 2 = LSIM
     float result[5]);
@@ -428,8 +431,8 @@ WEBP_EXTERN int WebPPictureDistortion(
 // must be fully be comprised inside the 'src' source picture. If the source
 // picture uses the YUV420 colorspace, the top and left coordinates will be
 // snapped to even values.
-WEBP_EXTERN int WebPPictureCrop(WebPPicture* picture,
-                                int left, int top, int width, int height);
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureCrop(
+    WebPPicture* picture, int left, int top, int width, int height);
 
 // Extracts a view from 'src' picture into 'dst'. The rectangle for the view
 // is defined by the top-left corner pixel coordinates (left, top) as well
@@ -442,9 +445,9 @@ WEBP_EXTERN int WebPPictureCrop(WebPPicture* picture,
 // with WebPPictureInit() if it is different from 'src', since its content will
 // be overwritten.
 // Returns false in case of invalid parameters.
-WEBP_EXTERN int WebPPictureView(const WebPPicture* src,
-                                int left, int top, int width, int height,
-                                WebPPicture* dst);
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureView(
+    const WebPPicture* src, int left, int top, int width, int height,
+    WebPPicture* dst);
 
 // Returns true if the 'picture' is actually a view and therefore does
 // not own the memory for pixels.
@@ -455,29 +458,30 @@ WEBP_EXTERN int WebPPictureIsView(const WebPPicture* picture);
 // dimension will be calculated preserving the aspect ratio.
 // No gamma correction is applied.
 // Returns false in case of error (invalid parameter or insufficient memory).
-WEBP_EXTERN int WebPPictureRescale(WebPPicture* picture, int width, int height);
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureRescale(WebPPicture* picture,
+                                                  int width, int height);
 
 // Colorspace conversion function to import RGB samples.
 // Previous buffer will be free'd, if any.
 // *rgb buffer should have a size of at least height * rgb_stride.
 // Returns false in case of memory error.
-WEBP_EXTERN int WebPPictureImportRGB(
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureImportRGB(
     WebPPicture* picture, const uint8_t* rgb, int rgb_stride);
 // Same, but for RGBA buffer.
-WEBP_EXTERN int WebPPictureImportRGBA(
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureImportRGBA(
     WebPPicture* picture, const uint8_t* rgba, int rgba_stride);
 // Same, but for RGBA buffer. Imports the RGB direct from the 32-bit format
 // input buffer ignoring the alpha channel. Avoids needing to copy the data
 // to a temporary 24-bit RGB buffer to import the RGB only.
-WEBP_EXTERN int WebPPictureImportRGBX(
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureImportRGBX(
     WebPPicture* picture, const uint8_t* rgbx, int rgbx_stride);
 
 // Variants of the above, but taking BGR(A|X) input.
-WEBP_EXTERN int WebPPictureImportBGR(
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureImportBGR(
     WebPPicture* picture, const uint8_t* bgr, int bgr_stride);
-WEBP_EXTERN int WebPPictureImportBGRA(
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureImportBGRA(
     WebPPicture* picture, const uint8_t* bgra, int bgra_stride);
-WEBP_EXTERN int WebPPictureImportBGRX(
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureImportBGRX(
     WebPPicture* picture, const uint8_t* bgrx, int bgrx_stride);
 
 // Converts picture->argb data to the YUV420A format. The 'colorspace'
@@ -486,24 +490,24 @@ WEBP_EXTERN int WebPPictureImportBGRX(
 // non-opaque transparent values is detected, and 'colorspace' will be
 // adjusted accordingly. Note that this method is lossy.
 // Returns false in case of error.
-WEBP_EXTERN int WebPPictureARGBToYUVA(WebPPicture* picture,
-                                      WebPEncCSP /*colorspace = WEBP_YUV420*/);
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureARGBToYUVA(
+    WebPPicture* picture, WebPEncCSP /*colorspace = WEBP_YUV420*/);
 
 // Same as WebPPictureARGBToYUVA(), but the conversion is done using
 // pseudo-random dithering with a strength 'dithering' between
 // 0.0 (no dithering) and 1.0 (maximum dithering). This is useful
 // for photographic picture.
-WEBP_EXTERN int WebPPictureARGBToYUVADithered(
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureARGBToYUVADithered(
     WebPPicture* picture, WebPEncCSP colorspace, float dithering);
 
-// Performs 'sharp' RGBA->YUVA420 downsampling and colorspace conversion.
+// Performs 'sharp' RGBA->YUVA420 downsampling and colorspace conversion
 // Downsampling is handled with extra care in case of color clipping. This
 // method is roughly 2x slower than WebPPictureARGBToYUVA() but produces better
 // and sharper YUV representation.
 // Returns false in case of error.
-WEBP_EXTERN int WebPPictureSharpARGBToYUVA(WebPPicture* picture);
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureSharpARGBToYUVA(WebPPicture* picture);
 // kept for backward compatibility:
-WEBP_EXTERN int WebPPictureSmartARGBToYUVA(WebPPicture* picture);
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureSmartARGBToYUVA(WebPPicture* picture);
 
 // Converts picture->yuv to picture->argb and sets picture->use_argb to true.
 // The input format must be YUV_420 or YUV_420A. The conversion from YUV420 to
@@ -511,7 +515,7 @@ WEBP_EXTERN int WebPPictureSmartARGBToYUVA(WebPPicture* picture);
 // Note that the use of this colorspace is discouraged if one has access to the
 // raw ARGB samples, since using YUV420 is comparatively lossy.
 // Returns false in case of error.
-WEBP_EXTERN int WebPPictureYUVAToARGB(WebPPicture* picture);
+WEBP_NODISCARD WEBP_EXTERN int WebPPictureYUVAToARGB(WebPPicture* picture);
 
 // Helper function: given a width x height plane of RGBA or YUV(A) samples
 // clean-up or smoothen the YUV or RGB samples under fully transparent area,
@@ -541,7 +545,8 @@ WEBP_EXTERN void WebPBlendAlpha(WebPPicture* picture, uint32_t background_rgb);
 // the former for lossy encoding, and the latter for lossless encoding
 // (when config.lossless is true). Automatic conversion from one format to
 // another is provided but they both incur some loss.
-WEBP_EXTERN int WebPEncode(const WebPConfig* config, WebPPicture* picture);
+WEBP_NODISCARD WEBP_EXTERN int WebPEncode(const WebPConfig* config,
+                                          WebPPicture* picture);
 
 //------------------------------------------------------------------------------
 

+ 12 - 10
webp.mod/libwebp/src/webp/mux.h

@@ -16,6 +16,7 @@
 #define WEBP_WEBP_MUX_H_
 
 #include "./mux_types.h"
+#include "./types.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -70,7 +71,7 @@ typedef struct WebPMuxAnimParams WebPMuxAnimParams;
 typedef struct WebPAnimEncoderOptions WebPAnimEncoderOptions;
 
 // Error codes
-typedef enum WebPMuxError {
+typedef enum WEBP_NODISCARD WebPMuxError {
   WEBP_MUX_OK                 =  1,
   WEBP_MUX_NOT_FOUND          =  0,
   WEBP_MUX_INVALID_ARGUMENT   = -1,
@@ -104,13 +105,13 @@ WEBP_EXTERN int WebPGetMuxVersion(void);
 // Life of a Mux object
 
 // Internal, version-checked, entry point
-WEBP_EXTERN WebPMux* WebPNewInternal(int);
+WEBP_NODISCARD WEBP_EXTERN WebPMux* WebPNewInternal(int);
 
 // Creates an empty mux object.
 // Returns:
 //   A pointer to the newly created empty mux object.
 //   Or NULL in case of memory error.
-static WEBP_INLINE WebPMux* WebPMuxNew(void) {
+WEBP_NODISCARD static WEBP_INLINE WebPMux* WebPMuxNew(void) {
   return WebPNewInternal(WEBP_MUX_ABI_VERSION);
 }
 
@@ -123,7 +124,8 @@ WEBP_EXTERN void WebPMuxDelete(WebPMux* mux);
 // Mux creation.
 
 // Internal, version-checked, entry point
-WEBP_EXTERN WebPMux* WebPMuxCreateInternal(const WebPData*, int, int);
+WEBP_NODISCARD WEBP_EXTERN WebPMux* WebPMuxCreateInternal(const WebPData*, int,
+                                                          int);
 
 // Creates a mux object from raw data given in WebP RIFF format.
 // Parameters:
@@ -133,8 +135,8 @@ WEBP_EXTERN WebPMux* WebPMuxCreateInternal(const WebPData*, int, int);
 // Returns:
 //   A pointer to the mux object created from given data - on success.
 //   NULL - In case of invalid data or memory error.
-static WEBP_INLINE WebPMux* WebPMuxCreate(const WebPData* bitstream,
-                                          int copy_data) {
+WEBP_NODISCARD static WEBP_INLINE WebPMux* WebPMuxCreate(
+    const WebPData* bitstream, int copy_data) {
   return WebPMuxCreateInternal(bitstream, copy_data, WEBP_MUX_ABI_VERSION);
 }
 
@@ -449,7 +451,7 @@ WEBP_EXTERN int WebPAnimEncoderOptionsInitInternal(
 // structure before modification. Returns false in case of version mismatch.
 // WebPAnimEncoderOptionsInit() must have succeeded before using the
 // 'enc_options' object.
-static WEBP_INLINE int WebPAnimEncoderOptionsInit(
+WEBP_NODISCARD static WEBP_INLINE int WebPAnimEncoderOptionsInit(
     WebPAnimEncoderOptions* enc_options) {
   return WebPAnimEncoderOptionsInitInternal(enc_options, WEBP_MUX_ABI_VERSION);
 }
@@ -490,7 +492,7 @@ static WEBP_INLINE WebPAnimEncoder* WebPAnimEncoderNew(
 // Returns:
 //   On error, returns false and frame->error_code is set appropriately.
 //   Otherwise, returns true.
-WEBP_EXTERN int WebPAnimEncoderAdd(
+WEBP_NODISCARD WEBP_EXTERN int WebPAnimEncoderAdd(
     WebPAnimEncoder* enc, struct WebPPicture* frame, int timestamp_ms,
     const struct WebPConfig* config);
 
@@ -503,8 +505,8 @@ WEBP_EXTERN int WebPAnimEncoderAdd(
 //   webp_data - (out) generated WebP bitstream.
 // Returns:
 //   True on success.
-WEBP_EXTERN int WebPAnimEncoderAssemble(WebPAnimEncoder* enc,
-                                        WebPData* webp_data);
+WEBP_NODISCARD WEBP_EXTERN int WebPAnimEncoderAssemble(WebPAnimEncoder* enc,
+                                                       WebPData* webp_data);
 
 // Get error string corresponding to the most recent call using 'enc'. The
 // returned string is owned by 'enc' and is valid only until the next call to

+ 2 - 1
webp.mod/libwebp/src/webp/mux_types.h

@@ -79,7 +79,8 @@ static WEBP_INLINE void WebPDataClear(WebPData* webp_data) {
 
 // Allocates necessary storage for 'dst' and copies the contents of 'src'.
 // Returns true on success.
-static WEBP_INLINE int WebPDataCopy(const WebPData* src, WebPData* dst) {
+WEBP_NODISCARD static WEBP_INLINE int WebPDataCopy(const WebPData* src,
+                                                   WebPData* dst) {
   if (src == NULL || dst == NULL) return 0;
   WebPDataInit(dst);
   if (src->bytes != NULL && src->size != 0) {

+ 18 - 1
webp.mod/libwebp/src/webp/types.h

@@ -36,6 +36,23 @@ typedef long long int int64_t;
 #define WEBP_INLINE __forceinline
 #endif  /* _MSC_VER */
 
+#if defined(WEBP_ENABLE_NODISCARD) ||                   \
+    (defined(__cplusplus) && __cplusplus >= 201700L) || \
+    (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311L)
+#define WEBP_NODISCARD [[nodiscard]]
+#else
+// gcc's __has_attribute does not work for enums.
+#if defined(__clang__) && defined(__has_attribute)
+#if __has_attribute(warn_unused_result)
+#define WEBP_NODISCARD __attribute__((warn_unused_result))
+#else
+#define WEBP_NODISCARD
+#endif
+#else
+#define WEBP_NODISCARD
+#endif
+#endif
+
 #ifndef WEBP_EXTERN
 // This explicitly marks library functions and allows for changing the
 // signature for e.g., Windows DLL builds.
@@ -60,7 +77,7 @@ extern "C" {
 // Allocates 'size' bytes of memory. Returns NULL upon error. Memory
 // must be deallocated by calling WebPFree(). This function is made available
 // by the core 'libwebp' library.
-WEBP_EXTERN void* WebPMalloc(size_t size);
+WEBP_NODISCARD WEBP_EXTERN void* WebPMalloc(size_t size);
 
 // Releases memory returned by the WebPDecode*() functions (from decode.h).
 WEBP_EXTERN void WebPFree(void* ptr);

+ 1 - 1
webp.mod/libwebp/tests/fuzzer/advanced_api_fuzzer.c

@@ -130,7 +130,7 @@ int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) {
       }
       WebPIDelete(idec);
     } else {
-      WebPDecode(data, size, &config);
+      (void)WebPDecode(data, size, &config);
     }
 
     WebPFreeDecBuffer(&config.output);

+ 13 - 2
webp.mod/libwebp/tests/fuzzer/animencoder_fuzzer.cc

@@ -47,6 +47,7 @@ int AddFrame(WebPAnimEncoder** const enc,
   // Read the source picture.
   if (!ExtractSourcePicture(&pic, data, size, bit_pos)) {
     const WebPEncodingError error_code = pic.error_code;
+    WebPAnimEncoderDelete(*enc);
     WebPPictureFree(&pic);
     if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY) return 0;
     fprintf(stderr, "Can't read input image. Error code: %d\n", error_code);
@@ -108,7 +109,14 @@ int AddFrame(WebPAnimEncoder** const enc,
     const WebPEncodingError error_code = pic.error_code;
     WebPAnimEncoderDelete(*enc);
     WebPPictureFree(&pic);
-    if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY) return 0;
+    // Tolerate failures when running under the nallocfuzz engine as
+    // WebPAnimEncoderAdd() may fail due to memory allocation errors outside of
+    // the encoder; in muxer functions that return booleans for instance.
+    if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY ||
+        error_code == VP8_ENC_ERROR_BAD_WRITE ||
+        getenv("NALLOC_FUZZ_VERSION") != nullptr) {
+      return 0;
+    }
     fprintf(stderr, "WebPEncode failed. Error code: %d\n", error_code);
     abort();
   }
@@ -163,7 +171,10 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) {
   }
   WebPData webp_data;
   WebPDataInit(&webp_data);
-  if (!WebPAnimEncoderAssemble(enc, &webp_data)) {
+  // Tolerate failures when running under the nallocfuzz engine as allocations
+  // during assembly may fail.
+  if (!WebPAnimEncoderAssemble(enc, &webp_data) &&
+      getenv("NALLOC_FUZZ_VERSION") == nullptr) {
     fprintf(stderr, "WebPAnimEncoderAssemble failed: %s.\n",
             WebPAnimEncoderGetError(enc));
     WebPAnimEncoderDelete(enc);

+ 46 - 26
webp.mod/libwebp/tests/fuzzer/enc_dec_fuzzer.cc

@@ -91,50 +91,70 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) {
     const WebPEncodingError error_code = pic.error_code;
     WebPMemoryWriterClear(&memory_writer);
     WebPPictureFree(&pic);
-    if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY) return 0;
+    if (error_code == VP8_ENC_ERROR_OUT_OF_MEMORY ||
+        error_code == VP8_ENC_ERROR_BAD_WRITE) {
+      return 0;
+    }
     fprintf(stderr, "WebPEncode failed. Error code: %d\n", error_code);
     abort();
   }
 
   // Try decoding the result.
-  int w, h;
   const uint8_t* const out_data = memory_writer.mem;
   const size_t out_size = memory_writer.size;
-  uint8_t* const rgba = WebPDecodeBGRA(out_data, out_size, &w, &h);
-  if (rgba == nullptr || w != pic.width || h != pic.height) {
-    fprintf(stderr, "WebPDecodeBGRA failed.\n");
-    WebPFree(rgba);
+  WebPDecoderConfig dec_config;
+  if (!WebPInitDecoderConfig(&dec_config)) {
+    fprintf(stderr, "WebPInitDecoderConfig failed.\n");
+    WebPMemoryWriterClear(&memory_writer);
+    WebPPictureFree(&pic);
+    abort();
+  }
+
+  dec_config.output.colorspace = MODE_BGRA;
+  const VP8StatusCode status = WebPDecode(out_data, out_size, &dec_config);
+  if ((status != VP8_STATUS_OK && status != VP8_STATUS_OUT_OF_MEMORY &&
+       status != VP8_STATUS_USER_ABORT) ||
+      (status == VP8_STATUS_OK && (dec_config.output.width != pic.width ||
+                                   dec_config.output.height != pic.height))) {
+    fprintf(stderr, "WebPDecode failed. status: %d.\n", status);
+    WebPFreeDecBuffer(&dec_config.output);
     WebPMemoryWriterClear(&memory_writer);
     WebPPictureFree(&pic);
     abort();
   }
 
-  // Compare the results if exact encoding.
-  if (pic.use_argb && config.lossless && config.near_lossless == 100) {
-    const uint32_t* src1 = (const uint32_t*)rgba;
-    const uint32_t* src2 = pic.argb;
-    for (int y = 0; y < h; ++y, src1 += w, src2 += pic.argb_stride) {
-      for (int x = 0; x < w; ++x) {
-        uint32_t v1 = src1[x], v2 = src2[x];
-        if (!config.exact) {
-          if ((v1 & 0xff000000u) == 0 || (v2 & 0xff000000u) == 0) {
-            // Only keep alpha for comparison of fully transparent area.
-            v1 &= 0xff000000u;
-            v2 &= 0xff000000u;
+  if (status == VP8_STATUS_OK) {
+    const uint8_t* const rgba = dec_config.output.u.RGBA.rgba;
+    const int w = dec_config.output.width;
+    const int h = dec_config.output.height;
+
+    // Compare the results if exact encoding.
+    if (pic.use_argb && config.lossless && config.near_lossless == 100) {
+      const uint32_t* src1 = (const uint32_t*)rgba;
+      const uint32_t* src2 = pic.argb;
+      for (int y = 0; y < h; ++y, src1 += w, src2 += pic.argb_stride) {
+        for (int x = 0; x < w; ++x) {
+          uint32_t v1 = src1[x], v2 = src2[x];
+          if (!config.exact) {
+            if ((v1 & 0xff000000u) == 0 || (v2 & 0xff000000u) == 0) {
+              // Only keep alpha for comparison of fully transparent area.
+              v1 &= 0xff000000u;
+              v2 &= 0xff000000u;
+            }
+          }
+          if (v1 != v2) {
+            fprintf(stderr, "Lossless compression failed pixel-exactness.\n");
+            WebPFreeDecBuffer(&dec_config.output);
+            WebPMemoryWriterClear(&memory_writer);
+            WebPPictureFree(&pic);
+            abort();
           }
-        }
-        if (v1 != v2) {
-          fprintf(stderr, "Lossless compression failed pixel-exactness.\n");
-          WebPFree(rgba);
-          WebPMemoryWriterClear(&memory_writer);
-          WebPPictureFree(&pic);
-          abort();
         }
       }
     }
   }
 
-  WebPFree(rgba);
+  WebPFreeDecBuffer(&dec_config.output);
   WebPMemoryWriterClear(&memory_writer);
   WebPPictureFree(&pic);
   return 0;

+ 65 - 0
webp.mod/libwebp/tests/fuzzer/huffman_fuzzer.c

@@ -0,0 +1,65 @@
+// Copyright 2023 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include <stdint.h>
+#include <string.h>
+
+#include "src/dec/vp8li_dec.h"
+#include "src/utils/bit_reader_utils.h"
+#include "src/utils/huffman_utils.h"
+#include "src/utils/utils.h"
+#include "src/webp/format_constants.h"
+
+int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) {
+  // Number of bits to initialize data.
+  static const int kColorCacheBitsBits = 4;
+  // 'num_htree_groups' is contained in the RG channel, hence 16 bits.
+  static const int kNumHtreeGroupsBits = 16;
+  if (size * sizeof(*data) < kColorCacheBitsBits + kNumHtreeGroupsBits) {
+    return 0;
+  }
+
+  // A non-NULL mapping brings minor changes that are tested by the normal
+  // fuzzer.
+  int* const mapping = NULL;
+  HuffmanTables huffman_tables;
+  memset(&huffman_tables, 0, sizeof(huffman_tables));
+  HTreeGroup* htree_groups = NULL;
+
+  VP8LDecoder* dec = VP8LNew();
+  if (dec == NULL) goto Error;
+  VP8LBitReader* const br = &dec->br_;
+  VP8LInitBitReader(br, data, size);
+
+  const int color_cache_bits = VP8LReadBits(br, kColorCacheBitsBits);
+  if (color_cache_bits < 1 || color_cache_bits > MAX_CACHE_BITS) goto Error;
+
+  const int num_htree_groups = VP8LReadBits(br, kNumHtreeGroupsBits);
+  // 'num_htree_groups' cannot be 0 as it is built from a non-empty image.
+  if (num_htree_groups == 0) goto Error;
+  // This variable is only useful when mapping is not NULL.
+  const int num_htree_groups_max = num_htree_groups;
+  (void)ReadHuffmanCodesHelper(color_cache_bits, num_htree_groups,
+                               num_htree_groups_max, mapping, dec,
+                               &huffman_tables, &htree_groups);
+
+ Error:
+  WebPSafeFree(mapping);
+  VP8LHtreeGroupsFree(htree_groups);
+  VP8LHuffmanTablesDeallocate(&huffman_tables);
+  VP8LDelete(dec);
+  return 0;
+}

+ 3 - 3
webp.mod/libwebp/tests/fuzzer/makefile.unix

@@ -11,9 +11,9 @@ LDLIBS = ../../src/mux/libwebpmux.a ../../src/demux/libwebpdemux.a
 LDLIBS += ../../src/libwebp.a ../../imageio/libimageio_util.a
 LDLIBS += ../../sharpyuv/libsharpyuv.a
 
-FUZZERS = advanced_api_fuzzer animation_api_fuzzer animencoder_fuzzer
-FUZZERS += animdecoder_fuzzer mux_demux_api_fuzzer enc_dec_fuzzer
-FUZZERS += simple_api_fuzzer
+FUZZERS = advanced_api_fuzzer animation_api_fuzzer animdecoder_fuzzer
+FUZZERS += animencoder_fuzzer enc_dec_fuzzer huffman_fuzzer
+FUZZERS += mux_demux_api_fuzzer simple_api_fuzzer
 
 %.o: fuzz_utils.h img_alpha.h img_grid.h img_peak.h
 all: $(FUZZERS)

+ 7 - 7
webp.mod/libwebp/tests/fuzzer/mux_demux_api_fuzzer.c

@@ -33,15 +33,15 @@ int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) {
     if (!mux) return 0;
 
     WebPData chunk;
-    WebPMuxGetChunk(mux, "EXIF", &chunk);
-    WebPMuxGetChunk(mux, "ICCP", &chunk);
-    WebPMuxGetChunk(mux, "FUZZ", &chunk);  // unknown
+    (void)WebPMuxGetChunk(mux, "EXIF", &chunk);
+    (void)WebPMuxGetChunk(mux, "ICCP", &chunk);
+    (void)WebPMuxGetChunk(mux, "FUZZ", &chunk);  // unknown
 
     uint32_t flags;
-    WebPMuxGetFeatures(mux, &flags);
+    (void)WebPMuxGetFeatures(mux, &flags);
 
     WebPMuxAnimParams params;
-    WebPMuxGetAnimationParams(mux, &params);
+    (void)WebPMuxGetAnimationParams(mux, &params);
 
     WebPMuxError status;
     WebPMuxFrameInfo info;
@@ -72,11 +72,11 @@ int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) {
 
     WebPChunkIterator chunk_iter;
     if (WebPDemuxGetChunk(demux, "EXIF", 1, &chunk_iter)) {
-      WebPDemuxNextChunk(&chunk_iter);
+      (void)WebPDemuxNextChunk(&chunk_iter);
     }
     WebPDemuxReleaseChunkIterator(&chunk_iter);
     if (WebPDemuxGetChunk(demux, "ICCP", 0, &chunk_iter)) {  // 0 == last
-      WebPDemuxPrevChunk(&chunk_iter);
+      (void)WebPDemuxPrevChunk(&chunk_iter);
     }
     WebPDemuxReleaseChunkIterator(&chunk_iter);
     // Skips FUZZ because the Demux API has no concept of (un)known chunks.

+ 8 - 7
webp.mod/libwebp/tests/fuzzer/simple_api_fuzzer.c

@@ -49,17 +49,17 @@ int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) {
     if (value % 0x10 == 0) buf_size--;
     uint8_t* const ext_buf = (uint8_t*)malloc(buf_size);
     if (value < 0x94) {
-      WebPDecodeRGBAInto(data, size, ext_buf, buf_size, stride);
+      (void)WebPDecodeRGBAInto(data, size, ext_buf, buf_size, stride);
 #if !defined(WEBP_REDUCE_CSP)
     } else if (value < 0xa9) {
-      WebPDecodeARGBInto(data, size, ext_buf, buf_size, stride);
+      (void)WebPDecodeARGBInto(data, size, ext_buf, buf_size, stride);
     } else if (value < 0xbe) {
-      WebPDecodeBGRInto(data, size, ext_buf, buf_size, stride);
+      (void)WebPDecodeBGRInto(data, size, ext_buf, buf_size, stride);
     } else if (value < 0xd3) {
-      WebPDecodeRGBInto(data, size, ext_buf, buf_size, stride);
+      (void)WebPDecodeRGBInto(data, size, ext_buf, buf_size, stride);
 #endif  // !defined(WEBP_REDUCE_CSP)
     } else {
-      WebPDecodeBGRAInto(data, size, ext_buf, buf_size, stride);
+      (void)WebPDecodeBGRAInto(data, size, ext_buf, buf_size, stride);
     }
     free(ext_buf);
   } else {
@@ -75,8 +75,9 @@ int LLVMFuzzerTestOneInput(const uint8_t* const data, size_t size) {
     uint8_t* const luma_buf = (uint8_t*)malloc(luma_size);
     uint8_t* const u_buf = (uint8_t*)malloc(u_size);
     uint8_t* const v_buf = (uint8_t*)malloc(v_size);
-    WebPDecodeYUVInto(data, size, luma_buf, luma_size, w /* luma_stride */,
-                      u_buf, u_size, uv_stride, v_buf, v_size, uv_stride);
+    (void)WebPDecodeYUVInto(data, size, luma_buf, luma_size,
+                            w /* luma_stride */, u_buf, u_size, uv_stride,
+                            v_buf, v_size, uv_stride);
     free(luma_buf);
     free(u_buf);
     free(v_buf);

+ 1 - 22
webp.mod/libwebp/webp_js/README.md

@@ -20,8 +20,7 @@ Emscripten and CMake.
 
     ```shell
     cd webp_js && \
-    emcmake cmake -DWEBP_BUILD_WEBP_JS=ON \
-          ../
+    emcmake cmake -DWEBP_BUILD_WEBP_JS=ON ../
     ```
 
 -   compile webp.js using 'emmake make'.
@@ -55,27 +54,7 @@ directory.
 See webp_js/index_wasm.html for a simple demo page using the WASM version of the
 library.
 
-You will need a fairly recent version of Emscripten (at least 2.0.18,
-latest-upstream is recommended) and of your WASM-enabled browser to run this
-version.
-
 ## Caveats
 
 -   First decoding using the library is usually slower, due to just-in-time
     compilation.
-
--   Some versions of llvm produce the following compile error when SSE2 is
-    enabled.
-
-    ```
-    "Unsupported:   %516 = bitcast <8 x i16> %481 to i128
-    LLVM ERROR: BitCast Instruction not yet supported for integer types larger than 64 bits"
-    ```
-
-    The corresponding Emscripten bug is at:
-    https://github.com/kripken/emscripten/issues/3788
-
-    Therefore, SSE2 optimization is currently disabled in CMakeLists.txt.
-
--   If WEBP_ENABLE_SIMD is set to 1 the JavaScript version (webp.js) will be
-    disabled as wasm2js does not support SIMD.

+ 17 - 31
webp.mod/libwebp/webp_js/index_wasm.html

@@ -9,6 +9,7 @@
       noInitialRun : true
     };
   </script>
+  <script src="./webp_wasm.js"></script>
   <script type="text/javascript">
 
 'use strict';
@@ -16,40 +17,25 @@
 // main wrapper for the function decoding a WebP into a canvas object
 var WebpToCanvas;
 
-function init() {
-  var xhr = new XMLHttpRequest();
-  xhr.open('GET', 'webp_wasm.wasm', true);
-  xhr.responseType = 'arraybuffer';
-  xhr.onload = function() {
-    Module.wasmBinary = xhr.response;
-    var script = document.createElement('script');
-    script.src = "webp_wasm.js";
-    document.body.appendChild(script);
-  };
-  xhr.send(null);
-}
-window.onload = init;
+Module.onRuntimeInitialized = async () => {
+  // wrapper for the function decoding a WebP into a canvas object
+  WebpToCanvas = Module.cwrap('WebPToSDL', 'number', ['array', 'number']);
+};
 
 function decode(webp_data, canvas_id) {
   var result;
-  if (Module["asm"] != undefined) {
-    // wrapper for the function decoding a WebP into a canvas object
-    WebpToCanvas = Module.cwrap('WebPToSDL', 'number', ['array', 'number']);
-    // get the canvas to decode into
-    var canvas = document.getElementById(canvas_id);
-    if (canvas == null) return;
-    // clear previous picture (if any)
-    Module.canvas = canvas;
-    canvas.getContext('2d').clearRect(0, 0, canvas.width, canvas.height);
-    // decode and measure timing
-    var start = new Date();
-    var ret = WebpToCanvas(webp_data, webp_data.length);
-    var end = new Date();
-    var decode_time = end - start;
-    result = 'decoding time: ' + decode_time +' ms.';
-  } else {
-    result = "WASM module not finished loading! Please retry";
-  }
+  // get the canvas to decode into
+  var canvas = document.getElementById(canvas_id);
+  if (canvas == null) return;
+  // clear previous picture (if any)
+  Module.canvas = canvas;
+  canvas.getContext('2d').clearRect(0, 0, canvas.width, canvas.height);
+  // decode and measure timing
+  var start = new Date();
+  var ret = WebpToCanvas(webp_data, webp_data.length);
+  var end = new Date();
+  var decodeTime = end - start;
+  result = 'decoding time: ' + decodeTime +' ms.';
   // display timing result
   var speed_result = document.getElementById('timing');
   if (speed_result != null) {

+ 26 - 5
webp.mod/libwebp/xcframeworkbuild.sh

@@ -69,6 +69,7 @@ readonly TARGETDIR="${TOPDIR}/WebP.xcframework"
 readonly DECTARGETDIR="${TOPDIR}/WebPDecoder.xcframework"
 readonly MUXTARGETDIR="${TOPDIR}/WebPMux.xcframework"
 readonly DEMUXTARGETDIR="${TOPDIR}/WebPDemux.xcframework"
+readonly SHARPYUVTARGETDIR="${TOPDIR}/SharpYuv.xcframework"
 readonly DEVELOPER=$(xcode-select --print-path)
 readonly DEVROOT="${DEVELOPER}/Toolchains/XcodeDefault.xctoolchain"
 readonly PLATFORMSROOT="${DEVELOPER}/Platforms"
@@ -94,8 +95,15 @@ update_headers_path() {
   local subdir
   for d in $(find "$1" -path "*/Headers"); do
     subdir="$d/$framework_name"
-    mkdir "$subdir"
-    mv "$d/"*.h "$subdir"
+    if [[ -d "$subdir" ]]; then
+      # SharpYuv will have a sharpyuv subdirectory. macOS is case insensitive,
+      # but for consistency with the other frameworks, rename the directory to
+      # match the case of the framework name.
+      mv "$(echo ${subdir} | tr 'A-Z' 'a-z')" "$subdir"
+    else
+      mkdir "$subdir"
+      mv "$d/"*.h "$subdir"
+    fi
   done
 }
 
@@ -104,7 +112,8 @@ echo "iOS SDK Version: ${SDK[$IOS]}"
 echo "MacOS SDK Version: ${SDK[$MACOS]}"
 
 if [[ -e "${BUILDDIR}" || -e "${TARGETDIR}" || -e "${DECTARGETDIR}" \
-      || -e "${MUXTARGETDIR}" || -e "${DEMUXTARGETDIR}" ]]; then
+      || -e "${MUXTARGETDIR}" || -e "${DEMUXTARGETDIR}" \
+      || -e "${SHARPYUVTARGETDIR}" ]]; then
   cat << EOF
 WARNING: The following directories will be deleted:
 WARNING:   ${BUILDDIR}
@@ -112,12 +121,13 @@ WARNING:   ${TARGETDIR}
 WARNING:   ${DECTARGETDIR}
 WARNING:   ${MUXTARGETDIR}
 WARNING:   ${DEMUXTARGETDIR}
+WARNING:   ${SHARPYUVTARGETDIR}
 WARNING: The build will continue in 5 seconds...
 EOF
   sleep 5
 fi
 rm -rf ${BUILDDIR} ${TARGETDIR} ${DECTARGETDIR} \
-  ${MUXTARGETDIR} ${DEMUXTARGETDIR}
+  ${MUXTARGETDIR} ${DEMUXTARGETDIR} ${SHARPYUVTARGETDIR}
 
 if [[ ! -e ${SRCDIR}/configure ]]; then
   if ! (cd ${SRCDIR} && sh autogen.sh); then
@@ -137,6 +147,7 @@ for (( i = 0; i < $NUM_PLATFORMS; ++i )); do
   DECLIBLIST=()
   MUXLIBLIST=()
   DEMUXLIBLIST=()
+  SHARPYUVLIBLIST=()
 
   for PLATFORM in ${PLATFORMS[$i]}; do
     ROOTDIR="${BUILDDIR}/${PLATFORM}"
@@ -187,23 +198,26 @@ for (( i = 0; i < $NUM_PLATFORMS; ++i )); do
     set +x
 
     # Build only the libraries, skip the examples.
-    make V=0 -C sharpyuv
+    make V=0 -C sharpyuv install
     make V=0 -C src install
 
     LIBLIST+=("${ROOTDIR}/lib/libwebp.a")
     DECLIBLIST+=("${ROOTDIR}/lib/libwebpdecoder.a")
     MUXLIBLIST+=("${ROOTDIR}/lib/libwebpmux.a")
     DEMUXLIBLIST+=("${ROOTDIR}/lib/libwebpdemux.a")
+    SHARPYUVLIBLIST+=("${ROOTDIR}/lib/libsharpyuv.a")
     # xcodebuild requires a directory for the -headers option, these will match
     # for all builds.
     make -C src install-data DESTDIR="${ROOTDIR}/lib-headers"
     make -C src install-commonHEADERS DESTDIR="${ROOTDIR}/dec-headers"
     make -C src/demux install-data DESTDIR="${ROOTDIR}/demux-headers"
     make -C src/mux install-data DESTDIR="${ROOTDIR}/mux-headers"
+    make -C sharpyuv install-data DESTDIR="${ROOTDIR}/sharpyuv-headers"
     LIB_HEADERS="${ROOTDIR}/lib-headers/${ROOTDIR}/include/webp"
     DEC_HEADERS="${ROOTDIR}/dec-headers/${ROOTDIR}/include/webp"
     DEMUX_HEADERS="${ROOTDIR}/demux-headers/${ROOTDIR}/include/webp"
     MUX_HEADERS="${ROOTDIR}/mux-headers/${ROOTDIR}/include/webp"
+    SHARPYUV_HEADERS="${ROOTDIR}/sharpyuv-headers/${ROOTDIR}/include/webp"
 
     make distclean
 
@@ -220,16 +234,20 @@ for (( i = 0; i < $NUM_PLATFORMS; ++i )); do
   target_declib="${target_dir}/$(basename ${DECLIBLIST[0]})"
   target_demuxlib="${target_dir}/$(basename ${DEMUXLIBLIST[0]})"
   target_muxlib="${target_dir}/$(basename ${MUXLIBLIST[0]})"
+  target_sharpyuvlib="${target_dir}/$(basename ${SHARPYUVLIBLIST[0]})"
 
   mkdir -p "${target_dir}"
   ${LIPO} -create ${LIBLIST[@]} -output "${target_lib}"
   ${LIPO} -create ${DECLIBLIST[@]} -output "${target_declib}"
   ${LIPO} -create ${DEMUXLIBLIST[@]} -output "${target_demuxlib}"
   ${LIPO} -create ${MUXLIBLIST[@]} -output "${target_muxlib}"
+  ${LIPO} -create ${SHARPYUVLIBLIST[@]} -output "${target_sharpyuvlib}"
   FAT_LIBLIST+=(-library "${target_lib}" -headers "${LIB_HEADERS}")
   FAT_DECLIBLIST+=(-library "${target_declib}" -headers "${DEC_HEADERS}")
   FAT_DEMUXLIBLIST+=(-library "${target_demuxlib}" -headers "${DEMUX_HEADERS}")
   FAT_MUXLIBLIST+=(-library "${target_muxlib}" -headers "${MUX_HEADERS}")
+  FAT_SHARPYUVLIBLIST+=(-library "${target_sharpyuvlib}")
+  FAT_SHARPYUVLIBLIST+=(-headers "${SHARPYUV_HEADERS}")
 done
 
 # lipo will not put archives with the same architecture (e.g., x86_64
@@ -246,10 +264,13 @@ xcodebuild -create-xcframework "${FAT_DEMUXLIBLIST[@]}" \
   -output ${DEMUXTARGETDIR}
 xcodebuild -create-xcframework "${FAT_MUXLIBLIST[@]}" \
   -output ${MUXTARGETDIR}
+xcodebuild -create-xcframework "${FAT_SHARPYUVLIBLIST[@]}" \
+  -output ${SHARPYUVTARGETDIR}
 update_headers_path "${TARGETDIR}"
 update_headers_path "${DECTARGETDIR}"
 update_headers_path "${DEMUXTARGETDIR}"
 update_headers_path "${MUXTARGETDIR}"
+update_headers_path "${SHARPYUVTARGETDIR}"
 set +x
 
 echo  "SUCCESS"

+ 1 - 0
webp.mod/source.bmx

@@ -132,6 +132,7 @@ Import "libwebp/src/utils/color_cache_utils.c"
 Import "libwebp/src/utils/filters_utils.c"
 Import "libwebp/src/utils/huffman_encode_utils.c"
 Import "libwebp/src/utils/huffman_utils.c"
+Import "libwebp/src/utils/palette.c"
 Import "libwebp/src/utils/quant_levels_dec_utils.c"
 Import "libwebp/src/utils/quant_levels_utils.c"
 Import "libwebp/src/utils/random_utils.c"

+ 3 - 1
webp.mod/webp.bmx

@@ -27,12 +27,14 @@ about: The WebP loader module provides the ability to load WebP format #pixmaps.
 End Rem
 Module Image.Webp
 
-ModuleInfo "Version: 1.01"
+ModuleInfo "Version: 1.02"
 ModuleInfo "License: libwebp - BSD"
 ModuleInfo "License: Wrapper - zlib/libpng"
 ModuleInfo "Copyright: libwebp - 2010 Google"
 ModuleInfo "Copyright: Wrapper - 2021-2023 Bruce A Henderson"
 
+ModuleInfo "History: 1.02"
+ModuleInfo "History: Updated to libwebp 1.3.2.d7a0506"
 ModuleInfo "History: 1.01"
 ModuleInfo "History: Updated to libwebp 1.3.2."
 ModuleInfo "History: 1.00"

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio